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:)