Skip to content

Commit 058d382

Browse files
committed
feat: switch repo.
1 parent 677b65f commit 058d382

File tree

3 files changed

+73
-21
lines changed

3 files changed

+73
-21
lines changed

src/codingServer.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { nanoid } from 'nanoid';
33
import got from 'got';
44

55
import gotInstance from './common/request';
6-
import { AuthFailResult, AuthSuccessResult, CodingResponse } from './typings/respResult';
6+
import { AuthFailResult, AuthSuccessResult, CodingResponse, IRepoListResponse } from './typings/respResult';
77
import { PromiseAdapter, promiseFromEvent, parseQuery, parseCloneUrl } from './common/utils';
88
import { GitService } from './common/gitService';
99
import { RepoInfo, SessionData, TokenType } from './typings/commonTypes';
@@ -232,6 +232,31 @@ export class CodingServer {
232232
}
233233
}
234234

235+
public async getRepoList() {
236+
try {
237+
const repoInfo = this._context.workspaceState.get(`repoInfo`) as RepoInfo;
238+
if (!repoInfo?.team) {
239+
throw new Error(`team not exist`);
240+
}
241+
242+
const { code, data, msg }: IRepoListResponse = await got.get(`https://${repoInfo.team}.coding.net/api/user/${this._session?.user?.global_key}/depots`, {
243+
searchParams: {
244+
access_token: this._session?.accessToken,
245+
}
246+
}).json();
247+
if (code) {
248+
return Promise.reject({ code, msg });
249+
}
250+
251+
return {
252+
code,
253+
data: data.filter(i => i.vcsType === `git`),
254+
};
255+
} catch (err) {
256+
return Promise.reject(err);
257+
}
258+
}
259+
235260
get loggedIn() {
236261
return this._loggedIn;
237262
}

src/extension.ts

Lines changed: 34 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { uriHandler, CodingServer } from './codingServer';
55
import { Panel } from './panel';
66
import { ListItem, MRTreeDataProvider } from './tree/mr-tree';
77
import { ReleaseTreeDataProvider } from './tree/release-tree';
8+
import { RepoInfo } from './typings/commonTypes';
89

910
export async function activate(context: vscode.ExtensionContext) {
1011
const repoInfo = await CodingServer.getRepoParams();
@@ -24,15 +25,16 @@ export async function activate(context: vscode.ExtensionContext) {
2425
context.workspaceState.update(`session`, codingSrv.session);
2526
}
2627

27-
const treeDataProvider = new MRTreeDataProvider(context, codingSrv);
28-
const tree = vscode.window.createTreeView(`mrTreeView`, { treeDataProvider });
29-
vscode.window.registerTreeDataProvider(`releaseTreeView`, new ReleaseTreeDataProvider(context));
28+
const mrDataProvider = new MRTreeDataProvider(context, codingSrv);
29+
const releaseDataProvider = new ReleaseTreeDataProvider(context);
30+
const mrTree = vscode.window.createTreeView(`mrTreeView`, { treeDataProvider: mrDataProvider });
31+
const releaseTree = vscode.window.createTreeView(`releaseTreeView`, { treeDataProvider: releaseDataProvider });
3032

3133
context.subscriptions.push(vscode.window.registerUriHandler(uriHandler));
3234
context.subscriptions.push(
3335
vscode.commands.registerCommand('codingPlugin.show', () => {
3436
Panel.createOrShow(context);
35-
tree.reveal({} as ListItem);
37+
mrTree.reveal({} as ListItem);
3638
}),
3739
);
3840
context.subscriptions.push(
@@ -47,7 +49,7 @@ export async function activate(context: vscode.ExtensionContext) {
4749
if (!session?.accessToken) {
4850
console.error(`No token provided.`);
4951
} else {
50-
treeDataProvider.refresh();
52+
mrDataProvider.refresh();
5153
}
5254
}),
5355
);
@@ -57,29 +59,40 @@ export async function activate(context: vscode.ExtensionContext) {
5759
await codingSrv.logout();
5860
vscode.window.showInformationMessage(`Logout successfully.`);
5961
} finally {
60-
treeDataProvider.refresh();
62+
mrDataProvider.refresh();
6163
}
6264
}),
6365
);
6466
context.subscriptions.push(
6567
vscode.commands.registerCommand('codingPlugin.refresh', () => {
66-
treeDataProvider.refresh();
68+
mrDataProvider.refresh();
6769
}),
6870
);
6971
context.subscriptions.push(
7072
vscode.commands.registerCommand('codingPlugin.switchRepo', async () => {
71-
vscode.window.showQuickPick([
72-
{
73-
label: `1`,
74-
description: `1`
75-
},
76-
{
77-
label: `2`,
78-
description: `2`
79-
},
80-
]).then((selection) => {
81-
console.log(selection)
82-
})
73+
try {
74+
const { data } = await codingSrv.getRepoList();
75+
const list = data.map(i => ({
76+
label: i.name,
77+
description: i.depotPath.replace(`/p/`, ``)
78+
.replace(`/d/`, `/`)
79+
.replace(`/git`, ``),
80+
}));
81+
const selection = await vscode.window.showQuickPick(list);
82+
if (!selection)
83+
return;
84+
85+
const r = context.workspaceState.get(`repoInfo`) as RepoInfo;
86+
context.workspaceState.update(`repoInfo`, {
87+
team: r?.team,
88+
project: selection?.description.replace(`/${selection?.label}`, ``),
89+
repo: selection?.label,
90+
});
91+
mrDataProvider.refresh();
92+
releaseDataProvider.refresh();
93+
} catch (e) {
94+
vscode.window.showWarningMessage(`Repo list: fetch failed.`);
95+
}
8396
}),
8497
);
8598

@@ -93,4 +106,5 @@ export async function activate(context: vscode.ExtensionContext) {
93106
}
94107
}
95108

96-
export function deactivate() { }
109+
export function deactivate() {
110+
}

src/typings/respResult.ts

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,3 +34,16 @@ export interface CodingResponse {
3434
data?: any,
3535
msg?: string
3636
}
37+
38+
export interface IRepoItem {
39+
id: number;
40+
name: string;
41+
vcsType: 'git';
42+
depotPath: string;
43+
gitHttpsUrl: string;
44+
gitSshUrl: string;
45+
}
46+
47+
export interface IRepoListResponse extends CodingResponse {
48+
data: IRepoItem[];
49+
}

0 commit comments

Comments
 (0)