@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
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Environment variable that overrides the monolithic `git add -A` timeout
|
|
3
3
|
* (milliseconds). Operators on slow or loaded filesystems can legitimately
|
|
4
|
-
* exceed the 10-minute default during a baseline indexing pass
|
|
4
|
+
* exceed the 10-minute default during a baseline indexing pass. Making the
|
|
5
5
|
* cap overridable lets them retry without recompiling.
|
|
6
6
|
*/
|
|
7
7
|
export declare const GIT_ADD_TIMEOUT_ENV_VAR = "FIREFORGE_GIT_ADD_TIMEOUT_MS";
|
|
@@ -47,7 +47,9 @@ export interface GitStatusEntry {
|
|
|
47
47
|
isDeleted: boolean;
|
|
48
48
|
}
|
|
49
49
|
/**
|
|
50
|
-
* Ensures git is available in the system.
|
|
50
|
+
* Ensures git is available in the system. Memoised after the first successful
|
|
51
|
+
* probe. {@link git} calls it, so callers that go through that wrapper do not
|
|
52
|
+
* need to.
|
|
51
53
|
* @throws GitNotFoundError if git is not installed
|
|
52
54
|
*/
|
|
53
55
|
export declare function ensureGit(): Promise<void>;
|
|
@@ -65,7 +67,7 @@ export declare function git(args: string[], cwd: string, options?: {
|
|
|
65
67
|
* Splits a pathspec list into chunks whose joined byte length stays well under
|
|
66
68
|
* the OS `ARG_MAX` limit, so a single batched `git` invocation over hundreds of
|
|
67
69
|
* Mozilla-length paths cannot fail with `E2BIG`. The 96 KB budget is
|
|
68
|
-
*
|
|
70
|
+
* conservative on purpose: even the smallest historical `ARG_MAX` (256 KB)
|
|
69
71
|
* leaves room for the fixed git arguments plus the inherited environment.
|
|
70
72
|
*
|
|
71
73
|
* Chunk boundaries are output-neutral for every batched caller here: each
|
|
@@ -91,7 +93,7 @@ export declare function configureGitPerformance(repoDir: string): Promise<void>;
|
|
|
91
93
|
* rewrites LF to CRLF on checkout and back on staging. FireForge cannot
|
|
92
94
|
* tolerate that: patch bodies are byte diffs of the working tree, and
|
|
93
95
|
* `hashObjectBatch` deliberately delegates to git so `.gitattributes` and
|
|
94
|
-
* `core.autocrlf`
|
|
96
|
+
* `core.autocrlf` do apply to the hashes `status` compares against. Under the
|
|
95
97
|
* global default the same tree hashes differently on Windows than everywhere
|
|
96
98
|
* else, so exported patches and drift detection disagree across machines.
|
|
97
99
|
* Setting it per-repository leaves the developer's global config alone.
|
|
@@ -5,7 +5,7 @@ import { readOnlyGitIndexEnv } from './git-readonly-index.js';
|
|
|
5
5
|
/**
|
|
6
6
|
* Environment variable that overrides the monolithic `git add -A` timeout
|
|
7
7
|
* (milliseconds). Operators on slow or loaded filesystems can legitimately
|
|
8
|
-
* exceed the 10-minute default during a baseline indexing pass
|
|
8
|
+
* exceed the 10-minute default during a baseline indexing pass. Making the
|
|
9
9
|
* cap overridable lets them retry without recompiling.
|
|
10
10
|
*/
|
|
11
11
|
export const GIT_ADD_TIMEOUT_ENV_VAR = 'FIREFORGE_GIT_ADD_TIMEOUT_MS';
|
|
@@ -43,12 +43,33 @@ export const GIT_ADD_TIMEOUT_MS = resolveTimeoutFromEnv(GIT_ADD_TIMEOUT_ENV_VAR,
|
|
|
43
43
|
*/
|
|
44
44
|
export const GIT_ADD_CHUNK_TIMEOUT_MS = resolveTimeoutFromEnv(GIT_ADD_CHUNK_TIMEOUT_ENV_VAR, DEFAULT_GIT_ADD_CHUNK_TIMEOUT_MS);
|
|
45
45
|
/**
|
|
46
|
-
*
|
|
46
|
+
* In-flight or settled successful `git` availability probe.
|
|
47
|
+
*
|
|
48
|
+
* The probe spawns `which git` (or `where` on Windows), and every git wrapper
|
|
49
|
+
* in this layer used to run it before each command, which meant dozens of
|
|
50
|
+
* extra spawns per `fireforge export`. Only success is cached: a rejection
|
|
51
|
+
* clears the slot so a run that installs git mid-flight (or a test that flips
|
|
52
|
+
* the probe) sees the new answer instead of a sticky refusal.
|
|
53
|
+
*/
|
|
54
|
+
let gitAvailability;
|
|
55
|
+
/**
|
|
56
|
+
* Ensures git is available in the system. Memoised after the first successful
|
|
57
|
+
* probe. {@link git} calls it, so callers that go through that wrapper do not
|
|
58
|
+
* need to.
|
|
47
59
|
* @throws GitNotFoundError if git is not installed
|
|
48
60
|
*/
|
|
49
61
|
export async function ensureGit() {
|
|
50
|
-
|
|
51
|
-
|
|
62
|
+
gitAvailability ??= (async () => {
|
|
63
|
+
if (!(await executableExists('git'))) {
|
|
64
|
+
throw new GitNotFoundError();
|
|
65
|
+
}
|
|
66
|
+
})();
|
|
67
|
+
try {
|
|
68
|
+
await gitAvailability;
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
gitAvailability = undefined;
|
|
72
|
+
throw error;
|
|
52
73
|
}
|
|
53
74
|
}
|
|
54
75
|
/**
|
|
@@ -58,13 +79,14 @@ export async function ensureGit() {
|
|
|
58
79
|
* @returns Command output
|
|
59
80
|
*/
|
|
60
81
|
export async function git(args, cwd, options) {
|
|
82
|
+
await ensureGit();
|
|
61
83
|
const execOptions = { cwd };
|
|
62
84
|
if (options?.timeout !== undefined) {
|
|
63
85
|
execOptions.timeout = options.timeout;
|
|
64
86
|
}
|
|
65
87
|
// A read-only command's private-index scope overlays GIT_INDEX_FILE so
|
|
66
88
|
// index refreshes never touch the primary checkout.
|
|
67
|
-
// Merged
|
|
89
|
+
// Merged under the caller's own env so an explicit override still wins.
|
|
68
90
|
const readOnlyIndexEnv = readOnlyGitIndexEnv(cwd);
|
|
69
91
|
if (options?.env !== undefined || readOnlyIndexEnv !== undefined) {
|
|
70
92
|
execOptions.env = { ...readOnlyIndexEnv, ...options?.env };
|
|
@@ -79,7 +101,7 @@ export async function git(args, cwd, options) {
|
|
|
79
101
|
* Splits a pathspec list into chunks whose joined byte length stays well under
|
|
80
102
|
* the OS `ARG_MAX` limit, so a single batched `git` invocation over hundreds of
|
|
81
103
|
* Mozilla-length paths cannot fail with `E2BIG`. The 96 KB budget is
|
|
82
|
-
*
|
|
104
|
+
* conservative on purpose: even the smallest historical `ARG_MAX` (256 KB)
|
|
83
105
|
* leaves room for the fixed git arguments plus the inherited environment.
|
|
84
106
|
*
|
|
85
107
|
* Chunk boundaries are output-neutral for every batched caller here: each
|
|
@@ -128,7 +150,7 @@ export async function configureGitPerformance(repoDir) {
|
|
|
128
150
|
* rewrites LF to CRLF on checkout and back on staging. FireForge cannot
|
|
129
151
|
* tolerate that: patch bodies are byte diffs of the working tree, and
|
|
130
152
|
* `hashObjectBatch` deliberately delegates to git so `.gitattributes` and
|
|
131
|
-
* `core.autocrlf`
|
|
153
|
+
* `core.autocrlf` do apply to the hashes `status` compares against. Under the
|
|
132
154
|
* global default the same tree hashes differently on Windows than everywhere
|
|
133
155
|
* else, so exported patches and drift detection disagree across machines.
|
|
134
156
|
* Setting it per-repository leaves the developer's global config alone.
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** How a new file is carried in a patch, plus its text when it is text. */
|
|
2
|
+
export type NewFileContent = {
|
|
3
|
+
readonly binary: true;
|
|
4
|
+
} | {
|
|
5
|
+
readonly binary: false;
|
|
6
|
+
readonly content: string;
|
|
7
|
+
};
|
|
8
|
+
/**
|
|
9
|
+
* Reads a new (untracked) file and classifies it for patch generation.
|
|
10
|
+
*
|
|
11
|
+
* A file is binary when git's NUL-byte heuristic says so
|
|
12
|
+
* ({@link isBinaryFile}) or when its bytes are not valid UTF-8. See the
|
|
13
|
+
* module comment for why the second arm exists. Text files come back with
|
|
14
|
+
* their exact decoded content so callers do not read the file twice.
|
|
15
|
+
*
|
|
16
|
+
* @param repoDir - Repository directory
|
|
17
|
+
* @param filePath - File path (relative to repo root)
|
|
18
|
+
* @returns The classification, with content for text files
|
|
19
|
+
*/
|
|
20
|
+
export declare function readNewFileContent(repoDir: string, filePath: string): Promise<NewFileContent>;
|
|
21
|
+
/**
|
|
22
|
+
* Runs `task` with git config arguments that force `filePath` to be diffed
|
|
23
|
+
* as binary.
|
|
24
|
+
*
|
|
25
|
+
* `git diff --binary` only emits a `GIT binary patch` for a file git itself
|
|
26
|
+
* classifies as binary, and git's classifier is the NUL heuristic, so a
|
|
27
|
+
* Latin-1 file passes it and comes out as a text diff whose high bytes are
|
|
28
|
+
* then mangled by the UTF-8 decode every subprocess result goes through.
|
|
29
|
+
* The `-diff` attribute is how git is told otherwise, and a throwaway
|
|
30
|
+
* `core.attributesFile` naming just this path is the narrowest way to set it
|
|
31
|
+
* without touching the tree's own `.gitattributes`. (An in-tree attribute
|
|
32
|
+
* that explicitly sets `diff` for the path would still win. The tree's own
|
|
33
|
+
* attributes are its business.)
|
|
34
|
+
*
|
|
35
|
+
* @param filePath - File path (relative to repo root)
|
|
36
|
+
* @param task - Receives `['-c', 'core.attributesFile=...']` to splice ahead
|
|
37
|
+
* of the git subcommand
|
|
38
|
+
* @returns Whatever `task` returns
|
|
39
|
+
*/
|
|
40
|
+
export declare function withForcedBinaryAttribute<T>(filePath: string, task: (gitConfigArgs: string[]) => Promise<T>): Promise<T>;
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
// SPDX-License-Identifier: EUPL-1.2
|
|
2
|
+
/**
|
|
3
|
+
* Decides how a new (untracked) file travels inside a patch: as a synthesized
|
|
4
|
+
* `+`-line text body, or as a `GIT binary patch`.
|
|
5
|
+
*
|
|
6
|
+
* The text body is built from a JavaScript string, and the `index` line next
|
|
7
|
+
* to it comes from `git hash-object` over the file's real bytes. Those two
|
|
8
|
+
* agree only when the bytes decode losslessly as UTF-8. A Latin-1
|
|
9
|
+
* `.properties` or `.rc` file has no NUL byte, so git's own binary heuristic
|
|
10
|
+
* calls it text, but a UTF-8 decode turns every high byte into U+FFFD, so
|
|
11
|
+
* the patch body and its blob hash disagree, `git apply` writes different
|
|
12
|
+
* bytes than the tree holds, and every drift check flags the file forever.
|
|
13
|
+
* A binary patch carries the bytes verbatim, so it is the faithful choice for
|
|
14
|
+
* anything that is not valid UTF-8. This module is the single place that
|
|
15
|
+
* decision is made.
|
|
16
|
+
*/
|
|
17
|
+
import { mkdtemp, readFile, rm, writeFile } from 'node:fs/promises';
|
|
18
|
+
import { tmpdir } from 'node:os';
|
|
19
|
+
import { join } from 'node:path';
|
|
20
|
+
import { isBinaryFile } from './git-file-ops.js';
|
|
21
|
+
// `ignoreBOM: true` keeps a leading U+FEFF in the output instead of silently
|
|
22
|
+
// consuming it, matching `readFile(path, 'utf-8')`, so a BOM-prefixed file
|
|
23
|
+
// still renders the byte the blob hash was computed over.
|
|
24
|
+
const strictUtf8 = new TextDecoder('utf-8', { fatal: true, ignoreBOM: true });
|
|
25
|
+
/**
|
|
26
|
+
* Decodes bytes as UTF-8, or reports that they are not valid UTF-8.
|
|
27
|
+
* @param bytes - Raw file bytes
|
|
28
|
+
* @returns The decoded text, or undefined when any sequence is malformed
|
|
29
|
+
*/
|
|
30
|
+
function decodeStrictUtf8(bytes) {
|
|
31
|
+
try {
|
|
32
|
+
return strictUtf8.decode(bytes);
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
void error;
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Reads a new (untracked) file and classifies it for patch generation.
|
|
41
|
+
*
|
|
42
|
+
* A file is binary when git's NUL-byte heuristic says so
|
|
43
|
+
* ({@link isBinaryFile}) or when its bytes are not valid UTF-8. See the
|
|
44
|
+
* module comment for why the second arm exists. Text files come back with
|
|
45
|
+
* their exact decoded content so callers do not read the file twice.
|
|
46
|
+
*
|
|
47
|
+
* @param repoDir - Repository directory
|
|
48
|
+
* @param filePath - File path (relative to repo root)
|
|
49
|
+
* @returns The classification, with content for text files
|
|
50
|
+
*/
|
|
51
|
+
export async function readNewFileContent(repoDir, filePath) {
|
|
52
|
+
if (await isBinaryFile(repoDir, filePath)) {
|
|
53
|
+
return { binary: true };
|
|
54
|
+
}
|
|
55
|
+
const content = decodeStrictUtf8(await readFile(join(repoDir, filePath)));
|
|
56
|
+
if (content === undefined) {
|
|
57
|
+
return { binary: true };
|
|
58
|
+
}
|
|
59
|
+
return { binary: false, content };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Renders one repo-relative path as an anchored, literal gitattributes
|
|
63
|
+
* pattern: the whole thing is C-quoted (which gitattributes accepts for
|
|
64
|
+
* patterns holding spaces or `#`) and glob metacharacters carry a backslash
|
|
65
|
+
* that survives the unquoting, so git matches them literally.
|
|
66
|
+
*
|
|
67
|
+
* Both escapes are applied in a single pass, keyed on the source character.
|
|
68
|
+
* Escaping in two passes would re-escape the backslashes the first pass just
|
|
69
|
+
* added, and a backslash that is part of the filename would have to be
|
|
70
|
+
* escaped for the glob layer as well as the quoting layer, which a
|
|
71
|
+
* glob-only first pass cannot tell apart from one it emitted itself.
|
|
72
|
+
*
|
|
73
|
+
* @param filePath - File path (relative to repo root)
|
|
74
|
+
* @returns A pattern matching exactly that path
|
|
75
|
+
*/
|
|
76
|
+
function toLiteralAttributePattern(filePath) {
|
|
77
|
+
// `"` only needs the quoting layer, so one backslash. A glob
|
|
78
|
+
// metacharacter takes a backslash for the glob layer, which the quoting
|
|
79
|
+
// layer then doubles into two. A literal `\` is both: the glob layer
|
|
80
|
+
// doubles it, then the quoting layer doubles that again, for four.
|
|
81
|
+
const escaped = filePath.replace(/["\\*?[\]]/g, (char) => {
|
|
82
|
+
if (char === '"')
|
|
83
|
+
return '\\"';
|
|
84
|
+
if (char === '\\')
|
|
85
|
+
return '\\\\\\\\';
|
|
86
|
+
return `\\\\${char}`;
|
|
87
|
+
});
|
|
88
|
+
return `"/${escaped}"`;
|
|
89
|
+
}
|
|
90
|
+
/**
|
|
91
|
+
* Runs `task` with git config arguments that force `filePath` to be diffed
|
|
92
|
+
* as binary.
|
|
93
|
+
*
|
|
94
|
+
* `git diff --binary` only emits a `GIT binary patch` for a file git itself
|
|
95
|
+
* classifies as binary, and git's classifier is the NUL heuristic, so a
|
|
96
|
+
* Latin-1 file passes it and comes out as a text diff whose high bytes are
|
|
97
|
+
* then mangled by the UTF-8 decode every subprocess result goes through.
|
|
98
|
+
* The `-diff` attribute is how git is told otherwise, and a throwaway
|
|
99
|
+
* `core.attributesFile` naming just this path is the narrowest way to set it
|
|
100
|
+
* without touching the tree's own `.gitattributes`. (An in-tree attribute
|
|
101
|
+
* that explicitly sets `diff` for the path would still win. The tree's own
|
|
102
|
+
* attributes are its business.)
|
|
103
|
+
*
|
|
104
|
+
* @param filePath - File path (relative to repo root)
|
|
105
|
+
* @param task - Receives `['-c', 'core.attributesFile=...']` to splice ahead
|
|
106
|
+
* of the git subcommand
|
|
107
|
+
* @returns Whatever `task` returns
|
|
108
|
+
*/
|
|
109
|
+
export async function withForcedBinaryAttribute(filePath, task) {
|
|
110
|
+
const tempDir = await mkdtemp(join(tmpdir(), 'fireforge-attr-'));
|
|
111
|
+
try {
|
|
112
|
+
const attributesFile = join(tempDir, 'attributes');
|
|
113
|
+
await writeFile(attributesFile, `${toLiteralAttributePattern(filePath)} -diff\n`);
|
|
114
|
+
return await task(['-c', `core.attributesFile=${attributesFile}`]);
|
|
115
|
+
}
|
|
116
|
+
finally {
|
|
117
|
+
await rm(tempDir, { recursive: true, force: true });
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* `--binary` is load-bearing: without it git degrades a binary file's section
|
|
5
5
|
* to the informational `Binary files a/x and b/x differ`, which carries none
|
|
6
6
|
* of the bytes and cannot be replayed by `git apply`. It only expands the
|
|
7
|
-
*
|
|
7
|
+
* binary section's index line to full hashes (text sections keep their
|
|
8
8
|
* abbreviated form), so text output stays byte-identical.
|
|
9
9
|
* @param repoDir - Repository directory
|
|
10
10
|
* @param filePath - Path to the file (relative to repo)
|
|
@@ -12,7 +12,10 @@
|
|
|
12
12
|
*/
|
|
13
13
|
export declare function getFileDiff(repoDir: string, filePath: string): Promise<string>;
|
|
14
14
|
/**
|
|
15
|
-
* Generates a unified diff for a new (untracked) file.
|
|
15
|
+
* Generates a unified diff for a new (untracked) file. A file that is binary
|
|
16
|
+
* or not valid UTF-8 (see {@link readNewFileContent}) is routed through
|
|
17
|
+
* {@link generateBinaryFilePatch} instead, because a text body cannot carry
|
|
18
|
+
* its bytes faithfully.
|
|
16
19
|
* @param repoDir - Repository directory
|
|
17
20
|
* @param filePath - Path to the file (relative to repo)
|
|
18
21
|
* @returns Diff content in unified diff format
|
|
@@ -28,20 +31,12 @@ export declare function generateNewFileDiff(repoDir: string, filePath: string):
|
|
|
28
31
|
* @returns Diff content in unified diff format
|
|
29
32
|
*/
|
|
30
33
|
export declare function generateFullFilePatch(repoDir: string, filePath: string): Promise<string>;
|
|
31
|
-
/**
|
|
32
|
-
* Generates a unified diff between base content and current file content.
|
|
33
|
-
* @param repoDir - Repository directory
|
|
34
|
-
* @param filePath - Path to the file (relative to repo)
|
|
35
|
-
* @param baseContent - The base content to diff against
|
|
36
|
-
* @returns Unified diff in git format
|
|
37
|
-
*/
|
|
38
|
-
export declare function generateModificationDiff(repoDir: string, filePath: string, baseContent: string): Promise<string>;
|
|
39
34
|
/**
|
|
40
35
|
* Gets the diff for all modified files, including untracked (new) files.
|
|
41
36
|
*
|
|
42
|
-
* Tracked binary files round-trip through `git diff --binary
|
|
37
|
+
* Tracked binary files round-trip through `git diff --binary`. Untracked ones
|
|
43
38
|
* go through {@link generateBinaryFilePatch} below. Both arms must stay
|
|
44
|
-
* binary-aware
|
|
39
|
+
* binary-aware. See {@link getFileDiff} for why.
|
|
45
40
|
* @param repoDir - Repository directory
|
|
46
41
|
* @returns Diff content
|
|
47
42
|
*/
|
|
@@ -49,7 +44,7 @@ export declare function getAllDiff(repoDir: string): Promise<string>;
|
|
|
49
44
|
/**
|
|
50
45
|
* Builds a combined diff against HEAD for the provided files without touching
|
|
51
46
|
* the real git index. Tracked files use `git diff --binary HEAD` (binary
|
|
52
|
-
* sections included)
|
|
47
|
+
* sections included). Untracked files use synthesized new-file diffs, or
|
|
53
48
|
* {@link generateBinaryFilePatch} when the file is binary.
|
|
54
49
|
*
|
|
55
50
|
* Performance: the work is batched into a handful of `git` invocations (one
|
|
@@ -75,6 +70,11 @@ export declare function getStagedDiffForFiles(repoDir: string, files: string[]):
|
|
|
75
70
|
* Generates a GIT binary patch for a binary file.
|
|
76
71
|
* For tracked files, uses `git diff --binary HEAD`.
|
|
77
72
|
* For untracked files, temporarily stages with `--intent-to-add` to produce a diff.
|
|
73
|
+
*
|
|
74
|
+
* Every `git diff` here runs under {@link withForcedBinaryAttribute}: a
|
|
75
|
+
* caller sends a file down this arm because a text body cannot carry its
|
|
76
|
+
* bytes (NUL, or not valid UTF-8), and git's own NUL-only heuristic would
|
|
77
|
+
* otherwise still render the non-UTF-8 case as text.
|
|
78
78
|
* @param repoDir - Repository directory
|
|
79
79
|
* @param filePath - File path (relative to repo root)
|
|
80
80
|
* @returns The binary diff string, or empty string if no diff
|