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.no_commit_id = 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.tree_in_recursive = lm->show_trees;


View File

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

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

/* find set of paths that everybody touches
*

7
diff.h
View File

@ -127,6 +127,13 @@ struct diff_flags {
unsigned 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. */
unsigned binary;
unsigned text;

View File

@ -128,6 +128,22 @@ test_expect_success 'only last-modified files in the current tree' '
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' '
git checkout HEAD^0 &&
git rm -rf . &&