param ( [string]$repo = "dora-rs", [string]$bin = "dora", [string]$tag, [string]$target, [string]$to = "$HOME\.dora\bin", [switch]$force ) $ErrorActionPreference = "Stop" if ($env:GITHUB_ACTIONS) { $VerbosePreference = "Continue" Write-Verbose "Verbose mode enabled because we're running in GitHub Actions" } try { # Simulate pipefail-like behavior using ErrorAction and traps $ErrorActionPreference = "Stop" $null = (Get-Command "NonExistentCommand" -ErrorAction Stop | Out-Null) } catch { Write-Verbose "Pipefail-like support enabled" } function Show-Help { @" Install a binary released on GitHub USAGE: install.ps1 [options] FLAGS: -h, --help Display this message -f, --force Force overwriting an existing binary OPTIONS: --repo REPO Github Repository to install the binary from [default: dora-rs] --bin BIN Name of the binary to install [default: dora] --tag TAG Tag (version) of the bin to install, defaults to latest release --to LOCATION Where to install the binary [default: $HOME\.dora\bin] --target TARGET "@ } function Handle-Error { param ( [string]$Message ) Write-Error "install: $Message" exit 1 } function Need-Command { param ( [string]$command ) if (-not (Get-Command $command -ErrorAction SilentlyContinue)) { Handle-Error "$command (command not found)" } } function New-Temp-Dir() { [CmdletBinding(SupportsShouldProcess)] param() $parent = [System.IO.Path]::GetTempPath() [string] $name = [System.Guid]::NewGuid() New-Item -ItemType Directory -Path (Join-Path $parent $name) } function Download-File { param ( [string]$url, [string]$output ) try { $outputDir = Split-Path -Path $output -Parent if (-not (Test-Path -Path $outputDir)) { New-Item -ItemType Directory -Path $outputDir -Force | Out-Null } Invoke-WebRequest -Uri $url -OutFile $output } catch { Write-Error "Failed to download the file. Error: $_" } } Need-Command mkdir Need-Command Expand-Archive $url="https://api.github.com/repos/$repo/$bin" $releases="$url/releases" $tmp = New-Temp-Dir if (-not $tag) { Download-File "$releases/latest" "$tmp/$bin-version.txt" $json = (Get-Content -Path "$tmp/$bin-version.txt") $tag = $json | ConvertFrom-Json | Select-Object -ExpandProperty tag_name } $target = "x86_64-pc-windows-msvc" $archive = "https://github.com/$repo/$bin/releases/download/$tag/$bin-$tag-$target.zip" Write-Host "Repository https://github.com/$repo" Write-Host "Binary $bin" Write-Host "Tag $tag" Write-Host "Target $target" Write-Host "Destination $to" Write-Host "Archive $archive" $zip = "$tmp\$bin-$tag-$target.zip" Download-File $archive $zip Write-Host "Placing dora-rs cli in ", $to Expand-Archive -Path $zip -DestinationPath $to -Force Remove-Item -Path $tmp -Recurse -Force function Add-PathToEnv { param ( [string]$newPath ) $currentPath = [System.Environment]::GetEnvironmentVariable("PATH", [System.EnvironmentVariableTarget]::User) if ($currentPath -like "*$newPath*") { Write-Host $newPath, " is already in the PATH variable." } else { $updatedPath = "$currentPath;$newPath" [System.Environment]::SetEnvironmentVariable("PATH", $updatedPath, [System.EnvironmentVariableTarget]::User) Write-Host "Path added to PATH variable and reloaded." } } function Confirm-AddToPath { param ( [string]$newPath ) $response = Read-Host "Do you want to add ", $newPath, " to your PATH automatically? (y/n): " if ($response -eq "Y" -or $response -eq "y" -or $response -eq "") { Add-PathToEnv -newPath $newPath } else { Write-Host "You chose not to add", $newPath, " to your PATH." Write-Host "To run dora CLI without adding to PATH, use: '~/.dora/bin/dora'" } } Confirm-AddToPath -newPath $to