🤖🚫 AI-free content. This post is 100% written by a human, as is everything on my blog. Enjoy!

Генератор недельного отчета из git log

November 30, 2010, revised January 2, 2011 in Software

Я терпеть не могу заполнять недельные отчеты. Это нудно и скучно. Поэтому в последний раз я решил вместо сочиняния отчета сесть и автоматизировать задачу.

Ведь есть специальная утилита, которая занимается именно тем, чтобы записывать, чем занимался программист. Более того, этой утилитой неизбежно пользуются если не все (мечты, мечты), то хотя бы большинство программистов. Утилита эта замечательно помнит, что ты делал в понедельник, даже если понедельник был год назад.

Я говорю о системе контроля версий. В моем случае, git. Даже из простой распечатки git log можно извлечь нужную нам информацию, но почему бы не пойти дальше? Хочу сгруппированный по дням список коммитов.

Можно было бы написать скрипт на Ruby, но мне потехи ради захотелось ограничиться shell. К тому же, KISS и все такое.

(В последствии оказалось, что задача все же слишком сложна для shell script, и лучше было ее решить на Ruby - что я и сделал в скрипте git-timesheet.)

git log --no-merges --simplify-merges --committer=`git config --get user.email` --format="%ad %s" --date=iso --since="1 week ago" --reverse | \
  sed "s/^\(.\{11\}\)\(.\{5\}\).\{9\}/\1\2/" | \
  uniq -w 10 --all-repeated=prepend | \
  sed "s/^$//; theader; s/^.\{11\}//; bend; :header; n; s/ /\\n===========\\n\\n/; :end"

Подробности

Первая строчка выдает список коммитов за неделю, сделанных тем автором, который указан в конфиге, кроме мерджей, отсортированные по времени - тут все просто.

Вторая убирает из ISO-шного формата времени – 2010-11-30 17:21:42 +0200 – ненужные нам секунды и часовой пояс, поскольку отдавать время в произвольном формате git log не умеет.

Третья и четвертая строчка делают вот что: uniq разбивает входной поток на блоки, у которых совпадает первые 10 символов (то есть дата), и вставляет перед каждым таким блоком пустую строку. sed обнаруживает пустые строки и превращает их (вместе со следующей строкой) в заголовки.

Осталось сделать из этой команды alias – и никогда не мучаться при написании отчетов.

Демонстрация

Для проверки я вытянул репозитарий Rails: посмотрим, чем на этой неделе занимался Jose Valim?

2010-11-23
===========

22:40 Remove the not needed setup and teardown
23:28 unregister method implementation and test
23:49 clean up test by using unregister method

2010-11-24
===========

10:10 port_string bought back to life as it is part of the public api
12:38 Allow template handlers to store temp data.


2010-11-25
===========

01:19 processing image/* is an odditity because there is a test case which expects image/* to not to be expanded. So I am leaving image/* as it is and process only text/* and application/*
01:24 process text/* if it appears in the middle of HTTP_ACCEPT parameter
10:44 #:nodoc: internal methods.
11:49 Dynamically generaeted helpers on collection should not clobber resources url helper [#6028 state:resolved]

2010-11-28
===========

11:48 trailing star mimes should respect the order in which mime types are defined.
12:48 Fix tests on 1.9.2.
16:55 Partialy revert f1c13b0dd7b22b5f6289ca1a09f1d7a8c7c8584b
20:07 test case on has_one :through after a destroy

Так-то!

Если присмотреться, то не все так хорошо - uniq выбрасывает дни, для которых в логе только одна запись, сортировка не учитывает часового пояса.

Buy me a coffee Понравился пост? Купи мне кофе