UNPKG

@ysfe/c-gdc

Version:

命令行工具: 提供按group批量 clone gitlab repo 能力

291 lines 13.7 kB
"use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); __setModuleDefault(result, mod); return result; }; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; var __spreadArray = (this && this.__spreadArray) || function (to, from) { for (var i = 0, il = from.length, j = to.length; i < il; i++, j++) to[j] = from[i]; return to; }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); var axios_1 = __importDefault(require("axios")); var simple_git_1 = __importDefault(require("simple-git")); var enquirer_1 = require("enquirer"); var fs = __importStar(require("fs")); var path_1 = __importDefault(require("path")); var axios = axios_1.default.create({ baseURL: 'http://gitlab.yslocal.com', withCredentials: true, headers: { 'Content-Type': 'application/x-www-form-urlencoded', Host: 'gitlab.yslocal.com' } }); var CommandGitDeepClone = (function () { function CommandGitDeepClone() { } CommandGitDeepClone.prototype.command = function () { return __awaiter(this, void 0, void 0, function () { var groups, projects; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4, this.inputGitUser()]; case 1: _a.sent(); return [4, this.pullAllGroup()]; case 2: groups = _a.sent(); return [4, this.filterCloneGroup(groups)]; case 3: groups = _a.sent(); return [4, this.pullProject(groups)]; case 4: projects = _a.sent(); console.log('> 共计:', projects.length, '个项目'); this.clones(projects); return [2]; } }); }); }; CommandGitDeepClone.prototype.filterCloneGroup = function (groups) { return __awaiter(this, void 0, void 0, function () { var isConfirm, selected, error_1; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4, enquirer_1.prompt({ type: 'select', name: 'isConfirm', message: 'clones project from all group?', choices: ['yes', 'no'] })]; case 1: isConfirm = (_a.sent()).isConfirm; if (!(isConfirm !== 'yes')) return [3, 5]; _a.label = 2; case 2: _a.trys.push([2, 4, , 5]); return [4, enquirer_1.prompt({ type: 'multiselect', name: 'selected', message: 'Pick your favorite colors', choices: groups })]; case 3: selected = (_a.sent()).selected; groups = selected; return [3, 5]; case 4: error_1 = _a.sent(); return [3, 5]; case 5: return [2, groups]; } }); }); }; CommandGitDeepClone.prototype.inputGitUser = function () { var _a; return __awaiter(this, void 0, void 0, function () { var query, cookie, response; return __generator(this, function (_b) { switch (_b.label) { case 0: query = []; if (!!((_a = this.opt) === null || _a === void 0 ? void 0 : _a.Cookie)) return [3, 2]; query.push({ type: 'input', name: 'Cookie', message: 'gitlab session (登录后, 从cookie中查看)' }); return [4, enquirer_1.prompt(query)]; case 1: response = _b.sent(); cookie = response.Cookie; return [3, 3]; case 2: cookie = this.opt.Cookie; _b.label = 3; case 3: this.opt = { Cookie: cookie.includes('=') ? cookie : '_gitlab_session=' + cookie }; return [2]; } }); }); }; CommandGitDeepClone.prototype.pullAllGroup = function () { return __awaiter(this, void 0, void 0, function () { var data, groups; return __generator(this, function (_a) { switch (_a.label) { case 0: return [4, axios.get('/dashboard/groups.json', { headers: { Cookie: this.opt.Cookie } })]; case 1: data = (_a.sent()).data; groups = data.map(function (item) { var _a; return (_a = item['relative_path']) === null || _a === void 0 ? void 0 : _a.replace(/^\//, ''); }); return [2, groups]; } }); }); }; CommandGitDeepClone.prototype.pullProject = function (groups, pageIndex) { if (pageIndex === void 0) { pageIndex = 1; } return __awaiter(this, void 0, void 0, function () { var projects, _i, groups_1, group, p, _a, data, headers, _b, data_1, project, type, relative_path, children, children; return __generator(this, function (_c) { switch (_c.label) { case 0: console.log('fetching...'); projects = []; _i = 0, groups_1 = groups; _c.label = 1; case 1: if (!(_i < groups_1.length)) return [3, 10]; group = groups_1[_i]; p = path_1.default.normalize("/groups/" + group + "/-/children.json" + (pageIndex > 1 ? '?page=' + pageIndex : '')); console.log('> pull', p); return [4, axios.get(p, { headers: { Cookie: this.opt.Cookie } })]; case 2: _a = _c.sent(), data = _a.data, headers = _a.headers; _b = 0, data_1 = data; _c.label = 3; case 3: if (!(_b < data_1.length)) return [3, 7]; project = data_1[_b]; type = project.type, relative_path = project.relative_path; if (!(type === 'group')) return [3, 5]; return [4, this.pullProject([relative_path])]; case 4: children = _c.sent(); projects = __spreadArray(__spreadArray([], projects), children); return [3, 6]; case 5: projects.push(relative_path); _c.label = 6; case 6: _b++; return [3, 3]; case 7: if (!(headers['x-total-pages'] > 1 && pageIndex < headers['x-total-pages'])) return [3, 9]; return [4, this.pullProject(groups, pageIndex + 1)]; case 8: children = _c.sent(); projects = __spreadArray(__spreadArray([], projects), children); _c.label = 9; case 9: _i++; return [3, 1]; case 10: return [2, projects]; } }); }); }; CommandGitDeepClone.prototype.clones = function (projects) { return __awaiter(this, void 0, void 0, function () { var p, inp, error_2, _i, projects_1, pro, repo; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4, enquirer_1.prompt({ type: 'input', name: 'p', message: '输入一个本地地址, 用来clone 这些仓库:' })]; case 1: inp = (_a.sent()); p = inp.p; return [3, 3]; case 2: error_2 = _a.sent(); return [3, 3]; case 3: if (!fs.existsSync(p)) return [2, console.log("> path not exist:", p)]; if (!fs.statSync(p).isDirectory()) return [2, console.log("> path not a directory:", p)]; _i = 0, projects_1 = projects; _a.label = 4; case 4: if (!(_i < projects_1.length)) return [3, 7]; pro = projects_1[_i]; repo = "http://gitlab.yslocal.com" + pro; if (fs.existsSync(p + pro)) return [3, 6]; return [4, simple_git_1.default().clone(repo, p + pro)]; case 5: _a.sent(); console.log('> cloned', repo); _a.label = 6; case 6: _i++; return [3, 4]; case 7: return [2]; } }); }); }; return CommandGitDeepClone; }()); exports.default = CommandGitDeepClone; //# sourceMappingURL=index.js.map