@hominis/fireforge 0.35.0 → 0.36.0
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 +29 -0
- package/README.md +34 -9
- package/dist/bin/fireforge.js +21 -6
- package/dist/src/cli.js +22 -5
- package/dist/src/commands/bootstrap-checks.js +0 -1
- package/dist/src/commands/bootstrap.d.ts +2 -1
- package/dist/src/commands/bootstrap.js +16 -7
- package/dist/src/commands/build.js +4 -3
- package/dist/src/commands/config.js +30 -10
- package/dist/src/commands/discard.js +18 -3
- package/dist/src/commands/doctor/post-rebase-audit.js +0 -1
- package/dist/src/commands/doctor-check-core.js +0 -1
- package/dist/src/commands/doctor-external-toolchains.d.ts +3 -0
- package/dist/src/commands/doctor-external-toolchains.js +54 -0
- package/dist/src/commands/doctor-furnace-jar.js +0 -1
- package/dist/src/commands/doctor-furnace-manifest-sync.js +0 -1
- package/dist/src/commands/doctor-furnace.js +2 -2
- package/dist/src/commands/doctor-working-tree.js +0 -1
- package/dist/src/commands/doctor.js +4 -1
- package/dist/src/commands/download.js +28 -13
- package/dist/src/commands/export-all.js +5 -3
- package/dist/src/commands/export-flow.js +12 -7
- package/dist/src/commands/export-placement-gate.js +0 -1
- package/dist/src/commands/export-placement-policy.js +0 -1
- package/dist/src/commands/export-shared.d.ts +5 -1
- package/dist/src/commands/export-shared.js +18 -6
- package/dist/src/commands/export.js +15 -10
- package/dist/src/commands/furnace/apply.js +22 -6
- package/dist/src/commands/furnace/chrome-doc-remove.js +0 -1
- package/dist/src/commands/furnace/chrome-doc-templates.js +0 -1
- package/dist/src/commands/furnace/chrome-doc-tests.js +0 -1
- package/dist/src/commands/furnace/chrome-doc.js +0 -1
- package/dist/src/commands/furnace/create-browser-test.js +0 -1
- package/dist/src/commands/furnace/create-dry-run.js +0 -1
- package/dist/src/commands/furnace/create-features.js +0 -1
- package/dist/src/commands/furnace/create-mochikit.js +0 -1
- package/dist/src/commands/furnace/create-readback.js +0 -1
- package/dist/src/commands/furnace/create-templates.js +0 -1
- package/dist/src/commands/furnace/create-validation.js +0 -1
- package/dist/src/commands/furnace/create-xpcshell.js +0 -1
- package/dist/src/commands/furnace/create.js +0 -1
- package/dist/src/commands/furnace/deploy.js +7 -83
- package/dist/src/commands/furnace/diff.js +0 -1
- package/dist/src/commands/furnace/index.js +59 -25
- package/dist/src/commands/furnace/init.js +0 -1
- package/dist/src/commands/furnace/list.js +0 -1
- package/dist/src/commands/furnace/override.js +0 -1
- package/dist/src/commands/furnace/preview.js +3 -3
- package/dist/src/commands/furnace/refresh.js +0 -1
- package/dist/src/commands/furnace/remove-state.d.ts +15 -0
- package/dist/src/commands/furnace/remove-state.js +47 -1
- package/dist/src/commands/furnace/remove.js +3 -9
- package/dist/src/commands/furnace/rename-browser-test.js +1 -5
- package/dist/src/commands/furnace/rename-helpers.d.ts +6 -0
- package/dist/src/commands/furnace/rename-helpers.js +30 -1
- package/dist/src/commands/furnace/rename-xpcshell.js +7 -6
- package/dist/src/commands/furnace/rename.js +15 -36
- package/dist/src/commands/furnace/scan.js +0 -1
- package/dist/src/commands/furnace/status.js +0 -1
- package/dist/src/commands/furnace/sync.js +76 -4
- package/dist/src/commands/furnace/validate.js +0 -1
- package/dist/src/commands/furnace/validation-output.js +0 -1
- package/dist/src/commands/import.js +35 -9
- package/dist/src/commands/lint-per-patch.js +19 -7
- package/dist/src/commands/lint.js +13 -3
- package/dist/src/commands/manifest.js +1 -2
- package/dist/src/commands/package.js +2 -1
- package/dist/src/commands/patch/compact.js +1 -1
- package/dist/src/commands/patch/delete.js +1 -1
- package/dist/src/commands/patch/index.js +1 -1
- package/dist/src/commands/patch/lint-ignore.js +21 -6
- package/dist/src/commands/patch/move-files.js +1 -1
- package/dist/src/commands/patch/patch-context.js +0 -1
- package/dist/src/commands/patch/rename.js +4 -4
- package/dist/src/commands/patch/reorder.js +3 -4
- package/dist/src/commands/patch/split-plan.js +2 -1
- package/dist/src/commands/patch/split.js +4 -4
- package/dist/src/commands/patch/staged-dependency.js +1 -1
- package/dist/src/commands/patch/tier.js +18 -5
- package/dist/src/commands/re-export-bulk-scan.js +0 -1
- package/dist/src/commands/re-export-files.js +1 -1
- package/dist/src/commands/re-export-options.js +0 -1
- package/dist/src/commands/re-export-scan.js +0 -1
- package/dist/src/commands/re-export.js +6 -4
- package/dist/src/commands/rebase/abort.js +2 -9
- package/dist/src/commands/rebase/confirm.js +0 -1
- package/dist/src/commands/rebase/conflict-summary.js +0 -1
- package/dist/src/commands/rebase/continue.js +0 -1
- package/dist/src/commands/rebase/index.d.ts +1 -1
- package/dist/src/commands/rebase/index.js +10 -15
- package/dist/src/commands/rebase/patch-loop.js +38 -7
- package/dist/src/commands/rebase/summary.js +2 -3
- package/dist/src/commands/rebase.js +0 -1
- package/dist/src/commands/register.js +1 -1
- package/dist/src/commands/reset.js +16 -9
- package/dist/src/commands/resolve.js +2 -2
- package/dist/src/commands/run.js +4 -4
- package/dist/src/commands/setup-support.js +0 -1
- package/dist/src/commands/setup.js +1 -2
- package/dist/src/commands/source.js +1 -2
- package/dist/src/commands/status-output.js +1 -12
- package/dist/src/commands/status.js +147 -133
- package/dist/src/commands/test-appdir.js +0 -1
- package/dist/src/commands/test-diagnose.js +18 -2
- package/dist/src/commands/test-modes.d.ts +15 -0
- package/dist/src/commands/test-modes.js +61 -0
- package/dist/src/commands/test-register.d.ts +4 -0
- package/dist/src/commands/test-register.js +64 -0
- package/dist/src/commands/test-run.d.ts +23 -7
- package/dist/src/commands/test-run.js +15 -14
- package/dist/src/commands/test.d.ts +0 -4
- package/dist/src/commands/test.js +85 -86
- package/dist/src/commands/token-coverage.js +0 -1
- package/dist/src/commands/token.js +1 -2
- package/dist/src/commands/typecheck.js +1 -1
- package/dist/src/commands/verify.js +3 -9
- package/dist/src/commands/watch.js +5 -1
- package/dist/src/commands/wire.js +1 -1
- package/dist/src/core/ast-utils.js +0 -1
- package/dist/src/core/brand-validation.js +0 -1
- package/dist/src/core/branding.js +0 -1
- package/dist/src/core/browser-wire.js +0 -1
- package/dist/src/core/build-audit-platform.js +0 -1
- package/dist/src/core/build-audit-registration.js +0 -1
- package/dist/src/core/build-audit-resolve.js +0 -1
- package/dist/src/core/build-audit-transforms.js +0 -1
- package/dist/src/core/build-audit.js +0 -1
- package/dist/src/core/build-baseline-types.js +0 -1
- package/dist/src/core/build-baseline.js +0 -1
- package/dist/src/core/build-prepare.js +2 -2
- package/dist/src/core/config-mutate.js +0 -1
- package/dist/src/core/config-paths.d.ts +2 -2
- package/dist/src/core/config-paths.js +6 -1
- package/dist/src/core/config-state.js +0 -1
- package/dist/src/core/config-validate-patch-policy.js +0 -1
- package/dist/src/core/config-validate-test-toolchains.d.ts +8 -0
- package/dist/src/core/config-validate-test-toolchains.js +105 -0
- package/dist/src/core/config-validate.js +3 -1
- package/dist/src/core/config.js +0 -1
- package/dist/src/core/destructive.js +0 -1
- package/dist/src/core/diff-hunks.js +13 -7
- package/dist/src/core/engine-changes.js +0 -1
- package/dist/src/core/engine-session-lock.d.ts +12 -0
- package/dist/src/core/engine-session-lock.js +45 -0
- package/dist/src/core/file-lock.d.ts +8 -0
- package/dist/src/core/file-lock.js +157 -48
- package/dist/src/core/firefox-archive.d.ts +4 -0
- package/dist/src/core/firefox-archive.js +6 -1
- package/dist/src/core/firefox-cache.js +60 -4
- package/dist/src/core/firefox-download.js +0 -1
- package/dist/src/core/firefox-extract.js +75 -16
- package/dist/src/core/firefox-ignorefile.js +0 -1
- package/dist/src/core/firefox.d.ts +12 -0
- package/dist/src/core/firefox.js +64 -2
- package/dist/src/core/furnace-apply-dry-run.js +0 -1
- package/dist/src/core/furnace-apply-ftl.d.ts +7 -3
- package/dist/src/core/furnace-apply-ftl.js +10 -5
- package/dist/src/core/furnace-apply-helpers.js +0 -1
- package/dist/src/core/furnace-apply-output.js +2 -2
- package/dist/src/core/furnace-apply.d.ts +7 -1
- package/dist/src/core/furnace-apply.js +47 -13
- package/dist/src/core/furnace-checksum-utils.js +0 -1
- package/dist/src/core/furnace-config-array-utils.js +0 -1
- package/dist/src/core/furnace-config-custom.js +0 -1
- package/dist/src/core/furnace-config-order.js +0 -1
- package/dist/src/core/furnace-config-tokens.js +0 -1
- package/dist/src/core/furnace-config-validate.js +0 -1
- package/dist/src/core/furnace-config.d.ts +11 -0
- package/dist/src/core/furnace-config.js +37 -1
- package/dist/src/core/furnace-constants.js +0 -1
- package/dist/src/core/furnace-css-fragments.js +0 -1
- package/dist/src/core/furnace-graph-utils.js +0 -1
- package/dist/src/core/furnace-jsconfig.d.ts +2 -3
- package/dist/src/core/furnace-jsconfig.js +25 -18
- package/dist/src/core/furnace-marker.js +0 -1
- package/dist/src/core/furnace-operation.js +0 -1
- package/dist/src/core/furnace-refresh.js +0 -1
- package/dist/src/core/furnace-registration-ast.d.ts +14 -0
- package/dist/src/core/furnace-registration-ast.js +1 -2
- package/dist/src/core/furnace-registration-remove.js +0 -1
- package/dist/src/core/furnace-registration-validate.js +1 -5
- package/dist/src/core/furnace-registration.js +0 -1
- package/dist/src/core/furnace-rollback.js +0 -1
- package/dist/src/core/furnace-scanner.js +0 -1
- package/dist/src/core/furnace-staleness.js +0 -1
- package/dist/src/core/furnace-state-persist.d.ts +72 -0
- package/dist/src/core/furnace-state-persist.js +118 -0
- package/dist/src/core/furnace-step-errors.d.ts +23 -0
- package/dist/src/core/furnace-step-errors.js +25 -0
- package/dist/src/core/furnace-stories.js +0 -1
- package/dist/src/core/furnace-validate-accessibility.js +0 -1
- package/dist/src/core/furnace-validate-checks.js +0 -1
- package/dist/src/core/furnace-validate-compatibility.js +0 -1
- package/dist/src/core/furnace-validate-helpers.js +0 -1
- package/dist/src/core/furnace-validate-registration.js +7 -7
- package/dist/src/core/furnace-validate-structure.d.ts +8 -0
- package/dist/src/core/furnace-validate-structure.js +11 -2
- package/dist/src/core/furnace-validate.js +0 -1
- package/dist/src/core/furnace-version-drift.d.ts +6 -3
- package/dist/src/core/furnace-version-drift.js +6 -4
- package/dist/src/core/git-base.js +0 -1
- package/dist/src/core/git-diff.js +0 -1
- package/dist/src/core/git-file-ops.js +0 -1
- package/dist/src/core/git-status.d.ts +13 -0
- package/dist/src/core/git-status.js +32 -2
- package/dist/src/core/git.d.ts +10 -1
- package/dist/src/core/git.js +63 -6
- package/dist/src/core/license-headers.js +0 -1
- package/dist/src/core/lint-cache.js +0 -1
- package/dist/src/core/lint-projection.js +0 -1
- package/dist/src/core/mach-build-artifacts.js +0 -1
- package/dist/src/core/mach-error-hints.js +0 -1
- package/dist/src/core/mach-mozconfig.js +0 -1
- package/dist/src/core/mach-python.js +0 -1
- package/dist/src/core/mach-resource-shim.js +0 -1
- package/dist/src/core/mach.js +0 -1
- package/dist/src/core/manifest-helpers.js +0 -1
- package/dist/src/core/manifest-register.js +0 -1
- package/dist/src/core/manifest-rules.js +0 -1
- package/dist/src/core/manifest-tokenizers.js +0 -1
- package/dist/src/core/marionette-port.d.ts +8 -0
- package/dist/src/core/marionette-port.js +34 -3
- package/dist/src/core/marionette-preflight.js +0 -1
- package/dist/src/core/markdown-table.js +0 -1
- package/dist/src/core/ownership-table.js +2 -9
- package/dist/src/core/parser-fallback.js +0 -1
- package/dist/src/core/patch-apply-fuzz.d.ts +27 -9
- package/dist/src/core/patch-apply-fuzz.js +71 -34
- package/dist/src/core/patch-apply.d.ts +30 -0
- package/dist/src/core/patch-apply.js +101 -18
- package/dist/src/core/patch-artifact-normalize.d.ts +18 -5
- package/dist/src/core/patch-artifact-normalize.js +19 -15
- package/dist/src/core/patch-export-coverage.js +0 -1
- package/dist/src/core/patch-export-metadata.js +0 -1
- package/dist/src/core/patch-export-update.js +2 -3
- package/dist/src/core/patch-export.d.ts +2 -6
- package/dist/src/core/patch-export.js +24 -48
- package/dist/src/core/patch-files.js +0 -1
- package/dist/src/core/patch-identifier-suggest.js +0 -1
- package/dist/src/core/patch-lint-checkjs.js +0 -1
- package/dist/src/core/patch-lint-chrome-jsdoc.js +0 -1
- package/dist/src/core/patch-lint-cross.js +0 -1
- package/dist/src/core/patch-lint-css.js +0 -1
- package/dist/src/core/patch-lint-diff-tag.js +0 -1
- package/dist/src/core/patch-lint-diff.d.ts +2 -1
- package/dist/src/core/patch-lint-diff.js +17 -32
- package/dist/src/core/patch-lint-imports.js +0 -1
- package/dist/src/core/patch-lint-jsdoc.js +0 -1
- package/dist/src/core/patch-lint-observer.js +0 -1
- package/dist/src/core/patch-lint-ownership.js +0 -1
- package/dist/src/core/patch-lint-reexports.js +0 -1
- package/dist/src/core/patch-lint.d.ts +37 -2
- package/dist/src/core/patch-lint.js +47 -34
- package/dist/src/core/patch-lock.js +0 -1
- package/dist/src/core/patch-manifest-consistency.js +9 -1
- package/dist/src/core/patch-manifest-io.d.ts +16 -0
- package/dist/src/core/patch-manifest-io.js +30 -5
- package/dist/src/core/patch-manifest-query.js +18 -10
- package/dist/src/core/patch-manifest-resolve.js +0 -1
- package/dist/src/core/patch-manifest-validate.js +0 -1
- package/dist/src/core/patch-manifest.d.ts +1 -1
- package/dist/src/core/patch-manifest.js +1 -2
- package/dist/src/core/patch-parse.d.ts +59 -0
- package/dist/src/core/patch-parse.js +209 -92
- package/dist/src/core/patch-policy.js +0 -1
- package/dist/src/core/patch-registration-refs.js +16 -26
- package/dist/src/core/patch-source-metadata.js +0 -1
- package/dist/src/core/patch-transform.d.ts +4 -0
- package/dist/src/core/patch-transform.js +30 -38
- package/dist/src/core/rebase-session.js +0 -1
- package/dist/src/core/register-browser-content.js +0 -1
- package/dist/src/core/register-module.js +0 -1
- package/dist/src/core/register-result.js +0 -1
- package/dist/src/core/register-scaffold.js +0 -1
- package/dist/src/core/register-shared-css.js +0 -1
- package/dist/src/core/register-test-manifest.js +0 -1
- package/dist/src/core/register-xpcshell-test.js +0 -1
- package/dist/src/core/shared-ftl.js +0 -1
- package/dist/src/core/signal-critical.js +0 -1
- package/dist/src/core/smoke-patterns.js +0 -1
- package/dist/src/core/state-file.js +0 -1
- package/dist/src/core/status-classify.d.ts +16 -0
- package/dist/src/core/status-classify.js +24 -16
- package/dist/src/core/test-harness-crash.d.ts +64 -7
- package/dist/src/core/test-harness-crash.js +196 -15
- package/dist/src/core/test-harness-output.js +0 -1
- package/dist/src/core/test-path-scope.d.ts +21 -13
- package/dist/src/core/test-path-scope.js +43 -28
- package/dist/src/core/test-stale-check.js +0 -1
- package/dist/src/core/test-stale-symlink.js +0 -1
- package/dist/src/core/test-xpcshell-retry.js +0 -1
- package/dist/src/core/token-coverage.js +0 -1
- package/dist/src/core/token-dark-mode.js +0 -1
- package/dist/src/core/token-docs.js +0 -1
- package/dist/src/core/token-manager.js +0 -1
- package/dist/src/core/token-scaffold.js +0 -1
- package/dist/src/core/token-variant.js +0 -1
- package/dist/src/core/toolchain-preflight.d.ts +31 -10
- package/dist/src/core/toolchain-preflight.js +97 -36
- package/dist/src/core/typecheck-shim.js +13 -1
- package/dist/src/core/typecheck.js +0 -1
- package/dist/src/core/wire-destroy.js +0 -1
- package/dist/src/core/wire-dom-fragment.js +0 -1
- package/dist/src/core/wire-init.js +0 -1
- package/dist/src/core/wire-subscript.js +0 -1
- package/dist/src/core/wire-targets.js +0 -1
- package/dist/src/core/wire-utils.js +0 -1
- package/dist/src/core/xpcshell-appdir.js +1 -4
- package/dist/src/errors/base.d.ts +29 -0
- package/dist/src/errors/base.js +35 -1
- package/dist/src/errors/build.js +0 -1
- package/dist/src/errors/codes.d.ts +6 -0
- package/dist/src/errors/codes.js +6 -1
- package/dist/src/errors/config.js +0 -1
- package/dist/src/errors/download.js +0 -1
- package/dist/src/errors/furnace.d.ts +11 -1
- package/dist/src/errors/furnace.js +6 -5
- package/dist/src/errors/git.js +0 -1
- package/dist/src/errors/patch.d.ts +17 -0
- package/dist/src/errors/patch.js +29 -1
- package/dist/src/errors/rebase.js +0 -1
- package/dist/src/errors/run.js +1 -1
- package/dist/src/index.js +0 -1
- package/dist/src/types/cli.js +0 -1
- package/dist/src/types/commands/index.js +0 -1
- package/dist/src/types/commands/options.d.ts +13 -5
- package/dist/src/types/commands/options.js +0 -1
- package/dist/src/types/commands/patches.d.ts +8 -0
- package/dist/src/types/commands/patches.js +0 -1
- package/dist/src/types/commands/project.d.ts +11 -2
- package/dist/src/types/commands/project.js +0 -1
- package/dist/src/types/config.d.ts +32 -0
- package/dist/src/types/config.js +0 -1
- package/dist/src/types/furnace.d.ts +10 -0
- package/dist/src/types/furnace.js +0 -1
- package/dist/src/types/index.js +0 -1
- package/dist/src/types/typecheck.js +0 -1
- package/dist/src/utils/elapsed.js +0 -1
- package/dist/src/utils/errors.js +0 -1
- package/dist/src/utils/fs.js +37 -5
- package/dist/src/utils/logger.d.ts +7 -0
- package/dist/src/utils/logger.js +85 -3
- package/dist/src/utils/options.d.ts +15 -0
- package/dist/src/utils/options.js +25 -1
- package/dist/src/utils/package-root.js +11 -4
- package/dist/src/utils/parse.js +0 -1
- package/dist/src/utils/paths.js +0 -1
- package/dist/src/utils/platform.js +0 -1
- package/dist/src/utils/process.d.ts +33 -4
- package/dist/src/utils/process.js +183 -28
- package/dist/src/utils/regex.d.ts +13 -3
- package/dist/src/utils/regex.js +53 -4
- package/dist/src/utils/validation.d.ts +0 -12
- package/dist/src/utils/validation.js +13 -26
- package/package.json +8 -7
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { PatchLintIssue } from '../types/commands/index.js';
|
|
2
|
-
import type { FireForgeConfig } from '../types/config.js';
|
|
2
|
+
import type { FireForgeConfig, ProjectLicense } from '../types/config.js';
|
|
3
3
|
import { type CommentStyle } from './license-headers.js';
|
|
4
4
|
import { lintPatchedCss } from './patch-lint-css.js';
|
|
5
5
|
export * from './patch-lint-reexports.js';
|
|
@@ -26,7 +26,42 @@ export declare function isTestFile(file: string): boolean;
|
|
|
26
26
|
*/
|
|
27
27
|
export declare function commentStyleForFile(file: string): CommentStyle | null;
|
|
28
28
|
/**
|
|
29
|
-
*
|
|
29
|
+
* Decides whether a NEW file's leading header satisfies the
|
|
30
|
+
* `missing-license-header` rule. Single owner of the acceptance policy —
|
|
31
|
+
* `lintNewFileHeaders` (the rule) and `autoFixLicenseHeaders` (the
|
|
32
|
+
* interactive export fixer) must agree, or the fixer offers to stack a
|
|
33
|
+
* second header onto a file the lint already accepts.
|
|
34
|
+
*
|
|
35
|
+
* Accepted shapes, in order:
|
|
36
|
+
* - the project's own header for the file's comment style;
|
|
37
|
+
* - under `browser/branding/`, ANY recognised license header in the
|
|
38
|
+
* matching style: the setup-generated branding directory is copied
|
|
39
|
+
* from Firefox's `unofficial` template and arrives with Mozilla
|
|
40
|
+
* MPL-2.0 headers — legitimate for copyright purposes (the assets are
|
|
41
|
+
* Mozilla's) even when the fork's own code is 0BSD / EUPL-1.2 /
|
|
42
|
+
* GPL-2.0-or-later;
|
|
43
|
+
* - on an MPL-2.0 project, any recognised header in the matching style;
|
|
44
|
+
* - the verbatim upstream MPL-2.0 block header (`/* … *\/`, optionally
|
|
45
|
+
* behind a leading editor-directive comment) REGARDLESS of the
|
|
46
|
+
* project license, on any file whose comment syntax is the block form
|
|
47
|
+
* (JS and CSS): a file copied from the Firefox tree legitimately
|
|
48
|
+
* keeps Mozilla's header for provenance in an EUPL/GPL/0BSD project
|
|
49
|
+
* too. 0.35.0 accepted this on JS only; field verification showed a
|
|
50
|
+
* derived CSS file carrying the identical three-line block header
|
|
51
|
+
* still needed a patch-level lintIgnore. Only the block form is
|
|
52
|
+
* accepted — the `// `-style MPL header is FireForge-generated, not
|
|
53
|
+
* upstream provenance — and `hash`-style files (FTL) stay excluded
|
|
54
|
+
* because `/* … *\/` is not a comment there.
|
|
55
|
+
*
|
|
56
|
+
* @param file - Engine-relative path of the new file
|
|
57
|
+
* @param content - File content
|
|
58
|
+
* @param style - Comment style resolved for the file
|
|
59
|
+
* @param license - The project license
|
|
60
|
+
*/
|
|
61
|
+
export declare function isAcceptableNewFileHeader(file: string, content: string, style: CommentStyle, license: ProjectLicense): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Checks new files for required license headers (acceptance policy in
|
|
64
|
+
* {@link isAcceptableNewFileHeader}).
|
|
30
65
|
*
|
|
31
66
|
* @param repoDir - Absolute path to the engine directory
|
|
32
67
|
* @param newFiles - New file paths (relative to repoDir)
|
|
@@ -211,7 +211,52 @@ export function commentStyleForFile(file) {
|
|
|
211
211
|
// License header lint
|
|
212
212
|
// ---------------------------------------------------------------------------
|
|
213
213
|
/**
|
|
214
|
-
*
|
|
214
|
+
* Decides whether a NEW file's leading header satisfies the
|
|
215
|
+
* `missing-license-header` rule. Single owner of the acceptance policy —
|
|
216
|
+
* `lintNewFileHeaders` (the rule) and `autoFixLicenseHeaders` (the
|
|
217
|
+
* interactive export fixer) must agree, or the fixer offers to stack a
|
|
218
|
+
* second header onto a file the lint already accepts.
|
|
219
|
+
*
|
|
220
|
+
* Accepted shapes, in order:
|
|
221
|
+
* - the project's own header for the file's comment style;
|
|
222
|
+
* - under `browser/branding/`, ANY recognised license header in the
|
|
223
|
+
* matching style: the setup-generated branding directory is copied
|
|
224
|
+
* from Firefox's `unofficial` template and arrives with Mozilla
|
|
225
|
+
* MPL-2.0 headers — legitimate for copyright purposes (the assets are
|
|
226
|
+
* Mozilla's) even when the fork's own code is 0BSD / EUPL-1.2 /
|
|
227
|
+
* GPL-2.0-or-later;
|
|
228
|
+
* - on an MPL-2.0 project, any recognised header in the matching style;
|
|
229
|
+
* - the verbatim upstream MPL-2.0 block header (`/* … *\/`, optionally
|
|
230
|
+
* behind a leading editor-directive comment) REGARDLESS of the
|
|
231
|
+
* project license, on any file whose comment syntax is the block form
|
|
232
|
+
* (JS and CSS): a file copied from the Firefox tree legitimately
|
|
233
|
+
* keeps Mozilla's header for provenance in an EUPL/GPL/0BSD project
|
|
234
|
+
* too. 0.35.0 accepted this on JS only; field verification showed a
|
|
235
|
+
* derived CSS file carrying the identical three-line block header
|
|
236
|
+
* still needed a patch-level lintIgnore. Only the block form is
|
|
237
|
+
* accepted — the `// `-style MPL header is FireForge-generated, not
|
|
238
|
+
* upstream provenance — and `hash`-style files (FTL) stay excluded
|
|
239
|
+
* because `/* … *\/` is not a comment there.
|
|
240
|
+
*
|
|
241
|
+
* @param file - Engine-relative path of the new file
|
|
242
|
+
* @param content - File content
|
|
243
|
+
* @param style - Comment style resolved for the file
|
|
244
|
+
* @param license - The project license
|
|
245
|
+
*/
|
|
246
|
+
export function isAcceptableNewFileHeader(file, content, style, license) {
|
|
247
|
+
if (content.startsWith(getLicenseHeader(license, style)))
|
|
248
|
+
return true;
|
|
249
|
+
if (file.startsWith('browser/branding/') && hasAnyLicenseHeader(content, style))
|
|
250
|
+
return true;
|
|
251
|
+
if (license === 'MPL-2.0' && hasAnyLicenseHeader(content, style))
|
|
252
|
+
return true;
|
|
253
|
+
if ((style === 'js' || style === 'css') && hasUpstreamMplBlockHeader(content))
|
|
254
|
+
return true;
|
|
255
|
+
return false;
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Checks new files for required license headers (acceptance policy in
|
|
259
|
+
* {@link isAcceptableNewFileHeader}).
|
|
215
260
|
*
|
|
216
261
|
* @param repoDir - Absolute path to the engine directory
|
|
217
262
|
* @param newFiles - New file paths (relative to repoDir)
|
|
@@ -229,38 +274,7 @@ export async function lintNewFileHeaders(repoDir, newFiles, config) {
|
|
|
229
274
|
if (!(await pathExists(filePath)))
|
|
230
275
|
continue;
|
|
231
276
|
const content = await readText(filePath);
|
|
232
|
-
|
|
233
|
-
// Auto-exempt `browser/branding/` when the file carries ANY recognised
|
|
234
|
-
// license header in the matching comment style. The setup-generated
|
|
235
|
-
// branding directory is copied from Firefox's `unofficial` template,
|
|
236
|
-
// which arrives with Mozilla MPL-2.0 headers — those are legitimate
|
|
237
|
-
// for copyright purposes (the assets are Mozilla's) even when the
|
|
238
|
-
// fork's own code is 0BSD / EUPL-1.2 / GPL-2.0-or-later. The narrower
|
|
239
|
-
// license-match rule would force operators to either rewrite the
|
|
240
|
-
// copied headers (misrepresenting authorship) or suppress the lint
|
|
241
|
-
// with `--skip-lint` (hiding real issues elsewhere).
|
|
242
|
-
if (content.startsWith(expectedHeader))
|
|
243
|
-
continue;
|
|
244
|
-
if (file.startsWith('browser/branding/') && hasAnyLicenseHeader(content, style))
|
|
245
|
-
continue;
|
|
246
|
-
// Accept the MPL-2.0 block-comment form (`/* ... */` with leading `*`)
|
|
247
|
-
// for any JS file — that is the canonical upstream Firefox header
|
|
248
|
-
// shape, and `hasAnyLicenseHeader` above also recognises it. The
|
|
249
|
-
// explicit guard mirrors the branding carve-out so operators using the
|
|
250
|
-
// standard Mozilla header on a JS file (e.g. one copied from upstream
|
|
251
|
-
// browser/base/content) do not need `--skip-lint` to land it.
|
|
252
|
-
if (license === 'MPL-2.0' && hasAnyLicenseHeader(content, style))
|
|
253
|
-
continue;
|
|
254
|
-
// Accept the verbatim upstream MPL block header on new JS files
|
|
255
|
-
// REGARDLESS of the project license: a file copied from the Firefox
|
|
256
|
-
// tree legitimately keeps Mozilla's header for provenance in an
|
|
257
|
-
// EUPL/GPL/0BSD project too. The carve-out above is gated on the
|
|
258
|
-
// project being MPL-2.0 itself, which made this documented case dead
|
|
259
|
-
// code for every other license — consumers carried repo-side audit
|
|
260
|
-
// workarounds (recorded 2026-07-04 in the Hominis FORGE.md). Only
|
|
261
|
-
// the block-comment form is accepted; the `// `-style MPL header is
|
|
262
|
-
// FireForge-generated, not upstream provenance.
|
|
263
|
-
if (style === 'js' && hasUpstreamMplBlockHeader(content))
|
|
277
|
+
if (isAcceptableNewFileHeader(file, content, style, license))
|
|
264
278
|
continue;
|
|
265
279
|
issues.push({
|
|
266
280
|
file,
|
|
@@ -620,4 +634,3 @@ export async function lintExportedPatch(repoDir, affectedFiles, diffContent, con
|
|
|
620
634
|
}
|
|
621
635
|
return issues;
|
|
622
636
|
}
|
|
623
|
-
//# sourceMappingURL=patch-lint.js.map
|
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { stat } from 'node:fs/promises';
|
|
6
6
|
import { discoverPatches, getAllTargetFilesFromPatch } from './patch-files.js';
|
|
7
|
+
import { withPatchDirectoryLock } from './patch-lock.js';
|
|
7
8
|
import { loadPatchesManifestState, PATCHES_MANIFEST, savePatchesManifest, } from './patch-manifest-io.js';
|
|
8
9
|
import { inferPatchMetadataFromFilename } from './patch-manifest-validate.js';
|
|
9
10
|
/**
|
|
@@ -89,6 +90,14 @@ export async function validatePatchesManifestConsistency(patchesDir) {
|
|
|
89
90
|
* plus the filenames that were reconstructed from generic defaults.
|
|
90
91
|
*/
|
|
91
92
|
export async function rebuildPatchesManifest(patchesDir, fallbackSourceEsrVersion) {
|
|
93
|
+
// The whole read → discover → rebuild → save cycle runs under the shared
|
|
94
|
+
// patch-directory lock (invariant 2, docs/lifecycle-invariants.md):
|
|
95
|
+
// manifest writes serialize on this lock, and a repair racing a
|
|
96
|
+
// concurrent export/reorder used to be able to clobber the other
|
|
97
|
+
// writer's manifest. Not reentrant — callers must not already hold it.
|
|
98
|
+
return withPatchDirectoryLock(patchesDir, () => rebuildPatchesManifestUnderLock(patchesDir, fallbackSourceEsrVersion));
|
|
99
|
+
}
|
|
100
|
+
async function rebuildPatchesManifestUnderLock(patchesDir, fallbackSourceEsrVersion) {
|
|
92
101
|
const manifestState = await loadPatchesManifestState(patchesDir);
|
|
93
102
|
const existingEntries = new Map();
|
|
94
103
|
if (manifestState.manifest) {
|
|
@@ -162,4 +171,3 @@ function normalizeFiles(files) {
|
|
|
162
171
|
function sameStringArray(left, right) {
|
|
163
172
|
return left.length === right.length && left.every((value, index) => value === right[index]);
|
|
164
173
|
}
|
|
165
|
-
//# sourceMappingURL=patch-manifest-consistency.js.map
|
|
@@ -37,10 +37,26 @@ export interface PatchManifestRowMutationResult {
|
|
|
37
37
|
export declare function loadPatchesManifestState(patchesDir: string): Promise<LoadedManifestState>;
|
|
38
38
|
/**
|
|
39
39
|
* Loads the patches manifest if it exists.
|
|
40
|
+
*
|
|
41
|
+
* READ-ONLY callers only: this collapses "absent" and "corrupt" into null.
|
|
42
|
+
* Any code path that will WRITE the manifest (or delete patch files based
|
|
43
|
+
* on its content) must use {@link loadPatchesManifestForWrite} instead —
|
|
44
|
+
* treating a corrupt manifest as empty and then saving destroys every
|
|
45
|
+
* existing patch's metadata.
|
|
46
|
+
*
|
|
40
47
|
* @param patchesDir - Path to the patches directory
|
|
41
48
|
* @returns PatchesManifest or null if not found
|
|
42
49
|
*/
|
|
43
50
|
export declare function loadPatchesManifest(patchesDir: string): Promise<PatchesManifest | null>;
|
|
51
|
+
/**
|
|
52
|
+
* Loads the patches manifest for a mutating operation.
|
|
53
|
+
*
|
|
54
|
+
* Returns null only when the manifest genuinely does not exist; a manifest
|
|
55
|
+
* that exists but fails to parse/validate throws
|
|
56
|
+
* {@link PatchManifestCorruptError} so the caller aborts instead of
|
|
57
|
+
* rebuilding an empty queue over the top of the corrupt file.
|
|
58
|
+
*/
|
|
59
|
+
export declare function loadPatchesManifestForWrite(patchesDir: string): Promise<PatchesManifest | null>;
|
|
44
60
|
/**
|
|
45
61
|
* Saves the patches manifest.
|
|
46
62
|
* @param patchesDir - Path to the patches directory
|
|
@@ -12,6 +12,7 @@ import { rename } from 'node:fs/promises';
|
|
|
12
12
|
import { join } from 'node:path';
|
|
13
13
|
import { FireForgeError } from '../errors/base.js';
|
|
14
14
|
import { ExitCode } from '../errors/codes.js';
|
|
15
|
+
import { PatchManifestCorruptError } from '../errors/patch.js';
|
|
15
16
|
import { toError } from '../utils/errors.js';
|
|
16
17
|
import { pathExistsStrict, readJson, removeFile, writeJson } from '../utils/fs.js';
|
|
17
18
|
import { warn } from '../utils/logger.js';
|
|
@@ -46,6 +47,13 @@ export async function loadPatchesManifestState(patchesDir) {
|
|
|
46
47
|
}
|
|
47
48
|
/**
|
|
48
49
|
* Loads the patches manifest if it exists.
|
|
50
|
+
*
|
|
51
|
+
* READ-ONLY callers only: this collapses "absent" and "corrupt" into null.
|
|
52
|
+
* Any code path that will WRITE the manifest (or delete patch files based
|
|
53
|
+
* on its content) must use {@link loadPatchesManifestForWrite} instead —
|
|
54
|
+
* treating a corrupt manifest as empty and then saving destroys every
|
|
55
|
+
* existing patch's metadata.
|
|
56
|
+
*
|
|
49
57
|
* @param patchesDir - Path to the patches directory
|
|
50
58
|
* @returns PatchesManifest or null if not found
|
|
51
59
|
*/
|
|
@@ -53,6 +61,21 @@ export async function loadPatchesManifest(patchesDir) {
|
|
|
53
61
|
const state = await loadPatchesManifestState(patchesDir);
|
|
54
62
|
return state.manifest;
|
|
55
63
|
}
|
|
64
|
+
/**
|
|
65
|
+
* Loads the patches manifest for a mutating operation.
|
|
66
|
+
*
|
|
67
|
+
* Returns null only when the manifest genuinely does not exist; a manifest
|
|
68
|
+
* that exists but fails to parse/validate throws
|
|
69
|
+
* {@link PatchManifestCorruptError} so the caller aborts instead of
|
|
70
|
+
* rebuilding an empty queue over the top of the corrupt file.
|
|
71
|
+
*/
|
|
72
|
+
export async function loadPatchesManifestForWrite(patchesDir) {
|
|
73
|
+
const state = await loadPatchesManifestState(patchesDir);
|
|
74
|
+
if (state.exists && state.manifest === null) {
|
|
75
|
+
throw new PatchManifestCorruptError(join(patchesDir, PATCHES_MANIFEST), state.parseError);
|
|
76
|
+
}
|
|
77
|
+
return state.manifest;
|
|
78
|
+
}
|
|
56
79
|
/**
|
|
57
80
|
* Saves the patches manifest.
|
|
58
81
|
* @param patchesDir - Path to the patches directory
|
|
@@ -125,7 +148,8 @@ export async function mutatePatchRowsInManifest(patchesDir, filenames, mutator)
|
|
|
125
148
|
* @param removeFilenames - Optional filenames to remove in the same read-modify-write cycle
|
|
126
149
|
*/
|
|
127
150
|
export async function addPatchToManifest(patchesDir, metadata, removeFilenames) {
|
|
128
|
-
|
|
151
|
+
// ForWrite: a corrupt manifest must abort here, not be rebuilt as empty.
|
|
152
|
+
const manifest = (await loadPatchesManifestForWrite(patchesDir)) ?? {
|
|
129
153
|
version: 1,
|
|
130
154
|
patches: [],
|
|
131
155
|
};
|
|
@@ -156,7 +180,7 @@ export async function addPatchToManifest(patchesDir, metadata, removeFilenames)
|
|
|
156
180
|
* false when no matching entry existed
|
|
157
181
|
*/
|
|
158
182
|
export async function removePatchFromManifest(patchesDir, filename) {
|
|
159
|
-
const manifest = await
|
|
183
|
+
const manifest = await loadPatchesManifestForWrite(patchesDir);
|
|
160
184
|
if (!manifest)
|
|
161
185
|
return false;
|
|
162
186
|
const originalLength = manifest.patches.length;
|
|
@@ -240,7 +264,7 @@ export function rewriteStagedDependencyOwners(patch, renameLookup) {
|
|
|
240
264
|
export async function renumberPatchesInManifest(patchesDir, renameMap) {
|
|
241
265
|
if (renameMap.size === 0)
|
|
242
266
|
return;
|
|
243
|
-
const manifest = await
|
|
267
|
+
const manifest = await loadPatchesManifestForWrite(patchesDir);
|
|
244
268
|
if (!manifest) {
|
|
245
269
|
throw new Error('Cannot renumber patches: patches.json is missing.');
|
|
246
270
|
}
|
|
@@ -425,7 +449,9 @@ export class PatchDeleteRollbackError extends FireForgeError {
|
|
|
425
449
|
*/
|
|
426
450
|
export async function removePatchFileAndManifest(patchesDir, filename) {
|
|
427
451
|
const patchPath = join(patchesDir, filename);
|
|
428
|
-
|
|
452
|
+
// ForWrite: deleting the patch FILE while a corrupt manifest still
|
|
453
|
+
// references it would strand the queue; abort on corruption instead.
|
|
454
|
+
const originalManifest = await loadPatchesManifestForWrite(patchesDir);
|
|
429
455
|
const removedFromManifest = await removePatchFromManifest(patchesDir, filename);
|
|
430
456
|
try {
|
|
431
457
|
if (await pathExistsStrict(patchPath)) {
|
|
@@ -451,4 +477,3 @@ export async function removePatchFileAndManifest(patchesDir, filename) {
|
|
|
451
477
|
throw deleteError;
|
|
452
478
|
}
|
|
453
479
|
}
|
|
454
|
-
//# sourceMappingURL=patch-manifest-io.js.map
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
* Query helpers: finding patches by file, integrity checks, version compat, stamping.
|
|
4
4
|
*/
|
|
5
5
|
import { readText } from '../utils/fs.js';
|
|
6
|
-
import {
|
|
6
|
+
import { listTrackedInHead } from './git-file-ops.js';
|
|
7
7
|
import { discoverPatches, getAllTargetFilesFromPatch } from './patch-files.js';
|
|
8
8
|
import { withPatchDirectoryLock } from './patch-lock.js';
|
|
9
9
|
import { loadPatchesManifest, mutatePatchRowsInManifest } from './patch-manifest-io.js';
|
|
@@ -79,6 +79,12 @@ export async function findPatchesAffectingFile(patchesDir, filePath) {
|
|
|
79
79
|
export async function validatePatchIntegrity(patchesDir, engineDir) {
|
|
80
80
|
const issues = [];
|
|
81
81
|
const patches = await discoverPatches(patchesDir);
|
|
82
|
+
// Collect every modification target first, then resolve HEAD existence in
|
|
83
|
+
// ONE batched ls-tree pass (chunked for ARG_MAX). The per-file
|
|
84
|
+
// fileExistsInHead fan-out spawned one git process per (patch × target) on
|
|
85
|
+
// every import — a 56-file branding patch alone cost ~56 spawns before a
|
|
86
|
+
// single patch was applied.
|
|
87
|
+
const modificationTargets = [];
|
|
82
88
|
for (const patch of patches) {
|
|
83
89
|
// Check all files in the patch (supports multi-file patches)
|
|
84
90
|
const patchContent = await readText(patch.path);
|
|
@@ -87,14 +93,17 @@ export async function validatePatchIntegrity(patchesDir, engineDir) {
|
|
|
87
93
|
// Skip new-file sections — they don't need to exist in HEAD
|
|
88
94
|
if (isNewFileInPatch(patchContent, targetFile))
|
|
89
95
|
continue;
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
96
|
+
modificationTargets.push({ filename: patch.filename, targetFile });
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
const tracked = await listTrackedInHead(engineDir, modificationTargets.map((t) => t.targetFile));
|
|
100
|
+
for (const { filename, targetFile } of modificationTargets) {
|
|
101
|
+
if (!tracked.has(targetFile)) {
|
|
102
|
+
issues.push({
|
|
103
|
+
filename,
|
|
104
|
+
message: `Modification patch for file that doesn't exist in source. Re-export with: fireforge export ${targetFile}`,
|
|
105
|
+
targetFile,
|
|
106
|
+
});
|
|
98
107
|
}
|
|
99
108
|
}
|
|
100
109
|
return issues;
|
|
@@ -128,4 +137,3 @@ export async function stampPatchVersions(patchesDir, filenames, newVersion, newP
|
|
|
128
137
|
return null;
|
|
129
138
|
}));
|
|
130
139
|
}
|
|
131
|
-
//# sourceMappingURL=patch-manifest-query.js.map
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* is an implementation detail.
|
|
6
6
|
*/
|
|
7
7
|
export { rebuildPatchesManifest, validatePatchesManifestConsistency, } from './patch-manifest-consistency.js';
|
|
8
|
-
export { addPatchToManifest, loadPatchesManifest, mutatePatchRowsInManifest, PATCHES_MANIFEST, type PatchManifestRowMutation, type PatchManifestRowMutationResult, type PatchRenameEntry, removePatchFileAndManifest, renumberPatchesInManifest, rewriteStagedDependencyOwners, savePatchesManifest, } from './patch-manifest-io.js';
|
|
8
|
+
export { addPatchToManifest, loadPatchesManifest, loadPatchesManifestForWrite, mutatePatchRowsInManifest, PATCHES_MANIFEST, type PatchManifestRowMutation, type PatchManifestRowMutationResult, type PatchRenameEntry, removePatchFileAndManifest, renumberPatchesInManifest, rewriteStagedDependencyOwners, savePatchesManifest, } from './patch-manifest-io.js';
|
|
9
9
|
export { checkVersionCompatibility, findPatchesAffectingFile, getClaimedFiles, stampPatchVersions, validatePatchIntegrity, } from './patch-manifest-query.js';
|
|
10
10
|
export { resolvePatchIdentifier } from './patch-manifest-resolve.js';
|
|
11
11
|
export { validatePatchesManifest } from './patch-manifest-validate.js';
|
|
@@ -6,8 +6,7 @@
|
|
|
6
6
|
* is an implementation detail.
|
|
7
7
|
*/
|
|
8
8
|
export { rebuildPatchesManifest, validatePatchesManifestConsistency, } from './patch-manifest-consistency.js';
|
|
9
|
-
export { addPatchToManifest, loadPatchesManifest, mutatePatchRowsInManifest, PATCHES_MANIFEST, removePatchFileAndManifest, renumberPatchesInManifest, rewriteStagedDependencyOwners, savePatchesManifest, } from './patch-manifest-io.js';
|
|
9
|
+
export { addPatchToManifest, loadPatchesManifest, loadPatchesManifestForWrite, mutatePatchRowsInManifest, PATCHES_MANIFEST, removePatchFileAndManifest, renumberPatchesInManifest, rewriteStagedDependencyOwners, savePatchesManifest, } from './patch-manifest-io.js';
|
|
10
10
|
export { checkVersionCompatibility, findPatchesAffectingFile, getClaimedFiles, stampPatchVersions, validatePatchIntegrity, } from './patch-manifest-query.js';
|
|
11
11
|
export { resolvePatchIdentifier } from './patch-manifest-resolve.js';
|
|
12
12
|
export { validatePatchesManifest } from './patch-manifest-validate.js';
|
|
13
|
-
//# sourceMappingURL=patch-manifest.js.map
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Pure parsing functions for extracting information from patch files.
|
|
3
3
|
* All functions are synchronous and operate on string content.
|
|
4
|
+
*
|
|
5
|
+
* This module is the ONE unified-diff walker in the codebase. Before
|
|
6
|
+
* {@link parseDiffSections} existed, six hand-rolled `diff --git` walkers
|
|
7
|
+
* lived across patch-parse, patch-lint-diff, patch-registration-refs, and
|
|
8
|
+
* patch-transform — with divergent CRLF handling (a CRLF-saved patch file
|
|
9
|
+
* silently failed target-file matching and `\ No newline` detection on
|
|
10
|
+
* Windows), no quoted-path support, and greedy path captures that
|
|
11
|
+
* mis-split any path containing ` b/`. New diff-shaped parsing must build
|
|
12
|
+
* on {@link parseDiffSections} rather than re-walking lines.
|
|
4
13
|
*/
|
|
5
14
|
/**
|
|
6
15
|
* Extracts the order number from a patch filename.
|
|
@@ -9,6 +18,56 @@
|
|
|
9
18
|
* @returns Order number, or Infinity if no prefix
|
|
10
19
|
*/
|
|
11
20
|
export declare function extractOrder(filename: string): number;
|
|
21
|
+
/**
|
|
22
|
+
* A parsed `diff --git` header: both sides' paths, unquoted and with any
|
|
23
|
+
* CRLF residue stripped.
|
|
24
|
+
*/
|
|
25
|
+
export interface DiffGitHeader {
|
|
26
|
+
/** Old-side (`a/`) path. */
|
|
27
|
+
sourcePath: string;
|
|
28
|
+
/** New-side (`b/`) path — the file the patch produces. */
|
|
29
|
+
targetPath: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Parses a `diff --git` line into its two paths.
|
|
33
|
+
*
|
|
34
|
+
* Handles the quoted form git emits for paths with special characters
|
|
35
|
+
* (`diff --git "a/x y" "b/x y"`), and disambiguates the unquoted form for
|
|
36
|
+
* paths that themselves contain ` b/`: for the overwhelmingly common
|
|
37
|
+
* non-rename case the two paths are identical, so a symmetric split
|
|
38
|
+
* (`a/<p> b/<p>`) is tried first — the previous greedy regex
|
|
39
|
+
* (`a\/.+ b\/(.+)$`) split such lines at the LAST ` b/` and returned a
|
|
40
|
+
* truncated path. Falls back to a non-greedy split for renames.
|
|
41
|
+
*
|
|
42
|
+
* @returns null when the line is not a diff --git header.
|
|
43
|
+
*/
|
|
44
|
+
export declare function parseDiffGitHeader(line: string): DiffGitHeader | null;
|
|
45
|
+
/**
|
|
46
|
+
* One `diff --git` section of a unified diff, fully structured.
|
|
47
|
+
*/
|
|
48
|
+
export interface DiffSection {
|
|
49
|
+
/** New-side (`b/`) path — the file this section produces. */
|
|
50
|
+
targetPath: string;
|
|
51
|
+
/** Old-side (`a/`) path. */
|
|
52
|
+
sourcePath: string;
|
|
53
|
+
/** True when the section carries a `new file mode` marker. */
|
|
54
|
+
isNewFile: boolean;
|
|
55
|
+
/** True when the section carries a `deleted file mode` marker. */
|
|
56
|
+
isDeletedFile: boolean;
|
|
57
|
+
/**
|
|
58
|
+
* True for binary sections (`GIT binary patch` or `Binary files … differ`).
|
|
59
|
+
* Binary sections have no parseable hunks; text-oriented consumers must
|
|
60
|
+
* refuse them rather than treat base85 lines starting with `+` as content.
|
|
61
|
+
*/
|
|
62
|
+
isBinary: boolean;
|
|
63
|
+
/** Parsed hunks, in file order. Empty for binary or metadata-only sections. */
|
|
64
|
+
hunks: ParsedHunk[];
|
|
65
|
+
}
|
|
66
|
+
/**
|
|
67
|
+
* Parses a unified diff into structured per-file sections — the single
|
|
68
|
+
* shared walker every diff consumer builds on.
|
|
69
|
+
*/
|
|
70
|
+
export declare function parseDiffSections(diffContent: string): DiffSection[];
|
|
12
71
|
/**
|
|
13
72
|
* Checks whether a specific file is a new-file addition within a patch.
|
|
14
73
|
* For multi-file patches, only inspects the section belonging to targetFile.
|