trick/bin/trick_verify_checksums

81 lines
2.2 KiB
Plaintext
Raw Normal View History

2015-02-26 15:02:31 +00:00
#!/usr/bin/perl -w
# $Id: trick_verify_checksums 3231 2013-09-17 19:41:41Z alin $
use strict;
use File::Find;
use Cwd;
my ( $s1 , $s2 , $name ) ;
my ( %checksum ) ;
my $num_diff = 0 ;
my $cwd = cwd() ;
# What kinda name is bm build?
sub _bm_build {
my $condition = shift;
my @regexp = @_; # this MUST not be local(); need my()
my $expr = join $condition => map { "m/\$regexp[$_]/o" } (0..$#regexp);
my $match_func = eval "sub { $expr }";
die if $@; # propagate $@; this shouldn't happen!
return $match_func;
}
# BM or else what???
sub bm_or { _bm_build('||', @_) }
my $ignore_file = bm_or qw{ checksums io_src swig \.svn docs xml(/|$) \.\.\. object compout
lib_[DRIS] \.[oa]$ \.clex$ _lex\.c \.y.[ch] \.l.c Master.cpp
bin_ mini_catalog catalog/ dr_name_parser.[ch]
input_parser.[ch] ref_parser.[ch] monte_parser.[ch]
\.orig } ;
my $trick_checksums = "$ENV{TRICK_HOME}/bin/checksums" ;
chdir "$ENV{TRICK_HOME}" ;
open CHECK, "$trick_checksums" or die "could not open $trick_checksums" ;
while (<CHECK>) {
( $s1 , $s2 , $name ) = split ;
$checksum{$name} = { s1 => $s1 , s2 => $s2 } ;
}
close CHECK ;
find(\&verify_checksum, '.');
exit($num_diff) ;
sub verify_checksum {
my $curr_name = $_ ;
my $name = $File::Find::name ;
my $sum ;
my ($s1 , $s2) ;
my $full_name ;
$_ = $name ;
return if ( &$ignore_file ) ;
($full_name = $name) =~ s!^\./!$ENV{TRICK_HOME}/! ;
if ( $full_name ne "" and ! -d $full_name ) {
if ( $^O eq "linux" ) {
$sum = `/usr/bin/sum -s $full_name` ;
}
elsif ( $^O eq "darwin" ) {
$sum = `/usr/bin/cksum -o 2 $full_name`
}
else {
$sum = `/usr/bin/sum $full_name`
}
($s1 , $s2) = $sum =~ /(\d+)\s+(\d+)/ ;
#printf "%5d %10d %s\n" , $s1 , $s2 , $name ;
if ( ! exists $checksum{$name} ) {
print "New file $name\n" ;
$num_diff++ ;
}
elsif ( $s1 != $checksum{$name}{s1} or
$s2 != $checksum{$name}{s2} ) {
print "Checksum difference for $name\n" ;
$num_diff++ ;
}
}
}