Markus studiert!

SVN Statistiken in der Shell erzeugen

What The Foto?Mit ein paar geschickt kombinierten Unix-Tools lassen sich aus einem SVN Commit-Log interessante Statistiken extrahieren.

Für unser Softwaretechnik-Projekt habe ich einige Statistiken ausgearbeitet:

Anzahl der Commits pro User

Aus dem SVN-Log, das so aussieht:

------------------------------------------------------------------------
r1 | mtack001 | 2011-03-18 13:16:42 +0100 (Fr, 18. Mär 2011) | 1 Zeile

Lege Verzeichnisstruktur an.
------------------------------------------------------------------------

Holen wir uns mit grep -E "^r[0-9]+ \| " nur diese Zeilen

r1 | mtack001 | 2011-03-18 13:16:42 +0100 (Fr, 18. Mär 2011) | 1 Zeile

Mit awk '{ print $3; }' wird daraus der Username mtack001 extrahiert.

Alle Zeile werden dann mit sort sortiert und uniq -c zählt dann, wie oft ein Username vorkommt.

Zum Schluss sorgt ein sort -n -r dafür, dass diese Liste noch einmal absteigend sortiert wird.

Das gesamte Kommando:

svn log http://example.com/svn/repository/ | grep -E "^r[0-9]+ \| " | awk '{ print $3; }' | sort | uniq -c | sort -n -r

Diese Kommando liefert eine Liste in der Form "commits username", die man dann im Tabellenkalkulationsprogramm seiner Wahl in ein Chart umwandeln kann.

In unserem Fall ergibt sich folgender Graph (die Usernamen habe ich entfernt):

Anzahl der Commits eines Users pro Tag

Ähnliches kann man verwenden, um die Anzahl der Commits eines User pro Tag über den Projektverlauf zu visualisieren.

Ähnlich wie bei der vorigen Abfrage, werden hier mit awk '{ print $5, $3; }' nicht nur der Username, sondern auch das Datum des Commits extrahiert.

Ein anschließendes uniq -c zählt dann die Commits pro Tag.

Diese Liste filtern wir dann mit grep username nach den Einträgen des Users, der uns interessiert.

awk '{ OFS = ","; print $2, $1; }' sorgt dann dafür, dass das Ergebnis kommasepariert ausgegeben wird, so dass man es in einem Tabellenkalkulationsprogramm verwenden kann.

Meine Commits auf dem Projekt sehen so aus:

Das gesamte Kommando:

svn log http://example.com/svn/repository/ | grep -E "^r[0-9]+ \| " | awk '{ print $5, $3; }' | sort | uniq -c | grep username | awk '{ OFS = ","; print $2, $1; }' > username-commits-per-day.csv

Commits pro Tag

Leicht abgewandelt, kann man so auch für das gesamte Projekt die Commits pro Tag erhalten:

svn log http://example.com/svn/repository/ | grep -E "^r[0-9]+ \| " | awk '{ print $5; }' | sort | uniq -c | awk '{ OFS = ","; print $2, $1; }' > commits-per-day.csv

Commits pro Stunde

Die Stunde ist natürlich auch interessant: bei WTF? haben wir quasi rund um die Uhr gearbeitet.

svn log http://example.com/svn/repository/ | grep -E "^r[0-9]+ \| " | awk '{ print substr($6, 0, 2); }' | sort | uniq -c | awk '{ OFS = ","; print $2, $1; }' > commits-per-hour.csv

Commits pro Wochentag

Besonders beliebt war dabei der Donnerstag (der offizielle Projekt-Tag im Semester) und der Sonntag, der natürlich bis in den Montag Auswirkungen hat.

svn log http://example.com/svn/repository/ | grep -E "^r[0-9]+ \| " | awk '{ print substr($8, 2, 2); }' | sort | uniq -c | awk '{ OFS = ","; print $2, $1; }' > commits-per-weekday.csv

< 05. July 2011, 08:15 Uhr

Tags:


Meine .subversion/config

Das svn-Kommando auf der Kommando-Zeile wird u.a. durch die Datei ~/.subversion/config konfiguriert.

Meine Einstellungen daraus lauten:

[helpers]
diff-cmd = colordiff
diff-args = --ignore-all-space --ignore-blank-lines
[miscellany]
enable-auto-props = yes
[auto-props]
* = svn:keywords=Id Rev

< 14. October 2010, 14:15 Uhr

Tags: