Hex Artifact Content
Not logged in

Artifact 57072982aad7f476650a3fdfe7fb013951aa68c9:

File tools/lib/cvs.tcl part of check-in [1593006ef3] - More structuring of the CVS backend, encapsulated the management of the global timeline of events in the project in a separate package. by aku on 2007-09-17 03:03:25.

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 76 61 72 69 61 62 6c 65  } {.    variable
0a70: 20 70 72 6f 6a 65 63 74 0a 0a 20 20 20 20 73 65   project..    se
0a80: 74 20 73 72 63 20 5b 66 69 6c 65 20 6e 6f 72 6d  t src [file norm
0a90: 61 6c 69 7a 65 20 24 73 72 63 5d 0a 20 20 20 20  alize $src].    
0aa0: 69 66 20 7b 21 5b 63 68 65 63 6b 20 24 73 72 63  if {![check $src
0ab0: 20 6d 73 67 5d 7d 20 7b 20 72 65 74 75 72 6e 20   msg]} { return 
0ac0: 2d 63 6f 64 65 20 65 72 72 6f 72 20 24 6d 73 67  -code error $msg
0ad0: 20 7d 0a 0a 20 20 20 20 44 65 66 42 61 73 65 20   }..    DefBase 
0ae0: 24 73 72 63 0a 20 20 20 20 4d 61 6b 65 54 69 6d  $src.    MakeTim
0af0: 65 6c 69 6e 65 20 5b 53 63 61 6e 41 72 63 68 69  eline [ScanArchi
0b00: 76 65 73 20 5b 66 69 6c 65 73 3a 3a 66 69 6e 64  ves [files::find
0b10: 20 5b 52 6f 6f 74 50 61 74 68 5d 5d 5d 0a 0a 20   [RootPath]]].. 
0b20: 20 20 20 23 20 4f 4c 44 20 61 70 69 20 63 61 6c     # OLD api cal
0b30: 6c 73 20 2e 2e 2e 20 54 4f 44 4f 20 72 65 77 6f  ls ... TODO rewo
0b40: 72 6b 20 66 6f 72 20 6d 6f 72 65 20 73 74 72 75  rk for more stru
0b50: 63 74 75 72 65 20 2e 2e 2e 0a 20 20 20 20 63 73  cture ....    cs
0b60: 65 74 73 20 20 20 20 3b 20 23 20 47 72 6f 75 70  ets    ; # Group
0b70: 20 63 68 61 6e 67 65 73 20 69 6e 74 6f 20 73 65   changes into se
0b80: 74 73 0a 20 20 20 20 72 74 72 65 65 20 20 20 20  ts.    rtree    
0b90: 3b 20 23 20 42 75 69 6c 64 20 72 65 76 69 73 69  ; # Build revisi
0ba0: 6f 6e 20 74 72 65 65 20 28 74 72 75 6e 6b 20 6f  on tree (trunk o
0bb0: 6e 6c 79 20 72 69 67 68 74 20 6e 6f 77 29 2e 0a  nly right now)..
0bc0: 0a 20 20 20 20 73 65 74 20 77 20 5b 77 6f 72 6b  .    set w [work
0bd0: 73 70 61 63 65 5d 20 20 20 3b 20 23 20 4f 4c 44  space]   ; # OLD
0be0: 20 61 70 69 20 2e 2e 2e 20 54 4f 44 4f 20 69 6e   api ... TODO in
0bf0: 6c 69 6e 65 0a 20 20 20 20 69 66 20 7b 24 70 72  line.    if {$pr
0c00: 6f 6a 65 63 74 20 6e 65 20 22 22 7d 20 7b 0a 09  oject ne ""} {..
0c10: 73 65 74 20 77 20 24 77 2f 24 70 72 6f 6a 65 63  set w $w/$projec
0c20: 74 0a 09 66 69 6c 65 20 6d 6b 64 69 72 20 24 77  t..file mkdir $w
0c30: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
0c40: 6e 20 24 77 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76  n $w.}..proc ::v
0c50: 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 64 6f 6e 65  c::cvs::ws::done
0c60: 20 7b 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62   {} {.    variab
0c70: 6c 65 20 63 77 64 0a 20 20 20 20 76 61 72 69 61  le cwd.    varia
0c80: 62 6c 65 20 77 6f 72 6b 73 70 61 63 65 0a 20 20  ble workspace.  
0c90: 20 20 63 64 20 24 63 77 64 0a 20 20 20 20 66 69    cd $cwd.    fi
0ca0: 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65  le delete -force
0cb0: 20 24 77 6f 72 6b 73 70 61 63 65 0a 20 20 20 20   $workspace.    
0cc0: 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a  return.}..proc :
0cd0: 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 66 6f  :vc::cvs::ws::fo
0ce0: 72 65 61 63 68 20 7b 63 76 20 73 63 72 69 70 74  reach {cv script
0cf0: 7d 20 7b 0a 20 20 20 20 23 20 4f 4c 44 20 61 70  } {.    # OLD ap
0d00: 69 20 2e 2e 2e 20 54 4f 44 4f 20 69 6e 6c 69 6e  i ... TODO inlin
0d10: 65 0a 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20  e.    uplevel 1 
0d20: 5b 6c 69 73 74 20 3a 3a 76 63 3a 3a 63 76 73 3a  [list ::vc::cvs:
0d30: 3a 77 73 3a 3a 66 6f 72 65 61 63 68 5f 63 73 65  :ws::foreach_cse
0d40: 74 20 24 63 76 20 30 20 24 73 63 72 69 70 74 5d  t $cv 0 $script]
0d50: 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63  .}..proc ::vc::c
0d60: 76 73 3a 3a 77 73 3a 3a 6e 63 73 65 74 73 20 7b  vs::ws::ncsets {
0d70: 61 72 67 73 7d 20 7b 0a 20 20 20 20 76 61 72 69  args} {.    vari
0d80: 61 62 6c 65 20 6e 63 73 0a 20 20 20 20 76 61 72  able ncs.    var
0d90: 69 61 62 6c 65 20 6e 74 72 75 6e 6b 0a 0a 20 20  iable ntrunk..  
0da0: 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24    if {[llength $
0db0: 61 72 67 73 5d 20 3e 20 31 7d 20 7b 0a 09 72 65  args] > 1} {..re
0dc0: 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72  turn -code error
0dd0: 20 22 77 72 6f 6e 67 23 61 72 67 73 3a 20 45 78   "wrong#args: Ex
0de0: 70 65 63 74 65 64 20 3f 2d 69 6d 70 6f 72 74 3f  pected ?-import?
0df0: 22 0a 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b  ".    } elseif {
0e00: 5b 6c 6c 65 6e 67 74 68 20 24 61 72 67 73 5d 20  [llength $args] 
0e10: 3d 3d 20 31 7d 20 7b 0a 09 69 66 20 7b 5b 73 65  == 1} {..if {[se
0e20: 74 20 6b 20 5b 6c 69 6e 64 65 78 20 24 61 72 67  t k [lindex $arg
0e30: 73 20 30 5d 5d 20 6e 65 20 22 2d 69 6d 70 6f 72  s 0]] ne "-impor
0e40: 74 22 7d 20 7b 0a 09 20 20 20 20 72 65 74 75 72  t"} {..    retur
0e50: 6e 20 2d 63 6f 64 65 20 22 55 6e 6b 6e 6f 77 6e  n -code "Unknown
0e60: 20 73 77 69 74 63 68 20 24 6b 2c 20 65 78 70 65   switch $k, expe
0e70: 63 74 65 64 20 2d 69 6d 70 6f 72 74 22 0a 09 7d  cted -import"..}
0e80: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74   else {..    ret
0e90: 75 72 6e 20 24 6e 74 72 75 6e 6b 0a 09 7d 0a 20  urn $ntrunk..}. 
0ea0: 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e     }..    return
0eb0: 20 20 24 6e 63 73 0a 7d 0a 0a 70 72 6f 63 20 3a    $ncs.}..proc :
0ec0: 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 69 73  :vc::cvs::ws::is
0ed0: 61 64 6d 69 6e 20 7b 70 61 74 68 7d 20 7b 0a 20  admin {path} {. 
0ee0: 20 20 20 23 20 43 68 65 63 6b 20 69 66 20 70 61     # Check if pa
0ef0: 74 68 20 69 73 20 61 20 43 56 53 20 61 64 6d 69  th is a CVS admi
0f00: 6e 20 66 69 6c 65 2e 0a 20 20 20 20 69 66 20 7b  n file..    if {
0f10: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 43 56  [string match CV
0f20: 53 2f 2a 20 20 20 24 70 61 74 68 5d 7d 20 7b 72  S/*   $path]} {r
0f30: 65 74 75 72 6e 20 31 7d 0a 20 20 20 20 69 66 20  eturn 1}.    if 
0f40: 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a  {[string match *
0f50: 2f 43 56 53 2f 2a 20 24 70 61 74 68 5d 7d 20 7b  /CVS/* $path]} {
0f60: 72 65 74 75 72 6e 20 31 7d 0a 20 20 20 20 72 65  return 1}.    re
0f70: 74 75 72 6e 20 30 0a 7d 0a 0a 70 72 6f 63 20 3a  turn 0.}..proc :
0f80: 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 63 68  :vc::cvs::ws::ch
0f90: 65 63 6b 6f 75 74 20 7b 69 64 7d 20 7b 0a 20 20  eckout {id} {.  
0fa0: 20 20 76 61 72 69 61 62 6c 65 20 77 6f 72 6b 73    variable works
0fb0: 70 61 63 65 20 3b 20 63 64 20 24 77 6f 72 6b 73  pace ; cd $works
0fc0: 70 61 63 65 0a 20 20 20 20 77 73 73 65 74 75 70  pace.    wssetup
0fd0: 20 24 69 64 20 3b 20 23 20 4f 4c 44 20 61 70 69   $id ; # OLD api
0fe0: 20 2e 2e 2e 20 54 4f 44 4f 20 69 6e 6c 69 6e 65   ... TODO inline
0ff0: 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  .}..# ----------
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
1040: 2d 2d 2d 0a 23 20 49 6e 74 65 72 6e 61 6c 73 20  ---.# Internals 
1050: 2d 20 4f 6c 64 20 41 50 49 20 66 6f 72 20 6e 6f  - Old API for no
1060: 77 2e 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63  w...proc ::vc::c
1070: 76 73 3a 3a 77 73 3a 3a 44 65 66 42 61 73 65 20  vs::ws::DefBase 
1080: 7b 70 61 74 68 7d 20 7b 0a 20 20 20 20 76 61 72  {path} {.    var
1090: 69 61 62 6c 65 20 70 72 6f 6a 65 63 74 0a 20 20  iable project.  
10a0: 20 20 76 61 72 69 61 62 6c 65 20 62 61 73 65 0a    variable base.
10b0: 0a 20 20 20 20 73 65 74 20 62 61 73 65 20 24 70  .    set base $p
10c0: 61 74 68 0a 0a 20 20 20 20 77 72 69 74 65 20 30  ath..    write 0
10d0: 20 63 76 73 20 22 42 61 73 65 3a 20 20 20 20 24   cvs "Base:    $
10e0: 62 61 73 65 22 0a 20 20 20 20 69 66 20 7b 24 70  base".    if {$p
10f0: 72 6f 6a 65 63 74 20 65 71 20 22 22 7d 20 7b 0a  roject eq ""} {.
1100: 09 77 72 69 74 65 20 30 20 63 76 73 20 22 50 72  .write 0 cvs "Pr
1110: 6f 6a 65 63 74 3a 20 3c 41 4c 4c 3e 22 0a 20 20  oject: <ALL>".  
1120: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 77 72 69 74    } else {..writ
1130: 65 20 30 20 63 76 73 20 22 50 72 6f 6a 65 63 74  e 0 cvs "Project
1140: 3a 20 24 70 72 6f 6a 65 63 74 22 0a 20 20 20 20  : $project".    
1150: 7d 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a  }.    return.}..
1160: 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a  proc ::vc::cvs::
1170: 77 73 3a 3a 52 6f 6f 74 50 61 74 68 20 7b 7d 20  ws::RootPath {} 
1180: 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 70  {.    variable p
1190: 72 6f 6a 65 63 74 0a 20 20 20 20 76 61 72 69 61  roject.    varia
11a0: 62 6c 65 20 62 61 73 65 0a 0a 20 20 20 20 69 66  ble base..    if
11b0: 20 7b 24 70 72 6f 6a 65 63 74 20 65 71 20 22 22   {$project eq ""
11c0: 7d 20 7b 0a 09 72 65 74 75 72 6e 20 24 62 61 73  } {..return $bas
11d0: 65 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09  e.    } else {..
11e0: 72 65 74 75 72 6e 20 24 62 61 73 65 2f 24 70 72  return $base/$pr
11f0: 6f 6a 65 63 74 0a 20 20 20 20 7d 0a 7d 0a 0a 23  oject.    }.}..#
1200: 20 53 63 61 6e 20 72 65 70 6f 73 69 74 6f 72 79   Scan repository
1210: 2c 20 63 6f 6c 6c 65 63 74 20 61 72 63 68 69 76  , collect archiv
1220: 65 73 2c 20 70 61 72 73 65 20 74 68 65 6d 2c 20  es, parse them, 
1230: 61 6e 64 20 63 6f 6c 6c 65 63 74 20 72 65 76 69  and collect revi
1240: 73 69 6f 6e 0a 23 20 69 6e 66 6f 72 6d 61 74 69  sion.# informati
1250: 6f 6e 20 28 66 69 6c 65 2c 20 72 65 76 69 73 69  on (file, revisi
1260: 6f 6e 20 2d 3e 20 64 61 74 65 2c 20 61 75 74 68  on -> date, auth
1270: 6f 72 2c 20 63 6f 6d 6d 69 74 20 6d 65 73 73 61  or, commit messa
1280: 67 65 29 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a  ge)..proc ::vc::
1290: 63 76 73 3a 3a 77 73 3a 3a 53 63 61 6e 41 72 63  cvs::ws::ScanArc
12a0: 68 69 76 65 73 20 7b 66 69 6c 65 73 7d 20 7b 0a  hives {files} {.
12b0: 20 20 20 20 77 72 69 74 65 20 30 20 63 76 73 20      write 0 cvs 
12c0: 22 53 63 61 6e 6e 69 6e 67 20 61 72 63 68 69 76  "Scanning archiv
12d0: 65 73 20 2e 2e 2e 22 0a 0a 20 20 20 20 73 65 74  es ..."..    set
12e0: 20 64 20 5b 52 6f 6f 74 50 61 74 68 5d 0a 20 20   d [RootPath].  
12f0: 20 20 73 65 74 20 72 20 7b 7d 0a 20 20 20 20 73    set r {}.    s
1300: 65 74 20 6e 20 30 0a 0a 20 20 20 20 3a 3a 66 6f  et n 0..    ::fo
1310: 72 65 61 63 68 20 7b 72 63 73 20 66 7d 20 24 66  reach {rcs f} $f
1320: 69 6c 65 73 20 7b 0a 09 77 72 69 74 65 20 31 20  iles {..write 1 
1330: 63 76 73 20 22 41 72 63 68 69 76 65 20 24 72 63  cvs "Archive $rc
1340: 73 22 0a 09 23 20 47 65 74 20 74 68 65 20 6d 65  s"..# Get the me
1350: 74 61 20 64 61 74 61 20 77 65 20 6e 65 65 64 20  ta data we need 
1360: 28 72 65 76 69 73 69 6f 6e 73 2c 20 74 69 6d 65  (revisions, time
1370: 6c 69 6e 65 2c 20 6d 65 73 73 61 67 65 73 29 2e  line, messages).
1380: 0a 09 6c 61 70 70 65 6e 64 20 72 20 24 66 20 5b  ..lappend r $f [
1390: 70 72 6f 63 65 73 73 20 24 64 2f 24 72 63 73 5d  process $d/$rcs]
13a0: 0a 09 69 6e 63 72 20 20 20 20 6e 0a 20 20 20 20  ..incr    n.    
13b0: 7d 0a 0a 20 20 20 20 77 72 69 74 65 20 30 20 63  }..    write 0 c
13c0: 76 73 20 22 50 72 6f 63 65 73 73 65 64 20 5b 4e  vs "Processed [N
13d0: 53 49 50 4c 20 24 6e 20 66 69 6c 65 5d 22 0a 20  SIPL $n file]". 
13e0: 20 20 20 72 65 74 75 72 6e 20 24 72 0a 7d 0a 0a     return $r.}..
13f0: 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a  proc ::vc::cvs::
1400: 77 73 3a 3a 4d 61 6b 65 54 69 6d 65 6c 69 6e 65  ws::MakeTimeline
1410: 20 7b 6d 65 74 61 7d 20 7b 0a 20 20 20 20 77 72   {meta} {.    wr
1420: 69 74 65 20 30 20 63 76 73 20 22 47 65 6e 65 72  ite 0 cvs "Gener
1430: 61 74 69 6e 67 20 63 6f 61 6c 65 73 63 65 64 20  ating coalesced 
1440: 74 69 6d 65 6c 69 6e 65 20 2e 2e 2e 22 0a 0a 20  timeline ...".. 
1450: 20 20 20 73 65 74 20 6e 20 30 0a 20 20 20 20 3a     set n 0.    :
1460: 3a 66 6f 72 65 61 63 68 20 7b 66 20 6d 65 74 61  :foreach {f meta
1470: 7d 20 24 6d 65 74 61 20 7b 0a 09 61 72 72 61 79  } $meta {..array
1480: 20 73 65 74 20 6d 64 20 20 20 24 6d 65 74 61 0a   set md   $meta.
1490: 09 61 72 72 61 79 20 73 65 74 20 64 61 74 65 20  .array set date 
14a0: 24 6d 64 28 64 61 74 65 29 0a 09 61 72 72 61 79  $md(date)..array
14b0: 20 73 65 74 20 61 75 74 68 20 24 6d 64 28 61 75   set auth $md(au
14c0: 74 68 6f 72 29 0a 09 61 72 72 61 79 20 73 65 74  thor)..array set
14d0: 20 63 6d 73 67 20 24 6d 64 28 63 6f 6d 6d 69 74   cmsg $md(commit
14e0: 29 0a 09 61 72 72 61 79 20 73 65 74 20 73 74 61  )..array set sta
14f0: 74 20 24 6d 64 28 73 74 61 74 65 29 0a 0a 09 3a  t $md(state)...:
1500: 3a 66 6f 72 65 61 63 68 20 72 65 76 20 5b 6c 73  :foreach rev [ls
1510: 6f 72 74 20 2d 64 69 63 74 20 5b 61 72 72 61 79  ort -dict [array
1520: 20 6e 61 6d 65 73 20 64 61 74 65 5d 5d 20 7b 0a   names date]] {.
1530: 09 20 20 20 20 73 65 74 20 6f 70 65 72 61 74 69  .    set operati
1540: 6f 6e 20 5b 4f 70 65 72 61 74 69 6f 6e 20 24 72  on [Operation $r
1550: 65 76 20 24 73 74 61 74 28 24 72 65 76 29 5d 0a  ev $stat($rev)].
1560: 09 20 20 20 20 4e 6f 74 65 44 65 61 64 52 6f 6f  .    NoteDeadRoo
1570: 74 73 20 24 66 20 24 72 65 76 20 24 6f 70 65 72  ts $f $rev $oper
1580: 61 74 69 6f 6e 0a 09 20 20 20 20 74 69 6d 65 6c  ation..    timel
1590: 69 6e 65 3a 3a 61 64 64 20 24 64 61 74 65 28 24  ine::add $date($
15a0: 72 65 76 29 20 24 66 20 24 72 65 76 20 24 6f 70  rev) $f $rev $op
15b0: 65 72 61 74 69 6f 6e 20 24 61 75 74 68 28 24 72  eration $auth($r
15c0: 65 76 29 20 24 63 6d 73 67 28 24 72 65 76 29 0a  ev) $cmsg($rev).
15d0: 09 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 09  .    incr n..}..
15e0: 23 42 20 45 78 74 65 6e 64 20 62 72 61 6e 63 68  #B Extend branch
15f0: 20 6d 61 6e 61 67 65 6d 65 6e 74 0a 20 20 20 20   management.    
1600: 7d 0a 0a 20 20 20 20 77 72 69 74 65 20 30 20 63  }..    write 0 c
1610: 76 73 20 22 47 65 6e 65 72 61 74 65 64 20 5b 4e  vs "Generated [N
1620: 53 49 50 4c 20 24 6e 20 65 6e 74 72 79 20 65 6e  SIPL $n entry en
1630: 74 72 69 65 73 5d 22 0a 20 20 20 20 72 65 74 75  tries]".    retu
1640: 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a  rn.}..proc ::vc:
1650: 3a 63 76 73 3a 3a 77 73 3a 3a 4e 6f 74 65 44 65  :cvs::ws::NoteDe
1660: 61 64 52 6f 6f 74 73 20 7b 66 20 72 65 76 20 6f  adRoots {f rev o
1670: 70 65 72 61 74 69 6f 6e 7d 20 7b 0a 20 20 20 20  peration} {.    
1680: 23 20 41 20 64 65 61 64 2d 66 69 72 73 74 20 72  # A dead-first r
1690: 65 76 69 73 69 6f 6e 20 69 73 20 72 65 76 20 31  evision is rev 1
16a0: 2e 31 20 77 69 74 68 20 6f 70 20 52 2e 20 46 6f  .1 with op R. Fo
16b0: 72 20 61 6e 20 65 78 61 6d 70 6c 65 20 73 65 65  r an example see
16c0: 0a 20 20 20 20 23 20 74 68 65 20 66 69 6c 65 20  .    # the file 
16d0: 6d 65 6d 63 68 61 6e 2f 44 45 50 45 4e 44 45 4e  memchan/DEPENDEN
16e0: 43 49 45 53 2e 20 53 75 63 68 20 61 20 66 69 6c  CIES. Such a fil
16f0: 65 20 73 65 65 6d 73 20 74 6f 20 65 78 69 73 74  e seems to exist
1700: 20 6f 6e 6c 79 21 0a 20 20 20 20 23 20 6f 6e 20   only!.    # on 
1710: 69 74 73 20 62 72 61 6e 63 68 2e 20 54 68 65 20  its branch. The 
1720: 62 72 61 6e 63 68 65 73 20 69 6e 66 6f 72 6d 61  branches informa
1730: 74 69 6f 6e 20 69 73 20 73 65 74 20 6f 6e 20 74  tion is set on t
1740: 68 65 20 72 65 76 69 73 69 6f 6e 0a 20 20 20 20  he revision.    
1750: 23 20 28 65 78 74 65 6e 64 20 72 63 73 70 61 72  # (extend rcspar
1760: 73 65 72 21 29 2c 20 73 79 6d 62 6f 6c 73 20 68  ser!), symbols h
1770: 61 73 20 61 20 74 61 67 2c 20 72 65 66 65 72 69  as a tag, referi
1780: 6e 67 20 74 6f 20 61 20 62 72 61 6e 63 68 2c 0a  ng to a branch,.
1790: 20 20 20 20 23 20 70 6f 73 73 69 62 6c 79 20 6d      # possibly m
17a0: 61 67 69 63 2e 0a 0a 20 20 20 20 69 66 20 7b 28  agic...    if {(
17b0: 24 72 65 76 20 65 71 20 22 31 2e 31 22 29 20 26  $rev eq "1.1") &
17c0: 26 20 28 24 6f 70 65 72 61 74 69 6f 6e 20 65 71  & ($operation eq
17d0: 20 22 52 22 29 7d 20 7b 0a 09 77 72 69 74 65 20   "R")} {..write 
17e0: 32 20 63 76 73 20 22 44 65 61 64 20 72 6f 6f 74  2 cvs "Dead root
17f0: 20 72 65 76 69 73 69 6f 6e 3a 20 24 66 22 0a 20   revision: $f". 
1800: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 0a     }.    return.
1810: 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76  }..proc ::vc::cv
1820: 73 3a 3a 77 73 3a 3a 4f 70 65 72 61 74 69 6f 6e  s::ws::Operation
1830: 20 7b 72 65 76 20 73 74 61 74 65 7d 20 7b 0a 20   {rev state} {. 
1840: 20 20 20 69 66 20 7b 24 73 74 61 74 65 20 65 71     if {$state eq
1850: 20 22 64 65 61 64 22 7d 20 7b 72 65 74 75 72 6e   "dead"} {return
1860: 20 22 52 22 7d 20 3b 20 23 20 52 65 6d 6f 76 65   "R"} ; # Remove
1870: 64 0a 20 20 20 20 69 66 20 7b 24 72 65 76 20 20  d.    if {$rev  
1880: 20 65 71 20 22 31 2e 31 22 7d 20 20 7b 72 65 74   eq "1.1"}  {ret
1890: 75 72 6e 20 22 41 22 7d 20 3b 20 23 20 41 64 64  urn "A"} ; # Add
18a0: 65 64 0a 20 20 20 20 72 65 74 75 72 6e 20 22 4d  ed.    return "M
18b0: 22 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  "               
18c0: 20 20 20 20 20 20 20 20 20 20 3b 20 23 20 4d 6f            ; # Mo
18d0: 64 69 66 69 65 64 0a 7d 0a 0a 0a 0a 23 20 47 72  dified.}....# Gr
18e0: 6f 75 70 20 73 69 6e 67 6c 65 20 63 68 61 6e 67  oup single chang
18f0: 65 73 20 69 6e 74 6f 20 63 68 61 6e 67 65 73 65  es into changese
1900: 74 73 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63  ts..proc ::vc::c
1910: 76 73 3a 3a 77 73 3a 3a 63 73 65 74 73 20 7b 7d  vs::ws::csets {}
1920: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20   {.    variable 
1930: 74 69 6d 65 6c 69 6e 65 0a 20 20 20 20 76 61 72  timeline.    var
1940: 69 61 62 6c 65 20 63 73 65 74 73 0a 20 20 20 20  iable csets.    
1950: 76 61 72 69 61 62 6c 65 20 6e 63 73 0a 20 20 20  variable ncs.   
1960: 20 76 61 72 69 61 62 6c 65 20 63 6d 61 70 0a 0a   variable cmap..
1970: 20 20 20 20 61 72 72 61 79 20 75 6e 73 65 74 20      array unset 
1980: 63 73 65 74 73 20 2a 20 3b 20 61 72 72 61 79 20  csets * ; array 
1990: 73 65 74 20 63 73 65 74 73 20 7b 7d 0a 20 20 20  set csets {}.   
19a0: 20 61 72 72 61 79 20 75 6e 73 65 74 20 63 6d 61   array unset cma
19b0: 70 20 20 2a 20 3b 20 61 72 72 61 79 20 73 65 74  p  * ; array set
19c0: 20 63 6d 61 70 20 20 7b 7d 0a 20 20 20 20 73 65   cmap  {}.    se
19d0: 74 20 6e 63 73 20 30 0a 0a 20 20 20 20 77 72 69  t ncs 0..    wri
19e0: 74 65 20 30 20 63 76 73 20 22 47 65 6e 65 72 61  te 0 cvs "Genera
19f0: 74 69 6e 67 20 63 68 61 6e 67 65 73 65 74 73 20  ting changesets 
1a00: 66 72 6f 6d 20 74 69 6d 65 6c 69 6e 65 22 0a 0a  from timeline"..
1a10: 20 20 20 20 43 53 43 6c 65 61 72 0a 20 20 20 20      CSClear.    
1a20: 74 69 6d 65 6c 69 6e 65 3a 3a 66 6f 72 65 61 63  timeline::foreac
1a30: 68 20 64 61 74 65 20 66 69 6c 65 20 72 65 76 69  h date file revi
1a40: 73 69 6f 6e 20 6f 70 65 72 61 74 69 6f 6e 20 61  sion operation a
1a50: 75 74 68 6f 72 20 63 6d 73 67 20 7b 0a 09 23 20  uthor cmsg {..# 
1a60: 41 50 49 20 61 64 61 70 74 69 6f 6e 0a 09 73 65  API adaption..se
1a70: 74 20 65 6e 74 72 79 20 5b 6c 69 73 74 20 24 6f  t entry [list $o
1a80: 70 65 72 61 74 69 6f 6e 20 24 64 61 74 65 20 24  peration $date $
1a90: 61 75 74 68 6f 72 20 24 72 65 76 69 73 69 6f 6e  author $revision
1aa0: 20 24 66 69 6c 65 20 24 63 6d 73 67 5d 0a 0a 09   $file $cmsg]...
1ab0: 69 66 20 7b 21 5b 43 53 4e 6f 6e 65 5d 20 26 26  if {![CSNone] &&
1ac0: 20 5b 43 53 4e 65 77 20 24 65 6e 74 72 79 5d 7d   [CSNew $entry]}
1ad0: 20 7b 0a 09 20 20 20 20 43 53 53 61 76 65 0a 09   {..    CSSave..
1ae0: 20 20 20 20 43 53 43 6c 65 61 72 0a 09 7d 0a 09      CSClear..}..
1af0: 43 53 41 64 64 20 24 65 6e 74 72 79 0a 20 20 20  CSAdd $entry.   
1b00: 20 7d 0a 0a 20 20 20 20 77 72 69 74 65 20 30 20   }..    write 0 
1b10: 63 76 73 20 22 46 6f 75 6e 64 20 5b 4e 53 49 50  cvs "Found [NSIP
1b20: 4c 20 5b 61 72 72 61 79 20 73 69 7a 65 20 63 73  L [array size cs
1b30: 65 74 73 5d 20 63 68 61 6e 67 65 73 65 74 5d 22  ets] changeset]"
1b40: 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 0a  .    return.}...
1b50: 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a  namespace eval :
1b60: 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 20 7b 0a 20  :vc::cvs::ws {. 
1b70: 20 20 20 23 20 43 68 61 6e 67 65 73 65 74 20 64     # Changeset d
1b80: 61 74 61 3a 0a 20 20 20 20 23 20 6e 63 73 3a 20  ata:.    # ncs: 
1b90: 20 20 43 6f 75 6e 74 65 72 2d 62 61 73 65 64 20    Counter-based 
1ba0: 69 64 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20  id generation.  
1bb0: 20 20 23 20 63 73 65 74 73 3a 20 69 64 20 2d 3e    # csets: id ->
1bc0: 20 28 75 73 65 72 20 63 6f 6d 6d 69 74 20 73 74   (user commit st
1bd0: 61 72 74 20 65 6e 64 20 64 65 70 74 68 20 28 66  art end depth (f
1be0: 69 6c 65 20 2d 3e 20 28 6f 70 20 72 65 76 29 29  ile -> (op rev))
1bf0: 29 0a 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20  )..    variable 
1c00: 6e 63 73 20 20 20 20 20 20 3b 20 73 65 74 20 20  ncs      ; set  
1c10: 20 20 20 20 20 6e 63 73 20 20 20 30 20 20 3b 20       ncs   0  ; 
1c20: 23 20 43 6f 75 6e 74 65 72 20 66 6f 72 20 63 68  # Counter for ch
1c30: 61 6e 67 65 73 65 74 73 0a 20 20 20 20 76 61 72  angesets.    var
1c40: 69 61 62 6c 65 20 63 73 65 74 73 20 20 20 20 3b  iable csets    ;
1c50: 20 61 72 72 61 79 20 73 65 74 20 63 73 65 74 73   array set csets
1c60: 20 7b 7d 20 3b 20 23 20 43 68 61 6e 67 65 73 65   {} ; # Changese
1c70: 74 20 64 61 74 61 0a 7d 0a 0a 23 20 42 75 69 6c  t data.}..# Buil
1c80: 64 69 6e 67 20 74 68 65 20 72 65 76 69 73 69 6f  ding the revisio
1c90: 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20  n tree from the 
1ca0: 63 68 61 6e 67 65 73 65 74 73 2e 0a 23 20 4c 69  changesets..# Li
1cb0: 6d 69 74 61 74 69 6f 6e 3a 20 43 75 72 72 65 6e  mitation: Curren
1cc0: 74 6c 79 20 6f 6e 6c 79 20 74 72 75 6e 6b 20 63  tly only trunk c
1cd0: 73 65 74 73 20 69 73 20 68 61 6e 64 6c 65 64 2e  sets is handled.
1ce0: 0a 23 20 4c 69 6d 69 74 61 74 69 6f 6e 3a 20 44  .# Limitation: D
1cf0: 65 61 64 20 66 69 6c 65 73 20 61 72 65 20 6e 6f  ead files are no
1d00: 74 20 72 65 6d 6f 76 65 64 2c 20 69 2e 65 2e 20  t removed, i.e. 
1d10: 6e 6f 20 27 52 27 20 61 63 74 69 6f 6e 73 20 72  no 'R' actions r
1d20: 69 67 68 74 20 6e 6f 77 2e 0a 0a 70 72 6f 63 20  ight now...proc 
1d30: 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 72  ::vc::cvs::ws::r
1d40: 74 72 65 65 20 7b 7d 20 7b 0a 20 20 20 20 76 61  tree {} {.    va
1d50: 72 69 61 62 6c 65 20 63 73 65 74 73 0a 20 20 20  riable csets.   
1d60: 20 76 61 72 69 61 62 6c 65 20 72 74 72 65 65 20   variable rtree 
1d70: 7b 7d 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20  {}.    variable 
1d80: 6e 74 72 75 6e 6b 20 30 0a 0a 20 20 20 20 77 72  ntrunk 0..    wr
1d90: 69 74 65 20 30 20 63 76 73 20 22 45 78 74 72 61  ite 0 cvs "Extra
1da0: 63 74 69 6e 67 20 74 68 65 20 74 72 75 6e 6b 22  cting the trunk"
1db0: 0a 0a 20 20 20 20 73 65 74 20 72 74 72 65 65 20  ..    set rtree 
1dc0: 5b 73 74 72 75 63 74 3a 3a 74 72 65 65 20 3a 3a  [struct::tree ::
1dd0: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 52 54 5d  vc::cvs::ws::RT]
1de0: 0a 20 20 20 20 24 72 74 72 65 65 20 72 65 6e 61  .    $rtree rena
1df0: 6d 65 20 72 6f 6f 74 20 30 20 3b 20 23 20 52 6f  me root 0 ; # Ro
1e00: 6f 74 20 69 73 20 66 69 72 73 74 20 63 68 61 6e  ot is first chan
1e10: 67 65 73 65 74 2c 20 61 6c 77 61 79 73 2e 0a 20  geset, always.. 
1e20: 20 20 20 73 65 74 20 74 72 75 6e 6b 20 30 0a 20     set trunk 0. 
1e30: 20 20 20 73 65 74 20 6e 74 72 75 6e 6b 20 31 20     set ntrunk 1 
1e40: 3b 20 23 20 52 6f 6f 74 20 69 73 20 6f 6e 20 74  ; # Root is on t
1e50: 68 65 20 74 72 75 6e 6b 2e 0a 20 20 20 20 73 65  he trunk..    se
1e60: 74 20 62 20 20 20 20 20 20 30 20 3b 20 23 20 4e  t b      0 ; # N
1e70: 6f 20 62 72 61 6e 63 68 20 63 73 65 74 73 20 66  o branch csets f
1e80: 6f 75 6e 64 20 79 65 74 2e 0a 0a 20 20 20 20 23  ound yet...    #
1e90: 20 45 78 74 72 61 63 74 69 6e 67 20 74 68 65 20   Extracting the 
1ea0: 74 72 75 6e 6b 20 69 73 20 65 61 73 79 2c 20 73  trunk is easy, s
1eb0: 69 6d 70 6c 79 20 62 79 20 6c 6f 6f 6b 69 6e 67  imply by looking
1ec0: 20 61 74 20 74 68 65 20 69 6e 76 6f 6c 76 65 64   at the involved
1ed0: 0a 20 20 20 20 23 20 76 65 72 73 69 6f 6e 20 6e  .    # version n
1ee0: 75 6d 62 65 72 73 2e 20 0a 0a 20 20 20 20 3a 3a  umbers. ..    ::
1ef0: 66 6f 72 65 61 63 68 20 63 20 5b 6c 72 61 6e 67  foreach c [lrang
1f00: 65 20 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65  e [lsort -intege
1f10: 72 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 63  r [array names c
1f20: 73 65 74 73 5d 5d 20 31 20 65 6e 64 5d 20 7b 0a  sets]] 1 end] {.
1f30: 09 3a 3a 66 6f 72 65 61 63 68 20 7b 75 20 63 6d  .::foreach {u cm
1f40: 20 73 20 65 20 72 64 20 66 7d 20 24 63 73 65 74   s e rd f} $cset
1f50: 73 28 24 63 29 20 62 72 65 61 6b 0a 0a 09 23 20  s($c) break...# 
1f60: 49 67 6e 6f 72 65 20 62 72 61 6e 63 68 20 63 68  Ignore branch ch
1f70: 61 6e 67 65 73 2c 20 6a 75 73 74 20 63 6f 75 6e  anges, just coun
1f80: 74 20 74 68 65 6d 20 66 6f 72 20 74 68 65 20 73  t them for the s
1f90: 74 61 74 69 73 74 69 63 73 2e 0a 09 69 66 20 7b  tatistics...if {
1fa0: 24 72 64 20 21 3d 20 32 7d 20 7b 0a 09 20 20 20  $rd != 2} {..   
1fb0: 20 69 6e 63 72 20 62 0a 09 20 20 20 20 63 6f 6e   incr b..    con
1fc0: 74 69 6e 75 65 0a 09 7d 0a 0a 09 23 20 54 72 75  tinue..}...# Tru
1fd0: 6e 6b 20 72 65 76 69 73 69 6f 6e 2c 20 63 6f 6e  nk revision, con
1fe0: 6e 65 63 74 20 74 6f 2c 20 61 6e 64 20 75 70 64  nect to, and upd
1ff0: 61 74 65 20 74 68 65 20 68 65 61 64 2e 0a 09 24  ate the head...$
2000: 72 74 72 65 65 20 69 6e 73 65 72 74 20 24 74 72  rtree insert $tr
2010: 75 6e 6b 20 65 6e 64 20 24 63 0a 09 73 65 74 20  unk end $c..set 
2020: 74 72 75 6e 6b 20 24 63 0a 09 69 6e 63 72 20 6e  trunk $c..incr n
2030: 74 72 75 6e 6b 0a 20 20 20 20 7d 0a 0a 20 20 20  trunk.    }..   
2040: 20 77 72 69 74 65 20 30 20 63 76 73 20 22 50 72   write 0 cvs "Pr
2050: 6f 63 65 73 73 65 64 20 24 6e 74 72 75 6e 6b 20  ocessed $ntrunk 
2060: 74 72 75 6e 6b 20 20 5b 65 78 70 72 20 7b 28 24  trunk  [expr {($
2070: 6e 74 72 75 6e 6b 20 3d 3d 20 31 29 20 3f 20 22  ntrunk == 1) ? "
2080: 63 68 61 6e 67 65 73 65 74 22 20 3a 20 22 63 68  changeset" : "ch
2090: 61 6e 67 65 73 65 74 73 22 7d 5d 22 0a 20 20 20  angesets"}]".   
20a0: 20 77 72 69 74 65 20 30 20 63 76 73 20 22 49 67   write 0 cvs "Ig
20b0: 6e 6f 72 65 64 20 20 20 24 62 20 62 72 61 6e 63  nored   $b branc
20c0: 68 20 5b 65 78 70 72 20 7b 28 24 62 20 3d 3d 20  h [expr {($b == 
20d0: 31 29 20 3f 20 22 63 68 61 6e 67 65 73 65 74 22  1) ? "changeset"
20e0: 20 3a 20 22 63 68 61 6e 67 65 73 65 74 73 22 7d   : "changesets"}
20f0: 5d 22 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a  ]".    return.}.
2100: 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20  .namespace eval 
2110: 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 20 7b 0a  ::vc::cvs::ws {.
2120: 20 20 20 20 23 20 54 72 65 65 20 68 6f 6c 64 69      # Tree holdi
2130: 6e 67 20 74 72 75 6e 6b 20 61 6e 64 20 62 72 61  ng trunk and bra
2140: 6e 63 68 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  nch information 
2150: 28 73 74 72 75 63 74 3a 3a 74 72 65 65 29 2e 0a  (struct::tree)..
2160: 20 20 20 20 23 20 4e 6f 64 65 20 6e 61 6d 65 73      # Node names
2170: 20 61 72 65 20 63 73 65 74 20 69 64 27 73 2e 0a   are cset id's..
2180: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 72 74  .    variable rt
2190: 72 65 65 20 7b 7d 0a 20 20 20 20 76 61 72 69 61  ree {}.    varia
21a0: 62 6c 65 20 6e 74 72 75 6e 6b 20 30 0a 7d 0a 0a  ble ntrunk 0.}..
21b0: 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a  proc ::vc::cvs::
21c0: 77 73 3a 3a 77 6f 72 6b 73 70 61 63 65 20 7b 7d  ws::workspace {}
21d0: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20   {.    variable 
21e0: 63 77 64 20 5b 70 77 64 5d 0a 20 20 20 20 76 61  cwd [pwd].    va
21f0: 72 69 61 62 6c 65 20 77 6f 72 6b 73 70 61 63 65  riable workspace
2200: 20 5b 66 69 6c 65 75 74 69 6c 3a 3a 74 65 6d 70   [fileutil::temp
2210: 66 69 6c 65 20 69 6d 70 6f 72 74 46 5f 63 76 73  file importF_cvs
2220: 5f 77 73 5f 5d 0a 20 20 20 20 66 69 6c 65 20 64  _ws_].    file d
2230: 65 6c 65 74 65 20 24 77 6f 72 6b 73 70 61 63 65  elete $workspace
2240: 0a 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72 20  .    file mkdir 
2250: 20 24 77 6f 72 6b 73 70 61 63 65 0a 0a 20 20 20   $workspace..   
2260: 20 77 72 69 74 65 20 30 20 63 76 73 20 22 57 6f   write 0 cvs "Wo
2270: 72 6b 73 70 61 63 65 3a 20 20 24 77 6f 72 6b 73  rkspace:  $works
2280: 70 61 63 65 22 0a 0a 20 20 20 20 63 64 20 20 20  pace"..    cd   
2290: 20 20 24 77 6f 72 6b 73 70 61 63 65 20 3b 20 23    $workspace ; #
22a0: 20 43 68 65 63 6b 6f 75 74 73 20 67 6f 20 68 65   Checkouts go he
22b0: 72 65 2e 0a 20 20 20 20 72 65 74 75 72 6e 20 24  re..    return $
22c0: 77 6f 72 6b 73 70 61 63 65 0a 7d 0a 0a 70 72 6f  workspace.}..pro
22d0: 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a  c ::vc::cvs::ws:
22e0: 3a 77 73 73 65 74 75 70 20 7b 63 7d 20 7b 0a 20  :wssetup {c} {. 
22f0: 20 20 20 76 61 72 69 61 62 6c 65 20 63 73 65 74     variable cset
2300: 73 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 62  s.    variable b
2310: 61 73 65 0a 20 20 20 20 76 61 72 69 61 62 6c 65  ase.    variable
2320: 20 70 72 6f 6a 65 63 74 0a 0a 20 20 20 20 23 20   project..    # 
2330: 70 77 64 20 3d 20 77 6f 72 6b 73 70 61 63 65 0a  pwd = workspace.
2340: 0a 20 20 20 20 3a 3a 66 6f 72 65 61 63 68 20 7b  .    ::foreach {
2350: 75 20 63 6d 20 73 20 65 20 72 64 20 66 73 7d 20  u cm s e rd fs} 
2360: 24 63 73 65 74 73 28 24 63 29 20 62 72 65 61 6b  $csets($c) break
2370: 0a 0a 20 20 20 20 77 72 69 74 65 20 31 20 63 76  ..    write 1 cv
2380: 73 20 22 40 20 20 24 73 22 0a 0a 20 20 20 20 3a  s "@  $s"..    :
2390: 3a 66 6f 72 65 61 63 68 20 6c 20 5b 73 70 6c 69  :foreach l [spli
23a0: 74 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24  t [string trim $
23b0: 63 6d 5d 20 5c 6e 5d 20 7b 0a 09 77 72 69 74 65  cm] \n] {..write
23c0: 20 31 20 63 76 73 20 22 7c 20 20 24 6c 22 0a 20   1 cvs "|  $l". 
23d0: 20 20 20 7d 0a 0a 20 20 20 20 3a 3a 66 6f 72 65     }..    ::fore
23e0: 61 63 68 20 7b 66 20 6f 72 7d 20 24 66 73 20 7b  ach {f or} $fs {
23f0: 0a 09 3a 3a 66 6f 72 65 61 63 68 20 7b 6f 70 20  ..::foreach {op 
2400: 72 7d 20 24 6f 72 20 62 72 65 61 6b 0a 09 77 72  r} $or break..wr
2410: 69 74 65 20 32 20 63 76 73 20 22 24 6f 70 20 20  ite 2 cvs "$op  
2420: 24 66 20 24 72 22 0a 0a 09 69 66 20 7b 24 6f 70  $f $r"...if {$op
2430: 20 65 71 20 22 52 22 7d 20 7b 0a 09 20 20 20 20   eq "R"} {..    
2440: 23 20 52 65 6d 6f 76 65 20 66 69 6c 65 20 66 72  # Remove file fr
2450: 6f 6d 20 77 6f 72 6b 73 70 61 63 65 2e 20 50 72  om workspace. Pr
2460: 75 6e 65 20 65 6d 70 74 79 20 64 69 72 65 63 74  une empty direct
2470: 6f 72 69 65 73 2e 0a 09 20 20 20 20 23 0a 09 20  ories...    #.. 
2480: 20 20 20 23 20 4e 4f 54 45 3a 20 41 20 64 65 61     # NOTE: A dea
2490: 64 2d 66 69 72 73 74 20 66 69 6c 65 20 28 72 65  d-first file (re
24a0: 76 20 31 2e 31 20 64 65 61 64 29 20 77 69 6c 6c  v 1.1 dead) will
24b0: 20 6e 65 76 65 72 20 68 61 76 65 0a 09 20 20 20   never have..   
24c0: 20 23 20 65 78 69 73 74 65 64 2e 0a 09 20 20 20   # existed...   
24d0: 20 23 0a 09 20 20 20 20 23 20 4e 4f 54 45 3a 20   #..    # NOTE: 
24e0: 4c 6f 67 69 63 61 6c 6c 79 20 65 6d 70 74 79 20  Logically empty 
24f0: 64 69 72 65 63 74 6f 72 69 65 73 20 73 74 69 6c  directories stil
2500: 6c 20 70 68 79 73 69 63 61 6c 6c 79 0a 09 20 20  l physically..  
2510: 20 20 23 20 63 6f 6e 74 61 69 6e 20 74 68 65 20    # contain the 
2520: 43 56 53 20 61 64 6d 69 6e 20 64 69 72 65 63 74  CVS admin direct
2530: 6f 72 79 2c 20 68 65 6e 63 65 20 74 68 65 20 63  ory, hence the c
2540: 68 65 63 6b 20 66 6f 72 20 3d 3d 0a 09 20 20 20  heck for ==..   
2550: 20 23 20 31 2c 20 6e 6f 74 20 3d 3d 20 30 2e 20   # 1, not == 0. 
2560: 54 68 65 72 65 20 6d 69 67 68 74 20 61 6c 73 6f  There might also
2570: 20 62 65 20 68 69 64 64 65 6e 20 66 69 6c 65 73   be hidden files
2580: 2c 20 77 65 20 63 6f 75 6e 74 0a 09 20 20 20 20  , we count..    
2590: 23 20 74 68 65 6d 20 61 73 20 77 65 6c 6c 2e 20  # them as well. 
25a0: 41 6c 77 61 79 73 20 68 69 64 64 65 6e 20 61 72  Always hidden ar
25b0: 65 20 2e 20 61 6e 64 20 2e 2e 20 61 6e 64 20 74  e . and .. and t
25c0: 68 65 79 20 64 6f 20 6e 6f 74 0a 09 20 20 20 20  hey do not..    
25d0: 23 20 63 6f 75 6e 74 20 61 73 20 75 73 65 72 20  # count as user 
25e0: 66 69 6c 65 2e 0a 0a 09 20 20 20 20 66 69 6c 65  file....    file
25f0: 20 64 65 6c 65 74 65 20 24 66 0a 09 20 20 20 20   delete $f..    
2600: 73 65 74 20 66 64 20 5b 66 69 6c 65 20 64 69 72  set fd [file dir
2610: 6e 61 6d 65 20 24 66 5d 0a 09 20 20 20 20 69 66  name $f]..    if
2620: 20 7b 0a 09 09 28 5b 6c 6c 65 6e 67 74 68 20 5b   {...([llength [
2630: 67 6c 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e  glob -nocomplain
2640: 20 2d 64 69 72 65 63 74 6f 72 79 20 20 20 20 20   -directory     
2650: 20 20 20 20 20 20 20 20 20 24 66 64 20 2a 5d 5d           $fd *]]
2660: 20 3d 3d 20 31 29 20 26 26 0a 09 09 28 5b 6c 6c   == 1) &&...([ll
2670: 65 6e 67 74 68 20 5b 67 6c 6f 62 20 2d 6e 6f 63  ength [glob -noc
2680: 6f 6d 70 6c 61 69 6e 20 2d 64 69 72 65 63 74 6f  omplain -directo
2690: 72 79 20 2d 74 79 70 65 20 68 69 64 64 65 6e 20  ry -type hidden 
26a0: 24 66 64 20 2a 5d 5d 20 3d 3d 20 32 29 0a 09 20  $fd *]] == 2).. 
26b0: 20 20 20 7d 20 7b 0a 09 09 66 69 6c 65 20 64 65     } {...file de
26c0: 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 66 64 0a  lete -force $fd.
26d0: 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65 20 7b  .    }..} else {
26e0: 0a 09 20 20 20 20 23 20 41 64 64 65 64 20 6f 72  ..    # Added or
26f0: 20 6d 6f 64 69 66 69 65 64 2c 20 70 75 74 20 74   modified, put t
2700: 68 65 20 72 65 71 75 65 73 74 65 64 20 76 65 72  he requested ver
2710: 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65  sion of the file
2720: 0a 09 20 20 20 20 23 20 69 6e 74 6f 20 74 68 65  ..    # into the
2730: 20 77 6f 72 6b 73 70 61 63 65 2e 0a 0a 09 20 20   workspace....  
2740: 20 20 69 66 20 7b 24 70 72 6f 6a 65 63 74 20 6e    if {$project n
2750: 65 20 22 22 7d 20 7b 73 65 74 20 66 20 24 70 72  e ""} {set f $pr
2760: 6f 6a 65 63 74 2f 24 66 7d 0a 09 20 20 20 20 69  oject/$f}..    i
2770: 66 20 7b 5b 63 61 74 63 68 20 7b 0a 09 09 64 6f  f {[catch {...do
2780: 76 61 20 2d 64 20 24 62 61 73 65 20 63 6f 20 2d  va -d $base co -
2790: 72 20 24 72 20 24 66 0a 09 20 20 20 20 7d 20 6d  r $r $f..    } m
27a0: 73 67 5d 7d 20 7b 0a 09 09 69 66 20 7b 5b 73 74  sg]} {...if {[st
27b0: 72 69 6e 67 20 6d 61 74 63 68 20 7b 2a 69 6e 76  ring match {*inv
27c0: 61 6c 69 64 20 63 68 61 6e 67 65 20 74 65 78 74  alid change text
27d0: 2a 7d 20 24 6d 73 67 5d 7d 20 7b 0a 09 09 20 20  *} $msg]} {...  
27e0: 20 20 23 20 54 68 65 20 61 72 63 68 69 76 65 20    # The archive 
27f0: 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63  of the file is c
2800: 6f 72 72 75 70 74 65 64 20 61 6e 64 20 74 68 65  orrupted and the
2810: 0a 09 09 20 20 20 20 23 20 63 68 6f 73 65 6e 20  ...    # chosen 
2820: 76 65 72 73 69 6f 6e 20 6e 6f 74 20 61 63 63 65  version not acce
2830: 73 73 69 62 6c 65 20 64 75 65 20 74 6f 20 74 68  ssible due to th
2840: 61 74 2e 20 57 65 0a 09 09 20 20 20 20 23 20 72  at. We...    # r
2850: 65 70 6f 72 74 20 74 68 65 20 70 72 6f 62 6c 65  eport the proble
2860: 6d 2c 20 62 75 74 20 6f 74 68 65 72 77 69 73 65  m, but otherwise
2870: 20 69 67 6e 6f 72 65 20 69 74 2e 20 41 73 0a 09   ignore it. As..
2880: 09 20 20 20 20 23 20 61 20 63 6f 6e 73 65 71 75  .    # a consequ
2890: 65 6e 63 65 20 74 68 65 20 64 65 73 74 69 6e 61  ence the destina
28a0: 74 69 6f 6e 20 72 65 70 6f 73 69 74 6f 72 79 20  tion repository 
28b0: 77 69 6c 6c 20 6e 6f 74 0a 09 09 20 20 20 20 23  will not...    #
28c0: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 66 75 6c   contain the ful
28d0: 6c 20 68 69 73 74 6f 72 79 20 6f 66 20 74 68 65  l history of the
28e0: 20 6e 61 6d 65 64 20 66 69 6c 65 2e 20 42 79 0a   named file. By.
28f0: 09 09 20 20 20 20 23 20 69 67 6e 6f 72 69 6e 67  ..    # ignoring
2900: 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 77 65 20   the problem we 
2910: 68 6f 77 65 76 65 72 20 67 65 74 20 61 73 20 6d  however get as m
2920: 75 63 68 20 61 73 0a 09 09 20 20 20 20 23 20 69  uch as...    # i
2930: 73 20 70 6f 73 73 69 62 6c 65 2e 0a 0a 09 09 20  s possible..... 
2940: 20 20 20 77 72 69 74 65 20 30 20 63 76 73 20 22     write 0 cvs "
2950: 45 45 20 43 6f 72 72 75 70 74 65 64 20 61 72 63  EE Corrupted arc
2960: 68 69 76 65 20 66 69 6c 65 2e 20 49 6e 61 63 63  hive file. Inacc
2970: 65 73 73 69 62 6c 65 20 72 65 76 69 73 69 6f 6e  essible revision
2980: 2e 22 0a 09 09 20 20 20 20 63 6f 6e 74 69 6e 75  ."...    continu
2990: 65 0a 09 09 7d 0a 09 09 72 65 74 75 72 6e 20 2d  e...}...return -
29a0: 63 6f 64 65 20 65 72 72 6f 72 20 24 6d 73 67 0a  code error $msg.
29b0: 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a  .    }..}.    }.
29c0: 0a 20 20 20 20 23 20 50 72 6f 76 69 64 65 20 6d  .    # Provide m
29d0: 65 74 61 64 61 74 61 20 61 62 6f 75 74 20 74 68  etadata about th
29e0: 65 20 63 68 61 6e 67 65 73 65 74 20 74 68 65 20  e changeset the 
29f0: 62 61 63 6b 65 6e 64 20 6d 61 79 20 77 69 73 68  backend may wish
2a00: 20 74 6f 20 68 61 76 65 0a 20 20 20 20 72 65 74   to have.    ret
2a10: 75 72 6e 20 5b 6c 69 73 74 20 24 75 20 24 73 20  urn [list $u $s 
2a20: 24 63 6d 5d 0a 7d 0a 0a 6e 61 6d 65 73 70 61 63  $cm].}..namespac
2a30: 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a 63 76 73  e eval ::vc::cvs
2a40: 3a 3a 77 73 20 7b 0a 20 20 20 20 23 20 57 6f 72  ::ws {.    # Wor
2a50: 6b 73 70 61 63 65 20 77 68 65 72 65 20 63 68 65  kspace where che
2a60: 63 6b 6f 75 74 73 20 68 61 70 70 65 6e 0a 20 20  ckouts happen.  
2a70: 20 20 23 20 43 75 72 72 65 6e 74 20 77 6f 72 6b    # Current work
2a80: 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 74 6f  ing directory to
2a90: 20 67 6f 20 62 61 63 6b 20 74 6f 20 61 66 74 65   go back to afte
2aa0: 72 20 74 68 65 20 69 6d 70 6f 72 74 2e 0a 0a 20  r the import... 
2ab0: 20 20 20 76 61 72 69 61 62 6c 65 20 77 6f 72 6b     variable work
2ac0: 73 70 61 63 65 20 7b 7d 0a 20 20 20 20 76 61 72  space {}.    var
2ad0: 69 61 62 6c 65 20 63 77 64 20 20 20 20 20 20 20  iable cwd       
2ae0: 7b 7d 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a  {}.}..proc ::vc:
2af0: 3a 63 76 73 3a 3a 77 73 3a 3a 66 6f 72 65 61 63  :cvs::ws::foreac
2b00: 68 5f 63 73 65 74 20 7b 63 76 20 6e 6f 64 65 20  h_cset {cv node 
2b10: 73 63 72 69 70 74 7d 20 7b 0a 20 20 20 20 75 70  script} {.    up
2b20: 76 61 72 20 31 20 24 63 76 20 63 0a 20 20 20 20  var 1 $cv c.    
2b30: 76 61 72 69 61 62 6c 65 20 72 74 72 65 65 0a 0a  variable rtree..
2b40: 20 20 20 20 73 65 74 20 63 20 24 6e 6f 64 65 0a      set c $node.
2b50: 20 20 20 20 77 68 69 6c 65 20 7b 31 7d 20 7b 0a      while {1} {.
2b60: 09 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68  .set code [catch
2b70: 20 7b 75 70 6c 65 76 65 6c 20 31 20 24 73 63 72   {uplevel 1 $scr
2b80: 69 70 74 7d 20 72 65 73 5d 0a 0a 09 23 20 30 20  ipt} res]...# 0 
2b90: 2d 20 6f 6b 2c 20 31 20 2d 20 65 72 72 6f 72 2c  - ok, 1 - error,
2ba0: 20 32 20 2d 20 72 65 74 75 72 6e 2c 20 33 20 2d   2 - return, 3 -
2bb0: 20 62 72 65 61 6b 2c 20 34 20 2d 20 63 6f 6e 74   break, 4 - cont
2bc0: 69 6e 75 65 0a 09 73 77 69 74 63 68 20 2d 2d 20  inue..switch -- 
2bd0: 24 63 6f 64 65 20 7b 0a 09 20 20 20 20 30 20 7b  $code {..    0 {
2be0: 7d 0a 09 20 20 20 20 31 20 7b 20 72 65 74 75 72  }..    1 { retur
2bf0: 6e 20 2d 65 72 72 6f 72 63 6f 64 65 20 24 3a 3a  n -errorcode $::
2c00: 65 72 72 6f 72 43 6f 64 65 20 2d 65 72 72 6f 72  errorCode -error
2c10: 69 6e 66 6f 20 24 3a 3a 65 72 72 6f 72 49 6e 66  info $::errorInf
2c20: 6f 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 24 72  o -code error $r
2c30: 65 73 20 7d 0a 09 20 20 20 20 32 20 7b 7d 0a 09  es }..    2 {}..
2c40: 20 20 20 20 33 20 7b 20 72 65 74 75 72 6e 20 7d      3 { return }
2c50: 0a 09 20 20 20 20 34 20 7b 7d 0a 09 20 20 20 20  ..    4 {}..    
2c60: 64 65 66 61 75 6c 74 20 7b 0a 09 09 72 65 74 75  default {...retu
2c70: 72 6e 20 2d 63 6f 64 65 20 24 63 6f 64 65 20 24  rn -code $code $
2c80: 72 65 73 75 6c 74 0a 09 20 20 20 20 7d 0a 09 7d  result..    }..}
2c90: 0a 0a 09 23 20 53 74 6f 70 20 6f 6e 20 72 65 61  ...# Stop on rea
2ca0: 63 68 69 6e 67 20 74 68 65 20 68 65 61 64 2e 0a  ching the head..
2cb0: 09 69 66 20 7b 21 5b 6c 6c 65 6e 67 74 68 20 5b  .if {![llength [
2cc0: 24 72 74 72 65 65 20 63 68 69 6c 64 72 65 6e 20  $rtree children 
2cd0: 24 63 5d 5d 7d 20 62 72 65 61 6b 0a 0a 09 23 70  $c]]} break...#p
2ce0: 75 74 73 20 3c 5b 24 72 74 72 65 65 20 63 68 69  uts <[$rtree chi
2cf0: 6c 64 72 65 6e 20 24 63 5d 3e 0a 0a 09 23 20 47  ldren $c]>...# G
2d00: 6f 20 74 6f 20 6e 65 78 74 20 63 68 69 6c 64 20  o to next child 
2d10: 69 6e 20 74 72 75 6e 6b 20 28 6c 65 66 74 6d 6f  in trunk (leftmo
2d20: 73 74 29 2e 0a 09 73 65 74 20 63 20 5b 6c 69 6e  st)...set c [lin
2d30: 64 65 78 20 5b 24 72 74 72 65 65 20 63 68 69 6c  dex [$rtree chil
2d40: 64 72 65 6e 20 24 63 5d 20 30 5d 0a 20 20 20 20  dren $c] 0].    
2d50: 7d 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a  }.    return.}..
2d60: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  # --------------
2d70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2d90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2da0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2db0: 23 20 49 6e 74 65 72 6e 61 6c 20 68 65 6c 70 65  # Internal helpe
2dc0: 72 20 63 6f 6d 6d 61 6e 64 73 3a 20 43 68 61 6e  r commands: Chan
2dd0: 67 65 73 65 74 20 69 6e 73 70 65 63 74 69 6f 6e  geset inspection
2de0: 20 61 6e 64 20 63 6f 6e 73 74 72 75 63 74 69 6f   and constructio
2df0: 6e 2e 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63  n...proc ::vc::c
2e00: 76 73 3a 3a 77 73 3a 3a 43 53 43 6c 65 61 72 20  vs::ws::CSClear 
2e10: 7b 7d 20 7b 0a 20 20 20 20 75 70 76 61 72 20 31  {} {.    upvar 1
2e20: 20 73 74 61 72 74 20 73 74 61 72 74 20 65 6e 64   start start end
2e30: 20 65 6e 64 20 63 6d 20 63 6d 20 75 73 65 72 20   end cm cm user 
2e40: 75 73 65 72 20 66 69 6c 65 73 20 66 69 6c 65 73  user files files
2e50: 20 6c 61 73 74 64 20 6c 61 73 74 64 0a 0a 20 20   lastd lastd..  
2e60: 20 20 73 65 74 20 73 74 61 72 74 20 7b 7d 0a 20    set start {}. 
2e70: 20 20 20 73 65 74 20 65 6e 64 20 20 20 7b 7d 0a     set end   {}.
2e80: 20 20 20 20 73 65 74 20 63 6d 20 20 20 20 7b 7d      set cm    {}
2e90: 0a 20 20 20 20 73 65 74 20 75 73 65 72 20 20 7b  .    set user  {
2ea0: 7d 0a 20 20 20 20 73 65 74 20 6c 61 73 74 64 20  }.    set lastd 
2eb0: 7b 7d 0a 20 20 20 20 61 72 72 61 79 20 75 6e 73  {}.    array uns
2ec0: 65 74 20 66 69 6c 65 73 20 2a 0a 20 20 20 20 61  et files *.    a
2ed0: 72 72 61 79 20 73 65 74 20 66 69 6c 65 73 20 7b  rray set files {
2ee0: 7d 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 43 53 4e 6f 6e 65 20 7b 7d 20 7b 0a  ws::CSNone {} {.
2f10: 20 20 20 20 75 70 76 61 72 20 31 20 73 74 61 72      upvar 1 star
2f20: 74 20 73 74 61 72 74 0a 20 20 20 20 72 65 74 75  t start.    retu
2f30: 72 6e 20 5b 65 78 70 72 20 7b 24 73 74 61 72 74  rn [expr {$start
2f40: 20 65 71 20 22 22 7d 5d 0a 7d 0a 0a 70 72 6f 63   eq ""}].}..proc
2f50: 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a   ::vc::cvs::ws::
2f60: 43 53 4e 65 77 20 7b 65 6e 74 72 79 7d 20 7b 0a  CSNew {entry} {.
2f70: 20 20 20 20 75 70 76 61 72 20 31 20 73 74 61 72      upvar 1 star
2f80: 74 20 73 74 61 72 74 20 65 6e 64 20 65 6e 64 20  t start end end 
2f90: 63 6d 20 63 6d 20 75 73 65 72 20 75 73 65 72 20  cm cm user user 
2fa0: 66 69 6c 65 73 20 66 69 6c 65 73 20 6c 61 73 74  files files last
2fb0: 64 20 6c 61 73 74 64 20 72 65 61 73 6f 6e 20 72  d lastd reason r
2fc0: 65 61 73 6f 6e 0a 0a 20 20 20 20 23 70 75 74 73  eason..    #puts
2fd0: 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 73 74 64 6f   -nonewline stdo
2fe0: 75 74 20 2e 20 3b 20 66 6c 75 73 68 20 73 74 64  ut . ; flush std
2ff0: 6f 75 74 0a 0a 20 20 20 20 3a 3a 66 6f 72 65 61  out..    ::forea
3000: 63 68 20 7b 6f 70 20 74 73 20 61 20 72 65 76 20  ch {op ts a rev 
3010: 66 20 65 63 6d 7d 20 24 65 6e 74 72 79 20 62 72  f ecm} $entry br
3020: 65 61 6b 0a 0a 20 20 20 20 23 20 55 73 65 72 20  eak..    # User 
3030: 63 68 61 6e 67 65 0a 20 20 20 20 69 66 20 7b 24  change.    if {$
3040: 61 20 6e 65 20 24 75 73 65 72 7d 20 7b 73 65 74  a ne $user} {set
3050: 20 72 65 61 73 6f 6e 20 75 73 65 72 20 3b 20 72   reason user ; r
3060: 65 74 75 72 6e 20 31 7d 0a 0a 20 20 20 20 23 20  eturn 1}..    # 
3070: 46 69 6c 65 20 61 6c 72 65 61 64 79 20 69 6e 20  File already in 
3080: 63 75 72 72 65 6e 74 20 63 73 65 74 0a 20 20 20  current cset.   
3090: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
30a0: 73 20 66 69 6c 65 73 28 24 66 29 5d 7d 20 7b 73  s files($f)]} {s
30b0: 65 74 20 72 65 61 73 6f 6e 20 66 69 6c 65 20 3b  et reason file ;
30c0: 20 72 65 74 75 72 6e 20 31 7d 0a 0a 20 20 20 20   return 1}..    
30d0: 23 20 43 75 72 72 65 6e 74 20 63 73 65 74 20 74  # Current cset t
30e0: 72 75 6e 6b 2f 62 72 61 6e 63 68 20 64 69 66 66  runk/branch diff
30f0: 65 72 65 6e 74 20 66 72 6f 6d 20 65 6e 74 72 79  erent from entry
3100: 2e 0a 20 20 20 20 73 65 74 20 64 65 70 74 68 20  ..    set depth 
3110: 5b 6c 6c 65 6e 67 74 68 20 5b 73 70 6c 69 74 20  [llength [split 
3120: 24 72 65 76 20 2e 5d 5d 0a 20 20 20 20 69 66 20  $rev .]].    if 
3130: 7b 28 24 6c 61 73 74 64 20 3d 3d 20 32 29 20 21  {($lastd == 2) !
3140: 3d 20 28 24 64 65 70 74 68 20 3d 3d 20 32 29 7d  = ($depth == 2)}
3150: 20 7b 73 65 74 20 72 65 61 73 6f 6e 20 64 65 70   {set reason dep
3160: 74 68 2f 24 6c 61 73 74 64 2f 24 64 65 70 74 68  th/$lastd/$depth
3170: 2f 28 24 72 65 76 29 2f 24 66 20 3b 20 72 65 74  /($rev)/$f ; ret
3180: 75 72 6e 20 31 7d 0a 0a 20 20 20 20 23 20 43 6f  urn 1}..    # Co
3190: 6d 6d 69 74 20 6d 65 73 73 61 67 65 20 63 68 61  mmit message cha
31a0: 6e 67 65 64 0a 20 20 20 20 69 66 20 7b 24 63 6d  nged.    if {$cm
31b0: 20 6e 65 20 24 65 63 6d 7d 20 7b 73 65 74 20 72   ne $ecm} {set r
31c0: 65 61 73 6f 6e 20 63 6d 73 67 5c 20 3c 3c 24 65  eason cmsg\ <<$e
31d0: 63 6d 3e 3e 20 3b 20 72 65 74 75 72 6e 20 31 7d  cm>> ; return 1}
31e0: 0a 0a 20 20 20 20 23 20 45 76 65 72 79 74 68 69  ..    # Everythi
31f0: 6e 67 20 69 73 20 67 6f 6f 64 2c 20 73 74 69 6c  ng is good, stil
3200: 6c 20 74 68 65 20 73 61 6d 65 20 63 73 65 74 0a  l the same cset.
3210: 20 20 20 20 72 65 74 75 72 6e 20 30 0a 7d 0a 0a      return 0.}..
3220: 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a  proc ::vc::cvs::
3230: 77 73 3a 3a 43 53 53 61 76 65 20 7b 7d 20 7b 0a  ws::CSSave {} {.
3240: 20 20 20 20 76 61 72 69 61 62 6c 65 20 63 6d 61      variable cma
3250: 70 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 63  p.    variable c
3260: 73 65 74 73 0a 20 20 20 20 76 61 72 69 61 62 6c  sets.    variabl
3270: 65 20 6e 63 73 0a 20 20 20 20 75 70 76 61 72 20  e ncs.    upvar 
3280: 31 20 73 74 61 72 74 20 73 74 61 72 74 20 65 6e  1 start start en
3290: 64 20 65 6e 64 20 63 6d 20 63 6d 20 75 73 65 72  d end cm cm user
32a0: 20 75 73 65 72 20 66 69 6c 65 73 20 66 69 6c 65   user files file
32b0: 73 20 6c 61 73 74 64 20 6c 61 73 74 64 0a 0a 20  s lastd lastd.. 
32c0: 20 20 20 73 65 74 20 63 73 65 74 73 28 24 6e 63     set csets($nc
32d0: 73 29 20 5b 6c 69 73 74 20 24 75 73 65 72 20 24  s) [list $user $
32e0: 63 6d 20 24 73 74 61 72 74 20 24 65 6e 64 20 24  cm $start $end $
32f0: 6c 61 73 74 64 20 5b 61 72 72 61 79 20 67 65 74  lastd [array get
3300: 20 66 69 6c 65 73 5d 5d 0a 0a 20 20 20 20 23 20   files]]..    # 
3310: 52 65 63 6f 72 64 20 77 68 69 63 68 20 72 65 76  Record which rev
3320: 69 73 69 6f 6e 73 20 6f 66 20 61 20 66 69 6c 65  isions of a file
3330: 20 61 72 65 20 69 6e 20 77 68 61 74 20 63 73 65   are in what cse
3340: 74 73 0a 20 20 20 20 3a 3a 66 6f 72 65 61 63 68  ts.    ::foreach
3350: 20 7b 66 20 6f 72 7d 20 5b 61 72 72 61 79 20 67   {f or} [array g
3360: 65 74 20 66 69 6c 65 73 5d 20 7b 0a 09 3a 3a 66  et files] {..::f
3370: 6f 72 65 61 63 68 20 7b 5f 20 72 65 76 7d 20 24  oreach {_ rev} $
3380: 6f 72 20 62 72 65 61 6b 0a 09 73 65 74 20 63 6d  or break..set cm
3390: 61 70 28 5b 6c 69 73 74 20 24 66 20 24 72 65 76  ap([list $f $rev
33a0: 5d 29 20 24 6e 63 73 0a 20 20 20 20 7d 0a 0a 20  ]) $ncs.    }.. 
33b0: 20 20 20 23 43 53 44 75 6d 70 20 24 6e 63 73 0a     #CSDump $ncs.
33c0: 0a 20 20 20 20 69 6e 63 72 20 6e 63 73 0a 20 20  .    incr ncs.  
33d0: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63    return.}..proc
33e0: 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a   ::vc::cvs::ws::
33f0: 43 53 41 64 64 20 7b 65 6e 74 72 79 7d 20 7b 0a  CSAdd {entry} {.
3400: 20 20 20 20 75 70 76 61 72 20 31 20 73 74 61 72      upvar 1 star
3410: 74 20 73 74 61 72 74 20 65 6e 64 20 65 6e 64 20  t start end end 
3420: 63 6d 20 63 6d 20 75 73 65 72 20 75 73 65 72 20  cm cm user user 
3430: 66 69 6c 65 73 20 66 69 6c 65 73 20 6c 61 73 74  files files last
3440: 64 20 6c 61 73 74 64 0a 0a 20 20 20 20 3a 3a 66  d lastd..    ::f
3450: 6f 72 65 61 63 68 20 7b 6f 70 20 74 73 20 61 20  oreach {op ts a 
3460: 72 65 76 20 66 20 65 63 6d 7d 20 24 65 6e 74 72  rev f ecm} $entr
3470: 79 20 62 72 65 61 6b 0a 0a 20 20 20 20 69 66 20  y break..    if 
3480: 7b 24 73 74 61 72 74 20 65 71 20 22 22 7d 20 7b  {$start eq ""} {
3490: 73 65 74 20 73 74 61 72 74 20 24 74 73 7d 0a 20  set start $ts}. 
34a0: 20 20 20 73 65 74 20 65 6e 64 20 20 20 20 20 20     set end      
34b0: 20 24 74 73 0a 20 20 20 20 73 65 74 20 63 6d 20   $ts.    set cm 
34c0: 20 20 20 20 20 20 20 24 65 63 6d 0a 20 20 20 20         $ecm.    
34d0: 73 65 74 20 75 73 65 72 20 20 20 20 20 20 24 61  set user      $a
34e0: 0a 20 20 20 20 73 65 74 20 66 69 6c 65 73 28 24  .    set files($
34f0: 66 29 20 5b 6c 69 73 74 20 24 6f 70 20 24 72 65  f) [list $op $re
3500: 76 5d 0a 20 20 20 20 73 65 74 20 6c 61 73 74 64  v].    set lastd
3510: 20 20 20 20 20 5b 6c 6c 65 6e 67 74 68 20 5b 73       [llength [s
3520: 70 6c 69 74 20 24 72 65 76 20 2e 5d 5d 0a 20 20  plit $rev .]].  
3530: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63    return.}..proc
3540: 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a   ::vc::cvs::ws::
3550: 43 53 44 75 6d 70 20 7b 63 7d 20 7b 0a 20 20 20  CSDump {c} {.   
3560: 20 76 61 72 69 61 62 6c 65 20 63 73 65 74 73 0a   variable csets.
3570: 20 20 20 20 3a 3a 66 6f 72 65 61 63 68 20 7b 75      ::foreach {u
3580: 20 63 6d 20 73 20 65 20 72 64 20 66 7d 20 24 63   cm s e rd f} $c
3590: 73 65 74 73 28 24 63 29 20 62 72 65 61 6b 0a 0a  sets($c) break..
35a0: 20 20 20 20 70 75 74 73 20 22 24 75 20 24 73 22      puts "$u $s"
35b0: 3b 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 2e  ; regsub -all {.
35c0: 7d 20 24 75 20 7b 20 7d 20 62 0a 20 20 20 20 70  } $u { } b.    p
35d0: 75 74 73 20 22 24 62 20 24 65 22 0a 20 20 20 20  uts "$b $e".    
35e0: 3a 3a 66 6f 72 65 61 63 68 20 7b 66 20 6f 72 7d  ::foreach {f or}
35f0: 20 24 66 20 7b 0a 09 3a 3a 66 6f 72 65 61 63 68   $f {..::foreach
3600: 20 7b 6f 20 72 7d 20 24 6f 72 20 62 72 65 61 6b   {o r} $or break
3610: 0a 09 70 75 74 73 20 22 24 62 20 24 6f 20 24 66  ..puts "$b $o $f
3620: 20 24 72 22 0a 20 20 20 20 7d 0a 20 20 20 20 72   $r".    }.    r
3630: 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a  eturn.}..proc ::
3640: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 4e 53 49  vc::cvs::ws::NSI
3650: 50 4c 20 7b 6e 20 73 69 6e 67 75 6c 61 72 20 7b  PL {n singular {
3660: 70 6c 75 72 61 6c 20 7b 7d 7d 7d 20 7b 0a 20 20  plural {}}} {.  
3670: 20 20 72 65 74 75 72 6e 20 22 24 6e 20 5b 53 49    return "$n [SI
3680: 50 4c 20 24 6e 20 24 73 69 6e 67 75 6c 61 72 20  PL $n $singular 
3690: 24 70 6c 75 72 61 6c 5d 22 0a 7d 0a 70 72 6f 63  $plural]".}.proc
36a0: 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a   ::vc::cvs::ws::
36b0: 53 49 50 4c 20 7b 6e 20 73 69 6e 67 75 6c 61 72  SIPL {n singular
36c0: 20 7b 70 6c 75 72 61 6c 20 7b 7d 7d 7d 20 7b 0a   {plural {}}} {.
36d0: 20 20 20 20 69 66 20 7b 24 6e 20 3d 3d 20 31 7d      if {$n == 1}
36e0: 20 7b 72 65 74 75 72 6e 20 24 73 69 6e 67 75 6c   {return $singul
36f0: 61 72 7d 0a 20 20 20 20 69 66 20 7b 24 70 6c 75  ar}.    if {$plu
3700: 72 61 6c 20 65 71 20 22 22 7d 20 7b 73 65 74 20  ral eq ""} {set 
3710: 70 6c 75 72 61 6c 20 24 7b 73 69 6e 67 75 6c 61  plural ${singula
3720: 72 7d 73 7d 0a 20 20 20 20 72 65 74 75 72 6e 20  r}s}.    return 
3730: 24 70 6c 75 72 61 6c 0a 7d 0a 0a 23 20 2d 2d 2d  $plural.}..# ---
3740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3780: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 6e 61 6d 65  ----------..name
3790: 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a  space eval ::vc:
37a0: 3a 63 76 73 3a 3a 77 73 20 7b 0a 20 20 20 20 76  :cvs::ws {.    v
37b0: 61 72 69 61 62 6c 65 20 62 61 73 65 20 20 20 20  ariable base    
37c0: 7b 7d 20 3b 20 23 20 54 6f 70 6c 65 76 65 6c 20  {} ; # Toplevel 
37d0: 72 65 70 6f 73 69 74 6f 72 79 20 64 69 72 65 63  repository direc
37e0: 74 6f 72 79 0a 20 20 20 20 76 61 72 69 61 62 6c  tory.    variabl
37f0: 65 20 70 72 6f 6a 65 63 74 20 7b 7d 20 3b 20 23  e project {} ; #
3800: 20 53 75 62 20 64 69 72 65 63 74 6f 72 79 20 74   Sub directory t
3810: 6f 20 6c 69 6d 69 74 20 74 68 65 20 69 6d 70 6f  o limit the impo
3820: 72 74 20 74 6f 2e 0a 0a 20 20 20 20 6e 61 6d 65  rt to...    name
3830: 73 70 61 63 65 20 65 78 70 6f 72 74 20 63 6f 6e  space export con
3840: 66 69 67 75 72 65 20 62 65 67 69 6e 20 64 6f 6e  figure begin don
3850: 65 20 66 6f 72 65 61 63 68 20 6e 63 73 65 74 73  e foreach ncsets
3860: 20 63 68 65 63 6b 6f 75 74 0a 7d 0a 0a 23 20 2d   checkout.}..# -
3870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
38b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 52  ------------.# R
38c0: 65 61 64 79 0a 0a 70 61 63 6b 61 67 65 20 70 72  eady..package pr
38d0: 6f 76 69 64 65 20 76 63 3a 3a 63 76 73 3a 3a 77  ovide vc::cvs::w
38e0: 73 20 31 2e 30 0a 72 65 74 75 72 6e 0a           s 1.0.return.