Skip to content

Commit

Permalink
diff A...B: give one possible diff when there are more than one merge…
Browse files Browse the repository at this point in the history
…-base

We instead showed a combined diff that explains one of the randomly
chosen merge-base as if it were the result of merging all the other
merge bases and two tips given, which made no sense at all.

An alternative is to simply fail such a request, telling the user that
there are criss-cross merges, but it wouldn't be so helpful.

Noticed by James Pickens.

Signed-off-by: Junio C Hamano <[email protected]>
  • Loading branch information
gitster committed Jul 13, 2010
1 parent 2998138 commit c008c0f
Showing 1 changed file with 23 additions and 8 deletions.
31 changes: 23 additions & 8 deletions builtin-diff.c
Original file line number Diff line number Diff line change
Expand Up @@ -405,17 +405,32 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
result = builtin_diff_index(&rev, argc, argv);
else if (ents == 2)
result = builtin_diff_tree(&rev, argc, argv, ent);
else if ((ents == 3) && (ent[0].item->flags & UNINTERESTING)) {
/* diff A...B where there is one sane merge base between
* A and B. We have ent[0] == merge-base, ent[1] == A,
* and ent[2] == B. Show diff between the base and B.
else if (ent[0].item->flags & UNINTERESTING) {
/*
* Perhaps the user gave us A...B, which expands
* to a list of negative merge bases followed by
* A (symmetric-left) and B? Let's make sure...
*/
ent[1] = ent[2];
for (i = 1; i < ents; i++)
if (!(ent[i].item->flags & UNINTERESTING))
break;
if (ents != i + 2 ||
(ent[i+1].item->flags & UNINTERESTING) ||
(!(ent[i].item->flags & SYMMETRIC_LEFT)) ||
(ent[i+1].item->flags & SYMMETRIC_LEFT))
die("what do you mean by that?");
/*
* diff A...B where there is at least one merge base
* between A and B. We have ent[0] == merge-base,
* ent[ents-2] == A, and ent[ents-1] == B. Show diff
* between the base and B. Note that we pick one
* merge base at random if there are more than one.
*/
ent[1] = ent[ents-1];
result = builtin_diff_tree(&rev, argc, argv, ent);
}
else
} else
result = builtin_diff_combined(&rev, argc, argv,
ent, ents);
ent, ents);
result = diff_result_code(&rev.diffopt, result);
if (1 < rev.diffopt.skip_stat_unmatch)
refresh_index_quietly();
Expand Down

0 comments on commit c008c0f

Please sign in to comment.