git-claw 0.5.0

Deterministic git worktree orchestration engine for developers and AI agents
Documentation
use git_claw::core::config::EnvironmentConfig;
use git_claw::infra::env_file::write_env_worktree;
use std::collections::BTreeMap;
use std::fs;
use tempfile::tempdir;

#[test]
fn test_write_env_worktree_all_variables() {
    let dir = tempdir().expect("tempdir");
    let worktree_path = dir.path().join("worktree-auth");
    fs::create_dir_all(&worktree_path).expect("creates dir");

    let mut ports = BTreeMap::new();
    ports.insert("PORT_WEB".to_string(), 3002);
    ports.insert("PORT_API".to_string(), 8002);

    write_env_worktree(&worktree_path, "my-repo", "auth-v1", 2, &ports, None)
        .expect("writes env worktree");

    let env_file = worktree_path.join(".env.worktree");
    assert!(env_file.exists());

    let content = fs::read_to_string(&env_file).expect("reads env file");
    assert!(content.contains("CLAW_SLOT_ID=2"));
    assert!(content.contains("CLAW_WORKTREE_NAME=auth-v1"));
    assert!(content.contains(&format!("CLAW_WORKTREE_PATH={}", worktree_path.display())));
    assert!(content.contains("COMPOSE_PROJECT_NAME=my_repo_auth_v1_2"));
    assert!(content.contains("PORT_WEB=3002"));
    assert!(content.contains("PORT_API=8002"));
}

#[test]
fn test_write_env_worktree_pyenv_version() {
    let dir = tempdir().expect("tempdir");
    let worktree_path = dir.path().join("worktree-pyenv");
    fs::create_dir_all(&worktree_path).expect("creates dir");

    let env_config = EnvironmentConfig {
        r#type: Some("pyenv".to_string()),
        name: Some("tune".to_string()),
        copy_files: vec![".python-version".to_string()],
    };

    write_env_worktree(
        &worktree_path,
        "my-repo",
        "pyenv-wt",
        1,
        &BTreeMap::new(),
        Some(&env_config),
    )
    .expect("writes env worktree");

    let env_file = worktree_path.join(".env.worktree");
    let content = fs::read_to_string(&env_file).expect("reads env file");
    assert!(content.contains("PYENV_VERSION=tune"));
    assert!(!content.contains("VIRTUAL_ENV="));
}

#[test]
fn test_write_env_worktree_venv_present() {
    let dir = tempdir().expect("tempdir");
    let worktree_path = dir.path().join("worktree-venv");
    fs::create_dir_all(worktree_path.join(".venv")).expect("creates venv dir");

    write_env_worktree(
        &worktree_path,
        "my-repo",
        "venv-wt",
        3,
        &BTreeMap::new(),
        None,
    )
    .expect("writes env worktree");

    let env_file = worktree_path.join(".env.worktree");
    let content = fs::read_to_string(&env_file).expect("reads env file");
    let venv_path = worktree_path.join(".venv");
    assert!(content.contains(&format!("VIRTUAL_ENV={}", venv_path.display())));
    assert!(content.contains(&format!("PATH={}/bin:$PATH", venv_path.display())));
}