Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/src/vs/platform/agentHost/test/node/copilotGitProject.test.ts
13399 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import assert from 'assert';
7
import { URI } from '../../../../base/common/uri.js';
8
import { ensureNoDisposablesAreLeakedInTestSuite } from '../../../../base/test/common/utils.js';
9
import type { IAgentHostGitService } from '../../node/agentHostGitService.js';
10
import { projectFromCopilotContext, projectFromRepository, resolveGitProject } from '../../node/copilot/copilotGitProject.js';
11
12
class TestAgentHostGitService implements IAgentHostGitService {
13
declare readonly _serviceBrand: undefined;
14
15
insideWorkTree = true;
16
repositoryRoot: URI | undefined;
17
worktreeRoots: URI[] = [];
18
19
async isInsideWorkTree(): Promise<boolean> { return this.insideWorkTree; }
20
async getCurrentBranch(): Promise<string | undefined> { return undefined; }
21
async getDefaultBranch(): Promise<string | undefined> { return undefined; }
22
async getBranches(): Promise<string[]> { return []; }
23
async getRepositoryRoot(): Promise<URI | undefined> { return this.repositoryRoot; }
24
async getWorktreeRoots(): Promise<URI[]> { return this.worktreeRoots; }
25
async addWorktree(): Promise<void> { }
26
async addExistingWorktree(): Promise<void> { }
27
async removeWorktree(): Promise<void> { }
28
async branchExists(): Promise<boolean> { return false; }
29
async hasUncommittedChanges(): Promise<boolean> { return false; }
30
async getSessionGitState(): Promise<undefined> { return undefined; }
31
async computeSessionFileDiffs(): Promise<undefined> { return undefined; }
32
async showBlob(): Promise<undefined> { return undefined; }
33
}
34
35
suite('Copilot Git Project', () => {
36
ensureNoDisposablesAreLeakedInTestSuite();
37
38
let gitService: TestAgentHostGitService;
39
40
setup(() => {
41
gitService = new TestAgentHostGitService();
42
});
43
44
test('resolves a repository project from a worktree working directory', async () => {
45
gitService.worktreeRoots = [URI.file('/workspace/source-repo')];
46
47
const project = await resolveGitProject(URI.file('/workspace/worktree-checkout'), gitService);
48
49
assert.deepStrictEqual({
50
uri: project?.uri.toString(),
51
displayName: project?.displayName,
52
}, {
53
uri: URI.file('/workspace/source-repo').toString(),
54
displayName: 'source-repo',
55
});
56
});
57
58
test('resolves the repository itself for a normal git working directory', async () => {
59
gitService.repositoryRoot = URI.file('/workspace/normal-repo');
60
61
const project = await resolveGitProject(URI.file('/workspace/normal-repo'), gitService);
62
63
assert.deepStrictEqual({
64
uri: project?.uri.toString(),
65
displayName: project?.displayName,
66
}, {
67
uri: URI.file('/workspace/normal-repo').toString(),
68
displayName: 'normal-repo',
69
});
70
});
71
72
test('returns undefined outside a git working tree', async () => {
73
gitService.insideWorkTree = false;
74
75
assert.strictEqual(await resolveGitProject(URI.file('/workspace/plain-folder'), gitService), undefined);
76
});
77
78
test('falls back to repository context when no git project is available', async () => {
79
gitService.insideWorkTree = false;
80
81
const project = await projectFromCopilotContext({ repository: 'microsoft/vscode' }, gitService);
82
83
assert.deepStrictEqual({
84
uri: project?.uri.toString(),
85
displayName: project?.displayName,
86
}, {
87
uri: 'https://github.com/microsoft/vscode',
88
displayName: 'vscode',
89
});
90
});
91
92
test('parses repository URLs', () => {
93
const project = projectFromRepository('https://github.com/microsoft/vscode.git');
94
95
assert.deepStrictEqual({
96
uri: project?.uri.toString(),
97
displayName: project?.displayName,
98
}, {
99
uri: 'https://github.com/microsoft/vscode.git',
100
displayName: 'vscode',
101
});
102
});
103
});
104
105