Artifact 9bc6bc7e054cad162101322734e76be88eb3a83e:
File
tools/lib/cvs.tcl
part of check-in
[a5476aed27]
- Modified sorting of timeline entries for the same second to properly split files and file versions from each other, and to have newer revisions later. Further added a storage for error messages to be repeated when the importer exist. First user is the code reporting corrupted archive files detected during a checkout.
by
aku on
2007-09-20 03:51:49.
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 73 74 72 75 63 74 3a require struct:
0340: 3a 74 72 65 65 0a 0a 6e 61 6d 65 73 70 61 63 65 :tree..namespace
0350: 20 65 76 61 6c 20 3a 3a 76 63 3a 3a 63 76 73 3a eval ::vc::cvs:
0360: 3a 77 73 20 7b 0a 20 20 20 20 76 63 3a 3a 74 6f :ws {. vc::to
0370: 6f 6c 73 3a 3a 6c 6f 67 3a 3a 73 79 73 74 65 6d ols::log::system
0380: 20 63 76 73 0a 20 20 20 20 6e 61 6d 65 73 70 61 cvs. namespa
0390: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a ce import ::vc::
03a0: 74 6f 6f 6c 73 3a 3a 6c 6f 67 3a 3a 77 72 69 74 tools::log::writ
03b0: 65 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 e. namespace
03c0: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 72 63 73 import ::vc::rcs
03d0: 3a 3a 70 61 72 73 65 72 3a 3a 70 72 6f 63 65 73 ::parser::proces
03e0: 73 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 s. namespace
03f0: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 63 76 73 import ::vc::cvs
0400: 3a 3a 63 6d 64 3a 3a 64 6f 76 61 0a 0a 20 20 20 ::cmd::dova..
0410: 20 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 namespace eval
0420: 74 72 6f 75 62 6c 65 20 7b 20 6e 61 6d 65 73 70 trouble { namesp
0430: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a ace import ::vc:
0440: 3a 74 6f 6f 6c 73 3a 3a 74 72 6f 75 62 6c 65 3a :tools::trouble:
0450: 3a 2a 20 7d 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d :* }.}..# ------
0460: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0470: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0480: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0490: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
04a0: 2d 2d 2d 2d 2d 2d 2d 0a 23 20 41 50 49 0a 0a 23 -------.# API..#
04b0: 20 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 63 6f vc::cvs::ws::co
04c0: 6e 66 69 67 75 72 65 20 6b 65 79 20 76 61 6c 75 nfigure key valu
04d0: 65 20 20 20 20 2d 20 43 6f 6e 66 69 67 75 72 65 e - Configure
04e0: 20 74 68 65 20 73 75 62 73 79 73 74 65 6d 2e 0a the subsystem..
04f0: 23 20 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 63 # vc::cvs::ws::c
0500: 68 65 63 6b 20 20 20 20 20 73 72 63 20 6d 76 20 heck src mv
0510: 20 20 20 20 20 20 2d 20 43 68 65 63 6b 20 69 66 - Check if
0520: 20 73 72 63 20 69 73 20 61 20 43 56 53 20 72 65 src is a CVS re
0530: 70 6f 73 69 74 6f 72 79 20 64 69 72 65 63 74 6f pository directo
0540: 72 79 2e 0a 23 20 76 63 3a 3a 63 76 73 3a 3a 77 ry..# vc::cvs::w
0550: 73 3a 3a 62 65 67 69 6e 20 20 20 20 20 73 72 63 s::begin src
0560: 20 20 20 20 20 20 20 20 20 20 2d 20 53 74 61 72 - Star
0570: 74 20 6e 65 77 20 77 6f 72 6b 73 70 61 63 65 20 t new workspace
0580: 61 6e 64 20 72 65 74 75 72 6e 20 74 68 65 20 74 and return the t
0590: 6f 70 2d 0a 23 20 20 20 20 20 20 20 20 20 20 20 op-.#
05a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
05b0: 20 20 20 20 20 20 20 20 20 20 20 20 6d 6f 73 74 most
05c0: 20 64 69 72 65 63 74 6f 72 79 20 63 6f 27 64 20 directory co'd
05d0: 66 69 6c 65 73 20 61 72 65 20 70 75 74 20 69 6e files are put in
05e0: 74 6f 2e 0a 23 20 76 63 3a 3a 63 76 73 3a 3a 77 to..# vc::cvs::w
05f0: 73 3a 3a 6e 63 73 65 74 73 20 20 20 20 3f 2d 69 s::ncsets ?-i
0600: 6d 70 6f 72 74 3f 20 20 20 20 2d 20 52 65 74 72 mport? - Retr
0610: 69 65 76 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 ieve number of c
0620: 73 65 74 73 20 28 61 6c 6c 2f 74 6f 20 69 6d 70 sets (all/to imp
0630: 6f 72 74 29 0a 23 20 76 63 3a 3a 63 76 73 3a 3a ort).# vc::cvs::
0640: 77 73 3a 3a 66 6f 72 65 61 63 68 20 20 20 63 73 ws::foreach cs
0650: 76 61 72 20 73 63 72 69 70 74 20 2d 20 52 75 6e var script - Run
0660: 20 74 68 65 20 73 63 72 69 70 74 20 66 6f 72 20 the script for
0670: 65 61 63 68 20 63 68 61 6e 67 65 73 65 74 2c 20 each changeset,
0680: 74 68 65 0a 23 20 20 20 20 20 20 20 20 20 20 20 the.#
0690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
06a0: 20 20 20 20 20 20 20 20 20 20 20 20 69 64 20 6f id o
06b0: 66 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 f the current ch
06c0: 61 6e 67 65 73 65 74 20 73 74 6f 72 65 64 20 69 angeset stored i
06d0: 6e 0a 23 20 20 20 20 20 20 20 20 20 20 20 20 20 n.#
06e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
06f0: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 76 61 the va
0700: 72 69 61 62 6c 65 20 6e 61 6d 65 64 20 62 79 20 riable named by
0710: 63 73 76 61 72 2e 0a 23 20 76 63 3a 3a 63 76 73 csvar..# vc::cvs
0720: 3a 3a 77 73 3a 3a 64 6f 6e 65 20 20 20 20 20 20 ::ws::done
0730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 20 43 - C
0740: 6c 6f 73 65 20 77 6f 72 6b 73 70 61 63 65 20 61 lose workspace a
0750: 6e 64 20 64 65 6c 65 74 65 20 69 74 2e 0a 23 20 nd delete it..#
0760: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 69 73 61 vc::cvs::ws::isa
0770: 64 6d 69 6e 20 70 61 74 68 20 20 20 20 20 20 20 dmin path
0780: 20 20 20 20 2d 20 43 68 65 63 6b 20 69 66 20 70 - Check if p
0790: 61 74 68 20 69 73 20 61 6e 20 61 64 6d 69 6e 20 ath is an admin
07a0: 66 69 6c 65 20 6f 66 20 43 56 53 0a 23 20 76 63 file of CVS.# vc
07b0: 3a 3a 63 76 73 3a 3a 77 73 3a 3a 63 68 65 63 6b ::cvs::ws::check
07c0: 6f 75 74 20 69 64 20 20 20 20 20 20 20 20 20 20 out id
07d0: 20 20 2d 20 48 61 76 65 20 77 6f 72 6b 73 70 61 - Have workspa
07e0: 63 65 20 63 6f 6e 74 61 69 6e 20 74 68 65 20 63 ce contain the c
07f0: 68 61 6e 67 65 73 65 74 20 69 64 2e 0a 23 0a 23 hangeset id..#.#
0800: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 20 6b Configuration k
0810: 65 79 73 3a 0a 23 0a 23 20 2d 70 72 6f 6a 65 63 eys:.#.# -projec
0820: 74 20 70 61 74 68 20 2d 20 53 75 62 20 64 69 72 t path - Sub dir
0830: 65 63 74 6f 72 79 20 75 6e 64 65 72 20 27 73 72 ectory under 'sr
0840: 63 27 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 c' to limit the
0850: 69 6d 70 6f 72 74 20 74 6f 2e 0a 0a 23 20 2d 2d import to...# --
0860: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0870: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0880: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
08a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 41 50 -----------.# AP
08b0: 49 20 49 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e I Implementation
08c0: 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 ..proc ::vc::cvs
08d0: 3a 3a 77 73 3a 3a 63 6f 6e 66 69 67 75 72 65 20 ::ws::configure
08e0: 7b 6b 65 79 20 76 61 6c 75 65 7d 20 7b 0a 20 20 {key value} {.
08f0: 20 20 76 61 72 69 61 62 6c 65 20 70 72 6f 6a 65 variable proje
0900: 63 74 0a 0a 20 20 20 20 73 77 69 74 63 68 20 2d ct.. switch -
0910: 65 78 61 63 74 20 2d 2d 20 24 6b 65 79 20 7b 0a exact -- $key {.
0920: 09 2d 70 72 6f 6a 65 63 74 20 7b 20 73 65 74 20 .-project { set
0930: 70 72 6f 6a 65 63 74 20 24 76 61 6c 75 65 20 7d project $value }
0940: 0a 09 64 65 66 61 75 6c 74 20 7b 0a 09 20 20 20 ..default {..
0950: 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 72 return -code er
0960: 72 6f 72 20 22 55 6e 6b 6e 6f 77 6e 20 73 77 69 ror "Unknown swi
0970: 74 63 68 20 24 6b 65 79 2c 20 65 78 70 65 63 74 tch $key, expect
0980: 65 64 20 5c 0a 20 20 20 20 20 20 20 20 20 20 20 ed \.
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
09a0: 20 20 20 20 20 20 20 20 2d 70 72 6f 6a 65 63 74 -project
09b0: 22 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 20 72 "..}. }. r
09c0: 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a eturn.}..proc ::
09d0: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 63 68 65 vc::cvs::ws::che
09e0: 63 6b 20 7b 73 72 63 20 6d 76 7d 20 7b 0a 20 20 ck {src mv} {.
09f0: 20 20 76 61 72 69 61 62 6c 65 20 70 72 6f 6a 65 variable proje
0a00: 63 74 0a 20 20 20 20 75 70 76 61 72 20 31 20 24 ct. upvar 1 $
0a10: 6d 76 20 6d 73 67 0a 20 20 20 20 69 66 20 7b 0a mv msg. if {.
0a20: 09 21 5b 66 69 6c 65 75 74 69 6c 3a 3a 74 65 73 .![fileutil::tes
0a30: 74 20 24 73 72 63 20 20 20 20 20 20 20 20 20 65 t $src e
0a40: 72 64 20 6d 73 67 20 22 43 56 53 20 52 65 70 6f rd msg "CVS Repo
0a50: 73 69 74 6f 72 79 22 5d 20 7c 7c 0a 09 21 5b 66 sitory"] ||..![f
0a60: 69 6c 65 75 74 69 6c 3a 3a 74 65 73 74 20 24 73 ileutil::test $s
0a70: 72 63 2f 43 56 53 52 4f 4f 54 20 65 72 64 20 6d rc/CVSROOT erd m
0a80: 73 67 20 22 43 56 53 20 41 64 6d 69 6e 20 64 69 sg "CVS Admin di
0a90: 72 65 63 74 6f 72 79 22 5d 20 7c 7c 0a 09 28 28 rectory"] ||..((
0aa0: 24 70 72 6f 6a 65 63 74 20 6e 65 20 22 22 29 20 $project ne "")
0ab0: 26 26 0a 09 20 21 5b 66 69 6c 65 75 74 69 6c 3a &&.. ![fileutil:
0ac0: 3a 74 65 73 74 20 24 73 72 63 2f 24 70 72 6f 6a :test $src/$proj
0ad0: 65 63 74 20 65 72 64 20 6d 73 67 20 22 50 72 6f ect erd msg "Pro
0ae0: 6a 65 63 74 20 64 69 72 65 63 74 6f 72 79 22 5d ject directory"]
0af0: 29 0a 20 20 20 20 7d 20 7b 0a 09 72 65 74 75 72 ). } {..retur
0b00: 6e 20 30 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 n 0. }. re
0b10: 74 75 72 6e 20 31 0a 7d 0a 0a 70 72 6f 63 20 3a turn 1.}..proc :
0b20: 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 62 65 :vc::cvs::ws::be
0b30: 67 69 6e 20 7b 73 72 63 7d 20 7b 0a 20 20 20 20 gin {src} {.
0b40: 69 66 20 7b 21 5b 63 68 65 63 6b 20 24 73 72 63 if {![check $src
0b50: 20 6d 73 67 5d 7d 20 7b 20 72 65 74 75 72 6e 20 msg]} { return
0b60: 2d 63 6f 64 65 20 65 72 72 6f 72 20 24 6d 73 67 -code error $msg
0b70: 20 7d 0a 0a 20 20 20 20 44 65 66 42 61 73 65 20 }.. DefBase
0b80: 24 73 72 63 0a 20 20 20 20 4d 61 6b 65 54 69 6d $src. MakeTim
0b90: 65 6c 69 6e 65 20 5b 53 63 61 6e 41 72 63 68 69 eline [ScanArchi
0ba0: 76 65 73 20 5b 66 69 6c 65 73 3a 3a 66 69 6e 64 ves [files::find
0bb0: 20 5b 52 6f 6f 74 50 61 74 68 5d 5d 5d 0a 20 20 [RootPath]]].
0bc0: 20 20 4d 61 6b 65 43 68 61 6e 67 65 73 65 74 73 MakeChangesets
0bd0: 0a 0a 20 20 20 20 23 20 4f 4c 44 20 61 70 69 20 .. # OLD api
0be0: 63 61 6c 6c 73 20 2e 2e 2e 20 54 4f 44 4f 20 72 calls ... TODO r
0bf0: 65 77 6f 72 6b 20 66 6f 72 20 6d 6f 72 65 20 73 ework for more s
0c00: 74 72 75 63 74 75 72 65 20 2e 2e 2e 0a 20 20 20 tructure ....
0c10: 20 72 74 72 65 65 20 20 20 20 3b 20 23 20 42 75 rtree ; # Bu
0c20: 69 6c 64 20 72 65 76 69 73 69 6f 6e 20 74 72 65 ild revision tre
0c30: 65 20 28 74 72 75 6e 6b 20 6f 6e 6c 79 20 72 69 e (trunk only ri
0c40: 67 68 74 20 6e 6f 77 29 2e 0a 0a 20 20 20 20 72 ght now)... r
0c50: 65 74 75 72 6e 20 5b 4d 61 6b 65 57 6f 72 6b 73 eturn [MakeWorks
0c60: 70 61 63 65 5d 0a 7d 0a 0a 70 72 6f 63 20 3a 3a pace].}..proc ::
0c70: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 64 6f 6e vc::cvs::ws::don
0c80: 65 20 7b 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 e {} {. varia
0c90: 62 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 77 ble w
0ca0: 6f 72 6b 73 70 61 63 65 0a 20 20 20 20 66 69 6c orkspace. fil
0cb0: 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 e delete -force
0cc0: 24 77 6f 72 6b 73 70 61 63 65 0a 20 20 20 20 72 $workspace. r
0cd0: 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a eturn.}..proc ::
0ce0: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 66 6f 72 vc::cvs::ws::for
0cf0: 65 61 63 68 20 7b 63 76 20 73 63 72 69 70 74 7d each {cv script}
0d00: 20 7b 0a 20 20 20 20 23 20 4f 4c 44 20 61 70 69 {. # OLD api
0d10: 20 2e 2e 2e 20 54 4f 44 4f 20 69 6e 6c 69 6e 65 ... TODO inline
0d20: 0a 20 20 20 20 75 70 6c 65 76 65 6c 20 31 20 5b . uplevel 1 [
0d30: 6c 69 73 74 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a list ::vc::cvs::
0d40: 77 73 3a 3a 66 6f 72 65 61 63 68 5f 63 73 65 74 ws::foreach_cset
0d50: 20 24 63 76 20 30 20 24 73 63 72 69 70 74 5d 0a $cv 0 $script].
0d60: 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 }..proc ::vc::cv
0d70: 73 3a 3a 77 73 3a 3a 6e 63 73 65 74 73 20 7b 61 s::ws::ncsets {a
0d80: 72 67 73 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 rgs} {. varia
0d90: 62 6c 65 20 6e 74 72 75 6e 6b 0a 0a 20 20 20 20 ble ntrunk..
0da0: 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 61 72 if {[llength $ar
0db0: 67 73 5d 20 3e 20 31 7d 20 7b 0a 09 72 65 74 75 gs] > 1} {..retu
0dc0: 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 rn -code error "
0dd0: 77 72 6f 6e 67 23 61 72 67 73 3a 20 45 78 70 65 wrong#args: Expe
0de0: 63 74 65 64 20 3f 2d 69 6d 70 6f 72 74 3f 22 0a cted ?-import?".
0df0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 6c } elseif {[l
0e00: 6c 65 6e 67 74 68 20 24 61 72 67 73 5d 20 3d 3d length $args] ==
0e10: 20 31 7d 20 7b 0a 09 69 66 20 7b 5b 73 65 74 20 1} {..if {[set
0e20: 6b 20 5b 6c 69 6e 64 65 78 20 24 61 72 67 73 20 k [lindex $args
0e30: 30 5d 5d 20 6e 65 20 22 2d 69 6d 70 6f 72 74 22 0]] ne "-import"
0e40: 7d 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 } {.. return
0e50: 2d 63 6f 64 65 20 22 55 6e 6b 6e 6f 77 6e 20 73 -code "Unknown s
0e60: 77 69 74 63 68 20 24 6b 2c 20 65 78 70 65 63 74 witch $k, expect
0e70: 65 64 20 2d 69 6d 70 6f 72 74 22 0a 09 7d 20 65 ed -import"..} e
0e80: 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75 72 lse {.. retur
0e90: 6e 20 24 6e 74 72 75 6e 6b 0a 09 7d 0a 20 20 20 n $ntrunk..}.
0ea0: 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 5b }.. return [
0eb0: 63 73 65 74 73 3a 3a 6e 75 6d 5d 0a 7d 0a 0a 70 csets::num].}..p
0ec0: 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 roc ::vc::cvs::w
0ed0: 73 3a 3a 69 73 61 64 6d 69 6e 20 7b 70 61 74 68 s::isadmin {path
0ee0: 7d 20 7b 0a 20 20 20 20 23 20 43 68 65 63 6b 20 } {. # Check
0ef0: 69 66 20 70 61 74 68 20 69 73 20 61 20 43 56 53 if path is a CVS
0f00: 20 61 64 6d 69 6e 20 66 69 6c 65 2e 0a 20 20 20 admin file..
0f10: 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 if {[string mat
0f20: 63 68 20 43 56 53 2f 2a 20 20 20 24 70 61 74 68 ch CVS/* $path
0f30: 5d 7d 20 7b 72 65 74 75 72 6e 20 31 7d 0a 20 20 ]} {return 1}.
0f40: 20 20 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 if {[string ma
0f50: 74 63 68 20 2a 2f 43 56 53 2f 2a 20 24 70 61 74 tch */CVS/* $pat
0f60: 68 5d 7d 20 7b 72 65 74 75 72 6e 20 31 7d 0a 20 h]} {return 1}.
0f70: 20 20 20 72 65 74 75 72 6e 20 30 0a 7d 0a 0a 70 return 0.}..p
0f80: 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 roc ::vc::cvs::w
0f90: 73 3a 3a 63 68 65 63 6b 6f 75 74 20 7b 69 64 7d s::checkout {id}
0fa0: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 {. variable
0fb0: 77 6f 72 6b 73 70 61 63 65 0a 20 20 20 20 63 64 workspace. cd
0fc0: 20 20 20 20 20 20 24 77 6f 72 6b 73 70 61 63 65 $workspace
0fd0: 0a 0a 20 20 20 20 61 72 72 61 79 20 73 65 74 20 .. array set
0fe0: 63 73 20 5b 63 73 65 74 73 3a 3a 67 65 74 20 24 cs [csets::get $
0ff0: 69 64 5d 0a 0a 20 20 20 20 77 72 69 74 65 20 31 id].. write 1
1000: 20 63 76 73 20 22 40 20 20 24 63 73 28 64 61 74 cvs "@ $cs(dat
1010: 65 29 22 0a 20 20 20 20 3a 3a 66 6f 72 65 61 63 e)". ::foreac
1020: 68 20 6c 20 5b 73 70 6c 69 74 20 5b 73 74 72 69 h l [split [stri
1030: 6e 67 20 74 72 69 6d 20 24 63 73 28 63 6d 73 67 ng trim $cs(cmsg
1040: 29 5d 20 5c 6e 5d 20 7b 0a 09 77 72 69 74 65 20 )] \n] {..write
1050: 31 20 63 76 73 20 22 7c 20 20 24 6c 22 0a 20 20 1 cvs "| $l".
1060: 20 20 7d 0a 0a 20 20 20 20 3a 3a 66 6f 72 65 61 }.. ::forea
1070: 63 68 20 7b 66 20 72 7d 20 24 63 73 28 72 65 6d ch {f r} $cs(rem
1080: 6f 76 65 64 29 20 7b 20 77 72 69 74 65 20 32 20 oved) { write 2
1090: 63 76 73 20 22 52 20 20 24 66 20 24 72 22 20 3b cvs "R $f $r" ;
10a0: 20 52 65 6d 6f 76 65 20 20 20 24 66 20 24 72 20 Remove $f $r
10b0: 7d 0a 20 20 20 20 3a 3a 66 6f 72 65 61 63 68 20 }. ::foreach
10c0: 7b 66 20 72 7d 20 24 63 73 28 61 64 64 65 64 29 {f r} $cs(added)
10d0: 20 20 20 7b 20 77 72 69 74 65 20 32 20 63 76 73 { write 2 cvs
10e0: 20 22 41 20 20 24 66 20 24 72 22 20 3b 20 43 68 "A $f $r" ; Ch
10f0: 65 63 6b 6f 75 74 20 24 66 20 24 72 20 7d 0a 20 eckout $f $r }.
1100: 20 20 20 3a 3a 66 6f 72 65 61 63 68 20 7b 66 20 ::foreach {f
1110: 72 7d 20 24 63 73 28 63 68 61 6e 67 65 64 29 20 r} $cs(changed)
1120: 7b 20 77 72 69 74 65 20 32 20 63 76 73 20 22 4d { write 2 cvs "M
1130: 20 20 24 66 20 24 72 22 20 3b 20 43 68 65 63 6b $f $r" ; Check
1140: 6f 75 74 20 24 66 20 24 72 20 7d 0a 0a 20 20 20 out $f $r }..
1150: 20 23 20 50 72 6f 76 69 64 65 20 6d 65 74 61 64 # Provide metad
1160: 61 74 61 20 61 62 6f 75 74 20 74 68 65 20 63 68 ata about the ch
1170: 61 6e 67 65 73 65 74 20 74 68 65 20 62 61 63 6b angeset the back
1180: 65 6e 64 20 6d 61 79 20 77 69 73 68 20 74 6f 20 end may wish to
1190: 68 61 76 65 0a 20 20 20 20 72 65 74 75 72 6e 20 have. return
11a0: 5b 6c 69 73 74 20 24 63 73 28 61 75 74 68 6f 72 [list $cs(author
11b0: 29 20 24 63 73 28 64 61 74 65 29 20 24 63 73 28 ) $cs(date) $cs(
11c0: 63 6d 73 67 29 5d 0a 7d 0a 0a 23 20 2d 2d 2d 2d cmsg)].}..# ----
11d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
11f0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1200: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49 6e 74 65 ---------.# Inte
1220: 72 6e 61 6c 73 0a 0a 70 72 6f 63 20 3a 3a 76 63 rnals..proc ::vc
1230: 3a 3a 63 76 73 3a 3a 77 73 3a 3a 44 65 66 42 61 ::cvs::ws::DefBa
1240: 73 65 20 7b 70 61 74 68 7d 20 7b 0a 20 20 20 20 se {path} {.
1250: 76 61 72 69 61 62 6c 65 20 70 72 6f 6a 65 63 74 variable project
1260: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 62 61 . variable ba
1270: 73 65 0a 0a 20 20 20 20 73 65 74 20 62 61 73 65 se.. set base
1280: 20 24 70 61 74 68 0a 0a 20 20 20 20 77 72 69 74 $path.. writ
1290: 65 20 30 20 63 76 73 20 22 42 61 73 65 3a 20 20 e 0 cvs "Base:
12a0: 20 20 24 62 61 73 65 22 0a 20 20 20 20 69 66 20 $base". if
12b0: 7b 24 70 72 6f 6a 65 63 74 20 65 71 20 22 22 7d {$project eq ""}
12c0: 20 7b 0a 09 77 72 69 74 65 20 30 20 63 76 73 20 {..write 0 cvs
12d0: 22 50 72 6f 6a 65 63 74 3a 20 3c 41 4c 4c 3e 22 "Project: <ALL>"
12e0: 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 77 . } else {..w
12f0: 72 69 74 65 20 30 20 63 76 73 20 22 50 72 6f 6a rite 0 cvs "Proj
1300: 65 63 74 3a 20 24 70 72 6f 6a 65 63 74 22 0a 20 ect: $project".
1310: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 0a }. return.
1320: 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 }..proc ::vc::cv
1330: 73 3a 3a 77 73 3a 3a 52 6f 6f 74 50 61 74 68 20 s::ws::RootPath
1340: 7b 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c {} {. variabl
1350: 65 20 70 72 6f 6a 65 63 74 0a 20 20 20 20 76 61 e project. va
1360: 72 69 61 62 6c 65 20 62 61 73 65 0a 0a 20 20 20 riable base..
1370: 20 69 66 20 7b 24 70 72 6f 6a 65 63 74 20 65 71 if {$project eq
1380: 20 22 22 7d 20 7b 0a 09 72 65 74 75 72 6e 20 24 ""} {..return $
1390: 62 61 73 65 0a 20 20 20 20 7d 20 65 6c 73 65 20 base. } else
13a0: 7b 0a 09 72 65 74 75 72 6e 20 24 62 61 73 65 2f {..return $base/
13b0: 24 70 72 6f 6a 65 63 74 0a 20 20 20 20 7d 0a 7d $project. }.}
13c0: 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 ..proc ::vc::cvs
13d0: 3a 3a 77 73 3a 3a 53 63 61 6e 41 72 63 68 69 76 ::ws::ScanArchiv
13e0: 65 73 20 7b 66 69 6c 65 73 7d 20 7b 0a 20 20 20 es {files} {.
13f0: 20 77 72 69 74 65 20 30 20 63 76 73 20 22 53 63 write 0 cvs "Sc
1400: 61 6e 6e 69 6e 67 20 61 72 63 68 69 76 65 73 20 anning archives
1410: 2e 2e 2e 22 0a 0a 20 20 20 20 73 65 74 20 64 20 ...".. set d
1420: 5b 52 6f 6f 74 50 61 74 68 5d 0a 20 20 20 20 73 [RootPath]. s
1430: 65 74 20 72 20 7b 7d 0a 20 20 20 20 73 65 74 20 et r {}. set
1440: 6e 20 30 0a 0a 20 20 20 20 3a 3a 66 6f 72 65 61 n 0.. ::forea
1450: 63 68 20 7b 72 63 73 20 66 7d 20 24 66 69 6c 65 ch {rcs f} $file
1460: 73 20 7b 0a 09 77 72 69 74 65 20 31 20 63 76 73 s {..write 1 cvs
1470: 20 22 41 72 63 68 69 76 65 20 24 72 63 73 22 0a "Archive $rcs".
1480: 09 23 20 47 65 74 20 74 68 65 20 6d 65 74 61 20 .# Get the meta
1490: 64 61 74 61 20 77 65 20 6e 65 65 64 20 28 72 65 data we need (re
14a0: 76 69 73 69 6f 6e 73 2c 20 74 69 6d 65 6c 69 6e visions, timelin
14b0: 65 2c 20 6d 65 73 73 61 67 65 73 29 2e 0a 09 6c e, messages)...l
14c0: 61 70 70 65 6e 64 20 72 20 24 66 20 5b 70 72 6f append r $f [pro
14d0: 63 65 73 73 20 24 64 2f 24 72 63 73 5d 0a 09 69 cess $d/$rcs]..i
14e0: 6e 63 72 20 20 20 20 6e 0a 20 20 20 20 7d 0a 0a ncr n. }..
14f0: 20 20 20 20 77 72 69 74 65 20 30 20 63 76 73 20 write 0 cvs
1500: 22 50 72 6f 63 65 73 73 65 64 20 5b 4e 53 49 50 "Processed [NSIP
1510: 4c 20 24 6e 20 66 69 6c 65 5d 22 0a 20 20 20 20 L $n file]".
1520: 72 65 74 75 72 6e 20 24 72 0a 7d 0a 0a 70 72 6f return $r.}..pro
1530: 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a c ::vc::cvs::ws:
1540: 3a 4d 61 6b 65 54 69 6d 65 6c 69 6e 65 20 7b 6d :MakeTimeline {m
1550: 65 74 61 7d 20 7b 0a 20 20 20 20 77 72 69 74 65 eta} {. write
1560: 20 30 20 63 76 73 20 22 47 65 6e 65 72 61 74 69 0 cvs "Generati
1570: 6e 67 20 63 6f 61 6c 65 73 63 65 64 20 74 69 6d ng coalesced tim
1580: 65 6c 69 6e 65 20 2e 2e 2e 22 0a 0a 20 20 20 20 eline ..."..
1590: 73 65 74 20 6e 20 30 0a 20 20 20 20 3a 3a 66 6f set n 0. ::fo
15a0: 72 65 61 63 68 20 7b 66 20 6d 65 74 61 7d 20 24 reach {f meta} $
15b0: 6d 65 74 61 20 7b 0a 09 61 72 72 61 79 20 73 65 meta {..array se
15c0: 74 20 6d 64 20 20 20 24 6d 65 74 61 0a 09 61 72 t md $meta..ar
15d0: 72 61 79 20 73 65 74 20 64 61 74 65 20 24 6d 64 ray set date $md
15e0: 28 64 61 74 65 29 0a 09 61 72 72 61 79 20 73 65 (date)..array se
15f0: 74 20 61 75 74 68 20 24 6d 64 28 61 75 74 68 6f t auth $md(autho
1600: 72 29 0a 09 61 72 72 61 79 20 73 65 74 20 63 6d r)..array set cm
1610: 73 67 20 24 6d 64 28 63 6f 6d 6d 69 74 29 0a 09 sg $md(commit)..
1620: 61 72 72 61 79 20 73 65 74 20 73 74 61 74 20 24 array set stat $
1630: 6d 64 28 73 74 61 74 65 29 0a 0a 09 3a 3a 66 6f md(state)...::fo
1640: 72 65 61 63 68 20 72 65 76 20 5b 6c 73 6f 72 74 reach rev [lsort
1650: 20 2d 64 69 63 74 20 5b 61 72 72 61 79 20 6e 61 -dict [array na
1660: 6d 65 73 20 64 61 74 65 5d 5d 20 7b 0a 09 20 20 mes date]] {..
1670: 20 20 73 65 74 20 6f 70 65 72 61 74 69 6f 6e 20 set operation
1680: 5b 4f 70 65 72 61 74 69 6f 6e 20 24 72 65 76 20 [Operation $rev
1690: 24 73 74 61 74 28 24 72 65 76 29 5d 0a 09 20 20 $stat($rev)]..
16a0: 20 20 4e 6f 74 65 44 65 61 64 52 6f 6f 74 73 20 NoteDeadRoots
16b0: 24 66 20 24 72 65 76 20 24 6f 70 65 72 61 74 69 $f $rev $operati
16c0: 6f 6e 0a 09 20 20 20 20 74 69 6d 65 6c 69 6e 65 on.. timeline
16d0: 3a 3a 61 64 64 20 24 64 61 74 65 28 24 72 65 76 ::add $date($rev
16e0: 29 20 24 66 20 24 72 65 76 20 24 6f 70 65 72 61 ) $f $rev $opera
16f0: 74 69 6f 6e 20 24 61 75 74 68 28 24 72 65 76 29 tion $auth($rev)
1700: 20 24 63 6d 73 67 28 24 72 65 76 29 0a 09 20 20 $cmsg($rev)..
1710: 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 09 23 42 20 incr n..}..#B
1720: 45 78 74 65 6e 64 20 62 72 61 6e 63 68 20 6d 61 Extend branch ma
1730: 6e 61 67 65 6d 65 6e 74 0a 0a 09 75 6e 73 65 74 nagement...unset
1740: 20 6d 64 0a 09 75 6e 73 65 74 20 64 61 74 65 0a md..unset date.
1750: 09 75 6e 73 65 74 20 61 75 74 68 0a 09 75 6e 73 .unset auth..uns
1760: 65 74 20 63 6d 73 67 0a 09 75 6e 73 65 74 20 73 et cmsg..unset s
1770: 74 61 74 0a 20 20 20 20 7d 0a 0a 20 20 20 20 77 tat. }.. w
1780: 72 69 74 65 20 30 20 63 76 73 20 22 54 69 6d 65 rite 0 cvs "Time
1790: 6c 69 6e 65 20 68 61 73 20 5b 4e 53 49 50 4c 20 line has [NSIPL
17a0: 24 6e 20 65 6e 74 72 79 20 65 6e 74 72 69 65 73 $n entry entries
17b0: 5d 22 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a ]". return.}.
17c0: 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a .proc ::vc::cvs:
17d0: 3a 77 73 3a 3a 4e 6f 74 65 44 65 61 64 52 6f 6f :ws::NoteDeadRoo
17e0: 74 73 20 7b 66 20 72 65 76 20 6f 70 65 72 61 74 ts {f rev operat
17f0: 69 6f 6e 7d 20 7b 0a 20 20 20 20 23 20 41 20 64 ion} {. # A d
1800: 65 61 64 2d 66 69 72 73 74 20 72 65 76 69 73 69 ead-first revisi
1810: 6f 6e 20 69 73 20 72 65 76 20 31 2e 31 20 77 69 on is rev 1.1 wi
1820: 74 68 20 6f 70 20 52 2e 20 46 6f 72 20 61 6e 20 th op R. For an
1830: 65 78 61 6d 70 6c 65 20 73 65 65 0a 20 20 20 20 example see.
1840: 23 20 74 68 65 20 66 69 6c 65 20 6d 65 6d 63 68 # the file memch
1850: 61 6e 2f 44 45 50 45 4e 44 45 4e 43 49 45 53 2e an/DEPENDENCIES.
1860: 20 53 75 63 68 20 61 20 66 69 6c 65 20 73 65 65 Such a file see
1870: 6d 73 20 74 6f 20 65 78 69 73 74 20 6f 6e 6c 79 ms to exist only
1880: 21 0a 20 20 20 20 23 20 6f 6e 20 69 74 73 20 62 !. # on its b
1890: 72 61 6e 63 68 2e 20 54 68 65 20 62 72 61 6e 63 ranch. The branc
18a0: 68 65 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 hes information
18b0: 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 72 65 is set on the re
18c0: 76 69 73 69 6f 6e 0a 20 20 20 20 23 20 28 65 78 vision. # (ex
18d0: 74 65 6e 64 20 72 63 73 70 61 72 73 65 72 21 29 tend rcsparser!)
18e0: 2c 20 73 79 6d 62 6f 6c 73 20 68 61 73 20 61 20 , symbols has a
18f0: 74 61 67 2c 20 72 65 66 65 72 69 6e 67 20 74 6f tag, refering to
1900: 20 61 20 62 72 61 6e 63 68 2c 0a 20 20 20 20 23 a branch,. #
1910: 20 70 6f 73 73 69 62 6c 79 20 6d 61 67 69 63 2e possibly magic.
1920: 0a 0a 20 20 20 20 69 66 20 7b 28 24 72 65 76 20 .. if {($rev
1930: 65 71 20 22 31 2e 31 22 29 20 26 26 20 28 24 6f eq "1.1") && ($o
1940: 70 65 72 61 74 69 6f 6e 20 65 71 20 22 52 22 29 peration eq "R")
1950: 7d 20 7b 0a 09 77 72 69 74 65 20 32 20 63 76 73 } {..write 2 cvs
1960: 20 22 44 65 61 64 20 72 6f 6f 74 20 72 65 76 69 "Dead root revi
1970: 73 69 6f 6e 3a 20 24 66 22 0a 20 20 20 20 7d 0a sion: $f". }.
1980: 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 return.}..pr
1990: 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 oc ::vc::cvs::ws
19a0: 3a 3a 4f 70 65 72 61 74 69 6f 6e 20 7b 72 65 76 ::Operation {rev
19b0: 20 73 74 61 74 65 7d 20 7b 0a 20 20 20 20 69 66 state} {. if
19c0: 20 7b 24 73 74 61 74 65 20 65 71 20 22 64 65 61 {$state eq "dea
19d0: 64 22 7d 20 7b 72 65 74 75 72 6e 20 22 52 22 7d d"} {return "R"}
19e0: 20 3b 20 23 20 52 65 6d 6f 76 65 64 0a 20 20 20 ; # Removed.
19f0: 20 69 66 20 7b 24 72 65 76 20 20 20 65 71 20 22 if {$rev eq "
1a00: 31 2e 31 22 7d 20 20 7b 72 65 74 75 72 6e 20 22 1.1"} {return "
1a10: 41 22 7d 20 3b 20 23 20 41 64 64 65 64 0a 20 20 A"} ; # Added.
1a20: 20 20 72 65 74 75 72 6e 20 22 4d 22 20 20 20 20 return "M"
1a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1a40: 20 20 20 20 20 3b 20 23 20 4d 6f 64 69 66 69 65 ; # Modifie
1a50: 64 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a d.}..proc ::vc::
1a60: 63 76 73 3a 3a 77 73 3a 3a 4d 61 6b 65 43 68 61 cvs::ws::MakeCha
1a70: 6e 67 65 73 65 74 73 20 7b 7d 20 7b 0a 20 20 20 ngesets {} {.
1a80: 20 77 72 69 74 65 20 30 20 63 76 73 20 22 47 65 write 0 cvs "Ge
1a90: 6e 65 72 61 74 69 6e 67 20 63 68 61 6e 67 65 73 nerating changes
1aa0: 65 74 73 20 66 72 6f 6d 20 74 69 6d 65 6c 69 6e ets from timelin
1ab0: 65 22 0a 0a 20 20 20 20 63 73 65 74 73 3a 3a 69 e".. csets::i
1ac0: 6e 69 74 0a 20 20 20 20 74 69 6d 65 6c 69 6e 65 nit. timeline
1ad0: 3a 3a 66 6f 72 65 61 63 68 20 64 61 74 65 20 66 ::foreach date f
1ae0: 69 6c 65 20 72 65 76 69 73 69 6f 6e 20 6f 70 65 ile revision ope
1af0: 72 61 74 69 6f 6e 20 61 75 74 68 6f 72 20 63 6d ration author cm
1b00: 73 67 20 7b 0a 09 63 73 65 74 73 3a 3a 61 64 64 sg {..csets::add
1b10: 20 24 64 61 74 65 20 24 66 69 6c 65 20 24 72 65 $date $file $re
1b20: 76 69 73 69 6f 6e 20 24 6f 70 65 72 61 74 69 6f vision $operatio
1b30: 6e 20 24 61 75 74 68 6f 72 20 24 63 6d 73 67 0a n $author $cmsg.
1b40: 20 20 20 20 7d 0a 20 20 20 20 63 73 65 74 73 3a }. csets:
1b50: 3a 64 6f 6e 65 0a 0a 20 20 20 20 77 72 69 74 65 :done.. write
1b60: 20 30 20 63 76 73 20 22 46 6f 75 6e 64 20 5b 4e 0 cvs "Found [N
1b70: 53 49 50 4c 20 5b 63 73 65 74 73 3a 3a 6e 75 6d SIPL [csets::num
1b80: 5d 20 63 68 61 6e 67 65 73 65 74 5d 22 0a 20 20 ] changeset]".
1b90: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 return.}..proc
1ba0: 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a ::vc::cvs::ws::
1bb0: 4d 61 6b 65 57 6f 72 6b 73 70 61 63 65 20 7b 7d MakeWorkspace {}
1bc0: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 {. variable
1bd0: 70 72 6f 6a 65 63 74 0a 20 20 20 20 76 61 72 69 project. vari
1be0: 61 62 6c 65 20 77 6f 72 6b 73 70 61 63 65 20 5b able workspace [
1bf0: 66 69 6c 65 75 74 69 6c 3a 3a 74 65 6d 70 66 69 fileutil::tempfi
1c00: 6c 65 20 69 6d 70 6f 72 74 46 5f 63 76 73 5f 77 le importF_cvs_w
1c10: 73 5f 5d 0a 0a 20 20 20 20 73 65 74 20 77 20 24 s_].. set w $
1c20: 77 6f 72 6b 73 70 61 63 65 0a 20 20 20 20 69 66 workspace. if
1c30: 20 7b 24 70 72 6f 6a 65 63 74 20 6e 65 20 22 22 {$project ne ""
1c40: 7d 20 7b 20 61 70 70 65 6e 64 20 77 20 2f 24 70 } { append w /$p
1c50: 72 6f 6a 65 63 74 20 7d 0a 0a 20 20 20 20 66 69 roject }.. fi
1c60: 6c 65 20 64 65 6c 65 74 65 20 24 77 6f 72 6b 73 le delete $works
1c70: 70 61 63 65 0a 20 20 20 20 66 69 6c 65 20 6d 6b pace. file mk
1c80: 64 69 72 20 20 24 77 0a 0a 20 20 20 20 77 72 69 dir $w.. wri
1c90: 74 65 20 30 20 63 76 73 20 22 57 6f 72 6b 73 70 te 0 cvs "Worksp
1ca0: 61 63 65 3a 20 20 24 77 6f 72 6b 73 70 61 63 65 ace: $workspace
1cb0: 22 0a 20 20 20 20 72 65 74 75 72 6e 20 24 77 0a ". return $w.
1cc0: 7d 0a 0a 23 20 42 75 69 6c 64 69 6e 67 20 74 68 }..# Building th
1cd0: 65 20 72 65 76 69 73 69 6f 6e 20 74 72 65 65 20 e revision tree
1ce0: 66 72 6f 6d 20 74 68 65 20 63 68 61 6e 67 65 73 from the changes
1cf0: 65 74 73 2e 0a 23 20 4c 69 6d 69 74 61 74 69 6f ets..# Limitatio
1d00: 6e 3a 20 43 75 72 72 65 6e 74 6c 79 20 6f 6e 6c n: Currently onl
1d10: 79 20 74 72 75 6e 6b 20 63 73 65 74 73 20 69 73 y trunk csets is
1d20: 20 68 61 6e 64 6c 65 64 2e 0a 23 20 4c 69 6d 69 handled..# Limi
1d30: 74 61 74 69 6f 6e 3a 20 44 65 61 64 20 66 69 6c tation: Dead fil
1d40: 65 73 20 61 72 65 20 6e 6f 74 20 72 65 6d 6f 76 es are not remov
1d50: 65 64 2c 20 69 2e 65 2e 20 6e 6f 20 27 52 27 20 ed, i.e. no 'R'
1d60: 61 63 74 69 6f 6e 73 20 72 69 67 68 74 20 6e 6f actions right no
1d70: 77 2e 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 w...proc ::vc::c
1d80: 76 73 3a 3a 77 73 3a 3a 72 74 72 65 65 20 7b 7d vs::ws::rtree {}
1d90: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 {. variable
1da0: 72 74 72 65 65 20 7b 7d 0a 20 20 20 20 76 61 72 rtree {}. var
1db0: 69 61 62 6c 65 20 6e 74 72 75 6e 6b 20 30 0a 0a iable ntrunk 0..
1dc0: 20 20 20 20 77 72 69 74 65 20 30 20 63 76 73 20 write 0 cvs
1dd0: 22 45 78 74 72 61 63 74 69 6e 67 20 74 68 65 20 "Extracting the
1de0: 74 72 75 6e 6b 22 0a 0a 20 20 20 20 73 65 74 20 trunk".. set
1df0: 72 74 72 65 65 20 5b 73 74 72 75 63 74 3a 3a 74 rtree [struct::t
1e00: 72 65 65 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 ree ::vc::cvs::w
1e10: 73 3a 3a 52 54 5d 0a 20 20 20 20 24 72 74 72 65 s::RT]. $rtre
1e20: 65 20 72 65 6e 61 6d 65 20 72 6f 6f 74 20 30 20 e rename root 0
1e30: 3b 20 23 20 52 6f 6f 74 20 69 73 20 66 69 72 73 ; # Root is firs
1e40: 74 20 63 68 61 6e 67 65 73 65 74 2c 20 61 6c 77 t changeset, alw
1e50: 61 79 73 2e 0a 20 20 20 20 73 65 74 20 74 72 75 ays.. set tru
1e60: 6e 6b 20 30 0a 20 20 20 20 73 65 74 20 6e 74 72 nk 0. set ntr
1e70: 75 6e 6b 20 31 20 3b 20 23 20 52 6f 6f 74 20 69 unk 1 ; # Root i
1e80: 73 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 2e 0a s on the trunk..
1e90: 20 20 20 20 73 65 74 20 62 20 20 20 20 20 20 30 set b 0
1ea0: 20 3b 20 23 20 4e 6f 20 62 72 61 6e 63 68 20 63 ; # No branch c
1eb0: 73 65 74 73 20 66 6f 75 6e 64 20 79 65 74 2e 0a sets found yet..
1ec0: 0a 20 20 20 20 23 20 45 78 74 72 61 63 74 69 6e . # Extractin
1ed0: 67 20 74 68 65 20 74 72 75 6e 6b 20 69 73 20 65 g the trunk is e
1ee0: 61 73 79 2c 20 73 69 6d 70 6c 79 20 62 79 20 6c asy, simply by l
1ef0: 6f 6f 6b 69 6e 67 20 61 74 20 74 68 65 20 69 6e ooking at the in
1f00: 76 6f 6c 76 65 64 0a 20 20 20 20 23 20 76 65 72 volved. # ver
1f10: 73 69 6f 6e 20 6e 75 6d 62 65 72 73 2e 20 0a 0a sion numbers. ..
1f20: 20 20 20 20 66 6f 72 20 7b 73 65 74 20 63 20 31 for {set c 1
1f30: 7d 20 7b 24 63 20 3c 20 5b 63 73 65 74 73 3a 3a } {$c < [csets::
1f40: 6e 75 6d 5d 7d 20 7b 69 6e 63 72 20 63 7d 20 7b num]} {incr c} {
1f50: 0a 09 61 72 72 61 79 20 73 65 74 20 63 73 20 5b ..array set cs [
1f60: 63 73 65 74 73 3a 3a 67 65 74 20 24 63 5d 0a 09 csets::get $c]..
1f70: 23 20 49 67 6e 6f 72 65 20 62 72 61 6e 63 68 20 # Ignore branch
1f80: 63 68 61 6e 67 65 73 2c 20 6a 75 73 74 20 63 6f changes, just co
1f90: 75 6e 74 20 74 68 65 6d 20 66 6f 72 20 74 68 65 unt them for the
1fa0: 20 73 74 61 74 69 73 74 69 63 73 2e 0a 09 69 66 statistics...if
1fb0: 20 7b 24 63 73 28 6c 61 73 74 64 29 20 21 3d 20 {$cs(lastd) !=
1fc0: 32 7d 20 7b 0a 09 20 20 20 20 69 6e 63 72 20 62 2} {.. incr b
1fd0: 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a 09 .. continue..
1fe0: 7d 0a 0a 09 23 20 54 72 75 6e 6b 20 72 65 76 69 }...# Trunk revi
1ff0: 73 69 6f 6e 2c 20 63 6f 6e 6e 65 63 74 20 74 6f sion, connect to
2000: 2c 20 61 6e 64 20 75 70 64 61 74 65 20 74 68 65 , and update the
2010: 20 68 65 61 64 2e 0a 09 24 72 74 72 65 65 20 69 head...$rtree i
2020: 6e 73 65 72 74 20 24 74 72 75 6e 6b 20 65 6e 64 nsert $trunk end
2030: 20 24 63 0a 09 73 65 74 20 74 72 75 6e 6b 20 24 $c..set trunk $
2040: 63 0a 09 69 6e 63 72 20 6e 74 72 75 6e 6b 0a 20 c..incr ntrunk.
2050: 20 20 20 7d 0a 0a 20 20 20 20 77 72 69 74 65 20 }.. write
2060: 30 20 63 76 73 20 22 50 72 6f 63 65 73 73 65 64 0 cvs "Processed
2070: 20 24 6e 74 72 75 6e 6b 20 74 72 75 6e 6b 20 20 $ntrunk trunk
2080: 5b 65 78 70 72 20 7b 28 24 6e 74 72 75 6e 6b 20 [expr {($ntrunk
2090: 3d 3d 20 31 29 20 3f 20 22 63 68 61 6e 67 65 73 == 1) ? "changes
20a0: 65 74 22 20 3a 20 22 63 68 61 6e 67 65 73 65 74 et" : "changeset
20b0: 73 22 7d 5d 22 0a 20 20 20 20 77 72 69 74 65 20 s"}]". write
20c0: 30 20 63 76 73 20 22 49 67 6e 6f 72 65 64 20 20 0 cvs "Ignored
20d0: 20 24 62 20 62 72 61 6e 63 68 20 5b 65 78 70 72 $b branch [expr
20e0: 20 7b 28 24 62 20 3d 3d 20 31 29 20 3f 20 22 63 {($b == 1) ? "c
20f0: 68 61 6e 67 65 73 65 74 22 20 3a 20 22 63 68 61 hangeset" : "cha
2100: 6e 67 65 73 65 74 73 22 7d 5d 22 0a 20 20 20 20 ngesets"}]".
2110: 72 65 74 75 72 6e 0a 7d 0a 0a 6e 61 6d 65 73 70 return.}..namesp
2120: 61 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a 63 ace eval ::vc::c
2130: 76 73 3a 3a 77 73 20 7b 0a 20 20 20 20 23 20 54 vs::ws {. # T
2140: 72 65 65 20 68 6f 6c 64 69 6e 67 20 74 72 75 6e ree holding trun
2150: 6b 20 61 6e 64 20 62 72 61 6e 63 68 20 69 6e 66 k and branch inf
2160: 6f 72 6d 61 74 69 6f 6e 20 28 73 74 72 75 63 74 ormation (struct
2170: 3a 3a 74 72 65 65 29 2e 0a 20 20 20 20 23 20 4e ::tree).. # N
2180: 6f 64 65 20 6e 61 6d 65 73 20 61 72 65 20 63 73 ode names are cs
2190: 65 74 20 69 64 27 73 2e 0a 0a 20 20 20 20 76 61 et id's... va
21a0: 72 69 61 62 6c 65 20 72 74 72 65 65 20 7b 7d 0a riable rtree {}.
21b0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 74 72 variable ntr
21c0: 75 6e 6b 20 30 0a 7d 0a 0a 70 72 6f 63 20 3a 3a unk 0.}..proc ::
21d0: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 66 6f 72 vc::cvs::ws::for
21e0: 65 61 63 68 5f 63 73 65 74 20 7b 63 76 20 6e 6f each_cset {cv no
21f0: 64 65 20 73 63 72 69 70 74 7d 20 7b 0a 20 20 20 de script} {.
2200: 20 75 70 76 61 72 20 31 20 24 63 76 20 63 0a 20 upvar 1 $cv c.
2210: 20 20 20 76 61 72 69 61 62 6c 65 20 72 74 72 65 variable rtre
2220: 65 0a 0a 20 20 20 20 73 65 74 20 63 20 24 6e 6f e.. set c $no
2230: 64 65 0a 20 20 20 20 77 68 69 6c 65 20 7b 31 7d de. while {1}
2240: 20 7b 0a 09 73 65 74 20 63 6f 64 65 20 5b 63 61 {..set code [ca
2250: 74 63 68 20 7b 75 70 6c 65 76 65 6c 20 31 20 24 tch {uplevel 1 $
2260: 73 63 72 69 70 74 7d 20 72 65 73 5d 0a 0a 09 23 script} res]...#
2270: 20 30 20 2d 20 6f 6b 2c 20 31 20 2d 20 65 72 72 0 - ok, 1 - err
2280: 6f 72 2c 20 32 20 2d 20 72 65 74 75 72 6e 2c 20 or, 2 - return,
2290: 33 20 2d 20 62 72 65 61 6b 2c 20 34 20 2d 20 63 3 - break, 4 - c
22a0: 6f 6e 74 69 6e 75 65 0a 09 73 77 69 74 63 68 20 ontinue..switch
22b0: 2d 2d 20 24 63 6f 64 65 20 7b 0a 09 20 20 20 20 -- $code {..
22c0: 30 20 7b 7d 0a 09 20 20 20 20 31 20 7b 20 72 65 0 {}.. 1 { re
22d0: 74 75 72 6e 20 2d 65 72 72 6f 72 63 6f 64 65 20 turn -errorcode
22e0: 24 3a 3a 65 72 72 6f 72 43 6f 64 65 20 2d 65 72 $::errorCode -er
22f0: 72 6f 72 69 6e 66 6f 20 24 3a 3a 65 72 72 6f 72 rorinfo $::error
2300: 49 6e 66 6f 20 2d 63 6f 64 65 20 65 72 72 6f 72 Info -code error
2310: 20 24 72 65 73 20 7d 0a 09 20 20 20 20 32 20 7b $res }.. 2 {
2320: 7d 0a 09 20 20 20 20 33 20 7b 20 72 65 74 75 72 }.. 3 { retur
2330: 6e 20 7d 0a 09 20 20 20 20 34 20 7b 7d 0a 09 20 n }.. 4 {}..
2340: 20 20 20 64 65 66 61 75 6c 74 20 7b 0a 09 09 72 default {...r
2350: 65 74 75 72 6e 20 2d 63 6f 64 65 20 24 63 6f 64 eturn -code $cod
2360: 65 20 24 72 65 73 75 6c 74 0a 09 20 20 20 20 7d e $result.. }
2370: 0a 09 7d 0a 0a 09 23 20 53 74 6f 70 20 6f 6e 20 ..}...# Stop on
2380: 72 65 61 63 68 69 6e 67 20 74 68 65 20 68 65 61 reaching the hea
2390: 64 2e 0a 09 69 66 20 7b 21 5b 6c 6c 65 6e 67 74 d...if {![llengt
23a0: 68 20 5b 24 72 74 72 65 65 20 63 68 69 6c 64 72 h [$rtree childr
23b0: 65 6e 20 24 63 5d 5d 7d 20 62 72 65 61 6b 0a 0a en $c]]} break..
23c0: 09 23 70 75 74 73 20 3c 5b 24 72 74 72 65 65 20 .#puts <[$rtree
23d0: 63 68 69 6c 64 72 65 6e 20 24 63 5d 3e 0a 0a 09 children $c]>...
23e0: 23 20 47 6f 20 74 6f 20 6e 65 78 74 20 63 68 69 # Go to next chi
23f0: 6c 64 20 69 6e 20 74 72 75 6e 6b 20 28 6c 65 66 ld in trunk (lef
2400: 74 6d 6f 73 74 29 2e 0a 09 73 65 74 20 63 20 5b tmost)...set c [
2410: 6c 69 6e 64 65 78 20 5b 24 72 74 72 65 65 20 63 lindex [$rtree c
2420: 68 69 6c 64 72 65 6e 20 24 63 5d 20 30 5d 0a 20 hildren $c] 0].
2430: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 0a }. return.
2440: 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 }..proc ::vc::cv
2450: 73 3a 3a 77 73 3a 3a 43 68 65 63 6b 6f 75 74 20 s::ws::Checkout
2460: 7b 66 20 72 7d 20 7b 0a 20 20 20 20 76 61 72 69 {f r} {. vari
2470: 61 62 6c 65 20 62 61 73 65 0a 20 20 20 20 76 61 able base. va
2480: 72 69 61 62 6c 65 20 70 72 6f 6a 65 63 74 0a 0a riable project..
2490: 20 20 20 20 23 20 41 64 64 65 64 20 6f 72 20 6d # Added or m
24a0: 6f 64 69 66 69 65 64 2c 20 70 75 74 20 74 68 65 odified, put the
24b0: 20 72 65 71 75 65 73 74 65 64 20 76 65 72 73 69 requested versi
24c0: 6f 6e 20 6f 66 20 74 68 65 20 66 69 6c 65 20 69 on of the file i
24d0: 6e 74 6f 0a 20 20 20 20 23 20 74 68 65 20 77 6f nto. # the wo
24e0: 72 6b 73 70 61 63 65 2e 0a 0a 20 20 20 20 69 66 rkspace... if
24f0: 20 7b 24 70 72 6f 6a 65 63 74 20 6e 65 20 22 22 {$project ne ""
2500: 7d 20 7b 73 65 74 20 66 20 24 70 72 6f 6a 65 63 } {set f $projec
2510: 74 2f 24 66 7d 0a 20 20 20 20 69 66 20 7b 5b 63 t/$f}. if {[c
2520: 61 74 63 68 20 7b 0a 09 64 6f 76 61 20 2d 64 20 atch {..dova -d
2530: 24 62 61 73 65 20 63 6f 20 2d 72 20 24 72 20 24 $base co -r $r $
2540: 66 0a 20 20 20 20 7d 20 6d 73 67 5d 7d 20 7b 0a f. } msg]} {.
2550: 09 69 66 20 7b 5b 73 74 72 69 6e 67 20 6d 61 74 .if {[string mat
2560: 63 68 20 7b 2a 69 6e 76 61 6c 69 64 20 63 68 61 ch {*invalid cha
2570: 6e 67 65 20 74 65 78 74 2a 7d 20 24 6d 73 67 5d nge text*} $msg]
2580: 7d 20 7b 0a 0a 09 20 20 20 20 23 20 54 68 65 20 } {... # The
2590: 61 72 63 68 69 76 65 20 6f 66 20 74 68 65 20 66 archive of the f
25a0: 69 6c 65 20 69 73 20 63 6f 72 72 75 70 74 65 64 ile is corrupted
25b0: 20 61 6e 64 20 74 68 65 20 63 68 6f 73 65 6e 0a and the chosen.
25c0: 09 20 20 20 20 23 20 76 65 72 73 69 6f 6e 20 6e . # version n
25d0: 6f 74 20 61 63 63 65 73 73 69 62 6c 65 20 64 75 ot accessible du
25e0: 65 20 74 6f 20 74 68 61 74 2e 20 57 65 20 72 65 e to that. We re
25f0: 70 6f 72 74 20 74 68 65 0a 09 20 20 20 20 23 20 port the.. #
2600: 70 72 6f 62 6c 65 6d 2c 20 62 75 74 20 6f 74 68 problem, but oth
2610: 65 72 77 69 73 65 20 69 67 6e 6f 72 65 20 69 74 erwise ignore it
2620: 2e 20 41 73 20 61 20 63 6f 6e 73 65 71 75 65 6e . As a consequen
2630: 63 65 20 74 68 65 0a 09 20 20 20 20 23 20 64 65 ce the.. # de
2640: 73 74 69 6e 61 74 69 6f 6e 20 72 65 70 6f 73 69 stination reposi
2650: 74 6f 72 79 20 77 69 6c 6c 20 6e 6f 74 20 63 6f tory will not co
2660: 6e 74 61 69 6e 20 74 68 65 20 66 75 6c 6c 20 68 ntain the full h
2670: 69 73 74 6f 72 79 0a 09 20 20 20 20 23 20 6f 66 istory.. # of
2680: 20 74 68 65 20 6e 61 6d 65 64 20 66 69 6c 65 2e the named file.
2690: 20 42 79 20 69 67 6e 6f 72 69 6e 67 20 74 68 65 By ignoring the
26a0: 20 70 72 6f 62 6c 65 6d 20 77 65 20 68 6f 77 65 problem we howe
26b0: 76 65 72 0a 09 20 20 20 20 23 20 67 65 74 20 61 ver.. # get a
26c0: 73 20 6d 75 63 68 20 61 73 20 69 73 20 70 6f 73 s much as is pos
26d0: 73 69 62 6c 65 2e 0a 0a 09 20 20 20 20 74 72 6f sible.... tro
26e0: 75 62 6c 65 3a 3a 61 64 64 20 22 24 66 3a 20 43 uble::add "$f: C
26f0: 6f 72 72 75 70 74 65 64 20 61 72 63 68 69 76 65 orrupted archive
2700: 20 66 69 6c 65 2e 20 49 6e 61 63 63 65 73 73 69 file. Inaccessi
2710: 62 6c 65 20 72 65 76 69 73 69 6f 6e 20 24 72 2e ble revision $r.
2720: 22 0a 09 20 20 20 20 72 65 74 75 72 6e 0a 09 7d ".. return..}
2730: 0a 09 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 65 ..return -code e
2740: 72 72 6f 72 20 24 6d 73 67 0a 20 20 20 20 7d 0a rror $msg. }.
2750: 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 return.}..pr
2760: 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 oc ::vc::cvs::ws
2770: 3a 3a 52 65 6d 6f 76 65 20 7b 66 20 72 7d 20 7b ::Remove {f r} {
2780: 0a 20 20 20 20 23 20 52 65 6d 6f 76 65 20 66 69 . # Remove fi
2790: 6c 65 20 66 72 6f 6d 20 77 6f 72 6b 73 70 61 63 le from workspac
27a0: 65 2e 20 50 72 75 6e 65 20 65 6d 70 74 79 20 64 e. Prune empty d
27b0: 69 72 65 63 74 6f 72 69 65 73 2e 0a 20 20 20 20 irectories..
27c0: 23 20 4e 4f 54 45 3a 20 41 20 64 65 61 64 2d 66 # NOTE: A dead-f
27d0: 69 72 73 74 20 66 69 6c 65 20 28 72 65 76 20 31 irst file (rev 1
27e0: 2e 31 20 64 65 61 64 29 20 77 69 6c 6c 20 6e 65 .1 dead) will ne
27f0: 76 65 72 20 68 61 76 65 20 65 78 69 73 74 65 64 ver have existed
2800: 2e 0a 0a 20 20 20 20 66 69 6c 65 20 64 65 6c 65 ... file dele
2810: 74 65 20 24 66 0a 20 20 20 20 50 72 75 6e 65 20 te $f. Prune
2820: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 66 [file dirname $f
2830: 5d 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a ]. return.}..
2840: 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a proc ::vc::cvs::
2850: 77 73 3a 3a 50 72 75 6e 65 20 7b 70 61 74 68 7d ws::Prune {path}
2860: 20 7b 0a 20 20 20 20 23 20 4e 4f 54 45 3a 20 4c {. # NOTE: L
2870: 6f 67 69 63 61 6c 6c 79 20 65 6d 70 74 79 20 64 ogically empty d
2880: 69 72 65 63 74 6f 72 69 65 73 20 73 74 69 6c 6c irectories still
2890: 20 70 68 79 73 69 63 61 6c 6c 79 20 63 6f 6e 74 physically cont
28a0: 61 69 6e 20 74 68 65 0a 20 20 20 20 23 20 43 56 ain the. # CV
28b0: 53 20 61 64 6d 69 6e 20 64 69 72 65 63 74 6f 72 S admin director
28c0: 79 2c 20 68 65 6e 63 65 20 74 68 65 20 63 68 65 y, hence the che
28d0: 63 6b 20 66 6f 72 20 3d 3d 20 31 2c 20 6e 6f 74 ck for == 1, not
28e0: 20 3d 3d 20 30 2e 20 54 68 65 72 65 0a 20 20 20 == 0. There.
28f0: 20 23 20 6d 69 67 68 74 20 61 6c 73 6f 20 62 65 # might also be
2900: 20 68 69 64 64 65 6e 20 66 69 6c 65 73 2c 20 77 hidden files, w
2910: 65 20 63 6f 75 6e 74 20 74 68 65 6d 20 61 73 20 e count them as
2920: 77 65 6c 6c 2e 20 41 6c 77 61 79 73 20 68 69 64 well. Always hid
2930: 64 65 6e 0a 20 20 20 20 23 20 61 72 65 20 2e 20 den. # are .
2940: 61 6e 64 20 2e 2e 20 61 6e 64 20 74 68 65 79 20 and .. and they
2950: 64 6f 20 6e 6f 74 20 63 6f 75 6e 74 20 61 73 20 do not count as
2960: 75 73 65 72 20 66 69 6c 65 2e 0a 0a 20 20 20 20 user file...
2970: 69 66 20 7b 0a 09 28 5b 6c 6c 65 6e 67 74 68 20 if {..([llength
2980: 5b 67 6c 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61 69 [glob -nocomplai
2990: 6e 20 2d 64 69 72 65 63 74 6f 72 79 20 20 20 20 n -directory
29a0: 20 20 20 20 20 20 20 20 20 20 24 70 61 74 68 20 $path
29b0: 2a 5d 5d 20 3d 3d 20 31 29 20 26 26 0a 09 28 5b *]] == 1) &&..([
29c0: 6c 6c 65 6e 67 74 68 20 5b 67 6c 6f 62 20 2d 6e llength [glob -n
29d0: 6f 63 6f 6d 70 6c 61 69 6e 20 2d 64 69 72 65 63 ocomplain -direc
29e0: 74 6f 72 79 20 2d 74 79 70 65 20 68 69 64 64 65 tory -type hidde
29f0: 6e 20 24 70 61 74 68 20 2a 5d 5d 20 3d 3d 20 32 n $path *]] == 2
2a00: 29 0a 20 20 20 20 7d 20 7b 0a 09 66 69 6c 65 20 ). } {..file
2a10: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 70 delete -force $p
2a20: 61 74 68 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 ath. }. re
2a30: 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 turn.}..proc ::v
2a40: 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 4e 53 49 50 c::cvs::ws::NSIP
2a50: 4c 20 7b 6e 20 73 69 6e 67 75 6c 61 72 20 7b 70 L {n singular {p
2a60: 6c 75 72 61 6c 20 7b 7d 7d 7d 20 7b 0a 20 20 20 lural {}}} {.
2a70: 20 72 65 74 75 72 6e 20 22 24 6e 20 5b 53 49 50 return "$n [SIP
2a80: 4c 20 24 6e 20 24 73 69 6e 67 75 6c 61 72 20 24 L $n $singular $
2a90: 70 6c 75 72 61 6c 5d 22 0a 7d 0a 70 72 6f 63 20 plural]".}.proc
2aa0: 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 53 ::vc::cvs::ws::S
2ab0: 49 50 4c 20 7b 6e 20 73 69 6e 67 75 6c 61 72 20 IPL {n singular
2ac0: 7b 70 6c 75 72 61 6c 20 7b 7d 7d 7d 20 7b 0a 20 {plural {}}} {.
2ad0: 20 20 20 69 66 20 7b 24 6e 20 3d 3d 20 31 7d 20 if {$n == 1}
2ae0: 7b 72 65 74 75 72 6e 20 24 73 69 6e 67 75 6c 61 {return $singula
2af0: 72 7d 0a 20 20 20 20 69 66 20 7b 24 70 6c 75 72 r}. if {$plur
2b00: 61 6c 20 65 71 20 22 22 7d 20 7b 73 65 74 20 70 al eq ""} {set p
2b10: 6c 75 72 61 6c 20 24 7b 73 69 6e 67 75 6c 61 72 lural ${singular
2b20: 7d 73 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 24 }s}. return $
2b30: 70 6c 75 72 61 6c 0a 7d 0a 0a 23 20 2d 2d 2d 2d plural.}..# ----
2b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2b80: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 6e 61 6d 65 73 ---------..names
2b90: 70 61 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a pace eval ::vc::
2ba0: 63 76 73 3a 3a 77 73 20 7b 0a 20 20 20 20 76 61 cvs::ws {. va
2bb0: 72 69 61 62 6c 65 20 62 61 73 65 20 20 20 20 20 riable base
2bc0: 20 7b 7d 20 3b 20 23 20 54 6f 70 6c 65 76 65 6c {} ; # Toplevel
2bd0: 20 72 65 70 6f 73 69 74 6f 72 79 20 64 69 72 65 repository dire
2be0: 63 74 6f 72 79 0a 20 20 20 20 76 61 72 69 61 62 ctory. variab
2bf0: 6c 65 20 70 72 6f 6a 65 63 74 20 20 20 7b 7d 20 le project {}
2c00: 3b 20 23 20 53 75 62 20 64 69 72 65 63 74 6f 72 ; # Sub director
2c10: 79 20 74 6f 20 6c 69 6d 69 74 20 74 68 65 20 69 y to limit the i
2c20: 6d 70 6f 72 74 20 74 6f 2e 0a 20 20 20 20 76 61 mport to.. va
2c30: 72 69 61 62 6c 65 20 77 6f 72 6b 73 70 61 63 65 riable workspace
2c40: 20 7b 7d 20 3b 20 23 20 44 69 72 65 63 74 6f 72 {} ; # Director
2c50: 79 20 74 6f 20 63 68 65 63 6b 6f 75 74 20 63 68 y to checkout ch
2c60: 61 6e 67 65 73 65 74 73 20 74 6f 2e 0a 0a 20 20 angesets to...
2c70: 20 20 6e 61 6d 65 73 70 61 63 65 20 65 78 70 6f namespace expo
2c80: 72 74 20 63 6f 6e 66 69 67 75 72 65 20 62 65 67 rt configure beg
2c90: 69 6e 20 64 6f 6e 65 20 66 6f 72 65 61 63 68 20 in done foreach
2ca0: 6e 63 73 65 74 73 20 63 68 65 63 6b 6f 75 74 0a ncsets checkout.
2cb0: 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d }..# -----------
2cc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2cd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ce0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2cf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2d00: 2d 2d 0a 23 20 52 65 61 64 79 0a 0a 70 61 63 6b --.# Ready..pack
2d10: 61 67 65 20 70 72 6f 76 69 64 65 20 76 63 3a 3a age provide vc::
2d20: 63 76 73 3a 3a 77 73 20 31 2e 30 0a 72 65 74 75 cvs::ws 1.0.retu
2d30: 72 6e 0a rn.