mirror of
https://github.com/atuinsh/atuin.git
synced 2024-11-22 08:13:57 +01:00
feat: add 'ignored_commands' option to stats (#1722)
This commit is contained in:
parent
063d9054d7
commit
f8d01eef99
@ -171,3 +171,6 @@ enter_accept = true
|
||||
|
||||
## Set commands that should be totally stripped and ignored from stats
|
||||
#common_prefix = ["sudo"]
|
||||
|
||||
## Set commands that will be completely ignored from stats
|
||||
#ignored_commands = ["cd", "ls", "vi"]
|
||||
|
@ -270,6 +270,8 @@ pub struct Stats {
|
||||
pub common_prefix: Vec<String>, // sudo, etc. commands we want to strip off
|
||||
#[serde(default = "Stats::common_subcommands_default")]
|
||||
pub common_subcommands: Vec<String>, // kubectl, commands we should consider subcommands for
|
||||
#[serde(default = "Stats::ignored_commands_default")]
|
||||
pub ignored_commands: Vec<String>, // cd, ls, etc. commands we want to completely hide from stats
|
||||
}
|
||||
|
||||
impl Stats {
|
||||
@ -283,6 +285,10 @@ impl Stats {
|
||||
.map(String::from)
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn ignored_commands_default() -> Vec<String> {
|
||||
vec![]
|
||||
}
|
||||
}
|
||||
|
||||
impl Default for Stats {
|
||||
@ -290,6 +296,7 @@ impl Default for Stats {
|
||||
Self {
|
||||
common_prefix: Self::common_prefix_default(),
|
||||
common_subcommands: Self::common_subcommands_default(),
|
||||
ignored_commands: Self::ignored_commands_default(),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -24,16 +24,22 @@ pub struct Cmd {
|
||||
count: usize,
|
||||
}
|
||||
|
||||
fn compute_stats(settings: &Settings, history: &[History], count: usize) {
|
||||
fn compute_stats(settings: &Settings, history: &[History], count: usize) -> (usize, usize) {
|
||||
let mut commands = HashSet::<&str>::with_capacity(history.len());
|
||||
let mut prefixes = HashMap::<&str, usize>::with_capacity(history.len());
|
||||
let mut total_unignored = 0;
|
||||
for i in history {
|
||||
// just in case it somehow has a leading tab or space or something (legacy atuin didn't ignore space prefixes)
|
||||
let command = i.command.trim();
|
||||
let prefix = interesting_command(settings, command);
|
||||
|
||||
if settings.stats.ignored_commands.iter().any(|c| c == prefix) {
|
||||
continue;
|
||||
}
|
||||
|
||||
total_unignored += 1;
|
||||
commands.insert(command);
|
||||
*prefixes
|
||||
.entry(interesting_command(settings, command))
|
||||
.or_default() += 1;
|
||||
*prefixes.entry(prefix).or_default() += 1;
|
||||
}
|
||||
|
||||
let unique = commands.len();
|
||||
@ -42,7 +48,7 @@ fn compute_stats(settings: &Settings, history: &[History], count: usize) {
|
||||
top.truncate(count);
|
||||
if top.is_empty() {
|
||||
println!("No commands found");
|
||||
return;
|
||||
return (0, 0);
|
||||
}
|
||||
|
||||
let max = top.iter().map(|x| x.1).max().unwrap();
|
||||
@ -73,8 +79,10 @@ fn compute_stats(settings: &Settings, history: &[History], count: usize) {
|
||||
command.escape_control()
|
||||
);
|
||||
}
|
||||
println!("Total commands: {}", history.len());
|
||||
println!("Total commands: {total_unignored}");
|
||||
println!("Unique commands: {unique}");
|
||||
|
||||
(total_unignored, unique)
|
||||
}
|
||||
|
||||
impl Cmd {
|
||||
@ -176,10 +184,36 @@ fn interesting_command<'a>(settings: &Settings, mut command: &'a str) -> &'a str
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use atuin_client::history::History;
|
||||
use atuin_client::settings::Settings;
|
||||
use time::OffsetDateTime;
|
||||
|
||||
use super::compute_stats;
|
||||
use super::interesting_command;
|
||||
|
||||
#[test]
|
||||
fn ignored_commands() {
|
||||
let mut settings = Settings::utc();
|
||||
settings.stats.ignored_commands.push("cd".to_string());
|
||||
|
||||
let history = [
|
||||
History::import()
|
||||
.timestamp(OffsetDateTime::now_utc())
|
||||
.command("cd foo")
|
||||
.build()
|
||||
.into(),
|
||||
History::import()
|
||||
.timestamp(OffsetDateTime::now_utc())
|
||||
.command("cargo build stuff")
|
||||
.build()
|
||||
.into(),
|
||||
];
|
||||
|
||||
let (total, unique) = compute_stats(&settings, &history, 10);
|
||||
assert_eq!(total, 1);
|
||||
assert_eq!(unique, 1);
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn interesting_commands() {
|
||||
let settings = Settings::utc();
|
||||
|
Loading…
Reference in New Issue
Block a user