Введение
Итак! Представим, что наступил момент, когда разработка через исходный код реализована на предприятии в полном объеме. Мы разрабатываем в EDT или конфигураторе (но выгружаем конфигурацию в исходный код), версионируем внешние отчеты и обработки и расширения, собираем релизы, проверяем код статическим анализом, в разработке царит гармония и мир. Красота!
Но менеджерам этого мало, всегда хочется чего-то еще, и вот мне прилетает задача - дай статистику по вкладу в код каждого разработчика.
Задача решаема - есть исходный код, есть репо с историей, значит ничто не может помешать получить нужную информацию.
Сразу скажу, что в эта статья посвящена только техническому аспекту получения статистики работы программистов. Моральную сторону не рассматриваю, считаю, что оценивать разработчика по количеству строк кода непродуктивно и вообще опасно. Статистика работы программиста может использоваться только как один из параметров, не самый главный!
Поиск по ключевым словам git+stat на github дал множество репозиториев с программами на разных языках, помогающих оформить профиль, специализированных на github, среди которых почти затерялся репо git-quick-stats.
Предоставлю слово великолепному README.md этого репо (перевод мой):
git-quick-stats — это простой и эффективный способ доступа к различной статистике в репозитории git.
Любой репозиторий git может содержать массу информации о коммитах, участниках и файлах. Извлечение этой информации не всегда просто, в основном потому, что существует огромное количество опций для огромного количества команд git — не думаю, что есть хоть один человек, который знает их все. Наверное, даже сам Линус Торвальдс не знает их:)
Давайте посмотрим, как выглядит статистика, получаемая git-quick-stats. Для получения этих картинок я обработал репозиторий самого этого приложения git-quick-stats.
Интересно, правда?
Этот инструмент представляет из себя исполняемый sh-скрипт, использующий набор линуксовых утилит:
- awk
- basename
- cat
- column
- echo
- git
- grep
- head
- printf
- seq
- sort
- tput
- tr
- uniq
Соответственно, он будет работать в линукс "из коробки", либо в Windows с помощью специальных прокладок. В качестве "прокладок" может быть или WSL (возможность запускать нативные линуксовые команды), либо так называемый git bash - специальная командная оболочка с встроенными линуксовыми командами.
Установка
В deb-дистрибутивах линукс (Debian, Ubuntu и остальные) команда установки очень проста:
apt install git-quick-stats
В остальных дистрибутивах нужно склонировать репо и установить приложение:
git clone https://github.com/arzzen/git-quick-stats.git && cd git-quick-stats
sudo make install
Для Windows, если мы собираемся пользоваться git bash можно просто склонировать репо в нужный каталог:
git clone https://github.com/arzzen/git-quick-stats.git
Использование
Мне нравится git-клиент GitExtensions, на его примере покажу, как я запускаю это приложение. В GitExtensions открываю локальный репозиторий (в данном примере сам склонированный репо git-quick-stats), перехожу во вкладку Console.
Консоль - это и есть git bash - специальная командная оболочка с возможностью выполнения линуксовых команд.
В консоли пишу путь к файлу скрипта git-quick-stats. Репо я склонировал в каталог Git на диске C, значит путь будет следующим:
C:/GIT/git-quick-stats/git-quick-stats
И нажимаю на Enter
Запускается приложение в интерактивном режиме:
Нужно вписать номер нужной функции и нажать Enter
Это все очень хорошо, но как автоматизировать все это?
git-quick-stats может работать не только интерактивно, но и в режиме скрипта. Например, то же самое, что мы получили интерактивно выше, можно получить командой:
C:/GIT/git-quick-stats/git-quick-stats -T
Статистика скриптом
Ну и прекрасно. Задача решена. Есть замечательный ключ команды, который позволяет выгружать данные сразу в csv, а значит напрямую в эксель.
C:/GIT/git-quick-stats/git-quick-stats -V
Правда тут приходится ответить еще на интерактивный вопрос - какая ветка?
Which branch? master
И вот мы получаем экселеподобный текст:
$ C:/GIT/git-quick-stats/git-quick-stats -V
Which branch? master
author,insertions,insertions_per,deletions,deletions_per,files,files_per,commits,commits_per,lines_changed,lines_changed_per
Jess <jessachandler@gmail.com>,31,1%,1,0%,1,0%,1,1%,32,0%
Lukas Mestan <lukas.mestan@hyperia.sk>,88,2%,51,2%,7,3%,7,4%,139,2%
Pawaer <pawaer@t-online.de>,1,0%,1,0%,1,0%,1,1%,2,0%
Jorge Maldonado Ventura <jorgesumle@freakspot.net>,3,0%,3,0%,1,0%,1,1%,6,0%
...
Тут у нас есть автор (author), количество вставленных строк (insertions), удаленных строк (deletions), измененных файлов (files), коммитов (commits), измененных строк (lines_changed), также в колонках с суффиксом _per выведены эти же значения в процентах.
Уважаемые менеджеры, держите статистику.
И тут менеджеры говорят - нам нужна статистика по неделям. Мы планируем работу программистов по неделям, соответственно хотим видеть, статистику по программистам в разрезе недель.
Окей... git-quick-stats умеет работать с периодами. Период нельзя передать параметром, но зато можно указать в переменных окружения.
Для установки начала периода нужно выполнить команду, она устанавливает в переменную окружения _GIT_SINCE дату 2023-01-01:
export _GIT_SINCE=2023-01-01
Для установки окончания периода нужно выполнить команду, она устанавливает в переменную окружения _GIT_UNTIL дату 2023-01-31:
export _GIT_UNTIL=2023-01-31
Кроме того, нам пригодится команда указания ветки репозитория в переменной окружения:
export _GIT_BRANCH=master
Проверим установку переменной _GIT_BRANCH. Выполним сначала эту команду в консоли, а затем команду вывода статистики в csv формате. Запроса имени ветки больше нет:
$ C:/GIT/git-quick-stats/git-quick-stats -V
author,insertions,insertions_per,deletions,deletions_per,files,files_per,commits,commits_per,lines_changed,lines_changed_per
Jess <jessachandler@gmail.com>,31,1%,1,0%,1,0%,1,1%,32,0%
Lukas Mestan <lukas.mestan@hyperia.sk>,88,2%,51,2%,7,3%,7,4%,139,2%
Pawaer <pawaer@t-online.de>,1,0%,1,0%,1,0%,1,1%,2,0%
...
Итак, напишем скрипт, получающий статистику по репозиторию в разрезе недель. Скрипт будем писать на православном OneScript (а как иначе, я же программист 1С все-таки).
Но как из скрипта запустить git bash? Мы же запускали специальную консоль для работы с git-quick-stats, вряд ли можно указать oscript, чтобы он выполнил команду из git bash...
Оказывается, можно.
У oscript есть библиотека 1commands, библиотека для упрощения работы c запуском различных приложений и командных файлов. В этой библиотеке есть одна очень интересная возможность - запуск командного файла.
Для PowerShell это выглядит так:
КомандныйФайл = Новый КомандныйФайл;
КомандныйФайл.УстановитьПриложение("C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe");
КомандныйФайл.Создать("",".ps1");
КомандныйФайл.ДобавитьКоманду("Get-Help");
Сообщить(КомандныйФайл.ПолучитьТекстФайла());
КодВозврата = КомандныйФайл.Исполнить();
Мы же можем сделать точно то же самое и для git bash - создаем командный файл, только в качестве приложения установим "C:\Program Files\Git\bin\bash.exe"
Для использования библиотеки в начале скрипта укажем волшебную директиву:
#Использовать 1commands
И конечно же, если библиотека еще не установлена в системе, установим ее:
opm install 1commands
И затем сформируем и выполним командный файл:
КомандныйФайл = Новый КомандныйФайл;
КомандныйФайл.УстановитьПриложение("C:\Program Files\Git\bin\bash.exe");
КомандныйФайл.УстановитьКодировкуВывода(КодировкаТекста.UTF8);
КомандныйФайл.Создать("",".sh");
КомандныйФайл.ДобавитьКоманду(СтрШаблон("export _GIT_SINCE=""""%1""""", Формат(НачалоПериода, "ДФ=yyyy-MM-dd")));
КомандныйФайл.ДобавитьКоманду(СтрШаблон("export _GIT_UNTIL=""""%1""""", Формат(КонецПериода, "ДФ=yyyy-MM-dd")));
КомандныйФайл.ДобавитьКоманду("export _GIT_BRANCH=master");
КомандныйФайл.ДобавитьКоманду("cd Путь/К/Анализируемому/Репо");
КомандныйФайл.ДобавитьКоманду("C:/GIT/git-quick-stats/git-quick-stats -V");
КодВозврата = КомандныйФайл.Исполнить();
Вывод = КомандныйФайл.ПолучитьВывод();
Здесь еще пришлось добавить установку кодировки вывода, так как без нее русские имена разработчиков превращались в крякозябры.
Ну а сделать цикл по неделям и распарсить полученный вывод статистики - дело техники.
Общая логика скрипта такова - создаем таблицу значений, куда положим строки с данными статистики. Проходим циклом по нужным периодам. Формируем данные статистики и кладем полученные строчки в общую таблицу. Сохраняем получившуюся таблицу как обычный текстовый файл с разделителями в csv формате.
Приведу листинг функции сохранения таблицы значений в csv. Функция универсальная, может пригодиться не только тут.
Процедура ЗаписатьТаблицуЗначенийНаДиск(ТаблицаЗначений, ИмяФайла)
МассивСтрок = Новый Массив;
МассивОписанияКолонок = Новый Массив;
Для каждого Колонка Из ТаблицаЗначений.Колонки Цикл
МассивОписанияКолонок.Добавить(Колонка.Имя);
КонецЦикла;
МассивСтрок.Добавить(СтрСоединить(МассивОписанияКолонок, ";"));
Для Каждого Строка Из ТаблицаЗначений Цикл
ОписаниеСтроки = Новый Массив;
Для каждого Колонка Из ТаблицаЗначений.Колонки Цикл
ОписаниеСтроки.Добавить(Строка[Колонка.Имя]);
КонецЦикла;
МассивСтрок.Добавить(СтрСоединить(ОписаниеСтроки, ";"));
КонецЦикла;
ЗаписьТекста = Новый ЗаписьТекста(ИмяФайла);
ЗаписьТекста.Записать(СтрСоединить(МассивСтрок, Символы.ПС));
ЗаписьТекста.Закрыть();
КонецПроцедуры
Давайте еще заведем три параметра у скрипта - куда сохранять полученную статистику, какие репозитории обрабатывать (а их может быть несколько), и с какой даты обрабатывать.
Для работы с параметрами есть библиотека для oscript - cmdline. Операционная система передает аргументы командной строки в виде массива, а библиотека предоставляет интерфейс для доступа к нему:
#Использовать cmdline
Парсер = Новый ПарсерАргументовКоманднойСтроки();
Парсер.ДобавитьИменованныйПараметр("-file");
Парсер.ДобавитьИменованныйПараметр("-repo");
Парсер.ДобавитьИменованныйПараметр("-since");
Параметры = Парсер.Разобрать(АргументыКоманднойСтроки);
ИмяФайла = Параметры["-file"];
Репо = Параметры["-repo"];
НачалоПериодаСтрокой = Параметры["-since"];
Теперь можно указывать параметры не в тексте скрипта, в командной строке:
oscript .\git-stat.os -file "my_stat.csv" -repo "C:/GIT/git-quick-stats" -since "20200101"
В репозитории git_stat вы можете найти полный текст скрипта - файл называется git-stat.os. Применить его у себя очень просто - проверьте, установлен ли у вас вообще oscript, git и git bash, клонируйте git-quick-stats, проверьте правильность путей до утилиты git bash и git-quick-stats...
... и анализируйте.