diff --git a/bin/flutter b/bin/flutter index d84050e7f7..9de1eb740c 100755 --- a/bin/flutter +++ b/bin/flutter @@ -3,6 +3,15 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. + +# ---------------------------------- NOTE ---------------------------------- # +# +# Please keep the logic in this file consistent with the logic in the +# `flutter.ps1` script in the same directory to ensure that Flutter continues +# to work across all platforms! +# +# -------------------------------------------------------------------------- # + set -e function follow_links() { @@ -35,6 +44,18 @@ SCRIPT_PATH="$FLUTTER_TOOLS_DIR/bin/flutter_tools.dart" DART_SDK_PATH="$FLUTTER_ROOT/bin/cache/dart-sdk" DART="$DART_SDK_PATH/bin/dart" +PUB="$DART_SDK_PATH/bin/pub" + +# Test if Git is available on the Host +if ! hash git 2>/dev/null; then + echo "Error: Unable to find git in your PATH." + exit 1 +fi +# Test if the flutter directory is a git clone (otherwise git rev-parse HEAD would fail) +if [ ! -d "$FLUTTER_ROOT/.git" ]; then + echo "Error: The Flutter directory is not a clone of the GitHub project." + exit 1 +fi # To debug the tool, you can uncomment the following line to enable checked mode and set an observatory port: # FLUTTER_TOOL_ARGS="--observe=65432 --checked" @@ -51,8 +72,7 @@ DART="$DART_SDK_PATH/bin/dart" "$FLUTTER_ROOT/bin/internal/update_dart_sdk.sh" echo Building flutter tool... - FLUTTER_DIR="$FLUTTER_ROOT/packages/flutter" - (cd "$FLUTTER_TOOLS_DIR"; rm -f pubspec.lock; "../../bin/cache/dart-sdk/bin/pub" get --verbosity=error --no-packages-dir) + (cd "$FLUTTER_TOOLS_DIR"; rm -f pubspec.lock; "$PUB" get --verbosity=error --no-packages-dir) "$DART" --snapshot="$SNAPSHOT_PATH" --packages="$FLUTTER_TOOLS_DIR/.packages" "$SCRIPT_PATH" echo $REVISION > "$STAMP_PATH" fi diff --git a/bin/flutter.bat b/bin/flutter.bat deleted file mode 100644 index 79f525e7d1..0000000000 --- a/bin/flutter.bat +++ /dev/null @@ -1,53 +0,0 @@ -@ECHO off -REM Copyright 2015 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. - -SETLOCAL ENABLEDELAYEDEXPANSION -FOR %%i IN ("%~dp0..") DO SET "flutter_root=%%~fi" REM Get the parent directory -SET flutter_tools_dir=%flutter_root%\packages\flutter_tools -SET flutter_dir=%flutter_root%\packages\flutter -SET snapshot_path=%flutter_root%\bin\cache\flutter_tools.snapshot -SET stamp_path=%flutter_root%\bin\cache\flutter_tools.stamp -SET script_path=%flutter_tools_dir%\bin\flutter_tools.dart -REM TODO: Don't require dart to be on the user's path -SET dart=dart - -REM Set current working directory to the flutter directory -PUSHD %flutter_root% -REM IF doesn't have an "or". Instead, just use GOTO -FOR /f %%r IN ('git rev-parse HEAD') DO SET revision=%%r -IF NOT EXIST %snapshot_path% GOTO do_snapshot -IF NOT EXIST %stamp_path% GOTO do_snapshot -FOR /f "delims=" %%x in (%stamp_path%) do set stamp_value=%%x -IF "!stamp_value!" NEQ "!revision!" GOTO do_snapshot - -REM Getting modified timestamps in a batch file is ... troublesome -REM More info: http://stackoverflow.com/questions/1687014/how-do-i-compare-timestamps-of-files-in-a-dos-batch-script -FOR %%f IN (%flutter_tools_dir%\pubspec.yaml) DO SET yamlt=%%~tf -FOR %%a IN (%flutter_tools_dir%\pubspec.lock) DO SET lockt=%%~ta -IF !lockt! LSS !yamlt! GOTO do_snapshot - -GOTO :after_snapshot - -:do_snapshot -CD "%flutter_tools_dir%" -ECHO Updating flutter tool... -CALL pub.bat get -CD "%flutter_dir%" -REM Allows us to check if sky_engine's REVISION is correct -CALL pub.bat get -CD "%flutter_root%" -CALL %dart% --snapshot="%snapshot_path%" --packages="%flutter_tools_dir%\.packages" "%script_path%" - "%stamp_path%" - -:after_snapshot - -REM Go back to last working directory -POPD -CALL %dart% "%snapshot_path%" %* - -IF /I "%ERRORLEVEL%" EQU "253" ( - CALL %dart% --snapshot="%snapshot_path%" --packages="%flutter_tools_dir%\.packages" "%script_path%" - CALL %dart% "%snapshot_path%" %* -) diff --git a/bin/flutter.ps1 b/bin/flutter.ps1 index 9a9083db34..f7f312b1e6 100644 --- a/bin/flutter.ps1 +++ b/bin/flutter.ps1 @@ -1,99 +1,69 @@ -# Copyright 2015 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. - -# How to use this script: -# - Allow the execution of PowerShell scripts (ByPass, etc.), for example: -# Set-ExecutionPolicy Unrestricted -# - Invoke any flutter command: Flutter.ps1 doctor -# - Force the path to Dart SDK: Flutter.ps1 -DartPath "c:\tools\dart\" - -[CmdletBinding()] -param ( - [Parameter(Mandatory=$False)] - [string]$DartPath, - [Parameter(Mandatory=$False)] - [switch]$Diag, - [parameter(mandatory=$False, position=1, ValueFromRemainingArguments=$true)] - $Remaining -) - -# This function creates a snapshot of the latest version of flutter framework -function Do-Snapshot -{ - Set-Location $flutterToolsDir - Write-Host "Info: Updating flutter tool..." - Invoke-Expression "pub.bat get $(&{If($Diag) {"--verbose"}})" - Set-Location $flutterDir - # Allows us to check if sky_engine's REVISION is correct - Write-Host "Info: Updating sky engine..." - Invoke-Expression "pub.bat get $(&{If($Diag) {"--verbose"}})" - Set-Location $flutterRoot - Invoke-Expression "$dartExe --snapshot=`"$snapshotPath`" `"$scriptPath`" --packages=`"$flutterToolsDir\.packages`"" - $revision | Out-File $stampPath -} - -# Save the current location -Push-Location - -# Get the parent directory -$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition -$flutterRoot = (get-item $scriptPath ).parent.FullName - -$flutterToolsDir = $flutterRoot + '\packages\flutter_tools' -$flutterDir = $flutterRoot + '\packages\flutter' -$snapshotPath = $flutterRoot + '\bin\cache\flutter_tools.snapshot' -$stampPath = $flutterRoot + '\bin\cache\flutter_tools.stamp' -$scriptPath = $flutterToolsDir + '\bin\flutter_tools.dart' -$dartExe = [io.path]::combine($DartPath, 'dart.exe') - -# Set current working directory to the flutter directory -Set-Location $flutterRoot - -# Test if Git is available on the Host -if ((Get-Command "git.exe" -ErrorAction SilentlyContinue) -eq $null) { - Write-Host "Error: Unable to find git.exe in your PATH" - Pop-Location - exit -} -# Test if the flutter directory is a git clone (otherwise git rev-parse HEAD would fail) -if (-not (Test-Path '.git')) { - Write-Host "Error: The flutter directory is not a clone of the GH project" - Pop-Location - exit -} -# Test if pub.bat is available on the Host -if ((Get-Command "pub.bat" -ErrorAction SilentlyContinue) -eq $null) { - Write-Host "Error: Unable to find Dart SDK in your PATH" - Pop-Location - exit -} - -# Check if the snapshot version is out-of-date. -$revision = Invoke-Expression "git rev-parse HEAD" -if ( (-not (Test-Path $snapshotPath)) -Or (-not (Test-Path $stampPath)) ) { - Write-Host "Info: Snapshot doesn't exist" - Do-Snapshot -} -$stampValue = Get-Content $stampPath | Where-Object {$_ -match '\S'} -if ($stampValue -ne $revision) { - Write-Host "Info: Timestamp differs from revision" - Do-Snapshot -} -$yamltLastWriteTime = (ls "$flutterToolsDir\pubspec.yaml").LastWriteTime -$locktLastWriteTime = (ls "$flutterToolsDir\pubspec.lock").LastWriteTime -if ($locktLastWriteTime -lt $yamltLastWriteTime) { - Write-Host "Info: Mismatch between yaml and lock files" - Do-Snapshot -} - -# Go back to last working directory -Pop-Location -Invoke-Expression "$dartExe `"$snapshotPath`" $Remaining" - -# The VM exits with code 253 if the snapshot version is out-of-date. -if ($LASTEXITCODE -eq 253) { - Write-Host "Info: VM exited with code 253, we need to snapshot it again." - Invoke-Expression "$dartExe --snapshot=`"$snapshotPath`" `"$scriptPath`" --packages=`"$flutterToolsDir\.packages`"" - Invoke-Expression "$dartExe `"$snapshotPath`" $Remaining" -} +# 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. + + +# ---------------------------------- NOTE ---------------------------------- # +# +# Please keep the logic in this file consistent with the logic in the +# `flutter` script in the same directory to ensure that Flutter continues to +# work across all platforms! +# +# -------------------------------------------------------------------------- # + +$ErrorActionPreference = "Stop" + +$progName = split-path -parent $MyInvocation.MyCommand.Definition +$flutterRoot = (get-item $progName ).parent.FullName +$env:FLUTTER_ROOT = $flutterRoot + +$flutterToolsDir = "$flutterRoot\packages\flutter_tools" +$snapshotPath = "$flutterRoot\bin\cache\flutter_tools.snapshot" +$stampPath = "$flutterRoot\bin\cache\flutter_tools.stamp" +$scriptPath = "$flutterToolsDir\bin\flutter_tools.dart" +$dartSdkPath = "$flutterRoot\bin\cache\dart-sdk" + +$dart = "$dartSdkPath\bin\dart.exe" +$pub = "$dartSdkPath\bin\pub.bat" + +# Test if Git is available on the Host +if ((Get-Command "git.exe" -ErrorAction SilentlyContinue) -eq $null) { + Write-Host "Error: Unable to find git.exe in your PATH." + exit +} +# Test if the flutter directory is a git clone (otherwise git rev-parse HEAD would fail) +if (-not (Test-Path "$flutterRoot\.git")) { + Write-Host "Error: The Flutter directory is not a clone of the GitHub project." + exit +} + +Push-Location +Set-Location $flutterRoot +$revision = Invoke-Expression "git rev-parse HEAD" +Pop-Location + +if (!(Test-Path $snapshotPath) ` + -or !(Test-Path $stampPath) ` + -or ((Get-Content $stampPath) -ne $revision) ` + -or !(Test-Path "$flutterToolsDir\pubspec.lock") ` + -or ((ls "$flutterToolsDir\pubspec.lock").LastWriteTime -lt (ls "$flutterToolsDir\pubspec.yaml").LastWriteTime)) { + New-Item "$flutterRoot\bin\cache" -force -type directory | Out-Null + New-Item "$flutterRoot\bin\cache\.dartignore" -force -type file | Out-Null + Invoke-Expression "$flutterRoot\bin\internal\update_dart_sdk.ps1" + + Write-Host "Building flutter tool..." + Set-Location $flutterToolsDir + if (Test-Path "$flutterToolsDir\pubspec.lock") { Remove-Item "$flutterToolsDir\pubspec.lock" } + Invoke-Expression "$pub get --verbosity=error --no-packages-dir" + Set-Location $flutterRoot + Invoke-Expression "$dart --snapshot=`"$snapshotPath`" `"$scriptPath`" --packages=`"$flutterToolsDir\.packages`"" + $revision | Out-File $stampPath +} + +Invoke-Expression "$dart `"$snapshotPath`" $args" + +# The VM exits with code 253 if the snapshot version is out-of-date. +if ($LASTEXITCODE -eq 253) { + Invoke-Expression "$dart --snapshot=`"$snapshotPath`" `"$scriptPath`" --packages=`"$flutterToolsDir\.packages`"" + Invoke-Expression "$dart `"$snapshotPath`" $args" +} diff --git a/bin/internal/update_dart_sdk.ps1 b/bin/internal/update_dart_sdk.ps1 new file mode 100644 index 0000000000..7864bfce64 --- /dev/null +++ b/bin/internal/update_dart_sdk.ps1 @@ -0,0 +1,40 @@ +# 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. + + +# ---------------------------------- NOTE ---------------------------------- # +# +# Please keep the logic in this file consistent with the logic in the +# `update_dart_sdk.sh` script in the same directory to ensure that Flutter +# continues to work across all platforms! +# +# -------------------------------------------------------------------------- # + +$ErrorActionPreference = "Stop" + +$progName = split-path -parent $MyInvocation.MyCommand.Definition +$flutterRoot = (get-item $progName ).parent.parent.FullName + +$dartSdkPath = "$flutterRoot\bin\cache\dart-sdk" +$dartSdkStampPath = "$flutterRoot\bin\cache\dart-sdk.stamp" +$dartSdkVersion = (Get-Content "$flutterRoot\bin\internal\dart-sdk.version") + +if ((Test-Path $dartSdkStampPath) -and ($dartSdkVersion -eq (Get-Content $dartSdkStampPath))) { + return +} + +Write-Host "Downloading Dart SDK $dartSdkVersion..." +$dartZipName = "dartsdk-windows-x64-release.zip" +$dartChannel = if ($dartSdkVersion.Contains("-dev.")) {"dev"} else {"stable"} +$dartSdkUrl = "https://storage.googleapis.com/dart-archive/channels/$dartChannel/raw/$dartSdkVersion/sdk/$dartZipName" + +if (Test-Path $dartSdkPath) { Remove-Item $dartSdkPath -Recurse } +New-Item $dartSdkPath -force -type directory | Out-Null +$dartSdkZip = "$flutterRoot\bin\cache\dart-sdk.zip" + +Start-BitsTransfer -Source $dartSdkUrl -Destination $dartSdkZip +Add-Type -assembly "system.io.compression.filesystem" +[io.compression.zipfile]::ExtractToDirectory($dartSdkZip, "$flutterRoot\bin\cache") +Remove-Item $dartSdkZip +$dartSdkVersion | out-file $dartSdkStampPath diff --git a/bin/internal/update_dart_sdk.sh b/bin/internal/update_dart_sdk.sh index 76177c569a..198a91ada4 100755 --- a/bin/internal/update_dart_sdk.sh +++ b/bin/internal/update_dart_sdk.sh @@ -3,6 +3,15 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. + +# ---------------------------------- NOTE ---------------------------------- # +# +# Please keep the logic in this file consistent with the logic in the +# `update_dart_sdk.ps1` script in the same directory to ensure that Flutter +# continues to work across all platforms! +# +# -------------------------------------------------------------------------- # + set -e FLUTTER_ROOT="$(dirname "$(dirname "$(dirname "${BASH_SOURCE[0]}")")")"