@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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Type of the last-build baseline marker, split out of `build-baseline.ts`
|
|
3
3
|
* so its consumers (`build-audit`, `build-prepare`, `test-stale-check`) can
|
|
4
|
-
* import the shape without importing the I/O module
|
|
4
|
+
* import the shape without importing the I/O module. `build-baseline.ts`
|
|
5
5
|
* itself depends on `build-audit.ts` at runtime, and a type import back
|
|
6
6
|
* into it would make the dependency graph cyclic.
|
|
7
7
|
*/
|
|
@@ -11,7 +11,7 @@ export interface BuildBaseline {
|
|
|
11
11
|
/** SHA of engine HEAD at the time the build succeeded. */
|
|
12
12
|
engineHeadSha: string;
|
|
13
13
|
/**
|
|
14
|
-
* ISO-8601 timestamp of when the baseline was recorded. Informational
|
|
14
|
+
* ISO-8601 timestamp of when the baseline was recorded. Informational:
|
|
15
15
|
* downstream code keys off `engineHeadSha` for diffs, but the timestamp
|
|
16
16
|
* helps operators reason about stale markers.
|
|
17
17
|
*/
|
|
@@ -46,19 +46,20 @@ export interface BuildBaseline {
|
|
|
46
46
|
* neither re-runs `mach configure` nor escalates a pre-test build to a
|
|
47
47
|
* full `mach build`. Without this the persistent worktree diff every
|
|
48
48
|
* fork carries (imported patches + Furnace-applied components) made a
|
|
49
|
-
* patch-touched `jar.mn` "changed" on
|
|
49
|
+
* patch-touched `jar.mn` "changed" on every run, and each `test --build`
|
|
50
50
|
* after a full build paid the full build again.
|
|
51
51
|
*
|
|
52
52
|
* Refresh rules, per entry kind:
|
|
53
53
|
* - backend inputs (`moz.build` & co) are refreshed on every successful
|
|
54
|
-
* write
|
|
55
|
-
* against the previous baseline, so a changed one was
|
|
56
|
-
*
|
|
54
|
+
* write, because every baseline-writing path ran the auto-configure
|
|
55
|
+
* preflight against the previous baseline, so a changed one was
|
|
56
|
+
* reconfigured.
|
|
57
|
+
* - `jar.mn` entries are refreshed only by a full build and carried
|
|
57
58
|
* forward verbatim from the previous record on a `faster` write, since
|
|
58
59
|
* `fireforge build --ui` never escalates and recording a `jar.mn` no
|
|
59
60
|
* full build has installed would hide the next escalation.
|
|
60
61
|
*
|
|
61
|
-
* Absent on baselines written before the field existed
|
|
62
|
+
* Absent on baselines written before the field existed. `build-prepare`
|
|
62
63
|
* then falls back to the path-only comparison (every dirty build input
|
|
63
64
|
* counts as changed).
|
|
64
65
|
*/
|
|
@@ -66,7 +67,7 @@ export interface BuildBaseline {
|
|
|
66
67
|
/**
|
|
67
68
|
* What the packaged test runtime produced by the recorded build covers.
|
|
68
69
|
*
|
|
69
|
-
* - `'full'`: the build packaged the full test set
|
|
70
|
+
* - `'full'`: the build packaged the full test set, written by
|
|
70
71
|
* `fireforge build` / `build --ui` and by a path-less
|
|
71
72
|
* `fireforge test --build` (full-suite run).
|
|
72
73
|
* - `string[]`: engine-relative POSIX request paths of the file/directory-
|
|
@@ -83,15 +84,15 @@ export interface BuildBaseline {
|
|
|
83
84
|
* most one obj dir exists per project.
|
|
84
85
|
*
|
|
85
86
|
* Union/"shared coverage" across successive scoped builds is unsound in
|
|
86
|
-
* general
|
|
87
|
-
*
|
|
87
|
+
* general: every baseline write refreshes `packageableFingerprints` for
|
|
88
|
+
* all dirty packageable paths, so a blind union would whitewash an
|
|
88
89
|
* earlier scope's edited fixtures while `obj-*`/`_tests/` still holds its
|
|
89
|
-
* stale staging. Coverage therefore
|
|
90
|
+
* stale staging. Coverage therefore replaces by default.
|
|
90
91
|
*
|
|
91
92
|
* The one exception is `test --build --extend-coverage`, which unions only
|
|
92
93
|
* after proving the previous record's anchor still holds: same engine
|
|
93
94
|
* HEAD, same {@link BuildBaseline.mozconfigHash}, and every previously
|
|
94
|
-
* fingerprinted path byte-identical
|
|
95
|
+
* fingerprinted path byte-identical, i.e. the wholesale fingerprint
|
|
95
96
|
* refresh is a no-op for everything the earlier scope's staging depended
|
|
96
97
|
* on. Any divergence refuses fail-closed. See `src/core/coverage-extend.ts`
|
|
97
98
|
* for the one boundary that guard does not cover (dirty non-packageable
|
|
@@ -100,7 +101,7 @@ export interface BuildBaseline {
|
|
|
100
101
|
testPackagingCoverage?: TestPackagingCoverage;
|
|
101
102
|
/**
|
|
102
103
|
* Hex-encoded SHA-256 of `engine/mozconfig` as it stood for this build.
|
|
103
|
-
* Recorded because the mozconfig is
|
|
104
|
+
* Recorded because the mozconfig is regenerated from project-side
|
|
104
105
|
* `configs/*.mozconfig` templates plus `fireforge.json` on every build, so
|
|
105
106
|
* `engineHeadSha` does not cover it: two builds at the same engine SHA can
|
|
106
107
|
* configure differently. Consumed by the `--extend-coverage` anchor, which
|
|
@@ -109,10 +110,10 @@ export interface BuildBaseline {
|
|
|
109
110
|
mozconfigHash?: string;
|
|
110
111
|
/**
|
|
111
112
|
* Anchor for the compiled StaticComponents table: the engine HEAD SHA of
|
|
112
|
-
* the last
|
|
113
|
+
* the last full-coverage build plus content fingerprints of the
|
|
113
114
|
* `components.conf` manifests that were dirty at that moment. Written
|
|
114
|
-
* fresh only on
|
|
115
|
-
* `build --ui`, path-less `test --build`)
|
|
115
|
+
* fresh only on full-coverage baseline writes (`fireforge build`,
|
|
116
|
+
* `build --ui`, path-less `test --build`). A scoped `test --build` carries
|
|
116
117
|
* the previous record forward verbatim, because `mach build faster` does
|
|
117
118
|
* not rebake `components.conf` registrations into the compiled table. When
|
|
118
119
|
* absent, the static-components stale check degrades to "fresh".
|
|
@@ -121,13 +122,13 @@ export interface BuildBaseline {
|
|
|
121
122
|
/**
|
|
122
123
|
* Invocation shape that recorded this baseline (`'fireforge build'`,
|
|
123
124
|
* `'fireforge build --ui'`, `'fireforge test --build [paths]'`).
|
|
124
|
-
* Informational
|
|
125
|
+
* Informational, surfaced by `fireforge status --test-coverage`. Render
|
|
125
126
|
* as "unknown" when absent.
|
|
126
127
|
*/
|
|
127
128
|
recordedBy?: string;
|
|
128
129
|
}
|
|
129
130
|
/**
|
|
130
|
-
* State of the engine at the last
|
|
131
|
+
* State of the engine at the last full build, as far as compiled-in XPCOM
|
|
131
132
|
* component registration is concerned. See
|
|
132
133
|
* {@link BuildBaseline.staticComponentsBaseline}.
|
|
133
134
|
*/
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Type of the last-build baseline marker, split out of `build-baseline.ts`
|
|
4
4
|
* so its consumers (`build-audit`, `build-prepare`, `test-stale-check`) can
|
|
5
|
-
* import the shape without importing the I/O module
|
|
5
|
+
* import the shape without importing the I/O module. `build-baseline.ts`
|
|
6
6
|
* itself depends on `build-audit.ts` at runtime, and a type import back
|
|
7
7
|
* into it would make the dependency graph cyclic.
|
|
8
8
|
*/
|
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* recursive-make backend isn't stale.
|
|
13
13
|
*
|
|
14
14
|
* The marker lives under `.fireforge/last-build.json`. It is written only
|
|
15
|
-
* on successful build completion
|
|
15
|
+
* on successful build completion. A failed build does not update it, so a
|
|
16
16
|
* subsequent run still audits against the last known-good tree.
|
|
17
17
|
*/
|
|
18
18
|
import { type BuildBaseline, type TestPackagingCoverage } from './build-baseline-types.js';
|
|
@@ -21,12 +21,10 @@ import { type BuildBaseline, type TestPackagingCoverage } from './build-baseline
|
|
|
21
21
|
* the `jar.mn` half of {@link BuildBaseline.buildInputFingerprints} is
|
|
22
22
|
* refreshed (`'full'`) or carried forward from the previous record
|
|
23
23
|
* (`'faster'`). `fireforge build --ui` and a non-escalated `test --build`
|
|
24
|
-
* are `'faster'
|
|
24
|
+
* are `'faster'`. `fireforge build` and an escalated `test --build` are
|
|
25
25
|
* `'full'`.
|
|
26
26
|
*/
|
|
27
27
|
export type BaselineBuildKind = 'full' | 'faster';
|
|
28
|
-
/** Name of the last-build marker file under `.fireforge/`. */
|
|
29
|
-
export declare const BUILD_BASELINE_FILENAME = "last-build.json";
|
|
30
28
|
/**
|
|
31
29
|
* Resolves the on-disk path of the build baseline marker.
|
|
32
30
|
* @param projectRoot - Root directory of the project
|
|
@@ -35,41 +33,60 @@ export declare const BUILD_BASELINE_FILENAME = "last-build.json";
|
|
|
35
33
|
export declare function getBuildBaselinePath(projectRoot: string): string;
|
|
36
34
|
/**
|
|
37
35
|
* Reads the last-build baseline if present. Returns undefined when no
|
|
38
|
-
* previous successful build has been recorded
|
|
36
|
+
* previous successful build has been recorded. Callers must tolerate that
|
|
39
37
|
* path (first build, cleaned workspace).
|
|
40
38
|
* @param projectRoot - Root directory of the project
|
|
41
39
|
*/
|
|
42
40
|
export declare function readBuildBaseline(projectRoot: string): Promise<BuildBaseline | undefined>;
|
|
41
|
+
export interface WriteBuildBaselineOptions {
|
|
42
|
+
/** Root directory of the project. */
|
|
43
|
+
projectRoot: string;
|
|
44
|
+
/** Path to the engine directory. */
|
|
45
|
+
engineDir: string;
|
|
46
|
+
/** Current `binaryName` from fireforge.json. */
|
|
47
|
+
binaryName: string;
|
|
48
|
+
/**
|
|
49
|
+
* Coverage claim of the packaged test runtime this build produced
|
|
50
|
+
* (`'full'`, or the scoped request paths of a `test --build` invocation).
|
|
51
|
+
* Omitted → field left off the marker.
|
|
52
|
+
*/
|
|
53
|
+
testPackagingCoverage?: TestPackagingCoverage | undefined;
|
|
54
|
+
/**
|
|
55
|
+
* The baseline this write replaces, when the caller has it. A scoped
|
|
56
|
+
* (non-`'full'`) write carries its `staticComponentsBaseline` forward
|
|
57
|
+
* verbatim, because `mach build faster` does not rebake `components.conf`
|
|
58
|
+
* registrations, so the last full build stays the anchor for the
|
|
59
|
+
* compiled StaticComponents table.
|
|
60
|
+
*/
|
|
61
|
+
previousBaseline?: BuildBaseline | undefined;
|
|
62
|
+
/** Invocation shape that produced this baseline. */
|
|
63
|
+
recordedBy?: string | undefined;
|
|
64
|
+
/**
|
|
65
|
+
* `'auto'` (default) refreshes the static-components anchor whenever the
|
|
66
|
+
* coverage claim is `'full'` or absent. `'refresh'` records it even for a
|
|
67
|
+
* scoped coverage claim whose implementation escalated to a full build.
|
|
68
|
+
* `'carry-forward'` always keeps the previous anchor: needed by
|
|
69
|
+
* `--extend-coverage`, whose union can evaluate to `'full'` while the
|
|
70
|
+
* build that produced it was still a scoped `mach build faster` that did
|
|
71
|
+
* not rebake the compiled table.
|
|
72
|
+
*/
|
|
73
|
+
staticComponentsHandling?: 'auto' | 'refresh' | 'carry-forward' | undefined;
|
|
74
|
+
/**
|
|
75
|
+
* Which mach build produced this baseline (default `'full'`). A
|
|
76
|
+
* `'faster'` write carries the previous record's `jar.mn` fingerprints
|
|
77
|
+
* forward instead of refreshing them. See
|
|
78
|
+
* {@link BuildBaseline.buildInputFingerprints}. Every caller that ran
|
|
79
|
+
* `mach build faster` must say so, or the next pre-test build skips an
|
|
80
|
+
* escalation no full build has honoured.
|
|
81
|
+
*/
|
|
82
|
+
buildKind?: BaselineBuildKind | undefined;
|
|
83
|
+
}
|
|
43
84
|
/**
|
|
44
85
|
* Records a successful build by writing a fresh baseline marker. Captures
|
|
45
86
|
* engine HEAD SHA (or an empty string when the engine has no HEAD yet) and
|
|
46
87
|
* the current binaryName. Caller is responsible for only invoking this
|
|
47
88
|
* after the build exit code was zero.
|
|
48
89
|
*
|
|
49
|
-
* @param
|
|
50
|
-
* @param engineDir - Path to the engine directory
|
|
51
|
-
* @param binaryName - Current `binaryName` from fireforge.json
|
|
52
|
-
* @param testPackagingCoverage - Coverage claim of the packaged test
|
|
53
|
-
* runtime this build produced (`'full'`, or the scoped request paths of
|
|
54
|
-
* a `test --build` invocation). Omitted → field left off the marker.
|
|
55
|
-
* @param previousBaseline - The baseline this write replaces, when the
|
|
56
|
-
* caller has it. A scoped (non-`'full'`) write carries its
|
|
57
|
-
* `staticComponentsBaseline` forward verbatim — `mach build faster`
|
|
58
|
-
* does not rebake `components.conf` registrations, so the last FULL
|
|
59
|
-
* build stays the honest anchor for the compiled StaticComponents table.
|
|
60
|
-
* @param recordedBy - Invocation shape that produced this baseline.
|
|
61
|
-
* @param staticComponentsHandling - `'auto'` (default) refreshes the
|
|
62
|
-
* static-components anchor whenever the coverage claim is `'full'` or
|
|
63
|
-
* absent. `'refresh'` records it even for a scoped coverage claim whose
|
|
64
|
-
* implementation escalated to a full build. `'carry-forward'` always
|
|
65
|
-
* keeps the previous anchor: needed by `--extend-coverage`, whose union
|
|
66
|
-
* can EVALUATE to `'full'` while the build that produced it was still a
|
|
67
|
-
* scoped `mach build faster` that did not rebake the compiled table.
|
|
68
|
-
* @param buildKind - Which mach build produced this baseline (default
|
|
69
|
-
* `'full'`). A `'faster'` write carries the previous record's `jar.mn`
|
|
70
|
-
* fingerprints forward instead of refreshing them — see
|
|
71
|
-
* {@link BuildBaseline.buildInputFingerprints}. Every caller that ran
|
|
72
|
-
* `mach build faster` MUST say so, or the next pre-test build skips an
|
|
73
|
-
* escalation no full build has honoured.
|
|
90
|
+
* @param options - See {@link WriteBuildBaselineOptions}
|
|
74
91
|
*/
|
|
75
|
-
export declare function writeBuildBaseline(
|
|
92
|
+
export declare function writeBuildBaseline(options: WriteBuildBaselineOptions): Promise<void>;
|
|
@@ -13,15 +13,15 @@
|
|
|
13
13
|
* recursive-make backend isn't stale.
|
|
14
14
|
*
|
|
15
15
|
* The marker lives under `.fireforge/last-build.json`. It is written only
|
|
16
|
-
* on successful build completion
|
|
16
|
+
* on successful build completion. A failed build does not update it, so a
|
|
17
17
|
* subsequent run still audits against the last known-good tree.
|
|
18
18
|
*/
|
|
19
|
-
import { createHash } from 'node:crypto';
|
|
20
19
|
import { readFile } from 'node:fs/promises';
|
|
21
20
|
import { join } from 'node:path';
|
|
22
21
|
import { mapWithConcurrency } from '../utils/concurrency.js';
|
|
23
22
|
import { getNodeErrorCode, toError } from '../utils/errors.js';
|
|
24
23
|
import { pathExists, readJson, writeJson } from '../utils/fs.js';
|
|
24
|
+
import { sha256Hex } from '../utils/hash.js';
|
|
25
25
|
import { verbose } from '../utils/logger.js';
|
|
26
26
|
import { isBuildInputPath, isJarManifestPath, isPackageablePath, isXpcomManifestPath, } from './build-audit.js';
|
|
27
27
|
import { DELETED_FILE_FINGERPRINT, } from './build-baseline-types.js';
|
|
@@ -36,7 +36,7 @@ import { getUntrackedFiles } from './git-status.js';
|
|
|
36
36
|
*/
|
|
37
37
|
const FINGERPRINT_IO_CONCURRENCY = 16;
|
|
38
38
|
/** Name of the last-build marker file under `.fireforge/`. */
|
|
39
|
-
|
|
39
|
+
const BUILD_BASELINE_FILENAME = 'last-build.json';
|
|
40
40
|
/**
|
|
41
41
|
* Resolves the on-disk path of the build baseline marker.
|
|
42
42
|
* @param projectRoot - Root directory of the project
|
|
@@ -47,7 +47,7 @@ export function getBuildBaselinePath(projectRoot) {
|
|
|
47
47
|
}
|
|
48
48
|
/**
|
|
49
49
|
* Reads the last-build baseline if present. Returns undefined when no
|
|
50
|
-
* previous successful build has been recorded
|
|
50
|
+
* previous successful build has been recorded. Callers must tolerate that
|
|
51
51
|
* path (first build, cleaned workspace).
|
|
52
52
|
* @param projectRoot - Root directory of the project
|
|
53
53
|
*/
|
|
@@ -60,7 +60,7 @@ export async function readBuildBaseline(projectRoot) {
|
|
|
60
60
|
return await readJson(path);
|
|
61
61
|
}
|
|
62
62
|
catch {
|
|
63
|
-
// A corrupt marker is equivalent to no marker
|
|
63
|
+
// A corrupt marker is equivalent to no marker: the audit/auto-configure
|
|
64
64
|
// will treat it as "first build" rather than block on the inconsistency.
|
|
65
65
|
return undefined;
|
|
66
66
|
}
|
|
@@ -71,42 +71,19 @@ export async function readBuildBaseline(projectRoot) {
|
|
|
71
71
|
* the current binaryName. Caller is responsible for only invoking this
|
|
72
72
|
* after the build exit code was zero.
|
|
73
73
|
*
|
|
74
|
-
* @param
|
|
75
|
-
* @param engineDir - Path to the engine directory
|
|
76
|
-
* @param binaryName - Current `binaryName` from fireforge.json
|
|
77
|
-
* @param testPackagingCoverage - Coverage claim of the packaged test
|
|
78
|
-
* runtime this build produced (`'full'`, or the scoped request paths of
|
|
79
|
-
* a `test --build` invocation). Omitted → field left off the marker.
|
|
80
|
-
* @param previousBaseline - The baseline this write replaces, when the
|
|
81
|
-
* caller has it. A scoped (non-`'full'`) write carries its
|
|
82
|
-
* `staticComponentsBaseline` forward verbatim — `mach build faster`
|
|
83
|
-
* does not rebake `components.conf` registrations, so the last FULL
|
|
84
|
-
* build stays the honest anchor for the compiled StaticComponents table.
|
|
85
|
-
* @param recordedBy - Invocation shape that produced this baseline.
|
|
86
|
-
* @param staticComponentsHandling - `'auto'` (default) refreshes the
|
|
87
|
-
* static-components anchor whenever the coverage claim is `'full'` or
|
|
88
|
-
* absent. `'refresh'` records it even for a scoped coverage claim whose
|
|
89
|
-
* implementation escalated to a full build. `'carry-forward'` always
|
|
90
|
-
* keeps the previous anchor: needed by `--extend-coverage`, whose union
|
|
91
|
-
* can EVALUATE to `'full'` while the build that produced it was still a
|
|
92
|
-
* scoped `mach build faster` that did not rebake the compiled table.
|
|
93
|
-
* @param buildKind - Which mach build produced this baseline (default
|
|
94
|
-
* `'full'`). A `'faster'` write carries the previous record's `jar.mn`
|
|
95
|
-
* fingerprints forward instead of refreshing them — see
|
|
96
|
-
* {@link BuildBaseline.buildInputFingerprints}. Every caller that ran
|
|
97
|
-
* `mach build faster` MUST say so, or the next pre-test build skips an
|
|
98
|
-
* escalation no full build has honoured.
|
|
74
|
+
* @param options - See {@link WriteBuildBaselineOptions}
|
|
99
75
|
*/
|
|
100
|
-
export async function writeBuildBaseline(
|
|
76
|
+
export async function writeBuildBaseline(options) {
|
|
77
|
+
const { projectRoot, engineDir, binaryName, testPackagingCoverage, previousBaseline, recordedBy, staticComponentsHandling = 'auto', buildKind = 'full', } = options;
|
|
101
78
|
let engineHeadSha = '';
|
|
102
79
|
try {
|
|
103
80
|
engineHeadSha = await getHead(engineDir);
|
|
104
81
|
}
|
|
105
82
|
catch (error) {
|
|
106
|
-
// Engine may be an unborn branch (freshly cloned + reset, or
|
|
107
|
-
//
|
|
108
|
-
// behavior. Any other git failure is bubbled up
|
|
109
|
-
// silently write a garbage marker.
|
|
83
|
+
// Engine may be an unborn branch (freshly cloned + reset, or
|
|
84
|
+
// mid-import). Record an empty SHA and let downstream fall back to "no
|
|
85
|
+
// prior state" behavior. Any other git failure is bubbled up, because
|
|
86
|
+
// we don't want to silently write a garbage marker.
|
|
110
87
|
if (!isMissingHeadError(error)) {
|
|
111
88
|
throw error;
|
|
112
89
|
}
|
|
@@ -115,7 +92,7 @@ export async function writeBuildBaseline(projectRoot, engineDir, binaryName, tes
|
|
|
115
92
|
const buildInputFingerprints = await collectBuildInputFingerprints(engineDir, previousBaseline, buildKind);
|
|
116
93
|
// A full-coverage write (and the legacy no-claim `fireforge build` shape)
|
|
117
94
|
// just recompiled the StaticComponents table, so it anchors the table to
|
|
118
|
-
// the current engine state. A scoped write did not
|
|
95
|
+
// the current engine state. A scoped write did not, so carry the previous
|
|
119
96
|
// anchor forward verbatim.
|
|
120
97
|
const staticComponentsBaseline = staticComponentsHandling === 'refresh' ||
|
|
121
98
|
(staticComponentsHandling === 'auto' &&
|
|
@@ -145,7 +122,7 @@ export async function writeBuildBaseline(projectRoot, engineDir, binaryName, tes
|
|
|
145
122
|
* or new one means the file is genuinely stale.
|
|
146
123
|
*
|
|
147
124
|
* Returns `undefined` on any git failure so a broken probe never corrupts
|
|
148
|
-
* the on-disk baseline with `{}
|
|
125
|
+
* the on-disk baseline with `{}`. The stale-check then falls back to a
|
|
149
126
|
* path-only comparison.
|
|
150
127
|
*/
|
|
151
128
|
async function collectPackageableFingerprints(engineDir) {
|
|
@@ -156,9 +133,9 @@ async function collectPackageableFingerprints(engineDir) {
|
|
|
156
133
|
* ({@link isBuildInputPath}) this build consumed. Backend inputs
|
|
157
134
|
* (`moz.build` & co) are always taken from the live tree: the
|
|
158
135
|
* auto-configure preflight reconfigured against them before this build
|
|
159
|
-
* ran. `jar.mn` entries are taken from the live tree only after a
|
|
160
|
-
* build
|
|
161
|
-
* forward verbatim, because `mach build faster` is
|
|
136
|
+
* ran. `jar.mn` entries are taken from the live tree only after a full
|
|
137
|
+
* build. A `faster` write carries the previous record's `jar.mn` entries
|
|
138
|
+
* forward verbatim, because `mach build faster` is the build the
|
|
162
139
|
* `jar.mn` escalation exists to bypass, and recording a `jar.mn` it did
|
|
163
140
|
* not install would silence the next escalation. Returns `undefined` on
|
|
164
141
|
* probe failure so the field is omitted rather than written as `{}`.
|
|
@@ -182,7 +159,7 @@ async function collectBuildInputFingerprints(engineDir, previousBaseline, buildK
|
|
|
182
159
|
/**
|
|
183
160
|
* Anchor for the compiled StaticComponents table: the engine HEAD SHA of
|
|
184
161
|
* this (full) build plus content fingerprints of the `components.conf`
|
|
185
|
-
* manifests dirty right now
|
|
162
|
+
* manifests dirty right now, using the same dirty-path probe family as
|
|
186
163
|
* {@link collectPackageableFingerprints}, filtered to XPCOM manifests.
|
|
187
164
|
* Returns `undefined` on probe failure so a broken probe omits the field
|
|
188
165
|
* (the static-components stale check then degrades to "fresh") rather than
|
|
@@ -224,7 +201,7 @@ async function collectDirtyFingerprints(engineDir, includePath, contextLabel) {
|
|
|
224
201
|
const entries = await mapWithConcurrency(included, FINGERPRINT_IO_CONCURRENCY, async (relPath) => {
|
|
225
202
|
try {
|
|
226
203
|
const buffer = await readFile(join(engineDir, relPath));
|
|
227
|
-
return [relPath,
|
|
204
|
+
return [relPath, sha256Hex(buffer)];
|
|
228
205
|
}
|
|
229
206
|
catch (fileError) {
|
|
230
207
|
if (getNodeErrorCode(fileError) === 'ENOENT') {
|
|
@@ -234,7 +211,7 @@ async function collectDirtyFingerprints(engineDir, includePath, contextLabel) {
|
|
|
234
211
|
return [relPath, DELETED_FILE_FINGERPRINT];
|
|
235
212
|
}
|
|
236
213
|
// A file that disappeared between status probe and hash is
|
|
237
|
-
// expected in concurrent scenarios
|
|
214
|
+
// expected in concurrent scenarios. Non-ENOENT failures remain
|
|
238
215
|
// untrusted and are skipped without failing the whole baseline write.
|
|
239
216
|
verbose(`Build baseline: skipping ${contextLabel} for ${relPath} — ${toError(fileError).message}`);
|
|
240
217
|
return undefined;
|
|
@@ -3,19 +3,19 @@
|
|
|
3
3
|
* escalate from `mach build faster` to a full `mach build`.
|
|
4
4
|
*
|
|
5
5
|
* The 0.41.0 rule was `any changed jar.mn ⇒ full build`, which costs ~10
|
|
6
|
-
* minutes against ~20 s for a chrome-only slice and is paid
|
|
6
|
+
* minutes against ~20 s for a chrome-only slice and is paid twice per
|
|
7
7
|
* green/no-change pair on a Furnace-touching slice. A downstream experiment
|
|
8
8
|
* (two clean runs, 2026-08-29, against 0.44.4) showed the rule is over-broad
|
|
9
|
-
* for the common case: a jar-only registration of a
|
|
10
|
-
* to an
|
|
11
|
-
* `fireforge build --ui` both times
|
|
9
|
+
* for the common case: a jar-only registration of a new content file added
|
|
10
|
+
* to an existing `dist/bin` manifest was installed by a plain
|
|
11
|
+
* `fireforge build --ui` both times: `faster/install_dist_bin_browser` named
|
|
12
12
|
* the destination, the file landed in `dist/bin/…/content/browser/` and in
|
|
13
13
|
* the `.app` bundle, and a plain `fireforge test` fetched it over
|
|
14
14
|
* `chrome://` at runtime. Neither run escalated, and neither needed to.
|
|
15
15
|
*
|
|
16
|
-
* What the experiment did
|
|
16
|
+
* What the experiment did not exercise, and what therefore still escalates:
|
|
17
17
|
*
|
|
18
|
-
* - a
|
|
18
|
+
* - a new `jar.mn` file. The install manifest for a manifest the backend
|
|
19
19
|
* has never seen does not exist yet, and `mach build faster` consumes
|
|
20
20
|
* install manifests rather than regenerating the backend that writes
|
|
21
21
|
* them.
|
|
@@ -42,7 +42,7 @@ export interface JarEscalationDecision {
|
|
|
42
42
|
escalate: boolean;
|
|
43
43
|
/** One entry per manifest that forces the escalation. */
|
|
44
44
|
causes: JarEscalationCause[];
|
|
45
|
-
/** Manifests the narrowing cleared
|
|
45
|
+
/** Manifests the narrowing cleared. Kept for the verbose explanation. */
|
|
46
46
|
cleared: string[];
|
|
47
47
|
}
|
|
48
48
|
/**
|
|
@@ -57,7 +57,7 @@ export interface JarEscalationDecision {
|
|
|
57
57
|
*/
|
|
58
58
|
export declare function evaluateJarManifestEscalation(engineDir: string, changedPaths: readonly string[], baseline: BuildBaseline | undefined): Promise<JarEscalationDecision>;
|
|
59
59
|
/**
|
|
60
|
-
* Renders the operator-facing escalation notice. Names the manifest
|
|
60
|
+
* Renders the operator-facing escalation notice. Names the manifest and the
|
|
61
61
|
* reason: "a jar.mn changed" is the sentence that made the previous rule
|
|
62
62
|
* impossible to argue with from outside.
|
|
63
63
|
*/
|
|
@@ -4,19 +4,19 @@
|
|
|
4
4
|
* escalate from `mach build faster` to a full `mach build`.
|
|
5
5
|
*
|
|
6
6
|
* The 0.41.0 rule was `any changed jar.mn ⇒ full build`, which costs ~10
|
|
7
|
-
* minutes against ~20 s for a chrome-only slice and is paid
|
|
7
|
+
* minutes against ~20 s for a chrome-only slice and is paid twice per
|
|
8
8
|
* green/no-change pair on a Furnace-touching slice. A downstream experiment
|
|
9
9
|
* (two clean runs, 2026-08-29, against 0.44.4) showed the rule is over-broad
|
|
10
|
-
* for the common case: a jar-only registration of a
|
|
11
|
-
* to an
|
|
12
|
-
* `fireforge build --ui` both times
|
|
10
|
+
* for the common case: a jar-only registration of a new content file added
|
|
11
|
+
* to an existing `dist/bin` manifest was installed by a plain
|
|
12
|
+
* `fireforge build --ui` both times: `faster/install_dist_bin_browser` named
|
|
13
13
|
* the destination, the file landed in `dist/bin/…/content/browser/` and in
|
|
14
14
|
* the `.app` bundle, and a plain `fireforge test` fetched it over
|
|
15
15
|
* `chrome://` at runtime. Neither run escalated, and neither needed to.
|
|
16
16
|
*
|
|
17
|
-
* What the experiment did
|
|
17
|
+
* What the experiment did not exercise, and what therefore still escalates:
|
|
18
18
|
*
|
|
19
|
-
* - a
|
|
19
|
+
* - a new `jar.mn` file. The install manifest for a manifest the backend
|
|
20
20
|
* has never seen does not exist yet, and `mach build faster` consumes
|
|
21
21
|
* install manifests rather than regenerating the backend that writes
|
|
22
22
|
* them.
|
|
@@ -30,6 +30,7 @@
|
|
|
30
30
|
* error direction stays the slow-but-correct one.
|
|
31
31
|
*/
|
|
32
32
|
import { join } from 'node:path';
|
|
33
|
+
import { toError } from '../utils/errors.js';
|
|
33
34
|
import { readText } from '../utils/fs.js';
|
|
34
35
|
import { verbose } from '../utils/logger.js';
|
|
35
36
|
import { isJarManifestPath } from './build-audit.js';
|
|
@@ -37,7 +38,7 @@ import { getUntrackedFilesInDir } from './git-status.js';
|
|
|
37
38
|
/**
|
|
38
39
|
* A jar declaration line: an optional bracketed base-directory prefix, then
|
|
39
40
|
* the jar name. Matched at column zero because entry lines inside a section
|
|
40
|
-
* are indented
|
|
41
|
+
* are indented. An indented `foo.jar:` is content, not a declaration.
|
|
41
42
|
*/
|
|
42
43
|
const JAR_DECLARATION_PATTERN = /^(\[[^\]]*\]\s*)?[^\s[\]]+\.jar:\s*$/;
|
|
43
44
|
/** True when the jar declaration redirects the install base directory. */
|
|
@@ -48,14 +49,14 @@ function declaresNonDefaultBase(line) {
|
|
|
48
49
|
return match[1] !== undefined;
|
|
49
50
|
}
|
|
50
51
|
/**
|
|
51
|
-
* True when a changed `jar.mn` is
|
|
52
|
+
* True when a changed `jar.mn` is new to the last successful build.
|
|
52
53
|
*
|
|
53
|
-
* Untracked in the engine repo is the reliable
|
|
54
|
-
* a checkout of upstream with patches applied to the
|
|
55
|
-
* a patch created is untracked and one that shipped upstream is
|
|
56
|
-
* baseline's fingerprints cannot answer this on their own
|
|
57
|
-
* the paths that were
|
|
58
|
-
* manifest has no entry either.
|
|
54
|
+
* Untracked in the engine repo is the reliable signal: a fork's engine tree
|
|
55
|
+
* is a checkout of upstream with patches applied to the worktree, so a
|
|
56
|
+
* manifest a patch created is untracked and one that shipped upstream is
|
|
57
|
+
* tracked. The baseline's fingerprints cannot answer this on their own: they
|
|
58
|
+
* record only the paths that were dirty at the last build, so a clean
|
|
59
|
+
* pre-existing manifest has no entry either.
|
|
59
60
|
*/
|
|
60
61
|
async function isNewJarManifest(engineDir, path) {
|
|
61
62
|
const untracked = await getUntrackedFilesInDir(engineDir, path);
|
|
@@ -82,7 +83,7 @@ export async function evaluateJarManifestEscalation(engineDir, changedPaths, bas
|
|
|
82
83
|
}
|
|
83
84
|
catch (error) {
|
|
84
85
|
// Fail closed: an unanswerable "is this new?" keeps the old rule.
|
|
85
|
-
verbose(`jar escalation: could not classify engine/${path} (${
|
|
86
|
+
verbose(`jar escalation: could not classify engine/${path} (${toError(error).message}); escalating.`);
|
|
86
87
|
causes.push({ path, reason: 'could not determine whether the manifest is new' });
|
|
87
88
|
continue;
|
|
88
89
|
}
|
|
@@ -95,7 +96,7 @@ export async function evaluateJarManifestEscalation(engineDir, changedPaths, bas
|
|
|
95
96
|
body = await readText(join(engineDir, path));
|
|
96
97
|
}
|
|
97
98
|
catch (error) {
|
|
98
|
-
verbose(`jar escalation: could not read engine/${path} (${
|
|
99
|
+
verbose(`jar escalation: could not read engine/${path} (${toError(error).message}); escalating.`);
|
|
99
100
|
causes.push({ path, reason: 'manifest could not be read' });
|
|
100
101
|
continue;
|
|
101
102
|
}
|
|
@@ -115,7 +116,7 @@ export async function evaluateJarManifestEscalation(engineDir, changedPaths, bas
|
|
|
115
116
|
return { escalate: causes.length > 0, causes, cleared };
|
|
116
117
|
}
|
|
117
118
|
/**
|
|
118
|
-
* Renders the operator-facing escalation notice. Names the manifest
|
|
119
|
+
* Renders the operator-facing escalation notice. Names the manifest and the
|
|
119
120
|
* reason: "a jar.mn changed" is the sentence that made the previous rule
|
|
120
121
|
* impossible to argue with from outside.
|
|
121
122
|
*/
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Loud guard against silently reverting
|
|
2
|
+
* Loud guard against silently reverting unexported engine drift.
|
|
3
3
|
*
|
|
4
4
|
* `build-prepare` rewrites engine files from FireForge-owned sources before
|
|
5
5
|
* every build: the branding tree, every Furnace-managed component, and
|
|
6
6
|
* `mozconfig`. On a multi-session checkout that is a silent destructive
|
|
7
|
-
* write
|
|
7
|
+
* write: one session edits a file in `engine/` while another holds the
|
|
8
8
|
* engine lock, the lock-holder's build rewrites it back to its patch
|
|
9
9
|
* baseline, and the editing session's later `re-export --wait-lock`
|
|
10
|
-
* captures a
|
|
10
|
+
* captures a hybrid file that every gate then passes.
|
|
11
11
|
*
|
|
12
|
-
* This guard runs
|
|
12
|
+
* This guard runs before the writes, classifies the engine's dirty files
|
|
13
13
|
* with the same classifier `fireforge status` uses, and reports the ones
|
|
14
14
|
* whose content is explained by neither a patch body nor the pristine
|
|
15
15
|
* baseline. Advisory by default (a warning naming every file), refusing
|
|
@@ -1,16 +1,16 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
|
-
* Loud guard against silently reverting
|
|
3
|
+
* Loud guard against silently reverting unexported engine drift.
|
|
4
4
|
*
|
|
5
5
|
* `build-prepare` rewrites engine files from FireForge-owned sources before
|
|
6
6
|
* every build: the branding tree, every Furnace-managed component, and
|
|
7
7
|
* `mozconfig`. On a multi-session checkout that is a silent destructive
|
|
8
|
-
* write
|
|
8
|
+
* write: one session edits a file in `engine/` while another holds the
|
|
9
9
|
* engine lock, the lock-holder's build rewrites it back to its patch
|
|
10
10
|
* baseline, and the editing session's later `re-export --wait-lock`
|
|
11
|
-
* captures a
|
|
11
|
+
* captures a hybrid file that every gate then passes.
|
|
12
12
|
*
|
|
13
|
-
* This guard runs
|
|
13
|
+
* This guard runs before the writes, classifies the engine's dirty files
|
|
14
14
|
* with the same classifier `fireforge status` uses, and reports the ones
|
|
15
15
|
* whose content is explained by neither a patch body nor the pristine
|
|
16
16
|
* baseline. Advisory by default (a warning naming every file), refusing
|
|
@@ -23,12 +23,12 @@ import { collectFurnaceManagedPrefixes } from './furnace-config.js';
|
|
|
23
23
|
import { expandUntrackedDirectoryEntries, getWorkingTreeStatus } from './git-status.js';
|
|
24
24
|
import { classifyFiles } from './status-classify.js';
|
|
25
25
|
/**
|
|
26
|
-
* Classifications whose on-disk content is explained by
|
|
27
|
-
* body nor the pristine baseline
|
|
26
|
+
* Classifications whose on-disk content is explained by neither a patch
|
|
27
|
+
* body nor the pristine baseline, which is the content a build-prepare
|
|
28
28
|
* overwrite would destroy without a record anywhere.
|
|
29
29
|
*
|
|
30
|
-
* `patch-backed` and `furnace` are excluded because their content
|
|
31
|
-
* recorded state
|
|
30
|
+
* `patch-backed` and `furnace` are excluded because their content is the
|
|
31
|
+
* recorded state. `branding` is excluded because the branding writer
|
|
32
32
|
* preserves unmanaged lines rather than overwriting them.
|
|
33
33
|
*/
|
|
34
34
|
const AT_RISK_CLASSIFICATIONS = new Set(['unmanaged', 'patch-owned-drift', 'conflict']);
|
|
@@ -58,15 +58,15 @@ function isOverwrittenByBuildPrepare(file, binaryName, furnacePrefixes) {
|
|
|
58
58
|
* Narrows the status entries to the ones build-prepare can overwrite,
|
|
59
59
|
* expanding collapsed untracked directories on the way.
|
|
60
60
|
*
|
|
61
|
-
* Git reports a
|
|
61
|
+
* Git reports a wholly untracked directory as a single `?? dir/` entry
|
|
62
62
|
* rather than listing the files under it. A directory entry has no content
|
|
63
63
|
* to compare, so `classifyFiles` matches it against neither a patch body nor
|
|
64
|
-
* the pristine baseline and buckets it `unmanaged
|
|
65
|
-
* classification. Expanding here
|
|
66
|
-
* `status --unmanaged`, which expands
|
|
64
|
+
* the pristine baseline and buckets it `unmanaged`, an at-risk
|
|
65
|
+
* classification. Expanding here keeps this guard in agreement with
|
|
66
|
+
* `status --unmanaged`, which also expands.
|
|
67
67
|
*
|
|
68
68
|
* Expansion is scoped to build-prepare-owned prefixes on both sides of the
|
|
69
|
-
* walk: a collapsed directory that merely
|
|
69
|
+
* walk: a collapsed directory that merely contains an owned prefix
|
|
70
70
|
* (`components/` when `components/custom/` is Furnace-managed) is rewritten
|
|
71
71
|
* to the owned prefixes beneath it, so the enumeration never walks an
|
|
72
72
|
* unrelated subtree and never trips the per-directory expansion cap.
|
|
@@ -143,7 +143,7 @@ export function formatUnexportedDriftWarning(files) {
|
|
|
143
143
|
const owner = entry.owner !== undefined ? ` (owned by ${entry.owner})` : '';
|
|
144
144
|
return ` ${entry.file} [${entry.classification}]${owner}`;
|
|
145
145
|
});
|
|
146
|
-
return (`This build is about to rewrite ${
|
|
146
|
+
return (`This build is about to rewrite ${files.length} engine file(s) from FireForge-owned ` +
|
|
147
147
|
'sources, and their current content matches NEITHER a patch body NOR the pristine ' +
|
|
148
148
|
'baseline — so the edits below are recorded nowhere and the build will destroy them:\n' +
|
|
149
149
|
`${rows.join('\n')}\n\n` +
|
|
@@ -26,28 +26,20 @@ export interface PrepareBuildOptions {
|
|
|
26
26
|
* Previous successful-build baseline, used to detect `moz.build` /
|
|
27
27
|
* `moz.configure` / `Makefile.in` changes that require a fresh
|
|
28
28
|
* `mach configure` before the build. When undefined, the auto-configure
|
|
29
|
-
* step is skipped
|
|
30
|
-
* means.
|
|
29
|
+
* step is skipped, since there's no reference point for what "changed
|
|
30
|
+
* since" means.
|
|
31
31
|
*/
|
|
32
32
|
previousBaseline?: BuildBaseline | undefined;
|
|
33
33
|
/**
|
|
34
34
|
* Turn the unexported-drift warning into a hard refusal.
|
|
35
|
-
* Scripted gates want the stop
|
|
35
|
+
* Scripted gates want the stop. An interactive build wants the warning.
|
|
36
36
|
*/
|
|
37
37
|
refuseUnexportedDrift?: boolean | undefined;
|
|
38
38
|
}
|
|
39
|
-
/**
|
|
40
|
-
* Packaging manifests whose graph/destination directories MAY need a full
|
|
41
|
-
* build. Path-shape only: {@link evaluateJarManifestEscalation} decides
|
|
42
|
-
* whether a given changed manifest actually forces one (a new manifest, or
|
|
43
|
-
* one that redirects its install base directory), so an entry added to an
|
|
44
|
-
* existing `dist/bin` manifest no longer costs a ~10-minute build.
|
|
45
|
-
*/
|
|
46
|
-
export declare function requiresFullBuildForIncrementalTest(path: string): boolean;
|
|
47
39
|
/**
|
|
48
40
|
* Describes an exit code in the shell's 128+N signal convention. Truncated
|
|
49
41
|
* configure/build logs with a signal-shaped exit (e.g. 144 = 128+16, SIGURG
|
|
50
|
-
* on macOS) are environmental interruptions, not compiler failures
|
|
42
|
+
* on macOS) are environmental interruptions, not compiler failures. Naming
|
|
51
43
|
* that in the failure text saves the operator a fruitless log hunt.
|
|
52
44
|
* Returns undefined for codes <= 128 (regular failures) and
|
|
53
45
|
* for codes past the conventional signal range, so callers append nothing.
|