Artifact a015f1382f998fda8c172c918e905d43a356a9ae:
File
tools/lib/cvs.tcl
part of check-in
[b504674c5f]
- Fixed problems with the untested statistics module.
Moved cset <-> uuid map out of cvs to control layer, separate package.
Currently not really useful, will be needed when handling cvs branches.
Moved some user feedback around, and the import control too.
by
aku on
2007-09-15 03:18: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 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 73 20 urn [list $u $s
22d0: 24 63 6d 5d 0a 7d 0a 0a 6e 61 6d 65 73 70 61 63 $cm].}..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 23 20 turn $ncs.}..#
26d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
26f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 -------------.#
2720: 49 6e 74 65 72 6e 61 6c 20 68 65 6c 70 65 72 20 Internal helper
2730: 63 6f 6d 6d 61 6e 64 73 3a 20 43 68 61 6e 67 65 commands: Change
2740: 73 65 74 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 set inspection a
2750: 6e 64 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e nd construction.
2760: 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 ..proc ::vc::cvs
2770: 3a 3a 77 73 3a 3a 43 53 43 6c 65 61 72 20 7b 7d ::ws::CSClear {}
2780: 20 7b 0a 20 20 20 20 75 70 76 61 72 20 31 20 73 {. upvar 1 s
2790: 74 61 72 74 20 73 74 61 72 74 20 65 6e 64 20 65 tart start end e
27a0: 6e 64 20 63 6d 20 63 6d 20 75 73 65 72 20 75 73 nd cm cm user us
27b0: 65 72 20 66 69 6c 65 73 20 66 69 6c 65 73 20 6c er files files l
27c0: 61 73 74 64 20 6c 61 73 74 64 0a 0a 20 20 20 20 astd lastd..
27d0: 73 65 74 20 73 74 61 72 74 20 7b 7d 0a 20 20 20 set start {}.
27e0: 20 73 65 74 20 65 6e 64 20 20 20 7b 7d 0a 20 20 set end {}.
27f0: 20 20 73 65 74 20 63 6d 20 20 20 20 7b 7d 0a 20 set cm {}.
2800: 20 20 20 73 65 74 20 75 73 65 72 20 20 7b 7d 0a set user {}.
2810: 20 20 20 20 73 65 74 20 6c 61 73 74 64 20 7b 7d set lastd {}
2820: 0a 20 20 20 20 61 72 72 61 79 20 75 6e 73 65 74 . array unset
2830: 20 66 69 6c 65 73 20 2a 0a 20 20 20 20 61 72 72 files *. arr
2840: 61 79 20 73 65 74 20 66 69 6c 65 73 20 7b 7d 0a ay set files {}.
2850: 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 return.}..pr
2860: 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 oc ::vc::cvs::ws
2870: 3a 3a 43 53 4e 6f 6e 65 20 7b 7d 20 7b 0a 20 20 ::CSNone {} {.
2880: 20 20 75 70 76 61 72 20 31 20 73 74 61 72 74 20 upvar 1 start
2890: 73 74 61 72 74 0a 20 20 20 20 72 65 74 75 72 6e start. return
28a0: 20 5b 65 78 70 72 20 7b 24 73 74 61 72 74 20 65 [expr {$start e
28b0: 71 20 22 22 7d 5d 0a 7d 0a 0a 70 72 6f 63 20 3a q ""}].}..proc :
28c0: 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 43 53 :vc::cvs::ws::CS
28d0: 4e 65 77 20 7b 65 6e 74 72 79 7d 20 7b 0a 20 20 New {entry} {.
28e0: 20 20 75 70 76 61 72 20 31 20 73 74 61 72 74 20 upvar 1 start
28f0: 73 74 61 72 74 20 65 6e 64 20 65 6e 64 20 63 6d start end end cm
2900: 20 63 6d 20 75 73 65 72 20 75 73 65 72 20 66 69 cm user user fi
2910: 6c 65 73 20 66 69 6c 65 73 20 6c 61 73 74 64 20 les files lastd
2920: 6c 61 73 74 64 20 72 65 61 73 6f 6e 20 72 65 61 lastd reason rea
2930: 73 6f 6e 0a 0a 20 20 20 20 23 70 75 74 73 20 2d son.. #puts -
2940: 6e 6f 6e 65 77 6c 69 6e 65 20 73 74 64 6f 75 74 nonewline stdout
2950: 20 2e 20 3b 20 66 6c 75 73 68 20 73 74 64 6f 75 . ; flush stdou
2960: 74 0a 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b t.. foreach {
2970: 6f 70 20 74 73 20 61 20 72 65 76 20 66 20 65 63 op ts a rev f ec
2980: 6d 7d 20 24 65 6e 74 72 79 20 62 72 65 61 6b 0a m} $entry break.
2990: 0a 20 20 20 20 23 20 55 73 65 72 20 63 68 61 6e . # User chan
29a0: 67 65 0a 20 20 20 20 69 66 20 7b 24 61 20 6e 65 ge. if {$a ne
29b0: 20 24 75 73 65 72 7d 20 7b 73 65 74 20 72 65 61 $user} {set rea
29c0: 73 6f 6e 20 75 73 65 72 20 3b 20 72 65 74 75 72 son user ; retur
29d0: 6e 20 31 7d 0a 0a 20 20 20 20 23 20 46 69 6c 65 n 1}.. # File
29e0: 20 61 6c 72 65 61 64 79 20 69 6e 20 63 75 72 72 already in curr
29f0: 65 6e 74 20 63 73 65 74 0a 20 20 20 20 69 66 20 ent cset. if
2a00: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 66 69 {[info exists fi
2a10: 6c 65 73 28 24 66 29 5d 7d 20 7b 73 65 74 20 72 les($f)]} {set r
2a20: 65 61 73 6f 6e 20 66 69 6c 65 20 3b 20 72 65 74 eason file ; ret
2a30: 75 72 6e 20 31 7d 0a 0a 20 20 20 20 23 20 43 75 urn 1}.. # Cu
2a40: 72 72 65 6e 74 20 63 73 65 74 20 74 72 75 6e 6b rrent cset trunk
2a50: 2f 62 72 61 6e 63 68 20 64 69 66 66 65 72 65 6e /branch differen
2a60: 74 20 66 72 6f 6d 20 65 6e 74 72 79 2e 0a 20 20 t from entry..
2a70: 20 20 73 65 74 20 64 65 70 74 68 20 5b 6c 6c 65 set depth [lle
2a80: 6e 67 74 68 20 5b 73 70 6c 69 74 20 24 72 65 76 ngth [split $rev
2a90: 20 2e 5d 5d 0a 20 20 20 20 69 66 20 7b 28 24 6c .]]. if {($l
2aa0: 61 73 74 64 20 3d 3d 20 32 29 20 21 3d 20 28 24 astd == 2) != ($
2ab0: 64 65 70 74 68 20 3d 3d 20 32 29 7d 20 7b 73 65 depth == 2)} {se
2ac0: 74 20 72 65 61 73 6f 6e 20 64 65 70 74 68 2f 24 t reason depth/$
2ad0: 6c 61 73 74 64 2f 24 64 65 70 74 68 2f 28 24 72 lastd/$depth/($r
2ae0: 65 76 29 2f 24 66 20 3b 20 72 65 74 75 72 6e 20 ev)/$f ; return
2af0: 31 7d 0a 0a 20 20 20 20 23 20 43 6f 6d 6d 69 74 1}.. # Commit
2b00: 20 6d 65 73 73 61 67 65 20 63 68 61 6e 67 65 64 message changed
2b10: 0a 20 20 20 20 69 66 20 7b 24 63 6d 20 6e 65 20 . if {$cm ne
2b20: 24 65 63 6d 7d 20 7b 73 65 74 20 72 65 61 73 6f $ecm} {set reaso
2b30: 6e 20 63 6d 73 67 5c 20 3c 3c 24 65 63 6d 3e 3e n cmsg\ <<$ecm>>
2b40: 20 3b 20 72 65 74 75 72 6e 20 31 7d 0a 0a 20 20 ; return 1}..
2b50: 20 20 23 20 45 76 65 72 79 74 68 69 6e 67 20 69 # Everything i
2b60: 73 20 67 6f 6f 64 2c 20 73 74 69 6c 6c 20 74 68 s good, still th
2b70: 65 20 73 61 6d 65 20 63 73 65 74 0a 20 20 20 20 e same cset.
2b80: 72 65 74 75 72 6e 20 30 0a 7d 0a 0a 70 72 6f 63 return 0.}..proc
2b90: 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a ::vc::cvs::ws::
2ba0: 43 53 53 61 76 65 20 7b 7d 20 7b 0a 20 20 20 20 CSSave {} {.
2bb0: 76 61 72 69 61 62 6c 65 20 63 6d 61 70 0a 20 20 variable cmap.
2bc0: 20 20 76 61 72 69 61 62 6c 65 20 63 73 65 74 73 variable csets
2bd0: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 63 . variable nc
2be0: 73 0a 20 20 20 20 75 70 76 61 72 20 31 20 73 74 s. upvar 1 st
2bf0: 61 72 74 20 73 74 61 72 74 20 65 6e 64 20 65 6e art start end en
2c00: 64 20 63 6d 20 63 6d 20 75 73 65 72 20 75 73 65 d cm cm user use
2c10: 72 20 66 69 6c 65 73 20 66 69 6c 65 73 20 6c 61 r files files la
2c20: 73 74 64 20 6c 61 73 74 64 0a 0a 20 20 20 20 73 std lastd.. s
2c30: 65 74 20 63 73 65 74 73 28 24 6e 63 73 29 20 5b et csets($ncs) [
2c40: 6c 69 73 74 20 24 75 73 65 72 20 24 63 6d 20 24 list $user $cm $
2c50: 73 74 61 72 74 20 24 65 6e 64 20 24 6c 61 73 74 start $end $last
2c60: 64 20 5b 61 72 72 61 79 20 67 65 74 20 66 69 6c d [array get fil
2c70: 65 73 5d 5d 0a 0a 20 20 20 20 23 20 52 65 63 6f es]].. # Reco
2c80: 72 64 20 77 68 69 63 68 20 72 65 76 69 73 69 6f rd which revisio
2c90: 6e 73 20 6f 66 20 61 20 66 69 6c 65 20 61 72 65 ns of a file are
2ca0: 20 69 6e 20 77 68 61 74 20 63 73 65 74 73 0a 20 in what csets.
2cb0: 20 20 20 66 6f 72 65 61 63 68 20 7b 66 20 6f 72 foreach {f or
2cc0: 7d 20 5b 61 72 72 61 79 20 67 65 74 20 66 69 6c } [array get fil
2cd0: 65 73 5d 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b es] {..foreach {
2ce0: 5f 20 72 65 76 7d 20 24 6f 72 20 62 72 65 61 6b _ rev} $or break
2cf0: 0a 09 73 65 74 20 63 6d 61 70 28 5b 6c 69 73 74 ..set cmap([list
2d00: 20 24 66 20 24 72 65 76 5d 29 20 24 6e 63 73 0a $f $rev]) $ncs.
2d10: 20 20 20 20 7d 0a 0a 20 20 20 20 23 43 53 44 75 }.. #CSDu
2d20: 6d 70 20 24 6e 63 73 0a 0a 20 20 20 20 69 6e 63 mp $ncs.. inc
2d30: 72 20 6e 63 73 0a 20 20 20 20 72 65 74 75 72 6e r ncs. return
2d40: 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 .}..proc ::vc::c
2d50: 76 73 3a 3a 77 73 3a 3a 43 53 41 64 64 20 7b 65 vs::ws::CSAdd {e
2d60: 6e 74 72 79 7d 20 7b 0a 20 20 20 20 75 70 76 61 ntry} {. upva
2d70: 72 20 31 20 73 74 61 72 74 20 73 74 61 72 74 20 r 1 start start
2d80: 65 6e 64 20 65 6e 64 20 63 6d 20 63 6d 20 75 73 end end cm cm us
2d90: 65 72 20 75 73 65 72 20 66 69 6c 65 73 20 66 69 er user files fi
2da0: 6c 65 73 20 6c 61 73 74 64 20 6c 61 73 74 64 0a les lastd lastd.
2db0: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b 6f 70 . foreach {op
2dc0: 20 74 73 20 61 20 72 65 76 20 66 20 65 63 6d 7d ts a rev f ecm}
2dd0: 20 24 65 6e 74 72 79 20 62 72 65 61 6b 0a 0a 20 $entry break..
2de0: 20 20 20 69 66 20 7b 24 73 74 61 72 74 20 65 71 if {$start eq
2df0: 20 22 22 7d 20 7b 73 65 74 20 73 74 61 72 74 20 ""} {set start
2e00: 24 74 73 7d 0a 20 20 20 20 73 65 74 20 65 6e 64 $ts}. set end
2e10: 20 20 20 20 20 20 20 24 74 73 0a 20 20 20 20 73 $ts. s
2e20: 65 74 20 63 6d 20 20 20 20 20 20 20 20 24 65 63 et cm $ec
2e30: 6d 0a 20 20 20 20 73 65 74 20 75 73 65 72 20 20 m. set user
2e40: 20 20 20 20 24 61 0a 20 20 20 20 73 65 74 20 66 $a. set f
2e50: 69 6c 65 73 28 24 66 29 20 5b 6c 69 73 74 20 24 iles($f) [list $
2e60: 6f 70 20 24 72 65 76 5d 0a 20 20 20 20 73 65 74 op $rev]. set
2e70: 20 6c 61 73 74 64 20 20 20 20 20 5b 6c 6c 65 6e lastd [llen
2e80: 67 74 68 20 5b 73 70 6c 69 74 20 24 72 65 76 20 gth [split $rev
2e90: 2e 5d 5d 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d .]]. return.}
2ea0: 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 ..proc ::vc::cvs
2eb0: 3a 3a 77 73 3a 3a 43 53 44 75 6d 70 20 7b 63 7d ::ws::CSDump {c}
2ec0: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 {. variable
2ed0: 63 73 65 74 73 0a 20 20 20 20 66 6f 72 65 61 63 csets. foreac
2ee0: 68 20 7b 75 20 63 6d 20 73 20 65 20 72 64 20 66 h {u cm s e rd f
2ef0: 7d 20 24 63 73 65 74 73 28 24 63 29 20 62 72 65 } $csets($c) bre
2f00: 61 6b 0a 0a 20 20 20 20 70 75 74 73 20 22 24 75 ak.. puts "$u
2f10: 20 24 73 22 3b 20 72 65 67 73 75 62 20 2d 61 6c $s"; regsub -al
2f20: 6c 20 7b 2e 7d 20 24 75 20 7b 20 7d 20 62 0a 20 l {.} $u { } b.
2f30: 20 20 20 70 75 74 73 20 22 24 62 20 24 65 22 0a puts "$b $e".
2f40: 20 20 20 20 66 6f 72 65 61 63 68 20 7b 66 20 6f foreach {f o
2f50: 72 7d 20 24 66 20 7b 0a 09 66 6f 72 65 61 63 68 r} $f {..foreach
2f60: 20 7b 6f 20 72 7d 20 24 6f 72 20 62 72 65 61 6b {o r} $or break
2f70: 0a 09 70 75 74 73 20 22 24 62 20 24 6f 20 24 66 ..puts "$b $o $f
2f80: 20 24 72 22 0a 20 20 20 20 7d 0a 20 20 20 20 72 $r". }. r
2f90: 65 74 75 72 6e 0a 7d 0a 0a 6e 61 6d 65 73 70 61 eturn.}..namespa
2fa0: 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a 63 76 ce eval ::vc::cv
2fb0: 73 3a 3a 77 73 20 7b 0a 20 20 20 20 6e 61 6d 65 s::ws {. name
2fc0: 73 70 61 63 65 20 65 78 70 6f 72 74 20 61 74 20 space export at
2fd0: 73 63 61 6e 20 63 73 65 74 73 20 72 74 72 65 65 scan csets rtree
2fe0: 20 77 6f 72 6b 73 70 61 63 65 20 77 73 69 67 6e workspace wsign
2ff0: 6f 72 65 20 77 73 63 6c 65 61 72 20 77 73 73 65 ore wsclear wsse
3000: 74 75 70 20 5c 0a 09 66 6f 72 65 61 63 68 5f 63 tup \..foreach_c
3010: 73 65 74 20 72 6f 6f 74 20 6e 74 72 75 6e 6b 20 set root ntrunk
3020: 6e 63 73 65 74 73 0a 7d 0a 0a 23 20 2d 2d 2d 2d ncsets.}..# ----
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 52 65 61 64 ---------.# Read
3080: 79 0a 0a 70 61 63 6b 61 67 65 20 70 72 6f 76 69 y..package provi
3090: 64 65 20 76 63 3a 3a 63 76 73 3a 3a 77 73 20 31 de vc::cvs::ws 1
30a0: 2e 30 0a 72 65 74 75 72 6e 0a .0.return.