Files
yttrium-virtio-gpu/Tools/pushpdb.cmd
T
Ladi Prosek 29a4a5cb6f pushpdb: Don't loop indefinitely if symbol store is broken
If the store is not accessible the script should not get stuck
in an inifinite loop trying to create the lock file. This commit
adds another check which aborts the pushpdb attempt in such a
case.

Also fixing 'timeout' invocation to make sure it runs the Windows
tool and not the GNU one when running under Cygwin.

Signed-off-by: Ladi Prosek <[email protected]>
2017-05-12 22:15:41 +02:00

291 lines
7.4 KiB
Batchfile

@echo off
:: Set this to the path of the 7zip exe file on your local machine.--------------::
::-------------------------------------------------------------------------------::
set z7_path_exe=C:\Program Files\7-Zip\7z.exe
:: Set this to the path of the sysStore exe file on your local machine.----------::
::-------------------------------------------------------------------------------::
set path_to_systore_exe=C:\Program Files (x86)\Windows Kits\10\Debuggers\x86\symstore.exe
:: Set this to the minimum size of an iso file in bytes to be considered valid.--::
::-------------------------------------------------------------------------------::
set min_iso_size=1000000
:: CODE SECTION
if "%DSTORE_LOCATION%"=="" (
echo.
echo Symbol store path is not configured on this machine.
echo.
echo Should be configured as: %%DSTORE_LOCATION%%
echo "(environment variable.)"
call :usage %~0
goto :eof
)
set store_address=%DSTORE_LOCATION%
:: Creating GUID for the push session
for /F "delims=" %%A in ('powershell -command "$([guid]::NewGuid().ToString())"') do set GUID=%%A
:: Saving local file full path for use in :add_local
set localfilepath=%~f1
:: Creating a folder for the push session, that will be later deleted
:: It helps is concurrency of the push sessions
mkdir %GUID%
pushd %GUID%
if "%~1"=="" (
call :usage %~0
) else if "%~1"=="-u" (
call :add_url "%~2"
) else if "%~2"=="" (
call :add_local "%localfilepath%"
) else call :usage %~0
popd
rmdir /s /q %GUID%
goto :eof
:add_url
echo url remote file
echo.
echo Downloading file...
start /wait cmd /c powershell -Command "Start-BitsTransfer -Source %1 -Destination %~nx1"
if not exist "%~nx1" (
echo.
echo Download failed for some reason, aborting ...
) else call :add_local "%cd%\%~nx1"
exit /b 0
:: Adding a local file.
:add_local
if not exist "%~1" (
echo.
echo File "%~1" does not exist.
exit /b 0
)
if "%~x1"==".pdb" goto add_pdb
if "%~x1"==".zip" goto add_zip
if "%~x1"==".rpm" goto add_rpm
:: Checking if the input is a directory
for %%i in (%1) do if exist %%~si\NUL goto add_dir
echo.
echo File type of "%~nx1" NOT supported.
exit /b 0
:: Handle adding a single pdb symbol file.
:add_pdb
echo pdb file
echo.
pushd "%~dp1"
call :push_pdb "%~1"
popd
exit /b 0
:: Handle adding zip archive, which includes extraction of the zip.
:add_zip
echo zip file
echo.
echo Extracting the zip...
call "%z7_path_exe%" x -o"%~n1" "%~1" > NUL
if ERRORLEVEL 1 (
echo.
echo Something went wrong with the extraction, aborting ...
) else (
echo Searching recursively for pdb files to push...
echo.
pushd "%~n1"
for /d /r %%p in (.) do call :rec_find_pdb "%%p"
popd
rmdir /s /q "%~n1"
)
exit /b 0
:: Handle adding rpm archive, which includes extraction of the rpm.
:add_rpm
echo rpm file
echo.
echo Extracting the rpm...
call "%z7_path_exe%" x -o"%~n1" "%~1" > NUL
if ERRORLEVEL 1 (
echo.
echo Something went wrong with the extraction, aborting ...
) else (
pushd "%~n1"
echo Extracting the cpio...
call "%z7_path_exe%" x -o"%~n1" "%~n1.cpio" > NUL
if ERRORLEVEL 1 (
echo.
echo Something went wrong with the extraction, aborting ...
) else (
pushd "%~n1"
echo Searching for the iso package and extracting it...
for /d /r %%p in (.) do (
pushd "%%p"
for %%f in (*) do (
if "%%~xf"==".iso" (
if %%~zf gtr %min_iso_size% (
call "%z7_path_exe%" x -o"%%~nf" "%%~f" > NUL
echo Searching recursively for pdb files to push...
echo.
pushd "%%~nf"
for /d /r %%p in (.) do call :rec_find_pdb "%%p"
popd
rmdir /s /q "%%~nf"
)
)
)
popd
)
popd
rmdir /s /q "%~n1"
)
popd
rmdir /s /q "%~n1"
)
exit /b 0
:: Handle adding a directory which has pdb symbol files.
:add_dir
echo directory path
echo.
echo Searching recursively for pdb files to push...
echo.
pushd "%~1"
for /d /r %%p in (.) do call :rec_find_pdb "%%p"
popd
exit /b 0
:: Searches recursively for pdb files in all sub-directories.
:rec_find_pdb
pushd "%~1"
for %%f in (*) do (
if "%%~xf"==".pdb" call :push_pdb "%%~f"
)
popd
exit /b 0
:: Executing the push of the pdb.
:push_pdb
if exist "%~n1.inf" (
for /f "tokens=2 delims=," %%t in ('findstr /b "DriverVer" "%~n1.inf"') do (
for /f "tokens=1 delims= " %%v in ('echo %%~t') do (
call :lock_file
if ERRORLEVEL 1 (
exit /b 1
)
echo Pushing %~1 version %%~v to the symbol store.
if "%DSTORE_BUILD_TAG%"=="" (
call "%path_to_systore_exe%" add /s "%store_address%" /f "%~1" /t "%~n1" /v "%%~v" /c "eng" > NUL
if ERRORLEVEL 1 (
echo - Last push was not completed successfully, skipping ...
)
) else (
call "%path_to_systore_exe%" add /s "%store_address%" /f "%~1" /t "%~n1" /v "%%~v" /c "%DSTORE_BUILD_TAG%" > NUL
if ERRORLEVEL 1 (
echo - Last push was not completed successfully, skipping ...
)
)
call :unlock_file
)
)
)
exit /b 0
:: Lock file mechanism, works as follows.
:: Creates a lock file with its unique stamp, tries to copy it to the stores
:: location, then compares the lock at the store with its own, if equal then
:: we locked and we continue, if not then we wait for 2 seconds then try again.
:: If we're unable to create a uniquely named file in the store directory we
:: abort the loop and return an error.
:lock_file
:loop
(
echo User : %USERNAME%
echo Domain : %USERDOMAIN%
echo Working Directory : %cd%
echo Date and time : %DATE% %TIME%
echo GUID : %GUID%
) > %GUID%.lock
echo n | copy /-y %GUID%.lock "%store_address%\lock" > NUL
fc %GUID%.lock "%store_address%\lock" > NUL 2>&1
if not ERRORLEVEL 1 (
exit /b 0
) else (
copy /y %GUID%.lock "%store_address%\%GUID%.lock" > NUL
if ERRORLEVEL 1 (
echo store appears to be broken, aborting
exit /b 1
)
del "%store_address%\%GUID%.lock" > NUL
echo someone else is pushing, waiting for 2 secs
%windir%\system32\timeout /t 2 /nobreak > NUL
goto :loop
)
:unlock_file
ren "%store_address%\lock" %GUID%.lock > NUL
if ERRORLEVEL 1 goto :unlock_file
del /q "%store_address%\%GUID%.lock" > NUL
del /q %GUID%.lock > NUL
exit /b 0
:usage
echo.
echo This script adds a pdb file to the specified symbol store.
echo.
echo Usage:
echo.
echo %~1 [-u] [Path]
echo.
echo.
echo -u [Path] Download a remote file (zip or rpm) and push pdbs.
echo NOTE: Path MUST BE a URL.
echo [Path] Push pdbs, Path can be pdb, zip or rpm or a folder.
echo NOTE: If one pdb is chosen, make sure .inf file is
echo in the same directory.
echo.
echo USED ENVIRONMENT VARIABLES:
echo.
echo %%DSTORE_LOCATION%% - The symbol store path, that pdb files
echo will be pushed to.
echo.
echo %%DSTORE_BUILD_TAG%% - Will serve as a tag for future versions,
echo pushed with the pdb as a message.(Optional)
echo if not configured, the default is "eng".
exit /b 0