management-repository-viewer
Version:
CLI para visualizar y gestionar múltiples repositorios Git desde la terminal.
275 lines (274 loc) • 11.7 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.grabarNuevoRepo = grabarNuevoRepo;
exports.borrarRepo = borrarRepo;
exports.obtenerReposConfiguracion = obtenerReposConfiguracion;
exports.validarDirectorio = validarDirectorio;
exports.obtenerDirectorios = obtenerDirectorios;
exports.renombrar = renombrar;
exports.administracionTag = administracionTag;
const fs_1 = __importDefault(require("fs"));
const path_1 = __importDefault(require("path"));
const os_1 = __importDefault(require("os"));
const chalk_1 = __importDefault(require("chalk"));
const util_git_1 = require("./util-git");
const readline_1 = __importDefault(require("readline"));
const CONFIGDIR = path_1.default.join(os_1.default.homedir(), '.management-repository-viewer');
const CONFIG_FILE = path_1.default.resolve(CONFIGDIR, "./mrv.config.json");
if (!fs_1.default.existsSync(CONFIGDIR)) {
fs_1.default.mkdirSync(CONFIGDIR, { recursive: true });
}
function grabarNuevoRepo(item, esMasivo = false) {
if (item.alias.trim() === "") {
console.log(chalk_1.default.bgRed("El alias no puede estar vacío."));
return;
}
if (item.path.trim() === "") {
console.log(chalk_1.default.bgRed("El path no puede estar vacío."));
return;
}
item.alias = item.alias.trim();
item.path = item.path.trim().replace(/\\/g, "/");
let currentConfig = {
RepoConfiguracion: [],
};
if (fs_1.default.existsSync(CONFIG_FILE)) {
currentConfig = JSON.parse(fs_1.default.readFileSync(CONFIG_FILE, "utf-8"));
}
const existeAlias = currentConfig.RepoConfiguracion.some(x => x.alias === item.alias);
if (existeAlias) {
console.log(`El alias ${chalk_1.default.bgRed(item.alias)} ya existe.`);
// console.log(`El alias ${item.alias} ya existe.`);
return;
}
const existePath = currentConfig.RepoConfiguracion.some(x => x.path === item.path);
if (existePath) {
console.log(`El path ${chalk_1.default.bgRed(item.path)} ya existe.`);
// console.log(`El path ${item.path} ya existe.`);
return;
}
currentConfig.RepoConfiguracion.push(item);
fs_1.default.writeFileSync(CONFIG_FILE, JSON.stringify(currentConfig, null, 2), "utf-8");
console.log(`✅ Proyecto ${chalk_1.default.black.bgGreen(item.alias)} agregado correctamente.`);
// console.log(`✅ Proyecto ${item.alias} agregado correctamente.`);
if (!esMasivo) {
console.log(CONFIG_FILE);
}
}
function borrarRepo(aliasRepo) {
if (aliasRepo.trim() === "") {
console.log(chalk_1.default.bgRed("El alias no puede estar vacío."));
return;
}
aliasRepo = aliasRepo.trim();
let currentConfig = {
RepoConfiguracion: [],
};
if (fs_1.default.existsSync(CONFIG_FILE)) {
currentConfig = JSON.parse(fs_1.default.readFileSync(CONFIG_FILE, "utf-8"));
}
const existeAlias = currentConfig.RepoConfiguracion.some(x => x.alias === aliasRepo);
if (!existeAlias) {
console.log(`El alias ${chalk_1.default.bgRed(aliasRepo)} no existe.`);
// console.log(`El alias ${item.alias} ya existe.`);
return;
}
currentConfig.RepoConfiguracion = currentConfig.RepoConfiguracion.filter(x => x.alias !== aliasRepo);
fs_1.default.writeFileSync(CONFIG_FILE, JSON.stringify(currentConfig, null, 2), "utf-8");
console.log(`✅ Proyecto ${chalk_1.default.black.bgGreen(aliasRepo)} eliminado correctamente.`);
}
function obtenerReposConfiguracion(filtro = null) {
if (!fs_1.default.existsSync(CONFIG_FILE)) {
console.log(chalk_1.default.bgRed("El archivo de configuración no existe."));
return [];
}
const config = JSON.parse(fs_1.default.readFileSync(CONFIG_FILE, "utf-8"));
if (filtro === null) {
return config.RepoConfiguracion;
}
return config.RepoConfiguracion.filter(repo => {
return ((!filtro.alias || repo.alias === filtro.alias) &&
(!filtro.jerarquia || repo.jerarquia.startsWith(filtro.jerarquia)) &&
(!filtro.codigo || repo.codigo === filtro.codigo) &&
(!filtro.tag ||
filtro.tag.length === 0 ||
repo.tag.some((tag) => filtro.tag.includes(tag))));
});
}
function validarDirectorio(path) {
return fs_1.default.existsSync(path) && fs_1.default.lstatSync(path).isDirectory();
}
async function obtenerDirectorios(pathBase, nivelProfundidad, listaTags) {
const encontrados = [];
pathBase = pathBase.replace(/[\\\/]$/, '');
const obtenerCodigo = (value) => {
value = value.replace(/\\/g, '/');
};
const recorrer = async (dir, nivel, nivelMax) => {
if (nivel > 2)
return;
let items;
try {
items = await fs_1.default.promises.readdir(dir);
}
catch (err) {
console.error(chalk_1.default.red(`No se pudo leer el directorio: ${dir}`));
return;
}
for (const item of items) {
const fullPath = path_1.default.join(dir, item);
try {
const stat = await fs_1.default.promises.stat(fullPath);
if (stat.isDirectory()) {
// console.log(`Leyendo: ${fullPath}`);
readline_1.default.clearLine(process.stdout, 0); // 0: borrar toda la línea
readline_1.default.cursorTo(process.stdout, 0); // volver al inicio
process.stdout.write(`Leyendo: ${fullPath}`);
const esGit = await (0, util_git_1.verificarRepositorioGit)(fullPath);
if (esGit) {
const relative = path_1.default.relative(pathBase, fullPath);
const proyecto = {
alias: item,
path: fullPath,
jerarquia: `${pathBase.slice(pathBase.lastIndexOf('\\') + 1)}/${relative.replace(/\\/g, '/')}`,
tag: listaTags,
codigo: `${relative.replace(/\\/g, '/').indexOf('/') === -1 ? relative : relative.replace(/\\/g, '/').slice(0, relative.replace(/\\/g, '/').indexOf('/'))}`,
};
encontrados.push(proyecto);
}
else {
await recorrer(fullPath, nivel + 1, nivelMax);
}
}
}
catch {
continue;
}
}
};
await recorrer(pathBase, 1, nivelProfundidad);
readline_1.default.clearLine(process.stdout, 0); // 0: borrar toda la línea
readline_1.default.cursorTo(process.stdout, 0); // volver al inicio
process.stdout.write(`✅ Lectura Terminada `);
console.log('');
return encontrados;
}
async function renombrar(valorActual, nuevoValor, tipoCambio) {
if (!fs_1.default.existsSync(CONFIG_FILE)) {
console.log(chalk_1.default.bgRed("El archivo de configuración no existe."));
return;
}
if (valorActual.trim() === "") {
console.log(chalk_1.default.bgRed("El valor actual no puede estar vacío."));
return;
}
if (nuevoValor.trim() === "") {
console.log(chalk_1.default.bgRed("El nuevo valor no puede estar vacío."));
return;
}
valorActual = valorActual.trim();
nuevoValor = nuevoValor.trim();
let currentConfig = {
RepoConfiguracion: [],
};
currentConfig = JSON.parse(fs_1.default.readFileSync(CONFIG_FILE, "utf-8"));
let totalRenombrados = 0;
if (tipoCambio === 'alias') {
const existeAlias = currentConfig.RepoConfiguracion.some(x => x.alias === valorActual);
if (!existeAlias) {
console.log(`El alias ${chalk_1.default.bgRed(valorActual)} no existe.`);
return;
}
const existeNuevoAlias = currentConfig.RepoConfiguracion.some(x => x.alias === nuevoValor);
if (existeNuevoAlias) {
console.log(`El nuevo alias ${chalk_1.default.bgRed(nuevoValor)} ya existe.`);
return;
}
const item = currentConfig.RepoConfiguracion.find(x => x.alias === valorActual);
item.alias = nuevoValor;
totalRenombrados++;
}
else if (tipoCambio === 'path') {
const existePath = currentConfig.RepoConfiguracion.some(x => x.path === valorActual);
if (!existePath) {
console.log(`El path ${chalk_1.default.bgRed(valorActual)} no existe.`);
return;
}
const existeNuevoPath = currentConfig.RepoConfiguracion.some(x => x.path === nuevoValor);
if (existeNuevoPath) {
console.log(`El nuevo path ${chalk_1.default.bgRed(nuevoValor)} ya existe.`);
return;
}
const item = currentConfig.RepoConfiguracion.find(x => x.path === valorActual);
item.path = nuevoValor;
totalRenombrados++;
}
else if (tipoCambio === 'tag') {
currentConfig.RepoConfiguracion.forEach(x => {
if (x.tag.includes(valorActual)) {
x.tag = Array.from(new Set(x.tag.map(tag => tag === valorActual ? nuevoValor : tag)));
totalRenombrados++;
}
});
}
else if (tipoCambio === 'jerarquia') {
currentConfig.RepoConfiguracion.forEach(x => {
if (x.jerarquia === valorActual) {
x.jerarquia = nuevoValor;
totalRenombrados++;
}
});
}
else if (tipoCambio === 'codigo') {
currentConfig.RepoConfiguracion.forEach(x => {
if (x.codigo === valorActual) {
x.codigo = nuevoValor;
totalRenombrados++;
}
});
}
// const existeAlias = currentConfig.RepoConfiguracion.some(x => x.alias === valorActual);
// if (!existeAlias) {
// console.log(`El alias ${chalk.bgRed(valorActual)} no existe.`);
// return;
// }
currentConfig.RepoConfiguracion.forEach(x => {
if (x.alias === valorActual) {
x.alias = nuevoValor;
x.path = x.path.replace(valorActual, nuevoValor);
x.jerarquia = x.jerarquia.replace(valorActual, nuevoValor);
x.codigo = x.codigo.replace(valorActual, nuevoValor);
}
});
fs_1.default.writeFileSync(CONFIG_FILE, JSON.stringify(currentConfig, null, 2), "utf-8");
console.log(`✅ Se han modificado ${chalk_1.default.black.bgGreen(totalRenombrados)} Proyectos.`);
}
async function administracionTag(tag, listaAlias, accion) {
if (!fs_1.default.existsSync(CONFIG_FILE)) {
console.log(chalk_1.default.bgRed("El archivo de configuración no existe."));
return;
}
tag = tag.trim();
if (tag.trim() === "") {
console.log(chalk_1.default.bgRed("El valor del tag no puede ser vacío."));
return;
}
let currentConfig = JSON.parse(fs_1.default.readFileSync(CONFIG_FILE, "utf-8"));
for (const item of currentConfig.RepoConfiguracion) {
if (listaAlias.includes(item.alias)) {
if (accion === "Agregar") {
if (!item.tag.includes(tag)) {
item.tag.push(tag);
}
}
else if (accion === "Quitar") {
item.tag = item.tag.filter(x => x !== tag);
}
}
}
fs_1.default.writeFileSync(CONFIG_FILE, JSON.stringify(currentConfig, null, 2), "utf-8");
console.log(`✅ Se ha ${chalk_1.default.black.bgGreen(accion)} el tag ${chalk_1.default.black.bgGreen(tag)}.`);
}