Объедините `cloc` с`git blame`

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

git blame позволяет увидеть, какая часть файла кому принадлежит.

Я ищу способ объединить оба, чтобы получить (трехмерную) матрицу, в которой перечислены строки кода для каждого языка для каждого пользователя.

Существуют ли изящные встроенные способы сделать это, или нужно "отбросить" "виноватые" части (запустив grep после git blame) каждого пользователя и запустить cloc по ним рассчитать таблицу для каждого пользователя?


РЕДАКТИРОВАТЬ:

Наивный подход (на основе комментария @Jubobs):

  1. Сначала сгенерируйте файл обвинений для каждого файла в каталоге (необязательно явно).
  2. Запустите grep с чем-то вроде grep "^[^(]*([^)]*)" захватить список всех пользователей и получить уникальные sort а также uniq,
  3. Для каждого пользователя: создайте теневую копию папки и выполните команду grep с grep "^[^(]*($user)" такой, что остаются только строки этого пользователя.
  4. Запустите cloc на теневой копии.
  5. Сделайте это для каждого пользователя, сохраните результаты и выведите их вместе.

Это более или менее то, как генерировать желаемый результат. Но, как можно видеть, этот подход делает много копий (или, по крайней мере, сохраняет в памяти), и можно фактически вычислить строки для пользователя, запустив файл один раз, а не несколько раз.


Желаемый результат:

что-то вроде:

+--------+--------------------------------+--------------------------------+
|User    | C#                             | XML                            |
+--------+-------+-------+---------+------+-------+-------+---------+------+
|        | files | blank | comment | code | files | blank | comment | code |
+--------+-------+-------+---------+------+-------+-------+---------+------+
| Foo    |    12 |    75 |     148 | 2711 |     2 |    42 |       0 |    0 |
| Bar    |   167 |  1795 |    1425 |    2 |    16 |     0 |     512 | 1678 | 
+--------+-------+-------+---------+------+-------+-------+---------+------+
| Total  |   179 |  1870 |    1573 | 2713 |    18 |    42 |     512 | 1678 |
+--------+-------+-------+---------+------+-------+-------+---------+------+

1 ответ

Это старый вопрос, но он заинтересовал меня, поэтому я начал пытаться его решить. Это не выдает хороший отчет, но он помещает данные в CSV с тремя столбцами: file extension, email of committer, # lines this user has committed for this file type, Это также не дает пробела, комментария, строк кода, как у cloc. Если у меня будет время, я постараюсь заставить все это работать хорошо, но подумал, что это может быть "достаточно хорошим" решением или, по крайней мере, поможет вам начать работу в правильном направлении.

#!/bin/bash

LIST_OF_GIT_FILES=/tmp/gitfiles.txt
GIT_BLAME_COMBINED_RESULTS=/tmp/git-blame.txt
OUTPUT=/tmp/git-blame-output.txt
SUMMARY=code-summary.csv

rm $GIT_BLAME_COMBINED_RESULTS
git ls-files > $LIST_OF_GIT_FILES
while read p; do
  git blame -e -f $p >> $GIT_BLAME_COMBINED_RESULTS
done < $LIST_OF_GIT_FILES
awk -F ' ' '{print $2 "," $3}' $GIT_BLAME_COMBINED_RESULTS | tr -d '(<>' | awk -F ',' '{n = split($1, a, "."); print a[n] "," $2}' > $OUTPUT
sort $OUTPUT | uniq -c | sort -n | awk -F ' ' '{print $2 "," $1}' | sort > $SUMMARY

rm $GIT_BLAME_COMBINED_RESULTS
rm $LIST_OF_GIT_FILES
rm $OUTPUT
Другие вопросы по тегам