Hex Artifact Content
Not logged in

Artifact 5740f60d1522cae1d5c6fb6789d5222942dca469:

File tools/lib/cvs.tcl part of check-in [d4aa7da67d] - Continuing namespace changes, rcs parser. Basic structure is now ok IMHO. by aku on 2007-09-13 06:24:31.

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 3b 20 23 20 54 63 6c 6c 69         ; # Tclli
0110: 62 20 28 74 72 61 76 65 72 73 65 20 64 69 72 65  b (traverse dire
0120: 63 74 6f 72 79 20 68 69 65 72 61 72 63 68 79 29  ctory hierarchy)
0130: 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65  .package require
0140: 20 76 63 3a 3a 72 63 73 3a 3a 70 61 72 73 65 72   vc::rcs::parser
0150: 20 3b 20 23 20 48 61 6e 64 6c 69 6e 67 20 74 68   ; # Handling th
0160: 65 20 52 43 53 20 61 72 63 68 69 76 65 20 66 69  e RCS archive fi
0170: 6c 65 73 2e 0a 70 61 63 6b 61 67 65 20 72 65 71  les..package req
0180: 75 69 72 65 20 76 63 3a 3a 74 6f 6f 6c 73 3a 3a  uire vc::tools::
0190: 6c 6f 67 20 20 3b 20 23 20 55 73 65 72 20 66 65  log  ; # User fe
01a0: 65 64 62 61 63 6b 0a 70 61 63 6b 61 67 65 20 72  edback.package r
01b0: 65 71 75 69 72 65 20 73 74 72 75 63 74 3a 3a 74  equire struct::t
01c0: 72 65 65 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65  ree..namespace e
01d0: 76 61 6c 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77  val ::vc::cvs::w
01e0: 73 20 7b 0a 20 20 20 20 76 63 3a 3a 74 6f 6f 6c  s {.    vc::tool
01f0: 73 3a 3a 6c 6f 67 3a 3a 73 79 73 74 65 6d 20 63  s::log::system c
0200: 76 73 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65  vs.    namespace
0210: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f   import ::vc::to
0220: 6f 6c 73 3a 3a 6c 6f 67 3a 3a 77 72 69 74 65 0a  ols::log::write.
0230: 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d      namespace im
0240: 70 6f 72 74 20 3a 3a 76 63 3a 3a 72 63 73 3a 3a  port ::vc::rcs::
0250: 70 61 72 73 65 72 3a 3a 70 72 6f 63 65 73 73 0a  parser::process.
0260: 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  }..# -----------
0270: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0280: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0290: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02b0: 2d 2d 0a 23 20 41 50 49 0a 0a 23 20 44 65 66 69  --.# API..# Defi
02c0: 6e 65 20 72 65 70 6f 73 69 74 6f 72 79 20 64 69  ne repository di
02d0: 72 65 63 74 6f 72 79 2e 0a 0a 70 72 6f 63 20 3a  rectory...proc :
02e0: 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 61 74  :vc::cvs::ws::at
02f0: 20 7b 70 61 74 68 7d 20 7b 0a 20 20 20 20 76 61   {path} {.    va
0300: 72 69 61 62 6c 65 20 62 61 73 65 20 5b 66 69 6c  riable base [fil
0310: 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 24 70 61 74  e normalize $pat
0320: 68 5d 0a 20 20 20 20 77 72 69 74 65 20 30 20 63  h].    write 0 c
0330: 76 73 20 22 42 61 73 65 3a 20 24 62 61 73 65 22  vs "Base: $base"
0340: 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 6e  .    return.}..n
0350: 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a  amespace eval ::
0360: 76 63 3a 3a 63 76 73 3a 3a 77 73 20 7b 0a 20 20  vc::cvs::ws {.  
0370: 20 20 23 20 54 6f 70 6c 65 76 65 6c 20 72 65 70    # Toplevel rep
0380: 6f 73 69 74 6f 72 79 20 64 69 72 65 63 74 6f 72  ository director
0390: 79 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 62  y.    variable b
03a0: 61 73 65 20 7b 7d 0a 7d 0a 0a 23 20 53 63 61 6e  ase {}.}..# Scan
03b0: 20 72 65 70 6f 73 69 74 6f 72 79 2c 20 63 6f 6c   repository, col
03c0: 6c 65 63 74 20 61 72 63 68 69 76 65 73 2c 20 70  lect archives, p
03d0: 61 72 73 65 20 74 68 65 6d 2c 20 61 6e 64 20 63  arse them, and c
03e0: 6f 6c 6c 65 63 74 20 72 65 76 69 73 69 6f 6e 0a  ollect revision.
03f0: 23 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 28 66  # information (f
0400: 69 6c 65 2c 20 72 65 76 69 73 69 6f 6e 20 2d 3e  ile, revision ->
0410: 20 64 61 74 65 2c 20 61 75 74 68 6f 72 2c 20 63   date, author, c
0420: 6f 6d 6d 69 74 20 6d 65 73 73 61 67 65 29 0a 0a  ommit message)..
0430: 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a  proc ::vc::cvs::
0440: 77 73 3a 3a 73 63 61 6e 20 7b 7d 20 7b 0a 20 20  ws::scan {} {.  
0450: 20 20 76 61 72 69 61 62 6c 65 20 62 61 73 65 0a    variable base.
0460: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 70 61      variable npa
0470: 74 68 73 0a 20 20 20 20 76 61 72 69 61 62 6c 65  ths.    variable
0480: 20 72 70 61 74 68 73 0a 20 20 20 20 76 61 72 69   rpaths.    vari
0490: 61 62 6c 65 20 74 69 6d 65 6c 69 6e 65 0a 0a 20  able timeline.. 
04a0: 20 20 20 77 72 69 74 65 20 30 20 63 76 73 20 7b     write 0 cvs {
04b0: 53 63 61 6e 6e 69 6e 67 20 64 69 72 65 63 74 6f  Scanning directo
04c0: 72 79 20 68 69 65 72 61 72 63 68 79 7d 0a 0a 20  ry hierarchy}.. 
04d0: 20 20 20 73 65 74 20 6e 20 30 0a 20 20 20 20 66     set n 0.    f
04e0: 6f 72 65 61 63 68 20 72 63 73 20 5b 66 69 6c 65  oreach rcs [file
04f0: 75 74 69 6c 3a 3a 66 69 6e 64 42 79 50 61 74 74  util::findByPatt
0500: 65 72 6e 20 24 62 61 73 65 20 2d 67 6c 6f 62 20  ern $base -glob 
0510: 2a 2c 76 5d 20 7b 0a 09 73 65 74 20 72 63 73 20  *,v] {..set rcs 
0520: 5b 66 69 6c 65 75 74 69 6c 3a 3a 73 74 72 69 70  [fileutil::strip
0530: 50 61 74 68 20 24 62 61 73 65 20 24 72 63 73 5d  Path $base $rcs]
0540: 0a 09 23 20 4e 6f 77 20 72 63 73 20 69 73 20 72  ..# Now rcs is r
0550: 65 6c 61 74 69 76 65 20 74 6f 20 62 61 73 65 0a  elative to base.
0560: 0a 09 77 72 69 74 65 20 31 20 63 76 73 20 22 41  ..write 1 cvs "A
0570: 72 63 68 69 76 65 20 24 72 63 73 22 0a 0a 09 69  rchive $rcs"...i
0580: 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68  f {[string match
0590: 20 43 56 53 52 4f 4f 54 2a 20 24 72 63 73 5d 7d   CVSROOT* $rcs]}
05a0: 20 7b 0a 09 20 20 20 20 77 72 69 74 65 20 32 20   {..    write 2 
05b0: 63 76 73 20 7b 49 67 6e 6f 72 65 64 2e 20 41 64  cvs {Ignored. Ad
05c0: 6d 69 6e 69 73 74 72 61 74 69 76 65 20 66 69 6c  ministrative fil
05d0: 65 7d 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75 65  e}..    continue
05e0: 0a 09 7d 0a 0a 09 23 20 44 65 72 69 76 65 20 74  ..}...# Derive t
05f0: 68 65 20 72 65 67 75 6c 61 72 20 70 61 74 68 20  he regular path 
0600: 66 72 6f 6d 20 74 68 65 20 72 63 73 20 70 61 74  from the rcs pat
0610: 68 2e 20 4d 65 61 6e 69 6e 67 3a 20 43 68 6f 70  h. Meaning: Chop
0620: 20 6f 66 0a 09 23 20 74 68 65 20 22 2c 76 22 20   of..# the ",v" 
0630: 73 75 66 66 69 78 2c 20 61 6e 64 20 72 65 6d 6f  suffix, and remo
0640: 76 65 20 61 20 70 6f 73 73 69 62 6c 65 20 22 41  ve a possible "A
0650: 74 74 69 63 22 2e 0a 09 73 65 74 20 66 20 5b 73  ttic"...set f [s
0660: 74 72 69 6e 67 20 72 61 6e 67 65 20 24 72 63 73  tring range $rcs
0670: 20 30 20 65 6e 64 2d 32 5d 0a 09 69 66 20 7b 22   0 end-2]..if {"
0680: 41 74 74 69 63 22 20 65 71 20 5b 6c 69 6e 64 65  Attic" eq [linde
0690: 78 20 5b 66 69 6c 65 20 73 70 6c 69 74 20 24 72  x [file split $r
06a0: 63 73 5d 20 65 6e 64 2d 31 5d 7d 20 7b 0a 09 20  cs] end-1]} {.. 
06b0: 20 20 20 73 65 74 20 66 20 5b 66 69 6c 65 20 6a     set f [file j
06c0: 6f 69 6e 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d  oin [file dirnam
06d0: 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  e [file dirname 
06e0: 24 66 5d 5d 20 5b 66 69 6c 65 20 74 61 69 6c 20  $f]] [file tail 
06f0: 24 66 5d 5d 0a 09 20 20 20 20 69 66 20 7b 5b 66  $f]]..    if {[f
0700: 69 6c 65 20 65 78 69 73 74 73 20 24 62 61 73 65  ile exists $base
0710: 2f 24 66 2c 76 5d 7d 20 7b 0a 09 09 23 20 57 65  /$f,v]} {...# We
0720: 20 68 61 76 65 20 61 20 72 65 67 75 6c 61 72 20   have a regular 
0730: 61 72 63 68 69 76 65 20 61 6e 64 20 61 6e 20 41  archive and an A
0740: 74 74 69 63 20 61 72 63 68 69 76 65 0a 09 09 23  ttic archive...#
0750: 20 72 65 66 65 72 69 6e 67 20 74 6f 20 74 68 65   refering to the
0760: 20 73 61 6d 65 20 75 73 65 72 20 76 69 73 69 62   same user visib
0770: 6c 65 20 66 69 6c 65 2e 20 49 67 6e 6f 72 65 20  le file. Ignore 
0780: 74 68 65 0a 09 09 23 20 66 69 6c 65 20 69 6e 20  the...# file in 
0790: 74 68 65 20 41 74 74 69 63 2e 0a 0a 09 09 77 72  the Attic.....wr
07a0: 69 74 65 20 32 20 63 76 73 20 22 49 67 6e 6f 72  ite 2 cvs "Ignor
07b0: 65 64 2e 20 41 74 74 69 63 20 73 75 70 65 72 63  ed. Attic superc
07c0: 65 64 65 64 20 62 79 20 72 65 67 75 6c 61 72 20  eded by regular 
07d0: 61 72 63 68 69 76 65 22 0a 0a 09 09 23 20 54 4f  archive"....# TO
07e0: 44 4f 2f 43 48 45 43 4b 2e 20 4d 79 20 6d 65 74  DO/CHECK. My met
07f0: 68 6f 64 20 6f 66 20 63 6f 27 69 6e 67 20 65 78  hod of co'ing ex
0800: 61 63 74 20 66 69 6c 65 20 72 65 76 69 73 69 6f  act file revisio
0810: 6e 73 0a 09 09 23 20 70 65 72 20 74 68 65 20 69  ns...# per the i
0820: 6e 66 6f 20 69 6e 20 74 68 65 20 63 6f 6c 6c 65  nfo in the colle
0830: 63 74 65 64 20 63 73 65 74 73 20 68 61 73 20 74  cted csets has t
0840: 68 65 20 66 6c 61 77 0a 09 09 23 20 74 68 61 74  he flaw...# that
0850: 20 49 20 6d 61 79 20 68 61 76 65 20 74 6f 20 6b   I may have to k
0860: 6e 6f 77 20 65 78 61 63 74 6c 79 20 77 68 65 6e  now exactly when
0870: 20 77 68 61 74 20 61 72 63 68 69 76 65 0a 09 09   what archive...
0880: 23 20 66 69 6c 65 20 74 6f 20 75 73 65 2c 20 73  # file to use, s
0890: 65 65 20 61 62 6f 76 65 2e 20 49 74 20 6d 69 67  ee above. It mig
08a0: 68 74 20 62 65 20 62 65 74 74 65 72 20 74 6f 20  ht be better to 
08b0: 75 73 65 0a 09 09 23 20 74 68 65 20 69 6e 66 6f  use...# the info
08c0: 20 6f 6e 6c 79 20 74 6f 20 67 61 74 68 65 72 20   only to gather 
08d0: 77 68 65 6e 20 63 73 65 74 73 20 62 65 67 69 6e  when csets begin
08e0: 20 61 6e 64 20 65 6e 64 2c 0a 09 09 23 20 61 6e   and end,...# an
08f0: 64 20 74 68 65 6e 20 74 6f 20 63 6f 20 63 6f 6d  d then to co com
0900: 70 6c 65 74 65 20 73 6c 69 63 65 73 20 70 65 72  plete slices per
0910: 20 65 78 61 63 74 20 74 69 6d 65 73 74 61 6d 70   exact timestamp
0920: 0a 09 09 23 20 28 2d 44 29 20 69 6e 73 74 65 61  ...# (-D) instea
0930: 64 20 6f 66 20 66 69 6c 65 20 72 65 76 69 73 69  d of file revisi
0940: 6f 6e 73 20 28 2d 72 29 2e 20 54 68 65 20 66 6c  ons (-r). The fl
0950: 61 77 20 69 6e 0a 09 09 23 20 74 68 61 74 20 69  aw in...# that i
0960: 73 20 74 68 61 74 20 63 73 65 74 73 20 63 61 6e  s that csets can
0970: 20 6f 63 63 75 72 20 69 6e 20 74 68 65 20 73 61   occur in the sa
0980: 6d 65 20 73 65 63 6f 6e 64 0a 09 09 23 20 28 74  me second...# (t
0990: 72 66 2c 20 6d 65 6d 63 68 61 6e 20 2d 20 63 68  rf, memchan - ch
09a0: 65 63 6b 20 66 6f 72 20 65 78 61 6d 70 6c 65 73  eck for examples
09b0: 29 2e 20 46 6f 72 20 74 68 61 74 20 65 78 61 63  ). For that exac
09c0: 74 0a 09 09 23 20 63 68 65 63 6b 6f 75 74 20 6d  t...# checkout m
09d0: 61 79 20 62 65 20 6e 65 65 64 65 64 20 74 6f 20  ay be needed to 
09e0: 72 65 63 72 65 61 74 65 20 65 78 61 63 74 20 73  recreate exact s
09f0: 65 71 75 65 6e 63 65 20 6f 66 0a 09 09 23 20 63  equence of...# c
0a00: 68 61 6e 67 65 73 2e 20 47 72 72 2e 20 53 69 78  hanges. Grr. Six
0a10: 20 6f 66 20 6f 6e 65 20 2e 2e 2e 0a 0a 09 09 63   of one .......c
0a20: 6f 6e 74 69 6e 75 65 0a 09 20 20 20 20 7d 0a 09  ontinue..    }..
0a30: 7d 0a 0a 09 23 20 47 65 74 20 74 68 65 20 6d 65  }...# Get the me
0a40: 74 61 20 64 61 74 61 20 77 65 20 6e 65 65 64 20  ta data we need 
0a50: 28 72 65 76 69 73 69 6f 6e 73 2c 20 74 69 6d 65  (revisions, time
0a60: 6c 69 6e 65 2c 20 6d 65 73 73 61 67 65 73 29 2e  line, messages).
0a70: 0a 09 73 65 74 20 6d 65 74 61 20 5b 70 72 6f 63  ..set meta [proc
0a80: 65 73 73 20 24 62 61 73 65 2f 24 72 63 73 5d 0a  ess $base/$rcs].
0a90: 0a 09 73 65 74 20 6e 70 61 74 68 73 28 24 72 63  ..set npaths($rc
0aa0: 73 29 20 24 66 0a 09 73 65 74 20 72 70 61 74 68  s) $f..set rpath
0ab0: 73 28 24 66 29 20 24 72 63 73 0a 0a 09 61 72 72  s($f) $rcs...arr
0ac0: 61 79 20 73 65 74 20 70 20 24 6d 65 74 61 0a 0a  ay set p $meta..
0ad0: 09 66 6f 72 65 61 63 68 20 7b 72 65 76 20 74 73  .foreach {rev ts
0ae0: 7d 20 24 70 28 64 61 74 65 29 20 7b 5f 20 61 7d  } $p(date) {_ a}
0af0: 20 24 70 28 61 75 74 68 6f 72 29 20 7b 5f 20 63   $p(author) {_ c
0b00: 6d 7d 20 24 70 28 63 6f 6d 6d 69 74 29 20 7b 5f  m} $p(commit) {_
0b10: 20 73 74 7d 20 24 70 28 73 74 61 74 65 29 20 7b   st} $p(state) {
0b20: 0a 09 20 20 20 20 73 65 74 20 6f 70 20 5b 65 78  ..    set op [ex
0b30: 70 72 20 7b 28 24 72 65 76 20 65 71 20 22 31 2e  pr {($rev eq "1.
0b40: 31 22 29 20 3f 20 22 41 22 20 3a 20 22 4d 22 7d  1") ? "A" : "M"}
0b50: 5d 0a 09 20 20 20 20 69 66 20 7b 24 73 74 20 65  ]..    if {$st e
0b60: 71 20 22 64 65 61 64 22 7d 20 7b 73 65 74 20 6f  q "dead"} {set o
0b70: 70 20 22 52 22 7d 0a 0a 09 20 20 20 20 23 20 41  p "R"}...    # A
0b80: 20 64 65 61 64 2d 66 69 72 73 74 20 72 65 76 69   dead-first revi
0b90: 73 69 6f 6e 20 69 73 20 72 65 76 20 31 2e 31 20  sion is rev 1.1 
0ba0: 77 69 74 68 20 6f 70 20 52 2e 20 46 6f 72 20 61  with op R. For a
0bb0: 6e 0a 09 20 20 20 20 23 20 65 78 61 6d 70 6c 65  n..    # example
0bc0: 20 73 65 65 20 74 68 65 20 66 69 6c 65 20 6d 65   see the file me
0bd0: 6d 63 68 61 6e 2f 44 45 50 45 4e 44 45 4e 43 49  mchan/DEPENDENCI
0be0: 45 53 2e 20 53 75 63 68 20 61 20 66 69 6c 65 0a  ES. Such a file.
0bf0: 09 20 20 20 20 23 20 73 65 65 6d 73 20 74 6f 20  .    # seems to 
0c00: 65 78 69 73 74 20 6f 6e 6c 79 21 20 6f 6e 20 69  exist only! on i
0c10: 74 73 20 62 72 61 6e 63 68 2e 20 54 68 65 20 62  ts branch. The b
0c20: 72 61 6e 63 68 65 73 0a 09 20 20 20 20 23 20 69  ranches..    # i
0c30: 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 73 65  nformation is se
0c40: 74 20 6f 6e 20 74 68 65 20 72 65 76 69 73 69 6f  t on the revisio
0c50: 6e 20 28 65 78 74 65 6e 64 20 72 63 73 70 61 72  n (extend rcspar
0c60: 73 65 72 21 29 2c 0a 09 20 20 20 20 23 20 73 79  ser!),..    # sy
0c70: 6d 62 6f 6c 73 20 68 61 73 20 61 20 74 61 67 2c  mbols has a tag,
0c80: 20 72 65 66 65 72 69 6e 67 20 74 6f 20 61 20 62   refering to a b
0c90: 72 61 6e 63 68 2c 20 70 6f 73 73 69 62 6c 79 20  ranch, possibly 
0ca0: 6d 61 67 69 63 2e 0a 0a 09 20 20 20 20 69 66 20  magic....    if 
0cb0: 7b 28 24 72 65 76 20 65 71 20 22 31 2e 31 22 29  {($rev eq "1.1")
0cc0: 20 26 26 20 28 24 6f 70 20 65 71 20 22 52 22 29   && ($op eq "R")
0cd0: 7d 20 7b 0a 09 09 77 72 69 74 65 20 32 20 63 76  } {...write 2 cv
0ce0: 73 20 7b 44 65 61 64 20 72 6f 6f 74 20 72 65 76  s {Dead root rev
0cf0: 69 73 69 6f 6e 7d 0a 09 20 20 20 20 7d 0a 0a 09  ision}..    }...
0d00: 20 20 20 20 6c 61 70 70 65 6e 64 20 74 69 6d 65      lappend time
0d10: 6c 69 6e 65 28 24 74 73 29 20 5b 6c 69 73 74 20  line($ts) [list 
0d20: 24 6f 70 20 24 74 73 20 24 61 20 24 72 65 76 20  $op $ts $a $rev 
0d30: 24 66 20 24 63 6d 5d 0a 09 7d 0a 0a 09 23 75 6e  $f $cm]..}...#un
0d40: 73 65 74 20 70 28 63 6f 6d 6d 69 74 29 0a 09 23  set p(commit)..#
0d50: 70 61 72 72 61 79 20 70 0a 0a 09 69 6e 63 72 20  parray p...incr 
0d60: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 72 69  n.    }..    wri
0d70: 74 65 20 30 20 63 76 73 20 22 50 72 6f 63 65 73  te 0 cvs "Proces
0d80: 73 65 64 20 24 6e 20 5b 65 78 70 72 20 7b 28 24  sed $n [expr {($
0d90: 6e 20 3d 3d 20 31 29 20 3f 20 22 66 69 6c 65 22  n == 1) ? "file"
0da0: 20 3a 20 22 66 69 6c 65 73 22 7d 5d 22 0a 20 20   : "files"}]".  
0db0: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 6e 61 6d 65    return.}..name
0dc0: 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a  space eval ::vc:
0dd0: 3a 63 76 73 3a 3a 77 73 20 7b 0a 20 20 20 20 23  :cvs::ws {.    #
0de0: 20 50 61 74 68 20 6d 61 70 70 69 6e 67 73 2e 20   Path mappings. 
0df0: 6e 70 61 74 68 73 3a 20 72 63 73 20 66 69 6c 65  npaths: rcs file
0e00: 20 20 2d 3e 20 75 73 65 72 20 66 69 6c 65 0a 20    -> user file. 
0e10: 20 20 20 23 20 20 20 20 20 20 20 20 20 20 20 20     #            
0e20: 20 20 20 20 72 70 61 74 68 73 3a 20 75 73 65 72      rpaths: user
0e30: 20 66 69 6c 65 20 2d 3e 20 72 63 73 20 66 69 6c   file -> rcs fil
0e40: 65 2c 20 64 65 61 64 2d 73 74 61 74 75 73 0a 0a  e, dead-status..
0e50: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 70 61      variable npa
0e60: 74 68 73 20 20 20 3b 20 61 72 72 61 79 20 73 65  ths   ; array se
0e70: 74 20 6e 70 61 74 68 73 20 20 20 7b 7d 0a 20 20  t npaths   {}.  
0e80: 20 20 76 61 72 69 61 62 6c 65 20 72 70 61 74 68    variable rpath
0e90: 73 20 20 20 3b 20 61 72 72 61 79 20 73 65 74 20  s   ; array set 
0ea0: 72 70 61 74 68 73 20 20 20 7b 7d 0a 0a 20 20 20  rpaths   {}..   
0eb0: 20 23 20 54 69 6d 65 6c 69 6e 65 3a 20 74 73 74   # Timeline: tst
0ec0: 61 6d 70 20 2d 3e 20 28 6f 70 2c 20 74 73 74 61  amp -> (op, tsta
0ed0: 6d 70 2c 20 61 75 74 68 6f 72 2c 20 72 65 76 69  mp, author, revi
0ee0: 73 69 6f 6e 2c 20 66 69 6c 65 2c 20 63 6f 6d 6d  sion, file, comm
0ef0: 69 74 20 6d 65 73 73 61 67 65 29 0a 0a 20 20 20  it message)..   
0f00: 20 76 61 72 69 61 62 6c 65 20 74 69 6d 65 6c 69   variable timeli
0f10: 6e 65 20 3b 20 61 72 72 61 79 20 73 65 74 20 74  ne ; array set t
0f20: 69 6d 65 6c 69 6e 65 20 7b 7d 0a 7d 0a 0a 23 20  imeline {}.}..# 
0f30: 47 72 6f 75 70 20 73 69 6e 67 6c 65 20 63 68 61  Group single cha
0f40: 6e 67 65 73 20 69 6e 74 6f 20 63 68 61 6e 67 65  nges into change
0f50: 73 65 74 73 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a  sets..proc ::vc:
0f60: 3a 63 76 73 3a 3a 77 73 3a 3a 63 73 65 74 73 20  :cvs::ws::csets 
0f70: 7b 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c  {} {.    variabl
0f80: 65 20 74 69 6d 65 6c 69 6e 65 0a 20 20 20 20 76  e timeline.    v
0f90: 61 72 69 61 62 6c 65 20 63 73 65 74 73 0a 20 20  ariable csets.  
0fa0: 20 20 76 61 72 69 61 62 6c 65 20 6e 63 73 0a 20    variable ncs. 
0fb0: 20 20 20 76 61 72 69 61 62 6c 65 20 63 6d 61 70     variable cmap
0fc0: 0a 0a 20 20 20 20 61 72 72 61 79 20 75 6e 73 65  ..    array unse
0fd0: 74 20 63 73 65 74 73 20 2a 20 3b 20 61 72 72 61  t csets * ; arra
0fe0: 79 20 73 65 74 20 63 73 65 74 73 20 7b 7d 0a 20  y set csets {}. 
0ff0: 20 20 20 61 72 72 61 79 20 75 6e 73 65 74 20 63     array unset c
1000: 6d 61 70 20 20 2a 20 3b 20 61 72 72 61 79 20 73  map  * ; array s
1010: 65 74 20 63 6d 61 70 20 20 7b 7d 0a 20 20 20 20  et cmap  {}.    
1020: 73 65 74 20 6e 63 73 20 30 0a 0a 20 20 20 20 77  set ncs 0..    w
1030: 72 69 74 65 20 30 20 63 76 73 20 22 50 72 6f 63  rite 0 cvs "Proc
1040: 65 73 73 69 6e 67 20 74 69 6d 65 6c 69 6e 65 22  essing timeline"
1050: 0a 0a 20 20 20 20 73 65 74 20 6e 20 30 0a 20 20  ..    set n 0.  
1060: 20 20 43 53 43 6c 65 61 72 0a 20 20 20 20 66 6f    CSClear.    fo
1070: 72 65 61 63 68 20 74 73 20 5b 6c 73 6f 72 74 20  reach ts [lsort 
1080: 2d 64 69 63 74 20 5b 61 72 72 61 79 20 6e 61 6d  -dict [array nam
1090: 65 73 20 74 69 6d 65 6c 69 6e 65 5d 5d 20 7b 0a  es timeline]] {.
10a0: 0a 09 23 20 6f 70 20 74 73 74 61 6d 70 20 61 75  ..# op tstamp au
10b0: 74 68 6f 72 20 72 65 76 69 73 69 6f 6e 20 66 69  thor revision fi
10c0: 6c 65 20 63 6f 6d 6d 69 74 0a 09 23 20 30 20 20  le commit..# 0  
10d0: 31 20 20 20 20 20 20 32 20 20 20 20 20 20 33 20  1      2      3 
10e0: 20 20 20 20 20 20 20 34 20 20 20 20 35 2f 65 6e         4    5/en
10f0: 64 0a 09 23 20 62 20 20 20 20 20 20 20 20 20 63  d..# b         c
1100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1110: 20 20 20 20 61 0a 0a 09 73 65 74 20 65 6e 74 72      a...set entr
1120: 69 65 73 20 5b 6c 73 6f 72 74 20 2d 69 6e 64 65  ies [lsort -inde
1130: 78 20 32 20 5b 6c 73 6f 72 74 20 2d 69 6e 64 65  x 2 [lsort -inde
1140: 78 20 30 20 5b 6c 73 6f 72 74 20 2d 69 6e 64 65  x 0 [lsort -inde
1150: 78 20 65 6e 64 20 24 74 69 6d 65 6c 69 6e 65 28  x end $timeline(
1160: 24 74 73 29 5d 5d 5d 0a 09 23 70 75 74 73 20 5b  $ts)]]]..#puts [
1170: 6a 6f 69 6e 20 24 65 6e 74 72 69 65 73 20 5c 6e  join $entries \n
1180: 5d 0a 0a 09 66 6f 72 65 61 63 68 20 65 6e 74 72  ]...foreach entr
1190: 79 20 20 24 65 6e 74 72 69 65 73 20 7b 0a 09 20  y  $entries {.. 
11a0: 20 20 20 69 66 20 7b 21 5b 43 53 4e 6f 6e 65 5d     if {![CSNone]
11b0: 20 26 26 20 5b 43 53 4e 65 77 20 24 65 6e 74 72   && [CSNew $entr
11c0: 79 5d 7d 20 7b 0a 09 09 43 53 53 61 76 65 0a 09  y]} {...CSSave..
11d0: 09 43 53 43 6c 65 61 72 0a 09 09 23 70 75 74 73  .CSClear...#puts
11e0: 20 3d 3d 5c 6e 24 72 65 61 73 6f 6e 0a 09 20 20   ==\n$reason..  
11f0: 20 20 7d 0a 09 20 20 20 20 43 53 41 64 64 20 24    }..    CSAdd $
1200: 65 6e 74 72 79 0a 09 20 20 20 20 69 6e 63 72 20  entry..    incr 
1210: 6e 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n..}.    }..    
1220: 77 72 69 74 65 20 30 20 63 76 73 20 22 50 72 6f  write 0 cvs "Pro
1230: 63 65 73 73 65 64 20 24 6e 20 5b 65 78 70 72 20  cessed $n [expr 
1240: 7b 28 24 6e 20 3d 3d 20 31 29 20 3f 20 22 65 6e  {($n == 1) ? "en
1250: 74 72 79 22 20 3a 20 22 65 6e 74 72 69 65 73 22  try" : "entries"
1260: 7d 5d 22 0a 0a 20 20 20 20 73 65 74 20 6e 20 5b  }]"..    set n [
1270: 61 72 72 61 79 20 73 69 7a 65 20 63 73 65 74 73  array size csets
1280: 5d 0a 20 20 20 20 77 72 69 74 65 20 30 20 63 76  ].    write 0 cv
1290: 73 20 22 46 6f 75 6e 64 20 20 20 20 20 24 6e 20  s "Found     $n 
12a0: 5b 65 78 70 72 20 7b 28 24 6e 20 3d 3d 20 31 29  [expr {($n == 1)
12b0: 20 3f 20 22 63 68 61 6e 67 65 73 65 74 22 20 3a   ? "changeset" :
12c0: 20 22 63 68 61 6e 67 65 73 65 74 73 22 7d 5d 22   "changesets"}]"
12d0: 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 0a  .    return.}...
12e0: 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a  namespace eval :
12f0: 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 20 7b 0a 20  :vc::cvs::ws {. 
1300: 20 20 20 23 20 43 68 61 6e 67 65 73 65 74 20 64     # Changeset d
1310: 61 74 61 3a 0a 20 20 20 20 23 20 6e 63 73 3a 20  ata:.    # ncs: 
1320: 20 20 43 6f 75 6e 74 65 72 2d 62 61 73 65 64 20    Counter-based 
1330: 69 64 20 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20  id generation.  
1340: 20 20 23 20 63 73 65 74 73 3a 20 69 64 20 2d 3e    # csets: id ->
1350: 20 28 75 73 65 72 20 63 6f 6d 6d 69 74 20 73 74   (user commit st
1360: 61 72 74 20 65 6e 64 20 64 65 70 74 68 20 28 66  art end depth (f
1370: 69 6c 65 20 2d 3e 20 28 6f 70 20 72 65 76 29 29  ile -> (op rev))
1380: 29 0a 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20  )..    variable 
1390: 6e 63 73 20 20 20 20 20 20 3b 20 73 65 74 20 20  ncs      ; set  
13a0: 20 20 20 20 20 6e 63 73 20 20 20 30 20 20 3b 20       ncs   0  ; 
13b0: 23 20 43 6f 75 6e 74 65 72 20 66 6f 72 20 63 68  # Counter for ch
13c0: 61 6e 67 65 73 65 74 73 0a 20 20 20 20 76 61 72  angesets.    var
13d0: 69 61 62 6c 65 20 63 73 65 74 73 20 20 20 20 3b  iable csets    ;
13e0: 20 61 72 72 61 79 20 73 65 74 20 63 73 65 74 73   array set csets
13f0: 20 7b 7d 20 3b 20 23 20 43 68 61 6e 67 65 73 65   {} ; # Changese
1400: 74 20 64 61 74 61 0a 7d 0a 0a 23 20 42 75 69 6c  t data.}..# Buil
1410: 64 69 6e 67 20 74 68 65 20 72 65 76 69 73 69 6f  ding the revisio
1420: 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65 20  n tree from the 
1430: 63 68 61 6e 67 65 73 65 74 73 2e 0a 23 20 4c 69  changesets..# Li
1440: 6d 69 74 61 74 69 6f 6e 3a 20 43 75 72 72 65 6e  mitation: Curren
1450: 74 6c 79 20 6f 6e 6c 79 20 74 72 75 6e 6b 20 63  tly only trunk c
1460: 73 65 74 73 20 69 73 20 68 61 6e 64 6c 65 64 2e  sets is handled.
1470: 0a 23 20 4c 69 6d 69 74 61 74 69 6f 6e 3a 20 44  .# Limitation: D
1480: 65 61 64 20 66 69 6c 65 73 20 61 72 65 20 6e 6f  ead files are no
1490: 74 20 72 65 6d 6f 76 65 64 2c 20 69 2e 65 2e 20  t removed, i.e. 
14a0: 6e 6f 20 27 52 27 20 61 63 74 69 6f 6e 73 20 72  no 'R' actions r
14b0: 69 67 68 74 20 6e 6f 77 2e 0a 0a 70 72 6f 63 20  ight now...proc 
14c0: 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 72  ::vc::cvs::ws::r
14d0: 74 72 65 65 20 7b 7d 20 7b 0a 20 20 20 20 76 61  tree {} {.    va
14e0: 72 69 61 62 6c 65 20 63 73 65 74 73 0a 20 20 20  riable csets.   
14f0: 20 76 61 72 69 61 62 6c 65 20 72 74 72 65 65 20   variable rtree 
1500: 7b 7d 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20  {}.    variable 
1510: 6e 74 72 75 6e 6b 20 30 0a 0a 20 20 20 20 77 72  ntrunk 0..    wr
1520: 69 74 65 20 30 20 63 76 73 20 22 45 78 74 72 61  ite 0 cvs "Extra
1530: 63 74 69 6e 67 20 74 68 65 20 74 72 75 6e 6b 22  cting the trunk"
1540: 0a 0a 20 20 20 20 73 65 74 20 72 74 72 65 65 20  ..    set rtree 
1550: 5b 73 74 72 75 63 74 3a 3a 74 72 65 65 20 3a 3a  [struct::tree ::
1560: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 52 54 5d  vc::cvs::ws::RT]
1570: 0a 20 20 20 20 24 72 74 72 65 65 20 72 65 6e 61  .    $rtree rena
1580: 6d 65 20 72 6f 6f 74 20 30 20 3b 20 23 20 52 6f  me root 0 ; # Ro
1590: 6f 74 20 69 73 20 66 69 72 73 74 20 63 68 61 6e  ot is first chan
15a0: 67 65 73 65 74 2c 20 61 6c 77 61 79 73 2e 0a 20  geset, always.. 
15b0: 20 20 20 73 65 74 20 74 72 75 6e 6b 20 30 0a 20     set trunk 0. 
15c0: 20 20 20 73 65 74 20 6e 74 72 75 6e 6b 20 31 20     set ntrunk 1 
15d0: 3b 20 23 20 52 6f 6f 74 20 69 73 20 6f 6e 20 74  ; # Root is on t
15e0: 68 65 20 74 72 75 6e 6b 2e 0a 20 20 20 20 73 65  he trunk..    se
15f0: 74 20 62 20 20 20 20 20 20 30 20 3b 20 23 20 4e  t b      0 ; # N
1600: 6f 20 62 72 61 6e 63 68 20 63 73 65 74 73 20 66  o branch csets f
1610: 6f 75 6e 64 20 79 65 74 2e 0a 0a 20 20 20 20 23  ound yet...    #
1620: 20 45 78 74 72 61 63 74 69 6e 67 20 74 68 65 20   Extracting the 
1630: 74 72 75 6e 6b 20 69 73 20 65 61 73 79 2c 20 73  trunk is easy, s
1640: 69 6d 70 6c 79 20 62 79 20 6c 6f 6f 6b 69 6e 67  imply by looking
1650: 20 61 74 20 74 68 65 20 69 6e 76 6f 6c 76 65 64   at the involved
1660: 0a 20 20 20 20 23 20 76 65 72 73 69 6f 6e 20 6e  .    # version n
1670: 75 6d 62 65 72 73 2e 20 0a 0a 20 20 20 20 66 6f  umbers. ..    fo
1680: 72 65 61 63 68 20 63 20 5b 6c 72 61 6e 67 65 20  reach c [lrange 
1690: 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65 72 20  [lsort -integer 
16a0: 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 63 73 65  [array names cse
16b0: 74 73 5d 5d 20 31 20 65 6e 64 5d 20 7b 0a 09 66  ts]] 1 end] {..f
16c0: 6f 72 65 61 63 68 20 7b 75 20 63 6d 20 73 20 65  oreach {u cm s e
16d0: 20 72 64 20 66 7d 20 24 63 73 65 74 73 28 24 63   rd f} $csets($c
16e0: 29 20 62 72 65 61 6b 0a 0a 09 23 20 49 67 6e 6f  ) break...# Igno
16f0: 72 65 20 62 72 61 6e 63 68 20 63 68 61 6e 67 65  re branch change
1700: 73 2c 20 6a 75 73 74 20 63 6f 75 6e 74 20 74 68  s, just count th
1710: 65 6d 20 66 6f 72 20 74 68 65 20 73 74 61 74 69  em for the stati
1720: 73 74 69 63 73 2e 0a 09 69 66 20 7b 24 72 64 20  stics...if {$rd 
1730: 21 3d 20 32 7d 20 7b 0a 09 20 20 20 20 69 6e 63  != 2} {..    inc
1740: 72 20 62 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75  r b..    continu
1750: 65 0a 09 7d 0a 0a 09 23 20 54 72 75 6e 6b 20 72  e..}...# Trunk r
1760: 65 76 69 73 69 6f 6e 2c 20 63 6f 6e 6e 65 63 74  evision, connect
1770: 20 74 6f 2c 20 61 6e 64 20 75 70 64 61 74 65 20   to, and update 
1780: 74 68 65 20 68 65 61 64 2e 0a 09 24 72 74 72 65  the head...$rtre
1790: 65 20 69 6e 73 65 72 74 20 24 74 72 75 6e 6b 20  e insert $trunk 
17a0: 65 6e 64 20 24 63 0a 09 73 65 74 20 74 72 75 6e  end $c..set trun
17b0: 6b 20 24 63 0a 09 69 6e 63 72 20 6e 74 72 75 6e  k $c..incr ntrun
17c0: 6b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 72 69  k.    }..    wri
17d0: 74 65 20 30 20 63 76 73 20 22 50 72 6f 63 65 73  te 0 cvs "Proces
17e0: 73 65 64 20 24 6e 74 72 75 6e 6b 20 74 72 75 6e  sed $ntrunk trun
17f0: 6b 20 20 5b 65 78 70 72 20 7b 28 24 6e 74 72 75  k  [expr {($ntru
1800: 6e 6b 20 3d 3d 20 31 29 20 3f 20 22 63 68 61 6e  nk == 1) ? "chan
1810: 67 65 73 65 74 22 20 3a 20 22 63 68 61 6e 67 65  geset" : "change
1820: 73 65 74 73 22 7d 5d 22 0a 20 20 20 20 77 72 69  sets"}]".    wri
1830: 74 65 20 30 20 63 76 73 20 22 49 67 6e 6f 72 65  te 0 cvs "Ignore
1840: 64 20 20 20 24 62 20 62 72 61 6e 63 68 20 5b 65  d   $b branch [e
1850: 78 70 72 20 7b 28 24 62 20 3d 3d 20 31 29 20 3f  xpr {($b == 1) ?
1860: 20 22 63 68 61 6e 67 65 73 65 74 22 20 3a 20 22   "changeset" : "
1870: 63 68 61 6e 67 65 73 65 74 73 22 7d 5d 22 0a 20  changesets"}]". 
1880: 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 6e 61 6d     return.}..nam
1890: 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 76 63  espace eval ::vc
18a0: 3a 3a 63 76 73 3a 3a 77 73 20 7b 0a 20 20 20 20  ::cvs::ws {.    
18b0: 23 20 54 72 65 65 20 68 6f 6c 64 69 6e 67 20 74  # Tree holding t
18c0: 72 75 6e 6b 20 61 6e 64 20 62 72 61 6e 63 68 20  runk and branch 
18d0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 28 73 74 72  information (str
18e0: 75 63 74 3a 3a 74 72 65 65 29 2e 0a 20 20 20 20  uct::tree)..    
18f0: 23 20 4e 6f 64 65 20 6e 61 6d 65 73 20 61 72 65  # Node names are
1900: 20 63 73 65 74 20 69 64 27 73 2e 0a 0a 20 20 20   cset id's...   
1910: 20 76 61 72 69 61 62 6c 65 20 72 74 72 65 65 20   variable rtree 
1920: 7b 7d 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20  {}.    variable 
1930: 6e 74 72 75 6e 6b 20 30 0a 7d 0a 0a 70 72 6f 63  ntrunk 0.}..proc
1940: 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a   ::vc::cvs::ws::
1950: 77 6f 72 6b 73 70 61 63 65 20 7b 7d 20 7b 0a 20  workspace {} {. 
1960: 20 20 20 76 61 72 69 61 62 6c 65 20 63 77 64 20     variable cwd 
1970: 5b 70 77 64 5d 0a 20 20 20 20 76 61 72 69 61 62  [pwd].    variab
1980: 6c 65 20 77 6f 72 6b 73 70 61 63 65 20 5b 66 69  le workspace [fi
1990: 6c 65 75 74 69 6c 3a 3a 74 65 6d 70 66 69 6c 65  leutil::tempfile
19a0: 20 69 6d 70 6f 72 74 46 5f 63 76 73 5f 77 73 5f   importF_cvs_ws_
19b0: 5d 0a 20 20 20 20 66 69 6c 65 20 64 65 6c 65 74  ].    file delet
19c0: 65 20 24 77 6f 72 6b 73 70 61 63 65 0a 20 20 20  e $workspace.   
19d0: 20 66 69 6c 65 20 6d 6b 64 69 72 20 20 24 77 6f   file mkdir  $wo
19e0: 72 6b 73 70 61 63 65 0a 0a 20 20 20 20 77 72 69  rkspace..    wri
19f0: 74 65 20 30 20 63 76 73 20 22 57 6f 72 6b 73 70  te 0 cvs "Worksp
1a00: 61 63 65 3a 20 20 24 77 6f 72 6b 73 70 61 63 65  ace:  $workspace
1a10: 22 0a 0a 20 20 20 20 63 64 20 20 20 20 20 24 77  "..    cd     $w
1a20: 6f 72 6b 73 70 61 63 65 20 3b 20 23 20 43 68 65  orkspace ; # Che
1a30: 63 6b 6f 75 74 73 20 67 6f 20 68 65 72 65 2e 0a  ckouts go here..
1a40: 20 20 20 20 72 65 74 75 72 6e 20 24 77 6f 72 6b      return $work
1a50: 73 70 61 63 65 0a 7d 0a 0a 70 72 6f 63 20 3a 3a  space.}..proc ::
1a60: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 77 73 69  vc::cvs::ws::wsi
1a70: 67 6e 6f 72 65 20 7b 70 61 74 68 7d 20 7b 0a 20  gnore {path} {. 
1a80: 20 20 20 23 20 49 67 6e 6f 72 65 20 43 56 53 20     # Ignore CVS 
1a90: 61 64 6d 69 6e 20 66 69 6c 65 73 2e 0a 20 20 20  admin files..   
1aa0: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74   if {[string mat
1ab0: 63 68 20 2a 2f 43 56 53 2f 2a 20 24 70 61 74 68  ch */CVS/* $path
1ac0: 5d 7d 20 7b 72 65 74 75 72 6e 20 31 7d 0a 20 20  ]} {return 1}.  
1ad0: 20 20 72 65 74 75 72 6e 20 30 0a 7d 0a 0a 70 72    return 0.}..pr
1ae0: 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73  oc ::vc::cvs::ws
1af0: 3a 3a 77 73 63 6c 65 61 72 20 7b 7d 20 7b 0a 20  ::wsclear {} {. 
1b00: 20 20 20 76 61 72 69 61 62 6c 65 20 63 77 64 0a     variable cwd.
1b10: 20 20 20 20 76 61 72 69 61 62 6c 65 20 77 6f 72      variable wor
1b20: 6b 73 70 61 63 65 0a 20 20 20 20 63 64 20 24 63  kspace.    cd $c
1b30: 77 64 0a 20 20 20 20 66 69 6c 65 20 64 65 6c 65  wd.    file dele
1b40: 74 65 20 2d 66 6f 72 63 65 20 24 77 6f 72 6b 73  te -force $works
1b50: 70 61 63 65 0a 20 20 20 20 72 65 74 75 72 6e 0a  pace.    return.
1b60: 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76  }..proc ::vc::cv
1b70: 73 3a 3a 77 73 3a 3a 77 73 73 65 74 75 70 20 7b  s::ws::wssetup {
1b80: 63 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c  c} {.    variabl
1b90: 65 20 63 73 65 74 73 0a 20 20 20 20 76 61 72 69  e csets.    vari
1ba0: 61 62 6c 65 20 63 76 73 0a 20 20 20 20 76 61 72  able cvs.    var
1bb0: 69 61 62 6c 65 20 62 61 73 65 0a 0a 20 20 20 20  iable base..    
1bc0: 23 20 70 77 64 20 3d 20 77 6f 72 6b 73 70 61 63  # pwd = workspac
1bd0: 65 0a 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b  e..    foreach {
1be0: 75 20 63 6d 20 73 20 65 20 72 64 20 66 73 7d 20  u cm s e rd fs} 
1bf0: 24 63 73 65 74 73 28 24 63 29 20 62 72 65 61 6b  $csets($c) break
1c00: 0a 0a 20 20 20 20 77 72 69 74 65 20 31 20 63 76  ..    write 1 cv
1c10: 73 20 22 40 20 20 24 73 22 0a 0a 20 20 20 20 66  s "@  $s"..    f
1c20: 6f 72 65 61 63 68 20 6c 20 5b 73 70 6c 69 74 20  oreach l [split 
1c30: 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 63 6d  [string trim $cm
1c40: 5d 20 5c 6e 5d 20 7b 0a 09 77 72 69 74 65 20 31  ] \n] {..write 1
1c50: 20 63 76 73 20 22 7c 20 20 24 6c 22 0a 20 20 20   cvs "|  $l".   
1c60: 20 7d 0a 0a 20 20 20 20 66 6f 72 65 61 63 68 20   }..    foreach 
1c70: 7b 66 20 6f 72 7d 20 24 66 73 20 7b 0a 09 66 6f  {f or} $fs {..fo
1c80: 72 65 61 63 68 20 7b 6f 70 20 72 7d 20 24 6f 72  reach {op r} $or
1c90: 20 62 72 65 61 6b 0a 09 77 72 69 74 65 20 32 20   break..write 2 
1ca0: 63 76 73 20 22 24 6f 70 20 20 24 66 20 24 72 22  cvs "$op  $f $r"
1cb0: 0a 0a 09 69 66 20 7b 24 6f 70 20 65 71 20 22 52  ...if {$op eq "R
1cc0: 22 7d 20 7b 0a 09 20 20 20 20 23 20 52 65 6d 6f  "} {..    # Remo
1cd0: 76 65 20 66 69 6c 65 20 66 72 6f 6d 20 77 6f 72  ve file from wor
1ce0: 6b 73 70 61 63 65 2e 20 50 72 75 6e 65 20 65 6d  kspace. Prune em
1cf0: 70 74 79 20 64 69 72 65 63 74 6f 72 69 65 73 2e  pty directories.
1d00: 0a 09 20 20 20 20 23 0a 09 20 20 20 20 23 20 4e  ..    #..    # N
1d10: 4f 54 45 3a 20 41 20 64 65 61 64 2d 66 69 72 73  OTE: A dead-firs
1d20: 74 20 66 69 6c 65 20 28 72 65 76 20 31 2e 31 20  t file (rev 1.1 
1d30: 64 65 61 64 29 20 77 69 6c 6c 20 6e 65 76 65 72  dead) will never
1d40: 20 68 61 76 65 0a 09 20 20 20 20 23 20 65 78 69   have..    # exi
1d50: 73 74 65 64 2e 0a 09 20 20 20 20 23 0a 09 20 20  sted...    #..  
1d60: 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 67 69 63 61    # NOTE: Logica
1d70: 6c 6c 79 20 65 6d 70 74 79 20 64 69 72 65 63 74  lly empty direct
1d80: 6f 72 69 65 73 20 73 74 69 6c 6c 20 70 68 79 73  ories still phys
1d90: 69 63 61 6c 6c 79 0a 09 20 20 20 20 23 20 63 6f  ically..    # co
1da0: 6e 74 61 69 6e 20 74 68 65 20 43 56 53 20 61 64  ntain the CVS ad
1db0: 6d 69 6e 20 64 69 72 65 63 74 6f 72 79 2c 20 68  min directory, h
1dc0: 65 6e 63 65 20 74 68 65 20 63 68 65 63 6b 20 66  ence the check f
1dd0: 6f 72 20 3d 3d 0a 09 20 20 20 20 23 20 31 2c 20  or ==..    # 1, 
1de0: 6e 6f 74 20 3d 3d 20 30 2e 20 54 68 65 72 65 20  not == 0. There 
1df0: 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 68 69  might also be hi
1e00: 64 64 65 6e 20 66 69 6c 65 73 2c 20 77 65 20 63  dden files, we c
1e10: 6f 75 6e 74 0a 09 20 20 20 20 23 20 74 68 65 6d  ount..    # them
1e20: 20 61 73 20 77 65 6c 6c 2e 20 41 6c 77 61 79 73   as well. Always
1e30: 20 68 69 64 64 65 6e 20 61 72 65 20 2e 20 61 6e   hidden are . an
1e40: 64 20 2e 2e 20 61 6e 64 20 74 68 65 79 20 64 6f  d .. and they do
1e50: 20 6e 6f 74 0a 09 20 20 20 20 23 20 63 6f 75 6e   not..    # coun
1e60: 74 20 61 73 20 75 73 65 72 20 66 69 6c 65 2e 0a  t as user file..
1e70: 0a 09 20 20 20 20 66 69 6c 65 20 64 65 6c 65 74  ..    file delet
1e80: 65 20 24 66 0a 09 20 20 20 20 73 65 74 20 66 64  e $f..    set fd
1e90: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24   [file dirname $
1ea0: 66 5d 0a 09 20 20 20 20 69 66 20 7b 0a 09 09 28  f]..    if {...(
1eb0: 5b 6c 6c 65 6e 67 74 68 20 5b 67 6c 6f 62 20 2d  [llength [glob -
1ec0: 6e 6f 63 6f 6d 70 6c 61 69 6e 20 2d 64 69 72 65  nocomplain -dire
1ed0: 63 74 6f 72 79 20 20 20 20 20 20 20 20 20 20 20  ctory           
1ee0: 20 20 20 24 66 64 20 2a 5d 5d 20 3d 3d 20 31 29     $fd *]] == 1)
1ef0: 20 26 26 0a 09 09 28 5b 6c 6c 65 6e 67 74 68 20   &&...([llength 
1f00: 5b 67 6c 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61 69  [glob -nocomplai
1f10: 6e 20 2d 64 69 72 65 63 74 6f 72 79 20 2d 74 79  n -directory -ty
1f20: 70 65 20 68 69 64 64 65 6e 20 24 66 64 20 2a 5d  pe hidden $fd *]
1f30: 5d 20 3d 3d 20 32 29 0a 09 20 20 20 20 7d 20 7b  ] == 2)..    } {
1f40: 0a 09 09 66 69 6c 65 20 64 65 6c 65 74 65 20 2d  ...file delete -
1f50: 66 6f 72 63 65 20 24 66 64 0a 09 20 20 20 20 7d  force $fd..    }
1f60: 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20  ..} else {..    
1f70: 23 20 41 64 64 65 64 20 6f 72 20 6d 6f 64 69 66  # Added or modif
1f80: 69 65 64 2c 20 70 75 74 20 74 68 65 20 72 65 71  ied, put the req
1f90: 75 65 73 74 65 64 20 76 65 72 73 69 6f 6e 20 6f  uested version o
1fa0: 66 20 74 68 65 20 66 69 6c 65 0a 09 20 20 20 20  f the file..    
1fb0: 23 20 69 6e 74 6f 20 74 68 65 20 77 6f 72 6b 73  # into the works
1fc0: 70 61 63 65 2e 0a 0a 09 20 20 20 20 69 66 20 7b  pace....    if {
1fd0: 5b 63 61 74 63 68 20 7b 0a 09 09 65 78 65 63 20  [catch {...exec 
1fe0: 24 63 76 73 20 2d 64 20 24 62 61 73 65 20 63 6f  $cvs -d $base co
1ff0: 20 2d 72 20 24 72 20 24 66 0a 09 20 20 20 20 7d   -r $r $f..    }
2000: 20 6d 73 67 5d 7d 20 7b 0a 09 09 69 66 20 7b 5b   msg]} {...if {[
2010: 73 74 72 69 6e 67 20 6d 61 74 63 68 20 7b 2a 69  string match {*i
2020: 6e 76 61 6c 69 64 20 63 68 61 6e 67 65 20 74 65  nvalid change te
2030: 78 74 2a 7d 20 24 6d 73 67 5d 7d 20 7b 0a 09 09  xt*} $msg]} {...
2040: 20 20 20 20 23 20 54 68 65 20 61 72 63 68 69 76      # The archiv
2050: 65 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 73  e of the file is
2060: 20 63 6f 72 72 75 70 74 65 64 20 61 6e 64 20 74   corrupted and t
2070: 68 65 0a 09 09 20 20 20 20 23 20 63 68 6f 73 65  he...    # chose
2080: 6e 20 76 65 72 73 69 6f 6e 20 6e 6f 74 20 61 63  n version not ac
2090: 63 65 73 73 69 62 6c 65 20 64 75 65 20 74 6f 20  cessible due to 
20a0: 74 68 61 74 2e 20 57 65 0a 09 09 20 20 20 20 23  that. We...    #
20b0: 20 72 65 70 6f 72 74 20 74 68 65 20 70 72 6f 62   report the prob
20c0: 6c 65 6d 2c 20 62 75 74 20 6f 74 68 65 72 77 69  lem, but otherwi
20d0: 73 65 20 69 67 6e 6f 72 65 20 69 74 2e 20 41 73  se ignore it. As
20e0: 0a 09 09 20 20 20 20 23 20 61 20 63 6f 6e 73 65  ...    # a conse
20f0: 71 75 65 6e 63 65 20 74 68 65 20 66 6f 73 73 69  quence the fossi
2100: 6c 20 72 65 70 6f 73 69 74 6f 72 79 20 77 69 6c  l repository wil
2110: 6c 20 6e 6f 74 0a 09 09 20 20 20 20 23 20 63 6f  l not...    # co
2120: 6e 74 61 69 6e 20 74 68 65 20 66 75 6c 6c 20 68  ntain the full h
2130: 69 73 74 6f 72 79 20 6f 66 20 74 68 65 20 6e 61  istory of the na
2140: 6d 65 64 20 66 69 6c 65 2e 20 42 79 0a 09 09 20  med file. By... 
2150: 20 20 20 23 20 69 67 6e 6f 72 69 6e 67 20 74 68     # ignoring th
2160: 65 20 70 72 6f 62 6c 65 6d 20 77 65 20 68 6f 77  e problem we how
2170: 65 76 65 72 20 67 65 74 20 61 73 20 6d 75 63 68  ever get as much
2180: 20 61 73 0a 09 09 20 20 20 20 23 20 69 73 20 70   as...    # is p
2190: 6f 73 73 69 62 6c 65 2e 0a 0a 09 09 20 20 20 20  ossible.....    
21a0: 77 72 69 74 65 20 30 20 63 76 73 20 22 45 45 20  write 0 cvs "EE 
21b0: 43 6f 72 72 75 70 74 65 64 20 61 72 63 68 69 76  Corrupted archiv
21c0: 65 20 66 69 6c 65 2e 20 49 6e 61 63 63 65 73 73  e file. Inaccess
21d0: 69 62 6c 65 20 72 65 76 69 73 69 6f 6e 2e 22 0a  ible revision.".
21e0: 09 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a 09  ..    continue..
21f0: 09 7d 0a 09 09 72 65 74 75 72 6e 20 2d 63 6f 64  .}...return -cod
2200: 65 20 65 72 72 6f 72 20 24 6d 73 67 0a 09 20 20  e error $msg..  
2210: 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20    }..}.    }..  
2220: 20 20 23 20 50 72 6f 76 69 64 65 20 6d 65 74 61    # Provide meta
2230: 64 61 74 61 20 61 62 6f 75 74 20 74 68 65 20 63  data about the c
2240: 68 61 6e 67 65 73 65 74 20 74 68 65 20 62 61 63  hangeset the bac
2250: 6b 65 6e 64 20 6d 61 79 20 77 69 73 68 20 74 6f  kend may wish to
2260: 20 68 61 76 65 0a 20 20 20 20 72 65 74 75 72 6e   have.    return
2270: 20 5b 6c 69 73 74 20 24 75 20 24 63 6d 20 24 73   [list $u $cm $s
2280: 5d 0a 7d 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65  ].}..namespace e
2290: 76 61 6c 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77  val ::vc::cvs::w
22a0: 73 20 7b 0a 20 20 20 20 23 20 43 56 53 20 61 70  s {.    # CVS ap
22b0: 70 6c 69 63 61 74 69 6f 6e 0a 20 20 20 20 23 20  plication.    # 
22c0: 57 6f 72 6b 73 70 61 63 65 20 77 68 65 72 65 20  Workspace where 
22d0: 63 68 65 63 6b 6f 75 74 73 20 68 61 70 70 65 6e  checkouts happen
22e0: 0a 20 20 20 20 23 20 43 75 72 72 65 6e 74 20 77  .    # Current w
22f0: 6f 72 6b 69 6e 67 20 64 69 72 65 63 74 6f 72 79  orking directory
2300: 20 74 6f 20 67 6f 20 62 61 63 6b 20 74 6f 20 61   to go back to a
2310: 66 74 65 72 20 74 68 65 20 69 6d 70 6f 72 74 2e  fter the import.
2320: 0a 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 63  ..    variable c
2330: 76 73 20 20 20 20 20 20 20 5b 61 75 74 6f 5f 65  vs       [auto_e
2340: 78 65 63 6f 6b 20 63 76 73 5d 0a 20 20 20 20 76  xecok cvs].    v
2350: 61 72 69 61 62 6c 65 20 77 6f 72 6b 73 70 61 63  ariable workspac
2360: 65 20 7b 7d 0a 20 20 20 20 76 61 72 69 61 62 6c  e {}.    variabl
2370: 65 20 63 77 64 20 20 20 20 20 20 20 7b 7d 0a 7d  e cwd       {}.}
2380: 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73  ..proc ::vc::cvs
2390: 3a 3a 77 73 3a 3a 66 6f 72 65 61 63 68 5f 63 73  ::ws::foreach_cs
23a0: 65 74 20 7b 63 76 20 6e 6f 64 65 20 73 63 72 69  et {cv node scri
23b0: 70 74 7d 20 7b 0a 20 20 20 20 75 70 76 61 72 20  pt} {.    upvar 
23c0: 31 20 24 63 76 20 63 0a 20 20 20 20 76 61 72 69  1 $cv c.    vari
23d0: 61 62 6c 65 20 72 74 72 65 65 0a 0a 20 20 20 20  able rtree..    
23e0: 73 65 74 20 63 20 24 6e 6f 64 65 0a 20 20 20 20  set c $node.    
23f0: 77 68 69 6c 65 20 7b 31 7d 20 7b 0a 09 73 65 74  while {1} {..set
2400: 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 75 70   code [catch {up
2410: 6c 65 76 65 6c 20 31 20 24 73 63 72 69 70 74 7d  level 1 $script}
2420: 20 72 65 73 5d 0a 0a 09 23 20 30 20 2d 20 6f 6b   res]...# 0 - ok
2430: 2c 20 31 20 2d 20 65 72 72 6f 72 2c 20 32 20 2d  , 1 - error, 2 -
2440: 20 72 65 74 75 72 6e 2c 20 33 20 2d 20 62 72 65   return, 3 - bre
2450: 61 6b 2c 20 34 20 2d 20 63 6f 6e 74 69 6e 75 65  ak, 4 - continue
2460: 0a 09 73 77 69 74 63 68 20 2d 2d 20 24 63 6f 64  ..switch -- $cod
2470: 65 20 7b 0a 09 20 20 20 20 30 20 7b 7d 0a 09 20  e {..    0 {}.. 
2480: 20 20 20 31 20 7b 20 72 65 74 75 72 6e 20 2d 65     1 { return -e
2490: 72 72 6f 72 63 6f 64 65 20 24 3a 3a 65 72 72 6f  rrorcode $::erro
24a0: 72 43 6f 64 65 20 2d 65 72 72 6f 72 69 6e 66 6f  rCode -errorinfo
24b0: 20 24 3a 3a 65 72 72 6f 72 49 6e 66 6f 20 2d 63   $::errorInfo -c
24c0: 6f 64 65 20 65 72 72 6f 72 20 24 72 65 73 20 7d  ode error $res }
24d0: 0a 09 20 20 20 20 32 20 7b 7d 0a 09 20 20 20 20  ..    2 {}..    
24e0: 33 20 7b 20 72 65 74 75 72 6e 20 7d 0a 09 20 20  3 { return }..  
24f0: 20 20 34 20 7b 7d 0a 09 20 20 20 20 64 65 66 61    4 {}..    defa
2500: 75 6c 74 20 7b 0a 09 09 72 65 74 75 72 6e 20 2d  ult {...return -
2510: 63 6f 64 65 20 24 63 6f 64 65 20 24 72 65 73 75  code $code $resu
2520: 6c 74 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 23  lt..    }..}...#
2530: 20 53 74 6f 70 20 6f 6e 20 72 65 61 63 68 69 6e   Stop on reachin
2540: 67 20 74 68 65 20 68 65 61 64 2e 0a 09 69 66 20  g the head...if 
2550: 7b 21 5b 6c 6c 65 6e 67 74 68 20 5b 24 72 74 72  {![llength [$rtr
2560: 65 65 20 63 68 69 6c 64 72 65 6e 20 24 63 5d 5d  ee children $c]]
2570: 7d 20 62 72 65 61 6b 0a 0a 09 23 70 75 74 73 20  } break...#puts 
2580: 3c 5b 24 72 74 72 65 65 20 63 68 69 6c 64 72 65  <[$rtree childre
2590: 6e 20 24 63 5d 3e 0a 0a 09 23 20 47 6f 20 74 6f  n $c]>...# Go to
25a0: 20 6e 65 78 74 20 63 68 69 6c 64 20 69 6e 20 74   next child in t
25b0: 72 75 6e 6b 20 28 6c 65 66 74 6d 6f 73 74 29 2e  runk (leftmost).
25c0: 0a 09 73 65 74 20 63 20 5b 6c 69 6e 64 65 78 20  ..set c [lindex 
25d0: 5b 24 72 74 72 65 65 20 63 68 69 6c 64 72 65 6e  [$rtree children
25e0: 20 24 63 5d 20 30 5d 0a 20 20 20 20 7d 0a 20 20   $c] 0].    }.  
25f0: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63    return.}..proc
2600: 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a   ::vc::cvs::ws::
2610: 72 6f 6f 74 20 7b 7d 20 7b 0a 20 20 20 20 72 65  root {} {.    re
2620: 74 75 72 6e 20 30 0a 7d 0a 0a 70 72 6f 63 20 3a  turn 0.}..proc :
2630: 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 6e 74  :vc::cvs::ws::nt
2640: 72 75 6e 6b 20 7b 7d 20 7b 0a 20 20 20 20 76 61  runk {} {.    va
2650: 72 69 61 62 6c 65 20 6e 74 72 75 6e 6b 0a 20 20  riable ntrunk.  
2660: 20 20 72 65 74 75 72 6e 20 20 24 6e 74 72 75 6e    return  $ntrun
2670: 6b 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a  k.}..proc ::vc::
2680: 63 76 73 3a 3a 77 73 3a 3a 6e 63 73 65 74 73 20  cvs::ws::ncsets 
2690: 7b 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c  {} {.    variabl
26a0: 65 20 6e 63 73 0a 20 20 20 20 72 65 74 75 72 6e  e ncs.    return
26b0: 20 20 24 6e 63 73 0a 7d 0a 0a 70 72 6f 63 20 3a    $ncs.}..proc :
26c0: 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 75 75  :vc::cvs::ws::uu
26d0: 69 64 20 7b 63 20 75 75 69 64 7d 20 7b 0a 20 20  id {c uuid} {.  
26e0: 20 20 76 61 72 69 61 62 6c 65 20 72 74 72 65 65    variable rtree
26f0: 0a 20 20 20 20 24 72 74 72 65 65 20 73 65 74 20  .    $rtree set 
2700: 24 63 20 75 75 69 64 20 24 75 75 69 64 0a 20 20  $c uuid $uuid.  
2710: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 23 20 2d 2d    return.}..# --
2720: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2730: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2740: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2750: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
2760: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49 6e  -----------.# In
2770: 74 65 72 6e 61 6c 20 68 65 6c 70 65 72 20 63 6f  ternal helper co
2780: 6d 6d 61 6e 64 73 3a 20 43 68 61 6e 67 65 73 65  mmands: Changese
2790: 74 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64  t inspection and
27a0: 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 0a   construction...
27b0: 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a  proc ::vc::cvs::
27c0: 77 73 3a 3a 43 53 43 6c 65 61 72 20 7b 7d 20 7b  ws::CSClear {} {
27d0: 0a 20 20 20 20 75 70 76 61 72 20 31 20 73 74 61  .    upvar 1 sta
27e0: 72 74 20 73 74 61 72 74 20 65 6e 64 20 65 6e 64  rt start end end
27f0: 20 63 6d 20 63 6d 20 75 73 65 72 20 75 73 65 72   cm cm user user
2800: 20 66 69 6c 65 73 20 66 69 6c 65 73 20 6c 61 73   files files las
2810: 74 64 20 6c 61 73 74 64 0a 0a 20 20 20 20 73 65  td lastd..    se
2820: 74 20 73 74 61 72 74 20 7b 7d 0a 20 20 20 20 73  t start {}.    s
2830: 65 74 20 65 6e 64 20 20 20 7b 7d 0a 20 20 20 20  et end   {}.    
2840: 73 65 74 20 63 6d 20 20 20 20 7b 7d 0a 20 20 20  set cm    {}.   
2850: 20 73 65 74 20 75 73 65 72 20 20 7b 7d 0a 20 20   set user  {}.  
2860: 20 20 73 65 74 20 6c 61 73 74 64 20 7b 7d 0a 20    set lastd {}. 
2870: 20 20 20 61 72 72 61 79 20 75 6e 73 65 74 20 66     array unset f
2880: 69 6c 65 73 20 2a 0a 20 20 20 20 61 72 72 61 79  iles *.    array
2890: 20 73 65 74 20 66 69 6c 65 73 20 7b 7d 0a 20 20   set files {}.  
28a0: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63    return.}..proc
28b0: 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a   ::vc::cvs::ws::
28c0: 43 53 4e 6f 6e 65 20 7b 7d 20 7b 0a 20 20 20 20  CSNone {} {.    
28d0: 75 70 76 61 72 20 31 20 73 74 61 72 74 20 73 74  upvar 1 start st
28e0: 61 72 74 0a 20 20 20 20 72 65 74 75 72 6e 20 5b  art.    return [
28f0: 65 78 70 72 20 7b 24 73 74 61 72 74 20 65 71 20  expr {$start eq 
2900: 22 22 7d 5d 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76  ""}].}..proc ::v
2910: 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 43 53 4e 65  c::cvs::ws::CSNe
2920: 77 20 7b 65 6e 74 72 79 7d 20 7b 0a 20 20 20 20  w {entry} {.    
2930: 75 70 76 61 72 20 31 20 73 74 61 72 74 20 73 74  upvar 1 start st
2940: 61 72 74 20 65 6e 64 20 65 6e 64 20 63 6d 20 63  art end end cm c
2950: 6d 20 75 73 65 72 20 75 73 65 72 20 66 69 6c 65  m user user file
2960: 73 20 66 69 6c 65 73 20 6c 61 73 74 64 20 6c 61  s files lastd la
2970: 73 74 64 20 72 65 61 73 6f 6e 20 72 65 61 73 6f  std reason reaso
2980: 6e 0a 0a 20 20 20 20 23 70 75 74 73 20 2d 6e 6f  n..    #puts -no
2990: 6e 65 77 6c 69 6e 65 20 73 74 64 6f 75 74 20 2e  newline stdout .
29a0: 20 3b 20 66 6c 75 73 68 20 73 74 64 6f 75 74 0a   ; flush stdout.
29b0: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b 6f 70  .    foreach {op
29c0: 20 74 73 20 61 20 72 65 76 20 66 20 65 63 6d 7d   ts a rev f ecm}
29d0: 20 24 65 6e 74 72 79 20 62 72 65 61 6b 0a 0a 20   $entry break.. 
29e0: 20 20 20 23 20 55 73 65 72 20 63 68 61 6e 67 65     # User change
29f0: 0a 20 20 20 20 69 66 20 7b 24 61 20 6e 65 20 24  .    if {$a ne $
2a00: 75 73 65 72 7d 20 7b 73 65 74 20 72 65 61 73 6f  user} {set reaso
2a10: 6e 20 75 73 65 72 20 3b 20 72 65 74 75 72 6e 20  n user ; return 
2a20: 31 7d 0a 0a 20 20 20 20 23 20 46 69 6c 65 20 61  1}..    # File a
2a30: 6c 72 65 61 64 79 20 69 6e 20 63 75 72 72 65 6e  lready in curren
2a40: 74 20 63 73 65 74 0a 20 20 20 20 69 66 20 7b 5b  t cset.    if {[
2a50: 69 6e 66 6f 20 65 78 69 73 74 73 20 66 69 6c 65  info exists file
2a60: 73 28 24 66 29 5d 7d 20 7b 73 65 74 20 72 65 61  s($f)]} {set rea
2a70: 73 6f 6e 20 66 69 6c 65 20 3b 20 72 65 74 75 72  son file ; retur
2a80: 6e 20 31 7d 0a 0a 20 20 20 20 23 20 43 75 72 72  n 1}..    # Curr
2a90: 65 6e 74 20 63 73 65 74 20 74 72 75 6e 6b 2f 62  ent cset trunk/b
2aa0: 72 61 6e 63 68 20 64 69 66 66 65 72 65 6e 74 20  ranch different 
2ab0: 66 72 6f 6d 20 65 6e 74 72 79 2e 0a 20 20 20 20  from entry..    
2ac0: 73 65 74 20 64 65 70 74 68 20 5b 6c 6c 65 6e 67  set depth [lleng
2ad0: 74 68 20 5b 73 70 6c 69 74 20 24 72 65 76 20 2e  th [split $rev .
2ae0: 5d 5d 0a 20 20 20 20 69 66 20 7b 28 24 6c 61 73  ]].    if {($las
2af0: 74 64 20 3d 3d 20 32 29 20 21 3d 20 28 24 64 65  td == 2) != ($de
2b00: 70 74 68 20 3d 3d 20 32 29 7d 20 7b 73 65 74 20  pth == 2)} {set 
2b10: 72 65 61 73 6f 6e 20 64 65 70 74 68 2f 24 6c 61  reason depth/$la
2b20: 73 74 64 2f 24 64 65 70 74 68 2f 28 24 72 65 76  std/$depth/($rev
2b30: 29 2f 24 66 20 3b 20 72 65 74 75 72 6e 20 31 7d  )/$f ; return 1}
2b40: 0a 0a 20 20 20 20 23 20 43 6f 6d 6d 69 74 20 6d  ..    # Commit m
2b50: 65 73 73 61 67 65 20 63 68 61 6e 67 65 64 0a 20  essage changed. 
2b60: 20 20 20 69 66 20 7b 24 63 6d 20 6e 65 20 24 65     if {$cm ne $e
2b70: 63 6d 7d 20 7b 73 65 74 20 72 65 61 73 6f 6e 20  cm} {set reason 
2b80: 63 6d 73 67 5c 20 3c 3c 24 65 63 6d 3e 3e 20 3b  cmsg\ <<$ecm>> ;
2b90: 20 72 65 74 75 72 6e 20 31 7d 0a 0a 20 20 20 20   return 1}..    
2ba0: 23 20 45 76 65 72 79 74 68 69 6e 67 20 69 73 20  # Everything is 
2bb0: 67 6f 6f 64 2c 20 73 74 69 6c 6c 20 74 68 65 20  good, still the 
2bc0: 73 61 6d 65 20 63 73 65 74 0a 20 20 20 20 72 65  same cset.    re
2bd0: 74 75 72 6e 20 30 0a 7d 0a 0a 70 72 6f 63 20 3a  turn 0.}..proc :
2be0: 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 43 53  :vc::cvs::ws::CS
2bf0: 53 61 76 65 20 7b 7d 20 7b 0a 20 20 20 20 76 61  Save {} {.    va
2c00: 72 69 61 62 6c 65 20 63 6d 61 70 0a 20 20 20 20  riable cmap.    
2c10: 76 61 72 69 61 62 6c 65 20 63 73 65 74 73 0a 20  variable csets. 
2c20: 20 20 20 76 61 72 69 61 62 6c 65 20 6e 63 73 0a     variable ncs.
2c30: 20 20 20 20 75 70 76 61 72 20 31 20 73 74 61 72      upvar 1 star
2c40: 74 20 73 74 61 72 74 20 65 6e 64 20 65 6e 64 20  t start end end 
2c50: 63 6d 20 63 6d 20 75 73 65 72 20 75 73 65 72 20  cm cm user user 
2c60: 66 69 6c 65 73 20 66 69 6c 65 73 20 6c 61 73 74  files files last
2c70: 64 20 6c 61 73 74 64 0a 0a 20 20 20 20 73 65 74  d lastd..    set
2c80: 20 63 73 65 74 73 28 24 6e 63 73 29 20 5b 6c 69   csets($ncs) [li
2c90: 73 74 20 24 75 73 65 72 20 24 63 6d 20 24 73 74  st $user $cm $st
2ca0: 61 72 74 20 24 65 6e 64 20 24 6c 61 73 74 64 20  art $end $lastd 
2cb0: 5b 61 72 72 61 79 20 67 65 74 20 66 69 6c 65 73  [array get files
2cc0: 5d 5d 0a 0a 20 20 20 20 23 20 52 65 63 6f 72 64  ]]..    # Record
2cd0: 20 77 68 69 63 68 20 72 65 76 69 73 69 6f 6e 73   which revisions
2ce0: 20 6f 66 20 61 20 66 69 6c 65 20 61 72 65 20 69   of a file are i
2cf0: 6e 20 77 68 61 74 20 63 73 65 74 73 0a 20 20 20  n what csets.   
2d00: 20 66 6f 72 65 61 63 68 20 7b 66 20 6f 72 7d 20   foreach {f or} 
2d10: 5b 61 72 72 61 79 20 67 65 74 20 66 69 6c 65 73  [array get files
2d20: 5d 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b 5f 20  ] {..foreach {_ 
2d30: 72 65 76 7d 20 24 6f 72 20 62 72 65 61 6b 0a 09  rev} $or break..
2d40: 73 65 74 20 63 6d 61 70 28 5b 6c 69 73 74 20 24  set cmap([list $
2d50: 66 20 24 72 65 76 5d 29 20 24 6e 63 73 0a 20 20  f $rev]) $ncs.  
2d60: 20 20 7d 0a 0a 20 20 20 20 23 43 53 44 75 6d 70    }..    #CSDump
2d70: 20 24 6e 63 73 0a 0a 20 20 20 20 69 6e 63 72 20   $ncs..    incr 
2d80: 6e 63 73 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d  ncs.    return.}
2d90: 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73  ..proc ::vc::cvs
2da0: 3a 3a 77 73 3a 3a 43 53 41 64 64 20 7b 65 6e 74  ::ws::CSAdd {ent
2db0: 72 79 7d 20 7b 0a 20 20 20 20 75 70 76 61 72 20  ry} {.    upvar 
2dc0: 31 20 73 74 61 72 74 20 73 74 61 72 74 20 65 6e  1 start start en
2dd0: 64 20 65 6e 64 20 63 6d 20 63 6d 20 75 73 65 72  d end cm cm user
2de0: 20 75 73 65 72 20 66 69 6c 65 73 20 66 69 6c 65   user files file
2df0: 73 20 6c 61 73 74 64 20 6c 61 73 74 64 0a 0a 20  s lastd lastd.. 
2e00: 20 20 20 66 6f 72 65 61 63 68 20 7b 6f 70 20 74     foreach {op t
2e10: 73 20 61 20 72 65 76 20 66 20 65 63 6d 7d 20 24  s a rev f ecm} $
2e20: 65 6e 74 72 79 20 62 72 65 61 6b 0a 0a 20 20 20  entry break..   
2e30: 20 69 66 20 7b 24 73 74 61 72 74 20 65 71 20 22   if {$start eq "
2e40: 22 7d 20 7b 73 65 74 20 73 74 61 72 74 20 24 74  "} {set start $t
2e50: 73 7d 0a 20 20 20 20 73 65 74 20 65 6e 64 20 20  s}.    set end  
2e60: 20 20 20 20 20 24 74 73 0a 20 20 20 20 73 65 74       $ts.    set
2e70: 20 63 6d 20 20 20 20 20 20 20 20 24 65 63 6d 0a   cm        $ecm.
2e80: 20 20 20 20 73 65 74 20 75 73 65 72 20 20 20 20      set user    
2e90: 20 20 24 61 0a 20 20 20 20 73 65 74 20 66 69 6c    $a.    set fil
2ea0: 65 73 28 24 66 29 20 5b 6c 69 73 74 20 24 6f 70  es($f) [list $op
2eb0: 20 24 72 65 76 5d 0a 20 20 20 20 73 65 74 20 6c   $rev].    set l
2ec0: 61 73 74 64 20 20 20 20 20 5b 6c 6c 65 6e 67 74  astd     [llengt
2ed0: 68 20 5b 73 70 6c 69 74 20 24 72 65 76 20 2e 5d  h [split $rev .]
2ee0: 5d 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a  ].    return.}..
2ef0: 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a  proc ::vc::cvs::
2f00: 77 73 3a 3a 43 53 44 75 6d 70 20 7b 63 7d 20 7b  ws::CSDump {c} {
2f10: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 63 73  .    variable cs
2f20: 65 74 73 0a 20 20 20 20 66 6f 72 65 61 63 68 20  ets.    foreach 
2f30: 7b 75 20 63 6d 20 73 20 65 20 72 64 20 66 7d 20  {u cm s e rd f} 
2f40: 24 63 73 65 74 73 28 24 63 29 20 62 72 65 61 6b  $csets($c) break
2f50: 0a 0a 20 20 20 20 70 75 74 73 20 22 24 75 20 24  ..    puts "$u $
2f60: 73 22 3b 20 72 65 67 73 75 62 20 2d 61 6c 6c 20  s"; regsub -all 
2f70: 7b 2e 7d 20 24 75 20 7b 20 7d 20 62 0a 20 20 20  {.} $u { } b.   
2f80: 20 70 75 74 73 20 22 24 62 20 24 65 22 0a 20 20   puts "$b $e".  
2f90: 20 20 66 6f 72 65 61 63 68 20 7b 66 20 6f 72 7d    foreach {f or}
2fa0: 20 24 66 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b   $f {..foreach {
2fb0: 6f 20 72 7d 20 24 6f 72 20 62 72 65 61 6b 0a 09  o r} $or break..
2fc0: 70 75 74 73 20 22 24 62 20 24 6f 20 24 66 20 24  puts "$b $o $f $
2fd0: 72 22 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  r".    }.    ret
2fe0: 75 72 6e 0a 7d 0a 0a 6e 61 6d 65 73 70 61 63 65  urn.}..namespace
2ff0: 20 65 76 61 6c 20 3a 3a 76 63 3a 3a 63 76 73 3a   eval ::vc::cvs:
3000: 3a 77 73 20 7b 0a 20 20 20 20 6e 61 6d 65 73 70  :ws {.    namesp
3010: 61 63 65 20 65 78 70 6f 72 74 20 61 74 20 73 63  ace export at sc
3020: 61 6e 20 63 73 65 74 73 20 72 74 72 65 65 20 77  an csets rtree w
3030: 6f 72 6b 73 70 61 63 65 20 77 73 69 67 6e 6f 72  orkspace wsignor
3040: 65 20 77 73 63 6c 65 61 72 20 77 73 73 65 74 75  e wsclear wssetu
3050: 70 20 5c 0a 09 66 6f 72 65 61 63 68 5f 63 73 65  p \..foreach_cse
3060: 74 20 72 6f 6f 74 20 6e 74 72 75 6e 6b 20 6e 63  t root ntrunk nc
3070: 73 65 74 73 20 75 75 69 64 0a 7d 0a 0a 23 20 2d  sets uuid.}..# -
3080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
3090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 52  ------------.# R
30d0: 65 61 64 79 0a 0a 70 61 63 6b 61 67 65 20 70 72  eady..package pr
30e0: 6f 76 69 64 65 20 76 63 3a 3a 63 76 73 3a 3a 77  ovide vc::cvs::w
30f0: 73 20 31 2e 30 0a 72 65 74 75 72 6e 0a           s 1.0.return.