Artifact e89af18f22368490e391524a5821c8febaf68078:
File
tools/lib/cvs.tcl
part of check-in
[8469631cc9]
- Extended import app with switch to stop execution just before a specific changeset, to aid in debugging problems.
by
aku on
2007-09-08 03:48:40.
0000: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d # --------------
0010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a ---------------.
0050: 23 20 52 65 70 6f 73 69 74 6f 72 79 20 6d 61 6e # Repository man
0060: 61 67 65 6d 65 6e 74 20 28 43 56 53 29 0a 0a 23 agement (CVS)..#
0070: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ---------------
0080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
00a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
00b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 --------------.#
00c0: 20 52 65 71 75 69 72 65 6d 65 6e 74 73 0a 0a 70 Requirements..p
00d0: 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 54 ackage require T
00e0: 63 6c 20 38 2e 34 0a 70 61 63 6b 61 67 65 20 72 cl 8.4.package r
00f0: 65 71 75 69 72 65 20 66 69 6c 65 75 74 69 6c 20 equire fileutil
0100: 20 3b 20 23 20 54 63 6c 6c 69 62 20 28 63 61 74 ; # Tcllib (cat
0110: 29 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 ).package requir
0120: 65 20 72 63 73 70 61 72 73 65 72 20 3b 20 23 20 e rcsparser ; #
0130: 48 61 6e 64 6c 69 6e 67 20 74 68 65 20 52 43 53 Handling the RCS
0140: 20 61 72 63 68 69 76 65 20 66 69 6c 65 73 2e 0a archive files..
0150: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 package require
0160: 73 74 72 75 63 74 3a 3a 74 72 65 65 0a 0a 6e 61 struct::tree..na
0170: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 63 mespace eval ::c
0180: 76 73 20 7b 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d vs {}..# -------
0190: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
01a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
01b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
01c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
01d0: 2d 2d 2d 2d 2d 2d 0a 23 20 41 50 49 0a 0a 23 20 ------.# API..#
01e0: 44 65 66 69 6e 65 20 72 65 70 6f 73 69 74 6f 72 Define repositor
01f0: 79 20 64 69 72 65 63 74 6f 72 79 2e 0a 0a 70 72 y directory...pr
0200: 6f 63 20 3a 3a 63 76 73 3a 3a 61 74 20 7b 70 61 oc ::cvs::at {pa
0210: 74 68 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62 th} {. variab
0220: 6c 65 20 62 61 73 65 20 5b 66 69 6c 65 20 6e 6f le base [file no
0230: 72 6d 61 6c 69 7a 65 20 24 70 61 74 68 5d 0a 20 rmalize $path].
0240: 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 6e 61 6d return.}..nam
0250: 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 63 76 espace eval ::cv
0260: 73 20 7b 0a 20 20 20 20 23 20 54 6f 70 6c 65 76 s {. # Toplev
0270: 65 6c 20 72 65 70 6f 73 69 74 6f 72 79 20 64 69 el repository di
0280: 72 65 63 74 6f 72 79 0a 20 20 20 20 76 61 72 69 rectory. vari
0290: 61 62 6c 65 20 62 61 73 65 20 7b 7d 0a 7d 0a 0a able base {}.}..
02a0: 23 20 44 65 66 69 6e 65 20 6c 6f 67 67 69 6e 67 # Define logging
02b0: 20 63 61 6c 6c 62 61 63 6b 20 63 6f 6d 6d 61 6e callback comman
02c0: 64 0a 0a 70 72 6f 63 20 3a 3a 63 76 73 3a 3a 66 d..proc ::cvs::f
02d0: 65 65 64 62 61 63 6b 20 7b 6c 6f 67 63 6d 64 7d eedback {logcmd}
02e0: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 {. variable
02f0: 6c 63 20 24 6c 6f 67 63 6d 64 0a 20 20 20 20 3a lc $logcmd. :
0300: 3a 72 63 73 70 61 72 73 65 72 3a 3a 66 65 65 64 :rcsparser::feed
0310: 62 61 63 6b 20 24 6c 6f 67 63 6d 64 0a 20 20 20 back $logcmd.
0320: 20 72 65 74 75 72 6e 0a 7d 0a 0a 23 20 53 63 61 return.}..# Sca
0330: 6e 20 72 65 70 6f 73 69 74 6f 72 79 2c 20 63 6f n repository, co
0340: 6c 6c 65 63 74 20 61 72 63 68 69 76 65 73 2c 20 llect archives,
0350: 70 61 72 73 65 20 74 68 65 6d 2c 20 61 6e 64 20 parse them, and
0360: 63 6f 6c 6c 65 63 74 20 72 65 76 69 73 69 6f 6e collect revision
0370: 0a 23 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 28 .# information (
0380: 66 69 6c 65 2c 20 72 65 76 69 73 69 6f 6e 20 2d file, revision -
0390: 3e 20 64 61 74 65 2c 20 61 75 74 68 6f 72 2c 20 > date, author,
03a0: 63 6f 6d 6d 69 74 20 6d 65 73 73 61 67 65 29 0a commit message).
03b0: 0a 70 72 6f 63 20 3a 3a 63 76 73 3a 3a 73 63 61 .proc ::cvs::sca
03c0: 6e 20 7b 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 n {} {. varia
03d0: 62 6c 65 20 62 61 73 65 0a 20 20 20 20 76 61 72 ble base. var
03e0: 69 61 62 6c 65 20 6e 70 61 74 68 73 0a 20 20 20 iable npaths.
03f0: 20 76 61 72 69 61 62 6c 65 20 72 70 61 74 68 73 variable rpaths
0400: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 74 69 . variable ti
0410: 6d 65 6c 69 6e 65 0a 0a 20 20 20 20 4c 6f 67 20 meline.. Log
0420: 69 6e 66 6f 20 22 53 63 61 6e 6e 69 6e 67 20 43 info "Scanning C
0430: 56 53 20 74 72 65 65 20 24 62 61 73 65 22 0a 0a VS tree $base"..
0440: 20 20 20 20 73 65 74 20 6e 20 30 0a 20 20 20 20 set n 0.
0450: 66 6f 72 65 61 63 68 20 72 63 73 20 5b 66 69 6c foreach rcs [fil
0460: 65 75 74 69 6c 3a 3a 66 69 6e 64 42 79 50 61 74 eutil::findByPat
0470: 74 65 72 6e 20 24 62 61 73 65 20 2d 67 6c 6f 62 tern $base -glob
0480: 20 2a 2c 76 5d 20 7b 0a 09 73 65 74 20 72 63 73 *,v] {..set rcs
0490: 20 5b 66 69 6c 65 75 74 69 6c 3a 3a 73 74 72 69 [fileutil::stri
04a0: 70 50 61 74 68 20 24 62 61 73 65 20 24 72 63 73 pPath $base $rcs
04b0: 5d 0a 09 23 20 4e 6f 77 20 72 63 73 20 69 73 20 ]..# Now rcs is
04c0: 72 65 6c 61 74 69 76 65 20 74 6f 20 62 61 73 65 relative to base
04d0: 0a 0a 09 4c 6f 67 20 69 6e 66 6f 20 22 20 20 20 ...Log info "
04e0: 20 50 61 72 73 69 6e 67 20 61 72 63 68 69 76 65 Parsing archive
04f0: 20 24 72 63 73 22 0a 0a 09 69 66 20 7b 5b 73 74 $rcs"...if {[st
0500: 72 69 6e 67 20 6d 61 74 63 68 20 43 56 53 52 4f ring match CVSRO
0510: 4f 54 2a 20 24 72 63 73 5d 7d 20 7b 0a 09 20 20 OT* $rcs]} {..
0520: 20 20 4c 6f 67 20 69 6e 66 6f 20 22 20 20 20 20 Log info "
0530: 20 20 20 20 20 20 20 20 20 20 20 20 20 3d 3e 20 =>
0540: 49 67 6e 6f 72 69 6e 67 20 61 64 6d 69 6e 20 66 Ignoring admin f
0550: 69 6c 65 22 0a 09 20 20 20 20 63 6f 6e 74 69 6e ile".. contin
0560: 75 65 0a 09 7d 0a 0a 09 23 20 44 65 72 69 76 65 ue..}...# Derive
0570: 20 74 68 65 20 72 65 67 75 6c 61 72 20 70 61 74 the regular pat
0580: 68 20 66 72 6f 6d 20 74 68 65 20 72 63 73 20 70 h from the rcs p
0590: 61 74 68 2e 20 4d 65 61 6e 69 6e 67 3a 20 43 68 ath. Meaning: Ch
05a0: 6f 70 20 6f 66 0a 09 23 20 74 68 65 20 22 2c 76 op of..# the ",v
05b0: 22 20 73 75 66 66 69 78 2c 20 61 6e 64 20 72 65 " suffix, and re
05c0: 6d 6f 76 65 20 61 20 70 6f 73 73 69 62 6c 65 20 move a possible
05d0: 22 41 74 74 69 63 22 2e 0a 09 73 65 74 20 66 20 "Attic"...set f
05e0: 5b 73 74 72 69 6e 67 20 72 61 6e 67 65 20 24 72 [string range $r
05f0: 63 73 20 30 20 65 6e 64 2d 32 5d 0a 09 69 66 20 cs 0 end-2]..if
0600: 7b 22 41 74 74 69 63 22 20 65 71 20 5b 6c 69 6e {"Attic" eq [lin
0610: 64 65 78 20 5b 66 69 6c 65 20 73 70 6c 69 74 20 dex [file split
0620: 24 72 63 73 5d 20 65 6e 64 2d 31 5d 7d 20 7b 0a $rcs] end-1]} {.
0630: 09 20 20 20 20 73 65 74 20 66 20 5b 66 69 6c 65 . set f [file
0640: 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64 69 72 6e join [file dirn
0650: 61 6d 65 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d ame [file dirnam
0660: 65 20 24 66 5d 5d 20 5b 66 69 6c 65 20 74 61 69 e $f]] [file tai
0670: 6c 20 24 66 5d 5d 0a 09 20 20 20 20 69 66 20 7b l $f]].. if {
0680: 5b 66 69 6c 65 20 65 78 69 73 74 73 20 24 62 61 [file exists $ba
0690: 73 65 2f 24 66 2c 76 5d 7d 20 7b 0a 09 09 23 20 se/$f,v]} {...#
06a0: 57 65 20 68 61 76 65 20 61 20 72 65 67 75 6c 61 We have a regula
06b0: 72 20 61 72 63 68 69 76 65 20 61 6e 64 20 61 6e r archive and an
06c0: 20 41 74 74 69 63 20 61 72 63 68 69 76 65 0a 09 Attic archive..
06d0: 09 23 20 72 65 66 65 72 69 6e 67 20 74 6f 20 74 .# refering to t
06e0: 68 65 20 73 61 6d 65 20 75 73 65 72 20 76 69 73 he same user vis
06f0: 69 62 6c 65 20 66 69 6c 65 2e 20 49 67 6e 6f 72 ible file. Ignor
0700: 65 20 74 68 65 0a 09 09 23 20 66 69 6c 65 20 69 e the...# file i
0710: 6e 20 74 68 65 20 41 74 74 69 63 2e 0a 09 09 4c n the Attic....L
0720: 6f 67 20 69 6e 66 6f 20 22 20 20 20 20 20 20 20 og info "
0730: 20 20 20 20 20 20 20 20 20 20 3d 3e 20 49 67 6e => Ign
0740: 6f 72 69 6e 67 20 61 74 74 69 63 20 66 6f 72 20 oring attic for
0750: 72 65 67 75 6c 61 72 20 61 72 63 68 69 76 65 22 regular archive"
0760: 0a 0a 09 09 23 20 54 4f 44 4f 2f 43 48 45 43 4b ....# TODO/CHECK
0770: 2e 20 4d 79 20 6d 65 74 68 6f 64 20 6f 66 20 63 . My method of c
0780: 6f 27 69 6e 67 20 65 78 61 63 74 20 66 69 6c 65 o'ing exact file
0790: 20 72 65 76 69 73 69 6f 6e 73 0a 09 09 23 20 70 revisions...# p
07a0: 65 72 20 74 68 65 20 69 6e 66 6f 20 69 6e 20 74 er the info in t
07b0: 68 65 20 63 6f 6c 6c 65 63 74 65 64 20 63 73 65 he collected cse
07c0: 74 73 20 68 61 73 20 74 68 65 20 66 6c 61 77 0a ts has the flaw.
07d0: 09 09 23 20 74 68 61 74 20 49 20 6d 61 79 20 68 ..# that I may h
07e0: 61 76 65 20 74 6f 20 6b 6e 6f 77 20 65 78 61 63 ave to know exac
07f0: 74 6c 79 20 77 68 65 6e 20 77 68 61 74 20 61 72 tly when what ar
0800: 63 68 69 76 65 0a 09 09 23 20 66 69 6c 65 20 74 chive...# file t
0810: 6f 20 75 73 65 2c 20 73 65 65 20 61 62 6f 76 65 o use, see above
0820: 2e 20 49 74 20 6d 69 67 68 74 20 62 65 20 62 65 . It might be be
0830: 74 74 65 72 20 74 6f 20 75 73 65 0a 09 09 23 20 tter to use...#
0840: 74 68 65 20 69 6e 66 6f 20 6f 6e 6c 79 20 74 6f the info only to
0850: 20 67 61 74 68 65 72 20 77 68 65 6e 20 63 73 65 gather when cse
0860: 74 73 20 62 65 67 69 6e 20 61 6e 64 20 65 6e 64 ts begin and end
0870: 2c 0a 09 09 23 20 61 6e 64 20 74 68 65 6e 20 74 ,...# and then t
0880: 6f 20 63 6f 20 63 6f 6d 70 6c 65 74 65 20 73 6c o co complete sl
0890: 69 63 65 73 20 70 65 72 20 65 78 61 63 74 20 74 ices per exact t
08a0: 69 6d 65 73 74 61 6d 70 0a 09 09 23 20 28 2d 44 imestamp...# (-D
08b0: 29 20 69 6e 73 74 65 61 64 20 6f 66 20 66 69 6c ) instead of fil
08c0: 65 20 72 65 76 69 73 69 6f 6e 73 20 28 2d 72 29 e revisions (-r)
08d0: 2e 20 54 68 65 20 66 6c 61 77 20 69 6e 0a 09 09 . The flaw in...
08e0: 23 20 74 68 61 74 20 69 73 20 74 68 61 74 20 63 # that is that c
08f0: 73 65 74 73 20 63 61 6e 20 6f 63 63 75 72 20 69 sets can occur i
0900: 6e 20 74 68 65 20 73 61 6d 65 20 73 65 63 6f 6e n the same secon
0910: 64 0a 09 09 23 20 28 74 72 66 2c 20 6d 65 6d 63 d...# (trf, memc
0920: 68 61 6e 20 2d 20 63 68 65 63 6b 20 66 6f 72 20 han - check for
0930: 65 78 61 6d 70 6c 65 73 29 2e 20 46 6f 72 20 74 examples). For t
0940: 68 61 74 20 65 78 61 63 74 0a 09 09 23 20 63 68 hat exact...# ch
0950: 65 63 6b 6f 75 74 20 6d 61 79 20 62 65 20 6e 65 eckout may be ne
0960: 65 64 65 64 20 74 6f 20 72 65 63 72 65 61 74 65 eded to recreate
0970: 20 65 78 61 63 74 20 73 65 71 75 65 6e 63 65 20 exact sequence
0980: 6f 66 0a 09 09 23 20 63 68 61 6e 67 65 73 2e 20 of...# changes.
0990: 47 72 72 2e 20 53 69 78 20 6f 66 20 6f 6e 65 20 Grr. Six of one
09a0: 2e 2e 2e 0a 0a 09 09 63 6f 6e 74 69 6e 75 65 0a .......continue.
09b0: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 23 20 47 65 . }..}...# Ge
09c0: 74 20 74 68 65 20 6d 65 74 61 20 64 61 74 61 20 t the meta data
09d0: 77 65 20 6e 65 65 64 20 28 72 65 76 69 73 69 6f we need (revisio
09e0: 6e 73 2c 20 74 69 6d 65 6c 69 6e 65 2c 20 6d 65 ns, timeline, me
09f0: 73 73 61 67 65 73 29 2e 0a 09 73 65 74 20 6d 65 ssages)...set me
0a00: 74 61 20 5b 3a 3a 72 63 73 70 61 72 73 65 72 3a ta [::rcsparser:
0a10: 3a 70 72 6f 63 65 73 73 20 24 62 61 73 65 2f 24 :process $base/$
0a20: 72 63 73 5d 0a 0a 09 4c 6f 67 20 69 6e 66 6f 20 rcs]...Log info
0a30: 22 20 20 20 20 20 20 20 20 20 3d 3e 20 24 66 22 " => $f"
0a40: 0a 0a 09 73 65 74 20 6e 70 61 74 68 73 28 24 72 ...set npaths($r
0a50: 63 73 29 20 24 66 0a 09 73 65 74 20 72 70 61 74 cs) $f..set rpat
0a60: 68 73 28 24 66 29 20 24 72 63 73 0a 0a 09 61 72 hs($f) $rcs...ar
0a70: 72 61 79 20 73 65 74 20 70 20 24 6d 65 74 61 0a ray set p $meta.
0a80: 0a 09 66 6f 72 65 61 63 68 20 7b 72 65 76 20 74 ..foreach {rev t
0a90: 73 7d 20 24 70 28 64 61 74 65 29 20 7b 5f 20 61 s} $p(date) {_ a
0aa0: 7d 20 24 70 28 61 75 74 68 6f 72 29 20 7b 5f 20 } $p(author) {_
0ab0: 63 6d 7d 20 24 70 28 63 6f 6d 6d 69 74 29 20 7b cm} $p(commit) {
0ac0: 5f 20 73 74 7d 20 24 70 28 73 74 61 74 65 29 20 _ st} $p(state)
0ad0: 7b 0a 09 20 20 20 20 73 65 74 20 6f 70 20 5b 65 {.. set op [e
0ae0: 78 70 72 20 7b 28 24 72 65 76 20 65 71 20 22 31 xpr {($rev eq "1
0af0: 2e 31 22 29 20 3f 20 22 41 22 20 3a 20 22 4d 22 .1") ? "A" : "M"
0b00: 7d 5d 0a 09 20 20 20 20 69 66 20 7b 24 73 74 20 }].. if {$st
0b10: 65 71 20 22 64 65 61 64 22 7d 20 7b 73 65 74 20 eq "dead"} {set
0b20: 6f 70 20 22 52 22 7d 0a 0a 09 20 20 20 20 23 20 op "R"}... #
0b30: 41 20 64 65 61 64 2d 66 69 72 73 74 20 72 65 76 A dead-first rev
0b40: 69 73 69 6f 6e 20 69 73 20 72 65 76 20 31 2e 31 ision is rev 1.1
0b50: 20 77 69 74 68 20 6f 70 20 52 2e 20 46 6f 72 20 with op R. For
0b60: 61 6e 0a 09 20 20 20 20 23 20 65 78 61 6d 70 6c an.. # exampl
0b70: 65 20 73 65 65 20 74 68 65 20 66 69 6c 65 20 6d e see the file m
0b80: 65 6d 63 68 61 6e 2f 44 45 50 45 4e 44 45 4e 43 emchan/DEPENDENC
0b90: 49 45 53 2e 20 53 75 63 68 20 61 20 66 69 6c 65 IES. Such a file
0ba0: 0a 09 20 20 20 20 23 20 73 65 65 6d 73 20 74 6f .. # seems to
0bb0: 20 65 78 69 73 74 20 6f 6e 6c 79 21 20 6f 6e 20 exist only! on
0bc0: 69 74 73 20 62 72 61 6e 63 68 2e 20 54 68 65 20 its branch. The
0bd0: 62 72 61 6e 63 68 65 73 0a 09 20 20 20 20 23 20 branches.. #
0be0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 73 information is s
0bf0: 65 74 20 6f 6e 20 74 68 65 20 72 65 76 69 73 69 et on the revisi
0c00: 6f 6e 20 28 65 78 74 65 6e 64 20 72 63 73 70 61 on (extend rcspa
0c10: 72 73 65 72 21 29 2c 0a 09 20 20 20 20 23 20 73 rser!),.. # s
0c20: 79 6d 62 6f 6c 73 20 68 61 73 20 61 20 74 61 67 ymbols has a tag
0c30: 2c 20 72 65 66 65 72 69 6e 67 20 74 6f 20 61 20 , refering to a
0c40: 62 72 61 6e 63 68 2c 20 70 6f 73 73 69 62 6c 79 branch, possibly
0c50: 20 6d 61 67 69 63 2e 0a 0a 09 20 20 20 20 69 66 magic.... if
0c60: 20 7b 28 24 72 65 76 20 65 71 20 22 31 2e 31 22 {($rev eq "1.1"
0c70: 29 20 26 26 20 28 24 6f 70 20 65 71 20 22 52 22 ) && ($op eq "R"
0c80: 29 7d 20 7b 0a 09 09 4c 6f 67 20 69 6e 66 6f 20 )} {...Log info
0c90: 22 20 20 20 20 20 20 20 20 20 3d 3e 20 44 65 61 " => Dea
0ca0: 64 20 66 69 72 73 74 22 0a 09 20 20 20 20 7d 0a d first".. }.
0cb0: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 74 69 .. lappend ti
0cc0: 6d 65 6c 69 6e 65 28 24 74 73 29 20 5b 6c 69 73 meline($ts) [lis
0cd0: 74 20 24 6f 70 20 24 74 73 20 24 61 20 24 72 65 t $op $ts $a $re
0ce0: 76 20 24 66 20 24 63 6d 5d 0a 09 7d 0a 0a 09 23 v $f $cm]..}...#
0cf0: 75 6e 73 65 74 20 70 28 63 6f 6d 6d 69 74 29 0a unset p(commit).
0d00: 09 23 70 61 72 72 61 79 20 70 0a 0a 09 69 6e 63 .#parray p...inc
0d10: 72 20 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 4c r n. }.. L
0d20: 6f 67 20 69 6e 66 6f 20 22 50 72 6f 63 65 73 73 og info "Process
0d30: 65 64 20 24 6e 20 5b 65 78 70 72 20 7b 28 24 6e ed $n [expr {($n
0d40: 20 3d 3d 20 31 29 20 3f 20 22 66 69 6c 65 22 20 == 1) ? "file"
0d50: 3a 20 22 66 69 6c 65 73 22 7d 5d 22 0a 20 20 20 : "files"}]".
0d60: 20 72 65 74 75 72 6e 0a 7d 0a 0a 6e 61 6d 65 73 return.}..names
0d70: 70 61 63 65 20 65 76 61 6c 20 3a 3a 63 76 73 20 pace eval ::cvs
0d80: 7b 0a 20 20 20 20 23 20 50 61 74 68 20 6d 61 70 {. # Path map
0d90: 70 69 6e 67 73 2e 20 6e 70 61 74 68 73 3a 20 72 pings. npaths: r
0da0: 63 73 20 66 69 6c 65 20 20 2d 3e 20 75 73 65 72 cs file -> user
0db0: 20 66 69 6c 65 0a 20 20 20 20 23 20 20 20 20 20 file. #
0dc0: 20 20 20 20 20 20 20 20 20 20 20 72 70 61 74 68 rpath
0dd0: 73 3a 20 75 73 65 72 20 66 69 6c 65 20 2d 3e 20 s: user file ->
0de0: 72 63 73 20 66 69 6c 65 2c 20 64 65 61 64 2d 73 rcs file, dead-s
0df0: 74 61 74 75 73 0a 0a 20 20 20 20 76 61 72 69 61 tatus.. varia
0e00: 62 6c 65 20 6e 70 61 74 68 73 20 20 20 3b 20 61 ble npaths ; a
0e10: 72 72 61 79 20 73 65 74 20 6e 70 61 74 68 73 20 rray set npaths
0e20: 20 20 7b 7d 0a 20 20 20 20 76 61 72 69 61 62 6c {}. variabl
0e30: 65 20 72 70 61 74 68 73 20 20 20 3b 20 61 72 72 e rpaths ; arr
0e40: 61 79 20 73 65 74 20 72 70 61 74 68 73 20 20 20 ay set rpaths
0e50: 7b 7d 0a 0a 20 20 20 20 23 20 54 69 6d 65 6c 69 {}.. # Timeli
0e60: 6e 65 3a 20 74 73 74 61 6d 70 20 2d 3e 20 28 6f ne: tstamp -> (o
0e70: 70 2c 20 74 73 74 61 6d 70 2c 20 61 75 74 68 6f p, tstamp, autho
0e80: 72 2c 20 72 65 76 69 73 69 6f 6e 2c 20 66 69 6c r, revision, fil
0e90: 65 2c 20 63 6f 6d 6d 69 74 20 6d 65 73 73 61 67 e, commit messag
0ea0: 65 29 0a 0a 20 20 20 20 76 61 72 69 61 62 6c 65 e).. variable
0eb0: 20 74 69 6d 65 6c 69 6e 65 20 3b 20 61 72 72 61 timeline ; arra
0ec0: 79 20 73 65 74 20 74 69 6d 65 6c 69 6e 65 20 7b y set timeline {
0ed0: 7d 0a 7d 0a 0a 23 20 47 72 6f 75 70 20 73 69 6e }.}..# Group sin
0ee0: 67 6c 65 20 63 68 61 6e 67 65 73 20 69 6e 74 6f gle changes into
0ef0: 20 63 68 61 6e 67 65 73 65 74 73 0a 0a 70 72 6f changesets..pro
0f00: 63 20 3a 3a 63 76 73 3a 3a 63 73 65 74 73 20 7b c ::cvs::csets {
0f10: 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 } {. variable
0f20: 20 74 69 6d 65 6c 69 6e 65 0a 20 20 20 20 76 61 timeline. va
0f30: 72 69 61 62 6c 65 20 63 73 65 74 73 0a 20 20 20 riable csets.
0f40: 20 76 61 72 69 61 62 6c 65 20 6e 63 73 0a 20 20 variable ncs.
0f50: 20 20 76 61 72 69 61 62 6c 65 20 63 6d 61 70 0a variable cmap.
0f60: 0a 20 20 20 20 61 72 72 61 79 20 75 6e 73 65 74 . array unset
0f70: 20 63 73 65 74 73 20 2a 20 3b 20 61 72 72 61 79 csets * ; array
0f80: 20 73 65 74 20 63 73 65 74 73 20 7b 7d 0a 20 20 set csets {}.
0f90: 20 20 61 72 72 61 79 20 75 6e 73 65 74 20 63 6d array unset cm
0fa0: 61 70 20 20 2a 20 3b 20 61 72 72 61 79 20 73 65 ap * ; array se
0fb0: 74 20 63 6d 61 70 20 20 7b 7d 0a 20 20 20 20 73 t cmap {}. s
0fc0: 65 74 20 6e 63 73 20 30 0a 0a 20 20 20 20 4c 6f et ncs 0.. Lo
0fd0: 67 20 69 6e 66 6f 20 22 50 72 6f 63 65 73 73 69 g info "Processi
0fe0: 6e 67 20 74 69 6d 65 6c 69 6e 65 22 0a 0a 20 20 ng timeline"..
0ff0: 20 20 73 65 74 20 6e 20 30 0a 20 20 20 20 43 53 set n 0. CS
1000: 43 6c 65 61 72 0a 20 20 20 20 66 6f 72 65 61 63 Clear. foreac
1010: 68 20 74 73 20 5b 6c 73 6f 72 74 20 2d 64 69 63 h ts [lsort -dic
1020: 74 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 74 t [array names t
1030: 69 6d 65 6c 69 6e 65 5d 5d 20 7b 0a 0a 09 23 20 imeline]] {...#
1040: 6f 70 20 74 73 74 61 6d 70 20 61 75 74 68 6f 72 op tstamp author
1050: 20 72 65 76 69 73 69 6f 6e 20 66 69 6c 65 20 63 revision file c
1060: 6f 6d 6d 69 74 0a 09 23 20 30 20 20 31 20 20 20 ommit..# 0 1
1070: 20 20 20 32 20 20 20 20 20 20 33 20 20 20 20 20 2 3
1080: 20 20 20 34 20 20 20 20 35 2f 65 6e 64 0a 09 23 4 5/end..#
1090: 20 62 20 20 20 20 20 20 20 20 20 63 20 20 20 20 b c
10a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
10b0: 61 0a 0a 09 73 65 74 20 65 6e 74 72 69 65 73 20 a...set entries
10c0: 5b 6c 73 6f 72 74 20 2d 69 6e 64 65 78 20 32 20 [lsort -index 2
10d0: 5b 6c 73 6f 72 74 20 2d 69 6e 64 65 78 20 30 20 [lsort -index 0
10e0: 5b 6c 73 6f 72 74 20 2d 69 6e 64 65 78 20 65 6e [lsort -index en
10f0: 64 20 24 74 69 6d 65 6c 69 6e 65 28 24 74 73 29 d $timeline($ts)
1100: 5d 5d 5d 0a 09 23 70 75 74 73 20 5b 6a 6f 69 6e ]]]..#puts [join
1110: 20 24 65 6e 74 72 69 65 73 20 5c 6e 5d 0a 0a 09 $entries \n]...
1120: 66 6f 72 65 61 63 68 20 65 6e 74 72 79 20 20 24 foreach entry $
1130: 65 6e 74 72 69 65 73 20 7b 0a 09 20 20 20 20 69 entries {.. i
1140: 66 20 7b 21 5b 43 53 4e 6f 6e 65 5d 20 26 26 20 f {![CSNone] &&
1150: 5b 43 53 4e 65 77 20 24 65 6e 74 72 79 5d 7d 20 [CSNew $entry]}
1160: 7b 0a 09 09 43 53 53 61 76 65 0a 09 09 43 53 43 {...CSSave...CSC
1170: 6c 65 61 72 0a 09 09 23 70 75 74 73 20 3d 3d 5c lear...#puts ==\
1180: 6e 24 72 65 61 73 6f 6e 0a 09 20 20 20 20 7d 0a n$reason.. }.
1190: 09 20 20 20 20 43 53 41 64 64 20 24 65 6e 74 72 . CSAdd $entr
11a0: 79 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d y.. incr n..}
11b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 4c 6f 67 20 . }.. Log
11c0: 69 6e 66 6f 20 22 50 72 6f 63 65 73 73 65 64 20 info "Processed
11d0: 24 6e 20 5b 65 78 70 72 20 7b 28 24 6e 20 3d 3d $n [expr {($n ==
11e0: 20 31 29 20 3f 20 22 65 6e 74 72 79 22 20 3a 20 1) ? "entry" :
11f0: 22 65 6e 74 72 69 65 73 22 7d 5d 22 0a 20 20 20 "entries"}]".
1200: 20 73 65 74 20 6e 20 5b 61 72 72 61 79 20 73 69 set n [array si
1210: 7a 65 20 63 73 65 74 73 5d 0a 20 20 20 20 4c 6f ze csets]. Lo
1220: 67 20 69 6e 66 6f 20 22 46 6f 75 6e 64 20 20 20 g info "Found
1230: 20 20 24 6e 20 5b 65 78 70 72 20 7b 28 24 6e 20 $n [expr {($n
1240: 3d 3d 20 31 29 20 3f 20 22 63 68 61 6e 67 65 73 == 1) ? "changes
1250: 65 74 22 20 3a 20 22 63 68 61 6e 67 65 73 65 74 et" : "changeset
1260: 73 22 7d 5d 22 0a 20 20 20 20 72 65 74 75 72 6e s"}]". return
1270: 0a 7d 0a 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65 .}...namespace e
1280: 76 61 6c 20 3a 3a 63 76 73 20 7b 0a 20 20 20 20 val ::cvs {.
1290: 23 20 43 68 61 6e 67 65 73 65 74 20 64 61 74 61 # Changeset data
12a0: 3a 0a 20 20 20 20 23 20 6e 63 73 3a 20 20 20 43 :. # ncs: C
12b0: 6f 75 6e 74 65 72 2d 62 61 73 65 64 20 69 64 20 ounter-based id
12c0: 67 65 6e 65 72 61 74 69 6f 6e 0a 20 20 20 20 23 generation. #
12d0: 20 63 73 65 74 73 3a 20 69 64 20 2d 3e 20 28 75 csets: id -> (u
12e0: 73 65 72 20 63 6f 6d 6d 69 74 20 73 74 61 72 74 ser commit start
12f0: 20 65 6e 64 20 64 65 70 74 68 20 28 66 69 6c 65 end depth (file
1300: 20 2d 3e 20 28 6f 70 20 72 65 76 29 29 29 0a 0a -> (op rev)))..
1310: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 63 73 variable ncs
1320: 20 20 20 20 20 20 3b 20 73 65 74 20 20 20 20 20 ; set
1330: 20 20 6e 63 73 20 20 20 30 20 20 3b 20 23 20 43 ncs 0 ; # C
1340: 6f 75 6e 74 65 72 20 66 6f 72 20 63 68 61 6e 67 ounter for chang
1350: 65 73 65 74 73 0a 20 20 20 20 76 61 72 69 61 62 esets. variab
1360: 6c 65 20 63 73 65 74 73 20 20 20 20 3b 20 61 72 le csets ; ar
1370: 72 61 79 20 73 65 74 20 63 73 65 74 73 20 7b 7d ray set csets {}
1380: 20 3b 20 23 20 43 68 61 6e 67 65 73 65 74 20 64 ; # Changeset d
1390: 61 74 61 0a 7d 0a 0a 23 20 42 75 69 6c 64 69 6e ata.}..# Buildin
13a0: 67 20 74 68 65 20 72 65 76 69 73 69 6f 6e 20 74 g the revision t
13b0: 72 65 65 20 66 72 6f 6d 20 74 68 65 20 63 68 61 ree from the cha
13c0: 6e 67 65 73 65 74 73 2e 0a 23 20 4c 69 6d 69 74 ngesets..# Limit
13d0: 61 74 69 6f 6e 3a 20 43 75 72 72 65 6e 74 6c 79 ation: Currently
13e0: 20 6f 6e 6c 79 20 74 72 75 6e 6b 20 63 73 65 74 only trunk cset
13f0: 73 20 69 73 20 68 61 6e 64 6c 65 64 2e 0a 23 20 s is handled..#
1400: 4c 69 6d 69 74 61 74 69 6f 6e 3a 20 44 65 61 64 Limitation: Dead
1410: 20 66 69 6c 65 73 20 61 72 65 20 6e 6f 74 20 72 files are not r
1420: 65 6d 6f 76 65 64 2c 20 69 2e 65 2e 20 6e 6f 20 emoved, i.e. no
1430: 27 52 27 20 61 63 74 69 6f 6e 73 20 72 69 67 68 'R' actions righ
1440: 74 20 6e 6f 77 2e 0a 0a 70 72 6f 63 20 3a 3a 63 t now...proc ::c
1450: 76 73 3a 3a 72 74 72 65 65 20 7b 7d 20 7b 0a 20 vs::rtree {} {.
1460: 20 20 20 76 61 72 69 61 62 6c 65 20 63 73 65 74 variable cset
1470: 73 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 72 s. variable r
1480: 74 72 65 65 20 7b 7d 0a 20 20 20 20 76 61 72 69 tree {}. vari
1490: 61 62 6c 65 20 6e 74 72 75 6e 6b 20 30 0a 0a 20 able ntrunk 0..
14a0: 20 20 20 4c 6f 67 20 69 6e 66 6f 20 22 45 78 74 Log info "Ext
14b0: 72 61 63 74 69 6e 67 20 74 68 65 20 74 72 75 6e racting the trun
14c0: 6b 22 0a 0a 20 20 20 20 73 65 74 20 72 74 72 65 k".. set rtre
14d0: 65 20 5b 73 74 72 75 63 74 3a 3a 74 72 65 65 20 e [struct::tree
14e0: 3a 3a 63 76 73 3a 3a 52 54 5d 0a 20 20 20 20 24 ::cvs::RT]. $
14f0: 72 74 72 65 65 20 72 65 6e 61 6d 65 20 72 6f 6f rtree rename roo
1500: 74 20 30 20 3b 20 23 20 52 6f 6f 74 20 69 73 20 t 0 ; # Root is
1510: 66 69 72 73 74 20 63 68 61 6e 67 65 73 65 74 2c first changeset,
1520: 20 61 6c 77 61 79 73 2e 0a 20 20 20 20 73 65 74 always.. set
1530: 20 74 72 75 6e 6b 20 30 0a 20 20 20 20 73 65 74 trunk 0. set
1540: 20 6e 74 72 75 6e 6b 20 31 20 3b 20 23 20 52 6f ntrunk 1 ; # Ro
1550: 6f 74 20 69 73 20 6f 6e 20 74 68 65 20 74 72 75 ot is on the tru
1560: 6e 6b 2e 0a 20 20 20 20 73 65 74 20 62 20 20 20 nk.. set b
1570: 20 20 20 30 20 3b 20 23 20 4e 6f 20 62 72 61 6e 0 ; # No bran
1580: 63 68 20 63 73 65 74 73 20 66 6f 75 6e 64 20 79 ch csets found y
1590: 65 74 2e 0a 0a 20 20 20 20 23 20 45 78 74 72 61 et... # Extra
15a0: 63 74 69 6e 67 20 74 68 65 20 74 72 75 6e 6b 20 cting the trunk
15b0: 69 73 20 65 61 73 79 2c 20 73 69 6d 70 6c 79 20 is easy, simply
15c0: 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20 74 68 by looking at th
15d0: 65 20 69 6e 76 6f 6c 76 65 64 0a 20 20 20 20 23 e involved. #
15e0: 20 76 65 72 73 69 6f 6e 20 6e 75 6d 62 65 72 73 version numbers
15f0: 2e 20 0a 0a 20 20 20 20 66 6f 72 65 61 63 68 20 . .. foreach
1600: 63 20 5b 6c 72 61 6e 67 65 20 5b 6c 73 6f 72 74 c [lrange [lsort
1610: 20 2d 69 6e 74 65 67 65 72 20 5b 61 72 72 61 79 -integer [array
1620: 20 6e 61 6d 65 73 20 63 73 65 74 73 5d 5d 20 31 names csets]] 1
1630: 20 65 6e 64 5d 20 7b 0a 09 66 6f 72 65 61 63 68 end] {..foreach
1640: 20 7b 75 20 63 6d 20 73 20 65 20 72 64 20 66 7d {u cm s e rd f}
1650: 20 24 63 73 65 74 73 28 24 63 29 20 62 72 65 61 $csets($c) brea
1660: 6b 0a 0a 09 23 20 49 67 6e 6f 72 65 20 62 72 61 k...# Ignore bra
1670: 6e 63 68 20 63 68 61 6e 67 65 73 2c 20 6a 75 73 nch changes, jus
1680: 74 20 63 6f 75 6e 74 20 74 68 65 6d 20 66 6f 72 t count them for
1690: 20 74 68 65 20 73 74 61 74 69 73 74 69 63 73 2e the statistics.
16a0: 0a 09 69 66 20 7b 24 72 64 20 21 3d 20 32 7d 20 ..if {$rd != 2}
16b0: 7b 0a 09 20 20 20 20 69 6e 63 72 20 62 0a 09 20 {.. incr b..
16c0: 20 20 20 63 6f 6e 74 69 6e 75 65 0a 09 7d 0a 0a continue..}..
16d0: 09 23 20 54 72 75 6e 6b 20 72 65 76 69 73 69 6f .# Trunk revisio
16e0: 6e 2c 20 63 6f 6e 6e 65 63 74 20 74 6f 2c 20 61 n, connect to, a
16f0: 6e 64 20 75 70 64 61 74 65 20 74 68 65 20 68 65 nd update the he
1700: 61 64 2e 0a 09 24 72 74 72 65 65 20 69 6e 73 65 ad...$rtree inse
1710: 72 74 20 24 74 72 75 6e 6b 20 65 6e 64 20 24 63 rt $trunk end $c
1720: 0a 09 73 65 74 20 74 72 75 6e 6b 20 24 63 0a 09 ..set trunk $c..
1730: 69 6e 63 72 20 6e 74 72 75 6e 6b 0a 20 20 20 20 incr ntrunk.
1740: 7d 0a 0a 20 20 20 20 4c 6f 67 20 69 6e 66 6f 20 }.. Log info
1750: 22 50 72 6f 63 65 73 73 65 64 20 24 6e 74 72 75 "Processed $ntru
1760: 6e 6b 20 74 72 75 6e 6b 20 20 5b 65 78 70 72 20 nk trunk [expr
1770: 7b 28 24 6e 74 72 75 6e 6b 20 3d 3d 20 31 29 20 {($ntrunk == 1)
1780: 3f 20 22 63 68 61 6e 67 65 73 65 74 22 20 3a 20 ? "changeset" :
1790: 22 63 68 61 6e 67 65 73 65 74 73 22 7d 5d 22 0a "changesets"}]".
17a0: 20 20 20 20 4c 6f 67 20 69 6e 66 6f 20 22 49 67 Log info "Ig
17b0: 6e 6f 72 65 64 20 20 20 24 62 20 62 72 61 6e 63 nored $b branc
17c0: 68 20 5b 65 78 70 72 20 7b 28 24 62 20 3d 3d 20 h [expr {($b ==
17d0: 31 29 20 3f 20 22 63 68 61 6e 67 65 73 65 74 22 1) ? "changeset"
17e0: 20 3a 20 22 63 68 61 6e 67 65 73 65 74 73 22 7d : "changesets"}
17f0: 5d 22 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a ]". return.}.
1800: 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 .namespace eval
1810: 3a 3a 63 76 73 20 7b 0a 20 20 20 20 23 20 54 72 ::cvs {. # Tr
1820: 65 65 20 68 6f 6c 64 69 6e 67 20 74 72 75 6e 6b ee holding trunk
1830: 20 61 6e 64 20 62 72 61 6e 63 68 20 69 6e 66 6f and branch info
1840: 72 6d 61 74 69 6f 6e 20 28 73 74 72 75 63 74 3a rmation (struct:
1850: 3a 74 72 65 65 29 2e 0a 20 20 20 20 23 20 4e 6f :tree).. # No
1860: 64 65 20 6e 61 6d 65 73 20 61 72 65 20 63 73 65 de names are cse
1870: 74 20 69 64 27 73 2e 0a 0a 20 20 20 20 76 61 72 t id's... var
1880: 69 61 62 6c 65 20 72 74 72 65 65 20 7b 7d 0a 20 iable rtree {}.
1890: 20 20 20 76 61 72 69 61 62 6c 65 20 6e 74 72 75 variable ntru
18a0: 6e 6b 20 30 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 63 nk 0.}..proc ::c
18b0: 76 73 3a 3a 77 6f 72 6b 73 70 61 63 65 20 7b 7d vs::workspace {}
18c0: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 {. variable
18d0: 63 77 64 20 5b 70 77 64 5d 0a 20 20 20 20 76 61 cwd [pwd]. va
18e0: 72 69 61 62 6c 65 20 77 6f 72 6b 73 70 61 63 65 riable workspace
18f0: 20 5b 66 69 6c 65 75 74 69 6c 3a 3a 74 65 6d 70 [fileutil::temp
1900: 66 69 6c 65 20 69 6d 70 6f 72 74 46 5f 63 76 73 file importF_cvs
1910: 5f 77 73 5f 5d 0a 20 20 20 20 66 69 6c 65 20 64 _ws_]. file d
1920: 65 6c 65 74 65 20 24 77 6f 72 6b 73 70 61 63 65 elete $workspace
1930: 0a 20 20 20 20 66 69 6c 65 20 6d 6b 64 69 72 20 . file mkdir
1940: 20 24 77 6f 72 6b 73 70 61 63 65 0a 0a 20 20 20 $workspace..
1950: 20 4c 6f 67 20 69 6e 66 6f 20 22 20 20 20 20 57 Log info " W
1960: 6f 72 6b 73 70 61 63 65 3a 20 24 77 6f 72 6b 73 orkspace: $works
1970: 70 61 63 65 22 0a 0a 20 20 20 20 63 64 20 20 20 pace".. cd
1980: 20 20 24 77 6f 72 6b 73 70 61 63 65 20 3b 20 23 $workspace ; #
1990: 20 43 68 65 63 6b 6f 75 74 73 20 67 6f 20 68 65 Checkouts go he
19a0: 72 65 2e 0a 20 20 20 20 72 65 74 75 72 6e 20 24 re.. return $
19b0: 77 6f 72 6b 73 70 61 63 65 0a 7d 0a 0a 70 72 6f workspace.}..pro
19c0: 63 20 3a 3a 63 76 73 3a 3a 77 73 69 67 6e 6f 72 c ::cvs::wsignor
19d0: 65 20 7b 70 61 74 68 7d 20 7b 0a 20 20 20 20 23 e {path} {. #
19e0: 20 49 67 6e 6f 72 65 20 43 56 53 20 61 64 6d 69 Ignore CVS admi
19f0: 6e 20 66 69 6c 65 73 2e 0a 20 20 20 20 69 66 20 n files.. if
1a00: 7b 5b 73 74 72 69 6e 67 20 6d 61 74 63 68 20 2a {[string match *
1a10: 2f 43 56 53 2f 2a 20 24 70 61 74 68 5d 7d 20 7b /CVS/* $path]} {
1a20: 72 65 74 75 72 6e 20 31 7d 0a 20 20 20 20 72 65 return 1}. re
1a30: 74 75 72 6e 20 30 0a 7d 0a 0a 70 72 6f 63 20 3a turn 0.}..proc :
1a40: 3a 63 76 73 3a 3a 77 73 63 6c 65 61 72 20 7b 7d :cvs::wsclear {}
1a50: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 {. variable
1a60: 63 77 64 0a 20 20 20 20 76 61 72 69 61 62 6c 65 cwd. variable
1a70: 20 77 6f 72 6b 73 70 61 63 65 0a 20 20 20 20 63 workspace. c
1a80: 64 20 24 63 77 64 0a 20 20 20 20 66 69 6c 65 20 d $cwd. file
1a90: 64 65 6c 65 74 65 20 2d 66 6f 72 63 65 20 24 77 delete -force $w
1aa0: 6f 72 6b 73 70 61 63 65 0a 20 20 20 20 72 65 74 orkspace. ret
1ab0: 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 63 76 urn.}..proc ::cv
1ac0: 73 3a 3a 77 73 73 65 74 75 70 20 7b 63 7d 20 7b s::wssetup {c} {
1ad0: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 63 73 . variable cs
1ae0: 65 74 73 0a 20 20 20 20 76 61 72 69 61 62 6c 65 ets. variable
1af0: 20 63 76 73 0a 20 20 20 20 76 61 72 69 61 62 6c cvs. variabl
1b00: 65 20 62 61 73 65 0a 0a 20 20 20 20 23 20 70 77 e base.. # pw
1b10: 64 20 3d 20 77 6f 72 6b 73 70 61 63 65 0a 0a 20 d = workspace..
1b20: 20 20 20 66 6f 72 65 61 63 68 20 7b 75 20 63 6d foreach {u cm
1b30: 20 73 20 65 20 72 64 20 66 73 7d 20 24 63 73 65 s e rd fs} $cse
1b40: 74 73 28 24 63 29 20 62 72 65 61 6b 0a 0a 20 20 ts($c) break..
1b50: 20 20 4c 6f 67 20 69 6e 66 6f 20 22 20 20 20 20 Log info "
1b60: 20 20 20 20 40 20 20 24 73 22 0a 0a 20 20 20 20 @ $s"..
1b70: 66 6f 72 65 61 63 68 20 6c 20 5b 73 70 6c 69 74 foreach l [split
1b80: 20 5b 73 74 72 69 6e 67 20 74 72 69 6d 20 24 63 [string trim $c
1b90: 6d 5d 20 5c 6e 5d 20 7b 0a 09 4c 6f 67 20 69 6e m] \n] {..Log in
1ba0: 66 6f 20 22 20 20 20 20 20 20 20 20 7c 20 20 24 fo " | $
1bb0: 6c 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 66 6f l". }.. fo
1bc0: 72 65 61 63 68 20 7b 66 20 6f 72 7d 20 24 66 73 reach {f or} $fs
1bd0: 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b 6f 70 20 {..foreach {op
1be0: 72 7d 20 24 6f 72 20 62 72 65 61 6b 0a 09 4c 6f r} $or break..Lo
1bf0: 67 20 69 6e 66 6f 20 22 20 20 20 20 20 20 20 20 g info "
1c00: 2d 2d 20 24 6f 70 20 24 66 20 24 72 22 0a 0a 09 -- $op $f $r"...
1c10: 69 66 20 7b 24 6f 70 20 65 71 20 22 52 22 7d 20 if {$op eq "R"}
1c20: 7b 0a 09 20 20 20 20 23 20 52 65 6d 6f 76 65 20 {.. # Remove
1c30: 66 69 6c 65 20 66 72 6f 6d 20 77 6f 72 6b 73 70 file from worksp
1c40: 61 63 65 2e 20 50 72 75 6e 65 20 65 6d 70 74 79 ace. Prune empty
1c50: 20 64 69 72 65 63 74 6f 72 69 65 73 2e 0a 09 20 directories...
1c60: 20 20 20 23 0a 09 20 20 20 20 23 20 4e 4f 54 45 #.. # NOTE
1c70: 3a 20 41 20 64 65 61 64 2d 66 69 72 73 74 20 66 : A dead-first f
1c80: 69 6c 65 20 28 72 65 76 20 31 2e 31 20 64 65 61 ile (rev 1.1 dea
1c90: 64 29 20 77 69 6c 6c 20 6e 65 76 65 72 20 68 61 d) will never ha
1ca0: 76 65 0a 09 20 20 20 20 23 20 65 78 69 73 74 65 ve.. # existe
1cb0: 64 2e 0a 09 20 20 20 20 23 0a 09 20 20 20 20 23 d... #.. #
1cc0: 20 4e 4f 54 45 3a 20 4c 6f 67 69 63 61 6c 6c 79 NOTE: Logically
1cd0: 20 65 6d 70 74 79 20 64 69 72 65 63 74 6f 72 69 empty directori
1ce0: 65 73 20 73 74 69 6c 6c 20 70 68 79 73 69 63 61 es still physica
1cf0: 6c 6c 79 0a 09 20 20 20 20 23 20 63 6f 6e 74 61 lly.. # conta
1d00: 69 6e 20 74 68 65 20 43 56 53 20 61 64 6d 69 6e in the CVS admin
1d10: 20 64 69 72 65 63 74 6f 72 79 2c 20 68 65 6e 63 directory, henc
1d20: 65 20 74 68 65 20 63 68 65 63 6b 20 66 6f 72 20 e the check for
1d30: 3d 3d 0a 09 20 20 20 20 23 20 31 2c 20 6e 6f 74 ==.. # 1, not
1d40: 20 3d 3d 20 30 2e 20 54 68 65 72 65 20 6d 69 67 == 0. There mig
1d50: 68 74 20 61 6c 73 6f 20 62 65 20 68 69 64 64 65 ht also be hidde
1d60: 6e 20 66 69 6c 65 73 2c 20 77 65 20 63 6f 75 6e n files, we coun
1d70: 74 0a 09 20 20 20 20 23 20 74 68 65 6d 20 61 73 t.. # them as
1d80: 20 77 65 6c 6c 2e 20 41 6c 77 61 79 73 20 68 69 well. Always hi
1d90: 64 64 65 6e 20 61 72 65 20 2e 20 61 6e 64 20 2e dden are . and .
1da0: 2e 20 61 6e 64 20 74 68 65 79 20 64 6f 20 6e 6f . and they do no
1db0: 74 0a 09 20 20 20 20 23 20 63 6f 75 6e 74 20 61 t.. # count a
1dc0: 73 20 75 73 65 72 20 66 69 6c 65 2e 0a 0a 09 20 s user file....
1dd0: 20 20 20 66 69 6c 65 20 64 65 6c 65 74 65 20 24 file delete $
1de0: 66 0a 09 20 20 20 20 73 65 74 20 66 64 20 5b 66 f.. set fd [f
1df0: 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 66 5d 0a ile dirname $f].
1e00: 09 20 20 20 20 69 66 20 7b 0a 09 09 28 5b 6c 6c . if {...([ll
1e10: 65 6e 67 74 68 20 5b 67 6c 6f 62 20 2d 6e 6f 63 ength [glob -noc
1e20: 6f 6d 70 6c 61 69 6e 20 2d 64 69 72 65 63 74 6f omplain -directo
1e30: 72 79 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ry
1e40: 24 66 64 20 2a 5d 5d 20 3d 3d 20 31 29 20 26 26 $fd *]] == 1) &&
1e50: 0a 09 09 28 5b 6c 6c 65 6e 67 74 68 20 5b 67 6c ...([llength [gl
1e60: 6f 62 20 2d 6e 6f 63 6f 6d 70 6c 61 69 6e 20 2d ob -nocomplain -
1e70: 64 69 72 65 63 74 6f 72 79 20 2d 74 79 70 65 20 directory -type
1e80: 68 69 64 64 65 6e 20 24 66 64 20 2a 5d 5d 20 3d hidden $fd *]] =
1e90: 3d 20 32 29 0a 09 20 20 20 20 7d 20 7b 0a 09 09 = 2).. } {...
1ea0: 66 69 6c 65 20 64 65 6c 65 74 65 20 2d 66 6f 72 file delete -for
1eb0: 63 65 20 24 66 64 0a 09 20 20 20 20 7d 0a 09 7d ce $fd.. }..}
1ec0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 23 20 41 else {.. # A
1ed0: 64 64 65 64 20 6f 72 20 6d 6f 64 69 66 69 65 64 dded or modified
1ee0: 2c 20 70 75 74 20 74 68 65 20 72 65 71 75 65 73 , put the reques
1ef0: 74 65 64 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 ted version of t
1f00: 68 65 20 66 69 6c 65 0a 09 20 20 20 20 23 20 69 he file.. # i
1f10: 6e 74 6f 20 74 68 65 20 77 6f 72 6b 73 70 61 63 nto the workspac
1f20: 65 2e 0a 0a 09 20 20 20 20 69 66 20 7b 5b 63 61 e.... if {[ca
1f30: 74 63 68 20 7b 0a 09 09 65 78 65 63 20 24 63 76 tch {...exec $cv
1f40: 73 20 2d 64 20 24 62 61 73 65 20 63 6f 20 2d 72 s -d $base co -r
1f50: 20 24 72 20 24 66 0a 09 20 20 20 20 7d 20 6d 73 $r $f.. } ms
1f60: 67 5d 7d 20 7b 0a 09 09 69 66 20 7b 5b 73 74 72 g]} {...if {[str
1f70: 69 6e 67 20 6d 61 74 63 68 20 7b 2a 69 6e 76 61 ing match {*inva
1f80: 6c 69 64 20 63 68 61 6e 67 65 20 74 65 78 74 2a lid change text*
1f90: 7d 20 24 6d 73 67 5d 7d 20 7b 0a 09 09 20 20 20 } $msg]} {...
1fa0: 20 23 20 54 68 65 20 61 72 63 68 69 76 65 20 6f # The archive o
1fb0: 66 20 74 68 65 20 66 69 6c 65 20 69 73 20 63 6f f the file is co
1fc0: 72 72 75 70 74 65 64 20 61 6e 64 20 74 68 65 0a rrupted and the.
1fd0: 09 09 20 20 20 20 23 20 63 68 6f 73 65 6e 20 76 .. # chosen v
1fe0: 65 72 73 69 6f 6e 20 6e 6f 74 20 61 63 63 65 73 ersion not acces
1ff0: 73 69 62 6c 65 20 64 75 65 20 74 6f 20 74 68 61 sible due to tha
2000: 74 2e 20 57 65 0a 09 09 20 20 20 20 23 20 72 65 t. We... # re
2010: 70 6f 72 74 20 74 68 65 20 70 72 6f 62 6c 65 6d port the problem
2020: 2c 20 62 75 74 20 6f 74 68 65 72 77 69 73 65 20 , but otherwise
2030: 69 67 6e 6f 72 65 20 69 74 2e 20 41 73 0a 09 09 ignore it. As...
2040: 20 20 20 20 23 20 61 20 63 6f 6e 73 65 71 75 65 # a conseque
2050: 6e 63 65 20 74 68 65 20 66 6f 73 73 69 6c 20 72 nce the fossil r
2060: 65 70 6f 73 69 74 6f 72 79 20 77 69 6c 6c 20 6e epository will n
2070: 6f 74 0a 09 09 20 20 20 20 23 20 63 6f 6e 74 61 ot... # conta
2080: 69 6e 20 74 68 65 20 66 75 6c 6c 20 68 69 73 74 in the full hist
2090: 6f 72 79 20 6f 66 20 74 68 65 20 6e 61 6d 65 64 ory of the named
20a0: 20 66 69 6c 65 2e 20 42 79 0a 09 09 20 20 20 20 file. By...
20b0: 23 20 69 67 6e 6f 72 69 6e 67 20 74 68 65 20 70 # ignoring the p
20c0: 72 6f 62 6c 65 6d 20 77 65 20 68 6f 77 65 76 65 roblem we howeve
20d0: 72 20 67 65 74 20 61 73 20 6d 75 63 68 20 61 73 r get as much as
20e0: 0a 09 09 20 20 20 20 23 20 69 73 20 70 6f 73 73 ... # is poss
20f0: 69 62 6c 65 2e 0a 0a 09 09 20 20 20 20 4c 6f 67 ible..... Log
2100: 20 69 6e 66 6f 20 22 20 20 20 20 20 20 20 20 45 info " E
2110: 45 20 43 6f 72 72 75 70 74 65 64 20 61 72 63 68 E Corrupted arch
2120: 69 76 65 20 66 69 6c 65 2e 20 49 6e 61 63 63 65 ive file. Inacce
2130: 73 73 69 62 6c 65 20 72 65 76 69 73 69 6f 6e 2e ssible revision.
2140: 22 0a 09 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 "... continue
2150: 0a 09 09 7d 0a 09 09 72 65 74 75 72 6e 20 2d 63 ...}...return -c
2160: 6f 64 65 20 65 72 72 6f 72 20 24 6d 73 67 0a 09 ode error $msg..
2170: 20 20 20 20 7d 0a 09 7d 0a 20 20 20 20 7d 0a 0a }..}. }..
2180: 20 20 20 20 23 20 50 72 6f 76 69 64 65 20 6d 65 # Provide me
2190: 74 61 64 61 74 61 20 61 62 6f 75 74 20 74 68 65 tadata about the
21a0: 20 63 68 61 6e 67 65 73 65 74 20 74 68 65 20 62 changeset the b
21b0: 61 63 6b 65 6e 64 20 6d 61 79 20 77 69 73 68 20 ackend may wish
21c0: 74 6f 20 68 61 76 65 0a 20 20 20 20 72 65 74 75 to have. retu
21d0: 72 6e 20 5b 6c 69 73 74 20 24 75 20 24 63 6d 20 rn [list $u $cm
21e0: 24 73 5d 0a 7d 0a 0a 6e 61 6d 65 73 70 61 63 65 $s].}..namespace
21f0: 20 65 76 61 6c 20 3a 3a 63 76 73 20 7b 0a 20 20 eval ::cvs {.
2200: 20 20 23 20 43 56 53 20 61 70 70 6c 69 63 61 74 # CVS applicat
2210: 69 6f 6e 0a 20 20 20 20 23 20 57 6f 72 6b 73 70 ion. # Worksp
2220: 61 63 65 20 77 68 65 72 65 20 63 68 65 63 6b 6f ace where checko
2230: 75 74 73 20 68 61 70 70 65 6e 0a 20 20 20 20 23 uts happen. #
2240: 20 43 75 72 72 65 6e 74 20 77 6f 72 6b 69 6e 67 Current working
2250: 20 64 69 72 65 63 74 6f 72 79 20 74 6f 20 67 6f directory to go
2260: 20 62 61 63 6b 20 74 6f 20 61 66 74 65 72 20 74 back to after t
2270: 68 65 20 69 6d 70 6f 72 74 2e 0a 0a 20 20 20 20 he import...
2280: 76 61 72 69 61 62 6c 65 20 63 76 73 20 20 20 20 variable cvs
2290: 20 20 20 5b 61 75 74 6f 5f 65 78 65 63 6f 6b 20 [auto_execok
22a0: 63 76 73 5d 0a 20 20 20 20 76 61 72 69 61 62 6c cvs]. variabl
22b0: 65 20 77 6f 72 6b 73 70 61 63 65 20 7b 7d 0a 20 e workspace {}.
22c0: 20 20 20 76 61 72 69 61 62 6c 65 20 63 77 64 20 variable cwd
22d0: 20 20 20 20 20 20 7b 7d 0a 7d 0a 0a 70 72 6f 63 {}.}..proc
22e0: 20 3a 3a 63 76 73 3a 3a 66 6f 72 65 61 63 68 5f ::cvs::foreach_
22f0: 63 73 65 74 20 7b 63 76 20 6e 6f 64 65 20 73 63 cset {cv node sc
2300: 72 69 70 74 7d 20 7b 0a 20 20 20 20 75 70 76 61 ript} {. upva
2310: 72 20 31 20 24 63 76 20 63 0a 20 20 20 20 76 61 r 1 $cv c. va
2320: 72 69 61 62 6c 65 20 72 74 72 65 65 0a 0a 20 20 riable rtree..
2330: 20 20 73 65 74 20 63 20 24 6e 6f 64 65 0a 20 20 set c $node.
2340: 20 20 77 68 69 6c 65 20 7b 31 7d 20 7b 0a 09 73 while {1} {..s
2350: 65 74 20 63 6f 64 65 20 5b 63 61 74 63 68 20 7b et code [catch {
2360: 75 70 6c 65 76 65 6c 20 31 20 24 73 63 72 69 70 uplevel 1 $scrip
2370: 74 7d 20 72 65 73 5d 0a 0a 09 23 20 30 20 2d 20 t} res]...# 0 -
2380: 6f 6b 2c 20 31 20 2d 20 65 72 72 6f 72 2c 20 32 ok, 1 - error, 2
2390: 20 2d 20 72 65 74 75 72 6e 2c 20 33 20 2d 20 62 - return, 3 - b
23a0: 72 65 61 6b 2c 20 34 20 2d 20 63 6f 6e 74 69 6e reak, 4 - contin
23b0: 75 65 0a 09 73 77 69 74 63 68 20 2d 2d 20 24 63 ue..switch -- $c
23c0: 6f 64 65 20 7b 0a 09 20 20 20 20 30 20 7b 7d 0a ode {.. 0 {}.
23d0: 09 20 20 20 20 31 20 7b 20 72 65 74 75 72 6e 20 . 1 { return
23e0: 2d 65 72 72 6f 72 63 6f 64 65 20 24 3a 3a 65 72 -errorcode $::er
23f0: 72 6f 72 63 6f 64 65 20 2d 63 6f 64 65 20 65 72 rorcode -code er
2400: 72 6f 72 20 24 72 65 73 20 7d 0a 09 20 20 20 20 ror $res }..
2410: 32 20 7b 7d 0a 09 20 20 20 20 33 20 7b 20 72 65 2 {}.. 3 { re
2420: 74 75 72 6e 20 7d 0a 09 20 20 20 20 34 20 7b 7d turn }.. 4 {}
2430: 0a 09 20 20 20 20 64 65 66 61 75 6c 74 20 7b 0a .. default {.
2440: 09 09 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 24 ..return -code $
2450: 63 6f 64 65 20 24 72 65 73 75 6c 74 0a 09 20 20 code $result..
2460: 20 20 7d 0a 09 7d 0a 0a 09 23 20 53 74 6f 70 20 }..}...# Stop
2470: 6f 6e 20 72 65 61 63 68 69 6e 67 20 74 68 65 20 on reaching the
2480: 68 65 61 64 2e 0a 09 69 66 20 7b 21 5b 6c 6c 65 head...if {![lle
2490: 6e 67 74 68 20 5b 24 72 74 72 65 65 20 63 68 69 ngth [$rtree chi
24a0: 6c 64 72 65 6e 20 24 63 5d 5d 7d 20 62 72 65 61 ldren $c]]} brea
24b0: 6b 0a 0a 09 23 70 75 74 73 20 3c 5b 24 72 74 72 k...#puts <[$rtr
24c0: 65 65 20 63 68 69 6c 64 72 65 6e 20 24 63 5d 3e ee children $c]>
24d0: 0a 0a 09 23 20 47 6f 20 74 6f 20 6e 65 78 74 20 ...# Go to next
24e0: 63 68 69 6c 64 20 69 6e 20 74 72 75 6e 6b 20 28 child in trunk (
24f0: 6c 65 66 74 6d 6f 73 74 29 2e 0a 09 73 65 74 20 leftmost)...set
2500: 63 20 5b 6c 69 6e 64 65 78 20 5b 24 72 74 72 65 c [lindex [$rtre
2510: 65 20 63 68 69 6c 64 72 65 6e 20 24 63 5d 20 30 e children $c] 0
2520: 5d 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 ]. }. retu
2530: 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 63 76 73 rn.}..proc ::cvs
2540: 3a 3a 72 6f 6f 74 20 7b 7d 20 7b 0a 20 20 20 20 ::root {} {.
2550: 72 65 74 75 72 6e 20 30 0a 7d 0a 0a 70 72 6f 63 return 0.}..proc
2560: 20 3a 3a 63 76 73 3a 3a 6e 74 72 75 6e 6b 20 7b ::cvs::ntrunk {
2570: 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 } {. variable
2580: 20 6e 74 72 75 6e 6b 0a 20 20 20 20 72 65 74 75 ntrunk. retu
2590: 72 6e 20 20 24 6e 74 72 75 6e 6b 0a 7d 0a 0a 70 rn $ntrunk.}..p
25a0: 72 6f 63 20 3a 3a 63 76 73 3a 3a 75 75 69 64 20 roc ::cvs::uuid
25b0: 7b 63 20 75 75 69 64 7d 20 7b 0a 20 20 20 20 76 {c uuid} {. v
25c0: 61 72 69 61 62 6c 65 20 72 74 72 65 65 0a 20 20 ariable rtree.
25d0: 20 20 24 72 74 72 65 65 20 73 65 74 20 24 63 20 $rtree set $c
25e0: 75 75 69 64 20 24 75 75 69 64 0a 20 20 20 20 72 uuid $uuid. r
25f0: 65 74 75 72 6e 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d eturn.}..# -----
2600: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2610: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2620: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2630: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2640: 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49 6e 74 65 72 --------.# Inter
2650: 6e 61 6c 20 68 65 6c 70 65 72 20 63 6f 6d 6d 61 nal helper comma
2660: 6e 64 73 3a 20 43 68 61 6e 67 65 73 65 74 20 69 nds: Changeset i
2670: 6e 73 70 65 63 74 69 6f 6e 20 61 6e 64 20 63 6f nspection and co
2680: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 0a 70 72 6f nstruction...pro
2690: 63 20 3a 3a 63 76 73 3a 3a 43 53 43 6c 65 61 72 c ::cvs::CSClear
26a0: 20 7b 7d 20 7b 0a 20 20 20 20 75 70 76 61 72 20 {} {. upvar
26b0: 31 20 73 74 61 72 74 20 73 74 61 72 74 20 65 6e 1 start start en
26c0: 64 20 65 6e 64 20 63 6d 20 63 6d 20 75 73 65 72 d end cm cm user
26d0: 20 75 73 65 72 20 66 69 6c 65 73 20 66 69 6c 65 user files file
26e0: 73 20 6c 61 73 74 64 20 6c 61 73 74 64 0a 0a 20 s lastd lastd..
26f0: 20 20 20 73 65 74 20 73 74 61 72 74 20 7b 7d 0a set start {}.
2700: 20 20 20 20 73 65 74 20 65 6e 64 20 20 20 7b 7d set end {}
2710: 0a 20 20 20 20 73 65 74 20 63 6d 20 20 20 20 7b . set cm {
2720: 7d 0a 20 20 20 20 73 65 74 20 75 73 65 72 20 20 }. set user
2730: 7b 7d 0a 20 20 20 20 73 65 74 20 6c 61 73 74 64 {}. set lastd
2740: 20 7b 7d 0a 20 20 20 20 61 72 72 61 79 20 75 6e {}. array un
2750: 73 65 74 20 66 69 6c 65 73 20 2a 0a 20 20 20 20 set files *.
2760: 61 72 72 61 79 20 73 65 74 20 66 69 6c 65 73 20 array set files
2770: 7b 7d 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a {}. return.}.
2780: 0a 70 72 6f 63 20 3a 3a 63 76 73 3a 3a 43 53 4e .proc ::cvs::CSN
2790: 6f 6e 65 20 7b 7d 20 7b 0a 20 20 20 20 75 70 76 one {} {. upv
27a0: 61 72 20 31 20 73 74 61 72 74 20 73 74 61 72 74 ar 1 start start
27b0: 0a 20 20 20 20 72 65 74 75 72 6e 20 5b 65 78 70 . return [exp
27c0: 72 20 7b 24 73 74 61 72 74 20 65 71 20 22 22 7d r {$start eq ""}
27d0: 5d 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 63 76 73 3a ].}..proc ::cvs:
27e0: 3a 43 53 4e 65 77 20 7b 65 6e 74 72 79 7d 20 7b :CSNew {entry} {
27f0: 0a 20 20 20 20 75 70 76 61 72 20 31 20 73 74 61 . upvar 1 sta
2800: 72 74 20 73 74 61 72 74 20 65 6e 64 20 65 6e 64 rt start end end
2810: 20 63 6d 20 63 6d 20 75 73 65 72 20 75 73 65 72 cm cm user user
2820: 20 66 69 6c 65 73 20 66 69 6c 65 73 20 6c 61 73 files files las
2830: 74 64 20 6c 61 73 74 64 20 72 65 61 73 6f 6e 20 td lastd reason
2840: 72 65 61 73 6f 6e 0a 0a 20 20 20 20 23 70 75 74 reason.. #put
2850: 73 20 2d 6e 6f 6e 65 77 6c 69 6e 65 20 73 74 64 s -nonewline std
2860: 6f 75 74 20 2e 20 3b 20 66 6c 75 73 68 20 73 74 out . ; flush st
2870: 64 6f 75 74 0a 0a 20 20 20 20 66 6f 72 65 61 63 dout.. foreac
2880: 68 20 7b 6f 70 20 74 73 20 61 20 72 65 76 20 66 h {op ts a rev f
2890: 20 65 63 6d 7d 20 24 65 6e 74 72 79 20 62 72 65 ecm} $entry bre
28a0: 61 6b 0a 0a 20 20 20 20 23 20 55 73 65 72 20 63 ak.. # User c
28b0: 68 61 6e 67 65 0a 20 20 20 20 69 66 20 7b 24 61 hange. if {$a
28c0: 20 6e 65 20 24 75 73 65 72 7d 20 7b 73 65 74 20 ne $user} {set
28d0: 72 65 61 73 6f 6e 20 75 73 65 72 20 3b 20 72 65 reason user ; re
28e0: 74 75 72 6e 20 31 7d 0a 0a 20 20 20 20 23 20 46 turn 1}.. # F
28f0: 69 6c 65 20 61 6c 72 65 61 64 79 20 69 6e 20 63 ile already in c
2900: 75 72 72 65 6e 74 20 63 73 65 74 0a 20 20 20 20 urrent cset.
2910: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 if {[info exists
2920: 20 66 69 6c 65 73 28 24 66 29 5d 7d 20 7b 73 65 files($f)]} {se
2930: 74 20 72 65 61 73 6f 6e 20 66 69 6c 65 20 3b 20 t reason file ;
2940: 72 65 74 75 72 6e 20 31 7d 0a 0a 20 20 20 20 23 return 1}.. #
2950: 20 43 75 72 72 65 6e 74 20 63 73 65 74 20 74 72 Current cset tr
2960: 75 6e 6b 2f 62 72 61 6e 63 68 20 64 69 66 66 65 unk/branch diffe
2970: 72 65 6e 74 20 66 72 6f 6d 20 65 6e 74 72 79 2e rent from entry.
2980: 0a 20 20 20 20 73 65 74 20 64 65 70 74 68 20 5b . set depth [
2990: 6c 6c 65 6e 67 74 68 20 5b 73 70 6c 69 74 20 24 llength [split $
29a0: 72 65 76 20 2e 5d 5d 0a 20 20 20 20 69 66 20 7b rev .]]. if {
29b0: 28 24 6c 61 73 74 64 20 3d 3d 20 32 29 20 21 3d ($lastd == 2) !=
29c0: 20 28 24 64 65 70 74 68 20 3d 3d 20 32 29 7d 20 ($depth == 2)}
29d0: 7b 73 65 74 20 72 65 61 73 6f 6e 20 64 65 70 74 {set reason dept
29e0: 68 2f 24 6c 61 73 74 64 2f 24 64 65 70 74 68 2f h/$lastd/$depth/
29f0: 28 24 72 65 76 29 2f 24 66 20 3b 20 72 65 74 75 ($rev)/$f ; retu
2a00: 72 6e 20 31 7d 0a 0a 20 20 20 20 23 20 43 6f 6d rn 1}.. # Com
2a10: 6d 69 74 20 6d 65 73 73 61 67 65 20 63 68 61 6e mit message chan
2a20: 67 65 64 0a 20 20 20 20 69 66 20 7b 24 63 6d 20 ged. if {$cm
2a30: 6e 65 20 24 65 63 6d 7d 20 7b 73 65 74 20 72 65 ne $ecm} {set re
2a40: 61 73 6f 6e 20 63 6d 73 67 5c 20 3c 3c 24 65 63 ason cmsg\ <<$ec
2a50: 6d 3e 3e 20 3b 20 72 65 74 75 72 6e 20 31 7d 0a m>> ; return 1}.
2a60: 0a 20 20 20 20 23 20 45 76 65 72 79 74 68 69 6e . # Everythin
2a70: 67 20 69 73 20 67 6f 6f 64 2c 20 73 74 69 6c 6c g is good, still
2a80: 20 74 68 65 20 73 61 6d 65 20 63 73 65 74 0a 20 the same cset.
2a90: 20 20 20 72 65 74 75 72 6e 20 30 0a 7d 0a 0a 70 return 0.}..p
2aa0: 72 6f 63 20 3a 3a 63 76 73 3a 3a 43 53 53 61 76 roc ::cvs::CSSav
2ab0: 65 20 7b 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 e {} {. varia
2ac0: 62 6c 65 20 63 6d 61 70 0a 20 20 20 20 76 61 72 ble cmap. var
2ad0: 69 61 62 6c 65 20 63 73 65 74 73 0a 20 20 20 20 iable csets.
2ae0: 76 61 72 69 61 62 6c 65 20 6e 63 73 0a 20 20 20 variable ncs.
2af0: 20 75 70 76 61 72 20 31 20 73 74 61 72 74 20 73 upvar 1 start s
2b00: 74 61 72 74 20 65 6e 64 20 65 6e 64 20 63 6d 20 tart end end cm
2b10: 63 6d 20 75 73 65 72 20 75 73 65 72 20 66 69 6c cm user user fil
2b20: 65 73 20 66 69 6c 65 73 20 6c 61 73 74 64 20 6c es files lastd l
2b30: 61 73 74 64 0a 0a 20 20 20 20 73 65 74 20 63 73 astd.. set cs
2b40: 65 74 73 28 24 6e 63 73 29 20 5b 6c 69 73 74 20 ets($ncs) [list
2b50: 24 75 73 65 72 20 24 63 6d 20 24 73 74 61 72 74 $user $cm $start
2b60: 20 24 65 6e 64 20 24 6c 61 73 74 64 20 5b 61 72 $end $lastd [ar
2b70: 72 61 79 20 67 65 74 20 66 69 6c 65 73 5d 5d 0a ray get files]].
2b80: 0a 20 20 20 20 23 20 52 65 63 6f 72 64 20 77 68 . # Record wh
2b90: 69 63 68 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 ich revisions of
2ba0: 20 61 20 66 69 6c 65 20 61 72 65 20 69 6e 20 77 a file are in w
2bb0: 68 61 74 20 63 73 65 74 73 0a 20 20 20 20 66 6f hat csets. fo
2bc0: 72 65 61 63 68 20 7b 66 20 6f 72 7d 20 5b 61 72 reach {f or} [ar
2bd0: 72 61 79 20 67 65 74 20 66 69 6c 65 73 5d 20 7b ray get files] {
2be0: 0a 09 66 6f 72 65 61 63 68 20 7b 5f 20 72 65 76 ..foreach {_ rev
2bf0: 7d 20 24 6f 72 20 62 72 65 61 6b 0a 09 73 65 74 } $or break..set
2c00: 20 63 6d 61 70 28 5b 6c 69 73 74 20 24 66 20 24 cmap([list $f $
2c10: 72 65 76 5d 29 20 24 6e 63 73 0a 20 20 20 20 7d rev]) $ncs. }
2c20: 0a 0a 20 20 20 20 23 43 53 44 75 6d 70 20 24 6e .. #CSDump $n
2c30: 63 73 0a 0a 20 20 20 20 69 6e 63 72 20 6e 63 73 cs.. incr ncs
2c40: 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 . return.}..p
2c50: 72 6f 63 20 3a 3a 63 76 73 3a 3a 43 53 41 64 64 roc ::cvs::CSAdd
2c60: 20 7b 65 6e 74 72 79 7d 20 7b 0a 20 20 20 20 75 {entry} {. u
2c70: 70 76 61 72 20 31 20 73 74 61 72 74 20 73 74 61 pvar 1 start sta
2c80: 72 74 20 65 6e 64 20 65 6e 64 20 63 6d 20 63 6d rt end end cm cm
2c90: 20 75 73 65 72 20 75 73 65 72 20 66 69 6c 65 73 user user files
2ca0: 20 66 69 6c 65 73 20 6c 61 73 74 64 20 6c 61 73 files lastd las
2cb0: 74 64 0a 0a 20 20 20 20 66 6f 72 65 61 63 68 20 td.. foreach
2cc0: 7b 6f 70 20 74 73 20 61 20 72 65 76 20 66 20 65 {op ts a rev f e
2cd0: 63 6d 7d 20 24 65 6e 74 72 79 20 62 72 65 61 6b cm} $entry break
2ce0: 0a 0a 20 20 20 20 69 66 20 7b 24 73 74 61 72 74 .. if {$start
2cf0: 20 65 71 20 22 22 7d 20 7b 73 65 74 20 73 74 61 eq ""} {set sta
2d00: 72 74 20 24 74 73 7d 0a 20 20 20 20 73 65 74 20 rt $ts}. set
2d10: 65 6e 64 20 20 20 20 20 20 20 24 74 73 0a 20 20 end $ts.
2d20: 20 20 73 65 74 20 63 6d 20 20 20 20 20 20 20 20 set cm
2d30: 24 65 63 6d 0a 20 20 20 20 73 65 74 20 75 73 65 $ecm. set use
2d40: 72 20 20 20 20 20 20 24 61 0a 20 20 20 20 73 65 r $a. se
2d50: 74 20 66 69 6c 65 73 28 24 66 29 20 5b 6c 69 73 t files($f) [lis
2d60: 74 20 24 6f 70 20 24 72 65 76 5d 0a 20 20 20 20 t $op $rev].
2d70: 73 65 74 20 6c 61 73 74 64 20 20 20 20 20 5b 6c set lastd [l
2d80: 6c 65 6e 67 74 68 20 5b 73 70 6c 69 74 20 24 72 length [split $r
2d90: 65 76 20 2e 5d 5d 0a 20 20 20 20 72 65 74 75 72 ev .]]. retur
2da0: 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 63 76 73 3a n.}..proc ::cvs:
2db0: 3a 43 53 44 75 6d 70 20 7b 63 7d 20 7b 0a 20 20 :CSDump {c} {.
2dc0: 20 20 76 61 72 69 61 62 6c 65 20 63 73 65 74 73 variable csets
2dd0: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 7b 75 20 . foreach {u
2de0: 63 6d 20 73 20 65 20 72 64 20 66 7d 20 24 63 73 cm s e rd f} $cs
2df0: 65 74 73 28 24 63 29 20 62 72 65 61 6b 0a 0a 20 ets($c) break..
2e00: 20 20 20 70 75 74 73 20 22 24 75 20 24 73 22 3b puts "$u $s";
2e10: 20 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 2e 7d regsub -all {.}
2e20: 20 24 75 20 7b 20 7d 20 62 0a 20 20 20 20 70 75 $u { } b. pu
2e30: 74 73 20 22 24 62 20 24 65 22 0a 20 20 20 20 66 ts "$b $e". f
2e40: 6f 72 65 61 63 68 20 7b 66 20 6f 72 7d 20 24 66 oreach {f or} $f
2e50: 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b 6f 20 72 {..foreach {o r
2e60: 7d 20 24 6f 72 20 62 72 65 61 6b 0a 09 70 75 74 } $or break..put
2e70: 73 20 22 24 62 20 24 6f 20 24 66 20 24 72 22 0a s "$b $o $f $r".
2e80: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
2e90: 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d .}..# ----------
2ea0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2eb0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ec0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ed0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
2ee0: 2d 2d 2d 0a 23 20 49 6e 74 65 72 6e 61 6c 20 68 ---.# Internal h
2ef0: 65 6c 70 65 72 20 63 6f 6d 6d 61 6e 64 73 0a 0a elper commands..
2f00: 70 72 6f 63 20 3a 3a 63 76 73 3a 3a 4c 6f 67 20 proc ::cvs::Log
2f10: 7b 6c 65 76 65 6c 20 74 65 78 74 7d 20 7b 0a 20 {level text} {.
2f20: 20 20 20 76 61 72 69 61 62 6c 65 20 6c 63 0a 20 variable lc.
2f30: 20 20 20 75 70 6c 65 76 65 6c 20 23 30 20 5b 6c uplevel #0 [l
2f40: 69 6e 73 65 72 74 20 24 6c 63 20 65 6e 64 20 24 insert $lc end $
2f50: 6c 65 76 65 6c 20 24 74 65 78 74 5d 0a 20 20 20 level $text].
2f60: 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 return.}..proc
2f70: 3a 3a 63 76 73 3a 3a 4e 6f 70 20 7b 61 72 67 73 ::cvs::Nop {args
2f80: 7d 20 7b 7d 0a 0a 6e 61 6d 65 73 70 61 63 65 20 } {}..namespace
2f90: 65 76 61 6c 20 3a 3a 63 76 73 20 7b 0a 20 20 20 eval ::cvs {.
2fa0: 20 23 20 4c 6f 67 67 69 6e 67 20 63 61 6c 6c 62 # Logging callb
2fb0: 61 63 6b 2e 20 4e 6f 20 6c 6f 67 67 69 6e 67 20 ack. No logging
2fc0: 62 79 20 64 65 66 61 75 6c 74 2e 0a 20 20 20 20 by default..
2fd0: 76 61 72 69 61 62 6c 65 20 6c 63 20 3a 3a 63 76 variable lc ::cv
2fe0: 73 3a 3a 4e 6f 70 0a 7d 0a 0a 23 20 2d 2d 2d 2d s::Nop.}..# ----
2ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3000: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
3030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 52 65 61 64 ---------.# Read
3040: 79 0a 0a 70 61 63 6b 61 67 65 20 70 72 6f 76 69 y..package provi
3050: 64 65 20 63 76 73 20 31 2e 30 0a 72 65 74 75 72 de cvs 1.0.retur
3060: 6e 0a n.