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

365 lines
11 KiB
Batchfile

@REM normal cmd header stuff ...
@echo off
if defined _echo echo on
if defined verbose echo on
setlocal EnableDelayedExpansion EnableExtensions
set SCRIPT_NAME=%~nx0
set Language=%1
set BuildName=%2
for /f "tokens=1 delims=." %%a in ('echo %BuildName%') do set /a BuildNumber=%%a
if not exist %TMP% md %TMP%
set LOGFILE=%TMP%\%SCRIPT_NAME%.log
if exist %LOGFILE% del %LOGFILE%
REM if binaries directory still exists then release did not run properly
if exist %_NTPOSTBLD% (
call errmsg.cmd "Binaries tree %_NTPOSTBLD% still exists, not copying symbols!"
goto :ErrEnd
)
REM if running on idx branch then paths below will change
set OfficialIDXBranch1=idx01
set OfficialIDXBranch2=idx02
call logmsg.cmd "Beginning ..."
time /t
REM figure out symbol farm we are copying symbols to
REM Read it out of this lab's ini file
set SymbolsMachineShare=
set CmdIni=perl %RazzleToolPath%\PostBuildScripts\CmdIniSetting.pl
set ThisCommandLine=%CmdIni% -l:%Language% -f:SymFarm
%ThisCommandLine% >nul 2>nul
if %ERRORLEVEL% NEQ 0 (
call errmsg.cmd "SymFarm is not defined in the ini file, not copying symbols"
goto :ErrEnd
) else (
for /f %%a in ('%ThisCommandLine%') do (
set SymbolsMachineShare=%%a
)
call logmsg "Symbol farm location is !SymbolsMachineShare!"
)
if not defined SymbolsMachineShare (
call errmsg.cmd "SymFarm is not defined in the ini file, not copying symbols"
goto :ErrEnd
)
set SymbolsMachineShareWritable=%SymbolsMachineShare%$
REM set paths to where symbols, etc are copied (pushed)
set PushPriShare=%SymbolsMachineShareWritable%\%Language%\%BuildName%\symbols.pri
set PushPubShare=%SymbolsMachineShareWritable%\%Language%\%BuildName%\symbols
set PushBinShare=%SymbolsMachineShareWritable%\%Language%\%BuildName%
set PushSymsrvShare=%SymbolsMachineShareWritable%\%Language%\%BuildName%\symsrv\%Language%\add_finished
set PushTraceFormatShare=%SymbolsMachineShareWritable%\%Language%\%BuildName%\symbols.pri\TraceFormat
if not exist %PushPriShare% md %PushPriShare%
if not exist %PushPubShare% md %PushPubShare%
if not exist %PushBinShare% md %PushBinShare%
if not exist %PushSymsrvShare% md %PushSymsrvShare%
if not exist %PushTraceFormatShare% md %PushTraceFormatShare%
REM set paths from which symbols, etc. are copied from (pulled)
REM IDX branch release directory is named differently
set ReleaseDir=release
set ThisRelDir=
set IniCmd=perl %RazzleToolPath%\PostBuildScripts\CmdIniSetting.pl
set IniCmd=!IniCmd! -l:%Language%
set IniCmd=!IniCmd! -b:%_BuildBranch%
set IniCmd=!IniCmd! -f:AlternateReleaseDir
for /f %%a in ('!IniCmd!') do (
set ThisRelDir=%%a
)
if defined ThisRelDir set ReleaseDir=%ThisRelDir%
REM get the local path so we can do file ops on them
set ReleaseLocalPath=
for /f "tokens=1,2" %%a in ('net share %ReleaseDir%') do (
if /i "%%a" == "path" set ReleaseLocalPath=%%b
)
if not defined ReleaseLocalPath (
call errmsg.cmd "Can't find local path for %ReleaseDir%"
goto :ErrEnd
)
set PullRelPath=%ReleaseLocalPath%
if /i "%Language%" neq "usa" set PullRelPath=!PullRelPath!\%Language%
set PullRelPath=%PullRelPath%\%BuildName%
set PullPriShare=%PullRelPath%\symbols.pri
set PullPubShare=%PullRelPath%\symbols
set PullBinShare=%PullRelPath%
set PullSymsrvShare=%PullRelPath%\symsrv\%Language%\add_finished
set PullTraceFormatShare=%PullRelPath%\symbols.pri\TraceFormat
REM We need only copy the files required by the symfarm, as defined in the
REM .pri .pub and .bin files:
REM we need to find the latest
REM :FindLatestSymFile sets the env var %NewestFile% to the greatest numbered file
set SymFiles=%PullSymsrvShare%\%BuildName%.*.pri
call :FindLatestSymFile %SymFiles%
set SymPriFile=%NewestFile%
set SymPriFilePath=%PullSymsrvShare%\%NewestFile%
set SymFiles=%PullSymsrvShare%\%BuildName%.*.pub
call :FindLatestSymFile %SymFiles%
set SymPubFile=%NewestFile%
set SymPubFilePath=%PullSymsrvShare%\%NewestFile%
set SymFiles=%PullSymsrvShare%\%BuildName%.*.bin
call :FindLatestSymFile %SymFiles%
set SymBinFile=%NewestFile%
set SymBinFilePath=%PullSymsrvShare%\%NewestFile%
time /t
call logmsg.cmd /t "Beginning %SymPriFile% split"
REM delete old split files
for /l %%a in (1,1,%NUMBER_OF_PROCESSORS%) do (
if exist %SymPriFilePath%.%%a del %SymPriFilePath%.%%a
)
if not defined SymPriFile (
call logmsg "No pri symbol file -- OK"
goto EndSymPriFile
)
REM split up list of private symbols to copy
perl %RazzleToolPath%\PostBuildScripts\SplitList.pl -n %NUMBER_OF_PROCESSORS% -f %SymPriFilePath% -l %Language%
set EventNames=
for /l %%a in (1,1,%NUMBER_OF_PROCESSORS%) do (
if exist %SymPriFilePath%.%%a (
start "copy symbols.pri #%%a" /min /high cmd /c %RazzleToolPath%\PostBuildScripts\symcopythread.cmd %PullPriShare% %PushPriShare% %SymPriFilePath%.%%a %SymPriFile%.%%a
set EventNames=!EventNames! %SymPriFile%.%%a
) else (
call errmsg.cmd "SplitList.pl did not create %SymPriFilePath%.%%a as expected!"
)
)
call logmsg.cmd /t "WAITING ON COPYING PRIVATE SYMBOLS"
perl %RazzleToolPath%\PostBuildScripts\cmdevt.pl -wv !EventNames!
call logmsg.cmd /t "FINISHED COPYING PRIVATE SYMBOLS"
:EndSymPriFile
call logmsg.cmd /t "Beginning %SymPubFile% split"
REM delete old split files
for /l %%a in (1,1,%NUMBER_OF_PROCESSORS%) do (
if exist %SymPubFilePath%.%%a del %SymPubFilePath%.%%a
)
if not defined SymPubFile (
call logmsg "No pub symbol file -- OK"
goto EndSymPubFile
)
REM split up list of public symbols to copy
perl %RazzleToolPath%\PostBuildScripts\SplitList.pl -n %NUMBER_OF_PROCESSORS% -f %SymPubFilePath% -l %Language%
set EventNames=
for /l %%a in (1,1,%NUMBER_OF_PROCESSORS%) do (
if exist %SymPubFilePath%.%%a (
start "copy symbols.pub #%%a" /min /high cmd /c %RazzleToolPath%\PostBuildScripts\symcopythread.cmd %PullPubShare% %PushPubShare% %SymPubFilePath%.%%a %SymPubFile%.%%a
set EventNames=!EventNames! %SymPubFile%.%%a
) else (
call errmsg.cmd "SplitList.pl did not create %SymPubFilePath%.%%a as expected!"
)
)
call logmsg.cmd /t "WAITING ON COPYING PUBLIC SYMBOLS"
perl %RazzleToolPath%\PostBuildScripts\cmdevt.pl -wv !EventNames!
call logmsg.cmd /t "FINISHED COPYING PUBLIC SYMBOLS"
:EndSymPubFile
call logmsg.cmd /t "Beginning %SymBinFile% split"
REM delete old split files
for /l %%a in (1,1,%NUMBER_OF_PROCESSORS%) do (
if exist %SymBinFilePath%.%%a del %SymBinFilePath%.%%a
)
if not defined SymBinFile (
call logmsg "No bin symbol file -- OK"
goto EndSymBinFile
)
REM split up list of binaries to copy
perl %RazzleToolPath%\PostBuildScripts\SplitList.pl -n %NUMBER_OF_PROCESSORS% -f %SymBinFilePath% -l %Language%
set EventNames=
for /l %%a in (1,1,%NUMBER_OF_PROCESSORS%) do (
if exist %SymBinFilePath%.%%a (
start "copy symbols.bin #%%a" /min /high cmd /c %RazzleToolPath%\PostBuildScripts\symcopythread.cmd %PullBinShare% %PushBinShare% %SymBinFilePath%.%%a %SymBinFile%.%%a
set EventNames=!EventNames! %SymBinFile%.%%a
) else (
call errmsg.cmd "SplitList.pl did not create %SymBinFilePath%.%%a as expected!"
)
)
call logmsg.cmd /t "WAITING ON COPYING BINARIES"
perl %RazzleToolPath%\PostBuildScripts\cmdevt.pl -wv !EventNames!
call logmsg.cmd /t "FINISHED COPYING BINARIES"
:EndSymBinFile
if defined SymPriFile (
call logmsg.cmd "copying %SymPriFilePath% ..."
xcopy /dhkr %SymPriFilePath% %PushPriShare%
if "!ErrorLevel!" neq "0" (
call errmsg.cmd "copy failed: xcopy /dhkr %SymPriFilePath% %PushPriShare%"
)
)
if defined SymPubFile (
call logmsg.cmd "copying %SymPubFilePath% ..."
xcopy /dhkr %SymPubFilePath% %PushPubShare%
if "!ErrorLevel!" neq "0" (
call errmsg.cmd "copy failed: xcopy /dhkr %SymPubFilePath% %PushPubShare%"
)
)
if defined SymBinFile (
call logmsg.cmd "copying %SymBinFilePath% ..."
xcopy /dhkr %SymBinFilePath% %PushBinShare%
if "!ErrorLevel!" neq "0" (
call errmsg.cmd "copy failed: xcopy /dhkr %SymBinFilePath% %PushBinShare%"
)
)
call logmsg.cmd "copying %PullSymsrvShare% ..."
xcopy /dehikr %PullSymsrvShare% %PushSymsrvShare% >nul 2>nul
if "!ErrorLevel!" neq "0" (
call errmsg.cmd "copy failed: xcopy /dehikr %PullSymsrvShare% %PushSymsrvShare%"
)
REM International might not have TraceFormat folder
if exist "%PullTraceFormatShare%" (
call logmsg.cmd "copying %PullTraceFormatShare% ..."
xcopy /dehikr %PullTraceFormatShare% %PushTraceFormatShare% >nul 2>nul
if "!ErrorLevel!" neq "0" (
call errmsg.cmd "copy failed: xcopy /dehikr %PullTraceFormatShare% %PushTraceFormatShare%"
)
)
REM Copy sfcfiles out there
if exist %PullPriShare%\retail\dll\sfcfiles*.pdb (
call logmsg.cmd "copying %PullPriShare%\retail\dll\sfcfiles*.pdb ... "
if not exist %PushPriShare%\retail\dll mkdir %PushPriShare%\retail\dll
xcopy /dehikr %PullPriShare%\retail\dll\sfcfiles*.pdb %PushPriShare%\retail\dll
if "!ErrorLevel!" neq "0" (
call errmsg.cmd "copy failed:xcopy /dehikr %PullPriShare%\retail\dll\sfcfiles*.pdb %PushPriShare%\retail\dll\sfcfiles*.pdb"
)
)
findstr /il error: %LOGFILE%
if "!ErrorLevel!" equ "0" (
findstr /il error: %LOGFILE% > %LOGFILE%.err
call logmsg.cmd /t "Errors in Symbol Copy, see %LOGFILE%.err"
goto :ErrEnd
)
goto :End
REM :FindLatestSymFile sets the env var %NewestFile% to the greatest numbered file
:FindLatestSymFile
set FileSpec=%1
set NewestFile=
set SysCommand=dir /a-d /b %FileSpec%
%SysCommand% >nul 2>nul
if "!ErrorLevel!" neq "0" (
REM no files with this spec found, return nothing
set NewestFile=
goto :EOF
)
set LargestNumber=0
set ThisFileName=
for /f "tokens=1,2,3,4,5,6,7 delims=." %%a in ('%SysCommand%') do (
if "%%e" gtr "!LargestNumber!" (
set LargestNumber=%%e
set ThisFileName=%%a.%%b.%%c.%%d.%%e.%%f.%%g
)
)
set NewestFile=!ThisFileName!
goto :EOF
:End
call logmsg.cmd "FINISHED with all Symbol copies, no errors!!!"
endlocal
goto :EOF
:ErrEnd
REM Send mail about symcopy error
set Sender=%COMPUTERNAME%
set Title=Symbol copy error on %COMPUTERNAME% build %BUILDNAME%
set Message=A symbol copy error was detected on machine %COMPUTERNAME%. See %LOGFILE%.err
REM Read the Symbol Copy Error Message Receiver from the .ini file
set Receiver=
set CmdIni=perl %RazzleToolPath%\PostBuildScripts\CmdIniSetting.pl
set ThisCommandLine=%CmdIni% -l:%Language% -f:SymCopyErrReceiver
%ThisCommandLine% >nul 2>nul
if %ERRORLEVEL% NEQ 0 (
call errmsg.cmd "SymCopyErrReceiver is not defined in the .ini file, can't send error message email"
goto :SkipSendMsg
) else (
for /f %%a in ('%ThisCommandLine%') do (
set Receiver=%%a
)
call logmsg "Symbol Copy Error Message Receiver is !Receiver!"
)
if not defined Receiver (
call errmsg.cmd "SymCopyErrReceiver is not defined in the .ini file, can't send error message email"
goto :SkipSendMsg
)
perl -e "require '%RazzleToolPath%\sendmsg.pl';sendmsg('-v','%Sender%','%Title%','%Message%','%Receiver%');"
:SkipSendMsg
REM type logfile so it is seen in the window
type %LOGFILE%.err
endlocal
seterror.exe 1