management-repository-viewer
Version:
CLI para visualizar y gestionar múltiples repositorios Git desde la terminal.
353 lines (352 loc) • 13.1 kB
JavaScript
;
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')
.option('-t, --tag <tags>', 'Tags separados por coma, que se utilizaran para todos los repos encontrados.')
.action(async (options) => {
const { path } = options;
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();