@echo off | |
:: Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
:: Use of this source code is governed by a BSD-style license that can be | |
:: found in the LICENSE file. | |
:: This script will determine if python or git binaries need updates. It | |
:: returns 123 if the user's shell must restart, otherwise !0 is failure | |
:: Sadly, we can't use SETLOCAL here otherwise it ERRORLEVEL is not correctly | |
:: returned. | |
set WIN_TOOLS_ROOT_URL=https://storage.googleapis.com/chrome-infra/ | |
:: It used to be %~dp0 but ADODB.Stream may fail to write to this directory if | |
:: the directory DACL is set to elevated integrity level. | |
set ZIP_DIR=%TEMP% | |
:: Get absolute root directory (.js scripts don't handle relative paths well). | |
pushd %~dp0..\.. | |
set WIN_TOOLS_ROOT_DIR=%CD% | |
popd | |
if "%1" == "force" ( | |
set WIN_TOOLS_FORCE=1 | |
shift /1 | |
) | |
:PYTHON_CHECK | |
if not exist "%WIN_TOOLS_ROOT_DIR%\python276_bin" goto :PY27_INSTALL | |
if not exist "%WIN_TOOLS_ROOT_DIR%\python.bat" goto :PY27_INSTALL | |
set ERRORLEVEL=0 | |
goto :GIT_CHECK | |
:PY27_INSTALL | |
echo Installing python 2.7.6... | |
:: Cleanup python directory if it was existing. | |
if exist "%WIN_TOOLS_ROOT_DIR%\python276_bin\." rd /q /s "%WIN_TOOLS_ROOT_DIR%\python276_bin" | |
if exist "%ZIP_DIR%\python276.zip" del "%ZIP_DIR%\python276.zip" | |
echo Fetching from %WIN_TOOLS_ROOT_URL%python276_bin.zip | |
cscript //nologo //e:jscript "%~dp0get_file.js" %WIN_TOOLS_ROOT_URL%python276_bin.zip "%ZIP_DIR%\python276_bin.zip" | |
if errorlevel 1 goto :PYTHON_FAIL | |
:: Will create python276_bin\... | |
cscript //nologo //e:jscript "%~dp0unzip.js" "%ZIP_DIR%\python276_bin.zip" "%WIN_TOOLS_ROOT_DIR%" | |
:: Create the batch files. | |
call copy /y "%~dp0python276.new.bat" "%WIN_TOOLS_ROOT_DIR%\python.bat" 1>nul | |
call copy /y "%~dp0pylint.new.bat" "%WIN_TOOLS_ROOT_DIR%\pylint.bat" 1>nul | |
del "%ZIP_DIR%\python276_bin.zip" | |
set ERRORLEVEL=0 | |
goto :GIT_CHECK | |
:PYTHON_FAIL | |
echo ... Failed to checkout python automatically. | |
echo You should get the "prebaked" version at %WIN_TOOLS_ROOT_URL% | |
set ERRORLEVEL=1 | |
goto :END | |
:GIT_CHECK | |
:: must explicitly use FIND_EXE to prevent this from grabbing e.g. gnuwin32 or | |
:: msys versions. | |
set FIND_EXE=%SYSTEMROOT%\System32\find.exe | |
:: Check to see if we're on a 32 or 64 bit system | |
:: (parens) are necessary, otherwise batch puts an extra space after 32. | |
reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" | %FIND_EXE% /i "x86" > NUL && (set OS_BITS=32) || (set OS_BITS=64) | |
if not exist "%WIN_TOOLS_ROOT_DIR%\.git_bleeding_edge" ( | |
set GIT_VERSION=2.10.0 | |
) else ( | |
set GIT_VERSION=2.8.3 | |
) | |
set GIT_VERSION=%GIT_VERSION%-%OS_BITS% | |
set GIT_FETCH_URL=https://storage.googleapis.com/chrome-infra/PortableGit-%GIT_VERSION%-bit.7z.exe | |
set GIT_DOWNLOAD_PATH=%ZIP_DIR%\git.7z.exe | |
set GIT_BIN_DIR=git-%GIT_VERSION%_bin | |
set GIT_INST_DIR=%WIN_TOOLS_ROOT_DIR%\%GIT_BIN_DIR% | |
set GIT_EXE_PATH=%GIT_INST_DIR%\bin\git.exe | |
:: Clean up any release which doesn't match the one we want. | |
for /d %%i in ("%WIN_TOOLS_ROOT_DIR%\git-*_bin") do ( | |
if not "%%i" == "%WIN_TOOLS_ROOT_DIR%\git-%GIT_VERSION%_bin" ( | |
echo Cleaning old git installation %%i | |
rmdir /s /q "%%i" > NUL | |
) | |
) | |
if "%WIN_TOOLS_FORCE%" == "1" goto :GIT_INSTALL | |
if not exist "%GIT_EXE_PATH%" goto :GIT_INSTALL | |
call "%GIT_EXE_PATH%" --version 2>nul 1>nul | |
if errorlevel 1 goto :GIT_INSTALL | |
:: Several git versions can live side-by-side; check the top-level | |
:: batch script to make sure it points to the desired version. | |
for %%f in (git.bat gitk.bat ssh.bat ssh-keygen.bat git-bash) do ( | |
%FIND_EXE% "%GIT_BIN_DIR%" "%WIN_TOOLS_ROOT_DIR%\%%f" 2>nul 1>nul | |
if errorlevel 1 goto :GIT_MAKE_BATCH_FILES | |
) | |
if not exist %GIT_INST_DIR%\etc\profile.d\python.sh goto :GIT_MAKE_BATCH_FILES | |
goto :SYNC_GIT_HELP_FILES | |
:GIT_INSTALL | |
echo Installing git %GIT_VERSION% (avg 1-2 min download) ... | |
if exist "%GIT_DOWNLOAD_PATH%" del "%GIT_DOWNLOAD_PATH%" | |
echo Fetching from %GIT_FETCH_URL% | |
cscript //nologo //e:jscript "%~dp0get_file.js" %GIT_FETCH_URL% "%GIT_DOWNLOAD_PATH%" | |
if errorlevel 1 goto :GIT_FAIL | |
:: Cleanup git directory if it already exists. | |
if exist "%GIT_INST_DIR%\." rd /q /s "%GIT_INST_DIR%" | |
:: run PortableGit self-extractor | |
:: -y : Be Quiet ("yes") | |
:: -sd1 : Self delete SFX archive | |
:: -InstallPath : Where to put the files | |
:: -Directory : Run the post-extract program with this current-working-directory | |
:: | |
:: Path slashes must be escaped or the 7zip sfx treats e.g. path\to\dir as | |
:: path[tab]o\dir. | |
set GIT_INST_DIR_ESC=%GIT_INST_DIR:\=\\% | |
call "%GIT_DOWNLOAD_PATH%" -y -sd1 -InstallPath="%GIT_INST_DIR_ESC%" -Directory="%GIT_INST_DIR_ESC%" | |
if errorlevel 1 goto :GIT_FAIL | |
del "%GIT_DOWNLOAD_PATH%" | |
if not exist "%GIT_INST_DIR%\." goto :GIT_FAIL | |
set DID_UPGRADE=1 | |
:GIT_MAKE_BATCH_FILES | |
:: Create the batch files. | |
set GIT_TEMPL=%~dp0git.template.bat | |
set SED=%GIT_INST_DIR%\usr\bin\sed.exe | |
call "%SED%" -e "s/GIT_BIN_DIR/%GIT_BIN_DIR%/g" -e "s/GIT_PROGRAM/cmd\\\\git.exe/g" < %GIT_TEMPL% > "%WIN_TOOLS_ROOT_DIR%\git.bat" | |
call "%SED%" -e "s/GIT_BIN_DIR/%GIT_BIN_DIR%/g" -e "s/GIT_PROGRAM/cmd\\\\gitk.exe/g" < %GIT_TEMPL% > "%WIN_TOOLS_ROOT_DIR%\gitk.bat" | |
call "%SED%" -e "s/GIT_BIN_DIR/%GIT_BIN_DIR%/g" -e "s/GIT_PROGRAM/usr\\\\bin\\\\ssh.exe/g" < %GIT_TEMPL% > "%WIN_TOOLS_ROOT_DIR%\ssh.bat" | |
call "%SED%" -e "s/GIT_BIN_DIR/%GIT_BIN_DIR%/g" -e "s/GIT_PROGRAM/usr\\\\bin\\\\ssh-keygen.exe/g" < %GIT_TEMPL% > "%WIN_TOOLS_ROOT_DIR%\ssh-keygen.bat" | |
call "%SED%" -e "s/GIT_BIN_DIR/%GIT_BIN_DIR%/g" -e "s/PYTHON_BIN_DIR/python276_bin/g" < %~dp0git-bash.template.sh > "%WIN_TOOLS_ROOT_DIR%\git-bash" | |
copy "%~dp0profile.d.python.sh" %GIT_INST_DIR%\etc\profile.d\python.sh > NUL | |
:: Ensure various git configurations are set correctly at they system level. | |
call "%WIN_TOOLS_ROOT_DIR%\git.bat" config --system core.autocrlf false | |
call "%WIN_TOOLS_ROOT_DIR%\git.bat" config --system core.filemode false | |
call "%WIN_TOOLS_ROOT_DIR%\git.bat" config --system core.preloadindex true | |
call "%WIN_TOOLS_ROOT_DIR%\git.bat" config --system core.fscache true | |
:SYNC_GIT_HELP_FILES | |
:: Copy all the depot_tools docs into the mingw64 git docs root. | |
:: /i : Make sure xcopy knows that the destination names a folder, not a file | |
:: /q : Make xcopy quiet (though it still prints a `X File(s) copied` message | |
:: which is why we have the > NUL) | |
:: /d : Copy source files that are newer than the corresponding destination | |
:: files only. This prevents excessive copying when none of the docs | |
:: actually changed. | |
:: /y : Don't prompt for overwrites (yes) | |
xcopy /i /q /d /y "%WIN_TOOLS_ROOT_DIR%\man\html\*" "%GIT_INST_DIR%\mingw64\share\doc\git-doc" > NUL | |
:: MSYS users need to restart their shell. | |
if defined MSYSTEM if defined DID_UPGRADE ( | |
echo. | |
echo. | |
echo IMPORTANT: | |
echo depot_tools' git distribution has been updated while inside of a MinGW | |
echo shell. In order to complete the upgrade, please exit the shell and re-run | |
echo `git bash`. | |
exit 123 | |
) | |
goto :END | |
:GIT_FAIL | |
echo ... Failed to checkout git automatically. | |
echo You should get the "prebaked" version used at %GIT_FETCH_URL% | |
set ERRORLEVEL=1 | |
goto :END | |
:returncode | |
set WIN_TOOLS_ROOT_URL= | |
set WIN_TOOLS_ROOT_DIR= | |
exit /b %ERRORLEVEL% | |
:END | |
call :returncode %ERRORLEVEL% |