This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Add a --validate option to bisect.pl to verify that stable releases build.
authorNicholas Clark <nick@ccl4.org>
Tue, 1 Nov 2011 11:44:57 +0000 (12:44 +0100)
committerNicholas Clark <nick@ccl4.org>
Tue, 1 Nov 2011 21:11:49 +0000 (22:11 +0100)
This is useful for validating a new OS/CPU/compiler combination, and for
checking that refactoring bisect-runner.pl hasn't broken any that previously
worked.

Porting/bisect-runner.pl
Porting/bisect.pl

index 4af93dc..835688b 100755 (executable)
@@ -375,6 +375,17 @@ Passing this to F<bisect.pl> will likely cause the bisect to fail badly.
 
 =item *
 
+--validate
+
+Test that all stable revisions can be built. Attempts to build I<blead>,
+I<v5.14.0> .. I<perl-5.002>. Stops at the first failure, without cleaning
+the checkout. Ignores I<--start> and I<--end>. Useful for validating a new
+OS/CPU/compiler combination. For example
+
+    ../perl/Porting/bisect.pl --validate -e'print "Hello from $]\n"'
+
+=item *
+
 --check-args
 
 Validate the options and arguments, and exit silently if they are valid.
index 292a3ef..8a6b5df 100755 (executable)
@@ -7,9 +7,10 @@ my $start_time = time;
 # Which isn't what we want.
 use Getopt::Long qw(:config pass_through no_auto_abbrev);
 
-my ($start, $end);
+my ($start, $end, $validate);
 unshift @ARGV, '--help' unless GetOptions('start=s' => \$start,
-                                          'end=s' => \$end);
+                                          'end=s' => \$end,
+                                          validate => \$validate);
 
 my $runner = $0;
 $runner =~ s/bisect\.pl/bisect-runner.pl/;
@@ -46,6 +47,21 @@ my $modified = () = `git ls-files --modified --deleted --others`;
 die "This checkout is not clean - $modified modified or untracked file(s)"
     if $modified;
 
+sub validate {
+    my $commit = shift;
+    print "Testing $commit...\n";
+    system "git checkout $commit </dev/null" and die;
+    my $ret = system $^X, $runner, '--no-clean', @ARGV;
+    die "Runner returned $ret, not 0 for revision $commit" if $ret;
+    system 'git clean -dxf </dev/null' and die;
+    system 'git reset --hard HEAD </dev/null' and die;
+}
+
+if ($validate) {
+    validate $_ foreach 'blead', reverse @stable;
+    exit 0;
+}
+
 my $git_version = `git --version`;
 if (defined $git_version
     && $git_version =~ /\Agit version (\d+\.\d+\.\d+)(.*)/) {