

	\documentclass[a4paper,11pt]{article}
	\usepackage{ngerman}
	\usepackage[latin1]{inputenc}
	\setlength\parskip{\medskipamount}
	\setlength\parindent{0pt}
	\begin{document}

	
 % Werkzeuge_von_Drittanbietern
 % Copyright 
 % Lizenz: GPL
 % 
 % $Name: $
 % $Revision: 1.1.2.8 $
 % $Source: /cvsroot/selflinux/tutorial/software/development/version_control/cvs/cvs_buch/kapitel_10/kapitel_10,v $
 % SelfLinux-0.7.2
 %
 % Diese Datei ist Teil von SelfLinux http://www.selflinux.de
 %
 %%% $Id: kapitel_10,v 1.1.2.8 2003/04/19 22:02:33 motw_1 Exp $

	\title{Werkzeuge von Drittanbietern, die mit CVS zusammen arbeiten}


	
	    \author{}
	    %\url{mailto:}
    

	\maketitle

	
	
	%\ref{../index.tex}
	
		%\ref{programmierung.tex}
		Programmierung
		%\ref{cvs.tex}
		CVS
	\ref{Werkzeuge_von_Drittanbietern}

    \par{Layout}
    Matthias Hagedorn
	    %\url{mailto:herbert-kw@t-online.de}
    
    	\par{Lizenz}
	GPL
 
	\tableofcontents{}

        
	\section{Was sind Werkzeuge von Drittanbietern?} \label{d79e56}
        

   

   
  \par
  
Viele Leute haben Programme geschrieben, die den Funktionsumfang von
CVS erweitern. Ich nenne diese {\bf Werkzeuge von Drittanbietern}, da sie
auch separat zur CVS-Entwicklung verwaltet werden. Die meisten dieser
Programme werden nicht zusammen mit CVS verbreitet, einige allerdings
schon. Dieses Kapitel behandelt Werkzeuge von Drittanbietern, die ich
nützlich finde, die aber nicht mit CVS vertrieben werden.
   

   
  \par
  
Obwohl es einige sehr populäre und weit verbreitete
Bedienungsoberflächen für CVS gibt, die nicht für die Kommandozeile
oder nicht für Unix sind (Download-Adressen sind in Kapitel 4
aufgelistet), behandelt dieses Kapitel die meisten von ihnen nicht.
Ihre Popularität macht es einfach, mehr über sie in Newsgruppen und
Mailinglisten zu erfahren. Eine Ausnahme ist das {\bf Emacs
pcl-cvs-Interface}, das sehr nützlich, aber oft nicht einfach zu
installieren ist. Damit fangen wir an.
   
  \section{pcl-cvs: eine Emacs-Bedienungsoberfläche für CVS} \label{d79e79}
        

   


   
  \par
  
Benötigt: Emacs, Elib
   


   
  \par
  

   
URLs:
   
ftp://rum.cs.yale.edu/pub/monnier/pcl-cvs/
ftp://ftp.lysator.liu.se/pub/emacs/pcl-cvs-1.05.tar.gz
ftp://ftp.red-bean.com/pub/kfogel/pcl-cvs-1.05.tar.gz
   

   
  \par
  
Autoren: Per Cederqvist und Stefan Monnier (derzeitige Betreuung)
   

   
  \par
  
{\bf Pcl-cvs} ist eine von zwei Emacs/CVS-Bedienungsoberflächen. Die andere
ist die {\bf native VC}-(Version Control-)Oberfläche, die in Emacs
eingebaut ist. Ich bevorzuge {\bf pcl-cvs}, weil es speziell für CVS
geschrieben wurde und daher sehr angenehm mit der Art harmoniert, in
der CVS arbeitet. VC andererseits wurde entwickelt, um mit mehreren
unterschiedlichen Versionskontrollsystemen zusammenzuarbeiten - RCS
und SCCS genau wie CVS -, und ist daher nicht wirklich optimal auf CVS
abgestimmt. Zum Beispiel präsentiert VC eine dateibasierte anstatt
einer verzeichnisbasierten Oberfläche zur Revisionskontrolle.
   

   
  \par
  
Die Vorteile von {\bf pcl-cvs} wiegen stark genug, um viele Benutzer zum
Download und zur Installation zu bewegen, anstatt VC zu benutzen.
Unglücklicherweise hat {\bf pcl-cvs} zwei Nachteile: Es kann etwas
problematisch in der Installation sein (ein Großteil dieses Abschnitts
befasst sich mit möglichen Installationshürden), und seine neuen
Versionen laufen etwas instabil.
   

   
  \par
  
Das letzte Problem ist wahrscheinlich eher temporärer Natur, es stellt
sich jedoch die Frage, welche Version zu benutzen ist. Stefan Monnier
hat erst kürzlich die Betreuung des {\bf pcl-cvs} übernommen; die neueste
Version, 2.9.6 (erhältlich vom ersten URL in der obigen Liste), lief
ein bisschen holprig, als ich sie ausprobierte. Zweifellos werden die
Probleme binnen kurzem ausgebügelt sein, aber in der Zwischenzeit
möchten Sie möglicherweise eine etwas ältere Version benutzen. Da ich
Version 1.0.5 lange Zeit täglich benutzt habe, wobei sie sich sehr gut
verhielt, werde ich diese Version hier dokumentieren. Glücklicherweise
ändert sich an der Installation von Version zu Version nicht allzu
viel. Falls Sie sich also dazu entschließen, {\bf pcl-cvs} zu benutzen, so
schlage ich vor, dass Sie auf Stefan Monniers Seite nach einer neueren
Version als 2.9.6 schauen; falls es eine gibt, versuchen Sie die,
bevor Sie ganz auf 1.0.5 zurückgehen.
   

   
  \par
  
Sie werden feststellen, dass ich zwei URLs für Version 1.0.5 angegeben
habe. Die erste ist Per Cederqvists Site, wo er ein Archiv alter
{\bf pcl-cvs}-Versionen unterhält. Da ich nicht sicher bin, wie lange dieses
Archiv noch Bestand haben wird, mache ich außerdem die Version 1.05
auf ftp.red-bean.com verfügbar.
   

   
  \par
  
Obwohl der Rest dieser Anweisungen Beispiele aus einer
1.05-Distribution verwendet, sollten diese ebenfalls problemlos auf
neuere Versionen anwendbar sein.
   
  \section{Installation von pcl-cvs} \label{d79e165}
        

   


   
  \par
  
Falls Sie sich normalerweise nicht mit Problemen der
Emacs-Installation und -Instandhaltung beschäftigen, könnte Ihnen die
{\bf pcl-cvs}-Installationsprozedur etwas entmutigend erscheinen. Ein paar
Hintergrundinformationen zur Arbeitsweise von Emacs hilft dem
vielleicht etwas ab.
   

   
  \par
  
Die meisten abstrakteren Funktionen von Emacs sind in einer
Programmiersprache namens {\bf Emacs Lisp} geschrieben (Emacs selbst ist
praktisch ein Interpreter für diese Programmiersprache). Die Leute
fügen Emacs neue Funktionen hinzu, indem sie Dateien mit Emacs
Lisp-Programmcode verbreiten. {\bf Pcl-cvs} ist in dieser Programmiersprache
geschrieben und benötigt eine Sammlung (Bibliothek) nützlicher
allgemeiner Emacs Lisp-Funktionen namens {\bf Elib} (auch von Per
Cederqvist geschrieben, wird aber nicht zusammen mit {\bf pcl-cvs}
verbreitet), um zu funktionieren.
   

   
  \par
  
Elib ist in der normalen Emacs-Distribution nicht enthalten (zumindest
nicht im FSF Emacs; bei XEmacs weiß ich es nicht), sodass Sie Elib
zunächst selber herunterladen und installieren müssen, bevor Sie
{\bf pcl-cvs} nutzen können. Sie können es von
ftp://ftp.lysator.liu.se/pub/emacs/elib-1.0.tar.gz bekommen.
Installationsanweisungen sind in dem Archiv enthalten.
   

   
  \par
  
Wenn Elib installiert ist, sind Sie in der Lage, {\bf pcl-cvs} einzurichten.
Die folgenden Anweisungen sind gleichermaßen für Version 1.05 und 2.x
gültig (auch wenn Sie in den {\bf NEWS}- und {\bf INSTALL}-Dateien in neuen
Distributionen nachschauen sollten, ob sich etwas geändert hat).
   

   
  \par
  
Entpacken Sie zunächst {\bf pcl-cvs}. (Ich benutze Version 1.05, es könnte
aber genauso gut 2.9.6 sein.)
   

   
    \begin{tt} \begin{scriptsize} user@linux \~{}/ \$ 
zcat pcl-cvs-1.05.tar.gz | tar xvf -
     \end{scriptsize} \end{tt} \linebreak 
    \begin{tt} \begin{scriptsize} pcl-cvs-1.05/\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} pcl-cvs-1.05/README\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} pcl-cvs-1.05/NEWS\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} pcl-cvs-1.05/INSTALL\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} pcl-cvs-1.05/ChangeLog\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} pcl-cvs-1.05/pcl-cvs.el\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} pcl-cvs-1.05/pcl-cvs.texinfo\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} pcl-cvs-1.05/compile-all.el\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} pcl-cvs-1.05/pcl-cvs-lucid.el\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} pcl-cvs-1.05/pcl-cvs-startup.el\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} pcl-cvs-1.05/pcl-cvs.info\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} pcl-cvs-1.05/Makefile\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} pcl-cvs-1.05/texinfo.tex\end{scriptsize} \end{tt} \linebreak
   

   
  \par
  
und gehen Sie dann in das Hauptverzeichnis des Quelltextes:
   
   
    \begin{tt} \begin{scriptsize} user@linux \~{}/ \$ 
cd pcl-cvs-1.05/
     \end{scriptsize} \end{tt} \linebreak 
   

   
  \par
  
In diesem Verzeichnis ist ein Makefile. Entsprechend der Anweisungen
in der {\bf INSTALL}-Datei müssen Sie nun einige Dateipfade am Anfang des
Makefile anpassen und dann eingeben:
   

   
    \begin{tt} \begin{scriptsize} user@linux \~{}/ \$ 
make install
     \end{scriptsize} \end{tt} \linebreak 
   

   
  \par
  
Wenn das funktioniert, toll! Allerdings gibt es manchmal auch eine
Fehlermeldung. (Der {\bf pcl-cvs}-Programmcode ist sehr portabel, die
Installationsprozeduren sind es aber manchmal nicht!) Machen Sie
Solgendes, wenn Sie eine Fehlermeldung erhalten:
   

   
    \begin{tt} \begin{scriptsize} user@linux \~{}/ \$ 
make clean
     \end{scriptsize} \end{tt} \linebreak 
    \begin{tt} \begin{scriptsize} user@linux \~{}/ \$ 
make
     \end{scriptsize} \end{tt} \linebreak 
   

   
  \par
  
Wenn bis dahin alles gut geht, dann haben diese beiden Kommandos einen
beträchtlichen Teil der Installation bereits erledigt, indem sie alle
nötigen Emacs Lisp-Dateien byte-kompiliert haben. (Byte-Compiling
verwandelt eine Datei mit lesbarem Emacs Lisp-Programmcode - eine
{\bf .el}-Datei - in eine kompaktere und effizientere Repräsentation - eine
{\bf .elc}-Datei. Emacs kann {\bf .elc}-Dateien effizienter laden und ausführen
als {\bf .el}-Dateien.)
   

   
  \par
  
Ich fahre nun fort, in der Annahme, dass das mit dem Byte-Compiling
geklappt hat. Sollte das nicht der Fall sein, keine Panik: Die
{\bf .elc}-Dateien sind ein Luxus, keine Notwendigkeit. Sie verbessern die
Leistung ein wenig, aber {\bf pcl-cvs} kann problemlos mit den normalen
{\bf .el}-Dateien laufen.
   

   
  \par
  
Falls das {\bf make install} fehlgeschlagen ist, ist der nächste Schritt
der, die Emacs Lisp-Dateien ({\bf .elc} oder {\bf .el}) in ein Verzeichnis zu
packen, aus dem Emacs sie automatisch laden kann. Emacs hat ein
spezielles Verzeichnis auf Ihrem System für solche lokal installierten
Lisp-Dateien. Um dieses Verzeichnis zu finden - es enthält eine Datei
namens {\bf default.el} -, suchen Sie an den folgenden Orten in dieser
Reihenfolge:
   

   \begin{list}{*}{}
    
	\item 
{\bf /usr/share/emacs/site/lisp/}
    
    
	\item 
{\bf /usr/local/share/emacs/site-lisp/}
    
    
	\item 
{\bf /usr/lib/emacs/site-lisp/}
    
    
	\item 
{\bf /usr/local/lib/emacs/site-lisp/}
    
   \end{list}

   
  \par
  
Wenn Sie Ihr {\bf site-lisp}-Verzeichnis gefunden haben, kopieren Sie alle
Lisp-Dateien dort hinein (dafür müssen Sie möglicherweise Superuser
(root) sein):
   

   
    \begin{tt} \begin{scriptsize} user@linux \~{}/ \$ 
cp -f *.el *.elc /usr/share/emacs/site-lisp/
     \end{scriptsize} \end{tt} \linebreak 
   

   
  \par
  
Im letzten Schritt muss nun Emacs mitgeteilt werden, wo sich die
Eintrittspunkte zu den {\bf pcl-cvs}-Funktionen befinden (wobei der
Haupteintrittspunkt {\bf cvs-update} ist), sodass Emacs weiß, wie es bei
Bedarf den {\bf pcl-cvs}-Code laden muss. Da Emacs grundsätzlich die Datei
{\bf default.el} liest, wenn er startet, müssen dort die Eintrittspunkte
aufgelistet werden.
   

   
  \par
  
Glücklicherweise liegt bei {\bf pcl-cvs} die für {\bf default.el} notwendige Liste
schon bei. Kopieren Sie also einfach den Inhalt von {\bf pcl-cvs-startup.el}
in die Datei {\bf default.el} hinein (oder in Ihre {\bf .emacs}-Datei, falls Sie
die Installation nur für sich selbst vornehmen), und starten Sie Ihren
Emacs neu.
   

   
  \par
  
Am besten kopieren Sie auch die {\bf .info}-Dateien in Ihr Info-Verzeichnis,
und fügen Sie {\bf pcl-cvs} dem Inhaltsverzeichnis in der Datei dir hinzu.
   
  \section{Benutzung von pcl-cvs} \label{d79e428}
        

   


   
  \par
  
Wenn es erst einmal installiert ist, ist {\bf pcl-cvs} ganz einfach zu
benutzen. Sie starten einfach die Funktion {\bf cvs-update}, und {\bf pcl-cvs}
erzeugt eine Liste mit den Dateien, die in Ihrer Arbeitskopie
verändert oder aktualisiert wurden. Von dieser Liste aus können Sie
dann {\bf Commits} durchführen, diffs machen und so weiter.
   

   
  \par
  
Da {\bf cvs-update} der Haupteintrittspunkt ist, schlage ich vor, dass Sie
ihn an eine einfach zu merkende Tastenkombination binden, bevor Sie
weitermachen. Ich habe ihn in meiner {\bf .emacs}-Datei an die
Tastenkombination
    Ctrl+c
    v
gebunden:
   

   
{\bf (global-set-key ''$\backslash$C-cv'' 'cvs-update)}
   

   
  \par
  
Sie können die Funktion aber auch einfach starten, indem Sie
    M+x
    cvs-update
eingeben (auch bekannt als
    Esc+x
    cvs update
.
   

   
  \par
  
Wenn es gestartet wurde, lässt {\bf cvs-update} {\bf cvs update} laufen, als ob es
in dem Verzeichnis gestartet worden wäre, in dem sich die gerade in
Emacs geladene Datei befindet - so, als hätten Sie dort auf der
Kommandozeile {\bf cvs update} eingegeben. Hier ist ein Beispiel für das,
was Sie dann in Emacs sehen könnten:
   

   \begin{tabular}{|l|}
                  \hline
                  \begin{tt} 
        
Beispiel
    \end{tt} \\ 
                  \hline
                  \begin{minipage}{130mm} 
                  \begin{scriptsize} 
                  \begin{verbatim} 
        
    
PCL-CVS release 1.05 from CVS release &#36;Name: &#36;.
Copyright (C) 1992, 1993 Per Cederqvist
Pcl-cvs comes with absolutely no warranty; for details consult the manual.
This is free software, and you are welcome to redistribute it under certain
conditions; again, consult the TeXinfo manual for details.
Modified ci README.txt
Modified ci fish.c
---------- End ----
     
    \end{verbatim} 
                  \end{scriptsize} 
                  \end{minipage} \\
                  \hline
                  \end{tabular}

   
  \par
  
Zwei Dateien sind lokal verändert worden. (Manche Versionen von
{\bf pcl-cvs} zeigen die Unterverzeichnisse der Dateien mit an.) Der nächste
logische Schritt ist nun, den {\bf Commit} einer oder beider Dateien
vorzunehmen, was durch die Buchstaben {\bf ci} auf jeder der beiden Zeilen
angezeigt wird. Für den {\bf Commit} einer Datei bewegen Sie einfach den
Cursor auf deren Zeile, und drücken {\bf c}. Es öffnet sich dann ein
Buffer, in den Sie eine Log-Mitteilung beliebiger Länge eingeben
können (echtes Bearbeiten von Log-Mitteilungen ist der Hauptvorteil
von {\bf pcl-cvs} gegenüber der Kommandozeile). Wenn die Mitteilung
geschrieben ist, drücken Sie
    Ctrl+c
    Ctrl+c
, um den {\bf Commit}
durchzuführen.
   

   
  \par
  
Wenn sich der {\bf Commit} auf mehrere Dateien, die sich eine Log-Mitteilung
teilen, auswirken soll, dann markieren Sie zunächst die gewünschten
Dateien mit der Taste {\bf m}. Ein Sternchen erscheint neben jeder
markierten Datei:
   

   \begin{tabular}{|l|}
                  \hline
                  \begin{tt} 
        
Beispiel
    \end{tt} \\ 
                  \hline
                  \begin{minipage}{130mm} 
                  \begin{scriptsize} 
                  \begin{verbatim} 
        
    
PCL-CVS release 1.05 from CVS release &#36;Name: &#36;.
Copyright (C) 1992, 1993 Per Cederqvist
Pcl-cvs comes with absolutely no warranty; for details consult the manual.
This is free software, and you are welcome to redistribute it under certain
conditions; again, consult the TeXinfo manual for details.
* Modified ci README.txt
* Modified ci fish.c
---------- End ----
     
    \end{verbatim} 
                  \end{scriptsize} 
                  \end{minipage} \\
                  \hline
                  \end{tabular}

   
  \par
  
Wenn Sie nun irgendwo {\bf c} eingeben, dann sind davon alle (und nur die)
markierten Dateien betroffen. Schreiben Sie die Log-Mitteilung, und
übermitteln Sie die Daten wie gehabt mit
    Ctrl+c
    Ctrl+c
.
   

   
  \par
  
Sie können auch {\bf d} drücken, um {\bf cvs diff} mit einer Datei (oder mehreren
markierten Dateien) zu starten, und {\bf f}, um eine Datei in Emacs zu
bearbeiten. Es sind noch andere Kommandos möglich; drücken Sie
    Ctrl+h
    m
im Buffer mit der Dateiliste, um zu sehen, was sonst noch geht.
   
  \section{Fehlerbehandlung in pcl-cvs} \label{d79e646}
        

   


   
  \par
  
Das Programm {\bf pcl-cvs} hatte schon immer eine etwas ungeschickte Art,
mit Fehlermeldungen und Informationen von CVS umzugehen (auch wenn das
möglicherweise in aktuelleren Versionen verbessert wurde). Wenn es auf
eine Nachricht von CVS stößt, die es nicht kennt, wird es hysterisch,
und Sie landen in einem Mail-Buffer, vorbereitet, um einen Bug-Report
an den Autor von {\bf pcl-cvs} abzuschicken. Dummerweise sind aber unter den
CVS-Nachrichten, die {\bf pcl-cvs} möglicherweise nicht erkennt, auch
solche, die bei einer problematischen Integration (Merge) von
Quelltext entstehen, was zwar selten, aber doch immer mal wieder
vorkommt.
   

   
  \par
  
Falls {\bf pcl-cvs} Sie also plötzlich in einen Mail-Buffer umschaltet -
keine Panik. Lesen Sie den vorbereiteten Text der E-Mail sorgfältig
durch - die problematische CVS-Ausgabe sollte da irgendwo drin stehen.
Wenn es aussieht wie ein fehlgeschlagenes merge, dann verwerfen Sie
die E-Mail einfach, und starten Sie erneut {\bf cvs-update}. Diesmal sollte
es keine Probleme mehr geben, da die Integration des problematischen
Quelltexts bereits stattgefunden hat.
   
  \section{Die Zukunft von pcl-cvs} \label{d79e675}
        

   


   
  \par
  
Auch wenn ich den Eindruck erweckt haben mag, dass {\bf pcl-cvs} kaum
weiterentwickelt wird und eine riskante Investition sein könnte,
scheint mir die Instabilität eine zeitweilige Erscheinung zu sein.
Stefan Monnier reagiert sehr schnell auf Anfragen. (Ich schrieb ihn
mehrfach an, während ich dieses Kapitel verfaßte, und erhielt immer
sofort eine Antwort; er kümmert sich bereits um mehrere Fehler in der
Version 2.9.6.) Sehr wahrscheinlich werden Sie zu dem Zeitpunkt, zu
dem dieses Buch erschienen ist, bereits eine stabile Version 2.9.7
oder höher herunterladen können. [Anm.d.Übers.: 2.9.8 ist da.]
   

   
  \par
  
Ich habe sogar eine ermutigende E-Mail zu diesem Thema von Greg Woods
erhalten, einem früheren Betreuer von {\bf pcl-cvs}, die ich hier
wiedergeben möchte:
   

   \begin{tabular}{|l|}
                  \hline
                  \begin{tt} 
        
E-Mail
    \end{tt} \\ 
                  \hline
                  \begin{minipage}{130mm} 
                  \begin{scriptsize} 
                  \begin{verbatim} 
        
    
From: woods@most.weird.com (Greg A. Woods)
Subject: Re: Status der pcl-cvs Betreuung, Stabilität der neueren Versionen?
To: kfogel@read-bean.com
Date: Sun, 29 Aug. 1999 18:59:19 -0400 (EDT)
[...]

Ich habe Stefans Versionen inzwischen einige Zeit benutzt und
tatsächlich meinen eigenen Entwicklungszweig aufgegeben.

Er hat eine Menge wirklich gute Arbeit in PCL-CVS gesteckt, und
abgesehen von einigen wenigen Merkwürdigkeiten in Version 2.9.6, die
ich inzwischen täglich nutze, ist es wirklich benutzbar (und es ist so
unendlich viel benutzbarer mit aktuellen CVS-Versionen als die
Version, die in der CVS-Distribution enthalten war! ;-).

Ich habe eine Datei pcl-cvs.README auf meinem ftp-Server abgelegt, in
der steht, dass die Dateien wirklich ziemlich alt sind (zumindest nach
Internet-Zeit ;-), und einen Verweis auf Stefans ftp-Server angegeben.
[...]
     
    \end{verbatim} 
                  \end{scriptsize} 
                  \end{minipage} \\
                  \hline
                  \end{tabular}

   
  \par
  
In einer späteren E-Mail sagte Greg, dass die FSF erwägt, {\bf pcl-cvs} in
ihre nächsten Ausgabe von Emacs (20.5) als Bestandteil zu integrieren,
was den größten Teil der oben stehenden Installationshilfen
überflüssig machen würde. Seufz. Manchmal ist es wirklich schwierig,
mit der Entwicklung freier Software Schritt zu halten.
   
  \section{cvsutils: allgemeine Werkzeuge zur Nutzung mit CVS} \label{d79e722}
        

   


   
  \par
  
Benötigt: Perl
   

   
  \par
  
URLs:
   

   
 http://www.typhoon.spb.ru/\~{}proski/cvsu/
ftp://ftp.red-bean.com/pub/kfogel/cvsu-0.1.4.tar.gz
   

   
  \par
  
Autoren: Tom Tromey (ursprünglicher Autor) und Pavel Roskin
(momentaner Betreuer)
   

   
  \par
  
Die Sammlung kleiner Programme namens {\bf cvsutils} arbeitet meist (aber
nicht immer) ohne aktive Verbindung in der CVS-Arbeitskopie.
Arbeitsgänge ohne aktive Verbindung werden ohne Kontakt zum Archiv
durchgeführt, belassen die Arbeitskopie jedoch in einem Zustand, der
jederzeit einen problemlosen späteren Kontakt zum Archiv
gewährleistet. Dieses Verhalten kann sehr praktisch sein, wenn Ihre
Netzwerkverbindung sehr langsam oder unzuverlässig ist.
   

   
  \par
  
Die Datei README der Version 0.1.4 enthält folgenden Text:
   

   
  \par
  
Die Homepage von CVSU ist

   

   
http://www.typhoon.spb.ru/\~{}proski/cvsu/
   

   
  \par
  
Diese Adresse wird sich Ende 1999 ändern.
   

   
  \par
  
Ich habe eine Kopie der {\bf cvsutils} auf dem red-bean.com FTP-Server
abgelegt, wie oben angegeben. Wenn eine neue Homepage für {\bf cvsutils}
bekannt wird, werde ich sie dort auch angeben.
   

   
  \par
  
Die {\bf cvsutils}-Programme habe ich unten in der (meiner Meinung nach)
ungefähren Reihenfolge ihrer Nützlichkeit aufgelistet, die
nützlichsten zuerst. Zufällig entspricht diese Reihenfolge auch der
Reihenfolge der Sicherheit der Programme. Sicherheit ist hier ein
Thema, denn einige der Programme können durch ihren normalen
Ablauf den Verlust lokaler Veränderungen oder Dateien in Ihrer Arbeitskopie
bewirken. Lesen Sie daher zunächst sorgfältig die Beschreibungen
durch, bevor Sie diese Werkzeuge benutzen.
   

   
  \par
  
Bemerkung:
   

   
Diese Dokumentation ist auf dem Stand von Version 0.1.4. Lesen Sie
sicherheitshalber die Datei README in neueren Versionen, um die
aktuellsten Informationen zu erhalten.
   

   
  \par
  
{\bf {\bf cvsu}}
   

   
  \par
  
Gefahr: Keine \linebreak 
Kontakt zum Archiv: Nein
   

   
  \par
  
Dieses Werkzeug führt ein simuliertes {\bf cvs update} ohne Kontakt zum
Archiv durch, indem es die Zeitstempel aller Dateien mit den
Aufzeichnungen in {\bf CVS/Entries} vergleicht. So können Sie feststellen,
welche Dateien lokal verändert wurden und welche nicht von CVS erfasst
sind. Anders als {\bf cvs update} aktualisiert {\bf cvsu} Ihre Dateien nicht aus
dem Archiv.
   

   
  \par
  
Obwohl es diverse Optionen versteht, wird {\bf cvsu} meistens ohne jegliche
Option gestartet:
   

   
    \begin{tt} \begin{scriptsize} user@linux \~{}/ \$ 
cvsu
     \end{scriptsize} \end{tt} \linebreak 
    \begin{tt} \begin{scriptsize} ? ./bar\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} ? ./chapter-10.html\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} M ./chapter-10.sgml\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} D ./out\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} ? ./safe.sh\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} D ./tools\end{scriptsize} \end{tt} \linebreak
   

   
  \par
  
Die Kürzel auf der linken Seite entsprechen denen von {\bf cvs update},
außer dass {\bf D} hier ein Verzeichnis symbolisiert. Dieses Beispiel zeigt
leider nicht, wie {\bf cvsu} sofort durchlief, wohingegen ein normales {\bf cvs
update} bei meiner lahmen Modemverbindung eine halbe Minute oder so
gebraucht hätte.
   

   
  \par
  
Geben Sie
   

   
    \begin{tt} \begin{scriptsize} user@linux \~{}/ \$ 
cvsu --help
     \end{scriptsize} \end{tt} \linebreak 
   

   
  \par
  
ein, um eine Liste möglicher Optionen zu erhalten.
   


   
  \par
  
{\bf {\bf cvsdo}}
   

   
  \par
  
Gefahr: Sehr gering \linebreak 
Kontakt zum Archiv: Nein
   

   
  \par
  
Dieser Befehl kann die Effekte von {\bf cvs add} und {\bf cvs remove} auf die
Arbeitskopie simulieren, ohne dabei eine Verbindung zum Archiv
aufzubauen. Natürlich müssten Sie dann noch immer die Änderungen per
{\bf commit} übermitteln, damit sie auch im Archiv gültig werden, aber
wenigstens die Kommandos {\bf add} und {\bf remove} selbst können dadurch
beschleunigt werden. Und so wird es benutzt:
   

   
    \begin{tt} \begin{scriptsize} user@linux \~{}/ \$ 
cvsdo add DATEINAME
     \end{scriptsize} \end{tt} \linebreak 
   

   
  \par
  
oder
   

   
    \begin{tt} \begin{scriptsize} user@linux \~{}/ \$ 
cvsdo remove DATEINAME
     \end{scriptsize} \end{tt} \linebreak 
   

   
  \par
  
Um eine Liste weiterer möglicher Optionen zu bekommen, benutzen Sie:
   

   
    \begin{tt} \begin{scriptsize} user@linux \~{}/ \$ 
cvsdo --help
     \end{scriptsize} \end{tt} \linebreak 
   


   
  \par
  
{\bf {\bf cvschroot}}
   

   
  \par
  
Gefahr: Gering \linebreak 
Kontakt zum Archiv: Nein
   

   
  \par
  
Dieses Werkzeug kann die Arbeitskopie auf ein neues Archiv umstellen,
falls das Archiv auf einen anderen Server umziehen sollte. Wenn dieser
Fall eintritt, dann ändert sich keine der Revisionen, aber alle
Arbeitskopien müssen ihre {\bf CVS/Root}-(und möglicherweise
{\bf CVS/Repository}-)Dateien aktualisieren, damit sie den neuen Standort
des Archivs beinhalten. Die Benutzung von {\bf cvschroot} ist viel schneller
als ein komplett neuer {\bf Checkout}. Ein weiterer Vorteil ist, dass Sie
lokale Änderungen nicht verlieren. Benutzung:
   

   
    \begin{tt} \begin{scriptsize} user@linux \~{}/ \$ 
cvschroot NEUES\_ARCHIV
     \end{scriptsize} \end{tt} \linebreak 
   

   
  \par
  
Zum Beispiel:
   

   
    \begin{tt} \begin{scriptsize} user@linux \~{}/ \$ 
cvschroot
     \end{scriptsize} \end{tt} \linebreak 
    \begin{tt} \begin{scriptsize} :pserver:benutzer@neues.archiv.wo.auch.immer.com:/home/cvs/projekt\end{scriptsize} \end{tt} \linebreak
   

   
  \par
  
{\bf {\bf cvsrmadm}}
   

   
  \par
  
Gefahr: Mäßig \linebreak 
Kontakt zum Archiv: Nein
   

   
  \par
  
Entfernt alle {\bf CVS/}-Verwaltungsverzeichnisse in Ihrer Arbeitskopie und
hinterlässt einen Dateibaum, der dem gleicht, der durch {\bf cvs export}
erzeugt würde. Auch wenn Sie durch diesen Befehl keine lokalen
Änderungen verlieren, wird Ihre Arbeitskopie anschließend keine
CVS-Arbeitskopie mehr sein.
   

   
  \par
  
Mit Bedacht verwenden!
   


   
  \par
  
{\bf {\bf cvspurge}}
   

   
  \par
  
Gefahr: Mittel \linebreak 
Kontakt zum Archiv: Nein
   

   
  \par
  
Dieser Befehl löscht alle nicht von CVS kontrollierten Dateien aus
Ihrer Arbeitskopie. Es nimmt keine lokalen Änderungen an von CVS
kontrollierten Dateien zurück.
   

   
  \par
  
Mit Bedacht verwenden!
   


   
  \par
  
{\bf {\bf cvsdiscard}}
   

   
  \par
  
Gefahr: Recht beträchtlich \linebreak 
Kontakt zum Archiv: Unter Umständen
   

   
  \par
  
Dies ist das Gegenstück zu {\bf cvspurge}. Anstatt unbekannte Dateien unter
Beibehaltung lokaler Änderungen zu löschen, verwirft es alle lokalen
Änderungen und behält unbekannte Dateien bei.
   

   
  \par
  
Mit extremer Vorsicht verwenden!
   


   
  \par
  
{\bf {\bf cvsco}}
   

   
  \par
  
Gefahr: Groß \linebreak 
Kontakt zum Archiv: Unter Umständen
   

   
  \par
  
Macht dasselbe wie {\bf cvspurge} und {\bf cvsdiscard} zusammen! Es löscht alle
nicht von CVS kontrollierten Dateien aus Ihrer Arbeitskopie und
verwirft alle lokalen Änderungen.
   

   
  \par
  
Nur mit wirklich paranoider Vorsicht anwenden!
   


   
  \par
  
{\bf {\bf cvsdate}}
   

   
  \par
  
Dieses Programm ist scheinbar unvollständig und wird möglicherweise
niemals fertig gestellt. (Siehe die Datei README für Details.)
   
  \section{cvs2cl.pl: die Erzeugung von ChangeLogs im GNU-Stil aus CVS Logs} \label{d79e1082}
        

   


   
  \par
  
Benötigt: Perl
   

   
URL: URL: http://www.red-bean.com/\~{}kfogel/cvs2cl.shtml
   

   
  \par
  
Das Programm {\bf cvs2cl.pl} dient zur Verdichtung und Umformatierung der
Ausgabe von {\bf cvs log}, damit daraus eine {\bf 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).
   

   
  \par
  
Das Problem mit dem Befehl {\bf 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 {\bf Commit} waren. Daher ist die Betrachtung der {\bf 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.
   

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

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

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

   
  \par
  
Wie CVS selbst, nimmt auch {\bf 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.
   

   
  \par
  
{\bf -h, --help}
   

   
Zeigt eine kurze Hilfe zur Benutzung des Programms an.
   

   
  \par
  
{\bf -r, --revisions}
   

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

   
  \par
  
{\bf -t, --tags}
   

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

   
  \par
  
{\bf -b, --branches}
   

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

   
  \par
  
{\bf -g OPTIONEN, --global-opts OPTIONEN}
   

   
Übergibt OPTIONEN als globale Argumente an cvs. Intern ruft {\bf 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:
   

   
    \begin{tt} \begin{scriptsize} user@linux \~{}/ \$ 
cvs2cl.pl -g ''-Q -z3''
     \end{scriptsize} \end{tt} \linebreak 
   

   
  \par
  
{\bf -l OPTIONEN, --log-opts OPTIONEN}
   

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

   
    \begin{tt} \begin{scriptsize} user@linux \~{}/ \$ 
cvs2cl.pl -l '''-d1999-07-26\verb+<+1999-08-15'''
     \end{scriptsize} \end{tt} \linebreak 
   

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

   
  \par
  
{\bf -d, --distributed}
   

   
Schreibe ein eigenes {\bf ChangeLog} in jedes Unterverzeichnis, das nur die
{\bf Commits} in jenem Verzeichnis beinhaltet. (Im Gegensatz zur Erzeugung
eines einzigen {\bf ChangeLogs}, welches das aktuelle Verzeichnis und alle
Unterverzeichnisse desselben beinhaltet.)
   
  \section{cvslock: Sperren von Archiven} \label{d79e1330}
        

   


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

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

   
  \par
  
Operationen auf dem Archiv (egal ob über cvs oder direkt an seinen
Dateien ausgeführte) geschehen normalerweise nicht atomar. Das
Programm {\bf 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 {\bf Commit}-Vorgänge nur teilweise
mitbekommen oder die {\bf Lock}-Dateien anderer Benutzer mit kopieren.
   

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

   
    \begin{tt} \begin{scriptsize} user@linux \~{}/ \$ 
zcat cvslock-0.1.tar.gz | tar xvf -
     \end{scriptsize} \end{tt} \linebreak 
    \begin{tt} \begin{scriptsize} cvslock-0.1/\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} cvslock-0.1/Makefile.in\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} cvslock-0.1/README\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} cvslock-0.1/COPYING\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} cvslock-0.1/Makefile.am\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} cvslock-0.1/acconfig.h\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} cvslock-0.1/aclocal.m4\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} cvslock-0.1/config.h.in\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} cvslock-0.1/configure\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} cvslock-0.1/configure.in\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} cvslock-0.1/install-sh\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} cvslock-0.1/missing\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} cvslock-0.1/mkinstalldirs\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} cvslock-0.1/stamp-h.in\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} cvslock-0.1/cvslock.c\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} cvslock-0.1/cvslock.1\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} cvslock-0.1/snprintf.c\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} cvslock-0.1/cvslssh\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} cvslock-0.1/VERSION\end{scriptsize} \end{tt} \linebreak
    \begin{tt} \begin{scriptsize}  \linebreak user@linux \~{}/ \$ 
cd cvslock-0.1
     \end{scriptsize} \end{tt} \linebreak 
    \begin{tt} \begin{scriptsize} user@linux \~{}/ \$ 
./configure
     \end{scriptsize} \end{tt} \linebreak 
    \begin{tt} \begin{scriptsize} ...\end{scriptsize} \end{tt} \linebreak
    \begin{tt} \begin{scriptsize}  \linebreak user@linux \~{}/ \$ 
make
     \end{scriptsize} \end{tt} \linebreak 
    \begin{tt} \begin{scriptsize} gcc -DHAVE\_CONFIG\_H -I. -I. -I. -g -O2 -c cvslock.c\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} gcc -g -O2 -o cvslock cvslock.o\end{scriptsize} \end{tt} \linebreak
    \begin{tt} \begin{scriptsize}  \linebreak user@linux \~{}/ \$ 
make install
     \end{scriptsize} \end{tt} \linebreak 
    \begin{tt} \begin{scriptsize} ...\end{scriptsize} \end{tt} \linebreak
    \begin{tt} \begin{scriptsize}  \linebreak user@linux \~{}/ \$ 
     \end{scriptsize} \end{tt} \linebreak 
   

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

   
  \par
  
Nun ist {\bf cvslock} als {\bf /usr/local/bin/cvslock} installiert. Wenn Sie es
aufrufen, können Sie das Archiv mit {\bf -d} oder über die
{\bf \$CVSROOT}-Umgebungsvariable angeben, genau wie bei CVS selbst auch (das
folgende Beispiel nutzt {\bf -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:
   

   
    \begin{tt} \begin{scriptsize} user@linux \~{}/ \$ 
ls /usr/local/archiv/projekt/b-verzeichnis/
     \end{scriptsize} \end{tt} \linebreak 
    \begin{tt} \begin{scriptsize} random.c,v\end{scriptsize} \end{tt} \linebreak
    \begin{tt} \begin{scriptsize}  \linebreak user@linux \~{}/ \$ 
cvslock -d /usr/local/archiv projekt/b-verzeichnis
     \end{scriptsize} \end{tt} \linebreak 
    \begin{tt} \begin{scriptsize} user@linux \~{}/ \$ 
ls /usr/local/archiv/projekt/b-verzeichnis/
     \end{scriptsize} \end{tt} \linebreak 
    \begin{tt} \begin{scriptsize} \#cvs.rfl.cvslock.floss.27378 random.c,v\end{scriptsize} \end{tt} \linebreak
    \begin{tt} \begin{scriptsize}  \linebreak user@linux \~{}/ \$ 
cvslock -u -p 27378 -d /usr/local/archiv projekt/b-verzeichnis
     \end{scriptsize} \end{tt} \linebreak 
    \begin{tt} \begin{scriptsize} user@linux \~{}/ \$ 
ls /usr/local/archiv/projekt/b-verzeichnis/
     \end{scriptsize} \end{tt} \linebreak 
    \begin{tt} \begin{scriptsize} random.c,v\end{scriptsize} \end{tt} \linebreak
    \begin{tt} \begin{scriptsize}  \linebreak user@linux \~{}/ \$ 
     \end{scriptsize} \end{tt} \linebreak 
   

   
  \par
  
Beachten Sie, dass ich {\bf -p 27378} angeben musste, als ich (mittels {\bf -u}
für {\bf unlock}) die Sperre wieder aufhob. Das kommt daher, dass {\bf 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 {\bf cvslock} (mittels der
Option {\bf -p}) mitteilen, welche Instanz Sie aufheben möchten, auch wenn
nur eine existiert. (Sie können jedoch {\bf -p} auch ohne {\bf -u} verwenden.)
   

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

   
    \begin{tt} \begin{scriptsize} user@linux \~{}/ \$ 
cvslock -s -d /usr/local/archiv projekt
     \end{scriptsize} \end{tt} \linebreak 
   

   
  \par
  
Die Sperre bleibt dann genau so lange bestehen, bis Sie die Shell
verlassen, wonach sie automatisch aufgehoben wird. Sie können auch die
{\bf -c}-Option verwenden, um einen Befehl auszuführen, während das Archiv
gesperrt ist. Genau wie bei {\bf -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:
   

   
    \begin{tt} \begin{scriptsize} user@linux \~{}/ \$ 
cvslock -c 'find . -name ''*cvslock*'' -print' -d /usr/local/archiv projekt
     \end{scriptsize} \end{tt} \linebreak 
    \begin{tt} \begin{scriptsize} cvslock: '/usr/local/archiv/projekt' locked successfully.\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} cvslock: starting'find . -name ''*cvslock*'' -print' ...\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} ./a-verzeichnis/unterverzeichnis/\#cvs.rfl.cvslock.floss.27452\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} ./a-verzeichnis/\#cvs.rfl.cvslock.floss.27452\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} ./b-verzeichnis/\#cvs.rfl.cvslock.floss.27452\end{scriptsize} \end{tt} \linebreak
    \linebreak\begin{tt} \begin{scriptsize} ./\#cvs.rfl.cvslock.floss.27452\end{scriptsize} \end{tt} \linebreak
    \begin{tt} \begin{scriptsize}  \linebreak user@linux \~{}/ \$ 
find /usr/local/archiv/projekt -name ''*cvslock*'' -print
     \end{scriptsize} \end{tt} \linebreak 
    \begin{tt} \begin{scriptsize} user@linux \~{}/ \$ 
     \end{scriptsize} \end{tt} \linebreak 
   

   
  \par
  
Das Kommando (das Argument zur Option {\bf -c}) wird mit dem angegebenen
Archivverzeichnis als Arbeitsverzeichnis gestartet.
   

   
  \par
  
Normalerweise erzeugt {\bf cvslock} eine Lesesperre. Wenn gegen
Schreibzugriff gesperrt werden soll, dann geht das mit der Option {\bf -W}.
(Sie können für die Lesesperrung auch {\bf -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.
   

   
  \par
  
Beachten Sie, dass {\bf 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 {\bf man
cvslock}, wodurch eine Anleitung angezeigt wird, die beim {\bf make install} für
{\bf cvslock} mit installiert wurde.)
   
  \section{Weitere Pakete} \label{d79e1632}
        

   


   
  \par
  
Eine Vielzahl anderer Softwarepakete von Drittanbietern ist für CVS
verfügbar. Es folgen Hinweise auf einige von ihnen.
   


   
  \par
  
CVSUp (Bestandteil des FreeBSD-Projektes)
   

   
  \par
  
{\bf CVSUp} ist ein effizientes Werkzeug zum Spiegeln1 von Dateien im
allgemeinen mit spezieller Unterstützung für das Spiegeln von
CVS-Archiven. Das Betriebssystem FreeBSD benutzt dieses Programm, um
Aktualisierungen seines Hauptarchivs an andere weiterzuverteilen,
sodass die Benutzer bequem auf dem neuesten Stand bleiben können.
   

   
  \par
  
Für mehr und allgemeinere Informationen zu {\bf CVSUp} schauen Sie auf
http://www.polstra.com/projects/freeware/CVSup/ nach.
   

   
  \par
  
Informationen speziell zu FreeBSD gibt es unter
http://www.freebsd.org/handbook/synching.html\#CVSUP.
   


   
  \par
  
CVSWeb: Ein Web-Iterface für CVS-Archive
   

   
  \par
  
{\bf CVSWeb} stellt ein Web-Interface zur Verfügung, mit dessen Hilfe man
sich in CVS-Archiven umsehen kann. Ein passenderer Name wäre wohl
{\bf RCSWeb}, da es Ihnen genau genommen erlaubt, bestimmte Revisionen
direkt anzusehen, mitsamt Log-Mitteilungen und {\bf Diffs}. Obwohl ich
selber es nie als besonders ansprechend empfunden habe, muss ich
zugeben, dass es recht intuitiv ist, und eine Menge Server benutzen
es.
   

   
  \par
  
Obschon die Software ursprünglich von Bill Fenner geschrieben wurde,
steht die Version, die momentan am aktivsten weiterentwickelt wird,
offensichtlich unter der Obhut von Henner Zeller, unter
http://linux.fh-heilbronn.de/\~{}zeller/cgi/cvsweb.cgi/.
   

   
  \par
  
Möglicherweise möchten Sie auch Fenners ursprüngliche Webseite unter
http://www.freebsd.org/\~{}fenner/cvsweb/ und die Aufbereitung der
{\bf CVSWeb}-Szene von Cyclic Software unter
http://www.cyclic.com/cyclic-pages/web-cvsweb.html besuchen.
   

   
  \par
  
Falls Sie zu guter Letzt noch {\bf CVSWeb} in Aktion sehen möchten, findet
sich ein gutes Beispiel unter
http://sourceware.cygnus.com/cgi-bin/cvsweb.cgi/.
   


   
  \par
  
Das CVS-contrib/-Verzeichnis
   

   
  \par
  
Wie schon in Kapitel 4 erwähnt, wird eine Reihe von Werkzeugen von
Drittanbietern zusammen mit CVS geliefert und ist dort im Verzeichnis
{\bf contrib/} zusammengefasst. Auch wenn mir keine formelle Regel bekannt
ist, welche Werkzeuge mit CVS vertrieben werden, könnte dies ein
laufender Versuch sein, die am häufigsten mit CVS verwendeten
Werkzeuge zu finden und dort zu sammeln, sodass man stets weiß, wo man
suchen muss. Bis es so weit ist, ist der beste Weg, um solche
Programme zu finden, immer noch ein Blick auf die diversen
CVS-Webseiten und das Fragen auf der Mailingliste.
   
  \section{Eigene Werkzeuge schreiben} \label{d79e1736}
        

   


   
  \par
  
CVS mag zuweilen wie ein wüster Haufen improvisierter Standards
erscheinen. Da sind das RCS-Format, diverse Ausgabeformate ({\bf history},
{\bf annotate}, {\bf log}, {\bf update} usw.), diverse Formate für die
Verwaltungsdateien der Archive und Arbeitskopien, das
Client/Server-Protokoll, das Lock-Datei-Protokoll ... (Und? Ist es
Ihnen schon langweilig geworden? Wissen Sie, Ich könnte fröhlich
weitermachen.)
   

   
  \par
  
Erfreulicherweise bleiben diese Standards von Version zu Version recht
konsistent - wenn Sie also ein Programm zur Nutzung mit CVS schreiben,
dann brauchen Sie zumindest nicht zu befürchten, auf ein bewegliches
Ziel schießen zu müssen. Zu jedem internen Standard gibt es
üblicherweise eine Reihe von Leuten auf der
infocvs@gnu.org 
				<infocvs@gnu.org>
			-Mailingliste, die sich mit diesem sehr gut auskennen.
(Einige von ihnen halfen mir weiter, während ich an diesem Buch
schrieb.) Weiterhin ist da die Dokumentation (in Englisch), die mit
der CVS-Distribution geliefert wird (insbesondere {\bf doc/cvs.texinfo},
{\bf doc/cvsclient.texi} und {\bf doc/RCSFILES}). Zuletzt ist da immer noch der
CVS-Quelltext selbst, das letzte Wort zu jeder Frage bezüglich
Implementation oder Verhalten von CVS.
   

   
  \par
  
Mit all diesen Informationen zu Ihrer Verfügung gibt es keinen Grund
zu zögern. Wenn Sie sich irgendein Programm vorstellen können, das Ihr
Leben mit CVS einfacher machen könnte, dann los, schreiben Sie es -
die Chancen stehen gut, dass andere Leute das auch schon immer haben
wollten. Anders als eine Veränderung an CVS selbst kann ein kleines
eigenständiges Hilfsprogramm sich sehr schnell weit verbreiten, was
schnellere Rückmeldung für seinen Autor und zügigere Behebung von
Fehlern für alle Benutzer bedeutet.
   




   
  \par
  
1. Anm. d. Übers: Spiegeln (mirroring): das Erstellen des Abbildes
einer kompletten Verzeichnisstruktur an anderer Stelle
   
  
	\ref{inhalt.tex}


	\end{document}
	
