Junio C Hamano [off-list ref] 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