129 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PowerShell
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			129 lines
		
	
	
		
			4.5 KiB
		
	
	
	
		
			PowerShell
		
	
	
		
			Executable File
		
	
	
	
	
| #!pwsh
 | |
| #Requires -Version 6.0
 | |
| 
 | |
| <#
 | |
| .SYNOPSIS
 | |
| Installs the set of prerequisites for the macOS CI hosts.
 | |
| 
 | |
| .DESCRIPTION
 | |
| Install-Prerequisites.ps1 installs all of the necessary prerequisites
 | |
| to run the vcpkg macOS CI in a vagrant virtual machine,
 | |
| skipping all prerequisites that are already installed and of the right version.
 | |
| 
 | |
| .INPUTS
 | |
| None
 | |
| 
 | |
| .OUTPUTS
 | |
| None
 | |
| #>
 | |
| [CmdletBinding()]
 | |
| Param()
 | |
| 
 | |
| Set-StrictMode -Version 2
 | |
| 
 | |
| if (-not $IsMacOS) {
 | |
|     Write-Error 'This script should only be run on a macOS host'
 | |
|     throw
 | |
| }
 | |
| 
 | |
| Import-Module "$PSScriptRoot/Utilities.psm1"
 | |
| 
 | |
| $Installables = Get-Content "$PSScriptRoot/configuration/installables.json" | ConvertFrom-Json
 | |
| 
 | |
| $Installables.Applications | ForEach-Object {
 | |
|     $VersionCommand = $_.VersionCommand
 | |
|     $InstalledVersion = (& $VersionCommand[0] $VersionCommand[1..$VersionCommand.Length])
 | |
|     if (-not $?) {
 | |
|         Write-Host "$($_.Name) not installed; installing now"
 | |
|     } else {
 | |
|         $InstalledVersion = $InstalledVersion -join "`n"
 | |
|         if ($InstalledVersion -match $_.VersionRegex) {
 | |
|             if ($Matches.Count -ne 2) {
 | |
|                 Write-Error "$($_.Name) has a malformed version regex ($($_.VersionRegex)); it should have a single capture group
 | |
|     (it has $($Matches.Count - 1))"
 | |
|                 throw
 | |
|             }
 | |
|             if ($Matches[1] -eq $_.Version) {
 | |
|                 Write-Host "$($_.Name) already installed and at the correct version ($($Matches[1]))"
 | |
|                 return
 | |
|             } else {
 | |
|                 Write-Host "$($_.Name) already installed but with the incorrect version
 | |
|     installed version: '$($Matches[1])'
 | |
|     required version : '$($_.Version)'
 | |
| upgrading now."
 | |
|             }
 | |
|         } else {
 | |
|             Write-Warning "$($_.Name)'s version command ($($VersionCommand -join ' ')) returned a value we did not expect:
 | |
|     $InstalledVersion
 | |
|     expected a version matching the regex: $($_.VersionRegex)
 | |
| Installing anyways."
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     if ($null -ne (Get-Member -InputObject $_ -Name 'DmgUrl')) {
 | |
|         $pathToDmg = "~/Downloads/$($_.Name).dmg"
 | |
|         Get-RemoteFile -OutFile $pathToDmg -Uri $_.DmgUrl -Sha256 $_.Sha256
 | |
| 
 | |
|         hdiutil attach $pathToDmg -mountpoint /Volumes/setup-installer
 | |
| 
 | |
|         if ($null -ne (Get-Member -InputObject $_ -Name 'InstallationCommands')) {
 | |
|             $_.InstallationCommands | % {
 | |
|                 Write-Host "> $($_ -join ' ')"
 | |
|                 & $_[0] $_[1..$_.Length] | Write-Host
 | |
|             }
 | |
|         } elseif ($null -ne (Get-Member -InputObject $_ -Name 'InstallerPath')) {
 | |
|             sudo installer -pkg "/Volumes/setup-installer/$($_.InstallerPath)" -target /
 | |
|             hdiutil detach /Volumes/setup-installer
 | |
|         } else {
 | |
|             Write-Error "$($_.Name) installer object has a DmgUrl, but neither an InstallerPath nor an InstallationCommands"
 | |
|             throw
 | |
|         }
 | |
|     } elseif ($null -ne (Get-Member -InputObject $_ -Name 'PkgUrl')) {
 | |
|         $pathToPkg = "~/Downloads/$($_.Name).pkg"
 | |
|         Get-RemoteFile -OutFile $pathToPkg -Uri $_.PkgUrl -Sha256 $_.Sha256
 | |
| 
 | |
|         sudo installer -pkg $pathToPkg -target /
 | |
|     } else {
 | |
|         Write-Error "$($_.Name) does not have an installer in the configuration file."
 | |
|         throw
 | |
|     }
 | |
| }
 | |
| 
 | |
| $installedVagrantPlugins = @{}
 | |
| vagrant plugin list --machine-readable | ForEach-Object {
 | |
|     $timestamp, $target, $type, $data = $_ -split ','
 | |
|     switch ($type) {
 | |
|         # these are not important
 | |
|         'ui' { }
 | |
|         'plugin-version-constraint' { }
 | |
|         'plugin-name' {
 | |
|             $installedVagrantPlugins[$data] = $Null
 | |
|         }
 | |
|         'plugin-version' {
 | |
|             $version = $data -replace '%!\(VAGRANT_COMMA\)',','
 | |
|             if ($version -notmatch '^(.*), global') {
 | |
|                 Write-Error "Invalid version string for plugin ${target}: $version"
 | |
|                 throw
 | |
|             }
 | |
|             $installedVagrantPlugins[$target] = $Matches[1]
 | |
|         }
 | |
|         default {
 | |
|             Write-Warning "Unknown plugin list member type $type for plugin $target"
 | |
|         }
 | |
|     }
 | |
| }
 | |
| $Installables.VagrantPlugins | ForEach-Object {
 | |
|     if (-not $installedVagrantPlugins.Contains($_.Name)) {
 | |
|         Write-Host "$($_.Name) not installed; installing now"
 | |
|     } elseif ($installedVagrantPlugins[$_.Name] -ne $_.Version) {
 | |
|         Write-Host "$($_.Name) already installed but with the incorrect version
 | |
|     installed version: '$($installedVagrantPlugins[$_.Name])'
 | |
|     required version:  '$($_.Version)'"
 | |
|     } else {
 | |
|         Write-Host "$($_.Name) already installed and at the correct version ($($_.Version))"
 | |
|         return
 | |
|     }
 | |
| 
 | |
|     vagrant plugin install $_.Name --plugin-version $_.Version
 | |
| }
 |