del-repos
Version:
A command-line tool for bulk deleting GitHub or Gitee repositories
120 lines (119 loc) • 5.38 kB
JavaScript
;
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 __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.deleteGiteeRepos = exports.fetchGiteeRepos = void 0;
const axios_1 = __importDefault(require("axios"));
const ora_1 = __importDefault(require("ora"));
const utils_1 = require("../utils");
const kolorist_1 = require("kolorist");
const GITEE_API_BASE = 'https://gitee.com/api/v5';
/**
* 获取 Gitee 仓库
* @param token Gitee token
* @param type 仓库类型: owner || all
* @returns 仓库列表
*/
const fetchGiteeRepos = (token, type) => __awaiter(void 0, void 0, void 0, function* () {
let page = 1;
let repos = [];
let hasMore = true;
// more information: https://gitee.com/api/v5/swagger#/getV5UsersUsernameRepos
while (hasMore) {
const response = yield axios_1.default.get(`${GITEE_API_BASE}/user/repos`, {
headers: {
Authorization: `token ${token}`,
},
params: {
type: type,
sort: 'updated',
direction: 'desc',
page,
per_page: 100,
},
});
repos = repos.concat(response.data);
hasMore = response.data.length === 100;
page++;
}
return repos.map(repo => `${repo.full_name} \u001b]8;;${repo.html_url}\u0007🔗\u001b]8;;\u0007`);
});
exports.fetchGiteeRepos = fetchGiteeRepos;
/**
* 删除 Gitee 仓库
* @param token Gitee token
* @param repos 待删除的仓库
* @returns 删除结果
*/
const deleteGiteeRepos = (token, repos) => __awaiter(void 0, void 0, void 0, function* () {
var _a, _b, _c, _d;
const spinner = (0, ora_1.default)();
let username = '';
// 获取用户名
console.log((0, kolorist_1.dim)('🔍 Verifying user credentials...'));
try {
const response = yield axios_1.default.get(`${GITEE_API_BASE}/user`, {
headers: {
Authorization: `token ${token}`,
},
});
username = response.data.login;
console.log((0, kolorist_1.green)(`✅ Authenticated as: ${username}\n`));
}
catch (error) {
console.log((0, kolorist_1.red)('❌ Failed to authenticate with Gitee'));
console.error((0, kolorist_1.red)(`Error: ${((_b = (_a = error.response) === null || _a === void 0 ? void 0 : _a.data) === null || _b === void 0 ? void 0 : _b.message) || error.message}\n`));
return;
}
let successCount = 0;
let failCount = 0;
const totalRepos = repos.length;
console.log((0, kolorist_1.cyan)(`🗑️ Starting deletion of ${totalRepos} repositories...\n`));
for (let i = 0; i < repos.length; i++) {
let repo = repos[i];
const repoName = (0, utils_1.extractPath)(repo);
const progress = `(${i + 1}/${totalRepos})`;
spinner.start(`${progress} Deleting ${(0, kolorist_1.yellow)(repoName)}...`);
try {
const deleteUrl = `${GITEE_API_BASE}/repos/${username}/${repoName}?access_token=${token}`;
// 验证仓库存在
yield axios_1.default.get(deleteUrl, {
headers: {
Authorization: `token ${token}`,
},
});
// 删除仓库
yield axios_1.default.delete(deleteUrl, {
headers: {
Authorization: `token ${token}`,
},
});
spinner.succeed(`${progress} ${(0, kolorist_1.green)('✅ Deleted')} ${repoName}`);
successCount++;
}
catch (error) {
const errorMessage = ((_d = (_c = error.response) === null || _c === void 0 ? void 0 : _c.data) === null || _d === void 0 ? void 0 : _d.message) || error.message;
spinner.fail(`${progress} ${(0, kolorist_1.red)('❌ Failed to delete')} ${repoName}`);
console.log((0, kolorist_1.dim)(` └─ Error: ${errorMessage}`));
failCount++;
}
}
// 显示最终结果
console.log((0, kolorist_1.cyan)('\n📊 Deletion Summary:'));
console.log((0, kolorist_1.green)(` ✅ Successfully deleted: ${successCount} repositories`));
if (failCount > 0) {
console.log((0, kolorist_1.red)(` ❌ Failed to delete: ${failCount} repositories`));
}
console.log((0, kolorist_1.dim)(` 📈 Success rate: ${Math.round((successCount / totalRepos) * 100)}%\n`));
});
exports.deleteGiteeRepos = deleteGiteeRepos;