Kombiniere `cloc` mit `git Blame`

Lesezeit: 3 Minuten

Benutzer-Avatar
Willem van Onsem

cloc ermöglicht es, die Anzahl der Codezeilen zu zählen, die in einem Verzeichnis pro Sprache pro Typ (Leerzeichen, Kommentar oder Code) gespeichert sind.

git blame ermöglicht zu sehen, welcher Teil einer Datei zu wem gehört.

Ich suche nach einer Möglichkeit, beides zu kombinieren, sodass man eine (dreidimensionale) Matrix erhält, die die Codezeilen pro Typ pro Sprache pro Benutzer auflistet.

Gibt es elegante eingebaute Möglichkeiten, dies zu tun, oder sollte man die “beschuldigten” Teile “verschrotten” (indem man grep nach git blame) jedes Benutzers und ausführen cloc auf sie, um die Tabelle für jeden Benutzer zu berechnen?


BEARBEITEN:

Naiver Ansatz (basierend auf dem Kommentar von @Jubobs):

  1. Generieren Sie zuerst eine Schulddatei für jede Datei im Verzeichnis (nicht notwendigerweise explizit).
  2. Führen Sie grep mit etwas wie aus grep "^[^(]*([^)]*)" um die Liste aller Benutzer zu erfassen und die Uniques abzurufen sort und uniq.
  3. Für jeden Benutzer: Erstellen Sie eine Schattenkopie des Ordners und grep mit grep "^[^(]*($user)" so dass nur die Zeilen dieses Benutzers verbleiben.
  4. Führen Sie cloc auf der Schattenkopie aus.
  5. Tun Sie dies für jeden Benutzer, speichern Sie die Ergebnisse und geben Sie sie gemeinsam aus.

Dies ist mehr oder weniger die Erzeugung der gewünschten Ausgabe. Aber wie man sieht, wird bei diesem Ansatz viel kopiert (oder zumindest im Speicher gespeichert) und man kann die Zeilen pro Benutzer tatsächlich berechnen, indem man die Datei einmal statt mehrmals durchläuft.


Gewünschte Ausgabe:

etwas wie:

+--------+--------------------------------+--------------------------------+
|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 |
+--------+-------+-------+---------+------+-------+-------+---------+------+

  • Könnten Sie Ihre Frage bearbeiten, um genau anzugeben, was grep sollte aus der Ausgabe von abgerufen werden git blame?

    – jub0bs

    25. August 2014 um 11:25 Uhr

  • @Jubobs: auch mit erwarteter Ausgabe aktualisiert …

    – Willem Van Onsem

    25. August 2014 um 11:38 Uhr

  • Ich bin mir nicht sicher, warum das heruntergestimmt wird … Downvoter, eine Erklärung?

    – jub0bs

    25. August 2014 um 11:39 Uhr


  • Ich auch nicht, das ist – meiner Meinung nach – eine ganz klare Frage, mit Beispiel und nicht subjektiv usw.

    – Willem Van Onsem

    25. August 2014 um 11:40 Uhr


  • Es kommt nicht auf die Aufteilung nach Sprachen an, aber git fame macht ein paar Statistiken.

    – Carlos Campderros

    1. Juni 2016 um 7:21 Uhr

Dies ist eine ältere Frage, aber sie hat mein Interesse geweckt, also habe ich angefangen, herumzuspielen und zu versuchen, sie zu lösen. Dies spuckt keinen schönen Bericht aus, aber es fügt Daten in eine CSV-Datei mit den 3 Spalten ein: file extension, email of committer, # lines this user has committed for this file type. Dies gibt auch keine leeren Kommentar-Codezeilen wie cloc aus. Wenn ich Zeit habe, werde ich versuchen, das alles zum Laufen zu bringen, aber ich dachte, dies könnte eine “gut genug” Lösung sein oder Sie zumindest in die richtige Richtung bringen.

#!/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

1119250cookie-checkKombiniere `cloc` mit `git Blame`

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy