Hex Artifact Content
Not logged in

Artifact c0a3a1641dbd2c966d376d993e3831e4185cdf7a:

File tools/lib/cvs.tcl part of check-in [10e3b3ed76] - Fixed bug in the new code setting up the timeline, forgot to clean up loop state, causing data from previous iterations to bleed into the current one, causing the use of bogus data and ultimatively a bogus timeline. Note! Incidentially a bug in the old code was fixed by the new one, the use of mismatching revisions and commit messages. That caused the generation of extra changesets in the old code. by aku on 2007-09-17 04:14:18.

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 63 76 73   require vc::cvs
01d0: 3a 3a 63 6d 64 20 20 20 20 20 20 20 20 20 20 3b  ::cmd          ;
01e0: 20 23 20 41 63 63 65 73 73 20 74 6f 20 63 76 73   # Access to cvs
01f0: 20 61 70 70 6c 69 63 61 74 69 6f 6e 2e 0a 70 61   application..pa
0200: 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 76 63  ckage require vc
0210: 3a 3a 63 76 73 3a 3a 77 73 3a 3a 66 69 6c 65 73  ::cvs::ws::files
0220: 20 20 20 20 3b 20 23 20 53 63 61 6e 20 43 56 53      ; # Scan CVS
0230: 20 72 65 70 6f 73 69 74 6f 72 79 20 66 6f 72 20   repository for 
0240: 72 65 6c 65 76 61 6e 74 20 66 69 6c 65 73 2e 0a  relevant files..
0250: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
0260: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 74 69 6d  vc::cvs::ws::tim
0270: 65 6c 69 6e 65 20 3b 20 23 20 4d 61 6e 61 67 65  eline ; # Manage
0280: 20 74 69 6d 65 6c 69 6e 65 20 6f 66 20 61 6c 6c   timeline of all
0290: 20 63 68 61 6e 67 65 73 2e 0a 70 61 63 6b 61 67   changes..packag
02a0: 65 20 72 65 71 75 69 72 65 20 73 74 72 75 63 74  e require struct
02b0: 3a 3a 74 72 65 65 0a 0a 6e 61 6d 65 73 70 61 63  ::tree..namespac
02c0: 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a 63 76 73  e eval ::vc::cvs
02d0: 3a 3a 77 73 20 7b 0a 20 20 20 20 76 63 3a 3a 74  ::ws {.    vc::t
02e0: 6f 6f 6c 73 3a 3a 6c 6f 67 3a 3a 73 79 73 74 65  ools::log::syste
02f0: 6d 20 63 76 73 0a 20 20 20 20 6e 61 6d 65 73 70  m cvs.    namesp
0300: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a  ace import ::vc:
0310: 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 3a 3a 77 72 69  :tools::log::wri
0320: 74 65 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65  te.    namespace
0330: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 72 63   import ::vc::rc
0340: 73 3a 3a 70 61 72 73 65 72 3a 3a 70 72 6f 63 65  s::parser::proce
0350: 73 73 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65  ss.    namespace
0360: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 63 76   import ::vc::cv
0370: 73 3a 3a 63 6d 64 3a 3a 64 6f 76 61 0a 7d 0a 0a  s::cmd::dova.}..
0380: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  # --------------
0390: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
03c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
03d0: 23 20 41 50 49 0a 0a 23 20 76 63 3a 3a 63 76 73  # API..# vc::cvs
03e0: 3a 3a 77 73 3a 3a 63 6f 6e 66 69 67 75 72 65 20  ::ws::configure 
03f0: 6b 65 79 20 76 61 6c 75 65 20 20 20 20 2d 20 43  key value    - C
0400: 6f 6e 66 69 67 75 72 65 20 74 68 65 20 73 75 62  onfigure the sub
0410: 73 79 73 74 65 6d 2e 0a 23 20 76 63 3a 3a 63 76  system..# vc::cv
0420: 73 3a 3a 77 73 3a 3a 63 68 65 63 6b 20 20 20 20  s::ws::check    
0430: 20 73 72 63 20 6d 76 20 20 20 20 20 20 20 2d 20   src mv       - 
0440: 43 68 65 63 6b 20 69 66 20 73 72 63 20 69 73 20  Check if src is 
0450: 61 20 43 56 53 20 72 65 70 6f 73 69 74 6f 72 79  a CVS repository
0460: 20 64 69 72 65 63 74 6f 72 79 2e 0a 23 20 76 63   directory..# vc
0470: 3a 3a 63 76 73 3a 3a 77 73 3a 3a 62 65 67 69 6e  ::cvs::ws::begin
0480: 20 20 20 20 20 73 72 63 20 20 20 20 20 20 20 20       src        
0490: 20 20 2d 20 53 74 61 72 74 20 6e 65 77 20 77 6f    - Start new wo
04a0: 72 6b 73 70 61 63 65 20 61 6e 64 20 72 65 74 75  rkspace and retu
04b0: 72 6e 20 74 68 65 20 74 6f 70 2d 0a 23 20 20 20  rn the top-.#   
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04e0: 20 20 20 20 6d 6f 73 74 20 64 69 72 65 63 74 6f      most directo
04f0: 72 79 20 63 6f 27 64 20 66 69 6c 65 73 20 61 72  ry co'd files ar
0500: 65 20 70 75 74 20 69 6e 74 6f 2e 0a 23 20 76 63  e put into..# vc
0510: 3a 3a 63 76 73 3a 3a 77 73 3a 3a 6e 63 73 65 74  ::cvs::ws::ncset
0520: 73 20 20 20 20 3f 2d 69 6d 70 6f 72 74 3f 20 20  s    ?-import?  
0530: 20 20 2d 20 52 65 74 72 69 65 76 65 20 6e 75 6d    - Retrieve num
0540: 62 65 72 20 6f 66 20 63 73 65 74 73 20 28 61 6c  ber of csets (al
0550: 6c 2f 74 6f 20 69 6d 70 6f 72 74 29 0a 23 20 76  l/to import).# v
0560: 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 66 6f 72 65  c::cvs::ws::fore
0570: 61 63 68 20 20 20 63 73 76 61 72 20 73 63 72 69  ach   csvar scri
0580: 70 74 20 2d 20 52 75 6e 20 74 68 65 20 73 63 72  pt - Run the scr
0590: 69 70 74 20 66 6f 72 20 65 61 63 68 20 63 68 61  ipt for each cha
05a0: 6e 67 65 73 65 74 2c 20 74 68 65 0a 23 20 20 20  ngeset, the.#   
05b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
05d0: 20 20 20 20 69 64 20 6f 66 20 74 68 65 20 63 75      id of the cu
05e0: 72 72 65 6e 74 20 63 68 61 6e 67 65 73 65 74 20  rrent changeset 
05f0: 73 74 6f 72 65 64 20 69 6e 0a 23 20 20 20 20 20  stored in.#     
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 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e    the variable n
0630: 61 6d 65 64 20 62 79 20 63 73 76 61 72 2e 0a 23  amed by csvar..#
0640: 20 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 64 6f   vc::cvs::ws::do
0650: 6e 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ne              
0660: 20 20 20 20 20 2d 20 43 6c 6f 73 65 20 77 6f 72       - Close wor
0670: 6b 73 70 61 63 65 20 61 6e 64 20 64 65 6c 65 74  kspace and delet
0680: 65 20 69 74 2e 0a 23 20 76 63 3a 3a 63 76 73 3a  e it..# vc::cvs:
0690: 3a 77 73 3a 3a 69 73 61 64 6d 69 6e 20 70 61 74  :ws::isadmin pat
06a0: 68 20 20 20 20 20 20 20 20 20 20 20 2d 20 43 68  h           - Ch
06b0: 65 63 6b 20 69 66 20 70 61 74 68 20 69 73 20 61  eck if path is a
06c0: 6e 20 61 64 6d 69 6e 20 66 69 6c 65 20 6f 66 20  n admin file of 
06d0: 43 56 53 0a 23 20 76 63 3a 3a 63 76 73 3a 3a 77  CVS.# vc::cvs::w
06e0: 73 3a 3a 63 68 65 63 6b 6f 75 74 20 69 64 20 20  s::checkout id  
06f0: 20 20 20 20 20 20 20 20 20 20 2d 20 48 61 76 65            - Have
0700: 20 77 6f 72 6b 73 70 61 63 65 20 63 6f 6e 74 61   workspace conta
0710: 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  in the changeset
0720: 20 69 64 2e 0a 23 0a 23 20 43 6f 6e 66 69 67 75   id..#.# Configu
0730: 72 61 74 69 6f 6e 20 6b 65 79 73 3a 0a 23 0a 23  ration keys:.#.#
0740: 20 2d 70 72 6f 6a 65 63 74 20 70 61 74 68 20 2d   -project path -
0750: 20 53 75 62 20 64 69 72 65 63 74 6f 72 79 20 75   Sub directory u
0760: 6e 64 65 72 20 27 73 72 63 27 20 74 6f 20 6c 69  nder 'src' to li
0770: 6d 69 74 20 74 68 65 20 69 6d 70 6f 72 74 20 74  mit the import t
0780: 6f 2e 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  o...# ----------
0790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
07d0: 2d 2d 2d 0a 23 20 41 50 49 20 49 6d 70 6c 65 6d  ---.# API Implem
07e0: 65 6e 74 61 74 69 6f 6e 0a 0a 70 72 6f 63 20 3a  entation..proc :
07f0: 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 63 6f  :vc::cvs::ws::co
0800: 6e 66 69 67 75 72 65 20 7b 6b 65 79 20 76 61 6c  nfigure {key val
0810: 75 65 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62  ue} {.    variab
0820: 6c 65 20 70 72 6f 6a 65 63 74 0a 0a 20 20 20 20  le project..    
0830: 73 77 69 74 63 68 20 2d 65 78 61 63 74 20 2d 2d  switch -exact --
0840: 20 24 6b 65 79 20 7b 0a 09 2d 70 72 6f 6a 65 63   $key {..-projec
0850: 74 20 7b 20 73 65 74 20 70 72 6f 6a 65 63 74 20  t { set project 
0860: 24 76 61 6c 75 65 20 7d 0a 09 64 65 66 61 75 6c  $value }..defaul
0870: 74 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20  t {..    return 
0880: 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 55 6e 6b  -code error "Unk
0890: 6e 6f 77 6e 20 73 77 69 74 63 68 20 24 6b 65 79  nown switch $key
08a0: 2c 20 65 78 70 65 63 74 65 64 20 5c 0a 20 20 20  , expected \.   
08b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
08d0: 2d 70 72 6f 6a 65 63 74 22 0a 09 7d 0a 20 20 20  -project"..}.   
08e0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a   }.    return.}.
08f0: 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a  .proc ::vc::cvs:
0900: 3a 77 73 3a 3a 63 68 65 63 6b 20 7b 73 72 63 20  :ws::check {src 
0910: 6d 76 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62  mv} {.    variab
0920: 6c 65 20 70 72 6f 6a 65 63 74 0a 20 20 20 20 75  le project.    u
0930: 70 76 61 72 20 31 20 24 6d 76 20 6d 73 67 0a 20  pvar 1 $mv msg. 
0940: 20 20 20 69 66 20 7b 0a 09 21 5b 66 69 6c 65 75     if {..![fileu
0950: 74 69 6c 3a 3a 74 65 73 74 20 24 73 72 63 20 20  til::test $src  
0960: 20 20 20 20 20 20 20 65 72 64 20 6d 73 67 20 22         erd msg "
0970: 43 56 53 20 52 65 70 6f 73 69 74 6f 72 79 22 5d  CVS Repository"]
0980: 20 7c 7c 0a 09 21 5b 66 69 6c 65 75 74 69 6c 3a   ||..![fileutil:
0990: 3a 74 65 73 74 20 24 73 72 63 2f 43 56 53 52 4f  :test $src/CVSRO
09a0: 4f 54 20 65 72 64 20 6d 73 67 20 22 43 56 53 20  OT erd msg "CVS 
09b0: 41 64 6d 69 6e 20 64 69 72 65 63 74 6f 72 79 22  Admin directory"
09c0: 5d 20 7c 7c 0a 09 28 28 24 70 72 6f 6a 65 63 74  ] ||..(($project
09d0: 20 6e 65 20 22 22 29 20 26 26 0a 09 20 21 5b 66   ne "") &&.. ![f
09e0: 69 6c 65 75 74 69 6c 3a 3a 74 65 73 74 20 24 73  ileutil::test $s
09f0: 72 63 2f 24 70 72 6f 6a 65 63 74 20 65 72 64 20  rc/$project erd 
0a00: 6d 73 67 20 22 50 72 6f 6a 65 63 74 20 64 69 72  msg "Project dir
0a10: 65 63 74 6f 72 79 22 5d 29 0a 20 20 20 20 7d 20  ectory"]).    } 
0a20: 7b 0a 09 72 65 74 75 72 6e 20 30 0a 20 20 20 20  {..return 0.    
0a30: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 31 0a 7d  }.    return 1.}
0a40: 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73  ..proc ::vc::cvs
0a50: 3a 3a 77 73 3a 3a 62 65 67 69 6e 20 7b 73 72 63  ::ws::begin {src
0a60: 7d 20 7b 0a 20 20 20 20 69 66 20 7b 21 5b 63 68  } {.    if {![ch
0a70: 65 63 6b 20 24 73 72 63 20 6d 73 67 5d 7d 20 7b  eck $src msg]} {
0a80: 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72   return -code er
0a90: 72 6f 72 20 24 6d 73 67 20 7d 0a 0a 20 20 20 20  ror $msg }..    
0aa0: 44 65 66 42 61 73 65 20 24 73 72 63 0a 20 20 20  DefBase $src.   
0ab0: 20 4d 61 6b 65 54 69 6d 65 6c 69 6e 65 20 5b 53   MakeTimeline [S
0ac0: 63 61 6e 41 72 63 68 69 76 65 73 20 5b 66 69 6c  canArchives [fil
0ad0: 65 73 3a 3a 66 69 6e 64 20 5b 52 6f 6f 74 50 61  es::find [RootPa
0ae0: 74 68 5d 5d 5d 0a 0a 20 20 20 20 23 20 4f 4c 44  th]]]..    # OLD
0af0: 20 61 70 69 20 63 61 6c 6c 73 20 2e 2e 2e 20 54   api calls ... T
0b00: 4f 44 4f 20 72 65 77 6f 72 6b 20 66 6f 72 20 6d  ODO rework for m
0b10: 6f 72 65 20 73 74 72 75 63 74 75 72 65 20 2e 2e  ore structure ..
0b20: 2e 0a 20 20 20 20 63 73 65 74 73 20 20 20 20 3b  ..    csets    ;
0b30: 20 23 20 47 72 6f 75 70 20 63 68 61 6e 67 65 73   # Group changes
0b40: 20 69 6e 74 6f 20 73 65 74 73 0a 20 20 20 20 72   into sets.    r
0b50: 74 72 65 65 20 20 20 20 3b 20 23 20 42 75 69 6c  tree    ; # Buil
0b60: 64 20 72 65 76 69 73 69 6f 6e 20 74 72 65 65 20  d revision tree 
0b70: 28 74 72 75 6e 6b 20 6f 6e 6c 79 20 72 69 67 68  (trunk only righ
0b80: 74 20 6e 6f 77 29 2e 0a 0a 20 20 20 20 72 65 74  t now)...    ret
0b90: 75 72 6e 20 5b 4d 61 6b 65 57 6f 72 6b 73 70 61  urn [MakeWorkspa
0ba0: 63 65 5d 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63  ce].}..proc ::vc
0bb0: 3a 3a 63 76 73 3a 3a 77 73 3a 3a 64 6f 6e 65 20  ::cvs::ws::done 
0bc0: 7b 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c  {} {.    variabl
0bd0: 65 20 20 20 20 20 20 20 20 20 20 20 20 77 6f 72  e            wor
0be0: 6b 73 70 61 63 65 0a 20 20 20 20 66 69 6c 65 20  kspace.    file 
0bf0: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 77  delete -force $w
0c00: 6f 72 6b 73 70 61 63 65 0a 20 20 20 20 72 65 74  orkspace.    ret
0c10: 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63  urn.}..proc ::vc
0c20: 3a 3a 63 76 73 3a 3a 77 73 3a 3a 66 6f 72 65 61  ::cvs::ws::forea
0c30: 63 68 20 7b 63 76 20 73 63 72 69 70 74 7d 20 7b  ch {cv script} {
0c40: 0a 20 20 20 20 23 20 4f 4c 44 20 61 70 69 20 2e  .    # OLD api .
0c50: 2e 2e 20 54 4f 44 4f 20 69 6e 6c 69 6e 65 0a 20  .. TODO inline. 
0c60: 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b 6c 69     uplevel 1 [li
0c70: 73 74 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73  st ::vc::cvs::ws
0c80: 3a 3a 66 6f 72 65 61 63 68 5f 63 73 65 74 20 24  ::foreach_cset $
0c90: 63 76 20 30 20 24 73 63 72 69 70 74 5d 0a 7d 0a  cv 0 $script].}.
0ca0: 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a  .proc ::vc::cvs:
0cb0: 3a 77 73 3a 3a 6e 63 73 65 74 73 20 7b 61 72 67  :ws::ncsets {arg
0cc0: 73 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c  s} {.    variabl
0cd0: 65 20 6e 63 73 0a 20 20 20 20 76 61 72 69 61 62  e ncs.    variab
0ce0: 6c 65 20 6e 74 72 75 6e 6b 0a 0a 20 20 20 20 69  le ntrunk..    i
0cf0: 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 61 72 67  f {[llength $arg
0d00: 73 5d 20 3e 20 31 7d 20 7b 0a 09 72 65 74 75 72  s] > 1} {..retur
0d10: 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 77  n -code error "w
0d20: 72 6f 6e 67 23 61 72 67 73 3a 20 45 78 70 65 63  rong#args: Expec
0d30: 74 65 64 20 3f 2d 69 6d 70 6f 72 74 3f 22 0a 20  ted ?-import?". 
0d40: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 6c 6c     } elseif {[ll
0d50: 65 6e 67 74 68 20 24 61 72 67 73 5d 20 3d 3d 20  ength $args] == 
0d60: 31 7d 20 7b 0a 09 69 66 20 7b 5b 73 65 74 20 6b  1} {..if {[set k
0d70: 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 30   [lindex $args 0
0d80: 5d 5d 20 6e 65 20 22 2d 69 6d 70 6f 72 74 22 7d  ]] ne "-import"}
0d90: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 2d   {..    return -
0da0: 63 6f 64 65 20 22 55 6e 6b 6e 6f 77 6e 20 73 77  code "Unknown sw
0db0: 69 74 63 68 20 24 6b 2c 20 65 78 70 65 63 74 65  itch $k, expecte
0dc0: 64 20 2d 69 6d 70 6f 72 74 22 0a 09 7d 20 65 6c  d -import"..} el
0dd0: 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  se {..    return
0de0: 20 24 6e 74 72 75 6e 6b 0a 09 7d 0a 20 20 20 20   $ntrunk..}.    
0df0: 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 20 24  }..    return  $
0e00: 6e 63 73 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63  ncs.}..proc ::vc
0e10: 3a 3a 63 76 73 3a 3a 77 73 3a 3a 69 73 61 64 6d  ::cvs::ws::isadm
0e20: 69 6e 20 7b 70 61 74 68 7d 20 7b 0a 20 20 20 20  in {path} {.    
0e30: 23 20 43 68 65 63 6b 20 69 66 20 70 61 74 68 20  # Check if path 
0e40: 69 73 20 61 20 43 56 53 20 61 64 6d 69 6e 20 66  is a CVS admin f
0e50: 69 6c 65 2e 0a 20 20 20 20 69 66 20 7b 5b 73 74  ile..    if {[st
0e60: 72 69 6e 67 20 6d 61 74 63 68 20 43 56 53 2f 2a  ring match CVS/*
0e70: 20 20 20 24 70 61 74 68 5d 7d 20 7b 72 65 74 75     $path]} {retu
0e80: 72 6e 20 31 7d 0a 20 20 20 20 69 66 20 7b 5b 73  rn 1}.    if {[s
0e90: 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 2f 43 56  tring match */CV
0ea0: 53 2f 2a 20 24 70 61 74 68 5d 7d 20 7b 72 65 74  S/* $path]} {ret
0eb0: 75 72 6e 20 31 7d 0a 20 20 20 20 72 65 74 75 72  urn 1}.    retur
0ec0: 6e 20 30 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63  n 0.}..proc ::vc
0ed0: 3a 3a 63 76 73 3a 3a 77 73 3a 3a 63 68 65 63 6b  ::cvs::ws::check
0ee0: 6f 75 74 20 7b 69 64 7d 20 7b 0a 20 20 20 20 76  out {id} {.    v
0ef0: 61 72 69 61 62 6c 65 20 77 6f 72 6b 73 70 61 63  ariable workspac
0f00: 65 20 3b 20 63 64 20 24 77 6f 72 6b 73 70 61 63  e ; cd $workspac
0f10: 65 0a 20 20 20 20 77 73 73 65 74 75 70 20 24 69  e.    wssetup $i
0f20: 64 20 3b 20 23 20 4f 4c 44 20 61 70 69 20 2e 2e  d ; # OLD api ..
0f30: 2e 20 54 4f 44 4f 20 69 6e 6c 69 6e 65 0a 7d 0a  . TODO inline.}.
0f40: 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .# -------------
0f50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0f90: 0a 23 20 49 6e 74 65 72 6e 61 6c 73 20 2d 20 4f  .# Internals - O
0fa0: 6c 64 20 41 50 49 20 66 6f 72 20 6e 6f 77 2e 0a  ld API for now..
0fb0: 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a  .proc ::vc::cvs:
0fc0: 3a 77 73 3a 3a 44 65 66 42 61 73 65 20 7b 70 61  :ws::DefBase {pa
0fd0: 74 68 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62  th} {.    variab
0fe0: 6c 65 20 70 72 6f 6a 65 63 74 0a 20 20 20 20 76  le project.    v
0ff0: 61 72 69 61 62 6c 65 20 62 61 73 65 0a 0a 20 20  ariable base..  
1000: 20 20 73 65 74 20 62 61 73 65 20 24 70 61 74 68    set base $path
1010: 0a 0a 20 20 20 20 77 72 69 74 65 20 30 20 63 76  ..    write 0 cv
1020: 73 20 22 42 61 73 65 3a 20 20 20 20 24 62 61 73  s "Base:    $bas
1030: 65 22 0a 20 20 20 20 69 66 20 7b 24 70 72 6f 6a  e".    if {$proj
1040: 65 63 74 20 65 71 20 22 22 7d 20 7b 0a 09 77 72  ect eq ""} {..wr
1050: 69 74 65 20 30 20 63 76 73 20 22 50 72 6f 6a 65  ite 0 cvs "Proje
1060: 63 74 3a 20 3c 41 4c 4c 3e 22 0a 20 20 20 20 7d  ct: <ALL>".    }
1070: 20 65 6c 73 65 20 7b 0a 09 77 72 69 74 65 20 30   else {..write 0
1080: 20 63 76 73 20 22 50 72 6f 6a 65 63 74 3a 20 24   cvs "Project: $
1090: 70 72 6f 6a 65 63 74 22 0a 20 20 20 20 7d 0a 20  project".    }. 
10a0: 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f     return.}..pro
10b0: 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a  c ::vc::cvs::ws:
10c0: 3a 52 6f 6f 74 50 61 74 68 20 7b 7d 20 7b 0a 20  :RootPath {} {. 
10d0: 20 20 20 76 61 72 69 61 62 6c 65 20 70 72 6f 6a     variable proj
10e0: 65 63 74 0a 20 20 20 20 76 61 72 69 61 62 6c 65  ect.    variable
10f0: 20 62 61 73 65 0a 0a 20 20 20 20 69 66 20 7b 24   base..    if {$
1100: 70 72 6f 6a 65 63 74 20 65 71 20 22 22 7d 20 7b  project eq ""} {
1110: 0a 09 72 65 74 75 72 6e 20 24 62 61 73 65 0a 20  ..return $base. 
1120: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 74     } else {..ret
1130: 75 72 6e 20 24 62 61 73 65 2f 24 70 72 6f 6a 65  urn $base/$proje
1140: 63 74 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 53 63  ct.    }.}..# Sc
1150: 61 6e 20 72 65 70 6f 73 69 74 6f 72 79 2c 20 63  an repository, c
1160: 6f 6c 6c 65 63 74 20 61 72 63 68 69 76 65 73 2c  ollect archives,
1170: 20 70 61 72 73 65 20 74 68 65 6d 2c 20 61 6e 64   parse them, and
1180: 20 63 6f 6c 6c 65 63 74 20 72 65 76 69 73 69 6f   collect revisio
1190: 6e 0a 23 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  n.# information 
11a0: 28 66 69 6c 65 2c 20 72 65 76 69 73 69 6f 6e 20  (file, revision 
11b0: 2d 3e 20 64 61 74 65 2c 20 61 75 74 68 6f 72 2c  -> date, author,
11c0: 20 63 6f 6d 6d 69 74 20 6d 65 73 73 61 67 65 29   commit message)
11d0: 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73  ..proc ::vc::cvs
11e0: 3a 3a 77 73 3a 3a 53 63 61 6e 41 72 63 68 69 76  ::ws::ScanArchiv
11f0: 65 73 20 7b 66 69 6c 65 73 7d 20 7b 0a 20 20 20  es {files} {.   
1200: 20 77 72 69 74 65 20 30 20 63 76 73 20 22 53 63   write 0 cvs "Sc
1210: 61 6e 6e 69 6e 67 20 61 72 63 68 69 76 65 73 20  anning archives 
1220: 2e 2e 2e 22 0a 0a 20 20 20 20 73 65 74 20 64 20  ..."..    set d 
1230: 5b 52 6f 6f 74 50 61 74 68 5d 0a 20 20 20 20 73  [RootPath].    s
1240: 65 74 20 72 20 7b 7d 0a 20 20 20 20 73 65 74 20  et r {}.    set 
1250: 6e 20 30 0a 0a 20 20 20 20 3a 3a 66 6f 72 65 61  n 0..    ::forea
1260: 63 68 20 7b 72 63 73 20 66 7d 20 24 66 69 6c 65  ch {rcs f} $file
1270: 73 20 7b 0a 09 77 72 69 74 65 20 31 20 63 76 73  s {..write 1 cvs
1280: 20 22 41 72 63 68 69 76 65 20 24 72 63 73 22 0a   "Archive $rcs".
1290: 09 23 20 47 65 74 20 74 68 65 20 6d 65 74 61 20  .# Get the meta 
12a0: 64 61 74 61 20 77 65 20 6e 65 65 64 20 28 72 65  data we need (re
12b0: 76 69 73 69 6f 6e 73 2c 20 74 69 6d 65 6c 69 6e  visions, timelin
12c0: 65 2c 20 6d 65 73 73 61 67 65 73 29 2e 0a 09 6c  e, messages)...l
12d0: 61 70 70 65 6e 64 20 72 20 24 66 20 5b 70 72 6f  append r $f [pro
12e0: 63 65 73 73 20 24 64 2f 24 72 63 73 5d 0a 09 69  cess $d/$rcs]..i
12f0: 6e 63 72 20 20 20 20 6e 0a 20 20 20 20 7d 0a 0a  ncr    n.    }..
1300: 20 20 20 20 77 72 69 74 65 20 30 20 63 76 73 20      write 0 cvs 
1310: 22 50 72 6f 63 65 73 73 65 64 20 5b 4e 53 49 50  "Processed [NSIP
1320: 4c 20 24 6e 20 66 69 6c 65 5d 22 0a 20 20 20 20  L $n file]".    
1330: 72 65 74 75 72 6e 20 24 72 0a 7d 0a 0a 70 72 6f  return $r.}..pro
1340: 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a  c ::vc::cvs::ws:
1350: 3a 4d 61 6b 65 54 69 6d 65 6c 69 6e 65 20 7b 6d  :MakeTimeline {m
1360: 65 74 61 7d 20 7b 0a 20 20 20 20 77 72 69 74 65  eta} {.    write
1370: 20 30 20 63 76 73 20 22 47 65 6e 65 72 61 74 69   0 cvs "Generati
1380: 6e 67 20 63 6f 61 6c 65 73 63 65 64 20 74 69 6d  ng coalesced tim
1390: 65 6c 69 6e 65 20 2e 2e 2e 22 0a 0a 20 20 20 20  eline ..."..    
13a0: 73 65 74 20 6e 20 30 0a 20 20 20 20 3a 3a 66 6f  set n 0.    ::fo
13b0: 72 65 61 63 68 20 7b 66 20 6d 65 74 61 7d 20 24  reach {f meta} $
13c0: 6d 65 74 61 20 7b 0a 09 61 72 72 61 79 20 73 65  meta {..array se
13d0: 74 20 6d 64 20 20 20 24 6d 65 74 61 0a 09 61 72  t md   $meta..ar
13e0: 72 61 79 20 73 65 74 20 64 61 74 65 20 24 6d 64  ray set date $md
13f0: 28 64 61 74 65 29 0a 09 61 72 72 61 79 20 73 65  (date)..array se
1400: 74 20 61 75 74 68 20 24 6d 64 28 61 75 74 68 6f  t auth $md(autho
1410: 72 29 0a 09 61 72 72 61 79 20 73 65 74 20 63 6d  r)..array set cm
1420: 73 67 20 24 6d 64 28 63 6f 6d 6d 69 74 29 0a 09  sg $md(commit)..
1430: 61 72 72 61 79 20 73 65 74 20 73 74 61 74 20 24  array set stat $
1440: 6d 64 28 73 74 61 74 65 29 0a 0a 09 3a 3a 66 6f  md(state)...::fo
1450: 72 65 61 63 68 20 72 65 76 20 5b 6c 73 6f 72 74  reach rev [lsort
1460: 20 2d 64 69 63 74 20 5b 61 72 72 61 79 20 6e 61   -dict [array na
1470: 6d 65 73 20 64 61 74 65 5d 5d 20 7b 0a 09 20 20  mes date]] {..  
1480: 20 20 73 65 74 20 6f 70 65 72 61 74 69 6f 6e 20    set operation 
1490: 5b 4f 70 65 72 61 74 69 6f 6e 20 24 72 65 76 20  [Operation $rev 
14a0: 24 73 74 61 74 28 24 72 65 76 29 5d 0a 09 20 20  $stat($rev)]..  
14b0: 20 20 4e 6f 74 65 44 65 61 64 52 6f 6f 74 73 20    NoteDeadRoots 
14c0: 24 66 20 24 72 65 76 20 24 6f 70 65 72 61 74 69  $f $rev $operati
14d0: 6f 6e 0a 09 20 20 20 20 74 69 6d 65 6c 69 6e 65  on..    timeline
14e0: 3a 3a 61 64 64 20 24 64 61 74 65 28 24 72 65 76  ::add $date($rev
14f0: 29 20 24 66 20 24 72 65 76 20 24 6f 70 65 72 61  ) $f $rev $opera
1500: 74 69 6f 6e 20 24 61 75 74 68 28 24 72 65 76 29  tion $auth($rev)
1510: 20 24 63 6d 73 67 28 24 72 65 76 29 0a 09 20 20   $cmsg($rev)..  
1520: 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 09 23 42 20    incr n..}..#B 
1530: 45 78 74 65 6e 64 20 62 72 61 6e 63 68 20 6d 61  Extend branch ma
1540: 6e 61 67 65 6d 65 6e 74 0a 0a 09 75 6e 73 65 74  nagement...unset
1550: 20 6d 64 0a 09 75 6e 73 65 74 20 64 61 74 65 0a   md..unset date.
1560: 09 75 6e 73 65 74 20 61 75 74 68 0a 09 75 6e 73  .unset auth..uns
1570: 65 74 20 63 6d 73 67 0a 09 75 6e 73 65 74 20 73  et cmsg..unset s
1580: 74 61 74 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77  tat.    }..    w
1590: 72 69 74 65 20 30 20 63 76 73 20 22 47 65 6e 65  rite 0 cvs "Gene
15a0: 72 61 74 65 64 20 5b 4e 53 49 50 4c 20 24 6e 20  rated [NSIPL $n 
15b0: 65 6e 74 72 79 20 65 6e 74 72 69 65 73 5d 22 0a  entry entries]".
15c0: 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72      return.}..pr
15d0: 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73  oc ::vc::cvs::ws
15e0: 3a 3a 4e 6f 74 65 44 65 61 64 52 6f 6f 74 73 20  ::NoteDeadRoots 
15f0: 7b 66 20 72 65 76 20 6f 70 65 72 61 74 69 6f 6e  {f rev operation
1600: 7d 20 7b 0a 20 20 20 20 23 20 41 20 64 65 61 64  } {.    # A dead
1610: 2d 66 69 72 73 74 20 72 65 76 69 73 69 6f 6e 20  -first revision 
1620: 69 73 20 72 65 76 20 31 2e 31 20 77 69 74 68 20  is rev 1.1 with 
1630: 6f 70 20 52 2e 20 46 6f 72 20 61 6e 20 65 78 61  op R. For an exa
1640: 6d 70 6c 65 20 73 65 65 0a 20 20 20 20 23 20 74  mple see.    # t
1650: 68 65 20 66 69 6c 65 20 6d 65 6d 63 68 61 6e 2f  he file memchan/
1660: 44 45 50 45 4e 44 45 4e 43 49 45 53 2e 20 53 75  DEPENDENCIES. Su
1670: 63 68 20 61 20 66 69 6c 65 20 73 65 65 6d 73 20  ch a file seems 
1680: 74 6f 20 65 78 69 73 74 20 6f 6e 6c 79 21 0a 20  to exist only!. 
1690: 20 20 20 23 20 6f 6e 20 69 74 73 20 62 72 61 6e     # on its bran
16a0: 63 68 2e 20 54 68 65 20 62 72 61 6e 63 68 65 73  ch. The branches
16b0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20   information is 
16c0: 73 65 74 20 6f 6e 20 74 68 65 20 72 65 76 69 73  set on the revis
16d0: 69 6f 6e 0a 20 20 20 20 23 20 28 65 78 74 65 6e  ion.    # (exten
16e0: 64 20 72 63 73 70 61 72 73 65 72 21 29 2c 20 73  d rcsparser!), s
16f0: 79 6d 62 6f 6c 73 20 68 61 73 20 61 20 74 61 67  ymbols has a tag
1700: 2c 20 72 65 66 65 72 69 6e 67 20 74 6f 20 61 20  , refering to a 
1710: 62 72 61 6e 63 68 2c 0a 20 20 20 20 23 20 70 6f  branch,.    # po
1720: 73 73 69 62 6c 79 20 6d 61 67 69 63 2e 0a 0a 20  ssibly magic... 
1730: 20 20 20 69 66 20 7b 28 24 72 65 76 20 65 71 20     if {($rev eq 
1740: 22 31 2e 31 22 29 20 26 26 20 28 24 6f 70 65 72  "1.1") && ($oper
1750: 61 74 69 6f 6e 20 65 71 20 22 52 22 29 7d 20 7b  ation eq "R")} {
1760: 0a 09 77 72 69 74 65 20 32 20 63 76 73 20 22 44  ..write 2 cvs "D
1770: 65 61 64 20 72 6f 6f 74 20 72 65 76 69 73 69 6f  ead root revisio
1780: 6e 3a 20 24 66 22 0a 20 20 20 20 7d 0a 20 20 20  n: $f".    }.   
1790: 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20   return.}..proc 
17a0: 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 4f  ::vc::cvs::ws::O
17b0: 70 65 72 61 74 69 6f 6e 20 7b 72 65 76 20 73 74  peration {rev st
17c0: 61 74 65 7d 20 7b 0a 20 20 20 20 69 66 20 7b 24  ate} {.    if {$
17d0: 73 74 61 74 65 20 65 71 20 22 64 65 61 64 22 7d  state eq "dead"}
17e0: 20 7b 72 65 74 75 72 6e 20 22 52 22 7d 20 3b 20   {return "R"} ; 
17f0: 23 20 52 65 6d 6f 76 65 64 0a 20 20 20 20 69 66  # Removed.    if
1800: 20 7b 24 72 65 76 20 20 20 65 71 20 22 31 2e 31   {$rev   eq "1.1
1810: 22 7d 20 20 7b 72 65 74 75 72 6e 20 22 41 22 7d  "}  {return "A"}
1820: 20 3b 20 23 20 41 64 64 65 64 0a 20 20 20 20 72   ; # Added.    r
1830: 65 74 75 72 6e 20 22 4d 22 20 20 20 20 20 20 20  eturn "M"       
1840: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1850: 20 20 3b 20 23 20 4d 6f 64 69 66 69 65 64 0a 7d    ; # Modified.}
1860: 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73  ..proc ::vc::cvs
1870: 3a 3a 77 73 3a 3a 4d 61 6b 65 57 6f 72 6b 73 70  ::ws::MakeWorksp
1880: 61 63 65 20 7b 7d 20 7b 0a 20 20 20 20 76 61 72  ace {} {.    var
1890: 69 61 62 6c 65 20 70 72 6f 6a 65 63 74 0a 20 20  iable project.  
18a0: 20 20 76 61 72 69 61 62 6c 65 20 77 6f 72 6b 73    variable works
18b0: 70 61 63 65 20 5b 66 69 6c 65 75 74 69 6c 3a 3a  pace [fileutil::
18c0: 74 65 6d 70 66 69 6c 65 20 69 6d 70 6f 72 74 46  tempfile importF
18d0: 5f 63 76 73 5f 77 73 5f 5d 0a 0a 20 20 20 20 73  _cvs_ws_]..    s
18e0: 65 74 20 77 20 24 77 6f 72 6b 73 70 61 63 65 0a  et w $workspace.
18f0: 20 20 20 20 69 66 20 7b 24 70 72 6f 6a 65 63 74      if {$project
1900: 20 6e 65 20 22 22 7d 20 7b 20 61 70 70 65 6e 64   ne ""} { append
1910: 20 77 20 2f 24 70 72 6f 6a 65 63 74 20 7d 0a 0a   w /$project }..
1920: 20 20 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20      file delete 
1930: 24 77 6f 72 6b 73 70 61 63 65 0a 20 20 20 20 66  $workspace.    f
1940: 69 6c 65 20 6d 6b 64 69 72 20 20 24 77 0a 0a 20  ile mkdir  $w.. 
1950: 20 20 20 77 72 69 74 65 20 30 20 63 76 73 20 22     write 0 cvs "
1960: 57 6f 72 6b 73 70 61 63 65 3a 20 20 24 77 6f 72  Workspace:  $wor
1970: 6b 73 70 61 63 65 22 0a 20 20 20 20 72 65 74 75  kspace".    retu
1980: 72 6e 20 24 77 0a 7d 0a 0a 0a 23 20 47 72 6f 75  rn $w.}...# Grou
1990: 70 20 73 69 6e 67 6c 65 20 63 68 61 6e 67 65 73  p single changes
19a0: 20 69 6e 74 6f 20 63 68 61 6e 67 65 73 65 74 73   into changesets
19b0: 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73  ..proc ::vc::cvs
19c0: 3a 3a 77 73 3a 3a 63 73 65 74 73 20 7b 7d 20 7b  ::ws::csets {} {
19d0: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 74 69  .    variable ti
19e0: 6d 65 6c 69 6e 65 0a 20 20 20 20 76 61 72 69 61  meline.    varia
19f0: 62 6c 65 20 63 73 65 74 73 0a 20 20 20 20 76 61  ble csets.    va
1a00: 72 69 61 62 6c 65 20 6e 63 73 0a 20 20 20 20 76  riable ncs.    v
1a10: 61 72 69 61 62 6c 65 20 63 6d 61 70 0a 0a 20 20  ariable cmap..  
1a20: 20 20 61 72 72 61 79 20 75 6e 73 65 74 20 63 73    array unset cs
1a30: 65 74 73 20 2a 20 3b 20 61 72 72 61 79 20 73 65  ets * ; array se
1a40: 74 20 63 73 65 74 73 20 7b 7d 0a 20 20 20 20 61  t csets {}.    a
1a50: 72 72 61 79 20 75 6e 73 65 74 20 63 6d 61 70 20  rray unset cmap 
1a60: 20 2a 20 3b 20 61 72 72 61 79 20 73 65 74 20 63   * ; array set c
1a70: 6d 61 70 20 20 7b 7d 0a 20 20 20 20 73 65 74 20  map  {}.    set 
1a80: 6e 63 73 20 30 0a 0a 20 20 20 20 77 72 69 74 65  ncs 0..    write
1a90: 20 30 20 63 76 73 20 22 47 65 6e 65 72 61 74 69   0 cvs "Generati
1aa0: 6e 67 20 63 68 61 6e 67 65 73 65 74 73 20 66 72  ng changesets fr
1ab0: 6f 6d 20 74 69 6d 65 6c 69 6e 65 22 0a 0a 20 20  om timeline"..  
1ac0: 20 20 43 53 43 6c 65 61 72 0a 20 20 20 20 74 69    CSClear.    ti
1ad0: 6d 65 6c 69 6e 65 3a 3a 66 6f 72 65 61 63 68 20  meline::foreach 
1ae0: 64 61 74 65 20 66 69 6c 65 20 72 65 76 69 73 69  date file revisi
1af0: 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 61 75 74  on operation aut
1b00: 68 6f 72 20 63 6d 73 67 20 7b 0a 09 23 20 41 50  hor cmsg {..# AP
1b10: 49 20 61 64 61 70 74 69 6f 6e 0a 09 73 65 74 20  I adaption..set 
1b20: 65 6e 74 72 79 20 5b 6c 69 73 74 20 24 6f 70 65  entry [list $ope
1b30: 72 61 74 69 6f 6e 20 24 64 61 74 65 20 24 61 75  ration $date $au
1b40: 74 68 6f 72 20 24 72 65 76 69 73 69 6f 6e 20 24  thor $revision $
1b50: 66 69 6c 65 20 24 63 6d 73 67 5d 0a 0a 09 69 66  file $cmsg]...if
1b60: 20 7b 21 5b 43 53 4e 6f 6e 65 5d 20 26 26 20 5b   {![CSNone] && [
1b70: 43 53 4e 65 77 20 24 65 6e 74 72 79 5d 7d 20 7b  CSNew $entry]} {
1b80: 0a 09 20 20 20 20 43 53 53 61 76 65 0a 09 20 20  ..    CSSave..  
1b90: 20 20 43 53 43 6c 65 61 72 0a 09 7d 0a 09 43 53    CSClear..}..CS
1ba0: 41 64 64 20 24 65 6e 74 72 79 0a 20 20 20 20 7d  Add $entry.    }
1bb0: 0a 0a 20 20 20 20 77 72 69 74 65 20 30 20 63 76  ..    write 0 cv
1bc0: 73 20 22 46 6f 75 6e 64 20 5b 4e 53 49 50 4c 20  s "Found [NSIPL 
1bd0: 5b 61 72 72 61 79 20 73 69 7a 65 20 63 73 65 74  [array size cset
1be0: 73 5d 20 63 68 61 6e 67 65 73 65 74 5d 22 0a 20  s] changeset]". 
1bf0: 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 0a 6e 61     return.}...na
1c00: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 76  mespace eval ::v
1c10: 63 3a 3a 63 76 73 3a 3a 77 73 20 7b 0a 20 20 20  c::cvs::ws {.   
1c20: 20 23 20 43 68 61 6e 67 65 73 65 74 20 64 61 74   # Changeset dat
1c30: 61 3a 0a 20 20 20 20 23 20 6e 63 73 3a 20 20 20  a:.    # ncs:   
1c40: 43 6f 75 6e 74 65 72 2d 62 61 73 65 64 20 69 64  Counter-based id
1c50: 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 20 20   generation.    
1c60: 23 20 63 73 65 74 73 3a 20 69 64 20 2d 3e 20 28  # csets: id -> (
1c70: 75 73 65 72 20 63 6f 6d 6d 69 74 20 73 74 61 72  user commit star
1c80: 74 20 65 6e 64 20 64 65 70 74 68 20 28 66 69 6c  t end depth (fil
1c90: 65 20 2d 3e 20 28 6f 70 20 72 65 76 29 29 29 0a  e -> (op rev))).
1ca0: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 63  .    variable nc
1cb0: 73 20 20 20 20 20 20 3b 20 73 65 74 20 20 20 20  s      ; set    
1cc0: 20 20 20 6e 63 73 20 20 20 30 20 20 3b 20 23 20     ncs   0  ; # 
1cd0: 43 6f 75 6e 74 65 72 20 66 6f 72 20 63 68 61 6e  Counter for chan
1ce0: 67 65 73 65 74 73 0a 20 20 20 20 76 61 72 69 61  gesets.    varia
1cf0: 62 6c 65 20 63 73 65 74 73 20 20 20 20 3b 20 61  ble csets    ; a
1d00: 72 72 61 79 20 73 65 74 20 63 73 65 74 73 20 7b  rray set csets {
1d10: 7d 20 3b 20 23 20 43 68 61 6e 67 65 73 65 74 20  } ; # Changeset 
1d20: 64 61 74 61 0a 7d 0a 0a 23 20 42 75 69 6c 64 69  data.}..# Buildi
1d30: 6e 67 20 74 68 65 20 72 65 76 69 73 69 6f 6e 20  ng the revision 
1d40: 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20 63 68  tree from the ch
1d50: 61 6e 67 65 73 65 74 73 2e 0a 23 20 4c 69 6d 69  angesets..# Limi
1d60: 74 61 74 69 6f 6e 3a 20 43 75 72 72 65 6e 74 6c  tation: Currentl
1d70: 79 20 6f 6e 6c 79 20 74 72 75 6e 6b 20 63 73 65  y only trunk cse
1d80: 74 73 20 69 73 20 68 61 6e 64 6c 65 64 2e 0a 23  ts is handled..#
1d90: 20 4c 69 6d 69 74 61 74 69 6f 6e 3a 20 44 65 61   Limitation: Dea
1da0: 64 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 20  d files are not 
1db0: 72 65 6d 6f 76 65 64 2c 20 69 2e 65 2e 20 6e 6f  removed, i.e. no
1dc0: 20 27 52 27 20 61 63 74 69 6f 6e 73 20 72 69 67   'R' actions rig
1dd0: 68 74 20 6e 6f 77 2e 0a 0a 70 72 6f 63 20 3a 3a  ht now...proc ::
1de0: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 72 74 72  vc::cvs::ws::rtr
1df0: 65 65 20 7b 7d 20 7b 0a 20 20 20 20 76 61 72 69  ee {} {.    vari
1e00: 61 62 6c 65 20 63 73 65 74 73 0a 20 20 20 20 76  able csets.    v
1e10: 61 72 69 61 62 6c 65 20 72 74 72 65 65 20 7b 7d  ariable rtree {}
1e20: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 74  .    variable nt
1e30: 72 75 6e 6b 20 30 0a 0a 20 20 20 20 77 72 69 74  runk 0..    writ
1e40: 65 20 30 20 63 76 73 20 22 45 78 74 72 61 63 74  e 0 cvs "Extract
1e50: 69 6e 67 20 74 68 65 20 74 72 75 6e 6b 22 0a 0a  ing the trunk"..
1e60: 20 20 20 20 73 65 74 20 72 74 72 65 65 20 5b 73      set rtree [s
1e70: 74 72 75 63 74 3a 3a 74 72 65 65 20 3a 3a 76 63  truct::tree ::vc
1e80: 3a 3a 63 76 73 3a 3a 77 73 3a 3a 52 54 5d 0a 20  ::cvs::ws::RT]. 
1e90: 20 20 20 24 72 74 72 65 65 20 72 65 6e 61 6d 65     $rtree rename
1ea0: 20 72 6f 6f 74 20 30 20 3b 20 23 20 52 6f 6f 74   root 0 ; # Root
1eb0: 20 69 73 20 66 69 72 73 74 20 63 68 61 6e 67 65   is first change
1ec0: 73 65 74 2c 20 61 6c 77 61 79 73 2e 0a 20 20 20  set, always..   
1ed0: 20 73 65 74 20 74 72 75 6e 6b 20 30 0a 20 20 20   set trunk 0.   
1ee0: 20 73 65 74 20 6e 74 72 75 6e 6b 20 31 20 3b 20   set ntrunk 1 ; 
1ef0: 23 20 52 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65  # Root is on the
1f00: 20 74 72 75 6e 6b 2e 0a 20 20 20 20 73 65 74 20   trunk..    set 
1f10: 62 20 20 20 20 20 20 30 20 3b 20 23 20 4e 6f 20  b      0 ; # No 
1f20: 62 72 61 6e 63 68 20 63 73 65 74 73 20 66 6f 75  branch csets fou
1f30: 6e 64 20 79 65 74 2e 0a 0a 20 20 20 20 23 20 45  nd yet...    # E
1f40: 78 74 72 61 63 74 69 6e 67 20 74 68 65 20 74 72  xtracting the tr
1f50: 75 6e 6b 20 69 73 20 65 61 73 79 2c 20 73 69 6d  unk is easy, sim
1f60: 70 6c 79 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61  ply by looking a
1f70: 74 20 74 68 65 20 69 6e 76 6f 6c 76 65 64 0a 20  t the involved. 
1f80: 20 20 20 23 20 76 65 72 73 69 6f 6e 20 6e 75 6d     # version num
1f90: 62 65 72 73 2e 20 0a 0a 20 20 20 20 3a 3a 66 6f  bers. ..    ::fo
1fa0: 72 65 61 63 68 20 63 20 5b 6c 72 61 6e 67 65 20  reach c [lrange 
1fb0: 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65 72 20  [lsort -integer 
1fc0: 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 63 73 65  [array names cse
1fd0: 74 73 5d 5d 20 31 20 65 6e 64 5d 20 7b 0a 09 3a  ts]] 1 end] {..:
1fe0: 3a 66 6f 72 65 61 63 68 20 7b 75 20 63 6d 20 73  :foreach {u cm s
1ff0: 20 65 20 72 64 20 66 7d 20 24 63 73 65 74 73 28   e rd f} $csets(
2000: 24 63 29 20 62 72 65 61 6b 0a 0a 09 23 20 49 67  $c) break...# Ig
2010: 6e 6f 72 65 20 62 72 61 6e 63 68 20 63 68 61 6e  nore branch chan
2020: 67 65 73 2c 20 6a 75 73 74 20 63 6f 75 6e 74 20  ges, just count 
2030: 74 68 65 6d 20 66 6f 72 20 74 68 65 20 73 74 61  them for the sta
2040: 74 69 73 74 69 63 73 2e 0a 09 69 66 20 7b 24 72  tistics...if {$r
2050: 64 20 21 3d 20 32 7d 20 7b 0a 09 20 20 20 20 69  d != 2} {..    i
2060: 6e 63 72 20 62 0a 09 20 20 20 20 63 6f 6e 74 69  ncr b..    conti
2070: 6e 75 65 0a 09 7d 0a 0a 09 23 20 54 72 75 6e 6b  nue..}...# Trunk
2080: 20 72 65 76 69 73 69 6f 6e 2c 20 63 6f 6e 6e 65   revision, conne
2090: 63 74 20 74 6f 2c 20 61 6e 64 20 75 70 64 61 74  ct to, and updat
20a0: 65 20 74 68 65 20 68 65 61 64 2e 0a 09 24 72 74  e the head...$rt
20b0: 72 65 65 20 69 6e 73 65 72 74 20 24 74 72 75 6e  ree insert $trun
20c0: 6b 20 65 6e 64 20 24 63 0a 09 73 65 74 20 74 72  k end $c..set tr
20d0: 75 6e 6b 20 24 63 0a 09 69 6e 63 72 20 6e 74 72  unk $c..incr ntr
20e0: 75 6e 6b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77  unk.    }..    w
20f0: 72 69 74 65 20 30 20 63 76 73 20 22 50 72 6f 63  rite 0 cvs "Proc
2100: 65 73 73 65 64 20 24 6e 74 72 75 6e 6b 20 74 72  essed $ntrunk tr
2110: 75 6e 6b 20 20 5b 65 78 70 72 20 7b 28 24 6e 74  unk  [expr {($nt
2120: 72 75 6e 6b 20 3d 3d 20 31 29 20 3f 20 22 63 68  runk == 1) ? "ch
2130: 61 6e 67 65 73 65 74 22 20 3a 20 22 63 68 61 6e  angeset" : "chan
2140: 67 65 73 65 74 73 22 7d 5d 22 0a 20 20 20 20 77  gesets"}]".    w
2150: 72 69 74 65 20 30 20 63 76 73 20 22 49 67 6e 6f  rite 0 cvs "Igno
2160: 72 65 64 20 20 20 24 62 20 62 72 61 6e 63 68 20  red   $b branch 
2170: 5b 65 78 70 72 20 7b 28 24 62 20 3d 3d 20 31 29  [expr {($b == 1)
2180: 20 3f 20 22 63 68 61 6e 67 65 73 65 74 22 20 3a   ? "changeset" :
2190: 20 22 63 68 61 6e 67 65 73 65 74 73 22 7d 5d 22   "changesets"}]"
21a0: 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 6e  .    return.}..n
21b0: 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a  amespace eval ::
21c0: 76 63 3a 3a 63 76 73 3a 3a 77 73 20 7b 0a 20 20  vc::cvs::ws {.  
21d0: 20 20 23 20 54 72 65 65 20 68 6f 6c 64 69 6e 67    # Tree holding
21e0: 20 74 72 75 6e 6b 20 61 6e 64 20 62 72 61 6e 63   trunk and branc
21f0: 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 28 73  h information (s
2200: 74 72 75 63 74 3a 3a 74 72 65 65 29 2e 0a 20 20  truct::tree)..  
2210: 20 20 23 20 4e 6f 64 65 20 6e 61 6d 65 73 20 61    # Node names a
2220: 72 65 20 63 73 65 74 20 69 64 27 73 2e 0a 0a 20  re cset id's... 
2230: 20 20 20 76 61 72 69 61 62 6c 65 20 72 74 72 65     variable rtre
2240: 65 20 7b 7d 0a 20 20 20 20 76 61 72 69 61 62 6c  e {}.    variabl
2250: 65 20 6e 74 72 75 6e 6b 20 30 0a 7d 0a 0a 70 72  e ntrunk 0.}..pr
2260: 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73  oc ::vc::cvs::ws
2270: 3a 3a 77 73 73 65 74 75 70 20 7b 63 7d 20 7b 0a  ::wssetup {c} {.
2280: 20 20 20 20 76 61 72 69 61 62 6c 65 20 63 73 65      variable cse
2290: 74 73 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20  ts.    variable 
22a0: 62 61 73 65 0a 20 20 20 20 76 61 72 69 61 62 6c  base.    variabl
22b0: 65 20 70 72 6f 6a 65 63 74 0a 0a 20 20 20 20 23  e project..    #
22c0: 20 70 77 64 20 3d 20 77 6f 72 6b 73 70 61 63 65   pwd = workspace
22d0: 0a 0a 20 20 20 20 3a 3a 66 6f 72 65 61 63 68 20  ..    ::foreach 
22e0: 7b 75 20 63 6d 20 73 20 65 20 72 64 20 66 73 7d  {u cm s e rd fs}
22f0: 20 24 63 73 65 74 73 28 24 63 29 20 62 72 65 61   $csets($c) brea
2300: 6b 0a 0a 20 20 20 20 77 72 69 74 65 20 31 20 63  k..    write 1 c
2310: 76 73 20 22 40 20 20 24 73 22 0a 0a 20 20 20 20  vs "@  $s"..    
2320: 3a 3a 66 6f 72 65 61 63 68 20 6c 20 5b 73 70 6c  ::foreach l [spl
2330: 69 74 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20  it [string trim 
2340: 24 63 6d 5d 20 5c 6e 5d 20 7b 0a 09 77 72 69 74  $cm] \n] {..writ
2350: 65 20 31 20 63 76 73 20 22 7c 20 20 24 6c 22 0a  e 1 cvs "|  $l".
2360: 20 20 20 20 7d 0a 0a 20 20 20 20 3a 3a 66 6f 72      }..    ::for
2370: 65 61 63 68 20 7b 66 20 6f 72 7d 20 24 66 73 20  each {f or} $fs 
2380: 7b 0a 09 3a 3a 66 6f 72 65 61 63 68 20 7b 6f 70  {..::foreach {op
2390: 20 72 7d 20 24 6f 72 20 62 72 65 61 6b 0a 09 77   r} $or break..w
23a0: 72 69 74 65 20 32 20 63 76 73 20 22 24 6f 70 20  rite 2 cvs "$op 
23b0: 20 24 66 20 24 72 22 0a 0a 09 69 66 20 7b 24 6f   $f $r"...if {$o
23c0: 70 20 65 71 20 22 52 22 7d 20 7b 0a 09 20 20 20  p eq "R"} {..   
23d0: 20 23 20 52 65 6d 6f 76 65 20 66 69 6c 65 20 66   # Remove file f
23e0: 72 6f 6d 20 77 6f 72 6b 73 70 61 63 65 2e 20 50  rom workspace. P
23f0: 72 75 6e 65 20 65 6d 70 74 79 20 64 69 72 65 63  rune empty direc
2400: 74 6f 72 69 65 73 2e 0a 09 20 20 20 20 23 0a 09  tories...    #..
2410: 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 20 64 65      # NOTE: A de
2420: 61 64 2d 66 69 72 73 74 20 66 69 6c 65 20 28 72  ad-first file (r
2430: 65 76 20 31 2e 31 20 64 65 61 64 29 20 77 69 6c  ev 1.1 dead) wil
2440: 6c 20 6e 65 76 65 72 20 68 61 76 65 0a 09 20 20  l never have..  
2450: 20 20 23 20 65 78 69 73 74 65 64 2e 0a 09 20 20    # existed...  
2460: 20 20 23 0a 09 20 20 20 20 23 20 4e 4f 54 45 3a    #..    # NOTE:
2470: 20 4c 6f 67 69 63 61 6c 6c 79 20 65 6d 70 74 79   Logically empty
2480: 20 64 69 72 65 63 74 6f 72 69 65 73 20 73 74 69   directories sti
2490: 6c 6c 20 70 68 79 73 69 63 61 6c 6c 79 0a 09 20  ll physically.. 
24a0: 20 20 20 23 20 63 6f 6e 74 61 69 6e 20 74 68 65     # contain the
24b0: 20 43 56 53 20 61 64 6d 69 6e 20 64 69 72 65 63   CVS admin direc
24c0: 74 6f 72 79 2c 20 68 65 6e 63 65 20 74 68 65 20  tory, hence the 
24d0: 63 68 65 63 6b 20 66 6f 72 20 3d 3d 0a 09 20 20  check for ==..  
24e0: 20 20 23 20 31 2c 20 6e 6f 74 20 3d 3d 20 30 2e    # 1, not == 0.
24f0: 20 54 68 65 72 65 20 6d 69 67 68 74 20 61 6c 73   There might als
2500: 6f 20 62 65 20 68 69 64 64 65 6e 20 66 69 6c 65  o be hidden file
2510: 73 2c 20 77 65 20 63 6f 75 6e 74 0a 09 20 20 20  s, we count..   
2520: 20 23 20 74 68 65 6d 20 61 73 20 77 65 6c 6c 2e   # them as well.
2530: 20 41 6c 77 61 79 73 20 68 69 64 64 65 6e 20 61   Always hidden a
2540: 72 65 20 2e 20 61 6e 64 20 2e 2e 20 61 6e 64 20  re . and .. and 
2550: 74 68 65 79 20 64 6f 20 6e 6f 74 0a 09 20 20 20  they do not..   
2560: 20 23 20 63 6f 75 6e 74 20 61 73 20 75 73 65 72   # count as user
2570: 20 66 69 6c 65 2e 0a 0a 09 20 20 20 20 66 69 6c   file....    fil
2580: 65 20 64 65 6c 65 74 65 20 24 66 0a 09 20 20 20  e delete $f..   
2590: 20 73 65 74 20 66 64 20 5b 66 69 6c 65 20 64 69   set fd [file di
25a0: 72 6e 61 6d 65 20 24 66 5d 0a 09 20 20 20 20 69  rname $f]..    i
25b0: 66 20 7b 0a 09 09 28 5b 6c 6c 65 6e 67 74 68 20  f {...([llength 
25c0: 5b 67 6c 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61 69  [glob -nocomplai
25d0: 6e 20 2d 64 69 72 65 63 74 6f 72 79 20 20 20 20  n -directory    
25e0: 20 20 20 20 20 20 20 20 20 20 24 66 64 20 2a 5d            $fd *]
25f0: 5d 20 3d 3d 20 31 29 20 26 26 0a 09 09 28 5b 6c  ] == 1) &&...([l
2600: 6c 65 6e 67 74 68 20 5b 67 6c 6f 62 20 2d 6e 6f  length [glob -no
2610: 63 6f 6d 70 6c 61 69 6e 20 2d 64 69 72 65 63 74  complain -direct
2620: 6f 72 79 20 2d 74 79 70 65 20 68 69 64 64 65 6e  ory -type hidden
2630: 20 24 66 64 20 2a 5d 5d 20 3d 3d 20 32 29 0a 09   $fd *]] == 2)..
2640: 20 20 20 20 7d 20 7b 0a 09 09 66 69 6c 65 20 64      } {...file d
2650: 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 66 64  elete -force $fd
2660: 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20  ..    }..} else 
2670: 7b 0a 09 20 20 20 20 23 20 41 64 64 65 64 20 6f  {..    # Added o
2680: 72 20 6d 6f 64 69 66 69 65 64 2c 20 70 75 74 20  r modified, put 
2690: 74 68 65 20 72 65 71 75 65 73 74 65 64 20 76 65  the requested ve
26a0: 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c  rsion of the fil
26b0: 65 0a 09 20 20 20 20 23 20 69 6e 74 6f 20 74 68  e..    # into th
26c0: 65 20 77 6f 72 6b 73 70 61 63 65 2e 0a 0a 09 20  e workspace.... 
26d0: 20 20 20 69 66 20 7b 24 70 72 6f 6a 65 63 74 20     if {$project 
26e0: 6e 65 20 22 22 7d 20 7b 73 65 74 20 66 20 24 70  ne ""} {set f $p
26f0: 72 6f 6a 65 63 74 2f 24 66 7d 0a 09 20 20 20 20  roject/$f}..    
2700: 69 66 20 7b 5b 63 61 74 63 68 20 7b 0a 09 09 64  if {[catch {...d
2710: 6f 76 61 20 2d 64 20 24 62 61 73 65 20 63 6f 20  ova -d $base co 
2720: 2d 72 20 24 72 20 24 66 0a 09 20 20 20 20 7d 20  -r $r $f..    } 
2730: 6d 73 67 5d 7d 20 7b 0a 09 09 69 66 20 7b 5b 73  msg]} {...if {[s
2740: 74 72 69 6e 67 20 6d 61 74 63 68 20 7b 2a 69 6e  tring match {*in
2750: 76 61 6c 69 64 20 63 68 61 6e 67 65 20 74 65 78  valid change tex
2760: 74 2a 7d 20 24 6d 73 67 5d 7d 20 7b 0a 09 09 20  t*} $msg]} {... 
2770: 20 20 20 23 20 54 68 65 20 61 72 63 68 69 76 65     # The archive
2780: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20   of the file is 
2790: 63 6f 72 72 75 70 74 65 64 20 61 6e 64 20 74 68  corrupted and th
27a0: 65 0a 09 09 20 20 20 20 23 20 63 68 6f 73 65 6e  e...    # chosen
27b0: 20 76 65 72 73 69 6f 6e 20 6e 6f 74 20 61 63 63   version not acc
27c0: 65 73 73 69 62 6c 65 20 64 75 65 20 74 6f 20 74  essible due to t
27d0: 68 61 74 2e 20 57 65 0a 09 09 20 20 20 20 23 20  hat. We...    # 
27e0: 72 65 70 6f 72 74 20 74 68 65 20 70 72 6f 62 6c  report the probl
27f0: 65 6d 2c 20 62 75 74 20 6f 74 68 65 72 77 69 73  em, but otherwis
2800: 65 20 69 67 6e 6f 72 65 20 69 74 2e 20 41 73 0a  e ignore it. As.
2810: 09 09 20 20 20 20 23 20 61 20 63 6f 6e 73 65 71  ..    # a conseq
2820: 75 65 6e 63 65 20 74 68 65 20 64 65 73 74 69 6e  uence the destin
2830: 61 74 69 6f 6e 20 72 65 70 6f 73 69 74 6f 72 79  ation repository
2840: 20 77 69 6c 6c 20 6e 6f 74 0a 09 09 20 20 20 20   will not...    
2850: 23 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 66 75  # contain the fu
2860: 6c 6c 20 68 69 73 74 6f 72 79 20 6f 66 20 74 68  ll history of th
2870: 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e 20 42 79  e named file. By
2880: 0a 09 09 20 20 20 20 23 20 69 67 6e 6f 72 69 6e  ...    # ignorin
2890: 67 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 77 65  g the problem we
28a0: 20 68 6f 77 65 76 65 72 20 67 65 74 20 61 73 20   however get as 
28b0: 6d 75 63 68 20 61 73 0a 09 09 20 20 20 20 23 20  much as...    # 
28c0: 69 73 20 70 6f 73 73 69 62 6c 65 2e 0a 0a 09 09  is possible.....
28d0: 20 20 20 20 77 72 69 74 65 20 30 20 63 76 73 20      write 0 cvs 
28e0: 22 45 45 20 43 6f 72 72 75 70 74 65 64 20 61 72  "EE Corrupted ar
28f0: 63 68 69 76 65 20 66 69 6c 65 2e 20 49 6e 61 63  chive file. Inac
2900: 63 65 73 73 69 62 6c 65 20 72 65 76 69 73 69 6f  cessible revisio
2910: 6e 2e 22 0a 09 09 20 20 20 20 63 6f 6e 74 69 6e  n."...    contin
2920: 75 65 0a 09 09 7d 0a 09 09 72 65 74 75 72 6e 20  ue...}...return 
2930: 2d 63 6f 64 65 20 65 72 72 6f 72 20 24 6d 73 67  -code error $msg
2940: 0a 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d  ..    }..}.    }
2950: 0a 0a 20 20 20 20 23 20 50 72 6f 76 69 64 65 20  ..    # Provide 
2960: 6d 65 74 61 64 61 74 61 20 61 62 6f 75 74 20 74  metadata about t
2970: 68 65 20 63 68 61 6e 67 65 73 65 74 20 74 68 65  he changeset the
2980: 20 62 61 63 6b 65 6e 64 20 6d 61 79 20 77 69 73   backend may wis
2990: 68 20 74 6f 20 68 61 76 65 0a 20 20 20 20 72 65  h to have.    re
29a0: 74 75 72 6e 20 5b 6c 69 73 74 20 24 75 20 24 73  turn [list $u $s
29b0: 20 24 63 6d 5d 0a 7d 0a 0a 70 72 6f 63 20 3a 3a   $cm].}..proc ::
29c0: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 66 6f 72  vc::cvs::ws::for
29d0: 65 61 63 68 5f 63 73 65 74 20 7b 63 76 20 6e 6f  each_cset {cv no
29e0: 64 65 20 73 63 72 69 70 74 7d 20 7b 0a 20 20 20  de script} {.   
29f0: 20 75 70 76 61 72 20 31 20 24 63 76 20 63 0a 20   upvar 1 $cv c. 
2a00: 20 20 20 76 61 72 69 61 62 6c 65 20 72 74 72 65     variable rtre
2a10: 65 0a 0a 20 20 20 20 73 65 74 20 63 20 24 6e 6f  e..    set c $no
2a20: 64 65 0a 20 20 20 20 77 68 69 6c 65 20 7b 31 7d  de.    while {1}
2a30: 20 7b 0a 09 73 65 74 20 63 6f 64 65 20 5b 63 61   {..set code [ca
2a40: 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20 24  tch {uplevel 1 $
2a50: 73 63 72 69 70 74 7d 20 72 65 73 5d 0a 0a 09 23  script} res]...#
2a60: 20 30 20 2d 20 6f 6b 2c 20 31 20 2d 20 65 72 72   0 - ok, 1 - err
2a70: 6f 72 2c 20 32 20 2d 20 72 65 74 75 72 6e 2c 20  or, 2 - return, 
2a80: 33 20 2d 20 62 72 65 61 6b 2c 20 34 20 2d 20 63  3 - break, 4 - c
2a90: 6f 6e 74 69 6e 75 65 0a 09 73 77 69 74 63 68 20  ontinue..switch 
2aa0: 2d 2d 20 24 63 6f 64 65 20 7b 0a 09 20 20 20 20  -- $code {..    
2ab0: 30 20 7b 7d 0a 09 20 20 20 20 31 20 7b 20 72 65  0 {}..    1 { re
2ac0: 74 75 72 6e 20 2d 65 72 72 6f 72 63 6f 64 65 20  turn -errorcode 
2ad0: 24 3a 3a 65 72 72 6f 72 43 6f 64 65 20 2d 65 72  $::errorCode -er
2ae0: 72 6f 72 69 6e 66 6f 20 24 3a 3a 65 72 72 6f 72  rorinfo $::error
2af0: 49 6e 66 6f 20 2d 63 6f 64 65 20 65 72 72 6f 72  Info -code error
2b00: 20 24 72 65 73 20 7d 0a 09 20 20 20 20 32 20 7b   $res }..    2 {
2b10: 7d 0a 09 20 20 20 20 33 20 7b 20 72 65 74 75 72  }..    3 { retur
2b20: 6e 20 7d 0a 09 20 20 20 20 34 20 7b 7d 0a 09 20  n }..    4 {}.. 
2b30: 20 20 20 64 65 66 61 75 6c 74 20 7b 0a 09 09 72     default {...r
2b40: 65 74 75 72 6e 20 2d 63 6f 64 65 20 24 63 6f 64  eturn -code $cod
2b50: 65 20 24 72 65 73 75 6c 74 0a 09 20 20 20 20 7d  e $result..    }
2b60: 0a 09 7d 0a 0a 09 23 20 53 74 6f 70 20 6f 6e 20  ..}...# Stop on 
2b70: 72 65 61 63 68 69 6e 67 20 74 68 65 20 68 65 61  reaching the hea
2b80: 64 2e 0a 09 69 66 20 7b 21 5b 6c 6c 65 6e 67 74  d...if {![llengt
2b90: 68 20 5b 24 72 74 72 65 65 20 63 68 69 6c 64 72  h [$rtree childr
2ba0: 65 6e 20 24 63 5d 5d 7d 20 62 72 65 61 6b 0a 0a  en $c]]} break..
2bb0: 09 23 70 75 74 73 20 3c 5b 24 72 74 72 65 65 20  .#puts <[$rtree 
2bc0: 63 68 69 6c 64 72 65 6e 20 24 63 5d 3e 0a 0a 09  children $c]>...
2bd0: 23 20 47 6f 20 74 6f 20 6e 65 78 74 20 63 68 69  # Go to next chi
2be0: 6c 64 20 69 6e 20 74 72 75 6e 6b 20 28 6c 65 66  ld in trunk (lef
2bf0: 74 6d 6f 73 74 29 2e 0a 09 73 65 74 20 63 20 5b  tmost)...set c [
2c00: 6c 69 6e 64 65 78 20 5b 24 72 74 72 65 65 20 63  lindex [$rtree c
2c10: 68 69 6c 64 72 65 6e 20 24 63 5d 20 30 5d 0a 20  hildren $c] 0]. 
2c20: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 0a     }.    return.
2c30: 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..# -----------
2c40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2c80: 2d 2d 0a 23 20 49 6e 74 65 72 6e 61 6c 20 68 65  --.# Internal he
2c90: 6c 70 65 72 20 63 6f 6d 6d 61 6e 64 73 3a 20 43  lper commands: C
2ca0: 68 61 6e 67 65 73 65 74 20 69 6e 73 70 65 63 74  hangeset inspect
2cb0: 69 6f 6e 20 61 6e 64 20 63 6f 6e 73 74 72 75 63  ion and construc
2cc0: 74 69 6f 6e 2e 0a 0a 70 72 6f 63 20 3a 3a 76 63  tion...proc ::vc
2cd0: 3a 3a 63 76 73 3a 3a 77 73 3a 3a 43 53 43 6c 65  ::cvs::ws::CSCle
2ce0: 61 72 20 7b 7d 20 7b 0a 20 20 20 20 75 70 76 61  ar {} {.    upva
2cf0: 72 20 31 20 73 74 61 72 74 20 73 74 61 72 74 20  r 1 start start 
2d00: 65 6e 64 20 65 6e 64 20 63 6d 20 63 6d 20 75 73  end end cm cm us
2d10: 65 72 20 75 73 65 72 20 66 69 6c 65 73 20 66 69  er user files fi
2d20: 6c 65 73 20 6c 61 73 74 64 20 6c 61 73 74 64 0a  les lastd lastd.
2d30: 0a 20 20 20 20 73 65 74 20 73 74 61 72 74 20 7b  .    set start {
2d40: 7d 0a 20 20 20 20 73 65 74 20 65 6e 64 20 20 20  }.    set end   
2d50: 7b 7d 0a 20 20 20 20 73 65 74 20 63 6d 20 20 20  {}.    set cm   
2d60: 20 7b 7d 0a 20 20 20 20 73 65 74 20 75 73 65 72   {}.    set user
2d70: 20 20 7b 7d 0a 20 20 20 20 73 65 74 20 6c 61 73    {}.    set las
2d80: 74 64 20 7b 7d 0a 20 20 20 20 61 72 72 61 79 20  td {}.    array 
2d90: 75 6e 73 65 74 20 66 69 6c 65 73 20 2a 0a 20 20  unset files *.  
2da0: 20 20 61 72 72 61 79 20 73 65 74 20 66 69 6c 65    array set file
2db0: 73 20 7b 7d 0a 20 20 20 20 72 65 74 75 72 6e 0a  s {}.    return.
2dc0: 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76  }..proc ::vc::cv
2dd0: 73 3a 3a 77 73 3a 3a 43 53 4e 6f 6e 65 20 7b 7d  s::ws::CSNone {}
2de0: 20 7b 0a 20 20 20 20 75 70 76 61 72 20 31 20 73   {.    upvar 1 s
2df0: 74 61 72 74 20 73 74 61 72 74 0a 20 20 20 20 72  tart start.    r
2e00: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 24 73 74  eturn [expr {$st
2e10: 61 72 74 20 65 71 20 22 22 7d 5d 0a 7d 0a 0a 70  art eq ""}].}..p
2e20: 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77  roc ::vc::cvs::w
2e30: 73 3a 3a 43 53 4e 65 77 20 7b 65 6e 74 72 79 7d  s::CSNew {entry}
2e40: 20 7b 0a 20 20 20 20 75 70 76 61 72 20 31 20 73   {.    upvar 1 s
2e50: 74 61 72 74 20 73 74 61 72 74 20 65 6e 64 20 65  tart start end e
2e60: 6e 64 20 63 6d 20 63 6d 20 75 73 65 72 20 75 73  nd cm cm user us
2e70: 65 72 20 66 69 6c 65 73 20 66 69 6c 65 73 20 6c  er files files l
2e80: 61 73 74 64 20 6c 61 73 74 64 20 72 65 61 73 6f  astd lastd reaso
2e90: 6e 20 72 65 61 73 6f 6e 0a 0a 20 20 20 20 23 70  n reason..    #p
2ea0: 75 74 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 73  uts -nonewline s
2eb0: 74 64 6f 75 74 20 2e 20 3b 20 66 6c 75 73 68 20  tdout . ; flush 
2ec0: 73 74 64 6f 75 74 0a 0a 20 20 20 20 3a 3a 66 6f  stdout..    ::fo
2ed0: 72 65 61 63 68 20 7b 6f 70 20 74 73 20 61 20 72  reach {op ts a r
2ee0: 65 76 20 66 20 65 63 6d 7d 20 24 65 6e 74 72 79  ev f ecm} $entry
2ef0: 20 62 72 65 61 6b 0a 0a 20 20 20 20 23 20 55 73   break..    # Us
2f00: 65 72 20 63 68 61 6e 67 65 0a 20 20 20 20 69 66  er change.    if
2f10: 20 7b 24 61 20 6e 65 20 24 75 73 65 72 7d 20 7b   {$a ne $user} {
2f20: 73 65 74 20 72 65 61 73 6f 6e 20 75 73 65 72 20  set reason user 
2f30: 3b 20 72 65 74 75 72 6e 20 31 7d 0a 0a 20 20 20  ; return 1}..   
2f40: 20 23 20 46 69 6c 65 20 61 6c 72 65 61 64 79 20   # File already 
2f50: 69 6e 20 63 75 72 72 65 6e 74 20 63 73 65 74 0a  in current cset.
2f60: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
2f70: 69 73 74 73 20 66 69 6c 65 73 28 24 66 29 5d 7d  ists files($f)]}
2f80: 20 7b 73 65 74 20 72 65 61 73 6f 6e 20 66 69 6c   {set reason fil
2f90: 65 20 3b 20 72 65 74 75 72 6e 20 31 7d 0a 0a 20  e ; return 1}.. 
2fa0: 20 20 20 23 20 43 75 72 72 65 6e 74 20 63 73 65     # Current cse
2fb0: 74 20 74 72 75 6e 6b 2f 62 72 61 6e 63 68 20 64  t trunk/branch d
2fc0: 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 65 6e  ifferent from en
2fd0: 74 72 79 2e 0a 20 20 20 20 73 65 74 20 64 65 70  try..    set dep
2fe0: 74 68 20 5b 6c 6c 65 6e 67 74 68 20 5b 73 70 6c  th [llength [spl
2ff0: 69 74 20 24 72 65 76 20 2e 5d 5d 0a 20 20 20 20  it $rev .]].    
3000: 69 66 20 7b 28 24 6c 61 73 74 64 20 3d 3d 20 32  if {($lastd == 2
3010: 29 20 21 3d 20 28 24 64 65 70 74 68 20 3d 3d 20  ) != ($depth == 
3020: 32 29 7d 20 7b 73 65 74 20 72 65 61 73 6f 6e 20  2)} {set reason 
3030: 64 65 70 74 68 2f 24 6c 61 73 74 64 2f 24 64 65  depth/$lastd/$de
3040: 70 74 68 2f 28 24 72 65 76 29 2f 24 66 20 3b 20  pth/($rev)/$f ; 
3050: 72 65 74 75 72 6e 20 31 7d 0a 0a 20 20 20 20 23  return 1}..    #
3060: 20 43 6f 6d 6d 69 74 20 6d 65 73 73 61 67 65 20   Commit message 
3070: 63 68 61 6e 67 65 64 0a 20 20 20 20 69 66 20 7b  changed.    if {
3080: 24 63 6d 20 6e 65 20 24 65 63 6d 7d 20 7b 73 65  $cm ne $ecm} {se
3090: 74 20 72 65 61 73 6f 6e 20 63 6d 73 67 5c 20 3c  t reason cmsg\ <
30a0: 3c 24 65 63 6d 3e 3e 20 3b 20 72 65 74 75 72 6e  <$ecm>> ; return
30b0: 20 31 7d 0a 0a 20 20 20 20 23 20 45 76 65 72 79   1}..    # Every
30c0: 74 68 69 6e 67 20 69 73 20 67 6f 6f 64 2c 20 73  thing is good, s
30d0: 74 69 6c 6c 20 74 68 65 20 73 61 6d 65 20 63 73  till the same cs
30e0: 65 74 0a 20 20 20 20 72 65 74 75 72 6e 20 30 0a  et.    return 0.
30f0: 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76  }..proc ::vc::cv
3100: 73 3a 3a 77 73 3a 3a 43 53 53 61 76 65 20 7b 7d  s::ws::CSSave {}
3110: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20   {.    variable 
3120: 63 6d 61 70 0a 20 20 20 20 76 61 72 69 61 62 6c  cmap.    variabl
3130: 65 20 63 73 65 74 73 0a 20 20 20 20 76 61 72 69  e csets.    vari
3140: 61 62 6c 65 20 6e 63 73 0a 20 20 20 20 75 70 76  able ncs.    upv
3150: 61 72 20 31 20 73 74 61 72 74 20 73 74 61 72 74  ar 1 start start
3160: 20 65 6e 64 20 65 6e 64 20 63 6d 20 63 6d 20 75   end end cm cm u
3170: 73 65 72 20 75 73 65 72 20 66 69 6c 65 73 20 66  ser user files f
3180: 69 6c 65 73 20 6c 61 73 74 64 20 6c 61 73 74 64  iles lastd lastd
3190: 0a 0a 20 20 20 20 73 65 74 20 63 73 65 74 73 28  ..    set csets(
31a0: 24 6e 63 73 29 20 5b 6c 69 73 74 20 24 75 73 65  $ncs) [list $use
31b0: 72 20 24 63 6d 20 24 73 74 61 72 74 20 24 65 6e  r $cm $start $en
31c0: 64 20 24 6c 61 73 74 64 20 5b 61 72 72 61 79 20  d $lastd [array 
31d0: 67 65 74 20 66 69 6c 65 73 5d 5d 0a 0a 20 20 20  get files]]..   
31e0: 20 23 20 52 65 63 6f 72 64 20 77 68 69 63 68 20   # Record which 
31f0: 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 61 20 66  revisions of a f
3200: 69 6c 65 20 61 72 65 20 69 6e 20 77 68 61 74 20  ile are in what 
3210: 63 73 65 74 73 0a 20 20 20 20 3a 3a 66 6f 72 65  csets.    ::fore
3220: 61 63 68 20 7b 66 20 6f 72 7d 20 5b 61 72 72 61  ach {f or} [arra
3230: 79 20 67 65 74 20 66 69 6c 65 73 5d 20 7b 0a 09  y get files] {..
3240: 3a 3a 66 6f 72 65 61 63 68 20 7b 5f 20 72 65 76  ::foreach {_ rev
3250: 7d 20 24 6f 72 20 62 72 65 61 6b 0a 09 73 65 74  } $or break..set
3260: 20 63 6d 61 70 28 5b 6c 69 73 74 20 24 66 20 24   cmap([list $f $
3270: 72 65 76 5d 29 20 24 6e 63 73 0a 20 20 20 20 7d  rev]) $ncs.    }
3280: 0a 0a 20 20 20 20 23 43 53 44 75 6d 70 20 24 6e  ..    #CSDump $n
3290: 63 73 0a 0a 20 20 20 20 69 6e 63 72 20 6e 63 73  cs..    incr ncs
32a0: 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70  .    return.}..p
32b0: 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77  roc ::vc::cvs::w
32c0: 73 3a 3a 43 53 41 64 64 20 7b 65 6e 74 72 79 7d  s::CSAdd {entry}
32d0: 20 7b 0a 20 20 20 20 75 70 76 61 72 20 31 20 73   {.    upvar 1 s
32e0: 74 61 72 74 20 73 74 61 72 74 20 65 6e 64 20 65  tart start end e
32f0: 6e 64 20 63 6d 20 63 6d 20 75 73 65 72 20 75 73  nd cm cm user us
3300: 65 72 20 66 69 6c 65 73 20 66 69 6c 65 73 20 6c  er files files l
3310: 61 73 74 64 20 6c 61 73 74 64 0a 0a 20 20 20 20  astd lastd..    
3320: 3a 3a 66 6f 72 65 61 63 68 20 7b 6f 70 20 74 73  ::foreach {op ts
3330: 20 61 20 72 65 76 20 66 20 65 63 6d 7d 20 24 65   a rev f ecm} $e
3340: 6e 74 72 79 20 62 72 65 61 6b 0a 0a 20 20 20 20  ntry break..    
3350: 69 66 20 7b 24 73 74 61 72 74 20 65 71 20 22 22  if {$start eq ""
3360: 7d 20 7b 73 65 74 20 73 74 61 72 74 20 24 74 73  } {set start $ts
3370: 7d 0a 20 20 20 20 73 65 74 20 65 6e 64 20 20 20  }.    set end   
3380: 20 20 20 20 24 74 73 0a 20 20 20 20 73 65 74 20      $ts.    set 
3390: 63 6d 20 20 20 20 20 20 20 20 24 65 63 6d 0a 20  cm        $ecm. 
33a0: 20 20 20 73 65 74 20 75 73 65 72 20 20 20 20 20     set user     
33b0: 20 24 61 0a 20 20 20 20 73 65 74 20 66 69 6c 65   $a.    set file
33c0: 73 28 24 66 29 20 5b 6c 69 73 74 20 24 6f 70 20  s($f) [list $op 
33d0: 24 72 65 76 5d 0a 20 20 20 20 73 65 74 20 6c 61  $rev].    set la
33e0: 73 74 64 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68  std     [llength
33f0: 20 5b 73 70 6c 69 74 20 24 72 65 76 20 2e 5d 5d   [split $rev .]]
3400: 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70  .    return.}..p
3410: 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77  roc ::vc::cvs::w
3420: 73 3a 3a 43 53 44 75 6d 70 20 7b 63 7d 20 7b 0a  s::CSDump {c} {.
3430: 20 20 20 20 76 61 72 69 61 62 6c 65 20 63 73 65      variable cse
3440: 74 73 0a 20 20 20 20 3a 3a 66 6f 72 65 61 63 68  ts.    ::foreach
3450: 20 7b 75 20 63 6d 20 73 20 65 20 72 64 20 66 7d   {u cm s e rd f}
3460: 20 24 63 73 65 74 73 28 24 63 29 20 62 72 65 61   $csets($c) brea
3470: 6b 0a 0a 20 20 20 20 70 75 74 73 20 22 24 75 20  k..    puts "$u 
3480: 24 73 22 3b 20 72 65 67 73 75 62 20 2d 61 6c 6c  $s"; regsub -all
3490: 20 7b 2e 7d 20 24 75 20 7b 20 7d 20 62 0a 20 20   {.} $u { } b.  
34a0: 20 20 70 75 74 73 20 22 24 62 20 24 65 22 0a 20    puts "$b $e". 
34b0: 20 20 20 3a 3a 66 6f 72 65 61 63 68 20 7b 66 20     ::foreach {f 
34c0: 6f 72 7d 20 24 66 20 7b 0a 09 3a 3a 66 6f 72 65  or} $f {..::fore
34d0: 61 63 68 20 7b 6f 20 72 7d 20 24 6f 72 20 62 72  ach {o r} $or br
34e0: 65 61 6b 0a 09 70 75 74 73 20 22 24 62 20 24 6f  eak..puts "$b $o
34f0: 20 24 66 20 24 72 22 0a 20 20 20 20 7d 0a 20 20   $f $r".    }.  
3500: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63    return.}..proc
3510: 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a   ::vc::cvs::ws::
3520: 4e 53 49 50 4c 20 7b 6e 20 73 69 6e 67 75 6c 61  NSIPL {n singula
3530: 72 20 7b 70 6c 75 72 61 6c 20 7b 7d 7d 7d 20 7b  r {plural {}}} {
3540: 0a 20 20 20 20 72 65 74 75 72 6e 20 22 24 6e 20  .    return "$n 
3550: 5b 53 49 50 4c 20 24 6e 20 24 73 69 6e 67 75 6c  [SIPL $n $singul
3560: 61 72 20 24 70 6c 75 72 61 6c 5d 22 0a 7d 0a 70  ar $plural]".}.p
3570: 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77  roc ::vc::cvs::w
3580: 73 3a 3a 53 49 50 4c 20 7b 6e 20 73 69 6e 67 75  s::SIPL {n singu
3590: 6c 61 72 20 7b 70 6c 75 72 61 6c 20 7b 7d 7d 7d  lar {plural {}}}
35a0: 20 7b 0a 20 20 20 20 69 66 20 7b 24 6e 20 3d 3d   {.    if {$n ==
35b0: 20 31 7d 20 7b 72 65 74 75 72 6e 20 24 73 69 6e   1} {return $sin
35c0: 67 75 6c 61 72 7d 0a 20 20 20 20 69 66 20 7b 24  gular}.    if {$
35d0: 70 6c 75 72 61 6c 20 65 71 20 22 22 7d 20 7b 73  plural eq ""} {s
35e0: 65 74 20 70 6c 75 72 61 6c 20 24 7b 73 69 6e 67  et plural ${sing
35f0: 75 6c 61 72 7d 73 7d 0a 20 20 20 20 72 65 74 75  ular}s}.    retu
3600: 72 6e 20 24 70 6c 75 72 61 6c 0a 7d 0a 0a 23 20  rn $plural.}..# 
3610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3640: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3650: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 6e  -------------..n
3660: 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a  amespace eval ::
3670: 76 63 3a 3a 63 76 73 3a 3a 77 73 20 7b 0a 20 20  vc::cvs::ws {.  
3680: 20 20 76 61 72 69 61 62 6c 65 20 62 61 73 65 20    variable base 
3690: 20 20 20 20 20 7b 7d 20 3b 20 23 20 54 6f 70 6c       {} ; # Topl
36a0: 65 76 65 6c 20 72 65 70 6f 73 69 74 6f 72 79 20  evel repository 
36b0: 64 69 72 65 63 74 6f 72 79 0a 20 20 20 20 76 61  directory.    va
36c0: 72 69 61 62 6c 65 20 70 72 6f 6a 65 63 74 20 20  riable project  
36d0: 20 7b 7d 20 3b 20 23 20 53 75 62 20 64 69 72 65   {} ; # Sub dire
36e0: 63 74 6f 72 79 20 74 6f 20 6c 69 6d 69 74 20 74  ctory to limit t
36f0: 68 65 20 69 6d 70 6f 72 74 20 74 6f 2e 0a 20 20  he import to..  
3700: 20 20 76 61 72 69 61 62 6c 65 20 77 6f 72 6b 73    variable works
3710: 70 61 63 65 20 7b 7d 20 3b 20 23 20 44 69 72 65  pace {} ; # Dire
3720: 63 74 6f 72 79 20 74 6f 20 63 68 65 63 6b 6f 75  ctory to checkou
3730: 74 20 63 68 61 6e 67 65 73 65 74 73 20 74 6f 2e  t changesets to.
3740: 0a 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20  ..    namespace 
3750: 65 78 70 6f 72 74 20 63 6f 6e 66 69 67 75 72 65  export configure
3760: 20 62 65 67 69 6e 20 64 6f 6e 65 20 66 6f 72 65   begin done fore
3770: 61 63 68 20 6e 63 73 65 74 73 20 63 68 65 63 6b  ach ncsets check
3780: 6f 75 74 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d  out.}..# -------
3790: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
37d0: 2d 2d 2d 2d 2d 2d 0a 23 20 52 65 61 64 79 0a 0a  ------.# Ready..
37e0: 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20  package provide 
37f0: 76 63 3a 3a 63 76 73 3a 3a 77 73 20 31 2e 30 0a  vc::cvs::ws 1.0.
3800: 72 65 74 75 72 6e 0a                             return.