Skip to content

Commit d091436

Browse files
committed
Moves merge base to refs
1 parent c09be6d commit d091436

File tree

12 files changed

+96
-92
lines changed

12 files changed

+96
-92
lines changed

src/env/node/git/sub-providers/branches.ts

Lines changed: 1 addition & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ export class BranchesGitSubProvider implements GitBranchesSubProvider {
252252
if (baseOrTargetBranch == null) return undefined;
253253
}
254254

255-
const mergeBase = await this.getMergeBase(repoPath, ref, baseOrTargetBranch);
255+
const mergeBase = await this.provider.refs.getMergeBase(repoPath, ref, baseOrTargetBranch);
256256
if (mergeBase == null) return undefined;
257257

258258
const contributors = await this.provider.contributors.getContributors(
@@ -363,32 +363,6 @@ export class BranchesGitSubProvider implements GitBranchesSubProvider {
363363
return undefined;
364364
}
365365

366-
@log()
367-
async getMergeBase(
368-
repoPath: string,
369-
ref1: string,
370-
ref2: string,
371-
options?: { forkPoint?: boolean },
372-
): Promise<string | undefined> {
373-
const scope = getLogScope();
374-
375-
try {
376-
const data = await this.git.exec(
377-
{ cwd: repoPath },
378-
'merge-base',
379-
options?.forkPoint ? '--fork-point' : undefined,
380-
ref1,
381-
ref2,
382-
);
383-
if (!data) return undefined;
384-
385-
return data.split('\n')[0].trim() || undefined;
386-
} catch (ex) {
387-
Logger.error(ex, scope);
388-
return undefined;
389-
}
390-
}
391-
392366
@log()
393367
async createBranch(repoPath: string, name: string, sha: string): Promise<void> {
394368
await this.git.exec({ cwd: repoPath }, 'branch', name, sha);

src/env/node/git/sub-providers/refs.ts

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@ import { createReference } from '../../../../git/utils/reference.utils';
1111
import { isSha, isShaLike, isUncommitted, isUncommittedParent } from '../../../../git/utils/revision.utils';
1212
import { TimedCancellationSource } from '../../../../system/-webview/cancellation';
1313
import { log } from '../../../../system/decorators/log';
14+
import { Logger } from '../../../../system/logger';
15+
import { getLogScope } from '../../../../system/logger.scope';
1416
import { getSettledValue } from '../../../../system/promise';
1517
import type { Git } from '../git';
1618
import type { LocalGitProvider } from '../localGitProvider';
@@ -23,6 +25,32 @@ export class RefsGitSubProvider implements GitRefsSubProvider {
2325
private readonly provider: LocalGitProvider,
2426
) {}
2527

28+
@log()
29+
async getMergeBase(
30+
repoPath: string,
31+
ref1: string,
32+
ref2: string,
33+
options?: { forkPoint?: boolean },
34+
): Promise<string | undefined> {
35+
const scope = getLogScope();
36+
37+
try {
38+
const data = await this.git.exec(
39+
{ cwd: repoPath },
40+
'merge-base',
41+
options?.forkPoint ? '--fork-point' : undefined,
42+
ref1,
43+
ref2,
44+
);
45+
if (!data) return undefined;
46+
47+
return data.split('\n')[0].trim() || undefined;
48+
} catch (ex) {
49+
Logger.error(ex, scope);
50+
return undefined;
51+
}
52+
}
53+
2654
@log()
2755
async getReference(repoPath: string, ref: string): Promise<GitReference | undefined> {
2856
if (!ref || ref === deletedOrMissing) return undefined;

src/env/node/git/sub-providers/status.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ export class StatusGitSubProvider implements GitStatusSubProvider {
132132

133133
const [branchResult, mergeBaseResult, possibleSourceBranchesResult] = await Promise.allSettled([
134134
this.provider.branches.getBranch(repoPath),
135-
this.provider.branches.getMergeBase(repoPath, 'MERGE_HEAD', 'HEAD'),
135+
this.provider.refs.getMergeBase(repoPath, 'MERGE_HEAD', 'HEAD'),
136136
this.provider.branches.getBranchesWithCommits(repoPath, ['MERGE_HEAD'], undefined, {
137137
all: true,
138138
mode: 'pointsAt',
@@ -222,8 +222,8 @@ export class StatusGitSubProvider implements GitStatusSubProvider {
222222

223223
const [mergeBaseResult, branchTipsResult, tagTipsResult] = await Promise.allSettled([
224224
rebaseHead != null
225-
? this.provider.branches.getMergeBase(repoPath, rebaseHead, 'HEAD')
226-
: this.provider.branches.getMergeBase(repoPath, onto, origHead),
225+
? this.provider.refs.getMergeBase(repoPath, rebaseHead, 'HEAD')
226+
: this.provider.refs.getMergeBase(repoPath, onto, origHead),
227227
this.provider.branches.getBranchesWithCommits(repoPath, [onto], undefined, {
228228
all: true,
229229
mode: 'pointsAt',

src/git/gitProvider.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -218,12 +218,6 @@ export interface GitBranchesSubProvider {
218218
| { commitDate?: Date; mode?: 'contains' | 'pointsAt'; remotes?: boolean },
219219
): Promise<string[]>;
220220
getDefaultBranchName(repoPath: string | undefined, remote?: string): Promise<string | undefined>;
221-
getMergeBase(
222-
repoPath: string,
223-
ref1: string,
224-
ref2: string,
225-
options?: { forkPoint?: boolean | undefined },
226-
): Promise<string | undefined>;
227221

228222
createBranch?(repoPath: string, name: string, sha: string): Promise<void>;
229223
/**
@@ -453,6 +447,12 @@ export interface GitPatchSubProvider {
453447
}
454448

455449
export interface GitRefsSubProvider {
450+
getMergeBase(
451+
repoPath: string,
452+
ref1: string,
453+
ref2: string,
454+
options?: { forkPoint?: boolean | undefined },
455+
): Promise<string | undefined>;
456456
getReference(repoPath: string, ref: string): Promise<GitReference | undefined>;
457457
hasBranchOrTag(
458458
repoPath: string | undefined,

src/plus/integrations/providers/github/sub-providers/branches.ts

Lines changed: 1 addition & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -203,7 +203,7 @@ export class BranchesGitSubProvider implements GitBranchesSubProvider {
203203
const baseOrTargetBranch = await this.getDefaultBranchName(repoPath);
204204
if (baseOrTargetBranch == null) return undefined;
205205

206-
const mergeBase = await this.getMergeBase(repoPath, ref, baseOrTargetBranch);
206+
const mergeBase = await this.provider.refs.getMergeBase(repoPath, ref, baseOrTargetBranch);
207207
if (mergeBase == null) return undefined;
208208

209209
const contributors = await this.provider.contributors.getContributors(
@@ -327,32 +327,4 @@ export class BranchesGitSubProvider implements GitBranchesSubProvider {
327327
return undefined;
328328
}
329329
}
330-
331-
@log()
332-
async getMergeBase(
333-
repoPath: string,
334-
ref1: string,
335-
ref2: string,
336-
_options?: { forkPoint?: boolean },
337-
): Promise<string | undefined> {
338-
if (repoPath == null) return undefined;
339-
340-
const scope = getLogScope();
341-
342-
const { metadata, github, session } = await this.provider.ensureRepositoryContext(repoPath);
343-
344-
try {
345-
const result = await github.getComparison(
346-
session.accessToken,
347-
metadata.repo.owner,
348-
metadata.repo.name,
349-
createRevisionRange(stripOrigin(ref1), stripOrigin(ref2), '...'),
350-
);
351-
return result?.merge_base_commit?.sha;
352-
} catch (ex) {
353-
Logger.error(ex, scope);
354-
debugger;
355-
return undefined;
356-
}
357-
}
358330
}

src/plus/integrations/providers/github/sub-providers/refs.ts

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,16 @@ import type { GitReference } from '../../../../../git/models/reference';
77
import { deletedOrMissing } from '../../../../../git/models/revision';
88
import type { GitTag } from '../../../../../git/models/tag';
99
import { createReference } from '../../../../../git/utils/reference.utils';
10-
import { isSha, isShaLike, isUncommitted, isUncommittedParent } from '../../../../../git/utils/revision.utils';
10+
import {
11+
createRevisionRange,
12+
isSha,
13+
isShaLike,
14+
isUncommitted,
15+
isUncommittedParent,
16+
} from '../../../../../git/utils/revision.utils';
1117
import { log } from '../../../../../system/decorators/log';
18+
import { Logger } from '../../../../../system/logger';
19+
import { getLogScope } from '../../../../../system/logger.scope';
1220
import type { GitHubGitProviderInternal } from '../githubGitProvider';
1321
import { stripOrigin } from '../githubGitProvider';
1422

@@ -23,6 +31,34 @@ export class RefsGitSubProvider implements GitRefsSubProvider {
2331
private readonly provider: GitHubGitProviderInternal,
2432
) {}
2533

34+
@log()
35+
async getMergeBase(
36+
repoPath: string,
37+
ref1: string,
38+
ref2: string,
39+
_options?: { forkPoint?: boolean },
40+
): Promise<string | undefined> {
41+
if (repoPath == null) return undefined;
42+
43+
const scope = getLogScope();
44+
45+
const { metadata, github, session } = await this.provider.ensureRepositoryContext(repoPath);
46+
47+
try {
48+
const result = await github.getComparison(
49+
session.accessToken,
50+
metadata.repo.owner,
51+
metadata.repo.name,
52+
createRevisionRange(stripOrigin(ref1), stripOrigin(ref2), '...'),
53+
);
54+
return result?.merge_base_commit?.sha;
55+
} catch (ex) {
56+
Logger.error(ex, scope);
57+
debugger;
58+
return undefined;
59+
}
60+
}
61+
2662
@log()
2763
async getReference(repoPath: string, ref: string): Promise<GitReference | undefined> {
2864
if (!ref || ref === deletedOrMissing) return undefined;

src/views/nodes/compareBranchNode.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -130,11 +130,11 @@ export class CompareBranchNode extends SubscribeableViewNode<
130130
authors: this.filterByAuthors,
131131
});
132132

133-
const branchesProvider = this.view.container.git.branches(this.repoPath);
133+
const refsProvider = this.view.container.git.refs(this.repoPath);
134134
const mergeBase =
135-
(await branchesProvider.getMergeBase(behind.ref1, behind.ref2, {
135+
(await refsProvider.getMergeBase(behind.ref1, behind.ref2, {
136136
forkPoint: true,
137-
})) ?? (await branchesProvider.getMergeBase(behind.ref1, behind.ref2));
137+
})) ?? (await refsProvider.getMergeBase(behind.ref1, behind.ref2));
138138

139139
const children: ViewNode[] = [
140140
new ResultsCommitsNode(

src/views/nodes/compareResultsNode.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -145,11 +145,11 @@ export class CompareResultsNode extends SubscribeableViewNode<
145145
authors: this.filterByAuthors,
146146
});
147147

148-
const branchesProvider = this.view.container.git.branches(this.repoPath);
148+
const refsProvider = this.view.container.git.refs(this.repoPath);
149149
const mergeBase =
150-
(await branchesProvider.getMergeBase(behind.ref1, behind.ref2, {
150+
(await refsProvider.getMergeBase(behind.ref1, behind.ref2, {
151151
forkPoint: true,
152-
})) ?? (await branchesProvider.getMergeBase(behind.ref1, behind.ref2));
152+
})) ?? (await refsProvider.getMergeBase(behind.ref1, behind.ref2));
153153

154154
const children: ViewNode[] = [
155155
new ResultsCommitsNode(

src/views/nodes/fileRevisionAsCommitNode.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ export class FileRevisionAsCommitNode extends ViewRefFileNode<
195195
async getConflictBaseUri(): Promise<Uri | undefined> {
196196
if (!this.commit.file?.hasConflicts) return undefined;
197197

198-
const mergeBase = await this.view.container.git.branches(this.repoPath).getMergeBase('MERGE_HEAD', 'HEAD');
198+
const mergeBase = await this.view.container.git.refs(this.repoPath).getMergeBase('MERGE_HEAD', 'HEAD');
199199
return GitUri.fromFile(this.file, this.repoPath, mergeBase ?? 'HEAD');
200200
}
201201

src/views/nodes/resultsFilesNode.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,7 +241,7 @@ export class ResultsFilesNode extends ViewNode<'results-files', ViewsWithCommits
241241
const ref = this.filter === FilesQueryFilter.Left ? this.ref2 : this.ref1;
242242

243243
const mergeBase = await this.view.container.git
244-
.branches(this.repoPath)
244+
.refs(this.repoPath)
245245
.getMergeBase(this.ref1 || 'HEAD', this.ref2 || 'HEAD');
246246
if (mergeBase != null) {
247247
const files = await this.view.container.git.diff(this.uri.repoPath!).getDiffStatus(`${mergeBase}..${ref}`);

0 commit comments

Comments
 (0)