@hominis/fireforge 0.45.0 → 0.46.1
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 +409 -446
- package/dist/bin/fireforge.d.ts +1 -1
- package/dist/bin/fireforge.js +21 -15
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +46 -0
- package/dist/src/cli-usage-error.js +81 -0
- package/dist/src/cli.d.ts +7 -2
- package/dist/src/cli.js +47 -47
- package/dist/src/commands/bootstrap-checks.js +2 -1
- package/dist/src/commands/bootstrap.js +3 -4
- package/dist/src/commands/build.js +27 -17
- package/dist/src/commands/config.js +9 -9
- package/dist/src/commands/destructive-decision.d.ts +19 -0
- package/dist/src/commands/destructive-decision.js +31 -0
- package/dist/src/commands/discard.js +5 -5
- package/dist/src/commands/doctor-check-core.d.ts +4 -10
- package/dist/src/commands/doctor-check-core.js +0 -8
- 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 -17
- package/dist/src/commands/doctor-orphaned-harness.js +14 -23
- 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 +3 -3
- 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 +3 -1
- package/dist/src/commands/doctor.js +15 -16
- package/dist/src/commands/download.js +50 -37
- package/dist/src/commands/export-all.js +29 -12
- package/dist/src/commands/export-flow.d.ts +5 -5
- package/dist/src/commands/export-flow.js +29 -59
- package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
- package/dist/src/commands/export-placement-conflicts.js +12 -12
- package/dist/src/commands/export-placement-gate.d.ts +2 -2
- package/dist/src/commands/export-placement-gate.js +7 -13
- package/dist/src/commands/export-placement-policy.d.ts +1 -1
- package/dist/src/commands/export-placement-policy.js +4 -6
- package/dist/src/commands/export-shared.d.ts +51 -32
- package/dist/src/commands/export-shared.js +17 -32
- package/dist/src/commands/export.js +14 -5
- package/dist/src/commands/furnace/apply.js +16 -16
- package/dist/src/commands/furnace/authoring-config.d.ts +13 -0
- package/dist/src/commands/furnace/authoring-config.js +19 -0
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +2 -2
- 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 +7 -12
- package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
- package/dist/src/commands/furnace/create-dry-run.js +6 -9
- 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 +31 -15
- package/dist/src/commands/furnace/create-templates.js +20 -19
- 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 +35 -29
- package/dist/src/commands/furnace/deploy.js +15 -6
- 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 +17 -16
- 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 +43 -34
- package/dist/src/commands/furnace/preview.js +17 -17
- package/dist/src/commands/furnace/refresh.js +15 -7
- package/dist/src/commands/furnace/remove-mutations.d.ts +9 -10
- package/dist/src/commands/furnace/remove-mutations.js +19 -19
- 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 +4 -8
- package/dist/src/commands/furnace/rename-browser-test.js +10 -15
- 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 +36 -36
- package/dist/src/commands/furnace/scan.js +3 -3
- package/dist/src/commands/furnace/status.js +19 -16
- package/dist/src/commands/furnace/sync.js +6 -6
- package/dist/src/commands/furnace/test-file-name.d.ts +28 -0
- package/dist/src/commands/furnace/test-file-name.js +39 -0
- package/dist/src/commands/furnace/validate.js +11 -12
- package/dist/src/commands/furnace/validation-output.d.ts +21 -9
- package/dist/src/commands/furnace/validation-output.js +3 -8
- package/dist/src/commands/import.js +22 -29
- package/dist/src/commands/lint-per-patch.d.ts +2 -2
- package/dist/src/commands/lint-per-patch.js +27 -12
- package/dist/src/commands/lint-per-run-checkjs.d.ts +14 -15
- 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 +5 -4
- package/dist/src/commands/lint.js +36 -36
- package/dist/src/commands/manifest.d.ts +4 -4
- package/dist/src/commands/manifest.js +1 -1
- package/dist/src/commands/package.js +4 -6
- package/dist/src/commands/patch/compact.d.ts +2 -2
- package/dist/src/commands/patch/compact.js +19 -20
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +23 -33
- package/dist/src/commands/patch/entry-projection.d.ts +13 -0
- package/dist/src/commands/patch/entry-projection.js +24 -0
- package/dist/src/commands/patch/lint-ignore.d.ts +3 -12
- package/dist/src/commands/patch/lint-ignore.js +33 -44
- package/dist/src/commands/patch/move-files-create.d.ts +2 -2
- package/dist/src/commands/patch/move-files-create.js +29 -15
- package/dist/src/commands/patch/move-files-into.d.ts +2 -2
- package/dist/src/commands/patch/move-files-into.js +41 -37
- package/dist/src/commands/patch/move-files.js +5 -14
- 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 +35 -49
- package/dist/src/commands/patch/reorder.js +35 -48
- package/dist/src/commands/patch/split-plan.d.ts +7 -8
- package/dist/src/commands/patch/split-plan.js +10 -13
- package/dist/src/commands/patch/split.d.ts +2 -2
- package/dist/src/commands/patch/split.js +50 -48
- 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 +22 -28
- package/dist/src/commands/patch/tier.d.ts +2 -2
- package/dist/src/commands/patch/tier.js +20 -30
- package/dist/src/commands/patch-rename-map.d.ts +19 -0
- package/dist/src/commands/patch-rename-map.js +36 -0
- package/dist/src/commands/pending-resolution.d.ts +15 -0
- package/dist/src/commands/pending-resolution.js +25 -0
- package/dist/src/commands/re-export-adjacent.d.ts +25 -3
- package/dist/src/commands/re-export-adjacent.js +40 -24
- package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
- package/dist/src/commands/re-export-bulk-scan.js +23 -27
- package/dist/src/commands/re-export-drift.d.ts +10 -10
- package/dist/src/commands/re-export-drift.js +33 -33
- package/dist/src/commands/re-export-files.d.ts +2 -3
- package/dist/src/commands/re-export-files.js +52 -44
- package/dist/src/commands/re-export-lint.d.ts +29 -30
- package/dist/src/commands/re-export-lint.js +36 -29
- 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 +12 -9
- package/dist/src/commands/re-export-single.d.ts +23 -4
- package/dist/src/commands/re-export-single.js +39 -31
- package/dist/src/commands/re-export.js +35 -17
- package/dist/src/commands/rebase/abort.js +9 -14
- package/dist/src/commands/rebase/continue.js +20 -19
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +5 -5
- package/dist/src/commands/rebase/patch-loop.d.ts +2 -2
- package/dist/src/commands/rebase/patch-loop.js +20 -24
- 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 +21 -13
- package/dist/src/commands/run.d.ts +0 -13
- package/dist/src/commands/run.js +38 -51
- package/dist/src/commands/setup-support.d.ts +16 -4
- package/dist/src/commands/setup-support.js +20 -20
- package/dist/src/commands/setup.js +4 -10
- package/dist/src/commands/source.js +9 -2
- package/dist/src/commands/status-check.d.ts +3 -3
- package/dist/src/commands/status-check.js +6 -6
- 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 +5 -5
- 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 +25 -26
- package/dist/src/commands/test-build-phase.d.ts +3 -3
- package/dist/src/commands/test-build-phase.js +48 -24
- 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 +4 -4
- package/dist/src/commands/test-modes.js +4 -5
- package/dist/src/commands/test-register.js +5 -3
- package/dist/src/commands/test-run.d.ts +11 -11
- package/dist/src/commands/test-run.js +40 -33
- package/dist/src/commands/test-stale-gate.d.ts +12 -12
- package/dist/src/commands/test-stale-gate.js +17 -17
- package/dist/src/commands/test-verdict.d.ts +19 -5
- package/dist/src/commands/test-verdict.js +26 -11
- package/dist/src/commands/test.d.ts +3 -3
- package/dist/src/commands/test.js +73 -36
- package/dist/src/commands/token-coverage.js +3 -3
- package/dist/src/commands/token-list.d.ts +26 -0
- package/dist/src/commands/token-list.js +153 -0
- package/dist/src/commands/token.js +26 -10
- package/dist/src/commands/tree.js +26 -21
- package/dist/src/commands/typecheck.d.ts +6 -6
- package/dist/src/commands/typecheck.js +16 -16
- 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 +17 -16
- 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 -12
- package/dist/src/core/branding.js +6 -5
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +10 -7
- package/dist/src/core/build-audit-platform.d.ts +32 -3
- package/dist/src/core/build-audit-platform.js +153 -13
- package/dist/src/core/build-audit-registration.d.ts +5 -5
- package/dist/src/core/build-audit-registration.js +10 -9
- 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 +57 -0
- package/dist/src/core/build-audit-skip.js +112 -0
- 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 +21 -8
- package/dist/src/core/build-audit.js +142 -40
- 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 +48 -31
- package/dist/src/core/build-baseline.js +20 -43
- package/dist/src/core/build-jar-escalation.d.ts +8 -8
- package/dist/src/core/build-jar-escalation.js +18 -17
- package/dist/src/core/build-overwrite-guard.d.ts +4 -4
- package/dist/src/core/build-overwrite-guard.js +14 -14
- package/dist/src/core/build-prepare.d.ts +4 -12
- package/dist/src/core/build-prepare.js +22 -26
- package/dist/src/core/config-mutate.js +4 -4
- package/dist/src/core/config-paths.d.ts +2 -6
- package/dist/src/core/config-paths.js +4 -2
- package/dist/src/core/config-state.d.ts +0 -6
- package/dist/src/core/config-state.js +3 -21
- package/dist/src/core/config-validate-build-audit.d.ts +8 -0
- package/dist/src/core/config-validate-build-audit.js +80 -0
- package/dist/src/core/config-validate-file-size.d.ts +1 -1
- package/dist/src/core/config-validate-file-size.js +3 -3
- package/dist/src/core/config-validate-patch-policy.d.ts +2 -2
- package/dist/src/core/config-validate-patch-policy.js +3 -3
- package/dist/src/core/config-validate-test-toolchains.d.ts +2 -2
- package/dist/src/core/config-validate-test-toolchains.js +4 -5
- package/dist/src/core/config-validate.js +22 -12
- package/dist/src/core/config.d.ts +12 -12
- package/dist/src/core/config.js +21 -25
- package/dist/src/core/coverage-extend.d.ts +16 -16
- package/dist/src/core/coverage-extend.js +20 -20
- 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 +22 -23
- 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 +5 -13
- package/dist/src/core/engine-precondition.js +5 -10
- package/dist/src/core/engine-session-lock.d.ts +18 -18
- package/dist/src/core/engine-session-lock.js +50 -54
- package/dist/src/core/export-moved-code-shape.d.ts +7 -7
- package/dist/src/core/export-moved-code-shape.js +10 -10
- package/dist/src/core/file-lock-owner.d.ts +103 -0
- package/dist/src/core/file-lock-owner.js +259 -0
- package/dist/src/core/file-lock.d.ts +14 -19
- package/dist/src/core/file-lock.js +90 -128
- package/dist/src/core/firefox-cache.d.ts +13 -1
- package/dist/src/core/firefox-cache.js +61 -36
- package/dist/src/core/firefox-download.d.ts +15 -0
- package/dist/src/core/firefox-download.js +38 -22
- package/dist/src/core/firefox-extract.d.ts +8 -7
- package/dist/src/core/firefox-extract.js +45 -27
- package/dist/src/core/firefox.d.ts +34 -36
- package/dist/src/core/firefox.js +13 -44
- package/dist/src/core/furnace-apply-dry-run.d.ts +1 -6
- package/dist/src/core/furnace-apply-dry-run.js +2 -8
- 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 -20
- package/dist/src/core/furnace-apply-helpers.js +28 -39
- 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 +13 -11
- 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 +4 -4
- package/dist/src/core/furnace-apply.js +50 -29
- 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 +5 -5
- package/dist/src/core/furnace-config.js +40 -53
- package/dist/src/core/furnace-constants.d.ts +6 -6
- package/dist/src/core/furnace-constants.js +9 -8
- 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 +20 -0
- package/dist/src/core/furnace-dir-entry.js +21 -0
- 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 +22 -19
- package/dist/src/core/furnace-operation.js +38 -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.d.ts +18 -6
- package/dist/src/core/furnace-refresh.js +5 -8
- package/dist/src/core/furnace-registration-ast.d.ts +2 -3
- package/dist/src/core/furnace-registration-ast.js +9 -12
- 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 +7 -6
- package/dist/src/core/furnace-registration.js +29 -36
- package/dist/src/core/furnace-rollback.d.ts +1 -1
- package/dist/src/core/furnace-rollback.js +5 -5
- package/dist/src/core/furnace-scanner.js +3 -6
- 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 +12 -12
- 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 +18 -20
- 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 +6 -4
- package/dist/src/core/git-base.js +29 -7
- package/dist/src/core/git-diff-new-file.d.ts +40 -0
- package/dist/src/core/git-diff-new-file.js +119 -0
- package/dist/src/core/git-diff.d.ts +13 -13
- package/dist/src/core/git-diff.js +121 -189
- package/dist/src/core/git-file-ops.d.ts +6 -13
- package/dist/src/core/git-file-ops.js +11 -35
- package/dist/src/core/git-readonly-index.d.ts +12 -14
- package/dist/src/core/git-readonly-index.js +12 -16
- package/dist/src/core/git-status.d.ts +9 -2
- package/dist/src/core/git-status.js +23 -11
- package/dist/src/core/git.d.ts +3 -9
- package/dist/src/core/git.js +28 -57
- package/dist/src/core/harness-orphans.d.ts +17 -17
- package/dist/src/core/harness-orphans.js +28 -27
- package/dist/src/core/history-log.d.ts +19 -0
- package/dist/src/core/history-log.js +29 -0
- 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 -10
- package/dist/src/core/mach-error-hints.js +14 -14
- package/dist/src/core/mach-known-noise-filter.d.ts +42 -38
- package/dist/src/core/mach-known-noise-filter.js +57 -56
- package/dist/src/core/mach-mozconfig.d.ts +6 -6
- package/dist/src/core/mach-mozconfig.js +17 -16
- package/dist/src/core/mach-python.d.ts +3 -0
- package/dist/src/core/mach-python.js +13 -7
- package/dist/src/core/mach-resource-shim.d.ts +24 -12
- package/dist/src/core/mach-resource-shim.js +124 -21
- package/dist/src/core/mach.d.ts +59 -73
- package/dist/src/core/mach.js +47 -115
- package/dist/src/core/marionette-port.d.ts +15 -30
- package/dist/src/core/marionette-port.js +46 -89
- package/dist/src/core/marionette-preflight.d.ts +6 -6
- package/dist/src/core/marionette-preflight.js +32 -50
- 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 +17 -17
- 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 +46 -42
- 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 +13 -13
- package/dist/src/core/patch-apply.d.ts +13 -14
- package/dist/src/core/patch-apply.js +36 -42
- package/dist/src/core/patch-export-coverage.d.ts +0 -9
- package/dist/src/core/patch-export-coverage.js +1 -30
- package/dist/src/core/patch-export-update.d.ts +21 -4
- package/dist/src/core/patch-export-update.js +7 -6
- package/dist/src/core/patch-export.d.ts +20 -30
- package/dist/src/core/patch-export.js +55 -77
- package/dist/src/core/patch-files.d.ts +0 -4
- package/dist/src/core/patch-files.js +0 -11
- 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 +12 -18
- package/dist/src/core/patch-lint-cache.d.ts +18 -2
- package/dist/src/core/patch-lint-cache.js +16 -19
- package/dist/src/core/patch-lint-checkjs.d.ts +55 -38
- package/dist/src/core/patch-lint-checkjs.js +78 -64
- 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 +5 -9
- package/dist/src/core/patch-lint-creators.js +3 -3
- package/dist/src/core/patch-lint-cross.d.ts +27 -19
- package/dist/src/core/patch-lint-cross.js +67 -110
- package/dist/src/core/patch-lint-css.d.ts +1 -1
- package/dist/src/core/patch-lint-css.js +15 -11
- 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 +6 -6
- package/dist/src/core/patch-lint-forward-registration.d.ts +58 -0
- package/dist/src/core/patch-lint-forward-registration.js +210 -0
- package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
- package/dist/src/core/patch-lint-jsdoc.js +46 -46
- package/dist/src/core/patch-lint-module-registration.d.ts +3 -9
- 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 +7 -7
- package/dist/src/core/patch-lint-queue-types.d.ts +60 -0
- package/dist/src/core/patch-lint-queue-types.js +12 -0
- package/dist/src/core/patch-lint-staged-registration.d.ts +61 -0
- package/dist/src/core/patch-lint-staged-registration.js +90 -0
- 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 +41 -35
- package/dist/src/core/patch-lint.js +52 -49
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +11 -11
- 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 +35 -34
- 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 +32 -21
- package/dist/src/core/patch-parse.js +40 -15
- package/dist/src/core/patch-policy.js +15 -27
- 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-source-metadata.d.ts +1 -3
- package/dist/src/core/patch-source-metadata.js +0 -4
- package/dist/src/core/patch-transform.d.ts +8 -16
- package/dist/src/core/patch-transform.js +13 -23
- package/dist/src/core/process-cpu-time.d.ts +1 -1
- package/dist/src/core/process-cpu-time.js +6 -6
- package/dist/src/core/rebase-session.d.ts +9 -15
- package/dist/src/core/rebase-session.js +13 -25
- package/dist/src/core/register-browser-content.js +3 -2
- package/dist/src/core/register-browser-test.js +2 -1
- package/dist/src/core/register-module.js +2 -1
- 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 +8 -7
- package/dist/src/core/register-shared-css.d.ts +3 -3
- package/dist/src/core/register-shared-css.js +6 -5
- 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 +38 -0
- package/dist/src/core/run-log-redact.js +69 -0
- package/dist/src/core/run-log.d.ts +21 -10
- package/dist/src/core/run-log.js +76 -27
- 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 +4 -6
- package/dist/src/core/smoke-patterns.d.ts +5 -6
- package/dist/src/core/smoke-patterns.js +15 -20
- package/dist/src/core/state-file.d.ts +15 -4
- package/dist/src/core/state-file.js +14 -1
- 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 +13 -12
- package/dist/src/core/test-changed-prefs.d.ts +12 -12
- package/dist/src/core/test-changed-prefs.js +40 -25
- package/dist/src/core/test-harness-crash.d.ts +39 -39
- package/dist/src/core/test-harness-crash.js +69 -69
- 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 -23
- package/dist/src/core/test-stale-check.js +31 -30
- 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/test-xpcshell-retry.d.ts +26 -7
- package/dist/src/core/test-xpcshell-retry.js +14 -11
- package/dist/src/core/token-category.d.ts +35 -2
- package/dist/src/core/token-category.js +67 -58
- package/dist/src/core/token-coverage.js +4 -5
- package/dist/src/core/token-dark-mode.d.ts +9 -9
- package/dist/src/core/token-dark-mode.js +13 -25
- package/dist/src/core/token-docs.d.ts +1 -1
- package/dist/src/core/token-inventory.d.ts +56 -0
- package/dist/src/core/token-inventory.js +109 -0
- package/dist/src/core/token-manager.d.ts +4 -4
- package/dist/src/core/token-manager.js +22 -22
- 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 +52 -53
- package/dist/src/core/toolchain-preflight.d.ts +15 -15
- package/dist/src/core/toolchain-preflight.js +23 -23
- package/dist/src/core/tree-cow.d.ts +3 -5
- package/dist/src/core/tree-cow.js +8 -8
- 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 +39 -38
- 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 +33 -33
- 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 +12 -23
- 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 +16 -28
- package/dist/src/core/xpcshell-appdir.d.ts +20 -20
- package/dist/src/core/xpcshell-appdir.js +28 -30
- 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 +69 -16
- package/dist/src/errors/base.js +95 -26
- package/dist/src/errors/build.d.ts +6 -6
- package/dist/src/errors/build.js +26 -34
- package/dist/src/errors/codes.d.ts +10 -10
- package/dist/src/errors/codes.js +10 -10
- package/dist/src/errors/config.d.ts +0 -14
- package/dist/src/errors/config.js +13 -34
- package/dist/src/errors/download.d.ts +13 -0
- package/dist/src/errors/download.js +53 -24
- package/dist/src/errors/furnace.d.ts +2 -2
- package/dist/src/errors/furnace.js +8 -9
- package/dist/src/errors/git.d.ts +9 -9
- package/dist/src/errors/git.js +21 -31
- package/dist/src/errors/patch.d.ts +3 -3
- package/dist/src/errors/patch.js +11 -13
- package/dist/src/errors/rebase.d.ts +1 -1
- package/dist/src/errors/rebase.js +8 -8
- 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 +155 -200
- 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 +52 -19
- package/dist/src/types/furnace.d.ts +17 -17
- package/dist/src/types/index.d.ts +0 -1
- 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 +4 -16
- package/dist/src/utils/assert.js +7 -24
- package/dist/src/utils/build-info.d.ts +6 -6
- package/dist/src/utils/build-info.js +6 -6
- package/dist/src/utils/child-env.d.ts +7 -6
- 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 +10 -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 +15 -20
- package/dist/src/utils/hash.d.ts +12 -0
- package/dist/src/utils/hash.js +16 -0
- package/dist/src/utils/line-dispatch.d.ts +15 -0
- package/dist/src/utils/line-dispatch.js +48 -0
- 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 +14 -20
- package/dist/src/utils/options.js +26 -27
- package/dist/src/utils/package-root.js +5 -14
- package/dist/src/utils/paths.d.ts +4 -4
- package/dist/src/utils/paths.js +4 -4
- package/dist/src/utils/platform.d.ts +0 -4
- package/dist/src/utils/process-group.d.ts +10 -9
- package/dist/src/utils/process-group.js +37 -36
- package/dist/src/utils/process.d.ts +70 -55
- package/dist/src/utils/process.js +129 -179
- package/dist/src/utils/ps-duration.d.ts +4 -4
- package/dist/src/utils/ps-duration.js +9 -9
- package/dist/src/utils/regex.d.ts +4 -4
- package/dist/src/utils/regex.js +7 -7
- package/dist/src/utils/sleep.d.ts +26 -0
- package/dist/src/utils/sleep.js +31 -0
- 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 +12 -49
- package/dist/src/utils/validation.js +26 -36
- package/docs/README.md +2 -2
- package/docs/configuration.md +163 -69
- package/docs/exit-codes.md +66 -49
- package/docs/furnace.md +20 -19
- package/docs/lifecycle-invariants.md +414 -247
- package/docs/machine-output.md +58 -34
- package/docs/patch-workflow.md +48 -44
- package/docs/run-logs.md +72 -28
- package/docs/testing.md +105 -98
- package/docs/verification-trees.md +23 -22
- package/package.json +7 -6
- package/dist/src/commands/rebase.d.ts +0 -4
- package/dist/src/commands/rebase.js +0 -5
- package/dist/src/core/patch-artifact-normalize.d.ts +0 -21
- package/dist/src/core/patch-artifact-normalize.js +0 -24
- package/dist/src/core/patch-lint-reexports.d.ts +0 -7
- package/dist/src/core/patch-lint-reexports.js +0 -8
- package/dist/src/core/wire-targets.d.ts +0 -7
- package/dist/src/core/wire-targets.js +0 -8
|
@@ -21,7 +21,7 @@ interface StatusFile {
|
|
|
21
21
|
*
|
|
22
22
|
* Populated from three sources:
|
|
23
23
|
*
|
|
24
|
-
* 1. Every path in every patch's `filesAffected
|
|
24
|
+
* 1. Every path in every patch's `filesAffected`, so managed paths show up
|
|
25
25
|
* even when they are not currently modified on disk.
|
|
26
26
|
* 2. Any worktree status entries not claimed by any patch (flagged as
|
|
27
27
|
* `unmanaged`).
|
|
@@ -36,17 +36,17 @@ interface StatusFile {
|
|
|
36
36
|
* `conflictReason` so the output can disambiguate.
|
|
37
37
|
*
|
|
38
38
|
* @param manifestPatches - Manifest rows, each with its `filesAffected`
|
|
39
|
-
* @param worktreeFiles - Raw worktree status entries
|
|
39
|
+
* @param worktreeFiles - Raw worktree status entries. Untracked and modified
|
|
40
40
|
* both acceptable
|
|
41
41
|
* @param newFileCreatorsByPath - Map produced by
|
|
42
|
-
* {@link import('../core/patch-lint.js').collectNewFileCreatorsByPath}
|
|
43
|
-
*
|
|
42
|
+
* {@link import('../core/patch-lint.js').collectNewFileCreatorsByPath}.
|
|
43
|
+
* Paths with a `.length > 1` owner list become duplicate-create conflicts
|
|
44
44
|
*/
|
|
45
45
|
export declare function buildOwnershipTable(manifestPatches: PatchMetadata[], worktreeFiles: StatusFile[], newFileCreatorsByPath: Map<string, string[]>, classifications?: Map<string, FileClassification>): OwnershipRow[];
|
|
46
46
|
/**
|
|
47
47
|
* Renders the ownership table as a GitHub-flavored Markdown pipe table.
|
|
48
48
|
* Using markdown-table's own serializer would require a seed document to
|
|
49
|
-
* graft onto, which is overkill for ad-hoc status output
|
|
49
|
+
* graft onto, which is overkill for ad-hoc status output. The rendering
|
|
50
50
|
* here is trivial enough to inline.
|
|
51
51
|
*/
|
|
52
52
|
export declare function renderOwnershipTable(rows: OwnershipRow[]): void;
|
|
@@ -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,19 +36,19 @@ 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) {
|
|
44
44
|
if (!Number.isInteger(maxFuzz) || maxFuzz < 0) {
|
|
45
|
-
throw new InvalidArgumentError(`maxFuzz must be a non-negative integer, got ${
|
|
45
|
+
throw new InvalidArgumentError(`maxFuzz must be a non-negative integer, got ${maxFuzz}.`, 'maxFuzz');
|
|
46
46
|
}
|
|
47
47
|
await ensureGit();
|
|
48
48
|
// Try exact match first, then escalate context reduction.
|
|
49
49
|
const maxSteps = Math.min(maxFuzz, GIT_DEFAULT_CONTEXT);
|
|
50
50
|
for (let step = 0; step <= maxSteps; step++) {
|
|
51
|
-
const contextArgs = step > 0 ? [`-C${
|
|
51
|
+
const contextArgs = step > 0 ? [`-C${GIT_DEFAULT_CONTEXT - step}`] : [];
|
|
52
52
|
const check = await exec('git', ['apply', '--check', ...contextArgs, '--', patchPath], {
|
|
53
53
|
cwd: engineDir,
|
|
54
54
|
});
|
|
@@ -59,12 +59,12 @@ export async function applyPatchWithFuzz(patchPath, engineDir, maxFuzz = 3) {
|
|
|
59
59
|
});
|
|
60
60
|
if (apply.exitCode === 0) {
|
|
61
61
|
if (step > 0) {
|
|
62
|
-
verbose(`Patch applied with reduced context (-C${
|
|
62
|
+
verbose(`Patch applied with reduced context (-C${GIT_DEFAULT_CONTEXT - step}): ${patchPath}`);
|
|
63
63
|
}
|
|
64
64
|
return { success: true, fuzzFactor: step };
|
|
65
65
|
}
|
|
66
|
-
// Unlikely: --check passed but apply failed
|
|
67
|
-
verbose(`git apply -C${
|
|
66
|
+
// Unlikely: --check passed but apply failed. Fall through to next step
|
|
67
|
+
verbose(`git apply -C${GIT_DEFAULT_CONTEXT - step} --check passed but apply failed: ${apply.stderr.trim()}`);
|
|
68
68
|
}
|
|
69
69
|
}
|
|
70
70
|
// All context-reduction levels failed → generate .rej files for manual resolution
|
|
@@ -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,13 +1,12 @@
|
|
|
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';
|
|
6
6
|
export { PatchError } from '../errors/patch.js';
|
|
7
|
-
export { countPatches, discoverPatches
|
|
7
|
+
export { countPatches, discoverPatches } from './patch-files.js';
|
|
8
8
|
export { withPatchDirectoryLock } from './patch-lock.js';
|
|
9
|
-
export { extractAffectedFiles
|
|
10
|
-
export { applyPatchToContent, extractNewFileContent } from './patch-transform.js';
|
|
9
|
+
export { extractAffectedFiles } from './patch-parse.js';
|
|
11
10
|
/**
|
|
12
11
|
* Options for {@link applyPatchesWithContinue}.
|
|
13
12
|
*/
|
|
@@ -28,14 +27,14 @@ export interface ApplyPatchesOptions {
|
|
|
28
27
|
* The identifier is one of three shapes and the three shapes must stay
|
|
29
28
|
* disjoint so the operator can reason about which patch they picked:
|
|
30
29
|
*
|
|
31
|
-
* 1.
|
|
32
|
-
* 2.
|
|
33
|
-
* 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
|
|
34
33
|
* order prefix parses to the same integer (so `5` and `005` both match
|
|
35
34
|
* `005-foo.patch`, and `05` matches too because parseInt normalizes
|
|
36
35
|
* leading zeros).
|
|
37
36
|
*
|
|
38
|
-
* A purely-numeric identifier is treated
|
|
37
|
+
* A purely-numeric identifier is treated only as an ordinal: it does not
|
|
39
38
|
* also match a filename that happens to literally equal the digits. That
|
|
40
39
|
* would require a patch literally named `5` or `005`, which would collide
|
|
41
40
|
* with the filename prefix anyway.
|
|
@@ -47,10 +46,10 @@ export declare function matchesUntilFilename(patchFilename: string, needle: stri
|
|
|
47
46
|
* on the first failure to keep the engine directory in a clean state.
|
|
48
47
|
* @param patchesDir - Path to the patches directory
|
|
49
48
|
* @param engineDir - Path to the engine directory
|
|
50
|
-
* @param
|
|
49
|
+
* @param options - Application options
|
|
51
50
|
* @returns Import summary with all results
|
|
52
51
|
*/
|
|
53
|
-
export declare function applyPatchesWithContinue(patchesDir: string, engineDir: string,
|
|
52
|
+
export declare function applyPatchesWithContinue(patchesDir: string, engineDir: string, options?: ApplyPatchesOptions): Promise<ImportSummary>;
|
|
54
53
|
/**
|
|
55
54
|
* Batched patched-content computation shared by status classification,
|
|
56
55
|
* import's unmanaged-dirty guard, and discard baseline planning.
|
|
@@ -67,10 +66,10 @@ export interface PatchedContentContext {
|
|
|
67
66
|
}
|
|
68
67
|
/**
|
|
69
68
|
* Builds a batched patched-content context that loads the manifest and
|
|
70
|
-
* discovers patch files
|
|
69
|
+
* discovers patch files once for many lookups, and memoizes each patch body
|
|
71
70
|
* read across the batch. A per-call helper re-runs `loadPatchesManifest` +
|
|
72
|
-
* `discoverPatches` and re-reads every affecting patch body for every file
|
|
73
|
-
* O(dirtyFiles × patches) redundant IO when classifying a broad
|
|
74
|
-
* 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`.
|
|
75
74
|
*/
|
|
76
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';
|
|
@@ -11,24 +11,23 @@ import { pathExists, readText, writeFileAtomic, writeText } from '../utils/fs.js
|
|
|
11
11
|
import { verbose } from '../utils/logger.js';
|
|
12
12
|
import { isContainedRelativePath } from '../utils/paths.js';
|
|
13
13
|
import { applyPatchIdempotent, reversePatch } from './git.js';
|
|
14
|
-
import {
|
|
14
|
+
import { getFileContentAtRef } from './git-file-ops.js';
|
|
15
15
|
import { discoverPatches } from './patch-files.js';
|
|
16
16
|
import { loadPatchesManifest } from './patch-manifest.js';
|
|
17
17
|
import { extractAffectedFiles, extractConflictingFiles, isNewFileInPatch, parseDiffSections, } from './patch-parse.js';
|
|
18
18
|
import { applyPatchTextToContent, extractNewFileContentFromDiff } from './patch-transform.js';
|
|
19
19
|
// Re-export from split modules so existing import sites continue working
|
|
20
20
|
export { PatchError } from '../errors/patch.js';
|
|
21
|
-
export { countPatches, discoverPatches
|
|
21
|
+
export { countPatches, discoverPatches } from './patch-files.js';
|
|
22
22
|
export { withPatchDirectoryLock } from './patch-lock.js';
|
|
23
|
-
export { extractAffectedFiles
|
|
24
|
-
export { applyPatchToContent, extractNewFileContent } from './patch-transform.js';
|
|
23
|
+
export { extractAffectedFiles } from './patch-parse.js';
|
|
25
24
|
/**
|
|
26
25
|
* Applies a single patch.
|
|
27
26
|
*
|
|
28
27
|
* @param patch - Patch info
|
|
29
28
|
* @param engineDir - Path to the engine directory
|
|
30
29
|
* @param protectedFiles - Files touched by patches already applied in the
|
|
31
|
-
* current run
|
|
30
|
+
* current run. The idempotent-recovery reset must not wipe them (see
|
|
32
31
|
* applyPatchIdempotent). Overlapping queues (`--allow-overlap`) share files
|
|
33
32
|
* between patches, and resetting a shared file to HEAD during a later
|
|
34
33
|
* patch's recovery silently discards the earlier patch's changes.
|
|
@@ -59,7 +58,7 @@ async function applySinglePatch(patch, engineDir, protectedFiles) {
|
|
|
59
58
|
// losslessly where a utf-8 decode of a binary file does not.
|
|
60
59
|
const savedContents = new Map();
|
|
61
60
|
// New-file sections keyed by target, so the binary discrimination below
|
|
62
|
-
// reads the
|
|
61
|
+
// reads the already-parsed section instead of re-scanning the body per
|
|
63
62
|
// file.
|
|
64
63
|
const newFileSections = new Map(parseDiffSections(patchContent)
|
|
65
64
|
.filter((section) => section.isNewFile)
|
|
@@ -74,14 +73,14 @@ async function applySinglePatch(patch, engineDir, protectedFiles) {
|
|
|
74
73
|
savedContents.set(file, await readFile(targetPath));
|
|
75
74
|
const section = newFileSections.get(file);
|
|
76
75
|
if (section?.isBinary === true) {
|
|
77
|
-
// A binary new file cannot be resolved by writing extracted
|
|
78
|
-
// the payload is base85, whose alphabet includes
|
|
79
|
-
// need to be: `git apply` decodes a `GIT binary
|
|
80
|
-
// the resolution is to
|
|
81
|
-
// below create it from the payload, which is
|
|
82
|
-
// 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.
|
|
83
82
|
if (!section.hasBinaryDelta) {
|
|
84
|
-
// `Binary files … differ` records
|
|
83
|
+
// `Binary files … differ` records that the bytes changed and
|
|
85
84
|
// carries none of them, so nothing can recreate the file. Fail
|
|
86
85
|
// honestly rather than deleting a file we cannot put back.
|
|
87
86
|
throw new PatchError(`Cannot resolve the new-file conflict for ${file}: the patch's binary section ` +
|
|
@@ -98,8 +97,8 @@ async function applySinglePatch(patch, engineDir, protectedFiles) {
|
|
|
98
97
|
}
|
|
99
98
|
}
|
|
100
99
|
catch (extractError) {
|
|
101
|
-
// Resolution threw for a
|
|
102
|
-
// already overwritten or removed
|
|
100
|
+
// Resolution threw for a later target after earlier targets were
|
|
101
|
+
// already overwritten or removed. Restore them before reporting
|
|
103
102
|
// failure, instead of letting the exception skip the restore loop
|
|
104
103
|
// entirely and crash the whole import.
|
|
105
104
|
for (const [file, originalContent] of savedContents) {
|
|
@@ -112,7 +111,7 @@ async function applySinglePatch(patch, engineDir, protectedFiles) {
|
|
|
112
111
|
await applyPatchIdempotent(patch.path, engineDir, {
|
|
113
112
|
...(protectedFiles ? { protectedFiles } : {}),
|
|
114
113
|
});
|
|
115
|
-
// Keep the originals: rollbackPatches needs them if a
|
|
114
|
+
// Keep the originals: rollbackPatches needs them if a later patch
|
|
116
115
|
// fails, since reverse-applying this new-file patch deletes the
|
|
117
116
|
// target and would otherwise permanently discard the pre-existing
|
|
118
117
|
// content (recoverable from git only if it was tracked at HEAD).
|
|
@@ -162,8 +161,8 @@ async function rollbackPatches(results, engineDir) {
|
|
|
162
161
|
catch (rollbackError) {
|
|
163
162
|
verbose(`Failed to roll back ${result.patch.filename}: ${toError(rollbackError).message}`);
|
|
164
163
|
}
|
|
165
|
-
// Reversing an auto-resolved new-file patch deletes the target
|
|
166
|
-
// 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.
|
|
167
166
|
if (result.autoResolvedOriginals) {
|
|
168
167
|
for (const [file, originalContent] of result.autoResolvedOriginals) {
|
|
169
168
|
try {
|
|
@@ -180,7 +179,7 @@ async function rollbackPatches(results, engineDir) {
|
|
|
180
179
|
async function validatePatchTargets(patch, affectedFiles, engineDir) {
|
|
181
180
|
// realpath the engine root once so containment is checked against the
|
|
182
181
|
// physical tree (the root itself may sit behind a symlink, e.g. /tmp on
|
|
183
|
-
// macOS). An unresolvable engine dir skips the symlink checks
|
|
182
|
+
// macOS). An unresolvable engine dir skips the symlink checks. A missing
|
|
184
183
|
// engine surfaces through `git apply --check` with a better message.
|
|
185
184
|
const engineRoot = engineDir ? await realpath(engineDir).catch(() => null) : null;
|
|
186
185
|
for (const file of affectedFiles) {
|
|
@@ -207,7 +206,7 @@ async function validatePatchTargets(patch, affectedFiles, engineDir) {
|
|
|
207
206
|
* - Dangling symlink: `realpath` rejects it, but a write through the link
|
|
208
207
|
* would still be created at the link target, so the target is resolved
|
|
209
208
|
* against the link's (real) parent directory. The link target is taken
|
|
210
|
-
* textually
|
|
209
|
+
* textually. A loop or nested dangling link fails at apply time anyway.
|
|
211
210
|
* - Not-yet-existing file: resolved against the nearest existing ancestor's
|
|
212
211
|
* real path. Components below that ancestor do not exist, so they cannot
|
|
213
212
|
* be symlinks and are appended verbatim.
|
|
@@ -241,14 +240,14 @@ async function resolvePatchWriteDestination(targetPath) {
|
|
|
241
240
|
* The identifier is one of three shapes and the three shapes must stay
|
|
242
241
|
* disjoint so the operator can reason about which patch they picked:
|
|
243
242
|
*
|
|
244
|
-
* 1.
|
|
245
|
-
* 2.
|
|
246
|
-
* 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
|
|
247
246
|
* order prefix parses to the same integer (so `5` and `005` both match
|
|
248
247
|
* `005-foo.patch`, and `05` matches too because parseInt normalizes
|
|
249
248
|
* leading zeros).
|
|
250
249
|
*
|
|
251
|
-
* A purely-numeric identifier is treated
|
|
250
|
+
* A purely-numeric identifier is treated only as an ordinal: it does not
|
|
252
251
|
* also match a filename that happens to literally equal the digits. That
|
|
253
252
|
* would require a patch literally named `5` or `005`, which would collide
|
|
254
253
|
* with the filename prefix anyway.
|
|
@@ -272,23 +271,18 @@ export function matchesUntilFilename(patchFilename, needle) {
|
|
|
272
271
|
* on the first failure to keep the engine directory in a clean state.
|
|
273
272
|
* @param patchesDir - Path to the patches directory
|
|
274
273
|
* @param engineDir - Path to the engine directory
|
|
275
|
-
* @param
|
|
274
|
+
* @param options - Application options
|
|
276
275
|
* @returns Import summary with all results
|
|
277
276
|
*/
|
|
278
|
-
export async function applyPatchesWithContinue(patchesDir, engineDir,
|
|
279
|
-
// Accept both the legacy boolean positional and the new options object so
|
|
280
|
-
// existing call sites (tests and rebase) keep working without a rewrite.
|
|
281
|
-
const options = typeof optionsOrContinue === 'boolean'
|
|
282
|
-
? { continueOnFailure: optionsOrContinue }
|
|
283
|
-
: optionsOrContinue;
|
|
277
|
+
export async function applyPatchesWithContinue(patchesDir, engineDir, options = {}) {
|
|
284
278
|
const continueOnFailure = options.continueOnFailure ?? false;
|
|
285
279
|
const untilFilename = options.untilFilename;
|
|
286
280
|
const patches = await discoverPatches(patchesDir);
|
|
287
281
|
// Resolve the --until stop index up front so callers get an immediate
|
|
288
282
|
// error on an unknown identifier instead of a silent no-op. Detect
|
|
289
|
-
// ambiguity (two patches matching the same needle
|
|
290
|
-
// in a well-formed manifest but surfaces queue corruption
|
|
291
|
-
// 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.
|
|
292
286
|
let stopIndex = patches.length - 1;
|
|
293
287
|
if (untilFilename !== undefined) {
|
|
294
288
|
const matchingIndexes = [];
|
|
@@ -320,8 +314,8 @@ export async function applyPatchesWithContinue(patchesDir, engineDir, optionsOrC
|
|
|
320
314
|
if (!patch)
|
|
321
315
|
continue;
|
|
322
316
|
if (i > stopIndex) {
|
|
323
|
-
// Patches beyond the --until cutoff are
|
|
324
|
-
// 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
|
|
325
319
|
// reflects what the full queue contained.
|
|
326
320
|
skipped.push(patch);
|
|
327
321
|
continue;
|
|
@@ -364,11 +358,11 @@ export async function applyPatchesWithContinue(patchesDir, engineDir, optionsOrC
|
|
|
364
358
|
}
|
|
365
359
|
/**
|
|
366
360
|
* Builds a batched patched-content context that loads the manifest and
|
|
367
|
-
* discovers patch files
|
|
361
|
+
* discovers patch files once for many lookups, and memoizes each patch body
|
|
368
362
|
* read across the batch. A per-call helper re-runs `loadPatchesManifest` +
|
|
369
|
-
* `discoverPatches` and re-reads every affecting patch body for every file
|
|
370
|
-
* O(dirtyFiles × patches) redundant IO when classifying a broad
|
|
371
|
-
* 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`.
|
|
372
366
|
*/
|
|
373
367
|
export async function createPatchedContentContext(patchesDir, engineDir) {
|
|
374
368
|
const manifest = await loadPatchesManifest(patchesDir);
|
|
@@ -406,7 +400,7 @@ export async function createPatchedContentContext(patchesDir, engineDir) {
|
|
|
406
400
|
getAffectingPatches,
|
|
407
401
|
readPatchBody,
|
|
408
402
|
computePatched: async (filePath) => {
|
|
409
|
-
let content = await
|
|
403
|
+
let content = await getFileContentAtRef(engineDir, filePath);
|
|
410
404
|
for (const patch of getAffectingPatches(filePath)) {
|
|
411
405
|
content = applyPatchTextToContent(content, await readPatchBody(patch), filePath);
|
|
412
406
|
}
|
|
@@ -2,15 +2,6 @@
|
|
|
2
2
|
* Patch coverage and supersession helpers used by export planning.
|
|
3
3
|
*/
|
|
4
4
|
import type { PatchInfo, PatchMetadata } from '../types/commands/index.js';
|
|
5
|
-
/**
|
|
6
|
-
* Finds patches that are completely superseded by newer patches.
|
|
7
|
-
* A patch is superseded if all its affected files are covered by newer patches.
|
|
8
|
-
* @param patchesDir - Path to the patches directory
|
|
9
|
-
* @param newPatchFiles - Files affected by the new patch
|
|
10
|
-
* @param excludeFilename - Filename to exclude from results (the new patch itself)
|
|
11
|
-
* @returns Superseded patches
|
|
12
|
-
*/
|
|
13
|
-
export declare function findSupersededPatches(patchesDir: string, newPatchFiles: string[], excludeFilename?: string): Promise<PatchInfo[]>;
|
|
14
5
|
/**
|
|
15
6
|
* Report whether a patch is fully covered by a new export, and which of its
|
|
16
7
|
* files caused the coverage.
|
|
@@ -2,37 +2,8 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Patch coverage and supersession helpers used by export planning.
|
|
4
4
|
*/
|
|
5
|
-
import { discoverPatches
|
|
5
|
+
import { discoverPatches } from './patch-apply.js';
|
|
6
6
|
import { loadPatchesManifest } from './patch-manifest.js';
|
|
7
|
-
/**
|
|
8
|
-
* Finds patches that are completely superseded by newer patches.
|
|
9
|
-
* A patch is superseded if all its affected files are covered by newer patches.
|
|
10
|
-
* @param patchesDir - Path to the patches directory
|
|
11
|
-
* @param newPatchFiles - Files affected by the new patch
|
|
12
|
-
* @param excludeFilename - Filename to exclude from results (the new patch itself)
|
|
13
|
-
* @returns Superseded patches
|
|
14
|
-
*/
|
|
15
|
-
export async function findSupersededPatches(patchesDir, newPatchFiles, excludeFilename) {
|
|
16
|
-
const manifest = await loadPatchesManifest(patchesDir);
|
|
17
|
-
if (!manifest)
|
|
18
|
-
return [];
|
|
19
|
-
const patches = await discoverPatches(patchesDir);
|
|
20
|
-
const superseded = [];
|
|
21
|
-
for (const metadata of manifest.patches) {
|
|
22
|
-
if (excludeFilename && metadata.filename === excludeFilename)
|
|
23
|
-
continue;
|
|
24
|
-
if (metadata.filesAffected.length === 1) {
|
|
25
|
-
const affectedFile = metadata.filesAffected[0];
|
|
26
|
-
if (affectedFile && newPatchFiles.includes(affectedFile)) {
|
|
27
|
-
const patch = patches.find((p) => p.filename === metadata.filename);
|
|
28
|
-
if (patch && (await isNewFilePatch(patch.path))) {
|
|
29
|
-
superseded.push(patch);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
return superseded;
|
|
35
|
-
}
|
|
36
7
|
/**
|
|
37
8
|
* Checks whether a patch is fully covered by a new export.
|
|
38
9
|
* A patch is fully covered when every file it affects is present in the new export.
|
|
@@ -13,6 +13,22 @@ export interface UpdatePatchPolicyGate {
|
|
|
13
13
|
command: string;
|
|
14
14
|
forceUnsafe?: boolean;
|
|
15
15
|
}
|
|
16
|
+
export interface UpdatePatchAndMetadataOptions {
|
|
17
|
+
/** Patch directory holding the body and `patches.json`. */
|
|
18
|
+
patchesDir: string;
|
|
19
|
+
/** Patch file to rewrite. */
|
|
20
|
+
filename: string;
|
|
21
|
+
/** New patch body. An identical body skips the write. */
|
|
22
|
+
newContent: string;
|
|
23
|
+
/** Manifest-row fields to merge into the patch's metadata. */
|
|
24
|
+
updates: Partial<PatchMetadata>;
|
|
25
|
+
/** Hook run under the lock after the mutation succeeds. */
|
|
26
|
+
onCommitted?: UpdatePatchCommittedHook | undefined;
|
|
27
|
+
/** Policy gate run against the under-lock projected manifest. */
|
|
28
|
+
policyGate?: UpdatePatchPolicyGate | undefined;
|
|
29
|
+
/** Wait budget and command name for the patch directory lock. */
|
|
30
|
+
lockOptions?: PatchDirectoryLockOptions | undefined;
|
|
31
|
+
}
|
|
16
32
|
/**
|
|
17
33
|
* Updates a patch file body and its manifest row under the same patch
|
|
18
34
|
* directory lock. Intended for commands like `re-export --files` where the
|
|
@@ -20,13 +36,14 @@ export interface UpdatePatchPolicyGate {
|
|
|
20
36
|
*
|
|
21
37
|
* The body write is skipped when the normalized new content is byte-identical
|
|
22
38
|
* to what is already on disk. A bulk `re-export --all` refreshes every patch
|
|
23
|
-
* in the queue, including ones the working tree never touched
|
|
39
|
+
* in the queue, including ones the working tree never touched. Rewriting an
|
|
24
40
|
* unchanged body churns its mtime and reports "Re-exported" for a patch
|
|
25
41
|
* nothing happened to, which is exactly the noise that hides a real
|
|
26
|
-
* unexpected rewrite in `git status`. Metadata still moves either way
|
|
27
|
-
* 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.
|
|
28
44
|
*
|
|
45
|
+
* @param options - See {@link UpdatePatchAndMetadataOptions}
|
|
29
46
|
* @returns True when the patch body on disk changed, false when it was
|
|
30
47
|
* already byte-identical to the new content.
|
|
31
48
|
*/
|
|
32
|
-
export declare function updatePatchAndMetadata(
|
|
49
|
+
export declare function updatePatchAndMetadata(options: UpdatePatchAndMetadataOptions): Promise<boolean>;
|
|
@@ -5,7 +5,6 @@ import { toError } from '../utils/errors.js';
|
|
|
5
5
|
import { pathExists, readText, writeText } from '../utils/fs.js';
|
|
6
6
|
import { warn } from '../utils/logger.js';
|
|
7
7
|
import { withPatchDirectoryLock } from './patch-apply.js';
|
|
8
|
-
import { normalizePatchArtifact } from './patch-artifact-normalize.js';
|
|
9
8
|
import { loadPatchesManifestForWrite, mutatePatchRowsInManifest } from './patch-manifest.js';
|
|
10
9
|
import { buildProjectedManifest, enforcePatchPolicy } from './patch-policy.js';
|
|
11
10
|
/**
|
|
@@ -15,16 +14,18 @@ import { buildProjectedManifest, enforcePatchPolicy } from './patch-policy.js';
|
|
|
15
14
|
*
|
|
16
15
|
* The body write is skipped when the normalized new content is byte-identical
|
|
17
16
|
* to what is already on disk. A bulk `re-export --all` refreshes every patch
|
|
18
|
-
* in the queue, including ones the working tree never touched
|
|
17
|
+
* in the queue, including ones the working tree never touched. Rewriting an
|
|
19
18
|
* unchanged body churns its mtime and reports "Re-exported" for a patch
|
|
20
19
|
* nothing happened to, which is exactly the noise that hides a real
|
|
21
|
-
* unexpected rewrite in `git status`. Metadata still moves either way
|
|
22
|
-
* 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.
|
|
23
22
|
*
|
|
23
|
+
* @param options - See {@link UpdatePatchAndMetadataOptions}
|
|
24
24
|
* @returns True when the patch body on disk changed, false when it was
|
|
25
25
|
* already byte-identical to the new content.
|
|
26
26
|
*/
|
|
27
|
-
export async function updatePatchAndMetadata(
|
|
27
|
+
export async function updatePatchAndMetadata(options) {
|
|
28
|
+
const { patchesDir, filename, newContent, updates, onCommitted, policyGate, lockOptions = {}, } = options;
|
|
28
29
|
return withPatchDirectoryLock(patchesDir, async () => {
|
|
29
30
|
const manifest = await loadPatchesManifestForWrite(patchesDir);
|
|
30
31
|
if (!manifest) {
|
|
@@ -49,7 +50,7 @@ export async function updatePatchAndMetadata(patchesDir, filename, newContent, u
|
|
|
49
50
|
forceUnsafe: policyGate.forceUnsafe === true,
|
|
50
51
|
});
|
|
51
52
|
}
|
|
52
|
-
const normalized =
|
|
53
|
+
const normalized = newContent;
|
|
53
54
|
const bodyChanged = normalized !== originalContent;
|
|
54
55
|
let patchWritten = false;
|
|
55
56
|
try {
|