@hominis/fireforge 0.46.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 +381 -498
- package/dist/bin/fireforge.d.ts +1 -1
- package/dist/bin/fireforge.js +17 -17
- package/dist/build-info.json +4 -4
- package/dist/src/cli-usage-error.d.ts +9 -9
- package/dist/src/cli-usage-error.js +12 -12
- package/dist/src/cli.d.ts +3 -2
- package/dist/src/cli.js +29 -28
- package/dist/src/commands/bootstrap-checks.js +2 -1
- package/dist/src/commands/bootstrap.js +2 -2
- package/dist/src/commands/build.js +12 -11
- package/dist/src/commands/config.js +9 -9
- package/dist/src/commands/destructive-decision.d.ts +4 -4
- package/dist/src/commands/destructive-decision.js +4 -4
- package/dist/src/commands/discard.js +5 -5
- package/dist/src/commands/doctor-check-core.d.ts +4 -4
- package/dist/src/commands/doctor-external-toolchains.js +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.d.ts +2 -2
- package/dist/src/commands/doctor-furnace-config-sync.js +20 -20
- package/dist/src/commands/doctor-furnace-jar.d.ts +1 -1
- package/dist/src/commands/doctor-furnace-jar.js +1 -1
- package/dist/src/commands/doctor-furnace.js +22 -22
- package/dist/src/commands/doctor-orphaned-harness.d.ts +10 -11
- package/dist/src/commands/doctor-orphaned-harness.js +10 -11
- package/dist/src/commands/doctor-patch-manifest.d.ts +2 -1
- package/dist/src/commands/doctor-patch-manifest.js +7 -6
- package/dist/src/commands/doctor-post-rebase-audit.js +2 -2
- package/dist/src/commands/doctor-source-pin.d.ts +12 -12
- package/dist/src/commands/doctor-source-pin.js +14 -14
- package/dist/src/commands/doctor-working-tree.d.ts +3 -3
- package/dist/src/commands/doctor-working-tree.js +3 -3
- package/dist/src/commands/doctor.d.ts +2 -2
- package/dist/src/commands/doctor.js +9 -9
- package/dist/src/commands/download.js +15 -13
- package/dist/src/commands/export-all.js +8 -8
- package/dist/src/commands/export-flow.d.ts +5 -5
- package/dist/src/commands/export-flow.js +14 -14
- package/dist/src/commands/export-placement-conflicts.d.ts +3 -3
- package/dist/src/commands/export-placement-conflicts.js +9 -9
- package/dist/src/commands/export-placement-gate.d.ts +2 -2
- package/dist/src/commands/export-placement-gate.js +5 -5
- package/dist/src/commands/export-placement-policy.d.ts +1 -1
- package/dist/src/commands/export-placement-policy.js +1 -1
- package/dist/src/commands/export-shared.d.ts +10 -10
- package/dist/src/commands/export-shared.js +13 -13
- package/dist/src/commands/export.js +4 -4
- package/dist/src/commands/furnace/apply.js +16 -16
- package/dist/src/commands/furnace/chrome-doc-remove.d.ts +1 -1
- package/dist/src/commands/furnace/chrome-doc-remove.js +1 -1
- package/dist/src/commands/furnace/chrome-doc-templates.d.ts +14 -14
- package/dist/src/commands/furnace/chrome-doc-templates.js +17 -17
- package/dist/src/commands/furnace/chrome-doc-tests.d.ts +2 -2
- package/dist/src/commands/furnace/chrome-doc-tests.js +4 -4
- package/dist/src/commands/furnace/chrome-doc.d.ts +8 -8
- package/dist/src/commands/furnace/chrome-doc.js +18 -18
- package/dist/src/commands/furnace/create-browser-test.d.ts +1 -1
- package/dist/src/commands/furnace/create-browser-test.js +4 -4
- package/dist/src/commands/furnace/create-dry-run.d.ts +4 -4
- package/dist/src/commands/furnace/create-dry-run.js +4 -4
- package/dist/src/commands/furnace/create-features.d.ts +2 -2
- package/dist/src/commands/furnace/create-features.js +2 -2
- package/dist/src/commands/furnace/create-mochikit.d.ts +4 -4
- package/dist/src/commands/furnace/create-mochikit.js +7 -7
- package/dist/src/commands/furnace/create-templates.d.ts +14 -14
- package/dist/src/commands/furnace/create-templates.js +18 -18
- package/dist/src/commands/furnace/create-xpcshell.d.ts +5 -5
- package/dist/src/commands/furnace/create-xpcshell.js +8 -8
- package/dist/src/commands/furnace/create.d.ts +1 -1
- package/dist/src/commands/furnace/create.js +10 -10
- package/dist/src/commands/furnace/deploy.js +4 -4
- package/dist/src/commands/furnace/diff.js +7 -7
- package/dist/src/commands/furnace/index.js +1 -1
- package/dist/src/commands/furnace/init.js +15 -15
- package/dist/src/commands/furnace/list.js +2 -2
- package/dist/src/commands/furnace/override.d.ts +1 -1
- package/dist/src/commands/furnace/override.js +15 -15
- package/dist/src/commands/furnace/preview.js +17 -17
- package/dist/src/commands/furnace/refresh.js +6 -6
- package/dist/src/commands/furnace/remove-mutations.d.ts +3 -3
- package/dist/src/commands/furnace/remove-mutations.js +19 -18
- package/dist/src/commands/furnace/remove-state.d.ts +1 -1
- package/dist/src/commands/furnace/remove-state.js +1 -1
- package/dist/src/commands/furnace/remove.js +2 -2
- package/dist/src/commands/furnace/rename-browser-test.js +9 -8
- package/dist/src/commands/furnace/rename-xpcshell.d.ts +2 -2
- package/dist/src/commands/furnace/rename-xpcshell.js +3 -3
- package/dist/src/commands/furnace/rename.js +9 -9
- package/dist/src/commands/furnace/scan.js +3 -3
- package/dist/src/commands/furnace/status.js +7 -7
- package/dist/src/commands/furnace/sync.js +6 -6
- package/dist/src/commands/furnace/test-file-name.d.ts +2 -2
- package/dist/src/commands/furnace/test-file-name.js +2 -2
- package/dist/src/commands/furnace/validate.js +11 -12
- package/dist/src/commands/import.js +20 -20
- package/dist/src/commands/lint-per-patch.js +8 -8
- package/dist/src/commands/lint-per-run-checkjs.d.ts +12 -13
- package/dist/src/commands/lint-per-run-checkjs.js +14 -15
- package/dist/src/commands/lint-report.d.ts +3 -3
- package/dist/src/commands/lint-report.js +4 -4
- package/dist/src/commands/lint.d.ts +3 -3
- package/dist/src/commands/lint.js +35 -35
- package/dist/src/commands/manifest.d.ts +4 -4
- package/dist/src/commands/package.js +2 -2
- package/dist/src/commands/patch/compact.d.ts +2 -2
- package/dist/src/commands/patch/compact.js +8 -8
- package/dist/src/commands/patch/delete.d.ts +1 -1
- package/dist/src/commands/patch/delete.js +8 -8
- package/dist/src/commands/patch/lint-ignore.d.ts +3 -4
- package/dist/src/commands/patch/lint-ignore.js +14 -15
- package/dist/src/commands/patch/move-files-create.d.ts +2 -2
- package/dist/src/commands/patch/move-files-create.js +5 -5
- package/dist/src/commands/patch/move-files-into.d.ts +2 -2
- package/dist/src/commands/patch/move-files-into.js +3 -3
- package/dist/src/commands/patch/move-files.js +1 -1
- package/dist/src/commands/patch/patch-context.d.ts +1 -1
- package/dist/src/commands/patch/rename.d.ts +4 -4
- package/dist/src/commands/patch/rename.js +8 -8
- package/dist/src/commands/patch/reorder.js +10 -10
- package/dist/src/commands/patch/split-plan.d.ts +3 -3
- package/dist/src/commands/patch/split-plan.js +6 -5
- package/dist/src/commands/patch/split.d.ts +2 -2
- package/dist/src/commands/patch/split.js +5 -5
- package/dist/src/commands/patch/staged-dependency-validate.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency-validate.js +3 -3
- package/dist/src/commands/patch/staged-dependency.d.ts +1 -1
- package/dist/src/commands/patch/staged-dependency.js +6 -6
- package/dist/src/commands/patch/tier.d.ts +2 -2
- package/dist/src/commands/patch/tier.js +5 -5
- package/dist/src/commands/patch-rename-map.d.ts +1 -1
- package/dist/src/commands/patch-rename-map.js +1 -1
- package/dist/src/commands/pending-resolution.d.ts +5 -5
- package/dist/src/commands/pending-resolution.js +5 -5
- package/dist/src/commands/re-export-adjacent.d.ts +3 -3
- package/dist/src/commands/re-export-adjacent.js +8 -8
- package/dist/src/commands/re-export-bulk-scan.d.ts +3 -3
- package/dist/src/commands/re-export-bulk-scan.js +17 -17
- package/dist/src/commands/re-export-drift.d.ts +10 -10
- package/dist/src/commands/re-export-drift.js +29 -29
- package/dist/src/commands/re-export-files.js +14 -15
- package/dist/src/commands/re-export-lint.d.ts +26 -26
- package/dist/src/commands/re-export-lint.js +27 -27
- package/dist/src/commands/re-export-options.d.ts +1 -1
- package/dist/src/commands/re-export-options.js +1 -1
- package/dist/src/commands/re-export-register.d.ts +1 -1
- package/dist/src/commands/re-export-register.js +1 -1
- package/dist/src/commands/re-export-scan.d.ts +1 -1
- package/dist/src/commands/re-export-scan.js +7 -7
- package/dist/src/commands/re-export-single.d.ts +1 -1
- package/dist/src/commands/re-export-single.js +20 -20
- package/dist/src/commands/re-export.js +7 -6
- package/dist/src/commands/rebase/abort.js +6 -6
- package/dist/src/commands/rebase/continue.js +8 -7
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +3 -3
- package/dist/src/commands/rebase/patch-loop.js +18 -17
- package/dist/src/commands/register.js +5 -5
- package/dist/src/commands/reset.js +1 -1
- package/dist/src/commands/resolve.d.ts +2 -2
- package/dist/src/commands/resolve.js +3 -3
- package/dist/src/commands/run.js +26 -26
- package/dist/src/commands/setup-support.js +4 -4
- package/dist/src/commands/setup.js +1 -1
- package/dist/src/commands/source.js +1 -1
- package/dist/src/commands/status-check.d.ts +3 -3
- package/dist/src/commands/status-check.js +4 -4
- package/dist/src/commands/status-json.d.ts +14 -13
- package/dist/src/commands/status-json.js +9 -8
- package/dist/src/commands/status-output.d.ts +3 -3
- package/dist/src/commands/status-output.js +3 -3
- package/dist/src/commands/status-ownership.d.ts +3 -3
- package/dist/src/commands/status-ownership.js +3 -3
- package/dist/src/commands/status.js +22 -22
- package/dist/src/commands/test-build-phase.d.ts +1 -1
- package/dist/src/commands/test-build-phase.js +17 -17
- package/dist/src/commands/test-diagnose.d.ts +1 -1
- package/dist/src/commands/test-diagnose.js +20 -20
- package/dist/src/commands/test-modes.d.ts +2 -2
- package/dist/src/commands/test-modes.js +4 -4
- package/dist/src/commands/test-run.d.ts +11 -11
- package/dist/src/commands/test-run.js +15 -15
- package/dist/src/commands/test-stale-gate.d.ts +12 -12
- package/dist/src/commands/test-stale-gate.js +13 -13
- package/dist/src/commands/test-verdict.d.ts +6 -6
- package/dist/src/commands/test-verdict.js +11 -11
- package/dist/src/commands/test.d.ts +3 -3
- package/dist/src/commands/test.js +36 -36
- package/dist/src/commands/token-coverage.js +3 -3
- package/dist/src/commands/token-list.js +5 -5
- package/dist/src/commands/token.js +9 -9
- package/dist/src/commands/tree.js +19 -19
- package/dist/src/commands/typecheck.d.ts +6 -6
- package/dist/src/commands/typecheck.js +7 -7
- package/dist/src/commands/verify.d.ts +3 -3
- package/dist/src/commands/verify.js +10 -10
- package/dist/src/commands/watch.js +11 -11
- package/dist/src/commands/wire.js +13 -13
- package/dist/src/core/ast-utils.d.ts +7 -7
- package/dist/src/core/ast-utils.js +8 -8
- package/dist/src/core/branding.d.ts +5 -5
- package/dist/src/core/branding.js +3 -3
- package/dist/src/core/browser-wire.d.ts +1 -1
- package/dist/src/core/browser-wire.js +4 -4
- package/dist/src/core/build-audit-platform.d.ts +6 -6
- package/dist/src/core/build-audit-platform.js +26 -26
- package/dist/src/core/build-audit-registration.d.ts +5 -5
- package/dist/src/core/build-audit-registration.js +7 -7
- package/dist/src/core/build-audit-resolve.d.ts +5 -5
- package/dist/src/core/build-audit-resolve.js +6 -6
- package/dist/src/core/build-audit-skip.d.ts +8 -8
- package/dist/src/core/build-audit-skip.js +12 -12
- package/dist/src/core/build-audit-transforms.d.ts +2 -2
- package/dist/src/core/build-audit-transforms.js +3 -3
- package/dist/src/core/build-audit.d.ts +8 -8
- package/dist/src/core/build-audit.js +39 -37
- package/dist/src/core/build-baseline-types.d.ts +19 -18
- package/dist/src/core/build-baseline-types.js +1 -1
- package/dist/src/core/build-baseline.d.ts +8 -8
- package/dist/src/core/build-baseline.js +14 -14
- package/dist/src/core/build-jar-escalation.d.ts +8 -8
- package/dist/src/core/build-jar-escalation.js +15 -15
- package/dist/src/core/build-overwrite-guard.d.ts +4 -4
- package/dist/src/core/build-overwrite-guard.js +13 -13
- package/dist/src/core/build-prepare.d.ts +4 -4
- package/dist/src/core/build-prepare.js +16 -15
- package/dist/src/core/config-mutate.js +4 -4
- package/dist/src/core/config-state.js +2 -2
- package/dist/src/core/config-validate-build-audit.js +3 -3
- package/dist/src/core/config-validate-file-size.d.ts +1 -1
- package/dist/src/core/config-validate-file-size.js +2 -2
- package/dist/src/core/config-validate.js +8 -9
- package/dist/src/core/config.d.ts +10 -10
- package/dist/src/core/config.js +10 -10
- package/dist/src/core/coverage-extend.d.ts +16 -16
- package/dist/src/core/coverage-extend.js +16 -16
- package/dist/src/core/destructive.d.ts +14 -14
- package/dist/src/core/destructive.js +9 -9
- package/dist/src/core/diff-hunks.d.ts +2 -2
- package/dist/src/core/diff-hunks.js +7 -7
- package/dist/src/core/discard-baseline.d.ts +10 -10
- package/dist/src/core/discard-baseline.js +15 -16
- package/dist/src/core/display-state.d.ts +11 -11
- package/dist/src/core/display-state.js +12 -12
- package/dist/src/core/engine-changes.d.ts +2 -2
- package/dist/src/core/engine-changes.js +2 -2
- package/dist/src/core/engine-precondition.d.ts +4 -4
- package/dist/src/core/engine-precondition.js +2 -2
- package/dist/src/core/engine-session-lock.d.ts +18 -18
- package/dist/src/core/engine-session-lock.js +37 -37
- package/dist/src/core/export-moved-code-shape.d.ts +7 -7
- package/dist/src/core/export-moved-code-shape.js +8 -8
- package/dist/src/core/file-lock-owner.d.ts +11 -11
- package/dist/src/core/file-lock-owner.js +18 -18
- package/dist/src/core/file-lock.d.ts +12 -12
- package/dist/src/core/file-lock.js +52 -39
- package/dist/src/core/firefox-cache.d.ts +1 -1
- package/dist/src/core/firefox-cache.js +10 -10
- package/dist/src/core/firefox-download.d.ts +3 -3
- package/dist/src/core/firefox-download.js +6 -6
- package/dist/src/core/firefox-extract.d.ts +2 -2
- package/dist/src/core/firefox-extract.js +13 -13
- package/dist/src/core/firefox.d.ts +5 -5
- package/dist/src/core/firefox.js +8 -8
- package/dist/src/core/furnace-apply-dry-run.js +1 -1
- package/dist/src/core/furnace-apply-ftl.d.ts +5 -5
- package/dist/src/core/furnace-apply-ftl.js +8 -8
- package/dist/src/core/furnace-apply-helpers.d.ts +9 -9
- package/dist/src/core/furnace-apply-helpers.js +21 -21
- package/dist/src/core/furnace-apply-output.js +1 -1
- package/dist/src/core/furnace-apply-overwrite-warn.d.ts +9 -9
- package/dist/src/core/furnace-apply-overwrite-warn.js +9 -9
- package/dist/src/core/furnace-apply-undeploy-actions.d.ts +1 -1
- package/dist/src/core/furnace-apply-undeploy-actions.js +1 -1
- package/dist/src/core/furnace-apply.d.ts +3 -3
- package/dist/src/core/furnace-apply.js +22 -21
- package/dist/src/core/furnace-checksum-utils.d.ts +5 -5
- package/dist/src/core/furnace-checksum-utils.js +5 -5
- package/dist/src/core/furnace-config-custom.d.ts +1 -1
- package/dist/src/core/furnace-config-custom.js +2 -2
- package/dist/src/core/furnace-config-order.js +1 -1
- package/dist/src/core/furnace-config-tokens.d.ts +3 -3
- package/dist/src/core/furnace-config-tokens.js +3 -3
- package/dist/src/core/furnace-config-validate.js +2 -2
- package/dist/src/core/furnace-config.d.ts +4 -4
- package/dist/src/core/furnace-config.js +18 -18
- package/dist/src/core/furnace-constants.d.ts +6 -6
- package/dist/src/core/furnace-constants.js +6 -6
- package/dist/src/core/furnace-css-fragments.d.ts +6 -6
- package/dist/src/core/furnace-css-fragments.js +11 -11
- package/dist/src/core/furnace-dir-entry.d.ts +1 -1
- package/dist/src/core/furnace-dir-entry.js +1 -1
- package/dist/src/core/furnace-jsconfig.d.ts +7 -7
- package/dist/src/core/furnace-jsconfig.js +22 -20
- package/dist/src/core/furnace-operation.d.ts +21 -20
- package/dist/src/core/furnace-operation.js +36 -34
- package/dist/src/core/furnace-precondition.d.ts +10 -10
- package/dist/src/core/furnace-precondition.js +8 -8
- package/dist/src/core/furnace-refresh.js +2 -2
- package/dist/src/core/furnace-registration-ast.d.ts +2 -2
- package/dist/src/core/furnace-registration-ast.js +9 -9
- package/dist/src/core/furnace-registration-remove.d.ts +4 -4
- package/dist/src/core/furnace-registration-remove.js +6 -6
- package/dist/src/core/furnace-registration-validate.d.ts +2 -2
- package/dist/src/core/furnace-registration-validate.js +2 -2
- package/dist/src/core/furnace-registration.d.ts +5 -5
- package/dist/src/core/furnace-registration.js +7 -7
- package/dist/src/core/furnace-rollback.d.ts +1 -1
- package/dist/src/core/furnace-rollback.js +5 -5
- package/dist/src/core/furnace-stale-export.d.ts +17 -16
- package/dist/src/core/furnace-stale-export.js +16 -15
- package/dist/src/core/furnace-staleness.d.ts +2 -2
- package/dist/src/core/furnace-staleness.js +2 -2
- package/dist/src/core/furnace-state-persist.d.ts +10 -10
- package/dist/src/core/furnace-state-persist.js +10 -10
- package/dist/src/core/furnace-step-errors.d.ts +6 -6
- package/dist/src/core/furnace-step-errors.js +6 -6
- package/dist/src/core/furnace-validate-accessibility.js +14 -14
- package/dist/src/core/furnace-validate-compatibility.js +9 -9
- package/dist/src/core/furnace-validate-registration.d.ts +2 -2
- package/dist/src/core/furnace-validate-registration.js +13 -13
- package/dist/src/core/furnace-validate-structure.d.ts +1 -1
- package/dist/src/core/furnace-validate-structure.js +4 -4
- package/dist/src/core/furnace-validate.js +9 -9
- package/dist/src/core/furnace-version-drift.d.ts +5 -5
- package/dist/src/core/furnace-version-drift.js +5 -5
- package/dist/src/core/git-base.d.ts +4 -4
- package/dist/src/core/git-base.js +9 -9
- package/dist/src/core/git-diff-new-file.d.ts +4 -4
- package/dist/src/core/git-diff-new-file.js +8 -8
- package/dist/src/core/git-diff.d.ts +4 -4
- package/dist/src/core/git-diff.js +35 -34
- package/dist/src/core/git-file-ops.d.ts +6 -6
- package/dist/src/core/git-file-ops.js +7 -7
- package/dist/src/core/git-readonly-index.d.ts +12 -12
- package/dist/src/core/git-readonly-index.js +12 -12
- package/dist/src/core/git-status.d.ts +4 -4
- package/dist/src/core/git-status.js +4 -4
- package/dist/src/core/git.d.ts +3 -3
- package/dist/src/core/git.js +14 -14
- package/dist/src/core/harness-orphans.d.ts +17 -17
- package/dist/src/core/harness-orphans.js +20 -20
- package/dist/src/core/history-log.d.ts +3 -3
- package/dist/src/core/history-log.js +3 -3
- package/dist/src/core/license-headers.d.ts +19 -18
- package/dist/src/core/license-headers.js +29 -28
- package/dist/src/core/mach-build-artifacts.d.ts +21 -21
- package/dist/src/core/mach-build-artifacts.js +23 -23
- package/dist/src/core/mach-error-hints.d.ts +5 -5
- package/dist/src/core/mach-error-hints.js +13 -13
- package/dist/src/core/mach-known-noise-filter.d.ts +41 -38
- package/dist/src/core/mach-known-noise-filter.js +53 -50
- package/dist/src/core/mach-mozconfig.d.ts +6 -6
- package/dist/src/core/mach-mozconfig.js +15 -15
- package/dist/src/core/mach-python.d.ts +2 -1
- package/dist/src/core/mach-python.js +4 -3
- package/dist/src/core/mach-resource-shim.d.ts +12 -12
- package/dist/src/core/mach-resource-shim.js +20 -20
- package/dist/src/core/mach.d.ts +23 -23
- package/dist/src/core/mach.js +36 -36
- package/dist/src/core/marionette-port.d.ts +15 -13
- package/dist/src/core/marionette-port.js +34 -31
- package/dist/src/core/marionette-preflight.d.ts +6 -6
- package/dist/src/core/marionette-preflight.js +23 -23
- package/dist/src/core/markdown-table.d.ts +9 -9
- package/dist/src/core/markdown-table.js +14 -14
- package/dist/src/core/mochitest-server-port.d.ts +8 -8
- package/dist/src/core/mochitest-server-port.js +14 -14
- package/dist/src/core/module-resolution-preflight.d.ts +8 -8
- package/dist/src/core/module-resolution-preflight.js +11 -11
- package/dist/src/core/moz-manifest-helpers.d.ts +7 -7
- package/dist/src/core/moz-manifest-helpers.js +7 -7
- package/dist/src/core/moz-manifest-register.d.ts +1 -1
- package/dist/src/core/moz-manifest-register.js +2 -2
- package/dist/src/core/moz-manifest-rules.js +11 -11
- package/dist/src/core/moz-manifest-tokenizers.js +1 -1
- package/dist/src/core/ownership-table.d.ts +5 -5
- package/dist/src/core/ownership-table.js +7 -7
- package/dist/src/core/parser-fallback.d.ts +3 -3
- package/dist/src/core/parser-fallback.js +3 -3
- package/dist/src/core/patch-apply-fuzz.d.ts +5 -5
- package/dist/src/core/patch-apply-fuzz.js +9 -9
- package/dist/src/core/patch-apply.d.ts +9 -9
- package/dist/src/core/patch-apply.js +30 -30
- package/dist/src/core/patch-export-update.d.ts +4 -4
- package/dist/src/core/patch-export-update.js +3 -3
- package/dist/src/core/patch-export.d.ts +10 -10
- package/dist/src/core/patch-export.js +13 -13
- package/dist/src/core/patch-identifier-suggest.d.ts +1 -1
- package/dist/src/core/patch-identifier-suggest.js +4 -4
- package/dist/src/core/patch-lint-binary.d.ts +7 -7
- package/dist/src/core/patch-lint-cache.d.ts +2 -2
- package/dist/src/core/patch-lint-cache.js +13 -13
- package/dist/src/core/patch-lint-checkjs.d.ts +26 -26
- package/dist/src/core/patch-lint-checkjs.js +42 -41
- package/dist/src/core/patch-lint-chrome-jsdoc.d.ts +8 -9
- package/dist/src/core/patch-lint-chrome-jsdoc.js +10 -11
- package/dist/src/core/patch-lint-creators.d.ts +3 -3
- package/dist/src/core/patch-lint-creators.js +3 -3
- package/dist/src/core/patch-lint-cross.d.ts +13 -13
- package/dist/src/core/patch-lint-cross.js +21 -21
- package/dist/src/core/patch-lint-css.d.ts +1 -1
- package/dist/src/core/patch-lint-css.js +5 -5
- package/dist/src/core/patch-lint-diff-tag.d.ts +5 -5
- package/dist/src/core/patch-lint-diff-tag.js +5 -5
- package/dist/src/core/patch-lint-diff.d.ts +4 -4
- package/dist/src/core/patch-lint-diff.js +4 -4
- package/dist/src/core/patch-lint-file-size.d.ts +3 -3
- package/dist/src/core/patch-lint-file-size.js +3 -3
- package/dist/src/core/patch-lint-forward-registration.d.ts +4 -4
- package/dist/src/core/patch-lint-forward-registration.js +12 -12
- package/dist/src/core/patch-lint-jsdoc.d.ts +2 -2
- package/dist/src/core/patch-lint-jsdoc.js +11 -11
- package/dist/src/core/patch-lint-module-registration.d.ts +1 -1
- package/dist/src/core/patch-lint-module-registration.js +1 -1
- package/dist/src/core/patch-lint-mozbuild.d.ts +1 -1
- package/dist/src/core/patch-lint-mozbuild.js +10 -10
- package/dist/src/core/patch-lint-observer.d.ts +3 -3
- package/dist/src/core/patch-lint-observer.js +7 -7
- package/dist/src/core/patch-lint-ownership.d.ts +6 -6
- package/dist/src/core/patch-lint-ownership.js +6 -6
- package/dist/src/core/patch-lint-prettier.d.ts +6 -6
- package/dist/src/core/patch-lint-prettier.js +6 -6
- package/dist/src/core/patch-lint-queue-types.d.ts +1 -1
- package/dist/src/core/patch-lint-queue-types.js +1 -1
- package/dist/src/core/patch-lint-staged-registration.d.ts +2 -2
- package/dist/src/core/patch-lint-staged-registration.js +6 -6
- package/dist/src/core/patch-lint-unmanaged-companion.d.ts +23 -23
- package/dist/src/core/patch-lint-unmanaged-companion.js +26 -26
- package/dist/src/core/patch-lint.d.ts +27 -26
- package/dist/src/core/patch-lint.js +48 -46
- package/dist/src/core/patch-lock.d.ts +1 -1
- package/dist/src/core/patch-lock.js +8 -8
- package/dist/src/core/patch-manifest-consistency.d.ts +7 -7
- package/dist/src/core/patch-manifest-consistency.js +16 -17
- package/dist/src/core/patch-manifest-files-affected.d.ts +1 -1
- package/dist/src/core/patch-manifest-files-affected.js +3 -3
- package/dist/src/core/patch-manifest-io.d.ts +14 -14
- package/dist/src/core/patch-manifest-io.js +27 -27
- package/dist/src/core/patch-manifest-query.d.ts +1 -1
- package/dist/src/core/patch-manifest-query.js +4 -4
- package/dist/src/core/patch-manifest-resolve.d.ts +5 -5
- package/dist/src/core/patch-manifest-resolve.js +7 -7
- package/dist/src/core/patch-manifest-validate.js +3 -3
- package/dist/src/core/patch-manifest.d.ts +2 -2
- package/dist/src/core/patch-manifest.js +2 -2
- package/dist/src/core/patch-parse.d.ts +14 -14
- package/dist/src/core/patch-parse.js +16 -16
- package/dist/src/core/patch-registration-refs.d.ts +4 -4
- package/dist/src/core/patch-registration-refs.js +7 -7
- package/dist/src/core/patch-transform.d.ts +8 -8
- package/dist/src/core/patch-transform.js +13 -13
- package/dist/src/core/process-cpu-time.d.ts +1 -1
- package/dist/src/core/process-cpu-time.js +5 -5
- package/dist/src/core/rebase-session.d.ts +7 -7
- package/dist/src/core/rebase-session.js +8 -8
- package/dist/src/core/register-result.d.ts +1 -1
- package/dist/src/core/register-result.js +1 -1
- package/dist/src/core/register-scaffold.d.ts +2 -2
- package/dist/src/core/register-scaffold.js +3 -3
- package/dist/src/core/register-shared-css.d.ts +3 -3
- package/dist/src/core/register-shared-css.js +4 -4
- package/dist/src/core/register-xpcshell-test.d.ts +2 -2
- package/dist/src/core/register-xpcshell-test.js +2 -2
- package/dist/src/core/run-log-redact.d.ts +12 -12
- package/dist/src/core/run-log-redact.js +16 -16
- package/dist/src/core/run-log.d.ts +9 -9
- package/dist/src/core/run-log.js +14 -14
- package/dist/src/core/shared-ftl.d.ts +2 -2
- package/dist/src/core/shared-ftl.js +6 -6
- package/dist/src/core/signal-critical.d.ts +2 -2
- package/dist/src/core/signal-critical.js +2 -2
- package/dist/src/core/smoke-patterns.d.ts +5 -5
- package/dist/src/core/smoke-patterns.js +9 -9
- package/dist/src/core/state-file.d.ts +3 -3
- package/dist/src/core/status-binary.d.ts +8 -8
- package/dist/src/core/status-binary.js +12 -12
- package/dist/src/core/status-classify.d.ts +17 -17
- package/dist/src/core/status-classify.js +11 -11
- package/dist/src/core/test-changed-prefs.d.ts +12 -12
- package/dist/src/core/test-changed-prefs.js +15 -15
- package/dist/src/core/test-harness-crash.d.ts +39 -39
- package/dist/src/core/test-harness-crash.js +67 -67
- package/dist/src/core/test-harness-output.d.ts +7 -7
- package/dist/src/core/test-harness-output.js +7 -7
- package/dist/src/core/test-harness-verdict-notes.d.ts +13 -14
- package/dist/src/core/test-harness-verdict-notes.js +4 -4
- package/dist/src/core/test-path-scope.d.ts +8 -8
- package/dist/src/core/test-path-scope.js +11 -11
- package/dist/src/core/test-stale-check.d.ts +22 -21
- package/dist/src/core/test-stale-check.js +29 -28
- package/dist/src/core/test-stale-symlink.d.ts +1 -1
- package/dist/src/core/test-stale-symlink.js +1 -1
- package/dist/src/core/test-stall-triage.d.ts +9 -9
- package/dist/src/core/test-stall-triage.js +22 -22
- package/dist/src/core/token-category.d.ts +4 -4
- package/dist/src/core/token-category.js +13 -12
- package/dist/src/core/token-coverage.js +4 -5
- package/dist/src/core/token-dark-mode.d.ts +9 -9
- package/dist/src/core/token-dark-mode.js +11 -11
- package/dist/src/core/token-docs.d.ts +1 -1
- package/dist/src/core/token-inventory.d.ts +6 -6
- package/dist/src/core/token-inventory.js +7 -7
- package/dist/src/core/token-manager.d.ts +3 -3
- package/dist/src/core/token-manager.js +21 -21
- package/dist/src/core/token-scaffold.d.ts +4 -4
- package/dist/src/core/token-scaffold.js +4 -4
- package/dist/src/core/token-variant.d.ts +14 -14
- package/dist/src/core/token-variant.js +32 -32
- package/dist/src/core/toolchain-preflight.d.ts +15 -15
- package/dist/src/core/toolchain-preflight.js +22 -22
- package/dist/src/core/tree-cow.d.ts +3 -3
- package/dist/src/core/tree-cow.js +6 -6
- package/dist/src/core/tree-guard.d.ts +3 -3
- package/dist/src/core/tree-guard.js +23 -23
- package/dist/src/core/tree-store.d.ts +15 -15
- package/dist/src/core/tree-store.js +35 -33
- package/dist/src/core/typecheck-shim.d.ts +16 -15
- package/dist/src/core/typecheck-shim.js +26 -25
- package/dist/src/core/typecheck.d.ts +12 -12
- package/dist/src/core/typecheck.js +31 -31
- package/dist/src/core/wire-destroy.d.ts +2 -2
- package/dist/src/core/wire-destroy.js +5 -5
- package/dist/src/core/wire-dom-fragment.d.ts +3 -3
- package/dist/src/core/wire-dom-fragment.js +6 -6
- package/dist/src/core/wire-init.d.ts +2 -2
- package/dist/src/core/wire-init.js +7 -7
- package/dist/src/core/wire-subscript.d.ts +1 -1
- package/dist/src/core/wire-subscript.js +3 -3
- package/dist/src/core/wire-utils.d.ts +9 -9
- package/dist/src/core/wire-utils.js +11 -11
- package/dist/src/core/xpcshell-appdir.d.ts +20 -20
- package/dist/src/core/xpcshell-appdir.js +26 -26
- package/dist/src/core/xpcshell-profile-dir.d.ts +3 -3
- package/dist/src/core/xpcshell-profile-dir.js +7 -7
- package/dist/src/errors/base.d.ts +22 -21
- package/dist/src/errors/base.js +22 -21
- package/dist/src/errors/build.d.ts +6 -6
- package/dist/src/errors/build.js +6 -6
- package/dist/src/errors/codes.d.ts +10 -10
- package/dist/src/errors/codes.js +10 -10
- package/dist/src/errors/furnace.d.ts +2 -2
- package/dist/src/errors/git.d.ts +1 -1
- package/dist/src/errors/git.js +1 -1
- package/dist/src/errors/patch.d.ts +3 -3
- package/dist/src/errors/patch.js +3 -3
- package/dist/src/errors/rebase.d.ts +1 -1
- package/dist/src/errors/rebase.js +1 -1
- package/dist/src/errors/run.d.ts +1 -1
- package/dist/src/errors/run.js +1 -1
- package/dist/src/index.d.ts +4 -4
- package/dist/src/index.js +4 -4
- package/dist/src/types/commands/options.d.ts +86 -85
- package/dist/src/types/commands/patches.d.ts +19 -19
- package/dist/src/types/commands/project.d.ts +3 -3
- package/dist/src/types/config.d.ts +24 -23
- package/dist/src/types/furnace.d.ts +17 -17
- package/dist/src/types/json.d.ts +3 -3
- package/dist/src/types/json.js +2 -2
- package/dist/src/types/typecheck.d.ts +3 -3
- package/dist/src/utils/assert.d.ts +1 -1
- package/dist/src/utils/assert.js +6 -6
- package/dist/src/utils/build-info.d.ts +5 -5
- package/dist/src/utils/build-info.js +6 -6
- package/dist/src/utils/child-env.d.ts +5 -5
- package/dist/src/utils/child-env.js +5 -5
- package/dist/src/utils/concurrency.d.ts +2 -2
- package/dist/src/utils/concurrency.js +2 -2
- package/dist/src/utils/elapsed.js +1 -1
- package/dist/src/utils/errors.d.ts +8 -8
- package/dist/src/utils/errors.js +8 -8
- package/dist/src/utils/fs.d.ts +1 -1
- package/dist/src/utils/fs.js +8 -8
- package/dist/src/utils/line-dispatch.d.ts +3 -3
- package/dist/src/utils/line-dispatch.js +5 -5
- package/dist/src/utils/logger.d.ts +4 -4
- package/dist/src/utils/logger.js +11 -11
- package/dist/src/utils/machine-output.js +2 -2
- package/dist/src/utils/options.d.ts +13 -13
- package/dist/src/utils/options.js +20 -20
- package/dist/src/utils/package-root.js +2 -2
- package/dist/src/utils/paths.d.ts +4 -4
- package/dist/src/utils/paths.js +4 -4
- package/dist/src/utils/process-group.d.ts +8 -8
- package/dist/src/utils/process-group.js +19 -19
- package/dist/src/utils/process.d.ts +34 -33
- package/dist/src/utils/process.js +20 -19
- package/dist/src/utils/ps-duration.d.ts +4 -4
- package/dist/src/utils/ps-duration.js +6 -6
- package/dist/src/utils/regex.d.ts +4 -4
- package/dist/src/utils/regex.js +7 -7
- package/dist/src/utils/sleep.d.ts +7 -7
- package/dist/src/utils/sleep.js +7 -7
- package/dist/src/utils/stdio-drain.d.ts +7 -7
- package/dist/src/utils/stdio-drain.js +8 -8
- package/dist/src/utils/validation.d.ts +11 -12
- package/dist/src/utils/validation.js +20 -21
- package/docs/README.md +2 -2
- package/docs/configuration.md +120 -114
- package/docs/exit-codes.md +63 -58
- package/docs/furnace.md +20 -19
- package/docs/lifecycle-invariants.md +412 -251
- package/docs/machine-output.md +33 -32
- package/docs/patch-workflow.md +48 -45
- package/docs/run-logs.md +62 -58
- package/docs/testing.md +101 -101
- package/docs/verification-trees.md +23 -22
- package/package.json +2 -2
|
@@ -2,8 +2,8 @@
|
|
|
2
2
|
* xpcshell test-file registration. Without it, xpcshell test files (e.g.
|
|
3
3
|
* `<module-dir>/test/unit/test_*.js`) are rejected by `fireforge register`
|
|
4
4
|
* as "Unknown file pattern". This writer inserts the `["test_*.js"]` section
|
|
5
|
-
* into the directory's `xpcshell.toml` (alphabetically, idempotently)
|
|
6
|
-
*
|
|
5
|
+
* into the directory's `xpcshell.toml` (alphabetically, idempotently). With
|
|
6
|
+
* `--create-manifest` it also creates the manifest and wires
|
|
7
7
|
* `XPCSHELL_TESTS_MANIFESTS` into the nearest moz.build.
|
|
8
8
|
*/
|
|
9
9
|
import type { RegisterResult } from './register-result.js';
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
* xpcshell test-file registration. Without it, xpcshell test files (e.g.
|
|
4
4
|
* `<module-dir>/test/unit/test_*.js`) are rejected by `fireforge register`
|
|
5
5
|
* as "Unknown file pattern". This writer inserts the `["test_*.js"]` section
|
|
6
|
-
* into the directory's `xpcshell.toml` (alphabetically, idempotently)
|
|
7
|
-
*
|
|
6
|
+
* into the directory's `xpcshell.toml` (alphabetically, idempotently). With
|
|
7
|
+
* `--create-manifest` it also creates the manifest and wires
|
|
8
8
|
* `XPCSHELL_TESTS_MANIFESTS` into the nearest moz.build.
|
|
9
9
|
*/
|
|
10
10
|
import { join } from 'node:path';
|
|
@@ -4,31 +4,31 @@
|
|
|
4
4
|
* A run log is a complete copy of mach's output, and mach echoes its
|
|
5
5
|
* environment in places (configure summaries, `mach env`, harness
|
|
6
6
|
* diagnostics that print the command line). The terminal already showed
|
|
7
|
-
* every byte to the operator who ran it
|
|
7
|
+
* every byte to the operator who ran it. The file, by contrast, is retained
|
|
8
8
|
* twenty deep and gets attached to bug reports. So the file gets a narrow
|
|
9
9
|
* masking pass and the terminal does not.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
11
|
+
* Minimal and pattern-based. See {@link redactRunLogText} for the exact
|
|
12
|
+
* contract. It is a seatbelt against the common accidental leak, not a
|
|
13
|
+
* guarantee that a log is free of secrets.
|
|
14
14
|
*/
|
|
15
15
|
/**
|
|
16
16
|
* Masks the obvious secret shapes in run-log text, line by line.
|
|
17
17
|
*
|
|
18
18
|
* Redacted:
|
|
19
19
|
* - the value of an env-style assignment `KEY=value` whose KEY matches
|
|
20
|
-
* `/(TOKEN|SECRET|PASSWORD|PASSWD|API_KEY|AUTH)/i
|
|
21
|
-
* next whitespace, or a whole quoted string
|
|
22
|
-
*
|
|
23
|
-
* covered (`--password=x` → `--password=<redacted>`)
|
|
20
|
+
* `/(TOKEN|SECRET|PASSWORD|PASSWD|API_KEY|AUTH)/i`. The value up to the
|
|
21
|
+
* next whitespace, or a whole quoted string, becomes `KEY=<redacted>`.
|
|
22
|
+
* The `--flag=value` and `-DNAME=value` spellings of the same shape are
|
|
23
|
+
* covered (`--password=x` → `--password=<redacted>`).
|
|
24
24
|
* - the credential of an `Authorization:` header (`Bearer`, `Basic` and
|
|
25
|
-
* `Token` schemes keep the scheme word
|
|
26
|
-
* value).
|
|
25
|
+
* `Token` schemes keep the scheme word, and anything else masks the
|
|
26
|
+
* whole value).
|
|
27
27
|
*
|
|
28
|
-
*
|
|
28
|
+
* Not redacted: secrets that appear without one of those key names or
|
|
29
29
|
* headers (a bare token in a URL query string, a space-separated
|
|
30
30
|
* `--password foo` CLI argument, JSON `"token": "..."` fields, cookies).
|
|
31
|
-
* Line structure and every other byte pass through unchanged
|
|
31
|
+
* Line structure and every other byte pass through unchanged. `\n`, `\r\n`
|
|
32
32
|
* and lone `\r` all delimit lines, so carriage-return-repainted progress
|
|
33
33
|
* output is masked per repaint.
|
|
34
34
|
*
|
|
@@ -5,13 +5,13 @@
|
|
|
5
5
|
* A run log is a complete copy of mach's output, and mach echoes its
|
|
6
6
|
* environment in places (configure summaries, `mach env`, harness
|
|
7
7
|
* diagnostics that print the command line). The terminal already showed
|
|
8
|
-
* every byte to the operator who ran it
|
|
8
|
+
* every byte to the operator who ran it. The file, by contrast, is retained
|
|
9
9
|
* twenty deep and gets attached to bug reports. So the file gets a narrow
|
|
10
10
|
* masking pass and the terminal does not.
|
|
11
11
|
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
12
|
+
* Minimal and pattern-based. See {@link redactRunLogText} for the exact
|
|
13
|
+
* contract. It is a seatbelt against the common accidental leak, not a
|
|
14
|
+
* guarantee that a log is free of secrets.
|
|
15
15
|
*/
|
|
16
16
|
/** Env-style keys whose assigned value is masked. */
|
|
17
17
|
const SECRET_KEY_PATTERN = /(TOKEN|SECRET|PASSWORD|PASSWD|API_KEY|AUTH)/i;
|
|
@@ -21,8 +21,8 @@ const SECRET_KEY_PATTERN = /(TOKEN|SECRET|PASSWORD|PASSWD|API_KEY|AUTH)/i;
|
|
|
21
21
|
* the assignment anchored at a token boundary so `x.y=z` is not split
|
|
22
22
|
* mid-token. A hyphen IS a boundary: mach and configure echo their argv, so
|
|
23
23
|
* `--token=…`, `--password=…` and `-DAUTH_TOKEN=…` are exactly the forms a
|
|
24
|
-
* retained log would otherwise carry verbatim (the lead keeps the dash
|
|
25
|
-
* key is what follows it). Empty values are left alone (nothing to hide).
|
|
24
|
+
* retained log would otherwise carry verbatim (the lead keeps the dash, and
|
|
25
|
+
* the key is what follows it). Empty values are left alone (nothing to hide).
|
|
26
26
|
*/
|
|
27
27
|
const ENV_ASSIGNMENT_PATTERN = /(^|[\s"'([{,;-])([A-Za-z_][A-Za-z0-9_]*)=("(?:[^"\\]|\\.)*"|'[^']*'|[^\s"',;)\]}]+)/g;
|
|
28
28
|
/** `Authorization: <scheme> <credential>` (scheme optional) in HTTP dumps. */
|
|
@@ -39,18 +39,18 @@ function redactLine(line) {
|
|
|
39
39
|
*
|
|
40
40
|
* Redacted:
|
|
41
41
|
* - the value of an env-style assignment `KEY=value` whose KEY matches
|
|
42
|
-
* `/(TOKEN|SECRET|PASSWORD|PASSWD|API_KEY|AUTH)/i
|
|
43
|
-
* next whitespace, or a whole quoted string
|
|
44
|
-
*
|
|
45
|
-
* covered (`--password=x` → `--password=<redacted>`)
|
|
42
|
+
* `/(TOKEN|SECRET|PASSWORD|PASSWD|API_KEY|AUTH)/i`. The value up to the
|
|
43
|
+
* next whitespace, or a whole quoted string, becomes `KEY=<redacted>`.
|
|
44
|
+
* The `--flag=value` and `-DNAME=value` spellings of the same shape are
|
|
45
|
+
* covered (`--password=x` → `--password=<redacted>`).
|
|
46
46
|
* - the credential of an `Authorization:` header (`Bearer`, `Basic` and
|
|
47
|
-
* `Token` schemes keep the scheme word
|
|
48
|
-
* value).
|
|
47
|
+
* `Token` schemes keep the scheme word, and anything else masks the
|
|
48
|
+
* whole value).
|
|
49
49
|
*
|
|
50
|
-
*
|
|
50
|
+
* Not redacted: secrets that appear without one of those key names or
|
|
51
51
|
* headers (a bare token in a URL query string, a space-separated
|
|
52
52
|
* `--password foo` CLI argument, JSON `"token": "..."` fields, cookies).
|
|
53
|
-
* Line structure and every other byte pass through unchanged
|
|
53
|
+
* Line structure and every other byte pass through unchanged. `\n`, `\r\n`
|
|
54
54
|
* and lone `\r` all delimit lines, so carriage-return-repainted progress
|
|
55
55
|
* output is masked per repaint.
|
|
56
56
|
*
|
|
@@ -60,8 +60,8 @@ function redactLine(line) {
|
|
|
60
60
|
export function redactRunLogText(text) {
|
|
61
61
|
if (text.length === 0)
|
|
62
62
|
return text;
|
|
63
|
-
// Split with a capturing group so the terminators survive the round trip
|
|
64
|
-
//
|
|
63
|
+
// Split with a capturing group so the terminators survive the round trip.
|
|
64
|
+
// Odd indices are the terminators themselves.
|
|
65
65
|
return text
|
|
66
66
|
.split(/(\r\n|\n|\r)/)
|
|
67
67
|
.map((part, index) => (index % 2 === 0 ? redactLine(part) : part))
|
|
@@ -2,19 +2,19 @@
|
|
|
2
2
|
* Per-run output logs under `.fireforge/logs/`.
|
|
3
3
|
*
|
|
4
4
|
* A run's diagnosis used to exist in exactly one place: the terminal. Piping
|
|
5
|
-
* through `tail`/`grep
|
|
6
|
-
* the summary and discards the `TEST-UNEXPECTED-FAIL` lines that say
|
|
5
|
+
* through `tail`/`grep`, the ergonomic default when output is long, keeps
|
|
6
|
+
* the summary and discards the `TEST-UNEXPECTED-FAIL` lines that say what
|
|
7
7
|
* broke, and it launders the exit code besides. The operator rule ("never
|
|
8
8
|
* pipe a run") was written down three times downstream and broken after each
|
|
9
|
-
* writing,
|
|
10
|
-
*
|
|
9
|
+
* writing, so this is not an operator problem: the tool is the only party
|
|
10
|
+
* that can make the log survive the mistake.
|
|
11
11
|
*
|
|
12
12
|
* So `test` and `build` write their own complete copy as they stream, and the
|
|
13
13
|
* `FIREFORGE-VERDICT:` line names the path. A piped, truncated, or
|
|
14
14
|
* backgrounded run then still leaves a re-readable artifact.
|
|
15
15
|
*
|
|
16
|
-
* Everything here is
|
|
17
|
-
*
|
|
16
|
+
* Everything here is best-effort. A log is a diagnostic aid, and a run must
|
|
17
|
+
* never fail because one could not be opened, written, or pruned.
|
|
18
18
|
* Every entry point swallows its errors and degrades to "no log", which is
|
|
19
19
|
* exactly the behaviour that existed before this module.
|
|
20
20
|
*/
|
|
@@ -24,7 +24,7 @@ export interface RunLog {
|
|
|
24
24
|
path: string;
|
|
25
25
|
/**
|
|
26
26
|
* Appends output. Complete lines pass through {@link redactRunLogText}
|
|
27
|
-
* before hitting disk
|
|
27
|
+
* before hitting disk. A trailing partial line is held until its newline
|
|
28
28
|
* arrives (or until `close`). Silently drops on any stream error.
|
|
29
29
|
*/
|
|
30
30
|
write: (chunk: string) => void;
|
|
@@ -59,10 +59,10 @@ export declare function writeToActiveRunLog(chunk: string): void;
|
|
|
59
59
|
*/
|
|
60
60
|
export declare function closeActiveRunLog(): Promise<void>;
|
|
61
61
|
/**
|
|
62
|
-
* A writable that forwards to `base`
|
|
62
|
+
* A writable that forwards to `base` and to the active run log.
|
|
63
63
|
*
|
|
64
64
|
* Used by the stdio-inheriting capture path, whose collectors take a mirror
|
|
65
|
-
* stream rather than per-chunk callbacks
|
|
65
|
+
* stream rather than per-chunk callbacks, so the tee reuses the mirror the
|
|
66
66
|
* exec layer already supports instead of growing a second hook.
|
|
67
67
|
*
|
|
68
68
|
* @param base - The stream to forward to (normally `process.stdout`)
|
package/dist/src/core/run-log.js
CHANGED
|
@@ -3,19 +3,19 @@
|
|
|
3
3
|
* Per-run output logs under `.fireforge/logs/`.
|
|
4
4
|
*
|
|
5
5
|
* A run's diagnosis used to exist in exactly one place: the terminal. Piping
|
|
6
|
-
* through `tail`/`grep
|
|
7
|
-
* the summary and discards the `TEST-UNEXPECTED-FAIL` lines that say
|
|
6
|
+
* through `tail`/`grep`, the ergonomic default when output is long, keeps
|
|
7
|
+
* the summary and discards the `TEST-UNEXPECTED-FAIL` lines that say what
|
|
8
8
|
* broke, and it launders the exit code besides. The operator rule ("never
|
|
9
9
|
* pipe a run") was written down three times downstream and broken after each
|
|
10
|
-
* writing,
|
|
11
|
-
*
|
|
10
|
+
* writing, so this is not an operator problem: the tool is the only party
|
|
11
|
+
* that can make the log survive the mistake.
|
|
12
12
|
*
|
|
13
13
|
* So `test` and `build` write their own complete copy as they stream, and the
|
|
14
14
|
* `FIREFORGE-VERDICT:` line names the path. A piped, truncated, or
|
|
15
15
|
* backgrounded run then still leaves a re-readable artifact.
|
|
16
16
|
*
|
|
17
|
-
* Everything here is
|
|
18
|
-
*
|
|
17
|
+
* Everything here is best-effort. A log is a diagnostic aid, and a run must
|
|
18
|
+
* never fail because one could not be opened, written, or pruned.
|
|
19
19
|
* Every entry point swallows its errors and degrades to "no log", which is
|
|
20
20
|
* exactly the behaviour that existed before this module.
|
|
21
21
|
*/
|
|
@@ -39,19 +39,19 @@ const RETAINED_LOGS_PER_COMMAND = 20;
|
|
|
39
39
|
/**
|
|
40
40
|
* Cap on the partial line held back between writes. A child emitting one
|
|
41
41
|
* enormous unterminated line (a minified dump on stderr) would otherwise
|
|
42
|
-
* grow the buffer without bound
|
|
43
|
-
* `pending + chunk`, quadratically
|
|
44
|
-
* close. Past the cap the tail is redacted and written as-is
|
|
42
|
+
* grow the buffer without bound (and, because each write rebuilds
|
|
43
|
+
* `pending + chunk`, quadratically), with nothing reaching disk until
|
|
44
|
+
* close. Past the cap the tail is redacted and written as-is. A `KEY=value`
|
|
45
45
|
* split exactly at the cap boundary is the accepted cost. Same figure as
|
|
46
46
|
* `line-dispatch.ts` uses for the stream matchers.
|
|
47
47
|
*/
|
|
48
48
|
const MAX_PENDING_LINE_SIZE = 1024 * 1024;
|
|
49
49
|
/**
|
|
50
50
|
* Index just past the last line terminator in `text`, or -1 when there is
|
|
51
|
-
* none. `\n` and lone `\r` both terminate
|
|
51
|
+
* none. `\n` and lone `\r` both terminate: progress-bar output (mach,
|
|
52
52
|
* cargo) repaints a line with carriage returns and may never send a
|
|
53
53
|
* newline, which would otherwise pin the whole run in `pending`. A single
|
|
54
|
-
* trailing `\r` is
|
|
54
|
+
* trailing `\r` is not a terminator yet: it may be the first half of a
|
|
55
55
|
* `\r\n` split across chunks.
|
|
56
56
|
*/
|
|
57
57
|
function lastLineEnd(text) {
|
|
@@ -67,7 +67,7 @@ export function getRunLogDir(projectRoot) {
|
|
|
67
67
|
/**
|
|
68
68
|
* Makes room for one new log by deleting the oldest, so that at most
|
|
69
69
|
* {@link RETAINED_LOGS_PER_COMMAND} logs for `command` exist once the new
|
|
70
|
-
* one is created. Pruning runs
|
|
70
|
+
* one is created. Pruning runs before the file is opened, hence the
|
|
71
71
|
* `- 1`, without which the directory settles at N + 1.
|
|
72
72
|
*
|
|
73
73
|
* Best-effort: a failure here must not stop the run that is about to be
|
|
@@ -211,10 +211,10 @@ export async function closeActiveRunLog() {
|
|
|
211
211
|
await log?.close();
|
|
212
212
|
}
|
|
213
213
|
/**
|
|
214
|
-
* A writable that forwards to `base`
|
|
214
|
+
* A writable that forwards to `base` and to the active run log.
|
|
215
215
|
*
|
|
216
216
|
* Used by the stdio-inheriting capture path, whose collectors take a mirror
|
|
217
|
-
* stream rather than per-chunk callbacks
|
|
217
|
+
* stream rather than per-chunk callbacks, so the tee reuses the mirror the
|
|
218
218
|
* exec layer already supports instead of growing a second hook.
|
|
219
219
|
*
|
|
220
220
|
* @param base - The stream to forward to (normally `process.stdout`)
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
* Structural rules for the `sharedFtl` field on a custom component.
|
|
3
3
|
*
|
|
4
4
|
* Both the `--shared-ftl` CLI flag path (`furnace create`) and the
|
|
5
|
-
* furnace.json parser apply the same rules
|
|
5
|
+
* furnace.json parser apply the same rules. Extracting them here
|
|
6
6
|
* avoids drift between the two entry points and lets the `.mjs`
|
|
7
7
|
* template generator assume the value is safe to interpolate verbatim.
|
|
8
8
|
*/
|
|
9
9
|
/**
|
|
10
10
|
* Outcome of {@link validateSharedFtl}. `ok: true` carries the trimmed
|
|
11
|
-
* (operator-safe) value
|
|
11
|
+
* (operator-safe) value. `ok: false` carries a human-readable message
|
|
12
12
|
* suitable for throwing as a `FurnaceError` or `InvalidArgumentError`.
|
|
13
13
|
*/
|
|
14
14
|
export type SharedFtlValidation = {
|
|
@@ -3,18 +3,18 @@
|
|
|
3
3
|
* Structural rules for the `sharedFtl` field on a custom component.
|
|
4
4
|
*
|
|
5
5
|
* Both the `--shared-ftl` CLI flag path (`furnace create`) and the
|
|
6
|
-
* furnace.json parser apply the same rules
|
|
6
|
+
* furnace.json parser apply the same rules. Extracting them here
|
|
7
7
|
* avoids drift between the two entry points and lets the `.mjs`
|
|
8
8
|
* template generator assume the value is safe to interpolate verbatim.
|
|
9
9
|
*/
|
|
10
10
|
/**
|
|
11
11
|
* Characters that must not appear in `sharedFtl`.
|
|
12
12
|
*
|
|
13
|
-
*
|
|
14
|
-
* boundary for the generated `.mjs
|
|
15
|
-
* sink with `JSON.stringify` (`commands/furnace/create-templates.ts`),
|
|
16
|
-
* is what actually makes interpolation safe and what covers the two
|
|
17
|
-
* this rule never catches
|
|
13
|
+
* This is a policy rule about what a sensible FTL path looks like, not the
|
|
14
|
+
* safety boundary for the generated `.mjs`. The scaffold escapes the value at
|
|
15
|
+
* its sink with `JSON.stringify` (`commands/furnace/create-templates.ts`),
|
|
16
|
+
* which is what actually makes interpolation safe, and what covers the two
|
|
17
|
+
* inputs this rule never catches: a `"` and a raw newline.
|
|
18
18
|
*
|
|
19
19
|
* Kept because each remains a real sign of a malformed path:
|
|
20
20
|
* - `\` is a path-escape we do not want to interpret.
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* for the slot to clear before calling `process.exit`, so a signal that
|
|
14
14
|
* lands mid-body is held until the body's state write finishes.
|
|
15
15
|
*
|
|
16
|
-
* This module is a pure runtime registry
|
|
16
|
+
* This module is a pure runtime registry. It installs no signal handlers
|
|
17
17
|
* itself. The bin entry point is responsible for awaiting
|
|
18
18
|
* `waitForActiveCriticalSections` before terminating.
|
|
19
19
|
*/
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
* SIGTERM that arrives during `fn` will hold exit until `fn` returns (or
|
|
24
24
|
* rejects).
|
|
25
25
|
*
|
|
26
|
-
* `fn` should be short
|
|
26
|
+
* `fn` should be short. Anything that takes longer than the bounded wait in
|
|
27
27
|
* the bin handler (`SIGNAL_CRITICAL_SECTION_TIMEOUT_MS`) will time out and
|
|
28
28
|
* the handler will exit anyway. The intent is "guard the apply + state
|
|
29
29
|
* persist pair," not "postpone exit indefinitely."
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* for the slot to clear before calling `process.exit`, so a signal that
|
|
15
15
|
* lands mid-body is held until the body's state write finishes.
|
|
16
16
|
*
|
|
17
|
-
* This module is a pure runtime registry
|
|
17
|
+
* This module is a pure runtime registry. It installs no signal handlers
|
|
18
18
|
* itself. The bin entry point is responsible for awaiting
|
|
19
19
|
* `waitForActiveCriticalSections` before terminating.
|
|
20
20
|
*/
|
|
@@ -26,7 +26,7 @@ const activeSections = new Set();
|
|
|
26
26
|
* SIGTERM that arrives during `fn` will hold exit until `fn` returns (or
|
|
27
27
|
* rejects).
|
|
28
28
|
*
|
|
29
|
-
* `fn` should be short
|
|
29
|
+
* `fn` should be short. Anything that takes longer than the bounded wait in
|
|
30
30
|
* the bin handler (`SIGNAL_CRITICAL_SECTION_TIMEOUT_MS`) will time out and
|
|
31
31
|
* the handler will exit anyway. The intent is "guard the apply + state
|
|
32
32
|
* persist pair," not "postpone exit indefinitely."
|
|
@@ -12,14 +12,14 @@
|
|
|
12
12
|
*/
|
|
13
13
|
/**
|
|
14
14
|
* Returns `true` when `line` matches any pattern in
|
|
15
|
-
* {@link SMOKE_ERROR_PATTERNS}. Does not consult the allowlist
|
|
15
|
+
* {@link SMOKE_ERROR_PATTERNS}. Does not consult the allowlist. That step
|
|
16
16
|
* lives in {@link matchAllowlist}, so the smoke runner can count
|
|
17
17
|
* allowlisted hits separately from raw error matches for its summary.
|
|
18
18
|
*/
|
|
19
19
|
export declare function matchesSmokeError(line: string): boolean;
|
|
20
20
|
/**
|
|
21
21
|
* One compiled allowlist entry with its provenance retained so the smoke
|
|
22
|
-
* summary can attribute hits per entry
|
|
22
|
+
* summary can attribute hits per entry. An entry that silently
|
|
23
23
|
* stops matching (its suppressed shape changed upstream) is only
|
|
24
24
|
* detectable when zero-hit entries are visible.
|
|
25
25
|
*/
|
|
@@ -32,16 +32,16 @@ export interface CompiledAllowlistEntry {
|
|
|
32
32
|
}
|
|
33
33
|
/**
|
|
34
34
|
* Returns the index of the FIRST entry in `allow` matching `line`, or -1.
|
|
35
|
-
* First-match attribution is deterministic and cheap
|
|
35
|
+
* First-match attribution is deterministic and cheap. A line matching
|
|
36
36
|
* several entries credits the earliest one. Safe to call with an empty
|
|
37
37
|
* allowlist (always returns -1).
|
|
38
38
|
*/
|
|
39
39
|
export declare function matchAllowlist(line: string, allow: readonly CompiledAllowlistEntry[]): number;
|
|
40
40
|
/**
|
|
41
|
-
* Parses a newline-delimited allowlist file body. Lines are trimmed
|
|
41
|
+
* Parses a newline-delimited allowlist file body. Lines are trimmed. Blank
|
|
42
42
|
* lines and `#`-prefixed comments are skipped. Each remaining line is
|
|
43
43
|
* compiled as a RegExp with its `<file>:<line>` origin retained. A bad
|
|
44
|
-
* pattern throws immediately
|
|
44
|
+
* pattern throws immediately: better to fail fast at CLI parse time than
|
|
45
45
|
* to silently let a typo match nothing.
|
|
46
46
|
*/
|
|
47
47
|
export declare function compileAllowlistFromFile(body: string, sourcePath: string): CompiledAllowlistEntry[];
|
|
@@ -16,25 +16,25 @@
|
|
|
16
16
|
* process. A hit on any of these patterns is a smoke failure unless the
|
|
17
17
|
* line also matches the caller-supplied allowlist.
|
|
18
18
|
*
|
|
19
|
-
* Additions here should be conservative
|
|
19
|
+
* Additions here should be conservative. False positives turn every
|
|
20
20
|
* smoke run into noise for operators and every CI run into flake.
|
|
21
21
|
*/
|
|
22
22
|
import { toError } from '../utils/errors.js';
|
|
23
23
|
const SMOKE_ERROR_PATTERNS = [
|
|
24
|
-
// Firefox chrome error lines
|
|
24
|
+
// Firefox chrome error lines: `JavaScript error: chrome://…, line N: TypeError: …`.
|
|
25
25
|
/^\s*JavaScript error:/i,
|
|
26
26
|
// Some log paths prefix browser-console `console.error(...)` with the literal label below.
|
|
27
27
|
/^\s*console\.error:/i,
|
|
28
28
|
// Older bracketed-prefix variant still seen in some chrome logs / test runs.
|
|
29
29
|
/^\s*\[JavaScript (Error|Warning)\]/i,
|
|
30
|
-
// IPC-layer fatal assertions
|
|
30
|
+
// IPC-layer fatal assertions. Firefox prints `###!!! [Parent] Error: …` on content-process crashes.
|
|
31
31
|
/^\s*###!!! \[Parent\]/,
|
|
32
32
|
// A chrome:// or resource:// URL that resolves to nothing. Outside
|
|
33
33
|
// automation Gecko only PRINTS this (printf_stderr in
|
|
34
|
-
// `CheckForBrokenChromeURL`, netwerk/base/nsNetUtil.cpp)
|
|
34
|
+
// `CheckForBrokenChromeURL`, netwerk/base/nsNetUtil.cpp). Under
|
|
35
35
|
// `xpc::IsInAutomation()` the same condition is a
|
|
36
36
|
// `MOZ_CRASH_UNSAFE_PRINTF` in whichever process opened the channel. So
|
|
37
|
-
// the smoke probe
|
|
37
|
+
// the smoke probe, which runs outside automation, sees the printed
|
|
38
38
|
// line for the same defect that hard-crashes every harness run, and a
|
|
39
39
|
// probe that exits 0 on it reports "startup is healthy" for a build that
|
|
40
40
|
// hangs at "Waiting for browser…". Both spellings are matched: the
|
|
@@ -44,7 +44,7 @@ const SMOKE_ERROR_PATTERNS = [
|
|
|
44
44
|
];
|
|
45
45
|
/**
|
|
46
46
|
* Returns `true` when `line` matches any pattern in
|
|
47
|
-
* {@link SMOKE_ERROR_PATTERNS}. Does not consult the allowlist
|
|
47
|
+
* {@link SMOKE_ERROR_PATTERNS}. Does not consult the allowlist. That step
|
|
48
48
|
* lives in {@link matchAllowlist}, so the smoke runner can count
|
|
49
49
|
* allowlisted hits separately from raw error matches for its summary.
|
|
50
50
|
*/
|
|
@@ -58,7 +58,7 @@ export function matchesSmokeError(line) {
|
|
|
58
58
|
}
|
|
59
59
|
/**
|
|
60
60
|
* Returns the index of the FIRST entry in `allow` matching `line`, or -1.
|
|
61
|
-
* First-match attribution is deterministic and cheap
|
|
61
|
+
* First-match attribution is deterministic and cheap. A line matching
|
|
62
62
|
* several entries credits the earliest one. Safe to call with an empty
|
|
63
63
|
* allowlist (always returns -1).
|
|
64
64
|
*/
|
|
@@ -66,10 +66,10 @@ export function matchAllowlist(line, allow) {
|
|
|
66
66
|
return allow.findIndex((entry) => entry.pattern.test(line));
|
|
67
67
|
}
|
|
68
68
|
/**
|
|
69
|
-
* Parses a newline-delimited allowlist file body. Lines are trimmed
|
|
69
|
+
* Parses a newline-delimited allowlist file body. Lines are trimmed. Blank
|
|
70
70
|
* lines and `#`-prefixed comments are skipped. Each remaining line is
|
|
71
71
|
* compiled as a RegExp with its `<file>:<line>` origin retained. A bad
|
|
72
|
-
* pattern throws immediately
|
|
72
|
+
* pattern throws immediately: better to fail fast at CLI parse time than
|
|
73
73
|
* to silently let a typo match nothing.
|
|
74
74
|
*/
|
|
75
75
|
export function compileAllowlistFromFile(body, sourcePath) {
|
|
@@ -17,11 +17,11 @@ export declare function quarantineStateFile(statePath: string, reason?: string):
|
|
|
17
17
|
* Outcome of a version check on a persisted FireForge document.
|
|
18
18
|
*
|
|
19
19
|
* The distinction that matters is `newer` vs `corrupt`. A document written
|
|
20
|
-
* by a
|
|
21
|
-
*
|
|
20
|
+
* by a newer FireForge is not damaged. The operator simply needs to upgrade.
|
|
21
|
+
* A check that collapses the two offers destructive remedies. The
|
|
22
22
|
* sharpest case is the tree marker, whose `schemaVersion` check inside a
|
|
23
23
|
* boolean type guard makes a `schemaVersion: 2` marker read as "missing or
|
|
24
|
-
* mistypes a required field"
|
|
24
|
+
* mistypes a required field". `tree-guard.ts` is default-deny on corrupt, so
|
|
25
25
|
* a newer FireForge would lock the operator out of every mutating command
|
|
26
26
|
* inside that tree.
|
|
27
27
|
*
|
|
@@ -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
|
}
|