fix(patch): keep the update marker on a no-op commit so a retry finalizes#9567
Merged
owlstronaut merged 1 commit intoJun 18, 2026
Merged
Conversation
owlstronaut
approved these changes
Jun 18, 2026
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.
A conflicted
npm patch updateleaves an edit dir and a.npm-patch-update.jsonmarker that the finalizingnpm patch commitreads to finish the update — a metadata-only finalize that drops the renamed-from selector and tolerates the new version not being installed yet.commit()deleted that marker before checking whether the edit dir produced a diff. So a first commit that did no net work — the conflict resolved to the new version verbatim, giving "nothing to commit" — consumed the marker. A corrected retry then found none, ran a full reify, and failedEPATCHUNUSED(the rebased-to version isn't installed), leaving both the old and new selector in the manifest. The same loss happened on any non-finalizing path (e.g. theEPATCHUNSAFEthrow).Fix
The marker was deleted eagerly only to keep it out of the generated patch. Instead, keep it and teach
diffDirsto skip it:diffDirs(originalDir, editedDir, ignore = new Set())skips a set of root-relative filenames, like it already skips the rootpackage.json.commit()no longer deletes the marker — it reads/parses it (still throwingEPATCHBADMARKERon bad JSON before any diff), and passesnew Set([UPDATE_MARKER])todiffDirs.The marker now survives any non-finalizing path, so a corrected retry still finalizes. A successful commit removes the whole edit dir (unless
--keep-edit-dir), so nothing lingers.References
Fixes #9566
Follow-up to #9439 (native dependency patching).