UNPKG

management-repository-viewer

Version:

CLI para visualizar y gestionar múltiples repositorios Git desde la terminal.

270 lines (269 loc) 11.5 kB
"use strict"; 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 chalk_1 = __importDefault(require("chalk")); const util_git_1 = require("./util-git"); const readline_1 = __importDefault(require("readline")); const CONFIG_FILE = path_1.default.resolve(__dirname, "./mrv.config.json"); 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)}.`); }