0000: 23 23 20 2d 2a 2d 20 74 63 6c 20 2d 2a 2d 0a 23 ## -*- tcl -*-.#
0010: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 # ## ### #####
0020: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
0030: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 ###### #########
0040: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 ############.##
0050: 43 6f 70 79 72 69 67 68 74 20 28 63 29 20 32 30 Copyright (c) 20
0060: 30 37 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69 07 Andreas Kupri
0070: 65 73 2e 0a 23 0a 23 20 54 68 69 73 20 73 6f 66 es..#.# This sof
0080: 74 77 61 72 65 20 69 73 20 6c 69 63 65 6e 73 65 tware is license
0090: 64 20 61 73 20 64 65 73 63 72 69 62 65 64 20 69 d as described i
00a0: 6e 20 74 68 65 20 66 69 6c 65 20 4c 49 43 45 4e n the file LICEN
00b0: 53 45 2c 20 77 68 69 63 68 0a 23 20 79 6f 75 20 SE, which.# you
00c0: 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65 63 65 should have rece
00d0: 69 76 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 ived as part of
00e0: 74 68 69 73 20 64 69 73 74 72 69 62 75 74 69 6f this distributio
00f0: 6e 2e 0a 23 0a 23 20 54 68 69 73 20 73 6f 66 74 n..#.# This soft
0100: 77 61 72 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 ware consists of
0110: 20 76 6f 6c 75 6e 74 61 72 79 20 63 6f 6e 74 72 voluntary contr
0120: 69 62 75 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 ibutions made by
0130: 20 6d 61 6e 79 0a 23 20 69 6e 64 69 76 69 64 75 many.# individu
0140: 61 6c 73 2e 20 20 46 6f 72 20 65 78 61 63 74 20 als. For exact
0150: 63 6f 6e 74 72 69 62 75 74 69 6f 6e 20 68 69 73 contribution his
0160: 74 6f 72 79 2c 20 73 65 65 20 74 68 65 20 72 65 tory, see the re
0170: 76 69 73 69 6f 6e 0a 23 20 68 69 73 74 6f 72 79 vision.# history
0180: 20 61 6e 64 20 6c 6f 67 73 2c 20 61 76 61 69 6c and logs, avail
0190: 61 62 6c 65 20 61 74 20 68 74 74 70 3a 2f 2f 66 able at http://f
01a0: 6f 73 73 69 6c 2d 73 63 6d 2e 68 77 61 63 69 2e ossil-scm.hwaci.
01b0: 63 6f 6d 2f 66 6f 73 73 69 6c 0a 23 20 23 20 23 com/fossil.# # #
01c0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 # ### ##### ####
01d0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 #### ###########
01e0: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 ## #############
01f0: 23 23 23 23 23 23 23 23 0a 0a 23 23 20 52 65 76 ########..## Rev
0200: 69 73 69 6f 6e 73 20 70 65 72 20 70 72 6f 6a 65 isions per proje
0210: 63 74 2c 20 61 6b 61 20 43 68 61 6e 67 65 73 65 ct, aka Changese
0220: 74 73 2e 20 54 68 65 73 65 20 6f 62 6a 65 63 74 ts. These object
0230: 73 20 61 72 65 20 66 69 72 73 74 20 75 73 65 64 s are first used
0240: 0a 23 23 20 69 6e 20 70 61 73 73 20 35 2c 20 77 .## in pass 5, w
0250: 68 69 63 68 20 63 72 65 61 74 65 73 20 74 68 65 hich creates the
0260: 20 69 6e 69 74 69 61 6c 20 73 65 74 20 63 6f 76 initial set cov
0270: 65 72 69 6e 67 20 74 68 65 20 72 65 70 6f 73 69 ering the reposi
0280: 74 6f 72 79 2e 0a 0a 23 20 23 20 23 23 20 23 23 tory...# # ## ##
0290: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 # ##### ########
02a0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23 ############# #
02b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
02c0: 23 23 23 23 0a 23 23 20 52 65 71 75 69 72 65 6d ####.## Requirem
02d0: 65 6e 74 73 0a 0a 70 61 63 6b 61 67 65 20 72 65 ents..package re
02e0: 71 75 69 72 65 20 54 63 6c 20 38 2e 34 20 20 20 quire Tcl 8.4
02f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0300: 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23 20 ; #
0310: 52 65 71 75 69 72 65 64 20 72 75 6e 74 69 6d 65 Required runtime
0320: 2e 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 ..package requir
0330: 65 20 73 6e 69 74 20 20 20 20 20 20 20 20 20 20 e snit
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0350: 20 20 20 20 20 20 20 20 3b 20 23 20 4f 4f 20 73 ; # OO s
0360: 79 73 74 65 6d 2e 0a 70 61 63 6b 61 67 65 20 72 ystem..package r
0370: 65 71 75 69 72 65 20 73 74 72 75 63 74 3a 3a 73 equire struct::s
0380: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 et
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23 ; #
03a0: 20 53 65 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e Set operations.
03b0: 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 .package require
03c0: 20 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69 73 63 vc::tools::misc
03d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
03e0: 20 20 20 20 20 20 20 3b 20 23 20 54 65 78 74 20 ; # Text
03f0: 66 6f 72 6d 61 74 74 69 6e 67 0a 70 61 63 6b 61 formatting.packa
0400: 67 65 20 72 65 71 75 69 72 65 20 76 63 3a 3a 74 ge require vc::t
0410: 6f 6f 6c 73 3a 3a 74 72 6f 75 62 6c 65 20 20 20 ools::trouble
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0430: 20 3b 20 23 20 45 72 72 6f 72 20 72 65 70 6f 72 ; # Error repor
0440: 74 69 6e 67 2e 0a 70 61 63 6b 61 67 65 20 72 65 ting..package re
0450: 71 75 69 72 65 20 76 63 3a 3a 74 6f 6f 6c 73 3a quire vc::tools:
0460: 3a 6c 6f 67 20 20 20 20 20 20 20 20 20 20 20 20 :log
0470: 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23 20 ; #
0480: 55 73 65 72 20 66 65 65 64 62 61 63 6b 2e 0a 70 User feedback..p
0490: 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 76 ackage require v
04a0: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 c::fossil::impor
04b0: 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 20 20 20 t::cvs::state
04c0: 20 20 20 20 20 3b 20 23 20 53 74 61 74 65 20 73 ; # State s
04d0: 74 6f 72 61 67 65 2e 0a 70 61 63 6b 61 67 65 20 torage..package
04e0: 72 65 71 75 69 72 65 20 76 63 3a 3a 66 6f 73 73 require vc::foss
04f0: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a il::import::cvs:
0500: 3a 69 6e 74 65 67 72 69 74 79 20 20 20 20 3b 20 :integrity ;
0510: 23 20 53 74 61 74 65 20 69 6e 74 65 67 72 69 74 # State integrit
0520: 79 20 63 68 65 63 6b 73 2e 0a 0a 23 20 23 20 23 y checks...# # #
0530: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 # ### ##### ####
0540: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 #### ###########
0550: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 ## #############
0560: 23 23 23 23 23 23 23 23 0a 23 23 0a 0a 73 6e 69 ########.##..sni
0570: 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f t::type ::vc::fo
0580: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 ssil::import::cv
0590: 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 20 s::project::rev
05a0: 7b 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23 {. # # ## ###
05b0: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 ##### ########
05c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 20 #############.
05d0: 20 20 23 23 20 50 75 62 6c 69 63 20 41 50 49 0a ## Public API.
05e0: 0a 20 20 20 20 63 6f 6e 73 74 72 75 63 74 6f 72 . constructor
05f0: 20 7b 70 72 6f 6a 65 63 74 20 63 73 74 79 70 65 {project cstype
0600: 20 73 72 63 69 64 20 69 74 65 6d 73 20 7b 74 68 srcid items {th
0610: 65 69 64 20 7b 7d 7d 7d 20 7b 0a 09 69 66 20 7b eid {}}} {..if {
0620: 24 74 68 65 69 64 20 6e 65 20 22 22 7d 20 7b 0a $theid ne ""} {.
0630: 09 20 20 20 20 73 65 74 20 6d 79 69 64 20 24 74 . set myid $t
0640: 68 65 69 64 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 heid..} else {..
0650: 20 20 20 20 73 65 74 20 6d 79 69 64 20 5b 69 6e set myid [in
0660: 63 72 20 6d 79 63 6f 75 6e 74 65 72 5d 0a 09 7d cr mycounter]..}
0670: 0a 0a 09 69 6e 74 65 67 72 69 74 79 20 61 73 73 ...integrity ass
0680: 65 72 74 20 7b 0a 09 20 20 20 20 5b 69 6e 66 6f ert {.. [info
0690: 20 65 78 69 73 74 73 20 6d 79 63 73 74 79 70 65 exists mycstype
06a0: 28 24 63 73 74 79 70 65 29 5d 0a 09 7d 20 7b 42 ($cstype)]..} {B
06b0: 61 64 20 63 68 61 6e 67 65 73 65 74 20 74 79 70 ad changeset typ
06c0: 65 20 27 24 63 73 74 79 70 65 27 2e 7d 0a 0a 09 e '$cstype'.}...
06d0: 73 65 74 20 6d 79 70 72 6f 6a 65 63 74 20 20 20 set myproject
06e0: 24 70 72 6f 6a 65 63 74 0a 09 73 65 74 20 6d 79 $project..set my
06f0: 74 79 70 65 20 20 20 20 20 20 24 63 73 74 79 70 type $cstyp
0700: 65 0a 09 73 65 74 20 6d 79 74 79 70 65 6f 62 6a e..set mytypeobj
0710: 20 20 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a ::vc::fossil:
0720: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 :import::cvs::pr
0730: 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 24 7b 63 73 oject::rev::${cs
0740: 74 79 70 65 7d 0a 09 73 65 74 20 6d 79 73 72 63 type}..set mysrc
0750: 69 64 09 24 73 72 63 69 64 0a 09 73 65 74 20 6d id.$srcid..set m
0760: 79 69 74 65 6d 73 20 20 20 20 20 24 69 74 65 6d yitems $item
0770: 73 0a 09 73 65 74 20 6d 79 70 6f 73 20 20 20 20 s..set mypos
0780: 20 20 20 7b 7d 20 3b 20 23 20 43 6f 6d 6d 69 74 {} ; # Commit
0790: 20 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6e 6f 74 location is not
07a0: 20 6b 6e 6f 77 6e 20 79 65 74 2e 0a 0a 09 23 20 known yet....#
07b0: 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 Keep track of th
07c0: 65 20 67 65 6e 65 72 61 74 65 64 20 63 68 61 6e e generated chan
07d0: 67 65 73 65 74 73 20 61 6e 64 20 6f 66 20 74 68 gesets and of th
07e0: 65 20 69 6e 76 65 72 73 65 0a 09 23 20 6d 61 70 e inverse..# map
07f0: 70 69 6e 67 20 66 72 6f 6d 20 69 74 65 6d 73 20 ping from items
0800: 74 6f 20 74 68 65 6d 2e 0a 09 6c 61 70 70 65 6e to them...lappen
0810: 64 20 6d 79 63 68 61 6e 67 65 73 65 74 73 20 20 d mychangesets
0820: 20 24 73 65 6c 66 0a 09 73 65 74 20 20 20 20 20 $self..set
0830: 6d 79 69 64 6d 61 70 28 24 6d 79 69 64 29 20 24 myidmap($myid) $
0840: 73 65 6c 66 0a 09 66 6f 72 65 61 63 68 20 69 69 self..foreach ii
0850: 64 20 24 69 74 65 6d 73 20 7b 0a 09 20 20 20 20 d $items {..
0860: 73 65 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 63 set key [list $c
0870: 73 74 79 70 65 20 24 69 69 64 5d 0a 09 20 20 20 stype $iid]..
0880: 20 73 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24 set myitemmap($
0890: 6b 65 79 29 20 24 73 65 6c 66 0a 09 20 20 20 20 key) $self..
08a0: 6c 61 70 70 65 6e 64 20 6d 79 74 69 74 65 6d 73 lappend mytitems
08b0: 20 24 6b 65 79 0a 09 20 20 20 20 6c 6f 67 20 77 $key.. log w
08c0: 72 69 74 65 20 38 20 63 73 65 74 73 20 7b 4d 41 rite 8 csets {MA
08d0: 50 2b 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24 P+ item <$key> $
08e0: 73 65 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74 self = [$self st
08f0: 72 5d 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 r]}..}..return.
0900: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 }.. method
0910: 20 73 74 72 20 7b 7d 20 7b 0a 09 73 65 74 20 73 str {} {..set s
0920: 74 72 20 20 20 20 22 3c 22 0a 09 73 65 74 20 64 tr "<"..set d
0930: 65 74 61 69 6c 20 22 22 0a 09 69 66 20 7b 5b 24 etail ""..if {[$
0940: 6d 79 74 79 70 65 6f 62 6a 20 62 79 73 79 6d 62 mytypeobj bysymb
0950: 6f 6c 5d 7d 20 7b 0a 09 20 20 20 20 73 65 74 20 ol]} {.. set
0960: 64 65 74 61 69 6c 20 22 20 27 5b 73 74 61 74 65 detail " '[state
0970: 20 6f 6e 65 20 7b 0a 09 09 53 45 4c 45 43 54 20 one {...SELECT
0980: 53 2e 6e 61 6d 65 0a 09 09 46 52 4f 4d 20 20 20 S.name...FROM
0990: 73 79 6d 62 6f 6c 20 53 0a 09 09 57 48 45 52 45 symbol S...WHERE
09a0: 20 20 53 2e 73 69 64 20 3d 20 24 6d 79 73 72 63 S.sid = $mysrc
09b0: 69 64 0a 09 20 20 20 20 7d 5d 27 22 0a 09 7d 0a id.. }]'"..}.
09c0: 09 61 70 70 65 6e 64 20 73 74 72 20 22 24 6d 79 .append str "$my
09d0: 74 79 70 65 20 24 7b 6d 79 69 64 7d 24 7b 64 65 type ${myid}${de
09e0: 74 61 69 6c 7d 3e 22 0a 09 72 65 74 75 72 6e 20 tail}>"..return
09f0: 24 73 74 72 0a 20 20 20 20 7d 0a 0a 20 20 20 20 $str. }..
0a00: 6d 65 74 68 6f 64 20 69 64 20 20 20 20 7b 7d 20 method id {}
0a10: 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 64 20 7d { return $myid }
0a20: 0a 20 20 20 20 6d 65 74 68 6f 64 20 69 74 65 6d . method item
0a30: 73 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d s {} { return $m
0a40: 79 74 69 74 65 6d 73 20 7d 0a 20 20 20 20 6d 65 ytitems }. me
0a50: 74 68 6f 64 20 64 61 74 61 20 20 7b 7d 20 7b 20 thod data {} {
0a60: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 6d 79 return [list $my
0a70: 70 72 6f 6a 65 63 74 20 24 6d 79 74 79 70 65 20 project $mytype
0a80: 24 6d 79 73 72 63 69 64 5d 20 7d 0a 0a 20 20 20 $mysrcid] }..
0a90: 20 64 65 6c 65 67 61 74 65 20 6d 65 74 68 6f 64 delegate method
0aa0: 20 62 79 73 79 6d 62 6f 6c 20 20 20 74 6f 20 6d bysymbol to m
0ab0: 79 74 79 70 65 6f 62 6a 0a 20 20 20 20 64 65 6c ytypeobj. del
0ac0: 65 67 61 74 65 20 6d 65 74 68 6f 64 20 62 79 72 egate method byr
0ad0: 65 76 69 73 69 6f 6e 20 74 6f 20 6d 79 74 79 70 evision to mytyp
0ae0: 65 6f 62 6a 0a 20 20 20 20 64 65 6c 65 67 61 74 eobj. delegat
0af0: 65 20 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63 e method isbranc
0b00: 68 20 20 20 74 6f 20 6d 79 74 79 70 65 6f 62 6a h to mytypeobj
0b10: 0a 20 20 20 20 64 65 6c 65 67 61 74 65 20 6d 65 . delegate me
0b20: 74 68 6f 64 20 69 73 74 61 67 20 20 20 20 20 20 thod istag
0b30: 74 6f 20 6d 79 74 79 70 65 6f 62 6a 0a 0a 20 20 to mytypeobj..
0b40: 20 20 6d 65 74 68 6f 64 20 73 65 74 70 6f 73 20 method setpos
0b50: 7b 70 7d 20 7b 20 73 65 74 20 6d 79 70 6f 73 20 {p} { set mypos
0b60: 24 70 20 3b 20 72 65 74 75 72 6e 20 7d 0a 20 20 $p ; return }.
0b70: 20 20 6d 65 74 68 6f 64 20 70 6f 73 20 20 20 20 method pos
0b80: 7b 7d 20 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 {} { return $my
0b90: 70 6f 73 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 pos }.. # res
0ba0: 75 6c 74 20 3d 20 6c 69 73 74 20 28 63 68 61 6e ult = list (chan
0bb0: 67 65 73 65 74 29 0a 20 20 20 20 6d 65 74 68 6f geset). metho
0bc0: 64 20 73 75 63 63 65 73 73 6f 72 73 20 7b 7d 20 d successors {}
0bd0: 7b 0a 09 72 65 74 75 72 6e 20 5b 73 74 72 75 63 {..return [struc
0be0: 74 3a 3a 6c 69 73 74 20 6d 61 70 20 5c 0a 09 09 t::list map \...
0bf0: 20 20 20 20 5b 24 6d 79 74 79 70 65 6f 62 6a 20 [$mytypeobj
0c00: 63 73 5f 73 75 63 63 65 73 73 6f 72 73 20 24 6d cs_successors $m
0c10: 79 69 74 65 6d 73 5d 20 5c 0a 09 09 20 20 20 20 yitems] \...
0c20: 5b 6d 79 74 79 70 65 6d 65 74 68 6f 64 20 6f 66 [mytypemethod of
0c30: 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 ]]. }.. #
0c40: 72 65 73 75 6c 74 20 3d 20 64 69 63 74 20 28 69 result = dict (i
0c50: 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 63 68 61 tem -> list (cha
0c60: 6e 67 65 73 65 74 29 29 0a 20 20 20 20 6d 65 74 ngeset)). met
0c70: 68 6f 64 20 73 75 63 63 65 73 73 6f 72 6d 61 70 hod successormap
0c80: 20 7b 7d 20 7b 0a 09 23 20 4e 4f 54 45 20 2f 20 {} {..# NOTE /
0c90: 46 55 54 55 52 45 3a 20 44 65 66 69 6e 69 74 69 FUTURE: Definiti
0ca0: 76 65 20 62 6f 74 74 6c 65 6e 65 63 6b 20 28 63 ve bottleneck (c
0cb0: 61 6e 20 62 65 20 6d 69 6c 6c 69 6f 6e 73 20 6f an be millions o
0cc0: 66 20 70 61 69 72 73 29 2e 0a 09 23 0a 09 23 20 f pairs)...#..#
0cd0: 4f 6e 6c 79 20 75 73 65 72 20 69 73 20 70 61 73 Only user is pas
0ce0: 73 20 39 2c 20 63 6f 6d 70 75 74 69 6e 67 20 74 s 9, computing t
0cf0: 68 65 20 6c 69 6d 69 74 73 20 6f 66 20 62 61 63 he limits of bac
0d00: 6b 77 61 72 64 0a 09 23 20 62 72 61 6e 63 68 65 kward..# branche
0d10: 73 20 70 65 72 20 62 72 61 6e 63 68 20 69 6e 20 s per branch in
0d20: 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20 54 the changeset. T
0d30: 4f 44 4f 3a 20 46 6f 6c 64 20 74 68 61 74 20 69 ODO: Fold that i
0d40: 6e 74 6f 0a 09 23 20 74 68 65 20 53 51 4c 20 71 nto..# the SQL q
0d50: 75 65 72 79 2c 20 69 2e 65 2e 20 6d 6f 76 65 20 uery, i.e. move
0d60: 74 68 65 20 63 72 75 6e 63 68 69 6e 67 20 66 72 the crunching fr
0d70: 6f 6d 20 54 63 6c 20 74 6f 20 43 2e 0a 0a 09 61 om Tcl to C....a
0d80: 72 72 61 79 20 73 65 74 20 74 6d 70 20 7b 7d 0a rray set tmp {}.
0d90: 09 66 6f 72 65 61 63 68 20 7b 72 65 76 20 63 68 .foreach {rev ch
0da0: 69 6c 64 72 65 6e 7d 20 5b 24 73 65 6c 66 20 6e ildren} [$self n
0db0: 65 78 74 6d 61 70 5d 20 7b 0a 09 20 20 20 20 66 extmap] {.. f
0dc0: 6f 72 65 61 63 68 20 63 68 69 6c 64 20 24 63 68 oreach child $ch
0dd0: 69 6c 64 72 65 6e 20 7b 0a 09 09 6c 61 70 70 65 ildren {...lappe
0de0: 6e 64 20 74 6d 70 28 24 72 65 76 29 20 24 6d 79 nd tmp($rev) $my
0df0: 69 74 65 6d 6d 61 70 28 24 63 68 69 6c 64 29 0a itemmap($child).
0e00: 09 20 20 20 20 7d 0a 09 20 20 20 20 73 65 74 20 . }.. set
0e10: 74 6d 70 28 24 72 65 76 29 20 5b 6c 73 6f 72 74 tmp($rev) [lsort
0e20: 20 2d 75 6e 69 71 75 65 20 24 74 6d 70 28 24 72 -unique $tmp($r
0e30: 65 76 29 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 20 ev)]..}..return
0e40: 5b 61 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a [array get tmp].
0e50: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 }.. # res
0e60: 75 6c 74 20 3d 20 64 69 63 74 20 28 69 74 65 6d ult = dict (item
0e70: 20 2d 3e 20 6c 69 73 74 20 28 63 68 61 6e 67 65 -> list (change
0e80: 73 65 74 29 29 0a 20 20 20 20 6d 65 74 68 6f 64 set)). method
0e90: 20 70 72 65 64 65 63 65 73 73 6f 72 6d 61 70 20 predecessormap
0ea0: 7b 7d 20 7b 0a 09 23 20 4e 4f 54 45 20 2f 20 46 {} {..# NOTE / F
0eb0: 55 54 55 52 45 3a 20 44 65 66 69 6e 69 74 69 76 UTURE: Definitiv
0ec0: 65 20 62 6f 74 74 6c 65 6e 65 63 6b 20 28 63 61 e bottleneck (ca
0ed0: 6e 20 62 65 20 6d 69 6c 6c 69 6f 6e 73 20 6f 66 n be millions of
0ee0: 20 70 61 69 72 73 29 2e 0a 09 23 0a 09 23 20 4f pairs)...#..# O
0ef0: 6e 6c 79 20 75 73 65 72 20 69 73 20 70 61 73 73 nly user is pass
0f00: 20 39 2c 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 9, computing th
0f10: 65 20 6c 69 6d 69 74 73 20 6f 66 20 62 61 63 6b e limits of back
0f20: 77 61 72 64 0a 09 23 20 62 72 61 6e 63 68 65 73 ward..# branches
0f30: 20 70 65 72 20 62 72 61 6e 63 68 20 69 6e 20 74 per branch in t
0f40: 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20 54 4f he changeset. TO
0f50: 44 4f 3a 20 46 6f 6c 64 20 74 68 61 74 20 69 6e DO: Fold that in
0f60: 74 6f 0a 09 23 20 74 68 65 20 53 51 4c 20 71 75 to..# the SQL qu
0f70: 65 72 79 2c 20 69 2e 65 2e 20 6d 6f 76 65 20 74 ery, i.e. move t
0f80: 68 65 20 63 72 75 6e 63 68 69 6e 67 20 66 72 6f he crunching fro
0f90: 6d 20 54 63 6c 20 74 6f 20 43 2e 0a 0a 09 61 72 m Tcl to C....ar
0fa0: 72 61 79 20 73 65 74 20 74 6d 70 20 7b 7d 0a 09 ray set tmp {}..
0fb0: 66 6f 72 65 61 63 68 20 7b 72 65 76 20 63 68 69 foreach {rev chi
0fc0: 6c 64 72 65 6e 7d 20 5b 24 73 65 6c 66 20 70 72 ldren} [$self pr
0fd0: 65 6d 61 70 5d 20 7b 0a 09 20 20 20 20 66 6f 72 emap] {.. for
0fe0: 65 61 63 68 20 63 68 69 6c 64 20 24 63 68 69 6c each child $chil
0ff0: 64 72 65 6e 20 7b 0a 09 09 6c 61 70 70 65 6e 64 dren {...lappend
1000: 20 74 6d 70 28 24 72 65 76 29 20 24 6d 79 69 74 tmp($rev) $myit
1010: 65 6d 6d 61 70 28 24 63 68 69 6c 64 29 0a 09 20 emmap($child)..
1020: 20 20 20 7d 0a 09 20 20 20 20 73 65 74 20 74 6d }.. set tm
1030: 70 28 24 72 65 76 29 20 5b 6c 73 6f 72 74 20 2d p($rev) [lsort -
1040: 75 6e 69 71 75 65 20 24 74 6d 70 28 24 72 65 76 unique $tmp($rev
1050: 29 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b 61 )]..}..return [a
1060: 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 20 20 rray get tmp].
1070: 20 20 7d 0a 0a 20 20 20 20 23 20 69 74 65 6d 20 }.. # item
1080: 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 0a 20 -> list (item).
1090: 20 20 20 6d 65 74 68 6f 64 20 6e 65 78 74 6d 61 method nextma
10a0: 70 20 7b 7d 20 7b 0a 09 23 69 66 20 7b 5b 6c 6c p {} {..#if {[ll
10b0: 65 6e 67 74 68 20 24 6d 79 6e 65 78 74 6d 61 70 ength $mynextmap
10c0: 5d 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 6e ]} { return $myn
10d0: 65 78 74 6d 61 70 20 7d 0a 09 24 6d 79 74 79 70 extmap }..$mytyp
10e0: 65 6f 62 6a 20 73 75 63 63 65 73 73 6f 72 73 20 eobj successors
10f0: 74 6d 70 20 24 6d 79 69 74 65 6d 73 0a 09 72 65 tmp $myitems..re
1100: 74 75 72 6e 20 5b 61 72 72 61 79 20 67 65 74 20 turn [array get
1110: 74 6d 70 5d 0a 09 23 73 65 74 20 6d 79 6e 65 78 tmp]..#set mynex
1120: 74 6d 61 70 20 5b 61 72 72 61 79 20 67 65 74 20 tmap [array get
1130: 74 6d 70 5d 0a 09 23 72 65 74 75 72 6e 20 24 6d tmp]..#return $m
1140: 79 6e 65 78 74 6d 61 70 0a 20 20 20 20 7d 0a 0a ynextmap. }..
1150: 20 20 20 20 23 20 69 74 65 6d 20 2d 3e 20 6c 69 # item -> li
1160: 73 74 20 28 69 74 65 6d 29 0a 20 20 20 20 6d 65 st (item). me
1170: 74 68 6f 64 20 70 72 65 6d 61 70 20 7b 7d 20 7b thod premap {} {
1180: 0a 09 23 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 ..#if {[llength
1190: 24 6d 79 70 72 65 6d 61 70 5d 7d 20 7b 20 72 65 $mypremap]} { re
11a0: 74 75 72 6e 20 24 6d 79 70 72 65 6d 61 70 20 7d turn $mypremap }
11b0: 0a 09 24 6d 79 74 79 70 65 6f 62 6a 20 70 72 65 ..$mytypeobj pre
11c0: 64 65 63 65 73 73 6f 72 73 20 74 6d 70 20 24 6d decessors tmp $m
11d0: 79 69 74 65 6d 73 0a 09 72 65 74 75 72 6e 20 5b yitems..return [
11e0: 61 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 09 array get tmp]..
11f0: 23 73 65 74 20 6d 79 70 72 65 6d 61 70 20 5b 61 #set mypremap [a
1200: 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 09 23 rray get tmp]..#
1210: 72 65 74 75 72 6e 20 24 6d 79 70 72 65 6d 61 70 return $mypremap
1220: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 . }.. meth
1230: 6f 64 20 62 72 65 61 6b 69 6e 74 65 72 6e 61 6c od breakinternal
1240: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 7b 7d 20 dependencies {}
1250: 7b 0a 0a 09 23 23 0a 09 23 23 20 4e 4f 54 45 3a {...##..## NOTE:
1260: 20 54 68 69 73 20 6d 65 74 68 6f 64 2c 20 6d 61 This method, ma
1270: 79 62 65 20 69 6e 20 63 6f 6e 6a 75 6e 63 74 69 ybe in conjuncti
1280: 6f 6e 20 77 69 74 68 20 69 74 73 20 63 61 6c 6c on with its call
1290: 65 72 0a 09 23 23 20 20 20 20 20 20 20 73 65 65 er..## see
12a0: 6d 73 20 74 6f 20 62 65 20 61 20 6d 65 6d 6f 72 ms to be a memor
12b0: 79 20 68 6f 67 2c 20 65 73 70 65 63 69 61 6c 6c y hog, especiall
12c0: 79 20 66 6f 72 20 6c 61 72 67 65 0a 09 23 23 20 y for large..##
12d0: 20 20 20 20 20 20 63 68 61 6e 67 65 73 65 74 73 changesets
12e0: 2c 20 77 69 74 68 20 27 6c 61 72 67 65 27 20 6d , with 'large' m
12f0: 65 61 6e 69 6e 67 20 74 6f 20 68 61 76 65 20 61 eaning to have a
1300: 20 27 6c 6f 6e 67 20 6c 69 73 74 0a 09 23 23 20 'long list..##
1310: 20 20 20 20 20 20 6f 66 20 69 74 65 6d 73 2c 20 of items,
1320: 73 65 76 65 72 61 6c 20 74 68 6f 75 73 61 6e 64 several thousand
1330: 27 2e 20 49 6e 76 65 73 74 69 67 61 74 65 20 77 '. Investigate w
1340: 68 65 72 65 20 74 68 65 0a 09 23 23 20 20 20 20 here the..##
1350: 20 20 20 6d 65 6d 6f 72 79 20 69 73 20 73 70 65 memory is spe
1360: 6e 74 20 61 6e 64 20 74 68 65 6e 20 6c 6f 6f 6b nt and then look
1370: 20 66 6f 72 20 77 61 79 73 20 6f 66 20 72 65 63 for ways of rec
1380: 74 69 66 79 69 6e 67 0a 09 23 23 20 20 20 20 20 tifying..##
1390: 20 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 09 the problem...
13a0: 23 23 0a 0a 09 23 20 54 68 69 73 20 6d 65 74 68 ##...# This meth
13b0: 6f 64 20 69 6e 73 70 65 63 74 73 20 74 68 65 20 od inspects the
13c0: 63 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20 69 changesets for i
13d0: 6e 74 65 72 6e 61 6c 0a 09 23 20 64 65 70 65 6e nternal..# depen
13e0: 64 65 6e 63 69 65 73 2e 20 4e 6f 74 68 69 6e 67 dencies. Nothing
13f0: 20 69 73 20 64 6f 6e 65 20 69 66 20 74 68 65 72 is done if ther
1400: 65 20 61 72 65 20 6e 6f 0a 09 23 20 73 75 63 68 e are no..# such
1410: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 . Otherwise the
1420: 63 68 61 6e 67 65 73 65 74 20 69 73 20 73 70 6c changeset is spl
1430: 69 74 20 69 6e 74 6f 20 61 20 73 65 74 20 6f 66 it into a set of
1440: 0a 09 23 20 66 72 61 67 6d 65 6e 74 73 20 77 69 ..# fragments wi
1450: 74 68 6f 75 74 20 69 6e 74 65 72 6e 61 6c 20 64 thout internal d
1460: 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 74 72 61 ependencies, tra
1470: 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 09 23 nsforming the..#
1480: 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 internal depend
1490: 65 6e 63 69 65 73 20 69 6e 74 6f 20 65 78 74 65 encies into exte
14a0: 72 6e 61 6c 20 6f 6e 65 73 2e 20 54 68 65 20 6e rnal ones. The n
14b0: 65 77 20 63 68 61 6e 67 65 73 65 74 73 0a 09 23 ew changesets..#
14c0: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 are added to th
14d0: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 68 e list of all ch
14e0: 61 6e 67 65 73 65 74 73 2e 0a 0a 09 23 20 57 65 angesets....# We
14f0: 20 70 65 72 66 6f 72 6d 20 61 6c 6c 20 6e 65 63 perform all nec
1500: 65 73 73 61 72 79 20 73 70 6c 69 74 73 20 69 6e essary splits in
1510: 20 6f 6e 65 20 67 6f 2c 20 69 6e 73 74 65 61 64 one go, instead
1520: 20 6f 66 20 6f 6e 6c 79 0a 09 23 20 6f 6e 65 2e of only..# one.
1530: 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 61 6c The previous al
1540: 67 6f 72 69 74 68 6d 2c 20 61 64 61 70 74 65 64 gorithm, adapted
1550: 20 66 72 6f 6d 20 63 76 73 32 73 76 6e 2c 20 63 from cvs2svn, c
1560: 6f 6d 70 75 74 65 64 0a 09 23 20 61 20 6c 6f 74 omputed..# a lot
1570: 20 6f 66 20 73 74 61 74 65 20 77 68 69 63 68 20 of state which
1580: 77 61 73 20 74 68 72 6f 77 6e 20 61 77 61 79 20 was thrown away
1590: 61 6e 64 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 and then compute
15a0: 64 20 61 67 61 69 6e 0a 09 23 20 66 6f 72 20 65 d again..# for e
15b0: 61 63 68 20 6f 66 20 74 68 65 20 66 72 61 67 6d ach of the fragm
15c0: 65 6e 74 73 2e 20 49 74 20 73 68 6f 75 6c 64 20 ents. It should
15d0: 62 65 20 65 61 73 69 65 72 20 74 6f 20 75 70 64 be easier to upd
15e0: 61 74 65 20 61 6e 64 0a 09 23 20 72 65 75 73 65 ate and..# reuse
15f0: 20 74 68 61 74 20 73 74 61 74 65 2e 0a 0a 09 23 that state....#
1600: 20 54 68 65 20 63 6f 64 65 20 63 68 65 63 6b 73 The code checks
1610: 20 6f 6e 6c 79 20 73 75 63 65 73 73 6f 72 20 64 only sucessor d
1620: 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 20 ependencies, as
1630: 74 68 69 73 0a 09 23 20 61 75 74 6f 6d 61 74 69 this..# automati
1640: 63 61 6c 6c 79 20 63 6f 76 65 72 73 20 74 68 65 cally covers the
1650: 20 70 72 65 64 65 63 65 73 73 6f 72 20 64 65 70 predecessor dep
1660: 65 6e 64 65 6e 63 69 65 73 20 61 73 20 77 65 6c endencies as wel
1670: 6c 20 28 41 0a 09 23 20 73 75 63 63 65 73 73 6f l (A..# successo
1680: 72 20 64 65 70 65 6e 64 65 6e 63 79 20 61 20 2d r dependency a -
1690: 3e 20 62 20 69 73 20 61 6c 73 6f 20 61 20 70 72 > b is also a pr
16a0: 65 64 65 63 65 73 73 6f 72 20 64 65 70 65 6e 64 edecessor depend
16b0: 65 6e 63 79 0a 09 23 20 62 20 2d 3e 20 61 29 2e ency..# b -> a).
16c0: 0a 0a 09 23 20 41 72 72 61 79 20 6f 66 20 64 65 ...# Array of de
16d0: 70 65 6e 64 65 6e 63 69 65 73 20 28 70 61 72 65 pendencies (pare
16e0: 6e 74 20 2d 3e 20 63 68 69 6c 64 29 2e 20 54 68 nt -> child). Th
16f0: 69 73 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f is is pulled fro
1700: 6d 0a 09 23 20 74 68 65 20 73 74 61 74 65 2c 20 m..# the state,
1710: 61 6e 64 20 6c 69 6d 69 74 65 64 20 74 6f 20 73 and limited to s
1720: 75 63 63 65 73 73 6f 72 73 20 77 69 74 68 69 6e uccessors within
1730: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 0a the changeset..
1740: 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 70 65 ..array set depe
1750: 6e 64 65 6e 63 69 65 73 20 7b 7d 0a 09 24 6d 79 ndencies {}..$my
1760: 74 79 70 65 6f 62 6a 20 69 6e 74 65 72 6e 61 6c typeobj internal
1770: 73 75 63 63 65 73 73 6f 72 73 20 64 65 70 65 6e successors depen
1780: 64 65 6e 63 69 65 73 20 24 6d 79 69 74 65 6d 73 dencies $myitems
1790: 0a 09 69 66 20 7b 21 5b 61 72 72 61 79 20 73 69 ..if {![array si
17a0: 7a 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73 5d ze dependencies]
17b0: 7d 20 7b 72 65 74 75 72 6e 20 30 7d 20 3b 20 23 } {return 0} ; #
17c0: 20 4e 6f 74 68 69 6e 67 20 74 6f 20 62 72 65 61 Nothing to brea
17d0: 6b 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 35 k....log write 5
17e0: 20 63 73 65 74 73 20 2e 2e 2e 5b 24 73 65 6c 66 csets ...[$self
17f0: 20 73 74 72 5d 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e str]...........
1800: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
1810: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
1820: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 0a 0a 09 23 ...............#
1830: 20 57 65 20 68 61 76 65 20 69 6e 74 65 72 6e 61 We have interna
1840: 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 l dependencies t
1850: 6f 20 62 72 65 61 6b 2e 20 57 65 20 6e 6f 77 20 o break. We now
1860: 69 74 65 72 61 74 65 20 6f 76 65 72 0a 09 23 20 iterate over..#
1870: 61 6c 6c 20 70 6f 73 69 74 69 6f 6e 73 20 69 6e all positions in
1880: 20 74 68 65 20 6c 69 73 74 20 28 77 68 69 63 68 the list (which
1890: 20 69 73 20 63 68 72 6f 6e 6f 6c 6f 67 69 63 61 is chronologica
18a0: 6c 2c 20 61 74 20 6c 65 61 73 74 0a 09 23 20 61 l, at least..# a
18b0: 73 20 66 61 72 20 61 73 20 74 68 65 20 74 69 6d s far as the tim
18c0: 65 73 74 61 6d 70 73 20 61 72 65 20 63 6f 72 72 estamps are corr
18d0: 65 63 74 20 61 6e 64 20 75 6e 69 71 75 65 29 20 ect and unique)
18e0: 61 6e 64 0a 09 23 20 64 65 74 65 72 6d 69 6e 65 and..# determine
18f0: 20 74 68 65 20 62 65 73 74 20 70 6f 73 69 74 69 the best positi
1900: 6f 6e 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b on for the break
1910: 2c 20 62 79 20 74 72 79 69 6e 67 20 74 6f 0a 09 , by trying to..
1920: 23 20 62 72 65 61 6b 20 61 73 20 6d 61 6e 79 20 # break as many
1930: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 61 73 20 dependencies as
1940: 70 6f 73 73 69 62 6c 65 20 69 6e 20 6f 6e 65 20 possible in one
1950: 67 6f 2e 20 57 68 65 6e 20 61 0a 09 23 20 62 72 go. When a..# br
1960: 65 61 6b 20 77 61 73 20 66 6f 75 6e 64 20 74 68 eak was found th
1970: 69 73 20 69 73 20 72 65 64 6f 6e 65 20 66 6f 72 is is redone for
1980: 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 20 63 the fragments c
1990: 6f 6d 69 6e 67 20 61 6e 64 0a 09 23 20 61 66 74 oming and..# aft
19a0: 65 72 2c 20 61 66 74 65 72 20 75 70 64 69 6e 67 er, after upding
19b0: 20 74 68 65 20 63 72 6f 73 73 69 6e 67 20 69 6e the crossing in
19c0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 0a 09 23 20 44 formation....# D
19d0: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 3a 0a ata structures:.
19e0: 09 23 20 4d 61 70 3a 20 20 50 4f 53 20 20 20 72 .# Map: POS r
19f0: 65 76 69 73 69 6f 6e 20 69 64 20 20 20 20 20 20 evision id
1a00: 2d 3e 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c -> position in l
1a10: 69 73 74 2e 0a 09 23 20 20 20 20 20 20 20 43 52 ist...# CR
1a20: 4f 53 53 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 OSS position in
1a30: 6c 69 73 74 20 2d 3e 20 6e 75 6d 62 65 72 20 6f list -> number o
1a40: 66 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 63 f dependencies c
1a50: 72 6f 73 73 69 6e 67 20 69 74 0a 09 23 20 20 20 rossing it..#
1a60: 20 20 20 20 44 45 50 43 20 20 64 65 70 65 6e 64 DEPC depend
1a70: 65 6e 63 79 20 20 20 20 20 20 20 2d 3e 20 70 6f ency -> po
1a80: 73 69 74 69 6f 6e 73 20 69 74 20 63 72 6f 73 73 sitions it cross
1a90: 65 73 0a 09 23 20 4c 69 73 74 3a 20 52 41 4e 47 es..# List: RANG
1aa0: 45 20 4f 66 20 74 68 65 20 70 6f 73 69 74 69 6f E Of the positio
1ab0: 6e 73 20 69 74 73 65 6c 66 2e 0a 09 23 20 41 20 ns itself...# A
1ac0: 64 65 70 65 6e 64 65 6e 63 79 20 69 73 20 61 20 dependency is a
1ad0: 73 69 6e 67 6c 65 2d 65 6c 65 6d 65 6e 74 20 6d single-element m
1ae0: 61 70 20 70 61 72 65 6e 74 20 2d 3e 20 63 68 69 ap parent -> chi
1af0: 6c 64 0a 0a 09 49 6e 69 74 69 61 6c 69 7a 65 42 ld...InitializeB
1b00: 72 65 61 6b 53 74 61 74 65 20 24 6d 79 69 74 65 reakState $myite
1b10: 6d 73 0a 0a 09 73 65 74 20 66 72 61 67 6d 65 6e ms...set fragmen
1b20: 74 73 20 7b 7d 0a 09 73 65 74 20 6e 65 77 20 20 ts {}..set new
1b30: 20 20 20 20 20 5b 6c 69 73 74 20 24 72 61 6e 67 [list $rang
1b40: 65 5d 0a 09 61 72 72 61 79 20 73 65 74 20 62 72 e]..array set br
1b50: 65 61 6b 73 20 7b 7d 0a 0a 09 23 20 49 6e 73 74 eaks {}...# Inst
1b60: 65 61 64 20 6f 66 20 6f 6e 65 20 6c 69 73 74 20 ead of one list
1b70: 68 6f 6c 64 69 6e 67 20 62 6f 74 68 20 70 72 6f holding both pro
1b80: 63 65 73 73 65 64 20 61 6e 64 20 70 65 6e 64 69 cessed and pendi
1b90: 6e 67 0a 09 23 20 66 72 61 67 6d 65 6e 74 73 20 ng..# fragments
1ba0: 77 65 20 75 73 65 20 74 77 6f 2c 20 6f 6e 65 20 we use two, one
1bb0: 66 6f 72 20 74 68 65 20 66 72 61 6d 65 6e 74 73 for the framents
1bc0: 20 74 6f 20 70 72 6f 63 65 73 73 2c 20 6f 6e 65 to process, one
1bd0: 0a 09 23 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 ..# to hold the
1be0: 6e 65 77 20 66 72 61 67 6d 65 6e 74 73 2c 20 61 new fragments, a
1bf0: 6e 64 20 74 68 65 20 6c 61 74 74 65 72 20 69 73 nd the latter is
1c00: 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 0a 09 copied to the..
1c10: 23 20 66 6f 72 6d 65 72 20 77 68 65 6e 20 74 68 # former when th
1c20: 65 79 20 72 75 6e 20 6f 75 74 2e 20 54 68 69 73 ey run out. This
1c30: 20 6b 65 65 70 73 20 74 68 65 20 6c 69 73 74 20 keeps the list
1c40: 6f 66 20 70 65 6e 64 69 6e 67 0a 09 23 20 66 72 of pending..# fr
1c50: 61 67 6d 65 6e 74 73 20 73 68 6f 72 74 20 77 69 agments short wi
1c60: 74 68 6f 75 74 20 73 61 63 72 69 66 69 63 69 6e thout sacrificin
1c70: 67 20 73 70 65 65 64 20 62 79 20 73 68 69 66 74 g speed by shift
1c80: 69 6e 67 20 73 74 75 66 66 0a 09 23 20 64 6f 77 ing stuff..# dow
1c90: 6e 2e 20 57 65 20 65 73 70 65 63 69 61 6c 6c 79 n. We especially
1ca0: 20 64 72 6f 70 20 74 68 65 20 6d 65 6d 6f 72 79 drop the memory
1cb0: 20 6f 66 20 66 72 61 67 6d 65 6e 74 73 20 62 72 of fragments br
1cc0: 6f 6b 65 6e 0a 09 23 20 64 75 72 69 6e 67 20 70 oken..# during p
1cd0: 72 6f 63 65 73 73 69 6e 67 20 61 66 74 65 72 20 rocessing after
1ce0: 61 20 73 68 6f 72 74 20 74 69 6d 65 2c 20 69 6e a short time, in
1cf0: 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 stead of letting
1d00: 20 69 74 0a 09 23 20 63 6f 6e 73 75 6d 65 20 6d it..# consume m
1d10: 65 6d 6f 72 79 2e 0a 0a 09 77 68 69 6c 65 20 7b emory....while {
1d20: 5b 6c 6c 65 6e 67 74 68 20 24 6e 65 77 5d 7d 20 [llength $new]}
1d30: 7b 0a 0a 09 20 20 20 20 73 65 74 20 70 65 6e 64 {... set pend
1d40: 69 6e 67 20 24 6e 65 77 0a 09 20 20 20 20 73 65 ing $new.. se
1d50: 74 20 6e 65 77 20 20 20 20 20 7b 7d 0a 09 20 20 t new {}..
1d60: 20 20 73 65 74 20 61 74 20 20 20 20 20 20 30 0a set at 0.
1d70: 0a 09 20 20 20 20 77 68 69 6c 65 20 7b 24 61 74 .. while {$at
1d80: 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24 70 65 6e < [llength $pen
1d90: 64 69 6e 67 5d 7d 20 7b 0a 09 09 73 65 74 20 63 ding]} {...set c
1da0: 75 72 72 65 6e 74 20 5b 6c 69 6e 64 65 78 20 24 urrent [lindex $
1db0: 70 65 6e 64 69 6e 67 20 24 61 74 5d 0a 0a 09 09 pending $at]....
1dc0: 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74 log write 6 cset
1dd0: 73 20 7b 2e 20 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e s {. . .. ... ..
1de0: 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e ... ........ ...
1df0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 7d 0a 09 09 6c 6f ..........}...lo
1e00: 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 g write 6 csets
1e10: 7b 53 63 68 65 64 75 6c 65 64 20 20 20 5b 6a 6f {Scheduled [jo
1e20: 69 6e 20 5b 50 52 73 20 5b 6c 72 61 6e 67 65 20 in [PRs [lrange
1e30: 24 70 65 6e 64 69 6e 67 20 24 61 74 20 65 6e 64 $pending $at end
1e40: 5d 5d 20 7b 20 7d 5d 7d 0a 09 09 6c 6f 67 20 77 ]] { }]}...log w
1e50: 72 69 74 65 20 36 20 63 73 65 74 73 20 7b 43 6f rite 6 csets {Co
1e60: 6e 73 69 64 65 72 69 6e 67 20 5b 50 52 20 24 63 nsidering [PR $c
1e70: 75 72 72 65 6e 74 5d 20 5c 5b 24 61 74 2f 5b 6c urrent] \[$at/[l
1e80: 6c 65 6e 67 74 68 20 24 70 65 6e 64 69 6e 67 5d length $pending]
1e90: 5c 5d 7d 0a 0a 09 09 73 65 74 20 62 65 73 74 20 \]}....set best
1ea0: 5b 46 69 6e 64 42 65 73 74 42 72 65 61 6b 20 24 [FindBestBreak $
1eb0: 63 75 72 72 65 6e 74 5d 0a 0a 09 09 69 66 20 7b current]....if {
1ec0: 24 62 65 73 74 20 3c 20 30 7d 20 7b 0a 09 09 20 $best < 0} {...
1ed0: 20 20 20 23 20 54 68 65 20 69 6e 73 70 65 63 74 # The inspect
1ee0: 65 64 20 72 61 6e 67 65 20 68 61 73 20 6e 6f 20 ed range has no
1ef0: 69 6e 74 65 72 6e 61 6c 0a 09 09 20 20 20 20 23 internal... #
1f00: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 54 dependencies. T
1f10: 68 69 73 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 his is a complet
1f20: 65 20 66 72 61 67 6d 65 6e 74 2e 0a 09 09 20 20 e fragment....
1f30: 20 20 6c 61 70 70 65 6e 64 20 66 72 61 67 6d 65 lappend fragme
1f40: 6e 74 73 20 24 63 75 72 72 65 6e 74 0a 0a 09 09 nts $current....
1f50: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 36 20 log write 6
1f60: 63 73 65 74 73 20 22 4e 6f 20 62 72 65 61 6b 73 csets "No breaks
1f70: 2c 20 66 69 6e 61 6c 22 0a 09 09 7d 20 65 6c 73 , final"...} els
1f80: 65 20 7b 0a 09 09 20 20 20 20 23 20 53 70 6c 69 e {... # Spli
1f90: 74 20 74 68 65 20 72 61 6e 67 65 20 61 6e 64 20 t the range and
1fa0: 73 63 68 65 64 75 6c 65 20 74 68 65 20 72 65 73 schedule the res
1fb0: 75 6c 74 69 6e 67 0a 09 09 20 20 20 20 23 20 66 ulting... # f
1fc0: 72 61 67 6d 65 6e 74 73 20 66 6f 72 20 66 75 72 ragments for fur
1fd0: 74 68 65 72 20 69 6e 73 70 65 63 74 69 6f 6e 2e ther inspection.
1fe0: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 0a 09 09 Remember the...
1ff0: 20 20 20 20 23 20 6e 75 6d 62 65 72 20 6f 66 20 # number of
2000: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 63 75 74 dependencies cut
2010: 20 62 65 66 6f 72 65 20 77 65 20 72 65 6d 6f 76 before we remov
2020: 65 20 74 68 65 6d 0a 09 09 20 20 20 20 23 20 66 e them... # f
2030: 72 6f 6d 20 63 6f 6e 73 69 64 65 72 61 74 69 6f rom consideratio
2040: 6e 2c 20 66 6f 72 20 64 6f 63 75 6d 65 6e 74 61 n, for documenta
2050: 74 69 6f 6e 20 6c 61 74 65 72 2e 0a 0a 09 09 20 tion later.....
2060: 20 20 20 73 65 74 20 62 72 65 61 6b 73 28 24 62 set breaks($b
2070: 65 73 74 29 20 24 63 72 6f 73 73 28 24 62 65 73 est) $cross($bes
2080: 74 29 0a 0a 09 09 20 20 20 20 6c 6f 67 20 77 72 t).... log wr
2090: 69 74 65 20 36 20 63 73 65 74 73 20 22 42 65 73 ite 6 csets "Bes
20a0: 74 20 62 72 65 61 6b 20 40 20 24 62 65 73 74 2c t break @ $best,
20b0: 20 63 75 74 74 69 6e 67 20 5b 6e 73 70 20 24 63 cutting [nsp $c
20c0: 72 6f 73 73 28 24 62 65 73 74 29 20 64 65 70 65 ross($best) depe
20d0: 6e 64 65 6e 63 79 20 64 65 70 65 6e 64 65 6e 63 ndency dependenc
20e0: 69 65 73 5d 22 0a 0a 09 09 20 20 20 20 23 20 4e ies]".... # N
20f0: 6f 74 65 3a 20 54 68 65 20 76 61 6c 75 65 20 6f ote: The value o
2100: 66 20 62 65 73 74 20 69 73 20 61 6e 20 61 62 6f f best is an abo
2110: 6c 75 74 65 20 6c 6f 63 61 74 69 6f 6e 0a 09 09 lute location...
2120: 20 20 20 20 23 20 69 6e 20 6d 79 69 74 65 6d 73 # in myitems
2130: 2e 20 55 73 65 20 74 68 65 20 73 74 61 72 74 20 . Use the start
2140: 6f 66 20 63 75 72 72 65 6e 74 20 74 6f 20 6d 61 of current to ma
2150: 6b 65 20 69 74 0a 09 09 20 20 20 20 23 20 61 6e ke it... # an
2160: 20 69 6e 64 65 78 20 61 62 73 6f 6c 75 74 65 20 index absolute
2170: 74 6f 20 63 75 72 72 65 6e 74 2e 0a 0a 09 09 20 to current.....
2180: 20 20 20 73 65 74 20 62 72 65 6c 20 5b 65 78 70 set brel [exp
2190: 72 20 7b 24 62 65 73 74 20 2d 20 5b 6c 69 6e 64 r {$best - [lind
21a0: 65 78 20 24 63 75 72 72 65 6e 74 20 30 5d 7d 5d ex $current 0]}]
21b0: 0a 09 09 20 20 20 20 73 65 74 20 62 6e 65 78 74 ... set bnext
21c0: 20 24 62 72 65 6c 20 3b 20 69 6e 63 72 20 62 6e $brel ; incr bn
21d0: 65 78 74 0a 09 09 20 20 20 20 73 65 74 20 66 72 ext... set fr
21e0: 61 67 62 65 66 6f 72 65 20 5b 6c 72 61 6e 67 65 agbefore [lrange
21f0: 20 24 63 75 72 72 65 6e 74 20 30 20 24 62 72 65 $current 0 $bre
2200: 6c 5d 0a 09 09 20 20 20 20 73 65 74 20 66 72 61 l]... set fra
2210: 67 61 66 74 65 72 20 20 5b 6c 72 61 6e 67 65 20 gafter [lrange
2220: 24 63 75 72 72 65 6e 74 20 24 62 6e 65 78 74 20 $current $bnext
2230: 65 6e 64 5d 0a 0a 09 09 20 20 20 20 6c 6f 67 20 end].... log
2240: 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22 4e write 6 csets "N
2250: 65 77 20 70 69 65 63 65 73 20 20 5b 50 52 20 24 ew pieces [PR $
2260: 66 72 61 67 62 65 66 6f 72 65 5d 20 5b 50 52 20 fragbefore] [PR
2270: 24 66 72 61 67 61 66 74 65 72 5d 22 0a 0a 09 09 $fragafter]"....
2280: 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 integrity as
2290: 73 65 72 74 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 sert {[llength $
22a0: 66 72 61 67 62 65 66 6f 72 65 5d 7d 20 7b 46 6f fragbefore]} {Fo
22b0: 75 6e 64 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 und zero-length
22c0: 66 72 61 67 6d 65 6e 74 20 61 74 20 74 68 65 20 fragment at the
22d0: 62 65 67 69 6e 6e 69 6e 67 7d 0a 09 09 20 20 20 beginning}...
22e0: 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 integrity asser
22f0: 74 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 72 61 t {[llength $fra
2300: 67 61 66 74 65 72 5d 7d 20 20 7b 46 6f 75 6e 64 gafter]} {Found
2310: 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 72 61 zero-length fra
2320: 67 6d 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 gment at the end
2330: 7d 0a 0a 09 09 20 20 20 20 6c 61 70 70 65 6e 64 }.... lappend
2340: 20 6e 65 77 20 24 66 72 61 67 62 65 66 6f 72 65 new $fragbefore
2350: 20 24 66 72 61 67 61 66 74 65 72 0a 09 09 20 20 $fragafter...
2360: 20 20 43 75 74 41 74 20 24 62 65 73 74 0a 09 09 CutAt $best...
2370: 7d 0a 0a 09 09 69 6e 63 72 20 61 74 0a 09 20 20 }....incr at..
2380: 20 20 7d 0a 09 7d 0a 0a 09 6c 6f 67 20 77 72 69 }..}...log wri
2390: 74 65 20 36 20 63 73 65 74 73 20 22 2e 20 2e 20 te 6 csets ". .
23a0: 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e 2e .. ... ..... ...
23b0: 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ..... ..........
23c0: 2e 2e 2e 22 0a 0a 09 23 20 28 2a 29 20 57 65 20 ..."...# (*) We
23d0: 63 6c 65 61 72 20 6f 75 74 20 74 68 65 20 61 73 clear out the as
23e0: 73 6f 63 69 61 74 65 64 20 70 61 72 74 20 6f 66 sociated part of
23f0: 20 74 68 65 20 6d 79 69 74 65 6d 6d 61 70 0a 09 the myitemmap..
2400: 23 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6e 64 65 # in-memory inde
2410: 78 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e x in preparation
2420: 20 66 6f 72 20 6e 65 77 20 64 61 74 61 2e 20 41 for new data. A
2430: 20 73 69 6d 70 6c 65 20 75 6e 73 65 74 0a 09 23 simple unset..#
2440: 20 69 73 20 65 6e 6f 75 67 68 2c 20 77 65 20 68 is enough, we h
2450: 61 76 65 20 6e 6f 20 73 79 6d 62 6f 6c 20 63 68 ave no symbol ch
2460: 61 6e 67 65 73 65 74 73 20 61 74 20 74 68 69 73 angesets at this
2470: 20 74 69 6d 65 2c 20 61 6e 64 0a 09 23 20 74 68 time, and..# th
2480: 75 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 us never more th
2490: 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 an one reference
24a0: 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 0a 09 in the list....
24b0: 66 6f 72 65 61 63 68 20 69 69 64 20 24 6d 79 69 foreach iid $myi
24c0: 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65 74 20 tems {.. set
24d0: 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79 74 79 70 key [list $mytyp
24e0: 65 20 24 69 69 64 5d 0a 09 20 20 20 20 75 6e 73 e $iid].. uns
24f0: 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24 6b 65 et myitemmap($ke
2500: 79 29 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 y).. log writ
2510: 65 20 38 20 63 73 65 74 73 20 7b 4d 41 50 2d 20 e 8 csets {MAP-
2520: 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73 65 6c item <$key> $sel
2530: 66 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d 7d f = [$self str]}
2540: 0a 09 7d 0a 0a 09 23 20 43 72 65 61 74 65 20 63 ..}...# Create c
2550: 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20 74 68 hangesets for th
2560: 65 20 66 72 61 67 6d 65 6e 74 73 2c 20 72 65 75 e fragments, reu
2570: 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 sing the current
2580: 20 6f 6e 65 0a 09 23 20 66 6f 72 20 74 68 65 20 one..# for the
2590: 66 69 72 73 74 20 66 72 61 67 6d 65 6e 74 2e 20 first fragment.
25a0: 57 65 20 73 6f 72 74 20 74 68 65 6d 20 69 6e 20 We sort them in
25b0: 6f 72 64 65 72 20 74 6f 20 61 6c 6c 6f 77 0a 09 order to allow..
25c0: 23 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 67 # checking for g
25d0: 61 70 73 20 61 6e 64 20 6e 69 63 65 20 6d 65 73 aps and nice mes
25e0: 73 61 67 65 73 2e 0a 0a 09 73 65 74 20 66 72 61 sages....set fra
25f0: 67 6d 65 6e 74 73 20 5b 6c 73 6f 72 74 20 2d 69 gments [lsort -i
2600: 6e 64 65 78 20 30 20 2d 69 6e 74 65 67 65 72 20 ndex 0 -integer
2610: 24 66 72 61 67 6d 65 6e 74 73 5d 0a 0a 09 23 70 $fragments]...#p
2620: 75 74 73 20 5c 74 2e 5b 6a 6f 69 6e 20 5b 50 52 uts \t.[join [PR
2630: 73 20 24 66 72 61 67 6d 65 6e 74 73 5d 20 2e 5c s $fragments] .\
2640: 6e 5c 74 2e 5d 2e 0a 0a 09 42 6f 72 64 65 72 20 n\t.]....Border
2650: 5b 6c 69 6e 64 65 78 20 24 66 72 61 67 6d 65 6e [lindex $fragmen
2660: 74 73 20 30 5d 20 66 69 72 73 74 73 20 66 69 72 ts 0] firsts fir
2670: 73 74 65 0a 0a 09 69 6e 74 65 67 72 69 74 79 20 ste...integrity
2680: 61 73 73 65 72 74 20 7b 24 66 69 72 73 74 73 20 assert {$firsts
2690: 3d 3d 20 30 7d 20 7b 42 61 64 20 66 72 61 67 6d == 0} {Bad fragm
26a0: 65 6e 74 20 73 74 61 72 74 20 40 20 24 66 69 72 ent start @ $fir
26b0: 73 74 73 2c 20 67 61 70 2c 20 6f 72 20 62 65 66 sts, gap, or bef
26c0: 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 ore beginning of
26d0: 20 74 68 65 20 72 61 6e 67 65 7d 0a 0a 09 73 65 the range}...se
26e0: 74 20 6c 61 73 74 65 20 24 66 69 72 73 74 65 0a t laste $firste.
26f0: 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65 6e .foreach fragmen
2700: 74 20 5b 6c 72 61 6e 67 65 20 24 66 72 61 67 6d t [lrange $fragm
2710: 65 6e 74 73 20 31 20 65 6e 64 5d 20 7b 0a 09 20 ents 1 end] {..
2720: 20 20 20 42 6f 72 64 65 72 20 24 66 72 61 67 6d Border $fragm
2730: 65 6e 74 20 73 20 65 0a 09 20 20 20 20 69 6e 74 ent s e.. int
2740: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24 egrity assert {$
2750: 6c 61 73 74 65 20 3d 3d 20 28 24 73 20 2d 20 31 laste == ($s - 1
2760: 29 7d 20 7b 42 61 64 20 66 72 61 67 6d 65 6e 74 )} {Bad fragment
2770: 20 62 6f 72 64 65 72 20 3c 24 6c 61 73 74 65 20 border <$laste
2780: 7c 20 24 73 3e 2c 20 67 61 70 20 6f 72 20 6f 76 | $s>, gap or ov
2790: 65 72 6c 61 70 7d 0a 0a 09 20 20 20 20 73 65 74 erlap}... set
27a0: 20 6e 65 77 20 5b 24 74 79 70 65 20 25 41 55 54 new [$type %AUT
27b0: 4f 25 20 24 6d 79 70 72 6f 6a 65 63 74 20 24 6d O% $myproject $m
27c0: 79 74 79 70 65 20 24 6d 79 73 72 63 69 64 20 5b ytype $mysrcid [
27d0: 6c 72 61 6e 67 65 20 24 6d 79 69 74 65 6d 73 20 lrange $myitems
27e0: 24 73 20 24 65 5d 5d 0a 0a 20 20 20 20 20 20 20 $s $e]]..
27f0: 20 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 34 log write 4
2800: 20 63 73 65 74 73 20 22 42 72 65 61 6b 69 6e 67 csets "Breaking
2810: 20 5b 24 73 65 6c 66 20 73 74 72 20 5d 20 40 20 [$self str ] @
2820: 24 6c 61 73 74 65 2c 20 6e 65 77 20 5b 24 6e 65 $laste, new [$ne
2830: 77 20 73 74 72 5d 2c 20 63 75 74 74 69 6e 67 20 w str], cutting
2840: 24 62 72 65 61 6b 73 28 24 6c 61 73 74 65 29 22 $breaks($laste)"
2850: 0a 0a 09 20 20 20 20 73 65 74 20 6c 61 73 74 65 ... set laste
2860: 20 24 65 0a 09 7d 0a 0a 09 69 6e 74 65 67 72 69 $e..}...integri
2870: 74 79 20 61 73 73 65 72 74 20 7b 0a 09 20 20 20 ty assert {..
2880: 20 24 6c 61 73 74 65 20 3d 3d 20 28 5b 6c 6c 65 $laste == ([lle
2890: 6e 67 74 68 20 24 6d 79 69 74 65 6d 73 5d 2d 31 ngth $myitems]-1
28a0: 29 0a 09 7d 20 7b 42 61 64 20 66 72 61 67 6d 65 )..} {Bad fragme
28b0: 6e 74 20 65 6e 64 20 40 20 24 6c 61 73 74 65 2c nt end @ $laste,
28c0: 20 67 61 70 2c 20 6f 72 20 62 65 79 6f 6e 64 20 gap, or beyond
28d0: 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 end of the range
28e0: 7d 0a 0a 09 23 20 50 75 74 20 74 68 65 20 66 69 }...# Put the fi
28f0: 72 73 74 20 66 72 61 67 6d 65 6e 74 20 69 6e 74 rst fragment int
2900: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 o the current ch
2910: 61 6e 67 65 73 65 74 2c 20 61 6e 64 0a 09 23 20 angeset, and..#
2920: 75 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 update the in-me
2930: 6d 6f 72 79 20 69 6e 64 65 78 2e 20 57 65 20 63 mory index. We c
2940: 61 6e 20 73 69 6d 70 6c 79 20 28 72 65 29 61 64 an simply (re)ad
2950: 64 20 74 68 65 20 69 74 65 6d 73 0a 09 23 20 62 d the items..# b
2960: 65 63 61 75 73 65 20 77 65 20 63 6c 65 61 72 65 ecause we cleare
2970: 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 d the previously
2980: 20 65 78 69 73 74 69 6e 67 20 69 6e 66 6f 72 6d existing inform
2990: 61 74 69 6f 6e 2c 20 73 65 65 0a 09 23 20 28 2a ation, see..# (*
29a0: 29 20 61 62 6f 76 65 2e 20 50 65 72 73 69 73 74 ) above. Persist
29b0: 65 6e 63 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 ence does not ma
29c0: 74 74 65 72 20 68 65 72 65 2c 20 6e 6f 6e 65 20 tter here, none
29d0: 6f 66 20 74 68 65 0a 09 23 20 63 68 61 6e 67 65 of the..# change
29e0: 73 65 74 73 20 68 61 73 20 62 65 65 6e 20 73 61 sets has been sa
29f0: 76 65 64 20 74 6f 20 74 68 65 20 70 65 72 73 69 ved to the persi
2a00: 73 74 65 6e 74 20 73 74 61 74 65 20 79 65 74 2e stent state yet.
2a10: 0a 0a 09 73 65 74 20 6d 79 69 74 65 6d 73 20 20 ...set myitems
2a20: 5b 6c 72 61 6e 67 65 20 24 6d 79 69 74 65 6d 73 [lrange $myitems
2a30: 20 20 30 20 24 66 69 72 73 74 65 5d 0a 09 73 65 0 $firste]..se
2a40: 74 20 6d 79 74 69 74 65 6d 73 20 5b 6c 72 61 6e t mytitems [lran
2a50: 67 65 20 24 6d 79 74 69 74 65 6d 73 20 30 20 24 ge $mytitems 0 $
2a60: 66 69 72 73 74 65 5d 0a 09 66 6f 72 65 61 63 68 firste]..foreach
2a70: 20 69 69 64 20 24 6d 79 69 74 65 6d 73 20 7b 0a iid $myitems {.
2a80: 09 20 20 20 20 73 65 74 20 6b 65 79 20 5b 6c 69 . set key [li
2a90: 73 74 20 24 6d 79 74 79 70 65 20 24 69 69 64 5d st $mytype $iid]
2aa0: 0a 09 20 20 20 20 73 65 74 20 6d 79 69 74 65 6d .. set myitem
2ab0: 6d 61 70 28 24 6b 65 79 29 20 24 73 65 6c 66 0a map($key) $self.
2ac0: 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 38 . log write 8
2ad0: 20 63 73 65 74 73 20 7b 4d 41 50 2b 20 69 74 65 csets {MAP+ ite
2ae0: 6d 20 3c 24 6b 65 79 3e 20 24 73 65 6c 66 20 3d m <$key> $self =
2af0: 20 5b 24 73 65 6c 66 20 73 74 72 5d 7d 0a 09 7d [$self str]}..}
2b00: 0a 0a 09 72 65 74 75 72 6e 20 31 0a 20 20 20 20 ...return 1.
2b10: 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 70 65 }.. method pe
2b20: 72 73 69 73 74 20 7b 7d 20 7b 0a 09 73 65 74 20 rsist {} {..set
2b30: 74 69 64 20 24 6d 79 63 73 74 79 70 65 28 24 6d tid $mycstype($m
2b40: 79 74 79 70 65 29 0a 09 73 65 74 20 70 69 64 20 ytype)..set pid
2b50: 5b 24 6d 79 70 72 6f 6a 65 63 74 20 69 64 5d 0a [$myproject id].
2b60: 09 73 65 74 20 70 6f 73 20 30 0a 0a 09 73 74 61 .set pos 0...sta
2b70: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b te transaction {
2b80: 0a 09 20 20 20 20 73 74 61 74 65 20 72 75 6e 20 .. state run
2b90: 7b 0a 09 09 49 4e 53 45 52 54 20 49 4e 54 4f 20 {...INSERT INTO
2ba0: 63 68 61 6e 67 65 73 65 74 20 28 63 69 64 2c 20 changeset (cid,
2bb0: 20 20 70 69 64 2c 20 20 74 79 70 65 2c 20 73 72 pid, type, sr
2bc0: 63 29 0a 09 09 56 41 4c 55 45 53 20 20 20 20 20 c)...VALUES
2bd0: 20 20 20 20 20 20 20 20 20 20 20 28 24 6d 79 69 ($myi
2be0: 64 2c 20 24 70 69 64 2c 20 24 74 69 64 2c 20 24 d, $pid, $tid, $
2bf0: 6d 79 73 72 63 69 64 29 3b 0a 09 20 20 20 20 7d mysrcid);.. }
2c00: 0a 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 69 ... foreach i
2c10: 69 64 20 24 6d 79 69 74 65 6d 73 20 7b 0a 09 09 id $myitems {...
2c20: 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 20 20 state run {...
2c30: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 73 INSERT INTO cs
2c40: 69 74 65 6d 20 28 63 69 64 2c 20 20 20 70 6f 73 item (cid, pos
2c50: 2c 20 20 69 69 64 29 0a 09 09 20 20 20 20 56 41 , iid)... VA
2c60: 4c 55 45 53 20 20 20 20 20 20 20 20 20 20 20 20 LUES
2c70: 20 28 24 6d 79 69 64 2c 20 24 70 6f 73 2c 20 24 ($myid, $pos, $
2c80: 69 69 64 29 3b 0a 09 09 7d 0a 09 09 69 6e 63 72 iid);...}...incr
2c90: 20 70 6f 73 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 pos.. }..}..
2ca0: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 return. }..
2cb0: 20 20 6d 65 74 68 6f 64 20 74 69 6d 65 72 61 6e method timeran
2cc0: 67 65 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 5b ge {} { return [
2cd0: 24 6d 79 74 79 70 65 6f 62 6a 20 74 69 6d 65 72 $mytypeobj timer
2ce0: 61 6e 67 65 20 24 6d 79 69 74 65 6d 73 5d 20 7d ange $myitems] }
2cf0: 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 64 72 6f .. method dro
2d00: 70 20 7b 7d 20 7b 0a 09 6c 6f 67 20 77 72 69 74 p {} {..log writ
2d10: 65 20 38 20 63 73 65 74 73 20 7b 44 72 6f 70 70 e 8 csets {Dropp
2d20: 69 6e 67 20 24 73 65 6c 66 20 3d 20 5b 24 73 65 ing $self = [$se
2d30: 6c 66 20 73 74 72 5d 7d 0a 0a 09 73 74 61 74 65 lf str]}...state
2d40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 09 transaction {..
2d50: 20 20 20 20 73 74 61 74 65 20 72 75 6e 20 7b 0a state run {.
2d60: 09 09 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 68 ..DELETE FROM ch
2d70: 61 6e 67 65 73 65 74 20 57 48 45 52 45 20 63 69 angeset WHERE ci
2d80: 64 20 3d 20 24 6d 79 69 64 3b 0a 09 09 44 45 4c d = $myid;...DEL
2d90: 45 54 45 20 46 52 4f 4d 20 63 73 69 74 65 6d 20 ETE FROM csitem
2da0: 20 20 20 57 48 45 52 45 20 63 69 64 20 3d 20 24 WHERE cid = $
2db0: 6d 79 69 64 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a myid;.. }..}.
2dc0: 09 66 6f 72 65 61 63 68 20 69 69 64 20 24 6d 79 .foreach iid $my
2dd0: 69 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65 74 items {.. set
2de0: 20 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79 74 79 key [list $myty
2df0: 70 65 20 24 69 69 64 5d 0a 09 20 20 20 20 75 6e pe $iid].. un
2e00: 73 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24 6b set myitemmap($k
2e10: 65 79 29 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 ey).. log wri
2e20: 74 65 20 38 20 63 73 65 74 73 20 7b 4d 41 50 2d te 8 csets {MAP-
2e30: 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73 65 item <$key> $se
2e40: 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d lf = [$self str]
2e50: 7d 0a 09 7d 0a 09 73 65 74 20 70 6f 73 20 20 20 }..}..set pos
2e60: 20 20 20 20 20 20 20 5b 6c 73 65 61 72 63 68 20 [lsearch
2e70: 2d 65 78 61 63 74 20 24 6d 79 63 68 61 6e 67 65 -exact $mychange
2e80: 73 65 74 73 20 24 73 65 6c 66 5d 0a 09 73 65 74 sets $self]..set
2e90: 20 6d 79 63 68 61 6e 67 65 73 65 74 73 20 5b 6c mychangesets [l
2ea0: 72 65 70 6c 61 63 65 20 24 6d 79 63 68 61 6e 67 replace $mychang
2eb0: 65 73 65 74 73 20 24 70 6f 73 20 24 70 6f 73 5d esets $pos $pos]
2ec0: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a ..return. }..
2ed0: 20 20 20 20 6d 65 74 68 6f 64 20 6c 6f 6f 70 63 method loopc
2ee0: 68 65 63 6b 20 7b 7d 20 7b 0a 09 6c 6f 67 20 77 heck {} {..log w
2ef0: 72 69 74 65 20 37 20 63 73 65 74 73 20 7b 43 68 rite 7 csets {Ch
2f00: 65 63 6b 69 6e 67 20 5b 24 73 65 6c 66 20 73 74 ecking [$self st
2f10: 72 5d 20 66 6f 72 20 6c 6f 6f 70 73 20 2f 5b 6c r] for loops /[l
2f20: 6c 65 6e 67 74 68 20 24 6d 79 69 74 65 6d 73 5d length $myitems]
2f30: 7d 0a 0a 09 69 66 20 7b 21 5b 73 74 72 75 63 74 }...if {![struct
2f40: 3a 3a 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 5b ::set contains [
2f50: 24 73 65 6c 66 20 73 75 63 63 65 73 73 6f 72 73 $self successors
2f60: 5d 20 24 73 65 6c 66 5d 7d 20 7b 0a 09 20 20 20 ] $self]} {..
2f70: 20 72 65 74 75 72 6e 20 30 0a 09 7d 0a 09 69 66 return 0..}..if
2f80: 20 7b 5b 6c 6f 67 20 76 65 72 62 6f 73 69 74 79 {[log verbosity
2f90: 3f 5d 20 3c 20 38 7d 20 7b 20 72 65 74 75 72 6e ?] < 8} { return
2fa0: 20 31 20 7d 0a 0a 09 23 20 50 72 69 6e 74 20 74 1 }...# Print t
2fb0: 68 65 20 64 65 74 61 69 6c 65 64 20 73 75 63 63 he detailed succ
2fc0: 65 73 73 6f 72 20 73 74 72 75 63 74 75 72 65 20 essor structure
2fd0: 6f 66 20 74 68 65 20 73 65 6c 66 2d 0a 09 23 20 of the self-..#
2fe0: 72 65 66 65 72 65 6e 74 69 61 6c 20 63 68 61 6e referential chan
2ff0: 67 65 73 65 74 2c 20 69 66 20 74 68 65 20 76 65 geset, if the ve
3000: 72 62 6f 73 69 74 79 20 6f 66 20 74 68 65 20 6c rbosity of the l
3010: 6f 67 20 69 73 20 64 69 61 6c 65 64 0a 09 23 20 og is dialed..#
3020: 68 69 67 68 20 65 6e 6f 75 67 68 2e 0a 0a 09 6c high enough....l
3030: 6f 67 20 77 72 69 74 65 20 38 20 63 73 65 74 73 og write 8 csets
3040: 20 5b 73 65 74 20 68 64 72 20 7b 53 65 6c 66 2d [set hdr {Self-
3050: 72 65 66 65 72 65 6e 74 69 61 6c 20 63 68 61 6e referential chan
3060: 67 65 73 65 74 20 5b 24 73 65 6c 66 20 73 74 72 geset [$self str
3070: 5d 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f ] ______________
3080: 5f 5f 5f 5f 7d 5d 0a 09 61 72 72 61 79 20 73 65 ____}]..array se
3090: 74 20 6e 6d 61 70 20 5b 24 73 65 6c 66 20 6e 65 t nmap [$self ne
30a0: 78 74 6d 61 70 5d 0a 09 66 6f 72 65 61 63 68 20 xtmap]..foreach
30b0: 69 74 65 6d 20 5b 6c 73 6f 72 74 20 2d 64 69 63 item [lsort -dic
30c0: 74 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 6e t [array names n
30d0: 6d 61 70 5d 5d 20 7b 0a 09 20 20 20 20 66 6f 72 map]] {.. for
30e0: 65 61 63 68 20 73 75 63 63 69 74 65 6d 20 24 6e each succitem $n
30f0: 6d 61 70 28 24 69 74 65 6d 29 20 7b 0a 09 09 73 map($item) {...s
3100: 65 74 20 73 75 63 63 63 73 20 24 6d 79 69 74 65 et succcs $myite
3110: 6d 6d 61 70 28 24 73 75 63 63 69 74 65 6d 29 0a mmap($succitem).
3120: 09 09 73 65 74 20 68 69 6e 74 20 5b 65 78 70 72 ..set hint [expr
3130: 20 7b 28 24 73 75 63 63 63 73 20 65 71 20 24 73 {($succcs eq $s
3140: 65 6c 66 29 0a 09 09 09 09 3f 20 22 4c 4f 4f 50 elf).....? "LOOP
3150: 22 0a 09 09 09 09 3a 20 22 20 20 20 20 22 7d 5d ".....: " "}]
3160: 0a 09 09 73 65 74 20 69 20 20 20 22 3c 24 69 74 ...set i "<$it
3170: 65 6d 20 5b 24 74 79 70 65 20 69 74 65 6d 73 74 em [$type itemst
3180: 72 20 24 69 74 65 6d 5d 3e 22 0a 09 09 73 65 74 r $item]>"...set
3190: 20 73 20 20 20 22 3c 24 73 75 63 63 69 74 65 6d s "<$succitem
31a0: 20 5b 24 74 79 70 65 20 69 74 65 6d 73 74 72 20 [$type itemstr
31b0: 24 73 75 63 63 69 74 65 6d 5d 3e 22 0a 09 09 73 $succitem]>"...s
31c0: 65 74 20 73 63 73 20 5b 24 73 75 63 63 63 73 20 et scs [$succcs
31d0: 73 74 72 5d 0a 09 09 6c 6f 67 20 77 72 69 74 65 str]...log write
31e0: 20 38 20 63 73 65 74 73 20 7b 24 68 69 6e 74 20 8 csets {$hint
31f0: 2a 20 24 69 20 2d 2d 3e 20 24 73 20 2d 2d 3e 20 * $i --> $s -->
3200: 63 73 20 24 73 63 73 7d 0a 09 20 20 20 20 7d 0a cs $scs}.. }.
3210: 09 7d 0a 09 6c 6f 67 20 77 72 69 74 65 20 38 20 .}..log write 8
3220: 63 73 65 74 73 20 5b 72 65 67 73 75 62 20 2d 61 csets [regsub -a
3230: 6c 6c 20 7b 5b 5e 20 09 5d 7d 20 24 68 64 72 20 ll {[^ .]} $hdr
3240: 7b 5f 7d 5d 0a 09 72 65 74 75 72 6e 20 31 0a 20 {_}]..return 1.
3250: 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 }.. typeme
3260: 74 68 6f 64 20 73 70 6c 69 74 20 7b 63 73 65 74 thod split {cset
3270: 20 61 72 67 73 7d 20 7b 0a 09 23 20 41 73 20 70 args} {..# As p
3280: 61 72 74 20 6f 66 20 74 68 65 20 63 72 65 61 74 art of the creat
3290: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 63 ion of the new c
32a0: 68 61 6e 67 65 73 65 74 73 20 73 70 65 63 69 66 hangesets specif
32b0: 69 65 64 20 69 6e 0a 09 23 20 41 52 47 53 20 61 ied in..# ARGS a
32c0: 73 20 73 65 74 73 20 6f 66 20 69 74 65 6d 73 2c s sets of items,
32d0: 20 61 6c 6c 20 73 75 62 73 65 74 73 20 6f 66 20 all subsets of
32e0: 43 53 45 54 27 73 20 69 74 65 6d 20 73 65 74 2c CSET's item set,
32f0: 20 43 53 45 54 0a 09 23 20 77 69 6c 6c 20 62 65 CSET..# will be
3300: 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 61 6c dropped from al
3310: 6c 20 64 61 74 61 62 61 73 65 73 2c 20 69 6e 20 l databases, in
3320: 61 6e 64 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 and out of memor
3330: 79 2c 0a 09 23 20 61 6e 64 20 74 68 65 6e 20 64 y,..# and then d
3340: 65 73 74 72 6f 79 65 64 2e 0a 09 23 0a 09 23 20 estroyed...#..#
3350: 4e 6f 74 65 3a 20 54 68 65 20 69 74 65 6d 20 6c Note: The item l
3360: 69 73 74 73 20 66 6f 75 6e 64 20 69 6e 20 61 72 ists found in ar
3370: 67 73 20 61 72 65 20 74 61 67 67 65 64 20 69 74 gs are tagged it
3380: 65 6d 73 2e 20 54 68 65 79 0a 09 23 20 68 61 76 ems. They..# hav
3390: 65 20 74 6f 20 68 61 76 65 20 74 68 65 20 73 61 e to have the sa
33a0: 6d 65 20 74 79 70 65 20 61 73 20 74 68 65 20 63 me type as the c
33b0: 68 61 6e 67 65 73 65 74 2c 20 62 65 69 6e 67 20 hangeset, being
33c0: 73 75 62 73 65 74 73 0a 09 23 20 6f 66 20 69 74 subsets..# of it
33d0: 73 20 69 74 65 6d 73 2e 20 54 68 69 73 20 69 73 s items. This is
33e0: 20 63 68 65 63 6b 65 64 20 69 6e 20 55 6e 74 61 checked in Unta
33f0: 67 31 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 g1....log write
3400: 38 20 63 73 65 74 73 20 7b 4f 4c 44 3a 20 5b 6c 8 csets {OLD: [l
3410: 73 6f 72 74 20 5b 24 63 73 65 74 20 69 74 65 6d sort [$cset item
3420: 73 5d 5d 7d 0a 09 56 61 6c 69 64 61 74 65 46 72 s]]}..ValidateFr
3430: 61 67 6d 65 6e 74 73 20 24 63 73 65 74 20 24 61 agments $cset $a
3440: 72 67 73 0a 0a 09 23 20 41 6c 6c 20 63 68 65 63 rgs...# All chec
3450: 6b 73 20 70 61 73 73 2c 20 61 63 74 75 61 6c 6c ks pass, actuall
3460: 79 20 70 65 72 66 6f 72 6d 20 74 68 65 20 73 70 y perform the sp
3470: 6c 69 74 2e 0a 0a 09 73 74 72 75 63 74 3a 3a 6c lit....struct::l
3480: 69 73 74 20 61 73 73 69 67 6e 20 5b 24 63 73 65 ist assign [$cse
3490: 74 20 64 61 74 61 5d 20 70 72 6f 6a 65 63 74 20 t data] project
34a0: 63 73 74 79 70 65 20 63 73 73 72 63 0a 0a 09 24 cstype cssrc...$
34b0: 63 73 65 74 20 64 72 6f 70 0a 09 24 63 73 65 74 cset drop..$cset
34c0: 20 64 65 73 74 72 6f 79 0a 0a 09 73 65 74 20 6e destroy...set n
34d0: 65 77 63 73 65 74 73 20 7b 7d 0a 09 66 6f 72 65 ewcsets {}..fore
34e0: 61 63 68 20 66 72 61 67 6d 65 6e 74 69 74 65 6d ach fragmentitem
34f0: 73 20 24 61 72 67 73 20 7b 0a 09 20 20 20 20 6c s $args {.. l
3500: 6f 67 20 77 72 69 74 65 20 38 20 63 73 65 74 73 og write 8 csets
3510: 20 7b 4d 41 4b 45 3a 20 5b 6c 73 6f 72 74 20 24 {MAKE: [lsort $
3520: 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 5d 7d 0a fragmentitems]}.
3530: 0a 09 20 20 20 20 73 65 74 20 66 72 61 67 6d 65 .. set fragme
3540: 6e 74 20 5b 24 74 79 70 65 20 25 41 55 54 4f 25 nt [$type %AUTO%
3550: 20 24 70 72 6f 6a 65 63 74 20 24 63 73 74 79 70 $project $cstyp
3560: 65 20 24 63 73 73 72 63 20 5c 0a 09 09 09 20 20 e $cssrc \....
3570: 20 20 20 20 5b 55 6e 74 61 67 20 24 66 72 61 67 [Untag $frag
3580: 6d 65 6e 74 69 74 65 6d 73 20 24 63 73 74 79 70 mentitems $cstyp
3590: 65 5d 5d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 e]].. lappend
35a0: 20 6e 65 77 63 73 65 74 73 20 24 66 72 61 67 6d newcsets $fragm
35b0: 65 6e 74 0a 09 20 20 20 20 24 66 72 61 67 6d 65 ent.. $fragme
35c0: 6e 74 20 70 65 72 73 69 73 74 0a 0a 09 20 20 20 nt persist...
35d0: 20 69 66 20 7b 5b 24 66 72 61 67 6d 65 6e 74 20 if {[$fragment
35e0: 6c 6f 6f 70 63 68 65 63 6b 5d 7d 20 7b 0a 09 09 loopcheck]} {...
35f0: 74 72 6f 75 62 6c 65 20 66 61 74 61 6c 20 22 5b trouble fatal "[
3600: 24 66 72 61 67 6d 65 6e 74 20 73 74 72 5d 20 64 $fragment str] d
3610: 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 epends on itself
3620: 22 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 74 72 ".. }..}...tr
3630: 6f 75 62 6c 65 20 61 62 6f 72 74 3f 0a 09 72 65 ouble abort?..re
3640: 74 75 72 6e 20 24 6e 65 77 63 73 65 74 73 0a 20 turn $newcsets.
3650: 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 }.. typeme
3660: 74 68 6f 64 20 69 74 65 6d 73 74 72 20 7b 69 74 thod itemstr {it
3670: 65 6d 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c em} {..struct::l
3680: 69 73 74 20 61 73 73 69 67 6e 20 24 69 74 65 6d ist assign $item
3690: 20 69 74 79 70 65 20 69 69 64 0a 09 72 65 74 75 itype iid..retu
36a0: 72 6e 20 5b 24 69 74 79 70 65 20 73 74 72 20 24 rn [$itype str $
36b0: 69 69 64 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 iid]. }..
36c0: 74 79 70 65 6d 65 74 68 6f 64 20 73 74 72 6c 69 typemethod strli
36d0: 73 74 20 7b 63 68 61 6e 67 65 73 65 74 73 7d 20 st {changesets}
36e0: 7b 0a 09 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 20 {..return [join
36f0: 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61 [struct::list ma
3700: 70 20 24 63 68 61 6e 67 65 73 65 74 73 20 5b 6d p $changesets [m
3710: 79 70 72 6f 63 20 49 44 5d 5d 5d 0a 20 20 20 20 yproc ID]]].
3720: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 49 44 20 7b }.. proc ID {
3730: 63 73 65 74 7d 20 7b 20 24 63 73 65 74 20 73 74 cset} { $cset st
3740: 72 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 55 6e r }.. proc Un
3750: 74 61 67 20 7b 74 61 67 67 65 64 69 74 65 6d 73 tag {taggeditems
3760: 20 63 73 74 79 70 65 7d 20 7b 0a 09 72 65 74 75 cstype} {..retu
3770: 72 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 rn [struct::list
3780: 20 6d 61 70 20 24 74 61 67 67 65 64 69 74 65 6d map $taggeditem
3790: 73 20 5b 6d 79 70 72 6f 63 20 55 6e 74 61 67 31 s [myproc Untag1
37a0: 20 24 63 73 74 79 70 65 5d 5d 0a 20 20 20 20 7d $cstype]]. }
37b0: 0a 0a 20 20 20 20 70 72 6f 63 20 55 6e 74 61 67 .. proc Untag
37c0: 31 20 7b 63 73 74 79 70 65 20 74 68 65 69 74 65 1 {cstype theite
37d0: 6d 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c 69 m} {..struct::li
37e0: 73 74 20 61 73 73 69 67 6e 20 24 74 68 65 69 74 st assign $theit
37f0: 65 6d 20 74 20 69 0a 09 69 6e 74 65 67 72 69 74 em t i..integrit
3800: 79 20 61 73 73 65 72 74 20 7b 24 63 73 74 79 70 y assert {$cstyp
3810: 65 20 65 71 20 24 74 7d 20 7b 49 74 65 6d 20 24 e eq $t} {Item $
3820: 69 27 73 20 74 79 70 65 20 69 73 20 27 24 74 27 i's type is '$t'
3830: 2c 20 65 78 70 65 63 74 65 64 20 27 24 63 73 74 , expected '$cst
3840: 79 70 65 27 7d 0a 09 72 65 74 75 72 6e 20 24 69 ype'}..return $i
3850: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 . }.. proc
3860: 20 56 61 6c 69 64 61 74 65 46 72 61 67 6d 65 6e ValidateFragmen
3870: 74 73 20 7b 63 73 65 74 20 66 72 61 67 6d 65 6e ts {cset fragmen
3880: 74 73 7d 20 7b 0a 09 23 20 43 68 65 63 6b 20 74 ts} {..# Check t
3890: 68 65 20 76 61 72 69 6f 75 73 20 69 6e 74 65 67 he various integ
38a0: 72 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 rity constraints
38b0: 20 66 6f 72 20 74 68 65 20 66 72 61 67 6d 65 6e for the fragmen
38c0: 74 73 0a 09 23 20 73 70 65 63 69 66 79 69 6e 67 ts..# specifying
38d0: 20 68 6f 77 20 74 6f 20 73 70 6c 69 74 20 74 68 how to split th
38e0: 65 20 63 68 61 6e 67 65 73 65 74 3a 0a 09 23 0a e changeset:..#.
38f0: 09 23 20 2a 20 57 65 20 6d 75 73 74 20 68 61 76 .# * We must hav
3900: 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 66 72 e two or more fr
3910: 61 67 6d 65 6e 74 73 2c 20 61 73 20 73 70 6c 69 agments, as spli
3920: 74 74 69 6e 67 20 61 0a 09 23 20 20 20 63 68 61 tting a..# cha
3930: 6e 67 65 73 65 74 20 69 6e 74 6f 20 6f 6e 65 20 ngeset into one
3940: 6d 61 6b 65 73 20 6e 6f 20 73 65 6e 73 65 2e 0a makes no sense..
3950: 09 23 20 2a 20 4e 6f 20 66 72 61 67 6d 65 6e 74 .# * No fragment
3960: 20 6d 61 79 20 62 65 20 65 6d 70 74 79 2e 0a 09 may be empty...
3970: 23 20 2a 20 41 6c 6c 20 66 72 61 67 6d 65 6e 74 # * All fragment
3980: 73 20 68 61 76 65 20 74 6f 20 62 65 20 74 72 75 s have to be tru
3990: 65 20 73 75 62 73 65 74 73 20 6f 66 20 74 68 65 e subsets of the
39a0: 20 69 74 65 6d 73 20 69 6e 20 74 68 65 0a 09 23 items in the..#
39b0: 20 20 20 63 68 61 6e 67 65 73 65 74 20 74 6f 20 changeset to
39c0: 73 70 6c 69 74 2e 20 54 68 65 20 27 74 72 75 65 split. The 'true
39d0: 27 20 69 73 20 69 6d 70 6c 69 65 64 20 62 65 63 ' is implied bec
39e0: 61 75 73 65 20 6e 6f 6e 65 20 61 72 65 0a 09 23 ause none are..#
39f0: 20 20 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 allowed to be
3a00: 20 65 6d 70 74 79 2c 20 73 6f 20 65 61 63 68 20 empty, so each
3a10: 68 61 73 20 74 6f 20 62 65 20 73 6d 61 6c 6c 65 has to be smalle
3a20: 72 20 74 68 61 6e 20 74 68 65 0a 09 23 20 20 20 r than the..#
3a30: 74 6f 74 61 6c 2e 0a 09 23 20 2a 20 54 68 65 20 total...# * The
3a40: 75 6e 69 6f 6e 20 6f 66 20 74 68 65 20 66 72 61 union of the fra
3a50: 67 6d 65 6e 74 73 20 68 61 73 20 74 6f 20 62 65 gments has to be
3a60: 20 74 68 65 20 69 74 65 6d 20 73 65 74 20 6f 66 the item set of
3a70: 20 74 68 65 0a 09 23 20 20 20 63 68 61 6e 67 65 the..# change
3a80: 73 65 74 2e 0a 09 23 20 2a 20 54 68 65 20 66 72 set...# * The fr
3a90: 61 67 6d 65 6e 74 20 6d 75 73 74 20 6e 6f 74 20 agment must not
3aa0: 6f 76 65 72 6c 61 70 2c 20 69 2e 65 2e 20 74 68 overlap, i.e. th
3ab0: 65 69 72 20 70 61 69 72 77 69 73 65 0a 09 23 20 eir pairwise..#
3ac0: 20 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 73 20 intersections
3ad0: 68 61 76 65 20 74 6f 20 62 65 20 65 6d 70 74 79 have to be empty
3ae0: 2e 0a 0a 09 73 65 74 20 63 6f 76 65 72 20 7b 7d ....set cover {}
3af0: 0a 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65 ..foreach fragme
3b00: 6e 74 69 74 65 6d 73 20 24 66 72 61 67 6d 65 6e ntitems $fragmen
3b10: 74 73 20 7b 0a 09 20 20 20 20 6c 6f 67 20 77 72 ts {.. log wr
3b20: 69 74 65 20 38 20 63 73 65 74 73 20 7b 4e 45 57 ite 8 csets {NEW
3b30: 3a 20 5b 6c 73 6f 72 74 20 24 66 72 61 67 6d 65 : [lsort $fragme
3b40: 6e 74 69 74 65 6d 73 5d 7d 0a 0a 09 20 20 20 20 ntitems]}...
3b50: 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 integrity assert
3b60: 20 7b 0a 09 09 21 5b 73 74 72 75 63 74 3a 3a 73 {...![struct::s
3b70: 65 74 20 65 6d 70 74 79 20 24 66 72 61 67 6d 65 et empty $fragme
3b80: 6e 74 69 74 65 6d 73 5d 0a 09 20 20 20 20 7d 20 ntitems].. }
3b90: 7b 63 68 61 6e 67 65 73 65 74 20 66 72 61 67 6d {changeset fragm
3ba0: 65 6e 74 20 69 73 20 65 6d 70 74 79 7d 0a 0a 09 ent is empty}...
3bb0: 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 integrity as
3bc0: 73 65 72 74 20 7b 0a 09 09 5b 73 74 72 75 63 74 sert {...[struct
3bd0: 3a 3a 73 65 74 20 73 75 62 73 65 74 6f 66 20 24 ::set subsetof $
3be0: 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 20 5b 24 fragmentitems [$
3bf0: 63 73 65 74 20 69 74 65 6d 73 5d 5d 0a 09 20 20 cset items]]..
3c00: 20 20 7d 20 7b 63 68 61 6e 67 65 73 65 74 20 66 } {changeset f
3c10: 72 61 67 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61 ragment is not a
3c20: 20 73 75 62 73 65 74 7d 0a 09 20 20 20 20 73 74 subset}.. st
3c30: 72 75 63 74 3a 3a 73 65 74 20 61 64 64 20 63 6f ruct::set add co
3c40: 76 65 72 20 24 66 72 61 67 6d 65 6e 74 69 74 65 ver $fragmentite
3c50: 6d 73 0a 09 7d 0a 0a 09 69 6e 74 65 67 72 69 74 ms..}...integrit
3c60: 79 20 61 73 73 65 72 74 20 7b 0a 09 20 20 20 20 y assert {..
3c70: 5b 73 74 72 75 63 74 3a 3a 73 65 74 20 65 71 75 [struct::set equ
3c80: 61 6c 20 24 63 6f 76 65 72 20 5b 24 63 73 65 74 al $cover [$cset
3c90: 20 69 74 65 6d 73 5d 5d 0a 09 20 7d 20 7b 54 68 items]].. } {Th
3ca0: 65 20 66 72 61 67 6d 65 6e 74 73 20 64 6f 20 6e e fragments do n
3cb0: 6f 74 20 63 6f 76 65 72 20 74 68 65 20 6f 72 69 ot cover the ori
3cc0: 67 69 6e 61 6c 20 63 68 61 6e 67 65 73 65 74 7d ginal changeset}
3cd0: 0a 0a 09 73 65 74 20 69 20 31 0a 09 66 6f 72 65 ...set i 1..fore
3ce0: 61 63 68 20 66 69 61 20 24 66 72 61 67 6d 65 6e ach fia $fragmen
3cf0: 74 73 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 63 ts {.. foreac
3d00: 68 20 66 69 62 20 5b 6c 72 61 6e 67 65 20 24 66 h fib [lrange $f
3d10: 72 61 67 6d 65 6e 74 73 20 24 69 20 65 6e 64 5d ragments $i end]
3d20: 20 7b 0a 09 09 69 6e 74 65 67 72 69 74 79 20 61 {...integrity a
3d30: 73 73 65 72 74 20 7b 0a 09 09 20 20 20 20 5b 73 ssert {... [s
3d40: 74 72 75 63 74 3a 3a 73 65 74 20 65 6d 70 74 79 truct::set empty
3d50: 20 5b 73 74 72 75 63 74 3a 3a 73 65 74 20 69 6e [struct::set in
3d60: 74 65 72 73 65 63 74 20 24 66 69 61 20 24 66 69 tersect $fia $fi
3d70: 62 5d 5d 0a 09 09 7d 20 7b 54 68 65 20 66 72 61 b]]...} {The fra
3d80: 67 6d 65 6e 74 73 20 3c 24 66 69 61 3e 20 61 6e gments <$fia> an
3d90: 64 20 3c 24 66 69 62 3e 20 6f 76 65 72 6c 61 70 d <$fib> overlap
3da0: 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 6e }.. }.. in
3db0: 63 72 20 69 0a 09 7d 0a 0a 09 72 65 74 75 72 6e cr i..}...return
3dc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 . }.. # #
3dd0: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 ## ### ##### ###
3de0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 ##### ##########
3df0: 23 23 23 0a 20 20 20 20 23 23 20 53 74 61 74 65 ###. ## State
3e00: 0a 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d .. variable m
3e10: 79 69 64 20 20 20 20 20 20 20 20 7b 7d 20 3b 20 yid {} ;
3e20: 23 20 49 64 20 6f 66 20 74 68 65 20 63 73 65 74 # Id of the cset
3e30: 20 66 6f 72 20 74 68 65 20 70 65 72 73 69 73 74 for the persist
3e40: 65 6e 74 0a 09 09 09 20 20 20 20 20 20 23 20 73 ent.... # s
3e50: 74 61 74 65 2e 0a 20 20 20 20 76 61 72 69 61 62 tate.. variab
3e60: 6c 65 20 6d 79 70 72 6f 6a 65 63 74 20 20 20 7b le myproject {
3e70: 7d 20 3b 20 23 20 52 65 66 65 72 65 6e 63 65 20 } ; # Reference
3e80: 6f 66 20 74 68 65 20 70 72 6f 6a 65 63 74 20 6f of the project o
3e90: 62 6a 65 63 74 20 74 68 65 0a 09 09 09 20 20 20 bject the....
3ea0: 20 20 20 23 20 63 68 61 6e 67 65 73 65 74 20 62 # changeset b
3eb0: 65 6c 6f 6e 67 73 20 74 6f 2e 0a 20 20 20 20 76 elongs to.. v
3ec0: 61 72 69 61 62 6c 65 20 6d 79 74 79 70 65 20 20 ariable mytype
3ed0: 20 20 20 20 7b 7d 20 3b 20 23 20 57 68 61 74 20 {} ; # What
3ee0: 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 69 73 the changeset is
3ef0: 20 62 61 73 65 64 20 6f 6e 0a 09 09 09 20 20 20 based on....
3f00: 20 20 20 23 20 28 72 65 76 69 73 69 6f 6e 73 2c # (revisions,
3f10: 20 74 61 67 73 2c 20 6f 72 20 62 72 61 6e 63 68 tags, or branch
3f20: 65 73 29 2e 0a 09 09 09 20 20 20 20 20 20 23 20 es)..... #
3f30: 56 61 6c 75 65 73 3a 20 53 65 65 20 6d 79 63 73 Values: See mycs
3f40: 74 79 70 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 type. Note that
3f50: 77 65 0a 09 09 09 20 20 20 20 20 20 23 20 68 61 we.... # ha
3f60: 76 65 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6e ve to keep the n
3f70: 61 6d 65 73 20 6f 66 20 74 68 65 20 68 65 6c 70 ames of the help
3f80: 65 72 0a 09 09 09 20 20 20 20 20 20 23 20 73 69 er.... # si
3f90: 6e 67 6c 65 74 6f 6e 73 20 69 6e 20 73 79 6e 63 ngletons in sync
3fa0: 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e with the conten
3fb0: 74 73 0a 09 09 09 20 20 20 20 20 20 23 20 6f 66 ts.... # of
3fc0: 20 73 74 61 74 65 20 74 61 62 6c 65 20 27 63 73 state table 'cs
3fd0: 74 79 70 65 27 2c 20 61 6e 64 20 76 61 72 69 6f type', and vario
3fe0: 75 73 0a 09 09 09 20 20 20 20 20 20 23 20 6f 74 us.... # ot
3ff0: 68 65 72 20 70 6c 61 63 65 73 20 75 73 69 6e 67 her places using
4000: 20 74 68 65 6d 20 68 61 72 64 77 69 72 65 64 2e them hardwired.
4010: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 . variable my
4020: 74 79 70 65 6f 62 6a 20 20 20 7b 7d 20 3b 20 23 typeobj {} ; #
4030: 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 Reference to th
4040: 65 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20 e container for
4050: 74 68 65 0a 09 09 09 20 20 20 20 20 20 23 20 74 the.... # t
4060: 79 70 65 20 64 65 70 65 6e 64 65 6e 74 20 63 6f ype dependent co
4070: 64 65 2e 20 44 65 72 69 76 65 64 20 66 72 6f 6d de. Derived from
4080: 0a 09 09 09 20 20 20 20 20 20 23 20 6d 79 74 79 .... # myty
4090: 70 65 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 pe.. variable
40a0: 20 6d 79 73 72 63 69 64 20 20 20 20 20 7b 7d 20 mysrcid {}
40b0: 3b 20 23 20 49 64 20 6f 66 20 74 68 65 20 6d 65 ; # Id of the me
40c0: 74 61 64 61 74 61 20 6f 72 20 73 79 6d 62 6f 6c tadata or symbol
40d0: 20 74 68 65 20 63 73 65 74 0a 09 09 09 20 20 20 the cset....
40e0: 20 20 20 23 20 69 73 20 62 61 73 65 64 20 6f 6e # is based on
40f0: 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d .. variable m
4100: 79 69 74 65 6d 73 20 20 20 20 20 7b 7d 20 3b 20 yitems {} ;
4110: 23 20 4c 69 73 74 20 6f 66 20 74 68 65 20 66 69 # List of the fi
4120: 6c 65 20 6c 65 76 65 6c 20 72 65 76 69 73 69 6f le level revisio
4130: 6e 73 2c 0a 09 09 09 20 20 20 20 20 20 23 20 74 ns,.... # t
4140: 61 67 73 2c 20 6f 72 20 62 72 61 6e 63 68 65 73 ags, or branches
4150: 20 69 6e 20 74 68 65 20 63 73 65 74 2c 20 61 73 in the cset, as
4160: 0a 09 09 09 20 20 20 20 20 20 23 20 69 64 73 2e .... # ids.
4170: 20 4e 6f 74 20 74 61 67 67 65 64 2e 0a 20 20 20 Not tagged..
4180: 20 76 61 72 69 61 62 6c 65 20 6d 79 74 69 74 65 variable mytite
4190: 6d 73 20 20 20 20 7b 7d 20 3b 20 23 20 41 73 20 ms {} ; # As
41a0: 6d 79 69 74 65 6d 73 2c 20 74 68 65 20 74 61 67 myitems, the tag
41b0: 67 65 64 20 66 6f 72 6d 2e 0a 20 20 20 20 76 61 ged form.. va
41c0: 72 69 61 62 6c 65 20 6d 79 70 72 65 6d 61 70 20 riable mypremap
41d0: 20 20 20 7b 7d 20 3b 20 23 20 44 69 63 74 69 6f {} ; # Dictio
41e0: 6e 61 72 79 20 6d 61 70 70 69 6e 67 20 66 72 6f nary mapping fro
41f0: 6d 20 74 68 65 20 69 74 65 6d 73 20 28 74 61 67 m the items (tag
4200: 67 65 64 20 6e 6f 77 29 0a 09 09 09 20 20 20 20 ged now)....
4210: 20 20 23 20 74 6f 20 74 68 65 69 72 20 70 72 65 # to their pre
4220: 64 65 63 65 73 73 6f 72 73 2c 20 61 6c 73 6f 20 decessors, also
4230: 74 61 67 67 65 64 2e 20 41 0a 09 09 09 20 20 20 tagged. A....
4240: 20 20 20 23 20 63 61 63 68 65 20 74 6f 20 61 76 # cache to av
4250: 6f 69 64 20 6c 6f 61 64 69 6e 67 20 74 68 69 73 oid loading this
4260: 20 66 72 6f 6d 20 74 68 65 0a 09 09 09 20 20 20 from the....
4270: 20 20 20 23 20 73 74 61 74 65 20 6d 6f 72 65 20 # state more
4280: 74 68 61 6e 20 6f 6e 63 65 2e 0a 20 20 20 20 76 than once.. v
4290: 61 72 69 61 62 6c 65 20 6d 79 6e 65 78 74 6d 61 ariable mynextma
42a0: 70 20 20 20 7b 7d 20 3b 20 23 20 44 69 63 74 69 p {} ; # Dicti
42b0: 6f 6e 61 72 79 20 6d 61 70 70 69 6e 67 20 66 72 onary mapping fr
42c0: 6f 6d 20 74 68 65 20 69 74 65 6d 73 20 28 74 61 om the items (ta
42d0: 67 67 65 64 29 0a 09 09 09 20 20 20 20 20 20 23 gged).... #
42e0: 20 74 6f 20 74 68 65 69 72 20 73 75 63 63 65 73 to their succes
42f0: 73 6f 72 73 20 28 61 6c 73 6f 20 74 61 67 67 65 sors (also tagge
4300: 64 29 2e 20 41 0a 09 09 09 20 20 20 20 20 20 23 d). A.... #
4310: 20 63 61 63 68 65 20 74 6f 20 61 76 6f 69 64 20 cache to avoid
4320: 6c 6f 61 64 69 6e 67 20 74 68 69 73 20 66 72 6f loading this fro
4330: 6d 20 74 68 65 0a 09 09 09 20 20 20 20 20 20 23 m the.... #
4340: 20 73 74 61 74 65 20 6d 6f 72 65 20 74 68 61 6e state more than
4350: 20 6f 6e 63 65 2e 0a 20 20 20 20 76 61 72 69 61 once.. varia
4360: 62 6c 65 20 6d 79 70 6f 73 20 20 20 20 20 20 20 ble mypos
4370: 7b 7d 20 3b 20 23 20 43 6f 6d 6d 69 74 20 70 6f {} ; # Commit po
4380: 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 sition of the ch
4390: 61 6e 67 65 73 65 74 2c 20 69 66 0a 09 09 09 20 angeset, if....
43a0: 20 20 20 20 20 23 20 6b 6e 6f 77 6e 2e 0a 0a 20 # known...
43b0: 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 # # ## ### ##
43c0: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 ### ######## ###
43d0: 23 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 ##########. #
43e0: 23 20 49 6e 74 65 72 6e 61 6c 20 6d 65 74 68 6f # Internal metho
43f0: 64 73 0a 0a 20 20 20 20 74 79 70 65 76 61 72 69 ds.. typevari
4400: 61 62 6c 65 20 6d 79 63 6f 75 6e 74 65 72 20 20 able mycounter
4410: 20 20 20 20 20 20 30 20 3b 20 23 20 49 64 20 63 0 ; # Id c
4420: 6f 75 6e 74 65 72 20 66 6f 72 20 63 73 65 74 73 ounter for csets
4430: 2e 20 4c 61 73 74 20 69 64 0a 09 09 09 09 20 20 . Last id.....
4440: 20 20 20 20 23 20 75 73 65 64 2e 0a 20 20 20 20 # used..
4450: 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 typevariable myc
4460: 73 74 79 70 65 20 2d 61 72 72 61 79 20 7b 7d 20 stype -array {}
4470: 3b 20 23 20 4d 61 70 20 63 73 74 79 70 65 73 20 ; # Map cstypes
4480: 28 6e 61 6d 65 73 29 20 74 6f 20 70 65 72 73 69 (names) to persi
4490: 73 74 65 6e 74 0a 09 09 09 09 20 20 20 20 20 20 stent.....
44a0: 23 20 69 64 73 2e 20 4e 6f 74 65 20 74 68 61 74 # ids. Note that
44b0: 20 77 65 20 68 61 76 65 20 74 6f 20 6b 65 65 70 we have to keep
44c0: 0a 09 09 09 09 20 20 20 20 20 20 23 20 74 68 65 ..... # the
44d0: 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 74 61 names in the ta
44e0: 62 6c 65 20 27 63 73 74 79 70 65 27 0a 09 09 09 ble 'cstype'....
44f0: 09 20 20 20 20 20 20 23 20 69 6e 20 73 79 6e 63 . # in sync
4500: 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 with the names
4510: 6f 66 20 74 68 65 0a 09 09 09 09 20 20 20 20 20 of the.....
4520: 20 23 20 68 65 6c 70 65 72 20 73 69 6e 67 6c 65 # helper single
4530: 74 6f 6e 73 2e 0a 0a 20 20 20 20 74 79 70 65 6d tons... typem
4540: 65 74 68 6f 64 20 67 65 74 63 73 74 79 70 65 73 ethod getcstypes
4550: 20 7b 7d 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b {} {..foreach {
4560: 74 69 64 20 6e 61 6d 65 7d 20 5b 73 74 61 74 65 tid name} [state
4570: 20 72 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c 45 run {.. SELE
4580: 43 54 20 74 69 64 2c 20 6e 61 6d 65 20 46 52 4f CT tid, name FRO
4590: 4d 20 63 73 74 79 70 65 3b 0a 09 7d 5d 20 7b 20 M cstype;..}] {
45a0: 73 65 74 20 6d 79 63 73 74 79 70 65 28 24 6e 61 set mycstype($na
45b0: 6d 65 29 20 24 74 69 64 20 7d 0a 09 72 65 74 75 me) $tid }..retu
45c0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 rn. }.. ty
45d0: 70 65 6d 65 74 68 6f 64 20 6c 6f 61 64 63 6f 75 pemethod loadcou
45e0: 6e 74 65 72 20 7b 7d 20 7b 0a 09 23 20 49 6e 69 nter {} {..# Ini
45f0: 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 75 6e tialize the coun
4600: 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 74 61 ter from the sta
4610: 74 65 0a 09 73 65 74 20 6d 79 63 6f 75 6e 74 65 te..set mycounte
4620: 72 20 5b 73 74 61 74 65 20 6f 6e 65 20 7b 20 53 r [state one { S
4630: 45 4c 45 43 54 20 4d 41 58 28 63 69 64 29 20 46 ELECT MAX(cid) F
4640: 52 4f 4d 20 63 68 61 6e 67 65 73 65 74 20 7d 5d ROM changeset }]
4650: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a ..return. }..
4660: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6e typemethod n
4670: 75 6d 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 24 um {} { return $
4680: 6d 79 63 6f 75 6e 74 65 72 20 7d 0a 0a 20 20 20 mycounter }..
4690: 20 70 72 6f 63 20 49 6e 69 74 69 61 6c 69 7a 65 proc Initialize
46a0: 42 72 65 61 6b 53 74 61 74 65 20 7b 72 65 76 69 BreakState {revi
46b0: 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 sions} {..upvar
46c0: 31 20 70 6f 73 20 70 6f 73 20 63 72 6f 73 73 20 1 pos pos cross
46d0: 63 72 6f 73 73 20 72 61 6e 67 65 20 72 61 6e 67 cross range rang
46e0: 65 20 64 65 70 63 20 64 65 70 63 20 64 65 6c 74 e depc depc delt
46f0: 61 20 64 65 6c 74 61 20 5c 0a 09 20 20 20 20 64 a delta \.. d
4700: 65 70 65 6e 64 65 6e 63 69 65 73 20 64 65 70 65 ependencies depe
4710: 6e 64 65 6e 63 69 65 73 0a 0a 09 23 20 46 69 72 ndencies...# Fir
4720: 73 74 20 77 65 20 63 72 65 61 74 65 20 61 20 6d st we create a m
4730: 61 70 20 6f 66 20 70 6f 73 69 74 69 6f 6e 73 20 ap of positions
4740: 74 6f 20 6d 61 6b 65 20 69 74 20 65 61 73 69 65 to make it easie
4750: 72 20 74 6f 0a 09 23 20 64 65 74 65 72 6d 69 6e r to..# determin
4760: 65 20 77 68 65 74 68 65 72 20 61 20 64 65 70 65 e whether a depe
4770: 6e 64 65 6e 63 79 20 63 72 6f 73 73 65 73 20 61 ndency crosses a
4780: 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 particular inde
4790: 78 2e 0a 0a 09 61 72 72 61 79 20 73 65 74 20 70 x....array set p
47a0: 6f 73 20 20 20 7b 7d 0a 09 61 72 72 61 79 20 73 os {}..array s
47b0: 65 74 20 63 72 6f 73 73 20 7b 7d 0a 09 61 72 72 et cross {}..arr
47c0: 61 79 20 73 65 74 20 64 65 70 63 20 20 7b 7d 0a ay set depc {}.
47d0: 09 73 65 74 20 72 61 6e 67 65 20 20 20 20 20 20 .set range
47e0: 20 7b 7d 0a 09 73 65 74 20 6e 20 30 0a 09 66 6f {}..set n 0..fo
47f0: 72 65 61 63 68 20 72 65 76 20 24 72 65 76 69 73 reach rev $revis
4800: 69 6f 6e 73 20 7b 0a 09 20 20 20 20 6c 61 70 70 ions {.. lapp
4810: 65 6e 64 20 72 61 6e 67 65 20 24 6e 0a 09 20 20 end range $n..
4820: 20 20 73 65 74 20 70 6f 73 28 24 72 65 76 29 20 set pos($rev)
4830: 24 6e 0a 09 20 20 20 20 73 65 74 20 63 72 6f 73 $n.. set cros
4840: 73 28 24 6e 29 20 30 0a 09 20 20 20 20 69 6e 63 s($n) 0.. inc
4850: 72 20 6e 0a 09 7d 0a 0a 09 23 20 53 65 63 6f 6e r n..}...# Secon
4860: 64 6c 79 20 77 65 20 63 6f 75 6e 74 20 74 68 65 dly we count the
4870: 20 63 72 6f 73 73 69 6e 67 73 20 70 65 72 20 70 crossings per p
4880: 6f 73 69 74 69 6f 6e 2c 20 62 79 20 69 74 65 72 osition, by iter
4890: 61 74 69 6e 67 0a 09 23 20 6f 76 65 72 20 74 68 ating..# over th
48a0: 65 20 72 65 63 6f 72 64 65 64 20 69 6e 74 65 72 e recorded inter
48b0: 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 nal dependencies
48c0: 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 49 66 20 74 ....# Note: If t
48d0: 68 65 20 74 69 6d 65 73 74 61 6d 70 73 20 61 72 he timestamps ar
48e0: 65 20 62 61 64 6c 79 20 6f 75 74 20 6f 66 20 6f e badly out of o
48f0: 72 64 65 72 20 69 74 20 69 73 0a 09 23 20 20 20 rder it is..#
4900: 20 20 20 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 possible to
4910: 68 61 76 65 20 61 20 62 61 63 6b 77 61 72 64 20 have a backward
4920: 73 75 63 63 65 73 73 6f 72 20 64 65 70 65 6e 64 successor depend
4930: 65 6e 63 79 2c 0a 09 23 20 20 20 20 20 20 20 69 ency,..# i
4940: 2e 65 2e 20 77 69 74 68 20 73 74 61 72 74 20 3e .e. with start >
4950: 20 65 6e 64 2e 20 57 65 20 6d 61 79 20 68 61 76 end. We may hav
4960: 65 20 74 6f 20 73 77 61 70 20 74 68 65 20 69 6e e to swap the in
4970: 64 69 63 65 73 0a 09 23 20 20 20 20 20 20 20 74 dices..# t
4980: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 o ensure that th
4990: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 e following loop
49a0: 20 72 75 6e 73 20 63 6f 72 72 65 63 74 6c 79 2e runs correctly.
49b0: 0a 09 23 0a 09 23 20 4e 6f 74 65 20 32 3a 20 73 ..#..# Note 2: s
49c0: 74 61 72 74 20 3d 3d 20 65 6e 64 20 69 73 20 6e tart == end is n
49d0: 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 49 74 20 ot possible. It
49e0: 69 6e 64 69 63 61 74 65 73 20 61 0a 09 23 20 20 indicates a..#
49f0: 20 20 20 20 20 20 20 73 65 6c 66 2d 64 65 70 65 self-depe
4a00: 6e 64 65 6e 63 79 20 64 75 65 20 74 6f 20 74 68 ndency due to th
4a10: 65 20 75 6e 69 71 75 65 6e 65 73 73 20 6f 66 20 e uniqueness of
4a20: 70 6f 73 69 74 69 6f 6e 73 2c 0a 09 23 20 20 20 positions,..#
4a30: 20 20 20 20 20 20 61 6e 64 20 74 68 61 74 20 69 and that i
4a40: 73 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 20 68 s something we h
4a50: 61 76 65 20 72 75 6c 65 64 20 6f 75 74 20 61 6c ave ruled out al
4a60: 72 65 61 64 79 2c 20 73 65 65 0a 09 23 20 20 20 ready, see..#
4a70: 20 20 20 20 20 20 27 72 65 76 20 69 6e 74 65 72 'rev inter
4a80: 6e 61 6c 73 75 63 63 65 73 73 6f 72 73 27 2e 0a nalsuccessors'..
4a90: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63 ..foreach {rid c
4aa0: 68 69 6c 64 72 65 6e 7d 20 5b 61 72 72 61 79 20 hildren} [array
4ab0: 67 65 74 20 64 65 70 65 6e 64 65 6e 63 69 65 73 get dependencies
4ac0: 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 63 68 ] {.. foreach
4ad0: 20 63 68 69 6c 64 20 24 63 68 69 6c 64 72 65 6e child $children
4ae0: 20 7b 0a 09 09 73 65 74 20 64 6b 65 79 20 20 20 {...set dkey
4af0: 20 5b 6c 69 73 74 20 24 72 69 64 20 24 63 68 69 [list $rid $chi
4b00: 6c 64 5d 0a 09 09 73 65 74 20 73 74 61 72 74 20 ld]...set start
4b10: 20 20 24 70 6f 73 28 24 72 69 64 29 0a 09 09 73 $pos($rid)...s
4b20: 65 74 20 65 6e 64 20 20 20 20 20 24 70 6f 73 28 et end $pos(
4b30: 24 63 68 69 6c 64 29 0a 09 09 73 65 74 20 63 72 $child)...set cr
4b40: 6f 73 73 65 73 20 7b 7d 0a 0a 09 09 69 66 20 7b osses {}....if {
4b50: 24 73 74 61 72 74 20 3e 20 24 65 6e 64 7d 20 7b $start > $end} {
4b60: 0a 09 09 20 20 20 20 77 68 69 6c 65 20 7b 24 65 ... while {$e
4b70: 6e 64 20 3c 20 24 73 74 61 72 74 7d 20 7b 0a 09 nd < $start} {..
4b80: 09 09 6c 61 70 70 65 6e 64 20 63 72 6f 73 73 65 ..lappend crosse
4b90: 73 20 24 65 6e 64 0a 09 09 09 69 6e 63 72 20 63 s $end....incr c
4ba0: 72 6f 73 73 28 24 65 6e 64 29 0a 09 09 09 69 6e ross($end)....in
4bb0: 63 72 20 65 6e 64 0a 09 09 20 20 20 20 7d 0a 09 cr end... }..
4bc0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 .} else {...
4bd0: 77 68 69 6c 65 20 7b 24 73 74 61 72 74 20 3c 20 while {$start <
4be0: 24 65 6e 64 7d 20 7b 0a 09 09 09 6c 61 70 70 65 $end} {....lappe
4bf0: 6e 64 20 63 72 6f 73 73 65 73 20 24 73 74 61 72 nd crosses $star
4c00: 74 0a 09 09 09 69 6e 63 72 20 63 72 6f 73 73 28 t....incr cross(
4c10: 24 73 74 61 72 74 29 0a 09 09 09 69 6e 63 72 20 $start)....incr
4c20: 73 74 61 72 74 0a 09 09 20 20 20 20 7d 0a 09 09 start... }...
4c30: 7d 0a 09 09 73 65 74 20 64 65 70 63 28 24 64 6b }...set depc($dk
4c40: 65 79 29 20 24 63 72 6f 73 73 65 73 0a 09 20 20 ey) $crosses..
4c50: 20 20 7d 0a 09 7d 0a 0a 09 49 6e 69 74 69 61 6c }..}...Initial
4c60: 69 7a 65 44 65 6c 74 61 73 20 24 72 65 76 69 73 izeDeltas $revis
4c70: 69 6f 6e 73 0a 09 72 65 74 75 72 6e 0a 20 20 20 ions..return.
4c80: 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 49 6e 69 }.. proc Ini
4c90: 74 69 61 6c 69 7a 65 44 65 6c 74 61 73 20 7b 72 tializeDeltas {r
4ca0: 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 evisions} {..upv
4cb0: 61 72 20 31 20 64 65 6c 74 61 20 64 65 6c 74 61 ar 1 delta delta
4cc0: 0a 0a 09 23 20 50 75 6c 6c 20 74 68 65 20 74 69 ...# Pull the ti
4cd0: 6d 65 73 74 61 6d 70 73 20 66 6f 72 20 61 6c 6c mestamps for all
4ce0: 20 72 65 76 69 73 69 6f 6e 73 20 69 6e 20 74 68 revisions in th
4cf0: 65 20 63 68 61 6e 67 65 73 65 74 73 20 61 6e 64 e changesets and
4d00: 0a 09 23 20 63 6f 6d 70 75 74 65 20 74 68 65 69 ..# compute thei
4d10: 72 20 64 65 6c 74 61 73 20 66 6f 72 20 75 73 65 r deltas for use
4d20: 20 62 79 20 74 68 65 20 62 72 65 61 6b 20 66 69 by the break fi
4d30: 6e 64 65 72 2e 0a 0a 09 61 72 72 61 79 20 73 65 nder....array se
4d40: 74 20 64 65 6c 74 61 20 7b 7d 0a 09 61 72 72 61 t delta {}..arra
4d50: 79 20 73 65 74 20 73 74 61 6d 70 20 7b 7d 0a 0a y set stamp {}..
4d60: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a .set theset ('[j
4d70: 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b oin $revisions {
4d80: 27 2c 27 7d 5d 27 29 0a 09 66 6f 72 65 61 63 68 ','}]')..foreach
4d90: 20 7b 72 69 64 20 74 69 6d 65 7d 20 5b 73 74 61 {rid time} [sta
4da0: 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 te run ".. SE
4db0: 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 64 61 LECT R.rid, R.da
4dc0: 74 65 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 te.. FROM rev
4dd0: 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 ision R.. WHE
4de0: 52 45 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 RE R.rid IN $the
4df0: 73 65 74 0a 09 22 5d 20 7b 0a 09 20 20 20 20 73 set.."] {.. s
4e00: 65 74 20 73 74 61 6d 70 28 24 72 69 64 29 20 24 et stamp($rid) $
4e10: 74 69 6d 65 0a 09 7d 0a 0a 09 73 65 74 20 6e 20 time..}...set n
4e20: 30 0a 09 66 6f 72 65 61 63 68 20 72 69 64 20 5b 0..foreach rid [
4e30: 6c 72 61 6e 67 65 20 24 72 65 76 69 73 69 6f 6e lrange $revision
4e40: 73 20 30 20 65 6e 64 2d 31 5d 20 72 6e 65 78 74 s 0 end-1] rnext
4e50: 20 5b 6c 72 61 6e 67 65 20 24 72 65 76 69 73 69 [lrange $revisi
4e60: 6f 6e 73 20 31 20 65 6e 64 5d 20 7b 0a 09 20 20 ons 1 end] {..
4e70: 20 20 73 65 74 20 64 65 6c 74 61 28 24 6e 29 20 set delta($n)
4e80: 5b 65 78 70 72 20 7b 24 73 74 61 6d 70 28 24 72 [expr {$stamp($r
4e90: 6e 65 78 74 29 20 2d 20 24 73 74 61 6d 70 28 24 next) - $stamp($
4ea0: 72 69 64 29 7d 5d 0a 09 20 20 20 20 69 6e 63 72 rid)}].. incr
4eb0: 20 6e 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 n..}..return.
4ec0: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 46 69 }.. proc Fi
4ed0: 6e 64 42 65 73 74 42 72 65 61 6b 20 7b 72 61 6e ndBestBreak {ran
4ee0: 67 65 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 63 ge} {..upvar 1 c
4ef0: 72 6f 73 73 20 63 72 6f 73 73 20 64 65 6c 74 61 ross cross delta
4f00: 20 64 65 6c 74 61 0a 0a 09 23 20 44 65 74 65 72 delta...# Deter
4f10: 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 62 72 mine the best br
4f20: 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 eak location in
4f30: 74 68 65 20 67 69 76 65 6e 20 72 61 6e 67 65 20 the given range
4f40: 6f 66 0a 09 23 20 70 6f 73 69 74 69 6f 6e 73 2e of..# positions.
4f50: 20 46 69 72 73 74 20 77 65 20 6c 6f 6f 6b 20 66 First we look f
4f60: 6f 72 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 73 or the locations
4f70: 20 77 69 74 68 20 74 68 65 20 6d 61 78 69 6d 61 with the maxima
4f80: 6c 0a 09 23 20 6e 75 6d 62 65 72 20 6f 66 20 63 l..# number of c
4f90: 72 6f 73 73 69 6e 67 73 2e 20 49 66 20 74 68 65 rossings. If the
4fa0: 72 65 20 61 72 65 20 73 65 76 65 72 61 6c 20 77 re are several w
4fb0: 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 68 65 0a 09 e look for the..
4fc0: 23 20 73 68 6f 72 74 65 73 74 20 74 69 6d 65 20 # shortest time
4fd0: 69 6e 74 65 72 76 61 6c 20 61 6d 6f 6e 67 20 74 interval among t
4fe0: 68 65 6d 2e 20 49 66 20 77 65 20 73 74 69 6c 6c hem. If we still
4ff0: 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 0a 09 have multiple..
5000: 23 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 20 # possibilities
5010: 61 66 74 65 72 20 74 68 61 74 20 77 65 20 73 65 after that we se
5020: 6c 65 63 74 20 74 68 65 20 65 61 72 6c 69 65 73 lect the earlies
5030: 74 20 6c 6f 63 61 74 69 6f 6e 0a 09 23 20 61 6d t location..# am
5040: 6f 6e 67 20 74 68 65 73 65 2e 0a 0a 09 23 20 4e ong these....# N
5050: 6f 74 65 3a 20 49 66 20 74 68 65 20 6d 61 78 69 ote: If the maxi
5060: 6d 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 72 mal number of cr
5070: 6f 73 73 69 6e 67 73 20 69 73 20 30 20 74 68 65 ossings is 0 the
5080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 09 23 20 20 n the range..#
5090: 20 20 20 20 20 68 61 73 20 6e 6f 20 69 6e 74 65 has no inte
50a0: 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 rnal dependencie
50b0: 73 2c 20 61 6e 64 20 6e 6f 20 62 72 65 61 6b 20 s, and no break
50c0: 6c 6f 63 61 74 69 6f 6e 20 61 74 0a 09 23 20 20 location at..#
50d0: 20 20 20 20 20 61 6c 6c 2e 20 54 68 69 73 20 70 all. This p
50e0: 6f 73 73 69 62 69 6c 69 74 79 20 69 73 20 73 69 ossibility is si
50f0: 67 6e 61 6c 65 64 20 76 69 61 20 72 65 73 75 6c gnaled via resul
5100: 74 20 2d 31 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 t -1....# Note:
5110: 41 20 72 61 6e 67 65 20 6f 66 20 6c 65 6e 67 74 A range of lengt
5120: 68 20 31 20 6f 72 20 6c 65 73 73 20 63 61 6e 6e h 1 or less cann
5130: 6f 74 20 68 61 76 65 20 69 6e 74 65 72 6e 61 6c ot have internal
5140: 0a 09 23 20 20 20 20 20 20 20 64 65 70 65 6e 64 ..# depend
5150: 65 6e 63 69 65 73 2c 20 61 73 20 74 68 61 74 20 encies, as that
5160: 6e 65 65 64 73 20 61 74 20 6c 65 61 73 74 20 74 needs at least t
5170: 77 6f 20 72 65 76 69 73 69 6f 6e 73 20 69 6e 0a wo revisions in.
5180: 09 23 20 20 20 20 20 20 20 74 68 65 20 72 61 6e .# the ran
5190: 67 65 2e 0a 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 ge....if {[lleng
51a0: 74 68 20 24 72 61 6e 67 65 5d 20 3c 20 32 7d 20 th $range] < 2}
51b0: 7b 20 72 65 74 75 72 6e 20 2d 31 20 7d 0a 0a 09 { return -1 }...
51c0: 73 65 74 20 6d 61 78 20 2d 31 0a 09 73 65 74 20 set max -1..set
51d0: 62 65 73 74 20 7b 7d 0a 0a 09 66 6f 72 65 61 63 best {}...foreac
51e0: 68 20 6c 6f 63 61 74 69 6f 6e 20 24 72 61 6e 67 h location $rang
51f0: 65 20 7b 0a 09 20 20 20 20 73 65 74 20 63 72 6f e {.. set cro
5200: 73 73 69 6e 67 73 20 24 63 72 6f 73 73 28 24 6c ssings $cross($l
5210: 6f 63 61 74 69 6f 6e 29 0a 09 20 20 20 20 69 66 ocation).. if
5220: 20 7b 24 63 72 6f 73 73 69 6e 67 73 20 3e 20 24 {$crossings > $
5230: 6d 61 78 7d 20 7b 0a 09 09 73 65 74 20 6d 61 78 max} {...set max
5240: 20 20 24 63 72 6f 73 73 69 6e 67 73 0a 09 09 73 $crossings...s
5250: 65 74 20 62 65 73 74 20 5b 6c 69 73 74 20 24 6c et best [list $l
5260: 6f 63 61 74 69 6f 6e 5d 0a 09 09 63 6f 6e 74 69 ocation]...conti
5270: 6e 75 65 0a 09 20 20 20 20 7d 20 65 6c 73 65 69 nue.. } elsei
5280: 66 20 7b 24 63 72 6f 73 73 69 6e 67 73 20 3d 3d f {$crossings ==
5290: 20 24 6d 61 78 7d 20 7b 0a 09 09 6c 61 70 70 65 $max} {...lappe
52a0: 6e 64 20 62 65 73 74 20 24 6c 6f 63 61 74 69 6f nd best $locatio
52b0: 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 n.. }..}...if
52c0: 20 7b 24 6d 61 78 20 3d 3d 20 30 7d 20 20 20 20 {$max == 0}
52d0: 20 20 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e { return
52e0: 20 2d 31 20 7d 0a 09 69 66 20 7b 5b 6c 6c 65 6e -1 }..if {[llen
52f0: 67 74 68 20 24 62 65 73 74 5d 20 3d 3d 20 31 7d gth $best] == 1}
5300: 20 7b 20 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65 { return [linde
5310: 78 20 24 62 65 73 74 20 30 5d 20 7d 0a 0a 09 73 x $best 0] }...s
5320: 65 74 20 6c 6f 63 61 74 69 6f 6e 73 20 24 62 65 et locations $be
5330: 73 74 0a 09 73 65 74 20 62 65 73 74 20 7b 7d 0a st..set best {}.
5340: 09 73 65 74 20 6d 69 6e 20 2d 31 0a 0a 09 66 6f .set min -1...fo
5350: 72 65 61 63 68 20 6c 6f 63 61 74 69 6f 6e 20 24 reach location $
5360: 6c 6f 63 61 74 69 6f 6e 73 20 7b 0a 09 20 20 20 locations {..
5370: 20 73 65 74 20 69 6e 74 65 72 76 61 6c 20 24 64 set interval $d
5380: 65 6c 74 61 28 24 6c 6f 63 61 74 69 6f 6e 29 0a elta($location).
5390: 09 20 20 20 20 69 66 20 7b 28 24 6d 69 6e 20 3c . if {($min <
53a0: 20 30 29 20 7c 7c 20 28 24 69 6e 74 65 72 76 61 0) || ($interva
53b0: 6c 20 3c 20 24 6d 69 6e 29 7d 20 7b 0a 09 09 73 l < $min)} {...s
53c0: 65 74 20 6d 69 6e 20 20 24 69 6e 74 65 72 76 61 et min $interva
53d0: 6c 0a 09 09 73 65 74 20 62 65 73 74 20 5b 6c 69 l...set best [li
53e0: 73 74 20 24 6c 6f 63 61 74 69 6f 6e 5d 0a 09 20 st $location]..
53f0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 69 6e } elseif {$in
5400: 74 65 72 76 61 6c 20 3d 3d 20 24 6d 69 6e 7d 20 terval == $min}
5410: 7b 0a 09 09 6c 61 70 70 65 6e 64 20 62 65 73 74 {...lappend best
5420: 20 24 6c 6f 63 61 74 69 6f 6e 0a 09 20 20 20 20 $location..
5430: 7d 0a 09 7d 0a 0a 09 69 66 20 7b 5b 6c 6c 65 6e }..}...if {[llen
5440: 67 74 68 20 24 62 65 73 74 5d 20 3d 3d 20 31 7d gth $best] == 1}
5450: 20 7b 20 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65 { return [linde
5460: 78 20 24 62 65 73 74 20 30 5d 20 7d 0a 0a 09 72 x $best 0] }...r
5470: 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 5b 6c eturn [lindex [l
5480: 73 6f 72 74 20 2d 69 6e 74 65 67 65 72 20 2d 69 sort -integer -i
5490: 6e 63 72 65 61 73 69 6e 67 20 24 62 65 73 74 5d ncreasing $best]
54a0: 20 30 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 0]. }.. p
54b0: 72 6f 63 20 43 75 74 41 74 20 7b 6c 6f 63 61 74 roc CutAt {locat
54c0: 69 6f 6e 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 ion} {..upvar 1
54d0: 63 72 6f 73 73 20 63 72 6f 73 73 20 64 65 70 63 cross cross depc
54e0: 20 64 65 70 63 0a 0a 09 23 20 49 74 20 77 61 73 depc...# It was
54f0: 20 64 65 63 69 64 65 64 20 74 6f 20 73 70 6c 69 decided to spli
5500: 74 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 t the changeset
5510: 61 74 20 74 68 65 20 67 69 76 65 6e 0a 09 23 20 at the given..#
5520: 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 69 73 20 63 location. This c
5530: 75 74 73 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 uts a number of
5540: 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 48 65 dependencies. He
5550: 72 65 20 77 65 20 75 70 64 61 74 65 0a 09 23 20 re we update..#
5560: 74 68 65 20 63 72 6f 73 73 20 69 6e 66 6f 72 6d the cross inform
5570: 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 ation so that th
5580: 65 20 62 72 65 61 6b 20 66 69 6e 64 65 72 20 68 e break finder h
5590: 61 73 20 61 63 63 75 72 61 74 65 0a 09 23 20 64 as accurate..# d
55a0: 61 74 61 20 77 68 65 6e 20 77 65 20 6c 6f 6f 6b ata when we look
55b0: 20 61 74 20 74 68 65 20 67 65 6e 65 72 61 74 65 at the generate
55c0: 64 20 66 72 61 67 6d 65 6e 74 73 2e 0a 0a 09 73 d fragments....s
55d0: 65 74 20 73 69 78 20 5b 6c 6f 67 20 76 69 73 69 et six [log visi
55e0: 62 6c 65 3f 20 36 5d 0a 0a 09 66 6f 72 65 61 63 ble? 6]...foreac
55f0: 68 20 7b 64 65 70 20 72 61 6e 67 65 7d 20 5b 61 h {dep range} [a
5600: 72 72 61 79 20 67 65 74 20 64 65 70 63 5d 20 7b rray get depc] {
5610: 0a 09 20 20 20 20 23 20 43 68 65 63 6b 20 61 6c .. # Check al
5620: 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 73 l dependencies s
5630: 74 69 6c 6c 20 6b 6e 6f 77 6e 2c 20 74 61 6b 65 till known, take
5640: 20 74 68 65 69 72 20 72 61 6e 67 65 20 61 6e 64 their range and
5650: 0a 09 20 20 20 20 23 20 73 65 65 20 69 66 20 74 .. # see if t
5660: 68 65 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f he break locatio
5670: 6e 20 66 61 6c 6c 73 20 77 69 74 68 69 6e 2e 0a n falls within..
5680: 0a 09 20 20 20 20 42 6f 72 64 65 72 20 24 72 61 .. Border $ra
5690: 6e 67 65 20 73 20 65 0a 09 20 20 20 20 69 66 20 nge s e.. if
56a0: 7b 24 6c 6f 63 61 74 69 6f 6e 20 3c 20 24 73 7d {$location < $s}
56b0: 20 63 6f 6e 74 69 6e 75 65 20 3b 20 23 20 62 72 continue ; # br
56c0: 65 61 6b 20 62 65 66 6f 72 65 20 72 61 6e 67 65 eak before range
56d0: 2c 20 69 67 6e 6f 72 65 0a 09 20 20 20 20 69 66 , ignore.. if
56e0: 20 7b 24 6c 6f 63 61 74 69 6f 6e 20 3e 20 24 65 {$location > $e
56f0: 7d 20 63 6f 6e 74 69 6e 75 65 20 3b 20 23 20 62 } continue ; # b
5700: 72 65 61 6b 20 61 66 74 65 72 20 72 61 6e 67 65 reak after range
5710: 2c 20 69 67 6e 6f 72 65 2e 0a 0a 09 20 20 20 20 , ignore....
5720: 23 20 54 68 69 73 20 64 65 70 65 6e 64 65 6e 63 # This dependenc
5730: 79 20 63 72 6f 73 73 65 73 20 74 68 65 20 62 72 y crosses the br
5740: 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 2e 20 57 65 eak location. We
5750: 20 72 65 6d 6f 76 65 20 69 74 0a 09 20 20 20 20 remove it..
5760: 23 20 66 72 6f 6d 20 74 68 65 20 63 72 6f 73 73 # from the cross
5770: 69 6e 67 73 20 63 6f 75 6e 74 65 72 73 2c 20 61 ings counters, a
5780: 6e 64 20 74 68 65 6e 20 61 6c 73 6f 20 66 72 6f nd then also fro
5790: 6d 20 74 68 65 20 73 65 74 0a 09 20 20 20 20 23 m the set.. #
57a0: 20 6f 66 20 6b 6e 6f 77 6e 20 64 65 70 65 6e 64 of known depend
57b0: 65 6e 63 69 65 73 2c 20 61 73 20 77 65 20 61 72 encies, as we ar
57c0: 65 20 64 6f 6e 65 20 77 69 74 68 20 69 74 2e 0a e done with it..
57d0: 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 6c 6f .. foreach lo
57e0: 63 20 24 64 65 70 63 28 24 64 65 70 29 20 7b 20 c $depc($dep) {
57f0: 69 6e 63 72 20 63 72 6f 73 73 28 24 6c 6f 63 29 incr cross($loc)
5800: 20 2d 31 20 7d 0a 09 20 20 20 20 75 6e 73 65 74 -1 }.. unset
5810: 20 64 65 70 63 28 24 64 65 70 29 0a 0a 09 20 20 depc($dep)...
5820: 20 20 69 66 20 7b 21 24 73 69 78 7d 20 63 6f 6e if {!$six} con
5830: 74 69 6e 75 65 0a 0a 09 20 20 20 20 73 74 72 75 tinue... stru
5840: 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 ct::list assign
5850: 24 64 65 70 20 70 61 72 65 6e 74 20 63 68 69 6c $dep parent chil
5860: 64 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 d.. log write
5870: 20 35 20 63 73 65 74 73 20 22 42 72 6f 6b 65 20 5 csets "Broke
5880: 64 65 70 65 6e 64 65 6e 63 79 20 5b 50 44 20 24 dependency [PD $
5890: 70 61 72 65 6e 74 5d 20 2d 2d 3e 20 5b 50 44 20 parent] --> [PD
58a0: 24 63 68 69 6c 64 5d 22 0a 09 7d 0a 0a 09 72 65 $child]"..}...re
58b0: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 turn. }..
58c0: 23 20 50 72 69 6e 74 20 69 64 65 6e 74 69 66 79 # Print identify
58d0: 69 6e 67 20 64 61 74 61 20 66 6f 72 20 61 20 72 ing data for a r
58e0: 65 76 69 73 69 6f 6e 20 28 70 72 6f 6a 65 63 74 evision (project
58f0: 2c 20 66 69 6c 65 2c 20 64 6f 74 74 65 64 20 72 , file, dotted r
5900: 65 76 0a 20 20 20 20 23 20 6e 75 6d 62 65 72 29 ev. # number)
5910: 2c 20 66 6f 72 20 68 69 67 68 20 76 65 72 62 6f , for high verbo
5920: 73 69 74 79 20 6c 6f 67 20 6f 75 74 70 75 74 2e sity log output.
5930: 0a 20 20 20 20 23 20 54 4f 44 4f 3a 20 52 65 70 . # TODO: Rep
5940: 6c 61 63 65 20 77 69 74 68 20 63 61 6c 6c 20 74 lace with call t
5950: 6f 20 69 74 65 6d 73 74 72 20 28 6c 69 73 74 20 o itemstr (list
5960: 72 65 76 20 24 69 64 29 0a 0a 20 20 20 20 70 72 rev $id).. pr
5970: 6f 63 20 50 44 20 7b 69 64 7d 20 7b 0a 09 66 6f oc PD {id} {..fo
5980: 72 65 61 63 68 20 7b 70 20 66 20 72 7d 20 5b 73 reach {p f r} [s
5990: 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 53 45 4c tate run {...SEL
59a0: 45 43 54 20 50 2e 6e 61 6d 65 20 2c 20 46 2e 6e ECT P.name , F.n
59b0: 61 6d 65 2c 20 52 2e 72 65 76 0a 09 09 46 52 4f ame, R.rev...FRO
59c0: 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 66 69 M revision R, fi
59d0: 6c 65 20 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a le F, project P.
59e0: 09 09 57 48 45 52 45 20 52 2e 72 69 64 20 3d 20 ..WHERE R.rid =
59f0: 24 69 64 0a 09 09 41 4e 44 20 20 20 46 2e 66 69 $id...AND F.fi
5a00: 64 20 3d 20 52 2e 66 69 64 0a 09 09 41 4e 44 20 d = R.fid...AND
5a10: 20 20 50 2e 70 69 64 20 3d 20 46 2e 70 69 64 0a P.pid = F.pid.
5a20: 09 7d 5d 20 62 72 65 61 6b 0a 09 72 65 74 75 72 .}] break..retur
5a30: 6e 20 22 27 24 70 20 3a 20 24 66 2f 24 72 27 22 n "'$p : $f/$r'"
5a40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 50 72 . }.. # Pr
5a50: 69 6e 74 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f inting one or mo
5a60: 72 65 20 72 61 6e 67 65 73 2c 20 66 6f 72 6d 61 re ranges, forma
5a70: 74 74 65 64 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 tted, and only t
5a80: 68 65 69 72 20 62 6f 72 64 65 72 20 74 6f 0a 20 heir border to.
5a90: 20 20 20 23 20 6b 65 65 70 20 74 68 65 20 73 74 # keep the st
5aa0: 72 69 6e 67 73 20 73 68 6f 72 74 2e 0a 0a 20 20 rings short...
5ab0: 20 20 70 72 6f 63 20 50 52 73 20 7b 72 61 6e 67 proc PRs {rang
5ac0: 65 73 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b 73 es} {..return [s
5ad0: 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20 truct::list map
5ae0: 24 72 61 6e 67 65 73 20 5b 6d 79 70 72 6f 63 20 $ranges [myproc
5af0: 50 52 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 PR]]. }..
5b00: 70 72 6f 63 20 50 52 20 7b 72 61 6e 67 65 7d 20 proc PR {range}
5b10: 7b 0a 09 42 6f 72 64 65 72 20 24 72 61 6e 67 65 {..Border $range
5b20: 20 73 20 65 0a 09 72 65 74 75 72 6e 20 3c 24 7b s e..return <${
5b30: 73 7d 2e 2e 2e 24 7b 65 7d 3e 0a 20 20 20 20 7d s}...${e}>. }
5b40: 0a 0a 20 20 20 20 70 72 6f 63 20 42 6f 72 64 65 .. proc Borde
5b50: 72 20 7b 72 61 6e 67 65 20 73 76 20 65 76 7d 20 r {range sv ev}
5b60: 7b 0a 09 75 70 76 61 72 20 31 20 24 73 76 20 73 {..upvar 1 $sv s
5b70: 20 24 65 76 20 65 0a 09 73 65 74 20 73 20 5b 6c $ev e..set s [l
5b80: 69 6e 64 65 78 20 24 72 61 6e 67 65 20 30 5d 0a index $range 0].
5b90: 09 73 65 74 20 65 20 5b 6c 69 6e 64 65 78 20 24 .set e [lindex $
5ba0: 72 61 6e 67 65 20 65 6e 64 5d 0a 09 72 65 74 75 range end]..retu
5bb0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 rn. }.. #
5bc0: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 # ## ### ##### #
5bd0: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 ####### ########
5be0: 23 23 23 23 23 0a 0a 20 20 20 20 74 79 70 65 76 #####.. typev
5bf0: 61 72 69 61 62 6c 65 20 6d 79 63 68 61 6e 67 65 ariable mychange
5c00: 73 65 74 73 20 20 20 20 20 7b 7d 20 3b 20 23 20 sets {} ; #
5c10: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 6b 6e 6f 77 List of all know
5c20: 6e 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 20 20 n changesets..
5c30: 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d typevariable m
5c40: 79 69 74 65 6d 6d 61 70 20 2d 61 72 72 61 79 20 yitemmap -array
5c50: 7b 7d 20 3b 20 23 20 4d 61 70 20 66 72 6f 6d 20 {} ; # Map from
5c60: 69 74 65 6d 73 20 28 74 61 67 67 65 64 29 20 74 items (tagged) t
5c70: 6f 0a 09 09 09 09 20 20 20 20 20 20 20 23 20 74 o..... # t
5c80: 68 65 20 6c 69 73 74 20 6f 66 20 63 68 61 6e 67 he list of chang
5c90: 65 73 65 74 73 0a 09 09 09 09 20 20 20 20 20 20 esets.....
5ca0: 20 23 20 63 6f 6e 74 61 69 6e 69 6e 67 20 69 74 # containing it
5cb0: 2e 20 45 61 63 68 20 69 74 65 6d 20 63 61 6e 0a . Each item can.
5cc0: 09 09 09 09 20 20 20 20 20 20 20 23 20 62 65 20 .... # be
5cd0: 75 73 65 64 20 62 79 20 6f 6e 6c 79 20 6f 6e 65 used by only one
5ce0: 0a 09 09 09 09 20 20 20 20 20 20 20 23 20 63 68 ..... # ch
5cf0: 61 6e 67 65 73 65 74 2e 0a 20 20 20 20 74 79 70 angeset.. typ
5d00: 65 76 61 72 69 61 62 6c 65 20 6d 79 69 64 6d 61 evariable myidma
5d10: 70 20 20 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 p -array {} ;
5d20: 23 20 4d 61 70 20 66 72 6f 6d 20 63 68 61 6e 67 # Map from chang
5d30: 65 73 65 74 20 69 64 20 74 6f 0a 09 09 09 09 20 eset id to.....
5d40: 20 20 20 20 20 20 23 20 63 68 61 6e 67 65 73 65 # changese
5d50: 74 2e 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 t... typemeth
5d60: 6f 64 20 61 6c 6c 20 20 20 20 7b 7d 20 20 20 20 od all {}
5d70: 7b 20 72 65 74 75 72 6e 20 24 6d 79 63 68 61 6e { return $mychan
5d80: 67 65 73 65 74 73 20 7d 0a 20 20 20 20 74 79 70 gesets }. typ
5d90: 65 6d 65 74 68 6f 64 20 6f 66 20 20 20 20 20 7b emethod of {
5da0: 63 69 64 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d cid} { return $m
5db0: 79 69 64 6d 61 70 28 24 63 69 64 29 20 7d 0a 20 yidmap($cid) }.
5dc0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6f 66 typemethod of
5dd0: 69 74 65 6d 20 7b 69 69 64 7d 20 7b 20 72 65 74 item {iid} { ret
5de0: 75 72 6e 20 24 6d 79 69 74 65 6d 6d 61 70 28 24 urn $myitemmap($
5df0: 69 69 64 29 20 7d 0a 0a 20 20 20 20 23 20 23 20 iid) }.. # #
5e00: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 ## ### ##### ###
5e10: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 ##### ##########
5e20: 23 23 23 0a 20 20 20 20 23 23 20 43 6f 6e 66 69 ###. ## Confi
5e30: 67 75 72 61 74 69 6f 6e 0a 0a 20 20 20 20 70 72 guration.. pr
5e40: 61 67 6d 61 20 2d 68 61 73 74 79 70 65 69 6e 66 agma -hastypeinf
5e50: 6f 20 20 20 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 o no ; # no
5e60: 74 79 70 65 20 69 6e 74 72 6f 73 70 65 63 74 69 type introspecti
5e70: 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68 on. pragma -h
5e80: 61 73 69 6e 66 6f 20 20 20 20 20 20 20 20 6e 6f asinfo no
5e90: 20 20 3b 20 23 20 6e 6f 20 6f 62 6a 65 63 74 20 ; # no object
5ea0: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 0a 20 introspection..
5eb0: 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 # # ## ### ##
5ec0: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 ### ######## ###
5ed0: 23 23 23 23 23 23 23 23 23 23 0a 7d 0a 0a 23 23 ##########.}..##
5ee0: 0a 23 23 20 4e 4f 54 45 3a 20 54 68 65 20 73 75 .## NOTE: The su
5ef0: 63 63 65 73 73 6f 72 20 61 6e 64 20 70 72 65 64 ccessor and pred
5f00: 65 63 65 73 73 6f 72 20 6d 65 74 68 6f 64 73 20 ecessor methods
5f10: 64 65 66 69 6e 65 64 20 62 79 20 74 68 65 20 63 defined by the c
5f20: 6c 61 73 73 65 73 0a 23 23 20 20 20 20 20 20 20 lasses.##
5f30: 62 65 6c 6f 77 20 61 72 65 20 2d 2d 20 62 6f 74 below are -- bot
5f40: 74 6c 65 20 6e 65 63 6b 73 20 2d 2d 2e 20 4c 6f tle necks --. Lo
5f50: 6f 6b 20 66 6f 72 20 77 61 79 73 20 74 6f 20 6d ok for ways to m
5f60: 61 6b 65 20 74 68 65 20 53 51 4c 0a 23 23 20 20 ake the SQL.##
5f70: 20 20 20 20 20 66 61 73 74 65 72 2e 0a 23 23 0a faster..##.
5f80: 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 .# # ## ### ####
5f90: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 # ######## #####
5fa0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
5fb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 ##############.#
5fc0: 23 20 48 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 # Helper singlet
5fd0: 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20 66 6f 72 on. Commands for
5fe0: 20 72 65 76 69 73 69 6f 6e 20 63 68 61 6e 67 65 revision change
5ff0: 73 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 sets...snit::typ
6000: 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a e ::vc::fossil::
6010: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f import::cvs::pro
6020: 6a 65 63 74 3a 3a 72 65 76 3a 3a 72 65 76 20 7b ject::rev::rev {
6030: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 . typemethod
6040: 62 79 72 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 byrevision {} {
6050: 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 return 1 }. t
6060: 79 70 65 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 ypemethod bysymb
6070: 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e ol {} { return
6080: 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 0 }. typemet
6090: 68 6f 64 20 69 73 74 61 67 20 20 20 20 20 20 7b hod istag {
60a0: 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 } { return 0 }.
60b0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73 typemethod is
60c0: 62 72 61 6e 63 68 20 20 20 7b 7d 20 7b 20 72 65 branch {} { re
60d0: 74 75 72 6e 20 30 20 7d 0a 0a 20 20 20 20 74 79 turn 0 }.. ty
60e0: 70 65 6d 65 74 68 6f 64 20 73 74 72 20 7b 72 65 pemethod str {re
60f0: 76 69 73 69 6f 6e 7d 20 7b 0a 09 73 74 72 75 63 vision} {..struc
6100: 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b t::list assign [
6110: 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 state run {..
6120: 20 53 45 4c 45 43 54 20 52 2e 72 65 76 2c 20 46 SELECT R.rev, F
6130: 2e 6e 61 6d 65 2c 20 50 2e 6e 61 6d 65 0a 09 20 .name, P.name..
6140: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 FROM revisi
6150: 6f 6e 20 52 2c 20 66 69 6c 65 20 46 2c 20 70 72 on R, file F, pr
6160: 6f 6a 65 63 74 20 50 0a 09 20 20 20 20 57 48 45 oject P.. WHE
6170: 52 45 20 20 52 2e 72 69 64 20 3d 20 24 72 65 76 RE R.rid = $rev
6180: 69 73 69 6f 6e 0a 09 20 20 20 20 41 4e 44 20 20 ision.. AND
6190: 20 20 46 2e 66 69 64 20 3d 20 52 2e 66 69 64 0a F.fid = R.fid.
61a0: 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69 . AND P.pi
61b0: 64 20 3d 20 46 2e 70 69 64 0a 09 7d 5d 20 72 65 d = F.pid..}] re
61c0: 76 6e 72 20 66 6e 61 6d 65 20 70 6e 61 6d 65 0a vnr fname pname.
61d0: 09 72 65 74 75 72 6e 20 22 24 70 6e 61 6d 65 2f .return "$pname/
61e0: 24 7b 72 65 76 6e 72 7d 3a 3a 24 66 6e 61 6d 65 ${revnr}::$fname
61f0: 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 ". }.. # r
6200: 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69 esult = list (mi
6210: 6e 74 69 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a ntime, maxtime).
6220: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 74 typemethod t
6230: 69 6d 65 72 61 6e 67 65 20 7b 69 74 65 6d 73 7d imerange {items}
6240: 20 7b 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 {..set theset (
6250: 27 5b 6a 6f 69 6e 20 24 69 74 65 6d 73 20 7b 27 '[join $items {'
6260: 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b ,'}]')..return [
6270: 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 state run "..
6280: 20 53 45 4c 45 43 54 20 4d 49 4e 28 52 2e 64 61 SELECT MIN(R.da
6290: 74 65 29 2c 20 4d 41 58 28 52 2e 64 61 74 65 29 te), MAX(R.date)
62a0: 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73 .. FROM revis
62b0: 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 ion R.. WHERE
62c0: 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 R.rid IN $these
62d0: 74 0a 09 22 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 t.."]. }..
62e0: 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 # var(dv) = dic
62f0: 74 20 28 72 65 76 69 73 69 6f 6e 20 2d 3e 20 6c t (revision -> l
6300: 69 73 74 20 28 72 65 76 69 73 69 6f 6e 29 29 0a ist (revision)).
6310: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 typemethod i
6320: 6e 74 65 72 6e 61 6c 73 75 63 63 65 73 73 6f 72 nternalsuccessor
6330: 73 20 7b 64 76 20 72 65 76 69 73 69 6f 6e 73 7d s {dv revisions}
6340: 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76 20 {..upvar 1 $dv
6350: 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 73 65 dependencies..se
6360: 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e t theset ('[join
6370: 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 $revisions {','
6380: 7d 5d 27 29 0a 0a 09 23 20 53 65 65 20 27 73 75 }]')...# See 'su
6390: 63 63 65 73 73 6f 72 73 27 20 62 65 6c 6f 77 20 ccessors' below
63a0: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 65 78 70 for the main exp
63b0: 6c 61 6e 61 74 69 6f 6e 20 6f 66 0a 09 23 20 74 lanation of..# t
63c0: 68 65 20 76 61 72 69 6f 75 73 20 63 61 73 65 73 he various cases
63d0: 2e 20 54 68 69 73 20 70 69 65 63 65 20 69 73 20 . This piece is
63e0: 73 70 65 63 69 61 6c 20 69 6e 20 74 68 61 74 20 special in that
63f0: 69 74 0a 09 23 20 72 65 73 74 72 69 63 74 73 20 it..# restricts
6400: 74 68 65 20 73 75 63 63 65 73 73 6f 72 73 20 77 the successors w
6410: 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 6f 20 74 68 e look for to th
6420: 65 20 73 61 6d 65 20 73 65 74 20 6f 66 0a 09 23 e same set of..#
6430: 20 72 65 76 69 73 69 6f 6e 73 20 77 65 20 73 74 revisions we st
6440: 61 72 74 20 66 72 6f 6d 2e 20 53 65 6e 73 69 62 art from. Sensib
6450: 6c 65 20 61 73 20 77 65 20 61 72 65 20 6c 6f 6f le as we are loo
6460: 6b 69 6e 67 20 66 6f 72 0a 09 23 20 63 68 61 6e king for..# chan
6470: 67 65 73 65 74 20 69 6e 74 65 72 6e 61 6c 20 64 geset internal d
6480: 65 70 65 6e 64 65 6e 63 69 65 73 2e 0a 0a 09 61 ependencies....a
6490: 72 72 61 79 20 73 65 74 20 64 65 70 20 7b 7d 0a rray set dep {}.
64a0: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63 ..foreach {rid c
64b0: 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e hild} [state run
64c0: 20 22 0a 20 20 20 2d 2d 20 28 31 29 20 50 72 69 ". -- (1) Pri
64d0: 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20 mary child..
64e0: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e SELECT R.rid, R.
64f0: 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 child.. FROM
6500: 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 revision R..
6510: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 WHERE R.rid
6520: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 IN $theset
6530: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 -- Restrict to r
6540: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 evisions of inte
6550: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 rest.. AND
6560: 20 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 R.child IS NOT
6570: 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 NULL -- Has p
6580: 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20 rimary child..
6590: 20 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 AND R.child
65a0: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 IN $theset
65b0: 2d 2d 20 57 68 69 63 68 20 69 73 20 61 6c 73 6f -- Which is also
65c0: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 20 20 20 of interest.
65d0: 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32 UNION. -- (2
65e0: 29 20 53 65 63 6f 6e 64 61 72 79 20 28 62 72 61 ) Secondary (bra
65f0: 6e 63 68 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 nch) children..
6600: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c SELECT R.rid,
6610: 20 42 2e 62 72 69 64 0a 09 20 20 20 20 46 52 4f B.brid.. FRO
6620: 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 M revision R,
6630: 72 65 76 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 revisionbranchch
6640: 69 6c 64 72 65 6e 20 42 0a 09 20 20 20 20 57 48 ildren B.. WH
6650: 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 ERE R.rid IN
6660: 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 $theset -- R
6670: 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 estrict to revis
6680: 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 ions of interest
6690: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72 .. AND R.r
66a0: 69 64 20 3d 20 42 2e 72 69 64 20 20 20 20 20 20 id = B.rid
66b0: 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 73 75 -- Select su
66c0: 62 73 65 74 20 6f 66 20 62 72 61 6e 63 68 20 63 bset of branch c
66d0: 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 41 4e 44 hildren.. AND
66e0: 20 20 20 20 42 2e 62 72 69 64 20 49 4e 20 24 74 B.brid IN $t
66f0: 68 65 73 65 74 20 20 20 20 20 20 2d 2d 20 57 68 heset -- Wh
6700: 69 63 68 20 69 73 20 61 6c 73 6f 20 6f 66 20 69 ich is also of i
6710: 6e 74 65 72 65 73 74 0a 20 20 20 20 55 4e 49 4f nterest. UNIO
6720: 4e 0a 20 20 20 20 2d 2d 20 28 34 29 20 43 68 69 N. -- (4) Chi
6730: 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 ld of trunk root
6740: 20 73 75 63 63 65 73 73 6f 72 20 6f 66 20 6c 61 successor of la
6750: 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b st NTDB on trunk
6760: 2e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e ... SELECT R.
6770: 72 69 64 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20 rid, RA.child..
6780: 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e FROM revision
6790: 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 0a R, revision RA.
67a0: 09 20 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 . WHERE R.rid
67b0: 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 IN $theset
67c0: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 -- Restrict t
67d0: 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 o revisions of i
67e0: 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 nterest.. AND
67f0: 20 20 20 52 2e 69 73 64 65 66 61 75 6c 74 20 20 R.isdefault
6800: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 52 65 -- Re
6810: 73 74 72 69 63 74 20 74 6f 20 4e 54 44 42 0a 09 strict to NTDB..
6820: 20 20 20 20 41 4e 44 20 20 20 52 2e 64 62 63 68 AND R.dbch
6830: 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 ild IS NOT NULL
6840: 20 20 2d 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 -- and last NT
6850: 44 42 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 DB belonging to
6860: 74 72 75 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 trunk.. AND
6870: 20 52 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 RA.rid = R.dbch
6880: 69 6c 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 ild -- Go d
6890: 69 72 65 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b irectly to trunk
68a0: 20 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 root.. AND
68b0: 20 52 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 RA.child IS NOT
68c0: 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 NULL -- Has
68d0: 70 72 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 20 primary child..
68e0: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 AND
68f0: 20 52 41 2e 63 68 69 6c 64 20 49 4e 20 24 74 68 RA.child IN $th
6900: 65 73 65 74 20 20 20 20 20 2d 2d 20 57 68 69 63 eset -- Whic
6910: 68 20 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e 74 h is also of int
6920: 65 72 65 73 74 0a 09 22 5d 20 7b 0a 09 20 20 20 erest.."] {..
6930: 20 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69 # Consider movi
6940: 6e 67 20 74 68 69 73 20 74 6f 20 74 68 65 20 69 ng this to the i
6950: 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e ntegrity module.
6960: 0a 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 .. integrity
6970: 61 73 73 65 72 74 20 7b 24 72 69 64 20 21 3d 20 assert {$rid !=
6980: 24 63 68 69 6c 64 7d 20 7b 52 65 76 69 73 69 6f $child} {Revisio
6990: 6e 20 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f n $rid depends o
69a0: 6e 20 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20 n itself.}..
69b0: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e lappend dependen
69c0: 63 69 65 73 28 24 72 69 64 29 20 24 63 68 69 6c cies($rid) $chil
69d0: 64 0a 09 20 20 20 20 73 65 74 20 64 65 70 28 24 d.. set dep($
69e0: 72 69 64 2c 24 63 68 69 6c 64 29 20 2e 0a 09 7d rid,$child) ...}
69f0: 0a 0a 09 23 20 54 68 65 20 73 71 6c 20 73 74 61 ...# The sql sta
6a00: 74 65 6d 65 6e 74 73 20 61 62 6f 76 65 20 6c 6f tements above lo
6a10: 6f 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 64 69 72 oks only for dir
6a20: 65 63 74 20 64 65 70 65 6e 64 65 6e 63 69 65 73 ect dependencies
6a30: 0a 09 23 20 62 65 74 77 65 65 6e 20 72 65 76 69 ..# between revi
6a40: 73 69 6f 6e 20 69 6e 20 74 68 65 20 63 68 61 6e sion in the chan
6a50: 67 65 73 65 74 2e 20 48 6f 77 65 76 65 72 20 64 geset. However d
6a60: 75 65 20 74 6f 20 74 68 65 0a 09 23 20 76 61 67 ue to the..# vag
6a70: 61 72 69 65 73 20 6f 66 20 6d 65 74 61 20 64 61 aries of meta da
6a80: 74 61 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c ta it is possibl
6a90: 65 20 66 6f 72 20 74 77 6f 20 72 65 76 69 73 69 e for two revisi
6aa0: 6f 6e 73 20 6f 66 0a 09 23 20 74 68 65 20 73 61 ons of..# the sa
6ab0: 6d 65 20 66 69 6c 65 20 74 6f 20 65 6e 64 20 75 me file to end u
6ac0: 70 20 69 6e 20 74 68 65 20 73 61 6d 65 20 63 68 p in the same ch
6ad0: 61 6e 67 65 73 65 74 2c 20 77 69 74 68 6f 75 74 angeset, without
6ae0: 20 61 0a 09 23 20 64 69 72 65 63 74 20 64 65 70 a..# direct dep
6af0: 65 6e 64 65 6e 63 79 20 62 65 74 77 65 65 6e 20 endency between
6b00: 74 68 65 6d 2e 20 48 6f 77 65 76 65 72 20 77 65 them. However we
6b10: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 72 65 know that there
6b20: 0a 09 23 20 68 61 73 20 74 6f 20 62 65 20 61 20 ..# has to be a
6b30: 61 6e 20 69 6e 64 69 72 65 63 74 20 64 65 70 65 an indirect depe
6b40: 6e 64 65 6e 63 79 2c 20 62 65 20 69 74 20 74 68 ndency, be it th
6b50: 72 6f 75 67 68 20 70 72 69 6d 61 72 79 0a 09 23 rough primary..#
6b60: 20 63 68 69 6c 64 72 65 6e 2c 20 62 72 61 6e 63 children, branc
6b70: 68 20 63 68 69 6c 64 72 65 6e 2c 20 6f 72 20 61 h children, or a
6b80: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68 65 combination the
6b90: 72 65 6f 66 2e 0a 0a 09 23 20 57 65 20 6e 6f 77 reof....# We now
6ba0: 20 66 69 6c 6c 20 69 6e 20 74 68 65 73 65 20 70 fill in these p
6bb0: 73 65 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63 69 seudo-dependenci
6bc0: 65 73 2c 20 69 66 20 6e 6f 20 73 75 63 68 0a 09 es, if no such..
6bd0: 23 20 64 65 70 65 6e 64 65 6e 63 79 20 65 78 69 # dependency exi
6be0: 73 74 73 20 61 6c 72 65 61 64 79 2e 20 54 68 65 sts already. The
6bf0: 20 64 69 72 65 63 74 69 6f 6e 20 6f 66 20 74 68 direction of th
6c00: 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 09 23 20 e dependency..#
6c10: 69 73 20 61 63 74 75 61 6c 6c 79 20 69 72 72 65 is actually irre
6c20: 6c 65 76 61 6e 74 20 66 6f 72 20 74 68 69 73 2e levant for this.
6c30: 0a 0a 09 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 ...# NOTE: This
6c40: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f is different fro
6c50: 6d 20 63 76 73 32 73 76 6e 2e 20 4f 75 72 20 73 m cvs2svn. Our s
6c60: 70 69 72 69 74 75 61 6c 20 61 6e 63 65 73 74 6f piritual ancesto
6c70: 72 0a 09 23 20 64 6f 65 73 20 6e 6f 74 20 75 73 r..# does not us
6c80: 65 20 73 75 63 68 20 70 73 65 75 64 6f 2d 64 65 e such pseudo-de
6c90: 70 65 6e 64 65 6e 63 69 65 73 2c 20 68 6f 77 65 pendencies, howe
6ca0: 76 65 72 20 69 74 20 75 73 65 73 20 61 0a 09 23 ver it uses a..#
6cb0: 20 43 4f 4d 4d 49 54 5f 54 48 52 45 53 48 4f 4c COMMIT_THRESHOL
6cc0: 44 2c 20 61 20 74 69 6d 65 20 69 6e 74 65 72 76 D, a time interv
6cd0: 61 6c 20 63 6f 6d 6d 69 74 73 20 73 68 6f 75 6c al commits shoul
6ce0: 64 20 66 61 6c 6c 2e 20 54 68 69 73 0a 09 23 20 d fall. This..#
6cf0: 77 69 6c 6c 20 67 72 65 61 74 6c 79 20 72 65 64 will greatly red
6d00: 75 63 65 73 20 74 68 65 20 72 69 73 6b 20 6f 66 uces the risk of
6d10: 20 67 65 74 74 69 6e 67 20 66 61 72 20 73 65 70 getting far sep
6d20: 61 72 61 74 65 64 0a 09 23 20 72 65 76 69 73 69 arated..# revisi
6d30: 6f 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 ons of the same
6d40: 66 69 6c 65 20 69 6e 74 6f 20 6f 6e 65 20 63 68 file into one ch
6d50: 61 6e 67 65 73 65 74 2e 0a 0a 09 23 20 57 65 20 angeset....# We
6d60: 61 6c 6c 6f 77 20 72 65 76 69 73 69 6f 6e 73 20 allow revisions
6d70: 74 6f 20 62 65 20 66 61 72 20 61 70 61 72 74 20 to be far apart
6d80: 69 6e 20 74 69 6d 65 20 69 6e 20 74 68 65 20 73 in time in the s
6d90: 61 6d 65 0a 09 23 20 63 68 61 6e 67 65 73 65 74 ame..# changeset
6da0: 2c 20 62 75 74 20 69 6e 20 74 75 72 6e 20 6e 65 , but in turn ne
6db0: 65 64 20 74 68 65 20 70 73 65 75 64 6f 2d 64 65 ed the pseudo-de
6dc0: 70 65 6e 64 65 6e 63 69 65 73 20 74 6f 0a 09 23 pendencies to..#
6dd0: 20 68 61 6e 64 6c 65 20 74 68 69 73 2e 0a 0a 09 handle this....
6de0: 61 72 72 61 79 20 73 65 74 20 66 69 64 73 20 7b array set fids {
6df0: 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 }..foreach {rid
6e00: 66 69 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 fid} [state run
6e10: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e ".. SELECT R.
6e20: 72 69 64 2c 20 52 2e 66 69 64 0a 20 20 20 20 20 rid, R.fid.
6e30: 20 20 20 20 20 20 20 46 52 4f 4d 20 20 20 72 65 FROM re
6e40: 76 69 73 69 6f 6e 20 52 0a 20 20 20 20 20 20 20 vision R.
6e50: 20 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 WHERE R.ri
6e60: 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 22 5d d IN $theset.."]
6e70: 20 7b 20 6c 61 70 70 65 6e 64 20 66 69 64 73 28 { lappend fids(
6e80: 24 66 69 64 29 20 24 72 69 64 20 7d 0a 0a 09 66 $fid) $rid }...f
6e90: 6f 72 65 61 63 68 20 7b 66 69 64 20 72 69 64 73 oreach {fid rids
6ea0: 7d 20 5b 61 72 72 61 79 20 67 65 74 20 66 69 64 } [array get fid
6eb0: 73 5d 20 7b 0a 09 20 20 20 20 69 66 20 7b 5b 6c s] {.. if {[l
6ec0: 6c 65 6e 67 74 68 20 24 72 69 64 73 5d 20 3c 20 length $rids] <
6ed0: 32 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 20 20 20 2} continue..
6ee0: 20 66 6f 72 65 61 63 68 20 61 20 24 72 69 64 73 foreach a $rids
6ef0: 20 7b 0a 09 09 66 6f 72 65 61 63 68 20 62 20 24 {...foreach b $
6f00: 72 69 64 73 20 7b 0a 09 09 20 20 20 20 69 66 20 rids {... if
6f10: 7b 24 61 20 3d 3d 20 24 62 7d 20 63 6f 6e 74 69 {$a == $b} conti
6f20: 6e 75 65 0a 09 09 20 20 20 20 69 66 20 7b 5b 69 nue... if {[i
6f30: 6e 66 6f 20 65 78 69 73 74 73 20 64 65 70 28 24 nfo exists dep($
6f40: 61 2c 24 62 29 5d 7d 20 63 6f 6e 74 69 6e 75 65 a,$b)]} continue
6f50: 0a 09 09 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f ... if {[info
6f60: 20 65 78 69 73 74 73 20 64 65 70 28 24 62 2c 24 exists dep($b,$
6f70: 61 29 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 09 a)]} continue...
6f80: 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 lappend depe
6f90: 6e 64 65 6e 63 69 65 73 28 24 61 29 20 24 62 0a ndencies($a) $b.
6fa0: 09 09 20 20 20 20 73 65 74 20 64 65 70 28 24 61 .. set dep($a
6fb0: 2c 24 62 29 20 2e 0a 09 09 20 20 20 20 73 65 74 ,$b) .... set
6fc0: 20 64 65 70 28 24 62 2c 24 61 29 20 2e 0a 09 09 dep($b,$a) ....
6fd0: 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72 65 74 }.. }..}..ret
6fe0: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 urn. }.. #
6ff0: 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20 var(dv) = dict
7000: 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 (item -> list (i
7010: 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c tem)), item = l
7020: 69 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 20 ist (type id).
7030: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 73 75 63 typemethod suc
7040: 63 65 73 73 6f 72 73 20 7b 64 76 20 72 65 76 69 cessors {dv revi
7050: 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 sions} {..upvar
7060: 31 20 24 64 76 20 64 65 70 65 6e 64 65 6e 63 69 1 $dv dependenci
7070: 65 73 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 es..set theset (
7080: 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e '[join $revision
7090: 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 23 20 54 s {','}]')...# T
70a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 73 he following cas
70b0: 65 73 20 73 70 65 63 69 66 79 20 77 68 65 6e 20 es specify when
70c0: 61 20 72 65 76 69 73 69 6f 6e 20 53 20 69 73 20 a revision S is
70d0: 61 20 73 75 63 63 65 73 73 6f 72 0a 09 23 20 6f a successor..# o
70e0: 66 20 61 20 72 65 76 69 73 69 6f 6e 20 52 2e 20 f a revision R.
70f0: 45 61 63 68 20 6f 66 20 74 68 65 20 63 61 73 65 Each of the case
7100: 73 20 74 72 61 6e 73 6c 61 74 65 73 20 69 6e 74 s translates int
7110: 6f 20 6f 6e 65 20 6f 66 0a 09 23 20 74 68 65 20 o one of..# the
7120: 62 72 61 6e 63 68 65 73 20 6f 66 20 74 68 65 20 branches of the
7130: 53 51 4c 20 55 4e 49 4f 4e 20 63 6f 6d 69 6e 67 SQL UNION coming
7140: 20 62 65 6c 6f 77 2e 0a 09 23 0a 09 23 20 28 31 below...#..# (1
7150: 29 20 53 20 63 61 6e 20 62 65 20 61 20 70 72 69 ) S can be a pri
7160: 6d 61 72 79 20 63 68 69 6c 64 20 6f 66 20 52 2c mary child of R,
7170: 20 69 2e 65 2e 20 69 6e 20 74 68 65 20 73 61 6d i.e. in the sam
7180: 65 20 4c 4f 44 2e 20 52 0a 09 23 20 20 20 20 20 e LOD. R..#
7190: 72 65 66 65 72 65 6e 63 65 73 20 53 20 64 69 72 references S dir
71a0: 65 63 74 6c 79 2e 20 52 2e 63 68 69 6c 64 20 3d ectly. R.child =
71b0: 20 53 28 2e 72 69 64 29 2c 20 69 66 20 69 74 20 S(.rid), if it
71c0: 65 78 69 73 74 73 2e 0a 09 23 0a 09 23 20 28 32 exists...#..# (2
71d0: 29 20 53 20 63 61 6e 20 62 65 20 61 20 73 65 63 ) S can be a sec
71e0: 6f 6e 64 61 72 79 2c 20 69 2e 65 2e 20 62 72 61 ondary, i.e. bra
71f0: 6e 63 68 2c 20 63 68 69 6c 64 20 6f 66 20 52 2e nch, child of R.
7200: 20 48 65 72 65 20 74 68 65 0a 09 23 20 20 20 20 Here the..#
7210: 20 6c 69 6e 6b 20 69 73 20 6d 61 64 65 20 74 68 link is made th
7220: 72 6f 75 67 68 20 74 68 65 20 68 65 6c 70 65 72 rough the helper
7230: 20 74 61 62 6c 65 0a 09 23 20 20 20 20 20 52 45 table..# RE
7240: 56 49 53 49 4f 4e 42 52 41 4e 43 48 43 48 49 4c VISIONBRANCHCHIL
7250: 44 52 45 4e 2e 20 52 2e 72 69 64 20 2d 3e 20 52 DREN. R.rid -> R
7260: 42 43 2e 72 69 64 2c 20 52 42 43 2e 62 72 69 64 BC.rid, RBC.brid
7270: 20 3d 0a 09 23 20 20 20 20 20 53 28 2e 72 69 64 =..# S(.rid
7280: 29 0a 09 23 0a 09 23 20 28 33 29 20 4f 72 69 67 )..#..# (3) Orig
7290: 69 6e 61 6c 6c 79 20 74 68 69 73 20 75 73 65 20 inally this use
72a0: 63 61 73 65 20 64 65 66 69 6e 65 64 20 74 68 65 case defined the
72b0: 20 72 6f 6f 74 20 6f 66 20 61 20 64 65 74 61 63 root of a detac
72c0: 68 65 64 0a 09 23 20 20 20 20 20 4e 54 44 42 20 hed..# NTDB
72d0: 61 73 20 74 68 65 20 73 75 63 63 65 73 73 6f 72 as the successor
72e0: 20 6f 66 20 74 68 65 20 74 72 75 6e 6b 20 72 6f of the trunk ro
72f0: 6f 74 2e 20 54 68 69 73 20 6c 65 61 64 73 20 74 ot. This leads t
7300: 6f 20 61 0a 09 23 20 20 20 20 20 62 61 64 20 74 o a..# bad t
7310: 61 6e 67 6c 65 20 6c 61 74 65 72 20 6f 6e 2e 20 angle later on.
7320: 57 69 74 68 20 61 20 64 65 74 61 63 68 65 64 20 With a detached
7330: 4e 54 44 42 20 74 68 65 20 6f 72 69 67 69 6e 61 NTDB the origina
7340: 6c 0a 09 23 20 20 20 20 20 74 72 75 6e 6b 20 72 l..# trunk r
7350: 6f 6f 74 20 72 65 76 69 73 69 6f 6e 20 77 61 73 oot revision was
7360: 20 72 65 6d 6f 76 65 64 20 61 73 20 69 72 72 65 removed as irre
7370: 6c 65 76 61 6e 74 2c 20 61 6c 6c 6f 77 69 6e 67 levant, allowing
7380: 0a 09 23 20 20 20 20 20 74 68 65 20 6e 6f 6d 69 ..# the nomi
7390: 6e 61 6c 20 72 6f 6f 74 20 74 6f 20 62 65 20 6c nal root to be l
73a0: 61 74 65 72 20 69 6e 20 74 69 6d 65 20 74 68 61 ater in time tha
73b0: 6e 20 74 68 65 20 4e 54 44 42 0a 09 23 20 20 20 n the NTDB..#
73c0: 20 20 72 6f 6f 74 2e 20 4e 6f 77 20 73 65 74 74 root. Now sett
73d0: 69 6e 67 20 74 68 69 73 20 64 65 70 65 6e 64 65 ing this depende
73e0: 6e 63 79 20 77 69 6c 6c 20 62 65 20 62 61 63 6b ncy will be back
73f0: 77 61 72 64 20 69 6e 0a 09 23 20 20 20 20 20 74 ward in..# t
7400: 69 6d 65 2e 20 52 45 4d 4f 56 45 44 2e 0a 09 23 ime. REMOVED...#
7410: 0a 09 23 20 28 34 29 20 49 66 20 52 20 69 73 20 ..# (4) If R is
7420: 74 68 65 20 6c 61 73 74 20 6f 66 20 74 68 65 20 the last of the
7430: 4e 54 44 42 20 72 65 76 69 73 69 6f 6e 73 20 77 NTDB revisions w
7440: 68 69 63 68 20 62 65 6c 6f 6e 67 20 74 6f 0a 09 hich belong to..
7450: 23 20 20 20 20 20 74 68 65 20 74 72 75 6e 6b 2c # the trunk,
7460: 20 74 68 65 6e 20 74 68 65 20 70 72 69 6d 61 72 then the primar
7470: 79 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 74 y child of the t
7480: 72 75 6e 6b 20 72 6f 6f 74 20 28 74 68 65 0a 09 runk root (the..
7490: 23 20 20 20 20 20 27 31 2e 32 27 20 72 65 76 69 # '1.2' revi
74a0: 73 69 6f 6e 29 20 69 73 20 61 20 73 75 63 63 65 sion) is a succe
74b0: 73 73 6f 72 2c 20 69 66 20 69 74 20 65 78 69 73 ssor, if it exis
74c0: 74 73 2e 0a 0a 09 23 20 4e 6f 74 65 20 74 68 61 ts....# Note tha
74d0: 74 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 73 t the branches s
74e0: 70 61 77 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 pawned from the
74f0: 72 65 76 69 73 69 6f 6e 73 2c 20 61 6e 64 20 74 revisions, and t
7500: 68 65 0a 09 23 20 74 61 67 73 20 61 73 73 6f 63 he..# tags assoc
7510: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 6d 20 iated with them
7520: 61 72 65 20 73 75 63 63 65 73 73 6f 72 73 20 61 are successors a
7530: 73 20 77 65 6c 6c 2e 0a 0a 09 66 6f 72 65 61 63 s well....foreac
7540: 68 20 7b 72 69 64 20 63 68 69 6c 64 7d 20 5b 73 h {rid child} [s
7550: 74 61 74 65 20 72 75 6e 20 22 0a 20 20 20 2d 2d tate run ". --
7560: 20 28 31 29 20 50 72 69 6d 61 72 79 20 63 68 69 (1) Primary chi
7570: 6c 64 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 ld.. SELECT R
7580: 2e 72 69 64 2c 20 52 2e 63 68 69 6c 64 0a 09 20 .rid, R.child..
7590: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 FROM revisi
75a0: 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 on R.. WHERE
75b0: 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 R.rid IN $the
75c0: 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 set -- Restr
75d0: 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 ict to revisions
75e0: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 of interest..
75f0: 20 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 AND R.child
7600: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 IS NOT NULL
7610: 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 -- Has primary c
7620: 68 69 6c 64 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 hild. UNION.
7630: 20 20 20 2d 2d 20 28 32 29 20 53 65 63 6f 6e 64 -- (2) Second
7640: 61 72 79 20 28 62 72 61 6e 63 68 29 20 63 68 69 ary (branch) chi
7650: 6c 64 72 65 6e 0a 09 20 20 20 20 53 45 4c 45 43 ldren.. SELEC
7660: 54 20 52 2e 72 69 64 2c 20 42 2e 62 72 69 64 0a T R.rid, B.brid.
7670: 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 . FROM revi
7680: 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e sion R, revision
7690: 62 72 61 6e 63 68 63 68 69 6c 64 72 65 6e 20 42 branchchildren B
76a0: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 .. WHERE R.r
76b0: 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 id IN $theset
76c0: 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 -- Restrict
76d0: 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 to revisions of
76e0: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e interest.. AN
76f0: 44 20 20 20 20 52 2e 72 69 64 20 3d 20 42 2e 72 D R.rid = B.r
7700: 69 64 20 20 20 20 20 20 20 20 20 20 2d 2d 20 53 id -- S
7710: 65 6c 65 63 74 20 73 75 62 73 65 74 20 6f 66 20 elect subset of
7720: 62 72 61 6e 63 68 20 63 68 69 6c 64 72 65 6e 0a branch children.
7730: 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d UNION. --
7740: 20 28 34 29 20 43 68 69 6c 64 20 6f 66 20 74 72 (4) Child of tr
7750: 75 6e 6b 20 72 6f 6f 74 20 73 75 63 63 65 73 73 unk root success
7760: 6f 72 20 6f 66 20 6c 61 73 74 20 4e 54 44 42 20 or of last NTDB
7770: 6f 6e 20 74 72 75 6e 6b 2e 0a 09 20 20 20 20 53 on trunk... S
7780: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 41 2e ELECT R.rid, RA.
7790: 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 child.. FROM
77a0: 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 revision R, revi
77b0: 73 69 6f 6e 20 52 41 0a 09 20 20 20 20 57 48 45 sion RA.. WHE
77c0: 52 45 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 RE R.rid IN $t
77d0: 68 65 73 65 74 20 20 20 20 20 20 2d 2d 20 52 65 heset -- Re
77e0: 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 strict to revisi
77f0: 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a ons of interest.
7800: 09 20 20 20 20 41 4e 44 20 20 20 52 2e 69 73 64 . AND R.isd
7810: 65 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20 efault
7820: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 -- Restrict t
7830: 6f 20 4e 54 44 42 0a 09 20 20 20 20 41 4e 44 20 o NTDB.. AND
7840: 20 20 52 2e 64 62 63 68 69 6c 64 20 49 53 20 4e R.dbchild IS N
7850: 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d 20 61 6e 64 OT NULL -- and
7860: 20 6c 61 73 74 20 4e 54 44 42 20 62 65 6c 6f 6e last NTDB belon
7870: 67 69 6e 67 20 74 6f 20 74 72 75 6e 6b 0a 09 20 ging to trunk..
7880: 20 20 20 41 4e 44 20 20 20 52 41 2e 72 69 64 20 AND RA.rid
7890: 3d 20 52 2e 64 62 63 68 69 6c 64 20 20 20 20 20 = R.dbchild
78a0: 20 2d 2d 20 47 6f 20 64 69 72 65 63 74 6c 79 20 -- Go directly
78b0: 74 6f 20 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 to trunk root..
78c0: 20 20 20 41 4e 44 20 20 20 52 41 2e 63 68 69 6c AND RA.chil
78d0: 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 d IS NOT NULL
78e0: 20 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 -- Has primary
78f0: 63 68 69 6c 64 2e 0a 09 22 5d 20 7b 0a 09 20 20 child..."] {..
7900: 20 20 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 # Consider mov
7910: 69 6e 67 20 74 68 69 73 20 74 6f 20 74 68 65 20 ing this to the
7920: 69 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 integrity module
7930: 2e 0a 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 ... integrity
7940: 20 61 73 73 65 72 74 20 7b 24 72 69 64 20 21 3d assert {$rid !=
7950: 20 24 63 68 69 6c 64 7d 20 7b 52 65 76 69 73 69 $child} {Revisi
7960: 6f 6e 20 24 72 69 64 20 64 65 70 65 6e 64 73 20 on $rid depends
7970: 6f 6e 20 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20 on itself.}..
7980: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 lappend depende
7990: 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 65 76 20 ncies([list rev
79a0: 24 72 69 64 5d 29 20 5b 6c 69 73 74 20 72 65 76 $rid]) [list rev
79b0: 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72 $child]..}..for
79c0: 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 7d each {rid child}
79d0: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 [state run "..
79e0: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c SELECT R.rid,
79f0: 20 54 2e 74 69 64 0a 09 20 20 20 20 46 52 4f 4d T.tid.. FROM
7a00: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 74 revision R, t
7a10: 61 67 20 54 0a 09 20 20 20 20 57 48 45 52 45 20 ag T.. WHERE
7a20: 20 52 2e 72 69 64 20 69 6e 20 24 74 68 65 73 65 R.rid in $these
7a30: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 54 2e t.. AND T.
7a40: 72 65 76 20 3d 20 52 2e 72 69 64 0a 09 22 5d 20 rev = R.rid.."]
7a50: 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 {.. lappend d
7a60: 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 ependencies([lis
7a70: 74 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c 69 t rev $rid]) [li
7a80: 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 63 68 69 st sym::tag $chi
7a90: 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 ld]..}..foreach
7aa0: 7b 72 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 {rid child} [sta
7ab0: 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 te run ".. SE
7ac0: 4c 45 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 69 LECT R.rid, B.bi
7ad0: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 d.. FROM re
7ae0: 76 69 73 69 6f 6e 20 52 2c 20 62 72 61 6e 63 68 vision R, branch
7af0: 20 42 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 B.. WHERE R
7b00: 2e 72 69 64 20 69 6e 20 24 74 68 65 73 65 74 0a .rid in $theset.
7b10: 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 72 6f . AND B.ro
7b20: 6f 74 20 3d 20 52 2e 72 69 64 0a 09 22 5d 20 7b ot = R.rid.."] {
7b30: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 .. lappend de
7b40: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 pendencies([list
7b50: 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c 69 73 rev $rid]) [lis
7b60: 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 63 t sym::branch $c
7b70: 68 69 6c 64 5d 0a 09 7d 0a 09 72 65 74 75 72 6e hild]..}..return
7b80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 . }.. # va
7b90: 72 28 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 r(dv) = dict (it
7ba0: 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d em -> list (item
7bb0: 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 )), item = list
7bc0: 20 28 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 (type id). t
7bd0: 79 70 65 6d 65 74 68 6f 64 20 70 72 65 64 65 63 ypemethod predec
7be0: 65 73 73 6f 72 73 20 7b 64 76 20 72 65 76 69 73 essors {dv revis
7bf0: 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 ions} {..upvar 1
7c00: 20 24 64 76 20 64 65 70 65 6e 64 65 6e 63 69 65 $dv dependencie
7c10: 73 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 s..set theset ('
7c20: 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 [join $revisions
7c30: 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 23 20 54 68 {','}]')...# Th
7c40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 73 65 e following case
7c50: 73 20 73 70 65 63 69 66 79 20 77 68 65 6e 20 61 s specify when a
7c60: 20 72 65 76 69 73 69 6f 6e 20 50 20 69 73 20 61 revision P is a
7c70: 0a 09 23 20 70 72 65 64 65 63 65 73 73 6f 72 20 ..# predecessor
7c80: 6f 66 20 61 20 72 65 76 69 73 69 6f 6e 20 52 2e of a revision R.
7c90: 20 45 61 63 68 20 6f 66 20 74 68 65 20 63 61 73 Each of the cas
7ca0: 65 73 20 74 72 61 6e 73 6c 61 74 65 73 0a 09 23 es translates..#
7cb0: 20 69 6e 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65 into one of the
7cc0: 20 62 72 61 6e 63 68 65 73 20 6f 66 20 74 68 65 branches of the
7cd0: 20 53 51 4c 20 55 4e 49 4f 4e 20 63 6f 6d 69 6e SQL UNION comin
7ce0: 67 20 62 65 6c 6f 77 2e 0a 09 23 0a 09 23 20 28 g below...#..# (
7cf0: 31 29 20 54 68 65 20 69 6d 6d 65 64 69 61 74 65 1) The immediate
7d00: 20 70 61 72 65 6e 74 20 52 2e 70 61 72 65 6e 74 parent R.parent
7d10: 20 6f 66 20 52 20 69 73 20 61 20 70 72 65 64 65 of R is a prede
7d20: 63 65 73 73 6f 72 20 6f 66 0a 09 23 20 20 20 20 cessor of..#
7d30: 20 52 2e 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 R. NOTE: This i
7d40: 73 20 74 72 75 65 20 66 6f 72 20 52 20 65 69 74 s true for R eit
7d50: 68 65 72 20 70 72 69 6d 61 72 79 20 6f 72 20 73 her primary or s
7d60: 65 63 6f 6e 64 61 72 79 0a 09 23 20 20 20 20 20 econdary..#
7d70: 63 68 69 6c 64 20 6f 66 20 50 2e 20 49 74 20 6e child of P. It n
7d80: 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 ot necessary to
7d90: 64 69 73 74 69 6e 67 75 69 73 68 20 74 68 65 20 distinguish the
7da0: 74 77 6f 0a 09 23 20 20 20 20 20 63 61 73 65 73 two..# cases
7db0: 2c 20 69 6e 20 63 6f 6e 74 72 61 73 74 20 74 6f , in contrast to
7dc0: 20 74 68 65 20 63 6f 64 65 20 72 65 74 72 69 65 the code retrie
7dd0: 76 69 6e 67 20 74 68 65 20 73 75 63 63 65 73 73 ving the success
7de0: 6f 72 0a 09 23 20 20 20 20 20 69 6e 66 6f 72 6d or..# inform
7df0: 61 74 69 6f 6e 2e 0a 09 23 0a 09 23 20 28 32 29 ation...#..# (2)
7e00: 20 54 68 65 20 63 6f 6d 70 6c 65 6d 65 6e 74 20 The complement
7e10: 6f 66 20 73 75 63 63 65 73 73 6f 72 20 63 61 73 of successor cas
7e20: 65 20 28 33 29 2e 20 54 68 65 20 74 72 75 6e 6b e (3). The trunk
7e30: 20 72 6f 6f 74 20 69 73 0a 09 23 20 20 20 20 20 root is..#
7e40: 61 20 70 72 65 64 65 63 65 73 73 6f 72 20 6f 66 a predecessor of
7e50: 20 61 20 4e 54 44 42 20 72 6f 6f 74 2e 20 52 45 a NTDB root. RE
7e60: 4d 4f 56 45 44 2e 20 53 65 65 20 27 73 75 63 63 MOVED. See 'succ
7e70: 65 73 73 6f 72 73 27 0a 09 23 20 20 20 20 20 66 essors'..# f
7e80: 6f 72 20 74 68 65 20 65 78 70 6c 61 6e 61 74 69 or the explanati
7e90: 6f 6e 2e 0a 09 23 0a 09 23 20 28 33 29 20 54 68 on...#..# (3) Th
7ea0: 65 20 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 e complement of
7eb0: 73 75 63 63 65 73 73 6f 72 20 63 61 73 65 20 28 successor case (
7ec0: 34 29 2e 20 54 68 65 20 6c 61 73 74 20 4e 54 44 4). The last NTD
7ed0: 42 0a 09 23 20 20 20 20 20 72 65 76 69 73 69 6f B..# revisio
7ee0: 6e 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 n belonging to t
7ef0: 68 65 20 74 72 75 6e 6b 20 69 73 20 61 20 70 72 he trunk is a pr
7f00: 65 64 65 63 65 73 73 6f 72 20 6f 66 20 74 68 65 edecessor of the
7f10: 0a 09 23 20 20 20 20 20 70 72 69 6d 61 72 79 20 ..# primary
7f20: 63 68 69 6c 64 20 6f 66 20 74 68 65 20 74 72 75 child of the tru
7f30: 6e 6b 20 72 6f 6f 74 20 28 54 68 65 20 27 31 2e nk root (The '1.
7f40: 32 27 20 72 65 76 69 73 69 6f 6e 29 2e 0a 0a 09 2' revision)....
7f50: 66 6f 72 65 61 63 68 20 7b 72 69 64 20 70 61 72 foreach {rid par
7f60: 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 ent} [state run
7f70: 22 0a 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d ". -- (1) Prim
7f80: 61 72 79 20 70 61 72 65 6e 74 2c 20 63 61 6e 20 ary parent, can
7f90: 62 65 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 be in different
7fa0: 4c 4f 44 20 66 6f 72 20 66 69 72 73 74 20 69 6e LOD for first in
7fb0: 20 61 20 62 72 61 6e 63 68 0a 09 20 20 20 20 53 a branch.. S
7fc0: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 70 ELECT R.rid, R.p
7fd0: 61 72 65 6e 74 0a 09 20 20 20 20 46 52 4f 4d 20 arent.. FROM
7fe0: 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 revision R..
7ff0: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 WHERE R.rid
8000: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 IN $theset
8010: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 -- Restrict to r
8020: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 evisions of inte
8030: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 rest.. AND
8040: 20 52 2e 70 61 72 65 6e 74 20 49 53 20 4e 4f 54 R.parent IS NOT
8050: 20 4e 55 4c 4c 20 20 20 2d 2d 20 48 61 73 20 70 NULL -- Has p
8060: 72 69 6d 61 72 79 20 70 61 72 65 6e 74 0a 20 20 rimary parent.
8070: 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 UNION. -- (
8080: 33 29 20 4c 61 73 74 20 4e 54 44 42 20 6f 6e 20 3) Last NTDB on
8090: 74 72 75 6e 6b 20 69 73 20 70 72 65 64 65 63 65 trunk is predece
80a0: 73 73 6f 72 20 6f 66 20 63 68 69 6c 64 20 6f 66 ssor of child of
80b0: 20 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 trunk root..
80c0: 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 SELECT R.rid, R
80d0: 41 2e 64 62 70 61 72 65 6e 74 0a 09 20 20 20 20 A.dbparent..
80e0: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 FROM revision
80f0: 52 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 0a 09 R, revision RA..
8100: 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 WHERE R.rid
8110: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 IN $theset
8120: 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 -- Restrict
8130: 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 to revisions of
8140: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e interest.. AN
8150: 44 20 20 20 20 4e 4f 54 20 52 2e 69 73 64 65 66 D NOT R.isdef
8160: 61 75 6c 74 20 20 20 20 20 20 20 20 20 20 2d 2d ault --
8170: 20 6e 6f 74 20 6f 6e 20 4e 54 44 42 0a 09 20 20 not on NTDB..
8180: 20 20 41 4e 44 20 20 20 20 52 2e 70 61 72 65 6e AND R.paren
8190: 74 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 t IS NOT NULL
81a0: 20 20 2d 2d 20 77 68 69 63 68 20 61 72 65 20 6e -- which are n
81b0: 6f 74 20 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44 ot root.. AND
81c0: 20 20 20 20 52 41 2e 72 69 64 20 3d 20 52 2e 70 RA.rid = R.p
81d0: 61 72 65 6e 74 20 20 20 20 20 20 20 20 2d 2d 20 arent --
81e0: 67 6f 20 74 6f 20 74 68 65 69 72 20 70 61 72 65 go to their pare
81f0: 6e 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 nt.. AND R
8200: 41 2e 64 62 70 61 72 65 6e 74 20 49 53 20 4e 4f A.dbparent IS NO
8210: 54 20 4e 55 4c 4c 20 20 2d 2d 20 77 68 69 63 68 T NULL -- which
8220: 20 68 61 73 20 74 6f 20 72 65 66 65 72 20 74 6f has to refer to
8230: 20 4e 54 44 42 27 73 20 72 6f 6f 74 0a 09 22 5d NTDB's root.."]
8240: 20 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 69 64 {.. # Consid
8250: 65 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 20 74 er moving this t
8260: 6f 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 o the integrity
8270: 6d 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 6e 74 module... int
8280: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24 egrity assert {$
8290: 72 69 64 20 21 3d 20 24 70 61 72 65 6e 74 7d 20 rid != $parent}
82a0: 7b 52 65 76 69 73 69 6f 6e 20 24 72 69 64 20 64 {Revision $rid d
82b0: 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 epends on itself
82c0: 2e 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 .}.. lappend
82d0: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 dependencies([li
82e0: 73 74 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c st rev $rid]) [l
82f0: 69 73 74 20 72 65 76 20 24 70 61 72 65 6e 74 5d ist rev $parent]
8300: 0a 09 7d 0a 0a 09 23 20 54 68 65 20 72 65 76 69 ..}...# The revi
8310: 73 69 6f 6e 73 20 77 68 69 63 68 20 61 72 65 20 sions which are
8320: 74 68 65 20 66 69 72 73 74 20 6f 6e 20 61 20 62 the first on a b
8330: 72 61 6e 63 68 20 68 61 76 65 20 74 68 61 74 0a ranch have that.
8340: 09 23 20 62 72 61 6e 63 68 20 61 73 20 74 68 65 .# branch as the
8350: 69 72 20 70 72 65 64 65 63 65 73 73 6f 72 2e 20 ir predecessor.
8360: 4e 6f 74 65 20 74 68 61 74 20 72 65 76 69 73 69 Note that revisi
8370: 6f 6e 73 20 63 61 6e 6e 6f 74 20 62 65 0a 09 23 ons cannot be..#
8380: 20 6f 6e 20 74 61 67 73 20 69 6e 20 74 68 65 20 on tags in the
8390: 73 61 6d 65 20 6d 61 6e 6e 65 72 2c 20 73 6f 20 same manner, so
83a0: 74 61 67 73 20 63 61 6e 6e 6f 74 20 62 65 20 70 tags cannot be p
83b0: 72 65 64 65 63 65 73 73 6f 72 73 0a 09 23 20 6f redecessors..# o
83c0: 66 20 72 65 76 69 73 69 6f 6e 73 2e 20 54 68 69 f revisions. Thi
83d0: 73 20 63 6f 6d 70 6c 65 6d 65 6e 74 73 20 74 68 s complements th
83e0: 61 74 20 74 68 65 79 20 68 61 76 65 20 6e 6f 20 at they have no
83f0: 73 75 63 63 65 73 73 6f 72 73 0a 09 23 20 28 53 successors..# (S
8400: 65 65 20 73 79 6d 3a 3a 74 61 67 2f 73 75 63 63 ee sym::tag/succ
8410: 65 73 73 6f 72 73 29 2e 0a 0a 09 66 6f 72 65 61 essors)....forea
8420: 63 68 20 7b 72 69 64 20 70 61 72 65 6e 74 7d 20 ch {rid parent}
8430: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 [state run "..
8440: 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 SELECT R.rid,
8450: 42 2e 62 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 B.bid.. FROM
8460: 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 62 72 revision R, br
8470: 61 6e 63 68 20 42 0a 09 20 20 20 20 57 48 45 52 anch B.. WHER
8480: 45 20 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 E R.rid IN $the
8490: 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 set.. AND
84a0: 42 2e 66 69 72 73 74 20 3d 20 52 2e 72 69 64 0a B.first = R.rid.
84b0: 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 ."] {.. lappe
84c0: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 nd dependencies(
84d0: 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64 5d 29 [list rev $rid])
84e0: 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e [list sym::bran
84f0: 63 68 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 ch $parent]..}..
8500: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 return. }..
8510: 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73 # result = lis
8520: 74 20 28 63 68 61 6e 67 65 73 65 74 2d 69 64 29 t (changeset-id)
8530: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 . typemethod
8540: 63 73 5f 73 75 63 63 65 73 73 6f 72 73 20 7b 72 cs_successors {r
8550: 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 20 20 20 20 evisions} {.
8560: 20 20 20 20 23 20 54 68 69 73 20 69 73 20 61 20 # This is a
8570: 76 61 72 69 61 6e 74 20 6f 66 20 27 73 75 63 63 variant of 'succ
8580: 65 73 73 6f 72 73 27 20 77 68 69 63 68 20 6d 61 essors' which ma
8590: 70 73 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c ps the low-level
85a0: 0a 20 20 20 20 20 20 20 20 23 20 64 61 74 61 20 . # data
85b0: 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 directly to the
85c0: 61 73 73 6f 63 69 61 74 65 64 20 63 68 61 6e 67 associated chang
85d0: 65 73 65 74 73 2e 20 49 2e 65 2e 20 69 6e 73 74 esets. I.e. inst
85e0: 65 61 64 0a 20 20 20 20 20 20 20 20 23 20 6d 69 ead. # mi
85f0: 6c 6c 69 6f 6e 73 20 6f 66 20 64 65 70 65 6e 64 llions of depend
8600: 65 6e 63 79 20 70 61 69 72 73 20 28 69 6e 20 65 ency pairs (in e
8610: 78 74 72 65 6d 65 20 63 61 73 65 73 20 28 45 78 xtreme cases (Ex
8620: 61 6d 70 6c 65 3a 20 54 63 6c 0a 20 20 20 20 20 ample: Tcl.
8630: 20 20 20 23 20 43 56 53 29 29 20 77 65 20 72 65 # CVS)) we re
8640: 74 75 72 6e 20 61 20 76 65 72 79 20 73 68 6f 72 turn a very shor
8650: 74 20 61 6e 64 20 6d 75 63 68 20 6d 6f 72 65 20 t and much more
8660: 6d 61 6e 61 67 65 61 62 6c 65 20 6c 69 73 74 0a manageable list.
8670: 20 20 20 20 20 20 20 20 23 20 6f 66 20 63 68 61 # of cha
8680: 6e 67 65 73 65 74 73 2e 0a 0a 09 73 65 74 20 74 ngesets....set t
8690: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 heset ('[join $r
86a0: 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 evisions {','}]'
86b0: 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61 74 65 )..return [state
86c0: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 run ".. SELE
86d0: 43 54 20 43 2e 63 69 64 0a 09 20 20 20 20 46 52 CT C.cid.. FR
86e0: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c OM revision R,
86f0: 20 63 73 69 74 65 6d 20 43 49 2c 20 63 68 61 6e csitem CI, chan
8700: 67 65 73 65 74 20 43 0a 09 20 20 20 20 57 48 45 geset C.. WHE
8710: 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 RE R.rid IN $
8720: 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65 theset -- Re
8730: 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 strict to revisi
8740: 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a ons of interest.
8750: 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 63 68 . AND R.ch
8760: 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 ild IS NOT NULL
8770: 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 -- Has primar
8780: 79 20 63 68 69 6c 64 0a 20 20 20 20 20 20 20 20 y child.
8790: 20 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69 AND CI.ii
87a0: 64 20 3d 20 52 2e 63 68 69 6c 64 0a 20 20 20 20 d = R.child.
87b0: 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 AND C
87c0: 2e 63 69 64 20 3d 20 43 49 2e 63 69 64 0a 20 20 .cid = CI.cid.
87d0: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 AND
87e0: 20 43 2e 74 79 70 65 20 3d 20 30 0a 20 20 20 20 C.type = 0.
87f0: 55 4e 49 4f 4e 0a 09 20 20 20 20 53 45 4c 45 43 UNION.. SELEC
8800: 54 20 43 2e 63 69 64 0a 09 20 20 20 20 46 52 4f T C.cid.. FRO
8810: 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 M revision R,
8820: 72 65 76 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 revisionbranchch
8830: 69 6c 64 72 65 6e 20 42 2c 20 63 73 69 74 65 6d ildren B, csitem
8840: 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43 CI, changeset C
8850: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 .. WHERE R.r
8860: 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 id IN $theset
8870: 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 -- Restrict
8880: 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 to revisions of
8890: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e interest.. AN
88a0: 44 20 20 20 20 52 2e 72 69 64 20 3d 20 42 2e 72 D R.rid = B.r
88b0: 69 64 20 20 20 20 20 20 20 20 20 20 2d 2d 20 53 id -- S
88c0: 65 6c 65 63 74 20 73 75 62 73 65 74 20 6f 66 20 elect subset of
88d0: 62 72 61 6e 63 68 20 63 68 69 6c 64 72 65 6e 0a branch children.
88e0: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 AND
88f0: 20 20 20 43 49 2e 69 69 64 20 3d 20 42 2e 62 72 CI.iid = B.br
8900: 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 id. A
8910: 4e 44 20 20 20 20 43 2e 63 69 64 20 3d 20 43 49 ND C.cid = CI
8920: 2e 63 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 .cid.
8930: 20 41 4e 44 20 20 20 20 43 2e 74 79 70 65 20 3d AND C.type =
8940: 20 30 0a 20 20 20 20 55 4e 49 4f 4e 0a 09 20 20 0. UNION..
8950: 20 20 53 45 4c 45 43 54 20 43 2e 63 69 64 0a 09 SELECT C.cid..
8960: 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 FROM revis
8970: 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 ion R, revision
8980: 52 41 2c 20 63 73 69 74 65 6d 20 43 49 2c 20 63 RA, csitem CI, c
8990: 68 61 6e 67 65 73 65 74 20 43 0a 09 20 20 20 20 hangeset C..
89a0: 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 WHERE R.rid I
89b0: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 20 2d N $theset -
89c0: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 - Restrict to re
89d0: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 visions of inter
89e0: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 est.. AND
89f0: 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20 20 R.isdefault
8a00: 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 -- Restr
8a10: 69 63 74 20 74 6f 20 4e 54 44 42 0a 09 20 20 20 ict to NTDB..
8a20: 20 41 4e 44 20 20 20 20 52 2e 64 62 63 68 69 6c AND R.dbchil
8a30: 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 d IS NOT NULL
8a40: 2d 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 42 -- and last NTDB
8a50: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72 belonging to tr
8a60: 75 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 20 unk.. AND
8a70: 52 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69 RA.rid = R.dbchi
8a80: 6c 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 ld -- Go di
8a90: 72 65 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 rectly to trunk
8aa0: 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 root.. AND
8ab0: 20 52 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 RA.child IS NOT
8ac0: 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 NULL -- Has
8ad0: 70 72 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 20 primary child..
8ae0: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 AND
8af0: 20 20 43 49 2e 69 69 64 20 3d 20 52 41 2e 63 68 CI.iid = RA.ch
8b00: 69 6c 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 ild.
8b10: 41 4e 44 20 20 20 20 43 2e 63 69 64 20 3d 20 43 AND C.cid = C
8b20: 49 2e 63 69 64 0a 20 20 20 20 20 20 20 20 20 20 I.cid.
8b30: 20 20 41 4e 44 20 20 20 20 43 2e 74 79 70 65 20 AND C.type
8b40: 3d 20 30 0a 20 20 20 20 55 4e 49 4f 4e 0a 09 20 = 0. UNION..
8b50: 20 20 20 53 45 4c 45 43 54 20 43 2e 63 69 64 0a SELECT C.cid.
8b60: 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 . FROM revi
8b70: 73 69 6f 6e 20 52 2c 20 74 61 67 20 54 2c 20 63 sion R, tag T, c
8b80: 73 69 74 65 6d 20 43 49 2c 20 63 68 61 6e 67 65 sitem CI, change
8b90: 73 65 74 20 43 0a 09 20 20 20 20 57 48 45 52 45 set C.. WHERE
8ba0: 20 20 52 2e 72 69 64 20 69 6e 20 24 74 68 65 73 R.rid in $thes
8bb0: 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 54 et.. AND T
8bc0: 2e 72 65 76 20 3d 20 52 2e 72 69 64 0a 20 20 20 .rev = R.rid.
8bd0: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 AND
8be0: 43 49 2e 69 69 64 20 3d 20 54 2e 74 69 64 0a 20 CI.iid = T.tid.
8bf0: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 AND
8c00: 20 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69 64 C.cid = CI.cid
8c10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 . AND
8c20: 20 20 20 20 43 2e 74 79 70 65 20 3d 20 31 0a 20 C.type = 1.
8c30: 20 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 53 45 UNION.. SE
8c40: 4c 45 43 54 20 43 2e 63 69 64 0a 09 20 20 20 20 LECT C.cid..
8c50: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 FROM revision
8c60: 52 2c 20 62 72 61 6e 63 68 20 42 2c 20 63 73 69 R, branch B, csi
8c70: 74 65 6d 20 43 49 2c 20 63 68 61 6e 67 65 73 65 tem CI, changese
8c80: 74 20 43 0a 09 20 20 20 20 57 48 45 52 45 20 20 t C.. WHERE
8c90: 52 2e 72 69 64 20 69 6e 20 24 74 68 65 73 65 74 R.rid in $theset
8ca0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 72 .. AND B.r
8cb0: 6f 6f 74 20 3d 20 52 2e 72 69 64 0a 20 20 20 20 oot = R.rid.
8cc0: 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 AND C
8cd0: 49 2e 69 69 64 20 3d 20 42 2e 62 69 64 0a 20 20 I.iid = B.bid.
8ce0: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 AND
8cf0: 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69 64 0a C.cid = CI.cid.
8d00: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 AND
8d10: 20 20 20 43 2e 74 79 70 65 20 3d 20 32 0a 09 22 C.type = 2.."
8d20: 5d 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 ]. }.}..# # #
8d30: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 # ### ##### ####
8d40: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 #### ###########
8d50: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 ## #############
8d60: 23 23 23 23 23 23 23 23 0a 23 23 20 48 65 6c 70 ########.## Help
8d70: 65 72 20 73 69 6e 67 6c 65 74 6f 6e 2e 20 43 6f er singleton. Co
8d80: 6d 6d 61 6e 64 73 20 66 6f 72 20 74 61 67 20 73 mmands for tag s
8d90: 79 6d 62 6f 6c 20 63 68 61 6e 67 65 73 65 74 73 ymbol changesets
8da0: 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20 3a 3a ...snit::type ::
8db0: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f vc::fossil::impo
8dc0: 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 rt::cvs::project
8dd0: 3a 3a 72 65 76 3a 3a 73 79 6d 3a 3a 74 61 67 20 ::rev::sym::tag
8de0: 7b 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 {. typemethod
8df0: 20 62 79 72 65 76 69 73 69 6f 6e 20 7b 7d 20 7b byrevision {} {
8e00: 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20 return 0 }.
8e10: 74 79 70 65 6d 65 74 68 6f 64 20 62 79 73 79 6d typemethod bysym
8e20: 62 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 bol {} { retur
8e30: 6e 20 31 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 n 1 }. typeme
8e40: 74 68 6f 64 20 69 73 74 61 67 20 20 20 20 20 20 thod istag
8e50: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a {} { return 1 }.
8e60: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 typemethod i
8e70: 73 62 72 61 6e 63 68 20 20 20 7b 7d 20 7b 20 72 sbranch {} { r
8e80: 65 74 75 72 6e 20 30 20 7d 0a 0a 20 20 20 20 74 eturn 0 }.. t
8e90: 79 70 65 6d 65 74 68 6f 64 20 73 74 72 20 7b 74 ypemethod str {t
8ea0: 61 67 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c ag} {..struct::l
8eb0: 69 73 74 20 61 73 73 69 67 6e 20 5b 73 74 61 74 ist assign [stat
8ec0: 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c e run {.. SEL
8ed0: 45 43 54 20 53 2e 6e 61 6d 65 2c 20 46 2e 6e 61 ECT S.name, F.na
8ee0: 6d 65 2c 20 50 2e 6e 61 6d 65 0a 09 20 20 20 20 me, P.name..
8ef0: 46 52 4f 4d 20 20 20 74 61 67 20 54 2c 20 73 79 FROM tag T, sy
8f00: 6d 62 6f 6c 20 53 2c 20 66 69 6c 65 20 46 2c 20 mbol S, file F,
8f10: 70 72 6f 6a 65 63 74 20 50 0a 09 20 20 20 20 57 project P.. W
8f20: 48 45 52 45 20 20 54 2e 74 69 64 20 3d 20 24 74 HERE T.tid = $t
8f30: 61 67 0a 09 20 20 20 20 41 4e 44 20 20 20 20 46 ag.. AND F
8f40: 2e 66 69 64 20 3d 20 54 2e 66 69 64 0a 09 20 20 .fid = T.fid..
8f50: 20 20 41 4e 44 20 20 20 20 50 2e 70 69 64 20 3d AND P.pid =
8f60: 20 46 2e 70 69 64 0a 09 20 20 20 20 41 4e 44 20 F.pid.. AND
8f70: 20 20 20 53 2e 73 69 64 20 3d 20 54 2e 73 69 64 S.sid = T.sid
8f80: 0a 09 7d 5d 20 73 6e 61 6d 65 20 66 6e 61 6d 65 ..}] sname fname
8f90: 20 70 6e 61 6d 65 0a 09 72 65 74 75 72 6e 20 22 pname..return "
8fa0: 24 70 6e 61 6d 65 2f 54 27 24 7b 73 6e 61 6d 65 $pname/T'${sname
8fb0: 7d 27 3a 3a 24 66 6e 61 6d 65 22 0a 20 20 20 20 }'::$fname".
8fc0: 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 }.. # result
8fd0: 3d 20 6c 69 73 74 20 28 6d 69 6e 74 69 6d 65 2c = list (mintime,
8fe0: 20 6d 61 78 74 69 6d 65 29 0a 20 20 20 20 74 79 maxtime). ty
8ff0: 70 65 6d 65 74 68 6f 64 20 74 69 6d 65 72 61 6e pemethod timeran
9000: 67 65 20 7b 74 61 67 73 7d 20 7b 0a 09 23 20 54 ge {tags} {..# T
9010: 68 65 20 72 61 6e 67 65 20 69 73 20 64 65 66 69 he range is defi
9020: 6e 65 64 20 61 73 20 74 68 65 20 72 61 6e 67 65 ned as the range
9030: 20 6f 66 20 74 68 65 20 72 65 76 69 73 69 6f 6e of the revision
9040: 73 20 74 68 65 20 74 61 67 73 0a 09 23 20 61 72 s the tags..# ar
9050: 65 20 61 74 74 61 63 68 65 64 20 74 6f 2e 0a 0a e attached to...
9060: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a .set theset ('[j
9070: 6f 69 6e 20 24 74 61 67 73 20 7b 27 2c 27 7d 5d oin $tags {','}]
9080: 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61 74 ')..return [stat
9090: 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c e run ".. SEL
90a0: 45 43 54 20 4d 49 4e 28 52 2e 64 61 74 65 29 2c ECT MIN(R.date),
90b0: 20 4d 41 58 28 52 2e 64 61 74 65 29 0a 09 20 20 MAX(R.date)..
90c0: 20 20 46 52 4f 4d 20 20 20 74 61 67 20 54 2c 20 FROM tag T,
90d0: 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 revision R..
90e0: 57 48 45 52 45 20 20 54 2e 74 69 64 20 49 4e 20 WHERE T.tid IN
90f0: 24 74 68 65 73 65 74 0a 20 20 20 20 20 20 20 20 $theset.
9100: 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72 69 64 AND R.rid
9110: 20 3d 20 54 2e 72 65 76 0a 09 22 5d 0a 20 20 20 = T.rev.."].
9120: 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76 }.. # var(dv
9130: 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d ) = dict (item -
9140: 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c 20 > list (item)),
9150: 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 79 item = list (ty
9160: 70 65 20 69 64 29 0a 20 20 20 20 74 79 70 65 6d pe id). typem
9170: 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f 72 73 ethod successors
9180: 20 7b 64 76 20 74 61 67 73 7d 20 7b 0a 09 23 20 {dv tags} {..#
9190: 54 61 67 73 20 68 61 76 65 20 6e 6f 20 73 75 63 Tags have no suc
91a0: 63 65 73 73 6f 72 73 2e 0a 09 72 65 74 75 72 6e cessors...return
91b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 . }.. # va
91c0: 72 28 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 r(dv) = dict (it
91d0: 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d em -> list (item
91e0: 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 )), item = list
91f0: 20 28 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 (type id). t
9200: 79 70 65 6d 65 74 68 6f 64 20 70 72 65 64 65 63 ypemethod predec
9210: 65 73 73 6f 72 73 20 7b 64 76 20 74 61 67 73 7d essors {dv tags}
9220: 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76 20 {..upvar 1 $dv
9230: 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 23 20 dependencies..#
9240: 54 68 65 20 70 72 65 64 65 63 65 73 73 6f 72 73 The predecessors
9250: 20 6f 66 20 61 20 74 61 67 20 61 72 65 20 61 6c of a tag are al
9260: 6c 20 74 68 65 20 72 65 76 69 73 69 6f 6e 73 20 l the revisions
9270: 74 68 65 20 74 61 67 73 20 61 72 65 0a 09 23 20 the tags are..#
9280: 61 74 74 61 63 68 65 64 20 74 6f 2c 20 61 73 20 attached to, as
9290: 77 65 6c 6c 20 61 73 20 61 6c 6c 20 74 68 65 20 well as all the
92a0: 62 72 61 6e 63 68 65 73 20 6f 72 20 74 61 67 73 branches or tags
92b0: 20 77 68 69 63 68 20 61 72 65 0a 09 23 20 74 68 which are..# th
92c0: 65 69 72 20 70 72 65 66 65 72 65 64 20 70 61 72 eir prefered par
92d0: 65 6e 74 73 2e 0a 0a 09 73 65 74 20 74 68 65 73 ents....set thes
92e0: 65 74 20 28 27 5b 6a 6f 69 6e 20 24 74 61 67 73 et ('[join $tags
92f0: 20 7b 27 2c 27 7d 5d 27 29 0a 09 66 6f 72 65 61 {','}]')..forea
9300: 63 68 20 7b 74 69 64 20 70 61 72 65 6e 74 7d 20 ch {tid parent}
9310: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 [state run "..
9320: 20 20 53 45 4c 45 43 54 20 54 2e 74 69 64 2c 20 SELECT T.tid,
9330: 52 2e 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 R.rid.. FROM
9340: 20 20 74 61 67 20 54 2c 20 72 65 76 69 73 69 6f tag T, revisio
9350: 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 n R.. WHERE
9360: 54 2e 74 69 64 20 49 4e 20 24 74 68 65 73 65 74 T.tid IN $theset
9370: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 54 2e 72 .. AND T.r
9380: 65 76 20 3d 20 52 2e 72 69 64 0a 09 22 5d 20 7b ev = R.rid.."] {
9390: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 .. lappend de
93a0: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 pendencies([list
93b0: 20 73 79 6d 3a 3a 74 61 67 20 24 74 69 64 5d 29 sym::tag $tid])
93c0: 20 5b 6c 69 73 74 20 72 65 76 20 24 70 61 72 65 [list rev $pare
93d0: 6e 74 5d 0a 09 7d 0a 0a 09 66 6f 72 65 61 63 68 nt]..}...foreach
93e0: 20 7b 74 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 {tid parent} [s
93f0: 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 tate run "..
9400: 53 45 4c 45 43 54 20 54 2e 74 69 64 2c 20 42 2e SELECT T.tid, B.
9410: 62 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 bid.. FROM
9420: 74 61 67 20 54 2c 20 70 72 65 66 65 72 65 64 70 tag T, preferedp
9430: 61 72 65 6e 74 20 50 2c 20 62 72 61 6e 63 68 20 arent P, branch
9440: 42 0a 09 20 20 20 20 57 48 45 52 45 20 20 54 2e B.. WHERE T.
9450: 74 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 tid IN $theset..
9460: 20 20 20 20 41 4e 44 20 20 20 20 54 2e 73 69 64 AND T.sid
9470: 20 3d 20 50 2e 73 69 64 0a 09 20 20 20 20 41 4e = P.sid.. AN
9480: 44 20 20 20 20 50 2e 70 69 64 20 3d 20 42 2e 73 D P.pid = B.s
9490: 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 id.."] {.. la
94a0: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 ppend dependenci
94b0: 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 es([list sym::ta
94c0: 67 20 24 74 69 64 5d 29 20 5b 6c 69 73 74 20 73 g $tid]) [list s
94d0: 79 6d 3a 3a 62 72 61 6e 63 68 20 24 70 61 72 65 ym::branch $pare
94e0: 6e 74 5d 0a 09 7d 0a 0a 09 66 6f 72 65 61 63 68 nt]..}...foreach
94f0: 20 7b 74 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 {tid parent} [s
9500: 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 tate run "..
9510: 53 45 4c 45 43 54 20 54 2e 74 69 64 2c 20 54 58 SELECT T.tid, TX
9520: 2e 74 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 .tid.. FROM
9530: 20 74 61 67 20 54 2c 20 70 72 65 66 65 72 65 64 tag T, prefered
9540: 70 61 72 65 6e 74 20 50 2c 20 74 61 67 20 54 58 parent P, tag TX
9550: 0a 09 20 20 20 20 57 48 45 52 45 20 20 54 2e 74 .. WHERE T.t
9560: 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 id IN $theset..
9570: 20 20 20 41 4e 44 20 20 20 20 54 2e 73 69 64 20 AND T.sid
9580: 3d 20 50 2e 73 69 64 0a 09 20 20 20 20 41 4e 44 = P.sid.. AND
9590: 20 20 20 20 50 2e 70 69 64 20 3d 20 54 58 2e 73 P.pid = TX.s
95a0: 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 id.."] {.. la
95b0: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 ppend dependenci
95c0: 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 es([list sym::ta
95d0: 67 20 24 74 69 64 5d 29 20 5b 6c 69 73 74 20 73 g $tid]) [list s
95e0: 79 6d 3a 3a 74 61 67 20 24 70 61 72 65 6e 74 5d ym::tag $parent]
95f0: 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 ..}..return.
9600: 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 }.. # result
9610: 3d 20 6c 69 73 74 20 28 63 68 61 6e 67 65 73 65 = list (changese
9620: 74 2d 69 64 29 0a 20 20 20 20 74 79 70 65 6d 65 t-id). typeme
9630: 74 68 6f 64 20 63 73 5f 73 75 63 63 65 73 73 6f thod cs_successo
9640: 72 73 20 7b 74 61 67 73 7d 20 7b 0a 09 23 20 54 rs {tags} {..# T
9650: 61 67 73 20 68 61 76 65 20 6e 6f 20 73 75 63 63 ags have no succ
9660: 65 73 73 6f 72 73 2e 0a 09 72 65 74 75 72 6e 0a essors...return.
9670: 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 }.}..# # ##
9680: 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 ### ##### ######
9690: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 ## #############
96a0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ###############
96b0: 23 23 23 23 23 23 0a 23 23 20 48 65 6c 70 65 72 ######.## Helper
96c0: 20 73 69 6e 67 6c 65 74 6f 6e 2e 20 43 6f 6d 6d singleton. Comm
96d0: 61 6e 64 73 20 66 6f 72 20 62 72 61 6e 63 68 20 ands for branch
96e0: 73 79 6d 62 6f 6c 20 63 68 61 6e 67 65 73 65 74 symbol changeset
96f0: 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20 3a s...snit::type :
9700: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 :vc::fossil::imp
9710: 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 ort::cvs::projec
9720: 74 3a 3a 72 65 76 3a 3a 73 79 6d 3a 3a 62 72 61 t::rev::sym::bra
9730: 6e 63 68 20 7b 0a 20 20 20 20 74 79 70 65 6d 65 nch {. typeme
9740: 74 68 6f 64 20 62 79 72 65 76 69 73 69 6f 6e 20 thod byrevision
9750: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a {} { return 0 }.
9760: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62 typemethod b
9770: 79 73 79 6d 62 6f 6c 20 20 20 7b 7d 20 7b 20 72 ysymbol {} { r
9780: 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 79 eturn 1 }. ty
9790: 70 65 6d 65 74 68 6f 64 20 69 73 74 61 67 20 20 pemethod istag
97a0: 20 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 {} { return
97b0: 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 0 }. typemeth
97c0: 6f 64 20 69 73 62 72 61 6e 63 68 20 20 20 7b 7d od isbranch {}
97d0: 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a 0a 20 { return 1 }..
97e0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 73 74 typemethod st
97f0: 72 20 7b 62 72 61 6e 63 68 7d 20 7b 0a 09 73 74 r {branch} {..st
9800: 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 ruct::list assig
9810: 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 n [state run {..
9820: 20 20 20 20 53 45 4c 45 43 54 20 53 2e 6e 61 6d SELECT S.nam
9830: 65 2c 20 46 2e 6e 61 6d 65 2c 20 50 2e 6e 61 6d e, F.name, P.nam
9840: 65 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 e.. FROM br
9850: 61 6e 63 68 20 42 2c 20 73 79 6d 62 6f 6c 20 53 anch B, symbol S
9860: 2c 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65 63 , file F, projec
9870: 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 20 20 t P.. WHERE
9880: 42 2e 62 69 64 20 3d 20 24 62 72 61 6e 63 68 0a B.bid = $branch.
9890: 09 20 20 20 20 41 4e 44 20 20 20 20 46 2e 66 69 . AND F.fi
98a0: 64 20 3d 20 42 2e 66 69 64 0a 09 20 20 20 20 41 d = B.fid.. A
98b0: 4e 44 20 20 20 20 50 2e 70 69 64 20 3d 20 46 2e ND P.pid = F.
98c0: 70 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 pid.. AND
98d0: 53 2e 73 69 64 20 3d 20 42 2e 73 69 64 0a 09 7d S.sid = B.sid..}
98e0: 5d 20 73 6e 61 6d 65 20 66 6e 61 6d 65 20 70 6e ] sname fname pn
98f0: 61 6d 65 0a 09 72 65 74 75 72 6e 20 22 24 70 6e ame..return "$pn
9900: 61 6d 65 2f 42 27 24 7b 73 6e 61 6d 65 7d 27 3a ame/B'${sname}':
9910: 3a 24 66 6e 61 6d 65 22 0a 20 20 20 20 7d 0a 0a :$fname". }..
9920: 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c # result = l
9930: 69 73 74 20 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 ist (mintime, ma
9940: 78 74 69 6d 65 29 0a 20 20 20 20 74 79 70 65 6d xtime). typem
9950: 65 74 68 6f 64 20 74 69 6d 65 72 61 6e 67 65 20 ethod timerange
9960: 7b 62 72 61 6e 63 68 65 73 7d 20 7b 0a 09 23 20 {branches} {..#
9970: 54 68 65 20 72 61 6e 67 65 20 6f 66 20 61 20 62 The range of a b
9980: 72 61 6e 63 68 20 69 73 20 64 65 66 69 6e 65 64 ranch is defined
9990: 20 61 73 20 74 68 65 20 72 61 6e 67 65 20 6f 66 as the range of
99a0: 20 74 68 65 0a 09 23 20 72 65 76 69 73 69 6f 6e the..# revision
99b0: 73 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 61 s the branches a
99c0: 72 65 20 73 70 61 77 6e 65 64 20 62 79 2e 20 4e re spawned by. N
99d0: 4f 54 45 20 68 6f 77 65 76 65 72 20 74 68 61 74 OTE however that
99e0: 20 74 68 65 0a 09 23 20 62 72 61 6e 63 68 65 73 the..# branches
99f0: 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 associated with
9a00: 20 61 20 64 65 74 61 63 68 65 64 20 4e 54 44 42 a detached NTDB
9a10: 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 72 6f will have no ro
9a20: 6f 74 0a 09 23 20 73 70 61 77 6e 69 6e 67 20 74 ot..# spawning t
9a30: 68 65 6d 2c 20 68 65 6e 63 65 20 74 68 65 79 20 hem, hence they
9a40: 68 61 76 65 20 6e 6f 20 72 65 61 6c 20 74 69 6d have no real tim
9a50: 65 72 61 6e 67 65 20 61 6e 79 0a 09 23 20 6c 6f erange any..# lo
9a60: 6e 67 65 72 2e 20 42 79 20 75 73 69 6e 67 20 30 nger. By using 0
9a70: 20 77 65 20 70 75 74 20 74 68 65 6d 20 69 6e 20 we put them in
9a80: 66 72 6f 6e 74 20 6f 66 20 65 76 65 72 79 74 68 front of everyth
9a90: 69 6e 67 20 65 6c 73 65 2c 0a 09 23 20 61 73 20 ing else,..# as
9aa0: 74 68 65 79 20 6c 6f 67 69 63 61 6c 6c 79 20 61 they logically a
9ab0: 72 65 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74 re....set theset
9ac0: 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61 6e 63 68 ('[join $branch
9ad0: 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 es {','}]')..ret
9ae0: 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 22 urn [state run "
9af0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 49 46 4e .. SELECT IFN
9b00: 55 4c 4c 28 4d 49 4e 28 52 2e 64 61 74 65 29 2c ULL(MIN(R.date),
9b10: 30 29 2c 20 49 46 4e 55 4c 4c 28 4d 41 58 28 52 0), IFNULL(MAX(R
9b20: 2e 64 61 74 65 29 2c 30 29 0a 09 20 20 20 20 46 .date),0).. F
9b30: 52 4f 4d 20 20 62 72 61 6e 63 68 20 42 2c 20 72 ROM branch B, r
9b40: 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 evision R.. W
9b50: 48 45 52 45 20 42 2e 62 69 64 20 49 4e 20 24 74 HERE B.bid IN $t
9b60: 68 65 73 65 74 0a 20 20 20 20 20 20 20 20 20 20 heset.
9b70: 20 20 41 4e 44 20 20 20 52 2e 72 69 64 20 3d 20 AND R.rid =
9b80: 42 2e 72 6f 6f 74 0a 09 22 5d 0a 20 20 20 20 7d B.root.."]. }
9b90: 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76 29 20 .. # var(dv)
9ba0: 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 = dict (item ->
9bb0: 6c 69 73 74 20 28 69 74 65 6d 29 29 2c 20 69 74 list (item)), it
9bc0: 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 79 70 65 em = list (type
9bd0: 20 69 64 29 0a 20 20 20 20 74 79 70 65 6d 65 74 id). typemet
9be0: 68 6f 64 20 73 75 63 63 65 73 73 6f 72 73 20 7b hod successors {
9bf0: 64 76 20 62 72 61 6e 63 68 65 73 7d 20 7b 0a 09 dv branches} {..
9c00: 75 70 76 61 72 20 31 20 24 64 76 20 64 65 70 65 upvar 1 $dv depe
9c10: 6e 64 65 6e 63 69 65 73 0a 09 23 20 54 68 65 20 ndencies..# The
9c20: 66 69 72 73 74 20 72 65 76 69 73 69 6f 6e 20 63 first revision c
9c30: 6f 6d 6d 69 74 74 65 64 20 6f 6e 20 61 20 62 72 ommitted on a br
9c40: 61 6e 63 68 2c 20 61 6e 64 20 61 6c 6c 20 62 72 anch, and all br
9c50: 61 6e 63 68 65 73 0a 09 23 20 61 6e 64 20 74 61 anches..# and ta
9c60: 67 73 20 77 68 69 63 68 20 68 61 76 65 20 69 74 gs which have it
9c70: 20 61 73 20 74 68 65 69 72 20 70 72 65 66 65 72 as their prefer
9c80: 65 64 20 70 61 72 65 6e 74 20 61 72 65 20 74 68 ed parent are th
9c90: 65 0a 09 23 20 73 75 63 63 65 73 73 6f 72 73 20 e..# successors
9ca0: 6f 66 20 61 20 62 72 61 6e 63 68 2e 0a 0a 09 73 of a branch....s
9cb0: 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 et theset ('[joi
9cc0: 6e 20 24 62 72 61 6e 63 68 65 73 20 7b 27 2c 27 n $branches {','
9cd0: 7d 5d 27 29 0a 09 66 6f 72 65 61 63 68 20 7b 62 }]')..foreach {b
9ce0: 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 id child} [state
9cf0: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 run ".. SELE
9d00: 43 54 20 42 2e 62 69 64 2c 20 52 2e 72 69 64 0a CT B.bid, R.rid.
9d10: 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e . FROM bran
9d20: 63 68 20 42 2c 20 72 65 76 69 73 69 6f 6e 20 52 ch B, revision R
9d30: 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 .. WHERE B.b
9d40: 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 id IN $theset..
9d50: 20 20 20 41 4e 44 20 20 20 20 42 2e 66 69 72 73 AND B.firs
9d60: 74 20 3d 20 52 2e 72 69 64 0a 09 22 5d 20 7b 0a t = R.rid.."] {.
9d70: 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 . lappend dep
9d80: 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 endencies([list
9d90: 73 79 6d 3a 3a 74 61 67 20 24 62 69 64 5d 29 20 sym::tag $bid])
9da0: 5b 6c 69 73 74 20 72 65 76 20 24 63 68 69 6c 64 [list rev $child
9db0: 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62 ]..}..foreach {b
9dc0: 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 id child} [state
9dd0: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 run ".. SELE
9de0: 43 54 20 42 2e 62 69 64 2c 20 42 58 2e 62 69 64 CT B.bid, BX.bid
9df0: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 .. FROM bra
9e00: 6e 63 68 20 42 2c 20 70 72 65 66 65 72 65 64 70 nch B, preferedp
9e10: 61 72 65 6e 74 20 50 2c 20 62 72 61 6e 63 68 20 arent P, branch
9e20: 42 58 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 BX.. WHERE B
9e30: 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a .bid IN $theset.
9e40: 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 73 69 . AND B.si
9e50: 64 20 3d 20 50 2e 70 69 64 0a 09 20 20 20 20 41 d = P.pid.. A
9e60: 4e 44 20 20 20 20 42 58 2e 73 69 64 20 3d 20 50 ND BX.sid = P
9e70: 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 .sid.."] {..
9e80: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e lappend dependen
9e90: 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a cies([list sym::
9ea0: 74 61 67 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 tag $bid]) [list
9eb0: 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 63 68 sym::branch $ch
9ec0: 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 ild]..}..foreach
9ed0: 20 7b 62 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 {bid child} [st
9ee0: 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 ate run ".. S
9ef0: 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 54 2e 74 ELECT B.bid, T.t
9f00: 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 id.. FROM b
9f10: 72 61 6e 63 68 20 42 2c 20 70 72 65 66 65 72 65 ranch B, prefere
9f20: 64 70 61 72 65 6e 74 20 50 2c 20 74 61 67 20 54 dparent P, tag T
9f30: 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 .. WHERE B.b
9f40: 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 id IN $theset..
9f50: 20 20 20 41 4e 44 20 20 20 20 42 2e 73 69 64 20 AND B.sid
9f60: 3d 20 50 2e 70 69 64 0a 09 20 20 20 20 41 4e 44 = P.pid.. AND
9f70: 20 20 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 69 T.sid = P.si
9f80: 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 d.."] {.. lap
9f90: 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 pend dependencie
9fa0: 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 s([list sym::tag
9fb0: 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 $bid]) [list sy
9fc0: 6d 3a 3a 74 61 67 20 24 63 68 69 6c 64 5d 0a 09 m::tag $child]..
9fd0: 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a }..return. }.
9fe0: 0a 20 20 20 20 23 20 76 61 72 28 64 76 29 20 3d . # var(dv) =
9ff0: 20 64 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c dict (item -> l
a000: 69 73 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65 ist (item)), ite
a010: 6d 20 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20 m = list (type
a020: 69 64 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 id). typemeth
a030: 6f 64 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 od predecessors
a040: 7b 64 76 20 62 72 61 6e 63 68 65 73 7d 20 7b 0a {dv branches} {.
a050: 09 75 70 76 61 72 20 31 20 24 64 76 20 64 65 70 .upvar 1 $dv dep
a060: 65 6e 64 65 6e 63 69 65 73 0a 09 23 20 54 68 65 endencies..# The
a070: 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 6f 66 predecessors of
a080: 20 61 20 62 72 61 6e 63 68 20 61 72 65 20 61 6c a branch are al
a090: 6c 20 74 68 65 20 72 65 76 69 73 69 6f 6e 73 20 l the revisions
a0a0: 74 68 65 0a 09 23 20 62 72 61 6e 63 68 65 73 20 the..# branches
a0b0: 61 72 65 20 73 70 61 77 6e 65 64 20 66 72 6f 6d are spawned from
a0c0: 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 61 6c 6c , as well as all
a0d0: 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 6f 72 the branches or
a0e0: 0a 09 23 20 74 61 67 73 20 77 68 69 63 68 20 61 ..# tags which a
a0f0: 72 65 20 74 68 65 69 72 20 70 72 65 66 65 72 65 re their prefere
a100: 64 20 70 61 72 65 6e 74 73 2e 0a 0a 09 73 65 74 d parents....set
a110: 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 theset ('[join
a120: 24 74 61 67 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 $tags {','}]')..
a130: 66 6f 72 65 61 63 68 20 7b 62 69 64 20 70 61 72 foreach {bid par
a140: 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 ent} [state run
a150: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e ".. SELECT B.
a160: 42 69 64 2c 20 52 2e 72 69 64 0a 09 20 20 20 20 Bid, R.rid..
a170: 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c FROM branch B,
a180: 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 revision R..
a190: 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e WHERE B.bid IN
a1a0: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e $theset.. AN
a1b0: 44 20 20 20 20 42 2e 72 6f 6f 74 20 3d 20 52 2e D B.root = R.
a1c0: 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c rid.."] {.. l
a1d0: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 append dependenc
a1e0: 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 ies([list sym::b
a1f0: 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c 69 ranch $bid]) [li
a200: 73 74 20 72 65 76 20 24 70 61 72 65 6e 74 5d 0a st rev $parent].
a210: 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64 .}..foreach {bid
a220: 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 parent} [state
a230: 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 run ".. SELEC
a240: 54 20 42 2e 62 69 64 2c 20 42 58 2e 62 69 64 0a T B.bid, BX.bid.
a250: 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e . FROM bran
a260: 63 68 20 42 2c 20 70 72 65 66 65 72 65 64 70 61 ch B, preferedpa
a270: 72 65 6e 74 20 50 2c 20 62 72 61 6e 63 68 20 42 rent P, branch B
a280: 58 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e X.. WHERE B.
a290: 62 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 bid IN $theset..
a2a0: 20 20 20 20 41 4e 44 20 20 20 20 42 2e 73 69 64 AND B.sid
a2b0: 20 3d 20 50 2e 73 69 64 0a 09 20 20 20 20 41 4e = P.sid.. AN
a2c0: 44 20 20 20 20 50 2e 70 69 64 20 3d 20 42 58 2e D P.pid = BX.
a2d0: 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c sid.."] {.. l
a2e0: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 append dependenc
a2f0: 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 ies([list sym::b
a300: 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c 69 ranch $bid]) [li
a310: 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 st sym::branch $
a320: 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 66 6f 72 65 parent]..}..fore
a330: 61 63 68 20 7b 62 69 64 20 70 61 72 65 6e 74 7d ach {bid parent}
a340: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 [state run "..
a350: 20 20 20 53 45 4c 45 43 54 20 42 2e 62 69 64 2c SELECT B.bid,
a360: 20 54 2e 74 69 64 0a 09 20 20 20 20 46 52 4f 4d T.tid.. FROM
a370: 20 20 20 62 72 61 6e 63 68 20 42 2c 20 70 72 65 branch B, pre
a380: 66 65 72 65 64 70 61 72 65 6e 74 20 50 2c 20 74 feredparent P, t
a390: 61 67 20 54 0a 09 20 20 20 20 57 48 45 52 45 20 ag T.. WHERE
a3a0: 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65 B.bid IN $these
a3b0: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e t.. AND B.
a3c0: 73 69 64 20 3d 20 50 2e 73 69 64 0a 09 20 20 20 sid = P.sid..
a3d0: 20 41 4e 44 20 20 20 20 50 2e 70 69 64 20 3d 20 AND P.pid =
a3e0: 54 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 T.sid.."] {..
a3f0: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 lappend depende
a400: 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a ncies([list sym:
a410: 3a 62 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b :branch $bid]) [
a420: 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 70 list sym::tag $p
a430: 61 72 65 6e 74 5d 0a 09 7d 0a 09 72 65 74 75 72 arent]..}..retur
a440: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 n. }.. # r
a450: 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 63 68 esult = list (ch
a460: 61 6e 67 65 73 65 74 2d 69 64 29 0a 20 20 20 20 angeset-id).
a470: 74 79 70 65 6d 65 74 68 6f 64 20 63 73 5f 73 75 typemethod cs_su
a480: 63 63 65 73 73 6f 72 73 20 7b 62 72 61 6e 63 68 ccessors {branch
a490: 65 73 7d 20 7b 0a 20 20 20 20 20 20 20 20 23 20 es} {. #
a4a0: 54 68 69 73 20 69 73 20 61 20 76 61 72 69 61 6e This is a varian
a4b0: 74 20 6f 66 20 27 73 75 63 63 65 73 73 6f 72 73 t of 'successors
a4c0: 27 20 77 68 69 63 68 20 6d 61 70 73 20 74 68 65 ' which maps the
a4d0: 20 6c 6f 77 2d 6c 65 76 65 6c 0a 20 20 20 20 20 low-level.
a4e0: 20 20 20 23 20 64 61 74 61 20 64 69 72 65 63 74 # data direct
a4f0: 6c 79 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 ly to the associ
a500: 61 74 65 64 20 63 68 61 6e 67 65 73 65 74 73 2e ated changesets.
a510: 20 49 2e 65 2e 20 69 6e 73 74 65 61 64 0a 20 20 I.e. instead.
a520: 20 20 20 20 20 20 23 20 6d 69 6c 6c 69 6f 6e 73 # millions
a530: 20 6f 66 20 64 65 70 65 6e 64 65 6e 63 79 20 70 of dependency p
a540: 61 69 72 73 20 28 69 6e 20 65 78 74 72 65 6d 65 airs (in extreme
a550: 20 63 61 73 65 73 20 28 45 78 61 6d 70 6c 65 3a cases (Example:
a560: 20 54 63 6c 0a 20 20 20 20 20 20 20 20 23 20 43 Tcl. # C
a570: 56 53 29 29 20 77 65 20 72 65 74 75 72 6e 20 61 VS)) we return a
a580: 20 76 65 72 79 20 73 68 6f 72 74 20 61 6e 64 20 very short and
a590: 6d 75 63 68 20 6d 6f 72 65 20 6d 61 6e 61 67 65 much more manage
a5a0: 61 62 6c 65 20 6c 69 73 74 0a 20 20 20 20 20 20 able list.
a5b0: 20 20 23 20 6f 66 20 63 68 61 6e 67 65 73 65 74 # of changeset
a5c0: 73 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20 s....set theset
a5d0: 28 27 5b 6a 6f 69 6e 20 24 62 72 61 6e 63 68 65 ('[join $branche
a5e0: 73 20 7b 27 2c 27 7d 5d 27 29 0a 20 20 20 20 20 s {','}]').
a5f0: 20 20 20 72 65 74 75 72 6e 20 5b 73 74 61 74 65 return [state
a600: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 run ".. SELE
a610: 43 54 20 43 2e 63 69 64 0a 09 20 20 20 20 46 52 CT C.cid.. FR
a620: 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20 72 OM branch B, r
a630: 65 76 69 73 69 6f 6e 20 52 2c 20 63 73 69 74 65 evision R, csite
a640: 6d 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20 m CI, changeset
a650: 43 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e C.. WHERE B.
a660: 62 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 bid IN $theset..
a670: 20 20 20 20 41 4e 44 20 20 20 20 42 2e 66 69 72 AND B.fir
a680: 73 74 20 3d 20 52 2e 72 69 64 0a 20 20 20 20 20 st = R.rid.
a690: 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 49 AND CI
a6a0: 2e 69 69 64 20 3d 20 52 2e 72 69 64 0a 20 20 20 .iid = R.rid.
a6b0: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 AND
a6c0: 43 2e 63 69 64 20 3d 20 43 49 2e 63 69 64 0a 20 C.cid = CI.cid.
a6d0: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 AND
a6e0: 20 20 43 2e 74 79 70 65 20 3d 20 30 0a 20 20 20 C.type = 0.
a6f0: 20 55 4e 49 4f 4e 0a 09 20 20 20 20 53 45 4c 45 UNION.. SELE
a700: 43 54 20 43 2e 63 69 64 0a 09 20 20 20 20 46 52 CT C.cid.. FR
a710: 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20 70 OM branch B, p
a720: 72 65 66 65 72 65 64 70 61 72 65 6e 74 20 50 2c referedparent P,
a730: 20 62 72 61 6e 63 68 20 42 58 2c 20 63 73 69 74 branch BX, csit
a740: 65 6d 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74 em CI, changeset
a750: 20 43 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 C.. WHERE B
a760: 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a .bid IN $theset.
a770: 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 73 69 . AND B.si
a780: 64 20 3d 20 50 2e 70 69 64 0a 09 20 20 20 20 41 d = P.pid.. A
a790: 4e 44 20 20 20 20 42 58 2e 73 69 64 20 3d 20 50 ND BX.sid = P
a7a0: 2e 73 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 .sid.
a7b0: 20 41 4e 44 20 20 20 20 43 49 2e 69 69 64 20 3d AND CI.iid =
a7c0: 20 42 58 2e 62 69 64 0a 20 20 20 20 20 20 20 20 BX.bid.
a7d0: 20 20 20 20 41 4e 44 20 20 20 20 43 2e 63 69 64 AND C.cid
a7e0: 20 3d 20 43 49 2e 63 69 64 0a 20 20 20 20 20 20 = CI.cid.
a7f0: 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e 74 AND C.t
a800: 79 70 65 20 3d 20 32 0a 20 20 20 20 55 4e 49 4f ype = 2. UNIO
a810: 4e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 43 2e N.. SELECT C.
a820: 63 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 cid.. FROM
a830: 62 72 61 6e 63 68 20 42 2c 20 70 72 65 66 65 72 branch B, prefer
a840: 65 64 70 61 72 65 6e 74 20 50 2c 20 74 61 67 20 edparent P, tag
a850: 54 2c 20 63 73 69 74 65 6d 20 43 49 2c 20 63 68 T, csitem CI, ch
a860: 61 6e 67 65 73 65 74 20 43 0a 09 20 20 20 20 57 angeset C.. W
a870: 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24 HERE B.bid IN $
a880: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 theset.. AND
a890: 20 20 20 42 2e 73 69 64 20 3d 20 50 2e 70 69 64 B.sid = P.pid
a8a0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 54 2e 73 .. AND T.s
a8b0: 69 64 20 3d 20 50 2e 73 69 64 0a 20 20 20 20 20 id = P.sid.
a8c0: 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 49 AND CI
a8d0: 2e 69 69 64 20 3d 20 54 2e 74 69 64 0a 20 20 20 .iid = T.tid.
a8e0: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 AND
a8f0: 43 2e 63 69 64 20 3d 20 43 49 2e 63 69 64 0a 20 C.cid = CI.cid.
a900: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 AND
a910: 20 20 43 2e 74 79 70 65 20 3d 20 31 0a 09 22 5d C.type = 1.."]
a920: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a ..return. }..
a930: 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23 # # ## ### #
a940: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 #### ######## ##
a950: 23 23 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 ###########.
a960: 23 23 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e ## Configuration
a970: 0a 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 .. pragma -ha
a980: 73 69 6e 73 74 61 6e 63 65 73 20 20 20 6e 6f 20 sinstances no
a990: 3b 20 23 20 73 69 6e 67 6c 65 74 6f 6e 0a 20 20 ; # singleton.
a9a0: 20 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79 70 pragma -hastyp
a9b0: 65 69 6e 66 6f 20 20 20 20 6e 6f 20 3b 20 23 20 einfo no ; #
a9c0: 6e 6f 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e no introspection
a9d0: 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 . pragma -has
a9e0: 74 79 70 65 64 65 73 74 72 6f 79 20 6e 6f 20 3b typedestroy no ;
a9f0: 20 23 20 69 6d 6d 6f 72 74 61 6c 0a 7d 0a 0a 23 # immortal.}..#
aa00: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 # ## ### #####
aa10: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
aa20: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 ###### #########
aa30: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 0a ############.##.
aa40: 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 .namespace eval
aa50: 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d ::vc::fossil::im
aa60: 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 port::cvs::proje
aa70: 63 74 20 7b 0a 20 20 20 20 6e 61 6d 65 73 70 61 ct {. namespa
aa80: 63 65 20 65 78 70 6f 72 74 20 72 65 76 0a 20 20 ce export rev.
aa90: 20 20 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c namespace eval
aaa0: 20 72 65 76 20 7b 0a 09 6e 61 6d 65 73 70 61 63 rev {..namespac
aab0: 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 e import ::vc::f
aac0: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 ossil::import::c
aad0: 76 73 3a 3a 73 74 61 74 65 0a 09 6e 61 6d 65 73 vs::state..names
aae0: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 pace import ::vc
aaf0: 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 ::fossil::import
ab00: 3a 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 ::cvs::integrity
ab10: 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f ..namespace impo
ab20: 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a rt ::vc::tools::
ab30: 6d 69 73 63 3a 3a 2a 0a 09 6e 61 6d 65 73 70 61 misc::*..namespa
ab40: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a ce import ::vc::
ab50: 74 6f 6f 6c 73 3a 3a 74 72 6f 75 62 6c 65 0a 09 tools::trouble..
ab60: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 namespace import
ab70: 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f ::vc::tools::lo
ab80: 67 0a 09 6c 6f 67 20 72 65 67 69 73 74 65 72 20 g..log register
ab90: 63 73 65 74 73 0a 0a 09 23 20 53 65 74 20 75 70 csets...# Set up
aba0: 20 74 68 65 20 68 65 6c 70 65 72 20 73 69 6e 67 the helper sing
abb0: 6c 65 74 6f 6e 73 0a 09 6e 61 6d 65 73 70 61 63 letons..namespac
abc0: 65 20 65 76 61 6c 20 72 65 76 20 7b 0a 09 20 20 e eval rev {..
abd0: 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f namespace impo
abe0: 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a rt ::vc::fossil:
abf0: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 :import::cvs::st
ac00: 61 74 65 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 ate.. namespa
ac10: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a ce import ::vc::
ac20: 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a fossil::import::
ac30: 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 cvs::integrity..
ac40: 7d 0a 09 6e 61 6d 65 73 70 61 63 65 20 65 76 61 }..namespace eva
ac50: 6c 20 73 79 6d 3a 3a 74 61 67 20 7b 0a 09 20 20 l sym::tag {..
ac60: 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f namespace impo
ac70: 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a rt ::vc::fossil:
ac80: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 :import::cvs::st
ac90: 61 74 65 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 ate.. namespa
aca0: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a ce import ::vc::
acb0: 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a fossil::import::
acc0: 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 cvs::integrity..
acd0: 7d 0a 09 6e 61 6d 65 73 70 61 63 65 20 65 76 61 }..namespace eva
ace0: 6c 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 7b 0a l sym::branch {.
acf0: 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 . namespace i
ad00: 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 mport ::vc::foss
ad10: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a il::import::cvs:
ad20: 3a 73 74 61 74 65 0a 09 20 20 20 20 6e 61 6d 65 :state.. name
ad30: 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 space import ::v
ad40: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 c::fossil::impor
ad50: 74 3a 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 t::cvs::integrit
ad60: 79 0a 09 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 y..}. }.}..#
ad70: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 # ## ### ##### #
ad80: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 ####### ########
ad90: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 ##### ##########
ada0: 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 52 ###########.## R
adb0: 65 61 64 79 0a 0a 70 61 63 6b 61 67 65 20 70 72 eady..package pr
adc0: 6f 76 69 64 65 20 76 63 3a 3a 66 6f 73 73 69 6c ovide vc::fossil
add0: 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 ::import::cvs::p
ade0: 72 6f 6a 65 63 74 3a 3a 72 65 76 20 31 2e 30 0a roject::rev 1.0.
adf0: 72 65 74 75 72 6e 0a return.