windows-nt/Source/XPSP1/NT/tools/postbuildscripts/ntcrcgen.pl
2020-09-26 16:20:57 +08:00

198 lines
5.5 KiB
Perl

# script for crc file generation
# version : 1.1
# date : 5/17/99
# author : hiroi
# 1/12/00 - updated by jfeltis
#ARGV[0] : src prop server path : \\ntdev\\release\main\usa\2197\x86fre
#ARGV[1] : dst path : \\ntbldsrv\\crc$
#ARGV[2], ARGV[3], ARGV[4]... : products : pro, bla, sbs, srv, ent, ads
%Products = (
'pro' => 0, 'bla' => 0, 'sbs' => 0, 'srv' => 0, 'ads' => 0, 'dtc' => 0
);
@Products = (
'pro', 'bla', 'sbs', 'srv', 'ads', 'dtc'
);
$SleepTime = 300; # 5 minutes
$RetryCount= 100; # 100 times
#main
# argument check
if( $#ARGV < 2 ) { &usage; exit(1); }
$SrcBasePath;
$DstPath;
$Error = &argcheck;
die $Error if ($Error ne '');
print "src is $SrcBasePath\n";
print "dst is $DstPath\n";
$LogFileName = &MakeLogFileName($SrcBasePath, $DstPath);
$BaseCRCFileName= &MakeBaseCRCFileName($SrcBasePath, $DstPath);
# if the log file exists then another release server is working on the CRCs, so exit
if( -e $LogFileName ) {print "$LogFileName exists\n"; exit 0; }
#print "doing CRC for $ARGV[0]\n";
open(LOGFILE, "> $LogFileName");
select( (select(LOGFILE), $|=1)[0] ); # auto flush LOGFILE
foreach $Product (@Products) {
if( $Products{$Product} ) {
print "compute CRC for $Product\n";
$SrcPath = "$SrcBasePath\\$Product";
$CRCFileName1 = "$BaseCRCFileName\_$Product\.crc";
$CRCFileName2 = "$BaseCRCFileName\_$Product\.txt";
$CompressedCRCFileName = "$BaseCRCFileName\_$Product\.tx\_";
if( -e $SrcPath && -d_ ) { # if src dir exists
$rc = &DoCommand( "crcwalk $SrcPath > $CRCFileName1") &&
&ModifyCRCFile($CRCFileName1,$CRCFileName2,$Product)&&
&DoCommand( "compress -r $CRCFileName2 > nul") &&
&GetCRCofCRCFile($CompressedCRCFileName) &&
&DoCommand( "del /F/Q $CRCFileName2 > nul");
if( $rc ) {
&LogOutput( "$CRCFileName2 was generated and compressed successfully\n" );
} else {
&LogOutput( "Error:Couldn't generate CRC file $SrcPath\n" );
}
} else {
&LogOutput( "Error:Target product $Product is not found at $SrcBasePath\n" );
}
}
}
close(LOGFILE);
#end main
sub DoCommand {
local( $command ) = @_;
do {
$rc = !system($command);
unless($rc) {
&LogOutput( "Retrying $command\n");
sleep($SleepTime);
$RetryCount--;
}
} until( $rc || !$RetryCount );
$rc;
}
# param1 Input file name
# param2 Output file name
# param3 Product name
# This routine modify the each line of the crc file(input file)
# \\kkntx86t\2040.usa.x86\chk.pub\ddk\inc\afilter.h 0x01BE1502 89FB5DD4 7313 0x307989D0
# to like below
# chk.pub\ddk\inc\afilter.h 0x01BE1502 89FB5DD4 7313 0x307989D0
sub ModifyCRCFile {
local($inFile, $outFile, $product) = @_;
do {
$rc = open(IN,$inFile) && open(OUT,">$outFile");
if( $rc ) {
while(<IN>) {
chop;
/\\$product\\(.*)$/;
print OUT "$1\n";
}
close(IN);
close(OUT);
&DoCommand( "del /F/Q $inFile > nul");
} else {
&LogOutput( "Couldn't modify CRC file $inFile to $outFile\n");
}
} until $rc;
$rc;
}
# This routine calculate the CRC of $file
# and output the result to logfile
sub GetCRCofCRCFile {
local( $fname ) = @_;
$command = "crcwalk $fname > $fname\.crc";
$rc = &DoCommand( $command );
if( $rc ) {
open( CRC, "$fname\.crc" );
&LogOutput( <CRC> );
close(CRC);
&DoCommand( "del /F/Q $fname\.crc > nul");
}
$rc;
}
# param1 src path : \\\\ntrelic2\\release\usa\2197.x86fre.main.000106-2102
# param1 src path : \\ntbuilds\\release\main\usa\2197\x86fre
# param2 dst path : \\\\scratch\\scratch\\crc$
# return logfilename : \\\\scratch\\scratch\\crc\\crc_usa_2197_x86_fre.log
sub MakeLogFileName {
local( $srcpath, $dstpath ) = @_;
# $srcpath =~ /.*\\([^\.]+)\\([^\.]+)\.([^\.]+)\.([^\.]+)\.([0-9]+\-[0-9]+)$/;
# $srcpath =~ /.*\\([^\.]+)\\([^\.]+)\.([^\.]{3})([^\.]{3})\.([^\.]+)\.([0-9]+\-[0-9]+)$/;
$srcpath =~ /.*\\([^\.]+)\\([0-9]+)\\([^\.]+)([^\.]{3})$/;
$logfilename = "$dstpath\\crc\_$1\_$2\_$3\_$4\.log";
$logfilename;
}
# param1 src path : \\\\ntrelic2\\release\usa\2197.x86fre.main.000106-2102
# param1 src path : \\ntbuilds\\release\main\usa\2197\x86fre
# param2 dst path : \\\\scratch\\scratch\\crc$
# return baseCRCFileName : \\\\scratch\\scratch\\crc\\crc_usa_2197_x86_fre
sub MakeBaseCRCFileName {
local( $srcpath, $dstpath ) = @_;
# $srcpath =~ /.*\\([^\.]+)\\([^\.]+)\.([^\.]{3})([^\.]{3})\.([^\.]+)\.([0-9]+\-[0-9]+)$/;
$srcpath =~ /.*\\([^\.]+)\\([0-9]+)\\([^\.]+)([^\.]{3})$/;
$baseCRCFileName = "$dstpath\\crc\_$1\_$2\_$3\_$4";
$baseCRCFileName;
}
sub LogOutput {
local($message) = @_;
@tm = localtime(time());
$tm[4]++;
$str = "$tm[4]/$tm[3] $tm[2]:$tm[1]:$tm[0] $message";
print $str;
print LOGFILE $str;
}
# Check if arguments are right or not
sub argcheck {
$ErrorMessage = "";
ARGCHK: {
$ARGV[0]=~ s/[\\]+$//;
$ARGV[1]=~ s/[\\]+$//;
# unless ( -e $ARGV[0] && -d _ ) { $ErrorMessage = "$ARGV[0] not found\n"; last ARGCHK; }
$SrcBasePath = $ARGV[0];
# unless ( -e $ARGV[1] && -d _ ) { $ErrorMessage = "$ARGV[1] not found\n"; last ARGCHK; }
$DstPath = $ARGV[1];
$i = 2;
do {
$str = $ARGV[$i]; $str =~ tr/A-Z/a-z/;
unless ( defined $Products{ $str } ) { $ErrorMessage = "$ARGV[$i] is not correct product\n"; last ARGCHK; }
$Products{$str} = 1;
} until( $ARGV[++$i] =~ /^[\/\-](.*)/ || $i > $#ARGV);
}
$ErrorMessage;
}
# Show the usage about arguments when they were not right
sub usage {
print " perl $thispl buildpath dstpath products\n" .
"\n" .
" i.e) perl $thispl \\\\ntrelic2\\usa\.2033\.x86 \\\\SomeServer\\SomeShare\\crc pro\n" .
" perl $thispl \\\\ntrelic2\\usa\.2033\.x86 \\\\SomeServer\\SomeShare\\crc pro bla sbs srv ads dtc\n";
}