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 76 63 3a 3a 74 6f 6f 6c 73 equire vc::tools
0380: 3a 3a 6d 69 73 63 20 20 20 20 20 20 20 20 20 20 ::misc
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23 ; #
03a0: 20 54 65 78 74 20 66 6f 72 6d 61 74 74 69 6e 67 Text formatting
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 74 72 6f 75 vc::tools::trou
03d0: 62 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 20 ble
03e0: 20 20 20 20 20 20 20 3b 20 23 20 45 72 72 6f 72 ; # Error
03f0: 20 72 65 70 6f 72 74 69 6e 67 2e 0a 70 61 63 6b reporting..pack
0400: 61 67 65 20 72 65 71 75 69 72 65 20 76 63 3a 3a age require vc::
0410: 74 6f 6f 6c 73 3a 3a 6c 6f 67 20 20 20 20 20 20 tools::log
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0430: 20 20 3b 20 23 20 55 73 65 72 20 66 65 65 64 62 ; # User feedb
0440: 61 63 6b 2e 0a 70 61 63 6b 61 67 65 20 72 65 71 ack..package req
0450: 75 69 72 65 20 76 63 3a 3a 66 6f 73 73 69 6c 3a uire vc::fossil:
0460: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 :import::cvs::st
0470: 61 74 65 20 20 20 20 20 20 20 20 3b 20 23 20 53 ate ; # S
0480: 74 61 74 65 20 73 74 6f 72 61 67 65 2e 0a 70 61 tate storage..pa
0490: 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 76 63 ckage require vc
04a0: 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 ::fossil::import
04b0: 3a 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 ::cvs::integrity
04c0: 20 20 20 20 3b 20 23 20 53 74 61 74 65 20 69 6e ; # State in
04d0: 74 65 67 72 69 74 79 20 63 68 65 63 6b 73 2e 0a tegrity checks..
04e0: 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 .# # ## ### ####
04f0: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 # ######## #####
0500: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
0510: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 ##############.#
0520: 23 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20 3a 3a #..snit::type ::
0530: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f vc::fossil::impo
0540: 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 rt::cvs::project
0550: 3a 3a 72 65 76 20 7b 0a 20 20 20 20 23 20 23 20 ::rev {. # #
0560: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 ## ### ##### ###
0570: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 ##### ##########
0580: 23 23 23 0a 20 20 20 20 23 23 20 50 75 62 6c 69 ###. ## Publi
0590: 63 20 41 50 49 0a 0a 20 20 20 20 63 6f 6e 73 74 c API.. const
05a0: 72 75 63 74 6f 72 20 7b 70 72 6f 6a 65 63 74 20 ructor {project
05b0: 63 73 74 79 70 65 20 73 72 63 69 64 20 69 74 65 cstype srcid ite
05c0: 6d 73 20 7b 74 68 65 69 64 20 7b 7d 7d 7d 20 7b ms {theid {}}} {
05d0: 0a 09 69 66 20 7b 24 74 68 65 69 64 20 6e 65 20 ..if {$theid ne
05e0: 22 22 7d 20 7b 0a 09 20 20 20 20 73 65 74 20 6d ""} {.. set m
05f0: 79 69 64 20 24 74 68 65 69 64 0a 09 7d 20 65 6c yid $theid..} el
0600: 73 65 20 7b 0a 09 20 20 20 20 73 65 74 20 6d 79 se {.. set my
0610: 69 64 20 5b 69 6e 63 72 20 6d 79 63 6f 75 6e 74 id [incr mycount
0620: 65 72 5d 0a 09 7d 0a 0a 09 69 6e 74 65 67 72 69 er]..}...integri
0630: 74 79 20 61 73 73 65 72 74 20 7b 5b 69 6e 66 6f ty assert {[info
0640: 20 65 78 69 73 74 73 20 6d 79 63 73 74 79 70 65 exists mycstype
0650: 28 24 63 73 74 79 70 65 29 5d 7d 20 7b 42 61 64 ($cstype)]} {Bad
0660: 20 63 68 61 6e 67 65 73 65 74 20 74 79 70 65 20 changeset type
0670: 27 24 63 73 74 79 70 65 27 2e 7d 0a 0a 09 73 65 '$cstype'.}...se
0680: 74 20 6d 79 70 72 6f 6a 65 63 74 20 20 20 24 70 t myproject $p
0690: 72 6f 6a 65 63 74 0a 09 73 65 74 20 6d 79 74 79 roject..set myty
06a0: 70 65 20 20 20 20 20 20 24 63 73 74 79 70 65 0a pe $cstype.
06b0: 09 73 65 74 20 6d 79 74 79 70 65 6f 62 6a 20 20 .set mytypeobj
06c0: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 ::vc::fossil::i
06d0: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a mport::cvs::proj
06e0: 65 63 74 3a 3a 72 65 76 3a 3a 24 7b 63 73 74 79 ect::rev::${csty
06f0: 70 65 7d 0a 09 73 65 74 20 6d 79 73 72 63 69 64 pe}..set mysrcid
0700: 09 24 73 72 63 69 64 0a 09 73 65 74 20 6d 79 69 .$srcid..set myi
0710: 74 65 6d 73 20 20 20 20 20 24 69 74 65 6d 73 0a tems $items.
0720: 09 73 65 74 20 6d 79 70 6f 73 20 20 20 20 20 20 .set mypos
0730: 20 7b 7d 20 3b 20 23 20 43 6f 6d 6d 69 74 20 6c {} ; # Commit l
0740: 6f 63 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20 6b ocation is not k
0750: 6e 6f 77 6e 20 79 65 74 2e 0a 0a 09 23 20 4b 65 nown yet....# Ke
0760: 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 ep track of the
0770: 67 65 6e 65 72 61 74 65 64 20 63 68 61 6e 67 65 generated change
0780: 73 65 74 73 20 61 6e 64 20 6f 66 20 74 68 65 20 sets and of the
0790: 69 6e 76 65 72 73 65 0a 09 23 20 6d 61 70 70 69 inverse..# mappi
07a0: 6e 67 20 66 72 6f 6d 20 69 74 65 6d 73 20 74 6f ng from items to
07b0: 20 74 68 65 6d 2e 0a 09 6c 61 70 70 65 6e 64 20 them...lappend
07c0: 6d 79 63 68 61 6e 67 65 73 65 74 73 20 20 20 24 mychangesets $
07d0: 73 65 6c 66 0a 09 73 65 74 20 20 20 20 20 6d 79 self..set my
07e0: 69 64 6d 61 70 28 24 6d 79 69 64 29 20 24 73 65 idmap($myid) $se
07f0: 6c 66 0a 09 66 6f 72 65 61 63 68 20 69 69 64 20 lf..foreach iid
0800: 24 69 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65 $items {.. se
0810: 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 63 73 74 t key [list $cst
0820: 79 70 65 20 24 69 69 64 5d 0a 09 20 20 20 20 73 ype $iid].. s
0830: 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24 6b 65 et myitemmap($ke
0840: 79 29 20 24 73 65 6c 66 0a 09 20 20 20 20 6c 61 y) $self.. la
0850: 70 70 65 6e 64 20 6d 79 74 69 74 65 6d 73 20 24 ppend mytitems $
0860: 6b 65 79 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 key..}..return.
0870: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 }.. method
0880: 20 73 74 72 20 7b 7d 20 7b 0a 09 73 65 74 20 73 str {} {..set s
0890: 74 72 20 20 20 20 22 3c 22 0a 09 73 65 74 20 64 tr "<"..set d
08a0: 65 74 61 69 6c 20 22 22 0a 09 69 66 20 7b 5b 24 etail ""..if {[$
08b0: 6d 79 74 79 70 65 6f 62 6a 20 62 79 73 79 6d 62 mytypeobj bysymb
08c0: 6f 6c 5d 7d 20 7b 0a 09 20 20 20 20 73 65 74 20 ol]} {.. set
08d0: 64 65 74 61 69 6c 20 22 20 27 5b 73 74 61 74 65 detail " '[state
08e0: 20 6f 6e 65 20 7b 0a 09 09 53 45 4c 45 43 54 20 one {...SELECT
08f0: 53 2e 6e 61 6d 65 0a 09 09 46 52 4f 4d 20 20 20 S.name...FROM
0900: 73 79 6d 62 6f 6c 20 53 0a 09 09 57 48 45 52 45 symbol S...WHERE
0910: 20 20 53 2e 73 69 64 20 3d 20 24 6d 79 73 72 63 S.sid = $mysrc
0920: 69 64 0a 09 20 20 20 20 7d 5d 27 22 0a 09 7d 0a id.. }]'"..}.
0930: 09 61 70 70 65 6e 64 20 73 74 72 20 22 24 6d 79 .append str "$my
0940: 74 79 70 65 20 24 7b 6d 79 69 64 7d 24 7b 64 65 type ${myid}${de
0950: 74 61 69 6c 7d 3e 22 0a 09 72 65 74 75 72 6e 20 tail}>"..return
0960: 24 73 74 72 0a 20 20 20 20 7d 0a 0a 20 20 20 20 $str. }..
0970: 6d 65 74 68 6f 64 20 69 64 20 20 20 20 7b 7d 20 method id {}
0980: 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 64 20 7d { return $myid }
0990: 0a 20 20 20 20 6d 65 74 68 6f 64 20 69 74 65 6d . method item
09a0: 73 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d s {} { return $m
09b0: 79 74 69 74 65 6d 73 20 7d 0a 20 20 20 20 6d 65 ytitems }. me
09c0: 74 68 6f 64 20 64 61 74 61 20 20 7b 7d 20 7b 20 thod data {} {
09d0: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 6d 79 return [list $my
09e0: 70 72 6f 6a 65 63 74 20 24 6d 79 74 79 70 65 20 project $mytype
09f0: 24 6d 79 73 72 63 69 64 5d 20 7d 0a 0a 20 20 20 $mysrcid] }..
0a00: 20 64 65 6c 65 67 61 74 65 20 6d 65 74 68 6f 64 delegate method
0a10: 20 62 79 73 79 6d 62 6f 6c 20 20 20 74 6f 20 6d bysymbol to m
0a20: 79 74 79 70 65 6f 62 6a 0a 20 20 20 20 64 65 6c ytypeobj. del
0a30: 65 67 61 74 65 20 6d 65 74 68 6f 64 20 62 79 72 egate method byr
0a40: 65 76 69 73 69 6f 6e 20 74 6f 20 6d 79 74 79 70 evision to mytyp
0a50: 65 6f 62 6a 0a 20 20 20 20 64 65 6c 65 67 61 74 eobj. delegat
0a60: 65 20 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63 e method isbranc
0a70: 68 20 20 20 74 6f 20 6d 79 74 79 70 65 6f 62 6a h to mytypeobj
0a80: 0a 20 20 20 20 64 65 6c 65 67 61 74 65 20 6d 65 . delegate me
0a90: 74 68 6f 64 20 69 73 74 61 67 20 20 20 20 20 20 thod istag
0aa0: 74 6f 20 6d 79 74 79 70 65 6f 62 6a 0a 0a 20 20 to mytypeobj..
0ab0: 20 20 6d 65 74 68 6f 64 20 73 65 74 70 6f 73 20 method setpos
0ac0: 7b 70 7d 20 7b 20 73 65 74 20 6d 79 70 6f 73 20 {p} { set mypos
0ad0: 24 70 20 3b 20 72 65 74 75 72 6e 20 7d 0a 20 20 $p ; return }.
0ae0: 20 20 6d 65 74 68 6f 64 20 70 6f 73 20 20 20 20 method pos
0af0: 7b 7d 20 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 {} { return $my
0b00: 70 6f 73 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 pos }.. # res
0b10: 75 6c 74 20 3d 20 64 69 63 74 20 28 69 74 65 6d ult = dict (item
0b20: 20 2d 3e 20 6c 69 73 74 20 28 63 68 61 6e 67 65 -> list (change
0b30: 73 65 74 29 29 0a 20 20 20 20 6d 65 74 68 6f 64 set)). method
0b40: 20 73 75 63 63 65 73 73 6f 72 6d 61 70 20 7b 7d successormap {}
0b50: 20 7b 0a 09 23 20 4e 4f 54 45 20 2f 20 46 55 54 {..# NOTE / FUT
0b60: 55 52 45 3a 20 50 6f 73 73 69 62 6c 65 20 62 6f URE: Possible bo
0b70: 74 74 6c 65 6e 65 63 6b 2e 0a 09 61 72 72 61 79 ttleneck...array
0b80: 20 73 65 74 20 74 6d 70 20 7b 7d 0a 09 66 6f 72 set tmp {}..for
0b90: 65 61 63 68 20 7b 72 65 76 20 63 68 69 6c 64 72 each {rev childr
0ba0: 65 6e 7d 20 5b 24 73 65 6c 66 20 6e 65 78 74 6d en} [$self nextm
0bb0: 61 70 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 ap] {.. forea
0bc0: 63 68 20 63 68 69 6c 64 20 24 63 68 69 6c 64 72 ch child $childr
0bd0: 65 6e 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 74 en {...lappend t
0be0: 6d 70 28 24 72 65 76 29 20 24 6d 79 69 74 65 6d mp($rev) $myitem
0bf0: 6d 61 70 28 24 63 68 69 6c 64 29 0a 09 20 20 20 map($child)..
0c00: 20 7d 0a 09 20 20 20 20 73 65 74 20 74 6d 70 28 }.. set tmp(
0c10: 24 72 65 76 29 20 5b 6c 73 6f 72 74 20 2d 75 6e $rev) [lsort -un
0c20: 69 71 75 65 20 24 74 6d 70 28 24 72 65 76 29 5d ique $tmp($rev)]
0c30: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b 61 72 72 ..}..return [arr
0c40: 61 79 20 67 65 74 20 74 6d 70 5d 0a 20 20 20 20 ay get tmp].
0c50: 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 }.. # result
0c60: 3d 20 6c 69 73 74 20 28 63 68 61 6e 67 65 73 65 = list (changese
0c70: 74 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 75 t). method su
0c80: 63 63 65 73 73 6f 72 73 20 7b 7d 20 7b 0a 09 23 ccessors {} {..#
0c90: 20 4e 4f 54 45 20 2f 20 46 55 54 55 52 45 3a 20 NOTE / FUTURE:
0ca0: 50 6f 73 73 69 62 6c 65 20 62 6f 74 74 6c 65 6e Possible bottlen
0cb0: 65 63 6b 2e 0a 09 73 65 74 20 63 73 65 74 73 20 eck...set csets
0cc0: 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 5f 20 63 {}..foreach {_ c
0cd0: 68 69 6c 64 72 65 6e 7d 20 5b 24 73 65 6c 66 20 hildren} [$self
0ce0: 6e 65 78 74 6d 61 70 5d 20 7b 0a 09 20 20 20 20 nextmap] {..
0cf0: 66 6f 72 65 61 63 68 20 63 68 69 6c 64 20 24 63 foreach child $c
0d00: 68 69 6c 64 72 65 6e 20 7b 0a 09 09 6c 61 70 70 hildren {...lapp
0d10: 65 6e 64 20 63 73 65 74 73 20 24 6d 79 69 74 65 end csets $myite
0d20: 6d 6d 61 70 28 24 63 68 69 6c 64 29 0a 09 20 20 mmap($child)..
0d30: 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b }..}..return [
0d40: 6c 73 6f 72 74 20 2d 75 6e 69 71 75 65 20 24 63 lsort -unique $c
0d50: 73 65 74 73 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 sets]. }..
0d60: 20 23 20 72 65 73 75 6c 74 20 3d 20 64 69 63 74 # result = dict
0d70: 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 (item -> list (
0d80: 63 68 61 6e 67 65 73 65 74 29 29 0a 20 20 20 20 changeset)).
0d90: 6d 65 74 68 6f 64 20 70 72 65 64 65 63 65 73 73 method predecess
0da0: 6f 72 6d 61 70 20 7b 7d 20 7b 0a 09 23 20 4e 4f ormap {} {..# NO
0db0: 54 45 20 2f 20 46 55 54 55 52 45 3a 20 50 6f 73 TE / FUTURE: Pos
0dc0: 73 69 62 6c 65 20 62 6f 74 74 6c 65 6e 65 63 6b sible bottleneck
0dd0: 2e 0a 09 61 72 72 61 79 20 73 65 74 20 74 6d 70 ...array set tmp
0de0: 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 65 {}..foreach {re
0df0: 76 20 63 68 69 6c 64 72 65 6e 7d 20 5b 24 73 65 v children} [$se
0e00: 6c 66 20 70 72 65 6d 61 70 5d 20 7b 0a 09 20 20 lf premap] {..
0e10: 20 20 66 6f 72 65 61 63 68 20 63 68 69 6c 64 20 foreach child
0e20: 24 63 68 69 6c 64 72 65 6e 20 7b 0a 09 09 6c 61 $children {...la
0e30: 70 70 65 6e 64 20 74 6d 70 28 24 72 65 76 29 20 ppend tmp($rev)
0e40: 24 6d 79 69 74 65 6d 6d 61 70 28 24 63 68 69 6c $myitemmap($chil
0e50: 64 29 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73 d).. }.. s
0e60: 65 74 20 74 6d 70 28 24 72 65 76 29 20 5b 6c 73 et tmp($rev) [ls
0e70: 6f 72 74 20 2d 75 6e 69 71 75 65 20 24 74 6d 70 ort -unique $tmp
0e80: 28 24 72 65 76 29 5d 0a 09 7d 0a 09 72 65 74 75 ($rev)]..}..retu
0e90: 72 6e 20 5b 61 72 72 61 79 20 67 65 74 20 74 6d rn [array get tm
0ea0: 70 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 p]. }.. #
0eb0: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 item -> list (it
0ec0: 65 6d 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 6e em). method n
0ed0: 65 78 74 6d 61 70 20 7b 7d 20 7b 0a 09 69 66 20 extmap {} {..if
0ee0: 7b 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 6e 65 78 {[llength $mynex
0ef0: 74 6d 61 70 5d 7d 20 7b 20 72 65 74 75 72 6e 20 tmap]} { return
0f00: 24 6d 79 6e 65 78 74 6d 61 70 20 7d 0a 09 24 6d $mynextmap }..$m
0f10: 79 74 79 70 65 6f 62 6a 20 73 75 63 63 65 73 73 ytypeobj success
0f20: 6f 72 73 20 74 6d 70 20 24 6d 79 69 74 65 6d 73 ors tmp $myitems
0f30: 0a 09 73 65 74 20 6d 79 6e 65 78 74 6d 61 70 20 ..set mynextmap
0f40: 5b 61 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a [array get tmp].
0f50: 09 72 65 74 75 72 6e 20 24 6d 79 6e 65 78 74 6d .return $mynextm
0f60: 61 70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 ap. }.. #
0f70: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 item -> list (it
0f80: 65 6d 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 70 em). method p
0f90: 72 65 6d 61 70 20 7b 7d 20 7b 0a 09 69 66 20 7b remap {} {..if {
0fa0: 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 70 72 65 6d [llength $myprem
0fb0: 61 70 5d 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d ap]} { return $m
0fc0: 79 70 72 65 6d 61 70 20 7d 0a 09 24 6d 79 74 79 ypremap }..$myty
0fd0: 70 65 6f 62 6a 20 70 72 65 64 65 63 65 73 73 6f peobj predecesso
0fe0: 72 73 20 74 6d 70 20 24 6d 79 69 74 65 6d 73 0a rs tmp $myitems.
0ff0: 09 73 65 74 20 6d 79 70 72 65 6d 61 70 20 5b 61 .set mypremap [a
1000: 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 09 72 rray get tmp]..r
1010: 65 74 75 72 6e 20 24 6d 79 70 72 65 6d 61 70 0a eturn $mypremap.
1020: 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f }.. metho
1030: 64 20 62 72 65 61 6b 69 6e 74 65 72 6e 61 6c 64 d breakinternald
1040: 65 70 65 6e 64 65 6e 63 69 65 73 20 7b 7d 20 7b ependencies {} {
1050: 0a 09 23 20 54 68 69 73 20 6d 65 74 68 6f 64 20 ..# This method
1060: 69 6e 73 70 65 63 74 73 20 74 68 65 20 63 68 61 inspects the cha
1070: 6e 67 65 73 65 74 73 20 66 6f 72 20 69 6e 74 65 ngesets for inte
1080: 72 6e 61 6c 0a 09 23 20 64 65 70 65 6e 64 65 6e rnal..# dependen
1090: 63 69 65 73 2e 20 4e 6f 74 68 69 6e 67 20 69 73 cies. Nothing is
10a0: 20 64 6f 6e 65 20 69 66 20 74 68 65 72 65 20 61 done if there a
10b0: 72 65 20 6e 6f 0a 09 23 20 73 75 63 68 2e 20 4f re no..# such. O
10c0: 74 68 65 72 77 69 73 65 20 74 68 65 20 63 68 61 therwise the cha
10d0: 6e 67 65 73 65 74 20 69 73 20 73 70 6c 69 74 20 ngeset is split
10e0: 69 6e 74 6f 20 61 20 73 65 74 20 6f 66 0a 09 23 into a set of..#
10f0: 20 66 72 61 67 6d 65 6e 74 73 20 77 69 74 68 6f fragments witho
1100: 75 74 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 ut internal depe
1110: 6e 64 65 6e 63 69 65 73 2c 20 74 72 61 6e 73 66 ndencies, transf
1120: 6f 72 6d 69 6e 67 20 74 68 65 0a 09 23 20 69 6e orming the..# in
1130: 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 ternal dependenc
1140: 69 65 73 20 69 6e 74 6f 20 65 78 74 65 72 6e 61 ies into externa
1150: 6c 20 6f 6e 65 73 2e 20 54 68 65 20 6e 65 77 20 l ones. The new
1160: 63 68 61 6e 67 65 73 65 74 73 0a 09 23 20 61 72 changesets..# ar
1170: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c e added to the l
1180: 69 73 74 20 6f 66 20 61 6c 6c 20 63 68 61 6e 67 ist of all chang
1190: 65 73 65 74 73 2e 0a 0a 09 23 20 57 65 20 70 65 esets....# We pe
11a0: 72 66 6f 72 6d 20 61 6c 6c 20 6e 65 63 65 73 73 rform all necess
11b0: 61 72 79 20 73 70 6c 69 74 73 20 69 6e 20 6f 6e ary splits in on
11c0: 65 20 67 6f 2c 20 69 6e 73 74 65 61 64 20 6f 66 e go, instead of
11d0: 20 6f 6e 6c 79 0a 09 23 20 6f 6e 65 2e 20 54 68 only..# one. Th
11e0: 65 20 70 72 65 76 69 6f 75 73 20 61 6c 67 6f 72 e previous algor
11f0: 69 74 68 6d 2c 20 61 64 61 70 74 65 64 20 66 72 ithm, adapted fr
1200: 6f 6d 20 63 76 73 32 73 76 6e 2c 20 63 6f 6d 70 om cvs2svn, comp
1210: 75 74 65 64 0a 09 23 20 61 20 6c 6f 74 20 6f 66 uted..# a lot of
1220: 20 73 74 61 74 65 20 77 68 69 63 68 20 77 61 73 state which was
1230: 20 74 68 72 6f 77 6e 20 61 77 61 79 20 61 6e 64 thrown away and
1240: 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 64 20 61 then computed a
1250: 67 61 69 6e 0a 09 23 20 66 6f 72 20 65 61 63 68 gain..# for each
1260: 20 6f 66 20 74 68 65 20 66 72 61 67 6d 65 6e 74 of the fragment
1270: 73 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 s. It should be
1280: 65 61 73 69 65 72 20 74 6f 20 75 70 64 61 74 65 easier to update
1290: 20 61 6e 64 0a 09 23 20 72 65 75 73 65 20 74 68 and..# reuse th
12a0: 61 74 20 73 74 61 74 65 2e 0a 0a 09 23 20 54 68 at state....# Th
12b0: 65 20 63 6f 64 65 20 63 68 65 63 6b 73 20 6f 6e e code checks on
12c0: 6c 79 20 73 75 63 65 73 73 6f 72 20 64 65 70 65 ly sucessor depe
12d0: 6e 64 65 6e 63 69 65 73 2c 20 61 73 20 74 68 69 ndencies, as thi
12e0: 73 0a 09 23 20 61 75 74 6f 6d 61 74 69 63 61 6c s..# automatical
12f0: 6c 79 20 63 6f 76 65 72 73 20 74 68 65 20 70 72 ly covers the pr
1300: 65 64 65 63 65 73 73 6f 72 20 64 65 70 65 6e 64 edecessor depend
1310: 65 6e 63 69 65 73 20 61 73 20 77 65 6c 6c 20 28 encies as well (
1320: 41 0a 09 23 20 73 75 63 63 65 73 73 6f 72 20 64 A..# successor d
1330: 65 70 65 6e 64 65 6e 63 79 20 61 20 2d 3e 20 62 ependency a -> b
1340: 20 69 73 20 61 6c 73 6f 20 61 20 70 72 65 64 65 is also a prede
1350: 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 cessor dependenc
1360: 79 0a 09 23 20 62 20 2d 3e 20 61 29 2e 0a 0a 09 y..# b -> a)....
1370: 23 20 41 72 72 61 79 20 6f 66 20 64 65 70 65 6e # Array of depen
1380: 64 65 6e 63 69 65 73 20 28 70 61 72 65 6e 74 20 dencies (parent
1390: 2d 3e 20 63 68 69 6c 64 29 2e 20 54 68 69 73 20 -> child). This
13a0: 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 0a 09 is pulled from..
13b0: 23 20 74 68 65 20 73 74 61 74 65 2c 20 61 6e 64 # the state, and
13c0: 20 6c 69 6d 69 74 65 64 20 74 6f 20 73 75 63 63 limited to succ
13d0: 65 73 73 6f 72 73 20 77 69 74 68 69 6e 20 74 68 essors within th
13e0: 65 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 61 e changeset....a
13f0: 72 72 61 79 20 73 65 74 20 64 65 70 65 6e 64 65 rray set depende
1400: 6e 63 69 65 73 20 7b 7d 0a 09 24 6d 79 74 79 70 ncies {}..$mytyp
1410: 65 6f 62 6a 20 69 6e 74 65 72 6e 61 6c 73 75 63 eobj internalsuc
1420: 63 65 73 73 6f 72 73 20 64 65 70 65 6e 64 65 6e cessors dependen
1430: 63 69 65 73 20 24 6d 79 69 74 65 6d 73 0a 09 69 cies $myitems..i
1440: 66 20 7b 21 5b 61 72 72 61 79 20 73 69 7a 65 20 f {![array size
1450: 64 65 70 65 6e 64 65 6e 63 69 65 73 5d 7d 20 7b dependencies]} {
1460: 72 65 74 75 72 6e 20 30 7d 20 3b 20 23 20 4e 6f return 0} ; # No
1470: 74 68 69 6e 67 20 74 6f 20 62 72 65 61 6b 2e 0a thing to break..
1480: 0a 09 6c 6f 67 20 77 72 69 74 65 20 35 20 63 73 ..log write 5 cs
1490: 65 74 73 20 2e 2e 2e 5b 24 73 65 6c 66 20 73 74 ets ...[$self st
14a0: 72 5d 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e r]..............
14b0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
14c0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
14d0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 0a 0a 09 23 20 57 65 ............# We
14e0: 20 68 61 76 65 20 69 6e 74 65 72 6e 61 6c 20 64 have internal d
14f0: 65 70 65 6e 64 65 6e 63 69 65 73 20 74 6f 20 62 ependencies to b
1500: 72 65 61 6b 2e 20 57 65 20 6e 6f 77 20 69 74 65 reak. We now ite
1510: 72 61 74 65 20 6f 76 65 72 0a 09 23 20 61 6c 6c rate over..# all
1520: 20 70 6f 73 69 74 69 6f 6e 73 20 69 6e 20 74 68 positions in th
1530: 65 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 e list (which is
1540: 20 63 68 72 6f 6e 6f 6c 6f 67 69 63 61 6c 2c 20 chronological,
1550: 61 74 20 6c 65 61 73 74 0a 09 23 20 61 73 20 66 at least..# as f
1560: 61 72 20 61 73 20 74 68 65 20 74 69 6d 65 73 74 ar as the timest
1570: 61 6d 70 73 20 61 72 65 20 63 6f 72 72 65 63 74 amps are correct
1580: 20 61 6e 64 20 75 6e 69 71 75 65 29 20 61 6e 64 and unique) and
1590: 0a 09 23 20 64 65 74 65 72 6d 69 6e 65 20 74 68 ..# determine th
15a0: 65 20 62 65 73 74 20 70 6f 73 69 74 69 6f 6e 20 e best position
15b0: 66 6f 72 20 74 68 65 20 62 72 65 61 6b 2c 20 62 for the break, b
15c0: 79 20 74 72 79 69 6e 67 20 74 6f 0a 09 23 20 62 y trying to..# b
15d0: 72 65 61 6b 20 61 73 20 6d 61 6e 79 20 64 65 70 reak as many dep
15e0: 65 6e 64 65 6e 63 69 65 73 20 61 73 20 70 6f 73 endencies as pos
15f0: 73 69 62 6c 65 20 69 6e 20 6f 6e 65 20 67 6f 2e sible in one go.
1600: 20 57 68 65 6e 20 61 0a 09 23 20 62 72 65 61 6b When a..# break
1610: 20 77 61 73 20 66 6f 75 6e 64 20 74 68 69 73 20 was found this
1620: 69 73 20 72 65 64 6f 6e 65 20 66 6f 72 20 74 68 is redone for th
1630: 65 20 66 72 61 67 6d 65 6e 74 73 20 63 6f 6d 69 e fragments comi
1640: 6e 67 20 61 6e 64 0a 09 23 20 61 66 74 65 72 2c ng and..# after,
1650: 20 61 66 74 65 72 20 75 70 64 69 6e 67 20 74 68 after upding th
1660: 65 20 63 72 6f 73 73 69 6e 67 20 69 6e 66 6f 72 e crossing infor
1670: 6d 61 74 69 6f 6e 2e 0a 0a 09 23 20 44 61 74 61 mation....# Data
1680: 20 73 74 72 75 63 74 75 72 65 73 3a 0a 09 23 20 structures:..#
1690: 4d 61 70 3a 20 20 50 4f 53 20 20 20 72 65 76 69 Map: POS revi
16a0: 73 69 6f 6e 20 69 64 20 20 20 20 20 20 2d 3e 20 sion id ->
16b0: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73 74 position in list
16c0: 2e 0a 09 23 20 20 20 20 20 20 20 43 52 4f 53 53 ...# CROSS
16d0: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73 position in lis
16e0: 74 20 2d 3e 20 6e 75 6d 62 65 72 20 6f 66 20 64 t -> number of d
16f0: 65 70 65 6e 64 65 6e 63 69 65 73 20 63 72 6f 73 ependencies cros
1700: 73 69 6e 67 20 69 74 0a 09 23 20 20 20 20 20 20 sing it..#
1710: 20 44 45 50 43 20 20 64 65 70 65 6e 64 65 6e 63 DEPC dependenc
1720: 79 20 20 20 20 20 20 20 2d 3e 20 70 6f 73 69 74 y -> posit
1730: 69 6f 6e 73 20 69 74 20 63 72 6f 73 73 65 73 0a ions it crosses.
1740: 09 23 20 4c 69 73 74 3a 20 52 41 4e 47 45 20 4f .# List: RANGE O
1750: 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 f the positions
1760: 69 74 73 65 6c 66 2e 0a 09 23 20 41 20 64 65 70 itself...# A dep
1770: 65 6e 64 65 6e 63 79 20 69 73 20 61 20 73 69 6e endency is a sin
1780: 67 6c 65 2d 65 6c 65 6d 65 6e 74 20 6d 61 70 20 gle-element map
1790: 70 61 72 65 6e 74 20 2d 3e 20 63 68 69 6c 64 0a parent -> child.
17a0: 0a 09 49 6e 69 74 69 61 6c 69 7a 65 42 72 65 61 ..InitializeBrea
17b0: 6b 53 74 61 74 65 20 24 6d 79 69 74 65 6d 73 0a kState $myitems.
17c0: 0a 09 73 65 74 20 66 72 61 67 6d 65 6e 74 73 20 ..set fragments
17d0: 7b 7d 0a 09 73 65 74 20 70 65 6e 64 69 6e 67 20 {}..set pending
17e0: 20 20 5b 6c 69 73 74 20 24 72 61 6e 67 65 5d 0a [list $range].
17f0: 09 73 65 74 20 61 74 20 20 20 20 20 20 20 20 30 .set at 0
1800: 0a 09 61 72 72 61 79 20 73 65 74 20 62 72 65 61 ..array set brea
1810: 6b 73 20 7b 7d 0a 0a 09 77 68 69 6c 65 20 7b 24 ks {}...while {$
1820: 61 74 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24 70 at < [llength $p
1830: 65 6e 64 69 6e 67 5d 7d 20 7b 0a 09 20 20 20 20 ending]} {..
1840: 73 65 74 20 63 75 72 72 65 6e 74 20 5b 6c 69 6e set current [lin
1850: 64 65 78 20 24 70 65 6e 64 69 6e 67 20 24 61 74 dex $pending $at
1860: 5d 0a 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 ]... log writ
1870: 65 20 36 20 63 73 65 74 73 20 7b 2e 20 2e 20 2e e 6 csets {. . .
1880: 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e 2e 2e . ... ..... ....
1890: 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e .... ...........
18a0: 2e 2e 7d 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 ..}.. log wri
18b0: 74 65 20 36 20 63 73 65 74 73 20 7b 53 63 68 65 te 6 csets {Sche
18c0: 64 75 6c 65 64 20 20 20 5b 6a 6f 69 6e 20 5b 50 duled [join [P
18d0: 52 73 20 5b 6c 72 61 6e 67 65 20 24 70 65 6e 64 Rs [lrange $pend
18e0: 69 6e 67 20 24 61 74 20 65 6e 64 5d 5d 20 7b 20 ing $at end]] {
18f0: 7d 5d 7d 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 }]}.. log wri
1900: 74 65 20 36 20 63 73 65 74 73 20 7b 43 6f 6e 73 te 6 csets {Cons
1910: 69 64 65 72 69 6e 67 20 5b 50 52 20 24 63 75 72 idering [PR $cur
1920: 72 65 6e 74 5d 20 5c 5b 24 61 74 2f 5b 6c 6c 65 rent] \[$at/[lle
1930: 6e 67 74 68 20 24 70 65 6e 64 69 6e 67 5d 5c 5d ngth $pending]\]
1940: 7d 0a 0a 09 20 20 20 20 73 65 74 20 62 65 73 74 }... set best
1950: 20 5b 46 69 6e 64 42 65 73 74 42 72 65 61 6b 20 [FindBestBreak
1960: 24 63 75 72 72 65 6e 74 5d 0a 0a 09 20 20 20 20 $current]...
1970: 69 66 20 7b 24 62 65 73 74 20 3c 20 30 7d 20 7b if {$best < 0} {
1980: 0a 09 09 23 20 54 68 65 20 69 6e 73 70 65 63 74 ...# The inspect
1990: 65 64 20 72 61 6e 67 65 20 68 61 73 20 6e 6f 20 ed range has no
19a0: 69 6e 74 65 72 6e 61 6c 0a 09 09 23 20 64 65 70 internal...# dep
19b0: 65 6e 64 65 6e 63 69 65 73 2e 20 54 68 69 73 20 endencies. This
19c0: 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 66 72 is a complete fr
19d0: 61 67 6d 65 6e 74 2e 0a 09 09 6c 61 70 70 65 6e agment....lappen
19e0: 64 20 66 72 61 67 6d 65 6e 74 73 20 24 63 75 72 d fragments $cur
19f0: 72 65 6e 74 0a 0a 09 09 6c 6f 67 20 77 72 69 74 rent....log writ
1a00: 65 20 36 20 63 73 65 74 73 20 22 4e 6f 20 62 72 e 6 csets "No br
1a10: 65 61 6b 73 2c 20 66 69 6e 61 6c 22 0a 09 20 20 eaks, final"..
1a20: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 23 20 53 } else {...# S
1a30: 70 6c 69 74 20 74 68 65 20 72 61 6e 67 65 20 61 plit the range a
1a40: 6e 64 20 73 63 68 65 64 75 6c 65 20 74 68 65 20 nd schedule the
1a50: 72 65 73 75 6c 74 69 6e 67 20 66 72 61 67 6d 65 resulting fragme
1a60: 6e 74 73 0a 09 09 23 20 66 6f 72 20 66 75 72 74 nts...# for furt
1a70: 68 65 72 20 69 6e 73 70 65 63 74 69 6f 6e 2e 20 her inspection.
1a80: 52 65 6d 65 6d 62 65 72 20 74 68 65 20 6e 75 6d Remember the num
1a90: 62 65 72 20 6f 66 0a 09 09 23 20 64 65 70 65 6e ber of...# depen
1aa0: 64 65 6e 63 69 65 73 20 63 75 74 20 62 65 66 6f dencies cut befo
1ab0: 72 65 20 77 65 20 72 65 6d 6f 76 65 20 74 68 65 re we remove the
1ac0: 6d 20 66 72 6f 6d 0a 09 09 23 20 63 6f 6e 73 69 m from...# consi
1ad0: 64 65 72 61 74 69 6f 6e 2c 20 66 6f 72 20 64 6f deration, for do
1ae0: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 6c 61 74 65 cumentation late
1af0: 72 2e 0a 0a 09 09 73 65 74 20 62 72 65 61 6b 73 r.....set breaks
1b00: 28 24 62 65 73 74 29 20 24 63 72 6f 73 73 28 24 ($best) $cross($
1b10: 62 65 73 74 29 0a 0a 09 09 6c 6f 67 20 77 72 69 best)....log wri
1b20: 74 65 20 36 20 63 73 65 74 73 20 22 42 65 73 74 te 6 csets "Best
1b30: 20 62 72 65 61 6b 20 40 20 24 62 65 73 74 2c 20 break @ $best,
1b40: 63 75 74 74 69 6e 67 20 5b 6e 73 70 20 24 63 72 cutting [nsp $cr
1b50: 6f 73 73 28 24 62 65 73 74 29 20 64 65 70 65 6e oss($best) depen
1b60: 64 65 6e 63 79 20 64 65 70 65 6e 64 65 6e 63 69 dency dependenci
1b70: 65 73 5d 22 0a 0a 09 09 23 20 4e 6f 74 65 3a 20 es]"....# Note:
1b80: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 62 65 73 The value of bes
1b90: 74 20 69 73 20 61 6e 20 61 62 6f 6c 75 74 65 20 t is an abolute
1ba0: 6c 6f 63 61 74 69 6f 6e 20 69 6e 0a 09 09 23 20 location in...#
1bb0: 6d 79 69 74 65 6d 73 2e 20 55 73 65 20 74 68 65 myitems. Use the
1bc0: 20 73 74 61 72 74 20 6f 66 20 63 75 72 72 65 6e start of curren
1bd0: 74 20 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 0a t to make it an.
1be0: 09 09 23 20 69 6e 64 65 78 20 61 62 73 6f 6c 75 ..# index absolu
1bf0: 74 65 20 74 6f 20 63 75 72 72 65 6e 74 2e 0a 0a te to current...
1c00: 09 09 73 65 74 20 62 72 65 6c 20 5b 65 78 70 72 ..set brel [expr
1c10: 20 7b 24 62 65 73 74 20 2d 20 5b 6c 69 6e 64 65 {$best - [linde
1c20: 78 20 24 63 75 72 72 65 6e 74 20 30 5d 7d 5d 0a x $current 0]}].
1c30: 09 09 73 65 74 20 62 6e 65 78 74 20 24 62 72 65 ..set bnext $bre
1c40: 6c 20 3b 20 69 6e 63 72 20 62 6e 65 78 74 0a 09 l ; incr bnext..
1c50: 09 73 65 74 20 66 72 61 67 62 65 66 6f 72 65 20 .set fragbefore
1c60: 5b 6c 72 61 6e 67 65 20 24 63 75 72 72 65 6e 74 [lrange $current
1c70: 20 30 20 24 62 72 65 6c 5d 0a 09 09 73 65 74 20 0 $brel]...set
1c80: 66 72 61 67 61 66 74 65 72 20 20 5b 6c 72 61 6e fragafter [lran
1c90: 67 65 20 24 63 75 72 72 65 6e 74 20 24 62 6e 65 ge $current $bne
1ca0: 78 74 20 65 6e 64 5d 0a 0a 09 09 6c 6f 67 20 77 xt end]....log w
1cb0: 72 69 74 65 20 36 20 63 73 65 74 73 20 22 4e 65 rite 6 csets "Ne
1cc0: 77 20 70 69 65 63 65 73 20 20 5b 50 52 20 24 66 w pieces [PR $f
1cd0: 72 61 67 62 65 66 6f 72 65 5d 20 5b 50 52 20 24 ragbefore] [PR $
1ce0: 66 72 61 67 61 66 74 65 72 5d 22 0a 0a 09 09 69 fragafter]"....i
1cf0: 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 ntegrity assert
1d00: 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 72 61 67 62 {[llength $fragb
1d10: 65 66 6f 72 65 5d 7d 20 7b 46 6f 75 6e 64 20 7a efore]} {Found z
1d20: 65 72 6f 2d 6c 65 6e 67 74 68 20 66 72 61 67 6d ero-length fragm
1d30: 65 6e 74 20 61 74 20 74 68 65 20 62 65 67 69 6e ent at the begin
1d40: 6e 69 6e 67 7d 0a 09 09 69 6e 74 65 67 72 69 74 ning}...integrit
1d50: 79 20 61 73 73 65 72 74 20 7b 5b 6c 6c 65 6e 67 y assert {[lleng
1d60: 74 68 20 24 66 72 61 67 61 66 74 65 72 5d 7d 20 th $fragafter]}
1d70: 20 7b 46 6f 75 6e 64 20 7a 65 72 6f 2d 6c 65 6e {Found zero-len
1d80: 67 74 68 20 66 72 61 67 6d 65 6e 74 20 61 74 20 gth fragment at
1d90: 74 68 65 20 65 6e 64 7d 0a 0a 09 09 6c 61 70 70 the end}....lapp
1da0: 65 6e 64 20 70 65 6e 64 69 6e 67 20 24 66 72 61 end pending $fra
1db0: 67 62 65 66 6f 72 65 20 24 66 72 61 67 61 66 74 gbefore $fragaft
1dc0: 65 72 0a 09 09 43 75 74 41 74 20 24 62 65 73 74 er...CutAt $best
1dd0: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 6e .. }... in
1de0: 63 72 20 61 74 0a 09 7d 0a 0a 09 6c 6f 67 20 77 cr at..}...log w
1df0: 72 69 74 65 20 36 20 63 73 65 74 73 20 22 2e 20 rite 6 csets ".
1e00: 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e . .. ... ..... .
1e10: 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e ....... ........
1e20: 2e 2e 2e 2e 2e 22 0a 0a 09 23 20 28 2a 29 20 57 ....."...# (*) W
1e30: 65 20 63 6c 65 61 72 20 6f 75 74 20 74 68 65 20 e clear out the
1e40: 61 73 73 6f 63 69 61 74 65 64 20 70 61 72 74 20 associated part
1e50: 6f 66 20 74 68 65 20 6d 79 69 74 65 6d 6d 61 70 of the myitemmap
1e60: 0a 09 23 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6e ..# in-memory in
1e70: 64 65 78 20 69 6e 20 70 72 65 70 61 72 61 74 69 dex in preparati
1e80: 6f 6e 20 66 6f 72 20 6e 65 77 20 64 61 74 61 2e on for new data.
1e90: 20 41 20 73 69 6d 70 6c 65 20 75 6e 73 65 74 0a A simple unset.
1ea0: 09 23 20 69 73 20 65 6e 6f 75 67 68 2c 20 77 65 .# is enough, we
1eb0: 20 68 61 76 65 20 6e 6f 20 73 79 6d 62 6f 6c 20 have no symbol
1ec0: 63 68 61 6e 67 65 73 65 74 73 20 61 74 20 74 68 changesets at th
1ed0: 69 73 20 74 69 6d 65 2c 20 61 6e 64 0a 09 23 20 is time, and..#
1ee0: 74 68 75 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 thus never more
1ef0: 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e than one referen
1f00: 63 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a ce in the list..
1f10: 0a 09 66 6f 72 65 61 63 68 20 69 69 64 20 24 6d ..foreach iid $m
1f20: 79 69 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65 yitems {.. se
1f30: 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79 74 t key [list $myt
1f40: 79 70 65 20 24 69 69 64 5d 0a 09 20 20 20 20 75 ype $iid].. u
1f50: 6e 73 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24 nset myitemmap($
1f60: 6b 65 79 29 0a 09 7d 0a 0a 09 23 20 43 72 65 61 key)..}...# Crea
1f70: 74 65 20 63 68 61 6e 67 65 73 65 74 73 20 66 6f te changesets fo
1f80: 72 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 2c r the fragments,
1f90: 20 72 65 75 73 69 6e 67 20 74 68 65 20 63 75 72 reusing the cur
1fa0: 72 65 6e 74 20 6f 6e 65 0a 09 23 20 66 6f 72 20 rent one..# for
1fb0: 74 68 65 20 66 69 72 73 74 20 66 72 61 67 6d 65 the first fragme
1fc0: 6e 74 2e 20 57 65 20 73 6f 72 74 20 74 68 65 6d nt. We sort them
1fd0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 6c 6c in order to all
1fe0: 6f 77 0a 09 23 20 63 68 65 63 6b 69 6e 67 20 66 ow..# checking f
1ff0: 6f 72 20 67 61 70 73 20 61 6e 64 20 6e 69 63 65 or gaps and nice
2000: 20 6d 65 73 73 61 67 65 73 2e 0a 0a 09 73 65 74 messages....set
2010: 20 66 72 61 67 6d 65 6e 74 73 20 5b 6c 73 6f 72 fragments [lsor
2020: 74 20 2d 69 6e 64 65 78 20 30 20 2d 69 6e 74 65 t -index 0 -inte
2030: 67 65 72 20 24 66 72 61 67 6d 65 6e 74 73 5d 0a ger $fragments].
2040: 0a 09 23 70 75 74 73 20 5c 74 2e 5b 6a 6f 69 6e ..#puts \t.[join
2050: 20 5b 50 52 73 20 24 66 72 61 67 6d 65 6e 74 73 [PRs $fragments
2060: 5d 20 2e 5c 6e 5c 74 2e 5d 2e 0a 0a 09 42 6f 72 ] .\n\t.]....Bor
2070: 64 65 72 20 5b 6c 69 6e 64 65 78 20 24 66 72 61 der [lindex $fra
2080: 67 6d 65 6e 74 73 20 30 5d 20 66 69 72 73 74 73 gments 0] firsts
2090: 20 66 69 72 73 74 65 0a 0a 09 69 6e 74 65 67 72 firste...integr
20a0: 69 74 79 20 61 73 73 65 72 74 20 7b 24 66 69 72 ity assert {$fir
20b0: 73 74 73 20 3d 3d 20 30 7d 20 7b 42 61 64 20 66 sts == 0} {Bad f
20c0: 72 61 67 6d 65 6e 74 20 73 74 61 72 74 20 40 20 ragment start @
20d0: 24 66 69 72 73 74 73 2c 20 67 61 70 2c 20 6f 72 $firsts, gap, or
20e0: 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e before beginnin
20f0: 67 20 6f 66 20 74 68 65 20 72 61 6e 67 65 7d 0a g of the range}.
2100: 0a 09 73 65 74 20 6c 61 73 74 65 20 24 66 69 72 ..set laste $fir
2110: 73 74 65 0a 09 66 6f 72 65 61 63 68 20 66 72 61 ste..foreach fra
2120: 67 6d 65 6e 74 20 5b 6c 72 61 6e 67 65 20 24 66 gment [lrange $f
2130: 72 61 67 6d 65 6e 74 73 20 31 20 65 6e 64 5d 20 ragments 1 end]
2140: 7b 0a 09 20 20 20 20 42 6f 72 64 65 72 20 24 66 {.. Border $f
2150: 72 61 67 6d 65 6e 74 20 73 20 65 0a 09 20 20 20 ragment s e..
2160: 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 integrity asser
2170: 74 20 7b 24 6c 61 73 74 65 20 3d 3d 20 28 24 73 t {$laste == ($s
2180: 20 2d 20 31 29 7d 20 7b 42 61 64 20 66 72 61 67 - 1)} {Bad frag
2190: 6d 65 6e 74 20 62 6f 72 64 65 72 20 3c 24 6c 61 ment border <$la
21a0: 73 74 65 20 7c 20 24 73 3e 2c 20 67 61 70 20 6f ste | $s>, gap o
21b0: 72 20 6f 76 65 72 6c 61 70 7d 0a 0a 09 20 20 20 r overlap}...
21c0: 20 73 65 74 20 6e 65 77 20 5b 24 74 79 70 65 20 set new [$type
21d0: 25 41 55 54 4f 25 20 24 6d 79 70 72 6f 6a 65 63 %AUTO% $myprojec
21e0: 74 20 24 6d 79 74 79 70 65 20 24 6d 79 73 72 63 t $mytype $mysrc
21f0: 69 64 20 5b 6c 72 61 6e 67 65 20 24 6d 79 69 74 id [lrange $myit
2200: 65 6d 73 20 24 73 20 24 65 5d 5d 0a 0a 20 20 20 ems $s $e]]..
2210: 20 20 20 20 20 20 20 20 20 6c 6f 67 20 77 72 69 log wri
2220: 74 65 20 34 20 63 73 65 74 73 20 22 42 72 65 61 te 4 csets "Brea
2230: 6b 69 6e 67 20 5b 24 73 65 6c 66 20 73 74 72 20 king [$self str
2240: 5d 20 40 20 24 6c 61 73 74 65 2c 20 6e 65 77 20 ] @ $laste, new
2250: 5b 24 6e 65 77 20 73 74 72 5d 2c 20 63 75 74 74 [$new str], cutt
2260: 69 6e 67 20 24 62 72 65 61 6b 73 28 24 6c 61 73 ing $breaks($las
2270: 74 65 29 22 0a 0a 09 20 20 20 20 73 65 74 20 6c te)"... set l
2280: 61 73 74 65 20 24 65 0a 09 7d 0a 0a 09 69 6e 74 aste $e..}...int
2290: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 0a egrity assert {.
22a0: 09 20 20 20 20 24 6c 61 73 74 65 20 3d 3d 20 28 . $laste == (
22b0: 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 69 74 65 6d [llength $myitem
22c0: 73 5d 2d 31 29 0a 09 7d 20 7b 42 61 64 20 66 72 s]-1)..} {Bad fr
22d0: 61 67 6d 65 6e 74 20 65 6e 64 20 40 20 24 6c 61 agment end @ $la
22e0: 73 74 65 2c 20 67 61 70 2c 20 6f 72 20 62 65 79 ste, gap, or bey
22f0: 6f 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 72 ond end of the r
2300: 61 6e 67 65 7d 0a 0a 09 23 20 50 75 74 20 74 68 ange}...# Put th
2310: 65 20 66 69 72 73 74 20 66 72 61 67 6d 65 6e 74 e first fragment
2320: 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e into the curren
2330: 74 20 63 68 61 6e 67 65 73 65 74 2c 20 61 6e 64 t changeset, and
2340: 0a 09 23 20 75 70 64 61 74 65 20 74 68 65 20 69 ..# update the i
2350: 6e 2d 6d 65 6d 6f 72 79 20 69 6e 64 65 78 2e 20 n-memory index.
2360: 57 65 20 63 61 6e 20 73 69 6d 70 6c 79 20 28 72 We can simply (r
2370: 65 29 61 64 64 20 74 68 65 20 69 74 65 6d 73 0a e)add the items.
2380: 09 23 20 62 65 63 61 75 73 65 20 77 65 20 63 6c .# because we cl
2390: 65 61 72 65 64 20 74 68 65 20 70 72 65 76 69 6f eared the previo
23a0: 75 73 6c 79 20 65 78 69 73 74 69 6e 67 20 69 6e usly existing in
23b0: 66 6f 72 6d 61 74 69 6f 6e 2c 20 73 65 65 0a 09 formation, see..
23c0: 23 20 28 2a 29 20 61 62 6f 76 65 2e 20 50 65 72 # (*) above. Per
23d0: 73 69 73 74 65 6e 63 65 20 64 6f 65 73 20 6e 6f sistence does no
23e0: 74 20 6d 61 74 74 65 72 20 68 65 72 65 2c 20 6e t matter here, n
23f0: 6f 6e 65 20 6f 66 20 74 68 65 0a 09 23 20 63 68 one of the..# ch
2400: 61 6e 67 65 73 65 74 73 20 68 61 73 20 62 65 65 angesets has bee
2410: 6e 20 73 61 76 65 64 20 74 6f 20 74 68 65 20 70 n saved to the p
2420: 65 72 73 69 73 74 65 6e 74 20 73 74 61 74 65 20 ersistent state
2430: 79 65 74 2e 0a 0a 09 73 65 74 20 6d 79 69 74 65 yet....set myite
2440: 6d 73 20 5b 6c 72 61 6e 67 65 20 24 6d 79 69 74 ms [lrange $myit
2450: 65 6d 73 20 30 20 24 66 69 72 73 74 65 5d 0a 09 ems 0 $firste]..
2460: 66 6f 72 65 61 63 68 20 69 69 64 20 24 6d 79 69 foreach iid $myi
2470: 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65 74 20 tems {.. set
2480: 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79 74 79 70 key [list $mytyp
2490: 65 20 24 69 69 64 5d 0a 09 20 20 20 20 73 65 74 e $iid].. set
24a0: 20 6d 79 69 74 65 6d 6d 61 70 28 24 6b 65 79 29 myitemmap($key)
24b0: 20 24 73 65 6c 66 0a 09 7d 0a 0a 09 72 65 74 75 $self..}...retu
24c0: 72 6e 20 31 0a 20 20 20 20 7d 0a 0a 20 20 20 20 rn 1. }..
24d0: 6d 65 74 68 6f 64 20 70 65 72 73 69 73 74 20 7b method persist {
24e0: 7d 20 7b 0a 09 73 65 74 20 74 69 64 20 24 6d 79 } {..set tid $my
24f0: 63 73 74 79 70 65 28 24 6d 79 74 79 70 65 29 0a cstype($mytype).
2500: 09 73 65 74 20 70 69 64 20 5b 24 6d 79 70 72 6f .set pid [$mypro
2510: 6a 65 63 74 20 69 64 5d 0a 09 73 65 74 20 70 6f ject id]..set po
2520: 73 20 30 0a 0a 09 73 74 61 74 65 20 74 72 61 6e s 0...state tran
2530: 73 61 63 74 69 6f 6e 20 7b 0a 09 20 20 20 20 73 saction {.. s
2540: 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 49 4e 53 tate run {...INS
2550: 45 52 54 20 49 4e 54 4f 20 63 68 61 6e 67 65 73 ERT INTO changes
2560: 65 74 20 28 63 69 64 2c 20 20 20 70 69 64 2c 20 et (cid, pid,
2570: 20 74 79 70 65 2c 20 73 72 63 29 0a 09 09 56 41 type, src)...VA
2580: 4c 55 45 53 20 20 20 20 20 20 20 20 20 20 20 20 LUES
2590: 20 20 20 20 28 24 6d 79 69 64 2c 20 24 70 69 64 ($myid, $pid
25a0: 2c 20 24 74 69 64 2c 20 24 6d 79 73 72 63 69 64 , $tid, $mysrcid
25b0: 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 );.. }...
25c0: 66 6f 72 65 61 63 68 20 69 69 64 20 24 6d 79 69 foreach iid $myi
25d0: 74 65 6d 73 20 7b 0a 09 09 73 74 61 74 65 20 72 tems {...state r
25e0: 75 6e 20 7b 0a 09 09 20 20 20 20 49 4e 53 45 52 un {... INSER
25f0: 54 20 49 4e 54 4f 20 63 73 69 74 65 6d 20 28 63 T INTO csitem (c
2600: 69 64 2c 20 20 20 70 6f 73 2c 20 20 69 69 64 29 id, pos, iid)
2610: 0a 09 09 20 20 20 20 56 41 4c 55 45 53 20 20 20 ... VALUES
2620: 20 20 20 20 20 20 20 20 20 20 28 24 6d 79 69 64 ($myid
2630: 2c 20 24 70 6f 73 2c 20 24 69 69 64 29 3b 0a 09 , $pos, $iid);..
2640: 09 7d 0a 09 09 69 6e 63 72 20 70 6f 73 0a 09 20 .}...incr pos..
2650: 20 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a }..}..return.
2660: 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f }.. metho
2670: 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 7d 20 7b d timerange {} {
2680: 20 72 65 74 75 72 6e 20 5b 24 6d 79 74 79 70 65 return [$mytype
2690: 6f 62 6a 20 74 69 6d 65 72 61 6e 67 65 20 24 6d obj timerange $m
26a0: 79 69 74 65 6d 73 5d 20 7d 0a 0a 20 20 20 20 6d yitems] }.. m
26b0: 65 74 68 6f 64 20 64 72 6f 70 20 7b 7d 20 7b 0a ethod drop {} {.
26c0: 09 73 74 61 74 65 20 74 72 61 6e 73 61 63 74 69 .state transacti
26d0: 6f 6e 20 7b 0a 09 20 20 20 20 73 74 61 74 65 20 on {.. state
26e0: 72 75 6e 20 7b 0a 09 09 44 45 4c 45 54 45 20 46 run {...DELETE F
26f0: 52 4f 4d 20 63 68 61 6e 67 65 73 65 74 20 57 48 ROM changeset WH
2700: 45 52 45 20 63 69 64 20 3d 20 24 6d 79 69 64 3b ERE cid = $myid;
2710: 0a 09 09 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 ...DELETE FROM c
2720: 73 69 74 65 6d 20 20 20 20 57 48 45 52 45 20 63 sitem WHERE c
2730: 69 64 20 3d 20 24 6d 79 69 64 3b 0a 09 20 20 20 id = $myid;..
2740: 20 7d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 69 }..}..foreach i
2750: 69 64 20 24 6d 79 69 74 65 6d 73 20 7b 0a 09 20 id $myitems {..
2760: 20 20 20 73 65 74 20 6b 65 79 20 5b 6c 69 73 74 set key [list
2770: 20 24 6d 79 74 79 70 65 20 24 69 69 64 5d 0a 09 $mytype $iid]..
2780: 20 20 20 20 75 6e 73 65 74 20 6d 79 69 74 65 6d unset myitem
2790: 6d 61 70 28 24 6b 65 79 29 0a 09 7d 0a 09 73 65 map($key)..}..se
27a0: 74 20 70 6f 73 20 20 20 20 20 20 20 20 20 20 5b t pos [
27b0: 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 24 lsearch -exact $
27c0: 6d 79 63 68 61 6e 67 65 73 65 74 73 20 24 73 65 mychangesets $se
27d0: 6c 66 5d 0a 09 73 65 74 20 6d 79 63 68 61 6e 67 lf]..set mychang
27e0: 65 73 65 74 73 20 5b 6c 72 65 70 6c 61 63 65 20 esets [lreplace
27f0: 24 6d 79 63 68 61 6e 67 65 73 65 74 73 20 24 70 $mychangesets $p
2800: 6f 73 20 24 70 6f 73 5d 0a 09 72 65 74 75 72 6e os $pos]..return
2810: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 . }.. type
2820: 6d 65 74 68 6f 64 20 73 70 6c 69 74 20 7b 63 73 method split {cs
2830: 65 74 20 61 72 67 73 7d 20 7b 0a 09 23 20 41 73 et args} {..# As
2840: 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 72 65 part of the cre
2850: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 ation of the new
2860: 20 63 68 61 6e 67 65 73 65 74 73 20 73 70 65 63 changesets spec
2870: 69 66 69 65 64 20 69 6e 0a 09 23 20 41 52 47 53 ified in..# ARGS
2880: 20 61 73 20 73 65 74 73 20 6f 66 20 69 74 65 6d as sets of item
2890: 73 2c 20 61 6c 6c 20 73 75 62 73 65 74 73 20 6f s, all subsets o
28a0: 66 20 43 53 45 54 27 73 20 69 74 65 6d 20 73 65 f CSET's item se
28b0: 74 2c 20 43 53 45 54 0a 09 23 20 77 69 6c 6c 20 t, CSET..# will
28c0: 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 be dropped from
28d0: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 2c 20 69 all databases, i
28e0: 6e 20 61 6e 64 20 6f 75 74 20 6f 66 20 6d 65 6d n and out of mem
28f0: 6f 72 79 2c 0a 09 23 20 61 6e 64 20 74 68 65 6e ory,..# and then
2900: 20 64 65 73 74 72 6f 79 65 64 2e 0a 09 23 0a 09 destroyed...#..
2910: 23 20 4e 6f 74 65 3a 20 54 68 65 20 69 74 65 6d # Note: The item
2920: 20 6c 69 73 74 73 20 66 6f 75 6e 64 20 69 6e 20 lists found in
2930: 61 72 67 73 20 61 72 65 20 74 61 67 67 65 64 20 args are tagged
2940: 69 74 65 6d 73 2e 20 54 68 65 79 0a 09 23 20 68 items. They..# h
2950: 61 76 65 20 74 6f 20 68 61 76 65 20 74 68 65 20 ave to have the
2960: 73 61 6d 65 20 74 79 70 65 20 61 73 20 74 68 65 same type as the
2970: 20 63 68 61 6e 67 65 73 65 74 2c 20 62 65 69 6e changeset, bein
2980: 67 20 73 75 62 73 65 74 73 0a 09 23 20 6f 66 20 g subsets..# of
2990: 69 74 73 20 69 74 65 6d 73 2e 20 54 68 69 73 20 its items. This
29a0: 69 73 20 63 68 65 63 6b 65 64 20 69 6e 20 55 6e is checked in Un
29b0: 74 61 67 31 2e 0a 0a 09 73 74 72 75 63 74 3a 3a tag1....struct::
29c0: 6c 69 73 74 20 61 73 73 69 67 6e 20 5b 24 63 73 list assign [$cs
29d0: 65 74 20 64 61 74 61 5d 20 70 72 6f 6a 65 63 74 et data] project
29e0: 20 63 73 74 79 70 65 20 63 73 73 72 63 0a 0a 09 cstype cssrc...
29f0: 24 63 73 65 74 20 64 72 6f 70 0a 09 24 63 73 65 $cset drop..$cse
2a00: 74 20 64 65 73 74 72 6f 79 0a 0a 09 73 65 74 20 t destroy...set
2a10: 6e 65 77 63 73 65 74 73 20 7b 7d 0a 09 66 6f 72 newcsets {}..for
2a20: 65 61 63 68 20 66 72 61 67 6d 65 6e 74 69 74 65 each fragmentite
2a30: 6d 73 20 24 61 72 67 73 20 7b 0a 09 20 20 20 20 ms $args {..
2a40: 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 integrity assert
2a50: 20 7b 0a 09 09 5b 6c 6c 65 6e 67 74 68 20 24 66 {...[llength $f
2a60: 72 61 67 6d 65 6e 74 69 74 65 6d 73 5d 0a 09 20 ragmentitems]..
2a70: 20 20 20 7d 20 7b 41 74 74 65 6d 70 74 65 64 20 } {Attempted
2a80: 74 6f 20 63 72 65 61 74 65 20 61 6e 20 65 6d 70 to create an emp
2a90: 74 79 20 63 68 61 6e 67 65 73 65 74 2c 20 69 2e ty changeset, i.
2aa0: 65 2e 20 77 69 74 68 6f 75 74 20 69 74 65 6d 73 e. without items
2ab0: 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 6e }.. lappend n
2ac0: 65 77 63 73 65 74 73 20 5b 24 74 79 70 65 20 25 ewcsets [$type %
2ad0: 41 55 54 4f 25 20 24 70 72 6f 6a 65 63 74 20 24 AUTO% $project $
2ae0: 63 73 74 79 70 65 20 24 63 73 73 72 63 20 5c 0a cstype $cssrc \.
2af0: 09 09 09 09 20 20 5b 55 6e 74 61 67 20 24 66 72 .... [Untag $fr
2b00: 61 67 6d 65 6e 74 69 74 65 6d 73 20 24 63 73 74 agmentitems $cst
2b10: 79 70 65 5d 5d 0a 09 7d 0a 0a 09 66 6f 72 65 61 ype]]..}...forea
2b20: 63 68 20 63 20 24 6e 65 77 63 73 65 74 73 20 7b ch c $newcsets {
2b30: 20 24 63 20 70 65 72 73 69 73 74 20 7d 0a 09 72 $c persist }..r
2b40: 65 74 75 72 6e 20 24 6e 65 77 63 73 65 74 73 0a eturn $newcsets.
2b50: 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d }.. typem
2b60: 65 74 68 6f 64 20 73 74 72 6c 69 73 74 20 7b 63 ethod strlist {c
2b70: 68 61 6e 67 65 73 65 74 73 7d 20 7b 0a 09 72 65 hangesets} {..re
2b80: 74 75 72 6e 20 5b 6a 6f 69 6e 20 5b 73 74 72 75 turn [join [stru
2b90: 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20 24 63 68 ct::list map $ch
2ba0: 61 6e 67 65 73 65 74 73 20 5b 6d 79 70 72 6f 63 angesets [myproc
2bb0: 20 49 44 5d 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 ID]]]. }..
2bc0: 20 20 70 72 6f 63 20 49 44 20 7b 63 73 65 74 7d proc ID {cset}
2bd0: 20 7b 20 24 63 73 65 74 20 73 74 72 20 7d 0a 0a { $cset str }..
2be0: 20 20 20 20 70 72 6f 63 20 55 6e 74 61 67 20 7b proc Untag {
2bf0: 74 61 67 67 65 64 69 74 65 6d 73 20 63 73 74 79 taggeditems csty
2c00: 70 65 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b 73 pe} {..return [s
2c10: 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20 truct::list map
2c20: 24 74 61 67 67 65 64 69 74 65 6d 73 20 5b 6d 79 $taggeditems [my
2c30: 70 72 6f 63 20 55 6e 74 61 67 31 20 24 63 73 74 proc Untag1 $cst
2c40: 79 70 65 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 ype]]. }..
2c50: 20 70 72 6f 63 20 55 6e 74 61 67 31 20 7b 63 73 proc Untag1 {cs
2c60: 74 79 70 65 20 74 68 65 69 74 65 6d 7d 20 7b 0a type theitem} {.
2c70: 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 .struct::list as
2c80: 73 69 67 6e 20 24 74 68 65 69 74 65 6d 20 74 20 sign $theitem t
2c90: 69 0a 09 69 6e 74 65 67 72 69 74 79 20 61 73 73 i..integrity ass
2ca0: 65 72 74 20 7b 24 63 73 74 79 70 65 20 65 71 20 ert {$cstype eq
2cb0: 24 74 7d 20 7b 49 74 65 6d 20 24 69 27 73 20 74 $t} {Item $i's t
2cc0: 79 70 65 20 69 73 20 27 24 74 27 2c 20 65 78 70 ype is '$t', exp
2cd0: 65 63 74 65 64 20 27 24 63 73 74 79 70 65 27 7d ected '$cstype'}
2ce0: 0a 09 72 65 74 75 72 6e 20 24 69 0a 20 20 20 20 ..return $i.
2cf0: 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 }.. # # ## ##
2d00: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 # ##### ########
2d10: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 #############.
2d20: 20 20 20 23 23 20 53 74 61 74 65 0a 0a 20 20 20 ## State..
2d30: 20 76 61 72 69 61 62 6c 65 20 6d 79 69 64 20 20 variable myid
2d40: 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 49 64 20 {} ; # Id
2d50: 6f 66 20 74 68 65 20 63 73 65 74 20 66 6f 72 20 of the cset for
2d60: 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 0a 09 the persistent..
2d70: 09 09 20 20 20 20 20 20 23 20 73 74 61 74 65 2e .. # state.
2d80: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 . variable my
2d90: 70 72 6f 6a 65 63 74 20 20 20 7b 7d 20 3b 20 23 project {} ; #
2da0: 20 52 65 66 65 72 65 6e 63 65 20 6f 66 20 74 68 Reference of th
2db0: 65 20 70 72 6f 6a 65 63 74 20 6f 62 6a 65 63 74 e project object
2dc0: 20 74 68 65 0a 09 09 09 20 20 20 20 20 20 23 20 the.... #
2dd0: 63 68 61 6e 67 65 73 65 74 20 62 65 6c 6f 6e 67 changeset belong
2de0: 73 20 74 6f 2e 0a 20 20 20 20 76 61 72 69 61 62 s to.. variab
2df0: 6c 65 20 6d 79 74 79 70 65 20 20 20 20 20 20 7b le mytype {
2e00: 7d 20 3b 20 23 20 57 68 61 74 20 74 68 65 20 63 } ; # What the c
2e10: 68 61 6e 67 65 73 65 74 20 69 73 20 62 61 73 65 hangeset is base
2e20: 64 20 6f 6e 0a 09 09 09 20 20 20 20 20 20 23 20 d on.... #
2e30: 28 72 65 76 69 73 69 6f 6e 73 2c 20 74 61 67 73 (revisions, tags
2e40: 2c 20 6f 72 20 62 72 61 6e 63 68 65 73 29 2e 0a , or branches)..
2e50: 09 09 09 20 20 20 20 20 20 23 20 56 61 6c 75 65 ... # Value
2e60: 73 3a 20 53 65 65 20 6d 79 63 73 74 79 70 65 2e s: See mycstype.
2e70: 20 4e 6f 74 65 20 74 68 61 74 20 77 65 0a 09 09 Note that we...
2e80: 09 20 20 20 20 20 20 23 20 68 61 76 65 20 74 6f . # have to
2e90: 20 6b 65 65 70 20 74 68 65 20 6e 61 6d 65 73 20 keep the names
2ea0: 6f 66 20 74 68 65 20 68 65 6c 70 65 72 0a 09 09 of the helper...
2eb0: 09 20 20 20 20 20 20 23 20 73 69 6e 67 6c 65 74 . # singlet
2ec0: 6f 6e 73 20 69 6e 20 73 79 6e 63 20 77 69 74 68 ons in sync with
2ed0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 09 09 the contents...
2ee0: 09 20 20 20 20 20 20 23 20 6f 66 20 73 74 61 74 . # of stat
2ef0: 65 20 74 61 62 6c 65 20 27 63 73 74 79 70 65 27 e table 'cstype'
2f00: 2c 20 61 6e 64 20 76 61 72 69 6f 75 73 0a 09 09 , and various...
2f10: 09 20 20 20 20 20 20 23 20 6f 74 68 65 72 20 70 . # other p
2f20: 6c 61 63 65 73 20 75 73 69 6e 67 20 74 68 65 6d laces using them
2f30: 20 68 61 72 64 77 69 72 65 64 2e 0a 20 20 20 20 hardwired..
2f40: 76 61 72 69 61 62 6c 65 20 6d 79 74 79 70 65 6f variable mytypeo
2f50: 62 6a 20 20 20 7b 7d 20 3b 20 23 20 52 65 66 65 bj {} ; # Refe
2f60: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 6f 6e rence to the con
2f70: 74 61 69 6e 65 72 20 66 6f 72 20 74 68 65 0a 09 tainer for the..
2f80: 09 09 20 20 20 20 20 20 23 20 74 79 70 65 20 64 .. # type d
2f90: 65 70 65 6e 64 65 6e 74 20 63 6f 64 65 2e 20 44 ependent code. D
2fa0: 65 72 69 76 65 64 20 66 72 6f 6d 0a 09 09 09 20 erived from....
2fb0: 20 20 20 20 20 23 20 6d 79 74 79 70 65 2e 0a 20 # mytype..
2fc0: 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 73 72 variable mysr
2fd0: 63 69 64 20 20 20 20 20 7b 7d 20 3b 20 23 20 49 cid {} ; # I
2fe0: 64 20 6f 66 20 74 68 65 20 6d 65 74 61 64 61 74 d of the metadat
2ff0: 61 20 6f 72 20 73 79 6d 62 6f 6c 20 74 68 65 20 a or symbol the
3000: 63 73 65 74 0a 09 09 09 20 20 20 20 20 20 23 20 cset.... #
3010: 69 73 20 62 61 73 65 64 20 6f 6e 2e 0a 20 20 20 is based on..
3020: 20 76 61 72 69 61 62 6c 65 20 6d 79 69 74 65 6d variable myitem
3030: 73 20 20 20 20 20 7b 7d 20 3b 20 23 20 4c 69 73 s {} ; # Lis
3040: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 65 t of the file le
3050: 76 65 6c 20 72 65 76 69 73 69 6f 6e 73 2c 0a 09 vel revisions,..
3060: 09 09 20 20 20 20 20 20 23 20 74 61 67 73 2c 20 .. # tags,
3070: 6f 72 20 62 72 61 6e 63 68 65 73 20 69 6e 20 74 or branches in t
3080: 68 65 20 63 73 65 74 2c 20 61 73 0a 09 09 09 20 he cset, as....
3090: 20 20 20 20 20 23 20 69 64 73 2e 20 4e 6f 74 20 # ids. Not
30a0: 74 61 67 67 65 64 2e 0a 20 20 20 20 76 61 72 69 tagged.. vari
30b0: 61 62 6c 65 20 6d 79 74 69 74 65 6d 73 20 20 20 able mytitems
30c0: 20 7b 7d 20 3b 20 23 20 41 73 20 6d 79 69 74 65 {} ; # As myite
30d0: 6d 73 2c 20 74 68 65 20 74 61 67 67 65 64 20 66 ms, the tagged f
30e0: 6f 72 6d 2e 0a 20 20 20 20 76 61 72 69 61 62 6c orm.. variabl
30f0: 65 20 6d 79 70 72 65 6d 61 70 20 20 20 20 7b 7d e mypremap {}
3100: 20 3b 20 23 20 44 69 63 74 69 6f 6e 61 72 79 20 ; # Dictionary
3110: 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 mapping from the
3120: 20 69 74 65 6d 73 20 28 74 61 67 67 65 64 20 6e items (tagged n
3130: 6f 77 29 0a 09 09 09 20 20 20 20 20 20 23 20 74 ow).... # t
3140: 6f 20 74 68 65 69 72 20 70 72 65 64 65 63 65 73 o their predeces
3150: 73 6f 72 73 2c 20 61 6c 73 6f 20 74 61 67 67 65 sors, also tagge
3160: 64 2e 20 41 0a 09 09 09 20 20 20 20 20 20 23 20 d. A.... #
3170: 63 61 63 68 65 20 74 6f 20 61 76 6f 69 64 20 6c cache to avoid l
3180: 6f 61 64 69 6e 67 20 74 68 69 73 20 66 72 6f 6d oading this from
3190: 20 74 68 65 0a 09 09 09 20 20 20 20 20 20 23 20 the.... #
31a0: 73 74 61 74 65 20 6d 6f 72 65 20 74 68 61 6e 20 state more than
31b0: 6f 6e 63 65 2e 0a 20 20 20 20 76 61 72 69 61 62 once.. variab
31c0: 6c 65 20 6d 79 6e 65 78 74 6d 61 70 20 20 20 7b le mynextmap {
31d0: 7d 20 3b 20 23 20 44 69 63 74 69 6f 6e 61 72 79 } ; # Dictionary
31e0: 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 mapping from th
31f0: 65 20 69 74 65 6d 73 20 28 74 61 67 67 65 64 29 e items (tagged)
3200: 0a 09 09 09 20 20 20 20 20 20 23 20 74 6f 20 74 .... # to t
3210: 68 65 69 72 20 73 75 63 63 65 73 73 6f 72 73 20 heir successors
3220: 28 61 6c 73 6f 20 74 61 67 67 65 64 29 2e 20 41 (also tagged). A
3230: 0a 09 09 09 20 20 20 20 20 20 23 20 63 61 63 68 .... # cach
3240: 65 20 74 6f 20 61 76 6f 69 64 20 6c 6f 61 64 69 e to avoid loadi
3250: 6e 67 20 74 68 69 73 20 66 72 6f 6d 20 74 68 65 ng this from the
3260: 0a 09 09 09 20 20 20 20 20 20 23 20 73 74 61 74 .... # stat
3270: 65 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 e more than once
3280: 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d .. variable m
3290: 79 70 6f 73 20 20 20 20 20 20 20 7b 7d 20 3b 20 ypos {} ;
32a0: 23 20 43 6f 6d 6d 69 74 20 70 6f 73 69 74 69 6f # Commit positio
32b0: 6e 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73 n of the changes
32c0: 65 74 2c 20 69 66 0a 09 09 09 20 20 20 20 20 20 et, if....
32d0: 23 20 6b 6e 6f 77 6e 2e 0a 0a 20 20 20 20 23 20 # known... #
32e0: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 # ## ### ##### #
32f0: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 ####### ########
3300: 23 23 23 23 23 0a 20 20 20 20 23 23 20 49 6e 74 #####. ## Int
3310: 65 72 6e 61 6c 20 6d 65 74 68 6f 64 73 0a 0a 20 ernal methods..
3320: 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 typevariable
3330: 6d 79 63 6f 75 6e 74 65 72 20 20 20 20 20 20 20 mycounter
3340: 20 30 20 3b 20 23 20 49 64 20 63 6f 75 6e 74 65 0 ; # Id counte
3350: 72 20 66 6f 72 20 63 73 65 74 73 2e 20 4c 61 73 r for csets. Las
3360: 74 20 69 64 0a 09 09 09 09 20 20 20 20 20 20 23 t id..... #
3370: 20 75 73 65 64 2e 0a 20 20 20 20 74 79 70 65 76 used.. typev
3380: 61 72 69 61 62 6c 65 20 6d 79 63 73 74 79 70 65 ariable mycstype
3390: 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d -array {} ; # M
33a0: 61 70 20 63 73 74 79 70 65 73 20 28 6e 61 6d 65 ap cstypes (name
33b0: 73 29 20 74 6f 20 70 65 72 73 69 73 74 65 6e 74 s) to persistent
33c0: 0a 09 09 09 09 20 20 20 20 20 20 23 20 69 64 73 ..... # ids
33d0: 2e 20 4e 6f 74 65 20 74 68 61 74 20 77 65 20 68 . Note that we h
33e0: 61 76 65 20 74 6f 20 6b 65 65 70 0a 09 09 09 09 ave to keep.....
33f0: 20 20 20 20 20 20 23 20 74 68 65 20 6e 61 6d 65 # the name
3400: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 27 s in the table '
3410: 63 73 74 79 70 65 27 0a 09 09 09 09 20 20 20 20 cstype'.....
3420: 20 20 23 20 69 6e 20 73 79 6e 63 20 77 69 74 68 # in sync with
3430: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 the names of th
3440: 65 0a 09 09 09 09 20 20 20 20 20 20 23 20 68 65 e..... # he
3450: 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 73 2e lper singletons.
3460: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 .. typemethod
3470: 20 67 65 74 63 73 74 79 70 65 73 20 7b 7d 20 7b getcstypes {} {
3480: 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 6e ..foreach {tid n
3490: 61 6d 65 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 ame} [state run
34a0: 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 74 69 {.. SELECT ti
34b0: 64 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 63 73 74 d, name FROM cst
34c0: 79 70 65 3b 0a 09 7d 5d 20 7b 20 73 65 74 20 6d ype;..}] { set m
34d0: 79 63 73 74 79 70 65 28 24 6e 61 6d 65 29 20 24 ycstype($name) $
34e0: 74 69 64 20 7d 0a 09 72 65 74 75 72 6e 0a 20 20 tid }..return.
34f0: 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 }.. typemet
3500: 68 6f 64 20 6c 6f 61 64 63 6f 75 6e 74 65 72 20 hod loadcounter
3510: 7b 7d 20 7b 0a 09 23 20 49 6e 69 74 69 61 6c 69 {} {..# Initiali
3520: 7a 65 20 74 68 65 20 63 6f 75 6e 74 65 72 20 66 ze the counter f
3530: 72 6f 6d 20 74 68 65 20 73 74 61 74 65 0a 09 73 rom the state..s
3540: 65 74 20 6d 79 63 6f 75 6e 74 65 72 20 5b 73 74 et mycounter [st
3550: 61 74 65 20 6f 6e 65 20 7b 20 53 45 4c 45 43 54 ate one { SELECT
3560: 20 4d 41 58 28 63 69 64 29 20 46 52 4f 4d 20 63 MAX(cid) FROM c
3570: 68 61 6e 67 65 73 65 74 20 7d 5d 0a 09 72 65 74 hangeset }]..ret
3580: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 urn. }.. t
3590: 79 70 65 6d 65 74 68 6f 64 20 6e 75 6d 20 7b 7d ypemethod num {}
35a0: 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 63 6f 75 { return $mycou
35b0: 6e 74 65 72 20 7d 0a 0a 20 20 20 20 70 72 6f 63 nter }.. proc
35c0: 20 49 6e 69 74 69 61 6c 69 7a 65 42 72 65 61 6b InitializeBreak
35d0: 53 74 61 74 65 20 7b 72 65 76 69 73 69 6f 6e 73 State {revisions
35e0: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 70 6f 73 } {..upvar 1 pos
35f0: 20 70 6f 73 20 63 72 6f 73 73 20 63 72 6f 73 73 pos cross cross
3600: 20 72 61 6e 67 65 20 72 61 6e 67 65 20 64 65 70 range range dep
3610: 63 20 64 65 70 63 20 64 65 6c 74 61 20 64 65 6c c depc delta del
3620: 74 61 20 5c 0a 09 20 20 20 20 64 65 70 65 6e 64 ta \.. depend
3630: 65 6e 63 69 65 73 20 64 65 70 65 6e 64 65 6e 63 encies dependenc
3640: 69 65 73 0a 0a 09 23 20 46 69 72 73 74 20 77 65 ies...# First we
3650: 20 63 72 65 61 74 65 20 61 20 6d 61 70 20 6f 66 create a map of
3660: 20 70 6f 73 69 74 69 6f 6e 73 20 74 6f 20 6d 61 positions to ma
3670: 6b 65 20 69 74 20 65 61 73 69 65 72 20 74 6f 0a ke it easier to.
3680: 09 23 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 .# determine whe
3690: 74 68 65 72 20 61 20 64 65 70 65 6e 64 65 6e 63 ther a dependenc
36a0: 79 20 63 72 6f 73 73 65 73 20 61 20 70 61 72 74 y crosses a part
36b0: 69 63 75 6c 61 72 20 69 6e 64 65 78 2e 0a 0a 09 icular index....
36c0: 61 72 72 61 79 20 73 65 74 20 70 6f 73 20 20 20 array set pos
36d0: 7b 7d 0a 09 61 72 72 61 79 20 73 65 74 20 63 72 {}..array set cr
36e0: 6f 73 73 20 7b 7d 0a 09 61 72 72 61 79 20 73 65 oss {}..array se
36f0: 74 20 64 65 70 63 20 20 7b 7d 0a 09 73 65 74 20 t depc {}..set
3700: 72 61 6e 67 65 20 20 20 20 20 20 20 7b 7d 0a 09 range {}..
3710: 73 65 74 20 6e 20 30 0a 09 66 6f 72 65 61 63 68 set n 0..foreach
3720: 20 72 65 76 20 24 72 65 76 69 73 69 6f 6e 73 20 rev $revisions
3730: 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 72 {.. lappend r
3740: 61 6e 67 65 20 24 6e 0a 09 20 20 20 20 73 65 74 ange $n.. set
3750: 20 70 6f 73 28 24 72 65 76 29 20 24 6e 0a 09 20 pos($rev) $n..
3760: 20 20 20 73 65 74 20 63 72 6f 73 73 28 24 6e 29 set cross($n)
3770: 20 30 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09 0.. incr n..
3780: 7d 0a 0a 09 23 20 53 65 63 6f 6e 64 6c 79 20 77 }...# Secondly w
3790: 65 20 63 6f 75 6e 74 20 74 68 65 20 63 72 6f 73 e count the cros
37a0: 73 69 6e 67 73 20 70 65 72 20 70 6f 73 69 74 69 sings per positi
37b0: 6f 6e 2c 20 62 79 20 69 74 65 72 61 74 69 6e 67 on, by iterating
37c0: 0a 09 23 20 6f 76 65 72 20 74 68 65 20 72 65 63 ..# over the rec
37d0: 6f 72 64 65 64 20 69 6e 74 65 72 6e 61 6c 20 64 orded internal d
37e0: 65 70 65 6e 64 65 6e 63 69 65 73 2e 0a 0a 09 23 ependencies....#
37f0: 20 4e 6f 74 65 3a 20 49 66 20 74 68 65 20 74 69 Note: If the ti
3800: 6d 65 73 74 61 6d 70 73 20 61 72 65 20 62 61 64 mestamps are bad
3810: 6c 79 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 20 ly out of order
3820: 69 74 20 69 73 0a 09 23 20 20 20 20 20 20 20 70 it is..# p
3830: 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20 ossible to have
3840: 61 20 62 61 63 6b 77 61 72 64 20 73 75 63 63 65 a backward succe
3850: 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 79 2c ssor dependency,
3860: 0a 09 23 20 20 20 20 20 20 20 69 2e 65 2e 20 77 ..# i.e. w
3870: 69 74 68 20 73 74 61 72 74 20 3e 20 65 6e 64 2e ith start > end.
3880: 20 57 65 20 6d 61 79 20 68 61 76 65 20 74 6f 20 We may have to
3890: 73 77 61 70 20 74 68 65 20 69 6e 64 69 63 65 73 swap the indices
38a0: 0a 09 23 20 20 20 20 20 20 20 74 6f 20 65 6e 73 ..# to ens
38b0: 75 72 65 20 74 68 61 74 20 74 68 65 20 66 6f 6c ure that the fol
38c0: 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 lowing loop runs
38d0: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 09 23 0a 09 correctly...#..
38e0: 23 20 4e 6f 74 65 20 32 3a 20 73 74 61 72 74 20 # Note 2: start
38f0: 3d 3d 20 65 6e 64 20 69 73 20 6e 6f 74 20 70 6f == end is not po
3900: 73 73 69 62 6c 65 2e 20 49 74 20 69 6e 64 69 63 ssible. It indic
3910: 61 74 65 73 20 61 0a 09 23 20 20 20 20 20 20 20 ates a..#
3920: 20 20 73 65 6c 66 2d 64 65 70 65 6e 64 65 6e 63 self-dependenc
3930: 79 20 64 75 65 20 74 6f 20 74 68 65 20 75 6e 69 y due to the uni
3940: 71 75 65 6e 65 73 73 20 6f 66 20 70 6f 73 69 74 queness of posit
3950: 69 6f 6e 73 2c 0a 09 23 20 20 20 20 20 20 20 20 ions,..#
3960: 20 61 6e 64 20 74 68 61 74 20 69 73 20 73 6f 6d and that is som
3970: 65 74 68 69 6e 67 20 77 65 20 68 61 76 65 20 72 ething we have r
3980: 75 6c 65 64 20 6f 75 74 20 61 6c 72 65 61 64 79 uled out already
3990: 2c 20 73 65 65 0a 09 23 20 20 20 20 20 20 20 20 , see..#
39a0: 20 27 72 65 76 20 69 6e 74 65 72 6e 61 6c 73 75 'rev internalsu
39b0: 63 63 65 73 73 6f 72 73 27 2e 0a 0a 09 66 6f 72 ccessors'....for
39c0: 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 72 each {rid childr
39d0: 65 6e 7d 20 5b 61 72 72 61 79 20 67 65 74 20 64 en} [array get d
39e0: 65 70 65 6e 64 65 6e 63 69 65 73 5d 20 7b 0a 09 ependencies] {..
39f0: 20 20 20 20 66 6f 72 65 61 63 68 20 63 68 69 6c foreach chil
3a00: 64 20 24 63 68 69 6c 64 72 65 6e 20 7b 0a 09 09 d $children {...
3a10: 73 65 74 20 64 6b 65 79 20 20 20 20 5b 6c 69 73 set dkey [lis
3a20: 74 20 24 72 69 64 20 24 63 68 69 6c 64 5d 0a 09 t $rid $child]..
3a30: 09 73 65 74 20 73 74 61 72 74 20 20 20 24 70 6f .set start $po
3a40: 73 28 24 72 69 64 29 0a 09 09 73 65 74 20 65 6e s($rid)...set en
3a50: 64 20 20 20 20 20 24 70 6f 73 28 24 63 68 69 6c d $pos($chil
3a60: 64 29 0a 09 09 73 65 74 20 63 72 6f 73 73 65 73 d)...set crosses
3a70: 20 7b 7d 0a 0a 09 09 69 66 20 7b 24 73 74 61 72 {}....if {$star
3a80: 74 20 3e 20 24 65 6e 64 7d 20 7b 0a 09 09 20 20 t > $end} {...
3a90: 20 20 77 68 69 6c 65 20 7b 24 65 6e 64 20 3c 20 while {$end <
3aa0: 24 73 74 61 72 74 7d 20 7b 0a 09 09 09 6c 61 70 $start} {....lap
3ab0: 70 65 6e 64 20 63 72 6f 73 73 65 73 20 24 65 6e pend crosses $en
3ac0: 64 0a 09 09 09 69 6e 63 72 20 63 72 6f 73 73 28 d....incr cross(
3ad0: 24 65 6e 64 29 0a 09 09 09 69 6e 63 72 20 65 6e $end)....incr en
3ae0: 64 0a 09 09 20 20 20 20 7d 0a 09 09 7d 20 65 6c d... }...} el
3af0: 73 65 20 7b 0a 09 09 20 20 20 20 77 68 69 6c 65 se {... while
3b00: 20 7b 24 73 74 61 72 74 20 3c 20 24 65 6e 64 7d {$start < $end}
3b10: 20 7b 0a 09 09 09 6c 61 70 70 65 6e 64 20 63 72 {....lappend cr
3b20: 6f 73 73 65 73 20 24 73 74 61 72 74 0a 09 09 09 osses $start....
3b30: 69 6e 63 72 20 63 72 6f 73 73 28 24 73 74 61 72 incr cross($star
3b40: 74 29 0a 09 09 09 69 6e 63 72 20 73 74 61 72 74 t)....incr start
3b50: 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 09 73 ... }...}...s
3b60: 65 74 20 64 65 70 63 28 24 64 6b 65 79 29 20 24 et depc($dkey) $
3b70: 63 72 6f 73 73 65 73 0a 09 20 20 20 20 7d 0a 09 crosses.. }..
3b80: 7d 0a 0a 09 49 6e 69 74 69 61 6c 69 7a 65 44 65 }...InitializeDe
3b90: 6c 74 61 73 20 24 72 65 76 69 73 69 6f 6e 73 0a ltas $revisions.
3ba0: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 .return. }..
3bb0: 20 20 20 70 72 6f 63 20 49 6e 69 74 69 61 6c 69 proc Initiali
3bc0: 7a 65 44 65 6c 74 61 73 20 7b 72 65 76 69 73 69 zeDeltas {revisi
3bd0: 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 ons} {..upvar 1
3be0: 64 65 6c 74 61 20 64 65 6c 74 61 0a 0a 09 23 20 delta delta...#
3bf0: 50 75 6c 6c 20 74 68 65 20 74 69 6d 65 73 74 61 Pull the timesta
3c00: 6d 70 73 20 66 6f 72 20 61 6c 6c 20 72 65 76 69 mps for all revi
3c10: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 63 68 61 sions in the cha
3c20: 6e 67 65 73 65 74 73 20 61 6e 64 0a 09 23 20 63 ngesets and..# c
3c30: 6f 6d 70 75 74 65 20 74 68 65 69 72 20 64 65 6c ompute their del
3c40: 74 61 73 20 66 6f 72 20 75 73 65 20 62 79 20 74 tas for use by t
3c50: 68 65 20 62 72 65 61 6b 20 66 69 6e 64 65 72 2e he break finder.
3c60: 0a 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 6c ...array set del
3c70: 74 61 20 7b 7d 0a 09 61 72 72 61 79 20 73 65 74 ta {}..array set
3c80: 20 73 74 61 6d 70 20 7b 7d 0a 0a 09 73 65 74 20 stamp {}...set
3c90: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 theset ('[join $
3ca0: 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d revisions {','}]
3cb0: 27 29 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 ')..foreach {rid
3cc0: 20 74 69 6d 65 7d 20 5b 73 74 61 74 65 20 72 75 time} [state ru
3cd0: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 n ".. SELECT
3ce0: 52 2e 72 69 64 2c 20 52 2e 64 61 74 65 0a 09 20 R.rid, R.date..
3cf0: 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e FROM revision
3d00: 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e R.. WHERE R.
3d10: 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 rid IN $theset..
3d20: 22 5d 20 7b 0a 09 20 20 20 20 73 65 74 20 73 74 "] {.. set st
3d30: 61 6d 70 28 24 72 69 64 29 20 24 74 69 6d 65 0a amp($rid) $time.
3d40: 09 7d 0a 0a 09 73 65 74 20 6e 20 30 0a 09 66 6f .}...set n 0..fo
3d50: 72 65 61 63 68 20 72 69 64 20 5b 6c 72 61 6e 67 reach rid [lrang
3d60: 65 20 24 72 65 76 69 73 69 6f 6e 73 20 30 20 65 e $revisions 0 e
3d70: 6e 64 2d 31 5d 20 72 6e 65 78 74 20 5b 6c 72 61 nd-1] rnext [lra
3d80: 6e 67 65 20 24 72 65 76 69 73 69 6f 6e 73 20 31 nge $revisions 1
3d90: 20 65 6e 64 5d 20 7b 0a 09 20 20 20 20 73 65 74 end] {.. set
3da0: 20 64 65 6c 74 61 28 24 6e 29 20 5b 65 78 70 72 delta($n) [expr
3db0: 20 7b 24 73 74 61 6d 70 28 24 72 6e 65 78 74 29 {$stamp($rnext)
3dc0: 20 2d 20 24 73 74 61 6d 70 28 24 72 69 64 29 7d - $stamp($rid)}
3dd0: 5d 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d ].. incr n..}
3de0: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a ..return. }..
3df0: 20 20 20 20 70 72 6f 63 20 46 69 6e 64 42 65 73 proc FindBes
3e00: 74 42 72 65 61 6b 20 7b 72 61 6e 67 65 7d 20 7b tBreak {range} {
3e10: 0a 09 75 70 76 61 72 20 31 20 63 72 6f 73 73 20 ..upvar 1 cross
3e20: 63 72 6f 73 73 20 64 65 6c 74 61 20 64 65 6c 74 cross delta delt
3e30: 61 0a 0a 09 23 20 44 65 74 65 72 6d 69 6e 65 20 a...# Determine
3e40: 74 68 65 20 62 65 73 74 20 62 72 65 61 6b 20 6c the best break l
3e50: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 67 ocation in the g
3e60: 69 76 65 6e 20 72 61 6e 67 65 20 6f 66 0a 09 23 iven range of..#
3e70: 20 70 6f 73 69 74 69 6f 6e 73 2e 20 46 69 72 73 positions. Firs
3e80: 74 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 68 t we look for th
3e90: 65 20 6c 6f 63 61 74 69 6f 6e 73 20 77 69 74 68 e locations with
3ea0: 20 74 68 65 20 6d 61 78 69 6d 61 6c 0a 09 23 20 the maximal..#
3eb0: 6e 75 6d 62 65 72 20 6f 66 20 63 72 6f 73 73 69 number of crossi
3ec0: 6e 67 73 2e 20 49 66 20 74 68 65 72 65 20 61 72 ngs. If there ar
3ed0: 65 20 73 65 76 65 72 61 6c 20 77 65 20 6c 6f 6f e several we loo
3ee0: 6b 20 66 6f 72 20 74 68 65 0a 09 23 20 73 68 6f k for the..# sho
3ef0: 72 74 65 73 74 20 74 69 6d 65 20 69 6e 74 65 72 rtest time inter
3f00: 76 61 6c 20 61 6d 6f 6e 67 20 74 68 65 6d 2e 20 val among them.
3f10: 49 66 20 77 65 20 73 74 69 6c 6c 20 68 61 76 65 If we still have
3f20: 20 6d 75 6c 74 69 70 6c 65 0a 09 23 20 70 6f 73 multiple..# pos
3f30: 73 69 62 69 6c 69 74 69 65 73 20 61 66 74 65 72 sibilities after
3f40: 20 74 68 61 74 20 77 65 20 73 65 6c 65 63 74 20 that we select
3f50: 74 68 65 20 65 61 72 6c 69 65 73 74 20 6c 6f 63 the earliest loc
3f60: 61 74 69 6f 6e 0a 09 23 20 61 6d 6f 6e 67 20 74 ation..# among t
3f70: 68 65 73 65 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 hese....# Note:
3f80: 49 66 20 74 68 65 20 6d 61 78 69 6d 61 6c 20 6e If the maximal n
3f90: 75 6d 62 65 72 20 6f 66 20 63 72 6f 73 73 69 6e umber of crossin
3fa0: 67 73 20 69 73 20 30 20 74 68 65 6e 20 74 68 65 gs is 0 then the
3fb0: 20 72 61 6e 67 65 0a 09 23 20 20 20 20 20 20 20 range..#
3fc0: 68 61 73 20 6e 6f 20 69 6e 74 65 72 6e 61 6c 20 has no internal
3fd0: 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 6e dependencies, an
3fe0: 64 20 6e 6f 20 62 72 65 61 6b 20 6c 6f 63 61 74 d no break locat
3ff0: 69 6f 6e 20 61 74 0a 09 23 20 20 20 20 20 20 20 ion at..#
4000: 61 6c 6c 2e 20 54 68 69 73 20 70 6f 73 73 69 62 all. This possib
4010: 69 6c 69 74 79 20 69 73 20 73 69 67 6e 61 6c 65 ility is signale
4020: 64 20 76 69 61 20 72 65 73 75 6c 74 20 2d 31 2e d via result -1.
4030: 0a 0a 09 23 20 4e 6f 74 65 3a 20 41 20 72 61 6e ...# Note: A ran
4040: 67 65 20 6f 66 20 6c 65 6e 67 74 68 20 31 20 6f ge of length 1 o
4050: 72 20 6c 65 73 73 20 63 61 6e 6e 6f 74 20 68 61 r less cannot ha
4060: 76 65 20 69 6e 74 65 72 6e 61 6c 0a 09 23 20 20 ve internal..#
4070: 20 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65 dependencie
4080: 73 2c 20 61 73 20 74 68 61 74 20 6e 65 65 64 73 s, as that needs
4090: 20 61 74 20 6c 65 61 73 74 20 74 77 6f 20 72 65 at least two re
40a0: 76 69 73 69 6f 6e 73 20 69 6e 0a 09 23 20 20 20 visions in..#
40b0: 20 20 20 20 74 68 65 20 72 61 6e 67 65 2e 0a 0a the range...
40c0: 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 72 .if {[llength $r
40d0: 61 6e 67 65 5d 20 3c 20 32 7d 20 7b 20 72 65 74 ange] < 2} { ret
40e0: 75 72 6e 20 2d 31 20 7d 0a 0a 09 73 65 74 20 6d urn -1 }...set m
40f0: 61 78 20 2d 31 0a 09 73 65 74 20 62 65 73 74 20 ax -1..set best
4100: 7b 7d 0a 0a 09 66 6f 72 65 61 63 68 20 6c 6f 63 {}...foreach loc
4110: 61 74 69 6f 6e 20 24 72 61 6e 67 65 20 7b 0a 09 ation $range {..
4120: 20 20 20 20 73 65 74 20 63 72 6f 73 73 69 6e 67 set crossing
4130: 73 20 24 63 72 6f 73 73 28 24 6c 6f 63 61 74 69 s $cross($locati
4140: 6f 6e 29 0a 09 20 20 20 20 69 66 20 7b 24 63 72 on).. if {$cr
4150: 6f 73 73 69 6e 67 73 20 3e 20 24 6d 61 78 7d 20 ossings > $max}
4160: 7b 0a 09 09 73 65 74 20 6d 61 78 20 20 24 63 72 {...set max $cr
4170: 6f 73 73 69 6e 67 73 0a 09 09 73 65 74 20 62 65 ossings...set be
4180: 73 74 20 5b 6c 69 73 74 20 24 6c 6f 63 61 74 69 st [list $locati
4190: 6f 6e 5d 0a 09 09 63 6f 6e 74 69 6e 75 65 0a 09 on]...continue..
41a0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 } elseif {$c
41b0: 72 6f 73 73 69 6e 67 73 20 3d 3d 20 24 6d 61 78 rossings == $max
41c0: 7d 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 62 65 } {...lappend be
41d0: 73 74 20 24 6c 6f 63 61 74 69 6f 6e 0a 09 20 20 st $location..
41e0: 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b 24 6d 61 }..}...if {$ma
41f0: 78 20 3d 3d 20 30 7d 20 20 20 20 20 20 20 20 20 x == 0}
4200: 20 20 20 7b 20 72 65 74 75 72 6e 20 2d 31 20 7d { return -1 }
4210: 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 ..if {[llength $
4220: 62 65 73 74 5d 20 3d 3d 20 31 7d 20 7b 20 72 65 best] == 1} { re
4230: 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 62 65 turn [lindex $be
4240: 73 74 20 30 5d 20 7d 0a 0a 09 73 65 74 20 6c 6f st 0] }...set lo
4250: 63 61 74 69 6f 6e 73 20 24 62 65 73 74 0a 09 73 cations $best..s
4260: 65 74 20 62 65 73 74 20 7b 7d 0a 09 73 65 74 20 et best {}..set
4270: 6d 69 6e 20 2d 31 0a 0a 09 66 6f 72 65 61 63 68 min -1...foreach
4280: 20 6c 6f 63 61 74 69 6f 6e 20 24 6c 6f 63 61 74 location $locat
4290: 69 6f 6e 73 20 7b 0a 09 20 20 20 20 73 65 74 20 ions {.. set
42a0: 69 6e 74 65 72 76 61 6c 20 24 64 65 6c 74 61 28 interval $delta(
42b0: 24 6c 6f 63 61 74 69 6f 6e 29 0a 09 20 20 20 20 $location)..
42c0: 69 66 20 7b 28 24 6d 69 6e 20 3c 20 30 29 20 7c if {($min < 0) |
42d0: 7c 20 28 24 69 6e 74 65 72 76 61 6c 20 3c 20 24 | ($interval < $
42e0: 6d 69 6e 29 7d 20 7b 0a 09 09 73 65 74 20 6d 69 min)} {...set mi
42f0: 6e 20 20 24 69 6e 74 65 72 76 61 6c 0a 09 09 73 n $interval...s
4300: 65 74 20 62 65 73 74 20 5b 6c 69 73 74 20 24 6c et best [list $l
4310: 6f 63 61 74 69 6f 6e 5d 0a 09 20 20 20 20 7d 20 ocation].. }
4320: 65 6c 73 65 69 66 20 7b 24 69 6e 74 65 72 76 61 elseif {$interva
4330: 6c 20 3d 3d 20 24 6d 69 6e 7d 20 7b 0a 09 09 6c l == $min} {...l
4340: 61 70 70 65 6e 64 20 62 65 73 74 20 24 6c 6f 63 append best $loc
4350: 61 74 69 6f 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a ation.. }..}.
4360: 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 ..if {[llength $
4370: 62 65 73 74 5d 20 3d 3d 20 31 7d 20 7b 20 72 65 best] == 1} { re
4380: 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 62 65 turn [lindex $be
4390: 73 74 20 30 5d 20 7d 0a 0a 09 72 65 74 75 72 6e st 0] }...return
43a0: 20 5b 6c 69 6e 64 65 78 20 5b 6c 73 6f 72 74 20 [lindex [lsort
43b0: 2d 69 6e 74 65 67 65 72 20 2d 69 6e 63 72 65 61 -integer -increa
43c0: 73 69 6e 67 20 24 62 65 73 74 5d 20 30 5d 0a 20 sing $best] 0].
43d0: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 43 }.. proc C
43e0: 75 74 41 74 20 7b 6c 6f 63 61 74 69 6f 6e 7d 20 utAt {location}
43f0: 7b 0a 09 75 70 76 61 72 20 31 20 63 72 6f 73 73 {..upvar 1 cross
4400: 20 63 72 6f 73 73 20 64 65 70 63 20 64 65 70 63 cross depc depc
4410: 0a 0a 09 23 20 49 74 20 77 61 73 20 64 65 63 69 ...# It was deci
4420: 64 65 64 20 74 6f 20 73 70 6c 69 74 20 74 68 65 ded to split the
4430: 20 63 68 61 6e 67 65 73 65 74 20 61 74 20 74 68 changeset at th
4440: 65 20 67 69 76 65 6e 0a 09 23 20 6c 6f 63 61 74 e given..# locat
4450: 69 6f 6e 2e 20 54 68 69 73 20 63 75 74 73 20 61 ion. This cuts a
4460: 20 6e 75 6d 62 65 72 20 6f 66 20 64 65 70 65 6e number of depen
4470: 64 65 6e 63 69 65 73 2e 20 48 65 72 65 20 77 65 dencies. Here we
4480: 20 75 70 64 61 74 65 0a 09 23 20 74 68 65 20 63 update..# the c
4490: 72 6f 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e ross information
44a0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 62 72 65 so that the bre
44b0: 61 6b 20 66 69 6e 64 65 72 20 68 61 73 20 61 63 ak finder has ac
44c0: 63 75 72 61 74 65 0a 09 23 20 64 61 74 61 20 77 curate..# data w
44d0: 68 65 6e 20 77 65 20 6c 6f 6f 6b 20 61 74 20 74 hen we look at t
44e0: 68 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 61 he generated fra
44f0: 67 6d 65 6e 74 73 2e 0a 0a 09 73 65 74 20 73 69 gments....set si
4500: 78 20 5b 6c 6f 67 20 76 69 73 69 62 6c 65 3f 20 x [log visible?
4510: 36 5d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 64 65 6]...foreach {de
4520: 70 20 72 61 6e 67 65 7d 20 5b 61 72 72 61 79 20 p range} [array
4530: 67 65 74 20 64 65 70 63 5d 20 7b 0a 09 20 20 20 get depc] {..
4540: 20 23 20 43 68 65 63 6b 20 61 6c 6c 20 64 65 70 # Check all dep
4550: 65 6e 64 65 6e 63 69 65 73 20 73 74 69 6c 6c 20 endencies still
4560: 6b 6e 6f 77 6e 2c 20 74 61 6b 65 20 74 68 65 69 known, take thei
4570: 72 20 72 61 6e 67 65 20 61 6e 64 0a 09 20 20 20 r range and..
4580: 20 23 20 73 65 65 20 69 66 20 74 68 65 20 62 72 # see if the br
4590: 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 66 61 6c eak location fal
45a0: 6c 73 20 77 69 74 68 69 6e 2e 0a 0a 09 20 20 20 ls within....
45b0: 20 42 6f 72 64 65 72 20 24 72 61 6e 67 65 20 73 Border $range s
45c0: 20 65 0a 09 20 20 20 20 69 66 20 7b 24 6c 6f 63 e.. if {$loc
45d0: 61 74 69 6f 6e 20 3c 20 24 73 7d 20 63 6f 6e 74 ation < $s} cont
45e0: 69 6e 75 65 20 3b 20 23 20 62 72 65 61 6b 20 62 inue ; # break b
45f0: 65 66 6f 72 65 20 72 61 6e 67 65 2c 20 69 67 6e efore range, ign
4600: 6f 72 65 0a 09 20 20 20 20 69 66 20 7b 24 6c 6f ore.. if {$lo
4610: 63 61 74 69 6f 6e 20 3e 20 24 65 7d 20 63 6f 6e cation > $e} con
4620: 74 69 6e 75 65 20 3b 20 23 20 62 72 65 61 6b 20 tinue ; # break
4630: 61 66 74 65 72 20 72 61 6e 67 65 2c 20 69 67 6e after range, ign
4640: 6f 72 65 2e 0a 0a 09 20 20 20 20 23 20 54 68 69 ore.... # Thi
4650: 73 20 64 65 70 65 6e 64 65 6e 63 79 20 63 72 6f s dependency cro
4660: 73 73 65 73 20 74 68 65 20 62 72 65 61 6b 20 6c sses the break l
4670: 6f 63 61 74 69 6f 6e 2e 20 57 65 20 72 65 6d 6f ocation. We remo
4680: 76 65 20 69 74 0a 09 20 20 20 20 23 20 66 72 6f ve it.. # fro
4690: 6d 20 74 68 65 20 63 72 6f 73 73 69 6e 67 73 20 m the crossings
46a0: 63 6f 75 6e 74 65 72 73 2c 20 61 6e 64 20 74 68 counters, and th
46b0: 65 6e 20 61 6c 73 6f 20 66 72 6f 6d 20 74 68 65 en also from the
46c0: 20 73 65 74 0a 09 20 20 20 20 23 20 6f 66 20 6b set.. # of k
46d0: 6e 6f 77 6e 20 64 65 70 65 6e 64 65 6e 63 69 65 nown dependencie
46e0: 73 2c 20 61 73 20 77 65 20 61 72 65 20 64 6f 6e s, as we are don
46f0: 65 20 77 69 74 68 20 69 74 2e 0a 0a 09 20 20 20 e with it....
4700: 20 66 6f 72 65 61 63 68 20 6c 6f 63 20 24 64 65 foreach loc $de
4710: 70 63 28 24 64 65 70 29 20 7b 20 69 6e 63 72 20 pc($dep) { incr
4720: 63 72 6f 73 73 28 24 6c 6f 63 29 20 2d 31 20 7d cross($loc) -1 }
4730: 0a 09 20 20 20 20 75 6e 73 65 74 20 64 65 70 63 .. unset depc
4740: 28 24 64 65 70 29 0a 0a 09 20 20 20 20 69 66 20 ($dep)... if
4750: 7b 21 24 73 69 78 7d 20 63 6f 6e 74 69 6e 75 65 {!$six} continue
4760: 0a 0a 09 20 20 20 20 73 74 72 75 63 74 3a 3a 6c ... struct::l
4770: 69 73 74 20 61 73 73 69 67 6e 20 24 64 65 70 20 ist assign $dep
4780: 70 61 72 65 6e 74 20 63 68 69 6c 64 0a 09 20 20 parent child..
4790: 20 20 6c 6f 67 20 77 72 69 74 65 20 35 20 63 73 log write 5 cs
47a0: 65 74 73 20 22 42 72 6f 6b 65 20 64 65 70 65 6e ets "Broke depen
47b0: 64 65 6e 63 79 20 5b 50 44 20 24 70 61 72 65 6e dency [PD $paren
47c0: 74 5d 20 2d 2d 3e 20 5b 50 44 20 24 63 68 69 6c t] --> [PD $chil
47d0: 64 5d 22 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 0a d]"..}...return.
47e0: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 50 72 69 }.. # Pri
47f0: 6e 74 20 69 64 65 6e 74 69 66 79 69 6e 67 20 64 nt identifying d
4800: 61 74 61 20 66 6f 72 20 61 20 72 65 76 69 73 69 ata for a revisi
4810: 6f 6e 20 28 70 72 6f 6a 65 63 74 2c 20 66 69 6c on (project, fil
4820: 65 2c 20 64 6f 74 74 65 64 20 72 65 76 0a 20 20 e, dotted rev.
4830: 20 20 23 20 6e 75 6d 62 65 72 29 2c 20 66 6f 72 # number), for
4840: 20 68 69 67 68 20 76 65 72 62 6f 73 69 74 79 20 high verbosity
4850: 6c 6f 67 20 6f 75 74 70 75 74 2e 0a 0a 20 20 20 log output...
4860: 20 70 72 6f 63 20 50 44 20 7b 69 64 7d 20 7b 0a proc PD {id} {.
4870: 09 66 6f 72 65 61 63 68 20 7b 70 20 66 20 72 7d .foreach {p f r}
4880: 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 [state run {...
4890: 53 45 4c 45 43 54 20 50 2e 6e 61 6d 65 20 2c 20 SELECT P.name ,
48a0: 46 2e 6e 61 6d 65 2c 20 52 2e 72 65 76 0a 09 09 F.name, R.rev...
48b0: 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c FROM revision R,
48c0: 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65 63 74 file F, project
48d0: 20 50 0a 09 09 57 48 45 52 45 20 52 2e 72 69 64 P...WHERE R.rid
48e0: 20 3d 20 24 69 64 0a 09 09 41 4e 44 20 20 20 52 = $id...AND R
48f0: 2e 66 69 64 20 3d 20 46 2e 66 69 64 0a 09 09 41 .fid = F.fid...A
4900: 4e 44 20 20 20 46 2e 70 69 64 20 3d 20 50 2e 70 ND F.pid = P.p
4910: 69 64 0a 09 7d 5d 20 62 72 65 61 6b 0a 09 72 65 id..}] break..re
4920: 74 75 72 6e 20 22 27 24 70 20 3a 20 24 66 2f 24 turn "'$p : $f/$
4930: 72 27 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 r'". }.. #
4940: 20 50 72 69 6e 74 69 6e 67 20 6f 6e 65 20 6f 72 Printing one or
4950: 20 6d 6f 72 65 20 72 61 6e 67 65 73 2c 20 66 6f more ranges, fo
4960: 72 6d 61 74 74 65 64 2c 20 61 6e 64 20 6f 6e 6c rmatted, and onl
4970: 79 20 74 68 65 69 72 20 62 6f 72 64 65 72 20 74 y their border t
4980: 6f 0a 20 20 20 20 23 20 6b 65 65 70 20 74 68 65 o. # keep the
4990: 20 73 74 72 69 6e 67 73 20 73 68 6f 72 74 2e 0a strings short..
49a0: 0a 20 20 20 20 70 72 6f 63 20 50 52 73 20 7b 72 . proc PRs {r
49b0: 61 6e 67 65 73 7d 20 7b 0a 09 72 65 74 75 72 6e anges} {..return
49c0: 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d [struct::list m
49d0: 61 70 20 24 72 61 6e 67 65 73 20 5b 6d 79 70 72 ap $ranges [mypr
49e0: 6f 63 20 50 52 5d 5d 0a 20 20 20 20 7d 0a 0a 20 oc PR]]. }..
49f0: 20 20 20 70 72 6f 63 20 50 52 20 7b 72 61 6e 67 proc PR {rang
4a00: 65 7d 20 7b 0a 09 42 6f 72 64 65 72 20 24 72 61 e} {..Border $ra
4a10: 6e 67 65 20 73 20 65 0a 09 72 65 74 75 72 6e 20 nge s e..return
4a20: 3c 24 7b 73 7d 2e 2e 2e 24 7b 65 7d 3e 0a 20 20 <${s}...${e}>.
4a30: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 42 6f }.. proc Bo
4a40: 72 64 65 72 20 7b 72 61 6e 67 65 20 73 76 20 65 rder {range sv e
4a50: 76 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 73 v} {..upvar 1 $s
4a60: 76 20 73 20 24 65 76 20 65 0a 09 73 65 74 20 73 v s $ev e..set s
4a70: 20 5b 6c 69 6e 64 65 78 20 24 72 61 6e 67 65 20 [lindex $range
4a80: 30 5d 0a 09 73 65 74 20 65 20 5b 6c 69 6e 64 65 0]..set e [linde
4a90: 78 20 24 72 61 6e 67 65 20 65 6e 64 5d 0a 09 72 x $range end]..r
4aa0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 eturn. }..
4ab0: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 # # ## ### ####
4ac0: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 # ######## #####
4ad0: 23 23 23 23 23 23 23 23 0a 0a 20 20 20 20 74 79 ########.. ty
4ae0: 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 68 61 pevariable mycha
4af0: 6e 67 65 73 65 74 73 20 20 20 20 20 7b 7d 20 3b ngesets {} ;
4b00: 20 23 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 6b # List of all k
4b10: 6e 6f 77 6e 20 63 68 61 6e 67 65 73 65 74 73 2e nown changesets.
4b20: 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c . typevariabl
4b30: 65 20 6d 79 69 74 65 6d 6d 61 70 20 2d 61 72 72 e myitemmap -arr
4b40: 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 66 72 ay {} ; # Map fr
4b50: 6f 6d 20 69 74 65 6d 73 20 28 74 61 67 67 65 64 om items (tagged
4b60: 29 20 74 6f 0a 09 09 09 09 20 20 20 20 20 20 20 ) to.....
4b70: 23 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 68 # the list of ch
4b80: 61 6e 67 65 73 65 74 73 0a 09 09 09 09 20 20 20 angesets.....
4b90: 20 20 20 20 23 20 63 6f 6e 74 61 69 6e 69 6e 67 # containing
4ba0: 20 69 74 2e 20 45 61 63 68 20 69 74 65 6d 20 63 it. Each item c
4bb0: 61 6e 0a 09 09 09 09 20 20 20 20 20 20 20 23 20 an..... #
4bc0: 62 65 20 75 73 65 64 20 62 79 20 6f 6e 6c 79 20 be used by only
4bd0: 6f 6e 65 0a 09 09 09 09 20 20 20 20 20 20 20 23 one..... #
4be0: 20 63 68 61 6e 67 65 73 65 74 2e 0a 20 20 20 20 changeset..
4bf0: 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 69 typevariable myi
4c00: 64 6d 61 70 20 20 20 2d 61 72 72 61 79 20 7b 7d dmap -array {}
4c10: 20 3b 20 23 20 4d 61 70 20 66 72 6f 6d 20 63 68 ; # Map from ch
4c20: 61 6e 67 65 73 65 74 20 69 64 20 74 6f 0a 09 09 angeset id to...
4c30: 09 09 20 20 20 20 20 20 20 23 20 63 68 61 6e 67 .. # chang
4c40: 65 73 65 74 2e 0a 0a 20 20 20 20 74 79 70 65 6d eset... typem
4c50: 65 74 68 6f 64 20 61 6c 6c 20 20 20 20 7b 7d 20 ethod all {}
4c60: 20 20 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 63 { return $myc
4c70: 68 61 6e 67 65 73 65 74 73 20 7d 0a 20 20 20 20 hangesets }.
4c80: 74 79 70 65 6d 65 74 68 6f 64 20 6f 66 20 20 20 typemethod of
4c90: 20 20 7b 63 69 64 7d 20 7b 20 72 65 74 75 72 6e {cid} { return
4ca0: 20 24 6d 79 69 64 6d 61 70 28 24 63 69 64 29 20 $myidmap($cid)
4cb0: 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 }. typemethod
4cc0: 20 6f 66 69 74 65 6d 20 7b 69 69 64 7d 20 7b 20 ofitem {iid} {
4cd0: 72 65 74 75 72 6e 20 24 6d 79 69 74 65 6d 6d 61 return $myitemma
4ce0: 70 28 24 69 69 64 29 20 7d 0a 0a 20 20 20 20 23 p($iid) }.. #
4cf0: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 # ## ### #####
4d00: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
4d10: 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 43 6f ######. ## Co
4d20: 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a 20 20 20 nfiguration..
4d30: 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65 pragma -hastype
4d40: 69 6e 66 6f 20 20 20 20 6e 6f 20 20 3b 20 23 20 info no ; #
4d50: 6e 6f 20 74 79 70 65 20 69 6e 74 72 6f 73 70 65 no type introspe
4d60: 63 74 69 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61 ction. pragma
4d70: 20 2d 68 61 73 69 6e 66 6f 20 20 20 20 20 20 20 -hasinfo
4d80: 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 6f 62 6a 65 no ; # no obje
4d90: 63 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e ct introspection
4da0: 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23 .. # # ## ###
4db0: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 ##### ########
4dc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 7d 0a #############.}.
4dd0: 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 .# # ## ### ####
4de0: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 # ######## #####
4df0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
4e00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 ##############.#
4e10: 23 20 48 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 # Helper singlet
4e20: 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20 66 6f 72 on. Commands for
4e30: 20 72 65 76 69 73 69 6f 6e 20 63 68 61 6e 67 65 revision change
4e40: 73 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 sets...snit::typ
4e50: 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a e ::vc::fossil::
4e60: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f import::cvs::pro
4e70: 6a 65 63 74 3a 3a 72 65 76 3a 3a 72 65 76 20 7b ject::rev::rev {
4e80: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 . typemethod
4e90: 62 79 72 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 byrevision {} {
4ea0: 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 return 1 }. t
4eb0: 79 70 65 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 ypemethod bysymb
4ec0: 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e ol {} { return
4ed0: 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 0 }. typemet
4ee0: 68 6f 64 20 69 73 74 61 67 20 20 20 20 20 20 7b hod istag {
4ef0: 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 } { return 0 }.
4f00: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73 typemethod is
4f10: 62 72 61 6e 63 68 20 20 20 7b 7d 20 7b 20 72 65 branch {} { re
4f20: 74 75 72 6e 20 30 20 7d 0a 0a 20 20 20 20 23 20 turn 0 }.. #
4f30: 72 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 6d result = list (m
4f40: 69 6e 74 69 6d 65 2c 20 6d 61 78 74 69 6d 65 29 intime, maxtime)
4f50: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 . typemethod
4f60: 74 69 6d 65 72 61 6e 67 65 20 7b 69 74 65 6d 73 timerange {items
4f70: 7d 20 7b 0a 09 73 65 74 20 74 68 65 73 65 74 20 } {..set theset
4f80: 28 27 5b 6a 6f 69 6e 20 24 69 74 65 6d 73 20 7b ('[join $items {
4f90: 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20 ','}]')..return
4fa0: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 [state run "..
4fb0: 20 20 53 45 4c 45 43 54 20 4d 49 4e 28 52 2e 64 SELECT MIN(R.d
4fc0: 61 74 65 29 2c 20 4d 41 58 28 52 2e 64 61 74 65 ate), MAX(R.date
4fd0: 29 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69 ).. FROM revi
4fe0: 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 sion R.. WHER
4ff0: 45 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 E R.rid IN $thes
5000: 65 74 0a 09 22 5d 0a 20 20 20 20 7d 0a 0a 20 20 et.."]. }..
5010: 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 # var(dv) = di
5020: 63 74 20 28 72 65 76 69 73 69 6f 6e 20 2d 3e 20 ct (revision ->
5030: 6c 69 73 74 20 28 72 65 76 69 73 69 6f 6e 29 29 list (revision))
5040: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 . typemethod
5050: 69 6e 74 65 72 6e 61 6c 73 75 63 63 65 73 73 6f internalsuccesso
5060: 72 73 20 7b 64 76 20 72 65 76 69 73 69 6f 6e 73 rs {dv revisions
5070: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76 } {..upvar 1 $dv
5080: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 73 dependencies..s
5090: 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 et theset ('[joi
50a0: 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c n $revisions {',
50b0: 27 7d 5d 27 29 0a 0a 09 23 20 53 65 65 20 27 73 '}]')...# See 's
50c0: 75 63 63 65 73 73 6f 72 73 27 20 62 65 6c 6f 77 uccessors' below
50d0: 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 65 78 for the main ex
50e0: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 0a 09 23 20 planation of..#
50f0: 74 68 65 20 76 61 72 69 6f 75 73 20 63 61 73 65 the various case
5100: 73 2e 20 54 68 69 73 20 70 69 65 63 65 20 69 73 s. This piece is
5110: 20 73 70 65 63 69 61 6c 20 69 6e 20 74 68 61 74 special in that
5120: 20 69 74 0a 09 23 20 72 65 73 74 72 69 63 74 73 it..# restricts
5130: 20 74 68 65 20 73 75 63 63 65 73 73 6f 72 73 20 the successors
5140: 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 6f 20 74 we look for to t
5150: 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 0a 09 he same set of..
5160: 23 20 72 65 76 69 73 69 6f 6e 73 20 77 65 20 73 # revisions we s
5170: 74 61 72 74 20 66 72 6f 6d 2e 20 53 65 6e 73 69 tart from. Sensi
5180: 62 6c 65 20 61 73 20 77 65 20 61 72 65 20 6c 6f ble as we are lo
5190: 6f 6b 69 6e 67 20 66 6f 72 0a 09 23 20 63 68 61 oking for..# cha
51a0: 6e 67 65 73 65 74 20 69 6e 74 65 72 6e 61 6c 20 ngeset internal
51b0: 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 0a 0a 09 dependencies....
51c0: 61 72 72 61 79 20 73 65 74 20 64 65 70 20 7b 7d array set dep {}
51d0: 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 ...foreach {rid
51e0: 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 child} [state ru
51f0: 6e 20 22 0a 20 20 20 2d 2d 20 28 31 29 20 50 72 n ". -- (1) Pr
5200: 69 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 imary child..
5210: 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 SELECT R.rid, R
5220: 2e 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d .child.. FROM
5230: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 revision R..
5240: 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 WHERE R.rid
5250: 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 IN $theset
5260: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 -- Restrict to
5270: 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 revisions of int
5280: 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 erest.. AND
5290: 20 20 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 R.child IS NOT
52a0: 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 NULL -- Has
52b0: 70 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 primary child..
52c0: 20 20 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c AND R.chil
52d0: 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 d IN $theset
52e0: 20 2d 2d 20 57 68 69 63 68 20 69 73 20 61 6c 73 -- Which is als
52f0: 6f 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 20 20 o of interest.
5300: 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 UNION. -- (
5310: 32 29 20 53 65 63 6f 6e 64 61 72 79 20 28 62 72 2) Secondary (br
5320: 61 6e 63 68 29 20 63 68 69 6c 64 72 65 6e 0a 09 anch) children..
5330: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 SELECT R.rid
5340: 2c 20 42 2e 62 72 69 64 0a 09 20 20 20 20 46 52 , B.brid.. FR
5350: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c OM revision R,
5360: 20 72 65 76 69 73 69 6f 6e 62 72 61 6e 63 68 63 revisionbranchc
5370: 68 69 6c 64 72 65 6e 20 42 0a 09 20 20 20 20 57 hildren B.. W
5380: 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e HERE R.rid IN
5390: 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 $theset --
53a0: 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 Restrict to revi
53b0: 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 sions of interes
53c0: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e t.. AND R.
53d0: 72 69 64 20 3d 20 42 2e 72 69 64 20 20 20 20 20 rid = B.rid
53e0: 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 73 -- Select s
53f0: 75 62 73 65 74 20 6f 66 20 62 72 61 6e 63 68 20 ubset of branch
5400: 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 41 4e children.. AN
5410: 44 20 20 20 20 42 2e 62 72 69 64 20 49 4e 20 24 D B.brid IN $
5420: 74 68 65 73 65 74 20 20 20 20 20 20 2d 2d 20 57 theset -- W
5430: 68 69 63 68 20 69 73 20 61 6c 73 6f 20 6f 66 20 hich is also of
5440: 69 6e 74 65 72 65 73 74 0a 20 20 20 20 55 4e 49 interest. UNI
5450: 4f 4e 0a 20 20 20 20 2d 2d 20 28 34 29 20 43 68 ON. -- (4) Ch
5460: 69 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f ild of trunk roo
5470: 74 20 73 75 63 63 65 73 73 6f 72 20 6f 66 20 6c t successor of l
5480: 61 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e ast NTDB on trun
5490: 6b 2e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 k... SELECT R
54a0: 2e 72 69 64 2c 20 52 41 2e 63 68 69 6c 64 0a 09 .rid, RA.child..
54b0: 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f FROM revisio
54c0: 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 n R, revision RA
54d0: 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e 72 69 .. WHERE R.ri
54e0: 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 d IN $theset
54f0: 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 -- Restrict
5500: 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 to revisions of
5510: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e interest.. AN
5520: 44 20 20 20 52 2e 69 73 64 65 66 61 75 6c 74 20 D R.isdefault
5530: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 52 -- R
5540: 65 73 74 72 69 63 74 20 74 6f 20 4e 54 44 42 0a estrict to NTDB.
5550: 09 20 20 20 20 41 4e 44 20 20 20 52 2e 64 62 63 . AND R.dbc
5560: 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c hild IS NOT NULL
5570: 20 20 20 2d 2d 20 61 6e 64 20 6c 61 73 74 20 4e -- and last N
5580: 54 44 42 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f TDB belonging to
5590: 20 74 72 75 6e 6b 0a 09 20 20 20 20 41 4e 44 20 trunk.. AND
55a0: 20 20 52 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 RA.rid = R.dbc
55b0: 68 69 6c 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 hild -- Go
55c0: 64 69 72 65 63 74 6c 79 20 74 6f 20 74 72 75 6e directly to trun
55d0: 6b 20 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 k root.. AND
55e0: 20 20 52 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f RA.child IS NO
55f0: 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 T NULL -- Has
5600: 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a primary child..
5610: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 AND
5620: 20 20 52 41 2e 63 68 69 6c 64 20 49 4e 20 24 74 RA.child IN $t
5630: 68 65 73 65 74 20 20 20 20 20 2d 2d 20 57 68 69 heset -- Whi
5640: 63 68 20 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e ch is also of in
5650: 74 65 72 65 73 74 0a 09 22 5d 20 7b 0a 09 20 20 terest.."] {..
5660: 20 20 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 # Consider mov
5670: 69 6e 67 20 74 68 69 73 20 74 6f 20 74 68 65 20 ing this to the
5680: 69 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 integrity module
5690: 2e 0a 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 ... integrity
56a0: 20 61 73 73 65 72 74 20 7b 24 72 69 64 20 21 3d assert {$rid !=
56b0: 20 24 63 68 69 6c 64 7d 20 7b 52 65 76 69 73 69 $child} {Revisi
56c0: 6f 6e 20 24 72 69 64 20 64 65 70 65 6e 64 73 20 on $rid depends
56d0: 6f 6e 20 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20 on itself.}..
56e0: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 lappend depende
56f0: 6e 63 69 65 73 28 24 72 69 64 29 20 24 63 68 69 ncies($rid) $chi
5700: 6c 64 0a 09 20 20 20 20 73 65 74 20 64 65 70 28 ld.. set dep(
5710: 24 72 69 64 2c 24 63 68 69 6c 64 29 20 2e 0a 09 $rid,$child) ...
5720: 7d 0a 0a 09 23 20 54 68 65 20 73 71 6c 20 73 74 }...# The sql st
5730: 61 74 65 6d 65 6e 74 73 20 61 62 6f 76 65 20 6c atements above l
5740: 6f 6f 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 64 69 ooks only for di
5750: 72 65 63 74 20 64 65 70 65 6e 64 65 6e 63 69 65 rect dependencie
5760: 73 0a 09 23 20 62 65 74 77 65 65 6e 20 72 65 76 s..# between rev
5770: 69 73 69 6f 6e 20 69 6e 20 74 68 65 20 63 68 61 ision in the cha
5780: 6e 67 65 73 65 74 2e 20 48 6f 77 65 76 65 72 20 ngeset. However
5790: 64 75 65 20 74 6f 20 74 68 65 0a 09 23 20 76 61 due to the..# va
57a0: 67 61 72 69 65 73 20 6f 66 20 6d 65 74 61 20 64 garies of meta d
57b0: 61 74 61 20 69 74 20 69 73 20 70 6f 73 73 69 62 ata it is possib
57c0: 6c 65 20 66 6f 72 20 74 77 6f 20 72 65 76 69 73 le for two revis
57d0: 69 6f 6e 73 20 6f 66 0a 09 23 20 74 68 65 20 73 ions of..# the s
57e0: 61 6d 65 20 66 69 6c 65 20 74 6f 20 65 6e 64 20 ame file to end
57f0: 75 70 20 69 6e 20 74 68 65 20 73 61 6d 65 20 63 up in the same c
5800: 68 61 6e 67 65 73 65 74 2c 20 77 69 74 68 6f 75 hangeset, withou
5810: 74 20 61 0a 09 23 20 64 69 72 65 63 74 20 64 65 t a..# direct de
5820: 70 65 6e 64 65 6e 63 79 20 62 65 74 77 65 65 6e pendency between
5830: 20 74 68 65 6d 2e 20 48 6f 77 65 76 65 72 20 77 them. However w
5840: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 72 e know that ther
5850: 65 0a 09 23 20 68 61 73 20 74 6f 20 62 65 20 61 e..# has to be a
5860: 20 61 6e 20 69 6e 64 69 72 65 63 74 20 64 65 70 an indirect dep
5870: 65 6e 64 65 6e 63 79 2c 20 62 65 20 69 74 20 74 endency, be it t
5880: 68 72 6f 75 67 68 20 70 72 69 6d 61 72 79 0a 09 hrough primary..
5890: 23 20 63 68 69 6c 64 72 65 6e 2c 20 62 72 61 6e # children, bran
58a0: 63 68 20 63 68 69 6c 64 72 65 6e 2c 20 6f 72 20 ch children, or
58b0: 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68 a combination th
58c0: 65 72 65 6f 66 2e 0a 0a 09 23 20 57 65 20 6e 6f ereof....# We no
58d0: 77 20 66 69 6c 6c 20 69 6e 20 74 68 65 73 65 20 w fill in these
58e0: 70 73 65 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63 pseudo-dependenc
58f0: 69 65 73 2c 20 69 66 20 6e 6f 20 73 75 63 68 0a ies, if no such.
5900: 09 23 20 64 65 70 65 6e 64 65 6e 63 79 20 65 78 .# dependency ex
5910: 69 73 74 73 20 61 6c 72 65 61 64 79 2e 20 54 68 ists already. Th
5920: 65 20 64 69 72 65 63 74 69 6f 6e 20 6f 66 20 74 e direction of t
5930: 68 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 09 23 he dependency..#
5940: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 69 72 72 is actually irr
5950: 65 6c 65 76 61 6e 74 20 66 6f 72 20 74 68 69 73 elevant for this
5960: 2e 0a 0a 09 23 20 4e 4f 54 45 3a 20 54 68 69 73 ....# NOTE: This
5970: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 is different fr
5980: 6f 6d 20 63 76 73 32 73 76 6e 2e 20 4f 75 72 20 om cvs2svn. Our
5990: 73 70 69 72 69 74 75 61 6c 20 61 6e 63 65 73 74 spiritual ancest
59a0: 6f 72 0a 09 23 20 64 6f 65 73 20 6e 6f 74 20 75 or..# does not u
59b0: 73 65 20 73 75 63 68 20 70 73 65 75 64 6f 2d 64 se such pseudo-d
59c0: 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 68 6f 77 ependencies, how
59d0: 65 76 65 72 20 69 74 20 75 73 65 73 20 61 0a 09 ever it uses a..
59e0: 23 20 43 4f 4d 4d 49 54 5f 54 48 52 45 53 48 4f # COMMIT_THRESHO
59f0: 4c 44 2c 20 61 20 74 69 6d 65 20 69 6e 74 65 72 LD, a time inter
5a00: 76 61 6c 20 63 6f 6d 6d 69 74 73 20 73 68 6f 75 val commits shou
5a10: 6c 64 20 66 61 6c 6c 2e 20 54 68 69 73 0a 09 23 ld fall. This..#
5a20: 20 77 69 6c 6c 20 67 72 65 61 74 6c 79 20 72 65 will greatly re
5a30: 64 75 63 65 73 20 74 68 65 20 72 69 73 6b 20 6f duces the risk o
5a40: 66 20 67 65 74 74 69 6e 67 20 66 61 72 20 73 65 f getting far se
5a50: 70 61 72 61 74 65 64 0a 09 23 20 72 65 76 69 73 parated..# revis
5a60: 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 65 ions of the same
5a70: 20 66 69 6c 65 20 69 6e 74 6f 20 6f 6e 65 20 63 file into one c
5a80: 68 61 6e 67 65 73 65 74 2e 0a 0a 09 23 20 57 65 hangeset....# We
5a90: 20 61 6c 6c 6f 77 20 72 65 76 69 73 69 6f 6e 73 allow revisions
5aa0: 20 74 6f 20 62 65 20 66 61 72 20 61 70 61 72 74 to be far apart
5ab0: 20 69 6e 20 74 69 6d 65 20 69 6e 20 74 68 65 20 in time in the
5ac0: 73 61 6d 65 0a 09 23 20 63 68 61 6e 67 65 73 65 same..# changese
5ad0: 74 2c 20 62 75 74 20 6e 65 65 64 20 74 68 65 20 t, but need the
5ae0: 70 73 65 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63 pseudo-dependenc
5af0: 69 65 73 20 66 6f 72 20 74 68 69 73 2e 0a 0a 09 ies for this....
5b00: 61 72 72 61 79 20 73 65 74 20 66 69 64 73 20 7b array set fids {
5b10: 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 }..foreach {rid
5b20: 66 69 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 fid} [state run
5b30: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e ".. SELECT R.
5b40: 72 69 64 2c 20 52 2e 66 69 64 20 46 52 4f 4d 20 rid, R.fid FROM
5b50: 72 65 76 69 73 69 6f 6e 20 52 20 57 48 45 52 45 revision R WHERE
5b60: 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 R.rid IN $these
5b70: 74 0a 09 22 5d 20 7b 20 6c 61 70 70 65 6e 64 20 t.."] { lappend
5b80: 66 69 64 73 28 24 66 69 64 29 20 24 72 69 64 20 fids($fid) $rid
5b90: 7d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 66 69 64 }...foreach {fid
5ba0: 20 72 69 64 73 7d 20 5b 61 72 72 61 79 20 67 65 rids} [array ge
5bb0: 74 20 66 69 64 73 5d 20 7b 0a 09 20 20 20 20 69 t fids] {.. i
5bc0: 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 72 69 64 f {[llength $rid
5bd0: 73 5d 20 3c 20 32 7d 20 63 6f 6e 74 69 6e 75 65 s] < 2} continue
5be0: 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 61 20 .. foreach a
5bf0: 24 72 69 64 73 20 7b 0a 09 09 66 6f 72 65 61 63 $rids {...foreac
5c00: 68 20 62 20 24 72 69 64 73 20 7b 0a 09 09 20 20 h b $rids {...
5c10: 20 20 69 66 20 7b 24 61 20 3d 3d 20 24 62 7d 20 if {$a == $b}
5c20: 63 6f 6e 74 69 6e 75 65 0a 09 09 20 20 20 20 69 continue... i
5c30: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 f {[info exists
5c40: 64 65 70 28 24 61 2c 24 62 29 5d 7d 20 63 6f 6e dep($a,$b)]} con
5c50: 74 69 6e 75 65 0a 09 09 20 20 20 20 69 66 20 7b tinue... if {
5c60: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64 65 70 [info exists dep
5c70: 28 24 62 2c 24 61 29 5d 7d 20 63 6f 6e 74 69 6e ($b,$a)]} contin
5c80: 75 65 0a 09 09 20 20 20 20 6c 61 70 70 65 6e 64 ue... lappend
5c90: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 24 61 dependencies($a
5ca0: 29 20 24 62 0a 09 09 20 20 20 20 73 65 74 20 64 ) $b... set d
5cb0: 65 70 28 24 61 2c 24 62 29 20 2e 0a 09 09 20 20 ep($a,$b) ....
5cc0: 20 20 73 65 74 20 64 65 70 28 24 62 2c 24 61 29 set dep($b,$a)
5cd0: 20 2e 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d ....}.. }..}
5ce0: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a ..return. }..
5cf0: 20 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 # var(dv) =
5d00: 64 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 dict (item -> li
5d10: 73 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d st (item)), item
5d20: 20 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69 = list (type i
5d30: 64 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f d). typemetho
5d40: 64 20 73 75 63 63 65 73 73 6f 72 73 20 7b 64 76 d successors {dv
5d50: 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 revisions} {..u
5d60: 70 76 61 72 20 31 20 24 64 76 20 64 65 70 65 6e pvar 1 $dv depen
5d70: 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74 68 65 dencies..set the
5d80: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 set ('[join $rev
5d90: 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a isions {','}]').
5da0: 0a 09 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e ..# The followin
5db0: 67 20 63 61 73 65 73 20 73 70 65 63 69 66 79 20 g cases specify
5dc0: 77 68 65 6e 20 61 20 72 65 76 69 73 69 6f 6e 20 when a revision
5dd0: 53 20 69 73 20 61 20 73 75 63 63 65 73 73 6f 72 S is a successor
5de0: 0a 09 23 20 6f 66 20 61 20 72 65 76 69 73 69 6f ..# of a revisio
5df0: 6e 20 52 2e 20 45 61 63 68 20 6f 66 20 74 68 65 n R. Each of the
5e00: 20 63 61 73 65 73 20 74 72 61 6e 73 6c 61 74 65 cases translate
5e10: 73 20 69 6e 74 6f 20 6f 6e 65 20 6f 66 0a 09 23 s into one of..#
5e20: 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 6f 66 the branches of
5e30: 20 74 68 65 20 53 51 4c 20 55 4e 49 4f 4e 20 63 the SQL UNION c
5e40: 6f 6d 69 6e 67 20 62 65 6c 6f 77 2e 0a 09 23 0a oming below...#.
5e50: 09 23 20 28 31 29 20 53 20 63 61 6e 20 62 65 20 .# (1) S can be
5e60: 61 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 20 a primary child
5e70: 6f 66 20 52 2c 20 69 2e 65 2e 20 69 6e 20 74 68 of R, i.e. in th
5e80: 65 20 73 61 6d 65 20 4c 4f 44 2e 20 52 0a 09 23 e same LOD. R..#
5e90: 20 20 20 20 20 72 65 66 65 72 65 6e 63 65 73 20 references
5ea0: 53 20 64 69 72 65 63 74 6c 79 2e 20 52 2e 63 68 S directly. R.ch
5eb0: 69 6c 64 20 3d 20 53 28 2e 72 69 64 29 2c 20 69 ild = S(.rid), i
5ec0: 66 20 69 74 20 65 78 69 73 74 73 2e 0a 09 23 0a f it exists...#.
5ed0: 09 23 20 28 32 29 20 53 20 63 61 6e 20 62 65 20 .# (2) S can be
5ee0: 61 20 73 65 63 6f 6e 64 61 72 79 2c 20 69 2e 65 a secondary, i.e
5ef0: 2e 20 62 72 61 6e 63 68 2c 20 63 68 69 6c 64 20 . branch, child
5f00: 6f 66 20 52 2e 20 48 65 72 65 20 74 68 65 0a 09 of R. Here the..
5f10: 23 20 20 20 20 20 6c 69 6e 6b 20 69 73 20 6d 61 # link is ma
5f20: 64 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 68 de through the h
5f30: 65 6c 70 65 72 20 74 61 62 6c 65 0a 09 23 20 20 elper table..#
5f40: 20 20 20 52 45 56 49 53 49 4f 4e 42 52 41 4e 43 REVISIONBRANC
5f50: 48 43 48 49 4c 44 52 45 4e 2e 20 52 2e 72 69 64 HCHILDREN. R.rid
5f60: 20 2d 3e 20 52 42 43 2e 72 69 64 2c 20 52 42 43 -> RBC.rid, RBC
5f70: 2e 62 72 69 64 20 3d 0a 09 23 20 20 20 20 20 53 .brid =..# S
5f80: 28 2e 72 69 64 29 0a 09 23 0a 09 23 20 28 33 29 (.rid)..#..# (3)
5f90: 20 4f 72 69 67 69 6e 61 6c 6c 79 20 74 68 69 73 Originally this
5fa0: 20 75 73 65 20 63 61 73 65 20 64 65 66 69 6e 65 use case define
5fb0: 64 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 20 d the root of a
5fc0: 64 65 74 61 63 68 65 64 0a 09 23 20 20 20 20 20 detached..#
5fd0: 4e 54 44 42 20 61 73 20 74 68 65 20 73 75 63 63 NTDB as the succ
5fe0: 65 73 73 6f 72 20 6f 66 20 74 68 65 20 74 72 75 essor of the tru
5ff0: 6e 6b 20 72 6f 6f 74 2e 20 54 68 69 73 20 6c 65 nk root. This le
6000: 61 64 73 20 74 6f 20 61 0a 09 23 20 20 20 20 20 ads to a..#
6010: 62 61 64 20 74 61 6e 67 6c 65 20 6c 61 74 65 72 bad tangle later
6020: 20 6f 6e 2e 20 57 69 74 68 20 61 20 64 65 74 61 on. With a deta
6030: 63 68 65 64 20 4e 54 44 42 20 74 68 65 20 6f 72 ched NTDB the or
6040: 69 67 69 6e 61 6c 0a 09 23 20 20 20 20 20 74 72 iginal..# tr
6050: 75 6e 6b 20 72 6f 6f 74 20 72 65 76 69 73 69 6f unk root revisio
6060: 6e 20 77 61 73 20 72 65 6d 6f 76 65 64 20 61 73 n was removed as
6070: 20 69 72 72 65 6c 65 76 61 6e 74 2c 20 61 6c 6c irrelevant, all
6080: 6f 77 69 6e 67 0a 09 23 20 20 20 20 20 74 68 65 owing..# the
6090: 20 6e 6f 6d 69 6e 61 6c 20 72 6f 6f 74 20 74 6f nominal root to
60a0: 20 62 65 20 6c 61 74 65 72 20 69 6e 20 74 69 6d be later in tim
60b0: 65 20 74 68 61 6e 20 74 68 65 20 4e 54 44 42 0a e than the NTDB.
60c0: 09 23 20 20 20 20 20 72 6f 6f 74 2e 20 4e 6f 77 .# root. Now
60d0: 20 73 65 74 74 69 6e 67 20 74 68 69 73 20 64 65 setting this de
60e0: 70 65 6e 64 65 6e 63 79 20 77 69 6c 6c 20 62 65 pendency will be
60f0: 20 62 61 63 6b 77 61 72 64 20 69 6e 0a 09 23 20 backward in..#
6100: 20 20 20 20 74 69 6d 65 2e 20 52 45 4d 4f 56 45 time. REMOVE
6110: 44 2e 0a 09 23 0a 09 23 20 28 34 29 20 49 66 20 D...#..# (4) If
6120: 52 20 69 73 20 74 68 65 20 6c 61 73 74 20 6f 66 R is the last of
6130: 20 74 68 65 20 4e 54 44 42 20 72 65 76 69 73 69 the NTDB revisi
6140: 6f 6e 73 20 77 68 69 63 68 20 62 65 6c 6f 6e 67 ons which belong
6150: 20 74 6f 0a 09 23 20 20 20 20 20 74 68 65 20 74 to..# the t
6160: 72 75 6e 6b 2c 20 74 68 65 6e 20 74 68 65 20 70 runk, then the p
6170: 72 69 6d 61 72 79 20 63 68 69 6c 64 20 6f 66 20 rimary child of
6180: 74 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74 20 28 the trunk root (
6190: 74 68 65 0a 09 23 20 20 20 20 20 27 31 2e 32 27 the..# '1.2'
61a0: 20 72 65 76 69 73 69 6f 6e 29 20 69 73 20 61 20 revision) is a
61b0: 73 75 63 63 65 73 73 6f 72 2c 20 69 66 20 69 74 successor, if it
61c0: 20 65 78 69 73 74 73 2e 0a 0a 09 23 20 4e 6f 74 exists....# Not
61d0: 65 20 74 68 61 74 20 74 68 65 20 62 72 61 6e 63 e that the branc
61e0: 68 65 73 20 73 70 61 77 6e 65 64 20 66 72 6f 6d hes spawned from
61f0: 20 74 68 65 20 72 65 76 69 73 69 6f 6e 73 2c 20 the revisions,
6200: 61 6e 64 20 74 68 65 0a 09 23 20 74 61 67 73 20 and the..# tags
6210: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 associated with
6220: 74 68 65 6d 20 61 72 65 20 73 75 63 63 65 73 73 them are success
6230: 6f 72 73 20 61 73 20 77 65 6c 6c 2e 0a 0a 09 66 ors as well....f
6240: 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c oreach {rid chil
6250: 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a d} [state run ".
6260: 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d 61 72 -- (1) Primar
6270: 79 20 63 68 69 6c 64 0a 09 20 20 20 20 53 45 4c y child.. SEL
6280: 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63 68 69 ECT R.rid, R.chi
6290: 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 ld.. FROM r
62a0: 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 evision R.. W
62b0: 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e HERE R.rid IN
62c0: 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 $theset --
62d0: 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 Restrict to revi
62e0: 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 sions of interes
62f0: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e t.. AND R.
6300: 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c child IS NOT NUL
6310: 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d L -- Has prim
6320: 61 72 79 20 63 68 69 6c 64 0a 20 20 20 20 55 4e ary child. UN
6330: 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32 29 20 53 ION. -- (2) S
6340: 65 63 6f 6e 64 61 72 79 20 28 62 72 61 6e 63 68 econdary (branch
6350: 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 ) children..
6360: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 42 2e SELECT R.rid, B.
6370: 62 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 brid.. FROM
6380: 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 revision R, rev
6390: 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64 isionbranchchild
63a0: 72 65 6e 20 42 0a 09 20 20 20 20 57 48 45 52 45 ren B.. WHERE
63b0: 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 R.rid IN $th
63c0: 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 eset -- Rest
63d0: 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e rict to revision
63e0: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 s of interest..
63f0: 20 20 20 41 4e 44 20 20 20 20 52 2e 72 69 64 20 AND R.rid
6400: 3d 20 42 2e 72 69 64 20 20 20 20 20 20 20 20 20 = B.rid
6410: 20 2d 2d 20 53 65 6c 65 63 74 20 73 75 62 73 65 -- Select subse
6420: 74 20 6f 66 20 62 72 61 6e 63 68 20 63 68 69 6c t of branch chil
6430: 64 72 65 6e 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 dren. UNION.
6440: 20 20 20 2d 2d 20 28 34 29 20 43 68 69 6c 64 20 -- (4) Child
6450: 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 20 73 75 of trunk root su
6460: 63 63 65 73 73 6f 72 20 6f 66 20 6c 61 73 74 20 ccessor of last
6470: 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b 2e 0a 09 NTDB on trunk...
6480: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 SELECT R.rid
6490: 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20 20 20 20 , RA.child..
64a0: 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c FROM revision R,
64b0: 20 72 65 76 69 73 69 6f 6e 20 52 41 0a 09 20 20 revision RA..
64c0: 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 20 20 WHERE R.rid
64d0: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 20 IN $theset
64e0: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 -- Restrict to r
64f0: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 evisions of inte
6500: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 rest.. AND
6510: 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20 20 R.isdefault
6520: 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 -- Restr
6530: 69 63 74 20 74 6f 20 4e 54 44 42 0a 09 20 20 20 ict to NTDB..
6540: 20 41 4e 44 20 20 20 52 2e 64 62 63 68 69 6c 64 AND R.dbchild
6550: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d IS NOT NULL -
6560: 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 42 20 - and last NTDB
6570: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72 75 belonging to tru
6580: 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 52 41 nk.. AND RA
6590: 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69 6c 64 .rid = R.dbchild
65a0: 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 72 65 -- Go dire
65b0: 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 72 6f ctly to trunk ro
65c0: 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 52 41 ot.. AND RA
65d0: 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 .child IS NOT NU
65e0: 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69 LL -- Has pri
65f0: 6d 61 72 79 20 63 68 69 6c 64 2e 0a 09 22 5d 20 mary child..."]
6600: 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 69 64 65 {.. # Conside
6610: 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 20 74 6f r moving this to
6620: 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6d the integrity m
6630: 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 6e 74 65 odule... inte
6640: 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24 72 grity assert {$r
6650: 69 64 20 21 3d 20 24 63 68 69 6c 64 7d 20 7b 52 id != $child} {R
6660: 65 76 69 73 69 6f 6e 20 24 72 69 64 20 64 65 70 evision $rid dep
6670: 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 2e 7d ends on itself.}
6680: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 .. lappend de
6690: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 pendencies([list
66a0: 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c 69 73 rev $rid]) [lis
66b0: 74 20 72 65 76 20 24 63 68 69 6c 64 5d 0a 09 7d t rev $child]..}
66c0: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63 ..foreach {rid c
66d0: 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e hild} [state run
66e0: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 ".. SELECT R
66f0: 2e 72 69 64 2c 20 54 2e 74 69 64 0a 09 20 20 20 .rid, T.tid..
6700: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e FROM revision
6710: 20 52 2c 20 74 61 67 20 54 0a 09 20 20 20 20 57 R, tag T.. W
6720: 48 45 52 45 20 20 52 2e 72 69 64 20 69 6e 20 24 HERE R.rid in $
6730: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 theset.. AND
6740: 20 20 20 54 2e 72 65 76 20 3d 20 52 2e 72 69 64 T.rev = R.rid
6750: 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 .."] {.. lapp
6760: 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 end dependencies
6770: 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64 5d ([list rev $rid]
6780: 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 ) [list sym::tag
6790: 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72 $child]..}..for
67a0: 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 7d each {rid child}
67b0: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 [state run "..
67c0: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c SELECT R.rid,
67d0: 20 42 2e 62 69 64 0a 09 20 20 20 20 46 52 4f 4d B.bid.. FROM
67e0: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 62 revision R, b
67f0: 72 61 6e 63 68 20 42 0a 09 20 20 20 20 57 48 45 ranch B.. WHE
6800: 52 45 20 20 52 2e 72 69 64 20 69 6e 20 24 74 68 RE R.rid in $th
6810: 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 eset.. AND
6820: 20 42 2e 72 6f 6f 74 20 3d 20 52 2e 72 69 64 0a B.root = R.rid.
6830: 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 ."] {.. lappe
6840: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 nd dependencies(
6850: 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64 5d 29 [list rev $rid])
6860: 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e [list sym::bran
6870: 63 68 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 72 ch $child]..}..r
6880: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 eturn. }..
6890: 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 # var(dv) = dic
68a0: 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 t (item -> list
68b0: 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d (item)), item =
68c0: 20 6c 69 73 74 20 28 74 79 70 65 20 69 64 29 0a list (type id).
68d0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 70 typemethod p
68e0: 72 65 64 65 63 65 73 73 6f 72 73 20 7b 64 76 20 redecessors {dv
68f0: 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 revisions} {..up
6900: 76 61 72 20 31 20 24 64 76 20 64 65 70 65 6e 64 var 1 $dv depend
6910: 65 6e 63 69 65 73 0a 09 73 65 74 20 74 68 65 73 encies..set thes
6920: 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 et ('[join $revi
6930: 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a sions {','}]')..
6940: 09 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 .# The following
6950: 20 63 61 73 65 73 20 73 70 65 63 69 66 79 20 77 cases specify w
6960: 68 65 6e 20 61 20 72 65 76 69 73 69 6f 6e 20 50 hen a revision P
6970: 20 69 73 20 61 0a 09 23 20 70 72 65 64 65 63 65 is a..# predece
6980: 73 73 6f 72 20 6f 66 20 61 20 72 65 76 69 73 69 ssor of a revisi
6990: 6f 6e 20 52 2e 20 45 61 63 68 20 6f 66 20 74 68 on R. Each of th
69a0: 65 20 63 61 73 65 73 20 74 72 61 6e 73 6c 61 74 e cases translat
69b0: 65 73 0a 09 23 20 69 6e 74 6f 20 6f 6e 65 20 6f es..# into one o
69c0: 66 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 6f f the branches o
69d0: 66 20 74 68 65 20 53 51 4c 20 55 4e 49 4f 4e 20 f the SQL UNION
69e0: 63 6f 6d 69 6e 67 20 62 65 6c 6f 77 2e 0a 09 23 coming below...#
69f0: 0a 09 23 20 28 31 29 20 54 68 65 20 69 6d 6d 65 ..# (1) The imme
6a00: 64 69 61 74 65 20 70 61 72 65 6e 74 20 52 2e 70 diate parent R.p
6a10: 61 72 65 6e 74 20 6f 66 20 52 20 69 73 20 61 20 arent of R is a
6a20: 70 72 65 64 65 63 65 73 73 6f 72 20 6f 66 0a 09 predecessor of..
6a30: 23 20 20 20 20 20 52 2e 20 4e 4f 54 45 3a 20 54 # R. NOTE: T
6a40: 68 69 73 20 69 73 20 74 72 75 65 20 66 6f 72 20 his is true for
6a50: 52 20 65 69 74 68 65 72 20 70 72 69 6d 61 72 79 R either primary
6a60: 20 6f 72 20 73 65 63 6f 6e 64 61 72 79 0a 09 23 or secondary..#
6a70: 20 20 20 20 20 63 68 69 6c 64 20 6f 66 20 50 2e child of P.
6a80: 20 49 74 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 It not necessar
6a90: 79 20 74 6f 20 64 69 73 74 69 6e 67 75 69 73 68 y to distinguish
6aa0: 20 74 68 65 20 74 77 6f 0a 09 23 20 20 20 20 20 the two..#
6ab0: 63 61 73 65 73 2c 20 69 6e 20 63 6f 6e 74 72 61 cases, in contra
6ac0: 73 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 72 st to the code r
6ad0: 65 74 72 69 65 76 69 6e 67 20 74 68 65 20 73 75 etrieving the su
6ae0: 63 63 65 73 73 6f 72 0a 09 23 20 20 20 20 20 69 ccessor..# i
6af0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 09 23 0a 09 nformation...#..
6b00: 23 20 28 32 29 20 54 68 65 20 63 6f 6d 70 6c 65 # (2) The comple
6b10: 6d 65 6e 74 20 6f 66 20 73 75 63 63 65 73 73 6f ment of successo
6b20: 72 20 63 61 73 65 20 28 33 29 2e 20 54 68 65 20 r case (3). The
6b30: 74 72 75 6e 6b 20 72 6f 6f 74 20 69 73 0a 09 23 trunk root is..#
6b40: 20 20 20 20 20 61 20 70 72 65 64 65 63 65 73 73 a predecess
6b50: 6f 72 20 6f 66 20 61 20 4e 54 44 42 20 72 6f 6f or of a NTDB roo
6b60: 74 2e 20 52 45 4d 4f 56 45 44 2e 20 53 65 65 20 t. REMOVED. See
6b70: 27 73 75 63 63 65 73 73 6f 72 73 27 0a 09 23 20 'successors'..#
6b80: 20 20 20 20 66 6f 72 20 74 68 65 20 65 78 70 6c for the expl
6b90: 61 6e 61 74 69 6f 6e 2e 0a 09 23 0a 09 23 20 28 anation...#..# (
6ba0: 33 29 20 54 68 65 20 63 6f 6d 70 6c 65 6d 65 6e 3) The complemen
6bb0: 74 20 6f 66 20 73 75 63 63 65 73 73 6f 72 20 63 t of successor c
6bc0: 61 73 65 20 28 34 29 2e 20 54 68 65 20 6c 61 73 ase (4). The las
6bd0: 74 20 4e 54 44 42 0a 09 23 20 20 20 20 20 72 65 t NTDB..# re
6be0: 76 69 73 69 6f 6e 20 62 65 6c 6f 6e 67 69 6e 67 vision belonging
6bf0: 20 74 6f 20 74 68 65 20 74 72 75 6e 6b 20 69 73 to the trunk is
6c00: 20 61 20 70 72 65 64 65 63 65 73 73 6f 72 20 6f a predecessor o
6c10: 66 20 74 68 65 0a 09 23 20 20 20 20 20 70 72 69 f the..# pri
6c20: 6d 61 72 79 20 63 68 69 6c 64 20 6f 66 20 74 68 mary child of th
6c30: 65 20 74 72 75 6e 6b 20 72 6f 6f 74 20 28 54 68 e trunk root (Th
6c40: 65 20 27 31 2e 32 27 20 72 65 76 69 73 69 6f 6e e '1.2' revision
6c50: 29 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 )....foreach {ri
6c60: 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 d parent} [state
6c70: 20 72 75 6e 20 22 0a 20 20 20 2d 2d 20 28 31 29 run ". -- (1)
6c80: 20 50 72 69 6d 61 72 79 20 70 61 72 65 6e 74 2c Primary parent,
6c90: 20 63 61 6e 20 62 65 20 69 6e 20 64 69 66 66 65 can be in diffe
6ca0: 72 65 6e 74 20 4c 4f 44 20 66 6f 72 20 66 69 72 rent LOD for fir
6cb0: 73 74 20 69 6e 20 61 20 62 72 61 6e 63 68 0a 09 st in a branch..
6cc0: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 SELECT R.rid
6cd0: 2c 20 52 2e 70 61 72 65 6e 74 0a 09 20 20 20 20 , R.parent..
6ce0: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 FROM revision
6cf0: 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e R.. WHERE R.
6d00: 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 rid IN $theset
6d10: 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 -- Restrict
6d20: 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 to revisions of
6d30: 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 interest.. A
6d40: 4e 44 20 20 20 20 52 2e 70 61 72 65 6e 74 20 49 ND R.parent I
6d50: 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d 20 S NOT NULL --
6d60: 48 61 73 20 70 72 69 6d 61 72 79 20 70 61 72 65 Has primary pare
6d70: 6e 74 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 nt. UNION.
6d80: 20 2d 2d 20 28 33 29 20 4c 61 73 74 20 4e 54 44 -- (3) Last NTD
6d90: 42 20 6f 6e 20 74 72 75 6e 6b 20 69 73 20 70 72 B on trunk is pr
6da0: 65 64 65 63 65 73 73 6f 72 20 6f 66 20 63 68 69 edecessor of chi
6db0: 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 ld of trunk root
6dc0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 .. SELECT R.r
6dd0: 69 64 2c 20 52 41 2e 64 62 70 61 72 65 6e 74 0a id, RA.dbparent.
6de0: 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 . FROM revi
6df0: 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e sion R, revision
6e00: 20 52 41 0a 09 20 20 20 20 57 48 45 52 45 20 20 RA.. WHERE
6e10: 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 R.rid IN $theset
6e20: 20 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 -- Rest
6e30: 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e rict to revision
6e40: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 s of interest..
6e50: 20 20 20 41 4e 44 20 20 20 20 4e 4f 54 20 52 2e AND NOT R.
6e60: 69 73 64 65 66 61 75 6c 74 20 20 20 20 20 20 20 isdefault
6e70: 20 20 20 2d 2d 20 6e 6f 74 20 6f 6e 20 4e 54 44 -- not on NTD
6e80: 42 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e B.. AND R.
6e90: 70 61 72 65 6e 74 20 49 53 20 4e 4f 54 20 4e 55 parent IS NOT NU
6ea0: 4c 4c 20 20 20 20 20 2d 2d 20 77 68 69 63 68 20 LL -- which
6eb0: 61 72 65 20 6e 6f 74 20 72 6f 6f 74 0a 09 20 20 are not root..
6ec0: 20 20 41 4e 44 20 20 20 20 52 41 2e 72 69 64 20 AND RA.rid
6ed0: 3d 20 52 2e 70 61 72 65 6e 74 20 20 20 20 20 20 = R.parent
6ee0: 20 20 2d 2d 20 67 6f 20 74 6f 20 74 68 65 69 72 -- go to their
6ef0: 20 70 61 72 65 6e 74 0a 09 20 20 20 20 41 4e 44 parent.. AND
6f00: 20 20 20 20 52 41 2e 64 62 70 61 72 65 6e 74 20 RA.dbparent
6f10: 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 2d 2d 20 IS NOT NULL --
6f20: 77 68 69 63 68 20 68 61 73 20 74 6f 20 72 65 66 which has to ref
6f30: 65 72 20 74 6f 20 4e 54 44 42 27 73 20 72 6f 6f er to NTDB's roo
6f40: 74 0a 09 22 5d 20 7b 0a 09 20 20 20 20 23 20 43 t.."] {.. # C
6f50: 6f 6e 73 69 64 65 72 20 6d 6f 76 69 6e 67 20 74 onsider moving t
6f60: 68 69 73 20 74 6f 20 74 68 65 20 69 6e 74 65 67 his to the integ
6f70: 72 69 74 79 20 6d 6f 64 75 6c 65 2e 0a 09 20 20 rity module...
6f80: 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 integrity asse
6f90: 72 74 20 7b 24 72 69 64 20 21 3d 20 24 70 61 72 rt {$rid != $par
6fa0: 65 6e 74 7d 20 7b 52 65 76 69 73 69 6f 6e 20 24 ent} {Revision $
6fb0: 72 69 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 rid depends on i
6fc0: 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20 6c 61 70 tself.}.. lap
6fd0: 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 pend dependencie
6fe0: 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64 s([list rev $rid
6ff0: 5d 29 20 5b 6c 69 73 74 20 72 65 76 20 24 70 61 ]) [list rev $pa
7000: 72 65 6e 74 5d 0a 09 7d 0a 0a 09 23 20 54 68 65 rent]..}...# The
7010: 20 72 65 76 69 73 69 6f 6e 73 20 77 68 69 63 68 revisions which
7020: 20 61 72 65 20 74 68 65 20 66 69 72 73 74 20 6f are the first o
7030: 6e 20 61 20 62 72 61 6e 63 68 20 68 61 76 65 20 n a branch have
7040: 74 68 61 74 0a 09 23 20 62 72 61 6e 63 68 20 61 that..# branch a
7050: 73 20 74 68 65 69 72 20 70 72 65 64 65 63 65 73 s their predeces
7060: 73 6f 72 2e 20 4e 6f 74 65 20 74 68 61 74 20 72 sor. Note that r
7070: 65 76 69 73 69 6f 6e 73 20 63 61 6e 6e 6f 74 20 evisions cannot
7080: 62 65 0a 09 23 20 6f 6e 20 74 61 67 73 20 69 6e be..# on tags in
7090: 20 74 68 65 20 73 61 6d 65 20 6d 61 6e 6e 65 72 the same manner
70a0: 2c 20 73 6f 20 74 61 67 73 20 63 61 6e 6e 6f 74 , so tags cannot
70b0: 20 62 65 20 70 72 65 64 65 63 65 73 73 6f 72 73 be predecessors
70c0: 0a 09 23 20 6f 66 20 72 65 76 69 73 69 6f 6e 73 ..# of revisions
70d0: 2e 20 54 68 69 73 20 63 6f 6d 70 6c 65 6d 65 6e . This complemen
70e0: 74 73 20 74 68 61 74 20 74 68 65 79 20 68 61 76 ts that they hav
70f0: 65 20 6e 6f 20 73 75 63 63 65 73 73 6f 72 73 0a e no successors.
7100: 09 23 20 28 53 65 65 20 73 79 6d 3a 3a 74 61 67 .# (See sym::tag
7110: 2f 73 75 63 63 65 73 73 6f 72 73 29 2e 0a 0a 09 /successors)....
7120: 66 6f 72 65 61 63 68 20 7b 72 69 64 20 70 61 72 foreach {rid par
7130: 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 ent} [state run
7140: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e ".. SELECT R.
7150: 72 69 64 20 42 2e 62 69 64 0a 09 20 20 20 20 46 rid B.bid.. F
7160: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 ROM revision R
7170: 2c 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20 20 , branch B..
7180: 57 48 45 52 45 20 20 52 2e 72 69 64 20 49 4e 20 WHERE R.rid IN
7190: 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 $theset.. AND
71a0: 20 20 20 20 42 2e 66 69 72 73 74 20 3d 20 52 2e B.first = R.
71b0: 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c rid.."] {.. l
71c0: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 append dependenc
71d0: 69 65 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72 ies([list rev $r
71e0: 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a id]) [list sym::
71f0: 62 72 61 6e 63 68 20 24 70 61 72 65 6e 74 5d 0a branch $parent].
7200: 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d .}..return. }
7210: 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23 .}..# # ## ### #
7220: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 #### ######## ##
7230: 23 23 23 23 23 23 23 23 23 23 23 20 23 23 23 23 ########### ####
7240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
7250: 23 0a 23 23 20 48 65 6c 70 65 72 20 73 69 6e 67 #.## Helper sing
7260: 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20 leton. Commands
7270: 66 6f 72 20 74 61 67 20 73 79 6d 62 6f 6c 20 63 for tag symbol c
7280: 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e 69 74 hangesets...snit
7290: 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f 73 ::type ::vc::fos
72a0: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 sil::import::cvs
72b0: 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a ::project::rev::
72c0: 73 79 6d 3a 3a 74 61 67 20 7b 0a 20 20 20 20 74 sym::tag {. t
72d0: 79 70 65 6d 65 74 68 6f 64 20 62 79 72 65 76 69 ypemethod byrevi
72e0: 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75 72 6e sion {} { return
72f0: 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 0 }. typemet
7300: 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 20 7b hod bysymbol {
7310: 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a 20 } { return 1 }.
7320: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73 typemethod is
7330: 74 61 67 20 20 20 20 20 20 7b 7d 20 7b 20 72 65 tag {} { re
7340: 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 79 70 turn 1 }. typ
7350: 65 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63 68 emethod isbranch
7360: 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 {} { return 0
7370: 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 }.. # result
7380: 20 3d 20 6c 69 73 74 20 28 6d 69 6e 74 69 6d 65 = list (mintime
7390: 2c 20 6d 61 78 74 69 6d 65 29 0a 20 20 20 20 74 , maxtime). t
73a0: 79 70 65 6d 65 74 68 6f 64 20 74 69 6d 65 72 61 ypemethod timera
73b0: 6e 67 65 20 7b 74 61 67 73 7d 20 7b 0a 09 23 20 nge {tags} {..#
73c0: 54 68 65 20 72 61 6e 67 65 20 69 73 20 64 65 66 The range is def
73d0: 69 6e 65 64 20 61 73 20 74 68 65 20 72 61 6e 67 ined as the rang
73e0: 65 20 6f 66 20 74 68 65 20 72 65 76 69 73 69 6f e of the revisio
73f0: 6e 73 20 74 68 65 20 74 61 67 73 0a 09 23 20 61 ns the tags..# a
7400: 72 65 20 61 74 74 61 63 68 65 64 20 74 6f 2e 0a re attached to..
7410: 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b ..set theset ('[
7420: 6a 6f 69 6e 20 24 74 61 67 73 20 7b 27 2c 27 7d join $tags {','}
7430: 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61 ]')..return [sta
7440: 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 te run ".. SE
7450: 4c 45 43 54 20 4d 49 4e 28 52 2e 64 61 74 65 29 LECT MIN(R.date)
7460: 2c 20 4d 41 58 28 52 2e 64 61 74 65 29 0a 09 20 , MAX(R.date)..
7470: 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e FROM revision
7480: 20 52 2c 20 74 61 67 20 54 0a 09 20 20 20 20 57 R, tag T.. W
7490: 48 45 52 45 20 54 2e 74 69 64 20 49 4e 20 24 74 HERE T.tid IN $t
74a0: 68 65 73 65 74 0a 20 20 20 20 20 20 20 20 20 20 heset.
74b0: 20 20 41 4e 44 20 20 20 52 2e 72 69 64 20 3d 20 AND R.rid =
74c0: 54 2e 72 65 76 0a 09 22 5d 0a 20 20 20 20 7d 0a T.rev.."]. }.
74d0: 0a 20 20 20 20 23 20 76 61 72 28 64 76 29 20 3d . # var(dv) =
74e0: 20 64 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c dict (item -> l
74f0: 69 73 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65 ist (item)), ite
7500: 6d 20 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20 m = list (type
7510: 69 64 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 id). typemeth
7520: 6f 64 20 73 75 63 63 65 73 73 6f 72 73 20 7b 64 od successors {d
7530: 76 20 74 61 67 73 7d 20 7b 0a 09 23 20 54 61 67 v tags} {..# Tag
7540: 73 20 68 61 76 65 20 6e 6f 20 73 75 63 63 65 73 s have no succes
7550: 73 6f 72 73 2e 0a 09 72 65 74 75 72 6e 0a 20 20 sors...return.
7560: 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64 }.. # var(d
7570: 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20 v) = dict (item
7580: 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c -> list (item)),
7590: 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 item = list (t
75a0: 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 70 65 ype id). type
75b0: 6d 65 74 68 6f 64 20 70 72 65 64 65 63 65 73 73 method predecess
75c0: 6f 72 73 20 7b 64 76 20 74 61 67 73 7d 20 7b 0a ors {dv tags} {.
75d0: 09 23 20 54 68 65 20 70 72 65 64 65 63 65 73 73 .# The predecess
75e0: 6f 72 73 20 6f 66 20 61 20 74 61 67 20 61 72 65 ors of a tag are
75f0: 20 61 6c 6c 20 74 68 65 20 72 65 76 69 73 69 6f all the revisio
7600: 6e 73 20 74 68 65 20 74 61 67 73 20 61 72 65 0a ns the tags are.
7610: 09 23 20 61 74 74 61 63 68 65 64 20 74 6f 2c 20 .# attached to,
7620: 61 73 20 77 65 6c 6c 20 61 73 20 61 6c 6c 20 74 as well as all t
7630: 68 65 20 62 72 61 6e 63 68 65 73 20 6f 72 20 74 he branches or t
7640: 61 67 73 20 77 68 69 63 68 20 61 72 65 0a 09 23 ags which are..#
7650: 20 74 68 65 69 72 20 70 72 65 66 65 72 65 64 20 their prefered
7660: 70 61 72 65 6e 74 73 2e 0a 0a 09 73 65 74 20 74 parents....set t
7670: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 74 heset ('[join $t
7680: 61 67 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66 6f ags {','}]')..fo
7690: 72 65 61 63 68 20 7b 74 69 64 20 70 61 72 65 6e reach {tid paren
76a0: 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a t} [state run ".
76b0: 09 20 20 20 20 53 45 4c 45 43 54 20 54 2e 74 69 . SELECT T.ti
76c0: 64 2c 20 52 2e 72 69 64 0a 09 20 20 20 20 46 52 d, R.rid.. FR
76d0: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c OM revision R,
76e0: 20 74 61 67 20 54 0a 09 20 20 20 20 57 48 45 52 tag T.. WHER
76f0: 45 20 20 54 2e 74 69 64 20 49 4e 20 24 74 68 65 E T.tid IN $the
7700: 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 set.. AND
7710: 54 2e 72 65 76 20 3d 20 52 2e 72 69 64 0a 09 22 T.rev = R.rid.."
7720: 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 ] {.. lappend
7730: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c dependencies([l
7740: 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 74 69 ist sym::tag $ti
7750: 64 5d 29 20 5b 6c 69 73 74 20 72 65 76 20 24 70 d]) [list rev $p
7760: 61 72 65 6e 74 5d 0a 09 7d 0a 0a 09 66 6f 72 65 arent]..}...fore
7770: 61 63 68 20 7b 74 69 64 20 70 61 72 65 6e 74 7d ach {tid parent}
7780: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 [state run "..
7790: 20 20 20 53 45 4c 45 43 54 20 54 2e 74 69 64 2c SELECT T.tid,
77a0: 20 42 2e 62 69 64 0a 09 20 20 20 20 46 52 4f 4d B.bid.. FROM
77b0: 20 20 20 74 61 67 20 54 2c 20 62 72 61 6e 63 68 tag T, branch
77c0: 20 42 2c 20 70 72 65 66 65 72 65 64 70 61 72 65 B, preferedpare
77d0: 6e 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 20 nt P.. WHERE
77e0: 20 54 2e 74 69 64 20 49 4e 20 24 74 68 65 73 65 T.tid IN $these
77f0: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 54 2e t.. AND T.
7800: 73 69 64 20 3d 20 50 2e 73 69 64 0a 09 20 20 20 sid = P.sid..
7810: 20 41 4e 44 20 20 20 20 50 2e 70 69 64 20 3d 20 AND P.pid =
7820: 42 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 B.sid.."] {..
7830: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 lappend depende
7840: 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a ncies([list sym:
7850: 3a 74 61 67 20 24 74 69 64 5d 29 20 5b 6c 69 73 :tag $tid]) [lis
7860: 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 70 t sym::branch $p
7870: 61 72 65 6e 74 5d 0a 09 7d 0a 0a 09 66 6f 72 65 arent]..}...fore
7880: 61 63 68 20 7b 74 69 64 20 70 61 72 65 6e 74 7d ach {tid parent}
7890: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 [state run "..
78a0: 20 20 20 53 45 4c 45 43 54 20 54 2e 74 69 64 2c SELECT T.tid,
78b0: 20 54 58 2e 74 69 64 0a 09 20 20 20 20 46 52 4f TX.tid.. FRO
78c0: 4d 20 20 20 74 61 67 20 54 2c 20 74 61 67 20 54 M tag T, tag T
78d0: 58 2c 20 70 72 65 66 65 72 65 64 70 61 72 65 6e X, preferedparen
78e0: 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 20 20 t P.. WHERE
78f0: 54 2e 74 69 64 20 49 4e 20 24 74 68 65 73 65 74 T.tid IN $theset
7900: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 54 2e 73 .. AND T.s
7910: 69 64 20 3d 20 50 2e 73 69 64 0a 09 20 20 20 20 id = P.sid..
7920: 41 4e 44 20 20 20 20 50 2e 70 69 64 20 3d 20 54 AND P.pid = T
7930: 58 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 X.sid.."] {..
7940: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 lappend depende
7950: 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a ncies([list sym:
7960: 3a 74 61 67 20 24 74 69 64 5d 29 20 5b 6c 69 73 :tag $tid]) [lis
7970: 74 20 73 79 6d 3a 3a 74 61 67 20 24 70 61 72 65 t sym::tag $pare
7980: 6e 74 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 nt]..}..return.
7990: 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 }.}..# # ## #
79a0: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 ## ##### #######
79b0: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 # #############
79c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
79d0: 23 23 23 23 23 0a 23 23 20 48 65 6c 70 65 72 20 #####.## Helper
79e0: 73 69 6e 67 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 singleton. Comma
79f0: 6e 64 73 20 66 6f 72 20 62 72 61 6e 63 68 20 73 nds for branch s
7a00: 79 6d 62 6f 6c 20 63 68 61 6e 67 65 73 65 74 73 ymbol changesets
7a10: 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20 3a 3a ...snit::type ::
7a20: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f vc::fossil::impo
7a30: 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 rt::cvs::project
7a40: 3a 3a 72 65 76 3a 3a 73 79 6d 3a 3a 62 72 61 6e ::rev::sym::bran
7a50: 63 68 20 7b 0a 20 20 20 20 74 79 70 65 6d 65 74 ch {. typemet
7a60: 68 6f 64 20 62 79 72 65 76 69 73 69 6f 6e 20 7b hod byrevision {
7a70: 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 } { return 0 }.
7a80: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 typemethod by
7a90: 73 79 6d 62 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 symbol {} { re
7aa0: 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 79 70 turn 1 }. typ
7ab0: 65 6d 65 74 68 6f 64 20 69 73 74 61 67 20 20 20 emethod istag
7ac0: 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 {} { return 0
7ad0: 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f }. typemetho
7ae0: 64 20 69 73 62 72 61 6e 63 68 20 20 20 7b 7d 20 d isbranch {}
7af0: 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a 0a 20 20 { return 1 }..
7b00: 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73 # result = lis
7b10: 74 20 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74 t (mintime, maxt
7b20: 69 6d 65 29 0a 20 20 20 20 74 79 70 65 6d 65 74 ime). typemet
7b30: 68 6f 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 62 hod timerange {b
7b40: 72 61 6e 63 68 65 73 7d 20 7b 0a 09 23 20 54 68 ranches} {..# Th
7b50: 65 20 72 61 6e 67 65 20 6f 66 20 61 20 62 72 61 e range of a bra
7b60: 6e 63 68 20 69 73 20 64 65 66 69 6e 65 64 20 61 nch is defined a
7b70: 73 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 74 s the range of t
7b80: 68 65 0a 09 23 20 72 65 76 69 73 69 6f 6e 73 20 he..# revisions
7b90: 74 68 65 20 62 72 61 6e 63 68 65 73 20 61 72 65 the branches are
7ba0: 20 73 70 61 77 6e 65 64 20 62 79 2e 20 4e 4f 54 spawned by. NOT
7bb0: 45 20 68 6f 77 65 76 65 72 20 74 68 61 74 20 74 E however that t
7bc0: 68 65 0a 09 23 20 62 72 61 6e 63 68 65 73 20 61 he..# branches a
7bd0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 ssociated with a
7be0: 20 64 65 74 61 63 68 65 64 20 4e 54 44 42 20 77 detached NTDB w
7bf0: 69 6c 6c 20 68 61 76 65 20 6e 6f 20 72 6f 6f 74 ill have no root
7c00: 0a 09 23 20 73 70 61 77 6e 69 6e 67 20 74 68 65 ..# spawning the
7c10: 6d 2c 20 68 65 6e 63 65 20 74 68 65 79 20 68 61 m, hence they ha
7c20: 76 65 20 6e 6f 20 72 65 61 6c 20 74 69 6d 65 72 ve no real timer
7c30: 61 6e 67 65 20 61 6e 79 0a 09 23 20 6c 6f 6e 67 ange any..# long
7c40: 65 72 2e 20 42 79 20 75 73 69 6e 67 20 30 20 77 er. By using 0 w
7c50: 65 20 70 75 74 20 74 68 65 6d 20 69 6e 20 66 72 e put them in fr
7c60: 6f 6e 74 20 6f 66 20 65 76 65 72 79 74 68 69 6e ont of everythin
7c70: 67 20 65 6c 73 65 2c 0a 09 23 20 61 73 20 74 68 g else,..# as th
7c80: 65 79 20 6c 6f 67 69 63 61 6c 6c 79 20 61 72 65 ey logically are
7c90: 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 ....set theset (
7ca0: 27 5b 6a 6f 69 6e 20 24 62 72 61 6e 63 68 65 73 '[join $branches
7cb0: 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 {','}]')..retur
7cc0: 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 n [state run "..
7cd0: 20 20 20 20 53 45 4c 45 43 54 20 49 46 4e 55 4c SELECT IFNUL
7ce0: 4c 28 4d 49 4e 28 52 2e 64 61 74 65 29 2c 30 29 L(MIN(R.date),0)
7cf0: 2c 20 49 46 4e 55 4c 4c 28 4d 41 58 28 52 2e 64 , IFNULL(MAX(R.d
7d00: 61 74 65 29 2c 30 29 0a 09 20 20 20 20 46 52 4f ate),0).. FRO
7d10: 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 62 72 M revision R, br
7d20: 61 6e 63 68 20 42 0a 09 20 20 20 20 57 48 45 52 anch B.. WHER
7d30: 45 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 E B.bid IN $thes
7d40: 65 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 et. A
7d50: 4e 44 20 20 20 52 2e 72 69 64 20 3d 20 42 2e 72 ND R.rid = B.r
7d60: 6f 6f 74 0a 09 22 5d 0a 20 20 20 20 7d 0a 0a 20 oot.."]. }..
7d70: 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 # var(dv) = d
7d80: 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 ict (item -> lis
7d90: 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 t (item)), item
7da0: 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69 64 = list (type id
7db0: 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 ). typemethod
7dc0: 20 73 75 63 63 65 73 73 6f 72 73 20 7b 64 76 20 successors {dv
7dd0: 62 72 61 6e 63 68 65 73 7d 20 7b 0a 09 23 20 54 branches} {..# T
7de0: 68 65 20 66 69 72 73 74 20 72 65 76 69 73 69 6f he first revisio
7df0: 6e 20 63 6f 6d 6d 69 74 74 65 64 20 6f 6e 20 61 n committed on a
7e00: 20 62 72 61 6e 63 68 2c 20 61 6e 64 20 61 6c 6c branch, and all
7e10: 20 62 72 61 6e 63 68 65 73 0a 09 23 20 61 6e 64 branches..# and
7e20: 20 74 61 67 73 20 77 68 69 63 68 20 68 61 76 65 tags which have
7e30: 20 69 74 20 61 73 20 74 68 65 69 72 20 70 72 65 it as their pre
7e40: 66 65 72 65 64 20 70 61 72 65 6e 74 20 61 72 65 fered parent are
7e50: 20 74 68 65 0a 09 23 20 73 75 63 63 65 73 73 6f the..# successo
7e60: 72 73 20 6f 66 20 61 20 62 72 61 6e 63 68 2e 0a rs of a branch..
7e70: 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b ..set theset ('[
7e80: 6a 6f 69 6e 20 24 62 72 61 6e 63 68 65 73 20 7b join $branches {
7e90: 27 2c 27 7d 5d 27 29 0a 09 66 6f 72 65 61 63 68 ','}]')..foreach
7ea0: 20 7b 62 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 {bid child} [st
7eb0: 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 ate run ".. S
7ec0: 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 52 2e 72 ELECT B.bid, R.r
7ed0: 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 id.. FROM r
7ee0: 65 76 69 73 69 6f 6e 20 52 2c 20 62 72 61 6e 63 evision R, branc
7ef0: 68 20 42 0a 09 20 20 20 20 57 48 45 52 45 20 20 h B.. WHERE
7f00: 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65 74 B.bid IN $theset
7f10: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 66 .. AND B.f
7f20: 69 72 73 74 20 3d 20 52 2e 72 69 64 0a 09 22 5d irst = R.rid.."]
7f30: 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 {.. lappend
7f40: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 dependencies([li
7f50: 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 62 69 64 st sym::tag $bid
7f60: 5d 29 20 5b 6c 69 73 74 20 72 65 76 20 24 63 68 ]) [list rev $ch
7f70: 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 ild]..}..foreach
7f80: 20 7b 62 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 {bid child} [st
7f90: 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 ate run ".. S
7fa0: 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 42 58 2e ELECT B.bid, BX.
7fb0: 62 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 bid.. FROM
7fc0: 62 72 61 6e 63 68 20 42 2c 20 62 72 61 6e 63 68 branch B, branch
7fd0: 20 42 58 2c 20 70 72 65 66 65 72 65 64 70 61 72 BX, preferedpar
7fe0: 65 6e 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 ent P.. WHERE
7ff0: 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 B.bid IN $thes
8000: 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 et.. AND B
8010: 2e 73 69 64 20 3d 20 50 2e 70 69 64 0a 09 20 20 .sid = P.pid..
8020: 20 20 41 4e 44 20 20 20 20 42 58 2e 73 69 64 20 AND BX.sid
8030: 3d 20 50 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 20 = P.sid.."] {..
8040: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e lappend depen
8050: 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 dencies([list sy
8060: 6d 3a 3a 74 61 67 20 24 62 69 64 5d 29 20 5b 6c m::tag $bid]) [l
8070: 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 ist sym::branch
8080: 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65 $child]..}..fore
8090: 61 63 68 20 7b 62 69 64 20 63 68 69 6c 64 7d 20 ach {bid child}
80a0: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 [state run "..
80b0: 20 20 53 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 SELECT B.bid,
80c0: 54 2e 74 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 T.tid.. FROM
80d0: 20 20 62 72 61 6e 63 68 20 42 2c 20 74 61 67 20 branch B, tag
80e0: 54 2c 20 70 72 65 66 65 72 65 64 70 61 72 65 6e T, preferedparen
80f0: 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 20 20 t P.. WHERE
8100: 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65 74 B.bid IN $theset
8110: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 73 .. AND B.s
8120: 69 64 20 3d 20 50 2e 70 69 64 0a 09 20 20 20 20 id = P.pid..
8130: 41 4e 44 20 20 20 20 54 2e 73 69 64 20 3d 20 50 AND T.sid = P
8140: 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 .sid.."] {..
8150: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e lappend dependen
8160: 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a cies([list sym::
8170: 74 61 67 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 tag $bid]) [list
8180: 20 73 79 6d 3a 3a 74 61 67 20 24 63 68 69 6c 64 sym::tag $child
8190: 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 ]..}..return.
81a0: 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76 }.. # var(dv
81b0: 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d ) = dict (item -
81c0: 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c 20 > list (item)),
81d0: 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 79 item = list (ty
81e0: 70 65 20 69 64 29 0a 20 20 20 20 74 79 70 65 6d pe id). typem
81f0: 65 74 68 6f 64 20 70 72 65 64 65 63 65 73 73 6f ethod predecesso
8200: 72 73 20 7b 64 76 20 62 72 61 6e 63 68 65 73 7d rs {dv branches}
8210: 20 7b 0a 09 23 20 54 68 65 20 70 72 65 64 65 63 {..# The predec
8220: 65 73 73 6f 72 73 20 6f 66 20 61 20 62 72 61 6e essors of a bran
8230: 63 68 20 61 72 65 20 61 6c 6c 20 74 68 65 20 72 ch are all the r
8240: 65 76 69 73 69 6f 6e 73 20 74 68 65 0a 09 23 20 evisions the..#
8250: 62 72 61 6e 63 68 65 73 20 61 72 65 20 73 70 61 branches are spa
8260: 77 6e 65 64 20 66 72 6f 6d 2c 20 61 73 20 77 65 wned from, as we
8270: 6c 6c 20 61 73 20 61 6c 6c 20 74 68 65 20 62 72 ll as all the br
8280: 61 6e 63 68 65 73 20 6f 72 0a 09 23 20 74 61 67 anches or..# tag
8290: 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65 69 s which are thei
82a0: 72 20 70 72 65 66 65 72 65 64 20 70 61 72 65 6e r prefered paren
82b0: 74 73 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74 ts....set theset
82c0: 20 28 27 5b 6a 6f 69 6e 20 24 74 61 67 73 20 7b ('[join $tags {
82d0: 27 2c 27 7d 5d 27 29 0a 09 66 6f 72 65 61 63 68 ','}]')..foreach
82e0: 20 7b 62 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 {bid parent} [s
82f0: 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 tate run "..
8300: 53 45 4c 45 43 54 20 42 2e 42 69 64 2c 20 52 2e SELECT B.Bid, R.
8310: 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 rid.. FROM
8320: 72 65 76 69 73 69 6f 6e 20 52 2c 20 62 72 61 6e revision R, bran
8330: 63 68 20 42 0a 09 20 20 20 20 57 48 45 52 45 20 ch B.. WHERE
8340: 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65 B.bid IN $these
8350: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e t.. AND B.
8360: 72 6f 6f 74 20 3d 20 52 2e 72 69 64 0a 09 22 5d root = R.rid.."]
8370: 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 {.. lappend
8380: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 dependencies([li
8390: 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 st sym::branch $
83a0: 62 69 64 5d 29 20 5b 6c 69 73 74 20 72 65 76 20 bid]) [list rev
83b0: 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 66 6f 72 $parent]..}..for
83c0: 65 61 63 68 20 7b 62 69 64 20 70 61 72 65 6e 74 each {bid parent
83d0: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 } [state run "..
83e0: 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62 69 64 SELECT B.bid
83f0: 2c 20 42 58 2e 62 69 64 0a 09 20 20 20 20 46 52 , BX.bid.. FR
8400: 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20 62 OM branch B, b
8410: 72 61 6e 63 68 20 42 58 2c 20 70 72 65 66 65 72 ranch BX, prefer
8420: 65 64 70 61 72 65 6e 74 20 50 0a 09 20 20 20 20 edparent P..
8430: 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20 WHERE B.bid IN
8440: 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 $theset.. AND
8450: 20 20 20 20 42 2e 73 69 64 20 3d 20 50 2e 73 69 B.sid = P.si
8460: 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e d.. AND P.
8470: 70 69 64 20 3d 20 42 58 2e 73 69 64 0a 09 22 5d pid = BX.sid.."]
8480: 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 {.. lappend
8490: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 dependencies([li
84a0: 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 st sym::branch $
84b0: 62 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a bid]) [list sym:
84c0: 3a 62 72 61 6e 63 68 20 24 70 61 72 65 6e 74 5d :branch $parent]
84d0: 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 ..}..foreach {bi
84e0: 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 d parent} [state
84f0: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 run ".. SELE
8500: 43 54 20 42 2e 62 69 64 2c 20 54 2e 74 69 64 0a CT B.bid, T.tid.
8510: 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e . FROM bran
8520: 63 68 20 42 2c 20 74 61 67 20 54 2c 20 70 72 65 ch B, tag T, pre
8530: 66 65 72 65 64 70 61 72 65 6e 74 20 50 0a 09 20 feredparent P..
8540: 20 20 20 57 48 45 52 45 20 20 42 2e 74 69 64 20 WHERE B.tid
8550: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 IN $theset..
8560: 41 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50 AND B.sid = P
8570: 2e 73 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 .sid.. AND
8580: 20 50 2e 70 69 64 20 3d 20 54 2e 73 69 64 0a 09 P.pid = T.sid..
8590: 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e "] {.. lappen
85a0: 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b d dependencies([
85b0: 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 list sym::branch
85c0: 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 $bid]) [list sy
85d0: 6d 3a 3a 74 61 67 20 24 70 61 72 65 6e 74 5d 0a m::tag $parent].
85e0: 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d .}..return. }
85f0: 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23 .. # # ## ###
8600: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 ##### ########
8610: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 20 #############.
8620: 20 20 23 23 20 43 6f 6e 66 69 67 75 72 61 74 69 ## Configurati
8630: 6f 6e 0a 0a 20 20 20 20 70 72 61 67 6d 61 20 2d on.. pragma -
8640: 68 61 73 69 6e 73 74 61 6e 63 65 73 20 20 20 6e hasinstances n
8650: 6f 20 3b 20 23 20 73 69 6e 67 6c 65 74 6f 6e 0a o ; # singleton.
8660: 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 74 pragma -hast
8670: 79 70 65 69 6e 66 6f 20 20 20 20 6e 6f 20 3b 20 ypeinfo no ;
8680: 23 20 6e 6f 20 69 6e 74 72 6f 73 70 65 63 74 69 # no introspecti
8690: 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68 on. pragma -h
86a0: 61 73 74 79 70 65 64 65 73 74 72 6f 79 20 6e 6f astypedestroy no
86b0: 20 3b 20 23 20 69 6d 6d 6f 72 74 61 6c 0a 7d 0a ; # immortal.}.
86c0: 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 .# # ## ### ####
86d0: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 # ######## #####
86e0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
86f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 ##############.#
8700: 23 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61 #..namespace eva
8710: 6c 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a l ::vc::fossil::
8720: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f import::cvs::pro
8730: 6a 65 63 74 20 7b 0a 20 20 20 20 6e 61 6d 65 73 ject {. names
8740: 70 61 63 65 20 65 78 70 6f 72 74 20 72 65 76 0a pace export rev.
8750: 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 65 76 namespace ev
8760: 61 6c 20 72 65 76 20 7b 0a 09 6e 61 6d 65 73 70 al rev {..namesp
8770: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a ace import ::vc:
8780: 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a :fossil::import:
8790: 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09 6e 61 6d :cvs::state..nam
87a0: 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a espace import ::
87b0: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f vc::fossil::impo
87c0: 72 74 3a 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69 rt::cvs::integri
87d0: 74 79 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d ty..namespace im
87e0: 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 port ::vc::tools
87f0: 3a 3a 6d 69 73 63 3a 3a 2a 0a 09 6e 61 6d 65 73 ::misc::*..names
8800: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 pace import ::vc
8810: 3a 3a 74 6f 6f 6c 73 3a 3a 74 72 6f 75 62 6c 65 ::tools::trouble
8820: 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f ..namespace impo
8830: 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a rt ::vc::tools::
8840: 6c 6f 67 0a 09 6c 6f 67 20 72 65 67 69 73 74 65 log..log registe
8850: 72 20 63 73 65 74 73 0a 0a 09 23 20 53 65 74 20 r csets...# Set
8860: 75 70 20 74 68 65 20 68 65 6c 70 65 72 20 73 69 up the helper si
8870: 6e 67 6c 65 74 6f 6e 73 0a 09 6e 61 6d 65 73 70 ngletons..namesp
8880: 61 63 65 20 65 76 61 6c 20 72 65 76 20 7b 0a 09 ace eval rev {..
8890: 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d namespace im
88a0: 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 port ::vc::fossi
88b0: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a l::import::cvs::
88c0: 73 74 61 74 65 0a 09 20 20 20 20 6e 61 6d 65 73 state.. names
88d0: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 pace import ::vc
88e0: 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 ::fossil::import
88f0: 3a 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 ::cvs::integrity
8900: 0a 09 7d 0a 09 6e 61 6d 65 73 70 61 63 65 20 65 ..}..namespace e
8910: 76 61 6c 20 73 79 6d 3a 3a 74 61 67 20 7b 0a 09 val sym::tag {..
8920: 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d namespace im
8930: 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 port ::vc::fossi
8940: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a l::import::cvs::
8950: 73 74 61 74 65 0a 09 20 20 20 20 6e 61 6d 65 73 state.. names
8960: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 pace import ::vc
8970: 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 ::fossil::import
8980: 3a 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 ::cvs::integrity
8990: 0a 09 7d 0a 09 6e 61 6d 65 73 70 61 63 65 20 65 ..}..namespace e
89a0: 76 61 6c 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 val sym::branch
89b0: 7b 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 {.. namespace
89c0: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f import ::vc::fo
89d0: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 ssil::import::cv
89e0: 73 3a 3a 73 74 61 74 65 0a 09 20 20 20 20 6e 61 s::state.. na
89f0: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a mespace import :
8a00: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 :vc::fossil::imp
8a10: 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e 74 65 67 72 ort::cvs::integr
8a20: 69 74 79 0a 09 7d 0a 20 20 20 20 7d 0a 7d 0a 0a ity..}. }.}..
8a30: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 # # ## ### #####
8a40: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 ######## ######
8a50: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 ####### ########
8a60: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 #############.##
8a70: 20 52 65 61 64 79 0a 0a 70 61 63 6b 61 67 65 20 Ready..package
8a80: 70 72 6f 76 69 64 65 20 76 63 3a 3a 66 6f 73 73 provide vc::foss
8a90: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a il::import::cvs:
8aa0: 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 20 31 2e :project::rev 1.
8ab0: 30 0a 72 65 74 75 72 6e 0a 0.return.