From aeece7a065916f729e3fd0ca975231643997f417 Mon Sep 17 00:00:00 2001 From: figsoda Date: Wed, 11 Jan 2023 20:57:42 -0500 Subject: [PATCH] add --hash --- src/cli.rs | 6 +++++- src/fetcher/mod.rs | 34 ++++++++++++++++++++++++++++++++++ src/main.rs | 8 ++++---- tests/cmd/hash.stdout | 1 + tests/cmd/hash.toml | 1 + tests/integration.rs | 14 ++++++++++---- 6 files changed, 55 insertions(+), 9 deletions(-) create mode 100644 tests/cmd/hash.stdout create mode 100644 tests/cmd/hash.toml diff --git a/src/cli.rs b/src/cli.rs index 37bc713..cac4996 100644 --- a/src/cli.rs +++ b/src/cli.rs @@ -25,8 +25,12 @@ pub struct Opts { #[arg(short, long, default_value_t = 0)] pub indent: usize, + /// only output the hash + #[arg(short = 'H', long, group = "format")] + pub hash: bool, + /// output in json format - #[arg(short, long)] + #[arg(short, long, group = "format")] pub json: bool, /// additional arguments to pass to the fetcher diff --git a/src/fetcher/mod.rs b/src/fetcher/mod.rs index bd3a73d..4c53506 100644 --- a/src/fetcher/mod.rs +++ b/src/fetcher/mod.rs @@ -40,6 +40,15 @@ pub trait Fetcher<'a> { indent: String, ) -> Result<()>; + fn fetch_hash( + &'a self, + out: &mut impl ::std::io::Write, + url: &'a Url, + rev: Option, + args: Vec<(String, String)>, + args_str: Vec<(String, String)>, + ) -> Result<()>; + fn fetch_json( &'a self, out: &mut impl Write, @@ -96,6 +105,31 @@ macro_rules! impl_fetcher { self.write_nix(out, values, rev, hash, args, args_str, overwrites, indent) } + fn fetch_hash( + &'a self, + out: &mut impl ::std::io::Write, + url: &'a ::url::Url, + rev: Option, + args: Vec<(String, String)>, + args_str: Vec<(String, String)>, + ) -> ::anyhow::Result<()> { + use anyhow::Context; + + let values = &self + .get_values(url) + .with_context(|| format!("failed to parse {url}"))?; + + let rev = match rev { + Some(rev) => rev, + None => self.fetch_rev(values)?, + }; + + let hash = self.fetch(values, &rev, &args, &args_str)?; + write!(out, "{}", hash)?; + + Ok(()) + } + fn fetch_json( &'a self, out: &mut impl ::std::io::Write, diff --git a/src/main.rs b/src/main.rs index d3efb49..d746d8b 100644 --- a/src/main.rs +++ b/src/main.rs @@ -140,7 +140,9 @@ fn main() -> Result<()> { let out = &mut stdout().lock(); let args = opts.args.into_iter().tuples().collect(); let args_str = opts.args_str.into_iter().tuples().collect(); - if opts.json { + if opts.hash { + fetcher.fetch_hash(out, &opts.url, opts.rev, args, args_str) + } else if opts.json { fetcher.fetch_json( out, &opts.url, @@ -166,7 +168,5 @@ fn main() -> Result<()> { overwrites, " ".repeat(opts.indent), ) - }?; - - Ok(()) + } } diff --git a/tests/cmd/hash.stdout b/tests/cmd/hash.stdout new file mode 100644 index 0000000..ea6b28e --- /dev/null +++ b/tests/cmd/hash.stdout @@ -0,0 +1 @@ +sha256-jZ+cCp1THDhfHH5yMmRPjGuthOqsgcF/3OjZ61FMdA4= \ No newline at end of file diff --git a/tests/cmd/hash.toml b/tests/cmd/hash.toml new file mode 100644 index 0000000..0d4e9c2 --- /dev/null +++ b/tests/cmd/hash.toml @@ -0,0 +1 @@ +args = ["https://github.com/nix-community/nurl", "v0.3.0", "--hash"] diff --git a/tests/integration.rs b/tests/integration.rs index c565e74..5c51414 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -15,9 +15,15 @@ fn integration() { fn verify_outputs() { for path in glob("tests/cmd/**/*.stdout").unwrap() { let path = path.unwrap(); - let name = path.file_name().unwrap(); + let name = path + .file_name() + .unwrap() + .to_str() + .unwrap() + .strip_suffix(".stdout") + .unwrap(); - if name == "json.stdout" { + if matches!(name, "hash" | "json") { eprintln!("skipping {}", path.display()); continue; } @@ -27,9 +33,9 @@ fn verify_outputs() { let mut expr = String::from_utf8(fs::read(&path).unwrap()).unwrap(); expr.insert_str(0, "(import { })."); - if name == "overwrite.stdout" { + if name == "overwrite" { expr.insert_str(0, r#"let pname = "nurl"; in "#); - } else if name == "overwrite_str.stdout" { + } else if name == "overwrite_str" { expr.insert_str(0, r#"let version = "0.3.0"; in "#); }