Stage locked Windows binary updates
ci / test (push) Canceled after 0s
ci / fuzz-smoke (push) Canceled after 0s
ci / macos-client (macos-aarch64, macos-14) (push) Canceled after 0s
ci / macos-client (macos-x86_64, macos-13) (push) Canceled after 0s
ci / windows-client (push) Canceled after 0s
ci / package-release (linux-x86_64, ubuntu-latest, , , ) (push) Canceled after 0s
ci / package-release (macos-aarch64, macos-14, , , ) (push) Canceled after 0s
ci / package-release (macos-x86_64, macos-13, , , ) (push) Canceled after 0s
ci / package-release (windows-aarch64, windows-latest, aarch64, windows, aarch64-pc-windows-msvc) (push) Canceled after 0s
ci / package-release (windows-x86_64, windows-latest, , , ) (push) Canceled after 0s
ci / remote-bench (push) Canceled after 0s
ci / publish-gitea-release (push) Canceled after 0s
ci / test (push) Canceled after 0s
ci / fuzz-smoke (push) Canceled after 0s
ci / macos-client (macos-aarch64, macos-14) (push) Canceled after 0s
ci / macos-client (macos-x86_64, macos-13) (push) Canceled after 0s
ci / windows-client (push) Canceled after 0s
ci / package-release (linux-x86_64, ubuntu-latest, , , ) (push) Canceled after 0s
ci / package-release (macos-aarch64, macos-14, , , ) (push) Canceled after 0s
ci / package-release (macos-x86_64, macos-13, , , ) (push) Canceled after 0s
ci / package-release (windows-aarch64, windows-latest, aarch64, windows, aarch64-pc-windows-msvc) (push) Canceled after 0s
ci / package-release (windows-x86_64, windows-latest, , , ) (push) Canceled after 0s
ci / remote-bench (push) Canceled after 0s
ci / publish-gitea-release (push) Canceled after 0s
This commit is contained in:
+32
-4
@@ -315,15 +315,43 @@ function Install-Binary($Source, $Destination) {
|
|||||||
$dir = Split-Path -Parent $Destination
|
$dir = Split-Path -Parent $Destination
|
||||||
$name = Split-Path -Leaf $Destination
|
$name = Split-Path -Leaf $Destination
|
||||||
$tmp = Join-Path $dir ".$name.tmp.$PID"
|
$tmp = Join-Path $dir ".$name.tmp.$PID"
|
||||||
Copy-Item $Source $tmp -Force
|
Copy-Item -LiteralPath $Source -Destination $tmp -Force
|
||||||
try {
|
try {
|
||||||
Move-Item $tmp $Destination -Force
|
Move-Item -LiteralPath $tmp -Destination $Destination -Force
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
Remove-Item $tmp -Force -ErrorAction SilentlyContinue
|
$pending = "$Destination.pending.$PID"
|
||||||
|
try {
|
||||||
|
Move-Item -LiteralPath $tmp -Destination $pending -Force
|
||||||
|
Start-DeferredBinaryReplacement $pending $Destination
|
||||||
|
Write-Warning "binary is in use; staged replacement for when Dosh exits: $Destination"
|
||||||
|
}
|
||||||
|
catch {
|
||||||
|
Remove-Item -LiteralPath $tmp -Force -ErrorAction SilentlyContinue
|
||||||
|
Remove-Item -LiteralPath $pending -Force -ErrorAction SilentlyContinue
|
||||||
throw
|
throw
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function Start-DeferredBinaryReplacement($Pending, $Destination) {
|
||||||
|
$payload = @{ Pending = $Pending; Destination = $Destination } | ConvertTo-Json -Compress
|
||||||
|
$payload64 = [Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes($payload))
|
||||||
|
$script = @"
|
||||||
|
`$ErrorActionPreference = 'SilentlyContinue'
|
||||||
|
`$payload = [System.Text.Encoding]::UTF8.GetString([System.Convert]::FromBase64String('$payload64')) | ConvertFrom-Json
|
||||||
|
for (`$i = 0; `$i -lt 3600; `$i++) {
|
||||||
|
if (-not (Test-Path -LiteralPath `$payload.Pending)) { exit 0 }
|
||||||
|
Move-Item -LiteralPath `$payload.Pending -Destination `$payload.Destination -Force
|
||||||
|
if (`$?) { exit 0 }
|
||||||
|
Start-Sleep -Seconds 1
|
||||||
|
}
|
||||||
|
exit 1
|
||||||
|
"@
|
||||||
|
$encoded = [Convert]::ToBase64String([System.Text.Encoding]::Unicode.GetBytes($script))
|
||||||
|
$ps = [System.Diagnostics.Process]::GetCurrentProcess().MainModule.FileName
|
||||||
|
Start-Process -FilePath $ps -ArgumentList @("-NoProfile", "-EncodedCommand", $encoded) -WindowStyle Hidden | Out-Null
|
||||||
|
}
|
||||||
|
|
||||||
function Normalize-PathForCompare($Path) {
|
function Normalize-PathForCompare($Path) {
|
||||||
[System.IO.Path]::GetFullPath($Path).TrimEnd(
|
[System.IO.Path]::GetFullPath($Path).TrimEnd(
|
||||||
@@ -440,7 +468,7 @@ function Install-Prebuilt {
|
|||||||
if ($bench) {
|
if ($bench) {
|
||||||
Install-Binary $bench.FullName (Join-Path $bindir "dosh-bench.exe")
|
Install-Binary $bench.FullName (Join-Path $bindir "dosh-bench.exe")
|
||||||
}
|
}
|
||||||
Install-Binary (Join-Path $bindir "dosh-client.exe") (Join-Path $bindir "dosh.exe")
|
Install-Binary $client.FullName (Join-Path $bindir "dosh.exe")
|
||||||
return $true
|
return $true
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
|
|||||||
@@ -298,12 +298,30 @@ fn windows_prebuilt_install_requires_client_but_not_bench() {
|
|||||||
assert!(ps1.contains("throw \"prebuilt archive missing dosh-client.exe\""));
|
assert!(ps1.contains("throw \"prebuilt archive missing dosh-client.exe\""));
|
||||||
assert!(ps1.contains("-Filter \"dosh-bench.exe\""));
|
assert!(ps1.contains("-Filter \"dosh-bench.exe\""));
|
||||||
assert!(ps1.contains("if ($bench)"));
|
assert!(ps1.contains("if ($bench)"));
|
||||||
|
assert!(ps1.contains("Install-Binary $client.FullName (Join-Path $bindir \"dosh.exe\")"));
|
||||||
|
assert!(!ps1.contains("Install-Binary (Join-Path $bindir \"dosh-client.exe\")"));
|
||||||
assert!(
|
assert!(
|
||||||
!ps1.contains("throw \"prebuilt archive missing dosh-bench.exe\""),
|
!ps1.contains("throw \"prebuilt archive missing dosh-bench.exe\""),
|
||||||
"Windows prebuilt install should not fall back to source just because dosh-bench is absent"
|
"Windows prebuilt install should not fall back to source just because dosh-bench is absent"
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn windows_installer_stages_locked_binary_replacements() {
|
||||||
|
let ps1 = include_str!("../install.ps1");
|
||||||
|
assert!(ps1.contains("function Start-DeferredBinaryReplacement"));
|
||||||
|
assert!(ps1.contains("$pending = \"$Destination.pending.$PID\""));
|
||||||
|
assert!(ps1.contains("Move-Item -LiteralPath $tmp -Destination $pending -Force"));
|
||||||
|
assert!(ps1.contains("Start-DeferredBinaryReplacement $pending $Destination"));
|
||||||
|
assert!(ps1.contains("binary is in use; staged replacement"));
|
||||||
|
assert!(ps1.contains("for (`$i = 0; `$i -lt 3600; `$i++)"));
|
||||||
|
assert!(ps1.contains(
|
||||||
|
"Move-Item -LiteralPath `$payload.Pending -Destination `$payload.Destination -Force"
|
||||||
|
));
|
||||||
|
assert!(ps1.contains("[System.Text.Encoding]::Unicode.GetBytes($script)"));
|
||||||
|
assert!(ps1.contains("Start-Process -FilePath $ps"));
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn windows_installer_adds_user_path_idempotently() {
|
fn windows_installer_adds_user_path_idempotently() {
|
||||||
let ps1 = include_str!("../install.ps1");
|
let ps1 = include_str!("../install.ps1");
|
||||||
|
|||||||
Reference in New Issue
Block a user