Merge branch 'tc/last-modified-recursive-fix'

"git last-modified" operating in non-recursive mode used to trigger
a BUG(), which has been corrected.

* tc/last-modified-recursive-fix:
  last-modified: fix bug when some paths remain unhandled
main
Junio C Hamano 2025-09-29 11:40:35 -07:00
commit d5518d52b2
4 changed files with 26 additions and 1 deletions

View File

@ -265,6 +265,7 @@ static int last_modified_init(struct last_modified *lm, struct repository *r,
lm->rev.boundary = 1; lm->rev.boundary = 1;
lm->rev.no_commit_id = 1; lm->rev.no_commit_id = 1;
lm->rev.diff = 1; lm->rev.diff = 1;
lm->rev.diffopt.flags.no_recursive_diff_tree_combined = 1;
lm->rev.diffopt.flags.recursive = lm->recursive; lm->rev.diffopt.flags.recursive = lm->recursive;
lm->rev.diffopt.flags.tree_in_recursive = lm->show_trees; lm->rev.diffopt.flags.tree_in_recursive = lm->show_trees;



View File

@ -1515,8 +1515,9 @@ void diff_tree_combined(const struct object_id *oid,


diffopts = *opt; diffopts = *opt;
copy_pathspec(&diffopts.pathspec, &opt->pathspec); copy_pathspec(&diffopts.pathspec, &opt->pathspec);
diffopts.flags.recursive = 1;
diffopts.flags.allow_external = 0; diffopts.flags.allow_external = 0;
if (!opt->flags.no_recursive_diff_tree_combined)
diffopts.flags.recursive = 1;


/* find set of paths that everybody touches /* find set of paths that everybody touches
* *

7
diff.h
View File

@ -127,6 +127,13 @@ struct diff_flags {
unsigned recursive; unsigned recursive;
unsigned tree_in_recursive; unsigned tree_in_recursive;


/*
* Historically diff_tree_combined() overrides recursive to 1. To
* suppress this behavior, set the flag below.
* It has no effect if recursive is already set to 1.
*/
unsigned no_recursive_diff_tree_combined;

/* Affects the way how a file that is seemingly binary is treated. */ /* Affects the way how a file that is seemingly binary is treated. */
unsigned binary; unsigned binary;
unsigned text; unsigned text;

View File

@ -128,6 +128,22 @@ test_expect_success 'only last-modified files in the current tree' '
EOF EOF
' '


test_expect_success 'last-modified with subdir and criss-cross merge' '
git checkout -b branch-k1 1 &&
mkdir -p a k &&
test_commit k1 a/file2 &&
git checkout -b branch-k2 &&
test_commit k2 k/file2 &&
git checkout branch-k1 &&
test_merge km2 branch-k2 &&
test_merge km3 3 &&
check_last_modified <<-\EOF
km3 a
k2 k
1 file
EOF
'

test_expect_success 'cross merge boundaries in blaming' ' test_expect_success 'cross merge boundaries in blaming' '
git checkout HEAD^0 && git checkout HEAD^0 &&
git rm -rf . && git rm -rf . &&