Skip to content

Commit 861832d

Browse files
Copilotalexr00
andcommitted
Use file decoration instead of description for commit count
Co-authored-by: alexr00 <38270282+alexr00@users.noreply.github.com>
1 parent 44f26a6 commit 861832d

4 files changed

Lines changed: 77 additions & 3 deletions

File tree

src/common/uri.ts

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -520,6 +520,34 @@ export function createPRNodeUri(
520520
});
521521
}
522522

523+
export interface CommitsNodeUriParams {
524+
prNumber: number;
525+
commitsCount: number;
526+
}
527+
528+
export function createCommitsNodeUri(prNumber: number, commitsCount: number): vscode.Uri {
529+
const params: CommitsNodeUriParams = {
530+
prNumber,
531+
commitsCount
532+
};
533+
534+
return vscode.Uri.parse(`commitsnode:${prNumber}`).with({
535+
scheme: Schemes.CommitsNode,
536+
query: JSON.stringify(params)
537+
});
538+
}
539+
540+
export function fromCommitsNodeUri(uri: vscode.Uri): CommitsNodeUriParams | undefined {
541+
if (uri.scheme !== Schemes.CommitsNode) {
542+
return undefined;
543+
}
544+
try {
545+
return JSON.parse(uri.query) as CommitsNodeUriParams;
546+
} catch (e) {
547+
return undefined;
548+
}
549+
}
550+
523551
export interface NotificationUriParams {
524552
key: string;
525553
}
@@ -726,7 +754,8 @@ export enum Schemes {
726754
Repo = 'repo', // New issue file for passing data
727755
Git = 'git', // File content from the git extension
728756
PRQuery = 'prquery', // PR query tree item
729-
GitHubCommit = 'githubcommit' // file content from GitHub for a commit
757+
GitHubCommit = 'githubcommit', // file content from GitHub for a commit
758+
CommitsNode = 'commitsnode' // Commits tree node, for decorations
730759
}
731760

732761
export function resolvePath(from: vscode.Uri, to: string) {

src/extension.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ import { NotificationsProvider } from './notifications/notificationsProvider';
4242
import { ThemeWatcher } from './themeWatcher';
4343
import { UriHandler } from './uriHandler';
4444
import { CommentDecorationProvider } from './view/commentDecorationProvider';
45+
import { CommitsDecorationProvider } from './view/commitsDecorationProvider';
4546
import { CompareChanges } from './view/compareChangesTreeDataProvider';
4647
import { CreatePullRequestHelper } from './view/createPullRequestHelper';
4748
import { FileTypeDecorationProvider } from './view/fileTypeDecorationProvider';
@@ -169,7 +170,7 @@ async function init(
169170
);
170171
const treeDecorationProviders = new TreeDecorationProviders(reposManager);
171172
context.subscriptions.push(treeDecorationProviders);
172-
treeDecorationProviders.registerProviders([new FileTypeDecorationProvider(), new CommentDecorationProvider(reposManager)]);
173+
treeDecorationProviders.registerProviders([new FileTypeDecorationProvider(), new CommentDecorationProvider(reposManager), new CommitsDecorationProvider()]);
173174

174175
const notificationsProvider = new NotificationsProvider(credentialStore, reposManager);
175176
context.subscriptions.push(notificationsProvider);
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
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 * as vscode from 'vscode';
7+
import { TreeDecorationProvider } from './treeDecorationProviders';
8+
import { fromCommitsNodeUri, Schemes } from '../common/uri';
9+
import { FolderRepositoryManager } from '../github/folderRepositoryManager';
10+
import { PullRequestModel } from '../github/pullRequestModel';
11+
12+
export class CommitsDecorationProvider extends TreeDecorationProvider {
13+
14+
constructor() {
15+
super();
16+
}
17+
18+
registerPullRequestPropertyChangedListeners(_folderManager: FolderRepositoryManager, _model: PullRequestModel): vscode.Disposable {
19+
// No need to listen for changes since commit count doesn't change dynamically
20+
return { dispose: () => { } };
21+
}
22+
23+
provideFileDecoration(
24+
uri: vscode.Uri,
25+
_token: vscode.CancellationToken,
26+
): vscode.ProviderResult<vscode.FileDecoration> {
27+
if (uri.scheme !== Schemes.CommitsNode) {
28+
return undefined;
29+
}
30+
31+
const params = fromCommitsNodeUri(uri);
32+
if (!params) {
33+
return undefined;
34+
}
35+
36+
return {
37+
badge: params.commitsCount.toString(),
38+
tooltip: vscode.l10n.t('{0} commits', params.commitsCount)
39+
};
40+
}
41+
42+
}

src/view/treeNodes/commitsCategoryNode.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@ import * as vscode from 'vscode';
77
import { CommitNode } from './commitNode';
88
import { TreeNode, TreeNodeParent } from './treeNode';
99
import Logger, { PR_TREE } from '../../common/logger';
10+
import { createCommitsNodeUri } from '../../common/uri';
1011
import { FolderRepositoryManager } from '../../github/folderRepositoryManager';
1112
import { PullRequestModel } from '../../github/pullRequestModel';
1213

1314
export class CommitsNode extends TreeNode implements vscode.TreeItem {
1415
public collapsibleState: vscode.TreeItemCollapsibleState;
16+
public resourceUri: vscode.Uri;
1517
private _folderRepoManager: FolderRepositoryManager;
1618
private _pr: PullRequestModel;
1719

@@ -25,7 +27,7 @@ export class CommitsNode extends TreeNode implements vscode.TreeItem {
2527
this._pr = pr;
2628
this._folderRepoManager = reposManager;
2729
this.collapsibleState = vscode.TreeItemCollapsibleState.Collapsed;
28-
this.description = pr.item.commits.length.toString();
30+
this.resourceUri = createCommitsNodeUri(pr.number, pr.item.commits.length);
2931

3032
this.childrenDisposables = [];
3133
this.childrenDisposables.push(this._pr.onDidChangeReviewThreads(() => {

0 commit comments

Comments
 (0)