Open Source im professionellen Einsatz
Linux-Magazin 02/2011
© Dagmar Fischer, Photocase.com

© Dagmar Fischer, Photocase.com

Kurzweilige Repository-Statistiken mit Perl und R

Datumsarithmetik

Perls Git-Repository enthält alle Commits, seit Larry Wall Perl 1987 aus der Taufe hob. Das Statistik-Tool R gewinnt aus den historischen Daten überraschende Informationen und stellt sie grafisch dar.

711

Es kann vielleicht nicht jeder nachvollziehen, aber zumindest für mich hat es etwas Erhebendes, die vollständige Historie des Perl-Kerns vor Augen zu haben. Welche Dateien hat Larry Wall anno 1987 eingecheckt? Wer schickte das erste Patch ein? Was enthielt es? Das Kommando »git log« zeigt erste Ergebnisse sofort an (Abbildung 1) und benötigt nur wenige Sekunden, um sich bis zum Anfang des Projekts vorzuarbeiten. Das funktioniert sogar ohne Internetverbindung und selbst auf einem Netbook. Alle Informationen sind in einem 120 MByte großen Repository versteckt, das »git« von [git://perl5.git.perl.org/perl.git] bezieht. Dass Git herkömmliche Versionskontrollsysteme wie Subversion aus dem Feld schlägt, wundert nur Unwissende.

Abbildung 1: Das Git-Repository des Perl-Projekts enthält alle Commits, seit Larry Wall 1987 es aus der Taufe hob. Für die Zeitreise braucht die Versionskontrolle nur Sekunden.

Geballte Information

Die geballte Informationsladung des Perl-Repository hilft nicht nur interessierten Programmierern die Entwicklung des Projekts mitzuverfolgen. Moderne Statistiktools extrahieren daraus Trends und stellen sie grafisch ansprechend dar. Bereits mit Shell-Bordmitteln wie

git log --oneline | wc -l
git log --name-status --date=raw 
--pretty='format:commit,%ae,%at,%ce' 
 > perl-git-log.txt

produziert eine umfangreichere Ausgabe. Jeder Commit enthält in diesem Format eine oder mehrere Dateien, die Git unterhalb der Kopfzeile jeweils nach einem Change-Flag (»M«: modified, »A«: added, »R«: removed) zeilenweise auflistet. Kopfzeilen beginnen mit »commit«, damit der später gebaute Parser sie leicht von Dateizeilen unterscheiden kann. Nach dem Aufruf des obigen Shell-Einzeilers schnappt sich Listing 1 die Daten und formt sie in ein CSV-Format um, mit dem das Statistiktool R später weiterarbeitet.

Listing 1:
»log2csv«

01 #!/usr/local/bin/perl -w
02 use strict;
03 use local::lib;
04 use Text::CSV;
05
06 my $logfile = "perl-git-log.txt.bz2";
07 my $csvfile = "perl-git-log.csv";
08
09 my $csv = Text::CSV_XS->new ( { binary => 1, eol => $/ } ) or
10     die "Cannot use CSV: ", Text::CSV->error_diag();
11
12 open my $logfh, "bzip2 -dc $logfile |" or die "$logfile: $!";
13 open my $csvfh, ">$csvfile" or die "$csvfile: $!";
14
15 my($dummy, $author, $time, $committer);
16
17 $csv->print( $csvfh, ["time", "file", "author", "committer"] );
18
19 while( <$logfh> ) {
20     if( /^commit/ ) {
21         chomp;
22         ($dummy, $author, $time, $committer) = split /,/, $_;
23     } elsif( /^(w)s+(.*)/ ) {
24         my $file = $2;
25         $csv->print( $csvfh, [$time, $file, $author, $committer] ) or
26           die "print failed: ", Text::CSV->error_diag();
27     }
28 }
29
30 close $logfh or die "$logfile: $!";
31 close $csvfh or die "$csvfile: $!";

Perl als Hilfsarbeiter

Auch der Perl-Snapshot kann sich nicht immer nur auf die Sprache Perl beschränken. Im Bereich der Statistik glänzt die Sprache R [2] mit geschwindigkeitsoptimierten Datentransformationen, einer reichen Auswahl an Grafikbibliotheken und einem CPAN-ähnlichen Entwicklernetzwerk namens CRAN.

In R geschriebene Skripte sind erstaunlich kompakt, allerdings dauert es einige Zeit, bis Neulinge die neuen Paradigmen und Datenstrukturen durchschauen [3]. Perl hingegen glänzt im Umwandeln von Datenformaten, daher arbeitet es hier mit dem Skript »log2csv« in Listing 1 nur als Zubringer, indem es die Logdaten des Git-Repository in kommaseparierte Einträge wie in Abbildung 2 umformt [4].

Abbildung 2: Die erzeugte CSV-Datei, die Commits in einzelne Dateien aufspaltet und die Grundlage zur statistischen Analyse in R darstellt.

Hierzu kämmt sich »log2csv« zeilenweise durch die vorher von 5 MByte auf ein halbes MByte komprimierte Logdatei »perl-git-log.txt.bz2«. Trifft es in Zeile 20 auf die Kopfzeile eines Commit, speichert es dessen Eckdaten wie den Autor des Patch, den Unix-Zeitstempel und die E-Mail-Adresse des ausführenden Committers in drei außerhalb der While-Schleife deklarierten Variablen.

Entdeckt Zeile 23 dann eine Zeile mit einem Dateivermerk (zum Beispiel »M Dateiname«), trennt sie das vorangehende Flag mittels eines regulären Ausdrucks ab und speichert den Namen der modifizierten Datei in »$file«. Die Methode »print()« des CPAN-Moduls Text::CSV in Zeile 25 reicht die durch Kommata getrennten Felder anschließend an die Ausgabedatei »perl-git-log.csv« weiter. Dort stehen dann zu jeder modifizierten Datei im Repository die Felder Autor, Committer und Zeitstempel.

Das CPAN-Modul Text::CSV (beziehungsweise die geschwindigkeitsoptimierte Version Text::CSV_XS) maskiert eventuell auftretende Sonderzeichen automatisch, damit das kommaseparierte Ausgabeformat intakt bleibt. Der Konstruktoraufruf in Zeile 9 setzt das Flag »binary«, damit sämtliche Ascii-Zeichen erlaubt sind. Die EOL-Option legt den Zeilentrenner im Ausgabeformat fest und erhält den Wert »$/« zugewiesen, also den in der jeweiligen Perl-Installation gültigen Zeilenumbruch.

Linux-Magazin kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Perl-Snapshot

    Der Projekthoster Github beherbergt nicht nur die Code-Repositories vieler bekannter Open-Source-Projekte, sondern bietet auch ein durchdachtes API an, mit dem sich in ihnen herrlich herumschnüffeln lässt.

  • Perl-Snapshot

    Ein neuer Service auf Travis-ci.org listet fein säuberlich Github-Projekte eines Entwicklers auf, schickt den Code bei jedem Push durch deren Testsuites und gibt Rückmeldung, falls der Build bricht. In den zurückgelieferten Testergebnissen machen neugierige Perl-Skripte Zusatzinformationen sichtbar.

  • Umzugshelfer

    Der Webdienst Github erleichtert es Programmierern, einen Beitrag zu Open-Source-Projekten zu leisten, denn er vereinfacht und beschleunigt die Kommunikation zwischen Projekt-Maintainern und willigen Mitwirkenden radikal. Perl-Modulen ebnet ein Skript den Weg von CVS zu Git.

  • Perl-Snapshot

    Github mit seiner einfach zu bedienende Weboberfläche lässt sich über seine Code-Archiv-Funktion hinaus für ganz und gar artfremde Dinge benutzen. Perlmeister Schilli zum Beispiel pflanzt mit Github ein Contentmanagement-System für einfache Webseiten in die Landschaft.

  • Perl-Snapshot

    Mit Clonezilla gehen Systembackups und Restores mit nur wenigen Tastendrücken elegant von der Hand. Eine selbst produzierte Lösung reduziert den Aufwand auf das Einlegen einer CD, auf die der Admin zuvor ein Perl-Skript gebrannt hat.

comments powered by Disqus

Ausgabe 07/2017

Digitale Ausgabe: Preis € 6,40
(inkl. 19% MwSt.)

Artikelserien und interessante Workshops aus dem Magazin können Sie hier als Bundle erwerben.