Diff for /loncom/build/filecompare.pl between versions 1.4 and 1.7

version 1.4, 2001/11/16 20:06:08 version 1.7, 2001/11/17 21:29:24
Line 1 Line 1
 #!/usr/bin/perl  #!/usr/bin/perl
   
 # The LearningOnline Network witih CAPA  # The LearningOnline Network with CAPA
 #  #
 # filecompare.pl - script used to help probe and compare file statistics  # filecompare.pl - script used to help probe and compare file statistics
 #  #
Line 12 Line 12
 # $Id$  # $Id$
 ###  ###
   
   ###############################################################################
   ##                                                                           ##
   ## ORGANIZATION OF THIS PERL SCRIPT                                          ##
   ##                                                                           ##
   ## 1. Invocation                                                             ##
   ## 2. Notes                                                                  ##
   ## 3. Dependencies                                                           ##
   ## 4. Process command line arguments                                         ##
   ## 5. Process file/dir location arguments                                    ##
   ## 6. Process comparison restrictions                                        ##
   ## 7. Define output and measure subroutines                                  ##
   ## 8. Loop through files and calculate differences                           ##
   ## 9. Subroutines                                                            ##
   ## 10. POD (plain old documentation, CPAN style)                             ##
   ##                                                                           ##
   ###############################################################################
   
 # ------------------------------------------------------------------ Invocation  # ------------------------------------------------------------------ Invocation
 my $invocation=<<END;  my $invocation=<<END;
 filecompare.pl [ options ... ] [FILE1] [FILE2] [ restrictions ... ]  filecompare.pl [ options ... ] [FILE1] [FILE2] [ restrictions ... ]
Line 29  Options (before file/dir names): Line 46  Options (before file/dir names):
 -a show all files (with comparisons)  -a show all files (with comparisons)
 -q only show file names (based on first file/dir)  -q only show file names (based on first file/dir)
 -v verbose mode (default)  -v verbose mode (default)
   -bN buildmode (controls exit code of this script; 0 unless...)
      N=1: md5sum=same --> 1; cvstime<0 --> 2
      N=2: same as N=1 except without md5sum
      N=3: md5sum=same --> 1; age<0 --> 2
      N=4: cvstime>0 --> 2
 END  END
 unless (@ARGV) {  unless (@ARGV) {
     print $invocation;      print $invocation;
     exit 1;      exit 1;
 }  }
   
 # ----------------------------------------------------------------------- Notes  # ----------------------------------------------------------------------- Notes
 #  #
 # What are all the different ways to compare two files and how to look  # What are all the different ways to compare two files and how to look
Line 41  unless (@ARGV) { Line 64  unless (@ARGV) {
 #  #
 # Ways of comparison:  # Ways of comparison:
 #   existence similarity  #   existence similarity
 #   cvs time similarity (first argument treated as CVS source)  #   cvs time similarity (1st arg treated as CVS source; only for buildmode)
 #   age similarity (modification time)  #   age similarity (modification time)
 #   md5sum similarity  #   md5sum similarity
 #   size similarity (bytes)  #   size similarity (bytes)
Line 56  unless (@ARGV) { Line 79  unless (@ARGV) {
 #   size similarity (byte difference)  #   size similarity (byte difference)
 #   line count difference (integer)  #   line count difference (integer)
 #   number of different lines (integer)  #   number of different lines (integer)
 #     
 # Text output of comparison:  
 #   existence VALUE  
 #   cvstime VALUE  
 #   age VALUE  
 #   md5sum VALUE  
 #   size VALUE  
 #   lines VALUE  
 #   diffs VALUE  
 #  
 # Output of comparison:  
 #   exist  
 #   if md5sum not same, then different  
 #   if cvstime not 0, then older/newer  
 #   if age not 0, then older/newer  
 #   if size not 0, then bigger/smaller  
 #   if lines not 0, then more lines of code/less lines of code  
 #   if diffs not 0, then subtracted lines/added lines/changed lines  
   
   # ---------------------------------------------------------------- Dependencies
 # implementing from unix command line (assuming bash)  # implementing from unix command line (assuming bash)
 # md5sum, diff, wc -l  # md5sum, diff, wc -l
   
Line 85  unless (@ARGV) { Line 91  unless (@ARGV) {
 # -a show all files (with comparisons)  # -a show all files (with comparisons)
 # -q only show file names (based on first file/dir)  # -q only show file names (based on first file/dir)
 # -v verbose mode (default)  # -v verbose mode (default)
 # -b build/install mode (returns exitcode)  # -bN build/install mode (returns exitcode)
 my $verbose='1';  my $verbose='1';
 my $show='all';  my $show='all';
 my $buildmode=0;  my $buildmode=0;
 while (@ARGV) {  ALOOP: while (@ARGV) {
     my $flag;      my $flag;
     if ($ARGV[0]=~/^\-(\w)/) {      if ($ARGV[0]=~/^\-(\w)/) {
  $flag=$1;   $flag=$1;
    if ($flag eq 'b') {
       $ARGV[0]=~/^\-\w(\d)/;
       $buildmode=$1;
       shift @ARGV;
       next ALOOP;
    }
  shift @ARGV;   shift @ARGV;
       SWITCH: {        SWITCH: {
   $verbose=0, last SWITCH if $flag eq 'q';    $verbose=0, last SWITCH if $flag eq 'q';
Line 100  while (@ARGV) { Line 112  while (@ARGV) {
   $show='same', last SWITCH if $flag eq 'p';    $show='same', last SWITCH if $flag eq 'p';
   $show='different', last SWITCH if $flag eq 'n';    $show='different', last SWITCH if $flag eq 'n';
   $show='all', last SWITCH if $flag eq 'a';    $show='all', last SWITCH if $flag eq 'a';
   $buildmode=1, last SWITCH if $flag eq 'b';  
   $buildmode=2, last SWITCH if $flag eq 'B';  
   $buildmode=3, last SWITCH if $flag eq 'g';  
   $buildmode=4, last SWITCH if $flag eq 'G';  
   print($invocation), exit(1);    print($invocation), exit(1);
       }        }
     }      }
Line 114  while (@ARGV) { Line 122  while (@ARGV) {
 dowarn('Verbose: '.$verbose."\n");  dowarn('Verbose: '.$verbose."\n");
 dowarn('Show: '.$show."\n");  dowarn('Show: '.$show."\n");
   
   # ----------------------------------------- Process file/dir location arguments
 # FILE1 FILE2 or DIR1 DIR2  # FILE1 FILE2 or DIR1 DIR2
 my $loc1=shift @ARGV;  my $loc1=shift @ARGV;
 my $loc2=shift @ARGV;  my $loc2=shift @ARGV;
Line 139  dowarn('Processing for mode: '.$dirmode. Line 148  dowarn('Processing for mode: '.$dirmode.
 dowarn('Location #1: '.$loc1."\n");  dowarn('Location #1: '.$loc1."\n");
 dowarn('Location #2: '.$loc2."\n");  dowarn('Location #2: '.$loc2."\n");
   
   # --------------------------------------------- Process comparison restrictions
 # A list of space separated values (after the file/dir names)  # A list of space separated values (after the file/dir names)
 # can restrict the comparison.  # can restrict the comparison.
   my %rhash=('existence'=>0,'cvstime'=>0,'md5sum'=>0,'age'=>0,'size'=>0,
         'lines'=>0,'diffs'=>0);
 my %restrict;  my %restrict;
 while (@ARGV) {  while (@ARGV) {
     my $r=shift @ARGV;      my $r=shift @ARGV;
     if ($r eq 'existence' or      if ($rhash{$r}==0) {$restrict{$r}=1;}
  $r eq 'cvstime' or      else {print($invocation), exit(1);}
  $r eq 'md5sum' or  
  $r eq 'age' or  
  $r eq 'size' or  
  $r eq 'lines' or  
  $r eq 'diffs') {  
  $restrict{$r}=1;  
     }  
     else {  
  print($invocation), exit(1);  
     }  
 }  }
 if (%restrict) {  if (%restrict) {
     warn('Restricting comparison to: '.      dowarn('Restricting comparison to: '.
  join(' ',keys %restrict)."\n");   join(' ',keys %restrict)."\n");
 }  }
   
   # --------------------------------------- Define output and measure subroutines
 my %OUTPUT=(  my %OUTPUT=(
          'existence'=>( sub {print 'existence: '.@_[0]; return;}),           'existence'=>( sub {print 'existence: '.@_[0]; return;}),
  'md5sum'=>(sub {print 'md5sum: '.@_[0];return;}),   'md5sum'=>(sub {print 'md5sum: '.@_[0];return;}),
Line 206  my %MEASURE=( Line 209  my %MEASURE=(
  return ($rv1,$rv2); } ),   return ($rv1,$rv2); } ),
 );  );
   
 FLOP: foreach my $file (@files) {  FLOOP: foreach my $file (@files) {
     my $file1;      my $file1;
     my $file2;      my $file2;
     if ($dirmode eq 'directories') {      if ($dirmode eq 'directories') {
Line 229  FLOP: foreach my $file (@files) { Line 232  FLOP: foreach my $file (@files) {
         $diffs='n/a';          $diffs='n/a';
     }      }
     else {      else {
         my ($cvstime1,$cvstime2)=&{$MEASURE{'cvstime'}}($file1,$file2);   if ($buildmode) {
         $cvstime=$cvstime1-$cvstime2;      my ($cvstime1,$cvstime2)=&{$MEASURE{'cvstime'}}($file1,$file2);
       $cvstime=$cvstime1-$cvstime2;
    }
    else {
       $cvstime='n/a';
    }
         my ($age1,$age2)=&{$MEASURE{'age'}}($file1,$file2);          my ($age1,$age2)=&{$MEASURE{'age'}}($file1,$file2);
         $age=$age1-$age2;          $age=$age1-$age2;
         my ($md5sum1,$md5sum2)=&{$MEASURE{'md5sum'}}($file1,$file2);          my ($md5sum1,$md5sum2)=&{$MEASURE{'md5sum'}}($file1,$file2);
Line 238  FLOP: foreach my $file (@files) { Line 246  FLOP: foreach my $file (@files) {
             $md5sum='same';              $md5sum='same';
             $size=0;              $size=0;
             $lines=0;              $lines=0;
             $diffs=0;              $diffs='0:0';
  }   }
         elsif ($md5sum1 ne $md5sum2) {          elsif ($md5sum1 ne $md5sum2) {
             $md5sum='different';              $md5sum='different';
Line 259  FLOP: foreach my $file (@files) { Line 267  FLOP: foreach my $file (@files) {
         unless (@ks) {          unless (@ks) {
     @ks=('existence','cvstime','md5sum','age','size','lines','diffs');      @ks=('existence','cvstime','md5sum','age','size','lines','diffs');
  }   }
         FLOP2: for my $key (@ks) {          FLOOP2: for my $key (@ks) {
     if ($key eq 'existence') {      if ($key eq 'existence') {
  if ($existence ne 'yes:yes') {   if ($existence ne 'yes:yes') {
     $showflag=1;      $showflag=1;
Line 270  FLOP: foreach my $file (@files) { Line 278  FLOP: foreach my $file (@files) {
     $showflag=1;      $showflag=1;
  }   }
     }      }
     elsif ($key eq 'cvstime') {      elsif ($key eq 'cvstime' and $buildmode) {
  if ($cvstime!=0) {   if ($cvstime!=0) {
     $showflag=1;      $showflag=1;
  }   }
Line 296  FLOP: foreach my $file (@files) { Line 304  FLOP: foreach my $file (@files) {
  }   }
     }      }
     if ($showflag) {      if ($showflag) {
  last FLOP2;   last FLOOP2;
     }      }
         }          }
     }      }
Line 306  FLOP: foreach my $file (@files) { Line 314  FLOP: foreach my $file (@files) {
     @ks=('existence','md5sum','cvstime','age','size','lines','diffs');      @ks=('existence','md5sum','cvstime','age','size','lines','diffs');
  }   }
         my $showcount=length(@ks);          my $showcount=length(@ks);
         FLOP3: for my $key (@ks) {   $showcount-- unless $buildmode;
           FLOOP3: for my $key (@ks) {
     if ($key eq 'existence') {      if ($key eq 'existence') {
  if ($existence ne 'yes:yes') {   if ($existence ne 'yes:yes') {
     $showcount--;      $showcount--;
Line 317  FLOP: foreach my $file (@files) { Line 326  FLOP: foreach my $file (@files) {
     $showcount--;      $showcount--;
  }   }
     }      }
     elsif ($key eq 'cvstime') {      elsif ($key eq 'cvstime' and $buildmode) {
  if ($cvstime!=0) {   if ($cvstime!=0) {
     $showcount--;      $showcount--;
  }   }
Line 378  FLOP: foreach my $file (@files) { Line 387  FLOP: foreach my $file (@files) {
  }   }
     }      }
     elsif ($buildmode==4) {      elsif ($buildmode==4) {
         if ($cvstime>0) {   if ($existence=~/no$/) {
       exit(3);
    }
           elsif ($cvstime>0) {
     exit(2);      exit(2);
  }   }
    elsif ($existence=~/^no/) {
       exit(1);
    }
         else {          else {
     exit(0);      exit(0);
  }   }
     }      }
     print "$file";      if ($showflag) {
     if ($verbose==1) {   print "$file";
         print "\t";   if ($verbose==1) {
  print &{$OUTPUT{'existence'}}($existence);      print "\t";
         print "\t";      print &{$OUTPUT{'existence'}}($existence);
  print &{$OUTPUT{'cvstime'}}($cvstime);      print "\t";
         print "\t";      print &{$OUTPUT{'cvstime'}}($cvstime);
  print &{$OUTPUT{'age'}}($age);      print "\t";
         print "\t";      print &{$OUTPUT{'age'}}($age);
  print &{$OUTPUT{'md5sum'}}($md5sum);      print "\t";
         print "\t";      print &{$OUTPUT{'md5sum'}}($md5sum);
  print &{$OUTPUT{'size'}}($size);      print "\t";
         print "\t";      print &{$OUTPUT{'size'}}($size);
  print &{$OUTPUT{'lines'}}($lines);      print "\t";
         print "\t";      print &{$OUTPUT{'lines'}}($lines);
  print &{$OUTPUT{'diffs'}}($diffs);      print "\t";
       print &{$OUTPUT{'diffs'}}($diffs);
    }
    print "\n";
     }      }
     print "\n";  
 }  }
   
   # ----------------------------------------------------------------- Subroutines
   
 sub cvstime {  sub cvstime {
     my ($f)=@_;      my ($f)=@_;
     my $path; my $file;      my $path; my $file;
Line 442  sub dowarn { Line 461  sub dowarn {
     warn($msg) unless $buildmode;      warn($msg) unless $buildmode;
 }  }
   
   # ----------------------------------- POD (plain old documentation, CPAN style)
   
 =head1 NAME  =head1 NAME
   
 filecompare.pl - script used to help probe and compare file statistics  filecompare.pl - script used to help probe and compare file statistics

Removed from v.1.4  
changed lines
  Added in v.1.7


FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>
500 Internal Server Error

Internal Server Error

The server encountered an internal error or misconfiguration and was unable to complete your request.

Please contact the server administrator at root@localhost to inform them of the time this error occurred, and the actions you performed just before this error.

More information about this error may be available in the server error log.