File-DirCompare-0.7/0000755000175000017500000000000012035156017013254 5ustar gavingavinFile-DirCompare-0.7/MANIFEST.SKIP0000644000175000017500000000007612035155721015156 0ustar gavingavin.git blib EXCLUDE MANIFEST.bak Makefile$ Makefile.old MYMETA* File-DirCompare-0.7/TODO0000644000175000017500000000010211536137500013736 0ustar gavingavin+ implement cmp + implement ignore_cmp + implement ignore_missing File-DirCompare-0.7/DirCompare.pm0000644000175000017500000001640112035153672015645 0ustar gavingavinpackage File::DirCompare; use 5.005; use strict; use File::Basename; use File::Spec::Functions; use File::Compare (); use File::Glob qw(bsd_glob); use Carp; use vars qw($VERSION); $VERSION = '0.7'; # ---------------------------------------------------------------------------- # Private methods sub _dir_compare { my $self = shift; my ($dir1, $dir2, $sub, $opts) = @_; # Glob $dir1 and $dir2 my (%d1, %d2); $d1{basename $_} = 1 foreach bsd_glob(catfile($dir1, ".*")); $d1{basename $_} = 1 foreach bsd_glob(catfile($dir1, "*")); $d2{basename $_} = 1 foreach bsd_glob(catfile($dir2, ".*")); $d2{basename $_} = 1 foreach bsd_glob(catfile($dir2, "*")); # Prune dot dirs delete $d1{curdir()} if $d1{curdir()}; delete $d1{updir()} if $d1{updir()}; delete $d2{curdir()} if $d2{curdir()}; delete $d2{updir()} if $d2{updir()}; # Setup cmp and matches subs my $cmp = $opts->{cmp} && ref $opts->{cmp} eq 'CODE' ? $opts->{cmp} : \&File::Compare::compare; my $matches = $opts->{matches} if $opts->{matches} && ref $opts->{matches} eq 'CODE'; # Iterate over sorted and uniquified file list my %u; for my $f (map { $u{$_}++ == 0 ? $_ : () } sort(keys(%d1), keys(%d2))) { my $f1 = catfile($dir1, $f); my $f2 = catfile($dir2, $f); # Only in $dir1 if (! $d2{$f}) { $sub->($f1, undef) unless $opts->{ignore_unique}; } # Only in $dir2 elsif (! $d1{$f}) { $sub->(undef, $f2) unless $opts->{ignore_unique}; } # Item exists in both directories else { # Both symlinks if (-l $f1 && -l $f2) { my $t1 = readlink $f1 or croak "Cannot read symlink $f1: $!"; my $t2 = readlink $f2 or croak "Cannot read symlink $f2: $!"; $sub->($f1, $f2) if $t1 ne $t2; } # One symlink (i.e. different) elsif (-l $f1 || -l $f2) { $sub->($f1, $f2); } # Both directories elsif (-d $f1 && -d $f2) { $self->_dir_compare($f1, $f2, $sub, $opts); } # One directory (i.e. different) elsif (-d $f1 || -d $f2) { $sub->($f1, $f2); } # Both files - check if different else { if ($opts->{ignore_cmp}) { $sub->($f1, $f2); } elsif ($cmp->($f1, $f2) != 0) { $sub->($f1, $f2); } elsif ($matches) { $matches->($f1, $f2); } } } } } # ---------------------------------------------------------------------------- # Public methods sub compare { my $self = shift; my ($dir1, $dir2, $sub, $opts) = @_; croak "Not a directory: '$dir1'" unless -d $dir1; croak "Not a directory: '$dir2'" unless -d $dir2; croak "Not a subroutine: '$sub'" unless ref $sub eq 'CODE'; croak "Not a hashref: '$opts'" if $opts && ref $opts ne 'HASH'; $self = $self->new unless ref $self; $self->_dir_compare(@_); } # ---------------------------------------------------------------------------- # Constructors sub new { bless {}, shift } # ---------------------------------------------------------------------------- 1; __END__ =head1 NAME File::DirCompare - Perl module to compare two directories using callbacks. =head1 SYNOPSIS use File::DirCompare; # Simple diff -r --brief replacement use File::Basename; File::DirCompare->compare($dir1, $dir2, sub { my ($a, $b) = @_; if (! $b) { printf "Only in %s: %s\n", dirname($a), basename($a); } elsif (! $a) { printf "Only in %s: %s\n", dirname($b), basename($b); } else { print "Files $a and $b differ\n"; } }); # Version-control like Deleted/Added/Modified listing my (@listing, @modified); # use closure to collect results File::DirCompare->compare('old_tree', 'new_tree', sub { my ($a, $b) = @_; if (! $b) { push @listing, "D $a"; } elsif (! $a) { push @listing, "A $b"; } else { if (-f $a && -f $b) { push @listing, "M $b"; push @modified, $b; } else { # One file, one directory - treat as delete + add push @listing, "D $a"; push @listing, "A $b"; } } }); =head1 DESCRIPTION File::DirCompare is a perl module to compare two directories using a callback, invoked for all files that are 'different' between the two directories, and for any files that exist only in one or other directory ('unique' files). File::DirCompare has a single public compare() method, with the following signature: File::DirCompare->compare($dir1, $dir2, $sub, $opts); The first three arguments are required - $dir1 and $dir2 are paths to the two directories to be compared, and $sub is the subroutine reference called for all unique or different files. $opts is an optional hashref of options - see L below. The provided subroutine is called for all unique files, and for every pair of 'different' files encountered, with the following signature: $sub->($file1, $file2) where $file1 and $file2 are the paths to the two files. For 'unique' files i.e. where a file exists in only one directory, the subroutine is called with the other argument 'undef' i.e. for: $sub->($file1, undef) $sub->(undef, $file2) the first indicates $file1 exists only in the first directory given ($dir1), and the second indicates $file2 exists only in the second directory given ($dir2). =head2 OPTIONS The following optional arguments are supported, passed in using a hash reference after the three required arguments to compare() e.g. File::DirCompare->compare($dir1, $dir2, $sub, { cmp => $cmp_sub, ignore_cmp => 1, ignore_unique => 1, matches => $matches_sub, }); =over 4 =item cmp By default, two files are regarded as different if their contents do not match (tested with File::Compare::compare). That default behaviour can be overridden by providing a 'cmp' subroutine to do the file comparison, returning zero if the two files are equal, and non-zero if not. E.g. to compare using modification times instead of file contents: File::DirCompare->compare($dir1, $dir2, $sub, { cmp => sub { -M $_[0] <=> -M $_[1] }, }); =item ignore_cmp If you want to see I corresponding files, not just 'different' ones, set the 'ignore_cmp' flag to tell File::DirCompare to skip its file comparison checks i.e. File::DirCompare->compare($dir1, $dir2, $sub, { ignore_cmp => 1 }); =item ignore_unique If you want to ignore files that only exist in one of the two directories, set the 'ignore_unique' flag i.e. File::DirCompare->compare($dir1, $dir2, $sub, { ignore_unique => 1 }); =item matches Subroutine to be called for file pairs that I, with the following signature: $sub->($file1, $file2) These pairs are ordinarily ignored (unless C is set). =back =head1 SEE ALSO File::Dircmp, which provides similar functionality (and whose directory walking code I've adapted for this module), but a simpler reporting-only interface, something like the first example in the SYNOPSIS above. =head1 AUTHOR AND CREDITS Gavin Carr Thanks to Robin Barker for a bug report and fix for glob problems with whitespace. =head1 COPYRIGHT AND LICENSE Copyright 2006-2012 by Gavin Carr Egavin@openfusion.com.auE. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =cut File-DirCompare-0.7/t/0000755000175000017500000000000012035154536013523 5ustar gavingavinFile-DirCompare-0.7/t/10_whitespace.t0000644000175000017500000000240011536137500016335 0ustar gavingavin# Tests on filenames with whitespace my $num_tests; BEGIN { $num_tests = 2 }; use strict; use Test::More tests => $num_tests; use File::Basename; use File::Spec::Functions; BEGIN { use_ok('File::DirCompare') }; chdir dirname($0) or die "can't chdir to " . dirname($0); # Load result strings my %result = (); my $dir = 't10'; my $results_dir = File::Spec->catfile($dir, 'results'); die "missing data dir $dir" unless -d $dir; die "missing results dir $results_dir" unless -d $results_dir; opendir DATADIR, $results_dir or die "can't open directory $results_dir"; for (readdir DATADIR) { next if m/^\./; next if m/^=/; open FILE, "<$results_dir/$_" or die "can't read $results_dir/$_"; { local $/ = undef; $result{$_} = ; } close FILE; } close DATADIR; my @results; File::DirCompare->compare(catfile($dir,'old'), catfile($dir,'new'), sub { my ($a, $b) = @_; return if $a && $a =~ m/\.arch-ids/ or $b && $b =~ m/\.arch-ids/; if (! $b) { push @results, sprintf("Only in %s: %s\n", dirname($a), basename($a)); } elsif (! $a) { push @results, sprintf("Only in %s: %s\n", dirname($b), basename($b)); } else { push @results, "Files $a and $b differ\n"; } }); is(join('', @results), $result{whitespace}, "whitespace files okay"); File-DirCompare-0.7/t/t07/0000755000175000017500000000000011536137500014132 5ustar gavingavinFile-DirCompare-0.7/t/t07/old/0000755000175000017500000000000012035151165014706 5ustar gavingavinFile-DirCompare-0.7/t/t07/old/fff0000644000175000017500000000000411536137500015366 0ustar gavingavinbar File-DirCompare-0.7/t/t07/old/ccc0000644000175000017500000000000411536137500015355 0ustar gavingavinfoo File-DirCompare-0.7/t/t07/old/ddd0000644000175000017500000000000411536137500015360 0ustar gavingavinfoo File-DirCompare-0.7/t/t07/old/aaa0000644000175000017500000000000011536137500015343 0ustar gavingavinFile-DirCompare-0.7/t/t07/old/eee/0000755000175000017500000000000012035152551015444 5ustar gavingavinFile-DirCompare-0.7/t/t07/results/0000755000175000017500000000000011536137500015633 5ustar gavingavinFile-DirCompare-0.7/t/t07/results/ignore_cmp0000644000175000017500000000024411536137500017700 0ustar gavingavinFiles t07/old/ccc and t07/new/ccc differ Files t07/old/ddd and t07/new/ddd differ Files t07/old/eee and t07/new/eee differ Files t07/old/fff and t07/new/fff differ File-DirCompare-0.7/t/t07/new/0000755000175000017500000000000012035151205014714 5ustar gavingavinFile-DirCompare-0.7/t/t07/new/fff/0000755000175000017500000000000012035152543015463 5ustar gavingavinFile-DirCompare-0.7/t/t07/new/ccc0000644000175000017500000000000411536137500015370 0ustar gavingavinfoo File-DirCompare-0.7/t/t07/new/ddd0000644000175000017500000000000411536137500015373 0ustar gavingavinbar File-DirCompare-0.7/t/t07/new/bbb0000644000175000017500000000000011536137500015361 0ustar gavingavinFile-DirCompare-0.7/t/t07/new/ggg/0000755000175000017500000000000011536137500015467 5ustar gavingavinFile-DirCompare-0.7/t/t07/new/ggg/hhh/0000755000175000017500000000000011536137500016236 5ustar gavingavinFile-DirCompare-0.7/t/t07/new/ggg/hhh/iii0000644000175000017500000000000011536137500016721 0ustar gavingavinFile-DirCompare-0.7/t/t07/new/eee0000644000175000017500000000000411536137500015376 0ustar gavingavinfoo File-DirCompare-0.7/t/t03/0000755000175000017500000000000011536137500014126 5ustar gavingavinFile-DirCompare-0.7/t/t03/old/0000755000175000017500000000000012035150004014671 5ustar gavingavinFile-DirCompare-0.7/t/t03/old/fff0000644000175000017500000000000411536137500015362 0ustar gavingavinbar File-DirCompare-0.7/t/t03/old/ccc0000644000175000017500000000000411536137500015351 0ustar gavingavinfoo File-DirCompare-0.7/t/t03/old/ddd0000644000175000017500000000000411536137500015354 0ustar gavingavinfoo File-DirCompare-0.7/t/t03/old/aaa0000644000175000017500000000000011536137500015337 0ustar gavingavinFile-DirCompare-0.7/t/t03/old/jjj/0000755000175000017500000000000011536137500015461 5ustar gavingavinFile-DirCompare-0.7/t/t03/old/jjj/mmm0000644000175000017500000000000411536137500016164 0ustar gavingavinfoo File-DirCompare-0.7/t/t03/old/jjj/kkk0000644000175000017500000000000411536137500016156 0ustar gavingavinfoo File-DirCompare-0.7/t/t03/old/eee/0000755000175000017500000000000012035152517015442 5ustar gavingavinFile-DirCompare-0.7/t/t03/results/0000755000175000017500000000000011536137500015627 5ustar gavingavinFile-DirCompare-0.7/t/t03/results/changes0000644000175000017500000000014411536137500017161 0ustar gavingavinD aaa A bbb M ddd D eee A eee D fff A fff A ggg D jjj/kkk A jjj/lll M jjj/mmm File-DirCompare-0.7/t/t03/new/0000755000175000017500000000000012035150050014705 5ustar gavingavinFile-DirCompare-0.7/t/t03/new/fff/0000755000175000017500000000000012035152513015454 5ustar gavingavinFile-DirCompare-0.7/t/t03/new/ccc0000644000175000017500000000000411536137500015364 0ustar gavingavinfoo File-DirCompare-0.7/t/t03/new/ddd0000644000175000017500000000000411536137500015367 0ustar gavingavinbar File-DirCompare-0.7/t/t03/new/jjj/0000755000175000017500000000000011536137500015474 5ustar gavingavinFile-DirCompare-0.7/t/t03/new/jjj/mmm0000644000175000017500000000000411536137500016177 0ustar gavingavinbar File-DirCompare-0.7/t/t03/new/jjj/lll0000644000175000017500000000000411536137500016174 0ustar gavingavinfoo File-DirCompare-0.7/t/t03/new/bbb0000644000175000017500000000000011536137500015355 0ustar gavingavinFile-DirCompare-0.7/t/t03/new/ggg/0000755000175000017500000000000011536137500015463 5ustar gavingavinFile-DirCompare-0.7/t/t03/new/ggg/hhh/0000755000175000017500000000000011536137500016232 5ustar gavingavinFile-DirCompare-0.7/t/t03/new/ggg/hhh/iii0000644000175000017500000000000011536137500016715 0ustar gavingavinFile-DirCompare-0.7/t/t03/new/eee0000644000175000017500000000000411536137500015372 0ustar gavingavinfoo File-DirCompare-0.7/t/t02/0000755000175000017500000000000011536137500014125 5ustar gavingavinFile-DirCompare-0.7/t/t02/old/0000755000175000017500000000000012035147602014702 5ustar gavingavinFile-DirCompare-0.7/t/t02/old/fff0000644000175000017500000000000411536137500015361 0ustar gavingavinbar File-DirCompare-0.7/t/t02/old/ccc0000644000175000017500000000000411536137500015350 0ustar gavingavinfoo File-DirCompare-0.7/t/t02/old/ddd0000644000175000017500000000000411536137500015353 0ustar gavingavinfoo File-DirCompare-0.7/t/t02/old/aaa0000644000175000017500000000000011536137500015336 0ustar gavingavinFile-DirCompare-0.7/t/t02/old/eee/0000755000175000017500000000000012035152506015437 5ustar gavingavinFile-DirCompare-0.7/t/t02/results/0000755000175000017500000000000011536137500015626 5ustar gavingavinFile-DirCompare-0.7/t/t02/results/diffbrief0000644000175000017500000000037211536137500017473 0ustar gavingavinOnly in t02/old: aaa Only in t02/new: bbb Files t02/old/ddd and t02/new/ddd differ File t02/old/eee is a directory while file t02/new/eee is a regular file File t02/old/fff is a regular file while file t02/new/fff is a directory Only in t02/new: ggg File-DirCompare-0.7/t/t02/new/0000755000175000017500000000000012035147667014730 5ustar gavingavinFile-DirCompare-0.7/t/t02/new/fff/0000755000175000017500000000000012035152501015450 5ustar gavingavinFile-DirCompare-0.7/t/t02/new/ccc0000644000175000017500000000000411536137500015363 0ustar gavingavinfoo File-DirCompare-0.7/t/t02/new/ddd0000644000175000017500000000000411536137500015366 0ustar gavingavinbar File-DirCompare-0.7/t/t02/new/bbb0000644000175000017500000000000011536137500015354 0ustar gavingavinFile-DirCompare-0.7/t/t02/new/ggg/0000755000175000017500000000000011536137500015462 5ustar gavingavinFile-DirCompare-0.7/t/t02/new/ggg/hhh/0000755000175000017500000000000011536137500016231 5ustar gavingavinFile-DirCompare-0.7/t/t02/new/ggg/hhh/iii0000644000175000017500000000000011536137500016714 0ustar gavingavinFile-DirCompare-0.7/t/t02/new/eee0000644000175000017500000000000411536137500015371 0ustar gavingavinfoo File-DirCompare-0.7/t/03_changes.t0000644000175000017500000000261111536137500015617 0ustar gavingavin# Version-control-like changes summary my $num_tests; BEGIN { $num_tests = 2 }; use strict; use Test::More tests => $num_tests; use File::Basename; use File::Spec::Functions; BEGIN { use_ok('File::DirCompare') }; chdir dirname($0) or die "can't chdir to " . dirname($0); # Load result strings my %result = (); my $dir = 't03'; my $results_dir = File::Spec->catfile($dir, 'results'); die "missing data dir $dir" unless -d $dir; die "missing results dir $results_dir" unless -d $results_dir; opendir DATADIR, $results_dir or die "can't open directory $results_dir"; for (readdir DATADIR) { next if m/^\./; next if m/^=/; open FILE, "<$results_dir/$_" or die "can't read $results_dir/$_"; { local $/ = undef; $result{$_} = ; } close FILE; } close DATADIR; my @results; File::DirCompare->compare(catfile($dir,'old'), catfile($dir,'new'), sub { my ($a, $b) = @_; return if $a && $a =~ m/\.arch-ids/ or $b && $b =~ m/\.arch-ids/; # Remove initial stems my ($a1) = ($a =~ m!^$dir/(?:old|new)/(.*)!) if $a; my ($b1) = ($b =~ m!^$dir/(?:old|new)/(.*)!) if $b; if (! $b) { push @results, "D $a1\n"; } elsif (! $a) { push @results, "A $b1\n"; } else { if (-f $a && -f $b) { push @results, "M $b1\n"; } else { push @results, "D $a1\n"; push @results, "A $b1\n"; } } }); is(join('', @results), $result{changes}, "changes okay"); File-DirCompare-0.7/t/t01/0000755000175000017500000000000011536137500014124 5ustar gavingavinFile-DirCompare-0.7/t/t01/old/0000755000175000017500000000000012035147415014703 5ustar gavingavinFile-DirCompare-0.7/t/t01/old/dlink10000777000175000017500000000000011536137500016566 2dir1ustar gavingavinFile-DirCompare-0.7/t/t01/old/dir2/0000755000175000017500000000000012035152474015544 5ustar gavingavinFile-DirCompare-0.7/t/t01/old/fff0000777000175000017500000000000011536137500016030 2aaaustar gavingavinFile-DirCompare-0.7/t/t01/old/ccc0000644000175000017500000000000011536137500015343 0ustar gavingavinFile-DirCompare-0.7/t/t01/old/ddd0000644000175000017500000000000411536137500015352 0ustar gavingavinfoo File-DirCompare-0.7/t/t01/old/aaa0000644000175000017500000000000011536137500015335 0ustar gavingavinFile-DirCompare-0.7/t/t01/old/dlink20000777000175000017500000000000011536137500016567 2dir1ustar gavingavinFile-DirCompare-0.7/t/t01/old/dir1/0000755000175000017500000000000011536137500015541 5ustar gavingavinFile-DirCompare-0.7/t/t01/old/dir1/hhh0000644000175000017500000000000411536137500016225 0ustar gavingavintwo File-DirCompare-0.7/t/t01/old/dir1/ggg0000644000175000017500000000000411536137500016222 0ustar gavingavinone File-DirCompare-0.7/t/t01/old/eee0000777000175000017500000000000011536137500016036 2dddustar gavingavinFile-DirCompare-0.7/t/t01/results/0000755000175000017500000000000011536137500015625 5ustar gavingavinFile-DirCompare-0.7/t/t01/results/basic0000644000175000017500000000041311536137500016627 0ustar gavingavinOnly in t01/old: aaa Only in t01/new: bbb Files t01/old/ddd and t01/new/ddd differ Only in t01/old/dir1: hhh Only in t01/new/dir1: iii Only in t01/old: dir2 Only in t01/new: dir3 Files t01/old/dlink2 and t01/new/dlink2 differ Files t01/old/fff and t01/new/fff differ File-DirCompare-0.7/t/t01/new/0000755000175000017500000000000012035147421014713 5ustar gavingavinFile-DirCompare-0.7/t/t01/new/dlink10000777000175000017500000000000011536137500016601 2dir1ustar gavingavinFile-DirCompare-0.7/t/t01/new/fff0000777000175000017500000000000011536137500016046 2bbbustar gavingavinFile-DirCompare-0.7/t/t01/new/ccc0000644000175000017500000000000011536137500015356 0ustar gavingavinFile-DirCompare-0.7/t/t01/new/ddd0000644000175000017500000000000411536137500015365 0ustar gavingavinbar File-DirCompare-0.7/t/t01/new/dlink20000777000175000017500000000000011536137500016604 2dir3ustar gavingavinFile-DirCompare-0.7/t/t01/new/dir3/0000755000175000017500000000000012035152464015557 5ustar gavingavinFile-DirCompare-0.7/t/t01/new/bbb0000644000175000017500000000000011536137500015353 0ustar gavingavinFile-DirCompare-0.7/t/t01/new/dir1/0000755000175000017500000000000011536137500015554 5ustar gavingavinFile-DirCompare-0.7/t/t01/new/dir1/iii0000644000175000017500000000000611536137500016245 0ustar gavingavinthree File-DirCompare-0.7/t/t01/new/dir1/ggg0000644000175000017500000000000411536137500016235 0ustar gavingavinone File-DirCompare-0.7/t/t01/new/eee0000777000175000017500000000000011536137500016051 2dddustar gavingavinFile-DirCompare-0.7/t/06_cmp.t0000644000175000017500000000213211536137500014767 0ustar gavingavin# 'cmp' option test my $num_tests; BEGIN { $num_tests = 2 }; use strict; use Test::More tests => $num_tests; use File::Basename; use File::Spec::Functions; BEGIN { use_ok('File::DirCompare') }; chdir dirname($0) or die "can't chdir to " . dirname($0); # Load result strings my %result = (); my $dir = 't06'; my $results_dir = File::Spec->catfile($dir, 'results'); die "missing data dir $dir" unless -d $dir; die "missing results dir $results_dir" unless -d $results_dir; opendir DATADIR, $results_dir or die "can't open directory $results_dir"; for (readdir DATADIR) { next if m/^\./; next if m/^=/; open FILE, "<$results_dir/$_" or die "can't read $results_dir/$_"; { local $/ = undef; $result{$_} = ; } close FILE; } close DATADIR; my @results; File::DirCompare->compare(catfile($dir,'old'), catfile($dir,'new'), sub { my ($a, $b) = @_; return if $a && $a =~ m/\.arch-ids/ or $b && $b =~ m/\.arch-ids/; if ($a && $b) { push @results, "Files $a and $b differ\n"; } }, { cmp => sub { ! File::Compare::compare(@_) } }); is(join('', @results), $result{cmp}, 'cmp ok'); File-DirCompare-0.7/t/t06/0000755000175000017500000000000011536137500014131 5ustar gavingavinFile-DirCompare-0.7/t/t06/old/0000755000175000017500000000000012035150130014674 5ustar gavingavinFile-DirCompare-0.7/t/t06/old/fff0000644000175000017500000000000411536137500015365 0ustar gavingavinbar File-DirCompare-0.7/t/t06/old/ccc0000644000175000017500000000000411536137500015354 0ustar gavingavinfoo File-DirCompare-0.7/t/t06/old/ddd0000644000175000017500000000000411536137500015357 0ustar gavingavinfoo File-DirCompare-0.7/t/t06/old/aaa0000644000175000017500000000000011536137500015342 0ustar gavingavinFile-DirCompare-0.7/t/t06/old/eee/0000755000175000017500000000000012035152533015443 5ustar gavingavinFile-DirCompare-0.7/t/t06/results/0000755000175000017500000000000011536137500015632 5ustar gavingavinFile-DirCompare-0.7/t/t06/results/cmp0000644000175000017500000000017311536137500016335 0ustar gavingavinFiles t06/old/ccc and t06/new/ccc differ Files t06/old/eee and t06/new/eee differ Files t06/old/fff and t06/new/fff differ File-DirCompare-0.7/t/t06/new/0000755000175000017500000000000012035150170014713 5ustar gavingavinFile-DirCompare-0.7/t/t06/new/fff/0000755000175000017500000000000012035152532015460 5ustar gavingavinFile-DirCompare-0.7/t/t06/new/ccc0000644000175000017500000000000411536137500015367 0ustar gavingavinfoo File-DirCompare-0.7/t/t06/new/ddd0000644000175000017500000000000411536137500015372 0ustar gavingavinbar File-DirCompare-0.7/t/t06/new/bbb0000644000175000017500000000000011536137500015360 0ustar gavingavinFile-DirCompare-0.7/t/t06/new/ggg/0000755000175000017500000000000011536137500015466 5ustar gavingavinFile-DirCompare-0.7/t/t06/new/ggg/hhh/0000755000175000017500000000000011536137500016235 5ustar gavingavinFile-DirCompare-0.7/t/t06/new/ggg/hhh/iii0000644000175000017500000000000011536137500016720 0ustar gavingavinFile-DirCompare-0.7/t/t06/new/eee0000644000175000017500000000000411536137500015375 0ustar gavingavinfoo File-DirCompare-0.7/t/t08/0000755000175000017500000000000011536137500014133 5ustar gavingavinFile-DirCompare-0.7/t/t08/old/0000755000175000017500000000000012035151230014700 5ustar gavingavinFile-DirCompare-0.7/t/t08/old/fff0000644000175000017500000000000411536137500015367 0ustar gavingavinbar File-DirCompare-0.7/t/t08/old/ccc0000644000175000017500000000000411536137500015356 0ustar gavingavinfoo File-DirCompare-0.7/t/t08/old/ddd0000644000175000017500000000000411536137500015361 0ustar gavingavinfoo File-DirCompare-0.7/t/t08/old/aaa0000644000175000017500000000000011536137500015344 0ustar gavingavinFile-DirCompare-0.7/t/t08/old/eee/0000755000175000017500000000000012035152562015447 5ustar gavingavinFile-DirCompare-0.7/t/t08/results/0000755000175000017500000000000011536137500015634 5ustar gavingavinFile-DirCompare-0.7/t/t08/results/ignore_unique0000644000175000017500000000017311536137500020431 0ustar gavingavinFiles t08/old/ddd and t08/new/ddd differ Files t08/old/eee and t08/new/eee differ Files t08/old/fff and t08/new/fff differ File-DirCompare-0.7/t/t08/new/0000755000175000017500000000000012035151241014715 5ustar gavingavinFile-DirCompare-0.7/t/t08/new/fff/0000755000175000017500000000000012035152555015467 5ustar gavingavinFile-DirCompare-0.7/t/t08/new/ccc0000644000175000017500000000000411536137500015371 0ustar gavingavinfoo File-DirCompare-0.7/t/t08/new/ddd0000644000175000017500000000000411536137500015374 0ustar gavingavinbar File-DirCompare-0.7/t/t08/new/bbb0000644000175000017500000000000011536137500015362 0ustar gavingavinFile-DirCompare-0.7/t/t08/new/ggg/0000755000175000017500000000000011536137500015470 5ustar gavingavinFile-DirCompare-0.7/t/t08/new/ggg/hhh/0000755000175000017500000000000011536137500016237 5ustar gavingavinFile-DirCompare-0.7/t/t08/new/ggg/hhh/iii0000644000175000017500000000000011536137500016722 0ustar gavingavinFile-DirCompare-0.7/t/t08/new/eee0000644000175000017500000000000411536137500015377 0ustar gavingavinfoo File-DirCompare-0.7/t/07_ignore_cmp.t0000644000175000017500000000212311536137500016333 0ustar gavingavin# 'ignore_cmp' option test my $num_tests; BEGIN { $num_tests = 2 }; use strict; use Test::More tests => $num_tests; use File::Basename; use File::Spec::Functions; BEGIN { use_ok('File::DirCompare') }; chdir dirname($0) or die "can't chdir to " . dirname($0); # Load result strings my %result = (); my $dir = 't07'; my $results_dir = File::Spec->catfile($dir, 'results'); die "missing data dir $dir" unless -d $dir; die "missing results dir $results_dir" unless -d $results_dir; opendir DATADIR, $results_dir or die "can't open directory $results_dir"; for (readdir DATADIR) { next if m/^\./; next if m/^=/; open FILE, "<$results_dir/$_" or die "can't read $results_dir/$_"; { local $/ = undef; $result{$_} = ; } close FILE; } close DATADIR; my @results; File::DirCompare->compare(catfile($dir,'old'), catfile($dir,'new'), sub { my ($a, $b) = @_; return if $a && $a =~ m/\.arch-ids/ or $b && $b =~ m/\.arch-ids/; if ($a && $b) { push @results, "Files $a and $b differ\n"; } }, { ignore_cmp => 1 }); is(join('', @results), $result{ignore_cmp}, 'ignore_cmp ok'); File-DirCompare-0.7/t/12_matches.t0000644000175000017500000000313712035154536015642 0ustar gavingavin# 'diff -r --brief' test, but including matches my $num_tests; BEGIN { $num_tests = 2 }; use strict; use Test::More tests => $num_tests; use File::Basename; use File::Spec::Functions; BEGIN { use_ok('File::DirCompare') }; chdir dirname($0) or die "can't chdir to " . dirname($0); # Load result strings my %result = (); my $dir = 't12'; my $results_dir = File::Spec->catfile($dir, 'results'); die "missing data dir $dir" unless -d $dir; die "missing results dir $results_dir" unless -d $results_dir; opendir DATADIR, $results_dir or die "can't open directory $results_dir"; for (readdir DATADIR) { next if m/^\./; next if m/^=/; open FILE, "<$results_dir/$_" or die "can't read $results_dir/$_"; { local $/ = undef; $result{$_} = ; } close FILE; } close DATADIR; my @results; File::DirCompare->compare(catfile($dir,'old'), catfile($dir,'new'), sub { my ($a, $b) = @_; return if $a && $a =~ m/\.arch-ids/ or $b && $b =~ m/\.arch-ids/; if (! $b) { push @results, sprintf("Only in %s: %s\n", dirname($a), basename($a)); } elsif (! $a) { push @results, sprintf("Only in %s: %s\n", dirname($b), basename($b)); } else { if (-f $a && -f $b) { push @results, "Files $a and $b differ\n"; } elsif (-d $a) { push @results, "File $a is a directory while file $b is a regular file\n"; } elsif (-d $b) { push @results, "File $a is a regular file while file $b is a directory\n"; } } }, { matches => sub { my ($a, $b) = @_; push @results, "Files $a and $b match\n"; }, }); is(join('', @results), $result{matches}, "diff with matches output ok"); File-DirCompare-0.7/t/02_diffbrief.t0000644000175000017500000000277111536137500016135 0ustar gavingavin# Slightly longer 'diff -r --brief' test my $num_tests; BEGIN { $num_tests = 2 }; use strict; use Test::More tests => $num_tests; use File::Basename; use File::Spec::Functions; BEGIN { use_ok('File::DirCompare') }; chdir dirname($0) or die "can't chdir to " . dirname($0); # Load result strings my %result = (); my $dir = 't02'; my $results_dir = File::Spec->catfile($dir, 'results'); die "missing data dir $dir" unless -d $dir; die "missing results dir $results_dir" unless -d $results_dir; opendir DATADIR, $results_dir or die "can't open directory $results_dir"; for (readdir DATADIR) { next if m/^\./; next if m/^=/; open FILE, "<$results_dir/$_" or die "can't read $results_dir/$_"; { local $/ = undef; $result{$_} = ; } close FILE; } close DATADIR; my @results; File::DirCompare->compare(catfile($dir,'old'), catfile($dir,'new'), sub { my ($a, $b) = @_; return if $a && $a =~ m/\.arch-ids/ or $b && $b =~ m/\.arch-ids/; if (! $b) { push @results, sprintf("Only in %s: %s\n", dirname($a), basename($a)); } elsif (! $a) { push @results, sprintf("Only in %s: %s\n", dirname($b), basename($b)); } else { if (-f $a && -f $b) { push @results, "Files $a and $b differ\n"; } elsif (-d $a) { push @results, "File $a is a directory while file $b is a regular file\n"; } elsif (-d $b) { push @results, "File $a is a regular file while file $b is a directory\n"; } } }); is(join('', @results), $result{diffbrief}, "longer diff -r --brief okay"); File-DirCompare-0.7/t/08_ignore_unique.t0000644000175000017500000000210711536137500017065 0ustar gavingavin# 'ignore_unique' option test my $num_tests; BEGIN { $num_tests = 2 }; use strict; use Test::More tests => $num_tests; use File::Basename; use File::Spec::Functions; BEGIN { use_ok('File::DirCompare') }; chdir dirname($0) or die "can't chdir to " . dirname($0); # Load result strings my %result = (); my $dir = 't08'; my $results_dir = File::Spec->catfile($dir, 'results'); die "missing data dir $dir" unless -d $dir; die "missing results dir $results_dir" unless -d $results_dir; opendir DATADIR, $results_dir or die "can't open directory $results_dir"; for (readdir DATADIR) { next if m/^\./; next if m/^=/; open FILE, "<$results_dir/$_" or die "can't read $results_dir/$_"; { local $/ = undef; $result{$_} = ; } close FILE; } close DATADIR; my @results; File::DirCompare->compare(catfile($dir,'old'), catfile($dir,'new'), sub { my ($a, $b) = @_; return if $a && $a =~ m/\.arch-ids/ or $b && $b =~ m/\.arch-ids/; push @results, "Files $a and $b differ\n"; }, { ignore_unique => 1 }); is(join('', @results), $result{ignore_unique}, 'ignore_unique ok'); File-DirCompare-0.7/t/t10/0000755000175000017500000000000011536137500014124 5ustar gavingavinFile-DirCompare-0.7/t/t10/old/0000755000175000017500000000000011536137500014702 5ustar gavingavinFile-DirCompare-0.7/t/t10/old/uuu vvv www/0000755000175000017500000000000011536137500017127 5ustar gavingavinFile-DirCompare-0.7/t/t10/old/uuu vvv www/foo0000644000175000017500000000000011536137500017623 0ustar gavingavinFile-DirCompare-0.7/t/t10/old/ddd eee fff0000644000175000017500000000000011536137500016607 0ustar gavingavinFile-DirCompare-0.7/t/t10/old/aaa bbb ccc0000644000175000017500000000000011536137500016554 0ustar gavingavinFile-DirCompare-0.7/t/t10/old/xxx yyy zzz/0000755000175000017500000000000011536137500017162 5ustar gavingavinFile-DirCompare-0.7/t/t10/old/xxx yyy zzz/foo0000644000175000017500000000000011536137500017656 0ustar gavingavinFile-DirCompare-0.7/t/t10/old/xxx yyy zzz/bar0000644000175000017500000000000411536137500017643 0ustar gavingavinbar File-DirCompare-0.7/t/t10/old/ggg hhh iii0000644000175000017500000000000411536137500016646 0ustar gavingavinfoo File-DirCompare-0.7/t/t10/results/0000755000175000017500000000000011536137500015625 5ustar gavingavinFile-DirCompare-0.7/t/t10/results/whitespace0000644000175000017500000000042311536137500017703 0ustar gavingavinOnly in t10/old: ddd eee fff Files t10/old/ggg hhh iii and t10/new/ggg hhh iii differ Only in t10/new: jjj kkk lll Only in t10/old: uuu vvv www Files t10/old/xxx yyy zzz/bar and t10/new/xxx yyy zzz/bar differ Only in t10/new/xxx yyy zzz: bog Only in t10/old/xxx yyy zzz: foo File-DirCompare-0.7/t/t10/new/0000755000175000017500000000000011536137500014715 5ustar gavingavinFile-DirCompare-0.7/t/t10/new/aaa bbb ccc0000644000175000017500000000000011536137500016567 0ustar gavingavinFile-DirCompare-0.7/t/t10/new/jjj kkk lll0000644000175000017500000000000011536137500016710 0ustar gavingavinFile-DirCompare-0.7/t/t10/new/xxx yyy zzz/0000755000175000017500000000000011536137500017175 5ustar gavingavinFile-DirCompare-0.7/t/t10/new/xxx yyy zzz/bog0000644000175000017500000000000011536137500017655 0ustar gavingavinFile-DirCompare-0.7/t/t10/new/xxx yyy zzz/bar0000644000175000017500000000000411536137500017656 0ustar gavingavin123 File-DirCompare-0.7/t/t10/new/ggg hhh iii0000644000175000017500000000000411536137500016661 0ustar gavingavinbar File-DirCompare-0.7/t/01_basic.t0000644000175000017500000000237012035147375015276 0ustar gavingavin# Basic diff -r --brief test my $num_tests; BEGIN { $num_tests = 2 }; use strict; use Test::More tests => $num_tests; use File::Basename; use File::Spec::Functions; BEGIN { use_ok('File::DirCompare') }; chdir dirname($0) or die "can't chdir to " . dirname($0); # Load result strings my %result = (); my $dir = 't01'; my $results_dir = File::Spec->catfile($dir, 'results'); die "missing data dir $dir" unless -d $dir; die "missing results dir $results_dir" unless -d $results_dir; opendir DATADIR, $results_dir or die "can't open directory $results_dir"; for (readdir DATADIR) { next if m/^\./; next if m/^=/; open FILE, "<$results_dir/$_" or die "can't read $results_dir/$_"; { local $/ = undef; $result{$_} = ; } close FILE; } close DATADIR; my @results; File::DirCompare->compare(catfile($dir,'old'), catfile($dir,'new'), sub { my ($a, $b) = @_; return if $a && $a =~ m/\.arch-ids/ or $b && $b =~ m/\.arch-ids/; if (! $b) { push @results, sprintf("Only in %s: %s\n", dirname($a), basename($a)); } elsif (! $a) { push @results, sprintf("Only in %s: %s\n", dirname($b), basename($b)); } else { push @results, "Files $a and $b differ\n"; } }); is(join('', @results), $result{basic}, "basic diff -r --brief okay"); File-DirCompare-0.7/t/t12/0000755000175000017500000000000012035154525014127 5ustar gavingavinFile-DirCompare-0.7/t/t12/old/0000755000175000017500000000000012035154702014702 5ustar gavingavinFile-DirCompare-0.7/t/t12/old/fff0000644000175000017500000000000412035154525015363 0ustar gavingavinbar File-DirCompare-0.7/t/t12/old/ccc0000644000175000017500000000000412035154525015352 0ustar gavingavinfoo File-DirCompare-0.7/t/t12/old/ddd0000644000175000017500000000000412035154525015355 0ustar gavingavinfoo File-DirCompare-0.7/t/t12/old/aaa0000644000175000017500000000000012035154525015340 0ustar gavingavinFile-DirCompare-0.7/t/t12/old/eee/0000755000175000017500000000000012035154525015443 5ustar gavingavinFile-DirCompare-0.7/t/t12/results/0000755000175000017500000000000012035154766015637 5ustar gavingavinFile-DirCompare-0.7/t/t12/results/matches0000644000175000017500000000044212035154757017206 0ustar gavingavinOnly in t12/old: aaa Only in t12/new: bbb Files t12/old/ccc and t12/new/ccc match Files t12/old/ddd and t12/new/ddd differ File t12/old/eee is a directory while file t12/new/eee is a regular file File t12/old/fff is a regular file while file t12/new/fff is a directory Only in t12/new: ggg File-DirCompare-0.7/t/t12/new/0000755000175000017500000000000012035154704014717 5ustar gavingavinFile-DirCompare-0.7/t/t12/new/fff/0000755000175000017500000000000012035154525015461 5ustar gavingavinFile-DirCompare-0.7/t/t12/new/ccc0000644000175000017500000000000412035154525015365 0ustar gavingavinfoo File-DirCompare-0.7/t/t12/new/ddd0000644000175000017500000000000412035154525015370 0ustar gavingavinbar File-DirCompare-0.7/t/t12/new/bbb0000644000175000017500000000000012035154525015356 0ustar gavingavinFile-DirCompare-0.7/t/t12/new/ggg/0000755000175000017500000000000012035154525015464 5ustar gavingavinFile-DirCompare-0.7/t/t12/new/ggg/hhh/0000755000175000017500000000000012035154525016233 5ustar gavingavinFile-DirCompare-0.7/t/t12/new/ggg/hhh/iii0000644000175000017500000000000012035154525016716 0ustar gavingavinFile-DirCompare-0.7/t/t12/new/eee0000644000175000017500000000000412035154525015373 0ustar gavingavinfoo File-DirCompare-0.7/MANIFEST.bak0000644000175000017500000000335412035155657015157 0ustar gavingavinDirCompare.pm Makefile.PL MANIFEST MANIFEST.SKIP MYMETA.json MYMETA.yml README t/01_basic.t t/02_diffbrief.t t/03_changes.t t/06_cmp.t t/07_ignore_cmp.t t/08_ignore_unique.t t/10_whitespace.t t/12_matches.t t/t01/new/bbb t/t01/new/ccc t/t01/new/ddd t/t01/new/dir1/ggg t/t01/new/dir1/iii t/t01/new/eee t/t01/new/fff t/t01/old/aaa t/t01/old/ccc t/t01/old/ddd t/t01/old/dir1/ggg t/t01/old/dir1/hhh t/t01/old/eee t/t01/old/fff t/t01/results/basic t/t02/new/bbb t/t02/new/ccc t/t02/new/ddd t/t02/new/eee t/t02/new/ggg/hhh/iii t/t02/old/aaa t/t02/old/ccc t/t02/old/ddd t/t02/old/fff t/t02/results/diffbrief t/t03/new/bbb t/t03/new/ccc t/t03/new/ddd t/t03/new/eee t/t03/new/ggg/hhh/iii t/t03/new/jjj/lll t/t03/new/jjj/mmm t/t03/old/aaa t/t03/old/ccc t/t03/old/ddd t/t03/old/fff t/t03/old/jjj/kkk t/t03/old/jjj/mmm t/t03/results/changes t/t06/new/bbb t/t06/new/ccc t/t06/new/ddd t/t06/new/eee t/t06/new/ggg/hhh/iii t/t06/old/aaa t/t06/old/ccc t/t06/old/ddd t/t06/old/fff t/t06/results/cmp t/t07/new/bbb t/t07/new/ccc t/t07/new/ddd t/t07/new/eee t/t07/new/ggg/hhh/iii t/t07/old/aaa t/t07/old/ccc t/t07/old/ddd t/t07/old/fff t/t07/results/ignore_cmp t/t08/new/bbb t/t08/new/ccc t/t08/new/ddd t/t08/new/eee t/t08/new/ggg/hhh/iii t/t08/old/aaa t/t08/old/ccc t/t08/old/ddd t/t08/old/fff t/t08/results/ignore_unique 't/t10/new/aaa bbb ccc' 't/t10/new/ggg hhh iii' 't/t10/new/jjj kkk lll' 't/t10/new/xxx yyy zzz/bar' 't/t10/new/xxx yyy zzz/bog' 't/t10/old/aaa bbb ccc' 't/t10/old/ddd eee fff' 't/t10/old/ggg hhh iii' 't/t10/old/uuu vvv www/foo' 't/t10/old/xxx yyy zzz/bar' 't/t10/old/xxx yyy zzz/foo' t/t10/results/whitespace t/t12/new/bbb t/t12/new/ccc t/t12/new/ddd t/t12/new/eee t/t12/new/ggg/hhh/iii t/t12/old/aaa t/t12/old/ccc t/t12/old/ddd t/t12/old/fff t/t12/results/matches TODO File-DirCompare-0.7/Makefile.PL0000644000175000017500000000067511536137500015237 0ustar gavingavinuse 5.005; use ExtUtils::MakeMaker; WriteMakefile( 'NAME' => 'File::DirCompare', 'VERSION_FROM' => 'DirCompare.pm', 'PREREQ_PM' => { 'File::Spec' => 0, 'File::Basename' => 0, 'File::Compare' => 0, 'File::Glob' => 0, 'Carp' => 0, }, ($] >= 5.005 ? ## Add these new keywords supported since 5.005 (AUTHOR => 'Gavin Carr ') : ()), ); File-DirCompare-0.7/MANIFEST0000644000175000017500000000332512035155724014414 0ustar gavingavinDirCompare.pm Makefile.PL MANIFEST MANIFEST.SKIP README t/01_basic.t t/02_diffbrief.t t/03_changes.t t/06_cmp.t t/07_ignore_cmp.t t/08_ignore_unique.t t/10_whitespace.t t/12_matches.t t/t01/new/bbb t/t01/new/ccc t/t01/new/ddd t/t01/new/dir1/ggg t/t01/new/dir1/iii t/t01/new/eee t/t01/new/fff t/t01/old/aaa t/t01/old/ccc t/t01/old/ddd t/t01/old/dir1/ggg t/t01/old/dir1/hhh t/t01/old/eee t/t01/old/fff t/t01/results/basic t/t02/new/bbb t/t02/new/ccc t/t02/new/ddd t/t02/new/eee t/t02/new/ggg/hhh/iii t/t02/old/aaa t/t02/old/ccc t/t02/old/ddd t/t02/old/fff t/t02/results/diffbrief t/t03/new/bbb t/t03/new/ccc t/t03/new/ddd t/t03/new/eee t/t03/new/ggg/hhh/iii t/t03/new/jjj/lll t/t03/new/jjj/mmm t/t03/old/aaa t/t03/old/ccc t/t03/old/ddd t/t03/old/fff t/t03/old/jjj/kkk t/t03/old/jjj/mmm t/t03/results/changes t/t06/new/bbb t/t06/new/ccc t/t06/new/ddd t/t06/new/eee t/t06/new/ggg/hhh/iii t/t06/old/aaa t/t06/old/ccc t/t06/old/ddd t/t06/old/fff t/t06/results/cmp t/t07/new/bbb t/t07/new/ccc t/t07/new/ddd t/t07/new/eee t/t07/new/ggg/hhh/iii t/t07/old/aaa t/t07/old/ccc t/t07/old/ddd t/t07/old/fff t/t07/results/ignore_cmp t/t08/new/bbb t/t08/new/ccc t/t08/new/ddd t/t08/new/eee t/t08/new/ggg/hhh/iii t/t08/old/aaa t/t08/old/ccc t/t08/old/ddd t/t08/old/fff t/t08/results/ignore_unique 't/t10/new/aaa bbb ccc' 't/t10/new/ggg hhh iii' 't/t10/new/jjj kkk lll' 't/t10/new/xxx yyy zzz/bar' 't/t10/new/xxx yyy zzz/bog' 't/t10/old/aaa bbb ccc' 't/t10/old/ddd eee fff' 't/t10/old/ggg hhh iii' 't/t10/old/uuu vvv www/foo' 't/t10/old/xxx yyy zzz/bar' 't/t10/old/xxx yyy zzz/foo' t/t10/results/whitespace t/t12/new/bbb t/t12/new/ccc t/t12/new/ddd t/t12/new/eee t/t12/new/ggg/hhh/iii t/t12/old/aaa t/t12/old/ccc t/t12/old/ddd t/t12/old/fff t/t12/results/matches TODO File-DirCompare-0.7/README0000644000175000017500000000132512035153727014142 0ustar gavingavinFile/DirCompare =============== File::DirCompare is a perl module for comparing two directories via callbacks, which are invoked for all files that are 'different' between the two directories, and for any files that exist only in one or other directory ('unique' files). See the perldocs for more details. INSTALLATION To install this module type the following: perl Makefile.PL make make test make install DEPENDENCIES This module requires these other modules and libraries: File::Compare File::Spec File::Basename Carp COPYRIGHT AND LICENCE Copyright (C) 2007-2012 Gavin Carr. This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself.