Объедините `cloc` с`git blame`
cloc
позволяет подсчитать количество строк кода, хранящихся в каталоге, по языку для каждого типа (пробел, комментарий или код).
git blame
позволяет увидеть, какая часть файла кому принадлежит.
Я ищу способ объединить оба, чтобы получить (трехмерную) матрицу, в которой перечислены строки кода для каждого языка для каждого пользователя.
Существуют ли изящные встроенные способы сделать это, или нужно "отбросить" "виноватые" части (запустив grep
после git blame
) каждого пользователя и запустить cloc
по ним рассчитать таблицу для каждого пользователя?
РЕДАКТИРОВАТЬ:
Наивный подход (на основе комментария @Jubobs):
- Сначала сгенерируйте файл обвинений для каждого файла в каталоге (необязательно явно).
- Запустите grep с чем-то вроде
grep "^[^(]*([^)]*)"
захватить список всех пользователей и получить уникальныеsort
а такжеuniq
, - Для каждого пользователя: создайте теневую копию папки и выполните команду grep с
grep "^[^(]*($user)"
такой, что остаются только строки этого пользователя. - Запустите cloc на теневой копии.
- Сделайте это для каждого пользователя, сохраните результаты и выведите их вместе.
Это более или менее то, как генерировать желаемый результат. Но, как можно видеть, этот подход делает много копий (или, по крайней мере, сохраняет в памяти), и можно фактически вычислить строки для пользователя, запустив файл один раз, а не несколько раз.
Желаемый результат:
что-то вроде:
+--------+--------------------------------+--------------------------------+
|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