Artifact 8e70daebc024cb0f10b01b64f668618eff07802b:
File
tools/import-cvs.tcl
part of check-in
[f166b0a63c]
- Added first code regarding import from cvs, processing a CVSROOT/history file. Looks good, except that the history I have is incomplete, truncated at the beginning. Extended my notes with results from this experiment, thinking about a possible different method.
by
aku on
2007-08-31 04:57:33.
0000: 23 21 2f 62 69 6e 2f 73 68 0a 23 20 2d 2a 2d 20 #!/bin/sh.# -*-
0010: 74 63 6c 20 2d 2a 2d 20 5c 0a 65 78 65 63 20 74 tcl -*- \.exec t
0020: 63 6c 73 68 20 22 24 30 22 20 24 7b 31 2b 22 24 clsh "$0" ${1+"$
0030: 40 22 7d 0a 0a 23 20 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 2d ----------------
0050: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0060: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0070: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0080: 2d 2d 2d 2d 0a 23 20 4d 61 6b 65 20 70 72 69 76 ----.# Make priv
0090: 61 74 65 20 70 61 63 6b 61 67 65 73 20 61 63 63 ate packages acc
00a0: 65 73 73 69 62 6c 65 2e 0a 0a 6c 61 70 70 65 6e essible...lappen
00b0: 64 20 61 75 74 6f 5f 70 61 74 68 20 5b 66 69 6c d auto_path [fil
00c0: 65 20 6a 6f 69 6e 20 5b 66 69 6c 65 20 64 69 72 e join [file dir
00d0: 6e 61 6d 65 20 5b 69 6e 66 6f 20 73 63 72 69 70 name [info scrip
00e0: 74 5d 5d 20 6c 69 62 5d 0a 70 61 63 6b 61 67 65 t]] lib].package
00f0: 20 72 65 71 75 69 72 65 20 72 63 73 70 61 72 73 require rcspars
0100: 65 72 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 er.package requi
0110: 72 65 20 66 69 6c 65 75 74 69 6c 0a 0a 23 20 2d re fileutil..# -
0120: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0130: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0140: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0160: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 52 ------------.# R
0170: 65 70 6f 73 69 74 6f 72 79 20 6d 61 6e 61 67 65 epository manage
0180: 6d 65 6e 74 20 28 43 56 53 29 0a 0a 6e 61 6d 65 ment (CVS)..name
0190: 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 63 76 73 space eval ::cvs
01a0: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 {. variable
01b0: 62 61 73 65 20 20 20 3b 20 73 65 74 20 20 20 20 base ; set
01c0: 20 20 20 62 61 73 65 20 20 20 7b 7d 20 3b 20 23 base {} ; #
01d0: 20 52 65 70 6f 73 69 74 6f 72 79 20 74 6f 70 6c Repository topl
01e0: 65 76 65 6c 20 64 69 72 65 63 74 6f 72 79 2e 0a evel directory..
01f0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6e 70 61 variable npa
0200: 74 68 73 20 3b 20 61 72 72 61 79 20 73 65 74 20 ths ; array set
0210: 6e 70 61 74 68 73 20 7b 7d 20 3b 20 23 20 70 61 npaths {} ; # pa
0220: 74 68 20 2d 3e 20 61 63 74 75 61 6c 20 70 61 74 th -> actual pat
0230: 68 20 6d 61 70 70 69 6e 67 2e 0a 20 20 20 20 76 h mapping.. v
0240: 61 72 69 61 62 6c 65 20 72 70 61 74 68 73 20 3b ariable rpaths ;
0250: 20 61 72 72 61 79 20 73 65 74 20 72 70 61 74 68 array set rpath
0260: 73 20 7b 7d 20 3b 20 23 20 70 61 74 68 20 2d 3e s {} ; # path ->
0270: 20 72 63 73 20 66 69 6c 65 20 6d 61 70 70 69 6e rcs file mappin
0280: 67 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 g.. variable
0290: 63 6d 73 67 20 20 20 3b 20 61 72 72 61 79 20 73 cmsg ; array s
02a0: 65 74 20 63 6d 73 67 20 20 20 7b 7d 20 3b 20 23 et cmsg {} ; #
02b0: 20 43 61 63 68 65 20 6f 66 20 63 6f 6d 6d 69 74 Cache of commit
02c0: 20 6d 65 73 73 61 67 65 73 2e 0a 7d 0a 0a 70 72 messages..}..pr
02d0: 6f 63 20 3a 3a 63 76 73 3a 3a 68 65 78 74 69 6d oc ::cvs::hextim
02e0: 65 20 7b 68 65 78 7d 20 7b 0a 20 20 20 20 73 65 e {hex} {. se
02f0: 74 20 74 20 30 0a 20 20 20 20 66 6f 72 65 61 63 t t 0. foreac
0300: 68 20 64 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 h d [string map
0310: 7b 0a 09 61 20 31 30 20 62 20 31 31 20 63 20 31 {..a 10 b 11 c 1
0320: 32 20 64 20 31 33 20 65 20 31 34 20 66 20 31 35 2 d 13 e 14 f 15
0330: 0a 09 41 20 31 30 20 42 20 31 31 20 43 20 31 32 ..A 10 B 11 C 12
0340: 20 44 20 31 33 20 45 20 31 34 20 46 20 31 35 0a D 13 E 14 F 15.
0350: 20 20 20 20 7d 20 5b 73 70 6c 69 74 20 24 68 65 } [split $he
0360: 78 20 7b 7d 5d 5d 20 7b 0a 09 73 65 74 20 74 20 x {}]] {..set t
0370: 5b 65 78 70 72 20 7b 28 24 74 20 3c 3c 20 34 29 [expr {($t << 4)
0380: 20 2b 20 24 64 7d 5d 3b 23 68 6f 72 6e 65 72 0a + $d}];#horner.
0390: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
03a0: 20 24 74 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 63 76 $t.}..proc ::cv
03b0: 73 3a 3a 61 74 20 7b 70 61 74 68 7d 20 7b 0a 20 s::at {path} {.
03c0: 20 20 20 76 61 72 69 61 62 6c 65 20 62 61 73 65 variable base
03d0: 20 24 70 61 74 68 0a 20 20 20 20 72 65 74 75 72 $path. retur
03e0: 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 63 76 73 3a n.}..proc ::cvs:
03f0: 3a 63 6d 73 67 20 7b 70 61 74 68 20 72 65 76 7d :cmsg {path rev}
0400: 20 7b 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 {. variable
0410: 63 6d 73 67 0a 20 20 20 20 73 65 74 20 6b 65 79 cmsg. set key
0420: 20 5b 6c 69 73 74 20 24 70 61 74 68 20 24 72 65 [list $path $re
0430: 76 5d 0a 0a 20 20 20 20 69 66 20 7b 21 5b 69 6e v].. if {![in
0440: 66 6f 20 65 78 69 73 74 73 20 63 6d 73 67 28 24 fo exists cmsg($
0450: 6b 65 79 29 5d 7d 20 7b 0a 09 73 65 74 20 72 63 key)]} {..set rc
0460: 73 20 5b 63 76 73 3a 3a 72 63 73 66 69 6c 65 20 s [cvs::rcsfile
0470: 24 70 61 74 68 5d 0a 0a 09 23 70 75 74 73 20 73 $path]...#puts s
0480: 74 64 65 72 72 20 22 73 63 61 6e 20 24 70 61 74 tderr "scan $pat
0490: 68 20 3d 3e 20 24 72 63 73 22 0a 0a 09 61 72 72 h => $rcs"...arr
04a0: 61 79 20 73 65 74 20 70 20 5b 3a 3a 72 63 73 70 ay set p [::rcsp
04b0: 61 72 73 65 72 3a 3a 70 72 6f 63 65 73 73 20 24 arser::process $
04c0: 72 63 73 5d 0a 0a 09 66 6f 72 65 61 63 68 20 7b rcs]...foreach {
04d0: 72 20 6d 73 67 7d 20 24 70 28 63 6f 6d 6d 69 74 r msg} $p(commit
04e0: 29 20 7b 0a 09 20 20 20 20 73 65 74 20 63 6d 73 ) {.. set cms
04f0: 67 28 5b 6c 69 73 74 20 24 70 61 74 68 20 24 72 g([list $path $r
0500: 5d 29 20 24 6d 73 67 0a 09 7d 0a 0a 09 69 66 20 ]) $msg..}...if
0510: 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 63 {![info exists c
0520: 6d 73 67 28 24 6b 65 79 29 5d 7d 20 7b 0a 09 20 msg($key)]} {..
0530: 20 20 20 72 65 74 75 72 6e 20 2d 63 6f 64 65 20 return -code
0540: 65 72 72 6f 72 20 22 42 6f 67 75 73 20 72 65 76 error "Bogus rev
0550: 69 73 69 6f 6e 20 24 72 65 76 20 6f 66 20 66 69 ision $rev of fi
0560: 6c 65 20 24 70 61 74 68 22 0a 09 7d 0a 20 20 20 le $path"..}.
0570: 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 24 }.. return $
0580: 63 6d 73 67 28 24 6b 65 79 29 0a 7d 0a 0a 70 72 cmsg($key).}..pr
0590: 6f 63 20 3a 3a 63 76 73 3a 3a 6e 6f 72 6d 20 7b oc ::cvs::norm {
05a0: 70 61 74 68 7d 20 7b 0a 20 20 20 20 76 61 72 69 path} {. vari
05b0: 61 62 6c 65 20 6e 70 61 74 68 73 0a 20 20 20 20 able npaths.
05c0: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 if {![info exist
05d0: 73 20 6e 70 61 74 68 73 28 24 70 61 74 68 29 5d s npaths($path)]
05e0: 7d 20 7b 0a 09 73 65 74 20 6e 70 61 74 68 73 28 } {..set npaths(
05f0: 24 70 61 74 68 29 20 5b 4e 6f 72 6d 46 69 6c 65 $path) [NormFile
0600: 20 24 70 61 74 68 5d 0a 20 20 20 20 7d 0a 20 20 $path]. }.
0610: 20 20 72 65 74 75 72 6e 20 24 6e 70 61 74 68 73 return $npaths
0620: 28 24 70 61 74 68 29 0a 7d 0a 0a 70 72 6f 63 20 ($path).}..proc
0630: 3a 3a 63 76 73 3a 3a 4e 6f 72 6d 46 69 6c 65 20 ::cvs::NormFile
0640: 7b 70 61 74 68 7d 20 7b 0a 20 20 20 20 76 61 72 {path} {. var
0650: 69 61 62 6c 65 20 62 61 73 65 0a 0a 20 20 20 20 iable base..
0660: 73 65 74 20 66 20 24 62 61 73 65 2f 24 70 61 74 set f $base/$pat
0670: 68 2c 76 0a 20 20 20 20 69 66 20 7b 5b 3a 3a 66 h,v. if {[::f
0680: 69 6c 65 20 65 78 69 73 74 73 20 24 66 5d 7d 20 ile exists $f]}
0690: 7b 72 65 74 75 72 6e 20 24 70 61 74 68 7d 0a 0a {return $path}..
06a0: 20 20 20 20 73 65 74 20 68 64 20 5b 3a 3a 66 69 set hd [::fi
06b0: 6c 65 20 64 69 72 6e 61 6d 65 20 24 70 61 74 68 le dirname $path
06c0: 5d 0a 20 20 20 20 73 65 74 20 74 6c 20 5b 3a 3a ]. set tl [::
06d0: 66 69 6c 65 20 74 61 69 6c 20 20 20 20 24 70 61 file tail $pa
06e0: 74 68 5d 0a 0a 20 20 20 20 73 65 74 20 66 20 24 th].. set f $
06f0: 62 61 73 65 2f 24 68 64 2f 41 74 74 69 63 2f 24 base/$hd/Attic/$
0700: 74 6c 2c 76 0a 20 20 20 20 69 66 20 7b 5b 3a 3a tl,v. if {[::
0710: 66 69 6c 65 20 65 78 69 73 74 73 20 24 66 5d 7d file exists $f]}
0720: 20 7b 72 65 74 75 72 6e 20 24 70 61 74 68 7d 0a {return $path}.
0730: 0a 20 20 20 20 23 20 42 61 64 2e 20 54 68 65 20 . # Bad. The
0740: 64 69 72 20 63 61 6e 20 62 65 20 74 72 75 6e 63 dir can be trunc
0750: 61 74 65 64 2c 20 69 2e 65 2e 20 69 74 20 6d 61 ated, i.e. it ma
0760: 79 20 6e 6f 74 20 62 65 20 61 6e 20 65 78 61 63 y not be an exac
0770: 74 0a 20 20 20 20 23 20 73 75 62 64 69 72 65 63 t. # subdirec
0780: 74 6f 72 79 20 6f 66 20 62 61 73 65 2c 20 62 75 tory of base, bu
0790: 74 20 64 65 65 70 65 72 20 69 6e 73 69 64 65 2c t deeper inside,
07a0: 20 77 69 74 68 20 70 61 72 65 6e 74 73 20 62 65 with parents be
07b0: 74 77 65 65 6e 20 69 74 0a 20 20 20 20 23 20 61 tween it. # a
07c0: 6e 64 20 62 61 73 65 20 6c 65 66 74 20 6f 75 74 nd base left out
07d0: 2e 20 45 78 61 6d 70 6c 65 20 28 66 72 6f 6d 20 . Example (from
07e0: 74 68 65 20 74 63 6c 6c 69 62 20 68 69 73 74 6f the tcllib histo
07f0: 72 79 20 66 69 6c 65 29 3a 0a 20 20 20 20 23 0a ry file):. #.
0800: 20 20 20 20 23 20 4d 33 66 31 64 31 32 34 35 7c # M3f1d1245|
0810: 61 66 61 75 70 65 6c 6c 7c 3c 72 65 6d 6f 74 65 afaupell|<remote
0820: 3e 7c 69 70 65 6e 74 72 79 7c 31 2e 32 7c 43 68 >|ipentry|1.2|Ch
0830: 61 6e 67 65 4c 6f 67 0a 20 20 20 20 23 20 54 68 angeLog. # Th
0840: 65 20 63 6f 72 72 65 63 74 20 70 61 74 68 20 69 e correct path i
0850: 73 20 27 74 6b 6c 69 62 2f 6d 6f 64 75 6c 65 73 s 'tklib/modules
0860: 2f 69 70 65 6e 74 72 79 27 2e 0a 20 20 20 20 23 /ipentry'.. #
0870: 20 54 68 69 73 20 77 65 20 68 61 76 65 20 74 6f This we have to
0880: 20 72 65 73 6f 6c 76 65 20 74 6f 6f 2e 0a 0a 20 resolve too...
0890: 20 20 20 23 20 6e 6f 72 6d 61 6c 69 7a 65 20 64 # normalize d
08a0: 61 6e 63 65 20 2d 20 6f 6c 64 20 66 69 6c 65 75 ance - old fileu
08b0: 74 69 6c 2c 20 6d 6f 64 65 72 6e 20 66 69 6c 65 til, modern file
08c0: 75 74 69 6c 20 28 63 76 73 20 68 65 61 64 29 20 util (cvs head)
08d0: 64 6f 65 73 6e 27 74 20 64 6f 20 74 68 61 74 2e doesn't do that.
08e0: 0a 20 20 20 20 73 65 74 20 62 78 20 5b 66 69 6c . set bx [fil
08f0: 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 24 62 61 73 e normalize $bas
0900: 65 5d 0a 20 20 20 20 66 6f 72 65 61 63 68 20 63 e]. foreach c
0910: 20 5b 66 69 6c 65 75 74 69 6c 3a 3a 66 69 6e 64 [fileutil::find
0920: 42 79 50 61 74 74 65 72 6e 20 24 62 78 20 2d 67 ByPattern $bx -g
0930: 6c 6f 62 20 24 68 64 5d 20 7b 0a 09 73 65 74 20 lob $hd] {..set
0940: 63 78 20 5b 66 69 6c 65 75 74 69 6c 3a 3a 73 74 cx [fileutil::st
0950: 72 69 70 50 61 74 68 20 24 62 78 20 24 63 5d 0a ripPath $bx $c].
0960: 09 73 65 74 20 63 20 20 24 62 61 73 65 2f 24 63 .set c $base/$c
0970: 78 0a 0a 09 73 65 74 20 66 20 24 63 2f 24 74 6c x...set f $c/$tl
0980: 2c 76 0a 09 69 66 20 7b 5b 3a 3a 66 69 6c 65 20 ,v..if {[::file
0990: 65 78 69 73 74 73 20 24 66 5d 7d 20 7b 72 65 74 exists $f]} {ret
09a0: 75 72 6e 20 24 63 78 2f 24 74 6c 7d 0a 09 73 65 urn $cx/$tl}..se
09b0: 74 20 66 20 24 63 2f 41 74 74 69 63 2f 24 74 6c t f $c/Attic/$tl
09c0: 2c 76 0a 09 69 66 20 7b 5b 3a 3a 66 69 6c 65 20 ,v..if {[::file
09d0: 65 78 69 73 74 73 20 24 66 5d 7d 20 7b 72 65 74 exists $f]} {ret
09e0: 75 72 6e 20 24 63 78 2f 24 74 6c 7d 0a 20 20 20 urn $cx/$tl}.
09f0: 20 7d 0a 0a 20 20 20 20 70 75 74 73 20 73 74 64 }.. puts std
0a00: 65 72 72 20 3c 24 66 3e 0a 20 20 20 20 72 65 74 err <$f>. ret
0a10: 75 72 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 urn -code error
0a20: 22 55 6e 61 62 6c 65 20 74 6f 20 6c 6f 63 61 74 "Unable to locat
0a30: 65 20 61 63 74 75 61 6c 20 66 69 6c 65 20 66 6f e actual file fo
0a40: 72 20 24 70 61 74 68 22 0a 7d 0a 0a 70 72 6f 63 r $path".}..proc
0a50: 20 3a 3a 63 76 73 3a 3a 72 63 73 66 69 6c 65 20 ::cvs::rcsfile
0a60: 7b 70 61 74 68 7d 20 7b 0a 20 20 20 20 76 61 72 {path} {. var
0a70: 69 61 62 6c 65 20 72 70 61 74 68 73 0a 20 20 20 iable rpaths.
0a80: 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 if {![info exis
0a90: 74 73 20 72 70 61 74 68 73 28 24 70 61 74 68 29 ts rpaths($path)
0aa0: 5d 7d 20 7b 0a 09 73 65 74 20 72 70 61 74 68 73 ]} {..set rpaths
0ab0: 28 24 70 61 74 68 29 20 5b 52 63 73 46 69 6c 65 ($path) [RcsFile
0ac0: 20 24 70 61 74 68 5d 0a 20 20 20 20 7d 0a 20 20 $path]. }.
0ad0: 20 20 72 65 74 75 72 6e 20 24 72 70 61 74 68 73 return $rpaths
0ae0: 28 24 70 61 74 68 29 0a 7d 0a 0a 70 72 6f 63 20 ($path).}..proc
0af0: 3a 3a 63 76 73 3a 3a 52 63 73 46 69 6c 65 20 7b ::cvs::RcsFile {
0b00: 70 61 74 68 7d 20 7b 0a 20 20 20 20 76 61 72 69 path} {. vari
0b10: 61 62 6c 65 20 62 61 73 65 0a 0a 20 20 20 20 73 able base.. s
0b20: 65 74 20 66 20 24 62 61 73 65 2f 24 70 61 74 68 et f $base/$path
0b30: 2c 76 0a 20 20 20 20 69 66 20 7b 5b 3a 3a 66 69 ,v. if {[::fi
0b40: 6c 65 20 65 78 69 73 74 73 20 24 66 5d 7d 20 7b le exists $f]} {
0b50: 72 65 74 75 72 6e 20 24 66 7d 0a 0a 20 20 20 20 return $f}..
0b60: 73 65 74 20 68 64 20 5b 3a 3a 66 69 6c 65 20 64 set hd [::file d
0b70: 69 72 6e 61 6d 65 20 24 70 61 74 68 5d 0a 20 20 irname $path].
0b80: 20 20 73 65 74 20 74 6c 20 5b 3a 3a 66 69 6c 65 set tl [::file
0b90: 20 74 61 69 6c 20 20 20 20 24 70 61 74 68 5d 0a tail $path].
0ba0: 0a 20 20 20 20 73 65 74 20 66 20 24 62 61 73 65 . set f $base
0bb0: 2f 24 68 64 2f 41 74 74 69 63 2f 24 74 6c 2c 76 /$hd/Attic/$tl,v
0bc0: 0a 20 20 20 20 69 66 20 7b 5b 3a 3a 66 69 6c 65 . if {[::file
0bd0: 20 65 78 69 73 74 73 20 24 66 5d 7d 20 7b 72 65 exists $f]} {re
0be0: 74 75 72 6e 20 24 66 7d 0a 0a 20 20 20 20 23 20 turn $f}.. #
0bf0: 57 65 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 We do not have t
0c00: 72 75 6e 63 61 74 65 64 20 64 69 72 65 63 74 6f runcated directo
0c10: 72 69 65 73 20 68 65 72 65 2c 20 61 73 73 75 6d ries here, assum
0c20: 69 6e 67 20 74 68 61 74 20 6f 6e 6c 79 0a 20 20 ing that only.
0c30: 20 20 23 20 6e 6f 72 6d 20 70 61 74 68 73 20 61 # norm paths a
0c40: 72 65 20 66 65 64 20 69 6e 74 6f 20 74 68 69 73 re fed into this
0c50: 20 63 6f 6d 6d 61 6e 64 2e 0a 0a 20 20 20 20 69 command... i
0c60: 66 20 30 20 7b 0a 09 23 20 42 61 64 2e 20 54 68 f 0 {..# Bad. Th
0c70: 65 20 64 69 72 20 63 61 6e 20 62 65 20 74 72 75 e dir can be tru
0c80: 6e 63 61 74 65 64 2c 20 69 2e 65 2e 20 69 74 20 ncated, i.e. it
0c90: 6d 61 79 20 6e 6f 74 20 62 65 20 61 6e 20 65 78 may not be an ex
0ca0: 61 63 74 0a 09 23 20 73 75 62 64 69 72 65 63 74 act..# subdirect
0cb0: 6f 72 79 20 6f 66 20 62 61 73 65 2c 20 62 75 74 ory of base, but
0cc0: 20 64 65 65 70 65 72 20 69 6e 73 69 64 65 2c 20 deeper inside,
0cd0: 77 69 74 68 20 70 61 72 65 6e 74 73 0a 09 23 20 with parents..#
0ce0: 62 65 74 77 65 65 6e 20 69 74 20 61 6e 64 20 62 between it and b
0cf0: 61 73 65 20 6c 65 66 74 20 6f 75 74 2e 20 45 78 ase left out. Ex
0d00: 61 6d 70 6c 65 20 28 66 72 6f 6d 20 74 68 65 20 ample (from the
0d10: 74 63 6c 6c 69 62 0a 09 23 20 68 69 73 74 6f 72 tcllib..# histor
0d20: 79 20 66 69 6c 65 29 3a 0a 09 23 0a 09 23 20 4d y file):..#..# M
0d30: 33 66 31 64 31 32 34 35 7c 61 66 61 75 70 65 6c 3f1d1245|afaupel
0d40: 6c 7c 3c 72 65 6d 6f 74 65 3e 7c 69 70 65 6e 74 l|<remote>|ipent
0d50: 72 79 7c 31 2e 32 7c 43 68 61 6e 67 65 4c 6f 67 ry|1.2|ChangeLog
0d60: 20 54 68 65 0a 09 23 20 63 6f 72 72 65 63 74 20 The..# correct
0d70: 70 61 74 68 20 69 73 20 27 74 6b 6c 69 62 2f 6d path is 'tklib/m
0d80: 6f 64 75 6c 65 73 2f 69 70 65 6e 74 72 79 27 2e odules/ipentry'.
0d90: 20 20 54 68 69 73 20 77 65 20 68 61 76 65 20 74 This we have t
0da0: 6f 0a 09 23 20 72 65 73 6f 6c 76 65 20 74 6f 6f o..# resolve too
0db0: 2e 0a 0a 09 23 20 6e 6f 72 6d 61 6c 69 7a 65 20 ....# normalize
0dc0: 64 61 6e 63 65 20 2d 20 6f 6c 64 20 66 69 6c 65 dance - old file
0dd0: 75 74 69 6c 2c 20 6d 6f 64 65 72 6e 20 66 69 6c util, modern fil
0de0: 65 75 74 69 6c 20 28 63 76 73 20 68 65 61 64 29 eutil (cvs head)
0df0: 0a 09 23 20 64 6f 65 73 6e 27 74 20 64 6f 20 74 ..# doesn't do t
0e00: 68 61 74 2e 0a 09 73 65 74 20 62 78 20 5b 66 69 hat...set bx [fi
0e10: 6c 65 20 6e 6f 72 6d 61 6c 69 7a 65 20 24 62 61 le normalize $ba
0e20: 73 65 5d 0a 09 66 6f 72 65 61 63 68 20 63 20 5b se]..foreach c [
0e30: 66 69 6c 65 75 74 69 6c 3a 3a 66 69 6e 64 42 79 fileutil::findBy
0e40: 50 61 74 74 65 72 6e 20 24 62 78 20 2d 67 6c 6f Pattern $bx -glo
0e50: 62 20 24 68 64 5d 20 7b 0a 09 20 20 20 20 73 65 b $hd] {.. se
0e60: 74 20 63 20 24 62 61 73 65 2f 5b 66 69 6c 65 75 t c $base/[fileu
0e70: 74 69 6c 3a 3a 73 74 72 69 70 50 61 74 68 20 24 til::stripPath $
0e80: 62 78 20 24 63 5d 0a 0a 09 20 20 20 20 73 65 74 bx $c]... set
0e90: 20 66 20 24 63 2f 24 74 6c 2c 76 0a 09 20 20 20 f $c/$tl,v..
0ea0: 20 69 66 20 7b 5b 3a 3a 66 69 6c 65 20 65 78 69 if {[::file exi
0eb0: 73 74 73 20 24 66 5d 7d 20 7b 72 65 74 75 72 6e sts $f]} {return
0ec0: 20 24 66 7d 0a 09 20 20 20 20 73 65 74 20 66 20 $f}.. set f
0ed0: 24 63 2f 41 74 74 69 63 2f 24 74 6c 2c 76 0a 09 $c/Attic/$tl,v..
0ee0: 20 20 20 20 69 66 20 7b 5b 3a 3a 66 69 6c 65 20 if {[::file
0ef0: 65 78 69 73 74 73 20 24 66 5d 7d 20 7b 72 65 74 exists $f]} {ret
0f00: 75 72 6e 20 24 66 7d 0a 09 7d 0a 20 20 20 20 7d urn $f}..}. }
0f10: 0a 0a 20 20 20 20 70 75 74 73 20 73 74 64 65 72 .. puts stder
0f20: 72 20 3c 24 66 3e 0a 20 20 20 20 72 65 74 75 72 r <$f>. retur
0f30: 6e 20 2d 63 6f 64 65 20 65 72 72 6f 72 20 22 55 n -code error "U
0f40: 6e 61 62 6c 65 20 74 6f 20 6c 6f 63 61 74 65 20 nable to locate
0f50: 72 63 73 20 66 69 6c 65 20 66 6f 72 20 24 70 61 rcs file for $pa
0f60: 74 68 22 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 63 76 th".}..proc ::cv
0f70: 73 3a 3a 68 69 73 74 6f 72 79 20 7b 7d 20 7b 0a s::history {} {.
0f80: 20 20 20 20 76 61 72 69 61 62 6c 65 20 62 61 73 variable bas
0f90: 65 0a 20 20 20 20 72 65 74 75 72 6e 20 24 62 61 e. return $ba
0fa0: 73 65 2f 43 56 53 52 4f 4f 54 2f 68 69 73 74 6f se/CVSROOT/histo
0fb0: 72 79 0a 7d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d 2d ry.}..# --------
0fc0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0fe0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
0ff0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1000: 2d 2d 2d 2d 2d 0a 0a 23 20 2d 2d 2d 2d 2d 2d 2d -----..# -------
1010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d ----------------
1050: 2d 2d 2d 2d 2d 2d 0a 0a 63 76 73 3a 3a 61 74 20 ------..cvs::at
1060: 5b 6c 69 6e 64 65 78 20 24 61 72 67 76 20 30 5d [lindex $argv 0]
1070: 0a 0a 23 70 75 74 73 20 5b 3a 3a 63 76 73 3a 3a ..#puts [::cvs::
1080: 6e 6f 72 6d 20 69 70 65 6e 74 72 79 2f 43 68 61 norm ipentry/Cha
1090: 6e 67 65 4c 6f 67 5d 0a 23 65 78 69 74 0a 0a 23 ngeLog].#exit..#
10a0: 63 68 61 6e 67 65 73 65 74 20 73 74 61 74 65 0a changeset state.
10b0: 67 6c 6f 62 61 6c 20 63 73 20 63 73 66 0a 61 72 global cs csf.ar
10c0: 72 61 79 20 73 65 74 20 63 73 20 7b 0a 20 20 20 ray set cs {.
10d0: 20 73 74 61 72 74 20 7b 7d 20 65 6e 64 20 7b 7d start {} end {}
10e0: 20 63 6d 20 7b 7d 0a 20 20 20 20 75 73 72 20 20 cm {}. usr
10f0: 20 7b 7d 20 64 74 20 20 7b 7d 0a 7d 0a 61 72 72 {} dt {}.}.arr
1100: 61 79 20 73 65 74 20 63 73 66 20 7b 7d 0a 0a 70 ay set csf {}..p
1110: 72 6f 63 20 72 68 20 7b 7d 20 7b 0a 20 20 20 20 roc rh {} {.
1120: 67 6c 6f 62 61 6c 20 61 72 67 76 20 63 73 20 63 global argv cs c
1130: 73 66 20 72 65 70 6f 0a 0a 20 20 20 20 73 65 74 sf repo.. set
1140: 20 66 20 5b 6f 70 65 6e 20 5b 63 76 73 3a 3a 68 f [open [cvs::h
1150: 69 73 74 6f 72 79 5d 20 72 5d 0a 0a 20 20 20 20 istory] r]..
1160: 77 68 69 6c 65 20 7b 5b 67 65 74 73 20 24 66 20 while {[gets $f
1170: 6c 69 6e 65 5d 20 3e 3d 20 30 7d 20 7b 0a 09 23 line] >= 0} {..#
1180: 20 44 65 63 6f 64 65 20 6c 69 6e 65 0a 09 66 6f Decode line..fo
1190: 72 65 61 63 68 20 7b 6f 70 20 75 73 72 20 5f 20 reach {op usr _
11a0: 64 69 72 20 72 65 76 20 66 69 6c 65 7d 20 5b 73 dir rev file} [s
11b0: 70 6c 69 74 20 5b 73 74 72 69 6e 67 20 74 72 69 plit [string tri
11c0: 6d 20 24 6c 69 6e 65 5d 20 7c 5d 20 62 72 65 61 m $line] |] brea
11d0: 6b 0a 09 73 65 74 20 74 73 20 5b 63 76 73 3a 3a k..set ts [cvs::
11e0: 68 65 78 74 69 6d 65 20 5b 73 74 72 69 6e 67 20 hextime [string
11f0: 72 61 6e 67 65 20 24 6f 70 20 31 20 65 6e 64 5d range $op 1 end]
1200: 5d 0a 09 73 65 74 20 6f 70 20 5b 73 74 72 69 6e ]..set op [strin
1210: 67 20 69 6e 64 65 78 20 24 6f 70 20 30 5d 0a 0a g index $op 0]..
1220: 09 23 20 46 69 6c 74 65 72 20 6f 75 74 20 69 72 .# Filter out ir
1230: 72 65 6c 65 76 61 6e 74 20 70 61 72 74 73 0a 09 relevant parts..
1240: 69 66 20 7b 24 6f 70 20 65 71 20 22 4f 22 7d 20 if {$op eq "O"}
1250: 63 6f 6e 74 69 6e 75 65 20 3b 20 23 20 63 68 65 continue ; # che
1260: 63 6b 6f 75 74 0a 09 69 66 20 7b 24 6f 70 20 65 ckout..if {$op e
1270: 71 20 22 46 22 7d 20 63 6f 6e 74 69 6e 75 65 20 q "F"} continue
1280: 3b 20 23 20 72 65 6c 65 61 73 65 0a 09 69 66 20 ; # release..if
1290: 7b 24 6f 70 20 65 71 20 22 54 22 7d 20 63 6f 6e {$op eq "T"} con
12a0: 74 69 6e 75 65 20 3b 20 23 20 72 74 61 67 0a 09 tinue ; # rtag..
12b0: 69 66 20 7b 24 6f 70 20 65 71 20 22 57 22 7d 20 if {$op eq "W"}
12c0: 63 6f 6e 74 69 6e 75 65 20 3b 20 23 20 64 65 6c continue ; # del
12d0: 65 74 65 20 6f 6e 20 75 70 64 61 74 65 0a 09 69 ete on update..i
12e0: 66 20 7b 24 6f 70 20 65 71 20 22 55 22 7d 20 63 f {$op eq "U"} c
12f0: 6f 6e 74 69 6e 75 65 20 3b 20 23 20 75 70 64 61 ontinue ; # upda
1300: 74 65 0a 09 69 66 20 7b 24 6f 70 20 65 71 20 22 te..if {$op eq "
1310: 50 22 7d 20 63 6f 6e 74 69 6e 75 65 20 3b 20 23 P"} continue ; #
1320: 20 75 70 64 61 74 65 20 62 79 20 70 61 74 63 68 update by patch
1330: 0a 09 23 69 66 20 7b 24 6f 70 20 65 71 20 22 47 ..#if {$op eq "G
1340: 22 7d 20 63 6f 6e 74 69 6e 75 65 20 3b 20 23 20 "} continue ; #
1350: 6d 65 72 67 65 20 6f 6e 20 75 70 64 61 74 65 20 merge on update
1360: 2d 20 46 55 54 55 52 45 20 2d 20 69 64 65 6e 74 - FUTURE - ident
1370: 69 66 69 65 73 20 6d 65 72 67 65 70 6f 69 6e 74 ifies mergepoint
1380: 73 2e 0a 09 69 66 20 7b 24 6f 70 20 65 71 20 22 s...if {$op eq "
1390: 43 22 7d 20 63 6f 6e 74 69 6e 75 65 20 3b 20 23 C"} continue ; #
13a0: 20 63 6f 6e 66 6c 69 63 74 20 6f 6e 20 75 70 64 conflict on upd
13b0: 61 74 65 20 2d 20 73 2e 61 2e 0a 09 69 66 20 7b ate - s.a...if {
13c0: 24 6f 70 20 65 71 20 22 45 22 7d 20 63 6f 6e 74 $op eq "E"} cont
13d0: 69 6e 75 65 20 3b 20 23 20 65 78 70 6f 72 74 0a inue ; # export.
13e0: 09 23 20 6c 65 66 74 20 74 79 70 65 73 0a 09 23 .# left types..#
13f0: 20 4d 3a 20 63 6f 6d 6d 69 74 0a 09 23 20 41 3a M: commit..# A:
1400: 20 61 64 64 69 74 69 6f 6e 0a 09 23 20 52 3a 20 addition..# R:
1410: 72 65 6d 6f 76 61 6c 0a 0a 09 73 65 74 20 64 66 removal...set df
1420: 20 24 64 69 72 2f 24 66 69 6c 65 0a 09 69 66 20 $dir/$file..if
1430: 7b 5b 6e 65 77 63 73 20 24 6f 70 20 24 75 73 72 {[newcs $op $usr
1440: 20 24 74 73 20 24 72 65 76 20 64 66 20 63 61 75 $ts $rev df cau
1450: 73 65 5d 7d 20 7b 0a 0a 09 20 20 20 20 23 20 4e se]} {... # N
1460: 4f 54 45 20 31 3a 20 43 68 61 6e 67 65 53 65 74 OTE 1: ChangeSet
1470: 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 43 56 53 s containing CVS
1480: 52 4f 4f 54 20 3d 3e 20 72 65 6d 6f 76 65 20 73 ROOT => remove s
1490: 75 63 68 20 66 69 6c 65 73 2e 0a 09 20 20 20 20 uch files...
14a0: 23 20 4e 4f 54 45 20 32 3a 20 45 6d 70 74 79 20 # NOTE 2: Empty
14b0: 63 68 61 6e 67 65 73 65 74 73 2c 20 69 67 6e 6f changesets, igno
14c0: 72 65 2e 0a 0a 09 20 20 20 20 23 63 6f 6d 6d 69 re.... #commi
14d0: 74 0a 09 20 20 20 20 63 73 73 74 61 74 73 0a 0a t.. csstats..
14e0: 09 20 20 20 20 69 66 20 7b 24 63 61 75 73 65 20 . if {$cause
14f0: 65 71 20 22 63 6d 73 67 22 7d 20 7b 0a 73 65 74 eq "cmsg"} {.set
1500: 20 6d 73 67 0a 09 20 20 20 20 7d 20 65 6c 73 65 msg.. } else
1510: 20 7b 0a 73 65 74 20 6d 73 67 20 22 22 0a 09 20 {.set msg ""..
1520: 20 20 20 7d 0a 0a 09 20 20 20 20 69 66 20 7b 24 }... if {$
1530: 63 73 28 65 6e 64 29 20 6e 65 20 22 22 7d 20 7b cs(end) ne ""} {
1540: 0a 09 09 70 75 74 73 20 3d 3d 3d 3d 3d 3d 3d 3d ...puts ========
1550: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1560: 3d 3d 3d 3d 3d 2f 24 63 61 75 73 65 5c 20 64 65 =====/$cause\ de
1570: 6c 74 61 5c 20 5b 65 78 70 72 20 7b 24 74 73 20 lta\ [expr {$ts
1580: 2d 20 24 63 73 28 65 6e 64 29 7d 5d 0a 09 20 20 - $cs(end)}]..
1590: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 70 75 74 } else {...put
15a0: 73 20 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d s ==============
15b0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 2f ===============/
15c0: 24 63 61 75 73 65 0a 09 20 20 20 20 7d 0a 09 20 $cause.. }..
15d0: 20 20 20 63 73 63 6c 65 61 72 0a 09 7d 0a 0a 09 csclear..}...
15e0: 23 20 4e 6f 74 65 3a 20 6e 65 77 63 73 20 6e 6f # Note: newcs no
15f0: 72 6d 61 6c 69 7a 65 73 20 64 66 2c 20 69 6e 20 rmalizes df, in
1600: 63 61 73 65 20 74 68 65 20 6c 6f 67 20 69 6e 66 case the log inf
1610: 6f 72 6d 61 74 69 6f 6e 20 69 73 0a 09 23 20 62 ormation is..# b
1620: 6f 67 75 73 2e 20 53 6f 20 74 68 65 20 64 66 20 ogus. So the df
1630: 68 65 72 65 20 6d 61 79 20 62 65 20 64 69 66 66 here may be diff
1640: 65 72 65 6e 74 20 66 72 6f 6d 20 62 65 66 6f 72 erent from befor
1650: 65 20 6e 65 77 63 73 0a 09 63 73 61 64 64 20 24 e newcs..csadd $
1660: 6f 70 20 24 75 73 72 20 24 74 73 20 24 72 65 76 op $usr $ts $rev
1670: 20 24 64 66 0a 09 23 20 61 70 70 6c 79 20 6d 6f $df..# apply mo
1680: 64 69 66 69 63 61 74 69 6f 6e 20 74 6f 20 77 6f dification to wo
1690: 72 6b 73 70 61 63 65 0a 20 20 20 20 7d 0a 7d 0a rkspace. }.}.
16a0: 0a 70 72 6f 63 20 6e 65 77 63 73 20 7b 6f 70 20 .proc newcs {op
16b0: 75 73 72 20 74 73 20 72 65 76 20 64 66 76 20 72 usr ts rev dfv r
16c0: 76 7d 20 7b 0a 20 20 20 20 67 6c 6f 62 61 6c 20 v} {. global
16d0: 63 73 20 63 73 66 0a 20 20 20 20 75 70 76 61 72 cs csf. upvar
16e0: 20 31 20 24 72 76 20 72 65 61 73 6f 6e 20 24 64 1 $rv reason $d
16f0: 66 76 20 64 66 0a 0a 20 20 20 20 23 20 4c 6f 67 fv df.. # Log
1700: 69 63 20 74 6f 20 64 65 74 65 63 74 20 77 68 65 ic to detect whe
1710: 6e 20 61 20 6e 65 77 20 63 68 61 6e 67 65 20 73 n a new change s
1720: 65 74 20 62 65 67 69 6e 73 2e 20 41 20 6e 65 77 et begins. A new
1730: 20 63 68 61 6e 67 65 20 73 65 74 73 0a 20 20 20 change sets.
1740: 20 23 20 68 61 73 20 73 74 61 72 74 65 64 20 77 # has started w
1750: 69 74 68 20 74 68 65 20 63 75 72 72 65 6e 74 20 ith the current
1760: 65 6e 74 72 79 20 77 68 65 6e 20 74 68 65 20 65 entry when the e
1770: 6e 74 72 79 0a 20 20 20 20 23 0a 20 20 20 20 23 ntry. #. #
1780: 20 31 2e 20 69 73 20 66 6f 72 20 61 20 64 69 66 1. is for a dif
1790: 66 65 72 65 6e 74 20 75 73 65 72 20 74 68 61 6e ferent user than
17a0: 20 74 68 65 20 6c 61 73 74 2e 0a 20 20 20 20 23 the last.. #
17b0: 20 32 2e 20 74 72 69 65 73 20 74 6f 20 61 64 64 2. tries to add
17c0: 20 61 20 66 69 6c 65 20 74 6f 20 74 68 65 20 63 a file to the c
17d0: 68 61 6e 67 65 73 65 74 20 77 68 69 63 68 20 69 hangeset which i
17e0: 73 20 61 6c 72 65 61 64 79 20 70 61 72 74 20 6f s already part o
17f0: 66 20 69 74 2e 0a 20 20 20 20 23 20 33 2e 69 73 f it.. # 3.is
1800: 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 2c 20 61 on the trunk, a
1810: 6e 64 20 74 68 65 20 6c 61 73 74 20 6f 6e 20 61 nd the last on a
1820: 20 62 72 61 6e 63 68 2c 20 6f 72 20 76 69 63 65 branch, or vice
1830: 20 76 65 72 73 61 2e 0a 20 20 20 20 23 20 34 2e versa.. # 4.
1840: 20 74 68 65 20 63 75 72 72 65 6e 74 20 65 6e 74 the current ent
1850: 72 79 20 68 61 73 20 61 20 64 69 66 66 65 72 65 ry has a differe
1860: 6e 74 20 63 6f 6d 6d 69 74 20 6d 65 73 73 61 67 nt commit messag
1870: 65 20 74 68 61 6e 20 74 68 65 20 6c 61 73 74 2e e than the last.
1880: 0a 0a 20 20 20 20 73 65 74 20 64 66 20 5b 63 76 .. set df [cv
1890: 73 3a 3a 6e 6f 72 6d 20 24 64 66 5d 0a 0a 20 20 s::norm $df]..
18a0: 20 20 23 20 55 73 65 72 20 63 68 61 6e 67 65 64 # User changed
18b0: 0a 20 20 20 20 69 66 20 7b 24 75 73 72 20 6e 65 . if {$usr ne
18c0: 20 24 63 73 28 75 73 72 29 7d 20 7b 0a 09 73 65 $cs(usr)} {..se
18d0: 74 20 72 65 61 73 6f 6e 20 75 73 65 72 0a 09 72 t reason user..r
18e0: 65 74 75 72 6e 20 31 0a 20 20 20 20 7d 0a 0a 20 eturn 1. }..
18f0: 20 20 20 23 20 46 69 6c 65 20 69 73 20 61 6c 72 # File is alr
1900: 65 61 64 79 20 69 6e 20 74 68 65 20 63 68 61 6e eady in the chan
1910: 67 65 73 65 74 0a 20 20 20 20 69 66 20 7b 5b 69 geset. if {[i
1920: 6e 66 6f 20 65 78 69 73 74 73 20 63 73 66 28 24 nfo exists csf($
1930: 64 66 29 5d 7d 20 7b 0a 09 73 65 74 20 72 65 61 df)]} {..set rea
1940: 73 6f 6e 20 66 69 6c 65 0a 09 72 65 74 75 72 6e son file..return
1950: 20 31 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 1. }.. #
1960: 6c 61 73 74 2f 63 75 72 72 65 6e 74 20 61 72 65 last/current are
1970: 20 64 69 66 66 65 72 65 6e 74 20 72 65 67 61 72 different regar
1980: 64 69 6e 67 20 74 72 75 6e 6b 2f 62 72 61 6e 63 ding trunk/branc
1990: 68 0a 20 20 20 20 73 65 74 20 64 65 70 74 68 20 h. set depth
19a0: 5b 6c 6c 65 6e 67 74 68 20 5b 73 70 6c 69 74 20 [llength [split
19b0: 24 72 65 76 20 2e 5d 5d 0a 20 20 20 20 69 66 20 $rev .]]. if
19c0: 7b 28 24 63 73 28 6c 61 73 74 64 29 20 3d 3d 20 {($cs(lastd) ==
19d0: 32 29 20 21 3d 20 28 24 64 65 70 74 68 20 3d 3d 2) != ($depth ==
19e0: 20 32 29 7d 20 7b 0a 09 73 65 74 20 72 65 61 73 2)} {..set reas
19f0: 6f 6e 20 62 72 61 6e 63 68 0a 09 72 65 74 75 72 on branch..retur
1a00: 6e 20 31 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 n 1. }.. #
1a10: 20 43 6f 6d 6d 69 74 20 6d 65 73 73 61 67 65 20 Commit message
1a20: 63 68 61 6e 67 65 64 0a 20 20 20 20 69 66 20 7b changed. if {
1a30: 5b 63 76 73 3a 3a 63 6d 73 67 20 24 63 73 28 6c [cvs::cmsg $cs(l
1a40: 61 73 74 66 29 20 24 63 73 28 6c 61 73 74 72 29 astf) $cs(lastr)
1a50: 5d 20 6e 65 20 5b 63 76 73 3a 3a 63 6d 73 67 20 ] ne [cvs::cmsg
1a60: 24 64 66 20 24 72 65 76 5d 7d 20 7b 0a 09 73 65 $df $rev]} {..se
1a70: 74 20 72 65 61 73 6f 6e 20 63 6d 73 67 0a 09 72 t reason cmsg..r
1a80: 65 74 75 72 6e 20 31 0a 20 20 20 20 7d 0a 0a 20 eturn 1. }..
1a90: 20 20 20 23 20 53 61 6d 65 20 63 68 61 6e 67 65 # Same change
1aa0: 73 65 74 0a 20 20 20 20 72 65 74 75 72 6e 20 30 set. return 0
1ab0: 0a 7d 0a 0a 70 72 6f 63 20 63 73 63 6c 65 61 72 .}..proc csclear
1ac0: 20 7b 7d 20 7b 0a 20 20 20 20 67 6c 6f 62 61 6c {} {. global
1ad0: 20 63 73 20 63 73 66 0a 20 20 20 20 61 72 72 61 cs csf. arra
1ae0: 79 20 73 65 74 20 63 73 20 7b 73 74 61 72 74 20 y set cs {start
1af0: 7b 7d 20 75 73 72 20 7b 7d 20 65 6e 64 20 7b 7d {} usr {} end {}
1b00: 20 64 74 20 7b 7d 7d 0a 20 20 20 20 61 72 72 61 dt {}}. arra
1b10: 79 20 75 6e 73 65 74 20 63 73 66 20 2a 0a 20 20 y unset csf *.
1b20: 20 20 72 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 return.}..proc
1b30: 20 63 73 61 64 64 20 7b 6f 70 20 75 73 72 20 74 csadd {op usr t
1b40: 73 20 72 65 76 20 64 66 7d 20 7b 0a 20 20 20 20 s rev df} {.
1b50: 67 6c 6f 62 61 6c 20 63 73 20 63 73 66 0a 0a 20 global cs csf..
1b60: 20 20 20 69 66 20 7b 24 63 73 28 75 73 72 29 20 if {$cs(usr)
1b70: 65 71 20 22 22 7d 20 7b 73 65 74 20 63 73 28 75 eq ""} {set cs(u
1b80: 73 72 29 20 24 75 73 72 7d 0a 20 20 20 20 69 66 sr) $usr}. if
1b90: 20 7b 24 63 73 28 73 74 61 72 74 29 20 65 71 20 {$cs(start) eq
1ba0: 22 22 7d 20 7b 0a 09 73 65 74 20 63 73 28 73 74 ""} {..set cs(st
1bb0: 61 72 74 29 20 24 74 73 0a 20 20 20 20 7d 20 65 art) $ts. } e
1bc0: 6c 73 65 20 7b 0a 09 6c 61 70 70 65 6e 64 20 63 lse {..lappend c
1bd0: 73 28 64 74 29 20 5b 65 78 70 72 20 7b 24 74 73 s(dt) [expr {$ts
1be0: 20 2d 20 24 63 73 28 65 6e 64 29 7d 5d 0a 20 20 - $cs(end)}].
1bf0: 20 20 7d 0a 20 20 20 20 73 65 74 20 63 73 28 65 }. set cs(e
1c00: 6e 64 29 20 24 74 73 0a 0a 20 20 20 20 73 65 74 nd) $ts.. set
1c10: 20 63 73 66 28 24 64 66 29 20 5b 6c 69 73 74 20 csf($df) [list
1c20: 24 6f 70 20 24 72 65 76 5d 0a 20 20 20 20 73 65 $op $rev]. se
1c30: 74 20 63 73 28 6c 61 73 74 66 29 20 24 64 66 0a t cs(lastf) $df.
1c40: 20 20 20 20 73 65 74 20 63 73 28 6c 61 73 74 72 set cs(lastr
1c50: 29 20 24 72 65 76 0a 20 20 20 20 73 65 74 20 63 ) $rev. set c
1c60: 73 28 6c 61 73 74 64 29 20 5b 6c 6c 65 6e 67 74 s(lastd) [llengt
1c70: 68 20 5b 73 70 6c 69 74 20 24 72 65 76 20 2e 5d h [split $rev .]
1c80: 5d 0a 0a 20 20 20 20 70 75 74 73 20 5b 6c 69 73 ].. puts [lis
1c90: 74 20 24 6f 70 20 5b 63 6c 6f 63 6b 20 66 6f 72 t $op [clock for
1ca0: 6d 61 74 20 24 74 73 5d 20 24 75 73 72 20 24 72 mat $ts] $usr $r
1cb0: 65 76 20 24 64 66 5d 0a 20 20 20 20 72 65 74 75 ev $df]. retu
1cc0: 72 6e 0a 7d 0a 0a 70 72 6f 63 20 63 73 73 74 61 rn.}..proc cssta
1cd0: 74 73 20 7b 7d 20 7b 0a 20 20 20 20 67 6c 6f 62 ts {} {. glob
1ce0: 61 6c 20 63 73 20 63 73 66 0a 0a 20 20 20 20 69 al cs csf.. i
1cf0: 66 20 7b 24 63 73 28 73 74 61 72 74 29 20 65 71 f {$cs(start) eq
1d00: 20 22 22 7d 20 72 65 74 75 72 6e 0a 0a 20 20 20 ""} return..
1d10: 20 70 75 74 73 20 22 66 69 6c 65 73 3a 20 5b 61 puts "files: [a
1d20: 72 72 61 79 20 73 69 7a 65 20 63 73 66 5d 22 0a rray size csf]".
1d30: 20 20 20 20 70 75 74 73 20 22 64 65 6c 74 61 3a puts "delta:
1d40: 20 24 63 73 28 64 74 29 22 0a 20 20 20 20 70 75 $cs(dt)". pu
1d50: 74 73 20 22 72 61 6e 67 65 3a 20 5b 65 78 70 72 ts "range: [expr
1d60: 20 7b 24 63 73 28 65 6e 64 29 20 2d 20 24 63 73 {$cs(end) - $cs
1d70: 28 73 74 61 72 74 29 7d 5d 20 73 65 63 6f 6e 64 (start)}] second
1d80: 73 22 0a 20 20 20 20 72 65 74 75 72 6e 0a 7d 0a s". return.}.
1d90: 0a 72 68 0a 0a 65 78 69 74 0a 0a 3d 3d 3d 3d 3d .rh..exit..=====
1da0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1db0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1dc0: 3d 3d 3d 3d 0a 6e 65 77 20 66 6f 73 73 69 6c 0a ====.new fossil.
1dd0: 6e 65 77 20 66 6f 73 73 69 6c 20 77 6f 72 6b 73 new fossil works
1de0: 70 61 63 65 0a 0a 6f 70 65 6e 20 68 69 73 74 6f pace..open histo
1df0: 72 79 0a 0a 66 6f 72 65 61 63 68 20 6c 69 6e 65 ry..foreach line
1e00: 20 7b 0a 20 20 20 20 69 67 6e 6f 72 65 20 75 6e {. ignore un
1e10: 77 61 6e 74 65 64 20 6c 69 6e 65 73 0a 0a 20 20 wanted lines..
1e20: 20 20 61 63 63 75 6d 75 6c 61 74 65 20 63 68 61 accumulate cha
1e30: 6e 67 65 73 65 74 73 20 64 61 74 61 0a 20 20 20 ngesets data.
1e40: 20 6e 65 77 20 63 68 61 6e 67 65 2d 73 65 74 20 new change-set
1e50: 3d 3e 20 63 6f 6d 6d 69 74 20 61 6e 64 20 63 6f => commit and co
1e60: 6e 74 69 6e 75 65 0a 0a 20 20 20 20 63 75 72 72 ntinue.. curr
1e70: 65 6e 74 20 62 72 61 6e 63 68 20 61 6e 64 20 62 ent branch and b
1e80: 72 61 6e 63 68 20 6f 66 20 6e 65 77 20 63 68 61 ranch of new cha
1e90: 6e 67 65 20 64 69 66 66 65 72 65 6e 74 20 3f 0a nge different ?.
1ea0: 20 20 20 20 3d 3e 20 6d 6f 76 65 20 66 6f 73 73 => move foss
1eb0: 69 6c 20 77 6f 72 6b 73 70 61 63 65 20 74 6f 20 il workspace to
1ec0: 70 72 6f 70 65 72 20 72 65 76 69 73 69 6f 6e 2e proper revision.
1ed0: 0a 0a 20 20 20 20 61 70 70 6c 79 20 63 68 61 6e .. apply chan
1ee0: 67 65 20 74 6f 20 77 6f 72 6b 73 70 61 63 65 0a ge to workspace.
1ef0: 20 20 20 20 75 6e 63 6f 6d 6d 69 74 74 65 64 0a uncommitted.
1f00: 7d 0a 0a 69 66 20 75 6e 63 6f 6d 6d 69 74 74 65 }..if uncommitte
1f10: 64 20 3d 3e 20 63 6f 6d 6d 69 74 0a 64 65 6c 65 d => commit.dele
1f20: 74 65 20 77 6f 72 6b 73 70 61 63 65 0a 63 6f 70 te workspace.cop
1f30: 79 20 66 6f 73 73 69 6c 20 72 65 70 6f 20 74 6f y fossil repo to
1f40: 20 64 65 73 74 69 6e 61 74 69 6f 6e 0a 3d 3d 3d destination.===
1f50: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1f60: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1f70: 3d 3d 3d 3d 3d 3d 0a 0a 4e 6f 74 20 64 65 61 6c ======..Not deal
1f80: 74 20 77 69 74 68 20 69 6e 20 6f 75 74 6c 69 6e t with in outlin
1f90: 65 3a 20 62 72 61 6e 63 68 65 73 2c 20 74 61 67 e: branches, tag
1fa0: 73 2c 20 6d 65 72 67 69 6e 67 0a 0a 3d 3d 3d 3d s, merging..====
1fb0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1fc0: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
1fd0: 3d 3d 3d 3d 3d 0a 0a 63 6f 6d 70 6c 65 78 69 74 =====..complexit
1fe0: 69 65 73 0a 2d 20 61 70 70 6c 79 20 74 6f 20 77 ies.- apply to w
1ff0: 6f 72 6b 73 70 61 63 65 0a 20 20 2d 20 72 65 6d orkspace. - rem
2000: 6f 76 65 20 73 69 6d 70 6c 65 2c 20 64 69 72 65 ove simple, dire
2010: 63 74 20 74 72 61 6e 73 6c 61 74 69 6f 6e 0a 20 ct translation.
2020: 20 2d 20 61 64 64 20 3d 3e 20 72 65 71 75 69 72 - add => requir
2030: 65 73 20 65 78 74 72 61 63 74 69 6f 6e 20 6f 66 es extraction of
2040: 20 69 6e 64 69 63 61 74 65 64 20 72 65 76 69 73 indicated revis
2050: 69 6f 6e 20 66 72 6f 6d 20 2c 76 0a 20 20 2d 20 ion from ,v. -
2060: 6d 6f 64 69 66 79 20 3d 3e 20 73 65 65 20 61 62 modify => see ab
2070: 6f 76 65 20 28 77 69 74 68 6f 75 74 20 61 64 64 ove (without add
2080: 20 66 6f 6c 6c 6f 77 69 6e 67 29 0a 0a 2d 20 2c following)..- ,
2090: 76 20 66 69 6c 65 20 3d 3e 20 43 61 6e 20 62 65 v file => Can be
20a0: 20 74 68 65 20 65 69 74 68 65 72 20 64 69 72 2f the either dir/
20b0: 66 69 6c 65 2c 76 2c 20 6f 72 20 64 69 72 2f 41 file,v, or dir/A
20c0: 74 74 69 63 2f 66 69 6c 65 2c 76 0a 20 20 42 6f ttic/file,v. Bo
20d0: 74 68 20 3f 20 50 72 69 6f 72 69 74 79 20 3f 0a th ? Priority ?.
20e0: 0a 2d 20 48 6f 77 20 74 6f 20 64 65 74 65 63 74 .- How to detect
20f0: 20 63 68 61 6e 67 65 73 20 6f 6e 20 62 72 61 6e changes on bran
2100: 63 68 65 73 20 3f 0a 0a 2d 20 48 61 76 65 20 74 ches ?..- Have t
2110: 6f 20 6b 65 65 70 20 6b 6e 6f 77 6c 65 64 67 65 o keep knowledge
2120: 20 6f 66 20 77 68 69 63 68 20 62 72 61 6e 63 68 of which branch
2130: 65 73 20 77 65 6e 74 20 74 68 65 72 65 2e 0a 20 es went there..
2140: 3d 3e 20 73 61 76 65 20 63 68 61 6e 67 65 2d 73 => save change-s
2150: 65 74 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c ets information,
2160: 20 2b 20 75 75 69 64 20 69 6e 20 66 6f 73 73 69 + uuid in fossi
2170: 6c 0a 20 3d 3e 20 6e 65 65 64 20 6f 6e 6c 79 20 l. => need only
2180: 74 68 65 20 6c 65 61 76 65 73 20 6f 66 20 65 61 the leaves of ea
2190: 63 68 20 62 72 61 6e 63 68 2c 20 61 6e 64 20 6f ch branch, and o
21a0: 66 20 62 72 61 6e 63 68 20 70 6f 69 6e 74 73 2e f branch points.
21b0: 0a 20 3d 3e 20 62 65 74 74 65 72 20 6b 65 65 70 . => better keep
21c0: 20 61 6c 6c 20 75 6e 74 69 6c 20 63 6f 6d 70 6c all until compl
21d0: 65 74 65 2e 0a 20 3d 3e 20 75 75 69 64 20 63 61 ete.. => uuid ca
21e0: 6e 20 62 65 20 67 6f 74 74 65 6e 20 66 72 6f 6d n be gotten from
21f0: 20 27 6d 61 6e 69 66 65 73 74 2e 75 75 69 64 27 'manifest.uuid'
2200: 20 69 6e 20 77 6f 72 6b 73 70 61 63 65 2e 0a 2d in workspace..-
2210: 20 6b 65 65 70 20 74 61 67 20 69 6e 66 6f 72 6d keep tag inform
2220: 61 74 69 6f 6e 20 3f 20 28 73 79 6d 62 6f 6c 69 ation ? (symboli
2230: 63 73 29 0a 0a 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d cs)..===========
2240: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d ================
2250: 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 3d 0a 0a ==============..
2260: 43 56 53 52 4f 4f 54 3d 4f 52 49 47 49 4e 0a 0a CVSROOT=ORIGIN..
2270: 63 76 73 20 2d 64 20 4f 52 49 47 49 4e 20 63 68 cvs -d ORIGIN ch
2280: 65 63 6b 6f 75 74 20 2d 72 20 52 45 56 20 46 49 eckout -r REV FI
2290: 4c 45 0a 45 78 74 72 61 63 74 20 73 70 65 63 69 LE.Extract speci
22a0: 66 69 63 20 72 65 76 69 73 69 6f 6e 20 6f 66 20 fic revision of
22b0: 61 20 73 70 65 63 69 66 69 63 20 66 69 6c 65 2e a specific file.
22c0: 0a 2d 71 2c 20 2d 51 20 71 75 69 65 74 6e 65 73 .-q, -Q quietnes
22d0: 73 0a s.