Na Agilize o fluxo comum de trabalho do desenvolvedor envolve o uso do Jira para gerenciamento das tarefas, Git & Git Flow para versionamento de código, Slack para comunicação e ferramentas como IDE, Editor de Texto e Terminal. Basicamente, a sprint é mantida no Jira com cards que descrevem as funcionalidades, bugs, spikes e chores seguindo algumas convenções do SCRUM e, então, o programador atribui um card para si.
Durante o fluxo de desenvolvimento existe uma convenção de que commits devem ter o código do card que o programador está trabalhando. Após alguns commits a convenção se torna chata de manter (pois você tem que digitar o código do card a todo momento). Existe uma forma de automatizar isso com Git Hooks.
Git Hooks
Git permite executir um script toda vez que um evento acontecer no repositório. Por exemplo, é possível configurar o editor de texto com uma mensagem de template que deve ser preenchida. Este tutorial explica o poder do Git Hooks e disponibiliza um trecho de código que será customizado neste post para endereçar nossas necessidades.
Dentro do nosso repositório existe um diretório .git/hooks que contém alguns scripts de exemplo que podem ser usados como playground. Eles terminam com .sample para não serem interpretados pelo Git.
Crie um arquivo chamado prepare-commit-msg que vai conter o código abaixo para automatizar a mensagem de commit.
#!/usr/bin/env python3
import sys, os, re
from subprocess import check_output
# Setup
branch_regex = r'.+/(AGZ-\d+).*'
# Collect the parameters
commit_msg_filepath = sys.argv[1]
# Figure out which branch we're on
branch = check_output(['git', 'symbolic-ref', '--short', 'HEAD']).strip()
# Populate the commit message with the issue #, if there is one
issue_match = re.match(branch_regex, branch.decode('utf-8'), re.M|re.I)
if issue_match:
issue_code = issue_match.group(1)
with open(commit_msg_filepath, 'r+') as f:
content = f.read()
f.seek(0, 0)
f.write("%s %s" % (issue_code, content))
Depois de executar git commit o arquivo acima será executado para popular a mensagem de commit e, então, permitir-nos adotar o template nos nossos commits. O script é chamado com três argumentos:
- Nome do arquivo
- O nome de um arquivo temporário que vai conter a mensagem
- O tipo do commit
- O hash SHA1 do commit
Na Agilize o código do card segue a regex na linha 6. Como usamos o gitflow para gerenciar as branches, elas sempre seguirão alguns padrões como feature/AGZ-1256, hotfix/AGZ-981, release/AGZ-453. Portanto, commits não são criados nas branch master ou dev. Devido a isso, a variável na linha 6 define a regex que irá usar o nome da branch para criar nossa mensagem de commit. Se você quiser aplicar isso para a sua empresa basta atualizar a regex (veja a linha 17).
As linhas 15 e 16 checam se a branch atual não é master / dev e contém o código do card. As linhas finais apenas criam a mensagem com o código.
Obs:
Ao fazer commit o cursor geralmente começa no início da linha mas você pode fazer com que o cursor comece imediatamente depois da mensagem de template. Apenas adicione o trecho de código abaixo ao seu arquivo .bashrc.
export GIT_EDITOR="vim -c'startinsert|norm! ggA'"