FreeCalypso > hg > tcs211-c139
comparison g23m/system/busyb/tools/cmp_maks.pl @ 0:509db1a7b7b8
initial import: leo2moko-r1
author | Space Falcon <falcon@ivan.Harhan.ORG> |
---|---|
date | Mon, 01 Jun 2015 03:24:05 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
-1:000000000000 | 0:509db1a7b7b8 |
---|---|
1 #!perl -w | |
2 | |
3 # This script compares similar named control files (makefile, *.mak *.mk *.pl) in two directories. | |
4 # | |
5 # | |
6 # The script expects the utility diff to be in the path. | |
7 # | |
8 # The syntax of each line in the configuration file is the following (comments start with #) | |
9 # <left_directory> <right_directory> | |
10 # | |
11 # Attention: file and directory names MUST NOT contain spaces or other white space | |
12 use strict; | |
13 | |
14 use File::Glob ':glob'; | |
15 use File::Spec; | |
16 | |
17 # define global variables | |
18 my $cnfFile=$ARGV[0]; | |
19 my $logFile="cmp_report.log"; | |
20 my $firstComment = 1; | |
21 | |
22 # find the config file | |
23 @ARGV == 1 || die "Usage:\tcmp_maks.pl config_file\n"; | |
24 | |
25 # check for diff.exe | |
26 system("diff -v > cmp_report.log 2>&1") && die "ERROR: diff must be in the path \n"; | |
27 | |
28 # open the config file | |
29 # | |
30 open (IN,"<$cnfFile")||die "Can't open $cnfFile !\n"; | |
31 | |
32 # parse the config file | |
33 # | |
34 my $line; | |
35 | |
36 while(defined($line = <IN>)) | |
37 { | |
38 # reset variable for next loop | |
39 my $leftDir; | |
40 my $rightDir; | |
41 my @files; | |
42 my @excludedFiles; | |
43 my @explicitFiles; | |
44 | |
45 # ignore comments (starting with #) | |
46 if($line =~ /^\s*\#/) { | |
47 # print out special comments starting with ## | |
48 if ($' =~ /^\s*\#/) { | |
49 if ($firstComment == 1) { | |
50 print "\n"; | |
51 $firstComment = 0; | |
52 } | |
53 print "[COMMENT] $'"; | |
54 } | |
55 else { | |
56 $firstComment = 1; | |
57 } | |
58 next; | |
59 } | |
60 | |
61 # ignore empty lines | |
62 if($line =~ /^\s+$/) { | |
63 next; | |
64 } | |
65 | |
66 # remove trailing \n | |
67 chomp($line); | |
68 | |
69 # put everything SEPARATED BY WHITESPACE in an array | |
70 @files = split(/\s+/,$line); | |
71 | |
72 # find the directories (and remove them from the array) | |
73 $leftDir = $files[0]; shift(@files); | |
74 $rightDir = $files[0]; shift(@files); | |
75 | |
76 # check whether the directories are wildcards | |
77 # if ($leftDir =~ s/(.*?)(\/\*)/$1/ && $rightDir =~ s/(.*?)(\/\*)/$1/ ) { | |
78 if ($leftDir =~ s:(.*?)([/\\]\*):$1: && $rightDir =~ s:(.*?)([/\\]\*):$1: ) { | |
79 my @dirs; | |
80 my @leftDirs; | |
81 my @rightDirs; | |
82 | |
83 # check whether the parent directories exist | |
84 (-e $leftDir) || die "Directory $leftDir does not exist !\n"; | |
85 (-e $rightDir) || die "Directory $rightDir does not exist !\n"; | |
86 | |
87 # find all sub directories left | |
88 @dirs = bsd_glob("$leftDir/*"); | |
89 @dirs = sort @dirs; | |
90 foreach (@dirs) { | |
91 my ($drv,$dir); | |
92 ($drv,$dir,$_) = File::Spec->splitpath($_); | |
93 if (-d "$leftDir/$_") { | |
94 push (@leftDirs, "$_"); | |
95 } | |
96 } | |
97 | |
98 # reset variables | |
99 splice (@dirs); | |
100 | |
101 # find all sub directories right | |
102 @dirs = bsd_glob("$rightDir/*"); | |
103 @dirs = sort @dirs; | |
104 foreach (@dirs) { | |
105 my ($drv,$dir); | |
106 ($drv,$dir,$_) = File::Spec->splitpath($_); | |
107 if (-d "$rightDir/$_") { | |
108 push (@rightDirs, "$_"); | |
109 } | |
110 } | |
111 | |
112 # create a hash that uses the filename as the key and an integer as value | |
113 # to find those directories that are found in both directories or only in one | |
114 # of them | |
115 my %count; | |
116 my $element; | |
117 | |
118 foreach $element (@leftDirs) { $count{$element}++; } | |
119 foreach $element (@rightDirs) { $count{$element}+=2; } | |
120 | |
121 # delete used arrays for later reuse | |
122 splice (@dirs); | |
123 splice (@leftDirs); | |
124 splice (@rightDirs); | |
125 | |
126 foreach $element (keys %count) { | |
127 if ($count{$element} == 1) { | |
128 push @leftDirs, $element; | |
129 } | |
130 elsif ($count{$element} == 2) { | |
131 push @rightDirs, $element; | |
132 } | |
133 elsif ($count{$element} == 3) { | |
134 push @dirs, $element; | |
135 } | |
136 } | |
137 print "[LEFT ] $leftDir/*\n"; | |
138 print "[RIGHT ] $rightDir/*\n"; | |
139 foreach $element (sort(@leftDirs)) { | |
140 print "[WARNING - directory missing right] $element\n"; | |
141 } | |
142 foreach $element (sort(@rightDirs)) { | |
143 print "[WARNING - directory missing left] $element\n"; | |
144 } | |
145 print "\n"; | |
146 foreach $element (sort(@dirs)) { | |
147 # ignore some commonly used version files | |
148 splice (@excludedFiles); | |
149 # push (@excludedFiles,"ver.obj"); | |
150 # push (@excludedFiles,"$element\_version.obj"); | |
151 cmp_dirs ("$leftDir/$element", "$rightDir/$element", \@excludedFiles, \@explicitFiles); | |
152 } | |
153 | |
154 } | |
155 else { | |
156 # check whether the directories exist | |
157 (-e $leftDir) || die "Directory $leftDir does not exist !\n"; | |
158 (-e $rightDir) || die "Directory $rightDir does not exist !\n"; | |
159 | |
160 if (defined($files[0])) { | |
161 # some files are are specified or excluded explicitely | |
162 foreach (@files) { | |
163 if (/^-/) { | |
164 push(@excludedFiles,$'); | |
165 } | |
166 elsif(/^\+/) { | |
167 (-e "$leftDir/$'") || die "File $rightDir/$' does not exist !\n"; | |
168 (-e "$rightDir/$'") || die "File $rightDir/$' does not exist !\n"; | |
169 push(@explicitFiles,$'); | |
170 } | |
171 } | |
172 } | |
173 cmp_dirs ($leftDir, $rightDir, \@excludedFiles, \@explicitFiles); | |
174 } | |
175 | |
176 } | |
177 | |
178 | |
179 # close the config file | |
180 # | |
181 close IN; | |
182 | |
183 # delete the log file | |
184 # | |
185 #unlink($logFile); | |
186 | |
187 ################### | |
188 # | |
189 sub cmp_dirs { | |
190 | |
191 my $leftDir = $_[0]; | |
192 my $rightDir = $_[1]; | |
193 my @excludedFiles = @{$_[2]}; | |
194 my @explicitFiles = @{$_[3]}; | |
195 | |
196 my @files; | |
197 my @leftFiles; | |
198 my @rightFiles; | |
199 my $element; | |
200 | |
201 if (defined($explicitFiles[0])) { | |
202 @files = @explicitFiles; | |
203 } | |
204 else { | |
205 @leftFiles = bsd_glob("$leftDir/*.mk"); | |
206 push (@leftFiles, bsd_glob("$leftDir/*.mak")); | |
207 push (@leftFiles, bsd_glob("$leftDir/*makefile")); | |
208 push (@leftFiles, bsd_glob("$leftDir/*.pl")); | |
209 | |
210 @leftFiles = sort @leftFiles; | |
211 foreach (@leftFiles) { | |
212 my ($drv,$dir); | |
213 ($drv,$dir,$_) = File::Spec->splitpath($_); | |
214 } | |
215 | |
216 @rightFiles = bsd_glob("$rightDir/*.mk"); | |
217 push (@rightFiles, bsd_glob("$rightDir/*.mak")); | |
218 push (@rightFiles, bsd_glob("$rightDir/*makefile")); | |
219 push (@rightFiles, bsd_glob("$rightDir/*.pl")); | |
220 @rightFiles = sort @rightFiles; | |
221 foreach (@rightFiles) { | |
222 my ($drv,$dir); | |
223 ($drv,$dir,$_) = File::Spec->splitpath($_); | |
224 } | |
225 | |
226 # create a hash that uses the filename as the key and an integer as value | |
227 # to find those files that are found in both directories or only in one | |
228 # of them | |
229 my %count; | |
230 | |
231 foreach $element (@leftFiles) { $count{$element}++; } | |
232 foreach $element (@rightFiles) { $count{$element}+=2; } | |
233 | |
234 # delete used arrays for later reuse | |
235 splice (@files); | |
236 splice (@leftFiles); | |
237 splice (@rightFiles); | |
238 | |
239 # remove all exclude files | |
240 foreach $element (@excludedFiles) { | |
241 if (exists($count{$element})) { | |
242 # print "Skipping file: $element \n"; | |
243 delete($count{$element}); | |
244 } | |
245 } | |
246 | |
247 foreach $element (keys %count) { | |
248 if ($count{$element} == 1) { | |
249 push @leftFiles, $element; | |
250 } | |
251 elsif ($count{$element} == 2) { | |
252 push @rightFiles, $element; | |
253 } | |
254 elsif ($count{$element} == 3) { | |
255 push @files, $element; | |
256 } | |
257 } | |
258 } | |
259 | |
260 | |
261 print "[LEFT ] $leftDir/\n"; | |
262 print "[RIGHT] $rightDir/\n"; | |
263 | |
264 if(defined($leftFiles[0]) || defined($rightFiles[0]) ) { | |
265 my %tmp; | |
266 | |
267 foreach $element (@leftFiles) { $tmp{$element} = " [WARNING - file missing right] $element\n" }; | |
268 foreach $element (@rightFiles) { $tmp{$element} = " [WARNING - file missing left ] $element\n"; } | |
269 | |
270 foreach $element (sort(keys %tmp)) { | |
271 print $tmp{$element}; | |
272 } | |
273 } | |
274 | |
275 | |
276 foreach (sort(@files)) { | |
277 if (system("cmp $leftDir/$_ $rightDir/$_ >>$logFile 2>&1")) { | |
278 print " [ERROR - files differ] $_\n"; | |
279 print " [Diff'ing files] $leftDir/$_ $rightDir/$_\n"; | |
280 | |
281 my $leftFile = "$leftDir/$_"; | |
282 $leftFile =~ s:/:\\:g ; | |
283 my $rightFile = "$rightDir/$_"; | |
284 $rightFile =~ s:/:\\:g ; | |
285 | |
286 open(DIFFOUT, '-|', "diff -I ^#.*\$ -t -w -y --suppress-common-lines --width=120 $leftFile $rightFile"); | |
287 #indent output | |
288 while (defined($line = <DIFFOUT>)) { | |
289 print " $line"; | |
290 } | |
291 | |
292 close(DIFFOUT); | |
293 print " \n"; | |
294 | |
295 } | |
296 } | |
297 print "\n"; | |
298 } |