Windows-Server-2003/tools/intlmap.pl

496 lines
10 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="";
$FullView="";
$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 );
# print $FullView ? "Selective Mapping\n" : "Selective/Exclusionary Mapping\n";
# 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;
next if $FullView and $value =~/^\-/;
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:fq',
-p => "BRANCH Lang Project FullView 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" && lc($BRANCH) ne "locpart" && lc($BRANCH) ne "idx01" && lc($BRANCH) ne "idx02" && lc($BRANCH) ne "idx03" && lc($BRANCH) ne "dnsrv" && lc($BRANCH) ne "dnsrv_dev" && lc($BRANCH) ne "srv03_rtm" ) {
$BRANCH = "main";
&DisplayMsg( $WARNING, "Branch has been reset to \"$BRANCH\". The only valid branches for language projects are \"main\", \"locpart\", \"idx01\", \"idx02\", \"idx03\", \"dnsrv\", \"dnsrv_dev\" and \"srv03_rtm\"." );
}
}
}
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] [-f]
<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.
<f>ullfview Flag to supply when generating integration/reverse integration
enlistment.
If specified, client view will be build without
exclusionary mapping ('-') lines.
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:jpn /q /f
Enlist and map jpn for integration clients.
perl $0 -l:ger /q
Enlist and exclusionary map ger_res, ger_bin, main branch for
ger project build. The client view will contain e.g.
//depot/main/ger_res/... //XXXX/loc/res/ger/...
-//depot/main/ger_res/.../EDBs/... //XXXX/loc/res/ger/.../EDBs/...
USAGE
exit(1);
} # Usage