aboutsummaryrefslogtreecommitdiffstats
path: root/crates/atuin-client/src
diff options
context:
space:
mode:
authorchitao1234 <chotaotao1qaz2wsx@gmail.com>2025-09-14 23:18:41 +0800
committerEllie Huxtable <ellie@elliehuxtable.com>2025-09-15 10:31:09 -0700
commit0aedb4ddd9e6413d4025122675fe7423f43b5d7b (patch)
tree5b015f8ec15c7dd022a93aedfb3cac057ff7931b /crates/atuin-client/src
parentchore(deps): bump debian (diff)
downloadatuin-0aedb4ddd9e6413d4025122675fe7423f43b5d7b.zip
feat: add session-preload filter mode to include global history from before session start
This mode mimics the default behavior for many shells.
Diffstat (limited to 'crates/atuin-client/src')
-rw-r--r--crates/atuin-client/src/database.rs29
-rw-r--r--crates/atuin-client/src/settings.rs14
2 files changed, 42 insertions, 1 deletions
diff --git a/crates/atuin-client/src/database.rs b/crates/atuin-client/src/database.rs
index fac0eb89..3c88350f 100644
--- a/crates/atuin-client/src/database.rs
+++ b/crates/atuin-client/src/database.rs
@@ -20,6 +20,7 @@ use sqlx::{
},
};
use time::OffsetDateTime;
+use uuid::Uuid;
use crate::{
history::{HistoryId, HistoryStats},
@@ -75,6 +76,16 @@ pub fn current_context() -> Context {
}
}
+fn get_session_start_time(session_id: &str) -> Option<i64> {
+ if let Ok(uuid) = Uuid::parse_str(session_id) {
+ if let Some(timestamp) = uuid.get_timestamp() {
+ let (seconds, nanos) = timestamp.to_unix();
+ return Some(seconds as i64 * 1_000_000_000 + nanos as i64);
+ }
+ }
+ None
+}
+
#[async_trait]
pub trait Database: Send + Sync + 'static {
async fn save(&self, h: &History) -> Result<()>;
@@ -316,11 +327,20 @@ impl Database for Sqlite {
context.cwd.clone()
};
+ let session_start = get_session_start_time(&context.session);
+
for filter in filters {
match filter {
FilterMode::Global => &mut query,
FilterMode::Host => query.and_where_eq("hostname", quote(&context.hostname)),
FilterMode::Session => query.and_where_eq("session", quote(&context.session)),
+ FilterMode::SessionPreload => {
+ query.and_where_eq("session", quote(&context.session));
+ if let Some(session_start) = session_start {
+ query.or_where_lt("timestamp", session_start);
+ }
+ &mut query
+ }
FilterMode::Directory => query.and_where_eq("cwd", quote(&context.cwd)),
FilterMode::Workspace => query.and_where_like_left("cwd", &git_root),
};
@@ -437,12 +457,21 @@ impl Database for Sqlite {
context.cwd.clone()
};
+ let session_start = get_session_start_time(&context.session);
+
match filter {
FilterMode::Global => &mut sql,
FilterMode::Host => {
sql.and_where_eq("lower(hostname)", quote(context.hostname.to_lowercase()))
}
FilterMode::Session => sql.and_where_eq("session", quote(&context.session)),
+ FilterMode::SessionPreload => {
+ sql.and_where_eq("session", quote(&context.session));
+ if let Some(session_start) = session_start {
+ sql.or_where_lt("timestamp", session_start);
+ }
+ &mut sql
+ }
FilterMode::Directory => sql.and_where_eq("cwd", quote(&context.cwd)),
FilterMode::Workspace => sql.and_where_like_left("cwd", git_root),
};
diff --git a/crates/atuin-client/src/settings.rs b/crates/atuin-client/src/settings.rs
index d9ebe00b..78d1f9b2 100644
--- a/crates/atuin-client/src/settings.rs
+++ b/crates/atuin-client/src/settings.rs
@@ -86,6 +86,9 @@ pub enum FilterMode {
#[serde(rename = "workspace")]
Workspace = 4,
+
+ #[serde(rename = "session-preload")]
+ SessionPreload = 5,
}
impl FilterMode {
@@ -96,6 +99,7 @@ impl FilterMode {
FilterMode::Session => "SESSION",
FilterMode::Directory => "DIRECTORY",
FilterMode::Workspace => "WORKSPACE",
+ FilterMode::SessionPreload => "SESSION+",
}
}
}
@@ -420,6 +424,7 @@ impl Default for Search {
FilterMode::Global,
FilterMode::Host,
FilterMode::Session,
+ FilterMode::SessionPreload,
FilterMode::Workspace,
FilterMode::Directory,
],
@@ -814,7 +819,14 @@ impl Settings {
.set_default("scripts.db_path", scripts_path.to_str())?
.set_default(
"search.filters",
- vec!["global", "host", "session", "workspace", "directory"],
+ vec![
+ "global",
+ "host",
+ "session",
+ "workspace",
+ "directory",
+ "session-preload",
+ ],
)?
.set_default("theme.name", "default")?
.set_default("theme.debug", None::<bool>)?