File Coverage

blib/lib/File/MultipleDiff.pm
Criterion Covered Total %
statement 24 124 19.3
branch 0 46 0.0
condition 0 18 0.0
subroutine 8 10 80.0
pod 1 1 100.0
total 33 199 16.5


line stmt bran cond sub pod time code
1             package File::MultipleDiff;
2              
3 1     1   22579 use 5.006;
  1         4  
  1         48  
4 1     1   12 use strict;
  1         2  
  1         52  
5 1     1   5 use warnings FATAL => 'all';
  1         6  
  1         90  
6              
7             require Exporter;
8             our @ISA = qw(Exporter);
9             our @EXPORT = qw(multiple_file_diff);
10              
11 1     1   6 use Carp ;
  1         2  
  1         88  
12             our $VERSION = '0.06';
13              
14 1     1   1180 use Algorithm::Diff "sdiff";
  1         6251  
  1         87  
15 1     1   1383 use Tie::File ;
  1         23490  
  1         38  
16 1     1   3265 use Term::ANSIColor;
  1         9388  
  1         97  
17 1     1   11 use Cwd;
  1         2  
  1         1192  
18              
19             ##---------------------------------------------------------------------------##
20             ## Compares 2 files and finds out amount of differences between them ##
21             ##---------------------------------------------------------------------------##
22             sub _CompareFiles
23             {
24 0     0     my ($file_A, $file_B) = @_ ;
25              
26 0 0         tie my @A, 'Tie::File', "$file_A" or die "Can't tie $file_A: $!";
27 0 0         tie my @B, 'Tie::File', "$file_B" or die "Can't tie $file_B: $!";
28              
29             # printf "CompareFiles: %-12s %-12s : %3d %3d\n", $file_A, $file_B, ($#A + 1), ($#B + 1) ;
30 0           my @sdiffs = sdiff( \@A, \@B );
31              
32 0           my $diff_counter = 0;
33 0           my $aref ;
34              
35 0           for $aref (@sdiffs)
36             {
37 0 0         if ($aref->[0] ne 'u')
38             {
39             # printf "%-2s | %-40s | %-40s | %3d\n", $aref->[0], $aref->[1], $aref->[2], $diff_counter ;
40 0           $diff_counter ++ ;
41             }
42             }
43 0           untie @A;
44 0           untie @B;
45              
46 0           return $diff_counter ;
47             } # end of "sub _CompareFiles"
48              
49              
50             ##---------------------------------------------------------------------------##
51             sub multiple_file_diff
52             {
53 0     0 1   my ($directory, $file_pattern, $colour, $digits) = @_;
54 0           my $File_A;
55             my $File_B;
56 0           my $file ;
57 0           my %file ;
58 0           my $count ;
59 0           my $title ;
60 0           my $title_length ;
61 0           my $field ;
62 0           my $header ;
63 0           my $name_length ;
64 0           my $max_length =0;
65              
66 0           my $bold_red = qq() ;
67 0           my $blue = qq() ;
68 0           my $bold_blue = qq() ;
69 0           my $bold_green = qq() ;
70 0           my $color_over = "" ;
71 0           my $bold_color_over = "" ;
72              
73 0 0 0       unless ((defined $file_pattern) && $file_pattern) { $file_pattern = '.'; }
  0            
74              
75 0 0 0       unless ((defined $colour) && $colour) { $colour = 'b'; }
  0            
76 0 0         if ($colour !~ /^[bc]$/) { croak "ERROR: colour parameter must be either 'c' or 'b' or empty"; }
  0            
77 0 0         if ($colour eq 'b') { $colour = ''; }
  0            
78              
79 0 0 0       unless ((defined $digits) && $digits) { $digits = 2; }
  0            
80              
81 0           my $start_dir = cwd;
82 0           chdir $directory ;
83 0 0         opendir (my $dh, '.') || croak "ERROR: can't opendir $directory: $!";
84 0 0         my @files = grep { /$file_pattern/ && -f "./$_" } readdir($dh);
  0            
85             ## foreach $file (<*>) { $file{ $file } = 0 ; }
86 0           closedir $dh;
87 0           for (@files)
88             {
89 0           $file{$_} = 0;
90 0           $name_length = length ;
91 0 0         if ($name_length > $max_length) { $max_length = $name_length; }
  0            
92             }
93              
94             #------------------------------------------------------------------------------
95 0           my %count ; # HoH
96              
97 0           foreach $File_A (sort keys %file)
98             {
99 0           foreach $File_B (sort keys %file)
100             {
101 0 0         if ($File_B ge $File_A)
102             {
103 0           $count{$File_A}{$File_B} = &_CompareFiles ($File_A, $File_B) ;
104 0 0 0       if (($count{$File_A}{$File_B} > 9) && ($digits <= 2)) { $digits = 3; }
  0            
105 0 0 0       if (($count{$File_A}{$File_B} > 99) && ($digits <= 3)) { $digits = 4; }
  0            
106 0 0 0       if (($count{$File_A}{$File_B} > 999) && ($digits <= 4)) { $digits = 5; }
  0            
107             }
108             }
109             }
110             #------------------------------------------------------------------------------
111              
112 0           my %HoA ;
113 0           foreach (sort keys %file) { $HoA{ $_ } = [ split (//) ] ; }
  0            
114              
115 0           my $cnt = 0;
116 0           while ($cnt < $max_length)
117             {
118 0           $title .= " " x $max_length . " |" ;
119 0           foreach (sort keys %file)
120             {
121 0 0         if ( exists $HoA{ $_ }[$cnt] ) { $title .= sprintf " %${digits}s ", $HoA{ $_ }[$cnt] ; }
  0            
122 0           else { $title .= sprintf " %${digits}s ", " " ; }
123             }
124 0 0         unless ($cnt) { $title_length = length $title ; }
  0            
125 0           $title .= "\n" ;
126 0           $cnt ++;
127             }
128              
129 0           $header = sprintf "%s\n", "-" x $title_length ;
130 0           $header .= sprintf "%s", $title ;
131 0           $header .= sprintf "%s", "-" x $title_length ;
132 0 0         if ($colour) { print colored ['bold blue'], "$header\n" ; }
  0            
133 0           else { print "$header\n" ; }
134              
135 0           chdir $start_dir;
136              
137             #-----------------------------------------------------------------------------------
138 0           foreach $File_A (sort keys %file)
139             {
140 0           $field = sprintf "%-${max_length}s | ", $File_A ;
141 0 0         if ($colour) { print colored ['bold blue'], $field ; }
  0            
142 0           else { print $field ; }
143 0           foreach $File_B (sort keys %file)
144             {
145 0 0         if ($File_B ge $File_A)
146             {
147 0           $count = $count{$File_A}{$File_B} ;
148              
149 0           $field = sprintf "%${digits}d ", $count ;
150              
151 0 0         if ($count)
152             {
153 0 0         if ($colour) { print colored ['bold red'], $field; }
  0            
154 0           else { print $field; }
155             }
156             else
157             {
158 0 0         if ($colour) { print colored ['bold green'], $field; }
  0            
159 0           else { print $field ; }
160             }
161             }
162             else
163             {
164 0           printf "%${digits}s ", "-" ;
165             }
166             }
167 0           print "\n";
168             }
169             } # end of "sub multiple_file_diff"
170             1;
171              
172             __END__