Junio C Hamano <gitster@xxxxxxxxx> writes: > I prepared a patch to reject such a request when there are more than one > merge base (see below---it is against 1.6.4 maintenance track). While I > think giving _one_ possible explanation of what you did since you forked > would be better than rejecting, which I'll try in a separate message, but > at the same time it may be misleading to give such an output without > telling the user that we chose one merge base at random to diff against > it. And this is the other one (not relative to the previous patch) that shows diff since one randomly chosen merge base. builtin-diff.c | 26 +++++++++++++++++++++----- 1 files changed, 21 insertions(+), 5 deletions(-) diff --git a/builtin-diff.c b/builtin-diff.c index 2e51f40..1f44f5b 100644 --- a/builtin-diff.c +++ b/builtin-diff.c @@ -405,12 +405,28 @@ 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 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html