home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Professional / OS2PRO194.ISO / os2 / prgramer / rcs / cvs.doc < prev    next >
Text File  |  1992-01-20  |  32KB  |  669 lines

  1.                           CVS II:
  2.              Parallelizing Software Development
  3.  
  4.  
  5.                        Brian Berliner
  6.  
  7.                         Prisma, Inc.
  8.                   5465 Mark Dabling Blvd.
  9.                 Colorado Springs, CO  80918
  10.                     berliner@prisma.com
  11.  
  12.  
  13.                           ABSTRACT
  14.  
  15.           The program described in this paper  fills  a
  16.      need  in the UNIX community for a freely available
  17.      tool to manage software revision and release  con-
  18.      trol   in   a   multi-developer,  multi-directory,
  19.      multi-group environment.  This tool also addresses
  20.      the  increasing need for tracking third-party ven-
  21.      dor source distributions while trying to  maintain
  22.      local modifications to earlier releases.
  23.  
  24.  
  25. 1.   Background
  26.  
  27.      In large software development projects, it  is  usually
  28. necessary for more than one software developer to be modify-
  29. ing (usually different) modules of  the  code  at  the  same
  30. time.   Some  of  these  code  modifications  are done in an
  31. experimental  sense,  at  least  until  the  code  functions
  32. correctly, and some testing of the entire program is usually
  33. necessary.  Then, the modifications are returned to a master
  34. source  repository  so  that others in the project can enjoy
  35. the new bug-fix or functionality.  In order to manage such a
  36. project, some sort of revision control system is necessary.
  37.  
  38.      Specifically, UNIX[1] kernel development is  an  excel-
  39. lent  example of the problems that an adequate revision con-
  40. trol system must address.  The SunOS[2] kernel  is  composed
  41. of over a thousand files spread across a hierarchy of dozens
  42. of directories.[3] Pieces of the kernel must  be  edited  by
  43. many software  developers  within  an  organization.   While
  44. undesirable  in  theory,  it  is not uncommon to have two or
  45. more people making modifications to the same file within the
  46. kernel  sources  in  order  to  facilitate a desired change.
  47. Existing revision control systems like RCS [Tichy]  or  SCCS
  48. [Bell]  serialize  file  modifications  by allowing only one
  49. developer to have a writable copy of a  particular  file  at
  50. any  one  point  in  time.   That  developer is said to have
  51. "locked" the file  for  his  exclusive  use,  and  no  other
  52. developer  is  allowed  to  check out a writable copy of the
  53. file until the locking developer has finished impeding  oth-
  54. ers'  productivity.   Development  pressures of productivity
  55. and deadlines often force organizations to require that mul-
  56. tiple  developers  be  able to simultaneously edit copies of
  57. the same revision controlled file.
  58.  
  59.      The necessity for multiple  developers  to  modify  the
  60. same    file    concurrently    questions   the   value   of
  61. serialization-based policies in  traditional  revision  con-
  62. trol.  This paper discusses the approach that Prisma took in
  63. adapting a standard revision control system, RCS, along with
  64. an  existing  public-domain collection of shell scripts that
  65. sits atop RCS and  provides  the  basic  conflict-resolution
  66. algorithms.   The resulting program, cvs, addresses not only
  67. the issue of conflict-resolution in a multi-developer  open-
  68. editing environment, but also the issues of software release
  69. control and vendor source support and integration.
  70.  
  71. 2.   The CVS Program
  72.  
  73.      cvs (Concurrent Versions System) is a front end to  the
  74. RCS  revision  control  system  which  extends the notion of
  75. revision control from a collection  of  files  in  a  single
  76. directory  to  a hierarchical collection of directories each
  77. containing revision controlled files.  Directories and files
  78. in  the  cvs system can be combined together in many ways to
  79. form a software release.  cvs provides the functions  neces-
  80. sary  to  manage  these software releases and to control the
  81. concurrent editing of source files among  multiple  software
  82. developers.
  83.  
  84.      The six major features of cvs  are  listed  below,  and
  85. will be described in more detail in the following sections:
  86.  
  87.      1.   Concurrent access  and  conflict-resolution  algo-
  88.           rithms  to  guarantee  that source changes are not
  89.           "lost."
  90.  
  91.      2.   Support for  tracking  third-party  vendor  source
  92.           distributions  while maintaining the local modifi-
  93.           cations made to those sources.
  94.  
  95.      3.   A  flexible  module  database  that   provides   a
  96.           symbolic  mapping  of  names  to  components  of a
  97.           larger software distribution.  This symbolic  map-
  98.           ping provides for location independence within the
  99.           software release and, for example, allows  one  to
  100.           check  out  a  copy  of the "diff" program without
  101.           ever knowing that the sources to  "diff"  actually
  102.           reside in the "bin/diff" directory.
  103.  
  104.      4.   Configurable logging support allows  all  "commit-
  105.           ted"  source  file  changes  to be logged using an
  106.           arbitrary program to save the log  messages  in  a
  107.           file, notesfile, or news database.
  108.  
  109.      5.   A software release can be symbolically tagged  and
  110.           checked  out  at  any  time based on that tag.  An
  111.           exact copy of a previous software release  can  be
  112.           checked  out  at  any  time, regardless of whether
  113.           files or directories have been added/removed  from
  114.           the "current" software release.  As well, a "date"
  115.           can be used to check out the exact version of  the
  116.           software release as of the specified date.
  117.  
  118.      6.   A "patch"  format  file  [Wall]  can  be  produced
  119.           between   two   software  releases,  even  if  the
  120.           releases span multiple directories.
  121.  
  122.      The sources maintained by cvs are kept within a  single
  123. directory  hierarchy  known as the "source repository." This
  124. "source  repository"  holds  the  actual  RCS   ",v"   files
  125. directly,  as  well  as  a  special per-repository directory
  126. (CVSROOT.adm) which contains a small number  of  administra-
  127. tive  files  that  describe the repository and how it can be
  128. accessed.  See Figure 1 for a picture of the cvs tree.
  129.  
  130. 2.1. Software Conflict Resolution[4]
  131.  
  132.      cvs allows several software developers to edit personal
  133. copies  of  a  revision  controlled  file concurrently.  The
  134. revision number of  each  checked  out  file  is  maintained
  135. independently  for each user, and cvs forces the checked out
  136. file to be current with the "head" revision before it can be
  137. "committed"  as  a  permanent change.  A checked out file is
  138. brought  up-to-date  with  the  "head"  revision  using  the
  139. "update"  command  of cvs.  This command compares the "head"
  140. revision number with that of the user's file and performs an
  141. RCS merge operation if they are not the same.  The result of
  142. the merge is a file that contains the  user's  modifications
  143. and those modifications that were "committed" after the user
  144. checked out his version of the file (as  well  as  a  backup
  145. copy  of the user's original file).  cvs points out any con-
  146. flicts during the merge.  It is the user's responsibility to
  147. resolve these conflicts and to "commit" his/her changes when
  148. ready.
  149.  
  150.      Although  the  cvs  conflict-resolution  algorithm  was
  151. defined  in  1986,  it  is  remarkably similar to the "Copy-
  152. Modify-Merge" scenario included with NSE[5] and described in
  153. [Honda]  and  [Courington].   The following explanation from
  154. [Honda] also applies to cvs:
  155.  
  156.      Simply  stated,  a  developer  copies  an   object
  157.      without  locking  it,  modifies the copy, and then
  158.      merges the modified copy with the original.   This
  159.      paradigm  allows  developers  to work in isolation
  160.      from one another since changes are made to  copies
  161.      of  objects.  Because locks are not used, develop-
  162.      ment is not serialized and can proceed  in  paral-
  163.      lel.   Developers,  however,  must  merge  objects
  164.      after the changes have been made.  In  particular,
  165.      a  developer  must resolve conflicts when the same
  166.      object has been modified by someone else.
  167.  
  168.      In practice, Prisma has found that conflicts that occur
  169. when  the  same object has been modified by someone else are
  170. quite rare.  When they do happen, the changes  made  by  the
  171. other developer are usually easily resolved.  This practical
  172. use  has  shown  that  the "Copy-Modify-Merge" paradigm is a
  173. correct and useful one.
  174.  
  175. 2.2. Tracking Third-Party Source Distributions
  176.  
  177.      Currently, a large  amount  of  software  is  based  on
  178. source  distributions from a third-party distributor.  It is
  179. often the case that local modifications are to  be  made  to
  180. this  distribution,  and  that  the vendor's future releases
  181. should be tracked.  Rolling your local modifications forward
  182. into  the  new  vendor release is a time-consuming task, but
  183. cvs can ease this burden somewhat.  The checkin  program  of
  184. cvs initially sets up a source repository by integrating the
  185. source modules directly from the vendor's release,  preserv-
  186. ing  the  directory  hierarchy of the vendor's distribution.
  187. The branch support of RCS  is  used  to  build  this  vendor
  188. release  as  a branch of the main RCS trunk.  Figure 2 shows
  189. how the "head" tracks a sample vendor branch when  no  local
  190. modifications have been made to  the  file.   Once  this  is
  191. done,  developers can check out files and make local changes
  192. to the vendor's source distribution.   These  local  changes
  193. form  a  new  branch  to  the tree which is then used as the
  194. source for future check outs.  Figure 3 shows how the "head"
  195. moves  to  the  main  RCS trunk when a local modification is
  196. made.
  197.  
  198.      When a new version of the vendor's source  distribution
  199. arrives,  the  checkin  program  adds  the  new  and changed
  200. vendor's files to the already  existing  source  repository.
  201. For  files  that have not been changed locally, the new file
  202. from the vendor becomes the current  "head"  revision.   For
  203. files  that  have  been modified locally, checkin warns that
  204. the file must be merged with the new  vendor  release.   The
  205. cvs  "join"  command is a useful tool that aids this process
  206. by performing the necessary RCS merge, as is done above when
  207. performing an "update."
  208.  
  209.      There is also limited support  for  "dual"  derivations
  210. for  source  files.   See Figure 4 for a sample dual-derived
  211. file.   This  example  tracks  the  SunOS  distribution  but
  212. includes  major  changes from Berkeley.  These BSD files are
  213. saved directly in the RCS file off a new branch.
  214.  
  215. 2.3. Location Independent Module Database
  216.  
  217.      cvs  contains  support  for  a  simple,  yet  powerful,
  218. "module" database.  For reasons of efficiency, this database
  219. is stored in ndbm(3) format.  The module database is used to
  220. apply  names  to  collections  of directories and files as a
  221. matter of convenience for checking out  pieces  of  a  large
  222. software  distribution.   The  database records the physical
  223. location of the sources as a  form  of  information  hiding,
  224. allowing one to check out  whole  directory  hierarchies  or
  225. individual  files  without  regard for their actual location
  226. within the global source distribution.
  227.  
  228.      Consider the following small sample of a  module  data-
  229. base,  which  must  be  tailored  manually  to each specific
  230. source repository environment:
  231.  
  232.      #key      [-option argument] directory [files...]
  233.      diff      bin/diff
  234.      libc      lib/libc
  235.      sys       -o sys/tools/make_links sys
  236.      modules   -i mkmodules CVSROOT.adm modules
  237.      kernel    -a sys lang/adb
  238.      ps        bin Makefile ps.c
  239.  
  240.      The "diff" and "libc" modules refer to whole  directory
  241. hierarchies  that  are  extracted  on  check out.  The "sys"
  242. module  extracts  the  "sys"   hierarchy,   and   runs   the
  243. "make_links"  program  at  the  end of the check out process
  244. (the -o option specifies a program to run on checkout).  The
  245. "modules" module allows one to edit the module database file
  246. and runs the "mkmodules" program on  checkin  to  regenerate
  247. the  ndbm database that cvs uses.  The "kernel" module is an
  248. alias (as the -a option specifies) which causes the  remain-
  249. ing  arguments  after the -a to be interpreted exactly as if
  250. they had been specified on the command line.  This is useful
  251. for objects that require shared pieces of code from far away
  252. places to be compiled  (as  is  the  case  with  the  kernel
  253. debugger,  kadb,  which  shares  code  with the standard adb
  254. debugger).  The "ps" module shows that the source  for  "ps"
  255. lives in the "bin" directory, but only Makefile and ps.c are
  256. required to build the object.
  257.  
  258.      The module database at Prisma is now populated for  the
  259. entire  UNIX distribution and thereby allows us to issue the
  260. following convenient commands to check out components of the
  261. UNIX  distribution  without regard for their actual location
  262. within the master source repository:
  263.  
  264.      example% cvs checkout diff
  265.      example% cvs checkout libc ps
  266.      example% cd diff; make
  267.  
  268.      In building the module database file, it is quite  pos-
  269. sible  to  have name conflicts within a global software dis-
  270. tribution.  For example, SunOS provides  two  cat  programs:
  271. one  for the standard environment, /bin/cat, and one for the
  272. System V environment, /usr/5bin/cat.  We resolved this  con-
  273. flict  by naming the standard cat module "cat", and the Sys-
  274. tem V cat module "5cat".  Similar name modifications must be
  275. applied  to  other  conflicting  names,  as  might  be found
  276. between a utility program and  a  library  function,  though
  277. Prisma  chose  not  to  include individual library functions
  278. within the module database at this time.
  279.  
  280. 2.4. Configurable Logging Support
  281.  
  282.      The cvs "commit" command is used to  make  a  permanent
  283. change  to  the master source repository (where the RCS ",v"
  284. files live).  Whenever a "commit" is done, the  log  message
  285. for  the  change is carefully logged by an arbitrary program
  286. (in a file, notesfile, news database, or mail).   For  exam-
  287. ple,  a  collection  of these updates can be used to produce
  288. release notices.  cvs can be configured to send log  updates
  289. through  one  or  more  filter  programs, based on a regular
  290. expression match on the directory  that  is  being  changed.
  291. This  allows multiple related or unrelated projects to exist
  292. within a single cvs source repository tree, with  each  dif-
  293. ferent  project sending its "commit" reports to a unique log
  294. device.
  295.  
  296.      A sample logging configuration file might look as  fol-
  297. lows:
  298.  
  299.      #regex      filter-program
  300.      DEFAULT     /usr/local/bin/nfpipe -t %s utils.updates
  301.      ^diag       /usr/local/bin/nfpipe -t %s diag.updates
  302.      ^local      /usr/local/bin/nfpipe -t %s local.updates
  303.      ^perf       /usr/local/bin/nfpipe -t %s perf.updates
  304.      ^sys        /usr/local/bin/nfpipe -t %s kernel.updates
  305.  
  306.      This sample  allows  the  diagnostics  and  performance
  307. groups  to  share the same source repository with the kernel
  308. and utilities groups.   Changes  that  they  make  are  sent
  309. directly   to  their  own  notesfile  [Essick]  through  the
  310. "nfpipe" program.  A sufficiently simple  title  is  substi-
  311. tuted  for  the  "%s"  argument before the filter program is
  312. executed.  This logging configuration file is tailored manu-
  313. ally to each specific source repository environment.
  314.  
  315. 2.5. Tagged Releases and Dates
  316.  
  317.      Any release can be given a symbolic tag  name  that  is
  318. stored  directly  in the RCS files.  This tag can be used at
  319. any time to get an exact copy of any previous release.  With
  320. equal ease, one can also extract an exact copy of the source
  321. files as of any arbitrary date in the past as  well.   Thus,
  322. all  that's  required  to tag the current kernel, and to tag
  323. the kernel as of the Fourth of July is:
  324.  
  325.      example% cvs tag TEST_KERNEL kernel
  326.      example% cvs tag -D 'July 4' PATRIOTIC_KERNEL kernel
  327.  
  328. The following command would retrieve an exact  copy  of  the
  329. test kernel at some later date:
  330.  
  331.      example% cvs checkout -fp -rTEST_KERNEL kernel
  332.  
  333. The -f option causes only files that match the specified tag
  334. to  be  extracted,  while the -p option automatically prunes
  335. empty directories.  Consequently, directories added  to  the
  336. kernel  after the test kernel was tagged are not included in
  337. the newly extracted copy of the test kernel.
  338.  
  339.      The cvs date support has exactly the same interface  as
  340. that  provided  with  RCS, however cvs must process the ",v"
  341. files directly due to the special handling required  by  the
  342. vendor  branch support.  The standard RCS date handling only
  343. processes one branch (or the main trunk) when  checking  out
  344. based on a date specification.  cvs must instead process the
  345. current "head" branch and, if a match is not found,  proceed
  346. to  look  for  a match on the vendor branch.  This, combined
  347. with reasons of performance, is why cvs  processes  revision
  348. (symbolic and numeric) and date specifications directly from
  349. the ",v" files.
  350.  
  351. 2.6.  Building "patch" Source Distributions
  352.  
  353.      cvs can produce a "patch"  format  [Wall]  output  file
  354. which  can  be  used to bring a previously released software
  355. distribution current with the newest  release.   This  patch
  356. file  supports an entire directory hierarchy within a single
  357. patch, as well as being able to add whole new files  to  the
  358. previous  release.   One  can combine symbolic revisions and
  359. dates together to display changes in a very generic way:
  360.  
  361.      example% cvs patch -D 'December 1, 1988' \
  362.                         -D 'January 1, 1989' sys
  363.  
  364. This example displays the kernel changes made in  the  month
  365. of December, 1988.  To release a patch file, for example, to
  366. take the cvs distribution from version 1.0  to  version  1.4
  367. might be done as follows:
  368.  
  369.      example% cvs patch -rCVS_1_0 -rCVS_1_4 cvs
  370.  
  371.  
  372. 3.   CVS Experience
  373.  
  374. 3.1. Statistics
  375.  
  376.      A quick summary of the scale  that  cvs  is  addressing
  377. today can be found in Table 1.  Table 2 shows the history of
  378. files  changed  or  added  and  the  number  of source lines
  379. affected by the change at Prisma.  Only changes made to  the
  380. kernel sources are included.  The  large  number  of  source
  381. file changes made in September are the result of merging the
  382. SunOS 4.0.3 sources into the kernel.  This merge process  is
  383. described in section 3.3.
  384.  
  385. 3.2. Performance
  386.  
  387.      The performance of cvs is currently  quite  reasonable.
  388. Little effort has been expended on tuning cvs, although per-
  389. formance related decisions were made during the cvs  design.
  390. For  example, cvs parses the RCS ",v" files directly instead
  391. of running an RCS process.  This includes following branches
  392. as  well  as integrating with the vendor source branches and
  393. the main trunk when checking out files based on a date.
  394.  
  395.           _______________________________________
  396.            Revision Control Statistics at Prisma
  397.                       as of 11/11/89
  398.           _______________________________________
  399.                How Many...            Total
  400.           _______________________________________
  401.            Files                       17243
  402.            Directories                  1005
  403.            Lines of code             3927255
  404.            Removed files                 131
  405.            Software developers            14
  406.            Software groups                 6
  407.            Megabytes of source           128
  408.           _______________________________________
  409.  
  410.                           Table 1.
  411.                        cvs Statistics
  412.  
  413.      _________________________________________________
  414.              Prisma Kernel Source File Changes
  415.                     By Month, 1988-1989
  416.      _________________________________________________
  417.               # Changed   # Lines   # Added   # Lines
  418.       Month     Files     Changed    Files     Added
  419.      _________________________________________________
  420.       Dec         87        3619       68       9266
  421.       Jan         39        4324        0          0
  422.       Feb         73        1578        5       3550
  423.       Mar         99        5301       18      11461
  424.       Apr        112        7333       11       5759
  425.       May        138        5371       17      13986
  426.       Jun         65        2261       27      12875
  427.       Jul         34        2000        1         58
  428.       Aug         65        6378        8       4724
  429.       Sep        266       23410      113      39965
  430.       Oct         22         621        1        155
  431.       Total     1000       62196      269     101799
  432.      _________________________________________________
  433.  
  434.                           Table 2.
  435.               cvs Usage History for the Kernel
  436.  
  437.      Checking  out  the  entire  kernel  source  tree  (1223
  438. files/59  directories) currently takes 16 wall clock minutes
  439. on a Sun-4/280.  However, bringing the tree up-to-date  with
  440. the  current  kernel  sources, once it has been checked out,
  441. takes only 1.5 wall clock minutes.   Updating  the  complete
  442. 128  MByte  source  tree under cvs control (17243 files/1005
  443. directories) takes roughly 28 wall clock minutes  and  util-
  444. izes  one-third  of  the  machine.  For now this is entirely
  445. acceptable; improvements on these numbers will  possibly  be
  446. made in the future.
  447.  
  448. 3.3. The SunOS 4.0.3 Merge
  449.  
  450.      The true test of the cvs  vendor  branch  support  came
  451. with the arrival of the SunOS 4.0.3 source upgrade tape.  As
  452. described above, the checkin program was used to install the
  453. new  sources  and the resulting output file listed the files
  454. that had been locally modified, needing to be  merged  manu-
  455. ally.  For the kernel, there were 94 files in conflict.  The
  456. cvs "join" command was used on each of  the  94  conflicting
  457. files, and the remaining conflicts were resolved.
  458.  
  459.      The "join"  command  performs  an  rcsmerge  operation.
  460. This in turn uses /usr/lib/diff3 to produce a three-way diff
  461. file.  As it happens, the diff3  program  has  a  hard-coded
  462. limit of 200 source-file changes maximum.  This proved to be
  463. too small for a few of the kernel files that needed  merging
  464. by  hand,  due  to  the  large  number of local changes that
  465. Prisma had made.  The diff3 problem was solved by increasing
  466. the hard-coded limit by an order of magnitude.
  467.  
  468.      The SunOS 4.0.3 kernel source upgrade distribution con-
  469. tained  346 files, 233 of which were modifications to previ-
  470. ously released files, and 113  of  which  were  newly  added
  471. files.   checkin added the 113 new files to the source repo-
  472. sitory without intervention.  Of the 233 modified files, 139
  473. dropped in cleanly by checkin, since Prisma had not made any
  474. local changes to them, and 94 required manual merging due to
  475. local  modifications.   The  233 modified files consisted of
  476. 20,766 lines of differences.  It took one developer two days
  477. to  manually merge the 94 files using the "join" command and
  478. resolving  conflicts  manually.   An  additional   day   was
  479. required  for kernel debugging.  The entire process of merg-
  480. ing over 20,000 lines of differences was completed  in  less
  481. than  a week.  This one time-savings alone was justification
  482. enough for the cvs development effort;  we  expect  to  gain
  483. even more when tracking future SunOS releases.
  484.  
  485. 4.  Future Enhancements and Current Bugs
  486.  
  487.      Since cvs was designed to be incomplete, for reasons of
  488. design  simplicity,  there  are  naturally  a good number of
  489. enhancements that can be made to make it  more  useful.   As
  490. well, some nuisances exist in the current implementation.
  491.  
  492.      +  cvs does not currently "remember" who has a  checked
  493.         out a copy of a module.  As a result, it is impossi-
  494.         ble to know who might be working on the same  module
  495.         that  you  are.   A  simple-minded  database that is
  496.         updated nightly would likely suffice.
  497.  
  498.      +  Signal processing, keyboard  interrupt  handling  in
  499.         particular, is currently somewhat weak.  This is due
  500.         to the heavy use of the system(3)  library  function
  501.         to  execute  RCS  programs like co and ci.  It some-
  502.         times takes multiple interrupts to  make  cvs  quit.
  503.         This  can  be  fixed  by using a home-grown system()
  504.         replacement.
  505.  
  506.      +  Security of the source repository is  currently  not
  507.         dealt  with  directly.   The  usual UNIX approach of
  508.         user-group-other security  permissions  through  the
  509.         file  system  is  utilized,  but  nothing else.  cvs
  510.         could  likely  be  a  set-group-id  executable  that
  511.         checks  a  protected  database to verify user access
  512.         permissions for particular objects  before  allowing
  513.         any operations to affect those objects.
  514.  
  515.      +  With every checked-out directory, cvs maintains some
  516.         administrative  files  that record the current revi-
  517.         sion numbers of the checked-out files as well as the
  518.         location  of  the respective source repository.  cvs
  519.         does not recover nicely at all if these  administra-
  520.         tive files are removed.
  521.  
  522.      +  The source code for cvs has been tested  extensively
  523.         on Sun-3 and Sun-4 systems, all running SunOS 4.0 or
  524.         later versions of the operating system.   Since  the
  525.         code  has  not  yet  been compiled under other plat-
  526.         forms, the overall portability of the code is  still
  527.         questionable.
  528.  
  529.      +  As witnessed in the previous section, the cvs method
  530.         for tracking third party vendor source distributions
  531.         can work  quite  nicely.   However,  if  the  vendor
  532.         changes  the  directory  structure or the file names
  533.         within the source distribution, cvs has  no  way  of
  534.         matching  the  old  release with the new one.  It is
  535.         currently unclear as to how to solve this, though it
  536.         is certain to happen in practice.
  537.  
  538. 5.   Availability
  539.  
  540.      The cvs program sources can be found in a recent  post-
  541. ing   to   the  comp.sources.unix  newsgroup.   It  is  also
  542. currently available via  anonymous  ftp  from  "prisma.com".
  543. Copying  rights  for  cvs will be covered by the GNU General
  544. Public License.
  545.  
  546. 6.   Summary
  547.  
  548.      Prisma has used  cvs  since  December,  1988.   It  has
  549. evolved  to  meet our specific needs of revision and release
  550. control.  We will make our code  freely  available  so  that
  551. others  can  benefit  from  our work, and can enhance cvs to
  552. meet broader needs yet.
  553.  
  554.      Many of the other software release and revision control
  555. systems,  like  the one described in [Glew], appear to use a
  556. collection of tools that are geared toward specific environ-
  557. ments  -  one set of tools for the kernel, one set for "gen-
  558. eric" software, one set for utilities, and one set for  ker-
  559. nel  and utilities.  Each of these tool sets apparently han-
  560. dle some specific aspect of the problem uniquely.  cvs  took
  561. a  somewhat  different  approach.  File sharing through sym-
  562. bolic or hard links is  not  addressed;  instead,  the  disk
  563. space is simply burned since it is "cheap." Support for pro-
  564. ducing objects for multiple architectures is not  addressed;
  565. instead, a parallel checked-out source tree must be used for
  566. each architecture, again wasting disk space to simplify com-
  567. plexity  and  ease  of  use  - punting on this issue allowed
  568. Makefiles to remain unchanged, unlike the approach taken  in
  569. [Mahler],  thereby maintaining closer compatibility with the
  570. third-party vendor sources.  cvs is  essentially  a  source-
  571. file  server,  making  no assumptions or special handling of
  572. the sources that it controls.  To cvs:
  573.  
  574.      A source is a source, of course, of course, unless
  575.      of course the source is Mr. Ed.[6]
  576.  
  577. Sources are maintained, saved, and retrievable at  any  time
  578. based  on  symbolic or numeric revision or date in the past.
  579. It is entirely up to cvs wrapper  programs  to  provide  for
  580. release environments and such.
  581.  
  582.      The major advantage of cvs over the many other  similar
  583. systems that have already been designed is the simplicity of
  584. cvs.  cvs contains only three programs that do all the  work
  585. of release and revision control, and two manually-maintained
  586. administrative files for each source repository.  Of course,
  587. the  deciding  factor  of any tool is whether people use it,
  588. and if they even like to use it.  At Prisma,  cvs  prevented
  589. members of the kernel group from killing each other.
  590.  
  591. 7.  Acknowledgements
  592.  
  593.      Many thanks to Dick  Grune  at  Vrije  Universiteit  in
  594. Amsterdam  for  his  work on the original version of cvs and
  595. for making it available to the world.  Thanks to  Jeff  Polk
  596. of  Prisma  for  helping with the design of the module data-
  597. base, vendor branch support, and  for  writing  the  checkin
  598. shell  script.   Thanks also to the entire software group at
  599. Prisma for taking the time to review the paper  and  correct
  600. my grammar.
  601.  
  602. 8.   References
  603.  
  604. [Bell]      Bell Telephone Laboratories.  "Source Code  Con-
  605.             trol  System  User's  Guide."  UNIX  System  III
  606.             Programmer's Manual, October 1981.
  607.  
  608. [Courington]Courington, W.  The  Network  Software  Environ-
  609.             ment,   Sun   Technical   Report   FE197-0,  Sun
  610.             Microsystems Inc, February 1989.
  611.  
  612. [Essick]    Essick, Raymond B.  and  Robert  Bruce  Kolstad.
  613.             Notesfile  Reference  Manual, Department of Com-
  614.             puter Science Technical Report #1081, University
  615.             of  Illinois  at Urbana-Champaign, Urbana, Illi-
  616.             nois, 1982, p. 26.
  617.  
  618. [Glew]      Glew, Andy.  "Boxes, Links, and Parallel  Trees:
  619.             Elements  of a Configuration Management System."
  620.             Workshop Proceedings of the Software  Management
  621.             Conference, USENIX, New Orleans, April 1989.
  622.  
  623. [Grune]     Grune, Dick.   Distributed  the  original  shell
  624.             script  version  of cvs in the comp.sources.unix
  625.             volume 6 release in 1986.
  626.  
  627. [Honda]     Honda, Masahiro and Terrence Miller.   "Software
  628.             Management  Using  a CASE Environment." Workshop
  629.             Proceedings of the Software  Management  Confer-
  630.             ence, USENIX, New Orleans, April 1989.
  631.  
  632. [Mahler]    Mahler, Alex and Andreas Lampen.  "An Integrated
  633.             Toolset   for  Engineering  Software  Configura-
  634.             tions." Proceedings of the  ACM  SIGSOFT/SIGPLAN
  635.             Software   Engineering  Symposium  on  Practical
  636.             Software Development Environments, ACM,  Boston,
  637.             November  1988.   Described is the shape toolkit
  638.             posted to the comp.sources.unix newsgroup in the
  639.             volume 19 release.
  640.  
  641. [Tichy]     Tichy, Walter F.  "Design,  Implementation,  and
  642.             Evaluation   of   a  Revision  Control  System."
  643.             Proceedings of the 6th International  Conference
  644.             on  Software Engineering, IEEE, Tokyo, September
  645.             1982.
  646.  
  647. [Wall]      Wall, Larry.  The patch program is an indispens-
  648.             able  tool for applying a diff file to an origi-
  649.             nal.   Can   be   found   on   uunet.uu.net   in
  650.             ~ftp/pub/patch.tar.
  651.  
  652. _________________________
  653. [1] UNIX is a registered trademark of AT&T.
  654. [2] SunOS is a trademark of Sun Microsystems, Inc.
  655. [3] Yes, the  SunOS 4.0 kernel is  composed of over a thou-
  656.     sand files!
  657. [4] The  basic  conflict - resolution  algorithms  used  in
  658.     the  cvs  program find their roots in the original work
  659.     done by Dick Grune at Vrije Universiteit  in  Amsterdam
  660.     and posted to comp.sources.unix in the volume 6 release
  661.     sometime in 1986.  This original version of cvs  was  a
  662.     collection  of  shell  scripts  that combined to form a
  663.     front end to the RCS programs.
  664. [5] NSE is the Network Software Environment,  a  product of
  665.     Sun Microsystems, Inc.
  666. [6] cvs, of  course, does  not really  discriminate against
  667.     Mr. Ed.[7]
  668. [7] Yet.
  669.