diff options
author | Chandra Kiran G <chandra.kiran@cai-solutions.com> | 2023-09-29 18:53:09 +0530 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-29 14:23:09 +0100 |
commit | 504400673f7cd3c958bfe110aa788aa935059975 (patch) | |
tree | b228879471a1a6bc1844e66136c7e9b57d186251 | |
parent | 865f0e65f199f5d68504647ed20a7f6173d77629 (diff) |
add --reverse to history list (#1252)
* wip: add --reverse to history list
* fix: remove print_list being called twice when reverse=true
* chore: update documentation
* feat: Avoid unneeded reverse by iterate forward or backward instead
* feat: Make sure to only iterate once and avoid unneeded reverse call
* feat: It used to be reverse by default. So make it default true here to be backwards compatible
* fix clap
---------
Co-authored-by: Dieter Eickstädt <eickstaedt@deicon.de>
-rw-r--r-- | atuin/src/command/client/history.rs | 26 | ||||
-rw-r--r-- | atuin/src/command/client/search.rs | 2 | ||||
-rw-r--r-- | docs/docs/commands/list.md | 1 |
3 files changed, 24 insertions, 5 deletions
diff --git a/atuin/src/command/client/history.rs b/atuin/src/command/client/history.rs index 3ca6dc4c..6189d05a 100644 --- a/atuin/src/command/client/history.rs +++ b/atuin/src/command/client/history.rs @@ -51,6 +51,13 @@ pub enum Cmd { #[arg(long)] cmd_only: bool, + #[arg(long, short, default_value = "true")] + // accept no value + #[arg(num_args(0..=1), default_missing_value("true"))] + // accept a value + #[arg(action = clap::ArgAction::Set)] + reverse: bool, + /// Available variables: {command}, {directory}, {duration}, {user}, {host}, {exit} and {time}. /// Example: --format "{time} - [{duration}] - {directory}$\t{command}" #[arg(long, short)] @@ -93,7 +100,7 @@ impl ListMode { } #[allow(clippy::cast_sign_loss)] -pub fn print_list(h: &[History], list_mode: ListMode, format: Option<&str>) { +pub fn print_list(h: &[History], list_mode: ListMode, format: Option<&str>, reverse: bool) { let w = std::io::stdout(); let mut w = w.lock(); @@ -113,7 +120,13 @@ pub fn print_list(h: &[History], list_mode: ListMode, format: Option<&str>) { ListMode::CmdOnly => std::iter::once(ParseSegment::Key("command")).collect(), }; - for h in h.iter().rev() { + let iterator = if reverse { + Box::new(h.iter().rev()) as Box<dyn Iterator<Item = &History>> + } else { + Box::new(h.iter()) as Box<dyn Iterator<Item = &History>> + }; + + for h in iterator { match writeln!(w, "{}", parsed_fmt.with_args(&FmtHistory(h))) { Ok(()) => {} // ignore broken pipe (issue #626) @@ -266,6 +279,7 @@ impl Cmd { Ok(()) } + #[allow(clippy::too_many_arguments)] async fn handle_list( db: &mut impl Database, settings: &Settings, @@ -274,6 +288,7 @@ impl Cmd { cwd: bool, mode: ListMode, format: Option<String>, + reverse: bool, ) -> Result<()> { let session = if session { Some(env::var("ATUIN_SESSION")?) @@ -304,7 +319,7 @@ impl Cmd { } }; - print_list(&history, mode, format.as_deref()); + print_list(&history, mode, format.as_deref(), reverse); Ok(()) } @@ -320,10 +335,12 @@ impl Cmd { cwd, human, cmd_only, + reverse, format, } => { let mode = ListMode::from_flags(human, cmd_only); - Self::handle_list(db, settings, context, session, cwd, mode, format).await + let reverse = reverse; + Self::handle_list(db, settings, context, session, cwd, mode, format, reverse).await } Self::Last { @@ -337,6 +354,7 @@ impl Cmd { last, ListMode::from_flags(human, cmd_only), format.as_deref(), + true, ); Ok(()) diff --git a/atuin/src/command/client/search.rs b/atuin/src/command/client/search.rs index bdfa30bd..fd0a2e27 100644 --- a/atuin/src/command/client/search.rs +++ b/atuin/src/command/client/search.rs @@ -169,7 +169,7 @@ impl Cmd { .await?; } } else { - super::history::print_list(&entries, list_mode, self.format.as_deref()); + super::history::print_list(&entries, list_mode, self.format.as_deref(), true); } }; Ok(()) diff --git a/docs/docs/commands/list.md b/docs/docs/commands/list.md index c48d9d0a..4d4f2a97 100644 --- a/docs/docs/commands/list.md +++ b/docs/docs/commands/list.md @@ -11,6 +11,7 @@ title: Listing History | `--session`/`-s` | Enable listing history for the current session only (default: false) | | `--human` | Use human-readable formatting for the timestamp and duration (default: false) | | `--cmd-only` | Show only the text of the command (default: false) | +| `--reverse` | Reverse the order of the output (default: false) | | `--format` | Specify the formatting of a command (see below) | ## Format |