This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Minor usability improvements to bisect.pl
authorNicholas Clark <nick@ccl4.org>
Thu, 27 Oct 2011 14:55:53 +0000 (16:55 +0200)
committerNicholas Clark <nick@ccl4.org>
Thu, 27 Oct 2011 14:55:53 +0000 (16:55 +0200)
* Canonicalise the start and end commit-ish to actual commits before changing
  what is checked out. This allows one to use HEAD for either.
* For git 1.6.6 and later, use git bisect reset HEAD to avoid one change of
  what is checked out
* Sanity test the end revision before the start revision (or the search for a
  start revision), as one compile of the end revision is likely to be faster
  than the search (particularly if the search fails), hence on average any
  problems will be reported earlier.

Porting/bisect.pl

index 98cd127..292a3ef 100755 (executable)
@@ -30,20 +30,41 @@ system $^X, $runner, '--check-args', @ARGV and exit 255;
 my @stable = qw(perl-5.002 perl-5.003 perl-5.004 perl-5.005 perl-5.6.0
                 perl-5.8.0 v5.10.0 v5.12.0 v5.14.0);
 
-if ($start) {
-    system "git rev-parse $start >/dev/null" and die;
-}
 $end = 'blead' unless defined $end;
-system "git rev-parse $end >/dev/null" and die;
+
+# Canonicalising branches to revisions before moving the checkout permits one
+# to use revisions such as 'HEAD' for --start or --end
+foreach ($start, $end) {
+    next unless $_;
+    $_ = `git rev-parse $_`;
+    die unless defined $_;
+    chomp;
+}
 
 my $modified = () = `git ls-files --modified --deleted --others`;
 
 die "This checkout is not clean - $modified modified or untracked file(s)"
     if $modified;
 
-system "git bisect reset" and die;
+my $git_version = `git --version`;
+if (defined $git_version
+    && $git_version =~ /\Agit version (\d+\.\d+\.\d+)(.*)/) {
+    $git_version = eval "v$1";
+} else {
+    $git_version = v0.0.0;
+}
+
+if ($git_version ge v1.6.6) {
+    system "git bisect reset HEAD" and die;
+} else {
+    system "git bisect reset" and die;
+}
 
 # Sanity check the first and last revisions:
+system "git checkout $end" and die;
+my $ret = system $^X, $runner, @ARGV;
+die "Runner returned $ret for end revision" unless $ret;
+
 if (defined $start) {
     system "git checkout $start" and die;
     my $ret = system $^X, $runner, @ARGV;
@@ -61,9 +82,6 @@ if (defined $start) {
     die "Can't find a suitable start revision to default to. Tried @stable"
         unless defined $start;
 }
-system "git checkout $end" and die;
-my $ret = system $^X, $runner, @ARGV;
-die "Runner returned $ret for end revision" unless $ret;
 
 system "git bisect start" and die;
 system "git bisect good $start" and die;