Skip to content

Commit b1bfff8

Browse files
committed
WIP(mr): file tree.
1 parent e1b0c70 commit b1bfff8

File tree

4 files changed

+174
-12
lines changed

4 files changed

+174
-12
lines changed

src/codingServer.ts

Lines changed: 51 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,14 @@ import * as vscode from 'vscode';
22
import { nanoid } from 'nanoid';
33
import got from 'got';
44

5-
import { AuthFailResult, AuthSuccessResult, CodingResponse, IRepoListResponse } from './typings/respResult';
5+
import {
6+
AuthFailResult,
7+
AuthSuccessResult,
8+
CodingResponse,
9+
IRepoListResponse,
10+
IMRDiffResponse,
11+
IMRDetailResponse,
12+
} from './typings/respResult';
613
import { PromiseAdapter, promiseFromEvent, parseQuery, parseCloneUrl } from './common/utils';
714
import { GitService } from './common/gitService';
815
import { RepoInfo, SessionData, TokenType } from './typings/commonTypes';
@@ -241,7 +248,7 @@ export class CodingServer {
241248
const { code, data, msg }: IRepoListResponse = await got.get(`https://${repoInfo.team}.coding.net/api/user/${this._session?.user?.global_key}/depots`, {
242249
searchParams: {
243250
access_token: this._session?.accessToken,
244-
}
251+
},
245252
}).json();
246253
if (code) {
247254
return Promise.reject({ code, msg });
@@ -256,6 +263,48 @@ export class CodingServer {
256263
}
257264
}
258265

266+
public async getMRDiff(iid: number) {
267+
try {
268+
const repoInfo = this._context.workspaceState.get(`repoInfo`) as RepoInfo;
269+
if (!repoInfo?.team) {
270+
throw new Error(`team not exist`);
271+
}
272+
273+
const diff: IMRDiffResponse = await got.get(`https://${repoInfo.team}.coding.net/api/user/${this._session?.user?.team}/project/${repoInfo.project}/depot/${repoInfo.repo}/git/merge/${iid}/diff`, {
274+
searchParams: {
275+
access_token: this._session?.accessToken,
276+
},
277+
}).json();
278+
if (diff.code) {
279+
return Promise.reject(diff);
280+
}
281+
return diff;
282+
} catch (err) {
283+
return Promise.reject(err);
284+
}
285+
}
286+
287+
public async getMRDetail(iid: number) {
288+
try {
289+
const repoInfo = this._context.workspaceState.get(`repoInfo`) as RepoInfo;
290+
if (!repoInfo?.team) {
291+
throw new Error(`team not exist`);
292+
}
293+
294+
const diff: IMRDetailResponse = await got.get(`https://${repoInfo.team}.coding.net/api/user/${this._session?.user?.team}/project/${repoInfo.project}/depot/${repoInfo.repo}/git/merge/${iid}/detail`, {
295+
searchParams: {
296+
access_token: this._session?.accessToken,
297+
},
298+
}).json();
299+
if (diff.code) {
300+
return Promise.reject(diff);
301+
}
302+
return diff;
303+
} catch (err) {
304+
return Promise.reject(err);
305+
}
306+
}
307+
259308
get loggedIn() {
260309
return this._loggedIn;
261310
}

src/extension.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,9 @@ export async function activate(context: vscode.ExtensionContext) {
1414
vscode.window.showInformationMessage(`Please open a repo hosted by coding.net.`);
1515
} else {
1616
context.workspaceState.update(`repoInfo`, repoInfo);
17+
if (repoInfo?.project && repoInfo?.repo) {
18+
vscode.window.showInformationMessage(`CODING: current repo is ${repoInfo?.project}/${repoInfo?.repo}`);
19+
}
1720
}
1821

1922
const codingSrv = new CodingServer(context);

src/tree/mr-tree.ts

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import * as path from 'path';
44
import { CodingServer } from '../codingServer';
55
import { RepoInfo } from '../typings/commonTypes';
66
import { MRData } from '../typings/respResult';
7+
import { PromiseOnly } from 'got';
78

89
enum MRType {
910
Open = `open`,
@@ -14,6 +15,8 @@ enum MRType {
1415
enum ItemType {
1516
ListItem = `listItem`,
1617
CategoryItem = `categoryItem`,
18+
MRItem = `mrItem`,
19+
Node = `node`,
1720
}
1821

1922
export class MRTreeDataProvider implements vscode.TreeDataProvider<ListItem> {
@@ -70,21 +73,34 @@ export class MRTreeDataProvider implements vscode.TreeDataProvider<ListItem> {
7073
}
7174

7275
return list.map((i: MRData) => {
73-
return new MRItem(i.title, i.iid, vscode.TreeItemCollapsibleState.None, {
74-
command: 'codingPlugin.showDetail',
75-
title: `${i.iid} ${i.title}`,
76-
arguments: [{
77-
...repoInfo,
78-
iid: i.iid,
79-
type: `mr`,
80-
accessToken: this._service.session?.accessToken,
81-
}],
82-
});
76+
return new MRItem(
77+
i.title,
78+
i.iid,
79+
vscode.TreeItemCollapsibleState.Collapsed,
80+
{
81+
command: 'codingPlugin.showDetail',
82+
title: `${i.iid} ${i.title}`,
83+
arguments: [{
84+
...repoInfo,
85+
iid: i.iid,
86+
type: `mr`,
87+
accessToken: this._service.session?.accessToken,
88+
}],
89+
},
90+
);
8391
});
8492
})
8593
.catch(() => {
8694
return [];
8795
});
96+
} else if (element.contextValue === ItemType.MRItem) {
97+
return this._service.getMRDiff(element.value as number)
98+
.then(({ data: { diffStat } }) => {
99+
return [
100+
new ListItem(`Description`, `mr-desc`, vscode.TreeItemCollapsibleState.None),
101+
new NodeItem(`node`, `node`, vscode.TreeItemCollapsibleState.Expanded),
102+
];
103+
});
88104
}
89105

90106
return Promise.resolve([]);
@@ -123,8 +139,28 @@ export class CategoryItem extends ListItem {
123139
}
124140

125141
export class MRItem extends ListItem {
142+
contextValue = ItemType.MRItem;
143+
126144
iconPath = {
127145
light: path.join(__filename, '../../../src/assets/star.light.svg'),
128146
dark: path.join(__filename, '../../../src/assets/star.dark.svg'),
129147
};
130148
}
149+
150+
export class NodeItem extends ListItem {
151+
contextValue = ItemType.Node;
152+
153+
children = [
154+
new ListItem(`children-1`, 1, vscode.TreeItemCollapsibleState.None),
155+
];
156+
157+
async getChildren(): Promise<ListItem[]> {
158+
return this.children;
159+
}
160+
161+
getTreeItem(): vscode.TreeItem {
162+
return this;
163+
}
164+
}
165+
166+

src/typings/respResult.ts

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,3 +47,77 @@ export interface IRepoItem {
4747
export interface IRepoListResponse extends CodingResponse {
4848
data: IRepoItem[];
4949
}
50+
51+
export interface IMRPathItem {
52+
changeType: string;
53+
insertions: number;
54+
deletions: number;
55+
name: string;
56+
path: string;
57+
size: number;
58+
mode: number;
59+
objectId: string;
60+
commitId: string;
61+
}
62+
63+
export interface IMRDiffStat {
64+
commitId: string;
65+
oldSha: string;
66+
newSha: string;
67+
insertions: number;
68+
deletions: number;
69+
paths: IMRPathItem[];
70+
}
71+
72+
export interface IMRDiffResponse extends CodingResponse {
73+
data: {
74+
isLarge: boolean;
75+
diffStat: IMRDiffStat;
76+
}
77+
}
78+
79+
export interface IMRDetail {
80+
merged_sha: string;
81+
body: string;
82+
body_plan: string;
83+
source_sha: string;
84+
target_sha: string;
85+
base_sha: string;
86+
id: number;
87+
srcBranch: string;
88+
desBranch: string;
89+
title: string;
90+
iid: number;
91+
merge_status: string;
92+
path: string;
93+
created_at: number;
94+
updated_at: number;
95+
action_at: number;
96+
granted: string;
97+
comment_count: string;
98+
reminded: string;
99+
author: {
100+
avatar: string;
101+
name: string;
102+
global_key: string;
103+
};
104+
action_author: {
105+
avatar: string;
106+
name: string;
107+
global_key: string;
108+
};
109+
depot: {
110+
id: number;
111+
name: string;
112+
isDefault: boolean;
113+
projectId: number;
114+
vcsType: string;
115+
};
116+
}
117+
118+
export interface IMRDetailResponse extends CodingResponse {
119+
data: {
120+
merge_request: IMRDetail;
121+
can_merge: boolean;
122+
}
123+
}

0 commit comments

Comments
 (0)