summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicholas Clark <nick@ccl4.org>2011-10-27 16:55:53 +0200
committerNicholas Clark <nick@ccl4.org>2011-10-27 16:55:53 +0200
commitc382b335bf126c689844d41284086e1d504caa1b (patch)
tree5557c5eda39035bb66cbd80d1ee0abca9ecccb04
parentcf5fabc183c682cd923bc49081f41c51c187ff9d (diff)
downloadperl-c382b335bf126c689844d41284086e1d504caa1b.tar.gz
Minor usability improvements to bisect.pl
* 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.
-rwxr-xr-xPorting/bisect.pl34
1 files changed, 26 insertions, 8 deletions
diff --git a/Porting/bisect.pl b/Porting/bisect.pl
index 98cd127f34..292a3ef50d 100755
--- a/Porting/bisect.pl
+++ b/Porting/bisect.pl
@@ -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;