Overcommit te ajuda a cuidar do seu código

Já ouviu falar da gem Overcommit? A função dela é ajudar a manter os padrões de qualidade, definidos por você ou pelas diversas comunidades de linguagens de programação mundo afora.

Por definição, Overcommit é uma ferramenta para administrar e configurar Git hooks, que são ações pré configuradas para executar um script assim que ocorrerem. Encontramos algumas dessas ações na gem, sendo as mais importantes: commit-msg, pre-commit e post-checkout. As duas primeiras ocorrem durante um commit, enquanto a última é acionada sempre que ocorrer uma mudança de branch via checkout por exemplo. É possível criar o seu próprio hook, mas só isso demandaria um post próprio.

Mas o que ele faz?

Agora vamos ao que realmente importa: o que Overcommit pode fazer por mim? É o seguinte, sempre que você fizer um commit por exemplo, vários scripts vão ser rodados. Esses scripts vão checar desde a sua mensagem no commit até a sintaxe do seu código. Vou detalhar alguns deles aqui:

  • CommitMsg - HardTabs, RussianNovel TrailingPeriod: Esses três scripts vão cuidar para ver como está sua mensagem do commit, checando a formatação, tamanho e caracteres do mesmo.

  • Brakeman: Checar por falhas de segurança

  • BundleCheck: Checar as dependências do seu Gemfile

  • Coffee/Css/Html/Scss/Haml Lint: Analisa a sintaxe de cada um desses, além de muitos outros, incluindo linguagens de programação como Java, Ruby, Python etc.

  • MergeConflicts: Sabe aquele conflito que você esqueceu de resolver em algum arquivo? Então :relieved:

  • PryBinding: Esqueceu de um pry lá no Controller? Relaxa, ninguém vai te zoar agora. :joy:

  • Rubocop: Talvez o mais importante para os rubystas. Rubocop é um analisador de código estático que segue vários padrões de código criados pela comunidade e mantidos no Ruby Style Guide. Ele é customizável, então você não precisa seguir tudo caso não queira.

Instalando e Configurando

Para instalar é simples:

gem install overcommit

Depois, dentro do repositório que pretende utilizar:

overcommit --install

Isso irá criar o arquivo .overcommit.yml no seu repositório. Basta seguir as instruções ali e da página da gem para configurar os hooks que achar necessário para o seu projeto!

Algumas dicas

Você pode bloquear um commit ou apenas avisar que ele feriu alguma regra de um dos scripts. Dentro do arquivo de configuração você vai ver algo assim:

PreCommit:
  Rubocop:
    on_warn: fail

Dessa forma não será permitido que o commit ocorra até que o código que foi alterado esteja de acordo com o Rubocop. Caso julgue necessário, é possível permitir que o commit ocorra, mas serão mostrados avisos de que algumas linhas modificadas não estão de acordo. Para isso basta modificar a última linha para on_warn: warn.

Além disso, serão sempre mostradas como um aviso apenas as outras linhas do arquivo modificado que não estão de acordo com alguma checagem. Sempre vai ficar a seu critério decidir se vale a pena modificar algo ou não. Além disso, arquivos não modificados não serão examinados.

Talvez você ache necessário manter o fail na sua configuração, mas realmente precisa fazer um commit e alguma checagem está te tirando do sério. Não tem problema, você pode utilizar o SKIP e fugir por hora. Basta informar qual hook quer pular dessa vez e pronto.

SKIP=rubocop git commit

O resultado final de tudo isso

_config.yml

Essa primeira imagem mostra meu commit sendo bloqueado pelos motivos que estão em vermelho. Nas minhas configurações eu não consigo terminar minha ação enquanto não corrigir esses “problemas” ou utilizar o SKIP.

_config.yml

Aqui é um outro exemplo em que o que eu modifiquei seguiu todos os padrões esperados e meu commit foi um sucesso! Além disso é possível perceber que o Rubocop gerou uma warning, ou seja, ele está alertando que existem alguns “problemas” no arquivo que eu modifiquei, mas não necessariamente onde eu modifiquei. O commit já foi feito, mas eu posso modificar isso depois para se adequara aos padrões.

Conclusão

Alguns projetos são gigantescos, passam de mão em mão e são modificados diariamente por dezenas de pessoas. Algumas vezes é difícil manter certos padrões, seja por barreiras físicas ou de tempo mesmo. Se você está sofrendo com isso ou apenas quer se manter “na linha”, a gem Overcommit é uma ótima solução.

Written on February 28, 2015