diff --git a/atuin-client/src/database.rs b/atuin-client/src/database.rs index d19a0b7..3b57915 100644 --- a/atuin-client/src/database.rs +++ b/atuin-client/src/database.rs @@ -1,6 +1,7 @@ use std::{env, path::Path, str::FromStr}; use async_trait::async_trait; +use atuin_common::utils; use chrono::{prelude::*, Utc}; use fs_err as fs; use itertools::Itertools; @@ -31,10 +32,7 @@ pub fn current_context() -> Context { std::process::exit(1); }; let hostname = format!("{}:{}", whoami::hostname(), whoami::username()); - let cwd = match env::current_dir() { - Ok(dir) => dir.display().to_string(), - Err(_) => String::from(""), - }; + let cwd = utils::get_current_dir(); Context { session, diff --git a/atuin-common/src/utils.rs b/atuin-common/src/utils.rs index d85b3b9..1d33039 100644 --- a/atuin-common/src/utils.rs +++ b/atuin-common/src/utils.rs @@ -1,3 +1,4 @@ +use std::env; use std::path::PathBuf; use chrono::NaiveDate; @@ -36,6 +37,17 @@ pub fn data_dir() -> PathBuf { data_dir.join("atuin") } +pub fn get_current_dir() -> String { + // Prefer PWD environment variable over cwd if available to better support symbolic links + match env::var("PWD") { + Ok(v) => v, + Err(_) => match env::current_dir() { + Ok(dir) => dir.display().to_string(), + Err(_) => String::from(""), + }, + } +} + pub fn get_days_from_month(year: i32, month: u32) -> i64 { NaiveDate::from_ymd( match month { diff --git a/src/command/client/history.rs b/src/command/client/history.rs index 7382eba..8735123 100644 --- a/src/command/client/history.rs +++ b/src/command/client/history.rs @@ -5,6 +5,7 @@ use std::{ time::Duration, }; +use atuin_common::utils; use clap::Subcommand; use eyre::Result; use runtime_format::{FormatKey, FormatKeyError, ParsedFmt}; @@ -181,8 +182,7 @@ impl Cmd { // It's better for atuin to silently fail here and attempt to // store whatever is ran, than to throw an error to the terminal - let cwd = env::current_dir() - .map_or_else(|_| String::new(), |dir| dir.display().to_string()); + let cwd = utils::get_current_dir(); let h = History::new(chrono::Utc::now(), command, cwd, -1, -1, None, None); @@ -240,7 +240,7 @@ impl Cmd { None }; let cwd = if *cwd { - Some(env::current_dir()?.display().to_string()) + Some(utils::get_current_dir()) } else { None }; diff --git a/src/command/client/search.rs b/src/command/client/search.rs index 3098267..8d0e1de 100644 --- a/src/command/client/search.rs +++ b/src/command/client/search.rs @@ -1,3 +1,4 @@ +use atuin_common::utils; use chrono::Utc; use clap::Parser; use eyre::Result; @@ -137,11 +138,7 @@ async fn run_non_interactive( db: &mut impl Database, ) -> Result { let dir = if cwd.as_deref() == Some(".") { - let current = std::env::current_dir()?; - let current = current.as_os_str(); - let current = current.to_str().unwrap(); - - Some(current.to_owned()) + Some(utils::get_current_dir()) } else { cwd };