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 09 23 20 54 68 69 73 20 6d 65 74 68 6f 64 20 ..# This method
10f0: 69 6e 73 70 65 63 74 73 20 74 68 65 20 63 68 61 inspects the cha
1100: 6e 67 65 73 65 74 73 20 66 6f 72 20 69 6e 74 65 ngesets for inte
1110: 72 6e 61 6c 0a 09 23 20 64 65 70 65 6e 64 65 6e rnal..# dependen
1120: 63 69 65 73 2e 20 4e 6f 74 68 69 6e 67 20 69 73 cies. Nothing is
1130: 20 64 6f 6e 65 20 69 66 20 74 68 65 72 65 20 61 done if there a
1140: 72 65 20 6e 6f 0a 09 23 20 73 75 63 68 2e 20 4f re no..# such. O
1150: 74 68 65 72 77 69 73 65 20 74 68 65 20 63 68 61 therwise the cha
1160: 6e 67 65 73 65 74 20 69 73 20 73 70 6c 69 74 20 ngeset is split
1170: 69 6e 74 6f 20 61 20 73 65 74 20 6f 66 0a 09 23 into a set of..#
1180: 20 66 72 61 67 6d 65 6e 74 73 20 77 69 74 68 6f fragments witho
1190: 75 74 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 ut internal depe
11a0: 6e 64 65 6e 63 69 65 73 2c 20 74 72 61 6e 73 66 ndencies, transf
11b0: 6f 72 6d 69 6e 67 20 74 68 65 0a 09 23 20 69 6e orming the..# in
11c0: 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 ternal dependenc
11d0: 69 65 73 20 69 6e 74 6f 20 65 78 74 65 72 6e 61 ies into externa
11e0: 6c 20 6f 6e 65 73 2e 20 54 68 65 20 6e 65 77 20 l ones. The new
11f0: 63 68 61 6e 67 65 73 65 74 73 0a 09 23 20 61 72 changesets..# ar
1200: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c e added to the l
1210: 69 73 74 20 6f 66 20 61 6c 6c 20 63 68 61 6e 67 ist of all chang
1220: 65 73 65 74 73 2e 0a 0a 09 23 20 57 65 20 70 65 esets....# We pe
1230: 72 66 6f 72 6d 20 61 6c 6c 20 6e 65 63 65 73 73 rform all necess
1240: 61 72 79 20 73 70 6c 69 74 73 20 69 6e 20 6f 6e ary splits in on
1250: 65 20 67 6f 2c 20 69 6e 73 74 65 61 64 20 6f 66 e go, instead of
1260: 20 6f 6e 6c 79 0a 09 23 20 6f 6e 65 2e 20 54 68 only..# one. Th
1270: 65 20 70 72 65 76 69 6f 75 73 20 61 6c 67 6f 72 e previous algor
1280: 69 74 68 6d 2c 20 61 64 61 70 74 65 64 20 66 72 ithm, adapted fr
1290: 6f 6d 20 63 76 73 32 73 76 6e 2c 20 63 6f 6d 70 om cvs2svn, comp
12a0: 75 74 65 64 0a 09 23 20 61 20 6c 6f 74 20 6f 66 uted..# a lot of
12b0: 20 73 74 61 74 65 20 77 68 69 63 68 20 77 61 73 state which was
12c0: 20 74 68 72 6f 77 6e 20 61 77 61 79 20 61 6e 64 thrown away and
12d0: 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 64 20 61 then computed a
12e0: 67 61 69 6e 0a 09 23 20 66 6f 72 20 65 61 63 68 gain..# for each
12f0: 20 6f 66 20 74 68 65 20 66 72 61 67 6d 65 6e 74 of the fragment
1300: 73 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 s. It should be
1310: 65 61 73 69 65 72 20 74 6f 20 75 70 64 61 74 65 easier to update
1320: 20 61 6e 64 0a 09 23 20 72 65 75 73 65 20 74 68 and..# reuse th
1330: 61 74 20 73 74 61 74 65 2e 0a 0a 09 23 20 54 68 at state....# Th
1340: 65 20 63 6f 64 65 20 63 68 65 63 6b 73 20 6f 6e e code checks on
1350: 6c 79 20 73 75 63 65 73 73 6f 72 20 64 65 70 65 ly sucessor depe
1360: 6e 64 65 6e 63 69 65 73 2c 20 61 73 20 74 68 69 ndencies, as thi
1370: 73 0a 09 23 20 61 75 74 6f 6d 61 74 69 63 61 6c s..# automatical
1380: 6c 79 20 63 6f 76 65 72 73 20 74 68 65 20 70 72 ly covers the pr
1390: 65 64 65 63 65 73 73 6f 72 20 64 65 70 65 6e 64 edecessor depend
13a0: 65 6e 63 69 65 73 20 61 73 20 77 65 6c 6c 20 28 encies as well (
13b0: 41 0a 09 23 20 73 75 63 63 65 73 73 6f 72 20 64 A..# successor d
13c0: 65 70 65 6e 64 65 6e 63 79 20 61 20 2d 3e 20 62 ependency a -> b
13d0: 20 69 73 20 61 6c 73 6f 20 61 20 70 72 65 64 65 is also a prede
13e0: 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 cessor dependenc
13f0: 79 0a 09 23 20 62 20 2d 3e 20 61 29 2e 0a 0a 09 y..# b -> a)....
1400: 23 20 41 72 72 61 79 20 6f 66 20 64 65 70 65 6e # Array of depen
1410: 64 65 6e 63 69 65 73 20 28 70 61 72 65 6e 74 20 dencies (parent
1420: 2d 3e 20 63 68 69 6c 64 29 2e 20 54 68 69 73 20 -> child). This
1430: 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 0a 09 is pulled from..
1440: 23 20 74 68 65 20 73 74 61 74 65 2c 20 61 6e 64 # the state, and
1450: 20 6c 69 6d 69 74 65 64 20 74 6f 20 73 75 63 63 limited to succ
1460: 65 73 73 6f 72 73 20 77 69 74 68 69 6e 20 74 68 essors within th
1470: 65 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 61 e changeset....a
1480: 72 72 61 79 20 73 65 74 20 64 65 70 65 6e 64 65 rray set depende
1490: 6e 63 69 65 73 20 7b 7d 0a 09 24 6d 79 74 79 70 ncies {}..$mytyp
14a0: 65 6f 62 6a 20 69 6e 74 65 72 6e 61 6c 73 75 63 eobj internalsuc
14b0: 63 65 73 73 6f 72 73 20 64 65 70 65 6e 64 65 6e cessors dependen
14c0: 63 69 65 73 20 24 6d 79 69 74 65 6d 73 0a 09 69 cies $myitems..i
14d0: 66 20 7b 21 5b 61 72 72 61 79 20 73 69 7a 65 20 f {![array size
14e0: 64 65 70 65 6e 64 65 6e 63 69 65 73 5d 7d 20 7b dependencies]} {
14f0: 72 65 74 75 72 6e 20 30 7d 20 3b 20 23 20 4e 6f return 0} ; # No
1500: 74 68 69 6e 67 20 74 6f 20 62 72 65 61 6b 2e 0a thing to break..
1510: 0a 09 6c 6f 67 20 77 72 69 74 65 20 35 20 63 73 ..log write 5 cs
1520: 65 74 73 20 2e 2e 2e 5b 24 73 65 6c 66 20 73 74 ets ...[$self st
1530: 72 5d 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e r]..............
1540: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
1550: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
1560: 2e 2e 2e 2e 2e 2e 2e 2e 2e 0a 0a 09 23 20 57 65 ............# We
1570: 20 68 61 76 65 20 69 6e 74 65 72 6e 61 6c 20 64 have internal d
1580: 65 70 65 6e 64 65 6e 63 69 65 73 20 74 6f 20 62 ependencies to b
1590: 72 65 61 6b 2e 20 57 65 20 6e 6f 77 20 69 74 65 reak. We now ite
15a0: 72 61 74 65 20 6f 76 65 72 0a 09 23 20 61 6c 6c rate over..# all
15b0: 20 70 6f 73 69 74 69 6f 6e 73 20 69 6e 20 74 68 positions in th
15c0: 65 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 e list (which is
15d0: 20 63 68 72 6f 6e 6f 6c 6f 67 69 63 61 6c 2c 20 chronological,
15e0: 61 74 20 6c 65 61 73 74 0a 09 23 20 61 73 20 66 at least..# as f
15f0: 61 72 20 61 73 20 74 68 65 20 74 69 6d 65 73 74 ar as the timest
1600: 61 6d 70 73 20 61 72 65 20 63 6f 72 72 65 63 74 amps are correct
1610: 20 61 6e 64 20 75 6e 69 71 75 65 29 20 61 6e 64 and unique) and
1620: 0a 09 23 20 64 65 74 65 72 6d 69 6e 65 20 74 68 ..# determine th
1630: 65 20 62 65 73 74 20 70 6f 73 69 74 69 6f 6e 20 e best position
1640: 66 6f 72 20 74 68 65 20 62 72 65 61 6b 2c 20 62 for the break, b
1650: 79 20 74 72 79 69 6e 67 20 74 6f 0a 09 23 20 62 y trying to..# b
1660: 72 65 61 6b 20 61 73 20 6d 61 6e 79 20 64 65 70 reak as many dep
1670: 65 6e 64 65 6e 63 69 65 73 20 61 73 20 70 6f 73 endencies as pos
1680: 73 69 62 6c 65 20 69 6e 20 6f 6e 65 20 67 6f 2e sible in one go.
1690: 20 57 68 65 6e 20 61 0a 09 23 20 62 72 65 61 6b When a..# break
16a0: 20 77 61 73 20 66 6f 75 6e 64 20 74 68 69 73 20 was found this
16b0: 69 73 20 72 65 64 6f 6e 65 20 66 6f 72 20 74 68 is redone for th
16c0: 65 20 66 72 61 67 6d 65 6e 74 73 20 63 6f 6d 69 e fragments comi
16d0: 6e 67 20 61 6e 64 0a 09 23 20 61 66 74 65 72 2c ng and..# after,
16e0: 20 61 66 74 65 72 20 75 70 64 69 6e 67 20 74 68 after upding th
16f0: 65 20 63 72 6f 73 73 69 6e 67 20 69 6e 66 6f 72 e crossing infor
1700: 6d 61 74 69 6f 6e 2e 0a 0a 09 23 20 44 61 74 61 mation....# Data
1710: 20 73 74 72 75 63 74 75 72 65 73 3a 0a 09 23 20 structures:..#
1720: 4d 61 70 3a 20 20 50 4f 53 20 20 20 72 65 76 69 Map: POS revi
1730: 73 69 6f 6e 20 69 64 20 20 20 20 20 20 2d 3e 20 sion id ->
1740: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73 74 position in list
1750: 2e 0a 09 23 20 20 20 20 20 20 20 43 52 4f 53 53 ...# CROSS
1760: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73 position in lis
1770: 74 20 2d 3e 20 6e 75 6d 62 65 72 20 6f 66 20 64 t -> number of d
1780: 65 70 65 6e 64 65 6e 63 69 65 73 20 63 72 6f 73 ependencies cros
1790: 73 69 6e 67 20 69 74 0a 09 23 20 20 20 20 20 20 sing it..#
17a0: 20 44 45 50 43 20 20 64 65 70 65 6e 64 65 6e 63 DEPC dependenc
17b0: 79 20 20 20 20 20 20 20 2d 3e 20 70 6f 73 69 74 y -> posit
17c0: 69 6f 6e 73 20 69 74 20 63 72 6f 73 73 65 73 0a ions it crosses.
17d0: 09 23 20 4c 69 73 74 3a 20 52 41 4e 47 45 20 4f .# List: RANGE O
17e0: 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 f the positions
17f0: 69 74 73 65 6c 66 2e 0a 09 23 20 41 20 64 65 70 itself...# A dep
1800: 65 6e 64 65 6e 63 79 20 69 73 20 61 20 73 69 6e endency is a sin
1810: 67 6c 65 2d 65 6c 65 6d 65 6e 74 20 6d 61 70 20 gle-element map
1820: 70 61 72 65 6e 74 20 2d 3e 20 63 68 69 6c 64 0a parent -> child.
1830: 0a 09 49 6e 69 74 69 61 6c 69 7a 65 42 72 65 61 ..InitializeBrea
1840: 6b 53 74 61 74 65 20 24 6d 79 69 74 65 6d 73 0a kState $myitems.
1850: 0a 09 73 65 74 20 66 72 61 67 6d 65 6e 74 73 20 ..set fragments
1860: 7b 7d 0a 09 73 65 74 20 70 65 6e 64 69 6e 67 20 {}..set pending
1870: 20 20 5b 6c 69 73 74 20 24 72 61 6e 67 65 5d 0a [list $range].
1880: 09 73 65 74 20 61 74 20 20 20 20 20 20 20 20 30 .set at 0
1890: 0a 09 61 72 72 61 79 20 73 65 74 20 62 72 65 61 ..array set brea
18a0: 6b 73 20 7b 7d 0a 0a 09 77 68 69 6c 65 20 7b 24 ks {}...while {$
18b0: 61 74 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24 70 at < [llength $p
18c0: 65 6e 64 69 6e 67 5d 7d 20 7b 0a 09 20 20 20 20 ending]} {..
18d0: 73 65 74 20 63 75 72 72 65 6e 74 20 5b 6c 69 6e set current [lin
18e0: 64 65 78 20 24 70 65 6e 64 69 6e 67 20 24 61 74 dex $pending $at
18f0: 5d 0a 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 ]... log writ
1900: 65 20 36 20 63 73 65 74 73 20 7b 2e 20 2e 20 2e e 6 csets {. . .
1910: 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e 2e 2e . ... ..... ....
1920: 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e .... ...........
1930: 2e 2e 7d 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 ..}.. log wri
1940: 74 65 20 36 20 63 73 65 74 73 20 7b 53 63 68 65 te 6 csets {Sche
1950: 64 75 6c 65 64 20 20 20 5b 6a 6f 69 6e 20 5b 50 duled [join [P
1960: 52 73 20 5b 6c 72 61 6e 67 65 20 24 70 65 6e 64 Rs [lrange $pend
1970: 69 6e 67 20 24 61 74 20 65 6e 64 5d 5d 20 7b 20 ing $at end]] {
1980: 7d 5d 7d 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 }]}.. log wri
1990: 74 65 20 36 20 63 73 65 74 73 20 7b 43 6f 6e 73 te 6 csets {Cons
19a0: 69 64 65 72 69 6e 67 20 5b 50 52 20 24 63 75 72 idering [PR $cur
19b0: 72 65 6e 74 5d 20 5c 5b 24 61 74 2f 5b 6c 6c 65 rent] \[$at/[lle
19c0: 6e 67 74 68 20 24 70 65 6e 64 69 6e 67 5d 5c 5d ngth $pending]\]
19d0: 7d 0a 0a 09 20 20 20 20 73 65 74 20 62 65 73 74 }... set best
19e0: 20 5b 46 69 6e 64 42 65 73 74 42 72 65 61 6b 20 [FindBestBreak
19f0: 24 63 75 72 72 65 6e 74 5d 0a 0a 09 20 20 20 20 $current]...
1a00: 69 66 20 7b 24 62 65 73 74 20 3c 20 30 7d 20 7b if {$best < 0} {
1a10: 0a 09 09 23 20 54 68 65 20 69 6e 73 70 65 63 74 ...# The inspect
1a20: 65 64 20 72 61 6e 67 65 20 68 61 73 20 6e 6f 20 ed range has no
1a30: 69 6e 74 65 72 6e 61 6c 0a 09 09 23 20 64 65 70 internal...# dep
1a40: 65 6e 64 65 6e 63 69 65 73 2e 20 54 68 69 73 20 endencies. This
1a50: 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 66 72 is a complete fr
1a60: 61 67 6d 65 6e 74 2e 0a 09 09 6c 61 70 70 65 6e agment....lappen
1a70: 64 20 66 72 61 67 6d 65 6e 74 73 20 24 63 75 72 d fragments $cur
1a80: 72 65 6e 74 0a 0a 09 09 6c 6f 67 20 77 72 69 74 rent....log writ
1a90: 65 20 36 20 63 73 65 74 73 20 22 4e 6f 20 62 72 e 6 csets "No br
1aa0: 65 61 6b 73 2c 20 66 69 6e 61 6c 22 0a 09 20 20 eaks, final"..
1ab0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 23 20 53 } else {...# S
1ac0: 70 6c 69 74 20 74 68 65 20 72 61 6e 67 65 20 61 plit the range a
1ad0: 6e 64 20 73 63 68 65 64 75 6c 65 20 74 68 65 20 nd schedule the
1ae0: 72 65 73 75 6c 74 69 6e 67 20 66 72 61 67 6d 65 resulting fragme
1af0: 6e 74 73 0a 09 09 23 20 66 6f 72 20 66 75 72 74 nts...# for furt
1b00: 68 65 72 20 69 6e 73 70 65 63 74 69 6f 6e 2e 20 her inspection.
1b10: 52 65 6d 65 6d 62 65 72 20 74 68 65 20 6e 75 6d Remember the num
1b20: 62 65 72 20 6f 66 0a 09 09 23 20 64 65 70 65 6e ber of...# depen
1b30: 64 65 6e 63 69 65 73 20 63 75 74 20 62 65 66 6f dencies cut befo
1b40: 72 65 20 77 65 20 72 65 6d 6f 76 65 20 74 68 65 re we remove the
1b50: 6d 20 66 72 6f 6d 0a 09 09 23 20 63 6f 6e 73 69 m from...# consi
1b60: 64 65 72 61 74 69 6f 6e 2c 20 66 6f 72 20 64 6f deration, for do
1b70: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 6c 61 74 65 cumentation late
1b80: 72 2e 0a 0a 09 09 73 65 74 20 62 72 65 61 6b 73 r.....set breaks
1b90: 28 24 62 65 73 74 29 20 24 63 72 6f 73 73 28 24 ($best) $cross($
1ba0: 62 65 73 74 29 0a 0a 09 09 6c 6f 67 20 77 72 69 best)....log wri
1bb0: 74 65 20 36 20 63 73 65 74 73 20 22 42 65 73 74 te 6 csets "Best
1bc0: 20 62 72 65 61 6b 20 40 20 24 62 65 73 74 2c 20 break @ $best,
1bd0: 63 75 74 74 69 6e 67 20 5b 6e 73 70 20 24 63 72 cutting [nsp $cr
1be0: 6f 73 73 28 24 62 65 73 74 29 20 64 65 70 65 6e oss($best) depen
1bf0: 64 65 6e 63 79 20 64 65 70 65 6e 64 65 6e 63 69 dency dependenci
1c00: 65 73 5d 22 0a 0a 09 09 23 20 4e 6f 74 65 3a 20 es]"....# Note:
1c10: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 62 65 73 The value of bes
1c20: 74 20 69 73 20 61 6e 20 61 62 6f 6c 75 74 65 20 t is an abolute
1c30: 6c 6f 63 61 74 69 6f 6e 20 69 6e 0a 09 09 23 20 location in...#
1c40: 6d 79 69 74 65 6d 73 2e 20 55 73 65 20 74 68 65 myitems. Use the
1c50: 20 73 74 61 72 74 20 6f 66 20 63 75 72 72 65 6e start of curren
1c60: 74 20 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 0a t to make it an.
1c70: 09 09 23 20 69 6e 64 65 78 20 61 62 73 6f 6c 75 ..# index absolu
1c80: 74 65 20 74 6f 20 63 75 72 72 65 6e 74 2e 0a 0a te to current...
1c90: 09 09 73 65 74 20 62 72 65 6c 20 5b 65 78 70 72 ..set brel [expr
1ca0: 20 7b 24 62 65 73 74 20 2d 20 5b 6c 69 6e 64 65 {$best - [linde
1cb0: 78 20 24 63 75 72 72 65 6e 74 20 30 5d 7d 5d 0a x $current 0]}].
1cc0: 09 09 73 65 74 20 62 6e 65 78 74 20 24 62 72 65 ..set bnext $bre
1cd0: 6c 20 3b 20 69 6e 63 72 20 62 6e 65 78 74 0a 09 l ; incr bnext..
1ce0: 09 73 65 74 20 66 72 61 67 62 65 66 6f 72 65 20 .set fragbefore
1cf0: 5b 6c 72 61 6e 67 65 20 24 63 75 72 72 65 6e 74 [lrange $current
1d00: 20 30 20 24 62 72 65 6c 5d 0a 09 09 73 65 74 20 0 $brel]...set
1d10: 66 72 61 67 61 66 74 65 72 20 20 5b 6c 72 61 6e fragafter [lran
1d20: 67 65 20 24 63 75 72 72 65 6e 74 20 24 62 6e 65 ge $current $bne
1d30: 78 74 20 65 6e 64 5d 0a 0a 09 09 6c 6f 67 20 77 xt end]....log w
1d40: 72 69 74 65 20 36 20 63 73 65 74 73 20 22 4e 65 rite 6 csets "Ne
1d50: 77 20 70 69 65 63 65 73 20 20 5b 50 52 20 24 66 w pieces [PR $f
1d60: 72 61 67 62 65 66 6f 72 65 5d 20 5b 50 52 20 24 ragbefore] [PR $
1d70: 66 72 61 67 61 66 74 65 72 5d 22 0a 0a 09 09 69 fragafter]"....i
1d80: 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 ntegrity assert
1d90: 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 72 61 67 62 {[llength $fragb
1da0: 65 66 6f 72 65 5d 7d 20 7b 46 6f 75 6e 64 20 7a efore]} {Found z
1db0: 65 72 6f 2d 6c 65 6e 67 74 68 20 66 72 61 67 6d ero-length fragm
1dc0: 65 6e 74 20 61 74 20 74 68 65 20 62 65 67 69 6e ent at the begin
1dd0: 6e 69 6e 67 7d 0a 09 09 69 6e 74 65 67 72 69 74 ning}...integrit
1de0: 79 20 61 73 73 65 72 74 20 7b 5b 6c 6c 65 6e 67 y assert {[lleng
1df0: 74 68 20 24 66 72 61 67 61 66 74 65 72 5d 7d 20 th $fragafter]}
1e00: 20 7b 46 6f 75 6e 64 20 7a 65 72 6f 2d 6c 65 6e {Found zero-len
1e10: 67 74 68 20 66 72 61 67 6d 65 6e 74 20 61 74 20 gth fragment at
1e20: 74 68 65 20 65 6e 64 7d 0a 0a 09 09 6c 61 70 70 the end}....lapp
1e30: 65 6e 64 20 70 65 6e 64 69 6e 67 20 24 66 72 61 end pending $fra
1e40: 67 62 65 66 6f 72 65 20 24 66 72 61 67 61 66 74 gbefore $fragaft
1e50: 65 72 0a 09 09 43 75 74 41 74 20 24 62 65 73 74 er...CutAt $best
1e60: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 6e .. }... in
1e70: 63 72 20 61 74 0a 09 7d 0a 0a 09 6c 6f 67 20 77 cr at..}...log w
1e80: 72 69 74 65 20 36 20 63 73 65 74 73 20 22 2e 20 rite 6 csets ".
1e90: 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e . .. ... ..... .
1ea0: 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e ....... ........
1eb0: 2e 2e 2e 2e 2e 22 0a 0a 09 23 20 28 2a 29 20 57 ....."...# (*) W
1ec0: 65 20 63 6c 65 61 72 20 6f 75 74 20 74 68 65 20 e clear out the
1ed0: 61 73 73 6f 63 69 61 74 65 64 20 70 61 72 74 20 associated part
1ee0: 6f 66 20 74 68 65 20 6d 79 69 74 65 6d 6d 61 70 of the myitemmap
1ef0: 0a 09 23 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6e ..# in-memory in
1f00: 64 65 78 20 69 6e 20 70 72 65 70 61 72 61 74 69 dex in preparati
1f10: 6f 6e 20 66 6f 72 20 6e 65 77 20 64 61 74 61 2e on for new data.
1f20: 20 41 20 73 69 6d 70 6c 65 20 75 6e 73 65 74 0a A simple unset.
1f30: 09 23 20 69 73 20 65 6e 6f 75 67 68 2c 20 77 65 .# is enough, we
1f40: 20 68 61 76 65 20 6e 6f 20 73 79 6d 62 6f 6c 20 have no symbol
1f50: 63 68 61 6e 67 65 73 65 74 73 20 61 74 20 74 68 changesets at th
1f60: 69 73 20 74 69 6d 65 2c 20 61 6e 64 0a 09 23 20 is time, and..#
1f70: 74 68 75 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 thus never more
1f80: 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e than one referen
1f90: 63 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a ce in the list..
1fa0: 0a 09 66 6f 72 65 61 63 68 20 69 69 64 20 24 6d ..foreach iid $m
1fb0: 79 69 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65 yitems {.. se
1fc0: 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79 74 t key [list $myt
1fd0: 79 70 65 20 24 69 69 64 5d 0a 09 20 20 20 20 75 ype $iid].. u
1fe0: 6e 73 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24 nset myitemmap($
1ff0: 6b 65 79 29 0a 09 20 20 20 20 6c 6f 67 20 77 72 key).. log wr
2000: 69 74 65 20 38 20 63 73 65 74 73 20 7b 4d 41 50 ite 8 csets {MAP
2010: 2d 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73 - item <$key> $s
2020: 65 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 elf = [$self str
2030: 5d 7d 0a 09 7d 0a 0a 09 23 20 43 72 65 61 74 65 ]}..}...# Create
2040: 20 63 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20 changesets for
2050: 74 68 65 20 66 72 61 67 6d 65 6e 74 73 2c 20 72 the fragments, r
2060: 65 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 eusing the curre
2070: 6e 74 20 6f 6e 65 0a 09 23 20 66 6f 72 20 74 68 nt one..# for th
2080: 65 20 66 69 72 73 74 20 66 72 61 67 6d 65 6e 74 e first fragment
2090: 2e 20 57 65 20 73 6f 72 74 20 74 68 65 6d 20 69 . We sort them i
20a0: 6e 20 6f 72 64 65 72 20 74 6f 20 61 6c 6c 6f 77 n order to allow
20b0: 0a 09 23 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 ..# checking for
20c0: 20 67 61 70 73 20 61 6e 64 20 6e 69 63 65 20 6d gaps and nice m
20d0: 65 73 73 61 67 65 73 2e 0a 0a 09 73 65 74 20 66 essages....set f
20e0: 72 61 67 6d 65 6e 74 73 20 5b 6c 73 6f 72 74 20 ragments [lsort
20f0: 2d 69 6e 64 65 78 20 30 20 2d 69 6e 74 65 67 65 -index 0 -intege
2100: 72 20 24 66 72 61 67 6d 65 6e 74 73 5d 0a 0a 09 r $fragments]...
2110: 23 70 75 74 73 20 5c 74 2e 5b 6a 6f 69 6e 20 5b #puts \t.[join [
2120: 50 52 73 20 24 66 72 61 67 6d 65 6e 74 73 5d 20 PRs $fragments]
2130: 2e 5c 6e 5c 74 2e 5d 2e 0a 0a 09 42 6f 72 64 65 .\n\t.]....Borde
2140: 72 20 5b 6c 69 6e 64 65 78 20 24 66 72 61 67 6d r [lindex $fragm
2150: 65 6e 74 73 20 30 5d 20 66 69 72 73 74 73 20 66 ents 0] firsts f
2160: 69 72 73 74 65 0a 0a 09 69 6e 74 65 67 72 69 74 irste...integrit
2170: 79 20 61 73 73 65 72 74 20 7b 24 66 69 72 73 74 y assert {$first
2180: 73 20 3d 3d 20 30 7d 20 7b 42 61 64 20 66 72 61 s == 0} {Bad fra
2190: 67 6d 65 6e 74 20 73 74 61 72 74 20 40 20 24 66 gment start @ $f
21a0: 69 72 73 74 73 2c 20 67 61 70 2c 20 6f 72 20 62 irsts, gap, or b
21b0: 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 20 efore beginning
21c0: 6f 66 20 74 68 65 20 72 61 6e 67 65 7d 0a 0a 09 of the range}...
21d0: 73 65 74 20 6c 61 73 74 65 20 24 66 69 72 73 74 set laste $first
21e0: 65 0a 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d e..foreach fragm
21f0: 65 6e 74 20 5b 6c 72 61 6e 67 65 20 24 66 72 61 ent [lrange $fra
2200: 67 6d 65 6e 74 73 20 31 20 65 6e 64 5d 20 7b 0a gments 1 end] {.
2210: 09 20 20 20 20 42 6f 72 64 65 72 20 24 66 72 61 . Border $fra
2220: 67 6d 65 6e 74 20 73 20 65 0a 09 20 20 20 20 69 gment s e.. i
2230: 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 ntegrity assert
2240: 7b 24 6c 61 73 74 65 20 3d 3d 20 28 24 73 20 2d {$laste == ($s -
2250: 20 31 29 7d 20 7b 42 61 64 20 66 72 61 67 6d 65 1)} {Bad fragme
2260: 6e 74 20 62 6f 72 64 65 72 20 3c 24 6c 61 73 74 nt border <$last
2270: 65 20 7c 20 24 73 3e 2c 20 67 61 70 20 6f 72 20 e | $s>, gap or
2280: 6f 76 65 72 6c 61 70 7d 0a 0a 09 20 20 20 20 73 overlap}... s
2290: 65 74 20 6e 65 77 20 5b 24 74 79 70 65 20 25 41 et new [$type %A
22a0: 55 54 4f 25 20 24 6d 79 70 72 6f 6a 65 63 74 20 UTO% $myproject
22b0: 24 6d 79 74 79 70 65 20 24 6d 79 73 72 63 69 64 $mytype $mysrcid
22c0: 20 5b 6c 72 61 6e 67 65 20 24 6d 79 69 74 65 6d [lrange $myitem
22d0: 73 20 24 73 20 24 65 5d 5d 0a 0a 20 20 20 20 20 s $s $e]]..
22e0: 20 20 20 20 20 20 20 6c 6f 67 20 77 72 69 74 65 log write
22f0: 20 34 20 63 73 65 74 73 20 22 42 72 65 61 6b 69 4 csets "Breaki
2300: 6e 67 20 5b 24 73 65 6c 66 20 73 74 72 20 5d 20 ng [$self str ]
2310: 40 20 24 6c 61 73 74 65 2c 20 6e 65 77 20 5b 24 @ $laste, new [$
2320: 6e 65 77 20 73 74 72 5d 2c 20 63 75 74 74 69 6e new str], cuttin
2330: 67 20 24 62 72 65 61 6b 73 28 24 6c 61 73 74 65 g $breaks($laste
2340: 29 22 0a 0a 09 20 20 20 20 73 65 74 20 6c 61 73 )"... set las
2350: 74 65 20 24 65 0a 09 7d 0a 0a 09 69 6e 74 65 67 te $e..}...integ
2360: 72 69 74 79 20 61 73 73 65 72 74 20 7b 0a 09 20 rity assert {..
2370: 20 20 20 24 6c 61 73 74 65 20 3d 3d 20 28 5b 6c $laste == ([l
2380: 6c 65 6e 67 74 68 20 24 6d 79 69 74 65 6d 73 5d length $myitems]
2390: 2d 31 29 0a 09 7d 20 7b 42 61 64 20 66 72 61 67 -1)..} {Bad frag
23a0: 6d 65 6e 74 20 65 6e 64 20 40 20 24 6c 61 73 74 ment end @ $last
23b0: 65 2c 20 67 61 70 2c 20 6f 72 20 62 65 79 6f 6e e, gap, or beyon
23c0: 64 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e d end of the ran
23d0: 67 65 7d 0a 0a 09 23 20 50 75 74 20 74 68 65 20 ge}...# Put the
23e0: 66 69 72 73 74 20 66 72 61 67 6d 65 6e 74 20 69 first fragment i
23f0: 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 nto the current
2400: 63 68 61 6e 67 65 73 65 74 2c 20 61 6e 64 0a 09 changeset, and..
2410: 23 20 75 70 64 61 74 65 20 74 68 65 20 69 6e 2d # update the in-
2420: 6d 65 6d 6f 72 79 20 69 6e 64 65 78 2e 20 57 65 memory index. We
2430: 20 63 61 6e 20 73 69 6d 70 6c 79 20 28 72 65 29 can simply (re)
2440: 61 64 64 20 74 68 65 20 69 74 65 6d 73 0a 09 23 add the items..#
2450: 20 62 65 63 61 75 73 65 20 77 65 20 63 6c 65 61 because we clea
2460: 72 65 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 red the previous
2470: 6c 79 20 65 78 69 73 74 69 6e 67 20 69 6e 66 6f ly existing info
2480: 72 6d 61 74 69 6f 6e 2c 20 73 65 65 0a 09 23 20 rmation, see..#
2490: 28 2a 29 20 61 62 6f 76 65 2e 20 50 65 72 73 69 (*) above. Persi
24a0: 73 74 65 6e 63 65 20 64 6f 65 73 20 6e 6f 74 20 stence does not
24b0: 6d 61 74 74 65 72 20 68 65 72 65 2c 20 6e 6f 6e matter here, non
24c0: 65 20 6f 66 20 74 68 65 0a 09 23 20 63 68 61 6e e of the..# chan
24d0: 67 65 73 65 74 73 20 68 61 73 20 62 65 65 6e 20 gesets has been
24e0: 73 61 76 65 64 20 74 6f 20 74 68 65 20 70 65 72 saved to the per
24f0: 73 69 73 74 65 6e 74 20 73 74 61 74 65 20 79 65 sistent state ye
2500: 74 2e 0a 0a 09 73 65 74 20 6d 79 69 74 65 6d 73 t....set myitems
2510: 20 20 5b 6c 72 61 6e 67 65 20 24 6d 79 69 74 65 [lrange $myite
2520: 6d 73 20 20 30 20 24 66 69 72 73 74 65 5d 0a 09 ms 0 $firste]..
2530: 73 65 74 20 6d 79 74 69 74 65 6d 73 20 5b 6c 72 set mytitems [lr
2540: 61 6e 67 65 20 24 6d 79 74 69 74 65 6d 73 20 30 ange $mytitems 0
2550: 20 24 66 69 72 73 74 65 5d 0a 09 66 6f 72 65 61 $firste]..forea
2560: 63 68 20 69 69 64 20 24 6d 79 69 74 65 6d 73 20 ch iid $myitems
2570: 7b 0a 09 20 20 20 20 73 65 74 20 6b 65 79 20 5b {.. set key [
2580: 6c 69 73 74 20 24 6d 79 74 79 70 65 20 24 69 69 list $mytype $ii
2590: 64 5d 0a 09 20 20 20 20 73 65 74 20 6d 79 69 74 d].. set myit
25a0: 65 6d 6d 61 70 28 24 6b 65 79 29 20 24 73 65 6c emmap($key) $sel
25b0: 66 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 f.. log write
25c0: 20 38 20 63 73 65 74 73 20 7b 4d 41 50 2b 20 69 8 csets {MAP+ i
25d0: 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73 65 6c 66 tem <$key> $self
25e0: 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d 7d 0a = [$self str]}.
25f0: 09 7d 0a 0a 09 72 65 74 75 72 6e 20 31 0a 20 20 .}...return 1.
2600: 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 }.. method
2610: 70 65 72 73 69 73 74 20 7b 7d 20 7b 0a 09 73 65 persist {} {..se
2620: 74 20 74 69 64 20 24 6d 79 63 73 74 79 70 65 28 t tid $mycstype(
2630: 24 6d 79 74 79 70 65 29 0a 09 73 65 74 20 70 69 $mytype)..set pi
2640: 64 20 5b 24 6d 79 70 72 6f 6a 65 63 74 20 69 64 d [$myproject id
2650: 5d 0a 09 73 65 74 20 70 6f 73 20 30 0a 0a 09 73 ]..set pos 0...s
2660: 74 61 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e tate transaction
2670: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 20 72 75 {.. state ru
2680: 6e 20 7b 0a 09 09 49 4e 53 45 52 54 20 49 4e 54 n {...INSERT INT
2690: 4f 20 63 68 61 6e 67 65 73 65 74 20 28 63 69 64 O changeset (cid
26a0: 2c 20 20 20 70 69 64 2c 20 20 74 79 70 65 2c 20 , pid, type,
26b0: 73 72 63 29 0a 09 09 56 41 4c 55 45 53 20 20 20 src)...VALUES
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 24 6d ($m
26d0: 79 69 64 2c 20 24 70 69 64 2c 20 24 74 69 64 2c yid, $pid, $tid,
26e0: 20 24 6d 79 73 72 63 69 64 29 3b 0a 09 20 20 20 $mysrcid);..
26f0: 20 7d 0a 0a 09 20 20 20 20 66 6f 72 65 61 63 68 }... foreach
2700: 20 69 69 64 20 24 6d 79 69 74 65 6d 73 20 7b 0a iid $myitems {.
2710: 09 09 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 ..state run {...
2720: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 INSERT INTO
2730: 63 73 69 74 65 6d 20 28 63 69 64 2c 20 20 20 70 csitem (cid, p
2740: 6f 73 2c 20 20 69 69 64 29 0a 09 09 20 20 20 20 os, iid)...
2750: 56 41 4c 55 45 53 20 20 20 20 20 20 20 20 20 20 VALUES
2760: 20 20 20 28 24 6d 79 69 64 2c 20 24 70 6f 73 2c ($myid, $pos,
2770: 20 24 69 69 64 29 3b 0a 09 09 7d 0a 09 09 69 6e $iid);...}...in
2780: 63 72 20 70 6f 73 0a 09 20 20 20 20 7d 0a 09 7d cr pos.. }..}
2790: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a ..return. }..
27a0: 20 20 20 20 6d 65 74 68 6f 64 20 74 69 6d 65 72 method timer
27b0: 61 6e 67 65 20 7b 7d 20 7b 20 72 65 74 75 72 6e ange {} { return
27c0: 20 5b 24 6d 79 74 79 70 65 6f 62 6a 20 74 69 6d [$mytypeobj tim
27d0: 65 72 61 6e 67 65 20 24 6d 79 69 74 65 6d 73 5d erange $myitems]
27e0: 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 64 }.. method d
27f0: 72 6f 70 20 7b 7d 20 7b 0a 09 6c 6f 67 20 77 72 rop {} {..log wr
2800: 69 74 65 20 38 20 63 73 65 74 73 20 7b 44 72 6f ite 8 csets {Dro
2810: 70 70 69 6e 67 20 24 73 65 6c 66 20 3d 20 5b 24 pping $self = [$
2820: 73 65 6c 66 20 73 74 72 5d 7d 0a 0a 09 73 74 61 self str]}...sta
2830: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b te transaction {
2840: 0a 09 20 20 20 20 73 74 61 74 65 20 72 75 6e 20 .. state run
2850: 7b 0a 09 09 44 45 4c 45 54 45 20 46 52 4f 4d 20 {...DELETE FROM
2860: 63 68 61 6e 67 65 73 65 74 20 57 48 45 52 45 20 changeset WHERE
2870: 63 69 64 20 3d 20 24 6d 79 69 64 3b 0a 09 09 44 cid = $myid;...D
2880: 45 4c 45 54 45 20 46 52 4f 4d 20 63 73 69 74 65 ELETE FROM csite
2890: 6d 20 20 20 20 57 48 45 52 45 20 63 69 64 20 3d m WHERE cid =
28a0: 20 24 6d 79 69 64 3b 0a 09 20 20 20 20 7d 0a 09 $myid;.. }..
28b0: 7d 0a 09 66 6f 72 65 61 63 68 20 69 69 64 20 24 }..foreach iid $
28c0: 6d 79 69 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 myitems {.. s
28d0: 65 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79 et key [list $my
28e0: 74 79 70 65 20 24 69 69 64 5d 0a 09 20 20 20 20 type $iid]..
28f0: 75 6e 73 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 unset myitemmap(
2900: 24 6b 65 79 29 0a 09 20 20 20 20 6c 6f 67 20 77 $key).. log w
2910: 72 69 74 65 20 38 20 63 73 65 74 73 20 7b 4d 41 rite 8 csets {MA
2920: 50 2d 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24 P- item <$key> $
2930: 73 65 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74 self = [$self st
2940: 72 5d 7d 0a 09 7d 0a 09 73 65 74 20 70 6f 73 20 r]}..}..set pos
2950: 20 20 20 20 20 20 20 20 20 5b 6c 73 65 61 72 63 [lsearc
2960: 68 20 2d 65 78 61 63 74 20 24 6d 79 63 68 61 6e h -exact $mychan
2970: 67 65 73 65 74 73 20 24 73 65 6c 66 5d 0a 09 73 gesets $self]..s
2980: 65 74 20 6d 79 63 68 61 6e 67 65 73 65 74 73 20 et mychangesets
2990: 5b 6c 72 65 70 6c 61 63 65 20 24 6d 79 63 68 61 [lreplace $mycha
29a0: 6e 67 65 73 65 74 73 20 24 70 6f 73 20 24 70 6f ngesets $pos $po
29b0: 73 5d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d s]..return. }
29c0: 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 65 6c .. method sel
29d0: 66 72 65 66 65 72 65 6e 74 69 61 6c 20 7b 7d 20 freferential {}
29e0: 7b 0a 09 6c 6f 67 20 77 72 69 74 65 20 39 20 63 {..log write 9 c
29f0: 73 65 74 73 20 7b 43 68 65 63 6b 69 6e 67 20 5b sets {Checking [
2a00: 24 73 65 6c 66 20 73 74 72 5d 20 2f 5b 6c 6c 65 $self str] /[lle
2a10: 6e 67 74 68 20 24 6d 79 69 74 65 6d 73 5d 7d 0a ngth $myitems]}.
2a20: 0a 09 69 66 20 7b 21 5b 73 74 72 75 63 74 3a 3a ..if {![struct::
2a30: 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 5b 24 73 set contains [$s
2a40: 65 6c 66 20 73 75 63 63 65 73 73 6f 72 73 5d 20 elf successors]
2a50: 24 73 65 6c 66 5d 7d 20 7b 0a 09 20 20 20 20 72 $self]} {.. r
2a60: 65 74 75 72 6e 20 30 0a 09 7d 0a 09 69 66 20 7b eturn 0..}..if {
2a70: 5b 6c 6f 67 20 76 65 72 62 6f 73 69 74 79 3f 5d [log verbosity?]
2a80: 20 3c 20 38 7d 20 7b 20 72 65 74 75 72 6e 20 31 < 8} { return 1
2a90: 20 7d 0a 0a 09 23 20 50 72 69 6e 74 20 74 68 65 }...# Print the
2aa0: 20 64 65 74 61 69 6c 65 64 20 73 75 63 63 65 73 detailed succes
2ab0: 73 6f 72 20 73 74 72 75 63 74 75 72 65 20 6f 66 sor structure of
2ac0: 20 74 68 65 20 73 65 6c 66 2d 0a 09 23 20 72 65 the self-..# re
2ad0: 66 65 72 65 6e 74 69 61 6c 20 63 68 61 6e 67 65 ferential change
2ae0: 73 65 74 2c 20 69 66 20 74 68 65 20 76 65 72 62 set, if the verb
2af0: 6f 73 69 74 79 20 6f 66 20 74 68 65 20 6c 6f 67 osity of the log
2b00: 20 69 73 20 64 69 61 6c 65 64 0a 09 23 20 68 69 is dialed..# hi
2b10: 67 68 20 65 6e 6f 75 67 68 2e 0a 0a 09 6c 6f 67 gh enough....log
2b20: 20 77 72 69 74 65 20 38 20 63 73 65 74 73 20 5b write 8 csets [
2b30: 73 65 74 20 68 64 72 20 7b 53 65 6c 66 2d 72 65 set hdr {Self-re
2b40: 66 65 72 65 6e 74 69 61 6c 20 63 68 61 6e 67 65 ferential change
2b50: 73 65 74 20 5b 24 73 65 6c 66 20 73 74 72 5d 20 set [$self str]
2b60: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f ________________
2b70: 5f 5f 7d 5d 0a 09 61 72 72 61 79 20 73 65 74 20 __}]..array set
2b80: 6e 6d 61 70 20 5b 24 73 65 6c 66 20 6e 65 78 74 nmap [$self next
2b90: 6d 61 70 5d 0a 09 66 6f 72 65 61 63 68 20 69 74 map]..foreach it
2ba0: 65 6d 20 5b 6c 73 6f 72 74 20 2d 64 69 63 74 20 em [lsort -dict
2bb0: 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 6e 6d 61 [array names nma
2bc0: 70 5d 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 p]] {.. forea
2bd0: 63 68 20 73 75 63 63 69 74 65 6d 20 24 6e 6d 61 ch succitem $nma
2be0: 70 28 24 69 74 65 6d 29 20 7b 0a 09 09 73 65 74 p($item) {...set
2bf0: 20 73 75 63 63 63 73 20 24 6d 79 69 74 65 6d 6d succcs $myitemm
2c00: 61 70 28 24 73 75 63 63 69 74 65 6d 29 0a 09 09 ap($succitem)...
2c10: 73 65 74 20 68 69 6e 74 20 5b 65 78 70 72 20 7b set hint [expr {
2c20: 28 24 73 75 63 63 63 73 20 65 71 20 24 73 65 6c ($succcs eq $sel
2c30: 66 29 0a 09 09 09 09 3f 20 22 4c 4f 4f 50 22 0a f).....? "LOOP".
2c40: 09 09 09 09 3a 20 22 20 20 20 20 22 7d 5d 0a 09 ....: " "}]..
2c50: 09 73 65 74 20 69 20 20 20 22 3c 24 69 74 65 6d .set i "<$item
2c60: 20 5b 24 74 79 70 65 20 69 74 65 6d 73 74 72 20 [$type itemstr
2c70: 24 69 74 65 6d 5d 3e 22 0a 09 09 73 65 74 20 73 $item]>"...set s
2c80: 20 20 20 22 3c 24 73 75 63 63 69 74 65 6d 20 5b "<$succitem [
2c90: 24 74 79 70 65 20 69 74 65 6d 73 74 72 20 24 73 $type itemstr $s
2ca0: 75 63 63 69 74 65 6d 5d 3e 22 0a 09 09 73 65 74 uccitem]>"...set
2cb0: 20 73 63 73 20 5b 24 73 75 63 63 63 73 20 73 74 scs [$succcs st
2cc0: 72 5d 0a 09 09 6c 6f 67 20 77 72 69 74 65 20 38 r]...log write 8
2cd0: 20 63 73 65 74 73 20 7b 24 68 69 6e 74 20 2a 20 csets {$hint *
2ce0: 24 69 20 2d 2d 3e 20 24 73 20 2d 2d 3e 20 63 73 $i --> $s --> cs
2cf0: 20 24 73 63 73 7d 0a 09 20 20 20 20 7d 0a 09 7d $scs}.. }..}
2d00: 0a 09 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73 ..log write 8 cs
2d10: 65 74 73 20 5b 72 65 67 73 75 62 20 2d 61 6c 6c ets [regsub -all
2d20: 20 7b 5b 5e 20 09 5d 7d 20 24 68 64 72 20 7b 5f {[^ .]} $hdr {_
2d30: 7d 5d 0a 09 72 65 74 75 72 6e 20 31 0a 20 20 20 }]..return 1.
2d40: 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 }.. typemeth
2d50: 6f 64 20 73 70 6c 69 74 20 7b 63 73 65 74 20 61 od split {cset a
2d60: 72 67 73 7d 20 7b 0a 09 23 20 41 73 20 70 61 72 rgs} {..# As par
2d70: 74 20 6f 66 20 74 68 65 20 63 72 65 61 74 69 6f t of the creatio
2d80: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 61 n of the new cha
2d90: 6e 67 65 73 65 74 73 20 73 70 65 63 69 66 69 65 ngesets specifie
2da0: 64 20 69 6e 0a 09 23 20 41 52 47 53 20 61 73 20 d in..# ARGS as
2db0: 73 65 74 73 20 6f 66 20 69 74 65 6d 73 2c 20 61 sets of items, a
2dc0: 6c 6c 20 73 75 62 73 65 74 73 20 6f 66 20 43 53 ll subsets of CS
2dd0: 45 54 27 73 20 69 74 65 6d 20 73 65 74 2c 20 43 ET's item set, C
2de0: 53 45 54 0a 09 23 20 77 69 6c 6c 20 62 65 20 64 SET..# will be d
2df0: 72 6f 70 70 65 64 20 66 72 6f 6d 20 61 6c 6c 20 ropped from all
2e00: 64 61 74 61 62 61 73 65 73 2c 20 69 6e 20 61 6e databases, in an
2e10: 64 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2c d out of memory,
2e20: 0a 09 23 20 61 6e 64 20 74 68 65 6e 20 64 65 73 ..# and then des
2e30: 74 72 6f 79 65 64 2e 0a 09 23 0a 09 23 20 4e 6f troyed...#..# No
2e40: 74 65 3a 20 54 68 65 20 69 74 65 6d 20 6c 69 73 te: The item lis
2e50: 74 73 20 66 6f 75 6e 64 20 69 6e 20 61 72 67 73 ts found in args
2e60: 20 61 72 65 20 74 61 67 67 65 64 20 69 74 65 6d are tagged item
2e70: 73 2e 20 54 68 65 79 0a 09 23 20 68 61 76 65 20 s. They..# have
2e80: 74 6f 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 to have the same
2e90: 20 74 79 70 65 20 61 73 20 74 68 65 20 63 68 61 type as the cha
2ea0: 6e 67 65 73 65 74 2c 20 62 65 69 6e 67 20 73 75 ngeset, being su
2eb0: 62 73 65 74 73 0a 09 23 20 6f 66 20 69 74 73 20 bsets..# of its
2ec0: 69 74 65 6d 73 2e 20 54 68 69 73 20 69 73 20 63 items. This is c
2ed0: 68 65 63 6b 65 64 20 69 6e 20 55 6e 74 61 67 31 hecked in Untag1
2ee0: 2e 0a 0a 09 23 20 43 6f 6e 73 74 72 61 69 6e 74 ....# Constraint
2ef0: 73 3a 20 4e 6f 20 66 72 61 67 6d 65 6e 74 20 6d s: No fragment m
2f00: 75 73 74 20 62 65 20 65 6d 70 74 79 2e 20 41 6c ust be empty. Al
2f10: 6c 20 66 72 61 67 6d 65 6e 74 73 20 68 61 76 65 l fragments have
2f20: 0a 09 23 20 74 6f 20 62 65 20 73 75 62 73 65 74 ..# to be subset
2f30: 73 20 6f 66 20 74 68 65 20 63 73 65 74 2e 20 54 s of the cset. T
2f40: 68 65 20 75 6e 69 6f 6e 20 68 61 73 20 74 6f 20 he union has to
2f50: 63 6f 76 65 72 20 74 68 65 0a 09 23 20 6f 72 69 cover the..# ori
2f60: 67 69 6e 61 6c 2e 20 41 6c 6c 20 70 61 69 72 77 ginal. All pairw
2f70: 69 73 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e ise intersection
2f80: 73 20 68 61 76 65 20 74 6f 20 62 65 20 65 6d 70 s have to be emp
2f90: 74 79 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 ty....log write
2fa0: 38 20 63 73 65 74 73 20 7b 4f 4c 44 3a 20 5b 6c 8 csets {OLD: [l
2fb0: 73 6f 72 74 20 5b 24 63 73 65 74 20 69 74 65 6d sort [$cset item
2fc0: 73 5d 5d 7d 0a 0a 09 73 65 74 20 63 6f 76 65 72 s]]}...set cover
2fd0: 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 66 72 61 {}..foreach fra
2fe0: 67 6d 65 6e 74 69 74 65 6d 73 20 24 61 72 67 73 gmentitems $args
2ff0: 20 7b 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 {.. log writ
3000: 65 20 38 20 63 73 65 74 73 20 7b 4e 45 57 3a 20 e 8 csets {NEW:
3010: 5b 6c 73 6f 72 74 20 24 66 72 61 67 6d 65 6e 74 [lsort $fragment
3020: 69 74 65 6d 73 5d 7d 0a 0a 09 20 20 20 20 69 6e items]}... in
3030: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b tegrity assert {
3040: 0a 09 09 21 5b 73 74 72 75 63 74 3a 3a 73 65 74 ...![struct::set
3050: 20 65 6d 70 74 79 20 24 66 72 61 67 6d 65 6e 74 empty $fragment
3060: 69 74 65 6d 73 5d 0a 09 20 20 20 20 7d 20 7b 63 items].. } {c
3070: 68 61 6e 67 65 73 65 74 20 66 72 61 67 6d 65 6e hangeset fragmen
3080: 74 20 69 73 20 65 6d 70 74 79 7d 0a 09 20 20 20 t is empty}..
3090: 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 integrity asser
30a0: 74 20 7b 0a 09 09 5b 73 74 72 75 63 74 3a 3a 73 t {...[struct::s
30b0: 65 74 20 73 75 62 73 65 74 6f 66 20 24 66 72 61 et subsetof $fra
30c0: 67 6d 65 6e 74 69 74 65 6d 73 20 5b 24 63 73 65 gmentitems [$cse
30d0: 74 20 69 74 65 6d 73 5d 5d 0a 09 20 20 20 20 7d t items]].. }
30e0: 20 7b 63 68 61 6e 67 65 73 65 74 20 66 72 61 67 {changeset frag
30f0: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 73 75 ment is not a su
3100: 62 73 65 74 7d 0a 09 20 20 20 20 73 74 72 75 63 bset}.. struc
3110: 74 3a 3a 73 65 74 20 61 64 64 20 63 6f 76 65 72 t::set add cover
3120: 20 24 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 0a $fragmentitems.
3130: 09 7d 0a 09 69 6e 74 65 67 72 69 74 79 20 61 73 .}..integrity as
3140: 73 65 72 74 20 7b 0a 09 20 20 20 20 5b 73 74 72 sert {.. [str
3150: 75 63 74 3a 3a 73 65 74 20 65 71 75 61 6c 20 24 uct::set equal $
3160: 63 6f 76 65 72 20 5b 24 63 73 65 74 20 69 74 65 cover [$cset ite
3170: 6d 73 5d 5d 0a 09 20 7d 20 7b 54 68 65 20 66 72 ms]].. } {The fr
3180: 61 67 6d 65 6e 74 73 20 64 6f 20 6e 6f 74 20 63 agments do not c
3190: 6f 76 65 72 20 74 68 65 20 6f 72 69 67 69 6e 61 over the origina
31a0: 6c 20 63 68 61 6e 67 65 73 65 74 7d 0a 09 73 65 l changeset}..se
31b0: 74 20 69 20 31 0a 09 66 6f 72 65 61 63 68 20 66 t i 1..foreach f
31c0: 69 61 20 24 61 72 67 73 20 7b 0a 09 20 20 20 20 ia $args {..
31d0: 66 6f 72 65 61 63 68 20 66 69 62 20 5b 6c 72 61 foreach fib [lra
31e0: 6e 67 65 20 24 61 72 67 73 20 24 69 20 65 6e 64 nge $args $i end
31f0: 5d 20 7b 0a 09 09 69 6e 74 65 67 72 69 74 79 20 ] {...integrity
3200: 61 73 73 65 72 74 20 7b 0a 09 09 20 20 20 20 5b assert {... [
3210: 73 74 72 75 63 74 3a 3a 73 65 74 20 65 6d 70 74 struct::set empt
3220: 79 20 5b 73 74 72 75 63 74 3a 3a 73 65 74 20 69 y [struct::set i
3230: 6e 74 65 72 73 65 63 74 20 24 66 69 61 20 24 66 ntersect $fia $f
3240: 69 62 5d 5d 0a 09 09 7d 20 7b 54 68 65 20 66 72 ib]]...} {The fr
3250: 61 67 6d 65 6e 74 73 20 3c 24 66 69 61 3e 20 61 agments <$fia> a
3260: 6e 64 20 3c 24 66 69 62 3e 20 6f 76 65 72 6c 61 nd <$fib> overla
3270: 70 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 p}.. }.. i
3280: 6e 63 72 20 69 0a 09 7d 0a 0a 09 23 20 41 6c 6c ncr i..}...# All
3290: 20 63 68 65 63 6b 73 20 70 61 73 73 2c 20 61 63 checks pass, ac
32a0: 74 75 61 6c 6c 79 20 70 65 72 66 6f 72 6d 20 74 tually perform t
32b0: 68 65 20 73 70 6c 69 74 2e 0a 0a 09 73 74 72 75 he split....stru
32c0: 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 ct::list assign
32d0: 5b 24 63 73 65 74 20 64 61 74 61 5d 20 70 72 6f [$cset data] pro
32e0: 6a 65 63 74 20 63 73 74 79 70 65 20 63 73 73 72 ject cstype cssr
32f0: 63 0a 0a 09 24 63 73 65 74 20 64 72 6f 70 0a 09 c...$cset drop..
3300: 24 63 73 65 74 20 64 65 73 74 72 6f 79 0a 0a 09 $cset destroy...
3310: 73 65 74 20 6e 65 77 63 73 65 74 73 20 7b 7d 0a set newcsets {}.
3320: 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65 6e .foreach fragmen
3330: 74 69 74 65 6d 73 20 24 61 72 67 73 20 7b 0a 09 titems $args {..
3340: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 38 20 log write 8
3350: 63 73 65 74 73 20 7b 4d 41 4b 45 3a 20 5b 6c 73 csets {MAKE: [ls
3360: 6f 72 74 20 24 66 72 61 67 6d 65 6e 74 69 74 65 ort $fragmentite
3370: 6d 73 5d 7d 0a 0a 09 20 20 20 20 73 65 74 20 66 ms]}... set f
3380: 72 61 67 6d 65 6e 74 20 5b 24 74 79 70 65 20 25 ragment [$type %
3390: 41 55 54 4f 25 20 24 70 72 6f 6a 65 63 74 20 24 AUTO% $project $
33a0: 63 73 74 79 70 65 20 24 63 73 73 72 63 20 5c 0a cstype $cssrc \.
33b0: 09 09 09 20 20 20 20 20 20 5b 55 6e 74 61 67 20 ... [Untag
33c0: 24 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 20 24 $fragmentitems $
33d0: 63 73 74 79 70 65 5d 5d 0a 09 20 20 20 20 6c 61 cstype]].. la
33e0: 70 70 65 6e 64 20 6e 65 77 63 73 65 74 73 20 24 ppend newcsets $
33f0: 66 72 61 67 6d 65 6e 74 0a 09 20 20 20 20 24 66 fragment.. $f
3400: 72 61 67 6d 65 6e 74 20 70 65 72 73 69 73 74 0a ragment persist.
3410: 0a 09 20 20 20 20 69 66 20 7b 5b 24 66 72 61 67 .. if {[$frag
3420: 6d 65 6e 74 20 73 65 6c 66 72 65 66 65 72 65 6e ment selfreferen
3430: 74 69 61 6c 5d 7d 20 7b 0a 09 09 74 72 6f 75 62 tial]} {...troub
3440: 6c 65 20 66 61 74 61 6c 20 22 5b 24 66 72 61 67 le fatal "[$frag
3450: 6d 65 6e 74 20 73 74 72 5d 20 64 65 70 65 6e 64 ment str] depend
3460: 73 20 6f 6e 20 69 74 73 65 6c 66 22 0a 09 20 20 s on itself"..
3470: 20 20 7d 0a 09 7d 0a 0a 09 74 72 6f 75 62 6c 65 }..}...trouble
3480: 20 61 62 6f 72 74 3f 0a 09 72 65 74 75 72 6e 20 abort?..return
3490: 24 6e 65 77 63 73 65 74 73 0a 20 20 20 20 7d 0a $newcsets. }.
34a0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 . typemethod
34b0: 73 74 72 6c 69 73 74 20 7b 63 68 61 6e 67 65 73 strlist {changes
34c0: 65 74 73 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b ets} {..return [
34d0: 6a 6f 69 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69 join [struct::li
34e0: 73 74 20 6d 61 70 20 24 63 68 61 6e 67 65 73 65 st map $changese
34f0: 74 73 20 5b 6d 79 70 72 6f 63 20 49 44 5d 5d 5d ts [myproc ID]]]
3500: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 . }.. proc
3510: 20 49 44 20 7b 63 73 65 74 7d 20 7b 20 24 63 73 ID {cset} { $cs
3520: 65 74 20 73 74 72 20 7d 0a 0a 20 20 20 20 70 72 et str }.. pr
3530: 6f 63 20 55 6e 74 61 67 20 7b 74 61 67 67 65 64 oc Untag {tagged
3540: 69 74 65 6d 73 20 63 73 74 79 70 65 7d 20 7b 0a items cstype} {.
3550: 09 72 65 74 75 72 6e 20 5b 73 74 72 75 63 74 3a .return [struct:
3560: 3a 6c 69 73 74 20 6d 61 70 20 24 74 61 67 67 65 :list map $tagge
3570: 64 69 74 65 6d 73 20 5b 6d 79 70 72 6f 63 20 55 ditems [myproc U
3580: 6e 74 61 67 31 20 24 63 73 74 79 70 65 5d 5d 0a ntag1 $cstype]].
3590: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 }.. proc
35a0: 55 6e 74 61 67 31 20 7b 63 73 74 79 70 65 20 74 Untag1 {cstype t
35b0: 68 65 69 74 65 6d 7d 20 7b 0a 09 73 74 72 75 63 heitem} {..struc
35c0: 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 24 t::list assign $
35d0: 74 68 65 69 74 65 6d 20 74 20 69 0a 09 69 6e 74 theitem t i..int
35e0: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24 egrity assert {$
35f0: 63 73 74 79 70 65 20 65 71 20 24 74 7d 20 7b 49 cstype eq $t} {I
3600: 74 65 6d 20 24 69 27 73 20 74 79 70 65 20 69 73 tem $i's type is
3610: 20 27 24 74 27 2c 20 65 78 70 65 63 74 65 64 20 '$t', expected
3620: 27 24 63 73 74 79 70 65 27 7d 0a 09 72 65 74 75 '$cstype'}..retu
3630: 72 6e 20 24 69 0a 20 20 20 20 7d 0a 0a 20 20 20 rn $i. }..
3640: 20 74 79 70 65 6d 65 74 68 6f 64 20 69 74 65 6d typemethod item
3650: 73 74 72 20 7b 69 74 65 6d 7d 20 7b 0a 09 73 74 str {item} {..st
3660: 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 ruct::list assig
3670: 6e 20 24 69 74 65 6d 20 69 74 79 70 65 20 69 69 n $item itype ii
3680: 64 0a 09 72 65 74 75 72 6e 20 5b 24 69 74 79 70 d..return [$ityp
3690: 65 20 73 74 72 20 24 69 69 64 5d 0a 20 20 20 20 e str $iid].
36a0: 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 }.. # # ## ##
36b0: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 # ##### ########
36c0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 #############.
36d0: 20 20 20 23 23 20 53 74 61 74 65 0a 0a 20 20 20 ## State..
36e0: 20 76 61 72 69 61 62 6c 65 20 6d 79 69 64 20 20 variable myid
36f0: 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 49 64 20 {} ; # Id
3700: 6f 66 20 74 68 65 20 63 73 65 74 20 66 6f 72 20 of the cset for
3710: 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 0a 09 the persistent..
3720: 09 09 20 20 20 20 20 20 23 20 73 74 61 74 65 2e .. # state.
3730: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 . variable my
3740: 70 72 6f 6a 65 63 74 20 20 20 7b 7d 20 3b 20 23 project {} ; #
3750: 20 52 65 66 65 72 65 6e 63 65 20 6f 66 20 74 68 Reference of th
3760: 65 20 70 72 6f 6a 65 63 74 20 6f 62 6a 65 63 74 e project object
3770: 20 74 68 65 0a 09 09 09 20 20 20 20 20 20 23 20 the.... #
3780: 63 68 61 6e 67 65 73 65 74 20 62 65 6c 6f 6e 67 changeset belong
3790: 73 20 74 6f 2e 0a 20 20 20 20 76 61 72 69 61 62 s to.. variab
37a0: 6c 65 20 6d 79 74 79 70 65 20 20 20 20 20 20 7b le mytype {
37b0: 7d 20 3b 20 23 20 57 68 61 74 20 74 68 65 20 63 } ; # What the c
37c0: 68 61 6e 67 65 73 65 74 20 69 73 20 62 61 73 65 hangeset is base
37d0: 64 20 6f 6e 0a 09 09 09 20 20 20 20 20 20 23 20 d on.... #
37e0: 28 72 65 76 69 73 69 6f 6e 73 2c 20 74 61 67 73 (revisions, tags
37f0: 2c 20 6f 72 20 62 72 61 6e 63 68 65 73 29 2e 0a , or branches)..
3800: 09 09 09 20 20 20 20 20 20 23 20 56 61 6c 75 65 ... # Value
3810: 73 3a 20 53 65 65 20 6d 79 63 73 74 79 70 65 2e s: See mycstype.
3820: 20 4e 6f 74 65 20 74 68 61 74 20 77 65 0a 09 09 Note that we...
3830: 09 20 20 20 20 20 20 23 20 68 61 76 65 20 74 6f . # have to
3840: 20 6b 65 65 70 20 74 68 65 20 6e 61 6d 65 73 20 keep the names
3850: 6f 66 20 74 68 65 20 68 65 6c 70 65 72 0a 09 09 of the helper...
3860: 09 20 20 20 20 20 20 23 20 73 69 6e 67 6c 65 74 . # singlet
3870: 6f 6e 73 20 69 6e 20 73 79 6e 63 20 77 69 74 68 ons in sync with
3880: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 09 09 the contents...
3890: 09 20 20 20 20 20 20 23 20 6f 66 20 73 74 61 74 . # of stat
38a0: 65 20 74 61 62 6c 65 20 27 63 73 74 79 70 65 27 e table 'cstype'
38b0: 2c 20 61 6e 64 20 76 61 72 69 6f 75 73 0a 09 09 , and various...
38c0: 09 20 20 20 20 20 20 23 20 6f 74 68 65 72 20 70 . # other p
38d0: 6c 61 63 65 73 20 75 73 69 6e 67 20 74 68 65 6d laces using them
38e0: 20 68 61 72 64 77 69 72 65 64 2e 0a 20 20 20 20 hardwired..
38f0: 76 61 72 69 61 62 6c 65 20 6d 79 74 79 70 65 6f variable mytypeo
3900: 62 6a 20 20 20 7b 7d 20 3b 20 23 20 52 65 66 65 bj {} ; # Refe
3910: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 6f 6e rence to the con
3920: 74 61 69 6e 65 72 20 66 6f 72 20 74 68 65 0a 09 tainer for the..
3930: 09 09 20 20 20 20 20 20 23 20 74 79 70 65 20 64 .. # type d
3940: 65 70 65 6e 64 65 6e 74 20 63 6f 64 65 2e 20 44 ependent code. D
3950: 65 72 69 76 65 64 20 66 72 6f 6d 0a 09 09 09 20 erived from....
3960: 20 20 20 20 20 23 20 6d 79 74 79 70 65 2e 0a 20 # mytype..
3970: 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 73 72 variable mysr
3980: 63 69 64 20 20 20 20 20 7b 7d 20 3b 20 23 20 49 cid {} ; # I
3990: 64 20 6f 66 20 74 68 65 20 6d 65 74 61 64 61 74 d of the metadat
39a0: 61 20 6f 72 20 73 79 6d 62 6f 6c 20 74 68 65 20 a or symbol the
39b0: 63 73 65 74 0a 09 09 09 20 20 20 20 20 20 23 20 cset.... #
39c0: 69 73 20 62 61 73 65 64 20 6f 6e 2e 0a 20 20 20 is based on..
39d0: 20 76 61 72 69 61 62 6c 65 20 6d 79 69 74 65 6d variable myitem
39e0: 73 20 20 20 20 20 7b 7d 20 3b 20 23 20 4c 69 73 s {} ; # Lis
39f0: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 65 t of the file le
3a00: 76 65 6c 20 72 65 76 69 73 69 6f 6e 73 2c 0a 09 vel revisions,..
3a10: 09 09 20 20 20 20 20 20 23 20 74 61 67 73 2c 20 .. # tags,
3a20: 6f 72 20 62 72 61 6e 63 68 65 73 20 69 6e 20 74 or branches in t
3a30: 68 65 20 63 73 65 74 2c 20 61 73 0a 09 09 09 20 he cset, as....
3a40: 20 20 20 20 20 23 20 69 64 73 2e 20 4e 6f 74 20 # ids. Not
3a50: 74 61 67 67 65 64 2e 0a 20 20 20 20 76 61 72 69 tagged.. vari
3a60: 61 62 6c 65 20 6d 79 74 69 74 65 6d 73 20 20 20 able mytitems
3a70: 20 7b 7d 20 3b 20 23 20 41 73 20 6d 79 69 74 65 {} ; # As myite
3a80: 6d 73 2c 20 74 68 65 20 74 61 67 67 65 64 20 66 ms, the tagged f
3a90: 6f 72 6d 2e 0a 20 20 20 20 76 61 72 69 61 62 6c orm.. variabl
3aa0: 65 20 6d 79 70 72 65 6d 61 70 20 20 20 20 7b 7d e mypremap {}
3ab0: 20 3b 20 23 20 44 69 63 74 69 6f 6e 61 72 79 20 ; # Dictionary
3ac0: 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 mapping from the
3ad0: 20 69 74 65 6d 73 20 28 74 61 67 67 65 64 20 6e items (tagged n
3ae0: 6f 77 29 0a 09 09 09 20 20 20 20 20 20 23 20 74 ow).... # t
3af0: 6f 20 74 68 65 69 72 20 70 72 65 64 65 63 65 73 o their predeces
3b00: 73 6f 72 73 2c 20 61 6c 73 6f 20 74 61 67 67 65 sors, also tagge
3b10: 64 2e 20 41 0a 09 09 09 20 20 20 20 20 20 23 20 d. A.... #
3b20: 63 61 63 68 65 20 74 6f 20 61 76 6f 69 64 20 6c cache to avoid l
3b30: 6f 61 64 69 6e 67 20 74 68 69 73 20 66 72 6f 6d oading this from
3b40: 20 74 68 65 0a 09 09 09 20 20 20 20 20 20 23 20 the.... #
3b50: 73 74 61 74 65 20 6d 6f 72 65 20 74 68 61 6e 20 state more than
3b60: 6f 6e 63 65 2e 0a 20 20 20 20 76 61 72 69 61 62 once.. variab
3b70: 6c 65 20 6d 79 6e 65 78 74 6d 61 70 20 20 20 7b le mynextmap {
3b80: 7d 20 3b 20 23 20 44 69 63 74 69 6f 6e 61 72 79 } ; # Dictionary
3b90: 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 mapping from th
3ba0: 65 20 69 74 65 6d 73 20 28 74 61 67 67 65 64 29 e items (tagged)
3bb0: 0a 09 09 09 20 20 20 20 20 20 23 20 74 6f 20 74 .... # to t
3bc0: 68 65 69 72 20 73 75 63 63 65 73 73 6f 72 73 20 heir successors
3bd0: 28 61 6c 73 6f 20 74 61 67 67 65 64 29 2e 20 41 (also tagged). A
3be0: 0a 09 09 09 20 20 20 20 20 20 23 20 63 61 63 68 .... # cach
3bf0: 65 20 74 6f 20 61 76 6f 69 64 20 6c 6f 61 64 69 e to avoid loadi
3c00: 6e 67 20 74 68 69 73 20 66 72 6f 6d 20 74 68 65 ng this from the
3c10: 0a 09 09 09 20 20 20 20 20 20 23 20 73 74 61 74 .... # stat
3c20: 65 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 e more than once
3c30: 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d .. variable m
3c40: 79 70 6f 73 20 20 20 20 20 20 20 7b 7d 20 3b 20 ypos {} ;
3c50: 23 20 43 6f 6d 6d 69 74 20 70 6f 73 69 74 69 6f # Commit positio
3c60: 6e 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73 n of the changes
3c70: 65 74 2c 20 69 66 0a 09 09 09 20 20 20 20 20 20 et, if....
3c80: 23 20 6b 6e 6f 77 6e 2e 0a 0a 20 20 20 20 23 20 # known... #
3c90: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 # ## ### ##### #
3ca0: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 ####### ########
3cb0: 23 23 23 23 23 0a 20 20 20 20 23 23 20 49 6e 74 #####. ## Int
3cc0: 65 72 6e 61 6c 20 6d 65 74 68 6f 64 73 0a 0a 20 ernal methods..
3cd0: 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 typevariable
3ce0: 6d 79 63 6f 75 6e 74 65 72 20 20 20 20 20 20 20 mycounter
3cf0: 20 30 20 3b 20 23 20 49 64 20 63 6f 75 6e 74 65 0 ; # Id counte
3d00: 72 20 66 6f 72 20 63 73 65 74 73 2e 20 4c 61 73 r for csets. Las
3d10: 74 20 69 64 0a 09 09 09 09 20 20 20 20 20 20 23 t id..... #
3d20: 20 75 73 65 64 2e 0a 20 20 20 20 74 79 70 65 76 used.. typev
3d30: 61 72 69 61 62 6c 65 20 6d 79 63 73 74 79 70 65 ariable mycstype
3d40: 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d -array {} ; # M
3d50: 61 70 20 63 73 74 79 70 65 73 20 28 6e 61 6d 65 ap cstypes (name
3d60: 73 29 20 74 6f 20 70 65 72 73 69 73 74 65 6e 74 s) to persistent
3d70: 0a 09 09 09 09 20 20 20 20 20 20 23 20 69 64 73 ..... # ids
3d80: 2e 20 4e 6f 74 65 20 74 68 61 74 20 77 65 20 68 . Note that we h
3d90: 61 76 65 20 74 6f 20 6b 65 65 70 0a 09 09 09 09 ave to keep.....
3da0: 20 20 20 20 20 20 23 20 74 68 65 20 6e 61 6d 65 # the name
3db0: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 27 s in the table '
3dc0: 63 73 74 79 70 65 27 0a 09 09 09 09 20 20 20 20 cstype'.....
3dd0: 20 20 23 20 69 6e 20 73 79 6e 63 20 77 69 74 68 # in sync with
3de0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 the names of th
3df0: 65 0a 09 09 09 09 20 20 20 20 20 20 23 20 68 65 e..... # he
3e00: 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 73 2e lper singletons.
3e10: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 .. typemethod
3e20: 20 67 65 74 63 73 74 79 70 65 73 20 7b 7d 20 7b getcstypes {} {
3e30: 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 6e ..foreach {tid n
3e40: 61 6d 65 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 ame} [state run
3e50: 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 74 69 {.. SELECT ti
3e60: 64 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 63 73 74 d, name FROM cst
3e70: 79 70 65 3b 0a 09 7d 5d 20 7b 20 73 65 74 20 6d ype;..}] { set m
3e80: 79 63 73 74 79 70 65 28 24 6e 61 6d 65 29 20 24 ycstype($name) $
3e90: 74 69 64 20 7d 0a 09 72 65 74 75 72 6e 0a 20 20 tid }..return.
3ea0: 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 }.. typemet
3eb0: 68 6f 64 20 6c 6f 61 64 63 6f 75 6e 74 65 72 20 hod loadcounter
3ec0: 7b 7d 20 7b 0a 09 23 20 49 6e 69 74 69 61 6c 69 {} {..# Initiali
3ed0: 7a 65 20 74 68 65 20 63 6f 75 6e 74 65 72 20 66 ze the counter f
3ee0: 72 6f 6d 20 74 68 65 20 73 74 61 74 65 0a 09 73 rom the state..s
3ef0: 65 74 20 6d 79 63 6f 75 6e 74 65 72 20 5b 73 74 et mycounter [st
3f00: 61 74 65 20 6f 6e 65 20 7b 20 53 45 4c 45 43 54 ate one { SELECT
3f10: 20 4d 41 58 28 63 69 64 29 20 46 52 4f 4d 20 63 MAX(cid) FROM c
3f20: 68 61 6e 67 65 73 65 74 20 7d 5d 0a 09 72 65 74 hangeset }]..ret
3f30: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 urn. }.. t
3f40: 79 70 65 6d 65 74 68 6f 64 20 6e 75 6d 20 7b 7d ypemethod num {}
3f50: 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 63 6f 75 { return $mycou
3f60: 6e 74 65 72 20 7d 0a 0a 20 20 20 20 70 72 6f 63 nter }.. proc
3f70: 20 49 6e 69 74 69 61 6c 69 7a 65 42 72 65 61 6b InitializeBreak
3f80: 53 74 61 74 65 20 7b 72 65 76 69 73 69 6f 6e 73 State {revisions
3f90: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 70 6f 73 } {..upvar 1 pos
3fa0: 20 70 6f 73 20 63 72 6f 73 73 20 63 72 6f 73 73 pos cross cross
3fb0: 20 72 61 6e 67 65 20 72 61 6e 67 65 20 64 65 70 range range dep
3fc0: 63 20 64 65 70 63 20 64 65 6c 74 61 20 64 65 6c c depc delta del
3fd0: 74 61 20 5c 0a 09 20 20 20 20 64 65 70 65 6e 64 ta \.. depend
3fe0: 65 6e 63 69 65 73 20 64 65 70 65 6e 64 65 6e 63 encies dependenc
3ff0: 69 65 73 0a 0a 09 23 20 46 69 72 73 74 20 77 65 ies...# First we
4000: 20 63 72 65 61 74 65 20 61 20 6d 61 70 20 6f 66 create a map of
4010: 20 70 6f 73 69 74 69 6f 6e 73 20 74 6f 20 6d 61 positions to ma
4020: 6b 65 20 69 74 20 65 61 73 69 65 72 20 74 6f 0a ke it easier to.
4030: 09 23 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 .# determine whe
4040: 74 68 65 72 20 61 20 64 65 70 65 6e 64 65 6e 63 ther a dependenc
4050: 79 20 63 72 6f 73 73 65 73 20 61 20 70 61 72 74 y crosses a part
4060: 69 63 75 6c 61 72 20 69 6e 64 65 78 2e 0a 0a 09 icular index....
4070: 61 72 72 61 79 20 73 65 74 20 70 6f 73 20 20 20 array set pos
4080: 7b 7d 0a 09 61 72 72 61 79 20 73 65 74 20 63 72 {}..array set cr
4090: 6f 73 73 20 7b 7d 0a 09 61 72 72 61 79 20 73 65 oss {}..array se
40a0: 74 20 64 65 70 63 20 20 7b 7d 0a 09 73 65 74 20 t depc {}..set
40b0: 72 61 6e 67 65 20 20 20 20 20 20 20 7b 7d 0a 09 range {}..
40c0: 73 65 74 20 6e 20 30 0a 09 66 6f 72 65 61 63 68 set n 0..foreach
40d0: 20 72 65 76 20 24 72 65 76 69 73 69 6f 6e 73 20 rev $revisions
40e0: 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 72 {.. lappend r
40f0: 61 6e 67 65 20 24 6e 0a 09 20 20 20 20 73 65 74 ange $n.. set
4100: 20 70 6f 73 28 24 72 65 76 29 20 24 6e 0a 09 20 pos($rev) $n..
4110: 20 20 20 73 65 74 20 63 72 6f 73 73 28 24 6e 29 set cross($n)
4120: 20 30 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09 0.. incr n..
4130: 7d 0a 0a 09 23 20 53 65 63 6f 6e 64 6c 79 20 77 }...# Secondly w
4140: 65 20 63 6f 75 6e 74 20 74 68 65 20 63 72 6f 73 e count the cros
4150: 73 69 6e 67 73 20 70 65 72 20 70 6f 73 69 74 69 sings per positi
4160: 6f 6e 2c 20 62 79 20 69 74 65 72 61 74 69 6e 67 on, by iterating
4170: 0a 09 23 20 6f 76 65 72 20 74 68 65 20 72 65 63 ..# over the rec
4180: 6f 72 64 65 64 20 69 6e 74 65 72 6e 61 6c 20 64 orded internal d
4190: 65 70 65 6e 64 65 6e 63 69 65 73 2e 0a 0a 09 23 ependencies....#
41a0: 20 4e 6f 74 65 3a 20 49 66 20 74 68 65 20 74 69 Note: If the ti
41b0: 6d 65 73 74 61 6d 70 73 20 61 72 65 20 62 61 64 mestamps are bad
41c0: 6c 79 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 20 ly out of order
41d0: 69 74 20 69 73 0a 09 23 20 20 20 20 20 20 20 70 it is..# p
41e0: 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20 ossible to have
41f0: 61 20 62 61 63 6b 77 61 72 64 20 73 75 63 63 65 a backward succe
4200: 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 79 2c ssor dependency,
4210: 0a 09 23 20 20 20 20 20 20 20 69 2e 65 2e 20 77 ..# i.e. w
4220: 69 74 68 20 73 74 61 72 74 20 3e 20 65 6e 64 2e ith start > end.
4230: 20 57 65 20 6d 61 79 20 68 61 76 65 20 74 6f 20 We may have to
4240: 73 77 61 70 20 74 68 65 20 69 6e 64 69 63 65 73 swap the indices
4250: 0a 09 23 20 20 20 20 20 20 20 74 6f 20 65 6e 73 ..# to ens
4260: 75 72 65 20 74 68 61 74 20 74 68 65 20 66 6f 6c ure that the fol
4270: 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 lowing loop runs
4280: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 09 23 0a 09 correctly...#..
4290: 23 20 4e 6f 74 65 20 32 3a 20 73 74 61 72 74 20 # Note 2: start
42a0: 3d 3d 20 65 6e 64 20 69 73 20 6e 6f 74 20 70 6f == end is not po
42b0: 73 73 69 62 6c 65 2e 20 49 74 20 69 6e 64 69 63 ssible. It indic
42c0: 61 74 65 73 20 61 0a 09 23 20 20 20 20 20 20 20 ates a..#
42d0: 20 20 73 65 6c 66 2d 64 65 70 65 6e 64 65 6e 63 self-dependenc
42e0: 79 20 64 75 65 20 74 6f 20 74 68 65 20 75 6e 69 y due to the uni
42f0: 71 75 65 6e 65 73 73 20 6f 66 20 70 6f 73 69 74 queness of posit
4300: 69 6f 6e 73 2c 0a 09 23 20 20 20 20 20 20 20 20 ions,..#
4310: 20 61 6e 64 20 74 68 61 74 20 69 73 20 73 6f 6d and that is som
4320: 65 74 68 69 6e 67 20 77 65 20 68 61 76 65 20 72 ething we have r
4330: 75 6c 65 64 20 6f 75 74 20 61 6c 72 65 61 64 79 uled out already
4340: 2c 20 73 65 65 0a 09 23 20 20 20 20 20 20 20 20 , see..#
4350: 20 27 72 65 76 20 69 6e 74 65 72 6e 61 6c 73 75 'rev internalsu
4360: 63 63 65 73 73 6f 72 73 27 2e 0a 0a 09 66 6f 72 ccessors'....for
4370: 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 72 each {rid childr
4380: 65 6e 7d 20 5b 61 72 72 61 79 20 67 65 74 20 64 en} [array get d
4390: 65 70 65 6e 64 65 6e 63 69 65 73 5d 20 7b 0a 09 ependencies] {..
43a0: 20 20 20 20 66 6f 72 65 61 63 68 20 63 68 69 6c foreach chil
43b0: 64 20 24 63 68 69 6c 64 72 65 6e 20 7b 0a 09 09 d $children {...
43c0: 73 65 74 20 64 6b 65 79 20 20 20 20 5b 6c 69 73 set dkey [lis
43d0: 74 20 24 72 69 64 20 24 63 68 69 6c 64 5d 0a 09 t $rid $child]..
43e0: 09 73 65 74 20 73 74 61 72 74 20 20 20 24 70 6f .set start $po
43f0: 73 28 24 72 69 64 29 0a 09 09 73 65 74 20 65 6e s($rid)...set en
4400: 64 20 20 20 20 20 24 70 6f 73 28 24 63 68 69 6c d $pos($chil
4410: 64 29 0a 09 09 73 65 74 20 63 72 6f 73 73 65 73 d)...set crosses
4420: 20 7b 7d 0a 0a 09 09 69 66 20 7b 24 73 74 61 72 {}....if {$star
4430: 74 20 3e 20 24 65 6e 64 7d 20 7b 0a 09 09 20 20 t > $end} {...
4440: 20 20 77 68 69 6c 65 20 7b 24 65 6e 64 20 3c 20 while {$end <
4450: 24 73 74 61 72 74 7d 20 7b 0a 09 09 09 6c 61 70 $start} {....lap
4460: 70 65 6e 64 20 63 72 6f 73 73 65 73 20 24 65 6e pend crosses $en
4470: 64 0a 09 09 09 69 6e 63 72 20 63 72 6f 73 73 28 d....incr cross(
4480: 24 65 6e 64 29 0a 09 09 09 69 6e 63 72 20 65 6e $end)....incr en
4490: 64 0a 09 09 20 20 20 20 7d 0a 09 09 7d 20 65 6c d... }...} el
44a0: 73 65 20 7b 0a 09 09 20 20 20 20 77 68 69 6c 65 se {... while
44b0: 20 7b 24 73 74 61 72 74 20 3c 20 24 65 6e 64 7d {$start < $end}
44c0: 20 7b 0a 09 09 09 6c 61 70 70 65 6e 64 20 63 72 {....lappend cr
44d0: 6f 73 73 65 73 20 24 73 74 61 72 74 0a 09 09 09 osses $start....
44e0: 69 6e 63 72 20 63 72 6f 73 73 28 24 73 74 61 72 incr cross($star
44f0: 74 29 0a 09 09 09 69 6e 63 72 20 73 74 61 72 74 t)....incr start
4500: 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 09 73 ... }...}...s
4510: 65 74 20 64 65 70 63 28 24 64 6b 65 79 29 20 24 et depc($dkey) $
4520: 63 72 6f 73 73 65 73 0a 09 20 20 20 20 7d 0a 09 crosses.. }..
4530: 7d 0a 0a 09 49 6e 69 74 69 61 6c 69 7a 65 44 65 }...InitializeDe
4540: 6c 74 61 73 20 24 72 65 76 69 73 69 6f 6e 73 0a ltas $revisions.
4550: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 .return. }..
4560: 20 20 20 70 72 6f 63 20 49 6e 69 74 69 61 6c 69 proc Initiali
4570: 7a 65 44 65 6c 74 61 73 20 7b 72 65 76 69 73 69 zeDeltas {revisi
4580: 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 ons} {..upvar 1
4590: 64 65 6c 74 61 20 64 65 6c 74 61 0a 0a 09 23 20 delta delta...#
45a0: 50 75 6c 6c 20 74 68 65 20 74 69 6d 65 73 74 61 Pull the timesta
45b0: 6d 70 73 20 66 6f 72 20 61 6c 6c 20 72 65 76 69 mps for all revi
45c0: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 63 68 61 sions in the cha
45d0: 6e 67 65 73 65 74 73 20 61 6e 64 0a 09 23 20 63 ngesets and..# c
45e0: 6f 6d 70 75 74 65 20 74 68 65 69 72 20 64 65 6c ompute their del
45f0: 74 61 73 20 66 6f 72 20 75 73 65 20 62 79 20 74 tas for use by t
4600: 68 65 20 62 72 65 61 6b 20 66 69 6e 64 65 72 2e he break finder.
4610: 0a 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 6c ...array set del
4620: 74 61 20 7b 7d 0a 09 61 72 72 61 79 20 73 65 74 ta {}..array set
4630: 20 73 74 61 6d 70 20 7b 7d 0a 0a 09 73 65 74 20 stamp {}...set
4640: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 theset ('[join $
4650: 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d revisions {','}]
4660: 27 29 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 ')..foreach {rid
4670: 20 74 69 6d 65 7d 20 5b 73 74 61 74 65 20 72 75 time} [state ru
4680: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 n ".. SELECT
4690: 52 2e 72 69 64 2c 20 52 2e 64 61 74 65 0a 09 20 R.rid, R.date..
46a0: 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e FROM revision
46b0: 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e R.. WHERE R.
46c0: 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 rid IN $theset..
46d0: 22 5d 20 7b 0a 09 20 20 20 20 73 65 74 20 73 74 "] {.. set st
46e0: 61 6d 70 28 24 72 69 64 29 20 24 74 69 6d 65 0a amp($rid) $time.
46f0: 09 7d 0a 0a 09 73 65 74 20 6e 20 30 0a 09 66 6f .}...set n 0..fo
4700: 72 65 61 63 68 20 72 69 64 20 5b 6c 72 61 6e 67 reach rid [lrang
4710: 65 20 24 72 65 76 69 73 69 6f 6e 73 20 30 20 65 e $revisions 0 e
4720: 6e 64 2d 31 5d 20 72 6e 65 78 74 20 5b 6c 72 61 nd-1] rnext [lra
4730: 6e 67 65 20 24 72 65 76 69 73 69 6f 6e 73 20 31 nge $revisions 1
4740: 20 65 6e 64 5d 20 7b 0a 09 20 20 20 20 73 65 74 end] {.. set
4750: 20 64 65 6c 74 61 28 24 6e 29 20 5b 65 78 70 72 delta($n) [expr
4760: 20 7b 24 73 74 61 6d 70 28 24 72 6e 65 78 74 29 {$stamp($rnext)
4770: 20 2d 20 24 73 74 61 6d 70 28 24 72 69 64 29 7d - $stamp($rid)}
4780: 5d 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d ].. incr n..}
4790: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a ..return. }..
47a0: 20 20 20 20 70 72 6f 63 20 46 69 6e 64 42 65 73 proc FindBes
47b0: 74 42 72 65 61 6b 20 7b 72 61 6e 67 65 7d 20 7b tBreak {range} {
47c0: 0a 09 75 70 76 61 72 20 31 20 63 72 6f 73 73 20 ..upvar 1 cross
47d0: 63 72 6f 73 73 20 64 65 6c 74 61 20 64 65 6c 74 cross delta delt
47e0: 61 0a 0a 09 23 20 44 65 74 65 72 6d 69 6e 65 20 a...# Determine
47f0: 74 68 65 20 62 65 73 74 20 62 72 65 61 6b 20 6c the best break l
4800: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 67 ocation in the g
4810: 69 76 65 6e 20 72 61 6e 67 65 20 6f 66 0a 09 23 iven range of..#
4820: 20 70 6f 73 69 74 69 6f 6e 73 2e 20 46 69 72 73 positions. Firs
4830: 74 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 68 t we look for th
4840: 65 20 6c 6f 63 61 74 69 6f 6e 73 20 77 69 74 68 e locations with
4850: 20 74 68 65 20 6d 61 78 69 6d 61 6c 0a 09 23 20 the maximal..#
4860: 6e 75 6d 62 65 72 20 6f 66 20 63 72 6f 73 73 69 number of crossi
4870: 6e 67 73 2e 20 49 66 20 74 68 65 72 65 20 61 72 ngs. If there ar
4880: 65 20 73 65 76 65 72 61 6c 20 77 65 20 6c 6f 6f e several we loo
4890: 6b 20 66 6f 72 20 74 68 65 0a 09 23 20 73 68 6f k for the..# sho
48a0: 72 74 65 73 74 20 74 69 6d 65 20 69 6e 74 65 72 rtest time inter
48b0: 76 61 6c 20 61 6d 6f 6e 67 20 74 68 65 6d 2e 20 val among them.
48c0: 49 66 20 77 65 20 73 74 69 6c 6c 20 68 61 76 65 If we still have
48d0: 20 6d 75 6c 74 69 70 6c 65 0a 09 23 20 70 6f 73 multiple..# pos
48e0: 73 69 62 69 6c 69 74 69 65 73 20 61 66 74 65 72 sibilities after
48f0: 20 74 68 61 74 20 77 65 20 73 65 6c 65 63 74 20 that we select
4900: 74 68 65 20 65 61 72 6c 69 65 73 74 20 6c 6f 63 the earliest loc
4910: 61 74 69 6f 6e 0a 09 23 20 61 6d 6f 6e 67 20 74 ation..# among t
4920: 68 65 73 65 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 hese....# Note:
4930: 49 66 20 74 68 65 20 6d 61 78 69 6d 61 6c 20 6e If the maximal n
4940: 75 6d 62 65 72 20 6f 66 20 63 72 6f 73 73 69 6e umber of crossin
4950: 67 73 20 69 73 20 30 20 74 68 65 6e 20 74 68 65 gs is 0 then the
4960: 20 72 61 6e 67 65 0a 09 23 20 20 20 20 20 20 20 range..#
4970: 68 61 73 20 6e 6f 20 69 6e 74 65 72 6e 61 6c 20 has no internal
4980: 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 6e dependencies, an
4990: 64 20 6e 6f 20 62 72 65 61 6b 20 6c 6f 63 61 74 d no break locat
49a0: 69 6f 6e 20 61 74 0a 09 23 20 20 20 20 20 20 20 ion at..#
49b0: 61 6c 6c 2e 20 54 68 69 73 20 70 6f 73 73 69 62 all. This possib
49c0: 69 6c 69 74 79 20 69 73 20 73 69 67 6e 61 6c 65 ility is signale
49d0: 64 20 76 69 61 20 72 65 73 75 6c 74 20 2d 31 2e d via result -1.
49e0: 0a 0a 09 23 20 4e 6f 74 65 3a 20 41 20 72 61 6e ...# Note: A ran
49f0: 67 65 20 6f 66 20 6c 65 6e 67 74 68 20 31 20 6f ge of length 1 o
4a00: 72 20 6c 65 73 73 20 63 61 6e 6e 6f 74 20 68 61 r less cannot ha
4a10: 76 65 20 69 6e 74 65 72 6e 61 6c 0a 09 23 20 20 ve internal..#
4a20: 20 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65 dependencie
4a30: 73 2c 20 61 73 20 74 68 61 74 20 6e 65 65 64 73 s, as that needs
4a40: 20 61 74 20 6c 65 61 73 74 20 74 77 6f 20 72 65 at least two re
4a50: 76 69 73 69 6f 6e 73 20 69 6e 0a 09 23 20 20 20 visions in..#
4a60: 20 20 20 20 74 68 65 20 72 61 6e 67 65 2e 0a 0a the range...
4a70: 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 72 .if {[llength $r
4a80: 61 6e 67 65 5d 20 3c 20 32 7d 20 7b 20 72 65 74 ange] < 2} { ret
4a90: 75 72 6e 20 2d 31 20 7d 0a 0a 09 73 65 74 20 6d urn -1 }...set m
4aa0: 61 78 20 2d 31 0a 09 73 65 74 20 62 65 73 74 20 ax -1..set best
4ab0: 7b 7d 0a 0a 09 66 6f 72 65 61 63 68 20 6c 6f 63 {}...foreach loc
4ac0: 61 74 69 6f 6e 20 24 72 61 6e 67 65 20 7b 0a 09 ation $range {..
4ad0: 20 20 20 20 73 65 74 20 63 72 6f 73 73 69 6e 67 set crossing
4ae0: 73 20 24 63 72 6f 73 73 28 24 6c 6f 63 61 74 69 s $cross($locati
4af0: 6f 6e 29 0a 09 20 20 20 20 69 66 20 7b 24 63 72 on).. if {$cr
4b00: 6f 73 73 69 6e 67 73 20 3e 20 24 6d 61 78 7d 20 ossings > $max}
4b10: 7b 0a 09 09 73 65 74 20 6d 61 78 20 20 24 63 72 {...set max $cr
4b20: 6f 73 73 69 6e 67 73 0a 09 09 73 65 74 20 62 65 ossings...set be
4b30: 73 74 20 5b 6c 69 73 74 20 24 6c 6f 63 61 74 69 st [list $locati
4b40: 6f 6e 5d 0a 09 09 63 6f 6e 74 69 6e 75 65 0a 09 on]...continue..
4b50: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 } elseif {$c
4b60: 72 6f 73 73 69 6e 67 73 20 3d 3d 20 24 6d 61 78 rossings == $max
4b70: 7d 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 62 65 } {...lappend be
4b80: 73 74 20 24 6c 6f 63 61 74 69 6f 6e 0a 09 20 20 st $location..
4b90: 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b 24 6d 61 }..}...if {$ma
4ba0: 78 20 3d 3d 20 30 7d 20 20 20 20 20 20 20 20 20 x == 0}
4bb0: 20 20 20 7b 20 72 65 74 75 72 6e 20 2d 31 20 7d { return -1 }
4bc0: 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 ..if {[llength $
4bd0: 62 65 73 74 5d 20 3d 3d 20 31 7d 20 7b 20 72 65 best] == 1} { re
4be0: 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 62 65 turn [lindex $be
4bf0: 73 74 20 30 5d 20 7d 0a 0a 09 73 65 74 20 6c 6f st 0] }...set lo
4c00: 63 61 74 69 6f 6e 73 20 24 62 65 73 74 0a 09 73 cations $best..s
4c10: 65 74 20 62 65 73 74 20 7b 7d 0a 09 73 65 74 20 et best {}..set
4c20: 6d 69 6e 20 2d 31 0a 0a 09 66 6f 72 65 61 63 68 min -1...foreach
4c30: 20 6c 6f 63 61 74 69 6f 6e 20 24 6c 6f 63 61 74 location $locat
4c40: 69 6f 6e 73 20 7b 0a 09 20 20 20 20 73 65 74 20 ions {.. set
4c50: 69 6e 74 65 72 76 61 6c 20 24 64 65 6c 74 61 28 interval $delta(
4c60: 24 6c 6f 63 61 74 69 6f 6e 29 0a 09 20 20 20 20 $location)..
4c70: 69 66 20 7b 28 24 6d 69 6e 20 3c 20 30 29 20 7c if {($min < 0) |
4c80: 7c 20 28 24 69 6e 74 65 72 76 61 6c 20 3c 20 24 | ($interval < $
4c90: 6d 69 6e 29 7d 20 7b 0a 09 09 73 65 74 20 6d 69 min)} {...set mi
4ca0: 6e 20 20 24 69 6e 74 65 72 76 61 6c 0a 09 09 73 n $interval...s
4cb0: 65 74 20 62 65 73 74 20 5b 6c 69 73 74 20 24 6c et best [list $l
4cc0: 6f 63 61 74 69 6f 6e 5d 0a 09 20 20 20 20 7d 20 ocation].. }
4cd0: 65 6c 73 65 69 66 20 7b 24 69 6e 74 65 72 76 61 elseif {$interva
4ce0: 6c 20 3d 3d 20 24 6d 69 6e 7d 20 7b 0a 09 09 6c l == $min} {...l
4cf0: 61 70 70 65 6e 64 20 62 65 73 74 20 24 6c 6f 63 append best $loc
4d00: 61 74 69 6f 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a ation.. }..}.
4d10: 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 ..if {[llength $
4d20: 62 65 73 74 5d 20 3d 3d 20 31 7d 20 7b 20 72 65 best] == 1} { re
4d30: 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 62 65 turn [lindex $be
4d40: 73 74 20 30 5d 20 7d 0a 0a 09 72 65 74 75 72 6e st 0] }...return
4d50: 20 5b 6c 69 6e 64 65 78 20 5b 6c 73 6f 72 74 20 [lindex [lsort
4d60: 2d 69 6e 74 65 67 65 72 20 2d 69 6e 63 72 65 61 -integer -increa
4d70: 73 69 6e 67 20 24 62 65 73 74 5d 20 30 5d 0a 20 sing $best] 0].
4d80: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 43 }.. proc C
4d90: 75 74 41 74 20 7b 6c 6f 63 61 74 69 6f 6e 7d 20 utAt {location}
4da0: 7b 0a 09 75 70 76 61 72 20 31 20 63 72 6f 73 73 {..upvar 1 cross
4db0: 20 63 72 6f 73 73 20 64 65 70 63 20 64 65 70 63 cross depc depc
4dc0: 0a 0a 09 23 20 49 74 20 77 61 73 20 64 65 63 69 ...# It was deci
4dd0: 64 65 64 20 74 6f 20 73 70 6c 69 74 20 74 68 65 ded to split the
4de0: 20 63 68 61 6e 67 65 73 65 74 20 61 74 20 74 68 changeset at th
4df0: 65 20 67 69 76 65 6e 0a 09 23 20 6c 6f 63 61 74 e given..# locat
4e00: 69 6f 6e 2e 20 54 68 69 73 20 63 75 74 73 20 61 ion. This cuts a
4e10: 20 6e 75 6d 62 65 72 20 6f 66 20 64 65 70 65 6e number of depen
4e20: 64 65 6e 63 69 65 73 2e 20 48 65 72 65 20 77 65 dencies. Here we
4e30: 20 75 70 64 61 74 65 0a 09 23 20 74 68 65 20 63 update..# the c
4e40: 72 6f 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e ross information
4e50: 20 73 6f 20 74 68 61 74 20 74 68 65 20 62 72 65 so that the bre
4e60: 61 6b 20 66 69 6e 64 65 72 20 68 61 73 20 61 63 ak finder has ac
4e70: 63 75 72 61 74 65 0a 09 23 20 64 61 74 61 20 77 curate..# data w
4e80: 68 65 6e 20 77 65 20 6c 6f 6f 6b 20 61 74 20 74 hen we look at t
4e90: 68 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 61 he generated fra
4ea0: 67 6d 65 6e 74 73 2e 0a 0a 09 73 65 74 20 73 69 gments....set si
4eb0: 78 20 5b 6c 6f 67 20 76 69 73 69 62 6c 65 3f 20 x [log visible?
4ec0: 36 5d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 64 65 6]...foreach {de
4ed0: 70 20 72 61 6e 67 65 7d 20 5b 61 72 72 61 79 20 p range} [array
4ee0: 67 65 74 20 64 65 70 63 5d 20 7b 0a 09 20 20 20 get depc] {..
4ef0: 20 23 20 43 68 65 63 6b 20 61 6c 6c 20 64 65 70 # Check all dep
4f00: 65 6e 64 65 6e 63 69 65 73 20 73 74 69 6c 6c 20 endencies still
4f10: 6b 6e 6f 77 6e 2c 20 74 61 6b 65 20 74 68 65 69 known, take thei
4f20: 72 20 72 61 6e 67 65 20 61 6e 64 0a 09 20 20 20 r range and..
4f30: 20 23 20 73 65 65 20 69 66 20 74 68 65 20 62 72 # see if the br
4f40: 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 66 61 6c eak location fal
4f50: 6c 73 20 77 69 74 68 69 6e 2e 0a 0a 09 20 20 20 ls within....
4f60: 20 42 6f 72 64 65 72 20 24 72 61 6e 67 65 20 73 Border $range s
4f70: 20 65 0a 09 20 20 20 20 69 66 20 7b 24 6c 6f 63 e.. if {$loc
4f80: 61 74 69 6f 6e 20 3c 20 24 73 7d 20 63 6f 6e 74 ation < $s} cont
4f90: 69 6e 75 65 20 3b 20 23 20 62 72 65 61 6b 20 62 inue ; # break b
4fa0: 65 66 6f 72 65 20 72 61 6e 67 65 2c 20 69 67 6e efore range, ign
4fb0: 6f 72 65 0a 09 20 20 20 20 69 66 20 7b 24 6c 6f ore.. if {$lo
4fc0: 63 61 74 69 6f 6e 20 3e 20 24 65 7d 20 63 6f 6e cation > $e} con
4fd0: 74 69 6e 75 65 20 3b 20 23 20 62 72 65 61 6b 20 tinue ; # break
4fe0: 61 66 74 65 72 20 72 61 6e 67 65 2c 20 69 67 6e after range, ign
4ff0: 6f 72 65 2e 0a 0a 09 20 20 20 20 23 20 54 68 69 ore.... # Thi
5000: 73 20 64 65 70 65 6e 64 65 6e 63 79 20 63 72 6f s dependency cro
5010: 73 73 65 73 20 74 68 65 20 62 72 65 61 6b 20 6c sses the break l
5020: 6f 63 61 74 69 6f 6e 2e 20 57 65 20 72 65 6d 6f ocation. We remo
5030: 76 65 20 69 74 0a 09 20 20 20 20 23 20 66 72 6f ve it.. # fro
5040: 6d 20 74 68 65 20 63 72 6f 73 73 69 6e 67 73 20 m the crossings
5050: 63 6f 75 6e 74 65 72 73 2c 20 61 6e 64 20 74 68 counters, and th
5060: 65 6e 20 61 6c 73 6f 20 66 72 6f 6d 20 74 68 65 en also from the
5070: 20 73 65 74 0a 09 20 20 20 20 23 20 6f 66 20 6b set.. # of k
5080: 6e 6f 77 6e 20 64 65 70 65 6e 64 65 6e 63 69 65 nown dependencie
5090: 73 2c 20 61 73 20 77 65 20 61 72 65 20 64 6f 6e s, as we are don
50a0: 65 20 77 69 74 68 20 69 74 2e 0a 0a 09 20 20 20 e with it....
50b0: 20 66 6f 72 65 61 63 68 20 6c 6f 63 20 24 64 65 foreach loc $de
50c0: 70 63 28 24 64 65 70 29 20 7b 20 69 6e 63 72 20 pc($dep) { incr
50d0: 63 72 6f 73 73 28 24 6c 6f 63 29 20 2d 31 20 7d cross($loc) -1 }
50e0: 0a 09 20 20 20 20 75 6e 73 65 74 20 64 65 70 63 .. unset depc
50f0: 28 24 64 65 70 29 0a 0a 09 20 20 20 20 69 66 20 ($dep)... if
5100: 7b 21 24 73 69 78 7d 20 63 6f 6e 74 69 6e 75 65 {!$six} continue
5110: 0a 0a 09 20 20 20 20 73 74 72 75 63 74 3a 3a 6c ... struct::l
5120: 69 73 74 20 61 73 73 69 67 6e 20 24 64 65 70 20 ist assign $dep
5130: 70 61 72 65 6e 74 20 63 68 69 6c 64 0a 09 20 20 parent child..
5140: 20 20 6c 6f 67 20 77 72 69 74 65 20 35 20 63 73 log write 5 cs
5150: 65 74 73 20 22 42 72 6f 6b 65 20 64 65 70 65 6e ets "Broke depen
5160: 64 65 6e 63 79 20 5b 50 44 20 24 70 61 72 65 6e dency [PD $paren
5170: 74 5d 20 2d 2d 3e 20 5b 50 44 20 24 63 68 69 6c t] --> [PD $chil
5180: 64 5d 22 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 0a d]"..}...return.
5190: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 50 72 69 }.. # Pri
51a0: 6e 74 20 69 64 65 6e 74 69 66 79 69 6e 67 20 64 nt identifying d
51b0: 61 74 61 20 66 6f 72 20 61 20 72 65 76 69 73 69 ata for a revisi
51c0: 6f 6e 20 28 70 72 6f 6a 65 63 74 2c 20 66 69 6c on (project, fil
51d0: 65 2c 20 64 6f 74 74 65 64 20 72 65 76 0a 20 20 e, dotted rev.
51e0: 20 20 23 20 6e 75 6d 62 65 72 29 2c 20 66 6f 72 # number), for
51f0: 20 68 69 67 68 20 76 65 72 62 6f 73 69 74 79 20 high verbosity
5200: 6c 6f 67 20 6f 75 74 70 75 74 2e 0a 0a 20 20 20 log output...
5210: 20 70 72 6f 63 20 50 44 20 7b 69 64 7d 20 7b 0a proc PD {id} {.
5220: 09 66 6f 72 65 61 63 68 20 7b 70 20 66 20 72 7d .foreach {p f r}
5230: 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 [state run {...
5240: 53 45 4c 45 43 54 20 50 2e 6e 61 6d 65 20 2c 20 SELECT P.name ,
5250: 46 2e 6e 61 6d 65 2c 20 52 2e 72 65 76 0a 09 09 F.name, R.rev...
5260: 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c FROM revision R,
5270: 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65 63 74 file F, project
5280: 20 50 0a 09 09 57 48 45 52 45 20 52 2e 72 69 64 P...WHERE R.rid
5290: 20 3d 20 24 69 64 0a 09 09 41 4e 44 20 20 20 52 = $id...AND R
52a0: 2e 66 69 64 20 3d 20 46 2e 66 69 64 0a 09 09 41 .fid = F.fid...A
52b0: 4e 44 20 20 20 46 2e 70 69 64 20 3d 20 50 2e 70 ND F.pid = P.p
52c0: 69 64 0a 09 7d 5d 20 62 72 65 61 6b 0a 09 72 65 id..}] break..re
52d0: 74 75 72 6e 20 22 27 24 70 20 3a 20 24 66 2f 24 turn "'$p : $f/$
52e0: 72 27 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 r'". }.. #
52f0: 20 50 72 69 6e 74 69 6e 67 20 6f 6e 65 20 6f 72 Printing one or
5300: 20 6d 6f 72 65 20 72 61 6e 67 65 73 2c 20 66 6f more ranges, fo
5310: 72 6d 61 74 74 65 64 2c 20 61 6e 64 20 6f 6e 6c rmatted, and onl
5320: 79 20 74 68 65 69 72 20 62 6f 72 64 65 72 20 74 y their border t
5330: 6f 0a 20 20 20 20 23 20 6b 65 65 70 20 74 68 65 o. # keep the
5340: 20 73 74 72 69 6e 67 73 20 73 68 6f 72 74 2e 0a strings short..
5350: 0a 20 20 20 20 70 72 6f 63 20 50 52 73 20 7b 72 . proc PRs {r
5360: 61 6e 67 65 73 7d 20 7b 0a 09 72 65 74 75 72 6e anges} {..return
5370: 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d [struct::list m
5380: 61 70 20 24 72 61 6e 67 65 73 20 5b 6d 79 70 72 ap $ranges [mypr
5390: 6f 63 20 50 52 5d 5d 0a 20 20 20 20 7d 0a 0a 20 oc PR]]. }..
53a0: 20 20 20 70 72 6f 63 20 50 52 20 7b 72 61 6e 67 proc PR {rang
53b0: 65 7d 20 7b 0a 09 42 6f 72 64 65 72 20 24 72 61 e} {..Border $ra
53c0: 6e 67 65 20 73 20 65 0a 09 72 65 74 75 72 6e 20 nge s e..return
53d0: 3c 24 7b 73 7d 2e 2e 2e 24 7b 65 7d 3e 0a 20 20 <${s}...${e}>.
53e0: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 42 6f }.. proc Bo
53f0: 72 64 65 72 20 7b 72 61 6e 67 65 20 73 76 20 65 rder {range sv e
5400: 76 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 73 v} {..upvar 1 $s
5410: 76 20 73 20 24 65 76 20 65 0a 09 73 65 74 20 73 v s $ev e..set s
5420: 20 5b 6c 69 6e 64 65 78 20 24 72 61 6e 67 65 20 [lindex $range
5430: 30 5d 0a 09 73 65 74 20 65 20 5b 6c 69 6e 64 65 0]..set e [linde
5440: 78 20 24 72 61 6e 67 65 20 65 6e 64 5d 0a 09 72 x $range end]..r
5450: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 eturn. }..
5460: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 # # ## ### ####
5470: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 # ######## #####
5480: 23 23 23 23 23 23 23 23 0a 0a 20 20 20 20 74 79 ########.. ty
5490: 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 68 61 pevariable mycha
54a0: 6e 67 65 73 65 74 73 20 20 20 20 20 7b 7d 20 3b ngesets {} ;
54b0: 20 23 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 6b # List of all k
54c0: 6e 6f 77 6e 20 63 68 61 6e 67 65 73 65 74 73 2e nown changesets.
54d0: 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c . typevariabl
54e0: 65 20 6d 79 69 74 65 6d 6d 61 70 20 2d 61 72 72 e myitemmap -arr
54f0: 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 66 72 ay {} ; # Map fr
5500: 6f 6d 20 69 74 65 6d 73 20 28 74 61 67 67 65 64 om items (tagged
5510: 29 20 74 6f 0a 09 09 09 09 20 20 20 20 20 20 20 ) to.....
5520: 23 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 68 # the list of ch
5530: 61 6e 67 65 73 65 74 73 0a 09 09 09 09 20 20 20 angesets.....
5540: 20 20 20 20 23 20 63 6f 6e 74 61 69 6e 69 6e 67 # containing
5550: 20 69 74 2e 20 45 61 63 68 20 69 74 65 6d 20 63 it. Each item c
5560: 61 6e 0a 09 09 09 09 20 20 20 20 20 20 20 23 20 an..... #
5570: 62 65 20 75 73 65 64 20 62 79 20 6f 6e 6c 79 20 be used by only
5580: 6f 6e 65 0a 09 09 09 09 20 20 20 20 20 20 20 23 one..... #
5590: 20 63 68 61 6e 67 65 73 65 74 2e 0a 20 20 20 20 changeset..
55a0: 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 69 typevariable myi
55b0: 64 6d 61 70 20 20 20 2d 61 72 72 61 79 20 7b 7d dmap -array {}
55c0: 20 3b 20 23 20 4d 61 70 20 66 72 6f 6d 20 63 68 ; # Map from ch
55d0: 61 6e 67 65 73 65 74 20 69 64 20 74 6f 0a 09 09 angeset id to...
55e0: 09 09 20 20 20 20 20 20 20 23 20 63 68 61 6e 67 .. # chang
55f0: 65 73 65 74 2e 0a 0a 20 20 20 20 74 79 70 65 6d eset... typem
5600: 65 74 68 6f 64 20 61 6c 6c 20 20 20 20 7b 7d 20 ethod all {}
5610: 20 20 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 63 { return $myc
5620: 68 61 6e 67 65 73 65 74 73 20 7d 0a 20 20 20 20 hangesets }.
5630: 74 79 70 65 6d 65 74 68 6f 64 20 6f 66 20 20 20 typemethod of
5640: 20 20 7b 63 69 64 7d 20 7b 20 72 65 74 75 72 6e {cid} { return
5650: 20 24 6d 79 69 64 6d 61 70 28 24 63 69 64 29 20 $myidmap($cid)
5660: 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 }. typemethod
5670: 20 6f 66 69 74 65 6d 20 7b 69 69 64 7d 20 7b 20 ofitem {iid} {
5680: 72 65 74 75 72 6e 20 24 6d 79 69 74 65 6d 6d 61 return $myitemma
5690: 70 28 24 69 69 64 29 20 7d 0a 0a 20 20 20 20 23 p($iid) }.. #
56a0: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 # ## ### #####
56b0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
56c0: 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 43 6f ######. ## Co
56d0: 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a 20 20 20 nfiguration..
56e0: 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65 pragma -hastype
56f0: 69 6e 66 6f 20 20 20 20 6e 6f 20 20 3b 20 23 20 info no ; #
5700: 6e 6f 20 74 79 70 65 20 69 6e 74 72 6f 73 70 65 no type introspe
5710: 63 74 69 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61 ction. pragma
5720: 20 2d 68 61 73 69 6e 66 6f 20 20 20 20 20 20 20 -hasinfo
5730: 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 6f 62 6a 65 no ; # no obje
5740: 63 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e ct introspection
5750: 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23 .. # # ## ###
5760: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 ##### ########
5770: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 7d 0a #############.}.
5780: 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 .# # ## ### ####
5790: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 # ######## #####
57a0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
57b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 ##############.#
57c0: 23 20 48 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 # Helper singlet
57d0: 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20 66 6f 72 on. Commands for
57e0: 20 72 65 76 69 73 69 6f 6e 20 63 68 61 6e 67 65 revision change
57f0: 73 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 sets...snit::typ
5800: 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a e ::vc::fossil::
5810: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f import::cvs::pro
5820: 6a 65 63 74 3a 3a 72 65 76 3a 3a 72 65 76 20 7b ject::rev::rev {
5830: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 . typemethod
5840: 62 79 72 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 byrevision {} {
5850: 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 return 1 }. t
5860: 79 70 65 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 ypemethod bysymb
5870: 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e ol {} { return
5880: 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 0 }. typemet
5890: 68 6f 64 20 69 73 74 61 67 20 20 20 20 20 20 7b hod istag {
58a0: 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 } { return 0 }.
58b0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73 typemethod is
58c0: 62 72 61 6e 63 68 20 20 20 7b 7d 20 7b 20 72 65 branch {} { re
58d0: 74 75 72 6e 20 30 20 7d 0a 0a 20 20 20 20 74 79 turn 0 }.. ty
58e0: 70 65 6d 65 74 68 6f 64 20 73 74 72 20 7b 72 65 pemethod str {re
58f0: 76 69 73 69 6f 6e 7d 20 7b 0a 09 73 74 72 75 63 vision} {..struc
5900: 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b t::list assign [
5910: 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 state run {..
5920: 20 53 45 4c 45 43 54 20 52 2e 72 65 76 2c 20 46 SELECT R.rev, F
5930: 2e 6e 61 6d 65 2c 20 50 2e 6e 61 6d 65 0a 09 20 .name, P.name..
5940: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 FROM revisi
5950: 6f 6e 20 52 2c 20 66 69 6c 65 20 46 2c 20 70 72 on R, file F, pr
5960: 6f 6a 65 63 74 20 50 0a 09 20 20 20 20 57 48 45 oject P.. WHE
5970: 52 45 20 20 52 2e 72 69 64 20 3d 20 24 72 65 76 RE R.rid = $rev
5980: 69 73 69 6f 6e 0a 09 20 20 20 20 41 4e 44 20 20 ision.. AND
5990: 20 20 46 2e 66 69 64 20 3d 20 52 2e 66 69 64 0a F.fid = R.fid.
59a0: 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69 . AND P.pi
59b0: 64 20 3d 20 46 2e 70 69 64 0a 09 7d 5d 20 72 65 d = F.pid..}] re
59c0: 76 6e 72 20 66 6e 61 6d 65 20 70 6e 61 6d 65 0a vnr fname pname.
59d0: 09 72 65 74 75 72 6e 20 22 24 70 6e 61 6d 65 2f .return "$pname/
59e0: 24 7b 72 65 76 6e 72 7d 3a 3a 24 66 6e 61 6d 65 ${revnr}::$fname
59f0: 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 ". }.. # r
5a00: 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69 esult = list (mi
5a10: 6e 74 69 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a ntime, maxtime).
5a20: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 74 typemethod t
5a30: 69 6d 65 72 61 6e 67 65 20 7b 69 74 65 6d 73 7d imerange {items}
5a40: 20 7b 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 {..set theset (
5a50: 27 5b 6a 6f 69 6e 20 24 69 74 65 6d 73 20 7b 27 '[join $items {'
5a60: 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b ,'}]')..return [
5a70: 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 state run "..
5a80: 20 53 45 4c 45 43 54 20 4d 49 4e 28 52 2e 64 61 SELECT MIN(R.da
5a90: 74 65 29 2c 20 4d 41 58 28 52 2e 64 61 74 65 29 te), MAX(R.date)
5aa0: 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73 .. FROM revis
5ab0: 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 ion R.. WHERE
5ac0: 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 R.rid IN $these
5ad0: 74 0a 09 22 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 t.."]. }..
5ae0: 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 # var(dv) = dic
5af0: 74 20 28 72 65 76 69 73 69 6f 6e 20 2d 3e 20 6c t (revision -> l
5b00: 69 73 74 20 28 72 65 76 69 73 69 6f 6e 29 29 0a ist (revision)).
5b10: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 typemethod i
5b20: 6e 74 65 72 6e 61 6c 73 75 63 63 65 73 73 6f 72 nternalsuccessor
5b30: 73 20 7b 64 76 20 72 65 76 69 73 69 6f 6e 73 7d s {dv revisions}
5b40: 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76 20 {..upvar 1 $dv
5b50: 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 73 65 dependencies..se
5b60: 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e t theset ('[join
5b70: 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 $revisions {','
5b80: 7d 5d 27 29 0a 0a 09 23 20 53 65 65 20 27 73 75 }]')...# See 'su
5b90: 63 63 65 73 73 6f 72 73 27 20 62 65 6c 6f 77 20 ccessors' below
5ba0: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 65 78 70 for the main exp
5bb0: 6c 61 6e 61 74 69 6f 6e 20 6f 66 0a 09 23 20 74 lanation of..# t
5bc0: 68 65 20 76 61 72 69 6f 75 73 20 63 61 73 65 73 he various cases
5bd0: 2e 20 54 68 69 73 20 70 69 65 63 65 20 69 73 20 . This piece is
5be0: 73 70 65 63 69 61 6c 20 69 6e 20 74 68 61 74 20 special in that
5bf0: 69 74 0a 09 23 20 72 65 73 74 72 69 63 74 73 20 it..# restricts
5c00: 74 68 65 20 73 75 63 63 65 73 73 6f 72 73 20 77 the successors w
5c10: 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 6f 20 74 68 e look for to th
5c20: 65 20 73 61 6d 65 20 73 65 74 20 6f 66 0a 09 23 e same set of..#
5c30: 20 72 65 76 69 73 69 6f 6e 73 20 77 65 20 73 74 revisions we st
5c40: 61 72 74 20 66 72 6f 6d 2e 20 53 65 6e 73 69 62 art from. Sensib
5c50: 6c 65 20 61 73 20 77 65 20 61 72 65 20 6c 6f 6f le as we are loo
5c60: 6b 69 6e 67 20 66 6f 72 0a 09 23 20 63 68 61 6e king for..# chan
5c70: 67 65 73 65 74 20 69 6e 74 65 72 6e 61 6c 20 64 geset internal d
5c80: 65 70 65 6e 64 65 6e 63 69 65 73 2e 0a 0a 09 61 ependencies....a
5c90: 72 72 61 79 20 73 65 74 20 64 65 70 20 7b 7d 0a rray set dep {}.
5ca0: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63 ..foreach {rid c
5cb0: 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e hild} [state run
5cc0: 20 22 0a 20 20 20 2d 2d 20 28 31 29 20 50 72 69 ". -- (1) Pri
5cd0: 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20 mary child..
5ce0: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e SELECT R.rid, R.
5cf0: 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 child.. FROM
5d00: 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 revision R..
5d10: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 WHERE R.rid
5d20: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 IN $theset
5d30: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 -- Restrict to r
5d40: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 evisions of inte
5d50: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 rest.. AND
5d60: 20 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 R.child IS NOT
5d70: 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 NULL -- Has p
5d80: 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20 rimary child..
5d90: 20 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 AND R.child
5da0: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 IN $theset
5db0: 2d 2d 20 57 68 69 63 68 20 69 73 20 61 6c 73 6f -- Which is also
5dc0: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 20 20 20 of interest.
5dd0: 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32 UNION. -- (2
5de0: 29 20 53 65 63 6f 6e 64 61 72 79 20 28 62 72 61 ) Secondary (bra
5df0: 6e 63 68 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 nch) children..
5e00: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c SELECT R.rid,
5e10: 20 42 2e 62 72 69 64 0a 09 20 20 20 20 46 52 4f B.brid.. FRO
5e20: 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 M revision R,
5e30: 72 65 76 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 revisionbranchch
5e40: 69 6c 64 72 65 6e 20 42 0a 09 20 20 20 20 57 48 ildren B.. WH
5e50: 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 ERE R.rid IN
5e60: 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 $theset -- R
5e70: 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 estrict to revis
5e80: 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 ions of interest
5e90: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72 .. AND R.r
5ea0: 69 64 20 3d 20 42 2e 72 69 64 20 20 20 20 20 20 id = B.rid
5eb0: 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 73 75 -- Select su
5ec0: 62 73 65 74 20 6f 66 20 62 72 61 6e 63 68 20 63 bset of branch c
5ed0: 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 41 4e 44 hildren.. AND
5ee0: 20 20 20 20 42 2e 62 72 69 64 20 49 4e 20 24 74 B.brid IN $t
5ef0: 68 65 73 65 74 20 20 20 20 20 20 2d 2d 20 57 68 heset -- Wh
5f00: 69 63 68 20 69 73 20 61 6c 73 6f 20 6f 66 20 69 ich is also of i
5f10: 6e 74 65 72 65 73 74 0a 20 20 20 20 55 4e 49 4f nterest. UNIO
5f20: 4e 0a 20 20 20 20 2d 2d 20 28 34 29 20 43 68 69 N. -- (4) Chi
5f30: 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 ld of trunk root
5f40: 20 73 75 63 63 65 73 73 6f 72 20 6f 66 20 6c 61 successor of la
5f50: 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b st NTDB on trunk
5f60: 2e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e ... SELECT R.
5f70: 72 69 64 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20 rid, RA.child..
5f80: 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e FROM revision
5f90: 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 0a R, revision RA.
5fa0: 09 20 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 . WHERE R.rid
5fb0: 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 IN $theset
5fc0: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 -- Restrict t
5fd0: 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 o revisions of i
5fe0: 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 nterest.. AND
5ff0: 20 20 20 52 2e 69 73 64 65 66 61 75 6c 74 20 20 R.isdefault
6000: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 52 65 -- Re
6010: 73 74 72 69 63 74 20 74 6f 20 4e 54 44 42 0a 09 strict to NTDB..
6020: 20 20 20 20 41 4e 44 20 20 20 52 2e 64 62 63 68 AND R.dbch
6030: 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 ild IS NOT NULL
6040: 20 20 2d 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 -- and last NT
6050: 44 42 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 DB belonging to
6060: 74 72 75 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 trunk.. AND
6070: 20 52 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 RA.rid = R.dbch
6080: 69 6c 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 ild -- Go d
6090: 69 72 65 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b irectly to trunk
60a0: 20 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 root.. AND
60b0: 20 52 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 RA.child IS NOT
60c0: 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 NULL -- Has
60d0: 70 72 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 20 primary child..
60e0: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 AND
60f0: 20 52 41 2e 63 68 69 6c 64 20 49 4e 20 24 74 68 RA.child IN $th
6100: 65 73 65 74 20 20 20 20 20 2d 2d 20 57 68 69 63 eset -- Whic
6110: 68 20 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e 74 h is also of int
6120: 65 72 65 73 74 0a 09 22 5d 20 7b 0a 09 20 20 20 erest.."] {..
6130: 20 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69 # Consider movi
6140: 6e 67 20 74 68 69 73 20 74 6f 20 74 68 65 20 69 ng this to the i
6150: 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e ntegrity module.
6160: 0a 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 .. integrity
6170: 61 73 73 65 72 74 20 7b 24 72 69 64 20 21 3d 20 assert {$rid !=
6180: 24 63 68 69 6c 64 7d 20 7b 52 65 76 69 73 69 6f $child} {Revisio
6190: 6e 20 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f n $rid depends o
61a0: 6e 20 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20 n itself.}..
61b0: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e lappend dependen
61c0: 63 69 65 73 28 24 72 69 64 29 20 24 63 68 69 6c cies($rid) $chil
61d0: 64 0a 09 20 20 20 20 73 65 74 20 64 65 70 28 24 d.. set dep($
61e0: 72 69 64 2c 24 63 68 69 6c 64 29 20 2e 0a 09 7d rid,$child) ...}
61f0: 0a 0a 09 23 20 54 68 65 20 73 71 6c 20 73 74 61 ...# The sql sta
6200: 74 65 6d 65 6e 74 73 20 61 62 6f 76 65 20 6c 6f tements above lo
6210: 6f 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 64 69 72 oks only for dir
6220: 65 63 74 20 64 65 70 65 6e 64 65 6e 63 69 65 73 ect dependencies
6230: 0a 09 23 20 62 65 74 77 65 65 6e 20 72 65 76 69 ..# between revi
6240: 73 69 6f 6e 20 69 6e 20 74 68 65 20 63 68 61 6e sion in the chan
6250: 67 65 73 65 74 2e 20 48 6f 77 65 76 65 72 20 64 geset. However d
6260: 75 65 20 74 6f 20 74 68 65 0a 09 23 20 76 61 67 ue to the..# vag
6270: 61 72 69 65 73 20 6f 66 20 6d 65 74 61 20 64 61 aries of meta da
6280: 74 61 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c ta it is possibl
6290: 65 20 66 6f 72 20 74 77 6f 20 72 65 76 69 73 69 e for two revisi
62a0: 6f 6e 73 20 6f 66 0a 09 23 20 74 68 65 20 73 61 ons of..# the sa
62b0: 6d 65 20 66 69 6c 65 20 74 6f 20 65 6e 64 20 75 me file to end u
62c0: 70 20 69 6e 20 74 68 65 20 73 61 6d 65 20 63 68 p in the same ch
62d0: 61 6e 67 65 73 65 74 2c 20 77 69 74 68 6f 75 74 angeset, without
62e0: 20 61 0a 09 23 20 64 69 72 65 63 74 20 64 65 70 a..# direct dep
62f0: 65 6e 64 65 6e 63 79 20 62 65 74 77 65 65 6e 20 endency between
6300: 74 68 65 6d 2e 20 48 6f 77 65 76 65 72 20 77 65 them. However we
6310: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 72 65 know that there
6320: 0a 09 23 20 68 61 73 20 74 6f 20 62 65 20 61 20 ..# has to be a
6330: 61 6e 20 69 6e 64 69 72 65 63 74 20 64 65 70 65 an indirect depe
6340: 6e 64 65 6e 63 79 2c 20 62 65 20 69 74 20 74 68 ndency, be it th
6350: 72 6f 75 67 68 20 70 72 69 6d 61 72 79 0a 09 23 rough primary..#
6360: 20 63 68 69 6c 64 72 65 6e 2c 20 62 72 61 6e 63 children, branc
6370: 68 20 63 68 69 6c 64 72 65 6e 2c 20 6f 72 20 61 h children, or a
6380: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68 65 combination the
6390: 72 65 6f 66 2e 0a 0a 09 23 20 57 65 20 6e 6f 77 reof....# We now
63a0: 20 66 69 6c 6c 20 69 6e 20 74 68 65 73 65 20 70 fill in these p
63b0: 73 65 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63 69 seudo-dependenci
63c0: 65 73 2c 20 69 66 20 6e 6f 20 73 75 63 68 0a 09 es, if no such..
63d0: 23 20 64 65 70 65 6e 64 65 6e 63 79 20 65 78 69 # dependency exi
63e0: 73 74 73 20 61 6c 72 65 61 64 79 2e 20 54 68 65 sts already. The
63f0: 20 64 69 72 65 63 74 69 6f 6e 20 6f 66 20 74 68 direction of th
6400: 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 09 23 20 e dependency..#
6410: 69 73 20 61 63 74 75 61 6c 6c 79 20 69 72 72 65 is actually irre
6420: 6c 65 76 61 6e 74 20 66 6f 72 20 74 68 69 73 2e levant for this.
6430: 0a 0a 09 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 ...# NOTE: This
6440: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f is different fro
6450: 6d 20 63 76 73 32 73 76 6e 2e 20 4f 75 72 20 73 m cvs2svn. Our s
6460: 70 69 72 69 74 75 61 6c 20 61 6e 63 65 73 74 6f piritual ancesto
6470: 72 0a 09 23 20 64 6f 65 73 20 6e 6f 74 20 75 73 r..# does not us
6480: 65 20 73 75 63 68 20 70 73 65 75 64 6f 2d 64 65 e such pseudo-de
6490: 70 65 6e 64 65 6e 63 69 65 73 2c 20 68 6f 77 65 pendencies, howe
64a0: 76 65 72 20 69 74 20 75 73 65 73 20 61 0a 09 23 ver it uses a..#
64b0: 20 43 4f 4d 4d 49 54 5f 54 48 52 45 53 48 4f 4c COMMIT_THRESHOL
64c0: 44 2c 20 61 20 74 69 6d 65 20 69 6e 74 65 72 76 D, a time interv
64d0: 61 6c 20 63 6f 6d 6d 69 74 73 20 73 68 6f 75 6c al commits shoul
64e0: 64 20 66 61 6c 6c 2e 20 54 68 69 73 0a 09 23 20 d fall. This..#
64f0: 77 69 6c 6c 20 67 72 65 61 74 6c 79 20 72 65 64 will greatly red
6500: 75 63 65 73 20 74 68 65 20 72 69 73 6b 20 6f 66 uces the risk of
6510: 20 67 65 74 74 69 6e 67 20 66 61 72 20 73 65 70 getting far sep
6520: 61 72 61 74 65 64 0a 09 23 20 72 65 76 69 73 69 arated..# revisi
6530: 6f 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 ons of the same
6540: 66 69 6c 65 20 69 6e 74 6f 20 6f 6e 65 20 63 68 file into one ch
6550: 61 6e 67 65 73 65 74 2e 0a 0a 09 23 20 57 65 20 angeset....# We
6560: 61 6c 6c 6f 77 20 72 65 76 69 73 69 6f 6e 73 20 allow revisions
6570: 74 6f 20 62 65 20 66 61 72 20 61 70 61 72 74 20 to be far apart
6580: 69 6e 20 74 69 6d 65 20 69 6e 20 74 68 65 20 73 in time in the s
6590: 61 6d 65 0a 09 23 20 63 68 61 6e 67 65 73 65 74 ame..# changeset
65a0: 2c 20 62 75 74 20 6e 65 65 64 20 74 68 65 20 70 , but need the p
65b0: 73 65 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63 69 seudo-dependenci
65c0: 65 73 20 66 6f 72 20 74 68 69 73 2e 0a 0a 09 61 es for this....a
65d0: 72 72 61 79 20 73 65 74 20 66 69 64 73 20 7b 7d rray set fids {}
65e0: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 66 ..foreach {rid f
65f0: 69 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 id} [state run "
6600: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 .. SELECT R.r
6610: 69 64 2c 20 52 2e 66 69 64 20 46 52 4f 4d 20 72 id, R.fid FROM r
6620: 65 76 69 73 69 6f 6e 20 52 20 57 48 45 52 45 20 evision R WHERE
6630: 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 R.rid IN $theset
6640: 0a 09 22 5d 20 7b 20 6c 61 70 70 65 6e 64 20 66 .."] { lappend f
6650: 69 64 73 28 24 66 69 64 29 20 24 72 69 64 20 7d ids($fid) $rid }
6660: 0a 0a 09 66 6f 72 65 61 63 68 20 7b 66 69 64 20 ...foreach {fid
6670: 72 69 64 73 7d 20 5b 61 72 72 61 79 20 67 65 74 rids} [array get
6680: 20 66 69 64 73 5d 20 7b 0a 09 20 20 20 20 69 66 fids] {.. if
6690: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 72 69 64 73 {[llength $rids
66a0: 5d 20 3c 20 32 7d 20 63 6f 6e 74 69 6e 75 65 0a ] < 2} continue.
66b0: 09 20 20 20 20 66 6f 72 65 61 63 68 20 61 20 24 . foreach a $
66c0: 72 69 64 73 20 7b 0a 09 09 66 6f 72 65 61 63 68 rids {...foreach
66d0: 20 62 20 24 72 69 64 73 20 7b 0a 09 09 20 20 20 b $rids {...
66e0: 20 69 66 20 7b 24 61 20 3d 3d 20 24 62 7d 20 63 if {$a == $b} c
66f0: 6f 6e 74 69 6e 75 65 0a 09 09 20 20 20 20 69 66 ontinue... if
6700: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64 {[info exists d
6710: 65 70 28 24 61 2c 24 62 29 5d 7d 20 63 6f 6e 74 ep($a,$b)]} cont
6720: 69 6e 75 65 0a 09 09 20 20 20 20 69 66 20 7b 5b inue... if {[
6730: 69 6e 66 6f 20 65 78 69 73 74 73 20 64 65 70 28 info exists dep(
6740: 24 62 2c 24 61 29 5d 7d 20 63 6f 6e 74 69 6e 75 $b,$a)]} continu
6750: 65 0a 09 09 20 20 20 20 6c 61 70 70 65 6e 64 20 e... lappend
6760: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 24 61 29 dependencies($a)
6770: 20 24 62 0a 09 09 20 20 20 20 73 65 74 20 64 65 $b... set de
6780: 70 28 24 61 2c 24 62 29 20 2e 0a 09 09 20 20 20 p($a,$b) ....
6790: 20 73 65 74 20 64 65 70 28 24 62 2c 24 61 29 20 set dep($b,$a)
67a0: 2e 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a ....}.. }..}.
67b0: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 .return. }..
67c0: 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 # var(dv) = d
67d0: 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 ict (item -> lis
67e0: 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 t (item)), item
67f0: 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69 64 = list (type id
6800: 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 ). typemethod
6810: 20 73 75 63 63 65 73 73 6f 72 73 20 7b 64 76 20 successors {dv
6820: 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 revisions} {..up
6830: 76 61 72 20 31 20 24 64 76 20 64 65 70 65 6e 64 var 1 $dv depend
6840: 65 6e 63 69 65 73 0a 09 73 65 74 20 74 68 65 73 encies..set thes
6850: 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 et ('[join $revi
6860: 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a sions {','}]')..
6870: 09 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 .# The following
6880: 20 63 61 73 65 73 20 73 70 65 63 69 66 79 20 77 cases specify w
6890: 68 65 6e 20 61 20 72 65 76 69 73 69 6f 6e 20 53 hen a revision S
68a0: 20 69 73 20 61 20 73 75 63 63 65 73 73 6f 72 0a is a successor.
68b0: 09 23 20 6f 66 20 61 20 72 65 76 69 73 69 6f 6e .# of a revision
68c0: 20 52 2e 20 45 61 63 68 20 6f 66 20 74 68 65 20 R. Each of the
68d0: 63 61 73 65 73 20 74 72 61 6e 73 6c 61 74 65 73 cases translates
68e0: 20 69 6e 74 6f 20 6f 6e 65 20 6f 66 0a 09 23 20 into one of..#
68f0: 74 68 65 20 62 72 61 6e 63 68 65 73 20 6f 66 20 the branches of
6900: 74 68 65 20 53 51 4c 20 55 4e 49 4f 4e 20 63 6f the SQL UNION co
6910: 6d 69 6e 67 20 62 65 6c 6f 77 2e 0a 09 23 0a 09 ming below...#..
6920: 23 20 28 31 29 20 53 20 63 61 6e 20 62 65 20 61 # (1) S can be a
6930: 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 20 6f primary child o
6940: 66 20 52 2c 20 69 2e 65 2e 20 69 6e 20 74 68 65 f R, i.e. in the
6950: 20 73 61 6d 65 20 4c 4f 44 2e 20 52 0a 09 23 20 same LOD. R..#
6960: 20 20 20 20 72 65 66 65 72 65 6e 63 65 73 20 53 references S
6970: 20 64 69 72 65 63 74 6c 79 2e 20 52 2e 63 68 69 directly. R.chi
6980: 6c 64 20 3d 20 53 28 2e 72 69 64 29 2c 20 69 66 ld = S(.rid), if
6990: 20 69 74 20 65 78 69 73 74 73 2e 0a 09 23 0a 09 it exists...#..
69a0: 23 20 28 32 29 20 53 20 63 61 6e 20 62 65 20 61 # (2) S can be a
69b0: 20 73 65 63 6f 6e 64 61 72 79 2c 20 69 2e 65 2e secondary, i.e.
69c0: 20 62 72 61 6e 63 68 2c 20 63 68 69 6c 64 20 6f branch, child o
69d0: 66 20 52 2e 20 48 65 72 65 20 74 68 65 0a 09 23 f R. Here the..#
69e0: 20 20 20 20 20 6c 69 6e 6b 20 69 73 20 6d 61 64 link is mad
69f0: 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 68 65 e through the he
6a00: 6c 70 65 72 20 74 61 62 6c 65 0a 09 23 20 20 20 lper table..#
6a10: 20 20 52 45 56 49 53 49 4f 4e 42 52 41 4e 43 48 REVISIONBRANCH
6a20: 43 48 49 4c 44 52 45 4e 2e 20 52 2e 72 69 64 20 CHILDREN. R.rid
6a30: 2d 3e 20 52 42 43 2e 72 69 64 2c 20 52 42 43 2e -> RBC.rid, RBC.
6a40: 62 72 69 64 20 3d 0a 09 23 20 20 20 20 20 53 28 brid =..# S(
6a50: 2e 72 69 64 29 0a 09 23 0a 09 23 20 28 33 29 20 .rid)..#..# (3)
6a60: 4f 72 69 67 69 6e 61 6c 6c 79 20 74 68 69 73 20 Originally this
6a70: 75 73 65 20 63 61 73 65 20 64 65 66 69 6e 65 64 use case defined
6a80: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 20 64 the root of a d
6a90: 65 74 61 63 68 65 64 0a 09 23 20 20 20 20 20 4e etached..# N
6aa0: 54 44 42 20 61 73 20 74 68 65 20 73 75 63 63 65 TDB as the succe
6ab0: 73 73 6f 72 20 6f 66 20 74 68 65 20 74 72 75 6e ssor of the trun
6ac0: 6b 20 72 6f 6f 74 2e 20 54 68 69 73 20 6c 65 61 k root. This lea
6ad0: 64 73 20 74 6f 20 61 0a 09 23 20 20 20 20 20 62 ds to a..# b
6ae0: 61 64 20 74 61 6e 67 6c 65 20 6c 61 74 65 72 20 ad tangle later
6af0: 6f 6e 2e 20 57 69 74 68 20 61 20 64 65 74 61 63 on. With a detac
6b00: 68 65 64 20 4e 54 44 42 20 74 68 65 20 6f 72 69 hed NTDB the ori
6b10: 67 69 6e 61 6c 0a 09 23 20 20 20 20 20 74 72 75 ginal..# tru
6b20: 6e 6b 20 72 6f 6f 74 20 72 65 76 69 73 69 6f 6e nk root revision
6b30: 20 77 61 73 20 72 65 6d 6f 76 65 64 20 61 73 20 was removed as
6b40: 69 72 72 65 6c 65 76 61 6e 74 2c 20 61 6c 6c 6f irrelevant, allo
6b50: 77 69 6e 67 0a 09 23 20 20 20 20 20 74 68 65 20 wing..# the
6b60: 6e 6f 6d 69 6e 61 6c 20 72 6f 6f 74 20 74 6f 20 nominal root to
6b70: 62 65 20 6c 61 74 65 72 20 69 6e 20 74 69 6d 65 be later in time
6b80: 20 74 68 61 6e 20 74 68 65 20 4e 54 44 42 0a 09 than the NTDB..
6b90: 23 20 20 20 20 20 72 6f 6f 74 2e 20 4e 6f 77 20 # root. Now
6ba0: 73 65 74 74 69 6e 67 20 74 68 69 73 20 64 65 70 setting this dep
6bb0: 65 6e 64 65 6e 63 79 20 77 69 6c 6c 20 62 65 20 endency will be
6bc0: 62 61 63 6b 77 61 72 64 20 69 6e 0a 09 23 20 20 backward in..#
6bd0: 20 20 20 74 69 6d 65 2e 20 52 45 4d 4f 56 45 44 time. REMOVED
6be0: 2e 0a 09 23 0a 09 23 20 28 34 29 20 49 66 20 52 ...#..# (4) If R
6bf0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 6f 66 20 is the last of
6c00: 74 68 65 20 4e 54 44 42 20 72 65 76 69 73 69 6f the NTDB revisio
6c10: 6e 73 20 77 68 69 63 68 20 62 65 6c 6f 6e 67 20 ns which belong
6c20: 74 6f 0a 09 23 20 20 20 20 20 74 68 65 20 74 72 to..# the tr
6c30: 75 6e 6b 2c 20 74 68 65 6e 20 74 68 65 20 70 72 unk, then the pr
6c40: 69 6d 61 72 79 20 63 68 69 6c 64 20 6f 66 20 74 imary child of t
6c50: 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74 20 28 74 he trunk root (t
6c60: 68 65 0a 09 23 20 20 20 20 20 27 31 2e 32 27 20 he..# '1.2'
6c70: 72 65 76 69 73 69 6f 6e 29 20 69 73 20 61 20 73 revision) is a s
6c80: 75 63 63 65 73 73 6f 72 2c 20 69 66 20 69 74 20 uccessor, if it
6c90: 65 78 69 73 74 73 2e 0a 0a 09 23 20 4e 6f 74 65 exists....# Note
6ca0: 20 74 68 61 74 20 74 68 65 20 62 72 61 6e 63 68 that the branch
6cb0: 65 73 20 73 70 61 77 6e 65 64 20 66 72 6f 6d 20 es spawned from
6cc0: 74 68 65 20 72 65 76 69 73 69 6f 6e 73 2c 20 61 the revisions, a
6cd0: 6e 64 20 74 68 65 0a 09 23 20 74 61 67 73 20 61 nd the..# tags a
6ce0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 ssociated with t
6cf0: 68 65 6d 20 61 72 65 20 73 75 63 63 65 73 73 6f hem are successo
6d00: 72 73 20 61 73 20 77 65 6c 6c 2e 0a 0a 09 66 6f rs as well....fo
6d10: 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 reach {rid child
6d20: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 20 } [state run ".
6d30: 20 20 2d 2d 20 28 31 29 20 50 72 69 6d 61 72 79 -- (1) Primary
6d40: 20 63 68 69 6c 64 0a 09 20 20 20 20 53 45 4c 45 child.. SELE
6d50: 43 54 20 52 2e 72 69 64 2c 20 52 2e 63 68 69 6c CT R.rid, R.chil
6d60: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 d.. FROM re
6d70: 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 vision R.. WH
6d80: 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 ERE R.rid IN
6d90: 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 $theset -- R
6da0: 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 estrict to revis
6db0: 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 ions of interest
6dc0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 63 .. AND R.c
6dd0: 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c hild IS NOT NULL
6de0: 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d 61 -- Has prima
6df0: 72 79 20 63 68 69 6c 64 0a 20 20 20 20 55 4e 49 ry child. UNI
6e00: 4f 4e 0a 20 20 20 20 2d 2d 20 28 32 29 20 53 65 ON. -- (2) Se
6e10: 63 6f 6e 64 61 72 79 20 28 62 72 61 6e 63 68 29 condary (branch)
6e20: 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 53 children.. S
6e30: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 ELECT R.rid, B.b
6e40: 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 rid.. FROM
6e50: 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 revision R, revi
6e60: 73 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64 72 sionbranchchildr
6e70: 65 6e 20 42 0a 09 20 20 20 20 57 48 45 52 45 20 en B.. WHERE
6e80: 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 R.rid IN $the
6e90: 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 set -- Restr
6ea0: 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 ict to revisions
6eb0: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 of interest..
6ec0: 20 20 41 4e 44 20 20 20 20 52 2e 72 69 64 20 3d AND R.rid =
6ed0: 20 42 2e 72 69 64 20 20 20 20 20 20 20 20 20 20 B.rid
6ee0: 2d 2d 20 53 65 6c 65 63 74 20 73 75 62 73 65 74 -- Select subset
6ef0: 20 6f 66 20 62 72 61 6e 63 68 20 63 68 69 6c 64 of branch child
6f00: 72 65 6e 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 ren. UNION.
6f10: 20 20 2d 2d 20 28 34 29 20 43 68 69 6c 64 20 6f -- (4) Child o
6f20: 66 20 74 72 75 6e 6b 20 72 6f 6f 74 20 73 75 63 f trunk root suc
6f30: 63 65 73 73 6f 72 20 6f 66 20 6c 61 73 74 20 4e cessor of last N
6f40: 54 44 42 20 6f 6e 20 74 72 75 6e 6b 2e 0a 09 20 TDB on trunk...
6f50: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c SELECT R.rid,
6f60: 20 52 41 2e 63 68 69 6c 64 0a 09 20 20 20 20 46 RA.child.. F
6f70: 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 ROM revision R,
6f80: 72 65 76 69 73 69 6f 6e 20 52 41 0a 09 20 20 20 revision RA..
6f90: 20 57 48 45 52 45 20 52 2e 72 69 64 20 20 20 49 WHERE R.rid I
6fa0: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 20 2d N $theset -
6fb0: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 - Restrict to re
6fc0: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 visions of inter
6fd0: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 52 est.. AND R
6fe0: 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20 20 20 .isdefault
6ff0: 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 -- Restri
7000: 63 74 20 74 6f 20 4e 54 44 42 0a 09 20 20 20 20 ct to NTDB..
7010: 41 4e 44 20 20 20 52 2e 64 62 63 68 69 6c 64 20 AND R.dbchild
7020: 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d IS NOT NULL --
7030: 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 42 20 62 and last NTDB b
7040: 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72 75 6e elonging to trun
7050: 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 52 41 2e k.. AND RA.
7060: 72 69 64 20 3d 20 52 2e 64 62 63 68 69 6c 64 20 rid = R.dbchild
7070: 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 72 65 63 -- Go direc
7080: 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 72 6f 6f tly to trunk roo
7090: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 52 41 2e t.. AND RA.
70a0: 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c child IS NOT NUL
70b0: 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d L -- Has prim
70c0: 61 72 79 20 63 68 69 6c 64 2e 0a 09 22 5d 20 7b ary child..."] {
70d0: 0a 09 20 20 20 20 23 20 43 6f 6e 73 69 64 65 72 .. # Consider
70e0: 20 6d 6f 76 69 6e 67 20 74 68 69 73 20 74 6f 20 moving this to
70f0: 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6d 6f the integrity mo
7100: 64 75 6c 65 2e 0a 09 20 20 20 20 69 6e 74 65 67 dule... integ
7110: 72 69 74 79 20 61 73 73 65 72 74 20 7b 24 72 69 rity assert {$ri
7120: 64 20 21 3d 20 24 63 68 69 6c 64 7d 20 7b 52 65 d != $child} {Re
7130: 76 69 73 69 6f 6e 20 24 72 69 64 20 64 65 70 65 vision $rid depe
7140: 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 2e 7d 0a nds on itself.}.
7150: 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 . lappend dep
7160: 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 endencies([list
7170: 72 65 76 20 24 72 69 64 5d 29 20 5b 6c 69 73 74 rev $rid]) [list
7180: 20 72 65 76 20 24 63 68 69 6c 64 5d 0a 09 7d 0a rev $child]..}.
7190: 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68 .foreach {rid ch
71a0: 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 ild} [state run
71b0: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e ".. SELECT R.
71c0: 72 69 64 2c 20 54 2e 74 69 64 0a 09 20 20 20 20 rid, T.tid..
71d0: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 FROM revision
71e0: 52 2c 20 74 61 67 20 54 0a 09 20 20 20 20 57 48 R, tag T.. WH
71f0: 45 52 45 20 20 52 2e 72 69 64 20 69 6e 20 24 74 ERE R.rid in $t
7200: 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 heset.. AND
7210: 20 20 54 2e 72 65 76 20 3d 20 52 2e 72 69 64 0a T.rev = R.rid.
7220: 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 ."] {.. lappe
7230: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 nd dependencies(
7240: 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64 5d 29 [list rev $rid])
7250: 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 [list sym::tag
7260: 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65 $child]..}..fore
7270: 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 7d 20 ach {rid child}
7280: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 [state run "..
7290: 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 SELECT R.rid,
72a0: 42 2e 62 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 B.bid.. FROM
72b0: 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 62 72 revision R, br
72c0: 61 6e 63 68 20 42 0a 09 20 20 20 20 57 48 45 52 anch B.. WHER
72d0: 45 20 20 52 2e 72 69 64 20 69 6e 20 24 74 68 65 E R.rid in $the
72e0: 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 set.. AND
72f0: 42 2e 72 6f 6f 74 20 3d 20 52 2e 72 69 64 0a 09 B.root = R.rid..
7300: 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e "] {.. lappen
7310: 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b d dependencies([
7320: 6c 69 73 74 20 72 65 76 20 24 72 69 64 5d 29 20 list rev $rid])
7330: 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 [list sym::branc
7340: 68 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 72 65 h $child]..}..re
7350: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 turn. }..
7360: 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 # var(dv) = dict
7370: 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 (item -> list (
7380: 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 item)), item =
7390: 6c 69 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 list (type id).
73a0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 70 72 typemethod pr
73b0: 65 64 65 63 65 73 73 6f 72 73 20 7b 64 76 20 72 edecessors {dv r
73c0: 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 evisions} {..upv
73d0: 61 72 20 31 20 24 64 76 20 64 65 70 65 6e 64 65 ar 1 $dv depende
73e0: 6e 63 69 65 73 0a 09 73 65 74 20 74 68 65 73 65 ncies..set these
73f0: 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 t ('[join $revis
7400: 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 ions {','}]')...
7410: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 # The following
7420: 63 61 73 65 73 20 73 70 65 63 69 66 79 20 77 68 cases specify wh
7430: 65 6e 20 61 20 72 65 76 69 73 69 6f 6e 20 50 20 en a revision P
7440: 69 73 20 61 0a 09 23 20 70 72 65 64 65 63 65 73 is a..# predeces
7450: 73 6f 72 20 6f 66 20 61 20 72 65 76 69 73 69 6f sor of a revisio
7460: 6e 20 52 2e 20 45 61 63 68 20 6f 66 20 74 68 65 n R. Each of the
7470: 20 63 61 73 65 73 20 74 72 61 6e 73 6c 61 74 65 cases translate
7480: 73 0a 09 23 20 69 6e 74 6f 20 6f 6e 65 20 6f 66 s..# into one of
7490: 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 6f 66 the branches of
74a0: 20 74 68 65 20 53 51 4c 20 55 4e 49 4f 4e 20 63 the SQL UNION c
74b0: 6f 6d 69 6e 67 20 62 65 6c 6f 77 2e 0a 09 23 0a oming below...#.
74c0: 09 23 20 28 31 29 20 54 68 65 20 69 6d 6d 65 64 .# (1) The immed
74d0: 69 61 74 65 20 70 61 72 65 6e 74 20 52 2e 70 61 iate parent R.pa
74e0: 72 65 6e 74 20 6f 66 20 52 20 69 73 20 61 20 70 rent of R is a p
74f0: 72 65 64 65 63 65 73 73 6f 72 20 6f 66 0a 09 23 redecessor of..#
7500: 20 20 20 20 20 52 2e 20 4e 4f 54 45 3a 20 54 68 R. NOTE: Th
7510: 69 73 20 69 73 20 74 72 75 65 20 66 6f 72 20 52 is is true for R
7520: 20 65 69 74 68 65 72 20 70 72 69 6d 61 72 79 20 either primary
7530: 6f 72 20 73 65 63 6f 6e 64 61 72 79 0a 09 23 20 or secondary..#
7540: 20 20 20 20 63 68 69 6c 64 20 6f 66 20 50 2e 20 child of P.
7550: 49 74 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 It not necessary
7560: 20 74 6f 20 64 69 73 74 69 6e 67 75 69 73 68 20 to distinguish
7570: 74 68 65 20 74 77 6f 0a 09 23 20 20 20 20 20 63 the two..# c
7580: 61 73 65 73 2c 20 69 6e 20 63 6f 6e 74 72 61 73 ases, in contras
7590: 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 72 65 t to the code re
75a0: 74 72 69 65 76 69 6e 67 20 74 68 65 20 73 75 63 trieving the suc
75b0: 63 65 73 73 6f 72 0a 09 23 20 20 20 20 20 69 6e cessor..# in
75c0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 09 23 0a 09 23 formation...#..#
75d0: 20 28 32 29 20 54 68 65 20 63 6f 6d 70 6c 65 6d (2) The complem
75e0: 65 6e 74 20 6f 66 20 73 75 63 63 65 73 73 6f 72 ent of successor
75f0: 20 63 61 73 65 20 28 33 29 2e 20 54 68 65 20 74 case (3). The t
7600: 72 75 6e 6b 20 72 6f 6f 74 20 69 73 0a 09 23 20 runk root is..#
7610: 20 20 20 20 61 20 70 72 65 64 65 63 65 73 73 6f a predecesso
7620: 72 20 6f 66 20 61 20 4e 54 44 42 20 72 6f 6f 74 r of a NTDB root
7630: 2e 20 52 45 4d 4f 56 45 44 2e 20 53 65 65 20 27 . REMOVED. See '
7640: 73 75 63 63 65 73 73 6f 72 73 27 0a 09 23 20 20 successors'..#
7650: 20 20 20 66 6f 72 20 74 68 65 20 65 78 70 6c 61 for the expla
7660: 6e 61 74 69 6f 6e 2e 0a 09 23 0a 09 23 20 28 33 nation...#..# (3
7670: 29 20 54 68 65 20 63 6f 6d 70 6c 65 6d 65 6e 74 ) The complement
7680: 20 6f 66 20 73 75 63 63 65 73 73 6f 72 20 63 61 of successor ca
7690: 73 65 20 28 34 29 2e 20 54 68 65 20 6c 61 73 74 se (4). The last
76a0: 20 4e 54 44 42 0a 09 23 20 20 20 20 20 72 65 76 NTDB..# rev
76b0: 69 73 69 6f 6e 20 62 65 6c 6f 6e 67 69 6e 67 20 ision belonging
76c0: 74 6f 20 74 68 65 20 74 72 75 6e 6b 20 69 73 20 to the trunk is
76d0: 61 20 70 72 65 64 65 63 65 73 73 6f 72 20 6f 66 a predecessor of
76e0: 20 74 68 65 0a 09 23 20 20 20 20 20 70 72 69 6d the..# prim
76f0: 61 72 79 20 63 68 69 6c 64 20 6f 66 20 74 68 65 ary child of the
7700: 20 74 72 75 6e 6b 20 72 6f 6f 74 20 28 54 68 65 trunk root (The
7710: 20 27 31 2e 32 27 20 72 65 76 69 73 69 6f 6e 29 '1.2' revision)
7720: 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 ....foreach {rid
7730: 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 parent} [state
7740: 72 75 6e 20 22 0a 20 20 20 2d 2d 20 28 31 29 20 run ". -- (1)
7750: 50 72 69 6d 61 72 79 20 70 61 72 65 6e 74 2c 20 Primary parent,
7760: 63 61 6e 20 62 65 20 69 6e 20 64 69 66 66 65 72 can be in differ
7770: 65 6e 74 20 4c 4f 44 20 66 6f 72 20 66 69 72 73 ent LOD for firs
7780: 74 20 69 6e 20 61 20 62 72 61 6e 63 68 0a 09 20 t in a branch..
7790: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c SELECT R.rid,
77a0: 20 52 2e 70 61 72 65 6e 74 0a 09 20 20 20 20 46 R.parent.. F
77b0: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 ROM revision R
77c0: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 .. WHERE R.r
77d0: 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 id IN $theset
77e0: 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 -- Restrict
77f0: 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 to revisions of
7800: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e interest.. AN
7810: 44 20 20 20 20 52 2e 70 61 72 65 6e 74 20 49 53 D R.parent IS
7820: 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d 20 48 NOT NULL -- H
7830: 61 73 20 70 72 69 6d 61 72 79 20 70 61 72 65 6e as primary paren
7840: 74 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 t. UNION.
7850: 2d 2d 20 28 33 29 20 4c 61 73 74 20 4e 54 44 42 -- (3) Last NTDB
7860: 20 6f 6e 20 74 72 75 6e 6b 20 69 73 20 70 72 65 on trunk is pre
7870: 64 65 63 65 73 73 6f 72 20 6f 66 20 63 68 69 6c decessor of chil
7880: 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 0a d of trunk root.
7890: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 . SELECT R.ri
78a0: 64 2c 20 52 41 2e 64 62 70 61 72 65 6e 74 0a 09 d, RA.dbparent..
78b0: 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 FROM revis
78c0: 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 ion R, revision
78d0: 52 41 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 RA.. WHERE R
78e0: 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 20 .rid IN $theset
78f0: 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 -- Restr
7900: 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 ict to revisions
7910: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 of interest..
7920: 20 20 41 4e 44 20 20 20 20 4e 4f 54 20 52 2e 69 AND NOT R.i
7930: 73 64 65 66 61 75 6c 74 20 20 20 20 20 20 20 20 sdefault
7940: 20 20 2d 2d 20 6e 6f 74 20 6f 6e 20 4e 54 44 42 -- not on NTDB
7950: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 70 .. AND R.p
7960: 61 72 65 6e 74 20 49 53 20 4e 4f 54 20 4e 55 4c arent IS NOT NUL
7970: 4c 20 20 20 20 20 2d 2d 20 77 68 69 63 68 20 61 L -- which a
7980: 72 65 20 6e 6f 74 20 72 6f 6f 74 0a 09 20 20 20 re not root..
7990: 20 41 4e 44 20 20 20 20 52 41 2e 72 69 64 20 3d AND RA.rid =
79a0: 20 52 2e 70 61 72 65 6e 74 20 20 20 20 20 20 20 R.parent
79b0: 20 2d 2d 20 67 6f 20 74 6f 20 74 68 65 69 72 20 -- go to their
79c0: 70 61 72 65 6e 74 0a 09 20 20 20 20 41 4e 44 20 parent.. AND
79d0: 20 20 20 52 41 2e 64 62 70 61 72 65 6e 74 20 49 RA.dbparent I
79e0: 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 2d 2d 20 77 S NOT NULL -- w
79f0: 68 69 63 68 20 68 61 73 20 74 6f 20 72 65 66 65 hich has to refe
7a00: 72 20 74 6f 20 4e 54 44 42 27 73 20 72 6f 6f 74 r to NTDB's root
7a10: 0a 09 22 5d 20 7b 0a 09 20 20 20 20 23 20 43 6f .."] {.. # Co
7a20: 6e 73 69 64 65 72 20 6d 6f 76 69 6e 67 20 74 68 nsider moving th
7a30: 69 73 20 74 6f 20 74 68 65 20 69 6e 74 65 67 72 is to the integr
7a40: 69 74 79 20 6d 6f 64 75 6c 65 2e 0a 09 20 20 20 ity module...
7a50: 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 integrity asser
7a60: 74 20 7b 24 72 69 64 20 21 3d 20 24 70 61 72 65 t {$rid != $pare
7a70: 6e 74 7d 20 7b 52 65 76 69 73 69 6f 6e 20 24 72 nt} {Revision $r
7a80: 69 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 74 id depends on it
7a90: 73 65 6c 66 2e 7d 0a 09 20 20 20 20 6c 61 70 70 self.}.. lapp
7aa0: 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 end dependencies
7ab0: 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64 5d ([list rev $rid]
7ac0: 29 20 5b 6c 69 73 74 20 72 65 76 20 24 70 61 72 ) [list rev $par
7ad0: 65 6e 74 5d 0a 09 7d 0a 0a 09 23 20 54 68 65 20 ent]..}...# The
7ae0: 72 65 76 69 73 69 6f 6e 73 20 77 68 69 63 68 20 revisions which
7af0: 61 72 65 20 74 68 65 20 66 69 72 73 74 20 6f 6e are the first on
7b00: 20 61 20 62 72 61 6e 63 68 20 68 61 76 65 20 74 a branch have t
7b10: 68 61 74 0a 09 23 20 62 72 61 6e 63 68 20 61 73 hat..# branch as
7b20: 20 74 68 65 69 72 20 70 72 65 64 65 63 65 73 73 their predecess
7b30: 6f 72 2e 20 4e 6f 74 65 20 74 68 61 74 20 72 65 or. Note that re
7b40: 76 69 73 69 6f 6e 73 20 63 61 6e 6e 6f 74 20 62 visions cannot b
7b50: 65 0a 09 23 20 6f 6e 20 74 61 67 73 20 69 6e 20 e..# on tags in
7b60: 74 68 65 20 73 61 6d 65 20 6d 61 6e 6e 65 72 2c the same manner,
7b70: 20 73 6f 20 74 61 67 73 20 63 61 6e 6e 6f 74 20 so tags cannot
7b80: 62 65 20 70 72 65 64 65 63 65 73 73 6f 72 73 0a be predecessors.
7b90: 09 23 20 6f 66 20 72 65 76 69 73 69 6f 6e 73 2e .# of revisions.
7ba0: 20 54 68 69 73 20 63 6f 6d 70 6c 65 6d 65 6e 74 This complement
7bb0: 73 20 74 68 61 74 20 74 68 65 79 20 68 61 76 65 s that they have
7bc0: 20 6e 6f 20 73 75 63 63 65 73 73 6f 72 73 0a 09 no successors..
7bd0: 23 20 28 53 65 65 20 73 79 6d 3a 3a 74 61 67 2f # (See sym::tag/
7be0: 73 75 63 63 65 73 73 6f 72 73 29 2e 0a 0a 09 66 successors)....f
7bf0: 6f 72 65 61 63 68 20 7b 72 69 64 20 70 61 72 65 oreach {rid pare
7c00: 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 nt} [state run "
7c10: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 .. SELECT R.r
7c20: 69 64 20 42 2e 62 69 64 0a 09 20 20 20 20 46 52 id B.bid.. FR
7c30: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c OM revision R,
7c40: 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20 20 57 branch B.. W
7c50: 48 45 52 45 20 20 52 2e 72 69 64 20 49 4e 20 24 HERE R.rid IN $
7c60: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 theset.. AND
7c70: 20 20 20 42 2e 66 69 72 73 74 20 3d 20 52 2e 72 B.first = R.r
7c80: 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 id.."] {.. la
7c90: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 ppend dependenci
7ca0: 65 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 es([list rev $ri
7cb0: 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 d]) [list sym::b
7cc0: 72 61 6e 63 68 20 24 70 61 72 65 6e 74 5d 0a 09 ranch $parent]..
7cd0: 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a }..return. }.
7ce0: 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 }..# # ## ### ##
7cf0: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 ### ######## ###
7d00: 23 23 23 23 23 23 23 23 23 23 20 23 23 23 23 23 ########## #####
7d10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
7d20: 0a 23 23 20 48 65 6c 70 65 72 20 73 69 6e 67 6c .## Helper singl
7d30: 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20 66 eton. Commands f
7d40: 6f 72 20 74 61 67 20 73 79 6d 62 6f 6c 20 63 68 or tag symbol ch
7d50: 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e 69 74 3a angesets...snit:
7d60: 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 :type ::vc::foss
7d70: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a il::import::cvs:
7d80: 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 73 :project::rev::s
7d90: 79 6d 3a 3a 74 61 67 20 7b 0a 20 20 20 20 74 79 ym::tag {. ty
7da0: 70 65 6d 65 74 68 6f 64 20 62 79 72 65 76 69 73 pemethod byrevis
7db0: 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 ion {} { return
7dc0: 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 0 }. typemeth
7dd0: 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 20 7b 7d od bysymbol {}
7de0: 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 { return 1 }.
7df0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73 74 typemethod ist
7e00: 61 67 20 20 20 20 20 20 7b 7d 20 7b 20 72 65 74 ag {} { ret
7e10: 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 79 70 65 urn 1 }. type
7e20: 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63 68 20 method isbranch
7e30: 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 {} { return 0
7e40: 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f }.. typemetho
7e50: 64 20 73 74 72 20 7b 74 61 67 7d 20 7b 0a 09 73 d str {tag} {..s
7e60: 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 truct::list assi
7e70: 67 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a gn [state run {.
7e80: 09 20 20 20 20 53 45 4c 45 43 54 20 53 2e 6e 61 . SELECT S.na
7e90: 6d 65 2c 20 46 2e 6e 61 6d 65 2c 20 50 2e 6e 61 me, F.name, P.na
7ea0: 6d 65 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 74 me.. FROM t
7eb0: 61 67 20 54 2c 20 73 79 6d 62 6f 6c 20 53 2c 20 ag T, symbol S,
7ec0: 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65 63 74 20 file F, project
7ed0: 50 0a 09 20 20 20 20 57 48 45 52 45 20 20 54 2e P.. WHERE T.
7ee0: 74 69 64 20 3d 20 24 74 61 67 0a 09 20 20 20 20 tid = $tag..
7ef0: 41 4e 44 20 20 20 20 46 2e 66 69 64 20 3d 20 54 AND F.fid = T
7f00: 2e 66 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 .fid.. AND
7f10: 20 50 2e 70 69 64 20 3d 20 46 2e 70 69 64 0a 09 P.pid = F.pid..
7f20: 20 20 20 20 41 4e 44 20 20 20 20 53 2e 73 69 64 AND S.sid
7f30: 20 3d 20 54 2e 73 69 64 0a 09 7d 5d 20 73 6e 61 = T.sid..}] sna
7f40: 6d 65 20 66 6e 61 6d 65 20 70 6e 61 6d 65 0a 09 me fname pname..
7f50: 72 65 74 75 72 6e 20 22 24 70 6e 61 6d 65 2f 54 return "$pname/T
7f60: 27 24 7b 73 6e 61 6d 65 7d 27 3a 3a 24 66 6e 61 '${sname}'::$fna
7f70: 6d 65 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 me". }.. #
7f80: 20 72 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 result = list (
7f90: 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74 69 6d 65 mintime, maxtime
7fa0: 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 ). typemethod
7fb0: 20 74 69 6d 65 72 61 6e 67 65 20 7b 74 61 67 73 timerange {tags
7fc0: 7d 20 7b 0a 09 23 20 54 68 65 20 72 61 6e 67 65 } {..# The range
7fd0: 20 69 73 20 64 65 66 69 6e 65 64 20 61 73 20 74 is defined as t
7fe0: 68 65 20 72 61 6e 67 65 20 6f 66 20 74 68 65 20 he range of the
7ff0: 72 65 76 69 73 69 6f 6e 73 20 74 68 65 20 74 61 revisions the ta
8000: 67 73 0a 09 23 20 61 72 65 20 61 74 74 61 63 68 gs..# are attach
8010: 65 64 20 74 6f 2e 0a 0a 09 73 65 74 20 74 68 65 ed to....set the
8020: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 74 61 67 set ('[join $tag
8030: 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 s {','}]')..retu
8040: 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a rn [state run ".
8050: 09 20 20 20 20 53 45 4c 45 43 54 20 4d 49 4e 28 . SELECT MIN(
8060: 52 2e 64 61 74 65 29 2c 20 4d 41 58 28 52 2e 64 R.date), MAX(R.d
8070: 61 74 65 29 0a 09 20 20 20 20 46 52 4f 4d 20 72 ate).. FROM r
8080: 65 76 69 73 69 6f 6e 20 52 2c 20 74 61 67 20 54 evision R, tag T
8090: 0a 09 20 20 20 20 57 48 45 52 45 20 54 2e 74 69 .. WHERE T.ti
80a0: 64 20 49 4e 20 24 74 68 65 73 65 74 0a 20 20 20 d IN $theset.
80b0: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 52 AND R
80c0: 2e 72 69 64 20 3d 20 54 2e 72 65 76 0a 09 22 5d .rid = T.rev.."]
80d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 . }.. # va
80e0: 72 28 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 r(dv) = dict (it
80f0: 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d em -> list (item
8100: 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 )), item = list
8110: 20 28 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 (type id). t
8120: 79 70 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73 ypemethod succes
8130: 73 6f 72 73 20 7b 64 76 20 74 61 67 73 7d 20 7b sors {dv tags} {
8140: 0a 09 23 20 54 61 67 73 20 68 61 76 65 20 6e 6f ..# Tags have no
8150: 20 73 75 63 63 65 73 73 6f 72 73 2e 0a 09 72 65 successors...re
8160: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 turn. }..
8170: 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 # var(dv) = dict
8180: 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 (item -> list (
8190: 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 item)), item =
81a0: 6c 69 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 list (type id).
81b0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 70 72 typemethod pr
81c0: 65 64 65 63 65 73 73 6f 72 73 20 7b 64 76 20 74 edecessors {dv t
81d0: 61 67 73 7d 20 7b 0a 09 23 20 54 68 65 20 70 72 ags} {..# The pr
81e0: 65 64 65 63 65 73 73 6f 72 73 20 6f 66 20 61 20 edecessors of a
81f0: 74 61 67 20 61 72 65 20 61 6c 6c 20 74 68 65 20 tag are all the
8200: 72 65 76 69 73 69 6f 6e 73 20 74 68 65 20 74 61 revisions the ta
8210: 67 73 20 61 72 65 0a 09 23 20 61 74 74 61 63 68 gs are..# attach
8220: 65 64 20 74 6f 2c 20 61 73 20 77 65 6c 6c 20 61 ed to, as well a
8230: 73 20 61 6c 6c 20 74 68 65 20 62 72 61 6e 63 68 s all the branch
8240: 65 73 20 6f 72 20 74 61 67 73 20 77 68 69 63 68 es or tags which
8250: 20 61 72 65 0a 09 23 20 74 68 65 69 72 20 70 72 are..# their pr
8260: 65 66 65 72 65 64 20 70 61 72 65 6e 74 73 2e 0a efered parents..
8270: 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b ..set theset ('[
8280: 6a 6f 69 6e 20 24 74 61 67 73 20 7b 27 2c 27 7d join $tags {','}
8290: 5d 27 29 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 ]')..foreach {ti
82a0: 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 d parent} [state
82b0: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 run ".. SELE
82c0: 43 54 20 54 2e 74 69 64 2c 20 52 2e 72 69 64 0a CT T.tid, R.rid.
82d0: 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 . FROM revi
82e0: 73 69 6f 6e 20 52 2c 20 74 61 67 20 54 0a 09 20 sion R, tag T..
82f0: 20 20 20 57 48 45 52 45 20 20 54 2e 74 69 64 20 WHERE T.tid
8300: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 IN $theset..
8310: 41 4e 44 20 20 20 20 54 2e 72 65 76 20 3d 20 52 AND T.rev = R
8320: 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 .rid.."] {..
8330: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e lappend dependen
8340: 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a cies([list sym::
8350: 74 61 67 20 24 74 69 64 5d 29 20 5b 6c 69 73 74 tag $tid]) [list
8360: 20 72 65 76 20 24 70 61 72 65 6e 74 5d 0a 09 7d rev $parent]..}
8370: 0a 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 ...foreach {tid
8380: 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 parent} [state r
8390: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 un ".. SELECT
83a0: 20 54 2e 74 69 64 2c 20 42 2e 62 69 64 0a 09 20 T.tid, B.bid..
83b0: 20 20 20 46 52 4f 4d 20 20 20 74 61 67 20 54 2c FROM tag T,
83c0: 20 62 72 61 6e 63 68 20 42 2c 20 70 72 65 66 65 branch B, prefe
83d0: 72 65 64 70 61 72 65 6e 74 20 50 0a 09 20 20 20 redparent P..
83e0: 20 57 48 45 52 45 20 20 54 2e 74 69 64 20 49 4e WHERE T.tid IN
83f0: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e $theset.. AN
8400: 44 20 20 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 D T.sid = P.s
8410: 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50 id.. AND P
8420: 2e 70 69 64 20 3d 20 42 2e 73 69 64 0a 09 22 5d .pid = B.sid.."]
8430: 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 {.. lappend
8440: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 dependencies([li
8450: 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 74 69 64 st sym::tag $tid
8460: 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 ]) [list sym::br
8470: 61 6e 63 68 20 24 70 61 72 65 6e 74 5d 0a 09 7d anch $parent]..}
8480: 0a 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 ...foreach {tid
8490: 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 parent} [state r
84a0: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 un ".. SELECT
84b0: 20 54 2e 74 69 64 2c 20 54 58 2e 74 69 64 0a 09 T.tid, TX.tid..
84c0: 20 20 20 20 46 52 4f 4d 20 20 20 74 61 67 20 54 FROM tag T
84d0: 2c 20 74 61 67 20 54 58 2c 20 70 72 65 66 65 72 , tag TX, prefer
84e0: 65 64 70 61 72 65 6e 74 20 50 0a 09 20 20 20 20 edparent P..
84f0: 57 48 45 52 45 20 20 54 2e 74 69 64 20 49 4e 20 WHERE T.tid IN
8500: 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 $theset.. AND
8510: 20 20 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 69 T.sid = P.si
8520: 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e d.. AND P.
8530: 70 69 64 20 3d 20 54 58 2e 73 69 64 0a 09 22 5d pid = TX.sid.."]
8540: 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 {.. lappend
8550: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 dependencies([li
8560: 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 74 69 64 st sym::tag $tid
8570: 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 ]) [list sym::ta
8580: 67 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 72 g $parent]..}..r
8590: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 7d 0a 0a 23 eturn. }.}..#
85a0: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 # ## ### #####
85b0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
85c0: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 ###### #########
85d0: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 ############.##
85e0: 48 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e Helper singleton
85f0: 2e 20 43 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 62 . Commands for b
8600: 72 61 6e 63 68 20 73 79 6d 62 6f 6c 20 63 68 61 ranch symbol cha
8610: 6e 67 65 73 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a ngesets...snit::
8620: 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 type ::vc::fossi
8630: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a l::import::cvs::
8640: 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 73 79 project::rev::sy
8650: 6d 3a 3a 62 72 61 6e 63 68 20 7b 0a 20 20 20 20 m::branch {.
8660: 74 79 70 65 6d 65 74 68 6f 64 20 62 79 72 65 76 typemethod byrev
8670: 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75 72 ision {} { retur
8680: 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 n 0 }. typeme
8690: 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 20 thod bysymbol
86a0: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a {} { return 1 }.
86b0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 typemethod i
86c0: 73 74 61 67 20 20 20 20 20 20 7b 7d 20 7b 20 72 stag {} { r
86d0: 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 eturn 0 }. ty
86e0: 70 65 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63 pemethod isbranc
86f0: 68 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 h {} { return
8700: 31 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 1 }.. typemet
8710: 68 6f 64 20 73 74 72 20 7b 62 72 61 6e 63 68 7d hod str {branch}
8720: 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 {..struct::list
8730: 20 61 73 73 69 67 6e 20 5b 73 74 61 74 65 20 72 assign [state r
8740: 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 un {.. SELECT
8750: 20 53 2e 6e 61 6d 65 2c 20 46 2e 6e 61 6d 65 2c S.name, F.name,
8760: 20 50 2e 6e 61 6d 65 0a 09 20 20 20 20 46 52 4f P.name.. FRO
8770: 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20 73 79 M branch B, sy
8780: 6d 62 6f 6c 20 53 2c 20 66 69 6c 65 20 46 2c 20 mbol S, file F,
8790: 70 72 6f 6a 65 63 74 20 50 0a 09 20 20 20 20 57 project P.. W
87a0: 48 45 52 45 20 20 42 2e 62 69 64 20 3d 20 24 62 HERE B.bid = $b
87b0: 72 61 6e 63 68 0a 09 20 20 20 20 41 4e 44 20 20 ranch.. AND
87c0: 20 20 46 2e 66 69 64 20 3d 20 42 2e 66 69 64 0a F.fid = B.fid.
87d0: 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69 . AND P.pi
87e0: 64 20 3d 20 46 2e 70 69 64 0a 09 20 20 20 20 41 d = F.pid.. A
87f0: 4e 44 20 20 20 20 53 2e 73 69 64 20 3d 20 42 2e ND S.sid = B.
8800: 73 69 64 0a 09 7d 5d 20 73 6e 61 6d 65 20 66 6e sid..}] sname fn
8810: 61 6d 65 20 70 6e 61 6d 65 0a 09 72 65 74 75 72 ame pname..retur
8820: 6e 20 22 24 70 6e 61 6d 65 2f 42 27 24 7b 73 6e n "$pname/B'${sn
8830: 61 6d 65 7d 27 3a 3a 24 66 6e 61 6d 65 22 0a 20 ame}'::$fname".
8840: 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 }.. # resu
8850: 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69 6e 74 69 lt = list (minti
8860: 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a 20 20 20 me, maxtime).
8870: 20 74 79 70 65 6d 65 74 68 6f 64 20 74 69 6d 65 typemethod time
8880: 72 61 6e 67 65 20 7b 62 72 61 6e 63 68 65 73 7d range {branches}
8890: 20 7b 0a 09 23 20 54 68 65 20 72 61 6e 67 65 20 {..# The range
88a0: 6f 66 20 61 20 62 72 61 6e 63 68 20 69 73 20 64 of a branch is d
88b0: 65 66 69 6e 65 64 20 61 73 20 74 68 65 20 72 61 efined as the ra
88c0: 6e 67 65 20 6f 66 20 74 68 65 0a 09 23 20 72 65 nge of the..# re
88d0: 76 69 73 69 6f 6e 73 20 74 68 65 20 62 72 61 6e visions the bran
88e0: 63 68 65 73 20 61 72 65 20 73 70 61 77 6e 65 64 ches are spawned
88f0: 20 62 79 2e 20 4e 4f 54 45 20 68 6f 77 65 76 65 by. NOTE howeve
8900: 72 20 74 68 61 74 20 74 68 65 0a 09 23 20 62 72 r that the..# br
8910: 61 6e 63 68 65 73 20 61 73 73 6f 63 69 61 74 65 anches associate
8920: 64 20 77 69 74 68 20 61 20 64 65 74 61 63 68 65 d with a detache
8930: 64 20 4e 54 44 42 20 77 69 6c 6c 20 68 61 76 65 d NTDB will have
8940: 20 6e 6f 20 72 6f 6f 74 0a 09 23 20 73 70 61 77 no root..# spaw
8950: 6e 69 6e 67 20 74 68 65 6d 2c 20 68 65 6e 63 65 ning them, hence
8960: 20 74 68 65 79 20 68 61 76 65 20 6e 6f 20 72 65 they have no re
8970: 61 6c 20 74 69 6d 65 72 61 6e 67 65 20 61 6e 79 al timerange any
8980: 0a 09 23 20 6c 6f 6e 67 65 72 2e 20 42 79 20 75 ..# longer. By u
8990: 73 69 6e 67 20 30 20 77 65 20 70 75 74 20 74 68 sing 0 we put th
89a0: 65 6d 20 69 6e 20 66 72 6f 6e 74 20 6f 66 20 65 em in front of e
89b0: 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2c 0a verything else,.
89c0: 09 23 20 61 73 20 74 68 65 79 20 6c 6f 67 69 63 .# as they logic
89d0: 61 6c 6c 79 20 61 72 65 2e 0a 0a 09 73 65 74 20 ally are....set
89e0: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 theset ('[join $
89f0: 62 72 61 6e 63 68 65 73 20 7b 27 2c 27 7d 5d 27 branches {','}]'
8a00: 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61 74 65 )..return [state
8a10: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 run ".. SELE
8a20: 43 54 20 49 46 4e 55 4c 4c 28 4d 49 4e 28 52 2e CT IFNULL(MIN(R.
8a30: 64 61 74 65 29 2c 30 29 2c 20 49 46 4e 55 4c 4c date),0), IFNULL
8a40: 28 4d 41 58 28 52 2e 64 61 74 65 29 2c 30 29 0a (MAX(R.date),0).
8a50: 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 . FROM revisi
8a60: 6f 6e 20 52 2c 20 62 72 61 6e 63 68 20 42 0a 09 on R, branch B..
8a70: 20 20 20 20 57 48 45 52 45 20 42 2e 62 69 64 20 WHERE B.bid
8a80: 49 4e 20 24 74 68 65 73 65 74 0a 20 20 20 20 20 IN $theset.
8a90: 20 20 20 20 20 20 20 41 4e 44 20 20 20 52 2e 72 AND R.r
8aa0: 69 64 20 3d 20 42 2e 72 6f 6f 74 0a 09 22 5d 0a id = B.root.."].
8ab0: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 }.. # var
8ac0: 28 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 (dv) = dict (ite
8ad0: 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 m -> list (item)
8ae0: 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 ), item = list
8af0: 28 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 (type id). ty
8b00: 70 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 pemethod success
8b10: 6f 72 73 20 7b 64 76 20 62 72 61 6e 63 68 65 73 ors {dv branches
8b20: 7d 20 7b 0a 09 23 20 54 68 65 20 66 69 72 73 74 } {..# The first
8b30: 20 72 65 76 69 73 69 6f 6e 20 63 6f 6d 6d 69 74 revision commit
8b40: 74 65 64 20 6f 6e 20 61 20 62 72 61 6e 63 68 2c ted on a branch,
8b50: 20 61 6e 64 20 61 6c 6c 20 62 72 61 6e 63 68 65 and all branche
8b60: 73 0a 09 23 20 61 6e 64 20 74 61 67 73 20 77 68 s..# and tags wh
8b70: 69 63 68 20 68 61 76 65 20 69 74 20 61 73 20 74 ich have it as t
8b80: 68 65 69 72 20 70 72 65 66 65 72 65 64 20 70 61 heir prefered pa
8b90: 72 65 6e 74 20 61 72 65 20 74 68 65 0a 09 23 20 rent are the..#
8ba0: 73 75 63 63 65 73 73 6f 72 73 20 6f 66 20 61 20 successors of a
8bb0: 62 72 61 6e 63 68 2e 0a 0a 09 73 65 74 20 74 68 branch....set th
8bc0: 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 eset ('[join $br
8bd0: 61 6e 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a anches {','}]').
8be0: 09 66 6f 72 65 61 63 68 20 7b 62 69 64 20 63 68 .foreach {bid ch
8bf0: 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 ild} [state run
8c00: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e ".. SELECT B.
8c10: 62 69 64 2c 20 52 2e 72 69 64 0a 09 20 20 20 20 bid, R.rid..
8c20: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 FROM revision
8c30: 52 2c 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20 R, branch B..
8c40: 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e WHERE B.bid IN
8c50: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e $theset.. AN
8c60: 44 20 20 20 20 42 2e 66 69 72 73 74 20 3d 20 52 D B.first = R
8c70: 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 .rid.."] {..
8c80: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e lappend dependen
8c90: 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a cies([list sym::
8ca0: 74 61 67 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 tag $bid]) [list
8cb0: 20 72 65 76 20 24 63 68 69 6c 64 5d 0a 09 7d 0a rev $child]..}.
8cc0: 09 66 6f 72 65 61 63 68 20 7b 62 69 64 20 63 68 .foreach {bid ch
8cd0: 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 ild} [state run
8ce0: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e ".. SELECT B.
8cf0: 62 69 64 2c 20 42 58 2e 62 69 64 0a 09 20 20 20 bid, BX.bid..
8d00: 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 FROM branch B
8d10: 2c 20 62 72 61 6e 63 68 20 42 58 2c 20 70 72 65 , branch BX, pre
8d20: 66 65 72 65 64 70 61 72 65 6e 74 20 50 0a 09 20 feredparent P..
8d30: 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 WHERE B.bid
8d40: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 IN $theset..
8d50: 41 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50 AND B.sid = P
8d60: 2e 70 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 .pid.. AND
8d70: 20 42 58 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a BX.sid = P.sid.
8d80: 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 ."] {.. lappe
8d90: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 nd dependencies(
8da0: 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 [list sym::tag $
8db0: 62 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a bid]) [list sym:
8dc0: 3a 62 72 61 6e 63 68 20 24 63 68 69 6c 64 5d 0a :branch $child].
8dd0: 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64 .}..foreach {bid
8de0: 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 child} [state r
8df0: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 un ".. SELECT
8e00: 20 42 2e 62 69 64 2c 20 54 2e 74 69 64 0a 09 20 B.bid, T.tid..
8e10: 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 FROM branch
8e20: 20 42 2c 20 74 61 67 20 54 2c 20 70 72 65 66 65 B, tag T, prefe
8e30: 72 65 64 70 61 72 65 6e 74 20 50 0a 09 20 20 20 redparent P..
8e40: 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e WHERE B.bid IN
8e50: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e $theset.. AN
8e60: 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50 2e 70 D B.sid = P.p
8e70: 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 54 id.. AND T
8e80: 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a 09 22 5d .sid = P.sid.."]
8e90: 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 {.. lappend
8ea0: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 dependencies([li
8eb0: 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 62 69 64 st sym::tag $bid
8ec0: 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 ]) [list sym::ta
8ed0: 67 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 72 65 g $child]..}..re
8ee0: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 turn. }..
8ef0: 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 # var(dv) = dict
8f00: 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 (item -> list (
8f10: 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 item)), item =
8f20: 6c 69 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 list (type id).
8f30: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 70 72 typemethod pr
8f40: 65 64 65 63 65 73 73 6f 72 73 20 7b 64 76 20 62 edecessors {dv b
8f50: 72 61 6e 63 68 65 73 7d 20 7b 0a 09 23 20 54 68 ranches} {..# Th
8f60: 65 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 6f e predecessors o
8f70: 66 20 61 20 62 72 61 6e 63 68 20 61 72 65 20 61 f a branch are a
8f80: 6c 6c 20 74 68 65 20 72 65 76 69 73 69 6f 6e 73 ll the revisions
8f90: 20 74 68 65 0a 09 23 20 62 72 61 6e 63 68 65 73 the..# branches
8fa0: 20 61 72 65 20 73 70 61 77 6e 65 64 20 66 72 6f are spawned fro
8fb0: 6d 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 61 6c m, as well as al
8fc0: 6c 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 6f l the branches o
8fd0: 72 0a 09 23 20 74 61 67 73 20 77 68 69 63 68 20 r..# tags which
8fe0: 61 72 65 20 74 68 65 69 72 20 70 72 65 66 65 72 are their prefer
8ff0: 65 64 20 70 61 72 65 6e 74 73 2e 0a 0a 09 73 65 ed parents....se
9000: 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e t theset ('[join
9010: 20 24 74 61 67 73 20 7b 27 2c 27 7d 5d 27 29 0a $tags {','}]').
9020: 09 66 6f 72 65 61 63 68 20 7b 62 69 64 20 70 61 .foreach {bid pa
9030: 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e rent} [state run
9040: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 ".. SELECT B
9050: 2e 42 69 64 2c 20 52 2e 72 69 64 0a 09 20 20 20 .Bid, R.rid..
9060: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e FROM revision
9070: 20 52 2c 20 62 72 61 6e 63 68 20 42 0a 09 20 20 R, branch B..
9080: 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 WHERE B.bid I
9090: 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 N $theset.. A
90a0: 4e 44 20 20 20 20 42 2e 72 6f 6f 74 20 3d 20 52 ND B.root = R
90b0: 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 .rid.."] {..
90c0: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e lappend dependen
90d0: 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a cies([list sym::
90e0: 62 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c branch $bid]) [l
90f0: 69 73 74 20 72 65 76 20 24 70 61 72 65 6e 74 5d ist rev $parent]
9100: 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 ..}..foreach {bi
9110: 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 d parent} [state
9120: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 run ".. SELE
9130: 43 54 20 42 2e 62 69 64 2c 20 42 58 2e 62 69 64 CT B.bid, BX.bid
9140: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 .. FROM bra
9150: 6e 63 68 20 42 2c 20 62 72 61 6e 63 68 20 42 58 nch B, branch BX
9160: 2c 20 70 72 65 66 65 72 65 64 70 61 72 65 6e 74 , preferedparent
9170: 20 50 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 P.. WHERE B
9180: 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a .bid IN $theset.
9190: 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 73 69 . AND B.si
91a0: 64 20 3d 20 50 2e 73 69 64 0a 09 20 20 20 20 41 d = P.sid.. A
91b0: 4e 44 20 20 20 20 50 2e 70 69 64 20 3d 20 42 58 ND P.pid = BX
91c0: 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 .sid.."] {..
91d0: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e lappend dependen
91e0: 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a cies([list sym::
91f0: 62 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c branch $bid]) [l
9200: 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 ist sym::branch
9210: 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 66 6f 72 $parent]..}..for
9220: 65 61 63 68 20 7b 62 69 64 20 70 61 72 65 6e 74 each {bid parent
9230: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 } [state run "..
9240: 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62 69 64 SELECT B.bid
9250: 2c 20 54 2e 74 69 64 0a 09 20 20 20 20 46 52 4f , T.tid.. FRO
9260: 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20 74 61 M branch B, ta
9270: 67 20 54 2c 20 70 72 65 66 65 72 65 64 70 61 72 g T, preferedpar
9280: 65 6e 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 ent P.. WHERE
9290: 20 20 42 2e 74 69 64 20 49 4e 20 24 74 68 65 73 B.tid IN $thes
92a0: 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 et.. AND B
92b0: 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a 09 20 20 .sid = P.sid..
92c0: 20 20 41 4e 44 20 20 20 20 50 2e 70 69 64 20 3d AND P.pid =
92d0: 20 54 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20 T.sid.."] {..
92e0: 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 lappend depend
92f0: 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d encies([list sym
9300: 3a 3a 62 72 61 6e 63 68 20 24 62 69 64 5d 29 20 ::branch $bid])
9310: 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 [list sym::tag $
9320: 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 72 65 74 75 parent]..}..retu
9330: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 rn. }.. #
9340: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 # ## ### ##### #
9350: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 ####### ########
9360: 23 23 23 23 23 0a 20 20 20 20 23 23 20 43 6f 6e #####. ## Con
9370: 66 69 67 75 72 61 74 69 6f 6e 0a 0a 20 20 20 20 figuration..
9380: 70 72 61 67 6d 61 20 2d 68 61 73 69 6e 73 74 61 pragma -hasinsta
9390: 6e 63 65 73 20 20 20 6e 6f 20 3b 20 23 20 73 69 nces no ; # si
93a0: 6e 67 6c 65 74 6f 6e 0a 20 20 20 20 70 72 61 67 ngleton. prag
93b0: 6d 61 20 2d 68 61 73 74 79 70 65 69 6e 66 6f 20 ma -hastypeinfo
93c0: 20 20 20 6e 6f 20 3b 20 23 20 6e 6f 20 69 6e 74 no ; # no int
93d0: 72 6f 73 70 65 63 74 69 6f 6e 0a 20 20 20 20 70 rospection. p
93e0: 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65 64 65 ragma -hastypede
93f0: 73 74 72 6f 79 20 6e 6f 20 3b 20 23 20 69 6d 6d stroy no ; # imm
9400: 6f 72 74 61 6c 0a 7d 0a 0a 23 20 23 20 23 23 20 ortal.}..# # ##
9410: 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 ### ##### ######
9420: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 ## #############
9430: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ###############
9440: 23 23 23 23 23 23 0a 23 23 0a 0a 6e 61 6d 65 73 ######.##..names
9450: 70 61 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a pace eval ::vc::
9460: 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a fossil::import::
9470: 63 76 73 3a 3a 70 72 6f 6a 65 63 74 20 7b 0a 20 cvs::project {.
9480: 20 20 20 6e 61 6d 65 73 70 61 63 65 20 65 78 70 namespace exp
9490: 6f 72 74 20 72 65 76 0a 20 20 20 20 6e 61 6d 65 ort rev. name
94a0: 73 70 61 63 65 20 65 76 61 6c 20 72 65 76 20 7b space eval rev {
94b0: 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f ..namespace impo
94c0: 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a rt ::vc::fossil:
94d0: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 :import::cvs::st
94e0: 61 74 65 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 ate..namespace i
94f0: 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 mport ::vc::foss
9500: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a il::import::cvs:
9510: 3a 69 6e 74 65 67 72 69 74 79 0a 09 6e 61 6d 65 :integrity..name
9520: 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 space import ::v
9530: 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69 73 63 3a 3a c::tools::misc::
9540: 2a 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 *..namespace imp
9550: 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a ort ::vc::tools:
9560: 3a 74 72 6f 75 62 6c 65 0a 09 6e 61 6d 65 73 70 :trouble..namesp
9570: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a ace import ::vc:
9580: 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 6c 6f 67 :tools::log..log
9590: 20 72 65 67 69 73 74 65 72 20 63 73 65 74 73 0a register csets.
95a0: 0a 09 23 20 53 65 74 20 75 70 20 74 68 65 20 68 ..# Set up the h
95b0: 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 73 elper singletons
95c0: 0a 09 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c ..namespace eval
95d0: 20 72 65 76 20 7b 0a 09 20 20 20 20 6e 61 6d 65 rev {.. name
95e0: 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 space import ::v
95f0: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 c::fossil::impor
9600: 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09 20 t::cvs::state..
9610: 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 namespace imp
9620: 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c ort ::vc::fossil
9630: 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 ::import::cvs::i
9640: 6e 74 65 67 72 69 74 79 0a 09 7d 0a 09 6e 61 6d ntegrity..}..nam
9650: 65 73 70 61 63 65 20 65 76 61 6c 20 73 79 6d 3a espace eval sym:
9660: 3a 74 61 67 20 7b 0a 09 20 20 20 20 6e 61 6d 65 :tag {.. name
9670: 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 space import ::v
9680: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 c::fossil::impor
9690: 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09 20 t::cvs::state..
96a0: 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 namespace imp
96b0: 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c ort ::vc::fossil
96c0: 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 ::import::cvs::i
96d0: 6e 74 65 67 72 69 74 79 0a 09 7d 0a 09 6e 61 6d ntegrity..}..nam
96e0: 65 73 70 61 63 65 20 65 76 61 6c 20 73 79 6d 3a espace eval sym:
96f0: 3a 62 72 61 6e 63 68 20 7b 0a 09 20 20 20 20 6e :branch {.. n
9700: 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 amespace import
9710: 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d ::vc::fossil::im
9720: 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 port::cvs::state
9730: 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 .. namespace
9740: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 import ::vc::fos
9750: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 sil::import::cvs
9760: 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a 20 ::integrity..}.
9770: 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 }.}..# # ## #
9780: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 ## ##### #######
9790: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 # #############
97a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
97b0: 23 23 23 23 23 0a 23 23 20 52 65 61 64 79 0a 0a #####.## Ready..
97c0: 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20 package provide
97d0: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f vc::fossil::impo
97e0: 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 rt::cvs::project
97f0: 3a 3a 72 65 76 20 31 2e 30 0a 72 65 74 75 72 6e ::rev 1.0.return
9800: 0a .