diff --git a/Cargo.lock b/Cargo.lock index 038ece8..ca062be 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -287,6 +287,16 @@ version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b94f61472cee1439c0b966b47e3aca9ae07e45d070759512cd390ea2bebc6675" +[[package]] +name = "clap_mangen" +version = "0.2.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2fb6d3f935bbb9819391528b0e7cf655e78a0bc7a7c3d227211a1d24fc11db1" +dependencies = [ + "clap", + "roff", +] + [[package]] name = "colorchoice" version = "1.0.4" @@ -1056,6 +1066,7 @@ dependencies = [ "bincode", "byteorder", "clap", + "clap_mangen", "futures", "grep", "indexmap", @@ -1458,6 +1469,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "roff" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88f8660c1ff60292143c98d08fc6e2f654d722db50410e3f3797d40baaf9d8f3" + [[package]] name = "rusqlite" version = "0.37.0" diff --git a/Cargo.toml b/Cargo.toml index dade4ea..e72e6ef 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -49,6 +49,7 @@ xdg = "3.0.0" xml-rs = "0.8.20" xz2 = "0.1.7" zstd = { version = "0.13.3", features = [ "zstdmt" ] } +clap_mangen = "0.2.28" [dependencies.tokio] features = ["full"] diff --git a/flake.nix b/flake.nix index 2a048c2..3aebed9 100644 --- a/flake.nix +++ b/flake.nix @@ -33,6 +33,7 @@ lockFile = ./Cargo.lock; }; + nativeBuildInputs = [ installShellFiles ]; buildInputs = [ sqlite ]; postInstall = '' @@ -42,6 +43,12 @@ substituteInPlace command-not-found.nu \ --subst-var out install -Dm555 command-not-found.nu -t $out/etc/profile.d + + "$out/bin/nix-locate" --mangen > nix-locate.1 + "$out/bin/nix-index" --mangen > nix-index.1 + "$out/bin/nix-channel-index" --mangen > nix-channel-index.1 + + installManPage nix-locate.1 nix-index.1 nix-channel-index.1 ''; meta = with lib; { diff --git a/src/bin/nix-channel-index.rs b/src/bin/nix-channel-index.rs index 5342ca9..1902bea 100644 --- a/src/bin/nix-channel-index.rs +++ b/src/bin/nix-channel-index.rs @@ -175,7 +175,7 @@ async fn update_index(args: &Args) -> Result<()> { } #[derive(Debug, Parser)] -#[clap(author, about, version)] +#[clap(author, about, version, name = "nix-channel-index")] struct Args { /// Make REQUESTS http requests in parallel #[clap(short = 'r', long = "requests", default_value = "500")] @@ -200,12 +200,28 @@ struct Args { /// Show a stack trace in the case of a Nix evaluation error #[clap(long)] show_trace: bool, + + /// Generate man page, then exit. + #[clap(long, hide = true)] + mangen: bool, } #[tokio::main] async fn main() { let args = Args::parse(); + if args.mangen { + use clap::CommandFactory; + let man = clap_mangen::Man::new(Args::command()); + + if let Err(err) = man.render(&mut std::io::stdout()) { + eprintln!("error: {}", err); + process::exit(2) + } else { + return; + } + } + if let Err(e) = update_index(&args).await { eprintln!("error: {:?}", e); process::exit(2); diff --git a/src/bin/nix-index.rs b/src/bin/nix-index.rs index fbef99b..a42195e 100644 --- a/src/bin/nix-index.rs +++ b/src/bin/nix-index.rs @@ -132,7 +132,7 @@ fn cache_dir() -> &'static OsStr { /// Builds an index for nix-locate #[derive(Debug, Parser)] -#[clap(author, about, version)] +#[clap(author, about, version, name = "nix-index")] struct Args { /// Make REQUESTS http requests in parallel #[clap(short = 'r', long = "requests", default_value = "100")] @@ -168,12 +168,28 @@ struct Args { /// Note: does not check if the cached data is up to date! Use only for development. #[clap(long)] path_cache: bool, + + /// Generate man page, then exit + #[clap(long, hide = true)] + mangen: bool, } #[tokio::main] async fn main() { let args = Args::parse(); + if args.mangen { + use clap::CommandFactory; + let man = clap_mangen::Man::new(Args::command()); + + if let Err(err) = man.render(&mut std::io::stdout()) { + eprintln!("error: {}", err); + process::exit(2) + } else { + return; + } + } + if let Err(e) = update_index(&args).await { eprintln!("error: {:?}", e); process::exit(2); diff --git a/src/bin/nix-locate.rs b/src/bin/nix-locate.rs index c379bd5..2d8035f 100644 --- a/src/bin/nix-locate.rs +++ b/src/bin/nix-locate.rs @@ -180,7 +180,7 @@ fn locate(args: &Args) -> Result<()> { /// /// Handles parsing the values of more complex arguments. fn process_args(matches: Opts) -> result::Result { - let pattern_arg = matches.pattern; + let pattern_arg = matches.pattern.unwrap(); let package_arg = matches.package; let start_anchor = if matches.at_root { "^" } else { "" }; @@ -260,11 +260,11 @@ fn cache_dir() -> &'static OsStr { /// Quickly finds the derivation providing a certain file #[derive(Debug, Parser)] -#[clap(author, about, version, after_help = LONG_USAGE)] +#[clap(author, about, version, after_help = LONG_USAGE, name = "nix-locate")] struct Opts { /// Pattern for which to search - // #[clap(name = "PATTERN")] - pattern: String, + #[clap(required_unless_present = "mangen", name = "PATTERN")] + pattern: Option, /// Directory where the index is stored #[clap(short, long = "db", default_value_os = cache_dir(), env = "NIX_INDEX_DATABASE")] @@ -320,6 +320,10 @@ struct Opts { /// store path are omitted. This is useful for scripts that use the output of nix-locate. #[clap(long)] minimal: bool, + + /// Generate the man page, then exit + #[clap(long, hide = true)] + mangen: bool, } #[derive(clap::ValueEnum, Clone, Copy, Debug)] @@ -345,6 +349,18 @@ impl FromStr for Color { fn main() { let args = Opts::parse(); + if args.mangen { + use clap::CommandFactory; + let man = clap_mangen::Man::new(Opts::command()); + + if let Err(e) = man.render(&mut std::io::stdout()) { + eprintln!("error: {}", e); + process::exit(2) + } else { + return; + } + } + let args = process_args(args).unwrap_or_else(|e| e.exit()); if let Err(e) = locate(&args) {