forked from etc/pineapple-src
129 lines
4.5 KiB
PowerShell
129 lines
4.5 KiB
PowerShell
|
#!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
|
||
|
}
|