Skip to content

Commit 2d5bd10

Browse files
committed
[TE-5578] Use explicit merge-base and two-arg diff in collectDiffMetadata
Replace triple-dot syntax (baseBranch...HEAD) with an explicit git merge-base call followed by two-arg diff (forkPoint, HEAD). This makes fork-point resolution visible and aligns the plan path with the backfill path which also uses two-arg diff. Since both callers now pass exactly two arguments (base and commit), simplify runDiffCommands from variadic refArgs to named base/commit parameters and inline the diff calls directly.
1 parent a3f9e51 commit 2d5bd10

3 files changed

Lines changed: 41 additions & 41 deletions

File tree

internal/git/auto_metadata.go

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,11 +93,20 @@ func collectCommitMetadata(ctx context.Context, runner GitRunner, metadata map[s
9393
mergeNonEmpty(metadata, meta.ToMap())
9494
}
9595

96-
// collectDiffMetadata runs diff commands against the resolved base branch
97-
// using triple-dot syntax (<base>...HEAD) and merges the results into the
98-
// metadata map.
96+
// collectDiffMetadata computes the merge-base between baseBranch and HEAD,
97+
// then runs diff commands using two-arg form (merge-base, HEAD). This is
98+
// equivalent to git diff baseBranch...HEAD but makes the fork-point
99+
// resolution explicit and uses the same two-arg diff form as the backfill
100+
// path.
99101
func collectDiffMetadata(ctx context.Context, runner GitRunner, baseBranch string, metadata map[string]string) {
100-
diffs := runDiffCommands(ctx, runner, false, baseBranch+"...HEAD")
102+
forkPoint, err := runner.Output(ctx, "merge-base", baseBranch, "HEAD")
103+
if err != nil {
104+
debug.Printf("Warning: git merge-base failed: %v", err)
105+
return
106+
}
107+
forkPoint = strings.TrimSpace(forkPoint)
108+
109+
diffs := runDiffCommands(ctx, runner, false, forkPoint, "HEAD")
101110
mergeNonEmpty(metadata, diffs.ToMap())
102111
}
103112

internal/git/auto_metadata_test.go

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -159,12 +159,13 @@ func TestCollectPlanMetadata_HappyPath(t *testing.T) {
159159

160160
runner := &FakeGitRunner{
161161
Responses: map[string]string{
162-
fmt.Sprintf("log -1 --format=%s", MetadataFormat): gitLogOutput,
163-
"diff --no-ext-diff --name-only origin/main...HEAD": "file1.go\nfile2.go\n",
164-
"diff --no-ext-diff --numstat origin/main...HEAD": "10\t5\tfile1.go\n3\t0\tfile2.go\n",
165-
"diff --no-ext-diff origin/main...HEAD": "diff --git a/file1.go b/file1.go\n",
166-
"diff --no-ext-diff --raw origin/main...HEAD": ":100644 100644 aaa bbb M\tfile1.go\n",
167-
"branch --show-current": "feature/my-branch\n",
162+
fmt.Sprintf("log -1 --format=%s", MetadataFormat): gitLogOutput,
163+
"merge-base origin/main HEAD": "aaa000\n",
164+
"diff --no-ext-diff --name-only aaa000 HEAD": "file1.go\nfile2.go\n",
165+
"diff --no-ext-diff --numstat aaa000 HEAD": "10\t5\tfile1.go\n3\t0\tfile2.go\n",
166+
"diff --no-ext-diff aaa000 HEAD": "diff --git a/file1.go b/file1.go\n",
167+
"diff --no-ext-diff --raw aaa000 HEAD": ":100644 100644 aaa bbb M\tfile1.go\n",
168+
"branch --show-current": "feature/my-branch\n",
168169
},
169170
}
170171

@@ -317,11 +318,12 @@ func TestCollectPlanMetadata_LogFails(t *testing.T) {
317318
runner := &FakeGitRunner{
318319
Responses: map[string]string{
319320
// git log missing -> will error
320-
"diff --no-ext-diff --name-only origin/main...HEAD": "file1.go\n",
321-
"diff --no-ext-diff --numstat origin/main...HEAD": "10\t5\tfile1.go\n",
322-
"diff --no-ext-diff origin/main...HEAD": "diff text\n",
323-
"diff --no-ext-diff --raw origin/main...HEAD": ":100644 raw\n",
324-
"branch --show-current": "feature\n",
321+
"merge-base origin/main HEAD": "aaa000\n",
322+
"diff --no-ext-diff --name-only aaa000 HEAD": "file1.go\n",
323+
"diff --no-ext-diff --numstat aaa000 HEAD": "10\t5\tfile1.go\n",
324+
"diff --no-ext-diff aaa000 HEAD": "diff text\n",
325+
"diff --no-ext-diff --raw aaa000 HEAD": ":100644 raw\n",
326+
"branch --show-current": "feature\n",
325327
},
326328
}
327329

@@ -484,12 +486,13 @@ func TestCollectPlanMetadata_EmptyDiffOutput(t *testing.T) {
484486

485487
runner := &FakeGitRunner{
486488
Responses: map[string]string{
487-
fmt.Sprintf("log -1 --format=%s", MetadataFormat): gitLogOutput,
488-
"diff --no-ext-diff --name-only origin/main...HEAD": "\n",
489-
"diff --no-ext-diff --numstat origin/main...HEAD": "\n",
490-
"diff --no-ext-diff origin/main...HEAD": "\n",
491-
"diff --no-ext-diff --raw origin/main...HEAD": "\n",
492-
"branch --show-current": "main\n",
489+
fmt.Sprintf("log -1 --format=%s", MetadataFormat): gitLogOutput,
490+
"merge-base origin/main HEAD": "aaa000\n",
491+
"diff --no-ext-diff --name-only aaa000 HEAD": "\n",
492+
"diff --no-ext-diff --numstat aaa000 HEAD": "\n",
493+
"diff --no-ext-diff aaa000 HEAD": "\n",
494+
"diff --no-ext-diff --raw aaa000 HEAD": "\n",
495+
"branch --show-current": "main\n",
493496
},
494497
}
495498

internal/git/diff.go

Lines changed: 8 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -133,44 +133,32 @@ func extractCommitDiffs(
133133
return runDiffCommands(ctx, runner, skipDiffs, fp.Base, commit), nil
134134
}
135135

136-
// runDiffCommands runs the 4 git diff commands against the given ref args
137-
// and returns the results as a CommitDiffs struct. The refArgs are passed
138-
// directly to git diff (e.g. ["base", "commit"] for two-arg form, or
139-
// ["base...HEAD"] for triple-dot form). Each command is independent; failures
140-
// log a debug warning and leave the field empty.
141-
func runDiffCommands(ctx context.Context, runner GitRunner, skipDiffs bool, refArgs ...string) CommitDiffs {
142-
// diffArgs builds the full argument list for a git diff command.
143-
// flags are inserted between "diff --no-ext-diff" and the ref args.
144-
diffArgs := func(flags ...string) []string {
145-
args := make([]string, 0, 2+len(flags)+len(refArgs))
146-
args = append(args, "diff", "--no-ext-diff")
147-
args = append(args, flags...)
148-
args = append(args, refArgs...)
149-
return args
150-
}
151-
136+
// runDiffCommands runs the 4 git diff commands between base and commit,
137+
// returning the results as a CommitDiffs struct. Each command is independent;
138+
// failures log a debug warning and leave the field empty.
139+
func runDiffCommands(ctx context.Context, runner GitRunner, skipDiffs bool, base, commit string) CommitDiffs {
152140
var diffs CommitDiffs
153141

154-
if out, err := runner.Output(ctx, diffArgs("--name-only")...); err == nil {
142+
if out, err := runner.Output(ctx, "diff", "--no-ext-diff", "--name-only", base, commit); err == nil {
155143
diffs.FilesChanged = strings.TrimRight(out, "\n")
156144
} else {
157145
debug.Printf("Warning: diff --name-only failed: %v", err)
158146
}
159147

160-
if out, err := runner.Output(ctx, diffArgs("--numstat")...); err == nil {
148+
if out, err := runner.Output(ctx, "diff", "--no-ext-diff", "--numstat", base, commit); err == nil {
161149
diffs.DiffStat = strings.TrimRight(out, "\n")
162150
} else {
163151
debug.Printf("Warning: diff --numstat failed: %v", err)
164152
}
165153

166154
if !skipDiffs {
167-
if out, err := runner.Output(ctx, diffArgs()...); err == nil {
155+
if out, err := runner.Output(ctx, "diff", "--no-ext-diff", base, commit); err == nil {
168156
diffs.GitDiff = strings.TrimRight(out, "\n")
169157
} else {
170158
debug.Printf("Warning: diff failed: %v", err)
171159
}
172160

173-
if out, err := runner.Output(ctx, diffArgs("--raw")...); err == nil {
161+
if out, err := runner.Output(ctx, "diff", "--no-ext-diff", "--raw", base, commit); err == nil {
174162
diffs.GitDiffRaw = strings.TrimRight(out, "\n")
175163
} else {
176164
debug.Printf("Warning: diff --raw failed: %v", err)

0 commit comments

Comments
 (0)