X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=Porting%2FcmpVERSION.pl;h=f1189744c8003bafb961c55e963fe5570e10c87b;hb=cfbab81b96edaf7de871d0fa306f1723e15a56d7;hp=de5f942d7ed78da25e3feb7bcf7dc664dee67c16;hpb=ae8d64f5604623dd5fe5ff5a56e530ae81ba071b;p=p5sagit%2Fp5-mst-13.2.git diff --git a/Porting/cmpVERSION.pl b/Porting/cmpVERSION.pl index de5f942..f118974 100644 --- a/Porting/cmpVERSION.pl +++ b/Porting/cmpVERSION.pl @@ -4,6 +4,11 @@ # cmpVERSION - compare two Perl source trees for modules # that have identical version numbers but different contents. # +# with -d option, output the diffs too +# with -x option, exclude dual-life modules (after all, there are tools +# like core-cpan-diff that can already deal with them) +# With this option, one of the directories must be '.'. +# # Original by slaven@rezic.de, modified by jhi. # @@ -13,12 +18,38 @@ use ExtUtils::MakeMaker; use File::Compare; use File::Find; use File::Spec::Functions qw(rel2abs abs2rel catfile catdir curdir); +use Getopt::Std; + +use lib 'Porting'; +use Maintainers; + +sub usage { +die <<'EOF'; +usage: $0 [ -d -x ] source_dir1 source_dir2 +EOF +} + +my %opts; +getopts('dx', \%opts) or usage; +@ARGV == 2 or usage; for (@ARGV[0, 1]) { die "$0: '$_' does not look like Perl directory\n" unless -f catfile($_, "perl.h") && -d catdir($_, "Porting"); } +my %dual_files; +if ($opts{x}) { + die "With -x, one of the directories must be '.'\n" + unless $ARGV[0] eq '.' or $ARGV[1] eq '.'; + for my $m (grep $Maintainers::Modules{$_}{CPAN}, + keys %Maintainers::Modules) + { + + $dual_files{"./$_"} = 1 for Maintainers::get_module_files($m); + } +} + my $dir2 = rel2abs($ARGV[1]); chdir $ARGV[0] or die "$0: chdir '$ARGV[0]' failed: $!\n"; @@ -27,32 +58,47 @@ chdir $ARGV[0] or die "$0: chdir '$ARGV[0]' failed: $!\n"; my %skip; @skip{ './lib/Carp/Heavy.pm', - './lib/Exporter/Heavy.pm' + './lib/Config.pm', # no version number but contents will vary + './lib/Exporter/Heavy.pm', + './win32/FindExt.pm', } = (); my $skip_dirs = qr|^\./t/lib|; my @wanted; +my @diffs; find( sub { /\.pm$/ && $File::Find::dir !~ $skip_dirs && - ! exists $skip{$File::Find::name} + ! exists $skip{$File::Find::name} && + ! exists $dual_files{$File::Find::name} && do { my $file2 = catfile(catdir($dir2, $File::Find::dir), $_); (my $xs_file1 = $_) =~ s/\.pm$/.xs/; (my $xs_file2 = $file2) =~ s/\.pm$/.xs/; + my $eq1 = compare($_, $file2) == 0; + my $eq2 = 1; if (-e $xs_file1 && -e $xs_file2) { - return if compare($_, $file2) == 0 && - compare($xs_file1, $xs_file2) == 0; - } else { - return if compare($_, $file2) == 0; + $eq2 = compare($xs_file1, $xs_file2) == 0; } + return if $eq1 && $eq2; my $version1 = eval {MM->parse_version($_)}; my $version2 = eval {MM->parse_version($file2)}; - push @wanted, $File::Find::name - if defined $version1 && - defined $version2 && - $version1 eq $version2 + return unless + defined $version1 && + defined $version2 && + $version1 eq $version2; + push @wanted, $File::Find::name; + push @diffs, [ "$File::Find::dir/$_", $file2 ] unless $eq1; + push @diffs, [ "$File::Find::dir/$xs_file1", $xs_file2 ] + unless $eq2; } }, curdir); -print map { $_, "\n" } sort @wanted; +for (sort @wanted) { + print "$_\n"; +} +exit unless $opts{d}; +for (sort { $a->[0] cmp $b->[0] } @diffs) { + print "\n"; + system "diff -du '$_->[0]' '$_->[1]'"; +}