@@ -2,6 +2,7 @@ import { execFileSync } from "node:child_process";
22import { appendFileSync , existsSync , readFileSync } from "node:fs" ;
33import { booleanFlag , parseFlagArgs , stringFlag } from "./lib/arg-utils.mjs" ;
44import { isDirectRunUrl } from "./lib/direct-run.mjs" ;
5+ import { resolveMergeHeadDiffBase } from "./lib/merge-head-diff-base.mjs" ;
56
67const GIT_OUTPUT_MAX_BUFFER = 64 * 1024 * 1024 ;
78const IMPLAUSIBLE_NO_MERGE_BASE_DIFF_PATHS = 200 ;
@@ -213,13 +214,21 @@ export function detectChangedLanes(changedPaths, options = {}) {
213214}
214215
215216/**
216- * @param {{ paths: string[]; base: string; head?: string; staged?: boolean } } params
217+ * @param {{ paths: string[]; base: string; head?: string; staged?: boolean; mergeHeadFirstParent?: boolean } } params
217218 * @returns {ChangedLaneResult }
218219 */
219220export function detectChangedLanesForPaths ( params ) {
221+ const base = params . staged
222+ ? params . base
223+ : resolveMergeHeadDiffBase ( {
224+ base : params . base ,
225+ head : params . head ?? "HEAD" ,
226+ maxBuffer : GIT_OUTPUT_MAX_BUFFER ,
227+ preferFirstParent : params . mergeHeadFirstParent === true ,
228+ } ) ;
220229 const packageJsonChangeKind = params . paths . includes ( "package.json" )
221230 ? classifyPackageJsonChangeFromGit ( {
222- base : params . base ,
231+ base,
223232 head : params . head ,
224233 staged : params . staged ,
225234 } )
@@ -228,13 +237,19 @@ export function detectChangedLanesForPaths(params) {
228237}
229238
230239/**
231- * @param {{ base: string; head?: string; includeWorktree?: boolean; cwd?: string } } params
240+ * @param {{ base: string; head?: string; includeWorktree?: boolean; cwd?: string; mergeHeadFirstParent?: boolean } } params
232241 * @returns {string[] }
233242 */
234243export function listChangedPathsFromGit ( params ) {
235- const base = params . base ;
236244 const head = params . head ?? "HEAD" ;
237245 const cwd = params . cwd ?? process . cwd ( ) ;
246+ const base = resolveMergeHeadDiffBase ( {
247+ base : params . base ,
248+ head,
249+ cwd,
250+ maxBuffer : GIT_OUTPUT_MAX_BUFFER ,
251+ preferFirstParent : params . mergeHeadFirstParent === true ,
252+ } ) ;
238253 if ( ! base ) {
239254 return [ ] ;
240255 }
@@ -453,6 +468,7 @@ function parseArgs(argv) {
453468 base : "origin/main" ,
454469 head : "HEAD" ,
455470 staged : false ,
471+ mergeHeadFirstParent : false ,
456472 json : false ,
457473 githubOutput : false ,
458474 help : false ,
@@ -465,6 +481,7 @@ function parseArgs(argv) {
465481 stringFlag ( "--base" , "base" ) ,
466482 stringFlag ( "--head" , "head" ) ,
467483 booleanFlag ( "--staged" , "staged" ) ,
484+ booleanFlag ( "--merge-head-first-parent" , "mergeHeadFirstParent" ) ,
468485 booleanFlag ( "--json" , "json" ) ,
469486 booleanFlag ( "--github-output" , "githubOutput" ) ,
470487 booleanFlag ( "--help" , "help" ) ,
@@ -538,12 +555,17 @@ if (isDirectRun()) {
538555 ? args . paths
539556 : args . staged
540557 ? listStagedChangedPaths ( )
541- : listChangedPathsFromGit ( { base : args . base , head : args . head } ) ;
558+ : listChangedPathsFromGit ( {
559+ base : args . base ,
560+ head : args . head ,
561+ mergeHeadFirstParent : args . mergeHeadFirstParent ,
562+ } ) ;
542563 const result = detectChangedLanesForPaths ( {
543564 paths,
544565 base : args . base ,
545566 head : args . head ,
546567 staged : args . staged ,
568+ mergeHeadFirstParent : args . mergeHeadFirstParent ,
547569 } ) ;
548570 if ( args . githubOutput ) {
549571 writeChangedLaneGitHubOutput ( result ) ;
0 commit comments