atagen

roundabout

public
Star0
Watch0
6eb193fbfa7079255854358bcf4ae83a78070087
1
ssh://brewery@pls.lobotomise.me:33/atagen/roundabout.git

Blame: src/paths.rs

6f5b84fad3efatagen2026-09-27 03:59 UTC1
use std::{
6f5b84fad3efatagen2026-09-27 03:59 UTC2
    env, fs,
6f5b84fad3efatagen2026-09-27 03:59 UTC3
    os::unix::fs::{DirBuilderExt, PermissionsExt},
6f5b84fad3efatagen2026-09-27 03:59 UTC4
    path::{Path, PathBuf},
6f5b84fad3efatagen2026-09-27 03:59 UTC5
};
6f5b84fad3efatagen2026-09-27 03:59 UTC6
6f5b84fad3efatagen2026-09-27 03:59 UTC7
fn home() -> PathBuf {
6f5b84fad3efatagen2026-09-27 03:59 UTC8
    env::var_os("HOME").map_or_else(|| PathBuf::from("/"), PathBuf::from)
6f5b84fad3efatagen2026-09-27 03:59 UTC9
}
6f5b84fad3efatagen2026-09-27 03:59 UTC10
6f5b84fad3efatagen2026-09-27 03:59 UTC11
fn xdg(var: &str, fallback: &str) -> PathBuf {
6f5b84fad3efatagen2026-09-27 03:59 UTC12
    env::var_os(var)
6f5b84fad3efatagen2026-09-27 03:59 UTC13
        .map(PathBuf::from)
6f5b84fad3efatagen2026-09-27 03:59 UTC14
        .filter(|p| p.is_absolute())
6f5b84fad3efatagen2026-09-27 03:59 UTC15
        .unwrap_or_else(|| home().join(fallback))
6f5b84fad3efatagen2026-09-27 03:59 UTC16
}
6f5b84fad3efatagen2026-09-27 03:59 UTC17
6f5b84fad3efatagen2026-09-27 03:59 UTC18
pub fn config_file() -> PathBuf {
6f5b84fad3efatagen2026-09-27 03:59 UTC19
    env::var_os("ROUNDABOUT_CONFIG").map_or_else(
6f5b84fad3efatagen2026-09-27 03:59 UTC20
        || xdg("XDG_CONFIG_HOME", ".config").join("roundabout/config.toml"),
6f5b84fad3efatagen2026-09-27 03:59 UTC21
        PathBuf::from,
6f5b84fad3efatagen2026-09-27 03:59 UTC22
    )
6f5b84fad3efatagen2026-09-27 03:59 UTC23
}
6f5b84fad3efatagen2026-09-27 03:59 UTC24
6f5b84fad3efatagen2026-09-27 03:59 UTC25
pub fn state_dir() -> PathBuf {
6f5b84fad3efatagen2026-09-27 03:59 UTC26
    let dir = env::var_os("ROUNDABOUT_STATE_DIR").map_or_else(
6f5b84fad3efatagen2026-09-27 03:59 UTC27
        || xdg("XDG_STATE_HOME", ".local/state").join("roundabout"),
6f5b84fad3efatagen2026-09-27 03:59 UTC28
        PathBuf::from,
6f5b84fad3efatagen2026-09-27 03:59 UTC29
    );
6f5b84fad3efatagen2026-09-27 03:59 UTC30
    let _ = fs::create_dir_all(&dir);
6f5b84fad3efatagen2026-09-27 03:59 UTC31
    dir
6f5b84fad3efatagen2026-09-27 03:59 UTC32
}
6f5b84fad3efatagen2026-09-27 03:59 UTC33
6f5b84fad3efatagen2026-09-27 03:59 UTC34
pub fn runtime_dir() -> PathBuf {
6f5b84fad3efatagen2026-09-27 03:59 UTC35
    if let Some(dir) = env::var_os("ROUNDABOUT_RUNTIME_DIR") {
6f5b84fad3efatagen2026-09-27 03:59 UTC36
        let dir = PathBuf::from(dir);
6f5b84fad3efatagen2026-09-27 03:59 UTC37
        let _ = fs::DirBuilder::new()
6f5b84fad3efatagen2026-09-27 03:59 UTC38
            .recursive(true)
6f5b84fad3efatagen2026-09-27 03:59 UTC39
            .mode(0o700)
6f5b84fad3efatagen2026-09-27 03:59 UTC40
            .create(&dir);
6f5b84fad3efatagen2026-09-27 03:59 UTC41
        return dir;
6f5b84fad3efatagen2026-09-27 03:59 UTC42
    }
6f5b84fad3efatagen2026-09-27 03:59 UTC43
    if let Some(dir) = env::var_os("XDG_RUNTIME_DIR").map(PathBuf::from)
6f5b84fad3efatagen2026-09-27 03:59 UTC44
        && dir.is_absolute()
6f5b84fad3efatagen2026-09-27 03:59 UTC45
        && dir.is_dir()
6f5b84fad3efatagen2026-09-27 03:59 UTC46
    {
6f5b84fad3efatagen2026-09-27 03:59 UTC47
        return dir;
6f5b84fad3efatagen2026-09-27 03:59 UTC48
    }
6f5b84fad3efatagen2026-09-27 03:59 UTC49
    let uid = unsafe { libc::getuid() };
6f5b84fad3efatagen2026-09-27 03:59 UTC50
    let dir = env::temp_dir().join(format!("roundabout-{uid}"));
6f5b84fad3efatagen2026-09-27 03:59 UTC51
    let _ = fs::DirBuilder::new().mode(0o700).create(&dir);
6f5b84fad3efatagen2026-09-27 03:59 UTC52
    let _ = fs::set_permissions(&dir, fs::Permissions::from_mode(0o700));
6f5b84fad3efatagen2026-09-27 03:59 UTC53
    dir
6f5b84fad3efatagen2026-09-27 03:59 UTC54
}
6f5b84fad3efatagen2026-09-27 03:59 UTC55
6f5b84fad3efatagen2026-09-27 03:59 UTC56
pub fn socket() -> PathBuf {
6f5b84fad3efatagen2026-09-27 03:59 UTC57
    runtime_dir().join("roundabout.sock")
6f5b84fad3efatagen2026-09-27 03:59 UTC58
}
6f5b84fad3efatagen2026-09-27 03:59 UTC59
6f5b84fad3efatagen2026-09-27 03:59 UTC60
pub fn spawn_lock() -> PathBuf {
6f5b84fad3efatagen2026-09-27 03:59 UTC61
    runtime_dir().join("roundabout.lock")
6f5b84fad3efatagen2026-09-27 03:59 UTC62
}
6f5b84fad3efatagen2026-09-27 03:59 UTC63
6f5b84fad3efatagen2026-09-27 03:59 UTC64
pub fn project_root(cwd: &Path) -> PathBuf {
6f5b84fad3efatagen2026-09-27 03:59 UTC65
    const MARKERS: [&str; 6] = [
6f5b84fad3efatagen2026-09-27 03:59 UTC66
        ".jj",
6f5b84fad3efatagen2026-09-27 03:59 UTC67
        ".git",
6f5b84fad3efatagen2026-09-27 03:59 UTC68
        ".hg",
6f5b84fad3efatagen2026-09-27 03:59 UTC69
        "flake.nix",
6f5b84fad3efatagen2026-09-27 03:59 UTC70
        "Cargo.toml",
6f5b84fad3efatagen2026-09-27 03:59 UTC71
        "package.json",
6f5b84fad3efatagen2026-09-27 03:59 UTC72
    ];
6f5b84fad3efatagen2026-09-27 03:59 UTC73
    let mut best = None;
6f5b84fad3efatagen2026-09-27 03:59 UTC74
    for dir in cwd.ancestors() {
6f5b84fad3efatagen2026-09-27 03:59 UTC75
        if dir.join(".jj").exists() || dir.join(".git").exists() || dir.join(".hg").exists() {
6f5b84fad3efatagen2026-09-27 03:59 UTC76
            return dir.to_path_buf();
6f5b84fad3efatagen2026-09-27 03:59 UTC77
        }
6f5b84fad3efatagen2026-09-27 03:59 UTC78
        if best.is_none() && MARKERS.iter().any(|m| dir.join(m).exists()) {
6f5b84fad3efatagen2026-09-27 03:59 UTC79
            best = Some(dir.to_path_buf());
6f5b84fad3efatagen2026-09-27 03:59 UTC80
        }
6f5b84fad3efatagen2026-09-27 03:59 UTC81
    }
6f5b84fad3efatagen2026-09-27 03:59 UTC82
    best.unwrap_or_else(|| cwd.to_path_buf())
6f5b84fad3efatagen2026-09-27 03:59 UTC83
}