Conversation
When a collection revision lists game versions that do not match the installed game, the driver asks whether to continue. It had already moved to its "start" step, and Cancel only returned early, leaving the step and the collection in place. The collections extension continues any driver update that finds it on "start", so the next update, a second "Install Now", or (when resuming) the driver's own update straight after, began the install anyway. An update while the prompt was still open did the same. Cancel now cancels the driver, as the install dialog's "Later" does, which also releases the check suppression the install took. The driver moves to "start" only once nothing is left to ask, and an attempt that was paused or cancelled while the prompt was open stops whatever the answer. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…mpt is open Setting "start" only after the prompt left whatever step the driver was on before visible while the revision info loaded and the prompt was open. After a finished install that is "review", so a collection resumed right after one showed "Collection installation complete" behind the prompt, got an installCompleted stamp on the next driver update, and could keep that dialog after Cancel. Set "start" where it always was, and instead make continue() wait at "start" until the attempt that set it has prepared the install and the prompt is answered. That is what stops the extension's update handler beginning the install early. Each attempt keeps its own mark, so answering a paused attempt's prompt cannot release a newer one. The mark is set around startInstall's callers, leaving startInstall itself as it was. Move the extension's driver update handler into InstallDriver.ts as makeDriverUpdateHandler, so the tests run the real handler, including its "review" branch. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
This PR has been marked as stale due to inactivity. |
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.
Problem
When a collection revision lists game versions that don't match the installed game, Vortex asks "Game version mismatch" with Cancel and Continue. On master, Cancel doesn't cancel:
Independent QA reproduced all three in the app on master 031b81d. It was found while testing #1: on master, the checks that install holds off also stay suppressed for the rest of the session.
InstallDriver.startImplsets the step tostartbefore the prompt. On Cancel it only marked the install done and returned false. The collections extension's update handler callscontinue()whenever it sees the step atstart, so the next update began the install.Change
extensions/collections/util/InstallDriver.ts:cancel(), as the install dialog's "Later" does. That returns the driver to idle, closes the dialog and releases the install's hold on the checks.startwhere it always did. Each start attempt now carries a token, andcanContinue()returns false atstartuntil that attempt has finished preparing (revision info fetched, prompt answered). That stops the extension's auto-continue from starting the install early. A newer attempt's token isn't cleared by an older one.collections/index.tsintoInstallDriver.tsunchanged, asmakeDriverUpdateHandler(api, driver), so the tests run the real handler.index.tsregisters it at the same point.InstallDriver.gameVersion.test.ts(new) has 8 tests through the collection harness and the real handler.Behaviour changes
cancel-dependency-install, which does nothing when nothing is queued.InstallDriver.canContinue()returns false atstartwhile an attempt is preparing.starton every path, as on master. So the install dialog, the finished dialog and the progress display behave as they did before.Evidence
Head ac1f7d0, on master 031b81d. Tested on Windows 10.
In the app (independent QA, two rounds, production builds, the kit's fake Fallout 4, offline collections with a mismatched game version, a fresh profile per run):
installCompletedon it; Cancel returns to idleinstallCompletedis written only thenAlso holding on this PR:
Combined with #1: the two merge cleanly, and 18 files with 273 tests pass together. In the combined build, Cancel and pause re-run the held-off checks exactly once.
Regression tests:
InstallDriver.gameVersion.test.ts. Negative controls:Scoped suite:
vitest run src/extensions/collections: 17 files, 266 tests pass. Renderer typecheck and lint pass. oxfmt is clean.pnpm run verifyon ac1f7d0: fails only where master fails: 7 Windows icon-extraction tests (src/index.test.ts) that readnotepad.exeon this machine. The formatter left the tree clean.E2E (
packages/e2e, the kit's runner, which fixes the fixture's main-window startup race for the run only): 25 passed and 3 failed (QA-106, QA-113, QA-128), with 38 skipped for lack of Nexus test-account credentials. That is identical to master: no regressions.CI: all checks pass on this PR. The first run failed in
@vortex/main'snativeCrashReporting.test.ts("recovers stale claims", which backdates a file's mtime). That failure hit all six PRs moved here, in code none of them touches. It passes 3 of 3 locally on upstream master and passed on the rerun.pr-preflight: 370 lines in 3 files. Its callers and readers warnings were each reviewed:
mStartingis read only bycanContinue.mInstallDonealso checks the collection or the step.Review
installCompleted. It also found that the test's copy of the update handler left out thereviewbranch. Both are fixed in ac1f7d0, which restores the step placement, adds the token gate and runs the real handler.Findings by the layer that should have caught them: round 1, 2 author, 2 judgment; round 2, 1 author, 2 judgment.
Not covered
resume-collectionor the premium restart needs a signed-in user, so QA drovestart()through the "incomplete" notification's Resume instead.🤖 Generated with Claude Code