Read in English | Leia em Português
Ferramenta de linha de comando em Rust para validação e correção automática de encoding de arquivos em projetos, projetada para ser executada como pre-commit hook via Husky.
- Detecção automática de encoding: Detecta automaticamente o encoding de arquivos usando chardetng
- Conversão inteligente: Converte apenas quando necessário para evitar alterações desnecessárias
- Configuração flexível: Suporta arquivo de configuração com padrões glob
- Performance otimizada: Processamento paralelo usando Rayon
- Integração com Git: Processa apenas arquivos staged ou todo o projeto
- Interface interativa: Permite seleção de encoding quando não há configuração
- Respeita .gitignore: Ignora automaticamente arquivos listados no .gitignore
- Rust 1.70+ (instale via rustup)
- Git (para integração com pre-commit)
- Node.js e npm (opcional, para integração com Husky)
# Clone ou copie o projeto
git clone <seu-repositorio>
cd rs-precommit-fix-encode
# Execute o script de instalação
chmod +x install.sh
./install.shO script de instalação irá:
- Compilar o projeto em modo release
- Configurar Husky automaticamente (se detectar projeto Node.js)
- Criar o hook de pre-commit
# Compilar
cargo build --release
# O binário estará em: ./target/release/rsfeCrie um arquivo rsfe.conf na raiz do seu projeto. Formato:
# Comentários começam com #
<padrão-glob> <ENCODING>
# Exemplo:
** UTF-8 # Padrão para todos os arquivos
**/*.js UTF-8 # Arquivos JavaScript
**/*.py UTF-8 # Arquivos Python
legacy/** AUTO # Detecção automática para pasta legacy
old-data/**/*.txt WINDOWS-1252 # Encoding específico
UTF-8(padrão recomendado)UTF-16LE(UTF-16 Little Endian)UTF-16BE(UTF-16 Big Endian)ISO-8859-1(Latin-1)WINDOWS-1252(CP1252)AUTO(detecção automática)- Qualquer encoding suportado pela biblioteca encoding_rs
Copie o arquivo de exemplo:
cp rsfe.conf.example rsfe.confEdite conforme necessário para seu projeto.
# Processar todo o projeto
./target/release/rsfe
# Se não houver rsfe.conf, será solicitado a escolher o encoding padrão# Adiciona arquivos ao stage
git add .
# Executa o rsfe (processará apenas arquivos staged)
./target/release/rsfeSe você instalou via install.sh, o hook já está configurado. Cada commit irá:
- Executar
rsfenos arquivos staged - Converter encodings se necessário
- Re-adicionar arquivos modificados ao stage
- Prosseguir com o commit
# Uso normal do git
git add .
git commit -m "Minha mensagem"
# rsfe será executado automaticamenteSe não usar Husky, adicione ao .git/hooks/pre-commit:
#!/bin/sh
# Executa o rsfe
./target/release/rsfe
# Se falhar, cancela o commit
if [ $? -ne 0 ]; then
echo "❌ rsfe falhou. Corrija os erros antes de commitar."
exit 1
fi
# Re-adiciona os arquivos modificados
git add -u
exit 0Torne o hook executável:
chmod +x .git/hooks/pre-commit- Carrega configuração: Lê
rsfe.confou solicita encoding padrão - Coleta arquivos:
- Se em repositório git com arquivos staged: processa apenas staged
- Caso contrário: processa todo o projeto
- Filtra arquivos: Ignora binários e respeita .gitignore
- Processa em paralelo: Usa Rayon para processamento multi-thread
- Para cada arquivo:
- Determina encoding alvo baseado nas regras
- Detecta encoding atual
- Verifica se conversão é necessária
- Converte se necessário
- Reporta resultados: Mostra quantos arquivos foram convertidos
O RSFE só converte quando realmente necessário, verificando:
- Se há erros ao decodificar com o encoding alvo
- Se ao recodificar o conteúdo é diferente do original
Isso evita commits desnecessários de arquivos que já estão no encoding correto.
O RSFE é otimizado para performance:
- Processamento paralelo: Usa todos os cores da CPU via Rayon
- Leitura inteligente: Ignora automaticamente arquivos binários
- Cache de detecção: chardetng é eficiente para detecção de encoding
- Conversão condicional: Só converte quando realmente necessário
Benchmark típico (depende do hardware):
- ~10.000 arquivos processados em ~2-5 segundos
- Conversões necessárias: adiciona ~1-2ms por arquivo
Por padrão, o RSFE ignora:
node_modulestargetdistbuild.git.idea.vscode- Qualquer diretório no
.gitignore
- Imagens:
.png,.jpg,.jpeg,.gif - Documentos:
.pdf - Arquivos compactados:
.zip,.tar,.gz - Executáveis:
.exe,.dll,.so,.dylib
# rsfe.conf
** UTF-8
**/*.js UTF-8
**/*.ts UTF-8
**/*.jsx UTF-8
**/*.tsx UTF-8
**/*.json UTF-8
# rsfe.conf
** UTF-8
**/*.py UTF-8
**/*.md UTF-8
requirements.txt UTF-8
# rsfe.conf
** UTF-8
legacy/** AUTO # Detecta automaticamente
docs/old/*.txt WINDOWS-1252
Instale o Rust via rustup:
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | shVerifique a versão do Rust:
rustc --version # Deve ser 1.70+Atualize se necessário:
rustup updateAdicione a extensão à lista de ignorados em src/main.rs:251.
Consulte a documentação do encoding_rs para encodings suportados.
rs-precommit-fix-encode/
├── src/
│ └── main.rs # Código principal
├── Cargo.toml # Dependências
├── rsfe.conf.example # Exemplo de configuração
├── install.sh # Script de instalação
├── .husky/
│ └── pre-commit # Hook do Husky
├── README.md # Documentação em inglês
└── LEIAME.md # Documentação em português
cargo runcargo testcargo build --release --target x86_64-unknown-linux-musl # Linux estático- Fork o projeto
- Crie uma branch para sua feature (
git checkout -b feature/MinhaFeature) - Commit suas mudanças (
git commit -m 'Adiciona MinhaFeature') - Push para a branch (
git push origin feature/MinhaFeature) - Abra um Pull Request
MIT License - veja o arquivo LICENSE para detalhes.
Criado para garantir consistência de encoding em projetos e evitar problemas de caracteres especiais em commits.
- encoding_rs - Biblioteca de encoding
- chardetng - Detecção de encoding
- Rayon - Paralelismo
- Husky - Git hooks