diff --git a/install.cmd b/install.cmd index 5a3014b..7e3c592 100644 --- a/install.cmd +++ b/install.cmd @@ -17,12 +17,15 @@ if not defined PS ( ) set "TMP_PS=%TEMP%\dosh-install-%RANDOM%-%RANDOM%.ps1" +set "TMP_BINDIR=%TEMP%\dosh-install-%RANDOM%-%RANDOM%.bindir" set "DOSH_INSTALL_PS1_URL=%SCRIPT_URL%" set "DOSH_INSTALL_PS1_PATH=%TMP_PS%" +set "DOSH_INSTALL_BINDIR_FILE=%TMP_BINDIR%" "%PS%" -NoProfile -ExecutionPolicy Bypass -Command "$ErrorActionPreference='Stop'; $ProgressPreference='SilentlyContinue'; Invoke-WebRequest -UseBasicParsing -Uri $env:DOSH_INSTALL_PS1_URL -OutFile $env:DOSH_INSTALL_PS1_PATH" if errorlevel 1 ( del "%TMP_PS%" >nul 2>nul + del "%TMP_BINDIR%" >nul 2>nul exit /b 1 ) @@ -30,9 +33,16 @@ if errorlevel 1 ( set "RC=%ERRORLEVEL%" del "%TMP_PS%" >nul 2>nul -set "DOSH_CMD_PREFIX=%PREFIX%" -if "%DOSH_CMD_PREFIX%"=="" set "DOSH_CMD_PREFIX=%USERPROFILE%\.local" -set "DOSH_CMD_BINDIR=%DOSH_CMD_PREFIX%\bin" +if "%RC%"=="0" if exist "%TMP_BINDIR%" ( + for /f "usebackq delims=" %%D in ("%TMP_BINDIR%") do if not defined DOSH_CMD_BINDIR set "DOSH_CMD_BINDIR=%%D" +) +del "%TMP_BINDIR%" >nul 2>nul + +if not defined DOSH_CMD_BINDIR ( + set "DOSH_CMD_PREFIX=%PREFIX%" + if "%DOSH_CMD_PREFIX%"=="" set "DOSH_CMD_PREFIX=%USERPROFILE%\.local" + set "DOSH_CMD_BINDIR=%DOSH_CMD_PREFIX%\bin" +) set "DOSH_NEXT_PATH=%PATH%" if "%RC%"=="0" ( echo ;%PATH%; | find /I ";%DOSH_CMD_BINDIR%;" >nul 2>nul diff --git a/install.ps1 b/install.ps1 index f34e7c1..7598142 100644 --- a/install.ps1 +++ b/install.ps1 @@ -458,9 +458,12 @@ function Write-Utf8NoBom($Path, $Content) { [System.IO.File]::WriteAllText($Path, $Content, $encoding) } -$bindir = Join-Path $Prefix "bin" -$configDir = Join-Path $HOME ".config\dosh" +$bindir = Normalize-PathForCompare (Join-Path $Prefix "bin") +$configDir = Normalize-PathForCompare (Join-Path $HOME ".config\dosh") New-Item -ItemType Directory -Force -Path $bindir, $configDir | Out-Null +if ($env:DOSH_INSTALL_BINDIR_FILE) { + Write-Utf8NoBom $env:DOSH_INSTALL_BINDIR_FILE $bindir +} Apply-PendingBinaryReplacements $bindir function Install-Prebuilt { diff --git a/tests/release_scripts.rs b/tests/release_scripts.rs index 8dbcaeb..3d3f6bd 100644 --- a/tests/release_scripts.rs +++ b/tests/release_scripts.rs @@ -257,9 +257,14 @@ fn windows_cmd_installer_wraps_native_powershell_installer() { assert!(cmd.contains("@echo off")); assert!(cmd.contains("https://git.palav.dev/Palav/dosh/raw/branch/main/install.ps1")); assert!(cmd.contains("for %%P in (powershell.exe pwsh.exe powershell pwsh) do")); + assert!(cmd.contains("set \"TMP_BINDIR=%TEMP%\\dosh-install-%RANDOM%-%RANDOM%.bindir\"")); + assert!(cmd.contains("set \"DOSH_INSTALL_BINDIR_FILE=%TMP_BINDIR%\"")); assert!(cmd.contains("Invoke-WebRequest -UseBasicParsing")); assert!(cmd.contains("-ExecutionPolicy Bypass -File \"%TMP_PS%\" %*")); - assert!(cmd.contains("set \"DOSH_CMD_PREFIX=%PREFIX%\"")); + assert!(cmd.contains( + "for /f \"usebackq delims=\" %%D in (\"%TMP_BINDIR%\") do if not defined DOSH_CMD_BINDIR set \"DOSH_CMD_BINDIR=%%D\"" + )); + assert!(cmd.contains("if not defined DOSH_CMD_BINDIR (")); assert!( cmd.contains( "if \"%DOSH_CMD_PREFIX%\"==\"\" set \"DOSH_CMD_PREFIX=%USERPROFILE%\\.local\"" @@ -363,6 +368,9 @@ fn windows_installer_adds_user_path_idempotently() { let ps1 = include_str!("../install.ps1"); assert!(ps1.contains("function Add-UserPath($PathToAdd)")); assert!(ps1.contains("function PathList-Contains($PathValue, $PathToFind)")); + assert!(ps1.contains("$bindir = Normalize-PathForCompare (Join-Path $Prefix \"bin\")")); + assert!(ps1.contains("if ($env:DOSH_INSTALL_BINDIR_FILE)")); + assert!(ps1.contains("Write-Utf8NoBom $env:DOSH_INSTALL_BINDIR_FILE $bindir")); assert!(ps1.contains("$wanted = Normalize-PathForCompare $PathToFind")); assert!(ps1.contains("foreach ($entry in ($PathValue -split ';' | Where-Object { $_ }))")); assert!(ps1.contains("$wanted = Normalize-PathForCompare $PathToAdd"));