|
|
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: .]>
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.