summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChandra Kiran G <chandra.kiran@cai-solutions.com>2023-09-29 18:53:09 +0530
committerGitHub <noreply@github.com>2023-09-29 14:23:09 +0100
commit504400673f7cd3c958bfe110aa788aa935059975 (patch)
treeb228879471a1a6bc1844e66136c7e9b57d186251
parent865f0e65f199f5d68504647ed20a7f6173d77629 (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.rs26
-rw-r--r--atuin/src/command/client/search.rs2
-rw-r--r--docs/docs/commands/list.md1
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