[CmdletBinding()] param() $ErrorActionPreference = 'Stop' $assetName = 'WezTerm-nightly-setup.exe' $releaseApi = 'https://api.github.com/repos/wez/wezterm/releases/tags/nightly' $stampPath = Join-Path $env:LOCALAPPDATA 'topgrade\wezterm-nightly.sha256' if (Get-Process -Name 'wezterm-gui' -ErrorAction SilentlyContinue) { Write-Output 'Skipping WezTerm update because WezTerm is running.' exit 0 } $wezterm = Get-Command wezterm.exe -CommandType Application -ErrorAction Stop $release = Invoke-RestMethod -Uri $releaseApi -Headers @{ 'User-Agent' = 'dotfiles-topgrade' } $asset = @($release.assets | Where-Object Name -eq $assetName) | Select-Object -First 1 if ($null -eq $asset -or $asset.digest -notmatch '^sha256:[0-9a-fA-F]{64}$') { throw "GitHub nightly release does not contain a verified $assetName asset." } if ($asset.browser_download_url -ne "https://github.com/wez/wezterm/releases/download/nightly/$assetName") { throw "Unexpected WezTerm download URL: $($asset.browser_download_url)" } $digest = $asset.digest.ToLowerInvariant() $knownDigest = if (Test-Path -LiteralPath $stampPath -PathType Leaf) { (Get-Content -LiteralPath $stampPath -Raw).Trim().ToLowerInvariant() } if ($knownDigest -eq $digest) { $version = & $wezterm.Source --version if ($LASTEXITCODE -ne 0) { throw "Installed WezTerm failed version check with exit code $LASTEXITCODE." } Write-Output "WezTerm nightly already current: $version" exit 0 } $tempPath = Join-Path ([IO.Path]::GetTempPath()) "WezTerm-nightly-setup-$PID.exe" try { Invoke-WebRequest -Uri $asset.browser_download_url -OutFile $tempPath $actualHash = (Get-FileHash -LiteralPath $tempPath -Algorithm SHA256).Hash.ToLowerInvariant() if ("sha256:$actualHash" -ne $digest) { throw "WezTerm installer checksum mismatch: expected $digest, got sha256:$actualHash" } $installer = Start-Process -FilePath $tempPath -ArgumentList @( '/VERYSILENT', '/SUPPRESSMSGBOXES', '/NORESTART' ) -Wait -PassThru if ($installer.ExitCode -ne 0) { throw "WezTerm installer failed with exit code $($installer.ExitCode)." } $version = & $wezterm.Source --version if ($LASTEXITCODE -ne 0) { throw "Updated WezTerm failed version check with exit code $LASTEXITCODE." } New-Item -ItemType Directory -Path (Split-Path -Parent $stampPath) -Force | Out-Null Set-Content -LiteralPath $stampPath -Value $digest -NoNewline Write-Output "Updated WezTerm nightly: $version" } finally { Remove-Item -LiteralPath $tempPath -Force -ErrorAction SilentlyContinue }