Annotation of loncom/build/filecompare.pl, revision 1.1
1.1 ! harris41 1: #!/usr/bin/perl
! 2:
! 3: # Scott Harrison
! 4: # YEAR=2001
! 5: # 9/27, 10/24, 10/25
! 6:
! 7: my $invocation=<<END;
! 8: # ------------------------------------------------------------------ Invocation
! 9: # filecompare.pl FILE1 FILE2
! 10: # or
! 11: # filecompare.pl DIR1 DIR2
! 12: #
! 13: # A list of space separated values (after the file/dir names)
! 14: # can restrict the comparison.
! 15: # These values can be: existence, age, md5sum, size, lines, and/or diffs.
! 16: #
! 17: # Flags (before file/dir names):
! 18: # -p show all files the same
! 19: # -n show all files different
! 20: # -a show all files (with comparisons)
! 21: # -q only show file names (based on first file/dir)
! 22: # -v verbose mode (default)
! 23: END
! 24: unless (@ARGV) {
! 25: print $invocation;
! 26: exit 1;
! 27: }
! 28: # ----------------------------------------------------------------------- Notes
! 29: #
! 30: # What are all the different ways to compare two files and how to look
! 31: # at the differences?
! 32: #
! 33: # Ways of comparison:
! 34: # existence similarity
! 35: # age similarity (modification time)
! 36: # md5sum similarity
! 37: # size similarity (bytes)
! 38: # line count difference
! 39: # number of different lines
! 40: #
! 41: # Quantities of comparison:
! 42: # existence (no,yes); other values become 'n/a'
! 43: # age in seconds
! 44: # md5sum ("same" or "different")
! 45: # size similarity (byte difference)
! 46: # line count difference (integer)
! 47: # number of different lines (integer)
! 48: #
! 49: # Text output of comparison:
! 50: # existence VALUE
! 51: # age VALUE
! 52: # md5sum VALUE
! 53: # size VALUE
! 54: # lines VALUE
! 55: # diffs VALUE
! 56: #
! 57: # Output of comparison:
! 58: # exist
! 59: # if md5sum not same, then different
! 60: # if age not 0, then older/newer
! 61: # if size not 0, then bigger/smaller
! 62: # if lines not 0, then more lines of code/less lines of code
! 63: # if diffs not 0, then subtracted lines/added lines/changed lines
! 64:
! 65: # implementing from unix command line (assuming bash)
! 66: # md5sum, diff, wc -l
! 67:
! 68: # ---------------------------------------------- Process command line arguments
! 69: # Flags (before file/dir names):
! 70: # -p show all files the same
! 71: # -n show all files different
! 72: # -a show all files (with comparisons)
! 73: # -q only show file names (based on first file/dir)
! 74: # -v verbose mode (default)
! 75: my $verbose='1';
! 76: my $show='all';
! 77: while (@ARGV) {
! 78: my $flag;
! 79: if ($ARGV[0]=~/^\-(\w)/) {
! 80: $flag=$1;
! 81: shift @ARGV;
! 82: SWITCH: {
! 83: $verbose=0, last SWITCH if $flag eq 'q';
! 84: $verbose=1, last SWITCH if $flag eq 'v';
! 85: $show='same', last SWITCH if $flag eq 'p';
! 86: $show='different', last SWITCH if $flag eq 'n';
! 87: $show='all', last SWITCH if $flag eq 'a';
! 88: print($invocation), exit(1);
! 89: }
! 90: }
! 91: else {
! 92: last;
! 93: }
! 94: }
! 95: warn('Verbose: '.$verbose."\n");
! 96: warn('Show: '.$show."\n");
! 97:
! 98: # FILE1 FILE2 or DIR1 DIR2
! 99: my $loc1=shift @ARGV;
! 100: my $loc2=shift @ARGV;
! 101: my $dirmode='directories';
! 102: my @files;
! 103: unless ($loc1 and $loc2) {
! 104: print($invocation), exit(1);
! 105: }
! 106: if (-f $loc1) {
! 107: $dirmode='files';
! 108: @files=($loc1);
! 109: }
! 110: else {
! 111: if (-e $loc1) {
! 112: @files=`find $loc1 -type f`;
! 113: }
! 114: else {
! 115: @files=($loc1);
! 116: }
! 117: map {chomp; s/^$loc1\///; $_} @files;
! 118: }
! 119: warn('Processing for mode: '.$dirmode."\n");
! 120: warn('Location #1: '.$loc1."\n");
! 121: warn('Location #2: '.$loc2."\n");
! 122:
! 123: # A list of space separated values (after the file/dir names)
! 124: # can restrict the comparison.
! 125: my %restrict;
! 126: while (@ARGV) {
! 127: my $r=shift @ARGV;
! 128: if ($r eq 'existence' or
! 129: $r eq 'md5sum' or
! 130: $r eq 'age' or
! 131: $r eq 'size' or
! 132: $r eq 'lines' or
! 133: $r eq 'diffs') {
! 134: $restrict{$r}=1;
! 135: }
! 136: else {
! 137: print($invocation), exit(1);
! 138: }
! 139: }
! 140: if (%restrict) {
! 141: warn('Restricting comparison to: '.
! 142: join(' ',keys %restrict)."\n");
! 143: }
! 144:
! 145: my %OUTPUT=(
! 146: 'existence'=>(
! 147: sub {
! 148: print 'existence: '.@_[0];
! 149: return;
! 150: }
! 151: ),
! 152: 'md5sum'=>(
! 153: sub {
! 154: print 'md5sum: '.@_[0];
! 155: return;
! 156: }
! 157: ),
! 158: 'age'=>(
! 159: sub {
! 160: print 'age: '.@_[0];
! 161: return;
! 162: }
! 163: ),
! 164: 'size'=>(
! 165: sub {
! 166: print 'size: '.@_[0];
! 167: return;
! 168: }
! 169: ),
! 170: 'lines'=>(
! 171: sub {
! 172: print 'lines: '.@_[0];
! 173: return;
! 174: }
! 175: ),
! 176: 'diffs'=>(
! 177: sub {
! 178: print 'diffs: '.@_[0];
! 179: return;
! 180: }
! 181: ),
! 182: );
! 183:
! 184: my %MEASURE=(
! 185: 'existence' => (
! 186: sub {
! 187: my ($file1,$file2)=@_;
! 188: my $rv1=(-e $file1)?'yes':'no';
! 189: my $rv2=(-e $file2)?'yes':'no';
! 190: return ($rv1,$rv2);
! 191: }
! 192: ),
! 193: 'md5sum'=>(
! 194: sub {
! 195: my ($file1,$file2)=@_;
! 196: my $rv1=`md5sum $file1`; chop $rv1;
! 197: my $rv2=`md5sum $file2`; chop $rv2;
! 198: return ($rv1,$rv2);
! 199: }
! 200: ),
! 201: 'age'=>(
! 202: sub {
! 203: my ($file1,$file2)=@_;
! 204: my @a=stat($file1); my $rv1=$a[10];
! 205: @a=stat($file2); my $rv2=$a[10];
! 206: return ($rv1,$rv2);
! 207: }
! 208: ),
! 209: 'size'=>(
! 210: sub {
! 211: my ($file1,$file2)=@_;
! 212: my @a=stat($file1); my $rv1=$a[7];
! 213: @a=stat($file2); my $rv2=$a[7];
! 214: return ($rv1,$rv2);
! 215: }
! 216: ),
! 217: 'lines'=>(
! 218: sub {
! 219: my ($file1,$file2)=@_;
! 220: my $rv1=`wc -l $file1`; chop $rv1;
! 221: my $rv2=`wc -l $file2`; chop $rv2;
! 222: return ($rv1,$rv2);
! 223: }
! 224: ),
! 225: 'diffs'=>(
! 226: sub {
! 227: my ($file1,$file2)=@_;
! 228: my $rv1=`diff $file1 $file2 | grep '^<' | wc -l`;
! 229: chop $rv1; $rv1=~s/^\s+//; $rv1=~s/\s+$//;
! 230: my $rv2=`diff $file1 $file2 | grep '^>' | wc -l`;
! 231: chop $rv2; $rv2=~s/^\s+//; $rv2=~s/\s+$//;
! 232: return ($rv1,$rv2);
! 233: }
! 234: ),
! 235: );
! 236:
! 237: FLOP: foreach my $file (@files) {
! 238: my $file1;
! 239: my $file2;
! 240: if ($dirmode eq 'directories') {
! 241: $file1=$loc1.'/'.$file;
! 242: $file2=$loc2.'/'.$file;
! 243: }
! 244: else {
! 245: $file1=$loc1;
! 246: $file2=$loc2;
! 247: }
! 248: my ($existence1,$existence2)=&{$MEASURE{'existence'}}($file1,$file2);
! 249: my $existence=$existence1.':'.$existence2;
! 250: my ($md5sum,$age,$size,$lines,$diffs);
! 251: if ($existence1 eq 'no' or $existence2 eq 'no') {
! 252: $md5sum='n/a';
! 253: $age='n/a';
! 254: $size='n/a';
! 255: $lines='n/a';
! 256: $diffs='n/a';
! 257: }
! 258: else {
! 259: my ($age1,$age2)=&{$MEASURE{'age'}}($file1,$file2);
! 260: $age=$age1-$age2;
! 261: my ($md5sum1,$md5sum2)=&{$MEASURE{'md5sum'}}($file1,$file2);
! 262: if ($md5sum1 == $md5sum2) {
! 263: $md5sum='same';
! 264: $size=0;
! 265: $lines=0;
! 266: $diffs=0;
! 267: }
! 268: elsif ($md5sum1 != $md5sum2) {
! 269: $md5sum='different';
! 270: my ($size1,$size2)=&{$MEASURE{'size'}}($file1,$file2);
! 271: $size=$size1-$size2;
! 272: my ($lines1,$lines2)=&{$MEASURE{'lines'}}($file1,$file2);
! 273: $lines=$lines1-$lines2;
! 274: my ($diffs1,$diffs2)=&{$MEASURE{'diffs'}}($file1,$file2);
! 275: $diffs=$diffs1.':'.$diffs2;
! 276: }
! 277: }
! 278: my $showflag=0;
! 279: if ($show eq 'all') {
! 280: $showflag=1;
! 281: }
! 282: if ($show eq 'different') {
! 283: my @ks=(keys %restrict);
! 284: unless (@ks) {
! 285: @ks=('existence','md5sum','age','size','lines','diffs');
! 286: }
! 287: FLOP2: for my $key (@ks) {
! 288: if ($key eq 'existence') {
! 289: if ($existence ne 'yes:yes') {
! 290: $showflag=1;
! 291: }
! 292: }
! 293: elsif ($key eq 'md5sum') {
! 294: if ($md5sum ne 'same') {
! 295: $showflag=1;
! 296: }
! 297: }
! 298: elsif ($key eq 'age') {
! 299: if ($age!=0) {
! 300: $showflag=1;
! 301: }
! 302: }
! 303: elsif ($key eq 'size') {
! 304: if ($size!=0) {
! 305: $showflag=1;
! 306: }
! 307: }
! 308: elsif ($key eq 'lines') {
! 309: if ($lines!=0) {
! 310: $showflag=1;
! 311: }
! 312: }
! 313: elsif ($key eq 'diffs') {
! 314: if ($diffs ne '0:0') {
! 315: $showflag=1;
! 316: }
! 317: }
! 318: if ($showflag) {
! 319: last FLOP2;
! 320: }
! 321: }
! 322: }
! 323: elsif ($show eq 'same') {
! 324: my @ks=(keys %restrict);
! 325: unless (@ks) {
! 326: @ks=('existence','md5sum','age','size','lines','diffs');
! 327: }
! 328: my $showcount=length(@ks);
! 329: FLOP3: for my $key (@ks) {
! 330: if ($key eq 'existence') {
! 331: if ($existence ne 'yes:yes') {
! 332: $showcount--;
! 333: }
! 334: }
! 335: elsif ($key eq 'md5sum') {
! 336: if ($md5sum ne 'same') {
! 337: $showcount--;
! 338: }
! 339: }
! 340: elsif ($key eq 'age') {
! 341: if ($age!=0) {
! 342: $showcount--;
! 343: }
! 344: }
! 345: elsif ($key eq 'size') {
! 346: if ($size!=0) {
! 347: $showcount--;
! 348: }
! 349: }
! 350: elsif ($key eq 'lines') {
! 351: if ($lines!=0) {
! 352: $showcount--;
! 353: }
! 354: }
! 355: elsif ($key eq 'diffs') {
! 356: if ($diffs ne '0:0') {
! 357: $showcount--;
! 358: }
! 359: }
! 360: }
! 361: if ($showcount==0) {
! 362: $showflag=1;
! 363: }
! 364: }
! 365: print "$file";
! 366: if ($verbose==1) {
! 367: print "\t";
! 368: print &{$OUTPUT{'existence'}}($existence);
! 369: print "\t";
! 370: print &{$OUTPUT{'age'}}($age);
! 371: print "\t";
! 372: print &{$OUTPUT{'md5sum'}}($md5sum);
! 373: print "\t";
! 374: print &{$OUTPUT{'size'}}($size);
! 375: print "\t";
! 376: print &{$OUTPUT{'lines'}}($lines);
! 377: print "\t";
! 378: print &{$OUTPUT{'diffs'}}($diffs);
! 379: }
! 380: print "\n";
! 381: }
! 382:
! 383:
! 384:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>