portview 1.1.0

A diagnostic-first port viewer. See what's on your ports, then act on it.
# 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
}