diff --git a/crates/atuin-client/src/import/atuin_histdb.rs b/crates/atuin-client/src/import/atuin_histdb.rs new file mode 100644 index 00000000000..df825bba69e --- /dev/null +++ b/crates/atuin-client/src/import/atuin_histdb.rs @@ -0,0 +1,73 @@ +// import old shell history from atuin-histdb file! +// automatically hoover up all that we can find + +use std::path::{Path, PathBuf}; + +use async_trait::async_trait; +use eyre::{eyre, Result}; + +use crate::database::{Sqlite, Database, current_context}; +use crate::settings::FilterMode; + +use super::Importer; +use crate::history::History; +use crate::import::Loader; + +pub struct AtuinExternalDb { + histdb: Vec, +} +impl AtuinExternalDb { + pub fn histpath() -> Result { + let path = Path::new("/tmp/history.db").to_path_buf(); + if path.exists() { + Ok(path) + } else { + Err(eyre!("Could not find history file hardcodded at /tmp/history.db")) + } + } +} + +/// Read db at given file, return vector of entries. +async fn hist_from_db(dbpath: PathBuf) -> Result> { + let db_to_migrate = Sqlite::new(dbpath, 0.1).await?; + let external_history = db_to_migrate.list( + &[FilterMode::Global], + ¤t_context(), // this is passed to list, but only used for the workspace + None, + false, + true, + ).await.unwrap(); + // debug!("{}", external_history); + Ok(external_history) +} + +#[async_trait] +impl Importer for AtuinExternalDb { + const NAME: &'static str = "history.db"; + + /// Creates a new AtuinExternalDb imports the history + /// Does no duplicate checking. + async fn new() -> Result { + let dbpath = AtuinExternalDb::histpath()?; + let histdb_entry_vec = hist_from_db(dbpath).await?; + Ok(Self { + histdb: histdb_entry_vec, + }) + } + + async fn entries(&mut self) -> Result { + Ok(self.histdb.len()) + } + + async fn load(self, h: &mut impl Loader) -> Result<()> { + for entry in self.histdb { + h.push(entry).await?; + } + Ok(()) + } +} + +#[cfg(test)] +mod test { + // TODO +} diff --git a/crates/atuin-client/src/import/mod.rs b/crates/atuin-client/src/import/mod.rs index eb3ce04511c..35380376043 100644 --- a/crates/atuin-client/src/import/mod.rs +++ b/crates/atuin-client/src/import/mod.rs @@ -18,6 +18,7 @@ pub mod xonsh; pub mod xonsh_sqlite; pub mod zsh; pub mod zsh_histdb; +pub mod atuin_histdb; #[async_trait] pub trait Importer: Sized { diff --git a/crates/atuin-client/src/import/zsh_histdb.rs b/crates/atuin-client/src/import/zsh_histdb.rs index eb72baa3d2b..ed2cae5d8a8 100644 --- a/crates/atuin-client/src/import/zsh_histdb.rs +++ b/crates/atuin-client/src/import/zsh_histdb.rs @@ -47,11 +47,6 @@ use crate::history::History; use crate::import::Loader; use crate::utils::{get_hostname, get_username}; -#[derive(sqlx::FromRow, Debug)] -pub struct HistDbEntryCount { - pub count: usize, -} - #[derive(sqlx::FromRow, Debug)] pub struct HistDbEntry { pub id: i64, diff --git a/crates/atuin/src/command/client/import.rs b/crates/atuin/src/command/client/import.rs index d7857b9fe67..91ffab362f9 100644 --- a/crates/atuin/src/command/client/import.rs +++ b/crates/atuin/src/command/client/import.rs @@ -9,7 +9,7 @@ use atuin_client::{ database::Database, history::History, import::{ - bash::Bash, fish::Fish, nu::Nu, nu_histdb::NuHistDb, replxx::Replxx, resh::Resh, + atuin_histdb::AtuinExternalDb, bash::Bash, fish::Fish, nu::Nu, nu_histdb::NuHistDb, replxx::Replxx, resh::Resh, xonsh::Xonsh, xonsh_sqlite::XonshSqlite, zsh::Zsh, zsh_histdb::ZshHistDb, Importer, Loader, }, }; @@ -40,6 +40,8 @@ pub enum Cmd { Xonsh, /// Import history from xonsh sqlite db XonshSqlite, + /// Import history from a separate atuin history.db file + AtuinExternalDb } const BATCH_SIZE: usize = 100; @@ -116,6 +118,7 @@ impl Cmd { Self::NuHistDb => import::(db).await, Self::Xonsh => import::(db).await, Self::XonshSqlite => import::(db).await, + Self::AtuinExternalDb => import::(db).await, } } }