Skip to content

Commit 4a3aa10

Browse files
committed
feat: add create depot logic
1 parent b4b6ef2 commit 4a3aa10

File tree

11 files changed

+199
-193
lines changed

11 files changed

+199
-193
lines changed

out/extension.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,16 +13,22 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
1313
};
1414
Object.defineProperty(exports, "__esModule", { value: true });
1515
exports.deactivate = exports.activate = void 0;
16+
const hbuilderx_1 = __importDefault(require("hbuilderx"));
1617
const init_1 = __importDefault(require("./init"));
1718
const webview_1 = __importDefault(require("./webview"));
1819
const codingServer_1 = __importDefault(require("./services/codingServer"));
1920
const proxy_1 = require("./utils/proxy");
2021
const accessToken = '1b7fca3bd7594a89b0f5e2a0250c1147';
2122
function activate(context) {
2223
return __awaiter(this, void 0, void 0, function* () {
24+
// TODO: 认证,拿到用户信息
2325
const webviewProvider = new webview_1.default();
2426
const repoInfo = yield codingServer_1.default.getRepoParams();
2527
console.log('repoInfo ==> ', repoInfo);
28+
if (!repoInfo) {
29+
hbuilderx_1.default.window.showWarningMessage('workspace中没有CODING的代码仓库');
30+
return;
31+
}
2632
const codingServer = new codingServer_1.default({
2733
id: '123',
2834
user: {

out/init.js

Lines changed: 49 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,53 @@
11
"use strict";
2+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4+
return new (P || (P = Promise))(function (resolve, reject) {
5+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8+
step((generator = generator.apply(thisArg, _arguments || [])).next());
9+
});
10+
};
211
var __importDefault = (this && this.__importDefault) || function (mod) {
312
return (mod && mod.__esModule) ? mod : { "default": mod };
413
};
514
Object.defineProperty(exports, "__esModule", { value: true });
6-
exports.createTreeViews = exports.registerCommands = void 0;
15+
exports.clear = exports.workspaceInit = exports.createTreeViews = exports.registerCommands = void 0;
716
const hbuilderx_1 = __importDefault(require("hbuilderx"));
817
const depot_1 = __importDefault(require("./trees/depot"));
918
const mr_1 = __importDefault(require("./trees/mr"));
1019
const repo_1 = require("./utils/repo");
1120
function registerCommands(context) {
12-
const { webviewProvider, repoInfo } = context;
21+
const { webviewProvider, repoInfo, codingServer } = context;
22+
const { team, project } = repoInfo;
1323
context.subscriptions.push(hbuilderx_1.default.commands.registerCommand('codingPlugin.helloWorld', () => {
1424
hbuilderx_1.default.window.showInformationMessage('你好,这是我的第一个插件扩展。');
15-
// webviewProvider.panel.webView.postMessage('hhhhh');
1625
}));
1726
context.subscriptions.push(hbuilderx_1.default.commands.registerCommand('codingPlugin.mrTreeItemClick', function (param) {
18-
// hx.window.showInformationMessage('选中了TreeItem:' + param[0]);
1927
// webviewProvider.update(param[0]);
20-
hbuilderx_1.default.env.openExternal(repo_1.getMRUrl(repoInfo.team, param));
28+
hbuilderx_1.default.env.openExternal(repo_1.getMRUrl(team, param));
2129
}));
2230
context.subscriptions.push(hbuilderx_1.default.commands.registerCommand('codingPlugin.depotTreeItemClick', function (param) {
23-
hbuilderx_1.default.env.openExternal(repo_1.getDepotUrl(repoInfo.team, param));
31+
console.log('选中了: ', param);
32+
}));
33+
context.subscriptions.push(hbuilderx_1.default.commands.registerCommand('codingPlugin.createProjectAndDepot', function () {
34+
return __awaiter(this, void 0, void 0, function* () {
35+
const project = yield hbuilderx_1.default.window.showInputBox({
36+
prompt: '请输入项目名'
37+
});
38+
const depot = yield hbuilderx_1.default.window.showInputBox({
39+
prompt: '请输入仓库名'
40+
});
41+
});
42+
}));
43+
context.subscriptions.push(hbuilderx_1.default.commands.registerCommand('codingPlugin.createDepot', function (param) {
44+
return __awaiter(this, void 0, void 0, function* () {
45+
const depot = yield hbuilderx_1.default.window.showInputBox({
46+
prompt: '请输入仓库名'
47+
});
48+
const result = yield codingServer.createDepot(team, depot, depot);
49+
// TODO: 拉取代码,更新workspace
50+
});
2451
}));
2552
}
2653
exports.registerCommands = registerCommands;
@@ -35,8 +62,24 @@ function createTreeViews(context) {
3562
}));
3663
}
3764
exports.createTreeViews = createTreeViews;
65+
function workspaceInit() {
66+
hbuilderx_1.default.workspace.onDidChangeWorkspaceFolders(function (event) {
67+
if (event.added) {
68+
event.added.forEach((item) => console.log('新增了项目: ', item.name));
69+
}
70+
if (event.removed) {
71+
event.removed.forEach((item) => console.log('移除了项目: ', item.name));
72+
}
73+
});
74+
}
75+
exports.workspaceInit = workspaceInit;
76+
function clear(context) {
77+
context.subscriptions.forEach(({ dispose }) => dispose());
78+
}
79+
exports.clear = clear;
3880
function init(context) {
3981
registerCommands(context);
4082
createTreeViews(context);
83+
workspaceInit();
4184
}
4285
exports.default = init;

out/services/codingServer.js

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
1414
Object.defineProperty(exports, "__esModule", { value: true });
1515
const hbuilderx_1 = __importDefault(require("hbuilderx"));
1616
const fs_1 = __importDefault(require("fs"));
17+
const querystring_1 = __importDefault(require("querystring"));
1718
const axios_1 = __importDefault(require("../utils/axios"));
1819
const isomorphic_git_1 = __importDefault(require("isomorphic-git"));
1920
const repo_1 = require("../utils/repo");
@@ -105,5 +106,33 @@ class CodingServer {
105106
}
106107
});
107108
}
109+
createProjectAndDepot(team, payload) {
110+
return __awaiter(this, void 0, void 0, function* () {
111+
return 'createProjectAndDepot';
112+
});
113+
}
114+
createDepot(team = this._repo.team, project = this._repo.project, depot) {
115+
return __awaiter(this, void 0, void 0, function* () {
116+
try {
117+
const result = yield axios_1.default({
118+
method: 'post',
119+
url: `https://${team}.coding.net/api/user/${team}/project/${project}/depot?access_token=${this._session.accessToken}`,
120+
header: {
121+
'content-type': 'application/x-www-form-urlencoded;charset=UTF-8'
122+
},
123+
data: querystring_1.default.stringify({
124+
name: depot,
125+
vcsType: 'git',
126+
gitReadmeEnabled: false,
127+
shared: false
128+
})
129+
});
130+
console.log('result => ', result);
131+
}
132+
catch (err) {
133+
throw new Error(err);
134+
}
135+
});
136+
}
108137
}
109138
exports.default = CodingServer;

out/trees/depot.js

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,13 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
1313
};
1414
Object.defineProperty(exports, "__esModule", { value: true });
1515
const hbuilderx_1 = __importDefault(require("hbuilderx"));
16+
const getCommand = (element) => {
17+
if (element.children)
18+
return '';
19+
if (element._create)
20+
return 'codingPlugin.createDepot';
21+
return 'codingPlugin.depotTreeItemClick';
22+
};
1623
class DepotTreeDataProvider extends hbuilderx_1.default.TreeDataProvider {
1724
constructor(context) {
1825
super();
@@ -28,7 +35,7 @@ class DepotTreeDataProvider extends hbuilderx_1.default.TreeDataProvider {
2835
return Promise.resolve([
2936
{
3037
name: '创建仓库',
31-
disableClick: true,
38+
_create: true,
3239
},
3340
{
3441
name: '仓库列表',
@@ -46,9 +53,10 @@ class DepotTreeDataProvider extends hbuilderx_1.default.TreeDataProvider {
4653
label: element.name,
4754
collapsibleState: element.children ? 1 : 0,
4855
command: {
49-
command: (element.children || element.disableClick) ? '' : 'codingPlugin.depotTreeItemClick',
56+
command: getCommand(element),
5057
arguments: element
51-
}
58+
},
59+
contextValue: 'createDepot'
5260
};
5361
}
5462
}

out/webviews/main.js

Lines changed: 0 additions & 11 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,14 @@
3030
{
3131
"command": "codingPlugin.depotTreeItemClick",
3232
"title": "Click Depot Tree Item"
33+
},
34+
{
35+
"command": "codingPlugin.createProjectAndDepot",
36+
"title": "Create Project and Depot"
37+
},
38+
{
39+
"command": "codingPlugin.createDepot",
40+
"title": "Create Depot"
3341
}
3442
],
3543
"menus": {
@@ -42,6 +50,12 @@
4250
{
4351
"group": "z_commands"
4452
}
53+
],
54+
"view/item/context": [
55+
{
56+
"command": "codingPlugin.createDepot",
57+
"when": "viewItem == 'createDepot'"
58+
}
4559
]
4660
},
4761
"viewsContainers": {
@@ -93,8 +107,8 @@
93107
},
94108
"dependencies": {
95109
"axios": "^0.21.0",
96-
"got": "^11.8.0",
97110
"isomorphic-git": "^1.8.0",
111+
"querystring": "^0.2.0",
98112
"react": "^17.0.1",
99113
"react-dom": "^17.0.1"
100114
},

src/extension.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import hx from 'hbuilderx';
12
import init from './init';
23
import WebviewProvider from './webview';
34
import CodingServer from './services/codingServer';
@@ -6,10 +7,17 @@ import { proxyCtx } from './utils/proxy';
67
const accessToken = '1b7fca3bd7594a89b0f5e2a0250c1147';
78

89
async function activate(context: IContext) {
10+
// TODO: 认证,拿到用户信息
11+
912
const webviewProvider = new WebviewProvider();
1013
const repoInfo = await CodingServer.getRepoParams();
1114
console.log('repoInfo ==> ', repoInfo);
1215

16+
if (!repoInfo) {
17+
hx.window.showWarningMessage('workspace中没有CODING的代码仓库');
18+
return;
19+
}
20+
1321
const codingServer = new CodingServer(
1422
{
1523
id: '123',

src/init.ts

Lines changed: 39 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,41 @@
11
import hx from 'hbuilderx';
22
import DepotTreeDataProvider from './trees/depot';
33
import MRTreeDataProvider from './trees/mr';
4-
import { getMRUrl, getDepotUrl } from './utils/repo';
4+
import { getMRUrl } from './utils/repo';
55
import { IDepot, IMRItem } from './typings/common';
66

77
export function registerCommands(context: IContext) {
8-
const { webviewProvider, repoInfo } = context;
8+
const { webviewProvider, repoInfo, codingServer } = context;
9+
const { team, project } = repoInfo;
910

1011
context.subscriptions.push(hx.commands.registerCommand('codingPlugin.helloWorld', () => {
1112
hx.window.showInformationMessage('你好,这是我的第一个插件扩展。');
12-
// webviewProvider.panel.webView.postMessage('hhhhh');
1313
}));
1414

1515
context.subscriptions.push(hx.commands.registerCommand('codingPlugin.mrTreeItemClick', function(param: IMRItem) {
16-
// hx.window.showInformationMessage('选中了TreeItem:' + param[0]);
1716
// webviewProvider.update(param[0]);
18-
hx.env.openExternal(getMRUrl(repoInfo.team, param));
17+
hx.env.openExternal(getMRUrl(team, param));
1918
}));
2019

2120
context.subscriptions.push(hx.commands.registerCommand('codingPlugin.depotTreeItemClick', function(param: IDepot) {
22-
hx.env.openExternal(getDepotUrl(repoInfo.team, param));
21+
console.log('选中了: ', param);
22+
}));
23+
24+
context.subscriptions.push(hx.commands.registerCommand('codingPlugin.createProjectAndDepot', async function() {
25+
const project = await hx.window.showInputBox({
26+
prompt: '请输入项目名'
27+
});
28+
const depot = await hx.window.showInputBox({
29+
prompt: '请输入仓库名'
30+
});
31+
}));
32+
33+
context.subscriptions.push(hx.commands.registerCommand('codingPlugin.createDepot', async function(param: any) {
34+
const depot = await hx.window.showInputBox({
35+
prompt: '请输入仓库名'
36+
});
37+
const result = await codingServer.createDepot(team, depot, depot);
38+
// TODO: 拉取代码,更新workspace
2339
}));
2440
}
2541

@@ -35,7 +51,24 @@ export function createTreeViews(context: IContext) {
3551
}));
3652
}
3753

54+
export function workspaceInit() {
55+
hx.workspace.onDidChangeWorkspaceFolders(function(event: any) {
56+
if (event.added) {
57+
event.added.forEach((item: any) => console.log('新增了项目: ', item.name));
58+
}
59+
60+
if (event.removed) {
61+
event.removed.forEach((item: any) => console.log('移除了项目: ', item.name));
62+
}
63+
});
64+
}
65+
66+
export function clear(context: IContext) {
67+
context.subscriptions.forEach(({ dispose }) => dispose());
68+
}
69+
3870
export default function init(context: IContext) {
3971
registerCommands(context);
4072
createTreeViews(context);
73+
workspaceInit();
4174
}

src/services/codingServer.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import hx from 'hbuilderx';
22
import fs from 'fs';
3+
import qs from 'querystring';
34
import axios from '../utils/axios';
45
import git from 'isomorphic-git';
56
import { IRepoInfo, ISessionData } from '../typings/common';
@@ -92,4 +93,29 @@ export default class CodingServer {
9293
throw new Error(err);
9394
}
9495
}
96+
97+
async createProjectAndDepot(team: string, payload: { project: string, depot: string }) {
98+
return 'createProjectAndDepot';
99+
}
100+
101+
async createDepot(team: string = this._repo.team, project: string = this._repo.project, depot: string) {
102+
try {
103+
const result = await axios({
104+
method: 'post',
105+
url: `https://${team}.coding.net/api/user/${team}/project/${project}/depot?access_token=${this._session.accessToken}`,
106+
header: {
107+
'content-type': 'application/x-www-form-urlencoded;charset=UTF-8'
108+
},
109+
data: qs.stringify({
110+
name: depot,
111+
vcsType: 'git',
112+
gitReadmeEnabled: false,
113+
shared: false
114+
})
115+
});
116+
console.log('result => ', result);
117+
} catch (err) {
118+
throw new Error(err);
119+
}
120+
}
95121
}

src/trees/depot.ts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,15 @@ import hx from 'hbuilderx';
22
import { IDepot } from '../typings/common';
33

44
interface IItem extends ITreeItem {
5-
disableClick: boolean;
5+
_create: boolean;
66
}
77

8+
const getCommand = (element: IDepot & IItem) => {
9+
if (element.children) return '';
10+
if (element._create) return 'codingPlugin.createDepot';
11+
return 'codingPlugin.depotTreeItemClick';
12+
};
13+
814
class DepotTreeDataProvider extends hx.TreeDataProvider {
915
constructor(context: IContext) {
1016
super();
@@ -21,7 +27,7 @@ class DepotTreeDataProvider extends hx.TreeDataProvider {
2127
return Promise.resolve([
2228
{
2329
name: '创建仓库',
24-
disableClick: true,
30+
_create: true,
2531
},
2632
{
2733
name: '仓库列表',
@@ -38,9 +44,10 @@ class DepotTreeDataProvider extends hx.TreeDataProvider {
3844
label: element.name,
3945
collapsibleState: element.children ? 1 : 0,
4046
command: {
41-
command: (element.children || element.disableClick) ? '' : 'codingPlugin.depotTreeItemClick',
47+
command: getCommand(element),
4248
arguments: element
43-
}
49+
},
50+
contextValue: 'createDepot'
4451
};
4552
}
4653
}

0 commit comments

Comments
 (0)