diff --git a/Cargo.lock b/Cargo.lock index 81de8e5e..4872a4a5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -258,6 +258,15 @@ dependencies = [ "textwrap", ] +[[package]] +name = "clap_complete" +version = "3.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da92e6facd8d73c22745a5d3cbb59bdf8e46e3235c923e516527d8e81eec14a4" +dependencies = [ + "clap", +] + [[package]] name = "clap_derive" version = "3.1.18" @@ -280,6 +289,16 @@ dependencies = [ "os_str_bytes", ] +[[package]] +name = "clap_mangen" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121b598d1b9d63d4ff3b7dae8defd88cc23e41850ee89fd2feec2e7d992e6ec8" +dependencies = [ + "clap", + "roff", +] + [[package]] name = "codespan-reporting" version = "0.11.1" @@ -1533,6 +1552,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "roff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b833d8d034ea094b1ea68aa6d5c740e0d04bad9d16568d08ba6f76823a114316" + [[package]] name = "rust-ini" version = "0.18.0" @@ -2041,6 +2066,8 @@ dependencies = [ "cfg-if", "chrono", "clap", + "clap_complete", + "clap_mangen", "color-eyre", "console", "directories", diff --git a/Cargo.toml b/Cargo.toml index 7ae19233..1c65d471 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,6 +28,8 @@ toml = "0.5" which_crate = { version = "~4.1", package = "which" } shellexpand = "~2.1" clap = { version = "~3.1", features = ["cargo", "derive"] } +clap_complete = "~3.1" +clap_mangen = "~0.1" walkdir = "~2.3" console = "~0.15" lazy_static = "~1.4" diff --git a/src/config.rs b/src/config.rs index 3c65db33..552d3d89 100644 --- a/src/config.rs +++ b/src/config.rs @@ -6,6 +6,7 @@ use std::process::Command; use std::{env, fs}; use clap::{ArgEnum, Parser}; +use clap_complete::Shell; use color_eyre::eyre; use color_eyre::eyre::Context; use color_eyre::eyre::Result; @@ -489,6 +490,14 @@ pub struct CommandLineArgs { /// See: https://docs.rs/tracing-subscriber/latest/tracing_subscriber/struct.EnvFilter.html #[clap(long, default_value = "info")] pub log_filter: String, + + /// Print completion script for the given shell and exit + #[clap(long, arg_enum, hide = true)] + pub gen_completion: Option, + + /// Print roff manpage and exit + #[clap(long, hide = true)] + pub gen_manpage: bool, } impl CommandLineArgs { diff --git a/src/main.rs b/src/main.rs index b77a1621..c4f55dff 100644 --- a/src/main.rs +++ b/src/main.rs @@ -4,6 +4,7 @@ use std::env; use std::io; use std::process::exit; +use clap::CommandFactory; use clap::{crate_version, Parser}; use color_eyre::eyre::Context; use color_eyre::eyre::{eyre, Result}; @@ -42,6 +43,18 @@ fn run() -> Result<()> { let opt = CommandLineArgs::parse(); + if let Some(shell) = opt.gen_completion { + let cmd = &mut CommandLineArgs::command(); + clap_complete::generate(shell, cmd, clap::crate_name!(), &mut std::io::stdout()); + return Ok(()); + } + + if opt.gen_manpage { + let man = clap_mangen::Man::new(CommandLineArgs::command()); + man.render(&mut std::io::stdout())?; + return Ok(()); + } + install_tracing(&opt.tracing_filter_directives())?; for env in opt.env_variables() { diff --git a/topgrade.8 b/topgrade.8 deleted file mode 100644 index 7dad0565..00000000 --- a/topgrade.8 +++ /dev/null @@ -1,80 +0,0 @@ -.hy -.TH "topgrade" "8" -.SH NAME -.PP -Topgrade \- Upgrade everything -.SH SYNOPSIS -.PP -topgrade [\fIoptions\f[]] -.SH DESCRIPTION -.PP -Keeping your system up to date usually involves invoking multiple package managers. -This results in big, non-portable shell one-liners saved in your shell. -To remedy this, \fBTopgrade\fR detects which tools you use and runs the appropriate commands to update them. -.SH OPTIONS -.TP -.B \-\-only -Run only specific steps -.RS -.RE -.TP -.B \-\-disable -Disable specific steps -.RS -.RE -.TP -.B \-c, \-\-cleanup -Cleanup temporary or old files -.RS -.RE -.TP -.B \-n, \-\-dry\-run -List the commands that would be run -.RS -.RE -.TP -.B \-\-edit\-config -Edit the configuration file -.RS -.RE -.TP -.B \-h, \-\-help -Print help information -.RS -.RE -.TP -.B \-k, \-\-keep -Prompt for a key before exiting -.RS -.RE -.TP -.B \-\-no\-retry -Do not ask to retry failed steps -.RS -.RE -.TP -.B \-t, \-\-tmux -Run inside tmux -.RS -.RE -.TP -.B \-V, \-\-version -Print version information -.RS -.RE -.TP -.B \-v, \-\-verbose -Output logs -.RS -.RE -.B \-y, \-\-yes -Skip package manager's prompts (experimental) -.SH ARGUMENT FORMAT -Options can be given in any order. -A list of steps must be provided as a list of separate arguments, i.e. 'topgrade --only system shell'. -.SH BUGS -For a list of bugs see <\fIhttps://github.com/r-darwish/topgrade/issues\fR>. -.SH AUTHOR -\fBTopgrade\fR is maintained by Roey Dror (\[aq]r\-darwish\[aq]) and many other contributors. -You can view the full list at -<\fIhttps://github.com/r-darwish/topgrade/graphs/contributors\fR>