Annotation of 43BSDReno/contrib/rcs/doc/rcs.ms, revision 1.1

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

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.