@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
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
*/
|
|
13
13
|
import { findBlockCloseIndex, stripBlockCommentsInLines } from './token-dark-mode.js';
|
|
14
14
|
/**
|
|
15
|
-
*
|
|
15
|
+
* One attribute selector fragment: `[data-private]` (boolean attribute) or
|
|
16
16
|
* `[data-skin=precision]` / `[data-skin="precision"]` (attribute with
|
|
17
17
|
* value). The name and value halves are restricted to identifier-safe
|
|
18
18
|
* characters so the fragment can be spliced into CSS verbatim without
|
|
@@ -26,35 +26,35 @@ import { findBlockCloseIndex, stripBlockCommentsInLines } from './token-dark-mod
|
|
|
26
26
|
const ATTRIBUTE_FRAGMENT_PATTERN = /^\[[a-zA-Z][a-zA-Z0-9_-]*(?:=(?:"[a-zA-Z0-9_-]+"|'[a-zA-Z0-9_-]+'|[a-zA-Z0-9_-]+))?\]$/;
|
|
27
27
|
/**
|
|
28
28
|
* A pseudo-class tail: `:not(…)`, `:hover`, and friends. The parenthesised
|
|
29
|
-
* argument is captured rather than validated here
|
|
29
|
+
* argument is captured rather than validated here. It is a fragment run of
|
|
30
30
|
* its own and goes through the same per-group check.
|
|
31
31
|
*/
|
|
32
32
|
const QUALIFIER_PATTERN = /^:[a-zA-Z][a-zA-Z0-9-]*(?:\(([^()]*)\))?$/;
|
|
33
33
|
/**
|
|
34
34
|
* Splits a run of consecutive attribute fragments into its groups, or
|
|
35
|
-
* returns `
|
|
36
|
-
* open with `[`, an unclosed group, an empty run, or a group whose name
|
|
37
|
-
* value is not identifier-safe.
|
|
35
|
+
* returns `undefined` when the run is not exactly that: a group that does
|
|
36
|
+
* not open with `[`, an unclosed group, an empty run, or a group whose name
|
|
37
|
+
* or value is not identifier-safe.
|
|
38
38
|
*
|
|
39
39
|
* @param run - The `[…][…]` text with no `:root` prefix
|
|
40
|
-
* @returns The individual fragments, or
|
|
40
|
+
* @returns The individual fragments, or undefined when the run is not valid
|
|
41
41
|
*/
|
|
42
42
|
function splitAttributeGroups(run) {
|
|
43
43
|
const groups = [];
|
|
44
44
|
let cursor = 0;
|
|
45
45
|
while (cursor < run.length) {
|
|
46
46
|
if (run[cursor] !== '[')
|
|
47
|
-
return
|
|
47
|
+
return undefined;
|
|
48
48
|
const close = run.indexOf(']', cursor);
|
|
49
49
|
if (close === -1)
|
|
50
|
-
return
|
|
50
|
+
return undefined;
|
|
51
51
|
const group = run.slice(cursor, close + 1);
|
|
52
52
|
if (!ATTRIBUTE_FRAGMENT_PATTERN.test(group))
|
|
53
|
-
return
|
|
53
|
+
return undefined;
|
|
54
54
|
groups.push(group);
|
|
55
55
|
cursor = close + 1;
|
|
56
56
|
}
|
|
57
|
-
return groups.length > 0 ? groups :
|
|
57
|
+
return groups.length > 0 ? groups : undefined;
|
|
58
58
|
}
|
|
59
59
|
/** Rewrites `=value` / `='value'` to the double-quoted Mozilla convention. */
|
|
60
60
|
function normalizeAttributeFragment(group) {
|
|
@@ -67,12 +67,12 @@ function normalizeAttributeFragment(group) {
|
|
|
67
67
|
* form to the double-quoted `="value"` shape (Mozilla convention).
|
|
68
68
|
* Boolean-attribute fragments are returned unchanged.
|
|
69
69
|
*
|
|
70
|
-
* Structure is decided by {@link rootAttributeSelector}
|
|
71
|
-
* parse
|
|
70
|
+
* Structure is decided by {@link rootAttributeSelector}, the matcher's own
|
|
71
|
+
* parse, rather than by a second regex. 0.44.2 widened
|
|
72
72
|
* the matcher to consume consecutive `[…]` groups and stop at a pseudo-class
|
|
73
73
|
* tail, and the validator did not move with it, so
|
|
74
74
|
* `:root[data-skin="humanist"]:not([data-private])` was a block the tool
|
|
75
|
-
* could
|
|
75
|
+
* could find but would not let you name. Running both halves off one parse
|
|
76
76
|
* is what stops them drifting apart again. Character-level safety stays a
|
|
77
77
|
* separate, per-group check, because the matcher finds bracket boundaries
|
|
78
78
|
* and validates no characters at all.
|
|
@@ -93,13 +93,13 @@ export function validateVariantSelector(raw) {
|
|
|
93
93
|
if (value === '')
|
|
94
94
|
return reject;
|
|
95
95
|
const parts = rootAttributeSelector(`:root${value} {`);
|
|
96
|
-
// The parse must have consumed the
|
|
96
|
+
// The parse must have consumed the whole fragment: anything it declined to
|
|
97
97
|
// read (a stray space, a trailing combinator) is text the matcher would
|
|
98
98
|
// not see either, so accepting it would author a block nothing can find.
|
|
99
|
-
if (parts ===
|
|
99
|
+
if (parts === undefined || `${parts.attributes}${parts.qualifier}` !== `:root${value}`)
|
|
100
100
|
return reject;
|
|
101
101
|
const groups = splitAttributeGroups(parts.attributes.slice(':root'.length));
|
|
102
|
-
if (groups ===
|
|
102
|
+
if (groups === undefined)
|
|
103
103
|
return reject;
|
|
104
104
|
let qualifier = '';
|
|
105
105
|
if (parts.qualifier !== '') {
|
|
@@ -112,7 +112,7 @@ export function validateVariantSelector(raw) {
|
|
|
112
112
|
}
|
|
113
113
|
else {
|
|
114
114
|
const innerGroups = splitAttributeGroups(inner);
|
|
115
|
-
if (innerGroups ===
|
|
115
|
+
if (innerGroups === undefined)
|
|
116
116
|
return reject;
|
|
117
117
|
const name = parts.qualifier.slice(0, parts.qualifier.indexOf('('));
|
|
118
118
|
qualifier = `${name}(${innerGroups.map(normalizeAttributeFragment).join('')})`;
|
|
@@ -131,31 +131,31 @@ function canonicalSelector(selector) {
|
|
|
131
131
|
}
|
|
132
132
|
/**
|
|
133
133
|
* Splits the `:root[…]` selector on `line` into its attribute run and any
|
|
134
|
-
* trailing qualifier, or `
|
|
134
|
+
* trailing qualifier, or `undefined` when the line carries none.
|
|
135
135
|
*
|
|
136
136
|
* Index arithmetic rather than `/:root\[[^{]*\]/`: `[^{]` also matches `]`,
|
|
137
137
|
* so that pattern backtracks quadratically on a line repeating `:root[`
|
|
138
138
|
* (CodeQL `js/polynomial-redos`). This walk is linear and allocation-free
|
|
139
139
|
* per group.
|
|
140
140
|
*
|
|
141
|
-
* It consumes
|
|
142
|
-
* is not `[`. The previous implementation instead sliced to the
|
|
141
|
+
* It consumes consecutive `[…]` groups and stops at the first character that
|
|
142
|
+
* is not `[`. The previous implementation instead sliced to the last `]`
|
|
143
143
|
* before the brace, which kept multi-attribute selectors comparing as a
|
|
144
|
-
* whole
|
|
145
|
-
* consumed
|
|
144
|
+
* whole (that property is preserved here, since consecutive groups are all
|
|
145
|
+
* consumed) but it also swallowed a pseudo-class tail. On
|
|
146
146
|
* `:root[data-theme="light"]:not([data-private]) {` the last `]` is the one
|
|
147
147
|
* inside `:not(…)`, so the computed fragment was
|
|
148
148
|
* `:root[data-theme="light"]:not([data-private]` and the canonical
|
|
149
149
|
* comparison could never match. The unqualified
|
|
150
150
|
* `:root[data-theme="dark"] { }` beside it matched fine, and that asymmetry
|
|
151
|
-
*
|
|
152
|
-
* silently skipped the light one,
|
|
153
|
-
*
|
|
151
|
+
* was the bug: an override add mirrored itself into the dark block and
|
|
152
|
+
* silently skipped the light one, the half-finished themed edit
|
|
153
|
+
* `THEME_ATTRIBUTE_VARIANTS` exists to prevent.
|
|
154
154
|
*/
|
|
155
155
|
function rootAttributeSelector(line) {
|
|
156
156
|
const start = line.indexOf(':root[');
|
|
157
157
|
if (start === -1)
|
|
158
|
-
return
|
|
158
|
+
return undefined;
|
|
159
159
|
const brace = line.indexOf('{', start);
|
|
160
160
|
const limit = brace === -1 ? line.length : brace;
|
|
161
161
|
let cursor = start + ':root'.length;
|
|
@@ -168,36 +168,35 @@ function rootAttributeSelector(line) {
|
|
|
168
168
|
end = cursor;
|
|
169
169
|
}
|
|
170
170
|
if (end === start + ':root'.length)
|
|
171
|
-
return
|
|
171
|
+
return undefined;
|
|
172
172
|
return { attributes: line.slice(start, end), qualifier: line.slice(end, limit).trim() };
|
|
173
173
|
}
|
|
174
174
|
/**
|
|
175
175
|
* Finds the top-level `:root<variant>` block whose attribute selector
|
|
176
176
|
* matches `variant` (compared canonically). Returns the opening-brace and
|
|
177
|
-
* closing-brace line indices, or `
|
|
177
|
+
* closing-brace line indices, or `undefined` when no such block exists.
|
|
178
178
|
*
|
|
179
179
|
* Scans a comment-stripped mirror of `lines` so braces inside comments do
|
|
180
|
-
* not offset the depth counter
|
|
180
|
+
* not offset the depth counter. The returned indices line up with the
|
|
181
181
|
* original array.
|
|
182
182
|
*/
|
|
183
183
|
function findVariantBlock(lines, variant) {
|
|
184
184
|
const stripped = stripBlockCommentsInLines(lines);
|
|
185
185
|
// The request goes through the same parse as the candidate lines, so a
|
|
186
186
|
// variant carrying its own `:not(…)` tail is compared tail-to-tail rather
|
|
187
|
-
// than being folded into the attribute run
|
|
187
|
+
// than being folded into the attribute run, where it would match nothing
|
|
188
188
|
// and every add would splice a fresh duplicate block.
|
|
189
189
|
const requested = rootAttributeSelector(`:root${variant} {`);
|
|
190
190
|
const want = canonicalSelector(requested?.attributes ?? `:root${variant}`);
|
|
191
191
|
const wantQualifier = canonicalSelector(requested?.qualifier ?? '');
|
|
192
|
-
for (
|
|
193
|
-
const line = stripped[i] ?? '';
|
|
192
|
+
for (const [i, line] of stripped.entries()) {
|
|
194
193
|
const selector = rootAttributeSelector(line);
|
|
195
|
-
if (selector ===
|
|
194
|
+
if (selector === undefined || canonicalSelector(selector.attributes) !== want)
|
|
196
195
|
continue;
|
|
197
|
-
// An
|
|
196
|
+
// An unqualified request still matches a qualified block: that is the
|
|
198
197
|
// 0.44.2 behaviour `variantBlockQualifier` exists to report, since
|
|
199
198
|
// silently skipping the block is the worse failure. A request that names
|
|
200
|
-
// a qualifier, though, means it
|
|
199
|
+
// a qualifier, though, means it, so it must match.
|
|
201
200
|
if (wantQualifier !== '' && canonicalSelector(selector.qualifier) !== wantQualifier)
|
|
202
201
|
continue;
|
|
203
202
|
let openLine = /\{/.test(line) ? i : -1;
|
|
@@ -219,7 +218,7 @@ function findVariantBlock(lines, variant) {
|
|
|
219
218
|
continue;
|
|
220
219
|
return { open: openLine, close, qualifier: selector.qualifier };
|
|
221
220
|
}
|
|
222
|
-
return
|
|
221
|
+
return undefined;
|
|
223
222
|
}
|
|
224
223
|
/**
|
|
225
224
|
* Returns the line index at which a brand-new `:root<variant>` block should
|
|
@@ -229,8 +228,8 @@ function findVariantBlock(lines, variant) {
|
|
|
229
228
|
*/
|
|
230
229
|
function findVariantBlockInsertionPoint(lines) {
|
|
231
230
|
const stripped = stripBlockCommentsInLines(lines);
|
|
232
|
-
for (
|
|
233
|
-
if (/^\s*:root\s*\{/.test(
|
|
231
|
+
for (const [i, line] of stripped.entries()) {
|
|
232
|
+
if (/^\s*:root\s*\{/.test(line)) {
|
|
234
233
|
const close = findBlockCloseIndex(stripped, i);
|
|
235
234
|
if (close !== -1)
|
|
236
235
|
return close + 1;
|
|
@@ -241,23 +240,23 @@ function findVariantBlockInsertionPoint(lines) {
|
|
|
241
240
|
/**
|
|
242
241
|
* True when a top-level `:root<variant>` block exists in `lines`. Used by
|
|
243
242
|
* the override path to write theme-attribute blocks only when the scaffold
|
|
244
|
-
* already declares them
|
|
243
|
+
* already declares them. `insertVariantDeclaration` would otherwise create
|
|
245
244
|
* the block, which is only wanted for the explicit `--variant` flow.
|
|
246
245
|
*/
|
|
247
246
|
export function variantBlockExists(lines, variant) {
|
|
248
|
-
return findVariantBlock(lines, variant) !==
|
|
247
|
+
return findVariantBlock(lines, variant) !== undefined;
|
|
249
248
|
}
|
|
250
249
|
/**
|
|
251
250
|
* The pseudo-class qualifier on the matched `:root<variant>` block, or
|
|
252
251
|
* `undefined` when no block matched. `''` for an unqualified block.
|
|
253
252
|
*
|
|
254
|
-
* A qualifier such as `:not([data-private])` is
|
|
255
|
-
*
|
|
256
|
-
*
|
|
257
|
-
*
|
|
258
|
-
*
|
|
259
|
-
*
|
|
260
|
-
*
|
|
253
|
+
* A qualifier such as `:not([data-private])` is load-bearing: writing into
|
|
254
|
+
* that block scopes the declaration to the qualified case, and that may not
|
|
255
|
+
* be what the operator meant. Matching it is still the right call, since
|
|
256
|
+
* silently skipping it is the worse failure and the one that shipped, but
|
|
257
|
+
* the override path uses this to say out loud which selector it wrote
|
|
258
|
+
* through, so the narrowing is a visible decision rather than a theme bug
|
|
259
|
+
* discovered later.
|
|
261
260
|
*
|
|
262
261
|
* @param lines - Tokens CSS split into lines
|
|
263
262
|
* @param variant - Attribute selector fragment, e.g. `[data-theme="light"]`
|
|
@@ -276,8 +275,8 @@ export function variantBlockHasToken(lines, variant, tokenName) {
|
|
|
276
275
|
* not exist).
|
|
277
276
|
*
|
|
278
277
|
* The located form of {@link variantBlockHasToken}: the variant add path
|
|
279
|
-
* reports a skip the way the base path does
|
|
280
|
-
* line
|
|
278
|
+
* reports a skip the way the base path does, naming the block and the
|
|
279
|
+
* line, instead of returning a bare boolean that leaves a no-op re-run
|
|
281
280
|
* indistinguishable from a write.
|
|
282
281
|
*
|
|
283
282
|
* @param lines - Tokens CSS split into lines
|
|
@@ -289,19 +288,19 @@ export function findVariantBlockDeclaration(lines, variant, tokenName) {
|
|
|
289
288
|
const block = findVariantBlock(lines, variant);
|
|
290
289
|
if (!block)
|
|
291
290
|
return undefined;
|
|
292
|
-
// Comments are stripped across the
|
|
291
|
+
// Comments are stripped across the whole block before scanning, matching
|
|
293
292
|
// what the boolean form always did: a `/* … */` spanning several lines
|
|
294
293
|
// must not leave its tail looking like a declaration.
|
|
295
294
|
const blockLines = lines.slice(block.open, block.close + 1);
|
|
296
|
-
// Blank the comment's
|
|
295
|
+
// Blank the comment's characters rather than deleting it: removing a
|
|
297
296
|
// multi-line comment outright collapses its lines and shifts every line
|
|
298
297
|
// number after it, which is the one thing this function exists to report.
|
|
299
298
|
const stripped = blockLines
|
|
300
299
|
.join('\n')
|
|
301
300
|
.replace(/\/\*[\s\S]*?\*\//g, (match) => match.replace(/[^\n]/g, ' '))
|
|
302
301
|
.split('\n');
|
|
303
|
-
for (
|
|
304
|
-
if (
|
|
302
|
+
for (const [i, line] of stripped.entries()) {
|
|
303
|
+
if (line.includes(`${tokenName}:`))
|
|
305
304
|
return { line: block.open + i + 1 };
|
|
306
305
|
}
|
|
307
306
|
return undefined;
|
|
@@ -1,27 +1,27 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Toolchain-minimum awareness for Firefox source hops.
|
|
3
3
|
*
|
|
4
|
-
* When `fireforge download --force` moves the engine to a new Firefox
|
|
4
|
+
* When `fireforge download --force` moves the engine to a new Firefox major
|
|
5
5
|
* version, the tree's declared toolchain minimums (cbindgen, Rust)
|
|
6
|
-
* frequently move with it
|
|
6
|
+
* frequently move with it, and the first `fireforge build` then dies a few
|
|
7
7
|
* seconds into `mach configure` with a message whose remediation text names
|
|
8
8
|
* `./mach bootstrap`, the wrong tool for a FireForge-managed repo (e.g.
|
|
9
9
|
* `ERROR: cbindgen version 0.29.1 is too old. At least version 0.29.4 is
|
|
10
10
|
* required.`).
|
|
11
11
|
*
|
|
12
12
|
* Two layers:
|
|
13
|
-
* 1. {@link formatMajorVersionHopNotice}
|
|
13
|
+
* 1. {@link formatMajorVersionHopNotice}, a post-download nudge when the
|
|
14
14
|
* downloaded major differs from the previously downloaded one.
|
|
15
|
-
* 2. {@link runToolchainPreflight}
|
|
15
|
+
* 2. {@link runToolchainPreflight}, a cheap pre-build probe comparing the
|
|
16
16
|
* minimums the tree itself declares against the host binaries
|
|
17
17
|
* `mach configure` will resolve, probing configure's own candidate
|
|
18
18
|
* order: env override first, then the `~/.mozbuild` state-directory copy
|
|
19
19
|
* bootstrap installs, then PATH. Probing env-or-PATH alone blocks builds
|
|
20
20
|
* whose current tool lives in the state dir behind a stale PATH copy.
|
|
21
|
-
*
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
21
|
+
* Fail-soft: it reports a mismatch only when a minimum was positively
|
|
22
|
+
* parsed, at least one candidate resolved, and every resolved candidate
|
|
23
|
+
* is definitively lower. Any uncertainty (file moved upstream,
|
|
24
|
+
* unparseable output, no candidate found) skips silently. The
|
|
25
25
|
* mach-error-hints translator still catches the real configure failure
|
|
26
26
|
* downstream.
|
|
27
27
|
*/
|
|
@@ -41,16 +41,16 @@ export interface ToolchainMismatch {
|
|
|
41
41
|
/** Engine-relative file the minimum was parsed from. */
|
|
42
42
|
declaredIn: string;
|
|
43
43
|
/**
|
|
44
|
-
* Every candidate that resolved
|
|
44
|
+
* Every candidate that resolved, all of them below the minimum
|
|
45
45
|
* (mach-resolution order: env override, mozbuild state dir, PATH).
|
|
46
46
|
*/
|
|
47
47
|
candidates: ToolchainCandidate[];
|
|
48
48
|
}
|
|
49
49
|
/**
|
|
50
50
|
* Returns the one-line notice to print after a download that hopped the
|
|
51
|
-
* Firefox
|
|
52
|
-
* download, same major, or unparseable versions
|
|
53
|
-
* must not spam every download with a false hint).
|
|
51
|
+
* Firefox major version, or undefined when no notice is warranted (first
|
|
52
|
+
* download, same major, or unparseable versions, since an unparseable
|
|
53
|
+
* version must not spam every download with a false hint).
|
|
54
54
|
*
|
|
55
55
|
* @param previousVersion - `downloadedVersion` recorded in state before this download
|
|
56
56
|
* @param newVersion - Version that was just downloaded
|
|
@@ -59,14 +59,14 @@ export declare function formatMajorVersionHopNotice(previousVersion: string | un
|
|
|
59
59
|
/**
|
|
60
60
|
* Reads the toolchain minimums the engine tree itself declares. Any file
|
|
61
61
|
* that is missing or no longer matches the expected declaration shape
|
|
62
|
-
* yields undefined for that tool
|
|
62
|
+
* yields undefined for that tool, never an error.
|
|
63
63
|
*/
|
|
64
64
|
export declare function readDeclaredToolchainMinimums(engineDir: string): Promise<Partial<Record<ToolchainTool, string>>>;
|
|
65
65
|
/**
|
|
66
66
|
* Compares the tree-declared toolchain minimums against the host binaries
|
|
67
67
|
* `mach configure` will resolve, in configure's own candidate order (env
|
|
68
|
-
* override, mozbuild state dir, PATH). A tool fails
|
|
69
|
-
* one candidate resolved and none of them meets the minimum
|
|
68
|
+
* override, mozbuild state dir, PATH). A tool fails only when at least
|
|
69
|
+
* one candidate resolved and none of them meets the minimum. Any single
|
|
70
70
|
* passing candidate passes the tool (configure will find it), and a tool
|
|
71
71
|
* with no resolvable candidate skips silently (see module header for the
|
|
72
72
|
* fail-soft rationale).
|
|
@@ -2,27 +2,27 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Toolchain-minimum awareness for Firefox source hops.
|
|
4
4
|
*
|
|
5
|
-
* When `fireforge download --force` moves the engine to a new Firefox
|
|
5
|
+
* When `fireforge download --force` moves the engine to a new Firefox major
|
|
6
6
|
* version, the tree's declared toolchain minimums (cbindgen, Rust)
|
|
7
|
-
* frequently move with it
|
|
7
|
+
* frequently move with it, and the first `fireforge build` then dies a few
|
|
8
8
|
* seconds into `mach configure` with a message whose remediation text names
|
|
9
9
|
* `./mach bootstrap`, the wrong tool for a FireForge-managed repo (e.g.
|
|
10
10
|
* `ERROR: cbindgen version 0.29.1 is too old. At least version 0.29.4 is
|
|
11
11
|
* required.`).
|
|
12
12
|
*
|
|
13
13
|
* Two layers:
|
|
14
|
-
* 1. {@link formatMajorVersionHopNotice}
|
|
14
|
+
* 1. {@link formatMajorVersionHopNotice}, a post-download nudge when the
|
|
15
15
|
* downloaded major differs from the previously downloaded one.
|
|
16
|
-
* 2. {@link runToolchainPreflight}
|
|
16
|
+
* 2. {@link runToolchainPreflight}, a cheap pre-build probe comparing the
|
|
17
17
|
* minimums the tree itself declares against the host binaries
|
|
18
18
|
* `mach configure` will resolve, probing configure's own candidate
|
|
19
19
|
* order: env override first, then the `~/.mozbuild` state-directory copy
|
|
20
20
|
* bootstrap installs, then PATH. Probing env-or-PATH alone blocks builds
|
|
21
21
|
* whose current tool lives in the state dir behind a stale PATH copy.
|
|
22
|
-
*
|
|
23
|
-
*
|
|
24
|
-
*
|
|
25
|
-
*
|
|
22
|
+
* Fail-soft: it reports a mismatch only when a minimum was positively
|
|
23
|
+
* parsed, at least one candidate resolved, and every resolved candidate
|
|
24
|
+
* is definitively lower. Any uncertainty (file moved upstream,
|
|
25
|
+
* unparseable output, no candidate found) skips silently. The
|
|
26
26
|
* mach-error-hints translator still catches the real configure failure
|
|
27
27
|
* downstream.
|
|
28
28
|
*/
|
|
@@ -62,16 +62,16 @@ const MINIMUM_DECLARATIONS = {
|
|
|
62
62
|
*
|
|
63
63
|
* `stateDirRelPaths` are the mach-state-directory locations
|
|
64
64
|
* `fireforge bootstrap` (via mozboot) installs the tool to. mach's configure
|
|
65
|
-
* tries the state directory
|
|
66
|
-
*
|
|
67
|
-
*
|
|
65
|
+
* tries the state directory before the PATH candidates (bindgen.configure's
|
|
66
|
+
* toolchain search path lists `~/.mozbuild/cbindgen/cbindgen` first), so the
|
|
67
|
+
* probe must too. Probing only env-or-PATH fails a
|
|
68
68
|
* build configure would have accepted whenever an old `~/.cargo/bin/
|
|
69
69
|
* cbindgen` shadows a current bootstrap-installed copy. Rust has no
|
|
70
|
-
* state-dir install
|
|
70
|
+
* state-dir install, since rustup owns it, so its list is empty.
|
|
71
71
|
*/
|
|
72
72
|
const HOST_PROBES = {
|
|
73
73
|
// `mach configure` honours the CBINDGEN env option (bindgen.configure's
|
|
74
|
-
// `option(env="CBINDGEN", ...)`), so the probe must too
|
|
74
|
+
// `option(env="CBINDGEN", ...)`), so the probe must too. Otherwise the
|
|
75
75
|
// preflight could veto a build configure would have accepted.
|
|
76
76
|
cbindgen: {
|
|
77
77
|
envVar: 'CBINDGEN',
|
|
@@ -82,7 +82,7 @@ const HOST_PROBES = {
|
|
|
82
82
|
};
|
|
83
83
|
/**
|
|
84
84
|
* Parses a dotted version string into numeric components. Trailing
|
|
85
|
-
* non-numeric suffixes are ignored
|
|
85
|
+
* non-numeric suffixes are ignored. Returns undefined when the string
|
|
86
86
|
* does not start with a number. (Same posture as the furnace version
|
|
87
87
|
* drift classifier, kept local so the two modules stay decoupled.)
|
|
88
88
|
*/
|
|
@@ -92,7 +92,7 @@ function parseVersionComponents(version) {
|
|
|
92
92
|
return undefined;
|
|
93
93
|
return match[1].split('.').map(Number);
|
|
94
94
|
}
|
|
95
|
-
/** Component-wise comparison
|
|
95
|
+
/** Component-wise comparison. Missing components count as 0. */
|
|
96
96
|
function isVersionLower(candidate, minimum) {
|
|
97
97
|
const length = Math.max(candidate.length, minimum.length);
|
|
98
98
|
for (let i = 0; i < length; i += 1) {
|
|
@@ -105,9 +105,9 @@ function isVersionLower(candidate, minimum) {
|
|
|
105
105
|
}
|
|
106
106
|
/**
|
|
107
107
|
* Returns the one-line notice to print after a download that hopped the
|
|
108
|
-
* Firefox
|
|
109
|
-
* download, same major, or unparseable versions
|
|
110
|
-
* must not spam every download with a false hint).
|
|
108
|
+
* Firefox major version, or undefined when no notice is warranted (first
|
|
109
|
+
* download, same major, or unparseable versions, since an unparseable
|
|
110
|
+
* version must not spam every download with a false hint).
|
|
111
111
|
*
|
|
112
112
|
* @param previousVersion - `downloadedVersion` recorded in state before this download
|
|
113
113
|
* @param newVersion - Version that was just downloaded
|
|
@@ -121,14 +121,14 @@ export function formatMajorVersionHopNotice(previousVersion, newVersion) {
|
|
|
121
121
|
return undefined;
|
|
122
122
|
if (previousMajor === newMajor)
|
|
123
123
|
return undefined;
|
|
124
|
-
return (`Firefox major version changed (${
|
|
124
|
+
return (`Firefox major version changed (${previousMajor} → ${newMajor}): ` +
|
|
125
125
|
'upstream toolchain minimums (cbindgen, Rust, …) may have moved with it. ' +
|
|
126
126
|
'Consider running "fireforge bootstrap" before the next build.');
|
|
127
127
|
}
|
|
128
128
|
/**
|
|
129
129
|
* Reads the toolchain minimums the engine tree itself declares. Any file
|
|
130
130
|
* that is missing or no longer matches the expected declaration shape
|
|
131
|
-
* yields undefined for that tool
|
|
131
|
+
* yields undefined for that tool, never an error.
|
|
132
132
|
*/
|
|
133
133
|
export async function readDeclaredToolchainMinimums(engineDir) {
|
|
134
134
|
const entries = Object.entries(MINIMUM_DECLARATIONS);
|
|
@@ -173,7 +173,7 @@ async function probeBinaryVersion(binary, versionPattern) {
|
|
|
173
173
|
}
|
|
174
174
|
/**
|
|
175
175
|
* Probes every candidate binary for a tool in mach's resolution order:
|
|
176
|
-
* the env override (which, when set, is the
|
|
176
|
+
* the env override (which, when set, is the only candidate, since configure
|
|
177
177
|
* uses it even when a better binary exists elsewhere), then the mozbuild
|
|
178
178
|
* state-directory copy bootstrap installs, then PATH. Candidates that
|
|
179
179
|
* fail to run or to parse are dropped silently.
|
|
@@ -196,8 +196,8 @@ async function probeHostToolCandidates(tool) {
|
|
|
196
196
|
/**
|
|
197
197
|
* Compares the tree-declared toolchain minimums against the host binaries
|
|
198
198
|
* `mach configure` will resolve, in configure's own candidate order (env
|
|
199
|
-
* override, mozbuild state dir, PATH). A tool fails
|
|
200
|
-
* one candidate resolved and none of them meets the minimum
|
|
199
|
+
* override, mozbuild state dir, PATH). A tool fails only when at least
|
|
200
|
+
* one candidate resolved and none of them meets the minimum. Any single
|
|
201
201
|
* passing candidate passes the tool (configure will find it), and a tool
|
|
202
202
|
* with no resolvable candidate skips silently (see module header for the
|
|
203
203
|
* fail-soft rationale).
|
|
@@ -1,9 +1,7 @@
|
|
|
1
|
-
/** Runs a clone command
|
|
1
|
+
/** Runs a clone command. Throws on non-zero exit. */
|
|
2
2
|
export type CloneExecutor = (command: string, args: string[]) => Promise<void>;
|
|
3
3
|
/** How this host can materialise a tree. */
|
|
4
4
|
export type CowCapability = 'clonefile' | 'reflink' | 'none';
|
|
5
|
-
/** Per-platform `cp` argv prefix for a CoW copy of one entry. */
|
|
6
|
-
export declare function cowCopyArgs(capability: Exclude<CowCapability, 'none'>): string[];
|
|
7
5
|
/**
|
|
8
6
|
* Probes CoW support in `dir` by cloning a tiny probe file there.
|
|
9
7
|
* Non-darwin/linux platforms report 'none' without probing.
|
|
@@ -11,8 +9,8 @@ export declare function cowCopyArgs(capability: Exclude<CowCapability, 'none'>):
|
|
|
11
9
|
export declare function detectCowSupport(dir: string, platform?: NodeJS.Platform, executor?: CloneExecutor): Promise<CowCapability>;
|
|
12
10
|
/**
|
|
13
11
|
* Copies one directory entry (file or directory, recursively) from
|
|
14
|
-
* `sourcePath` to `destinationPath` using the given capability
|
|
12
|
+
* `sourcePath` to `destinationPath` using the given capability:
|
|
15
13
|
* clonefile/reflink when available, a plain physical copy under
|
|
16
|
-
* 'none' (the `--force-copy` path
|
|
14
|
+
* 'none' (the `--force-copy` path, and the caller gates on the flag).
|
|
17
15
|
*/
|
|
18
16
|
export declare function cloneEntry(capability: CowCapability, sourcePath: string, destinationPath: string, platform?: NodeJS.Platform, executor?: CloneExecutor): Promise<void>;
|
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
/**
|
|
3
3
|
* Copy-on-write cloning for `fireforge tree`.
|
|
4
4
|
*
|
|
5
|
-
* Capability is probed
|
|
6
|
-
* `cp --reflink=always` (btrfs/XFS) in the actual destination
|
|
7
|
-
* so the verdict is truthful for the volume the trees will live
|
|
8
|
-
* filesystem without CoW support
|
|
5
|
+
* Capability is probed by doing it: a tiny `cp -c` (APFS clonefile) or
|
|
6
|
+
* `cp --reflink=always` (btrfs/XFS) runs in the actual destination
|
|
7
|
+
* directory, so the verdict is truthful for the volume the trees will live
|
|
8
|
+
* on. A filesystem without CoW support refuses honestly. `--force-copy` opts
|
|
9
9
|
* into a full physical copy but is never implied (a Firefox tree can be
|
|
10
10
|
* tens of gigabytes).
|
|
11
11
|
*
|
|
@@ -20,11 +20,11 @@ import { exec } from '../utils/process.js';
|
|
|
20
20
|
const defaultExecutor = async (command, args) => {
|
|
21
21
|
const result = await exec(command, args);
|
|
22
22
|
if (result.exitCode !== 0) {
|
|
23
|
-
throw new Error(`${command} ${args.join(' ')} failed (exit ${
|
|
23
|
+
throw new Error(`${command} ${args.join(' ')} failed (exit ${result.exitCode}): ${result.stderr}`);
|
|
24
24
|
}
|
|
25
25
|
};
|
|
26
26
|
/** Per-platform `cp` argv prefix for a CoW copy of one entry. */
|
|
27
|
-
|
|
27
|
+
function cowCopyArgs(capability) {
|
|
28
28
|
return capability === 'clonefile' ? ['-c', '-R', '-p'] : ['--reflink=always', '-a'];
|
|
29
29
|
}
|
|
30
30
|
/**
|
|
@@ -57,9 +57,9 @@ export async function detectCowSupport(dir, platform = process.platform, executo
|
|
|
57
57
|
}
|
|
58
58
|
/**
|
|
59
59
|
* Copies one directory entry (file or directory, recursively) from
|
|
60
|
-
* `sourcePath` to `destinationPath` using the given capability
|
|
60
|
+
* `sourcePath` to `destinationPath` using the given capability:
|
|
61
61
|
* clonefile/reflink when available, a plain physical copy under
|
|
62
|
-
* 'none' (the `--force-copy` path
|
|
62
|
+
* 'none' (the `--force-copy` path, and the caller gates on the flag).
|
|
63
63
|
*/
|
|
64
64
|
export async function cloneEntry(capability, sourcePath, destinationPath, platform = process.platform, executor = defaultExecutor) {
|
|
65
65
|
const args = capability === 'none'
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { type TreeMarker } from './tree-store.js';
|
|
2
2
|
/**
|
|
3
|
-
* Per-command verdicts. `allowed` runs unconditionally
|
|
4
|
-
* runs in a tree
|
|
3
|
+
* Per-command verdicts. `allowed` runs unconditionally. `refused` never
|
|
4
|
+
* runs in a tree. `conditional` consults `TREE_CONDITIONAL_CHECKS` with
|
|
5
5
|
* the invoked subcommand chain, parsed options, and the tree marker.
|
|
6
6
|
*/
|
|
7
7
|
export declare const TREE_COMMAND_VERDICTS: Readonly<Record<string, 'allowed' | 'refused' | 'conditional'>>;
|
|
8
8
|
interface ConditionalInput {
|
|
9
9
|
/** Subcommand chain below the top-level command (e.g. ['staged-dependency']). */
|
|
10
10
|
subcommands: readonly string[];
|
|
11
|
-
/** Merged options of the
|
|
11
|
+
/** Merged options of the action command (leaf). */
|
|
12
12
|
options: Readonly<Record<string, unknown>>;
|
|
13
13
|
/** Positional args of the action command. */
|
|
14
14
|
args: readonly unknown[];
|