Artifact 152bdf41973ec4de636bd8b13508e22d01293e0a:
File
tools/lib/cvs_branch.tcl
part of check-in
[7a64b9e738]
- CVS import. First, fixed sig::next regarding two things. One, we have to take the root version of a file into account as a possible predecessor. Two, a missing changed file may be misclassified and actually be added instead. Second, modified the search for a root changeset of a branch. We now try the existing regular intersection first for exactness, and in case of failure we fall back to a voting scheme to locate the most acceptable aka non-conflicting changeset.
by
aku on
2007-09-27 04:44:19.
0000: 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c ..namespace eval
0010: 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a ::vc::cvs::ws::
0020: 62 72 61 6e 63 68 20 7b 7d 0a 0a 23 20 54 72 69 branch {}..# Tri
0030: 76 69 61 6c 20 73 74 6f 72 61 67 65 20 6f 66 20 vial storage of
0040: 61 6c 6c 20 62 72 61 6e 63 68 20 64 61 74 61 20 all branch data
0050: 61 73 20 61 20 72 65 63 74 61 6e 67 75 6c 61 72 as a rectangular
0060: 20 74 61 62 6c 65 2e 20 20 57 65 20 63 61 6e 0a table. We can.
0070: 23 20 74 68 69 6e 6b 20 75 70 20 61 20 62 65 74 # think up a bet
0080: 74 65 72 20 73 75 69 74 65 64 20 73 74 6f 72 61 ter suited stora
0090: 67 65 20 73 79 73 74 65 6d 20 6c 61 74 65 72 2c ge system later,
00a0: 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20 77 68 when we know wh
00b0: 61 74 0a 23 20 74 79 70 65 20 6f 66 20 71 75 65 at.# type of que
00c0: 72 69 65 73 20 61 72 65 20 6d 61 64 65 20 74 6f ries are made to
00d0: 20 74 68 69 73 20 6d 6f 64 75 6c 65 2e 0a 0a 70 this module...p
00e0: 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a 77 roc ::vc::cvs::w
00f0: 73 3a 3a 62 72 61 6e 63 68 3a 3a 64 65 66 20 7b s::branch::def {
0100: 66 20 64 76 20 64 65 66 6c 69 73 74 7d 20 7b 0a f dv deflist} {.
0110: 20 20 20 20 75 70 76 61 72 20 31 20 24 64 76 20 upvar 1 $dv
0120: 64 61 74 65 0a 20 20 20 20 76 61 72 69 61 62 6c date. variabl
0130: 65 20 62 72 61 0a 20 20 20 20 66 6f 72 65 61 63 e bra. foreac
0140: 68 20 7b 74 61 67 20 72 65 76 7d 20 24 64 65 66 h {tag rev} $def
0150: 6c 69 73 74 20 7b 0a 09 23 20 69 67 6e 6f 72 65 list {..# ignore
0160: 20 6e 6f 6e 2d 62 72 61 6e 63 68 20 74 61 67 73 non-branch tags
0170: 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 5b ..if {[llength [
0180: 73 70 6c 69 74 20 24 72 65 76 20 2e 5d 5d 20 3c split $rev .]] <
0190: 20 34 7d 20 63 6f 6e 74 69 6e 75 65 0a 0a 09 69 4} continue...i
01a0: 66 20 30 20 7b 0a 09 20 20 20 20 69 66 20 7b 20 f 0 {.. if {
01b0: 28 24 72 65 76 20 6e 65 20 22 31 2e 31 2e 31 2e ($rev ne "1.1.1.
01c0: 31 22 29 20 26 26 20 21 5b 73 74 72 69 6e 67 20 1") && ![string
01d0: 6d 61 74 63 68 20 2a 2e 30 2e 32 20 24 72 65 76 match *.0.2 $rev
01e0: 5d 20 7d 20 7b 0a 09 09 23 20 31 2e 31 2e 31 2e ] } {...# 1.1.1.
01f0: 31 20 69 73 20 74 68 65 20 62 61 73 65 20 6f 66 1 is the base of
0200: 20 76 65 6e 64 6f 72 20 62 72 61 6e 63 68 65 73 vendor branches
0210: 2c 20 75 73 75 61 6c 6c 79 2e 20 2a 2e 30 2e 79 , usually. *.0.y
0220: 0a 09 09 23 20 69 73 20 74 68 65 20 62 61 73 65 ...# is the base
0230: 20 6f 66 20 72 65 67 75 6c 61 72 20 62 72 61 6e of regular bran
0240: 63 68 65 73 20 77 68 65 72 65 20 6e 6f 74 68 69 ches where nothi
0250: 6e 67 20 69 73 20 6f 6e 20 74 68 65 0a 09 09 23 ng is on the...#
0260: 20 62 72 61 6e 63 68 20 79 65 74 2c 20 6f 6e 6c branch yet, onl
0270: 79 20 69 74 73 20 72 6f 6f 74 20 69 73 20 6d 61 y its root is ma
0280: 72 6b 65 64 2e 20 45 76 65 72 79 74 68 69 6e 67 rked. Everything
0290: 20 65 6c 73 65 20 69 73 0a 09 09 23 20 6e 6f 74 else is...# not
02a0: 65 77 6f 72 74 68 79 20 66 6f 72 20 6e 6f 77 2e eworthy for now.
02b0: 0a 09 09 70 75 74 73 20 24 66 2f 24 72 65 76 2f ...puts $f/$rev/
02c0: 24 74 61 67 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a $tag.. }..}..
02d0: 09 73 65 74 20 72 6f 6f 74 20 5b 72 65 76 72 6f .set root [revro
02e0: 6f 74 20 24 72 65 76 5d 0a 09 6c 61 70 70 65 6e ot $rev]..lappen
02f0: 64 20 62 72 61 20 5b 6c 69 73 74 20 24 64 61 74 d bra [list $dat
0300: 65 28 24 72 6f 6f 74 29 20 24 74 61 67 20 24 66 e($root) $tag $f
0310: 20 24 72 65 76 5d 0a 20 20 20 20 7d 0a 7d 0a 0a $rev]. }.}..
0320: 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a proc ::vc::cvs::
0330: 77 73 3a 3a 62 72 61 6e 63 68 3a 3a 72 65 76 72 ws::branch::revr
0340: 6f 6f 74 20 7b 72 65 76 7d 20 7b 0a 20 20 20 20 oot {rev} {.
0350: 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 20 5b 6c 72 return [join [lr
0360: 61 6e 67 65 20 5b 73 70 6c 69 74 20 24 72 65 76 ange [split $rev
0370: 20 2e 5d 20 30 20 65 6e 64 2d 32 5d 20 2e 5d 0a .] 0 end-2] .].
0380: 7d 0a 0a 0a 20 20 20 20 23 20 21 20 46 69 6c 65 }... # ! File
0390: 73 20 69 6e 20 61 20 62 72 61 6e 63 68 20 63 61 s in a branch ca
03a0: 6e 20 61 70 70 65 61 72 20 6f 6e 6c 79 20 61 66 n appear only af
03b0: 74 65 72 20 74 68 65 69 72 20 72 6f 6f 74 20 72 ter their root r
03c0: 65 76 69 73 69 6f 6e 0a 20 20 20 20 23 20 20 20 evision. #
03d0: 65 78 69 73 74 73 2e 20 54 68 69 73 20 63 61 6e exists. This can
03e0: 20 62 65 20 63 68 65 63 6b 65 64 20 61 67 61 69 be checked agai
03f0: 6e 73 74 20 74 68 65 20 74 69 6d 65 20 6f 66 20 nst the time of
0400: 74 68 65 20 63 73 65 74 20 77 68 69 63 68 0a 20 the cset which.
0410: 20 20 20 23 20 20 20 69 73 20 6f 75 72 20 62 61 # is our ba
0420: 73 65 2e 20 42 72 61 6e 63 68 65 73 20 77 68 69 se. Branches whi
0430: 63 68 20 68 61 76 65 20 6e 6f 20 66 69 6c 65 73 ch have no files
0440: 20 79 65 74 20 63 61 6e 20 62 65 20 65 6c 69 6d yet can be elim
0450: 69 6e 61 74 65 64 0a 20 20 20 20 23 20 20 20 66 inated. # f
0460: 72 6f 6d 20 63 6f 6e 73 69 64 65 72 61 74 69 6f rom consideratio
0470: 6e 2e 0a 0a 20 20 20 20 23 20 21 20 41 6c 6c 20 n... # ! All
0480: 66 69 6c 65 73 20 6e 6f 74 65 64 20 62 79 20 74 files noted by t
0490: 68 65 20 62 61 73 65 20 63 73 65 74 20 61 73 20 he base cset as
04a0: 61 64 64 65 64 2f 6d 6f 64 69 66 69 65 64 20 68 added/modified h
04b0: 61 76 65 20 74 6f 20 62 65 0a 20 20 20 20 23 20 ave to be. #
04c0: 20 20 69 6e 20 74 68 65 20 62 72 61 6e 63 68 20 in the branch
04d0: 72 6f 6f 74 2e 20 42 72 61 6e 63 68 65 73 20 77 root. Branches w
04e0: 68 69 63 68 20 64 6f 20 6e 6f 74 20 68 61 76 65 hich do not have
04f0: 20 73 75 63 68 20 61 20 66 69 6c 65 20 63 61 6e such a file can
0500: 0a 20 20 20 20 23 20 20 20 62 65 20 65 6c 69 6d . # be elim
0510: 69 6e 61 74 65 64 20 66 72 6f 6d 20 63 6f 6e 73 inated from cons
0520: 69 64 65 72 61 74 69 6f 6e 2e 0a 0a 20 20 20 20 ideration...
0530: 23 20 21 20 54 68 65 20 76 65 72 73 69 6f 6e 73 # ! The versions
0540: 20 6f 66 20 74 68 65 20 61 64 64 65 64 2f 6d 6f of the added/mo
0550: 64 69 66 69 65 64 20 66 69 6c 65 73 20 69 6e 20 dified files in
0560: 74 68 65 20 62 61 73 65 20 68 61 76 65 0a 20 20 the base have.
0570: 20 20 23 20 20 20 6d 61 74 63 68 20 74 68 65 20 # match the
0580: 76 65 72 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 versions in the
0590: 62 72 61 6e 63 68 20 72 6f 6f 74 2e 20 49 6e 20 branch root. In
05a0: 74 68 65 20 73 65 6e 73 65 20 74 68 61 74 20 74 the sense that t
05b0: 68 65 79 0a 20 20 20 20 23 20 20 20 68 61 76 65 hey. # have
05c0: 20 74 6f 20 62 65 20 65 71 75 61 6c 20 6f 72 20 to be equal or
05d0: 73 75 63 65 73 73 6f 72 73 2e 20 54 68 65 20 6c sucessors. The l
05e0: 61 74 65 72 20 69 6d 70 6c 69 65 73 20 69 64 65 ater implies ide
05f0: 6e 74 69 74 79 20 69 6e 20 74 68 65 0a 20 20 20 ntity in the.
0600: 20 23 20 20 20 75 70 70 65 72 20 70 61 72 74 73 # upper parts
0610: 20 28 6f 6e 6c 79 20 74 68 65 20 6c 61 73 74 20 (only the last
0620: 32 20 70 61 72 74 73 20 61 72 65 20 72 65 6c 65 2 parts are rele
0630: 76 61 6e 74 29 2c 20 61 6e 64 20 65 71 75 61 6c vant), and equal
0640: 0a 20 20 20 20 23 20 20 20 6c 65 6e 67 74 68 2e . # length.
0650: 0a 0a 20 20 20 20 23 20 54 68 69 73 20 67 69 76 .. # This giv
0660: 65 73 20 75 73 20 74 68 65 20 62 72 61 6e 63 68 es us the branch
0670: 2c 20 61 6e 64 2c 20 64 75 65 20 74 6f 20 74 68 , and, due to th
0680: 65 20 74 69 6d 65 20 69 6e 66 6f 72 6d 61 74 69 e time informati
0690: 6f 6e 20 61 0a 20 20 20 20 23 20 73 69 67 6e 61 on a. # signa
06a0: 74 75 72 65 20 66 6f 72 20 74 68 65 20 72 6f 6f ture for the roo
06b0: 74 2e 0a 0a 20 20 20 20 23 3f 20 43 61 6e 20 73 t... #? Can s
06c0: 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 72 6f earch for the ro
06d0: 6f 74 20 62 61 73 65 64 20 6f 6e 20 74 68 69 73 ot based on this
06e0: 20 73 69 67 6e 61 74 75 72 65 20 66 61 69 6c 20 signature fail
06f0: 3f 0a 20 20 20 20 23 20 20 59 65 73 2e 20 42 65 ?. # Yes. Be
0700: 63 61 75 73 65 20 74 68 65 20 73 69 67 6e 61 74 cause the signat
0710: 75 72 65 20 6d 61 79 20 63 6f 6e 74 61 69 6e 20 ure may contain
0720: 66 69 6c 65 73 20 77 68 69 63 68 20 77 65 72 65 files which were
0730: 20 6e 6f 74 0a 20 20 20 20 23 20 20 61 63 74 75 not. # actu
0740: 61 6c 6c 79 20 79 65 74 20 69 6e 20 74 68 65 20 ally yet in the
0750: 72 6f 6f 74 2c 20 64 65 73 70 69 74 65 20 62 65 root, despite be
0760: 69 6e 67 20 61 62 6c 65 20 74 6f 2e 20 41 6e 64 ing able to. And
0770: 20 77 68 69 63 68 20 77 65 72 65 0a 20 20 20 20 which were.
0780: 23 20 20 6e 6f 74 20 6d 6f 64 69 66 69 65 64 20 # not modified
0790: 62 79 20 74 68 65 20 62 61 73 65 2c 20 73 6f 20 by the base, so
07a0: 74 68 65 20 63 68 65 63 6b 20 32 20 61 62 6f 76 the check 2 abov
07b0: 65 20 73 74 69 6c 6c 20 70 61 73 73 65 73 2e 0a e still passes..
07c0: 0a 20 20 20 20 23 20 2d 3e 20 53 65 61 72 63 68 . # -> Search
07d0: 20 66 6f 72 20 74 68 65 20 66 75 6c 6c 20 73 69 for the full si
07e0: 67 6e 61 74 75 72 65 20 66 69 72 73 74 2c 20 74 gnature first, t
07f0: 68 65 6e 20 64 72 6f 70 20 74 68 65 20 79 6f 75 hen drop the you
0800: 6e 67 65 73 74 0a 20 20 20 20 23 20 66 69 6c 65 ngest. # file
0810: 73 2c 20 73 65 61 72 63 68 20 61 67 61 69 6e 20 s, search again
0820: 75 6e 74 69 6c 20 6d 61 74 63 68 2e 20 43 68 65 until match. Che
0830: 63 6b 20 74 68 65 20 72 65 73 75 6c 74 20 61 67 ck the result ag
0840: 61 69 6e 73 74 20 74 68 65 0a 20 20 20 20 23 20 ainst the. #
0850: 62 61 73 65 2c 20 74 68 61 74 20 61 6c 6c 20 6e base, that all n
0860: 65 65 64 65 64 20 66 69 6c 65 73 20 61 72 65 20 eeded files are
0870: 70 72 65 73 65 6e 74 2e 0a 0a 20 20 20 20 23 20 present... #
0880: 48 6f 77 65 76 65 72 20 2d 20 43 61 6e 20 73 65 However - Can se
0890: 61 72 63 68 20 66 6f 72 20 74 68 65 20 72 6f 6f arch for the roo
08a0: 74 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 63 t based on the c
08b0: 73 65 74 20 64 61 74 61 20 28 6e 65 65 64 65 64 set data (needed
08c0: 0a 20 20 20 20 23 20 66 69 6c 65 73 29 2e 20 47 . # files). G
08d0: 69 76 65 73 20 75 73 20 61 6e 6f 74 68 65 72 20 ives us another
08e0: 73 65 74 20 6f 66 20 63 61 6e 64 69 64 61 74 65 set of candidate
08f0: 20 72 6f 6f 74 73 2e 20 49 6e 74 65 72 73 65 63 roots. Intersec
0900: 74 21 0a 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a t!...proc ::vc::
0910: 63 76 73 3a 3a 77 73 3a 3a 62 72 61 6e 63 68 3a cvs::ws::branch:
0920: 3a 66 69 6e 64 20 7b 63 73 76 61 6c 75 65 7d 20 :find {csvalue}
0930: 7b 0a 20 20 20 20 61 72 72 61 79 20 73 65 74 20 {. array set
0940: 63 73 20 24 63 73 76 61 6c 75 65 0a 0a 20 20 20 cs $csvalue..
0950: 20 23 76 61 72 69 61 62 6c 65 20 62 72 61 0a 20 #variable bra.
0960: 20 20 20 23 70 75 74 73 20 5f 5f 5f 5f 5f 5f 5f #puts _______
0970: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f ________________
0980: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f ________________
0990: 5f 5f 5f 5f 0a 20 20 20 20 23 70 75 74 73 20 5b ____. #puts [
09a0: 6a 6f 69 6e 20 5b 6c 73 6f 72 74 20 2d 69 6e 64 join [lsort -ind
09b0: 65 78 20 30 20 5b 6c 73 6f 72 74 20 2d 69 6e 64 ex 0 [lsort -ind
09c0: 65 78 20 31 20 24 62 72 61 5d 5d 20 5c 6e 5d 0a ex 1 $bra]] \n].
09d0: 0a 20 20 20 20 53 69 67 6e 61 74 75 72 65 73 20 . Signatures
09e0: 20 20 20 20 62 64 20 5b 54 69 6d 65 52 65 6c 65 bd [TimeRele
09f0: 76 61 6e 74 20 24 63 73 28 64 61 74 65 29 5d 0a vant $cs(date)].
0a00: 20 20 20 20 44 72 6f 70 49 6e 63 6f 6d 70 6c 65 DropIncomple
0a10: 74 65 20 62 64 20 5b 63 6f 6e 63 61 74 20 24 63 te bd [concat $c
0a20: 73 28 61 64 64 65 64 29 20 24 63 73 28 63 68 61 s(added) $cs(cha
0a30: 6e 67 65 64 29 5d 0a 0a 20 20 20 20 23 70 75 74 nged)].. #put
0a40: 73 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f s ______________
0a50: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f ________________
0a60: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 0a 20 20 _____________.
0a70: 20 20 23 70 61 72 72 61 79 20 62 64 0a 0a 20 20 #parray bd..
0a80: 20 20 69 66 20 7b 5b 61 72 72 61 79 20 73 69 7a if {[array siz
0a90: 65 20 62 64 5d 20 3c 20 31 7d 20 7b 0a 09 70 75 e bd] < 1} {..pu
0aa0: 74 73 20 22 4e 4f 20 42 52 41 4e 43 48 22 0a 09 ts "NO BRANCH"..
0ab0: 23 20 44 65 61 6c 20 68 6f 77 3f 0a 09 23 20 2d # Deal how?..# -
0ac0: 20 41 62 6f 72 74 0a 09 23 20 2d 20 49 67 6e 6f Abort..# - Igno
0ad0: 72 65 20 74 68 69 73 20 63 68 61 6e 67 65 73 65 re this changese
0ae0: 74 20 61 6e 64 20 74 72 79 20 74 68 65 20 6e 65 t and try the ne
0af0: 78 74 20 6f 6e 65 0a 09 23 20 20 20 28 57 68 69 xt one..# (Whi
0b00: 63 68 20 68 61 73 20 68 69 67 68 65 72 20 70 72 ch has higher pr
0b10: 6f 62 61 62 69 6c 69 74 79 20 6f 66 20 6e 6f 74 obability of not
0b20: 20 6d 61 74 63 68 69 6e 67 20 61 73 20 69 74 20 matching as it
0b30: 6d 69 67 68 74 0a 09 23 20 20 20 20 62 65 20 74 might..# be t
0b40: 68 65 20 73 75 63 63 65 73 73 6f 72 20 69 6e 20 he successor in
0b50: 74 68 65 20 62 72 61 6e 63 68 20 74 6f 20 74 68 the branch to th
0b60: 69 73 20 63 73 65 74 20 61 6e 64 20 6e 6f 74 20 is cset and not
0b70: 61 20 62 61 73 65 29 2e 0a 09 70 75 74 73 20 22 a base)...puts "
0b80: 22 0a 09 70 61 72 72 61 79 20 63 73 0a 09 65 78 "..parray cs..ex
0b90: 69 74 0a 20 20 20 20 7d 20 65 6c 73 65 69 66 20 it. } elseif
0ba0: 7b 5b 61 72 72 61 79 20 73 69 7a 65 20 62 64 5d {[array size bd]
0bb0: 20 3e 20 31 7d 20 7b 0a 0a 09 23 20 57 68 69 6c > 1} {...# Whil
0bc0: 65 20 77 65 20 6d 69 67 68 74 20 68 61 76 65 20 e we might have
0bd0: 66 6f 75 6e 64 20 73 65 76 65 72 61 6c 20 74 61 found several ta
0be0: 67 20 74 68 65 79 20 6d 61 79 20 61 6c 6c 20 72 g they may all r
0bf0: 65 66 65 72 20 74 6f 0a 09 23 20 74 68 65 20 73 efer to..# the s
0c00: 61 6d 65 20 73 65 74 20 6f 66 20 66 69 6c 65 73 ame set of files
0c10: 2e 20 49 66 20 74 68 61 74 20 69 73 20 73 6f 20 . If that is so
0c20: 77 65 20 63 6f 6e 73 69 64 65 72 20 74 68 65 6d we consider them
0c30: 0a 09 23 20 69 64 65 6e 74 69 63 61 6c 20 61 6e ..# identical an
0c40: 64 20 74 61 6b 65 20 6f 6e 65 20 61 73 20 72 65 d take one as re
0c50: 70 72 65 73 65 6e 74 61 74 69 76 65 20 6f 66 20 presentative of
0c60: 61 6c 6c 2e 0a 0a 09 73 65 74 20 73 75 20 7b 7d all....set su {}
0c70: 0a 09 66 6f 72 65 61 63 68 20 7b 74 20 73 7d 20 ..foreach {t s}
0c80: 5b 61 72 72 61 79 20 67 65 74 20 62 64 5d 20 7b [array get bd] {
0c90: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 73 75 .. lappend su
0ca0: 20 5b 44 69 63 74 53 6f 72 74 20 24 73 5d 0a 09 [DictSort $s]..
0cb0: 7d 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 }..if {[llength
0cc0: 5b 6c 73 6f 72 74 20 2d 75 6e 69 71 75 65 20 24 [lsort -unique $
0cd0: 73 75 5d 5d 20 3e 20 31 7d 20 7b 0a 09 20 20 20 su]] > 1} {..
0ce0: 20 70 75 74 73 20 22 41 4d 42 49 47 4f 55 53 2e puts "AMBIGOUS.
0cf0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 62 The following b
0d00: 72 61 6e 63 68 65 73 20 6d 61 74 63 68 3a 22 0a ranches match:".
0d10: 09 20 20 20 20 23 20 44 65 61 6c 20 68 6f 77 3f . # Deal how?
0d20: 20 53 2e 61 2e 0a 09 20 20 20 20 70 75 74 73 20 S.a... puts
0d30: 5c 74 5b 6a 6f 69 6e 20 5b 61 72 72 61 79 20 6e \t[join [array n
0d40: 61 6d 65 73 20 62 64 5d 20 5c 6e 5c 74 5d 0a 09 ames bd] \n\t]..
0d50: 20 20 20 20 70 75 74 73 20 22 22 0a 09 20 20 20 puts ""..
0d60: 20 70 61 72 72 61 79 20 63 73 0a 09 20 20 20 20 parray cs..
0d70: 65 78 69 74 0a 09 7d 0a 09 23 20 46 61 6c 6c 20 exit..}..# Fall
0d80: 74 68 72 6f 75 67 68 20 2e 2e 2e 0a 20 20 20 20 through ....
0d90: 7d 0a 0a 20 20 20 20 73 65 74 20 74 67 20 5b 6c }.. set tg [l
0da0: 69 6e 64 65 78 20 5b 61 72 72 61 79 20 6e 61 6d index [array nam
0db0: 65 73 20 62 64 5d 20 30 5d 0a 20 20 20 20 73 65 es bd] 0]. se
0dc0: 74 20 72 73 20 5b 52 6f 6f 74 4f 66 20 24 62 64 t rs [RootOf $bd
0dd0: 28 24 74 67 29 5d 0a 0a 20 20 20 20 23 70 75 74 ($tg)].. #put
0de0: 73 20 22 42 52 41 4e 43 48 20 3d 20 24 74 67 22 s "BRANCH = $tg"
0df0: 0a 20 20 20 20 23 70 75 74 73 20 22 52 4f 4f 54 . #puts "ROOT
0e00: 53 47 20 3d 20 24 72 73 22 0a 0a 20 20 20 20 72 SG = $rs".. r
0e10: 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 74 67 20 eturn [list $tg
0e20: 24 72 73 5d 0a 7d 0a 0a 0a 70 72 6f 63 20 3a 3a $rs].}...proc ::
0e30: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 62 72 61 vc::cvs::ws::bra
0e40: 6e 63 68 3a 3a 68 61 73 20 7b 74 73 20 6e 65 65 nch::has {ts nee
0e50: 64 65 64 7d 20 7b 0a 20 20 20 20 23 76 61 72 69 ded} {. #vari
0e60: 61 62 6c 65 20 62 72 61 0a 20 20 20 20 23 70 75 able bra. #pu
0e70: 74 73 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f ts _____________
0e80: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f ________________
0e90: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 0a 20 ______________.
0ea0: 20 20 20 23 70 75 74 73 20 5b 6a 6f 69 6e 20 5b #puts [join [
0eb0: 6c 73 6f 72 74 20 2d 69 6e 64 65 78 20 30 20 5b lsort -index 0 [
0ec0: 6c 73 6f 72 74 20 2d 69 6e 64 65 78 20 31 20 24 lsort -index 1 $
0ed0: 62 72 61 5d 5d 20 5c 6e 5d 0a 0a 20 20 20 20 53 bra]] \n].. S
0ee0: 69 67 6e 61 74 75 72 65 73 20 20 20 20 20 62 64 ignatures bd
0ef0: 20 5b 54 69 6d 65 52 65 6c 65 76 61 6e 74 20 24 [TimeRelevant $
0f00: 74 73 5d 0a 20 20 20 20 44 72 6f 70 49 6e 63 6f ts]. DropInco
0f10: 6d 70 6c 65 74 65 20 62 64 20 24 6e 65 65 64 65 mplete bd $neede
0f20: 64 0a 0a 20 20 20 20 23 70 75 74 73 20 5f 5f 5f d.. #puts ___
0f30: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f ________________
0f40: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f ________________
0f50: 5f 5f 5f 5f 5f 5f 5f 5f 0a 20 20 20 20 23 70 61 ________. #pa
0f60: 72 72 61 79 20 62 64 0a 0a 20 20 20 20 69 66 20 rray bd.. if
0f70: 7b 5b 61 72 72 61 79 20 73 69 7a 65 20 62 64 5d {[array size bd]
0f80: 20 3c 20 31 7d 20 7b 0a 09 70 75 74 73 20 22 4e < 1} {..puts "N
0f90: 4f 20 42 52 41 4e 43 48 22 0a 09 23 20 44 65 61 O BRANCH"..# Dea
0fa0: 6c 20 68 6f 77 3f 0a 09 23 20 2d 20 41 62 6f 72 l how?..# - Abor
0fb0: 74 0a 09 23 20 2d 20 49 67 6e 6f 72 65 20 74 68 t..# - Ignore th
0fc0: 69 73 20 63 68 61 6e 67 65 73 65 74 20 61 6e 64 is changeset and
0fd0: 20 74 72 79 20 74 68 65 20 6e 65 78 74 20 6f 6e try the next on
0fe0: 65 0a 09 23 20 20 20 28 57 68 69 63 68 20 68 61 e..# (Which ha
0ff0: 73 20 68 69 67 68 65 72 20 70 72 6f 62 61 62 69 s higher probabi
1000: 6c 69 74 79 20 6f 66 20 6e 6f 74 20 6d 61 74 63 lity of not matc
1010: 68 69 6e 67 20 61 73 20 69 74 20 6d 69 67 68 74 hing as it might
1020: 0a 09 23 20 20 20 20 62 65 20 74 68 65 20 73 75 ..# be the su
1030: 63 63 65 73 73 6f 72 20 69 6e 20 74 68 65 20 62 ccessor in the b
1040: 72 61 6e 63 68 20 74 6f 20 74 68 69 73 20 63 73 ranch to this cs
1050: 65 74 20 61 6e 64 20 6e 6f 74 20 61 20 62 61 73 et and not a bas
1060: 65 29 2e 0a 09 65 78 69 74 0a 20 20 20 20 7d 20 e)...exit. }
1070: 65 6c 73 65 69 66 20 7b 5b 61 72 72 61 79 20 73 elseif {[array s
1080: 69 7a 65 20 62 64 5d 20 3e 20 31 7d 20 7b 0a 09 ize bd] > 1} {..
1090: 70 75 74 73 20 22 41 4d 42 49 47 4f 55 53 2e 20 puts "AMBIGOUS.
10a0: 46 6f 6c 6c 6f 77 69 6e 67 20 62 72 61 6e 63 68 Following branch
10b0: 65 73 20 6d 61 74 63 68 3a 22 0a 09 23 20 44 65 es match:"..# De
10c0: 61 6c 20 68 6f 77 3f 20 53 2e 61 2e 0a 09 70 75 al how? S.a...pu
10d0: 74 73 20 5c 74 5b 6a 6f 69 6e 20 5b 61 72 72 61 ts \t[join [arra
10e0: 79 20 6e 61 6d 65 73 20 62 64 5d 20 5c 6e 5c 74 y names bd] \n\t
10f0: 5d 0a 09 65 78 69 74 0a 20 20 20 20 7d 0a 0a 20 ]..exit. }..
1100: 20 20 20 73 65 74 20 74 67 20 5b 6c 69 6e 64 65 set tg [linde
1110: 78 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 62 x [array names b
1120: 64 5d 20 30 5d 0a 0a 20 20 20 20 23 70 75 74 73 d] 0].. #puts
1130: 20 22 42 52 41 4e 43 48 20 3d 20 24 74 67 22 0a "BRANCH = $tg".
1140: 0a 20 20 20 20 72 65 74 75 72 6e 20 24 74 67 0a . return $tg.
1150: 7d 0a 0a 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a }....proc ::vc::
1160: 63 76 73 3a 3a 77 73 3a 3a 62 72 61 6e 63 68 3a cvs::ws::branch:
1170: 3a 52 6f 6f 74 4f 66 20 7b 64 69 63 74 7d 20 7b :RootOf {dict} {
1180: 0a 20 20 20 20 73 65 74 20 72 65 73 20 7b 7d 0a . set res {}.
1190: 20 20 20 20 66 6f 72 65 61 63 68 20 7b 66 20 72 foreach {f r
11a0: 7d 20 24 64 69 63 74 20 7b 0a 09 6c 61 70 70 65 } $dict {..lappe
11b0: 6e 64 20 72 65 73 20 24 66 20 5b 72 65 76 72 6f nd res $f [revro
11c0: 6f 74 20 24 72 5d 0a 20 20 20 20 7d 0a 20 20 20 ot $r]. }.
11d0: 20 72 65 74 75 72 6e 20 24 72 65 73 0a 7d 0a 0a return $res.}..
11e0: 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a proc ::vc::cvs::
11f0: 77 73 3a 3a 62 72 61 6e 63 68 3a 3a 44 69 63 74 ws::branch::Dict
1200: 53 6f 72 74 20 7b 64 69 63 74 7d 20 7b 0a 20 20 Sort {dict} {.
1210: 20 20 61 72 72 61 79 20 73 65 74 20 61 20 24 64 array set a $d
1220: 69 63 74 0a 20 20 20 20 73 65 74 20 72 20 7b 7d ict. set r {}
1230: 0a 20 20 20 20 66 6f 72 65 61 63 68 20 6b 20 5b . foreach k [
1240: 6c 73 6f 72 74 20 5b 61 72 72 61 79 20 6e 61 6d lsort [array nam
1250: 65 73 20 61 5d 5d 20 7b 0a 09 6c 61 70 70 65 6e es a]] {..lappen
1260: 64 20 72 20 24 6b 20 24 61 28 24 6b 29 0a 20 20 d r $k $a($k).
1270: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 24 }. return $
1280: 72 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a r.}..proc ::vc::
1290: 63 76 73 3a 3a 77 73 3a 3a 62 72 61 6e 63 68 3a cvs::ws::branch:
12a0: 3a 44 72 6f 70 49 6e 63 6f 6d 70 6c 65 74 65 20 :DropIncomplete
12b0: 7b 62 76 20 6e 65 65 64 65 64 7d 20 7b 0a 20 20 {bv needed} {.
12c0: 20 20 75 70 76 61 72 20 31 20 24 62 76 20 62 64 upvar 1 $bv bd
12d0: 61 74 61 0a 0a 20 20 20 20 23 20 43 68 65 63 6b ata.. # Check
12e0: 20 74 68 65 20 6e 65 65 64 65 64 20 66 69 6c 65 the needed file
12f0: 73 20 61 67 61 69 6e 73 74 20 74 68 65 20 62 72 s against the br
1300: 61 6e 63 68 20 73 69 67 6e 61 74 75 72 65 2e 20 anch signature.
1310: 49 66 20 66 69 6c 65 73 0a 20 20 20 20 23 20 61 If files. # a
1320: 72 65 20 6d 69 73 73 69 6e 67 20 6f 72 20 6e 6f re missing or no
1330: 74 20 6f 66 20 61 20 6d 61 74 63 68 69 6e 67 20 t of a matching
1340: 76 65 72 73 69 6f 6e 20 64 72 6f 70 20 74 68 65 version drop the
1350: 20 62 72 61 6e 63 68 20 66 72 6f 6d 0a 20 20 20 branch from.
1360: 20 23 20 66 75 72 74 68 65 72 20 63 6f 6e 73 69 # further consi
1370: 64 65 72 61 74 69 6f 6e 2e 0a 0a 20 20 20 20 66 deration... f
1380: 6f 72 65 61 63 68 20 7b 74 61 67 20 73 69 67 7d oreach {tag sig}
1390: 20 5b 61 72 72 61 79 20 67 65 74 20 62 64 61 74 [array get bdat
13a0: 61 5d 20 7b 0a 09 61 72 72 61 79 20 73 65 74 20 a] {..array set
13b0: 72 65 76 20 24 73 69 67 0a 09 66 6f 72 65 61 63 rev $sig..foreac
13c0: 68 20 7b 66 69 6c 65 20 72 76 7d 20 24 6e 65 65 h {file rv} $nee
13d0: 64 65 64 20 7b 0a 09 20 20 20 20 69 66 20 7b 21 ded {.. if {!
13e0: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 72 65 76 [info exists rev
13f0: 28 24 66 69 6c 65 29 5d 20 7c 7c 20 21 5b 73 75 ($file)] || ![su
1400: 63 63 65 73 73 6f 72 20 24 72 76 20 24 72 65 76 ccessor $rv $rev
1410: 28 24 66 69 6c 65 29 5d 7d 20 7b 0a 09 09 23 20 ($file)]} {...#
1420: 66 69 6c 65 20 69 6e 20 63 73 65 74 20 69 73 20 file in cset is
1430: 6e 6f 74 20 69 6e 20 74 68 65 20 62 72 61 6e 63 not in the branc
1440: 68 20 6f 72 20 69 73 20 70 72 65 73 65 6e 74 2c h or is present,
1450: 20 62 75 74 0a 09 09 23 20 6e 6f 74 20 70 72 6f but...# not pro
1460: 70 65 72 20 76 65 72 73 69 6f 6e 20 28 64 69 66 per version (dif
1470: 66 65 72 65 6e 74 20 6c 65 6e 67 74 68 73 2c 20 ferent lengths,
1480: 6e 6f 74 20 6d 61 74 63 68 69 6e 67 0a 09 09 23 not matching...#
1490: 20 69 6e 20 75 70 70 65 72 20 30 2e 2e 65 6e 64 in upper 0..end
14a0: 2d 32 20 70 61 72 74 73 2c 20 6e 6f 74 20 65 71 -2 parts, not eq
14b0: 75 61 6c 7c 73 75 63 63 65 73 73 6f 72 29 2e 0a ual|successor)..
14c0: 09 09 75 6e 73 65 74 20 62 64 61 74 61 28 24 74 ..unset bdata($t
14d0: 61 67 29 0a 09 09 62 72 65 61 6b 0a 09 20 20 20 ag)...break..
14e0: 20 7d 20 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75 } .. continu
14f0: 65 0a 09 7d 0a 09 75 6e 73 65 74 20 72 65 76 0a e..}..unset rev.
1500: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e }. return
1510: 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 .}..proc ::vc::c
1520: 76 73 3a 3a 77 73 3a 3a 62 72 61 6e 63 68 3a 3a vs::ws::branch::
1530: 73 75 63 63 65 73 73 6f 72 20 7b 72 61 20 72 62 successor {ra rb
1540: 7d 20 7b 0a 20 20 20 20 23 20 61 20 73 75 63 63 } {. # a succ
1550: 65 73 73 6f 72 2d 6f 66 20 62 20 3f 0a 0a 20 20 essor-of b ?..
1560: 20 20 73 65 74 20 6c 61 20 5b 73 70 6c 69 74 20 set la [split
1570: 24 72 61 20 2e 5d 0a 20 20 20 20 73 65 74 20 6c $ra .]. set l
1580: 62 20 5b 73 70 6c 69 74 20 24 72 62 20 2e 5d 0a b [split $rb .].
1590: 20 20 20 20 69 66 20 7b 0a 09 28 5b 6c 6c 65 6e if {..([llen
15a0: 67 74 68 20 24 6c 61 5d 20 20 20 20 20 20 20 20 gth $la]
15b0: 20 21 3d 20 5b 6c 6c 65 6e 67 74 68 20 24 6c 62 != [llength $lb
15c0: 5d 29 20 20 20 20 20 20 20 20 20 7c 7c 0a 09 28 ]) ||..(
15d0: 5b 6c 72 61 6e 67 65 20 20 24 6c 61 20 30 20 65 [lrange $la 0 e
15e0: 6e 64 2d 32 5d 20 6e 65 20 5b 6c 72 61 6e 67 65 nd-2] ne [lrange
15f0: 20 20 24 6c 62 20 30 20 65 6e 64 2d 32 5d 29 20 $lb 0 end-2])
1600: 7c 7c 0a 09 28 5b 70 61 63 6b 61 67 65 20 76 63 ||..([package vc
1610: 6f 6d 70 61 72 65 20 24 72 61 20 24 72 62 5d 20 ompare $ra $rb]
1620: 3c 20 30 29 0a 20 20 20 20 7d 20 7b 0a 09 72 65 < 0). } {..re
1630: 74 75 72 6e 20 30 0a 20 20 20 20 7d 20 65 6c 73 turn 0. } els
1640: 65 20 7b 0a 09 72 65 74 75 72 6e 20 31 0a 20 20 e {..return 1.
1650: 20 20 7d 0a 7d 0a 0a 70 72 6f 63 20 3a 3a 76 63 }.}..proc ::vc
1660: 3a 3a 63 76 73 3a 3a 77 73 3a 3a 62 72 61 6e 63 ::cvs::ws::branc
1670: 68 3a 3a 72 6f 6f 74 53 75 63 63 65 73 73 6f 72 h::rootSuccessor
1680: 20 7b 72 61 20 72 62 7d 20 7b 0a 20 20 20 20 23 {ra rb} {. #
1690: 20 61 20 72 6f 6f 74 2d 73 75 63 63 65 73 73 6f a root-successo
16a0: 72 2d 6f 66 20 62 20 3f 20 28 3c 3d 3e 20 62 20 r-of b ? (<=> b
16b0: 72 6f 6f 74 20 76 65 72 73 69 6f 6e 20 6f 66 20 root version of
16c0: 61 20 3f 29 0a 0a 20 20 20 20 69 66 20 7b 24 72 a ?).. if {$r
16d0: 62 20 65 71 20 5b 72 65 76 72 6f 6f 74 20 24 72 b eq [revroot $r
16e0: 61 5d 7d 20 7b 0a 09 72 65 74 75 72 6e 20 31 0a a]} {..return 1.
16f0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 72 65 } else {..re
1700: 74 75 72 6e 20 30 0a 20 20 20 20 7d 0a 7d 0a 0a turn 0. }.}..
1710: 70 72 6f 63 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a proc ::vc::cvs::
1720: 77 73 3a 3a 62 72 61 6e 63 68 3a 3a 53 69 67 6e ws::branch::Sign
1730: 61 74 75 72 65 73 20 7b 62 76 20 64 65 66 6c 69 atures {bv defli
1740: 73 74 7d 20 7b 0a 20 20 20 20 75 70 76 61 72 20 st} {. upvar
1750: 31 20 24 62 76 20 62 64 61 74 61 0a 20 20 20 20 1 $bv bdata.
1760: 23 20 53 6f 72 74 20 62 72 61 6e 63 68 20 64 61 # Sort branch da
1770: 74 61 20 62 79 20 73 79 6d 62 6f 6c 69 63 20 6e ta by symbolic n
1780: 61 6d 65 20 66 6f 72 20 74 68 65 20 75 70 63 6f ame for the upco
1790: 6d 69 6e 67 20 63 68 65 63 6b 73 2c 20 61 6e 64 ming checks, and
17a0: 0a 20 20 20 20 23 20 67 65 6e 65 72 61 74 65 20 . # generate
17b0: 66 69 6c 65 20 72 65 76 69 73 69 6f 6e 20 73 69 file revision si
17c0: 67 6e 61 74 75 72 65 73 2e 0a 0a 20 20 20 20 61 gnatures... a
17d0: 72 72 61 79 20 73 65 74 20 62 64 61 74 61 20 7b rray set bdata {
17e0: 7d 0a 20 20 20 20 66 6f 72 65 61 63 68 20 69 74 }. foreach it
17f0: 65 6d 20 24 64 65 66 6c 69 73 74 20 7b 0a 09 23 em $deflist {..#
1800: 20 69 74 65 6d 20 3d 20 74 69 6d 65 73 74 61 6d item = timestam
1810: 70 20 74 61 67 20 66 69 6c 65 20 72 65 76 69 73 p tag file revis
1820: 69 6f 6e 0a 09 66 6f 72 65 61 63 68 20 7b 5f 5f ion..foreach {__
1830: 20 74 61 67 20 66 69 6c 65 20 72 65 76 7d 20 24 tag file rev} $
1840: 69 74 65 6d 20 62 72 65 61 6b 0a 09 6c 61 70 70 item break..lapp
1850: 65 6e 64 20 62 64 61 74 61 28 24 74 61 67 29 20 end bdata($tag)
1860: 24 66 69 6c 65 20 24 72 65 76 0a 20 20 20 20 7d $file $rev. }
1870: 0a 0a 20 20 20 20 23 70 75 74 73 20 5f 5f 5f 5f .. #puts ____
1880: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f ________________
1890: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f ________________
18a0: 5f 5f 5f 5f 5f 5f 5f 0a 20 20 20 20 23 70 61 72 _______. #par
18b0: 72 61 79 20 62 64 61 74 61 0a 0a 20 20 20 20 72 ray bdata.. r
18c0: 65 74 75 72 6e 0a 7d 0a 0a 70 72 6f 63 20 3a 3a eturn.}..proc ::
18d0: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 62 72 61 vc::cvs::ws::bra
18e0: 6e 63 68 3a 3a 54 69 6d 65 52 65 6c 65 76 61 6e nch::TimeRelevan
18f0: 74 20 7b 64 61 74 65 7d 20 7b 0a 20 20 20 20 76 t {date} {. v
1900: 61 72 69 61 62 6c 65 20 62 72 61 0a 0a 20 20 20 ariable bra..
1910: 20 23 20 52 65 74 72 69 65 76 65 20 74 68 65 20 # Retrieve the
1920: 62 72 61 6e 63 68 20 64 61 74 61 20 77 68 69 63 branch data whic
1930: 68 20 64 65 66 69 6e 69 74 65 6c 79 20 63 6f 6d h definitely com
1940: 65 73 20 62 65 66 6f 72 65 20 28 69 6e 20 74 69 es before (in ti
1950: 6d 65 29 0a 20 20 20 20 23 20 74 68 65 20 63 61 me). # the ca
1960: 6e 64 69 64 61 74 65 20 63 73 65 74 2e 20 4f 6e ndidate cset. On
1970: 6c 79 20 74 68 69 73 20 73 65 74 20 69 73 20 72 ly this set is r
1980: 65 6c 65 76 61 6e 74 20 74 6f 20 66 75 72 74 68 elevant to furth
1990: 65 72 20 63 68 65 63 6b 73 0a 20 20 20 20 23 20 er checks. #
19a0: 61 6e 64 20 66 69 6c 74 65 72 73 2e 0a 0a 20 20 and filters...
19b0: 20 20 73 65 74 20 72 65 73 20 7b 7d 0a 20 20 20 set res {}.
19c0: 20 66 6f 72 65 61 63 68 20 69 74 65 6d 20 24 62 foreach item $b
19d0: 72 61 20 7b 0a 09 23 20 69 74 65 6d 20 3d 20 74 ra {..# item = t
19e0: 69 6d 65 73 74 61 6d 70 20 74 61 67 20 66 69 6c imestamp tag fil
19f0: 65 20 72 65 76 69 73 69 6f 6e 0a 09 23 20 20 20 e revision..#
1a00: 20 20 20 20 20 30 20 20 20 20 20 20 20 20 20 31 0 1
1a10: 20 20 20 32 20 20 20 20 33 0a 09 69 66 20 7b 5b 2 3..if {[
1a20: 70 61 63 6b 61 67 65 20 76 63 6f 6d 70 61 72 65 package vcompare
1a30: 20 5b 6c 69 6e 64 65 78 20 24 69 74 65 6d 20 30 [lindex $item 0
1a40: 5d 20 24 64 61 74 65 5d 20 3e 20 30 7d 20 63 6f ] $date] > 0} co
1a50: 6e 74 69 6e 75 65 0a 09 6c 61 70 70 65 6e 64 20 ntinue..lappend
1a60: 72 65 73 20 24 69 74 65 6d 0a 20 20 20 20 7d 0a res $item. }.
1a70: 0a 20 20 20 20 23 70 75 74 73 20 5f 5f 5f 5f 5f . #puts _____
1a80: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f ________________
1a90: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f ________________
1aa0: 5f 5f 5f 5f 5f 5f 0a 20 20 20 20 23 70 75 74 73 ______. #puts
1ab0: 20 5b 6a 6f 69 6e 20 5b 6c 73 6f 72 74 20 2d 69 [join [lsort -i
1ac0: 6e 64 65 78 20 30 20 5b 6c 73 6f 72 74 20 2d 69 ndex 0 [lsort -i
1ad0: 6e 64 65 78 20 31 20 24 72 65 73 5d 5d 20 5c 6e ndex 1 $res]] \n
1ae0: 5d 0a 20 20 20 20 72 65 74 75 72 6e 20 24 72 65 ]. return $re
1af0: 73 0a 7d 0a 0a 0a 6e 61 6d 65 73 70 61 63 65 20 s.}...namespace
1b00: 65 76 61 6c 20 3a 3a 76 63 3a 3a 63 76 73 3a 3a eval ::vc::cvs::
1b10: 77 73 3a 3a 62 72 61 6e 63 68 20 7b 0a 20 20 20 ws::branch {.
1b20: 20 76 61 72 69 61 62 6c 65 20 62 72 61 20 7b 7d variable bra {}
1b30: 0a 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 .. namespace
1b40: 65 78 70 6f 72 74 20 64 65 66 20 66 69 6e 64 20 export def find
1b50: 73 75 63 63 65 73 73 6f 72 20 72 6f 6f 74 53 75 successor rootSu
1b60: 63 63 65 73 73 6f 72 20 72 65 76 72 6f 6f 74 20 ccessor revroot
1b70: 68 61 73 0a 7d 0a 0a 70 61 63 6b 61 67 65 20 70 has.}..package p
1b80: 72 6f 76 69 64 65 20 76 63 3a 3a 63 76 73 3a 3a rovide vc::cvs::
1b90: 77 73 3a 3a 62 72 61 6e 63 68 20 31 2e 30 0a 72 ws::branch 1.0.r
1ba0: 65 74 75 72 6e 0a 0a 0a 0a 0a 20 20 20 20 23 20 eturn..... #
1bb0: 51 75 65 72 69 65 73 20 2e 2e 2e 20 0a 20 20 20 Queries ... .
1bc0: 20 23 20 2d 20 47 65 74 20 73 65 74 20 6f 66 20 # - Get set of
1bd0: 66 69 6c 65 73 20 61 6e 64 20 72 65 76 73 20 66 files and revs f
1be0: 6f 72 20 62 72 61 6e 63 68 20 42 20 77 68 69 63 or branch B whic
1bf0: 68 20 63 61 6e 20 62 65 20 69 6e 20 69 74 20 62 h can be in it b
1c00: 79 20 74 68 65 20 74 69 6d 65 20 54 0a 20 20 20 y the time T.
1c10: 20 23 20 2d 20 43 68 65 63 6b 20 69 66 20 61 20 # - Check if a
1c20: 66 69 6c 65 20 72 65 66 65 72 65 6e 63 65 64 20 file referenced
1c30: 61 2f 6d 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 a/m instruction
1c40: 69 73 20 69 6e 20 61 20 73 65 74 20 6f 66 20 66 is in a set of f
1c50: 69 6c 65 73 0a 20 20 20 20 23 20 20 20 61 6e 64 iles. # and
1c60: 20 72 65 76 69 73 69 6f 6e 2c 20 69 64 65 6e 74 revision, ident
1c70: 69 63 61 6c 20 6f 72 20 70 72 6f 70 65 72 20 73 ical or proper s
1c80: 75 63 65 73 73 6f 72 2e 0a 20 20 20 20 23 20 3d ucessor.. # =
1c90: 3e 20 43 6f 6d 62 69 6e 61 74 69 6f 6e 0a 20 20 > Combination.
1ca0: 20 20 23 20 20 20 20 43 61 6e 20 62 72 61 6e 63 # Can branc
1cb0: 68 20 42 20 6d 61 74 63 68 20 74 68 65 20 63 73 h B match the cs
1cc0: 65 74 20 66 69 6c 65 20 61 2f 6d 20 61 74 20 74 et file a/m at t
1cd0: 69 6d 65 20 54 20 3f 0a 20 20 20 20 23 20 3d 3e ime T ?. # =>
1ce0: 20 46 75 6c 6c 20 63 6f 6d 62 69 6e 61 74 69 6f Full combinatio
1cf0: 6e 0a 20 20 20 20 23 20 20 20 20 47 69 76 65 20 n. # Give
1d00: 6d 65 20 74 68 65 20 6c 69 73 74 20 6f 66 20 62 me the list of b
1d10: 72 61 6e 63 68 65 73 20 77 68 69 63 68 20 63 61 ranches which ca
1d20: 6e 20 6d 61 74 63 68 20 74 68 65 20 63 73 65 74 n match the cset
1d30: 20 66 69 6c 65 20 61 2f 6d 0a 20 20 20 20 23 20 file a/m. #
1d40: 20 20 20 61 74 20 74 69 6d 65 20 54 2e 0a 0a 20 at time T...
1d50: 20 20 20 23 20 42 72 61 6e 63 68 20 44 42 20 6f # Branch DB o
1d60: 72 67 61 6e 69 7a 61 74 69 6f 6e 20 3d 3e 20 28 rganization => (
1d70: 54 61 67 20 2d 3e 20 28 54 69 6d 65 20 2d 3e 20 Tag -> (Time ->
1d80: 28 46 69 6c 65 20 2d 3e 20 52 65 76 29 29 29 0a (File -> Rev))).
1d90: 20 20 20 20 23 20 54 68 65 20 66 75 6c 6c 20 63 # The full c
1da0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 61 63 74 75 61 ombination actua
1db0: 6c 6c 79 20 64 6f 65 73 20 6e 6f 74 20 6e 65 65 lly does not nee
1dc0: 64 20 61 20 63 6f 6d 70 6c 65 78 20 73 74 72 75 d a complex stru
1dd0: 63 74 75 72 65 2e 0a 20 20 20 20 23 20 57 65 20 cture.. # We
1de0: 63 61 6e 20 73 69 6d 70 6c 79 20 73 63 61 6e 20 can simply scan
1df0: 61 20 70 6c 61 69 6e 20 6c 69 73 74 20 6f 66 20 a plain list of
1e00: 62 72 61 6e 63 68 20 64 61 74 61 2e 0a 20 20 20 branch data..
1e10: 20 23 20 54 68 65 20 6f 6e 6c 79 20 61 6c 74 65 # The only alte
1e20: 72 6e 61 74 69 76 65 20 69 73 20 61 6e 20 69 6e rnative is an in
1e30: 76 65 72 74 65 64 20 69 6e 64 65 78 2e 0a 20 20 verted index..
1e40: 20 20 23 20 54 69 6d 65 20 2d 3e 20 28 28 46 69 # Time -> ((Fi
1e50: 6c 65 20 2d 3e 20 52 65 76 29 20 2d 3e 20 54 61 le -> Rev) -> Ta
1e60: 67 29 2e 20 44 69 66 66 69 63 75 6c 74 20 74 6f g). Difficult to
1e70: 20 70 72 6f 63 65 73 73 2e 0a 20 20 20 20 23 20 process.. #
1e80: 4c 69 6e 65 61 72 20 73 63 61 6e 3a 0a 20 20 20 Linear scan:.
1e90: 20 23 20 2d 20 54 69 6d 65 20 61 66 74 65 72 20 # - Time after
1ea0: 54 20 20 20 3d 3e 20 64 72 6f 70 0a 20 20 20 20 T => drop.
1eb0: 23 20 2d 20 46 69 6c 65 20 21 69 6e 20 61 2f 6d # - File !in a/m
1ec0: 20 20 20 3d 3e 20 64 72 6f 70 0a 20 20 20 20 23 => drop. #
1ed0: 20 2d 20 56 65 72 73 69 6f 6e 20 21 6d 61 74 63 - Version !matc
1ee0: 68 20 3d 3e 20 64 72 6f 70 0a 20 20 20 20 23 20 h => drop. #
1ef0: 2d 2d 20 43 6f 6c 6c 65 63 74 20 74 61 67 0a 20 -- Collect tag.
1f00: 20 20 20 23 20 54 68 65 6e 20 6c 73 6f 72 74 20 # Then lsort
1f10: 2d 75 6e 69 71 75 65 20 66 6f 72 20 6f 75 72 20 -unique for our
1f20: 72 65 73 75 6c 74 2e 0a 20 20 20 20 23 20 4e 4f result.. # NO
1f30: 20 2d 20 54 68 65 20 66 69 6c 65 20 63 68 65 63 - The file chec
1f40: 6b 20 69 73 20 69 6e 76 65 72 74 65 64 20 2d 20 k is inverted -
1f50: 41 6c 6c 20 66 69 6c 65 73 20 68 61 76 65 20 74 All files have t
1f60: 6f 20 62 65 20 69 6e 20 61 2f 6d 20 66 6f 72 20 o be in a/m for
1f70: 74 68 65 20 62 61 73 65 2c 20 6e 6f 74 20 61 2f the base, not a/
1f80: 6d 20 69 6e 20 66 69 6c 65 73 0a 20 20 20 20 23 m in files. #
1f90: 20 3d 3d 20 2d 20 54 68 69 73 20 61 6c 73 6f 20 == - This also
1fa0: 62 72 65 61 6b 73 20 74 68 65 20 69 73 73 75 65 breaks the issue
1fb0: 20 66 6f 72 20 73 61 6d 65 2d 62 72 61 6e 63 68 for same-branch
1fc0: 20 64 65 74 65 63 74 69 6f 6e 20 2d 0a 20 20 20 detection -.
1fd0: 20 23 20 20 20 20 66 75 74 75 72 65 20 63 73 65 # future cse
1fe0: 74 73 20 69 6e 20 74 68 65 20 62 72 61 6e 63 68 ts in the branch
1ff0: 20 64 6f 20 6e 6f 74 20 68 61 76 65 20 74 68 61 do not have tha
2000: 74 20 70 72 6f 70 65 72 74 79 2e 0a 0a 20 20 20 t property...
2010: 20 70 75 74 73 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f puts __________
2020: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f ________________
2030: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f ________________
2040: 5f 0a 20 20 20 20 23 20 53 68 6f 77 20 6f 6e 6c _. # Show onl
2050: 79 20 62 72 61 6e 63 68 20 64 61 74 61 20 77 68 y branch data wh
2060: 69 63 68 20 64 65 66 69 6e 69 74 65 6c 79 20 63 ich definitely c
2070: 6f 6d 65 73 20 62 65 66 6f 72 65 20 74 68 65 0a omes before the.
2080: 20 20 20 20 23 20 63 61 6e 64 69 64 61 74 65 20 # candidate
2090: 63 73 65 74 0a 0a 20 20 20 20 61 72 72 61 79 20 cset.. array
20a0: 73 65 74 20 6e 20 5b 63 6f 6e 63 61 74 20 24 63 set n [concat $c
20b0: 73 28 61 64 64 65 64 29 20 24 63 73 28 63 68 61 s(added) $cs(cha
20c0: 6e 67 65 64 29 5d 0a 20 20 20 20 73 65 74 20 78 nged)]. set x
20d0: 78 20 7b 7d 0a 20 20 20 20 73 65 74 20 62 62 20 x {}. set bb
20e0: 7b 7d 0a 20 20 20 20 3a 3a 66 6f 72 65 61 63 68 {}. ::foreach
20f0: 20 78 20 24 62 72 61 20 7b 0a 09 3a 3a 66 6f 72 x $bra {..::for
2100: 65 61 63 68 20 7b 74 73 20 74 61 67 20 66 20 72 each {ts tag f r
2110: 7d 20 24 78 20 62 72 65 61 6b 0a 09 69 66 20 7b } $x break..if {
2120: 5b 70 61 63 6b 61 67 65 20 76 63 6f 6d 70 61 72 [package vcompar
2130: 65 20 24 74 73 20 24 63 73 28 64 61 74 65 29 5d e $ts $cs(date)]
2140: 20 3e 20 30 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 > 0} continue..
2150: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 if {![info exist
2160: 73 20 6e 28 24 66 29 5d 7d 20 63 6f 6e 74 69 6e s n($f)]} contin
2170: 75 65 0a 09 69 66 20 7b 0a 09 20 20 20 20 28 5b ue..if {.. ([
2180: 6c 6c 65 6e 67 74 68 20 5b 73 70 6c 69 74 20 24 llength [split $
2190: 6e 28 24 66 29 20 2e 5d 5d 20 21 3d 20 5b 6c 6c n($f) .]] != [ll
21a0: 65 6e 67 74 68 20 5b 73 70 6c 69 74 20 24 72 20 ength [split $r
21b0: 2e 5d 5d 29 20 7c 7c 0a 09 20 20 20 20 28 5b 6c .]]) ||.. ([l
21c0: 72 61 6e 67 65 20 5b 73 70 6c 69 74 20 24 6e 28 range [split $n(
21d0: 24 66 29 20 2e 5d 20 30 20 65 6e 64 2d 32 5d 20 $f) .] 0 end-2]
21e0: 6e 65 20 5b 6c 72 61 6e 67 65 20 5b 73 70 6c 69 ne [lrange [spli
21f0: 74 20 24 72 20 2e 5d 20 30 20 65 6e 64 2d 32 5d t $r .] 0 end-2]
2200: 29 20 7c 7c 0a 09 20 20 20 20 28 5b 70 61 63 6b ) ||.. ([pack
2210: 61 67 65 20 76 63 6f 6d 70 61 72 65 20 24 6e 28 age vcompare $n(
2220: 24 66 29 20 24 72 5d 20 3c 20 30 29 0a 09 7d 20 $f) $r] < 0)..}
2230: 63 6f 6e 74 69 6e 75 65 0a 09 6c 61 70 70 65 6e continue..lappen
2240: 64 20 78 78 20 24 78 0a 09 6c 61 70 70 65 6e 64 d xx $x..lappend
2250: 20 62 62 20 24 74 61 67 0a 20 20 20 20 7d 0a 20 bb $tag. }.
2260: 20 20 20 70 75 74 73 20 5b 6a 6f 69 6e 20 5b 6c puts [join [l
2270: 73 6f 72 74 20 2d 69 6e 64 65 78 20 30 20 5b 6c sort -index 0 [l
2280: 73 6f 72 74 20 2d 69 6e 64 65 78 20 31 20 24 78 sort -index 1 $x
2290: 78 5d 5d 20 5c 6e 5d 0a 20 20 20 20 70 75 74 73 x]] \n]. puts
22a0: 20 5b 6a 6f 69 6e 20 5b 6c 73 6f 72 74 20 2d 75 [join [lsort -u
22b0: 6e 69 71 75 65 20 24 62 62 5d 20 5c 6e 5d 0a 0a nique $bb] \n]..
22c0: 65 78 69 74 0a 0a 0a exit...