@afuteam-nx/plugin-fetch-repos
Version:
批量获取远程仓库信息,支持配置 groupId, projectid,以及黑白名单
136 lines • 6.73 kB
JavaScript
;
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