SelfLinux Programmierung CVS Werkzeuge von Drittanbietern, die mit CVS zusammen arbeiten Abschnitt 4 | SelfLinux-0.13.0

| Werkzeuge von Drittanbietern, die mit CVS zusammen arbeiten | Autor Formatierung GPL

#### 8 cvs2cl.pl: die Erzeugung von ChangeLogs im GNU-Stil aus CVS Logs

Benötigt: Perl

> URL: URL: http://www.red-bean.com/~kfogel/cvs2cl.shtml

Das Programm cvs2cl.pl dient zur Verdichtung und Umformatierung der Ausgabe von cvs log, damit daraus eine ChangeLog-Datei im GNU-Stil erzeugt werden kann. ChangeLogs sind chronologisch geordnete Dokumente, welche die Veränderungen eines Projektes über die Zeit in einem Format beinhalten, das speziell auf leichte Lesbarkeit durch den Benutzer ausgerichtet ist (siehe untenstehende Beispiele).

Das Problem mit dem Befehl cvs log ist, dass er seine Ausgabe dateiweise organisiert, ohne zu berücksichtigen, dass dieselbe Log-Mitteilung, wenn sie fast im selben Moment in diversen Dateien auftaucht, impliziert, dass alle betroffenen Dateien Bestandteil eines einzigen Commit waren. Daher ist die Betrachtung der cvs log-Ausgabe in der Absicht, einen Überblick über ein Projekt zu erhalten, von vornherein zum Scheitern verurteilt - man kann nur den Entwicklungshergang einzelner Dateien zuverlässig verfolgen.

In dem ChangeLog, das cvs2cl.pl produziert, werden identische Log-Mitteilungen zusammengefasst, sodass ein commit, der mehrere Dateien umfaßt, auch nur als einzelner Eintrag auftaucht. Zum Beispiel:

user@linux ~$ cvs3cl.pl
cvs log: logging .
cvs log: logging a-verzeichnis
cvs log: logging a-verzeichnis/unterverzeichnis
cvs log: logging b-verzeichnis
user@linux ~$ cat ChangeLog
...
1999-08-29 05:44 jrandom
*README (1.6), hello.c (2.1), a-verzeichnis/irgendwas.c (2.1),
a-verzeichnis/unterverzeichnis/fisch.c (2.1): Ich committe mit pcl-cvs 2.9, weil mir danach ist.
1999-08-23 22:48 jrandom
*README (1.5): [no log message]
1999-08-22 19:34 jrandom
*README (1.4): triviale Änderung
...
user@linux ~$

Der erste Eintrag zeigt, dass der Commit von vier Dateien auf einmal mit der Log-Mitteilung: Ich committe mit pcl-cvs 2.9, weil mir danach ist. vorgenommen wurde. (Die Option -r wurde benutzt, um die Revisionsnummer jeder Datei mit dem Log-Eintrag anzuzeigen.)

Wie CVS selbst, nimmt auch cvs2cl.pl das aktuelle Verzeichnis als implizites Argument, kann aber auch mit bestimmten Dateien arbeiten, wenn diese auf der Kommandozeile angegeben werden. Es folgen einige der am häufigsten benutzten Optionen.

-h, --help

> Zeigt eine kurze Hilfe zur Benutzung des Programms an.

-r, --revisions

> Listet Revisionsnummern in der Ausgabe mit auf (s.o.). In Verbindung mit der Option -b werden Entwicklungszweige als ZWEIGNAME.N gelistet, wobei N die Revision auf dem Zweig ist.

-t, --tags

> Listet symbolische Namen bei allen Revisionen, die welche besitzen, mit auf.

-b, --branches

> Listet den Namen des Entwicklungszweiges für alle Revisionen auf diesem Zweig mit auf (siehe auch -r).

-g OPTIONEN, --global-opts OPTIONEN

> Übergibt OPTIONEN als globale Argumente an cvs. Intern ruft cvs2cl.pl cvs auf, um die unformatierten Log-Daten zu erhalten; dabei werden OPTIONEN direkt hinter den cvs-Aufruf geschrieben. Um beispielsweise eine Beschränkung auf wichtige Meldungen und Kompression zu erreichen, kann man folgenden Aufruf verwenden:

user@linux ~$ cvs2cl.pl -g "-Q -z3"

-l OPTIONEN, --log-opts OPTIONEN

> Wie -g, nur dass die OPTIONEN hier als Befehlsoptionen, nicht global, übergeben werden. Um beispielsweise ein ChangeLog zu erzeugen, das nur Commits zwischen dem 26. Juli und dem 15. August anzeigt, könnten Sie folgenden Befehl verwenden:

user@linux ~$ cvs2cl.pl -l "'-d1999-07-26<1999-08-15'"

> Beachten Sie die doppelten Anführungszeichen - diese sind in Unix notwendig, da die Shell, die cvs log innerhalb von cvs2cl.pl aufruft, das <-Zeichen sonst als Zeichen zur Eingabeumleitung interpretieren würde. Daher müssen die Anführungszeichen als Teil des Arguments übergeben werden, was eine zweite Schicht von Anführungszeichen notwendig macht.

-d, --distributed

> Schreibe ein eigenes ChangeLog in jedes Unterverzeichnis, das nur die Commits in jenem Verzeichnis beinhaltet. (Im Gegensatz zur Erzeugung eines einzigen ChangeLogs, welches das aktuelle Verzeichnis und alle Unterverzeichnisse desselben beinhaltet.)