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

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

#### 9 cvslock: Sperren von Archiven

Benötigt: C-Compiler zur Installation; nichts Besonderes zur Laufzeit

> URL: ftp://riemann.iam.uni-bonn.de/pub/users/roessler/cvslock/

Operationen auf dem Archiv (egal ob über cvs oder direkt an seinen Dateien ausgeführte) geschehen normalerweise nicht atomar. Das Programm cvslock sperrt ein CVS-Archiv (für Lese- oder Schreibzugriff) in derselben Art, wie CVS das auch macht, sodass CVS die Sperrung beachtet. Das kann beispielsweise nützlich sein, wenn Sie eine Kopie des gesamten Archivs machen möchten, dabei aber vermeiden wollen, dass Sie eventuell gerade laufende Commit-Vorgänge nur teilweise mitbekommen oder die Lock-Dateien anderer Benutzer mit kopieren.

Das cvslock-Archiv ist sehr gut eingerichtet und kann wie jedes GNU-Programm installiert werden. Hier ist der Mitschnitt eines Installationsvorgangs:

user@linux ~$ zcat cvslock-0.1.tar.gz | tar xvf -
cvslock-0.1/
cvslock-0.1/Makefile.in
cvslock-0.1/README
cvslock-0.1/COPYING
cvslock-0.1/Makefile.am
cvslock-0.1/acconfig.h
cvslock-0.1/aclocal.m4
cvslock-0.1/config.h.in
cvslock-0.1/configure
cvslock-0.1/configure.in
cvslock-0.1/install-sh
cvslock-0.1/missing
cvslock-0.1/mkinstalldirs
cvslock-0.1/stamp-h.in
cvslock-0.1/cvslock.c
cvslock-0.1/cvslock.1
cvslock-0.1/snprintf.c
cvslock-0.1/cvslssh
cvslock-0.1/VERSION
user@linux ~$ cd cvslock-0.1
user@linux ~$ ./configure
...
user@linux ~$ make
gcc -DHAVE_CONFIG_H -I. -I. -I. -g -O2 -c cvslock.c
gcc -g -O2 -o cvslock cvslock.o
user@linux ~$ make install
...
user@linux ~$

(Beachten Sie, dass Sie den Befehl make install möglicherweise als Superuser (root) ausführen müssen.)

Nun ist cvslock als /usr/local/bin/cvslock installiert. Wenn Sie es aufrufen, können Sie das Archiv mit -d oder über die $CVSROOT-Umgebungsvariable angeben, genau wie bei CVS selbst auch (das folgende Beispiel nutzt -d ). Das einzige benötigte Argument ist der Name des Verzeichnisses, das gesperrt werden soll, relativ zum Hauptverzeichnis des Archivs. Dieses Verzeichnis und alle Unterverzeichnisse desselben werden dann gesperrt. In diesem Beispiel gibt es keine Unterverzeichnisse, daher wird nur eine Lock-Datei erzeugt:

user@linux ~$ ls /usr/local/archiv/projekt/b-verzeichnis/ random.c,v user@linux ~$ cvslock -d /usr/local/archiv projekt/b-verzeichnis user@linux ~$ ls /usr/local/archiv/projekt/b-verzeichnis/ #cvs.rfl.cvslock.floss.27378 random.c,v user@linux ~$ cvslock -u -p 27378 -d /usr/local/archiv projekt/b-verzeichnis user@linux ~$ ls /usr/local/archiv/projekt/b-verzeichnis/ random.c,v user@linux ~$

Beachten Sie, dass ich -p 27378 angeben musste, als ich (mittels -u für unlock) die Sperre wieder aufhob. Das kommt daher, dass cvslock Unix-Prozessnummern zur Namensvergabe bei der Sperrung verwendet, um sicherzustellen, dass die Namen der Lock-Dateien einzigartig sind. Wenn Sie die Sperre nun entfernen, müssen Sie cvslock (mittels der Option -p) mitteilen, welche Instanz Sie aufheben möchten, auch wenn nur eine existiert. (Sie können jedoch -p auch ohne -u verwenden.)

Wenn Sie vorhaben, eine Weile im Archiv zu arbeiten und einiges direkt im Dateisystem zu ändern, dann können Sie die Option -s verwenden, um sich von cvslock eine neue Shell starten zu lassen. In diesem Fall benutzt es die $SHELL-Umgebungsvariable in Ihrer aktuellen Shell, um herauszufinden, welche Shell verwendet werden soll:

user@linux ~$ cvslock -s -d /usr/local/archiv projekt

Die Sperre bleibt dann genau so lange bestehen, bis Sie die Shell verlassen, wonach sie automatisch aufgehoben wird. Sie können auch die -c-Option verwenden, um einen Befehl auszuführen, während das Archiv gesperrt ist. Genau wie bei -s werden zunächst die Lock-Dateien erzeugt, dann wird der Befehl ausgeführt und nach dessen Ende die Sperre wieder entfernt. Im folgenden Beispiel sperren wir das Archiv gerade lange genug, um eine Liste der Lock-Dateien anzeigen zu können:

user@linux ~$ cvslock -c 'find . -name "*cvslock*" -print' -d /usr/local/archiv projekt
cvslock: '/usr/local/archiv/projekt' locked successfully.
cvslock: starting'find . -name "*cvslock*" -print' ...
./a-verzeichnis/unterverzeichnis/#cvs.rfl.cvslock.floss.27452
./a-verzeichnis/#cvs.rfl.cvslock.floss.27452
./b-verzeichnis/#cvs.rfl.cvslock.floss.27452
./#cvs.rfl.cvslock.floss.27452
user@linux ~$ find /usr/local/archiv/projekt -name "*cvslock*" -print
user@linux ~$

Das Kommando (das Argument zur Option -c) wird mit dem angegebenen Archivverzeichnis als Arbeitsverzeichnis gestartet.

Normalerweise erzeugt cvslock eine Lesesperre. Wenn gegen Schreibzugriff gesperrt werden soll, dann geht das mit der Option -W. (Sie können für die Lesesperrung auch -R angeben, aber das ist ja sowieso standardmäßig aktiv.) Entfernen Sie immer alle Sperren, wenn Sie mit Ihrer Arbeit fertig sind, sodass andere CVS-Prozesse nicht unnötig warten müssen.

Beachten Sie, dass cvslock auf der Maschine laufen muss, auf der sich das Archiv befindet - es gibt keine Möglichkeit, ein externes Archiv anzugeben. (Weitere Informationen erhalten Sie mit dem Befehl man cvslock, wodurch eine Anleitung angezeigt wird, die beim make install für cvslock mit installiert wurde.)