Extrai strings do meu git commits

1

Então, nas últimas semanas, decidi anotar meus tempos faturáveis em commits git. Isso permite que um cliente veja o quanto está gastando, mas também significa que não preciso fazer tudo no final da semana. É bom para nós dois.

Eu tenho deixado mensagens pouco codificadas no final dos meus commits. Aqui está um exemplo:

Flushed out the flux capacitor, drank some BRAWNDO.

T=0.3

Isso significa que passei ~ 20 minutos fazendo algo. 1 é uma hora.

Então eu tenho estes espalhados por todos os meus projetos. A questão agora é, como faço para selecioná-las de uma determinada data e adicioná-las para que eu possa cobrar do cliente?

Devo acrescentar que estes não são projetos de usuário único. Alguns são colaboradores, outros desenvolvedores podem querer seguir meu exemplo e lidar com o faturamento dessa maneira. Eu preciso filtrar apenas meus commits.

    
por Oli 22.09.2015 / 16:44

1 resposta

1

Podemos limitar o que registra as saídas com base em quem ( --author : pode ser um nome ou e-mail) e quando ( --since : aceita um número bizarro de formatos e strings difusas).

Então, só precisamos encontrar linhas que comecem com T= , adicionar mais símbolos entre todos os números e alimentá-los na linha de comando da calculadora bc .

$ git log --all --author=Oli --since="1 week" | grep -oP '(?<=T=)[\d.]+' | paste -sd+ | bc
30.5

Ou com um awk :

$ git log --all --author=Oli --since="1 week" | awk -F= '/T\=[0-9.]+/{t+=} END{print t}'
30.5

Urgh, apenas 30,5 horas ?! Parece com 60.

Em um projeto maior com milhões de commits, convém adicionar um --grep '^T=' ao comando git log . Isso fará um filtro rápido internamente antes que o grep externo condicione os dados.

Ocorreu um problema depois de começar a usar isso. Eu precisava reiniciar o relógio. Eu já passei por várias iterações de script (muitas dicas inteligentes), mas graças a git rebase e outras operações de bagunça de árvores, a melhor maneira de classificar os commits por data, e então eles só aparecem uma vez é para fazer isso manualmente.

Portanto, apresento o script funcional mais feio que eu já escrevi.

TOTAL=0
STARTD=""

function dfmt {
    date -d +%Y-%m-%d
}

while read DATE HASH; do
    [[ -z $STARTD ]] && STARTD=$DATE
    while read M; do
        if [[ $M == "RESET" ]]; then
            echo -e "$(dfmt $STARTD) to $(dfmt $DATE)\t$TOTAL"
            TOTAL=0
            STARTD=$DATE
        else
            TOTAL=$(bc <<< "$TOTAL + $M")
        fi
    done < <(git show -s $HASH | grep -oP '(?<=T=)([\d.]+|RESET)')
done < <(git log --author=Oli --all --pretty="%aI %H" | sort -u -k1,1)

echo -e "$(dfmt $STARTD) to $(dfmt now)*\t$TOTAL\t" $(bc <<< "scale=2; $TOTAL / 8.0") " days"

Isso analisa cada confirmação e gera todos os fragmentos de faturamento (entre T=RESET tokens). É muito melhor. É muito mais lento. Parece inevitável que eu reescreva isso em Python um dia, mas eu tenho que fazer um trabalho pagando por enquanto:)

    
por Oli 22.09.2015 / 16:44