Skip to content

Commit 5cd0050

Browse files
committed
change: create mr logic.
1 parent e5ecb76 commit 5cd0050

File tree

4 files changed

+72
-75
lines changed

4 files changed

+72
-75
lines changed

package.json

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,8 +77,13 @@
7777
"viewsWelcome": [
7878
{
7979
"view": "mrTreeView",
80-
"contents": "Please login first.\n[Login](command:codingPlugin.login)",
81-
"when": "!loggedIn"
80+
"contents": "Please open a repo hosted by [coding.net](https://coding.net).\n [Open folder](command:vscode.openFolder)",
81+
"when": "!hasTeam"
82+
},
83+
{
84+
"view": "mrTreeView",
85+
"contents": "Please login first.\n [Login](command:codingPlugin.login)",
86+
"when": "!loggedIn && hasTeam"
8287
},
8388
{
8489
"view": "mrTreeView",

src/codingServer.ts

Lines changed: 28 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,7 @@ export class CodingServer {
9090
): Promise<ISessionData> {
9191
try {
9292
const repoInfo = this._context.workspaceState.get(`repoInfo`) as IRepoInfo;
93-
if (!repoInfo?.team) {
94-
throw new Error(`team not exist`);
95-
}
96-
93+
vscode.commands.executeCommand('setContext', 'hasTeam', !!repoInfo?.team);
9794
const result = await this.getUserInfo(repoInfo.team || ``, accessToken);
9895
const { data: userInfo } = result;
9996
const ret: ISessionData = {
@@ -212,7 +209,7 @@ export class CodingServer {
212209
public async getUserInfo(team: string, token: string = this._session?.accessToken || ``) {
213210
try {
214211
const result: CodingResponse = await got
215-
.get(`https://codingcorp.coding.net/api/current_user`, {
212+
.get(`https://${team || `codingcorp`}.coding.net/api/current_user`, {
216213
searchParams: {
217214
access_token: token,
218215
},
@@ -243,34 +240,28 @@ export class CodingServer {
243240
public getApiPrefix() {
244241
const repoInfo = this._context.workspaceState.get(`repoInfo`) as IRepoInfo;
245242
if (!repoInfo?.team) {
243+
vscode.commands.executeCommand('setContext', 'hasTeam', false);
246244
throw new Error(`team not exist`);
247245
}
246+
247+
vscode.commands.executeCommand('setContext', 'hasTeam', true);
248248
return `https://${repoInfo.team}.coding.net/api/user/${this._session?.user?.team}/project/${repoInfo.project}/depot/${repoInfo.repo}`;
249249
}
250250

251251
public async getMRList(repo?: string, status?: string): Promise<CodingResponse> {
252252
try {
253-
const repoInfo = this._context.workspaceState.get(`repoInfo`) as IRepoInfo;
254-
if (!repoInfo?.team) {
255-
throw new Error(`team not exist`);
256-
}
257-
253+
const url = this.getApiPrefix();
258254
const result: CodingResponse = await got
259-
.get(
260-
`https://${repoInfo.team}.coding.net/api/user/${repoInfo.team}/project/${
261-
repoInfo.project
262-
}/depot/${repo || repoInfo.repo}/git/merges/query`,
263-
{
264-
searchParams: {
265-
status,
266-
sort: `action_at`,
267-
page: 1,
268-
PageSize: 9999,
269-
sortDirection: `DESC`,
270-
access_token: this._session?.accessToken,
271-
},
255+
.get(`${url}/git/merges/query`, {
256+
searchParams: {
257+
status,
258+
sort: `action_at`,
259+
page: 1,
260+
PageSize: 9999,
261+
sortDirection: `DESC`,
262+
access_token: this._session?.accessToken,
272263
},
273-
)
264+
})
274265
.json();
275266
return result;
276267
} catch (err) {
@@ -567,22 +558,15 @@ export class CodingServer {
567558

568559
public async createMR(data: ICreateMRBody) {
569560
try {
570-
const repoInfo = this._context.workspaceState.get(`repoInfo`) as IRepoInfo;
571-
if (!repoInfo?.team) {
572-
throw new Error(`team not exist`);
573-
}
574-
575-
const resp: ICreateMRResp = await got.post(
576-
`https://${repoInfo.team}.coding.net/api/user/${this._session?.user?.team}/project/${repoInfo.project}/depot/${repoInfo.repo}/git/merge`,
577-
{
578-
resolveBodyOnly: true,
579-
responseType: `json`,
580-
searchParams: {
581-
access_token: this._session?.accessToken,
582-
},
583-
form: data,
561+
const url = this.getApiPrefix();
562+
const resp: ICreateMRResp = await got.post(`${url}/git/merge`, {
563+
resolveBodyOnly: true,
564+
responseType: `json`,
565+
searchParams: {
566+
access_token: this._session?.accessToken,
584567
},
585-
);
568+
form: data,
569+
});
586570
if (resp.code) {
587571
return Promise.reject(resp);
588572
}
@@ -594,20 +578,13 @@ export class CodingServer {
594578

595579
public async getBranchList() {
596580
try {
597-
const repoInfo = this._context.workspaceState.get(`repoInfo`) as IRepoInfo;
598-
if (!repoInfo?.team) {
599-
throw new Error(`team not exist`);
600-
}
601-
581+
const url = this.getApiPrefix();
602582
const resp: IBranchListResp = await got
603-
.get(
604-
`https://${repoInfo.team}.coding.net/api/user/${this._session?.user?.team}/project/${repoInfo.project}/depot/${repoInfo.repo}/git/list_branches`,
605-
{
606-
searchParams: {
607-
access_token: this._session?.accessToken,
608-
},
583+
.get(`${url}/git/list_branches`, {
584+
searchParams: {
585+
access_token: this._session?.accessToken,
609586
},
610-
)
587+
})
611588
.json();
612589
if (resp.code) {
613590
return Promise.reject(resp);

src/extension.ts

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,10 @@ export async function activate(context: vscode.ExtensionContext) {
1313
const repoInfo = await CodingServer.getRepoParams();
1414

1515
if (!repoInfo?.team) {
16+
vscode.commands.executeCommand('setContext', 'hasTeam', false);
1617
vscode.window.showInformationMessage(`Please open a repo hosted by coding.net.`);
1718
} else {
19+
vscode.commands.executeCommand('setContext', 'hasTeam', true);
1820
context.workspaceState.update(`repoInfo`, repoInfo);
1921
}
2022

@@ -106,28 +108,41 @@ export async function activate(context: vscode.ExtensionContext) {
106108
return;
107109
}
108110

109-
const content = editor.document.getText();
111+
let content = editor.document.getText().trimStart();
110112
if (!content) {
111113
return;
112114
}
113115

116+
const firstLineBreak = content.indexOf(`\n`);
117+
const defaultTitle = content.slice(0, firstLineBreak).trim();
118+
114119
const { data } = await codingSrv.getBranchList();
115120
const list = data.map((i) => ({
116121
label: i.name,
117122
description: ``,
118123
}));
124+
119125
const src = await vscode.window.showQuickPick(list, {
120126
placeHolder: `Please choose source branch`,
121127
});
122128
if (!src) return;
129+
123130
const des = await vscode.window.showQuickPick(list, {
124131
placeHolder: `Please choose target branch`,
125132
});
126133
if (!des) return;
127-
const title = await vscode.window.showInputBox({ placeHolder: `Please input title` });
134+
135+
const title = await vscode.window.showInputBox({
136+
placeHolder: `By default it's the first line of this document.`,
137+
prompt: `Please input title for this merge request.`,
138+
value: defaultTitle,
139+
});
128140
if (!title) {
129141
return;
130142
}
143+
if (title === defaultTitle) {
144+
content = content.slice(firstLineBreak + 1).trimStart() || ``;
145+
}
131146

132147
try {
133148
const newMr = await codingSrv.createMR({

src/tree/mrTree.ts

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,9 +20,12 @@ enum ItemType {
2020
Node = `node`,
2121
}
2222

23-
const getIcon = (name: string, theme: string) => path.join(__filename, `../../../src/assets/${theme}/${name}.png`);
23+
const getIcon = (name: string, theme: string) =>
24+
path.join(__filename, `../../../src/assets/${theme}/${name}.png`);
2425

25-
const FileModeIcons: { [key: string]: { light: string | vscode.Uri; dark: string | vscode.Uri } } = {
26+
const FileModeIcons: {
27+
[key: string]: { light: string | vscode.Uri; dark: string | vscode.Uri };
28+
} = {
2629
[GitChangeType.MODIFY]: {
2730
dark: getIcon(`icon_m`, `dark`),
2831
light: getIcon(`icon_m`, `light`),
@@ -47,7 +50,9 @@ export interface IFileNode extends IMRPathItem {
4750
type ITreeNode = string | number | IMRDiffStat | IFileNode | IMRData;
4851

4952
export class MRTreeDataProvider implements vscode.TreeDataProvider<ListItem<ITreeNode>> {
50-
private _onDidChangeTreeData: vscode.EventEmitter<ListItem<ITreeNode> | undefined | void> = new vscode.EventEmitter<ListItem<ITreeNode> | undefined | void>();
53+
private _onDidChangeTreeData: vscode.EventEmitter<
54+
ListItem<ITreeNode> | undefined | void
55+
> = new vscode.EventEmitter<ListItem<ITreeNode> | undefined | void>();
5156
readonly onDidChangeTreeData: vscode.Event<ListItem<ITreeNode> | undefined | void> = this
5257
._onDidChangeTreeData.event;
5358
private _disposables: vscode.Disposable[];
@@ -78,7 +83,7 @@ export class MRTreeDataProvider implements vscode.TreeDataProvider<ListItem<ITre
7883

7984
getChildren(element?: ListItem<ITreeNode>): Thenable<ListItem<ITreeNode>[]> {
8085
if (!this._service.loggedIn) {
81-
vscode.window.showErrorMessage(`[MR Tree] auth expired.`);
86+
vscode.window.showErrorMessage(`[MR Tree] Invalid credentials.`);
8287
return Promise.resolve([]);
8388
}
8489

@@ -99,11 +104,7 @@ export class MRTreeDataProvider implements vscode.TreeDataProvider<ListItem<ITre
99104
MRType.Closed,
100105
TreeItemCollapsibleState.Collapsed,
101106
),
102-
new CategoryItem(
103-
MRType.All.toUpperCase(),
104-
MRType.All,
105-
TreeItemCollapsibleState.Collapsed,
106-
),
107+
new CategoryItem(MRType.All.toUpperCase(), MRType.All, TreeItemCollapsibleState.Collapsed),
107108
]);
108109
}
109110

@@ -137,12 +138,7 @@ export class MRTreeDataProvider implements vscode.TreeDataProvider<ListItem<ITre
137138
}
138139

139140
return list.map((i: IMRData) => {
140-
return new MRItem(
141-
i.title,
142-
i,
143-
TreeItemCollapsibleState.Collapsed,
144-
this._context,
145-
);
141+
return new MRItem(i.title, i, TreeItemCollapsibleState.Collapsed, this._context);
146142
});
147143
})
148144
.catch(() => {
@@ -177,7 +173,11 @@ export class ListItem<T> extends vscode.TreeItem {
177173
public readonly value: T,
178174
public readonly collapsibleState: TreeItemCollapsibleState,
179175
public readonly command?: vscode.Command,
180-
public readonly iconPath?: string | vscode.Uri | { light: string | vscode.Uri; dark: string | vscode.Uri } | vscode.ThemeIcon,
176+
public readonly iconPath?:
177+
| string
178+
| vscode.Uri
179+
| { light: string | vscode.Uri; dark: string | vscode.Uri }
180+
| vscode.ThemeIcon,
181181
) {
182182
super(label, collapsibleState);
183183
}
@@ -306,10 +306,10 @@ export class FileNode extends ListItem<IFileNode> {
306306
collapsibleState,
307307
collapsibleState === TreeItemCollapsibleState.None
308308
? {
309-
command: `codingPlugin.showDiff`,
310-
title: ``,
311-
arguments: [value],
312-
}
309+
command: `codingPlugin.showDiff`,
310+
title: ``,
311+
arguments: [value],
312+
}
313313
: undefined,
314314
FileNode.getFileIcon(value.changeType, collapsibleState),
315315
);

0 commit comments

Comments
 (0)