# portview installer for Windows
# Usage: irm https://raw.githubusercontent.com/mapika/portview/main/install.ps1 | iex
$ErrorActionPreference = 'Stop'
$Repo = 'mapika/portview'
$Binary = 'portview.exe'
$InstallDir = "$env:USERPROFILE\.portview\bin"
# -- Detect architecture --
$Arch = $env:PROCESSOR_ARCHITECTURE
switch ($Arch) {
'AMD64' { $Target = 'windows-x86_64' }
default { Write-Error "Unsupported architecture: $Arch"; exit 1 }
}
# -- Fetch latest release --
Write-Host "-> Detecting latest release..."
$Release = Invoke-RestMethod -Uri "https://api.github.com/repos/$Repo/releases/latest"
$Version = $Release.tag_name -replace '^v', ''
if (-not $Version) {
Write-Error "Could not determine latest version."
exit 1
}
$Url = "https://github.com/$Repo/releases/download/v$Version/portview-$Target.zip"
$ChecksumUrl = "https://github.com/$Repo/releases/download/v$Version/SHA256SUMS"
Write-Host "-> Downloading portview v$Version for $Target..."
# -- Download and verify --
$TmpDir = Join-Path ([System.IO.Path]::GetTempPath()) "portview-install-$(Get-Random)"
New-Item -ItemType Directory -Path $TmpDir -Force | Out-Null
try {
$ZipPath = Join-Path $TmpDir 'portview.zip'
Invoke-WebRequest -Uri $Url -OutFile $ZipPath -UseBasicParsing
# Try to download and verify checksum
try {
$SumsPath = Join-Path $TmpDir 'SHA256SUMS'
Invoke-WebRequest -Uri $ChecksumUrl -OutFile $SumsPath -UseBasicParsing
Write-Host "-> Verifying checksum..."
$Expected = (Get-Content $SumsPath | Where-Object { $_ -match "portview-$Target\.zip" }) -replace '\s+.*$', ''
$Actual = (Get-FileHash -Path $ZipPath -Algorithm SHA256).Hash.ToLower()
if (-not $Expected) {
Write-Host "Warning: No checksum found for portview-$Target.zip in SHA256SUMS"
} elseif ($Expected -ne $Actual) {
Write-Error "Checksum verification failed!`n Expected: $Expected`n Actual: $Actual"
exit 1
} else {
Write-Host "Checksum verified"
}
} catch {
Write-Host "Warning: SHA256SUMS not available, skipping integrity verification"
}
# -- Extract --
Expand-Archive -Path $ZipPath -DestinationPath $TmpDir -Force
# -- Install --
if (-not (Test-Path $InstallDir)) {
New-Item -ItemType Directory -Path $InstallDir -Force | Out-Null
}
Copy-Item -Path (Join-Path $TmpDir $Binary) -Destination (Join-Path $InstallDir $Binary) -Force
Write-Host "Installed portview to $InstallDir\$Binary"
# Add to user PATH if not already present
$UserPath = [Environment]::GetEnvironmentVariable('Path', 'User')
if ($UserPath -notlike "*$InstallDir*") {
[Environment]::SetEnvironmentVariable('Path', "$InstallDir;$UserPath", 'User')
Write-Host " Added $InstallDir to user PATH (restart your terminal to take effect)"
}
Write-Host " Run 'portview' to get started."
} finally {
Remove-Item -Recurse -Force $TmpDir -ErrorAction SilentlyContinue
}