Manchmal hat man ein Projekt, von dem man gerne wissen möchte, ob noch aktiv an diesem entwickelt wird. Aber nicht immer sind entsprechende Grafiken mit aussagekräftigen Zahlen verfügbar. Eine recht einfache Möglichkeit, dennoch einen Überblick zu bekommen, ist ein Blick in die Commit Logs des Projektes. Wenn diese viel Aktivität zeigen, ist ein Projekt mit sehr hoher Wahrscheinlichkeit noch aktiv. Aber stupide Datumswerte sind oftmals recht schwer zu überblicken. Etwas mehr Grafik wäre hier wünschenswert. Und genau hier kann man mit etwas Bash Magic und ein wenig RRDTool nachhelfen.
Als erstes benötigt man hierzu natürlich eine Kopie des Repositories des Projektes, von dem man einen Überblick erhalten möchte. In meinem Beispiel ist dies ispCP, da es dort derzeit Probleme zu geben scheint. Also holen wir uns das Repository:
git svn clone -s --use-log-author http://www.isp-control.net:800/ispcp_svn ispCP
Der Parameter -s sagt git-svn, dass das Default-Layout für das Repository verwendet wird, während mit –use-log-author die Authoren-Angabe aus dem ursprünglichen Commit übernommen wird. Zusätzlich sollte man hier noch die Zuordnung von SVN-Usernamen zu Git-Nutzern angeben, da ich diese für ispCP jedoch nicht kenne, geht es auch ohne. Aus dieser Information ließe sich ansonsten auch die Anzahl Commits je Autor errechnen und darstellen, aber das geht ein wenig weiter als für einen groben Überblick nötig.
Nachdem wir unser Repository geclont haben (kann bei SVN etwas dauern), kann die eigentliche Magie beginne. Als erstes benötigen wir hierzu eine RRD (Round Robin Database), in der wir unsre aggregierten Daten ablegen. Diese lässt sich wie folgt erstellen:
rrdtool create ispcp.rrd --start 1000000000 -s 60 DS:commits:ABSOLUTE:86400:0:65536 RRA:LAST:0:1:1440 RRA:LAST:0:60:720 RRA:LAST:0:720:730 RRA:LAST:0:1440:3000
Auf diese Weise erhalten wir unsere Archiv-Datei, in der nun lediglich noch unsere Daten abgelegt werden müssen. Auch dies erlaubt uns die Bash mit Hilfe eines Einzeilers:
git log|grep Date:|cut -d: -f2-|cut '-d ' -f 5-8|awk "{ /(\S+)\s+(\S+)\s+(\S+)\s+(\S+)/; print \$1,\$2,\$4,\$3}"|xargs -i date --date={} +%s|sort|xargs -i rrdtool update ispcp.rrd -- {}:1
Dieser Befehl macht eine ganze Menge an Magie, weshalb ich ihn etwas auseinandernehmen möchte:
Der erste Teil liest von Git die Versionsgeschicht des aktuellen Repository aus. Aus der resultierenden Ausgabe wird das Datum eines jeden Commits gefiltert. Die beiden cut-Befehle sorgen nun dafür, aus der Datumszeile nur das eigentliche Datum übrig zu lassen. Die Zeitzone wird dabei entfernt, weil date damit nicht so recht arbeiten wollte. Auch möchte Ddate das Datum mit dem Jahr vor der Zeit haben, weshalb mit awk die vier Felder „Monat Tag Uhrzeit Jahr“ in die Reihenfolge „Monat Tag Jahr Uhrzeit“ getauscht werden müssen. Danach wird die so umgetauschte Uhrzeit an date übergeben und in einen Unix-Zeitstempel umgewandelt. Die Zeitstempel aller Commits werden dann aufsteigend sortiert und an rrdtool übergeben. Dabei erfolgt für jeden Zeitstempel ein Aufruf mit dem Hinweis, dass sich der Zähler um eins erhöht hat. Der stillschweigend übergangene Befehl xargs ruft den danach aufgeführten Befehl führ jede Zeile der Eingabe einmalig auf, wobei {} auf der Befehlszeile durch den Inhalt der aktuellen Eingabezeile ersetzt wird.
Was in diesem Befehl nicht beachtet wird, sind 2 Commits, die in der gleichen Sekunde stattgefunden haben. Diese werden uns aber von RRDTool als Warnmeldung geliefert, womit wir einen Überblick über diese Vorkommnisse haben.
Nun da wir unsere Daten haben, müssen wir diese natürlich auch noch darstellen. Dies geht am einfachsten mit dem in RRDTool bereits enthaltenen Graphen-Tool:
rrdtool graph ispcp.png --end now --start end-153600000s --step=86400 --width 1000 --height=512 DEF:commits=ispcp.rrd:commits:LAST CDEF:c=commits,UN,0,commits,IF,86400,* AREA:c#0000FF:"Number of Commits\l"
Auch dieser Befehl ist eigentlich wieder recht einfach zu verstehen: Wir nehmen vom aktuellen Zeitpunkt bis zum Zeitpunkt vor 5 Jahren im Abstand von einem Tag eine Auswertung vor und wollen einen Graphen haben, der als Zeichenfläche 1000×512 Pixel ist. Dieser soll die Commits aus der Datei ispcp.rrd enthalten. Diese werden noch kurz skaliert und undefinierte Werte durch 0 ersetzt. Anschließend werden diese einfach gezeichnet.
Und so einfach haben wir unseren Überblick!
Eine Stolperfalle hat das Ganze aber: Erhält man nämlich einen leeren Graphen, ist die Ursache nicht ganz offensichtlich. Hier hilft es, wenn man beim Erstellen des RRD den Heartbeat möglichst lange einstellt, was aber die erzielbare Auflösung stark reduziert. Bei Projekten, die aber nur selten Commits haben, erzielt man auf diese Weise recht brauchbare Ergebnisse, auch wenn einzelne Commits, die von langen Ruhephasen umgeben sind, ignoriert werden. An der Stelle sollte man also beim Interpretieren der Grafik etwas vorsichtig sein. Für einen Überblick reicht es aber allemal. Auch ist, wie oben bereits erwähnt, ein systematischer Fehler enthalten, wenn man häufig Commits in der selben Sekunde hat. In diesem Falle werden alle Commits einer Sekunde als nur ein Commit gewertet.