This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Fold Abigail's TAP generation logic back into cmpVERSION.pl
authorNicholas Clark <nick@ccl4.org>
Thu, 19 May 2011 19:24:14 +0000 (20:24 +0100)
committerNicholas Clark <nick@ccl4.org>
Mon, 23 May 2011 14:07:27 +0000 (15:07 +0100)
Reduce t/porting/cmp_version.t down to an invocation of cmpVERSION.pl with
--tap.

Porting/cmpVERSION.pl
t/porting/cmp_version.t

index d5e4700..d95eb76 100755 (executable)
@@ -10,7 +10,7 @@
 # them)
 #
 # Original by slaven@rezic.de, modified by jhi and matt.w.johnson@gmail.com.
-#
+# Adaptation to produce TAP by Abigail, folded back into this file by Nicholas
 
 use strict;
 
@@ -19,12 +19,13 @@ use File::Compare;
 use File::Spec::Functions qw(devnull);
 use Getopt::Long;
 
-my ($diffs, $exclude_upstream, $tag_to_compare);
+my ($diffs, $exclude_upstream, $tag_to_compare, $tap);
 unless (GetOptions('diffs' => \$diffs,
                   'exclude|x' => \$exclude_upstream,
                   'tag=s' => \$tag_to_compare,
+                  'tap' => \$tap,
                   ) && @ARGV == 0) {
-    die "usage: $0 [ -d -x --tag TAG]";
+    die "usage: $0 [ -d -x --tag TAG --tap]";
 }
 
 die "$0: This does not look like a Perl directory\n"
@@ -44,8 +45,11 @@ unless (defined $tag_to_compare) {
 my $tag_exists = `git --no-pager tag -l $tag_to_compare 2>$null`;
 chomp $tag_exists;
 
-die "$0: '$tag_to_compare' is not a known Git tag\n"
-    unless $tag_exists eq $tag_to_compare;
+unless ($tag_exists eq $tag_to_compare) {
+    die "$0: '$tag_to_compare' is not a known Git tag\n" unless $tap;
+    print "1..0 # SKIP: '$tag_to_compare' is not a known Git tag\n";
+    exit 0;
+}
 
 my %upstream_files;
 if ($exclude_upstream) {
@@ -68,6 +72,19 @@ my %skip;
     'lib/Exporter/Heavy.pm',
     'win32/FindExt.pm',
 } = ();
+
+# Files to skip just for particular version(s),
+# usually due to some # mix-up
+
+my %skip_versions;
+if ($tap) {
+    %skip_versions
+       = (
+          # 'some/sample/file.pm' => [ '1.23', '1.24' ],
+          'dist/threads/lib/threads.pm' => [ '1.83' ],
+         );
+}
+
 my $skip_dirs = qr|^t/lib|;
 
 my @all_diffs = `git --no-pager diff --name-only $tag_to_compare`;
@@ -82,9 +99,20 @@ my @module_diffs = grep {
     !exists $upstream_files{$_}
 } @all_diffs;
 
-my (@output_files, @output_diffs);
+unless (@module_diffs) {
+    print "1..1\nok 1 - No difference found\n" if $tap;
+    exit;
+}
+
+printf "1..%d\n" => scalar @module_diffs if $tap;
+
+my $count;
+my $diff_cmd = "git --no-pager diff $tag_to_compare ";
+my (@diff);
 
-foreach my $pm_file (@module_diffs) {
+foreach my $pm_file (sort @module_diffs) {
+    # --tap does diff inline, --diff does it at the end.
+    @diff = () if $tap;
     (my $xs_file = $pm_file) =~ s/\.pm$/.xs/;
     my $pm_eq = compare_git_file($pm_file, $tag_to_compare);
     next unless defined $pm_eq;
@@ -100,9 +128,25 @@ foreach my $pm_file (@module_diffs) {
     next if ( ! defined $pm_version || ! defined $orig_pm_version );
     next if ( $pm_version eq 'undef' || $orig_pm_version eq 'undef' ); # sigh
     next if $pm_version ne $orig_pm_version;
-    push @output_files, $pm_file;
-    push @output_diffs, $pm_file unless $pm_eq;
-    push @output_diffs, $xs_file unless $xs_eq;
+    next if exists $skip_versions{$pm_file}
+        and grep $pm_version eq $_, @{$skip_versions{$pm_file}};
+    push @diff, $pm_file unless $pm_eq;
+    push @diff, $xs_file unless $xs_eq;
+}
+continue {
+    if (@diff) {
+       if ($tap) {
+           foreach (@diff) {
+               print "# $_" for `$diff_cmd '$_'`;
+           }
+           printf "not ok %d - %s\n", ++$count, $pm_file;
+       } else {
+           print "$pm_file\n";
+       }
+    }
+    elsif ($tap) {
+        printf "ok %d - %s\n", ++$count, $pm_file;
+    }
 }
 
 sub compare_git_file {
@@ -121,14 +165,9 @@ sub get_file_from_git {
     return $file_content;
 }
 
-for (sort @output_files) {
-    print "$_\n";
-}
-
-exit unless $diffs;
-
-for (sort @output_diffs) {
-    print "\n";
-    system "git --no-pager diff $tag_to_compare '$_'";
+if ($diffs) {
+    for (sort @diff) {
+       print "\n";
+       system "$diff_cmd '$_'";
+    }
 }
-
index b3c677c..7384416 100644 (file)
 #!./perl -w
 
-#
-# Compare the current Perl source tree against the version at the most
-# recent tag, for modules that have identical version numbers but
-# different contents. Skips cpan/.
-#
 # Original by slaven@rezic.de, modified by jhi and matt.w.johnson@gmail.com
 #
 # Adapted from Porting/cmpVERSION.pl by Abigail
-#
-
-BEGIN {
-    chdir '..' unless -d 't';
-    unshift @INC, 'lib', 'Porting';
-}
+# Changes folded back into that by Nicholas
 
 use strict;
-use warnings;
-use version;
-use ExtUtils::MakeMaker;
-use File::Compare;
-use File::Find;
-use File::Spec::Functions qw(rel2abs abs2rel catfile catdir curdir);
-use Getopt::Std;
-use Maintainers;
+
+chdir '..' unless -d 't';
 
 if (! -d '.git' ) {
     print "1..0 # SKIP: not being run from a git checkout\n";
     exit 0;
 }
 
-#
-# Thanks to David Golden for this suggestion.
-#
-my $tag_to_compare = `git describe --abbrev=0`;
-chomp $tag_to_compare;
-my $source_dir = '.';
-
-my $null = $^O eq 'MSWin32' ? 'nul' : '/dev/null';
-
-my $tag_exists = `git --no-pager tag -l $tag_to_compare 2>$null`;
-chomp $tag_exists;
-
-
-if ($tag_exists ne $tag_to_compare) {
-    print "1..0 # SKIP: '$tag_to_compare' is not a known Git tag\n";
-    exit 0;
-}
-
-
-my %dual_files;
-for my $m (grep $Maintainers::Modules {$_} {CPAN}, keys %Maintainers::Modules) {
-    $dual_files{$_} = 1 for Maintainers::get_module_files ($m);
-}
-
+my $dotslash = $^O eq "MSWin32" ? ".\\" : "./";
 
-# Files to skip from the check for one reason or another,
-# usually because they pull in their version from some other file.
-my %skip;
-@skip{
-    'lib/Carp/Heavy.pm',
-    'lib/Config.pm',           # no version number but contents will vary
-    'lib/Exporter/Heavy.pm',
-    'win32/FindExt.pm',
-} = ();
-
-# Files to skip just for particular version(s),
-# usually due to some # mix-up
-
-my %skip_versions = (
-    # 'some/sample/file.pm' => [ '1.23', '1.24' ],
-    'dist/threads/lib/threads.pm' => [ '1.83' ],
-);
-
-my $skip_dirs = qr{^(?:t/lib|cpan)};
-
-my @all_diffs = `git --no-pager diff --name-only $tag_to_compare`;
-chomp @all_diffs;
-
-my @tmp_diffs = grep {
-    my $this_dir;
-    $this_dir = $1 if m/^(.*)\//;
-    /\.pm$/ &&
-    (!defined($this_dir) || ($this_dir !~ $skip_dirs)) &&
-    !exists $skip{$_};
-} @all_diffs;
-my   @module_diffs =  grep {!exists $dual_files {$_}} @tmp_diffs;
-push @module_diffs => grep { exists $dual_files {$_}} @tmp_diffs;
-
-unless (@module_diffs) {
-    print "1..1\n";
-    print "ok 1 - No difference found\n";
-    exit;
-}
-
-my (@output_files, @output_diffs);
-
-printf "1..%d\n" => scalar @module_diffs;
-
-my $count = 0;
-my @diff;
-foreach my $pm_file (@module_diffs) {
-    @diff = ();
-    (my $xs_file = $pm_file) =~ s/\.pm$/.xs/;
-    my $pm_eq = compare_git_file($pm_file, $tag_to_compare);
-    next unless defined $pm_eq;
-    my $xs_eq = 1;
-    if (-e $xs_file) {
-        $xs_eq = compare_git_file($xs_file, $tag_to_compare);
-        next unless defined $xs_eq;
-    }
-    next if ($pm_eq && $xs_eq);
-    my $pm_version = eval {MM->parse_version($pm_file)};
-    my $orig_pm_content = get_file_from_git($pm_file, $tag_to_compare);
-    my $orig_pm_version = eval {MM->parse_version(\$orig_pm_content)};
-    next if ( ! defined $pm_version || ! defined $orig_pm_version );
-    next if ( $pm_version eq 'undef' || $orig_pm_version eq 'undef' ); # sigh
-    next if $pm_version ne $orig_pm_version;
-    next if exists $skip_versions{$pm_file}
-        and grep $pm_version eq $_, @{$skip_versions{$pm_file}};
-    push @diff => $pm_file unless $pm_eq;
-    push @diff => $xs_file unless $xs_eq;
-}
-continue {
-    if (@diff) {
-        foreach my $diff (@diff) {
-            print "# $_" for `git --no-pager diff $tag_to_compare '$diff'`;
-        }
-        printf "not ok %d - %s\n" => ++ $count, $pm_file;
-    }
-    else {
-        printf "ok %d - %s\n" => ++ $count, $pm_file;
-    }
-}
-
-exit;
-
-sub compare_git_file {
-    my ($file, $tag) = @_;
-    open(my $orig_fh, "-|", "git --no-pager show $tag:$file 2>$null");
-    return undef if eof($orig_fh);
-    my $is_eq = compare($file, $orig_fh) == 0;
-    close($orig_fh);
-    return $is_eq;
-}
-
-sub get_file_from_git {
-    my ($file, $tag) = @_;
-    local $/ = undef;
-    my $file_content = `git --no-pager show $tag:$file 2>$null`;
-    return $file_content;
-}
+system "${dotslash}perl -Ilib Porting/cmpVERSION.pl --exclude --tap";