Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions src/extension.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ import { GitLensIntegration } from './integrations/gitlens/gitlensImpl';
import { IssueFeatureRegistrar } from './issues/issueFeatureRegistrar';
import { StateManager } from './issues/stateManager';
import { IssueContextProvider } from './lm/issueContextProvider';
import { PullRequestContextProvider, WorkspaceContextProvider } from './lm/pullRequestContextProvider';
import { PullRequestContextProvider } from './lm/pullRequestContextProvider';
import { registerTools } from './lm/tools/tools';
import { migrate } from './migrations';
import { NotificationsFeatureRegister } from './notifications/notificationsFeatureRegistar';
Expand Down Expand Up @@ -279,10 +279,6 @@ async function init(
notificationsManager.refresh();
}));

const workspaceContextProvider = new WorkspaceContextProvider(reposManager, git);
context.subscriptions.push(workspaceContextProvider);
context.subscriptions.push(vscode.chat.registerChatWorkspaceContextProvider('githubpr', workspaceContextProvider));
workspaceContextProvider.initialize();
const pullRequestContextProvider = new PullRequestContextProvider(prsTreeModel, reposManager, context);
context.subscriptions.push(pullRequestContextProvider);
context.subscriptions.push(vscode.chat.registerChatAttachContextProvider('githubpr', pullRequestContextProvider));
Expand Down
81 changes: 0 additions & 81 deletions src/lm/pullRequestContextProvider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,7 @@
*--------------------------------------------------------------------------------------------*/

import * as vscode from 'vscode';
import { GitApiImpl } from '../api/api1';
import { Disposable } from '../common/lifecycle';
import Logger from '../common/logger';
import { onceEvent } from '../common/utils';
import { issueMarkdown } from '../github/markdownUtils';
import { PullRequestModel } from '../github/pullRequestModel';
import { PullRequestOverviewPanel } from '../github/pullRequestOverview';
Expand All @@ -24,84 +21,6 @@ export namespace PRChatContextItem {
}
}

export class WorkspaceContextProvider extends Disposable implements vscode.ChatWorkspaceContextProvider {
private static readonly ID = 'WorkspaceContextProvider';

private readonly _onDidChangeWorkspaceChatContext = this._register(new vscode.EventEmitter<void>());
readonly onDidChangeWorkspaceChatContext = this._onDidChangeWorkspaceChatContext.event;

constructor(
private readonly _reposManager: RepositoriesManager,
private readonly _git: GitApiImpl
) {
super();
}

/**
* Do this setup in the initialize method so that it can be called after the provider is registered.
*/
async initialize() {
if (this._git.state === 'uninitialized') {
await new Promise<void>(resolve => {
this._register(onceEvent(this._git.onDidChangeState)(() => resolve()));
});
}
this._reposManager.folderManagers.forEach(folderManager => {
this._register(folderManager.onDidChangeActivePullRequest(() => {
this._onDidChangeWorkspaceChatContext.fire();
}));
});
this._register(this._reposManager.onDidChangeFolderRepositories(e => {
if (!e.added) {
return;
}
this._register(e.added.onDidChangeActivePullRequest(() => {
this._onDidChangeWorkspaceChatContext.fire();
}));
this._onDidChangeWorkspaceChatContext.fire();
}));
this._register(this._reposManager.onDidChangeAnyGitHubRepository(() => {
this._onDidChangeWorkspaceChatContext.fire();
}));
this._onDidChangeWorkspaceChatContext.fire();
}

async provideWorkspaceChatContext(_token: vscode.CancellationToken): Promise<vscode.ChatContextItem[]> {
const modelDescription = this._reposManager.folderManagers.length > 1 ? 'Information about one of the current repositories. You can use this information when you need to calculate diffs or compare changes with the default branch' : 'Information about the current repository. You can use this information when you need to calculate diffs or compare changes with the default branch';
const contexts: vscode.ChatContextItem[] = [];
for (const folderManager of this._reposManager.folderManagers) {
if (folderManager.gitHubRepositories.length === 0) {
continue;
}
let defaults;
try {
defaults = await folderManager.getPullRequestDefaults();
} catch (e) {
// The folder may have no upstream, a detached HEAD, or an upstream that is not a GitHub
// repository. Skip it instead of letting the rejection escape as an unhandled promise.
Logger.debug(`Skipping workspace chat context for folder ${folderManager.repository.rootUri.toString()}: ${e.message ?? e}`, WorkspaceContextProvider.ID);
continue;
}

let value = `Repository name: ${defaults.repo}
Owner: ${defaults.owner}
Current branch: ${folderManager.repository.state.HEAD?.name ?? 'unknown'}
Default branch: ${defaults.base}`;
if (folderManager.activePullRequest) {
value = `${value}
Active pull request (may not be the same as open pull request): ${folderManager.activePullRequest.title} ${folderManager.activePullRequest.html_url}`;
}
contexts.push({
iconPath: new vscode.ThemeIcon('github-alt'),
label: `${defaults.owner}/${defaults.repo}`,
modelDescription,
value
});
}
return contexts;
}
}

export class PullRequestContextProvider extends Disposable implements vscode.ChatAttachContextProvider<PRChatContextItem>, vscode.ChatTabContextProvider<PRChatContextItem> {
constructor(private readonly _prsTreeModel: PrsTreeModel,
private readonly _reposManager: RepositoriesManager,
Expand Down