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 5b 6c 72 61 6e 67 65 20 24 6d 79 69 74 65 6d [lrange $myitem
2520: 73 20 30 20 24 66 69 72 73 74 65 5d 0a 09 66 6f s 0 $firste]..fo
2530: 72 65 61 63 68 20 69 69 64 20 24 6d 79 69 74 65 reach iid $myite
2540: 6d 73 20 7b 0a 09 20 20 20 20 73 65 74 20 6b 65 ms {.. set ke
2550: 79 20 5b 6c 69 73 74 20 24 6d 79 74 79 70 65 20 y [list $mytype
2560: 24 69 69 64 5d 0a 09 20 20 20 20 73 65 74 20 6d $iid].. set m
2570: 79 69 74 65 6d 6d 61 70 28 24 6b 65 79 29 20 24 yitemmap($key) $
2580: 73 65 6c 66 0a 09 20 20 20 20 6c 6f 67 20 77 72 self.. log wr
2590: 69 74 65 20 38 20 63 73 65 74 73 20 7b 4d 41 50 ite 8 csets {MAP
25a0: 2b 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73 + item <$key> $s
25b0: 65 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 elf = [$self str
25c0: 5d 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 20 31 ]}..}...return 1
25d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 . }.. meth
25e0: 6f 64 20 70 65 72 73 69 73 74 20 7b 7d 20 7b 0a od persist {} {.
25f0: 09 73 65 74 20 74 69 64 20 24 6d 79 63 73 74 79 .set tid $mycsty
2600: 70 65 28 24 6d 79 74 79 70 65 29 0a 09 73 65 74 pe($mytype)..set
2610: 20 70 69 64 20 5b 24 6d 79 70 72 6f 6a 65 63 74 pid [$myproject
2620: 20 69 64 5d 0a 09 73 65 74 20 70 6f 73 20 30 0a id]..set pos 0.
2630: 0a 09 73 74 61 74 65 20 74 72 61 6e 73 61 63 74 ..state transact
2640: 69 6f 6e 20 7b 0a 09 20 20 20 20 73 74 61 74 65 ion {.. state
2650: 20 72 75 6e 20 7b 0a 09 09 49 4e 53 45 52 54 20 run {...INSERT
2660: 49 4e 54 4f 20 63 68 61 6e 67 65 73 65 74 20 28 INTO changeset (
2670: 63 69 64 2c 20 20 20 70 69 64 2c 20 20 74 79 70 cid, pid, typ
2680: 65 2c 20 73 72 63 29 0a 09 09 56 41 4c 55 45 53 e, src)...VALUES
2690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
26a0: 28 24 6d 79 69 64 2c 20 24 70 69 64 2c 20 24 74 ($myid, $pid, $t
26b0: 69 64 2c 20 24 6d 79 73 72 63 69 64 29 3b 0a 09 id, $mysrcid);..
26c0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 66 6f 72 65 }... fore
26d0: 61 63 68 20 69 69 64 20 24 6d 79 69 74 65 6d 73 ach iid $myitems
26e0: 20 7b 0a 09 09 73 74 61 74 65 20 72 75 6e 20 7b {...state run {
26f0: 0a 09 09 20 20 20 20 49 4e 53 45 52 54 20 49 4e ... INSERT IN
2700: 54 4f 20 63 73 69 74 65 6d 20 28 63 69 64 2c 20 TO csitem (cid,
2710: 20 20 70 6f 73 2c 20 20 69 69 64 29 0a 09 09 20 pos, iid)...
2720: 20 20 20 56 41 4c 55 45 53 20 20 20 20 20 20 20 VALUES
2730: 20 20 20 20 20 20 28 24 6d 79 69 64 2c 20 24 70 ($myid, $p
2740: 6f 73 2c 20 24 69 69 64 29 3b 0a 09 09 7d 0a 09 os, $iid);...}..
2750: 09 69 6e 63 72 20 70 6f 73 0a 09 20 20 20 20 7d .incr pos.. }
2760: 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 ..}..return.
2770: 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 74 69 }.. method ti
2780: 6d 65 72 61 6e 67 65 20 7b 7d 20 7b 20 72 65 74 merange {} { ret
2790: 75 72 6e 20 5b 24 6d 79 74 79 70 65 6f 62 6a 20 urn [$mytypeobj
27a0: 74 69 6d 65 72 61 6e 67 65 20 24 6d 79 69 74 65 timerange $myite
27b0: 6d 73 5d 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f ms] }.. metho
27c0: 64 20 64 72 6f 70 20 7b 7d 20 7b 0a 09 6c 6f 67 d drop {} {..log
27d0: 20 77 72 69 74 65 20 38 20 63 73 65 74 73 20 7b write 8 csets {
27e0: 44 72 6f 70 70 69 6e 67 20 24 73 65 6c 66 20 3d Dropping $self =
27f0: 20 5b 24 73 65 6c 66 20 73 74 72 5d 7d 0a 0a 09 [$self str]}...
2800: 73 74 61 74 65 20 74 72 61 6e 73 61 63 74 69 6f state transactio
2810: 6e 20 7b 0a 09 20 20 20 20 73 74 61 74 65 20 72 n {.. state r
2820: 75 6e 20 7b 0a 09 09 44 45 4c 45 54 45 20 46 52 un {...DELETE FR
2830: 4f 4d 20 63 68 61 6e 67 65 73 65 74 20 57 48 45 OM changeset WHE
2840: 52 45 20 63 69 64 20 3d 20 24 6d 79 69 64 3b 0a RE cid = $myid;.
2850: 09 09 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 73 ..DELETE FROM cs
2860: 69 74 65 6d 20 20 20 20 57 48 45 52 45 20 63 69 item WHERE ci
2870: 64 20 3d 20 24 6d 79 69 64 3b 0a 09 20 20 20 20 d = $myid;..
2880: 7d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 69 69 }..}..foreach ii
2890: 64 20 24 6d 79 69 74 65 6d 73 20 7b 0a 09 20 20 d $myitems {..
28a0: 20 20 73 65 74 20 6b 65 79 20 5b 6c 69 73 74 20 set key [list
28b0: 24 6d 79 74 79 70 65 20 24 69 69 64 5d 0a 09 20 $mytype $iid]..
28c0: 20 20 20 75 6e 73 65 74 20 6d 79 69 74 65 6d 6d unset myitemm
28d0: 61 70 28 24 6b 65 79 29 0a 09 20 20 20 20 6c 6f ap($key).. lo
28e0: 67 20 77 72 69 74 65 20 38 20 63 73 65 74 73 20 g write 8 csets
28f0: 7b 4d 41 50 2d 20 69 74 65 6d 20 3c 24 6b 65 79 {MAP- item <$key
2900: 3e 20 24 73 65 6c 66 20 3d 20 5b 24 73 65 6c 66 > $self = [$self
2910: 20 73 74 72 5d 7d 0a 09 7d 0a 09 73 65 74 20 70 str]}..}..set p
2920: 6f 73 20 20 20 20 20 20 20 20 20 20 5b 6c 73 65 os [lse
2930: 61 72 63 68 20 2d 65 78 61 63 74 20 24 6d 79 63 arch -exact $myc
2940: 68 61 6e 67 65 73 65 74 73 20 24 73 65 6c 66 5d hangesets $self]
2950: 0a 09 73 65 74 20 6d 79 63 68 61 6e 67 65 73 65 ..set mychangese
2960: 74 73 20 5b 6c 72 65 70 6c 61 63 65 20 24 6d 79 ts [lreplace $my
2970: 63 68 61 6e 67 65 73 65 74 73 20 24 70 6f 73 20 changesets $pos
2980: 24 70 6f 73 5d 0a 09 72 65 74 75 72 6e 0a 20 20 $pos]..return.
2990: 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 }.. method
29a0: 73 65 6c 66 72 65 66 65 72 65 6e 74 69 61 6c 20 selfreferential
29b0: 7b 7d 20 7b 0a 09 6c 6f 67 20 77 72 69 74 65 20 {} {..log write
29c0: 39 20 63 73 65 74 73 20 7b 43 68 65 63 6b 69 6e 9 csets {Checkin
29d0: 67 20 5b 24 73 65 6c 66 20 73 74 72 5d 20 2f 5b g [$self str] /[
29e0: 6c 6c 65 6e 67 74 68 20 24 6d 79 69 74 65 6d 73 llength $myitems
29f0: 5d 7d 0a 0a 09 69 66 20 7b 21 5b 73 74 72 75 63 ]}...if {![struc
2a00: 74 3a 3a 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 t::set contains
2a10: 5b 24 73 65 6c 66 20 73 75 63 63 65 73 73 6f 72 [$self successor
2a20: 73 5d 20 24 73 65 6c 66 5d 7d 20 7b 0a 09 20 20 s] $self]} {..
2a30: 20 20 72 65 74 75 72 6e 20 30 0a 09 7d 0a 09 69 return 0..}..i
2a40: 66 20 7b 5b 6c 6f 67 20 76 65 72 62 6f 73 69 74 f {[log verbosit
2a50: 79 3f 5d 20 3c 20 38 7d 20 7b 20 72 65 74 75 72 y?] < 8} { retur
2a60: 6e 20 31 20 7d 0a 0a 09 23 20 50 72 69 6e 74 20 n 1 }...# Print
2a70: 74 68 65 20 64 65 74 61 69 6c 65 64 20 73 75 63 the detailed suc
2a80: 63 65 73 73 6f 72 20 73 74 72 75 63 74 75 72 65 cessor structure
2a90: 20 6f 66 20 74 68 65 20 73 65 6c 66 2d 0a 09 23 of the self-..#
2aa0: 20 72 65 66 65 72 65 6e 74 69 61 6c 20 63 68 61 referential cha
2ab0: 6e 67 65 73 65 74 2c 20 69 66 20 74 68 65 20 76 ngeset, if the v
2ac0: 65 72 62 6f 73 69 74 79 20 6f 66 20 74 68 65 20 erbosity of the
2ad0: 6c 6f 67 20 69 73 20 64 69 61 6c 65 64 0a 09 23 log is dialed..#
2ae0: 20 68 69 67 68 20 65 6e 6f 75 67 68 2e 0a 0a 09 high enough....
2af0: 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73 65 74 log write 8 cset
2b00: 73 20 5b 73 65 74 20 68 64 72 20 7b 53 65 6c 66 s [set hdr {Self
2b10: 2d 72 65 66 65 72 65 6e 74 69 61 6c 20 63 68 61 -referential cha
2b20: 6e 67 65 73 65 74 20 5b 24 73 65 6c 66 20 73 74 ngeset [$self st
2b30: 72 5d 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f r] _____________
2b40: 5f 5f 5f 5f 5f 7d 5d 0a 09 61 72 72 61 79 20 73 _____}]..array s
2b50: 65 74 20 6e 6d 61 70 20 5b 24 73 65 6c 66 20 6e et nmap [$self n
2b60: 65 78 74 6d 61 70 5d 0a 09 66 6f 72 65 61 63 68 extmap]..foreach
2b70: 20 69 74 65 6d 20 5b 6c 73 6f 72 74 20 2d 64 69 item [lsort -di
2b80: 63 74 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 ct [array names
2b90: 6e 6d 61 70 5d 5d 20 7b 0a 09 20 20 20 20 66 6f nmap]] {.. fo
2ba0: 72 65 61 63 68 20 73 75 63 63 69 74 65 6d 20 24 reach succitem $
2bb0: 6e 6d 61 70 28 24 69 74 65 6d 29 20 7b 0a 09 09 nmap($item) {...
2bc0: 73 65 74 20 73 75 63 63 63 73 20 24 6d 79 69 74 set succcs $myit
2bd0: 65 6d 6d 61 70 28 24 73 75 63 63 69 74 65 6d 29 emmap($succitem)
2be0: 0a 09 09 73 65 74 20 68 69 6e 74 20 5b 65 78 70 ...set hint [exp
2bf0: 72 20 7b 28 24 73 75 63 63 63 73 20 65 71 20 24 r {($succcs eq $
2c00: 73 65 6c 66 29 0a 09 09 09 09 3f 20 22 4c 4f 4f self).....? "LOO
2c10: 50 22 0a 09 09 09 09 3a 20 22 20 20 20 20 22 7d P".....: " "}
2c20: 5d 0a 09 09 73 65 74 20 69 20 20 20 22 3c 24 69 ]...set i "<$i
2c30: 74 65 6d 20 5b 24 74 79 70 65 20 69 74 65 6d 73 tem [$type items
2c40: 74 72 20 24 69 74 65 6d 5d 3e 22 0a 09 09 73 65 tr $item]>"...se
2c50: 74 20 73 20 20 20 22 3c 24 73 75 63 63 69 74 65 t s "<$succite
2c60: 6d 20 5b 24 74 79 70 65 20 69 74 65 6d 73 74 72 m [$type itemstr
2c70: 20 24 73 75 63 63 69 74 65 6d 5d 3e 22 0a 09 09 $succitem]>"...
2c80: 73 65 74 20 73 63 73 20 5b 24 73 75 63 63 63 73 set scs [$succcs
2c90: 20 73 74 72 5d 0a 09 09 6c 6f 67 20 77 72 69 74 str]...log writ
2ca0: 65 20 38 20 63 73 65 74 73 20 7b 24 68 69 6e 74 e 8 csets {$hint
2cb0: 20 2a 20 24 69 20 2d 2d 3e 20 24 73 20 2d 2d 3e * $i --> $s -->
2cc0: 20 63 73 20 24 73 63 73 7d 0a 09 20 20 20 20 7d cs $scs}.. }
2cd0: 0a 09 7d 0a 09 6c 6f 67 20 77 72 69 74 65 20 38 ..}..log write 8
2ce0: 20 63 73 65 74 73 20 5b 72 65 67 73 75 62 20 2d csets [regsub -
2cf0: 61 6c 6c 20 7b 5b 5e 20 09 5d 7d 20 24 68 64 72 all {[^ .]} $hdr
2d00: 20 7b 5f 7d 5d 0a 09 72 65 74 75 72 6e 20 31 0a {_}]..return 1.
2d10: 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d }.. typem
2d20: 65 74 68 6f 64 20 73 70 6c 69 74 20 7b 63 73 65 ethod split {cse
2d30: 74 20 61 72 67 73 7d 20 7b 0a 09 23 20 41 73 20 t args} {..# As
2d40: 70 61 72 74 20 6f 66 20 74 68 65 20 63 72 65 61 part of the crea
2d50: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 tion of the new
2d60: 63 68 61 6e 67 65 73 65 74 73 20 73 70 65 63 69 changesets speci
2d70: 66 69 65 64 20 69 6e 0a 09 23 20 41 52 47 53 20 fied in..# ARGS
2d80: 61 73 20 73 65 74 73 20 6f 66 20 69 74 65 6d 73 as sets of items
2d90: 2c 20 61 6c 6c 20 73 75 62 73 65 74 73 20 6f 66 , all subsets of
2da0: 20 43 53 45 54 27 73 20 69 74 65 6d 20 73 65 74 CSET's item set
2db0: 2c 20 43 53 45 54 0a 09 23 20 77 69 6c 6c 20 62 , CSET..# will b
2dc0: 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 61 e dropped from a
2dd0: 6c 6c 20 64 61 74 61 62 61 73 65 73 2c 20 69 6e ll databases, in
2de0: 20 61 6e 64 20 6f 75 74 20 6f 66 20 6d 65 6d 6f and out of memo
2df0: 72 79 2c 0a 09 23 20 61 6e 64 20 74 68 65 6e 20 ry,..# and then
2e00: 64 65 73 74 72 6f 79 65 64 2e 0a 09 23 0a 09 23 destroyed...#..#
2e10: 20 4e 6f 74 65 3a 20 54 68 65 20 69 74 65 6d 20 Note: The item
2e20: 6c 69 73 74 73 20 66 6f 75 6e 64 20 69 6e 20 61 lists found in a
2e30: 72 67 73 20 61 72 65 20 74 61 67 67 65 64 20 69 rgs are tagged i
2e40: 74 65 6d 73 2e 20 54 68 65 79 0a 09 23 20 68 61 tems. They..# ha
2e50: 76 65 20 74 6f 20 68 61 76 65 20 74 68 65 20 73 ve to have the s
2e60: 61 6d 65 20 74 79 70 65 20 61 73 20 74 68 65 20 ame type as the
2e70: 63 68 61 6e 67 65 73 65 74 2c 20 62 65 69 6e 67 changeset, being
2e80: 20 73 75 62 73 65 74 73 0a 09 23 20 6f 66 20 69 subsets..# of i
2e90: 74 73 20 69 74 65 6d 73 2e 20 54 68 69 73 20 69 ts items. This i
2ea0: 73 20 63 68 65 63 6b 65 64 20 69 6e 20 55 6e 74 s checked in Unt
2eb0: 61 67 31 2e 0a 0a 09 23 20 43 6f 6e 73 74 72 61 ag1....# Constra
2ec0: 69 6e 74 73 3a 20 4e 6f 20 66 72 61 67 6d 65 6e ints: No fragmen
2ed0: 74 20 6d 75 73 74 20 62 65 20 65 6d 70 74 79 2e t must be empty.
2ee0: 20 41 6c 6c 20 66 72 61 67 6d 65 6e 74 73 20 68 All fragments h
2ef0: 61 76 65 0a 09 23 20 74 6f 20 62 65 20 73 75 62 ave..# to be sub
2f00: 73 65 74 73 20 6f 66 20 74 68 65 20 63 73 65 74 sets of the cset
2f10: 2e 20 54 68 65 20 75 6e 69 6f 6e 20 68 61 73 20 . The union has
2f20: 74 6f 20 63 6f 76 65 72 20 74 68 65 0a 09 23 20 to cover the..#
2f30: 6f 72 69 67 69 6e 61 6c 2e 20 41 6c 6c 20 70 61 original. All pa
2f40: 69 72 77 69 73 65 20 69 6e 74 65 72 73 65 63 74 irwise intersect
2f50: 69 6f 6e 73 20 68 61 76 65 20 74 6f 20 62 65 20 ions have to be
2f60: 65 6d 70 74 79 2e 0a 0a 09 6c 6f 67 20 77 72 69 empty....log wri
2f70: 74 65 20 38 20 63 73 65 74 73 20 7b 4f 4c 44 3a te 8 csets {OLD:
2f80: 20 5b 6c 73 6f 72 74 20 5b 24 63 73 65 74 20 69 [lsort [$cset i
2f90: 74 65 6d 73 5d 5d 7d 0a 0a 09 73 65 74 20 63 6f tems]]}...set co
2fa0: 76 65 72 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 ver {}..foreach
2fb0: 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 20 24 61 fragmentitems $a
2fc0: 72 67 73 20 7b 0a 09 20 20 20 20 6c 6f 67 20 77 rgs {.. log w
2fd0: 72 69 74 65 20 38 20 63 73 65 74 73 20 7b 4e 45 rite 8 csets {NE
2fe0: 57 3a 20 5b 6c 73 6f 72 74 20 24 66 72 61 67 6d W: [lsort $fragm
2ff0: 65 6e 74 69 74 65 6d 73 5d 7d 0a 0a 09 20 20 20 entitems]}...
3000: 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 integrity asser
3010: 74 20 7b 0a 09 09 21 5b 73 74 72 75 63 74 3a 3a t {...![struct::
3020: 73 65 74 20 65 6d 70 74 79 20 24 66 72 61 67 6d set empty $fragm
3030: 65 6e 74 69 74 65 6d 73 5d 0a 09 20 20 20 20 7d entitems].. }
3040: 20 7b 63 68 61 6e 67 65 73 65 74 20 66 72 61 67 {changeset frag
3050: 6d 65 6e 74 20 69 73 20 65 6d 70 74 79 7d 0a 09 ment is empty}..
3060: 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 integrity as
3070: 73 65 72 74 20 7b 0a 09 09 5b 73 74 72 75 63 74 sert {...[struct
3080: 3a 3a 73 65 74 20 73 75 62 73 65 74 6f 66 20 24 ::set subsetof $
3090: 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 20 5b 24 fragmentitems [$
30a0: 63 73 65 74 20 69 74 65 6d 73 5d 5d 0a 09 20 20 cset items]]..
30b0: 20 20 7d 20 7b 63 68 61 6e 67 65 73 65 74 20 66 } {changeset f
30c0: 72 61 67 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61 ragment is not a
30d0: 20 73 75 62 73 65 74 7d 0a 09 20 20 20 20 73 74 subset}.. st
30e0: 72 75 63 74 3a 3a 73 65 74 20 61 64 64 20 63 6f ruct::set add co
30f0: 76 65 72 20 24 66 72 61 67 6d 65 6e 74 69 74 65 ver $fragmentite
3100: 6d 73 0a 09 7d 0a 09 69 6e 74 65 67 72 69 74 79 ms..}..integrity
3110: 20 61 73 73 65 72 74 20 7b 0a 09 20 20 20 20 5b assert {.. [
3120: 73 74 72 75 63 74 3a 3a 73 65 74 20 65 71 75 61 struct::set equa
3130: 6c 20 24 63 6f 76 65 72 20 5b 24 63 73 65 74 20 l $cover [$cset
3140: 69 74 65 6d 73 5d 5d 0a 09 20 7d 20 7b 54 68 65 items]].. } {The
3150: 20 66 72 61 67 6d 65 6e 74 73 20 64 6f 20 6e 6f fragments do no
3160: 74 20 63 6f 76 65 72 20 74 68 65 20 6f 72 69 67 t cover the orig
3170: 69 6e 61 6c 20 63 68 61 6e 67 65 73 65 74 7d 0a inal changeset}.
3180: 09 73 65 74 20 69 20 31 0a 09 66 6f 72 65 61 63 .set i 1..foreac
3190: 68 20 66 69 61 20 24 61 72 67 73 20 7b 0a 09 20 h fia $args {..
31a0: 20 20 20 66 6f 72 65 61 63 68 20 66 69 62 20 5b foreach fib [
31b0: 6c 72 61 6e 67 65 20 24 61 72 67 73 20 24 69 20 lrange $args $i
31c0: 65 6e 64 5d 20 7b 0a 09 09 69 6e 74 65 67 72 69 end] {...integri
31d0: 74 79 20 61 73 73 65 72 74 20 7b 0a 09 09 20 20 ty assert {...
31e0: 20 20 5b 73 74 72 75 63 74 3a 3a 73 65 74 20 65 [struct::set e
31f0: 6d 70 74 79 20 5b 73 74 72 75 63 74 3a 3a 73 65 mpty [struct::se
3200: 74 20 69 6e 74 65 72 73 65 63 74 20 24 66 69 61 t intersect $fia
3210: 20 24 66 69 62 5d 5d 0a 09 09 7d 20 7b 54 68 65 $fib]]...} {The
3220: 20 66 72 61 67 6d 65 6e 74 73 20 3c 24 66 69 61 fragments <$fia
3230: 3e 20 61 6e 64 20 3c 24 66 69 62 3e 20 6f 76 65 > and <$fib> ove
3240: 72 6c 61 70 7d 0a 09 20 20 20 20 7d 0a 09 20 20 rlap}.. }..
3250: 20 20 69 6e 63 72 20 69 0a 09 7d 0a 0a 09 23 20 incr i..}...#
3260: 41 6c 6c 20 63 68 65 63 6b 73 20 70 61 73 73 2c All checks pass,
3270: 20 61 63 74 75 61 6c 6c 79 20 70 65 72 66 6f 72 actually perfor
3280: 6d 20 74 68 65 20 73 70 6c 69 74 2e 0a 0a 09 73 m the split....s
3290: 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 truct::list assi
32a0: 67 6e 20 5b 24 63 73 65 74 20 64 61 74 61 5d 20 gn [$cset data]
32b0: 70 72 6f 6a 65 63 74 20 63 73 74 79 70 65 20 63 project cstype c
32c0: 73 73 72 63 0a 0a 09 24 63 73 65 74 20 64 72 6f ssrc...$cset dro
32d0: 70 0a 09 24 63 73 65 74 20 64 65 73 74 72 6f 79 p..$cset destroy
32e0: 0a 0a 09 73 65 74 20 6e 65 77 63 73 65 74 73 20 ...set newcsets
32f0: 7b 7d 0a 09 66 6f 72 65 61 63 68 20 66 72 61 67 {}..foreach frag
3300: 6d 65 6e 74 69 74 65 6d 73 20 24 61 72 67 73 20 mentitems $args
3310: 7b 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 {.. log write
3320: 20 38 20 63 73 65 74 73 20 7b 4d 41 4b 45 3a 20 8 csets {MAKE:
3330: 5b 6c 73 6f 72 74 20 24 66 72 61 67 6d 65 6e 74 [lsort $fragment
3340: 69 74 65 6d 73 5d 7d 0a 0a 09 20 20 20 20 73 65 items]}... se
3350: 74 20 66 72 61 67 6d 65 6e 74 20 5b 24 74 79 70 t fragment [$typ
3360: 65 20 25 41 55 54 4f 25 20 24 70 72 6f 6a 65 63 e %AUTO% $projec
3370: 74 20 24 63 73 74 79 70 65 20 24 63 73 73 72 63 t $cstype $cssrc
3380: 20 5c 0a 09 09 09 20 20 20 20 20 20 5b 55 6e 74 \.... [Unt
3390: 61 67 20 24 66 72 61 67 6d 65 6e 74 69 74 65 6d ag $fragmentitem
33a0: 73 20 24 63 73 74 79 70 65 5d 5d 0a 09 20 20 20 s $cstype]]..
33b0: 20 6c 61 70 70 65 6e 64 20 6e 65 77 63 73 65 74 lappend newcset
33c0: 73 20 24 66 72 61 67 6d 65 6e 74 0a 09 20 20 20 s $fragment..
33d0: 20 24 66 72 61 67 6d 65 6e 74 20 70 65 72 73 69 $fragment persi
33e0: 73 74 0a 0a 09 20 20 20 20 69 66 20 7b 5b 24 66 st... if {[$f
33f0: 72 61 67 6d 65 6e 74 20 73 65 6c 66 72 65 66 65 ragment selfrefe
3400: 72 65 6e 74 69 61 6c 5d 7d 20 7b 0a 09 09 74 72 rential]} {...tr
3410: 6f 75 62 6c 65 20 66 61 74 61 6c 20 22 5b 24 66 ouble fatal "[$f
3420: 72 61 67 6d 65 6e 74 20 73 74 72 5d 20 64 65 70 ragment str] dep
3430: 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 22 0a ends on itself".
3440: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 74 72 6f 75 . }..}...trou
3450: 62 6c 65 20 61 62 6f 72 74 3f 0a 09 72 65 74 75 ble abort?..retu
3460: 72 6e 20 24 6e 65 77 63 73 65 74 73 0a 20 20 20 rn $newcsets.
3470: 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 }.. typemeth
3480: 6f 64 20 73 74 72 6c 69 73 74 20 7b 63 68 61 6e od strlist {chan
3490: 67 65 73 65 74 73 7d 20 7b 0a 09 72 65 74 75 72 gesets} {..retur
34a0: 6e 20 5b 6a 6f 69 6e 20 5b 73 74 72 75 63 74 3a n [join [struct:
34b0: 3a 6c 69 73 74 20 6d 61 70 20 24 63 68 61 6e 67 :list map $chang
34c0: 65 73 65 74 73 20 5b 6d 79 70 72 6f 63 20 49 44 esets [myproc ID
34d0: 5d 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 ]]]. }.. p
34e0: 72 6f 63 20 49 44 20 7b 63 73 65 74 7d 20 7b 20 roc ID {cset} {
34f0: 24 63 73 65 74 20 73 74 72 20 7d 0a 0a 20 20 20 $cset str }..
3500: 20 70 72 6f 63 20 55 6e 74 61 67 20 7b 74 61 67 proc Untag {tag
3510: 67 65 64 69 74 65 6d 73 20 63 73 74 79 70 65 7d geditems cstype}
3520: 20 7b 0a 09 72 65 74 75 72 6e 20 5b 73 74 72 75 {..return [stru
3530: 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20 24 74 61 ct::list map $ta
3540: 67 67 65 64 69 74 65 6d 73 20 5b 6d 79 70 72 6f ggeditems [mypro
3550: 63 20 55 6e 74 61 67 31 20 24 63 73 74 79 70 65 c Untag1 $cstype
3560: 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 ]]. }.. pr
3570: 6f 63 20 55 6e 74 61 67 31 20 7b 63 73 74 79 70 oc Untag1 {cstyp
3580: 65 20 74 68 65 69 74 65 6d 7d 20 7b 0a 09 73 74 e theitem} {..st
3590: 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 ruct::list assig
35a0: 6e 20 24 74 68 65 69 74 65 6d 20 74 20 69 0a 09 n $theitem t i..
35b0: 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 integrity assert
35c0: 20 7b 24 63 73 74 79 70 65 20 65 71 20 24 74 7d {$cstype eq $t}
35d0: 20 7b 49 74 65 6d 20 24 69 27 73 20 74 79 70 65 {Item $i's type
35e0: 20 69 73 20 27 24 74 27 2c 20 65 78 70 65 63 74 is '$t', expect
35f0: 65 64 20 27 24 63 73 74 79 70 65 27 7d 0a 09 72 ed '$cstype'}..r
3600: 65 74 75 72 6e 20 24 69 0a 20 20 20 20 7d 0a 0a eturn $i. }..
3610: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 typemethod i
3620: 74 65 6d 73 74 72 20 7b 69 74 65 6d 7d 20 7b 0a temstr {item} {.
3630: 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 .struct::list as
3640: 73 69 67 6e 20 24 69 74 65 6d 20 69 74 79 70 65 sign $item itype
3650: 20 69 69 64 0a 09 72 65 74 75 72 6e 20 5b 24 69 iid..return [$i
3660: 74 79 70 65 20 73 74 72 20 24 69 69 64 5d 0a 20 type str $iid].
3670: 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 }.. # # ##
3680: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 ### ##### #####
3690: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 ### ############
36a0: 23 0a 20 20 20 20 23 23 20 53 74 61 74 65 0a 0a #. ## State..
36b0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 69 variable myi
36c0: 64 20 20 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 d {} ; #
36d0: 49 64 20 6f 66 20 74 68 65 20 63 73 65 74 20 66 Id of the cset f
36e0: 6f 72 20 74 68 65 20 70 65 72 73 69 73 74 65 6e or the persisten
36f0: 74 0a 09 09 09 20 20 20 20 20 20 23 20 73 74 61 t.... # sta
3700: 74 65 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 te.. variable
3710: 20 6d 79 70 72 6f 6a 65 63 74 20 20 20 7b 7d 20 myproject {}
3720: 3b 20 23 20 52 65 66 65 72 65 6e 63 65 20 6f 66 ; # Reference of
3730: 20 74 68 65 20 70 72 6f 6a 65 63 74 20 6f 62 6a the project obj
3740: 65 63 74 20 74 68 65 0a 09 09 09 20 20 20 20 20 ect the....
3750: 20 23 20 63 68 61 6e 67 65 73 65 74 20 62 65 6c # changeset bel
3760: 6f 6e 67 73 20 74 6f 2e 0a 20 20 20 20 76 61 72 ongs to.. var
3770: 69 61 62 6c 65 20 6d 79 74 79 70 65 20 20 20 20 iable mytype
3780: 20 20 7b 7d 20 3b 20 23 20 57 68 61 74 20 74 68 {} ; # What th
3790: 65 20 63 68 61 6e 67 65 73 65 74 20 69 73 20 62 e changeset is b
37a0: 61 73 65 64 20 6f 6e 0a 09 09 09 20 20 20 20 20 ased on....
37b0: 20 23 20 28 72 65 76 69 73 69 6f 6e 73 2c 20 74 # (revisions, t
37c0: 61 67 73 2c 20 6f 72 20 62 72 61 6e 63 68 65 73 ags, or branches
37d0: 29 2e 0a 09 09 09 20 20 20 20 20 20 23 20 56 61 )..... # Va
37e0: 6c 75 65 73 3a 20 53 65 65 20 6d 79 63 73 74 79 lues: See mycsty
37f0: 70 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 77 65 pe. Note that we
3800: 0a 09 09 09 20 20 20 20 20 20 23 20 68 61 76 65 .... # have
3810: 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6e 61 6d to keep the nam
3820: 65 73 20 6f 66 20 74 68 65 20 68 65 6c 70 65 72 es of the helper
3830: 0a 09 09 09 20 20 20 20 20 20 23 20 73 69 6e 67 .... # sing
3840: 6c 65 74 6f 6e 73 20 69 6e 20 73 79 6e 63 20 77 letons in sync w
3850: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 ith the contents
3860: 0a 09 09 09 20 20 20 20 20 20 23 20 6f 66 20 73 .... # of s
3870: 74 61 74 65 20 74 61 62 6c 65 20 27 63 73 74 79 tate table 'csty
3880: 70 65 27 2c 20 61 6e 64 20 76 61 72 69 6f 75 73 pe', and various
3890: 0a 09 09 09 20 20 20 20 20 20 23 20 6f 74 68 65 .... # othe
38a0: 72 20 70 6c 61 63 65 73 20 75 73 69 6e 67 20 74 r places using t
38b0: 68 65 6d 20 68 61 72 64 77 69 72 65 64 2e 0a 20 hem hardwired..
38c0: 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 74 79 variable myty
38d0: 70 65 6f 62 6a 20 20 20 7b 7d 20 3b 20 23 20 52 peobj {} ; # R
38e0: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 eference to the
38f0: 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20 74 68 container for th
3900: 65 0a 09 09 09 20 20 20 20 20 20 23 20 74 79 70 e.... # typ
3910: 65 20 64 65 70 65 6e 64 65 6e 74 20 63 6f 64 65 e dependent code
3920: 2e 20 44 65 72 69 76 65 64 20 66 72 6f 6d 0a 09 . Derived from..
3930: 09 09 20 20 20 20 20 20 23 20 6d 79 74 79 70 65 .. # mytype
3940: 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d .. variable m
3950: 79 73 72 63 69 64 20 20 20 20 20 7b 7d 20 3b 20 ysrcid {} ;
3960: 23 20 49 64 20 6f 66 20 74 68 65 20 6d 65 74 61 # Id of the meta
3970: 64 61 74 61 20 6f 72 20 73 79 6d 62 6f 6c 20 74 data or symbol t
3980: 68 65 20 63 73 65 74 0a 09 09 09 20 20 20 20 20 he cset....
3990: 20 23 20 69 73 20 62 61 73 65 64 20 6f 6e 2e 0a # is based on..
39a0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 69 variable myi
39b0: 74 65 6d 73 20 20 20 20 20 7b 7d 20 3b 20 23 20 tems {} ; #
39c0: 4c 69 73 74 20 6f 66 20 74 68 65 20 66 69 6c 65 List of the file
39d0: 20 6c 65 76 65 6c 20 72 65 76 69 73 69 6f 6e 73 level revisions
39e0: 2c 0a 09 09 09 20 20 20 20 20 20 23 20 74 61 67 ,.... # tag
39f0: 73 2c 20 6f 72 20 62 72 61 6e 63 68 65 73 20 69 s, or branches i
3a00: 6e 20 74 68 65 20 63 73 65 74 2c 20 61 73 0a 09 n the cset, as..
3a10: 09 09 20 20 20 20 20 20 23 20 69 64 73 2e 20 4e .. # ids. N
3a20: 6f 74 20 74 61 67 67 65 64 2e 0a 20 20 20 20 76 ot tagged.. v
3a30: 61 72 69 61 62 6c 65 20 6d 79 74 69 74 65 6d 73 ariable mytitems
3a40: 20 20 20 20 7b 7d 20 3b 20 23 20 41 73 20 6d 79 {} ; # As my
3a50: 69 74 65 6d 73 2c 20 74 68 65 20 74 61 67 67 65 items, the tagge
3a60: 64 20 66 6f 72 6d 2e 0a 20 20 20 20 76 61 72 69 d form.. vari
3a70: 61 62 6c 65 20 6d 79 70 72 65 6d 61 70 20 20 20 able mypremap
3a80: 20 7b 7d 20 3b 20 23 20 44 69 63 74 69 6f 6e 61 {} ; # Dictiona
3a90: 72 79 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 ry mapping from
3aa0: 74 68 65 20 69 74 65 6d 73 20 28 74 61 67 67 65 the items (tagge
3ab0: 64 20 6e 6f 77 29 0a 09 09 09 20 20 20 20 20 20 d now)....
3ac0: 23 20 74 6f 20 74 68 65 69 72 20 70 72 65 64 65 # to their prede
3ad0: 63 65 73 73 6f 72 73 2c 20 61 6c 73 6f 20 74 61 cessors, also ta
3ae0: 67 67 65 64 2e 20 41 0a 09 09 09 20 20 20 20 20 gged. A....
3af0: 20 23 20 63 61 63 68 65 20 74 6f 20 61 76 6f 69 # cache to avoi
3b00: 64 20 6c 6f 61 64 69 6e 67 20 74 68 69 73 20 66 d loading this f
3b10: 72 6f 6d 20 74 68 65 0a 09 09 09 20 20 20 20 20 rom the....
3b20: 20 23 20 73 74 61 74 65 20 6d 6f 72 65 20 74 68 # state more th
3b30: 61 6e 20 6f 6e 63 65 2e 0a 20 20 20 20 76 61 72 an once.. var
3b40: 69 61 62 6c 65 20 6d 79 6e 65 78 74 6d 61 70 20 iable mynextmap
3b50: 20 20 7b 7d 20 3b 20 23 20 44 69 63 74 69 6f 6e {} ; # Diction
3b60: 61 72 79 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d ary mapping from
3b70: 20 74 68 65 20 69 74 65 6d 73 20 28 74 61 67 67 the items (tagg
3b80: 65 64 29 0a 09 09 09 20 20 20 20 20 20 23 20 74 ed).... # t
3b90: 6f 20 74 68 65 69 72 20 73 75 63 63 65 73 73 6f o their successo
3ba0: 72 73 20 28 61 6c 73 6f 20 74 61 67 67 65 64 29 rs (also tagged)
3bb0: 2e 20 41 0a 09 09 09 20 20 20 20 20 20 23 20 63 . A.... # c
3bc0: 61 63 68 65 20 74 6f 20 61 76 6f 69 64 20 6c 6f ache to avoid lo
3bd0: 61 64 69 6e 67 20 74 68 69 73 20 66 72 6f 6d 20 ading this from
3be0: 74 68 65 0a 09 09 09 20 20 20 20 20 20 23 20 73 the.... # s
3bf0: 74 61 74 65 20 6d 6f 72 65 20 74 68 61 6e 20 6f tate more than o
3c00: 6e 63 65 2e 0a 20 20 20 20 76 61 72 69 61 62 6c nce.. variabl
3c10: 65 20 6d 79 70 6f 73 20 20 20 20 20 20 20 7b 7d e mypos {}
3c20: 20 3b 20 23 20 43 6f 6d 6d 69 74 20 70 6f 73 69 ; # Commit posi
3c30: 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 61 6e tion of the chan
3c40: 67 65 73 65 74 2c 20 69 66 0a 09 09 09 20 20 20 geset, if....
3c50: 20 20 20 23 20 6b 6e 6f 77 6e 2e 0a 0a 20 20 20 # known...
3c60: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 # # ## ### ####
3c70: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 # ######## #####
3c80: 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 ########. ##
3c90: 49 6e 74 65 72 6e 61 6c 20 6d 65 74 68 6f 64 73 Internal methods
3ca0: 0a 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62 .. typevariab
3cb0: 6c 65 20 6d 79 63 6f 75 6e 74 65 72 20 20 20 20 le mycounter
3cc0: 20 20 20 20 30 20 3b 20 23 20 49 64 20 63 6f 75 0 ; # Id cou
3cd0: 6e 74 65 72 20 66 6f 72 20 63 73 65 74 73 2e 20 nter for csets.
3ce0: 4c 61 73 74 20 69 64 0a 09 09 09 09 20 20 20 20 Last id.....
3cf0: 20 20 23 20 75 73 65 64 2e 0a 20 20 20 20 74 79 # used.. ty
3d00: 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 73 74 pevariable mycst
3d10: 79 70 65 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 ype -array {} ;
3d20: 23 20 4d 61 70 20 63 73 74 79 70 65 73 20 28 6e # Map cstypes (n
3d30: 61 6d 65 73 29 20 74 6f 20 70 65 72 73 69 73 74 ames) to persist
3d40: 65 6e 74 0a 09 09 09 09 20 20 20 20 20 20 23 20 ent..... #
3d50: 69 64 73 2e 20 4e 6f 74 65 20 74 68 61 74 20 77 ids. Note that w
3d60: 65 20 68 61 76 65 20 74 6f 20 6b 65 65 70 0a 09 e have to keep..
3d70: 09 09 09 20 20 20 20 20 20 23 20 74 68 65 20 6e ... # the n
3d80: 61 6d 65 73 20 69 6e 20 74 68 65 20 74 61 62 6c ames in the tabl
3d90: 65 20 27 63 73 74 79 70 65 27 0a 09 09 09 09 20 e 'cstype'.....
3da0: 20 20 20 20 20 23 20 69 6e 20 73 79 6e 63 20 77 # in sync w
3db0: 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 ith the names of
3dc0: 20 74 68 65 0a 09 09 09 09 20 20 20 20 20 20 23 the..... #
3dd0: 20 68 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f helper singleto
3de0: 6e 73 2e 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 ns... typemet
3df0: 68 6f 64 20 67 65 74 63 73 74 79 70 65 73 20 7b hod getcstypes {
3e00: 7d 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 } {..foreach {ti
3e10: 64 20 6e 61 6d 65 7d 20 5b 73 74 61 74 65 20 72 d name} [state r
3e20: 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 un {.. SELECT
3e30: 20 74 69 64 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 tid, name FROM
3e40: 63 73 74 79 70 65 3b 0a 09 7d 5d 20 7b 20 73 65 cstype;..}] { se
3e50: 74 20 6d 79 63 73 74 79 70 65 28 24 6e 61 6d 65 t mycstype($name
3e60: 29 20 24 74 69 64 20 7d 0a 09 72 65 74 75 72 6e ) $tid }..return
3e70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 . }.. type
3e80: 6d 65 74 68 6f 64 20 6c 6f 61 64 63 6f 75 6e 74 method loadcount
3e90: 65 72 20 7b 7d 20 7b 0a 09 23 20 49 6e 69 74 69 er {} {..# Initi
3ea0: 61 6c 69 7a 65 20 74 68 65 20 63 6f 75 6e 74 65 alize the counte
3eb0: 72 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65 r from the state
3ec0: 0a 09 73 65 74 20 6d 79 63 6f 75 6e 74 65 72 20 ..set mycounter
3ed0: 5b 73 74 61 74 65 20 6f 6e 65 20 7b 20 53 45 4c [state one { SEL
3ee0: 45 43 54 20 4d 41 58 28 63 69 64 29 20 46 52 4f ECT MAX(cid) FRO
3ef0: 4d 20 63 68 61 6e 67 65 73 65 74 20 7d 5d 0a 09 M changeset }]..
3f00: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 return. }..
3f10: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6e 75 6d typemethod num
3f20: 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 {} { return $my
3f30: 63 6f 75 6e 74 65 72 20 7d 0a 0a 20 20 20 20 70 counter }.. p
3f40: 72 6f 63 20 49 6e 69 74 69 61 6c 69 7a 65 42 72 roc InitializeBr
3f50: 65 61 6b 53 74 61 74 65 20 7b 72 65 76 69 73 69 eakState {revisi
3f60: 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 ons} {..upvar 1
3f70: 70 6f 73 20 70 6f 73 20 63 72 6f 73 73 20 63 72 pos pos cross cr
3f80: 6f 73 73 20 72 61 6e 67 65 20 72 61 6e 67 65 20 oss range range
3f90: 64 65 70 63 20 64 65 70 63 20 64 65 6c 74 61 20 depc depc delta
3fa0: 64 65 6c 74 61 20 5c 0a 09 20 20 20 20 64 65 70 delta \.. dep
3fb0: 65 6e 64 65 6e 63 69 65 73 20 64 65 70 65 6e 64 endencies depend
3fc0: 65 6e 63 69 65 73 0a 0a 09 23 20 46 69 72 73 74 encies...# First
3fd0: 20 77 65 20 63 72 65 61 74 65 20 61 20 6d 61 70 we create a map
3fe0: 20 6f 66 20 70 6f 73 69 74 69 6f 6e 73 20 74 6f of positions to
3ff0: 20 6d 61 6b 65 20 69 74 20 65 61 73 69 65 72 20 make it easier
4000: 74 6f 0a 09 23 20 64 65 74 65 72 6d 69 6e 65 20 to..# determine
4010: 77 68 65 74 68 65 72 20 61 20 64 65 70 65 6e 64 whether a depend
4020: 65 6e 63 79 20 63 72 6f 73 73 65 73 20 61 20 70 ency crosses a p
4030: 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 2e articular index.
4040: 0a 0a 09 61 72 72 61 79 20 73 65 74 20 70 6f 73 ...array set pos
4050: 20 20 20 7b 7d 0a 09 61 72 72 61 79 20 73 65 74 {}..array set
4060: 20 63 72 6f 73 73 20 7b 7d 0a 09 61 72 72 61 79 cross {}..array
4070: 20 73 65 74 20 64 65 70 63 20 20 7b 7d 0a 09 73 set depc {}..s
4080: 65 74 20 72 61 6e 67 65 20 20 20 20 20 20 20 7b et range {
4090: 7d 0a 09 73 65 74 20 6e 20 30 0a 09 66 6f 72 65 }..set n 0..fore
40a0: 61 63 68 20 72 65 76 20 24 72 65 76 69 73 69 6f ach rev $revisio
40b0: 6e 73 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e ns {.. lappen
40c0: 64 20 72 61 6e 67 65 20 24 6e 0a 09 20 20 20 20 d range $n..
40d0: 73 65 74 20 70 6f 73 28 24 72 65 76 29 20 24 6e set pos($rev) $n
40e0: 0a 09 20 20 20 20 73 65 74 20 63 72 6f 73 73 28 .. set cross(
40f0: 24 6e 29 20 30 0a 09 20 20 20 20 69 6e 63 72 20 $n) 0.. incr
4100: 6e 0a 09 7d 0a 0a 09 23 20 53 65 63 6f 6e 64 6c n..}...# Secondl
4110: 79 20 77 65 20 63 6f 75 6e 74 20 74 68 65 20 63 y we count the c
4120: 72 6f 73 73 69 6e 67 73 20 70 65 72 20 70 6f 73 rossings per pos
4130: 69 74 69 6f 6e 2c 20 62 79 20 69 74 65 72 61 74 ition, by iterat
4140: 69 6e 67 0a 09 23 20 6f 76 65 72 20 74 68 65 20 ing..# over the
4150: 72 65 63 6f 72 64 65 64 20 69 6e 74 65 72 6e 61 recorded interna
4160: 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 0a l dependencies..
4170: 0a 09 23 20 4e 6f 74 65 3a 20 49 66 20 74 68 65 ..# Note: If the
4180: 20 74 69 6d 65 73 74 61 6d 70 73 20 61 72 65 20 timestamps are
4190: 62 61 64 6c 79 20 6f 75 74 20 6f 66 20 6f 72 64 badly out of ord
41a0: 65 72 20 69 74 20 69 73 0a 09 23 20 20 20 20 20 er it is..#
41b0: 20 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 possible to ha
41c0: 76 65 20 61 20 62 61 63 6b 77 61 72 64 20 73 75 ve a backward su
41d0: 63 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e ccessor dependen
41e0: 63 79 2c 0a 09 23 20 20 20 20 20 20 20 69 2e 65 cy,..# i.e
41f0: 2e 20 77 69 74 68 20 73 74 61 72 74 20 3e 20 65 . with start > e
4200: 6e 64 2e 20 57 65 20 6d 61 79 20 68 61 76 65 20 nd. We may have
4210: 74 6f 20 73 77 61 70 20 74 68 65 20 69 6e 64 69 to swap the indi
4220: 63 65 73 0a 09 23 20 20 20 20 20 20 20 74 6f 20 ces..# to
4230: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 ensure that the
4240: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 following loop r
4250: 75 6e 73 20 63 6f 72 72 65 63 74 6c 79 2e 0a 09 uns correctly...
4260: 23 0a 09 23 20 4e 6f 74 65 20 32 3a 20 73 74 61 #..# Note 2: sta
4270: 72 74 20 3d 3d 20 65 6e 64 20 69 73 20 6e 6f 74 rt == end is not
4280: 20 70 6f 73 73 69 62 6c 65 2e 20 49 74 20 69 6e possible. It in
4290: 64 69 63 61 74 65 73 20 61 0a 09 23 20 20 20 20 dicates a..#
42a0: 20 20 20 20 20 73 65 6c 66 2d 64 65 70 65 6e 64 self-depend
42b0: 65 6e 63 79 20 64 75 65 20 74 6f 20 74 68 65 20 ency due to the
42c0: 75 6e 69 71 75 65 6e 65 73 73 20 6f 66 20 70 6f uniqueness of po
42d0: 73 69 74 69 6f 6e 73 2c 0a 09 23 20 20 20 20 20 sitions,..#
42e0: 20 20 20 20 61 6e 64 20 74 68 61 74 20 69 73 20 and that is
42f0: 73 6f 6d 65 74 68 69 6e 67 20 77 65 20 68 61 76 something we hav
4300: 65 20 72 75 6c 65 64 20 6f 75 74 20 61 6c 72 65 e ruled out alre
4310: 61 64 79 2c 20 73 65 65 0a 09 23 20 20 20 20 20 ady, see..#
4320: 20 20 20 20 27 72 65 76 20 69 6e 74 65 72 6e 61 'rev interna
4330: 6c 73 75 63 63 65 73 73 6f 72 73 27 2e 0a 0a 09 lsuccessors'....
4340: 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 foreach {rid chi
4350: 6c 64 72 65 6e 7d 20 5b 61 72 72 61 79 20 67 65 ldren} [array ge
4360: 74 20 64 65 70 65 6e 64 65 6e 63 69 65 73 5d 20 t dependencies]
4370: 7b 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 63 {.. foreach c
4380: 68 69 6c 64 20 24 63 68 69 6c 64 72 65 6e 20 7b hild $children {
4390: 0a 09 09 73 65 74 20 64 6b 65 79 20 20 20 20 5b ...set dkey [
43a0: 6c 69 73 74 20 24 72 69 64 20 24 63 68 69 6c 64 list $rid $child
43b0: 5d 0a 09 09 73 65 74 20 73 74 61 72 74 20 20 20 ]...set start
43c0: 24 70 6f 73 28 24 72 69 64 29 0a 09 09 73 65 74 $pos($rid)...set
43d0: 20 65 6e 64 20 20 20 20 20 24 70 6f 73 28 24 63 end $pos($c
43e0: 68 69 6c 64 29 0a 09 09 73 65 74 20 63 72 6f 73 hild)...set cros
43f0: 73 65 73 20 7b 7d 0a 0a 09 09 69 66 20 7b 24 73 ses {}....if {$s
4400: 74 61 72 74 20 3e 20 24 65 6e 64 7d 20 7b 0a 09 tart > $end} {..
4410: 09 20 20 20 20 77 68 69 6c 65 20 7b 24 65 6e 64 . while {$end
4420: 20 3c 20 24 73 74 61 72 74 7d 20 7b 0a 09 09 09 < $start} {....
4430: 6c 61 70 70 65 6e 64 20 63 72 6f 73 73 65 73 20 lappend crosses
4440: 24 65 6e 64 0a 09 09 09 69 6e 63 72 20 63 72 6f $end....incr cro
4450: 73 73 28 24 65 6e 64 29 0a 09 09 09 69 6e 63 72 ss($end)....incr
4460: 20 65 6e 64 0a 09 09 20 20 20 20 7d 0a 09 09 7d end... }...}
4470: 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 77 68 else {... wh
4480: 69 6c 65 20 7b 24 73 74 61 72 74 20 3c 20 24 65 ile {$start < $e
4490: 6e 64 7d 20 7b 0a 09 09 09 6c 61 70 70 65 6e 64 nd} {....lappend
44a0: 20 63 72 6f 73 73 65 73 20 24 73 74 61 72 74 0a crosses $start.
44b0: 09 09 09 69 6e 63 72 20 63 72 6f 73 73 28 24 73 ...incr cross($s
44c0: 74 61 72 74 29 0a 09 09 09 69 6e 63 72 20 73 74 tart)....incr st
44d0: 61 72 74 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a art... }...}.
44e0: 09 09 73 65 74 20 64 65 70 63 28 24 64 6b 65 79 ..set depc($dkey
44f0: 29 20 24 63 72 6f 73 73 65 73 0a 09 20 20 20 20 ) $crosses..
4500: 7d 0a 09 7d 0a 0a 09 49 6e 69 74 69 61 6c 69 7a }..}...Initializ
4510: 65 44 65 6c 74 61 73 20 24 72 65 76 69 73 69 6f eDeltas $revisio
4520: 6e 73 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d ns..return. }
4530: 0a 0a 20 20 20 20 70 72 6f 63 20 49 6e 69 74 69 .. proc Initi
4540: 61 6c 69 7a 65 44 65 6c 74 61 73 20 7b 72 65 76 alizeDeltas {rev
4550: 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 isions} {..upvar
4560: 20 31 20 64 65 6c 74 61 20 64 65 6c 74 61 0a 0a 1 delta delta..
4570: 09 23 20 50 75 6c 6c 20 74 68 65 20 74 69 6d 65 .# Pull the time
4580: 73 74 61 6d 70 73 20 66 6f 72 20 61 6c 6c 20 72 stamps for all r
4590: 65 76 69 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 evisions in the
45a0: 63 68 61 6e 67 65 73 65 74 73 20 61 6e 64 0a 09 changesets and..
45b0: 23 20 63 6f 6d 70 75 74 65 20 74 68 65 69 72 20 # compute their
45c0: 64 65 6c 74 61 73 20 66 6f 72 20 75 73 65 20 62 deltas for use b
45d0: 79 20 74 68 65 20 62 72 65 61 6b 20 66 69 6e 64 y the break find
45e0: 65 72 2e 0a 0a 09 61 72 72 61 79 20 73 65 74 20 er....array set
45f0: 64 65 6c 74 61 20 7b 7d 0a 09 61 72 72 61 79 20 delta {}..array
4600: 73 65 74 20 73 74 61 6d 70 20 7b 7d 0a 0a 09 73 set stamp {}...s
4610: 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 et theset ('[joi
4620: 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c n $revisions {',
4630: 27 7d 5d 27 29 0a 09 66 6f 72 65 61 63 68 20 7b '}]')..foreach {
4640: 72 69 64 20 74 69 6d 65 7d 20 5b 73 74 61 74 65 rid time} [state
4650: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 run ".. SELE
4660: 43 54 20 52 2e 72 69 64 2c 20 52 2e 64 61 74 65 CT R.rid, R.date
4670: 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73 .. FROM revis
4680: 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 ion R.. WHERE
4690: 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 R.rid IN $these
46a0: 74 0a 09 22 5d 20 7b 0a 09 20 20 20 20 73 65 74 t.."] {.. set
46b0: 20 73 74 61 6d 70 28 24 72 69 64 29 20 24 74 69 stamp($rid) $ti
46c0: 6d 65 0a 09 7d 0a 0a 09 73 65 74 20 6e 20 30 0a me..}...set n 0.
46d0: 09 66 6f 72 65 61 63 68 20 72 69 64 20 5b 6c 72 .foreach rid [lr
46e0: 61 6e 67 65 20 24 72 65 76 69 73 69 6f 6e 73 20 ange $revisions
46f0: 30 20 65 6e 64 2d 31 5d 20 72 6e 65 78 74 20 5b 0 end-1] rnext [
4700: 6c 72 61 6e 67 65 20 24 72 65 76 69 73 69 6f 6e lrange $revision
4710: 73 20 31 20 65 6e 64 5d 20 7b 0a 09 20 20 20 20 s 1 end] {..
4720: 73 65 74 20 64 65 6c 74 61 28 24 6e 29 20 5b 65 set delta($n) [e
4730: 78 70 72 20 7b 24 73 74 61 6d 70 28 24 72 6e 65 xpr {$stamp($rne
4740: 78 74 29 20 2d 20 24 73 74 61 6d 70 28 24 72 69 xt) - $stamp($ri
4750: 64 29 7d 5d 0a 09 20 20 20 20 69 6e 63 72 20 6e d)}].. incr n
4760: 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 ..}..return.
4770: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 46 69 6e 64 }.. proc Find
4780: 42 65 73 74 42 72 65 61 6b 20 7b 72 61 6e 67 65 BestBreak {range
4790: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 63 72 6f } {..upvar 1 cro
47a0: 73 73 20 63 72 6f 73 73 20 64 65 6c 74 61 20 64 ss cross delta d
47b0: 65 6c 74 61 0a 0a 09 23 20 44 65 74 65 72 6d 69 elta...# Determi
47c0: 6e 65 20 74 68 65 20 62 65 73 74 20 62 72 65 61 ne the best brea
47d0: 6b 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 k location in th
47e0: 65 20 67 69 76 65 6e 20 72 61 6e 67 65 20 6f 66 e given range of
47f0: 0a 09 23 20 70 6f 73 69 74 69 6f 6e 73 2e 20 46 ..# positions. F
4800: 69 72 73 74 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 irst we look for
4810: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 73 20 77 the locations w
4820: 69 74 68 20 74 68 65 20 6d 61 78 69 6d 61 6c 0a ith the maximal.
4830: 09 23 20 6e 75 6d 62 65 72 20 6f 66 20 63 72 6f .# number of cro
4840: 73 73 69 6e 67 73 2e 20 49 66 20 74 68 65 72 65 ssings. If there
4850: 20 61 72 65 20 73 65 76 65 72 61 6c 20 77 65 20 are several we
4860: 6c 6f 6f 6b 20 66 6f 72 20 74 68 65 0a 09 23 20 look for the..#
4870: 73 68 6f 72 74 65 73 74 20 74 69 6d 65 20 69 6e shortest time in
4880: 74 65 72 76 61 6c 20 61 6d 6f 6e 67 20 74 68 65 terval among the
4890: 6d 2e 20 49 66 20 77 65 20 73 74 69 6c 6c 20 68 m. If we still h
48a0: 61 76 65 20 6d 75 6c 74 69 70 6c 65 0a 09 23 20 ave multiple..#
48b0: 70 6f 73 73 69 62 69 6c 69 74 69 65 73 20 61 66 possibilities af
48c0: 74 65 72 20 74 68 61 74 20 77 65 20 73 65 6c 65 ter that we sele
48d0: 63 74 20 74 68 65 20 65 61 72 6c 69 65 73 74 20 ct the earliest
48e0: 6c 6f 63 61 74 69 6f 6e 0a 09 23 20 61 6d 6f 6e location..# amon
48f0: 67 20 74 68 65 73 65 2e 0a 0a 09 23 20 4e 6f 74 g these....# Not
4900: 65 3a 20 49 66 20 74 68 65 20 6d 61 78 69 6d 61 e: If the maxima
4910: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 72 6f 73 l number of cros
4920: 73 69 6e 67 73 20 69 73 20 30 20 74 68 65 6e 20 sings is 0 then
4930: 74 68 65 20 72 61 6e 67 65 0a 09 23 20 20 20 20 the range..#
4940: 20 20 20 68 61 73 20 6e 6f 20 69 6e 74 65 72 6e has no intern
4950: 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2c al dependencies,
4960: 20 61 6e 64 20 6e 6f 20 62 72 65 61 6b 20 6c 6f and no break lo
4970: 63 61 74 69 6f 6e 20 61 74 0a 09 23 20 20 20 20 cation at..#
4980: 20 20 20 61 6c 6c 2e 20 54 68 69 73 20 70 6f 73 all. This pos
4990: 73 69 62 69 6c 69 74 79 20 69 73 20 73 69 67 6e sibility is sign
49a0: 61 6c 65 64 20 76 69 61 20 72 65 73 75 6c 74 20 aled via result
49b0: 2d 31 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 41 20 -1....# Note: A
49c0: 72 61 6e 67 65 20 6f 66 20 6c 65 6e 67 74 68 20 range of length
49d0: 31 20 6f 72 20 6c 65 73 73 20 63 61 6e 6e 6f 74 1 or less cannot
49e0: 20 68 61 76 65 20 69 6e 74 65 72 6e 61 6c 0a 09 have internal..
49f0: 23 20 20 20 20 20 20 20 64 65 70 65 6e 64 65 6e # dependen
4a00: 63 69 65 73 2c 20 61 73 20 74 68 61 74 20 6e 65 cies, as that ne
4a10: 65 64 73 20 61 74 20 6c 65 61 73 74 20 74 77 6f eds at least two
4a20: 20 72 65 76 69 73 69 6f 6e 73 20 69 6e 0a 09 23 revisions in..#
4a30: 20 20 20 20 20 20 20 74 68 65 20 72 61 6e 67 65 the range
4a40: 2e 0a 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 ....if {[llength
4a50: 20 24 72 61 6e 67 65 5d 20 3c 20 32 7d 20 7b 20 $range] < 2} {
4a60: 72 65 74 75 72 6e 20 2d 31 20 7d 0a 0a 09 73 65 return -1 }...se
4a70: 74 20 6d 61 78 20 2d 31 0a 09 73 65 74 20 62 65 t max -1..set be
4a80: 73 74 20 7b 7d 0a 0a 09 66 6f 72 65 61 63 68 20 st {}...foreach
4a90: 6c 6f 63 61 74 69 6f 6e 20 24 72 61 6e 67 65 20 location $range
4aa0: 7b 0a 09 20 20 20 20 73 65 74 20 63 72 6f 73 73 {.. set cross
4ab0: 69 6e 67 73 20 24 63 72 6f 73 73 28 24 6c 6f 63 ings $cross($loc
4ac0: 61 74 69 6f 6e 29 0a 09 20 20 20 20 69 66 20 7b ation).. if {
4ad0: 24 63 72 6f 73 73 69 6e 67 73 20 3e 20 24 6d 61 $crossings > $ma
4ae0: 78 7d 20 7b 0a 09 09 73 65 74 20 6d 61 78 20 20 x} {...set max
4af0: 24 63 72 6f 73 73 69 6e 67 73 0a 09 09 73 65 74 $crossings...set
4b00: 20 62 65 73 74 20 5b 6c 69 73 74 20 24 6c 6f 63 best [list $loc
4b10: 61 74 69 6f 6e 5d 0a 09 09 63 6f 6e 74 69 6e 75 ation]...continu
4b20: 65 0a 09 20 20 20 20 7d 20 65 6c 73 65 69 66 20 e.. } elseif
4b30: 7b 24 63 72 6f 73 73 69 6e 67 73 20 3d 3d 20 24 {$crossings == $
4b40: 6d 61 78 7d 20 7b 0a 09 09 6c 61 70 70 65 6e 64 max} {...lappend
4b50: 20 62 65 73 74 20 24 6c 6f 63 61 74 69 6f 6e 0a best $location.
4b60: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b . }..}...if {
4b70: 24 6d 61 78 20 3d 3d 20 30 7d 20 20 20 20 20 20 $max == 0}
4b80: 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20 2d { return -
4b90: 31 20 7d 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 1 }..if {[llengt
4ba0: 68 20 24 62 65 73 74 5d 20 3d 3d 20 31 7d 20 7b h $best] == 1} {
4bb0: 20 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 return [lindex
4bc0: 24 62 65 73 74 20 30 5d 20 7d 0a 0a 09 73 65 74 $best 0] }...set
4bd0: 20 6c 6f 63 61 74 69 6f 6e 73 20 24 62 65 73 74 locations $best
4be0: 0a 09 73 65 74 20 62 65 73 74 20 7b 7d 0a 09 73 ..set best {}..s
4bf0: 65 74 20 6d 69 6e 20 2d 31 0a 0a 09 66 6f 72 65 et min -1...fore
4c00: 61 63 68 20 6c 6f 63 61 74 69 6f 6e 20 24 6c 6f ach location $lo
4c10: 63 61 74 69 6f 6e 73 20 7b 0a 09 20 20 20 20 73 cations {.. s
4c20: 65 74 20 69 6e 74 65 72 76 61 6c 20 24 64 65 6c et interval $del
4c30: 74 61 28 24 6c 6f 63 61 74 69 6f 6e 29 0a 09 20 ta($location)..
4c40: 20 20 20 69 66 20 7b 28 24 6d 69 6e 20 3c 20 30 if {($min < 0
4c50: 29 20 7c 7c 20 28 24 69 6e 74 65 72 76 61 6c 20 ) || ($interval
4c60: 3c 20 24 6d 69 6e 29 7d 20 7b 0a 09 09 73 65 74 < $min)} {...set
4c70: 20 6d 69 6e 20 20 24 69 6e 74 65 72 76 61 6c 0a min $interval.
4c80: 09 09 73 65 74 20 62 65 73 74 20 5b 6c 69 73 74 ..set best [list
4c90: 20 24 6c 6f 63 61 74 69 6f 6e 5d 0a 09 20 20 20 $location]..
4ca0: 20 7d 20 65 6c 73 65 69 66 20 7b 24 69 6e 74 65 } elseif {$inte
4cb0: 72 76 61 6c 20 3d 3d 20 24 6d 69 6e 7d 20 7b 0a rval == $min} {.
4cc0: 09 09 6c 61 70 70 65 6e 64 20 62 65 73 74 20 24 ..lappend best $
4cd0: 6c 6f 63 61 74 69 6f 6e 0a 09 20 20 20 20 7d 0a location.. }.
4ce0: 09 7d 0a 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 .}...if {[llengt
4cf0: 68 20 24 62 65 73 74 5d 20 3d 3d 20 31 7d 20 7b h $best] == 1} {
4d00: 20 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 return [lindex
4d10: 24 62 65 73 74 20 30 5d 20 7d 0a 0a 09 72 65 74 $best 0] }...ret
4d20: 75 72 6e 20 5b 6c 69 6e 64 65 78 20 5b 6c 73 6f urn [lindex [lso
4d30: 72 74 20 2d 69 6e 74 65 67 65 72 20 2d 69 6e 63 rt -integer -inc
4d40: 72 65 61 73 69 6e 67 20 24 62 65 73 74 5d 20 30 reasing $best] 0
4d50: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f ]. }.. pro
4d60: 63 20 43 75 74 41 74 20 7b 6c 6f 63 61 74 69 6f c CutAt {locatio
4d70: 6e 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 63 72 n} {..upvar 1 cr
4d80: 6f 73 73 20 63 72 6f 73 73 20 64 65 70 63 20 64 oss cross depc d
4d90: 65 70 63 0a 0a 09 23 20 49 74 20 77 61 73 20 64 epc...# It was d
4da0: 65 63 69 64 65 64 20 74 6f 20 73 70 6c 69 74 20 ecided to split
4db0: 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 61 74 the changeset at
4dc0: 20 74 68 65 20 67 69 76 65 6e 0a 09 23 20 6c 6f the given..# lo
4dd0: 63 61 74 69 6f 6e 2e 20 54 68 69 73 20 63 75 74 cation. This cut
4de0: 73 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 64 65 s a number of de
4df0: 70 65 6e 64 65 6e 63 69 65 73 2e 20 48 65 72 65 pendencies. Here
4e00: 20 77 65 20 75 70 64 61 74 65 0a 09 23 20 74 68 we update..# th
4e10: 65 20 63 72 6f 73 73 20 69 6e 66 6f 72 6d 61 74 e cross informat
4e20: 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 ion so that the
4e30: 62 72 65 61 6b 20 66 69 6e 64 65 72 20 68 61 73 break finder has
4e40: 20 61 63 63 75 72 61 74 65 0a 09 23 20 64 61 74 accurate..# dat
4e50: 61 20 77 68 65 6e 20 77 65 20 6c 6f 6f 6b 20 61 a when we look a
4e60: 74 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 t the generated
4e70: 66 72 61 67 6d 65 6e 74 73 2e 0a 0a 09 73 65 74 fragments....set
4e80: 20 73 69 78 20 5b 6c 6f 67 20 76 69 73 69 62 6c six [log visibl
4e90: 65 3f 20 36 5d 0a 0a 09 66 6f 72 65 61 63 68 20 e? 6]...foreach
4ea0: 7b 64 65 70 20 72 61 6e 67 65 7d 20 5b 61 72 72 {dep range} [arr
4eb0: 61 79 20 67 65 74 20 64 65 70 63 5d 20 7b 0a 09 ay get depc] {..
4ec0: 20 20 20 20 23 20 43 68 65 63 6b 20 61 6c 6c 20 # Check all
4ed0: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 73 74 69 dependencies sti
4ee0: 6c 6c 20 6b 6e 6f 77 6e 2c 20 74 61 6b 65 20 74 ll known, take t
4ef0: 68 65 69 72 20 72 61 6e 67 65 20 61 6e 64 0a 09 heir range and..
4f00: 20 20 20 20 23 20 73 65 65 20 69 66 20 74 68 65 # see if the
4f10: 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 break location
4f20: 66 61 6c 6c 73 20 77 69 74 68 69 6e 2e 0a 0a 09 falls within....
4f30: 20 20 20 20 42 6f 72 64 65 72 20 24 72 61 6e 67 Border $rang
4f40: 65 20 73 20 65 0a 09 20 20 20 20 69 66 20 7b 24 e s e.. if {$
4f50: 6c 6f 63 61 74 69 6f 6e 20 3c 20 24 73 7d 20 63 location < $s} c
4f60: 6f 6e 74 69 6e 75 65 20 3b 20 23 20 62 72 65 61 ontinue ; # brea
4f70: 6b 20 62 65 66 6f 72 65 20 72 61 6e 67 65 2c 20 k before range,
4f80: 69 67 6e 6f 72 65 0a 09 20 20 20 20 69 66 20 7b ignore.. if {
4f90: 24 6c 6f 63 61 74 69 6f 6e 20 3e 20 24 65 7d 20 $location > $e}
4fa0: 63 6f 6e 74 69 6e 75 65 20 3b 20 23 20 62 72 65 continue ; # bre
4fb0: 61 6b 20 61 66 74 65 72 20 72 61 6e 67 65 2c 20 ak after range,
4fc0: 69 67 6e 6f 72 65 2e 0a 0a 09 20 20 20 20 23 20 ignore.... #
4fd0: 54 68 69 73 20 64 65 70 65 6e 64 65 6e 63 79 20 This dependency
4fe0: 63 72 6f 73 73 65 73 20 74 68 65 20 62 72 65 61 crosses the brea
4ff0: 6b 20 6c 6f 63 61 74 69 6f 6e 2e 20 57 65 20 72 k location. We r
5000: 65 6d 6f 76 65 20 69 74 0a 09 20 20 20 20 23 20 emove it.. #
5010: 66 72 6f 6d 20 74 68 65 20 63 72 6f 73 73 69 6e from the crossin
5020: 67 73 20 63 6f 75 6e 74 65 72 73 2c 20 61 6e 64 gs counters, and
5030: 20 74 68 65 6e 20 61 6c 73 6f 20 66 72 6f 6d 20 then also from
5040: 74 68 65 20 73 65 74 0a 09 20 20 20 20 23 20 6f the set.. # o
5050: 66 20 6b 6e 6f 77 6e 20 64 65 70 65 6e 64 65 6e f known dependen
5060: 63 69 65 73 2c 20 61 73 20 77 65 20 61 72 65 20 cies, as we are
5070: 64 6f 6e 65 20 77 69 74 68 20 69 74 2e 0a 0a 09 done with it....
5080: 20 20 20 20 66 6f 72 65 61 63 68 20 6c 6f 63 20 foreach loc
5090: 24 64 65 70 63 28 24 64 65 70 29 20 7b 20 69 6e $depc($dep) { in
50a0: 63 72 20 63 72 6f 73 73 28 24 6c 6f 63 29 20 2d cr cross($loc) -
50b0: 31 20 7d 0a 09 20 20 20 20 75 6e 73 65 74 20 64 1 }.. unset d
50c0: 65 70 63 28 24 64 65 70 29 0a 0a 09 20 20 20 20 epc($dep)...
50d0: 69 66 20 7b 21 24 73 69 78 7d 20 63 6f 6e 74 69 if {!$six} conti
50e0: 6e 75 65 0a 0a 09 20 20 20 20 73 74 72 75 63 74 nue... struct
50f0: 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 24 64 ::list assign $d
5100: 65 70 20 70 61 72 65 6e 74 20 63 68 69 6c 64 0a ep parent child.
5110: 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 35 . log write 5
5120: 20 63 73 65 74 73 20 22 42 72 6f 6b 65 20 64 65 csets "Broke de
5130: 70 65 6e 64 65 6e 63 79 20 5b 50 44 20 24 70 61 pendency [PD $pa
5140: 72 65 6e 74 5d 20 2d 2d 3e 20 5b 50 44 20 24 63 rent] --> [PD $c
5150: 68 69 6c 64 5d 22 0a 09 7d 0a 0a 09 72 65 74 75 hild]"..}...retu
5160: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 rn. }.. #
5170: 50 72 69 6e 74 20 69 64 65 6e 74 69 66 79 69 6e Print identifyin
5180: 67 20 64 61 74 61 20 66 6f 72 20 61 20 72 65 76 g data for a rev
5190: 69 73 69 6f 6e 20 28 70 72 6f 6a 65 63 74 2c 20 ision (project,
51a0: 66 69 6c 65 2c 20 64 6f 74 74 65 64 20 72 65 76 file, dotted rev
51b0: 0a 20 20 20 20 23 20 6e 75 6d 62 65 72 29 2c 20 . # number),
51c0: 66 6f 72 20 68 69 67 68 20 76 65 72 62 6f 73 69 for high verbosi
51d0: 74 79 20 6c 6f 67 20 6f 75 74 70 75 74 2e 0a 0a ty log output...
51e0: 20 20 20 20 70 72 6f 63 20 50 44 20 7b 69 64 7d proc PD {id}
51f0: 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b 70 20 66 {..foreach {p f
5200: 20 72 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 7b r} [state run {
5210: 0a 09 09 53 45 4c 45 43 54 20 50 2e 6e 61 6d 65 ...SELECT P.name
5220: 20 2c 20 46 2e 6e 61 6d 65 2c 20 52 2e 72 65 76 , F.name, R.rev
5230: 0a 09 09 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e ...FROM revision
5240: 20 52 2c 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a R, file F, proj
5250: 65 63 74 20 50 0a 09 09 57 48 45 52 45 20 52 2e ect P...WHERE R.
5260: 72 69 64 20 3d 20 24 69 64 0a 09 09 41 4e 44 20 rid = $id...AND
5270: 20 20 52 2e 66 69 64 20 3d 20 46 2e 66 69 64 0a R.fid = F.fid.
5280: 09 09 41 4e 44 20 20 20 46 2e 70 69 64 20 3d 20 ..AND F.pid =
5290: 50 2e 70 69 64 0a 09 7d 5d 20 62 72 65 61 6b 0a P.pid..}] break.
52a0: 09 72 65 74 75 72 6e 20 22 27 24 70 20 3a 20 24 .return "'$p : $
52b0: 66 2f 24 72 27 22 0a 20 20 20 20 7d 0a 0a 20 20 f/$r'". }..
52c0: 20 20 23 20 50 72 69 6e 74 69 6e 67 20 6f 6e 65 # Printing one
52d0: 20 6f 72 20 6d 6f 72 65 20 72 61 6e 67 65 73 2c or more ranges,
52e0: 20 66 6f 72 6d 61 74 74 65 64 2c 20 61 6e 64 20 formatted, and
52f0: 6f 6e 6c 79 20 74 68 65 69 72 20 62 6f 72 64 65 only their borde
5300: 72 20 74 6f 0a 20 20 20 20 23 20 6b 65 65 70 20 r to. # keep
5310: 74 68 65 20 73 74 72 69 6e 67 73 20 73 68 6f 72 the strings shor
5320: 74 2e 0a 0a 20 20 20 20 70 72 6f 63 20 50 52 73 t... proc PRs
5330: 20 7b 72 61 6e 67 65 73 7d 20 7b 0a 09 72 65 74 {ranges} {..ret
5340: 75 72 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 urn [struct::lis
5350: 74 20 6d 61 70 20 24 72 61 6e 67 65 73 20 5b 6d t map $ranges [m
5360: 79 70 72 6f 63 20 50 52 5d 5d 0a 20 20 20 20 7d yproc PR]]. }
5370: 0a 0a 20 20 20 20 70 72 6f 63 20 50 52 20 7b 72 .. proc PR {r
5380: 61 6e 67 65 7d 20 7b 0a 09 42 6f 72 64 65 72 20 ange} {..Border
5390: 24 72 61 6e 67 65 20 73 20 65 0a 09 72 65 74 75 $range s e..retu
53a0: 72 6e 20 3c 24 7b 73 7d 2e 2e 2e 24 7b 65 7d 3e rn <${s}...${e}>
53b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 . }.. proc
53c0: 20 42 6f 72 64 65 72 20 7b 72 61 6e 67 65 20 73 Border {range s
53d0: 76 20 65 76 7d 20 7b 0a 09 75 70 76 61 72 20 31 v ev} {..upvar 1
53e0: 20 24 73 76 20 73 20 24 65 76 20 65 0a 09 73 65 $sv s $ev e..se
53f0: 74 20 73 20 5b 6c 69 6e 64 65 78 20 24 72 61 6e t s [lindex $ran
5400: 67 65 20 30 5d 0a 09 73 65 74 20 65 20 5b 6c 69 ge 0]..set e [li
5410: 6e 64 65 78 20 24 72 61 6e 67 65 20 65 6e 64 5d ndex $range end]
5420: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a ..return. }..
5430: 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23 # # ## ### #
5440: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 #### ######## ##
5450: 23 23 23 23 23 23 23 23 23 23 23 0a 0a 20 20 20 ###########..
5460: 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 typevariable my
5470: 63 68 61 6e 67 65 73 65 74 73 20 20 20 20 20 7b changesets {
5480: 7d 20 3b 20 23 20 4c 69 73 74 20 6f 66 20 61 6c } ; # List of al
5490: 6c 20 6b 6e 6f 77 6e 20 63 68 61 6e 67 65 73 65 l known changese
54a0: 74 73 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69 ts.. typevari
54b0: 61 62 6c 65 20 6d 79 69 74 65 6d 6d 61 70 20 2d able myitemmap -
54c0: 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 array {} ; # Map
54d0: 20 66 72 6f 6d 20 69 74 65 6d 73 20 28 74 61 67 from items (tag
54e0: 67 65 64 29 20 74 6f 0a 09 09 09 09 20 20 20 20 ged) to.....
54f0: 20 20 20 23 20 74 68 65 20 6c 69 73 74 20 6f 66 # the list of
5500: 20 63 68 61 6e 67 65 73 65 74 73 0a 09 09 09 09 changesets.....
5510: 20 20 20 20 20 20 20 23 20 63 6f 6e 74 61 69 6e # contain
5520: 69 6e 67 20 69 74 2e 20 45 61 63 68 20 69 74 65 ing it. Each ite
5530: 6d 20 63 61 6e 0a 09 09 09 09 20 20 20 20 20 20 m can.....
5540: 20 23 20 62 65 20 75 73 65 64 20 62 79 20 6f 6e # be used by on
5550: 6c 79 20 6f 6e 65 0a 09 09 09 09 20 20 20 20 20 ly one.....
5560: 20 20 23 20 63 68 61 6e 67 65 73 65 74 2e 0a 20 # changeset..
5570: 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 typevariable
5580: 6d 79 69 64 6d 61 70 20 20 20 2d 61 72 72 61 79 myidmap -array
5590: 20 7b 7d 20 3b 20 23 20 4d 61 70 20 66 72 6f 6d {} ; # Map from
55a0: 20 63 68 61 6e 67 65 73 65 74 20 69 64 20 74 6f changeset id to
55b0: 0a 09 09 09 09 20 20 20 20 20 20 20 23 20 63 68 ..... # ch
55c0: 61 6e 67 65 73 65 74 2e 0a 0a 20 20 20 20 74 79 angeset... ty
55d0: 70 65 6d 65 74 68 6f 64 20 61 6c 6c 20 20 20 20 pemethod all
55e0: 7b 7d 20 20 20 20 7b 20 72 65 74 75 72 6e 20 24 {} { return $
55f0: 6d 79 63 68 61 6e 67 65 73 65 74 73 20 7d 0a 20 mychangesets }.
5600: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6f 66 typemethod of
5610: 20 20 20 20 20 7b 63 69 64 7d 20 7b 20 72 65 74 {cid} { ret
5620: 75 72 6e 20 24 6d 79 69 64 6d 61 70 28 24 63 69 urn $myidmap($ci
5630: 64 29 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 d) }. typemet
5640: 68 6f 64 20 6f 66 69 74 65 6d 20 7b 69 69 64 7d hod ofitem {iid}
5650: 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 74 65 { return $myite
5660: 6d 6d 61 70 28 24 69 69 64 29 20 7d 0a 0a 20 20 mmap($iid) }..
5670: 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 # # ## ### ###
5680: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 ## ######## ####
5690: 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 #########. ##
56a0: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a Configuration..
56b0: 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 74 pragma -hast
56c0: 79 70 65 69 6e 66 6f 20 20 20 20 6e 6f 20 20 3b ypeinfo no ;
56d0: 20 23 20 6e 6f 20 74 79 70 65 20 69 6e 74 72 6f # no type intro
56e0: 73 70 65 63 74 69 6f 6e 0a 20 20 20 20 70 72 61 spection. pra
56f0: 67 6d 61 20 2d 68 61 73 69 6e 66 6f 20 20 20 20 gma -hasinfo
5700: 20 20 20 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 6f no ; # no o
5710: 62 6a 65 63 74 20 69 6e 74 72 6f 73 70 65 63 74 bject introspect
5720: 69 6f 6e 0a 0a 20 20 20 20 23 20 23 20 23 23 20 ion.. # # ##
5730: 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 ### ##### ######
5740: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 ## #############
5750: 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23 .}..# # ## ### #
5760: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 #### ######## ##
5770: 23 23 23 23 23 23 23 23 23 23 23 20 23 23 23 23 ########### ####
5780: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
5790: 23 0a 23 23 20 48 65 6c 70 65 72 20 73 69 6e 67 #.## Helper sing
57a0: 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20 leton. Commands
57b0: 66 6f 72 20 72 65 76 69 73 69 6f 6e 20 63 68 61 for revision cha
57c0: 6e 67 65 73 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a ngesets...snit::
57d0: 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 type ::vc::fossi
57e0: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a l::import::cvs::
57f0: 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 72 65 project::rev::re
5800: 76 20 7b 0a 20 20 20 20 74 79 70 65 6d 65 74 68 v {. typemeth
5810: 6f 64 20 62 79 72 65 76 69 73 69 6f 6e 20 7b 7d od byrevision {}
5820: 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 { return 1 }.
5830: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 73 typemethod bys
5840: 79 6d 62 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 74 ymbol {} { ret
5850: 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65 urn 0 }. type
5860: 6d 65 74 68 6f 64 20 69 73 74 61 67 20 20 20 20 method istag
5870: 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 {} { return 0
5880: 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 }. typemethod
5890: 20 69 73 62 72 61 6e 63 68 20 20 20 7b 7d 20 7b isbranch {} {
58a0: 20 72 65 74 75 72 6e 20 30 20 7d 0a 0a 20 20 20 return 0 }..
58b0: 20 74 79 70 65 6d 65 74 68 6f 64 20 73 74 72 20 typemethod str
58c0: 7b 72 65 76 69 73 69 6f 6e 7d 20 7b 0a 09 73 74 {revision} {..st
58d0: 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 ruct::list assig
58e0: 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 n [state run {..
58f0: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 65 76 SELECT R.rev
5900: 2c 20 46 2e 6e 61 6d 65 2c 20 50 2e 6e 61 6d 65 , F.name, P.name
5910: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 .. FROM rev
5920: 69 73 69 6f 6e 20 52 2c 20 66 69 6c 65 20 46 2c ision R, file F,
5930: 20 70 72 6f 6a 65 63 74 20 50 0a 09 20 20 20 20 project P..
5940: 57 48 45 52 45 20 20 52 2e 72 69 64 20 3d 20 24 WHERE R.rid = $
5950: 72 65 76 69 73 69 6f 6e 0a 09 20 20 20 20 41 4e revision.. AN
5960: 44 20 20 20 20 46 2e 66 69 64 20 3d 20 52 2e 66 D F.fid = R.f
5970: 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50 id.. AND P
5980: 2e 70 69 64 20 3d 20 46 2e 70 69 64 0a 09 7d 5d .pid = F.pid..}]
5990: 20 72 65 76 6e 72 20 66 6e 61 6d 65 20 70 6e 61 revnr fname pna
59a0: 6d 65 0a 09 72 65 74 75 72 6e 20 22 24 70 6e 61 me..return "$pna
59b0: 6d 65 2f 24 7b 72 65 76 6e 72 7d 3a 3a 24 66 6e me/${revnr}::$fn
59c0: 61 6d 65 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 ame". }..
59d0: 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 # result = list
59e0: 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74 69 6d (mintime, maxtim
59f0: 65 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f e). typemetho
5a00: 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 69 74 65 d timerange {ite
5a10: 6d 73 7d 20 7b 0a 09 73 65 74 20 74 68 65 73 65 ms} {..set these
5a20: 74 20 28 27 5b 6a 6f 69 6e 20 24 69 74 65 6d 73 t ('[join $items
5a30: 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 {','}]')..retur
5a40: 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 n [state run "..
5a50: 20 20 20 20 53 45 4c 45 43 54 20 4d 49 4e 28 52 SELECT MIN(R
5a60: 2e 64 61 74 65 29 2c 20 4d 41 58 28 52 2e 64 61 .date), MAX(R.da
5a70: 74 65 29 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 te).. FROM re
5a80: 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 vision R.. WH
5a90: 45 52 45 20 52 2e 72 69 64 20 49 4e 20 24 74 68 ERE R.rid IN $th
5aa0: 65 73 65 74 0a 09 22 5d 0a 20 20 20 20 7d 0a 0a eset.."]. }..
5ab0: 20 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 # var(dv) =
5ac0: 64 69 63 74 20 28 72 65 76 69 73 69 6f 6e 20 2d dict (revision -
5ad0: 3e 20 6c 69 73 74 20 28 72 65 76 69 73 69 6f 6e > list (revision
5ae0: 29 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f )). typemetho
5af0: 64 20 69 6e 74 65 72 6e 61 6c 73 75 63 63 65 73 d internalsucces
5b00: 73 6f 72 73 20 7b 64 76 20 72 65 76 69 73 69 6f sors {dv revisio
5b10: 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 ns} {..upvar 1 $
5b20: 64 76 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a dv dependencies.
5b30: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a .set theset ('[j
5b40: 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b oin $revisions {
5b50: 27 2c 27 7d 5d 27 29 0a 0a 09 23 20 53 65 65 20 ','}]')...# See
5b60: 27 73 75 63 63 65 73 73 6f 72 73 27 20 62 65 6c 'successors' bel
5b70: 6f 77 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 ow for the main
5b80: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 0a 09 explanation of..
5b90: 23 20 74 68 65 20 76 61 72 69 6f 75 73 20 63 61 # the various ca
5ba0: 73 65 73 2e 20 54 68 69 73 20 70 69 65 63 65 20 ses. This piece
5bb0: 69 73 20 73 70 65 63 69 61 6c 20 69 6e 20 74 68 is special in th
5bc0: 61 74 20 69 74 0a 09 23 20 72 65 73 74 72 69 63 at it..# restric
5bd0: 74 73 20 74 68 65 20 73 75 63 63 65 73 73 6f 72 ts the successor
5be0: 73 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 6f s we look for to
5bf0: 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 the same set of
5c00: 0a 09 23 20 72 65 76 69 73 69 6f 6e 73 20 77 65 ..# revisions we
5c10: 20 73 74 61 72 74 20 66 72 6f 6d 2e 20 53 65 6e start from. Sen
5c20: 73 69 62 6c 65 20 61 73 20 77 65 20 61 72 65 20 sible as we are
5c30: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 0a 09 23 20 63 looking for..# c
5c40: 68 61 6e 67 65 73 65 74 20 69 6e 74 65 72 6e 61 hangeset interna
5c50: 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 0a l dependencies..
5c60: 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 70 20 ..array set dep
5c70: 7b 7d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 {}...foreach {ri
5c80: 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 d child} [state
5c90: 72 75 6e 20 22 0a 20 20 20 2d 2d 20 28 31 29 20 run ". -- (1)
5ca0: 50 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 Primary child..
5cb0: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c SELECT R.rid,
5cc0: 20 52 2e 63 68 69 6c 64 0a 09 20 20 20 20 46 52 R.child.. FR
5cd0: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 0a OM revision R.
5ce0: 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 . WHERE R.ri
5cf0: 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 d IN $theset
5d00: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 -- Restrict t
5d10: 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 o revisions of i
5d20: 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 nterest.. AND
5d30: 20 20 20 20 52 2e 63 68 69 6c 64 20 49 53 20 4e R.child IS N
5d40: 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 OT NULL -- Ha
5d50: 73 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 0a s primary child.
5d60: 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 63 68 . AND R.ch
5d70: 69 6c 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 ild IN $theset
5d80: 20 20 20 2d 2d 20 57 68 69 63 68 20 69 73 20 61 -- Which is a
5d90: 6c 73 6f 20 6f 66 20 69 6e 74 65 72 65 73 74 0a lso of interest.
5da0: 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d UNION. --
5db0: 20 28 32 29 20 53 65 63 6f 6e 64 61 72 79 20 28 (2) Secondary (
5dc0: 62 72 61 6e 63 68 29 20 63 68 69 6c 64 72 65 6e branch) children
5dd0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 .. SELECT R.r
5de0: 69 64 2c 20 42 2e 62 72 69 64 0a 09 20 20 20 20 id, B.brid..
5df0: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 FROM revision
5e00: 52 2c 20 72 65 76 69 73 69 6f 6e 62 72 61 6e 63 R, revisionbranc
5e10: 68 63 68 69 6c 64 72 65 6e 20 42 0a 09 20 20 20 hchildren B..
5e20: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 WHERE R.rid
5e30: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d IN $theset -
5e40: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 - Restrict to re
5e50: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 visions of inter
5e60: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 est.. AND
5e70: 52 2e 72 69 64 20 3d 20 42 2e 72 69 64 20 20 20 R.rid = B.rid
5e80: 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 -- Select
5e90: 20 73 75 62 73 65 74 20 6f 66 20 62 72 61 6e 63 subset of branc
5ea0: 68 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 h children..
5eb0: 41 4e 44 20 20 20 20 42 2e 62 72 69 64 20 49 4e AND B.brid IN
5ec0: 20 24 74 68 65 73 65 74 20 20 20 20 20 20 2d 2d $theset --
5ed0: 20 57 68 69 63 68 20 69 73 20 61 6c 73 6f 20 6f Which is also o
5ee0: 66 20 69 6e 74 65 72 65 73 74 0a 20 20 20 20 55 f interest. U
5ef0: 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 34 29 20 NION. -- (4)
5f00: 43 68 69 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 Child of trunk r
5f10: 6f 6f 74 20 73 75 63 63 65 73 73 6f 72 20 6f 66 oot successor of
5f20: 20 6c 61 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 last NTDB on tr
5f30: 75 6e 6b 2e 0a 09 20 20 20 20 53 45 4c 45 43 54 unk... SELECT
5f40: 20 52 2e 72 69 64 2c 20 52 41 2e 63 68 69 6c 64 R.rid, RA.child
5f50: 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73 .. FROM revis
5f60: 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 ion R, revision
5f70: 52 41 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e RA.. WHERE R.
5f80: 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 rid IN $theset
5f90: 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 -- Restric
5fa0: 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f t to revisions o
5fb0: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 f interest..
5fc0: 41 4e 44 20 20 20 52 2e 69 73 64 65 66 61 75 6c AND R.isdefaul
5fd0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d t --
5fe0: 20 52 65 73 74 72 69 63 74 20 74 6f 20 4e 54 44 Restrict to NTD
5ff0: 42 0a 09 20 20 20 20 41 4e 44 20 20 20 52 2e 64 B.. AND R.d
6000: 62 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 bchild IS NOT NU
6010: 4c 4c 20 20 20 2d 2d 20 61 6e 64 20 6c 61 73 74 LL -- and last
6020: 20 4e 54 44 42 20 62 65 6c 6f 6e 67 69 6e 67 20 NTDB belonging
6030: 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20 41 4e to trunk.. AN
6040: 44 20 20 20 52 41 2e 72 69 64 20 3d 20 52 2e 64 D RA.rid = R.d
6050: 62 63 68 69 6c 64 20 20 20 20 20 20 2d 2d 20 47 bchild -- G
6060: 6f 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 72 o directly to tr
6070: 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 20 41 4e unk root.. AN
6080: 44 20 20 20 52 41 2e 63 68 69 6c 64 20 49 53 20 D RA.child IS
6090: 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 NOT NULL -- H
60a0: 61 73 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 as primary child
60b0: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e .. AN
60c0: 44 20 20 20 52 41 2e 63 68 69 6c 64 20 49 4e 20 D RA.child IN
60d0: 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 57 $theset -- W
60e0: 68 69 63 68 20 69 73 20 61 6c 73 6f 20 6f 66 20 hich is also of
60f0: 69 6e 74 65 72 65 73 74 0a 09 22 5d 20 7b 0a 09 interest.."] {..
6100: 20 20 20 20 23 20 43 6f 6e 73 69 64 65 72 20 6d # Consider m
6110: 6f 76 69 6e 67 20 74 68 69 73 20 74 6f 20 74 68 oving this to th
6120: 65 20 69 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 e integrity modu
6130: 6c 65 2e 0a 09 20 20 20 20 69 6e 74 65 67 72 69 le... integri
6140: 74 79 20 61 73 73 65 72 74 20 7b 24 72 69 64 20 ty assert {$rid
6150: 21 3d 20 24 63 68 69 6c 64 7d 20 7b 52 65 76 69 != $child} {Revi
6160: 73 69 6f 6e 20 24 72 69 64 20 64 65 70 65 6e 64 sion $rid depend
6170: 73 20 6f 6e 20 69 74 73 65 6c 66 2e 7d 0a 09 20 s on itself.}..
6180: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e lappend depen
6190: 64 65 6e 63 69 65 73 28 24 72 69 64 29 20 24 63 dencies($rid) $c
61a0: 68 69 6c 64 0a 09 20 20 20 20 73 65 74 20 64 65 hild.. set de
61b0: 70 28 24 72 69 64 2c 24 63 68 69 6c 64 29 20 2e p($rid,$child) .
61c0: 0a 09 7d 0a 0a 09 23 20 54 68 65 20 73 71 6c 20 ..}...# The sql
61d0: 73 74 61 74 65 6d 65 6e 74 73 20 61 62 6f 76 65 statements above
61e0: 20 6c 6f 6f 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 looks only for
61f0: 64 69 72 65 63 74 20 64 65 70 65 6e 64 65 6e 63 direct dependenc
6200: 69 65 73 0a 09 23 20 62 65 74 77 65 65 6e 20 72 ies..# between r
6210: 65 76 69 73 69 6f 6e 20 69 6e 20 74 68 65 20 63 evision in the c
6220: 68 61 6e 67 65 73 65 74 2e 20 48 6f 77 65 76 65 hangeset. Howeve
6230: 72 20 64 75 65 20 74 6f 20 74 68 65 0a 09 23 20 r due to the..#
6240: 76 61 67 61 72 69 65 73 20 6f 66 20 6d 65 74 61 vagaries of meta
6250: 20 64 61 74 61 20 69 74 20 69 73 20 70 6f 73 73 data it is poss
6260: 69 62 6c 65 20 66 6f 72 20 74 77 6f 20 72 65 76 ible for two rev
6270: 69 73 69 6f 6e 73 20 6f 66 0a 09 23 20 74 68 65 isions of..# the
6280: 20 73 61 6d 65 20 66 69 6c 65 20 74 6f 20 65 6e same file to en
6290: 64 20 75 70 20 69 6e 20 74 68 65 20 73 61 6d 65 d up in the same
62a0: 20 63 68 61 6e 67 65 73 65 74 2c 20 77 69 74 68 changeset, with
62b0: 6f 75 74 20 61 0a 09 23 20 64 69 72 65 63 74 20 out a..# direct
62c0: 64 65 70 65 6e 64 65 6e 63 79 20 62 65 74 77 65 dependency betwe
62d0: 65 6e 20 74 68 65 6d 2e 20 48 6f 77 65 76 65 72 en them. However
62e0: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 we know that th
62f0: 65 72 65 0a 09 23 20 68 61 73 20 74 6f 20 62 65 ere..# has to be
6300: 20 61 20 61 6e 20 69 6e 64 69 72 65 63 74 20 64 a an indirect d
6310: 65 70 65 6e 64 65 6e 63 79 2c 20 62 65 20 69 74 ependency, be it
6320: 20 74 68 72 6f 75 67 68 20 70 72 69 6d 61 72 79 through primary
6330: 0a 09 23 20 63 68 69 6c 64 72 65 6e 2c 20 62 72 ..# children, br
6340: 61 6e 63 68 20 63 68 69 6c 64 72 65 6e 2c 20 6f anch children, o
6350: 72 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 r a combination
6360: 74 68 65 72 65 6f 66 2e 0a 0a 09 23 20 57 65 20 thereof....# We
6370: 6e 6f 77 20 66 69 6c 6c 20 69 6e 20 74 68 65 73 now fill in thes
6380: 65 20 70 73 65 75 64 6f 2d 64 65 70 65 6e 64 65 e pseudo-depende
6390: 6e 63 69 65 73 2c 20 69 66 20 6e 6f 20 73 75 63 ncies, if no suc
63a0: 68 0a 09 23 20 64 65 70 65 6e 64 65 6e 63 79 20 h..# dependency
63b0: 65 78 69 73 74 73 20 61 6c 72 65 61 64 79 2e 20 exists already.
63c0: 54 68 65 20 64 69 72 65 63 74 69 6f 6e 20 6f 66 The direction of
63d0: 20 74 68 65 20 64 65 70 65 6e 64 65 6e 63 79 0a the dependency.
63e0: 09 23 20 69 73 20 61 63 74 75 61 6c 6c 79 20 69 .# is actually i
63f0: 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 74 68 rrelevant for th
6400: 69 73 2e 0a 0a 09 23 20 4e 4f 54 45 3a 20 54 68 is....# NOTE: Th
6410: 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 is is different
6420: 66 72 6f 6d 20 63 76 73 32 73 76 6e 2e 20 4f 75 from cvs2svn. Ou
6430: 72 20 73 70 69 72 69 74 75 61 6c 20 61 6e 63 65 r spiritual ance
6440: 73 74 6f 72 0a 09 23 20 64 6f 65 73 20 6e 6f 74 stor..# does not
6450: 20 75 73 65 20 73 75 63 68 20 70 73 65 75 64 6f use such pseudo
6460: 2d 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 68 -dependencies, h
6470: 6f 77 65 76 65 72 20 69 74 20 75 73 65 73 20 61 owever it uses a
6480: 0a 09 23 20 43 4f 4d 4d 49 54 5f 54 48 52 45 53 ..# COMMIT_THRES
6490: 48 4f 4c 44 2c 20 61 20 74 69 6d 65 20 69 6e 74 HOLD, a time int
64a0: 65 72 76 61 6c 20 63 6f 6d 6d 69 74 73 20 73 68 erval commits sh
64b0: 6f 75 6c 64 20 66 61 6c 6c 2e 20 54 68 69 73 0a ould fall. This.
64c0: 09 23 20 77 69 6c 6c 20 67 72 65 61 74 6c 79 20 .# will greatly
64d0: 72 65 64 75 63 65 73 20 74 68 65 20 72 69 73 6b reduces the risk
64e0: 20 6f 66 20 67 65 74 74 69 6e 67 20 66 61 72 20 of getting far
64f0: 73 65 70 61 72 61 74 65 64 0a 09 23 20 72 65 76 separated..# rev
6500: 69 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 61 isions of the sa
6510: 6d 65 20 66 69 6c 65 20 69 6e 74 6f 20 6f 6e 65 me file into one
6520: 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 23 20 changeset....#
6530: 57 65 20 61 6c 6c 6f 77 20 72 65 76 69 73 69 6f We allow revisio
6540: 6e 73 20 74 6f 20 62 65 20 66 61 72 20 61 70 61 ns to be far apa
6550: 72 74 20 69 6e 20 74 69 6d 65 20 69 6e 20 74 68 rt in time in th
6560: 65 20 73 61 6d 65 0a 09 23 20 63 68 61 6e 67 65 e same..# change
6570: 73 65 74 2c 20 62 75 74 20 6e 65 65 64 20 74 68 set, but need th
6580: 65 20 70 73 65 75 64 6f 2d 64 65 70 65 6e 64 65 e pseudo-depende
6590: 6e 63 69 65 73 20 66 6f 72 20 74 68 69 73 2e 0a ncies for this..
65a0: 0a 09 61 72 72 61 79 20 73 65 74 20 66 69 64 73 ..array set fids
65b0: 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 {}..foreach {ri
65c0: 64 20 66 69 64 7d 20 5b 73 74 61 74 65 20 72 75 d fid} [state ru
65d0: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 n ".. SELECT
65e0: 52 2e 72 69 64 2c 20 52 2e 66 69 64 20 46 52 4f R.rid, R.fid FRO
65f0: 4d 20 72 65 76 69 73 69 6f 6e 20 52 20 57 48 45 M revision R WHE
6600: 52 45 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 RE R.rid IN $the
6610: 73 65 74 0a 09 22 5d 20 7b 20 6c 61 70 70 65 6e set.."] { lappen
6620: 64 20 66 69 64 73 28 24 66 69 64 29 20 24 72 69 d fids($fid) $ri
6630: 64 20 7d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 66 d }...foreach {f
6640: 69 64 20 72 69 64 73 7d 20 5b 61 72 72 61 79 20 id rids} [array
6650: 67 65 74 20 66 69 64 73 5d 20 7b 0a 09 20 20 20 get fids] {..
6660: 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 72 if {[llength $r
6670: 69 64 73 5d 20 3c 20 32 7d 20 63 6f 6e 74 69 6e ids] < 2} contin
6680: 75 65 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 ue.. foreach
6690: 61 20 24 72 69 64 73 20 7b 0a 09 09 66 6f 72 65 a $rids {...fore
66a0: 61 63 68 20 62 20 24 72 69 64 73 20 7b 0a 09 09 ach b $rids {...
66b0: 20 20 20 20 69 66 20 7b 24 61 20 3d 3d 20 24 62 if {$a == $b
66c0: 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 09 20 20 20 } continue...
66d0: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 if {[info exist
66e0: 73 20 64 65 70 28 24 61 2c 24 62 29 5d 7d 20 63 s dep($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 62 2c 24 61 29 5d 7d 20 63 6f 6e 74 ep($b,$a)]} cont
6720: 69 6e 75 65 0a 09 09 20 20 20 20 6c 61 70 70 65 inue... lappe
6730: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 nd dependencies(
6740: 24 61 29 20 24 62 0a 09 09 20 20 20 20 73 65 74 $a) $b... set
6750: 20 64 65 70 28 24 61 2c 24 62 29 20 2e 0a 09 09 dep($a,$b) ....
6760: 20 20 20 20 73 65 74 20 64 65 70 28 24 62 2c 24 set dep($b,$
6770: 61 29 20 2e 0a 09 09 7d 0a 09 20 20 20 20 7d 0a a) ....}.. }.
6780: 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d .}..return. }
6790: 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76 29 20 .. # var(dv)
67a0: 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 = dict (item ->
67b0: 6c 69 73 74 20 28 69 74 65 6d 29 29 2c 20 69 74 list (item)), it
67c0: 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 79 70 65 em = list (type
67d0: 20 69 64 29 0a 20 20 20 20 74 79 70 65 6d 65 74 id). typemet
67e0: 68 6f 64 20 73 75 63 63 65 73 73 6f 72 73 20 7b hod successors {
67f0: 64 76 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a dv revisions} {.
6800: 09 75 70 76 61 72 20 31 20 24 64 76 20 64 65 70 .upvar 1 $dv dep
6810: 65 6e 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74 endencies..set t
6820: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 heset ('[join $r
6830: 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 evisions {','}]'
6840: 29 0a 0a 09 23 20 54 68 65 20 66 6f 6c 6c 6f 77 )...# The follow
6850: 69 6e 67 20 63 61 73 65 73 20 73 70 65 63 69 66 ing cases specif
6860: 79 20 77 68 65 6e 20 61 20 72 65 76 69 73 69 6f y when a revisio
6870: 6e 20 53 20 69 73 20 61 20 73 75 63 63 65 73 73 n S is a success
6880: 6f 72 0a 09 23 20 6f 66 20 61 20 72 65 76 69 73 or..# of a revis
6890: 69 6f 6e 20 52 2e 20 45 61 63 68 20 6f 66 20 74 ion R. Each of t
68a0: 68 65 20 63 61 73 65 73 20 74 72 61 6e 73 6c 61 he cases transla
68b0: 74 65 73 20 69 6e 74 6f 20 6f 6e 65 20 6f 66 0a tes into one of.
68c0: 09 23 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 .# the branches
68d0: 6f 66 20 74 68 65 20 53 51 4c 20 55 4e 49 4f 4e of the SQL UNION
68e0: 20 63 6f 6d 69 6e 67 20 62 65 6c 6f 77 2e 0a 09 coming below...
68f0: 23 0a 09 23 20 28 31 29 20 53 20 63 61 6e 20 62 #..# (1) S can b
6900: 65 20 61 20 70 72 69 6d 61 72 79 20 63 68 69 6c e a primary chil
6910: 64 20 6f 66 20 52 2c 20 69 2e 65 2e 20 69 6e 20 d of R, i.e. in
6920: 74 68 65 20 73 61 6d 65 20 4c 4f 44 2e 20 52 0a the same LOD. R.
6930: 09 23 20 20 20 20 20 72 65 66 65 72 65 6e 63 65 .# reference
6940: 73 20 53 20 64 69 72 65 63 74 6c 79 2e 20 52 2e s S directly. R.
6950: 63 68 69 6c 64 20 3d 20 53 28 2e 72 69 64 29 2c child = S(.rid),
6960: 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a 09 if it exists...
6970: 23 0a 09 23 20 28 32 29 20 53 20 63 61 6e 20 62 #..# (2) S can b
6980: 65 20 61 20 73 65 63 6f 6e 64 61 72 79 2c 20 69 e a secondary, i
6990: 2e 65 2e 20 62 72 61 6e 63 68 2c 20 63 68 69 6c .e. branch, chil
69a0: 64 20 6f 66 20 52 2e 20 48 65 72 65 20 74 68 65 d of R. Here the
69b0: 0a 09 23 20 20 20 20 20 6c 69 6e 6b 20 69 73 20 ..# link is
69c0: 6d 61 64 65 20 74 68 72 6f 75 67 68 20 74 68 65 made through the
69d0: 20 68 65 6c 70 65 72 20 74 61 62 6c 65 0a 09 23 helper table..#
69e0: 20 20 20 20 20 52 45 56 49 53 49 4f 4e 42 52 41 REVISIONBRA
69f0: 4e 43 48 43 48 49 4c 44 52 45 4e 2e 20 52 2e 72 NCHCHILDREN. R.r
6a00: 69 64 20 2d 3e 20 52 42 43 2e 72 69 64 2c 20 52 id -> RBC.rid, R
6a10: 42 43 2e 62 72 69 64 20 3d 0a 09 23 20 20 20 20 BC.brid =..#
6a20: 20 53 28 2e 72 69 64 29 0a 09 23 0a 09 23 20 28 S(.rid)..#..# (
6a30: 33 29 20 4f 72 69 67 69 6e 61 6c 6c 79 20 74 68 3) Originally th
6a40: 69 73 20 75 73 65 20 63 61 73 65 20 64 65 66 69 is use case defi
6a50: 6e 65 64 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 ned the root of
6a60: 61 20 64 65 74 61 63 68 65 64 0a 09 23 20 20 20 a detached..#
6a70: 20 20 4e 54 44 42 20 61 73 20 74 68 65 20 73 75 NTDB as the su
6a80: 63 63 65 73 73 6f 72 20 6f 66 20 74 68 65 20 74 ccessor of the t
6a90: 72 75 6e 6b 20 72 6f 6f 74 2e 20 54 68 69 73 20 runk root. This
6aa0: 6c 65 61 64 73 20 74 6f 20 61 0a 09 23 20 20 20 leads to a..#
6ab0: 20 20 62 61 64 20 74 61 6e 67 6c 65 20 6c 61 74 bad tangle lat
6ac0: 65 72 20 6f 6e 2e 20 57 69 74 68 20 61 20 64 65 er on. With a de
6ad0: 74 61 63 68 65 64 20 4e 54 44 42 20 74 68 65 20 tached NTDB the
6ae0: 6f 72 69 67 69 6e 61 6c 0a 09 23 20 20 20 20 20 original..#
6af0: 74 72 75 6e 6b 20 72 6f 6f 74 20 72 65 76 69 73 trunk root revis
6b00: 69 6f 6e 20 77 61 73 20 72 65 6d 6f 76 65 64 20 ion was removed
6b10: 61 73 20 69 72 72 65 6c 65 76 61 6e 74 2c 20 61 as irrelevant, a
6b20: 6c 6c 6f 77 69 6e 67 0a 09 23 20 20 20 20 20 74 llowing..# t
6b30: 68 65 20 6e 6f 6d 69 6e 61 6c 20 72 6f 6f 74 20 he nominal root
6b40: 74 6f 20 62 65 20 6c 61 74 65 72 20 69 6e 20 74 to be later in t
6b50: 69 6d 65 20 74 68 61 6e 20 74 68 65 20 4e 54 44 ime than the NTD
6b60: 42 0a 09 23 20 20 20 20 20 72 6f 6f 74 2e 20 4e B..# root. N
6b70: 6f 77 20 73 65 74 74 69 6e 67 20 74 68 69 73 20 ow setting this
6b80: 64 65 70 65 6e 64 65 6e 63 79 20 77 69 6c 6c 20 dependency will
6b90: 62 65 20 62 61 63 6b 77 61 72 64 20 69 6e 0a 09 be backward in..
6ba0: 23 20 20 20 20 20 74 69 6d 65 2e 20 52 45 4d 4f # time. REMO
6bb0: 56 45 44 2e 0a 09 23 0a 09 23 20 28 34 29 20 49 VED...#..# (4) I
6bc0: 66 20 52 20 69 73 20 74 68 65 20 6c 61 73 74 20 f R is the last
6bd0: 6f 66 20 74 68 65 20 4e 54 44 42 20 72 65 76 69 of the NTDB revi
6be0: 73 69 6f 6e 73 20 77 68 69 63 68 20 62 65 6c 6f sions which belo
6bf0: 6e 67 20 74 6f 0a 09 23 20 20 20 20 20 74 68 65 ng to..# the
6c00: 20 74 72 75 6e 6b 2c 20 74 68 65 6e 20 74 68 65 trunk, then the
6c10: 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 20 6f primary child o
6c20: 66 20 74 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74 f the trunk root
6c30: 20 28 74 68 65 0a 09 23 20 20 20 20 20 27 31 2e (the..# '1.
6c40: 32 27 20 72 65 76 69 73 69 6f 6e 29 20 69 73 20 2' revision) is
6c50: 61 20 73 75 63 63 65 73 73 6f 72 2c 20 69 66 20 a successor, if
6c60: 69 74 20 65 78 69 73 74 73 2e 0a 0a 09 23 20 4e it exists....# N
6c70: 6f 74 65 20 74 68 61 74 20 74 68 65 20 62 72 61 ote that the bra
6c80: 6e 63 68 65 73 20 73 70 61 77 6e 65 64 20 66 72 nches spawned fr
6c90: 6f 6d 20 74 68 65 20 72 65 76 69 73 69 6f 6e 73 om the revisions
6ca0: 2c 20 61 6e 64 20 74 68 65 0a 09 23 20 74 61 67 , and the..# tag
6cb0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 s associated wit
6cc0: 68 20 74 68 65 6d 20 61 72 65 20 73 75 63 63 65 h them are succe
6cd0: 73 73 6f 72 73 20 61 73 20 77 65 6c 6c 2e 0a 0a ssors as well...
6ce0: 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68 .foreach {rid ch
6cf0: 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 ild} [state run
6d00: 22 0a 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d ". -- (1) Prim
6d10: 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20 53 ary child.. S
6d20: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63 ELECT R.rid, R.c
6d30: 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 hild.. FROM
6d40: 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 revision R..
6d50: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 WHERE R.rid
6d60: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d IN $theset -
6d70: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 - Restrict to re
6d80: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 visions of inter
6d90: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 est.. AND
6da0: 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e R.child IS NOT N
6db0: 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 ULL -- Has pr
6dc0: 69 6d 61 72 79 20 63 68 69 6c 64 0a 20 20 20 20 imary child.
6dd0: 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32 29 UNION. -- (2)
6de0: 20 53 65 63 6f 6e 64 61 72 79 20 28 62 72 61 6e Secondary (bran
6df0: 63 68 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 ch) children..
6e00: 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 SELECT R.rid,
6e10: 42 2e 62 72 69 64 0a 09 20 20 20 20 46 52 4f 4d B.brid.. FROM
6e20: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 revision R, r
6e30: 65 76 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 69 evisionbranchchi
6e40: 6c 64 72 65 6e 20 42 0a 09 20 20 20 20 57 48 45 ldren B.. WHE
6e50: 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 RE R.rid IN $
6e60: 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65 theset -- Re
6e70: 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 strict to revisi
6e80: 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a ons of interest.
6e90: 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72 69 . AND R.ri
6ea0: 64 20 3d 20 42 2e 72 69 64 20 20 20 20 20 20 20 d = B.rid
6eb0: 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 73 75 62 -- Select sub
6ec0: 73 65 74 20 6f 66 20 62 72 61 6e 63 68 20 63 68 set of branch ch
6ed0: 69 6c 64 72 65 6e 0a 20 20 20 20 55 4e 49 4f 4e ildren. UNION
6ee0: 0a 20 20 20 20 2d 2d 20 28 34 29 20 43 68 69 6c . -- (4) Chil
6ef0: 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 20 d of trunk root
6f00: 73 75 63 63 65 73 73 6f 72 20 6f 66 20 6c 61 73 successor of las
6f10: 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b 2e t NTDB on trunk.
6f20: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 .. SELECT R.r
6f30: 69 64 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20 20 id, RA.child..
6f40: 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 FROM revision
6f50: 52 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 0a 09 R, revision RA..
6f60: 20 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 WHERE R.rid
6f70: 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 IN $theset
6f80: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f -- Restrict to
6f90: 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e revisions of in
6fa0: 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 terest.. AND
6fb0: 20 20 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20 R.isdefault
6fc0: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 -- Res
6fd0: 74 72 69 63 74 20 74 6f 20 4e 54 44 42 0a 09 20 trict to NTDB..
6fe0: 20 20 20 41 4e 44 20 20 20 52 2e 64 62 63 68 69 AND R.dbchi
6ff0: 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 ld IS NOT NULL
7000: 20 2d 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 -- and last NTD
7010: 42 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 B belonging to t
7020: 72 75 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 runk.. AND
7030: 52 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69 RA.rid = R.dbchi
7040: 6c 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 ld -- Go di
7050: 72 65 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 rectly to trunk
7060: 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 root.. AND
7070: 52 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 RA.child IS NOT
7080: 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 NULL -- Has p
7090: 72 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 09 22 rimary child..."
70a0: 5d 20 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 69 ] {.. # Consi
70b0: 64 65 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 20 der moving this
70c0: 74 6f 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 to the integrity
70d0: 20 6d 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 6e module... in
70e0: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b tegrity assert {
70f0: 24 72 69 64 20 21 3d 20 24 63 68 69 6c 64 7d 20 $rid != $child}
7100: 7b 52 65 76 69 73 69 6f 6e 20 24 72 69 64 20 64 {Revision $rid d
7110: 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 epends on itself
7120: 2e 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 .}.. lappend
7130: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 dependencies([li
7140: 73 74 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c st rev $rid]) [l
7150: 69 73 74 20 72 65 76 20 24 63 68 69 6c 64 5d 0a ist rev $child].
7160: 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 .}..foreach {rid
7170: 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 child} [state r
7180: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 un ".. SELECT
7190: 20 52 2e 72 69 64 2c 20 54 2e 74 69 64 0a 09 20 R.rid, T.tid..
71a0: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 FROM revisi
71b0: 6f 6e 20 52 2c 20 74 61 67 20 54 0a 09 20 20 20 on R, tag T..
71c0: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 69 6e WHERE R.rid in
71d0: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e $theset.. AN
71e0: 44 20 20 20 20 54 2e 72 65 76 20 3d 20 52 2e 72 D T.rev = R.r
71f0: 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 id.."] {.. la
7200: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 ppend dependenci
7210: 65 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 es([list rev $ri
7220: 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 d]) [list sym::t
7230: 61 67 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 ag $child]..}..f
7240: 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c oreach {rid chil
7250: 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a d} [state run ".
7260: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 . SELECT R.ri
7270: 64 2c 20 42 2e 62 69 64 0a 09 20 20 20 20 46 52 d, B.bid.. FR
7280: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c OM revision R,
7290: 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20 20 57 branch B.. W
72a0: 48 45 52 45 20 20 52 2e 72 69 64 20 69 6e 20 24 HERE R.rid in $
72b0: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 theset.. AND
72c0: 20 20 20 42 2e 72 6f 6f 74 20 3d 20 52 2e 72 69 B.root = R.ri
72d0: 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 d.."] {.. lap
72e0: 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 pend dependencie
72f0: 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64 s([list rev $rid
7300: 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 ]) [list sym::br
7310: 61 6e 63 68 20 24 63 68 69 6c 64 5d 0a 09 7d 0a anch $child]..}.
7320: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 .return. }..
7330: 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 # var(dv) = d
7340: 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 ict (item -> lis
7350: 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 t (item)), item
7360: 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69 64 = list (type id
7370: 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 ). typemethod
7380: 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 7b 64 predecessors {d
7390: 76 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 v revisions} {..
73a0: 75 70 76 61 72 20 31 20 24 64 76 20 64 65 70 65 upvar 1 $dv depe
73b0: 6e 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74 68 ndencies..set th
73c0: 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 eset ('[join $re
73d0: 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 visions {','}]')
73e0: 0a 0a 09 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 ...# The followi
73f0: 6e 67 20 63 61 73 65 73 20 73 70 65 63 69 66 79 ng cases specify
7400: 20 77 68 65 6e 20 61 20 72 65 76 69 73 69 6f 6e when a revision
7410: 20 50 20 69 73 20 61 0a 09 23 20 70 72 65 64 65 P is a..# prede
7420: 63 65 73 73 6f 72 20 6f 66 20 61 20 72 65 76 69 cessor of a revi
7430: 73 69 6f 6e 20 52 2e 20 45 61 63 68 20 6f 66 20 sion R. Each of
7440: 74 68 65 20 63 61 73 65 73 20 74 72 61 6e 73 6c the cases transl
7450: 61 74 65 73 0a 09 23 20 69 6e 74 6f 20 6f 6e 65 ates..# into one
7460: 20 6f 66 20 74 68 65 20 62 72 61 6e 63 68 65 73 of the branches
7470: 20 6f 66 20 74 68 65 20 53 51 4c 20 55 4e 49 4f of the SQL UNIO
7480: 4e 20 63 6f 6d 69 6e 67 20 62 65 6c 6f 77 2e 0a N coming below..
7490: 09 23 0a 09 23 20 28 31 29 20 54 68 65 20 69 6d .#..# (1) The im
74a0: 6d 65 64 69 61 74 65 20 70 61 72 65 6e 74 20 52 mediate parent R
74b0: 2e 70 61 72 65 6e 74 20 6f 66 20 52 20 69 73 20 .parent of R is
74c0: 61 20 70 72 65 64 65 63 65 73 73 6f 72 20 6f 66 a predecessor of
74d0: 0a 09 23 20 20 20 20 20 52 2e 20 4e 4f 54 45 3a ..# R. NOTE:
74e0: 20 54 68 69 73 20 69 73 20 74 72 75 65 20 66 6f This is true fo
74f0: 72 20 52 20 65 69 74 68 65 72 20 70 72 69 6d 61 r R either prima
7500: 72 79 20 6f 72 20 73 65 63 6f 6e 64 61 72 79 0a ry or secondary.
7510: 09 23 20 20 20 20 20 63 68 69 6c 64 20 6f 66 20 .# child of
7520: 50 2e 20 49 74 20 6e 6f 74 20 6e 65 63 65 73 73 P. It not necess
7530: 61 72 79 20 74 6f 20 64 69 73 74 69 6e 67 75 69 ary to distingui
7540: 73 68 20 74 68 65 20 74 77 6f 0a 09 23 20 20 20 sh the two..#
7550: 20 20 63 61 73 65 73 2c 20 69 6e 20 63 6f 6e 74 cases, in cont
7560: 72 61 73 74 20 74 6f 20 74 68 65 20 63 6f 64 65 rast to the code
7570: 20 72 65 74 72 69 65 76 69 6e 67 20 74 68 65 20 retrieving the
7580: 73 75 63 63 65 73 73 6f 72 0a 09 23 20 20 20 20 successor..#
7590: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 09 23 information...#
75a0: 0a 09 23 20 28 32 29 20 54 68 65 20 63 6f 6d 70 ..# (2) The comp
75b0: 6c 65 6d 65 6e 74 20 6f 66 20 73 75 63 63 65 73 lement of succes
75c0: 73 6f 72 20 63 61 73 65 20 28 33 29 2e 20 54 68 sor case (3). Th
75d0: 65 20 74 72 75 6e 6b 20 72 6f 6f 74 20 69 73 0a e trunk root is.
75e0: 09 23 20 20 20 20 20 61 20 70 72 65 64 65 63 65 .# a predece
75f0: 73 73 6f 72 20 6f 66 20 61 20 4e 54 44 42 20 72 ssor of a NTDB r
7600: 6f 6f 74 2e 20 52 45 4d 4f 56 45 44 2e 20 53 65 oot. REMOVED. Se
7610: 65 20 27 73 75 63 63 65 73 73 6f 72 73 27 0a 09 e 'successors'..
7620: 23 20 20 20 20 20 66 6f 72 20 74 68 65 20 65 78 # for the ex
7630: 70 6c 61 6e 61 74 69 6f 6e 2e 0a 09 23 0a 09 23 planation...#..#
7640: 20 28 33 29 20 54 68 65 20 63 6f 6d 70 6c 65 6d (3) The complem
7650: 65 6e 74 20 6f 66 20 73 75 63 63 65 73 73 6f 72 ent of successor
7660: 20 63 61 73 65 20 28 34 29 2e 20 54 68 65 20 6c case (4). The l
7670: 61 73 74 20 4e 54 44 42 0a 09 23 20 20 20 20 20 ast NTDB..#
7680: 72 65 76 69 73 69 6f 6e 20 62 65 6c 6f 6e 67 69 revision belongi
7690: 6e 67 20 74 6f 20 74 68 65 20 74 72 75 6e 6b 20 ng to the trunk
76a0: 69 73 20 61 20 70 72 65 64 65 63 65 73 73 6f 72 is a predecessor
76b0: 20 6f 66 20 74 68 65 0a 09 23 20 20 20 20 20 70 of the..# p
76c0: 72 69 6d 61 72 79 20 63 68 69 6c 64 20 6f 66 20 rimary child of
76d0: 74 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74 20 28 the trunk root (
76e0: 54 68 65 20 27 31 2e 32 27 20 72 65 76 69 73 69 The '1.2' revisi
76f0: 6f 6e 29 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b on)....foreach {
7700: 72 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 rid parent} [sta
7710: 74 65 20 72 75 6e 20 22 0a 20 20 20 2d 2d 20 28 te run ". -- (
7720: 31 29 20 50 72 69 6d 61 72 79 20 70 61 72 65 6e 1) Primary paren
7730: 74 2c 20 63 61 6e 20 62 65 20 69 6e 20 64 69 66 t, can be in dif
7740: 66 65 72 65 6e 74 20 4c 4f 44 20 66 6f 72 20 66 ferent LOD for f
7750: 69 72 73 74 20 69 6e 20 61 20 62 72 61 6e 63 68 irst in a branch
7760: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 .. SELECT R.r
7770: 69 64 2c 20 52 2e 70 61 72 65 6e 74 0a 09 20 20 id, R.parent..
7780: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f FROM revisio
7790: 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 n R.. WHERE
77a0: 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 R.rid IN $thes
77b0: 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 et -- Restri
77c0: 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 ct to revisions
77d0: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 of interest..
77e0: 20 41 4e 44 20 20 20 20 52 2e 70 61 72 65 6e 74 AND R.parent
77f0: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d IS NOT NULL -
7800: 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 70 61 - Has primary pa
7810: 72 65 6e 74 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 rent. UNION.
7820: 20 20 20 2d 2d 20 28 33 29 20 4c 61 73 74 20 4e -- (3) Last N
7830: 54 44 42 20 6f 6e 20 74 72 75 6e 6b 20 69 73 20 TDB on trunk is
7840: 70 72 65 64 65 63 65 73 73 6f 72 20 6f 66 20 63 predecessor of c
7850: 68 69 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f hild of trunk ro
7860: 6f 74 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 ot.. SELECT R
7870: 2e 72 69 64 2c 20 52 41 2e 64 62 70 61 72 65 6e .rid, RA.dbparen
7880: 74 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 t.. FROM re
7890: 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 vision R, revisi
78a0: 6f 6e 20 52 41 0a 09 20 20 20 20 57 48 45 52 45 on RA.. WHERE
78b0: 20 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 R.rid IN $thes
78c0: 65 74 20 20 20 20 20 20 20 20 20 2d 2d 20 52 65 et -- Re
78d0: 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 strict to revisi
78e0: 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a ons of interest.
78f0: 09 20 20 20 20 41 4e 44 20 20 20 20 4e 4f 54 20 . AND NOT
7900: 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20 20 R.isdefault
7910: 20 20 20 20 20 2d 2d 20 6e 6f 74 20 6f 6e 20 4e -- not on N
7920: 54 44 42 0a 09 20 20 20 20 41 4e 44 20 20 20 20 TDB.. AND
7930: 52 2e 70 61 72 65 6e 74 20 49 53 20 4e 4f 54 20 R.parent IS NOT
7940: 4e 55 4c 4c 20 20 20 20 20 2d 2d 20 77 68 69 63 NULL -- whic
7950: 68 20 61 72 65 20 6e 6f 74 20 72 6f 6f 74 0a 09 h are not root..
7960: 20 20 20 20 41 4e 44 20 20 20 20 52 41 2e 72 69 AND RA.ri
7970: 64 20 3d 20 52 2e 70 61 72 65 6e 74 20 20 20 20 d = R.parent
7980: 20 20 20 20 2d 2d 20 67 6f 20 74 6f 20 74 68 65 -- go to the
7990: 69 72 20 70 61 72 65 6e 74 0a 09 20 20 20 20 41 ir parent.. A
79a0: 4e 44 20 20 20 20 52 41 2e 64 62 70 61 72 65 6e ND RA.dbparen
79b0: 74 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 2d t IS NOT NULL -
79c0: 2d 20 77 68 69 63 68 20 68 61 73 20 74 6f 20 72 - which has to r
79d0: 65 66 65 72 20 74 6f 20 4e 54 44 42 27 73 20 72 efer to NTDB's r
79e0: 6f 6f 74 0a 09 22 5d 20 7b 0a 09 20 20 20 20 23 oot.."] {.. #
79f0: 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69 6e 67 Consider moving
7a00: 20 74 68 69 73 20 74 6f 20 74 68 65 20 69 6e 74 this to the int
7a10: 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e 0a 09 egrity module...
7a20: 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 integrity as
7a30: 73 65 72 74 20 7b 24 72 69 64 20 21 3d 20 24 70 sert {$rid != $p
7a40: 61 72 65 6e 74 7d 20 7b 52 65 76 69 73 69 6f 6e arent} {Revision
7a50: 20 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f 6e $rid depends on
7a60: 20 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20 6c itself.}.. l
7a70: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 append dependenc
7a80: 69 65 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72 ies([list rev $r
7a90: 69 64 5d 29 20 5b 6c 69 73 74 20 72 65 76 20 24 id]) [list rev $
7aa0: 70 61 72 65 6e 74 5d 0a 09 7d 0a 0a 09 23 20 54 parent]..}...# T
7ab0: 68 65 20 72 65 76 69 73 69 6f 6e 73 20 77 68 69 he revisions whi
7ac0: 63 68 20 61 72 65 20 74 68 65 20 66 69 72 73 74 ch are the first
7ad0: 20 6f 6e 20 61 20 62 72 61 6e 63 68 20 68 61 76 on a branch hav
7ae0: 65 20 74 68 61 74 0a 09 23 20 62 72 61 6e 63 68 e that..# branch
7af0: 20 61 73 20 74 68 65 69 72 20 70 72 65 64 65 63 as their predec
7b00: 65 73 73 6f 72 2e 20 4e 6f 74 65 20 74 68 61 74 essor. Note that
7b10: 20 72 65 76 69 73 69 6f 6e 73 20 63 61 6e 6e 6f revisions canno
7b20: 74 20 62 65 0a 09 23 20 6f 6e 20 74 61 67 73 20 t be..# on tags
7b30: 69 6e 20 74 68 65 20 73 61 6d 65 20 6d 61 6e 6e in the same mann
7b40: 65 72 2c 20 73 6f 20 74 61 67 73 20 63 61 6e 6e er, so tags cann
7b50: 6f 74 20 62 65 20 70 72 65 64 65 63 65 73 73 6f ot be predecesso
7b60: 72 73 0a 09 23 20 6f 66 20 72 65 76 69 73 69 6f rs..# of revisio
7b70: 6e 73 2e 20 54 68 69 73 20 63 6f 6d 70 6c 65 6d ns. This complem
7b80: 65 6e 74 73 20 74 68 61 74 20 74 68 65 79 20 68 ents that they h
7b90: 61 76 65 20 6e 6f 20 73 75 63 63 65 73 73 6f 72 ave no successor
7ba0: 73 0a 09 23 20 28 53 65 65 20 73 79 6d 3a 3a 74 s..# (See sym::t
7bb0: 61 67 2f 73 75 63 63 65 73 73 6f 72 73 29 2e 0a ag/successors)..
7bc0: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 70 ..foreach {rid p
7bd0: 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 arent} [state ru
7be0: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 n ".. SELECT
7bf0: 52 2e 72 69 64 20 42 2e 62 69 64 0a 09 20 20 20 R.rid B.bid..
7c00: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e FROM revision
7c10: 20 52 2c 20 62 72 61 6e 63 68 20 42 0a 09 20 20 R, branch B..
7c20: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 49 WHERE R.rid I
7c30: 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 N $theset.. A
7c40: 4e 44 20 20 20 20 42 2e 66 69 72 73 74 20 3d 20 ND B.first =
7c50: 52 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 R.rid.."] {..
7c60: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 lappend depende
7c70: 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 65 76 20 ncies([list rev
7c80: 24 72 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d $rid]) [list sym
7c90: 3a 3a 62 72 61 6e 63 68 20 24 70 61 72 65 6e 74 ::branch $parent
7ca0: 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 ]..}..return.
7cb0: 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 }.}..# # ## ###
7cc0: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 ##### ########
7cd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23 ############# ##
7ce0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
7cf0: 23 23 23 0a 23 23 20 48 65 6c 70 65 72 20 73 69 ###.## Helper si
7d00: 6e 67 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 ngleton. Command
7d10: 73 20 66 6f 72 20 74 61 67 20 73 79 6d 62 6f 6c s for tag symbol
7d20: 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e changesets...sn
7d30: 69 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 it::type ::vc::f
7d40: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 ossil::import::c
7d50: 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 vs::project::rev
7d60: 3a 3a 73 79 6d 3a 3a 74 61 67 20 7b 0a 20 20 20 ::sym::tag {.
7d70: 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 72 65 typemethod byre
7d80: 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75 vision {} { retu
7d90: 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d rn 0 }. typem
7da0: 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 ethod bysymbol
7db0: 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d {} { return 1 }
7dc0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 . typemethod
7dd0: 69 73 74 61 67 20 20 20 20 20 20 7b 7d 20 7b 20 istag {} {
7de0: 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 return 1 }. t
7df0: 79 70 65 6d 65 74 68 6f 64 20 69 73 62 72 61 6e ypemethod isbran
7e00: 63 68 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e ch {} { return
7e10: 20 30 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 0 }.. typeme
7e20: 74 68 6f 64 20 73 74 72 20 7b 74 61 67 7d 20 7b thod str {tag} {
7e30: 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 ..struct::list a
7e40: 73 73 69 67 6e 20 5b 73 74 61 74 65 20 72 75 6e ssign [state run
7e50: 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 53 {.. SELECT S
7e60: 2e 6e 61 6d 65 2c 20 46 2e 6e 61 6d 65 2c 20 50 .name, F.name, P
7e70: 2e 6e 61 6d 65 0a 09 20 20 20 20 46 52 4f 4d 20 .name.. FROM
7e80: 20 20 74 61 67 20 54 2c 20 73 79 6d 62 6f 6c 20 tag T, symbol
7e90: 53 2c 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65 S, file F, proje
7ea0: 63 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 20 ct P.. WHERE
7eb0: 20 54 2e 74 69 64 20 3d 20 24 74 61 67 0a 09 20 T.tid = $tag..
7ec0: 20 20 20 41 4e 44 20 20 20 20 46 2e 66 69 64 20 AND F.fid
7ed0: 3d 20 54 2e 66 69 64 0a 09 20 20 20 20 41 4e 44 = T.fid.. AND
7ee0: 20 20 20 20 50 2e 70 69 64 20 3d 20 46 2e 70 69 P.pid = F.pi
7ef0: 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 53 2e d.. AND S.
7f00: 73 69 64 20 3d 20 54 2e 73 69 64 0a 09 7d 5d 20 sid = T.sid..}]
7f10: 73 6e 61 6d 65 20 66 6e 61 6d 65 20 70 6e 61 6d sname fname pnam
7f20: 65 0a 09 72 65 74 75 72 6e 20 22 24 70 6e 61 6d e..return "$pnam
7f30: 65 2f 54 27 24 7b 73 6e 61 6d 65 7d 27 3a 3a 24 e/T'${sname}'::$
7f40: 66 6e 61 6d 65 22 0a 20 20 20 20 7d 0a 0a 20 20 fname". }..
7f50: 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73 # result = lis
7f60: 74 20 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74 t (mintime, maxt
7f70: 69 6d 65 29 0a 20 20 20 20 74 79 70 65 6d 65 74 ime). typemet
7f80: 68 6f 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 74 hod timerange {t
7f90: 61 67 73 7d 20 7b 0a 09 23 20 54 68 65 20 72 61 ags} {..# The ra
7fa0: 6e 67 65 20 69 73 20 64 65 66 69 6e 65 64 20 61 nge is defined a
7fb0: 73 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 74 s the range of t
7fc0: 68 65 20 72 65 76 69 73 69 6f 6e 73 20 74 68 65 he revisions the
7fd0: 20 74 61 67 73 0a 09 23 20 61 72 65 20 61 74 74 tags..# are att
7fe0: 61 63 68 65 64 20 74 6f 2e 0a 0a 09 73 65 74 20 ached to....set
7ff0: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 theset ('[join $
8000: 74 61 67 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 tags {','}]')..r
8010: 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e eturn [state run
8020: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 4d ".. SELECT M
8030: 49 4e 28 52 2e 64 61 74 65 29 2c 20 4d 41 58 28 IN(R.date), MAX(
8040: 52 2e 64 61 74 65 29 0a 09 20 20 20 20 46 52 4f R.date).. FRO
8050: 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 74 61 M revision R, ta
8060: 67 20 54 0a 09 20 20 20 20 57 48 45 52 45 20 54 g T.. WHERE T
8070: 2e 74 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a .tid IN $theset.
8080: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 AND
8090: 20 20 52 2e 72 69 64 20 3d 20 54 2e 72 65 76 0a R.rid = T.rev.
80a0: 09 22 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 ."]. }.. #
80b0: 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20 var(dv) = dict
80c0: 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 (item -> list (i
80d0: 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c tem)), item = l
80e0: 69 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 20 ist (type id).
80f0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 73 75 63 typemethod suc
8100: 63 65 73 73 6f 72 73 20 7b 64 76 20 74 61 67 73 cessors {dv tags
8110: 7d 20 7b 0a 09 23 20 54 61 67 73 20 68 61 76 65 } {..# Tags have
8120: 20 6e 6f 20 73 75 63 63 65 73 73 6f 72 73 2e 0a no successors..
8130: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 .return. }..
8140: 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 # var(dv) = d
8150: 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 ict (item -> lis
8160: 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 t (item)), item
8170: 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69 64 = list (type id
8180: 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 ). typemethod
8190: 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 7b 64 predecessors {d
81a0: 76 20 74 61 67 73 7d 20 7b 0a 09 23 20 54 68 65 v tags} {..# The
81b0: 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 6f 66 predecessors of
81c0: 20 61 20 74 61 67 20 61 72 65 20 61 6c 6c 20 74 a tag are all t
81d0: 68 65 20 72 65 76 69 73 69 6f 6e 73 20 74 68 65 he revisions the
81e0: 20 74 61 67 73 20 61 72 65 0a 09 23 20 61 74 74 tags are..# att
81f0: 61 63 68 65 64 20 74 6f 2c 20 61 73 20 77 65 6c ached to, as wel
8200: 6c 20 61 73 20 61 6c 6c 20 74 68 65 20 62 72 61 l as all the bra
8210: 6e 63 68 65 73 20 6f 72 20 74 61 67 73 20 77 68 nches or tags wh
8220: 69 63 68 20 61 72 65 0a 09 23 20 74 68 65 69 72 ich are..# their
8230: 20 70 72 65 66 65 72 65 64 20 70 61 72 65 6e 74 prefered parent
8240: 73 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20 s....set theset
8250: 28 27 5b 6a 6f 69 6e 20 24 74 61 67 73 20 7b 27 ('[join $tags {'
8260: 2c 27 7d 5d 27 29 0a 09 66 6f 72 65 61 63 68 20 ,'}]')..foreach
8270: 7b 74 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 {tid parent} [st
8280: 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 ate run ".. S
8290: 45 4c 45 43 54 20 54 2e 74 69 64 2c 20 52 2e 72 ELECT T.tid, R.r
82a0: 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 id.. FROM r
82b0: 65 76 69 73 69 6f 6e 20 52 2c 20 74 61 67 20 54 evision R, tag T
82c0: 0a 09 20 20 20 20 57 48 45 52 45 20 20 54 2e 74 .. WHERE T.t
82d0: 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 id IN $theset..
82e0: 20 20 20 41 4e 44 20 20 20 20 54 2e 72 65 76 20 AND T.rev
82f0: 3d 20 52 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 = R.rid.."] {..
8300: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e lappend depen
8310: 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 dencies([list sy
8320: 6d 3a 3a 74 61 67 20 24 74 69 64 5d 29 20 5b 6c m::tag $tid]) [l
8330: 69 73 74 20 72 65 76 20 24 70 61 72 65 6e 74 5d ist rev $parent]
8340: 0a 09 7d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 74 ..}...foreach {t
8350: 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 id parent} [stat
8360: 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c e run ".. SEL
8370: 45 43 54 20 54 2e 74 69 64 2c 20 42 2e 62 69 64 ECT T.tid, B.bid
8380: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 74 61 67 .. FROM tag
8390: 20 54 2c 20 62 72 61 6e 63 68 20 42 2c 20 70 72 T, branch B, pr
83a0: 65 66 65 72 65 64 70 61 72 65 6e 74 20 50 0a 09 eferedparent P..
83b0: 20 20 20 20 57 48 45 52 45 20 20 54 2e 74 69 64 WHERE T.tid
83c0: 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 IN $theset..
83d0: 20 41 4e 44 20 20 20 20 54 2e 73 69 64 20 3d 20 AND T.sid =
83e0: 50 2e 73 69 64 0a 09 20 20 20 20 41 4e 44 20 20 P.sid.. AND
83f0: 20 20 50 2e 70 69 64 20 3d 20 42 2e 73 69 64 0a P.pid = B.sid.
8400: 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 ."] {.. lappe
8410: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 nd dependencies(
8420: 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 [list sym::tag $
8430: 74 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a tid]) [list sym:
8440: 3a 62 72 61 6e 63 68 20 24 70 61 72 65 6e 74 5d :branch $parent]
8450: 0a 09 7d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 74 ..}...foreach {t
8460: 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 id parent} [stat
8470: 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c e run ".. SEL
8480: 45 43 54 20 54 2e 74 69 64 2c 20 54 58 2e 74 69 ECT T.tid, TX.ti
8490: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 74 61 d.. FROM ta
84a0: 67 20 54 2c 20 74 61 67 20 54 58 2c 20 70 72 65 g T, tag TX, pre
84b0: 66 65 72 65 64 70 61 72 65 6e 74 20 50 0a 09 20 feredparent P..
84c0: 20 20 20 57 48 45 52 45 20 20 54 2e 74 69 64 20 WHERE T.tid
84d0: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 IN $theset..
84e0: 41 4e 44 20 20 20 20 54 2e 73 69 64 20 3d 20 50 AND T.sid = P
84f0: 2e 73 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 .sid.. AND
8500: 20 50 2e 70 69 64 20 3d 20 54 58 2e 73 69 64 0a P.pid = TX.sid.
8510: 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 ."] {.. lappe
8520: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 nd dependencies(
8530: 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 [list sym::tag $
8540: 74 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a tid]) [list sym:
8550: 3a 74 61 67 20 24 70 61 72 65 6e 74 5d 0a 09 7d :tag $parent]..}
8560: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 7d ..return. }.}
8570: 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23 ..# # ## ### ###
8580: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 ## ######## ####
8590: 23 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 ######### ######
85a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a ###############.
85b0: 23 23 20 48 65 6c 70 65 72 20 73 69 6e 67 6c 65 ## Helper single
85c0: 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20 66 6f ton. Commands fo
85d0: 72 20 62 72 61 6e 63 68 20 73 79 6d 62 6f 6c 20 r branch symbol
85e0: 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e 69 changesets...sni
85f0: 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f t::type ::vc::fo
8600: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 ssil::import::cv
8610: 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a s::project::rev:
8620: 3a 73 79 6d 3a 3a 62 72 61 6e 63 68 20 7b 0a 20 :sym::branch {.
8630: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 typemethod by
8640: 72 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 revision {} { re
8650: 74 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 turn 0 }. typ
8660: 65 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c emethod bysymbol
8670: 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 {} { return 1
8680: 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f }. typemetho
8690: 64 20 69 73 74 61 67 20 20 20 20 20 20 7b 7d 20 d istag {}
86a0: 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 { return 0 }.
86b0: 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73 62 72 typemethod isbr
86c0: 61 6e 63 68 20 20 20 7b 7d 20 7b 20 72 65 74 75 anch {} { retu
86d0: 72 6e 20 31 20 7d 0a 0a 20 20 20 20 74 79 70 65 rn 1 }.. type
86e0: 6d 65 74 68 6f 64 20 73 74 72 20 7b 62 72 61 6e method str {bran
86f0: 63 68 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c ch} {..struct::l
8700: 69 73 74 20 61 73 73 69 67 6e 20 5b 73 74 61 74 ist assign [stat
8710: 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c e run {.. SEL
8720: 45 43 54 20 53 2e 6e 61 6d 65 2c 20 46 2e 6e 61 ECT S.name, F.na
8730: 6d 65 2c 20 50 2e 6e 61 6d 65 0a 09 20 20 20 20 me, P.name..
8740: 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c FROM branch B,
8750: 20 73 79 6d 62 6f 6c 20 53 2c 20 66 69 6c 65 20 symbol S, file
8760: 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09 20 20 F, project P..
8770: 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 3d WHERE B.bid =
8780: 20 24 62 72 61 6e 63 68 0a 09 20 20 20 20 41 4e $branch.. AN
8790: 44 20 20 20 20 46 2e 66 69 64 20 3d 20 42 2e 66 D F.fid = B.f
87a0: 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50 id.. AND P
87b0: 2e 70 69 64 20 3d 20 46 2e 70 69 64 0a 09 20 20 .pid = F.pid..
87c0: 20 20 41 4e 44 20 20 20 20 53 2e 73 69 64 20 3d AND S.sid =
87d0: 20 42 2e 73 69 64 0a 09 7d 5d 20 73 6e 61 6d 65 B.sid..}] sname
87e0: 20 66 6e 61 6d 65 20 70 6e 61 6d 65 0a 09 72 65 fname pname..re
87f0: 74 75 72 6e 20 22 24 70 6e 61 6d 65 2f 42 27 24 turn "$pname/B'$
8800: 7b 73 6e 61 6d 65 7d 27 3a 3a 24 66 6e 61 6d 65 {sname}'::$fname
8810: 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 ". }.. # r
8820: 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69 esult = list (mi
8830: 6e 74 69 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a ntime, maxtime).
8840: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 74 typemethod t
8850: 69 6d 65 72 61 6e 67 65 20 7b 62 72 61 6e 63 68 imerange {branch
8860: 65 73 7d 20 7b 0a 09 23 20 54 68 65 20 72 61 6e es} {..# The ran
8870: 67 65 20 6f 66 20 61 20 62 72 61 6e 63 68 20 69 ge of a branch i
8880: 73 20 64 65 66 69 6e 65 64 20 61 73 20 74 68 65 s defined as the
8890: 20 72 61 6e 67 65 20 6f 66 20 74 68 65 0a 09 23 range of the..#
88a0: 20 72 65 76 69 73 69 6f 6e 73 20 74 68 65 20 62 revisions the b
88b0: 72 61 6e 63 68 65 73 20 61 72 65 20 73 70 61 77 ranches are spaw
88c0: 6e 65 64 20 62 79 2e 20 4e 4f 54 45 20 68 6f 77 ned by. NOTE how
88d0: 65 76 65 72 20 74 68 61 74 20 74 68 65 0a 09 23 ever that the..#
88e0: 20 62 72 61 6e 63 68 65 73 20 61 73 73 6f 63 69 branches associ
88f0: 61 74 65 64 20 77 69 74 68 20 61 20 64 65 74 61 ated with a deta
8900: 63 68 65 64 20 4e 54 44 42 20 77 69 6c 6c 20 68 ched NTDB will h
8910: 61 76 65 20 6e 6f 20 72 6f 6f 74 0a 09 23 20 73 ave no root..# s
8920: 70 61 77 6e 69 6e 67 20 74 68 65 6d 2c 20 68 65 pawning them, he
8930: 6e 63 65 20 74 68 65 79 20 68 61 76 65 20 6e 6f nce they have no
8940: 20 72 65 61 6c 20 74 69 6d 65 72 61 6e 67 65 20 real timerange
8950: 61 6e 79 0a 09 23 20 6c 6f 6e 67 65 72 2e 20 42 any..# longer. B
8960: 79 20 75 73 69 6e 67 20 30 20 77 65 20 70 75 74 y using 0 we put
8970: 20 74 68 65 6d 20 69 6e 20 66 72 6f 6e 74 20 6f them in front o
8980: 66 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 f everything els
8990: 65 2c 0a 09 23 20 61 73 20 74 68 65 79 20 6c 6f e,..# as they lo
89a0: 67 69 63 61 6c 6c 79 20 61 72 65 2e 0a 0a 09 73 gically are....s
89b0: 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 et theset ('[joi
89c0: 6e 20 24 62 72 61 6e 63 68 65 73 20 7b 27 2c 27 n $branches {','
89d0: 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 }]')..return [st
89e0: 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 ate run ".. S
89f0: 45 4c 45 43 54 20 49 46 4e 55 4c 4c 28 4d 49 4e ELECT IFNULL(MIN
8a00: 28 52 2e 64 61 74 65 29 2c 30 29 2c 20 49 46 4e (R.date),0), IFN
8a10: 55 4c 4c 28 4d 41 58 28 52 2e 64 61 74 65 29 2c ULL(MAX(R.date),
8a20: 30 29 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 0).. FROM rev
8a30: 69 73 69 6f 6e 20 52 2c 20 62 72 61 6e 63 68 20 ision R, branch
8a40: 42 0a 09 20 20 20 20 57 48 45 52 45 20 42 2e 62 B.. WHERE B.b
8a50: 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 20 20 id IN $theset.
8a60: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 AND
8a70: 52 2e 72 69 64 20 3d 20 42 2e 72 6f 6f 74 0a 09 R.rid = B.root..
8a80: 22 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 "]. }.. #
8a90: 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20 28 var(dv) = dict (
8aa0: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 item -> list (it
8ab0: 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 em)), item = li
8ac0: 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 20 20 st (type id).
8ad0: 20 74 79 70 65 6d 65 74 68 6f 64 20 73 75 63 63 typemethod succ
8ae0: 65 73 73 6f 72 73 20 7b 64 76 20 62 72 61 6e 63 essors {dv branc
8af0: 68 65 73 7d 20 7b 0a 09 23 20 54 68 65 20 66 69 hes} {..# The fi
8b00: 72 73 74 20 72 65 76 69 73 69 6f 6e 20 63 6f 6d rst revision com
8b10: 6d 69 74 74 65 64 20 6f 6e 20 61 20 62 72 61 6e mitted on a bran
8b20: 63 68 2c 20 61 6e 64 20 61 6c 6c 20 62 72 61 6e ch, and all bran
8b30: 63 68 65 73 0a 09 23 20 61 6e 64 20 74 61 67 73 ches..# and tags
8b40: 20 77 68 69 63 68 20 68 61 76 65 20 69 74 20 61 which have it a
8b50: 73 20 74 68 65 69 72 20 70 72 65 66 65 72 65 64 s their prefered
8b60: 20 70 61 72 65 6e 74 20 61 72 65 20 74 68 65 0a parent are the.
8b70: 09 23 20 73 75 63 63 65 73 73 6f 72 73 20 6f 66 .# successors of
8b80: 20 61 20 62 72 61 6e 63 68 2e 0a 0a 09 73 65 74 a branch....set
8b90: 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 theset ('[join
8ba0: 24 62 72 61 6e 63 68 65 73 20 7b 27 2c 27 7d 5d $branches {','}]
8bb0: 27 29 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64 ')..foreach {bid
8bc0: 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 child} [state r
8bd0: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 un ".. SELECT
8be0: 20 42 2e 62 69 64 2c 20 52 2e 72 69 64 0a 09 20 B.bid, R.rid..
8bf0: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 FROM revisi
8c00: 6f 6e 20 52 2c 20 62 72 61 6e 63 68 20 42 0a 09 on R, branch B..
8c10: 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 WHERE B.bid
8c20: 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 IN $theset..
8c30: 20 41 4e 44 20 20 20 20 42 2e 66 69 72 73 74 20 AND B.first
8c40: 3d 20 52 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 = R.rid.."] {..
8c50: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e lappend depen
8c60: 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 dencies([list sy
8c70: 6d 3a 3a 74 61 67 20 24 62 69 64 5d 29 20 5b 6c m::tag $bid]) [l
8c80: 69 73 74 20 72 65 76 20 24 63 68 69 6c 64 5d 0a ist rev $child].
8c90: 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64 .}..foreach {bid
8ca0: 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 child} [state r
8cb0: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 un ".. SELECT
8cc0: 20 42 2e 62 69 64 2c 20 42 58 2e 62 69 64 0a 09 B.bid, BX.bid..
8cd0: 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 FROM branc
8ce0: 68 20 42 2c 20 62 72 61 6e 63 68 20 42 58 2c 20 h B, branch BX,
8cf0: 70 72 65 66 65 72 65 64 70 61 72 65 6e 74 20 50 preferedparent P
8d00: 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 .. WHERE B.b
8d10: 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 id IN $theset..
8d20: 20 20 20 41 4e 44 20 20 20 20 42 2e 73 69 64 20 AND B.sid
8d30: 3d 20 50 2e 70 69 64 0a 09 20 20 20 20 41 4e 44 = P.pid.. AND
8d40: 20 20 20 20 42 58 2e 73 69 64 20 3d 20 50 2e 73 BX.sid = P.s
8d50: 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 id.."] {.. la
8d60: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 ppend dependenci
8d70: 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 es([list sym::ta
8d80: 67 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 20 73 g $bid]) [list s
8d90: 79 6d 3a 3a 62 72 61 6e 63 68 20 24 63 68 69 6c ym::branch $chil
8da0: 64 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b d]..}..foreach {
8db0: 62 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 bid child} [stat
8dc0: 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c e run ".. SEL
8dd0: 45 43 54 20 42 2e 62 69 64 2c 20 54 2e 74 69 64 ECT B.bid, T.tid
8de0: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 .. FROM bra
8df0: 6e 63 68 20 42 2c 20 74 61 67 20 54 2c 20 70 72 nch B, tag T, pr
8e00: 65 66 65 72 65 64 70 61 72 65 6e 74 20 50 0a 09 eferedparent P..
8e10: 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 WHERE B.bid
8e20: 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 IN $theset..
8e30: 20 41 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20 AND B.sid =
8e40: 50 2e 70 69 64 0a 09 20 20 20 20 41 4e 44 20 20 P.pid.. AND
8e50: 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a T.sid = P.sid.
8e60: 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 ."] {.. lappe
8e70: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 nd dependencies(
8e80: 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 [list sym::tag $
8e90: 62 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a bid]) [list sym:
8ea0: 3a 74 61 67 20 24 63 68 69 6c 64 5d 0a 09 7d 0a :tag $child]..}.
8eb0: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 .return. }..
8ec0: 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 # var(dv) = d
8ed0: 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 ict (item -> lis
8ee0: 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 t (item)), item
8ef0: 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69 64 = list (type id
8f00: 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 ). typemethod
8f10: 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 7b 64 predecessors {d
8f20: 76 20 62 72 61 6e 63 68 65 73 7d 20 7b 0a 09 23 v branches} {..#
8f30: 20 54 68 65 20 70 72 65 64 65 63 65 73 73 6f 72 The predecessor
8f40: 73 20 6f 66 20 61 20 62 72 61 6e 63 68 20 61 72 s of a branch ar
8f50: 65 20 61 6c 6c 20 74 68 65 20 72 65 76 69 73 69 e all the revisi
8f60: 6f 6e 73 20 74 68 65 0a 09 23 20 62 72 61 6e 63 ons the..# branc
8f70: 68 65 73 20 61 72 65 20 73 70 61 77 6e 65 64 20 hes are spawned
8f80: 66 72 6f 6d 2c 20 61 73 20 77 65 6c 6c 20 61 73 from, as well as
8f90: 20 61 6c 6c 20 74 68 65 20 62 72 61 6e 63 68 65 all the branche
8fa0: 73 20 6f 72 0a 09 23 20 74 61 67 73 20 77 68 69 s or..# tags whi
8fb0: 63 68 20 61 72 65 20 74 68 65 69 72 20 70 72 65 ch are their pre
8fc0: 66 65 72 65 64 20 70 61 72 65 6e 74 73 2e 0a 0a fered parents...
8fd0: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a .set theset ('[j
8fe0: 6f 69 6e 20 24 74 61 67 73 20 7b 27 2c 27 7d 5d oin $tags {','}]
8ff0: 27 29 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64 ')..foreach {bid
9000: 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 parent} [state
9010: 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 run ".. SELEC
9020: 54 20 42 2e 42 69 64 2c 20 52 2e 72 69 64 0a 09 T B.Bid, R.rid..
9030: 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 FROM revis
9040: 69 6f 6e 20 52 2c 20 62 72 61 6e 63 68 20 42 0a ion R, branch B.
9050: 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 . WHERE B.bi
9060: 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 d IN $theset..
9070: 20 20 41 4e 44 20 20 20 20 42 2e 72 6f 6f 74 20 AND B.root
9080: 3d 20 52 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 = R.rid.."] {..
9090: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e lappend depen
90a0: 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 dencies([list sy
90b0: 6d 3a 3a 62 72 61 6e 63 68 20 24 62 69 64 5d 29 m::branch $bid])
90c0: 20 5b 6c 69 73 74 20 72 65 76 20 24 70 61 72 65 [list rev $pare
90d0: 6e 74 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 nt]..}..foreach
90e0: 7b 62 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 {bid parent} [st
90f0: 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 ate run ".. S
9100: 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 42 58 2e ELECT B.bid, BX.
9110: 62 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 bid.. FROM
9120: 62 72 61 6e 63 68 20 42 2c 20 62 72 61 6e 63 68 branch B, branch
9130: 20 42 58 2c 20 70 72 65 66 65 72 65 64 70 61 72 BX, preferedpar
9140: 65 6e 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 ent P.. WHERE
9150: 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 B.bid IN $thes
9160: 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 et.. AND B
9170: 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a 09 20 20 .sid = P.sid..
9180: 20 20 41 4e 44 20 20 20 20 50 2e 70 69 64 20 3d AND P.pid =
9190: 20 42 58 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 20 BX.sid.."] {..
91a0: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e lappend depen
91b0: 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 dencies([list sy
91c0: 6d 3a 3a 62 72 61 6e 63 68 20 24 62 69 64 5d 29 m::branch $bid])
91d0: 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e [list sym::bran
91e0: 63 68 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 ch $parent]..}..
91f0: 66 6f 72 65 61 63 68 20 7b 62 69 64 20 70 61 72 foreach {bid par
9200: 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 ent} [state run
9210: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e ".. SELECT B.
9220: 62 69 64 2c 20 54 2e 74 69 64 0a 09 20 20 20 20 bid, T.tid..
9230: 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c FROM branch B,
9240: 20 74 61 67 20 54 2c 20 70 72 65 66 65 72 65 64 tag T, prefered
9250: 70 61 72 65 6e 74 20 50 0a 09 20 20 20 20 57 48 parent P.. WH
9260: 45 52 45 20 20 42 2e 74 69 64 20 49 4e 20 24 74 ERE B.tid IN $t
9270: 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 heset.. AND
9280: 20 20 42 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a B.sid = P.sid.
9290: 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69 . AND P.pi
92a0: 64 20 3d 20 54 2e 73 69 64 0a 09 22 5d 20 7b 0a d = T.sid.."] {.
92b0: 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 . lappend dep
92c0: 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 endencies([list
92d0: 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 62 69 64 sym::branch $bid
92e0: 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 ]) [list sym::ta
92f0: 67 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 72 g $parent]..}..r
9300: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 eturn. }..
9310: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 # # ## ### ####
9320: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 # ######## #####
9330: 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 ########. ##
9340: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a 20 Configuration..
9350: 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 69 6e pragma -hasin
9360: 73 74 61 6e 63 65 73 20 20 20 6e 6f 20 3b 20 23 stances no ; #
9370: 20 73 69 6e 67 6c 65 74 6f 6e 0a 20 20 20 20 70 singleton. p
9380: 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65 69 6e ragma -hastypein
9390: 66 6f 20 20 20 20 6e 6f 20 3b 20 23 20 6e 6f 20 fo no ; # no
93a0: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20 20 introspection.
93b0: 20 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79 70 pragma -hastyp
93c0: 65 64 65 73 74 72 6f 79 20 6e 6f 20 3b 20 23 20 edestroy no ; #
93d0: 69 6d 6d 6f 72 74 61 6c 0a 7d 0a 0a 23 20 23 20 immortal.}..# #
93e0: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 ## ### ##### ###
93f0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 ##### ##########
9400: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 ### ############
9410: 23 23 23 23 23 23 23 23 23 0a 23 23 0a 0a 6e 61 #########.##..na
9420: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 76 mespace eval ::v
9430: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 c::fossil::impor
9440: 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 20 t::cvs::project
9450: 7b 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 {. namespace
9460: 65 78 70 6f 72 74 20 72 65 76 0a 20 20 20 20 6e export rev. n
9470: 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 72 65 amespace eval re
9480: 76 20 7b 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 v {..namespace i
9490: 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 mport ::vc::foss
94a0: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a il::import::cvs:
94b0: 3a 73 74 61 74 65 0a 09 6e 61 6d 65 73 70 61 63 :state..namespac
94c0: 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 e import ::vc::f
94d0: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 ossil::import::c
94e0: 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 6e vs::integrity..n
94f0: 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 amespace import
9500: 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69 73 ::vc::tools::mis
9510: 63 3a 3a 2a 0a 09 6e 61 6d 65 73 70 61 63 65 20 c::*..namespace
9520: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f import ::vc::too
9530: 6c 73 3a 3a 74 72 6f 75 62 6c 65 0a 09 6e 61 6d ls::trouble..nam
9540: 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a espace import ::
9550: 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 vc::tools::log..
9560: 6c 6f 67 20 72 65 67 69 73 74 65 72 20 63 73 65 log register cse
9570: 74 73 0a 0a 09 23 20 53 65 74 20 75 70 20 74 68 ts...# Set up th
9580: 65 20 68 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 e helper singlet
9590: 6f 6e 73 0a 09 6e 61 6d 65 73 70 61 63 65 20 65 ons..namespace e
95a0: 76 61 6c 20 72 65 76 20 7b 0a 09 20 20 20 20 6e val rev {.. n
95b0: 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 amespace import
95c0: 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d ::vc::fossil::im
95d0: 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 port::cvs::state
95e0: 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 .. namespace
95f0: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 import ::vc::fos
9600: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 sil::import::cvs
9610: 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a 09 ::integrity..}..
9620: 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 73 namespace eval s
9630: 79 6d 3a 3a 74 61 67 20 7b 0a 09 20 20 20 20 6e ym::tag {.. n
9640: 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 amespace import
9650: 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d ::vc::fossil::im
9660: 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 port::cvs::state
9670: 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 .. namespace
9680: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 import ::vc::fos
9690: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 sil::import::cvs
96a0: 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a 09 ::integrity..}..
96b0: 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 73 namespace eval s
96c0: 79 6d 3a 3a 62 72 61 6e 63 68 20 7b 0a 09 20 20 ym::branch {..
96d0: 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f namespace impo
96e0: 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a rt ::vc::fossil:
96f0: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 :import::cvs::st
9700: 61 74 65 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 ate.. namespa
9710: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a ce import ::vc::
9720: 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a fossil::import::
9730: 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 cvs::integrity..
9740: 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 }. }.}..# # #
9750: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 # ### ##### ####
9760: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 #### ###########
9770: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 ## #############
9780: 23 23 23 23 23 23 23 23 0a 23 23 20 52 65 61 64 ########.## Read
9790: 79 0a 0a 70 61 63 6b 61 67 65 20 70 72 6f 76 69 y..package provi
97a0: 64 65 20 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 de vc::fossil::i
97b0: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a mport::cvs::proj
97c0: 65 63 74 3a 3a 72 65 76 20 31 2e 30 0a 72 65 74 ect::rev 1.0.ret
97d0: 75 72 6e 0a urn.