diff --git a/src/extension/chatSessions/vscode-node/copilotCLIChatSessionsContribution.ts b/src/extension/chatSessions/vscode-node/copilotCLIChatSessionsContribution.ts index 35a84c6ceb..c497e1c8b0 100644 --- a/src/extension/chatSessions/vscode-node/copilotCLIChatSessionsContribution.ts +++ b/src/extension/chatSessions/vscode-node/copilotCLIChatSessionsContribution.ts @@ -9,7 +9,6 @@ import * as vscode from 'vscode'; import { ChatExtendedRequestHandler, Uri } from 'vscode'; import { IRunCommandExecutionService } from '../../../platform/commands/common/runCommandExecutionService'; import { IVSCodeExtensionContext } from '../../../platform/extContext/common/extensionContext'; -import { IGitExtensionService } from '../../../platform/git/common/gitExtensionService'; import { IGitService } from '../../../platform/git/common/gitService'; import { toGitUri } from '../../../platform/git/common/utils'; import { ILogService } from '../../../platform/log/common/logService'; @@ -229,7 +228,6 @@ export class CopilotCLIChatSessionItemProvider extends Disposable implements vsc @ICopilotCLISessionService private readonly copilotcliSessionService: ICopilotCLISessionService, @ICopilotCLITerminalIntegration private readonly terminalIntegration: ICopilotCLITerminalIntegration, @IGitService private readonly gitService: IGitService, - @IGitExtensionService private readonly gitExtensionService: IGitExtensionService, @IRunCommandExecutionService private readonly commandExecutionService: IRunCommandExecutionService, ) { super(); @@ -278,7 +276,6 @@ export class CopilotCLIChatSessionItemProvider extends Disposable implements vsc tooltipLines.push(vscode.l10n.t(`Worktree: {0}`, worktreeRelativePath)); // Statistics - // Make sure the repository is opened const stats = await this.getStatisticsForWorktree(worktreeUri); if (stats && stats.length > 0) { CachedSessionStats.set(resource, stats); @@ -298,35 +295,23 @@ export class CopilotCLIChatSessionItemProvider extends Disposable implements vsc } satisfies vscode.ChatSessionItem; } - private async getStatisticsForWorktree(worktreeUri: Uri) { - const repository = await this.gitService.getRepository(worktreeUri); - const details: vscode.ChatSessionChangedFile[] = []; - if (repository?.changes) { - const allChanges = [...repository.changes.indexChanges, ...repository.changes.workingTree]; - const gitAPI = this.gitExtensionService.getExtensionApi(); - const gitRepository = gitAPI?.getRepository(worktreeUri); - - for (const change of allChanges) { - let insertions = 0; - let deletions = 0; - - if (gitRepository && gitRepository.diffIndexWithHEADShortStats) { - try { - const fileStats = await gitRepository.diffIndexWithHEADShortStats(change.uri.fsPath); - if (fileStats) { - insertions = fileStats.insertions; - deletions = fileStats.deletions; - } - } catch (error) { } - } + private async getStatisticsForWorktree(worktreeUri: Uri): Promise { + const repository = await this.gitService.getRepository(worktreeUri, false); + if (!repository?.changes) { + return []; + } + const details: vscode.ChatSessionChangedFile[] = []; + for (const change of [...repository.changes.indexChanges, ...repository.changes.workingTree]) { + try { + const fileStats = await this.gitService.diffIndexWithHEADShortStats(change.uri); details.push(new vscode.ChatSessionChangedFile( change.uri, - insertions, - deletions, - change.originalUri, + fileStats?.insertions ?? 0, + fileStats?.deletions ?? 0, + change.originalUri )); - } + } catch (error) { } } return details; } diff --git a/src/platform/git/common/gitService.ts b/src/platform/git/common/gitService.ts index 867a8f2b30..23ced92462 100644 --- a/src/platform/git/common/gitService.ts +++ b/src/platform/git/common/gitService.ts @@ -49,7 +49,7 @@ export interface IGitService extends IDisposable { readonly repositories: Array; readonly isInitialized: boolean; - getRepository(uri: URI): Promise; + getRepository(uri: URI, forceOpen?: boolean): Promise; getRepositoryFetchUrls(uri: URI): Promise | undefined>; initialize(): Promise; add(uri: URI, paths: string[]): Promise; diff --git a/src/platform/git/vscode/gitServiceImpl.ts b/src/platform/git/vscode/gitServiceImpl.ts index ef57f19be7..843d8d3917 100644 --- a/src/platform/git/vscode/gitServiceImpl.ts +++ b/src/platform/git/vscode/gitServiceImpl.ts @@ -99,7 +99,7 @@ export class GitServiceImpl extends Disposable implements IGitService { return this._isInitialized.get(); } - async getRepository(uri: URI): Promise { + async getRepository(uri: URI, forceOpen = true): Promise { const gitAPI = this.gitExtensionService.getExtensionApi(); if (!gitAPI) { return undefined; @@ -110,6 +110,11 @@ export class GitServiceImpl extends Disposable implements IGitService { uri = vscode.Uri.parse(uri.toString()); } + // Ensure that the initial + // repository discovery is + // finished + await this.initialize(); + // Query opened repositories let repository = gitAPI.getRepository(uri); if (repository) { @@ -117,6 +122,10 @@ export class GitServiceImpl extends Disposable implements IGitService { return GitServiceImpl.repoToRepoContext(repository); } + if (!forceOpen) { + return undefined; + } + // Open repository repository = await gitAPI.openRepository(uri); if (!repository) { diff --git a/src/platform/test/node/simulationWorkspaceServices.ts b/src/platform/test/node/simulationWorkspaceServices.ts index dc6ef7d3c2..8f67ae3bd2 100644 --- a/src/platform/test/node/simulationWorkspaceServices.ts +++ b/src/platform/test/node/simulationWorkspaceServices.ts @@ -674,7 +674,7 @@ export class TestingGitService implements IGitService { } // TODO implement later if tests use this, only used by ignore service - getRepository(uri: URI): Promise { + getRepository(uri: URI, forceOpen?: boolean): Promise { return Promise.resolve(undefined); }