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"
|
2024-10-01 12:41:44 +02:00
|
|
|
$CRATE_NAME = "shulkerscript-cli"
|
2024-10-01 12:29:50 +02:00
|
|
|
$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
|
2024-10-01 12:41:44 +02:00
|
|
|
return "Error"
|
2024-10-01 12:29:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
# 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
|
2024-10-01 12:41:44 +02:00
|
|
|
return "Error"
|
2024-10-01 12:29:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
# 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."
|
2024-10-01 12:41:44 +02:00
|
|
|
return
|
2024-10-01 12:29:50 +02:00
|
|
|
}
|
|
|
|
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..."
|
2024-10-01 12:41:44 +02:00
|
|
|
cargo-binstall --git "https://github.com/$REPO" --force --locked --no-confirm $CRATE_NAME
|
2024-10-01 12:29:50 +02:00
|
|
|
Remove-Old-Version
|
2024-10-01 12:41:44 +02:00
|
|
|
return
|
2024-10-01 12:29:50 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
# 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..."
|
2024-10-01 12:41:44 +02:00
|
|
|
cargo install --force --locked $CRATE_NAME
|
2024-10-01 12:29:50 +02:00
|
|
|
Remove-Old-Version
|
2024-10-01 12:41:44 +02:00
|
|
|
return
|
2024-10-01 12:29:50 +02:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
Write-Host "No prebuilt binary available for your platform. Please install Rust and Cargo using https://rustup.rs and try again."
|
2024-10-01 12:41:44 +02:00
|
|
|
return "Error"
|
2024-10-01 12:29:50 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
# 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."
|