Итак, за последние пару недель я решил записать свои оплачиваемые времена в git коммитах. Это позволяет клиенту видеть, сколько они тратят, но также это означает, что мне не нужно все это кончать в конце недели. Это хорошо для нас обоих.
Я оставляю маленькие закодированные сообщения в конце своих коммитов. Вот пример:
Flushed out the flux capacitor, drank some BRAWNDO.
T=0.3
Это означает, что я потратил ~ 20 минут на то, чтобы что-то сделать. 1 час.
Так что я засорял их в своих проектах. Теперь вопрос в том, как мне выбрать их с определенной даты и сложить, чтобы я мог выставить счет клиенту?
Я должен добавить, что это не однопользовательские проекты. Некоторые сотрудничают, другой разработчик, возможно, пожелает последовать моему примеру и обработать свои счета таким образом. Мне нужно фильтровать только мои коммиты.
Мы можем ограничить то, что регистрирует выводы мерзавца на основе кто (--author
: может быть имя или электронная почта) и когда (--since
: берет причудливое количество форматов и нечетких строк).
Затем мы просто должны найти строки, которые запускаются с T=
, добавьте плюс символы между всеми числами и подайте их в калькулятор командной строки bc
.
$ git log --all --author=Oli --since="1 week" | grep -oP '(?<=T=)[\d.]+' | paste -sd+ | bc
30.5
Или с awk
:
$ git log --all --author=Oli --since="1 week" | awk -F= '/T\=[0-9.]+/{t+=$2} END{print t}'
30.5
Urgh, только 30,5 часа?! Похоже 60.
В большем проекте с миллионами фиксаций могло бы быть мудро прибавить a --grep '^T='
к git log
команда. Это недооценит быстрый фильтр внутренне перед внешним grep
обусловливает данные.
Проблема произошла после того, чтобы начинать использовать это. Я должен был сбросить часы. Я был посредством нескольких повторений сценария (большая умная передача по каналу), но благодаря git rebase
и другие tree-messing-up операции, лучший способ отсортировать фиксации по дате, и таким образом, они только обнаруживаются однажды, должны сделать это вручную.
Поэтому я представляю самый ужасный функциональный сценарий, я думаю, что когда-либо писал.
TOTAL=0
STARTD=""
function dfmt {
date -d$1 +%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"
Это анализирует каждую фиксацию и производит каждый тарификационный блок (между T=RESET
маркеры). Это намного лучше. Это намного медленнее. Кажется неизбежным, что я перепишу это в Python один день, но я должен сделать оплату работы на данный момент :)