@hominis/fireforge 0.46.0 → 0.46.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +381 -498
- package/dist/bin/fireforge.d.ts +1 -1
- package/dist/bin/fireforge.js +17 -17
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +9 -9
- package/dist/src/cli-usage-error.js +12 -12
- package/dist/src/cli.d.ts +3 -2
- package/dist/src/cli.js +29 -28
- package/dist/src/commands/bootstrap-checks.js +2 -1
- package/dist/src/commands/bootstrap.js +2 -2
- package/dist/src/commands/build.js +12 -11
- package/dist/src/commands/config.js +9 -9
- package/dist/src/commands/destructive-decision.d.ts +4 -4
- package/dist/src/commands/destructive-decision.js +4 -4
- package/dist/src/commands/discard.js +5 -5
- package/dist/src/commands/doctor-check-core.d.ts +4 -4
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
- package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
- package/dist/src/commands/doctor-furnace-jar.js +1 -1
- package/dist/src/commands/doctor-furnace.js +22 -22
- package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -11
- package/dist/src/commands/doctor-orphaned-harness.js +10 -11
- package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
- package/dist/src/commands/doctor-patch-manifest.js +7 -6
- package/dist/src/commands/doctor-post-rebase-audit.js +2 -2
- package/dist/src/commands/doctor-source-pin.d.ts +12 -12
- package/dist/src/commands/doctor-source-pin.js +14 -14
- package/dist/src/commands/doctor-working-tree.d.ts +3 -3
- package/dist/src/commands/doctor-working-tree.js +3 -3
- package/dist/src/commands/doctor.d.ts +2 -2
- package/dist/src/commands/doctor.js +9 -9
- package/dist/src/commands/download.js +15 -13
- package/dist/src/commands/export-all.js +8 -8
- package/dist/src/commands/export-flow.d.ts +5 -5
- package/dist/src/commands/export-flow.js +14 -14
- package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
- package/dist/src/commands/export-placement-conflicts.js +9 -9
- package/dist/src/commands/export-placement-gate.d.ts +2 -2
- package/dist/src/commands/export-placement-gate.js +5 -5
- package/dist/src/commands/export-placement-policy.d.ts +1 -1
- package/dist/src/commands/export-placement-policy.js +1 -1
- package/dist/src/commands/export-shared.d.ts +10 -10
- package/dist/src/commands/export-shared.js +13 -13
- package/dist/src/commands/export.js +4 -4
- package/dist/src/commands/furnace/apply.js +16 -16
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +1 -1
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
- package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
- package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
- package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
- package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
- package/dist/src/commands/furnace/chrome-doc.js +18 -18
- package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
- package/dist/src/commands/furnace/create-browser-test.js +4 -4
- package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
- package/dist/src/commands/furnace/create-dry-run.js +4 -4
- package/dist/src/commands/furnace/create-features.d.ts +2 -2
- package/dist/src/commands/furnace/create-features.js +2 -2
- package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
- package/dist/src/commands/furnace/create-mochikit.js +7 -7
- package/dist/src/commands/furnace/create-templates.d.ts +14 -14
- package/dist/src/commands/furnace/create-templates.js +18 -18
- package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
- package/dist/src/commands/furnace/create-xpcshell.js +8 -8
- package/dist/src/commands/furnace/create.d.ts +1 -1
- package/dist/src/commands/furnace/create.js +10 -10
- package/dist/src/commands/furnace/deploy.js +4 -4
- package/dist/src/commands/furnace/diff.js +7 -7
- package/dist/src/commands/furnace/index.js +1 -1
- package/dist/src/commands/furnace/init.js +15 -15
- package/dist/src/commands/furnace/list.js +2 -2
- package/dist/src/commands/furnace/override.d.ts +1 -1
- package/dist/src/commands/furnace/override.js +15 -15
- package/dist/src/commands/furnace/preview.js +17 -17
- package/dist/src/commands/furnace/refresh.js +6 -6
- package/dist/src/commands/furnace/remove-mutations.d.ts +3 -3
- package/dist/src/commands/furnace/remove-mutations.js +19 -18
- package/dist/src/commands/furnace/remove-state.d.ts +1 -1
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +2 -2
- package/dist/src/commands/furnace/rename-browser-test.js +9 -8
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
- package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
- package/dist/src/commands/furnace/rename.js +9 -9
- package/dist/src/commands/furnace/scan.js +3 -3
- package/dist/src/commands/furnace/status.js +7 -7
- package/dist/src/commands/furnace/sync.js +6 -6
- package/dist/src/commands/furnace/test-file-name.d.ts +2 -2
- package/dist/src/commands/furnace/test-file-name.js +2 -2
- package/dist/src/commands/furnace/validate.js +11 -12
- package/dist/src/commands/import.js +20 -20
- package/dist/src/commands/lint-per-patch.js +8 -8
- package/dist/src/commands/lint-per-run-checkjs.d.ts +12 -13
- package/dist/src/commands/lint-per-run-checkjs.js +14 -15
- package/dist/src/commands/lint-report.d.ts +3 -3
- package/dist/src/commands/lint-report.js +4 -4
- package/dist/src/commands/lint.d.ts +3 -3
- package/dist/src/commands/lint.js +35 -35
- package/dist/src/commands/manifest.d.ts +4 -4
- package/dist/src/commands/package.js +2 -2
- package/dist/src/commands/patch/compact.d.ts +2 -2
- package/dist/src/commands/patch/compact.js +8 -8
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +8 -8
- package/dist/src/commands/patch/lint-ignore.d.ts +3 -4
- package/dist/src/commands/patch/lint-ignore.js +14 -15
- package/dist/src/commands/patch/move-files-create.d.ts +2 -2
- package/dist/src/commands/patch/move-files-create.js +5 -5
- package/dist/src/commands/patch/move-files-into.d.ts +2 -2
- package/dist/src/commands/patch/move-files-into.js +3 -3
- package/dist/src/commands/patch/move-files.js +1 -1
- package/dist/src/commands/patch/patch-context.d.ts +1 -1
- package/dist/src/commands/patch/rename.d.ts +4 -4
- package/dist/src/commands/patch/rename.js +8 -8
- package/dist/src/commands/patch/reorder.js +10 -10
- package/dist/src/commands/patch/split-plan.d.ts +3 -3
- package/dist/src/commands/patch/split-plan.js +6 -5
- package/dist/src/commands/patch/split.d.ts +2 -2
- package/dist/src/commands/patch/split.js +5 -5
- package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
- package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency.js +6 -6
- package/dist/src/commands/patch/tier.d.ts +2 -2
- package/dist/src/commands/patch/tier.js +5 -5
- package/dist/src/commands/patch-rename-map.d.ts +1 -1
- package/dist/src/commands/patch-rename-map.js +1 -1
- package/dist/src/commands/pending-resolution.d.ts +5 -5
- package/dist/src/commands/pending-resolution.js +5 -5
- package/dist/src/commands/re-export-adjacent.d.ts +3 -3
- package/dist/src/commands/re-export-adjacent.js +8 -8
- package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
- package/dist/src/commands/re-export-bulk-scan.js +17 -17
- package/dist/src/commands/re-export-drift.d.ts +10 -10
- package/dist/src/commands/re-export-drift.js +29 -29
- package/dist/src/commands/re-export-files.js +14 -15
- package/dist/src/commands/re-export-lint.d.ts +26 -26
- package/dist/src/commands/re-export-lint.js +27 -27
- package/dist/src/commands/re-export-options.d.ts +1 -1
- package/dist/src/commands/re-export-options.js +1 -1
- package/dist/src/commands/re-export-register.d.ts +1 -1
- package/dist/src/commands/re-export-register.js +1 -1
- package/dist/src/commands/re-export-scan.d.ts +1 -1
- package/dist/src/commands/re-export-scan.js +7 -7
- package/dist/src/commands/re-export-single.d.ts +1 -1
- package/dist/src/commands/re-export-single.js +20 -20
- package/dist/src/commands/re-export.js +7 -6
- package/dist/src/commands/rebase/abort.js +6 -6
- package/dist/src/commands/rebase/continue.js +8 -7
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +3 -3
- package/dist/src/commands/rebase/patch-loop.js +18 -17
- package/dist/src/commands/register.js +5 -5
- package/dist/src/commands/reset.js +1 -1
- package/dist/src/commands/resolve.d.ts +2 -2
- package/dist/src/commands/resolve.js +3 -3
- package/dist/src/commands/run.js +26 -26
- package/dist/src/commands/setup-support.js +4 -4
- package/dist/src/commands/setup.js +1 -1
- package/dist/src/commands/source.js +1 -1
- package/dist/src/commands/status-check.d.ts +3 -3
- package/dist/src/commands/status-check.js +4 -4
- package/dist/src/commands/status-json.d.ts +14 -13
- package/dist/src/commands/status-json.js +9 -8
- package/dist/src/commands/status-output.d.ts +3 -3
- package/dist/src/commands/status-output.js +3 -3
- package/dist/src/commands/status-ownership.d.ts +3 -3
- package/dist/src/commands/status-ownership.js +3 -3
- package/dist/src/commands/status.js +22 -22
- package/dist/src/commands/test-build-phase.d.ts +1 -1
- package/dist/src/commands/test-build-phase.js +17 -17
- package/dist/src/commands/test-diagnose.d.ts +1 -1
- package/dist/src/commands/test-diagnose.js +20 -20
- package/dist/src/commands/test-modes.d.ts +2 -2
- package/dist/src/commands/test-modes.js +4 -4
- package/dist/src/commands/test-run.d.ts +11 -11
- package/dist/src/commands/test-run.js +15 -15
- package/dist/src/commands/test-stale-gate.d.ts +12 -12
- package/dist/src/commands/test-stale-gate.js +13 -13
- package/dist/src/commands/test-verdict.d.ts +6 -6
- package/dist/src/commands/test-verdict.js +11 -11
- package/dist/src/commands/test.d.ts +3 -3
- package/dist/src/commands/test.js +36 -36
- package/dist/src/commands/token-coverage.js +3 -3
- package/dist/src/commands/token-list.js +5 -5
- package/dist/src/commands/token.js +9 -9
- package/dist/src/commands/tree.js +19 -19
- package/dist/src/commands/typecheck.d.ts +6 -6
- package/dist/src/commands/typecheck.js +7 -7
- package/dist/src/commands/verify.d.ts +3 -3
- package/dist/src/commands/verify.js +10 -10
- package/dist/src/commands/watch.js +11 -11
- package/dist/src/commands/wire.js +13 -13
- package/dist/src/core/ast-utils.d.ts +7 -7
- package/dist/src/core/ast-utils.js +8 -8
- package/dist/src/core/branding.d.ts +5 -5
- package/dist/src/core/branding.js +3 -3
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +4 -4
- package/dist/src/core/build-audit-platform.d.ts +6 -6
- package/dist/src/core/build-audit-platform.js +26 -26
- package/dist/src/core/build-audit-registration.d.ts +5 -5
- package/dist/src/core/build-audit-registration.js +7 -7
- package/dist/src/core/build-audit-resolve.d.ts +5 -5
- package/dist/src/core/build-audit-resolve.js +6 -6
- package/dist/src/core/build-audit-skip.d.ts +8 -8
- package/dist/src/core/build-audit-skip.js +12 -12
- package/dist/src/core/build-audit-transforms.d.ts +2 -2
- package/dist/src/core/build-audit-transforms.js +3 -3
- package/dist/src/core/build-audit.d.ts +8 -8
- package/dist/src/core/build-audit.js +39 -37
- package/dist/src/core/build-baseline-types.d.ts +19 -18
- package/dist/src/core/build-baseline-types.js +1 -1
- package/dist/src/core/build-baseline.d.ts +8 -8
- package/dist/src/core/build-baseline.js +14 -14
- package/dist/src/core/build-jar-escalation.d.ts +8 -8
- package/dist/src/core/build-jar-escalation.js +15 -15
- package/dist/src/core/build-overwrite-guard.d.ts +4 -4
- package/dist/src/core/build-overwrite-guard.js +13 -13
- package/dist/src/core/build-prepare.d.ts +4 -4
- package/dist/src/core/build-prepare.js +16 -15
- package/dist/src/core/config-mutate.js +4 -4
- package/dist/src/core/config-state.js +2 -2
- package/dist/src/core/config-validate-build-audit.js +3 -3
- package/dist/src/core/config-validate-file-size.d.ts +1 -1
- package/dist/src/core/config-validate-file-size.js +2 -2
- package/dist/src/core/config-validate.js +8 -9
- package/dist/src/core/config.d.ts +10 -10
- package/dist/src/core/config.js +10 -10
- package/dist/src/core/coverage-extend.d.ts +16 -16
- package/dist/src/core/coverage-extend.js +16 -16
- package/dist/src/core/destructive.d.ts +14 -14
- package/dist/src/core/destructive.js +9 -9
- package/dist/src/core/diff-hunks.d.ts +2 -2
- package/dist/src/core/diff-hunks.js +7 -7
- package/dist/src/core/discard-baseline.d.ts +10 -10
- package/dist/src/core/discard-baseline.js +15 -16
- package/dist/src/core/display-state.d.ts +11 -11
- package/dist/src/core/display-state.js +12 -12
- package/dist/src/core/engine-changes.d.ts +2 -2
- package/dist/src/core/engine-changes.js +2 -2
- package/dist/src/core/engine-precondition.d.ts +4 -4
- package/dist/src/core/engine-precondition.js +2 -2
- package/dist/src/core/engine-session-lock.d.ts +18 -18
- package/dist/src/core/engine-session-lock.js +37 -37
- package/dist/src/core/export-moved-code-shape.d.ts +7 -7
- package/dist/src/core/export-moved-code-shape.js +8 -8
- package/dist/src/core/file-lock-owner.d.ts +11 -11
- package/dist/src/core/file-lock-owner.js +18 -18
- package/dist/src/core/file-lock.d.ts +12 -12
- package/dist/src/core/file-lock.js +52 -39
- package/dist/src/core/firefox-cache.d.ts +1 -1
- package/dist/src/core/firefox-cache.js +10 -10
- package/dist/src/core/firefox-download.d.ts +3 -3
- package/dist/src/core/firefox-download.js +6 -6
- package/dist/src/core/firefox-extract.d.ts +2 -2
- package/dist/src/core/firefox-extract.js +13 -13
- package/dist/src/core/firefox.d.ts +5 -5
- package/dist/src/core/firefox.js +8 -8
- package/dist/src/core/furnace-apply-dry-run.js +1 -1
- package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
- package/dist/src/core/furnace-apply-ftl.js +8 -8
- package/dist/src/core/furnace-apply-helpers.d.ts +9 -9
- package/dist/src/core/furnace-apply-helpers.js +21 -21
- package/dist/src/core/furnace-apply-output.js +1 -1
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +9 -9
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
- package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
- package/dist/src/core/furnace-apply.d.ts +3 -3
- package/dist/src/core/furnace-apply.js +22 -21
- package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
- package/dist/src/core/furnace-checksum-utils.js +5 -5
- package/dist/src/core/furnace-config-custom.d.ts +1 -1
- package/dist/src/core/furnace-config-custom.js +2 -2
- package/dist/src/core/furnace-config-order.js +1 -1
- package/dist/src/core/furnace-config-tokens.d.ts +3 -3
- package/dist/src/core/furnace-config-tokens.js +3 -3
- package/dist/src/core/furnace-config-validate.js +2 -2
- package/dist/src/core/furnace-config.d.ts +4 -4
- package/dist/src/core/furnace-config.js +18 -18
- package/dist/src/core/furnace-constants.d.ts +6 -6
- package/dist/src/core/furnace-constants.js +6 -6
- package/dist/src/core/furnace-css-fragments.d.ts +6 -6
- package/dist/src/core/furnace-css-fragments.js +11 -11
- package/dist/src/core/furnace-dir-entry.d.ts +1 -1
- package/dist/src/core/furnace-dir-entry.js +1 -1
- package/dist/src/core/furnace-jsconfig.d.ts +7 -7
- package/dist/src/core/furnace-jsconfig.js +22 -20
- package/dist/src/core/furnace-operation.d.ts +21 -20
- package/dist/src/core/furnace-operation.js +36 -34
- package/dist/src/core/furnace-precondition.d.ts +10 -10
- package/dist/src/core/furnace-precondition.js +8 -8
- package/dist/src/core/furnace-refresh.js +2 -2
- package/dist/src/core/furnace-registration-ast.d.ts +2 -2
- package/dist/src/core/furnace-registration-ast.js +9 -9
- package/dist/src/core/furnace-registration-remove.d.ts +4 -4
- package/dist/src/core/furnace-registration-remove.js +6 -6
- package/dist/src/core/furnace-registration-validate.d.ts +2 -2
- package/dist/src/core/furnace-registration-validate.js +2 -2
- package/dist/src/core/furnace-registration.d.ts +5 -5
- package/dist/src/core/furnace-registration.js +7 -7
- package/dist/src/core/furnace-rollback.d.ts +1 -1
- package/dist/src/core/furnace-rollback.js +5 -5
- package/dist/src/core/furnace-stale-export.d.ts +17 -16
- package/dist/src/core/furnace-stale-export.js +16 -15
- package/dist/src/core/furnace-staleness.d.ts +2 -2
- package/dist/src/core/furnace-staleness.js +2 -2
- package/dist/src/core/furnace-state-persist.d.ts +10 -10
- package/dist/src/core/furnace-state-persist.js +10 -10
- package/dist/src/core/furnace-step-errors.d.ts +6 -6
- package/dist/src/core/furnace-step-errors.js +6 -6
- package/dist/src/core/furnace-validate-accessibility.js +14 -14
- package/dist/src/core/furnace-validate-compatibility.js +9 -9
- package/dist/src/core/furnace-validate-registration.d.ts +2 -2
- package/dist/src/core/furnace-validate-registration.js +13 -13
- package/dist/src/core/furnace-validate-structure.d.ts +1 -1
- package/dist/src/core/furnace-validate-structure.js +4 -4
- package/dist/src/core/furnace-validate.js +9 -9
- package/dist/src/core/furnace-version-drift.d.ts +5 -5
- package/dist/src/core/furnace-version-drift.js +5 -5
- package/dist/src/core/git-base.d.ts +4 -4
- package/dist/src/core/git-base.js +9 -9
- package/dist/src/core/git-diff-new-file.d.ts +4 -4
- package/dist/src/core/git-diff-new-file.js +8 -8
- package/dist/src/core/git-diff.d.ts +4 -4
- package/dist/src/core/git-diff.js +35 -34
- package/dist/src/core/git-file-ops.d.ts +6 -6
- package/dist/src/core/git-file-ops.js +7 -7
- package/dist/src/core/git-readonly-index.d.ts +12 -12
- package/dist/src/core/git-readonly-index.js +12 -12
- package/dist/src/core/git-status.d.ts +4 -4
- package/dist/src/core/git-status.js +4 -4
- package/dist/src/core/git.d.ts +3 -3
- package/dist/src/core/git.js +14 -14
- package/dist/src/core/harness-orphans.d.ts +17 -17
- package/dist/src/core/harness-orphans.js +20 -20
- package/dist/src/core/history-log.d.ts +3 -3
- package/dist/src/core/history-log.js +3 -3
- package/dist/src/core/license-headers.d.ts +19 -18
- package/dist/src/core/license-headers.js +29 -28
- package/dist/src/core/mach-build-artifacts.d.ts +21 -21
- package/dist/src/core/mach-build-artifacts.js +23 -23
- package/dist/src/core/mach-error-hints.d.ts +5 -5
- package/dist/src/core/mach-error-hints.js +13 -13
- package/dist/src/core/mach-known-noise-filter.d.ts +41 -38
- package/dist/src/core/mach-known-noise-filter.js +53 -50
- package/dist/src/core/mach-mozconfig.d.ts +6 -6
- package/dist/src/core/mach-mozconfig.js +15 -15
- package/dist/src/core/mach-python.d.ts +2 -1
- package/dist/src/core/mach-python.js +4 -3
- package/dist/src/core/mach-resource-shim.d.ts +12 -12
- package/dist/src/core/mach-resource-shim.js +20 -20
- package/dist/src/core/mach.d.ts +23 -23
- package/dist/src/core/mach.js +36 -36
- package/dist/src/core/marionette-port.d.ts +15 -13
- package/dist/src/core/marionette-port.js +34 -31
- package/dist/src/core/marionette-preflight.d.ts +6 -6
- package/dist/src/core/marionette-preflight.js +23 -23
- package/dist/src/core/markdown-table.d.ts +9 -9
- package/dist/src/core/markdown-table.js +14 -14
- package/dist/src/core/mochitest-server-port.d.ts +8 -8
- package/dist/src/core/mochitest-server-port.js +14 -14
- package/dist/src/core/module-resolution-preflight.d.ts +8 -8
- package/dist/src/core/module-resolution-preflight.js +11 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
- package/dist/src/core/moz-manifest-helpers.js +7 -7
- package/dist/src/core/moz-manifest-register.d.ts +1 -1
- package/dist/src/core/moz-manifest-register.js +2 -2
- package/dist/src/core/moz-manifest-rules.js +11 -11
- package/dist/src/core/moz-manifest-tokenizers.js +1 -1
- package/dist/src/core/ownership-table.d.ts +5 -5
- package/dist/src/core/ownership-table.js +7 -7
- package/dist/src/core/parser-fallback.d.ts +3 -3
- package/dist/src/core/parser-fallback.js +3 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
- package/dist/src/core/patch-apply-fuzz.js +9 -9
- package/dist/src/core/patch-apply.d.ts +9 -9
- package/dist/src/core/patch-apply.js +30 -30
- package/dist/src/core/patch-export-update.d.ts +4 -4
- package/dist/src/core/patch-export-update.js +3 -3
- package/dist/src/core/patch-export.d.ts +10 -10
- package/dist/src/core/patch-export.js +13 -13
- package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
- package/dist/src/core/patch-identifier-suggest.js +4 -4
- package/dist/src/core/patch-lint-binary.d.ts +7 -7
- package/dist/src/core/patch-lint-cache.d.ts +2 -2
- package/dist/src/core/patch-lint-cache.js +13 -13
- package/dist/src/core/patch-lint-checkjs.d.ts +26 -26
- package/dist/src/core/patch-lint-checkjs.js +42 -41
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
- package/dist/src/core/patch-lint-creators.d.ts +3 -3
- package/dist/src/core/patch-lint-creators.js +3 -3
- package/dist/src/core/patch-lint-cross.d.ts +13 -13
- package/dist/src/core/patch-lint-cross.js +21 -21
- package/dist/src/core/patch-lint-css.d.ts +1 -1
- package/dist/src/core/patch-lint-css.js +5 -5
- package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
- package/dist/src/core/patch-lint-diff-tag.js +5 -5
- package/dist/src/core/patch-lint-diff.d.ts +4 -4
- package/dist/src/core/patch-lint-diff.js +4 -4
- package/dist/src/core/patch-lint-file-size.d.ts +3 -3
- package/dist/src/core/patch-lint-file-size.js +3 -3
- package/dist/src/core/patch-lint-forward-registration.d.ts +4 -4
- package/dist/src/core/patch-lint-forward-registration.js +12 -12
- package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
- package/dist/src/core/patch-lint-jsdoc.js +11 -11
- package/dist/src/core/patch-lint-module-registration.d.ts +1 -1
- package/dist/src/core/patch-lint-module-registration.js +1 -1
- package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
- package/dist/src/core/patch-lint-mozbuild.js +10 -10
- package/dist/src/core/patch-lint-observer.d.ts +3 -3
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint-ownership.d.ts +6 -6
- package/dist/src/core/patch-lint-ownership.js +6 -6
- package/dist/src/core/patch-lint-prettier.d.ts +6 -6
- package/dist/src/core/patch-lint-prettier.js +6 -6
- package/dist/src/core/patch-lint-queue-types.d.ts +1 -1
- package/dist/src/core/patch-lint-queue-types.js +1 -1
- package/dist/src/core/patch-lint-staged-registration.d.ts +2 -2
- package/dist/src/core/patch-lint-staged-registration.js +6 -6
- package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
- package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
- package/dist/src/core/patch-lint.d.ts +27 -26
- package/dist/src/core/patch-lint.js +48 -46
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +8 -8
- package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
- package/dist/src/core/patch-manifest-consistency.js +16 -17
- package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
- package/dist/src/core/patch-manifest-files-affected.js +3 -3
- package/dist/src/core/patch-manifest-io.d.ts +14 -14
- package/dist/src/core/patch-manifest-io.js +27 -27
- package/dist/src/core/patch-manifest-query.d.ts +1 -1
- package/dist/src/core/patch-manifest-query.js +4 -4
- package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
- package/dist/src/core/patch-manifest-resolve.js +7 -7
- package/dist/src/core/patch-manifest-validate.js +3 -3
- package/dist/src/core/patch-manifest.d.ts +2 -2
- package/dist/src/core/patch-manifest.js +2 -2
- package/dist/src/core/patch-parse.d.ts +14 -14
- package/dist/src/core/patch-parse.js +16 -16
- package/dist/src/core/patch-registration-refs.d.ts +4 -4
- package/dist/src/core/patch-registration-refs.js +7 -7
- package/dist/src/core/patch-transform.d.ts +8 -8
- package/dist/src/core/patch-transform.js +13 -13
- package/dist/src/core/process-cpu-time.d.ts +1 -1
- package/dist/src/core/process-cpu-time.js +5 -5
- package/dist/src/core/rebase-session.d.ts +7 -7
- package/dist/src/core/rebase-session.js +8 -8
- package/dist/src/core/register-result.d.ts +1 -1
- package/dist/src/core/register-result.js +1 -1
- package/dist/src/core/register-scaffold.d.ts +2 -2
- package/dist/src/core/register-scaffold.js +3 -3
- package/dist/src/core/register-shared-css.d.ts +3 -3
- package/dist/src/core/register-shared-css.js +4 -4
- package/dist/src/core/register-xpcshell-test.d.ts +2 -2
- package/dist/src/core/register-xpcshell-test.js +2 -2
- package/dist/src/core/run-log-redact.d.ts +12 -12
- package/dist/src/core/run-log-redact.js +16 -16
- package/dist/src/core/run-log.d.ts +9 -9
- package/dist/src/core/run-log.js +14 -14
- package/dist/src/core/shared-ftl.d.ts +2 -2
- package/dist/src/core/shared-ftl.js +6 -6
- package/dist/src/core/signal-critical.d.ts +2 -2
- package/dist/src/core/signal-critical.js +2 -2
- package/dist/src/core/smoke-patterns.d.ts +5 -5
- package/dist/src/core/smoke-patterns.js +9 -9
- package/dist/src/core/state-file.d.ts +3 -3
- package/dist/src/core/status-binary.d.ts +8 -8
- package/dist/src/core/status-binary.js +12 -12
- package/dist/src/core/status-classify.d.ts +17 -17
- package/dist/src/core/status-classify.js +11 -11
- package/dist/src/core/test-changed-prefs.d.ts +12 -12
- package/dist/src/core/test-changed-prefs.js +15 -15
- package/dist/src/core/test-harness-crash.d.ts +39 -39
- package/dist/src/core/test-harness-crash.js +67 -67
- package/dist/src/core/test-harness-output.d.ts +7 -7
- package/dist/src/core/test-harness-output.js +7 -7
- package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
- package/dist/src/core/test-harness-verdict-notes.js +4 -4
- package/dist/src/core/test-path-scope.d.ts +8 -8
- package/dist/src/core/test-path-scope.js +11 -11
- package/dist/src/core/test-stale-check.d.ts +22 -21
- package/dist/src/core/test-stale-check.js +29 -28
- package/dist/src/core/test-stale-symlink.d.ts +1 -1
- package/dist/src/core/test-stale-symlink.js +1 -1
- package/dist/src/core/test-stall-triage.d.ts +9 -9
- package/dist/src/core/test-stall-triage.js +22 -22
- package/dist/src/core/token-category.d.ts +4 -4
- package/dist/src/core/token-category.js +13 -12
- package/dist/src/core/token-coverage.js +4 -5
- package/dist/src/core/token-dark-mode.d.ts +17 -9
- package/dist/src/core/token-dark-mode.js +41 -28
- package/dist/src/core/token-docs.d.ts +1 -1
- package/dist/src/core/token-inventory.d.ts +6 -6
- package/dist/src/core/token-inventory.js +7 -7
- package/dist/src/core/token-manager.d.ts +3 -3
- package/dist/src/core/token-manager.js +21 -21
- package/dist/src/core/token-scaffold.d.ts +4 -4
- package/dist/src/core/token-scaffold.js +4 -4
- package/dist/src/core/token-variant.d.ts +14 -14
- package/dist/src/core/token-variant.js +32 -32
- package/dist/src/core/toolchain-preflight.d.ts +15 -15
- package/dist/src/core/toolchain-preflight.js +22 -22
- package/dist/src/core/tree-cow.d.ts +3 -3
- package/dist/src/core/tree-cow.js +6 -6
- package/dist/src/core/tree-guard.d.ts +3 -3
- package/dist/src/core/tree-guard.js +23 -23
- package/dist/src/core/tree-store.d.ts +15 -15
- package/dist/src/core/tree-store.js +35 -33
- package/dist/src/core/typecheck-shim.d.ts +16 -15
- package/dist/src/core/typecheck-shim.js +26 -25
- package/dist/src/core/typecheck.d.ts +12 -12
- package/dist/src/core/typecheck.js +31 -31
- package/dist/src/core/wire-destroy.d.ts +2 -2
- package/dist/src/core/wire-destroy.js +5 -5
- package/dist/src/core/wire-dom-fragment.d.ts +3 -3
- package/dist/src/core/wire-dom-fragment.js +6 -6
- package/dist/src/core/wire-init.d.ts +2 -2
- package/dist/src/core/wire-init.js +7 -7
- package/dist/src/core/wire-subscript.d.ts +1 -1
- package/dist/src/core/wire-subscript.js +3 -3
- package/dist/src/core/wire-utils.d.ts +9 -9
- package/dist/src/core/wire-utils.js +11 -11
- package/dist/src/core/xpcshell-appdir.d.ts +20 -20
- package/dist/src/core/xpcshell-appdir.js +26 -26
- package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
- package/dist/src/core/xpcshell-profile-dir.js +7 -7
- package/dist/src/errors/base.d.ts +22 -21
- package/dist/src/errors/base.js +22 -21
- package/dist/src/errors/build.d.ts +6 -6
- package/dist/src/errors/build.js +6 -6
- package/dist/src/errors/codes.d.ts +10 -10
- package/dist/src/errors/codes.js +10 -10
- package/dist/src/errors/furnace.d.ts +2 -2
- package/dist/src/errors/git.d.ts +1 -1
- package/dist/src/errors/git.js +1 -1
- package/dist/src/errors/patch.d.ts +3 -3
- package/dist/src/errors/patch.js +3 -3
- package/dist/src/errors/rebase.d.ts +1 -1
- package/dist/src/errors/rebase.js +1 -1
- package/dist/src/errors/run.d.ts +1 -1
- package/dist/src/errors/run.js +1 -1
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.js +4 -4
- package/dist/src/types/commands/options.d.ts +86 -85
- package/dist/src/types/commands/patches.d.ts +19 -19
- package/dist/src/types/commands/project.d.ts +3 -3
- package/dist/src/types/config.d.ts +24 -23
- package/dist/src/types/furnace.d.ts +17 -17
- package/dist/src/types/json.d.ts +3 -3
- package/dist/src/types/json.js +2 -2
- package/dist/src/types/typecheck.d.ts +3 -3
- package/dist/src/utils/assert.d.ts +1 -1
- package/dist/src/utils/assert.js +6 -6
- package/dist/src/utils/build-info.d.ts +5 -5
- package/dist/src/utils/build-info.js +6 -6
- package/dist/src/utils/child-env.d.ts +5 -5
- package/dist/src/utils/child-env.js +5 -5
- package/dist/src/utils/concurrency.d.ts +2 -2
- package/dist/src/utils/concurrency.js +2 -2
- package/dist/src/utils/elapsed.js +1 -1
- package/dist/src/utils/errors.d.ts +8 -8
- package/dist/src/utils/errors.js +8 -8
- package/dist/src/utils/fs.d.ts +1 -1
- package/dist/src/utils/fs.js +8 -8
- package/dist/src/utils/line-dispatch.d.ts +3 -3
- package/dist/src/utils/line-dispatch.js +5 -5
- package/dist/src/utils/logger.d.ts +4 -4
- package/dist/src/utils/logger.js +11 -11
- package/dist/src/utils/machine-output.js +2 -2
- package/dist/src/utils/options.d.ts +13 -13
- package/dist/src/utils/options.js +20 -20
- package/dist/src/utils/package-root.js +2 -2
- package/dist/src/utils/paths.d.ts +4 -4
- package/dist/src/utils/paths.js +4 -4
- package/dist/src/utils/process-group.d.ts +8 -8
- package/dist/src/utils/process-group.js +19 -19
- package/dist/src/utils/process.d.ts +34 -33
- package/dist/src/utils/process.js +20 -19
- package/dist/src/utils/ps-duration.d.ts +4 -4
- package/dist/src/utils/ps-duration.js +6 -6
- package/dist/src/utils/regex.d.ts +4 -4
- package/dist/src/utils/regex.js +7 -7
- package/dist/src/utils/sleep.d.ts +7 -7
- package/dist/src/utils/sleep.js +7 -7
- package/dist/src/utils/stdio-drain.d.ts +7 -7
- package/dist/src/utils/stdio-drain.js +8 -8
- package/dist/src/utils/validation.d.ts +11 -12
- package/dist/src/utils/validation.js +20 -21
- package/docs/README.md +2 -2
- package/docs/configuration.md +120 -114
- package/docs/exit-codes.md +63 -58
- package/docs/furnace.md +20 -19
- package/docs/lifecycle-invariants.md +412 -251
- package/docs/machine-output.md +33 -32
- package/docs/patch-workflow.md +48 -45
- package/docs/run-logs.md +62 -58
- package/docs/testing.md +101 -101
- package/docs/verification-trees.md +23 -22
- package/package.json +2 -2
|
@@ -6,7 +6,7 @@ import { buildPatchClaims } from './status-classify.js';
|
|
|
6
6
|
*
|
|
7
7
|
* Populated from three sources:
|
|
8
8
|
*
|
|
9
|
-
* 1. Every path in every patch's `filesAffected
|
|
9
|
+
* 1. Every path in every patch's `filesAffected`, so managed paths show up
|
|
10
10
|
* even when they are not currently modified on disk.
|
|
11
11
|
* 2. Any worktree status entries not claimed by any patch (flagged as
|
|
12
12
|
* `unmanaged`).
|
|
@@ -21,11 +21,11 @@ import { buildPatchClaims } from './status-classify.js';
|
|
|
21
21
|
* `conflictReason` so the output can disambiguate.
|
|
22
22
|
*
|
|
23
23
|
* @param manifestPatches - Manifest rows, each with its `filesAffected`
|
|
24
|
-
* @param worktreeFiles - Raw worktree status entries
|
|
24
|
+
* @param worktreeFiles - Raw worktree status entries. Untracked and modified
|
|
25
25
|
* both acceptable
|
|
26
26
|
* @param newFileCreatorsByPath - Map produced by
|
|
27
|
-
* {@link import('../core/patch-lint.js').collectNewFileCreatorsByPath}
|
|
28
|
-
*
|
|
27
|
+
* {@link import('../core/patch-lint.js').collectNewFileCreatorsByPath}.
|
|
28
|
+
* Paths with a `.length > 1` owner list become duplicate-create conflicts
|
|
29
29
|
*/
|
|
30
30
|
export function buildOwnershipTable(manifestPatches, worktreeFiles, newFileCreatorsByPath, classifications = new Map()) {
|
|
31
31
|
const ownersByPath = buildPatchClaims(manifestPatches);
|
|
@@ -57,7 +57,7 @@ export function buildOwnershipTable(manifestPatches, worktreeFiles, newFileCreat
|
|
|
57
57
|
const duplicateOwners = duplicateCreateByPath.get(path);
|
|
58
58
|
const isFilesAffectedConflict = owners.length > 1;
|
|
59
59
|
const isDuplicateCreateConflict = duplicateOwners !== undefined;
|
|
60
|
-
// Prefer the filesAffected reason when both apply
|
|
60
|
+
// Prefer the filesAffected reason when both apply: it's the older
|
|
61
61
|
// source of drift and the operator will usually want to fix the
|
|
62
62
|
// manifest rows even when the bodies also duplicate-create.
|
|
63
63
|
const conflictReason = isFilesAffectedConflict
|
|
@@ -105,7 +105,7 @@ export function buildOwnershipTable(manifestPatches, worktreeFiles, newFileCreat
|
|
|
105
105
|
* `files-affected` drift (two manifest rows claiming the same path) from
|
|
106
106
|
* `duplicate-create` drift (two patches both hitting `/dev/null → b/path`
|
|
107
107
|
* in their bodies) so the operator can tell at a glance which fix
|
|
108
|
-
* applies
|
|
108
|
+
* applies. The former wants `re-export --files`, the latter wants
|
|
109
109
|
* `patch delete`.
|
|
110
110
|
*/
|
|
111
111
|
function renderConflictCell(row) {
|
|
@@ -134,7 +134,7 @@ function renderStateCell(row) {
|
|
|
134
134
|
/**
|
|
135
135
|
* Renders the ownership table as a GitHub-flavored Markdown pipe table.
|
|
136
136
|
* Using markdown-table's own serializer would require a seed document to
|
|
137
|
-
* graft onto, which is overkill for ad-hoc status output
|
|
137
|
+
* graft onto, which is overkill for ad-hoc status output. The rendering
|
|
138
138
|
* here is trivial enough to inline.
|
|
139
139
|
*/
|
|
140
140
|
export function renderOwnershipTable(rows) {
|
|
@@ -14,8 +14,8 @@ export declare function consumeParserFallbackEvents(): ParserFallbackEvent[];
|
|
|
14
14
|
*
|
|
15
15
|
* Rethrows internal-invariant `GeneralError`s ("Unexpected empty …array"):
|
|
16
16
|
* those are programming bugs, and retrying the legacy scanner cannot fix a
|
|
17
|
-
* broken invariant
|
|
18
|
-
* back, which
|
|
17
|
+
* broken invariant, it just buries the stack. Everything else still falls
|
|
18
|
+
* back, which matters: the AST path raises a raw acorn SyntaxError
|
|
19
19
|
* on chrome sources acorn cannot parse (preprocessor directives), and
|
|
20
20
|
* BuildError when the file's shape is unexpected. Both are exactly what the
|
|
21
21
|
* legacy scanner is here to handle.
|
|
@@ -43,7 +43,7 @@ export interface ParserResult<T> {
|
|
|
43
43
|
* @param primary - The modern parser implementation
|
|
44
44
|
* @param fallback - The legacy fallback implementation
|
|
45
45
|
* @param context - File/context name used in the warning message
|
|
46
|
-
* @param rethrowIf - Optional predicate
|
|
46
|
+
* @param rethrowIf - Optional predicate. If it returns true for the caught
|
|
47
47
|
* error the error is re-thrown instead of falling back (useful for
|
|
48
48
|
* domain-specific errors that should not be swallowed).
|
|
49
49
|
*/
|
|
@@ -19,8 +19,8 @@ export function consumeParserFallbackEvents() {
|
|
|
19
19
|
*
|
|
20
20
|
* Rethrows internal-invariant `GeneralError`s ("Unexpected empty …array"):
|
|
21
21
|
* those are programming bugs, and retrying the legacy scanner cannot fix a
|
|
22
|
-
* broken invariant
|
|
23
|
-
* back, which
|
|
22
|
+
* broken invariant, it just buries the stack. Everything else still falls
|
|
23
|
+
* back, which matters: the AST path raises a raw acorn SyntaxError
|
|
24
24
|
* on chrome sources acorn cannot parse (preprocessor directives), and
|
|
25
25
|
* BuildError when the file's shape is unexpected. Both are exactly what the
|
|
26
26
|
* legacy scanner is here to handle.
|
|
@@ -42,7 +42,7 @@ export function isInternalInvariantFailure(error) {
|
|
|
42
42
|
* @param primary - The modern parser implementation
|
|
43
43
|
* @param fallback - The legacy fallback implementation
|
|
44
44
|
* @param context - File/context name used in the warning message
|
|
45
|
-
* @param rethrowIf - Optional predicate
|
|
45
|
+
* @param rethrowIf - Optional predicate. If it returns true for the caught
|
|
46
46
|
* error the error is re-thrown instead of falling back (useful for
|
|
47
47
|
* domain-specific errors that should not be swallowed).
|
|
48
48
|
*/
|
|
@@ -3,17 +3,17 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Tries an exact `git apply` first, then retries with git's real
|
|
5
5
|
* drift-tolerance knob: `-C<n>` (reduced context matching). `git apply` has
|
|
6
|
-
*
|
|
6
|
+
* no `--fuzz` option. That flag belongs to GNU `patch(1)`, and passing it
|
|
7
7
|
* makes git exit 129 with a usage error that an escalation loop will happily
|
|
8
8
|
* swallow, so every "fuzzy" attempt silently fails and patches that would
|
|
9
9
|
* have applied with context drift are reported as hard conflicts. If all
|
|
10
10
|
* context-reduction levels fail, falls through to `git apply --reject` so
|
|
11
11
|
* the user gets `.rej` files for manual resolution.
|
|
12
12
|
*
|
|
13
|
-
* Semantics note: GNU fuzz *fuzzily matches* context
|
|
13
|
+
* Semantics note: GNU fuzz *fuzzily matches* context. `-C<n>` *ignores*
|
|
14
14
|
* outer context lines instead. Step k maps to `-C(3-k)` (git's default
|
|
15
15
|
* context width is 3), so the final step `-C0` matches on line positions and
|
|
16
|
-
* -/+ content alone
|
|
16
|
+
* -/+ content alone, the rough analogue of GNU `--fuzz=3` on a 3-context
|
|
17
17
|
* patch.
|
|
18
18
|
*/
|
|
19
19
|
export interface FuzzyApplyResult {
|
|
@@ -38,8 +38,8 @@ export interface FuzzyApplyResult {
|
|
|
38
38
|
* @param maxFuzz - Maximum context-reduction steps to try (default 3,
|
|
39
39
|
* 0 = exact only). Values above 3 are capped: git cannot reduce below
|
|
40
40
|
* `-C0`.
|
|
41
|
-
* @throws InvalidArgumentError when `maxFuzz` is not a non-negative integer
|
|
42
|
-
*
|
|
41
|
+
* @throws InvalidArgumentError when `maxFuzz` is not a non-negative integer.
|
|
42
|
+
* A NaN or negative value would silently skip every apply attempt
|
|
43
43
|
* (including the exact-match one) and fall straight through to `--reject`
|
|
44
44
|
*/
|
|
45
45
|
export declare function applyPatchWithFuzz(patchPath: string, engineDir: string, maxFuzz?: number): Promise<FuzzyApplyResult>;
|
|
@@ -4,24 +4,24 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Tries an exact `git apply` first, then retries with git's real
|
|
6
6
|
* drift-tolerance knob: `-C<n>` (reduced context matching). `git apply` has
|
|
7
|
-
*
|
|
7
|
+
* no `--fuzz` option. That flag belongs to GNU `patch(1)`, and passing it
|
|
8
8
|
* makes git exit 129 with a usage error that an escalation loop will happily
|
|
9
9
|
* swallow, so every "fuzzy" attempt silently fails and patches that would
|
|
10
10
|
* have applied with context drift are reported as hard conflicts. If all
|
|
11
11
|
* context-reduction levels fail, falls through to `git apply --reject` so
|
|
12
12
|
* the user gets `.rej` files for manual resolution.
|
|
13
13
|
*
|
|
14
|
-
* Semantics note: GNU fuzz *fuzzily matches* context
|
|
14
|
+
* Semantics note: GNU fuzz *fuzzily matches* context. `-C<n>` *ignores*
|
|
15
15
|
* outer context lines instead. Step k maps to `-C(3-k)` (git's default
|
|
16
16
|
* context width is 3), so the final step `-C0` matches on line positions and
|
|
17
|
-
* -/+ content alone
|
|
17
|
+
* -/+ content alone, the rough analogue of GNU `--fuzz=3` on a 3-context
|
|
18
18
|
* patch.
|
|
19
19
|
*/
|
|
20
20
|
import { InvalidArgumentError } from '../errors/base.js';
|
|
21
21
|
import { verbose } from '../utils/logger.js';
|
|
22
22
|
import { exec } from '../utils/process.js';
|
|
23
23
|
import { ensureGit } from './git-base.js';
|
|
24
|
-
/** Git's default diff context width
|
|
24
|
+
/** Git's default diff context width, the ceiling for reduction steps. */
|
|
25
25
|
const GIT_DEFAULT_CONTEXT = 3;
|
|
26
26
|
// ── Implementation ──
|
|
27
27
|
/**
|
|
@@ -36,8 +36,8 @@ const GIT_DEFAULT_CONTEXT = 3;
|
|
|
36
36
|
* @param maxFuzz - Maximum context-reduction steps to try (default 3,
|
|
37
37
|
* 0 = exact only). Values above 3 are capped: git cannot reduce below
|
|
38
38
|
* `-C0`.
|
|
39
|
-
* @throws InvalidArgumentError when `maxFuzz` is not a non-negative integer
|
|
40
|
-
*
|
|
39
|
+
* @throws InvalidArgumentError when `maxFuzz` is not a non-negative integer.
|
|
40
|
+
* A NaN or negative value would silently skip every apply attempt
|
|
41
41
|
* (including the exact-match one) and fall straight through to `--reject`
|
|
42
42
|
*/
|
|
43
43
|
export async function applyPatchWithFuzz(patchPath, engineDir, maxFuzz = 3) {
|
|
@@ -63,7 +63,7 @@ export async function applyPatchWithFuzz(patchPath, engineDir, maxFuzz = 3) {
|
|
|
63
63
|
}
|
|
64
64
|
return { success: true, fuzzFactor: step };
|
|
65
65
|
}
|
|
66
|
-
// Unlikely: --check passed but apply failed
|
|
66
|
+
// Unlikely: --check passed but apply failed. Fall through to next step
|
|
67
67
|
verbose(`git apply -C${GIT_DEFAULT_CONTEXT - step} --check passed but apply failed: ${apply.stderr.trim()}`);
|
|
68
68
|
}
|
|
69
69
|
}
|
|
@@ -88,8 +88,8 @@ export async function applyPatchWithFuzz(patchPath, engineDir, maxFuzz = 3) {
|
|
|
88
88
|
* Rejected hunk #1.
|
|
89
89
|
*
|
|
90
90
|
* The reject file is `<file>.rej` next to the target. Matching GNU
|
|
91
|
-
* `patch(1)`'s "saving rejects to file X.rej" phrasing instead
|
|
92
|
-
* never prints
|
|
91
|
+
* `patch(1)`'s "saving rejects to file X.rej" phrasing instead, which git
|
|
92
|
+
* never prints, leaves `rejectFiles` always empty and the
|
|
93
93
|
* conflict-summary ".rej files created" hint never fires.
|
|
94
94
|
*/
|
|
95
95
|
function extractRejectFiles(stderr) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Patch orchestration
|
|
2
|
+
* Patch orchestration. Coordinates patch discovery, application, and validation.
|
|
3
3
|
* Pure parsing, content transformation, and lock management are in separate modules.
|
|
4
4
|
*/
|
|
5
5
|
import type { ImportSummary, PatchInfo, PatchMetadata } from '../types/commands/index.js';
|
|
@@ -27,14 +27,14 @@ export interface ApplyPatchesOptions {
|
|
|
27
27
|
* The identifier is one of three shapes and the three shapes must stay
|
|
28
28
|
* disjoint so the operator can reason about which patch they picked:
|
|
29
29
|
*
|
|
30
|
-
* 1.
|
|
31
|
-
* 2.
|
|
32
|
-
* 3.
|
|
30
|
+
* 1. Exact filename, `005-foo.patch`. Matches only that filename.
|
|
31
|
+
* 2. Filename without extension, `005-foo`. Matches `005-foo.patch`.
|
|
32
|
+
* 3. Bare numeric ordinal, `5` or `005`. Matches the patch whose
|
|
33
33
|
* order prefix parses to the same integer (so `5` and `005` both match
|
|
34
34
|
* `005-foo.patch`, and `05` matches too because parseInt normalizes
|
|
35
35
|
* leading zeros).
|
|
36
36
|
*
|
|
37
|
-
* A purely-numeric identifier is treated
|
|
37
|
+
* A purely-numeric identifier is treated only as an ordinal: it does not
|
|
38
38
|
* also match a filename that happens to literally equal the digits. That
|
|
39
39
|
* would require a patch literally named `5` or `005`, which would collide
|
|
40
40
|
* with the filename prefix anyway.
|
|
@@ -66,10 +66,10 @@ export interface PatchedContentContext {
|
|
|
66
66
|
}
|
|
67
67
|
/**
|
|
68
68
|
* Builds a batched patched-content context that loads the manifest and
|
|
69
|
-
* discovers patch files
|
|
69
|
+
* discovers patch files once for many lookups, and memoizes each patch body
|
|
70
70
|
* read across the batch. A per-call helper re-runs `loadPatchesManifest` +
|
|
71
|
-
* `discoverPatches` and re-reads every affecting patch body for every file
|
|
72
|
-
* O(dirtyFiles × patches) redundant IO when classifying a broad
|
|
73
|
-
* session during `status` or `import`.
|
|
71
|
+
* `discoverPatches` and re-reads every affecting patch body for every file,
|
|
72
|
+
* which is O(dirtyFiles × patches) redundant IO when classifying a broad
|
|
73
|
+
* engine edit session during `status` or `import`.
|
|
74
74
|
*/
|
|
75
75
|
export declare function createPatchedContentContext(patchesDir: string, engineDir: string): Promise<PatchedContentContext>;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* Patch orchestration
|
|
3
|
+
* Patch orchestration. Coordinates patch discovery, application, and validation.
|
|
4
4
|
* Pure parsing, content transformation, and lock management are in separate modules.
|
|
5
5
|
*/
|
|
6
6
|
import { lstat, readFile, readlink, realpath, rm } from 'node:fs/promises';
|
|
@@ -27,7 +27,7 @@ export { extractAffectedFiles } from './patch-parse.js';
|
|
|
27
27
|
* @param patch - Patch info
|
|
28
28
|
* @param engineDir - Path to the engine directory
|
|
29
29
|
* @param protectedFiles - Files touched by patches already applied in the
|
|
30
|
-
* current run
|
|
30
|
+
* current run. The idempotent-recovery reset must not wipe them (see
|
|
31
31
|
* applyPatchIdempotent). Overlapping queues (`--allow-overlap`) share files
|
|
32
32
|
* between patches, and resetting a shared file to HEAD during a later
|
|
33
33
|
* patch's recovery silently discards the earlier patch's changes.
|
|
@@ -58,7 +58,7 @@ async function applySinglePatch(patch, engineDir, protectedFiles) {
|
|
|
58
58
|
// losslessly where a utf-8 decode of a binary file does not.
|
|
59
59
|
const savedContents = new Map();
|
|
60
60
|
// New-file sections keyed by target, so the binary discrimination below
|
|
61
|
-
// reads the
|
|
61
|
+
// reads the already-parsed section instead of re-scanning the body per
|
|
62
62
|
// file.
|
|
63
63
|
const newFileSections = new Map(parseDiffSections(patchContent)
|
|
64
64
|
.filter((section) => section.isNewFile)
|
|
@@ -73,14 +73,14 @@ async function applySinglePatch(patch, engineDir, protectedFiles) {
|
|
|
73
73
|
savedContents.set(file, await readFile(targetPath));
|
|
74
74
|
const section = newFileSections.get(file);
|
|
75
75
|
if (section?.isBinary === true) {
|
|
76
|
-
// A binary new file cannot be resolved by writing extracted
|
|
77
|
-
// the payload is base85, whose alphabet includes
|
|
78
|
-
// need to be: `git apply` decodes a `GIT binary
|
|
79
|
-
// the resolution is to
|
|
80
|
-
// below create it from the payload, which is
|
|
81
|
-
// text branch achieves by overwriting.
|
|
76
|
+
// A binary new file cannot be resolved by writing extracted
|
|
77
|
+
// text, because the payload is base85, whose alphabet includes
|
|
78
|
+
// '+'. It does not need to be: `git apply` decodes a `GIT binary
|
|
79
|
+
// patch` itself. So the resolution is to remove the blocking file
|
|
80
|
+
// and let the retry below create it from the payload, which is
|
|
81
|
+
// exactly what the text branch achieves by overwriting.
|
|
82
82
|
if (!section.hasBinaryDelta) {
|
|
83
|
-
// `Binary files … differ` records
|
|
83
|
+
// `Binary files … differ` records that the bytes changed and
|
|
84
84
|
// carries none of them, so nothing can recreate the file. Fail
|
|
85
85
|
// honestly rather than deleting a file we cannot put back.
|
|
86
86
|
throw new PatchError(`Cannot resolve the new-file conflict for ${file}: the patch's binary section ` +
|
|
@@ -97,8 +97,8 @@ async function applySinglePatch(patch, engineDir, protectedFiles) {
|
|
|
97
97
|
}
|
|
98
98
|
}
|
|
99
99
|
catch (extractError) {
|
|
100
|
-
// Resolution threw for a
|
|
101
|
-
// already overwritten or removed
|
|
100
|
+
// Resolution threw for a later target after earlier targets were
|
|
101
|
+
// already overwritten or removed. Restore them before reporting
|
|
102
102
|
// failure, instead of letting the exception skip the restore loop
|
|
103
103
|
// entirely and crash the whole import.
|
|
104
104
|
for (const [file, originalContent] of savedContents) {
|
|
@@ -111,7 +111,7 @@ async function applySinglePatch(patch, engineDir, protectedFiles) {
|
|
|
111
111
|
await applyPatchIdempotent(patch.path, engineDir, {
|
|
112
112
|
...(protectedFiles ? { protectedFiles } : {}),
|
|
113
113
|
});
|
|
114
|
-
// Keep the originals: rollbackPatches needs them if a
|
|
114
|
+
// Keep the originals: rollbackPatches needs them if a later patch
|
|
115
115
|
// fails, since reverse-applying this new-file patch deletes the
|
|
116
116
|
// target and would otherwise permanently discard the pre-existing
|
|
117
117
|
// content (recoverable from git only if it was tracked at HEAD).
|
|
@@ -161,8 +161,8 @@ async function rollbackPatches(results, engineDir) {
|
|
|
161
161
|
catch (rollbackError) {
|
|
162
162
|
verbose(`Failed to roll back ${result.patch.filename}: ${toError(rollbackError).message}`);
|
|
163
163
|
}
|
|
164
|
-
// Reversing an auto-resolved new-file patch deletes the target
|
|
165
|
-
// back the pre-existing content the auto-resolve overwrote.
|
|
164
|
+
// Reversing an auto-resolved new-file patch deletes the target, so
|
|
165
|
+
// put back the pre-existing content the auto-resolve overwrote.
|
|
166
166
|
if (result.autoResolvedOriginals) {
|
|
167
167
|
for (const [file, originalContent] of result.autoResolvedOriginals) {
|
|
168
168
|
try {
|
|
@@ -179,7 +179,7 @@ async function rollbackPatches(results, engineDir) {
|
|
|
179
179
|
async function validatePatchTargets(patch, affectedFiles, engineDir) {
|
|
180
180
|
// realpath the engine root once so containment is checked against the
|
|
181
181
|
// physical tree (the root itself may sit behind a symlink, e.g. /tmp on
|
|
182
|
-
// macOS). An unresolvable engine dir skips the symlink checks
|
|
182
|
+
// macOS). An unresolvable engine dir skips the symlink checks. A missing
|
|
183
183
|
// engine surfaces through `git apply --check` with a better message.
|
|
184
184
|
const engineRoot = engineDir ? await realpath(engineDir).catch(() => null) : null;
|
|
185
185
|
for (const file of affectedFiles) {
|
|
@@ -206,7 +206,7 @@ async function validatePatchTargets(patch, affectedFiles, engineDir) {
|
|
|
206
206
|
* - Dangling symlink: `realpath` rejects it, but a write through the link
|
|
207
207
|
* would still be created at the link target, so the target is resolved
|
|
208
208
|
* against the link's (real) parent directory. The link target is taken
|
|
209
|
-
* textually
|
|
209
|
+
* textually. A loop or nested dangling link fails at apply time anyway.
|
|
210
210
|
* - Not-yet-existing file: resolved against the nearest existing ancestor's
|
|
211
211
|
* real path. Components below that ancestor do not exist, so they cannot
|
|
212
212
|
* be symlinks and are appended verbatim.
|
|
@@ -240,14 +240,14 @@ async function resolvePatchWriteDestination(targetPath) {
|
|
|
240
240
|
* The identifier is one of three shapes and the three shapes must stay
|
|
241
241
|
* disjoint so the operator can reason about which patch they picked:
|
|
242
242
|
*
|
|
243
|
-
* 1.
|
|
244
|
-
* 2.
|
|
245
|
-
* 3.
|
|
243
|
+
* 1. Exact filename, `005-foo.patch`. Matches only that filename.
|
|
244
|
+
* 2. Filename without extension, `005-foo`. Matches `005-foo.patch`.
|
|
245
|
+
* 3. Bare numeric ordinal, `5` or `005`. Matches the patch whose
|
|
246
246
|
* order prefix parses to the same integer (so `5` and `005` both match
|
|
247
247
|
* `005-foo.patch`, and `05` matches too because parseInt normalizes
|
|
248
248
|
* leading zeros).
|
|
249
249
|
*
|
|
250
|
-
* A purely-numeric identifier is treated
|
|
250
|
+
* A purely-numeric identifier is treated only as an ordinal: it does not
|
|
251
251
|
* also match a filename that happens to literally equal the digits. That
|
|
252
252
|
* would require a patch literally named `5` or `005`, which would collide
|
|
253
253
|
* with the filename prefix anyway.
|
|
@@ -280,9 +280,9 @@ export async function applyPatchesWithContinue(patchesDir, engineDir, options =
|
|
|
280
280
|
const patches = await discoverPatches(patchesDir);
|
|
281
281
|
// Resolve the --until stop index up front so callers get an immediate
|
|
282
282
|
// error on an unknown identifier instead of a silent no-op. Detect
|
|
283
|
-
// ambiguity (two patches matching the same needle
|
|
284
|
-
// in a well-formed manifest but surfaces queue corruption
|
|
285
|
-
// instead of silently picking the first match
|
|
283
|
+
// ambiguity (two patches matching the same needle). That should never
|
|
284
|
+
// happen in a well-formed manifest, but it surfaces queue corruption
|
|
285
|
+
// loudly instead of silently picking the first match.
|
|
286
286
|
let stopIndex = patches.length - 1;
|
|
287
287
|
if (untilFilename !== undefined) {
|
|
288
288
|
const matchingIndexes = [];
|
|
@@ -314,8 +314,8 @@ export async function applyPatchesWithContinue(patchesDir, engineDir, options =
|
|
|
314
314
|
if (!patch)
|
|
315
315
|
continue;
|
|
316
316
|
if (i > stopIndex) {
|
|
317
|
-
// Patches beyond the --until cutoff are
|
|
318
|
-
// are not failures
|
|
317
|
+
// Patches beyond the --until cutoff are skipped on purpose. They
|
|
318
|
+
// are not failures. Record them in `skipped` so the summary still
|
|
319
319
|
// reflects what the full queue contained.
|
|
320
320
|
skipped.push(patch);
|
|
321
321
|
continue;
|
|
@@ -358,11 +358,11 @@ export async function applyPatchesWithContinue(patchesDir, engineDir, options =
|
|
|
358
358
|
}
|
|
359
359
|
/**
|
|
360
360
|
* Builds a batched patched-content context that loads the manifest and
|
|
361
|
-
* discovers patch files
|
|
361
|
+
* discovers patch files once for many lookups, and memoizes each patch body
|
|
362
362
|
* read across the batch. A per-call helper re-runs `loadPatchesManifest` +
|
|
363
|
-
* `discoverPatches` and re-reads every affecting patch body for every file
|
|
364
|
-
* O(dirtyFiles × patches) redundant IO when classifying a broad
|
|
365
|
-
* session during `status` or `import`.
|
|
363
|
+
* `discoverPatches` and re-reads every affecting patch body for every file,
|
|
364
|
+
* which is O(dirtyFiles × patches) redundant IO when classifying a broad
|
|
365
|
+
* engine edit session during `status` or `import`.
|
|
366
366
|
*/
|
|
367
367
|
export async function createPatchedContentContext(patchesDir, engineDir) {
|
|
368
368
|
const manifest = await loadPatchesManifest(patchesDir);
|
|
@@ -18,7 +18,7 @@ export interface UpdatePatchAndMetadataOptions {
|
|
|
18
18
|
patchesDir: string;
|
|
19
19
|
/** Patch file to rewrite. */
|
|
20
20
|
filename: string;
|
|
21
|
-
/** New patch body
|
|
21
|
+
/** New patch body. An identical body skips the write. */
|
|
22
22
|
newContent: string;
|
|
23
23
|
/** Manifest-row fields to merge into the patch's metadata. */
|
|
24
24
|
updates: Partial<PatchMetadata>;
|
|
@@ -36,11 +36,11 @@ export interface UpdatePatchAndMetadataOptions {
|
|
|
36
36
|
*
|
|
37
37
|
* The body write is skipped when the normalized new content is byte-identical
|
|
38
38
|
* to what is already on disk. A bulk `re-export --all` refreshes every patch
|
|
39
|
-
* in the queue, including ones the working tree never touched
|
|
39
|
+
* in the queue, including ones the working tree never touched. Rewriting an
|
|
40
40
|
* unchanged body churns its mtime and reports "Re-exported" for a patch
|
|
41
41
|
* nothing happened to, which is exactly the noise that hides a real
|
|
42
|
-
* unexpected rewrite in `git status`. Metadata still moves either way
|
|
43
|
-
* the redundant byte-for-byte write is elided.
|
|
42
|
+
* unexpected rewrite in `git status`. Metadata still moves either way, and
|
|
43
|
+
* only the redundant byte-for-byte write is elided.
|
|
44
44
|
*
|
|
45
45
|
* @param options - See {@link UpdatePatchAndMetadataOptions}
|
|
46
46
|
* @returns True when the patch body on disk changed, false when it was
|
|
@@ -14,11 +14,11 @@ import { buildProjectedManifest, enforcePatchPolicy } from './patch-policy.js';
|
|
|
14
14
|
*
|
|
15
15
|
* The body write is skipped when the normalized new content is byte-identical
|
|
16
16
|
* to what is already on disk. A bulk `re-export --all` refreshes every patch
|
|
17
|
-
* in the queue, including ones the working tree never touched
|
|
17
|
+
* in the queue, including ones the working tree never touched. Rewriting an
|
|
18
18
|
* unchanged body churns its mtime and reports "Re-exported" for a patch
|
|
19
19
|
* nothing happened to, which is exactly the noise that hides a real
|
|
20
|
-
* unexpected rewrite in `git status`. Metadata still moves either way
|
|
21
|
-
* the redundant byte-for-byte write is elided.
|
|
20
|
+
* unexpected rewrite in `git status`. Metadata still moves either way, and
|
|
21
|
+
* only the redundant byte-for-byte write is elided.
|
|
22
22
|
*
|
|
23
23
|
* @param options - See {@link UpdatePatchAndMetadataOptions}
|
|
24
24
|
* @returns True when the patch body on disk changed, false when it was
|
|
@@ -7,7 +7,7 @@ export { mutatePatchMetadata, updatePatchMetadata } from './patch-export-metadat
|
|
|
7
7
|
export { updatePatchAndMetadata } from './patch-export-update.js';
|
|
8
8
|
/**
|
|
9
9
|
* Projects the planning subset out of a wider export input (commit input,
|
|
10
|
-
* dry-run preview input)
|
|
10
|
+
* dry-run preview input): the fields `planExport` /
|
|
11
11
|
* `computeExportPlanUnderLock` read. Optional fields are copied only when
|
|
12
12
|
* present so the plan input never carries explicit `undefined` keys, which
|
|
13
13
|
* would otherwise leak into the written metadata via spread. The commit
|
|
@@ -33,7 +33,7 @@ export declare function getNextPatchNumber(patchesDir: string): Promise<string>;
|
|
|
33
33
|
export declare function sanitizeName(name: string): string;
|
|
34
34
|
/**
|
|
35
35
|
* Strips a leading `NNN-<category>-` prefix from a sanitized name slug.
|
|
36
|
-
* Operators frequently pass the
|
|
36
|
+
* Operators frequently pass the desired filename stem to `--name`
|
|
37
37
|
* (`--name 203-ui-foo --category ui`), which would otherwise double-prefix
|
|
38
38
|
* into `203-ui-203-ui-foo.patch`. The filename builders prepend the order
|
|
39
39
|
* and category themselves, so a matching prefix in the name is always
|
|
@@ -45,7 +45,7 @@ export declare function stripRedundantCategoryPrefix(sanitizedName: string, cate
|
|
|
45
45
|
* Sanitizes a patch name and drops redundant category/full-stem prefixes.
|
|
46
46
|
*
|
|
47
47
|
* A single trailing `.patch` extension is stripped before sanitisation:
|
|
48
|
-
* operators frequently pass a full patch
|
|
48
|
+
* operators frequently pass a full patch filename where a name is expected
|
|
49
49
|
* (`move-files <from> 348-ui-foo.patch --create`, `rename --to foo.patch`),
|
|
50
50
|
* and slugging the extension produces double-suffixed `...-patch.patch`
|
|
51
51
|
* files. A name that deliberately ends in a literal `-patch` slug segment
|
|
@@ -115,7 +115,7 @@ export declare function updatePatch(patchPath: string, newContent: string): Prom
|
|
|
115
115
|
* Dry-run and the real write both go through {@link computeExportPlanUnderLock}
|
|
116
116
|
* so their filename allocation, supersede detection, and projected
|
|
117
117
|
* post-write manifest cannot drift. `planExport` exposes the rich coverage
|
|
118
|
-
* form for preview rendering
|
|
118
|
+
* form for preview rendering. {@link commitExportedPatch} consumes the bare
|
|
119
119
|
* `PatchInfo[]` form of the same underlying data.
|
|
120
120
|
*/
|
|
121
121
|
export interface ExportPlan {
|
|
@@ -145,13 +145,13 @@ export interface PlanExportInput {
|
|
|
145
145
|
/**
|
|
146
146
|
* Optional `PatchMetadata.tier` opt-in carried from the CLI flag.
|
|
147
147
|
* Only `"branding"` is currently recognised. When provided the field
|
|
148
|
-
* is written into the new patch's metadata
|
|
148
|
+
* is written into the new patch's metadata. When absent the field
|
|
149
149
|
* stays unset and tier resolution falls back to auto-detection.
|
|
150
150
|
*/
|
|
151
151
|
tier?: 'branding';
|
|
152
152
|
/**
|
|
153
153
|
* Optional `PatchMetadata.lintIgnore` carried from the CLI flag.
|
|
154
|
-
* Empty arrays are treated as "field absent"
|
|
154
|
+
* Empty arrays are treated as "field absent": the validator only
|
|
155
155
|
* preserves the field when it has at least one entry.
|
|
156
156
|
*/
|
|
157
157
|
lintIgnore?: string[];
|
|
@@ -159,16 +159,16 @@ export interface PlanExportInput {
|
|
|
159
159
|
config?: FireForgeConfig;
|
|
160
160
|
}
|
|
161
161
|
/**
|
|
162
|
-
* Read-only planning function
|
|
162
|
+
* Read-only planning function. Computes everything a real export would
|
|
163
163
|
* do without writing anything to disk. Takes the patch directory lock
|
|
164
164
|
* briefly, runs {@link computeExportPlanUnderLock}, releases the lock,
|
|
165
165
|
* and returns the plan for preview rendering.
|
|
166
166
|
*
|
|
167
167
|
* Shares {@link computeExportPlanUnderLock} with {@link commitExportedPatch}
|
|
168
168
|
* so the dry-run preview cannot drift from the real write. The real write
|
|
169
|
-
* path does
|
|
170
|
-
* between dry-run and commit, which would stale the filename allocation)
|
|
171
|
-
*
|
|
169
|
+
* path does not reuse a prior plan object (another export may have landed
|
|
170
|
+
* between dry-run and commit, which would stale the filename allocation).
|
|
171
|
+
* It re-runs the same helper under a fresh lock. The guarantee is "same
|
|
172
172
|
* code, possibly different data," not "same plan object."
|
|
173
173
|
*/
|
|
174
174
|
export declare function planExport(input: PlanExportInput): Promise<ExportPlan>;
|
|
@@ -14,7 +14,7 @@ export { mutatePatchMetadata, updatePatchMetadata } from './patch-export-metadat
|
|
|
14
14
|
export { updatePatchAndMetadata } from './patch-export-update.js';
|
|
15
15
|
/**
|
|
16
16
|
* Projects the planning subset out of a wider export input (commit input,
|
|
17
|
-
* dry-run preview input)
|
|
17
|
+
* dry-run preview input): the fields `planExport` /
|
|
18
18
|
* `computeExportPlanUnderLock` read. Optional fields are copied only when
|
|
19
19
|
* present so the plan input never carries explicit `undefined` keys, which
|
|
20
20
|
* would otherwise leak into the written metadata via spread. The commit
|
|
@@ -71,7 +71,7 @@ export function sanitizeName(name) {
|
|
|
71
71
|
}
|
|
72
72
|
/**
|
|
73
73
|
* Strips a leading `NNN-<category>-` prefix from a sanitized name slug.
|
|
74
|
-
* Operators frequently pass the
|
|
74
|
+
* Operators frequently pass the desired filename stem to `--name`
|
|
75
75
|
* (`--name 203-ui-foo --category ui`), which would otherwise double-prefix
|
|
76
76
|
* into `203-ui-203-ui-foo.patch`. The filename builders prepend the order
|
|
77
77
|
* and category themselves, so a matching prefix in the name is always
|
|
@@ -100,7 +100,7 @@ export function stripRedundantCategoryPrefix(sanitizedName, category) {
|
|
|
100
100
|
* Sanitizes a patch name and drops redundant category/full-stem prefixes.
|
|
101
101
|
*
|
|
102
102
|
* A single trailing `.patch` extension is stripped before sanitisation:
|
|
103
|
-
* operators frequently pass a full patch
|
|
103
|
+
* operators frequently pass a full patch filename where a name is expected
|
|
104
104
|
* (`move-files <from> 348-ui-foo.patch --create`, `rename --to foo.patch`),
|
|
105
105
|
* and slugging the extension produces double-suffixed `...-patch.patch`
|
|
106
106
|
* files. A name that deliberately ends in a literal `-patch` slug segment
|
|
@@ -153,7 +153,7 @@ export async function commitExportedPatch(input) {
|
|
|
153
153
|
// Patch bodies are written byte-for-byte as git produced them, including the
|
|
154
154
|
// single-space rendering of a blank context line.
|
|
155
155
|
//
|
|
156
|
-
// Do
|
|
156
|
+
// Do not add a whitespace-trimming pass here or at any other write site.
|
|
157
157
|
// Stripping marker lines whose payload is pure whitespace (`/^[ +-]\s+$/` →
|
|
158
158
|
// bare marker) corrupts real content: Firefox sources contain whitespace-only
|
|
159
159
|
// lines, so a ` `/`-` line whose payload was two spaces no longer matches the
|
|
@@ -220,16 +220,16 @@ export async function updatePatch(patchPath, newContent) {
|
|
|
220
220
|
await writeText(patchPath, newContent);
|
|
221
221
|
}
|
|
222
222
|
/**
|
|
223
|
-
* Internal planning helper.
|
|
224
|
-
* caller must already hold it
|
|
223
|
+
* Internal planning helper. It does not take the patch directory lock (the
|
|
224
|
+
* caller must already hold it), because the two public entry points
|
|
225
225
|
* ({@link planExport} and {@link commitExportedPatch}) each take their own
|
|
226
226
|
* lock for the full operation. Sharing this single pure computation is how
|
|
227
|
-
* dry-run previews and real writes stay in lockstep
|
|
228
|
-
*
|
|
227
|
+
* dry-run previews and real writes stay in lockstep, instead of relying on
|
|
228
|
+
* parallel implementations that can drift.
|
|
229
229
|
*/
|
|
230
230
|
async function computeExportPlanUnderLock(input) {
|
|
231
231
|
// ForWrite: a corrupt manifest read as null here would produce a
|
|
232
|
-
// manifestAfter containing
|
|
232
|
+
// manifestAfter containing only the new patch. Committing that plan
|
|
233
233
|
// wipes the queue metadata, and the rollback path would then delete
|
|
234
234
|
// patches.json entirely because manifestBefore looked absent.
|
|
235
235
|
const manifestBefore = await loadPatchesManifestForWrite(input.patchesDir);
|
|
@@ -280,16 +280,16 @@ async function computeExportPlanUnderLock(input) {
|
|
|
280
280
|
};
|
|
281
281
|
}
|
|
282
282
|
/**
|
|
283
|
-
* Read-only planning function
|
|
283
|
+
* Read-only planning function. Computes everything a real export would
|
|
284
284
|
* do without writing anything to disk. Takes the patch directory lock
|
|
285
285
|
* briefly, runs {@link computeExportPlanUnderLock}, releases the lock,
|
|
286
286
|
* and returns the plan for preview rendering.
|
|
287
287
|
*
|
|
288
288
|
* Shares {@link computeExportPlanUnderLock} with {@link commitExportedPatch}
|
|
289
289
|
* so the dry-run preview cannot drift from the real write. The real write
|
|
290
|
-
* path does
|
|
291
|
-
* between dry-run and commit, which would stale the filename allocation)
|
|
292
|
-
*
|
|
290
|
+
* path does not reuse a prior plan object (another export may have landed
|
|
291
|
+
* between dry-run and commit, which would stale the filename allocation).
|
|
292
|
+
* It re-runs the same helper under a fresh lock. The guarantee is "same
|
|
293
293
|
* code, possibly different data," not "same plan object."
|
|
294
294
|
*/
|
|
295
295
|
export async function planExport(input) {
|
|
@@ -15,6 +15,6 @@ import type { PatchMetadata } from '../types/commands/index.js';
|
|
|
15
15
|
* Formats the user-facing "patch not found" error message used by
|
|
16
16
|
* `patch delete`, `patch reorder`, `patch tier`, and
|
|
17
17
|
* `patch lint-ignore`. Returns a single string suitable for the
|
|
18
|
-
* `InvalidArgumentError` body
|
|
18
|
+
* `InvalidArgumentError` body, never the full queue enumeration.
|
|
19
19
|
*/
|
|
20
20
|
export declare function formatPatchNotFoundError(identifier: string, patches: readonly PatchMetadata[]): string;
|
|
@@ -22,7 +22,7 @@ const MIN_PREFIX_MATCH_LENGTH = 4;
|
|
|
22
22
|
const SUGGESTION_LIMIT = 3;
|
|
23
23
|
/**
|
|
24
24
|
* Computes the Levenshtein edit distance between two strings. Used by
|
|
25
|
-
* `formatPatchNotFoundError` to rank candidate identifiers
|
|
25
|
+
* `formatPatchNotFoundError` to rank candidate identifiers. The small
|
|
26
26
|
* upper bound on input lengths (filenames, ordinals, names) makes the
|
|
27
27
|
* O(m*n) implementation trivially fast.
|
|
28
28
|
*/
|
|
@@ -87,13 +87,13 @@ function rankSuggestions(identifier, candidates) {
|
|
|
87
87
|
return candidates
|
|
88
88
|
.map((candidate) => {
|
|
89
89
|
const lower = candidate.toLowerCase();
|
|
90
|
-
// Prefix relation in
|
|
90
|
+
// Prefix relation in either direction is a stronger signal than edit
|
|
91
91
|
// distance and is not bounded by it: a partial ordinal or an
|
|
92
92
|
// abbreviated slug ("ui-foo" for "002-ui-foo.patch") is many edits away
|
|
93
93
|
// from the full identifier yet is obviously the intended target.
|
|
94
94
|
// `lower.startsWith(needle)`: the operator typed an abbreviation of a
|
|
95
95
|
// real identifier. The reverse relation is only meaningful when the
|
|
96
|
-
// candidate is substantial
|
|
96
|
+
// candidate is substantial. Otherwise the single-character ordinal
|
|
97
97
|
// "9" would "match" every input starting with a 9.
|
|
98
98
|
const prefixMatch = needle.length >= MIN_PREFIX_MATCH_LENGTH &&
|
|
99
99
|
(lower.startsWith(needle) ||
|
|
@@ -115,7 +115,7 @@ function rankSuggestions(identifier, candidates) {
|
|
|
115
115
|
* Formats the user-facing "patch not found" error message used by
|
|
116
116
|
* `patch delete`, `patch reorder`, `patch tier`, and
|
|
117
117
|
* `patch lint-ignore`. Returns a single string suitable for the
|
|
118
|
-
* `InvalidArgumentError` body
|
|
118
|
+
* `InvalidArgumentError` body, never the full queue enumeration.
|
|
119
119
|
*/
|
|
120
120
|
export function formatPatchNotFoundError(identifier, patches) {
|
|
121
121
|
const accepted = collectAcceptedIdentifiers(patches);
|