UNPKG

management-repository-viewer

Version:

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

353 lines (352 loc) 13.2 kB
#!/usr/bin/env node "use strict"; var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { if (k2 === undefined) k2 = k; var desc = Object.getOwnPropertyDescriptor(m, k); if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { desc = { enumerable: true, get: function() { return m[k]; } }; } Object.defineProperty(o, k2, desc); }) : (function(o, m, k, k2) { if (k2 === undefined) k2 = k; o[k2] = m[k]; })); var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { Object.defineProperty(o, "default", { enumerable: true, value: v }); }) : function(o, v) { o["default"] = v; }); var __importStar = (this && this.__importStar) || (function () { var ownKeys = function(o) { ownKeys = Object.getOwnPropertyNames || function (o) { var ar = []; for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; return ar; }; return ownKeys(o); }; return function (mod) { if (mod && mod.__esModule) return mod; var result = {}; if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); __setModuleDefault(result, mod); return result; }; })(); var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const commander_1 = require("commander"); const Interactivos = __importStar(require("./comandos-interactivos")); const archivo_1 = require("./archivo"); const util_git_1 = require("./util-git"); const child_process_1 = require("child_process"); const chalk_1 = __importDefault(require("chalk")); const PACKAGE = require('../package.json'); const program = new commander_1.Command(); program .name('mrv') .description('Management Repository Viewer - Herramienta CLI para gestión de proyectos Git') .version(` Version: ${PACKAGE.version} Autor: ${PACKAGE.author} `); program .command('status') .description('Muestra el estado GIT de los repositorios') .option('--int', 'Modo interactivo') .option('--ic', 'Modo interactivo solo para código') .option('--it', 'Modo interactivo solo para tags') .option('-a, --alias <alias>', 'Alias del proyecto') .option('-t, --tag <tags>', 'Tags separados por coma') .option('-j, --jerarquia <jerarquia>', 'Jerarquía Base') .option('-c, --codigo <codigo>', 'Código del proyecto') .action(async (options) => { if (+!!options.int + +!!options.ic + +!!options.it > 1) { console.log('No se puede usar --int, --ic y --it al mismo tiempo.'); return; } let filtro; if (options.int) { filtro = await Interactivos.configFiltro(); } else if (options.ic) { filtro = await Interactivos.configFiltroCodigo(); } else if (options.it) { filtro = await Interactivos.configFiltroTag(); } else { filtro = { alias: options.alias || '', path: '', tag: options.tag?.split(',').map((t) => t.trim()) || [], jerarquia: options.jerarquia || '', codigo: options.codigo || '', }; } const listaRepos = (0, archivo_1.obtenerReposConfiguracion)(filtro); if (listaRepos.length === 0) { console.log('No se encontraron proyectos con ese filtro.'); return; } await (0, util_git_1.procesoDirectoriosGit)(listaRepos.sort((a, b) => a.alias.localeCompare(b.alias))); }); program .command('list') .description('Muestra el estado de los repositorios en la configuración') .option('--int', 'Modo interactivo') .option('--ic', 'Modo interactivo solo para código') .option('--it', 'Modo interactivo solo para tags') .option('-a, --alias <alias>', 'Alias del proyecto') .option('-t, --tag <tags>', 'Tags separados por coma') .option('-j, --jerarquia <jerarquia>', 'Jerarquía Base') .option('-c, --codigo <codigo>', 'Código de los proyectos') .action(async (options) => { if (+!!options.int + +!!options.ic + +!!options.it > 1) { console.log('No se puede usar --int, --ic y --it al mismo tiempo.'); return; } let filtro; if (options.int) { filtro = await Interactivos.configFiltro(); } else if (options.ic) { filtro = await Interactivos.configFiltroCodigo(); } else if (options.it) { filtro = await Interactivos.configFiltroTag(); } else { filtro = { alias: options.alias || '', path: '', tag: options.tag?.split(',').map((t) => t.trim()) || [], jerarquia: options.jerarquia || '', codigo: options.codigo || '', }; } const listaRepos = (0, archivo_1.obtenerReposConfiguracion)(filtro); if (listaRepos.length === 0) { console.log('No se encontraron proyectos con ese filtro.'); return; } console.log(JSON.stringify(listaRepos.sort((a, b) => a.alias.localeCompare(b.alias)), null, 2)); }); program .command('add-auto') .description('Agregar un listado de repositorios al registro (2 niveles de profundidad)') .option('-p, --path <path>', 'Ruta base donde buscar repositorios de GIT, si no se encuentra se tomara la ruta actual.') .option('-t, --tag <tags>', 'Tags separados por coma, que se utilizaran para todos los repos encontrados.') .action(async (options) => { const path = options.path || process.cwd(); if (!path) { console.log(chalk_1.default.red('Debe proporcionar una ruta con -p')); return; } else if (!(0, archivo_1.validarDirectorio)(path)) { console.log(chalk_1.default.red('La ruta no es válida o no existe')); return; } const listaTags = options.tag?.split(',').map((t) => t.trim()) || []; const listaRepos = await (0, archivo_1.obtenerDirectorios)(path, 2, listaTags); for (const item of listaRepos) { await (0, archivo_1.grabarNuevoRepo)(item, true); } }); program .command('add') .description('Agregar un nuevo repositorio al registro') .option('--exp', 'Modo interactivo') .option('--int', 'Modo interactivo') .option('-a, --alias <alias>', 'Alias del proyecto Obligatorio (PK)') .option('-p, --path <path>', 'Ruta del proyecto Obligatorio (Unique)') .option('-t, --tag <tags>', 'Tags separados por coma') .option('-j, --jerarquia <jerarquia>', 'Jerarquía') .option('-c, --codigo <codigo>', 'Código del proyecto') .action(async (options) => { let nuevoRepo; if (options.int) { nuevoRepo = await Interactivos.addRepo(); } else { nuevoRepo = { alias: options.alias || '', path: options.path || '', tag: options.tag?.split(',').map((t) => t.trim()) || [], jerarquia: options.jerarquia || '', codigo: options.codigo || '', }; } (0, archivo_1.grabarNuevoRepo)(nuevoRepo); }); program .command('del') .description('Eliminacion de un repositorio del registro') .option('--int', 'Modo interactivo') .option('-a, --alias <alias>', 'Alias del proyecto') .action(async (options) => { let repo = ''; if (options.int) { repo = (await Interactivos.configFiltroAlias()).alias; } else { repo = options.alias || ''; } if (!repo) { console.log('No se encontró el proyecto.'); return; } await (0, archivo_1.borrarRepo)(repo); }); program .command('del-mass') .description('Eliminacion masiva de repositorios del registro') .action(async (options) => { const opcionFiltro = await Interactivos.selecccionarOpcionesParaFiltrar(); if (opcionFiltro) { let filtro; if (opcionFiltro === 'Codigo') { filtro = await Interactivos.configFiltroCodigo(); } else if (opcionFiltro === 'Tag') { filtro = await Interactivos.configFiltroTag(); } else { filtro = null; } const listaRepos = await (0, archivo_1.obtenerReposConfiguracion)(filtro); if (listaRepos.length === 0) { console.log('No se encontraron proyectos con ese filtro.'); return; } const lista = await Interactivos.selecccionarMultipleProyectoAlias(listaRepos); if (lista.length > 0) { for (const repo of lista) { await (0, archivo_1.borrarRepo)(repo); } } } }); program .command('open') .description('Abrir repositorio en la opcion seleccionada') .option('-c, --codigo <codigo>', 'Código de los proyectos') .action(async (options) => { let codigo = options.codigo || ''; if (!codigo) { codigo = (await Interactivos.configFiltroCodigo()).codigo; } if (!codigo) { console.log('Debe ingresar el código de los proyectos.'); return; } const listaRepos = (0, archivo_1.obtenerReposConfiguracion)({ codigo, alias: '', jerarquia: '', tag: [], path: '' }); if (listaRepos.length === 0) { console.log('No se encontraron proyectos con ese código.'); return; } console.log(`Se abriran ${chalk_1.default.bgBlue.black(listaRepos.length)} repositorio(s).`); const editor = await Interactivos.selecccionarOpcionesAbrir(); if (editor) { for (const item of listaRepos) { if (!(0, archivo_1.validarDirectorio)(item.path)) { console.error(`❌ Error no se encontro el directorio: ${item.path}`); continue; } const ruta = editor === 'explorer' ? item.path.replace(/\//g, '\\') : item.path; (0, child_process_1.exec)(`${editor} "${ruta}"`, (error, stdout, stderr) => { if (editor !== 'explorer' && error) { console.error(`❌ Error al abrir directorio: ${error.message}`); return; } if (stderr) { console.error(`⚠️ ${stderr}`); return; } // console.log(`✅ VS Code abierto en: ${item.path}`); }); } } }); program .command('rename') .description('Renombrar Alias, Jerarquia, Codigo, Tags o Path') .option('-a, --alias <alias>', 'Alias del proyecto') .option('--na <alias>', 'Nuevo Alias del proyecto') .option('-p, --path <path>', 'Ruta del proyecto') .option('--np <path>', 'Nueva ruta del proyecto') .option('-t, --tag <tags>', 'Tag') .option('--nt <tags>', 'Nuevo nombre Tag') .option('-j, --jerarquia <jerarquia>', 'Jerarquía') .option('--nj <jerarquia>', 'Nueva jerarquía') .option('-c, --codigo <codigo>', 'Código del proyecto') .option('--nc <codigo>', 'Nuevo código del proyecto') .action(async (options) => { let valorActual = ''; let valorNuevo = ''; let tipoCambio; if (options.alias && options.na) { valorActual = options.alias; valorNuevo = options.na; tipoCambio = 'alias'; } else if (options.path && options.np) { valorActual = options.path; valorNuevo = options.np; tipoCambio = 'path'; } else if (options.tag && options.nt) { valorActual = options.tag; valorNuevo = options.nt; tipoCambio = 'tag'; } else if (options.jerarquia && options.nj) { valorActual = options.jerarquia; valorNuevo = options.nj; tipoCambio = 'jerarquia'; } else if (options.codigo && options.nc) { valorActual = options.codigo; valorNuevo = options.nc; tipoCambio = 'codigo'; } else { console.log(chalk_1.default.red('Debe ingresar al menos un campo para renombrar')); return; } await (0, archivo_1.renombrar)(valorActual, valorNuevo, tipoCambio); }); program .command('tag') .description('Se utiliza para agregar o quitar tags a los repositorios en la configuracion') .action(async (options) => { const accion = await Interactivos.selecccionarOpcionAgregarQuitar(); let tag = ''; if (accion === 'Agregar') { tag = await Interactivos.ingreseTag(); } else { [tag] = (await Interactivos.configFiltroTag()).tag; } if (!tag) { return; } let listaRepos = []; if (accion === 'Quitar') { listaRepos = await (0, archivo_1.obtenerReposConfiguracion)({ tag: [tag], alias: '', jerarquia: '', codigo: '', path: '' }); } else { listaRepos = await (0, archivo_1.obtenerReposConfiguracion)(); } const lista = await Interactivos.selecccionarMultipleProyectoAlias(listaRepos); if (lista.length > 0) { await (0, archivo_1.administracionTag)(tag, lista, accion); } else { console.log(chalk_1.default.red('No se seleccionó ningún repositorio')); return; } }); program.parse();