@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
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
*
|
|
14
14
|
* The guard is installed as a `fireforge_mach_guard.pth` + module pair in
|
|
15
15
|
* every discovered mach virtualenv site-packages directory. A PYTHONPATH
|
|
16
|
-
* `sitecustomize.py` is
|
|
16
|
+
* `sitecustomize.py` is not sufficient on its own: mach re-execs itself into
|
|
17
17
|
* its private virtualenv and drops PYTHONPATH, so that route never loads.
|
|
18
18
|
* `.pth` files execute at interpreter startup from the venv's own
|
|
19
19
|
* site-packages, which survives the re-exec. The PYTHONPATH copy is retained
|
|
@@ -22,12 +22,12 @@
|
|
|
22
22
|
*
|
|
23
23
|
* The guard covers the whole crash family:
|
|
24
24
|
* - wraps `psutil.virtual_memory` / `swap_memory` / `cpu_percent` /
|
|
25
|
-
* `cpu_times` / `disk_io_counters` module-wide, so every call site
|
|
25
|
+
* `cpu_times` / `disk_io_counters` module-wide, so every call site,
|
|
26
26
|
* including the direct `psutil.virtual_memory()` in
|
|
27
|
-
* `mozbuild.base._run_make
|
|
27
|
+
* `mozbuild.base._run_make`, degrades to a `UserWarning` and a zeroed
|
|
28
28
|
* reading instead of aborting.
|
|
29
29
|
*
|
|
30
|
-
* The fallback must be per-function
|
|
30
|
+
* The fallback must be per-function arity-correct and reconstructible:
|
|
31
31
|
* mozsystemmonitor captures reading types at `__init__`
|
|
32
32
|
* (`self._swap_type = type(psutil.swap_memory())`) and rebuilds each
|
|
33
33
|
* collector sample via `self._swap_type(*swap_mem)`. An svmem-shaped
|
|
@@ -37,39 +37,46 @@
|
|
|
37
37
|
* sentinel, and mach hangs forever in its atexit `waitpid`. Each wrapped
|
|
38
38
|
* function therefore degrades to a zeroed instance of psutil's own result
|
|
39
39
|
* namedtuple where resolvable, else a module-level guard-owned namedtuple
|
|
40
|
-
* with the exact field order and arity for
|
|
40
|
+
* with the exact field order and arity for that function (module-level so
|
|
41
41
|
* readings pickle by reference across the collector pipe).
|
|
42
42
|
* `_DegradedReading` remains only as a documented last resort and
|
|
43
43
|
* tolerates `type(reading)(*values)` reconstruction. Guard-owned fallback
|
|
44
44
|
* classes never depend on psutil internals resolving, which also makes
|
|
45
45
|
* them safe when two guard copies load (PYTHONPATH `sitecustomize` in the
|
|
46
|
-
* bootstrap phase plus the in-venv `.pth`), each with its own classes
|
|
47
|
-
* - guards `SystemResourceMonitor`
|
|
46
|
+
* bootstrap phase plus the in-venv `.pth`), each with its own classes.
|
|
47
|
+
* - guards `SystemResourceMonitor` construction via an import hook:
|
|
48
48
|
* `poll_interval` is pre-populated before the real `__init__` runs, a
|
|
49
49
|
* failing `__init__` marks the instance degraded instead of raising, and
|
|
50
|
-
* every monitor method no-ops on a degraded instance
|
|
50
|
+
* every monitor method no-ops on a degraded instance, so a
|
|
51
51
|
* partially-constructed monitor can never surface the
|
|
52
52
|
* `AttributeError: poll_interval` variant. Degraded aggregate methods
|
|
53
53
|
* return zeroed shapes (not `None`) where callers subscript the result
|
|
54
54
|
* (`aggregate_io` → zeroed io reading, so mozbuild's `log_resource_usage`
|
|
55
|
-
* does not die on `usage["io"].read_bytes` after a successful compile)
|
|
55
|
+
* does not die on `usage["io"].read_bytes` after a successful compile).
|
|
56
56
|
* - suppresses the mozsystemmonitor collector child on degradation: once
|
|
57
57
|
* any psutil degradation is observed in the process, monitors are kept
|
|
58
58
|
* inert (`start` never spawns the collector), and a degraded transition
|
|
59
59
|
* or raising `stop` best-effort terminates a live collector child and
|
|
60
60
|
* drains the pipe, so a malformed sample stream cannot wedge mach's
|
|
61
|
-
* shutdown even if a future shape mismatch slips through
|
|
61
|
+
* shutdown even if a future shape mismatch slips through.
|
|
62
62
|
* - wraps `mozbuild.controller.building.BuildMonitor.log_resource_usage` to
|
|
63
63
|
* warn-and-continue on any exception, so end-of-build resource reporting
|
|
64
64
|
* can never fail a build whose artifacts are complete.
|
|
65
65
|
*/
|
|
66
|
-
import { readdir } from 'node:fs/promises';
|
|
67
|
-
import { homedir, tmpdir } from 'node:os';
|
|
66
|
+
import { lstat, mkdir, readdir } from 'node:fs/promises';
|
|
67
|
+
import { homedir, tmpdir, userInfo } from 'node:os';
|
|
68
68
|
import { delimiter, join } from 'node:path';
|
|
69
|
+
import { BuildError } from '../errors/build.js';
|
|
69
70
|
import { toError } from '../utils/errors.js';
|
|
70
|
-
import {
|
|
71
|
+
import { pathExists, writeText } from '../utils/fs.js';
|
|
71
72
|
import { verbose } from '../utils/logger.js';
|
|
72
|
-
/**
|
|
73
|
+
/**
|
|
74
|
+
* Prefix of the per-user directory (under the OS temp dir) holding the
|
|
75
|
+
* PYTHONPATH fallback. The uid (or, on Windows, the username) is appended:
|
|
76
|
+
* a fixed name under a shared `/tmp` lets any other local account pre-create
|
|
77
|
+
* the directory and own the `sitecustomize.py` that every mach dispatch
|
|
78
|
+
* then imports.
|
|
79
|
+
*/
|
|
73
80
|
const RESOURCE_SHIM_DIRNAME = 'fireforge-mach-resource-shim';
|
|
74
81
|
/** Basename (sans extension) of the in-venv guard module. */
|
|
75
82
|
const GUARD_MODULE_NAME = 'fireforge_mach_guard';
|
|
@@ -89,6 +96,7 @@ export const GUARD_PYTHON_SOURCE = `# Generated by FireForge - do not edit.
|
|
|
89
96
|
# (survives mach's venv re-exec, which drops PYTHONPATH).
|
|
90
97
|
import builtins
|
|
91
98
|
import collections
|
|
99
|
+
import inspect
|
|
92
100
|
import sys
|
|
93
101
|
import warnings
|
|
94
102
|
|
|
@@ -369,7 +377,40 @@ def _patch_monitor_class(cls):
|
|
|
369
377
|
|
|
370
378
|
return wrapper
|
|
371
379
|
|
|
380
|
+
def _wrap_unbound(name, func):
|
|
381
|
+
# Upstream declares record_event/record_marker as @staticmethods (and
|
|
382
|
+
# may declare others as @classmethods). Those take no receiver, so
|
|
383
|
+
# they cannot use the per-instance degraded flag and must not have one
|
|
384
|
+
# threaded in — see the descriptor dispatch below.
|
|
385
|
+
def wrapper(*args, **kwargs):
|
|
386
|
+
if _fireforge_host_degraded[0]:
|
|
387
|
+
return _monitor_degraded_result(name, args, kwargs)
|
|
388
|
+
try:
|
|
389
|
+
return func(*args, **kwargs)
|
|
390
|
+
except Exception as exc: # noqa: BLE001
|
|
391
|
+
_fireforge_degraded_notice(exc)
|
|
392
|
+
return _monitor_degraded_result(name, args, kwargs)
|
|
393
|
+
|
|
394
|
+
return wrapper
|
|
395
|
+
|
|
372
396
|
for _name in _MONITOR_METHOD_NAMES:
|
|
397
|
+
# getattr_static returns the raw class attribute, so a staticmethod
|
|
398
|
+
# is still a staticmethod object here. Plain getattr would hand back
|
|
399
|
+
# the underlying function, and re-setting THAT on the class rebinds
|
|
400
|
+
# it as an instance method: the receiver is then passed through as an
|
|
401
|
+
# extra leading positional and every call raises
|
|
402
|
+
# "takes N positional arguments but N+1 were given". Re-apply the
|
|
403
|
+
# descriptor the attribute actually had.
|
|
404
|
+
try:
|
|
405
|
+
_raw = inspect.getattr_static(cls, _name)
|
|
406
|
+
except AttributeError:
|
|
407
|
+
continue
|
|
408
|
+
if isinstance(_raw, staticmethod):
|
|
409
|
+
setattr(cls, _name, staticmethod(_wrap_unbound(_name, _raw.__func__)))
|
|
410
|
+
continue
|
|
411
|
+
if isinstance(_raw, classmethod):
|
|
412
|
+
setattr(cls, _name, classmethod(_wrap_unbound(_name, _raw.__func__)))
|
|
413
|
+
continue
|
|
373
414
|
_orig = getattr(cls, _name, None)
|
|
374
415
|
if _orig is not None:
|
|
375
416
|
setattr(cls, _name, _wrap_method(_name, _orig))
|
|
@@ -488,13 +529,75 @@ async function discoverMachSitePackages(engineDir) {
|
|
|
488
529
|
return found;
|
|
489
530
|
}
|
|
490
531
|
/**
|
|
491
|
-
*
|
|
492
|
-
*
|
|
493
|
-
*
|
|
532
|
+
* Per-user discriminator for the shim directory name. The numeric uid on
|
|
533
|
+
* POSIX, read via `process.getuid` rather than `os.userInfo()`: the latter
|
|
534
|
+
* resolves the passwd entry and throws (`ERR_SYSTEM_ERROR`) for a uid that
|
|
535
|
+
* has none (`docker --user 1001:1001`, OpenShift's random uids, many CI
|
|
536
|
+
* agents), which would take every build and test dispatch down with a raw
|
|
537
|
+
* system error. On Windows there is no uid. The username is the
|
|
538
|
+
* discriminator, with `userInfo()` still guarded because the same lookup
|
|
539
|
+
* can fail there for a service account, falling back to the environment.
|
|
540
|
+
*/
|
|
541
|
+
function shimDirOwner() {
|
|
542
|
+
const uid = process.getuid?.();
|
|
543
|
+
if (uid !== undefined)
|
|
544
|
+
return String(uid);
|
|
545
|
+
let username;
|
|
546
|
+
try {
|
|
547
|
+
username = userInfo().username;
|
|
548
|
+
}
|
|
549
|
+
catch {
|
|
550
|
+
username = process.env['USERNAME'] ?? process.env['USER'];
|
|
551
|
+
}
|
|
552
|
+
return (username ?? 'unknown-user').replace(/[^A-Za-z0-9_.-]/g, '_');
|
|
553
|
+
}
|
|
554
|
+
/** Per-user shim directory: `<tmpdir>/fireforge-mach-resource-shim-<uid>`. */
|
|
555
|
+
function resourceShimDir() {
|
|
556
|
+
return join(tmpdir(), `${RESOURCE_SHIM_DIRNAME}-${shimDirOwner()}`);
|
|
557
|
+
}
|
|
558
|
+
/**
|
|
559
|
+
* Refuses a shim directory that is not a private directory of the current
|
|
560
|
+
* user. `lstat`, not `stat`: a symlink planted at the path would otherwise
|
|
561
|
+
* be followed and the check would describe its target. On Windows only the
|
|
562
|
+
* "is a real directory" half applies. There is no POSIX owner or mode bit
|
|
563
|
+
* to read, and the per-user name is the isolation.
|
|
564
|
+
*
|
|
565
|
+
* @param dir - Shim directory that {@link ensureSitecustomizeFallback} created
|
|
566
|
+
* @throws BuildError when the directory is a symlink/file, owned by another
|
|
567
|
+
* uid, or group/world-writable
|
|
568
|
+
*/
|
|
569
|
+
export async function assertPrivateShimDir(dir) {
|
|
570
|
+
const stats = await lstat(dir);
|
|
571
|
+
const refuse = (reason) => {
|
|
572
|
+
throw new BuildError(`Refusing to use mach resource shim directory ${dir}: ${reason}. ` +
|
|
573
|
+
'Another local account may have planted it; remove or fix it and retry.');
|
|
574
|
+
};
|
|
575
|
+
if (!stats.isDirectory()) {
|
|
576
|
+
refuse('not a directory (symlink or file)');
|
|
577
|
+
}
|
|
578
|
+
if (process.platform === 'win32')
|
|
579
|
+
return;
|
|
580
|
+
const uid = process.getuid?.();
|
|
581
|
+
if (uid !== undefined && stats.uid !== uid) {
|
|
582
|
+
refuse(`owned by uid ${stats.uid}, not the current user (uid ${uid})`);
|
|
583
|
+
}
|
|
584
|
+
if ((stats.mode & 0o022) !== 0) {
|
|
585
|
+
refuse(`mode ${(stats.mode & 0o777).toString(8)} is group/world-writable`);
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
/**
|
|
589
|
+
* Writes the PYTHONPATH `sitecustomize.py` fallback into a per-user,
|
|
590
|
+
* mode-0700 FireForge-owned temp directory, verified private before the
|
|
591
|
+
* write, and returns that directory. Idempotent: overwriting each call
|
|
592
|
+
* keeps it in sync with this source across upgrades.
|
|
494
593
|
*/
|
|
495
594
|
async function ensureSitecustomizeFallback() {
|
|
496
|
-
const dir =
|
|
497
|
-
|
|
595
|
+
const dir = resourceShimDir();
|
|
596
|
+
// `mode` only applies when mkdir creates the directory (and is masked by
|
|
597
|
+
// the umask). A pre-existing one keeps whatever it had, which is exactly
|
|
598
|
+
// what the assertion below refuses if it is not private.
|
|
599
|
+
await mkdir(dir, { recursive: true, mode: 0o700 });
|
|
600
|
+
await assertPrivateShimDir(dir);
|
|
498
601
|
await writeText(join(dir, 'sitecustomize.py'), GUARD_PYTHON_SOURCE);
|
|
499
602
|
return dir;
|
|
500
603
|
}
|
|
@@ -512,7 +615,7 @@ function machResourceShimEnv(shimDir, baseEnv = process.env) {
|
|
|
512
615
|
* `fireforge_mach_guard.pth` + `fireforge_mach_guard.py` into every
|
|
513
616
|
* discovered mach virtualenv site-packages (survives mach's venv re-exec),
|
|
514
617
|
* plus the PYTHONPATH sitecustomize fallback for the pre-venv bootstrap
|
|
515
|
-
* phase. Idempotent and re-run before
|
|
618
|
+
* phase. Idempotent and re-run before every protected dispatch (including
|
|
516
619
|
* each retry) so a venv created by a crashed first attempt is guarded on
|
|
517
620
|
* the next one instead of re-dying on the same wedged state.
|
|
518
621
|
*/
|
|
@@ -524,7 +627,7 @@ export async function installMachResourceGuard(engineDir) {
|
|
|
524
627
|
await writeText(join(sitePackages, `${GUARD_MODULE_NAME}.pth`), `import ${GUARD_MODULE_NAME}\n`);
|
|
525
628
|
}
|
|
526
629
|
catch (error) {
|
|
527
|
-
// A read-only or vanished venv must not block the dispatch
|
|
630
|
+
// A read-only or vanished venv must not block the dispatch. The
|
|
528
631
|
// PYTHONPATH fallback still applies and other venvs may have taken
|
|
529
632
|
// the guard.
|
|
530
633
|
verbose(`Could not install mach resource guard into ${sitePackages}: ${toError(error).message}`);
|
package/dist/src/core/mach.d.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { type SmokeLineCallback, type SmokeRunResult } from '../utils/process.js
|
|
|
2
2
|
import { type HarnessCrashSignature } from './test-harness-crash.js';
|
|
3
3
|
export { attemptMozinfoRewrite, buildArtifactMismatchMessage, hasBuildArtifacts, hasRunnableBundle, } from './mach-build-artifacts.js';
|
|
4
4
|
export { generateMozconfig } from './mach-mozconfig.js';
|
|
5
|
-
export { ensurePython
|
|
5
|
+
export { ensurePython } from './mach-python.js';
|
|
6
6
|
/**
|
|
7
7
|
* Ensures mach is available in the engine directory.
|
|
8
8
|
* @param engineDir - Path to the engine directory
|
|
@@ -18,17 +18,17 @@ export interface MachOptions {
|
|
|
18
18
|
/** Whether to inherit stdio (show output directly) */
|
|
19
19
|
inherit?: boolean;
|
|
20
20
|
/**
|
|
21
|
-
* Collapse the
|
|
22
|
-
* line in the terminal
|
|
23
|
-
* stdout/stderr stay raw
|
|
21
|
+
* Collapse the known mozsystemmonitor teardown traceback to one labeled
|
|
22
|
+
* line in the terminal echo (capture-only option). The captured
|
|
23
|
+
* stdout/stderr stay raw, because the harness classifier depends on the raw
|
|
24
24
|
* traceback. Unrecognized tracebacks always echo verbatim. Opted into by
|
|
25
25
|
* the test dispatchers only.
|
|
26
26
|
*
|
|
27
|
-
* Consumed by {@link runMachCapture}
|
|
28
|
-
* it in the type and ignores it
|
|
27
|
+
* Consumed by {@link runMachCapture} alone. `runMachInheritCapture` accepts
|
|
28
|
+
* it in the type and ignores it: the inherit path has no per-chunk hook,
|
|
29
29
|
* only a mirror stream that feeds the terminal and the run log the same
|
|
30
30
|
* string, so filtering there would strip the traceback from the raw log
|
|
31
|
-
* too. The build path uses the recognition
|
|
31
|
+
* too. The build path uses the recognition note instead. See
|
|
32
32
|
* `mach-known-noise-filter.ts`.
|
|
33
33
|
*/
|
|
34
34
|
annotateKnownTeardownNoise?: boolean;
|
|
@@ -66,12 +66,6 @@ export declare function runMachCapture(args: string[], engineDir: string, option
|
|
|
66
66
|
* capturing stdout/stderr for post-run diagnostics.
|
|
67
67
|
*/
|
|
68
68
|
export declare function runMachInheritCapture(args: string[], engineDir: string, options?: Omit<MachOptions, 'inherit'>): Promise<MachCommandResult>;
|
|
69
|
-
/**
|
|
70
|
-
* Runs mach bootstrap to install build dependencies.
|
|
71
|
-
* @param engineDir - Path to the engine directory
|
|
72
|
-
* @returns Exit code
|
|
73
|
-
*/
|
|
74
|
-
export declare function bootstrap(engineDir: string): Promise<number>;
|
|
75
69
|
/**
|
|
76
70
|
* Runs mach bootstrap while preserving stdin and capturing the emitted output.
|
|
77
71
|
* @param engineDir - Path to the engine directory
|
|
@@ -98,20 +92,20 @@ export interface ProtectedMachBuildResult extends MachCommandResult {
|
|
|
98
92
|
}
|
|
99
93
|
/**
|
|
100
94
|
* The single protected path every FireForge mach build dispatch routes
|
|
101
|
-
* through
|
|
95
|
+
* through. `build`, `build --ui`, and the pre-test `--build` step all use
|
|
102
96
|
* it, so no entry point is left unprotected with a different retry budget:
|
|
103
97
|
*
|
|
104
|
-
* 1. installs the resource-monitor degrade guard
|
|
105
|
-
* (plus the PYTHONPATH fallback)
|
|
98
|
+
* 1. installs the resource-monitor degrade guard in the mach virtualenvs
|
|
99
|
+
* (plus the PYTHONPATH fallback), re-installed before every attempt, so
|
|
106
100
|
* a venv materialized by a crashed first attempt is guarded on the next
|
|
107
|
-
* one instead of every retry dying on the same wedged state
|
|
108
|
-
* 2. spawns a fresh mach process per attempt
|
|
109
|
-
* 3. retries
|
|
110
|
-
* psutil startup tracebacks) up to the uniform budget
|
|
101
|
+
* one instead of every retry dying on the same wedged state.
|
|
102
|
+
* 2. spawns a fresh mach process per attempt.
|
|
103
|
+
* 3. retries only the recognized harness-crash family (resource monitor /
|
|
104
|
+
* psutil startup tracebacks) up to the uniform budget. An ordinary
|
|
111
105
|
* compile error is never retried.
|
|
112
106
|
*
|
|
113
107
|
* The protected path never runs `mach configure`, never clobbers, and never
|
|
114
|
-
* widens the requested build kind
|
|
108
|
+
* widens the requested build kind: a `faster` dispatch retries as
|
|
115
109
|
* `mach build faster`, so it cannot invalidate more of the objdir than the
|
|
116
110
|
* command the operator asked for.
|
|
117
111
|
*/
|
|
@@ -122,8 +116,8 @@ export declare function runProtectedMachBuild(kind: ProtectedBuildKind, engineDi
|
|
|
122
116
|
* hints are surfaced on top of the raw mach output so operators get an
|
|
123
117
|
* actionable nudge alongside the cryptic mozbuild traceback. Returns the
|
|
124
118
|
* captured result so the caller (e.g. `fireforge build`) can inspect the
|
|
125
|
-
* tail for post-build diagnostics that mach prints
|
|
126
|
-
* successful!"
|
|
119
|
+
* tail for post-build diagnostics that mach prints after "Your build was
|
|
120
|
+
* successful!", notably the stale `config.status is out of date`
|
|
127
121
|
* notice that mach emits when a tool-managed edit landed on
|
|
128
122
|
* `moz.configure` before the build.
|
|
129
123
|
* @param engineDir - Path to the engine directory
|
|
@@ -147,13 +141,13 @@ export declare function buildUI(engineDir: string): Promise<ProtectedMachBuildRe
|
|
|
147
141
|
*
|
|
148
142
|
* Without it, a `build --ui` started while a full `build` is still in flight
|
|
149
143
|
* hands off to `mach build faster` and fails almost immediately with `No
|
|
150
|
-
* rule to make target 'XUL'
|
|
144
|
+
* rule to make target 'XUL'`, the real problem being that the first build
|
|
151
145
|
* has not yet materialised the full backend, with nothing in the low-level
|
|
152
146
|
* make error pointing at the concurrent run. The lock intercepts the second
|
|
153
147
|
* invocation before it touches mach, and the refusal names the PID holding
|
|
154
148
|
* the lock so the operator can decide whether to wait or investigate.
|
|
155
149
|
*
|
|
156
|
-
* Stale-lock recovery: the lock stores the owner PID
|
|
150
|
+
* Stale-lock recovery: the lock stores the owner PID. A crashed build
|
|
157
151
|
* (SIGINT, SIGTERM, or a kernel kill) leaves the lock dir behind but not the
|
|
158
152
|
* owning process, and `withFileLock` removes the lock on the next attempt
|
|
159
153
|
* when `process.kill(pid, 0)` shows the owner is gone.
|
|
@@ -191,42 +185,28 @@ export interface RunMachSmokeOptions {
|
|
|
191
185
|
* enforces a deadline by SIGTERMing the whole process group, and returns
|
|
192
186
|
* the captured output alongside a `timedOut` flag.
|
|
193
187
|
*
|
|
194
|
-
* Unlike {@link run}, this variant does
|
|
188
|
+
* Unlike {@link run}, this variant does not inherit stdio. The child
|
|
195
189
|
* stdout/stderr are piped back through the line callbacks so the caller
|
|
196
190
|
* can scan for `JavaScript error:` / `console.error:` without coupling
|
|
197
191
|
* the runner to chrome-specific pattern logic.
|
|
198
192
|
*/
|
|
199
193
|
export declare function runMachSmoke(args: string[], engineDir: string, options: RunMachSmokeOptions): Promise<SmokeRunResult>;
|
|
200
|
-
/**
|
|
201
|
-
* Creates a distribution package.
|
|
202
|
-
* @param engineDir - Path to the engine directory
|
|
203
|
-
* @returns Exit code
|
|
204
|
-
*/
|
|
205
|
-
export declare function machPackage(engineDir: string): Promise<number>;
|
|
206
194
|
/**
|
|
207
195
|
* Creates a distribution package while streaming output to the terminal
|
|
208
|
-
* and capturing the stderr tail for post-run diagnostics
|
|
209
|
-
*
|
|
210
|
-
* variant; the inherit-only `machPackage` above remains for callers that
|
|
211
|
-
* just need an exit code.
|
|
196
|
+
* and capturing the stderr tail for post-run diagnostics, so callers can
|
|
197
|
+
* consult {@link explainMachError} on failure.
|
|
212
198
|
*
|
|
213
199
|
* @param engineDir - Path to the engine directory
|
|
214
200
|
* @returns Captured mach result (stdout tail, stderr tail, exit code)
|
|
215
201
|
*/
|
|
216
202
|
export declare function machPackageCapture(engineDir: string): Promise<MachCommandResult>;
|
|
217
|
-
/**
|
|
218
|
-
* Runs mach watch for auto-rebuilding.
|
|
219
|
-
* @param engineDir - Path to the engine directory
|
|
220
|
-
* @returns Exit code
|
|
221
|
-
*/
|
|
222
|
-
export declare function watch(engineDir: string): Promise<number>;
|
|
223
203
|
/**
|
|
224
204
|
* Runs mach watch while preserving stdin and capturing emitted output.
|
|
225
205
|
*
|
|
226
206
|
* `env` is threaded through so the caller can prepend the resolved watchman
|
|
227
207
|
* directory to PATH in a way mach inherits: `fireforge watch` can locate
|
|
228
208
|
* `watchman` via `which`, but the mach subprocess spawns with the parent's
|
|
229
|
-
* PATH only
|
|
209
|
+
* PATH only, and on macOS that typically omits `/opt/homebrew/bin`, so
|
|
230
210
|
* `mach watch` fails at the `watch-project` subscription step.
|
|
231
211
|
*
|
|
232
212
|
* @param engineDir - Path to the engine directory
|
|
@@ -238,38 +218,44 @@ export declare function watchWithOutput(engineDir: string, options?: {
|
|
|
238
218
|
env?: Record<string, string>;
|
|
239
219
|
}): Promise<MachCommandResult>;
|
|
240
220
|
/**
|
|
241
|
-
*
|
|
242
|
-
* @param engineDir - Path to the engine directory
|
|
243
|
-
* @param testPaths - Test file or directory paths (relative to engine)
|
|
244
|
-
* @param args - Additional arguments to pass to mach test
|
|
245
|
-
* @returns Exit code
|
|
246
|
-
*/
|
|
247
|
-
export declare function test(engineDir: string, testPaths?: string[], args?: string[]): Promise<number>;
|
|
248
|
-
/**
|
|
249
|
-
* Runs mach test while capturing streamed output for better diagnostics.
|
|
221
|
+
* Which mach test command a capturing test dispatch runs.
|
|
250
222
|
*
|
|
251
|
-
*
|
|
252
|
-
*
|
|
253
|
-
*
|
|
254
|
-
*
|
|
255
|
-
*
|
|
256
|
-
*
|
|
223
|
+
* - `test`: the generic `mach test` (mixed/all-tests runs, or the
|
|
224
|
+
* `--generic-mach-test` opt-out).
|
|
225
|
+
* - `xpcshell-test` / `mochitest`: the suite-specific commands. Unlike the
|
|
226
|
+
* generic `mach test`, these degrade a broken mozlog resource monitor to a
|
|
227
|
+
* warning instead of crashing at startup, so `fireforge test` dispatches
|
|
228
|
+
* single-suite runs to them to stay resilient to the host psutil failure.
|
|
257
229
|
*/
|
|
258
|
-
export
|
|
230
|
+
export type MachTestSuiteKind = 'test' | 'xpcshell-test' | 'mochitest';
|
|
231
|
+
/** Options for {@link runMachTestSuite}. */
|
|
232
|
+
export interface MachTestSuiteOptions {
|
|
233
|
+
/** Absolute path to the engine checkout. */
|
|
234
|
+
engineDir: string;
|
|
235
|
+
/** Test paths to pass to the mach command. Empty runs the default set. */
|
|
236
|
+
testPaths?: string[];
|
|
237
|
+
/** Extra mach arguments appended after the paths. */
|
|
238
|
+
args?: string[];
|
|
239
|
+
/**
|
|
240
|
+
* Extra environment variables for the mach process (merged over
|
|
241
|
+
* `process.env` by the exec layer). Used by `fireforge test
|
|
242
|
+
* --perf-samples` to publish the artifact-path contract.
|
|
243
|
+
*/
|
|
244
|
+
env?: Record<string, string> | undefined;
|
|
245
|
+
/**
|
|
246
|
+
* Pass full mozbuild verbosity through by unsetting the coding-agent
|
|
247
|
+
* markers that quiet it. See {@link CODING_AGENT_ENV_MARKERS}.
|
|
248
|
+
*/
|
|
249
|
+
fullOutput?: boolean | undefined;
|
|
250
|
+
}
|
|
259
251
|
/**
|
|
260
|
-
* Runs `mach
|
|
261
|
-
*
|
|
262
|
-
* commands
|
|
263
|
-
*
|
|
264
|
-
*
|
|
252
|
+
* Runs one mach test command (`mach test` / `mach xpcshell-test` / `mach
|
|
253
|
+
* mochitest`) while capturing streamed output for better diagnostics. The
|
|
254
|
+
* three commands share every other detail of the dispatch (resource guard,
|
|
255
|
+
* verbosity env, teardown-noise annotation), so they share one entry point
|
|
256
|
+
* keyed by `kind` rather than three copies that drift.
|
|
265
257
|
*
|
|
266
|
-
*
|
|
267
|
-
*
|
|
268
|
-
*/
|
|
269
|
-
export declare function xpcshellTestWithOutput(engineDir: string, testPaths?: string[], args?: string[], env?: Record<string, string>, fullOutput?: boolean): Promise<MachCommandResult>;
|
|
270
|
-
/**
|
|
271
|
-
* Runs `mach mochitest` (covers browser-chrome / mochitest flavors) while
|
|
272
|
-
* capturing output. The suite-specific counterpart to {@link testWithOutput}
|
|
273
|
-
* for non-xpcshell single-suite runs — see {@link xpcshellTestWithOutput}.
|
|
258
|
+
* @param kind - Which mach command to run
|
|
259
|
+
* @param options - Engine checkout, test paths, extra args, env, verbosity
|
|
274
260
|
*/
|
|
275
|
-
export declare function
|
|
261
|
+
export declare function runMachTestSuite(kind: MachTestSuiteKind, options: MachTestSuiteOptions): Promise<MachCommandResult>;
|