@hominis/fireforge 0.45.0 → 0.46.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +409 -446
- package/dist/bin/fireforge.d.ts +1 -1
- package/dist/bin/fireforge.js +21 -15
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +46 -0
- package/dist/src/cli-usage-error.js +81 -0
- package/dist/src/cli.d.ts +7 -2
- package/dist/src/cli.js +47 -47
- package/dist/src/commands/bootstrap-checks.js +2 -1
- package/dist/src/commands/bootstrap.js +3 -4
- package/dist/src/commands/build.js +27 -17
- package/dist/src/commands/config.js +9 -9
- package/dist/src/commands/destructive-decision.d.ts +19 -0
- package/dist/src/commands/destructive-decision.js +31 -0
- package/dist/src/commands/discard.js +5 -5
- package/dist/src/commands/doctor-check-core.d.ts +4 -10
- package/dist/src/commands/doctor-check-core.js +0 -8
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
- package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
- package/dist/src/commands/doctor-furnace-jar.js +1 -1
- package/dist/src/commands/doctor-furnace.js +22 -22
- package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -17
- package/dist/src/commands/doctor-orphaned-harness.js +14 -23
- package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
- package/dist/src/commands/doctor-patch-manifest.js +7 -6
- package/dist/src/commands/doctor-post-rebase-audit.js +3 -3
- package/dist/src/commands/doctor-source-pin.d.ts +12 -12
- package/dist/src/commands/doctor-source-pin.js +14 -14
- package/dist/src/commands/doctor-working-tree.d.ts +3 -3
- package/dist/src/commands/doctor-working-tree.js +3 -3
- package/dist/src/commands/doctor.d.ts +3 -1
- package/dist/src/commands/doctor.js +15 -16
- package/dist/src/commands/download.js +50 -37
- package/dist/src/commands/export-all.js +29 -12
- package/dist/src/commands/export-flow.d.ts +5 -5
- package/dist/src/commands/export-flow.js +29 -59
- package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
- package/dist/src/commands/export-placement-conflicts.js +12 -12
- package/dist/src/commands/export-placement-gate.d.ts +2 -2
- package/dist/src/commands/export-placement-gate.js +7 -13
- package/dist/src/commands/export-placement-policy.d.ts +1 -1
- package/dist/src/commands/export-placement-policy.js +4 -6
- package/dist/src/commands/export-shared.d.ts +51 -32
- package/dist/src/commands/export-shared.js +17 -32
- package/dist/src/commands/export.js +14 -5
- package/dist/src/commands/furnace/apply.js +16 -16
- package/dist/src/commands/furnace/authoring-config.d.ts +13 -0
- package/dist/src/commands/furnace/authoring-config.js +19 -0
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +2 -2
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
- package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
- package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
- package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
- package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
- package/dist/src/commands/furnace/chrome-doc.js +18 -18
- package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
- package/dist/src/commands/furnace/create-browser-test.js +7 -12
- package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
- package/dist/src/commands/furnace/create-dry-run.js +6 -9
- package/dist/src/commands/furnace/create-features.d.ts +2 -2
- package/dist/src/commands/furnace/create-features.js +2 -2
- package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
- package/dist/src/commands/furnace/create-mochikit.js +7 -7
- package/dist/src/commands/furnace/create-templates.d.ts +31 -15
- package/dist/src/commands/furnace/create-templates.js +20 -19
- package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
- package/dist/src/commands/furnace/create-xpcshell.js +8 -8
- package/dist/src/commands/furnace/create.d.ts +1 -1
- package/dist/src/commands/furnace/create.js +35 -29
- package/dist/src/commands/furnace/deploy.js +15 -6
- package/dist/src/commands/furnace/diff.js +7 -7
- package/dist/src/commands/furnace/index.js +1 -1
- package/dist/src/commands/furnace/init.js +17 -16
- package/dist/src/commands/furnace/list.js +2 -2
- package/dist/src/commands/furnace/override.d.ts +1 -1
- package/dist/src/commands/furnace/override.js +43 -34
- package/dist/src/commands/furnace/preview.js +17 -17
- package/dist/src/commands/furnace/refresh.js +15 -7
- package/dist/src/commands/furnace/remove-mutations.d.ts +9 -10
- package/dist/src/commands/furnace/remove-mutations.js +19 -19
- package/dist/src/commands/furnace/remove-state.d.ts +1 -1
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +4 -8
- package/dist/src/commands/furnace/rename-browser-test.js +10 -15
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
- package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
- package/dist/src/commands/furnace/rename.js +36 -36
- package/dist/src/commands/furnace/scan.js +3 -3
- package/dist/src/commands/furnace/status.js +19 -16
- package/dist/src/commands/furnace/sync.js +6 -6
- package/dist/src/commands/furnace/test-file-name.d.ts +28 -0
- package/dist/src/commands/furnace/test-file-name.js +39 -0
- package/dist/src/commands/furnace/validate.js +11 -12
- package/dist/src/commands/furnace/validation-output.d.ts +21 -9
- package/dist/src/commands/furnace/validation-output.js +3 -8
- package/dist/src/commands/import.js +22 -29
- package/dist/src/commands/lint-per-patch.d.ts +2 -2
- package/dist/src/commands/lint-per-patch.js +27 -12
- package/dist/src/commands/lint-per-run-checkjs.d.ts +14 -15
- package/dist/src/commands/lint-per-run-checkjs.js +14 -15
- package/dist/src/commands/lint-report.d.ts +3 -3
- package/dist/src/commands/lint-report.js +4 -4
- package/dist/src/commands/lint.d.ts +5 -4
- package/dist/src/commands/lint.js +36 -36
- package/dist/src/commands/manifest.d.ts +4 -4
- package/dist/src/commands/manifest.js +1 -1
- package/dist/src/commands/package.js +4 -6
- package/dist/src/commands/patch/compact.d.ts +2 -2
- package/dist/src/commands/patch/compact.js +19 -20
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +23 -33
- package/dist/src/commands/patch/entry-projection.d.ts +13 -0
- package/dist/src/commands/patch/entry-projection.js +24 -0
- package/dist/src/commands/patch/lint-ignore.d.ts +3 -12
- package/dist/src/commands/patch/lint-ignore.js +33 -44
- package/dist/src/commands/patch/move-files-create.d.ts +2 -2
- package/dist/src/commands/patch/move-files-create.js +29 -15
- package/dist/src/commands/patch/move-files-into.d.ts +2 -2
- package/dist/src/commands/patch/move-files-into.js +41 -37
- package/dist/src/commands/patch/move-files.js +5 -14
- package/dist/src/commands/patch/patch-context.d.ts +1 -1
- package/dist/src/commands/patch/rename.d.ts +4 -4
- package/dist/src/commands/patch/rename.js +35 -49
- package/dist/src/commands/patch/reorder.js +35 -48
- package/dist/src/commands/patch/split-plan.d.ts +7 -8
- package/dist/src/commands/patch/split-plan.js +10 -13
- package/dist/src/commands/patch/split.d.ts +2 -2
- package/dist/src/commands/patch/split.js +50 -48
- package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
- package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency.js +22 -28
- package/dist/src/commands/patch/tier.d.ts +2 -2
- package/dist/src/commands/patch/tier.js +20 -30
- package/dist/src/commands/patch-rename-map.d.ts +19 -0
- package/dist/src/commands/patch-rename-map.js +36 -0
- package/dist/src/commands/pending-resolution.d.ts +15 -0
- package/dist/src/commands/pending-resolution.js +25 -0
- package/dist/src/commands/re-export-adjacent.d.ts +25 -3
- package/dist/src/commands/re-export-adjacent.js +40 -24
- package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
- package/dist/src/commands/re-export-bulk-scan.js +23 -27
- package/dist/src/commands/re-export-drift.d.ts +10 -10
- package/dist/src/commands/re-export-drift.js +33 -33
- package/dist/src/commands/re-export-files.d.ts +2 -3
- package/dist/src/commands/re-export-files.js +52 -44
- package/dist/src/commands/re-export-lint.d.ts +29 -30
- package/dist/src/commands/re-export-lint.js +36 -29
- package/dist/src/commands/re-export-options.d.ts +1 -1
- package/dist/src/commands/re-export-options.js +1 -1
- package/dist/src/commands/re-export-register.d.ts +1 -1
- package/dist/src/commands/re-export-register.js +1 -1
- package/dist/src/commands/re-export-scan.d.ts +1 -1
- package/dist/src/commands/re-export-scan.js +12 -9
- package/dist/src/commands/re-export-single.d.ts +23 -4
- package/dist/src/commands/re-export-single.js +39 -31
- package/dist/src/commands/re-export.js +35 -17
- package/dist/src/commands/rebase/abort.js +9 -14
- package/dist/src/commands/rebase/continue.js +20 -19
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +5 -5
- package/dist/src/commands/rebase/patch-loop.d.ts +2 -2
- package/dist/src/commands/rebase/patch-loop.js +20 -24
- package/dist/src/commands/register.js +5 -5
- package/dist/src/commands/reset.js +1 -1
- package/dist/src/commands/resolve.d.ts +2 -2
- package/dist/src/commands/resolve.js +21 -13
- package/dist/src/commands/run.d.ts +0 -13
- package/dist/src/commands/run.js +38 -51
- package/dist/src/commands/setup-support.d.ts +16 -4
- package/dist/src/commands/setup-support.js +20 -20
- package/dist/src/commands/setup.js +4 -10
- package/dist/src/commands/source.js +9 -2
- package/dist/src/commands/status-check.d.ts +3 -3
- package/dist/src/commands/status-check.js +6 -6
- package/dist/src/commands/status-json.d.ts +14 -13
- package/dist/src/commands/status-json.js +9 -8
- package/dist/src/commands/status-output.d.ts +3 -3
- package/dist/src/commands/status-output.js +5 -5
- package/dist/src/commands/status-ownership.d.ts +3 -3
- package/dist/src/commands/status-ownership.js +3 -3
- package/dist/src/commands/status.js +25 -26
- package/dist/src/commands/test-build-phase.d.ts +3 -3
- package/dist/src/commands/test-build-phase.js +48 -24
- package/dist/src/commands/test-diagnose.d.ts +1 -1
- package/dist/src/commands/test-diagnose.js +20 -20
- package/dist/src/commands/test-modes.d.ts +4 -4
- package/dist/src/commands/test-modes.js +4 -5
- package/dist/src/commands/test-register.js +5 -3
- package/dist/src/commands/test-run.d.ts +11 -11
- package/dist/src/commands/test-run.js +40 -33
- package/dist/src/commands/test-stale-gate.d.ts +12 -12
- package/dist/src/commands/test-stale-gate.js +17 -17
- package/dist/src/commands/test-verdict.d.ts +19 -5
- package/dist/src/commands/test-verdict.js +26 -11
- package/dist/src/commands/test.d.ts +3 -3
- package/dist/src/commands/test.js +73 -36
- package/dist/src/commands/token-coverage.js +3 -3
- package/dist/src/commands/token-list.d.ts +26 -0
- package/dist/src/commands/token-list.js +153 -0
- package/dist/src/commands/token.js +26 -10
- package/dist/src/commands/tree.js +26 -21
- package/dist/src/commands/typecheck.d.ts +6 -6
- package/dist/src/commands/typecheck.js +16 -16
- package/dist/src/commands/verify.d.ts +3 -3
- package/dist/src/commands/verify.js +10 -10
- package/dist/src/commands/watch.js +11 -11
- package/dist/src/commands/wire.js +17 -16
- package/dist/src/core/ast-utils.d.ts +7 -7
- package/dist/src/core/ast-utils.js +8 -8
- package/dist/src/core/branding.d.ts +5 -12
- package/dist/src/core/branding.js +6 -5
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +10 -7
- package/dist/src/core/build-audit-platform.d.ts +32 -3
- package/dist/src/core/build-audit-platform.js +153 -13
- package/dist/src/core/build-audit-registration.d.ts +5 -5
- package/dist/src/core/build-audit-registration.js +10 -9
- package/dist/src/core/build-audit-resolve.d.ts +5 -5
- package/dist/src/core/build-audit-resolve.js +6 -6
- package/dist/src/core/build-audit-skip.d.ts +57 -0
- package/dist/src/core/build-audit-skip.js +112 -0
- package/dist/src/core/build-audit-transforms.d.ts +2 -2
- package/dist/src/core/build-audit-transforms.js +3 -3
- package/dist/src/core/build-audit.d.ts +21 -8
- package/dist/src/core/build-audit.js +142 -40
- package/dist/src/core/build-baseline-types.d.ts +19 -18
- package/dist/src/core/build-baseline-types.js +1 -1
- package/dist/src/core/build-baseline.d.ts +48 -31
- package/dist/src/core/build-baseline.js +20 -43
- package/dist/src/core/build-jar-escalation.d.ts +8 -8
- package/dist/src/core/build-jar-escalation.js +18 -17
- package/dist/src/core/build-overwrite-guard.d.ts +4 -4
- package/dist/src/core/build-overwrite-guard.js +14 -14
- package/dist/src/core/build-prepare.d.ts +4 -12
- package/dist/src/core/build-prepare.js +22 -26
- package/dist/src/core/config-mutate.js +4 -4
- package/dist/src/core/config-paths.d.ts +2 -6
- package/dist/src/core/config-paths.js +4 -2
- package/dist/src/core/config-state.d.ts +0 -6
- package/dist/src/core/config-state.js +3 -21
- package/dist/src/core/config-validate-build-audit.d.ts +8 -0
- package/dist/src/core/config-validate-build-audit.js +80 -0
- package/dist/src/core/config-validate-file-size.d.ts +1 -1
- package/dist/src/core/config-validate-file-size.js +3 -3
- package/dist/src/core/config-validate-patch-policy.d.ts +2 -2
- package/dist/src/core/config-validate-patch-policy.js +3 -3
- package/dist/src/core/config-validate-test-toolchains.d.ts +2 -2
- package/dist/src/core/config-validate-test-toolchains.js +4 -5
- package/dist/src/core/config-validate.js +22 -12
- package/dist/src/core/config.d.ts +12 -12
- package/dist/src/core/config.js +21 -25
- package/dist/src/core/coverage-extend.d.ts +16 -16
- package/dist/src/core/coverage-extend.js +20 -20
- package/dist/src/core/destructive.d.ts +14 -14
- package/dist/src/core/destructive.js +9 -9
- package/dist/src/core/diff-hunks.d.ts +2 -2
- package/dist/src/core/diff-hunks.js +7 -7
- package/dist/src/core/discard-baseline.d.ts +10 -10
- package/dist/src/core/discard-baseline.js +22 -23
- package/dist/src/core/display-state.d.ts +11 -11
- package/dist/src/core/display-state.js +12 -12
- package/dist/src/core/engine-changes.d.ts +2 -2
- package/dist/src/core/engine-changes.js +2 -2
- package/dist/src/core/engine-precondition.d.ts +5 -13
- package/dist/src/core/engine-precondition.js +5 -10
- package/dist/src/core/engine-session-lock.d.ts +18 -18
- package/dist/src/core/engine-session-lock.js +50 -54
- package/dist/src/core/export-moved-code-shape.d.ts +7 -7
- package/dist/src/core/export-moved-code-shape.js +10 -10
- package/dist/src/core/file-lock-owner.d.ts +103 -0
- package/dist/src/core/file-lock-owner.js +259 -0
- package/dist/src/core/file-lock.d.ts +14 -19
- package/dist/src/core/file-lock.js +90 -128
- package/dist/src/core/firefox-cache.d.ts +13 -1
- package/dist/src/core/firefox-cache.js +61 -36
- package/dist/src/core/firefox-download.d.ts +15 -0
- package/dist/src/core/firefox-download.js +38 -22
- package/dist/src/core/firefox-extract.d.ts +8 -7
- package/dist/src/core/firefox-extract.js +45 -27
- package/dist/src/core/firefox.d.ts +34 -36
- package/dist/src/core/firefox.js +13 -44
- package/dist/src/core/furnace-apply-dry-run.d.ts +1 -6
- package/dist/src/core/furnace-apply-dry-run.js +2 -8
- package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
- package/dist/src/core/furnace-apply-ftl.js +8 -8
- package/dist/src/core/furnace-apply-helpers.d.ts +9 -20
- package/dist/src/core/furnace-apply-helpers.js +28 -39
- package/dist/src/core/furnace-apply-output.js +1 -1
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +13 -11
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
- package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
- package/dist/src/core/furnace-apply.d.ts +4 -4
- package/dist/src/core/furnace-apply.js +50 -29
- package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
- package/dist/src/core/furnace-checksum-utils.js +5 -5
- package/dist/src/core/furnace-config-custom.d.ts +1 -1
- package/dist/src/core/furnace-config-custom.js +2 -2
- package/dist/src/core/furnace-config-order.js +1 -1
- package/dist/src/core/furnace-config-tokens.d.ts +3 -3
- package/dist/src/core/furnace-config-tokens.js +3 -3
- package/dist/src/core/furnace-config-validate.js +2 -2
- package/dist/src/core/furnace-config.d.ts +5 -5
- package/dist/src/core/furnace-config.js +40 -53
- package/dist/src/core/furnace-constants.d.ts +6 -6
- package/dist/src/core/furnace-constants.js +9 -8
- package/dist/src/core/furnace-css-fragments.d.ts +6 -6
- package/dist/src/core/furnace-css-fragments.js +11 -11
- package/dist/src/core/furnace-dir-entry.d.ts +20 -0
- package/dist/src/core/furnace-dir-entry.js +21 -0
- package/dist/src/core/furnace-jsconfig.d.ts +7 -7
- package/dist/src/core/furnace-jsconfig.js +22 -20
- package/dist/src/core/furnace-operation.d.ts +22 -19
- package/dist/src/core/furnace-operation.js +38 -34
- package/dist/src/core/furnace-precondition.d.ts +10 -10
- package/dist/src/core/furnace-precondition.js +8 -8
- package/dist/src/core/furnace-refresh.d.ts +18 -6
- package/dist/src/core/furnace-refresh.js +5 -8
- package/dist/src/core/furnace-registration-ast.d.ts +2 -3
- package/dist/src/core/furnace-registration-ast.js +9 -12
- package/dist/src/core/furnace-registration-remove.d.ts +4 -4
- package/dist/src/core/furnace-registration-remove.js +6 -6
- package/dist/src/core/furnace-registration-validate.d.ts +2 -2
- package/dist/src/core/furnace-registration-validate.js +2 -2
- package/dist/src/core/furnace-registration.d.ts +7 -6
- package/dist/src/core/furnace-registration.js +29 -36
- package/dist/src/core/furnace-rollback.d.ts +1 -1
- package/dist/src/core/furnace-rollback.js +5 -5
- package/dist/src/core/furnace-scanner.js +3 -6
- package/dist/src/core/furnace-stale-export.d.ts +17 -16
- package/dist/src/core/furnace-stale-export.js +16 -15
- package/dist/src/core/furnace-staleness.d.ts +2 -2
- package/dist/src/core/furnace-staleness.js +2 -2
- package/dist/src/core/furnace-state-persist.d.ts +12 -12
- package/dist/src/core/furnace-state-persist.js +10 -10
- package/dist/src/core/furnace-step-errors.d.ts +6 -6
- package/dist/src/core/furnace-step-errors.js +6 -6
- package/dist/src/core/furnace-validate-accessibility.js +14 -14
- package/dist/src/core/furnace-validate-compatibility.js +9 -9
- package/dist/src/core/furnace-validate-registration.d.ts +2 -2
- package/dist/src/core/furnace-validate-registration.js +18 -20
- package/dist/src/core/furnace-validate-structure.d.ts +1 -1
- package/dist/src/core/furnace-validate-structure.js +4 -4
- package/dist/src/core/furnace-validate.js +9 -9
- package/dist/src/core/furnace-version-drift.d.ts +5 -5
- package/dist/src/core/furnace-version-drift.js +5 -5
- package/dist/src/core/git-base.d.ts +6 -4
- package/dist/src/core/git-base.js +29 -7
- package/dist/src/core/git-diff-new-file.d.ts +40 -0
- package/dist/src/core/git-diff-new-file.js +119 -0
- package/dist/src/core/git-diff.d.ts +13 -13
- package/dist/src/core/git-diff.js +121 -189
- package/dist/src/core/git-file-ops.d.ts +6 -13
- package/dist/src/core/git-file-ops.js +11 -35
- package/dist/src/core/git-readonly-index.d.ts +12 -14
- package/dist/src/core/git-readonly-index.js +12 -16
- package/dist/src/core/git-status.d.ts +9 -2
- package/dist/src/core/git-status.js +23 -11
- package/dist/src/core/git.d.ts +3 -9
- package/dist/src/core/git.js +28 -57
- package/dist/src/core/harness-orphans.d.ts +17 -17
- package/dist/src/core/harness-orphans.js +28 -27
- package/dist/src/core/history-log.d.ts +19 -0
- package/dist/src/core/history-log.js +29 -0
- package/dist/src/core/license-headers.d.ts +19 -18
- package/dist/src/core/license-headers.js +29 -28
- package/dist/src/core/mach-build-artifacts.d.ts +21 -21
- package/dist/src/core/mach-build-artifacts.js +23 -23
- package/dist/src/core/mach-error-hints.d.ts +5 -10
- package/dist/src/core/mach-error-hints.js +14 -14
- package/dist/src/core/mach-known-noise-filter.d.ts +42 -38
- package/dist/src/core/mach-known-noise-filter.js +57 -56
- package/dist/src/core/mach-mozconfig.d.ts +6 -6
- package/dist/src/core/mach-mozconfig.js +17 -16
- package/dist/src/core/mach-python.d.ts +3 -0
- package/dist/src/core/mach-python.js +13 -7
- package/dist/src/core/mach-resource-shim.d.ts +24 -12
- package/dist/src/core/mach-resource-shim.js +124 -21
- package/dist/src/core/mach.d.ts +59 -73
- package/dist/src/core/mach.js +47 -115
- package/dist/src/core/marionette-port.d.ts +15 -30
- package/dist/src/core/marionette-port.js +46 -89
- package/dist/src/core/marionette-preflight.d.ts +6 -6
- package/dist/src/core/marionette-preflight.js +32 -50
- package/dist/src/core/markdown-table.d.ts +9 -9
- package/dist/src/core/markdown-table.js +14 -14
- package/dist/src/core/mochitest-server-port.d.ts +8 -8
- package/dist/src/core/mochitest-server-port.js +17 -17
- package/dist/src/core/module-resolution-preflight.d.ts +8 -8
- package/dist/src/core/module-resolution-preflight.js +11 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
- package/dist/src/core/moz-manifest-helpers.js +7 -7
- package/dist/src/core/moz-manifest-register.d.ts +1 -1
- package/dist/src/core/moz-manifest-register.js +2 -2
- package/dist/src/core/moz-manifest-rules.js +46 -42
- package/dist/src/core/moz-manifest-tokenizers.js +1 -1
- package/dist/src/core/ownership-table.d.ts +5 -5
- package/dist/src/core/ownership-table.js +7 -7
- package/dist/src/core/parser-fallback.d.ts +3 -3
- package/dist/src/core/parser-fallback.js +3 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
- package/dist/src/core/patch-apply-fuzz.js +13 -13
- package/dist/src/core/patch-apply.d.ts +13 -14
- package/dist/src/core/patch-apply.js +36 -42
- package/dist/src/core/patch-export-coverage.d.ts +0 -9
- package/dist/src/core/patch-export-coverage.js +1 -30
- package/dist/src/core/patch-export-update.d.ts +21 -4
- package/dist/src/core/patch-export-update.js +7 -6
- package/dist/src/core/patch-export.d.ts +20 -30
- package/dist/src/core/patch-export.js +55 -77
- package/dist/src/core/patch-files.d.ts +0 -4
- package/dist/src/core/patch-files.js +0 -11
- package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
- package/dist/src/core/patch-identifier-suggest.js +4 -4
- package/dist/src/core/patch-lint-binary.d.ts +12 -18
- package/dist/src/core/patch-lint-cache.d.ts +18 -2
- package/dist/src/core/patch-lint-cache.js +16 -19
- package/dist/src/core/patch-lint-checkjs.d.ts +55 -38
- package/dist/src/core/patch-lint-checkjs.js +78 -64
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
- package/dist/src/core/patch-lint-creators.d.ts +5 -9
- package/dist/src/core/patch-lint-creators.js +3 -3
- package/dist/src/core/patch-lint-cross.d.ts +27 -19
- package/dist/src/core/patch-lint-cross.js +67 -110
- package/dist/src/core/patch-lint-css.d.ts +1 -1
- package/dist/src/core/patch-lint-css.js +15 -11
- package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
- package/dist/src/core/patch-lint-diff-tag.js +5 -5
- package/dist/src/core/patch-lint-diff.d.ts +4 -4
- package/dist/src/core/patch-lint-diff.js +4 -4
- package/dist/src/core/patch-lint-file-size.d.ts +3 -3
- package/dist/src/core/patch-lint-file-size.js +6 -6
- package/dist/src/core/patch-lint-forward-registration.d.ts +58 -0
- package/dist/src/core/patch-lint-forward-registration.js +210 -0
- package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
- package/dist/src/core/patch-lint-jsdoc.js +46 -46
- package/dist/src/core/patch-lint-module-registration.d.ts +3 -9
- package/dist/src/core/patch-lint-module-registration.js +1 -1
- package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
- package/dist/src/core/patch-lint-mozbuild.js +10 -10
- package/dist/src/core/patch-lint-observer.d.ts +3 -3
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint-ownership.d.ts +6 -6
- package/dist/src/core/patch-lint-ownership.js +6 -6
- package/dist/src/core/patch-lint-prettier.d.ts +6 -6
- package/dist/src/core/patch-lint-prettier.js +7 -7
- package/dist/src/core/patch-lint-queue-types.d.ts +60 -0
- package/dist/src/core/patch-lint-queue-types.js +12 -0
- package/dist/src/core/patch-lint-staged-registration.d.ts +61 -0
- package/dist/src/core/patch-lint-staged-registration.js +90 -0
- package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
- package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
- package/dist/src/core/patch-lint.d.ts +41 -35
- package/dist/src/core/patch-lint.js +52 -49
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +11 -11
- package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
- package/dist/src/core/patch-manifest-consistency.js +16 -17
- package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
- package/dist/src/core/patch-manifest-files-affected.js +3 -3
- package/dist/src/core/patch-manifest-io.d.ts +14 -14
- package/dist/src/core/patch-manifest-io.js +35 -34
- package/dist/src/core/patch-manifest-query.d.ts +1 -1
- package/dist/src/core/patch-manifest-query.js +4 -4
- package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
- package/dist/src/core/patch-manifest-resolve.js +7 -7
- package/dist/src/core/patch-manifest-validate.js +3 -3
- package/dist/src/core/patch-manifest.d.ts +2 -2
- package/dist/src/core/patch-manifest.js +2 -2
- package/dist/src/core/patch-parse.d.ts +32 -21
- package/dist/src/core/patch-parse.js +40 -15
- package/dist/src/core/patch-policy.js +15 -27
- package/dist/src/core/patch-registration-refs.d.ts +4 -4
- package/dist/src/core/patch-registration-refs.js +7 -7
- package/dist/src/core/patch-source-metadata.d.ts +1 -3
- package/dist/src/core/patch-source-metadata.js +0 -4
- package/dist/src/core/patch-transform.d.ts +8 -16
- package/dist/src/core/patch-transform.js +13 -23
- package/dist/src/core/process-cpu-time.d.ts +1 -1
- package/dist/src/core/process-cpu-time.js +6 -6
- package/dist/src/core/rebase-session.d.ts +9 -15
- package/dist/src/core/rebase-session.js +13 -25
- package/dist/src/core/register-browser-content.js +3 -2
- package/dist/src/core/register-browser-test.js +2 -1
- package/dist/src/core/register-module.js +2 -1
- package/dist/src/core/register-result.d.ts +1 -1
- package/dist/src/core/register-result.js +1 -1
- package/dist/src/core/register-scaffold.d.ts +2 -2
- package/dist/src/core/register-scaffold.js +8 -7
- package/dist/src/core/register-shared-css.d.ts +3 -3
- package/dist/src/core/register-shared-css.js +6 -5
- package/dist/src/core/register-xpcshell-test.d.ts +2 -2
- package/dist/src/core/register-xpcshell-test.js +2 -2
- package/dist/src/core/run-log-redact.d.ts +38 -0
- package/dist/src/core/run-log-redact.js +69 -0
- package/dist/src/core/run-log.d.ts +21 -10
- package/dist/src/core/run-log.js +76 -27
- package/dist/src/core/shared-ftl.d.ts +2 -2
- package/dist/src/core/shared-ftl.js +6 -6
- package/dist/src/core/signal-critical.d.ts +2 -2
- package/dist/src/core/signal-critical.js +4 -6
- package/dist/src/core/smoke-patterns.d.ts +5 -6
- package/dist/src/core/smoke-patterns.js +15 -20
- package/dist/src/core/state-file.d.ts +15 -4
- package/dist/src/core/state-file.js +14 -1
- package/dist/src/core/status-binary.d.ts +8 -8
- package/dist/src/core/status-binary.js +12 -12
- package/dist/src/core/status-classify.d.ts +17 -17
- package/dist/src/core/status-classify.js +13 -12
- package/dist/src/core/test-changed-prefs.d.ts +12 -12
- package/dist/src/core/test-changed-prefs.js +40 -25
- package/dist/src/core/test-harness-crash.d.ts +39 -39
- package/dist/src/core/test-harness-crash.js +69 -69
- package/dist/src/core/test-harness-output.d.ts +7 -7
- package/dist/src/core/test-harness-output.js +7 -7
- package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
- package/dist/src/core/test-harness-verdict-notes.js +4 -4
- package/dist/src/core/test-path-scope.d.ts +8 -8
- package/dist/src/core/test-path-scope.js +11 -11
- package/dist/src/core/test-stale-check.d.ts +22 -23
- package/dist/src/core/test-stale-check.js +31 -30
- package/dist/src/core/test-stale-symlink.d.ts +1 -1
- package/dist/src/core/test-stale-symlink.js +1 -1
- package/dist/src/core/test-stall-triage.d.ts +9 -9
- package/dist/src/core/test-stall-triage.js +22 -22
- package/dist/src/core/test-xpcshell-retry.d.ts +26 -7
- package/dist/src/core/test-xpcshell-retry.js +14 -11
- package/dist/src/core/token-category.d.ts +35 -2
- package/dist/src/core/token-category.js +67 -58
- package/dist/src/core/token-coverage.js +4 -5
- package/dist/src/core/token-dark-mode.d.ts +9 -9
- package/dist/src/core/token-dark-mode.js +13 -25
- package/dist/src/core/token-docs.d.ts +1 -1
- package/dist/src/core/token-inventory.d.ts +56 -0
- package/dist/src/core/token-inventory.js +109 -0
- package/dist/src/core/token-manager.d.ts +4 -4
- package/dist/src/core/token-manager.js +22 -22
- package/dist/src/core/token-scaffold.d.ts +4 -4
- package/dist/src/core/token-scaffold.js +4 -4
- package/dist/src/core/token-variant.d.ts +14 -14
- package/dist/src/core/token-variant.js +52 -53
- package/dist/src/core/toolchain-preflight.d.ts +15 -15
- package/dist/src/core/toolchain-preflight.js +23 -23
- package/dist/src/core/tree-cow.d.ts +3 -5
- package/dist/src/core/tree-cow.js +8 -8
- package/dist/src/core/tree-guard.d.ts +3 -3
- package/dist/src/core/tree-guard.js +23 -23
- package/dist/src/core/tree-store.d.ts +15 -15
- package/dist/src/core/tree-store.js +39 -38
- package/dist/src/core/typecheck-shim.d.ts +16 -15
- package/dist/src/core/typecheck-shim.js +26 -25
- package/dist/src/core/typecheck.d.ts +12 -12
- package/dist/src/core/typecheck.js +33 -33
- package/dist/src/core/wire-destroy.d.ts +2 -2
- package/dist/src/core/wire-destroy.js +5 -5
- package/dist/src/core/wire-dom-fragment.d.ts +3 -3
- package/dist/src/core/wire-dom-fragment.js +12 -23
- package/dist/src/core/wire-init.d.ts +2 -2
- package/dist/src/core/wire-init.js +7 -7
- package/dist/src/core/wire-subscript.d.ts +1 -1
- package/dist/src/core/wire-subscript.js +3 -3
- package/dist/src/core/wire-utils.d.ts +9 -9
- package/dist/src/core/wire-utils.js +16 -28
- package/dist/src/core/xpcshell-appdir.d.ts +20 -20
- package/dist/src/core/xpcshell-appdir.js +28 -30
- package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
- package/dist/src/core/xpcshell-profile-dir.js +7 -7
- package/dist/src/errors/base.d.ts +69 -16
- package/dist/src/errors/base.js +95 -26
- package/dist/src/errors/build.d.ts +6 -6
- package/dist/src/errors/build.js +26 -34
- package/dist/src/errors/codes.d.ts +10 -10
- package/dist/src/errors/codes.js +10 -10
- package/dist/src/errors/config.d.ts +0 -14
- package/dist/src/errors/config.js +13 -34
- package/dist/src/errors/download.d.ts +13 -0
- package/dist/src/errors/download.js +53 -24
- package/dist/src/errors/furnace.d.ts +2 -2
- package/dist/src/errors/furnace.js +8 -9
- package/dist/src/errors/git.d.ts +9 -9
- package/dist/src/errors/git.js +21 -31
- package/dist/src/errors/patch.d.ts +3 -3
- package/dist/src/errors/patch.js +11 -13
- package/dist/src/errors/rebase.d.ts +1 -1
- package/dist/src/errors/rebase.js +8 -8
- package/dist/src/errors/run.d.ts +1 -1
- package/dist/src/errors/run.js +1 -1
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.js +4 -4
- package/dist/src/types/commands/options.d.ts +155 -200
- package/dist/src/types/commands/patches.d.ts +19 -19
- package/dist/src/types/commands/project.d.ts +3 -3
- package/dist/src/types/config.d.ts +52 -19
- package/dist/src/types/furnace.d.ts +17 -17
- package/dist/src/types/index.d.ts +0 -1
- package/dist/src/types/json.d.ts +3 -3
- package/dist/src/types/json.js +2 -2
- package/dist/src/types/typecheck.d.ts +3 -3
- package/dist/src/utils/assert.d.ts +4 -16
- package/dist/src/utils/assert.js +7 -24
- package/dist/src/utils/build-info.d.ts +6 -6
- package/dist/src/utils/build-info.js +6 -6
- package/dist/src/utils/child-env.d.ts +7 -6
- package/dist/src/utils/child-env.js +5 -5
- package/dist/src/utils/concurrency.d.ts +2 -2
- package/dist/src/utils/concurrency.js +2 -2
- package/dist/src/utils/elapsed.js +10 -1
- package/dist/src/utils/errors.d.ts +8 -8
- package/dist/src/utils/errors.js +8 -8
- package/dist/src/utils/fs.d.ts +1 -1
- package/dist/src/utils/fs.js +15 -20
- package/dist/src/utils/hash.d.ts +12 -0
- package/dist/src/utils/hash.js +16 -0
- package/dist/src/utils/line-dispatch.d.ts +15 -0
- package/dist/src/utils/line-dispatch.js +48 -0
- package/dist/src/utils/logger.d.ts +4 -4
- package/dist/src/utils/logger.js +11 -11
- package/dist/src/utils/machine-output.js +2 -2
- package/dist/src/utils/options.d.ts +14 -20
- package/dist/src/utils/options.js +26 -27
- package/dist/src/utils/package-root.js +5 -14
- package/dist/src/utils/paths.d.ts +4 -4
- package/dist/src/utils/paths.js +4 -4
- package/dist/src/utils/platform.d.ts +0 -4
- package/dist/src/utils/process-group.d.ts +10 -9
- package/dist/src/utils/process-group.js +37 -36
- package/dist/src/utils/process.d.ts +70 -55
- package/dist/src/utils/process.js +129 -179
- package/dist/src/utils/ps-duration.d.ts +4 -4
- package/dist/src/utils/ps-duration.js +9 -9
- package/dist/src/utils/regex.d.ts +4 -4
- package/dist/src/utils/regex.js +7 -7
- package/dist/src/utils/sleep.d.ts +26 -0
- package/dist/src/utils/sleep.js +31 -0
- package/dist/src/utils/stdio-drain.d.ts +7 -7
- package/dist/src/utils/stdio-drain.js +8 -8
- package/dist/src/utils/validation.d.ts +12 -49
- package/dist/src/utils/validation.js +26 -36
- package/docs/README.md +2 -2
- package/docs/configuration.md +163 -69
- package/docs/exit-codes.md +66 -49
- package/docs/furnace.md +20 -19
- package/docs/lifecycle-invariants.md +414 -247
- package/docs/machine-output.md +58 -34
- package/docs/patch-workflow.md +48 -44
- package/docs/run-logs.md +72 -28
- package/docs/testing.md +105 -98
- package/docs/verification-trees.md +23 -22
- package/package.json +7 -6
- package/dist/src/commands/rebase.d.ts +0 -4
- package/dist/src/commands/rebase.js +0 -5
- package/dist/src/core/patch-artifact-normalize.d.ts +0 -21
- package/dist/src/core/patch-artifact-normalize.js +0 -24
- package/dist/src/core/patch-lint-reexports.d.ts +0 -7
- package/dist/src/core/patch-lint-reexports.js +0 -8
- package/dist/src/core/wire-targets.d.ts +0 -7
- package/dist/src/core/wire-targets.js +0 -8
|
@@ -2,21 +2,21 @@
|
|
|
2
2
|
* Binary-aware drift classification for patch-owned files.
|
|
3
3
|
*
|
|
4
4
|
* The text classifier compares utf-8 decoded content against
|
|
5
|
-
* `computePatchedContent`, which cannot apply `GIT binary patch` bodies
|
|
5
|
+
* `computePatchedContent`, which cannot apply `GIT binary patch` bodies, so
|
|
6
6
|
* a binary file exported into a patch classifies as `patch-owned-drift`
|
|
7
7
|
* forever, keeping the engine-clean gate permanently red with nothing
|
|
8
|
-
* actually un-durable. A `GIT binary patch` section
|
|
8
|
+
* actually un-durable. A `GIT binary patch` section does carry the ground
|
|
9
9
|
* truth: `git diff --binary` always records full blob hashes on the section's
|
|
10
10
|
* `index <old>..<new>` line. Comparing the live file's `git hash-object`
|
|
11
11
|
* against the last owning section's new-side hash settles the classification
|
|
12
12
|
* exactly. Bodies without a usable hash (hand-written diffs) classify as
|
|
13
|
-
* `binary-unsupported
|
|
13
|
+
* `binary-unsupported`: an honest "cannot compare" instead of a false "not
|
|
14
14
|
* durable".
|
|
15
15
|
*
|
|
16
|
-
* That hash is trusted
|
|
16
|
+
* That hash is trusted only when the section carries a replayable payload
|
|
17
17
|
* (`hasBinaryDelta`). A `Binary files … differ` stub carries a correct index
|
|
18
18
|
* line too, so hashing against it reports `patch-backed` for a body that
|
|
19
|
-
* cannot rebuild the file at all
|
|
19
|
+
* cannot rebuild the file at all, which is the dishonesty this module
|
|
20
20
|
* exists to avoid. Such a body is `binary-unsupported` here, and an error
|
|
21
21
|
* from the `binary-body-not-reconstructable` queue lint.
|
|
22
22
|
*
|
|
@@ -40,8 +40,8 @@ export interface BinaryClassifiedFile {
|
|
|
40
40
|
}
|
|
41
41
|
/**
|
|
42
42
|
* Classifies a single-owner file whose comparison is binary. Returns
|
|
43
|
-
* `null` when the comparison is
|
|
44
|
-
*
|
|
43
|
+
* `null` when the comparison is not binary (the live file is text and,
|
|
44
|
+
* for deletions, the owning section is text), so the caller falls
|
|
45
45
|
* through to the existing utf-8 content comparison unchanged.
|
|
46
46
|
*
|
|
47
47
|
* @param args.fileMissing - True when the porcelain status reports the
|
|
@@ -57,6 +57,6 @@ export declare function classifyBinaryOwnedFile(args: {
|
|
|
57
57
|
matchClassification: 'patch-backed' | 'furnace';
|
|
58
58
|
owner: string;
|
|
59
59
|
fileMissing?: boolean;
|
|
60
|
-
/** Batched lookup
|
|
60
|
+
/** Batched lookup. When absent, falls back to per-file manifest queries. */
|
|
61
61
|
lookup?: AffectingPatchLookup;
|
|
62
62
|
}): Promise<BinaryClassifiedFile | null>;
|
|
@@ -3,21 +3,21 @@
|
|
|
3
3
|
* Binary-aware drift classification for patch-owned files.
|
|
4
4
|
*
|
|
5
5
|
* The text classifier compares utf-8 decoded content against
|
|
6
|
-
* `computePatchedContent`, which cannot apply `GIT binary patch` bodies
|
|
6
|
+
* `computePatchedContent`, which cannot apply `GIT binary patch` bodies, so
|
|
7
7
|
* a binary file exported into a patch classifies as `patch-owned-drift`
|
|
8
8
|
* forever, keeping the engine-clean gate permanently red with nothing
|
|
9
|
-
* actually un-durable. A `GIT binary patch` section
|
|
9
|
+
* actually un-durable. A `GIT binary patch` section does carry the ground
|
|
10
10
|
* truth: `git diff --binary` always records full blob hashes on the section's
|
|
11
11
|
* `index <old>..<new>` line. Comparing the live file's `git hash-object`
|
|
12
12
|
* against the last owning section's new-side hash settles the classification
|
|
13
13
|
* exactly. Bodies without a usable hash (hand-written diffs) classify as
|
|
14
|
-
* `binary-unsupported
|
|
14
|
+
* `binary-unsupported`: an honest "cannot compare" instead of a false "not
|
|
15
15
|
* durable".
|
|
16
16
|
*
|
|
17
|
-
* That hash is trusted
|
|
17
|
+
* That hash is trusted only when the section carries a replayable payload
|
|
18
18
|
* (`hasBinaryDelta`). A `Binary files … differ` stub carries a correct index
|
|
19
19
|
* line too, so hashing against it reports `patch-backed` for a body that
|
|
20
|
-
* cannot rebuild the file at all
|
|
20
|
+
* cannot rebuild the file at all, which is the dishonesty this module
|
|
21
21
|
* exists to avoid. Such a body is `binary-unsupported` here, and an error
|
|
22
22
|
* from the `binary-body-not-reconstructable` queue lint.
|
|
23
23
|
*
|
|
@@ -35,7 +35,7 @@ import { parseDiffSections } from './patch-parse.js';
|
|
|
35
35
|
/** Finds the LAST diff section affecting `file` across the owning patches, in queue order. */
|
|
36
36
|
async function findLastAffectingSection(patchesDir, file, lookup) {
|
|
37
37
|
// The lookup shares one manifest load + memoized body reads across the
|
|
38
|
-
// whole classification batch
|
|
38
|
+
// whole classification batch. The fallback keeps single-file callers
|
|
39
39
|
// (and existing direct tests) working without a context.
|
|
40
40
|
const patches = lookup !== undefined
|
|
41
41
|
? lookup.getAffectingPatches(file)
|
|
@@ -53,8 +53,8 @@ async function findLastAffectingSection(patchesDir, file, lookup) {
|
|
|
53
53
|
}
|
|
54
54
|
/**
|
|
55
55
|
* Classifies a single-owner file whose comparison is binary. Returns
|
|
56
|
-
* `null` when the comparison is
|
|
57
|
-
*
|
|
56
|
+
* `null` when the comparison is not binary (the live file is text and,
|
|
57
|
+
* for deletions, the owning section is text), so the caller falls
|
|
58
58
|
* through to the existing utf-8 content comparison unchanged.
|
|
59
59
|
*
|
|
60
60
|
* @param args.fileMissing - True when the porcelain status reports the
|
|
@@ -68,8 +68,8 @@ export async function classifyBinaryOwnedFile(args) {
|
|
|
68
68
|
classification: 'binary-unsupported',
|
|
69
69
|
owner,
|
|
70
70
|
});
|
|
71
|
-
// Until the comparison is
|
|
72
|
-
// the existing text path (`return null`)
|
|
71
|
+
// Until the comparison is known to be binary, every failure defers to
|
|
72
|
+
// the existing text path (`return null`). Classifying a text file as
|
|
73
73
|
// `binary-unsupported` because a probe failed would hide real drift.
|
|
74
74
|
let section;
|
|
75
75
|
try {
|
|
@@ -89,12 +89,12 @@ export async function classifyBinaryOwnedFile(args) {
|
|
|
89
89
|
try {
|
|
90
90
|
if (section === undefined) {
|
|
91
91
|
// Claimed in filesAffected but no diff section touches the file.
|
|
92
|
-
// A missing file keeps the existing deletion logic
|
|
92
|
+
// A missing file keeps the existing deletion logic. A live binary
|
|
93
93
|
// has nothing recorded to compare against.
|
|
94
94
|
return fileMissing ? null : unsupported();
|
|
95
95
|
}
|
|
96
96
|
if (!section.isBinary) {
|
|
97
|
-
// Text section: deletions settle fine through the text path
|
|
97
|
+
// Text section: deletions settle fine through the text path. A
|
|
98
98
|
// live binary against a text body has no comparable recording.
|
|
99
99
|
return fileMissing ? null : unsupported();
|
|
100
100
|
}
|
|
@@ -7,34 +7,34 @@
|
|
|
7
7
|
*/
|
|
8
8
|
/**
|
|
9
9
|
* Classification buckets for engine file changes:
|
|
10
|
-
* - `patch-backed`: content matches the expected post-patch state
|
|
10
|
+
* - `patch-backed`: content matches the expected post-patch state. Normal
|
|
11
11
|
* after `fireforge import`.
|
|
12
12
|
* - `patch-owned-drift`: the file is claimed by exactly one patch, but the
|
|
13
13
|
* live engine content no longer matches that patch's expected post-apply
|
|
14
14
|
* content. This includes furnace-prefixed paths: a path can be both
|
|
15
15
|
* Furnace-managed and patch-claimed (export a deployed component, then
|
|
16
|
-
* edit the workspace source and `furnace deploy` again
|
|
17
|
-
* now has content the patch body lacks). Checking the furnace
|
|
18
|
-
* would bucket such files as `furnace` and report the stale
|
|
19
|
-
* owned.
|
|
20
|
-
* - `unmanaged`: edits not explained by any patch or tool
|
|
16
|
+
* edit the workspace source and `furnace deploy` again, and the deployed
|
|
17
|
+
* copy now has content the patch body lacks). Checking the furnace
|
|
18
|
+
* prefix first would bucket such files as `furnace` and report the stale
|
|
19
|
+
* patch as owned.
|
|
20
|
+
* - `unmanaged`: edits not explained by any patch or tool. Local drift to
|
|
21
21
|
* export or discard.
|
|
22
22
|
* - `branding`: files under tool-managed branding paths, written by
|
|
23
23
|
* FireForge's branding pipeline.
|
|
24
24
|
* - `furnace`: files under Furnace-managed component prefixes. When exactly
|
|
25
25
|
* one patch also claims the path, this bucket asserts the live content
|
|
26
|
-
* matches that patch's expected post-apply content
|
|
26
|
+
* matches that patch's expected post-apply content. A mismatch is
|
|
27
27
|
* reported as `patch-owned-drift` instead (see above).
|
|
28
28
|
* - `conflict`: the file is claimed by two or more patches in
|
|
29
29
|
* `patches.json`. The human `--ownership` mode surfaces this bucket as
|
|
30
|
-
* `CONFLICT
|
|
30
|
+
* `CONFLICT`. Carrying the classification through the JSON pipeline lets
|
|
31
31
|
* machine consumers detect the same ownership breakage rather than seeing
|
|
32
32
|
* it rolled into `unmanaged` as routine local drift.
|
|
33
33
|
* - `binary-unsupported`: the file's comparison is binary and the owning
|
|
34
|
-
* patch body records no usable blob hash to compare against
|
|
35
|
-
* "binary
|
|
36
|
-
* `patch-owned-drift`.
|
|
37
|
-
*
|
|
34
|
+
* patch body records no usable blob hash to compare against. It reports an
|
|
35
|
+
* honest "binary, comparison unsupported" instead of a permanent false
|
|
36
|
+
* `patch-owned-drift`. Not in the default `--check` fail set. Opt in
|
|
37
|
+
* with `--fail-on binary-unsupported`.
|
|
38
38
|
*/
|
|
39
39
|
export type FileClassification = 'patch-backed' | 'patch-owned-drift' | 'unmanaged' | 'branding' | 'furnace' | 'conflict' | 'binary-unsupported';
|
|
40
40
|
export interface StatusFile {
|
|
@@ -45,7 +45,7 @@ export interface ClassifiedFile extends StatusFile {
|
|
|
45
45
|
classification: FileClassification;
|
|
46
46
|
/**
|
|
47
47
|
* Names of patch files that claim this path in `patches.json`.
|
|
48
|
-
* Populated only when `classification === 'conflict'
|
|
48
|
+
* Populated only when `classification === 'conflict'`. Single-claim
|
|
49
49
|
* patch-backed entries don't need to expose their owner because the
|
|
50
50
|
* single claim is fully captured by the classification itself.
|
|
51
51
|
*/
|
|
@@ -54,14 +54,14 @@ export interface ClassifiedFile extends StatusFile {
|
|
|
54
54
|
* Owning patch filename when exactly one patch claims this path
|
|
55
55
|
* (patch-backed, patch-owned-drift, and single-owner furnace entries).
|
|
56
56
|
* Unset for unowned, branding-generated, unowned-furnace, and conflict
|
|
57
|
-
* entries
|
|
57
|
+
* entries. Conflicts carry `claimedBy` instead. Exposed through
|
|
58
58
|
* `status --json` as the `patch` field.
|
|
59
59
|
*/
|
|
60
60
|
owner?: string;
|
|
61
61
|
}
|
|
62
62
|
/**
|
|
63
63
|
* Builds the file → owning-patch-filenames multimap from manifest rows.
|
|
64
|
-
* Single source of truth for cross-patch claim detection
|
|
64
|
+
* Single source of truth for cross-patch claim detection: status
|
|
65
65
|
* classification, verify's cross-claim check, and the ownership table all
|
|
66
66
|
* consume this builder (they used to each rebuild it, one drift away from
|
|
67
67
|
* disagreeing about what "claimed" means).
|
|
@@ -72,14 +72,14 @@ export declare function buildPatchClaims(manifestPatches: ReadonlyArray<{
|
|
|
72
72
|
}>): Map<string, string[]>;
|
|
73
73
|
/**
|
|
74
74
|
* Reduces a two-character porcelain XY status to its primary code.
|
|
75
|
-
* Single source of truth
|
|
75
|
+
* Single source of truth, and status-output.ts renders from the same logic.
|
|
76
76
|
*/
|
|
77
77
|
export declare function getPrimaryStatusCode(status: string): string;
|
|
78
78
|
/**
|
|
79
79
|
* True for the branding paths whose content FireForge generates itself
|
|
80
80
|
* (configure.sh, brand.properties/ftl, browser/moz.configure). Unlike the
|
|
81
81
|
* broader branding-root test, a brand-new unowned file under the branding
|
|
82
|
-
* directory is
|
|
82
|
+
* directory is not generated: it is a patch candidate and must stay
|
|
83
83
|
* visible as unmanaged (the Assets.car precedent).
|
|
84
84
|
*/
|
|
85
85
|
export declare function isGeneratedBrandingPath(file: string, binaryName: string): boolean;
|
|
@@ -11,12 +11,13 @@ import { mapWithConcurrency } from '../utils/concurrency.js';
|
|
|
11
11
|
import { toError } from '../utils/errors.js';
|
|
12
12
|
import { readText } from '../utils/fs.js';
|
|
13
13
|
import { verbose } from '../utils/logger.js';
|
|
14
|
+
import { normalizePathSlashes } from '../utils/paths.js';
|
|
14
15
|
import { isBrandingManagedPath } from './branding.js';
|
|
15
16
|
import { createPatchedContentContext } from './patch-apply.js';
|
|
16
17
|
import { classifyBinaryOwnedFile } from './status-binary.js';
|
|
17
18
|
/**
|
|
18
19
|
* Builds the file → owning-patch-filenames multimap from manifest rows.
|
|
19
|
-
* Single source of truth for cross-patch claim detection
|
|
20
|
+
* Single source of truth for cross-patch claim detection: status
|
|
20
21
|
* classification, verify's cross-claim check, and the ownership table all
|
|
21
22
|
* consume this builder (they used to each rebuild it, one drift away from
|
|
22
23
|
* disagreeing about what "claimed" means).
|
|
@@ -34,7 +35,7 @@ export function buildPatchClaims(manifestPatches) {
|
|
|
34
35
|
}
|
|
35
36
|
/**
|
|
36
37
|
* Reduces a two-character porcelain XY status to its primary code.
|
|
37
|
-
* Single source of truth
|
|
38
|
+
* Single source of truth, and status-output.ts renders from the same logic.
|
|
38
39
|
*/
|
|
39
40
|
export function getPrimaryStatusCode(status) {
|
|
40
41
|
if (status.includes('?'))
|
|
@@ -52,11 +53,11 @@ export function getPrimaryStatusCode(status) {
|
|
|
52
53
|
* True for the branding paths whose content FireForge generates itself
|
|
53
54
|
* (configure.sh, brand.properties/ftl, browser/moz.configure). Unlike the
|
|
54
55
|
* broader branding-root test, a brand-new unowned file under the branding
|
|
55
|
-
* directory is
|
|
56
|
+
* directory is not generated: it is a patch candidate and must stay
|
|
56
57
|
* visible as unmanaged (the Assets.car precedent).
|
|
57
58
|
*/
|
|
58
59
|
export function isGeneratedBrandingPath(file, binaryName) {
|
|
59
|
-
const normalized = file
|
|
60
|
+
const normalized = normalizePathSlashes(file);
|
|
60
61
|
const brandingRoot = `browser/branding/${binaryName}`;
|
|
61
62
|
return (normalized === 'browser/moz.configure' ||
|
|
62
63
|
normalized === `${brandingRoot}/configure.sh` ||
|
|
@@ -66,15 +67,15 @@ export function isGeneratedBrandingPath(file, binaryName) {
|
|
|
66
67
|
/**
|
|
67
68
|
* Compares a single-owner file's live engine content against its owning
|
|
68
69
|
* patch's expected post-apply content. `matchClassification` is what a
|
|
69
|
-
* clean match reports
|
|
70
|
+
* clean match reports: `patch-backed` for ordinary patch-claimed paths,
|
|
70
71
|
* `furnace` for furnace-prefixed paths so healthy deployed components
|
|
71
72
|
* keep landing in the pinned furnace bucket. Any mismatch (including a
|
|
72
73
|
* deletion the patch does not expect, or a failed comparison) reports
|
|
73
74
|
* `patch-owned-drift`.
|
|
74
75
|
*/
|
|
75
76
|
async function classifySingleOwnerFile(entry, engineDir, patchesDir, matchClassification, owner, ctx) {
|
|
76
|
-
// Binary comparisons cannot go through the utf-8 content path below
|
|
77
|
-
//
|
|
77
|
+
// Binary comparisons cannot go through the utf-8 content path below.
|
|
78
|
+
// Binary patch bodies parse to zero hunks, so the patched-content
|
|
78
79
|
// computation returned HEAD content unchanged and the comparison
|
|
79
80
|
// reported `patch-owned-drift` forever. Settle by blob hash,
|
|
80
81
|
// or classify explicitly as `binary-unsupported` when no hash exists.
|
|
@@ -99,7 +100,7 @@ async function classifySingleOwnerFile(entry, engineDir, patchesDir, matchClassi
|
|
|
99
100
|
owner,
|
|
100
101
|
};
|
|
101
102
|
}
|
|
102
|
-
// File exists on disk
|
|
103
|
+
// File exists on disk: compare actual vs expected
|
|
103
104
|
try {
|
|
104
105
|
const [expected, actual] = await Promise.all([
|
|
105
106
|
ctx.computePatched(entry.file),
|
|
@@ -129,7 +130,7 @@ async function classifySingleOwnerFile(entry, engineDir, patchesDir, matchClassi
|
|
|
129
130
|
*/
|
|
130
131
|
export async function classifyFiles(files, engineDir, patchesDir, binaryName, furnacePrefixes) {
|
|
131
132
|
// One manifest load + patch discovery + memoized body reads for the
|
|
132
|
-
// whole batch
|
|
133
|
+
// whole batch. The previous per-file computation re-ran all three for
|
|
133
134
|
// every dirty file (O(dirtyFiles × patches) redundant IO on a broad
|
|
134
135
|
// engine edit session).
|
|
135
136
|
const ctx = await createPatchedContentContext(patchesDir, engineDir);
|
|
@@ -149,14 +150,14 @@ export async function classifyFiles(files, engineDir, patchesDir, binaryName, fu
|
|
|
149
150
|
ctx,
|
|
150
151
|
};
|
|
151
152
|
// Bounded pool over per-file classification (each single-owner file
|
|
152
|
-
// spawns git)
|
|
153
|
+
// spawns git). Order preserved by the mapper. Per-file failures settle
|
|
153
154
|
// inside classifySingleOwnerFile's catch, so one bad file never rejects
|
|
154
155
|
// the batch.
|
|
155
156
|
return mapWithConcurrency(files, CLASSIFY_CONCURRENCY, (entry) => classifyEntry(entry, deps));
|
|
156
157
|
}
|
|
157
158
|
/** Concurrency bound for per-file classification (matches import's guard). */
|
|
158
159
|
const CLASSIFY_CONCURRENCY = 8;
|
|
159
|
-
/** Classifies one status entry
|
|
160
|
+
/** Classifies one status entry. Extracted so the pool worker stays flat. */
|
|
160
161
|
async function classifyEntry(entry, deps) {
|
|
161
162
|
const { engineDir, patchesDir, binaryName, furnacePrefixes, patchClaims, ctx } = deps;
|
|
162
163
|
const owners = patchClaims.get(entry.file);
|
|
@@ -208,7 +209,7 @@ async function classifyEntry(entry, deps) {
|
|
|
208
209
|
if (!owners) {
|
|
209
210
|
return { ...entry, classification: 'unmanaged' };
|
|
210
211
|
}
|
|
211
|
-
// File is claimed by exactly one patch
|
|
212
|
+
// File is claimed by exactly one patch: compare content.
|
|
212
213
|
const owner = owners[0];
|
|
213
214
|
if (owner === undefined) {
|
|
214
215
|
return { ...entry, classification: 'unmanaged' };
|
|
@@ -1,26 +1,26 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Recognizer for the one mochitest failure shape that is a function of run
|
|
3
|
-
*
|
|
3
|
+
* length rather than of the code under test: the time-driven
|
|
4
4
|
* changed-preference checks.
|
|
5
5
|
*
|
|
6
6
|
* Separate from `test-harness-crash.ts` because it is not a crash
|
|
7
|
-
* classification
|
|
8
|
-
* What this adds is which
|
|
7
|
+
* classification. The run failed, and the classifier's verdict is correct.
|
|
8
|
+
* What this adds is which kind of failure it was, which is a different
|
|
9
9
|
* question and one that only grows as more such shapes are recorded.
|
|
10
10
|
*/
|
|
11
11
|
/**
|
|
12
|
-
* Describes a failure set that consists
|
|
12
|
+
* Describes a failure set that consists entirely of changed-preference
|
|
13
13
|
* checks on {@link TIME_DRIVEN_PREF_NAMES}.
|
|
14
14
|
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
17
|
-
*
|
|
18
|
-
* shape. A single block that names anything else
|
|
19
|
-
* different pref
|
|
20
|
-
*
|
|
21
|
-
*
|
|
15
|
+
* Keyed on the pref names rather than on the harness's phrasing of its
|
|
16
|
+
* changed-preference report: the phrasing is upstream copy that has no
|
|
17
|
+
* stable contract with us, and the names are the part that identifies the
|
|
18
|
+
* shape. A single block that names anything else (a real assertion, a
|
|
19
|
+
* different pref) disqualifies the whole set, so that this describes a run
|
|
20
|
+
* whose every failure is this noise, and never explains away one real
|
|
21
|
+
* failure sitting beside it.
|
|
22
22
|
*
|
|
23
|
-
* Pure
|
|
23
|
+
* Pure. Returns undefined when the shape does not apply.
|
|
24
24
|
*
|
|
25
25
|
* @param output - Combined harness stdout+stderr
|
|
26
26
|
* @returns Operator-facing explanation, or undefined
|
|
@@ -1,23 +1,23 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
/**
|
|
3
3
|
* Recognizer for the one mochitest failure shape that is a function of run
|
|
4
|
-
*
|
|
4
|
+
* length rather than of the code under test: the time-driven
|
|
5
5
|
* changed-preference checks.
|
|
6
6
|
*
|
|
7
7
|
* Separate from `test-harness-crash.ts` because it is not a crash
|
|
8
|
-
* classification
|
|
9
|
-
* What this adds is which
|
|
8
|
+
* classification. The run failed, and the classifier's verdict is correct.
|
|
9
|
+
* What this adds is which kind of failure it was, which is a different
|
|
10
10
|
* question and one that only grows as more such shapes are recorded.
|
|
11
11
|
*/
|
|
12
12
|
import { collectUnexpectedFailureBlocks } from './test-harness-crash.js';
|
|
13
13
|
/**
|
|
14
|
-
* Preferences that move on their own as a function of how
|
|
14
|
+
* Preferences that move on their own as a function of how long a run takes,
|
|
15
15
|
* not of what it tested.
|
|
16
16
|
*
|
|
17
17
|
* Both are time-driven: a long run crosses the cold-startup check interval
|
|
18
18
|
* and the pref moves under the harness. The observable consequence is that
|
|
19
19
|
* chunk length, not the change under test, decides whether the suite is
|
|
20
|
-
* red
|
|
20
|
+
* red. The same work at a smaller `--chunk` passes. FireForge cannot
|
|
21
21
|
* suppress the check (it is the harness's, not ours) but it can stop the
|
|
22
22
|
* pair being indistinguishable from two real assertion failures, which is
|
|
23
23
|
* the whole cost of the shape.
|
|
@@ -29,23 +29,47 @@ const TIME_DRIVEN_PREF_NAMES = ['lastColdStartupCheck', 'globalprivacycontrol'];
|
|
|
29
29
|
/** A failure block that is a changed-preference report rather than an assertion. */
|
|
30
30
|
const CHANGED_PREF_BLOCK_PATTERN = /pref(?:erence)?s?\b/i;
|
|
31
31
|
/**
|
|
32
|
-
* Describes a failure set that consists
|
|
32
|
+
* Describes a failure set that consists entirely of changed-preference
|
|
33
33
|
* checks on {@link TIME_DRIVEN_PREF_NAMES}.
|
|
34
34
|
*
|
|
35
|
-
*
|
|
36
|
-
*
|
|
37
|
-
*
|
|
38
|
-
* shape. A single block that names anything else
|
|
39
|
-
* different pref
|
|
40
|
-
*
|
|
41
|
-
*
|
|
35
|
+
* Keyed on the pref names rather than on the harness's phrasing of its
|
|
36
|
+
* changed-preference report: the phrasing is upstream copy that has no
|
|
37
|
+
* stable contract with us, and the names are the part that identifies the
|
|
38
|
+
* shape. A single block that names anything else (a real assertion, a
|
|
39
|
+
* different pref) disqualifies the whole set, so that this describes a run
|
|
40
|
+
* whose every failure is this noise, and never explains away one real
|
|
41
|
+
* failure sitting beside it.
|
|
42
42
|
*
|
|
43
|
-
* Pure
|
|
43
|
+
* Pure. Returns undefined when the shape does not apply.
|
|
44
44
|
*
|
|
45
45
|
* @param output - Combined harness stdout+stderr
|
|
46
46
|
* @returns Operator-facing explanation, or undefined
|
|
47
47
|
*/
|
|
48
48
|
export function describeChangedPrefNoise(output) {
|
|
49
|
+
const namesSeen = matchedTimeDrivenPrefNames(output);
|
|
50
|
+
if (namesSeen === undefined)
|
|
51
|
+
return undefined;
|
|
52
|
+
return (`Every unexpected result in this run is a changed-preference check on ${[...namesSeen].join(' / ')}. ` +
|
|
53
|
+
'Those preferences are TIME-DRIVEN: they move once a run is long enough to cross the ' +
|
|
54
|
+
'cold-startup check interval, so they correlate with run LENGTH rather than with the ' +
|
|
55
|
+
'change under test or with the build. The first probe is to halve the chunk size ' +
|
|
56
|
+
'(`--chunk 8` where a 40-row chunk tripped it) and see whether the same work passes; ' +
|
|
57
|
+
'if it does, this was harness noise, not a regression. FireForge cannot forgive the ' +
|
|
58
|
+
'check — it belongs to the harness — only tell you which kind of failure you are ' +
|
|
59
|
+
'looking at.');
|
|
60
|
+
}
|
|
61
|
+
/** Failure blocks inspected before the changed-pref shape is abandoned. */
|
|
62
|
+
const CHANGED_PREF_BLOCK_LIMIT = 20;
|
|
63
|
+
/**
|
|
64
|
+
* The recognizer half of the shape, split from the formatting so a caller
|
|
65
|
+
* that only needs the yes/no answer does not build the ~500-character
|
|
66
|
+
* explanation to throw it away.
|
|
67
|
+
*
|
|
68
|
+
* @param output - Combined harness stdout+stderr
|
|
69
|
+
* @returns The time-driven pref names seen, or undefined when the shape does
|
|
70
|
+
* not apply
|
|
71
|
+
*/
|
|
72
|
+
function matchedTimeDrivenPrefNames(output) {
|
|
49
73
|
const blocks = collectUnexpectedFailureBlocks(output, CHANGED_PREF_BLOCK_LIMIT).filter((block) => !block.startsWith('…'));
|
|
50
74
|
if (blocks.length === 0)
|
|
51
75
|
return undefined;
|
|
@@ -59,20 +83,11 @@ export function describeChangedPrefNoise(output) {
|
|
|
59
83
|
for (const name of matched)
|
|
60
84
|
namesSeen.add(name);
|
|
61
85
|
}
|
|
62
|
-
return
|
|
63
|
-
'Those preferences are TIME-DRIVEN: they move once a run is long enough to cross the ' +
|
|
64
|
-
'cold-startup check interval, so they correlate with run LENGTH rather than with the ' +
|
|
65
|
-
'change under test or with the build. The first probe is to halve the chunk size ' +
|
|
66
|
-
'(`--chunk 8` where a 40-row chunk tripped it) and see whether the same work passes; ' +
|
|
67
|
-
'if it does, this was harness noise, not a regression. FireForge cannot forgive the ' +
|
|
68
|
-
'check — it belongs to the harness — only tell you which kind of failure you are ' +
|
|
69
|
-
'looking at.');
|
|
86
|
+
return namesSeen;
|
|
70
87
|
}
|
|
71
|
-
/** Failure blocks inspected before the changed-pref shape is abandoned. */
|
|
72
|
-
const CHANGED_PREF_BLOCK_LIMIT = 20;
|
|
73
88
|
/** Short verdict-line note for the changed-preference-noise shape. */
|
|
74
89
|
export function changedPrefNoiseVerdictNote(output) {
|
|
75
|
-
return
|
|
90
|
+
return matchedTimeDrivenPrefNames(output) === undefined
|
|
76
91
|
? undefined
|
|
77
92
|
: 'all unexpected results are time-driven changed-pref checks';
|
|
78
93
|
}
|