BSD 4_3_Net_2 development
[unix-history] / usr / src / contrib / rcs / doc / rcs.ms
CommitLineData
74966f01
C
1.\ Format this file with:
2.\ pic file | tbl | troff -ms
3
4.\ PS and PE center pic diagrams. (The corresponding ms-macros may not.)
5.de PS
6.nr pE (\\n(.lu-\\$2u)/2u
7.in +\\n(pEu
8.ne \\$1u
9..
10.de PE
11.in -\\n(pEu
12..
13.de D(
14.DS
15.nr VS 12pts
16.vs 12pts
17.I
18..
19.de D)
20.DE
21.nr VS 18pts
22.vs 18pts
23.R
24..
25
26.ND July 1985
27.RP
28.TL
29RCS \- A System for Version Control
30
31.AU
32Walter F. Tichy
33.AI
34Department of Computer Sciences
35Purdue University
36West Lafayette, Indiana 47907
37
38.AB
39An important problem in program development and maintenance is version control,
40i.e., the task of keeping a software system consisting of many versions and
41configurations well organized.
42The Revision Control System (RCS)
43is a software tool that assists with that task.
44RCS manages revisions of text documents, in particular source programs,
45documentation, and test data.
46It automates the storing, retrieval, logging and identification of revisions,
47and it provides selection mechanisms for composing configurations.
48This paper introduces basic version control concepts and
49discusses the practice of version control
50using RCS.
51For conserving space, RCS stores deltas, i.e., differences between
52successive revisions. Several delta storage methods are discusses.
53Usage statistics show that RCS's delta storage method is
54space and time efficient.
55The paper concludes with a detailed survey of version control tools.
56
57\fBKeywords\fR: configuration management, history management,
58version control, revisions, deltas.
59.AE
60.FS
61A version of this paper was published in Software--Practice and Experience,
62Vol. 15(7), 637-654 (July 1985).
63.FE
64.nr VS 18pts
65.EQ
66delim $$
67.EN
68.LP
69.NH
70Introduction
71.PP
72Version control is the task of keeping software
73systems consisting of many versions and configurations well organized.
74The Revision Control System (RCS) is a set of UNIX
75commands that assist with that task.
76.PP
77RCS' primary function is to manage \fIrevision groups\fR.
78A revision group is a set of text documents, called \fIrevisions\fR,
79that evolved from each other. A new revision is
80created by manually editing an existing one.
81RCS organizes the revisions into an ancestral tree. The initial revision
82is the root of the tree, and the tree edges indicate
83from which revision a given one evolved.
84Besides managing individual revision groups, RCS provides
85flexible selection functions for composing configurations.
86RCS may be combined with MAKE\u1\d,
87resulting in a powerful package for version control.
88.PP
89RCS also offers facilities for
90merging updates with customer modifications,
91for distributed software development, and
92for automatic identification.
93Identification is the `stamping'
94of revisions and configurations with unique markers.
95These markers are akin to serial numbers,
96telling software maintainers unambiguously which configuration
97is before them.
98.PP
99RCS is designed for both production and experimental
100environments.
101In production environments,
102access controls detect update conflicts and prevent overlapping changes.
103In experimental environments, where strong controls are
104counterproductive, it is possible to loosen the controls.
105.PP
106Although RCS was originally intended for programs, it is useful for any
107text that is revised frequently and whose previous revisions must be
108preserved. RCS has been applied successfully to store the source
109text for drawings, VLSI layouts, documentation, specifications,
110test data, form letters and articles.
111.PP
112This paper discusses the practice of
113version control using RCS.
114It also introduces basic version control concepts,
115useful for clarifying current practice and designing similar systems.
116Revision groups of individual components are treated in the next three sections,
117and the extensions to configurations follow.
118Because of its size, a survey of version control tools
119appears at the end of the paper.
120.NH
121Getting started with RCS
122.PP
123Suppose a text file \fIf.c\fR is to be placed under control of RCS.
124Invoking the check-in command
125.D(
126ci f.c
127.D)
128creates a new revision group with the contents of
129\fIf.c\fR as the initial
130revision (numbered 1.1)
131and stores the group into the file \fIf.c,v\fR.
132Unless told otherwise, the command deletes \fIf.c\fR.
133It also asks for a description of the group.
134The description should state the common purpose of all revisions in the group,
135and becomes part of the group's documentation.
136All later check-in commands will ask for a log entry,
137which should summarize the changes made.
138(The first revision is assigned a default log message,
139which just records the fact that it is the initial revision.)
140.PP
141Files ending in \fI,v\fR
142are called \fIRCS files\fR (\fIv\fR stands for \fIv\fRersions);
143the others are called working files.
144To get back the working file \fIf.c\fR in the previous example,
145execute the check-out command:
146.D(
147co f.c
148.D)
149.R
150This command extracts the latest revision from
151the revision group \fIf.c,v\fR and writes
152it into \fIf.c\fR.
153The file \fIf.c\fR can now be edited and, when finished,
154checked back in with \fIci\fR:
155.D(
156ci f.c
157.D)
158\fICi\fR assigns number 1.2 to
159the new revision.
160If \fIci\fR complains with the message
161.D(
162ci error: no lock set by <login>
163.D)
164then the system administrator has decided to configure RCS for a
165production environment by enabling the `strict locking feature'.
166If this feature is enabled, all RCS files are initialized
167such that check-in operations require a lock on the previous revision
168(the one from which the current one evolved).
169Locking prevents overlapping modifications if several people work on the same file.
170If locking is required, the revision should
171have been locked during the check-out by using
172the option \fI-l\fR:
173.D(
174co -l f.c
175.D)
176Of course it is too late now for the check-out with locking, because
177\fIf.c\fR has already been changed; checking out the file again
178would overwrite the modifications.
179(To prevent accidental overwrites, \fIco\fR senses the presence
180of a working file and asks whether the user really intended to overwrite it.
181The overwriting check-out is sometimes useful for
182backing up to the previous revision.)
183To be able to proceed with the check-in in the present case, first execute
184.D(
185rcs -l f.c
186.D)
187This command retroactively locks the latest revision, unless someone
188else locked it in the meantime. In this case, the two programmers
189involved have to negotiate whose
190modifications should take precedence.
191.PP
192If an RCS file is private, i.e., if only the owner of the file is expected
193to deposit revisions into it, the strict locking feature is unnecessary and
194may be disabled.
195If strict locking is disabled,
196the owner of the RCS file need not have a lock for check-in.
197For safety reasons, all others
198still do. Turning strict locking off and on is done with the commands:
199.D(
200rcs -U f.c \fRand\fI rcs -L f.c
201.D)
202These commands enable or disable the strict locking feature for each RCS file
203individually.
204The system administrator only decides whether strict locking is
205enabled initially.
206.PP
207To reduce the clutter in a working directory, all RCS files can be moved
208to a subdirectory with the name \fIRCS\fR.
209RCS commands look first into that directory for RCS files.
210All the commands presented above work
211with the \fIRCS\fR subdirectory without change.\(dg
212.FS
213\(dg Pairs of RCS and working files can actually be specified in 3 ways:
214a) both are given, b) only the working file is given, c) only the
215RCS file is given.
216If a pair is given, both files may have arbitrary path prefixes;
217RCS commands pair them up intelligently.
218.FE
219.PP
220It may be undesirable that \fIci\fR deletes the working file.
221For instance, sometimes one would like to save the current revision,
222but continue editing.
223Invoking
224.D(
225ci -l f.c
226.D)
227checks in \fIf.c\fR as usual, but performs an additional
228check-out with locking afterwards. Thus, the working file does
229not disappear after the check-in.
230Similarly, the option
231\fI-u\fR does a check-in followed by a check-out without
232locking. This option is useful if the file is needed for compilation after the check-in.
233Both options update the identification markers in the working file
234(see below).
235.PP
236Besides the operations \fIci\fR and \fIco\fR, RCS provides the following
237commands:
238\fIident\fR (extract identification markers),
239\fIrcs\fR (change RCS file attributes),
240\fIrcsclean\fR (remove unchanged working files),
241\fIrcsdiff\fR (compare revisions),
242\fIrcsfreeze\fR (record a configuration),
243\fIrcsmerge\fR (merge revisions),
244and \fIrlog\fR (read log messages and other information in RCS files).
245A synopsis of these commands appears in the Appendix.
246.NH 2
247Automatic Identification
248.PP
249RCS can stamp source and object code with special identification strings,
250similar to product and serial numbers.
251To obtain such identification, place the marker
252.D(
253$Header$
254.D)
255into the text of a revision, for instance inside a comment.
256The check-out operation will replace this marker with a string of the form
257.D(
258$Header: filename revisionnumber date time author state locker $
259.D)
260This string need never be touched, because \fIco\fR keeps it
261up to date automatically.
262To propagate the marker into object code, simply put
263it into a literal character string. In C, this is done as follows:
264.D(
265static char rcsid[] = "$Header$";
266.D)
267The command \fIident\fR extracts such markers from any file, in particular from
268object code.
269\fIIdent\fR helps to find out
270which revisions of which modules were used in a given program.
271It returns a complete and unambiguous component list,
272from which a copy of the program can be reconstructed.
273This facility is invaluable for program maintenance.
274.PP
275There are several additional identification markers, one for each component
276of $Header$.
277The marker
278.D(
279$Log$
280.D)
281has a similar function. It accumulates
282the log messages that are requested during check-in.
283Thus, one can maintain the complete history of a revision directly inside it,
284by enclosing it in a comment.
285Figure 1 is a partial reproduction of a log contained in revision 4.1 of
286the file \fIci.c\fR. The log appears at the beginning of the file,
287and makes it easy to determine what the recent modifications were.
288.sp
289.nr VS 12pts
290.vs 12pts
291.ne 18
292.nf
293.in +0.5i
294/* $Log: ci.c,v $
295 * Revision 4.1 83/05/10 17:03:06 wft
296 * Added option -d and -w, and updated assignment of date, etc. to new delta.
297 * Added handling of default branches.
298 *
299 * Revision 3.9 83/02/15 15:25:44 wft
300 * Added call to fastcopy() to copy remainder of RCS file.
301 *
302 * Revision 3.8 83/01/14 15:34:05 wft
303 * Added ignoring of interrupts while new RCS file is renamed;
304 * avoids deletion of RCS files by interrupts.
305 *
306 * Revision 3.7 82/12/10 16:09:20 wft
307 * Corrected checking of return code from diff.
308 * An RCS file now inherits its mode during the first ci from the working file,
309 * except that write permission is removed.
310 */
311.in 0
312.ce 1
313Figure 1. Log entries produced by the marker $Log$.
314.fi
315.nr VS 18pts
316.vs 18pts
317.sp 0
318.LP
319Since revisions are stored in the form of differences,
320each log message is
321physically stored once,
322independent of the number of revisions present.
323Thus, the $Log$ marker incurs negligible space overhead.
324.NH
325The RCS Revision Tree
326.PP
327RCS arranges revisions in an ancestral tree.
328The \fIci\fR command builds this tree; the auxiliary command \fIrcs\fR
329prunes it.
330The tree has a root revision, normally numbered 1.1, and successive revisions
331are numbered 1.2, 1.3, etc. The first field of a revision number
332is called the \fIrelease number\fR and the second one
333the \fIlevel number\fR. Unless given explicitly,
334the \fIci\fR command assigns a new revision number
335by incrementing the level number of the previous revision.
336The release number must be incremented explicitly, using the
337\fI-r\fR option of \fIci\fR.
338Assuming there are revisions 1.1, 1.2, and 1.3 in the RCS file f.c,v, the command
339.D(
340ci -r2.1 f.c \fRor\fI ci -r2 f.c
341.D)
342assigns the number 2.1 to the new revision.
343Later check-ins without the \fI-r\fR option will assign the numbers 2.2, 2.3,
344and so on.
345The release number should be incremented only at major transition points
346in the development, for instance when a new release of a software product has
347been completed.
348.NH 2
349When are branches needed?
350.PP
351A young revision tree is slender:
352It consists of only one branch, called the trunk.
353As the tree ages, side branches may form.
354Branches are needed in the following 4 situations.
355.IP "\fITemporary fixes\fR"
356.sp 0
357Suppose a tree has 5 revisions grouped in 2 releases,
358as illustrated in Figure 2.
359Revision 1.3, the last one of release 1, is in operation at customer sites,
360while release 2 is in active development.
361.ne 4
362.PS 4i
363.ps -2
364box "1.1"
365arrow
366box "1.2"
367arrow
368box "1.3"
369arrow
370box "2.1"
371arrow
372box "2.2"
373arrow dashed
374.ps +2
375.PE
376.ce 1
377Figure 2. A slender revision tree.
378.sp 0
379Now imagine a customer requesting a fix of
380a problem in revision 1.3, although actual development has moved on
381to release 2. RCS does not permit an extra
382revision to be spliced in between 1.3 and 2.1, since that would not reflect
383the actual development history. Instead, create a branch
384at revision 1.3, and check in the fix on that branch.
385The first branch starting at 1.3 has number 1.3.1, and
386the revisions on that branch are numbered 1.3.1.1, 1.3.1.2, etc.
387The double numbering is needed to allow for another
388branch at 1.3, say 1.3.2.
389Revisions on the second branch would be numbered
3901.3.2.1, 1.3.2.2, and so on.
391The following steps create
392branch 1.3.1 and add revision 1.3.1.1:
393.sp 0
394.I
395.nr VS 12pts
396.vs 12pts
397.TS
398tab(%);
399l l l.
400 %co -r1.3 f.c % -- check out revision 1.3
401 %edit f.c % -- change it
402 %ci -r1.3.1 f.c % -- check it in on branch 1.3.1
403.TE
404.nr VS 18pts
405.vs 18pts
406.R
407This sequence of commands transforms the tree of Figure 2 into
408the one in Figure 3.
409Note that it may be necessary to incorporate the differences
410between 1.3 and 1.3.1.1
411into a revision at level 2. The operation \fIrcsmerge\fR automates this
412process (see the Appendix).
413.ne 7
414.PS 4i
415.ps -2
416 box "1.1"
417 arrow
418 box "1.2"
419 arrow
420R13: box "1.3"
421 arrow
422R21: box "2.1"
423 arrow
424R22: box "2.2"
425 arrow dashed
426 line invis down from R21.s
427RB1: box "1.3.1.1"
428 arrow dashed right from RB1.e
429 arrow from R13.s to RB1.w
430.ps +2
431.PE
432.ce 1
433Figure 3. A revision tree with one side branch
434
435.IP "\fIDistributed development and customer modifications\fR"
436.sp 0
437Assume a situation as in Figure 2, where revision 1.3 is in operation
438at several customer sites,
439while release 2 is in development.
440Customer sites should use RCS to store the distributed software.
441However, customer modifications should not be placed on the same branch
442as the distributed source; instead, they should be placed on a side branch.
443When the next software distribution arrives,
444it should be appended to the trunk of
445the customer's RCS file, and the customer
446can then merge the local modifications back into the new release.
447In the above example, a
448customer's RCS file would contain the following tree, assuming
449that the customer has received revision 1.3, added his local modifications
450as revision 1.3.1.1, then received revision 2.4, and merged
4512.4 and 1.3.1.1, resulting in 2.4.1.1.
452.ne 7
453.PS 4i
454.ps -2
455R13: box "1.3"
456 line invis
457R21: box invis
458 line invis
459R22: box invis
460 line invis
461R24: box "2.4"
462 line invis
463R25: box invis
464 line invis
465 arrow from R13.e to R24.w
466 line invis down from R21.s
467RB1: box "1.3.1.1"
468 arrow from R13.s to RB1.w
469 right
470 line invis down from R25.s
471RB2: box "2.4.1.1"
472 arrow from R24.s to RB2.w
473.ps +2
474.PE
475.ce 1
476Figure 4. A customer's revision tree with local modifications.
477.sp 1
478This approach is actually practiced in the CSNET project,
479where several universities and a company cooperate
480in developing a national computer network.
481.IP "\fIParallel development\fR"
482.sp 0
483Sometimes it is desirable to explore an alternate design or
484a different implementation technique in parallel with the
485main line development. Such development
486should be carried out on a side branch.
487The experimental changes may later be moved into the main line, or abandoned.
488.IP "\fIConflicting updates\fR"
489.sp 0
490A common occurrence is that one programmer
491has checked out a revision, but cannot complete the assignment
492for some reason. In the meantime, another person
493must perform another modification
494immediately. In that case, the second person should check-out the same revision,
495modify it, and check it in on a side branch, for later merging.
496.PP
497Every node in a revision tree consists of the following attributes:
498a revision number, a check-in date and time, the author's identification,
499a log entry, a state and the actual text. All these attributes
500are determined at the time the revision is checked in.
501The state attribute indicates the status of a revision.
502It is set automatically to `experimental' during check-in.
503A revision can later be promoted to a higher status, for example
504`stable' or `released'. The set of states is user-defined.
505.NH 2
506Revisions are represented as deltas
507.PP
508For conserving space, RCS stores revisions in the form
509of deltas, i.e., as differences between revisions.
510The user interface completely hides this fact.
511.PP
512A delta is a sequence of edit commands that transforms one string
513into another. The deltas employed by RCS are line-based, which means
514that the only edit commands allowed are insertion and deletion of lines.
515If a single character in a line is changed, the
516edit scripts consider the entire line changed.
517The program \fIdiff\fR\u2\d
518produces a small, line-based delta between pairs of text files.
519A character-based edit script would take much longer to compute,
520and would not be significantly shorter.
521.PP
522Using deltas is a classical space-time tradeoff: deltas reduce the
523space consumed, but increase access time.
524However, a version control tool should impose as little delay
525as possible on programmers.
526Excessive delays discourage the use of version controls,
527or induce programmers to take shortcuts that compromise system integrity.
528To gain reasonably fast access time for both editing and compiling,
529RCS arranges deltas in the following way.
530The most recent revision on the trunk is stored intact.
531All other revisions on the trunk are stored as reverse deltas.
532A reverse delta describes how to go backward in the development history:
533it produces the desired revision if applied to the successor of that revision.
534This implementation has the advantage
535that extraction of the latest revision is a simple and fast copy
536operation.
537Adding a new revision to the trunk is also fast: \fIci\fR simply
538adds the new revision intact, replaces the previous
539revision with a reverse delta, and keeps the rest of the old deltas.
540Thus, \fIci\fR requires the computation
541of only one new delta.
542.PP
543Branches need special treatment. The naive solution would be to
544store complete copies for the tips of all branches.
545Clearly, this approach would cost too much space. Instead,
546RCS uses \fIforward\fR deltas for branches. Regenerating a revision
547on a side branch proceeds as follows. First, extract the latest revision
548on the trunk; secondly, apply reverse deltas until the fork revision for
549the branch is obtained; thirdly, apply forward deltas until the desired
550branch revision is reached. Figure 5 illustrates a tree with
551one side branch. Triangles pointing to the left and right represent
552reverse and forward deltas, respectively.
553.ne 8
554.PS 4i
555.ps -2
556define BD X [line invis $1 right .5;
557line up .3 then left .5 down .3 then right .5 down .3 then up .3] X
558
559define FD X [line invis $1 right .5;
560line left .5 down .3 then up .6 then right .5 down .3;] X
561
562right
563D11: BD(" 1.1")
564 arrow right from D11.e
565D12: BD(" 1.2")
566 arrow right from D12.e
567D13: BD(" 1.3")
568 arrow right from D13.e
569D21: BD(" 2.1")
570 arrow right from D21.e
571D22: box "2.2"
572 line invis down from D21.s
573F1: FD("1.3.1.1 ")
574 arrow from D13.se to F1.w
575 arrow from F1.e right
576 right
577F2: FD("1.3.1.2 ")
578.ps +2
579.PE
580.ce 1
581Figure 5. A revision tree with reverse and forward deltas.
582.sp 0
583.PP
584Although implementing fast check-out for the latest trunk revision,
585this arrangement has the disadvantage that generation of other revisions
586takes time proportional to the number of deltas applied. For example,
587regenerating the branch tip in Figure 5 requires application of five
588deltas (including the initial one). Since usage statistics show that
589the latest trunk revision is the one that is retrieved in 95 per cent
590of all cases (see the section on usage statistics), biasing check-out time
591in favor of that revision results in significant savings.
592However, careful implementation of the delta application process is
593necessary to provide low retrieval overhead for other revisions, in
594particular for branch tips.
595.PP
596There are several techniques for delta application.
597The naive one is to pass each delta to a general-purpose text editor.
598A prototype of RCS invoked the UNIX editor \fIed\fR both
599for applying deltas and for expanding the identification markers.
600Although easy to implement, performance was poor, owing to the
601high start-up costs and excess generality of \fIed\fR. An intermediate
602version of RCS used a special-purpose, stream-oriented editor.
603This technique reduced the cost of applying a delta to the cost of
604checking out the latest trunk revision. The reason for this behavior
605is that each delta application involves a complete pass over
606the preceding revision.
607.PP
608However, there is a much better algorithm. Note that the deltas are
609line oriented and that most of the work of a stream editor involves
610copying unchanged lines from one revision to the next. A faster
611algorithm avoids unnecessary copying of character strings by using
612a \fIpiece table\fR.
613A piece table is a one-dimensional array, specifying how a given
614revision is `pieced together' from lines in the RCS file.
615Suppose piece table \fIPT\dr\u\fR represents revision \fIr\fR.
616Then \fIPT\dr\u[i]\fR contains the starting position of line \fIi\fR
617of revision \fIr\fR.
618Application of the next delta transforms piece table \fIPT\dr\u\fR
619into \fIPT\dr+1\u\fR. For instance, a delete command removes a
620series of entries from the piece table. An insertion command inserts
621new entries, moving the entries following the insertion point further down the
622array. The inserted entries point to the text lines in the delta.
623Thus, no I/O is involved except for reading the delta itself. When all
624deltas have been applied to the piece table, a sequential pass
625through the table looks up each line in the RCS file and copies it to
626the output file, updating identification markers at the same time.
627Of course, the RCS file must permit random access, since the copied
628lines are scattered throughout that file. Figure 6 illustrates an
629RCS file with two revisions and the corresponding piece tables.
630.ne 13
631.sp 12
632.ce 1
633Figure 6. An RCS file and its piece tables
634.sp 0
635.PP
636The piece table approach has the property that the time for applying a single
637delta is roughly determined by the size of the delta, and not by the
638size of the revision. For example, if a delta is
63910 per cent of the size of a revision, then applying it takes only
64010 per cent of the time to generate the latest trunk revision. (The stream
641editor would take 100 per cent.)
642.PP
643There is an important alternative for representing deltas that affects
644performance. SCCS\u3\d,
645a precursor of RCS, uses \fIinterleaved\fR deltas.
646A file containing interleaved deltas is partitioned into blocks of lines.
647Each block has a header that specifies to which revision(s) the block
648belongs. The blocks are sorted out in such a way that a single
649pass over the file can pick up all the lines belonging to a given
650revision. Thus, the regeneration time for all revisions is the same:
651all headers must be inspected, and the associated blocks either copied
652or skipped. As the number of revisions increases, the cost of retrieving
653any revision is much higher than the cost of checking out the
654latest trunk revision with reverse deltas. A detailed comparison
655of SCCS's interleaved deltas and RCS's reverse deltas can be found
656in Reference 4.
657This reference considers the version of RCS with the
658stream editor only. The piece table method improves performance
659further, so that RCS is always faster than SCCS, except if 10
660or more deltas are applied.
661.PP
662Additional speed-up for both delta methods can be obtained by caching
663the most recently generated revision, as has been implemented in DSEE.\u5\d
664With caching, access time to frequently used revisions can approach normal file
665access time, at the cost of some additional space.
666.NH
667Locking: A Controversial Issue
668.PP
669The locking mechanism for RCS was difficult to design.
670The problem and its solution are first presented in their `pure' form,
671followed by a discussion of the complications
672caused by `real-world' considerations.
673.PP
674RCS must prevent two or more persons from depositing competing changes of the
675same revision.
676Suppose two programmers check out revision 2.4 and
677modify it. Programmer A checks in a revision before programmer B.
678Unfortunately, programmer B has not seen A's
679changes, so the effect is that A's changes are covered up by B's deposit.
680A's changes are not lost since all revisions
681are saved, but they are confined to a single revision\(dd.
682.FS
683\(dd Note that this problem is entirely different from the atomicity problem.
684Atomicity means that
685concurrent update operations on the same RCS file cannot be permitted,
686because that may result in inconsistent data.
687Atomic updates are essential (and implemented in RCS),
688but do not solve the conflict discussed here.
689.FE
690.PP
691This conflict is prevented in RCS by locking.
692Whenever someone intends to edit a revision (as opposed
693to reading or compiling it), the revision should be checked out
694and locked,
695using the \fI-l\fR option on \fIco\fR. On subsequent check-in,
696\fIci\fR tests the lock and then removes it.
697At most one programmer at a time may
698lock a particular revision, and only this programmer may check in
699the succeeding revision.
700Thus, while a revision is locked, it is the exclusive responsibility
701of the locker.
702.PP
703An important maxim for software tools like RCS is that they must
704not stand in the way of making progress with a project.
705This consideration leads to several weakenings of the locking mechanism.
706First of all, even if a revision is locked, it can
707still be checked out. This is necessary if other people
708wish to compile or inspect the locked revision
709while the next one is in preparation. The only operations they
710cannot do are to lock the revision or to check in the succeeding one. Secondly,
711check-in operations on other branches in the RCS file are still possible; the
712locking of one revision does not affect any other revision.
713Thirdly, revisions are occasionally locked for a long period of time
714because a programmer is absent or otherwise unable to complete
715the assignment. If another programmer has to make a pressing change,
716there are the following three alternatives for making progress:
717a) find out who is holding the lock and ask that person to release it;
718b) check out the locked revision, modify it, check it
719in on a branch, and merge the changes later;
720c) break the lock. Breaking a lock leaves a highly visible
721trace, namely an electronic mail message that is sent automatically to the
722holder of the lock, recording the breaker and a commentary requested from him.
723Thus, breaking locks is tolerated under certain circumstances,
724but will not go unnoticed.
725Experience has shown that the automatic mail message attaches a high enough
726stigma to lock breaking,
727such that programmers break locks only in real emergencies,
728or when a co-worker resigns and leaves locked revisions behind.
729.PP
730If an RCS file is private, i.e., when a programmer owns an RCS file
731and does not expect anyone else to perform check-in operations,
732locking is an unnecessary nuisance.
733In this case,
734the `strict locking feature' discussed earlier may be disabled,
735provided that file protection
736is set such that only the owner may write the RCS file.
737This has the effect that only the owner can check-in revisions,
738and that no lock is needed for doing so.
739.PP
740As added protection,
741each RCS file contains an access list that specifies the users
742who may execute update operations. If an access list is empty,
743only normal UNIX file protection applies. Thus, the access list is
744useful for restricting the set of people who would otherwise have update
745permission. Just as with locking, the access list
746has no effect on read-only operations such as \fIco\fR. This approach
747is consistent with the UNIX philosophy of openness, which contributes
748to a productive software development environment.
749.NH
750Configuration Management
751.PP
752The preceding sections described how RCS deals with revisions of individual
753components; this section discusses how to handle configurations.
754A configuration is a set of revisions, where each revision comes
755from a different revision group, and the revisions are selected
756according to a certain criterion.
757For example,
758in order to build a functioning compiler, the `right'
759revisions from the scanner, the parser, the optimizer
760and the code generator must be combined.
761RCS, in conjunction with MAKE,
762provides a number of facilities to effect a smooth selection.
763.NH 2
764RCS Selection Functions
765.PP
766.IP "\fIDefault selection\fR"
767.sp 0
768During development, the usual selection criterion is to choose
769the latest revision of all components. The \fIco\fR command
770makes this selection by default. For example, the command
771.D(
772co *,v
773.D)
774retrieves the latest revision on the default branch of each RCS file
775in the current directory.
776The default branch is usually the trunk, but may be
777set to be a side branch.
778Side branches as defaults are needed in distributed software development,
779as discussed in the section on the RCS revision tree.
780
781.IP "\fIRelease based selection\fR"
782.sp 0
783Specifying a release or branch number selects the latest revision in
784that release or branch.
785For instance,
786.D(
787co -r2 *,v
788.D)
789retrieves the latest revision with release number 2 from each RCS file.
790This selection is convenient if a release has been completed and
791development has moved on to the next release.
792
793.IP "\fIState and author based selection\fR"
794.sp 0
795If the highest level number within a given release number
796is not the desired one,
797the state attribute can help. For example,
798.D(
799co -r2 -sReleased *,v
800.D)
801retrieves the latest revision with release number 2 whose state attribute
802is `Released'.
803Of course, the state attribute has to be set appropriately, using the
804\fIci\fR or \fIrcs\fR commands.
805Another alternative is to select a revision by its author,
806using the \fI-w\fR option.
807
808.IP "\fIDate based selection\fR"
809.sp 0
810Revisions may also be selected by date.
811Suppose a release of an entire system was
812completed and current on March 4, at 1:00 p.m. Then the command
813.D(
814co -d"March 4, 1:00 pm" *,v
815.D)
816checks out all the components of that release, independent of the numbering.
817The \fI-d\fR option specifies a `cutoff date', i.e.,
818the revision selected has a check-in date that
819is closest to, but not after the date given.
820208z
821.IP "\fIName based selection\fR"
822.sp 0
823The most powerful selection function is based on assigning symbolic
824names to revisions and branches.
825In large systems, a single release number or date is not sufficient
826to collect the appropriate revisions from all groups.
827For example, suppose one wishes to combine release 2
828of one subsystem and release 15 of another.
829Most likely, the creation dates of those releases differ also.
830Thus, a single revision number or date passed to the \fIco\fR command
831will not suffice to select the right revisions.
832Symbolic revision numbers solve this problem.
833Each RCS file may contain a set of symbolic names that are mapped
834to numeric revision numbers. For example, assume
835the symbol \fIV3\fR is bound to release number 2 in file \fIs,v\fR, and to
836revision number 15.9 in \fIt,v\fR.
837Then the single command
838.D(
839co -rV3 s,v t,v
840.D)
841retrieves the latest revision of release 2 from \fIs,v\fR,
842and revision 15.9 from \fIt,v\fR.
843In a large system with many modules, checking out all
844revisions with one command greatly simplifies configuration management.
845.PP
846Judicious use of symbolic revision numbers helps with organizing
847large configurations.
848A special command, \fIrcsfreeze\fR,
849assigns a symbolic revision number to a selected revision
850in every RCS file.
851\fIRcsfreeze\fR effectively freezes a configuration.
852The assigned symbolic revision number selects all components
853of the configuration.
854If necessary, symbolic numbers
855may even be intermixed with numeric ones. Thus, \fIV3.5\fR in the
856above example
857would select revision 2.5 in \fIs,v\fR and branch 15.9.5 in \fIt,v\fR.
858.PP
859The options \fI-r\fR, \fI-s\fR, \fI-w\fR and \fI-d\fR
860may be combined. If a branch is given, the latest revision
861on that branch satisfying all conditions is retrieved;
862otherwise, the default branch is used.
863.NH 2
864Combining MAKE and RCS
865.PP
866MAKE\u1\d
867is a program that processes configurations.
868It is driven by configuration specifications
869recorded in a special file, called a `Makefile'.
870MAKE avoids redundant processing steps
871by comparing creation dates of source and processed objects.
872For example, when instructed to compile all
873modules of a given system, it only recompiles
874those source modules that were changed
875since they were processed last.
876.PP
877MAKE has been extended with an auto-checkout feature for RCS.
878When a certain file to be processed is not present,
879MAKE attempts a check-out operation.
880If successful, MAKE performs the required processing, and then deletes
881the checked out file to conserve space.
882The selection parameters discussed above can be passed to MAKE
883either as parameters, or directly embedded in the Makefile.
884MAKE has also been extended to search the subdirectory named \fIRCS\fR
885for needed files, rather than just the current working directory.
886However, if a working file is present, MAKE totally ignores the corresponding
887RCS file and uses the working file.
888(In newer versions of MAKE distributed by AT&T and others,
889auto-checkout can be
890achieved with the rule DEFAULT, instead of a special extension of MAKE.
891However, a file checked out by the rule DEFAULT
892will not be deleted after processing. \fIRcsclean\fR can be
893used for that purpose.)
894.PP
895With auto-checkout, RCS/MAKE can effect a selection rule
896especially tuned for multi-person software development and maintenance.
897In these situations,
898programmers should obtain configurations that consist of
899the revisions they have personally checked out plus the latest
900checked in revision of all other revision groups.
901This schema can be set up as follows.
902.PP
903Each programmer chooses a working directory
904and places into it a symbolic link, named \fIRCS\fR,
905to the directory containing the relevant RCS files.
906The symbolic link makes sure that \fIco\fR and \fIci\fR
907operations need only specify the working files, and that
908the Makefile need not be changed.
909The programmer then checks out the needed files and modifies them.
910If MAKE is invoked,
911it composes configurations by selecting those
912revisions that are checked out, and the rest from the
913subdirectory \fIRCS\fR.
914The latter selection may be controlled by a symbolic
915revision number or any of the other selection criteria.
916If there are several programmers editing in separate working directories,
917they are insulated from each other's changes until checking in their
918modifications.
919.PP
920Similarly, a maintainer can recreate an older configuration
921by starting to work in an empty working directory.
922During the initial MAKE invocation, all revisions are selected from RCS files.
923As the maintainer checks out files and modifies them,
924a new configuration is gradually built up.
925Every time MAKE is invoked, it substitutes the modified revisions
926into the configuration being manipulated.
927.PP
928A final application of RCS is to use it for storing Makefiles.
929Revision groups of Makefiles represent
930multiple versions of configurations.
931Whenever a configuration is baselined or distributed,
932the best approach is to unambiguously fix
933the configuration with a symbolic revision number by calling
934\fIrcsfreeze\fR,
935to embed that symbol into the Makefile, and to
936check in the Makefile (using the same symbolic revision number).
937With this approach, old configurations
938can be regenerated easily and reliably.
939.NH
940Usage Statistics
941.PP
942The following usage statistics were collected on two DEC VAX-11/780
943computers of the Purdue Computer Science Department. Both machines
944are mainly used for research purposes. Thus, the data
945reflect an environment in which the majority of projects
946involve prototyping and advanced software development,
947but relatively little long-term maintenance.
948.PP
949For the first experiment,
950the \fIci\fR and \fIco\fR operations were instrumented
951to log the number of backward and forward deltas applied.
952The data were collected during a 13 month period
953from Dec. 1982 to Dec. 1983.
954Table I summarizes the results.
955.sp 0
956.nr VS 12pts
957.vs 12pts
958.TS
959center,box,tab(#);
960c|c|c|c|c s|c s
961c|c|c|c|c s|c s
962l|n|n|n|n n|n n.
963Operation#Total#Total deltas#Mean deltas#Operations#Branch
964 #operations #applied#applied#with >1 delta#operations
965_
966co # 7867# 9320#1.18#509#(6%)#203#(3%)
967ci # 3468# 2207#0.64# 85#(2%)# 75#(2%)
968ci & co#11335#11527#1.02#594#(5%)#278#(2%)
969.TE
970.ce 1
971Table I. Statistics for \fIco\fR and \fIci\fR operations.
972.nr VS 18pts
973.vs 18pts
974.PP
975The first two lines show statistics for check-out and check-in;
976the third line shows the combination.
977Recall that \fIci\fR performs an implicit check-out to obtain
978a revision for computing the delta.
979In all measures presented, the most recent revision (stored intact)
980counts as one delta. The number of deltas applied represents
981the number of passes necessary, where the first `pass' is a copying step.
982.PP
983Note that the check-out operation is executed more than
984twice as frequently as the check-in operation.
985The fourth column gives the mean number of deltas
986applied in all three cases.
987For \fIci\fR, the mean number of deltas applied is less
988than one.
989The reasons are that the initial check-in requires no delta at all, and that
990the only time \fIci\fR requires more than one delta is for branches.
991Column 5 shows the actual number of operations that applied more than one
992delta.
993The last column indicates that branches were not used often.
994.PP
995The last three columns demonstrate that the most recent trunk revision
996is by far the most frequently accessed.
997For RCS, check-out of
998this revision is a simple copy operation, which is the absolute minimum
999given the copy-semantics of \fIco\fR.
1000Access to older revisions and branches
1001is more common in non-academic environments,
1002yet even if access to older deltas were an order
1003of magnitude more frequent,
1004the combined average number of deltas applied would still be below 1.2.
1005Since RCS is faster than SCCS until up to 10 delta applications,
1006reverse deltas are clearly the method of choice.
1007.PP
1008The second experiment, conducted in March of 1984,
1009involved surveying the existing RCS files
1010on our two machines. The goal was to determine the mean number of
1011revisions per RCS file, as well as the space consumed by them.
1012Table II shows the results. (Tables I and II were produced at different
1013times and are unrelated.)
1014.sp 0
1015.nr VS 12pts
1016.vs 12pts
1017.TS
1018center,box,tab(#);
1019c | c | c | c | c | c | c
1020c | c | c | c | c | c | c
1021l | n | n | n | n | n | n
1022.
1023 #Total RCS#Total#Mean#Mean size of#Mean size of#Overhead
1024 #files#revisions#revisions#RCS files#revisions
1025_
1026All files #8033#11133#1.39#6156#5585#1.10
1027Files with#1477# 4578#3.10#8074#6041#1.34
1028\(>= 2 deltas
1029.TE
1030.ce 1
1031Table II. Statistics for RCS files.
1032.nr VS 18pts
1033.vs 18pts
1034.PP
1035The mean number of revisions per RCS file is 1.39.
1036Columns 5 and 6 show the mean sizes (in bytes) of an RCS file
1037and of the latest revision of each RCS file, respectively.
1038The `overhead' column contains the ratio of the mean sizes.
1039Assuming that all revisions in an RCS file are approximately the same size,
1040this ratio gives a measure of the space consumed by the extra revisions.
1041.PP
1042In our sample, over 80 per cent of the RCS files contained only a single revision.
1043The reason is that our
1044systems programmers routinely check in all source files
1045on the distribution tapes, even though they may never touch them again.
1046To get a better indication of how much space savings are possible
1047with deltas, all measures with those files
1048that contained 2 or more revisions were recomputed. Only for those files
1049is RCS necessary.
1050As shown in the second line, the average number of revisions for those files is
10513.10, with an overhead of 1.34. This means that the extra 2.10 deltas
1052require 34 per cent extra space, or
105316 per cent per extra revision.
1054Rochkind\u3\d
1055measured the space consumed by SCCS, and
1056reported an average of 5 revisions per group
1057and an overhead of 1.37 (or about 9 per cent per extra revision).
1058In a later paper, Glasser\u6\d
1059observed an average of 7 revisions per group in a single, large project,
1060but provided no overhead figure.
1061In his paper on DSEE\u5\d,
1062Leblang reported that delta storage combined with blank compression
1063results in an overhead of a mere 1\-2 per cent per revision.
1064Since leading blanks accounted for about 20 per cent of the surveyed Pascal
1065programs, a revision group with 5\-10 members was smaller
1066than a single cleartext copy.
1067.PP
1068The above observations demonstrate clearly that the space needed
1069for extra revisions is small. With delta storage, the luxury of
1070keeping multiple revisions online is certainly affordable.
1071In fact, introducing a system with delta storage may reduce
1072storage requirements, because programmers often save back-up copies
1073anyway. Since back-up copies are stored much more efficiently with deltas,
1074introducing a system such as RCS may
1075actually free a considerable amount of space.
1076.NH
1077Survey of Version Control Tools
1078.PP
1079The need to keep back-up copies of software arose when
1080programs and data were no longer stored on paper media, but were entered
1081from terminals and stored on disk.
1082Back-up copies are desirable for reliability, and many modern editors
1083automatically save a back-up copy for every file touched.
1084This strategy
1085is valuable for short-term back-ups, but not suitable for long-term
1086version control, since an existing back-up copy is overwritten whenever the
1087corresponding file is edited.
1088.PP
1089Tape archives are suitable for long-term, offline storage.
1090If all changed files are dumped on a back-up tape once per day, old revisions
1091remain accessible. However, tape archives are unsatisfactory
1092for version control in several ways. First, backing up the file
1093system every 24 hours does not capture intermediate revisions.
1094Secondly, the old revisions are not online,
1095and accessing them is tedious and time-consuming.
1096In particular, it is impractical to
1097compare several old revisions of a group,
1098because that may require mounting and searching several tapes.
1099Tape archives are important fail-safe tools in the
1100event of catastrophic disk failures or accidental deletions,
1101but they are ill-suited for version control.
1102Conversely, version control tools do not obviate the
1103need for tape archives.
1104.PP
1105A natural technique for keeping several old revisions online is
1106to never delete a file.
1107Editing a file
1108simply creates a new file with the same
1109name, but with a different sequence number.
1110This technique, available as an option in DEC's VMS operating system,
1111turns out to be inadequate for version control.
1112First, it is prohibitively expensive in terms of storage costs,
1113especially since no data compression techniques are employed.
1114Secondly, indiscriminately storing every change produces too many
1115revisions, and programmers have difficulties distinguishing them.
1116The proliferation of revisions forces programmers to spend much time on
1117finding and deleting useless files.
1118Thirdly, most of the support functions like locking, logging,
1119revision selection,
1120and identification described in this paper are not available.
1121.PP
1122An alternative approach is to separate editing from revision control.
1123The user may repeatedly edit a given revision,
1124until freezing it with an explicit command.
1125Once a revision is frozen, it is stored permanently and can no longer be modified.
1126(In RCS, freezing a revisions is done with \fIci\fR.)
1127Editing a frozen revision implicitly creates a new one, which
1128can again be changed repeatedly until it is frozen itself.
1129This approach saves exactly those revisions that the user
1130considers important, and keeps the number of revisions manageable.
1131IBM's CLEAR/CASTER\u7\d,
1132AT&T's SCCS\u3\d,
1133CMU's SDC\u8\d
1134and DEC's CMS\u9\d,
1135are examples of version control systems using this approach.
1136CLEAR/CASTER maintains a data base of programs, specifications,
1137documentation and messages, using deltas.
1138Its goal is to provide control over the development process from a
1139management viewpoint.
1140SCCS stores multiple revisions of source text in an ancestral tree,
1141records a log entry for each revision,
1142provides access control, and has facilities
1143for uniquely identifying each revision.
1144An efficient delta technique
1145reduces the space consumed by each revision group.
1146SDC is much simpler than SCCS because it stores not more than
1147two revisions. However, it maintains a complete log for all old
1148revisions, some of which may be on back-up tape.
1149CMS, like SCCS, manages tree-structured revision groups,
1150but offers no identification mechanism.
1151.PP
1152Tools for dealing with configurations are still in a state of flux.
1153SCCS, SDC and CMS can be combined with MAKE or MAKE-like programs.
1154Since flexible selection rules are missing from all these tools,
1155it is sometimes difficult
1156to specify precisely which revision of each group
1157should be passed to MAKE for building a desired configuration.
1158The Xerox Cedar system\u10\d
1159provides a `System Modeller' that can rebuild
1160a configuration from an arbitrary set of module revisions.
1161The revisions of a module are only distinguished by creation time,
1162and there is no tool for managing groups.
1163Since the selection rules are primitive,
1164the System Modeller appears to be somewhat tedious to use.
1165Apollo's DSEE\u5\d
1166is a sophisticated software engineering environment.
1167It manages revision groups in a way similar to SCCS and CMS. Configurations
1168are built using `configuration threads'.
1169A configuration thread states which revision of each group
1170named in a configuration should be chosen.
1171A configuration thread may contain dynamic specifiers
1172(e.g., `choose the revisions I am currently working on,
1173and the most recent revisions otherwise'), which are bound
1174automatically at build time.
1175It also provides a notification mechanism for alerting
1176maintainers about the need to rebuild a system after a change.
1177.PP
1178RCS is based on a general model for describing
1179multi-version/multi-configuration systems\u11\d.
1180The model describes systems using AND/OR graphs, where AND nodes represent
1181configurations, and OR nodes represent version groups.
1182The model gives rise to a suit of selection rules for
1183composing configurations, almost all of which are implemented in RCS.
1184The revisions selected by RCS are passed to MAKE for configuration building.
1185Revision group management is modelled after SCCS.
1186RCS retains SCCS's best features,
1187but offers a significantly simpler user interface,
1188flexible selection rules, adequate integration with MAKE
1189and improved identification.
1190A detailed comparison of RCS and SCCS appears in Reference 4.
1191.PP
1192An important component of all revision control systems
1193is a program for computing deltas.
1194SCCS and RCS use the program \fIdiff\fR\u2\d,
1195which first computes the longest common substring of two
1196revisions, and then produces the delta from that substring.
1197The delta is simply an edit script consisting of deletion and
1198insertion commands that generate one revision from the other.
1199.PP
1200A delta based on a longest common substring is not necessarily minimal,
1201because it does not take advantage of crossing block moves.
1202Crossing block moves arise if two or more blocks of lines
1203(e.g., procedures)
1204appear in a different order in two revisions.
1205An edit script derived from a longest common substring
1206first deletes the shorter of the two blocks, and then reinserts it.
1207Heckel\u12\d
1208proposed an algorithm for detecting block moves, but
1209since the algorithm is based on heuristics,
1210there are conditions
1211under which the generated delta is far from minimal.
1212DSEE uses this algorithm combined with blank compression,
1213apparently with satisfactory overall results.
1214A new algorithm that is guaranteed to produce a minimal delta based on
1215block moves appears in Reference 13.
1216A future release of RCS will use this algorithm.
1217.PP
1218\fIAcknowledgements\fR:
1219Many people have helped make RCS a success by contributed criticisms, suggestions,
1220corrections, and even whole new commands (including manual pages).
1221The list of people is too long to be
1222reproduced here, but my sincere thanks for their help and
1223goodwill goes to all of them.
1224
1225.nr VS 12 pts
1226.vs 12pts
1227.SH
1228Appendix: Synopsis of RCS Operations
1229.LP
1230.IP "\fIci \fB\- check in revisions\fR"
1231.sp 0
1232\fICi\fR stores the contents of a working file into the
1233corresponding RCS file as a new revision.
1234If the RCS file doesn't exist, \fIci\fR creates it.
1235\fICi\fR removes the working file, unless one of the options
1236\fI-u\fR or \fI-l\fR is present.
1237For each check-in, \fIci\fR asks for a commentary
1238describing the changes relative to the previous revision.
1239.sp 1
1240\fICi\fR assigns the revision number given by the \fI-r\fR option;
1241if that option is missing, it derives the number from the
1242lock held by the user; if there is no lock and locking is not strict,
1243\fIci\fR increments the number of the latest revision on the trunk.
1244A side branch can only be started by explicitly specifying its
1245number with the \fI-r\fR option during check-in.
1246.sp 1
1247\fICi\fR also determines
1248whether the revision to be checked in is different from the
1249previous one, and asks whether to proceed if not.
1250This facility simplifies check-in operations for large systems,
1251because one need not remember which files were changed.
1252.sp 1
1253The option \fI-k\fR searches the checked in file for identification
1254markers containing
1255the attributes
1256revision number, check-in date, author and state, and assigns these
1257to the new revision rather than computing them. This option is
1258useful for software distribution: Recipients of distributed software
1259using RCS should check in updates with the \fI-k\fR option.
1260This convention guarantees that revision numbers, check-in dates,
1261etc., are the same at all sites.
1262.IP "\fIco \fB\- check out revisions\fR"
1263.sp 0
1264\fICo\fR retrieves revisions according to revision number,
1265date, author and state attributes. It either places the revision
1266into the working file, or prints it on the std. output.
1267\fICo\fR always expands the identification markers.
1268.IP "\fIident \fB\- extract identification markers\fR"
1269.sp 0
1270\fIIdent\fR extracts the identification markers expanded by \fIco\fR
1271from any file and prints them.
1272.IP "\fIrcs \fB\- change RCS file attributes\fR"
1273.sp 0
1274\fIRcs\fR is an administrative operation that changes access lists,
1275locks, unlocks, breaks locks, toggles the strict-locking feature,
1276sets state attributes and symbolic revision numbers, changes the
1277description, and deletes revisions. A revision can
1278only be deleted if it is not the fork of a side branch.
1279.IP "\fIrcsclean \fB\- clean working directory\fR"
1280.sp 0
1281\fIRcsclean\fR removes working files that were checked out but never changed.
1282.IP "\fIrcsdiff \fB\- compare revisions\fR"
1283.sp 0
1284\fIRcsdiff\fR compares two revisions and prints their
1285difference, using the UNIX tool \fIdiff\fR.
1286One of the revisions compared may be checked out.
1287This command is useful for finding out about changes.
1288.IP "\fIrcsfreeze \fB\- freeze a configuration\fR"
1289.sp 0
1290\fIRcsfreeze\fR assigns the same symbolic revision number
1291to a given revision in all RCS files.
1292This command is useful for accurately recording a configuration.
1293.IP "\fIrcsmerge \fB\- merge revisions\fR"
1294.sp 0
1295\fIRcsmerge\fR merges two revisions, \fIrev1\fR and \fIrev2\fR,
1296with respect to a common ancestor.
1297A 3-way file comparison determines the segments of lines that
1298are (a) the same in all three revisions, or (b) the same in 2 revisions,
1299or (c) different in all three. For all segments of type (b) where
1300\fIrev1\fR is the differing revision,
1301the segment in \fIrev1\fR replaces the corresponding segment of \fIrev2\fR.
1302Type (c) indicates an overlapping change, is flagged as an error, and requires user
1303intervention to select the correct alternative.
1304.IP "\fIrlog \fB\- read log messages\fR"
1305.sp 0
1306\fIRlog\fR prints the log messages and other information in an RCS file.
1307.bp
1308.LP
1309.nr VS 12 pts
1310.vs 12pts
1311.]<
1312.ds [F 1
1313.]-
1314.ds [K FELD02
1315.ds [K MakeArticle
1316.ds [A Feldman, Stuart I.
1317.ds [D March 1979
1318.ds [T Make - A Program for Maintaining Computer Programs
1319.ds [J Software -- Practice and Experience
1320.ds [V 9
1321.ds [N 3
1322.ds [P 255-265
1323.nr [P 1
1324.nr [T 0
1325.nr [A 1
1326.nr [O 0
1327.][ 1 journal-article
1328.ds [F 2
1329.]-
1330.ds [K HUNT01
1331.ds [T An Algorithm for Differential File Comparison
1332.ds [A Hunt, James W.
1333.as [A " and McIlroy, M. D.
1334.ds [I Computing Science Technical Report, Bell Laboratories
1335.ds [R 41
1336.ds [D June 1976
1337.nr [T 0
1338.nr [A 1
1339.nr [O 0
1340.][ 4 tech-report
1341.ds [F 3
1342.]-
1343.ds [K SCCS
1344.ds [A Rochkind, Marc J.
1345.ds [D Dec. 1975
1346.ds [T The Source Code Control System
1347.ds [J IEEE Transactions on Software Engineering
1348.ds [V SE-1
1349.ds [N 4
1350.ds [P 364-370
1351.nr [P 1
1352.nr [T 0
1353.nr [A 1
1354.nr [O 0
1355.][ 1 journal-article
1356.ds [F 4
1357.]-
1358.ds [K TICH08
1359.ds [T Design, Implementation, and Evaluation of a Revision Control System
1360.ds [A Tichy, Walter F.
1361.ds [B Proceedings of the 6th International Conference on Software Engineering
1362.ds [I ACM, IEEE, IPS, NBS
1363.ds [D September 1982
1364.ds [P 58-67
1365.nr [P 1
1366.nr [T 0
1367.nr [A 1
1368.nr [O 0
1369.][ 3 article-in-book
1370.ds [F 5
1371.]-
1372.ds [K LEBL01
1373.ds [A Leblang, David B.
1374.as [A " and Chase, Robert P.
1375.ds [T Computer-Aided Software Engineering in a Distributed Workstation Environment
1376.ds [O Proceedings of the ACM SIGSOFT/SIGPLAN Software Engineering Symposium
1377.as [O " on Practical Software Development Environments.
1378.ds [J SIGPLAN Notices
1379.ds [V 19
1380.ds [N 5
1381.ds [D May 1984
1382.ds [P 104-112
1383.nr [P 1
1384.nr [T 0
1385.nr [A 1
1386.nr [O 0
1387.][ 1 journal-article
1388.ds [F 1
1389.ds [F 3
1390.ds [F 6
1391.]-
1392.ds [K SCCSEval
1393.ds [A Glasser, Alan L.
1394.ds [D Nov. 1978
1395.ds [T The Evolution of a Source Code Control System
1396.ds [J Software Engineering Notes
1397.ds [V 3
1398.ds [N 5
1399.ds [P 122-125
1400.nr [P 1
1401.ds [O Proceedings of the Software Quality and Assurance Workshop.
1402.nr [T 0
1403.nr [A 1
1404.nr [O 1
1405.][ 1 journal-article
1406.ds [F 5
1407.ds [F 7
1408.]-
1409.ds [K IBMClearCaster
1410.ds [A Brown, H.B.
1411.ds [D 1970
1412.ds [T The Clear/Caster System
1413.ds [J Nato Conference on Software Engineering, Rome
1414.nr [T 0
1415.nr [A 1
1416.nr [O 0
1417.][ 1 journal-article
1418.ds [F 3
1419.ds [F 8
1420.]-
1421.ds [K HabermannSDC
1422.ds [A Habermann, A. Nico
1423.ds [D Jan. 1979
1424.ds [T A Software Development Control System
1425.ds [I Technical Report, Carnegie-Mellon University, Department of Computer Science
1426.nr [T 0
1427.nr [A 0
1428.nr [O 0
1429.][ 2 book
1430.ds [F 9
1431.]-
1432.ds [K CMS
1433.ds [A DEC,
1434.ds [T Code Management System
1435.ds [I Digital Equipment Corporation
1436.ds [O Document No. EA-23134-82
1437.ds [D 1982
1438.nr [T 0
1439.nr [A 0
1440.nr [O 0
1441.][ 2 book
1442.ds [F 10
1443.]-
1444.ds [K LAMP01
1445.ds [A Lampson, Butler W.
1446.as [A " and Schmidt, Eric E.
1447.ds [T Practical Use of a Polymorphic Applicative Language
1448.ds [B Proceedings of the 10th Symposium on Principles of Programming Languages
1449.ds [I ACM
1450.ds [P 237-255
1451.nr [P 1
1452.ds [D January 1983
1453.nr [T 0
1454.nr [A 1
1455.nr [O 0
1456.][ 3 article-in-book
1457.ds [F 5
1458.ds [F 11
1459.]-
1460.ds [K TICH07
1461.ds [T A Data Model for Programming Support Environments and its Application
1462.ds [A Tichy, Walter F.
1463.ds [B Automated Tools for Information System Design and Development
1464.ds [E Hans-Jochen Schneider and Anthony I. Wasserman
1465.ds [C Amsterdam
1466.ds [I North-Holland Publishing Company
1467.ds [D 1982
1468.nr [T 0
1469.nr [A 1
1470.nr [O 0
1471.][ 3 article-in-book
1472.ds [F 4
1473.ds [F 2
1474.ds [F 12
1475.]-
1476.ds [K HECK01
1477.ds [T A Technique for Isolating Differences Between Files
1478.ds [A Heckel, Paul
1479.ds [J Communications of the ACM
1480.ds [D April 1978
1481.ds [V 21
1482.ds [N 4
1483.ds [P 264-268
1484.nr [P 1
1485.nr [T 0
1486.nr [A 0
1487.nr [O 0
1488.][ 1 journal-article
1489.ds [F 13
1490.]-
1491.ds [K TICH11
1492.ds [T The String-to-String Correction Problem with Block Moves
1493.ds [A Tichy, Walter F.
1494.ds [D Nov. 1984
1495.ds [J ACM Transactions on Computer Systems
1496.ds [V 2
1497.ds [N 4
1498.ds [P 309-321
1499.nr [P 1
1500.nr [T 0
1501.nr [A 1
1502.nr [O 0
1503.][ 1 journal-article
1504.]>