version 1.8, 2001/11/17 23:00:10
|
version 1.12, 2002/04/27 21:12:18
|
Line 1
|
Line 1
|
#!/usr/bin/perl |
#!/usr/bin/perl |
|
|
# The LearningOnline Network with 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 |
# |
# |
|
# $Id$ |
|
# |
|
# Copyright Michigan State University Board of Trustees |
|
# |
|
# This file is part of the LearningOnline Network with CAPA (LON-CAPA). |
|
# |
|
# LON-CAPA is free software; you can redistribute it and/or modify |
|
# it under the terms of the GNU General Public License as published by |
|
# the Free Software Foundation; either version 2 of the License, or |
|
# (at your option) any later version. |
|
# |
|
# LON-CAPA is distributed in the hope that it will be useful, |
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
# GNU General Public License for more details. |
|
# |
|
# You should have received a copy of the GNU General Public License |
|
# along with LON-CAPA; if not, write to the Free Software |
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA |
|
# |
|
# /home/httpd/html/adm/gpl.txt |
|
# |
|
# http://www.lon-capa.org/ |
|
# |
# YEAR=2001 |
# YEAR=2001 |
# 9/27, 10/24, 10/25, 11/4 Scott Harrison |
# 9/27, 10/24, 10/25, 11/4 Scott Harrison |
# 11/14 Guy Albertelli |
# 11/14 Guy Albertelli |
# 11/16,11/17 Scott Harrison |
# 11/16,11/17 Scott Harrison |
|
# 12/3,12/5 Scott Harrison |
# |
# |
# $Id$ |
|
### |
### |
|
|
############################################################################### |
############################################################################### |
Line 34 my $invocation=<<END;
|
Line 57 my $invocation=<<END;
|
filecompare.pl [ options ... ] [FILE1] [FILE2] [ restrictions ... ] |
filecompare.pl [ options ... ] [FILE1] [FILE2] [ restrictions ... ] |
or |
or |
filecompare.pl [ options ... ] [DIR1] [DIR2] [ restrictions ... ] |
filecompare.pl [ options ... ] [DIR1] [DIR2] [ restrictions ... ] |
|
or |
|
filecompare.pl [ options ... ] -s TARGET=[target] SOURCE=[source] MODE=[mode] |
|
LOC1 LOC2 |
|
|
Restrictions: a list of space separated values (after the file/dir names) |
Restrictions: a list of space separated values (after the file/dir names) |
can restrict the comparison. |
can restrict the comparison. |
Line 51 Options (before file/dir names):
|
Line 77 Options (before file/dir names):
|
N=2: same as N=1 except without md5sum |
N=2: same as N=1 except without md5sum |
N=3: md5sum=same --> 1; age<0 --> 2 |
N=3: md5sum=same --> 1; age<0 --> 2 |
N=4: cvstime>0 --> 2 |
N=4: cvstime>0 --> 2 |
|
|
|
The third way to pass arguments is set by the -s flag. |
|
filecompare.pl -s SOURCE=[source] TARGET=[target] MODE=[mode] LOC1 LOC2 |
|
|
|
TARGET corresponds to the root path of LOC2. SOURCE corresponds to |
|
the root path of LOC1. MODE can either be file, directory, link, or fileglob. |
|
|
END |
END |
unless (@ARGV) { |
unless (@ARGV) { |
print $invocation; |
print $invocation; |
Line 92 unless (@ARGV) {
|
Line 125 unless (@ARGV) {
|
# -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 build/install mode (returns exitcode) |
# -bN build/install mode (returns exitcode) |
|
# -s status checking mode for lpml |
|
|
my $verbose='1'; |
my $verbose='1'; |
my $show='all'; |
my $show='all'; |
my $buildmode=0; |
my $buildmode=0; |
|
my $statusmode=0; |
ALOOP: while (@ARGV) { |
ALOOP: while (@ARGV) { |
my $flag; |
my $flag; |
if ($ARGV[0]=~/^\-(\w)/) { |
if ($ARGV[0]=~/^\-(\w)/) { |
Line 112 ALOOP: while (@ARGV) {
|
Line 148 ALOOP: 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'; |
|
$statusmode=1, last SWITCH if $flag eq 's'; |
print($invocation), exit(1); |
print($invocation), exit(1); |
} |
} |
} |
} |
Line 122 ALOOP: while (@ARGV) {
|
Line 159 ALOOP: while (@ARGV) {
|
dowarn('Verbose: '.$verbose."\n"); |
dowarn('Verbose: '.$verbose."\n"); |
dowarn('Show: '.$show."\n"); |
dowarn('Show: '.$show."\n"); |
|
|
|
my @files; |
|
my $loc1; |
|
my $loc2; |
|
my $dirmode='directories'; |
|
# ----------------------------------------- If status checking mode for lpml |
|
my ($sourceroot,$targetroot,$mode,$sourceglob,$targetglob); |
|
my ($source,$target); |
|
if ($statusmode==1) { |
|
($sourceroot,$targetroot,$mode,$sourceglob,$targetglob)=splice(@ARGV,0,5); |
|
$targetroot.='/' if $targetroot!~/\/$/; |
|
$sourceroot=~s/^SOURCE\=//; |
|
$targetroot=~s/^TARGET\=//; |
|
$source=$sourceroot.'/'.$sourceglob; |
|
$target=$targetroot.''.$targetglob; |
|
# print "SOURCE: $source\n"; |
|
# print "TARGET: $target\n"; |
|
if ($mode eq 'MODE=fileglob') { |
|
$loc1=$source;$loc1=~s/\/[^\/]*$// if length($loc1)>2; |
|
$loc2=$target;$loc2=~s/\/[^\/]*$// if length($loc2)>2; |
|
@files=map {s/^$loc1\///;$_} glob($source); |
|
$dirmode='directories'; |
|
} |
|
elsif ($mode eq 'MODE=file') { |
|
$loc1=$source; |
|
$loc2=$target; |
|
$dirmode='files'; |
|
@files=($loc1); |
|
} |
|
} |
|
else { |
|
|
# ----------------------------------------- Process file/dir location arguments |
# ----------------------------------------- Process file/dir location arguments |
# FILE1 FILE2 or DIR1 DIR2 |
# FILE1 FILE2 or DIR1 DIR2 |
my $loc1=shift @ARGV; |
$loc1=shift @ARGV; |
my $loc2=shift @ARGV; |
$loc2=shift @ARGV; |
my $dirmode='directories'; |
|
my @files; |
|
unless ($loc1 and $loc2) { |
unless ($loc1 and $loc2) { |
|
print "LOC1: $loc1\nLOC2: $loc2\n"; |
print($invocation), exit(1); |
print($invocation), exit(1); |
} |
} |
if (-f $loc1) { |
if (-f $loc1) { |
Line 147 else {
|
Line 214 else {
|
dowarn('Processing for mode: '.$dirmode."\n"); |
dowarn('Processing for mode: '.$dirmode."\n"); |
dowarn('Location #1: '.$loc1."\n"); |
dowarn('Location #1: '.$loc1."\n"); |
dowarn('Location #2: '.$loc2."\n"); |
dowarn('Location #2: '.$loc2."\n"); |
|
} |
# --------------------------------------------- Process comparison restrictions |
# --------------------------------------------- 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. |
Line 436 sub cvstime {
|
Line 503 sub cvstime {
|
} |
} |
my $cvstime; |
my $cvstime; |
if ($buildmode!=3) { |
if ($buildmode!=3) { |
my $entry=`grep '^/$file/' ${path}CVS/Entries` or |
my $entry=`grep '^/$file/' ${path}CVS/Entries 2>/dev/null`; |
die('*** ERROR *** cannot grep against '.${path}. |
# or |
'CVS/Entries for ' .$file . "\n"); |
# die('*** WARNING *** cannot grep against '.${path}. |
my @fields=split(/\//,$entry); |
# 'CVS/Entries for ' .$file . "\n"); |
$cvstime=`date -d '$fields[3] UTC' --utc +"%s"`; |
if ($entry) { |
chomp $cvstime; |
my @fields=split(/\//,$entry); |
|
$cvstime=`date -d '$fields[3] UTC' --utc +"%s"`; |
|
chomp $cvstime; |
|
} |
|
else { |
|
$cvstime='n/a'; |
|
} |
} |
} |
else { |
else { |
$cvstime='n/a'; |
$cvstime='n/a'; |