revision: fix --left/right-only use with unrelated histories

This is a similar fix as 023756f4eb (revision walker: --cherry-pick is a
limited operation), but for the --left-only and --right-only options.

When computing a symmetric difference between two unrelated histories,
no suitable merge base exists, and so no boundary commit is flagged as
UNINTERESTING.  Previously, we relied on the presence of such boundary
to trigger limiting and thus consideration of either "revs->left_only"
or "revs->right_only".

A number of other entries in the option parser have started including
overrides for "revs->limited = 1".  Do the same for these options.

Signed-off-by: Matt Hunter <m@lfurio.us>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Matt Hunter 2025-03-30 07:24:06 -04:00 committed by Junio C Hamano
parent 683c54c999
commit e7ef4be7c2
2 changed files with 17 additions and 0 deletions

View File

@ -2488,10 +2488,12 @@ static int handle_revision_opt(struct rev_info *revs, int argc, const char **arg
die(_("options '%s' and '%s' cannot be used together"),
"--left-only", "--right-only/--cherry");
revs->left_only = 1;
revs->limited = 1;
} else if (!strcmp(arg, "--right-only")) {
if (revs->left_only)
die(_("options '%s' and '%s' cannot be used together"), "--right-only", "--left-only");
revs->right_only = 1;
revs->limited = 1;
} else if (!strcmp(arg, "--cherry")) {
if (revs->left_only)
die(_("options '%s' and '%s' cannot be used together"), "--cherry", "--left-only");

View File

@ -182,4 +182,19 @@ test_expect_success 'rev-list --unpacked' '
test_cmp expect actual
'

test_expect_success 'rev-list one-sided unrelated symmetric diff' '
test_tick &&
git commit --allow-empty -m xyz &&
git branch cmp &&
git rebase --force-rebase --root &&

git rev-list --left-only HEAD...cmp >head &&
git rev-list --right-only HEAD...cmp >cmp &&

sort head >head.sorted &&
sort cmp >cmp.sorted &&
comm -12 head.sorted cmp.sorted >actual &&
test_line_count = 0 actual
'

test_done