Artifact ad0046436f1ed290be6f136a1efb813bbb3d3908:
File
tools/lib/cvs.tcl
part of check-in
[72dac950c3]
- Continued work on the import of branches. Main principle now is to handle the branches vertically. First the trunk, then the branch starting with the first unprocessed changeset, and so forth. Looks more promising than the previous approach. Currently handles just a bit over half of the test projects (11 of 21 in 6 repositories).
by
aku on
2007-09-26 05:06:18.
0000: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d # --------------
0010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
0050: 23 20 52 65 70 6f 73 69 74 6f 72 79 20 6d 61 6e # Repository man
0060: 61 67 65 6d 65 6e 74 20 28 43 56 53 29 0a 0a 23 agement (CVS)..#
0070: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------
0080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
00a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
00b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 --------------.#
00c0: 20 52 65 71 75 69 72 65 6d 65 6e 74 73 0a 0a 70 Requirements..p
00d0: 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 54 ackage require T
00e0: 63 6c 20 38 2e 34 0a 70 61 63 6b 61 67 65 20 72 cl 8.4.package r
00f0: 65 71 75 69 72 65 20 66 69 6c 65 75 74 69 6c 20 equire fileutil
0100: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23 ; #
0110: 20 54 63 6c 6c 69 62 20 28 74 72 61 76 65 72 73 Tcllib (travers
0120: 65 20 64 69 72 65 63 74 6f 72 79 20 68 69 65 72 e directory hier
0130: 61 72 63 68 79 29 0a 70 61 63 6b 61 67 65 20 72 archy).package r
0140: 65 71 75 69 72 65 20 76 63 3a 3a 72 63 73 3a 3a equire vc::rcs::
0150: 70 61 72 73 65 72 20 20 20 20 20 20 20 3b 20 23 parser ; #
0160: 20 48 61 6e 64 6c 69 6e 67 20 74 68 65 20 52 43 Handling the RC
0170: 53 20 61 72 63 68 69 76 65 20 66 69 6c 65 73 2e S archive files.
0180: 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 .package require
0190: 20 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 20 vc::tools::log
01a0: 20 20 20 20 20 20 20 3b 20 23 20 55 73 65 72 20 ; # User
01b0: 66 65 65 64 62 61 63 6b 0a 70 61 63 6b 61 67 65 feedback.package
01c0: 20 72 65 71 75 69 72 65 20 76 63 3a 3a 74 6f 6f require vc::too
01d0: 6c 73 3a 3a 74 72 6f 75 62 6c 65 20 20 20 20 3b ls::trouble ;
01e0: 20 23 20 45 72 72 6f 72 20 68 61 6e 64 6c 69 6e # Error handlin
01f0: 67 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 g.package requir
0200: 65 20 76 63 3a 3a 63 76 73 3a 3a 63 6d 64 20 20 e vc::cvs::cmd
0210: 20 20 20 20 20 20 20 20 3b 20 23 20 41 63 63 65 ; # Acce
0220: 73 73 20 74 6f 20 63 76 73 20 61 70 70 6c 69 63 ss to cvs applic
0230: 61 74 69 6f 6e 2e 0a 70 61 63 6b 61 67 65 20 72 ation..package r
0240: 65 71 75 69 72 65 20 76 63 3a 3a 63 76 73 3a 3a equire vc::cvs::
0250: 77 73 3a 3a 66 69 6c 65 73 20 20 20 20 3b 20 23 ws::files ; #
0260: 20 53 63 61 6e 20 43 56 53 20 72 65 70 6f 73 69 Scan CVS reposi
0270: 74 6f 72 79 20 66 6f 72 20 72 65 6c 65 76 61 6e tory for relevan
0280: 74 20 66 69 6c 65 73 2e 0a 70 61 63 6b 61 67 65 t files..package
0290: 20 72 65 71 75 69 72 65 20 76 63 3a 3a 63 76 73 require vc::cvs
02a0: 3a 3a 77 73 3a 3a 74 69 6d 65 6c 69 6e 65 20 3b ::ws::timeline ;
02b0: 20 23 20 4d 61 6e 61 67 65 20 74 69 6d 65 6c 69 # Manage timeli
02c0: 6e 65 20 6f 66 20 61 6c 6c 20 63 68 61 6e 67 65 ne of all change
02d0: 73 2e 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 s..package requi
02e0: 72 65 20 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a re vc::cvs::ws::
02f0: 63 73 65 74 73 20 20 20 20 3b 20 23 20 4d 61 6e csets ; # Man
0300: 61 67 65 20 74 68 65 20 63 68 61 6e 67 65 73 65 age the changese
0310: 74 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 20 ts found in the
0320: 74 69 6d 65 6c 69 6e 65 0a 70 61 63 6b 61 67 65 timeline.package
0330: 20 72 65 71 75 69 72 65 20 76 63 3a 3a 63 76 73 require vc::cvs
0340: 3a 3a 77 73 3a 3a 62 72 61 6e 63 68 20 20 20 3b ::ws::branch ;
0350: 20 23 20 42 72 61 6e 63 68 20 64 61 74 61 62 61 # Branch databa
0360: 73 65 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 se.package requi
0370: 72 65 20 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a re vc::cvs::ws::
0380: 73 69 67 20 20 20 20 20 20 3b 20 23 20 43 68 61 sig ; # Cha
0390: 6e 67 65 73 65 74 20 66 69 6c 65 2f 72 65 76 20 ngeset file/rev
03a0: 73 69 67 6e 61 74 75 72 65 73 0a 0a 6e 61 6d 65 signatures..name
03b0: 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a space eval ::vc:
03c0: 3a 63 76 73 3a 3a 77 73 20 7b 0a 20 20 20 20 76 :cvs::ws {. v
03d0: 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 3a 3a 73 c::tools::log::s
03e0: 79 73 74 65 6d 20 63 76 73 0a 20 20 20 20 6e 61 ystem cvs. na
03f0: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a mespace import :
0400: 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 3a :vc::tools::log:
0410: 3a 77 72 69 74 65 0a 20 20 20 20 6e 61 6d 65 73 :write. names
0420: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 pace import ::vc
0430: 3a 3a 72 63 73 3a 3a 70 61 72 73 65 72 3a 3a 70 ::rcs::parser::p
0440: 72 6f 63 65 73 73 0a 20 20 20 20 6e 61 6d 65 73 rocess. names
0450: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 pace import ::vc
0460: 3a 3a 63 76 73 3a 3a 63 6d 64 3a 3a 64 6f 76 61 ::cvs::cmd::dova
0470: 0a 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 .. namespace
0480: 65 76 61 6c 20 74 72 6f 75 62 6c 65 20 7b 20 6e eval trouble { n
0490: 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 amespace import
04a0: 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 74 72 6f ::vc::tools::tro
04b0: 75 62 6c 65 3a 3a 2a 20 7d 0a 7d 0a 0a 23 20 2d uble::* }.}..# -
04c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0500: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 41 ------------.# A
0510: 50 49 0a 0a 23 20 76 63 3a 3a 63 76 73 3a 3a 77 PI..# vc::cvs::w
0520: 73 3a 3a 63 6f 6e 66 69 67 75 72 65 20 6b 65 79 s::configure key
0530: 20 76 61 6c 75 65 20 20 20 20 2d 20 43 6f 6e 66 value - Conf
0540: 69 67 75 72 65 20 74 68 65 20 73 75 62 73 79 73 igure the subsys
0550: 74 65 6d 2e 0a 23 20 76 63 3a 3a 63 76 73 3a 3a tem..# vc::cvs::
0560: 77 73 3a 3a 63 68 65 63 6b 20 20 20 20 20 73 72 ws::check sr
0570: 63 20 6d 76 20 20 20 20 20 20 20 2d 20 43 68 65 c mv - Che
0580: 63 6b 20 69 66 20 73 72 63 20 69 73 20 61 20 43 ck if src is a C
0590: 56 53 20 72 65 70 6f 73 69 74 6f 72 79 20 64 69 VS repository di
05a0: 72 65 63 74 6f 72 79 2e 0a 23 20 76 63 3a 3a 63 rectory..# vc::c
05b0: 76 73 3a 3a 77 73 3a 3a 62 65 67 69 6e 20 20 20 vs::ws::begin
05c0: 20 20 73 72 63 20 20 20 20 20 20 20 20 20 20 2d src -
05d0: 20 53 74 61 72 74 20 6e 65 77 20 77 6f 72 6b 73 Start new works
05e0: 70 61 63 65 20 61 6e 64 20 72 65 74 75 72 6e 20 pace and return
05f0: 74 68 65 20 74 6f 70 2d 0a 23 20 20 20 20 20 20 the top-.#
0600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0620: 20 6d 6f 73 74 20 64 69 72 65 63 74 6f 72 79 20 most directory
0630: 63 6f 27 64 20 66 69 6c 65 73 20 61 72 65 20 70 co'd files are p
0640: 75 74 20 69 6e 74 6f 2e 0a 23 20 76 63 3a 3a 63 ut into..# vc::c
0650: 76 73 3a 3a 77 73 3a 3a 6e 63 73 65 74 73 20 20 vs::ws::ncsets
0660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d -
0670: 20 52 65 74 72 69 65 76 65 20 74 6f 74 61 6c 20 Retrieve total
0680: 6e 75 6d 62 65 72 20 6f 66 20 63 73 65 74 73 0a number of csets.
0690: 23 20 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 6e # vc::cvs::ws::n
06a0: 69 6d 70 6f 72 74 61 62 6c 65 20 20 20 20 20 20 importable
06b0: 20 20 20 20 20 20 2d 20 52 65 74 72 69 65 76 65 - Retrieve
06c0: 20 6e 75 6d 62 65 72 20 6f 66 20 69 6d 70 6f 72 number of impor
06d0: 74 61 62 6c 65 20 63 73 65 74 73 0a 23 20 76 63 table csets.# vc
06e0: 3a 3a 63 76 73 3a 3a 77 73 3a 3a 66 6f 72 65 61 ::cvs::ws::forea
06f0: 63 68 20 20 20 63 73 76 61 72 20 73 63 72 69 70 ch csvar scrip
0700: 74 20 2d 20 52 75 6e 20 74 68 65 20 73 63 72 69 t - Run the scri
0710: 70 74 20 66 6f 72 20 65 61 63 68 20 63 68 61 6e pt for each chan
0720: 67 65 73 65 74 2c 20 74 68 65 0a 23 20 20 20 20 geset, the.#
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0750: 20 20 20 69 64 20 6f 66 20 74 68 65 20 63 75 72 id of the cur
0760: 72 65 6e 74 20 63 68 61 6e 67 65 73 65 74 20 73 rent changeset s
0770: 74 6f 72 65 64 20 69 6e 0a 23 20 20 20 20 20 20 tored in.#
0780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
07a0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 61 the variable na
07b0: 6d 65 64 20 62 79 20 63 73 76 61 72 2e 0a 23 20 med by csvar..#
07c0: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 64 6f 6e vc::cvs::ws::don
07d0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 e
07e0: 20 20 20 20 2d 20 43 6c 6f 73 65 20 77 6f 72 6b - Close work
07f0: 73 70 61 63 65 20 61 6e 64 20 64 65 6c 65 74 65 space and delete
0800: 20 69 74 2e 0a 23 20 76 63 3a 3a 63 76 73 3a 3a it..# vc::cvs::
0810: 77 73 3a 3a 69 73 61 64 6d 69 6e 20 70 61 74 68 ws::isadmin path
0820: 20 20 20 20 20 20 20 20 20 20 20 2d 20 43 68 65 - Che
0830: 63 6b 20 69 66 20 70 61 74 68 20 69 73 20 61 6e ck if path is an
0840: 20 61 64 6d 69 6e 20 66 69 6c 65 20 6f 66 20 43 admin file of C
0850: 56 53 0a 23 20 76 63 3a 3a 63 76 73 3a 3a 77 73 VS.# vc::cvs::ws
0860: 3a 3a 63 68 65 63 6b 6f 75 74 20 69 64 20 20 20 ::checkout id
0870: 20 20 20 20 20 20 20 20 20 2d 20 48 61 76 65 20 - Have
0880: 77 6f 72 6b 73 70 61 63 65 20 63 6f 6e 74 61 69 workspace contai
0890: 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 n the changeset
08a0: 69 64 2e 0a 23 20 76 63 3a 3a 63 76 73 3a 3a 77 id..# vc::cvs::w
08b0: 73 3a 3a 67 65 74 20 20 20 20 20 20 69 64 20 20 s::get id
08c0: 20 20 20 20 20 20 20 20 20 20 2d 20 52 65 74 72 - Retr
08d0: 69 65 76 65 20 64 61 74 61 20 6f 66 20 61 20 63 ieve data of a c
08e0: 68 61 6e 67 65 73 65 74 2e 0a 23 0a 23 20 43 6f hangeset..#.# Co
08f0: 6e 66 69 67 75 72 61 74 69 6f 6e 20 6b 65 79 73 nfiguration keys
0900: 3a 0a 23 0a 23 20 2d 70 72 6f 6a 65 63 74 20 70 :.#.# -project p
0910: 61 74 68 20 2d 20 53 75 62 20 64 69 72 65 63 74 ath - Sub direct
0920: 6f 72 79 20 75 6e 64 65 72 20 27 73 72 63 27 20 ory under 'src'
0930: 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 69 6d 70 to limit the imp
0940: 6f 72 74 20 74 6f 2e 0a 0a 23 20 2d 2d 2d 2d 2d ort to...# -----
0950: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0960: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0970: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0980: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0990: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 41 50 49 20 49 --------.# API I
09a0: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 0a 70 mplementation..p
09b0: 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 roc ::vc::cvs::w
09c0: 73 3a 3a 63 6f 6e 66 69 67 75 72 65 20 7b 6b 65 s::configure {ke
09d0: 79 20 76 61 6c 75 65 7d 20 7b 0a 20 20 20 20 76 y value} {. v
09e0: 61 72 69 61 62 6c 65 20 70 72 6f 6a 65 63 74 0a ariable project.
09f0: 0a 20 20 20 20 73 77 69 74 63 68 20 2d 65 78 61 . switch -exa
0a00: 63 74 20 2d 2d 20 24 6b 65 79 20 7b 0a 09 2d 70 ct -- $key {..-p
0a10: 72 6f 6a 65 63 74 20 7b 20 73 65 74 20 70 72 6f roject { set pro
0a20: 6a 65 63 74 20 24 76 61 6c 75 65 20 7d 0a 09 64 ject $value }..d
0a30: 65 66 61 75 6c 74 20 7b 0a 09 20 20 20 20 72 65 efault {.. re
0a40: 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 turn -code error
0a50: 20 22 55 6e 6b 6e 6f 77 6e 20 73 77 69 74 63 68 "Unknown switch
0a60: 20 24 6b 65 79 2c 20 65 78 70 65 63 74 65 64 20 $key, expected
0a70: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 \.
0a80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0a90: 20 20 20 20 20 2d 70 72 6f 6a 65 63 74 22 0a 09 -project"..
0aa0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 }. }. retu
0ab0: 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a rn.}..proc ::vc:
0ac0: 3a 63 76 73 3a 3a 77 73 3a 3a 63 68 65 63 6b 20 :cvs::ws::check
0ad0: 7b 73 72 63 20 6d 76 7d 20 7b 0a 20 20 20 20 76 {src mv} {. v
0ae0: 61 72 69 61 62 6c 65 20 70 72 6f 6a 65 63 74 0a ariable project.
0af0: 20 20 20 20 75 70 76 61 72 20 31 20 24 6d 76 20 upvar 1 $mv
0b00: 6d 73 67 0a 20 20 20 20 69 66 20 7b 0a 09 21 5b msg. if {..![
0b10: 66 69 6c 65 75 74 69 6c 3a 3a 74 65 73 74 20 24 fileutil::test $
0b20: 73 72 63 20 20 20 20 20 20 20 20 20 65 72 64 20 src erd
0b30: 6d 73 67 20 22 43 56 53 20 52 65 70 6f 73 69 74 msg "CVS Reposit
0b40: 6f 72 79 22 5d 20 7c 7c 0a 09 21 5b 66 69 6c 65 ory"] ||..![file
0b50: 75 74 69 6c 3a 3a 74 65 73 74 20 24 73 72 63 2f util::test $src/
0b60: 43 56 53 52 4f 4f 54 20 65 72 64 20 6d 73 67 20 CVSROOT erd msg
0b70: 22 43 56 53 20 41 64 6d 69 6e 20 64 69 72 65 63 "CVS Admin direc
0b80: 74 6f 72 79 22 5d 20 7c 7c 0a 09 28 28 24 70 72 tory"] ||..(($pr
0b90: 6f 6a 65 63 74 20 6e 65 20 22 22 29 20 26 26 0a oject ne "") &&.
0ba0: 09 20 21 5b 66 69 6c 65 75 74 69 6c 3a 3a 74 65 . ![fileutil::te
0bb0: 73 74 20 24 73 72 63 2f 24 70 72 6f 6a 65 63 74 st $src/$project
0bc0: 20 65 72 64 20 6d 73 67 20 22 50 72 6f 6a 65 63 erd msg "Projec
0bd0: 74 20 64 69 72 65 63 74 6f 72 79 22 5d 29 0a 20 t directory"]).
0be0: 20 20 20 7d 20 7b 0a 09 72 65 74 75 72 6e 20 30 } {..return 0
0bf0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 . }. retur
0c00: 6e 20 31 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 n 1.}..proc ::vc
0c10: 3a 3a 63 76 73 3a 3a 77 73 3a 3a 62 65 67 69 6e ::cvs::ws::begin
0c20: 20 7b 73 72 63 7d 20 7b 0a 20 20 20 20 69 66 20 {src} {. if
0c30: 7b 21 5b 63 68 65 63 6b 20 24 73 72 63 20 6d 73 {![check $src ms
0c40: 67 5d 7d 20 7b 20 72 65 74 75 72 6e 20 2d 63 6f g]} { return -co
0c50: 64 65 20 65 72 72 6f 72 20 24 6d 73 67 20 7d 0a de error $msg }.
0c60: 0a 20 20 20 20 44 65 66 42 61 73 65 20 24 73 72 . DefBase $sr
0c70: 63 0a 20 20 20 20 4d 61 6b 65 54 69 6d 65 6c 69 c. MakeTimeli
0c80: 6e 65 20 5b 53 63 61 6e 41 72 63 68 69 76 65 73 ne [ScanArchives
0c90: 20 5b 66 69 6c 65 73 3a 3a 66 69 6e 64 20 5b 52 [files::find [R
0ca0: 6f 6f 74 50 61 74 68 5d 5d 5d 0a 20 20 20 20 4d ootPath]]]. M
0cb0: 61 6b 65 43 68 61 6e 67 65 73 65 74 73 0a 20 20 akeChangesets.
0cc0: 20 20 50 72 6f 63 65 73 73 42 72 61 6e 63 68 65 ProcessBranche
0cd0: 73 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 4d s.. return [M
0ce0: 61 6b 65 57 6f 72 6b 73 70 61 63 65 5d 0a 7d 0a akeWorkspace].}.
0cf0: 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a .proc ::vc::cvs:
0d00: 3a 77 73 3a 3a 64 6f 6e 65 20 7b 7d 20 7b 0a 20 :ws::done {} {.
0d10: 20 20 20 76 61 72 69 61 62 6c 65 20 20 20 20 20 variable
0d20: 20 20 20 20 20 20 20 77 6f 72 6b 73 70 61 63 65 workspace
0d30: 0a 20 20 20 20 66 69 6c 65 20 64 65 6c 65 74 65 . file delete
0d40: 20 2d 66 6f 72 63 65 20 24 77 6f 72 6b 73 70 61 -force $workspa
0d50: 63 65 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a ce. return.}.
0d60: 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a .proc ::vc::cvs:
0d70: 3a 77 73 3a 3a 66 6f 72 65 61 63 68 20 7b 63 76 :ws::foreach {cv
0d80: 20 73 63 72 69 70 74 7d 20 7b 0a 20 20 20 20 76 script} {. v
0d90: 61 72 69 61 62 6c 65 20 69 6d 70 6f 72 74 61 62 ariable importab
0da0: 6c 65 0a 20 20 20 20 75 70 76 61 72 20 31 20 24 le. upvar 1 $
0db0: 63 76 20 63 0a 0a 20 20 20 20 3a 3a 66 6f 72 65 cv c.. ::fore
0dc0: 61 63 68 20 63 20 5b 6c 73 6f 72 74 20 2d 69 6e ach c [lsort -in
0dd0: 74 65 67 65 72 20 2d 69 6e 63 72 65 61 73 69 6e teger -increasin
0de0: 67 20 24 69 6d 70 6f 72 74 61 62 6c 65 5d 20 7b g $importable] {
0df0: 0a 09 73 65 74 20 63 6f 64 65 20 5b 63 61 74 63 ..set code [catc
0e00: 68 20 7b 75 70 6c 65 76 65 6c 20 31 20 24 73 63 h {uplevel 1 $sc
0e10: 72 69 70 74 7d 20 72 65 73 5d 0a 0a 09 23 20 30 ript} res]...# 0
0e20: 20 2d 20 6f 6b 2c 20 31 20 2d 20 65 72 72 6f 72 - ok, 1 - error
0e30: 2c 20 32 20 2d 20 72 65 74 75 72 6e 2c 20 33 20 , 2 - return, 3
0e40: 2d 20 62 72 65 61 6b 2c 20 34 20 2d 20 63 6f 6e - break, 4 - con
0e50: 74 69 6e 75 65 0a 09 73 77 69 74 63 68 20 2d 2d tinue..switch --
0e60: 20 24 63 6f 64 65 20 7b 0a 09 20 20 20 20 30 20 $code {.. 0
0e70: 7b 7d 0a 09 20 20 20 20 31 20 7b 20 72 65 74 75 {}.. 1 { retu
0e80: 72 6e 20 2d 65 72 72 6f 72 63 6f 64 65 20 24 3a rn -errorcode $:
0e90: 3a 65 72 72 6f 72 43 6f 64 65 20 2d 65 72 72 6f :errorCode -erro
0ea0: 72 69 6e 66 6f 20 24 3a 3a 65 72 72 6f 72 49 6e rinfo $::errorIn
0eb0: 66 6f 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 24 fo -code error $
0ec0: 72 65 73 20 7d 0a 09 20 20 20 20 32 20 7b 7d 0a res }.. 2 {}.
0ed0: 09 20 20 20 20 33 20 7b 20 72 65 74 75 72 6e 20 . 3 { return
0ee0: 7d 0a 09 20 20 20 20 34 20 7b 7d 0a 09 20 20 20 }.. 4 {}..
0ef0: 20 64 65 66 61 75 6c 74 20 7b 20 72 65 74 75 72 default { retur
0f00: 6e 20 2d 63 6f 64 65 20 24 63 6f 64 65 20 24 72 n -code $code $r
0f10: 65 73 75 6c 74 20 7d 0a 09 7d 0a 20 20 20 20 7d esult }..}. }
0f20: 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 . return.}..p
0f30: 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 roc ::vc::cvs::w
0f40: 73 3a 3a 6e 63 73 65 74 73 20 7b 61 72 67 73 7d s::ncsets {args}
0f50: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 63 {. return [c
0f60: 73 65 74 73 3a 3a 6e 75 6d 5d 0a 7d 0a 0a 70 72 sets::num].}..pr
0f70: 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 oc ::vc::cvs::ws
0f80: 3a 3a 6e 69 6d 70 6f 72 74 61 62 6c 65 20 7b 61 ::nimportable {a
0f90: 72 67 73 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 rgs} {. varia
0fa0: 62 6c 65 20 69 6d 70 6f 72 74 61 62 6c 65 0a 20 ble importable.
0fb0: 20 20 20 72 65 74 75 72 6e 20 5b 6c 6c 65 6e 67 return [lleng
0fc0: 74 68 20 24 69 6d 70 6f 72 74 61 62 6c 65 5d 0a th $importable].
0fd0: 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 }..proc ::vc::cv
0fe0: 73 3a 3a 77 73 3a 3a 69 73 61 64 6d 69 6e 20 7b s::ws::isadmin {
0ff0: 70 61 74 68 7d 20 7b 0a 20 20 20 20 23 20 43 68 path} {. # Ch
1000: 65 63 6b 20 69 66 20 70 61 74 68 20 69 73 20 61 eck if path is a
1010: 20 43 56 53 20 61 64 6d 69 6e 20 66 69 6c 65 2e CVS admin file.
1020: 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 . if {[string
1030: 20 6d 61 74 63 68 20 43 56 53 2f 2a 20 20 20 24 match CVS/* $
1040: 70 61 74 68 5d 7d 20 7b 72 65 74 75 72 6e 20 31 path]} {return 1
1050: 7d 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 6e }. if {[strin
1060: 67 20 6d 61 74 63 68 20 2a 2f 43 56 53 2f 2a 20 g match */CVS/*
1070: 24 70 61 74 68 5d 7d 20 7b 72 65 74 75 72 6e 20 $path]} {return
1080: 31 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 30 0a 1}. return 0.
1090: 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 }..proc ::vc::cv
10a0: 73 3a 3a 77 73 3a 3a 70 61 72 65 6e 74 4f 66 20 s::ws::parentOf
10b0: 7b 69 64 7d 20 7b 20 63 73 65 74 73 3a 3a 70 61 {id} { csets::pa
10c0: 72 65 6e 74 4f 66 20 24 69 64 20 7d 0a 0a 70 72 rentOf $id }..pr
10d0: 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 oc ::vc::cvs::ws
10e0: 3a 3a 63 68 65 63 6b 6f 75 74 20 7b 69 64 7d 20 ::checkout {id}
10f0: 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 77 {. variable w
1100: 6f 72 6b 73 70 61 63 65 0a 20 20 20 20 63 64 20 orkspace. cd
1110: 20 20 20 20 20 24 77 6f 72 6b 73 70 61 63 65 0a $workspace.
1120: 0a 20 20 20 20 23 20 54 4f 44 4f 3a 20 48 69 64 . # TODO: Hid
1130: 65 20 74 68 65 20 64 69 72 65 63 74 20 61 63 63 e the direct acc
1140: 65 73 73 20 74 6f 20 74 68 65 20 64 61 74 61 20 ess to the data
1150: 73 74 72 75 63 74 75 72 65 73 20 62 65 68 69 6e structures behin
1160: 64 0a 20 20 20 20 23 20 54 4f 44 4f 3a 20 61 63 d. # TODO: ac
1170: 63 65 73 73 6f 72 73 20 66 6f 72 20 64 61 74 65 cessors for date
1180: 2c 20 63 6d 73 67 2c 20 72 65 6d 6f 76 65 64 2c , cmsg, removed,
1190: 20 61 64 64 65 64 2c 20 63 68 61 6e 67 65 64 2c added, changed,
11a0: 20 61 6e 64 0a 20 20 20 20 23 20 54 4f 44 4f 3a and. # TODO:
11b0: 20 61 75 74 68 6f 72 0a 20 20 20 20 61 72 72 61 author. arra
11c0: 79 20 73 65 74 20 63 73 20 5b 63 73 65 74 73 3a y set cs [csets:
11d0: 3a 67 65 74 20 24 69 64 5d 0a 0a 20 20 20 20 77 :get $id].. w
11e0: 72 69 74 65 20 31 20 63 76 73 20 22 40 20 20 24 rite 1 cvs "@ $
11f0: 63 73 28 64 61 74 65 29 22 0a 20 20 20 20 3a 3a cs(date)". ::
1200: 66 6f 72 65 61 63 68 20 6c 20 5b 73 70 6c 69 74 foreach l [split
1210: 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 63 [string trim $c
1220: 73 28 63 6d 73 67 29 5d 20 5c 6e 5d 20 7b 0a 09 s(cmsg)] \n] {..
1230: 77 72 69 74 65 20 31 20 63 76 73 20 22 7c 20 20 write 1 cvs "|
1240: 24 6c 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 3a $l". }.. :
1250: 3a 66 6f 72 65 61 63 68 20 7b 66 20 72 7d 20 24 :foreach {f r} $
1260: 63 73 28 72 65 6d 6f 76 65 64 29 20 7b 20 77 72 cs(removed) { wr
1270: 69 74 65 20 32 20 63 76 73 20 22 52 20 20 24 66 ite 2 cvs "R $f
1280: 20 24 72 22 20 3b 20 52 65 6d 6f 76 65 20 20 20 $r" ; Remove
1290: 24 66 20 24 72 20 7d 0a 20 20 20 20 3a 3a 66 6f $f $r }. ::fo
12a0: 72 65 61 63 68 20 7b 66 20 72 7d 20 24 63 73 28 reach {f r} $cs(
12b0: 61 64 64 65 64 29 20 20 20 7b 20 77 72 69 74 65 added) { write
12c0: 20 32 20 63 76 73 20 22 41 20 20 24 66 20 24 72 2 cvs "A $f $r
12d0: 22 20 3b 20 43 68 65 63 6b 6f 75 74 20 24 66 20 " ; Checkout $f
12e0: 24 72 20 7d 0a 20 20 20 20 3a 3a 66 6f 72 65 61 $r }. ::forea
12f0: 63 68 20 7b 66 20 72 7d 20 24 63 73 28 63 68 61 ch {f r} $cs(cha
1300: 6e 67 65 64 29 20 7b 20 77 72 69 74 65 20 32 20 nged) { write 2
1310: 63 76 73 20 22 4d 20 20 24 66 20 24 72 22 20 3b cvs "M $f $r" ;
1320: 20 43 68 65 63 6b 6f 75 74 20 24 66 20 24 72 20 Checkout $f $r
1330: 7d 0a 0a 20 20 20 20 23 20 50 72 6f 76 69 64 65 }.. # Provide
1340: 20 6d 65 74 61 64 61 74 61 20 61 62 6f 75 74 20 metadata about
1350: 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 74 68 the changeset th
1360: 65 20 62 61 63 6b 65 6e 64 20 6d 61 79 20 77 69 e backend may wi
1370: 73 68 20 74 6f 20 68 61 76 65 0a 20 20 20 20 72 sh to have. r
1380: 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 63 73 28 eturn [list $cs(
1390: 61 75 74 68 6f 72 29 20 24 63 73 28 64 61 74 65 author) $cs(date
13a0: 29 20 24 63 73 28 63 6d 73 67 29 5d 0a 7d 0a 0a ) $cs(cmsg)].}..
13b0: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d # --------------
13c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
13f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
1400: 23 20 49 6e 74 65 72 6e 61 6c 73 0a 0a 70 72 6f # Internals..pro
1410: 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a c ::vc::cvs::ws:
1420: 3a 44 65 66 42 61 73 65 20 7b 70 61 74 68 7d 20 :DefBase {path}
1430: 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 70 {. variable p
1440: 72 6f 6a 65 63 74 0a 20 20 20 20 76 61 72 69 61 roject. varia
1450: 62 6c 65 20 62 61 73 65 0a 0a 20 20 20 20 73 65 ble base.. se
1460: 74 20 62 61 73 65 20 24 70 61 74 68 0a 0a 20 20 t base $path..
1470: 20 20 77 72 69 74 65 20 30 20 63 76 73 20 22 42 write 0 cvs "B
1480: 61 73 65 3a 20 20 20 20 24 62 61 73 65 22 0a 20 ase: $base".
1490: 20 20 20 69 66 20 7b 24 70 72 6f 6a 65 63 74 20 if {$project
14a0: 65 71 20 22 22 7d 20 7b 0a 09 77 72 69 74 65 20 eq ""} {..write
14b0: 30 20 63 76 73 20 22 50 72 6f 6a 65 63 74 3a 20 0 cvs "Project:
14c0: 3c 41 4c 4c 3e 22 0a 20 20 20 20 7d 20 65 6c 73 <ALL>". } els
14d0: 65 20 7b 0a 09 77 72 69 74 65 20 30 20 63 76 73 e {..write 0 cvs
14e0: 20 22 50 72 6f 6a 65 63 74 3a 20 24 70 72 6f 6a "Project: $proj
14f0: 65 63 74 22 0a 20 20 20 20 7d 0a 20 20 20 20 72 ect". }. r
1500: 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a eturn.}..proc ::
1510: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 52 6f 6f vc::cvs::ws::Roo
1520: 74 50 61 74 68 20 7b 7d 20 7b 0a 20 20 20 20 76 tPath {} {. v
1530: 61 72 69 61 62 6c 65 20 70 72 6f 6a 65 63 74 0a ariable project.
1540: 20 20 20 20 76 61 72 69 61 62 6c 65 20 62 61 73 variable bas
1550: 65 0a 0a 20 20 20 20 69 66 20 7b 24 70 72 6f 6a e.. if {$proj
1560: 65 63 74 20 65 71 20 22 22 7d 20 7b 0a 09 72 65 ect eq ""} {..re
1570: 74 75 72 6e 20 24 62 61 73 65 0a 20 20 20 20 7d turn $base. }
1580: 20 65 6c 73 65 20 7b 0a 09 72 65 74 75 72 6e 20 else {..return
1590: 24 62 61 73 65 2f 24 70 72 6f 6a 65 63 74 0a 20 $base/$project.
15a0: 20 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 }.}..proc ::v
15b0: 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 53 63 61 6e c::cvs::ws::Scan
15c0: 41 72 63 68 69 76 65 73 20 7b 66 69 6c 65 73 7d Archives {files}
15d0: 20 7b 0a 20 20 20 20 77 72 69 74 65 20 30 20 63 {. write 0 c
15e0: 76 73 20 22 53 63 61 6e 6e 69 6e 67 20 61 72 63 vs "Scanning arc
15f0: 68 69 76 65 73 20 2e 2e 2e 22 0a 0a 20 20 20 20 hives ..."..
1600: 73 65 74 20 64 20 5b 52 6f 6f 74 50 61 74 68 5d set d [RootPath]
1610: 0a 20 20 20 20 73 65 74 20 72 20 7b 7d 0a 20 20 . set r {}.
1620: 20 20 73 65 74 20 6e 20 30 0a 0a 20 20 20 20 3a set n 0.. :
1630: 3a 66 6f 72 65 61 63 68 20 7b 72 63 73 20 66 7d :foreach {rcs f}
1640: 20 24 66 69 6c 65 73 20 7b 0a 09 77 72 69 74 65 $files {..write
1650: 20 31 20 63 76 73 20 22 41 72 63 68 69 76 65 20 1 cvs "Archive
1660: 24 72 63 73 22 0a 09 23 20 47 65 74 20 74 68 65 $rcs"..# Get the
1670: 20 6d 65 74 61 20 64 61 74 61 20 77 65 20 6e 65 meta data we ne
1680: 65 64 20 28 72 65 76 69 73 69 6f 6e 73 2c 20 74 ed (revisions, t
1690: 69 6d 65 6c 69 6e 65 2c 20 6d 65 73 73 61 67 65 imeline, message
16a0: 73 29 2e 0a 09 6c 61 70 70 65 6e 64 20 72 20 24 s)...lappend r $
16b0: 66 20 5b 70 72 6f 63 65 73 73 20 24 64 2f 24 72 f [process $d/$r
16c0: 63 73 5d 0a 09 69 6e 63 72 20 20 20 20 6e 0a 20 cs]..incr n.
16d0: 20 20 20 7d 0a 0a 20 20 20 20 77 72 69 74 65 20 }.. write
16e0: 30 20 63 76 73 20 22 50 72 6f 63 65 73 73 65 64 0 cvs "Processed
16f0: 20 5b 4e 53 49 50 4c 20 24 6e 20 66 69 6c 65 5d [NSIPL $n file]
1700: 22 0a 20 20 20 20 72 65 74 75 72 6e 20 24 72 0a ". return $r.
1710: 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 }..proc ::vc::cv
1720: 73 3a 3a 77 73 3a 3a 4d 61 6b 65 54 69 6d 65 6c s::ws::MakeTimel
1730: 69 6e 65 20 7b 6d 65 74 61 7d 20 7b 0a 20 20 20 ine {meta} {.
1740: 20 77 72 69 74 65 20 30 20 63 76 73 20 22 47 65 write 0 cvs "Ge
1750: 6e 65 72 61 74 69 6e 67 20 63 6f 61 6c 65 73 63 nerating coalesc
1760: 65 64 20 74 69 6d 65 6c 69 6e 65 20 2e 2e 2e 22 ed timeline ..."
1770: 0a 0a 20 20 20 20 73 65 74 20 6e 20 30 0a 20 20 .. set n 0.
1780: 20 20 3a 3a 66 6f 72 65 61 63 68 20 7b 66 20 6d ::foreach {f m
1790: 65 74 61 7d 20 24 6d 65 74 61 20 7b 0a 09 61 72 eta} $meta {..ar
17a0: 72 61 79 20 73 65 74 20 6d 64 20 20 20 24 6d 65 ray set md $me
17b0: 74 61 0a 09 61 72 72 61 79 20 73 65 74 20 64 61 ta..array set da
17c0: 74 65 20 24 6d 64 28 64 61 74 65 29 0a 09 61 72 te $md(date)..ar
17d0: 72 61 79 20 73 65 74 20 61 75 74 68 20 24 6d 64 ray set auth $md
17e0: 28 61 75 74 68 6f 72 29 0a 09 61 72 72 61 79 20 (author)..array
17f0: 73 65 74 20 63 6d 73 67 20 24 6d 64 28 63 6f 6d set cmsg $md(com
1800: 6d 69 74 29 0a 09 61 72 72 61 79 20 73 65 74 20 mit)..array set
1810: 73 74 61 74 20 24 6d 64 28 73 74 61 74 65 29 0a stat $md(state).
1820: 0a 09 3a 3a 66 6f 72 65 61 63 68 20 72 65 76 20 ..::foreach rev
1830: 5b 6c 73 6f 72 74 20 2d 64 69 63 74 20 5b 61 72 [lsort -dict [ar
1840: 72 61 79 20 6e 61 6d 65 73 20 64 61 74 65 5d 5d ray names date]]
1850: 20 7b 0a 09 20 20 20 20 73 65 74 20 6f 70 65 72 {.. set oper
1860: 61 74 69 6f 6e 20 5b 4f 70 65 72 61 74 69 6f 6e ation [Operation
1870: 20 24 72 65 76 20 24 73 74 61 74 28 24 72 65 76 $rev $stat($rev
1880: 29 5d 0a 09 20 20 20 20 4e 6f 74 65 44 65 61 64 )].. NoteDead
1890: 52 6f 6f 74 73 20 24 66 20 24 72 65 76 20 24 6f Roots $f $rev $o
18a0: 70 65 72 61 74 69 6f 6e 0a 09 20 20 20 20 74 69 peration.. ti
18b0: 6d 65 6c 69 6e 65 3a 3a 61 64 64 20 24 64 61 74 meline::add $dat
18c0: 65 28 24 72 65 76 29 20 24 66 20 24 72 65 76 20 e($rev) $f $rev
18d0: 24 6f 70 65 72 61 74 69 6f 6e 20 24 61 75 74 68 $operation $auth
18e0: 28 24 72 65 76 29 20 24 63 6d 73 67 28 24 72 65 ($rev) $cmsg($re
18f0: 76 29 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09 v).. incr n..
1900: 7d 0a 0a 09 69 66 20 7b 5b 69 6e 66 6f 20 65 78 }...if {[info ex
1910: 69 73 74 73 20 6d 64 28 73 79 6d 62 6f 6c 29 5d ists md(symbol)]
1920: 7d 20 7b 0a 09 20 20 20 20 62 72 61 6e 63 68 3a } {.. branch:
1930: 3a 64 65 66 20 24 66 20 64 61 74 65 20 24 6d 64 :def $f date $md
1940: 28 73 79 6d 62 6f 6c 29 0a 09 7d 0a 0a 09 75 6e (symbol)..}...un
1950: 73 65 74 20 6d 64 0a 09 75 6e 73 65 74 20 64 61 set md..unset da
1960: 74 65 0a 09 75 6e 73 65 74 20 61 75 74 68 0a 09 te..unset auth..
1970: 75 6e 73 65 74 20 63 6d 73 67 0a 09 75 6e 73 65 unset cmsg..unse
1980: 74 20 73 74 61 74 0a 20 20 20 20 7d 0a 0a 20 20 t stat. }..
1990: 20 20 77 72 69 74 65 20 30 20 63 76 73 20 22 54 write 0 cvs "T
19a0: 69 6d 65 6c 69 6e 65 20 68 61 73 20 5b 4e 53 49 imeline has [NSI
19b0: 50 4c 20 24 6e 20 65 6e 74 72 79 20 65 6e 74 72 PL $n entry entr
19c0: 69 65 73 5d 22 0a 20 20 20 20 72 65 74 75 72 6e ies]". return
19d0: 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 .}..proc ::vc::c
19e0: 76 73 3a 3a 77 73 3a 3a 4e 6f 74 65 44 65 61 64 vs::ws::NoteDead
19f0: 52 6f 6f 74 73 20 7b 66 20 72 65 76 20 6f 70 65 Roots {f rev ope
1a00: 72 61 74 69 6f 6e 7d 20 7b 0a 20 20 20 20 23 20 ration} {. #
1a10: 41 20 64 65 61 64 2d 66 69 72 73 74 20 72 65 76 A dead-first rev
1a20: 69 73 69 6f 6e 20 69 73 20 72 65 76 20 31 2e 31 ision is rev 1.1
1a30: 20 77 69 74 68 20 6f 70 20 52 2e 20 46 6f 72 20 with op R. For
1a40: 61 6e 20 65 78 61 6d 70 6c 65 20 73 65 65 0a 20 an example see.
1a50: 20 20 20 23 20 74 68 65 20 66 69 6c 65 20 6d 65 # the file me
1a60: 6d 63 68 61 6e 2f 44 45 50 45 4e 44 45 4e 43 49 mchan/DEPENDENCI
1a70: 45 53 2e 20 53 75 63 68 20 61 20 66 69 6c 65 20 ES. Such a file
1a80: 73 65 65 6d 73 20 74 6f 20 65 78 69 73 74 20 6f seems to exist o
1a90: 6e 6c 79 21 0a 20 20 20 20 23 20 6f 6e 20 69 74 nly!. # on it
1aa0: 73 20 62 72 61 6e 63 68 2e 20 54 68 65 20 62 72 s branch. The br
1ab0: 61 6e 63 68 65 73 20 69 6e 66 6f 72 6d 61 74 69 anches informati
1ac0: 6f 6e 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 on is set on the
1ad0: 20 72 65 76 69 73 69 6f 6e 0a 20 20 20 20 23 20 revision. #
1ae0: 28 65 78 74 65 6e 64 20 72 63 73 70 61 72 73 65 (extend rcsparse
1af0: 72 21 29 2c 20 73 79 6d 62 6f 6c 73 20 68 61 73 r!), symbols has
1b00: 20 61 20 74 61 67 2c 20 72 65 66 65 72 69 6e 67 a tag, refering
1b10: 20 74 6f 20 61 20 62 72 61 6e 63 68 2c 0a 20 20 to a branch,.
1b20: 20 20 23 20 70 6f 73 73 69 62 6c 79 20 6d 61 67 # possibly mag
1b30: 69 63 2e 0a 0a 20 20 20 20 69 66 20 7b 28 24 72 ic... if {($r
1b40: 65 76 20 65 71 20 22 31 2e 31 22 29 20 26 26 20 ev eq "1.1") &&
1b50: 28 24 6f 70 65 72 61 74 69 6f 6e 20 65 71 20 22 ($operation eq "
1b60: 52 22 29 7d 20 7b 0a 09 77 72 69 74 65 20 32 20 R")} {..write 2
1b70: 63 76 73 20 22 44 65 61 64 20 72 6f 6f 74 20 72 cvs "Dead root r
1b80: 65 76 69 73 69 6f 6e 3a 20 24 66 22 0a 20 20 20 evision: $f".
1b90: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a }. return.}.
1ba0: 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a .proc ::vc::cvs:
1bb0: 3a 77 73 3a 3a 4f 70 65 72 61 74 69 6f 6e 20 7b :ws::Operation {
1bc0: 72 65 76 20 73 74 61 74 65 7d 20 7b 0a 20 20 20 rev state} {.
1bd0: 20 69 66 20 7b 24 73 74 61 74 65 20 65 71 20 22 if {$state eq "
1be0: 64 65 61 64 22 7d 20 20 20 20 20 20 20 20 20 20 dead"}
1bf0: 7b 72 65 74 75 72 6e 20 22 52 22 7d 20 3b 20 23 {return "R"} ; #
1c00: 20 52 65 6d 6f 76 65 64 0a 20 20 20 20 69 66 20 Removed. if
1c10: 7b 24 72 65 76 20 20 20 65 71 20 22 31 2e 31 22 {$rev eq "1.1"
1c20: 7d 20 20 20 20 20 20 20 20 20 20 20 7b 72 65 74 } {ret
1c30: 75 72 6e 20 22 41 22 7d 20 3b 20 23 20 41 64 64 urn "A"} ; # Add
1c40: 65 64 0a 20 20 20 20 69 66 20 7b 5b 73 74 72 69 ed. if {[stri
1c50: 6e 67 20 6d 61 74 63 68 20 2a 2e 31 2e 31 20 24 ng match *.1.1 $
1c60: 72 65 76 5d 7d 20 7b 72 65 74 75 72 6e 20 22 41 rev]} {return "A
1c70: 22 7d 20 3b 20 23 20 41 64 64 65 64 20 6f 6e 20 "} ; # Added on
1c80: 61 20 62 72 61 6e 63 68 0a 20 20 20 20 72 65 74 a branch. ret
1c90: 75 72 6e 20 22 4d 22 20 20 20 20 20 20 20 20 20 urn "M"
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1cb0: 20 20 20 20 20 20 20 20 20 3b 20 23 20 4d 6f 64 ; # Mod
1cc0: 69 66 69 65 64 0a 7d 0a 0a 70 72 6f 63 20 3a 3a ified.}..proc ::
1cd0: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 4d 61 6b vc::cvs::ws::Mak
1ce0: 65 43 68 61 6e 67 65 73 65 74 73 20 7b 7d 20 7b eChangesets {} {
1cf0: 0a 20 20 20 20 77 72 69 74 65 20 30 20 63 76 73 . write 0 cvs
1d00: 20 22 47 65 6e 65 72 61 74 69 6e 67 20 63 68 61 "Generating cha
1d10: 6e 67 65 73 65 74 73 20 66 72 6f 6d 20 74 69 6d ngesets from tim
1d20: 65 6c 69 6e 65 22 0a 0a 20 20 20 20 63 73 65 74 eline".. cset
1d30: 73 3a 3a 69 6e 69 74 0a 20 20 20 20 74 69 6d 65 s::init. time
1d40: 6c 69 6e 65 3a 3a 66 6f 72 65 61 63 68 20 64 61 line::foreach da
1d50: 74 65 20 66 69 6c 65 20 72 65 76 69 73 69 6f 6e te file revision
1d60: 20 6f 70 65 72 61 74 69 6f 6e 20 61 75 74 68 6f operation autho
1d70: 72 20 63 6d 73 67 20 7b 0a 09 63 73 65 74 73 3a r cmsg {..csets:
1d80: 3a 61 64 64 20 24 64 61 74 65 20 24 66 69 6c 65 :add $date $file
1d90: 20 24 72 65 76 69 73 69 6f 6e 20 24 6f 70 65 72 $revision $oper
1da0: 61 74 69 6f 6e 20 24 61 75 74 68 6f 72 20 24 63 ation $author $c
1db0: 6d 73 67 0a 20 20 20 20 7d 0a 20 20 20 20 63 73 msg. }. cs
1dc0: 65 74 73 3a 3a 64 6f 6e 65 0a 0a 20 20 20 20 77 ets::done.. w
1dd0: 72 69 74 65 20 30 20 63 76 73 20 22 46 6f 75 6e rite 0 cvs "Foun
1de0: 64 20 5b 4e 53 49 50 4c 20 5b 63 73 65 74 73 3a d [NSIPL [csets:
1df0: 3a 6e 75 6d 5d 20 63 68 61 6e 67 65 73 65 74 5d :num] changeset]
1e00: 22 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a ". return.}..
1e10: 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a proc ::vc::cvs::
1e20: 77 73 3a 3a 4d 61 6b 65 57 6f 72 6b 73 70 61 63 ws::MakeWorkspac
1e30: 65 20 7b 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 e {} {. varia
1e40: 62 6c 65 20 70 72 6f 6a 65 63 74 0a 20 20 20 20 ble project.
1e50: 76 61 72 69 61 62 6c 65 20 77 6f 72 6b 73 70 61 variable workspa
1e60: 63 65 20 5b 66 69 6c 65 75 74 69 6c 3a 3a 74 65 ce [fileutil::te
1e70: 6d 70 66 69 6c 65 20 69 6d 70 6f 72 74 46 5f 63 mpfile importF_c
1e80: 76 73 5f 77 73 5f 5d 0a 0a 20 20 20 20 73 65 74 vs_ws_].. set
1e90: 20 77 20 24 77 6f 72 6b 73 70 61 63 65 0a 20 20 w $workspace.
1ea0: 20 20 69 66 20 7b 24 70 72 6f 6a 65 63 74 20 6e if {$project n
1eb0: 65 20 22 22 7d 20 7b 20 61 70 70 65 6e 64 20 77 e ""} { append w
1ec0: 20 2f 24 70 72 6f 6a 65 63 74 20 7d 0a 0a 20 20 /$project }..
1ed0: 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 24 77 file delete $w
1ee0: 6f 72 6b 73 70 61 63 65 0a 20 20 20 20 66 69 6c orkspace. fil
1ef0: 65 20 6d 6b 64 69 72 20 20 24 77 0a 0a 20 20 20 e mkdir $w..
1f00: 20 77 72 69 74 65 20 30 20 63 76 73 20 22 57 6f write 0 cvs "Wo
1f10: 72 6b 73 70 61 63 65 3a 20 20 24 77 6f 72 6b 73 rkspace: $works
1f20: 70 61 63 65 22 0a 20 20 20 20 72 65 74 75 72 6e pace". return
1f30: 20 24 77 0a 7d 0a 0a 23 20 42 75 69 6c 64 69 6e $w.}..# Buildin
1f40: 67 20 74 68 65 20 72 65 76 69 73 69 6f 6e 20 74 g the revision t
1f50: 72 65 65 20 66 72 6f 6d 20 74 68 65 20 63 68 61 ree from the cha
1f60: 6e 67 65 73 65 74 73 2e 0a 23 20 4c 69 6d 69 74 ngesets..# Limit
1f70: 61 74 69 6f 6e 3a 20 43 75 72 72 65 6e 74 6c 79 ation: Currently
1f80: 20 6f 6e 6c 79 20 74 72 75 6e 6b 20 63 73 65 74 only trunk cset
1f90: 73 20 69 73 20 68 61 6e 64 6c 65 64 2e 0a 23 20 s is handled..#
1fa0: 4c 69 6d 69 74 61 74 69 6f 6e 3a 20 44 65 61 64 Limitation: Dead
1fb0: 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 20 72 files are not r
1fc0: 65 6d 6f 76 65 64 2c 20 69 2e 65 2e 20 6e 6f 20 emoved, i.e. no
1fd0: 27 52 27 20 61 63 74 69 6f 6e 73 20 72 69 67 68 'R' actions righ
1fe0: 74 20 6e 6f 77 2e 0a 0a 70 72 6f 63 20 3a 3a 76 t now...proc ::v
1ff0: 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 50 72 6f 63 c::cvs::ws::Proc
2000: 65 73 73 42 72 61 6e 63 68 65 73 20 7b 7d 20 7b essBranches {} {
2010: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 69 6d . variable im
2020: 70 6f 72 74 61 62 6c 65 0a 0a 20 20 20 20 77 72 portable.. wr
2030: 69 74 65 20 30 20 63 76 73 20 22 4f 72 67 61 6e ite 0 cvs "Organ
2040: 69 7a 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 izing the change
2050: 73 65 74 73 20 69 6e 74 6f 20 62 72 61 6e 63 68 sets into branch
2060: 65 73 22 0a 0a 20 20 20 20 73 65 74 20 72 65 6d es".. set rem
2070: 61 69 6e 64 65 72 20 5b 50 72 6f 63 65 73 73 54 ainder [ProcessT
2080: 72 75 6e 6b 5d 0a 20 20 20 20 77 68 69 6c 65 20 runk]. while
2090: 7b 5b 6c 6c 65 6e 67 74 68 20 24 72 65 6d 61 69 {[llength $remai
20a0: 6e 64 65 72 5d 7d 20 7b 0a 09 73 65 74 20 72 65 nder]} {..set re
20b0: 6d 61 69 6e 64 65 72 20 5b 50 72 6f 63 65 73 73 mainder [Process
20c0: 42 72 61 6e 63 68 20 24 72 65 6d 61 69 6e 64 65 Branch $remainde
20d0: 72 5d 0a 09 23 20 72 65 74 75 72 6e 20 2d 63 6f r]..# return -co
20e0: 64 65 20 62 72 65 61 6b 20 6d 61 79 20 62 65 20 de break may be
20f0: 73 69 67 6e 61 6c 65 64 20 74 6f 20 67 69 76 65 signaled to give
2100: 20 75 70 20 77 69 74 68 20 6e 6f 6e 2d 65 6d 70 up with non-emp
2110: 74 79 0a 09 23 20 73 65 74 20 6f 66 20 75 6e 70 ty..# set of unp
2120: 72 6f 63 65 73 73 65 64 20 63 68 61 6e 67 65 73 rocessed changes
2130: 65 74 73 2e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ets.. }..
2140: 23 20 53 74 61 74 75 73 20 69 6e 66 6f 72 6d 61 # Status informa
2150: 74 69 6f 6e 20 2e 2e 2e 0a 20 20 20 20 73 65 74 tion .... set
2160: 20 6e 72 20 20 5b 6c 6c 65 6e 67 74 68 20 24 72 nr [llength $r
2170: 65 6d 61 69 6e 64 65 72 5d 0a 20 20 20 20 73 65 emainder]. se
2180: 74 20 6e 69 20 20 5b 6c 6c 65 6e 67 74 68 20 24 t ni [llength $
2190: 69 6d 70 6f 72 74 61 62 6c 65 5d 0a 20 20 20 20 importable].
21a0: 73 65 74 20 66 6d 74 20 25 5b 73 74 72 69 6e 67 set fmt %[string
21b0: 20 6c 65 6e 67 74 68 20 5b 63 73 65 74 73 3a 3a length [csets::
21c0: 6e 75 6d 5d 5d 73 0a 0a 20 20 20 20 77 72 69 74 num]]s.. writ
21d0: 65 20 30 20 63 76 73 20 22 55 6e 70 72 6f 63 65 e 0 cvs "Unproce
21e0: 73 73 65 64 3a 20 5b 66 6f 72 6d 61 74 20 24 66 ssed: [format $f
21f0: 6d 74 20 24 6e 72 5d 20 5b 53 49 50 4c 20 24 6e mt $nr] [SIPL $n
2200: 72 20 63 68 61 6e 67 65 73 65 74 5d 20 28 57 69 r changeset] (Wi
2210: 6c 6c 20 62 65 20 69 67 6e 6f 72 65 64 29 22 0a ll be ignored)".
2220: 20 20 20 20 77 72 69 74 65 20 30 20 63 76 73 20 write 0 cvs
2230: 22 54 6f 20 69 6d 70 6f 72 74 3a 20 20 20 5b 66 "To import: [f
2240: 6f 72 6d 61 74 20 24 66 6d 74 20 24 6e 69 5d 20 ormat $fmt $ni]
2250: 5b 53 49 50 4c 20 24 6e 69 20 63 68 61 6e 67 65 [SIPL $ni change
2260: 73 65 74 5d 22 0a 20 20 20 20 72 65 74 75 72 6e set]". return
2270: 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 .}..proc ::vc::c
2280: 76 73 3a 3a 77 73 3a 3a 50 72 6f 63 65 73 73 54 vs::ws::ProcessT
2290: 72 75 6e 6b 20 7b 7d 20 7b 0a 20 20 20 20 76 61 runk {} {. va
22a0: 72 69 61 62 6c 65 20 69 6d 70 6f 72 74 61 62 6c riable importabl
22b0: 65 0a 0a 20 20 20 20 77 72 69 74 65 20 30 20 63 e.. write 0 c
22c0: 76 73 20 22 50 72 6f 63 65 73 73 69 6e 67 20 74 vs "Processing t
22d0: 68 65 20 74 72 75 6e 6b 20 63 68 61 6e 67 65 73 he trunk changes
22e0: 65 74 73 22 0a 0a 20 20 20 20 73 65 74 20 72 65 ets".. set re
22f0: 6d 61 69 6e 64 65 72 20 7b 7d 0a 20 20 20 20 73 mainder {}. s
2300: 65 74 20 74 20 20 20 20 20 20 20 20 20 30 0a 20 et t 0.
2310: 20 20 20 73 65 74 20 6e 20 20 20 20 20 20 20 20 set n
2320: 20 5b 63 73 65 74 73 3a 3a 6e 75 6d 5d 0a 20 20 [csets::num].
2330: 20 20 73 65 74 20 70 61 72 65 6e 74 20 20 20 20 set parent
2340: 7b 7d 0a 0a 20 20 20 20 66 6f 72 20 7b 73 65 74 {}.. for {set
2350: 20 63 20 30 7d 20 7b 24 63 20 3c 20 24 6e 7d 20 c 0} {$c < $n}
2360: 7b 69 6e 63 72 20 63 7d 20 7b 0a 09 69 66 20 7b {incr c} {..if {
2370: 5b 63 73 65 74 73 3a 3a 69 73 54 72 75 6e 6b 20 [csets::isTrunk
2380: 24 63 5d 7d 20 7b 0a 09 20 20 20 20 63 73 65 74 $c]} {.. cset
2390: 73 3a 3a 73 65 74 50 61 72 65 6e 74 4f 66 20 24 s::setParentOf $
23a0: 63 20 24 70 61 72 65 6e 74 0a 09 20 20 20 20 73 c $parent.. s
23b0: 65 74 20 70 61 72 65 6e 74 20 24 63 0a 09 20 20 et parent $c..
23c0: 20 20 69 6e 63 72 20 74 0a 09 20 20 20 20 6c 61 incr t.. la
23d0: 70 70 65 6e 64 20 69 6d 70 6f 72 74 61 62 6c 65 ppend importable
23e0: 20 24 63 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20 $c..} else {..
23f0: 20 20 20 6c 61 70 70 65 6e 64 20 72 65 6d 61 69 lappend remai
2400: 6e 64 65 72 20 24 63 0a 09 7d 0a 20 20 20 20 7d nder $c..}. }
2410: 0a 0a 20 20 20 20 77 72 69 74 65 20 30 20 63 76 .. write 0 cv
2420: 73 20 22 46 6f 75 6e 64 20 5b 4e 53 49 50 4c 20 s "Found [NSIPL
2430: 24 74 20 7b 74 72 75 6e 6b 20 63 68 61 6e 67 65 $t {trunk change
2440: 73 65 74 7d 5d 2c 20 5b 4e 53 49 50 4c 20 5b 6c set}], [NSIPL [l
2450: 6c 65 6e 67 74 68 20 24 72 65 6d 61 69 6e 64 65 length $remainde
2460: 72 5d 20 7b 62 72 61 6e 63 68 20 63 68 61 6e 67 r] {branch chang
2470: 65 73 65 74 7d 5d 22 0a 20 20 20 20 72 65 74 75 eset}]". retu
2480: 72 6e 20 24 72 65 6d 61 69 6e 64 65 72 0a 7d 0a rn $remainder.}.
2490: 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a .proc ::vc::cvs:
24a0: 3a 77 73 3a 3a 50 72 6f 63 65 73 73 42 72 61 6e :ws::ProcessBran
24b0: 63 68 20 7b 63 73 6c 69 73 74 7d 20 7b 0a 20 20 ch {cslist} {.
24c0: 20 20 77 72 69 74 65 20 30 20 63 76 73 20 22 50 write 0 cvs "P
24d0: 72 6f 63 65 73 73 69 6e 67 20 74 68 65 20 72 65 rocessing the re
24e0: 6d 61 69 6e 69 6e 67 20 5b 53 49 50 4c 20 5b 6c maining [SIPL [l
24f0: 6c 65 6e 67 74 68 20 24 63 73 6c 69 73 74 5d 20 length $cslist]
2500: 63 68 61 6e 67 65 73 65 74 20 22 5b 6c 6c 65 6e changeset "[llen
2510: 67 74 68 20 24 63 73 6c 69 73 74 5d 20 63 68 61 gth $cslist] cha
2520: 6e 67 65 73 65 74 73 22 5d 22 0a 0a 20 20 20 20 ngesets"]"..
2530: 73 65 74 20 62 61 73 65 20 20 20 5b 6c 69 6e 64 set base [lind
2540: 65 78 20 24 63 73 6c 69 73 74 20 30 5d 0a 20 20 ex $cslist 0].
2550: 20 20 73 65 74 20 63 73 6c 69 73 74 20 5b 6c 72 set cslist [lr
2560: 61 6e 67 65 20 24 63 73 6c 69 73 74 20 31 20 65 ange $cslist 1 e
2570: 6e 64 5d 0a 0a 20 20 20 20 63 73 65 74 73 3a 3a nd].. csets::
2580: 44 55 4d 50 20 24 62 61 73 65 0a 0a 20 20 20 20 DUMP $base..
2590: 23 20 57 68 69 63 68 20 62 72 61 6e 63 68 20 64 # Which branch d
25a0: 6f 65 73 20 62 61 73 65 20 62 65 6c 6f 6e 67 20 oes base belong
25b0: 74 6f 3f 0a 20 20 20 20 23 20 2d 20 49 74 20 68 to?. # - It h
25c0: 61 73 20 74 6f 20 62 65 20 74 68 65 20 62 61 73 as to be the bas
25d0: 65 20 6f 66 20 61 6e 20 75 6e 70 72 6f 63 65 73 e of an unproces
25e0: 73 65 64 20 62 72 61 6e 63 68 21 0a 20 20 20 20 sed branch!.
25f0: 23 20 20 20 4f 74 68 65 72 77 69 73 65 20 69 74 # Otherwise it
2600: 20 77 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e would have been
2610: 20 6f 6e 20 65 69 74 68 65 72 20 74 68 65 20 74 on either the t
2620: 72 75 6e 6b 0a 20 20 20 20 23 20 20 20 6f 72 20 runk. # or
2630: 61 6e 20 61 6c 72 65 61 64 79 20 70 72 6f 63 65 an already proce
2640: 73 73 65 64 20 62 72 61 6e 63 68 2e 0a 20 20 20 ssed branch..
2650: 20 23 20 57 68 65 72 65 20 69 73 20 69 74 73 20 # Where is its
2660: 72 6f 6f 74 20 63 68 61 6e 67 65 73 65 74 20 3f root changeset ?
2670: 0a 20 20 20 20 23 20 2d 20 54 68 65 20 72 6f 6f . # - The roo
2680: 74 20 68 61 73 20 74 6f 20 63 6f 6d 65 20 62 65 t has to come be
2690: 66 6f 72 65 20 74 68 65 20 62 61 73 65 2c 20 69 fore the base, i
26a0: 74 20 68 61 73 20 61 6c 72 65 61 64 79 0a 20 20 t has already.
26b0: 20 20 23 20 20 20 62 65 65 6e 20 70 72 6f 63 65 # been proce
26c0: 73 73 65 64 20 3d 3e 20 53 6d 61 6c 6c 65 72 20 ssed => Smaller
26d0: 69 64 2c 20 6f 6c 64 65 72 20 69 6e 20 74 69 6d id, older in tim
26e0: 65 2e 0a 20 20 20 20 23 20 2d 20 42 61 73 65 64 e.. # - Based
26f0: 20 6f 6e 20 74 68 65 20 66 69 6c 65 73 20 63 68 on the files ch
2700: 61 6e 67 65 64 2f 72 65 6d 6f 76 65 64 20 62 79 anged/removed by
2710: 20 74 68 65 20 62 61 73 65 2c 20 61 6e 64 20 74 the base, and t
2720: 68 65 69 72 0a 20 20 20 20 23 20 20 20 76 65 72 heir. # ver
2730: 73 69 6f 6e 73 20 77 65 20 6b 6e 6f 77 20 74 68 sions we know th
2740: 65 20 72 6f 6f 74 20 76 65 72 73 69 6f 6e 73 20 e root versions
2750: 6f 66 20 74 68 65 73 65 20 66 69 6c 65 73 2c 20 of these files,
2760: 61 6e 64 20 77 65 0a 20 20 20 20 23 20 20 20 63 and we. # c
2770: 61 6e 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 an determine the
2780: 20 63 68 61 6e 67 65 73 65 74 73 20 74 68 65 79 changesets they
2790: 20 61 72 65 20 69 6e 20 3d 3e 20 49 6e 74 65 72 are in => Inter
27a0: 73 65 63 74 69 6f 6e 0a 20 20 20 20 23 20 20 20 section. #
27b0: 70 6c 75 73 20 63 61 70 20 66 72 6f 6d 20 70 72 plus cap from pr
27c0: 65 76 69 6f 75 73 20 63 6f 6e 74 72 61 69 6e 74 evious contraint
27d0: 20 67 69 76 65 73 20 75 73 20 74 68 65 20 70 6f gives us the po
27e0: 73 73 69 62 6c 65 0a 20 20 20 20 23 20 20 20 63 ssible. # c
27f0: 61 6e 64 69 64 61 74 65 73 2e 0a 0a 20 20 20 20 andidates...
2800: 77 72 69 74 65 20 34 20 63 76 73 20 22 42 72 61 write 4 cvs "Bra
2810: 6e 63 68 20 62 61 73 65 20 24 62 61 73 65 22 0a nch base $base".
2820: 0a 20 20 20 20 3a 3a 66 6f 72 65 61 63 68 20 7b . ::foreach {
2830: 74 61 67 20 72 6f 6f 74 73 69 67 7d 20 5b 62 72 tag rootsig} [br
2840: 61 6e 63 68 3a 3a 66 69 6e 64 20 5b 63 73 65 74 anch::find [cset
2850: 73 3a 3a 67 65 74 20 24 62 61 73 65 5d 5d 20 62 s::get $base]] b
2860: 72 65 61 6b 0a 0a 20 20 20 20 77 72 69 74 65 20 reak.. write
2870: 34 20 63 76 73 20 22 42 72 61 6e 63 68 20 74 61 4 cvs "Branch ta
2880: 67 20 20 24 74 61 67 22 0a 20 20 20 20 77 72 69 g $tag". wri
2890: 74 65 20 34 20 63 76 73 20 22 52 6f 6f 74 20 73 te 4 cvs "Root s
28a0: 69 67 20 20 20 20 24 72 6f 6f 74 73 69 67 22 0a ig $rootsig".
28b0: 0a 20 20 20 20 73 65 74 20 72 6f 6f 74 20 5b 73 . set root [s
28c0: 69 67 3a 3a 66 69 6e 64 20 24 62 61 73 65 20 24 ig::find $base $
28d0: 72 6f 6f 74 73 69 67 5d 0a 0a 20 20 20 20 77 72 rootsig].. wr
28e0: 69 74 65 20 34 20 63 76 73 20 22 42 72 61 6e 63 ite 4 cvs "Branc
28f0: 68 20 72 6f 6f 74 20 24 72 6f 6f 74 22 0a 0a 20 h root $root"..
2900: 20 20 20 77 72 69 74 65 20 30 20 63 76 73 20 22 write 0 cvs "
2910: 43 68 61 6e 67 65 73 65 74 20 24 62 61 73 65 2c Changeset $base,
2920: 20 73 74 61 72 74 69 6e 67 20 62 72 61 6e 63 68 starting branch
2930: 20 5c 22 24 74 61 67 5c 22 2c 20 72 6f 6f 74 65 \"$tag\", roote
2940: 64 20 61 74 20 24 72 6f 6f 74 22 0a 20 20 20 20 d at $root".
2950: 63 73 65 74 73 3a 3a 73 65 74 50 61 72 65 6e 74 csets::setParent
2960: 4f 66 20 24 62 61 73 65 20 24 72 6f 6f 74 0a 0a Of $base $root..
2970: 20 20 20 20 73 65 74 20 72 65 6d 61 69 6e 64 65 set remainde
2980: 72 20 7b 7d 0a 20 20 20 20 73 65 74 20 74 20 20 r {}. set t
2990: 20 20 20 20 20 20 20 31 0a 0a 20 20 20 20 3a 3a 1.. ::
29a0: 66 6f 72 65 61 63 68 20 63 20 24 63 73 6c 69 73 foreach c $cslis
29b0: 74 20 7b 0a 09 23 63 73 65 74 73 3a 3a 44 55 4d t {..#csets::DUM
29c0: 50 20 24 63 0a 09 69 66 20 7b 5b 63 73 65 74 73 P $c..if {[csets
29d0: 3a 3a 73 61 6d 65 42 72 61 6e 63 68 20 24 63 20 ::sameBranch $c
29e0: 24 62 61 73 65 20 24 74 61 67 5d 7d 20 7b 0a 09 $base $tag]} {..
29f0: 20 20 20 20 63 73 65 74 73 3a 3a 73 65 74 50 61 csets::setPa
2a00: 72 65 6e 74 4f 66 20 24 63 20 24 62 61 73 65 0a rentOf $c $base.
2a10: 09 20 20 20 20 73 65 74 20 62 61 73 65 20 24 63 . set base $c
2a20: 0a 09 20 20 20 20 69 6e 63 72 20 74 0a 09 20 20 .. incr t..
2a30: 20 20 6c 61 70 70 65 6e 64 20 69 6d 70 6f 72 74 lappend import
2a40: 61 62 6c 65 20 24 63 0a 09 7d 20 65 6c 73 65 20 able $c..} else
2a50: 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 72 {.. lappend r
2a60: 65 6d 61 69 6e 64 65 72 20 24 63 0a 09 7d 0a 20 emainder $c..}.
2a70: 20 20 20 7d 0a 0a 20 20 20 20 77 72 69 74 65 20 }.. write
2a80: 30 20 63 76 73 20 22 46 6f 75 6e 64 20 5b 4e 53 0 cvs "Found [NS
2a90: 49 50 4c 20 24 74 20 22 24 74 61 67 20 63 68 61 IPL $t "$tag cha
2aa0: 6e 67 65 73 65 74 22 5d 2c 20 5b 4e 53 49 50 4c ngeset"], [NSIPL
2ab0: 20 5b 6c 6c 65 6e 67 74 68 20 24 72 65 6d 61 69 [llength $remai
2ac0: 6e 64 65 72 5d 20 63 68 61 6e 67 65 73 65 74 5d nder] changeset]
2ad0: 20 6f 75 74 73 69 64 65 22 0a 20 20 20 20 72 65 outside". re
2ae0: 74 75 72 6e 20 24 72 65 6d 61 69 6e 64 65 72 0a turn $remainder.
2af0: 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 }..proc ::vc::cv
2b00: 73 3a 3a 77 73 3a 3a 43 68 65 63 6b 6f 75 74 20 s::ws::Checkout
2b10: 7b 66 20 72 7d 20 7b 0a 20 20 20 20 76 61 72 69 {f r} {. vari
2b20: 61 62 6c 65 20 62 61 73 65 0a 20 20 20 20 76 61 able base. va
2b30: 72 69 61 62 6c 65 20 70 72 6f 6a 65 63 74 0a 0a riable project..
2b40: 20 20 20 20 23 20 41 64 64 65 64 20 6f 72 20 6d # Added or m
2b50: 6f 64 69 66 69 65 64 2c 20 70 75 74 20 74 68 65 odified, put the
2b60: 20 72 65 71 75 65 73 74 65 64 20 76 65 72 73 69 requested versi
2b70: 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 on of the file i
2b80: 6e 74 6f 0a 20 20 20 20 23 20 74 68 65 20 77 6f nto. # the wo
2b90: 72 6b 73 70 61 63 65 2e 0a 0a 20 20 20 20 69 66 rkspace... if
2ba0: 20 7b 24 70 72 6f 6a 65 63 74 20 6e 65 20 22 22 {$project ne ""
2bb0: 7d 20 7b 73 65 74 20 66 20 24 70 72 6f 6a 65 63 } {set f $projec
2bc0: 74 2f 24 66 7d 0a 20 20 20 20 69 66 20 7b 5b 63 t/$f}. if {[c
2bd0: 61 74 63 68 20 7b 0a 09 64 6f 76 61 20 2d 64 20 atch {..dova -d
2be0: 24 62 61 73 65 20 63 6f 20 2d 72 20 24 72 20 24 $base co -r $r $
2bf0: 66 0a 20 20 20 20 7d 20 6d 73 67 5d 7d 20 7b 0a f. } msg]} {.
2c00: 09 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 .if {[string mat
2c10: 63 68 20 7b 2a 69 6e 76 61 6c 69 64 20 63 68 61 ch {*invalid cha
2c20: 6e 67 65 20 74 65 78 74 2a 7d 20 24 6d 73 67 5d nge text*} $msg]
2c30: 7d 20 7b 0a 0a 09 20 20 20 20 23 20 54 68 65 20 } {... # The
2c40: 61 72 63 68 69 76 65 20 6f 66 20 74 68 65 20 66 archive of the f
2c50: 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 ile is corrupted
2c60: 20 61 6e 64 20 74 68 65 20 63 68 6f 73 65 6e 0a and the chosen.
2c70: 09 20 20 20 20 23 20 76 65 72 73 69 6f 6e 20 6e . # version n
2c80: 6f 74 20 61 63 63 65 73 73 69 62 6c 65 20 64 75 ot accessible du
2c90: 65 20 74 6f 20 74 68 61 74 2e 20 57 65 20 72 65 e to that. We re
2ca0: 70 6f 72 74 20 74 68 65 0a 09 20 20 20 20 23 20 port the.. #
2cb0: 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 6f 74 68 problem, but oth
2cc0: 65 72 77 69 73 65 20 69 67 6e 6f 72 65 20 69 74 erwise ignore it
2cd0: 2e 20 41 73 20 61 20 63 6f 6e 73 65 71 75 65 6e . As a consequen
2ce0: 63 65 20 74 68 65 0a 09 20 20 20 20 23 20 64 65 ce the.. # de
2cf0: 73 74 69 6e 61 74 69 6f 6e 20 72 65 70 6f 73 69 stination reposi
2d00: 74 6f 72 79 20 77 69 6c 6c 20 6e 6f 74 20 63 6f tory will not co
2d10: 6e 74 61 69 6e 20 74 68 65 20 66 75 6c 6c 20 68 ntain the full h
2d20: 69 73 74 6f 72 79 0a 09 20 20 20 20 23 20 6f 66 istory.. # of
2d30: 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e the named file.
2d40: 20 42 79 20 69 67 6e 6f 72 69 6e 67 20 74 68 65 By ignoring the
2d50: 20 70 72 6f 62 6c 65 6d 20 77 65 20 68 6f 77 65 problem we howe
2d60: 76 65 72 0a 09 20 20 20 20 23 20 67 65 74 20 61 ver.. # get a
2d70: 73 20 6d 75 63 68 20 61 73 20 69 73 20 70 6f 73 s much as is pos
2d80: 73 69 62 6c 65 2e 0a 0a 09 20 20 20 20 74 72 6f sible.... tro
2d90: 75 62 6c 65 3a 3a 61 64 64 20 22 24 66 3a 20 43 uble::add "$f: C
2da0: 6f 72 72 75 70 74 65 64 20 61 72 63 68 69 76 65 orrupted archive
2db0: 20 66 69 6c 65 2e 20 49 6e 61 63 63 65 73 73 69 file. Inaccessi
2dc0: 62 6c 65 20 72 65 76 69 73 69 6f 6e 20 24 72 2e ble revision $r.
2dd0: 22 0a 09 20 20 20 20 72 65 74 75 72 6e 0a 09 7d ".. return..}
2de0: 0a 09 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 ..return -code e
2df0: 72 72 6f 72 20 24 6d 73 67 0a 20 20 20 20 7d 0a rror $msg. }.
2e00: 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 return.}..pr
2e10: 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 oc ::vc::cvs::ws
2e20: 3a 3a 52 65 6d 6f 76 65 20 7b 66 20 72 7d 20 7b ::Remove {f r} {
2e30: 0a 20 20 20 20 23 20 52 65 6d 6f 76 65 20 66 69 . # Remove fi
2e40: 6c 65 20 66 72 6f 6d 20 77 6f 72 6b 73 70 61 63 le from workspac
2e50: 65 2e 20 50 72 75 6e 65 20 65 6d 70 74 79 20 64 e. Prune empty d
2e60: 69 72 65 63 74 6f 72 69 65 73 2e 0a 20 20 20 20 irectories..
2e70: 23 20 4e 4f 54 45 3a 20 41 20 64 65 61 64 2d 66 # NOTE: A dead-f
2e80: 69 72 73 74 20 66 69 6c 65 20 28 72 65 76 20 31 irst file (rev 1
2e90: 2e 31 20 64 65 61 64 29 20 77 69 6c 6c 20 6e 65 .1 dead) will ne
2ea0: 76 65 72 20 68 61 76 65 20 65 78 69 73 74 65 64 ver have existed
2eb0: 2e 0a 0a 20 20 20 20 66 69 6c 65 20 64 65 6c 65 ... file dele
2ec0: 74 65 20 24 66 0a 20 20 20 20 50 72 75 6e 65 20 te $f. Prune
2ed0: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 66 [file dirname $f
2ee0: 5d 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a ]. return.}..
2ef0: 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a proc ::vc::cvs::
2f00: 77 73 3a 3a 50 72 75 6e 65 20 7b 70 61 74 68 7d ws::Prune {path}
2f10: 20 7b 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c {. # NOTE: L
2f20: 6f 67 69 63 61 6c 6c 79 20 65 6d 70 74 79 20 64 ogically empty d
2f30: 69 72 65 63 74 6f 72 69 65 73 20 73 74 69 6c 6c irectories still
2f40: 20 70 68 79 73 69 63 61 6c 6c 79 20 63 6f 6e 74 physically cont
2f50: 61 69 6e 20 74 68 65 0a 20 20 20 20 23 20 43 56 ain the. # CV
2f60: 53 20 61 64 6d 69 6e 20 64 69 72 65 63 74 6f 72 S admin director
2f70: 79 2c 20 68 65 6e 63 65 20 74 68 65 20 63 68 65 y, hence the che
2f80: 63 6b 20 66 6f 72 20 3d 3d 20 31 2c 20 6e 6f 74 ck for == 1, not
2f90: 20 3d 3d 20 30 2e 20 54 68 65 72 65 0a 20 20 20 == 0. There.
2fa0: 20 23 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 # might also be
2fb0: 20 68 69 64 64 65 6e 20 66 69 6c 65 73 2c 20 77 hidden files, w
2fc0: 65 20 63 6f 75 6e 74 20 74 68 65 6d 20 61 73 20 e count them as
2fd0: 77 65 6c 6c 2e 20 41 6c 77 61 79 73 20 68 69 64 well. Always hid
2fe0: 64 65 6e 0a 20 20 20 20 23 20 61 72 65 20 2e 20 den. # are .
2ff0: 61 6e 64 20 2e 2e 20 61 6e 64 20 74 68 65 79 20 and .. and they
3000: 64 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 61 73 20 do not count as
3010: 75 73 65 72 20 66 69 6c 65 2e 0a 0a 20 20 20 20 user file...
3020: 69 66 20 7b 0a 09 28 5b 6c 6c 65 6e 67 74 68 20 if {..([llength
3030: 5b 67 6c 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61 69 [glob -nocomplai
3040: 6e 20 2d 64 69 72 65 63 74 6f 72 79 20 20 20 20 n -directory
3050: 20 20 20 20 20 20 20 20 20 20 24 70 61 74 68 20 $path
3060: 2a 5d 5d 20 3d 3d 20 31 29 20 26 26 0a 09 28 5b *]] == 1) &&..([
3070: 6c 6c 65 6e 67 74 68 20 5b 67 6c 6f 62 20 2d 6e llength [glob -n
3080: 6f 63 6f 6d 70 6c 61 69 6e 20 2d 64 69 72 65 63 ocomplain -direc
3090: 74 6f 72 79 20 2d 74 79 70 65 20 68 69 64 64 65 tory -type hidde
30a0: 6e 20 24 70 61 74 68 20 2a 5d 5d 20 3d 3d 20 32 n $path *]] == 2
30b0: 29 0a 20 20 20 20 7d 20 7b 0a 09 66 69 6c 65 20 ). } {..file
30c0: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 70 delete -force $p
30d0: 61 74 68 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 ath. }. re
30e0: 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 turn.}..proc ::v
30f0: 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 4e 53 49 50 c::cvs::ws::NSIP
3100: 4c 20 7b 6e 20 73 69 6e 67 75 6c 61 72 20 7b 70 L {n singular {p
3110: 6c 75 72 61 6c 20 7b 7d 7d 7d 20 7b 0a 20 20 20 lural {}}} {.
3120: 20 72 65 74 75 72 6e 20 22 24 6e 20 5b 53 49 50 return "$n [SIP
3130: 4c 20 24 6e 20 24 73 69 6e 67 75 6c 61 72 20 24 L $n $singular $
3140: 70 6c 75 72 61 6c 5d 22 0a 7d 0a 70 72 6f 63 20 plural]".}.proc
3150: 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 53 ::vc::cvs::ws::S
3160: 49 50 4c 20 7b 6e 20 73 69 6e 67 75 6c 61 72 20 IPL {n singular
3170: 7b 70 6c 75 72 61 6c 20 7b 7d 7d 7d 20 7b 0a 20 {plural {}}} {.
3180: 20 20 20 69 66 20 7b 24 6e 20 3d 3d 20 31 7d 20 if {$n == 1}
3190: 7b 72 65 74 75 72 6e 20 24 73 69 6e 67 75 6c 61 {return $singula
31a0: 72 7d 0a 20 20 20 20 69 66 20 7b 24 70 6c 75 72 r}. if {$plur
31b0: 61 6c 20 65 71 20 22 22 7d 20 7b 73 65 74 20 70 al eq ""} {set p
31c0: 6c 75 72 61 6c 20 24 7b 73 69 6e 67 75 6c 61 72 lural ${singular
31d0: 7d 73 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 24 }s}. return $
31e0: 70 6c 75 72 61 6c 0a 7d 0a 0a 23 20 2d 2d 2d 2d plural.}..# ----
31f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 6e 61 6d 65 73 ---------..names
3240: 70 61 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a pace eval ::vc::
3250: 63 76 73 3a 3a 77 73 20 7b 0a 20 20 20 20 76 61 cvs::ws {. va
3260: 72 69 61 62 6c 65 20 62 61 73 65 20 20 20 20 20 riable base
3270: 20 20 7b 7d 20 3b 20 23 20 54 6f 70 6c 65 76 65 {} ; # Topleve
3280: 6c 20 72 65 70 6f 73 69 74 6f 72 79 20 64 69 72 l repository dir
3290: 65 63 74 6f 72 79 0a 20 20 20 20 76 61 72 69 61 ectory. varia
32a0: 62 6c 65 20 70 72 6f 6a 65 63 74 20 20 20 20 7b ble project {
32b0: 7d 20 3b 20 23 20 53 75 62 20 64 69 72 65 63 74 } ; # Sub direct
32c0: 6f 72 79 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 ory to limit the
32d0: 20 69 6d 70 6f 72 74 20 74 6f 2e 0a 20 20 20 20 import to..
32e0: 76 61 72 69 61 62 6c 65 20 77 6f 72 6b 73 70 61 variable workspa
32f0: 63 65 20 20 7b 7d 20 3b 20 23 20 44 69 72 65 63 ce {} ; # Direc
3300: 74 6f 72 79 20 74 6f 20 63 68 65 63 6b 6f 75 74 tory to checkout
3310: 20 63 68 61 6e 67 65 73 65 74 73 20 74 6f 2e 0a changesets to..
3320: 20 20 20 20 76 61 72 69 61 62 6c 65 20 69 6d 70 variable imp
3330: 6f 72 74 61 62 6c 65 20 7b 7d 20 3b 20 23 20 4c ortable {} ; # L
3340: 69 73 74 20 6f 66 20 74 68 65 20 63 73 65 74 73 ist of the csets
3350: 20 77 68 69 63 68 20 63 61 6e 20 62 65 20 69 6d which can be im
3360: 70 6f 72 74 65 64 2e 0a 0a 20 20 20 20 6e 61 6d ported... nam
3370: 65 73 70 61 63 65 20 65 78 70 6f 72 74 20 63 6f espace export co
3380: 6e 66 69 67 75 72 65 20 62 65 67 69 6e 20 64 6f nfigure begin do
3390: 6e 65 20 66 6f 72 65 61 63 68 20 6e 63 73 65 74 ne foreach ncset
33a0: 73 20 6e 69 6d 70 6f 72 74 61 62 6c 65 20 63 68 s nimportable ch
33b0: 65 63 6b 6f 75 74 0a 20 20 20 20 6e 61 6d 65 73 eckout. names
33c0: 70 61 63 65 20 65 78 70 6f 72 74 20 70 61 72 65 pace export pare
33d0: 6e 74 4f 66 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d ntOf.}..# ------
33e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
33f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3400: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3410: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3420: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 52 65 61 64 79 0a -------.# Ready.
3430: 0a 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 .package provide
3440: 20 76 63 3a 3a 63 76 73 3a 3a 77 73 20 31 2e 30 vc::cvs::ws 1.0
3450: 0a 72 65 74 75 72 6e 0a .return.