windows-nt/Source/XPSP1/NT/tools/sp/indexsym.cmd
2020-09-26 16:20:57 +08:00

319 lines
9.3 KiB
Batchfile

@rem ='
@echo off
REM ------------------------------------------------------------------
REM
REM <<template_script.cmd>>
REM <<purpose of this script>>
REM
REM Copyright (c) Microsoft Corporation. All rights reserved.
REM
REM ------------------------------------------------------------------
perl -x "%~f0" %*
goto :EOF
rem ';
#!perl
use strict;
use File::Basename;
use lib $ENV{RAZZLETOOLPATH} . "\\PostBuildScripts";
use lib $ENV{RAZZLETOOLPATH} . "\\sp";
use lib $ENV{RAZZLETOOLPATH};
use PbuildEnv;
use ParseArgs;
use Logmsg;
use ParseTable;
use GetIniSetting;
use File::Copy;
my ($Lang, $Plat, $Build_Num, $Uniq_Name, $Uniq_Name_Prefix, $Proj_Name, $Counter, $BuildRemark, $BuildProj_Name, $Symbol_Info);
my ($Release_Root, $UNC_Path, $Bld_Path, $Sym_Update, $Symbol_Tools);
sub Usage { print<<USAGE; exit(1) }
indexsym.cmd -l:Lang -n:Build_Num -x:Plat [-i:Symbol_Info]
-l:Lang language
-n:Build_Num build number
-x:Plat build arch and build type
-i:Symbol_Info the symbol information; default is tools\\sp\\symbolinfo.txt
Eg.,
indexsym.cmd -l usa -n 1045 -x x86fre
USAGE
parseargs('?' => \&Usage,
'n:' => \$Build_Num,
'l:' => \$Lang,
'x:' => \$Plat,
'i:' => \$Symbol_Info
);
&main;
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#
# main()
# Main process
#
# IN - none
# OUT - return
#
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
sub main
{
&Initial() or return;
&GenerateFileList() or return;
&SubmitUniqRequest();
}
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#
# Initial()
# Check variable defined and set default values
#
# IN - none
# OUT - 0: failed, 1 : success
#
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
sub Initial()
{
my ($symbol_info_handle);
$Lang = $ENV{'Lang'} if (!defined $Lang);
# If necessary parameter not defined, exit
if (("$Build_Num" eq '') || ("$Lang" eq '') || ("$Plat" eq '') ) {
logmsg "Error: -l:Lang -n:Build_Num -x:Plat are required variable";
}
#
# Symbol_Info - the setting file
#
$Symbol_Info = dirname($0) . "\\symbolinfo.txt" if (!defined $Symbol_Info);
if (!-e $Symbol_Info) {
logmsg "Error: cannot find the symbol information ($Symbol_Info)\.";
return 0;
}
#
# Proj_Name - the project name
#
if (!defined $Proj_Name) {
$symbol_info_handle = new IO::File $Symbol_Info, 'r';
if (!defined $symbol_info_handle) {
logmsg "Error: cannot open the symbol information ($Symbol_Info)\.";
return 0;
}
while (<$symbol_info_handle>)
{
chomp;
if (/^Project\s*\=\s*(.+)\s*$/) {
$Proj_Name = $1;
last;
}
}
undef $symbol_info_handle;
if (!defined $Proj_Name) {
logmsg "Error: project name is undefined. Cannot find it in the symbol information\.";
return 0;
}
}
# others assign default value if not defined
# BuildProj_Name - the build's project. Default is xpsp1.
$BuildProj_Name = $ENV{_BuildBranch} if (!defined $BuildProj_Name);
# Uniq_Name_Prefix - the prefix of BuildID. Default is $Build_Num\.$BuildProj_Name\.$Plat\.$Lang.
$Uniq_Name_Prefix = "$Build_Num\.$BuildProj_Name\.$Plat\.$Lang" if (!defined $Uniq_Name_Prefix);
# Build Remark - the remark of the build name. Default is 'daily'.
$BuildRemark = 'daily' if (!defined $BuildRemark);
# Release Root - the release root; mainlab is \\ntdev\release
my @iniRequest = ( "DFSRootName" );
$Release_Root = &GetIniSetting::GetSetting( @iniRequest );
# UNC_Path - the release share
$UNC_Path = "$Release_Root\\$BuildProj_Name\\$Build_Num\\$Lang\\$Plat\\bin";
# Bld_Path - the current build path
$Bld_Path = "\\release\\$Build_Num\\$Lang\\$Plat\\bin";
if (!-e $Bld_Path) {
logmsg "Error: cannot find the build in $Bld_Path\.";
return 0;
}
# Sym_Update - the symupd.txt
$Sym_Update = "$Bld_Path\\symbolcd\\symupd.txt";
if (!-e $Sym_Update) {
logmsg "Error: cannot find the symupd.txt ($Sym_Update)\.";
return 0;
}
# Uniq_Name - the unique name
$Counter = &GenerateUniqueName();
$Uniq_Name = $Uniq_Name_Prefix . $Counter;
# Symbols tools
$Symbol_Tools = "\\\\symbols\\tools";
return 1;
}
#
# SubmitUniqRequest()
# - submit the unique request and remove previouse request
# if the new one successfully finished
# - copy the ssi file to symbolcd folder
#
# In : none
# Out: none
#
sub SubmitUniqRequest()
{
my ($r, @requests, $errfile_handle, $crcmd);
if (!-e "$Symbol_Tools\\createrequest.cmd") {
logmsg "Error: Cannot access to createrequest.cmd";
}
#
# A trick to increase the message speed in createrequest.cmd
#
$ENV{'__BatchJob__'} = 2;
#
# Create the new request
#
$crcmd = "$Symbol_Tools\\createrequest.cmd " .
"-i \"$Symbol_Info\" " .
"-d \"$ENV{TEMP}\" -c -s " .
"-b $Uniq_Name -e $BuildRemark " .
"-f \"$ENV{'TEMP'}\\$Uniq_Name\_$BuildRemark\.lst\" " .
"-p \"$Bld_Path\" " .
"-u \"$UNC_Path\" ";
logmsg $crcmd;
$r = system($crcmd);
undef $ENV{'__BatchJob__'};
#
# If success, remove the previous requests in the server
#
if (CreateRequestSuccess("$ENV{'TEMP'}\\$Proj_Name\_$Uniq_Name\_$BuildRemark\.ssi\.log", $r)) {
@requests = Exists("\\\\symbols\\projects\\$Proj_Name\\add_finished\\$Proj_Name\_$Uniq_Name_Prefix*\_$BuildRemark.ssi");
for (@requests) {
next if (/$Uniq_Name\_$BuildRemark/i);
copy($_, "\\\\symbols\\projects\\$Proj_Name\\del_requests\\");
logmsg("Remove old request $_");
}
unlink "$ENV{'TEMP'}\\$Uniq_Name\_$BuildRemark\.lst";
logmsg("CreateRequest finished successfully");
} else {
$errfile_handle = new IO::File "$ENV{'TEMP'}\\$Proj_Name\_$Uniq_Name\_$BuildRemark\.ssi\.err", 'r';
while(<$errfile_handle>) {
chomp;
logmsg($_);
}
undef $errfile_handle;
}
# For safety, we keep the ssi file to symbolcd folder
move("$ENV{'TEMP'}\\$Proj_Name\_$Uniq_Name\_$BuildRemark\.ssi", "$Bld_Path\\symbolcd\\$Proj_Name\_$Uniq_Name\_$BuildRemark\.ssi");
}
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#
# CreateRequestSuccess($logfile, $result)
# if $result > 0 return FAIL
# Look for the Msg(11702) or Msg(11703) in the log file to
# exam the result of the createrequest
#
# IN - CreateRequest's log
# OUT - 1 for success
#
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
sub CreateRequestSuccess($, $)
{
my ($logfile, $result) = @_;
my ($logfile_handle, @result);
return 0 if ($result > 0);
$logfile_handle = new IO::File $logfile, 'r';
@result = <$logfile_handle>;
undef $logfile_handle;
# Looking for msg(11702) (SUBMIT TO SYMBOLS SUCCESS) or msg(11703) (SUBMIT TO ARCHIVE SUCCESS)
for (@result) {
return 1 if (/^Msg\((11702|11703)\)/i);
}
return 0;
}
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#
# GenerateFileList()
# Generate a file list from for createrequest to use
#
# IN - none (ref. symupd.txt)
# OUT - none ($ENV{'TEMP'}\\$Uniq_Name\_$BuildRemark\.lst)
#
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
sub GenerateFileList()
{
my ($symupd_handle, $symindex_handle, @list, $bin, $pri, $pub);
$symupd_handle = new IO::File $Sym_Update, 'r';
chomp(@list = <$symupd_handle>);
$symupd_handle->close();
$symindex_handle = new IO::File "$ENV{'TEMP'}\\$Uniq_Name\_$BuildRemark\.lst", 'w';
if (!defined $symindex_handle) {
logmsg("Error: Cannot open $ENV{'TEMP'}\\$Uniq_Name\_$BuildRemark\.lst");
return 0;
}
for (@list) {
next if (!/\S/);
($bin, $pri, $pub) = split(/\s*\,\s*/, $_);
print $symindex_handle "$Bld_Path\\$bin\n" if (-f "$Bld_Path\\$bin");
print $symindex_handle "$Bld_Path\\$pri\n" if (-f "$Bld_Path\\$pri");
print $symindex_handle "$Bld_Path\\$pub\n" if ((!-f "$Bld_Path\\$pri") && (-f "$Bld_Path\\$pub"));
}
$symindex_handle->close();
if (-z "$ENV{'TEMP'}\\$Uniq_Name\_$BuildRemark\.lst") {
logmsg("Error: $ENV{'TEMP'}\\$Uniq_Name\_$BuildRemark\.lst is a zero-byte file");
return 0;
}
return 1;
}
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
#
# Exists($filespecprefix)
# Use glob to check file exist or not similar as
# exist in cmd
#
# IN - a filespec prefix, suc as foo\bar*
# OUT - if want array, it return the list of files exist
# in current system with the same filespec prefix;
# if want a value, it return the amout of files that
# have the filespec prefix
#
# * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
sub Exists
{
my @list = glob(shift);
return (wantarray)?@list:$#list + 1;
}
#
# GenerateUniqueName()
# Generate unique name by the prefix + YYMMDD-hhmm + extension
# IN: none
# OUT: current time YYMMDD-hhmm
#
sub GenerateUniqueName()
{
my ($YY, $MM, $DD, $hh, $mm) = (localtime())[5,4,3,2,1];
return sprintf("%02d%02d%02d-%02d%02d", $YY % 100, $MM + 1, $DD, $hh, $mm);
}
1;
__END__