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

480 lines
9.5 KiB
Perl

# USE section
use lib $ENV{ "RazzleToolPath" };
use GetParams;
use CkLang;
use strict;
no strict 'vars';
# GLOBALS
$ScriptName=$0;
$SDXROOT=$ENV{SDXROOT};
$INTLVIEW_FNAME="$SDXROOT\\tools\\intlview.map";
%SDMAP=();
%INTLVIEW=();
$Lang="";
$Project="";
$Quiet="";
$CODEBASE="NT";
$BRANCH=$ENV{_BuildBranch};
$LOGGING=0;
$ERROR=1;
$WARNING=2;
%MSG=($LOGGING => "", $ERROR => "error: ", $WARNING => "warning: ");
# MAIN {
# Parse the command line parameters.
&ParseCmdLine( @ARGV );
# Verify the command line parameters and the environment.
&VerifyParams();
# Mark sd.map as read only.
&MarkReadWrite();
# Load data from the "SD.MAP" file.
&LoadSDMap();
&LoadIntlview();
if ( $Lang ) {
&EnlistLangProj($Lang);
} else {
&EnlistCodeProj($Project);
}
# Mark sd.map as read only.
&MarkReadOnly();
# } # MAIN
sub EnlistLangProj {
my ( $lang ) = @_;
&EnlistProject("$lang\_res");
&EnlistProject("$lang\_bin");
&MapProject("$lang\_res");
&MapProject("$lang\_bin");
} # EnlistLangProj
sub EnlistCodeProj {
my ( $projname ) = @_;
foreach (sort keys %INTLVIEW) {
if ( $projname && lc($projname) ne lc($_) ) {
next;
}
&EnlistProject($_);
&MapProject($_);
}
} # EnlistCodeProj
sub EnlistProject {
my ( $projname ) = @_;
if ( !$Quiet ) {
&AskForOK( $projname );
}
printf "\n";
&DisplayMsg( $LOGMSG, "Enlisting project \"$projname\" in branch \"$BRANCH\"...");
if ( exists $SDMAP{lc($projname)} ) {
&DisplayMsg( $LOGMSG, "Already enlisted in project \"$projname\".");
return;
}
&ExecuteCmd( "sdx enlist $projname /q");
# As sdx does not set the error level in case of errors, reload the SD.MAP
# mapping file to verify that the project got actually enlisted.
&LoadSDMap();
if ( ! exists $SDMAP{lc($projname)} ){
&FatalError( "Enlist project \"$projname\" command failed." );
} else {
&DisplayMsg( $LOGMSG, "Project \"$projname\" enlisted successfully." );
}
return;
} # EnlistProject
sub MapProject {
my ( $projname ) = @_;
my $workdir = "$SDXROOT\\$SDMAP{lc($projname)}";
&DisplayMsg( $LOGMSG, "cd /d $workdir");
chdir ( $workdir ) ||
&FatalError( "Unable to change directory to \"$workdir\" to update project's \"$projname\" client view.");
&ExecuteCmd( "sd client -o \> sd.client" );
if ( &UpdateClient( $projname ) ) {
&ExecuteCmd( "sd client -i \< sd.client" );
&DisplayMsg( $LOGMSG, "Project \"$projname\" mapped successfully." );
}
&ExecuteCmd( "del sd.client" );
} # MapProject
sub UpdateClient {
my ( $projname ) = @_;
my $workdir = "$SDXROOT\\$SDMAP{lc($projname)}";
my @sdclient = ();
my $i = 0;
my $j = 0;
open( FILE, "sd.client" ) ||
&FatalError("Unable to open file \"$workdir\\sd.client\" for reading.");
@sdclient = <FILE>;
close( FILE );
for ( $i=0; $i < @sdclient; $i++ ) {
if ( $sdclient[$i] =~ /^View:/ ) {
last;
}
}
if ( $i == @sdclient ) {
&FatalError( "");
}
if ($projname=~/$lang/i) {
while( $i < @sdclient ) {
if ( ($sdclient[$i] =~ /$projname/i) || ($sdclient[$i] =~ /^\s*$/) ) {
# remove this language's item in client view
splice(@sdclient, $i, 1);
} else {
$i++;
}
}
}
$#sdclient=$i;
for ( $j=0; $j < @{$INTLVIEW{lc($projname)}}; $j++ ) {
$sdclient[$i+$j+1] = sprintf( "\t%s\n", ${$INTLVIEW{lc($projname)}}[$j]);
$sdclient[$i+$j+1] =~ s/\<client\>/$SDMAP{client}/;
}
&DisplayMsg( $LOGMSG, "Saving project's \"$projname\" updated client view...");
open(FILE, ">sd.client") ||
&FatalError( "Unable to open \"$workdir\\sd.client\" for writing." );
for ($i=0; $i < @sdclient; $i++ ) {
printf FILE "$sdclient[$i]";
}
close (FILE);
return 1;
} # UpdateClient
sub LoadIntlview {
my @mapfile = ();
my $i=0;
my $key;
my $value;
open( FILE, $INTLVIEW_FNAME ) ||
&FatalError( "Unable to load input file $INTLVIEW_FNAME." );
@mapfile = <FILE>;
close( FILE );
for ($i=0; $i < @mapfile; $i++) {
foreach ($mapfile[$i]) {
SWITCH: {
# commented line
if ( /\s*;/ ) { last SWITCH;}
# valid entry
if (/\s*(\S+)\s+(\S+.*)/ ) {
($key, $value) = ($1, $2);
next if (( !$Lang ) && ( $key =~ /lang/ ));
$key =~ s/\<lang\>/lc$Lang/eg;
$value =~ s/\<lang\>/lc$Lang/eg;
$value =~ s/\<branch\>/lc$BRANCH/eg;
push @{$INTLVIEW{lc($key)}}, $value;
last SWITCH;
}
# default
last SWITCH;
} # SWITCH
} # foreach
} # for
# foreach (sort keys %INTLVIEW) {
# for ($i=0; $i < @{$INTLVIEW{$_}}; $i++ ) {
# printf "key=$_, value[$i]=${$INTLVIEW{$_}}[$i]\n";
# }
# }
} # LoadIntlview
sub LoadSDMap {
my @mapfile=();
my $i=0;
my $sdmap="$SDXROOT\\sd.map";
foreach (keys %SDMAP) {
delete $SDMAP{$_};
}
( -e $sdmap ) || &FatalError( "Unable to find file $sdmap" );
open( FILE, $sdmap ) || &FatalError( "Unable to open file $sdmap." );
@mapfile=<FILE>;
close(FILE);
for ($i=0; $i < @mapfile; $i++) {
foreach ($mapfile[$i]) {
SWITCH: {
# commented lines
if ( /\s*#/ ) { last SWITCH;}
# valid entries
if (/\s*(\S+)\s*=\s*(\S+)/ ) {
$SDMAP{lc($1)}=$2;
last SWITCH;
}
# default
last SWITCH;
} # SWITCH
} # foreach
} # for
# verify codebase
( exists $SDMAP{codebase} ) ||
&FatalError( "CODEBASE is not listed in the SD mapping file $sdmap." );
( lc($SDMAP{codebase}) eq lc($CODEBASE) ) ||
&FatalError( "Codebase '$CODEBASE' does not match the SDXROOT '$SDMAP{codebase}' codebase." );
# verify branch
( exists $SDMAP{branch} ) ||
&FatalError( "BRANCH is not listed in the SD mapping file $sdmap." );
( lc($SDMAP{branch}) eq lc($BRANCH) ) ||
&DisplayMsg( $WARNING, "Branch \"$BRANCH\" does not match the SDXROOT \"$SDMAP{branch}\" branch.");
# verify client
( exists $SDMAP{client} ) ||
&FatalError( "CLIENT is not listed in the SD mapping file $sdmap." );
} # LoadSDMap
sub MarkReadOnly {
my $sdmap="$SDXROOT\\sd.map";
&ExecuteCmd( "attrib +h +r $sdmap");
} # MarkReadOnly
sub MarkReadWrite {
my $sdmap="$SDXROOT\\sd.map";
&ExecuteCmd( "attrib +h -r $sdmap");
} # MarkReadWrite
sub AskForOK {
my ( $projname ) = @_;
printf( "\n About to enlist in project $projname.\n" );
printf( " Press Ctrl+C in the next 30s if you wish to exit script.\n");
printf( " ...");
sleep 30;
} # AskForOK
sub ExecuteCmd {
my ($command) = @_;
DisplayMsg( $LOGMSG, $command );
if ( system( "$command" ) ) {
&FatalError( "Command \"$command\" failed." );
}
} # ExecuteCmd
sub ParseCmdLine {
my @arguments = @_;
my @syntax = (
-n => '',
-o => 'b:l:p:q',
-p => "BRANCH Lang Project Quiet"
);
&GetParameters( \@syntax, \@arguments );
} # ParseCmdLine
sub GetParameters {
my ($syntax, $arguments)=@_;
my $getparams=GetParams->new;
&{$getparams->{-Process}}(@$syntax,@$arguments);
if ( $HELP ) {
&Usage();
}
} # GetParameters
sub VerifyParams {
# Must run this script from a razzle
if ( !$ENV{RazzleToolPath} || !$ENV{SDXROOT} ) {
&DisplayMsg( $ERROR, "Please run this script from a razzle." );
&Usage();
}
if ( $Lang ) {
if( uc($Lang) eq "INTL" ){
$Lang = "";
}
else
{
# Only MAIN is accepted for language projects.
if ( ! &cklang::CkLang($Lang) ) {
&DisplayMsg( $ERROR, "Invalid language $Lang." );
&Usage();
}
if ( lc($BRANCH) ne "main" ) {
#$BRANCH = "main";
#&DisplayMsg( $WARNING, "Branch has been reset to \"main\", as \"main\" is the only branch valid for language projects." );
}
}
}
if ( $Lang && $Project ) {
&DisplayMsg( $ERROR, "You can specify language or project, but not both." );
&Usage();
}
} # VerifyParams
sub DisplayMsg {
print "$ScriptName : $MSG{@_[0]}@_[1]\n";
} # DisplayMsg
sub FatalError {
my ( $strerr ) = @_;
&DisplayMsg( $ERRMSG, $strerr );
exit 1;
} # FatalError
sub Usage {
print <<USAGE;
perl $0 - Enlist and map the projects pertinent to Whistler international.
Usage:
perl $0 [-b:<branch>] [-l:<language> | -p:<project>] [-q]
<branch > Source depot branch.
Enlist in the specified branch.
Default is %_BuildBranch%, $BRANCH in this case.
<language> Language.
If not specified, enlist in the source projects.
Acepted values are "intl" and any language
listed in codes.txt.
If "intl", enlist the source projects.
Otherwise, enlist and map the language projects
<language>_res and <language>_bin.
<project> Project name.
If specified, enlist and map the given source project.
If no project or language is specified, enlist and map the source
projects. Tools\\intlview.map lists the projects and the client
view mappings pertinent to international builds.
q Quiet mode.
Examples:
perl $0 /q
Enlist and map the source projects, default branch.
perl $0 -b:beta1 -l:intl /q
Same as above, beta1 branch.
perl $0 -p:Admin
Enlist and map the admin project, default branch.
perl $0 -l:ger /q
Enlist and map ger_res and ger_bin, main branch.
USAGE
exit(1);
} # Usage