UNPKG

@afuteam-nx/plugin-fetch-repos

Version:

批量获取远程仓库信息,支持配置 groupId, projectid,以及黑白名单

136 lines 6.73 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = require("tslib"); const axios_1 = require("axios"); const index_js_1 = require("./utils/index.js"); function runExecutor(options) { return tslib_1.__awaiter(this, void 0, void 0, function* () { const { accessToken, resultPath, gitLabBaseUrl, rootGroupId, ignoreGroupIds, ignoreProjectsIds, addRepoIds, per_page = 100, } = options; // 获取指定 Group ID 下的所有 Projects function getProjects(groupId, page = 1) { return tslib_1.__awaiter(this, void 0, void 0, function* () { try { const response = yield axios_1.default.get(`${gitLabBaseUrl}/api/v4/groups/${groupId}/projects?per_page=${per_page}&page=${page}`, { headers: { 'PRIVATE-TOKEN': accessToken, }, }); const status = yield response.status; if (status === 200) { const projects = (yield response.data); if (projects.length === per_page) { return [...projects, ...(yield getProjects(groupId, page + 1))]; } return projects; } return []; } catch (error) { console.error('Error occurred while fetching projects:', error.message); throw error; } }); } // 获取指定 Group ID 下的所有子 Group function getSubGroups(groupId, page = 1) { return tslib_1.__awaiter(this, void 0, void 0, function* () { try { const response = yield axios_1.default.get(`${gitLabBaseUrl}/api/v4/groups/${groupId}/subgroups?per_page=${per_page}&page=${page}`, { headers: { 'PRIVATE-TOKEN': accessToken, }, }); const status = yield response.status; if (status === 200) { const subGroups = (yield response.data); // 排除 ignoreGroupIds const afterFilterSubGroups = subGroups.filter(({ id }) => !ignoreGroupIds.includes(id)); if (subGroups.length === per_page) { return [ ...afterFilterSubGroups, ...(yield getSubGroups(groupId, page + 1)), ]; } return afterFilterSubGroups; } return []; } catch (error) { console.error('Error occurred while fetching subgroups:', error.message); throw error; } }); } // 递归获取所有子 Group 下的 Projects,并提取所需字段 function getAllSubGroupProjects(groupId) { return tslib_1.__awaiter(this, void 0, void 0, function* () { try { const subProjects = yield getProjects(groupId); const subGroups = yield getSubGroups(groupId); // 使用 Promise.all 并行地获取每个子组的项目 const subGroupProjectsPromises = subGroups.map((group) => getAllSubGroupProjects(group.id)); const subGroupProjectsArrays = yield Promise.all(subGroupProjectsPromises); // 将所有子组的项目合并成一个数组 const allSubGroupProjects = [].concat(...subGroupProjectsArrays); // 合并本组和所有子组的项目 return [...subProjects, ...allSubGroupProjects]; } catch (error) { console.error('Error occurred while fetching projects:', error.message); throw error; } }); } // 获取指定 projectIds 的信息 function getProjectsByIds(ids) { return tslib_1.__awaiter(this, void 0, void 0, function* () { if (!ids || ids.length === 0) { return []; } try { const projects = yield Promise.all(ids.map((repo_id) => axios_1.default .get(`${gitLabBaseUrl}/api/v4/projects/${repo_id}`, { headers: { 'PRIVATE-TOKEN': accessToken }, }) .then((response) => response.status === 200 ? response.data : null) .catch((err) => { console.error(`Error occurred while fetching project ${repo_id}:`, err.message); return null; // 如果请求失败,返回null }))); return projects.filter((project) => project !== null); // 过滤掉错误的请求结果 } catch (error) { console.error('Unexpected error occurred while fetching projects:', error.message); throw error; } }); } const main = () => tslib_1.__awaiter(this, void 0, void 0, function* () { try { const rootGroupIdProjectsInfos = yield getAllSubGroupProjects(rootGroupId); const addProjectInfos = yield getProjectsByIds(addRepoIds); const allProjectsMap = new Map(); const allProjectsTempArr = [ ...rootGroupIdProjectsInfos, ...addProjectInfos, ]; allProjectsTempArr.forEach((item) => allProjectsMap.set(item.id, item)); const result = Array.from(allProjectsMap.values()); const filteredResult = result.filter((item) => !ignoreProjectsIds.includes(item.id)); console.log(`\n${new Date()} \n当前使用的token是 ${accessToken}\n 共有项目 ${filteredResult.length} 个`); index_js_1.default.writeRes2SomePath('allProjects.json', filteredResult, resultPath); return true; } catch (error) { console.error('Error occurred:', error.message); return false; } }); const result = yield main(); return { success: result, }; }); } exports.default = runExecutor; //# sourceMappingURL=executor.js.map