mirror of
https://github.com/atuinsh/atuin.git
synced 2025-06-20 01:47:59 +02:00
feat(doctor): detect active preexec framework (#1955)
* feat(doctor): check active preexec framework To check if "blesh" or "bash-preexec" is loaded and active in the current Bash session where `atuin doctor` is called, we make the Atuin integration script for Bash to set the environment variable `ATUIN_PREEXEC_BACKEND` and store a string when it detects "blesh" or "bash-preexec". To check whether the obtained ATUIN_PREEXEC_BACKEND is set by the current session, we record SHLVL in ATUIN_PREEXEC_BACKEND and check if it matches SHLVL of the current process. * feat(doctor): detect the case where Atuin is initialized before blesh
This commit is contained in:
parent
19f70cdc91
commit
4f26963c99
@ -19,6 +19,9 @@ struct ShellInfo {
|
|||||||
// Detect some shell plugins that the user has installed.
|
// Detect some shell plugins that the user has installed.
|
||||||
// I'm just going to start with preexec/blesh
|
// I'm just going to start with preexec/blesh
|
||||||
pub plugins: Vec<String>,
|
pub plugins: Vec<String>,
|
||||||
|
|
||||||
|
// The preexec framework used in the current session, if Atuin is loaded.
|
||||||
|
pub preexec: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl ShellInfo {
|
impl ShellInfo {
|
||||||
@ -43,6 +46,31 @@ impl ShellInfo {
|
|||||||
cmd.contains("ATUIN_DOCTOR_ENV_FOUND")
|
cmd.contains("ATUIN_DOCTOR_ENV_FOUND")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn detect_preexec_framework(shell: &str) -> Option<String> {
|
||||||
|
if env::var("ATUIN_SESSION").ok().is_none() {
|
||||||
|
None
|
||||||
|
} else if shell.starts_with("bash") || shell == "sh" {
|
||||||
|
env::var("ATUIN_PREEXEC_BACKEND")
|
||||||
|
.ok()
|
||||||
|
.filter(|value| !value.is_empty())
|
||||||
|
.and_then(|atuin_preexec_backend| {
|
||||||
|
atuin_preexec_backend.rfind(':').and_then(|pos_colon| {
|
||||||
|
u32::from_str(&atuin_preexec_backend[..pos_colon])
|
||||||
|
.ok()
|
||||||
|
.is_some_and(|preexec_shlvl| {
|
||||||
|
env::var("SHLVL")
|
||||||
|
.ok()
|
||||||
|
.and_then(|shlvl| u32::from_str(&shlvl).ok())
|
||||||
|
.is_some_and(|shlvl| shlvl == preexec_shlvl)
|
||||||
|
})
|
||||||
|
.then(|| atuin_preexec_backend[pos_colon + 1..].to_string())
|
||||||
|
})
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
Some("built-in".to_string())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn validate_plugin_blesh(
|
fn validate_plugin_blesh(
|
||||||
_shell: &str,
|
_shell: &str,
|
||||||
shell_process: &sysinfo::Process,
|
shell_process: &sysinfo::Process,
|
||||||
@ -156,10 +184,13 @@ impl ShellInfo {
|
|||||||
|
|
||||||
let default = Shell::default_shell().unwrap_or(Shell::Unknown).to_string();
|
let default = Shell::default_shell().unwrap_or(Shell::Unknown).to_string();
|
||||||
|
|
||||||
|
let preexec = Self::detect_preexec_framework(name.as_str());
|
||||||
|
|
||||||
Self {
|
Self {
|
||||||
name,
|
name,
|
||||||
default,
|
default,
|
||||||
plugins,
|
plugins,
|
||||||
|
preexec,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -272,6 +303,7 @@ fn checks(info: &DoctorDump) {
|
|||||||
//
|
//
|
||||||
let zfs_error = "[Filesystem] ZFS is known to have some issues with SQLite. Atuin uses SQLite heavily. If you are having poor performance, there are some workarounds here: https://github.com/atuinsh/atuin/issues/952".bold().red();
|
let zfs_error = "[Filesystem] ZFS is known to have some issues with SQLite. Atuin uses SQLite heavily. If you are having poor performance, there are some workarounds here: https://github.com/atuinsh/atuin/issues/952".bold().red();
|
||||||
let bash_plugin_error = "[Shell] If you are using Bash, Atuin requires that either bash-preexec or ble.sh be installed. An older ble.sh may not be detected. so ignore this if you have it set up! Read more here: https://docs.atuin.sh/guide/installation/#bash".bold().red();
|
let bash_plugin_error = "[Shell] If you are using Bash, Atuin requires that either bash-preexec or ble.sh be installed. An older ble.sh may not be detected. so ignore this if you have it set up! Read more here: https://docs.atuin.sh/guide/installation/#bash".bold().red();
|
||||||
|
let blesh_loading_order_error = "[Shell] Atuin seems to be loaded before ble.sh is sourced. In .bashrc, make sure to initialize Atuin after sourcing ble.sh.".bold().red();
|
||||||
|
|
||||||
// ZFS: https://github.com/atuinsh/atuin/issues/952
|
// ZFS: https://github.com/atuinsh/atuin/issues/952
|
||||||
if info.system.disks.iter().any(|d| d.filesystem == "zfs") {
|
if info.system.disks.iter().any(|d| d.filesystem == "zfs") {
|
||||||
@ -279,14 +311,22 @@ fn checks(info: &DoctorDump) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Shell
|
// Shell
|
||||||
if info.shell.name == "bash"
|
if info.shell.name == "bash" {
|
||||||
&& !info
|
if !info
|
||||||
.shell
|
.shell
|
||||||
.plugins
|
.plugins
|
||||||
.iter()
|
.iter()
|
||||||
.any(|p| p == "blesh" || p == "bash-preexec")
|
.any(|p| p == "blesh" || p == "bash-preexec")
|
||||||
{
|
{
|
||||||
println!("{bash_plugin_error}");
|
println!("{bash_plugin_error}");
|
||||||
|
}
|
||||||
|
|
||||||
|
if info.shell.plugins.iter().any(|plugin| plugin == "atuin")
|
||||||
|
&& info.shell.plugins.iter().any(|plugin| plugin == "blesh")
|
||||||
|
&& info.shell.preexec.as_ref().is_some_and(|val| val == "none")
|
||||||
|
{
|
||||||
|
println!("{blesh_loading_order_error}");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -17,6 +17,19 @@ ATUIN_STTY=$(stty -g)
|
|||||||
export ATUIN_SESSION
|
export ATUIN_SESSION
|
||||||
ATUIN_HISTORY_ID=""
|
ATUIN_HISTORY_ID=""
|
||||||
|
|
||||||
|
export ATUIN_PREEXEC_BACKEND=$SHLVL:none
|
||||||
|
__atuin_update_preexec_backend() {
|
||||||
|
if [[ ${BLE_ATTACHED-} ]]; then
|
||||||
|
ATUIN_PREEXEC_BACKEND=$SHLVL:blesh-${BLE_VERSION-}
|
||||||
|
elif [[ ${bash_preexec_imported-} ]]; then
|
||||||
|
ATUIN_PREEXEC_BACKEND=$SHLVL:bash-preexec
|
||||||
|
elif [[ ${__bp_imported-} ]]; then
|
||||||
|
ATUIN_PREEXEC_BACKEND="$SHLVL:bash-preexec (old)"
|
||||||
|
else
|
||||||
|
ATUIN_PREEXEC_BACKEND=$SHLVL:unknown
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
__atuin_preexec() {
|
__atuin_preexec() {
|
||||||
# Workaround for old versions of bash-preexec
|
# Workaround for old versions of bash-preexec
|
||||||
if [[ ! ${BLE_ATTACHED-} ]]; then
|
if [[ ! ${BLE_ATTACHED-} ]]; then
|
||||||
@ -33,6 +46,10 @@ __atuin_preexec() {
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Note: We update ATUIN_PREEXEC_BACKEND on every preexec because blesh's
|
||||||
|
# attaching state can dynamically change.
|
||||||
|
__atuin_update_preexec_backend
|
||||||
|
|
||||||
local id
|
local id
|
||||||
id=$(atuin history start -- "$1")
|
id=$(atuin history start -- "$1")
|
||||||
export ATUIN_HISTORY_ID=$id
|
export ATUIN_HISTORY_ID=$id
|
||||||
|
Loading…
x
Reference in New Issue
Block a user