diff --git a/bin/flutter b/bin/flutter index 127ba72572f..e7cf407ba8c 100755 --- a/bin/flutter +++ b/bin/flutter @@ -7,8 +7,8 @@ # ---------------------------------- NOTE ---------------------------------- # # # Please keep the logic in this file consistent with the logic in the -# `internal/run_flutter.bat` script for Windows to ensure that Flutter -# continues to work across all platforms! +# `flutter.bat` script in the same directory to ensure that Flutter continues +# to work across all platforms! # # -------------------------------------------------------------------------- # diff --git a/bin/flutter.bat b/bin/flutter.bat index 0f59a940d06..43af48be674 100644 --- a/bin/flutter.bat +++ b/bin/flutter.bat @@ -3,21 +3,183 @@ REM Copyright 2017 The Chromium Authors. All rights reserved. REM Use of this source code is governed by a BSD-style license that can be REM found in the LICENSE file. -REM This wrapper script copies the actual launch script from internal/ to cache/ -REM and then executes the copy in cache/. Copying is necessary to prevent -REM Flutter from modifying the script while it is executing during a -REM "flutter upgrade" or "flutter channel" command. Modifying the script -REM mid-execution would cause Windows to throw errors. + +REM ---------------------------------- NOTE ---------------------------------- +REM +REM Please keep the logic in this file consistent with the logic in the +REM `flutter` script in the same directory to ensure that Flutter continues to +REM work across all platforms! +REM +REM -------------------------------------------------------------------------- SETLOCAL ENABLEDELAYEDEXPANSION FOR %%i IN ("%~dp0..") DO SET FLUTTER_ROOT=%%~fi -SET cache_dir=%FLUTTER_ROOT%\bin\cache -SET script_src=%FLUTTER_ROOT%\bin\internal\run_flutter.bat -SET script_dest=%cache_dir%\run_flutter.bat +SET flutter_tools_dir=%FLUTTER_ROOT%\packages\flutter_tools +SET cache_dir=%FLUTTER_ROOT%\bin\cache +SET snapshot_path=%cache_dir%\flutter_tools.snapshot +SET stamp_path=%cache_dir%\flutter_tools.stamp +SET script_path=%flutter_tools_dir%\bin\flutter_tools.dart +SET dart_sdk_path=%cache_dir%\dart-sdk +SET engine_stamp=%cache_dir%\engine-dart-sdk.stamp +SET engine_version_path=%FLUTTER_ROOT%\bin\internal\engine.version +SET pub_cache_path=%FLUTTER_ROOT%\.pub-cache + +SET dart=%dart_sdk_path%\bin\dart.exe +SET pub=%dart_sdk_path%\bin\pub.bat + +REM If available, add location of bundled mingit to PATH +SET mingit_path=%FLUTTER_ROOT%\bin\mingit\cmd +IF EXIST "%mingit_path%" SET PATH=%PATH%;%mingit_path% + +REM Test if Git is available on the Host +where /q git || ECHO Error: Unable to find git in your PATH. && EXIT /B 1 +REM Test if the flutter directory is a git clone, otherwise git rev-parse HEAD would fail +IF NOT EXIST "%flutter_root%\.git" ( + ECHO Error: The Flutter directory is not a clone of the GitHub project. + ECHO The flutter tool requires Git in order to operate properly; + ECHO to set up Flutter, run the following command: + ECHO git clone -b beta https://github.com/flutter/flutter.git + EXIT /B 1 +) + +REM Ensure that bin/cache exists. IF NOT EXIST "%cache_dir%" MKDIR "%cache_dir%" -COPY "%script_src%" "%script_dest%" 1>NUL -"%script_dest%" %* -REM The call above REPLACES this process with the cache\run_flutter.bat process. +REM If the cache still doesn't exist, fail with an error that we probably don't have permissions. +IF NOT EXIST "%cache_dir%" ( + ECHO Error: Unable to create cache directory at + ECHO %cache_dir% + ECHO. + ECHO This may be because flutter doesn't have write permissions for + ECHO this path. Try moving the flutter directory to a writable location, + ECHO such as within your home directory. + EXIT /B 1 +) + + +REM To debug the tool, you can uncomment the following lines to enable checked mode and set an observatory port: +REM SET FLUTTER_TOOL_ARGS="--checked %FLUTTER_TOOL_ARGS%" +REM SET FLUTTER_TOOL_ARGS="%FLUTTER_TOOL_ARGS% --observe=65432" + +:acquire_lock +2>NUL ( + REM "3" is now stderr because of "2>NUL". + CALL :subroutine %* 2>&3 9> "%cache_dir%\flutter.bat.lock" || GOTO acquire_lock +) +GOTO :after_subroutine + +:subroutine + PUSHD "%flutter_root%" + FOR /f %%r IN ('git rev-parse HEAD') DO SET revision=%%r + POPD + + REM The following IF conditions are all linked with a logical OR. However, + REM there is no OR operator in batch and a GOTO construct is used as replacement. + + IF NOT EXIST "%engine_stamp%" GOTO do_sdk_update_and_snapshot + SET /P dart_required_version=<"%engine_version_path%" + SET /P dart_installed_version=<"%engine_stamp%" + IF !dart_required_version! NEQ !dart_installed_version! GOTO do_sdk_update_and_snapshot + IF NOT EXIST "%snapshot_path%" GOTO do_snapshot + IF NOT EXIST "%stamp_path%" GOTO do_snapshot + SET /P stamp_value=<"%stamp_path%" + IF !stamp_value! NEQ !revision! GOTO do_snapshot + REM Compare "last modified" timestamps + SET pubspec_yaml_path=%flutter_tools_dir%\pubspec.yaml + SET pubspec_lock_path=%flutter_tools_dir%\pubspec.lock + FOR %%i IN ("%pubspec_yaml_path%") DO SET yaml_timestamp=%%~ti + FOR %%i IN ("%pubspec_lock_path%") DO SET lock_timestamp=%%~ti + IF !yaml_timestamp! EQU !lock_timestamp! GOTO do_snapshot + FOR /F %%i IN ('DIR /B /O:D "%pubspec_yaml_path%" "%pubspec_lock_path%"') DO SET newer_file=%%i + IF "%newer_file%" EQU "pubspec.yaml" GOTO do_snapshot + + REM Everything is uptodate - exit subroutine + EXIT /B + + :do_sdk_update_and_snapshot + ECHO Checking Dart SDK version... + SET update_dart_bin=%FLUTTER_ROOT%/bin/internal/update_dart_sdk.ps1 + REM Escape apostrophes from the executable path + SET "update_dart_bin=!update_dart_bin:'=''!" + CALL PowerShell.exe -ExecutionPolicy Bypass -Command "Unblock-File -Path '%update_dart_bin%'; & '%update_dart_bin%'" + IF "%ERRORLEVEL%" NEQ "0" ( + ECHO Error: Unable to update Dart SDK. Retrying... + timeout /t 5 /nobreak + GOTO :do_sdk_update_and_snapshot + ) + + :do_snapshot + IF EXIST "%FLUTTER_ROOT%\version" DEL "%FLUTTER_ROOT%\version" + ECHO: > "%cache_dir%\.dartignore" + ECHO Building flutter tool... + PUSHD "%flutter_tools_dir%" + + REM Makes changes to PUB_ENVIRONMENT only visible to commands within SETLOCAL/ENDLOCAL + SETLOCAL + SET VERBOSITY=--verbosity=error + IF "%CI%" == "true" GOTO on_bot + IF "%BOT%" == "true" GOTO on_bot + IF "%CONTINUOUS_INTEGRATION%" == "true" GOTO on_bot + IF "%CHROME_HEADLESS%" == "1" GOTO on_bot + GOTO not_on_bot + :on_bot + SET PUB_ENVIRONMENT=%PUB_ENVIRONMENT%:flutter_bot + SET VERBOSITY=--verbosity=normal + :not_on_bot + SET PUB_ENVIRONMENT=%PUB_ENVIRONMENT%:flutter_install + IF "%PUB_CACHE%" == "" ( + IF EXIST "%pub_cache_path%" SET PUB_CACHE=%pub_cache_path% + ) + + SET /A total_tries=10 + SET /A remaining_tries=%total_tries%-1 + :retry_pub_upgrade + ECHO Running pub upgrade... + CALL "%pub%" upgrade "%VERBOSITY%" --no-packages-dir + IF "%ERRORLEVEL%" EQU "0" goto :upgrade_succeeded + ECHO Error Unable to 'pub upgrade' flutter tool. Retrying in five seconds... (%remaining_tries% tries left) + timeout /t 5 /nobreak 2>NUL + SET /A remaining_tries-=1 + IF "%remaining_tries%" EQU "0" GOTO upgrade_retries_exhausted + GOTO :retry_pub_upgrade + :upgrade_retries_exhausted + SET exit_code=%ERRORLEVEL% + ECHO Error: 'pub upgrade' still failing after %total_tries% tries, giving up. + GOTO final_exit + :upgrade_succeeded + ENDLOCAL + + POPD + + CALL "%dart%" --snapshot="%snapshot_path%" --packages="%flutter_tools_dir%\.packages" "%script_path%" + IF "%ERRORLEVEL%" NEQ "0" ( + ECHO Error: Unable to create dart snapshot for flutter tool. + SET exit_code=%ERRORLEVEL% + GOTO :final_exit + ) + >"%stamp_path%" ECHO %revision% + + REM Exit Subroutine + EXIT /B + +:after_subroutine + +CALL "%dart%" %FLUTTER_TOOL_ARGS% "%snapshot_path%" %* +SET exit_code=%ERRORLEVEL% + +REM The VM exits with code 253 if the snapshot version is out-of-date. +IF "%exit_code%" EQU "253" ( + CALL "%dart%" --snapshot="%snapshot_path%" --packages="%flutter_tools_dir%\.packages" "%script_path%" + SET exit_code=%ERRORLEVEL% + IF "%exit_code%" EQU "253" ( + ECHO Error: Unable to create dart snapshot for flutter tool. + EXIT /B %exit_code% + ) + CALL "%dart%" %FLUTTER_TOOL_ARGS% "%snapshot_path%" %* + SET exit_code=%ERRORLEVEL% +) + +:final_exit +EXIT /B %exit_code% diff --git a/bin/internal/run_flutter.bat b/bin/internal/run_flutter.bat deleted file mode 100644 index 7f4aa12fc14..00000000000 --- a/bin/internal/run_flutter.bat +++ /dev/null @@ -1,185 +0,0 @@ -@ECHO off -REM Copyright 2018 The Chromium Authors. All rights reserved. -REM Use of this source code is governed by a BSD-style license that can be -REM found in the LICENSE file. - - -REM ---------------------------------- NOTE ---------------------------------- -REM -REM Please keep the logic in this file consistent with the logic in the -REM `../flutter` script for Linux to ensure that Flutter continues to -REM work across all platforms! -REM -REM -------------------------------------------------------------------------- - -SETLOCAL ENABLEDELAYEDEXPANSION - -FOR %%i IN ("%~dp0..\..") DO SET FLUTTER_ROOT=%%~fi - -SET flutter_tools_dir=%FLUTTER_ROOT%\packages\flutter_tools -SET cache_dir=%FLUTTER_ROOT%\bin\cache -SET snapshot_path=%cache_dir%\flutter_tools.snapshot -SET stamp_path=%cache_dir%\flutter_tools.stamp -SET script_path=%flutter_tools_dir%\bin\flutter_tools.dart -SET dart_sdk_path=%cache_dir%\dart-sdk -SET engine_stamp=%cache_dir%\engine-dart-sdk.stamp -SET engine_version_path=%FLUTTER_ROOT%\bin\internal\engine.version -SET pub_cache_path=%FLUTTER_ROOT%\.pub-cache - -SET dart=%dart_sdk_path%\bin\dart.exe -SET pub=%dart_sdk_path%\bin\pub.bat - -REM If available, add location of bundled mingit to PATH -SET mingit_path=%FLUTTER_ROOT%\bin\mingit\cmd -IF EXIST "%mingit_path%" SET PATH=%PATH%;%mingit_path% - -REM Test if Git is available on the Host -where /q git || ECHO Error: Unable to find git in your PATH. && EXIT /B 1 -REM Test if the flutter directory is a git clone, otherwise git rev-parse HEAD would fail -IF NOT EXIST "%flutter_root%\.git" ( - ECHO Error: The Flutter directory is not a clone of the GitHub project. - ECHO The flutter tool requires Git in order to operate properly; - ECHO to set up Flutter, run the following command: - ECHO git clone -b beta https://github.com/flutter/flutter.git - EXIT /B 1 -) - -REM Ensure that bin/cache exists. -IF NOT EXIST "%cache_dir%" MKDIR "%cache_dir%" - -REM If the cache still doesn't exist, fail with an error that we probably don't have permissions. -IF NOT EXIST "%cache_dir%" ( - ECHO Error: Unable to create cache directory at - ECHO %cache_dir% - ECHO. - ECHO This may be because flutter doesn't have write permissions for - ECHO this path. Try moving the flutter directory to a writable location, - ECHO such as within your home directory. - EXIT /B 1 -) - - -REM To debug the tool, you can uncomment the following lines to enable checked mode and set an observatory port: -REM SET FLUTTER_TOOL_ARGS="--checked %FLUTTER_TOOL_ARGS%" -REM SET FLUTTER_TOOL_ARGS="%FLUTTER_TOOL_ARGS% --observe=65432" - -:acquire_lock -2>NUL ( - REM "3" is now stderr because of "2>NUL". - CALL :subroutine %* 2>&3 9> "%cache_dir%\flutter.bat.lock" || GOTO acquire_lock -) -GOTO :after_subroutine - -:subroutine - PUSHD "%flutter_root%" - FOR /f %%r IN ('git rev-parse HEAD') DO SET revision=%%r - POPD - - REM The following IF conditions are all linked with a logical OR. However, - REM there is no OR operator in batch and a GOTO construct is used as replacement. - - IF NOT EXIST "%engine_stamp%" GOTO do_sdk_update_and_snapshot - SET /P dart_required_version=<"%engine_version_path%" - SET /P dart_installed_version=<"%engine_stamp%" - IF !dart_required_version! NEQ !dart_installed_version! GOTO do_sdk_update_and_snapshot - IF NOT EXIST "%snapshot_path%" GOTO do_snapshot - IF NOT EXIST "%stamp_path%" GOTO do_snapshot - SET /P stamp_value=<"%stamp_path%" - IF !stamp_value! NEQ !revision! GOTO do_snapshot - REM Compare "last modified" timestamps - SET pubspec_yaml_path=%flutter_tools_dir%\pubspec.yaml - SET pubspec_lock_path=%flutter_tools_dir%\pubspec.lock - FOR %%i IN ("%pubspec_yaml_path%") DO SET yaml_timestamp=%%~ti - FOR %%i IN ("%pubspec_lock_path%") DO SET lock_timestamp=%%~ti - IF !yaml_timestamp! EQU !lock_timestamp! GOTO do_snapshot - FOR /F %%i IN ('DIR /B /O:D "%pubspec_yaml_path%" "%pubspec_lock_path%"') DO SET newer_file=%%i - IF "%newer_file%" EQU "pubspec.yaml" GOTO do_snapshot - - REM Everything is uptodate - exit subroutine - EXIT /B - - :do_sdk_update_and_snapshot - ECHO Checking Dart SDK version... - SET update_dart_bin=%FLUTTER_ROOT%/bin/internal/update_dart_sdk.ps1 - REM Escape apostrophes from the executable path - SET "update_dart_bin=!update_dart_bin:'=''!" - CALL PowerShell.exe -ExecutionPolicy Bypass -Command "Unblock-File -Path '%update_dart_bin%'; & '%update_dart_bin%'" - IF "%ERRORLEVEL%" NEQ "0" ( - ECHO Error: Unable to update Dart SDK. Retrying... - timeout /t 5 /nobreak - GOTO :do_sdk_update_and_snapshot - ) - - :do_snapshot - IF EXIST "%FLUTTER_ROOT%\version" DEL "%FLUTTER_ROOT%\version" - ECHO: > "%cache_dir%\.dartignore" - ECHO Building flutter tool... - PUSHD "%flutter_tools_dir%" - - REM Makes changes to PUB_ENVIRONMENT only visible to commands within SETLOCAL/ENDLOCAL - SETLOCAL - SET VERBOSITY=--verbosity=error - IF "%CI%" == "true" GOTO on_bot - IF "%BOT%" == "true" GOTO on_bot - IF "%CONTINUOUS_INTEGRATION%" == "true" GOTO on_bot - IF "%CHROME_HEADLESS%" == "1" GOTO on_bot - GOTO not_on_bot - :on_bot - SET PUB_ENVIRONMENT=%PUB_ENVIRONMENT%:flutter_bot - SET VERBOSITY=--verbosity=normal - :not_on_bot - SET PUB_ENVIRONMENT=%PUB_ENVIRONMENT%:flutter_install - IF "%PUB_CACHE%" == "" ( - IF EXIST "%pub_cache_path%" SET PUB_CACHE=%pub_cache_path% - ) - - SET /A total_tries=10 - SET /A remaining_tries=%total_tries%-1 - :retry_pub_upgrade - ECHO Running pub upgrade... - CALL "%pub%" upgrade "%VERBOSITY%" --no-packages-dir - IF "%ERRORLEVEL%" EQU "0" goto :upgrade_succeeded - ECHO Error Unable to 'pub upgrade' flutter tool. Retrying in five seconds... (%remaining_tries% tries left) - timeout /t 5 /nobreak 2>NUL - SET /A remaining_tries-=1 - IF "%remaining_tries%" EQU "0" GOTO upgrade_retries_exhausted - GOTO :retry_pub_upgrade - :upgrade_retries_exhausted - SET exit_code=%ERRORLEVEL% - ECHO Error: 'pub upgrade' still failing after %total_tries% tries, giving up. - GOTO final_exit - :upgrade_succeeded - ENDLOCAL - - POPD - - CALL "%dart%" --snapshot="%snapshot_path%" --packages="%flutter_tools_dir%\.packages" "%script_path%" - IF "%ERRORLEVEL%" NEQ "0" ( - ECHO Error: Unable to create dart snapshot for flutter tool. - SET exit_code=%ERRORLEVEL% - GOTO :final_exit - ) - >"%stamp_path%" ECHO %revision% - - REM Exit Subroutine - EXIT /B - -:after_subroutine - -CALL "%dart%" %FLUTTER_TOOL_ARGS% "%snapshot_path%" %* -SET exit_code=%ERRORLEVEL% - -REM The VM exits with code 253 if the snapshot version is out-of-date. -IF "%exit_code%" EQU "253" ( - CALL "%dart%" --snapshot="%snapshot_path%" --packages="%flutter_tools_dir%\.packages" "%script_path%" - SET exit_code=%ERRORLEVEL% - IF "%exit_code%" EQU "253" ( - ECHO Error: Unable to create dart snapshot for flutter tool. - EXIT /B %exit_code% - ) - CALL "%dart%" %FLUTTER_TOOL_ARGS% "%snapshot_path%" %* - SET exit_code=%ERRORLEVEL% -) - -:final_exit -EXIT /B %exit_code%