shulkerscript-cli/install.ps1

120 lines
4.5 KiB
PowerShell
Raw Normal View History

2024-10-01 12:29:50 +02:00
# Error setup
$ErrorActionPreference = "Stop"
Set-StrictMode -Version 3.0
Set-PSDebug -Strict
# Variables
$REPO = "moritz-hoelting/shulkerscript-cli"
$PROGRAM_DISPLAY_NAME = "Shulkerscript CLI"
$LATEST_RELEASE_URL = "https://api.github.com/repos/$REPO/releases/latest"
$BIN_NAME = "shulkerscript"
$INSTALL_PATH = Join-Path $env:USERPROFILE "AppData\Local\Programs\$BIN_NAME"
$PATH_REGISTRY = "Registry::HKEY_CURRENT_USER\Environment"
function Remove-Old-Version {
if ( (Test-Path variable:INSTALLED_VERSION) -and ($INSTALL_PATH -notlike "*\.cargo\bin*") ) {
Write-Host Removing old version at $INSTALL_PATH
Remove-Item -Path "$INSTALL_PATH" -Force -Recurse
}
}
# Determine the OS and architecture
$OS = 'windows'
$ARCH = $env:PROCESSOR_ARCHITECTURE
if ($ARCH -eq 'AMD64') {
$ARCH = 'x86_64'
} elseif ($ARCH -eq 'x86') {
$ARCH = 'i686'
} else {
Write-Host "Unsupported architecture: $ARCH" -ForegroundColor Red
exit 1
}
# Fetch the latest release data from GitHub
try {
$LATEST_RELEASE_DATA = Invoke-RestMethod -Uri $LATEST_RELEASE_URL -Method Get
}
catch {
Write-Host "Failed to fetch latest release data." -ForegroundColor Red
exit 1
}
# Get the latest version number
$LATEST_VERSION = $LATEST_RELEASE_DATA.tag_name
# Check if the CLI is already installed and get the current version
if (Get-Command $BIN_NAME -ErrorAction Ignore) {
$INSTALLED_VERSION = (& $BIN_NAME --version | Select-String -Pattern '\d+\.\d+\.\d+(-(rc|beta|alpha)(\.\d+)?)?' | Select-Object -First 1).Matches.Value
$CLEAN_LATEST_VERSION = (Write-Output $LATEST_VERSION | Select-String -Pattern '\d+\.\d+\.\d+(-(rc|beta|alpha)(\.\d+)?)?').Matches.Value
Write-Host "Installed version: v$INSTALLED_VERSION"
Write-Host "Latest version: v$CLEAN_LATEST_VERSION"
if ($INSTALLED_VERSION -eq $CLEAN_LATEST_VERSION) {
Write-Host "$PROGRAM_DISPLAY_NAME is already up to date."
exit 0
}
else {
Write-Host "A new version is available. Upgrading..."
$INSTALL_PATH = Split-Path -Parent (Get-Command $BIN_NAME).Path
}
}
else {
Write-Host "$PROGRAM_DISPLAY_NAME is not installed. Installing version $LATEST_VERSION..."
}
# Use cargo-binstall if available
if (Get-Command cargo-binstall -ErrorAction SilentlyContinue) {
Write-Host "cargo-binstall is available. Installing/upgrading using cargo-binstall..."
cargo-binstall --git "https://github.com/$REPO" --force --locked --no-confirm $BIN_NAME
Remove-Old-Version
exit 0
}
# Get the download url of the latest release
$DOWNLOAD_URL = ($LATEST_RELEASE_DATA.assets | Where-Object {$_.browser_download_url -match "$OS" -and $_.browser_download_url -match "$ARCH"} | Select-Object -First 1).browser_download_url
if ([string]::IsNullOrEmpty($DOWNLOAD_URL)) {
# if there is no prebuilt binary, try to build from source
if (Get-Command cargo -ErrorAction SilentlyContinue) {
Write-Host "No prebuilt binary available for your platform. Building from source..."
cargo install --git "https://github.com/$REPO" --force --locked
Remove-Old-Version
exit 0
}
else {
Write-Host "No prebuilt binary available for your platform. Please install Rust and Cargo using https://rustup.rs and try again."
exit 1
}
}
# Create a temporary directory
$TEMP = [System.IO.Path]::GetTempPath()
$TEMP_DIR = Join-Path $TEMP (New-Guid).ToString("N")
Remove-Item -Path "$TEMP_DIR" -Recurse -Force -ErrorAction Ignore | Out-Null
New-Item -ItemType Directory -Path $TEMP_DIR | Out-Null
# Download and extract the binary
Invoke-WebRequest -Uri $DOWNLOAD_URL -OutFile "$TEMP_DIR\$BIN_NAME.zip"
Expand-Archive -Path "$TEMP_DIR\$BIN_NAME.zip" -DestinationPath $TEMP_DIR -Force
# Create install location and move binary
New-Item -ItemType Directory -Path $INSTALL_PATH -Force | Out-Null
Move-Item -Path "$TEMP_DIR\$BIN_NAME.exe" -Destination "$INSTALL_PATH\$BIN_NAME.exe" -Force
# Remove temp dir
Remove-Item -Path "$TEMP_DIR" -Recurse -Force -ErrorAction Ignore | Out-Null
# Add binary to PATH
$REGEX_INSTALL_PATH = [regex]::Escape($INSTALL_PATH)
$ARR_PATH = $env:Path -split ';' | Where-Object {$_ -match "^$REGEX_INSTALL_PATH\\?"}
if (-not $ARR_PATH) {
Write-Host "Not found in current PATH, adding..."
$OLD_PATH = (Get-ItemProperty -Path "$PATH_REGISTRY" -Name PATH).path
$NEW_PATH = "$OLD_PATH;$INSTALL_PATH"
Set-ItemProperty -Path "$PATH_REGISTRY" -Name PATH -Value $NEW_PATH
$env:PATH="$NEW_PATH"
}
Write-Host "$PROGRAM_DISPLAY_NAME has been successfully installed/upgraded to version $LATEST_VERSION."