diff --git a/bootstrap/win/python27.bleeding_edge.bat b/bootstrap/win/python27.bleeding_edge.bat new file mode 100644 index 000000000..86aba8933 --- /dev/null +++ b/bootstrap/win/python27.bleeding_edge.bat @@ -0,0 +1,46 @@ +@echo off +:: Copyright 2017 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. + +setlocal +set PYTHON_BAT_RUNNER=1 + +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: +:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::: + +:: This file is automatically generated by "bootstrap\win\win_tools.py", and +:: should not be modified. +:: +:: The previous "::" block acts as a nop-sled. Each time a batch file executes +:: a command, it reloads itself and seeks to its previous execution offset to +:: begin execution. Updating this batch file is, therefore, risky, since any +:: running Python instance that is using the old batch file will reload the new +:: batch file once the Python command terminates and resume at some unknown +:: offset. +:: +:: With the sled in place, a previous instance will resume mid-label. We are +:: assuming that the offset of the Python invocation is greater than the +:: PYTHON_BAT_RUNNER set command, which is the case since the old instance has +:: a large PATH set block before the Python execution. Old instances will hit +:: the next block of code without PYTHON_BAT_RUNNER set. New instances will have +:: it set. +:: +:: We remedy this in the future by having the batch file load its core paths +:: from an external file with for/set, removing the need to modify "python.bat" +:: during upgrade. +:: +:: After all of the old batch files are believed to be replaced, we can remove +:: the PYTHON_BAT_RUNNER block and the sled. For this update, old instances +:: will resume past the end of the file and terminate. + +if not "%PYTHON_BAT_RUNNER%" == "1" goto :END + +for /f %%i in (%~dp0python_bin_reldir.txt) do set PYTHON_BIN_RELDIR=%%i +set PATH=%~dp0%PYTHON_BIN_RELDIR%;%~dp0%PYTHON_BIN_RELDIR%\Scripts;%PATH% +"%~dp0%PYTHON_BIN_RELDIR%\python.exe" %* + +:END diff --git a/bootstrap/win/win_tools.py b/bootstrap/win/win_tools.py index ac70700b9..436513c80 100644 --- a/bootstrap/win/win_tools.py +++ b/bootstrap/win/win_tools.py @@ -320,11 +320,14 @@ def main(argv): template.PYTHON_BIN_RELDIR, os.path.join(ROOT_DIR, 'python_bin_reldir.txt')) + python_bat_template = ('python27.new.bat' if not args.bleeding_edge + else 'python27.bleeding_edge.bat') + # Re-evaluate and regenerate our root templated files. for src_name, dst_name in ( ('git-bash.template.sh', 'git-bash'), ('pylint.new.bat', 'pylint.bat'), - ('python27.new.bat', 'python.bat'), + (python_bat_template, 'python.bat'), ): template.maybe_install(src_name, os.path.join(ROOT_DIR, dst_name)) diff --git a/cipd.bat b/cipd.bat index 90184cff4..019ac0156 100644 --- a/cipd.bat +++ b/cipd.bat @@ -17,7 +17,7 @@ if not exist "%~dp0.cipd_client.exe" ( if not errorlevel 0 goto :END ) -set /p CIPD_CLIENT_VER=<%~dp0cipd_client_version +for /f %%i in (%~dp0cipd_client_version) do set CIPD_CLIENT_VER=%%i "%~dp0.cipd_client.exe" selfupdate -version "%CIPD_CLIENT_VER%" if not errorlevel 0 goto :END