81 lines
2.7 KiB
PowerShell
81 lines
2.7 KiB
PowerShell
|
|
<#
|
|||
|
|
.SYNOPSIS
|
|||
|
|
Grokkit Windows installer (PowerShell)
|
|||
|
|
.DESCRIPTION
|
|||
|
|
Downloads, verifies checksum, extracts, and installs grokkit.exe.
|
|||
|
|
Mirrors the hardened grokkit-install.sh exactly.
|
|||
|
|
#>
|
|||
|
|
|
|||
|
|
$ErrorActionPreference = 'Stop'
|
|||
|
|
|
|||
|
|
$VERSION = $env:VERSION
|
|||
|
|
if (-not $VERSION) {
|
|||
|
|
Write-Error "❌ VERSION environment variable not set. Example: `$env:VERSION='0.3.3'; ./grokkit-install.ps1"
|
|||
|
|
exit 1
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Strip leading 'v' if present
|
|||
|
|
$VERSION = $VERSION.TrimStart('v')
|
|||
|
|
|
|||
|
|
$GITEA_BASE = "https://repos.gmgauthier.com/gmgauthier/grokkit"
|
|||
|
|
|
|||
|
|
# Platform detection (Windows only supports amd64 for now; arm64 ready for future)
|
|||
|
|
$ARCH = "amd64"
|
|||
|
|
if ($env:PROCESSOR_ARCHITECTURE -like "*ARM*") {
|
|||
|
|
$ARCH = "arm64"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$ASSET = "grokkit-windows-${ARCH}-v${VERSION}.tar.gz"
|
|||
|
|
|
|||
|
|
Write-Host "Installing grokkit ${VERSION} for windows/${ARCH}..."
|
|||
|
|
|
|||
|
|
$TempDir = Join-Path ([System.IO.Path]::GetTempPath()) ([System.Guid]::NewGuid().ToString())
|
|||
|
|
New-Item -ItemType Directory -Path $TempDir | Out-Null
|
|||
|
|
try {
|
|||
|
|
Push-Location $TempDir
|
|||
|
|
|
|||
|
|
# Download asset + checksums
|
|||
|
|
Write-Host "Downloading ${ASSET}..."
|
|||
|
|
Invoke-WebRequest -Uri "${GITEA_BASE}/releases/download/v${VERSION}/${ASSET}" -OutFile "asset.tar.gz"
|
|||
|
|
|
|||
|
|
Write-Host "Downloading checksums.txt..."
|
|||
|
|
Invoke-WebRequest -Uri "${GITEA_BASE}/releases/download/v${VERSION}/checksums.txt" -OutFile "checksums.txt"
|
|||
|
|
|
|||
|
|
# Robust checksum verification
|
|||
|
|
Write-Host "Verifying checksum..."
|
|||
|
|
$ChecksumContent = Get-Content "checksums.txt" -Raw
|
|||
|
|
$HashLine = $ChecksumContent -split "`n" | Where-Object { $_ -match $ASSET }
|
|||
|
|
if ($HashLine) {
|
|||
|
|
$ExpectedHash = ($HashLine -split '\s+')[0]
|
|||
|
|
$ActualHash = (Get-FileHash "asset.tar.gz" -Algorithm SHA256).Hash.ToLower()
|
|||
|
|
if ($ActualHash -ne $ExpectedHash) {
|
|||
|
|
Write-Error "❌ Checksum mismatch for ${ASSET}!"
|
|||
|
|
exit 1
|
|||
|
|
}
|
|||
|
|
Write-Host "✅ Checksum verified successfully"
|
|||
|
|
}
|
|||
|
|
else {
|
|||
|
|
Write-Warning "⚠️ No checksum entry found for ${ASSET} – continuing without verification"
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# Extract (modern Windows has tar.exe)
|
|||
|
|
Write-Host "Extracting asset..."
|
|||
|
|
tar -xzf "asset.tar.gz"
|
|||
|
|
|
|||
|
|
# The binary inside is named grokkit-windows-amd64.exe (per release workflow)
|
|||
|
|
$BinaryName = "grokkit-windows-${ARCH}.exe"
|
|||
|
|
|
|||
|
|
# Install
|
|||
|
|
$InstallDir = Join-Path $env:USERPROFILE ".local\bin"
|
|||
|
|
New-Item -ItemType Directory -Path $InstallDir -Force | Out-Null
|
|||
|
|
Move-Item $BinaryName "${InstallDir}\grokkit.exe" -Force
|
|||
|
|
Write-Host "✅ grokkit ${VERSION} installed to ${InstallDir}\grokkit.exe"
|
|||
|
|
|
|||
|
|
Write-Host "Add to PATH if needed: `$env:PATH += `";${InstallDir}`""
|
|||
|
|
& "${InstallDir}\grokkit.exe" version
|
|||
|
|
}
|
|||
|
|
finally {
|
|||
|
|
Pop-Location
|
|||
|
|
Remove-Item -Recurse -Force $TempDir -ErrorAction SilentlyContinue
|
|||
|
|
}
|