Skip to content

Commit 5db2d44

Browse files
authored
Fix PR action in scm title in multi-repo (#3457)
* Clean up setting context for github:inReviewMode * Fix PR action in scm title in multi-repo Fixes #3410 * Remove duplicate context setting
1 parent 4f1fe1d commit 5db2d44

File tree

5 files changed

+33
-15
lines changed

5 files changed

+33
-15
lines changed

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1410,12 +1410,12 @@
14101410
"scm/title": [
14111411
{
14121412
"command": "review.suggestDiff",
1413-
"when": "scmProvider =~ /^git|^remoteHub:github/ && github:inReviewMode",
1413+
"when": "scmProvider =~ /^git|^remoteHub:github/ && scmProviderRootUri in github:reposInReviewMode",
14141414
"group": "inline"
14151415
},
14161416
{
14171417
"command": "pr.create",
1418-
"when": "scmProvider =~ /^git|^remoteHub:github/ && !github:inReviewMode",
1418+
"when": "scmProvider =~ /^git|^remoteHub:github/ && scmProviderRootUri in github:reposNotInReviewMode",
14191419
"group": "navigation"
14201420
}
14211421
],

src/common/executeCommands.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,9 @@ import * as vscode from 'vscode';
88
export namespace contexts {
99
export const VIEWED_FILES = 'github:viewedFiles';
1010
export const UNVIEWED_FILES = 'github:unviewedFiles';
11+
export const IN_REVIEW_MODE = 'github:inReviewMode';
12+
export const REPOS_NOT_IN_REVIEW_MODE = 'github:reposNotInReviewMode';
13+
export const REPOS_IN_REVIEW_MODE = 'github:reposInReviewMode';
1114
}
1215

1316
export namespace commands {

src/extension.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -146,7 +146,7 @@ async function init(
146146
}
147147
});
148148

149-
const changesTree = new PullRequestChangesTreeDataProvider(context);
149+
const changesTree = new PullRequestChangesTreeDataProvider(context, git, reposManager);
150150
context.subscriptions.push(changesTree);
151151

152152
const reviewManagers = folderManagers.map(

src/view/prChangesTreeDataProvider.ts

Lines changed: 24 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,13 @@
44
*--------------------------------------------------------------------------------------------*/
55

66
import * as vscode from 'vscode';
7+
import { GitApiImpl } from '../api/api1';
8+
import { commands, contexts } from '../common/executeCommands';
79
import Logger, { PR_TREE } from '../common/logger';
810
import { FILE_LIST_LAYOUT } from '../common/settingKeys';
911
import { FolderRepositoryManager, SETTINGS_NAMESPACE } from '../github/folderRepositoryManager';
1012
import { PullRequestModel } from '../github/pullRequestModel';
13+
import { RepositoriesManager } from '../github/repositoriesManager';
1114
import { ReviewModel } from './reviewModel';
1215
import { DescriptionNode } from './treeNodes/descriptionNode';
1316
import { GitFileChangeNode } from './treeNodes/fileChangeNode';
@@ -26,7 +29,7 @@ export class PullRequestChangesTreeDataProvider extends vscode.Disposable implem
2629
return this._view;
2730
}
2831

29-
constructor(private _context: vscode.ExtensionContext) {
32+
constructor(private _context: vscode.ExtensionContext, private _git: GitApiImpl, private _reposManager: RepositoriesManager) {
3033
super(() => this.dispose());
3134
this._view = vscode.window.createTreeView('prStatus:github', {
3235
treeDataProvider: this,
@@ -92,29 +95,41 @@ export class PullRequestChangesTreeDataProvider extends vscode.Disposable implem
9295
this._pullRequestManagerMap.set(pullRequestManager, node);
9396
this.updateViewTitle();
9497

95-
await vscode.commands.executeCommand('setContext', 'github:inReviewMode', true);
98+
await this.setReviewModeContexts();
9699
this._onDidChangeTreeData.fire();
97100

98101
if (shouldReveal) {
99102
this.reveal(node);
100103
}
101104
}
102105

106+
private async setReviewModeContexts() {
107+
await commands.setContext(contexts.IN_REVIEW_MODE, this._pullRequestManagerMap.size > 0);
108+
109+
const rootUrisNotInReviewMode: string[] = [];
110+
const rootUrisInReviewMode: string[] = [];
111+
this._git.repositories.forEach(repo => {
112+
const folderManager = this._reposManager.getManagerForFile(repo.rootUri);
113+
if (folderManager && !this._pullRequestManagerMap.has(folderManager)) {
114+
rootUrisNotInReviewMode.push(repo.rootUri.toString());
115+
} else if (folderManager) {
116+
rootUrisInReviewMode.push(repo.rootUri.toString());
117+
}
118+
});
119+
await commands.setContext(contexts.REPOS_NOT_IN_REVIEW_MODE, rootUrisNotInReviewMode);
120+
await commands.setContext(contexts.REPOS_IN_REVIEW_MODE, rootUrisInReviewMode);
121+
}
122+
103123
async removePrFromView(pullRequestManager: FolderRepositoryManager) {
104124
const oldPR = this._pullRequestManagerMap.has(pullRequestManager) ? this._pullRequestManagerMap.get(pullRequestManager) : undefined;
105125
Logger.appendLine(`Removing PR #${oldPR?.pullRequestModel.number} from tree`, PR_TREE);
106126

107127
oldPR?.dispose();
108128
this._pullRequestManagerMap.delete(pullRequestManager);
109129
this.updateViewTitle();
110-
if (this._pullRequestManagerMap.size === 0) {
111-
this.hide();
112-
}
113-
this._onDidChangeTreeData.fire();
114-
}
115130

116-
async hide() {
117-
await vscode.commands.executeCommand('setContext', 'github:inReviewMode', false);
131+
await this.setReviewModeContexts();
132+
this._onDidChangeTreeData.fire();
118133
}
119134

120135
getTreeItem(element: TreeNode): vscode.TreeItem | Thenable<vscode.TreeItem> {

src/view/reviewsManager.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ export class ReviewsManager {
2727
private _prFileChangesProvider: PullRequestChangesTreeDataProvider,
2828
private _telemetry: ITelemetry,
2929
credentialStore: CredentialStore,
30-
gitApi: GitApiImpl,
30+
private _gitApi: GitApiImpl,
3131
) {
3232
this._disposables = [];
33-
const gitContentProvider = new GitContentFileSystemProvider(gitApi, credentialStore);
33+
const gitContentProvider = new GitContentFileSystemProvider(_gitApi, credentialStore);
3434
gitContentProvider.registerTextDocumentContentFallback(this.provideTextDocumentContent.bind(this));
3535
this._disposables.push(vscode.workspace.registerFileSystemProvider(Schemes.Review, gitContentProvider, { isReadonly: true }));
3636
this.registerListeners();
@@ -43,7 +43,7 @@ export class ReviewsManager {
4343
if (e.affectsConfiguration('githubPullRequests.showInSCM')) {
4444
if (this._prFileChangesProvider) {
4545
this._prFileChangesProvider.dispose();
46-
this._prFileChangesProvider = new PullRequestChangesTreeDataProvider(this._context);
46+
this._prFileChangesProvider = new PullRequestChangesTreeDataProvider(this._context, this._gitApi, this._reposManager);
4747

4848
for (const reviewManager of this._reviewManagers) {
4949
reviewManager.updateState(true);

0 commit comments

Comments
 (0)