diff options
| author | JJ Liebig <jonathan.liebig@gmail.com> | 2026-08-14 21:48:59 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2026-08-14 22:48:59 +0300 |
| commit | cb727d055545b5b2fc366f778e4c57874d0aa8c1 (patch) | |
| tree | 112a6b2ca98c807eeb376c76764e34fb2acef5c9 /website/install.ps1 | |
| parent | d76657f2c7fc18dcce3b9af43842c8afaba1646b (diff) | |
fix: use verified local packages for windows updates (#2816)
refs #2751
Diffstat (limited to 'website/install.ps1')
| -rw-r--r-- | website/install.ps1 | 55 |
1 files changed, 44 insertions, 11 deletions
diff --git a/website/install.ps1 b/website/install.ps1 index d6367312..55b3b381 100644 --- a/website/install.ps1 +++ b/website/install.ps1 @@ -4,7 +4,11 @@ param( [string]$ManifestUrl = $env:HERDR_MANIFEST_URL, [string]$InstallDir = $env:HERDR_INSTALL_DIR, [string]$ExpectedBuildId = $env:HERDR_EXPECTED_BUILD_ID, - [int]$Retain = 3 + [int]$Retain = 3, + [string]$LocalPackagePath, + [string]$LocalPackageFormat, + [string]$LocalPackageIdentity, + [string]$LocalPackageSha256 ) Set-StrictMode -Version Latest @@ -20,6 +24,21 @@ if ($Channel -notin @("stable", "preview")) { exit 1 } +$localPackageValueCount = @( + $LocalPackagePath, + $LocalPackageFormat, + $LocalPackageIdentity, + $LocalPackageSha256 | + Where-Object { -not [string]::IsNullOrWhiteSpace($_) } +).Count +if ($localPackageValueCount -notin @(0, 4)) { + throw "Local package mode requires path, format, identity, and SHA-256." +} +$useLocalPackage = $localPackageValueCount -eq 4 +if ($useLocalPackage -and $LocalPackageFormat -notin @("zip", "exe")) { + throw "Local Herdr package has unsupported format '$LocalPackageFormat'." +} + function Write-Step { param([string]$Message) Write-Host "==> $Message" @@ -548,7 +567,7 @@ switch ($architecture) { } } -if ([string]::IsNullOrWhiteSpace($ManifestUrl)) { +if (-not $useLocalPackage -and [string]::IsNullOrWhiteSpace($ManifestUrl)) { $ManifestUrl = if ($Channel -eq "preview") { "https://herdr.dev/preview.json" } else { @@ -589,13 +608,21 @@ if (-not [string]::IsNullOrWhiteSpace($existingHerdr) -and -not (Test-PathStarts Write-WarningStep "PATH order decides which Herdr runs. This installer will put $visibleBinDir first for future and current PowerShell sessions." } -Write-Step "Fetching Herdr $Channel manifest" -$manifest = ConvertTo-ManifestObject -Manifest (Invoke-RestMethod -Uri $ManifestUrl) -if (-not [string]::IsNullOrWhiteSpace($ExpectedBuildId) -and [string]$manifest.build_id -ne $ExpectedBuildId) { - throw "Preview manifest changed while updating. Expected build $ExpectedBuildId but found $($manifest.build_id). Run herdr update again." +if ($useLocalPackage) { + $versionIdentity = $LocalPackageIdentity + $asset = [PSCustomObject]@{ + Sha256 = $LocalPackageSha256 + Format = $LocalPackageFormat + } +} else { + Write-Step "Fetching Herdr $Channel manifest" + $manifest = ConvertTo-ManifestObject -Manifest (Invoke-RestMethod -Uri $ManifestUrl) + if (-not [string]::IsNullOrWhiteSpace($ExpectedBuildId) -and [string]$manifest.build_id -ne $ExpectedBuildId) { + throw "Preview manifest changed while updating. Expected build $ExpectedBuildId but found $($manifest.build_id). Run herdr update again." + } + $versionIdentity = Resolve-HerdrVersion -Manifest $manifest -SelectedChannel $Channel + $asset = Get-ManifestAsset -Manifest $manifest -Target $target } -$versionIdentity = Resolve-HerdrVersion -Manifest $manifest -SelectedChannel $Channel -$asset = Get-ManifestAsset -Manifest $manifest -Target $target $safeVersionIdentity = $versionIdentity -replace '[^0-9A-Za-z._-]', '-' $releaseName = "$safeVersionIdentity-$targetTriple" $releaseDir = Join-Path $releasesDir $releaseName @@ -609,10 +636,16 @@ try { Remove-StaleInstallArtifacts -ReleasesDir $releasesDir if (-not (Test-HerdrReleaseComplete -ReleaseDir $releaseDir -Format $asset.Format)) { - $downloadPath = Join-Path $tempDir "herdr-download.$($asset.Format)" + $downloadPath = if ($useLocalPackage) { + $LocalPackagePath + } else { + Join-Path $tempDir "herdr-download.$($asset.Format)" + } $stagingDir = Join-Path $releasesDir ".staging.$releaseName.$PID" - Write-Step "Downloading Herdr" - Invoke-WebRequest -Uri $asset.Url -OutFile $downloadPath + if (-not $useLocalPackage) { + Write-Step "Downloading Herdr" + Invoke-WebRequest -Uri $asset.Url -OutFile $downloadPath + } Test-FileDigest -Path $downloadPath -ExpectedDigest $asset.Sha256 if ($asset.Format -eq "zip") { |
