@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,28 +1,27 @@
|
|
|
1
1
|
// SPDX-License-Identifier: EUPL-1.2
|
|
2
2
|
import { join } from 'node:path';
|
|
3
|
-
import { getProjectPaths } from '../core/config.js';
|
|
4
3
|
import { appendHistory, confirmDestructive, } from '../core/destructive.js';
|
|
5
4
|
import { enforceFreshFurnaceSources } from '../core/furnace-stale-export.js';
|
|
6
5
|
import { getDiffForFilesAgainstHead } from '../core/git-diff.js';
|
|
7
6
|
import { listTrackedInHead } from '../core/git-file-ops.js';
|
|
8
7
|
import { extractAffectedFiles } from '../core/patch-apply.js';
|
|
9
8
|
import { updatePatchAndMetadata } from '../core/patch-export.js';
|
|
10
|
-
import {
|
|
9
|
+
import { buildPatchQueueContext, formatPatchLintIssue, lintPatchQueue, } from '../core/patch-lint.js';
|
|
11
10
|
import { computeProjectedLintRegressions } from '../core/patch-lint-projection.js';
|
|
12
11
|
import { loadPatchesManifest } from '../core/patch-manifest.js';
|
|
13
12
|
import { buildProjectedManifest, enforcePatchPolicy } from '../core/patch-policy.js';
|
|
14
|
-
import { buildNewFileTextProjection } from '../core/patch-transform.js';
|
|
15
13
|
import { InvalidArgumentError } from '../errors/base.js';
|
|
16
14
|
import { pathExists } from '../utils/fs.js';
|
|
17
15
|
import { info, outro, success, warn } from '../utils/logger.js';
|
|
18
16
|
import { runPatchLint } from './export-shared.js';
|
|
17
|
+
import { projectEntryBody } from './patch/entry-projection.js';
|
|
19
18
|
/**
|
|
20
19
|
* Computes the effective `tier` and `lintIgnore` carrying both the patch's
|
|
21
20
|
* existing values and the CLI flag overrides.
|
|
22
21
|
*
|
|
23
|
-
* Tier resolution: the CLI flag takes precedence
|
|
22
|
+
* Tier resolution: the CLI flag takes precedence. The patch's existing tier
|
|
24
23
|
* is the fallback. Lint-ignore resolution: union of the patch's existing list
|
|
25
|
-
* and the CLI flag values, de-duplicated
|
|
24
|
+
* and the CLI flag values, de-duplicated. An empty result returns `undefined`
|
|
26
25
|
* so the caller can drop the field rather than write an empty array.
|
|
27
26
|
*/
|
|
28
27
|
function resolveEffectiveTierAndLintIgnore(target, options) {
|
|
@@ -42,17 +41,11 @@ function resolveEffectiveTierAndLintIgnore(target, options) {
|
|
|
42
41
|
*/
|
|
43
42
|
async function runProjectedCrossPatchLint(patchesDir, targetFilename, projectedDiff) {
|
|
44
43
|
const baseCtx = await buildPatchQueueContext(patchesDir);
|
|
45
|
-
const
|
|
46
|
-
const projectedModifiedFileAdditions = buildModifiedFileAdditionsFromDiff(projectedDiff);
|
|
44
|
+
const projection = projectEntryBody(projectedDiff);
|
|
47
45
|
const projectedEntries = baseCtx.entries.map((entry) => {
|
|
48
46
|
if (entry.filename !== targetFilename)
|
|
49
47
|
return entry;
|
|
50
|
-
return {
|
|
51
|
-
...entry,
|
|
52
|
-
diff: projectedDiff,
|
|
53
|
-
newFiles: projectedNewFiles,
|
|
54
|
-
modifiedFileAdditions: projectedModifiedFileAdditions,
|
|
55
|
-
};
|
|
48
|
+
return { ...entry, ...projection };
|
|
56
49
|
});
|
|
57
50
|
const baselineIssues = lintPatchQueue(baseCtx).filter((i) => i.severity === 'error');
|
|
58
51
|
const projectedIssues = lintPatchQueue({ entries: projectedEntries }).filter((i) => i.severity === 'error');
|
|
@@ -117,7 +110,7 @@ async function confirmFilesModeProjection(args) {
|
|
|
117
110
|
title: `Re-export ${target.filename} with --files`,
|
|
118
111
|
summary,
|
|
119
112
|
// A captured deletion still needs the confirmation: the patch will now
|
|
120
|
-
//
|
|
113
|
+
// remove those files wherever it is applied, which is the same class of
|
|
121
114
|
// consequence as shrinking the scope.
|
|
122
115
|
yes: removed.length === 0 && deletedFiles.length === 0 ? true : options.yes === true,
|
|
123
116
|
dryRun: isDryRun,
|
|
@@ -129,13 +122,13 @@ async function confirmFilesModeProjection(args) {
|
|
|
129
122
|
* Splits the requested paths into what can be diffed and what is a deletion.
|
|
130
123
|
*
|
|
131
124
|
* A path absent from disk is one of two very different things, and
|
|
132
|
-
* collapsing them is what made a
|
|
125
|
+
* collapsing them is what made a deletion impossible to capture.
|
|
133
126
|
*
|
|
134
127
|
* Tracked in HEAD: a deletion. `git diff HEAD -- <path>` renders it as a
|
|
135
|
-
* proper `deleted file mode` section, so it
|
|
136
|
-
* comment this replaces claimed the diff "would fail" on any missing path
|
|
137
|
-
* true only for the never-tracked case.) Dropping these produced
|
|
138
|
-
* dangerous shape: a re-export that reported success while writing a patch
|
|
128
|
+
* proper `deleted file mode` section, so it stays in the diff scope. (The
|
|
129
|
+
* comment this replaces claimed the diff "would fail" on any missing path,
|
|
130
|
+
* which is true only for the never-tracked case.) Dropping these produced
|
|
131
|
+
* the dangerous shape: a re-export that reported success while writing a patch
|
|
139
132
|
* whose own file list claimed a path it did not restore, so a fresh clone
|
|
140
133
|
* would apply it and resurrect exactly what the change meant to remove.
|
|
141
134
|
*
|
|
@@ -192,8 +185,8 @@ export async function reExportFilesInPlace(paths, selectedPatches, options, conf
|
|
|
192
185
|
throw new InvalidArgumentError('reExportFilesInPlace called with no --files.', '--files');
|
|
193
186
|
}
|
|
194
187
|
const requested = [...new Set(filesOption)].sort();
|
|
195
|
-
// Stale-furnace-source gate: same refusal as the generic re-export path
|
|
196
|
-
// the projected diff would capture stale deployed copies.
|
|
188
|
+
// Stale-furnace-source gate: same refusal as the generic re-export path,
|
|
189
|
+
// since the projected diff would capture stale deployed copies.
|
|
197
190
|
await enforceFreshFurnaceSources(paths.root, requested, options.allowStaleFurnace === true, 're-export');
|
|
198
191
|
const removed = target.filesAffected.filter((f) => !requested.includes(f));
|
|
199
192
|
const added = requested.filter((f) => !target.filesAffected.includes(f));
|
|
@@ -210,12 +203,11 @@ export async function reExportFilesInPlace(paths, selectedPatches, options, conf
|
|
|
210
203
|
}
|
|
211
204
|
const actualProjectedFiles = extractAffectedFiles(projectedDiff);
|
|
212
205
|
const actualProjectedSet = new Set(actualProjectedFiles);
|
|
213
|
-
// Domain is the
|
|
206
|
+
// Domain is the full requested list, not the diffable subset. When the
|
|
214
207
|
// subset was used, any path filtered out upstream was invisible to this
|
|
215
|
-
// check
|
|
216
|
-
//
|
|
217
|
-
//
|
|
218
|
-
// wrong, so an explicitly named path that produced no hunk is a refusal.
|
|
208
|
+
// check, which is how a dropped deletion slipped through while the run
|
|
209
|
+
// reported success. A patch must do what its own file list claims, so an
|
|
210
|
+
// explicitly named path that produced no hunk is a refusal.
|
|
219
211
|
const noDiffFiles = requested.filter((file) => !actualProjectedSet.has(file));
|
|
220
212
|
if (noDiffFiles.length > 0) {
|
|
221
213
|
throw new InvalidArgumentError(`Refusing to re-export ${target.filename} with --files because ${noDiffFiles.length} requested path${noDiffFiles.length === 1 ? '' : 's'} produced no diff hunks (${noDiffFiles.join(', ')}). ` +
|
|
@@ -235,7 +227,16 @@ export async function reExportFilesInPlace(paths, selectedPatches, options, conf
|
|
|
235
227
|
const patchQueueCtx = (await pathExists(paths.patches))
|
|
236
228
|
? await buildPatchQueueContext(paths.patches)
|
|
237
229
|
: undefined;
|
|
238
|
-
await runPatchLint(
|
|
230
|
+
await runPatchLint({
|
|
231
|
+
engineDir: paths.engine,
|
|
232
|
+
filesAffected: actualProjectedFiles,
|
|
233
|
+
diffContent: projectedDiff,
|
|
234
|
+
config,
|
|
235
|
+
skipLint: options.skipLint,
|
|
236
|
+
patchQueueCtx,
|
|
237
|
+
ignoreChecks,
|
|
238
|
+
patchTier: effectiveTier,
|
|
239
|
+
});
|
|
239
240
|
const conflicts = await runProjectedCrossPatchLint(paths.patches, target.filename, projectedDiff);
|
|
240
241
|
const filesUpdates = buildFilesModeMetadataUpdates(actualProjectedFiles, options, effectiveLintIgnore, flagIgnoreSet);
|
|
241
242
|
const manifest = await loadPatchesManifest(paths.patches);
|
|
@@ -273,23 +274,30 @@ export async function reExportFilesInPlace(paths, selectedPatches, options, conf
|
|
|
273
274
|
// as the mutation (via the onCommitted hook) so two concurrent re-exports
|
|
274
275
|
// cannot interleave records and a crash between mutation and append cannot
|
|
275
276
|
// orphan the audit trail.
|
|
276
|
-
await updatePatchAndMetadata(
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
277
|
+
await updatePatchAndMetadata({
|
|
278
|
+
patchesDir: paths.patches,
|
|
279
|
+
filename: target.filename,
|
|
280
|
+
newContent: projectedDiff,
|
|
281
|
+
updates: filesUpdates,
|
|
282
|
+
onCommitted: async () => {
|
|
283
|
+
await appendHistory(paths.patches, {
|
|
284
|
+
operation: 're-export-files',
|
|
285
|
+
args: {
|
|
286
|
+
filename: target.filename,
|
|
287
|
+
files: actualProjectedFiles,
|
|
288
|
+
previousFiles: target.filesAffected,
|
|
289
|
+
deletionsCaptured: deletedFiles,
|
|
290
|
+
},
|
|
291
|
+
...(options.yes === true ? { yes: true } : {}),
|
|
292
|
+
...(options.forceUnsafe === true ? { unsafeOverride: true } : {}),
|
|
293
|
+
result: 'ok',
|
|
294
|
+
});
|
|
295
|
+
},
|
|
296
|
+
policyGate: {
|
|
297
|
+
config,
|
|
298
|
+
command: 're-export --files',
|
|
299
|
+
forceUnsafe: options.forceUnsafe === true,
|
|
300
|
+
},
|
|
293
301
|
});
|
|
294
302
|
success(`Re-exported ${target.filename}`);
|
|
295
303
|
outro('Re-export complete');
|
|
@@ -1,41 +1,40 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Hoisted + cached lint context for `re-export`.
|
|
3
3
|
*
|
|
4
|
-
* Rebuilding the whole patch-queue context
|
|
4
|
+
* Rebuilding the whole patch-queue context and a fresh queue-wide checkJs
|
|
5
5
|
* TypeScript program for every patch costs tens of seconds of fixed setup
|
|
6
6
|
* per patch, so an N-patch re-export pays it N times. This module:
|
|
7
7
|
*
|
|
8
|
-
* -
|
|
9
|
-
* controller
|
|
10
|
-
* per-patch findings out of it
|
|
11
|
-
* -
|
|
12
|
-
* (`.fireforge/lint-cache/per-patch-v1.json`) across invocations
|
|
8
|
+
* - Builds the queue context and the {@link PerRunCheckJs} program
|
|
9
|
+
* controller once per invocation (`buildReExportLintContext`) and slices
|
|
10
|
+
* per-patch findings out of it.
|
|
11
|
+
* - Reuses the existing per-patch lint result cache
|
|
12
|
+
* (`.fireforge/lint-cache/per-patch-v1.json`) across invocations, since
|
|
13
13
|
* re-export lints the identical input `lint --per-patch` does (the fresh
|
|
14
14
|
* `git diff HEAD` of the owned files), and the key already hashes engine
|
|
15
15
|
* HEAD, per-file content, patch body, config, shims, and ownership, so a
|
|
16
|
-
* repeat single re-export is a warm hit. `--no-cache` opts out
|
|
17
|
-
* checkJs globals are never cached and are emitted once per invocation
|
|
18
|
-
* -
|
|
16
|
+
* repeat single re-export is a warm hit. `--no-cache` opts out. Run-level
|
|
17
|
+
* checkJs globals are never cached and are emitted once per invocation.
|
|
18
|
+
* - Keeps the in-memory queue context honest after each write
|
|
19
19
|
* (`refreshQueueCtxEntry`), so later iterations of an `--all` run lint
|
|
20
20
|
* against the just-refreshed body instead of the stale one.
|
|
21
21
|
*/
|
|
22
|
-
import { getProjectPaths, loadConfig } from '../core/config.js';
|
|
23
22
|
import { type PatchQueueContext } from '../core/patch-lint.js';
|
|
24
23
|
import { type PerPatchLintCacheFile } from '../core/patch-lint-cache.js';
|
|
25
24
|
import type { PatchLintIssue, PatchMetadata } from '../types/commands/index.js';
|
|
26
|
-
import type { FireForgeConfig } from '../types/config.js';
|
|
25
|
+
import type { FireForgeConfig, ProjectPaths } from '../types/config.js';
|
|
27
26
|
import { type PerRunCheckJs } from './lint-per-run-checkjs.js';
|
|
28
27
|
/** Per-invocation lint context, built once and threaded through the loop. */
|
|
29
28
|
export interface ReExportLintContext {
|
|
30
29
|
projectRoot: string;
|
|
31
|
-
paths:
|
|
30
|
+
paths: ProjectPaths;
|
|
32
31
|
config: FireForgeConfig;
|
|
33
|
-
/** Whole-queue context, built
|
|
34
|
-
* match `lint --per-patch
|
|
32
|
+
/** Whole-queue context, built with config so the forward-import hints
|
|
33
|
+
* match `lint --per-patch`. Undefined when no patches dir. */
|
|
35
34
|
patchQueueCtx: PatchQueueContext | undefined;
|
|
36
|
-
/** Queue-wide checkJs controller
|
|
35
|
+
/** Queue-wide checkJs controller. Undefined when checkJs is off. */
|
|
37
36
|
checkJs: PerRunCheckJs | undefined;
|
|
38
|
-
/** Per-patch result cache
|
|
37
|
+
/** Per-patch result cache. Undefined under `--no-cache`. */
|
|
39
38
|
cache: PerPatchLintCacheFile | undefined;
|
|
40
39
|
engineHeadSha: string | undefined;
|
|
41
40
|
cacheDirty: boolean;
|
|
@@ -44,7 +43,7 @@ export interface ReExportLintContext {
|
|
|
44
43
|
globalsEmitted: boolean;
|
|
45
44
|
}
|
|
46
45
|
/** Builds the once-per-invocation lint context. */
|
|
47
|
-
export declare function buildReExportLintContext(projectRoot: string, paths:
|
|
46
|
+
export declare function buildReExportLintContext(projectRoot: string, paths: ProjectPaths, config: FireForgeConfig, noCache: boolean): Promise<ReExportLintContext>;
|
|
48
47
|
/** Fresh lint payload carried to the post-write cache store. */
|
|
49
48
|
export interface ReExportLintResult {
|
|
50
49
|
issues: PatchLintIssue[];
|
|
@@ -54,20 +53,20 @@ export interface ReExportLintResult {
|
|
|
54
53
|
lintIgnore: string[];
|
|
55
54
|
}
|
|
56
55
|
/**
|
|
57
|
-
* Lints one re-exported patch body using the hoisted context
|
|
58
|
-
*
|
|
59
|
-
* miss
|
|
56
|
+
* Lints one re-exported patch body using the hoisted context. A cache hit
|
|
57
|
+
* replays the stored issues through the shared reporter and returns `null`.
|
|
58
|
+
* A miss lints with the queue-wide program's pre-attributed slices (or a
|
|
60
59
|
* per-patch build when the fresh diff creates files the hoisted program
|
|
61
|
-
* never saw
|
|
60
|
+
* never saw, the `--scan` adoption case) and returns the payload for
|
|
62
61
|
* {@link storeReExportLintResult}. Throws exactly like `runPatchLint` on
|
|
63
62
|
* errors (unless `skipLint`).
|
|
64
63
|
*
|
|
65
|
-
* The cache key is built over the
|
|
64
|
+
* The cache key is built over the projected metadata (current
|
|
66
65
|
* filesAffected, merged lintIgnore, effective tier) so `--tier` /
|
|
67
|
-
* `--lint-ignore` flags change the key. The entry itself is stored
|
|
68
|
-
* the body write
|
|
69
|
-
* very run is about to rewrite
|
|
70
|
-
* later run
|
|
66
|
+
* `--lint-ignore` flags change the key. The entry itself is stored after
|
|
67
|
+
* the body write, because the key hashes the on-disk `.patch` file that
|
|
68
|
+
* this very run is about to rewrite, so a pre-write store could never
|
|
69
|
+
* match a later run.
|
|
71
70
|
*/
|
|
72
71
|
export declare function lintReExportedPatch(args: {
|
|
73
72
|
lintCtx: ReExportLintContext;
|
|
@@ -80,16 +79,16 @@ export declare function lintReExportedPatch(args: {
|
|
|
80
79
|
patchTier?: 'branding';
|
|
81
80
|
}): Promise<ReExportLintResult | null>;
|
|
82
81
|
/**
|
|
83
|
-
* Stores a fresh lint result
|
|
84
|
-
* just-written `.patch` file and the refreshed queue context
|
|
85
|
-
* a later identical invocation will observe (call
|
|
82
|
+
* Stores a fresh lint result after the body write, keying against the
|
|
83
|
+
* just-written `.patch` file and the refreshed queue context, which is the
|
|
84
|
+
* state a later identical invocation will observe (call
|
|
86
85
|
* {@link refreshQueueCtxEntry} first).
|
|
87
86
|
*/
|
|
88
87
|
export declare function storeReExportLintResult(lintCtx: ReExportLintContext, patchFilename: string, projectedMetadata: PatchMetadata, existingFiles: string[], result: ReExportLintResult): Promise<void>;
|
|
89
88
|
/**
|
|
90
89
|
* Refreshes the in-memory queue entry for a just-rewritten patch so later
|
|
91
90
|
* iterations (and later cache keys) lint against the new body instead of
|
|
92
|
-
* the stale one. The on-disk write is the authority
|
|
91
|
+
* the stale one. The on-disk write is the authority. This mirrors it.
|
|
93
92
|
*/
|
|
94
93
|
export declare function refreshQueueCtxEntry(lintCtx: ReExportLintContext, patchFilename: string, diffContent: string): void;
|
|
95
94
|
/** Persists cache writes and reports reuse, once after the loop. */
|
|
@@ -2,25 +2,24 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Hoisted + cached lint context for `re-export`.
|
|
4
4
|
*
|
|
5
|
-
* Rebuilding the whole patch-queue context
|
|
5
|
+
* Rebuilding the whole patch-queue context and a fresh queue-wide checkJs
|
|
6
6
|
* TypeScript program for every patch costs tens of seconds of fixed setup
|
|
7
7
|
* per patch, so an N-patch re-export pays it N times. This module:
|
|
8
8
|
*
|
|
9
|
-
* -
|
|
10
|
-
* controller
|
|
11
|
-
* per-patch findings out of it
|
|
12
|
-
* -
|
|
13
|
-
* (`.fireforge/lint-cache/per-patch-v1.json`) across invocations
|
|
9
|
+
* - Builds the queue context and the {@link PerRunCheckJs} program
|
|
10
|
+
* controller once per invocation (`buildReExportLintContext`) and slices
|
|
11
|
+
* per-patch findings out of it.
|
|
12
|
+
* - Reuses the existing per-patch lint result cache
|
|
13
|
+
* (`.fireforge/lint-cache/per-patch-v1.json`) across invocations, since
|
|
14
14
|
* re-export lints the identical input `lint --per-patch` does (the fresh
|
|
15
15
|
* `git diff HEAD` of the owned files), and the key already hashes engine
|
|
16
16
|
* HEAD, per-file content, patch body, config, shims, and ownership, so a
|
|
17
|
-
* repeat single re-export is a warm hit. `--no-cache` opts out
|
|
18
|
-
* checkJs globals are never cached and are emitted once per invocation
|
|
19
|
-
* -
|
|
17
|
+
* repeat single re-export is a warm hit. `--no-cache` opts out. Run-level
|
|
18
|
+
* checkJs globals are never cached and are emitted once per invocation.
|
|
19
|
+
* - Keeps the in-memory queue context honest after each write
|
|
20
20
|
* (`refreshQueueCtxEntry`), so later iterations of an `--all` run lint
|
|
21
21
|
* against the just-refreshed body instead of the stale one.
|
|
22
22
|
*/
|
|
23
|
-
import { getProjectPaths, loadConfig } from '../core/config.js';
|
|
24
23
|
import { buildPatchQueueContext, countNonBinaryDiffLines, detectNewFilesInDiff, lintExportedPatch, resolvePatchSizeTier, } from '../core/patch-lint.js';
|
|
25
24
|
import { buildPerPatchLintCacheKey, getCachedPerPatchLintIssues, getPerPatchLintCacheHeadSha, loadPerPatchLintCache, savePerPatchLintCache, setCachedPerPatchLintIssues, } from '../core/patch-lint-cache.js';
|
|
26
25
|
import { invalidateNewFileCreatorsCache } from '../core/patch-lint-cross.js';
|
|
@@ -63,26 +62,26 @@ function checkJsFilesInDiff(diffContent, checkJs) {
|
|
|
63
62
|
return files;
|
|
64
63
|
}
|
|
65
64
|
/**
|
|
66
|
-
* Lints one re-exported patch body using the hoisted context
|
|
67
|
-
*
|
|
68
|
-
* miss
|
|
65
|
+
* Lints one re-exported patch body using the hoisted context. A cache hit
|
|
66
|
+
* replays the stored issues through the shared reporter and returns `null`.
|
|
67
|
+
* A miss lints with the queue-wide program's pre-attributed slices (or a
|
|
69
68
|
* per-patch build when the fresh diff creates files the hoisted program
|
|
70
|
-
* never saw
|
|
69
|
+
* never saw, the `--scan` adoption case) and returns the payload for
|
|
71
70
|
* {@link storeReExportLintResult}. Throws exactly like `runPatchLint` on
|
|
72
71
|
* errors (unless `skipLint`).
|
|
73
72
|
*
|
|
74
|
-
* The cache key is built over the
|
|
73
|
+
* The cache key is built over the projected metadata (current
|
|
75
74
|
* filesAffected, merged lintIgnore, effective tier) so `--tier` /
|
|
76
|
-
* `--lint-ignore` flags change the key. The entry itself is stored
|
|
77
|
-
* the body write
|
|
78
|
-
* very run is about to rewrite
|
|
79
|
-
* later run
|
|
75
|
+
* `--lint-ignore` flags change the key. The entry itself is stored after
|
|
76
|
+
* the body write, because the key hashes the on-disk `.patch` file that
|
|
77
|
+
* this very run is about to rewrite, so a pre-write store could never
|
|
78
|
+
* match a later run.
|
|
80
79
|
*/
|
|
81
80
|
export async function lintReExportedPatch(args) {
|
|
82
81
|
const { lintCtx, patch, projectedMetadata, existingFiles, diffContent } = args;
|
|
83
82
|
const { paths, config, patchQueueCtx, checkJs, cache } = lintCtx;
|
|
84
|
-
// Tier notice, identical to runPatchLint's head
|
|
85
|
-
// cached and fresh paths so the governing tier is never silent.
|
|
83
|
+
// Tier notice, identical to runPatchLint's head. It is surfaced on both
|
|
84
|
+
// the cached and fresh paths so the governing tier is never silent.
|
|
86
85
|
const tierDecision = resolvePatchSizeTier(existingFiles, args.patchTier);
|
|
87
86
|
if (tierDecision.tier === 'branding') {
|
|
88
87
|
info(tierDecision.source === 'explicit'
|
|
@@ -127,8 +126,8 @@ export async function lintReExportedPatch(args) {
|
|
|
127
126
|
}
|
|
128
127
|
else {
|
|
129
128
|
// Fresh `--scan` adoption created checkJs-relevant files the hoisted
|
|
130
|
-
// program has never seen
|
|
131
|
-
// usual report scope
|
|
129
|
+
// program has never seen, so fall back to a per-patch build with the
|
|
130
|
+
// usual report scope and nothing is silently unchecked.
|
|
132
131
|
lintOptions.checkJsReportScope = resolvePatchOwnedSysMjs(detectNewFilesInDiff(diffContent));
|
|
133
132
|
}
|
|
134
133
|
}
|
|
@@ -150,9 +149,9 @@ export async function lintReExportedPatch(args) {
|
|
|
150
149
|
};
|
|
151
150
|
}
|
|
152
151
|
/**
|
|
153
|
-
* Stores a fresh lint result
|
|
154
|
-
* just-written `.patch` file and the refreshed queue context
|
|
155
|
-
* a later identical invocation will observe (call
|
|
152
|
+
* Stores a fresh lint result after the body write, keying against the
|
|
153
|
+
* just-written `.patch` file and the refreshed queue context, which is the
|
|
154
|
+
* state a later identical invocation will observe (call
|
|
156
155
|
* {@link refreshQueueCtxEntry} first).
|
|
157
156
|
*/
|
|
158
157
|
export async function storeReExportLintResult(lintCtx, patchFilename, projectedMetadata, existingFiles, result) {
|
|
@@ -169,13 +168,21 @@ export async function storeReExportLintResult(lintCtx, patchFilename, projectedM
|
|
|
169
168
|
queueContext: patchQueueCtx,
|
|
170
169
|
...(lintCtx.engineHeadSha === undefined ? {} : { engineHeadSha: lintCtx.engineHeadSha }),
|
|
171
170
|
});
|
|
172
|
-
setCachedPerPatchLintIssues(
|
|
171
|
+
setCachedPerPatchLintIssues({
|
|
172
|
+
cache,
|
|
173
|
+
patchFilename,
|
|
174
|
+
key: cacheKey,
|
|
175
|
+
issues: result.issues,
|
|
176
|
+
suppressed: result.suppressed,
|
|
177
|
+
lineCount: result.lineCount,
|
|
178
|
+
lintIgnore: result.lintIgnore,
|
|
179
|
+
});
|
|
173
180
|
lintCtx.cacheDirty = true;
|
|
174
181
|
}
|
|
175
182
|
/**
|
|
176
183
|
* Refreshes the in-memory queue entry for a just-rewritten patch so later
|
|
177
184
|
* iterations (and later cache keys) lint against the new body instead of
|
|
178
|
-
* the stale one. The on-disk write is the authority
|
|
185
|
+
* the stale one. The on-disk write is the authority. This mirrors it.
|
|
179
186
|
*/
|
|
180
187
|
export function refreshQueueCtxEntry(lintCtx, patchFilename, diffContent) {
|
|
181
188
|
const ctx = lintCtx.patchQueueCtx;
|
|
@@ -191,7 +198,7 @@ export function refreshQueueCtxEntry(lintCtx, patchFilename, diffContent) {
|
|
|
191
198
|
const modifiedFileAdditions = new Map();
|
|
192
199
|
for (const [file, lines] of addedLinesByFile) {
|
|
193
200
|
if (newFilePaths.has(file)) {
|
|
194
|
-
// A created file's content
|
|
201
|
+
// A created file's content is its added lines.
|
|
195
202
|
newFiles.set(file, lines.join('\n'));
|
|
196
203
|
}
|
|
197
204
|
else {
|
|
@@ -11,7 +11,7 @@ export interface NormalizedReExportArguments {
|
|
|
11
11
|
* `re-export <patch> --files`. Commander's `--files <paths>` consumes one
|
|
12
12
|
* comma-separated value, so `re-export 006-x --files a/b.js c/d.js` parks
|
|
13
13
|
* `c/d.js` in the positional patches and fails with "--files operates on
|
|
14
|
-
* exactly one target patch"
|
|
14
|
+
* exactly one target patch", pointing at the wrong argument. When every
|
|
15
15
|
* positional beyond the first looks like a file path, fold them into the
|
|
16
16
|
* file list.
|
|
17
17
|
*/
|
|
@@ -14,7 +14,7 @@ function looksLikeFilePath(value) {
|
|
|
14
14
|
* `re-export <patch> --files`. Commander's `--files <paths>` consumes one
|
|
15
15
|
* comma-separated value, so `re-export 006-x --files a/b.js c/d.js` parks
|
|
16
16
|
* `c/d.js` in the positional patches and fails with "--files operates on
|
|
17
|
-
* exactly one target patch"
|
|
17
|
+
* exactly one target patch", pointing at the wrong argument. When every
|
|
18
18
|
* positional beyond the first looks like a file path, fold them into the
|
|
19
19
|
* file list.
|
|
20
20
|
*/
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
*
|
|
4
4
|
* Split out of `re-export.ts`, which was otherwise over the per-file line
|
|
5
5
|
* cap. The split direction matches the existing `re-export-scan.ts` /
|
|
6
|
-
* `re-export-options.ts` boundary
|
|
6
|
+
* `re-export-options.ts` boundary. Folding `re-export-files.ts` back into
|
|
7
7
|
* the orchestrator would go the wrong way.
|
|
8
8
|
*/
|
|
9
9
|
import { Command } from 'commander';
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
*
|
|
5
5
|
* Split out of `re-export.ts`, which was otherwise over the per-file line
|
|
6
6
|
* cap. The split direction matches the existing `re-export-scan.ts` /
|
|
7
|
-
* `re-export-options.ts` boundary
|
|
7
|
+
* `re-export-options.ts` boundary. Folding `re-export-files.ts` back into
|
|
8
8
|
* the orchestrator would go the wrong way.
|
|
9
9
|
*/
|
|
10
10
|
import { Command, Option } from 'commander';
|
|
@@ -30,7 +30,7 @@ export declare function confirmBroadScanAdditions(args: {
|
|
|
30
30
|
}): Promise<boolean>;
|
|
31
31
|
/**
|
|
32
32
|
* Refuses scan adoptions whose candidate files import modules created by
|
|
33
|
-
*
|
|
33
|
+
* later patches. Modeled on the `re-export --files` cross-patch
|
|
34
34
|
* projection: the candidates' diffs are projected into the adopting
|
|
35
35
|
* patch's queue entry, the queue lint runs baseline vs projection, and
|
|
36
36
|
* only forward-import regressions attributable to the candidates block.
|
|
@@ -6,6 +6,7 @@ import { listTrackedInHead } from '../core/git-file-ops.js';
|
|
|
6
6
|
import { getModifiedFilesInDir, getUntrackedFilesInDir } from '../core/git-status.js';
|
|
7
7
|
import { extractAffectedFiles } from '../core/patch-apply.js';
|
|
8
8
|
import { buildModifiedFileAdditionsFromDiff, buildPatchQueueContext, lintPatchQueue, } from '../core/patch-lint.js';
|
|
9
|
+
import { detectNewFilesInDiff } from '../core/patch-lint-diff.js';
|
|
9
10
|
import { computeProjectedLintRegressions } from '../core/patch-lint-projection.js';
|
|
10
11
|
import { getClaimedFiles } from '../core/patch-manifest.js';
|
|
11
12
|
import { buildNewFileTextProjection } from '../core/patch-transform.js';
|
|
@@ -56,10 +57,10 @@ async function scanPatchFiles(args) {
|
|
|
56
57
|
discoveredFiles.add(f);
|
|
57
58
|
}
|
|
58
59
|
// Git pathspecs recurse, so a claimed file in a shallow directory would
|
|
59
|
-
// sweep entire subtrees into the candidate set
|
|
60
|
+
// sweep entire subtrees into the candidate set: with several patches
|
|
60
61
|
// sharing a parent directory, every unmanaged file in the tree gets
|
|
61
62
|
// offered to whichever patch is scanned first. Constrain the broad scan
|
|
62
|
-
// to the patch's exact directory footprint
|
|
63
|
+
// to the patch's exact directory footprint. Deeper paths need an
|
|
63
64
|
// explicit --scan-file / --scan-files assignment.
|
|
64
65
|
const parentDirSet = new Set(parentDirs);
|
|
65
66
|
const currentSet = new Set(currentFilesAffected);
|
|
@@ -77,7 +78,7 @@ async function scanPatchFilesTargeted(args) {
|
|
|
77
78
|
// Phase-split for bounded concurrency: the sync claimed-by-others check
|
|
78
79
|
// first (first offender in argument order, as before), then pooled
|
|
79
80
|
// existence probes with the refusal chosen by ordered iteration so the
|
|
80
|
-
//
|
|
81
|
+
// first missing file in argument order is named deterministically.
|
|
81
82
|
for (const file of scanFiles) {
|
|
82
83
|
if (claimedByOthers.has(file)) {
|
|
83
84
|
throw new InvalidArgumentError(`--scan-file path is already claimed by another patch: ${file}`, '--scan-file');
|
|
@@ -98,12 +99,12 @@ async function scanPatchFilesTargeted(args) {
|
|
|
98
99
|
return reportScanResult(currentFilesAffected, patchFilename, isDryRun, added.sort(), removed);
|
|
99
100
|
}
|
|
100
101
|
/**
|
|
101
|
-
* Paths that have genuinely left the patch's ownership: absent from disk
|
|
102
|
+
* Paths that have genuinely left the patch's ownership: absent from disk and
|
|
102
103
|
* untracked in engine HEAD.
|
|
103
104
|
*
|
|
104
|
-
* An absent path that
|
|
105
|
+
* An absent path that is tracked in HEAD is a deletion, not a de-ownership.
|
|
105
106
|
* The diff carries it as a `deleted file mode` section, so it must stay in
|
|
106
|
-
* `filesAffected
|
|
107
|
+
* `filesAffected`. Pruning it desynchronises the manifest from the patch
|
|
107
108
|
* body in the direction that hurts: the body says "delete this file", the
|
|
108
109
|
* file list says the patch has nothing to do with it.
|
|
109
110
|
*/
|
|
@@ -135,14 +136,14 @@ export async function confirmBroadScanAdditions(args) {
|
|
|
135
136
|
if (isDryRun || yes || !scanAdditionsNeedConfirmation(added))
|
|
136
137
|
return true;
|
|
137
138
|
const dirCount = new Set(added.map((f) => dirname(f))).size;
|
|
138
|
-
warn(`${patchFilename}: --scan would add ${
|
|
139
|
+
warn(`${patchFilename}: --scan would add ${added.length} file(s) that span ${dirCount} director${dirCount === 1 ? 'y' : 'ies'}. ` +
|
|
139
140
|
'Broad scans can silently pull adjacent features into a patch — review the diff before continuing.');
|
|
140
141
|
if (!isInteractive) {
|
|
141
142
|
throw new GeneralError(`Refusing to broaden "${patchFilename}" via --scan in non-interactive mode. ` +
|
|
142
143
|
'Pass --yes to acknowledge the expansion, or run with --dry-run first to review.');
|
|
143
144
|
}
|
|
144
145
|
const confirmed = await confirm({
|
|
145
|
-
message: `Proceed and broaden ${patchFilename} with ${
|
|
146
|
+
message: `Proceed and broaden ${patchFilename} with ${added.length} newly discovered file(s)?`,
|
|
146
147
|
initialValue: false,
|
|
147
148
|
});
|
|
148
149
|
if (isCancel(confirmed) || !confirmed) {
|
|
@@ -160,7 +161,7 @@ function scanAdditionsNeedConfirmation(added) {
|
|
|
160
161
|
}
|
|
161
162
|
/**
|
|
162
163
|
* Refuses scan adoptions whose candidate files import modules created by
|
|
163
|
-
*
|
|
164
|
+
* later patches. Modeled on the `re-export --files` cross-patch
|
|
164
165
|
* projection: the candidates' diffs are projected into the adopting
|
|
165
166
|
* patch's queue entry, the queue lint runs baseline vs projection, and
|
|
166
167
|
* only forward-import regressions attributable to the candidates block.
|
|
@@ -177,6 +178,7 @@ export async function assertScanAdoptionsHaveNoForwardImports(args) {
|
|
|
177
178
|
if (!candidateDiff.trim())
|
|
178
179
|
return;
|
|
179
180
|
const candidateNewFiles = buildNewFileTextProjection(candidateDiff);
|
|
181
|
+
const candidateCreations = detectNewFilesInDiff(candidateDiff);
|
|
180
182
|
const candidateAdditions = buildModifiedFileAdditionsFromDiff(candidateDiff);
|
|
181
183
|
const baseCtx = await buildPatchQueueContext(patchesDir);
|
|
182
184
|
const projectedEntries = baseCtx.entries.map((entry) => {
|
|
@@ -186,6 +188,7 @@ export async function assertScanAdoptionsHaveNoForwardImports(args) {
|
|
|
186
188
|
...entry,
|
|
187
189
|
diff: `${entry.diff}\n${candidateDiff}`,
|
|
188
190
|
newFiles: new Map([...entry.newFiles, ...candidateNewFiles]),
|
|
191
|
+
createdFiles: new Set([...entry.createdFiles, ...candidateCreations]),
|
|
189
192
|
modifiedFileAdditions: new Map([...entry.modifiedFileAdditions, ...candidateAdditions]),
|
|
190
193
|
};
|
|
191
194
|
});
|
|
@@ -4,17 +4,36 @@
|
|
|
4
4
|
* loop calls {@link reExportSinglePatchWithIndexLockRetry} per selected
|
|
5
5
|
* patch.
|
|
6
6
|
*/
|
|
7
|
-
import { getProjectPaths } from '../core/config.js';
|
|
8
7
|
import type { PatchesManifest, PatchMetadata, ReExportOptions } from '../types/commands/index.js';
|
|
9
|
-
import type { FireForgeConfig } from '../types/config.js';
|
|
8
|
+
import type { FireForgeConfig, ProjectPaths } from '../types/config.js';
|
|
10
9
|
import type { AdjacentUnmanagedContext } from './re-export-adjacent.js';
|
|
11
10
|
import type { ForeignDriftContext } from './re-export-drift.js';
|
|
12
11
|
import { type ReExportLintContext } from './re-export-lint.js';
|
|
12
|
+
export interface ReExportSinglePatchArgs {
|
|
13
|
+
/** Manifest row for the patch being refreshed. */
|
|
14
|
+
patch: PatchMetadata;
|
|
15
|
+
/** Resolved project paths. */
|
|
16
|
+
paths: ProjectPaths;
|
|
17
|
+
/** Patch queue manifest as loaded by the orchestrator. */
|
|
18
|
+
manifest: PatchesManifest;
|
|
19
|
+
/** Effective re-export options for this patch. */
|
|
20
|
+
options: ReExportOptions;
|
|
21
|
+
/** Whether the run is a dry run. */
|
|
22
|
+
isDryRun: boolean;
|
|
23
|
+
/** Project configuration. */
|
|
24
|
+
config: FireForgeConfig;
|
|
25
|
+
/** Adjacent-unmanaged-file reporting context. */
|
|
26
|
+
adjacentCtx: AdjacentUnmanagedContext;
|
|
27
|
+
/** Foreign-drift reporting context. */
|
|
28
|
+
driftCtx: ForeignDriftContext;
|
|
29
|
+
/** Per-patch lint context, including the shared lint cache. */
|
|
30
|
+
lintCtx: ReExportLintContext;
|
|
31
|
+
}
|
|
13
32
|
/**
|
|
14
33
|
* Retries a single patch re-export exactly once when the failure is
|
|
15
34
|
* transient git `index.lock` contention (an external git process holding
|
|
16
35
|
* the engine repo's index). The retry re-enters `reExportSinglePatch`
|
|
17
|
-
* from the top, so it re-reads clean state
|
|
36
|
+
* from the top, so it re-reads clean state. A second lock failure
|
|
18
37
|
* propagates to the loop's honest "N of M" accounting.
|
|
19
38
|
*/
|
|
20
|
-
export declare function reExportSinglePatchWithIndexLockRetry(
|
|
39
|
+
export declare function reExportSinglePatchWithIndexLockRetry(args: ReExportSinglePatchArgs): Promise<boolean>;
|