aboutsummaryrefslogtreecommitdiff
path: root/website/install.ps1
diff options
context:
space:
mode:
authorJJ Liebig <jonathan.liebig@gmail.com>2026-08-14 21:48:59 +0200
committerGitHub <noreply@github.com>2026-08-14 22:48:59 +0300
commitcb727d055545b5b2fc366f778e4c57874d0aa8c1 (patch)
tree112a6b2ca98c807eeb376c76764e34fb2acef5c9 /website/install.ps1
parentd76657f2c7fc18dcce3b9af43842c8afaba1646b (diff)
fix: use verified local packages for windows updates (#2816)
refs #2751
Diffstat (limited to 'website/install.ps1')
-rw-r--r--website/install.ps155
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") {