diff --git a/context/test-evidence/tui.md b/context/test-evidence/tui.md index b3a6efab..43292938 100644 --- a/context/test-evidence/tui.md +++ b/context/test-evidence/tui.md @@ -582,6 +582,34 @@ Rivals, each run against the fixed file: - Drop `core.attributesFile=/dev/null`: red, `fails under a default git/attributes`. +### a_scratch_repo_ignores_the_users_template_dir + +improvise-pr3i, found reviewing PR #255 at `56ac72a2`. This is a third path to the +53zz symptom. `git init` copies a template directory into the new `.git`, and +`GIT_TEMPLATE_DIR` names one. The variable is not in +`git rev-parse --local-env-vars`, so `git(root)` does not remove it. It also +bypasses config, so `GIT_CONFIG_GLOBAL=/dev/null` (which nulls +`init.templateDir`) does not reach it either. A template whose `info/exclude` +holds `*.gz` therefore became the scratch repository's own exclude file, and +`git add` refused the gzipped document. + +The test points `GIT_TEMPLATE_DIR` at such a template and re-runs +`a_gzipped_document_is_walked` in a child. Red at `56ac72a2`, failing at `git add` +with `Use -f if you really want to add them`. That line appears in the failure +message only because this PR also makes `rerun_with_env`'s callers print the +child's **stderr** (`told`). The child's panic goes to stderr, and before this +change the message printed an empty stdout. + +The fix is `git init -q --template=`. An empty template directory copies nothing, +whatever the environment, config or compiled-in default says. The obvious +alternative, `env_remove("GIT_TEMPLATE_DIR")`, passes this test equally well, so +the choice between them is made by argument, not by the test. Removing the +variable still lets git copy its compiled-in default template, which a +distribution may have edited. `--template=` closes that too, for the same reason +the `-c` arguments in `run_git` beat relying on the absence of a config file. + +Rival: drop `--template=`. Red, as above. + --- ## `tests/web_demo_model.rs` diff --git a/tests/shipped_documents_load.rs b/tests/shipped_documents_load.rs index f226f1f0..01142d7a 100644 --- a/tests/shipped_documents_load.rs +++ b/tests/shipped_documents_load.rs @@ -66,7 +66,7 @@ fn git(root: &Path) -> std::process::Command { /// A scratch repository, so each way of shipping a document is set up for real. fn scratch_repo() -> tempfile::TempDir { let dir = tempfile::tempdir().expect("a temp dir"); - run_git(dir.path(), &["init", "-q"]); + run_git(dir.path(), &["init", "-q", "--template="]); dir } @@ -165,11 +165,36 @@ fn rerun_with_env(test: &str, env: &[(&str, &Path)]) -> std::process::Output { let stdout = String::from_utf8_lossy(&out.stdout); assert!( stdout.contains("running 1 test"), - "{test} did not run: {stdout}" + "{test} did not run: {}", + told(&out) ); out } +/// Everything a child test said, both streams: its panic lands on stderr. +fn told(out: &std::process::Output) -> String { + let stdout = String::from_utf8_lossy(&out.stdout); + let stderr = String::from_utf8_lossy(&out.stderr); + format!("\n--- stdout\n{stdout}\n--- stderr\n{stderr}") +} + +/// improvise-pr3i: `git init` copies `GIT_TEMPLATE_DIR`, which no config null +/// reaches. Evidence: `context/test-evidence/tui.md`. +#[test] +fn a_scratch_repo_ignores_the_users_template_dir() { + let templates = tempfile::tempdir().expect("a temp dir"); + write(templates.path(), "info/exclude", "*.gz\n"); + let out = rerun_with_env( + "a_gzipped_document_is_walked", + &[("GIT_TEMPLATE_DIR", templates.path())], + ); + assert!( + out.status.success(), + "the gzip shape test fails under a template info/exclude: {}", + told(&out) + ); +} + /// improvise-53zz: a hook in a linked worktree exports `GIT_DIR`, which beats /// `-C`. Evidence: `context/test-evidence/tui.md`. #[test] @@ -186,7 +211,7 @@ fn a_scratch_repo_ignores_an_inherited_git_dir() { assert!( out.status.success(), "the shape test fails under an inherited GIT_DIR: {}", - String::from_utf8_lossy(&out.stdout) + told(&out) ); let staged = git(outer.path()) .args(["ls-files"]) @@ -214,7 +239,7 @@ fn a_scratch_repo_ignores_the_users_global_and_system_excludes() { assert!( out.status.success(), "the gzip shape test fails under a `*.gz` exclude in {scope}: {}", - String::from_utf8_lossy(&out.stdout) + told(&out) ); } } @@ -237,7 +262,7 @@ fn a_scratch_repo_ignores_the_users_default_ignore_and_attributes_files() { assert!( out.status.success(), "the gzip shape test fails under a default git/{name}: {}", - String::from_utf8_lossy(&out.stdout) + told(&out) ); } }