Artifact 11e2bbce8e29703695ff1ea3403013074c4062d3:
File
tools/lib/cvs.tcl
part of check-in
[d8c18fc148]
- Reworked the CVS handling code to have a simpler API, more like the reworked Fossil API.
The API now has a form where adding the handling of branches should not require complex
changes in the import controller any longer. Extended the system to allow the user to
restrict the importing to a sub-directory of the chosen repository, via the new switch
--project. This is required to pull a SF CVS repository apart into the various projects
it may have. Example: Under Tcl we have 3 projects, namely Tcl itself, sampleextension,
and Thread.
by
aku on
2007-09-17 00:56:40.
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 76 63 3a 3a 63 76 73 3a 3a 77 73 I..# vc::cvs::ws
0330: 3a 3a 63 6f 6e 66 69 67 75 72 65 20 6b 65 79 20 ::configure key
0340: 76 61 6c 75 65 20 20 20 20 2d 20 43 6f 6e 66 69 value - Confi
0350: 67 75 72 65 20 74 68 65 20 73 75 62 73 79 73 74 gure the subsyst
0360: 65 6d 2e 0a 23 20 76 63 3a 3a 63 76 73 3a 3a 77 em..# vc::cvs::w
0370: 73 3a 3a 63 68 65 63 6b 20 20 20 20 20 73 72 63 s::check src
0380: 20 6d 76 20 20 20 20 20 20 20 2d 20 43 68 65 63 mv - Chec
0390: 6b 20 69 66 20 73 72 63 20 69 73 20 61 20 43 56 k if src is a CV
03a0: 53 20 72 65 70 6f 73 69 74 6f 72 79 20 64 69 72 S repository dir
03b0: 65 63 74 6f 72 79 2e 0a 23 20 76 63 3a 3a 63 76 ectory..# vc::cv
03c0: 73 3a 3a 77 73 3a 3a 62 65 67 69 6e 20 20 20 20 s::ws::begin
03d0: 20 73 72 63 20 20 20 20 20 20 20 20 20 20 2d 20 src -
03e0: 53 74 61 72 74 20 6e 65 77 20 77 6f 72 6b 73 70 Start new worksp
03f0: 61 63 65 20 61 6e 64 20 72 65 74 75 72 6e 20 74 ace and return t
0400: 68 65 20 74 6f 70 2d 0a 23 20 20 20 20 20 20 20 he top-.#
0410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0430: 6d 6f 73 74 20 64 69 72 65 63 74 6f 72 79 20 63 most directory c
0440: 6f 27 64 20 66 69 6c 65 73 20 61 72 65 20 70 75 o'd files are pu
0450: 74 20 69 6e 74 6f 2e 0a 23 20 76 63 3a 3a 63 76 t into..# vc::cv
0460: 73 3a 3a 77 73 3a 3a 6e 63 73 65 74 73 20 20 20 s::ws::ncsets
0470: 20 3f 2d 69 6d 70 6f 72 74 3f 20 20 20 20 2d 20 ?-import? -
0480: 52 65 74 72 69 65 76 65 20 6e 75 6d 62 65 72 20 Retrieve number
0490: 6f 66 20 63 73 65 74 73 20 28 61 6c 6c 2f 74 6f of csets (all/to
04a0: 20 69 6d 70 6f 72 74 29 0a 23 20 76 63 3a 3a 63 import).# vc::c
04b0: 76 73 3a 3a 77 73 3a 3a 66 6f 72 65 61 63 68 20 vs::ws::foreach
04c0: 20 20 63 73 76 61 72 20 73 63 72 69 70 74 20 2d csvar script -
04d0: 20 52 75 6e 20 74 68 65 20 73 63 72 69 70 74 20 Run the script
04e0: 66 6f 72 20 65 61 63 68 20 63 68 61 6e 67 65 73 for each changes
04f0: 65 74 2c 20 74 68 65 0a 23 20 20 20 20 20 20 20 et, the.#
0500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0510: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0520: 69 64 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e id of the curren
0530: 74 20 63 68 61 6e 67 65 73 65 74 20 73 74 6f 72 t changeset stor
0540: 65 64 20 69 6e 0a 23 20 20 20 20 20 20 20 20 20 ed in.#
0550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 th
0570: 65 20 76 61 72 69 61 62 6c 65 20 6e 61 6d 65 64 e variable named
0580: 20 62 79 20 63 73 76 61 72 2e 0a 23 20 76 63 3a by csvar..# vc:
0590: 3a 63 76 73 3a 3a 77 73 3a 3a 64 6f 6e 65 20 20 :cvs::ws::done
05a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
05b0: 20 2d 20 43 6c 6f 73 65 20 77 6f 72 6b 73 70 61 - Close workspa
05c0: 63 65 20 61 6e 64 20 64 65 6c 65 74 65 20 69 74 ce and delete it
05d0: 2e 0a 23 20 76 63 3a 3a 63 76 73 3a 3a 77 73 3a ..# vc::cvs::ws:
05e0: 3a 69 73 61 64 6d 69 6e 20 70 61 74 68 20 20 20 :isadmin path
05f0: 20 20 20 20 20 20 20 20 2d 20 43 68 65 63 6b 20 - Check
0600: 69 66 20 70 61 74 68 20 69 73 20 61 6e 20 61 64 if path is an ad
0610: 6d 69 6e 20 66 69 6c 65 20 6f 66 20 43 56 53 0a min file of CVS.
0620: 23 20 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 63 # vc::cvs::ws::c
0630: 68 65 63 6b 6f 75 74 20 69 64 20 20 20 20 20 20 heckout id
0640: 20 20 20 20 20 20 2d 20 48 61 76 65 20 77 6f 72 - Have wor
0650: 6b 73 70 61 63 65 20 63 6f 6e 74 61 69 6e 20 74 kspace contain t
0660: 68 65 20 63 68 61 6e 67 65 73 65 74 20 69 64 2e he changeset id.
0670: 0a 23 0a 23 20 43 6f 6e 66 69 67 75 72 61 74 69 .#.# Configurati
0680: 6f 6e 20 6b 65 79 73 3a 0a 23 0a 23 20 2d 70 72 on keys:.#.# -pr
0690: 6f 6a 65 63 74 20 70 61 74 68 20 2d 20 53 75 62 oject path - Sub
06a0: 20 64 69 72 65 63 74 6f 72 79 20 75 6e 64 65 72 directory under
06b0: 20 27 73 72 63 27 20 74 6f 20 6c 69 6d 69 74 20 'src' to limit
06c0: 74 68 65 20 69 6d 70 6f 72 74 20 74 6f 2e 0a 0a the import to...
06d0: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d # --------------
06e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
06f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0700: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0710: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
0720: 23 20 41 50 49 20 49 6d 70 6c 65 6d 65 6e 74 61 # API Implementa
0730: 74 69 6f 6e 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a tion..proc ::vc:
0740: 3a 63 76 73 3a 3a 77 73 3a 3a 63 6f 6e 66 69 67 :cvs::ws::config
0750: 75 72 65 20 7b 6b 65 79 20 76 61 6c 75 65 7d 20 ure {key value}
0760: 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 70 {. variable p
0770: 72 6f 6a 65 63 74 0a 0a 20 20 20 20 73 77 69 74 roject.. swit
0780: 63 68 20 2d 65 78 61 63 74 20 2d 2d 20 24 6b 65 ch -exact -- $ke
0790: 79 20 7b 0a 09 2d 70 72 6f 6a 65 63 74 20 7b 20 y {..-project {
07a0: 73 65 74 20 70 72 6f 6a 65 63 74 20 24 76 61 6c set project $val
07b0: 75 65 20 7d 0a 09 64 65 66 61 75 6c 74 20 7b 0a ue }..default {.
07c0: 09 20 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 . return -cod
07d0: 65 20 65 72 72 6f 72 20 22 55 6e 6b 6e 6f 77 6e e error "Unknown
07e0: 20 73 77 69 74 63 68 20 24 6b 65 79 2c 20 65 78 switch $key, ex
07f0: 70 65 63 74 65 64 20 5c 0a 20 20 20 20 20 20 20 pected \.
0800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0810: 20 20 20 20 20 20 20 20 20 20 20 20 2d 70 72 6f -pro
0820: 6a 65 63 74 22 0a 09 7d 0a 20 20 20 20 7d 0a 20 ject"..}. }.
0830: 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f return.}..pro
0840: 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a c ::vc::cvs::ws:
0850: 3a 63 68 65 63 6b 20 7b 73 72 63 20 6d 76 7d 20 :check {src mv}
0860: 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 70 {. variable p
0870: 72 6f 6a 65 63 74 0a 20 20 20 20 75 70 76 61 72 roject. upvar
0880: 20 31 20 24 6d 76 20 6d 73 67 0a 20 20 20 20 69 1 $mv msg. i
0890: 66 20 7b 0a 09 21 5b 66 69 6c 65 75 74 69 6c 3a f {..![fileutil:
08a0: 3a 74 65 73 74 20 24 73 72 63 20 20 20 20 20 20 :test $src
08b0: 20 20 20 65 72 64 20 6d 73 67 20 22 43 56 53 20 erd msg "CVS
08c0: 52 65 70 6f 73 69 74 6f 72 79 22 5d 20 7c 7c 0a Repository"] ||.
08d0: 09 21 5b 66 69 6c 65 75 74 69 6c 3a 3a 74 65 73 .![fileutil::tes
08e0: 74 20 24 73 72 63 2f 43 56 53 52 4f 4f 54 20 65 t $src/CVSROOT e
08f0: 72 64 20 6d 73 67 20 22 43 56 53 20 41 64 6d 69 rd msg "CVS Admi
0900: 6e 20 64 69 72 65 63 74 6f 72 79 22 5d 20 7c 7c n directory"] ||
0910: 0a 09 28 28 24 70 72 6f 6a 65 63 74 20 6e 65 20 ..(($project ne
0920: 22 22 29 20 26 26 0a 09 20 21 5b 66 69 6c 65 75 "") &&.. ![fileu
0930: 74 69 6c 3a 3a 74 65 73 74 20 24 73 72 63 2f 24 til::test $src/$
0940: 70 72 6f 6a 65 63 74 20 65 72 64 20 6d 73 67 20 project erd msg
0950: 22 50 72 6f 6a 65 63 74 20 64 69 72 65 63 74 6f "Project directo
0960: 72 79 22 5d 29 0a 20 20 20 20 7d 20 7b 0a 09 72 ry"]). } {..r
0970: 65 74 75 72 6e 20 30 0a 20 20 20 20 7d 0a 20 20 eturn 0. }.
0980: 20 20 72 65 74 75 72 6e 20 31 0a 7d 0a 0a 70 72 return 1.}..pr
0990: 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 oc ::vc::cvs::ws
09a0: 3a 3a 62 65 67 69 6e 20 7b 73 72 63 7d 20 7b 0a ::begin {src} {.
09b0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 70 72 6f variable pro
09c0: 6a 65 63 74 0a 20 20 20 20 76 61 72 69 61 62 6c ject. variabl
09d0: 65 20 62 61 73 65 0a 0a 20 20 20 20 73 65 74 20 e base.. set
09e0: 73 72 63 20 5b 66 69 6c 65 20 6e 6f 72 6d 61 6c src [file normal
09f0: 69 7a 65 20 24 73 72 63 5d 0a 20 20 20 20 69 66 ize $src]. if
0a00: 20 7b 21 5b 63 68 65 63 6b 20 24 73 72 63 20 6d {![check $src m
0a10: 73 67 5d 7d 20 7b 0a 09 72 65 74 75 72 6e 20 2d sg]} {..return -
0a20: 63 6f 64 65 20 65 72 72 6f 72 20 24 6d 73 67 0a code error $msg.
0a30: 20 20 20 20 7d 0a 20 20 20 20 73 65 74 20 62 61 }. set ba
0a40: 73 65 20 24 73 72 63 0a 20 20 20 20 77 72 69 74 se $src. writ
0a50: 65 20 30 20 63 76 73 20 22 42 61 73 65 3a 20 20 e 0 cvs "Base:
0a60: 20 20 24 62 61 73 65 22 0a 20 20 20 20 69 66 20 $base". if
0a70: 7b 24 70 72 6f 6a 65 63 74 20 65 71 20 22 22 7d {$project eq ""}
0a80: 20 7b 0a 09 77 72 69 74 65 20 30 20 63 76 73 20 {..write 0 cvs
0a90: 22 50 72 6f 6a 65 63 74 3a 20 3c 41 4c 4c 3e 22 "Project: <ALL>"
0aa0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 77 . } else {..w
0ab0: 72 69 74 65 20 30 20 63 76 73 20 22 50 72 6f 6a rite 0 cvs "Proj
0ac0: 65 63 74 3a 20 24 70 72 6f 6a 65 63 74 22 0a 20 ect: $project".
0ad0: 20 20 20 7d 0a 0a 20 20 20 20 23 20 4f 4c 44 20 }.. # OLD
0ae0: 61 70 69 20 63 61 6c 6c 73 20 2e 2e 2e 20 54 4f api calls ... TO
0af0: 44 4f 20 72 65 77 6f 72 6b 20 66 6f 72 20 6d 6f DO rework for mo
0b00: 72 65 20 73 74 72 75 63 74 75 72 65 20 2e 2e 2e re structure ...
0b10: 0a 20 20 20 20 73 63 61 6e 20 20 20 20 20 3b 20 . scan ;
0b20: 23 20 47 61 74 68 65 72 20 72 65 76 69 73 69 6f # Gather revisio
0b30: 6e 20 64 61 74 61 20 66 72 6f 6d 20 74 68 65 20 n data from the
0b40: 61 72 63 68 69 76 65 73 0a 20 20 20 20 63 73 65 archives. cse
0b50: 74 73 20 20 20 20 3b 20 23 20 47 72 6f 75 70 20 ts ; # Group
0b60: 63 68 61 6e 67 65 73 20 69 6e 74 6f 20 73 65 74 changes into set
0b70: 73 0a 20 20 20 20 72 74 72 65 65 20 20 20 20 3b s. rtree ;
0b80: 20 23 20 42 75 69 6c 64 20 72 65 76 69 73 69 6f # Build revisio
0b90: 6e 20 74 72 65 65 20 28 74 72 75 6e 6b 20 6f 6e n tree (trunk on
0ba0: 6c 79 20 72 69 67 68 74 20 6e 6f 77 29 2e 0a 0a ly right now)...
0bb0: 20 20 20 20 73 65 74 20 77 20 5b 77 6f 72 6b 73 set w [works
0bc0: 70 61 63 65 5d 20 20 20 3b 20 23 20 4f 4c 44 20 pace] ; # OLD
0bd0: 61 70 69 20 2e 2e 2e 20 54 4f 44 4f 20 69 6e 6c api ... TODO inl
0be0: 69 6e 65 0a 20 20 20 20 69 66 20 7b 24 70 72 6f ine. if {$pro
0bf0: 6a 65 63 74 20 6e 65 20 22 22 7d 20 7b 0a 09 73 ject ne ""} {..s
0c00: 65 74 20 77 20 24 77 2f 24 70 72 6f 6a 65 63 74 et w $w/$project
0c10: 0a 09 66 69 6c 65 20 6d 6b 64 69 72 20 24 77 0a ..file mkdir $w.
0c20: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
0c30: 20 24 77 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 $w.}..proc ::vc
0c40: 3a 3a 63 76 73 3a 3a 77 73 3a 3a 64 6f 6e 65 20 ::cvs::ws::done
0c50: 7b 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c {} {. variabl
0c60: 65 20 63 77 64 0a 20 20 20 20 76 61 72 69 61 62 e cwd. variab
0c70: 6c 65 20 77 6f 72 6b 73 70 61 63 65 0a 20 20 20 le workspace.
0c80: 20 63 64 20 24 63 77 64 0a 20 20 20 20 66 69 6c cd $cwd. fil
0c90: 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 e delete -force
0ca0: 24 77 6f 72 6b 73 70 61 63 65 0a 20 20 20 20 72 $workspace. r
0cb0: 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a eturn.}..proc ::
0cc0: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 66 6f 72 vc::cvs::ws::for
0cd0: 65 61 63 68 20 7b 63 76 20 73 63 72 69 70 74 7d each {cv script}
0ce0: 20 7b 0a 20 20 20 20 23 20 4f 4c 44 20 61 70 69 {. # OLD api
0cf0: 20 2e 2e 2e 20 54 4f 44 4f 20 69 6e 6c 69 6e 65 ... TODO inline
0d00: 0a 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b . uplevel 1 [
0d10: 6c 69 73 74 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a list ::vc::cvs::
0d20: 77 73 3a 3a 66 6f 72 65 61 63 68 5f 63 73 65 74 ws::foreach_cset
0d30: 20 24 63 76 20 30 20 24 73 63 72 69 70 74 5d 0a $cv 0 $script].
0d40: 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 }..proc ::vc::cv
0d50: 73 3a 3a 77 73 3a 3a 6e 63 73 65 74 73 20 7b 61 s::ws::ncsets {a
0d60: 72 67 73 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 rgs} {. varia
0d70: 62 6c 65 20 6e 63 73 0a 20 20 20 20 76 61 72 69 ble ncs. vari
0d80: 61 62 6c 65 20 6e 74 72 75 6e 6b 0a 0a 20 20 20 able ntrunk..
0d90: 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 61 if {[llength $a
0da0: 72 67 73 5d 20 3e 20 31 7d 20 7b 0a 09 72 65 74 rgs] > 1} {..ret
0db0: 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 urn -code error
0dc0: 22 77 72 6f 6e 67 23 61 72 67 73 3a 20 45 78 70 "wrong#args: Exp
0dd0: 65 63 74 65 64 20 3f 2d 69 6d 70 6f 72 74 3f 22 ected ?-import?"
0de0: 0a 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b . } elseif {[
0df0: 6c 6c 65 6e 67 74 68 20 24 61 72 67 73 5d 20 3d llength $args] =
0e00: 3d 20 31 7d 20 7b 0a 09 69 66 20 7b 5b 73 65 74 = 1} {..if {[set
0e10: 20 6b 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 k [lindex $args
0e20: 20 30 5d 5d 20 6e 65 20 22 2d 69 6d 70 6f 72 74 0]] ne "-import
0e30: 22 7d 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e "} {.. return
0e40: 20 2d 63 6f 64 65 20 22 55 6e 6b 6e 6f 77 6e 20 -code "Unknown
0e50: 73 77 69 74 63 68 20 24 6b 2c 20 65 78 70 65 63 switch $k, expec
0e60: 74 65 64 20 2d 69 6d 70 6f 72 74 22 0a 09 7d 20 ted -import"..}
0e70: 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 else {.. retu
0e80: 72 6e 20 24 6e 74 72 75 6e 6b 0a 09 7d 0a 20 20 rn $ntrunk..}.
0e90: 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 }.. return
0ea0: 20 24 6e 63 73 0a 7d 0a 0a 70 72 6f 63 20 3a 3a $ncs.}..proc ::
0eb0: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 69 73 61 vc::cvs::ws::isa
0ec0: 64 6d 69 6e 20 7b 70 61 74 68 7d 20 7b 0a 20 20 dmin {path} {.
0ed0: 20 20 23 20 43 68 65 63 6b 20 69 66 20 70 61 74 # Check if pat
0ee0: 68 20 69 73 20 61 20 43 56 53 20 61 64 6d 69 6e h is a CVS admin
0ef0: 20 66 69 6c 65 2e 0a 20 20 20 20 69 66 20 7b 5b file.. if {[
0f00: 73 74 72 69 6e 67 20 6d 61 74 63 68 20 43 56 53 string match CVS
0f10: 2f 2a 20 20 20 24 70 61 74 68 5d 7d 20 7b 72 65 /* $path]} {re
0f20: 74 75 72 6e 20 31 7d 0a 20 20 20 20 69 66 20 7b turn 1}. if {
0f30: 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a 2f [string match */
0f40: 43 56 53 2f 2a 20 24 70 61 74 68 5d 7d 20 7b 72 CVS/* $path]} {r
0f50: 65 74 75 72 6e 20 31 7d 0a 20 20 20 20 72 65 74 eturn 1}. ret
0f60: 75 72 6e 20 30 0a 7d 0a 0a 70 72 6f 63 20 3a 3a urn 0.}..proc ::
0f70: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 63 68 65 vc::cvs::ws::che
0f80: 63 6b 6f 75 74 20 7b 69 64 7d 20 7b 0a 20 20 20 ckout {id} {.
0f90: 20 76 61 72 69 61 62 6c 65 20 77 6f 72 6b 73 70 variable worksp
0fa0: 61 63 65 20 3b 20 63 64 20 24 77 6f 72 6b 73 70 ace ; cd $worksp
0fb0: 61 63 65 0a 20 20 20 20 77 73 73 65 74 75 70 20 ace. wssetup
0fc0: 24 69 64 20 3b 20 23 20 4f 4c 44 20 61 70 69 20 $id ; # OLD api
0fd0: 2e 2e 2e 20 54 4f 44 4f 20 69 6e 6c 69 6e 65 0a ... TODO inline.
0fe0: 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d }..# -----------
0ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1030: 2d 2d 0a 23 20 49 6e 74 65 72 6e 61 6c 73 20 2d --.# Internals -
1040: 20 4f 6c 64 20 41 50 49 20 66 6f 72 20 6e 6f 77 Old API for now
1050: 2e 0a 0a 23 20 53 63 61 6e 20 72 65 70 6f 73 69 ...# Scan reposi
1060: 74 6f 72 79 2c 20 63 6f 6c 6c 65 63 74 20 61 72 tory, collect ar
1070: 63 68 69 76 65 73 2c 20 70 61 72 73 65 20 74 68 chives, parse th
1080: 65 6d 2c 20 61 6e 64 20 63 6f 6c 6c 65 63 74 20 em, and collect
1090: 72 65 76 69 73 69 6f 6e 0a 23 20 69 6e 66 6f 72 revision.# infor
10a0: 6d 61 74 69 6f 6e 20 28 66 69 6c 65 2c 20 72 65 mation (file, re
10b0: 76 69 73 69 6f 6e 20 2d 3e 20 64 61 74 65 2c 20 vision -> date,
10c0: 61 75 74 68 6f 72 2c 20 63 6f 6d 6d 69 74 20 6d author, commit m
10d0: 65 73 73 61 67 65 29 0a 0a 70 72 6f 63 20 3a 3a essage)..proc ::
10e0: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 73 63 61 vc::cvs::ws::sca
10f0: 6e 20 7b 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 n {} {. varia
1100: 62 6c 65 20 70 72 6f 6a 65 63 74 0a 20 20 20 20 ble project.
1110: 76 61 72 69 61 62 6c 65 20 62 61 73 65 0a 20 20 variable base.
1120: 20 20 76 61 72 69 61 62 6c 65 20 6e 70 61 74 68 variable npath
1130: 73 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 72 s. variable r
1140: 70 61 74 68 73 0a 20 20 20 20 76 61 72 69 61 62 paths. variab
1150: 6c 65 20 74 69 6d 65 6c 69 6e 65 0a 0a 20 20 20 le timeline..
1160: 20 77 72 69 74 65 20 30 20 63 76 73 20 7b 53 63 write 0 cvs {Sc
1170: 61 6e 6e 69 6e 67 20 64 69 72 65 63 74 6f 72 79 anning directory
1180: 20 68 69 65 72 61 72 63 68 79 7d 0a 0a 20 20 20 hierarchy}..
1190: 20 73 65 74 20 6e 20 30 0a 20 20 20 20 73 65 74 set n 0. set
11a0: 20 64 20 24 62 61 73 65 20 3b 20 69 66 20 7b 24 d $base ; if {$
11b0: 70 72 6f 6a 65 63 74 20 6e 65 20 22 22 7d 20 7b project ne ""} {
11c0: 61 70 70 65 6e 64 20 64 20 2f 24 70 72 6f 6a 65 append d /$proje
11d0: 63 74 7d 0a 0a 20 20 20 20 3a 3a 66 6f 72 65 61 ct}.. ::forea
11e0: 63 68 20 72 63 73 20 5b 66 69 6c 65 75 74 69 6c ch rcs [fileutil
11f0: 3a 3a 66 69 6e 64 42 79 50 61 74 74 65 72 6e 20 ::findByPattern
1200: 24 64 20 2d 67 6c 6f 62 20 2a 2c 76 5d 20 7b 0a $d -glob *,v] {.
1210: 09 73 65 74 20 72 63 73 20 5b 66 69 6c 65 75 74 .set rcs [fileut
1220: 69 6c 3a 3a 73 74 72 69 70 50 61 74 68 20 24 64 il::stripPath $d
1230: 20 24 72 63 73 5d 0a 09 23 20 4e 6f 77 20 72 63 $rcs]..# Now rc
1240: 73 20 69 73 20 72 65 6c 61 74 69 76 65 20 74 6f s is relative to
1250: 20 62 61 73 65 2f 70 72 6f 6a 65 63 74 0a 0a 09 base/project...
1260: 77 72 69 74 65 20 31 20 63 76 73 20 22 41 72 63 write 1 cvs "Arc
1270: 68 69 76 65 20 24 72 63 73 22 0a 0a 09 69 66 20 hive $rcs"...if
1280: 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 43 {[string match C
1290: 56 53 52 4f 4f 54 2f 2a 20 24 72 63 73 5d 7d 20 VSROOT/* $rcs]}
12a0: 7b 0a 09 20 20 20 20 77 72 69 74 65 20 32 20 63 {.. write 2 c
12b0: 76 73 20 7b 49 67 6e 6f 72 65 64 2e 20 41 64 6d vs {Ignored. Adm
12c0: 69 6e 69 73 74 72 61 74 69 76 65 20 66 69 6c 65 inistrative file
12d0: 7d 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a }.. continue.
12e0: 09 7d 0a 0a 09 23 20 44 65 72 69 76 65 20 74 68 .}...# Derive th
12f0: 65 20 72 65 67 75 6c 61 72 20 70 61 74 68 20 66 e regular path f
1300: 72 6f 6d 20 74 68 65 20 72 63 73 20 70 61 74 68 rom the rcs path
1310: 2e 20 4d 65 61 6e 69 6e 67 3a 20 43 68 6f 70 20 . Meaning: Chop
1320: 6f 66 0a 09 23 20 74 68 65 20 22 2c 76 22 20 73 of..# the ",v" s
1330: 75 66 66 69 78 2c 20 61 6e 64 20 72 65 6d 6f 76 uffix, and remov
1340: 65 20 61 20 70 6f 73 73 69 62 6c 65 20 22 41 74 e a possible "At
1350: 74 69 63 22 2e 0a 09 73 65 74 20 66 20 5b 73 74 tic"...set f [st
1360: 72 69 6e 67 20 72 61 6e 67 65 20 24 72 63 73 20 ring range $rcs
1370: 30 20 65 6e 64 2d 32 5d 0a 09 69 66 20 7b 22 41 0 end-2]..if {"A
1380: 74 74 69 63 22 20 65 71 20 5b 6c 69 6e 64 65 78 ttic" eq [lindex
1390: 20 5b 66 69 6c 65 20 73 70 6c 69 74 20 24 72 63 [file split $rc
13a0: 73 5d 20 65 6e 64 2d 31 5d 7d 20 7b 0a 0a 09 20 s] end-1]} {...
13b0: 20 20 20 23 20 54 68 65 20 63 6f 6e 73 74 72 75 # The constru
13c0: 63 74 69 6f 6e 20 62 65 6c 6f 77 20 65 6e 73 75 ction below ensu
13d0: 72 65 73 20 74 68 61 74 20 41 74 74 69 63 2f 58 res that Attic/X
13e0: 20 6d 61 70 73 20 74 6f 20 58 0a 09 20 20 20 20 maps to X..
13f0: 23 20 69 6e 73 74 65 61 64 20 6f 66 20 2e 2f 58 # instead of ./X
1400: 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 59 2f 41 . Otherwise, Y/A
1410: 74 74 69 63 2f 58 20 6d 61 70 73 20 74 6f 20 59 ttic/X maps to Y
1420: 2f 58 2e 0a 0a 09 20 20 20 20 73 65 74 20 66 78 /X.... set fx
1430: 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 5b [file dirname [
1440: 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 66 5d file dirname $f]
1450: 5d 0a 09 20 20 20 20 73 65 74 20 66 20 20 5b 66 ].. set f [f
1460: 69 6c 65 20 74 61 69 6c 20 24 66 5d 0a 09 20 20 ile tail $f]..
1470: 20 20 69 66 20 7b 24 66 78 20 6e 65 20 22 2e 22 if {$fx ne "."
1480: 7d 20 7b 20 73 65 74 20 66 20 5b 66 69 6c 65 20 } { set f [file
1490: 6a 6f 69 6e 20 24 66 78 20 24 66 5d 20 7d 0a 0a join $fx $f] }..
14a0: 09 20 20 20 20 69 66 20 7b 5b 66 69 6c 65 20 65 . if {[file e
14b0: 78 69 73 74 73 20 24 64 2f 24 66 2c 76 5d 7d 20 xists $d/$f,v]}
14c0: 7b 0a 09 09 23 20 57 65 20 68 61 76 65 20 61 20 {...# We have a
14d0: 72 65 67 75 6c 61 72 20 61 72 63 68 69 76 65 20 regular archive
14e0: 61 6e 64 20 61 6e 20 41 74 74 69 63 20 61 72 63 and an Attic arc
14f0: 68 69 76 65 0a 09 09 23 20 72 65 66 65 72 69 6e hive...# referin
1500: 67 20 74 6f 20 74 68 65 20 73 61 6d 65 20 75 73 g to the same us
1510: 65 72 20 76 69 73 69 62 6c 65 20 66 69 6c 65 2e er visible file.
1520: 20 49 67 6e 6f 72 65 20 74 68 65 0a 09 09 23 20 Ignore the...#
1530: 66 69 6c 65 20 69 6e 20 74 68 65 20 41 74 74 69 file in the Atti
1540: 63 2e 0a 0a 09 09 77 72 69 74 65 20 32 20 63 76 c.....write 2 cv
1550: 73 20 22 49 67 6e 6f 72 65 64 2e 20 41 74 74 69 s "Ignored. Atti
1560: 63 20 73 75 70 65 72 63 65 64 65 64 20 62 79 20 c superceded by
1570: 72 65 67 75 6c 61 72 20 61 72 63 68 69 76 65 22 regular archive"
1580: 0a 0a 09 09 23 20 54 4f 44 4f 2f 43 48 45 43 4b ....# TODO/CHECK
1590: 2e 20 4d 79 20 6d 65 74 68 6f 64 20 6f 66 20 63 . My method of c
15a0: 6f 27 69 6e 67 20 65 78 61 63 74 20 66 69 6c 65 o'ing exact file
15b0: 20 72 65 76 69 73 69 6f 6e 73 0a 09 09 23 20 70 revisions...# p
15c0: 65 72 20 74 68 65 20 69 6e 66 6f 20 69 6e 20 74 er the info in t
15d0: 68 65 20 63 6f 6c 6c 65 63 74 65 64 20 63 73 65 he collected cse
15e0: 74 73 20 68 61 73 20 74 68 65 20 66 6c 61 77 0a ts has the flaw.
15f0: 09 09 23 20 74 68 61 74 20 49 20 6d 61 79 20 68 ..# that I may h
1600: 61 76 65 20 74 6f 20 6b 6e 6f 77 20 65 78 61 63 ave to know exac
1610: 74 6c 79 20 77 68 65 6e 20 77 68 61 74 20 61 72 tly when what ar
1620: 63 68 69 76 65 0a 09 09 23 20 66 69 6c 65 20 74 chive...# file t
1630: 6f 20 75 73 65 2c 20 73 65 65 20 61 62 6f 76 65 o use, see above
1640: 2e 20 49 74 20 6d 69 67 68 74 20 62 65 20 62 65 . It might be be
1650: 74 74 65 72 20 74 6f 20 75 73 65 0a 09 09 23 20 tter to use...#
1660: 74 68 65 20 69 6e 66 6f 20 6f 6e 6c 79 20 74 6f the info only to
1670: 20 67 61 74 68 65 72 20 77 68 65 6e 20 63 73 65 gather when cse
1680: 74 73 20 62 65 67 69 6e 20 61 6e 64 20 65 6e 64 ts begin and end
1690: 2c 0a 09 09 23 20 61 6e 64 20 74 68 65 6e 20 74 ,...# and then t
16a0: 6f 20 63 6f 20 63 6f 6d 70 6c 65 74 65 20 73 6c o co complete sl
16b0: 69 63 65 73 20 70 65 72 20 65 78 61 63 74 20 74 ices per exact t
16c0: 69 6d 65 73 74 61 6d 70 0a 09 09 23 20 28 2d 44 imestamp...# (-D
16d0: 29 20 69 6e 73 74 65 61 64 20 6f 66 20 66 69 6c ) instead of fil
16e0: 65 20 72 65 76 69 73 69 6f 6e 73 20 28 2d 72 29 e revisions (-r)
16f0: 2e 20 54 68 65 20 66 6c 61 77 20 69 6e 0a 09 09 . The flaw in...
1700: 23 20 74 68 61 74 20 69 73 20 74 68 61 74 20 63 # that is that c
1710: 73 65 74 73 20 63 61 6e 20 6f 63 63 75 72 20 69 sets can occur i
1720: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 6f 6e n the same secon
1730: 64 0a 09 09 23 20 28 74 72 66 2c 20 6d 65 6d 63 d...# (trf, memc
1740: 68 61 6e 20 2d 20 63 68 65 63 6b 20 66 6f 72 20 han - check for
1750: 65 78 61 6d 70 6c 65 73 29 2e 20 46 6f 72 20 74 examples). For t
1760: 68 61 74 20 65 78 61 63 74 0a 09 09 23 20 63 68 hat exact...# ch
1770: 65 63 6b 6f 75 74 20 6d 61 79 20 62 65 20 6e 65 eckout may be ne
1780: 65 64 65 64 20 74 6f 20 72 65 63 72 65 61 74 65 eded to recreate
1790: 20 65 78 61 63 74 20 73 65 71 75 65 6e 63 65 20 exact sequence
17a0: 6f 66 0a 09 09 23 20 63 68 61 6e 67 65 73 2e 20 of...# changes.
17b0: 47 72 72 2e 20 53 69 78 20 6f 66 20 6f 6e 65 20 Grr. Six of one
17c0: 2e 2e 2e 0a 0a 09 09 63 6f 6e 74 69 6e 75 65 0a .......continue.
17d0: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 23 20 47 65 . }..}...# Ge
17e0: 74 20 74 68 65 20 6d 65 74 61 20 64 61 74 61 20 t the meta data
17f0: 77 65 20 6e 65 65 64 20 28 72 65 76 69 73 69 6f we need (revisio
1800: 6e 73 2c 20 74 69 6d 65 6c 69 6e 65 2c 20 6d 65 ns, timeline, me
1810: 73 73 61 67 65 73 29 2e 0a 09 73 65 74 20 6d 65 ssages)...set me
1820: 74 61 20 5b 70 72 6f 63 65 73 73 20 24 64 2f 24 ta [process $d/$
1830: 72 63 73 5d 0a 0a 09 73 65 74 20 6e 70 61 74 68 rcs]...set npath
1840: 73 28 24 72 63 73 29 20 24 66 0a 09 73 65 74 20 s($rcs) $f..set
1850: 72 70 61 74 68 73 28 24 66 29 20 24 72 63 73 0a rpaths($f) $rcs.
1860: 0a 09 61 72 72 61 79 20 73 65 74 20 70 20 24 6d ..array set p $m
1870: 65 74 61 0a 0a 09 3a 3a 66 6f 72 65 61 63 68 20 eta...::foreach
1880: 7b 72 65 76 20 74 73 7d 20 24 70 28 64 61 74 65 {rev ts} $p(date
1890: 29 20 7b 5f 20 61 7d 20 24 70 28 61 75 74 68 6f ) {_ a} $p(autho
18a0: 72 29 20 7b 5f 20 63 6d 7d 20 24 70 28 63 6f 6d r) {_ cm} $p(com
18b0: 6d 69 74 29 20 7b 5f 20 73 74 7d 20 24 70 28 73 mit) {_ st} $p(s
18c0: 74 61 74 65 29 20 7b 0a 09 20 20 20 20 73 65 74 tate) {.. set
18d0: 20 6f 70 20 5b 65 78 70 72 20 7b 28 24 72 65 76 op [expr {($rev
18e0: 20 65 71 20 22 31 2e 31 22 29 20 3f 20 22 41 22 eq "1.1") ? "A"
18f0: 20 3a 20 22 4d 22 7d 5d 0a 09 20 20 20 20 69 66 : "M"}].. if
1900: 20 7b 24 73 74 20 65 71 20 22 64 65 61 64 22 7d {$st eq "dead"}
1910: 20 7b 73 65 74 20 6f 70 20 22 52 22 7d 0a 0a 09 {set op "R"}...
1920: 20 20 20 20 23 20 41 20 64 65 61 64 2d 66 69 72 # A dead-fir
1930: 73 74 20 72 65 76 69 73 69 6f 6e 20 69 73 20 72 st revision is r
1940: 65 76 20 31 2e 31 20 77 69 74 68 20 6f 70 20 52 ev 1.1 with op R
1950: 2e 20 46 6f 72 20 61 6e 0a 09 20 20 20 20 23 20 . For an.. #
1960: 65 78 61 6d 70 6c 65 20 73 65 65 20 74 68 65 20 example see the
1970: 66 69 6c 65 20 6d 65 6d 63 68 61 6e 2f 44 45 50 file memchan/DEP
1980: 45 4e 44 45 4e 43 49 45 53 2e 20 53 75 63 68 20 ENDENCIES. Such
1990: 61 20 66 69 6c 65 0a 09 20 20 20 20 23 20 73 65 a file.. # se
19a0: 65 6d 73 20 74 6f 20 65 78 69 73 74 20 6f 6e 6c ems to exist onl
19b0: 79 21 20 6f 6e 20 69 74 73 20 62 72 61 6e 63 68 y! on its branch
19c0: 2e 20 54 68 65 20 62 72 61 6e 63 68 65 73 0a 09 . The branches..
19d0: 20 20 20 20 23 20 69 6e 66 6f 72 6d 61 74 69 6f # informatio
19e0: 6e 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 n is set on the
19f0: 72 65 76 69 73 69 6f 6e 20 28 65 78 74 65 6e 64 revision (extend
1a00: 20 72 63 73 70 61 72 73 65 72 21 29 2c 0a 09 20 rcsparser!),..
1a10: 20 20 20 23 20 73 79 6d 62 6f 6c 73 20 68 61 73 # symbols has
1a20: 20 61 20 74 61 67 2c 20 72 65 66 65 72 69 6e 67 a tag, refering
1a30: 20 74 6f 20 61 20 62 72 61 6e 63 68 2c 20 70 6f to a branch, po
1a40: 73 73 69 62 6c 79 20 6d 61 67 69 63 2e 0a 0a 09 ssibly magic....
1a50: 20 20 20 20 69 66 20 7b 28 24 72 65 76 20 65 71 if {($rev eq
1a60: 20 22 31 2e 31 22 29 20 26 26 20 28 24 6f 70 20 "1.1") && ($op
1a70: 65 71 20 22 52 22 29 7d 20 7b 0a 09 09 77 72 69 eq "R")} {...wri
1a80: 74 65 20 32 20 63 76 73 20 7b 44 65 61 64 20 72 te 2 cvs {Dead r
1a90: 6f 6f 74 20 72 65 76 69 73 69 6f 6e 7d 0a 09 20 oot revision}..
1aa0: 20 20 20 7d 0a 0a 09 20 20 20 20 6c 61 70 70 65 }... lappe
1ab0: 6e 64 20 74 69 6d 65 6c 69 6e 65 28 24 74 73 29 nd timeline($ts)
1ac0: 20 5b 6c 69 73 74 20 24 6f 70 20 24 74 73 20 24 [list $op $ts $
1ad0: 61 20 24 72 65 76 20 24 66 20 24 63 6d 5d 0a 09 a $rev $f $cm]..
1ae0: 7d 0a 0a 09 23 75 6e 73 65 74 20 70 28 63 6f 6d }...#unset p(com
1af0: 6d 69 74 29 0a 09 23 70 61 72 72 61 79 20 70 0a mit)..#parray p.
1b00: 0a 09 69 6e 63 72 20 6e 0a 20 20 20 20 7d 0a 0a ..incr n. }..
1b10: 20 20 20 20 77 72 69 74 65 20 30 20 63 76 73 20 write 0 cvs
1b20: 22 50 72 6f 63 65 73 73 65 64 20 24 6e 20 5b 65 "Processed $n [e
1b30: 78 70 72 20 7b 28 24 6e 20 3d 3d 20 31 29 20 3f xpr {($n == 1) ?
1b40: 20 22 66 69 6c 65 22 20 3a 20 22 66 69 6c 65 73 "file" : "files
1b50: 22 7d 5d 22 0a 20 20 20 20 72 65 74 75 72 6e 0a "}]". return.
1b60: 7d 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61 }..namespace eva
1b70: 6c 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 20 l ::vc::cvs::ws
1b80: 7b 0a 20 20 20 20 23 20 50 61 74 68 20 6d 61 70 {. # Path map
1b90: 70 69 6e 67 73 2e 20 6e 70 61 74 68 73 3a 20 72 pings. npaths: r
1ba0: 63 73 20 66 69 6c 65 20 20 2d 3e 20 75 73 65 72 cs file -> user
1bb0: 20 66 69 6c 65 0a 20 20 20 20 23 20 20 20 20 20 file. #
1bc0: 20 20 20 20 20 20 20 20 20 20 20 72 70 61 74 68 rpath
1bd0: 73 3a 20 75 73 65 72 20 66 69 6c 65 20 2d 3e 20 s: user file ->
1be0: 72 63 73 20 66 69 6c 65 2c 20 64 65 61 64 2d 73 rcs file, dead-s
1bf0: 74 61 74 75 73 0a 0a 20 20 20 20 76 61 72 69 61 tatus.. varia
1c00: 62 6c 65 20 6e 70 61 74 68 73 20 20 20 3b 20 61 ble npaths ; a
1c10: 72 72 61 79 20 73 65 74 20 6e 70 61 74 68 73 20 rray set npaths
1c20: 20 20 7b 7d 0a 20 20 20 20 76 61 72 69 61 62 6c {}. variabl
1c30: 65 20 72 70 61 74 68 73 20 20 20 3b 20 61 72 72 e rpaths ; arr
1c40: 61 79 20 73 65 74 20 72 70 61 74 68 73 20 20 20 ay set rpaths
1c50: 7b 7d 0a 0a 20 20 20 20 23 20 54 69 6d 65 6c 69 {}.. # Timeli
1c60: 6e 65 3a 20 74 73 74 61 6d 70 20 2d 3e 20 28 6f ne: tstamp -> (o
1c70: 70 2c 20 74 73 74 61 6d 70 2c 20 61 75 74 68 6f p, tstamp, autho
1c80: 72 2c 20 72 65 76 69 73 69 6f 6e 2c 20 66 69 6c r, revision, fil
1c90: 65 2c 20 63 6f 6d 6d 69 74 20 6d 65 73 73 61 67 e, commit messag
1ca0: 65 29 0a 0a 20 20 20 20 76 61 72 69 61 62 6c 65 e).. variable
1cb0: 20 74 69 6d 65 6c 69 6e 65 20 3b 20 61 72 72 61 timeline ; arra
1cc0: 79 20 73 65 74 20 74 69 6d 65 6c 69 6e 65 20 7b y set timeline {
1cd0: 7d 0a 7d 0a 0a 23 20 47 72 6f 75 70 20 73 69 6e }.}..# Group sin
1ce0: 67 6c 65 20 63 68 61 6e 67 65 73 20 69 6e 74 6f gle changes into
1cf0: 20 63 68 61 6e 67 65 73 65 74 73 0a 0a 70 72 6f changesets..pro
1d00: 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a c ::vc::cvs::ws:
1d10: 3a 63 73 65 74 73 20 7b 7d 20 7b 0a 20 20 20 20 :csets {} {.
1d20: 76 61 72 69 61 62 6c 65 20 74 69 6d 65 6c 69 6e variable timelin
1d30: 65 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 63 e. variable c
1d40: 73 65 74 73 0a 20 20 20 20 76 61 72 69 61 62 6c sets. variabl
1d50: 65 20 6e 63 73 0a 20 20 20 20 76 61 72 69 61 62 e ncs. variab
1d60: 6c 65 20 63 6d 61 70 0a 0a 20 20 20 20 61 72 72 le cmap.. arr
1d70: 61 79 20 75 6e 73 65 74 20 63 73 65 74 73 20 2a ay unset csets *
1d80: 20 3b 20 61 72 72 61 79 20 73 65 74 20 63 73 65 ; array set cse
1d90: 74 73 20 7b 7d 0a 20 20 20 20 61 72 72 61 79 20 ts {}. array
1da0: 75 6e 73 65 74 20 63 6d 61 70 20 20 2a 20 3b 20 unset cmap * ;
1db0: 61 72 72 61 79 20 73 65 74 20 63 6d 61 70 20 20 array set cmap
1dc0: 7b 7d 0a 20 20 20 20 73 65 74 20 6e 63 73 20 30 {}. set ncs 0
1dd0: 0a 0a 20 20 20 20 77 72 69 74 65 20 30 20 63 76 .. write 0 cv
1de0: 73 20 22 50 72 6f 63 65 73 73 69 6e 67 20 74 69 s "Processing ti
1df0: 6d 65 6c 69 6e 65 22 0a 0a 20 20 20 20 73 65 74 meline".. set
1e00: 20 6e 20 30 0a 20 20 20 20 43 53 43 6c 65 61 72 n 0. CSClear
1e10: 0a 20 20 20 20 3a 3a 66 6f 72 65 61 63 68 20 74 . ::foreach t
1e20: 73 20 5b 6c 73 6f 72 74 20 2d 64 69 63 74 20 5b s [lsort -dict [
1e30: 61 72 72 61 79 20 6e 61 6d 65 73 20 74 69 6d 65 array names time
1e40: 6c 69 6e 65 5d 5d 20 7b 0a 0a 09 23 20 6f 70 20 line]] {...# op
1e50: 74 73 74 61 6d 70 20 61 75 74 68 6f 72 20 72 65 tstamp author re
1e60: 76 69 73 69 6f 6e 20 66 69 6c 65 20 63 6f 6d 6d vision file comm
1e70: 69 74 0a 09 23 20 30 20 20 31 20 20 20 20 20 20 it..# 0 1
1e80: 32 20 20 20 20 20 20 33 20 20 20 20 20 20 20 20 2 3
1e90: 34 20 20 20 20 35 2f 65 6e 64 0a 09 23 20 62 20 4 5/end..# b
1ea0: 20 20 20 20 20 20 20 20 63 20 20 20 20 20 20 20 c
1eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 61 0a 0a a..
1ec0: 09 73 65 74 20 65 6e 74 72 69 65 73 20 5b 6c 73 .set entries [ls
1ed0: 6f 72 74 20 2d 69 6e 64 65 78 20 32 20 5b 6c 73 ort -index 2 [ls
1ee0: 6f 72 74 20 2d 69 6e 64 65 78 20 30 20 5b 6c 73 ort -index 0 [ls
1ef0: 6f 72 74 20 2d 69 6e 64 65 78 20 65 6e 64 20 24 ort -index end $
1f00: 74 69 6d 65 6c 69 6e 65 28 24 74 73 29 5d 5d 5d timeline($ts)]]]
1f10: 0a 09 23 70 75 74 73 20 5b 6a 6f 69 6e 20 24 65 ..#puts [join $e
1f20: 6e 74 72 69 65 73 20 5c 6e 5d 0a 0a 09 3a 3a 66 ntries \n]...::f
1f30: 6f 72 65 61 63 68 20 65 6e 74 72 79 20 20 24 65 oreach entry $e
1f40: 6e 74 72 69 65 73 20 7b 0a 09 20 20 20 20 69 66 ntries {.. if
1f50: 20 7b 21 5b 43 53 4e 6f 6e 65 5d 20 26 26 20 5b {![CSNone] && [
1f60: 43 53 4e 65 77 20 24 65 6e 74 72 79 5d 7d 20 7b CSNew $entry]} {
1f70: 0a 09 09 43 53 53 61 76 65 0a 09 09 43 53 43 6c ...CSSave...CSCl
1f80: 65 61 72 0a 09 09 23 70 75 74 73 20 3d 3d 5c 6e ear...#puts ==\n
1f90: 24 72 65 61 73 6f 6e 0a 09 20 20 20 20 7d 0a 09 $reason.. }..
1fa0: 20 20 20 20 43 53 41 64 64 20 24 65 6e 74 72 79 CSAdd $entry
1fb0: 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d 0a .. incr n..}.
1fc0: 20 20 20 20 7d 0a 0a 20 20 20 20 77 72 69 74 65 }.. write
1fd0: 20 30 20 63 76 73 20 22 50 72 6f 63 65 73 73 65 0 cvs "Processe
1fe0: 64 20 24 6e 20 5b 65 78 70 72 20 7b 28 24 6e 20 d $n [expr {($n
1ff0: 3d 3d 20 31 29 20 3f 20 22 65 6e 74 72 79 22 20 == 1) ? "entry"
2000: 3a 20 22 65 6e 74 72 69 65 73 22 7d 5d 22 0a 0a : "entries"}]"..
2010: 20 20 20 20 73 65 74 20 6e 20 5b 61 72 72 61 79 set n [array
2020: 20 73 69 7a 65 20 63 73 65 74 73 5d 0a 20 20 20 size csets].
2030: 20 77 72 69 74 65 20 30 20 63 76 73 20 22 46 6f write 0 cvs "Fo
2040: 75 6e 64 20 20 20 20 20 24 6e 20 5b 65 78 70 72 und $n [expr
2050: 20 7b 28 24 6e 20 3d 3d 20 31 29 20 3f 20 22 63 {($n == 1) ? "c
2060: 68 61 6e 67 65 73 65 74 22 20 3a 20 22 63 68 61 hangeset" : "cha
2070: 6e 67 65 73 65 74 73 22 7d 5d 22 0a 20 20 20 20 ngesets"}]".
2080: 72 65 74 75 72 6e 0a 7d 0a 0a 0a 6e 61 6d 65 73 return.}...names
2090: 70 61 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a pace eval ::vc::
20a0: 63 76 73 3a 3a 77 73 20 7b 0a 20 20 20 20 23 20 cvs::ws {. #
20b0: 43 68 61 6e 67 65 73 65 74 20 64 61 74 61 3a 0a Changeset data:.
20c0: 20 20 20 20 23 20 6e 63 73 3a 20 20 20 43 6f 75 # ncs: Cou
20d0: 6e 74 65 72 2d 62 61 73 65 64 20 69 64 20 67 65 nter-based id ge
20e0: 6e 65 72 61 74 69 6f 6e 0a 20 20 20 20 23 20 63 neration. # c
20f0: 73 65 74 73 3a 20 69 64 20 2d 3e 20 28 75 73 65 sets: id -> (use
2100: 72 20 63 6f 6d 6d 69 74 20 73 74 61 72 74 20 65 r commit start e
2110: 6e 64 20 64 65 70 74 68 20 28 66 69 6c 65 20 2d nd depth (file -
2120: 3e 20 28 6f 70 20 72 65 76 29 29 29 0a 0a 20 20 > (op rev)))..
2130: 20 20 76 61 72 69 61 62 6c 65 20 6e 63 73 20 20 variable ncs
2140: 20 20 20 20 3b 20 73 65 74 20 20 20 20 20 20 20 ; set
2150: 6e 63 73 20 20 20 30 20 20 3b 20 23 20 43 6f 75 ncs 0 ; # Cou
2160: 6e 74 65 72 20 66 6f 72 20 63 68 61 6e 67 65 73 nter for changes
2170: 65 74 73 0a 20 20 20 20 76 61 72 69 61 62 6c 65 ets. variable
2180: 20 63 73 65 74 73 20 20 20 20 3b 20 61 72 72 61 csets ; arra
2190: 79 20 73 65 74 20 63 73 65 74 73 20 7b 7d 20 3b y set csets {} ;
21a0: 20 23 20 43 68 61 6e 67 65 73 65 74 20 64 61 74 # Changeset dat
21b0: 61 0a 7d 0a 0a 23 20 42 75 69 6c 64 69 6e 67 20 a.}..# Building
21c0: 74 68 65 20 72 65 76 69 73 69 6f 6e 20 74 72 65 the revision tre
21d0: 65 20 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 e from the chang
21e0: 65 73 65 74 73 2e 0a 23 20 4c 69 6d 69 74 61 74 esets..# Limitat
21f0: 69 6f 6e 3a 20 43 75 72 72 65 6e 74 6c 79 20 6f ion: Currently o
2200: 6e 6c 79 20 74 72 75 6e 6b 20 63 73 65 74 73 20 nly trunk csets
2210: 69 73 20 68 61 6e 64 6c 65 64 2e 0a 23 20 4c 69 is handled..# Li
2220: 6d 69 74 61 74 69 6f 6e 3a 20 44 65 61 64 20 66 mitation: Dead f
2230: 69 6c 65 73 20 61 72 65 20 6e 6f 74 20 72 65 6d iles are not rem
2240: 6f 76 65 64 2c 20 69 2e 65 2e 20 6e 6f 20 27 52 oved, i.e. no 'R
2250: 27 20 61 63 74 69 6f 6e 73 20 72 69 67 68 74 20 ' actions right
2260: 6e 6f 77 2e 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a now...proc ::vc:
2270: 3a 63 76 73 3a 3a 77 73 3a 3a 72 74 72 65 65 20 :cvs::ws::rtree
2280: 7b 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c {} {. variabl
2290: 65 20 63 73 65 74 73 0a 20 20 20 20 76 61 72 69 e csets. vari
22a0: 61 62 6c 65 20 72 74 72 65 65 20 7b 7d 0a 20 20 able rtree {}.
22b0: 20 20 76 61 72 69 61 62 6c 65 20 6e 74 72 75 6e variable ntrun
22c0: 6b 20 30 0a 0a 20 20 20 20 77 72 69 74 65 20 30 k 0.. write 0
22d0: 20 63 76 73 20 22 45 78 74 72 61 63 74 69 6e 67 cvs "Extracting
22e0: 20 74 68 65 20 74 72 75 6e 6b 22 0a 0a 20 20 20 the trunk"..
22f0: 20 73 65 74 20 72 74 72 65 65 20 5b 73 74 72 75 set rtree [stru
2300: 63 74 3a 3a 74 72 65 65 20 3a 3a 76 63 3a 3a 63 ct::tree ::vc::c
2310: 76 73 3a 3a 77 73 3a 3a 52 54 5d 0a 20 20 20 20 vs::ws::RT].
2320: 24 72 74 72 65 65 20 72 65 6e 61 6d 65 20 72 6f $rtree rename ro
2330: 6f 74 20 30 20 3b 20 23 20 52 6f 6f 74 20 69 73 ot 0 ; # Root is
2340: 20 66 69 72 73 74 20 63 68 61 6e 67 65 73 65 74 first changeset
2350: 2c 20 61 6c 77 61 79 73 2e 0a 20 20 20 20 73 65 , always.. se
2360: 74 20 74 72 75 6e 6b 20 30 0a 20 20 20 20 73 65 t trunk 0. se
2370: 74 20 6e 74 72 75 6e 6b 20 31 20 3b 20 23 20 52 t ntrunk 1 ; # R
2380: 6f 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 74 72 oot is on the tr
2390: 75 6e 6b 2e 0a 20 20 20 20 73 65 74 20 62 20 20 unk.. set b
23a0: 20 20 20 20 30 20 3b 20 23 20 4e 6f 20 62 72 61 0 ; # No bra
23b0: 6e 63 68 20 63 73 65 74 73 20 66 6f 75 6e 64 20 nch csets found
23c0: 79 65 74 2e 0a 0a 20 20 20 20 23 20 45 78 74 72 yet... # Extr
23d0: 61 63 74 69 6e 67 20 74 68 65 20 74 72 75 6e 6b acting the trunk
23e0: 20 69 73 20 65 61 73 79 2c 20 73 69 6d 70 6c 79 is easy, simply
23f0: 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 74 by looking at t
2400: 68 65 20 69 6e 76 6f 6c 76 65 64 0a 20 20 20 20 he involved.
2410: 23 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 # version number
2420: 73 2e 20 0a 0a 20 20 20 20 3a 3a 66 6f 72 65 61 s. .. ::forea
2430: 63 68 20 63 20 5b 6c 72 61 6e 67 65 20 5b 6c 73 ch c [lrange [ls
2440: 6f 72 74 20 2d 69 6e 74 65 67 65 72 20 5b 61 72 ort -integer [ar
2450: 72 61 79 20 6e 61 6d 65 73 20 63 73 65 74 73 5d ray names csets]
2460: 5d 20 31 20 65 6e 64 5d 20 7b 0a 09 3a 3a 66 6f ] 1 end] {..::fo
2470: 72 65 61 63 68 20 7b 75 20 63 6d 20 73 20 65 20 reach {u cm s e
2480: 72 64 20 66 7d 20 24 63 73 65 74 73 28 24 63 29 rd f} $csets($c)
2490: 20 62 72 65 61 6b 0a 0a 09 23 20 49 67 6e 6f 72 break...# Ignor
24a0: 65 20 62 72 61 6e 63 68 20 63 68 61 6e 67 65 73 e branch changes
24b0: 2c 20 6a 75 73 74 20 63 6f 75 6e 74 20 74 68 65 , just count the
24c0: 6d 20 66 6f 72 20 74 68 65 20 73 74 61 74 69 73 m for the statis
24d0: 74 69 63 73 2e 0a 09 69 66 20 7b 24 72 64 20 21 tics...if {$rd !
24e0: 3d 20 32 7d 20 7b 0a 09 20 20 20 20 69 6e 63 72 = 2} {.. incr
24f0: 20 62 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 b.. continue
2500: 0a 09 7d 0a 0a 09 23 20 54 72 75 6e 6b 20 72 65 ..}...# Trunk re
2510: 76 69 73 69 6f 6e 2c 20 63 6f 6e 6e 65 63 74 20 vision, connect
2520: 74 6f 2c 20 61 6e 64 20 75 70 64 61 74 65 20 74 to, and update t
2530: 68 65 20 68 65 61 64 2e 0a 09 24 72 74 72 65 65 he head...$rtree
2540: 20 69 6e 73 65 72 74 20 24 74 72 75 6e 6b 20 65 insert $trunk e
2550: 6e 64 20 24 63 0a 09 73 65 74 20 74 72 75 6e 6b nd $c..set trunk
2560: 20 24 63 0a 09 69 6e 63 72 20 6e 74 72 75 6e 6b $c..incr ntrunk
2570: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 72 69 74 . }.. writ
2580: 65 20 30 20 63 76 73 20 22 50 72 6f 63 65 73 73 e 0 cvs "Process
2590: 65 64 20 24 6e 74 72 75 6e 6b 20 74 72 75 6e 6b ed $ntrunk trunk
25a0: 20 20 5b 65 78 70 72 20 7b 28 24 6e 74 72 75 6e [expr {($ntrun
25b0: 6b 20 3d 3d 20 31 29 20 3f 20 22 63 68 61 6e 67 k == 1) ? "chang
25c0: 65 73 65 74 22 20 3a 20 22 63 68 61 6e 67 65 73 eset" : "changes
25d0: 65 74 73 22 7d 5d 22 0a 20 20 20 20 77 72 69 74 ets"}]". writ
25e0: 65 20 30 20 63 76 73 20 22 49 67 6e 6f 72 65 64 e 0 cvs "Ignored
25f0: 20 20 20 24 62 20 62 72 61 6e 63 68 20 5b 65 78 $b branch [ex
2600: 70 72 20 7b 28 24 62 20 3d 3d 20 31 29 20 3f 20 pr {($b == 1) ?
2610: 22 63 68 61 6e 67 65 73 65 74 22 20 3a 20 22 63 "changeset" : "c
2620: 68 61 6e 67 65 73 65 74 73 22 7d 5d 22 0a 20 20 hangesets"}]".
2630: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 6e 61 6d 65 return.}..name
2640: 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a space eval ::vc:
2650: 3a 63 76 73 3a 3a 77 73 20 7b 0a 20 20 20 20 23 :cvs::ws {. #
2660: 20 54 72 65 65 20 68 6f 6c 64 69 6e 67 20 74 72 Tree holding tr
2670: 75 6e 6b 20 61 6e 64 20 62 72 61 6e 63 68 20 69 unk and branch i
2680: 6e 66 6f 72 6d 61 74 69 6f 6e 20 28 73 74 72 75 nformation (stru
2690: 63 74 3a 3a 74 72 65 65 29 2e 0a 20 20 20 20 23 ct::tree).. #
26a0: 20 4e 6f 64 65 20 6e 61 6d 65 73 20 61 72 65 20 Node names are
26b0: 63 73 65 74 20 69 64 27 73 2e 0a 0a 20 20 20 20 cset id's...
26c0: 76 61 72 69 61 62 6c 65 20 72 74 72 65 65 20 7b variable rtree {
26d0: 7d 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e }. variable n
26e0: 74 72 75 6e 6b 20 30 0a 7d 0a 0a 70 72 6f 63 20 trunk 0.}..proc
26f0: 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 77 ::vc::cvs::ws::w
2700: 6f 72 6b 73 70 61 63 65 20 7b 7d 20 7b 0a 20 20 orkspace {} {.
2710: 20 20 76 61 72 69 61 62 6c 65 20 63 77 64 20 5b variable cwd [
2720: 70 77 64 5d 0a 20 20 20 20 76 61 72 69 61 62 6c pwd]. variabl
2730: 65 20 77 6f 72 6b 73 70 61 63 65 20 5b 66 69 6c e workspace [fil
2740: 65 75 74 69 6c 3a 3a 74 65 6d 70 66 69 6c 65 20 eutil::tempfile
2750: 69 6d 70 6f 72 74 46 5f 63 76 73 5f 77 73 5f 5d importF_cvs_ws_]
2760: 0a 20 20 20 20 66 69 6c 65 20 64 65 6c 65 74 65 . file delete
2770: 20 24 77 6f 72 6b 73 70 61 63 65 0a 20 20 20 20 $workspace.
2780: 66 69 6c 65 20 6d 6b 64 69 72 20 20 24 77 6f 72 file mkdir $wor
2790: 6b 73 70 61 63 65 0a 0a 20 20 20 20 77 72 69 74 kspace.. writ
27a0: 65 20 30 20 63 76 73 20 22 57 6f 72 6b 73 70 61 e 0 cvs "Workspa
27b0: 63 65 3a 20 20 24 77 6f 72 6b 73 70 61 63 65 22 ce: $workspace"
27c0: 0a 0a 20 20 20 20 63 64 20 20 20 20 20 24 77 6f .. cd $wo
27d0: 72 6b 73 70 61 63 65 20 3b 20 23 20 43 68 65 63 rkspace ; # Chec
27e0: 6b 6f 75 74 73 20 67 6f 20 68 65 72 65 2e 0a 20 kouts go here..
27f0: 20 20 20 72 65 74 75 72 6e 20 24 77 6f 72 6b 73 return $works
2800: 70 61 63 65 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 pace.}..proc ::v
2810: 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 77 73 73 65 c::cvs::ws::wsse
2820: 74 75 70 20 7b 63 7d 20 7b 0a 20 20 20 20 76 61 tup {c} {. va
2830: 72 69 61 62 6c 65 20 63 73 65 74 73 0a 20 20 20 riable csets.
2840: 20 76 61 72 69 61 62 6c 65 20 62 61 73 65 0a 20 variable base.
2850: 20 20 20 76 61 72 69 61 62 6c 65 20 70 72 6f 6a variable proj
2860: 65 63 74 0a 0a 20 20 20 20 23 20 70 77 64 20 3d ect.. # pwd =
2870: 20 77 6f 72 6b 73 70 61 63 65 0a 0a 20 20 20 20 workspace..
2880: 3a 3a 66 6f 72 65 61 63 68 20 7b 75 20 63 6d 20 ::foreach {u cm
2890: 73 20 65 20 72 64 20 66 73 7d 20 24 63 73 65 74 s e rd fs} $cset
28a0: 73 28 24 63 29 20 62 72 65 61 6b 0a 0a 20 20 20 s($c) break..
28b0: 20 77 72 69 74 65 20 31 20 63 76 73 20 22 40 20 write 1 cvs "@
28c0: 20 24 73 22 0a 0a 20 20 20 20 3a 3a 66 6f 72 65 $s".. ::fore
28d0: 61 63 68 20 6c 20 5b 73 70 6c 69 74 20 5b 73 74 ach l [split [st
28e0: 72 69 6e 67 20 74 72 69 6d 20 24 63 6d 5d 20 5c ring trim $cm] \
28f0: 6e 5d 20 7b 0a 09 77 72 69 74 65 20 31 20 63 76 n] {..write 1 cv
2900: 73 20 22 7c 20 20 24 6c 22 0a 20 20 20 20 7d 0a s "| $l". }.
2910: 0a 20 20 20 20 3a 3a 66 6f 72 65 61 63 68 20 7b . ::foreach {
2920: 66 20 6f 72 7d 20 24 66 73 20 7b 0a 09 3a 3a 66 f or} $fs {..::f
2930: 6f 72 65 61 63 68 20 7b 6f 70 20 72 7d 20 24 6f oreach {op r} $o
2940: 72 20 62 72 65 61 6b 0a 09 77 72 69 74 65 20 32 r break..write 2
2950: 20 63 76 73 20 22 24 6f 70 20 20 24 66 20 24 72 cvs "$op $f $r
2960: 22 0a 0a 09 69 66 20 7b 24 6f 70 20 65 71 20 22 "...if {$op eq "
2970: 52 22 7d 20 7b 0a 09 20 20 20 20 23 20 52 65 6d R"} {.. # Rem
2980: 6f 76 65 20 66 69 6c 65 20 66 72 6f 6d 20 77 6f ove file from wo
2990: 72 6b 73 70 61 63 65 2e 20 50 72 75 6e 65 20 65 rkspace. Prune e
29a0: 6d 70 74 79 20 64 69 72 65 63 74 6f 72 69 65 73 mpty directories
29b0: 2e 0a 09 20 20 20 20 23 0a 09 20 20 20 20 23 20 ... #.. #
29c0: 4e 4f 54 45 3a 20 41 20 64 65 61 64 2d 66 69 72 NOTE: A dead-fir
29d0: 73 74 20 66 69 6c 65 20 28 72 65 76 20 31 2e 31 st file (rev 1.1
29e0: 20 64 65 61 64 29 20 77 69 6c 6c 20 6e 65 76 65 dead) will neve
29f0: 72 20 68 61 76 65 0a 09 20 20 20 20 23 20 65 78 r have.. # ex
2a00: 69 73 74 65 64 2e 0a 09 20 20 20 20 23 0a 09 20 isted... #..
2a10: 20 20 20 23 20 4e 4f 54 45 3a 20 4c 6f 67 69 63 # NOTE: Logic
2a20: 61 6c 6c 79 20 65 6d 70 74 79 20 64 69 72 65 63 ally empty direc
2a30: 74 6f 72 69 65 73 20 73 74 69 6c 6c 20 70 68 79 tories still phy
2a40: 73 69 63 61 6c 6c 79 0a 09 20 20 20 20 23 20 63 sically.. # c
2a50: 6f 6e 74 61 69 6e 20 74 68 65 20 43 56 53 20 61 ontain the CVS a
2a60: 64 6d 69 6e 20 64 69 72 65 63 74 6f 72 79 2c 20 dmin directory,
2a70: 68 65 6e 63 65 20 74 68 65 20 63 68 65 63 6b 20 hence the check
2a80: 66 6f 72 20 3d 3d 0a 09 20 20 20 20 23 20 31 2c for ==.. # 1,
2a90: 20 6e 6f 74 20 3d 3d 20 30 2e 20 54 68 65 72 65 not == 0. There
2aa0: 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 20 68 might also be h
2ab0: 69 64 64 65 6e 20 66 69 6c 65 73 2c 20 77 65 20 idden files, we
2ac0: 63 6f 75 6e 74 0a 09 20 20 20 20 23 20 74 68 65 count.. # the
2ad0: 6d 20 61 73 20 77 65 6c 6c 2e 20 41 6c 77 61 79 m as well. Alway
2ae0: 73 20 68 69 64 64 65 6e 20 61 72 65 20 2e 20 61 s hidden are . a
2af0: 6e 64 20 2e 2e 20 61 6e 64 20 74 68 65 79 20 64 nd .. and they d
2b00: 6f 20 6e 6f 74 0a 09 20 20 20 20 23 20 63 6f 75 o not.. # cou
2b10: 6e 74 20 61 73 20 75 73 65 72 20 66 69 6c 65 2e nt as user file.
2b20: 0a 0a 09 20 20 20 20 66 69 6c 65 20 64 65 6c 65 ... file dele
2b30: 74 65 20 24 66 0a 09 20 20 20 20 73 65 74 20 66 te $f.. set f
2b40: 64 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 d [file dirname
2b50: 24 66 5d 0a 09 20 20 20 20 69 66 20 7b 0a 09 09 $f].. if {...
2b60: 28 5b 6c 6c 65 6e 67 74 68 20 5b 67 6c 6f 62 20 ([llength [glob
2b70: 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 2d 64 69 72 -nocomplain -dir
2b80: 65 63 74 6f 72 79 20 20 20 20 20 20 20 20 20 20 ectory
2b90: 20 20 20 20 24 66 64 20 2a 5d 5d 20 3d 3d 20 31 $fd *]] == 1
2ba0: 29 20 26 26 0a 09 09 28 5b 6c 6c 65 6e 67 74 68 ) &&...([llength
2bb0: 20 5b 67 6c 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61 [glob -nocompla
2bc0: 69 6e 20 2d 64 69 72 65 63 74 6f 72 79 20 2d 74 in -directory -t
2bd0: 79 70 65 20 68 69 64 64 65 6e 20 24 66 64 20 2a ype hidden $fd *
2be0: 5d 5d 20 3d 3d 20 32 29 0a 09 20 20 20 20 7d 20 ]] == 2).. }
2bf0: 7b 0a 09 09 66 69 6c 65 20 64 65 6c 65 74 65 20 {...file delete
2c00: 2d 66 6f 72 63 65 20 24 66 64 0a 09 20 20 20 20 -force $fd..
2c10: 7d 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 }..} else {..
2c20: 20 23 20 41 64 64 65 64 20 6f 72 20 6d 6f 64 69 # Added or modi
2c30: 66 69 65 64 2c 20 70 75 74 20 74 68 65 20 72 65 fied, put the re
2c40: 71 75 65 73 74 65 64 20 76 65 72 73 69 6f 6e 20 quested version
2c50: 6f 66 20 74 68 65 20 66 69 6c 65 0a 09 20 20 20 of the file..
2c60: 20 23 20 69 6e 74 6f 20 74 68 65 20 77 6f 72 6b # into the work
2c70: 73 70 61 63 65 2e 0a 0a 09 20 20 20 20 69 66 20 space.... if
2c80: 7b 24 70 72 6f 6a 65 63 74 20 6e 65 20 22 22 7d {$project ne ""}
2c90: 20 7b 73 65 74 20 66 20 24 70 72 6f 6a 65 63 74 {set f $project
2ca0: 2f 24 66 7d 0a 09 20 20 20 20 69 66 20 7b 5b 63 /$f}.. if {[c
2cb0: 61 74 63 68 20 7b 0a 09 09 64 6f 76 61 20 2d 64 atch {...dova -d
2cc0: 20 24 62 61 73 65 20 63 6f 20 2d 72 20 24 72 20 $base co -r $r
2cd0: 24 66 0a 09 20 20 20 20 7d 20 6d 73 67 5d 7d 20 $f.. } msg]}
2ce0: 7b 0a 09 09 69 66 20 7b 5b 73 74 72 69 6e 67 20 {...if {[string
2cf0: 6d 61 74 63 68 20 7b 2a 69 6e 76 61 6c 69 64 20 match {*invalid
2d00: 63 68 61 6e 67 65 20 74 65 78 74 2a 7d 20 24 6d change text*} $m
2d10: 73 67 5d 7d 20 7b 0a 09 09 20 20 20 20 23 20 54 sg]} {... # T
2d20: 68 65 20 61 72 63 68 69 76 65 20 6f 66 20 74 68 he archive of th
2d30: 65 20 66 69 6c 65 20 69 73 20 63 6f 72 72 75 70 e file is corrup
2d40: 74 65 64 20 61 6e 64 20 74 68 65 0a 09 09 20 20 ted and the...
2d50: 20 20 23 20 63 68 6f 73 65 6e 20 76 65 72 73 69 # chosen versi
2d60: 6f 6e 20 6e 6f 74 20 61 63 63 65 73 73 69 62 6c on not accessibl
2d70: 65 20 64 75 65 20 74 6f 20 74 68 61 74 2e 20 57 e due to that. W
2d80: 65 0a 09 09 20 20 20 20 23 20 72 65 70 6f 72 74 e... # report
2d90: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2c 20 62 75 the problem, bu
2da0: 74 20 6f 74 68 65 72 77 69 73 65 20 69 67 6e 6f t otherwise igno
2db0: 72 65 20 69 74 2e 20 41 73 0a 09 09 20 20 20 20 re it. As...
2dc0: 23 20 61 20 63 6f 6e 73 65 71 75 65 6e 63 65 20 # a consequence
2dd0: 74 68 65 20 64 65 73 74 69 6e 61 74 69 6f 6e 20 the destination
2de0: 72 65 70 6f 73 69 74 6f 72 79 20 77 69 6c 6c 20 repository will
2df0: 6e 6f 74 0a 09 09 20 20 20 20 23 20 63 6f 6e 74 not... # cont
2e00: 61 69 6e 20 74 68 65 20 66 75 6c 6c 20 68 69 73 ain the full his
2e10: 74 6f 72 79 20 6f 66 20 74 68 65 20 6e 61 6d 65 tory of the name
2e20: 64 20 66 69 6c 65 2e 20 42 79 0a 09 09 20 20 20 d file. By...
2e30: 20 23 20 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 # ignoring the
2e40: 70 72 6f 62 6c 65 6d 20 77 65 20 68 6f 77 65 76 problem we howev
2e50: 65 72 20 67 65 74 20 61 73 20 6d 75 63 68 20 61 er get as much a
2e60: 73 0a 09 09 20 20 20 20 23 20 69 73 20 70 6f 73 s... # is pos
2e70: 73 69 62 6c 65 2e 0a 0a 09 09 20 20 20 20 77 72 sible..... wr
2e80: 69 74 65 20 30 20 63 76 73 20 22 45 45 20 43 6f ite 0 cvs "EE Co
2e90: 72 72 75 70 74 65 64 20 61 72 63 68 69 76 65 20 rrupted archive
2ea0: 66 69 6c 65 2e 20 49 6e 61 63 63 65 73 73 69 62 file. Inaccessib
2eb0: 6c 65 20 72 65 76 69 73 69 6f 6e 2e 22 0a 09 09 le revision."...
2ec0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a 09 09 7d continue...}
2ed0: 0a 09 09 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 ...return -code
2ee0: 65 72 72 6f 72 20 24 6d 73 67 0a 09 20 20 20 20 error $msg..
2ef0: 7d 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 }..}. }..
2f00: 23 20 50 72 6f 76 69 64 65 20 6d 65 74 61 64 61 # Provide metada
2f10: 74 61 20 61 62 6f 75 74 20 74 68 65 20 63 68 61 ta about the cha
2f20: 6e 67 65 73 65 74 20 74 68 65 20 62 61 63 6b 65 ngeset the backe
2f30: 6e 64 20 6d 61 79 20 77 69 73 68 20 74 6f 20 68 nd may wish to h
2f40: 61 76 65 0a 20 20 20 20 72 65 74 75 72 6e 20 5b ave. return [
2f50: 6c 69 73 74 20 24 75 20 24 73 20 24 63 6d 5d 0a list $u $s $cm].
2f60: 7d 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61 }..namespace eva
2f70: 6c 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 20 l ::vc::cvs::ws
2f80: 7b 0a 20 20 20 20 23 20 57 6f 72 6b 73 70 61 63 {. # Workspac
2f90: 65 20 77 68 65 72 65 20 63 68 65 63 6b 6f 75 74 e where checkout
2fa0: 73 20 68 61 70 70 65 6e 0a 20 20 20 20 23 20 43 s happen. # C
2fb0: 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 20 64 urrent working d
2fc0: 69 72 65 63 74 6f 72 79 20 74 6f 20 67 6f 20 62 irectory to go b
2fd0: 61 63 6b 20 74 6f 20 61 66 74 65 72 20 74 68 65 ack to after the
2fe0: 20 69 6d 70 6f 72 74 2e 0a 0a 20 20 20 20 76 61 import... va
2ff0: 72 69 61 62 6c 65 20 77 6f 72 6b 73 70 61 63 65 riable workspace
3000: 20 7b 7d 0a 20 20 20 20 76 61 72 69 61 62 6c 65 {}. variable
3010: 20 63 77 64 20 20 20 20 20 20 20 7b 7d 0a 7d 0a cwd {}.}.
3020: 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a .proc ::vc::cvs:
3030: 3a 77 73 3a 3a 66 6f 72 65 61 63 68 5f 63 73 65 :ws::foreach_cse
3040: 74 20 7b 63 76 20 6e 6f 64 65 20 73 63 72 69 70 t {cv node scrip
3050: 74 7d 20 7b 0a 20 20 20 20 75 70 76 61 72 20 31 t} {. upvar 1
3060: 20 24 63 76 20 63 0a 20 20 20 20 76 61 72 69 61 $cv c. varia
3070: 62 6c 65 20 72 74 72 65 65 0a 0a 20 20 20 20 73 ble rtree.. s
3080: 65 74 20 63 20 24 6e 6f 64 65 0a 20 20 20 20 77 et c $node. w
3090: 68 69 6c 65 20 7b 31 7d 20 7b 0a 09 73 65 74 20 hile {1} {..set
30a0: 63 6f 64 65 20 5b 63 61 74 63 68 20 7b 75 70 6c code [catch {upl
30b0: 65 76 65 6c 20 31 20 24 73 63 72 69 70 74 7d 20 evel 1 $script}
30c0: 72 65 73 5d 0a 0a 09 23 20 30 20 2d 20 6f 6b 2c res]...# 0 - ok,
30d0: 20 31 20 2d 20 65 72 72 6f 72 2c 20 32 20 2d 20 1 - error, 2 -
30e0: 72 65 74 75 72 6e 2c 20 33 20 2d 20 62 72 65 61 return, 3 - brea
30f0: 6b 2c 20 34 20 2d 20 63 6f 6e 74 69 6e 75 65 0a k, 4 - continue.
3100: 09 73 77 69 74 63 68 20 2d 2d 20 24 63 6f 64 65 .switch -- $code
3110: 20 7b 0a 09 20 20 20 20 30 20 7b 7d 0a 09 20 20 {.. 0 {}..
3120: 20 20 31 20 7b 20 72 65 74 75 72 6e 20 2d 65 72 1 { return -er
3130: 72 6f 72 63 6f 64 65 20 24 3a 3a 65 72 72 6f 72 rorcode $::error
3140: 43 6f 64 65 20 2d 65 72 72 6f 72 69 6e 66 6f 20 Code -errorinfo
3150: 24 3a 3a 65 72 72 6f 72 49 6e 66 6f 20 2d 63 6f $::errorInfo -co
3160: 64 65 20 65 72 72 6f 72 20 24 72 65 73 20 7d 0a de error $res }.
3170: 09 20 20 20 20 32 20 7b 7d 0a 09 20 20 20 20 33 . 2 {}.. 3
3180: 20 7b 20 72 65 74 75 72 6e 20 7d 0a 09 20 20 20 { return }..
3190: 20 34 20 7b 7d 0a 09 20 20 20 20 64 65 66 61 75 4 {}.. defau
31a0: 6c 74 20 7b 0a 09 09 72 65 74 75 72 6e 20 2d 63 lt {...return -c
31b0: 6f 64 65 20 24 63 6f 64 65 20 24 72 65 73 75 6c ode $code $resul
31c0: 74 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 23 20 t.. }..}...#
31d0: 53 74 6f 70 20 6f 6e 20 72 65 61 63 68 69 6e 67 Stop on reaching
31e0: 20 74 68 65 20 68 65 61 64 2e 0a 09 69 66 20 7b the head...if {
31f0: 21 5b 6c 6c 65 6e 67 74 68 20 5b 24 72 74 72 65 ![llength [$rtre
3200: 65 20 63 68 69 6c 64 72 65 6e 20 24 63 5d 5d 7d e children $c]]}
3210: 20 62 72 65 61 6b 0a 0a 09 23 70 75 74 73 20 3c break...#puts <
3220: 5b 24 72 74 72 65 65 20 63 68 69 6c 64 72 65 6e [$rtree children
3230: 20 24 63 5d 3e 0a 0a 09 23 20 47 6f 20 74 6f 20 $c]>...# Go to
3240: 6e 65 78 74 20 63 68 69 6c 64 20 69 6e 20 74 72 next child in tr
3250: 75 6e 6b 20 28 6c 65 66 74 6d 6f 73 74 29 2e 0a unk (leftmost)..
3260: 09 73 65 74 20 63 20 5b 6c 69 6e 64 65 78 20 5b .set c [lindex [
3270: 24 72 74 72 65 65 20 63 68 69 6c 64 72 65 6e 20 $rtree children
3280: 24 63 5d 20 30 5d 0a 20 20 20 20 7d 0a 20 20 20 $c] 0]. }.
3290: 20 72 65 74 75 72 6e 0a 7d 0a 0a 23 20 2d 2d 2d return.}..# ---
32a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
32e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49 6e 74 ----------.# Int
32f0: 65 72 6e 61 6c 20 68 65 6c 70 65 72 20 63 6f 6d ernal helper com
3300: 6d 61 6e 64 73 3a 20 43 68 61 6e 67 65 73 65 74 mands: Changeset
3310: 20 69 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 20 inspection and
3320: 63 6f 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 0a 70 construction...p
3330: 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 roc ::vc::cvs::w
3340: 73 3a 3a 43 53 43 6c 65 61 72 20 7b 7d 20 7b 0a s::CSClear {} {.
3350: 20 20 20 20 75 70 76 61 72 20 31 20 73 74 61 72 upvar 1 star
3360: 74 20 73 74 61 72 74 20 65 6e 64 20 65 6e 64 20 t start end end
3370: 63 6d 20 63 6d 20 75 73 65 72 20 75 73 65 72 20 cm cm user user
3380: 66 69 6c 65 73 20 66 69 6c 65 73 20 6c 61 73 74 files files last
3390: 64 20 6c 61 73 74 64 0a 0a 20 20 20 20 73 65 74 d lastd.. set
33a0: 20 73 74 61 72 74 20 7b 7d 0a 20 20 20 20 73 65 start {}. se
33b0: 74 20 65 6e 64 20 20 20 7b 7d 0a 20 20 20 20 73 t end {}. s
33c0: 65 74 20 63 6d 20 20 20 20 7b 7d 0a 20 20 20 20 et cm {}.
33d0: 73 65 74 20 75 73 65 72 20 20 7b 7d 0a 20 20 20 set user {}.
33e0: 20 73 65 74 20 6c 61 73 74 64 20 7b 7d 0a 20 20 set lastd {}.
33f0: 20 20 61 72 72 61 79 20 75 6e 73 65 74 20 66 69 array unset fi
3400: 6c 65 73 20 2a 0a 20 20 20 20 61 72 72 61 79 20 les *. array
3410: 73 65 74 20 66 69 6c 65 73 20 7b 7d 0a 20 20 20 set files {}.
3420: 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 return.}..proc
3430: 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 43 ::vc::cvs::ws::C
3440: 53 4e 6f 6e 65 20 7b 7d 20 7b 0a 20 20 20 20 75 SNone {} {. u
3450: 70 76 61 72 20 31 20 73 74 61 72 74 20 73 74 61 pvar 1 start sta
3460: 72 74 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 65 rt. return [e
3470: 78 70 72 20 7b 24 73 74 61 72 74 20 65 71 20 22 xpr {$start eq "
3480: 22 7d 5d 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 "}].}..proc ::vc
3490: 3a 3a 63 76 73 3a 3a 77 73 3a 3a 43 53 4e 65 77 ::cvs::ws::CSNew
34a0: 20 7b 65 6e 74 72 79 7d 20 7b 0a 20 20 20 20 75 {entry} {. u
34b0: 70 76 61 72 20 31 20 73 74 61 72 74 20 73 74 61 pvar 1 start sta
34c0: 72 74 20 65 6e 64 20 65 6e 64 20 63 6d 20 63 6d rt end end cm cm
34d0: 20 75 73 65 72 20 75 73 65 72 20 66 69 6c 65 73 user user files
34e0: 20 66 69 6c 65 73 20 6c 61 73 74 64 20 6c 61 73 files lastd las
34f0: 74 64 20 72 65 61 73 6f 6e 20 72 65 61 73 6f 6e td reason reason
3500: 0a 0a 20 20 20 20 23 70 75 74 73 20 2d 6e 6f 6e .. #puts -non
3510: 65 77 6c 69 6e 65 20 73 74 64 6f 75 74 20 2e 20 ewline stdout .
3520: 3b 20 66 6c 75 73 68 20 73 74 64 6f 75 74 0a 0a ; flush stdout..
3530: 20 20 20 20 3a 3a 66 6f 72 65 61 63 68 20 7b 6f ::foreach {o
3540: 70 20 74 73 20 61 20 72 65 76 20 66 20 65 63 6d p ts a rev f ecm
3550: 7d 20 24 65 6e 74 72 79 20 62 72 65 61 6b 0a 0a } $entry break..
3560: 20 20 20 20 23 20 55 73 65 72 20 63 68 61 6e 67 # User chang
3570: 65 0a 20 20 20 20 69 66 20 7b 24 61 20 6e 65 20 e. if {$a ne
3580: 24 75 73 65 72 7d 20 7b 73 65 74 20 72 65 61 73 $user} {set reas
3590: 6f 6e 20 75 73 65 72 20 3b 20 72 65 74 75 72 6e on user ; return
35a0: 20 31 7d 0a 0a 20 20 20 20 23 20 46 69 6c 65 20 1}.. # File
35b0: 61 6c 72 65 61 64 79 20 69 6e 20 63 75 72 72 65 already in curre
35c0: 6e 74 20 63 73 65 74 0a 20 20 20 20 69 66 20 7b nt cset. if {
35d0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 66 69 6c [info exists fil
35e0: 65 73 28 24 66 29 5d 7d 20 7b 73 65 74 20 72 65 es($f)]} {set re
35f0: 61 73 6f 6e 20 66 69 6c 65 20 3b 20 72 65 74 75 ason file ; retu
3600: 72 6e 20 31 7d 0a 0a 20 20 20 20 23 20 43 75 72 rn 1}.. # Cur
3610: 72 65 6e 74 20 63 73 65 74 20 74 72 75 6e 6b 2f rent cset trunk/
3620: 62 72 61 6e 63 68 20 64 69 66 66 65 72 65 6e 74 branch different
3630: 20 66 72 6f 6d 20 65 6e 74 72 79 2e 0a 20 20 20 from entry..
3640: 20 73 65 74 20 64 65 70 74 68 20 5b 6c 6c 65 6e set depth [llen
3650: 67 74 68 20 5b 73 70 6c 69 74 20 24 72 65 76 20 gth [split $rev
3660: 2e 5d 5d 0a 20 20 20 20 69 66 20 7b 28 24 6c 61 .]]. if {($la
3670: 73 74 64 20 3d 3d 20 32 29 20 21 3d 20 28 24 64 std == 2) != ($d
3680: 65 70 74 68 20 3d 3d 20 32 29 7d 20 7b 73 65 74 epth == 2)} {set
3690: 20 72 65 61 73 6f 6e 20 64 65 70 74 68 2f 24 6c reason depth/$l
36a0: 61 73 74 64 2f 24 64 65 70 74 68 2f 28 24 72 65 astd/$depth/($re
36b0: 76 29 2f 24 66 20 3b 20 72 65 74 75 72 6e 20 31 v)/$f ; return 1
36c0: 7d 0a 0a 20 20 20 20 23 20 43 6f 6d 6d 69 74 20 }.. # Commit
36d0: 6d 65 73 73 61 67 65 20 63 68 61 6e 67 65 64 0a message changed.
36e0: 20 20 20 20 69 66 20 7b 24 63 6d 20 6e 65 20 24 if {$cm ne $
36f0: 65 63 6d 7d 20 7b 73 65 74 20 72 65 61 73 6f 6e ecm} {set reason
3700: 20 63 6d 73 67 5c 20 3c 3c 24 65 63 6d 3e 3e 20 cmsg\ <<$ecm>>
3710: 3b 20 72 65 74 75 72 6e 20 31 7d 0a 0a 20 20 20 ; return 1}..
3720: 20 23 20 45 76 65 72 79 74 68 69 6e 67 20 69 73 # Everything is
3730: 20 67 6f 6f 64 2c 20 73 74 69 6c 6c 20 74 68 65 good, still the
3740: 20 73 61 6d 65 20 63 73 65 74 0a 20 20 20 20 72 same cset. r
3750: 65 74 75 72 6e 20 30 0a 7d 0a 0a 70 72 6f 63 20 eturn 0.}..proc
3760: 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 43 ::vc::cvs::ws::C
3770: 53 53 61 76 65 20 7b 7d 20 7b 0a 20 20 20 20 76 SSave {} {. v
3780: 61 72 69 61 62 6c 65 20 63 6d 61 70 0a 20 20 20 ariable cmap.
3790: 20 76 61 72 69 61 62 6c 65 20 63 73 65 74 73 0a variable csets.
37a0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 63 73 variable ncs
37b0: 0a 20 20 20 20 75 70 76 61 72 20 31 20 73 74 61 . upvar 1 sta
37c0: 72 74 20 73 74 61 72 74 20 65 6e 64 20 65 6e 64 rt start end end
37d0: 20 63 6d 20 63 6d 20 75 73 65 72 20 75 73 65 72 cm cm user user
37e0: 20 66 69 6c 65 73 20 66 69 6c 65 73 20 6c 61 73 files files las
37f0: 74 64 20 6c 61 73 74 64 0a 0a 20 20 20 20 73 65 td lastd.. se
3800: 74 20 63 73 65 74 73 28 24 6e 63 73 29 20 5b 6c t csets($ncs) [l
3810: 69 73 74 20 24 75 73 65 72 20 24 63 6d 20 24 73 ist $user $cm $s
3820: 74 61 72 74 20 24 65 6e 64 20 24 6c 61 73 74 64 tart $end $lastd
3830: 20 5b 61 72 72 61 79 20 67 65 74 20 66 69 6c 65 [array get file
3840: 73 5d 5d 0a 0a 20 20 20 20 23 20 52 65 63 6f 72 s]].. # Recor
3850: 64 20 77 68 69 63 68 20 72 65 76 69 73 69 6f 6e d which revision
3860: 73 20 6f 66 20 61 20 66 69 6c 65 20 61 72 65 20 s of a file are
3870: 69 6e 20 77 68 61 74 20 63 73 65 74 73 0a 20 20 in what csets.
3880: 20 20 3a 3a 66 6f 72 65 61 63 68 20 7b 66 20 6f ::foreach {f o
3890: 72 7d 20 5b 61 72 72 61 79 20 67 65 74 20 66 69 r} [array get fi
38a0: 6c 65 73 5d 20 7b 0a 09 3a 3a 66 6f 72 65 61 63 les] {..::foreac
38b0: 68 20 7b 5f 20 72 65 76 7d 20 24 6f 72 20 62 72 h {_ rev} $or br
38c0: 65 61 6b 0a 09 73 65 74 20 63 6d 61 70 28 5b 6c eak..set cmap([l
38d0: 69 73 74 20 24 66 20 24 72 65 76 5d 29 20 24 6e ist $f $rev]) $n
38e0: 63 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 43 cs. }.. #C
38f0: 53 44 75 6d 70 20 24 6e 63 73 0a 0a 20 20 20 20 SDump $ncs..
3900: 69 6e 63 72 20 6e 63 73 0a 20 20 20 20 72 65 74 incr ncs. ret
3910: 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 urn.}..proc ::vc
3920: 3a 3a 63 76 73 3a 3a 77 73 3a 3a 43 53 41 64 64 ::cvs::ws::CSAdd
3930: 20 7b 65 6e 74 72 79 7d 20 7b 0a 20 20 20 20 75 {entry} {. u
3940: 70 76 61 72 20 31 20 73 74 61 72 74 20 73 74 61 pvar 1 start sta
3950: 72 74 20 65 6e 64 20 65 6e 64 20 63 6d 20 63 6d rt end end cm cm
3960: 20 75 73 65 72 20 75 73 65 72 20 66 69 6c 65 73 user user files
3970: 20 66 69 6c 65 73 20 6c 61 73 74 64 20 6c 61 73 files lastd las
3980: 74 64 0a 0a 20 20 20 20 3a 3a 66 6f 72 65 61 63 td.. ::foreac
3990: 68 20 7b 6f 70 20 74 73 20 61 20 72 65 76 20 66 h {op ts a rev f
39a0: 20 65 63 6d 7d 20 24 65 6e 74 72 79 20 62 72 65 ecm} $entry bre
39b0: 61 6b 0a 0a 20 20 20 20 69 66 20 7b 24 73 74 61 ak.. if {$sta
39c0: 72 74 20 65 71 20 22 22 7d 20 7b 73 65 74 20 73 rt eq ""} {set s
39d0: 74 61 72 74 20 24 74 73 7d 0a 20 20 20 20 73 65 tart $ts}. se
39e0: 74 20 65 6e 64 20 20 20 20 20 20 20 24 74 73 0a t end $ts.
39f0: 20 20 20 20 73 65 74 20 63 6d 20 20 20 20 20 20 set cm
3a00: 20 20 24 65 63 6d 0a 20 20 20 20 73 65 74 20 75 $ecm. set u
3a10: 73 65 72 20 20 20 20 20 20 24 61 0a 20 20 20 20 ser $a.
3a20: 73 65 74 20 66 69 6c 65 73 28 24 66 29 20 5b 6c set files($f) [l
3a30: 69 73 74 20 24 6f 70 20 24 72 65 76 5d 0a 20 20 ist $op $rev].
3a40: 20 20 73 65 74 20 6c 61 73 74 64 20 20 20 20 20 set lastd
3a50: 5b 6c 6c 65 6e 67 74 68 20 5b 73 70 6c 69 74 20 [llength [split
3a60: 24 72 65 76 20 2e 5d 5d 0a 20 20 20 20 72 65 74 $rev .]]. ret
3a70: 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 urn.}..proc ::vc
3a80: 3a 3a 63 76 73 3a 3a 77 73 3a 3a 43 53 44 75 6d ::cvs::ws::CSDum
3a90: 70 20 7b 63 7d 20 7b 0a 20 20 20 20 76 61 72 69 p {c} {. vari
3aa0: 61 62 6c 65 20 63 73 65 74 73 0a 20 20 20 20 3a able csets. :
3ab0: 3a 66 6f 72 65 61 63 68 20 7b 75 20 63 6d 20 73 :foreach {u cm s
3ac0: 20 65 20 72 64 20 66 7d 20 24 63 73 65 74 73 28 e rd f} $csets(
3ad0: 24 63 29 20 62 72 65 61 6b 0a 0a 20 20 20 20 70 $c) break.. p
3ae0: 75 74 73 20 22 24 75 20 24 73 22 3b 20 72 65 67 uts "$u $s"; reg
3af0: 73 75 62 20 2d 61 6c 6c 20 7b 2e 7d 20 24 75 20 sub -all {.} $u
3b00: 7b 20 7d 20 62 0a 20 20 20 20 70 75 74 73 20 22 { } b. puts "
3b10: 24 62 20 24 65 22 0a 20 20 20 20 3a 3a 66 6f 72 $b $e". ::for
3b20: 65 61 63 68 20 7b 66 20 6f 72 7d 20 24 66 20 7b each {f or} $f {
3b30: 0a 09 3a 3a 66 6f 72 65 61 63 68 20 7b 6f 20 72 ..::foreach {o r
3b40: 7d 20 24 6f 72 20 62 72 65 61 6b 0a 09 70 75 74 } $or break..put
3b50: 73 20 22 24 62 20 24 6f 20 24 66 20 24 72 22 0a s "$b $o $f $r".
3b60: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
3b70: 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .}..# ----------
3b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3b90: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ba0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3bb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3bc0: 2d 2d 2d 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65 ---..namespace e
3bd0: 76 61 6c 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 val ::vc::cvs::w
3be0: 73 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 s {. variable
3bf0: 20 62 61 73 65 20 20 20 20 7b 7d 20 3b 20 23 20 base {} ; #
3c00: 54 6f 70 6c 65 76 65 6c 20 72 65 70 6f 73 69 74 Toplevel reposit
3c10: 6f 72 79 20 64 69 72 65 63 74 6f 72 79 0a 20 20 ory directory.
3c20: 20 20 76 61 72 69 61 62 6c 65 20 70 72 6f 6a 65 variable proje
3c30: 63 74 20 7b 7d 20 3b 20 23 20 53 75 62 20 64 69 ct {} ; # Sub di
3c40: 72 65 63 74 6f 72 79 20 74 6f 20 6c 69 6d 69 74 rectory to limit
3c50: 20 74 68 65 20 69 6d 70 6f 72 74 20 74 6f 2e 0a the import to..
3c60: 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 65 . namespace e
3c70: 78 70 6f 72 74 20 63 6f 6e 66 69 67 75 72 65 20 xport configure
3c80: 62 65 67 69 6e 20 64 6f 6e 65 20 66 6f 72 65 61 begin done forea
3c90: 63 68 20 6e 63 73 65 74 73 20 63 68 65 63 6b 6f ch ncsets checko
3ca0: 75 74 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d ut.}..# --------
3cb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3cf0: 2d 2d 2d 2d 2d 0a 23 20 52 65 61 64 79 0a 0a 70 -----.# Ready..p
3d00: 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20 76 ackage provide v
3d10: 63 3a 3a 63 76 73 3a 3a 77 73 20 31 2e 30 0a 72 c::cvs::ws 1.0.r
3d20: 65 74 75 72 6e 0a eturn.