2.3 How data is stored in the working directory
Während wir über CVS Internas diskutieren, die von
Zeit zu Zeit zum Vorschein kommen können, können wir
auch darüber reden, was CVS in den
`CVS'--Verzeichnissen im Arbeitsverzeichnis
("working directory") ablegt.
Genau wie beim "Repository" verwaltet CVS diese
Informationen und man kann gewöhnlich mit
CVS--Befehlen darauf zugreifen. Aber in manchen
Fällen kann es nützlich sein, sie direkt anzuschauen.
Ebenso kann es sein, daß andere Programme, wie das
grafische Frontend jCVS oder das VC
Packet für emacs, diese Daten brauchen.
Solche Programme sollten den Empfehlungen in diesem
Abschnitt folgen, wenn eine gemeinsame Nutzung mit
anderen Programmen, die obige Dateien benötigen,
möglich sein soll. Dies schließt zukünftige
Versionen der gerade genannten Programme und den
CVS-client für die Kommandozeile ein.
Das `CVS'--Verzeichnis enthält mehrere Dateien.
Programme, die dieses Verzeichnis lesen, sollten alle
hier nicht dokumentierten Dateien darin ignorieren, um
zukünftige Erweiterungen zu ermöglichen.
Die Dateien werden entsprechend den
Text--Datei--Konventionen des jeweiligen
Betriebssystems gespeichert. Daraus folgt, daß
Arbeitsverzeichnisse nicht portabel sind zwischen
Systemen mit unterscheidlichen Konventionen zur
Speicherung von Textdateien.
Dieses ist beabsichtigt, mit dem Hintergrund, daß
die mit CVS verwalteten Dateien wahrscheinlich auch
nicht zwischen solchen Systemen portabel seien werden.
- `Root'
- In dieser Datei steht das aktuelle
CVS--Wurzelverzeichnis, wie unter 2.1 Ort des Repositories festlegen beschrieben.
- `Repository'
- In dieser Datei ist das Verzeichnis innerhalb des
Repositories angegeben, mit dem das aktuelle
Verzeichnis korrespondiert. Es kann entweder ein
absoluter oder ein relativer Pfad angegeben sein;
CVS kann seit (ungefähr) version 1.3 beide
Formate lesen. Der relative Pfad ist relativ zur
(cvs--)Wurzel, und ist der vern=FCnftigere Ansatz.
Absolute Pfade sind allerdings recht verbreitet, und
sollten von Implementierungen auch akzeptiert werden.
Ein Beispiel: Nach Ausführung des Befehls
| | cvs -d :local:/usr/local/cvsroot checkout yoyodyne/tc
|
enthält die Datei `Root'
| | :local:/usr/local/cvsroot
|
und in der Datei `Repository' steht entweder
| | /usr/local/cvsroot/yoyodyne/tc
|
oder
Wenn das jeweilige Arbeitsverzeichnis nicht mit einem
Verzeichnis im Repository korrespondiert, sollte in der
Datei `Repository' der Pfad
`CVSROOT/Emptydir' angegeben sein.
- `Entries'
- Diese Datei enthält eine Liste der Dateien und
Verzeichnise im Arbeitsverzeichnis.
Das erste Zeichen jeder Zeile gibt an welcher Art die
Zeile ist.
Wenn ein Zeichen nicht erkannt werden kann, so sollten
Programme, die die Datei lesen diese einfach ignorieren, um
ein Erweiterung in der Zukunft möglich zu machen.
Wenn das erste Zeichen ein `/' ist, dann ist das
Format wie folgt:
| | /name/revision/timestamp[+conflict]/options/tagdate
|
wobei `[' und `]' nicht Teil des Eintrages sind,
sondern stattdessen anzeigen, daß die `+' und
Konflikt--Markierungen ("conflict marker") optional
sind. name ist der Name der Datei innerhalb des
Verzeichnisses. revision ist die
Revision, von der die Datei im Arbeitsverzeichnis
abstammt, oder `0' für eine hinzugefügte
Datei, oder `-' gefolgt von einer Revision für
eine entfernte Datei. timestamp ist der
Zeitstempel der Datei zu der Zeit, als CVS sie
erzeugt hat; wenn der Zeitstempel sich von der
tatsächlichen Zeit der letzten Änderung ("modification
time") der Datei unterscheidet, bedeutet dies, daß
die Datei verändert wurde. Der Zeitstempel wird im
Format der ISO C asctime() Funktion gespeichert (zum
Beispiel `Sun Apr 7 01:29:26 1996'). Man kann
einen String in einem anderen Format eintragen,
z.B. `Result of merge', um anzuzeigen, daß die
Datei immer als modifiziert betrachtet werden
soll. Dies ist kein Spezialfall; um zu sehen, ob eine
Datei modifiziert wurde, sollte ein Programm einfach
einen String--Vergleich des Zeitstempels dieser Datei
mit timestamp vornehmen.
Wenn es einen Konflikt gab, kann conflict auf die
Zeit der letzten Änderung ("modification time") der
Datei gesetzt werden, nachdem die Datei mit
Konflikt--Markierungen gespeichert wurde
( 10.3 Conflicts example).
Damit bedeutet es, daß der Benutzer offensichtlich
den Konflikt nicht aufgelöst hat, wenn conflict
nachfolgend gleich der tatsächlichen Zeit
der letzten Änderung der Datei ist. options
enthält "sticky options" (zum Beispiel `-kb' für eine
binäre Datei). tagdate enthält `T'
gefolgt von einem tag name, oder `D' für ein
Datum, gefolgt von einem sticky tag oder Datum.
Beachten Sie, daß sie mit einer (hier nicht
dokumentierten) CVS--Version vor CVS 1.5
arbeiten, wenn timestamp statt einem einzelnen
Zeitstempel ein Paar von Zeitstempeln enthält, die
mit einem Leerzeichen getrennt sind.
Die Zeitzone des Zeitstempels in CVS/Entries (lokal
oder universal) sollte die gleiche sein, die das
Betriebssystem für die Zeitstempel von Dateien
benutzt. Zum Beispiel werden Zeitstempel von Dateien
unter Unix in "universal time" (UT) angegeben, also
sollten die Zeitstempel in CVS/Entries auch in UT
angegeben werden. Unter VMS sind die
Datei--Zeitstempel in Ortszeit ("local time")
angebeben, sodaß CVS unter VMS Ortszeit
benutzen sollte.
Diese Regelung gilt, damit Dateien nicht modifiziert
erscheinen, nur weil die Zeitzone sich geändert hat
(zum Beispiel beim Wechsel zu oder von Sommerzeit).
Wenn das erste Zeichen einer Zeile in `Entries'
ein `D' ist, zeigt dies ein Unterverzeichnis an.
`D' als einziges Zeichen in einer Zeile bedeuter,
daß das Programm, welches die `Entries'--Datei
geschrieben hat, Unterverzeichnisse aufzeichnet
(Daher weiß man, daß es keine
Unterverzeichnisse gibt, wenn eine solche Zeile
existiert und keine andere Zeile mit `D'
brginnt). Anderenfalls sieht die Zeile so aus:
| | D/name/filler1/filler2/filler3/filler4
|
wobei name der Name des Unterverzeichnisses ist.
Die filler Felder sind für zukünftige
Erweiterungen gedacht und sollten ignoriert werden.
Programme, die `Entries'--Dateien verändern, sollten
diese Felder erhalten.
Die Zeilen in der `Entries'--Datei können in
beliebiger Reihenfolge angeordnet werden.
- `Entries.Log'
- Diese Datei enthält keine anderen Informationen als
`Entries', bietet aber eine Möglichkeit zur
Akualisierung dieser Informationen, ohne daß die
gesamte `Entries'--Datei neu geschrieben werden
muß. Dabei bleiben alle Informationen auch dann
erhalten, wenn das Programm, das in `Entries' und
`Entries.Log' schreibt, plötzlich abbricht.
Programme, die die `Entries'--Datei lesen, sollten
auch die Datei `Entries.Log' beachten. Wenn
letztere existiert, sollte die Datei `Entries'
gelesen und danach die in der `Entries.Log'--Datei
angegebenen Änderungen "ubernommen werden.
Es wird empfohlen, nach Übernahme der Änderungen
die Datei `Entries' neu zu schreiben und dann die
`Entries.Log'--Datei zu löschen.
Eine Zeile in `Entries.Log' ist folgendermaßen
aufgebaut:
Ein Ein--Zeichen--Befehl, gefolgt von einem
Leerzeichen, gefolgt von einer Zeile im Format, das
für die `Entries'--Datei gilt. Der
Ein--Zeichen--Befehl ist
`A' um anzuzeigen, daß der Eintrag
hinzugefügt wurde,
`R' um anzuzeigen, daß der Eintrag entfernt wurde,
oder jedes andere Zeichen, um anzuzeigen, daß die
gesamte Zeile in `Entries.Log' ignoriert werden
soll (kann für zukünftige Erweiterungen genutzt
werden).
Wenn das zweite Zeichen einer Zeile aus
`Entries.Log' kein Leerzeichen ist,
wurde diese Zeile von einer älteren (hier nicht
dokumentierten) Version von CVS geschrieben.
Programme, die schreiben und nicht lesen, können die
Datei `Entries.Log' ignorieren, wenn sie
möchten.
- `Entries.Backup'
- Dies ist eine temporäre Datei. Es wird empfohlen,
eine neue Entries--Datei als `Entries.Backup' anzulegen, und
diese dann (soweit möglich, atomar) in `Entries'
umzubenennen.
- `Entries.Static'
- Das einzig wichtige an dieser Datei ist, ob sie
existiert oder nicht. Wenn sie existiert, bedeutet
dies, daß nur ein Teil eines Verzeichnisses
geholt wurde. CVS wird keine zusätzlichen
Dateien in diesem Verzeichnis anlegen. Um die Datei zu
löschen,
benutzen Sie den
update Befehl mit der `-d'
Option. Dieses holt die fehlenden Dateien und entfernt
`Entries.Static'.
- `Tag'
- Diese Datei enthält "sticky tags" oder "sticky dates"
für ein Verzeichnis.
Das erste Zeichen ist `T' für ein "branch tag",
`N' für ein "non-branch tag", oder `D'
für ein Datum. Ist das erste Zeichen keines der oben
genannten, sollte die Datei ignoriert werden
(Möglichkeit für zukünftige Erweiterungen).
Auf dieses erste Zeichen folgt das "tag" oder Datum.
Beachten Sie, daß "per-directory sticky tags or
dates" für Dinge wie applying to files which are
newly added benutzt werden; sie sind nicht
zwangsläufig das gleiche wie die "sticky tags or
dates" bei individuellen (nicht--cvs)Dateien.
Für allgemeine Informationen zu "sticky tags and
dates" siehe 4.9 Sticky tags.
- `Checkin.prog'
- `Update.prog'
- Diese Dateien speichern die Programme, die mit den
`-i' bzw. `-u' Optionen in der
"modules"--Datei angegeben wurden.
- `Notify'
- Diese Datei speichert Benachrichtigungen (zum Beispiel
für
edit oder unedit), die noch nicht
zum Server gesendet wurden. Das Format dieser Datei
ist hier noch nicht dokumentiert.
- `Notify.tmp'
- Diese Datei verhält sich zu `Notify', wie
`Entries.Backup' zu `Entries'. Um also
in `Notify' zu schreiben, schreiben Sie zuerst den
neuen Inhalt in `Notify.tmp'. Danach können Sie
(möglichst als atomare Operation) `Notify.tmp'
in `Notify' umbenennen.
- `Base'
- Wenn "watches" benutzt werden, speichert ein
edit--Befehl die originale Kopie der Datei im
`Base'--Verzeichnis. Dies ermöglicht einen
funktionierenden unedit--Befehl auch dann, wenn
nicht mit dem Server kommuniziert werden kann.
- `Baserev'
- In dieser Datei ist die Revision von jeder Datei im
`Base'--Verzeichnis aufgelistet. Das Format ist:
wobei expansion ignoriert werden sollte, um
zukünftige Erweiterungen zu ermöglichen.
- `Baserev.tmp'
- Diese Datei verhält sich zu `Baserev', wie
`Entries.Backup' zu `Entries'. Um also
in `Baserev' zu schreiben, schreiben Sie zuerst den
neuen Inhalt in `Baserev.tmp'. Danach können Sie
(möglichst als atomare Operation) `Baserev.tmp'
in `Baserev' umbenennen.
- `Template'
- Diese Datei enthält die in der `rcsinfo'--Datei
( C.8 Rcsinfo) angegebene Vorlage. `Template'
wird nur vom Client benutzt. Nicht--Client/Server
CVS benutzt direkt die `rcsinfo'--Datei.
|