#[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()
);
}