Hex Artifact Content
Not logged in

Artifact c60b1c7187020a00be5d926f4449056f86dc48f2:

File tools/lib/cvs.tcl part of check-in [7a64b9e738] - CVS import. First, fixed sig::next regarding two things. One, we have to take the root version of a file into account as a possible predecessor. Two, a missing changed file may be misclassified and actually be added instead. Second, modified the search for a root changeset of a branch. We now try the existing regular intersection first for exactness, and in case of failure we fall back to a voting scheme to locate the most acceptable aka non-conflicting changeset. by aku on 2007-09-27 04:44:19.

0000: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  # --------------
0010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0050: 23 20 52 65 70 6f 73 69 74 6f 72 79 20 6d 61 6e  # Repository man
0060: 61 67 65 6d 65 6e 74 20 28 43 56 53 29 0a 0a 23  agement (CVS)..#
0070: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
0080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
00c0: 20 52 65 71 75 69 72 65 6d 65 6e 74 73 0a 0a 70   Requirements..p
00d0: 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 54  ackage require T
00e0: 63 6c 20 38 2e 34 0a 70 61 63 6b 61 67 65 20 72  cl 8.4.package r
00f0: 65 71 75 69 72 65 20 66 69 6c 65 75 74 69 6c 20  equire fileutil 
0100: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23               ; #
0110: 20 54 63 6c 6c 69 62 20 28 74 72 61 76 65 72 73   Tcllib (travers
0120: 65 20 64 69 72 65 63 74 6f 72 79 20 68 69 65 72  e directory hier
0130: 61 72 63 68 79 29 0a 70 61 63 6b 61 67 65 20 72  archy).package r
0140: 65 71 75 69 72 65 20 76 63 3a 3a 72 63 73 3a 3a  equire vc::rcs::
0150: 70 61 72 73 65 72 20 20 20 20 20 20 20 3b 20 23  parser       ; #
0160: 20 48 61 6e 64 6c 69 6e 67 20 74 68 65 20 52 43   Handling the RC
0170: 53 20 61 72 63 68 69 76 65 20 66 69 6c 65 73 2e  S archive files.
0180: 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65  .package require
0190: 20 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 20   vc::tools::log 
01a0: 20 20 20 20 20 20 20 3b 20 23 20 55 73 65 72 20         ; # User 
01b0: 66 65 65 64 62 61 63 6b 0a 70 61 63 6b 61 67 65  feedback.package
01c0: 20 72 65 71 75 69 72 65 20 76 63 3a 3a 74 6f 6f   require vc::too
01d0: 6c 73 3a 3a 74 72 6f 75 62 6c 65 20 20 20 20 3b  ls::trouble    ;
01e0: 20 23 20 45 72 72 6f 72 20 68 61 6e 64 6c 69 6e   # Error handlin
01f0: 67 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72  g.package requir
0200: 65 20 76 63 3a 3a 63 76 73 3a 3a 63 6d 64 20 20  e vc::cvs::cmd  
0210: 20 20 20 20 20 20 20 20 3b 20 23 20 41 63 63 65          ; # Acce
0220: 73 73 20 74 6f 20 63 76 73 20 61 70 70 6c 69 63  ss to cvs applic
0230: 61 74 69 6f 6e 2e 0a 70 61 63 6b 61 67 65 20 72  ation..package r
0240: 65 71 75 69 72 65 20 76 63 3a 3a 63 76 73 3a 3a  equire vc::cvs::
0250: 77 73 3a 3a 66 69 6c 65 73 20 20 20 20 3b 20 23  ws::files    ; #
0260: 20 53 63 61 6e 20 43 56 53 20 72 65 70 6f 73 69   Scan CVS reposi
0270: 74 6f 72 79 20 66 6f 72 20 72 65 6c 65 76 61 6e  tory for relevan
0280: 74 20 66 69 6c 65 73 2e 0a 70 61 63 6b 61 67 65  t files..package
0290: 20 72 65 71 75 69 72 65 20 76 63 3a 3a 63 76 73   require vc::cvs
02a0: 3a 3a 77 73 3a 3a 74 69 6d 65 6c 69 6e 65 20 3b  ::ws::timeline ;
02b0: 20 23 20 4d 61 6e 61 67 65 20 74 69 6d 65 6c 69   # Manage timeli
02c0: 6e 65 20 6f 66 20 61 6c 6c 20 63 68 61 6e 67 65  ne of all change
02d0: 73 2e 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69  s..package requi
02e0: 72 65 20 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a  re vc::cvs::ws::
02f0: 63 73 65 74 73 20 20 20 20 3b 20 23 20 4d 61 6e  csets    ; # Man
0300: 61 67 65 20 74 68 65 20 63 68 61 6e 67 65 73 65  age the changese
0310: 74 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20  ts found in the 
0320: 74 69 6d 65 6c 69 6e 65 0a 70 61 63 6b 61 67 65  timeline.package
0330: 20 72 65 71 75 69 72 65 20 76 63 3a 3a 63 76 73   require vc::cvs
0340: 3a 3a 77 73 3a 3a 62 72 61 6e 63 68 20 20 20 3b  ::ws::branch   ;
0350: 20 23 20 42 72 61 6e 63 68 20 64 61 74 61 62 61   # Branch databa
0360: 73 65 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69  se.package requi
0370: 72 65 20 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a  re vc::cvs::ws::
0380: 73 69 67 20 20 20 20 20 20 3b 20 23 20 43 68 61  sig      ; # Cha
0390: 6e 67 65 73 65 74 20 66 69 6c 65 2f 72 65 76 20  ngeset file/rev 
03a0: 73 69 67 6e 61 74 75 72 65 73 0a 0a 6e 61 6d 65  signatures..name
03b0: 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a  space eval ::vc:
03c0: 3a 63 76 73 3a 3a 77 73 20 7b 0a 20 20 20 20 76  :cvs::ws {.    v
03d0: 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 3a 3a 73  c::tools::log::s
03e0: 79 73 74 65 6d 20 63 76 73 0a 20 20 20 20 6e 61  ystem cvs.    na
03f0: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
0400: 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 3a  :vc::tools::log:
0410: 3a 77 72 69 74 65 0a 20 20 20 20 6e 61 6d 65 73  :write.    names
0420: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63  pace import ::vc
0430: 3a 3a 72 63 73 3a 3a 70 61 72 73 65 72 3a 3a 70  ::rcs::parser::p
0440: 72 6f 63 65 73 73 0a 20 20 20 20 6e 61 6d 65 73  rocess.    names
0450: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63  pace import ::vc
0460: 3a 3a 63 76 73 3a 3a 63 6d 64 3a 3a 64 6f 76 61  ::cvs::cmd::dova
0470: 0a 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20  ..    namespace 
0480: 65 76 61 6c 20 74 72 6f 75 62 6c 65 20 7b 20 6e  eval trouble { n
0490: 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20  amespace import 
04a0: 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 74 72 6f  ::vc::tools::tro
04b0: 75 62 6c 65 3a 3a 2a 20 7d 0a 7d 0a 0a 23 20 2d  uble::* }.}..# -
04c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
04f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 41  ------------.# A
0510: 50 49 0a 0a 23 20 76 63 3a 3a 63 76 73 3a 3a 77  PI..# vc::cvs::w
0520: 73 3a 3a 63 6f 6e 66 69 67 75 72 65 20 6b 65 79  s::configure key
0530: 20 76 61 6c 75 65 20 20 20 20 2d 20 43 6f 6e 66   value    - Conf
0540: 69 67 75 72 65 20 74 68 65 20 73 75 62 73 79 73  igure the subsys
0550: 74 65 6d 2e 0a 23 20 76 63 3a 3a 63 76 73 3a 3a  tem..# vc::cvs::
0560: 77 73 3a 3a 63 68 65 63 6b 20 20 20 20 20 73 72  ws::check     sr
0570: 63 20 6d 76 20 20 20 20 20 20 20 2d 20 43 68 65  c mv       - Che
0580: 63 6b 20 69 66 20 73 72 63 20 69 73 20 61 20 43  ck if src is a C
0590: 56 53 20 72 65 70 6f 73 69 74 6f 72 79 20 64 69  VS repository di
05a0: 72 65 63 74 6f 72 79 2e 0a 23 20 76 63 3a 3a 63  rectory..# vc::c
05b0: 76 73 3a 3a 77 73 3a 3a 62 65 67 69 6e 20 20 20  vs::ws::begin   
05c0: 20 20 73 72 63 20 20 20 20 20 20 20 20 20 20 2d    src          -
05d0: 20 53 74 61 72 74 20 6e 65 77 20 77 6f 72 6b 73   Start new works
05e0: 70 61 63 65 20 61 6e 64 20 72 65 74 75 72 6e 20  pace and return 
05f0: 74 68 65 20 74 6f 70 2d 0a 23 20 20 20 20 20 20  the top-.#      
0600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0620: 20 6d 6f 73 74 20 64 69 72 65 63 74 6f 72 79 20   most directory 
0630: 63 6f 27 64 20 66 69 6c 65 73 20 61 72 65 20 70  co'd files are p
0640: 75 74 20 69 6e 74 6f 2e 0a 23 20 76 63 3a 3a 63  ut into..# vc::c
0650: 76 73 3a 3a 77 73 3a 3a 6e 63 73 65 74 73 20 20  vs::ws::ncsets  
0660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d                 -
0670: 20 52 65 74 72 69 65 76 65 20 74 6f 74 61 6c 20   Retrieve total 
0680: 6e 75 6d 62 65 72 20 6f 66 20 63 73 65 74 73 0a  number of csets.
0690: 23 20 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 6e  # vc::cvs::ws::n
06a0: 69 6d 70 6f 72 74 61 62 6c 65 20 20 20 20 20 20  importable      
06b0: 20 20 20 20 20 20 2d 20 52 65 74 72 69 65 76 65        - Retrieve
06c0: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6d 70 6f 72   number of impor
06d0: 74 61 62 6c 65 20 63 73 65 74 73 0a 23 20 76 63  table csets.# vc
06e0: 3a 3a 63 76 73 3a 3a 77 73 3a 3a 66 6f 72 65 61  ::cvs::ws::forea
06f0: 63 68 20 20 20 63 73 76 61 72 20 73 63 72 69 70  ch   csvar scrip
0700: 74 20 2d 20 52 75 6e 20 74 68 65 20 73 63 72 69  t - Run the scri
0710: 70 74 20 66 6f 72 20 65 61 63 68 20 63 68 61 6e  pt for each chan
0720: 67 65 73 65 74 2c 20 74 68 65 0a 23 20 20 20 20  geset, the.#    
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0750: 20 20 20 69 64 20 6f 66 20 74 68 65 20 63 75 72     id of the cur
0760: 72 65 6e 74 20 63 68 61 6e 67 65 73 65 74 20 73  rent changeset s
0770: 74 6f 72 65 64 20 69 6e 0a 23 20 20 20 20 20 20  tored in.#      
0780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
07a0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 61   the variable na
07b0: 6d 65 64 20 62 79 20 63 73 76 61 72 2e 0a 23 20  med by csvar..# 
07c0: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 64 6f 6e  vc::cvs::ws::don
07d0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  e               
07e0: 20 20 20 20 2d 20 43 6c 6f 73 65 20 77 6f 72 6b      - Close work
07f0: 73 70 61 63 65 20 61 6e 64 20 64 65 6c 65 74 65  space and delete
0800: 20 69 74 2e 0a 23 20 76 63 3a 3a 63 76 73 3a 3a   it..# vc::cvs::
0810: 77 73 3a 3a 69 73 61 64 6d 69 6e 20 70 61 74 68  ws::isadmin path
0820: 20 20 20 20 20 20 20 20 20 20 20 2d 20 43 68 65             - Che
0830: 63 6b 20 69 66 20 70 61 74 68 20 69 73 20 61 6e  ck if path is an
0840: 20 61 64 6d 69 6e 20 66 69 6c 65 20 6f 66 20 43   admin file of C
0850: 56 53 0a 23 20 76 63 3a 3a 63 76 73 3a 3a 77 73  VS.# vc::cvs::ws
0860: 3a 3a 63 68 65 63 6b 6f 75 74 20 69 64 20 20 20  ::checkout id   
0870: 20 20 20 20 20 20 20 20 20 2d 20 48 61 76 65 20           - Have 
0880: 77 6f 72 6b 73 70 61 63 65 20 63 6f 6e 74 61 69  workspace contai
0890: 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20  n the changeset 
08a0: 69 64 2e 0a 23 20 76 63 3a 3a 63 76 73 3a 3a 77  id..# vc::cvs::w
08b0: 73 3a 3a 67 65 74 20 20 20 20 20 20 69 64 20 20  s::get      id  
08c0: 20 20 20 20 20 20 20 20 20 20 2d 20 52 65 74 72            - Retr
08d0: 69 65 76 65 20 64 61 74 61 20 6f 66 20 61 20 63  ieve data of a c
08e0: 68 61 6e 67 65 73 65 74 2e 0a 23 0a 23 20 43 6f  hangeset..#.# Co
08f0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6b 65 79 73  nfiguration keys
0900: 3a 0a 23 0a 23 20 2d 70 72 6f 6a 65 63 74 20 70  :.#.# -project p
0910: 61 74 68 20 2d 20 53 75 62 20 64 69 72 65 63 74  ath - Sub direct
0920: 6f 72 79 20 75 6e 64 65 72 20 27 73 72 63 27 20  ory under 'src' 
0930: 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 69 6d 70  to limit the imp
0940: 6f 72 74 20 74 6f 2e 0a 0a 23 20 2d 2d 2d 2d 2d  ort to...# -----
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0990: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 41 50 49 20 49  --------.# API I
09a0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 0a 70  mplementation..p
09b0: 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77  roc ::vc::cvs::w
09c0: 73 3a 3a 63 6f 6e 66 69 67 75 72 65 20 7b 6b 65  s::configure {ke
09d0: 79 20 76 61 6c 75 65 7d 20 7b 0a 20 20 20 20 76  y value} {.    v
09e0: 61 72 69 61 62 6c 65 20 70 72 6f 6a 65 63 74 0a  ariable project.
09f0: 0a 20 20 20 20 73 77 69 74 63 68 20 2d 65 78 61  .    switch -exa
0a00: 63 74 20 2d 2d 20 24 6b 65 79 20 7b 0a 09 2d 70  ct -- $key {..-p
0a10: 72 6f 6a 65 63 74 20 7b 20 73 65 74 20 70 72 6f  roject { set pro
0a20: 6a 65 63 74 20 24 76 61 6c 75 65 20 7d 0a 09 64  ject $value }..d
0a30: 65 66 61 75 6c 74 20 7b 0a 09 20 20 20 20 72 65  efault {..    re
0a40: 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72  turn -code error
0a50: 20 22 55 6e 6b 6e 6f 77 6e 20 73 77 69 74 63 68   "Unknown switch
0a60: 20 24 6b 65 79 2c 20 65 78 70 65 63 74 65 64 20   $key, expected 
0a70: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  \.              
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a90: 20 20 20 20 20 2d 70 72 6f 6a 65 63 74 22 0a 09       -project"..
0aa0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  }.    }.    retu
0ab0: 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a  rn.}..proc ::vc:
0ac0: 3a 63 76 73 3a 3a 77 73 3a 3a 63 68 65 63 6b 20  :cvs::ws::check 
0ad0: 7b 73 72 63 20 6d 76 7d 20 7b 0a 20 20 20 20 76  {src mv} {.    v
0ae0: 61 72 69 61 62 6c 65 20 70 72 6f 6a 65 63 74 0a  ariable project.
0af0: 20 20 20 20 75 70 76 61 72 20 31 20 24 6d 76 20      upvar 1 $mv 
0b00: 6d 73 67 0a 20 20 20 20 69 66 20 7b 0a 09 21 5b  msg.    if {..![
0b10: 66 69 6c 65 75 74 69 6c 3a 3a 74 65 73 74 20 24  fileutil::test $
0b20: 73 72 63 20 20 20 20 20 20 20 20 20 65 72 64 20  src         erd 
0b30: 6d 73 67 20 22 43 56 53 20 52 65 70 6f 73 69 74  msg "CVS Reposit
0b40: 6f 72 79 22 5d 20 7c 7c 0a 09 21 5b 66 69 6c 65  ory"] ||..![file
0b50: 75 74 69 6c 3a 3a 74 65 73 74 20 24 73 72 63 2f  util::test $src/
0b60: 43 56 53 52 4f 4f 54 20 65 72 64 20 6d 73 67 20  CVSROOT erd msg 
0b70: 22 43 56 53 20 41 64 6d 69 6e 20 64 69 72 65 63  "CVS Admin direc
0b80: 74 6f 72 79 22 5d 20 7c 7c 0a 09 28 28 24 70 72  tory"] ||..(($pr
0b90: 6f 6a 65 63 74 20 6e 65 20 22 22 29 20 26 26 0a  oject ne "") &&.
0ba0: 09 20 21 5b 66 69 6c 65 75 74 69 6c 3a 3a 74 65  . ![fileutil::te
0bb0: 73 74 20 24 73 72 63 2f 24 70 72 6f 6a 65 63 74  st $src/$project
0bc0: 20 65 72 64 20 6d 73 67 20 22 50 72 6f 6a 65 63   erd msg "Projec
0bd0: 74 20 64 69 72 65 63 74 6f 72 79 22 5d 29 0a 20  t directory"]). 
0be0: 20 20 20 7d 20 7b 0a 09 72 65 74 75 72 6e 20 30     } {..return 0
0bf0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
0c00: 6e 20 31 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63  n 1.}..proc ::vc
0c10: 3a 3a 63 76 73 3a 3a 77 73 3a 3a 62 65 67 69 6e  ::cvs::ws::begin
0c20: 20 7b 73 72 63 7d 20 7b 0a 20 20 20 20 69 66 20   {src} {.    if 
0c30: 7b 21 5b 63 68 65 63 6b 20 24 73 72 63 20 6d 73  {![check $src ms
0c40: 67 5d 7d 20 7b 20 72 65 74 75 72 6e 20 2d 63 6f  g]} { return -co
0c50: 64 65 20 65 72 72 6f 72 20 24 6d 73 67 20 7d 0a  de error $msg }.
0c60: 0a 20 20 20 20 44 65 66 42 61 73 65 20 24 73 72  .    DefBase $sr
0c70: 63 0a 20 20 20 20 4d 61 6b 65 54 69 6d 65 6c 69  c.    MakeTimeli
0c80: 6e 65 20 5b 53 63 61 6e 41 72 63 68 69 76 65 73  ne [ScanArchives
0c90: 20 5b 66 69 6c 65 73 3a 3a 66 69 6e 64 20 5b 52   [files::find [R
0ca0: 6f 6f 74 50 61 74 68 5d 5d 5d 0a 20 20 20 20 4d  ootPath]]].    M
0cb0: 61 6b 65 43 68 61 6e 67 65 73 65 74 73 0a 20 20  akeChangesets.  
0cc0: 20 20 50 72 6f 63 65 73 73 42 72 61 6e 63 68 65    ProcessBranche
0cd0: 73 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 4d  s..    return [M
0ce0: 61 6b 65 57 6f 72 6b 73 70 61 63 65 5d 0a 7d 0a  akeWorkspace].}.
0cf0: 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a  .proc ::vc::cvs:
0d00: 3a 77 73 3a 3a 64 6f 6e 65 20 7b 7d 20 7b 0a 20  :ws::done {} {. 
0d10: 20 20 20 76 61 72 69 61 62 6c 65 20 20 20 20 20     variable     
0d20: 20 20 20 20 20 20 20 77 6f 72 6b 73 70 61 63 65         workspace
0d30: 0a 20 20 20 20 66 69 6c 65 20 64 65 6c 65 74 65  .    file delete
0d40: 20 2d 66 6f 72 63 65 20 24 77 6f 72 6b 73 70 61   -force $workspa
0d50: 63 65 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a  ce.    return.}.
0d60: 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a  .proc ::vc::cvs:
0d70: 3a 77 73 3a 3a 66 6f 72 65 61 63 68 20 7b 63 76  :ws::foreach {cv
0d80: 20 73 63 72 69 70 74 7d 20 7b 0a 20 20 20 20 76   script} {.    v
0d90: 61 72 69 61 62 6c 65 20 69 6d 70 6f 72 74 61 62  ariable importab
0da0: 6c 65 0a 20 20 20 20 75 70 76 61 72 20 31 20 24  le.    upvar 1 $
0db0: 63 76 20 63 0a 0a 20 20 20 20 3a 3a 66 6f 72 65  cv c..    ::fore
0dc0: 61 63 68 20 63 20 5b 6c 73 6f 72 74 20 2d 69 6e  ach c [lsort -in
0dd0: 74 65 67 65 72 20 2d 69 6e 63 72 65 61 73 69 6e  teger -increasin
0de0: 67 20 24 69 6d 70 6f 72 74 61 62 6c 65 5d 20 7b  g $importable] {
0df0: 0a 09 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63  ..set code [catc
0e00: 68 20 7b 75 70 6c 65 76 65 6c 20 31 20 24 73 63  h {uplevel 1 $sc
0e10: 72 69 70 74 7d 20 72 65 73 5d 0a 0a 09 23 20 30  ript} res]...# 0
0e20: 20 2d 20 6f 6b 2c 20 31 20 2d 20 65 72 72 6f 72   - ok, 1 - error
0e30: 2c 20 32 20 2d 20 72 65 74 75 72 6e 2c 20 33 20  , 2 - return, 3 
0e40: 2d 20 62 72 65 61 6b 2c 20 34 20 2d 20 63 6f 6e  - break, 4 - con
0e50: 74 69 6e 75 65 0a 09 73 77 69 74 63 68 20 2d 2d  tinue..switch --
0e60: 20 24 63 6f 64 65 20 7b 0a 09 20 20 20 20 30 20   $code {..    0 
0e70: 7b 7d 0a 09 20 20 20 20 31 20 7b 20 72 65 74 75  {}..    1 { retu
0e80: 72 6e 20 2d 65 72 72 6f 72 63 6f 64 65 20 24 3a  rn -errorcode $:
0e90: 3a 65 72 72 6f 72 43 6f 64 65 20 2d 65 72 72 6f  :errorCode -erro
0ea0: 72 69 6e 66 6f 20 24 3a 3a 65 72 72 6f 72 49 6e  rinfo $::errorIn
0eb0: 66 6f 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 24  fo -code error $
0ec0: 72 65 73 20 7d 0a 09 20 20 20 20 32 20 7b 7d 0a  res }..    2 {}.
0ed0: 09 20 20 20 20 33 20 7b 20 72 65 74 75 72 6e 20  .    3 { return 
0ee0: 7d 0a 09 20 20 20 20 34 20 7b 7d 0a 09 20 20 20  }..    4 {}..   
0ef0: 20 64 65 66 61 75 6c 74 20 7b 20 72 65 74 75 72   default { retur
0f00: 6e 20 2d 63 6f 64 65 20 24 63 6f 64 65 20 24 72  n -code $code $r
0f10: 65 73 75 6c 74 20 7d 0a 09 7d 0a 20 20 20 20 7d  esult }..}.    }
0f20: 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70  .    return.}..p
0f30: 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77  roc ::vc::cvs::w
0f40: 73 3a 3a 6e 63 73 65 74 73 20 7b 61 72 67 73 7d  s::ncsets {args}
0f50: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 63   {.    return [c
0f60: 73 65 74 73 3a 3a 6e 75 6d 5d 0a 7d 0a 0a 70 72  sets::num].}..pr
0f70: 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73  oc ::vc::cvs::ws
0f80: 3a 3a 6e 69 6d 70 6f 72 74 61 62 6c 65 20 7b 61  ::nimportable {a
0f90: 72 67 73 7d 20 7b 0a 20 20 20 20 76 61 72 69 61  rgs} {.    varia
0fa0: 62 6c 65 20 69 6d 70 6f 72 74 61 62 6c 65 0a 20  ble importable. 
0fb0: 20 20 20 72 65 74 75 72 6e 20 5b 6c 6c 65 6e 67     return [lleng
0fc0: 74 68 20 24 69 6d 70 6f 72 74 61 62 6c 65 5d 0a  th $importable].
0fd0: 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76  }..proc ::vc::cv
0fe0: 73 3a 3a 77 73 3a 3a 69 73 61 64 6d 69 6e 20 7b  s::ws::isadmin {
0ff0: 70 61 74 68 7d 20 7b 0a 20 20 20 20 23 20 43 68  path} {.    # Ch
1000: 65 63 6b 20 69 66 20 70 61 74 68 20 69 73 20 61  eck if path is a
1010: 20 43 56 53 20 61 64 6d 69 6e 20 66 69 6c 65 2e   CVS admin file.
1020: 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67  .    if {[string
1030: 20 6d 61 74 63 68 20 43 56 53 2f 2a 20 20 20 24   match CVS/*   $
1040: 70 61 74 68 5d 7d 20 7b 72 65 74 75 72 6e 20 31  path]} {return 1
1050: 7d 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e  }.    if {[strin
1060: 67 20 6d 61 74 63 68 20 2a 2f 43 56 53 2f 2a 20  g match */CVS/* 
1070: 24 70 61 74 68 5d 7d 20 7b 72 65 74 75 72 6e 20  $path]} {return 
1080: 31 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 0a  1}.    return 0.
1090: 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76  }..proc ::vc::cv
10a0: 73 3a 3a 77 73 3a 3a 70 61 72 65 6e 74 4f 66 20  s::ws::parentOf 
10b0: 7b 69 64 7d 20 7b 20 63 73 65 74 73 3a 3a 70 61  {id} { csets::pa
10c0: 72 65 6e 74 4f 66 20 24 69 64 20 7d 0a 0a 70 72  rentOf $id }..pr
10d0: 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73  oc ::vc::cvs::ws
10e0: 3a 3a 63 68 65 63 6b 6f 75 74 20 7b 69 64 7d 20  ::checkout {id} 
10f0: 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 77  {.    variable w
1100: 6f 72 6b 73 70 61 63 65 0a 20 20 20 20 63 64 20  orkspace.    cd 
1110: 20 20 20 20 20 24 77 6f 72 6b 73 70 61 63 65 0a       $workspace.
1120: 0a 20 20 20 20 23 20 54 4f 44 4f 3a 20 48 69 64  .    # TODO: Hid
1130: 65 20 74 68 65 20 64 69 72 65 63 74 20 61 63 63  e the direct acc
1140: 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 20  ess to the data 
1150: 73 74 72 75 63 74 75 72 65 73 20 62 65 68 69 6e  structures behin
1160: 64 0a 20 20 20 20 23 20 54 4f 44 4f 3a 20 61 63  d.    # TODO: ac
1170: 63 65 73 73 6f 72 73 20 66 6f 72 20 64 61 74 65  cessors for date
1180: 2c 20 63 6d 73 67 2c 20 72 65 6d 6f 76 65 64 2c  , cmsg, removed,
1190: 20 61 64 64 65 64 2c 20 63 68 61 6e 67 65 64 2c   added, changed,
11a0: 20 61 6e 64 0a 20 20 20 20 23 20 54 4f 44 4f 3a   and.    # TODO:
11b0: 20 61 75 74 68 6f 72 0a 20 20 20 20 61 72 72 61   author.    arra
11c0: 79 20 73 65 74 20 63 73 20 5b 63 73 65 74 73 3a  y set cs [csets:
11d0: 3a 67 65 74 20 24 69 64 5d 0a 0a 20 20 20 20 77  :get $id]..    w
11e0: 72 69 74 65 20 31 20 63 76 73 20 22 40 20 20 24  rite 1 cvs "@  $
11f0: 63 73 28 64 61 74 65 29 22 0a 20 20 20 20 3a 3a  cs(date)".    ::
1200: 66 6f 72 65 61 63 68 20 6c 20 5b 73 70 6c 69 74  foreach l [split
1210: 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 63   [string trim $c
1220: 73 28 63 6d 73 67 29 5d 20 5c 6e 5d 20 7b 0a 09  s(cmsg)] \n] {..
1230: 77 72 69 74 65 20 31 20 63 76 73 20 22 7c 20 20  write 1 cvs "|  
1240: 24 6c 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 3a  $l".    }..    :
1250: 3a 66 6f 72 65 61 63 68 20 7b 66 20 72 7d 20 24  :foreach {f r} $
1260: 63 73 28 72 65 6d 6f 76 65 64 29 20 7b 20 77 72  cs(removed) { wr
1270: 69 74 65 20 32 20 63 76 73 20 22 52 20 20 24 66  ite 2 cvs "R  $f
1280: 20 24 72 22 20 3b 20 52 65 6d 6f 76 65 20 20 20   $r" ; Remove   
1290: 24 66 20 24 72 20 7d 0a 20 20 20 20 3a 3a 66 6f  $f $r }.    ::fo
12a0: 72 65 61 63 68 20 7b 66 20 72 7d 20 24 63 73 28  reach {f r} $cs(
12b0: 61 64 64 65 64 29 20 20 20 7b 20 77 72 69 74 65  added)   { write
12c0: 20 32 20 63 76 73 20 22 41 20 20 24 66 20 24 72   2 cvs "A  $f $r
12d0: 22 20 3b 20 43 68 65 63 6b 6f 75 74 20 24 66 20  " ; Checkout $f 
12e0: 24 72 20 7d 0a 20 20 20 20 3a 3a 66 6f 72 65 61  $r }.    ::forea
12f0: 63 68 20 7b 66 20 72 7d 20 24 63 73 28 63 68 61  ch {f r} $cs(cha
1300: 6e 67 65 64 29 20 7b 20 77 72 69 74 65 20 32 20  nged) { write 2 
1310: 63 76 73 20 22 4d 20 20 24 66 20 24 72 22 20 3b  cvs "M  $f $r" ;
1320: 20 43 68 65 63 6b 6f 75 74 20 24 66 20 24 72 20   Checkout $f $r 
1330: 7d 0a 0a 20 20 20 20 23 20 50 72 6f 76 69 64 65  }..    # Provide
1340: 20 6d 65 74 61 64 61 74 61 20 61 62 6f 75 74 20   metadata about 
1350: 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 74 68  the changeset th
1360: 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 20 77 69  e backend may wi
1370: 73 68 20 74 6f 20 68 61 76 65 0a 20 20 20 20 72  sh to have.    r
1380: 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 73 28  eturn [list $cs(
1390: 61 75 74 68 6f 72 29 20 24 63 73 28 64 61 74 65  author) $cs(date
13a0: 29 20 24 63 73 28 63 6d 73 67 29 5d 0a 7d 0a 0a  ) $cs(cmsg)].}..
13b0: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  # --------------
13c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
13f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
1400: 23 20 49 6e 74 65 72 6e 61 6c 73 0a 0a 70 72 6f  # Internals..pro
1410: 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a  c ::vc::cvs::ws:
1420: 3a 44 65 66 42 61 73 65 20 7b 70 61 74 68 7d 20  :DefBase {path} 
1430: 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 70  {.    variable p
1440: 72 6f 6a 65 63 74 0a 20 20 20 20 76 61 72 69 61  roject.    varia
1450: 62 6c 65 20 62 61 73 65 0a 0a 20 20 20 20 73 65  ble base..    se
1460: 74 20 62 61 73 65 20 24 70 61 74 68 0a 0a 20 20  t base $path..  
1470: 20 20 77 72 69 74 65 20 30 20 63 76 73 20 22 42    write 0 cvs "B
1480: 61 73 65 3a 20 20 20 20 24 62 61 73 65 22 0a 20  ase:    $base". 
1490: 20 20 20 69 66 20 7b 24 70 72 6f 6a 65 63 74 20     if {$project 
14a0: 65 71 20 22 22 7d 20 7b 0a 09 77 72 69 74 65 20  eq ""} {..write 
14b0: 30 20 63 76 73 20 22 50 72 6f 6a 65 63 74 3a 20  0 cvs "Project: 
14c0: 3c 41 4c 4c 3e 22 0a 20 20 20 20 7d 20 65 6c 73  <ALL>".    } els
14d0: 65 20 7b 0a 09 77 72 69 74 65 20 30 20 63 76 73  e {..write 0 cvs
14e0: 20 22 50 72 6f 6a 65 63 74 3a 20 24 70 72 6f 6a   "Project: $proj
14f0: 65 63 74 22 0a 20 20 20 20 7d 0a 20 20 20 20 72  ect".    }.    r
1500: 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a  eturn.}..proc ::
1510: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 52 6f 6f  vc::cvs::ws::Roo
1520: 74 50 61 74 68 20 7b 7d 20 7b 0a 20 20 20 20 76  tPath {} {.    v
1530: 61 72 69 61 62 6c 65 20 70 72 6f 6a 65 63 74 0a  ariable project.
1540: 20 20 20 20 76 61 72 69 61 62 6c 65 20 62 61 73      variable bas
1550: 65 0a 0a 20 20 20 20 69 66 20 7b 24 70 72 6f 6a  e..    if {$proj
1560: 65 63 74 20 65 71 20 22 22 7d 20 7b 0a 09 72 65  ect eq ""} {..re
1570: 74 75 72 6e 20 24 62 61 73 65 0a 20 20 20 20 7d  turn $base.    }
1580: 20 65 6c 73 65 20 7b 0a 09 72 65 74 75 72 6e 20   else {..return 
1590: 24 62 61 73 65 2f 24 70 72 6f 6a 65 63 74 0a 20  $base/$project. 
15a0: 20 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76     }.}..proc ::v
15b0: 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 53 63 61 6e  c::cvs::ws::Scan
15c0: 41 72 63 68 69 76 65 73 20 7b 66 69 6c 65 73 7d  Archives {files}
15d0: 20 7b 0a 20 20 20 20 77 72 69 74 65 20 30 20 63   {.    write 0 c
15e0: 76 73 20 22 53 63 61 6e 6e 69 6e 67 20 61 72 63  vs "Scanning arc
15f0: 68 69 76 65 73 20 2e 2e 2e 22 0a 0a 20 20 20 20  hives ..."..    
1600: 73 65 74 20 64 20 5b 52 6f 6f 74 50 61 74 68 5d  set d [RootPath]
1610: 0a 20 20 20 20 73 65 74 20 72 20 7b 7d 0a 20 20  .    set r {}.  
1620: 20 20 73 65 74 20 6e 20 30 0a 0a 20 20 20 20 3a    set n 0..    :
1630: 3a 66 6f 72 65 61 63 68 20 7b 72 63 73 20 66 7d  :foreach {rcs f}
1640: 20 24 66 69 6c 65 73 20 7b 0a 09 77 72 69 74 65   $files {..write
1650: 20 31 20 63 76 73 20 22 41 72 63 68 69 76 65 20   1 cvs "Archive 
1660: 24 72 63 73 22 0a 09 23 20 47 65 74 20 74 68 65  $rcs"..# Get the
1670: 20 6d 65 74 61 20 64 61 74 61 20 77 65 20 6e 65   meta data we ne
1680: 65 64 20 28 72 65 76 69 73 69 6f 6e 73 2c 20 74  ed (revisions, t
1690: 69 6d 65 6c 69 6e 65 2c 20 6d 65 73 73 61 67 65  imeline, message
16a0: 73 29 2e 0a 09 6c 61 70 70 65 6e 64 20 72 20 24  s)...lappend r $
16b0: 66 20 5b 70 72 6f 63 65 73 73 20 24 64 2f 24 72  f [process $d/$r
16c0: 63 73 5d 0a 09 69 6e 63 72 20 20 20 20 6e 0a 20  cs]..incr    n. 
16d0: 20 20 20 7d 0a 0a 20 20 20 20 77 72 69 74 65 20     }..    write 
16e0: 30 20 63 76 73 20 22 50 72 6f 63 65 73 73 65 64  0 cvs "Processed
16f0: 20 5b 4e 53 49 50 4c 20 24 6e 20 66 69 6c 65 5d   [NSIPL $n file]
1700: 22 0a 20 20 20 20 72 65 74 75 72 6e 20 24 72 0a  ".    return $r.
1710: 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76  }..proc ::vc::cv
1720: 73 3a 3a 77 73 3a 3a 4d 61 6b 65 54 69 6d 65 6c  s::ws::MakeTimel
1730: 69 6e 65 20 7b 6d 65 74 61 7d 20 7b 0a 20 20 20  ine {meta} {.   
1740: 20 77 72 69 74 65 20 30 20 63 76 73 20 22 47 65   write 0 cvs "Ge
1750: 6e 65 72 61 74 69 6e 67 20 63 6f 61 6c 65 73 63  nerating coalesc
1760: 65 64 20 74 69 6d 65 6c 69 6e 65 20 2e 2e 2e 22  ed timeline ..."
1770: 0a 0a 20 20 20 20 73 65 74 20 6e 20 30 0a 20 20  ..    set n 0.  
1780: 20 20 3a 3a 66 6f 72 65 61 63 68 20 7b 66 20 6d    ::foreach {f m
1790: 65 74 61 7d 20 24 6d 65 74 61 20 7b 0a 09 61 72  eta} $meta {..ar
17a0: 72 61 79 20 73 65 74 20 6d 64 20 20 20 24 6d 65  ray set md   $me
17b0: 74 61 0a 09 61 72 72 61 79 20 73 65 74 20 64 61  ta..array set da
17c0: 74 65 20 24 6d 64 28 64 61 74 65 29 0a 09 61 72  te $md(date)..ar
17d0: 72 61 79 20 73 65 74 20 61 75 74 68 20 24 6d 64  ray set auth $md
17e0: 28 61 75 74 68 6f 72 29 0a 09 61 72 72 61 79 20  (author)..array 
17f0: 73 65 74 20 63 6d 73 67 20 24 6d 64 28 63 6f 6d  set cmsg $md(com
1800: 6d 69 74 29 0a 09 61 72 72 61 79 20 73 65 74 20  mit)..array set 
1810: 73 74 61 74 20 24 6d 64 28 73 74 61 74 65 29 0a  stat $md(state).
1820: 0a 09 3a 3a 66 6f 72 65 61 63 68 20 72 65 76 20  ..::foreach rev 
1830: 5b 6c 73 6f 72 74 20 2d 64 69 63 74 20 5b 61 72  [lsort -dict [ar
1840: 72 61 79 20 6e 61 6d 65 73 20 64 61 74 65 5d 5d  ray names date]]
1850: 20 7b 0a 09 20 20 20 20 73 65 74 20 6f 70 65 72   {..    set oper
1860: 61 74 69 6f 6e 20 5b 4f 70 65 72 61 74 69 6f 6e  ation [Operation
1870: 20 24 72 65 76 20 24 73 74 61 74 28 24 72 65 76   $rev $stat($rev
1880: 29 5d 0a 09 20 20 20 20 4e 6f 74 65 44 65 61 64  )]..    NoteDead
1890: 52 6f 6f 74 73 20 24 66 20 24 72 65 76 20 24 6f  Roots $f $rev $o
18a0: 70 65 72 61 74 69 6f 6e 0a 09 20 20 20 20 74 69  peration..    ti
18b0: 6d 65 6c 69 6e 65 3a 3a 61 64 64 20 24 64 61 74  meline::add $dat
18c0: 65 28 24 72 65 76 29 20 24 66 20 24 72 65 76 20  e($rev) $f $rev 
18d0: 24 6f 70 65 72 61 74 69 6f 6e 20 24 61 75 74 68  $operation $auth
18e0: 28 24 72 65 76 29 20 24 63 6d 73 67 28 24 72 65  ($rev) $cmsg($re
18f0: 76 29 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09  v)..    incr n..
1900: 7d 0a 0a 09 69 66 20 7b 5b 69 6e 66 6f 20 65 78  }...if {[info ex
1910: 69 73 74 73 20 6d 64 28 73 79 6d 62 6f 6c 29 5d  ists md(symbol)]
1920: 7d 20 7b 0a 09 20 20 20 20 62 72 61 6e 63 68 3a  } {..    branch:
1930: 3a 64 65 66 20 24 66 20 64 61 74 65 20 24 6d 64  :def $f date $md
1940: 28 73 79 6d 62 6f 6c 29 0a 09 7d 0a 0a 09 75 6e  (symbol)..}...un
1950: 73 65 74 20 6d 64 0a 09 75 6e 73 65 74 20 64 61  set md..unset da
1960: 74 65 0a 09 75 6e 73 65 74 20 61 75 74 68 0a 09  te..unset auth..
1970: 75 6e 73 65 74 20 63 6d 73 67 0a 09 75 6e 73 65  unset cmsg..unse
1980: 74 20 73 74 61 74 0a 20 20 20 20 7d 0a 0a 20 20  t stat.    }..  
1990: 20 20 77 72 69 74 65 20 30 20 63 76 73 20 22 54    write 0 cvs "T
19a0: 69 6d 65 6c 69 6e 65 20 68 61 73 20 5b 4e 53 49  imeline has [NSI
19b0: 50 4c 20 24 6e 20 65 6e 74 72 79 20 65 6e 74 72  PL $n entry entr
19c0: 69 65 73 5d 22 0a 20 20 20 20 72 65 74 75 72 6e  ies]".    return
19d0: 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63  .}..proc ::vc::c
19e0: 76 73 3a 3a 77 73 3a 3a 4e 6f 74 65 44 65 61 64  vs::ws::NoteDead
19f0: 52 6f 6f 74 73 20 7b 66 20 72 65 76 20 6f 70 65  Roots {f rev ope
1a00: 72 61 74 69 6f 6e 7d 20 7b 0a 20 20 20 20 23 20  ration} {.    # 
1a10: 41 20 64 65 61 64 2d 66 69 72 73 74 20 72 65 76  A dead-first rev
1a20: 69 73 69 6f 6e 20 69 73 20 72 65 76 20 31 2e 31  ision is rev 1.1
1a30: 20 77 69 74 68 20 6f 70 20 52 2e 20 46 6f 72 20   with op R. For 
1a40: 61 6e 20 65 78 61 6d 70 6c 65 20 73 65 65 0a 20  an example see. 
1a50: 20 20 20 23 20 74 68 65 20 66 69 6c 65 20 6d 65     # the file me
1a60: 6d 63 68 61 6e 2f 44 45 50 45 4e 44 45 4e 43 49  mchan/DEPENDENCI
1a70: 45 53 2e 20 53 75 63 68 20 61 20 66 69 6c 65 20  ES. Such a file 
1a80: 73 65 65 6d 73 20 74 6f 20 65 78 69 73 74 20 6f  seems to exist o
1a90: 6e 6c 79 21 0a 20 20 20 20 23 20 6f 6e 20 69 74  nly!.    # on it
1aa0: 73 20 62 72 61 6e 63 68 2e 20 54 68 65 20 62 72  s branch. The br
1ab0: 61 6e 63 68 65 73 20 69 6e 66 6f 72 6d 61 74 69  anches informati
1ac0: 6f 6e 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65  on is set on the
1ad0: 20 72 65 76 69 73 69 6f 6e 0a 20 20 20 20 23 20   revision.    # 
1ae0: 28 65 78 74 65 6e 64 20 72 63 73 70 61 72 73 65  (extend rcsparse
1af0: 72 21 29 2c 20 73 79 6d 62 6f 6c 73 20 68 61 73  r!), symbols has
1b00: 20 61 20 74 61 67 2c 20 72 65 66 65 72 69 6e 67   a tag, refering
1b10: 20 74 6f 20 61 20 62 72 61 6e 63 68 2c 0a 20 20   to a branch,.  
1b20: 20 20 23 20 70 6f 73 73 69 62 6c 79 20 6d 61 67    # possibly mag
1b30: 69 63 2e 0a 0a 20 20 20 20 69 66 20 7b 28 24 72  ic...    if {($r
1b40: 65 76 20 65 71 20 22 31 2e 31 22 29 20 26 26 20  ev eq "1.1") && 
1b50: 28 24 6f 70 65 72 61 74 69 6f 6e 20 65 71 20 22  ($operation eq "
1b60: 52 22 29 7d 20 7b 0a 09 77 72 69 74 65 20 32 20  R")} {..write 2 
1b70: 63 76 73 20 22 44 65 61 64 20 72 6f 6f 74 20 72  cvs "Dead root r
1b80: 65 76 69 73 69 6f 6e 3a 20 24 66 22 0a 20 20 20  evision: $f".   
1b90: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a   }.    return.}.
1ba0: 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a  .proc ::vc::cvs:
1bb0: 3a 77 73 3a 3a 4f 70 65 72 61 74 69 6f 6e 20 7b  :ws::Operation {
1bc0: 72 65 76 20 73 74 61 74 65 7d 20 7b 0a 20 20 20  rev state} {.   
1bd0: 20 69 66 20 7b 24 73 74 61 74 65 20 65 71 20 22   if {$state eq "
1be0: 64 65 61 64 22 7d 20 20 20 20 20 20 20 20 20 20  dead"}          
1bf0: 7b 72 65 74 75 72 6e 20 22 52 22 7d 20 3b 20 23  {return "R"} ; #
1c00: 20 52 65 6d 6f 76 65 64 0a 20 20 20 20 69 66 20   Removed.    if 
1c10: 7b 24 72 65 76 20 20 20 65 71 20 22 31 2e 31 22  {$rev   eq "1.1"
1c20: 7d 20 20 20 20 20 20 20 20 20 20 20 7b 72 65 74  }           {ret
1c30: 75 72 6e 20 22 41 22 7d 20 3b 20 23 20 41 64 64  urn "A"} ; # Add
1c40: 65 64 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69  ed.    if {[stri
1c50: 6e 67 20 6d 61 74 63 68 20 2a 2e 31 2e 31 20 24  ng match *.1.1 $
1c60: 72 65 76 5d 7d 20 7b 72 65 74 75 72 6e 20 22 41  rev]} {return "A
1c70: 22 7d 20 3b 20 23 20 41 64 64 65 64 20 6f 6e 20  "} ; # Added on 
1c80: 61 20 62 72 61 6e 63 68 0a 20 20 20 20 72 65 74  a branch.    ret
1c90: 75 72 6e 20 22 4d 22 20 20 20 20 20 20 20 20 20  urn "M"         
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1cb0: 20 20 20 20 20 20 20 20 20 3b 20 23 20 4d 6f 64           ; # Mod
1cc0: 69 66 69 65 64 0a 7d 0a 0a 70 72 6f 63 20 3a 3a  ified.}..proc ::
1cd0: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 4d 61 6b  vc::cvs::ws::Mak
1ce0: 65 43 68 61 6e 67 65 73 65 74 73 20 7b 7d 20 7b  eChangesets {} {
1cf0: 0a 20 20 20 20 77 72 69 74 65 20 30 20 63 76 73  .    write 0 cvs
1d00: 20 22 47 65 6e 65 72 61 74 69 6e 67 20 63 68 61   "Generating cha
1d10: 6e 67 65 73 65 74 73 20 66 72 6f 6d 20 74 69 6d  ngesets from tim
1d20: 65 6c 69 6e 65 22 0a 0a 20 20 20 20 63 73 65 74  eline"..    cset
1d30: 73 3a 3a 69 6e 69 74 0a 20 20 20 20 74 69 6d 65  s::init.    time
1d40: 6c 69 6e 65 3a 3a 66 6f 72 65 61 63 68 20 64 61  line::foreach da
1d50: 74 65 20 66 69 6c 65 20 72 65 76 69 73 69 6f 6e  te file revision
1d60: 20 6f 70 65 72 61 74 69 6f 6e 20 61 75 74 68 6f   operation autho
1d70: 72 20 63 6d 73 67 20 7b 0a 09 63 73 65 74 73 3a  r cmsg {..csets:
1d80: 3a 61 64 64 20 24 64 61 74 65 20 24 66 69 6c 65  :add $date $file
1d90: 20 24 72 65 76 69 73 69 6f 6e 20 24 6f 70 65 72   $revision $oper
1da0: 61 74 69 6f 6e 20 24 61 75 74 68 6f 72 20 24 63  ation $author $c
1db0: 6d 73 67 0a 20 20 20 20 7d 0a 20 20 20 20 63 73  msg.    }.    cs
1dc0: 65 74 73 3a 3a 64 6f 6e 65 0a 0a 20 20 20 20 77  ets::done..    w
1dd0: 72 69 74 65 20 30 20 63 76 73 20 22 46 6f 75 6e  rite 0 cvs "Foun
1de0: 64 20 5b 4e 53 49 50 4c 20 5b 63 73 65 74 73 3a  d [NSIPL [csets:
1df0: 3a 6e 75 6d 5d 20 63 68 61 6e 67 65 73 65 74 5d  :num] changeset]
1e00: 22 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a  ".    return.}..
1e10: 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a  proc ::vc::cvs::
1e20: 77 73 3a 3a 4d 61 6b 65 57 6f 72 6b 73 70 61 63  ws::MakeWorkspac
1e30: 65 20 7b 7d 20 7b 0a 20 20 20 20 76 61 72 69 61  e {} {.    varia
1e40: 62 6c 65 20 70 72 6f 6a 65 63 74 0a 20 20 20 20  ble project.    
1e50: 76 61 72 69 61 62 6c 65 20 77 6f 72 6b 73 70 61  variable workspa
1e60: 63 65 20 5b 66 69 6c 65 75 74 69 6c 3a 3a 74 65  ce [fileutil::te
1e70: 6d 70 66 69 6c 65 20 69 6d 70 6f 72 74 46 5f 63  mpfile importF_c
1e80: 76 73 5f 77 73 5f 5d 0a 0a 20 20 20 20 73 65 74  vs_ws_]..    set
1e90: 20 77 20 24 77 6f 72 6b 73 70 61 63 65 0a 20 20   w $workspace.  
1ea0: 20 20 69 66 20 7b 24 70 72 6f 6a 65 63 74 20 6e    if {$project n
1eb0: 65 20 22 22 7d 20 7b 20 61 70 70 65 6e 64 20 77  e ""} { append w
1ec0: 20 2f 24 70 72 6f 6a 65 63 74 20 7d 0a 0a 20 20   /$project }..  
1ed0: 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 24 77    file delete $w
1ee0: 6f 72 6b 73 70 61 63 65 0a 20 20 20 20 66 69 6c  orkspace.    fil
1ef0: 65 20 6d 6b 64 69 72 20 20 24 77 0a 0a 20 20 20  e mkdir  $w..   
1f00: 20 77 72 69 74 65 20 30 20 63 76 73 20 22 57 6f   write 0 cvs "Wo
1f10: 72 6b 73 70 61 63 65 3a 20 20 24 77 6f 72 6b 73  rkspace:  $works
1f20: 70 61 63 65 22 0a 20 20 20 20 72 65 74 75 72 6e  pace".    return
1f30: 20 24 77 0a 7d 0a 0a 23 20 42 75 69 6c 64 69 6e   $w.}..# Buildin
1f40: 67 20 74 68 65 20 72 65 76 69 73 69 6f 6e 20 74  g the revision t
1f50: 72 65 65 20 66 72 6f 6d 20 74 68 65 20 63 68 61  ree from the cha
1f60: 6e 67 65 73 65 74 73 2e 0a 23 20 4c 69 6d 69 74  ngesets..# Limit
1f70: 61 74 69 6f 6e 3a 20 43 75 72 72 65 6e 74 6c 79  ation: Currently
1f80: 20 6f 6e 6c 79 20 74 72 75 6e 6b 20 63 73 65 74   only trunk cset
1f90: 73 20 69 73 20 68 61 6e 64 6c 65 64 2e 0a 23 20  s is handled..# 
1fa0: 4c 69 6d 69 74 61 74 69 6f 6e 3a 20 44 65 61 64  Limitation: Dead
1fb0: 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 20 72   files are not r
1fc0: 65 6d 6f 76 65 64 2c 20 69 2e 65 2e 20 6e 6f 20  emoved, i.e. no 
1fd0: 27 52 27 20 61 63 74 69 6f 6e 73 20 72 69 67 68  'R' actions righ
1fe0: 74 20 6e 6f 77 2e 0a 0a 70 72 6f 63 20 3a 3a 76  t now...proc ::v
1ff0: 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 50 72 6f 63  c::cvs::ws::Proc
2000: 65 73 73 42 72 61 6e 63 68 65 73 20 7b 7d 20 7b  essBranches {} {
2010: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 69 6d  .    variable im
2020: 70 6f 72 74 61 62 6c 65 0a 0a 20 20 20 20 77 72  portable..    wr
2030: 69 74 65 20 30 20 63 76 73 20 22 4f 72 67 61 6e  ite 0 cvs "Organ
2040: 69 7a 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  izing the change
2050: 73 65 74 73 20 69 6e 74 6f 20 62 72 61 6e 63 68  sets into branch
2060: 65 73 22 0a 0a 20 20 20 20 73 65 74 20 72 65 6d  es"..    set rem
2070: 61 69 6e 64 65 72 20 5b 50 72 6f 63 65 73 73 54  ainder [ProcessT
2080: 72 75 6e 6b 5d 0a 20 20 20 20 77 68 69 6c 65 20  runk].    while 
2090: 7b 5b 6c 6c 65 6e 67 74 68 20 24 72 65 6d 61 69  {[llength $remai
20a0: 6e 64 65 72 5d 7d 20 7b 0a 09 73 65 74 20 72 65  nder]} {..set re
20b0: 6d 61 69 6e 64 65 72 20 5b 50 72 6f 63 65 73 73  mainder [Process
20c0: 42 72 61 6e 63 68 20 24 72 65 6d 61 69 6e 64 65  Branch $remainde
20d0: 72 5d 0a 09 23 20 72 65 74 75 72 6e 20 2d 63 6f  r]..# return -co
20e0: 64 65 20 62 72 65 61 6b 20 6d 61 79 20 62 65 20  de break may be 
20f0: 73 69 67 6e 61 6c 65 64 20 74 6f 20 67 69 76 65  signaled to give
2100: 20 75 70 20 77 69 74 68 20 6e 6f 6e 2d 65 6d 70   up with non-emp
2110: 74 79 0a 09 23 20 73 65 74 20 6f 66 20 75 6e 70  ty..# set of unp
2120: 72 6f 63 65 73 73 65 64 20 63 68 61 6e 67 65 73  rocessed changes
2130: 65 74 73 2e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ets..    }..    
2140: 23 20 53 74 61 74 75 73 20 69 6e 66 6f 72 6d 61  # Status informa
2150: 74 69 6f 6e 20 2e 2e 2e 0a 20 20 20 20 73 65 74  tion ....    set
2160: 20 6e 72 20 20 5b 6c 6c 65 6e 67 74 68 20 24 72   nr  [llength $r
2170: 65 6d 61 69 6e 64 65 72 5d 0a 20 20 20 20 73 65  emainder].    se
2180: 74 20 6e 69 20 20 5b 6c 6c 65 6e 67 74 68 20 24  t ni  [llength $
2190: 69 6d 70 6f 72 74 61 62 6c 65 5d 0a 20 20 20 20  importable].    
21a0: 73 65 74 20 66 6d 74 20 25 5b 73 74 72 69 6e 67  set fmt %[string
21b0: 20 6c 65 6e 67 74 68 20 5b 63 73 65 74 73 3a 3a   length [csets::
21c0: 6e 75 6d 5d 5d 73 0a 0a 20 20 20 20 77 72 69 74  num]]s..    writ
21d0: 65 20 30 20 63 76 73 20 22 55 6e 70 72 6f 63 65  e 0 cvs "Unproce
21e0: 73 73 65 64 3a 20 5b 66 6f 72 6d 61 74 20 24 66  ssed: [format $f
21f0: 6d 74 20 24 6e 72 5d 20 5b 53 49 50 4c 20 24 6e  mt $nr] [SIPL $n
2200: 72 20 63 68 61 6e 67 65 73 65 74 5d 20 28 57 69  r changeset] (Wi
2210: 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 29 22 0a  ll be ignored)".
2220: 20 20 20 20 77 72 69 74 65 20 30 20 63 76 73 20      write 0 cvs 
2230: 22 54 6f 20 69 6d 70 6f 72 74 3a 20 20 20 5b 66  "To import:   [f
2240: 6f 72 6d 61 74 20 24 66 6d 74 20 24 6e 69 5d 20  ormat $fmt $ni] 
2250: 5b 53 49 50 4c 20 24 6e 69 20 63 68 61 6e 67 65  [SIPL $ni change
2260: 73 65 74 5d 22 0a 20 20 20 20 72 65 74 75 72 6e  set]".    return
2270: 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63  .}..proc ::vc::c
2280: 76 73 3a 3a 77 73 3a 3a 50 72 6f 63 65 73 73 54  vs::ws::ProcessT
2290: 72 75 6e 6b 20 7b 7d 20 7b 0a 20 20 20 20 76 61  runk {} {.    va
22a0: 72 69 61 62 6c 65 20 69 6d 70 6f 72 74 61 62 6c  riable importabl
22b0: 65 0a 0a 20 20 20 20 77 72 69 74 65 20 30 20 63  e..    write 0 c
22c0: 76 73 20 22 50 72 6f 63 65 73 73 69 6e 67 20 74  vs "Processing t
22d0: 68 65 20 74 72 75 6e 6b 20 63 68 61 6e 67 65 73  he trunk changes
22e0: 65 74 73 22 0a 0a 20 20 20 20 73 65 74 20 72 65  ets"..    set re
22f0: 6d 61 69 6e 64 65 72 20 7b 7d 0a 20 20 20 20 73  mainder {}.    s
2300: 65 74 20 74 20 20 20 20 20 20 20 20 20 30 0a 20  et t         0. 
2310: 20 20 20 73 65 74 20 6e 20 20 20 20 20 20 20 20     set n        
2320: 20 5b 63 73 65 74 73 3a 3a 6e 75 6d 5d 0a 20 20   [csets::num].  
2330: 20 20 73 65 74 20 70 61 72 65 6e 74 20 20 20 20    set parent    
2340: 7b 7d 0a 0a 20 20 20 20 66 6f 72 20 7b 73 65 74  {}..    for {set
2350: 20 63 20 30 7d 20 7b 24 63 20 3c 20 24 6e 7d 20   c 0} {$c < $n} 
2360: 7b 69 6e 63 72 20 63 7d 20 7b 0a 09 69 66 20 7b  {incr c} {..if {
2370: 5b 63 73 65 74 73 3a 3a 69 73 54 72 75 6e 6b 20  [csets::isTrunk 
2380: 24 63 5d 7d 20 7b 0a 09 20 20 20 20 63 73 65 74  $c]} {..    cset
2390: 73 3a 3a 73 65 74 50 61 72 65 6e 74 4f 66 20 24  s::setParentOf $
23a0: 63 20 24 70 61 72 65 6e 74 0a 09 20 20 20 20 73  c $parent..    s
23b0: 65 74 20 70 61 72 65 6e 74 20 24 63 0a 09 20 20  et parent $c..  
23c0: 20 20 69 6e 63 72 20 74 0a 09 20 20 20 20 6c 61    incr t..    la
23d0: 70 70 65 6e 64 20 69 6d 70 6f 72 74 61 62 6c 65  ppend importable
23e0: 20 24 63 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20   $c..} else {.. 
23f0: 20 20 20 6c 61 70 70 65 6e 64 20 72 65 6d 61 69     lappend remai
2400: 6e 64 65 72 20 24 63 0a 09 7d 0a 20 20 20 20 7d  nder $c..}.    }
2410: 0a 0a 20 20 20 20 77 72 69 74 65 20 30 20 63 76  ..    write 0 cv
2420: 73 20 22 46 6f 75 6e 64 20 5b 4e 53 49 50 4c 20  s "Found [NSIPL 
2430: 24 74 20 7b 74 72 75 6e 6b 20 63 68 61 6e 67 65  $t {trunk change
2440: 73 65 74 7d 5d 2c 20 5b 4e 53 49 50 4c 20 5b 6c  set}], [NSIPL [l
2450: 6c 65 6e 67 74 68 20 24 72 65 6d 61 69 6e 64 65  length $remainde
2460: 72 5d 20 7b 62 72 61 6e 63 68 20 63 68 61 6e 67  r] {branch chang
2470: 65 73 65 74 7d 5d 22 0a 20 20 20 20 72 65 74 75  eset}]".    retu
2480: 72 6e 20 24 72 65 6d 61 69 6e 64 65 72 0a 7d 0a  rn $remainder.}.
2490: 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a  .proc ::vc::cvs:
24a0: 3a 77 73 3a 3a 50 72 6f 63 65 73 73 42 72 61 6e  :ws::ProcessBran
24b0: 63 68 20 7b 63 73 6c 69 73 74 7d 20 7b 0a 20 20  ch {cslist} {.  
24c0: 20 20 77 72 69 74 65 20 30 20 63 76 73 20 22 50    write 0 cvs "P
24d0: 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 72 65  rocessing the re
24e0: 6d 61 69 6e 69 6e 67 20 5b 53 49 50 4c 20 5b 6c  maining [SIPL [l
24f0: 6c 65 6e 67 74 68 20 24 63 73 6c 69 73 74 5d 20  length $cslist] 
2500: 63 68 61 6e 67 65 73 65 74 20 22 5b 6c 6c 65 6e  changeset "[llen
2510: 67 74 68 20 24 63 73 6c 69 73 74 5d 20 63 68 61  gth $cslist] cha
2520: 6e 67 65 73 65 74 73 22 5d 22 0a 0a 20 20 20 20  ngesets"]"..    
2530: 73 65 74 20 62 61 73 65 20 20 20 5b 6c 69 6e 64  set base   [lind
2540: 65 78 20 24 63 73 6c 69 73 74 20 30 5d 0a 20 20  ex $cslist 0].  
2550: 20 20 73 65 74 20 63 73 6c 69 73 74 20 5b 6c 72    set cslist [lr
2560: 61 6e 67 65 20 24 63 73 6c 69 73 74 20 31 20 65  ange $cslist 1 e
2570: 6e 64 5d 0a 0a 20 20 20 20 63 73 65 74 73 3a 3a  nd]..    csets::
2580: 44 55 4d 50 20 24 62 61 73 65 0a 0a 20 20 20 20  DUMP $base..    
2590: 23 20 57 68 69 63 68 20 62 72 61 6e 63 68 20 64  # Which branch d
25a0: 6f 65 73 20 62 61 73 65 20 62 65 6c 6f 6e 67 20  oes base belong 
25b0: 74 6f 3f 0a 20 20 20 20 23 20 2d 20 49 74 20 68  to?.    # - It h
25c0: 61 73 20 74 6f 20 62 65 20 74 68 65 20 62 61 73  as to be the bas
25d0: 65 20 6f 66 20 61 6e 20 75 6e 70 72 6f 63 65 73  e of an unproces
25e0: 73 65 64 20 62 72 61 6e 63 68 21 0a 20 20 20 20  sed branch!.    
25f0: 23 20 20 20 4f 74 68 65 72 77 69 73 65 20 69 74  #   Otherwise it
2600: 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e   would have been
2610: 20 6f 6e 20 65 69 74 68 65 72 20 74 68 65 20 74   on either the t
2620: 72 75 6e 6b 0a 20 20 20 20 23 20 20 20 6f 72 20  runk.    #   or 
2630: 61 6e 20 61 6c 72 65 61 64 79 20 70 72 6f 63 65  an already proce
2640: 73 73 65 64 20 62 72 61 6e 63 68 2e 0a 20 20 20  ssed branch..   
2650: 20 23 20 57 68 65 72 65 20 69 73 20 69 74 73 20   # Where is its 
2660: 72 6f 6f 74 20 63 68 61 6e 67 65 73 65 74 20 3f  root changeset ?
2670: 0a 20 20 20 20 23 20 2d 20 54 68 65 20 72 6f 6f  .    # - The roo
2680: 74 20 68 61 73 20 74 6f 20 63 6f 6d 65 20 62 65  t has to come be
2690: 66 6f 72 65 20 74 68 65 20 62 61 73 65 2c 20 69  fore the base, i
26a0: 74 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20  t has already.  
26b0: 20 20 23 20 20 20 62 65 65 6e 20 70 72 6f 63 65    #   been proce
26c0: 73 73 65 64 20 3d 3e 20 53 6d 61 6c 6c 65 72 20  ssed => Smaller 
26d0: 69 64 2c 20 6f 6c 64 65 72 20 69 6e 20 74 69 6d  id, older in tim
26e0: 65 2e 0a 20 20 20 20 23 20 2d 20 42 61 73 65 64  e..    # - Based
26f0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 20 63 68   on the files ch
2700: 61 6e 67 65 64 2f 72 65 6d 6f 76 65 64 20 62 79  anged/removed by
2710: 20 74 68 65 20 62 61 73 65 2c 20 61 6e 64 20 74   the base, and t
2720: 68 65 69 72 0a 20 20 20 20 23 20 20 20 76 65 72  heir.    #   ver
2730: 73 69 6f 6e 73 20 77 65 20 6b 6e 6f 77 20 74 68  sions we know th
2740: 65 20 72 6f 6f 74 20 76 65 72 73 69 6f 6e 73 20  e root versions 
2750: 6f 66 20 74 68 65 73 65 20 66 69 6c 65 73 2c 20  of these files, 
2760: 61 6e 64 20 77 65 0a 20 20 20 20 23 20 20 20 63  and we.    #   c
2770: 61 6e 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  an determine the
2780: 20 63 68 61 6e 67 65 73 65 74 73 20 74 68 65 79   changesets they
2790: 20 61 72 65 20 69 6e 20 3d 3e 20 49 6e 74 65 72   are in => Inter
27a0: 73 65 63 74 69 6f 6e 0a 20 20 20 20 23 20 20 20  section.    #   
27b0: 70 6c 75 73 20 63 61 70 20 66 72 6f 6d 20 70 72  plus cap from pr
27c0: 65 76 69 6f 75 73 20 63 6f 6e 74 72 61 69 6e 74  evious contraint
27d0: 20 67 69 76 65 73 20 75 73 20 74 68 65 20 70 6f   gives us the po
27e0: 73 73 69 62 6c 65 0a 20 20 20 20 23 20 20 20 63  ssible.    #   c
27f0: 61 6e 64 69 64 61 74 65 73 2e 0a 0a 20 20 20 20  andidates...    
2800: 77 72 69 74 65 20 34 20 63 76 73 20 22 42 72 61  write 4 cvs "Bra
2810: 6e 63 68 20 62 61 73 65 20 24 62 61 73 65 22 0a  nch base $base".
2820: 0a 20 20 20 20 3a 3a 66 6f 72 65 61 63 68 20 7b  .    ::foreach {
2830: 74 61 67 20 72 6f 6f 74 73 69 67 7d 20 5b 62 72  tag rootsig} [br
2840: 61 6e 63 68 3a 3a 66 69 6e 64 20 5b 63 73 65 74  anch::find [cset
2850: 73 3a 3a 67 65 74 20 24 62 61 73 65 5d 5d 20 62  s::get $base]] b
2860: 72 65 61 6b 0a 0a 20 20 20 20 77 72 69 74 65 20  reak..    write 
2870: 34 20 63 76 73 20 22 42 72 61 6e 63 68 20 74 61  4 cvs "Branch ta
2880: 67 20 20 24 74 61 67 22 0a 20 20 20 20 77 72 69  g  $tag".    wri
2890: 74 65 20 35 20 63 76 73 20 22 52 6f 6f 74 20 73  te 5 cvs "Root s
28a0: 69 67 20 20 20 20 24 72 6f 6f 74 73 69 67 22 0a  ig    $rootsig".
28b0: 0a 20 20 20 20 73 65 74 20 72 6f 6f 74 20 5b 73  .    set root [s
28c0: 69 67 3a 3a 66 69 6e 64 20 24 62 61 73 65 20 24  ig::find $base $
28d0: 72 6f 6f 74 73 69 67 5d 0a 0a 20 20 20 20 77 72  rootsig]..    wr
28e0: 69 74 65 20 34 20 63 76 73 20 22 42 72 61 6e 63  ite 4 cvs "Branc
28f0: 68 20 72 6f 6f 74 20 24 72 6f 6f 74 22 0a 0a 20  h root $root".. 
2900: 20 20 20 77 72 69 74 65 20 30 20 63 76 73 20 22     write 0 cvs "
2910: 43 68 61 6e 67 65 73 65 74 20 24 62 61 73 65 2c  Changeset $base,
2920: 20 73 74 61 72 74 69 6e 67 20 62 72 61 6e 63 68   starting branch
2930: 20 5c 22 24 74 61 67 5c 22 2c 20 72 6f 6f 74 65   \"$tag\", roote
2940: 64 20 61 74 20 24 72 6f 6f 74 22 0a 20 20 20 20  d at $root".    
2950: 63 73 65 74 73 3a 3a 73 65 74 50 61 72 65 6e 74  csets::setParent
2960: 4f 66 20 24 62 61 73 65 20 24 72 6f 6f 74 0a 0a  Of $base $root..
2970: 20 20 20 20 73 65 74 20 72 65 6d 61 69 6e 64 65      set remainde
2980: 72 20 7b 7d 0a 20 20 20 20 73 65 74 20 74 20 20  r {}.    set t  
2990: 20 20 20 20 20 20 20 31 0a 0a 20 20 20 20 3a 3a         1..    ::
29a0: 66 6f 72 65 61 63 68 20 63 20 24 63 73 6c 69 73  foreach c $cslis
29b0: 74 20 7b 0a 09 23 63 73 65 74 73 3a 3a 44 55 4d  t {..#csets::DUM
29c0: 50 20 24 63 0a 09 69 66 20 7b 5b 63 73 65 74 73  P $c..if {[csets
29d0: 3a 3a 73 61 6d 65 42 72 61 6e 63 68 20 24 63 20  ::sameBranch $c 
29e0: 24 62 61 73 65 20 24 74 61 67 5d 7d 20 7b 0a 09  $base $tag]} {..
29f0: 20 20 20 20 63 73 65 74 73 3a 3a 73 65 74 50 61      csets::setPa
2a00: 72 65 6e 74 4f 66 20 24 63 20 24 62 61 73 65 0a  rentOf $c $base.
2a10: 09 20 20 20 20 73 65 74 20 62 61 73 65 20 24 63  .    set base $c
2a20: 0a 09 20 20 20 20 69 6e 63 72 20 74 0a 09 20 20  ..    incr t..  
2a30: 20 20 6c 61 70 70 65 6e 64 20 69 6d 70 6f 72 74    lappend import
2a40: 61 62 6c 65 20 24 63 0a 09 7d 20 65 6c 73 65 20  able $c..} else 
2a50: 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 72  {..    lappend r
2a60: 65 6d 61 69 6e 64 65 72 20 24 63 0a 09 7d 0a 20  emainder $c..}. 
2a70: 20 20 20 7d 0a 0a 20 20 20 20 77 72 69 74 65 20     }..    write 
2a80: 30 20 63 76 73 20 22 46 6f 75 6e 64 20 5b 4e 53  0 cvs "Found [NS
2a90: 49 50 4c 20 24 74 20 22 24 74 61 67 20 63 68 61  IPL $t "$tag cha
2aa0: 6e 67 65 73 65 74 22 5d 2c 20 5b 4e 53 49 50 4c  ngeset"], [NSIPL
2ab0: 20 5b 6c 6c 65 6e 67 74 68 20 24 72 65 6d 61 69   [llength $remai
2ac0: 6e 64 65 72 5d 20 63 68 61 6e 67 65 73 65 74 5d  nder] changeset]
2ad0: 20 6f 75 74 73 69 64 65 22 0a 20 20 20 20 72 65   outside".    re
2ae0: 74 75 72 6e 20 24 72 65 6d 61 69 6e 64 65 72 0a  turn $remainder.
2af0: 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76  }..proc ::vc::cv
2b00: 73 3a 3a 77 73 3a 3a 43 68 65 63 6b 6f 75 74 20  s::ws::Checkout 
2b10: 7b 66 20 72 7d 20 7b 0a 20 20 20 20 76 61 72 69  {f r} {.    vari
2b20: 61 62 6c 65 20 62 61 73 65 0a 20 20 20 20 76 61  able base.    va
2b30: 72 69 61 62 6c 65 20 70 72 6f 6a 65 63 74 0a 0a  riable project..
2b40: 20 20 20 20 23 20 41 64 64 65 64 20 6f 72 20 6d      # Added or m
2b50: 6f 64 69 66 69 65 64 2c 20 70 75 74 20 74 68 65  odified, put the
2b60: 20 72 65 71 75 65 73 74 65 64 20 76 65 72 73 69   requested versi
2b70: 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69  on of the file i
2b80: 6e 74 6f 0a 20 20 20 20 23 20 74 68 65 20 77 6f  nto.    # the wo
2b90: 72 6b 73 70 61 63 65 2e 0a 0a 20 20 20 20 69 66  rkspace...    if
2ba0: 20 7b 24 70 72 6f 6a 65 63 74 20 6e 65 20 22 22   {$project ne ""
2bb0: 7d 20 7b 73 65 74 20 66 20 24 70 72 6f 6a 65 63  } {set f $projec
2bc0: 74 2f 24 66 7d 0a 20 20 20 20 69 66 20 7b 5b 63  t/$f}.    if {[c
2bd0: 61 74 63 68 20 7b 0a 09 64 6f 76 61 20 2d 64 20  atch {..dova -d 
2be0: 24 62 61 73 65 20 63 6f 20 2d 72 20 24 72 20 24  $base co -r $r $
2bf0: 66 0a 20 20 20 20 7d 20 6d 73 67 5d 7d 20 7b 0a  f.    } msg]} {.
2c00: 09 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74  .if {[string mat
2c10: 63 68 20 7b 2a 69 6e 76 61 6c 69 64 20 63 68 61  ch {*invalid cha
2c20: 6e 67 65 20 74 65 78 74 2a 7d 20 24 6d 73 67 5d  nge text*} $msg]
2c30: 7d 20 7b 0a 0a 09 20 20 20 20 23 20 54 68 65 20  } {...    # The 
2c40: 61 72 63 68 69 76 65 20 6f 66 20 74 68 65 20 66  archive of the f
2c50: 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 65 64  ile is corrupted
2c60: 20 61 6e 64 20 74 68 65 20 63 68 6f 73 65 6e 0a   and the chosen.
2c70: 09 20 20 20 20 23 20 76 65 72 73 69 6f 6e 20 6e  .    # version n
2c80: 6f 74 20 61 63 63 65 73 73 69 62 6c 65 20 64 75  ot accessible du
2c90: 65 20 74 6f 20 74 68 61 74 2e 20 57 65 20 72 65  e to that. We re
2ca0: 70 6f 72 74 20 74 68 65 0a 09 20 20 20 20 23 20  port the..    # 
2cb0: 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 6f 74 68  problem, but oth
2cc0: 65 72 77 69 73 65 20 69 67 6e 6f 72 65 20 69 74  erwise ignore it
2cd0: 2e 20 41 73 20 61 20 63 6f 6e 73 65 71 75 65 6e  . As a consequen
2ce0: 63 65 20 74 68 65 0a 09 20 20 20 20 23 20 64 65  ce the..    # de
2cf0: 73 74 69 6e 61 74 69 6f 6e 20 72 65 70 6f 73 69  stination reposi
2d00: 74 6f 72 79 20 77 69 6c 6c 20 6e 6f 74 20 63 6f  tory will not co
2d10: 6e 74 61 69 6e 20 74 68 65 20 66 75 6c 6c 20 68  ntain the full h
2d20: 69 73 74 6f 72 79 0a 09 20 20 20 20 23 20 6f 66  istory..    # of
2d30: 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e   the named file.
2d40: 20 42 79 20 69 67 6e 6f 72 69 6e 67 20 74 68 65   By ignoring the
2d50: 20 70 72 6f 62 6c 65 6d 20 77 65 20 68 6f 77 65   problem we howe
2d60: 76 65 72 0a 09 20 20 20 20 23 20 67 65 74 20 61  ver..    # get a
2d70: 73 20 6d 75 63 68 20 61 73 20 69 73 20 70 6f 73  s much as is pos
2d80: 73 69 62 6c 65 2e 0a 0a 09 20 20 20 20 74 72 6f  sible....    tro
2d90: 75 62 6c 65 3a 3a 61 64 64 20 22 24 66 3a 20 43  uble::add "$f: C
2da0: 6f 72 72 75 70 74 65 64 20 61 72 63 68 69 76 65  orrupted archive
2db0: 20 66 69 6c 65 2e 20 49 6e 61 63 63 65 73 73 69   file. Inaccessi
2dc0: 62 6c 65 20 72 65 76 69 73 69 6f 6e 20 24 72 2e  ble revision $r.
2dd0: 22 0a 09 20 20 20 20 72 65 74 75 72 6e 0a 09 7d  "..    return..}
2de0: 0a 09 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65  ..return -code e
2df0: 72 72 6f 72 20 24 6d 73 67 0a 20 20 20 20 7d 0a  rror $msg.    }.
2e00: 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72      return.}..pr
2e10: 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73  oc ::vc::cvs::ws
2e20: 3a 3a 52 65 6d 6f 76 65 20 7b 66 20 72 7d 20 7b  ::Remove {f r} {
2e30: 0a 20 20 20 20 23 20 52 65 6d 6f 76 65 20 66 69  .    # Remove fi
2e40: 6c 65 20 66 72 6f 6d 20 77 6f 72 6b 73 70 61 63  le from workspac
2e50: 65 2e 20 50 72 75 6e 65 20 65 6d 70 74 79 20 64  e. Prune empty d
2e60: 69 72 65 63 74 6f 72 69 65 73 2e 0a 20 20 20 20  irectories..    
2e70: 23 20 4e 4f 54 45 3a 20 41 20 64 65 61 64 2d 66  # NOTE: A dead-f
2e80: 69 72 73 74 20 66 69 6c 65 20 28 72 65 76 20 31  irst file (rev 1
2e90: 2e 31 20 64 65 61 64 29 20 77 69 6c 6c 20 6e 65  .1 dead) will ne
2ea0: 76 65 72 20 68 61 76 65 20 65 78 69 73 74 65 64  ver have existed
2eb0: 2e 0a 0a 20 20 20 20 66 69 6c 65 20 64 65 6c 65  ...    file dele
2ec0: 74 65 20 24 66 0a 20 20 20 20 50 72 75 6e 65 20  te $f.    Prune 
2ed0: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 66  [file dirname $f
2ee0: 5d 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a  ].    return.}..
2ef0: 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a  proc ::vc::cvs::
2f00: 77 73 3a 3a 50 72 75 6e 65 20 7b 70 61 74 68 7d  ws::Prune {path}
2f10: 20 7b 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c   {.    # NOTE: L
2f20: 6f 67 69 63 61 6c 6c 79 20 65 6d 70 74 79 20 64  ogically empty d
2f30: 69 72 65 63 74 6f 72 69 65 73 20 73 74 69 6c 6c  irectories still
2f40: 20 70 68 79 73 69 63 61 6c 6c 79 20 63 6f 6e 74   physically cont
2f50: 61 69 6e 20 74 68 65 0a 20 20 20 20 23 20 43 56  ain the.    # CV
2f60: 53 20 61 64 6d 69 6e 20 64 69 72 65 63 74 6f 72  S admin director
2f70: 79 2c 20 68 65 6e 63 65 20 74 68 65 20 63 68 65  y, hence the che
2f80: 63 6b 20 66 6f 72 20 3d 3d 20 31 2c 20 6e 6f 74  ck for == 1, not
2f90: 20 3d 3d 20 30 2e 20 54 68 65 72 65 0a 20 20 20   == 0. There.   
2fa0: 20 23 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65   # might also be
2fb0: 20 68 69 64 64 65 6e 20 66 69 6c 65 73 2c 20 77   hidden files, w
2fc0: 65 20 63 6f 75 6e 74 20 74 68 65 6d 20 61 73 20  e count them as 
2fd0: 77 65 6c 6c 2e 20 41 6c 77 61 79 73 20 68 69 64  well. Always hid
2fe0: 64 65 6e 0a 20 20 20 20 23 20 61 72 65 20 2e 20  den.    # are . 
2ff0: 61 6e 64 20 2e 2e 20 61 6e 64 20 74 68 65 79 20  and .. and they 
3000: 64 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 61 73 20  do not count as 
3010: 75 73 65 72 20 66 69 6c 65 2e 0a 0a 20 20 20 20  user file...    
3020: 69 66 20 7b 0a 09 28 5b 6c 6c 65 6e 67 74 68 20  if {..([llength 
3030: 5b 67 6c 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61 69  [glob -nocomplai
3040: 6e 20 2d 64 69 72 65 63 74 6f 72 79 20 20 20 20  n -directory    
3050: 20 20 20 20 20 20 20 20 20 20 24 70 61 74 68 20            $path 
3060: 2a 5d 5d 20 3d 3d 20 31 29 20 26 26 0a 09 28 5b  *]] == 1) &&..([
3070: 6c 6c 65 6e 67 74 68 20 5b 67 6c 6f 62 20 2d 6e  llength [glob -n
3080: 6f 63 6f 6d 70 6c 61 69 6e 20 2d 64 69 72 65 63  ocomplain -direc
3090: 74 6f 72 79 20 2d 74 79 70 65 20 68 69 64 64 65  tory -type hidde
30a0: 6e 20 24 70 61 74 68 20 2a 5d 5d 20 3d 3d 20 32  n $path *]] == 2
30b0: 29 0a 20 20 20 20 7d 20 7b 0a 09 66 69 6c 65 20  ).    } {..file 
30c0: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 70  delete -force $p
30d0: 61 74 68 0a 20 20 20 20 7d 0a 20 20 20 20 72 65  ath.    }.    re
30e0: 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76  turn.}..proc ::v
30f0: 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 4e 53 49 50  c::cvs::ws::NSIP
3100: 4c 20 7b 6e 20 73 69 6e 67 75 6c 61 72 20 7b 70  L {n singular {p
3110: 6c 75 72 61 6c 20 7b 7d 7d 7d 20 7b 0a 20 20 20  lural {}}} {.   
3120: 20 72 65 74 75 72 6e 20 22 24 6e 20 5b 53 49 50   return "$n [SIP
3130: 4c 20 24 6e 20 24 73 69 6e 67 75 6c 61 72 20 24  L $n $singular $
3140: 70 6c 75 72 61 6c 5d 22 0a 7d 0a 70 72 6f 63 20  plural]".}.proc 
3150: 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 53  ::vc::cvs::ws::S
3160: 49 50 4c 20 7b 6e 20 73 69 6e 67 75 6c 61 72 20  IPL {n singular 
3170: 7b 70 6c 75 72 61 6c 20 7b 7d 7d 7d 20 7b 0a 20  {plural {}}} {. 
3180: 20 20 20 69 66 20 7b 24 6e 20 3d 3d 20 31 7d 20     if {$n == 1} 
3190: 7b 72 65 74 75 72 6e 20 24 73 69 6e 67 75 6c 61  {return $singula
31a0: 72 7d 0a 20 20 20 20 69 66 20 7b 24 70 6c 75 72  r}.    if {$plur
31b0: 61 6c 20 65 71 20 22 22 7d 20 7b 73 65 74 20 70  al eq ""} {set p
31c0: 6c 75 72 61 6c 20 24 7b 73 69 6e 67 75 6c 61 72  lural ${singular
31d0: 7d 73 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 24  }s}.    return $
31e0: 70 6c 75 72 61 6c 0a 7d 0a 0a 23 20 2d 2d 2d 2d  plural.}..# ----
31f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 6e 61 6d 65 73  ---------..names
3240: 70 61 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a  pace eval ::vc::
3250: 63 76 73 3a 3a 77 73 20 7b 0a 20 20 20 20 76 61  cvs::ws {.    va
3260: 72 69 61 62 6c 65 20 62 61 73 65 20 20 20 20 20  riable base     
3270: 20 20 7b 7d 20 3b 20 23 20 54 6f 70 6c 65 76 65    {} ; # Topleve
3280: 6c 20 72 65 70 6f 73 69 74 6f 72 79 20 64 69 72  l repository dir
3290: 65 63 74 6f 72 79 0a 20 20 20 20 76 61 72 69 61  ectory.    varia
32a0: 62 6c 65 20 70 72 6f 6a 65 63 74 20 20 20 20 7b  ble project    {
32b0: 7d 20 3b 20 23 20 53 75 62 20 64 69 72 65 63 74  } ; # Sub direct
32c0: 6f 72 79 20 74 6f 20 6c 69 6d 69 74 20 74 68 65  ory to limit the
32d0: 20 69 6d 70 6f 72 74 20 74 6f 2e 0a 20 20 20 20   import to..    
32e0: 76 61 72 69 61 62 6c 65 20 77 6f 72 6b 73 70 61  variable workspa
32f0: 63 65 20 20 7b 7d 20 3b 20 23 20 44 69 72 65 63  ce  {} ; # Direc
3300: 74 6f 72 79 20 74 6f 20 63 68 65 63 6b 6f 75 74  tory to checkout
3310: 20 63 68 61 6e 67 65 73 65 74 73 20 74 6f 2e 0a   changesets to..
3320: 20 20 20 20 76 61 72 69 61 62 6c 65 20 69 6d 70      variable imp
3330: 6f 72 74 61 62 6c 65 20 7b 7d 20 3b 20 23 20 4c  ortable {} ; # L
3340: 69 73 74 20 6f 66 20 74 68 65 20 63 73 65 74 73  ist of the csets
3350: 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 69 6d   which can be im
3360: 70 6f 72 74 65 64 2e 0a 0a 20 20 20 20 6e 61 6d  ported...    nam
3370: 65 73 70 61 63 65 20 65 78 70 6f 72 74 20 63 6f  espace export co
3380: 6e 66 69 67 75 72 65 20 62 65 67 69 6e 20 64 6f  nfigure begin do
3390: 6e 65 20 66 6f 72 65 61 63 68 20 6e 63 73 65 74  ne foreach ncset
33a0: 73 20 6e 69 6d 70 6f 72 74 61 62 6c 65 20 63 68  s nimportable ch
33b0: 65 63 6b 6f 75 74 0a 20 20 20 20 6e 61 6d 65 73  eckout.    names
33c0: 70 61 63 65 20 65 78 70 6f 72 74 20 70 61 72 65  pace export pare
33d0: 6e 74 4f 66 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d  ntOf.}..# ------
33e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
33f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3420: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 52 65 61 64 79 0a  -------.# Ready.
3430: 0a 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65  .package provide
3440: 20 76 63 3a 3a 63 76 73 3a 3a 77 73 20 31 2e 30   vc::cvs::ws 1.0
3450: 0a 72 65 74 75 72 6e 0a                          .return.