@hominis/fireforge 0.46.0 → 0.46.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +381 -498
- package/dist/bin/fireforge.d.ts +1 -1
- package/dist/bin/fireforge.js +17 -17
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +9 -9
- package/dist/src/cli-usage-error.js +12 -12
- package/dist/src/cli.d.ts +3 -2
- package/dist/src/cli.js +29 -28
- package/dist/src/commands/bootstrap-checks.js +2 -1
- package/dist/src/commands/bootstrap.js +2 -2
- package/dist/src/commands/build.js +12 -11
- package/dist/src/commands/config.js +9 -9
- package/dist/src/commands/destructive-decision.d.ts +4 -4
- package/dist/src/commands/destructive-decision.js +4 -4
- package/dist/src/commands/discard.js +5 -5
- package/dist/src/commands/doctor-check-core.d.ts +4 -4
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
- package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
- package/dist/src/commands/doctor-furnace-jar.js +1 -1
- package/dist/src/commands/doctor-furnace.js +22 -22
- package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -11
- package/dist/src/commands/doctor-orphaned-harness.js +10 -11
- package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
- package/dist/src/commands/doctor-patch-manifest.js +7 -6
- package/dist/src/commands/doctor-post-rebase-audit.js +2 -2
- package/dist/src/commands/doctor-source-pin.d.ts +12 -12
- package/dist/src/commands/doctor-source-pin.js +14 -14
- package/dist/src/commands/doctor-working-tree.d.ts +3 -3
- package/dist/src/commands/doctor-working-tree.js +3 -3
- package/dist/src/commands/doctor.d.ts +2 -2
- package/dist/src/commands/doctor.js +9 -9
- package/dist/src/commands/download.js +15 -13
- package/dist/src/commands/export-all.js +8 -8
- package/dist/src/commands/export-flow.d.ts +5 -5
- package/dist/src/commands/export-flow.js +14 -14
- package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
- package/dist/src/commands/export-placement-conflicts.js +9 -9
- package/dist/src/commands/export-placement-gate.d.ts +2 -2
- package/dist/src/commands/export-placement-gate.js +5 -5
- package/dist/src/commands/export-placement-policy.d.ts +1 -1
- package/dist/src/commands/export-placement-policy.js +1 -1
- package/dist/src/commands/export-shared.d.ts +10 -10
- package/dist/src/commands/export-shared.js +13 -13
- package/dist/src/commands/export.js +4 -4
- package/dist/src/commands/furnace/apply.js +16 -16
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +1 -1
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
- package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
- package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
- package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
- package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
- package/dist/src/commands/furnace/chrome-doc.js +18 -18
- package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
- package/dist/src/commands/furnace/create-browser-test.js +4 -4
- package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
- package/dist/src/commands/furnace/create-dry-run.js +4 -4
- package/dist/src/commands/furnace/create-features.d.ts +2 -2
- package/dist/src/commands/furnace/create-features.js +2 -2
- package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
- package/dist/src/commands/furnace/create-mochikit.js +7 -7
- package/dist/src/commands/furnace/create-templates.d.ts +14 -14
- package/dist/src/commands/furnace/create-templates.js +18 -18
- package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
- package/dist/src/commands/furnace/create-xpcshell.js +8 -8
- package/dist/src/commands/furnace/create.d.ts +1 -1
- package/dist/src/commands/furnace/create.js +10 -10
- package/dist/src/commands/furnace/deploy.js +4 -4
- package/dist/src/commands/furnace/diff.js +7 -7
- package/dist/src/commands/furnace/index.js +1 -1
- package/dist/src/commands/furnace/init.js +15 -15
- package/dist/src/commands/furnace/list.js +2 -2
- package/dist/src/commands/furnace/override.d.ts +1 -1
- package/dist/src/commands/furnace/override.js +15 -15
- package/dist/src/commands/furnace/preview.js +17 -17
- package/dist/src/commands/furnace/refresh.js +6 -6
- package/dist/src/commands/furnace/remove-mutations.d.ts +3 -3
- package/dist/src/commands/furnace/remove-mutations.js +19 -18
- package/dist/src/commands/furnace/remove-state.d.ts +1 -1
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +2 -2
- package/dist/src/commands/furnace/rename-browser-test.js +9 -8
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
- package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
- package/dist/src/commands/furnace/rename.js +9 -9
- package/dist/src/commands/furnace/scan.js +3 -3
- package/dist/src/commands/furnace/status.js +7 -7
- package/dist/src/commands/furnace/sync.js +6 -6
- package/dist/src/commands/furnace/test-file-name.d.ts +2 -2
- package/dist/src/commands/furnace/test-file-name.js +2 -2
- package/dist/src/commands/furnace/validate.js +11 -12
- package/dist/src/commands/import.js +20 -20
- package/dist/src/commands/lint-per-patch.js +8 -8
- package/dist/src/commands/lint-per-run-checkjs.d.ts +12 -13
- package/dist/src/commands/lint-per-run-checkjs.js +14 -15
- package/dist/src/commands/lint-report.d.ts +3 -3
- package/dist/src/commands/lint-report.js +4 -4
- package/dist/src/commands/lint.d.ts +3 -3
- package/dist/src/commands/lint.js +35 -35
- package/dist/src/commands/manifest.d.ts +4 -4
- package/dist/src/commands/package.js +2 -2
- package/dist/src/commands/patch/compact.d.ts +2 -2
- package/dist/src/commands/patch/compact.js +8 -8
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +8 -8
- package/dist/src/commands/patch/lint-ignore.d.ts +3 -4
- package/dist/src/commands/patch/lint-ignore.js +14 -15
- package/dist/src/commands/patch/move-files-create.d.ts +2 -2
- package/dist/src/commands/patch/move-files-create.js +5 -5
- package/dist/src/commands/patch/move-files-into.d.ts +2 -2
- package/dist/src/commands/patch/move-files-into.js +3 -3
- package/dist/src/commands/patch/move-files.js +1 -1
- package/dist/src/commands/patch/patch-context.d.ts +1 -1
- package/dist/src/commands/patch/rename.d.ts +4 -4
- package/dist/src/commands/patch/rename.js +8 -8
- package/dist/src/commands/patch/reorder.js +10 -10
- package/dist/src/commands/patch/split-plan.d.ts +3 -3
- package/dist/src/commands/patch/split-plan.js +6 -5
- package/dist/src/commands/patch/split.d.ts +2 -2
- package/dist/src/commands/patch/split.js +5 -5
- package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
- package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency.js +6 -6
- package/dist/src/commands/patch/tier.d.ts +2 -2
- package/dist/src/commands/patch/tier.js +5 -5
- package/dist/src/commands/patch-rename-map.d.ts +1 -1
- package/dist/src/commands/patch-rename-map.js +1 -1
- package/dist/src/commands/pending-resolution.d.ts +5 -5
- package/dist/src/commands/pending-resolution.js +5 -5
- package/dist/src/commands/re-export-adjacent.d.ts +3 -3
- package/dist/src/commands/re-export-adjacent.js +8 -8
- package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
- package/dist/src/commands/re-export-bulk-scan.js +17 -17
- package/dist/src/commands/re-export-drift.d.ts +10 -10
- package/dist/src/commands/re-export-drift.js +29 -29
- package/dist/src/commands/re-export-files.js +14 -15
- package/dist/src/commands/re-export-lint.d.ts +26 -26
- package/dist/src/commands/re-export-lint.js +27 -27
- package/dist/src/commands/re-export-options.d.ts +1 -1
- package/dist/src/commands/re-export-options.js +1 -1
- package/dist/src/commands/re-export-register.d.ts +1 -1
- package/dist/src/commands/re-export-register.js +1 -1
- package/dist/src/commands/re-export-scan.d.ts +1 -1
- package/dist/src/commands/re-export-scan.js +7 -7
- package/dist/src/commands/re-export-single.d.ts +1 -1
- package/dist/src/commands/re-export-single.js +20 -20
- package/dist/src/commands/re-export.js +7 -6
- package/dist/src/commands/rebase/abort.js +6 -6
- package/dist/src/commands/rebase/continue.js +8 -7
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +3 -3
- package/dist/src/commands/rebase/patch-loop.js +18 -17
- package/dist/src/commands/register.js +5 -5
- package/dist/src/commands/reset.js +1 -1
- package/dist/src/commands/resolve.d.ts +2 -2
- package/dist/src/commands/resolve.js +3 -3
- package/dist/src/commands/run.js +26 -26
- package/dist/src/commands/setup-support.js +4 -4
- package/dist/src/commands/setup.js +1 -1
- package/dist/src/commands/source.js +1 -1
- package/dist/src/commands/status-check.d.ts +3 -3
- package/dist/src/commands/status-check.js +4 -4
- package/dist/src/commands/status-json.d.ts +14 -13
- package/dist/src/commands/status-json.js +9 -8
- package/dist/src/commands/status-output.d.ts +3 -3
- package/dist/src/commands/status-output.js +3 -3
- package/dist/src/commands/status-ownership.d.ts +3 -3
- package/dist/src/commands/status-ownership.js +3 -3
- package/dist/src/commands/status.js +22 -22
- package/dist/src/commands/test-build-phase.d.ts +1 -1
- package/dist/src/commands/test-build-phase.js +17 -17
- package/dist/src/commands/test-diagnose.d.ts +1 -1
- package/dist/src/commands/test-diagnose.js +20 -20
- package/dist/src/commands/test-modes.d.ts +2 -2
- package/dist/src/commands/test-modes.js +4 -4
- package/dist/src/commands/test-run.d.ts +11 -11
- package/dist/src/commands/test-run.js +15 -15
- package/dist/src/commands/test-stale-gate.d.ts +12 -12
- package/dist/src/commands/test-stale-gate.js +13 -13
- package/dist/src/commands/test-verdict.d.ts +6 -6
- package/dist/src/commands/test-verdict.js +11 -11
- package/dist/src/commands/test.d.ts +3 -3
- package/dist/src/commands/test.js +36 -36
- package/dist/src/commands/token-coverage.js +3 -3
- package/dist/src/commands/token-list.js +5 -5
- package/dist/src/commands/token.js +9 -9
- package/dist/src/commands/tree.js +19 -19
- package/dist/src/commands/typecheck.d.ts +6 -6
- package/dist/src/commands/typecheck.js +7 -7
- package/dist/src/commands/verify.d.ts +3 -3
- package/dist/src/commands/verify.js +10 -10
- package/dist/src/commands/watch.js +11 -11
- package/dist/src/commands/wire.js +13 -13
- package/dist/src/core/ast-utils.d.ts +7 -7
- package/dist/src/core/ast-utils.js +8 -8
- package/dist/src/core/branding.d.ts +5 -5
- package/dist/src/core/branding.js +3 -3
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +4 -4
- package/dist/src/core/build-audit-platform.d.ts +6 -6
- package/dist/src/core/build-audit-platform.js +26 -26
- package/dist/src/core/build-audit-registration.d.ts +5 -5
- package/dist/src/core/build-audit-registration.js +7 -7
- package/dist/src/core/build-audit-resolve.d.ts +5 -5
- package/dist/src/core/build-audit-resolve.js +6 -6
- package/dist/src/core/build-audit-skip.d.ts +8 -8
- package/dist/src/core/build-audit-skip.js +12 -12
- package/dist/src/core/build-audit-transforms.d.ts +2 -2
- package/dist/src/core/build-audit-transforms.js +3 -3
- package/dist/src/core/build-audit.d.ts +8 -8
- package/dist/src/core/build-audit.js +39 -37
- package/dist/src/core/build-baseline-types.d.ts +19 -18
- package/dist/src/core/build-baseline-types.js +1 -1
- package/dist/src/core/build-baseline.d.ts +8 -8
- package/dist/src/core/build-baseline.js +14 -14
- package/dist/src/core/build-jar-escalation.d.ts +8 -8
- package/dist/src/core/build-jar-escalation.js +15 -15
- package/dist/src/core/build-overwrite-guard.d.ts +4 -4
- package/dist/src/core/build-overwrite-guard.js +13 -13
- package/dist/src/core/build-prepare.d.ts +4 -4
- package/dist/src/core/build-prepare.js +16 -15
- package/dist/src/core/config-mutate.js +4 -4
- package/dist/src/core/config-state.js +2 -2
- package/dist/src/core/config-validate-build-audit.js +3 -3
- package/dist/src/core/config-validate-file-size.d.ts +1 -1
- package/dist/src/core/config-validate-file-size.js +2 -2
- package/dist/src/core/config-validate.js +8 -9
- package/dist/src/core/config.d.ts +10 -10
- package/dist/src/core/config.js +10 -10
- package/dist/src/core/coverage-extend.d.ts +16 -16
- package/dist/src/core/coverage-extend.js +16 -16
- package/dist/src/core/destructive.d.ts +14 -14
- package/dist/src/core/destructive.js +9 -9
- package/dist/src/core/diff-hunks.d.ts +2 -2
- package/dist/src/core/diff-hunks.js +7 -7
- package/dist/src/core/discard-baseline.d.ts +10 -10
- package/dist/src/core/discard-baseline.js +15 -16
- package/dist/src/core/display-state.d.ts +11 -11
- package/dist/src/core/display-state.js +12 -12
- package/dist/src/core/engine-changes.d.ts +2 -2
- package/dist/src/core/engine-changes.js +2 -2
- package/dist/src/core/engine-precondition.d.ts +4 -4
- package/dist/src/core/engine-precondition.js +2 -2
- package/dist/src/core/engine-session-lock.d.ts +18 -18
- package/dist/src/core/engine-session-lock.js +37 -37
- package/dist/src/core/export-moved-code-shape.d.ts +7 -7
- package/dist/src/core/export-moved-code-shape.js +8 -8
- package/dist/src/core/file-lock-owner.d.ts +11 -11
- package/dist/src/core/file-lock-owner.js +18 -18
- package/dist/src/core/file-lock.d.ts +12 -12
- package/dist/src/core/file-lock.js +52 -39
- package/dist/src/core/firefox-cache.d.ts +1 -1
- package/dist/src/core/firefox-cache.js +10 -10
- package/dist/src/core/firefox-download.d.ts +3 -3
- package/dist/src/core/firefox-download.js +6 -6
- package/dist/src/core/firefox-extract.d.ts +2 -2
- package/dist/src/core/firefox-extract.js +13 -13
- package/dist/src/core/firefox.d.ts +5 -5
- package/dist/src/core/firefox.js +8 -8
- package/dist/src/core/furnace-apply-dry-run.js +1 -1
- package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
- package/dist/src/core/furnace-apply-ftl.js +8 -8
- package/dist/src/core/furnace-apply-helpers.d.ts +9 -9
- package/dist/src/core/furnace-apply-helpers.js +21 -21
- package/dist/src/core/furnace-apply-output.js +1 -1
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +9 -9
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
- package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
- package/dist/src/core/furnace-apply.d.ts +3 -3
- package/dist/src/core/furnace-apply.js +22 -21
- package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
- package/dist/src/core/furnace-checksum-utils.js +5 -5
- package/dist/src/core/furnace-config-custom.d.ts +1 -1
- package/dist/src/core/furnace-config-custom.js +2 -2
- package/dist/src/core/furnace-config-order.js +1 -1
- package/dist/src/core/furnace-config-tokens.d.ts +3 -3
- package/dist/src/core/furnace-config-tokens.js +3 -3
- package/dist/src/core/furnace-config-validate.js +2 -2
- package/dist/src/core/furnace-config.d.ts +4 -4
- package/dist/src/core/furnace-config.js +18 -18
- package/dist/src/core/furnace-constants.d.ts +6 -6
- package/dist/src/core/furnace-constants.js +6 -6
- package/dist/src/core/furnace-css-fragments.d.ts +6 -6
- package/dist/src/core/furnace-css-fragments.js +11 -11
- package/dist/src/core/furnace-dir-entry.d.ts +1 -1
- package/dist/src/core/furnace-dir-entry.js +1 -1
- package/dist/src/core/furnace-jsconfig.d.ts +7 -7
- package/dist/src/core/furnace-jsconfig.js +22 -20
- package/dist/src/core/furnace-operation.d.ts +21 -20
- package/dist/src/core/furnace-operation.js +36 -34
- package/dist/src/core/furnace-precondition.d.ts +10 -10
- package/dist/src/core/furnace-precondition.js +8 -8
- package/dist/src/core/furnace-refresh.js +2 -2
- package/dist/src/core/furnace-registration-ast.d.ts +2 -2
- package/dist/src/core/furnace-registration-ast.js +9 -9
- package/dist/src/core/furnace-registration-remove.d.ts +4 -4
- package/dist/src/core/furnace-registration-remove.js +6 -6
- package/dist/src/core/furnace-registration-validate.d.ts +2 -2
- package/dist/src/core/furnace-registration-validate.js +2 -2
- package/dist/src/core/furnace-registration.d.ts +5 -5
- package/dist/src/core/furnace-registration.js +7 -7
- package/dist/src/core/furnace-rollback.d.ts +1 -1
- package/dist/src/core/furnace-rollback.js +5 -5
- package/dist/src/core/furnace-stale-export.d.ts +17 -16
- package/dist/src/core/furnace-stale-export.js +16 -15
- package/dist/src/core/furnace-staleness.d.ts +2 -2
- package/dist/src/core/furnace-staleness.js +2 -2
- package/dist/src/core/furnace-state-persist.d.ts +10 -10
- package/dist/src/core/furnace-state-persist.js +10 -10
- package/dist/src/core/furnace-step-errors.d.ts +6 -6
- package/dist/src/core/furnace-step-errors.js +6 -6
- package/dist/src/core/furnace-validate-accessibility.js +14 -14
- package/dist/src/core/furnace-validate-compatibility.js +9 -9
- package/dist/src/core/furnace-validate-registration.d.ts +2 -2
- package/dist/src/core/furnace-validate-registration.js +13 -13
- package/dist/src/core/furnace-validate-structure.d.ts +1 -1
- package/dist/src/core/furnace-validate-structure.js +4 -4
- package/dist/src/core/furnace-validate.js +9 -9
- package/dist/src/core/furnace-version-drift.d.ts +5 -5
- package/dist/src/core/furnace-version-drift.js +5 -5
- package/dist/src/core/git-base.d.ts +4 -4
- package/dist/src/core/git-base.js +9 -9
- package/dist/src/core/git-diff-new-file.d.ts +4 -4
- package/dist/src/core/git-diff-new-file.js +8 -8
- package/dist/src/core/git-diff.d.ts +4 -4
- package/dist/src/core/git-diff.js +35 -34
- package/dist/src/core/git-file-ops.d.ts +6 -6
- package/dist/src/core/git-file-ops.js +7 -7
- package/dist/src/core/git-readonly-index.d.ts +12 -12
- package/dist/src/core/git-readonly-index.js +12 -12
- package/dist/src/core/git-status.d.ts +4 -4
- package/dist/src/core/git-status.js +4 -4
- package/dist/src/core/git.d.ts +3 -3
- package/dist/src/core/git.js +14 -14
- package/dist/src/core/harness-orphans.d.ts +17 -17
- package/dist/src/core/harness-orphans.js +20 -20
- package/dist/src/core/history-log.d.ts +3 -3
- package/dist/src/core/history-log.js +3 -3
- package/dist/src/core/license-headers.d.ts +19 -18
- package/dist/src/core/license-headers.js +29 -28
- package/dist/src/core/mach-build-artifacts.d.ts +21 -21
- package/dist/src/core/mach-build-artifacts.js +23 -23
- package/dist/src/core/mach-error-hints.d.ts +5 -5
- package/dist/src/core/mach-error-hints.js +13 -13
- package/dist/src/core/mach-known-noise-filter.d.ts +41 -38
- package/dist/src/core/mach-known-noise-filter.js +53 -50
- package/dist/src/core/mach-mozconfig.d.ts +6 -6
- package/dist/src/core/mach-mozconfig.js +15 -15
- package/dist/src/core/mach-python.d.ts +2 -1
- package/dist/src/core/mach-python.js +4 -3
- package/dist/src/core/mach-resource-shim.d.ts +12 -12
- package/dist/src/core/mach-resource-shim.js +20 -20
- package/dist/src/core/mach.d.ts +23 -23
- package/dist/src/core/mach.js +36 -36
- package/dist/src/core/marionette-port.d.ts +15 -13
- package/dist/src/core/marionette-port.js +34 -31
- package/dist/src/core/marionette-preflight.d.ts +6 -6
- package/dist/src/core/marionette-preflight.js +23 -23
- package/dist/src/core/markdown-table.d.ts +9 -9
- package/dist/src/core/markdown-table.js +14 -14
- package/dist/src/core/mochitest-server-port.d.ts +8 -8
- package/dist/src/core/mochitest-server-port.js +14 -14
- package/dist/src/core/module-resolution-preflight.d.ts +8 -8
- package/dist/src/core/module-resolution-preflight.js +11 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
- package/dist/src/core/moz-manifest-helpers.js +7 -7
- package/dist/src/core/moz-manifest-register.d.ts +1 -1
- package/dist/src/core/moz-manifest-register.js +2 -2
- package/dist/src/core/moz-manifest-rules.js +11 -11
- package/dist/src/core/moz-manifest-tokenizers.js +1 -1
- package/dist/src/core/ownership-table.d.ts +5 -5
- package/dist/src/core/ownership-table.js +7 -7
- package/dist/src/core/parser-fallback.d.ts +3 -3
- package/dist/src/core/parser-fallback.js +3 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
- package/dist/src/core/patch-apply-fuzz.js +9 -9
- package/dist/src/core/patch-apply.d.ts +9 -9
- package/dist/src/core/patch-apply.js +30 -30
- package/dist/src/core/patch-export-update.d.ts +4 -4
- package/dist/src/core/patch-export-update.js +3 -3
- package/dist/src/core/patch-export.d.ts +10 -10
- package/dist/src/core/patch-export.js +13 -13
- package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
- package/dist/src/core/patch-identifier-suggest.js +4 -4
- package/dist/src/core/patch-lint-binary.d.ts +7 -7
- package/dist/src/core/patch-lint-cache.d.ts +2 -2
- package/dist/src/core/patch-lint-cache.js +13 -13
- package/dist/src/core/patch-lint-checkjs.d.ts +26 -26
- package/dist/src/core/patch-lint-checkjs.js +42 -41
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
- package/dist/src/core/patch-lint-creators.d.ts +3 -3
- package/dist/src/core/patch-lint-creators.js +3 -3
- package/dist/src/core/patch-lint-cross.d.ts +13 -13
- package/dist/src/core/patch-lint-cross.js +21 -21
- package/dist/src/core/patch-lint-css.d.ts +1 -1
- package/dist/src/core/patch-lint-css.js +5 -5
- package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
- package/dist/src/core/patch-lint-diff-tag.js +5 -5
- package/dist/src/core/patch-lint-diff.d.ts +4 -4
- package/dist/src/core/patch-lint-diff.js +4 -4
- package/dist/src/core/patch-lint-file-size.d.ts +3 -3
- package/dist/src/core/patch-lint-file-size.js +3 -3
- package/dist/src/core/patch-lint-forward-registration.d.ts +4 -4
- package/dist/src/core/patch-lint-forward-registration.js +12 -12
- package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
- package/dist/src/core/patch-lint-jsdoc.js +11 -11
- package/dist/src/core/patch-lint-module-registration.d.ts +1 -1
- package/dist/src/core/patch-lint-module-registration.js +1 -1
- package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
- package/dist/src/core/patch-lint-mozbuild.js +10 -10
- package/dist/src/core/patch-lint-observer.d.ts +3 -3
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint-ownership.d.ts +6 -6
- package/dist/src/core/patch-lint-ownership.js +6 -6
- package/dist/src/core/patch-lint-prettier.d.ts +6 -6
- package/dist/src/core/patch-lint-prettier.js +6 -6
- package/dist/src/core/patch-lint-queue-types.d.ts +1 -1
- package/dist/src/core/patch-lint-queue-types.js +1 -1
- package/dist/src/core/patch-lint-staged-registration.d.ts +2 -2
- package/dist/src/core/patch-lint-staged-registration.js +6 -6
- package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
- package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
- package/dist/src/core/patch-lint.d.ts +27 -26
- package/dist/src/core/patch-lint.js +48 -46
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +8 -8
- package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
- package/dist/src/core/patch-manifest-consistency.js +16 -17
- package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
- package/dist/src/core/patch-manifest-files-affected.js +3 -3
- package/dist/src/core/patch-manifest-io.d.ts +14 -14
- package/dist/src/core/patch-manifest-io.js +27 -27
- package/dist/src/core/patch-manifest-query.d.ts +1 -1
- package/dist/src/core/patch-manifest-query.js +4 -4
- package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
- package/dist/src/core/patch-manifest-resolve.js +7 -7
- package/dist/src/core/patch-manifest-validate.js +3 -3
- package/dist/src/core/patch-manifest.d.ts +2 -2
- package/dist/src/core/patch-manifest.js +2 -2
- package/dist/src/core/patch-parse.d.ts +14 -14
- package/dist/src/core/patch-parse.js +16 -16
- package/dist/src/core/patch-registration-refs.d.ts +4 -4
- package/dist/src/core/patch-registration-refs.js +7 -7
- package/dist/src/core/patch-transform.d.ts +8 -8
- package/dist/src/core/patch-transform.js +13 -13
- package/dist/src/core/process-cpu-time.d.ts +1 -1
- package/dist/src/core/process-cpu-time.js +5 -5
- package/dist/src/core/rebase-session.d.ts +7 -7
- package/dist/src/core/rebase-session.js +8 -8
- package/dist/src/core/register-result.d.ts +1 -1
- package/dist/src/core/register-result.js +1 -1
- package/dist/src/core/register-scaffold.d.ts +2 -2
- package/dist/src/core/register-scaffold.js +3 -3
- package/dist/src/core/register-shared-css.d.ts +3 -3
- package/dist/src/core/register-shared-css.js +4 -4
- package/dist/src/core/register-xpcshell-test.d.ts +2 -2
- package/dist/src/core/register-xpcshell-test.js +2 -2
- package/dist/src/core/run-log-redact.d.ts +12 -12
- package/dist/src/core/run-log-redact.js +16 -16
- package/dist/src/core/run-log.d.ts +9 -9
- package/dist/src/core/run-log.js +14 -14
- package/dist/src/core/shared-ftl.d.ts +2 -2
- package/dist/src/core/shared-ftl.js +6 -6
- package/dist/src/core/signal-critical.d.ts +2 -2
- package/dist/src/core/signal-critical.js +2 -2
- package/dist/src/core/smoke-patterns.d.ts +5 -5
- package/dist/src/core/smoke-patterns.js +9 -9
- package/dist/src/core/state-file.d.ts +3 -3
- package/dist/src/core/status-binary.d.ts +8 -8
- package/dist/src/core/status-binary.js +12 -12
- package/dist/src/core/status-classify.d.ts +17 -17
- package/dist/src/core/status-classify.js +11 -11
- package/dist/src/core/test-changed-prefs.d.ts +12 -12
- package/dist/src/core/test-changed-prefs.js +15 -15
- package/dist/src/core/test-harness-crash.d.ts +39 -39
- package/dist/src/core/test-harness-crash.js +67 -67
- package/dist/src/core/test-harness-output.d.ts +7 -7
- package/dist/src/core/test-harness-output.js +7 -7
- package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
- package/dist/src/core/test-harness-verdict-notes.js +4 -4
- package/dist/src/core/test-path-scope.d.ts +8 -8
- package/dist/src/core/test-path-scope.js +11 -11
- package/dist/src/core/test-stale-check.d.ts +22 -21
- package/dist/src/core/test-stale-check.js +29 -28
- package/dist/src/core/test-stale-symlink.d.ts +1 -1
- package/dist/src/core/test-stale-symlink.js +1 -1
- package/dist/src/core/test-stall-triage.d.ts +9 -9
- package/dist/src/core/test-stall-triage.js +22 -22
- package/dist/src/core/token-category.d.ts +4 -4
- package/dist/src/core/token-category.js +13 -12
- package/dist/src/core/token-coverage.js +4 -5
- package/dist/src/core/token-dark-mode.d.ts +17 -9
- package/dist/src/core/token-dark-mode.js +41 -28
- package/dist/src/core/token-docs.d.ts +1 -1
- package/dist/src/core/token-inventory.d.ts +6 -6
- package/dist/src/core/token-inventory.js +7 -7
- package/dist/src/core/token-manager.d.ts +3 -3
- package/dist/src/core/token-manager.js +21 -21
- package/dist/src/core/token-scaffold.d.ts +4 -4
- package/dist/src/core/token-scaffold.js +4 -4
- package/dist/src/core/token-variant.d.ts +14 -14
- package/dist/src/core/token-variant.js +32 -32
- package/dist/src/core/toolchain-preflight.d.ts +15 -15
- package/dist/src/core/toolchain-preflight.js +22 -22
- package/dist/src/core/tree-cow.d.ts +3 -3
- package/dist/src/core/tree-cow.js +6 -6
- package/dist/src/core/tree-guard.d.ts +3 -3
- package/dist/src/core/tree-guard.js +23 -23
- package/dist/src/core/tree-store.d.ts +15 -15
- package/dist/src/core/tree-store.js +35 -33
- package/dist/src/core/typecheck-shim.d.ts +16 -15
- package/dist/src/core/typecheck-shim.js +26 -25
- package/dist/src/core/typecheck.d.ts +12 -12
- package/dist/src/core/typecheck.js +31 -31
- package/dist/src/core/wire-destroy.d.ts +2 -2
- package/dist/src/core/wire-destroy.js +5 -5
- package/dist/src/core/wire-dom-fragment.d.ts +3 -3
- package/dist/src/core/wire-dom-fragment.js +6 -6
- package/dist/src/core/wire-init.d.ts +2 -2
- package/dist/src/core/wire-init.js +7 -7
- package/dist/src/core/wire-subscript.d.ts +1 -1
- package/dist/src/core/wire-subscript.js +3 -3
- package/dist/src/core/wire-utils.d.ts +9 -9
- package/dist/src/core/wire-utils.js +11 -11
- package/dist/src/core/xpcshell-appdir.d.ts +20 -20
- package/dist/src/core/xpcshell-appdir.js +26 -26
- package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
- package/dist/src/core/xpcshell-profile-dir.js +7 -7
- package/dist/src/errors/base.d.ts +22 -21
- package/dist/src/errors/base.js +22 -21
- package/dist/src/errors/build.d.ts +6 -6
- package/dist/src/errors/build.js +6 -6
- package/dist/src/errors/codes.d.ts +10 -10
- package/dist/src/errors/codes.js +10 -10
- package/dist/src/errors/furnace.d.ts +2 -2
- package/dist/src/errors/git.d.ts +1 -1
- package/dist/src/errors/git.js +1 -1
- package/dist/src/errors/patch.d.ts +3 -3
- package/dist/src/errors/patch.js +3 -3
- package/dist/src/errors/rebase.d.ts +1 -1
- package/dist/src/errors/rebase.js +1 -1
- package/dist/src/errors/run.d.ts +1 -1
- package/dist/src/errors/run.js +1 -1
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.js +4 -4
- package/dist/src/types/commands/options.d.ts +86 -85
- package/dist/src/types/commands/patches.d.ts +19 -19
- package/dist/src/types/commands/project.d.ts +3 -3
- package/dist/src/types/config.d.ts +24 -23
- package/dist/src/types/furnace.d.ts +17 -17
- package/dist/src/types/json.d.ts +3 -3
- package/dist/src/types/json.js +2 -2
- package/dist/src/types/typecheck.d.ts +3 -3
- package/dist/src/utils/assert.d.ts +1 -1
- package/dist/src/utils/assert.js +6 -6
- package/dist/src/utils/build-info.d.ts +5 -5
- package/dist/src/utils/build-info.js +6 -6
- package/dist/src/utils/child-env.d.ts +5 -5
- package/dist/src/utils/child-env.js +5 -5
- package/dist/src/utils/concurrency.d.ts +2 -2
- package/dist/src/utils/concurrency.js +2 -2
- package/dist/src/utils/elapsed.js +1 -1
- package/dist/src/utils/errors.d.ts +8 -8
- package/dist/src/utils/errors.js +8 -8
- package/dist/src/utils/fs.d.ts +1 -1
- package/dist/src/utils/fs.js +8 -8
- package/dist/src/utils/line-dispatch.d.ts +3 -3
- package/dist/src/utils/line-dispatch.js +5 -5
- package/dist/src/utils/logger.d.ts +4 -4
- package/dist/src/utils/logger.js +11 -11
- package/dist/src/utils/machine-output.js +2 -2
- package/dist/src/utils/options.d.ts +13 -13
- package/dist/src/utils/options.js +20 -20
- package/dist/src/utils/package-root.js +2 -2
- package/dist/src/utils/paths.d.ts +4 -4
- package/dist/src/utils/paths.js +4 -4
- package/dist/src/utils/process-group.d.ts +8 -8
- package/dist/src/utils/process-group.js +19 -19
- package/dist/src/utils/process.d.ts +34 -33
- package/dist/src/utils/process.js +20 -19
- package/dist/src/utils/ps-duration.d.ts +4 -4
- package/dist/src/utils/ps-duration.js +6 -6
- package/dist/src/utils/regex.d.ts +4 -4
- package/dist/src/utils/regex.js +7 -7
- package/dist/src/utils/sleep.d.ts +7 -7
- package/dist/src/utils/sleep.js +7 -7
- package/dist/src/utils/stdio-drain.d.ts +7 -7
- package/dist/src/utils/stdio-drain.js +8 -8
- package/dist/src/utils/validation.d.ts +11 -12
- package/dist/src/utils/validation.js +20 -21
- package/docs/README.md +2 -2
- package/docs/configuration.md +120 -114
- package/docs/exit-codes.md +63 -58
- package/docs/furnace.md +20 -19
- package/docs/lifecycle-invariants.md +412 -251
- package/docs/machine-output.md +33 -32
- package/docs/patch-workflow.md +48 -45
- package/docs/run-logs.md +62 -58
- package/docs/testing.md +101 -101
- package/docs/verification-trees.md +23 -22
- package/package.json +2 -2
|
@@ -45,7 +45,7 @@ export function canaryTimeoutSeconds(projectConfig) {
|
|
|
45
45
|
/** Emits or throws the one-word canary verdict. */
|
|
46
46
|
export function reportCanaryOutcome(outcome) {
|
|
47
47
|
// Written raw as the run's last stdout line on green and throw paths
|
|
48
|
-
// alike
|
|
48
|
+
// alike. See the FIREFORGE-VERDICT contract in test-harness-crash.ts.
|
|
49
49
|
try {
|
|
50
50
|
if (outcome.verdict.kind === 'tests-ran-ok') {
|
|
51
51
|
success('Canary: green');
|
|
@@ -97,16 +97,16 @@ function buildMixedHarnessMessage(classification) {
|
|
|
97
97
|
* dispatch, so refusing it before spending minutes in a pre-test build
|
|
98
98
|
* is strictly better. A nonexistent path classifies as
|
|
99
99
|
* nonXpcshell (findNearestXpcshellManifest returns null), so classifying
|
|
100
|
-
* before assertTestPathsExist is harmless
|
|
100
|
+
* before assertTestPathsExist is harmless: existence is still asserted
|
|
101
101
|
* after the stale/coverage gates, preserving their precedence over
|
|
102
102
|
* missing-path errors. `xpcshellOnly` (non-empty request, zero
|
|
103
103
|
* nonXpcshell paths) gates the Marionette preflight and the mochitest
|
|
104
|
-
* client flags
|
|
104
|
+
* client flags. Pathless runs keep the full-suite behavior.
|
|
105
105
|
*/
|
|
106
106
|
export async function classifyBeforeDispatch(engineDir, normalizedPaths, options) {
|
|
107
107
|
const classification = await classifyTestHarnesses(engineDir, normalizedPaths);
|
|
108
108
|
if (classification.xpcshell.length > 0 && classification.nonXpcshell.length > 0) {
|
|
109
|
-
// `--build-only` never dispatches, so a mixed request is legal there
|
|
109
|
+
// `--build-only` never dispatches, so a mixed request is legal there:
|
|
110
110
|
// packaging the union is the whole point.
|
|
111
111
|
if (options?.allowMixed !== true) {
|
|
112
112
|
throw new GeneralError(buildMixedHarnessMessage(classification));
|
|
@@ -3,10 +3,10 @@
|
|
|
3
3
|
* sequential per-file sharding of multi-path invocations.
|
|
4
4
|
*
|
|
5
5
|
* Sharding exists because passing several browser-chrome files to one mach
|
|
6
|
-
* invocation destabilizes later files
|
|
6
|
+
* invocation destabilizes later files: cross-file profile/pref bleed in the
|
|
7
7
|
* shared mochitest profile makes the second file time out at window-open
|
|
8
8
|
* while each file passes in isolation. Sequential single-file harness runs
|
|
9
|
-
* cost startup time but make results reproducible
|
|
9
|
+
* cost startup time but make results reproducible. The combined invocation
|
|
10
10
|
* stays available via `--no-shard`.
|
|
11
11
|
*/
|
|
12
12
|
import { type DisplaySleepState } from '../core/display-state.js';
|
|
@@ -54,8 +54,8 @@ export interface TestRunOutcome {
|
|
|
54
54
|
/** Whether xpcshell appdir injection was attempted for this invocation. */
|
|
55
55
|
appdirInjectionAttempted: boolean;
|
|
56
56
|
/**
|
|
57
|
-
* Display power state measured for a HEADED no-output stall
|
|
58
|
-
*
|
|
57
|
+
* Display power state measured for a HEADED no-output stall. Undefined
|
|
58
|
+
* when the shape did not apply and no probe ran.
|
|
59
59
|
*/
|
|
60
60
|
displayState?: DisplaySleepState | undefined;
|
|
61
61
|
}
|
|
@@ -68,7 +68,7 @@ export declare function runTestsWithRetries(ctx: TestRunContext, paths: string[]
|
|
|
68
68
|
/**
|
|
69
69
|
* One sequential harness invocation of a sharded run: a requested path
|
|
70
70
|
* argument and the mach paths dispatched for it. A file argument is a group
|
|
71
|
-
* of one
|
|
71
|
+
* of one. A directory argument groups its enumerated test files so the whole
|
|
72
72
|
* directory still runs in ONE browser instance, keeping cross-file state
|
|
73
73
|
* behaviour within a directory run.
|
|
74
74
|
*/
|
|
@@ -88,25 +88,25 @@ export interface ShardedRunSummary {
|
|
|
88
88
|
shards: ShardOutcome[];
|
|
89
89
|
passed: number;
|
|
90
90
|
total: number;
|
|
91
|
-
/** Aggregate classifier verdict
|
|
91
|
+
/** Aggregate classifier verdict. See {@link deriveAggregateShardVerdict}. */
|
|
92
92
|
aggregate: HarnessRunVerdict;
|
|
93
93
|
}
|
|
94
94
|
/**
|
|
95
95
|
* Derives the aggregate classification for a sharded run: all-green is
|
|
96
|
-
* `tests-ran-ok
|
|
96
|
+
* `tests-ran-ok`. Otherwise the most structural failure wins. A crashed
|
|
97
97
|
* shard makes the whole run `harness-crash`, then `no-tests`, then plain
|
|
98
|
-
* `test-failures
|
|
98
|
+
* `test-failures`, so the aggregate `reason=` keeps the classifier-driven
|
|
99
99
|
* contract instead of collapsing every failure to `test-failures`.
|
|
100
100
|
*/
|
|
101
101
|
export declare function deriveAggregateShardVerdict(shards: ShardOutcome[]): HarnessRunVerdict;
|
|
102
102
|
/**
|
|
103
103
|
* Runs each requested path argument as its own sequential harness
|
|
104
104
|
* invocation (a directory argument's enumerated files stay together in
|
|
105
|
-
* one invocation
|
|
105
|
+
* one invocation, see {@link ShardGroup}) and prints an aggregate
|
|
106
106
|
* report. Per-shard failures are diagnosed via `diagnoseShardFailure`
|
|
107
107
|
* (which receives the throwing diagnosis chain from the command layer)
|
|
108
108
|
* but downgraded to warnings so every shard runs. The aggregate verdict
|
|
109
|
-
* line and the aggregate error are
|
|
109
|
+
* line and the aggregate error are not produced here: the caller runs
|
|
110
110
|
* the engine-generation integrity check first and then calls
|
|
111
111
|
* {@link finalizeShardedOutcome}, so a run invalidated by a concurrent
|
|
112
112
|
* `engine/` mutation can never print `PASS` before the check fails.
|
|
@@ -114,7 +114,7 @@ export declare function deriveAggregateShardVerdict(shards: ShardOutcome[]): Har
|
|
|
114
114
|
export declare function runShardedTests(ctx: TestRunContext, groups: ShardGroup[], diagnoseShardFailure: (outcome: TestRunOutcome, label: string) => string | undefined): Promise<ShardedRunSummary>;
|
|
115
115
|
/**
|
|
116
116
|
* Emits the aggregate FIREFORGE-VERDICT line for a sharded run, then
|
|
117
|
-
* throws the aggregate error when any shard did not pass
|
|
117
|
+
* throws the aggregate error when any shard did not pass, the same
|
|
118
118
|
* emit-then-throw shape as `finalizeSingleRunOutcome`. Called only after
|
|
119
119
|
* the engine-generation check succeeded.
|
|
120
120
|
*/
|
|
@@ -4,10 +4,10 @@
|
|
|
4
4
|
* sequential per-file sharding of multi-path invocations.
|
|
5
5
|
*
|
|
6
6
|
* Sharding exists because passing several browser-chrome files to one mach
|
|
7
|
-
* invocation destabilizes later files
|
|
7
|
+
* invocation destabilizes later files: cross-file profile/pref bleed in the
|
|
8
8
|
* shared mochitest profile makes the second file time out at window-open
|
|
9
9
|
* while each file passes in isolation. Sequential single-file harness runs
|
|
10
|
-
* cost startup time but make results reproducible
|
|
10
|
+
* cost startup time but make results reproducible. The combined invocation
|
|
11
11
|
* stays available via `--no-shard`.
|
|
12
12
|
*/
|
|
13
13
|
import { probeDisplaySleepState } from '../core/display-state.js';
|
|
@@ -38,16 +38,16 @@ function machKindForSuite(suite) {
|
|
|
38
38
|
* stale-xpcshell-symlink repair path the single-run flow already used.
|
|
39
39
|
*/
|
|
40
40
|
export async function runTestsWithRetries(ctx, paths) {
|
|
41
|
-
// Pure mochitest dispatches keep their env byte-identical
|
|
41
|
+
// Pure mochitest dispatches keep their env byte-identical, since the profile
|
|
42
42
|
// variable is xpcshell-harness-specific. Generic `mach
|
|
43
43
|
// test` runs may include xpcshell paths, so they get the isolation too.
|
|
44
44
|
if (ctx.suite === 'mochitest') {
|
|
45
45
|
return runTestsWithRetriesInner(ctx, paths, ctx.env);
|
|
46
46
|
}
|
|
47
47
|
// Fresh profile dir per harness invocation: shards isolate from each
|
|
48
|
-
// other and from concurrent `fireforge test` processes
|
|
49
|
-
// symlink-repair retries inside one invocation
|
|
50
|
-
//
|
|
48
|
+
// other and from concurrent `fireforge test` processes. The crash /
|
|
49
|
+
// symlink-repair retries inside one invocation reuse the same directory
|
|
50
|
+
// on purpose (they are the same logical run and the harness
|
|
51
51
|
// re-initialises the profile contents itself).
|
|
52
52
|
return withXpcshellProfileDir(ctx.env, (env) => runTestsWithRetriesInner(ctx, paths, env));
|
|
53
53
|
}
|
|
@@ -88,7 +88,7 @@ async function runTestsWithRetriesInner(ctx, paths, env) {
|
|
|
88
88
|
`Retrying (attempt ${attempts + 1} of ${maxAttempts})...`);
|
|
89
89
|
}
|
|
90
90
|
// A verdict whose every unexpected result is time-driven pref noise is
|
|
91
|
-
// still a FAIL
|
|
91
|
+
// still a FAIL. Only the note changes, so a `unexpected=2` line is not
|
|
92
92
|
// read as two real assertion failures.
|
|
93
93
|
if (verdict.kind === 'test-failures' && verdict.note === undefined) {
|
|
94
94
|
const prefNote = changedPrefNoiseVerdictNote(`${result.stdout}\n${result.stderr}`);
|
|
@@ -108,9 +108,9 @@ async function runTestsWithRetriesInner(ctx, paths, env) {
|
|
|
108
108
|
return { result, verdict, attempts, appdirInjectionAttempted, displayState };
|
|
109
109
|
}
|
|
110
110
|
/**
|
|
111
|
-
* Probes the display's power state for a
|
|
112
|
-
* that shape. Every other outcome
|
|
113
|
-
* headless run, any other crash shape
|
|
111
|
+
* Probes the display's power state for a headed no-output stall, and only for
|
|
112
|
+
* that shape. Every other outcome (a passing run, a real test failure, a
|
|
113
|
+
* headless run, any other crash shape) skips the probe entirely, so the
|
|
114
114
|
* common paths spawn nothing.
|
|
115
115
|
*
|
|
116
116
|
* @returns The measured state, or undefined when the shape does not apply
|
|
@@ -132,9 +132,9 @@ const SHARD_STATUS_LABEL = {
|
|
|
132
132
|
};
|
|
133
133
|
/**
|
|
134
134
|
* Derives the aggregate classification for a sharded run: all-green is
|
|
135
|
-
* `tests-ran-ok
|
|
135
|
+
* `tests-ran-ok`. Otherwise the most structural failure wins. A crashed
|
|
136
136
|
* shard makes the whole run `harness-crash`, then `no-tests`, then plain
|
|
137
|
-
* `test-failures
|
|
137
|
+
* `test-failures`, so the aggregate `reason=` keeps the classifier-driven
|
|
138
138
|
* contract instead of collapsing every failure to `test-failures`.
|
|
139
139
|
*/
|
|
140
140
|
export function deriveAggregateShardVerdict(shards) {
|
|
@@ -150,11 +150,11 @@ export function deriveAggregateShardVerdict(shards) {
|
|
|
150
150
|
/**
|
|
151
151
|
* Runs each requested path argument as its own sequential harness
|
|
152
152
|
* invocation (a directory argument's enumerated files stay together in
|
|
153
|
-
* one invocation
|
|
153
|
+
* one invocation, see {@link ShardGroup}) and prints an aggregate
|
|
154
154
|
* report. Per-shard failures are diagnosed via `diagnoseShardFailure`
|
|
155
155
|
* (which receives the throwing diagnosis chain from the command layer)
|
|
156
156
|
* but downgraded to warnings so every shard runs. The aggregate verdict
|
|
157
|
-
* line and the aggregate error are
|
|
157
|
+
* line and the aggregate error are not produced here: the caller runs
|
|
158
158
|
* the engine-generation integrity check first and then calls
|
|
159
159
|
* {@link finalizeShardedOutcome}, so a run invalidated by a concurrent
|
|
160
160
|
* `engine/` mutation can never print `PASS` before the check fails.
|
|
@@ -193,7 +193,7 @@ export async function runShardedTests(ctx, groups, diagnoseShardFailure) {
|
|
|
193
193
|
}
|
|
194
194
|
/**
|
|
195
195
|
* Emits the aggregate FIREFORGE-VERDICT line for a sharded run, then
|
|
196
|
-
* throws the aggregate error when any shard did not pass
|
|
196
|
+
* throws the aggregate error when any shard did not pass, the same
|
|
197
197
|
* emit-then-throw shape as `finalizeSingleRunOutcome`. Called only after
|
|
198
198
|
* the engine-generation check succeeded.
|
|
199
199
|
*/
|
|
@@ -3,40 +3,40 @@
|
|
|
3
3
|
* and a run against a stale or under-packaged runtime: the packaging
|
|
4
4
|
* coverage refusal, the stale-content refusal, and the compiled
|
|
5
5
|
* StaticComponents refusal. Split out of `test.ts` so the command module
|
|
6
|
-
* stays wiring
|
|
6
|
+
* stays wiring. The probes and refusal copy live in
|
|
7
7
|
* `src/core/test-stale-check.ts`.
|
|
8
8
|
*/
|
|
9
9
|
import type { BuildBaseline } from '../core/build-baseline-types.js';
|
|
10
10
|
import type { TestOptions } from '../types/commands/index.js';
|
|
11
11
|
/**
|
|
12
|
-
* Stale-build preflight
|
|
13
|
-
* engine edits since the last successful build and fail
|
|
12
|
+
* Stale-build preflight: when `--build` was not requested, detect packageable
|
|
13
|
+
* engine edits since the last successful build and fail up front unless the
|
|
14
14
|
* operator explicitly accepts the stale package risk.
|
|
15
15
|
*
|
|
16
|
-
* Packaging
|
|
16
|
+
* Packaging coverage is checked first, on every non-`--build` run and
|
|
17
17
|
* regardless of staleness or `--allow-stale-build`: a runtime packaged by a
|
|
18
|
-
* file-scoped `test --build` can lack support fixtures for
|
|
19
|
-
* even when nothing changed since
|
|
18
|
+
* file-scoped `test --build` can lack support fixtures for other manifests
|
|
19
|
+
* even when nothing changed since, and dispatching such a run hangs on missing
|
|
20
20
|
* fixtures rather than failing, so the flag (which only accepts stale
|
|
21
|
-
*
|
|
21
|
+
* content) must not be the trigger. A three-file scoped rebuild leaving one
|
|
22
22
|
* fixture unpackaged makes a later run over different files time out waiting
|
|
23
23
|
* on an event that never fires.
|
|
24
24
|
*
|
|
25
25
|
* Exception: a path-less `test --doctor` stops at the Marionette health check
|
|
26
26
|
* (`runDoctorPreflight` returns 'stop' when no test paths were given) and
|
|
27
|
-
* never dispatches a test, so it needs no packaging coverage
|
|
27
|
+
* never dispatches a test, so it needs no packaging coverage. Treating it as
|
|
28
28
|
* a full-suite request would refuse a probe that touches no fixtures. The
|
|
29
29
|
* stale-content refusal still applies to it unchanged.
|
|
30
30
|
*/
|
|
31
31
|
export declare function enforceStaleBuildGate(projectRoot: string, engineDir: string, options: TestOptions, normalizedPaths: readonly string[]): Promise<void>;
|
|
32
32
|
/**
|
|
33
|
-
* Compiled-StaticComponents gate
|
|
33
|
+
* Compiled-StaticComponents gate: refuses runs whose child process would
|
|
34
34
|
* resolve a stale compiled component table. `components.conf` entries bake
|
|
35
|
-
* into compiled code that only a
|
|
35
|
+
* into compiled code that only a full build regenerates. A scoped
|
|
36
36
|
* `test --build` repackages the file but the failure surfaces as
|
|
37
37
|
* `NS_ERROR_MALFORMED_URI` inside the test. Applies to build-less runs
|
|
38
|
-
* (after the coverage refusal)
|
|
39
|
-
* the pre-test build
|
|
38
|
+
* (after the coverage refusal) and to scoped `test --build` runs (before
|
|
39
|
+
* the pre-test build, which cannot fix the table). A path-less
|
|
40
40
|
* `test --build` is exempt: its full build refreshes the anchor itself.
|
|
41
41
|
* `--allow-stale-components` downgrades the refusal to a warning.
|
|
42
42
|
*/
|
|
@@ -4,29 +4,29 @@
|
|
|
4
4
|
* and a run against a stale or under-packaged runtime: the packaging
|
|
5
5
|
* coverage refusal, the stale-content refusal, and the compiled
|
|
6
6
|
* StaticComponents refusal. Split out of `test.ts` so the command module
|
|
7
|
-
* stays wiring
|
|
7
|
+
* stays wiring. The probes and refusal copy live in
|
|
8
8
|
* `src/core/test-stale-check.ts`.
|
|
9
9
|
*/
|
|
10
10
|
import { checkStaleBuildForTest, checkStaticComponentsStale, findChangedTestManifestsForPaths, findUncoveredRequestPaths, formatStaleBuildWarning, formatStaticComponentsRefusal, formatTestCoverageRefusal, } from '../core/test-stale-check.js';
|
|
11
11
|
import { PreflightRefusalError } from '../errors/base.js';
|
|
12
12
|
import { warn } from '../utils/logger.js';
|
|
13
13
|
/**
|
|
14
|
-
* Stale-build preflight
|
|
15
|
-
* engine edits since the last successful build and fail
|
|
14
|
+
* Stale-build preflight: when `--build` was not requested, detect packageable
|
|
15
|
+
* engine edits since the last successful build and fail up front unless the
|
|
16
16
|
* operator explicitly accepts the stale package risk.
|
|
17
17
|
*
|
|
18
|
-
* Packaging
|
|
18
|
+
* Packaging coverage is checked first, on every non-`--build` run and
|
|
19
19
|
* regardless of staleness or `--allow-stale-build`: a runtime packaged by a
|
|
20
|
-
* file-scoped `test --build` can lack support fixtures for
|
|
21
|
-
* even when nothing changed since
|
|
20
|
+
* file-scoped `test --build` can lack support fixtures for other manifests
|
|
21
|
+
* even when nothing changed since, and dispatching such a run hangs on missing
|
|
22
22
|
* fixtures rather than failing, so the flag (which only accepts stale
|
|
23
|
-
*
|
|
23
|
+
* content) must not be the trigger. A three-file scoped rebuild leaving one
|
|
24
24
|
* fixture unpackaged makes a later run over different files time out waiting
|
|
25
25
|
* on an event that never fires.
|
|
26
26
|
*
|
|
27
27
|
* Exception: a path-less `test --doctor` stops at the Marionette health check
|
|
28
28
|
* (`runDoctorPreflight` returns 'stop' when no test paths were given) and
|
|
29
|
-
* never dispatches a test, so it needs no packaging coverage
|
|
29
|
+
* never dispatches a test, so it needs no packaging coverage. Treating it as
|
|
30
30
|
* a full-suite request would refuse a probe that touches no fixtures. The
|
|
31
31
|
* stale-content refusal still applies to it unchanged.
|
|
32
32
|
*/
|
|
@@ -37,7 +37,7 @@ export async function enforceStaleBuildGate(projectRoot, engineDir, options, nor
|
|
|
37
37
|
const recordedCoverage = stale.baseline?.testPackagingCoverage;
|
|
38
38
|
const uncovered = findUncoveredRequestPaths(recordedCoverage, normalizedPaths);
|
|
39
39
|
if (uncovered.length > 0) {
|
|
40
|
-
// The refusal is correct on its own
|
|
40
|
+
// The refusal is correct on its own. Naming the manifest that gained
|
|
41
41
|
// an entry is the triage step it otherwise leaves to the reader.
|
|
42
42
|
const changedManifests = await findChangedTestManifestsForPaths(engineDir, stale.baseline, uncovered);
|
|
43
43
|
throw new PreflightRefusalError(formatTestCoverageRefusal(uncovered, Array.isArray(recordedCoverage) ? recordedCoverage : [], changedManifests), 'coverage-replaced');
|
|
@@ -64,13 +64,13 @@ export async function enforceStaleBuildGate(projectRoot, engineDir, options, nor
|
|
|
64
64
|
}
|
|
65
65
|
}
|
|
66
66
|
/**
|
|
67
|
-
* Compiled-StaticComponents gate
|
|
67
|
+
* Compiled-StaticComponents gate: refuses runs whose child process would
|
|
68
68
|
* resolve a stale compiled component table. `components.conf` entries bake
|
|
69
|
-
* into compiled code that only a
|
|
69
|
+
* into compiled code that only a full build regenerates. A scoped
|
|
70
70
|
* `test --build` repackages the file but the failure surfaces as
|
|
71
71
|
* `NS_ERROR_MALFORMED_URI` inside the test. Applies to build-less runs
|
|
72
|
-
* (after the coverage refusal)
|
|
73
|
-
* the pre-test build
|
|
72
|
+
* (after the coverage refusal) and to scoped `test --build` runs (before
|
|
73
|
+
* the pre-test build, which cannot fix the table). A path-less
|
|
74
74
|
* `test --build` is exempt: its full build refreshes the anchor itself.
|
|
75
75
|
* `--allow-stale-components` downgrades the refusal to a warning.
|
|
76
76
|
*/
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { HarnessRunVerdict } from '../core/test-harness-crash.js';
|
|
2
2
|
/**
|
|
3
3
|
* Reason codes the emission layer can put on a `FIREFORGE-VERDICT: FAIL`
|
|
4
|
-
* line. The first three mirror the harness classifier
|
|
4
|
+
* line. The first three mirror the harness classifier. `preflight` covers
|
|
5
5
|
* every failure before harness classification (missing/stale builds,
|
|
6
6
|
* invalid paths, port conflicts, config errors, spawn failures),
|
|
7
7
|
* `inconclusive` marks a run whose harness result exists but cannot be
|
|
@@ -34,12 +34,12 @@ export declare function emitPassVerdict(): void;
|
|
|
34
34
|
* Emits a FAIL verdict carrying an emission-layer reason code, and
|
|
35
35
|
* optionally the refusal class that produced it.
|
|
36
36
|
*
|
|
37
|
-
* `note=` is
|
|
37
|
+
* `note=` is additive, like the `log=`, `signal=` and `shards=` keys already
|
|
38
38
|
* on this line: `reason=` is unchanged and still comes from the closed set
|
|
39
39
|
* in `docs/machine-output.md`, so a consumer that tokenises `key=value`
|
|
40
40
|
* pairs is unaffected. It exists because `reason=preflight` covers every
|
|
41
|
-
* gate before the harness
|
|
42
|
-
* developer browser holding the objdir
|
|
41
|
+
* gate before the harness (a missing build, a peer's packaging record, a
|
|
42
|
+
* developer browser holding the objdir), and an unattended reader whose
|
|
43
43
|
* pipe kept only the verdict line could not tell those apart.
|
|
44
44
|
*
|
|
45
45
|
* @param reason - Closed-set verdict reason
|
|
@@ -49,8 +49,8 @@ export declare function emitFailVerdict(reason: FireforgeVerdictReason, note?: s
|
|
|
49
49
|
/**
|
|
50
50
|
* Emits the terminal verdict for a run killed by a signal.
|
|
51
51
|
*
|
|
52
|
-
* Without it a killed run wrote
|
|
53
|
-
* distinguish "killed" from "still running" from "never started"
|
|
52
|
+
* Without it a killed run wrote no terminal line, so a log tail could not
|
|
53
|
+
* distinguish "killed" from "still running" from "never started". Recovery
|
|
54
54
|
* meant checking `ps` and the lock file by hand, at the exact moment (a
|
|
55
55
|
* mass kill under a usage limit, mid-drain) when the tree's state most
|
|
56
56
|
* needs to be readable. A no-op unless a run was actually in flight: the
|
|
@@ -27,21 +27,21 @@ export function verdictEmitted() {
|
|
|
27
27
|
return emitted;
|
|
28
28
|
}
|
|
29
29
|
/**
|
|
30
|
-
* Writes the run's single verdict line
|
|
31
|
-
* drop output under non-TTY capture)
|
|
30
|
+
* Writes the run's single verdict line to raw stdout (clack's renderer can
|
|
31
|
+
* drop output under non-TTY capture). First write wins. Every later call
|
|
32
32
|
* is a no-op: the writer closest to the harness result runs first, so the
|
|
33
33
|
* fallback layers (the engine-generation guard, the preflight wrapper)
|
|
34
34
|
* can emit unconditionally without risking a second line. Writing also
|
|
35
|
-
* seals stdout: the verdict must stay the run's
|
|
36
|
-
* subsequent logger output
|
|
37
|
-
* rendering after an emit-then-throw path
|
|
35
|
+
* seals stdout: the verdict must stay the run's last stdout write, so all
|
|
36
|
+
* subsequent logger output, including the CLI-boundary error/cancel
|
|
37
|
+
* rendering after an emit-then-throw path, routes to stderr.
|
|
38
38
|
*/
|
|
39
39
|
function writeVerdictLine(line) {
|
|
40
40
|
if (emitted)
|
|
41
41
|
return;
|
|
42
42
|
emitted = true;
|
|
43
43
|
// The run log's path rides the verdict line because the verdict must stay
|
|
44
|
-
// the run's
|
|
44
|
+
// the run's last stdout write: a separate announcement after it would
|
|
45
45
|
// break that contract, and one before it is the first thing a `tail` cuts.
|
|
46
46
|
// Appended as an additive `key=value`, so consumers that tokenize the line
|
|
47
47
|
// are unaffected and a truncated tail still says where the full output is.
|
|
@@ -65,12 +65,12 @@ export function emitPassVerdict() {
|
|
|
65
65
|
* Emits a FAIL verdict carrying an emission-layer reason code, and
|
|
66
66
|
* optionally the refusal class that produced it.
|
|
67
67
|
*
|
|
68
|
-
* `note=` is
|
|
68
|
+
* `note=` is additive, like the `log=`, `signal=` and `shards=` keys already
|
|
69
69
|
* on this line: `reason=` is unchanged and still comes from the closed set
|
|
70
70
|
* in `docs/machine-output.md`, so a consumer that tokenises `key=value`
|
|
71
71
|
* pairs is unaffected. It exists because `reason=preflight` covers every
|
|
72
|
-
* gate before the harness
|
|
73
|
-
* developer browser holding the objdir
|
|
72
|
+
* gate before the harness (a missing build, a peer's packaging record, a
|
|
73
|
+
* developer browser holding the objdir), and an unattended reader whose
|
|
74
74
|
* pipe kept only the verdict line could not tell those apart.
|
|
75
75
|
*
|
|
76
76
|
* @param reason - Closed-set verdict reason
|
|
@@ -83,8 +83,8 @@ export function emitFailVerdict(reason, note) {
|
|
|
83
83
|
/**
|
|
84
84
|
* Emits the terminal verdict for a run killed by a signal.
|
|
85
85
|
*
|
|
86
|
-
* Without it a killed run wrote
|
|
87
|
-
* distinguish "killed" from "still running" from "never started"
|
|
86
|
+
* Without it a killed run wrote no terminal line, so a log tail could not
|
|
87
|
+
* distinguish "killed" from "still running" from "never started". Recovery
|
|
88
88
|
* meant checking `ps` and the lock file by hand, at the exact moment (a
|
|
89
89
|
* mass kill under a usage limit, mid-drain) when the tree's state most
|
|
90
90
|
* needs to be readable. A no-op unless a run was actually in flight: the
|
|
@@ -4,9 +4,9 @@ import type { TestOptions } from '../types/commands/index.js';
|
|
|
4
4
|
*
|
|
5
5
|
* Owns the run's exactly-one-`FIREFORGE-VERDICT:`-line guarantee: the sink
|
|
6
6
|
* is re-armed at entry, and any failure that reaches this boundary without
|
|
7
|
-
* an inner writer having emitted
|
|
8
|
-
* build, config errors, stale-build and port gates, missing paths
|
|
9
|
-
* harness process that failed to start
|
|
7
|
+
* an inner writer having emitted (the preflight ladder: missing engine or
|
|
8
|
+
* build, config errors, stale-build and port gates, missing paths, and a
|
|
9
|
+
* harness process that failed to start) emits `FAIL reason=preflight`,
|
|
10
10
|
* since no harness classification exists for such a run. Writers closer to
|
|
11
11
|
* the harness (doctor, canary, single, sharded, the engine-generation
|
|
12
12
|
* guard) emit first and win.
|
|
@@ -42,7 +42,7 @@ async function assertTestPathsExist(engineDir, testPaths) {
|
|
|
42
42
|
* auto-routes to the suite-specific command (`mach xpcshell-test` /
|
|
43
43
|
* `mach mochitest`), which degrades a broken host resource monitor to a
|
|
44
44
|
* warning instead of crashing generic `mach test` at startup. Mixed runs are
|
|
45
|
-
* rejected before this point
|
|
45
|
+
* rejected before this point. A path-less "run all" or an explicit
|
|
46
46
|
* `--generic-mach-test` opt-out stays on the generic command.
|
|
47
47
|
*/
|
|
48
48
|
function resolveTestSuite(classification, forceGeneric) {
|
|
@@ -102,14 +102,14 @@ function logTestSelection(scopes) {
|
|
|
102
102
|
}
|
|
103
103
|
/**
|
|
104
104
|
* Runs the `--doctor` marionette handshake probe. With no test paths the
|
|
105
|
-
* probe is the entire command (returns `'stop'` after reporting)
|
|
106
|
-
* paths it gates the mach invocation
|
|
105
|
+
* probe is the entire command (returns `'stop'` after reporting). With
|
|
106
|
+
* paths it gates the mach invocation, where a FAIL throws before mach runs.
|
|
107
107
|
*/
|
|
108
108
|
async function runDoctorPreflight(args) {
|
|
109
109
|
const { engineDir, effectivePort, hasTestPaths, objDir, binaryName, launchablePath } = args;
|
|
110
110
|
// Non-TTY captures need the banner even if clack's renderer defers output
|
|
111
|
-
// in pipe mode
|
|
112
|
-
// written twice
|
|
111
|
+
// in pipe mode. TTY users need the clack framing. Gated rather than
|
|
112
|
+
// written twice: the unconditional pair printed the same line twice on a
|
|
113
113
|
// terminal.
|
|
114
114
|
if (process.stdout.isTTY) {
|
|
115
115
|
info('Running marionette preflight...');
|
|
@@ -125,7 +125,7 @@ async function runDoctorPreflight(args) {
|
|
|
125
125
|
// can drop the summary under non-TTY capture.
|
|
126
126
|
//
|
|
127
127
|
// Gated on non-TTY: unconditional, it stacks with the two clack renderings
|
|
128
|
-
// below and the same line appears
|
|
128
|
+
// below and the same line appears three times on a terminal. Captured
|
|
129
129
|
// streams are exactly where this branch still fires.
|
|
130
130
|
const directLine = formatMarionettePreflightLine(preflight);
|
|
131
131
|
if (!process.stdout.isTTY) {
|
|
@@ -139,7 +139,7 @@ async function runDoctorPreflight(args) {
|
|
|
139
139
|
throw new GeneralError('Marionette preflight reported FAIL — see output above.');
|
|
140
140
|
}
|
|
141
141
|
// Doctor-only runs end here, so they carry their own verdict line
|
|
142
|
-
// (reason=preflight on failure)
|
|
142
|
+
// (reason=preflight on failure). With test paths the verdict comes
|
|
143
143
|
// from the actual harness run downstream.
|
|
144
144
|
emitPassVerdict();
|
|
145
145
|
outro('Test completed');
|
|
@@ -161,12 +161,12 @@ async function runDoctorPreflight(args) {
|
|
|
161
161
|
function appendMarionetteForwardingArgs(extraArgs, options, forwardedPort, xpcshellOnly = false) {
|
|
162
162
|
// Auto-forward the Marionette port to mach when `--marionette-port` is set.
|
|
163
163
|
// `--setpref=marionette.port=<n>` configures where the browser listener
|
|
164
|
-
// binds
|
|
164
|
+
// binds. `--marionette=127.0.0.1:<n>` tells the mochitest harness client to
|
|
165
165
|
// connect there (default client is 127.0.0.1:2828). xpcshell ignores both
|
|
166
166
|
// for browser Marionette.
|
|
167
167
|
//
|
|
168
168
|
// Skip setpref forwarding when the operator already supplied an equivalent
|
|
169
|
-
// arg via `--mach-arg
|
|
169
|
+
// arg via `--mach-arg`: duplicates would confuse without changing
|
|
170
170
|
// semantics. Skip when mach args explicitly request `--flavor=xpcshell` (or
|
|
171
171
|
// `xpcshell-tests`): the preflight still honours `--marionette-port`, but
|
|
172
172
|
// mach does not use the marionette.port pref on that harness. Any other arg
|
|
@@ -178,7 +178,7 @@ function appendMarionetteForwardingArgs(extraArgs, options, forwardedPort, xpcsh
|
|
|
178
178
|
if (options.marionettePort === undefined)
|
|
179
179
|
return;
|
|
180
180
|
if (xpcshellOnly) {
|
|
181
|
-
// Manifest classification says every requested path is xpcshell
|
|
181
|
+
// Manifest classification says every requested path is xpcshell.
|
|
182
182
|
// xpcshell ignores the browser Marionette path entirely, and forwarding
|
|
183
183
|
// the mochitest client flags here makes mach reject the dispatch.
|
|
184
184
|
info(`--marionette-port=${options.marionettePort} applied to the preflight probe only: the requested paths are xpcshell-only, and xpcshell ignores the browser Marionette port. Not forwarding --setpref=marionette.port or --marionette to mach.`);
|
|
@@ -272,9 +272,9 @@ const TEST_BUILD_PREFLIGHT = {
|
|
|
272
272
|
*
|
|
273
273
|
* Owns the run's exactly-one-`FIREFORGE-VERDICT:`-line guarantee: the sink
|
|
274
274
|
* is re-armed at entry, and any failure that reaches this boundary without
|
|
275
|
-
* an inner writer having emitted
|
|
276
|
-
* build, config errors, stale-build and port gates, missing paths
|
|
277
|
-
* harness process that failed to start
|
|
275
|
+
* an inner writer having emitted (the preflight ladder: missing engine or
|
|
276
|
+
* build, config errors, stale-build and port gates, missing paths, and a
|
|
277
|
+
* harness process that failed to start) emits `FAIL reason=preflight`,
|
|
278
278
|
* since no harness classification exists for such a run. Writers closer to
|
|
279
279
|
* the harness (doctor, canary, single, sharded, the engine-generation
|
|
280
280
|
* guard) emit first and win.
|
|
@@ -285,7 +285,7 @@ const TEST_BUILD_PREFLIGHT = {
|
|
|
285
285
|
export async function testCommand(projectRoot, testPaths, options = {}) {
|
|
286
286
|
intro('FireForge Test');
|
|
287
287
|
resetVerdictEmission();
|
|
288
|
-
// Opened before
|
|
288
|
+
// Opened before any work so a preflight refusal is logged too. Those are
|
|
289
289
|
// exactly the runs whose only output a `tail` throws away. Closed in
|
|
290
290
|
// `finally`, after the verdict line has already read the path.
|
|
291
291
|
setActiveRunLog(await openRunLog(projectRoot, 'test'));
|
|
@@ -308,14 +308,14 @@ function refusalNote(error) {
|
|
|
308
308
|
return error instanceof PreflightRefusalError ? error.note : undefined;
|
|
309
309
|
}
|
|
310
310
|
/**
|
|
311
|
-
* Puts a preflight refusal's own text on the operator's channel
|
|
311
|
+
* Puts a preflight refusal's own text on the operator's channel before the
|
|
312
312
|
* verdict line, and into the run log.
|
|
313
313
|
*
|
|
314
|
-
* Both halves
|
|
314
|
+
* Both halves matter, and neither happened before:
|
|
315
315
|
*
|
|
316
316
|
* - `withErrorHandling` renders `error.userMessage` back in `cli.ts`, but
|
|
317
|
-
* by then `emitFailVerdict` has called `setStdoutSealed(true)
|
|
318
|
-
* that keeps the verdict the
|
|
317
|
+
* by then `emitFailVerdict` has called `setStdoutSealed(true)`, the seal
|
|
318
|
+
* that keeps the verdict the last stdout write, so `logError` routes to
|
|
319
319
|
* stderr. A run captured with `> file` therefore kept the verdict and
|
|
320
320
|
* dropped the reason.
|
|
321
321
|
* - That same rendering happens after this function's caller returns, and
|
|
@@ -333,15 +333,15 @@ function renderPreflightRefusal(error) {
|
|
|
333
333
|
const block = `Preflight refused:\n${text}\n`;
|
|
334
334
|
// Raw stdout rather than the clack logger: this must land on the captured
|
|
335
335
|
// stream verbatim, and clack's renderer can drop output under non-TTY
|
|
336
|
-
// capture
|
|
336
|
+
// capture, the same reason the verdict line is written this way.
|
|
337
337
|
process.stdout.write(block);
|
|
338
338
|
writeToActiveRunLog(block);
|
|
339
339
|
}
|
|
340
340
|
/**
|
|
341
341
|
* Verifies `engine/` did not change under the run before any PASS verdict
|
|
342
|
-
* may print. On failure the run's verdict is `FAIL reason=inconclusive
|
|
343
|
-
* the harness result exists but cannot be trusted (`preflight` would
|
|
344
|
-
* misdescribe a run whose harness already executed)
|
|
342
|
+
* may print. On failure the run's verdict is `FAIL reason=inconclusive`,
|
|
343
|
+
* because the harness result exists but cannot be trusted (`preflight` would
|
|
344
|
+
* misdescribe a run whose harness already executed). It is emitted here so the
|
|
345
345
|
* guard's throw can never leave a stale or missing verdict line behind.
|
|
346
346
|
*/
|
|
347
347
|
async function verifyEngineGenerationOrEmitInconclusive(engineDir, before) {
|
|
@@ -361,7 +361,7 @@ async function runTestCommandBody(projectRoot, testPaths, options = {}) {
|
|
|
361
361
|
const buildCheck = await hasBuildArtifacts(paths.engine);
|
|
362
362
|
assertBuildArtifacts(paths.engine, buildCheck, TEST_BUILD_PREFLIGHT);
|
|
363
363
|
// Inside a verification tree, only the objdir the marker records was
|
|
364
|
-
// proven rewritten-and-reconfigured to the tree
|
|
364
|
+
// proven rewritten-and-reconfigured to the tree. Refuse any other.
|
|
365
365
|
await assertObjdirMatchesTreeMarker(projectRoot, buildCheck.objDir);
|
|
366
366
|
// Load the project config once so both the build and the port
|
|
367
367
|
// probe have access to `binaryName` (the port probe uses it to
|
|
@@ -369,11 +369,11 @@ async function runTestCommandBody(projectRoot, testPaths, options = {}) {
|
|
|
369
369
|
const projectConfig = await loadConfig(projectRoot);
|
|
370
370
|
const canaryPath = resolveCanaryPath(options, projectConfig);
|
|
371
371
|
assertTestModeCombinations(testPaths, options, canaryPath);
|
|
372
|
-
// `hasBuildArtifacts` only confirms `obj-*/dist/` exists
|
|
372
|
+
// `hasBuildArtifacts` only confirms `obj-*/dist/` exists. A partial build
|
|
373
373
|
// (linker failed, packaging step interrupted) can satisfy that check
|
|
374
374
|
// without ever writing the launchable binary the marionette preflight
|
|
375
375
|
// needs to spawn. `fireforge run` already uses `hasRunnableBundle` to fail
|
|
376
|
-
// fast with a precise message
|
|
376
|
+
// fast with a precise message. Mirroring it here makes `test --doctor`
|
|
377
377
|
// against an incomplete build surface the missing-bundle path instead of a
|
|
378
378
|
// cryptic `Browser process exited during spawn (exit code 1, signal none).
|
|
379
379
|
// stderr tail: (empty)`.
|
|
@@ -382,8 +382,8 @@ async function runTestCommandBody(projectRoot, testPaths, options = {}) {
|
|
|
382
382
|
// Normalized engine-relative request paths, hoisted above the build/stale
|
|
383
383
|
// gate: the pre-test build records them as the packaging-coverage claim,
|
|
384
384
|
// and the --allow-stale-build path checks the request against the
|
|
385
|
-
// recorded coverage. (Existence is still asserted later, after the gate
|
|
386
|
-
// stale/coverage refusals keep precedence over missing-path errors.)
|
|
385
|
+
// recorded coverage. (Existence is still asserted later, after the gate,
|
|
386
|
+
// so stale/coverage refusals keep precedence over missing-path errors.)
|
|
387
387
|
const requestedPaths = canaryPath !== undefined ? [canaryPath] : testPaths;
|
|
388
388
|
const normalizedPaths = requestedPaths.map((p) => stripEnginePrefix(p).trim());
|
|
389
389
|
const { classification, xpcshellOnly } = await classifyBeforeDispatch(paths.engine, normalizedPaths, { allowMixed: options.buildOnly === true });
|
|
@@ -433,22 +433,22 @@ async function runTestCommandBody(projectRoot, testPaths, options = {}) {
|
|
|
433
433
|
}
|
|
434
434
|
// --mach-arg is a verbatim passthrough for upstream mach/xpcshell/mochitest
|
|
435
435
|
// flags FireForge does not model directly (see the xpcshell appdir hint
|
|
436
|
-
// above for why). Appended
|
|
436
|
+
// above for why). Appended after --headless so mach sees
|
|
437
437
|
// the FireForge-managed flags first and the escape-valve ones last, which
|
|
438
438
|
// keeps the override precedence predictable.
|
|
439
439
|
if (forwardedMachArgs.length > 0) {
|
|
440
440
|
extraArgs.push(...forwardedMachArgs);
|
|
441
441
|
}
|
|
442
442
|
appendMarionetteForwardingArgs(extraArgs, options, forwardedPort, xpcshellOnly);
|
|
443
|
-
// Directory arguments mean
|
|
443
|
+
// Directory arguments mean exactly that directory: mozbuild's test
|
|
444
444
|
// resolver matches paths by string prefix, so a bare directory arg
|
|
445
|
-
// silently sweeps in prefix-named siblings
|
|
446
|
-
// `…/test/hominis-tiles`, with no indication the scope widened. Each
|
|
445
|
+
// silently sweeps in prefix-named siblings, with `…/test/hominis` also
|
|
446
|
+
// running `…/test/hominis-tiles`, with no indication the scope widened. Each
|
|
447
447
|
// directory argument therefore dispatches as its enumerated explicit
|
|
448
|
-
// test-file list, which cannot prefix-match a sibling
|
|
448
|
+
// test-file list, which cannot prefix-match a sibling. A trailing-`/`
|
|
449
449
|
// normalization does not work, as mach still sweeps the sibling in. Any
|
|
450
450
|
// prefix-siblings are echoed so the narrowed scope is visible.
|
|
451
|
-
// Classification above intentionally used the raw argument forms
|
|
451
|
+
// Classification above intentionally used the raw argument forms. Only the
|
|
452
452
|
// mach dispatch needs the exact-match shape.
|
|
453
453
|
const scopes = await analyzeTestPathScopes(paths.engine, normalizedPaths);
|
|
454
454
|
const dispatchGroups = scopes.map((scope) => ({
|
|
@@ -482,10 +482,10 @@ async function runTestCommandBody(projectRoot, testPaths, options = {}) {
|
|
|
482
482
|
: undefined;
|
|
483
483
|
// Multi-argument requests shard into sequential harness runs by default:
|
|
484
484
|
// one shared mochitest profile across files bleeds pref/media-query state
|
|
485
|
-
// into later files. Sharding is per path
|
|
485
|
+
// into later files. Sharding is per path argument: a directory argument
|
|
486
486
|
// keeps its enumerated files together in one invocation, preserving the
|
|
487
487
|
// one-browser-instance semantics of a directory run. `--no-shard` restores
|
|
488
|
-
// the combined invocation. The default must not be
|
|
488
|
+
// the combined invocation. The default must not be silent: a cross-file
|
|
489
489
|
// pollution repro otherwise "passes" because the comparison run was
|
|
490
490
|
// sharded without saying so, misattributing a suite-context bug upstream.
|
|
491
491
|
// Hence the one-line notice stating what sharding does and does not
|
|
@@ -500,7 +500,7 @@ async function runTestCommandBody(projectRoot, testPaths, options = {}) {
|
|
|
500
500
|
summary = await runShardedTests(runCtx, dispatchGroups, (outcome, label) => diagnoseShardOutcome(outcome, label, projectConfig.binaryName, postRebuildContext));
|
|
501
501
|
}
|
|
502
502
|
finally {
|
|
503
|
-
// Runs
|
|
503
|
+
// Runs before the aggregate verdict below: a mutated engine/ emits
|
|
504
504
|
// `FAIL reason=inconclusive` and throws, so an invalidated run can
|
|
505
505
|
// never print `PASS shards=N/N` first. (A throw here masks an
|
|
506
506
|
// in-flight shard error, as the plain assert always did.)
|