@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
package/dist/src/core/config.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* Project configuration
|
|
3
|
+
* Project configuration barrel module.
|
|
4
4
|
*
|
|
5
5
|
* Re-exports from focused sub-modules:
|
|
6
|
-
* config-paths.ts
|
|
7
|
-
* config-validate.ts
|
|
8
|
-
* config-mutate.ts
|
|
9
|
-
* config-state.ts
|
|
6
|
+
* config-paths.ts: constants and project path derivation
|
|
7
|
+
* config-validate.ts: fireforge.json schema validation
|
|
8
|
+
* config-mutate.ts: immutable config mutation
|
|
9
|
+
* config-state.ts: state file management
|
|
10
10
|
*/
|
|
11
11
|
import { basename } from 'node:path';
|
|
12
12
|
import { ConfigError, ConfigNotFoundError } from '../errors/config.js';
|
|
@@ -18,20 +18,10 @@ import { validateConfig } from './config-validate.js';
|
|
|
18
18
|
import { createSiblingLockPath, withFileLock } from './file-lock.js';
|
|
19
19
|
// ---- re-exports ----
|
|
20
20
|
export { mutateConfig } from './config-mutate.js';
|
|
21
|
-
export {
|
|
22
|
-
export { loadState,
|
|
21
|
+
export { FIREFORGE_DIR, getProjectPaths, SUPPORTED_CONFIG_PATHS, SUPPORTED_CONFIG_ROOT_KEYS, } from './config-paths.js';
|
|
22
|
+
export { loadState, updateState } from './config-state.js';
|
|
23
23
|
export { validateConfig } from './config-validate.js';
|
|
24
24
|
// ---- config I/O (stays here because it bridges paths + validation) ----
|
|
25
|
-
/**
|
|
26
|
-
* Config-file existence probe.
|
|
27
|
-
*
|
|
28
|
-
* Uses {@link pathExistsStrict} deliberately: a permission error probing
|
|
29
|
-
* `fireforge.json` must propagate rather than read as "no config here",
|
|
30
|
-
* which is what plain `pathExists` would report.
|
|
31
|
-
*/
|
|
32
|
-
async function configPathExists(path) {
|
|
33
|
-
return fsUtils.pathExistsStrict(path);
|
|
34
|
-
}
|
|
35
25
|
/**
|
|
36
26
|
* Checks if a fireforge.json exists in the given directory.
|
|
37
27
|
* @param root - Root directory to check
|
|
@@ -39,7 +29,9 @@ async function configPathExists(path) {
|
|
|
39
29
|
*/
|
|
40
30
|
export async function configExists(root) {
|
|
41
31
|
const paths = getProjectPaths(root);
|
|
42
|
-
|
|
32
|
+
// Strict probe: a permission error on `fireforge.json` must propagate
|
|
33
|
+
// rather than read as "no config here", which plain `pathExists` reports.
|
|
34
|
+
return fsUtils.pathExistsStrict(paths.config);
|
|
43
35
|
}
|
|
44
36
|
/**
|
|
45
37
|
* Loads and validates the fireforge.json configuration.
|
|
@@ -49,7 +41,9 @@ export async function configExists(root) {
|
|
|
49
41
|
*/
|
|
50
42
|
export async function loadConfig(root) {
|
|
51
43
|
const paths = getProjectPaths(root);
|
|
52
|
-
|
|
44
|
+
// Strict probe: a permission error on `fireforge.json` must propagate
|
|
45
|
+
// rather than read as "no config here", which plain `pathExists` reports.
|
|
46
|
+
if (!(await fsUtils.pathExistsStrict(paths.config))) {
|
|
53
47
|
throw new ConfigNotFoundError(paths.config);
|
|
54
48
|
}
|
|
55
49
|
try {
|
|
@@ -65,12 +59,12 @@ export async function loadConfig(root) {
|
|
|
65
59
|
}
|
|
66
60
|
/**
|
|
67
61
|
* Reads the raw `fireforge.json` document without running it through
|
|
68
|
-
* {@link validateConfig}. Returns every persisted key
|
|
62
|
+
* {@link validateConfig}. Returns every persisted key, including keys
|
|
69
63
|
* written via `fireforge config <key> --force` that `validateConfig`
|
|
70
64
|
* would strip from the typed result.
|
|
71
65
|
*
|
|
72
66
|
* Callers that need the validated, typed shape must still use
|
|
73
|
-
* {@link loadConfig}
|
|
67
|
+
* {@link loadConfig}. This helper exists specifically for the `config`
|
|
74
68
|
* read path so `fireforge config <key>` can surface keys the write path
|
|
75
69
|
* accepted under `--force`.
|
|
76
70
|
*
|
|
@@ -81,7 +75,9 @@ export async function loadConfig(root) {
|
|
|
81
75
|
*/
|
|
82
76
|
export async function loadRawConfigDocument(root) {
|
|
83
77
|
const paths = getProjectPaths(root);
|
|
84
|
-
|
|
78
|
+
// Strict probe: a permission error on `fireforge.json` must propagate
|
|
79
|
+
// rather than read as "no config here", which plain `pathExists` reports.
|
|
80
|
+
if (!(await fsUtils.pathExistsStrict(paths.config))) {
|
|
85
81
|
throw new ConfigNotFoundError(paths.config);
|
|
86
82
|
}
|
|
87
83
|
try {
|
|
@@ -129,9 +125,9 @@ export async function writeConfigDocument(root, config) {
|
|
|
129
125
|
* Runs an operation while holding a sidecar lock on `fireforge.json`.
|
|
130
126
|
*
|
|
131
127
|
* Two concurrent `fireforge config <key> <value>` invocations each run
|
|
132
|
-
* load → mutate → writeJson against the same document
|
|
133
|
-
* second rename lands after the first and silently drops the first
|
|
134
|
-
* key, with both commands exiting 0.
|
|
128
|
+
* load → mutate → writeJson against the same document. Without this lock
|
|
129
|
+
* the second rename lands after the first and silently drops the first
|
|
130
|
+
* writer's key, with both commands exiting 0.
|
|
135
131
|
*
|
|
136
132
|
* Reads (`loadConfig`, `loadRawConfigDocument`) stay lock-free: writers
|
|
137
133
|
* always use `writeJson`'s atomic temp-file + rename, so a reader observes
|
|
@@ -3,34 +3,34 @@
|
|
|
3
3
|
* into the recorded `testPackagingCoverage` instead of replacing it, under
|
|
4
4
|
* an anchor guard.
|
|
5
5
|
*
|
|
6
|
-
* Coverage
|
|
6
|
+
* Coverage replaces by default for a reason documented in
|
|
7
7
|
* `build-baseline-types.ts`: every baseline write refreshes
|
|
8
|
-
* `packageableFingerprints` for
|
|
8
|
+
* `packageableFingerprints` for all dirty packageable paths, so a blind
|
|
9
9
|
* union would whitewash an earlier scope's edited fixtures while
|
|
10
10
|
* `obj-*`/`_tests/` still holds that scope's stale staging. Extending is
|
|
11
|
-
* honest only while everything the
|
|
11
|
+
* honest only while everything the previous record vouched for is still
|
|
12
12
|
* true, which is what {@link checkExtendCoverageAnchor} and
|
|
13
13
|
* {@link checkExtendMozconfigAnchor} verify:
|
|
14
14
|
*
|
|
15
|
-
* 1. engine HEAD is unchanged
|
|
15
|
+
* 1. engine HEAD is unchanged, so every committed edit is excluded.
|
|
16
16
|
* 2. every path the previous baseline fingerprinted still hashes to the
|
|
17
17
|
* recorded digest, so the earlier scope's staging inputs are
|
|
18
|
-
* byte-identical. Files that became dirty
|
|
18
|
+
* byte-identical. Files that became dirty since that build are fine:
|
|
19
19
|
* the current whole-tree `mach build faster` repackages `dist/` and
|
|
20
|
-
* vouches for them
|
|
20
|
+
* vouches for them.
|
|
21
21
|
* 3. the generated `engine/mozconfig` is unchanged. Engine HEAD does not
|
|
22
|
-
* cover this
|
|
22
|
+
* cover this: the mozconfig is regenerated from project-side
|
|
23
23
|
* `configs/*.mozconfig` templates plus `fireforge.json` on every build,
|
|
24
24
|
* so two builds at the same engine SHA can configure differently.
|
|
25
25
|
*
|
|
26
|
-
* Every failure refuses fail-closed
|
|
26
|
+
* Every failure refuses fail-closed. The operator's remedy is always a plain
|
|
27
27
|
* scoped build, which resets the claim to the paths it actually vouches for.
|
|
28
28
|
*
|
|
29
|
-
* Known boundary, documented rather than closed: dirty
|
|
29
|
+
* Known boundary, documented rather than closed: dirty non-packageable
|
|
30
30
|
* fixtures under previously covered paths (plain test files, manifests
|
|
31
31
|
* `isPackageablePath` rejects) are invisible to check 2. Editing one
|
|
32
32
|
* uncommitted between two builds leaves the earlier scope's `_tests/`
|
|
33
|
-
* staging stale while extend still vouches for it. Plain
|
|
33
|
+
* staging stale while extend still vouches for it. Plain replacement has no such
|
|
34
34
|
* window, because the earlier scope simply stops being covered.
|
|
35
35
|
*/
|
|
36
36
|
import { type BuildBaseline, type TestPackagingCoverage } from './build-baseline-types.js';
|
|
@@ -54,17 +54,17 @@ export type ExtendAnchorResult = {
|
|
|
54
54
|
export declare function checkExtendCoverageAnchor(engineDir: string, previousBaseline: BuildBaseline | undefined): Promise<ExtendAnchorResult>;
|
|
55
55
|
/**
|
|
56
56
|
* Verifies the mozconfig half of the anchor. Split from
|
|
57
|
-
* {@link checkExtendCoverageAnchor} because it can only run
|
|
58
|
-
* `prepareBuildEnvironment` regenerates `engine/mozconfig`
|
|
59
|
-
*
|
|
60
|
-
*
|
|
57
|
+
* {@link checkExtendCoverageAnchor} because it can only run after
|
|
58
|
+
* `prepareBuildEnvironment` regenerates `engine/mozconfig` (the file this
|
|
59
|
+
* build will configure with), and must still run before mach, so a refusal
|
|
60
|
+
* costs no build time.
|
|
61
61
|
* @param engineDir - Path to the engine directory
|
|
62
62
|
* @param previousBaseline - Baseline recorded by the previous build
|
|
63
63
|
*/
|
|
64
64
|
export declare function checkExtendMozconfigAnchor(engineDir: string, previousBaseline: BuildBaseline | undefined): Promise<ExtendAnchorResult>;
|
|
65
65
|
/**
|
|
66
66
|
* Unions the newly built paths onto the recorded claim. A `'full'` claim, or
|
|
67
|
-
* an absent one (which means full), stays `'full'
|
|
67
|
+
* an absent one (which means full), stays `'full'`, since it already covers
|
|
68
68
|
* everything.
|
|
69
69
|
*
|
|
70
70
|
* @param previous - Coverage recorded by the previous build
|
|
@@ -84,7 +84,7 @@ export declare function formatExtendCoverageRefusal(result: {
|
|
|
84
84
|
/**
|
|
85
85
|
* Hex-encoded SHA-256 of an engine-relative file, matching the digest the
|
|
86
86
|
* baseline writer produces. `undefined` on any IO error, which every caller
|
|
87
|
-
* treats as "cannot prove unchanged"
|
|
87
|
+
* treats as "cannot prove unchanged", i.e. a refusal.
|
|
88
88
|
* @param engineDir - Path to the engine directory
|
|
89
89
|
* @param relPath - Engine-relative POSIX path
|
|
90
90
|
*/
|
|
@@ -4,40 +4,40 @@
|
|
|
4
4
|
* into the recorded `testPackagingCoverage` instead of replacing it, under
|
|
5
5
|
* an anchor guard.
|
|
6
6
|
*
|
|
7
|
-
* Coverage
|
|
7
|
+
* Coverage replaces by default for a reason documented in
|
|
8
8
|
* `build-baseline-types.ts`: every baseline write refreshes
|
|
9
|
-
* `packageableFingerprints` for
|
|
9
|
+
* `packageableFingerprints` for all dirty packageable paths, so a blind
|
|
10
10
|
* union would whitewash an earlier scope's edited fixtures while
|
|
11
11
|
* `obj-*`/`_tests/` still holds that scope's stale staging. Extending is
|
|
12
|
-
* honest only while everything the
|
|
12
|
+
* honest only while everything the previous record vouched for is still
|
|
13
13
|
* true, which is what {@link checkExtendCoverageAnchor} and
|
|
14
14
|
* {@link checkExtendMozconfigAnchor} verify:
|
|
15
15
|
*
|
|
16
|
-
* 1. engine HEAD is unchanged
|
|
16
|
+
* 1. engine HEAD is unchanged, so every committed edit is excluded.
|
|
17
17
|
* 2. every path the previous baseline fingerprinted still hashes to the
|
|
18
18
|
* recorded digest, so the earlier scope's staging inputs are
|
|
19
|
-
* byte-identical. Files that became dirty
|
|
19
|
+
* byte-identical. Files that became dirty since that build are fine:
|
|
20
20
|
* the current whole-tree `mach build faster` repackages `dist/` and
|
|
21
|
-
* vouches for them
|
|
21
|
+
* vouches for them.
|
|
22
22
|
* 3. the generated `engine/mozconfig` is unchanged. Engine HEAD does not
|
|
23
|
-
* cover this
|
|
23
|
+
* cover this: the mozconfig is regenerated from project-side
|
|
24
24
|
* `configs/*.mozconfig` templates plus `fireforge.json` on every build,
|
|
25
25
|
* so two builds at the same engine SHA can configure differently.
|
|
26
26
|
*
|
|
27
|
-
* Every failure refuses fail-closed
|
|
27
|
+
* Every failure refuses fail-closed. The operator's remedy is always a plain
|
|
28
28
|
* scoped build, which resets the claim to the paths it actually vouches for.
|
|
29
29
|
*
|
|
30
|
-
* Known boundary, documented rather than closed: dirty
|
|
30
|
+
* Known boundary, documented rather than closed: dirty non-packageable
|
|
31
31
|
* fixtures under previously covered paths (plain test files, manifests
|
|
32
32
|
* `isPackageablePath` rejects) are invisible to check 2. Editing one
|
|
33
33
|
* uncommitted between two builds leaves the earlier scope's `_tests/`
|
|
34
|
-
* staging stale while extend still vouches for it. Plain
|
|
34
|
+
* staging stale while extend still vouches for it. Plain replacement has no such
|
|
35
35
|
* window, because the earlier scope simply stops being covered.
|
|
36
36
|
*/
|
|
37
|
-
import { createHash } from 'node:crypto';
|
|
38
37
|
import { readFile } from 'node:fs/promises';
|
|
39
38
|
import { join } from 'node:path';
|
|
40
39
|
import { getNodeErrorCode, toError } from '../utils/errors.js';
|
|
40
|
+
import { sha256Hex } from '../utils/hash.js';
|
|
41
41
|
import { verbose } from '../utils/logger.js';
|
|
42
42
|
import { DELETED_FILE_FINGERPRINT, } from './build-baseline-types.js';
|
|
43
43
|
import { getHead, isMissingHeadError } from './git.js';
|
|
@@ -88,10 +88,10 @@ export async function checkExtendCoverageAnchor(engineDir, previousBaseline) {
|
|
|
88
88
|
}
|
|
89
89
|
/**
|
|
90
90
|
* Verifies the mozconfig half of the anchor. Split from
|
|
91
|
-
* {@link checkExtendCoverageAnchor} because it can only run
|
|
92
|
-
* `prepareBuildEnvironment` regenerates `engine/mozconfig`
|
|
93
|
-
*
|
|
94
|
-
*
|
|
91
|
+
* {@link checkExtendCoverageAnchor} because it can only run after
|
|
92
|
+
* `prepareBuildEnvironment` regenerates `engine/mozconfig` (the file this
|
|
93
|
+
* build will configure with), and must still run before mach, so a refusal
|
|
94
|
+
* costs no build time.
|
|
95
95
|
* @param engineDir - Path to the engine directory
|
|
96
96
|
* @param previousBaseline - Baseline recorded by the previous build
|
|
97
97
|
*/
|
|
@@ -108,7 +108,7 @@ export async function checkExtendMozconfigAnchor(engineDir, previousBaseline) {
|
|
|
108
108
|
}
|
|
109
109
|
/**
|
|
110
110
|
* Unions the newly built paths onto the recorded claim. A `'full'` claim, or
|
|
111
|
-
* an absent one (which means full), stays `'full'
|
|
111
|
+
* an absent one (which means full), stays `'full'`, since it already covers
|
|
112
112
|
* everything.
|
|
113
113
|
*
|
|
114
114
|
* @param previous - Coverage recorded by the previous build
|
|
@@ -144,7 +144,7 @@ export function formatExtendCoverageRefusal(result) {
|
|
|
144
144
|
`longer anchored. ${remedy}`);
|
|
145
145
|
case 'fingerprint-diverged':
|
|
146
146
|
return ('--extend-coverage refused: ' +
|
|
147
|
-
`${
|
|
147
|
+
`${result.detail.length} packageable file(s) the recorded build staged have changed ` +
|
|
148
148
|
`since (${formatDivergedPaths(result.detail)}). Extending would vouch for the earlier scope ` +
|
|
149
149
|
`while obj-*/_tests/ still holds its stale staging. ${remedy}`);
|
|
150
150
|
case 'mozconfig-changed':
|
|
@@ -156,19 +156,19 @@ export function formatExtendCoverageRefusal(result) {
|
|
|
156
156
|
function formatDivergedPaths(paths) {
|
|
157
157
|
const head = paths.slice(0, MAX_DIVERGED_REPORTED).join(', ');
|
|
158
158
|
const extra = paths.length - Math.min(paths.length, MAX_DIVERGED_REPORTED);
|
|
159
|
-
return extra > 0 ? `${head}, … (+${
|
|
159
|
+
return extra > 0 ? `${head}, … (+${extra} more)` : head;
|
|
160
160
|
}
|
|
161
161
|
/**
|
|
162
162
|
* Hex-encoded SHA-256 of an engine-relative file, matching the digest the
|
|
163
163
|
* baseline writer produces. `undefined` on any IO error, which every caller
|
|
164
|
-
* treats as "cannot prove unchanged"
|
|
164
|
+
* treats as "cannot prove unchanged", i.e. a refusal.
|
|
165
165
|
* @param engineDir - Path to the engine directory
|
|
166
166
|
* @param relPath - Engine-relative POSIX path
|
|
167
167
|
*/
|
|
168
168
|
export async function hashEngineFile(engineDir, relPath) {
|
|
169
169
|
try {
|
|
170
170
|
const buffer = await readFile(join(engineDir, relPath));
|
|
171
|
-
return
|
|
171
|
+
return sha256Hex(buffer);
|
|
172
172
|
}
|
|
173
173
|
catch (error) {
|
|
174
174
|
if (getNodeErrorCode(error) === 'ENOENT') {
|
|
@@ -17,7 +17,7 @@ export declare const HISTORY_LOG_FILENAME = ".fireforge-history.jsonl";
|
|
|
17
17
|
* A structural conflict that must block the operation even under `--force`.
|
|
18
18
|
*
|
|
19
19
|
* Intended for cases like "reorder would introduce a forward-import" or
|
|
20
|
-
* "delete would orphan a later patch's import"
|
|
20
|
+
* "delete would orphan a later patch's import", situations where the
|
|
21
21
|
* operator almost certainly wants a different fix (re-export --files, etc.)
|
|
22
22
|
* rather than a bypass. `--force-unsafe` is the escape hatch when the
|
|
23
23
|
* operator genuinely accepts the risk.
|
|
@@ -35,9 +35,9 @@ export interface DestructiveOpInput {
|
|
|
35
35
|
/** Short one-line title shown in the prompt. */
|
|
36
36
|
title: string;
|
|
37
37
|
/**
|
|
38
|
-
* Detailed change summary
|
|
39
|
-
* Generic "proceed? [y/N]" is insufficient per the destructive-op
|
|
40
|
-
*
|
|
38
|
+
* Detailed change summary: every affected patch, file, or renumber row.
|
|
39
|
+
* Generic "proceed? [y/N]" is insufficient per the destructive-op
|
|
40
|
+
* contract. Callers must list every concrete change here.
|
|
41
41
|
*/
|
|
42
42
|
summary: string[];
|
|
43
43
|
/** Whether the caller passed `--yes`. */
|
|
@@ -52,9 +52,9 @@ export interface DestructiveOpInput {
|
|
|
52
52
|
/**
|
|
53
53
|
* Outcome of the destructive-operation contract.
|
|
54
54
|
*
|
|
55
|
-
* `'declined'` means the operator answered "no"
|
|
55
|
+
* `'declined'` means the operator answered "no", a successful run that
|
|
56
56
|
* chose not to proceed, so callers return normally and the process exits 0.
|
|
57
|
-
* An
|
|
57
|
+
* An interrupt (Esc / Ctrl+C) is not represented here: it throws
|
|
58
58
|
* {@link CancellationError} and exits 130. Collapsing the two would make an
|
|
59
59
|
* interrupted prompt indistinguishable from a declined one.
|
|
60
60
|
*/
|
|
@@ -73,11 +73,11 @@ export interface HistoryEntry {
|
|
|
73
73
|
yes?: boolean;
|
|
74
74
|
/** True if `--force-unsafe` was used. */
|
|
75
75
|
unsafeOverride?: boolean;
|
|
76
|
-
/** Result: `'ok'` on success
|
|
76
|
+
/** Result: `'ok'` on success. Other strings describe failure. */
|
|
77
77
|
result: string;
|
|
78
78
|
}
|
|
79
79
|
/**
|
|
80
|
-
* True when
|
|
80
|
+
* True when both standard handles are real TTYs, i.e. an interactive prompt
|
|
81
81
|
* can actually be answered.
|
|
82
82
|
*
|
|
83
83
|
* Named for the condition rather than for confirmation specifically: many
|
|
@@ -87,16 +87,16 @@ export interface HistoryEntry {
|
|
|
87
87
|
* Node types `isTTY` as `boolean`, but at runtime it is `true | undefined`
|
|
88
88
|
* (absent when the handle is not a TTY). Unusual harnesses (vitest stdio
|
|
89
89
|
* capture, CI spawners, mocked pipes) can also leave it unset on only one
|
|
90
|
-
* handle, so every falsy variant
|
|
90
|
+
* handle, so every falsy variant (false, undefined, a null-patched mock)
|
|
91
91
|
* must route to the non-interactive path.
|
|
92
92
|
*/
|
|
93
93
|
export declare function stdioIsInteractive(): boolean;
|
|
94
94
|
/**
|
|
95
|
-
*
|
|
95
|
+
* Up-front non-interactive refusal for a command that will end at
|
|
96
96
|
* {@link confirmDestructive}.
|
|
97
97
|
*
|
|
98
98
|
* `confirmDestructive` already refuses a prompt-less run rather than
|
|
99
|
-
* proceeding silently
|
|
99
|
+
* proceeding silently, but it does so at the end, after the command has
|
|
100
100
|
* built diffs and run projected per-patch lint. On `patch move-files
|
|
101
101
|
* --create` that is minutes of work before a scripted run learns it needed
|
|
102
102
|
* `--yes`, and the failure reads as an obscure late error rather than a
|
|
@@ -117,7 +117,7 @@ export declare function assertConfirmationAvailable(operation: string, options:
|
|
|
117
117
|
* Executes the destructive-operation contract: summary → conflict refusal →
|
|
118
118
|
* dry-run / force / prompt / non-TTY refusal.
|
|
119
119
|
*
|
|
120
|
-
* Returns the decision for the caller to act on
|
|
120
|
+
* Returns the decision for the caller to act on. Callers must not execute
|
|
121
121
|
* the mutation when the result is `'dry-run'` or `'declined'`, and must call
|
|
122
122
|
* {@link appendHistory} only after the mutation succeeds (never on dry-run
|
|
123
123
|
* or decline).
|
|
@@ -132,8 +132,8 @@ export declare function confirmDestructive(input: DestructiveOpInput): Promise<D
|
|
|
132
132
|
*
|
|
133
133
|
* Call order matters: append only after the mutation succeeds, never
|
|
134
134
|
* pre-emptively, so rolled-back failures do not leave ghost entries. The log
|
|
135
|
-
* is append-only and advisory
|
|
136
|
-
*
|
|
135
|
+
* is append-only and advisory: no code path reads it back. It exists so
|
|
136
|
+
* operators have a post-hoc audit trail when something goes wrong.
|
|
137
137
|
*
|
|
138
138
|
* @param patchesDir - Path to the patches directory
|
|
139
139
|
* @param entry - Serializable history record
|
|
@@ -40,7 +40,7 @@ function printConflicts(conflicts) {
|
|
|
40
40
|
}
|
|
41
41
|
}
|
|
42
42
|
/**
|
|
43
|
-
* True when
|
|
43
|
+
* True when both standard handles are real TTYs, i.e. an interactive prompt
|
|
44
44
|
* can actually be answered.
|
|
45
45
|
*
|
|
46
46
|
* Named for the condition rather than for confirmation specifically: many
|
|
@@ -50,7 +50,7 @@ function printConflicts(conflicts) {
|
|
|
50
50
|
* Node types `isTTY` as `boolean`, but at runtime it is `true | undefined`
|
|
51
51
|
* (absent when the handle is not a TTY). Unusual harnesses (vitest stdio
|
|
52
52
|
* capture, CI spawners, mocked pipes) can also leave it unset on only one
|
|
53
|
-
* handle, so every falsy variant
|
|
53
|
+
* handle, so every falsy variant (false, undefined, a null-patched mock)
|
|
54
54
|
* must route to the non-interactive path.
|
|
55
55
|
*/
|
|
56
56
|
export function stdioIsInteractive() {
|
|
@@ -59,11 +59,11 @@ export function stdioIsInteractive() {
|
|
|
59
59
|
return stdinIsTTY === true && stdoutIsTTY === true;
|
|
60
60
|
}
|
|
61
61
|
/**
|
|
62
|
-
*
|
|
62
|
+
* Up-front non-interactive refusal for a command that will end at
|
|
63
63
|
* {@link confirmDestructive}.
|
|
64
64
|
*
|
|
65
65
|
* `confirmDestructive` already refuses a prompt-less run rather than
|
|
66
|
-
* proceeding silently
|
|
66
|
+
* proceeding silently, but it does so at the end, after the command has
|
|
67
67
|
* built diffs and run projected per-patch lint. On `patch move-files
|
|
68
68
|
* --create` that is minutes of work before a scripted run learns it needed
|
|
69
69
|
* `--yes`, and the failure reads as an obscure late error rather than a
|
|
@@ -90,7 +90,7 @@ export function assertConfirmationAvailable(operation, options) {
|
|
|
90
90
|
* Executes the destructive-operation contract: summary → conflict refusal →
|
|
91
91
|
* dry-run / force / prompt / non-TTY refusal.
|
|
92
92
|
*
|
|
93
|
-
* Returns the decision for the caller to act on
|
|
93
|
+
* Returns the decision for the caller to act on. Callers must not execute
|
|
94
94
|
* the mutation when the result is `'dry-run'` or `'declined'`, and must call
|
|
95
95
|
* {@link appendHistory} only after the mutation succeeds (never on dry-run
|
|
96
96
|
* or decline).
|
|
@@ -146,8 +146,8 @@ export async function confirmDestructive(input) {
|
|
|
146
146
|
message: `${title} — proceed?`,
|
|
147
147
|
initialValue: false,
|
|
148
148
|
});
|
|
149
|
-
// An
|
|
150
|
-
// exit code. Esc / Ctrl+C is a real interrupt
|
|
149
|
+
// An interrupt and a "no" are different outcomes and must not share an
|
|
150
|
+
// exit code. Esc / Ctrl+C is a real interrupt. 130 is 128+SIGINT and is
|
|
151
151
|
// what a script needs to tell "the operator aborted" from "the operator
|
|
152
152
|
// considered it and declined". Answering "no" is a successful run.
|
|
153
153
|
//
|
|
@@ -165,8 +165,8 @@ export async function confirmDestructive(input) {
|
|
|
165
165
|
*
|
|
166
166
|
* Call order matters: append only after the mutation succeeds, never
|
|
167
167
|
* pre-emptively, so rolled-back failures do not leave ghost entries. The log
|
|
168
|
-
* is append-only and advisory
|
|
169
|
-
*
|
|
168
|
+
* is append-only and advisory: no code path reads it back. It exists so
|
|
169
|
+
* operators have a post-hoc audit trail when something goes wrong.
|
|
170
170
|
*
|
|
171
171
|
* @param patchesDir - Path to the patches directory
|
|
172
172
|
* @param entry - Serializable history record
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* An edit op produced by {@link computeLineDiff}. Indices are 0-based into the
|
|
3
|
-
* source line arrays
|
|
3
|
+
* source line arrays. `line` holds the verbatim text so callers do not have to
|
|
4
4
|
* keep the input arrays around while rendering.
|
|
5
5
|
*/
|
|
6
6
|
export interface LineDiffOp {
|
|
@@ -60,7 +60,7 @@ export declare function buildHunks(ops: readonly LineDiffOp[], context: number):
|
|
|
60
60
|
/**
|
|
61
61
|
* Computes a multi-hunk line diff between two strings. This is the public
|
|
62
62
|
* entry point that {@link furnaceDiffCommand} uses. On normal inputs this
|
|
63
|
-
* runs the exact LCS path and returns a proper multi-hunk diff
|
|
63
|
+
* runs the exact LCS path and returns a proper multi-hunk diff. On inputs
|
|
64
64
|
* that exceed {@link LCS_LINE_LIMIT} it falls back to a single coalesced
|
|
65
65
|
* hunk so the command stays useful instead of OOMing.
|
|
66
66
|
*/
|
|
@@ -5,7 +5,7 @@ import { assert, expectDefined } from '../utils/assert.js';
|
|
|
5
5
|
* O(m·n) diff and falling back to the simpler single-region coalesce. Chosen
|
|
6
6
|
* so the worst-case Int32Array allocation stays under ~16 MB. Typical
|
|
7
7
|
* Firefox widget files are a few hundred lines, so the fast path handles the
|
|
8
|
-
* everyday case
|
|
8
|
+
* everyday case. The fallback keeps the command usable on a very large file.
|
|
9
9
|
*/
|
|
10
10
|
const LCS_LINE_LIMIT = 2000;
|
|
11
11
|
/** Splits a string on `\n`, discarding a single trailing empty line from a terminal newline. */
|
|
@@ -31,7 +31,7 @@ export function computeLineDiff(oldLines, newLines) {
|
|
|
31
31
|
// The DP below indexes `dp`, `oldLines`, and `newLines` about 4·m·n times
|
|
32
32
|
// for a worst-case pair, so its bounds are established once here rather
|
|
33
33
|
// than re-checked per access. Callers gate on LCS_LINE_LIMIT before
|
|
34
|
-
// reaching this function
|
|
34
|
+
// reaching this function. If that gate is ever moved or removed, this is
|
|
35
35
|
// where the resulting allocation blow-up surfaces as a named failure
|
|
36
36
|
// instead of an out-of-memory crash.
|
|
37
37
|
assert(m <= LCS_LINE_LIMIT && n <= LCS_LINE_LIMIT, () => `line diff inputs are within LCS_LINE_LIMIT (got ${m}x${n}, limit ${LCS_LINE_LIMIT})`);
|
|
@@ -48,7 +48,7 @@ export function computeLineDiff(oldLines, newLines) {
|
|
|
48
48
|
* above, so the non-null assertions encode a property already checked
|
|
49
49
|
* once per call rather than one that is never checked at all. The
|
|
50
50
|
* rendering loops further down, which run O(ops), use `expectDefined`
|
|
51
|
-
* instead
|
|
51
|
+
* instead. This exemption is for the quadratic block only.
|
|
52
52
|
*/
|
|
53
53
|
for (let i = 1; i <= m; i++) {
|
|
54
54
|
const oldLine = oldLines[i - 1];
|
|
@@ -184,8 +184,8 @@ export function buildHunks(ops, context) {
|
|
|
184
184
|
* Fallback for inputs that exceed {@link LCS_LINE_LIMIT}. Reproduces the
|
|
185
185
|
* original single-region coalesce: match the common prefix and suffix, then
|
|
186
186
|
* emit one hunk containing the middle region plus `context` lines on each
|
|
187
|
-
* side.
|
|
188
|
-
* only keeps the command usable on pathologically large inputs without
|
|
187
|
+
* side. Kept simple on purpose: the fast path handles normal files, and
|
|
188
|
+
* this only keeps the command usable on pathologically large inputs without
|
|
189
189
|
* allocating a huge DP table.
|
|
190
190
|
*/
|
|
191
191
|
function coalescedHunk(oldLines, newLines, context) {
|
|
@@ -218,7 +218,7 @@ function coalescedHunk(oldLines, newLines, context) {
|
|
|
218
218
|
for (let k = firstDiff; k <= lastNewDiff; k++) {
|
|
219
219
|
hunkLines.push({ marker: '+', content: expectDefined(newLines[k], () => `new line ${k}`) });
|
|
220
220
|
}
|
|
221
|
-
// Trailing context comes from the common suffix, which lives at
|
|
221
|
+
// Trailing context comes from the common suffix, which lives at different
|
|
222
222
|
// indices on each side (lastOldDiff+1… vs lastNewDiff+1…). Mixing the two
|
|
223
223
|
// coordinate spaces emits wrong context on asymmetric edits and drops the
|
|
224
224
|
// trailing lines from the @@ header lengths, so the rendered header
|
|
@@ -245,7 +245,7 @@ function coalescedHunk(oldLines, newLines, context) {
|
|
|
245
245
|
/**
|
|
246
246
|
* Computes a multi-hunk line diff between two strings. This is the public
|
|
247
247
|
* entry point that {@link furnaceDiffCommand} uses. On normal inputs this
|
|
248
|
-
* runs the exact LCS path and returns a proper multi-hunk diff
|
|
248
|
+
* runs the exact LCS path and returns a proper multi-hunk diff. On inputs
|
|
249
249
|
* that exceed {@link LCS_LINE_LIMIT} it falls back to a single coalesced
|
|
250
250
|
* hunk so the command stays useful instead of OOMing.
|
|
251
251
|
*/
|
|
@@ -2,15 +2,15 @@
|
|
|
2
2
|
* Patch-aware restore planning for `fireforge discard`.
|
|
3
3
|
*
|
|
4
4
|
* The engine convention is: HEAD = pristine upstream Firefox, and the
|
|
5
|
-
* applied patch queue lives as
|
|
5
|
+
* applied patch queue lives as uncommitted worktree changes on top of it
|
|
6
6
|
* (`git apply` without `--index` → patch-edited tracked files are unstaged
|
|
7
7
|
* modifications, patch-created files are untracked). A purely git-mechanical
|
|
8
|
-
* discard
|
|
9
|
-
* patch-backed files
|
|
8
|
+
* discard (restore to HEAD, delete untracked files) therefore reverts
|
|
9
|
+
* patch-backed files past their owning patch and deletes patch-created files
|
|
10
10
|
* outright.
|
|
11
11
|
*
|
|
12
12
|
* This module classifies each status entry against the patch manifest's
|
|
13
|
-
* ownership claims and plans the correct restore target: the
|
|
13
|
+
* ownership claims and plans the correct restore target: the patch-applied
|
|
14
14
|
* baseline (HEAD content folded through every affecting patch in order) for
|
|
15
15
|
* claimed files, and the plain git mechanics for unmanaged ones.
|
|
16
16
|
*/
|
|
@@ -25,22 +25,22 @@ export interface DiscardBaselinePlan {
|
|
|
25
25
|
owners: string[];
|
|
26
26
|
/** True when more than one patch claims the path (ownership conflict). */
|
|
27
27
|
conflicted: boolean;
|
|
28
|
-
/** Baseline content for `entry.file
|
|
28
|
+
/** Baseline content for `entry.file` (null = absent at baseline). Unset for 'unmanaged'. */
|
|
29
29
|
expectedContent?: string | null;
|
|
30
30
|
/** Rename/copy only: baseline content for `originalPath` when that side is claimed. */
|
|
31
31
|
expectedOriginalContent?: string | null;
|
|
32
32
|
}
|
|
33
|
-
/** Builds an all-unmanaged plan set
|
|
33
|
+
/** Builds an all-unmanaged plan set, the `--to-upstream` (legacy) shape. */
|
|
34
34
|
export declare function planUpstreamDiscards(entries: readonly GitStatusEntry[]): DiscardBaselinePlan[];
|
|
35
35
|
/**
|
|
36
36
|
* Plans the restore target for each status entry. Entries claimed by the
|
|
37
|
-
* patch manifest restore to the patch-applied baseline
|
|
37
|
+
* patch manifest restore to the patch-applied baseline. Unclaimed entries
|
|
38
38
|
* keep the plain git mechanics. A missing patches dir or empty manifest
|
|
39
39
|
* degrades every plan to `unmanaged`.
|
|
40
40
|
*
|
|
41
|
-
* A corrupt manifest or an unreconstructible patch baseline
|
|
42
|
-
* GeneralError naming `--to-upstream
|
|
43
|
-
* HEAD is
|
|
41
|
+
* A corrupt manifest or an unreconstructible patch baseline refuses with a
|
|
42
|
+
* GeneralError naming `--to-upstream`. Silently falling back to pristine
|
|
43
|
+
* HEAD is the data-loss path this module exists to close.
|
|
44
44
|
*/
|
|
45
45
|
export declare function planDiscardBaselines(patchesDir: string, engineDir: string, entries: readonly GitStatusEntry[]): Promise<DiscardBaselinePlan[]>;
|
|
46
46
|
/**
|