cargo-worktree 1.0.0

Deterministic build namespace layer for Cargo
use anyhow::{Context, Result};
use std::path::{Path, PathBuf};

/// Find nearest Cargo.toml by walking up directories
fn find_cargo_toml(start: &Path) -> Option<PathBuf> {
    let mut dir = start;

    loop {
        let candidate = dir.join("Cargo.toml");
        if candidate.exists() {
            return Some(candidate);
        }

        match dir.parent() {
            Some(parent) => dir = parent,
            None => return None,
        }
    }
}

pub fn workspace_root() -> Result<PathBuf> {
    let cwd = std::env::current_dir().context("cannot get current directory")?;

    if let Some(cargo_toml) = find_cargo_toml(&cwd) {
        return Ok(cargo_toml
            .parent()
            .expect("Cargo.toml must have a parent")
            .to_path_buf());
    }

    // Final error
    anyhow::bail!(
        "Failed to locate workspace root. \
         Please run `cargo worktree` inside a Cargo project."
    );
}