bisect.pl now reports a meaningful error for certain "can't start" scenarios.
authorNicholas Clark <nick@ccl4.org>
Fri, 17 Feb 2012 17:36:55 +0000 (18:36 +0100)
committerNicholas Clark <nick@ccl4.org>
Fri, 17 Feb 2012 20:03:39 +0000 (21:03 +0100)
If --end is specified but not --start, then don't probe for start revisions
that are more recent than the --end. Previously bisect.pl would test all
stable revisions for a start point, and if it happened to find a (seemingly)
valid start point, it would continue on to run git bisect, which would fail
with the error:

    Some good revs are not ancestor of the bad rev.
    git bisect cannot work properly in this case.
    Maybe you mistake good and bad revs?

which doesn't make clear what the problem actually is. Now the error is:

    Can't find a suitable start revision to default to.
    Tried perl-5.002 perl-5.003 perl-5.004 perl-5.005 perl-5.6.0 at ...

Porting/bisect.pl

index 1a51405..da19721 100755 (executable)
@@ -121,15 +121,24 @@ if (defined $start) {
     die "Runner returned $ret, not 0 for start revision" if $ret;
 } else {
     # Try to find the earliest version for which the test works
+    my @tried;
     foreach my $try (@stable) {
+        if (`git rev-list -n1 $end ^$try^` eq "") {
+            print "Skipping $try, as it is more recent than end commit "
+                . (substr $end, 0, 16) . "\n";
+            # As @stable is supposed to be in age order, arguably we should
+            # last; here.
+            next;
+        }
         system "git checkout $try" and die;
         my $ret = system $^X, $runner, @ARGV;
         if (!$ret) {
             $start = $try;
             last;
         }
+        push @tried, $try;
     }
-    die "Can't find a suitable start revision to default to. Tried @stable"
+    die "Can't find a suitable start revision to default to.\nTried @tried"
         unless defined $start;
 }