@followthecode/cli
Version:
CLI tool for Git repository analysis and data collection
532 lines (401 loc) • 15.2 kB
Markdown
# FTC CLI - Ferramenta de Análise de Repositórios Git
Ferramenta de linha de comando (CLI) para análise de repositórios Git, desenvolvida seguindo a arquitetura Vertical Slice do projeto FTC.
## Funcionalidades
- ✅ Total de commits no repositório
- ✅ Lista de autores e quantidade de commits por autor
- ✅ Número total de arquivos alterados
- ✅ Lista dos arquivos alterados com quantidade de alterações (adições/remoções)
- ✅ Relatório resumido com datas dos primeiros e últimos commits
- ✅ **Suporte a repositórios remotos** (clona automaticamente)
- ✅ Filtros por data (--startDate e --endDate)
- ✅ Exportação em JSON (--json)
- ✅ **Exportação em CSV detalhado** (--csv) com informações por commit
- ✅ **Tratamento robusto de erros** com mensagens claras
- ✅ **Testes automatizados** para validação de funcionalidades
- ✅ **Suporte a Docker** para execução em containers
- ✅ **Uso como ferramenta global (dotnet tool)**
## Simulando/Executando localmente via Docker CLI
Você pode rodar o FTC CLI via Docker em ambiente local, sem scripts auxiliares, seguindo estes passos:
### 1. Build da imagem Docker localmente
No diretório do projeto (onde está o Dockerfile):
```sh
docker build -t ftc:latest .
```
### 2. Executar a CLI com repositório local
Supondo que você tenha um repositório local em uma pasta chamada `meu-repo` no seu diretório atual:
#### Linux/macOS
```sh
docker run --rm -v "$PWD:/repo" ftc:latest collect code "/repo/meu-repo" --json
```
#### Windows (cmd/powershell)
```bat
docker run --rm -v "%cd%:/repo" ftc:latest collect code "/repo/meu-repo" --json
```
- O volume `-v "$PWD:/repo"` (ou `%cd%:/repo` no Windows) faz com que a pasta atual do host seja montada como `/repo` dentro do container.
- O parâmetro `collect code "/repo/meu-repo"` aponta para o caminho do repositório dentro do container.
### 3. Executar a CLI com repositório remoto
Você não precisa mapear volumes para repositórios remotos:
```sh
docker run --rm ftc:latest collect code "https://github.com/exemplo/repositorio.git" --json
```
### 4. Exemplo com filtros de data
```sh
docker run --rm -v "$PWD:/repo" ftc:latest collect code "/repo/meu-repo" --startDate 2024-01-01 --endDate 2024-12-31 --json
```
### 5. Ver ajuda da CLI
```sh
docker run --rm ftc:latest --help
```
> **Resumo:**
> - Sempre use `-v "$PWD:/repo"` (Linux/macOS) ou `-v "%cd%:/repo"` (Windows) para acessar repositórios locais.
> - O caminho passado para `collect code` deve ser o caminho dentro do container, por exemplo, `"/repo/meu-repo"`.
> - Para repositórios remotos, basta passar a URL.
## Uso moderno via Docker CLI
Execute diretamente, sem scripts auxiliares:
### Linux/macOS
```sh
docker run --rm -v "$PWD:/repo" ftc:latest collect code "/repo/meu-repo" --json
```
### Windows (cmd/powershell)
```bat
docker run --rm -v "%cd%:/repo" ftc:latest collect code "/repo/meu-repo" --json
```
### Repositório remoto
```sh
docker run --rm ftc:latest collect code "https://github.com/exemplo/repositorio.git" --json
```
### Com filtros de data
```sh
docker run --rm -v "$PWD:/repo" ftc:latest collect code "/repo/meu-repo" --startDate 2024-01-01 --endDate 2024-12-31 --json
```
> **Dica:**
> - O volume `-v "$PWD:/repo"` (ou `%cd%:/repo` no Windows) permite que o container acesse seu repositório local.
## ⚠️ Problemas de Instalação
Se você encontrar problemas durante a instalação do CLI, como:
- Avisos sobre `node-domexception` deprecado
- Erros de permissão EPERM no Windows
- Problemas de limpeza de cache
Consulte a seção de troubleshooting abaixo.
### Solução Rápida para Windows
Execute o script de correção como Administrador:
```powershell
# Abrir PowerShell como Administrador
.\scripts\fix-permissions.ps1
# Ou com limpeza forçada
.\scripts\fix-permissions.ps1 -Force
```
## 🧪 Testando a Instalação
Antes de publicar uma nova versão, é importante testar a instalação em diferentes ambientes.
### Testes Automatizados
#### Windows
```powershell
# Teste básico
npm run test-installation
# Teste com limpeza prévia
npm run test-installation:clean
# Teste com output detalhado
npm run test-installation:verbose
```
#### Linux/macOS
```bash
# Teste básico
npm run test-installation:linux
# Teste com limpeza prévia
npm run test-installation:linux:clean
```
### Testes Manuais
```bash
# Criar repositório de teste
mkdir test-repo && cd test-repo
git init && echo "# Test" > README.md
git add . && git commit -m "Initial"
cd ..
# Testar funcionalidades
bin/ftc collect code ./test-repo --json
bin/ftc collect code https://github.com/exemplo/repositorio.git --json
```
Para mais detalhes, consulte a seção de testes abaixo.
> - O comando `collect code "/repo/meu-repo"` deve apontar para o caminho dentro do container.
## Uso como ferramenta global (dotnet tool)
Após instalar:
```sh
dotnet tool install --global --add-source ./bin/Release ftc.cli
```
Execute de qualquer lugar:
```sh
ftc collect code "./caminho/para/meu-repo" --json
```
Exemplo com repositório remoto e filtros:
```sh
ftc collect code "https://github.com/exemplo/repositorio.git" --startDate 2024-01-01 --endDate 2024-12-31 --json
```
Para ajuda:
```sh
ftc --help
```
## Uso
### Execução Local
#### Análise de repositório local
```bash
dotnet run -- collect code /caminho/para/repositorio
```
#### Análise de repositório remoto
```bash
dotnet run -- collect code https://github.com/exemplo/repositorio.git
```
#### Com filtros de data
```bash
dotnet run -- collect code /caminho/para/repositorio --startDate 2024-01-01 --endDate 2024-12-31
```
#### Exportação em JSON
```bash
dotnet run -- collect code /caminho/para/repositorio --json
```
#### Exportação em CSV detalhado
```bash
dotnet run -- collect code /caminho/para/repositorio --csv
```
#### Exportação para S3
```bash
dotnet run -- collect code /caminho/para/repositorio --csv --export s3
```
### Execução com Docker
#### Construir e executar
```bash
# Linux/macOS
./scripts/docker-run.sh collect code /caminho/para/repositorio
# Windows
scripts\docker-run.bat collect code C:\caminho\para\repositorio
```
#### Análise de repositório remoto
```bash
# Linux/macOS
./scripts/docker-run.sh collect code https://github.com/exemplo/repositorio.git
# Windows
scripts\docker-run.bat collect code https://github.com/exemplo/repositorio.git
```
#### Com filtros e JSON
```bash
# Linux/macOS
./scripts/docker-run.sh code /caminho/para/repositorio --startDate 2024-01-01 --json
# Windows
scripts\docker-run.bat code C:\caminho\para\repositorio --startDate 2024-01-01 --json
```
#### Opções do Docker Runner
```bash
# Mostrar ajuda
./scripts/docker-run.sh --help
# Reconstruir imagem
./scripts/docker-run.sh --build collect code /caminho/para/repositorio
# Limpar containers
./scripts/docker-run.sh --clean
```
#### Execução direta com Docker
```bash
# Construir imagem
docker-compose build
# Executar CLI
docker-compose run --rm ftc collect code /caminho/para/repositorio
# Executar com volumes mapeados
docker run --rm -v $(pwd)/repos:/repos:ro ftc:latest collect code /repos/meu-projeto
```
## Opções
- `collect`: Comando para coleta de dados
- `code`: Caminho local ou URL do repositório Git (obrigatório)
- `--startDate`: Data inicial no formato yyyy-MM-dd (opcional)
- `--endDate`: Data final no formato yyyy-MM-dd (opcional)
- `--json`: Exportar resultado em formato JSON (opcional)
- `--csv`: Exportar resultado em formato CSV detalhado (opcional)
- `--export`: Destino de exportação: local:/caminho/arquivo.json ou s3 (opcional)
## Repositórios Suportados
### Locais
- Caminhos absolutos: `C:\caminho\para\repositorio`
- Caminhos relativos: `./repositorio`, `../repositorio`
### Remotos
- HTTPS: `https://github.com/exemplo/repositorio.git`
- HTTP: `http://github.com/exemplo/repositorio.git`
- SSH: `git@github.com/exemplo/repositorio.git`
- Git: `git://github.com/exemplo/repositorio.git`
## Exemplo de Saída
### Formato padrão
```
Analisando repositório: https://github.com/exemplo/repositorio.git
Tipo: Remoto
Clonando repositório: https://github.com/exemplo/repositorio.git
Pasta temporária: /tmp/ftc-cli-12345678-1234-1234-1234-123456789abc
Repositório clonado com sucesso.
📊 Total de commits: 150
👥 Autores:
• Desenvolvedor A <dev.a@exemplo.com>: 45 commits
• Desenvolvedor B <dev.b@exemplo.com>: 38 commits
• Desenvolvedor C <dev.c@exemplo.com>: 27 commits
📁 Total de arquivos alterados: 89
📄 Arquivos alterados:
• src/Program.cs: +120 -45
• src/Models.cs: +89 -12
• README.md: +15 -3
... e mais 86 arquivos
📅 Primeiro commit: 2024-01-15 10:30:00
📅 Último commit: 2024-12-20 16:45:30
```
### Formato JSON
```json
{
"totalCommits": 150,
"authors": [
{
"name": "Desenvolvedor A",
"email": "dev.a@exemplo.com",
"commits": 45
}
],
"totalFilesChanged": 89,
"files": [
{
"filePath": "src/Program.cs",
"additions": 120,
"deletions": 45
}
],
"firstCommitDate": "2024-01-15T10:30:00+00:00",
"lastCommitDate": "2024-12-20T16:45:30+00:00"
}
```
### Formato CSV
```csv
nomeRepositorio;idRepositorio;dataCommit;idCommit;nomeAutor;emailAutor;nomeArquivo;caminhoArquivo;linhasAdicionadas;linhasRemovidas
meu-repo;abc123;2024-01-15 10:30:00;def456;Desenvolvedor A;dev.a@exemplo.com;Program.cs;src/Program.cs;120;45
meu-repo;abc123;2024-01-15 10:30:00;def456;Desenvolvedor A;dev.a@exemplo.com;Models.cs;src/Models.cs;89;12
meu-repo;abc123;2024-01-16 14:20:00;ghi789;Desenvolvedor B;dev.b@exemplo.com;README.md;README.md;15;3
```
O formato CSV inclui:
- **nomeRepositorio**: Nome do repositório
- **idRepositorio**: ID do repositório (SHA do HEAD)
- **dataCommit**: Data e hora do commit
- **idCommit**: SHA do commit
- **nomeAutor**: Nome do autor do commit
- **emailAutor**: Email do autor do commit
- **nomeArquivo**: Nome do arquivo alterado
- **caminhoArquivo**: Caminho completo do arquivo
- **linhasAdicionadas**: Número de linhas adicionadas
- **linhasRemovidas**: Número de linhas removidas
## Tratamento de Erros
A CLI fornece mensagens de erro claras e específicas:
- **Repositório não encontrado**: Verifica se o caminho existe
- **Repositório Git inválido**: Valida se é um repositório Git válido
- **Sem commits**: Verifica se há commits para análise
- **Período sem commits**: Avisa quando não há commits no período especificado
- **Datas inválidas**: Valida formato e ordem das datas
- **Erro de clonagem**: Trata falhas na clonagem de repositórios remotos
## Arquitetura
O projeto segue a arquitetura Vertical Slice do FTC, organizando funcionalidades em slices independentes com suas próprias responsabilidades.
## Docker
### Estrutura Docker
```
Dockerfile # Multi-stage build otimizado
.dockerignore # Exclusões para build
docker-compose.yml # Configuração do container
```
### Características da Imagem
- **Multi-stage build**: Otimiza tamanho da imagem
- **Runtime .NET 8**: Imagem base leve
- **Git instalado**: Suporte a repositórios remotos
- **Volumes mapeados**: Acesso a repositórios locais
- **Timezone configurado**: UTC
### Volumes Docker
- `./repos:/repos:ro`: Mapeia repositórios locais (somente leitura)
- `./temp:/tmp`: Pasta temporária para persistência
## Testes
O projeto inclui testes automatizados para validação de funcionalidades:
```bash
# Executar todos os testes
dotnet test
# Executar testes específicos
dotnet test --filter "RepositoryTests"
```
### Cobertura de Testes
- ✅ Detecção de repositórios remotos vs locais
- ✅ Validação de URLs HTTPS, HTTP, SSH, Git
- ✅ Validação de caminhos locais e relativos
## Desenvolvimento
### Compilar
```bash
dotnet build
```
### Executar Localmente
```bash
dotnet run -- [argumentos]
```
### Executar com Docker
```bash
# Linux/macOS
./scripts/docker-run.sh [argumentos]
# Windows
scripts\docker-run.bat [argumentos]
```
### Testar
```bash
# Testar com um repositório local
dotnet run -- collect code C:\caminho\para\repositorio
# Testar com repositório remoto
dotnet run -- collect code https://github.com/exemplo/repositorio.git
# Testar com filtros
dotnet run -- collect code C:\caminho\para\repositorio --startDate 2024-01-01 --endDate 2024-12-31 --json
# Executar testes
dotnet test
# Testar com Docker
./scripts/docker-run.sh collect code C:\caminho\para\repositorio
```
## Melhorias Implementadas
### ✅ Suporte a Repositórios Remotos
- Detecção automática de URLs vs caminhos locais
- Clonagem automática para pasta temporária
- Limpeza automática após análise
- Suporte a múltiplos protocolos (HTTPS, HTTP, SSH, Git)
### ✅ Testes Automatizados
- Testes unitários para detecção de repositórios
- Cobertura de diferentes tipos de URLs
- Validação de caminhos locais e relativos
- Integração com xUnit
### ✅ Tratamento Robusto de Erros
- Mensagens de erro específicas e úteis
- Validação de argumentos de entrada
- Verificação de repositórios válidos
- Tratamento de exceções com contexto
- Interface melhorada com emojis e formatação
### ✅ Suporte a Docker
- Multi-stage build otimizado
- Scripts para Linux/macOS e Windows
- Volumes mapeados para repositórios locais
- Configuração de timezone
- Docker Compose para facilitar uso
## Exportação de resultados (local e S3)
A CLI permite exportar o resultado da análise para um arquivo local ou diretamente para um bucket S3.
### Exportar JSON localmente
```sh
ftc collect code "./meu-repo" --json --export local:./resultado.json
```
### Exportar CSV localmente
```sh
ftc collect code "./meu-repo" --csv --export local:./resultado.csv
```
### Exportar para S3 (JSON)
```sh
ftc collect code "./meu-repo" --json --export s3
```
### Exportar para S3 (CSV)
```sh
ftc collect code "./meu-repo" --csv --export s3
```
### Exportar para S3 (bucket e key customizados)
```sh
ftc collect code "./meu-repo" --csv --export s3: --s3-bucket "meu-bucket"
```
### Exportar para S3 (bucket/key no próprio parâmetro)
```sh
ftc collect code "./meu-repo" --csv --export s3://meu-bucket/analises/resultado.csv
```
- Se `--s3-bucket` não for informado, será usado o bucket padrão configurado.
- Para JSON: Se `--s3-key` não for informado, será usado o padrão `analises/<nome_repositorio>-ano-mes-dia.json`.
- Para CSV: Se `--s3-key` não for informado, será usado o padrão `analises/<nome_repositorio>-ano-mes-dia.csv`.
- O parâmetro `--s3-region` pode ser usado para especificar a região AWS.