Skip to content

Commit 8da1481

Browse files
committed
Merge branch 'jc/show-pathspec-fix' into maint
"git show <commit1> <commit2>... -- <pathspec>" lost the pathspec when showing the second and subsequent commits, which has been corrected. source: <[email protected]> * jc/show-pathspec-fix: 2.36 show regression fix
2 parents ee12682 + 5cdb384 commit 8da1481

File tree

2 files changed

+37
-5
lines changed

2 files changed

+37
-5
lines changed

builtin/log.c

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ static void finish_early_output(struct rev_info *rev)
417417
show_early_header(rev, "done", n);
418418
}
419419

420-
static int cmd_log_walk(struct rev_info *rev)
420+
static int cmd_log_walk_no_free(struct rev_info *rev)
421421
{
422422
struct commit *commit;
423423
int saved_nrl = 0;
@@ -444,7 +444,6 @@ static int cmd_log_walk(struct rev_info *rev)
444444
* and HAS_CHANGES being accumulated in rev->diffopt, so be careful to
445445
* retain that state information if replacing rev->diffopt in this loop
446446
*/
447-
rev->diffopt.no_free = 1;
448447
while ((commit = get_revision(rev)) != NULL) {
449448
if (!log_tree_commit(rev, commit) && rev->max_count >= 0)
450449
/*
@@ -469,8 +468,6 @@ static int cmd_log_walk(struct rev_info *rev)
469468
}
470469
rev->diffopt.degraded_cc_to_c = saved_dcctc;
471470
rev->diffopt.needed_rename_limit = saved_nrl;
472-
rev->diffopt.no_free = 0;
473-
diff_free(&rev->diffopt);
474471

475472
if (rev->remerge_diff) {
476473
tmp_objdir_destroy(rev->remerge_objdir);
@@ -484,6 +481,17 @@ static int cmd_log_walk(struct rev_info *rev)
484481
return diff_result_code(&rev->diffopt, 0);
485482
}
486483

484+
static int cmd_log_walk(struct rev_info *rev)
485+
{
486+
int retval;
487+
488+
rev->diffopt.no_free = 1;
489+
retval = cmd_log_walk_no_free(rev);
490+
rev->diffopt.no_free = 0;
491+
diff_free(&rev->diffopt);
492+
return retval;
493+
}
494+
487495
static int git_log_config(const char *var, const char *value, void *cb)
488496
{
489497
const char *slot_name;
@@ -680,6 +688,7 @@ int cmd_show(int argc, const char **argv, const char *prefix)
680688

681689
count = rev.pending.nr;
682690
objects = rev.pending.objects;
691+
rev.diffopt.no_free = 1;
683692
for (i = 0; i < count && !ret; i++) {
684693
struct object *o = objects[i].item;
685694
const char *name = objects[i].name;
@@ -725,12 +734,16 @@ int cmd_show(int argc, const char **argv, const char *prefix)
725734
rev.pending.nr = rev.pending.alloc = 0;
726735
rev.pending.objects = NULL;
727736
add_object_array(o, name, &rev.pending);
728-
ret = cmd_log_walk(&rev);
737+
ret = cmd_log_walk_no_free(&rev);
729738
break;
730739
default:
731740
ret = error(_("unknown type: %d"), o->type);
732741
}
733742
}
743+
744+
rev.diffopt.no_free = 0;
745+
diff_free(&rev.diffopt);
746+
734747
free(objects);
735748
return ret;
736749
}

t/t4013-diff-various.sh

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -556,6 +556,25 @@ test_expect_success 'diff-tree --stdin with pathspec' '
556556
test_cmp expect actual
557557
'
558558

559+
test_expect_success 'show A B ... -- <pathspec>' '
560+
# side touches dir/sub, file0, and file3
561+
# master^ touches dir/sub, and file1
562+
# master^^ touches dir/sub, file0, and file2
563+
git show --name-only --format="<%s>" side master^ master^^ -- dir >actual &&
564+
cat >expect <<-\EOF &&
565+
<Side>
566+
567+
dir/sub
568+
<Third>
569+
570+
dir/sub
571+
<Second>
572+
573+
dir/sub
574+
EOF
575+
test_cmp expect actual
576+
'
577+
559578
test_expect_success 'diff -I<regex>: setup' '
560579
git checkout master &&
561580
test_seq 50 >file0 &&

0 commit comments

Comments
 (0)