Repository navigation
Fix NSIS installer launch preparation and document lifecycle behavior - #54
Merged
Marc-André Moreau (mamoreau-devolutions) merged 2 commits intoOct 19, 2026
Conversation
Apply cargo fmt to the NSIS preparation test and give the PowerShell child in the lifecycle tests time to cold-start on loaded CI runners (20s marker wait, 10s completion bound, 30s child lifetime), and run it with -NonInteractive -ExecutionPolicy Bypass. Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
Marc-André Moreau (mamoreau-devolutions)
approved these changes
Oct 19, 2026
Marc-André Moreau (mamoreau-devolutions)
merged commit Oct 19, 2026
c11b930
into
Devolutions:master
13 checks passed
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes NSIS/Nullsoft installation in both Rust and .NET by giving an already-downloaded, SHA-256-verified installer an
.exeextension immediately before execution. The preparation applies only tonullsoftand thensisalias, preserves an existing.exeextension, and preserves the verified bytes when replacing a stale staged executable.The shared install-flow step is named
PrepareInstallerForExecutionin .NET andprepare_installer_for_executionin Rust. The name describes its role in the pipeline rather than a particular installer technology; this branch only adds NSIS/Nullsoft-specific behavior within that step.The general download-filename changes from the initial investigation were removed. Download URLs, HTTP redirects, request headers,
download --renamebehavior, and other installer types are unchanged.Root cause and .NET comparison
The container reproduction downloaded and verified NSIS 3.12 successfully, but the file was named
downloadwithout an executable extension. Rust then remained inside the installer launch operation for the entire five-minute bound; the process snapshot showed no NSIS installer process. The existing "Waiting for nullsoft installer" progress message is emitted before dispatch, so it did not prove that NSIS had started or that the process-exit wait was stuck.The same reproduction with unmodified .NET production code also failed. .NET returned
Win32Exception (1008)fromProcess.StartWithShellExecuteExwhile launching the extensionlessdownloadfile, and Pinget exited with code 1. Thus both implementations had a launch-preparation problem; only Rust exhibited the observed hang.Renaming the verified file to
download.exeand executing it with/S.Regression coverage
Adds Rust/.NET coverage for NSIS preparation, preservation of verified bytes, stale executable replacement, existing
.exenames, missing payload errors, and unchanged behavior for other installer types. Retains the bounded lifecycle tests documenting that a detached child can outlive the launched installer process, plus the/Sargument tests.