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 64 69 63 74 20 28 69 74 65 6d ult = dict (item
0bb0: 20 2d 3e 20 6c 69 73 74 20 28 63 68 61 6e 67 65 -> list (change
0bc0: 73 65 74 29 29 0a 20 20 20 20 6d 65 74 68 6f 64 set)). method
0bd0: 20 73 75 63 63 65 73 73 6f 72 6d 61 70 20 7b 7d successormap {}
0be0: 20 7b 0a 09 23 20 4e 4f 54 45 20 2f 20 46 55 54 {..# NOTE / FUT
0bf0: 55 52 45 3a 20 50 6f 73 73 69 62 6c 65 20 62 6f URE: Possible bo
0c00: 74 74 6c 65 6e 65 63 6b 2e 0a 09 61 72 72 61 79 ttleneck...array
0c10: 20 73 65 74 20 74 6d 70 20 7b 7d 0a 09 66 6f 72 set tmp {}..for
0c20: 65 61 63 68 20 7b 72 65 76 20 63 68 69 6c 64 72 each {rev childr
0c30: 65 6e 7d 20 5b 24 73 65 6c 66 20 6e 65 78 74 6d en} [$self nextm
0c40: 61 70 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 ap] {.. forea
0c50: 63 68 20 63 68 69 6c 64 20 24 63 68 69 6c 64 72 ch child $childr
0c60: 65 6e 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 74 en {...lappend t
0c70: 6d 70 28 24 72 65 76 29 20 24 6d 79 69 74 65 6d mp($rev) $myitem
0c80: 6d 61 70 28 24 63 68 69 6c 64 29 0a 09 20 20 20 map($child)..
0c90: 20 7d 0a 09 20 20 20 20 73 65 74 20 74 6d 70 28 }.. set tmp(
0ca0: 24 72 65 76 29 20 5b 6c 73 6f 72 74 20 2d 75 6e $rev) [lsort -un
0cb0: 69 71 75 65 20 24 74 6d 70 28 24 72 65 76 29 5d ique $tmp($rev)]
0cc0: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b 61 72 72 ..}..return [arr
0cd0: 61 79 20 67 65 74 20 74 6d 70 5d 0a 20 20 20 20 ay get tmp].
0ce0: 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 }.. # result
0cf0: 3d 20 6c 69 73 74 20 28 63 68 61 6e 67 65 73 65 = list (changese
0d00: 74 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 75 t). method su
0d10: 63 63 65 73 73 6f 72 73 20 7b 7d 20 7b 0a 09 23 ccessors {} {..#
0d20: 20 4e 4f 54 45 20 2f 20 46 55 54 55 52 45 3a 20 NOTE / FUTURE:
0d30: 50 6f 73 73 69 62 6c 65 20 62 6f 74 74 6c 65 6e Possible bottlen
0d40: 65 63 6b 2e 0a 09 73 65 74 20 63 73 65 74 73 20 eck...set csets
0d50: 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 5f 20 63 {}..foreach {_ c
0d60: 68 69 6c 64 72 65 6e 7d 20 5b 24 73 65 6c 66 20 hildren} [$self
0d70: 6e 65 78 74 6d 61 70 5d 20 7b 0a 09 20 20 20 20 nextmap] {..
0d80: 66 6f 72 65 61 63 68 20 63 68 69 6c 64 20 24 63 foreach child $c
0d90: 68 69 6c 64 72 65 6e 20 7b 0a 09 09 6c 61 70 70 hildren {...lapp
0da0: 65 6e 64 20 63 73 65 74 73 20 24 6d 79 69 74 65 end csets $myite
0db0: 6d 6d 61 70 28 24 63 68 69 6c 64 29 0a 09 20 20 mmap($child)..
0dc0: 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b }..}..return [
0dd0: 6c 73 6f 72 74 20 2d 75 6e 69 71 75 65 20 24 63 lsort -unique $c
0de0: 73 65 74 73 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 sets]. }..
0df0: 20 23 20 72 65 73 75 6c 74 20 3d 20 64 69 63 74 # result = dict
0e00: 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 (item -> list (
0e10: 63 68 61 6e 67 65 73 65 74 29 29 0a 20 20 20 20 changeset)).
0e20: 6d 65 74 68 6f 64 20 70 72 65 64 65 63 65 73 73 method predecess
0e30: 6f 72 6d 61 70 20 7b 7d 20 7b 0a 09 23 20 4e 4f ormap {} {..# NO
0e40: 54 45 20 2f 20 46 55 54 55 52 45 3a 20 50 6f 73 TE / FUTURE: Pos
0e50: 73 69 62 6c 65 20 62 6f 74 74 6c 65 6e 65 63 6b sible bottleneck
0e60: 2e 0a 09 61 72 72 61 79 20 73 65 74 20 74 6d 70 ...array set tmp
0e70: 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 65 {}..foreach {re
0e80: 76 20 63 68 69 6c 64 72 65 6e 7d 20 5b 24 73 65 v children} [$se
0e90: 6c 66 20 70 72 65 6d 61 70 5d 20 7b 0a 09 20 20 lf premap] {..
0ea0: 20 20 66 6f 72 65 61 63 68 20 63 68 69 6c 64 20 foreach child
0eb0: 24 63 68 69 6c 64 72 65 6e 20 7b 0a 09 09 6c 61 $children {...la
0ec0: 70 70 65 6e 64 20 74 6d 70 28 24 72 65 76 29 20 ppend tmp($rev)
0ed0: 24 6d 79 69 74 65 6d 6d 61 70 28 24 63 68 69 6c $myitemmap($chil
0ee0: 64 29 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73 d).. }.. s
0ef0: 65 74 20 74 6d 70 28 24 72 65 76 29 20 5b 6c 73 et tmp($rev) [ls
0f00: 6f 72 74 20 2d 75 6e 69 71 75 65 20 24 74 6d 70 ort -unique $tmp
0f10: 28 24 72 65 76 29 5d 0a 09 7d 0a 09 72 65 74 75 ($rev)]..}..retu
0f20: 72 6e 20 5b 61 72 72 61 79 20 67 65 74 20 74 6d rn [array get tm
0f30: 70 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 p]. }.. #
0f40: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 item -> list (it
0f50: 65 6d 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 6e em). method n
0f60: 65 78 74 6d 61 70 20 7b 7d 20 7b 0a 09 69 66 20 extmap {} {..if
0f70: 7b 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 6e 65 78 {[llength $mynex
0f80: 74 6d 61 70 5d 7d 20 7b 20 72 65 74 75 72 6e 20 tmap]} { return
0f90: 24 6d 79 6e 65 78 74 6d 61 70 20 7d 0a 09 24 6d $mynextmap }..$m
0fa0: 79 74 79 70 65 6f 62 6a 20 73 75 63 63 65 73 73 ytypeobj success
0fb0: 6f 72 73 20 74 6d 70 20 24 6d 79 69 74 65 6d 73 ors tmp $myitems
0fc0: 0a 09 73 65 74 20 6d 79 6e 65 78 74 6d 61 70 20 ..set mynextmap
0fd0: 5b 61 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a [array get tmp].
0fe0: 09 72 65 74 75 72 6e 20 24 6d 79 6e 65 78 74 6d .return $mynextm
0ff0: 61 70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 ap. }.. #
1000: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 item -> list (it
1010: 65 6d 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 70 em). method p
1020: 72 65 6d 61 70 20 7b 7d 20 7b 0a 09 69 66 20 7b remap {} {..if {
1030: 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 70 72 65 6d [llength $myprem
1040: 61 70 5d 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d ap]} { return $m
1050: 79 70 72 65 6d 61 70 20 7d 0a 09 24 6d 79 74 79 ypremap }..$myty
1060: 70 65 6f 62 6a 20 70 72 65 64 65 63 65 73 73 6f peobj predecesso
1070: 72 73 20 74 6d 70 20 24 6d 79 69 74 65 6d 73 0a rs tmp $myitems.
1080: 09 73 65 74 20 6d 79 70 72 65 6d 61 70 20 5b 61 .set mypremap [a
1090: 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 09 72 rray get tmp]..r
10a0: 65 74 75 72 6e 20 24 6d 79 70 72 65 6d 61 70 0a eturn $mypremap.
10b0: 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f }.. metho
10c0: 64 20 62 72 65 61 6b 69 6e 74 65 72 6e 61 6c 64 d breakinternald
10d0: 65 70 65 6e 64 65 6e 63 69 65 73 20 7b 7d 20 7b ependencies {} {
10e0: 0a 0a 09 23 23 0a 09 23 23 20 4e 4f 54 45 3a 20 ...##..## NOTE:
10f0: 54 68 69 73 20 6d 65 74 68 6f 64 2c 20 6d 61 79 This method, may
1100: 62 65 20 69 6e 20 63 6f 6e 6a 75 6e 63 74 69 6f be in conjunctio
1110: 6e 20 77 69 74 68 20 69 74 73 20 63 61 6c 6c 65 n with its calle
1120: 72 0a 09 23 23 20 20 20 20 20 20 20 73 65 65 6d r..## seem
1130: 73 20 74 6f 20 62 65 20 61 20 6d 65 6d 6f 72 79 s to be a memory
1140: 20 68 6f 67 2c 20 65 73 70 65 63 69 61 6c 6c 79 hog, especially
1150: 20 66 6f 72 20 6c 61 72 67 65 0a 09 23 23 20 20 for large..##
1160: 20 20 20 20 20 63 68 61 6e 67 65 73 65 74 73 2c changesets,
1170: 20 77 69 74 68 20 27 6c 61 72 67 65 27 20 6d 65 with 'large' me
1180: 61 6e 69 6e 67 20 74 6f 20 68 61 76 65 20 61 20 aning to have a
1190: 27 6c 6f 6e 67 20 6c 69 73 74 0a 09 23 23 20 20 'long list..##
11a0: 20 20 20 20 20 6f 66 20 69 74 65 6d 73 2c 20 73 of items, s
11b0: 65 76 65 72 61 6c 20 74 68 6f 75 73 61 6e 64 27 everal thousand'
11c0: 2e 20 49 6e 76 65 73 74 69 67 61 74 65 20 77 68 . Investigate wh
11d0: 65 72 65 20 74 68 65 0a 09 23 23 20 20 20 20 20 ere the..##
11e0: 20 20 6d 65 6d 6f 72 79 20 69 73 20 73 70 65 6e memory is spen
11f0: 74 20 61 6e 64 20 74 68 65 6e 20 6c 6f 6f 6b 20 t and then look
1200: 66 6f 72 20 77 61 79 73 20 6f 66 20 72 65 63 74 for ways of rect
1210: 69 66 79 69 6e 67 0a 09 23 23 20 20 20 20 20 20 ifying..##
1220: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 09 23 the problem...#
1230: 23 0a 0a 09 23 20 54 68 69 73 20 6d 65 74 68 6f #...# This metho
1240: 64 20 69 6e 73 70 65 63 74 73 20 74 68 65 20 63 d inspects the c
1250: 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20 69 6e hangesets for in
1260: 74 65 72 6e 61 6c 0a 09 23 20 64 65 70 65 6e 64 ternal..# depend
1270: 65 6e 63 69 65 73 2e 20 4e 6f 74 68 69 6e 67 20 encies. Nothing
1280: 69 73 20 64 6f 6e 65 20 69 66 20 74 68 65 72 65 is done if there
1290: 20 61 72 65 20 6e 6f 0a 09 23 20 73 75 63 68 2e are no..# such.
12a0: 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63 Otherwise the c
12b0: 68 61 6e 67 65 73 65 74 20 69 73 20 73 70 6c 69 hangeset is spli
12c0: 74 20 69 6e 74 6f 20 61 20 73 65 74 20 6f 66 0a t into a set of.
12d0: 09 23 20 66 72 61 67 6d 65 6e 74 73 20 77 69 74 .# fragments wit
12e0: 68 6f 75 74 20 69 6e 74 65 72 6e 61 6c 20 64 65 hout internal de
12f0: 70 65 6e 64 65 6e 63 69 65 73 2c 20 74 72 61 6e pendencies, tran
1300: 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 09 23 20 sforming the..#
1310: 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 internal depende
1320: 6e 63 69 65 73 20 69 6e 74 6f 20 65 78 74 65 72 ncies into exter
1330: 6e 61 6c 20 6f 6e 65 73 2e 20 54 68 65 20 6e 65 nal ones. The ne
1340: 77 20 63 68 61 6e 67 65 73 65 74 73 0a 09 23 20 w changesets..#
1350: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 are added to the
1360: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 68 61 list of all cha
1370: 6e 67 65 73 65 74 73 2e 0a 0a 09 23 20 57 65 20 ngesets....# We
1380: 70 65 72 66 6f 72 6d 20 61 6c 6c 20 6e 65 63 65 perform all nece
1390: 73 73 61 72 79 20 73 70 6c 69 74 73 20 69 6e 20 ssary splits in
13a0: 6f 6e 65 20 67 6f 2c 20 69 6e 73 74 65 61 64 20 one go, instead
13b0: 6f 66 20 6f 6e 6c 79 0a 09 23 20 6f 6e 65 2e 20 of only..# one.
13c0: 54 68 65 20 70 72 65 76 69 6f 75 73 20 61 6c 67 The previous alg
13d0: 6f 72 69 74 68 6d 2c 20 61 64 61 70 74 65 64 20 orithm, adapted
13e0: 66 72 6f 6d 20 63 76 73 32 73 76 6e 2c 20 63 6f from cvs2svn, co
13f0: 6d 70 75 74 65 64 0a 09 23 20 61 20 6c 6f 74 20 mputed..# a lot
1400: 6f 66 20 73 74 61 74 65 20 77 68 69 63 68 20 77 of state which w
1410: 61 73 20 74 68 72 6f 77 6e 20 61 77 61 79 20 61 as thrown away a
1420: 6e 64 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 64 nd then computed
1430: 20 61 67 61 69 6e 0a 09 23 20 66 6f 72 20 65 61 again..# for ea
1440: 63 68 20 6f 66 20 74 68 65 20 66 72 61 67 6d 65 ch of the fragme
1450: 6e 74 73 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 nts. It should b
1460: 65 20 65 61 73 69 65 72 20 74 6f 20 75 70 64 61 e easier to upda
1470: 74 65 20 61 6e 64 0a 09 23 20 72 65 75 73 65 20 te and..# reuse
1480: 74 68 61 74 20 73 74 61 74 65 2e 0a 0a 09 23 20 that state....#
1490: 54 68 65 20 63 6f 64 65 20 63 68 65 63 6b 73 20 The code checks
14a0: 6f 6e 6c 79 20 73 75 63 65 73 73 6f 72 20 64 65 only sucessor de
14b0: 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 20 74 pendencies, as t
14c0: 68 69 73 0a 09 23 20 61 75 74 6f 6d 61 74 69 63 his..# automatic
14d0: 61 6c 6c 79 20 63 6f 76 65 72 73 20 74 68 65 20 ally covers the
14e0: 70 72 65 64 65 63 65 73 73 6f 72 20 64 65 70 65 predecessor depe
14f0: 6e 64 65 6e 63 69 65 73 20 61 73 20 77 65 6c 6c ndencies as well
1500: 20 28 41 0a 09 23 20 73 75 63 63 65 73 73 6f 72 (A..# successor
1510: 20 64 65 70 65 6e 64 65 6e 63 79 20 61 20 2d 3e dependency a ->
1520: 20 62 20 69 73 20 61 6c 73 6f 20 61 20 70 72 65 b is also a pre
1530: 64 65 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 decessor depende
1540: 6e 63 79 0a 09 23 20 62 20 2d 3e 20 61 29 2e 0a ncy..# b -> a)..
1550: 0a 09 23 20 41 72 72 61 79 20 6f 66 20 64 65 70 ..# Array of dep
1560: 65 6e 64 65 6e 63 69 65 73 20 28 70 61 72 65 6e endencies (paren
1570: 74 20 2d 3e 20 63 68 69 6c 64 29 2e 20 54 68 69 t -> child). Thi
1580: 73 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d s is pulled from
1590: 0a 09 23 20 74 68 65 20 73 74 61 74 65 2c 20 61 ..# the state, a
15a0: 6e 64 20 6c 69 6d 69 74 65 64 20 74 6f 20 73 75 nd limited to su
15b0: 63 63 65 73 73 6f 72 73 20 77 69 74 68 69 6e 20 ccessors within
15c0: 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a the changeset...
15d0: 09 61 72 72 61 79 20 73 65 74 20 64 65 70 65 6e .array set depen
15e0: 64 65 6e 63 69 65 73 20 7b 7d 0a 09 24 6d 79 74 dencies {}..$myt
15f0: 79 70 65 6f 62 6a 20 69 6e 74 65 72 6e 61 6c 73 ypeobj internals
1600: 75 63 63 65 73 73 6f 72 73 20 64 65 70 65 6e 64 uccessors depend
1610: 65 6e 63 69 65 73 20 24 6d 79 69 74 65 6d 73 0a encies $myitems.
1620: 09 69 66 20 7b 21 5b 61 72 72 61 79 20 73 69 7a .if {![array siz
1630: 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73 5d 7d e dependencies]}
1640: 20 7b 72 65 74 75 72 6e 20 30 7d 20 3b 20 23 20 {return 0} ; #
1650: 4e 6f 74 68 69 6e 67 20 74 6f 20 62 72 65 61 6b Nothing to break
1660: 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 35 20 ....log write 5
1670: 63 73 65 74 73 20 2e 2e 2e 5b 24 73 65 6c 66 20 csets ...[$self
1680: 73 74 72 5d 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e str]............
1690: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
16a0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
16b0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 0a 0a 09 23 20 ..............#
16c0: 57 65 20 68 61 76 65 20 69 6e 74 65 72 6e 61 6c We have internal
16d0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 6f dependencies to
16e0: 20 62 72 65 61 6b 2e 20 57 65 20 6e 6f 77 20 69 break. We now i
16f0: 74 65 72 61 74 65 20 6f 76 65 72 0a 09 23 20 61 terate over..# a
1700: 6c 6c 20 70 6f 73 69 74 69 6f 6e 73 20 69 6e 20 ll positions in
1710: 74 68 65 20 6c 69 73 74 20 28 77 68 69 63 68 20 the list (which
1720: 69 73 20 63 68 72 6f 6e 6f 6c 6f 67 69 63 61 6c is chronological
1730: 2c 20 61 74 20 6c 65 61 73 74 0a 09 23 20 61 73 , at least..# as
1740: 20 66 61 72 20 61 73 20 74 68 65 20 74 69 6d 65 far as the time
1750: 73 74 61 6d 70 73 20 61 72 65 20 63 6f 72 72 65 stamps are corre
1760: 63 74 20 61 6e 64 20 75 6e 69 71 75 65 29 20 61 ct and unique) a
1770: 6e 64 0a 09 23 20 64 65 74 65 72 6d 69 6e 65 20 nd..# determine
1780: 74 68 65 20 62 65 73 74 20 70 6f 73 69 74 69 6f the best positio
1790: 6e 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b 2c n for the break,
17a0: 20 62 79 20 74 72 79 69 6e 67 20 74 6f 0a 09 23 by trying to..#
17b0: 20 62 72 65 61 6b 20 61 73 20 6d 61 6e 79 20 64 break as many d
17c0: 65 70 65 6e 64 65 6e 63 69 65 73 20 61 73 20 70 ependencies as p
17d0: 6f 73 73 69 62 6c 65 20 69 6e 20 6f 6e 65 20 67 ossible in one g
17e0: 6f 2e 20 57 68 65 6e 20 61 0a 09 23 20 62 72 65 o. When a..# bre
17f0: 61 6b 20 77 61 73 20 66 6f 75 6e 64 20 74 68 69 ak was found thi
1800: 73 20 69 73 20 72 65 64 6f 6e 65 20 66 6f 72 20 s is redone for
1810: 74 68 65 20 66 72 61 67 6d 65 6e 74 73 20 63 6f the fragments co
1820: 6d 69 6e 67 20 61 6e 64 0a 09 23 20 61 66 74 65 ming and..# afte
1830: 72 2c 20 61 66 74 65 72 20 75 70 64 69 6e 67 20 r, after upding
1840: 74 68 65 20 63 72 6f 73 73 69 6e 67 20 69 6e 66 the crossing inf
1850: 6f 72 6d 61 74 69 6f 6e 2e 0a 0a 09 23 20 44 61 ormation....# Da
1860: 74 61 20 73 74 72 75 63 74 75 72 65 73 3a 0a 09 ta structures:..
1870: 23 20 4d 61 70 3a 20 20 50 4f 53 20 20 20 72 65 # Map: POS re
1880: 76 69 73 69 6f 6e 20 69 64 20 20 20 20 20 20 2d vision id -
1890: 3e 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 > position in li
18a0: 73 74 2e 0a 09 23 20 20 20 20 20 20 20 43 52 4f st...# CRO
18b0: 53 53 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c SS position in l
18c0: 69 73 74 20 2d 3e 20 6e 75 6d 62 65 72 20 6f 66 ist -> number of
18d0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 63 72 dependencies cr
18e0: 6f 73 73 69 6e 67 20 69 74 0a 09 23 20 20 20 20 ossing it..#
18f0: 20 20 20 44 45 50 43 20 20 64 65 70 65 6e 64 65 DEPC depende
1900: 6e 63 79 20 20 20 20 20 20 20 2d 3e 20 70 6f 73 ncy -> pos
1910: 69 74 69 6f 6e 73 20 69 74 20 63 72 6f 73 73 65 itions it crosse
1920: 73 0a 09 23 20 4c 69 73 74 3a 20 52 41 4e 47 45 s..# List: RANGE
1930: 20 4f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e Of the position
1940: 73 20 69 74 73 65 6c 66 2e 0a 09 23 20 41 20 64 s itself...# A d
1950: 65 70 65 6e 64 65 6e 63 79 20 69 73 20 61 20 73 ependency is a s
1960: 69 6e 67 6c 65 2d 65 6c 65 6d 65 6e 74 20 6d 61 ingle-element ma
1970: 70 20 70 61 72 65 6e 74 20 2d 3e 20 63 68 69 6c p parent -> chil
1980: 64 0a 0a 09 49 6e 69 74 69 61 6c 69 7a 65 42 72 d...InitializeBr
1990: 65 61 6b 53 74 61 74 65 20 24 6d 79 69 74 65 6d eakState $myitem
19a0: 73 0a 0a 09 73 65 74 20 66 72 61 67 6d 65 6e 74 s...set fragment
19b0: 73 20 7b 7d 0a 09 73 65 74 20 6e 65 77 20 20 20 s {}..set new
19c0: 20 20 20 20 5b 6c 69 73 74 20 24 72 61 6e 67 65 [list $range
19d0: 5d 0a 09 61 72 72 61 79 20 73 65 74 20 62 72 65 ]..array set bre
19e0: 61 6b 73 20 7b 7d 0a 0a 09 23 20 49 6e 73 74 65 aks {}...# Inste
19f0: 61 64 20 6f 66 20 6f 6e 65 20 6c 69 73 74 20 68 ad of one list h
1a00: 6f 6c 64 69 6e 67 20 62 6f 74 68 20 70 72 6f 63 olding both proc
1a10: 65 73 73 65 64 20 61 6e 64 20 70 65 6e 64 69 6e essed and pendin
1a20: 67 0a 09 23 20 66 72 61 67 6d 65 6e 74 73 20 77 g..# fragments w
1a30: 65 20 75 73 65 20 74 77 6f 2c 20 6f 6e 65 20 66 e use two, one f
1a40: 6f 72 20 74 68 65 20 66 72 61 6d 65 6e 74 73 20 or the framents
1a50: 74 6f 20 70 72 6f 63 65 73 73 2c 20 6f 6e 65 0a to process, one.
1a60: 09 23 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e .# to hold the n
1a70: 65 77 20 66 72 61 67 6d 65 6e 74 73 2c 20 61 6e ew fragments, an
1a80: 64 20 74 68 65 20 6c 61 74 74 65 72 20 69 73 20 d the latter is
1a90: 63 6f 70 69 65 64 20 74 6f 20 74 68 65 0a 09 23 copied to the..#
1aa0: 20 66 6f 72 6d 65 72 20 77 68 65 6e 20 74 68 65 former when the
1ab0: 79 20 72 75 6e 20 6f 75 74 2e 20 54 68 69 73 20 y run out. This
1ac0: 6b 65 65 70 73 20 74 68 65 20 6c 69 73 74 20 6f keeps the list o
1ad0: 66 20 70 65 6e 64 69 6e 67 0a 09 23 20 66 72 61 f pending..# fra
1ae0: 67 6d 65 6e 74 73 20 73 68 6f 72 74 20 77 69 74 gments short wit
1af0: 68 6f 75 74 20 73 61 63 72 69 66 69 63 69 6e 67 hout sacrificing
1b00: 20 73 70 65 65 64 20 62 79 20 73 68 69 66 74 69 speed by shifti
1b10: 6e 67 20 73 74 75 66 66 0a 09 23 20 64 6f 77 6e ng stuff..# down
1b20: 2e 20 57 65 20 65 73 70 65 63 69 61 6c 6c 79 20 . We especially
1b30: 64 72 6f 70 20 74 68 65 20 6d 65 6d 6f 72 79 20 drop the memory
1b40: 6f 66 20 66 72 61 67 6d 65 6e 74 73 20 62 72 6f of fragments bro
1b50: 6b 65 6e 0a 09 23 20 64 75 72 69 6e 67 20 70 72 ken..# during pr
1b60: 6f 63 65 73 73 69 6e 67 20 61 66 74 65 72 20 61 ocessing after a
1b70: 20 73 68 6f 72 74 20 74 69 6d 65 2c 20 69 6e 73 short time, ins
1b80: 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 tead of letting
1b90: 69 74 0a 09 23 20 63 6f 6e 73 75 6d 65 20 6d 65 it..# consume me
1ba0: 6d 6f 72 79 2e 0a 0a 09 77 68 69 6c 65 20 7b 5b mory....while {[
1bb0: 6c 6c 65 6e 67 74 68 20 24 6e 65 77 5d 7d 20 7b llength $new]} {
1bc0: 0a 0a 09 20 20 20 20 73 65 74 20 70 65 6e 64 69 ... set pendi
1bd0: 6e 67 20 24 6e 65 77 0a 09 20 20 20 20 73 65 74 ng $new.. set
1be0: 20 6e 65 77 20 20 20 20 20 7b 7d 0a 09 20 20 20 new {}..
1bf0: 20 73 65 74 20 61 74 20 20 20 20 20 20 30 0a 0a set at 0..
1c00: 09 20 20 20 20 77 68 69 6c 65 20 7b 24 61 74 20 . while {$at
1c10: 3c 20 5b 6c 6c 65 6e 67 74 68 20 24 70 65 6e 64 < [llength $pend
1c20: 69 6e 67 5d 7d 20 7b 0a 09 09 73 65 74 20 63 75 ing]} {...set cu
1c30: 72 72 65 6e 74 20 5b 6c 69 6e 64 65 78 20 24 70 rrent [lindex $p
1c40: 65 6e 64 69 6e 67 20 24 61 74 5d 0a 0a 09 09 6c ending $at]....l
1c50: 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73 og write 6 csets
1c60: 20 7b 2e 20 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e {. . .. ... ...
1c70: 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e .. ........ ....
1c80: 2e 2e 2e 2e 2e 2e 2e 2e 2e 7d 0a 09 09 6c 6f 67 .........}...log
1c90: 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 7b write 6 csets {
1ca0: 53 63 68 65 64 75 6c 65 64 20 20 20 5b 6a 6f 69 Scheduled [joi
1cb0: 6e 20 5b 50 52 73 20 5b 6c 72 61 6e 67 65 20 24 n [PRs [lrange $
1cc0: 70 65 6e 64 69 6e 67 20 24 61 74 20 65 6e 64 5d pending $at end]
1cd0: 5d 20 7b 20 7d 5d 7d 0a 09 09 6c 6f 67 20 77 72 ] { }]}...log wr
1ce0: 69 74 65 20 36 20 63 73 65 74 73 20 7b 43 6f 6e ite 6 csets {Con
1cf0: 73 69 64 65 72 69 6e 67 20 5b 50 52 20 24 63 75 sidering [PR $cu
1d00: 72 72 65 6e 74 5d 20 5c 5b 24 61 74 2f 5b 6c 6c rrent] \[$at/[ll
1d10: 65 6e 67 74 68 20 24 70 65 6e 64 69 6e 67 5d 5c ength $pending]\
1d20: 5d 7d 0a 0a 09 09 73 65 74 20 62 65 73 74 20 5b ]}....set best [
1d30: 46 69 6e 64 42 65 73 74 42 72 65 61 6b 20 24 63 FindBestBreak $c
1d40: 75 72 72 65 6e 74 5d 0a 0a 09 09 69 66 20 7b 24 urrent]....if {$
1d50: 62 65 73 74 20 3c 20 30 7d 20 7b 0a 09 09 20 20 best < 0} {...
1d60: 20 20 23 20 54 68 65 20 69 6e 73 70 65 63 74 65 # The inspecte
1d70: 64 20 72 61 6e 67 65 20 68 61 73 20 6e 6f 20 69 d range has no i
1d80: 6e 74 65 72 6e 61 6c 0a 09 09 20 20 20 20 23 20 nternal... #
1d90: 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 54 68 dependencies. Th
1da0: 69 73 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 is is a complete
1db0: 20 66 72 61 67 6d 65 6e 74 2e 0a 09 09 20 20 20 fragment....
1dc0: 20 6c 61 70 70 65 6e 64 20 66 72 61 67 6d 65 6e lappend fragmen
1dd0: 74 73 20 24 63 75 72 72 65 6e 74 0a 0a 09 09 20 ts $current....
1de0: 20 20 20 6c 6f 67 20 77 72 69 74 65 20 36 20 63 log write 6 c
1df0: 73 65 74 73 20 22 4e 6f 20 62 72 65 61 6b 73 2c sets "No breaks,
1e00: 20 66 69 6e 61 6c 22 0a 09 09 7d 20 65 6c 73 65 final"...} else
1e10: 20 7b 0a 09 09 20 20 20 20 23 20 53 70 6c 69 74 {... # Split
1e20: 20 74 68 65 20 72 61 6e 67 65 20 61 6e 64 20 73 the range and s
1e30: 63 68 65 64 75 6c 65 20 74 68 65 20 72 65 73 75 chedule the resu
1e40: 6c 74 69 6e 67 0a 09 09 20 20 20 20 23 20 66 72 lting... # fr
1e50: 61 67 6d 65 6e 74 73 20 66 6f 72 20 66 75 72 74 agments for furt
1e60: 68 65 72 20 69 6e 73 70 65 63 74 69 6f 6e 2e 20 her inspection.
1e70: 52 65 6d 65 6d 62 65 72 20 74 68 65 0a 09 09 20 Remember the...
1e80: 20 20 20 23 20 6e 75 6d 62 65 72 20 6f 66 20 64 # number of d
1e90: 65 70 65 6e 64 65 6e 63 69 65 73 20 63 75 74 20 ependencies cut
1ea0: 62 65 66 6f 72 65 20 77 65 20 72 65 6d 6f 76 65 before we remove
1eb0: 20 74 68 65 6d 0a 09 09 20 20 20 20 23 20 66 72 them... # fr
1ec0: 6f 6d 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e om consideration
1ed0: 2c 20 66 6f 72 20 64 6f 63 75 6d 65 6e 74 61 74 , for documentat
1ee0: 69 6f 6e 20 6c 61 74 65 72 2e 0a 0a 09 09 20 20 ion later.....
1ef0: 20 20 73 65 74 20 62 72 65 61 6b 73 28 24 62 65 set breaks($be
1f00: 73 74 29 20 24 63 72 6f 73 73 28 24 62 65 73 74 st) $cross($best
1f10: 29 0a 0a 09 09 20 20 20 20 6c 6f 67 20 77 72 69 ).... log wri
1f20: 74 65 20 36 20 63 73 65 74 73 20 22 42 65 73 74 te 6 csets "Best
1f30: 20 62 72 65 61 6b 20 40 20 24 62 65 73 74 2c 20 break @ $best,
1f40: 63 75 74 74 69 6e 67 20 5b 6e 73 70 20 24 63 72 cutting [nsp $cr
1f50: 6f 73 73 28 24 62 65 73 74 29 20 64 65 70 65 6e oss($best) depen
1f60: 64 65 6e 63 79 20 64 65 70 65 6e 64 65 6e 63 69 dency dependenci
1f70: 65 73 5d 22 0a 0a 09 09 20 20 20 20 23 20 4e 6f es]".... # No
1f80: 74 65 3a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 te: The value of
1f90: 20 62 65 73 74 20 69 73 20 61 6e 20 61 62 6f 6c best is an abol
1fa0: 75 74 65 20 6c 6f 63 61 74 69 6f 6e 0a 09 09 20 ute location...
1fb0: 20 20 20 23 20 69 6e 20 6d 79 69 74 65 6d 73 2e # in myitems.
1fc0: 20 55 73 65 20 74 68 65 20 73 74 61 72 74 20 6f Use the start o
1fd0: 66 20 63 75 72 72 65 6e 74 20 74 6f 20 6d 61 6b f current to mak
1fe0: 65 20 69 74 0a 09 09 20 20 20 20 23 20 61 6e 20 e it... # an
1ff0: 69 6e 64 65 78 20 61 62 73 6f 6c 75 74 65 20 74 index absolute t
2000: 6f 20 63 75 72 72 65 6e 74 2e 0a 0a 09 09 20 20 o current.....
2010: 20 20 73 65 74 20 62 72 65 6c 20 5b 65 78 70 72 set brel [expr
2020: 20 7b 24 62 65 73 74 20 2d 20 5b 6c 69 6e 64 65 {$best - [linde
2030: 78 20 24 63 75 72 72 65 6e 74 20 30 5d 7d 5d 0a x $current 0]}].
2040: 09 09 20 20 20 20 73 65 74 20 62 6e 65 78 74 20 .. set bnext
2050: 24 62 72 65 6c 20 3b 20 69 6e 63 72 20 62 6e 65 $brel ; incr bne
2060: 78 74 0a 09 09 20 20 20 20 73 65 74 20 66 72 61 xt... set fra
2070: 67 62 65 66 6f 72 65 20 5b 6c 72 61 6e 67 65 20 gbefore [lrange
2080: 24 63 75 72 72 65 6e 74 20 30 20 24 62 72 65 6c $current 0 $brel
2090: 5d 0a 09 09 20 20 20 20 73 65 74 20 66 72 61 67 ]... set frag
20a0: 61 66 74 65 72 20 20 5b 6c 72 61 6e 67 65 20 24 after [lrange $
20b0: 63 75 72 72 65 6e 74 20 24 62 6e 65 78 74 20 65 current $bnext e
20c0: 6e 64 5d 0a 0a 09 09 20 20 20 20 6c 6f 67 20 77 nd].... log w
20d0: 72 69 74 65 20 36 20 63 73 65 74 73 20 22 4e 65 rite 6 csets "Ne
20e0: 77 20 70 69 65 63 65 73 20 20 5b 50 52 20 24 66 w pieces [PR $f
20f0: 72 61 67 62 65 66 6f 72 65 5d 20 5b 50 52 20 24 ragbefore] [PR $
2100: 66 72 61 67 61 66 74 65 72 5d 22 0a 0a 09 09 20 fragafter]"....
2110: 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 integrity ass
2120: 65 72 74 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 ert {[llength $f
2130: 72 61 67 62 65 66 6f 72 65 5d 7d 20 7b 46 6f 75 ragbefore]} {Fou
2140: 6e 64 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 nd zero-length f
2150: 72 61 67 6d 65 6e 74 20 61 74 20 74 68 65 20 62 ragment at the b
2160: 65 67 69 6e 6e 69 6e 67 7d 0a 09 09 20 20 20 20 eginning}...
2170: 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 integrity assert
2180: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 72 61 67 {[llength $frag
2190: 61 66 74 65 72 5d 7d 20 20 7b 46 6f 75 6e 64 20 after]} {Found
21a0: 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 72 61 67 zero-length frag
21b0: 6d 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 7d ment at the end}
21c0: 0a 0a 09 09 20 20 20 20 6c 61 70 70 65 6e 64 20 .... lappend
21d0: 6e 65 77 20 24 66 72 61 67 62 65 66 6f 72 65 20 new $fragbefore
21e0: 24 66 72 61 67 61 66 74 65 72 0a 09 09 20 20 20 $fragafter...
21f0: 20 43 75 74 41 74 20 24 62 65 73 74 0a 09 09 7d CutAt $best...}
2200: 0a 0a 09 09 69 6e 63 72 20 61 74 0a 09 20 20 20 ....incr at..
2210: 20 7d 0a 09 7d 0a 0a 09 6c 6f 67 20 77 72 69 74 }..}...log writ
2220: 65 20 36 20 63 73 65 74 73 20 22 2e 20 2e 20 2e e 6 csets ". . .
2230: 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e 2e 2e . ... ..... ....
2240: 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e .... ...........
2250: 2e 2e 22 0a 0a 09 23 20 28 2a 29 20 57 65 20 63 .."...# (*) We c
2260: 6c 65 61 72 20 6f 75 74 20 74 68 65 20 61 73 73 lear out the ass
2270: 6f 63 69 61 74 65 64 20 70 61 72 74 20 6f 66 20 ociated part of
2280: 74 68 65 20 6d 79 69 74 65 6d 6d 61 70 0a 09 23 the myitemmap..#
2290: 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6e 64 65 78 in-memory index
22a0: 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 in preparation
22b0: 66 6f 72 20 6e 65 77 20 64 61 74 61 2e 20 41 20 for new data. A
22c0: 73 69 6d 70 6c 65 20 75 6e 73 65 74 0a 09 23 20 simple unset..#
22d0: 69 73 20 65 6e 6f 75 67 68 2c 20 77 65 20 68 61 is enough, we ha
22e0: 76 65 20 6e 6f 20 73 79 6d 62 6f 6c 20 63 68 61 ve no symbol cha
22f0: 6e 67 65 73 65 74 73 20 61 74 20 74 68 69 73 20 ngesets at this
2300: 74 69 6d 65 2c 20 61 6e 64 0a 09 23 20 74 68 75 time, and..# thu
2310: 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 s never more tha
2320: 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 n one reference
2330: 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 0a 09 66 in the list....f
2340: 6f 72 65 61 63 68 20 69 69 64 20 24 6d 79 69 74 oreach iid $myit
2350: 65 6d 73 20 7b 0a 09 20 20 20 20 73 65 74 20 6b ems {.. set k
2360: 65 79 20 5b 6c 69 73 74 20 24 6d 79 74 79 70 65 ey [list $mytype
2370: 20 24 69 69 64 5d 0a 09 20 20 20 20 75 6e 73 65 $iid].. unse
2380: 74 20 6d 79 69 74 65 6d 6d 61 70 28 24 6b 65 79 t myitemmap($key
2390: 29 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 ).. log write
23a0: 20 38 20 63 73 65 74 73 20 7b 4d 41 50 2d 20 69 8 csets {MAP- i
23b0: 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73 65 6c 66 tem <$key> $self
23c0: 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d 7d 0a = [$self str]}.
23d0: 09 7d 0a 0a 09 23 20 43 72 65 61 74 65 20 63 68 .}...# Create ch
23e0: 61 6e 67 65 73 65 74 73 20 66 6f 72 20 74 68 65 angesets for the
23f0: 20 66 72 61 67 6d 65 6e 74 73 2c 20 72 65 75 73 fragments, reus
2400: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 ing the current
2410: 6f 6e 65 0a 09 23 20 66 6f 72 20 74 68 65 20 66 one..# for the f
2420: 69 72 73 74 20 66 72 61 67 6d 65 6e 74 2e 20 57 irst fragment. W
2430: 65 20 73 6f 72 74 20 74 68 65 6d 20 69 6e 20 6f e sort them in o
2440: 72 64 65 72 20 74 6f 20 61 6c 6c 6f 77 0a 09 23 rder to allow..#
2450: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 67 61 checking for ga
2460: 70 73 20 61 6e 64 20 6e 69 63 65 20 6d 65 73 73 ps and nice mess
2470: 61 67 65 73 2e 0a 0a 09 73 65 74 20 66 72 61 67 ages....set frag
2480: 6d 65 6e 74 73 20 5b 6c 73 6f 72 74 20 2d 69 6e ments [lsort -in
2490: 64 65 78 20 30 20 2d 69 6e 74 65 67 65 72 20 24 dex 0 -integer $
24a0: 66 72 61 67 6d 65 6e 74 73 5d 0a 0a 09 23 70 75 fragments]...#pu
24b0: 74 73 20 5c 74 2e 5b 6a 6f 69 6e 20 5b 50 52 73 ts \t.[join [PRs
24c0: 20 24 66 72 61 67 6d 65 6e 74 73 5d 20 2e 5c 6e $fragments] .\n
24d0: 5c 74 2e 5d 2e 0a 0a 09 42 6f 72 64 65 72 20 5b \t.]....Border [
24e0: 6c 69 6e 64 65 78 20 24 66 72 61 67 6d 65 6e 74 lindex $fragment
24f0: 73 20 30 5d 20 66 69 72 73 74 73 20 66 69 72 73 s 0] firsts firs
2500: 74 65 0a 0a 09 69 6e 74 65 67 72 69 74 79 20 61 te...integrity a
2510: 73 73 65 72 74 20 7b 24 66 69 72 73 74 73 20 3d ssert {$firsts =
2520: 3d 20 30 7d 20 7b 42 61 64 20 66 72 61 67 6d 65 = 0} {Bad fragme
2530: 6e 74 20 73 74 61 72 74 20 40 20 24 66 69 72 73 nt start @ $firs
2540: 74 73 2c 20 67 61 70 2c 20 6f 72 20 62 65 66 6f ts, gap, or befo
2550: 72 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 re beginning of
2560: 74 68 65 20 72 61 6e 67 65 7d 0a 0a 09 73 65 74 the range}...set
2570: 20 6c 61 73 74 65 20 24 66 69 72 73 74 65 0a 09 laste $firste..
2580: 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65 6e 74 foreach fragment
2590: 20 5b 6c 72 61 6e 67 65 20 24 66 72 61 67 6d 65 [lrange $fragme
25a0: 6e 74 73 20 31 20 65 6e 64 5d 20 7b 0a 09 20 20 nts 1 end] {..
25b0: 20 20 42 6f 72 64 65 72 20 24 66 72 61 67 6d 65 Border $fragme
25c0: 6e 74 20 73 20 65 0a 09 20 20 20 20 69 6e 74 65 nt s e.. inte
25d0: 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24 6c grity assert {$l
25e0: 61 73 74 65 20 3d 3d 20 28 24 73 20 2d 20 31 29 aste == ($s - 1)
25f0: 7d 20 7b 42 61 64 20 66 72 61 67 6d 65 6e 74 20 } {Bad fragment
2600: 62 6f 72 64 65 72 20 3c 24 6c 61 73 74 65 20 7c border <$laste |
2610: 20 24 73 3e 2c 20 67 61 70 20 6f 72 20 6f 76 65 $s>, gap or ove
2620: 72 6c 61 70 7d 0a 0a 09 20 20 20 20 73 65 74 20 rlap}... set
2630: 6e 65 77 20 5b 24 74 79 70 65 20 25 41 55 54 4f new [$type %AUTO
2640: 25 20 24 6d 79 70 72 6f 6a 65 63 74 20 24 6d 79 % $myproject $my
2650: 74 79 70 65 20 24 6d 79 73 72 63 69 64 20 5b 6c type $mysrcid [l
2660: 72 61 6e 67 65 20 24 6d 79 69 74 65 6d 73 20 24 range $myitems $
2670: 73 20 24 65 5d 5d 0a 0a 20 20 20 20 20 20 20 20 s $e]]..
2680: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 34 20 log write 4
2690: 63 73 65 74 73 20 22 42 72 65 61 6b 69 6e 67 20 csets "Breaking
26a0: 5b 24 73 65 6c 66 20 73 74 72 20 5d 20 40 20 24 [$self str ] @ $
26b0: 6c 61 73 74 65 2c 20 6e 65 77 20 5b 24 6e 65 77 laste, new [$new
26c0: 20 73 74 72 5d 2c 20 63 75 74 74 69 6e 67 20 24 str], cutting $
26d0: 62 72 65 61 6b 73 28 24 6c 61 73 74 65 29 22 0a breaks($laste)".
26e0: 0a 09 20 20 20 20 73 65 74 20 6c 61 73 74 65 20 .. set laste
26f0: 24 65 0a 09 7d 0a 0a 09 69 6e 74 65 67 72 69 74 $e..}...integrit
2700: 79 20 61 73 73 65 72 74 20 7b 0a 09 20 20 20 20 y assert {..
2710: 24 6c 61 73 74 65 20 3d 3d 20 28 5b 6c 6c 65 6e $laste == ([llen
2720: 67 74 68 20 24 6d 79 69 74 65 6d 73 5d 2d 31 29 gth $myitems]-1)
2730: 0a 09 7d 20 7b 42 61 64 20 66 72 61 67 6d 65 6e ..} {Bad fragmen
2740: 74 20 65 6e 64 20 40 20 24 6c 61 73 74 65 2c 20 t end @ $laste,
2750: 67 61 70 2c 20 6f 72 20 62 65 79 6f 6e 64 20 65 gap, or beyond e
2760: 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 7d nd of the range}
2770: 0a 0a 09 23 20 50 75 74 20 74 68 65 20 66 69 72 ...# Put the fir
2780: 73 74 20 66 72 61 67 6d 65 6e 74 20 69 6e 74 6f st fragment into
2790: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 the current cha
27a0: 6e 67 65 73 65 74 2c 20 61 6e 64 0a 09 23 20 75 ngeset, and..# u
27b0: 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d pdate the in-mem
27c0: 6f 72 79 20 69 6e 64 65 78 2e 20 57 65 20 63 61 ory index. We ca
27d0: 6e 20 73 69 6d 70 6c 79 20 28 72 65 29 61 64 64 n simply (re)add
27e0: 20 74 68 65 20 69 74 65 6d 73 0a 09 23 20 62 65 the items..# be
27f0: 63 61 75 73 65 20 77 65 20 63 6c 65 61 72 65 64 cause we cleared
2800: 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 the previously
2810: 65 78 69 73 74 69 6e 67 20 69 6e 66 6f 72 6d 61 existing informa
2820: 74 69 6f 6e 2c 20 73 65 65 0a 09 23 20 28 2a 29 tion, see..# (*)
2830: 20 61 62 6f 76 65 2e 20 50 65 72 73 69 73 74 65 above. Persiste
2840: 6e 63 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 nce does not mat
2850: 74 65 72 20 68 65 72 65 2c 20 6e 6f 6e 65 20 6f ter here, none o
2860: 66 20 74 68 65 0a 09 23 20 63 68 61 6e 67 65 73 f the..# changes
2870: 65 74 73 20 68 61 73 20 62 65 65 6e 20 73 61 76 ets has been sav
2880: 65 64 20 74 6f 20 74 68 65 20 70 65 72 73 69 73 ed to the persis
2890: 74 65 6e 74 20 73 74 61 74 65 20 79 65 74 2e 0a tent state yet..
28a0: 0a 09 73 65 74 20 6d 79 69 74 65 6d 73 20 20 5b ..set myitems [
28b0: 6c 72 61 6e 67 65 20 24 6d 79 69 74 65 6d 73 20 lrange $myitems
28c0: 20 30 20 24 66 69 72 73 74 65 5d 0a 09 73 65 74 0 $firste]..set
28d0: 20 6d 79 74 69 74 65 6d 73 20 5b 6c 72 61 6e 67 mytitems [lrang
28e0: 65 20 24 6d 79 74 69 74 65 6d 73 20 30 20 24 66 e $mytitems 0 $f
28f0: 69 72 73 74 65 5d 0a 09 66 6f 72 65 61 63 68 20 irste]..foreach
2900: 69 69 64 20 24 6d 79 69 74 65 6d 73 20 7b 0a 09 iid $myitems {..
2910: 20 20 20 20 73 65 74 20 6b 65 79 20 5b 6c 69 73 set key [lis
2920: 74 20 24 6d 79 74 79 70 65 20 24 69 69 64 5d 0a t $mytype $iid].
2930: 09 20 20 20 20 73 65 74 20 6d 79 69 74 65 6d 6d . set myitemm
2940: 61 70 28 24 6b 65 79 29 20 24 73 65 6c 66 0a 09 ap($key) $self..
2950: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 38 20 log write 8
2960: 63 73 65 74 73 20 7b 4d 41 50 2b 20 69 74 65 6d csets {MAP+ item
2970: 20 3c 24 6b 65 79 3e 20 24 73 65 6c 66 20 3d 20 <$key> $self =
2980: 5b 24 73 65 6c 66 20 73 74 72 5d 7d 0a 09 7d 0a [$self str]}..}.
2990: 0a 09 72 65 74 75 72 6e 20 31 0a 20 20 20 20 7d ..return 1. }
29a0: 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 70 65 72 .. method per
29b0: 73 69 73 74 20 7b 7d 20 7b 0a 09 73 65 74 20 74 sist {} {..set t
29c0: 69 64 20 24 6d 79 63 73 74 79 70 65 28 24 6d 79 id $mycstype($my
29d0: 74 79 70 65 29 0a 09 73 65 74 20 70 69 64 20 5b type)..set pid [
29e0: 24 6d 79 70 72 6f 6a 65 63 74 20 69 64 5d 0a 09 $myproject id]..
29f0: 73 65 74 20 70 6f 73 20 30 0a 0a 09 73 74 61 74 set pos 0...stat
2a00: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a e transaction {.
2a10: 09 20 20 20 20 73 74 61 74 65 20 72 75 6e 20 7b . state run {
2a20: 0a 09 09 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 ...INSERT INTO c
2a30: 68 61 6e 67 65 73 65 74 20 28 63 69 64 2c 20 20 hangeset (cid,
2a40: 20 70 69 64 2c 20 20 74 79 70 65 2c 20 73 72 63 pid, type, src
2a50: 29 0a 09 09 56 41 4c 55 45 53 20 20 20 20 20 20 )...VALUES
2a60: 20 20 20 20 20 20 20 20 20 20 28 24 6d 79 69 64 ($myid
2a70: 2c 20 24 70 69 64 2c 20 24 74 69 64 2c 20 24 6d , $pid, $tid, $m
2a80: 79 73 72 63 69 64 29 3b 0a 09 20 20 20 20 7d 0a ysrcid);.. }.
2a90: 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 69 69 .. foreach ii
2aa0: 64 20 24 6d 79 69 74 65 6d 73 20 7b 0a 09 09 73 d $myitems {...s
2ab0: 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 20 20 20 tate run {...
2ac0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 73 69 INSERT INTO csi
2ad0: 74 65 6d 20 28 63 69 64 2c 20 20 20 70 6f 73 2c tem (cid, pos,
2ae0: 20 20 69 69 64 29 0a 09 09 20 20 20 20 56 41 4c iid)... VAL
2af0: 55 45 53 20 20 20 20 20 20 20 20 20 20 20 20 20 UES
2b00: 28 24 6d 79 69 64 2c 20 24 70 6f 73 2c 20 24 69 ($myid, $pos, $i
2b10: 69 64 29 3b 0a 09 09 7d 0a 09 09 69 6e 63 72 20 id);...}...incr
2b20: 70 6f 73 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72 pos.. }..}..r
2b30: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 eturn. }..
2b40: 20 6d 65 74 68 6f 64 20 74 69 6d 65 72 61 6e 67 method timerang
2b50: 65 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 5b 24 e {} { return [$
2b60: 6d 79 74 79 70 65 6f 62 6a 20 74 69 6d 65 72 61 mytypeobj timera
2b70: 6e 67 65 20 24 6d 79 69 74 65 6d 73 5d 20 7d 0a nge $myitems] }.
2b80: 0a 20 20 20 20 6d 65 74 68 6f 64 20 64 72 6f 70 . method drop
2b90: 20 7b 7d 20 7b 0a 09 6c 6f 67 20 77 72 69 74 65 {} {..log write
2ba0: 20 38 20 63 73 65 74 73 20 7b 44 72 6f 70 70 69 8 csets {Droppi
2bb0: 6e 67 20 24 73 65 6c 66 20 3d 20 5b 24 73 65 6c ng $self = [$sel
2bc0: 66 20 73 74 72 5d 7d 0a 0a 09 73 74 61 74 65 20 f str]}...state
2bd0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 09 20 transaction {..
2be0: 20 20 20 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 state run {..
2bf0: 09 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 68 61 .DELETE FROM cha
2c00: 6e 67 65 73 65 74 20 57 48 45 52 45 20 63 69 64 ngeset WHERE cid
2c10: 20 3d 20 24 6d 79 69 64 3b 0a 09 09 44 45 4c 45 = $myid;...DELE
2c20: 54 45 20 46 52 4f 4d 20 63 73 69 74 65 6d 20 20 TE FROM csitem
2c30: 20 20 57 48 45 52 45 20 63 69 64 20 3d 20 24 6d WHERE cid = $m
2c40: 79 69 64 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 yid;.. }..}..
2c50: 66 6f 72 65 61 63 68 20 69 69 64 20 24 6d 79 69 foreach iid $myi
2c60: 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65 74 20 tems {.. set
2c70: 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79 74 79 70 key [list $mytyp
2c80: 65 20 24 69 69 64 5d 0a 09 20 20 20 20 75 6e 73 e $iid].. uns
2c90: 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24 6b 65 et myitemmap($ke
2ca0: 79 29 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 y).. log writ
2cb0: 65 20 38 20 63 73 65 74 73 20 7b 4d 41 50 2d 20 e 8 csets {MAP-
2cc0: 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73 65 6c item <$key> $sel
2cd0: 66 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d 7d f = [$self str]}
2ce0: 0a 09 7d 0a 09 73 65 74 20 70 6f 73 20 20 20 20 ..}..set pos
2cf0: 20 20 20 20 20 20 5b 6c 73 65 61 72 63 68 20 2d [lsearch -
2d00: 65 78 61 63 74 20 24 6d 79 63 68 61 6e 67 65 73 exact $mychanges
2d10: 65 74 73 20 24 73 65 6c 66 5d 0a 09 73 65 74 20 ets $self]..set
2d20: 6d 79 63 68 61 6e 67 65 73 65 74 73 20 5b 6c 72 mychangesets [lr
2d30: 65 70 6c 61 63 65 20 24 6d 79 63 68 61 6e 67 65 eplace $mychange
2d40: 73 65 74 73 20 24 70 6f 73 20 24 70 6f 73 5d 0a sets $pos $pos].
2d50: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 .return. }..
2d60: 20 20 20 6d 65 74 68 6f 64 20 6c 6f 6f 70 63 68 method loopch
2d70: 65 63 6b 20 7b 7d 20 7b 0a 09 6c 6f 67 20 77 72 eck {} {..log wr
2d80: 69 74 65 20 37 20 63 73 65 74 73 20 7b 43 68 65 ite 7 csets {Che
2d90: 63 6b 69 6e 67 20 5b 24 73 65 6c 66 20 73 74 72 cking [$self str
2da0: 5d 20 2f 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 69 ] /[llength $myi
2db0: 74 65 6d 73 5d 7d 0a 0a 09 69 66 20 7b 21 5b 73 tems]}...if {![s
2dc0: 74 72 75 63 74 3a 3a 73 65 74 20 63 6f 6e 74 61 truct::set conta
2dd0: 69 6e 73 20 5b 24 73 65 6c 66 20 73 75 63 63 65 ins [$self succe
2de0: 73 73 6f 72 73 5d 20 24 73 65 6c 66 5d 7d 20 7b ssors] $self]} {
2df0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 30 0a 09 .. return 0..
2e00: 7d 0a 09 69 66 20 7b 5b 6c 6f 67 20 76 65 72 62 }..if {[log verb
2e10: 6f 73 69 74 79 3f 5d 20 3c 20 38 7d 20 7b 20 72 osity?] < 8} { r
2e20: 65 74 75 72 6e 20 31 20 7d 0a 0a 09 23 20 50 72 eturn 1 }...# Pr
2e30: 69 6e 74 20 74 68 65 20 64 65 74 61 69 6c 65 64 int the detailed
2e40: 20 73 75 63 63 65 73 73 6f 72 20 73 74 72 75 63 successor struc
2e50: 74 75 72 65 20 6f 66 20 74 68 65 20 73 65 6c 66 ture of the self
2e60: 2d 0a 09 23 20 72 65 66 65 72 65 6e 74 69 61 6c -..# referential
2e70: 20 63 68 61 6e 67 65 73 65 74 2c 20 69 66 20 74 changeset, if t
2e80: 68 65 20 76 65 72 62 6f 73 69 74 79 20 6f 66 20 he verbosity of
2e90: 74 68 65 20 6c 6f 67 20 69 73 20 64 69 61 6c 65 the log is diale
2ea0: 64 0a 09 23 20 68 69 67 68 20 65 6e 6f 75 67 68 d..# high enough
2eb0: 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 38 20 ....log write 8
2ec0: 63 73 65 74 73 20 5b 73 65 74 20 68 64 72 20 7b csets [set hdr {
2ed0: 53 65 6c 66 2d 72 65 66 65 72 65 6e 74 69 61 6c Self-referential
2ee0: 20 63 68 61 6e 67 65 73 65 74 20 5b 24 73 65 6c changeset [$sel
2ef0: 66 20 73 74 72 5d 20 5f 5f 5f 5f 5f 5f 5f 5f 5f f str] _________
2f00: 5f 5f 5f 5f 5f 5f 5f 5f 5f 7d 5d 0a 09 61 72 72 _________}]..arr
2f10: 61 79 20 73 65 74 20 6e 6d 61 70 20 5b 24 73 65 ay set nmap [$se
2f20: 6c 66 20 6e 65 78 74 6d 61 70 5d 0a 09 66 6f 72 lf nextmap]..for
2f30: 65 61 63 68 20 69 74 65 6d 20 5b 6c 73 6f 72 74 each item [lsort
2f40: 20 2d 64 69 63 74 20 5b 61 72 72 61 79 20 6e 61 -dict [array na
2f50: 6d 65 73 20 6e 6d 61 70 5d 5d 20 7b 0a 09 20 20 mes nmap]] {..
2f60: 20 20 66 6f 72 65 61 63 68 20 73 75 63 63 69 74 foreach succit
2f70: 65 6d 20 24 6e 6d 61 70 28 24 69 74 65 6d 29 20 em $nmap($item)
2f80: 7b 0a 09 09 73 65 74 20 73 75 63 63 63 73 20 24 {...set succcs $
2f90: 6d 79 69 74 65 6d 6d 61 70 28 24 73 75 63 63 69 myitemmap($succi
2fa0: 74 65 6d 29 0a 09 09 73 65 74 20 68 69 6e 74 20 tem)...set hint
2fb0: 5b 65 78 70 72 20 7b 28 24 73 75 63 63 63 73 20 [expr {($succcs
2fc0: 65 71 20 24 73 65 6c 66 29 0a 09 09 09 09 3f 20 eq $self).....?
2fd0: 22 4c 4f 4f 50 22 0a 09 09 09 09 3a 20 22 20 20 "LOOP".....: "
2fe0: 20 20 22 7d 5d 0a 09 09 73 65 74 20 69 20 20 20 "}]...set i
2ff0: 22 3c 24 69 74 65 6d 20 5b 24 74 79 70 65 20 69 "<$item [$type i
3000: 74 65 6d 73 74 72 20 24 69 74 65 6d 5d 3e 22 0a temstr $item]>".
3010: 09 09 73 65 74 20 73 20 20 20 22 3c 24 73 75 63 ..set s "<$suc
3020: 63 69 74 65 6d 20 5b 24 74 79 70 65 20 69 74 65 citem [$type ite
3030: 6d 73 74 72 20 24 73 75 63 63 69 74 65 6d 5d 3e mstr $succitem]>
3040: 22 0a 09 09 73 65 74 20 73 63 73 20 5b 24 73 75 "...set scs [$su
3050: 63 63 63 73 20 73 74 72 5d 0a 09 09 6c 6f 67 20 cccs str]...log
3060: 77 72 69 74 65 20 38 20 63 73 65 74 73 20 7b 24 write 8 csets {$
3070: 68 69 6e 74 20 2a 20 24 69 20 2d 2d 3e 20 24 73 hint * $i --> $s
3080: 20 2d 2d 3e 20 63 73 20 24 73 63 73 7d 0a 09 20 --> cs $scs}..
3090: 20 20 20 7d 0a 09 7d 0a 09 6c 6f 67 20 77 72 69 }..}..log wri
30a0: 74 65 20 38 20 63 73 65 74 73 20 5b 72 65 67 73 te 8 csets [regs
30b0: 75 62 20 2d 61 6c 6c 20 7b 5b 5e 20 09 5d 7d 20 ub -all {[^ .]}
30c0: 24 68 64 72 20 7b 5f 7d 5d 0a 09 72 65 74 75 72 $hdr {_}]..retur
30d0: 6e 20 31 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 n 1. }.. t
30e0: 79 70 65 6d 65 74 68 6f 64 20 73 70 6c 69 74 20 ypemethod split
30f0: 7b 63 73 65 74 20 61 72 67 73 7d 20 7b 0a 09 23 {cset args} {..#
3100: 20 41 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 As part of the
3110: 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 creation of the
3120: 6e 65 77 20 63 68 61 6e 67 65 73 65 74 73 20 73 new changesets s
3130: 70 65 63 69 66 69 65 64 20 69 6e 0a 09 23 20 41 pecified in..# A
3140: 52 47 53 20 61 73 20 73 65 74 73 20 6f 66 20 69 RGS as sets of i
3150: 74 65 6d 73 2c 20 61 6c 6c 20 73 75 62 73 65 74 tems, all subset
3160: 73 20 6f 66 20 43 53 45 54 27 73 20 69 74 65 6d s of CSET's item
3170: 20 73 65 74 2c 20 43 53 45 54 0a 09 23 20 77 69 set, CSET..# wi
3180: 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 ll be dropped fr
3190: 6f 6d 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 om all databases
31a0: 2c 20 69 6e 20 61 6e 64 20 6f 75 74 20 6f 66 20 , in and out of
31b0: 6d 65 6d 6f 72 79 2c 0a 09 23 20 61 6e 64 20 74 memory,..# and t
31c0: 68 65 6e 20 64 65 73 74 72 6f 79 65 64 2e 0a 09 hen destroyed...
31d0: 23 0a 09 23 20 4e 6f 74 65 3a 20 54 68 65 20 69 #..# Note: The i
31e0: 74 65 6d 20 6c 69 73 74 73 20 66 6f 75 6e 64 20 tem lists found
31f0: 69 6e 20 61 72 67 73 20 61 72 65 20 74 61 67 67 in args are tagg
3200: 65 64 20 69 74 65 6d 73 2e 20 54 68 65 79 0a 09 ed items. They..
3210: 23 20 68 61 76 65 20 74 6f 20 68 61 76 65 20 74 # have to have t
3220: 68 65 20 73 61 6d 65 20 74 79 70 65 20 61 73 20 he same type as
3230: 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20 62 the changeset, b
3240: 65 69 6e 67 20 73 75 62 73 65 74 73 0a 09 23 20 eing subsets..#
3250: 6f 66 20 69 74 73 20 69 74 65 6d 73 2e 20 54 68 of its items. Th
3260: 69 73 20 69 73 20 63 68 65 63 6b 65 64 20 69 6e is is checked in
3270: 20 55 6e 74 61 67 31 2e 0a 0a 09 6c 6f 67 20 77 Untag1....log w
3280: 72 69 74 65 20 38 20 63 73 65 74 73 20 7b 4f 4c rite 8 csets {OL
3290: 44 3a 20 5b 6c 73 6f 72 74 20 5b 24 63 73 65 74 D: [lsort [$cset
32a0: 20 69 74 65 6d 73 5d 5d 7d 0a 09 56 61 6c 69 64 items]]}..Valid
32b0: 61 74 65 46 72 61 67 6d 65 6e 74 73 20 24 63 73 ateFragments $cs
32c0: 65 74 20 24 61 72 67 73 0a 0a 09 23 20 41 6c 6c et $args...# All
32d0: 20 63 68 65 63 6b 73 20 70 61 73 73 2c 20 61 63 checks pass, ac
32e0: 74 75 61 6c 6c 79 20 70 65 72 66 6f 72 6d 20 74 tually perform t
32f0: 68 65 20 73 70 6c 69 74 2e 0a 0a 09 73 74 72 75 he split....stru
3300: 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 ct::list assign
3310: 5b 24 63 73 65 74 20 64 61 74 61 5d 20 70 72 6f [$cset data] pro
3320: 6a 65 63 74 20 63 73 74 79 70 65 20 63 73 73 72 ject cstype cssr
3330: 63 0a 0a 09 24 63 73 65 74 20 64 72 6f 70 0a 09 c...$cset drop..
3340: 24 63 73 65 74 20 64 65 73 74 72 6f 79 0a 0a 09 $cset destroy...
3350: 73 65 74 20 6e 65 77 63 73 65 74 73 20 7b 7d 0a set newcsets {}.
3360: 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65 6e .foreach fragmen
3370: 74 69 74 65 6d 73 20 24 61 72 67 73 20 7b 0a 09 titems $args {..
3380: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 38 20 log write 8
3390: 63 73 65 74 73 20 7b 4d 41 4b 45 3a 20 5b 6c 73 csets {MAKE: [ls
33a0: 6f 72 74 20 24 66 72 61 67 6d 65 6e 74 69 74 65 ort $fragmentite
33b0: 6d 73 5d 7d 0a 0a 09 20 20 20 20 73 65 74 20 66 ms]}... set f
33c0: 72 61 67 6d 65 6e 74 20 5b 24 74 79 70 65 20 25 ragment [$type %
33d0: 41 55 54 4f 25 20 24 70 72 6f 6a 65 63 74 20 24 AUTO% $project $
33e0: 63 73 74 79 70 65 20 24 63 73 73 72 63 20 5c 0a cstype $cssrc \.
33f0: 09 09 09 20 20 20 20 20 20 5b 55 6e 74 61 67 20 ... [Untag
3400: 24 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 20 24 $fragmentitems $
3410: 63 73 74 79 70 65 5d 5d 0a 09 20 20 20 20 6c 61 cstype]].. la
3420: 70 70 65 6e 64 20 6e 65 77 63 73 65 74 73 20 24 ppend newcsets $
3430: 66 72 61 67 6d 65 6e 74 0a 09 20 20 20 20 24 66 fragment.. $f
3440: 72 61 67 6d 65 6e 74 20 70 65 72 73 69 73 74 0a ragment persist.
3450: 0a 09 20 20 20 20 69 66 20 7b 5b 24 66 72 61 67 .. if {[$frag
3460: 6d 65 6e 74 20 6c 6f 6f 70 63 68 65 63 6b 5d 7d ment loopcheck]}
3470: 20 7b 0a 09 09 74 72 6f 75 62 6c 65 20 66 61 74 {...trouble fat
3480: 61 6c 20 22 5b 24 66 72 61 67 6d 65 6e 74 20 73 al "[$fragment s
3490: 74 72 5d 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 tr] depends on i
34a0: 74 73 65 6c 66 22 0a 09 20 20 20 20 7d 0a 09 7d tself".. }..}
34b0: 0a 0a 09 74 72 6f 75 62 6c 65 20 61 62 6f 72 74 ...trouble abort
34c0: 3f 0a 09 72 65 74 75 72 6e 20 24 6e 65 77 63 73 ?..return $newcs
34d0: 65 74 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 ets. }.. t
34e0: 79 70 65 6d 65 74 68 6f 64 20 69 74 65 6d 73 74 ypemethod itemst
34f0: 72 20 7b 69 74 65 6d 7d 20 7b 0a 09 73 74 72 75 r {item} {..stru
3500: 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 ct::list assign
3510: 24 69 74 65 6d 20 69 74 79 70 65 20 69 69 64 0a $item itype iid.
3520: 09 72 65 74 75 72 6e 20 5b 24 69 74 79 70 65 20 .return [$itype
3530: 73 74 72 20 24 69 69 64 5d 0a 20 20 20 20 7d 0a str $iid]. }.
3540: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 . typemethod
3550: 73 74 72 6c 69 73 74 20 7b 63 68 61 6e 67 65 73 strlist {changes
3560: 65 74 73 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b ets} {..return [
3570: 6a 6f 69 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69 join [struct::li
3580: 73 74 20 6d 61 70 20 24 63 68 61 6e 67 65 73 65 st map $changese
3590: 74 73 20 5b 6d 79 70 72 6f 63 20 49 44 5d 5d 5d ts [myproc ID]]]
35a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 . }.. proc
35b0: 20 49 44 20 7b 63 73 65 74 7d 20 7b 20 24 63 73 ID {cset} { $cs
35c0: 65 74 20 73 74 72 20 7d 0a 0a 20 20 20 20 70 72 et str }.. pr
35d0: 6f 63 20 55 6e 74 61 67 20 7b 74 61 67 67 65 64 oc Untag {tagged
35e0: 69 74 65 6d 73 20 63 73 74 79 70 65 7d 20 7b 0a items cstype} {.
35f0: 09 72 65 74 75 72 6e 20 5b 73 74 72 75 63 74 3a .return [struct:
3600: 3a 6c 69 73 74 20 6d 61 70 20 24 74 61 67 67 65 :list map $tagge
3610: 64 69 74 65 6d 73 20 5b 6d 79 70 72 6f 63 20 55 ditems [myproc U
3620: 6e 74 61 67 31 20 24 63 73 74 79 70 65 5d 5d 0a ntag1 $cstype]].
3630: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 }.. proc
3640: 55 6e 74 61 67 31 20 7b 63 73 74 79 70 65 20 74 Untag1 {cstype t
3650: 68 65 69 74 65 6d 7d 20 7b 0a 09 73 74 72 75 63 heitem} {..struc
3660: 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 24 t::list assign $
3670: 74 68 65 69 74 65 6d 20 74 20 69 0a 09 69 6e 74 theitem t i..int
3680: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24 egrity assert {$
3690: 63 73 74 79 70 65 20 65 71 20 24 74 7d 20 7b 49 cstype eq $t} {I
36a0: 74 65 6d 20 24 69 27 73 20 74 79 70 65 20 69 73 tem $i's type is
36b0: 20 27 24 74 27 2c 20 65 78 70 65 63 74 65 64 20 '$t', expected
36c0: 27 24 63 73 74 79 70 65 27 7d 0a 09 72 65 74 75 '$cstype'}..retu
36d0: 72 6e 20 24 69 0a 20 20 20 20 7d 0a 0a 20 20 20 rn $i. }..
36e0: 20 70 72 6f 63 20 56 61 6c 69 64 61 74 65 46 72 proc ValidateFr
36f0: 61 67 6d 65 6e 74 73 20 7b 63 73 65 74 20 66 72 agments {cset fr
3700: 61 67 6d 65 6e 74 73 7d 20 7b 0a 09 23 20 43 68 agments} {..# Ch
3710: 65 63 6b 20 74 68 65 20 76 61 72 69 6f 75 73 20 eck the various
3720: 69 6e 74 65 67 72 69 74 79 20 63 6f 6e 73 74 72 integrity constr
3730: 61 69 6e 74 73 20 66 6f 72 20 74 68 65 20 66 72 aints for the fr
3740: 61 67 6d 65 6e 74 73 0a 09 23 20 73 70 65 63 69 agments..# speci
3750: 66 79 69 6e 67 20 68 6f 77 20 74 6f 20 73 70 6c fying how to spl
3760: 69 74 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 it the changeset
3770: 3a 0a 09 23 0a 09 23 20 2a 20 57 65 20 6d 75 73 :..#..# * We mus
3780: 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f t have two or mo
3790: 72 65 20 66 72 61 67 6d 65 6e 74 73 2c 20 61 73 re fragments, as
37a0: 20 73 70 6c 69 74 74 69 6e 67 20 61 0a 09 23 20 splitting a..#
37b0: 20 20 63 68 61 6e 67 65 73 65 74 20 69 6e 74 6f changeset into
37c0: 20 6f 6e 65 20 6d 61 6b 65 73 20 6e 6f 20 73 65 one makes no se
37d0: 6e 73 65 2e 0a 09 23 20 2a 20 4e 6f 20 66 72 61 nse...# * No fra
37e0: 67 6d 65 6e 74 20 6d 61 79 20 62 65 20 65 6d 70 gment may be emp
37f0: 74 79 2e 0a 09 23 20 2a 20 41 6c 6c 20 66 72 61 ty...# * All fra
3800: 67 6d 65 6e 74 73 20 68 61 76 65 20 74 6f 20 62 gments have to b
3810: 65 20 74 72 75 65 20 73 75 62 73 65 74 73 20 6f e true subsets o
3820: 66 20 74 68 65 20 69 74 65 6d 73 20 69 6e 20 74 f the items in t
3830: 68 65 0a 09 23 20 20 20 63 68 61 6e 67 65 73 65 he..# changese
3840: 74 20 74 6f 20 73 70 6c 69 74 2e 20 54 68 65 20 t to split. The
3850: 27 74 72 75 65 27 20 69 73 20 69 6d 70 6c 69 65 'true' is implie
3860: 64 20 62 65 63 61 75 73 65 20 6e 6f 6e 65 20 61 d because none a
3870: 72 65 0a 09 23 20 20 20 61 6c 6c 6f 77 65 64 20 re..# allowed
3880: 74 6f 20 62 65 20 65 6d 70 74 79 2c 20 73 6f 20 to be empty, so
3890: 65 61 63 68 20 68 61 73 20 74 6f 20 62 65 20 73 each has to be s
38a0: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 0a maller than the.
38b0: 09 23 20 20 20 74 6f 74 61 6c 2e 0a 09 23 20 2a .# total...# *
38c0: 20 54 68 65 20 75 6e 69 6f 6e 20 6f 66 20 74 68 The union of th
38d0: 65 20 66 72 61 67 6d 65 6e 74 73 20 68 61 73 20 e fragments has
38e0: 74 6f 20 62 65 20 74 68 65 20 69 74 65 6d 20 73 to be the item s
38f0: 65 74 20 6f 66 20 74 68 65 0a 09 23 20 20 20 63 et of the..# c
3900: 68 61 6e 67 65 73 65 74 2e 0a 09 23 20 2a 20 54 hangeset...# * T
3910: 68 65 20 66 72 61 67 6d 65 6e 74 20 6d 75 73 74 he fragment must
3920: 20 6e 6f 74 20 6f 76 65 72 6c 61 70 2c 20 69 2e not overlap, i.
3930: 65 2e 20 74 68 65 69 72 20 70 61 69 72 77 69 73 e. their pairwis
3940: 65 0a 09 23 20 20 20 69 6e 74 65 72 73 65 63 74 e..# intersect
3950: 69 6f 6e 73 20 68 61 76 65 20 74 6f 20 62 65 20 ions have to be
3960: 65 6d 70 74 79 2e 0a 0a 09 73 65 74 20 63 6f 76 empty....set cov
3970: 65 72 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 66 er {}..foreach f
3980: 72 61 67 6d 65 6e 74 69 74 65 6d 73 20 24 61 72 ragmentitems $ar
3990: 67 73 20 7b 0a 09 20 20 20 20 6c 6f 67 20 77 72 gs {.. log wr
39a0: 69 74 65 20 38 20 63 73 65 74 73 20 7b 4e 45 57 ite 8 csets {NEW
39b0: 3a 20 5b 6c 73 6f 72 74 20 24 66 72 61 67 6d 65 : [lsort $fragme
39c0: 6e 74 69 74 65 6d 73 5d 7d 0a 0a 09 20 20 20 20 ntitems]}...
39d0: 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 integrity assert
39e0: 20 7b 0a 09 09 21 5b 73 74 72 75 63 74 3a 3a 73 {...![struct::s
39f0: 65 74 20 65 6d 70 74 79 20 24 66 72 61 67 6d 65 et empty $fragme
3a00: 6e 74 69 74 65 6d 73 5d 0a 09 20 20 20 20 7d 20 ntitems].. }
3a10: 7b 63 68 61 6e 67 65 73 65 74 20 66 72 61 67 6d {changeset fragm
3a20: 65 6e 74 20 69 73 20 65 6d 70 74 79 7d 0a 0a 09 ent is empty}...
3a30: 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 integrity as
3a40: 73 65 72 74 20 7b 0a 09 09 5b 73 74 72 75 63 74 sert {...[struct
3a50: 3a 3a 73 65 74 20 73 75 62 73 65 74 6f 66 20 24 ::set subsetof $
3a60: 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 20 5b 24 fragmentitems [$
3a70: 63 73 65 74 20 69 74 65 6d 73 5d 5d 0a 09 20 20 cset items]]..
3a80: 20 20 7d 20 7b 63 68 61 6e 67 65 73 65 74 20 66 } {changeset f
3a90: 72 61 67 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61 ragment is not a
3aa0: 20 73 75 62 73 65 74 7d 0a 09 20 20 20 20 73 74 subset}.. st
3ab0: 72 75 63 74 3a 3a 73 65 74 20 61 64 64 20 63 6f ruct::set add co
3ac0: 76 65 72 20 24 66 72 61 67 6d 65 6e 74 69 74 65 ver $fragmentite
3ad0: 6d 73 0a 09 7d 0a 0a 09 69 6e 74 65 67 72 69 74 ms..}...integrit
3ae0: 79 20 61 73 73 65 72 74 20 7b 0a 09 20 20 20 20 y assert {..
3af0: 5b 73 74 72 75 63 74 3a 3a 73 65 74 20 65 71 75 [struct::set equ
3b00: 61 6c 20 24 63 6f 76 65 72 20 5b 24 63 73 65 74 al $cover [$cset
3b10: 20 69 74 65 6d 73 5d 5d 0a 09 20 7d 20 7b 54 68 items]].. } {Th
3b20: 65 20 66 72 61 67 6d 65 6e 74 73 20 64 6f 20 6e e fragments do n
3b30: 6f 74 20 63 6f 76 65 72 20 74 68 65 20 6f 72 69 ot cover the ori
3b40: 67 69 6e 61 6c 20 63 68 61 6e 67 65 73 65 74 7d ginal changeset}
3b50: 0a 0a 09 73 65 74 20 69 20 31 0a 09 66 6f 72 65 ...set i 1..fore
3b60: 61 63 68 20 66 69 61 20 24 61 72 67 73 20 7b 0a ach fia $args {.
3b70: 09 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 62 . foreach fib
3b80: 20 5b 6c 72 61 6e 67 65 20 24 61 72 67 73 20 24 [lrange $args $
3b90: 69 20 65 6e 64 5d 20 7b 0a 09 09 69 6e 74 65 67 i end] {...integ
3ba0: 72 69 74 79 20 61 73 73 65 72 74 20 7b 0a 09 09 rity assert {...
3bb0: 20 20 20 20 5b 73 74 72 75 63 74 3a 3a 73 65 74 [struct::set
3bc0: 20 65 6d 70 74 79 20 5b 73 74 72 75 63 74 3a 3a empty [struct::
3bd0: 73 65 74 20 69 6e 74 65 72 73 65 63 74 20 24 66 set intersect $f
3be0: 69 61 20 24 66 69 62 5d 5d 0a 09 09 7d 20 7b 54 ia $fib]]...} {T
3bf0: 68 65 20 66 72 61 67 6d 65 6e 74 73 20 3c 24 66 he fragments <$f
3c00: 69 61 3e 20 61 6e 64 20 3c 24 66 69 62 3e 20 6f ia> and <$fib> o
3c10: 76 65 72 6c 61 70 7d 0a 09 20 20 20 20 7d 0a 09 verlap}.. }..
3c20: 20 20 20 20 69 6e 63 72 20 69 0a 09 7d 0a 0a 09 incr i..}...
3c30: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 return. }..
3c40: 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 # # ## ### ###
3c50: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 ## ######## ####
3c60: 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 #########. ##
3c70: 20 53 74 61 74 65 0a 0a 20 20 20 20 76 61 72 69 State.. vari
3c80: 61 62 6c 65 20 6d 79 69 64 20 20 20 20 20 20 20 able myid
3c90: 20 7b 7d 20 3b 20 23 20 49 64 20 6f 66 20 74 68 {} ; # Id of th
3ca0: 65 20 63 73 65 74 20 66 6f 72 20 74 68 65 20 70 e cset for the p
3cb0: 65 72 73 69 73 74 65 6e 74 0a 09 09 09 20 20 20 ersistent....
3cc0: 20 20 20 23 20 73 74 61 74 65 2e 0a 20 20 20 20 # state..
3cd0: 76 61 72 69 61 62 6c 65 20 6d 79 70 72 6f 6a 65 variable myproje
3ce0: 63 74 20 20 20 7b 7d 20 3b 20 23 20 52 65 66 65 ct {} ; # Refe
3cf0: 72 65 6e 63 65 20 6f 66 20 74 68 65 20 70 72 6f rence of the pro
3d00: 6a 65 63 74 20 6f 62 6a 65 63 74 20 74 68 65 0a ject object the.
3d10: 09 09 09 20 20 20 20 20 20 23 20 63 68 61 6e 67 ... # chang
3d20: 65 73 65 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2e eset belongs to.
3d30: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 . variable my
3d40: 74 79 70 65 20 20 20 20 20 20 7b 7d 20 3b 20 23 type {} ; #
3d50: 20 57 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 What the change
3d60: 73 65 74 20 69 73 20 62 61 73 65 64 20 6f 6e 0a set is based on.
3d70: 09 09 09 20 20 20 20 20 20 23 20 28 72 65 76 69 ... # (revi
3d80: 73 69 6f 6e 73 2c 20 74 61 67 73 2c 20 6f 72 20 sions, tags, or
3d90: 62 72 61 6e 63 68 65 73 29 2e 0a 09 09 09 20 20 branches).....
3da0: 20 20 20 20 23 20 56 61 6c 75 65 73 3a 20 53 65 # Values: Se
3db0: 65 20 6d 79 63 73 74 79 70 65 2e 20 4e 6f 74 65 e mycstype. Note
3dc0: 20 74 68 61 74 20 77 65 0a 09 09 09 20 20 20 20 that we....
3dd0: 20 20 23 20 68 61 76 65 20 74 6f 20 6b 65 65 70 # have to keep
3de0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 the names of th
3df0: 65 20 68 65 6c 70 65 72 0a 09 09 09 20 20 20 20 e helper....
3e00: 20 20 23 20 73 69 6e 67 6c 65 74 6f 6e 73 20 69 # singletons i
3e10: 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 n sync with the
3e20: 63 6f 6e 74 65 6e 74 73 0a 09 09 09 20 20 20 20 contents....
3e30: 20 20 23 20 6f 66 20 73 74 61 74 65 20 74 61 62 # of state tab
3e40: 6c 65 20 27 63 73 74 79 70 65 27 2c 20 61 6e 64 le 'cstype', and
3e50: 20 76 61 72 69 6f 75 73 0a 09 09 09 20 20 20 20 various....
3e60: 20 20 23 20 6f 74 68 65 72 20 70 6c 61 63 65 73 # other places
3e70: 20 75 73 69 6e 67 20 74 68 65 6d 20 68 61 72 64 using them hard
3e80: 77 69 72 65 64 2e 0a 20 20 20 20 76 61 72 69 61 wired.. varia
3e90: 62 6c 65 20 6d 79 74 79 70 65 6f 62 6a 20 20 20 ble mytypeobj
3ea0: 7b 7d 20 3b 20 23 20 52 65 66 65 72 65 6e 63 65 {} ; # Reference
3eb0: 20 74 6f 20 74 68 65 20 63 6f 6e 74 61 69 6e 65 to the containe
3ec0: 72 20 66 6f 72 20 74 68 65 0a 09 09 09 20 20 20 r for the....
3ed0: 20 20 20 23 20 74 79 70 65 20 64 65 70 65 6e 64 # type depend
3ee0: 65 6e 74 20 63 6f 64 65 2e 20 44 65 72 69 76 65 ent code. Derive
3ef0: 64 20 66 72 6f 6d 0a 09 09 09 20 20 20 20 20 20 d from....
3f00: 23 20 6d 79 74 79 70 65 2e 0a 20 20 20 20 76 61 # mytype.. va
3f10: 72 69 61 62 6c 65 20 6d 79 73 72 63 69 64 20 20 riable mysrcid
3f20: 20 20 20 7b 7d 20 3b 20 23 20 49 64 20 6f 66 20 {} ; # Id of
3f30: 74 68 65 20 6d 65 74 61 64 61 74 61 20 6f 72 20 the metadata or
3f40: 73 79 6d 62 6f 6c 20 74 68 65 20 63 73 65 74 0a symbol the cset.
3f50: 09 09 09 20 20 20 20 20 20 23 20 69 73 20 62 61 ... # is ba
3f60: 73 65 64 20 6f 6e 2e 0a 20 20 20 20 76 61 72 69 sed on.. vari
3f70: 61 62 6c 65 20 6d 79 69 74 65 6d 73 20 20 20 20 able myitems
3f80: 20 7b 7d 20 3b 20 23 20 4c 69 73 74 20 6f 66 20 {} ; # List of
3f90: 74 68 65 20 66 69 6c 65 20 6c 65 76 65 6c 20 72 the file level r
3fa0: 65 76 69 73 69 6f 6e 73 2c 0a 09 09 09 20 20 20 evisions,....
3fb0: 20 20 20 23 20 74 61 67 73 2c 20 6f 72 20 62 72 # tags, or br
3fc0: 61 6e 63 68 65 73 20 69 6e 20 74 68 65 20 63 73 anches in the cs
3fd0: 65 74 2c 20 61 73 0a 09 09 09 20 20 20 20 20 20 et, as....
3fe0: 23 20 69 64 73 2e 20 4e 6f 74 20 74 61 67 67 65 # ids. Not tagge
3ff0: 64 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 d.. variable
4000: 6d 79 74 69 74 65 6d 73 20 20 20 20 7b 7d 20 3b mytitems {} ;
4010: 20 23 20 41 73 20 6d 79 69 74 65 6d 73 2c 20 74 # As myitems, t
4020: 68 65 20 74 61 67 67 65 64 20 66 6f 72 6d 2e 0a he tagged form..
4030: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 70 variable myp
4040: 72 65 6d 61 70 20 20 20 20 7b 7d 20 3b 20 23 20 remap {} ; #
4050: 44 69 63 74 69 6f 6e 61 72 79 20 6d 61 70 70 69 Dictionary mappi
4060: 6e 67 20 66 72 6f 6d 20 74 68 65 20 69 74 65 6d ng from the item
4070: 73 20 28 74 61 67 67 65 64 20 6e 6f 77 29 0a 09 s (tagged now)..
4080: 09 09 20 20 20 20 20 20 23 20 74 6f 20 74 68 65 .. # to the
4090: 69 72 20 70 72 65 64 65 63 65 73 73 6f 72 73 2c ir predecessors,
40a0: 20 61 6c 73 6f 20 74 61 67 67 65 64 2e 20 41 0a also tagged. A.
40b0: 09 09 09 20 20 20 20 20 20 23 20 63 61 63 68 65 ... # cache
40c0: 20 74 6f 20 61 76 6f 69 64 20 6c 6f 61 64 69 6e to avoid loadin
40d0: 67 20 74 68 69 73 20 66 72 6f 6d 20 74 68 65 0a g this from the.
40e0: 09 09 09 20 20 20 20 20 20 23 20 73 74 61 74 65 ... # state
40f0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 2e more than once.
4100: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 . variable my
4110: 6e 65 78 74 6d 61 70 20 20 20 7b 7d 20 3b 20 23 nextmap {} ; #
4120: 20 44 69 63 74 69 6f 6e 61 72 79 20 6d 61 70 70 Dictionary mapp
4130: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 69 74 65 ing from the ite
4140: 6d 73 20 28 74 61 67 67 65 64 29 0a 09 09 09 20 ms (tagged)....
4150: 20 20 20 20 20 23 20 74 6f 20 74 68 65 69 72 20 # to their
4160: 73 75 63 63 65 73 73 6f 72 73 20 28 61 6c 73 6f successors (also
4170: 20 74 61 67 67 65 64 29 2e 20 41 0a 09 09 09 20 tagged). A....
4180: 20 20 20 20 20 23 20 63 61 63 68 65 20 74 6f 20 # cache to
4190: 61 76 6f 69 64 20 6c 6f 61 64 69 6e 67 20 74 68 avoid loading th
41a0: 69 73 20 66 72 6f 6d 20 74 68 65 0a 09 09 09 20 is from the....
41b0: 20 20 20 20 20 23 20 73 74 61 74 65 20 6d 6f 72 # state mor
41c0: 65 20 74 68 61 6e 20 6f 6e 63 65 2e 0a 20 20 20 e than once..
41d0: 20 76 61 72 69 61 62 6c 65 20 6d 79 70 6f 73 20 variable mypos
41e0: 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 43 6f 6d {} ; # Com
41f0: 6d 69 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 mit position of
4200: 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20 69 the changeset, i
4210: 66 0a 09 09 09 20 20 20 20 20 20 23 20 6b 6e 6f f.... # kno
4220: 77 6e 2e 0a 0a 20 20 20 20 23 20 23 20 23 23 20 wn... # # ##
4230: 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 ### ##### ######
4240: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 ## #############
4250: 0a 20 20 20 20 23 23 20 49 6e 74 65 72 6e 61 6c . ## Internal
4260: 20 6d 65 74 68 6f 64 73 0a 0a 20 20 20 20 74 79 methods.. ty
4270: 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 6f 75 pevariable mycou
4280: 6e 74 65 72 20 20 20 20 20 20 20 20 30 20 3b 20 nter 0 ;
4290: 23 20 49 64 20 63 6f 75 6e 74 65 72 20 66 6f 72 # Id counter for
42a0: 20 63 73 65 74 73 2e 20 4c 61 73 74 20 69 64 0a csets. Last id.
42b0: 09 09 09 09 20 20 20 20 20 20 23 20 75 73 65 64 .... # used
42c0: 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62 .. typevariab
42d0: 6c 65 20 6d 79 63 73 74 79 70 65 20 2d 61 72 72 le mycstype -arr
42e0: 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 63 73 ay {} ; # Map cs
42f0: 74 79 70 65 73 20 28 6e 61 6d 65 73 29 20 74 6f types (names) to
4300: 20 70 65 72 73 69 73 74 65 6e 74 0a 09 09 09 09 persistent.....
4310: 20 20 20 20 20 20 23 20 69 64 73 2e 20 4e 6f 74 # ids. Not
4320: 65 20 74 68 61 74 20 77 65 20 68 61 76 65 20 74 e that we have t
4330: 6f 20 6b 65 65 70 0a 09 09 09 09 20 20 20 20 20 o keep.....
4340: 20 23 20 74 68 65 20 6e 61 6d 65 73 20 69 6e 20 # the names in
4350: 74 68 65 20 74 61 62 6c 65 20 27 63 73 74 79 70 the table 'cstyp
4360: 65 27 0a 09 09 09 09 20 20 20 20 20 20 23 20 69 e'..... # i
4370: 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 n sync with the
4380: 6e 61 6d 65 73 20 6f 66 20 74 68 65 0a 09 09 09 names of the....
4390: 09 20 20 20 20 20 20 23 20 68 65 6c 70 65 72 20 . # helper
43a0: 73 69 6e 67 6c 65 74 6f 6e 73 2e 0a 0a 20 20 20 singletons...
43b0: 20 74 79 70 65 6d 65 74 68 6f 64 20 67 65 74 63 typemethod getc
43c0: 73 74 79 70 65 73 20 7b 7d 20 7b 0a 09 66 6f 72 stypes {} {..for
43d0: 65 61 63 68 20 7b 74 69 64 20 6e 61 6d 65 7d 20 each {tid name}
43e0: 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 [state run {..
43f0: 20 20 53 45 4c 45 43 54 20 74 69 64 2c 20 6e 61 SELECT tid, na
4400: 6d 65 20 46 52 4f 4d 20 63 73 74 79 70 65 3b 0a me FROM cstype;.
4410: 09 7d 5d 20 7b 20 73 65 74 20 6d 79 63 73 74 79 .}] { set mycsty
4420: 70 65 28 24 6e 61 6d 65 29 20 24 74 69 64 20 7d pe($name) $tid }
4430: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a ..return. }..
4440: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c typemethod l
4450: 6f 61 64 63 6f 75 6e 74 65 72 20 7b 7d 20 7b 0a oadcounter {} {.
4460: 09 23 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 .# Initialize th
4470: 65 20 63 6f 75 6e 74 65 72 20 66 72 6f 6d 20 74 e counter from t
4480: 68 65 20 73 74 61 74 65 0a 09 73 65 74 20 6d 79 he state..set my
4490: 63 6f 75 6e 74 65 72 20 5b 73 74 61 74 65 20 6f counter [state o
44a0: 6e 65 20 7b 20 53 45 4c 45 43 54 20 4d 41 58 28 ne { SELECT MAX(
44b0: 63 69 64 29 20 46 52 4f 4d 20 63 68 61 6e 67 65 cid) FROM change
44c0: 73 65 74 20 7d 5d 0a 09 72 65 74 75 72 6e 0a 20 set }]..return.
44d0: 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 }.. typeme
44e0: 74 68 6f 64 20 6e 75 6d 20 7b 7d 20 7b 20 72 65 thod num {} { re
44f0: 74 75 72 6e 20 24 6d 79 63 6f 75 6e 74 65 72 20 turn $mycounter
4500: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 49 6e 69 74 }.. proc Init
4510: 69 61 6c 69 7a 65 42 72 65 61 6b 53 74 61 74 65 ializeBreakState
4520: 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 {revisions} {..
4530: 75 70 76 61 72 20 31 20 70 6f 73 20 70 6f 73 20 upvar 1 pos pos
4540: 63 72 6f 73 73 20 63 72 6f 73 73 20 72 61 6e 67 cross cross rang
4550: 65 20 72 61 6e 67 65 20 64 65 70 63 20 64 65 70 e range depc dep
4560: 63 20 64 65 6c 74 61 20 64 65 6c 74 61 20 5c 0a c delta delta \.
4570: 09 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65 . dependencie
4580: 73 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 0a s dependencies..
4590: 09 23 20 46 69 72 73 74 20 77 65 20 63 72 65 61 .# First we crea
45a0: 74 65 20 61 20 6d 61 70 20 6f 66 20 70 6f 73 69 te a map of posi
45b0: 74 69 6f 6e 73 20 74 6f 20 6d 61 6b 65 20 69 74 tions to make it
45c0: 20 65 61 73 69 65 72 20 74 6f 0a 09 23 20 64 65 easier to..# de
45d0: 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 termine whether
45e0: 61 20 64 65 70 65 6e 64 65 6e 63 79 20 63 72 6f a dependency cro
45f0: 73 73 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 sses a particula
4600: 72 20 69 6e 64 65 78 2e 0a 0a 09 61 72 72 61 79 r index....array
4610: 20 73 65 74 20 70 6f 73 20 20 20 7b 7d 0a 09 61 set pos {}..a
4620: 72 72 61 79 20 73 65 74 20 63 72 6f 73 73 20 7b rray set cross {
4630: 7d 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 70 }..array set dep
4640: 63 20 20 7b 7d 0a 09 73 65 74 20 72 61 6e 67 65 c {}..set range
4650: 20 20 20 20 20 20 20 7b 7d 0a 09 73 65 74 20 6e {}..set n
4660: 20 30 0a 09 66 6f 72 65 61 63 68 20 72 65 76 20 0..foreach rev
4670: 24 72 65 76 69 73 69 6f 6e 73 20 7b 0a 09 20 20 $revisions {..
4680: 20 20 6c 61 70 70 65 6e 64 20 72 61 6e 67 65 20 lappend range
4690: 24 6e 0a 09 20 20 20 20 73 65 74 20 70 6f 73 28 $n.. set pos(
46a0: 24 72 65 76 29 20 24 6e 0a 09 20 20 20 20 73 65 $rev) $n.. se
46b0: 74 20 63 72 6f 73 73 28 24 6e 29 20 30 0a 09 20 t cross($n) 0..
46c0: 20 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 0a 09 23 incr n..}...#
46d0: 20 53 65 63 6f 6e 64 6c 79 20 77 65 20 63 6f 75 Secondly we cou
46e0: 6e 74 20 74 68 65 20 63 72 6f 73 73 69 6e 67 73 nt the crossings
46f0: 20 70 65 72 20 70 6f 73 69 74 69 6f 6e 2c 20 62 per position, b
4700: 79 20 69 74 65 72 61 74 69 6e 67 0a 09 23 20 6f y iterating..# o
4710: 76 65 72 20 74 68 65 20 72 65 63 6f 72 64 65 64 ver the recorded
4720: 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 internal depend
4730: 65 6e 63 69 65 73 2e 0a 0a 09 23 20 4e 6f 74 65 encies....# Note
4740: 3a 20 49 66 20 74 68 65 20 74 69 6d 65 73 74 61 : If the timesta
4750: 6d 70 73 20 61 72 65 20 62 61 64 6c 79 20 6f 75 mps are badly ou
4760: 74 20 6f 66 20 6f 72 64 65 72 20 69 74 20 69 73 t of order it is
4770: 0a 09 23 20 20 20 20 20 20 20 70 6f 73 73 69 62 ..# possib
4780: 6c 65 20 74 6f 20 68 61 76 65 20 61 20 62 61 63 le to have a bac
4790: 6b 77 61 72 64 20 73 75 63 63 65 73 73 6f 72 20 kward successor
47a0: 64 65 70 65 6e 64 65 6e 63 79 2c 0a 09 23 20 20 dependency,..#
47b0: 20 20 20 20 20 69 2e 65 2e 20 77 69 74 68 20 73 i.e. with s
47c0: 74 61 72 74 20 3e 20 65 6e 64 2e 20 57 65 20 6d tart > end. We m
47d0: 61 79 20 68 61 76 65 20 74 6f 20 73 77 61 70 20 ay have to swap
47e0: 74 68 65 20 69 6e 64 69 63 65 73 0a 09 23 20 20 the indices..#
47f0: 20 20 20 20 20 74 6f 20 65 6e 73 75 72 65 20 74 to ensure t
4800: 68 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e hat the followin
4810: 67 20 6c 6f 6f 70 20 72 75 6e 73 20 63 6f 72 72 g loop runs corr
4820: 65 63 74 6c 79 2e 0a 09 23 0a 09 23 20 4e 6f 74 ectly...#..# Not
4830: 65 20 32 3a 20 73 74 61 72 74 20 3d 3d 20 65 6e e 2: start == en
4840: 64 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c d is not possibl
4850: 65 2e 20 49 74 20 69 6e 64 69 63 61 74 65 73 20 e. It indicates
4860: 61 0a 09 23 20 20 20 20 20 20 20 20 20 73 65 6c a..# sel
4870: 66 2d 64 65 70 65 6e 64 65 6e 63 79 20 64 75 65 f-dependency due
4880: 20 74 6f 20 74 68 65 20 75 6e 69 71 75 65 6e 65 to the uniquene
4890: 73 73 20 6f 66 20 70 6f 73 69 74 69 6f 6e 73 2c ss of positions,
48a0: 0a 09 23 20 20 20 20 20 20 20 20 20 61 6e 64 20 ..# and
48b0: 74 68 61 74 20 69 73 20 73 6f 6d 65 74 68 69 6e that is somethin
48c0: 67 20 77 65 20 68 61 76 65 20 72 75 6c 65 64 20 g we have ruled
48d0: 6f 75 74 20 61 6c 72 65 61 64 79 2c 20 73 65 65 out already, see
48e0: 0a 09 23 20 20 20 20 20 20 20 20 20 27 72 65 76 ..# 'rev
48f0: 20 69 6e 74 65 72 6e 61 6c 73 75 63 63 65 73 73 internalsuccess
4900: 6f 72 73 27 2e 0a 0a 09 66 6f 72 65 61 63 68 20 ors'....foreach
4910: 7b 72 69 64 20 63 68 69 6c 64 72 65 6e 7d 20 5b {rid children} [
4920: 61 72 72 61 79 20 67 65 74 20 64 65 70 65 6e 64 array get depend
4930: 65 6e 63 69 65 73 5d 20 7b 0a 09 20 20 20 20 66 encies] {.. f
4940: 6f 72 65 61 63 68 20 63 68 69 6c 64 20 24 63 68 oreach child $ch
4950: 69 6c 64 72 65 6e 20 7b 0a 09 09 73 65 74 20 64 ildren {...set d
4960: 6b 65 79 20 20 20 20 5b 6c 69 73 74 20 24 72 69 key [list $ri
4970: 64 20 24 63 68 69 6c 64 5d 0a 09 09 73 65 74 20 d $child]...set
4980: 73 74 61 72 74 20 20 20 24 70 6f 73 28 24 72 69 start $pos($ri
4990: 64 29 0a 09 09 73 65 74 20 65 6e 64 20 20 20 20 d)...set end
49a0: 20 24 70 6f 73 28 24 63 68 69 6c 64 29 0a 09 09 $pos($child)...
49b0: 73 65 74 20 63 72 6f 73 73 65 73 20 7b 7d 0a 0a set crosses {}..
49c0: 09 09 69 66 20 7b 24 73 74 61 72 74 20 3e 20 24 ..if {$start > $
49d0: 65 6e 64 7d 20 7b 0a 09 09 20 20 20 20 77 68 69 end} {... whi
49e0: 6c 65 20 7b 24 65 6e 64 20 3c 20 24 73 74 61 72 le {$end < $star
49f0: 74 7d 20 7b 0a 09 09 09 6c 61 70 70 65 6e 64 20 t} {....lappend
4a00: 63 72 6f 73 73 65 73 20 24 65 6e 64 0a 09 09 09 crosses $end....
4a10: 69 6e 63 72 20 63 72 6f 73 73 28 24 65 6e 64 29 incr cross($end)
4a20: 0a 09 09 09 69 6e 63 72 20 65 6e 64 0a 09 09 20 ....incr end...
4a30: 20 20 20 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a }...} else {.
4a40: 09 09 20 20 20 20 77 68 69 6c 65 20 7b 24 73 74 .. while {$st
4a50: 61 72 74 20 3c 20 24 65 6e 64 7d 20 7b 0a 09 09 art < $end} {...
4a60: 09 6c 61 70 70 65 6e 64 20 63 72 6f 73 73 65 73 .lappend crosses
4a70: 20 24 73 74 61 72 74 0a 09 09 09 69 6e 63 72 20 $start....incr
4a80: 63 72 6f 73 73 28 24 73 74 61 72 74 29 0a 09 09 cross($start)...
4a90: 09 69 6e 63 72 20 73 74 61 72 74 0a 09 09 20 20 .incr start...
4aa0: 20 20 7d 0a 09 09 7d 0a 09 09 73 65 74 20 64 65 }...}...set de
4ab0: 70 63 28 24 64 6b 65 79 29 20 24 63 72 6f 73 73 pc($dkey) $cross
4ac0: 65 73 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 49 es.. }..}...I
4ad0: 6e 69 74 69 61 6c 69 7a 65 44 65 6c 74 61 73 20 nitializeDeltas
4ae0: 24 72 65 76 69 73 69 6f 6e 73 0a 09 72 65 74 75 $revisions..retu
4af0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 rn. }.. pr
4b00: 6f 63 20 49 6e 69 74 69 61 6c 69 7a 65 44 65 6c oc InitializeDel
4b10: 74 61 73 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 tas {revisions}
4b20: 7b 0a 09 75 70 76 61 72 20 31 20 64 65 6c 74 61 {..upvar 1 delta
4b30: 20 64 65 6c 74 61 0a 0a 09 23 20 50 75 6c 6c 20 delta...# Pull
4b40: 74 68 65 20 74 69 6d 65 73 74 61 6d 70 73 20 66 the timestamps f
4b50: 6f 72 20 61 6c 6c 20 72 65 76 69 73 69 6f 6e 73 or all revisions
4b60: 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 in the changese
4b70: 74 73 20 61 6e 64 0a 09 23 20 63 6f 6d 70 75 74 ts and..# comput
4b80: 65 20 74 68 65 69 72 20 64 65 6c 74 61 73 20 66 e their deltas f
4b90: 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 62 72 or use by the br
4ba0: 65 61 6b 20 66 69 6e 64 65 72 2e 0a 0a 09 61 72 eak finder....ar
4bb0: 72 61 79 20 73 65 74 20 64 65 6c 74 61 20 7b 7d ray set delta {}
4bc0: 0a 09 61 72 72 61 79 20 73 65 74 20 73 74 61 6d ..array set stam
4bd0: 70 20 7b 7d 0a 0a 09 73 65 74 20 74 68 65 73 65 p {}...set these
4be0: 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 t ('[join $revis
4bf0: 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66 ions {','}]')..f
4c00: 6f 72 65 61 63 68 20 7b 72 69 64 20 74 69 6d 65 oreach {rid time
4c10: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 } [state run "..
4c20: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 SELECT R.rid
4c30: 2c 20 52 2e 64 61 74 65 0a 09 20 20 20 20 46 52 , R.date.. FR
4c40: 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 OM revision R..
4c50: 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 49 WHERE R.rid I
4c60: 4e 20 24 74 68 65 73 65 74 0a 09 22 5d 20 7b 0a N $theset.."] {.
4c70: 09 20 20 20 20 73 65 74 20 73 74 61 6d 70 28 24 . set stamp($
4c80: 72 69 64 29 20 24 74 69 6d 65 0a 09 7d 0a 0a 09 rid) $time..}...
4c90: 73 65 74 20 6e 20 30 0a 09 66 6f 72 65 61 63 68 set n 0..foreach
4ca0: 20 72 69 64 20 5b 6c 72 61 6e 67 65 20 24 72 65 rid [lrange $re
4cb0: 76 69 73 69 6f 6e 73 20 30 20 65 6e 64 2d 31 5d visions 0 end-1]
4cc0: 20 72 6e 65 78 74 20 5b 6c 72 61 6e 67 65 20 24 rnext [lrange $
4cd0: 72 65 76 69 73 69 6f 6e 73 20 31 20 65 6e 64 5d revisions 1 end]
4ce0: 20 7b 0a 09 20 20 20 20 73 65 74 20 64 65 6c 74 {.. set delt
4cf0: 61 28 24 6e 29 20 5b 65 78 70 72 20 7b 24 73 74 a($n) [expr {$st
4d00: 61 6d 70 28 24 72 6e 65 78 74 29 20 2d 20 24 73 amp($rnext) - $s
4d10: 74 61 6d 70 28 24 72 69 64 29 7d 5d 0a 09 20 20 tamp($rid)}]..
4d20: 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 09 72 65 74 incr n..}..ret
4d30: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 urn. }.. p
4d40: 72 6f 63 20 46 69 6e 64 42 65 73 74 42 72 65 61 roc FindBestBrea
4d50: 6b 20 7b 72 61 6e 67 65 7d 20 7b 0a 09 75 70 76 k {range} {..upv
4d60: 61 72 20 31 20 63 72 6f 73 73 20 63 72 6f 73 73 ar 1 cross cross
4d70: 20 64 65 6c 74 61 20 64 65 6c 74 61 0a 0a 09 23 delta delta...#
4d80: 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 Determine the b
4d90: 65 73 74 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 est break locati
4da0: 6f 6e 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 on in the given
4db0: 72 61 6e 67 65 20 6f 66 0a 09 23 20 70 6f 73 69 range of..# posi
4dc0: 74 69 6f 6e 73 2e 20 46 69 72 73 74 20 77 65 20 tions. First we
4dd0: 6c 6f 6f 6b 20 66 6f 72 20 74 68 65 20 6c 6f 63 look for the loc
4de0: 61 74 69 6f 6e 73 20 77 69 74 68 20 74 68 65 20 ations with the
4df0: 6d 61 78 69 6d 61 6c 0a 09 23 20 6e 75 6d 62 65 maximal..# numbe
4e00: 72 20 6f 66 20 63 72 6f 73 73 69 6e 67 73 2e 20 r of crossings.
4e10: 49 66 20 74 68 65 72 65 20 61 72 65 20 73 65 76 If there are sev
4e20: 65 72 61 6c 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 eral we look for
4e30: 20 74 68 65 0a 09 23 20 73 68 6f 72 74 65 73 74 the..# shortest
4e40: 20 74 69 6d 65 20 69 6e 74 65 72 76 61 6c 20 61 time interval a
4e50: 6d 6f 6e 67 20 74 68 65 6d 2e 20 49 66 20 77 65 mong them. If we
4e60: 20 73 74 69 6c 6c 20 68 61 76 65 20 6d 75 6c 74 still have mult
4e70: 69 70 6c 65 0a 09 23 20 70 6f 73 73 69 62 69 6c iple..# possibil
4e80: 69 74 69 65 73 20 61 66 74 65 72 20 74 68 61 74 ities after that
4e90: 20 77 65 20 73 65 6c 65 63 74 20 74 68 65 20 65 we select the e
4ea0: 61 72 6c 69 65 73 74 20 6c 6f 63 61 74 69 6f 6e arliest location
4eb0: 0a 09 23 20 61 6d 6f 6e 67 20 74 68 65 73 65 2e ..# among these.
4ec0: 0a 0a 09 23 20 4e 6f 74 65 3a 20 49 66 20 74 68 ...# Note: If th
4ed0: 65 20 6d 61 78 69 6d 61 6c 20 6e 75 6d 62 65 72 e maximal number
4ee0: 20 6f 66 20 63 72 6f 73 73 69 6e 67 73 20 69 73 of crossings is
4ef0: 20 30 20 74 68 65 6e 20 74 68 65 20 72 61 6e 67 0 then the rang
4f00: 65 0a 09 23 20 20 20 20 20 20 20 68 61 73 20 6e e..# has n
4f10: 6f 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e o internal depen
4f20: 64 65 6e 63 69 65 73 2c 20 61 6e 64 20 6e 6f 20 dencies, and no
4f30: 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 61 break location a
4f40: 74 0a 09 23 20 20 20 20 20 20 20 61 6c 6c 2e 20 t..# all.
4f50: 54 68 69 73 20 70 6f 73 73 69 62 69 6c 69 74 79 This possibility
4f60: 20 69 73 20 73 69 67 6e 61 6c 65 64 20 76 69 61 is signaled via
4f70: 20 72 65 73 75 6c 74 20 2d 31 2e 0a 0a 09 23 20 result -1....#
4f80: 4e 6f 74 65 3a 20 41 20 72 61 6e 67 65 20 6f 66 Note: A range of
4f90: 20 6c 65 6e 67 74 68 20 31 20 6f 72 20 6c 65 73 length 1 or les
4fa0: 73 20 63 61 6e 6e 6f 74 20 68 61 76 65 20 69 6e s cannot have in
4fb0: 74 65 72 6e 61 6c 0a 09 23 20 20 20 20 20 20 20 ternal..#
4fc0: 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 dependencies, as
4fd0: 20 74 68 61 74 20 6e 65 65 64 73 20 61 74 20 6c that needs at l
4fe0: 65 61 73 74 20 74 77 6f 20 72 65 76 69 73 69 6f east two revisio
4ff0: 6e 73 20 69 6e 0a 09 23 20 20 20 20 20 20 20 74 ns in..# t
5000: 68 65 20 72 61 6e 67 65 2e 0a 0a 09 69 66 20 7b he range....if {
5010: 5b 6c 6c 65 6e 67 74 68 20 24 72 61 6e 67 65 5d [llength $range]
5020: 20 3c 20 32 7d 20 7b 20 72 65 74 75 72 6e 20 2d < 2} { return -
5030: 31 20 7d 0a 0a 09 73 65 74 20 6d 61 78 20 2d 31 1 }...set max -1
5040: 0a 09 73 65 74 20 62 65 73 74 20 7b 7d 0a 0a 09 ..set best {}...
5050: 66 6f 72 65 61 63 68 20 6c 6f 63 61 74 69 6f 6e foreach location
5060: 20 24 72 61 6e 67 65 20 7b 0a 09 20 20 20 20 73 $range {.. s
5070: 65 74 20 63 72 6f 73 73 69 6e 67 73 20 24 63 72 et crossings $cr
5080: 6f 73 73 28 24 6c 6f 63 61 74 69 6f 6e 29 0a 09 oss($location)..
5090: 20 20 20 20 69 66 20 7b 24 63 72 6f 73 73 69 6e if {$crossin
50a0: 67 73 20 3e 20 24 6d 61 78 7d 20 7b 0a 09 09 73 gs > $max} {...s
50b0: 65 74 20 6d 61 78 20 20 24 63 72 6f 73 73 69 6e et max $crossin
50c0: 67 73 0a 09 09 73 65 74 20 62 65 73 74 20 5b 6c gs...set best [l
50d0: 69 73 74 20 24 6c 6f 63 61 74 69 6f 6e 5d 0a 09 ist $location]..
50e0: 09 63 6f 6e 74 69 6e 75 65 0a 09 20 20 20 20 7d .continue.. }
50f0: 20 65 6c 73 65 69 66 20 7b 24 63 72 6f 73 73 69 elseif {$crossi
5100: 6e 67 73 20 3d 3d 20 24 6d 61 78 7d 20 7b 0a 09 ngs == $max} {..
5110: 09 6c 61 70 70 65 6e 64 20 62 65 73 74 20 24 6c .lappend best $l
5120: 6f 63 61 74 69 6f 6e 0a 09 20 20 20 20 7d 0a 09 ocation.. }..
5130: 7d 0a 0a 09 69 66 20 7b 24 6d 61 78 20 3d 3d 20 }...if {$max ==
5140: 30 7d 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 0} {
5150: 72 65 74 75 72 6e 20 2d 31 20 7d 0a 09 69 66 20 return -1 }..if
5160: 7b 5b 6c 6c 65 6e 67 74 68 20 24 62 65 73 74 5d {[llength $best]
5170: 20 3d 3d 20 31 7d 20 7b 20 72 65 74 75 72 6e 20 == 1} { return
5180: 5b 6c 69 6e 64 65 78 20 24 62 65 73 74 20 30 5d [lindex $best 0]
5190: 20 7d 0a 0a 09 73 65 74 20 6c 6f 63 61 74 69 6f }...set locatio
51a0: 6e 73 20 24 62 65 73 74 0a 09 73 65 74 20 62 65 ns $best..set be
51b0: 73 74 20 7b 7d 0a 09 73 65 74 20 6d 69 6e 20 2d st {}..set min -
51c0: 31 0a 0a 09 66 6f 72 65 61 63 68 20 6c 6f 63 61 1...foreach loca
51d0: 74 69 6f 6e 20 24 6c 6f 63 61 74 69 6f 6e 73 20 tion $locations
51e0: 7b 0a 09 20 20 20 20 73 65 74 20 69 6e 74 65 72 {.. set inter
51f0: 76 61 6c 20 24 64 65 6c 74 61 28 24 6c 6f 63 61 val $delta($loca
5200: 74 69 6f 6e 29 0a 09 20 20 20 20 69 66 20 7b 28 tion).. if {(
5210: 24 6d 69 6e 20 3c 20 30 29 20 7c 7c 20 28 24 69 $min < 0) || ($i
5220: 6e 74 65 72 76 61 6c 20 3c 20 24 6d 69 6e 29 7d nterval < $min)}
5230: 20 7b 0a 09 09 73 65 74 20 6d 69 6e 20 20 24 69 {...set min $i
5240: 6e 74 65 72 76 61 6c 0a 09 09 73 65 74 20 62 65 nterval...set be
5250: 73 74 20 5b 6c 69 73 74 20 24 6c 6f 63 61 74 69 st [list $locati
5260: 6f 6e 5d 0a 09 20 20 20 20 7d 20 65 6c 73 65 69 on].. } elsei
5270: 66 20 7b 24 69 6e 74 65 72 76 61 6c 20 3d 3d 20 f {$interval ==
5280: 24 6d 69 6e 7d 20 7b 0a 09 09 6c 61 70 70 65 6e $min} {...lappen
5290: 64 20 62 65 73 74 20 24 6c 6f 63 61 74 69 6f 6e d best $location
52a0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 .. }..}...if
52b0: 7b 5b 6c 6c 65 6e 67 74 68 20 24 62 65 73 74 5d {[llength $best]
52c0: 20 3d 3d 20 31 7d 20 7b 20 72 65 74 75 72 6e 20 == 1} { return
52d0: 5b 6c 69 6e 64 65 78 20 24 62 65 73 74 20 30 5d [lindex $best 0]
52e0: 20 7d 0a 0a 09 72 65 74 75 72 6e 20 5b 6c 69 6e }...return [lin
52f0: 64 65 78 20 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 dex [lsort -inte
5300: 67 65 72 20 2d 69 6e 63 72 65 61 73 69 6e 67 20 ger -increasing
5310: 24 62 65 73 74 5d 20 30 5d 0a 20 20 20 20 7d 0a $best] 0]. }.
5320: 0a 20 20 20 20 70 72 6f 63 20 43 75 74 41 74 20 . proc CutAt
5330: 7b 6c 6f 63 61 74 69 6f 6e 7d 20 7b 0a 09 75 70 {location} {..up
5340: 76 61 72 20 31 20 63 72 6f 73 73 20 63 72 6f 73 var 1 cross cros
5350: 73 20 64 65 70 63 20 64 65 70 63 0a 0a 09 23 20 s depc depc...#
5360: 49 74 20 77 61 73 20 64 65 63 69 64 65 64 20 74 It was decided t
5370: 6f 20 73 70 6c 69 74 20 74 68 65 20 63 68 61 6e o split the chan
5380: 67 65 73 65 74 20 61 74 20 74 68 65 20 67 69 76 geset at the giv
5390: 65 6e 0a 09 23 20 6c 6f 63 61 74 69 6f 6e 2e 20 en..# location.
53a0: 54 68 69 73 20 63 75 74 73 20 61 20 6e 75 6d 62 This cuts a numb
53b0: 65 72 20 6f 66 20 64 65 70 65 6e 64 65 6e 63 69 er of dependenci
53c0: 65 73 2e 20 48 65 72 65 20 77 65 20 75 70 64 61 es. Here we upda
53d0: 74 65 0a 09 23 20 74 68 65 20 63 72 6f 73 73 20 te..# the cross
53e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 information so t
53f0: 68 61 74 20 74 68 65 20 62 72 65 61 6b 20 66 69 hat the break fi
5400: 6e 64 65 72 20 68 61 73 20 61 63 63 75 72 61 74 nder has accurat
5410: 65 0a 09 23 20 64 61 74 61 20 77 68 65 6e 20 77 e..# data when w
5420: 65 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20 67 65 e look at the ge
5430: 6e 65 72 61 74 65 64 20 66 72 61 67 6d 65 6e 74 nerated fragment
5440: 73 2e 0a 0a 09 73 65 74 20 73 69 78 20 5b 6c 6f s....set six [lo
5450: 67 20 76 69 73 69 62 6c 65 3f 20 36 5d 0a 0a 09 g visible? 6]...
5460: 66 6f 72 65 61 63 68 20 7b 64 65 70 20 72 61 6e foreach {dep ran
5470: 67 65 7d 20 5b 61 72 72 61 79 20 67 65 74 20 64 ge} [array get d
5480: 65 70 63 5d 20 7b 0a 09 20 20 20 20 23 20 43 68 epc] {.. # Ch
5490: 65 63 6b 20 61 6c 6c 20 64 65 70 65 6e 64 65 6e eck all dependen
54a0: 63 69 65 73 20 73 74 69 6c 6c 20 6b 6e 6f 77 6e cies still known
54b0: 2c 20 74 61 6b 65 20 74 68 65 69 72 20 72 61 6e , take their ran
54c0: 67 65 20 61 6e 64 0a 09 20 20 20 20 23 20 73 65 ge and.. # se
54d0: 65 20 69 66 20 74 68 65 20 62 72 65 61 6b 20 6c e if the break l
54e0: 6f 63 61 74 69 6f 6e 20 66 61 6c 6c 73 20 77 69 ocation falls wi
54f0: 74 68 69 6e 2e 0a 0a 09 20 20 20 20 42 6f 72 64 thin.... Bord
5500: 65 72 20 24 72 61 6e 67 65 20 73 20 65 0a 09 20 er $range s e..
5510: 20 20 20 69 66 20 7b 24 6c 6f 63 61 74 69 6f 6e if {$location
5520: 20 3c 20 24 73 7d 20 63 6f 6e 74 69 6e 75 65 20 < $s} continue
5530: 3b 20 23 20 62 72 65 61 6b 20 62 65 66 6f 72 65 ; # break before
5540: 20 72 61 6e 67 65 2c 20 69 67 6e 6f 72 65 0a 09 range, ignore..
5550: 20 20 20 20 69 66 20 7b 24 6c 6f 63 61 74 69 6f if {$locatio
5560: 6e 20 3e 20 24 65 7d 20 63 6f 6e 74 69 6e 75 65 n > $e} continue
5570: 20 3b 20 23 20 62 72 65 61 6b 20 61 66 74 65 72 ; # break after
5580: 20 72 61 6e 67 65 2c 20 69 67 6e 6f 72 65 2e 0a range, ignore..
5590: 0a 09 20 20 20 20 23 20 54 68 69 73 20 64 65 70 .. # This dep
55a0: 65 6e 64 65 6e 63 79 20 63 72 6f 73 73 65 73 20 endency crosses
55b0: 74 68 65 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 the break locati
55c0: 6f 6e 2e 20 57 65 20 72 65 6d 6f 76 65 20 69 74 on. We remove it
55d0: 0a 09 20 20 20 20 23 20 66 72 6f 6d 20 74 68 65 .. # from the
55e0: 20 63 72 6f 73 73 69 6e 67 73 20 63 6f 75 6e 74 crossings count
55f0: 65 72 73 2c 20 61 6e 64 20 74 68 65 6e 20 61 6c ers, and then al
5600: 73 6f 20 66 72 6f 6d 20 74 68 65 20 73 65 74 0a so from the set.
5610: 09 20 20 20 20 23 20 6f 66 20 6b 6e 6f 77 6e 20 . # of known
5620: 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 dependencies, as
5630: 20 77 65 20 61 72 65 20 64 6f 6e 65 20 77 69 74 we are done wit
5640: 68 20 69 74 2e 0a 0a 09 20 20 20 20 66 6f 72 65 h it.... fore
5650: 61 63 68 20 6c 6f 63 20 24 64 65 70 63 28 24 64 ach loc $depc($d
5660: 65 70 29 20 7b 20 69 6e 63 72 20 63 72 6f 73 73 ep) { incr cross
5670: 28 24 6c 6f 63 29 20 2d 31 20 7d 0a 09 20 20 20 ($loc) -1 }..
5680: 20 75 6e 73 65 74 20 64 65 70 63 28 24 64 65 70 unset depc($dep
5690: 29 0a 0a 09 20 20 20 20 69 66 20 7b 21 24 73 69 )... if {!$si
56a0: 78 7d 20 63 6f 6e 74 69 6e 75 65 0a 0a 09 20 20 x} continue...
56b0: 20 20 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 struct::list a
56c0: 73 73 69 67 6e 20 24 64 65 70 20 70 61 72 65 6e ssign $dep paren
56d0: 74 20 63 68 69 6c 64 0a 09 20 20 20 20 6c 6f 67 t child.. log
56e0: 20 77 72 69 74 65 20 35 20 63 73 65 74 73 20 22 write 5 csets "
56f0: 42 72 6f 6b 65 20 64 65 70 65 6e 64 65 6e 63 79 Broke dependency
5700: 20 5b 50 44 20 24 70 61 72 65 6e 74 5d 20 2d 2d [PD $parent] --
5710: 3e 20 5b 50 44 20 24 63 68 69 6c 64 5d 22 0a 09 > [PD $child]"..
5720: 7d 0a 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d }...return. }
5730: 0a 0a 20 20 20 20 23 20 50 72 69 6e 74 20 69 64 .. # Print id
5740: 65 6e 74 69 66 79 69 6e 67 20 64 61 74 61 20 66 entifying data f
5750: 6f 72 20 61 20 72 65 76 69 73 69 6f 6e 20 28 70 or a revision (p
5760: 72 6f 6a 65 63 74 2c 20 66 69 6c 65 2c 20 64 6f roject, file, do
5770: 74 74 65 64 20 72 65 76 0a 20 20 20 20 23 20 6e tted rev. # n
5780: 75 6d 62 65 72 29 2c 20 66 6f 72 20 68 69 67 68 umber), for high
5790: 20 76 65 72 62 6f 73 69 74 79 20 6c 6f 67 20 6f verbosity log o
57a0: 75 74 70 75 74 2e 0a 0a 20 20 20 20 70 72 6f 63 utput... proc
57b0: 20 50 44 20 7b 69 64 7d 20 7b 0a 09 66 6f 72 65 PD {id} {..fore
57c0: 61 63 68 20 7b 70 20 66 20 72 7d 20 5b 73 74 61 ach {p f r} [sta
57d0: 74 65 20 72 75 6e 20 7b 0a 09 09 53 45 4c 45 43 te run {...SELEC
57e0: 54 20 50 2e 6e 61 6d 65 20 2c 20 46 2e 6e 61 6d T P.name , F.nam
57f0: 65 2c 20 52 2e 72 65 76 0a 09 09 46 52 4f 4d 20 e, R.rev...FROM
5800: 72 65 76 69 73 69 6f 6e 20 52 2c 20 66 69 6c 65 revision R, file
5810: 20 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09 09 F, project P...
5820: 57 48 45 52 45 20 52 2e 72 69 64 20 3d 20 24 69 WHERE R.rid = $i
5830: 64 0a 09 09 41 4e 44 20 20 20 52 2e 66 69 64 20 d...AND R.fid
5840: 3d 20 46 2e 66 69 64 0a 09 09 41 4e 44 20 20 20 = F.fid...AND
5850: 46 2e 70 69 64 20 3d 20 50 2e 70 69 64 0a 09 7d F.pid = P.pid..}
5860: 5d 20 62 72 65 61 6b 0a 09 72 65 74 75 72 6e 20 ] break..return
5870: 22 27 24 70 20 3a 20 24 66 2f 24 72 27 22 0a 20 "'$p : $f/$r'".
5880: 20 20 20 7d 0a 0a 20 20 20 20 23 20 50 72 69 6e }.. # Prin
5890: 74 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 ting one or more
58a0: 20 72 61 6e 67 65 73 2c 20 66 6f 72 6d 61 74 74 ranges, formatt
58b0: 65 64 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 ed, and only the
58c0: 69 72 20 62 6f 72 64 65 72 20 74 6f 0a 20 20 20 ir border to.
58d0: 20 23 20 6b 65 65 70 20 74 68 65 20 73 74 72 69 # keep the stri
58e0: 6e 67 73 20 73 68 6f 72 74 2e 0a 0a 20 20 20 20 ngs short...
58f0: 70 72 6f 63 20 50 52 73 20 7b 72 61 6e 67 65 73 proc PRs {ranges
5900: 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b 73 74 72 } {..return [str
5910: 75 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20 24 72 uct::list map $r
5920: 61 6e 67 65 73 20 5b 6d 79 70 72 6f 63 20 50 52 anges [myproc PR
5930: 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 ]]. }.. pr
5940: 6f 63 20 50 52 20 7b 72 61 6e 67 65 7d 20 7b 0a oc PR {range} {.
5950: 09 42 6f 72 64 65 72 20 24 72 61 6e 67 65 20 73 .Border $range s
5960: 20 65 0a 09 72 65 74 75 72 6e 20 3c 24 7b 73 7d e..return <${s}
5970: 2e 2e 2e 24 7b 65 7d 3e 0a 20 20 20 20 7d 0a 0a ...${e}>. }..
5980: 20 20 20 20 70 72 6f 63 20 42 6f 72 64 65 72 20 proc Border
5990: 7b 72 61 6e 67 65 20 73 76 20 65 76 7d 20 7b 0a {range sv ev} {.
59a0: 09 75 70 76 61 72 20 31 20 24 73 76 20 73 20 24 .upvar 1 $sv s $
59b0: 65 76 20 65 0a 09 73 65 74 20 73 20 5b 6c 69 6e ev e..set s [lin
59c0: 64 65 78 20 24 72 61 6e 67 65 20 30 5d 0a 09 73 dex $range 0]..s
59d0: 65 74 20 65 20 5b 6c 69 6e 64 65 78 20 24 72 61 et e [lindex $ra
59e0: 6e 67 65 20 65 6e 64 5d 0a 09 72 65 74 75 72 6e nge end]..return
59f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 . }.. # #
5a00: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 ## ### ##### ###
5a10: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 ##### ##########
5a20: 23 23 23 0a 0a 20 20 20 20 74 79 70 65 76 61 72 ###.. typevar
5a30: 69 61 62 6c 65 20 6d 79 63 68 61 6e 67 65 73 65 iable mychangese
5a40: 74 73 20 20 20 20 20 7b 7d 20 3b 20 23 20 4c 69 ts {} ; # Li
5a50: 73 74 20 6f 66 20 61 6c 6c 20 6b 6e 6f 77 6e 20 st of all known
5a60: 63 68 61 6e 67 65 73 65 74 73 2e 0a 20 20 20 20 changesets..
5a70: 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 69 typevariable myi
5a80: 74 65 6d 6d 61 70 20 2d 61 72 72 61 79 20 7b 7d temmap -array {}
5a90: 20 3b 20 23 20 4d 61 70 20 66 72 6f 6d 20 69 74 ; # Map from it
5aa0: 65 6d 73 20 28 74 61 67 67 65 64 29 20 74 6f 0a ems (tagged) to.
5ab0: 09 09 09 09 20 20 20 20 20 20 20 23 20 74 68 65 .... # the
5ac0: 20 6c 69 73 74 20 6f 66 20 63 68 61 6e 67 65 73 list of changes
5ad0: 65 74 73 0a 09 09 09 09 20 20 20 20 20 20 20 23 ets..... #
5ae0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 69 74 2e 20 containing it.
5af0: 45 61 63 68 20 69 74 65 6d 20 63 61 6e 0a 09 09 Each item can...
5b00: 09 09 20 20 20 20 20 20 20 23 20 62 65 20 75 73 .. # be us
5b10: 65 64 20 62 79 20 6f 6e 6c 79 20 6f 6e 65 0a 09 ed by only one..
5b20: 09 09 09 20 20 20 20 20 20 20 23 20 63 68 61 6e ... # chan
5b30: 67 65 73 65 74 2e 0a 20 20 20 20 74 79 70 65 76 geset.. typev
5b40: 61 72 69 61 62 6c 65 20 6d 79 69 64 6d 61 70 20 ariable myidmap
5b50: 20 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 -array {} ; #
5b60: 4d 61 70 20 66 72 6f 6d 20 63 68 61 6e 67 65 73 Map from changes
5b70: 65 74 20 69 64 20 74 6f 0a 09 09 09 09 20 20 20 et id to.....
5b80: 20 20 20 20 23 20 63 68 61 6e 67 65 73 65 74 2e # changeset.
5b90: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 .. typemethod
5ba0: 20 61 6c 6c 20 20 20 20 7b 7d 20 20 20 20 7b 20 all {} {
5bb0: 72 65 74 75 72 6e 20 24 6d 79 63 68 61 6e 67 65 return $mychange
5bc0: 73 65 74 73 20 7d 0a 20 20 20 20 74 79 70 65 6d sets }. typem
5bd0: 65 74 68 6f 64 20 6f 66 20 20 20 20 20 7b 63 69 ethod of {ci
5be0: 64 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 d} { return $myi
5bf0: 64 6d 61 70 28 24 63 69 64 29 20 7d 0a 20 20 20 dmap($cid) }.
5c00: 20 74 79 70 65 6d 65 74 68 6f 64 20 6f 66 69 74 typemethod ofit
5c10: 65 6d 20 7b 69 69 64 7d 20 7b 20 72 65 74 75 72 em {iid} { retur
5c20: 6e 20 24 6d 79 69 74 65 6d 6d 61 70 28 24 69 69 n $myitemmap($ii
5c30: 64 29 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 d) }.. # # ##
5c40: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 ### ##### #####
5c50: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 ### ############
5c60: 23 0a 20 20 20 20 23 23 20 43 6f 6e 66 69 67 75 #. ## Configu
5c70: 72 61 74 69 6f 6e 0a 0a 20 20 20 20 70 72 61 67 ration.. prag
5c80: 6d 61 20 2d 68 61 73 74 79 70 65 69 6e 66 6f 20 ma -hastypeinfo
5c90: 20 20 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 74 79 no ; # no ty
5ca0: 70 65 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e pe introspection
5cb0: 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 . pragma -has
5cc0: 69 6e 66 6f 20 20 20 20 20 20 20 20 6e 6f 20 20 info no
5cd0: 3b 20 23 20 6e 6f 20 6f 62 6a 65 63 74 20 69 6e ; # no object in
5ce0: 74 72 6f 73 70 65 63 74 69 6f 6e 0a 0a 20 20 20 trospection..
5cf0: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 # # ## ### ####
5d00: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 # ######## #####
5d10: 23 23 23 23 23 23 23 23 0a 7d 0a 0a 23 23 0a 23 ########.}..##.#
5d20: 23 20 4e 4f 54 45 3a 20 54 68 65 20 73 75 63 63 # NOTE: The succ
5d30: 65 73 73 6f 72 20 61 6e 64 20 70 72 65 64 65 63 essor and predec
5d40: 65 73 73 6f 72 20 6d 65 74 68 6f 64 73 20 64 65 essor methods de
5d50: 66 69 6e 65 64 20 62 79 20 74 68 65 20 63 6c 61 fined by the cla
5d60: 73 73 65 73 0a 23 23 20 20 20 20 20 20 20 62 65 sses.## be
5d70: 6c 6f 77 20 61 72 65 20 2d 2d 20 62 6f 74 74 6c low are -- bottl
5d80: 65 20 6e 65 63 6b 73 20 2d 2d 2e 20 4c 6f 6f 6b e necks --. Look
5d90: 20 66 6f 72 20 77 61 79 73 20 74 6f 20 6d 61 6b for ways to mak
5da0: 65 20 74 68 65 20 53 51 4c 0a 23 23 20 20 20 20 e the SQL.##
5db0: 20 20 20 66 61 73 74 65 72 2e 0a 23 23 0a 0a 23 faster..##..#
5dc0: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 # ## ### #####
5dd0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
5de0: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 ###### #########
5df0: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 ############.##
5e00: 48 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e Helper singleton
5e10: 2e 20 43 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 72 . Commands for r
5e20: 65 76 69 73 69 6f 6e 20 63 68 61 6e 67 65 73 65 evision changese
5e30: 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20 ts...snit::type
5e40: 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d ::vc::fossil::im
5e50: 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 port::cvs::proje
5e60: 63 74 3a 3a 72 65 76 3a 3a 72 65 76 20 7b 0a 20 ct::rev::rev {.
5e70: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 typemethod by
5e80: 72 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 revision {} { re
5e90: 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 79 70 turn 1 }. typ
5ea0: 65 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c emethod bysymbol
5eb0: 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 {} { return 0
5ec0: 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f }. typemetho
5ed0: 64 20 69 73 74 61 67 20 20 20 20 20 20 7b 7d 20 d istag {}
5ee0: 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 { return 0 }.
5ef0: 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73 62 72 typemethod isbr
5f00: 61 6e 63 68 20 20 20 7b 7d 20 7b 20 72 65 74 75 anch {} { retu
5f10: 72 6e 20 30 20 7d 0a 0a 20 20 20 20 74 79 70 65 rn 0 }.. type
5f20: 6d 65 74 68 6f 64 20 73 74 72 20 7b 72 65 76 69 method str {revi
5f30: 73 69 6f 6e 7d 20 7b 0a 09 73 74 72 75 63 74 3a sion} {..struct:
5f40: 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b 73 74 :list assign [st
5f50: 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 53 ate run {.. S
5f60: 45 4c 45 43 54 20 52 2e 72 65 76 2c 20 46 2e 6e ELECT R.rev, F.n
5f70: 61 6d 65 2c 20 50 2e 6e 61 6d 65 0a 09 20 20 20 ame, P.name..
5f80: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e FROM revision
5f90: 20 52 2c 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a R, file F, proj
5fa0: 65 63 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 ect P.. WHERE
5fb0: 20 20 52 2e 72 69 64 20 3d 20 24 72 65 76 69 73 R.rid = $revis
5fc0: 69 6f 6e 0a 09 20 20 20 20 41 4e 44 20 20 20 20 ion.. AND
5fd0: 46 2e 66 69 64 20 3d 20 52 2e 66 69 64 0a 09 20 F.fid = R.fid..
5fe0: 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69 64 20 AND P.pid
5ff0: 3d 20 46 2e 70 69 64 0a 09 7d 5d 20 72 65 76 6e = F.pid..}] revn
6000: 72 20 66 6e 61 6d 65 20 70 6e 61 6d 65 0a 09 72 r fname pname..r
6010: 65 74 75 72 6e 20 22 24 70 6e 61 6d 65 2f 24 7b eturn "$pname/${
6020: 72 65 76 6e 72 7d 3a 3a 24 66 6e 61 6d 65 22 0a revnr}::$fname".
6030: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 }.. # res
6040: 75 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69 6e 74 ult = list (mint
6050: 69 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a 20 20 ime, maxtime).
6060: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 74 69 6d typemethod tim
6070: 65 72 61 6e 67 65 20 7b 69 74 65 6d 73 7d 20 7b erange {items} {
6080: 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b ..set theset ('[
6090: 6a 6f 69 6e 20 24 69 74 65 6d 73 20 7b 27 2c 27 join $items {','
60a0: 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 }]')..return [st
60b0: 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 ate run ".. S
60c0: 45 4c 45 43 54 20 4d 49 4e 28 52 2e 64 61 74 65 ELECT MIN(R.date
60d0: 29 2c 20 4d 41 58 28 52 2e 64 61 74 65 29 0a 09 ), MAX(R.date)..
60e0: 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f FROM revisio
60f0: 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 52 n R.. WHERE R
6100: 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a .rid IN $theset.
6110: 09 22 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 ."]. }.. #
6120: 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20 var(dv) = dict
6130: 28 72 65 76 69 73 69 6f 6e 20 2d 3e 20 6c 69 73 (revision -> lis
6140: 74 20 28 72 65 76 69 73 69 6f 6e 29 29 0a 20 20 t (revision)).
6150: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 6e 74 typemethod int
6160: 65 72 6e 61 6c 73 75 63 63 65 73 73 6f 72 73 20 ernalsuccessors
6170: 7b 64 76 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b {dv revisions} {
6180: 0a 09 75 70 76 61 72 20 31 20 24 64 76 20 64 65 ..upvar 1 $dv de
6190: 70 65 6e 64 65 6e 63 69 65 73 0a 09 73 65 74 20 pendencies..set
61a0: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 theset ('[join $
61b0: 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d revisions {','}]
61c0: 27 29 0a 0a 09 23 20 53 65 65 20 27 73 75 63 63 ')...# See 'succ
61d0: 65 73 73 6f 72 73 27 20 62 65 6c 6f 77 20 66 6f essors' below fo
61e0: 72 20 74 68 65 20 6d 61 69 6e 20 65 78 70 6c 61 r the main expla
61f0: 6e 61 74 69 6f 6e 20 6f 66 0a 09 23 20 74 68 65 nation of..# the
6200: 20 76 61 72 69 6f 75 73 20 63 61 73 65 73 2e 20 various cases.
6210: 54 68 69 73 20 70 69 65 63 65 20 69 73 20 73 70 This piece is sp
6220: 65 63 69 61 6c 20 69 6e 20 74 68 61 74 20 69 74 ecial in that it
6230: 0a 09 23 20 72 65 73 74 72 69 63 74 73 20 74 68 ..# restricts th
6240: 65 20 73 75 63 63 65 73 73 6f 72 73 20 77 65 20 e successors we
6250: 6c 6f 6f 6b 20 66 6f 72 20 74 6f 20 74 68 65 20 look for to the
6260: 73 61 6d 65 20 73 65 74 20 6f 66 0a 09 23 20 72 same set of..# r
6270: 65 76 69 73 69 6f 6e 73 20 77 65 20 73 74 61 72 evisions we star
6280: 74 20 66 72 6f 6d 2e 20 53 65 6e 73 69 62 6c 65 t from. Sensible
6290: 20 61 73 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 as we are looki
62a0: 6e 67 20 66 6f 72 0a 09 23 20 63 68 61 6e 67 65 ng for..# change
62b0: 73 65 74 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 set internal dep
62c0: 65 6e 64 65 6e 63 69 65 73 2e 0a 0a 09 61 72 72 endencies....arr
62d0: 61 79 20 73 65 74 20 64 65 70 20 7b 7d 0a 0a 09 ay set dep {}...
62e0: 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 foreach {rid chi
62f0: 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 ld} [state run "
6300: 0a 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d 61 . -- (1) Prima
6310: 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20 53 45 ry child.. SE
6320: 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63 68 LECT R.rid, R.ch
6330: 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 ild.. FROM
6340: 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 revision R..
6350: 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 WHERE R.rid I
6360: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d N $theset --
6370: 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 Restrict to rev
6380: 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 isions of intere
6390: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 st.. AND R
63a0: 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 .child IS NOT NU
63b0: 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69 LL -- Has pri
63c0: 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20 mary child..
63d0: 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49 AND R.child I
63e0: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d N $theset --
63f0: 20 57 68 69 63 68 20 69 73 20 61 6c 73 6f 20 6f Which is also o
6400: 66 20 69 6e 74 65 72 65 73 74 0a 20 20 20 20 55 f interest. U
6410: 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32 29 20 NION. -- (2)
6420: 53 65 63 6f 6e 64 61 72 79 20 28 62 72 61 6e 63 Secondary (branc
6430: 68 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 h) children..
6440: 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 42 SELECT R.rid, B
6450: 2e 62 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 .brid.. FROM
6460: 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 revision R, re
6470: 76 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c visionbranchchil
6480: 64 72 65 6e 20 42 0a 09 20 20 20 20 57 48 45 52 dren B.. WHER
6490: 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 E R.rid IN $t
64a0: 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 heset -- Res
64b0: 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f trict to revisio
64c0: 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 ns of interest..
64d0: 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72 69 64 AND R.rid
64e0: 20 3d 20 42 2e 72 69 64 20 20 20 20 20 20 20 20 = B.rid
64f0: 20 20 2d 2d 20 53 65 6c 65 63 74 20 73 75 62 73 -- Select subs
6500: 65 74 20 6f 66 20 62 72 61 6e 63 68 20 63 68 69 et of branch chi
6510: 6c 64 72 65 6e 0a 09 20 20 20 20 41 4e 44 20 20 ldren.. AND
6520: 20 20 42 2e 62 72 69 64 20 49 4e 20 24 74 68 65 B.brid IN $the
6530: 73 65 74 20 20 20 20 20 20 2d 2d 20 57 68 69 63 set -- Whic
6540: 68 20 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e 74 h is also of int
6550: 65 72 65 73 74 0a 20 20 20 20 55 4e 49 4f 4e 0a erest. UNION.
6560: 20 20 20 20 2d 2d 20 28 34 29 20 43 68 69 6c 64 -- (4) Child
6570: 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 20 73 of trunk root s
6580: 75 63 63 65 73 73 6f 72 20 6f 66 20 6c 61 73 74 uccessor of last
6590: 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b 2e 0a NTDB on trunk..
65a0: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 . SELECT R.ri
65b0: 64 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20 20 20 d, RA.child..
65c0: 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 FROM revision R
65d0: 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 0a 09 20 , revision RA..
65e0: 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 20 WHERE R.rid
65f0: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 IN $theset
6600: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 -- Restrict to
6610: 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 revisions of int
6620: 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 erest.. AND
6630: 20 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20 R.isdefault
6640: 20 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 -- Rest
6650: 72 69 63 74 20 74 6f 20 4e 54 44 42 0a 09 20 20 rict to NTDB..
6660: 20 20 41 4e 44 20 20 20 52 2e 64 62 63 68 69 6c AND R.dbchil
6670: 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 d IS NOT NULL
6680: 2d 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 42 -- and last NTDB
6690: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72 belonging to tr
66a0: 75 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 52 unk.. AND R
66b0: 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69 6c A.rid = R.dbchil
66c0: 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 72 d -- Go dir
66d0: 65 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 72 ectly to trunk r
66e0: 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 52 oot.. AND R
66f0: 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e A.child IS NOT N
6700: 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 ULL -- Has pr
6710: 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 20 20 20 imary child..
6720: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 52 AND R
6730: 41 2e 63 68 69 6c 64 20 49 4e 20 24 74 68 65 73 A.child IN $thes
6740: 65 74 20 20 20 20 20 2d 2d 20 57 68 69 63 68 20 et -- Which
6750: 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e 74 65 72 is also of inter
6760: 65 73 74 0a 09 22 5d 20 7b 0a 09 20 20 20 20 23 est.."] {.. #
6770: 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69 6e 67 Consider moving
6780: 20 74 68 69 73 20 74 6f 20 74 68 65 20 69 6e 74 this to the int
6790: 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e 0a 09 egrity module...
67a0: 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 integrity as
67b0: 73 65 72 74 20 7b 24 72 69 64 20 21 3d 20 24 63 sert {$rid != $c
67c0: 68 69 6c 64 7d 20 7b 52 65 76 69 73 69 6f 6e 20 hild} {Revision
67d0: 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 $rid depends on
67e0: 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20 6c 61 itself.}.. la
67f0: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 ppend dependenci
6800: 65 73 28 24 72 69 64 29 20 24 63 68 69 6c 64 0a es($rid) $child.
6810: 09 20 20 20 20 73 65 74 20 64 65 70 28 24 72 69 . set dep($ri
6820: 64 2c 24 63 68 69 6c 64 29 20 2e 0a 09 7d 0a 0a d,$child) ...}..
6830: 09 23 20 54 68 65 20 73 71 6c 20 73 74 61 74 65 .# The sql state
6840: 6d 65 6e 74 73 20 61 62 6f 76 65 20 6c 6f 6f 6b ments above look
6850: 73 20 6f 6e 6c 79 20 66 6f 72 20 64 69 72 65 63 s only for direc
6860: 74 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 t dependencies..
6870: 23 20 62 65 74 77 65 65 6e 20 72 65 76 69 73 69 # between revisi
6880: 6f 6e 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 on in the change
6890: 73 65 74 2e 20 48 6f 77 65 76 65 72 20 64 75 65 set. However due
68a0: 20 74 6f 20 74 68 65 0a 09 23 20 76 61 67 61 72 to the..# vagar
68b0: 69 65 73 20 6f 66 20 6d 65 74 61 20 64 61 74 61 ies of meta data
68c0: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 it is possible
68d0: 66 6f 72 20 74 77 6f 20 72 65 76 69 73 69 6f 6e for two revision
68e0: 73 20 6f 66 0a 09 23 20 74 68 65 20 73 61 6d 65 s of..# the same
68f0: 20 66 69 6c 65 20 74 6f 20 65 6e 64 20 75 70 20 file to end up
6900: 69 6e 20 74 68 65 20 73 61 6d 65 20 63 68 61 6e in the same chan
6910: 67 65 73 65 74 2c 20 77 69 74 68 6f 75 74 20 61 geset, without a
6920: 0a 09 23 20 64 69 72 65 63 74 20 64 65 70 65 6e ..# direct depen
6930: 64 65 6e 63 79 20 62 65 74 77 65 65 6e 20 74 68 dency between th
6940: 65 6d 2e 20 48 6f 77 65 76 65 72 20 77 65 20 6b em. However we k
6950: 6e 6f 77 20 74 68 61 74 20 74 68 65 72 65 0a 09 now that there..
6960: 23 20 68 61 73 20 74 6f 20 62 65 20 61 20 61 6e # has to be a an
6970: 20 69 6e 64 69 72 65 63 74 20 64 65 70 65 6e 64 indirect depend
6980: 65 6e 63 79 2c 20 62 65 20 69 74 20 74 68 72 6f ency, be it thro
6990: 75 67 68 20 70 72 69 6d 61 72 79 0a 09 23 20 63 ugh primary..# c
69a0: 68 69 6c 64 72 65 6e 2c 20 62 72 61 6e 63 68 20 hildren, branch
69b0: 63 68 69 6c 64 72 65 6e 2c 20 6f 72 20 61 20 63 children, or a c
69c0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68 65 72 65 ombination there
69d0: 6f 66 2e 0a 0a 09 23 20 57 65 20 6e 6f 77 20 66 of....# We now f
69e0: 69 6c 6c 20 69 6e 20 74 68 65 73 65 20 70 73 65 ill in these pse
69f0: 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63 69 65 73 udo-dependencies
6a00: 2c 20 69 66 20 6e 6f 20 73 75 63 68 0a 09 23 20 , if no such..#
6a10: 64 65 70 65 6e 64 65 6e 63 79 20 65 78 69 73 74 dependency exist
6a20: 73 20 61 6c 72 65 61 64 79 2e 20 54 68 65 20 64 s already. The d
6a30: 69 72 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 irection of the
6a40: 64 65 70 65 6e 64 65 6e 63 79 0a 09 23 20 69 73 dependency..# is
6a50: 20 61 63 74 75 61 6c 6c 79 20 69 72 72 65 6c 65 actually irrele
6a60: 76 61 6e 74 20 66 6f 72 20 74 68 69 73 2e 0a 0a vant for this...
6a70: 09 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 .# NOTE: This is
6a80: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 different from
6a90: 63 76 73 32 73 76 6e 2e 20 4f 75 72 20 73 70 69 cvs2svn. Our spi
6aa0: 72 69 74 75 61 6c 20 61 6e 63 65 73 74 6f 72 0a ritual ancestor.
6ab0: 09 23 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 .# does not use
6ac0: 73 75 63 68 20 70 73 65 75 64 6f 2d 64 65 70 65 such pseudo-depe
6ad0: 6e 64 65 6e 63 69 65 73 2c 20 68 6f 77 65 76 65 ndencies, howeve
6ae0: 72 20 69 74 20 75 73 65 73 20 61 0a 09 23 20 43 r it uses a..# C
6af0: 4f 4d 4d 49 54 5f 54 48 52 45 53 48 4f 4c 44 2c OMMIT_THRESHOLD,
6b00: 20 61 20 74 69 6d 65 20 69 6e 74 65 72 76 61 6c a time interval
6b10: 20 63 6f 6d 6d 69 74 73 20 73 68 6f 75 6c 64 20 commits should
6b20: 66 61 6c 6c 2e 20 54 68 69 73 0a 09 23 20 77 69 fall. This..# wi
6b30: 6c 6c 20 67 72 65 61 74 6c 79 20 72 65 64 75 63 ll greatly reduc
6b40: 65 73 20 74 68 65 20 72 69 73 6b 20 6f 66 20 67 es the risk of g
6b50: 65 74 74 69 6e 67 20 66 61 72 20 73 65 70 61 72 etting far separ
6b60: 61 74 65 64 0a 09 23 20 72 65 76 69 73 69 6f 6e ated..# revision
6b70: 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 66 69 s of the same fi
6b80: 6c 65 20 69 6e 74 6f 20 6f 6e 65 20 63 68 61 6e le into one chan
6b90: 67 65 73 65 74 2e 0a 0a 09 23 20 57 65 20 61 6c geset....# We al
6ba0: 6c 6f 77 20 72 65 76 69 73 69 6f 6e 73 20 74 6f low revisions to
6bb0: 20 62 65 20 66 61 72 20 61 70 61 72 74 20 69 6e be far apart in
6bc0: 20 74 69 6d 65 20 69 6e 20 74 68 65 20 73 61 6d time in the sam
6bd0: 65 0a 09 23 20 63 68 61 6e 67 65 73 65 74 2c 20 e..# changeset,
6be0: 62 75 74 20 6e 65 65 64 20 74 68 65 20 70 73 65 but need the pse
6bf0: 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63 69 65 73 udo-dependencies
6c00: 20 66 6f 72 20 74 68 69 73 2e 0a 0a 09 61 72 72 for this....arr
6c10: 61 79 20 73 65 74 20 66 69 64 73 20 7b 7d 0a 09 ay set fids {}..
6c20: 66 6f 72 65 61 63 68 20 7b 72 69 64 20 66 69 64 foreach {rid fid
6c30: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 } [state run "..
6c40: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 SELECT R.rid
6c50: 2c 20 52 2e 66 69 64 20 46 52 4f 4d 20 72 65 76 , R.fid FROM rev
6c60: 69 73 69 6f 6e 20 52 20 57 48 45 52 45 20 52 2e ision R WHERE R.
6c70: 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 rid IN $theset..
6c80: 22 5d 20 7b 20 6c 61 70 70 65 6e 64 20 66 69 64 "] { lappend fid
6c90: 73 28 24 66 69 64 29 20 24 72 69 64 20 7d 0a 0a s($fid) $rid }..
6ca0: 09 66 6f 72 65 61 63 68 20 7b 66 69 64 20 72 69 .foreach {fid ri
6cb0: 64 73 7d 20 5b 61 72 72 61 79 20 67 65 74 20 66 ds} [array get f
6cc0: 69 64 73 5d 20 7b 0a 09 20 20 20 20 69 66 20 7b ids] {.. if {
6cd0: 5b 6c 6c 65 6e 67 74 68 20 24 72 69 64 73 5d 20 [llength $rids]
6ce0: 3c 20 32 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 20 < 2} continue..
6cf0: 20 20 20 66 6f 72 65 61 63 68 20 61 20 24 72 69 foreach a $ri
6d00: 64 73 20 7b 0a 09 09 66 6f 72 65 61 63 68 20 62 ds {...foreach b
6d10: 20 24 72 69 64 73 20 7b 0a 09 09 20 20 20 20 69 $rids {... i
6d20: 66 20 7b 24 61 20 3d 3d 20 24 62 7d 20 63 6f 6e f {$a == $b} con
6d30: 74 69 6e 75 65 0a 09 09 20 20 20 20 69 66 20 7b tinue... if {
6d40: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64 65 70 [info exists dep
6d50: 28 24 61 2c 24 62 29 5d 7d 20 63 6f 6e 74 69 6e ($a,$b)]} contin
6d60: 75 65 0a 09 09 20 20 20 20 69 66 20 7b 5b 69 6e ue... if {[in
6d70: 66 6f 20 65 78 69 73 74 73 20 64 65 70 28 24 62 fo exists dep($b
6d80: 2c 24 61 29 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a ,$a)]} continue.
6d90: 09 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 .. lappend de
6da0: 70 65 6e 64 65 6e 63 69 65 73 28 24 61 29 20 24 pendencies($a) $
6db0: 62 0a 09 09 20 20 20 20 73 65 74 20 64 65 70 28 b... set dep(
6dc0: 24 61 2c 24 62 29 20 2e 0a 09 09 20 20 20 20 73 $a,$b) .... s
6dd0: 65 74 20 64 65 70 28 24 62 2c 24 61 29 20 2e 0a et dep($b,$a) ..
6de0: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72 ..}.. }..}..r
6df0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 eturn. }..
6e00: 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 # var(dv) = dic
6e10: 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 t (item -> list
6e20: 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d (item)), item =
6e30: 20 6c 69 73 74 20 28 74 79 70 65 20 69 64 29 0a list (type id).
6e40: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 73 typemethod s
6e50: 75 63 63 65 73 73 6f 72 73 20 7b 64 76 20 72 65 uccessors {dv re
6e60: 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 visions} {..upva
6e70: 72 20 31 20 24 64 76 20 64 65 70 65 6e 64 65 6e r 1 $dv dependen
6e80: 63 69 65 73 0a 09 73 65 74 20 74 68 65 73 65 74 cies..set theset
6e90: 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 ('[join $revisi
6ea0: 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 23 ons {','}]')...#
6eb0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 The following c
6ec0: 61 73 65 73 20 73 70 65 63 69 66 79 20 77 68 65 ases specify whe
6ed0: 6e 20 61 20 72 65 76 69 73 69 6f 6e 20 53 20 69 n a revision S i
6ee0: 73 20 61 20 73 75 63 63 65 73 73 6f 72 0a 09 23 s a successor..#
6ef0: 20 6f 66 20 61 20 72 65 76 69 73 69 6f 6e 20 52 of a revision R
6f00: 2e 20 45 61 63 68 20 6f 66 20 74 68 65 20 63 61 . Each of the ca
6f10: 73 65 73 20 74 72 61 6e 73 6c 61 74 65 73 20 69 ses translates i
6f20: 6e 74 6f 20 6f 6e 65 20 6f 66 0a 09 23 20 74 68 nto one of..# th
6f30: 65 20 62 72 61 6e 63 68 65 73 20 6f 66 20 74 68 e branches of th
6f40: 65 20 53 51 4c 20 55 4e 49 4f 4e 20 63 6f 6d 69 e SQL UNION comi
6f50: 6e 67 20 62 65 6c 6f 77 2e 0a 09 23 0a 09 23 20 ng below...#..#
6f60: 28 31 29 20 53 20 63 61 6e 20 62 65 20 61 20 70 (1) S can be a p
6f70: 72 69 6d 61 72 79 20 63 68 69 6c 64 20 6f 66 20 rimary child of
6f80: 52 2c 20 69 2e 65 2e 20 69 6e 20 74 68 65 20 73 R, i.e. in the s
6f90: 61 6d 65 20 4c 4f 44 2e 20 52 0a 09 23 20 20 20 ame LOD. R..#
6fa0: 20 20 72 65 66 65 72 65 6e 63 65 73 20 53 20 64 references S d
6fb0: 69 72 65 63 74 6c 79 2e 20 52 2e 63 68 69 6c 64 irectly. R.child
6fc0: 20 3d 20 53 28 2e 72 69 64 29 2c 20 69 66 20 69 = S(.rid), if i
6fd0: 74 20 65 78 69 73 74 73 2e 0a 09 23 0a 09 23 20 t exists...#..#
6fe0: 28 32 29 20 53 20 63 61 6e 20 62 65 20 61 20 73 (2) S can be a s
6ff0: 65 63 6f 6e 64 61 72 79 2c 20 69 2e 65 2e 20 62 econdary, i.e. b
7000: 72 61 6e 63 68 2c 20 63 68 69 6c 64 20 6f 66 20 ranch, child of
7010: 52 2e 20 48 65 72 65 20 74 68 65 0a 09 23 20 20 R. Here the..#
7020: 20 20 20 6c 69 6e 6b 20 69 73 20 6d 61 64 65 20 link is made
7030: 74 68 72 6f 75 67 68 20 74 68 65 20 68 65 6c 70 through the help
7040: 65 72 20 74 61 62 6c 65 0a 09 23 20 20 20 20 20 er table..#
7050: 52 45 56 49 53 49 4f 4e 42 52 41 4e 43 48 43 48 REVISIONBRANCHCH
7060: 49 4c 44 52 45 4e 2e 20 52 2e 72 69 64 20 2d 3e ILDREN. R.rid ->
7070: 20 52 42 43 2e 72 69 64 2c 20 52 42 43 2e 62 72 RBC.rid, RBC.br
7080: 69 64 20 3d 0a 09 23 20 20 20 20 20 53 28 2e 72 id =..# S(.r
7090: 69 64 29 0a 09 23 0a 09 23 20 28 33 29 20 4f 72 id)..#..# (3) Or
70a0: 69 67 69 6e 61 6c 6c 79 20 74 68 69 73 20 75 73 iginally this us
70b0: 65 20 63 61 73 65 20 64 65 66 69 6e 65 64 20 74 e case defined t
70c0: 68 65 20 72 6f 6f 74 20 6f 66 20 61 20 64 65 74 he root of a det
70d0: 61 63 68 65 64 0a 09 23 20 20 20 20 20 4e 54 44 ached..# NTD
70e0: 42 20 61 73 20 74 68 65 20 73 75 63 63 65 73 73 B as the success
70f0: 6f 72 20 6f 66 20 74 68 65 20 74 72 75 6e 6b 20 or of the trunk
7100: 72 6f 6f 74 2e 20 54 68 69 73 20 6c 65 61 64 73 root. This leads
7110: 20 74 6f 20 61 0a 09 23 20 20 20 20 20 62 61 64 to a..# bad
7120: 20 74 61 6e 67 6c 65 20 6c 61 74 65 72 20 6f 6e tangle later on
7130: 2e 20 57 69 74 68 20 61 20 64 65 74 61 63 68 65 . With a detache
7140: 64 20 4e 54 44 42 20 74 68 65 20 6f 72 69 67 69 d NTDB the origi
7150: 6e 61 6c 0a 09 23 20 20 20 20 20 74 72 75 6e 6b nal..# trunk
7160: 20 72 6f 6f 74 20 72 65 76 69 73 69 6f 6e 20 77 root revision w
7170: 61 73 20 72 65 6d 6f 76 65 64 20 61 73 20 69 72 as removed as ir
7180: 72 65 6c 65 76 61 6e 74 2c 20 61 6c 6c 6f 77 69 relevant, allowi
7190: 6e 67 0a 09 23 20 20 20 20 20 74 68 65 20 6e 6f ng..# the no
71a0: 6d 69 6e 61 6c 20 72 6f 6f 74 20 74 6f 20 62 65 minal root to be
71b0: 20 6c 61 74 65 72 20 69 6e 20 74 69 6d 65 20 74 later in time t
71c0: 68 61 6e 20 74 68 65 20 4e 54 44 42 0a 09 23 20 han the NTDB..#
71d0: 20 20 20 20 72 6f 6f 74 2e 20 4e 6f 77 20 73 65 root. Now se
71e0: 74 74 69 6e 67 20 74 68 69 73 20 64 65 70 65 6e tting this depen
71f0: 64 65 6e 63 79 20 77 69 6c 6c 20 62 65 20 62 61 dency will be ba
7200: 63 6b 77 61 72 64 20 69 6e 0a 09 23 20 20 20 20 ckward in..#
7210: 20 74 69 6d 65 2e 20 52 45 4d 4f 56 45 44 2e 0a time. REMOVED..
7220: 09 23 0a 09 23 20 28 34 29 20 49 66 20 52 20 69 .#..# (4) If R i
7230: 73 20 74 68 65 20 6c 61 73 74 20 6f 66 20 74 68 s the last of th
7240: 65 20 4e 54 44 42 20 72 65 76 69 73 69 6f 6e 73 e NTDB revisions
7250: 20 77 68 69 63 68 20 62 65 6c 6f 6e 67 20 74 6f which belong to
7260: 0a 09 23 20 20 20 20 20 74 68 65 20 74 72 75 6e ..# the trun
7270: 6b 2c 20 74 68 65 6e 20 74 68 65 20 70 72 69 6d k, then the prim
7280: 61 72 79 20 63 68 69 6c 64 20 6f 66 20 74 68 65 ary child of the
7290: 20 74 72 75 6e 6b 20 72 6f 6f 74 20 28 74 68 65 trunk root (the
72a0: 0a 09 23 20 20 20 20 20 27 31 2e 32 27 20 72 65 ..# '1.2' re
72b0: 76 69 73 69 6f 6e 29 20 69 73 20 61 20 73 75 63 vision) is a suc
72c0: 63 65 73 73 6f 72 2c 20 69 66 20 69 74 20 65 78 cessor, if it ex
72d0: 69 73 74 73 2e 0a 0a 09 23 20 4e 6f 74 65 20 74 ists....# Note t
72e0: 68 61 74 20 74 68 65 20 62 72 61 6e 63 68 65 73 hat the branches
72f0: 20 73 70 61 77 6e 65 64 20 66 72 6f 6d 20 74 68 spawned from th
7300: 65 20 72 65 76 69 73 69 6f 6e 73 2c 20 61 6e 64 e revisions, and
7310: 20 74 68 65 0a 09 23 20 74 61 67 73 20 61 73 73 the..# tags ass
7320: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 ociated with the
7330: 6d 20 61 72 65 20 73 75 63 63 65 73 73 6f 72 73 m are successors
7340: 20 61 73 20 77 65 6c 6c 2e 0a 0a 09 66 6f 72 65 as well....fore
7350: 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 7d 20 ach {rid child}
7360: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 20 20 20 [state run ".
7370: 2d 2d 20 28 31 29 20 50 72 69 6d 61 72 79 20 63 -- (1) Primary c
7380: 68 69 6c 64 0a 09 20 20 20 20 53 45 4c 45 43 54 hild.. SELECT
7390: 20 52 2e 72 69 64 2c 20 52 2e 63 68 69 6c 64 0a R.rid, R.child.
73a0: 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 . FROM revi
73b0: 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 sion R.. WHER
73c0: 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 E R.rid IN $t
73d0: 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 heset -- Res
73e0: 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f trict to revisio
73f0: 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 ns of interest..
7400: 20 20 20 20 41 4e 44 20 20 20 20 52 2e 63 68 69 AND R.chi
7410: 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 ld IS NOT NULL
7420: 20 20 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 79 -- Has primary
7430: 20 63 68 69 6c 64 0a 20 20 20 20 55 4e 49 4f 4e child. UNION
7440: 0a 20 20 20 20 2d 2d 20 28 32 29 20 53 65 63 6f . -- (2) Seco
7450: 6e 64 61 72 79 20 28 62 72 61 6e 63 68 29 20 63 ndary (branch) c
7460: 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 53 45 4c hildren.. SEL
7470: 45 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 72 69 ECT R.rid, B.bri
7480: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 d.. FROM re
7490: 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 vision R, revisi
74a0: 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64 72 65 6e onbranchchildren
74b0: 20 42 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 B.. WHERE R
74c0: 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 .rid IN $these
74d0: 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 t -- Restric
74e0: 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f t to revisions o
74f0: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 f interest..
7500: 41 4e 44 20 20 20 20 52 2e 72 69 64 20 3d 20 42 AND R.rid = B
7510: 2e 72 69 64 20 20 20 20 20 20 20 20 20 20 2d 2d .rid --
7520: 20 53 65 6c 65 63 74 20 73 75 62 73 65 74 20 6f Select subset o
7530: 66 20 62 72 61 6e 63 68 20 63 68 69 6c 64 72 65 f branch childre
7540: 6e 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 n. UNION.
7550: 2d 2d 20 28 34 29 20 43 68 69 6c 64 20 6f 66 20 -- (4) Child of
7560: 74 72 75 6e 6b 20 72 6f 6f 74 20 73 75 63 63 65 trunk root succe
7570: 73 73 6f 72 20 6f 66 20 6c 61 73 74 20 4e 54 44 ssor of last NTD
7580: 42 20 6f 6e 20 74 72 75 6e 6b 2e 0a 09 20 20 20 B on trunk...
7590: 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 SELECT R.rid, R
75a0: 41 2e 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f A.child.. FRO
75b0: 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 M revision R, re
75c0: 76 69 73 69 6f 6e 20 52 41 0a 09 20 20 20 20 57 vision RA.. W
75d0: 48 45 52 45 20 52 2e 72 69 64 20 20 20 49 4e 20 HERE R.rid IN
75e0: 24 74 68 65 73 65 74 20 20 20 20 20 20 2d 2d 20 $theset --
75f0: 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 Restrict to revi
7600: 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 sions of interes
7610: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 52 2e 69 t.. AND R.i
7620: 73 64 65 66 61 75 6c 74 20 20 20 20 20 20 20 20 sdefault
7630: 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 -- Restrict
7640: 20 74 6f 20 4e 54 44 42 0a 09 20 20 20 20 41 4e to NTDB.. AN
7650: 44 20 20 20 52 2e 64 62 63 68 69 6c 64 20 49 53 D R.dbchild IS
7660: 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d 20 61 NOT NULL -- a
7670: 6e 64 20 6c 61 73 74 20 4e 54 44 42 20 62 65 6c nd last NTDB bel
7680: 6f 6e 67 69 6e 67 20 74 6f 20 74 72 75 6e 6b 0a onging to trunk.
7690: 09 20 20 20 20 41 4e 44 20 20 20 52 41 2e 72 69 . AND RA.ri
76a0: 64 20 3d 20 52 2e 64 62 63 68 69 6c 64 20 20 20 d = R.dbchild
76b0: 20 20 20 2d 2d 20 47 6f 20 64 69 72 65 63 74 6c -- Go directl
76c0: 79 20 74 6f 20 74 72 75 6e 6b 20 72 6f 6f 74 0a y to trunk root.
76d0: 09 20 20 20 20 41 4e 44 20 20 20 52 41 2e 63 68 . AND RA.ch
76e0: 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 ild IS NOT NULL
76f0: 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 -- Has primar
7700: 79 20 63 68 69 6c 64 2e 0a 09 22 5d 20 7b 0a 09 y child..."] {..
7710: 20 20 20 20 23 20 43 6f 6e 73 69 64 65 72 20 6d # Consider m
7720: 6f 76 69 6e 67 20 74 68 69 73 20 74 6f 20 74 68 oving this to th
7730: 65 20 69 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 e integrity modu
7740: 6c 65 2e 0a 09 20 20 20 20 69 6e 74 65 67 72 69 le... integri
7750: 74 79 20 61 73 73 65 72 74 20 7b 24 72 69 64 20 ty assert {$rid
7760: 21 3d 20 24 63 68 69 6c 64 7d 20 7b 52 65 76 69 != $child} {Revi
7770: 73 69 6f 6e 20 24 72 69 64 20 64 65 70 65 6e 64 sion $rid depend
7780: 73 20 6f 6e 20 69 74 73 65 6c 66 2e 7d 0a 09 20 s on itself.}..
7790: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e lappend depen
77a0: 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 65 dencies([list re
77b0: 76 20 24 72 69 64 5d 29 20 5b 6c 69 73 74 20 72 v $rid]) [list r
77c0: 65 76 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 ev $child]..}..f
77d0: 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c oreach {rid chil
77e0: 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a d} [state run ".
77f0: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 . SELECT R.ri
7800: 64 2c 20 54 2e 74 69 64 0a 09 20 20 20 20 46 52 d, T.tid.. FR
7810: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c OM revision R,
7820: 20 74 61 67 20 54 0a 09 20 20 20 20 57 48 45 52 tag T.. WHER
7830: 45 20 20 52 2e 72 69 64 20 69 6e 20 24 74 68 65 E R.rid in $the
7840: 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 set.. AND
7850: 54 2e 72 65 76 20 3d 20 52 2e 72 69 64 0a 09 22 T.rev = R.rid.."
7860: 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 ] {.. lappend
7870: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c dependencies([l
7880: 69 73 74 20 72 65 76 20 24 72 69 64 5d 29 20 5b ist rev $rid]) [
7890: 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 63 list sym::tag $c
78a0: 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 hild]..}..foreac
78b0: 68 20 7b 72 69 64 20 63 68 69 6c 64 7d 20 5b 73 h {rid child} [s
78c0: 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 tate run "..
78d0: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 42 2e SELECT R.rid, B.
78e0: 62 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 bid.. FROM
78f0: 72 65 76 69 73 69 6f 6e 20 52 2c 20 62 72 61 6e revision R, bran
7900: 63 68 20 42 0a 09 20 20 20 20 57 48 45 52 45 20 ch B.. WHERE
7910: 20 52 2e 72 69 64 20 69 6e 20 24 74 68 65 73 65 R.rid in $these
7920: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e t.. AND B.
7930: 72 6f 6f 74 20 3d 20 52 2e 72 69 64 0a 09 22 5d root = R.rid.."]
7940: 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 {.. lappend
7950: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 dependencies([li
7960: 73 74 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c st rev $rid]) [l
7970: 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 ist sym::branch
7980: 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 72 65 74 75 $child]..}..retu
7990: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 rn. }.. #
79a0: 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20 28 var(dv) = dict (
79b0: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 item -> list (it
79c0: 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 em)), item = li
79d0: 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 20 20 st (type id).
79e0: 20 74 79 70 65 6d 65 74 68 6f 64 20 70 72 65 64 typemethod pred
79f0: 65 63 65 73 73 6f 72 73 20 7b 64 76 20 72 65 76 ecessors {dv rev
7a00: 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 isions} {..upvar
7a10: 20 31 20 24 64 76 20 64 65 70 65 6e 64 65 6e 63 1 $dv dependenc
7a20: 69 65 73 0a 09 73 65 74 20 74 68 65 73 65 74 20 ies..set theset
7a30: 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f ('[join $revisio
7a40: 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 23 20 ns {','}]')...#
7a50: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 The following ca
7a60: 73 65 73 20 73 70 65 63 69 66 79 20 77 68 65 6e ses specify when
7a70: 20 61 20 72 65 76 69 73 69 6f 6e 20 50 20 69 73 a revision P is
7a80: 20 61 0a 09 23 20 70 72 65 64 65 63 65 73 73 6f a..# predecesso
7a90: 72 20 6f 66 20 61 20 72 65 76 69 73 69 6f 6e 20 r of a revision
7aa0: 52 2e 20 45 61 63 68 20 6f 66 20 74 68 65 20 63 R. Each of the c
7ab0: 61 73 65 73 20 74 72 61 6e 73 6c 61 74 65 73 0a ases translates.
7ac0: 09 23 20 69 6e 74 6f 20 6f 6e 65 20 6f 66 20 74 .# into one of t
7ad0: 68 65 20 62 72 61 6e 63 68 65 73 20 6f 66 20 74 he branches of t
7ae0: 68 65 20 53 51 4c 20 55 4e 49 4f 4e 20 63 6f 6d he SQL UNION com
7af0: 69 6e 67 20 62 65 6c 6f 77 2e 0a 09 23 0a 09 23 ing below...#..#
7b00: 20 28 31 29 20 54 68 65 20 69 6d 6d 65 64 69 61 (1) The immedia
7b10: 74 65 20 70 61 72 65 6e 74 20 52 2e 70 61 72 65 te parent R.pare
7b20: 6e 74 20 6f 66 20 52 20 69 73 20 61 20 70 72 65 nt of R is a pre
7b30: 64 65 63 65 73 73 6f 72 20 6f 66 0a 09 23 20 20 decessor of..#
7b40: 20 20 20 52 2e 20 4e 4f 54 45 3a 20 54 68 69 73 R. NOTE: This
7b50: 20 69 73 20 74 72 75 65 20 66 6f 72 20 52 20 65 is true for R e
7b60: 69 74 68 65 72 20 70 72 69 6d 61 72 79 20 6f 72 ither primary or
7b70: 20 73 65 63 6f 6e 64 61 72 79 0a 09 23 20 20 20 secondary..#
7b80: 20 20 63 68 69 6c 64 20 6f 66 20 50 2e 20 49 74 child of P. It
7b90: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 not necessary t
7ba0: 6f 20 64 69 73 74 69 6e 67 75 69 73 68 20 74 68 o distinguish th
7bb0: 65 20 74 77 6f 0a 09 23 20 20 20 20 20 63 61 73 e two..# cas
7bc0: 65 73 2c 20 69 6e 20 63 6f 6e 74 72 61 73 74 20 es, in contrast
7bd0: 74 6f 20 74 68 65 20 63 6f 64 65 20 72 65 74 72 to the code retr
7be0: 69 65 76 69 6e 67 20 74 68 65 20 73 75 63 63 65 ieving the succe
7bf0: 73 73 6f 72 0a 09 23 20 20 20 20 20 69 6e 66 6f ssor..# info
7c00: 72 6d 61 74 69 6f 6e 2e 0a 09 23 0a 09 23 20 28 rmation...#..# (
7c10: 32 29 20 54 68 65 20 63 6f 6d 70 6c 65 6d 65 6e 2) The complemen
7c20: 74 20 6f 66 20 73 75 63 63 65 73 73 6f 72 20 63 t of successor c
7c30: 61 73 65 20 28 33 29 2e 20 54 68 65 20 74 72 75 ase (3). The tru
7c40: 6e 6b 20 72 6f 6f 74 20 69 73 0a 09 23 20 20 20 nk root is..#
7c50: 20 20 61 20 70 72 65 64 65 63 65 73 73 6f 72 20 a predecessor
7c60: 6f 66 20 61 20 4e 54 44 42 20 72 6f 6f 74 2e 20 of a NTDB root.
7c70: 52 45 4d 4f 56 45 44 2e 20 53 65 65 20 27 73 75 REMOVED. See 'su
7c80: 63 63 65 73 73 6f 72 73 27 0a 09 23 20 20 20 20 ccessors'..#
7c90: 20 66 6f 72 20 74 68 65 20 65 78 70 6c 61 6e 61 for the explana
7ca0: 74 69 6f 6e 2e 0a 09 23 0a 09 23 20 28 33 29 20 tion...#..# (3)
7cb0: 54 68 65 20 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f The complement o
7cc0: 66 20 73 75 63 63 65 73 73 6f 72 20 63 61 73 65 f successor case
7cd0: 20 28 34 29 2e 20 54 68 65 20 6c 61 73 74 20 4e (4). The last N
7ce0: 54 44 42 0a 09 23 20 20 20 20 20 72 65 76 69 73 TDB..# revis
7cf0: 69 6f 6e 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f ion belonging to
7d00: 20 74 68 65 20 74 72 75 6e 6b 20 69 73 20 61 20 the trunk is a
7d10: 70 72 65 64 65 63 65 73 73 6f 72 20 6f 66 20 74 predecessor of t
7d20: 68 65 0a 09 23 20 20 20 20 20 70 72 69 6d 61 72 he..# primar
7d30: 79 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 74 y child of the t
7d40: 72 75 6e 6b 20 72 6f 6f 74 20 28 54 68 65 20 27 runk root (The '
7d50: 31 2e 32 27 20 72 65 76 69 73 69 6f 6e 29 2e 0a 1.2' revision)..
7d60: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 70 ..foreach {rid p
7d70: 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 arent} [state ru
7d80: 6e 20 22 0a 20 20 20 2d 2d 20 28 31 29 20 50 72 n ". -- (1) Pr
7d90: 69 6d 61 72 79 20 70 61 72 65 6e 74 2c 20 63 61 imary parent, ca
7da0: 6e 20 62 65 20 69 6e 20 64 69 66 66 65 72 65 6e n be in differen
7db0: 74 20 4c 4f 44 20 66 6f 72 20 66 69 72 73 74 20 t LOD for first
7dc0: 69 6e 20 61 20 62 72 61 6e 63 68 0a 09 20 20 20 in a branch..
7dd0: 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 SELECT R.rid, R
7de0: 2e 70 61 72 65 6e 74 0a 09 20 20 20 20 46 52 4f .parent.. FRO
7df0: 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 M revision R..
7e00: 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 WHERE R.rid
7e10: 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 IN $theset
7e20: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f -- Restrict to
7e30: 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e revisions of in
7e40: 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 terest.. AND
7e50: 20 20 20 52 2e 70 61 72 65 6e 74 20 49 53 20 4e R.parent IS N
7e60: 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d 20 48 61 73 OT NULL -- Has
7e70: 20 70 72 69 6d 61 72 79 20 70 61 72 65 6e 74 0a primary parent.
7e80: 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d UNION. --
7e90: 20 28 33 29 20 4c 61 73 74 20 4e 54 44 42 20 6f (3) Last NTDB o
7ea0: 6e 20 74 72 75 6e 6b 20 69 73 20 70 72 65 64 65 n trunk is prede
7eb0: 63 65 73 73 6f 72 20 6f 66 20 63 68 69 6c 64 20 cessor of child
7ec0: 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 of trunk root..
7ed0: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c SELECT R.rid,
7ee0: 20 52 41 2e 64 62 70 61 72 65 6e 74 0a 09 20 20 RA.dbparent..
7ef0: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f FROM revisio
7f00: 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 n R, revision RA
7f10: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 .. WHERE R.r
7f20: 69 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 id IN $theset
7f30: 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 -- Restric
7f40: 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f t to revisions o
7f50: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 f interest..
7f60: 41 4e 44 20 20 20 20 4e 4f 54 20 52 2e 69 73 64 AND NOT R.isd
7f70: 65 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20 efault
7f80: 2d 2d 20 6e 6f 74 20 6f 6e 20 4e 54 44 42 0a 09 -- not on NTDB..
7f90: 20 20 20 20 41 4e 44 20 20 20 20 52 2e 70 61 72 AND R.par
7fa0: 65 6e 74 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 ent IS NOT NULL
7fb0: 20 20 20 20 2d 2d 20 77 68 69 63 68 20 61 72 65 -- which are
7fc0: 20 6e 6f 74 20 72 6f 6f 74 0a 09 20 20 20 20 41 not root.. A
7fd0: 4e 44 20 20 20 20 52 41 2e 72 69 64 20 3d 20 52 ND RA.rid = R
7fe0: 2e 70 61 72 65 6e 74 20 20 20 20 20 20 20 20 2d .parent -
7ff0: 2d 20 67 6f 20 74 6f 20 74 68 65 69 72 20 70 61 - go to their pa
8000: 72 65 6e 74 0a 09 20 20 20 20 41 4e 44 20 20 20 rent.. AND
8010: 20 52 41 2e 64 62 70 61 72 65 6e 74 20 49 53 20 RA.dbparent IS
8020: 4e 4f 54 20 4e 55 4c 4c 20 20 2d 2d 20 77 68 69 NOT NULL -- whi
8030: 63 68 20 68 61 73 20 74 6f 20 72 65 66 65 72 20 ch has to refer
8040: 74 6f 20 4e 54 44 42 27 73 20 72 6f 6f 74 0a 09 to NTDB's root..
8050: 22 5d 20 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 "] {.. # Cons
8060: 69 64 65 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 ider moving this
8070: 20 74 6f 20 74 68 65 20 69 6e 74 65 67 72 69 74 to the integrit
8080: 79 20 6d 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 y module... i
8090: 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 ntegrity assert
80a0: 7b 24 72 69 64 20 21 3d 20 24 70 61 72 65 6e 74 {$rid != $parent
80b0: 7d 20 7b 52 65 76 69 73 69 6f 6e 20 24 72 69 64 } {Revision $rid
80c0: 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 depends on itse
80d0: 6c 66 2e 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e lf.}.. lappen
80e0: 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b d dependencies([
80f0: 6c 69 73 74 20 72 65 76 20 24 72 69 64 5d 29 20 list rev $rid])
8100: 5b 6c 69 73 74 20 72 65 76 20 24 70 61 72 65 6e [list rev $paren
8110: 74 5d 0a 09 7d 0a 0a 09 23 20 54 68 65 20 72 65 t]..}...# The re
8120: 76 69 73 69 6f 6e 73 20 77 68 69 63 68 20 61 72 visions which ar
8130: 65 20 74 68 65 20 66 69 72 73 74 20 6f 6e 20 61 e the first on a
8140: 20 62 72 61 6e 63 68 20 68 61 76 65 20 74 68 61 branch have tha
8150: 74 0a 09 23 20 62 72 61 6e 63 68 20 61 73 20 74 t..# branch as t
8160: 68 65 69 72 20 70 72 65 64 65 63 65 73 73 6f 72 heir predecessor
8170: 2e 20 4e 6f 74 65 20 74 68 61 74 20 72 65 76 69 . Note that revi
8180: 73 69 6f 6e 73 20 63 61 6e 6e 6f 74 20 62 65 0a sions cannot be.
8190: 09 23 20 6f 6e 20 74 61 67 73 20 69 6e 20 74 68 .# on tags in th
81a0: 65 20 73 61 6d 65 20 6d 61 6e 6e 65 72 2c 20 73 e same manner, s
81b0: 6f 20 74 61 67 73 20 63 61 6e 6e 6f 74 20 62 65 o tags cannot be
81c0: 20 70 72 65 64 65 63 65 73 73 6f 72 73 0a 09 23 predecessors..#
81d0: 20 6f 66 20 72 65 76 69 73 69 6f 6e 73 2e 20 54 of revisions. T
81e0: 68 69 73 20 63 6f 6d 70 6c 65 6d 65 6e 74 73 20 his complements
81f0: 74 68 61 74 20 74 68 65 79 20 68 61 76 65 20 6e that they have n
8200: 6f 20 73 75 63 63 65 73 73 6f 72 73 0a 09 23 20 o successors..#
8210: 28 53 65 65 20 73 79 6d 3a 3a 74 61 67 2f 73 75 (See sym::tag/su
8220: 63 63 65 73 73 6f 72 73 29 2e 0a 0a 09 66 6f 72 ccessors)....for
8230: 65 61 63 68 20 7b 72 69 64 20 70 61 72 65 6e 74 each {rid parent
8240: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 } [state run "..
8250: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 SELECT R.rid
8260: 20 42 2e 62 69 64 0a 09 20 20 20 20 46 52 4f 4d B.bid.. FROM
8270: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 62 revision R, b
8280: 72 61 6e 63 68 20 42 0a 09 20 20 20 20 57 48 45 ranch B.. WHE
8290: 52 45 20 20 52 2e 72 69 64 20 49 4e 20 24 74 68 RE R.rid IN $th
82a0: 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 eset.. AND
82b0: 20 42 2e 66 69 72 73 74 20 3d 20 52 2e 72 69 64 B.first = R.rid
82c0: 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 .."] {.. lapp
82d0: 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 end dependencies
82e0: 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64 5d ([list rev $rid]
82f0: 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 ) [list sym::bra
8300: 6e 63 68 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a nch $parent]..}.
8310: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 7d 0a .return. }.}.
8320: 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 .# # ## ### ####
8330: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 # ######## #####
8340: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
8350: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 ##############.#
8360: 23 20 48 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 # Helper singlet
8370: 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20 66 6f 72 on. Commands for
8380: 20 74 61 67 20 73 79 6d 62 6f 6c 20 63 68 61 6e tag symbol chan
8390: 67 65 73 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 gesets...snit::t
83a0: 79 70 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c ype ::vc::fossil
83b0: 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 ::import::cvs::p
83c0: 72 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 73 79 6d roject::rev::sym
83d0: 3a 3a 74 61 67 20 7b 0a 20 20 20 20 74 79 70 65 ::tag {. type
83e0: 6d 65 74 68 6f 64 20 62 79 72 65 76 69 73 69 6f method byrevisio
83f0: 6e 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 n {} { return 0
8400: 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 }. typemethod
8410: 20 62 79 73 79 6d 62 6f 6c 20 20 20 7b 7d 20 7b bysymbol {} {
8420: 20 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 return 1 }.
8430: 74 79 70 65 6d 65 74 68 6f 64 20 69 73 74 61 67 typemethod istag
8440: 20 20 20 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 {} { retur
8450: 6e 20 31 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 n 1 }. typeme
8460: 74 68 6f 64 20 69 73 62 72 61 6e 63 68 20 20 20 thod isbranch
8470: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a {} { return 0 }.
8480: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 . typemethod
8490: 73 74 72 20 7b 74 61 67 7d 20 7b 0a 09 73 74 72 str {tag} {..str
84a0: 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e uct::list assign
84b0: 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 [state run {..
84c0: 20 20 20 53 45 4c 45 43 54 20 53 2e 6e 61 6d 65 SELECT S.name
84d0: 2c 20 46 2e 6e 61 6d 65 2c 20 50 2e 6e 61 6d 65 , F.name, P.name
84e0: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 74 61 67 .. FROM tag
84f0: 20 54 2c 20 73 79 6d 62 6f 6c 20 53 2c 20 66 69 T, symbol S, fi
8500: 6c 65 20 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a le F, project P.
8510: 09 20 20 20 20 57 48 45 52 45 20 20 54 2e 74 69 . WHERE T.ti
8520: 64 20 3d 20 24 74 61 67 0a 09 20 20 20 20 41 4e d = $tag.. AN
8530: 44 20 20 20 20 46 2e 66 69 64 20 3d 20 54 2e 66 D F.fid = T.f
8540: 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50 id.. AND P
8550: 2e 70 69 64 20 3d 20 46 2e 70 69 64 0a 09 20 20 .pid = F.pid..
8560: 20 20 41 4e 44 20 20 20 20 53 2e 73 69 64 20 3d AND S.sid =
8570: 20 54 2e 73 69 64 0a 09 7d 5d 20 73 6e 61 6d 65 T.sid..}] sname
8580: 20 66 6e 61 6d 65 20 70 6e 61 6d 65 0a 09 72 65 fname pname..re
8590: 74 75 72 6e 20 22 24 70 6e 61 6d 65 2f 54 27 24 turn "$pname/T'$
85a0: 7b 73 6e 61 6d 65 7d 27 3a 3a 24 66 6e 61 6d 65 {sname}'::$fname
85b0: 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 ". }.. # r
85c0: 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69 esult = list (mi
85d0: 6e 74 69 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a ntime, maxtime).
85e0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 74 typemethod t
85f0: 69 6d 65 72 61 6e 67 65 20 7b 74 61 67 73 7d 20 imerange {tags}
8600: 7b 0a 09 23 20 54 68 65 20 72 61 6e 67 65 20 69 {..# The range i
8610: 73 20 64 65 66 69 6e 65 64 20 61 73 20 74 68 65 s defined as the
8620: 20 72 61 6e 67 65 20 6f 66 20 74 68 65 20 72 65 range of the re
8630: 76 69 73 69 6f 6e 73 20 74 68 65 20 74 61 67 73 visions the tags
8640: 0a 09 23 20 61 72 65 20 61 74 74 61 63 68 65 64 ..# are attached
8650: 20 74 6f 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 to....set these
8660: 74 20 28 27 5b 6a 6f 69 6e 20 24 74 61 67 73 20 t ('[join $tags
8670: 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e {','}]')..return
8680: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 [state run "..
8690: 20 20 20 53 45 4c 45 43 54 20 4d 49 4e 28 52 2e SELECT MIN(R.
86a0: 64 61 74 65 29 2c 20 4d 41 58 28 52 2e 64 61 74 date), MAX(R.dat
86b0: 65 29 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 e).. FROM rev
86c0: 69 73 69 6f 6e 20 52 2c 20 74 61 67 20 54 0a 09 ision R, tag T..
86d0: 20 20 20 20 57 48 45 52 45 20 54 2e 74 69 64 20 WHERE T.tid
86e0: 49 4e 20 24 74 68 65 73 65 74 0a 20 20 20 20 20 IN $theset.
86f0: 20 20 20 20 20 20 20 41 4e 44 20 20 20 52 2e 72 AND R.r
8700: 69 64 20 3d 20 54 2e 72 65 76 0a 09 22 5d 0a 20 id = T.rev.."].
8710: 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 }.. # var(
8720: 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d dv) = dict (item
8730: 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29 -> list (item))
8740: 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 , item = list (
8750: 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 70 type id). typ
8760: 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f emethod successo
8770: 72 73 20 7b 64 76 20 74 61 67 73 7d 20 7b 0a 09 rs {dv tags} {..
8780: 23 20 54 61 67 73 20 68 61 76 65 20 6e 6f 20 73 # Tags have no s
8790: 75 63 63 65 73 73 6f 72 73 2e 0a 09 72 65 74 75 uccessors...retu
87a0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 rn. }.. #
87b0: 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20 28 var(dv) = dict (
87c0: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 item -> list (it
87d0: 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 em)), item = li
87e0: 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 20 20 st (type id).
87f0: 20 74 79 70 65 6d 65 74 68 6f 64 20 70 72 65 64 typemethod pred
8800: 65 63 65 73 73 6f 72 73 20 7b 64 76 20 74 61 67 ecessors {dv tag
8810: 73 7d 20 7b 0a 09 23 20 54 68 65 20 70 72 65 64 s} {..# The pred
8820: 65 63 65 73 73 6f 72 73 20 6f 66 20 61 20 74 61 ecessors of a ta
8830: 67 20 61 72 65 20 61 6c 6c 20 74 68 65 20 72 65 g are all the re
8840: 76 69 73 69 6f 6e 73 20 74 68 65 20 74 61 67 73 visions the tags
8850: 20 61 72 65 0a 09 23 20 61 74 74 61 63 68 65 64 are..# attached
8860: 20 74 6f 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 to, as well as
8870: 61 6c 6c 20 74 68 65 20 62 72 61 6e 63 68 65 73 all the branches
8880: 20 6f 72 20 74 61 67 73 20 77 68 69 63 68 20 61 or tags which a
8890: 72 65 0a 09 23 20 74 68 65 69 72 20 70 72 65 66 re..# their pref
88a0: 65 72 65 64 20 70 61 72 65 6e 74 73 2e 0a 0a 09 ered parents....
88b0: 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f set theset ('[jo
88c0: 69 6e 20 24 74 61 67 73 20 7b 27 2c 27 7d 5d 27 in $tags {','}]'
88d0: 29 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 )..foreach {tid
88e0: 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 parent} [state r
88f0: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 un ".. SELECT
8900: 20 54 2e 74 69 64 2c 20 52 2e 72 69 64 0a 09 20 T.tid, R.rid..
8910: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 FROM revisi
8920: 6f 6e 20 52 2c 20 74 61 67 20 54 0a 09 20 20 20 on R, tag T..
8930: 20 57 48 45 52 45 20 20 54 2e 74 69 64 20 49 4e WHERE T.tid IN
8940: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e $theset.. AN
8950: 44 20 20 20 20 54 2e 72 65 76 20 3d 20 52 2e 72 D T.rev = R.r
8960: 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 id.."] {.. la
8970: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 ppend dependenci
8980: 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 es([list sym::ta
8990: 67 20 24 74 69 64 5d 29 20 5b 6c 69 73 74 20 72 g $tid]) [list r
89a0: 65 76 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 0a ev $parent]..}..
89b0: 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 70 61 .foreach {tid pa
89c0: 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e rent} [state run
89d0: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 54 ".. SELECT T
89e0: 2e 74 69 64 2c 20 42 2e 62 69 64 0a 09 20 20 20 .tid, B.bid..
89f0: 20 46 52 4f 4d 20 20 20 74 61 67 20 54 2c 20 62 FROM tag T, b
8a00: 72 61 6e 63 68 20 42 2c 20 70 72 65 66 65 72 65 ranch B, prefere
8a10: 64 70 61 72 65 6e 74 20 50 0a 09 20 20 20 20 57 dparent P.. W
8a20: 48 45 52 45 20 20 54 2e 74 69 64 20 49 4e 20 24 HERE T.tid IN $
8a30: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 theset.. AND
8a40: 20 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 69 64 T.sid = P.sid
8a50: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70 .. AND P.p
8a60: 69 64 20 3d 20 42 2e 73 69 64 0a 09 22 5d 20 7b id = B.sid.."] {
8a70: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 .. lappend de
8a80: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 pendencies([list
8a90: 20 73 79 6d 3a 3a 74 61 67 20 24 74 69 64 5d 29 sym::tag $tid])
8aa0: 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e [list sym::bran
8ab0: 63 68 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 0a ch $parent]..}..
8ac0: 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 70 61 .foreach {tid pa
8ad0: 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e rent} [state run
8ae0: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 54 ".. SELECT T
8af0: 2e 74 69 64 2c 20 54 58 2e 74 69 64 0a 09 20 20 .tid, TX.tid..
8b00: 20 20 46 52 4f 4d 20 20 20 74 61 67 20 54 2c 20 FROM tag T,
8b10: 74 61 67 20 54 58 2c 20 70 72 65 66 65 72 65 64 tag TX, prefered
8b20: 70 61 72 65 6e 74 20 50 0a 09 20 20 20 20 57 48 parent P.. WH
8b30: 45 52 45 20 20 54 2e 74 69 64 20 49 4e 20 24 74 ERE T.tid IN $t
8b40: 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 heset.. AND
8b50: 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a T.sid = P.sid.
8b60: 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69 . AND P.pi
8b70: 64 20 3d 20 54 58 2e 73 69 64 0a 09 22 5d 20 7b d = TX.sid.."] {
8b80: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 .. lappend de
8b90: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 pendencies([list
8ba0: 20 73 79 6d 3a 3a 74 61 67 20 24 74 69 64 5d 29 sym::tag $tid])
8bb0: 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 [list sym::tag
8bc0: 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 72 65 74 $parent]..}..ret
8bd0: 75 72 6e 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 urn. }.}..# #
8be0: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 ## ### ##### ##
8bf0: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 ###### #########
8c00: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 #### ###########
8c10: 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 48 65 ##########.## He
8c20: 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 2e 20 lper singleton.
8c30: 43 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 62 72 61 Commands for bra
8c40: 6e 63 68 20 73 79 6d 62 6f 6c 20 63 68 61 6e 67 nch symbol chang
8c50: 65 73 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 esets...snit::ty
8c60: 70 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a pe ::vc::fossil:
8c70: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 :import::cvs::pr
8c80: 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 73 79 6d 3a oject::rev::sym:
8c90: 3a 62 72 61 6e 63 68 20 7b 0a 20 20 20 20 74 79 :branch {. ty
8ca0: 70 65 6d 65 74 68 6f 64 20 62 79 72 65 76 69 73 pemethod byrevis
8cb0: 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 ion {} { return
8cc0: 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 0 }. typemeth
8cd0: 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 20 7b 7d od bysymbol {}
8ce0: 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 { return 1 }.
8cf0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73 74 typemethod ist
8d00: 61 67 20 20 20 20 20 20 7b 7d 20 7b 20 72 65 74 ag {} { ret
8d10: 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65 urn 0 }. type
8d20: 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63 68 20 method isbranch
8d30: 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 {} { return 1
8d40: 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f }.. typemetho
8d50: 64 20 73 74 72 20 7b 62 72 61 6e 63 68 7d 20 7b d str {branch} {
8d60: 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 ..struct::list a
8d70: 73 73 69 67 6e 20 5b 73 74 61 74 65 20 72 75 6e ssign [state run
8d80: 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 53 {.. SELECT S
8d90: 2e 6e 61 6d 65 2c 20 46 2e 6e 61 6d 65 2c 20 50 .name, F.name, P
8da0: 2e 6e 61 6d 65 0a 09 20 20 20 20 46 52 4f 4d 20 .name.. FROM
8db0: 20 20 62 72 61 6e 63 68 20 42 2c 20 73 79 6d 62 branch B, symb
8dc0: 6f 6c 20 53 2c 20 66 69 6c 65 20 46 2c 20 70 72 ol S, file F, pr
8dd0: 6f 6a 65 63 74 20 50 0a 09 20 20 20 20 57 48 45 oject P.. WHE
8de0: 52 45 20 20 42 2e 62 69 64 20 3d 20 24 62 72 61 RE B.bid = $bra
8df0: 6e 63 68 0a 09 20 20 20 20 41 4e 44 20 20 20 20 nch.. AND
8e00: 46 2e 66 69 64 20 3d 20 42 2e 66 69 64 0a 09 20 F.fid = B.fid..
8e10: 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69 64 20 AND P.pid
8e20: 3d 20 46 2e 70 69 64 0a 09 20 20 20 20 41 4e 44 = F.pid.. AND
8e30: 20 20 20 20 53 2e 73 69 64 20 3d 20 42 2e 73 69 S.sid = B.si
8e40: 64 0a 09 7d 5d 20 73 6e 61 6d 65 20 66 6e 61 6d d..}] sname fnam
8e50: 65 20 70 6e 61 6d 65 0a 09 72 65 74 75 72 6e 20 e pname..return
8e60: 22 24 70 6e 61 6d 65 2f 42 27 24 7b 73 6e 61 6d "$pname/B'${snam
8e70: 65 7d 27 3a 3a 24 66 6e 61 6d 65 22 0a 20 20 20 e}'::$fname".
8e80: 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 }.. # result
8e90: 20 3d 20 6c 69 73 74 20 28 6d 69 6e 74 69 6d 65 = list (mintime
8ea0: 2c 20 6d 61 78 74 69 6d 65 29 0a 20 20 20 20 74 , maxtime). t
8eb0: 79 70 65 6d 65 74 68 6f 64 20 74 69 6d 65 72 61 ypemethod timera
8ec0: 6e 67 65 20 7b 62 72 61 6e 63 68 65 73 7d 20 7b nge {branches} {
8ed0: 0a 09 23 20 54 68 65 20 72 61 6e 67 65 20 6f 66 ..# The range of
8ee0: 20 61 20 62 72 61 6e 63 68 20 69 73 20 64 65 66 a branch is def
8ef0: 69 6e 65 64 20 61 73 20 74 68 65 20 72 61 6e 67 ined as the rang
8f00: 65 20 6f 66 20 74 68 65 0a 09 23 20 72 65 76 69 e of the..# revi
8f10: 73 69 6f 6e 73 20 74 68 65 20 62 72 61 6e 63 68 sions the branch
8f20: 65 73 20 61 72 65 20 73 70 61 77 6e 65 64 20 62 es are spawned b
8f30: 79 2e 20 4e 4f 54 45 20 68 6f 77 65 76 65 72 20 y. NOTE however
8f40: 74 68 61 74 20 74 68 65 0a 09 23 20 62 72 61 6e that the..# bran
8f50: 63 68 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 ches associated
8f60: 77 69 74 68 20 61 20 64 65 74 61 63 68 65 64 20 with a detached
8f70: 4e 54 44 42 20 77 69 6c 6c 20 68 61 76 65 20 6e NTDB will have n
8f80: 6f 20 72 6f 6f 74 0a 09 23 20 73 70 61 77 6e 69 o root..# spawni
8f90: 6e 67 20 74 68 65 6d 2c 20 68 65 6e 63 65 20 74 ng them, hence t
8fa0: 68 65 79 20 68 61 76 65 20 6e 6f 20 72 65 61 6c hey have no real
8fb0: 20 74 69 6d 65 72 61 6e 67 65 20 61 6e 79 0a 09 timerange any..
8fc0: 23 20 6c 6f 6e 67 65 72 2e 20 42 79 20 75 73 69 # longer. By usi
8fd0: 6e 67 20 30 20 77 65 20 70 75 74 20 74 68 65 6d ng 0 we put them
8fe0: 20 69 6e 20 66 72 6f 6e 74 20 6f 66 20 65 76 65 in front of eve
8ff0: 72 79 74 68 69 6e 67 20 65 6c 73 65 2c 0a 09 23 rything else,..#
9000: 20 61 73 20 74 68 65 79 20 6c 6f 67 69 63 61 6c as they logical
9010: 6c 79 20 61 72 65 2e 0a 0a 09 73 65 74 20 74 68 ly are....set th
9020: 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 eset ('[join $br
9030: 61 6e 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a anches {','}]').
9040: 09 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72 .return [state r
9050: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 un ".. SELECT
9060: 20 49 46 4e 55 4c 4c 28 4d 49 4e 28 52 2e 64 61 IFNULL(MIN(R.da
9070: 74 65 29 2c 30 29 2c 20 49 46 4e 55 4c 4c 28 4d te),0), IFNULL(M
9080: 41 58 28 52 2e 64 61 74 65 29 2c 30 29 0a 09 20 AX(R.date),0)..
9090: 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e FROM revision
90a0: 20 52 2c 20 62 72 61 6e 63 68 20 42 0a 09 20 20 R, branch B..
90b0: 20 20 57 48 45 52 45 20 42 2e 62 69 64 20 49 4e WHERE B.bid IN
90c0: 20 24 74 68 65 73 65 74 0a 20 20 20 20 20 20 20 $theset.
90d0: 20 20 20 20 20 41 4e 44 20 20 20 52 2e 72 69 64 AND R.rid
90e0: 20 3d 20 42 2e 72 6f 6f 74 0a 09 22 5d 0a 20 20 = B.root.."].
90f0: 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64 }.. # var(d
9100: 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20 v) = dict (item
9110: 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c -> list (item)),
9120: 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 item = list (t
9130: 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 70 65 ype id). type
9140: 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f 72 method successor
9150: 73 20 7b 64 76 20 62 72 61 6e 63 68 65 73 7d 20 s {dv branches}
9160: 7b 0a 09 23 20 54 68 65 20 66 69 72 73 74 20 72 {..# The first r
9170: 65 76 69 73 69 6f 6e 20 63 6f 6d 6d 69 74 74 65 evision committe
9180: 64 20 6f 6e 20 61 20 62 72 61 6e 63 68 2c 20 61 d on a branch, a
9190: 6e 64 20 61 6c 6c 20 62 72 61 6e 63 68 65 73 0a nd all branches.
91a0: 09 23 20 61 6e 64 20 74 61 67 73 20 77 68 69 63 .# and tags whic
91b0: 68 20 68 61 76 65 20 69 74 20 61 73 20 74 68 65 h have it as the
91c0: 69 72 20 70 72 65 66 65 72 65 64 20 70 61 72 65 ir prefered pare
91d0: 6e 74 20 61 72 65 20 74 68 65 0a 09 23 20 73 75 nt are the..# su
91e0: 63 63 65 73 73 6f 72 73 20 6f 66 20 61 20 62 72 ccessors of a br
91f0: 61 6e 63 68 2e 0a 0a 09 73 65 74 20 74 68 65 73 anch....set thes
9200: 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61 6e et ('[join $bran
9210: 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66 ches {','}]')..f
9220: 6f 72 65 61 63 68 20 7b 62 69 64 20 63 68 69 6c oreach {bid chil
9230: 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a d} [state run ".
9240: 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62 69 . SELECT B.bi
9250: 64 2c 20 52 2e 72 69 64 0a 09 20 20 20 20 46 52 d, R.rid.. FR
9260: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c OM revision R,
9270: 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20 20 57 branch B.. W
9280: 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24 HERE B.bid IN $
9290: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 theset.. AND
92a0: 20 20 20 42 2e 66 69 72 73 74 20 3d 20 52 2e 72 B.first = R.r
92b0: 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 id.."] {.. la
92c0: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 ppend dependenci
92d0: 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 es([list sym::ta
92e0: 67 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 20 72 g $bid]) [list r
92f0: 65 76 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 ev $child]..}..f
9300: 6f 72 65 61 63 68 20 7b 62 69 64 20 63 68 69 6c oreach {bid chil
9310: 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a d} [state run ".
9320: 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62 69 . SELECT B.bi
9330: 64 2c 20 42 58 2e 62 69 64 0a 09 20 20 20 20 46 d, BX.bid.. F
9340: 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20 ROM branch B,
9350: 62 72 61 6e 63 68 20 42 58 2c 20 70 72 65 66 65 branch BX, prefe
9360: 72 65 64 70 61 72 65 6e 74 20 50 0a 09 20 20 20 redparent P..
9370: 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e WHERE B.bid IN
9380: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e $theset.. AN
9390: 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50 2e 70 D B.sid = P.p
93a0: 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 id.. AND B
93b0: 58 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a 09 22 X.sid = P.sid.."
93c0: 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 ] {.. lappend
93d0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c dependencies([l
93e0: 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 62 69 ist sym::tag $bi
93f0: 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 d]) [list sym::b
9400: 72 61 6e 63 68 20 24 63 68 69 6c 64 5d 0a 09 7d ranch $child]..}
9410: 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64 20 63 ..foreach {bid c
9420: 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e hild} [state run
9430: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 ".. SELECT B
9440: 2e 62 69 64 2c 20 54 2e 74 69 64 0a 09 20 20 20 .bid, T.tid..
9450: 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 FROM branch B
9460: 2c 20 74 61 67 20 54 2c 20 70 72 65 66 65 72 65 , tag T, prefere
9470: 64 70 61 72 65 6e 74 20 50 0a 09 20 20 20 20 57 dparent P.. W
9480: 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24 HERE B.bid IN $
9490: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 theset.. AND
94a0: 20 20 20 42 2e 73 69 64 20 3d 20 50 2e 70 69 64 B.sid = P.pid
94b0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 54 2e 73 .. AND T.s
94c0: 69 64 20 3d 20 50 2e 73 69 64 0a 09 22 5d 20 7b id = P.sid.."] {
94d0: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 .. lappend de
94e0: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 pendencies([list
94f0: 20 73 79 6d 3a 3a 74 61 67 20 24 62 69 64 5d 29 sym::tag $bid])
9500: 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 [list sym::tag
9510: 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 72 65 74 75 $child]..}..retu
9520: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 rn. }.. #
9530: 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20 28 var(dv) = dict (
9540: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 item -> list (it
9550: 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 em)), item = li
9560: 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 20 20 st (type id).
9570: 20 74 79 70 65 6d 65 74 68 6f 64 20 70 72 65 64 typemethod pred
9580: 65 63 65 73 73 6f 72 73 20 7b 64 76 20 62 72 61 ecessors {dv bra
9590: 6e 63 68 65 73 7d 20 7b 0a 09 23 20 54 68 65 20 nches} {..# The
95a0: 70 72 65 64 65 63 65 73 73 6f 72 73 20 6f 66 20 predecessors of
95b0: 61 20 62 72 61 6e 63 68 20 61 72 65 20 61 6c 6c a branch are all
95c0: 20 74 68 65 20 72 65 76 69 73 69 6f 6e 73 20 74 the revisions t
95d0: 68 65 0a 09 23 20 62 72 61 6e 63 68 65 73 20 61 he..# branches a
95e0: 72 65 20 73 70 61 77 6e 65 64 20 66 72 6f 6d 2c re spawned from,
95f0: 20 61 73 20 77 65 6c 6c 20 61 73 20 61 6c 6c 20 as well as all
9600: 74 68 65 20 62 72 61 6e 63 68 65 73 20 6f 72 0a the branches or.
9610: 09 23 20 74 61 67 73 20 77 68 69 63 68 20 61 72 .# tags which ar
9620: 65 20 74 68 65 69 72 20 70 72 65 66 65 72 65 64 e their prefered
9630: 20 70 61 72 65 6e 74 73 2e 0a 0a 09 73 65 74 20 parents....set
9640: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 theset ('[join $
9650: 74 61 67 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66 tags {','}]')..f
9660: 6f 72 65 61 63 68 20 7b 62 69 64 20 70 61 72 65 oreach {bid pare
9670: 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 nt} [state run "
9680: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 42 .. SELECT B.B
9690: 69 64 2c 20 52 2e 72 69 64 0a 09 20 20 20 20 46 id, R.rid.. F
96a0: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 ROM revision R
96b0: 2c 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20 20 , branch B..
96c0: 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20 WHERE B.bid IN
96d0: 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 $theset.. AND
96e0: 20 20 20 20 42 2e 72 6f 6f 74 20 3d 20 52 2e 72 B.root = R.r
96f0: 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 id.."] {.. la
9700: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 ppend dependenci
9710: 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 es([list sym::br
9720: 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c 69 73 anch $bid]) [lis
9730: 74 20 72 65 76 20 24 70 61 72 65 6e 74 5d 0a 09 t rev $parent]..
9740: 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64 20 }..foreach {bid
9750: 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 parent} [state r
9760: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 un ".. SELECT
9770: 20 42 2e 62 69 64 2c 20 42 58 2e 62 69 64 0a 09 B.bid, BX.bid..
9780: 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 FROM branc
9790: 68 20 42 2c 20 62 72 61 6e 63 68 20 42 58 2c 20 h B, branch BX,
97a0: 70 72 65 66 65 72 65 64 70 61 72 65 6e 74 20 50 preferedparent P
97b0: 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 .. WHERE B.b
97c0: 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 id IN $theset..
97d0: 20 20 20 41 4e 44 20 20 20 20 42 2e 73 69 64 20 AND B.sid
97e0: 3d 20 50 2e 73 69 64 0a 09 20 20 20 20 41 4e 44 = P.sid.. AND
97f0: 20 20 20 20 50 2e 70 69 64 20 3d 20 42 58 2e 73 P.pid = BX.s
9800: 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 id.."] {.. la
9810: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 ppend dependenci
9820: 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 es([list sym::br
9830: 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c 69 73 anch $bid]) [lis
9840: 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 70 t sym::branch $p
9850: 61 72 65 6e 74 5d 0a 09 7d 0a 09 66 6f 72 65 61 arent]..}..forea
9860: 63 68 20 7b 62 69 64 20 70 61 72 65 6e 74 7d 20 ch {bid parent}
9870: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 [state run "..
9880: 20 20 53 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 SELECT B.bid,
9890: 54 2e 74 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 T.tid.. FROM
98a0: 20 20 62 72 61 6e 63 68 20 42 2c 20 74 61 67 20 branch B, tag
98b0: 54 2c 20 70 72 65 66 65 72 65 64 70 61 72 65 6e T, preferedparen
98c0: 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 20 20 t P.. WHERE
98d0: 42 2e 74 69 64 20 49 4e 20 24 74 68 65 73 65 74 B.tid IN $theset
98e0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 73 .. AND B.s
98f0: 69 64 20 3d 20 50 2e 73 69 64 0a 09 20 20 20 20 id = P.sid..
9900: 41 4e 44 20 20 20 20 50 2e 70 69 64 20 3d 20 54 AND P.pid = T
9910: 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 .sid.."] {..
9920: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e lappend dependen
9930: 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a cies([list sym::
9940: 62 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c branch $bid]) [l
9950: 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 70 61 ist sym::tag $pa
9960: 72 65 6e 74 5d 0a 09 7d 0a 09 72 65 74 75 72 6e rent]..}..return
9970: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 . }.. # #
9980: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 ## ### ##### ###
9990: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 ##### ##########
99a0: 23 23 23 0a 20 20 20 20 23 23 20 43 6f 6e 66 69 ###. ## Confi
99b0: 67 75 72 61 74 69 6f 6e 0a 0a 20 20 20 20 70 72 guration.. pr
99c0: 61 67 6d 61 20 2d 68 61 73 69 6e 73 74 61 6e 63 agma -hasinstanc
99d0: 65 73 20 20 20 6e 6f 20 3b 20 23 20 73 69 6e 67 es no ; # sing
99e0: 6c 65 74 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61 leton. pragma
99f0: 20 2d 68 61 73 74 79 70 65 69 6e 66 6f 20 20 20 -hastypeinfo
9a00: 20 6e 6f 20 3b 20 23 20 6e 6f 20 69 6e 74 72 6f no ; # no intro
9a10: 73 70 65 63 74 69 6f 6e 0a 20 20 20 20 70 72 61 spection. pra
9a20: 67 6d 61 20 2d 68 61 73 74 79 70 65 64 65 73 74 gma -hastypedest
9a30: 72 6f 79 20 6e 6f 20 3b 20 23 20 69 6d 6d 6f 72 roy no ; # immor
9a40: 74 61 6c 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 tal.}..# # ## ##
9a50: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 # ##### ########
9a60: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23 ############# #
9a70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
9a80: 23 23 23 23 0a 23 23 0a 0a 6e 61 6d 65 73 70 61 ####.##..namespa
9a90: 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a 66 6f ce eval ::vc::fo
9aa0: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 ssil::import::cv
9ab0: 73 3a 3a 70 72 6f 6a 65 63 74 20 7b 0a 20 20 20 s::project {.
9ac0: 20 6e 61 6d 65 73 70 61 63 65 20 65 78 70 6f 72 namespace expor
9ad0: 74 20 72 65 76 0a 20 20 20 20 6e 61 6d 65 73 70 t rev. namesp
9ae0: 61 63 65 20 65 76 61 6c 20 72 65 76 20 7b 0a 09 ace eval rev {..
9af0: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 namespace import
9b00: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 ::vc::fossil::i
9b10: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 mport::cvs::stat
9b20: 65 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 e..namespace imp
9b30: 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c ort ::vc::fossil
9b40: 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 ::import::cvs::i
9b50: 6e 74 65 67 72 69 74 79 0a 09 6e 61 6d 65 73 70 ntegrity..namesp
9b60: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a ace import ::vc:
9b70: 3a 74 6f 6f 6c 73 3a 3a 6d 69 73 63 3a 3a 2a 0a :tools::misc::*.
9b80: 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 .namespace impor
9b90: 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 74 t ::vc::tools::t
9ba0: 72 6f 75 62 6c 65 0a 09 6e 61 6d 65 73 70 61 63 rouble..namespac
9bb0: 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 e import ::vc::t
9bc0: 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 6c 6f 67 20 72 ools::log..log r
9bd0: 65 67 69 73 74 65 72 20 63 73 65 74 73 0a 0a 09 egister csets...
9be0: 23 20 53 65 74 20 75 70 20 74 68 65 20 68 65 6c # Set up the hel
9bf0: 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 73 0a 09 per singletons..
9c00: 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 72 namespace eval r
9c10: 65 76 20 7b 0a 09 20 20 20 20 6e 61 6d 65 73 70 ev {.. namesp
9c20: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a ace import ::vc:
9c30: 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a :fossil::import:
9c40: 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09 20 20 20 :cvs::state..
9c50: 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 namespace impor
9c60: 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a t ::vc::fossil::
9c70: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e 74 import::cvs::int
9c80: 65 67 72 69 74 79 0a 09 7d 0a 09 6e 61 6d 65 73 egrity..}..names
9c90: 70 61 63 65 20 65 76 61 6c 20 73 79 6d 3a 3a 74 pace eval sym::t
9ca0: 61 67 20 7b 0a 09 20 20 20 20 6e 61 6d 65 73 70 ag {.. namesp
9cb0: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a ace import ::vc:
9cc0: 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a :fossil::import:
9cd0: 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09 20 20 20 :cvs::state..
9ce0: 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 namespace impor
9cf0: 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a t ::vc::fossil::
9d00: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e 74 import::cvs::int
9d10: 65 67 72 69 74 79 0a 09 7d 0a 09 6e 61 6d 65 73 egrity..}..names
9d20: 70 61 63 65 20 65 76 61 6c 20 73 79 6d 3a 3a 62 pace eval sym::b
9d30: 72 61 6e 63 68 20 7b 0a 09 20 20 20 20 6e 61 6d ranch {.. nam
9d40: 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a espace import ::
9d50: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f vc::fossil::impo
9d60: 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09 rt::cvs::state..
9d70: 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d namespace im
9d80: 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 port ::vc::fossi
9d90: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a l::import::cvs::
9da0: 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a 20 20 20 integrity..}.
9db0: 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 }.}..# # ## ###
9dc0: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 ##### ########
9dd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23 ############# ##
9de0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
9df0: 23 23 23 0a 23 23 20 52 65 61 64 79 0a 0a 70 61 ###.## Ready..pa
9e00: 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20 76 63 ckage provide vc
9e10: 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 ::fossil::import
9e20: 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a ::cvs::project::
9e30: 72 65 76 20 31 2e 30 0a 72 65 74 75 72 6e 0a rev 1.0.return.