Files
rdbms-playground/scripts/install.ps1
T
claude@clouddev1 c0531aa048 fix(install): use install.ps1 immediately + honest PATH guidance
The persisted User PATH only reaches newly-started processes, so the old
"restart your shell" advice was wrong — a sign-out/in was actually needed
(observed on Windows 11). Update the current session's $env:Path as well
so the command works right away in the same window, and reword the notice.

Also refresh the header: verified on ARM64 Windows 11 under Windows
PowerShell 5.1 and PowerShell 7.6 against the live v0.2.0 release.
2026-06-19 14:57:25 +00:00

123 lines
5.3 KiB
PowerShell

<#
.SYNOPSIS
Download and install a prebuilt rdbms-playground binary (Windows).
.DESCRIPTION
The Windows counterpart of scripts/install.sh. Detects the CPU
architecture, downloads the matching release .exe from the Gitea
releases, verifies its SHA-256 checksum, installs it to
%LOCALAPPDATA%\Programs\rdbms-playground, and adds that directory to
your user PATH.
Quick start:
irm https://git.lazyeval.net/oli/rdbms-playground/raw/branch/main/scripts/install.ps1 | iex
We ship gnu / gnullvm Windows builds (x86_64 / aarch64); this maps the
host architecture to the right asset.
.PARAMETER Version
Install a specific tag (e.g. v0.2.0) instead of the latest release.
Defaults to $env:RDBMS_VERSION, else the latest release.
.PARAMETER InstallDir
Install directory. Defaults to $env:RDBMS_INSTALL_DIR, else
%LOCALAPPDATA%\Programs\rdbms-playground.
.NOTES
Verified end-to-end on ARM64 Windows 11 under both Windows PowerShell 5.1
and PowerShell 7.6, against the live v0.2.0 release. The x86_64 branch is
symmetric (env-based arch detection + a confirmed matching release asset)
but has not been run directly. The sibling installer is install.sh
(Linux/macOS).
#>
[CmdletBinding()]
param(
[string]$Version = $env:RDBMS_VERSION,
[string]$InstallDir = $(if ($env:RDBMS_INSTALL_DIR) { $env:RDBMS_INSTALL_DIR } else { "$env:LOCALAPPDATA\Programs\rdbms-playground" })
)
Set-StrictMode -Version Latest
$ErrorActionPreference = 'Stop'
# Windows PowerShell 5.1 (the in-box shell) can negotiate only TLS 1.0/1.1 by
# default, which modern hosts reject. Opt into TLS 1.2 without disturbing any
# protocols already enabled. (No-op on PowerShell 7.)
[Net.ServicePointManager]::SecurityProtocol =
[Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12
$Repo = 'https://git.lazyeval.net/oli/rdbms-playground'
$Api = 'https://git.lazyeval.net/api/v1/repos/oli/rdbms-playground'
$Bin = 'rdbms-playground'
# Map the host CPU to the target triple we publish for Windows.
# Read the architecture from the environment rather than
# RuntimeInformation::OSArchitecture: under Windows PowerShell 5.1 that type
# resolves from a .NET Framework facade that lacks OSArchitecture, which (with
# StrictMode) throws "property cannot be found". PROCESSOR_ARCHITECTURE is set
# on every PowerShell version; PROCESSOR_ARCHITEW6432 reports the true OS
# architecture when a 32-bit shell runs under WOW64.
$osArch = [Environment]::GetEnvironmentVariable('PROCESSOR_ARCHITEW6432')
if (-not $osArch) {
$osArch = [Environment]::GetEnvironmentVariable('PROCESSOR_ARCHITECTURE')
}
switch ($osArch) {
'AMD64' { $target = 'x86_64-pc-windows-gnu' }
'ARM64' { $target = 'aarch64-pc-windows-gnullvm' }
default { throw "install: unsupported CPU architecture: $osArch" }
}
# Resolve the release tag (explicit -Version, else the latest release).
if (-not $Version) {
$Version = (Invoke-RestMethod -Uri "$Api/releases/latest").tag_name
if (-not $Version) { throw 'install: could not determine the latest release tag' }
}
$asset = "$Bin-$Version-$target.exe"
$url = "$Repo/releases/download/$Version/$asset"
$tmp = Join-Path $env:TEMP ([System.Guid]::NewGuid().ToString())
New-Item -ItemType Directory -Path $tmp -Force | Out-Null
try {
$exe = Join-Path $tmp "$Bin.exe"
$shaFile = "$exe.sha256"
Write-Host "downloading $asset ..."
# -UseBasicParsing: Windows PowerShell 5.1's Invoke-WebRequest otherwise
# tries to use the Internet Explorer engine and can fail when it is absent.
# (No-op on PowerShell 7.)
Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $exe
Invoke-WebRequest -UseBasicParsing -Uri "$url.sha256" -OutFile $shaFile
# The sidecar is "<hash> <name>"; compare just the hash.
$expected = ((Get-Content -Raw $shaFile) -split '\s+')[0].ToLower()
$actual = (Get-FileHash -Algorithm SHA256 -Path $exe).Hash.ToLower()
if ($expected -ne $actual) {
throw "install: checksum mismatch (expected $expected, got $actual) — refusing to install"
}
New-Item -ItemType Directory -Path $InstallDir -Force | Out-Null
$dest = Join-Path $InstallDir "$Bin.exe"
Move-Item -Path $exe -Destination $dest -Force
Write-Host "installed $Bin $Version -> $dest"
# Persist the install dir on the user PATH (for future shells) if missing.
$userPath = [Environment]::GetEnvironmentVariable('Path', 'User')
if (-not $userPath) { $userPath = '' }
if (($userPath -split ';') -notcontains $InstallDir) {
$newPath = if ($userPath) { "$userPath;$InstallDir" } else { $InstallDir }
[Environment]::SetEnvironmentVariable('Path', $newPath, 'User')
}
# Also update THIS session's PATH so the command works immediately. The
# persisted change only reaches newly-started processes; an already-running
# shell (and, depending on how the terminal inherited its environment, even
# a freshly-opened one) won't see it until the next sign-out/in.
if (($env:Path -split ';') -notcontains $InstallDir) {
$env:Path = "$env:Path;$InstallDir"
}
Write-Host "added $InstallDir to your PATH — '$Bin' works in this window now."
Write-Host "for shells already open elsewhere, sign out and back in (or open a fresh one)."
}
finally {
Remove-Item -Path $tmp -Recurse -Force -ErrorAction SilentlyContinue
}