@followthecode/cli
Version:
CLI tool for Git repository analysis and data collection
158 lines (132 loc) • 6.33 kB
JavaScript
const fs = require('fs');
const path = require('path');
const { execSync, spawn } = require('child_process');
console.log('🔧 Configurando FTC CLI após instalação...');
// Função para verificar e instalar dependências nativas no Linux
function checkAndInstallNativeDependencies() {
if (process.platform !== 'linux') {
console.log('📋 Sistema não é Linux, pulando verificação de dependências nativas');
return true;
}
console.log('🔍 Verificando dependências nativas...');
try {
// Verifica se as bibliotecas necessárias estão disponíveis
const requiredLibs = ['libssl', 'libcurl', 'libz'];
const missingLibs = [];
for (const lib of requiredLibs) {
try {
execSync(`ldconfig -p | grep -q "${lib}"`, { stdio: 'pipe' });
console.log(`✅ ${lib} encontrado`);
} catch (error) {
missingLibs.push(lib);
console.log(`❌ ${lib} não encontrado`);
}
}
// Verifica se a biblioteca do LibGit2Sharp está presente
const libgit2Path = path.join(__dirname, '..', 'bin', 'linux-x64', 'libgit2-3f4182d.so');
if (fs.existsSync(libgit2Path)) {
console.log('✅ Biblioteca LibGit2Sharp encontrada');
// Tenta definir LD_LIBRARY_PATH para incluir o diretório da biblioteca
const libDir = path.join(__dirname, '..', 'bin', 'linux-x64');
const currentLdPath = process.env.LD_LIBRARY_PATH || '';
const newLdPath = currentLdPath ? `${libDir}:${currentLdPath}` : libDir;
console.log(`📋 Configurando LD_LIBRARY_PATH: ${newLdPath}`);
// Salva a configuração em um arquivo para ser carregado pelo wrapper
const wrapperConfig = `#!/bin/bash
export LD_LIBRARY_PATH="${newLdPath}:\$LD_LIBRARY_PATH"
exec "$@"
`;
const wrapperPath = path.join(__dirname, '..', 'bin', 'ftc-wrapper.sh');
fs.writeFileSync(wrapperPath, wrapperConfig);
fs.chmodSync(wrapperPath, 0o755);
console.log('✅ Wrapper de biblioteca criado');
} else {
console.log('❌ Biblioteca LibGit2Sharp não encontrada');
}
if (missingLibs.length > 0) {
console.log('⚠️ Algumas dependências nativas estão faltando. Tentando instalar...');
try {
// Tenta instalar as dependências
execSync('sudo apt-get update', { stdio: 'inherit' });
execSync('sudo apt-get install -y libssl-dev libcurl4-openssl-dev zlib1g-dev', { stdio: 'inherit' });
console.log('✅ Dependências nativas instaladas com sucesso!');
return true;
} catch (installError) {
console.warn('⚠️ Não foi possível instalar dependências automaticamente:', installError.message);
console.log('💡 Execute manualmente: sudo apt-get install -y libssl-dev libcurl4-openssl-dev zlib1g-dev');
return false;
}
}
return true;
} catch (error) {
console.warn('⚠️ Erro ao verificar dependências nativas:', error.message);
return false;
}
}
// Função para copiar arquivo de configuração
function copyConfigFile() {
try {
// Tenta diferentes locais para o arquivo de configuração
const possibleSources = [
path.join(__dirname, '..', 'bin', 'linux-x64', 'appsettings.json'),
path.join(__dirname, '..', 'bin', 'win-x64', 'appsettings.json'),
path.join(__dirname, '..', 'bin', 'osx-x64', 'appsettings.json'),
path.join(__dirname, '..', 'appsettings.json')
];
let configSource = null;
for (const source of possibleSources) {
if (fs.existsSync(source)) {
configSource = source;
console.log(`📁 Arquivo de configuração encontrado em: ${source}`);
break;
}
}
if (!configSource) {
console.error('❌ Arquivo de configuração não encontrado!');
console.error('💡 Verifique se o pacote foi compilado corretamente.');
return false;
}
// Copia para o diretório de instalação global
const globalDest = path.join(__dirname, '..', 'appsettings.json');
fs.copyFileSync(configSource, globalDest);
console.log(`✅ Arquivo de configuração copiado para: ${globalDest}`);
return true;
} catch (error) {
console.error('❌ Erro ao copiar arquivo de configuração:', error.message);
return false;
}
}
// Função para definir permissões
function setPermissions() {
try {
const ftcJsPath = path.join(__dirname, '..', 'bin', 'ftc.js');
const ftcShellPath = path.join(__dirname, '..', 'bin', 'ftc');
if (fs.existsSync(ftcJsPath)) {
fs.chmodSync(ftcJsPath, 0o755);
console.log('✅ Permissões definidas para ftc.js');
}
if (fs.existsSync(ftcShellPath)) {
fs.chmodSync(ftcShellPath, 0o755);
console.log('✅ Permissões definidas para ftc (shell)');
}
return true;
} catch (error) {
console.warn('⚠️ Erro ao definir permissões:', error.message);
return false;
}
}
// Executa as configurações
const nativeDepsSuccess = checkAndInstallNativeDependencies();
const configSuccess = copyConfigFile();
const permissionsSuccess = setPermissions();
if (configSuccess && permissionsSuccess) {
console.log('🎉 FTC CLI configurado com sucesso!');
console.log('💡 Execute: ftc --help');
if (!nativeDepsSuccess) {
console.log('⚠️ Dependências nativas podem precisar de instalação manual');
}
} else {
console.error('❌ Alguns problemas foram encontrados durante a configuração.');
process.exit(1);
}