aboutsummaryrefslogtreecommitdiffstats
path: root/crates/atuin-client/src/database.rs
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/database.rs
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/database.rs')
-rw-r--r--crates/atuin-client/src/database.rs29
1 files changed, 29 insertions, 0 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),
};