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