@hominis/fireforge 0.35.0 → 0.37.0
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 +42 -0
- package/README.md +34 -9
- package/dist/bin/fireforge.js +21 -6
- package/dist/src/cli.js +22 -5
- package/dist/src/commands/bootstrap-checks.js +0 -1
- package/dist/src/commands/bootstrap.d.ts +2 -1
- package/dist/src/commands/bootstrap.js +16 -7
- package/dist/src/commands/build.js +5 -4
- package/dist/src/commands/config.js +30 -10
- package/dist/src/commands/discard.js +18 -3
- package/dist/src/commands/doctor/post-rebase-audit.js +0 -1
- package/dist/src/commands/doctor-check-core.js +0 -1
- package/dist/src/commands/doctor-external-toolchains.d.ts +3 -0
- package/dist/src/commands/doctor-external-toolchains.js +54 -0
- package/dist/src/commands/doctor-furnace-jar.js +0 -1
- package/dist/src/commands/doctor-furnace-manifest-sync.js +0 -1
- package/dist/src/commands/doctor-furnace.js +2 -2
- package/dist/src/commands/doctor-orphaned-harness.d.ts +52 -0
- package/dist/src/commands/doctor-orphaned-harness.js +132 -0
- package/dist/src/commands/doctor-working-tree.js +0 -1
- package/dist/src/commands/doctor.js +6 -1
- package/dist/src/commands/download.js +28 -13
- package/dist/src/commands/export-all.js +5 -3
- package/dist/src/commands/export-flow.js +12 -7
- package/dist/src/commands/export-placement-gate.js +0 -1
- package/dist/src/commands/export-placement-policy.js +0 -1
- package/dist/src/commands/export-shared.d.ts +5 -1
- package/dist/src/commands/export-shared.js +18 -6
- package/dist/src/commands/export.js +22 -10
- package/dist/src/commands/furnace/apply.js +22 -6
- package/dist/src/commands/furnace/chrome-doc-remove.js +0 -1
- package/dist/src/commands/furnace/chrome-doc-templates.js +0 -1
- package/dist/src/commands/furnace/chrome-doc-tests.js +0 -1
- package/dist/src/commands/furnace/chrome-doc.js +0 -1
- package/dist/src/commands/furnace/create-browser-test.js +0 -1
- package/dist/src/commands/furnace/create-dry-run.js +0 -1
- package/dist/src/commands/furnace/create-features.js +0 -1
- package/dist/src/commands/furnace/create-mochikit.js +0 -1
- package/dist/src/commands/furnace/create-readback.js +0 -1
- package/dist/src/commands/furnace/create-templates.js +0 -1
- package/dist/src/commands/furnace/create-validation.js +0 -1
- package/dist/src/commands/furnace/create-xpcshell.js +0 -1
- package/dist/src/commands/furnace/create.js +0 -1
- package/dist/src/commands/furnace/deploy.js +7 -83
- package/dist/src/commands/furnace/diff.js +0 -1
- package/dist/src/commands/furnace/index.js +59 -25
- package/dist/src/commands/furnace/init.js +0 -1
- package/dist/src/commands/furnace/list.js +0 -1
- package/dist/src/commands/furnace/override.js +0 -1
- package/dist/src/commands/furnace/preview.js +3 -3
- package/dist/src/commands/furnace/refresh.js +0 -1
- package/dist/src/commands/furnace/remove-state.d.ts +15 -0
- package/dist/src/commands/furnace/remove-state.js +47 -1
- package/dist/src/commands/furnace/remove.js +3 -9
- package/dist/src/commands/furnace/rename-browser-test.js +1 -5
- package/dist/src/commands/furnace/rename-helpers.d.ts +6 -0
- package/dist/src/commands/furnace/rename-helpers.js +30 -1
- package/dist/src/commands/furnace/rename-xpcshell.js +7 -6
- package/dist/src/commands/furnace/rename.js +15 -36
- package/dist/src/commands/furnace/scan.js +0 -1
- package/dist/src/commands/furnace/status.js +0 -1
- package/dist/src/commands/furnace/sync.js +76 -4
- package/dist/src/commands/furnace/validate.js +0 -1
- package/dist/src/commands/furnace/validation-output.js +0 -1
- package/dist/src/commands/import.js +35 -9
- package/dist/src/commands/lint-per-patch.js +19 -7
- package/dist/src/commands/lint.js +13 -3
- package/dist/src/commands/manifest.js +1 -2
- package/dist/src/commands/package.js +2 -1
- package/dist/src/commands/patch/compact.js +1 -1
- package/dist/src/commands/patch/delete.js +1 -1
- package/dist/src/commands/patch/index.js +1 -1
- package/dist/src/commands/patch/lint-ignore.js +21 -6
- package/dist/src/commands/patch/move-files.js +1 -1
- package/dist/src/commands/patch/patch-context.js +0 -1
- package/dist/src/commands/patch/rename.js +4 -4
- package/dist/src/commands/patch/reorder.js +3 -4
- package/dist/src/commands/patch/split-plan.js +2 -1
- package/dist/src/commands/patch/split.js +4 -4
- package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency.js +114 -52
- package/dist/src/commands/patch/tier.js +18 -5
- package/dist/src/commands/re-export-bulk-scan.js +0 -1
- package/dist/src/commands/re-export-files.js +5 -1
- package/dist/src/commands/re-export-options.js +0 -1
- package/dist/src/commands/re-export-scan.js +0 -1
- package/dist/src/commands/re-export.js +14 -4
- package/dist/src/commands/rebase/abort.js +2 -9
- package/dist/src/commands/rebase/confirm.js +0 -1
- package/dist/src/commands/rebase/conflict-summary.js +0 -1
- package/dist/src/commands/rebase/continue.js +0 -1
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +10 -15
- package/dist/src/commands/rebase/patch-loop.js +38 -7
- package/dist/src/commands/rebase/summary.js +2 -3
- package/dist/src/commands/rebase.js +0 -1
- package/dist/src/commands/register.js +1 -1
- package/dist/src/commands/reset.js +16 -9
- package/dist/src/commands/resolve.js +2 -2
- package/dist/src/commands/run.js +4 -4
- package/dist/src/commands/setup-support.js +0 -1
- package/dist/src/commands/setup.js +1 -2
- package/dist/src/commands/source.js +1 -2
- package/dist/src/commands/status-output.js +1 -12
- package/dist/src/commands/status.js +147 -133
- package/dist/src/commands/test-appdir.js +0 -1
- package/dist/src/commands/test-diagnose.js +38 -3
- package/dist/src/commands/test-modes.d.ts +15 -0
- package/dist/src/commands/test-modes.js +61 -0
- package/dist/src/commands/test-register.d.ts +4 -0
- package/dist/src/commands/test-register.js +64 -0
- package/dist/src/commands/test-run.d.ts +23 -7
- package/dist/src/commands/test-run.js +15 -14
- package/dist/src/commands/test.d.ts +0 -4
- package/dist/src/commands/test.js +147 -96
- package/dist/src/commands/token-coverage.js +0 -1
- package/dist/src/commands/token.js +1 -2
- package/dist/src/commands/typecheck.js +1 -1
- package/dist/src/commands/verify.js +3 -9
- package/dist/src/commands/watch.js +5 -1
- package/dist/src/commands/wire.js +1 -1
- package/dist/src/core/ast-utils.js +0 -1
- package/dist/src/core/brand-validation.js +0 -1
- package/dist/src/core/branding.js +0 -1
- package/dist/src/core/browser-wire.js +0 -1
- package/dist/src/core/build-audit-platform.js +0 -1
- package/dist/src/core/build-audit-registration.js +0 -1
- package/dist/src/core/build-audit-resolve.js +0 -1
- package/dist/src/core/build-audit-transforms.js +0 -1
- package/dist/src/core/build-audit.js +0 -1
- package/dist/src/core/build-baseline-types.d.ts +24 -0
- package/dist/src/core/build-baseline-types.js +0 -1
- package/dist/src/core/build-baseline.d.ts +5 -2
- package/dist/src/core/build-baseline.js +5 -2
- package/dist/src/core/build-prepare.js +2 -2
- package/dist/src/core/config-mutate.js +0 -1
- package/dist/src/core/config-paths.d.ts +2 -2
- package/dist/src/core/config-paths.js +6 -1
- package/dist/src/core/config-state.js +0 -1
- package/dist/src/core/config-validate-patch-policy.js +0 -1
- package/dist/src/core/config-validate-test-toolchains.d.ts +8 -0
- package/dist/src/core/config-validate-test-toolchains.js +105 -0
- package/dist/src/core/config-validate.js +3 -1
- package/dist/src/core/config.js +0 -1
- package/dist/src/core/destructive.js +0 -1
- package/dist/src/core/diff-hunks.js +13 -7
- package/dist/src/core/engine-changes.js +0 -1
- package/dist/src/core/engine-session-lock.d.ts +12 -0
- package/dist/src/core/engine-session-lock.js +45 -0
- package/dist/src/core/file-lock.d.ts +8 -0
- package/dist/src/core/file-lock.js +157 -48
- package/dist/src/core/firefox-archive.d.ts +4 -0
- package/dist/src/core/firefox-archive.js +6 -1
- package/dist/src/core/firefox-cache.js +60 -4
- package/dist/src/core/firefox-download.js +0 -1
- package/dist/src/core/firefox-extract.js +75 -16
- package/dist/src/core/firefox-ignorefile.js +0 -1
- package/dist/src/core/firefox.d.ts +12 -0
- package/dist/src/core/firefox.js +64 -2
- package/dist/src/core/furnace-apply-dry-run.js +0 -1
- package/dist/src/core/furnace-apply-ftl.d.ts +7 -3
- package/dist/src/core/furnace-apply-ftl.js +10 -5
- package/dist/src/core/furnace-apply-helpers.js +0 -1
- package/dist/src/core/furnace-apply-output.js +2 -2
- package/dist/src/core/furnace-apply.d.ts +7 -1
- package/dist/src/core/furnace-apply.js +47 -13
- package/dist/src/core/furnace-checksum-utils.js +0 -1
- package/dist/src/core/furnace-config-array-utils.js +0 -1
- package/dist/src/core/furnace-config-custom.js +10 -1
- package/dist/src/core/furnace-config-order.js +0 -1
- package/dist/src/core/furnace-config-tokens.js +0 -1
- package/dist/src/core/furnace-config-validate.js +0 -1
- package/dist/src/core/furnace-config.d.ts +11 -0
- package/dist/src/core/furnace-config.js +37 -1
- package/dist/src/core/furnace-constants.js +0 -1
- package/dist/src/core/furnace-css-fragments.js +0 -1
- package/dist/src/core/furnace-graph-utils.js +0 -1
- package/dist/src/core/furnace-jsconfig.d.ts +2 -3
- package/dist/src/core/furnace-jsconfig.js +25 -18
- package/dist/src/core/furnace-marker.js +0 -1
- package/dist/src/core/furnace-operation.js +0 -1
- package/dist/src/core/furnace-refresh.js +0 -1
- package/dist/src/core/furnace-registration-ast.d.ts +14 -0
- package/dist/src/core/furnace-registration-ast.js +1 -2
- package/dist/src/core/furnace-registration-remove.js +0 -1
- package/dist/src/core/furnace-registration-validate.js +1 -5
- package/dist/src/core/furnace-registration.js +0 -1
- package/dist/src/core/furnace-rollback.js +0 -1
- package/dist/src/core/furnace-scanner.js +0 -1
- package/dist/src/core/furnace-stale-export.d.ts +59 -0
- package/dist/src/core/furnace-stale-export.js +123 -0
- package/dist/src/core/furnace-staleness.js +0 -1
- package/dist/src/core/furnace-state-persist.d.ts +72 -0
- package/dist/src/core/furnace-state-persist.js +118 -0
- package/dist/src/core/furnace-step-errors.d.ts +23 -0
- package/dist/src/core/furnace-step-errors.js +25 -0
- package/dist/src/core/furnace-stories.js +0 -1
- package/dist/src/core/furnace-validate-accessibility.js +0 -1
- package/dist/src/core/furnace-validate-checks.js +0 -1
- package/dist/src/core/furnace-validate-compatibility.js +9 -3
- package/dist/src/core/furnace-validate-helpers.js +0 -1
- package/dist/src/core/furnace-validate-registration.js +7 -7
- package/dist/src/core/furnace-validate-structure.d.ts +8 -0
- package/dist/src/core/furnace-validate-structure.js +14 -4
- package/dist/src/core/furnace-validate.js +0 -1
- package/dist/src/core/furnace-version-drift.d.ts +6 -3
- package/dist/src/core/furnace-version-drift.js +6 -4
- package/dist/src/core/git-base.js +0 -1
- package/dist/src/core/git-diff.js +0 -1
- package/dist/src/core/git-file-ops.js +0 -1
- package/dist/src/core/git-status.d.ts +13 -0
- package/dist/src/core/git-status.js +32 -2
- package/dist/src/core/git.d.ts +10 -1
- package/dist/src/core/git.js +63 -6
- package/dist/src/core/license-headers.js +0 -1
- package/dist/src/core/lint-cache.js +0 -1
- package/dist/src/core/lint-projection.js +0 -1
- package/dist/src/core/mach-build-artifacts.js +0 -1
- package/dist/src/core/mach-error-hints.js +0 -1
- package/dist/src/core/mach-known-noise-filter.d.ts +60 -0
- package/dist/src/core/mach-known-noise-filter.js +193 -0
- package/dist/src/core/mach-mozconfig.js +0 -1
- package/dist/src/core/mach-python.js +0 -1
- package/dist/src/core/mach-resource-shim.js +0 -1
- package/dist/src/core/mach.d.ts +8 -0
- package/dist/src/core/mach.js +36 -4
- package/dist/src/core/manifest-helpers.js +0 -1
- package/dist/src/core/manifest-register.js +0 -1
- package/dist/src/core/manifest-rules.js +0 -1
- package/dist/src/core/manifest-tokenizers.js +0 -1
- package/dist/src/core/marionette-port.d.ts +8 -0
- package/dist/src/core/marionette-port.js +34 -3
- package/dist/src/core/marionette-preflight.js +0 -1
- package/dist/src/core/markdown-table.js +0 -1
- package/dist/src/core/ownership-table.js +2 -9
- package/dist/src/core/parser-fallback.js +0 -1
- package/dist/src/core/patch-apply-fuzz.d.ts +27 -9
- package/dist/src/core/patch-apply-fuzz.js +71 -34
- package/dist/src/core/patch-apply.d.ts +30 -0
- package/dist/src/core/patch-apply.js +101 -18
- package/dist/src/core/patch-artifact-normalize.d.ts +18 -5
- package/dist/src/core/patch-artifact-normalize.js +19 -15
- package/dist/src/core/patch-export-coverage.js +0 -1
- package/dist/src/core/patch-export-metadata.js +0 -1
- package/dist/src/core/patch-export-update.js +2 -3
- package/dist/src/core/patch-export.d.ts +2 -6
- package/dist/src/core/patch-export.js +24 -48
- package/dist/src/core/patch-files.js +0 -1
- package/dist/src/core/patch-identifier-suggest.js +0 -1
- package/dist/src/core/patch-lint-checkjs.js +0 -1
- package/dist/src/core/patch-lint-chrome-jsdoc.js +0 -1
- package/dist/src/core/patch-lint-cross.js +80 -3
- package/dist/src/core/patch-lint-css.js +0 -1
- package/dist/src/core/patch-lint-diff-tag.js +0 -1
- package/dist/src/core/patch-lint-diff.d.ts +2 -1
- package/dist/src/core/patch-lint-diff.js +17 -32
- package/dist/src/core/patch-lint-imports.js +0 -1
- package/dist/src/core/patch-lint-jsdoc.js +0 -1
- package/dist/src/core/patch-lint-observer.js +0 -1
- package/dist/src/core/patch-lint-ownership.js +0 -1
- package/dist/src/core/patch-lint-reexports.js +0 -1
- package/dist/src/core/patch-lint.d.ts +37 -2
- package/dist/src/core/patch-lint.js +47 -34
- package/dist/src/core/patch-lock.js +0 -1
- package/dist/src/core/patch-manifest-consistency.js +9 -1
- package/dist/src/core/patch-manifest-io.d.ts +19 -2
- package/dist/src/core/patch-manifest-io.js +57 -21
- package/dist/src/core/patch-manifest-query.js +18 -10
- package/dist/src/core/patch-manifest-resolve.js +0 -1
- package/dist/src/core/patch-manifest-validate.js +24 -1
- package/dist/src/core/patch-manifest.d.ts +1 -1
- package/dist/src/core/patch-manifest.js +1 -2
- package/dist/src/core/patch-parse.d.ts +59 -0
- package/dist/src/core/patch-parse.js +209 -92
- package/dist/src/core/patch-policy.js +0 -1
- package/dist/src/core/patch-registration-refs.js +16 -26
- package/dist/src/core/patch-source-metadata.js +0 -1
- package/dist/src/core/patch-transform.d.ts +4 -0
- package/dist/src/core/patch-transform.js +30 -38
- package/dist/src/core/rebase-session.js +0 -1
- package/dist/src/core/register-browser-content.js +0 -1
- package/dist/src/core/register-module.js +0 -1
- package/dist/src/core/register-result.js +0 -1
- package/dist/src/core/register-scaffold.js +0 -1
- package/dist/src/core/register-shared-css.js +0 -1
- package/dist/src/core/register-test-manifest.js +0 -1
- package/dist/src/core/register-xpcshell-test.js +0 -1
- package/dist/src/core/shared-ftl.js +0 -1
- package/dist/src/core/signal-critical.js +0 -1
- package/dist/src/core/smoke-patterns.js +0 -1
- package/dist/src/core/state-file.js +0 -1
- package/dist/src/core/status-classify.d.ts +16 -0
- package/dist/src/core/status-classify.js +24 -16
- package/dist/src/core/test-harness-crash.d.ts +80 -7
- package/dist/src/core/test-harness-crash.js +251 -15
- package/dist/src/core/test-harness-output.js +0 -1
- package/dist/src/core/test-path-scope.d.ts +21 -13
- package/dist/src/core/test-path-scope.js +43 -28
- package/dist/src/core/test-stale-check.d.ts +29 -1
- package/dist/src/core/test-stale-check.js +59 -1
- package/dist/src/core/test-stale-symlink.js +0 -1
- package/dist/src/core/test-xpcshell-retry.js +0 -1
- package/dist/src/core/token-coverage.js +0 -1
- package/dist/src/core/token-dark-mode.js +0 -1
- package/dist/src/core/token-docs.js +0 -1
- package/dist/src/core/token-manager.js +0 -1
- package/dist/src/core/token-scaffold.js +0 -1
- package/dist/src/core/token-variant.js +0 -1
- package/dist/src/core/toolchain-preflight.d.ts +31 -10
- package/dist/src/core/toolchain-preflight.js +97 -36
- package/dist/src/core/typecheck-shim.js +13 -1
- package/dist/src/core/typecheck.js +0 -1
- package/dist/src/core/wire-destroy.js +0 -1
- package/dist/src/core/wire-dom-fragment.js +0 -1
- package/dist/src/core/wire-init.js +0 -1
- package/dist/src/core/wire-subscript.js +0 -1
- package/dist/src/core/wire-targets.js +0 -1
- package/dist/src/core/wire-utils.js +0 -1
- package/dist/src/core/xpcshell-appdir.js +1 -4
- package/dist/src/errors/base.d.ts +29 -0
- package/dist/src/errors/base.js +35 -1
- package/dist/src/errors/build.js +0 -1
- package/dist/src/errors/codes.d.ts +6 -0
- package/dist/src/errors/codes.js +6 -1
- package/dist/src/errors/config.js +0 -1
- package/dist/src/errors/download.js +0 -1
- package/dist/src/errors/furnace.d.ts +11 -1
- package/dist/src/errors/furnace.js +6 -5
- package/dist/src/errors/git.js +0 -1
- package/dist/src/errors/patch.d.ts +17 -0
- package/dist/src/errors/patch.js +29 -1
- package/dist/src/errors/rebase.js +0 -1
- package/dist/src/errors/run.js +1 -1
- package/dist/src/index.js +0 -1
- package/dist/src/types/cli.js +0 -1
- package/dist/src/types/commands/index.d.ts +1 -1
- package/dist/src/types/commands/index.js +0 -1
- package/dist/src/types/commands/options.d.ts +40 -9
- package/dist/src/types/commands/options.js +0 -1
- package/dist/src/types/commands/patches.d.ts +37 -0
- package/dist/src/types/commands/patches.js +0 -1
- package/dist/src/types/commands/project.d.ts +11 -2
- package/dist/src/types/commands/project.js +0 -1
- package/dist/src/types/config.d.ts +32 -0
- package/dist/src/types/config.js +0 -1
- package/dist/src/types/furnace.d.ts +23 -0
- package/dist/src/types/furnace.js +0 -1
- package/dist/src/types/index.js +0 -1
- package/dist/src/types/typecheck.js +0 -1
- package/dist/src/utils/elapsed.js +0 -1
- package/dist/src/utils/errors.js +0 -1
- package/dist/src/utils/fs.js +37 -5
- package/dist/src/utils/logger.d.ts +7 -0
- package/dist/src/utils/logger.js +85 -3
- package/dist/src/utils/options.d.ts +15 -0
- package/dist/src/utils/options.js +25 -1
- package/dist/src/utils/package-root.js +11 -4
- package/dist/src/utils/parse.js +0 -1
- package/dist/src/utils/paths.js +0 -1
- package/dist/src/utils/platform.js +0 -1
- package/dist/src/utils/process-group.d.ts +33 -0
- package/dist/src/utils/process-group.js +161 -0
- package/dist/src/utils/process.d.ts +48 -4
- package/dist/src/utils/process.js +258 -59
- package/dist/src/utils/regex.d.ts +13 -3
- package/dist/src/utils/regex.js +53 -4
- package/dist/src/utils/validation.d.ts +0 -12
- package/dist/src/utils/validation.js +13 -26
- package/package.json +9 -8
|
@@ -6,45 +6,50 @@
|
|
|
6
6
|
* so `fireforge test browser/base/content/test/hominis` silently also
|
|
7
7
|
* ran the sibling directory `browser/base/content/test/hominis-tiles`
|
|
8
8
|
* (152.0b7 → 153.0b8 source-refresh drill: 1224 tests instead of ~200,
|
|
9
|
-
* with no indication the scope widened).
|
|
10
|
-
* prefix match exact — `hominis/` cannot prefix `hominis-tiles/…`.
|
|
9
|
+
* with no indication the scope widened).
|
|
11
10
|
*
|
|
12
11
|
* FireForge therefore treats a directory argument as meaning EXACTLY
|
|
13
|
-
* that directory: {@link analyzeTestPathScopes}
|
|
14
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
*
|
|
19
|
-
*
|
|
12
|
+
* that directory: {@link analyzeTestPathScopes} enumerates the test
|
|
13
|
+
* files of exactly that directory and dispatches THAT explicit file
|
|
14
|
+
* list to mach — a file list cannot prefix-match anything. (0.35.0
|
|
15
|
+
* instead normalized the directory with a trailing `/`, assuming the
|
|
16
|
+
* separator makes the prefix match exact; field verification on Firefox
|
|
17
|
+
* 153 showed mach still swept in the prefix-named sibling, so the
|
|
18
|
+
* trailing-slash mechanism was cosmetic and its exclusion echo was
|
|
19
|
+
* wrong.) The prefix-matching sibling directories are still reported so
|
|
20
|
+
* the command layer can tell the operator what was excluded. Note
|
|
21
|
+
* FireForge already rejects non-existent paths up front, so raw
|
|
22
|
+
* prefix-widening was never something an operator could invoke
|
|
23
|
+
* deliberately — it only ever happened by accident.
|
|
20
24
|
*/
|
|
21
25
|
import { readdir, stat } from 'node:fs/promises';
|
|
22
26
|
import { basename, dirname, join } from 'node:path';
|
|
23
27
|
/** Test implementation files as mozbuild manifests name them. */
|
|
24
|
-
const TEST_FILE_PATTERN = /^(?:browser|test)_.*\.m?js$/;
|
|
28
|
+
const TEST_FILE_PATTERN = /^(?:browser|test)_.*\.(?:m?js|x?html)$/;
|
|
25
29
|
/**
|
|
26
|
-
* Recursively
|
|
27
|
-
*
|
|
28
|
-
*
|
|
30
|
+
* Recursively enumerates test-implementation files under a directory,
|
|
31
|
+
* returned engine-relative and sorted for deterministic dispatch order.
|
|
32
|
+
* Returns [] when the directory cannot be read — the caller then falls
|
|
33
|
+
* back to the directory form and mach owns the failure.
|
|
29
34
|
*/
|
|
30
|
-
async function
|
|
31
|
-
|
|
35
|
+
async function collectTestFiles(dir, relPrefix) {
|
|
36
|
+
const files = [];
|
|
32
37
|
let entries;
|
|
33
38
|
try {
|
|
34
39
|
entries = await readdir(dir, { withFileTypes: true });
|
|
35
40
|
}
|
|
36
41
|
catch {
|
|
37
|
-
return
|
|
42
|
+
return [];
|
|
38
43
|
}
|
|
39
44
|
for (const entry of entries) {
|
|
40
45
|
if (entry.isDirectory()) {
|
|
41
|
-
|
|
46
|
+
files.push(...(await collectTestFiles(join(dir, entry.name), `${relPrefix}${entry.name}/`)));
|
|
42
47
|
}
|
|
43
48
|
else if (entry.isFile() && TEST_FILE_PATTERN.test(entry.name)) {
|
|
44
|
-
|
|
49
|
+
files.push(`${relPrefix}${entry.name}`);
|
|
45
50
|
}
|
|
46
51
|
}
|
|
47
|
-
return
|
|
52
|
+
return files.sort();
|
|
48
53
|
}
|
|
49
54
|
/** Probes whether `path` is a directory, without throwing. */
|
|
50
55
|
async function isDirectorySafe(path) {
|
|
@@ -65,7 +70,7 @@ async function analyzeTestPathScope(engineDir, requestedPath) {
|
|
|
65
70
|
if (!(await isDirectorySafe(absolute))) {
|
|
66
71
|
return {
|
|
67
72
|
requestedPath,
|
|
68
|
-
|
|
73
|
+
dispatchPaths: [requestedPath],
|
|
69
74
|
isDirectory: false,
|
|
70
75
|
testFileCount: 0,
|
|
71
76
|
siblingPrefixMatches: [],
|
|
@@ -82,7 +87,7 @@ async function analyzeTestPathScope(engineDir, requestedPath) {
|
|
|
82
87
|
if (entry.name === base || !entry.name.startsWith(base))
|
|
83
88
|
continue;
|
|
84
89
|
const siblingRel = parentRel === '.' ? entry.name : `${parentRel}/${entry.name}`;
|
|
85
|
-
const testFileCount = await
|
|
90
|
+
const testFileCount = (await collectTestFiles(join(dirname(absolute), entry.name), `${siblingRel}/`)).length;
|
|
86
91
|
// A prefix-matching sibling with no test files never surfaces in a
|
|
87
92
|
// mach run, so listing it would only add noise.
|
|
88
93
|
if (testFileCount > 0) {
|
|
@@ -92,13 +97,16 @@ async function analyzeTestPathScope(engineDir, requestedPath) {
|
|
|
92
97
|
}
|
|
93
98
|
catch {
|
|
94
99
|
// Unreadable parent: skip the sibling probe; exactness via the
|
|
95
|
-
//
|
|
100
|
+
// explicit file list is preserved regardless.
|
|
96
101
|
}
|
|
102
|
+
const testFiles = await collectTestFiles(absolute, `${stripped}/`);
|
|
97
103
|
return {
|
|
98
104
|
requestedPath,
|
|
99
|
-
|
|
105
|
+
// The explicit file list is what makes the selection exact; an empty
|
|
106
|
+
// enumeration falls back to the directory form.
|
|
107
|
+
dispatchPaths: testFiles.length > 0 ? testFiles : [`${stripped}/`],
|
|
100
108
|
isDirectory: true,
|
|
101
|
-
testFileCount:
|
|
109
|
+
testFileCount: testFiles.length,
|
|
102
110
|
siblingPrefixMatches,
|
|
103
111
|
};
|
|
104
112
|
}
|
|
@@ -122,12 +130,19 @@ export async function analyzeTestPathScopes(engineDir, requestedPaths) {
|
|
|
122
130
|
export function formatScopeNotice(scope) {
|
|
123
131
|
if (!scope.isDirectory || scope.siblingPrefixMatches.length === 0)
|
|
124
132
|
return undefined;
|
|
133
|
+
const requestedDir = scope.requestedPath.replace(/\/+$/, '');
|
|
125
134
|
const siblings = scope.siblingPrefixMatches
|
|
126
135
|
.map((s) => `${s.path}/ (${s.testFileCount} test file${s.testFileCount === 1 ? '' : 's'})`)
|
|
127
136
|
.join(', ');
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
137
|
+
if (scope.testFileCount === 0) {
|
|
138
|
+
// Fallback dispatch: with nothing to enumerate, the raw directory
|
|
139
|
+
// form goes to mach, whose prefix matching CAN sweep the siblings in.
|
|
140
|
+
// Claiming exclusion here would repeat the 0.35.0 mistake.
|
|
141
|
+
return (`${requestedDir}/ contains no enumerable test files, so the directory is passed to mach ` +
|
|
142
|
+
`as-is — mach resolves paths by string prefix, which may also select: ${siblings}.`);
|
|
143
|
+
}
|
|
144
|
+
return (`Selected exactly ${requestedDir}/ by passing its ${scope.testFileCount} test file${scope.testFileCount === 1 ? '' : 's'} ` +
|
|
145
|
+
'explicitly to mach (an explicit file list cannot prefix-match a sibling). ' +
|
|
146
|
+
`Excluded ${scope.siblingPrefixMatches.length} prefix-named sibling director${scope.siblingPrefixMatches.length === 1 ? 'y' : 'ies'}: ${siblings}. ` +
|
|
131
147
|
'Pass them as separate paths to include them.');
|
|
132
148
|
}
|
|
133
|
-
//# sourceMappingURL=test-path-scope.js.map
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { BuildBaseline } from './build-baseline-types.js';
|
|
1
|
+
import type { BuildBaseline, TestPackagingCoverage } from './build-baseline-types.js';
|
|
2
2
|
/** Result of the stale-build preflight probe. */
|
|
3
3
|
export interface StaleBuildResult {
|
|
4
4
|
/** True when at least one packageable engine file changed since the baseline. */
|
|
@@ -40,3 +40,31 @@ export declare function checkStaleBuildForTest(projectRoot: string, engineDir: s
|
|
|
40
40
|
* result without matching the rendered copy.
|
|
41
41
|
*/
|
|
42
42
|
export declare function formatStaleBuildWarning(result: StaleBuildResult): string;
|
|
43
|
+
/**
|
|
44
|
+
* Sentinel returned by {@link findUncoveredRequestPaths} when a full-suite
|
|
45
|
+
* request (no paths) is checked against a scoped coverage record.
|
|
46
|
+
*/
|
|
47
|
+
export declare const FULL_SUITE_REQUEST = "(entire suite)";
|
|
48
|
+
/**
|
|
49
|
+
* Compares the requested test paths against the packaged runtime's coverage
|
|
50
|
+
* claim recorded in the baseline. Returns the requested paths the recorded
|
|
51
|
+
* packaging does NOT cover — the runs that would dispatch against missing
|
|
52
|
+
* `_tests/` support fixtures and hang rather than fail.
|
|
53
|
+
*
|
|
54
|
+
* Coverage semantics: `undefined` (pre-0.37.0 baseline) and `'full'` cover
|
|
55
|
+
* everything. A scoped list covers a request path when the request equals a
|
|
56
|
+
* covered entry or sits beneath a covered directory entry. Both sides are
|
|
57
|
+
* normalized to forward slashes so Windows-style CLI input cannot defeat
|
|
58
|
+
* the prefix rule (baseline paths are POSIX by convention). A request with
|
|
59
|
+
* no paths is a full-suite run and is never covered by a scoped list — the
|
|
60
|
+
* {@link FULL_SUITE_REQUEST} sentinel is returned so the refusal can name it.
|
|
61
|
+
*/
|
|
62
|
+
export declare function findUncoveredRequestPaths(coverage: TestPackagingCoverage | undefined, requestedPaths: readonly string[]): string[];
|
|
63
|
+
/**
|
|
64
|
+
* Formats the refusal shown when a non-`--build` run requests paths the
|
|
65
|
+
* packaged runtime's scoped `test --build` coverage does not include —
|
|
66
|
+
* enforced on every such run, with or without `--allow-stale-build`. Kept
|
|
67
|
+
* separate from the matcher so tests can pin structure and copy
|
|
68
|
+
* independently (same split as {@link formatStaleBuildWarning}).
|
|
69
|
+
*/
|
|
70
|
+
export declare function formatTestCoverageRefusal(uncovered: string[], coverage: string[]): string;
|
|
@@ -112,4 +112,62 @@ export function formatStaleBuildWarning(result) {
|
|
|
112
112
|
'packaged chrome / jar.mn resources, rerun with "fireforge test --build" (or ' +
|
|
113
113
|
'"fireforge build --ui") first. Passing --build skips this check.');
|
|
114
114
|
}
|
|
115
|
-
|
|
115
|
+
/**
|
|
116
|
+
* Sentinel returned by {@link findUncoveredRequestPaths} when a full-suite
|
|
117
|
+
* request (no paths) is checked against a scoped coverage record.
|
|
118
|
+
*/
|
|
119
|
+
export const FULL_SUITE_REQUEST = '(entire suite)';
|
|
120
|
+
/**
|
|
121
|
+
* Compares the requested test paths against the packaged runtime's coverage
|
|
122
|
+
* claim recorded in the baseline. Returns the requested paths the recorded
|
|
123
|
+
* packaging does NOT cover — the runs that would dispatch against missing
|
|
124
|
+
* `_tests/` support fixtures and hang rather than fail.
|
|
125
|
+
*
|
|
126
|
+
* Coverage semantics: `undefined` (pre-0.37.0 baseline) and `'full'` cover
|
|
127
|
+
* everything. A scoped list covers a request path when the request equals a
|
|
128
|
+
* covered entry or sits beneath a covered directory entry. Both sides are
|
|
129
|
+
* normalized to forward slashes so Windows-style CLI input cannot defeat
|
|
130
|
+
* the prefix rule (baseline paths are POSIX by convention). A request with
|
|
131
|
+
* no paths is a full-suite run and is never covered by a scoped list — the
|
|
132
|
+
* {@link FULL_SUITE_REQUEST} sentinel is returned so the refusal can name it.
|
|
133
|
+
*/
|
|
134
|
+
export function findUncoveredRequestPaths(coverage, requestedPaths) {
|
|
135
|
+
if (coverage === undefined || coverage === 'full') {
|
|
136
|
+
return [];
|
|
137
|
+
}
|
|
138
|
+
const covered = coverage.map(normalizeCoveragePath).filter((p) => p.length > 0);
|
|
139
|
+
if (requestedPaths.length === 0) {
|
|
140
|
+
return [FULL_SUITE_REQUEST];
|
|
141
|
+
}
|
|
142
|
+
return requestedPaths.filter((requested) => {
|
|
143
|
+
const path = normalizeCoveragePath(requested);
|
|
144
|
+
return !covered.some((c) => path === c || path.startsWith(`${c}/`));
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
/** Normalizes a path for coverage comparison: forward slashes, no trailing slash. */
|
|
148
|
+
function normalizeCoveragePath(path) {
|
|
149
|
+
return path.trim().replace(/\\/g, '/').replace(/\/+$/, '');
|
|
150
|
+
}
|
|
151
|
+
/**
|
|
152
|
+
* Formats the refusal shown when a non-`--build` run requests paths the
|
|
153
|
+
* packaged runtime's scoped `test --build` coverage does not include —
|
|
154
|
+
* enforced on every such run, with or without `--allow-stale-build`. Kept
|
|
155
|
+
* separate from the matcher so tests can pin structure and copy
|
|
156
|
+
* independently (same split as {@link formatStaleBuildWarning}).
|
|
157
|
+
*/
|
|
158
|
+
export function formatTestCoverageRefusal(uncovered, coverage) {
|
|
159
|
+
const cap = (paths) => {
|
|
160
|
+
const head = paths.slice(0, STALE_PATHS_LIMIT);
|
|
161
|
+
const truncated = paths.length - head.length;
|
|
162
|
+
return head.join(', ') + (truncated > 0 ? `, … (+${truncated} more)` : '');
|
|
163
|
+
};
|
|
164
|
+
const rebuildTargets = uncovered.filter((p) => p !== FULL_SUITE_REQUEST);
|
|
165
|
+
const rebuildHint = rebuildTargets.length > 0
|
|
166
|
+
? `Rerun "fireforge test --build ${rebuildTargets.slice(0, STALE_PATHS_LIMIT).join(' ')}" to package them, or run "fireforge build" for full coverage.`
|
|
167
|
+
: 'Run "fireforge build" (or a path-less "fireforge test --build") for full coverage first.';
|
|
168
|
+
return (`The packaged test runtime was produced by a scoped "fireforge test --build" covering only: ${cap(coverage)}.\n` +
|
|
169
|
+
`The requested run needs ${cap(uncovered)}, which that packaging does not cover — support ` +
|
|
170
|
+
'fixtures for those manifests may be missing from obj-*/_tests/, and the run can hang ' +
|
|
171
|
+
`rather than fail. ${rebuildHint} ` +
|
|
172
|
+
'(--allow-stale-build does not bypass this check — it accepts stale content, not missing coverage.)');
|
|
173
|
+
}
|
|
@@ -37,4 +37,3 @@ export async function tryRepairStaleXpcshellTestSymlink(engineDir, objDir, outpu
|
|
|
37
37
|
warn(`Removed stale xpcshell harness symlink under ${objDir}/_tests and retrying mach test once: ${relative(resolve(engineDir), resolvedDestination)}`);
|
|
38
38
|
return true;
|
|
39
39
|
}
|
|
40
|
-
//# sourceMappingURL=test-stale-symlink.js.map
|
|
@@ -14,22 +14,38 @@
|
|
|
14
14
|
* the downloaded major differs from the previously downloaded one.
|
|
15
15
|
* 2. {@link runToolchainPreflight} — a cheap pre-build probe comparing
|
|
16
16
|
* the minimums the tree itself declares against the host binaries
|
|
17
|
-
* `mach configure` will resolve
|
|
18
|
-
*
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
17
|
+
* `mach configure` will resolve, probing configure's own candidate
|
|
18
|
+
* order: env override first, then the `~/.mozbuild` state-directory
|
|
19
|
+
* copy bootstrap installs, then PATH (0.35.0 probed env-or-PATH
|
|
20
|
+
* only, blocking builds whose current tool lived in the state dir
|
|
21
|
+
* behind a stale PATH copy). Deliberately FAIL-SOFT: it reports a
|
|
22
|
+
* mismatch only when a minimum was positively parsed AND at least
|
|
23
|
+
* one candidate resolved AND every resolved candidate is
|
|
24
|
+
* definitively lower. Any uncertainty (file moved upstream,
|
|
25
|
+
* unparseable output, no candidate found) skips silently — the
|
|
26
|
+
* mach-error-hints translator still catches the real configure
|
|
27
|
+
* failure downstream.
|
|
23
28
|
*/
|
|
24
29
|
/** Tools the preflight knows how to probe. */
|
|
25
30
|
export type ToolchainTool = 'cbindgen' | 'rustc';
|
|
31
|
+
/** One probed candidate binary for a tool. */
|
|
32
|
+
export interface ToolchainCandidate {
|
|
33
|
+
/** Binary path (or bare name for the PATH candidate). */
|
|
34
|
+
binary: string;
|
|
35
|
+
/** Parsed version of the candidate. */
|
|
36
|
+
version: string;
|
|
37
|
+
}
|
|
26
38
|
/** One definitive host-vs-tree mismatch found by the preflight. */
|
|
27
39
|
export interface ToolchainMismatch {
|
|
28
40
|
tool: ToolchainTool;
|
|
29
|
-
hostVersion: string;
|
|
30
41
|
minimumVersion: string;
|
|
31
42
|
/** Engine-relative file the minimum was parsed from. */
|
|
32
43
|
declaredIn: string;
|
|
44
|
+
/**
|
|
45
|
+
* Every candidate that resolved — all of them below the minimum
|
|
46
|
+
* (mach-resolution order: env override, mozbuild state dir, PATH).
|
|
47
|
+
*/
|
|
48
|
+
candidates: ToolchainCandidate[];
|
|
33
49
|
}
|
|
34
50
|
/**
|
|
35
51
|
* Returns the one-line notice to print after a download that hopped the
|
|
@@ -49,15 +65,20 @@ export declare function formatMajorVersionHopNotice(previousVersion: string | un
|
|
|
49
65
|
export declare function readDeclaredToolchainMinimums(engineDir: string): Promise<Partial<Record<ToolchainTool, string>>>;
|
|
50
66
|
/**
|
|
51
67
|
* Compares the tree-declared toolchain minimums against the host binaries
|
|
52
|
-
* `mach configure` will resolve
|
|
53
|
-
*
|
|
68
|
+
* `mach configure` will resolve, in configure's own candidate order (env
|
|
69
|
+
* override, mozbuild state dir, PATH). A tool fails ONLY when at least
|
|
70
|
+
* one candidate resolved and none of them meets the minimum; any single
|
|
71
|
+
* passing candidate passes the tool (configure will find it), and a tool
|
|
72
|
+
* with no resolvable candidate skips silently (see module header for the
|
|
73
|
+
* fail-soft rationale).
|
|
54
74
|
*
|
|
55
75
|
* @param engineDir - Path to the engine directory
|
|
56
76
|
*/
|
|
57
77
|
export declare function runToolchainPreflight(engineDir: string): Promise<ToolchainMismatch[]>;
|
|
58
78
|
/**
|
|
59
79
|
* Formats the fail-fast message for definitive preflight mismatches,
|
|
60
|
-
*
|
|
80
|
+
* listing every candidate probed (in mach's resolution order) and naming
|
|
81
|
+
* `fireforge bootstrap` as the remedy (mach's own configure error
|
|
61
82
|
* suggests `./mach bootstrap`, which is the wrong entry point for a
|
|
62
83
|
* FireForge-managed repo).
|
|
63
84
|
*/
|
|
@@ -15,17 +15,31 @@
|
|
|
15
15
|
* the downloaded major differs from the previously downloaded one.
|
|
16
16
|
* 2. {@link runToolchainPreflight} — a cheap pre-build probe comparing
|
|
17
17
|
* the minimums the tree itself declares against the host binaries
|
|
18
|
-
* `mach configure` will resolve
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
18
|
+
* `mach configure` will resolve, probing configure's own candidate
|
|
19
|
+
* order: env override first, then the `~/.mozbuild` state-directory
|
|
20
|
+
* copy bootstrap installs, then PATH (0.35.0 probed env-or-PATH
|
|
21
|
+
* only, blocking builds whose current tool lived in the state dir
|
|
22
|
+
* behind a stale PATH copy). Deliberately FAIL-SOFT: it reports a
|
|
23
|
+
* mismatch only when a minimum was positively parsed AND at least
|
|
24
|
+
* one candidate resolved AND every resolved candidate is
|
|
25
|
+
* definitively lower. Any uncertainty (file moved upstream,
|
|
26
|
+
* unparseable output, no candidate found) skips silently — the
|
|
27
|
+
* mach-error-hints translator still catches the real configure
|
|
28
|
+
* failure downstream.
|
|
24
29
|
*/
|
|
25
30
|
import { execFile } from 'node:child_process';
|
|
31
|
+
import { homedir } from 'node:os';
|
|
26
32
|
import { join } from 'node:path';
|
|
27
33
|
import { pathExists, readText } from '../utils/fs.js';
|
|
28
34
|
import { verbose } from '../utils/logger.js';
|
|
35
|
+
/**
|
|
36
|
+
* Resolves the mach state directory the same way mach itself does:
|
|
37
|
+
* `$MOZBUILD_STATE_PATH`, else `~/.mozbuild` (same resolution as
|
|
38
|
+
* `mach-resource-shim.ts`).
|
|
39
|
+
*/
|
|
40
|
+
function mozbuildStateDir() {
|
|
41
|
+
return process.env['MOZBUILD_STATE_PATH'] ?? join(homedir(), '.mozbuild');
|
|
42
|
+
}
|
|
29
43
|
/** Where each tool's minimum is declared inside the Firefox tree. */
|
|
30
44
|
const MINIMUM_DECLARATIONS = {
|
|
31
45
|
// build/moz.configure/bindgen.configure:
|
|
@@ -43,13 +57,30 @@ const MINIMUM_DECLARATIONS = {
|
|
|
43
57
|
pattern: /MINIMUM_RUST_VERSION\s*=\s*["']([\d.]+)["']/,
|
|
44
58
|
},
|
|
45
59
|
};
|
|
46
|
-
/**
|
|
60
|
+
/**
|
|
61
|
+
* How each tool's host binary is resolved and its version parsed.
|
|
62
|
+
*
|
|
63
|
+
* `stateDirRelPaths` are the mach-state-directory locations `fireforge
|
|
64
|
+
* bootstrap` (via mozboot) installs the tool to. mach's configure tries
|
|
65
|
+
* the state directory BEFORE the PATH candidates (bindgen.configure's
|
|
66
|
+
* toolchain search path lists `~/.mozbuild/cbindgen/cbindgen` first — a
|
|
67
|
+
* configure log shows `trying cbindgen: ~/.mozbuild/cbindgen/cbindgen`
|
|
68
|
+
* ahead of PATH), so the probe must too. 0.35.0 probed only env-or-PATH,
|
|
69
|
+
* which failed a build configure would have accepted whenever an old
|
|
70
|
+
* `~/.cargo/bin/cbindgen` shadowed a current bootstrap-installed copy
|
|
71
|
+
* (field report: PATH 0.29.1 vs mozbuild 0.29.4, minimum 0.29.4). Rust
|
|
72
|
+
* has no state-dir install — rustup owns it — so its list is empty.
|
|
73
|
+
*/
|
|
47
74
|
const HOST_PROBES = {
|
|
48
75
|
// `mach configure` honours the CBINDGEN env option (bindgen.configure's
|
|
49
76
|
// `option(env="CBINDGEN", ...)`), so the probe must too — otherwise the
|
|
50
77
|
// preflight could veto a build configure would have accepted.
|
|
51
|
-
cbindgen: {
|
|
52
|
-
|
|
78
|
+
cbindgen: {
|
|
79
|
+
envVar: 'CBINDGEN',
|
|
80
|
+
versionPattern: /cbindgen\s+(\d+(?:\.\d+)*)/,
|
|
81
|
+
stateDirRelPaths: ['cbindgen/cbindgen'],
|
|
82
|
+
},
|
|
83
|
+
rustc: { envVar: 'RUSTC', versionPattern: /rustc\s+(\d+(?:\.\d+)*)/, stateDirRelPaths: [] },
|
|
53
84
|
};
|
|
54
85
|
/**
|
|
55
86
|
* Parses a dotted version string into numeric components. Trailing
|
|
@@ -126,29 +157,54 @@ export async function readDeclaredToolchainMinimums(engineDir) {
|
|
|
126
157
|
return minimums;
|
|
127
158
|
}
|
|
128
159
|
/** Runs `<binary> --version` and parses the leading version number. */
|
|
129
|
-
async function
|
|
130
|
-
const probe = HOST_PROBES[tool];
|
|
131
|
-
const binary = process.env[probe.envVar] ?? tool;
|
|
160
|
+
async function probeBinaryVersion(binary, versionPattern) {
|
|
132
161
|
const output = await new Promise((resolvePromise) => {
|
|
133
162
|
execFile(binary, ['--version'], { timeout: 10_000 }, (err, stdout) => {
|
|
134
163
|
resolvePromise(err ? undefined : stdout);
|
|
135
164
|
});
|
|
136
165
|
});
|
|
137
|
-
if (output === undefined)
|
|
138
|
-
verbose(`Toolchain preflight: "${binary} --version" failed or not found; skipping ${tool}.`);
|
|
166
|
+
if (output === undefined)
|
|
139
167
|
return undefined;
|
|
140
|
-
|
|
141
|
-
const match = probe.versionPattern.exec(output);
|
|
168
|
+
const match = versionPattern.exec(output);
|
|
142
169
|
if (!match?.[1]) {
|
|
143
|
-
verbose(`Toolchain preflight: could not parse
|
|
170
|
+
verbose(`Toolchain preflight: could not parse a version from "${output.trim()}" (${binary}).`);
|
|
144
171
|
return undefined;
|
|
145
172
|
}
|
|
146
173
|
return match[1];
|
|
147
174
|
}
|
|
175
|
+
/**
|
|
176
|
+
* Probes every candidate binary for a tool in mach's resolution order:
|
|
177
|
+
* the env override (which, when set, is the ONLY candidate — configure
|
|
178
|
+
* uses it even when a better binary exists elsewhere), then the mozbuild
|
|
179
|
+
* state-directory copy bootstrap installs, then PATH. Candidates that
|
|
180
|
+
* fail to run or to parse are dropped silently.
|
|
181
|
+
*/
|
|
182
|
+
async function probeHostToolCandidates(tool) {
|
|
183
|
+
const probe = HOST_PROBES[tool];
|
|
184
|
+
const envOverride = process.env[probe.envVar];
|
|
185
|
+
const binaries = envOverride
|
|
186
|
+
? [envOverride]
|
|
187
|
+
: [...probe.stateDirRelPaths.map((rel) => join(mozbuildStateDir(), rel)), tool];
|
|
188
|
+
const candidates = [];
|
|
189
|
+
for (const binary of binaries) {
|
|
190
|
+
const version = await probeBinaryVersion(binary, probe.versionPattern);
|
|
191
|
+
if (version !== undefined) {
|
|
192
|
+
candidates.push({ binary, version });
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
verbose(`Toolchain preflight: "${binary} --version" failed or not found; skipping.`);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return candidates;
|
|
199
|
+
}
|
|
148
200
|
/**
|
|
149
201
|
* Compares the tree-declared toolchain minimums against the host binaries
|
|
150
|
-
* `mach configure` will resolve
|
|
151
|
-
*
|
|
202
|
+
* `mach configure` will resolve, in configure's own candidate order (env
|
|
203
|
+
* override, mozbuild state dir, PATH). A tool fails ONLY when at least
|
|
204
|
+
* one candidate resolved and none of them meets the minimum; any single
|
|
205
|
+
* passing candidate passes the tool (configure will find it), and a tool
|
|
206
|
+
* with no resolvable candidate skips silently (see module header for the
|
|
207
|
+
* fail-soft rationale).
|
|
152
208
|
*
|
|
153
209
|
* @param engineDir - Path to the engine directory
|
|
154
210
|
*/
|
|
@@ -159,37 +215,42 @@ export async function runToolchainPreflight(engineDir) {
|
|
|
159
215
|
const minimum = parseVersionComponents(minimumVersion);
|
|
160
216
|
if (!minimum)
|
|
161
217
|
continue;
|
|
162
|
-
const
|
|
163
|
-
|
|
218
|
+
const candidates = await probeHostToolCandidates(tool);
|
|
219
|
+
const parsed = candidates.filter((c) => parseVersionComponents(c.version) !== undefined);
|
|
220
|
+
if (parsed.length === 0)
|
|
164
221
|
continue;
|
|
165
|
-
const
|
|
166
|
-
|
|
222
|
+
const satisfying = parsed.find((c) => {
|
|
223
|
+
const components = parseVersionComponents(c.version);
|
|
224
|
+
return components !== undefined && !isVersionLower(components, minimum);
|
|
225
|
+
});
|
|
226
|
+
if (satisfying) {
|
|
227
|
+
verbose(`Toolchain preflight: ${tool} ${satisfying.version} (${satisfying.binary}) satisfies minimum ${minimumVersion}.`);
|
|
167
228
|
continue;
|
|
168
|
-
if (isVersionLower(host, minimum)) {
|
|
169
|
-
mismatches.push({
|
|
170
|
-
tool,
|
|
171
|
-
hostVersion,
|
|
172
|
-
minimumVersion,
|
|
173
|
-
declaredIn: MINIMUM_DECLARATIONS[tool].relPath,
|
|
174
|
-
});
|
|
175
|
-
}
|
|
176
|
-
else {
|
|
177
|
-
verbose(`Toolchain preflight: ${tool} ${hostVersion} satisfies minimum ${minimumVersion}.`);
|
|
178
229
|
}
|
|
230
|
+
mismatches.push({
|
|
231
|
+
tool,
|
|
232
|
+
minimumVersion,
|
|
233
|
+
declaredIn: MINIMUM_DECLARATIONS[tool].relPath,
|
|
234
|
+
candidates: parsed,
|
|
235
|
+
});
|
|
179
236
|
}
|
|
180
237
|
return mismatches;
|
|
181
238
|
}
|
|
182
239
|
/**
|
|
183
240
|
* Formats the fail-fast message for definitive preflight mismatches,
|
|
184
|
-
*
|
|
241
|
+
* listing every candidate probed (in mach's resolution order) and naming
|
|
242
|
+
* `fireforge bootstrap` as the remedy (mach's own configure error
|
|
185
243
|
* suggests `./mach bootstrap`, which is the wrong entry point for a
|
|
186
244
|
* FireForge-managed repo).
|
|
187
245
|
*/
|
|
188
246
|
export function formatToolchainMismatchMessage(mismatches) {
|
|
189
|
-
const lines = mismatches.map((m) =>
|
|
247
|
+
const lines = mismatches.map((m) => {
|
|
248
|
+
const probed = m.candidates.map((c) => `${c.version} (${c.binary})`).join(', ');
|
|
249
|
+
return (` - ${m.tool}: no resolvable candidate meets the minimum ${m.minimumVersion} declared by ` +
|
|
250
|
+
`this Firefox source (engine/${m.declaredIn}); probed in mach's resolution order: ${probed}`);
|
|
251
|
+
});
|
|
190
252
|
return ('Toolchain preflight found host tools older than what this Firefox source requires:\n' +
|
|
191
253
|
`${lines.join('\n')}\n\n` +
|
|
192
254
|
'This typically happens after "fireforge download --force" moved the engine to a new ' +
|
|
193
255
|
'Firefox major version. Run "fireforge bootstrap" to update the toolchain, then retry the build.');
|
|
194
256
|
}
|
|
195
|
-
//# sourceMappingURL=toolchain-preflight.js.map
|
|
@@ -60,6 +60,7 @@ interface ChromeUtilsShim {
|
|
|
60
60
|
defineESModuleGetters(target: any, modules: Record<string, string>): void;
|
|
61
61
|
importESModule(specifier: string): any;
|
|
62
62
|
import(specifier: string): any;
|
|
63
|
+
registerWindowActor(name: string, options: Record<string, any>): void;
|
|
63
64
|
defineModuleGetter(target: any, name: string, specifier: string): void;
|
|
64
65
|
defineLazyGetter(target: any, name: string, getter: () => any): void;
|
|
65
66
|
generateQI(interfaces: any[]): Function;
|
|
@@ -85,6 +86,18 @@ declare var gBrowser: any;
|
|
|
85
86
|
declare var gURLBar: any;
|
|
86
87
|
declare var gNavigatorBundle: any;
|
|
87
88
|
declare var AppConstants: any;
|
|
89
|
+
declare class JSWindowActorChild {
|
|
90
|
+
readonly browsingContext: any;
|
|
91
|
+
readonly contentWindow: any;
|
|
92
|
+
readonly document: any;
|
|
93
|
+
sendAsyncMessage(name: string, data?: any, transfers?: any[]): void;
|
|
94
|
+
sendQuery(name: string, data?: any, transfers?: any[]): Promise<any>;
|
|
95
|
+
}
|
|
96
|
+
declare class JSWindowActorParent {
|
|
97
|
+
readonly browsingContext: any;
|
|
98
|
+
sendAsyncMessage(name: string, data?: any, transfers?: any[]): void;
|
|
99
|
+
sendQuery(name: string, data?: any, transfers?: any[]): Promise<any>;
|
|
100
|
+
}
|
|
88
101
|
// Fluent localization — a stable chrome global. Members stay loose (any),
|
|
89
102
|
// but the constructor shape is declared so "new Localization([...])" and
|
|
90
103
|
// "new Localization([...], true)" typecheck without a local cast. Both
|
|
@@ -213,4 +226,3 @@ export async function composeShimSource(projectRoot, extraShimPath) {
|
|
|
213
226
|
extraShimAppended: true,
|
|
214
227
|
};
|
|
215
228
|
}
|
|
216
|
-
//# sourceMappingURL=typecheck-shim.js.map
|
|
@@ -6,4 +6,3 @@ export { addDestroyToBrowserInit } from './wire-destroy.js';
|
|
|
6
6
|
export { addDomFragment } from './wire-dom-fragment.js';
|
|
7
7
|
export { addInitToBrowserInit } from './wire-init.js';
|
|
8
8
|
export { addSubscriptToBrowserMain } from './wire-subscript.js';
|
|
9
|
-
//# sourceMappingURL=wire-targets.js.map
|