From f102eccaa442b12411bba5029e85587b076d9fff Mon Sep 17 00:00:00 2001 From: Daniel Han Date: Wed, 3 Jun 2026 01:08:44 -0700 Subject: [PATCH] install.ps1/uninstall.ps1: add UNSLOTH_INSTALL_REF + fix WSL symlink uninstall hole install.ps1: fetch repo-versioned WSL-fallback assets (provision_llama_cuda.sh, unsloth.ico) from a configurable git ref via new UNSLOTH_INSTALL_REF env var (defaults to main, so existing users are byte-for-byte unaffected). Lets the ARM64+NVIDIA WSL-fallback GPU path be exercised end-to-end on a branch before it merges (provision_llama_cuda.sh does not exist on main until then). uninstall.ps1: the WSL cleanup rm -rf'd /root/.unsloth but left the ~/.local/bin/unsloth launcher symlink dangling, so `unsloth` still resolved on PATH after an uninstall. Also remove /root/.local/bin/unsloth and /home/*/.local/bin/unsloth. Co-Authored-By: Claude Opus 4.8 --- install.ps1 | 18 +++++++++++++++--- scripts/uninstall.ps1 | 6 +++++- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/install.ps1 b/install.ps1 index 81bff7e45e..c4e09adc27 100644 --- a/install.ps1 +++ b/install.ps1 @@ -8,6 +8,9 @@ # UNSLOTH_STUDIO_HOME / STUDIO_HOME = path -> install under that path # (DataDir nests inside; user PATH not modified persistently). # Default ($USERPROFILE\.unsloth\studio) is preserved when no env var is set. +# UNSLOTH_INSTALL_REF = branch/tag/sha to fetch repo-versioned install assets +# from (provision_llama_cuda.sh, the .ico); defaults to 'main'. Lets the +# WSL-fallback GPU path be tested on a branch before it merges. function Install-UnslothStudio { $ErrorActionPreference = "Stop" @@ -42,6 +45,15 @@ function Install-UnslothStudio { } } + # Git ref (branch/tag/sha) used to fetch repo-versioned install assets from + # raw.githubusercontent.com: provision_llama_cuda.sh and the .ico. Defaults to + # 'main' so existing users are byte-for-byte unaffected; set UNSLOTH_INSTALL_REF + # to a branch to exercise the WSL-fallback path end-to-end before a PR merges. + function Get-UnslothInstallRef { + if ($env:UNSLOTH_INSTALL_REF -and $env:UNSLOTH_INSTALL_REF.Trim()) { return $env:UNSLOTH_INSTALL_REF.Trim() } + return 'main' + } + function Get-TauriTorchIndexFamily { param([string]$TorchIndexUrl) if ($SkipTorch) { return "none" } @@ -519,7 +531,7 @@ function Install-UnslothStudio { if ($PSScriptRoot -and $PSScriptRoot.Trim()) { $bundledIcon = Join-Path $PSScriptRoot "studio\frontend\public\unsloth.ico" } - $iconUrl = "https://raw.githubusercontent.com/unslothai/unsloth/main/studio/frontend/public/unsloth.ico" + $iconUrl = "https://raw.githubusercontent.com/unslothai/unsloth/$(Get-UnslothInstallRef)/studio/frontend/public/unsloth.ico" if (-not (Test-Path -LiteralPath $appDir)) { [System.IO.Directory]::CreateDirectory($appDir) | Out-Null @@ -1640,7 +1652,7 @@ shell.Run cmd, 0, False ) Set-Content -LiteralPath $launcher -Value $L -Encoding UTF8 $icon = Join-Path $appDir "unsloth.ico" - try { if (-not (Test-Path -LiteralPath $icon)) { Invoke-WebRequest "https://raw.githubusercontent.com/unslothai/unsloth/main/studio/frontend/public/unsloth.ico" -OutFile $icon -UseBasicParsing -TimeoutSec 15 *> $null } } catch {} + try { if (-not (Test-Path -LiteralPath $icon)) { Invoke-WebRequest "https://raw.githubusercontent.com/unslothai/unsloth/$(Get-UnslothInstallRef)/studio/frontend/public/unsloth.ico" -OutFile $icon -UseBasicParsing -TimeoutSec 15 *> $null } } catch {} $wsh = New-Object -ComObject WScript.Shell $lnks = @() $dd = [Environment]::GetFolderPath("Desktop"); if ($dd -and $dd.Trim()) { $lnks += (Join-Path $dd "Unsloth Studio.lnk") } @@ -1678,7 +1690,7 @@ shell.Run cmd, 0, False if ($env:UNSLOTH_NO_LLAMA_CUDA -ne '1') { $prevEapL = $ErrorActionPreference; $ErrorActionPreference = "Continue" try { - $_llamaUrl = "https://raw.githubusercontent.com/unslothai/unsloth/main/studio/scripts/provision_llama_cuda.sh" + $_llamaUrl = "https://raw.githubusercontent.com/unslothai/unsloth/$(Get-UnslothInstallRef)/studio/scripts/provision_llama_cuda.sh" # Propagate UNSLOTH_LLAMA_BUILD_JOBS into the WSL build (Windows env # vars do not cross into WSL by default), so thermally/power-limited # laptops can cap the CUDA build's parallelism (`env` with no diff --git a/scripts/uninstall.ps1 b/scripts/uninstall.ps1 index 01fffad737..782cc39290 100644 --- a/scripts/uninstall.ps1 +++ b/scripts/uninstall.ps1 @@ -373,7 +373,11 @@ function Uninstall-UnslothStudio { # matches this very bash -lc (its argv contains the pattern) and would SIGKILL # the shell before a trailing rm -- so remove files first (guaranteed), then # best-effort kill via fuser by port (does not self-match) + pkill. - $_clean = 'rm -rf /root/.unsloth /home/*/.unsloth /root/llama-cuda /root/provision_llama_cuda.sh /root/llama_cuda_build.log 2>/dev/null; fuser -k 8888/tcp 2>/dev/null; pkill -9 -f unsloth_studio 2>/dev/null; pkill -9 -f llama-server 2>/dev/null; true' + # Also remove the `unsloth` launcher symlink install.sh drops at + # ~/.local/bin/unsloth -> /bin/unsloth. rm -rf of ~/.unsloth + # above deletes its target but leaves the symlink dangling, so the + # `unsloth` command still resolves on PATH after an uninstall. + $_clean = 'rm -rf /root/.unsloth /home/*/.unsloth /root/llama-cuda /root/provision_llama_cuda.sh /root/llama_cuda_build.log 2>/dev/null; rm -f /root/.local/bin/unsloth /home/*/.local/bin/unsloth 2>/dev/null; fuser -k 8888/tcp 2>/dev/null; pkill -9 -f unsloth_studio 2>/dev/null; pkill -9 -f llama-server 2>/dev/null; true' $_cands = @('', 'Ubuntu', 'Ubuntu-24.04', 'Ubuntu-22.04', 'Debian') if ($env:UNSLOTH_WSL_DISTRO) { $_cands = @($env:UNSLOTH_WSL_DISTRO) + $_cands } $_done = @{}