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