Merge branch 'jc/diff-no-index-in-subdir'

"git diff --no-index" run inside a subdirectory under control of a
Git repository operated at the top of the working tree and stripped
the prefix from the output, and oddballs like "-" (stdin) did not
work correctly because of it.  Correct the set-up by undoing what
the set-up sequence did to cwd and prefix.

* jc/diff-no-index-in-subdir:
  diff: --no-index should ignore the worktree
main
Junio C Hamano 2025-08-22 13:13:20 -07:00
commit 72e4eb56f0
2 changed files with 32 additions and 0 deletions

View File

@ -487,6 +487,21 @@ int cmd_diff(int argc,

init_diff_ui_defaults();
repo_config(the_repository, git_diff_ui_config, NULL);

/*
* If we are ignoring the fact that our current directory may
* be part of a working tree controlled by a Git repository to
* pretend to be a "better GNU diff", we should undo the
* effect of the setup code that did a chdir() to the top of
* the working tree. Where we came from is recorded in the
* prefix.
*/
if (no_index && prefix) {
if (chdir(prefix))
die(_("cannot come back to cwd"));
prefix = NULL;
}

prefix = precompose_argv_prefix(argc, argv, prefix);

repo_init_revisions(the_repository, &rev, prefix);

View File

@ -26,6 +26,23 @@ test_expect_success 'git diff --no-index directories' '
test_line_count = 14 cnt
'

test_expect_success 'git diff --no-index with -' '
cat >expect <<-\EOF &&
diff --git a/- b/-
new file mode 100644
--- /dev/null
+++ b/-
@@ -0,0 +1 @@
+frotz
EOF
(
cd a &&
echo frotz |
test_expect_code 1 git diff --no-index /dev/null - >../actual
) &&
test_cmp expect actual
'

test_expect_success 'git diff --no-index relative path outside repo' '
(
cd repo &&