Skip to content

Commit 5168c60

Browse files
authored
Copilot CLI - do not open repository to compute worktree statistics (#2461)
1 parent c1ef292 commit 5168c60

File tree

4 files changed

+25
-31
lines changed

4 files changed

+25
-31
lines changed

src/extension/chatSessions/vscode-node/copilotCLIChatSessionsContribution.ts

Lines changed: 13 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ import * as vscode from 'vscode';
99
import { ChatExtendedRequestHandler, Uri } from 'vscode';
1010
import { IRunCommandExecutionService } from '../../../platform/commands/common/runCommandExecutionService';
1111
import { IVSCodeExtensionContext } from '../../../platform/extContext/common/extensionContext';
12-
import { IGitExtensionService } from '../../../platform/git/common/gitExtensionService';
1312
import { IGitService } from '../../../platform/git/common/gitService';
1413
import { toGitUri } from '../../../platform/git/common/utils';
1514
import { ILogService } from '../../../platform/log/common/logService';
@@ -229,7 +228,6 @@ export class CopilotCLIChatSessionItemProvider extends Disposable implements vsc
229228
@ICopilotCLISessionService private readonly copilotcliSessionService: ICopilotCLISessionService,
230229
@ICopilotCLITerminalIntegration private readonly terminalIntegration: ICopilotCLITerminalIntegration,
231230
@IGitService private readonly gitService: IGitService,
232-
@IGitExtensionService private readonly gitExtensionService: IGitExtensionService,
233231
@IRunCommandExecutionService private readonly commandExecutionService: IRunCommandExecutionService,
234232
) {
235233
super();
@@ -278,7 +276,6 @@ export class CopilotCLIChatSessionItemProvider extends Disposable implements vsc
278276
tooltipLines.push(vscode.l10n.t(`Worktree: {0}`, worktreeRelativePath));
279277

280278
// Statistics
281-
// Make sure the repository is opened
282279
const stats = await this.getStatisticsForWorktree(worktreeUri);
283280
if (stats && stats.length > 0) {
284281
CachedSessionStats.set(resource, stats);
@@ -298,35 +295,23 @@ export class CopilotCLIChatSessionItemProvider extends Disposable implements vsc
298295
} satisfies vscode.ChatSessionItem;
299296
}
300297

301-
private async getStatisticsForWorktree(worktreeUri: Uri) {
302-
const repository = await this.gitService.getRepository(worktreeUri);
303-
const details: vscode.ChatSessionChangedFile[] = [];
304-
if (repository?.changes) {
305-
const allChanges = [...repository.changes.indexChanges, ...repository.changes.workingTree];
306-
const gitAPI = this.gitExtensionService.getExtensionApi();
307-
const gitRepository = gitAPI?.getRepository(worktreeUri);
308-
309-
for (const change of allChanges) {
310-
let insertions = 0;
311-
let deletions = 0;
312-
313-
if (gitRepository && gitRepository.diffIndexWithHEADShortStats) {
314-
try {
315-
const fileStats = await gitRepository.diffIndexWithHEADShortStats(change.uri.fsPath);
316-
if (fileStats) {
317-
insertions = fileStats.insertions;
318-
deletions = fileStats.deletions;
319-
}
320-
} catch (error) { }
321-
}
298+
private async getStatisticsForWorktree(worktreeUri: Uri): Promise<vscode.ChatSessionChangedFile[]> {
299+
const repository = await this.gitService.getRepository(worktreeUri, false);
300+
if (!repository?.changes) {
301+
return [];
302+
}
322303

304+
const details: vscode.ChatSessionChangedFile[] = [];
305+
for (const change of [...repository.changes.indexChanges, ...repository.changes.workingTree]) {
306+
try {
307+
const fileStats = await this.gitService.diffIndexWithHEADShortStats(change.uri);
323308
details.push(new vscode.ChatSessionChangedFile(
324309
change.uri,
325-
insertions,
326-
deletions,
327-
change.originalUri,
310+
fileStats?.insertions ?? 0,
311+
fileStats?.deletions ?? 0,
312+
change.originalUri
328313
));
329-
}
314+
} catch (error) { }
330315
}
331316
return details;
332317
}

src/platform/git/common/gitService.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ export interface IGitService extends IDisposable {
4949
readonly repositories: Array<RepoContext>;
5050
readonly isInitialized: boolean;
5151

52-
getRepository(uri: URI): Promise<RepoContext | undefined>;
52+
getRepository(uri: URI, forceOpen?: boolean): Promise<RepoContext | undefined>;
5353
getRepositoryFetchUrls(uri: URI): Promise<Pick<RepoContext, 'rootUri' | 'remoteFetchUrls'> | undefined>;
5454
initialize(): Promise<void>;
5555
add(uri: URI, paths: string[]): Promise<void>;

src/platform/git/vscode/gitServiceImpl.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ export class GitServiceImpl extends Disposable implements IGitService {
9999
return this._isInitialized.get();
100100
}
101101

102-
async getRepository(uri: URI): Promise<RepoContext | undefined> {
102+
async getRepository(uri: URI, forceOpen = true): Promise<RepoContext | undefined> {
103103
const gitAPI = this.gitExtensionService.getExtensionApi();
104104
if (!gitAPI) {
105105
return undefined;
@@ -110,13 +110,22 @@ export class GitServiceImpl extends Disposable implements IGitService {
110110
uri = vscode.Uri.parse(uri.toString());
111111
}
112112

113+
// Ensure that the initial
114+
// repository discovery is
115+
// finished
116+
await this.initialize();
117+
113118
// Query opened repositories
114119
let repository = gitAPI.getRepository(uri);
115120
if (repository) {
116121
await this.waitForRepositoryState(repository);
117122
return GitServiceImpl.repoToRepoContext(repository);
118123
}
119124

125+
if (!forceOpen) {
126+
return undefined;
127+
}
128+
120129
// Open repository
121130
repository = await gitAPI.openRepository(uri);
122131
if (!repository) {

src/platform/test/node/simulationWorkspaceServices.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -674,7 +674,7 @@ export class TestingGitService implements IGitService {
674674
}
675675

676676
// TODO implement later if tests use this, only used by ignore service
677-
getRepository(uri: URI): Promise<RepoContext | undefined> {
677+
getRepository(uri: URI, forceOpen?: boolean): Promise<RepoContext | undefined> {
678678
return Promise.resolve(undefined);
679679
}
680680

0 commit comments

Comments
 (0)