use std::process::Command;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Mutex;
use super::types::ManagerKind;
static SKIP_SEARCH: AtomicBool = AtomicBool::new(false);
static DELAY_DAYS_SETTING: std::sync::atomic::AtomicU64 = std::sync::atomic::AtomicU64::new(7);
static EXCLUDED_MANAGERS: Mutex<Vec<String>> = Mutex::new(Vec::new());
pub fn set_skip_search(skip: bool) {
SKIP_SEARCH.store(skip, Ordering::Relaxed);
}
pub fn skip_search_enabled() -> bool {
SKIP_SEARCH.load(Ordering::Relaxed)
}
pub fn set_delay_days(days: u64) {
DELAY_DAYS_SETTING.store(days, Ordering::Relaxed);
}
pub fn get_delay_days() -> u64 {
DELAY_DAYS_SETTING.load(Ordering::Relaxed)
}
pub fn set_excluded_managers(names: Vec<String>) {
*EXCLUDED_MANAGERS.lock().unwrap_or_else(|e| e.into_inner()) = names;
}
pub fn is_excluded(kind: ManagerKind) -> bool {
let excluded = EXCLUDED_MANAGERS.lock().unwrap_or_else(|e| e.into_inner());
if excluded.is_empty() {
return false;
}
let name = kind.name();
excluded.iter().any(|e| {
e.eq_ignore_ascii_case(name)
|| ((kind == ManagerKind::PnpmWorkspace || kind == ManagerKind::PnpmGlobal)
&& e.eq_ignore_ascii_case("pnpm"))
})
}
pub fn detect_version(name: &str) -> Option<String> {
let result = Command::new(name).arg("--version").output();
let output = match result {
Ok(o) if o.status.success() => o,
_ if cfg!(target_os = "windows") => Command::new(format!("{name}.cmd"))
.arg("--version")
.output()
.ok()
.filter(|o| o.status.success())?,
_ => return None,
};
String::from_utf8(output.stdout)
.ok()
.map(|s| s.trim().to_string())
}