Hex Artifact Content
Not logged in

Artifact 5855edb7f000935b4ef5741ef454402bc2d2a7fc:

File tools/lib/cvs.tcl part of check-in [cdf5e6d8b7] - Encapsulated access to the fossil and cvs applications in their own packages. by aku on 2007-09-13 06:59:24.

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 76 63 3a 3a 63 76 73 3a 3a  equire vc::cvs::
01c0: 63 6d 64 20 20 20 20 3b 20 23 20 41 63 63 65 73  cmd    ; # Acces
01d0: 73 20 74 6f 20 63 76 73 20 61 70 70 6c 69 63 61  s to cvs applica
01e0: 74 69 6f 6e 2e 0a 70 61 63 6b 61 67 65 20 72 65  tion..package re
01f0: 71 75 69 72 65 20 73 74 72 75 63 74 3a 3a 74 72  quire struct::tr
0200: 65 65 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65 76  ee..namespace ev
0210: 61 6c 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73  al ::vc::cvs::ws
0220: 20 7b 0a 20 20 20 20 76 63 3a 3a 74 6f 6f 6c 73   {.    vc::tools
0230: 3a 3a 6c 6f 67 3a 3a 73 79 73 74 65 6d 20 63 76  ::log::system cv
0240: 73 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20  s.    namespace 
0250: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f  import ::vc::too
0260: 6c 73 3a 3a 6c 6f 67 3a 3a 77 72 69 74 65 0a 20  ls::log::write. 
0270: 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70     namespace imp
0280: 6f 72 74 20 3a 3a 76 63 3a 3a 72 63 73 3a 3a 70  ort ::vc::rcs::p
0290: 61 72 73 65 72 3a 3a 70 72 6f 63 65 73 73 0a 20  arser::process. 
02a0: 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70     namespace imp
02b0: 6f 72 74 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 63  ort ::vc::cvs::c
02c0: 6d 64 3a 3a 64 6f 76 61 0a 7d 0a 0a 23 20 2d 2d  md::dova.}..# --
02d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0300: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0310: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 41 50  -----------.# AP
0320: 49 0a 0a 23 20 44 65 66 69 6e 65 20 72 65 70 6f  I..# Define repo
0330: 73 69 74 6f 72 79 20 64 69 72 65 63 74 6f 72 79  sitory directory
0340: 2e 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76  ...proc ::vc::cv
0350: 73 3a 3a 77 73 3a 3a 61 74 20 7b 70 61 74 68 7d  s::ws::at {path}
0360: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20   {.    variable 
0370: 62 61 73 65 20 5b 66 69 6c 65 20 6e 6f 72 6d 61  base [file norma
0380: 6c 69 7a 65 20 24 70 61 74 68 5d 0a 20 20 20 20  lize $path].    
0390: 77 72 69 74 65 20 30 20 63 76 73 20 22 42 61 73  write 0 cvs "Bas
03a0: 65 3a 20 24 62 61 73 65 22 0a 20 20 20 20 72 65  e: $base".    re
03b0: 74 75 72 6e 0a 7d 0a 0a 6e 61 6d 65 73 70 61 63  turn.}..namespac
03c0: 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a 63 76 73  e eval ::vc::cvs
03d0: 3a 3a 77 73 20 7b 0a 20 20 20 20 23 20 54 6f 70  ::ws {.    # Top
03e0: 6c 65 76 65 6c 20 72 65 70 6f 73 69 74 6f 72 79  level repository
03f0: 20 64 69 72 65 63 74 6f 72 79 0a 20 20 20 20 76   directory.    v
0400: 61 72 69 61 62 6c 65 20 62 61 73 65 20 7b 7d 0a  ariable base {}.
0410: 7d 0a 0a 23 20 53 63 61 6e 20 72 65 70 6f 73 69  }..# Scan reposi
0420: 74 6f 72 79 2c 20 63 6f 6c 6c 65 63 74 20 61 72  tory, collect ar
0430: 63 68 69 76 65 73 2c 20 70 61 72 73 65 20 74 68  chives, parse th
0440: 65 6d 2c 20 61 6e 64 20 63 6f 6c 6c 65 63 74 20  em, and collect 
0450: 72 65 76 69 73 69 6f 6e 0a 23 20 69 6e 66 6f 72  revision.# infor
0460: 6d 61 74 69 6f 6e 20 28 66 69 6c 65 2c 20 72 65  mation (file, re
0470: 76 69 73 69 6f 6e 20 2d 3e 20 64 61 74 65 2c 20  vision -> date, 
0480: 61 75 74 68 6f 72 2c 20 63 6f 6d 6d 69 74 20 6d  author, commit m
0490: 65 73 73 61 67 65 29 0a 0a 70 72 6f 63 20 3a 3a  essage)..proc ::
04a0: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 73 63 61  vc::cvs::ws::sca
04b0: 6e 20 7b 7d 20 7b 0a 20 20 20 20 76 61 72 69 61  n {} {.    varia
04c0: 62 6c 65 20 62 61 73 65 0a 20 20 20 20 76 61 72  ble base.    var
04d0: 69 61 62 6c 65 20 6e 70 61 74 68 73 0a 20 20 20  iable npaths.   
04e0: 20 76 61 72 69 61 62 6c 65 20 72 70 61 74 68 73   variable rpaths
04f0: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 74 69  .    variable ti
0500: 6d 65 6c 69 6e 65 0a 0a 20 20 20 20 77 72 69 74  meline..    writ
0510: 65 20 30 20 63 76 73 20 7b 53 63 61 6e 6e 69 6e  e 0 cvs {Scannin
0520: 67 20 64 69 72 65 63 74 6f 72 79 20 68 69 65 72  g directory hier
0530: 61 72 63 68 79 7d 0a 0a 20 20 20 20 73 65 74 20  archy}..    set 
0540: 6e 20 30 0a 20 20 20 20 66 6f 72 65 61 63 68 20  n 0.    foreach 
0550: 72 63 73 20 5b 66 69 6c 65 75 74 69 6c 3a 3a 66  rcs [fileutil::f
0560: 69 6e 64 42 79 50 61 74 74 65 72 6e 20 24 62 61  indByPattern $ba
0570: 73 65 20 2d 67 6c 6f 62 20 2a 2c 76 5d 20 7b 0a  se -glob *,v] {.
0580: 09 73 65 74 20 72 63 73 20 5b 66 69 6c 65 75 74  .set rcs [fileut
0590: 69 6c 3a 3a 73 74 72 69 70 50 61 74 68 20 24 62  il::stripPath $b
05a0: 61 73 65 20 24 72 63 73 5d 0a 09 23 20 4e 6f 77  ase $rcs]..# Now
05b0: 20 72 63 73 20 69 73 20 72 65 6c 61 74 69 76 65   rcs is relative
05c0: 20 74 6f 20 62 61 73 65 0a 0a 09 77 72 69 74 65   to base...write
05d0: 20 31 20 63 76 73 20 22 41 72 63 68 69 76 65 20   1 cvs "Archive 
05e0: 24 72 63 73 22 0a 0a 09 69 66 20 7b 5b 73 74 72  $rcs"...if {[str
05f0: 69 6e 67 20 6d 61 74 63 68 20 43 56 53 52 4f 4f  ing match CVSROO
0600: 54 2a 20 24 72 63 73 5d 7d 20 7b 0a 09 20 20 20  T* $rcs]} {..   
0610: 20 77 72 69 74 65 20 32 20 63 76 73 20 7b 49 67   write 2 cvs {Ig
0620: 6e 6f 72 65 64 2e 20 41 64 6d 69 6e 69 73 74 72  nored. Administr
0630: 61 74 69 76 65 20 66 69 6c 65 7d 0a 09 20 20 20  ative file}..   
0640: 20 63 6f 6e 74 69 6e 75 65 0a 09 7d 0a 0a 09 23   continue..}...#
0650: 20 44 65 72 69 76 65 20 74 68 65 20 72 65 67 75   Derive the regu
0660: 6c 61 72 20 70 61 74 68 20 66 72 6f 6d 20 74 68  lar path from th
0670: 65 20 72 63 73 20 70 61 74 68 2e 20 4d 65 61 6e  e rcs path. Mean
0680: 69 6e 67 3a 20 43 68 6f 70 20 6f 66 0a 09 23 20  ing: Chop of..# 
0690: 74 68 65 20 22 2c 76 22 20 73 75 66 66 69 78 2c  the ",v" suffix,
06a0: 20 61 6e 64 20 72 65 6d 6f 76 65 20 61 20 70 6f   and remove a po
06b0: 73 73 69 62 6c 65 20 22 41 74 74 69 63 22 2e 0a  ssible "Attic"..
06c0: 09 73 65 74 20 66 20 5b 73 74 72 69 6e 67 20 72  .set f [string r
06d0: 61 6e 67 65 20 24 72 63 73 20 30 20 65 6e 64 2d  ange $rcs 0 end-
06e0: 32 5d 0a 09 69 66 20 7b 22 41 74 74 69 63 22 20  2]..if {"Attic" 
06f0: 65 71 20 5b 6c 69 6e 64 65 78 20 5b 66 69 6c 65  eq [lindex [file
0700: 20 73 70 6c 69 74 20 24 72 63 73 5d 20 65 6e 64   split $rcs] end
0710: 2d 31 5d 7d 20 7b 0a 09 20 20 20 20 73 65 74 20  -1]} {..    set 
0720: 66 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 5b 66 69  f [file join [fi
0730: 6c 65 20 64 69 72 6e 61 6d 65 20 5b 66 69 6c 65  le dirname [file
0740: 20 64 69 72 6e 61 6d 65 20 24 66 5d 5d 20 5b 66   dirname $f]] [f
0750: 69 6c 65 20 74 61 69 6c 20 24 66 5d 5d 0a 09 20  ile tail $f]].. 
0760: 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 78 69     if {[file exi
0770: 73 74 73 20 24 62 61 73 65 2f 24 66 2c 76 5d 7d  sts $base/$f,v]}
0780: 20 7b 0a 09 09 23 20 57 65 20 68 61 76 65 20 61   {...# We have a
0790: 20 72 65 67 75 6c 61 72 20 61 72 63 68 69 76 65   regular archive
07a0: 20 61 6e 64 20 61 6e 20 41 74 74 69 63 20 61 72   and an Attic ar
07b0: 63 68 69 76 65 0a 09 09 23 20 72 65 66 65 72 69  chive...# referi
07c0: 6e 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 75  ng to the same u
07d0: 73 65 72 20 76 69 73 69 62 6c 65 20 66 69 6c 65  ser visible file
07e0: 2e 20 49 67 6e 6f 72 65 20 74 68 65 0a 09 09 23  . Ignore the...#
07f0: 20 66 69 6c 65 20 69 6e 20 74 68 65 20 41 74 74   file in the Att
0800: 69 63 2e 0a 0a 09 09 77 72 69 74 65 20 32 20 63  ic.....write 2 c
0810: 76 73 20 22 49 67 6e 6f 72 65 64 2e 20 41 74 74  vs "Ignored. Att
0820: 69 63 20 73 75 70 65 72 63 65 64 65 64 20 62 79  ic superceded by
0830: 20 72 65 67 75 6c 61 72 20 61 72 63 68 69 76 65   regular archive
0840: 22 0a 0a 09 09 23 20 54 4f 44 4f 2f 43 48 45 43  "....# TODO/CHEC
0850: 4b 2e 20 4d 79 20 6d 65 74 68 6f 64 20 6f 66 20  K. My method of 
0860: 63 6f 27 69 6e 67 20 65 78 61 63 74 20 66 69 6c  co'ing exact fil
0870: 65 20 72 65 76 69 73 69 6f 6e 73 0a 09 09 23 20  e revisions...# 
0880: 70 65 72 20 74 68 65 20 69 6e 66 6f 20 69 6e 20  per the info in 
0890: 74 68 65 20 63 6f 6c 6c 65 63 74 65 64 20 63 73  the collected cs
08a0: 65 74 73 20 68 61 73 20 74 68 65 20 66 6c 61 77  ets has the flaw
08b0: 0a 09 09 23 20 74 68 61 74 20 49 20 6d 61 79 20  ...# that I may 
08c0: 68 61 76 65 20 74 6f 20 6b 6e 6f 77 20 65 78 61  have to know exa
08d0: 63 74 6c 79 20 77 68 65 6e 20 77 68 61 74 20 61  ctly when what a
08e0: 72 63 68 69 76 65 0a 09 09 23 20 66 69 6c 65 20  rchive...# file 
08f0: 74 6f 20 75 73 65 2c 20 73 65 65 20 61 62 6f 76  to use, see abov
0900: 65 2e 20 49 74 20 6d 69 67 68 74 20 62 65 20 62  e. It might be b
0910: 65 74 74 65 72 20 74 6f 20 75 73 65 0a 09 09 23  etter to use...#
0920: 20 74 68 65 20 69 6e 66 6f 20 6f 6e 6c 79 20 74   the info only t
0930: 6f 20 67 61 74 68 65 72 20 77 68 65 6e 20 63 73  o gather when cs
0940: 65 74 73 20 62 65 67 69 6e 20 61 6e 64 20 65 6e  ets begin and en
0950: 64 2c 0a 09 09 23 20 61 6e 64 20 74 68 65 6e 20  d,...# and then 
0960: 74 6f 20 63 6f 20 63 6f 6d 70 6c 65 74 65 20 73  to co complete s
0970: 6c 69 63 65 73 20 70 65 72 20 65 78 61 63 74 20  lices per exact 
0980: 74 69 6d 65 73 74 61 6d 70 0a 09 09 23 20 28 2d  timestamp...# (-
0990: 44 29 20 69 6e 73 74 65 61 64 20 6f 66 20 66 69  D) instead of fi
09a0: 6c 65 20 72 65 76 69 73 69 6f 6e 73 20 28 2d 72  le revisions (-r
09b0: 29 2e 20 54 68 65 20 66 6c 61 77 20 69 6e 0a 09  ). The flaw in..
09c0: 09 23 20 74 68 61 74 20 69 73 20 74 68 61 74 20  .# that is that 
09d0: 63 73 65 74 73 20 63 61 6e 20 6f 63 63 75 72 20  csets can occur 
09e0: 69 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 6f  in the same seco
09f0: 6e 64 0a 09 09 23 20 28 74 72 66 2c 20 6d 65 6d  nd...# (trf, mem
0a00: 63 68 61 6e 20 2d 20 63 68 65 63 6b 20 66 6f 72  chan - check for
0a10: 20 65 78 61 6d 70 6c 65 73 29 2e 20 46 6f 72 20   examples). For 
0a20: 74 68 61 74 20 65 78 61 63 74 0a 09 09 23 20 63  that exact...# c
0a30: 68 65 63 6b 6f 75 74 20 6d 61 79 20 62 65 20 6e  heckout may be n
0a40: 65 65 64 65 64 20 74 6f 20 72 65 63 72 65 61 74  eeded to recreat
0a50: 65 20 65 78 61 63 74 20 73 65 71 75 65 6e 63 65  e exact sequence
0a60: 20 6f 66 0a 09 09 23 20 63 68 61 6e 67 65 73 2e   of...# changes.
0a70: 20 47 72 72 2e 20 53 69 78 20 6f 66 20 6f 6e 65   Grr. Six of one
0a80: 20 2e 2e 2e 0a 0a 09 09 63 6f 6e 74 69 6e 75 65   .......continue
0a90: 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 23 20 47  ..    }..}...# G
0aa0: 65 74 20 74 68 65 20 6d 65 74 61 20 64 61 74 61  et the meta data
0ab0: 20 77 65 20 6e 65 65 64 20 28 72 65 76 69 73 69   we need (revisi
0ac0: 6f 6e 73 2c 20 74 69 6d 65 6c 69 6e 65 2c 20 6d  ons, timeline, m
0ad0: 65 73 73 61 67 65 73 29 2e 0a 09 73 65 74 20 6d  essages)...set m
0ae0: 65 74 61 20 5b 70 72 6f 63 65 73 73 20 24 62 61  eta [process $ba
0af0: 73 65 2f 24 72 63 73 5d 0a 0a 09 73 65 74 20 6e  se/$rcs]...set n
0b00: 70 61 74 68 73 28 24 72 63 73 29 20 24 66 0a 09  paths($rcs) $f..
0b10: 73 65 74 20 72 70 61 74 68 73 28 24 66 29 20 24  set rpaths($f) $
0b20: 72 63 73 0a 0a 09 61 72 72 61 79 20 73 65 74 20  rcs...array set 
0b30: 70 20 24 6d 65 74 61 0a 0a 09 66 6f 72 65 61 63  p $meta...foreac
0b40: 68 20 7b 72 65 76 20 74 73 7d 20 24 70 28 64 61  h {rev ts} $p(da
0b50: 74 65 29 20 7b 5f 20 61 7d 20 24 70 28 61 75 74  te) {_ a} $p(aut
0b60: 68 6f 72 29 20 7b 5f 20 63 6d 7d 20 24 70 28 63  hor) {_ cm} $p(c
0b70: 6f 6d 6d 69 74 29 20 7b 5f 20 73 74 7d 20 24 70  ommit) {_ st} $p
0b80: 28 73 74 61 74 65 29 20 7b 0a 09 20 20 20 20 73  (state) {..    s
0b90: 65 74 20 6f 70 20 5b 65 78 70 72 20 7b 28 24 72  et op [expr {($r
0ba0: 65 76 20 65 71 20 22 31 2e 31 22 29 20 3f 20 22  ev eq "1.1") ? "
0bb0: 41 22 20 3a 20 22 4d 22 7d 5d 0a 09 20 20 20 20  A" : "M"}]..    
0bc0: 69 66 20 7b 24 73 74 20 65 71 20 22 64 65 61 64  if {$st eq "dead
0bd0: 22 7d 20 7b 73 65 74 20 6f 70 20 22 52 22 7d 0a  "} {set op "R"}.
0be0: 0a 09 20 20 20 20 23 20 41 20 64 65 61 64 2d 66  ..    # A dead-f
0bf0: 69 72 73 74 20 72 65 76 69 73 69 6f 6e 20 69 73  irst revision is
0c00: 20 72 65 76 20 31 2e 31 20 77 69 74 68 20 6f 70   rev 1.1 with op
0c10: 20 52 2e 20 46 6f 72 20 61 6e 0a 09 20 20 20 20   R. For an..    
0c20: 23 20 65 78 61 6d 70 6c 65 20 73 65 65 20 74 68  # example see th
0c30: 65 20 66 69 6c 65 20 6d 65 6d 63 68 61 6e 2f 44  e file memchan/D
0c40: 45 50 45 4e 44 45 4e 43 49 45 53 2e 20 53 75 63  EPENDENCIES. Suc
0c50: 68 20 61 20 66 69 6c 65 0a 09 20 20 20 20 23 20  h a file..    # 
0c60: 73 65 65 6d 73 20 74 6f 20 65 78 69 73 74 20 6f  seems to exist o
0c70: 6e 6c 79 21 20 6f 6e 20 69 74 73 20 62 72 61 6e  nly! on its bran
0c80: 63 68 2e 20 54 68 65 20 62 72 61 6e 63 68 65 73  ch. The branches
0c90: 0a 09 20 20 20 20 23 20 69 6e 66 6f 72 6d 61 74  ..    # informat
0ca0: 69 6f 6e 20 69 73 20 73 65 74 20 6f 6e 20 74 68  ion is set on th
0cb0: 65 20 72 65 76 69 73 69 6f 6e 20 28 65 78 74 65  e revision (exte
0cc0: 6e 64 20 72 63 73 70 61 72 73 65 72 21 29 2c 0a  nd rcsparser!),.
0cd0: 09 20 20 20 20 23 20 73 79 6d 62 6f 6c 73 20 68  .    # symbols h
0ce0: 61 73 20 61 20 74 61 67 2c 20 72 65 66 65 72 69  as a tag, referi
0cf0: 6e 67 20 74 6f 20 61 20 62 72 61 6e 63 68 2c 20  ng to a branch, 
0d00: 70 6f 73 73 69 62 6c 79 20 6d 61 67 69 63 2e 0a  possibly magic..
0d10: 0a 09 20 20 20 20 69 66 20 7b 28 24 72 65 76 20  ..    if {($rev 
0d20: 65 71 20 22 31 2e 31 22 29 20 26 26 20 28 24 6f  eq "1.1") && ($o
0d30: 70 20 65 71 20 22 52 22 29 7d 20 7b 0a 09 09 77  p eq "R")} {...w
0d40: 72 69 74 65 20 32 20 63 76 73 20 7b 44 65 61 64  rite 2 cvs {Dead
0d50: 20 72 6f 6f 74 20 72 65 76 69 73 69 6f 6e 7d 0a   root revision}.
0d60: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 6c 61 70  .    }...    lap
0d70: 70 65 6e 64 20 74 69 6d 65 6c 69 6e 65 28 24 74  pend timeline($t
0d80: 73 29 20 5b 6c 69 73 74 20 24 6f 70 20 24 74 73  s) [list $op $ts
0d90: 20 24 61 20 24 72 65 76 20 24 66 20 24 63 6d 5d   $a $rev $f $cm]
0da0: 0a 09 7d 0a 0a 09 23 75 6e 73 65 74 20 70 28 63  ..}...#unset p(c
0db0: 6f 6d 6d 69 74 29 0a 09 23 70 61 72 72 61 79 20  ommit)..#parray 
0dc0: 70 0a 0a 09 69 6e 63 72 20 6e 0a 20 20 20 20 7d  p...incr n.    }
0dd0: 0a 0a 20 20 20 20 77 72 69 74 65 20 30 20 63 76  ..    write 0 cv
0de0: 73 20 22 50 72 6f 63 65 73 73 65 64 20 24 6e 20  s "Processed $n 
0df0: 5b 65 78 70 72 20 7b 28 24 6e 20 3d 3d 20 31 29  [expr {($n == 1)
0e00: 20 3f 20 22 66 69 6c 65 22 20 3a 20 22 66 69 6c   ? "file" : "fil
0e10: 65 73 22 7d 5d 22 0a 20 20 20 20 72 65 74 75 72  es"}]".    retur
0e20: 6e 0a 7d 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65  n.}..namespace e
0e30: 76 61 6c 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77  val ::vc::cvs::w
0e40: 73 20 7b 0a 20 20 20 20 23 20 50 61 74 68 20 6d  s {.    # Path m
0e50: 61 70 70 69 6e 67 73 2e 20 6e 70 61 74 68 73 3a  appings. npaths:
0e60: 20 72 63 73 20 66 69 6c 65 20 20 2d 3e 20 75 73   rcs file  -> us
0e70: 65 72 20 66 69 6c 65 0a 20 20 20 20 23 20 20 20  er file.    #   
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 72 70 61               rpa
0e90: 74 68 73 3a 20 75 73 65 72 20 66 69 6c 65 20 2d  ths: user file -
0ea0: 3e 20 72 63 73 20 66 69 6c 65 2c 20 64 65 61 64  > rcs file, dead
0eb0: 2d 73 74 61 74 75 73 0a 0a 20 20 20 20 76 61 72  -status..    var
0ec0: 69 61 62 6c 65 20 6e 70 61 74 68 73 20 20 20 3b  iable npaths   ;
0ed0: 20 61 72 72 61 79 20 73 65 74 20 6e 70 61 74 68   array set npath
0ee0: 73 20 20 20 7b 7d 0a 20 20 20 20 76 61 72 69 61  s   {}.    varia
0ef0: 62 6c 65 20 72 70 61 74 68 73 20 20 20 3b 20 61  ble rpaths   ; a
0f00: 72 72 61 79 20 73 65 74 20 72 70 61 74 68 73 20  rray set rpaths 
0f10: 20 20 7b 7d 0a 0a 20 20 20 20 23 20 54 69 6d 65    {}..    # Time
0f20: 6c 69 6e 65 3a 20 74 73 74 61 6d 70 20 2d 3e 20  line: tstamp -> 
0f30: 28 6f 70 2c 20 74 73 74 61 6d 70 2c 20 61 75 74  (op, tstamp, aut
0f40: 68 6f 72 2c 20 72 65 76 69 73 69 6f 6e 2c 20 66  hor, revision, f
0f50: 69 6c 65 2c 20 63 6f 6d 6d 69 74 20 6d 65 73 73  ile, commit mess
0f60: 61 67 65 29 0a 0a 20 20 20 20 76 61 72 69 61 62  age)..    variab
0f70: 6c 65 20 74 69 6d 65 6c 69 6e 65 20 3b 20 61 72  le timeline ; ar
0f80: 72 61 79 20 73 65 74 20 74 69 6d 65 6c 69 6e 65  ray set timeline
0f90: 20 7b 7d 0a 7d 0a 0a 23 20 47 72 6f 75 70 20 73   {}.}..# Group s
0fa0: 69 6e 67 6c 65 20 63 68 61 6e 67 65 73 20 69 6e  ingle changes in
0fb0: 74 6f 20 63 68 61 6e 67 65 73 65 74 73 0a 0a 70  to changesets..p
0fc0: 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77  roc ::vc::cvs::w
0fd0: 73 3a 3a 63 73 65 74 73 20 7b 7d 20 7b 0a 20 20  s::csets {} {.  
0fe0: 20 20 76 61 72 69 61 62 6c 65 20 74 69 6d 65 6c    variable timel
0ff0: 69 6e 65 0a 20 20 20 20 76 61 72 69 61 62 6c 65  ine.    variable
1000: 20 63 73 65 74 73 0a 20 20 20 20 76 61 72 69 61   csets.    varia
1010: 62 6c 65 20 6e 63 73 0a 20 20 20 20 76 61 72 69  ble ncs.    vari
1020: 61 62 6c 65 20 63 6d 61 70 0a 0a 20 20 20 20 61  able cmap..    a
1030: 72 72 61 79 20 75 6e 73 65 74 20 63 73 65 74 73  rray unset csets
1040: 20 2a 20 3b 20 61 72 72 61 79 20 73 65 74 20 63   * ; array set c
1050: 73 65 74 73 20 7b 7d 0a 20 20 20 20 61 72 72 61  sets {}.    arra
1060: 79 20 75 6e 73 65 74 20 63 6d 61 70 20 20 2a 20  y unset cmap  * 
1070: 3b 20 61 72 72 61 79 20 73 65 74 20 63 6d 61 70  ; array set cmap
1080: 20 20 7b 7d 0a 20 20 20 20 73 65 74 20 6e 63 73    {}.    set ncs
1090: 20 30 0a 0a 20 20 20 20 77 72 69 74 65 20 30 20   0..    write 0 
10a0: 63 76 73 20 22 50 72 6f 63 65 73 73 69 6e 67 20  cvs "Processing 
10b0: 74 69 6d 65 6c 69 6e 65 22 0a 0a 20 20 20 20 73  timeline"..    s
10c0: 65 74 20 6e 20 30 0a 20 20 20 20 43 53 43 6c 65  et n 0.    CSCle
10d0: 61 72 0a 20 20 20 20 66 6f 72 65 61 63 68 20 74  ar.    foreach t
10e0: 73 20 5b 6c 73 6f 72 74 20 2d 64 69 63 74 20 5b  s [lsort -dict [
10f0: 61 72 72 61 79 20 6e 61 6d 65 73 20 74 69 6d 65  array names time
1100: 6c 69 6e 65 5d 5d 20 7b 0a 0a 09 23 20 6f 70 20  line]] {...# op 
1110: 74 73 74 61 6d 70 20 61 75 74 68 6f 72 20 72 65  tstamp author re
1120: 76 69 73 69 6f 6e 20 66 69 6c 65 20 63 6f 6d 6d  vision file comm
1130: 69 74 0a 09 23 20 30 20 20 31 20 20 20 20 20 20  it..# 0  1      
1140: 32 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20  2      3        
1150: 34 20 20 20 20 35 2f 65 6e 64 0a 09 23 20 62 20  4    5/end..# b 
1160: 20 20 20 20 20 20 20 20 63 20 20 20 20 20 20 20          c       
1170: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 0a 0a               a..
1180: 09 73 65 74 20 65 6e 74 72 69 65 73 20 5b 6c 73  .set entries [ls
1190: 6f 72 74 20 2d 69 6e 64 65 78 20 32 20 5b 6c 73  ort -index 2 [ls
11a0: 6f 72 74 20 2d 69 6e 64 65 78 20 30 20 5b 6c 73  ort -index 0 [ls
11b0: 6f 72 74 20 2d 69 6e 64 65 78 20 65 6e 64 20 24  ort -index end $
11c0: 74 69 6d 65 6c 69 6e 65 28 24 74 73 29 5d 5d 5d  timeline($ts)]]]
11d0: 0a 09 23 70 75 74 73 20 5b 6a 6f 69 6e 20 24 65  ..#puts [join $e
11e0: 6e 74 72 69 65 73 20 5c 6e 5d 0a 0a 09 66 6f 72  ntries \n]...for
11f0: 65 61 63 68 20 65 6e 74 72 79 20 20 24 65 6e 74  each entry  $ent
1200: 72 69 65 73 20 7b 0a 09 20 20 20 20 69 66 20 7b  ries {..    if {
1210: 21 5b 43 53 4e 6f 6e 65 5d 20 26 26 20 5b 43 53  ![CSNone] && [CS
1220: 4e 65 77 20 24 65 6e 74 72 79 5d 7d 20 7b 0a 09  New $entry]} {..
1230: 09 43 53 53 61 76 65 0a 09 09 43 53 43 6c 65 61  .CSSave...CSClea
1240: 72 0a 09 09 23 70 75 74 73 20 3d 3d 5c 6e 24 72  r...#puts ==\n$r
1250: 65 61 73 6f 6e 0a 09 20 20 20 20 7d 0a 09 20 20  eason..    }..  
1260: 20 20 43 53 41 64 64 20 24 65 6e 74 72 79 0a 09    CSAdd $entry..
1270: 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 20 20      incr n..}.  
1280: 20 20 7d 0a 0a 20 20 20 20 77 72 69 74 65 20 30    }..    write 0
1290: 20 63 76 73 20 22 50 72 6f 63 65 73 73 65 64 20   cvs "Processed 
12a0: 24 6e 20 5b 65 78 70 72 20 7b 28 24 6e 20 3d 3d  $n [expr {($n ==
12b0: 20 31 29 20 3f 20 22 65 6e 74 72 79 22 20 3a 20   1) ? "entry" : 
12c0: 22 65 6e 74 72 69 65 73 22 7d 5d 22 0a 0a 20 20  "entries"}]"..  
12d0: 20 20 73 65 74 20 6e 20 5b 61 72 72 61 79 20 73    set n [array s
12e0: 69 7a 65 20 63 73 65 74 73 5d 0a 20 20 20 20 77  ize csets].    w
12f0: 72 69 74 65 20 30 20 63 76 73 20 22 46 6f 75 6e  rite 0 cvs "Foun
1300: 64 20 20 20 20 20 24 6e 20 5b 65 78 70 72 20 7b  d     $n [expr {
1310: 28 24 6e 20 3d 3d 20 31 29 20 3f 20 22 63 68 61  ($n == 1) ? "cha
1320: 6e 67 65 73 65 74 22 20 3a 20 22 63 68 61 6e 67  ngeset" : "chang
1330: 65 73 65 74 73 22 7d 5d 22 0a 20 20 20 20 72 65  esets"}]".    re
1340: 74 75 72 6e 0a 7d 0a 0a 0a 6e 61 6d 65 73 70 61  turn.}...namespa
1350: 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a 63 76  ce eval ::vc::cv
1360: 73 3a 3a 77 73 20 7b 0a 20 20 20 20 23 20 43 68  s::ws {.    # Ch
1370: 61 6e 67 65 73 65 74 20 64 61 74 61 3a 0a 20 20  angeset data:.  
1380: 20 20 23 20 6e 63 73 3a 20 20 20 43 6f 75 6e 74    # ncs:   Count
1390: 65 72 2d 62 61 73 65 64 20 69 64 20 67 65 6e 65  er-based id gene
13a0: 72 61 74 69 6f 6e 0a 20 20 20 20 23 20 63 73 65  ration.    # cse
13b0: 74 73 3a 20 69 64 20 2d 3e 20 28 75 73 65 72 20  ts: id -> (user 
13c0: 63 6f 6d 6d 69 74 20 73 74 61 72 74 20 65 6e 64  commit start end
13d0: 20 64 65 70 74 68 20 28 66 69 6c 65 20 2d 3e 20   depth (file -> 
13e0: 28 6f 70 20 72 65 76 29 29 29 0a 0a 20 20 20 20  (op rev)))..    
13f0: 76 61 72 69 61 62 6c 65 20 6e 63 73 20 20 20 20  variable ncs    
1400: 20 20 3b 20 73 65 74 20 20 20 20 20 20 20 6e 63    ; set       nc
1410: 73 20 20 20 30 20 20 3b 20 23 20 43 6f 75 6e 74  s   0  ; # Count
1420: 65 72 20 66 6f 72 20 63 68 61 6e 67 65 73 65 74  er for changeset
1430: 73 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 63  s.    variable c
1440: 73 65 74 73 20 20 20 20 3b 20 61 72 72 61 79 20  sets    ; array 
1450: 73 65 74 20 63 73 65 74 73 20 7b 7d 20 3b 20 23  set csets {} ; #
1460: 20 43 68 61 6e 67 65 73 65 74 20 64 61 74 61 0a   Changeset data.
1470: 7d 0a 0a 23 20 42 75 69 6c 64 69 6e 67 20 74 68  }..# Building th
1480: 65 20 72 65 76 69 73 69 6f 6e 20 74 72 65 65 20  e revision tree 
1490: 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 73  from the changes
14a0: 65 74 73 2e 0a 23 20 4c 69 6d 69 74 61 74 69 6f  ets..# Limitatio
14b0: 6e 3a 20 43 75 72 72 65 6e 74 6c 79 20 6f 6e 6c  n: Currently onl
14c0: 79 20 74 72 75 6e 6b 20 63 73 65 74 73 20 69 73  y trunk csets is
14d0: 20 68 61 6e 64 6c 65 64 2e 0a 23 20 4c 69 6d 69   handled..# Limi
14e0: 74 61 74 69 6f 6e 3a 20 44 65 61 64 20 66 69 6c  tation: Dead fil
14f0: 65 73 20 61 72 65 20 6e 6f 74 20 72 65 6d 6f 76  es are not remov
1500: 65 64 2c 20 69 2e 65 2e 20 6e 6f 20 27 52 27 20  ed, i.e. no 'R' 
1510: 61 63 74 69 6f 6e 73 20 72 69 67 68 74 20 6e 6f  actions right no
1520: 77 2e 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63  w...proc ::vc::c
1530: 76 73 3a 3a 77 73 3a 3a 72 74 72 65 65 20 7b 7d  vs::ws::rtree {}
1540: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20   {.    variable 
1550: 63 73 65 74 73 0a 20 20 20 20 76 61 72 69 61 62  csets.    variab
1560: 6c 65 20 72 74 72 65 65 20 7b 7d 0a 20 20 20 20  le rtree {}.    
1570: 76 61 72 69 61 62 6c 65 20 6e 74 72 75 6e 6b 20  variable ntrunk 
1580: 30 0a 0a 20 20 20 20 77 72 69 74 65 20 30 20 63  0..    write 0 c
1590: 76 73 20 22 45 78 74 72 61 63 74 69 6e 67 20 74  vs "Extracting t
15a0: 68 65 20 74 72 75 6e 6b 22 0a 0a 20 20 20 20 73  he trunk"..    s
15b0: 65 74 20 72 74 72 65 65 20 5b 73 74 72 75 63 74  et rtree [struct
15c0: 3a 3a 74 72 65 65 20 3a 3a 76 63 3a 3a 63 76 73  ::tree ::vc::cvs
15d0: 3a 3a 77 73 3a 3a 52 54 5d 0a 20 20 20 20 24 72  ::ws::RT].    $r
15e0: 74 72 65 65 20 72 65 6e 61 6d 65 20 72 6f 6f 74  tree rename root
15f0: 20 30 20 3b 20 23 20 52 6f 6f 74 20 69 73 20 66   0 ; # Root is f
1600: 69 72 73 74 20 63 68 61 6e 67 65 73 65 74 2c 20  irst changeset, 
1610: 61 6c 77 61 79 73 2e 0a 20 20 20 20 73 65 74 20  always..    set 
1620: 74 72 75 6e 6b 20 30 0a 20 20 20 20 73 65 74 20  trunk 0.    set 
1630: 6e 74 72 75 6e 6b 20 31 20 3b 20 23 20 52 6f 6f  ntrunk 1 ; # Roo
1640: 74 20 69 73 20 6f 6e 20 74 68 65 20 74 72 75 6e  t is on the trun
1650: 6b 2e 0a 20 20 20 20 73 65 74 20 62 20 20 20 20  k..    set b    
1660: 20 20 30 20 3b 20 23 20 4e 6f 20 62 72 61 6e 63    0 ; # No branc
1670: 68 20 63 73 65 74 73 20 66 6f 75 6e 64 20 79 65  h csets found ye
1680: 74 2e 0a 0a 20 20 20 20 23 20 45 78 74 72 61 63  t...    # Extrac
1690: 74 69 6e 67 20 74 68 65 20 74 72 75 6e 6b 20 69  ting the trunk i
16a0: 73 20 65 61 73 79 2c 20 73 69 6d 70 6c 79 20 62  s easy, simply b
16b0: 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 74 68 65  y looking at the
16c0: 20 69 6e 76 6f 6c 76 65 64 0a 20 20 20 20 23 20   involved.    # 
16d0: 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 73 2e  version numbers.
16e0: 20 0a 0a 20 20 20 20 66 6f 72 65 61 63 68 20 63   ..    foreach c
16f0: 20 5b 6c 72 61 6e 67 65 20 5b 6c 73 6f 72 74 20   [lrange [lsort 
1700: 2d 69 6e 74 65 67 65 72 20 5b 61 72 72 61 79 20  -integer [array 
1710: 6e 61 6d 65 73 20 63 73 65 74 73 5d 5d 20 31 20  names csets]] 1 
1720: 65 6e 64 5d 20 7b 0a 09 66 6f 72 65 61 63 68 20  end] {..foreach 
1730: 7b 75 20 63 6d 20 73 20 65 20 72 64 20 66 7d 20  {u cm s e rd f} 
1740: 24 63 73 65 74 73 28 24 63 29 20 62 72 65 61 6b  $csets($c) break
1750: 0a 0a 09 23 20 49 67 6e 6f 72 65 20 62 72 61 6e  ...# Ignore bran
1760: 63 68 20 63 68 61 6e 67 65 73 2c 20 6a 75 73 74  ch changes, just
1770: 20 63 6f 75 6e 74 20 74 68 65 6d 20 66 6f 72 20   count them for 
1780: 74 68 65 20 73 74 61 74 69 73 74 69 63 73 2e 0a  the statistics..
1790: 09 69 66 20 7b 24 72 64 20 21 3d 20 32 7d 20 7b  .if {$rd != 2} {
17a0: 0a 09 20 20 20 20 69 6e 63 72 20 62 0a 09 20 20  ..    incr b..  
17b0: 20 20 63 6f 6e 74 69 6e 75 65 0a 09 7d 0a 0a 09    continue..}...
17c0: 23 20 54 72 75 6e 6b 20 72 65 76 69 73 69 6f 6e  # Trunk revision
17d0: 2c 20 63 6f 6e 6e 65 63 74 20 74 6f 2c 20 61 6e  , connect to, an
17e0: 64 20 75 70 64 61 74 65 20 74 68 65 20 68 65 61  d update the hea
17f0: 64 2e 0a 09 24 72 74 72 65 65 20 69 6e 73 65 72  d...$rtree inser
1800: 74 20 24 74 72 75 6e 6b 20 65 6e 64 20 24 63 0a  t $trunk end $c.
1810: 09 73 65 74 20 74 72 75 6e 6b 20 24 63 0a 09 69  .set trunk $c..i
1820: 6e 63 72 20 6e 74 72 75 6e 6b 0a 20 20 20 20 7d  ncr ntrunk.    }
1830: 0a 0a 20 20 20 20 77 72 69 74 65 20 30 20 63 76  ..    write 0 cv
1840: 73 20 22 50 72 6f 63 65 73 73 65 64 20 24 6e 74  s "Processed $nt
1850: 72 75 6e 6b 20 74 72 75 6e 6b 20 20 5b 65 78 70  runk trunk  [exp
1860: 72 20 7b 28 24 6e 74 72 75 6e 6b 20 3d 3d 20 31  r {($ntrunk == 1
1870: 29 20 3f 20 22 63 68 61 6e 67 65 73 65 74 22 20  ) ? "changeset" 
1880: 3a 20 22 63 68 61 6e 67 65 73 65 74 73 22 7d 5d  : "changesets"}]
1890: 22 0a 20 20 20 20 77 72 69 74 65 20 30 20 63 76  ".    write 0 cv
18a0: 73 20 22 49 67 6e 6f 72 65 64 20 20 20 24 62 20  s "Ignored   $b 
18b0: 62 72 61 6e 63 68 20 5b 65 78 70 72 20 7b 28 24  branch [expr {($
18c0: 62 20 3d 3d 20 31 29 20 3f 20 22 63 68 61 6e 67  b == 1) ? "chang
18d0: 65 73 65 74 22 20 3a 20 22 63 68 61 6e 67 65 73  eset" : "changes
18e0: 65 74 73 22 7d 5d 22 0a 20 20 20 20 72 65 74 75  ets"}]".    retu
18f0: 72 6e 0a 7d 0a 0a 6e 61 6d 65 73 70 61 63 65 20  rn.}..namespace 
1900: 65 76 61 6c 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a  eval ::vc::cvs::
1910: 77 73 20 7b 0a 20 20 20 20 23 20 54 72 65 65 20  ws {.    # Tree 
1920: 68 6f 6c 64 69 6e 67 20 74 72 75 6e 6b 20 61 6e  holding trunk an
1930: 64 20 62 72 61 6e 63 68 20 69 6e 66 6f 72 6d 61  d branch informa
1940: 74 69 6f 6e 20 28 73 74 72 75 63 74 3a 3a 74 72  tion (struct::tr
1950: 65 65 29 2e 0a 20 20 20 20 23 20 4e 6f 64 65 20  ee)..    # Node 
1960: 6e 61 6d 65 73 20 61 72 65 20 63 73 65 74 20 69  names are cset i
1970: 64 27 73 2e 0a 0a 20 20 20 20 76 61 72 69 61 62  d's...    variab
1980: 6c 65 20 72 74 72 65 65 20 7b 7d 0a 20 20 20 20  le rtree {}.    
1990: 76 61 72 69 61 62 6c 65 20 6e 74 72 75 6e 6b 20  variable ntrunk 
19a0: 30 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a  0.}..proc ::vc::
19b0: 63 76 73 3a 3a 77 73 3a 3a 77 6f 72 6b 73 70 61  cvs::ws::workspa
19c0: 63 65 20 7b 7d 20 7b 0a 20 20 20 20 76 61 72 69  ce {} {.    vari
19d0: 61 62 6c 65 20 63 77 64 20 5b 70 77 64 5d 0a 20  able cwd [pwd]. 
19e0: 20 20 20 76 61 72 69 61 62 6c 65 20 77 6f 72 6b     variable work
19f0: 73 70 61 63 65 20 5b 66 69 6c 65 75 74 69 6c 3a  space [fileutil:
1a00: 3a 74 65 6d 70 66 69 6c 65 20 69 6d 70 6f 72 74  :tempfile import
1a10: 46 5f 63 76 73 5f 77 73 5f 5d 0a 20 20 20 20 66  F_cvs_ws_].    f
1a20: 69 6c 65 20 64 65 6c 65 74 65 20 24 77 6f 72 6b  ile delete $work
1a30: 73 70 61 63 65 0a 20 20 20 20 66 69 6c 65 20 6d  space.    file m
1a40: 6b 64 69 72 20 20 24 77 6f 72 6b 73 70 61 63 65  kdir  $workspace
1a50: 0a 0a 20 20 20 20 77 72 69 74 65 20 30 20 63 76  ..    write 0 cv
1a60: 73 20 22 57 6f 72 6b 73 70 61 63 65 3a 20 20 24  s "Workspace:  $
1a70: 77 6f 72 6b 73 70 61 63 65 22 0a 0a 20 20 20 20  workspace"..    
1a80: 63 64 20 20 20 20 20 24 77 6f 72 6b 73 70 61 63  cd     $workspac
1a90: 65 20 3b 20 23 20 43 68 65 63 6b 6f 75 74 73 20  e ; # Checkouts 
1aa0: 67 6f 20 68 65 72 65 2e 0a 20 20 20 20 72 65 74  go here..    ret
1ab0: 75 72 6e 20 24 77 6f 72 6b 73 70 61 63 65 0a 7d  urn $workspace.}
1ac0: 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73  ..proc ::vc::cvs
1ad0: 3a 3a 77 73 3a 3a 77 73 69 67 6e 6f 72 65 20 7b  ::ws::wsignore {
1ae0: 70 61 74 68 7d 20 7b 0a 20 20 20 20 23 20 49 67  path} {.    # Ig
1af0: 6e 6f 72 65 20 43 56 53 20 61 64 6d 69 6e 20 66  nore CVS admin f
1b00: 69 6c 65 73 2e 0a 20 20 20 20 69 66 20 7b 5b 73  iles..    if {[s
1b10: 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 2f 43 56  tring match */CV
1b20: 53 2f 2a 20 24 70 61 74 68 5d 7d 20 7b 72 65 74  S/* $path]} {ret
1b30: 75 72 6e 20 31 7d 0a 20 20 20 20 72 65 74 75 72  urn 1}.    retur
1b40: 6e 20 30 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63  n 0.}..proc ::vc
1b50: 3a 3a 63 76 73 3a 3a 77 73 3a 3a 77 73 63 6c 65  ::cvs::ws::wscle
1b60: 61 72 20 7b 7d 20 7b 0a 20 20 20 20 76 61 72 69  ar {} {.    vari
1b70: 61 62 6c 65 20 63 77 64 0a 20 20 20 20 76 61 72  able cwd.    var
1b80: 69 61 62 6c 65 20 77 6f 72 6b 73 70 61 63 65 0a  iable workspace.
1b90: 20 20 20 20 63 64 20 24 63 77 64 0a 20 20 20 20      cd $cwd.    
1ba0: 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72  file delete -for
1bb0: 63 65 20 24 77 6f 72 6b 73 70 61 63 65 0a 20 20  ce $workspace.  
1bc0: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63    return.}..proc
1bd0: 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a   ::vc::cvs::ws::
1be0: 77 73 73 65 74 75 70 20 7b 63 7d 20 7b 0a 20 20  wssetup {c} {.  
1bf0: 20 20 76 61 72 69 61 62 6c 65 20 63 73 65 74 73    variable csets
1c00: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 62 61  .    variable ba
1c10: 73 65 0a 0a 20 20 20 20 23 20 70 77 64 20 3d 20  se..    # pwd = 
1c20: 77 6f 72 6b 73 70 61 63 65 0a 0a 20 20 20 20 66  workspace..    f
1c30: 6f 72 65 61 63 68 20 7b 75 20 63 6d 20 73 20 65  oreach {u cm s e
1c40: 20 72 64 20 66 73 7d 20 24 63 73 65 74 73 28 24   rd fs} $csets($
1c50: 63 29 20 62 72 65 61 6b 0a 0a 20 20 20 20 77 72  c) break..    wr
1c60: 69 74 65 20 31 20 63 76 73 20 22 40 20 20 24 73  ite 1 cvs "@  $s
1c70: 22 0a 0a 20 20 20 20 66 6f 72 65 61 63 68 20 6c  "..    foreach l
1c80: 20 5b 73 70 6c 69 74 20 5b 73 74 72 69 6e 67 20   [split [string 
1c90: 74 72 69 6d 20 24 63 6d 5d 20 5c 6e 5d 20 7b 0a  trim $cm] \n] {.
1ca0: 09 77 72 69 74 65 20 31 20 63 76 73 20 22 7c 20  .write 1 cvs "| 
1cb0: 20 24 6c 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20   $l".    }..    
1cc0: 66 6f 72 65 61 63 68 20 7b 66 20 6f 72 7d 20 24  foreach {f or} $
1cd0: 66 73 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b 6f  fs {..foreach {o
1ce0: 70 20 72 7d 20 24 6f 72 20 62 72 65 61 6b 0a 09  p r} $or break..
1cf0: 77 72 69 74 65 20 32 20 63 76 73 20 22 24 6f 70  write 2 cvs "$op
1d00: 20 20 24 66 20 24 72 22 0a 0a 09 69 66 20 7b 24    $f $r"...if {$
1d10: 6f 70 20 65 71 20 22 52 22 7d 20 7b 0a 09 20 20  op eq "R"} {..  
1d20: 20 20 23 20 52 65 6d 6f 76 65 20 66 69 6c 65 20    # Remove file 
1d30: 66 72 6f 6d 20 77 6f 72 6b 73 70 61 63 65 2e 20  from workspace. 
1d40: 50 72 75 6e 65 20 65 6d 70 74 79 20 64 69 72 65  Prune empty dire
1d50: 63 74 6f 72 69 65 73 2e 0a 09 20 20 20 20 23 0a  ctories...    #.
1d60: 09 20 20 20 20 23 20 4e 4f 54 45 3a 20 41 20 64  .    # NOTE: A d
1d70: 65 61 64 2d 66 69 72 73 74 20 66 69 6c 65 20 28  ead-first file (
1d80: 72 65 76 20 31 2e 31 20 64 65 61 64 29 20 77 69  rev 1.1 dead) wi
1d90: 6c 6c 20 6e 65 76 65 72 20 68 61 76 65 0a 09 20  ll never have.. 
1da0: 20 20 20 23 20 65 78 69 73 74 65 64 2e 0a 09 20     # existed... 
1db0: 20 20 20 23 0a 09 20 20 20 20 23 20 4e 4f 54 45     #..    # NOTE
1dc0: 3a 20 4c 6f 67 69 63 61 6c 6c 79 20 65 6d 70 74  : Logically empt
1dd0: 79 20 64 69 72 65 63 74 6f 72 69 65 73 20 73 74  y directories st
1de0: 69 6c 6c 20 70 68 79 73 69 63 61 6c 6c 79 0a 09  ill physically..
1df0: 20 20 20 20 23 20 63 6f 6e 74 61 69 6e 20 74 68      # contain th
1e00: 65 20 43 56 53 20 61 64 6d 69 6e 20 64 69 72 65  e CVS admin dire
1e10: 63 74 6f 72 79 2c 20 68 65 6e 63 65 20 74 68 65  ctory, hence the
1e20: 20 63 68 65 63 6b 20 66 6f 72 20 3d 3d 0a 09 20   check for ==.. 
1e30: 20 20 20 23 20 31 2c 20 6e 6f 74 20 3d 3d 20 30     # 1, not == 0
1e40: 2e 20 54 68 65 72 65 20 6d 69 67 68 74 20 61 6c  . There might al
1e50: 73 6f 20 62 65 20 68 69 64 64 65 6e 20 66 69 6c  so be hidden fil
1e60: 65 73 2c 20 77 65 20 63 6f 75 6e 74 0a 09 20 20  es, we count..  
1e70: 20 20 23 20 74 68 65 6d 20 61 73 20 77 65 6c 6c    # them as well
1e80: 2e 20 41 6c 77 61 79 73 20 68 69 64 64 65 6e 20  . Always hidden 
1e90: 61 72 65 20 2e 20 61 6e 64 20 2e 2e 20 61 6e 64  are . and .. and
1ea0: 20 74 68 65 79 20 64 6f 20 6e 6f 74 0a 09 20 20   they do not..  
1eb0: 20 20 23 20 63 6f 75 6e 74 20 61 73 20 75 73 65    # count as use
1ec0: 72 20 66 69 6c 65 2e 0a 0a 09 20 20 20 20 66 69  r file....    fi
1ed0: 6c 65 20 64 65 6c 65 74 65 20 24 66 0a 09 20 20  le delete $f..  
1ee0: 20 20 73 65 74 20 66 64 20 5b 66 69 6c 65 20 64    set fd [file d
1ef0: 69 72 6e 61 6d 65 20 24 66 5d 0a 09 20 20 20 20  irname $f]..    
1f00: 69 66 20 7b 0a 09 09 28 5b 6c 6c 65 6e 67 74 68  if {...([llength
1f10: 20 5b 67 6c 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61   [glob -nocompla
1f20: 69 6e 20 2d 64 69 72 65 63 74 6f 72 79 20 20 20  in -directory   
1f30: 20 20 20 20 20 20 20 20 20 20 20 24 66 64 20 2a             $fd *
1f40: 5d 5d 20 3d 3d 20 31 29 20 26 26 0a 09 09 28 5b  ]] == 1) &&...([
1f50: 6c 6c 65 6e 67 74 68 20 5b 67 6c 6f 62 20 2d 6e  llength [glob -n
1f60: 6f 63 6f 6d 70 6c 61 69 6e 20 2d 64 69 72 65 63  ocomplain -direc
1f70: 74 6f 72 79 20 2d 74 79 70 65 20 68 69 64 64 65  tory -type hidde
1f80: 6e 20 24 66 64 20 2a 5d 5d 20 3d 3d 20 32 29 0a  n $fd *]] == 2).
1f90: 09 20 20 20 20 7d 20 7b 0a 09 09 66 69 6c 65 20  .    } {...file 
1fa0: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 66  delete -force $f
1fb0: 64 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c 73 65  d..    }..} else
1fc0: 20 7b 0a 09 20 20 20 20 23 20 41 64 64 65 64 20   {..    # Added 
1fd0: 6f 72 20 6d 6f 64 69 66 69 65 64 2c 20 70 75 74  or modified, put
1fe0: 20 74 68 65 20 72 65 71 75 65 73 74 65 64 20 76   the requested v
1ff0: 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20 66 69  ersion of the fi
2000: 6c 65 0a 09 20 20 20 20 23 20 69 6e 74 6f 20 74  le..    # into t
2010: 68 65 20 77 6f 72 6b 73 70 61 63 65 2e 0a 0a 09  he workspace....
2020: 20 20 20 20 69 66 20 7b 5b 63 61 74 63 68 20 7b      if {[catch {
2030: 0a 09 09 64 6f 76 61 20 2d 64 20 24 62 61 73 65  ...dova -d $base
2040: 20 63 6f 20 2d 72 20 24 72 20 24 66 0a 09 20 20   co -r $r $f..  
2050: 20 20 7d 20 6d 73 67 5d 7d 20 7b 0a 09 09 69 66    } msg]} {...if
2060: 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20   {[string match 
2070: 7b 2a 69 6e 76 61 6c 69 64 20 63 68 61 6e 67 65  {*invalid change
2080: 20 74 65 78 74 2a 7d 20 24 6d 73 67 5d 7d 20 7b   text*} $msg]} {
2090: 0a 09 09 20 20 20 20 23 20 54 68 65 20 61 72 63  ...    # The arc
20a0: 68 69 76 65 20 6f 66 20 74 68 65 20 66 69 6c 65  hive of the file
20b0: 20 69 73 20 63 6f 72 72 75 70 74 65 64 20 61 6e   is corrupted an
20c0: 64 20 74 68 65 0a 09 09 20 20 20 20 23 20 63 68  d the...    # ch
20d0: 6f 73 65 6e 20 76 65 72 73 69 6f 6e 20 6e 6f 74  osen version not
20e0: 20 61 63 63 65 73 73 69 62 6c 65 20 64 75 65 20   accessible due 
20f0: 74 6f 20 74 68 61 74 2e 20 57 65 0a 09 09 20 20  to that. We...  
2100: 20 20 23 20 72 65 70 6f 72 74 20 74 68 65 20 70    # report the p
2110: 72 6f 62 6c 65 6d 2c 20 62 75 74 20 6f 74 68 65  roblem, but othe
2120: 72 77 69 73 65 20 69 67 6e 6f 72 65 20 69 74 2e  rwise ignore it.
2130: 20 41 73 0a 09 09 20 20 20 20 23 20 61 20 63 6f   As...    # a co
2140: 6e 73 65 71 75 65 6e 63 65 20 74 68 65 20 66 6f  nsequence the fo
2150: 73 73 69 6c 20 72 65 70 6f 73 69 74 6f 72 79 20  ssil repository 
2160: 77 69 6c 6c 20 6e 6f 74 0a 09 09 20 20 20 20 23  will not...    #
2170: 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 66 75 6c   contain the ful
2180: 6c 20 68 69 73 74 6f 72 79 20 6f 66 20 74 68 65  l history of the
2190: 20 6e 61 6d 65 64 20 66 69 6c 65 2e 20 42 79 0a   named file. By.
21a0: 09 09 20 20 20 20 23 20 69 67 6e 6f 72 69 6e 67  ..    # ignoring
21b0: 20 74 68 65 20 70 72 6f 62 6c 65 6d 20 77 65 20   the problem we 
21c0: 68 6f 77 65 76 65 72 20 67 65 74 20 61 73 20 6d  however get as m
21d0: 75 63 68 20 61 73 0a 09 09 20 20 20 20 23 20 69  uch as...    # i
21e0: 73 20 70 6f 73 73 69 62 6c 65 2e 0a 0a 09 09 20  s possible..... 
21f0: 20 20 20 77 72 69 74 65 20 30 20 63 76 73 20 22     write 0 cvs "
2200: 45 45 20 43 6f 72 72 75 70 74 65 64 20 61 72 63  EE Corrupted arc
2210: 68 69 76 65 20 66 69 6c 65 2e 20 49 6e 61 63 63  hive file. Inacc
2220: 65 73 73 69 62 6c 65 20 72 65 76 69 73 69 6f 6e  essible revision
2230: 2e 22 0a 09 09 20 20 20 20 63 6f 6e 74 69 6e 75  ."...    continu
2240: 65 0a 09 09 7d 0a 09 09 72 65 74 75 72 6e 20 2d  e...}...return -
2250: 63 6f 64 65 20 65 72 72 6f 72 20 24 6d 73 67 0a  code error $msg.
2260: 09 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a  .    }..}.    }.
2270: 0a 20 20 20 20 23 20 50 72 6f 76 69 64 65 20 6d  .    # Provide m
2280: 65 74 61 64 61 74 61 20 61 62 6f 75 74 20 74 68  etadata about th
2290: 65 20 63 68 61 6e 67 65 73 65 74 20 74 68 65 20  e changeset the 
22a0: 62 61 63 6b 65 6e 64 20 6d 61 79 20 77 69 73 68  backend may wish
22b0: 20 74 6f 20 68 61 76 65 0a 20 20 20 20 72 65 74   to have.    ret
22c0: 75 72 6e 20 5b 6c 69 73 74 20 24 75 20 24 63 6d  urn [list $u $cm
22d0: 20 24 73 5d 0a 7d 0a 0a 6e 61 6d 65 73 70 61 63   $s].}..namespac
22e0: 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a 63 76 73  e eval ::vc::cvs
22f0: 3a 3a 77 73 20 7b 0a 20 20 20 20 23 20 57 6f 72  ::ws {.    # Wor
2300: 6b 73 70 61 63 65 20 77 68 65 72 65 20 63 68 65  kspace where che
2310: 63 6b 6f 75 74 73 20 68 61 70 70 65 6e 0a 20 20  ckouts happen.  
2320: 20 20 23 20 43 75 72 72 65 6e 74 20 77 6f 72 6b    # Current work
2330: 69 6e 67 20 64 69 72 65 63 74 6f 72 79 20 74 6f  ing directory to
2340: 20 67 6f 20 62 61 63 6b 20 74 6f 20 61 66 74 65   go back to afte
2350: 72 20 74 68 65 20 69 6d 70 6f 72 74 2e 0a 0a 20  r the import... 
2360: 20 20 20 76 61 72 69 61 62 6c 65 20 77 6f 72 6b     variable work
2370: 73 70 61 63 65 20 7b 7d 0a 20 20 20 20 76 61 72  space {}.    var
2380: 69 61 62 6c 65 20 63 77 64 20 20 20 20 20 20 20  iable cwd       
2390: 7b 7d 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a  {}.}..proc ::vc:
23a0: 3a 63 76 73 3a 3a 77 73 3a 3a 66 6f 72 65 61 63  :cvs::ws::foreac
23b0: 68 5f 63 73 65 74 20 7b 63 76 20 6e 6f 64 65 20  h_cset {cv node 
23c0: 73 63 72 69 70 74 7d 20 7b 0a 20 20 20 20 75 70  script} {.    up
23d0: 76 61 72 20 31 20 24 63 76 20 63 0a 20 20 20 20  var 1 $cv c.    
23e0: 76 61 72 69 61 62 6c 65 20 72 74 72 65 65 0a 0a  variable rtree..
23f0: 20 20 20 20 73 65 74 20 63 20 24 6e 6f 64 65 0a      set c $node.
2400: 20 20 20 20 77 68 69 6c 65 20 7b 31 7d 20 7b 0a      while {1} {.
2410: 09 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68  .set code [catch
2420: 20 7b 75 70 6c 65 76 65 6c 20 31 20 24 73 63 72   {uplevel 1 $scr
2430: 69 70 74 7d 20 72 65 73 5d 0a 0a 09 23 20 30 20  ipt} res]...# 0 
2440: 2d 20 6f 6b 2c 20 31 20 2d 20 65 72 72 6f 72 2c  - ok, 1 - error,
2450: 20 32 20 2d 20 72 65 74 75 72 6e 2c 20 33 20 2d   2 - return, 3 -
2460: 20 62 72 65 61 6b 2c 20 34 20 2d 20 63 6f 6e 74   break, 4 - cont
2470: 69 6e 75 65 0a 09 73 77 69 74 63 68 20 2d 2d 20  inue..switch -- 
2480: 24 63 6f 64 65 20 7b 0a 09 20 20 20 20 30 20 7b  $code {..    0 {
2490: 7d 0a 09 20 20 20 20 31 20 7b 20 72 65 74 75 72  }..    1 { retur
24a0: 6e 20 2d 65 72 72 6f 72 63 6f 64 65 20 24 3a 3a  n -errorcode $::
24b0: 65 72 72 6f 72 43 6f 64 65 20 2d 65 72 72 6f 72  errorCode -error
24c0: 69 6e 66 6f 20 24 3a 3a 65 72 72 6f 72 49 6e 66  info $::errorInf
24d0: 6f 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 24 72  o -code error $r
24e0: 65 73 20 7d 0a 09 20 20 20 20 32 20 7b 7d 0a 09  es }..    2 {}..
24f0: 20 20 20 20 33 20 7b 20 72 65 74 75 72 6e 20 7d      3 { return }
2500: 0a 09 20 20 20 20 34 20 7b 7d 0a 09 20 20 20 20  ..    4 {}..    
2510: 64 65 66 61 75 6c 74 20 7b 0a 09 09 72 65 74 75  default {...retu
2520: 72 6e 20 2d 63 6f 64 65 20 24 63 6f 64 65 20 24  rn -code $code $
2530: 72 65 73 75 6c 74 0a 09 20 20 20 20 7d 0a 09 7d  result..    }..}
2540: 0a 0a 09 23 20 53 74 6f 70 20 6f 6e 20 72 65 61  ...# Stop on rea
2550: 63 68 69 6e 67 20 74 68 65 20 68 65 61 64 2e 0a  ching the head..
2560: 09 69 66 20 7b 21 5b 6c 6c 65 6e 67 74 68 20 5b  .if {![llength [
2570: 24 72 74 72 65 65 20 63 68 69 6c 64 72 65 6e 20  $rtree children 
2580: 24 63 5d 5d 7d 20 62 72 65 61 6b 0a 0a 09 23 70  $c]]} break...#p
2590: 75 74 73 20 3c 5b 24 72 74 72 65 65 20 63 68 69  uts <[$rtree chi
25a0: 6c 64 72 65 6e 20 24 63 5d 3e 0a 0a 09 23 20 47  ldren $c]>...# G
25b0: 6f 20 74 6f 20 6e 65 78 74 20 63 68 69 6c 64 20  o to next child 
25c0: 69 6e 20 74 72 75 6e 6b 20 28 6c 65 66 74 6d 6f  in trunk (leftmo
25d0: 73 74 29 2e 0a 09 73 65 74 20 63 20 5b 6c 69 6e  st)...set c [lin
25e0: 64 65 78 20 5b 24 72 74 72 65 65 20 63 68 69 6c  dex [$rtree chil
25f0: 64 72 65 6e 20 24 63 5d 20 30 5d 0a 20 20 20 20  dren $c] 0].    
2600: 7d 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a  }.    return.}..
2610: 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a  proc ::vc::cvs::
2620: 77 73 3a 3a 72 6f 6f 74 20 7b 7d 20 7b 0a 20 20  ws::root {} {.  
2630: 20 20 72 65 74 75 72 6e 20 30 0a 7d 0a 0a 70 72    return 0.}..pr
2640: 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73  oc ::vc::cvs::ws
2650: 3a 3a 6e 74 72 75 6e 6b 20 7b 7d 20 7b 0a 20 20  ::ntrunk {} {.  
2660: 20 20 76 61 72 69 61 62 6c 65 20 6e 74 72 75 6e    variable ntrun
2670: 6b 0a 20 20 20 20 72 65 74 75 72 6e 20 20 24 6e  k.    return  $n
2680: 74 72 75 6e 6b 0a 7d 0a 0a 70 72 6f 63 20 3a 3a  trunk.}..proc ::
2690: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 6e 63 73  vc::cvs::ws::ncs
26a0: 65 74 73 20 7b 7d 20 7b 0a 20 20 20 20 76 61 72  ets {} {.    var
26b0: 69 61 62 6c 65 20 6e 63 73 0a 20 20 20 20 72 65  iable ncs.    re
26c0: 74 75 72 6e 20 20 24 6e 63 73 0a 7d 0a 0a 70 72  turn  $ncs.}..pr
26d0: 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73  oc ::vc::cvs::ws
26e0: 3a 3a 75 75 69 64 20 7b 63 20 75 75 69 64 7d 20  ::uuid {c uuid} 
26f0: 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 72  {.    variable r
2700: 74 72 65 65 0a 20 20 20 20 24 72 74 72 65 65 20  tree.    $rtree 
2710: 73 65 74 20 24 63 20 75 75 69 64 20 24 75 75 69  set $c uuid $uui
2720: 64 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a  d.    return.}..
2730: 23 20 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 2d 2d 2d 2d 2d  ----------------
2770: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
2780: 23 20 49 6e 74 65 72 6e 61 6c 20 68 65 6c 70 65  # Internal helpe
2790: 72 20 63 6f 6d 6d 61 6e 64 73 3a 20 43 68 61 6e  r commands: Chan
27a0: 67 65 73 65 74 20 69 6e 73 70 65 63 74 69 6f 6e  geset inspection
27b0: 20 61 6e 64 20 63 6f 6e 73 74 72 75 63 74 69 6f   and constructio
27c0: 6e 2e 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63  n...proc ::vc::c
27d0: 76 73 3a 3a 77 73 3a 3a 43 53 43 6c 65 61 72 20  vs::ws::CSClear 
27e0: 7b 7d 20 7b 0a 20 20 20 20 75 70 76 61 72 20 31  {} {.    upvar 1
27f0: 20 73 74 61 72 74 20 73 74 61 72 74 20 65 6e 64   start start end
2800: 20 65 6e 64 20 63 6d 20 63 6d 20 75 73 65 72 20   end cm cm user 
2810: 75 73 65 72 20 66 69 6c 65 73 20 66 69 6c 65 73  user files files
2820: 20 6c 61 73 74 64 20 6c 61 73 74 64 0a 0a 20 20   lastd lastd..  
2830: 20 20 73 65 74 20 73 74 61 72 74 20 7b 7d 0a 20    set start {}. 
2840: 20 20 20 73 65 74 20 65 6e 64 20 20 20 7b 7d 0a     set end   {}.
2850: 20 20 20 20 73 65 74 20 63 6d 20 20 20 20 7b 7d      set cm    {}
2860: 0a 20 20 20 20 73 65 74 20 75 73 65 72 20 20 7b  .    set user  {
2870: 7d 0a 20 20 20 20 73 65 74 20 6c 61 73 74 64 20  }.    set lastd 
2880: 7b 7d 0a 20 20 20 20 61 72 72 61 79 20 75 6e 73  {}.    array uns
2890: 65 74 20 66 69 6c 65 73 20 2a 0a 20 20 20 20 61  et files *.    a
28a0: 72 72 61 79 20 73 65 74 20 66 69 6c 65 73 20 7b  rray set files {
28b0: 7d 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a  }.    return.}..
28c0: 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a  proc ::vc::cvs::
28d0: 77 73 3a 3a 43 53 4e 6f 6e 65 20 7b 7d 20 7b 0a  ws::CSNone {} {.
28e0: 20 20 20 20 75 70 76 61 72 20 31 20 73 74 61 72      upvar 1 star
28f0: 74 20 73 74 61 72 74 0a 20 20 20 20 72 65 74 75  t start.    retu
2900: 72 6e 20 5b 65 78 70 72 20 7b 24 73 74 61 72 74  rn [expr {$start
2910: 20 65 71 20 22 22 7d 5d 0a 7d 0a 0a 70 72 6f 63   eq ""}].}..proc
2920: 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a   ::vc::cvs::ws::
2930: 43 53 4e 65 77 20 7b 65 6e 74 72 79 7d 20 7b 0a  CSNew {entry} {.
2940: 20 20 20 20 75 70 76 61 72 20 31 20 73 74 61 72      upvar 1 star
2950: 74 20 73 74 61 72 74 20 65 6e 64 20 65 6e 64 20  t start end end 
2960: 63 6d 20 63 6d 20 75 73 65 72 20 75 73 65 72 20  cm cm user user 
2970: 66 69 6c 65 73 20 66 69 6c 65 73 20 6c 61 73 74  files files last
2980: 64 20 6c 61 73 74 64 20 72 65 61 73 6f 6e 20 72  d lastd reason r
2990: 65 61 73 6f 6e 0a 0a 20 20 20 20 23 70 75 74 73  eason..    #puts
29a0: 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 73 74 64 6f   -nonewline stdo
29b0: 75 74 20 2e 20 3b 20 66 6c 75 73 68 20 73 74 64  ut . ; flush std
29c0: 6f 75 74 0a 0a 20 20 20 20 66 6f 72 65 61 63 68  out..    foreach
29d0: 20 7b 6f 70 20 74 73 20 61 20 72 65 76 20 66 20   {op ts a rev f 
29e0: 65 63 6d 7d 20 24 65 6e 74 72 79 20 62 72 65 61  ecm} $entry brea
29f0: 6b 0a 0a 20 20 20 20 23 20 55 73 65 72 20 63 68  k..    # User ch
2a00: 61 6e 67 65 0a 20 20 20 20 69 66 20 7b 24 61 20  ange.    if {$a 
2a10: 6e 65 20 24 75 73 65 72 7d 20 7b 73 65 74 20 72  ne $user} {set r
2a20: 65 61 73 6f 6e 20 75 73 65 72 20 3b 20 72 65 74  eason user ; ret
2a30: 75 72 6e 20 31 7d 0a 0a 20 20 20 20 23 20 46 69  urn 1}..    # Fi
2a40: 6c 65 20 61 6c 72 65 61 64 79 20 69 6e 20 63 75  le already in cu
2a50: 72 72 65 6e 74 20 63 73 65 74 0a 20 20 20 20 69  rrent cset.    i
2a60: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
2a70: 66 69 6c 65 73 28 24 66 29 5d 7d 20 7b 73 65 74  files($f)]} {set
2a80: 20 72 65 61 73 6f 6e 20 66 69 6c 65 20 3b 20 72   reason file ; r
2a90: 65 74 75 72 6e 20 31 7d 0a 0a 20 20 20 20 23 20  eturn 1}..    # 
2aa0: 43 75 72 72 65 6e 74 20 63 73 65 74 20 74 72 75  Current cset tru
2ab0: 6e 6b 2f 62 72 61 6e 63 68 20 64 69 66 66 65 72  nk/branch differ
2ac0: 65 6e 74 20 66 72 6f 6d 20 65 6e 74 72 79 2e 0a  ent from entry..
2ad0: 20 20 20 20 73 65 74 20 64 65 70 74 68 20 5b 6c      set depth [l
2ae0: 6c 65 6e 67 74 68 20 5b 73 70 6c 69 74 20 24 72  length [split $r
2af0: 65 76 20 2e 5d 5d 0a 20 20 20 20 69 66 20 7b 28  ev .]].    if {(
2b00: 24 6c 61 73 74 64 20 3d 3d 20 32 29 20 21 3d 20  $lastd == 2) != 
2b10: 28 24 64 65 70 74 68 20 3d 3d 20 32 29 7d 20 7b  ($depth == 2)} {
2b20: 73 65 74 20 72 65 61 73 6f 6e 20 64 65 70 74 68  set reason depth
2b30: 2f 24 6c 61 73 74 64 2f 24 64 65 70 74 68 2f 28  /$lastd/$depth/(
2b40: 24 72 65 76 29 2f 24 66 20 3b 20 72 65 74 75 72  $rev)/$f ; retur
2b50: 6e 20 31 7d 0a 0a 20 20 20 20 23 20 43 6f 6d 6d  n 1}..    # Comm
2b60: 69 74 20 6d 65 73 73 61 67 65 20 63 68 61 6e 67  it message chang
2b70: 65 64 0a 20 20 20 20 69 66 20 7b 24 63 6d 20 6e  ed.    if {$cm n
2b80: 65 20 24 65 63 6d 7d 20 7b 73 65 74 20 72 65 61  e $ecm} {set rea
2b90: 73 6f 6e 20 63 6d 73 67 5c 20 3c 3c 24 65 63 6d  son cmsg\ <<$ecm
2ba0: 3e 3e 20 3b 20 72 65 74 75 72 6e 20 31 7d 0a 0a  >> ; return 1}..
2bb0: 20 20 20 20 23 20 45 76 65 72 79 74 68 69 6e 67      # Everything
2bc0: 20 69 73 20 67 6f 6f 64 2c 20 73 74 69 6c 6c 20   is good, still 
2bd0: 74 68 65 20 73 61 6d 65 20 63 73 65 74 0a 20 20  the same cset.  
2be0: 20 20 72 65 74 75 72 6e 20 30 0a 7d 0a 0a 70 72    return 0.}..pr
2bf0: 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73  oc ::vc::cvs::ws
2c00: 3a 3a 43 53 53 61 76 65 20 7b 7d 20 7b 0a 20 20  ::CSSave {} {.  
2c10: 20 20 76 61 72 69 61 62 6c 65 20 63 6d 61 70 0a    variable cmap.
2c20: 20 20 20 20 76 61 72 69 61 62 6c 65 20 63 73 65      variable cse
2c30: 74 73 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20  ts.    variable 
2c40: 6e 63 73 0a 20 20 20 20 75 70 76 61 72 20 31 20  ncs.    upvar 1 
2c50: 73 74 61 72 74 20 73 74 61 72 74 20 65 6e 64 20  start start end 
2c60: 65 6e 64 20 63 6d 20 63 6d 20 75 73 65 72 20 75  end cm cm user u
2c70: 73 65 72 20 66 69 6c 65 73 20 66 69 6c 65 73 20  ser files files 
2c80: 6c 61 73 74 64 20 6c 61 73 74 64 0a 0a 20 20 20  lastd lastd..   
2c90: 20 73 65 74 20 63 73 65 74 73 28 24 6e 63 73 29   set csets($ncs)
2ca0: 20 5b 6c 69 73 74 20 24 75 73 65 72 20 24 63 6d   [list $user $cm
2cb0: 20 24 73 74 61 72 74 20 24 65 6e 64 20 24 6c 61   $start $end $la
2cc0: 73 74 64 20 5b 61 72 72 61 79 20 67 65 74 20 66  std [array get f
2cd0: 69 6c 65 73 5d 5d 0a 0a 20 20 20 20 23 20 52 65  iles]]..    # Re
2ce0: 63 6f 72 64 20 77 68 69 63 68 20 72 65 76 69 73  cord which revis
2cf0: 69 6f 6e 73 20 6f 66 20 61 20 66 69 6c 65 20 61  ions of a file a
2d00: 72 65 20 69 6e 20 77 68 61 74 20 63 73 65 74 73  re in what csets
2d10: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b 66 20  .    foreach {f 
2d20: 6f 72 7d 20 5b 61 72 72 61 79 20 67 65 74 20 66  or} [array get f
2d30: 69 6c 65 73 5d 20 7b 0a 09 66 6f 72 65 61 63 68  iles] {..foreach
2d40: 20 7b 5f 20 72 65 76 7d 20 24 6f 72 20 62 72 65   {_ rev} $or bre
2d50: 61 6b 0a 09 73 65 74 20 63 6d 61 70 28 5b 6c 69  ak..set cmap([li
2d60: 73 74 20 24 66 20 24 72 65 76 5d 29 20 24 6e 63  st $f $rev]) $nc
2d70: 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 43 53  s.    }..    #CS
2d80: 44 75 6d 70 20 24 6e 63 73 0a 0a 20 20 20 20 69  Dump $ncs..    i
2d90: 6e 63 72 20 6e 63 73 0a 20 20 20 20 72 65 74 75  ncr ncs.    retu
2da0: 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a  rn.}..proc ::vc:
2db0: 3a 63 76 73 3a 3a 77 73 3a 3a 43 53 41 64 64 20  :cvs::ws::CSAdd 
2dc0: 7b 65 6e 74 72 79 7d 20 7b 0a 20 20 20 20 75 70  {entry} {.    up
2dd0: 76 61 72 20 31 20 73 74 61 72 74 20 73 74 61 72  var 1 start star
2de0: 74 20 65 6e 64 20 65 6e 64 20 63 6d 20 63 6d 20  t end end cm cm 
2df0: 75 73 65 72 20 75 73 65 72 20 66 69 6c 65 73 20  user user files 
2e00: 66 69 6c 65 73 20 6c 61 73 74 64 20 6c 61 73 74  files lastd last
2e10: 64 0a 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b  d..    foreach {
2e20: 6f 70 20 74 73 20 61 20 72 65 76 20 66 20 65 63  op ts a rev f ec
2e30: 6d 7d 20 24 65 6e 74 72 79 20 62 72 65 61 6b 0a  m} $entry break.
2e40: 0a 20 20 20 20 69 66 20 7b 24 73 74 61 72 74 20  .    if {$start 
2e50: 65 71 20 22 22 7d 20 7b 73 65 74 20 73 74 61 72  eq ""} {set star
2e60: 74 20 24 74 73 7d 0a 20 20 20 20 73 65 74 20 65  t $ts}.    set e
2e70: 6e 64 20 20 20 20 20 20 20 24 74 73 0a 20 20 20  nd       $ts.   
2e80: 20 73 65 74 20 63 6d 20 20 20 20 20 20 20 20 24   set cm        $
2e90: 65 63 6d 0a 20 20 20 20 73 65 74 20 75 73 65 72  ecm.    set user
2ea0: 20 20 20 20 20 20 24 61 0a 20 20 20 20 73 65 74        $a.    set
2eb0: 20 66 69 6c 65 73 28 24 66 29 20 5b 6c 69 73 74   files($f) [list
2ec0: 20 24 6f 70 20 24 72 65 76 5d 0a 20 20 20 20 73   $op $rev].    s
2ed0: 65 74 20 6c 61 73 74 64 20 20 20 20 20 5b 6c 6c  et lastd     [ll
2ee0: 65 6e 67 74 68 20 5b 73 70 6c 69 74 20 24 72 65  ength [split $re
2ef0: 76 20 2e 5d 5d 0a 20 20 20 20 72 65 74 75 72 6e  v .]].    return
2f00: 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63  .}..proc ::vc::c
2f10: 76 73 3a 3a 77 73 3a 3a 43 53 44 75 6d 70 20 7b  vs::ws::CSDump {
2f20: 63 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c  c} {.    variabl
2f30: 65 20 63 73 65 74 73 0a 20 20 20 20 66 6f 72 65  e csets.    fore
2f40: 61 63 68 20 7b 75 20 63 6d 20 73 20 65 20 72 64  ach {u cm s e rd
2f50: 20 66 7d 20 24 63 73 65 74 73 28 24 63 29 20 62   f} $csets($c) b
2f60: 72 65 61 6b 0a 0a 20 20 20 20 70 75 74 73 20 22  reak..    puts "
2f70: 24 75 20 24 73 22 3b 20 72 65 67 73 75 62 20 2d  $u $s"; regsub -
2f80: 61 6c 6c 20 7b 2e 7d 20 24 75 20 7b 20 7d 20 62  all {.} $u { } b
2f90: 0a 20 20 20 20 70 75 74 73 20 22 24 62 20 24 65  .    puts "$b $e
2fa0: 22 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b 66  ".    foreach {f
2fb0: 20 6f 72 7d 20 24 66 20 7b 0a 09 66 6f 72 65 61   or} $f {..forea
2fc0: 63 68 20 7b 6f 20 72 7d 20 24 6f 72 20 62 72 65  ch {o r} $or bre
2fd0: 61 6b 0a 09 70 75 74 73 20 22 24 62 20 24 6f 20  ak..puts "$b $o 
2fe0: 24 66 20 24 72 22 0a 20 20 20 20 7d 0a 20 20 20  $f $r".    }.   
2ff0: 20 72 65 74 75 72 6e 0a 7d 0a 0a 6e 61 6d 65 73   return.}..names
3000: 70 61 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a  pace eval ::vc::
3010: 63 76 73 3a 3a 77 73 20 7b 0a 20 20 20 20 6e 61  cvs::ws {.    na
3020: 6d 65 73 70 61 63 65 20 65 78 70 6f 72 74 20 61  mespace export a
3030: 74 20 73 63 61 6e 20 63 73 65 74 73 20 72 74 72  t scan csets rtr
3040: 65 65 20 77 6f 72 6b 73 70 61 63 65 20 77 73 69  ee workspace wsi
3050: 67 6e 6f 72 65 20 77 73 63 6c 65 61 72 20 77 73  gnore wsclear ws
3060: 73 65 74 75 70 20 5c 0a 09 66 6f 72 65 61 63 68  setup \..foreach
3070: 5f 63 73 65 74 20 72 6f 6f 74 20 6e 74 72 75 6e  _cset root ntrun
3080: 6b 20 6e 63 73 65 74 73 20 75 75 69 64 0a 7d 0a  k ncsets uuid.}.
3090: 0a 23 20 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 2d 2d 2d 2d  ----------------
30d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
30e0: 0a 23 20 52 65 61 64 79 0a 0a 70 61 63 6b 61 67  .# Ready..packag
30f0: 65 20 70 72 6f 76 69 64 65 20 76 63 3a 3a 63 76  e provide vc::cv
3100: 73 3a 3a 77 73 20 31 2e 30 0a 72 65 74 75 72 6e  s::ws 1.0.return
3110: 0a                                               .