#[allow(dead_code)]
mod common;
use common::Sandbox;
use std::fs;
use std::process::Command;
fn run(cmd: &[&str], cwd: &std::path::Path) -> std::process::Output {
Command::new(cmd[0])
.args(&cmd[1..])
.current_dir(cwd)
.output()
.expect("spawn")
}
#[test]
fn req_0117_hooks_install_lands_shared_dir_in_worktree() {
if run(
&["git", "--version"],
std::env::current_dir().unwrap().as_path(),
)
.status
.code()
!= Some(0)
{
eprintln!("git not on PATH, skipping");
return;
}
let s = Sandbox::new();
let main = s.dir.path().join("main");
let wt = s.dir.path().join("wt");
fs::create_dir_all(&main).unwrap();
let out = run(&["git", "init", "-q"], &main);
assert!(out.status.success(), "git init");
let _ = run(&["git", "config", "user.email", "t@e"], &main);
let _ = run(&["git", "config", "user.name", "t"], &main);
let _ = run(&["git", "config", "commit.gpgsign", "false"], &main);
fs::write(main.join("README.md"), "seed\n").unwrap();
let _ = run(&["git", "add", "-A"], &main);
let out = run(&["git", "commit", "-q", "-m", "seed"], &main);
assert!(out.status.success(), "seed commit");
let out = run(
&["git", "worktree", "add", "-q", wt.to_str().unwrap()],
&main,
);
assert!(
out.status.success(),
"worktree add: {}",
String::from_utf8_lossy(&out.stderr)
);
let req_out = Command::new(env!("CARGO_BIN_EXE_req"))
.args([
"hooks",
"install",
"--repo",
wt.to_str().unwrap(),
"--force",
])
.output()
.expect("invoke req");
assert!(
req_out.status.success(),
"req hooks install in worktree: {}",
String::from_utf8_lossy(&req_out.stderr)
);
let shared_hook = main.join(".git/hooks/pre-commit");
assert!(
shared_hook.exists(),
"shared hooks/pre-commit not written at {}",
shared_hook.display()
);
let per_wt = s.dir.path().join("main/.git/worktrees/wt/hooks/pre-commit");
assert!(
!per_wt.exists(),
"per-worktree pre-commit should not exist: {}",
per_wt.display()
);
}
#[test]
fn req_0123_doctor_finds_shared_hook_from_inside_worktree() {
if run(
&["git", "--version"],
std::env::current_dir().unwrap().as_path(),
)
.status
.code()
!= Some(0)
{
eprintln!("git not on PATH, skipping");
return;
}
let s = Sandbox::new();
let main = s.dir.path().join("main");
let wt = s.dir.path().join("wt");
fs::create_dir_all(&main).unwrap();
assert!(run(&["git", "init", "-q"], &main).status.success());
let _ = run(&["git", "config", "user.email", "t@e"], &main);
let _ = run(&["git", "config", "user.name", "t"], &main);
let _ = run(&["git", "config", "commit.gpgsign", "false"], &main);
fs::write(main.join("README.md"), "seed\n").unwrap();
let _ = run(&["git", "add", "-A"], &main);
assert!(run(&["git", "commit", "-q", "-m", "seed"], &main)
.status
.success());
assert!(run(
&["git", "worktree", "add", "-q", wt.to_str().unwrap()],
&main,
)
.status
.success());
let install = Command::new(env!("CARGO_BIN_EXE_req"))
.args([
"hooks",
"install",
"--repo",
wt.to_str().unwrap(),
"--force",
])
.output()
.expect("invoke req");
assert!(
install.status.success(),
"install: {}",
String::from_utf8_lossy(&install.stderr)
);
let proj = wt.join("project.req");
let init = Command::new(env!("CARGO_BIN_EXE_req"))
.current_dir(&wt)
.args(["init", "-n", "wt", "-o", proj.to_str().unwrap()])
.output()
.expect("init");
assert!(
init.status.success(),
"init: {}",
String::from_utf8_lossy(&init.stderr)
);
let doctor = Command::new(env!("CARGO_BIN_EXE_req"))
.current_dir(&wt)
.arg("doctor")
.output()
.expect("doctor");
let stdout = String::from_utf8_lossy(&doctor.stdout);
let hook_line = stdout
.lines()
.find(|l| l.contains("pre-commit hook"))
.unwrap_or("(no pre-commit line)");
assert!(
!hook_line.contains("FAIL"),
"doctor inside worktree should find the shared hook, got: {}\nfull output:\n{}",
hook_line,
stdout
);
}