Artifact 41da9ebbf91df4a1e9519f119e17657754b34ed1:
File
tools/lib/cvs_sig.tcl
part of check-in
[72dac950c3]
- Continued work on the import of branches. Main principle now is to handle the branches vertically. First the trunk, then the branch starting with the first unprocessed changeset, and so forth. Looks more promising than the previous approach. Currently handles just a bit over half of the test projects (11 of 21 in 6 repositories).
by
aku on
2007-09-26 05:06:18.
0000: 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 .package require
0010: 20 73 74 72 75 63 74 3a 3a 73 65 74 0a 70 61 63 struct::set.pac
0020: 6b 61 67 65 20 72 65 71 75 69 72 65 20 76 63 3a kage require vc:
0030: 3a 63 76 73 3a 3a 77 73 3a 3a 62 72 61 6e 63 68 :cvs::ws::branch
0040: 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c ..namespace eval
0050: 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a ::vc::cvs::ws::
0060: 73 69 67 3a 3a 62 72 61 6e 63 68 20 7b 0a 20 20 sig::branch {.
0070: 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f namespace impo
0080: 72 74 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 rt ::vc::cvs::ws
0090: 3a 3a 62 72 61 6e 63 68 3a 3a 2a 0a 7d 0a 0a 23 ::branch::*.}..#
00a0: 20 53 61 76 65 20 74 68 65 20 6d 61 70 70 69 6e Save the mappin
00b0: 67 20 66 72 6f 6d 20 63 68 61 6e 67 65 73 65 74 g from changeset
00c0: 73 20 74 6f 20 66 69 6c 65 2f 72 65 76 20 73 69 s to file/rev si
00d0: 67 6e 61 74 75 72 65 73 2c 20 61 6e 64 20 66 75 gnatures, and fu
00e0: 72 74 68 65 72 0a 23 20 72 65 6d 65 6d 62 65 72 rther.# remember
00f0: 20 61 6c 6c 20 74 68 65 20 63 73 65 74 73 20 61 all the csets a
0100: 20 73 70 65 63 69 66 69 63 20 66 69 6c 65 2f 72 specific file/r
0110: 65 76 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 62 ev combination b
0120: 65 6c 6f 6e 67 73 20 74 6f 2e 0a 0a 70 72 6f 63 elongs to...proc
0130: 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a ::vc::cvs::ws::
0140: 73 69 67 3a 3a 64 65 66 20 7b 69 64 20 70 61 72 sig::def {id par
0150: 65 6e 74 20 61 64 64 65 64 20 63 68 61 6e 67 65 ent added change
0160: 64 20 72 65 6d 6f 76 65 64 7d 20 7b 0a 20 20 20 d removed} {.
0170: 20 76 61 72 69 61 62 6c 65 20 73 69 67 0a 20 20 variable sig.
0180: 20 20 76 61 72 69 61 62 6c 65 20 63 73 6c 0a 0a variable csl..
0190: 20 20 20 20 61 72 72 61 79 20 73 65 74 20 6e 65 array set ne
01a0: 77 20 24 73 69 67 28 24 70 61 72 65 6e 74 29 0a w $sig($parent).
01b0: 20 20 20 20 61 72 72 61 79 20 73 65 74 20 6e 65 array set ne
01c0: 77 20 24 61 64 64 65 64 0a 20 20 20 20 61 72 72 w $added. arr
01d0: 61 79 20 73 65 74 20 6e 65 77 20 24 63 68 61 6e ay set new $chan
01e0: 67 65 64 0a 20 20 20 20 66 6f 72 65 61 63 68 20 ged. foreach
01f0: 7b 66 20 72 7d 20 24 72 65 6d 6f 76 65 64 20 7b {f r} $removed {
0200: 63 61 74 63 68 20 7b 75 6e 73 65 74 20 6e 65 77 catch {unset new
0210: 28 24 66 29 7d 7d 0a 20 20 20 20 73 65 74 20 73 ($f)}}. set s
0220: 69 67 28 24 69 64 29 20 5b 44 69 63 74 53 6f 72 ig($id) [DictSor
0230: 74 20 5b 61 72 72 61 79 20 67 65 74 20 6e 65 77 t [array get new
0240: 5d 5d 0a 0a 20 20 20 20 66 6f 72 65 61 63 68 20 ]].. foreach
0250: 7b 66 20 72 7d 20 5b 61 72 72 61 79 20 67 65 74 {f r} [array get
0260: 20 6e 65 77 5d 20 7b 0a 09 6c 61 70 70 65 6e 64 new] {..lappend
0270: 20 63 73 6c 28 24 66 2c 24 72 29 20 24 69 64 0a csl($f,$r) $id.
0280: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
0290: 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 .}..proc ::vc::c
02a0: 76 73 3a 3a 77 73 3a 3a 73 69 67 3a 3a 6e 65 78 vs::ws::sig::nex
02b0: 74 20 7b 69 64 20 61 64 64 65 64 20 63 68 61 6e t {id added chan
02c0: 67 65 64 20 72 65 6d 6f 76 65 64 20 74 61 67 20 ged removed tag
02d0: 74 73 7d 20 7b 0a 20 20 20 20 76 61 72 69 61 62 ts} {. variab
02e0: 6c 65 20 73 69 67 0a 20 20 20 20 61 72 72 61 79 le sig. array
02f0: 20 73 65 74 20 72 65 76 20 24 73 69 67 28 24 69 set rev $sig($i
0300: 64 29 0a 0a 20 20 20 20 66 6f 72 65 61 63 68 20 d).. foreach
0310: 7b 66 20 72 7d 20 5b 63 6f 6e 63 61 74 20 24 63 {f r} [concat $c
0320: 68 61 6e 67 65 64 20 24 72 65 6d 6f 76 65 64 5d hanged $removed]
0330: 20 7b 0a 09 69 66 20 7b 21 5b 69 6e 66 6f 20 65 {..if {![info e
0340: 78 69 73 74 73 20 72 65 76 28 24 66 29 5d 20 7c xists rev($f)] |
0350: 7c 20 21 5b 62 72 61 6e 63 68 3a 3a 73 75 63 63 | ![branch::succ
0360: 65 73 73 6f 72 20 24 72 20 24 72 65 76 28 24 66 essor $r $rev($f
0370: 29 5d 7d 20 7b 0a 09 20 20 20 20 72 65 74 75 72 )]} {.. retur
0380: 6e 20 30 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 n 0..}. }..
0390: 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 if {[llength $
03a0: 61 64 64 65 64 5d 7d 20 7b 0a 09 23 20 43 68 65 added]} {..# Che
03b0: 63 6b 20 74 68 61 74 20 61 64 64 65 64 20 66 69 ck that added fi
03c0: 6c 65 73 20 62 65 6c 6f 6e 67 20 74 6f 20 74 68 les belong to th
03d0: 65 20 62 72 61 6e 63 68 20 74 6f 6f 21 0a 09 69 e branch too!..i
03e0: 66 20 7b 24 74 61 67 20 6e 65 20 5b 62 72 61 6e f {$tag ne [bran
03f0: 63 68 3a 3a 68 61 73 20 24 74 73 20 24 61 64 64 ch::has $ts $add
0400: 65 64 5d 7d 20 7b 0a 09 20 20 20 20 72 65 74 75 ed]} {.. retu
0410: 72 6e 20 30 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 rn 0..}. }.
0420: 20 20 72 65 74 75 72 6e 20 31 0a 7d 0a 0a 0a 70 return 1.}...p
0430: 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 roc ::vc::cvs::w
0440: 73 3a 3a 73 69 67 3a 3a 66 69 6e 64 20 7b 69 64 s::sig::find {id
0450: 20 73 69 67 7d 20 7b 0a 20 20 20 20 73 65 74 20 sig} {. set
0460: 63 73 6c 69 73 74 20 5b 43 75 74 20 24 69 64 20 cslist [Cut $id
0470: 5b 46 69 6e 64 20 24 73 69 67 5d 5d 0a 0a 20 20 [Find $sig]]..
0480: 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 if {[llength $
0490: 63 73 6c 69 73 74 5d 20 3c 20 31 7d 20 7b 0a 09 cslist] < 1} {..
04a0: 70 75 74 73 20 22 4e 4f 20 52 4f 4f 54 22 0a 09 puts "NO ROOT"..
04b0: 23 20 44 65 61 6c 20 68 6f 77 3f 0a 09 23 20 2d # Deal how?..# -
04c0: 20 41 62 6f 72 74 0a 09 23 20 2d 20 49 67 6e 6f Abort..# - Igno
04d0: 72 65 20 74 68 69 73 20 63 68 61 6e 67 65 73 65 re this changese
04e0: 74 20 61 6e 64 20 74 72 79 20 74 68 65 20 6e 65 t and try the ne
04f0: 78 74 20 6f 6e 65 0a 09 23 20 20 20 28 57 68 69 xt one..# (Whi
0500: 63 68 20 68 61 73 20 68 69 67 68 65 72 20 70 72 ch has higher pr
0510: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 6e 6f 74 obability of not
0520: 20 6d 61 74 63 68 69 6e 67 20 61 73 20 69 74 20 matching as it
0530: 6d 69 67 68 74 0a 09 23 20 20 20 20 62 65 20 74 might..# be t
0540: 68 65 20 73 75 63 63 65 73 73 6f 72 20 69 6e 20 he successor in
0550: 74 68 65 20 62 72 61 6e 63 68 20 74 6f 20 74 68 the branch to th
0560: 69 73 20 63 73 65 74 20 61 6e 64 20 6e 6f 74 20 is cset and not
0570: 61 20 62 61 73 65 29 2e 0a 09 65 78 69 74 0a 20 a base)...exit.
0580: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 5b 6c 6c } elseif {[ll
0590: 65 6e 67 74 68 20 24 63 73 6c 69 73 74 5d 20 3e ength $cslist] >
05a0: 20 31 7d 20 7b 0a 09 70 75 74 73 20 22 41 4d 42 1} {..puts "AMB
05b0: 49 47 4f 55 53 2e 20 46 6f 6c 6c 6f 77 69 6e 67 IGOUS. Following
05c0: 20 63 73 65 74 73 20 6d 61 74 63 68 20 72 6f 6f csets match roo
05d0: 74 20 72 65 71 75 69 72 65 6d 65 6e 74 73 3a 22 t requirements:"
05e0: 0a 09 23 20 44 65 61 6c 20 68 6f 77 3f 20 53 2e ..# Deal how? S.
05f0: 61 2e 0a 09 70 75 74 73 20 5c 74 5b 6a 6f 69 6e a...puts \t[join
0600: 20 24 63 73 6c 69 73 74 20 5c 6e 5c 74 5d 0a 09 $cslist \n\t]..
0610: 65 78 69 74 0a 20 20 20 20 7d 0a 0a 20 20 20 20 exit. }..
0620: 73 65 74 20 72 20 5b 6c 69 6e 64 65 78 20 24 63 set r [lindex $c
0630: 73 6c 69 73 74 20 30 5d 0a 20 20 20 20 23 70 75 slist 0]. #pu
0640: 74 73 20 22 52 4f 4f 54 20 3d 20 24 72 22 0a 20 ts "ROOT = $r".
0650: 20 20 20 72 65 74 75 72 6e 20 24 72 0a 7d 0a 0a return $r.}..
0660: 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a proc ::vc::cvs::
0670: 77 73 3a 3a 73 69 67 3a 3a 43 75 74 20 7b 69 64 ws::sig::Cut {id
0680: 20 63 73 6c 69 73 74 7d 20 7b 0a 20 20 20 20 23 cslist} {. #
0690: 20 43 68 61 6e 67 65 73 65 74 73 20 68 61 76 65 Changesets have
06a0: 20 74 6f 20 62 65 20 62 65 66 6f 72 65 20 69 64 to be before id
06b0: 21 20 54 68 69 73 20 6d 61 6b 65 73 20 66 6f 72 ! This makes for
06c0: 20 61 6e 6f 74 68 65 72 0a 20 20 20 20 23 20 69 another. # i
06d0: 6e 74 65 72 73 65 63 74 69 6f 6e 2c 20 70 72 6f ntersection, pro
06e0: 67 72 61 6d 6d 61 74 69 63 2e 0a 0a 20 20 20 20 grammatic...
06f0: 73 65 74 20 72 65 73 20 7b 7d 0a 20 20 20 20 66 set res {}. f
0700: 6f 72 65 61 63 68 20 63 20 24 63 73 6c 69 73 74 oreach c $cslist
0710: 20 7b 0a 09 69 66 20 7b 24 63 20 3e 3d 20 24 69 {..if {$c >= $i
0720: 64 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 6c 61 70 d} continue..lap
0730: 70 65 6e 64 20 72 65 73 20 24 63 0a 20 20 20 20 pend res $c.
0740: 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 }. return $re
0750: 73 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a s.}..proc ::vc::
0760: 63 76 73 3a 3a 77 73 3a 3a 73 69 67 3a 3a 46 69 cvs::ws::sig::Fi
0770: 6e 64 20 7b 73 69 67 7d 20 7b 0a 20 20 20 20 23 nd {sig} {. #
0780: 20 4c 6f 63 61 74 65 20 61 6c 6c 20 63 68 61 6e Locate all chan
0790: 67 65 73 65 74 73 20 77 68 69 63 68 20 63 6f 6e gesets which con
07a0: 74 61 69 6e 20 74 68 65 20 67 69 76 65 6e 20 73 tain the given s
07b0: 69 67 6e 61 74 75 72 65 2e 0a 20 20 20 20 76 61 ignature.. va
07c0: 72 69 61 62 6c 65 20 63 73 6c 0a 0a 20 20 20 20 riable csl..
07d0: 73 65 74 20 72 65 73 20 7b 7d 0a 20 20 20 20 73 set res {}. s
07e0: 65 74 20 66 69 72 73 74 20 31 0a 20 20 20 20 66 et first 1. f
07f0: 6f 72 65 61 63 68 20 7b 66 20 72 7d 20 24 73 69 oreach {f r} $si
0800: 67 20 7b 0a 09 23 70 75 74 73 20 24 66 2f 24 72 g {..#puts $f/$r
0810: 3f 0a 09 23 20 55 6e 6b 6e 6f 77 6e 20 66 69 6c ?..# Unknown fil
0820: 65 20 6e 6f 74 20 75 73 65 64 20 61 6e 79 77 68 e not used anywh
0830: 65 72 65 0a 09 69 66 20 7b 21 5b 69 6e 66 6f 20 ere..if {![info
0840: 65 78 69 73 74 73 20 63 73 6c 28 24 66 2c 24 72 exists csl($f,$r
0850: 29 5d 7d 20 7b 72 65 74 75 72 6e 20 7b 7d 7d 0a )]} {return {}}.
0860: 09 70 75 74 73 20 24 66 2f 24 72 5c 74 3d 5c 74 .puts $f/$r\t=\t
0870: 28 24 63 73 6c 28 24 66 2c 24 72 29 29 2a 28 24 ($csl($f,$r))*($
0880: 72 65 73 29 2f 24 66 69 72 73 74 0a 0a 09 69 66 res)/$first...if
0890: 20 7b 24 66 69 72 73 74 7d 20 7b 0a 09 20 20 20 {$first} {..
08a0: 20 73 65 74 20 72 65 73 20 24 63 73 6c 28 24 66 set res $csl($f
08b0: 2c 24 72 29 0a 09 20 20 20 20 73 65 74 20 66 69 ,$r).. set fi
08c0: 72 73 74 20 30 0a 09 20 20 20 20 23 70 75 74 73 rst 0.. #puts
08d0: 20 46 28 24 72 65 73 29 0a 09 7d 20 65 6c 73 65 F($res)..} else
08e0: 20 7b 0a 09 20 20 20 20 73 65 74 20 6e 65 77 20 {.. set new
08f0: 5b 73 74 72 75 63 74 3a 3a 73 65 74 20 69 6e 74 [struct::set int
0900: 65 72 73 65 63 74 20 24 72 65 73 20 24 63 73 6c ersect $res $csl
0910: 28 24 66 2c 24 72 29 5d 0a 09 20 20 20 20 73 65 ($f,$r)].. se
0920: 74 20 72 76 20 24 72 0a 09 20 20 20 20 77 68 69 t rv $r.. whi
0930: 6c 65 20 7b 21 5b 6c 6c 65 6e 67 74 68 20 24 6e le {![llength $n
0940: 65 77 5d 7d 20 7b 0a 09 09 23 20 41 73 73 75 6d ew]} {...# Assum
0950: 65 20 74 68 61 74 20 74 68 65 20 70 72 6f 62 6c e that the probl
0960: 65 6d 20 66 69 6c 65 20 77 61 73 20 61 64 64 65 em file was adde
0970: 64 20 61 6e 64 20 61 73 20 73 75 63 68 0a 09 09 d and as such...
0980: 23 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 # does not exist
0990: 20 79 65 74 20 61 74 20 74 68 65 20 72 6f 6f 74 yet at the root
09a0: 20 72 65 76 69 73 69 6f 6e 2e 20 48 6f 77 65 76 revision. Howev
09b0: 65 72 20 69 74 73 0a 09 09 23 20 72 6f 6f 74 20 er its...# root
09c0: 73 68 6f 75 6c 64 20 65 78 69 73 74 2c 20 61 6e should exist, an
09d0: 64 20 73 6f 6d 65 20 70 6f 69 6e 74 2e 0a 0a 09 d some point....
09e0: 20 20 20 20 20 20 20 73 65 74 20 72 76 20 5b 62 set rv [b
09f0: 72 61 6e 63 68 3a 3a 72 65 76 72 6f 6f 74 20 24 ranch::revroot $
0a00: 72 76 5d 0a 09 20 20 20 20 20 20 20 69 66 20 7b rv].. if {
0a10: 24 72 76 20 65 71 20 22 22 7d 20 7b 0a 09 09 20 $rv eq ""} {...
0a20: 20 20 70 75 74 73 20 42 52 45 41 4b 2f 5c 74 28 puts BREAK/\t(
0a30: 24 66 5c 20 24 72 29 0a 09 09 20 20 20 65 78 69 $f\ $r)... exi
0a40: 74 0a 09 20 20 20 20 20 20 20 7d 0a 09 20 20 20 t.. }..
0a50: 20 20 20 20 69 66 20 7b 21 5b 69 6e 66 6f 20 65 if {![info e
0a60: 78 69 73 74 73 20 63 73 6c 28 24 66 2c 24 72 76 xists csl($f,$rv
0a70: 29 5d 7d 20 7b 72 65 74 75 72 6e 20 7b 7d 7d 0a )]} {return {}}.
0a80: 09 20 20 20 20 20 20 20 23 70 75 74 73 20 24 66 . #puts $f
0a90: 2f 24 72 5c 74 3d 5c 74 28 24 63 73 6c 28 24 66 /$r\t=\t($csl($f
0aa0: 2c 24 72 76 29 29 0a 09 20 20 20 20 20 20 20 73 ,$rv)).. s
0ab0: 65 74 20 6e 65 77 20 5b 73 74 72 75 63 74 3a 3a et new [struct::
0ac0: 73 65 74 20 69 6e 74 65 72 73 65 63 74 20 24 72 set intersect $r
0ad0: 65 73 20 24 63 73 6c 28 24 66 2c 24 72 76 29 5d es $csl($f,$rv)]
0ae0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73 65 74 .. }.. set
0af0: 20 72 65 73 20 24 6e 65 77 0a 09 20 20 20 20 23 res $new.. #
0b00: 70 75 74 73 20 52 28 24 72 65 73 29 0a 09 20 20 puts R($res)..
0b10: 20 20 23 69 66 20 7b 21 5b 6c 6c 65 6e 67 74 68 #if {![llength
0b20: 20 24 72 65 73 5d 7d 20 7b 72 65 74 75 72 6e 20 $res]} {return
0b30: 7b 7d 7d 0a 09 7d 0a 20 20 20 20 7d 0a 20 20 20 {}}..}. }.
0b40: 20 72 65 74 75 72 6e 20 24 72 65 73 0a 7d 0a 0a return $res.}..
0b50: 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a proc ::vc::cvs::
0b60: 77 73 3a 3a 73 69 67 3a 3a 44 69 63 74 53 6f 72 ws::sig::DictSor
0b70: 74 20 7b 64 69 63 74 7d 20 7b 0a 20 20 20 20 61 t {dict} {. a
0b80: 72 72 61 79 20 73 65 74 20 61 20 24 64 69 63 74 rray set a $dict
0b90: 0a 20 20 20 20 73 65 74 20 72 20 7b 7d 0a 20 20 . set r {}.
0ba0: 20 20 66 6f 72 65 61 63 68 20 6b 20 5b 6c 73 6f foreach k [lso
0bb0: 72 74 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 rt [array names
0bc0: 61 5d 5d 20 7b 0a 09 6c 61 70 70 65 6e 64 20 72 a]] {..lappend r
0bd0: 20 24 6b 20 24 61 28 24 6b 29 0a 20 20 20 20 7d $k $a($k). }
0be0: 0a 20 20 20 20 72 65 74 75 72 6e 20 24 72 0a 7d . return $r.}
0bf0: 0a 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61 ...namespace eva
0c00: 6c 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a l ::vc::cvs::ws:
0c10: 3a 73 69 67 20 7b 0a 20 20 20 20 76 61 72 69 61 :sig {. varia
0c20: 62 6c 65 20 20 73 69 67 20 3b 20 23 20 63 73 65 ble sig ; # cse
0c30: 74 20 69 64 20 2d 3e 20 73 69 67 6e 61 74 75 72 t id -> signatur
0c40: 65 0a 20 20 20 20 61 72 72 61 79 20 73 65 74 20 e. array set
0c50: 73 69 67 20 7b 7b 7d 20 7b 7d 7d 0a 20 20 20 20 sig {{} {}}.
0c60: 76 61 72 69 61 62 6c 65 20 20 63 73 6c 20 3b 20 variable csl ;
0c70: 23 20 66 69 6c 65 20 78 20 72 65 76 20 2d 3e 20 # file x rev ->
0c80: 6c 69 73 74 20 28 63 73 65 74 20 69 64 29 0a 20 list (cset id).
0c90: 20 20 20 61 72 72 61 79 20 73 65 74 20 63 73 6c array set csl
0ca0: 20 7b 7d 0a 0a 20 20 20 20 6e 61 6d 65 73 70 61 {}.. namespa
0cb0: 63 65 20 65 78 70 6f 72 74 20 64 65 66 20 66 69 ce export def fi
0cc0: 6e 64 20 6e 65 78 74 0a 7d 0a 0a 70 61 63 6b 61 nd next.}..packa
0cd0: 67 65 20 70 72 6f 76 69 64 65 20 76 63 3a 3a 63 ge provide vc::c
0ce0: 76 73 3a 3a 77 73 3a 3a 73 69 67 20 31 2e 30 0a vs::ws::sig 1.0.
0cf0: 72 65 74 75 72 6e 0a return.