Luigit
repositories / dotfiles

dotfiles

bugabingas dorkfiles

owned by admin

topgrade/update-wezterm-nightly.ps1

Raw
[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
}