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