# 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" }