@@ -407,17 +407,32 @@ int cmd_diff(int argc, const char **argv, const char *prefix)
407
407
result = builtin_diff_index (& rev , argc , argv );
408
408
else if (ents == 2 )
409
409
result = builtin_diff_tree (& rev , argc , argv , ent );
410
- else if ((ents == 3 ) && (ent [0 ].item -> flags & UNINTERESTING )) {
411
- /* diff A...B where there is one sane merge base between
412
- * A and B. We have ent[0] == merge-base, ent[1] == A,
413
- * and ent[2] == B. Show diff between the base and B.
410
+ else if (ent [0 ].item -> flags & UNINTERESTING ) {
411
+ /*
412
+ * Perhaps the user gave us A...B, which expands
413
+ * to a list of negative merge bases followed by
414
+ * A (symmetric-left) and B? Let's make sure...
414
415
*/
415
- ent [1 ] = ent [2 ];
416
+ for (i = 1 ; i < ents ; i ++ )
417
+ if (!(ent [i ].item -> flags & UNINTERESTING ))
418
+ break ;
419
+ if (ents != i + 2 ||
420
+ (ent [i + 1 ].item -> flags & UNINTERESTING ) ||
421
+ (!(ent [i ].item -> flags & SYMMETRIC_LEFT )) ||
422
+ (ent [i + 1 ].item -> flags & SYMMETRIC_LEFT ))
423
+ die ("what do you mean by that?" );
424
+ /*
425
+ * diff A...B where there is at least one merge base
426
+ * between A and B. We have ent[0] == merge-base,
427
+ * ent[ents-2] == A, and ent[ents-1] == B. Show diff
428
+ * between the base and B. Note that we pick one
429
+ * merge base at random if there are more than one.
430
+ */
431
+ ent [1 ] = ent [ents - 1 ];
416
432
result = builtin_diff_tree (& rev , argc , argv , ent );
417
- }
418
- else
433
+ } else
419
434
result = builtin_diff_combined (& rev , argc , argv ,
420
- ent , ents );
435
+ ent , ents );
421
436
result = diff_result_code (& rev .diffopt , result );
422
437
if (1 < rev .diffopt .skip_stat_unmatch )
423
438
refresh_index_quietly ();
0 commit comments