atagen

roundabout

public
Star0
Watch0
fdad58f8133a77a20c44d0e1472cb73a5128ef2c
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 {
61c6e94355d9atagen2026-09-27 03:59 UTC19
    if let Some(p) = env::var_os("ROUNDABOUT_CONFIG") {
61c6e94355d9atagen2026-09-27 03:59 UTC20
        return p.into();
61c6e94355d9atagen2026-09-27 03:59 UTC21
    }
61c6e94355d9atagen2026-09-27 03:59 UTC22
    let user = xdg("XDG_CONFIG_HOME", ".config").join("roundabout/config.toml");
61c6e94355d9atagen2026-09-27 03:59 UTC23
    let system = PathBuf::from("/etc/roundabout/config.toml");
61c6e94355d9atagen2026-09-27 03:59 UTC24
    if !user.exists() && system.exists() {
61c6e94355d9atagen2026-09-27 03:59 UTC25
        system
61c6e94355d9atagen2026-09-27 03:59 UTC26
    } else {
61c6e94355d9atagen2026-09-27 03:59 UTC27
        user
61c6e94355d9atagen2026-09-27 03:59 UTC28
    }
6f5b84fad3efatagen2026-09-27 03:59 UTC29
}
6f5b84fad3efatagen2026-09-27 03:59 UTC30
6f5b84fad3efatagen2026-09-27 03:59 UTC31
pub fn state_dir() -> PathBuf {
6f5b84fad3efatagen2026-09-27 03:59 UTC32
    let dir = env::var_os("ROUNDABOUT_STATE_DIR").map_or_else(
6f5b84fad3efatagen2026-09-27 03:59 UTC33
        || xdg("XDG_STATE_HOME", ".local/state").join("roundabout"),
6f5b84fad3efatagen2026-09-27 03:59 UTC34
        PathBuf::from,
6f5b84fad3efatagen2026-09-27 03:59 UTC35
    );
6f5b84fad3efatagen2026-09-27 03:59 UTC36
    let _ = fs::create_dir_all(&dir);
6f5b84fad3efatagen2026-09-27 03:59 UTC37
    dir
6f5b84fad3efatagen2026-09-27 03:59 UTC38
}
6f5b84fad3efatagen2026-09-27 03:59 UTC39
6f5b84fad3efatagen2026-09-27 03:59 UTC40
pub fn runtime_dir() -> PathBuf {
6f5b84fad3efatagen2026-09-27 03:59 UTC41
    if let Some(dir) = env::var_os("ROUNDABOUT_RUNTIME_DIR") {
6f5b84fad3efatagen2026-09-27 03:59 UTC42
        let dir = PathBuf::from(dir);
6f5b84fad3efatagen2026-09-27 03:59 UTC43
        let _ = fs::DirBuilder::new()
6f5b84fad3efatagen2026-09-27 03:59 UTC44
            .recursive(true)
6f5b84fad3efatagen2026-09-27 03:59 UTC45
            .mode(0o700)
6f5b84fad3efatagen2026-09-27 03:59 UTC46
            .create(&dir);
6f5b84fad3efatagen2026-09-27 03:59 UTC47
        return dir;
6f5b84fad3efatagen2026-09-27 03:59 UTC48
    }
6f5b84fad3efatagen2026-09-27 03:59 UTC49
    if let Some(dir) = env::var_os("XDG_RUNTIME_DIR").map(PathBuf::from)
6f5b84fad3efatagen2026-09-27 03:59 UTC50
        && dir.is_absolute()
6f5b84fad3efatagen2026-09-27 03:59 UTC51
        && dir.is_dir()
6f5b84fad3efatagen2026-09-27 03:59 UTC52
    {
6f5b84fad3efatagen2026-09-27 03:59 UTC53
        return dir;
6f5b84fad3efatagen2026-09-27 03:59 UTC54
    }
6f5b84fad3efatagen2026-09-27 03:59 UTC55
    let uid = unsafe { libc::getuid() };
6f5b84fad3efatagen2026-09-27 03:59 UTC56
    let dir = env::temp_dir().join(format!("roundabout-{uid}"));
6f5b84fad3efatagen2026-09-27 03:59 UTC57
    let _ = fs::DirBuilder::new().mode(0o700).create(&dir);
6f5b84fad3efatagen2026-09-27 03:59 UTC58
    let _ = fs::set_permissions(&dir, fs::Permissions::from_mode(0o700));
6f5b84fad3efatagen2026-09-27 03:59 UTC59
    dir
6f5b84fad3efatagen2026-09-27 03:59 UTC60
}
6f5b84fad3efatagen2026-09-27 03:59 UTC61
6f5b84fad3efatagen2026-09-27 03:59 UTC62
pub fn socket() -> PathBuf {
6f5b84fad3efatagen2026-09-27 03:59 UTC63
    runtime_dir().join("roundabout.sock")
6f5b84fad3efatagen2026-09-27 03:59 UTC64
}
6f5b84fad3efatagen2026-09-27 03:59 UTC65
6f5b84fad3efatagen2026-09-27 03:59 UTC66
pub fn spawn_lock() -> PathBuf {
6f5b84fad3efatagen2026-09-27 03:59 UTC67
    runtime_dir().join("roundabout.lock")
6f5b84fad3efatagen2026-09-27 03:59 UTC68
}
6f5b84fad3efatagen2026-09-27 03:59 UTC69
6f5b84fad3efatagen2026-09-27 03:59 UTC70
pub fn project_root(cwd: &Path) -> PathBuf {
6f5b84fad3efatagen2026-09-27 03:59 UTC71
    const MARKERS: [&str; 6] = [
6f5b84fad3efatagen2026-09-27 03:59 UTC72
        ".jj",
6f5b84fad3efatagen2026-09-27 03:59 UTC73
        ".git",
6f5b84fad3efatagen2026-09-27 03:59 UTC74
        ".hg",
6f5b84fad3efatagen2026-09-27 03:59 UTC75
        "flake.nix",
6f5b84fad3efatagen2026-09-27 03:59 UTC76
        "Cargo.toml",
6f5b84fad3efatagen2026-09-27 03:59 UTC77
        "package.json",
6f5b84fad3efatagen2026-09-27 03:59 UTC78
    ];
6f5b84fad3efatagen2026-09-27 03:59 UTC79
    let mut best = None;
6f5b84fad3efatagen2026-09-27 03:59 UTC80
    for dir in cwd.ancestors() {
6f5b84fad3efatagen2026-09-27 03:59 UTC81
        if dir.join(".jj").exists() || dir.join(".git").exists() || dir.join(".hg").exists() {
6f5b84fad3efatagen2026-09-27 03:59 UTC82
            return dir.to_path_buf();
6f5b84fad3efatagen2026-09-27 03:59 UTC83
        }
6f5b84fad3efatagen2026-09-27 03:59 UTC84
        if best.is_none() && MARKERS.iter().any(|m| dir.join(m).exists()) {
6f5b84fad3efatagen2026-09-27 03:59 UTC85
            best = Some(dir.to_path_buf());
6f5b84fad3efatagen2026-09-27 03:59 UTC86
        }
6f5b84fad3efatagen2026-09-27 03:59 UTC87
    }
6f5b84fad3efatagen2026-09-27 03:59 UTC88
    best.unwrap_or_else(|| cwd.to_path_buf())
6f5b84fad3efatagen2026-09-27 03:59 UTC89
}