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 72 65 76 cstype srcid rev
05c0: 69 73 69 6f 6e 73 20 7b 74 68 65 69 64 20 7b 7d isions {theid {}
05d0: 7d 7d 20 7b 0a 09 69 66 20 7b 24 74 68 65 69 64 }} {..if {$theid
05e0: 20 6e 65 20 22 22 7d 20 7b 0a 09 20 20 20 20 73 ne ""} {.. s
05f0: 65 74 20 6d 79 69 64 20 24 74 68 65 69 64 0a 09 et myid $theid..
0600: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 73 65 } else {.. se
0610: 74 20 6d 79 69 64 20 5b 69 6e 63 72 20 6d 79 63 t myid [incr myc
0620: 6f 75 6e 74 65 72 5d 0a 09 7d 0a 0a 09 69 6e 74 ounter]..}...int
0630: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 5b egrity assert {[
0640: 69 6e 66 6f 20 65 78 69 73 74 73 20 6d 79 63 73 info exists mycs
0650: 74 79 70 65 28 24 63 73 74 79 70 65 29 5d 7d 20 type($cstype)]}
0660: 7b 42 61 64 20 63 68 61 6e 67 65 73 65 74 20 74 {Bad changeset t
0670: 79 70 65 20 27 24 63 73 74 79 70 65 27 2e 7d 0a ype '$cstype'.}.
0680: 0a 09 73 65 74 20 6d 79 70 72 6f 6a 65 63 74 20 ..set myproject
0690: 20 20 24 70 72 6f 6a 65 63 74 0a 09 73 65 74 20 $project..set
06a0: 6d 79 74 79 70 65 20 20 20 20 20 20 24 63 73 74 mytype $cst
06b0: 79 70 65 0a 09 73 65 74 20 6d 79 74 79 70 65 6f ype..set mytypeo
06c0: 62 6a 20 20 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 bj ::vc::fossi
06d0: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a l::import::cvs::
06e0: 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 24 7b project::rev::${
06f0: 63 73 74 79 70 65 7d 0a 09 73 65 74 20 6d 79 73 cstype}..set mys
0700: 72 63 69 64 09 24 73 72 63 69 64 0a 09 73 65 74 rcid.$srcid..set
0710: 20 6d 79 72 65 76 69 73 69 6f 6e 73 20 24 72 65 myrevisions $re
0720: 76 69 73 69 6f 6e 73 0a 09 73 65 74 20 6d 79 70 visions..set myp
0730: 6f 73 20 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 os {} ; #
0740: 43 6f 6d 6d 69 74 20 6c 6f 63 61 74 69 6f 6e 20 Commit location
0750: 69 73 20 6e 6f 74 20 6b 6e 6f 77 6e 20 79 65 74 is not known yet
0760: 2e 0a 0a 09 23 20 4b 65 65 70 20 74 72 61 63 6b ....# Keep track
0770: 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 of the generate
0780: 64 20 63 68 61 6e 67 65 73 65 74 73 20 61 6e 64 d changesets and
0790: 20 6f 66 20 74 68 65 20 69 6e 76 65 72 73 65 0a of the inverse.
07a0: 09 23 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 .# mapping from
07b0: 72 65 76 69 73 69 6f 6e 73 20 74 6f 20 74 68 65 revisions to the
07c0: 6d 2e 0a 09 6c 61 70 70 65 6e 64 20 6d 79 63 68 m...lappend mych
07d0: 61 6e 67 65 73 65 74 73 20 20 20 24 73 65 6c 66 angesets $self
07e0: 0a 09 73 65 74 20 20 20 20 20 6d 79 69 64 6d 61 ..set myidma
07f0: 70 28 24 6d 79 69 64 29 20 24 73 65 6c 66 0a 09 p($myid) $self..
0800: 66 6f 72 65 61 63 68 20 72 20 24 72 65 76 69 73 foreach r $revis
0810: 69 6f 6e 73 20 7b 0a 09 20 20 20 20 73 65 74 20 ions {.. set
0820: 6b 65 79 20 5b 6c 69 73 74 20 24 63 73 74 79 70 key [list $cstyp
0830: 65 20 24 69 64 5d 0a 09 20 20 20 20 73 65 74 20 e $id].. set
0840: 6d 79 72 65 76 6d 61 70 28 24 6b 65 79 29 20 24 myrevmap($key) $
0850: 73 65 6c 66 0a 09 20 20 20 20 6c 61 70 70 65 6e self.. lappen
0860: 64 20 6d 79 74 69 74 65 6d 73 20 24 6b 65 79 0a d mytitems $key.
0870: 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d .}..return. }
0880: 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 74 72 .. method str
0890: 20 7b 7d 20 7b 0a 09 73 65 74 20 73 74 72 20 20 {} {..set str
08a0: 20 20 22 3c 22 0a 09 73 65 74 20 64 65 74 61 69 "<"..set detai
08b0: 6c 20 22 22 0a 09 69 66 20 7b 5b 24 6d 79 74 79 l ""..if {[$myty
08c0: 70 65 6f 62 6a 20 62 79 73 79 6d 62 6f 6c 5d 7d peobj bysymbol]}
08d0: 20 7b 0a 09 20 20 20 20 73 65 74 20 64 65 74 61 {.. set deta
08e0: 69 6c 20 22 20 27 5b 73 74 61 74 65 20 6f 6e 65 il " '[state one
08f0: 20 7b 0a 09 09 53 45 4c 45 43 54 20 53 2e 6e 61 {...SELECT S.na
0900: 6d 65 0a 09 09 46 52 4f 4d 20 20 20 73 79 6d 62 me...FROM symb
0910: 6f 6c 20 53 0a 09 09 57 48 45 52 45 20 20 53 2e ol S...WHERE S.
0920: 73 69 64 20 3d 20 24 6d 79 73 72 63 69 64 0a 09 sid = $mysrcid..
0930: 20 20 20 20 7d 5d 27 22 0a 09 7d 0a 09 61 70 70 }]'"..}..app
0940: 65 6e 64 20 73 74 72 20 22 24 6d 79 74 79 70 65 end str "$mytype
0950: 20 24 7b 6d 79 69 64 7d 24 7b 64 65 74 61 69 6c ${myid}${detail
0960: 7d 3e 22 0a 09 72 65 74 75 72 6e 20 24 73 74 72 }>"..return $str
0970: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 . }.. meth
0980: 6f 64 20 69 64 20 20 20 20 20 20 20 20 7b 7d 20 od id {}
0990: 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 64 20 7d { return $myid }
09a0: 0a 20 20 20 20 6d 65 74 68 6f 64 20 72 65 76 69 . method revi
09b0: 73 69 6f 6e 73 20 7b 7d 20 7b 20 72 65 74 75 72 sions {} { retur
09c0: 6e 20 24 6d 79 74 69 74 65 6d 73 20 7d 0a 20 20 n $mytitems }.
09d0: 20 20 6d 65 74 68 6f 64 20 64 61 74 61 20 20 20 method data
09e0: 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 5b {} { return [
09f0: 6c 69 73 74 20 24 6d 79 70 72 6f 6a 65 63 74 20 list $myproject
0a00: 24 6d 79 74 79 70 65 20 24 6d 79 73 72 63 69 64 $mytype $mysrcid
0a10: 5d 20 7d 0a 0a 20 20 20 20 64 65 6c 65 67 61 74 ] }.. delegat
0a20: 65 20 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 6f e method bysymbo
0a30: 6c 20 20 20 74 6f 20 6d 79 74 79 70 65 6f 62 6a l to mytypeobj
0a40: 0a 20 20 20 20 64 65 6c 65 67 61 74 65 20 6d 65 . delegate me
0a50: 74 68 6f 64 20 62 79 72 65 76 69 73 69 6f 6e 20 thod byrevision
0a60: 74 6f 20 6d 79 74 79 70 65 6f 62 6a 0a 20 20 20 to mytypeobj.
0a70: 20 64 65 6c 65 67 61 74 65 20 6d 65 74 68 6f 64 delegate method
0a80: 20 69 73 62 72 61 6e 63 68 20 20 20 74 6f 20 6d isbranch to m
0a90: 79 74 79 70 65 6f 62 6a 0a 20 20 20 20 64 65 6c ytypeobj. del
0aa0: 65 67 61 74 65 20 6d 65 74 68 6f 64 20 69 73 74 egate method ist
0ab0: 61 67 20 20 20 20 20 20 74 6f 20 6d 79 74 79 70 ag to mytyp
0ac0: 65 6f 62 6a 0a 0a 20 20 20 20 6d 65 74 68 6f 64 eobj.. method
0ad0: 20 73 65 74 70 6f 73 20 7b 70 7d 20 7b 20 73 65 setpos {p} { se
0ae0: 74 20 6d 79 70 6f 73 20 24 70 20 3b 20 72 65 74 t mypos $p ; ret
0af0: 75 72 6e 20 7d 0a 20 20 20 20 6d 65 74 68 6f 64 urn }. method
0b00: 20 70 6f 73 20 20 20 20 7b 7d 20 20 7b 20 72 65 pos {} { re
0b10: 74 75 72 6e 20 24 6d 79 70 6f 73 20 7d 0a 0a 20 turn $mypos }..
0b20: 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20 64 69 # result = di
0b30: 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 ct (item -> list
0b40: 20 28 63 68 61 6e 67 65 73 65 74 29 29 0a 20 20 (changeset)).
0b50: 20 20 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 method success
0b60: 6f 72 6d 61 70 20 7b 7d 20 7b 0a 09 23 20 4e 4f ormap {} {..# NO
0b70: 54 45 20 2f 20 46 55 54 55 52 45 3a 20 50 6f 73 TE / FUTURE: Pos
0b80: 73 69 62 6c 65 20 62 6f 74 74 6c 65 6e 65 63 6b sible bottleneck
0b90: 2e 0a 09 61 72 72 61 79 20 73 65 74 20 74 6d 70 ...array set tmp
0ba0: 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 65 {}..foreach {re
0bb0: 76 20 63 68 69 6c 64 72 65 6e 7d 20 5b 24 73 65 v children} [$se
0bc0: 6c 66 20 6e 65 78 74 6d 61 70 5d 20 7b 0a 09 20 lf nextmap] {..
0bd0: 20 20 20 66 6f 72 65 61 63 68 20 63 68 69 6c 64 foreach child
0be0: 20 24 63 68 69 6c 64 72 65 6e 20 7b 0a 09 09 23 $children {...#
0bf0: 20 38 2e 35 20 6c 61 70 70 65 6e 64 20 74 6d 70 8.5 lappend tmp
0c00: 28 24 72 65 76 29 20 7b 2a 7d 24 6d 79 72 65 76 ($rev) {*}$myrev
0c10: 6d 61 70 28 24 63 68 69 6c 64 29 0a 09 09 66 6f map($child)...fo
0c20: 72 65 61 63 68 20 63 73 65 74 20 24 6d 79 72 65 reach cset $myre
0c30: 76 6d 61 70 28 24 63 68 69 6c 64 29 20 7b 0a 09 vmap($child) {..
0c40: 09 20 20 20 20 6c 61 70 70 65 6e 64 20 74 6d 70 . lappend tmp
0c50: 28 24 72 65 76 29 20 24 63 73 65 74 0a 09 09 7d ($rev) $cset...}
0c60: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73 65 74 .. }.. set
0c70: 20 74 6d 70 28 24 72 65 76 29 20 5b 6c 73 6f 72 tmp($rev) [lsor
0c80: 74 20 2d 75 6e 69 71 75 65 20 24 74 6d 70 28 24 t -unique $tmp($
0c90: 72 65 76 29 5d 0a 09 7d 0a 09 72 65 74 75 72 6e rev)]..}..return
0ca0: 20 5b 61 72 72 61 79 20 67 65 74 20 74 6d 70 5d [array get tmp]
0cb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 . }.. # re
0cc0: 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 63 68 61 sult = list (cha
0cd0: 6e 67 65 73 65 74 29 0a 20 20 20 20 6d 65 74 68 ngeset). meth
0ce0: 6f 64 20 73 75 63 63 65 73 73 6f 72 73 20 7b 7d od successors {}
0cf0: 20 7b 0a 09 23 20 4e 4f 54 45 20 2f 20 46 55 54 {..# NOTE / FUT
0d00: 55 52 45 3a 20 50 6f 73 73 69 62 6c 65 20 62 6f URE: Possible bo
0d10: 74 74 6c 65 6e 65 63 6b 2e 0a 09 73 65 74 20 63 ttleneck...set c
0d20: 73 65 74 73 20 7b 7d 0a 09 66 6f 72 65 61 63 68 sets {}..foreach
0d30: 20 7b 5f 20 63 68 69 6c 64 72 65 6e 7d 20 5b 24 {_ children} [$
0d40: 73 65 6c 66 20 6e 65 78 74 6d 61 70 5d 20 7b 0a self nextmap] {.
0d50: 09 20 20 20 20 66 6f 72 65 61 63 68 20 63 68 69 . foreach chi
0d60: 6c 64 20 24 63 68 69 6c 64 72 65 6e 20 7b 0a 09 ld $children {..
0d70: 09 23 20 38 2e 35 20 6c 61 70 70 65 6e 64 20 63 .# 8.5 lappend c
0d80: 73 65 74 73 20 7b 2a 7d 24 6d 79 72 65 76 6d 61 sets {*}$myrevma
0d90: 70 28 24 63 68 69 6c 64 29 0a 09 09 66 6f 72 65 p($child)...fore
0da0: 61 63 68 20 63 73 65 74 20 24 6d 79 72 65 76 6d ach cset $myrevm
0db0: 61 70 28 24 63 68 69 6c 64 29 20 7b 0a 09 09 20 ap($child) {...
0dc0: 20 20 20 6c 61 70 70 65 6e 64 20 63 73 65 74 73 lappend csets
0dd0: 20 24 63 73 65 74 0a 09 09 7d 0a 09 20 20 20 20 $cset...}..
0de0: 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b 6c 73 }..}..return [ls
0df0: 6f 72 74 20 2d 75 6e 69 71 75 65 20 24 63 73 65 ort -unique $cse
0e00: 74 73 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 ts]. }.. #
0e10: 20 72 65 73 75 6c 74 20 3d 20 64 69 63 74 20 28 result = dict (
0e20: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 63 68 item -> list (ch
0e30: 61 6e 67 65 73 65 74 29 29 0a 20 20 20 20 6d 65 angeset)). me
0e40: 74 68 6f 64 20 70 72 65 64 65 63 65 73 73 6f 72 thod predecessor
0e50: 6d 61 70 20 7b 7d 20 7b 0a 09 23 20 4e 4f 54 45 map {} {..# NOTE
0e60: 20 2f 20 46 55 54 55 52 45 3a 20 50 6f 73 73 69 / FUTURE: Possi
0e70: 62 6c 65 20 62 6f 74 74 6c 65 6e 65 63 6b 2e 0a ble bottleneck..
0e80: 09 61 72 72 61 79 20 73 65 74 20 74 6d 70 20 7b .array set tmp {
0e90: 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 65 76 20 }..foreach {rev
0ea0: 63 68 69 6c 64 72 65 6e 7d 20 5b 24 73 65 6c 66 children} [$self
0eb0: 20 70 72 65 6d 61 70 5d 20 7b 0a 09 20 20 20 20 premap] {..
0ec0: 66 6f 72 65 61 63 68 20 63 68 69 6c 64 20 24 63 foreach child $c
0ed0: 68 69 6c 64 72 65 6e 20 7b 0a 09 09 23 20 38 2e hildren {...# 8.
0ee0: 35 20 6c 61 70 70 65 6e 64 20 74 6d 70 28 24 72 5 lappend tmp($r
0ef0: 65 76 29 20 7b 2a 7d 24 6d 79 72 65 76 6d 61 70 ev) {*}$myrevmap
0f00: 28 24 63 68 69 6c 64 29 0a 09 09 66 6f 72 65 61 ($child)...forea
0f10: 63 68 20 63 73 65 74 20 24 6d 79 72 65 76 6d 61 ch cset $myrevma
0f20: 70 28 24 63 68 69 6c 64 29 20 7b 0a 09 09 20 20 p($child) {...
0f30: 20 20 6c 61 70 70 65 6e 64 20 74 6d 70 28 24 72 lappend tmp($r
0f40: 65 76 29 20 24 63 73 65 74 0a 09 09 7d 0a 09 20 ev) $cset...}..
0f50: 20 20 20 7d 0a 09 20 20 20 20 73 65 74 20 74 6d }.. set tm
0f60: 70 28 24 72 65 76 29 20 5b 6c 73 6f 72 74 20 2d p($rev) [lsort -
0f70: 75 6e 69 71 75 65 20 24 74 6d 70 28 24 72 65 76 unique $tmp($rev
0f80: 29 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b 61 )]..}..return [a
0f90: 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 20 20 rray get tmp].
0fa0: 20 20 7d 0a 0a 20 20 20 20 23 20 69 74 65 6d 20 }.. # item
0fb0: 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 0a 20 -> list (item).
0fc0: 20 20 20 6d 65 74 68 6f 64 20 6e 65 78 74 6d 61 method nextma
0fd0: 70 20 7b 7d 20 7b 0a 09 69 66 20 7b 5b 6c 6c 65 p {} {..if {[lle
0fe0: 6e 67 74 68 20 24 6d 79 6e 65 78 74 6d 61 70 5d ngth $mynextmap]
0ff0: 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 6e 65 } { return $myne
1000: 78 74 6d 61 70 20 7d 0a 09 24 6d 79 74 79 70 65 xtmap }..$mytype
1010: 6f 62 6a 20 73 75 63 63 65 73 73 6f 72 73 20 74 obj successors t
1020: 6d 70 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 0a mp $myrevisions.
1030: 09 73 65 74 20 6d 79 6e 65 78 74 6d 61 70 20 5b .set mynextmap [
1040: 61 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 09 array get tmp]..
1050: 72 65 74 75 72 6e 20 24 6d 79 6e 65 78 74 6d 61 return $mynextma
1060: 70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 69 p. }.. # i
1070: 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 tem -> list (ite
1080: 6d 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 70 72 m). method pr
1090: 65 6d 61 70 20 7b 7d 20 7b 0a 09 69 66 20 7b 5b emap {} {..if {[
10a0: 6c 6c 65 6e 67 74 68 20 24 6d 79 70 72 65 6d 61 llength $myprema
10b0: 70 5d 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 p]} { return $my
10c0: 70 72 65 6d 61 70 20 7d 0a 09 24 6d 79 74 79 70 premap }..$mytyp
10d0: 65 6f 62 6a 20 70 72 65 64 65 63 65 73 73 6f 72 eobj predecessor
10e0: 73 20 74 6d 70 20 24 6d 79 72 65 76 69 73 69 6f s tmp $myrevisio
10f0: 6e 73 0a 09 73 65 74 20 6d 79 70 72 65 6d 61 70 ns..set mypremap
1100: 20 5b 61 72 72 61 79 20 67 65 74 20 74 6d 70 5d [array get tmp]
1110: 0a 09 72 65 74 75 72 6e 20 24 6d 79 70 72 65 6d ..return $myprem
1120: 61 70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 ap. }.. me
1130: 74 68 6f 64 20 62 72 65 61 6b 69 6e 74 65 72 6e thod breakintern
1140: 61 6c 64 65 70 65 6e 64 65 6e 63 69 65 73 20 7b aldependencies {
1150: 7d 20 7b 0a 09 23 20 54 68 69 73 20 6d 65 74 68 } {..# This meth
1160: 6f 64 20 69 6e 73 70 65 63 74 73 20 74 68 65 20 od inspects the
1170: 63 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20 69 changesets for i
1180: 6e 74 65 72 6e 61 6c 0a 09 23 20 64 65 70 65 6e nternal..# depen
1190: 64 65 6e 63 69 65 73 2e 20 4e 6f 74 68 69 6e 67 dencies. Nothing
11a0: 20 69 73 20 64 6f 6e 65 20 69 66 20 74 68 65 72 is done if ther
11b0: 65 20 61 72 65 20 6e 6f 0a 09 23 20 73 75 63 68 e are no..# such
11c0: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 . Otherwise the
11d0: 63 68 61 6e 67 65 73 65 74 20 69 73 20 73 70 6c changeset is spl
11e0: 69 74 20 69 6e 74 6f 20 61 20 73 65 74 20 6f 66 it into a set of
11f0: 0a 09 23 20 66 72 61 67 6d 65 6e 74 73 20 77 69 ..# fragments wi
1200: 74 68 6f 75 74 20 69 6e 74 65 72 6e 61 6c 20 64 thout internal d
1210: 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 74 72 61 ependencies, tra
1220: 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 09 23 nsforming the..#
1230: 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 internal depend
1240: 65 6e 63 69 65 73 20 69 6e 74 6f 20 65 78 74 65 encies into exte
1250: 72 6e 61 6c 20 6f 6e 65 73 2e 20 54 68 65 20 6e rnal ones. The n
1260: 65 77 20 63 68 61 6e 67 65 73 65 74 73 0a 09 23 ew changesets..#
1270: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 are added to th
1280: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 68 e list of all ch
1290: 61 6e 67 65 73 65 74 73 2e 0a 0a 09 23 20 57 65 angesets....# We
12a0: 20 70 65 72 66 6f 72 6d 20 61 6c 6c 20 6e 65 63 perform all nec
12b0: 65 73 73 61 72 79 20 73 70 6c 69 74 73 20 69 6e essary splits in
12c0: 20 6f 6e 65 20 67 6f 2c 20 69 6e 73 74 65 61 64 one go, instead
12d0: 20 6f 66 20 6f 6e 6c 79 0a 09 23 20 6f 6e 65 2e of only..# one.
12e0: 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 61 6c The previous al
12f0: 67 6f 72 69 74 68 6d 2c 20 61 64 61 70 74 65 64 gorithm, adapted
1300: 20 66 72 6f 6d 20 63 76 73 32 73 76 6e 2c 20 63 from cvs2svn, c
1310: 6f 6d 70 75 74 65 64 0a 09 23 20 61 20 6c 6f 74 omputed..# a lot
1320: 20 6f 66 20 73 74 61 74 65 20 77 68 69 63 68 20 of state which
1330: 77 61 73 20 74 68 72 6f 77 6e 20 61 77 61 79 20 was thrown away
1340: 61 6e 64 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 and then compute
1350: 64 20 61 67 61 69 6e 0a 09 23 20 66 6f 72 20 65 d again..# for e
1360: 61 63 68 20 6f 66 20 74 68 65 20 66 72 61 67 6d ach of the fragm
1370: 65 6e 74 73 2e 20 49 74 20 73 68 6f 75 6c 64 20 ents. It should
1380: 62 65 20 65 61 73 69 65 72 20 74 6f 20 75 70 64 be easier to upd
1390: 61 74 65 20 61 6e 64 0a 09 23 20 72 65 75 73 65 ate and..# reuse
13a0: 20 74 68 61 74 20 73 74 61 74 65 2e 0a 0a 09 23 that state....#
13b0: 20 54 68 65 20 63 6f 64 65 20 63 68 65 63 6b 73 The code checks
13c0: 20 6f 6e 6c 79 20 73 75 63 65 73 73 6f 72 20 64 only sucessor d
13d0: 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 20 ependencies, as
13e0: 74 68 69 73 0a 09 23 20 61 75 74 6f 6d 61 74 69 this..# automati
13f0: 63 61 6c 6c 79 20 63 6f 76 65 72 73 20 74 68 65 cally covers the
1400: 20 70 72 65 64 65 63 65 73 73 6f 72 20 64 65 70 predecessor dep
1410: 65 6e 64 65 6e 63 69 65 73 20 61 73 20 77 65 6c endencies as wel
1420: 6c 20 28 41 0a 09 23 20 73 75 63 63 65 73 73 6f l (A..# successo
1430: 72 20 64 65 70 65 6e 64 65 6e 63 79 20 61 20 2d r dependency a -
1440: 3e 20 62 20 69 73 20 61 6c 73 6f 20 61 20 70 72 > b is also a pr
1450: 65 64 65 63 65 73 73 6f 72 20 64 65 70 65 6e 64 edecessor depend
1460: 65 6e 63 79 0a 09 23 20 62 20 2d 3e 20 61 29 2e ency..# b -> a).
1470: 0a 0a 09 23 20 41 72 72 61 79 20 6f 66 20 64 65 ...# Array of de
1480: 70 65 6e 64 65 6e 63 69 65 73 20 28 70 61 72 65 pendencies (pare
1490: 6e 74 20 2d 3e 20 63 68 69 6c 64 29 2e 20 54 68 nt -> child). Th
14a0: 69 73 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f is is pulled fro
14b0: 6d 0a 09 23 20 74 68 65 20 73 74 61 74 65 2c 20 m..# the state,
14c0: 61 6e 64 20 6c 69 6d 69 74 65 64 20 74 6f 20 73 and limited to s
14d0: 75 63 63 65 73 73 6f 72 73 20 77 69 74 68 69 6e uccessors within
14e0: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 0a the changeset..
14f0: 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 70 65 ..array set depe
1500: 6e 64 65 6e 63 69 65 73 20 7b 7d 0a 09 24 6d 79 ndencies {}..$my
1510: 74 79 70 65 6f 62 6a 20 69 6e 74 65 72 6e 61 6c typeobj internal
1520: 73 75 63 63 65 73 73 6f 72 73 20 64 65 70 65 6e successors depen
1530: 64 65 6e 63 69 65 73 20 24 6d 79 72 65 76 69 73 dencies $myrevis
1540: 69 6f 6e 73 0a 09 69 66 20 7b 21 5b 61 72 72 61 ions..if {![arra
1550: 79 20 73 69 7a 65 20 64 65 70 65 6e 64 65 6e 63 y size dependenc
1560: 69 65 73 5d 7d 20 7b 72 65 74 75 72 6e 20 30 7d ies]} {return 0}
1570: 20 3b 20 23 20 4e 6f 74 68 69 6e 67 20 74 6f 20 ; # Nothing to
1580: 62 72 65 61 6b 2e 0a 0a 09 6c 6f 67 20 77 72 69 break....log wri
1590: 74 65 20 35 20 63 73 65 74 73 20 2e 2e 2e 5b 24 te 5 csets ...[$
15a0: 73 65 6c 66 20 73 74 72 5d 2e 2e 2e 2e 2e 2e 2e self str].......
15b0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
15c0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
15d0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
15e0: 0a 0a 09 23 20 57 65 20 68 61 76 65 20 69 6e 74 ...# We have int
15f0: 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 ernal dependenci
1600: 65 73 20 74 6f 20 62 72 65 61 6b 2e 20 57 65 20 es to break. We
1610: 6e 6f 77 20 69 74 65 72 61 74 65 20 6f 76 65 72 now iterate over
1620: 0a 09 23 20 61 6c 6c 20 70 6f 73 69 74 69 6f 6e ..# all position
1630: 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 28 77 s in the list (w
1640: 68 69 63 68 20 69 73 20 63 68 72 6f 6e 6f 6c 6f hich is chronolo
1650: 67 69 63 61 6c 2c 20 61 74 20 6c 65 61 73 74 0a gical, at least.
1660: 09 23 20 61 73 20 66 61 72 20 61 73 20 74 68 65 .# as far as the
1670: 20 74 69 6d 65 73 74 61 6d 70 73 20 61 72 65 20 timestamps are
1680: 63 6f 72 72 65 63 74 20 61 6e 64 20 75 6e 69 71 correct and uniq
1690: 75 65 29 20 61 6e 64 0a 09 23 20 64 65 74 65 72 ue) and..# deter
16a0: 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 70 6f mine the best po
16b0: 73 69 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 62 sition for the b
16c0: 72 65 61 6b 2c 20 62 79 20 74 72 79 69 6e 67 20 reak, by trying
16d0: 74 6f 0a 09 23 20 62 72 65 61 6b 20 61 73 20 6d to..# break as m
16e0: 61 6e 79 20 64 65 70 65 6e 64 65 6e 63 69 65 73 any dependencies
16f0: 20 61 73 20 70 6f 73 73 69 62 6c 65 20 69 6e 20 as possible in
1700: 6f 6e 65 20 67 6f 2e 20 57 68 65 6e 20 61 0a 09 one go. When a..
1710: 23 20 62 72 65 61 6b 20 77 61 73 20 66 6f 75 6e # break was foun
1720: 64 20 74 68 69 73 20 69 73 20 72 65 64 6f 6e 65 d this is redone
1730: 20 66 6f 72 20 74 68 65 20 66 72 61 67 6d 65 6e for the fragmen
1740: 74 73 20 63 6f 6d 69 6e 67 20 61 6e 64 0a 09 23 ts coming and..#
1750: 20 61 66 74 65 72 2c 20 61 66 74 65 72 20 75 70 after, after up
1760: 64 69 6e 67 20 74 68 65 20 63 72 6f 73 73 69 6e ding the crossin
1770: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 0a g information...
1780: 09 23 20 44 61 74 61 20 73 74 72 75 63 74 75 72 .# Data structur
1790: 65 73 3a 0a 09 23 20 4d 61 70 3a 20 20 50 4f 53 es:..# Map: POS
17a0: 20 20 20 72 65 76 69 73 69 6f 6e 20 69 64 20 20 revision id
17b0: 20 20 20 20 2d 3e 20 70 6f 73 69 74 69 6f 6e 20 -> position
17c0: 69 6e 20 6c 69 73 74 2e 0a 09 23 20 20 20 20 20 in list...#
17d0: 20 20 43 52 4f 53 53 20 70 6f 73 69 74 69 6f 6e CROSS position
17e0: 20 69 6e 20 6c 69 73 74 20 2d 3e 20 6e 75 6d 62 in list -> numb
17f0: 65 72 20 6f 66 20 64 65 70 65 6e 64 65 6e 63 69 er of dependenci
1800: 65 73 20 63 72 6f 73 73 69 6e 67 20 69 74 0a 09 es crossing it..
1810: 23 20 20 20 20 20 20 20 44 45 50 43 20 20 64 65 # DEPC de
1820: 70 65 6e 64 65 6e 63 79 20 20 20 20 20 20 20 2d pendency -
1830: 3e 20 70 6f 73 69 74 69 6f 6e 73 20 69 74 20 63 > positions it c
1840: 72 6f 73 73 65 73 0a 09 23 20 4c 69 73 74 3a 20 rosses..# List:
1850: 52 41 4e 47 45 20 4f 66 20 74 68 65 20 70 6f 73 RANGE Of the pos
1860: 69 74 69 6f 6e 73 20 69 74 73 65 6c 66 2e 0a 09 itions itself...
1870: 23 20 41 20 64 65 70 65 6e 64 65 6e 63 79 20 69 # A dependency i
1880: 73 20 61 20 73 69 6e 67 6c 65 2d 65 6c 65 6d 65 s a single-eleme
1890: 6e 74 20 6d 61 70 20 70 61 72 65 6e 74 20 2d 3e nt map parent ->
18a0: 20 63 68 69 6c 64 0a 0a 09 49 6e 69 74 69 61 6c child...Initial
18b0: 69 7a 65 42 72 65 61 6b 53 74 61 74 65 20 24 6d izeBreakState $m
18c0: 79 72 65 76 69 73 69 6f 6e 73 0a 0a 09 73 65 74 yrevisions...set
18d0: 20 66 72 61 67 6d 65 6e 74 73 20 7b 7d 0a 09 73 fragments {}..s
18e0: 65 74 20 70 65 6e 64 69 6e 67 20 20 20 5b 6c 69 et pending [li
18f0: 73 74 20 24 72 61 6e 67 65 5d 0a 09 73 65 74 20 st $range]..set
1900: 61 74 20 20 20 20 20 20 20 20 30 0a 09 61 72 72 at 0..arr
1910: 61 79 20 73 65 74 20 62 72 65 61 6b 73 20 7b 7d ay set breaks {}
1920: 0a 0a 09 77 68 69 6c 65 20 7b 24 61 74 20 3c 20 ...while {$at <
1930: 5b 6c 6c 65 6e 67 74 68 20 24 70 65 6e 64 69 6e [llength $pendin
1940: 67 5d 7d 20 7b 0a 09 20 20 20 20 73 65 74 20 63 g]} {.. set c
1950: 75 72 72 65 6e 74 20 5b 6c 69 6e 64 65 78 20 24 urrent [lindex $
1960: 70 65 6e 64 69 6e 67 20 24 61 74 5d 0a 0a 09 20 pending $at]...
1970: 20 20 20 6c 6f 67 20 77 72 69 74 65 20 36 20 63 log write 6 c
1980: 73 65 74 73 20 7b 2e 20 2e 20 2e 2e 20 2e 2e 2e sets {. . .. ...
1990: 20 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 20 ..... ........
19a0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 7d 0a 09 .............}..
19b0: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 36 20 log write 6
19c0: 63 73 65 74 73 20 7b 53 63 68 65 64 75 6c 65 64 csets {Scheduled
19d0: 20 20 20 5b 6a 6f 69 6e 20 5b 50 52 73 20 5b 6c [join [PRs [l
19e0: 72 61 6e 67 65 20 24 70 65 6e 64 69 6e 67 20 24 range $pending $
19f0: 61 74 20 65 6e 64 5d 5d 20 7b 20 7d 5d 7d 0a 09 at end]] { }]}..
1a00: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 36 20 log write 6
1a10: 63 73 65 74 73 20 7b 43 6f 6e 73 69 64 65 72 69 csets {Consideri
1a20: 6e 67 20 5b 50 52 20 24 63 75 72 72 65 6e 74 5d ng [PR $current]
1a30: 20 5c 5b 24 61 74 2f 5b 6c 6c 65 6e 67 74 68 20 \[$at/[llength
1a40: 24 70 65 6e 64 69 6e 67 5d 5c 5d 7d 0a 0a 09 20 $pending]\]}...
1a50: 20 20 20 73 65 74 20 62 65 73 74 20 5b 46 69 6e set best [Fin
1a60: 64 42 65 73 74 42 72 65 61 6b 20 24 63 75 72 72 dBestBreak $curr
1a70: 65 6e 74 5d 0a 0a 09 20 20 20 20 69 66 20 7b 24 ent]... if {$
1a80: 62 65 73 74 20 3c 20 30 7d 20 7b 0a 09 09 23 20 best < 0} {...#
1a90: 54 68 65 20 69 6e 73 70 65 63 74 65 64 20 72 61 The inspected ra
1aa0: 6e 67 65 20 68 61 73 20 6e 6f 20 69 6e 74 65 72 nge has no inter
1ab0: 6e 61 6c 0a 09 09 23 20 64 65 70 65 6e 64 65 6e nal...# dependen
1ac0: 63 69 65 73 2e 20 54 68 69 73 20 69 73 20 61 20 cies. This is a
1ad0: 63 6f 6d 70 6c 65 74 65 20 66 72 61 67 6d 65 6e complete fragmen
1ae0: 74 2e 0a 09 09 6c 61 70 70 65 6e 64 20 66 72 61 t....lappend fra
1af0: 67 6d 65 6e 74 73 20 24 63 75 72 72 65 6e 74 0a gments $current.
1b00: 0a 09 09 6c 6f 67 20 77 72 69 74 65 20 36 20 63 ...log write 6 c
1b10: 73 65 74 73 20 22 4e 6f 20 62 72 65 61 6b 73 2c sets "No breaks,
1b20: 20 66 69 6e 61 6c 22 0a 09 20 20 20 20 7d 20 65 final".. } e
1b30: 6c 73 65 20 7b 0a 09 09 23 20 53 70 6c 69 74 20 lse {...# Split
1b40: 74 68 65 20 72 61 6e 67 65 20 61 6e 64 20 73 63 the range and sc
1b50: 68 65 64 75 6c 65 20 74 68 65 20 72 65 73 75 6c hedule the resul
1b60: 74 69 6e 67 20 66 72 61 67 6d 65 6e 74 73 0a 09 ting fragments..
1b70: 09 23 20 66 6f 72 20 66 75 72 74 68 65 72 20 69 .# for further i
1b80: 6e 73 70 65 63 74 69 6f 6e 2e 20 52 65 6d 65 6d nspection. Remem
1b90: 62 65 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f ber the number o
1ba0: 66 0a 09 09 23 20 64 65 70 65 6e 64 65 6e 63 69 f...# dependenci
1bb0: 65 73 20 63 75 74 20 62 65 66 6f 72 65 20 77 65 es cut before we
1bc0: 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f remove them fro
1bd0: 6d 0a 09 09 23 20 63 6f 6e 73 69 64 65 72 61 74 m...# considerat
1be0: 69 6f 6e 2c 20 66 6f 72 20 64 6f 63 75 6d 65 6e ion, for documen
1bf0: 74 61 74 69 6f 6e 20 6c 61 74 65 72 2e 0a 0a 09 tation later....
1c00: 09 73 65 74 20 62 72 65 61 6b 73 28 24 62 65 73 .set breaks($bes
1c10: 74 29 20 24 63 72 6f 73 73 28 24 62 65 73 74 29 t) $cross($best)
1c20: 0a 0a 09 09 6c 6f 67 20 77 72 69 74 65 20 36 20 ....log write 6
1c30: 63 73 65 74 73 20 22 42 65 73 74 20 62 72 65 61 csets "Best brea
1c40: 6b 20 40 20 24 62 65 73 74 2c 20 63 75 74 74 69 k @ $best, cutti
1c50: 6e 67 20 5b 6e 73 70 20 24 63 72 6f 73 73 28 24 ng [nsp $cross($
1c60: 62 65 73 74 29 20 64 65 70 65 6e 64 65 6e 63 79 best) dependency
1c70: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 5d 22 0a dependencies]".
1c80: 0a 09 09 23 20 4e 6f 74 65 3a 20 54 68 65 20 76 ...# Note: The v
1c90: 61 6c 75 65 20 6f 66 20 62 65 73 74 20 69 73 20 alue of best is
1ca0: 61 6e 20 61 62 6f 6c 75 74 65 20 6c 6f 63 61 74 an abolute locat
1cb0: 69 6f 6e 20 69 6e 0a 09 09 23 20 6d 79 72 65 76 ion in...# myrev
1cc0: 69 73 69 6f 6e 73 2e 20 55 73 65 20 74 68 65 20 isions. Use the
1cd0: 73 74 61 72 74 20 6f 66 20 63 75 72 72 65 6e 74 start of current
1ce0: 20 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 0a 09 to make it an..
1cf0: 09 23 20 69 6e 64 65 78 20 61 62 73 6f 6c 75 74 .# index absolut
1d00: 65 20 74 6f 20 63 75 72 72 65 6e 74 2e 0a 0a 09 e to current....
1d10: 09 73 65 74 20 62 72 65 6c 20 5b 65 78 70 72 20 .set brel [expr
1d20: 7b 24 62 65 73 74 20 2d 20 5b 6c 69 6e 64 65 78 {$best - [lindex
1d30: 20 24 63 75 72 72 65 6e 74 20 30 5d 7d 5d 0a 09 $current 0]}]..
1d40: 09 73 65 74 20 62 6e 65 78 74 20 24 62 72 65 6c .set bnext $brel
1d50: 20 3b 20 69 6e 63 72 20 62 6e 65 78 74 0a 09 09 ; incr bnext...
1d60: 73 65 74 20 66 72 61 67 62 65 66 6f 72 65 20 5b set fragbefore [
1d70: 6c 72 61 6e 67 65 20 24 63 75 72 72 65 6e 74 20 lrange $current
1d80: 30 20 24 62 72 65 6c 5d 0a 09 09 73 65 74 20 66 0 $brel]...set f
1d90: 72 61 67 61 66 74 65 72 20 20 5b 6c 72 61 6e 67 ragafter [lrang
1da0: 65 20 24 63 75 72 72 65 6e 74 20 24 62 6e 65 78 e $current $bnex
1db0: 74 20 65 6e 64 5d 0a 0a 09 09 6c 6f 67 20 77 72 t end]....log wr
1dc0: 69 74 65 20 36 20 63 73 65 74 73 20 22 4e 65 77 ite 6 csets "New
1dd0: 20 70 69 65 63 65 73 20 20 5b 50 52 20 24 66 72 pieces [PR $fr
1de0: 61 67 62 65 66 6f 72 65 5d 20 5b 50 52 20 24 66 agbefore] [PR $f
1df0: 72 61 67 61 66 74 65 72 5d 22 0a 0a 09 09 69 6e ragafter]"....in
1e00: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b tegrity assert {
1e10: 5b 6c 6c 65 6e 67 74 68 20 24 66 72 61 67 62 65 [llength $fragbe
1e20: 66 6f 72 65 5d 7d 20 7b 46 6f 75 6e 64 20 7a 65 fore]} {Found ze
1e30: 72 6f 2d 6c 65 6e 67 74 68 20 66 72 61 67 6d 65 ro-length fragme
1e40: 6e 74 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e nt at the beginn
1e50: 69 6e 67 7d 0a 09 09 69 6e 74 65 67 72 69 74 79 ing}...integrity
1e60: 20 61 73 73 65 72 74 20 7b 5b 6c 6c 65 6e 67 74 assert {[llengt
1e70: 68 20 24 66 72 61 67 61 66 74 65 72 5d 7d 20 20 h $fragafter]}
1e80: 7b 46 6f 75 6e 64 20 7a 65 72 6f 2d 6c 65 6e 67 {Found zero-leng
1e90: 74 68 20 66 72 61 67 6d 65 6e 74 20 61 74 20 74 th fragment at t
1ea0: 68 65 20 65 6e 64 7d 0a 0a 09 09 6c 61 70 70 65 he end}....lappe
1eb0: 6e 64 20 70 65 6e 64 69 6e 67 20 24 66 72 61 67 nd pending $frag
1ec0: 62 65 66 6f 72 65 20 24 66 72 61 67 61 66 74 65 before $fragafte
1ed0: 72 0a 09 09 43 75 74 41 74 20 24 62 65 73 74 0a r...CutAt $best.
1ee0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 6e 63 . }... inc
1ef0: 72 20 61 74 0a 09 7d 0a 0a 09 6c 6f 67 20 77 72 r at..}...log wr
1f00: 69 74 65 20 36 20 63 73 65 74 73 20 22 2e 20 2e ite 6 csets ". .
1f10: 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e .. ... ..... ..
1f20: 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e ...... .........
1f30: 2e 2e 2e 2e 22 0a 0a 09 23 20 28 2a 29 20 57 65 ...."...# (*) We
1f40: 20 63 6c 65 61 72 20 6f 75 74 20 74 68 65 20 61 clear out the a
1f50: 73 73 6f 63 69 61 74 65 64 20 70 61 72 74 20 6f ssociated part o
1f60: 66 20 74 68 65 20 6d 79 72 65 76 6d 61 70 0a 09 f the myrevmap..
1f70: 23 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6e 64 65 # in-memory inde
1f80: 78 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e x in preparation
1f90: 20 66 6f 72 20 6e 65 77 20 64 61 74 61 2e 20 41 for new data. A
1fa0: 20 73 69 6d 70 6c 65 20 75 6e 73 65 74 0a 09 23 simple unset..#
1fb0: 20 69 73 20 65 6e 6f 75 67 68 2c 20 77 65 20 68 is enough, we h
1fc0: 61 76 65 20 6e 6f 20 73 79 6d 62 6f 6c 20 63 68 ave no symbol ch
1fd0: 61 6e 67 65 73 65 74 73 20 61 74 20 74 68 69 73 angesets at this
1fe0: 20 74 69 6d 65 2c 20 61 6e 64 0a 09 23 20 74 68 time, and..# th
1ff0: 75 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 us never more th
2000: 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 an one reference
2010: 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 0a 09 in the list....
2020: 66 6f 72 65 61 63 68 20 72 20 24 6d 79 72 65 76 foreach r $myrev
2030: 69 73 69 6f 6e 73 20 7b 0a 09 20 20 20 20 73 65 isions {.. se
2040: 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79 74 t key [list $myt
2050: 79 70 65 20 24 72 5d 0a 09 20 20 20 20 75 6e 73 ype $r].. uns
2060: 65 74 20 6d 79 72 65 76 6d 61 70 28 24 6b 65 79 et myrevmap($key
2070: 29 0a 09 7d 0a 0a 09 23 20 43 72 65 61 74 65 20 )..}...# Create
2080: 63 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20 74 changesets for t
2090: 68 65 20 66 72 61 67 6d 65 6e 74 73 2c 20 72 65 he fragments, re
20a0: 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e using the curren
20b0: 74 20 6f 6e 65 0a 09 23 20 66 6f 72 20 74 68 65 t one..# for the
20c0: 20 66 69 72 73 74 20 66 72 61 67 6d 65 6e 74 2e first fragment.
20d0: 20 57 65 20 73 6f 72 74 20 74 68 65 6d 20 69 6e We sort them in
20e0: 20 6f 72 64 65 72 20 74 6f 20 61 6c 6c 6f 77 0a order to allow.
20f0: 09 23 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 .# checking for
2100: 67 61 70 73 20 61 6e 64 20 6e 69 63 65 20 6d 65 gaps and nice me
2110: 73 73 61 67 65 73 2e 0a 0a 09 73 65 74 20 66 72 ssages....set fr
2120: 61 67 6d 65 6e 74 73 20 5b 6c 73 6f 72 74 20 2d agments [lsort -
2130: 69 6e 64 65 78 20 30 20 2d 69 6e 74 65 67 65 72 index 0 -integer
2140: 20 24 66 72 61 67 6d 65 6e 74 73 5d 0a 0a 09 23 $fragments]...#
2150: 70 75 74 73 20 5c 74 2e 5b 6a 6f 69 6e 20 5b 50 puts \t.[join [P
2160: 52 73 20 24 66 72 61 67 6d 65 6e 74 73 5d 20 2e Rs $fragments] .
2170: 5c 6e 5c 74 2e 5d 2e 0a 0a 09 42 6f 72 64 65 72 \n\t.]....Border
2180: 20 5b 6c 69 6e 64 65 78 20 24 66 72 61 67 6d 65 [lindex $fragme
2190: 6e 74 73 20 30 5d 20 66 69 72 73 74 73 20 66 69 nts 0] firsts fi
21a0: 72 73 74 65 0a 0a 09 69 6e 74 65 67 72 69 74 79 rste...integrity
21b0: 20 61 73 73 65 72 74 20 7b 24 66 69 72 73 74 73 assert {$firsts
21c0: 20 3d 3d 20 30 7d 20 7b 42 61 64 20 66 72 61 67 == 0} {Bad frag
21d0: 6d 65 6e 74 20 73 74 61 72 74 20 40 20 24 66 69 ment start @ $fi
21e0: 72 73 74 73 2c 20 67 61 70 2c 20 6f 72 20 62 65 rsts, gap, or be
21f0: 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f fore beginning o
2200: 66 20 74 68 65 20 72 61 6e 67 65 7d 0a 0a 09 73 f the range}...s
2210: 65 74 20 6c 61 73 74 65 20 24 66 69 72 73 74 65 et laste $firste
2220: 0a 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65 ..foreach fragme
2230: 6e 74 20 5b 6c 72 61 6e 67 65 20 24 66 72 61 67 nt [lrange $frag
2240: 6d 65 6e 74 73 20 31 20 65 6e 64 5d 20 7b 0a 09 ments 1 end] {..
2250: 20 20 20 20 42 6f 72 64 65 72 20 24 66 72 61 67 Border $frag
2260: 6d 65 6e 74 20 73 20 65 0a 09 20 20 20 20 69 6e ment s e.. in
2270: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b tegrity assert {
2280: 24 6c 61 73 74 65 20 3d 3d 20 28 24 73 20 2d 20 $laste == ($s -
2290: 31 29 7d 20 7b 42 61 64 20 66 72 61 67 6d 65 6e 1)} {Bad fragmen
22a0: 74 20 62 6f 72 64 65 72 20 3c 24 6c 61 73 74 65 t border <$laste
22b0: 20 7c 20 24 73 3e 2c 20 67 61 70 20 6f 72 20 6f | $s>, gap or o
22c0: 76 65 72 6c 61 70 7d 0a 0a 09 20 20 20 20 73 65 verlap}... se
22d0: 74 20 6e 65 77 20 5b 24 74 79 70 65 20 25 41 55 t new [$type %AU
22e0: 54 4f 25 20 24 6d 79 70 72 6f 6a 65 63 74 20 24 TO% $myproject $
22f0: 6d 79 74 79 70 65 20 24 6d 79 73 72 63 69 64 20 mytype $mysrcid
2300: 5b 6c 72 61 6e 67 65 20 24 6d 79 72 65 76 69 73 [lrange $myrevis
2310: 69 6f 6e 73 20 24 73 20 24 65 5d 5d 0a 0a 20 20 ions $s $e]]..
2320: 20 20 20 20 20 20 20 20 20 20 6c 6f 67 20 77 72 log wr
2330: 69 74 65 20 34 20 63 73 65 74 73 20 22 42 72 65 ite 4 csets "Bre
2340: 61 6b 69 6e 67 20 5b 24 73 65 6c 66 20 73 74 72 aking [$self str
2350: 20 5d 20 40 20 24 6c 61 73 74 65 2c 20 6e 65 77 ] @ $laste, new
2360: 20 5b 24 6e 65 77 20 73 74 72 5d 2c 20 63 75 74 [$new str], cut
2370: 74 69 6e 67 20 24 62 72 65 61 6b 73 28 24 6c 61 ting $breaks($la
2380: 73 74 65 29 22 0a 0a 09 20 20 20 20 73 65 74 20 ste)"... set
2390: 6c 61 73 74 65 20 24 65 0a 09 7d 0a 0a 09 69 6e laste $e..}...in
23a0: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b tegrity assert {
23b0: 0a 09 20 20 20 20 24 6c 61 73 74 65 20 3d 3d 20 .. $laste ==
23c0: 28 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 72 65 76 ([llength $myrev
23d0: 69 73 69 6f 6e 73 5d 2d 31 29 0a 09 7d 20 7b 42 isions]-1)..} {B
23e0: 61 64 20 66 72 61 67 6d 65 6e 74 20 65 6e 64 20 ad fragment end
23f0: 40 20 24 6c 61 73 74 65 2c 20 67 61 70 2c 20 6f @ $laste, gap, o
2400: 72 20 62 65 79 6f 6e 64 20 65 6e 64 20 6f 66 20 r beyond end of
2410: 74 68 65 20 72 61 6e 67 65 7d 0a 0a 09 23 20 50 the range}...# P
2420: 75 74 20 74 68 65 20 66 69 72 73 74 20 66 72 61 ut the first fra
2430: 67 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 63 gment into the c
2440: 75 72 72 65 6e 74 20 63 68 61 6e 67 65 73 65 74 urrent changeset
2450: 2c 20 61 6e 64 0a 09 23 20 75 70 64 61 74 65 20 , and..# update
2460: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6e the in-memory in
2470: 64 65 78 2e 20 57 65 20 63 61 6e 20 73 69 6d 70 dex. We can simp
2480: 6c 79 20 28 72 65 29 61 64 64 20 74 68 65 0a 09 ly (re)add the..
2490: 23 20 72 65 76 69 73 69 6f 6e 73 20 62 65 63 61 # revisions beca
24a0: 75 73 65 20 77 65 20 63 6c 65 61 72 65 64 20 74 use we cleared t
24b0: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78 he previously ex
24c0: 69 73 74 69 6e 67 0a 09 23 20 69 6e 66 6f 72 6d isting..# inform
24d0: 61 74 69 6f 6e 2c 20 73 65 65 20 28 2a 29 20 61 ation, see (*) a
24e0: 62 6f 76 65 2e 20 50 65 72 73 69 73 74 65 6e 63 bove. Persistenc
24f0: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 e does not matte
2500: 72 0a 09 23 20 68 65 72 65 2c 20 6e 6f 6e 65 20 r..# here, none
2510: 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 of the changeset
2520: 73 20 68 61 73 20 62 65 65 6e 20 73 61 76 65 64 s has been saved
2530: 20 74 6f 20 74 68 65 0a 09 23 20 70 65 72 73 69 to the..# persi
2540: 73 74 65 6e 74 20 73 74 61 74 65 20 79 65 74 2e stent state yet.
2550: 0a 0a 09 73 65 74 20 6d 79 72 65 76 69 73 69 6f ...set myrevisio
2560: 6e 73 20 5b 6c 72 61 6e 67 65 20 24 6d 79 72 65 ns [lrange $myre
2570: 76 69 73 69 6f 6e 73 20 30 20 24 66 69 72 73 74 visions 0 $first
2580: 65 5d 0a 09 66 6f 72 65 61 63 68 20 72 20 24 6d e]..foreach r $m
2590: 79 72 65 76 69 73 69 6f 6e 73 20 7b 0a 09 20 20 yrevisions {..
25a0: 20 20 73 65 74 20 6b 65 79 20 5b 6c 69 73 74 20 set key [list
25b0: 24 6d 79 74 79 70 65 20 24 72 5d 0a 09 20 20 20 $mytype $r]..
25c0: 20 73 65 74 20 6d 79 72 65 76 6d 61 70 28 24 6b set myrevmap($k
25d0: 65 79 29 20 24 73 65 6c 66 0a 09 7d 0a 0a 09 72 ey) $self..}...r
25e0: 65 74 75 72 6e 20 31 0a 20 20 20 20 7d 0a 0a 20 eturn 1. }..
25f0: 20 20 20 6d 65 74 68 6f 64 20 70 65 72 73 69 73 method persis
2600: 74 20 7b 7d 20 7b 0a 09 73 65 74 20 74 69 64 20 t {} {..set tid
2610: 24 6d 79 63 73 74 79 70 65 28 24 6d 79 74 79 70 $mycstype($mytyp
2620: 65 29 0a 09 73 65 74 20 70 69 64 20 5b 24 6d 79 e)..set pid [$my
2630: 70 72 6f 6a 65 63 74 20 69 64 5d 0a 09 73 65 74 project id]..set
2640: 20 70 6f 73 20 30 0a 0a 09 73 74 61 74 65 20 74 pos 0...state t
2650: 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 09 20 20 ransaction {..
2660: 20 20 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 state run {...
2670: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 61 6e INSERT INTO chan
2680: 67 65 73 65 74 20 28 63 69 64 2c 20 20 20 70 69 geset (cid, pi
2690: 64 2c 20 20 74 79 70 65 2c 20 73 72 63 29 0a 09 d, type, src)..
26a0: 09 56 41 4c 55 45 53 20 20 20 20 20 20 20 20 20 .VALUES
26b0: 20 20 20 20 20 20 20 28 24 6d 79 69 64 2c 20 24 ($myid, $
26c0: 70 69 64 2c 20 24 74 69 64 2c 20 24 6d 79 73 72 pid, $tid, $mysr
26d0: 63 69 64 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 cid);.. }...
26e0: 20 20 20 66 6f 72 65 61 63 68 20 72 69 64 20 24 foreach rid $
26f0: 6d 79 72 65 76 69 73 69 6f 6e 73 20 7b 0a 09 09 myrevisions {...
2700: 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 20 20 state run {...
2710: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 73 INSERT INTO cs
2720: 72 65 76 69 73 69 6f 6e 20 28 63 69 64 2c 20 20 revision (cid,
2730: 20 70 6f 73 2c 20 20 72 69 64 29 0a 09 09 20 20 pos, rid)...
2740: 20 20 56 41 4c 55 45 53 20 20 20 20 20 20 20 20 VALUES
2750: 20 20 20 20 20 20 20 20 20 28 24 6d 79 69 64 2c ($myid,
2760: 20 24 70 6f 73 2c 20 24 72 69 64 29 3b 0a 09 09 $pos, $rid);...
2770: 7d 0a 09 09 69 6e 63 72 20 70 6f 73 0a 09 20 20 }...incr pos..
2780: 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 }..}..return.
2790: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 }.. method
27a0: 20 74 69 6d 65 72 61 6e 67 65 20 7b 7d 20 7b 20 timerange {} {
27b0: 72 65 74 75 72 6e 20 5b 24 6d 79 74 79 70 65 6f return [$mytypeo
27c0: 62 6a 20 74 69 6d 65 72 61 6e 67 65 20 24 6d 79 bj timerange $my
27d0: 72 65 76 69 73 69 6f 6e 73 5d 20 7d 0a 0a 20 20 revisions] }..
27e0: 20 20 6d 65 74 68 6f 64 20 64 72 6f 70 20 7b 7d method drop {}
27f0: 20 7b 0a 09 73 74 61 74 65 20 74 72 61 6e 73 61 {..state transa
2800: 63 74 69 6f 6e 20 7b 0a 09 20 20 20 20 73 74 61 ction {.. sta
2810: 74 65 20 72 75 6e 20 7b 0a 09 09 44 45 4c 45 54 te run {...DELET
2820: 45 20 46 52 4f 4d 20 63 68 61 6e 67 65 73 65 74 E FROM changeset
2830: 20 20 57 48 45 52 45 20 63 69 64 20 3d 20 24 6d WHERE cid = $m
2840: 79 69 64 3b 0a 09 09 44 45 4c 45 54 45 20 46 52 yid;...DELETE FR
2850: 4f 4d 20 63 73 72 65 76 69 73 69 6f 6e 20 57 48 OM csrevision WH
2860: 45 52 45 20 63 69 64 20 3d 20 24 6d 79 69 64 3b ERE cid = $myid;
2870: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 66 6f 72 65 .. }..}..fore
2880: 61 63 68 20 72 20 24 6d 79 72 65 76 69 73 69 6f ach r $myrevisio
2890: 6e 73 20 7b 0a 09 20 20 20 20 73 65 74 20 6b 65 ns {.. set ke
28a0: 79 20 5b 6c 69 73 74 20 24 6d 79 74 79 70 65 20 y [list $mytype
28b0: 24 72 5d 0a 09 20 20 20 20 75 6e 73 65 74 20 6d $r].. unset m
28c0: 79 72 65 76 6d 61 70 28 24 6b 65 79 29 0a 09 7d yrevmap($key)..}
28d0: 0a 09 73 65 74 20 70 6f 73 20 20 20 20 20 20 20 ..set pos
28e0: 20 20 20 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 [lsearch -exa
28f0: 63 74 20 24 6d 79 63 68 61 6e 67 65 73 65 74 73 ct $mychangesets
2900: 20 24 73 65 6c 66 5d 0a 09 73 65 74 20 6d 79 63 $self]..set myc
2910: 68 61 6e 67 65 73 65 74 73 20 5b 6c 72 65 70 6c hangesets [lrepl
2920: 61 63 65 20 24 6d 79 63 68 61 6e 67 65 73 65 74 ace $mychangeset
2930: 73 20 24 70 6f 73 20 24 70 6f 73 5d 0a 09 72 65 s $pos $pos]..re
2940: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 turn. }..
2950: 74 79 70 65 6d 65 74 68 6f 64 20 73 70 6c 69 74 typemethod split
2960: 20 7b 63 73 65 74 20 61 72 67 73 7d 20 7b 0a 09 {cset args} {..
2970: 23 20 41 73 20 70 61 72 74 20 6f 66 20 74 68 65 # As part of the
2980: 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 creation of the
2990: 20 6e 65 77 20 63 68 61 6e 67 65 73 65 74 73 20 new changesets
29a0: 73 70 65 63 69 66 69 65 64 20 69 6e 0a 09 23 20 specified in..#
29b0: 41 52 47 53 20 61 73 20 73 65 74 73 20 6f 66 20 ARGS as sets of
29c0: 72 65 76 69 73 69 6f 6e 73 2c 20 61 6c 6c 20 73 revisions, all s
29d0: 75 62 73 65 74 73 20 6f 66 20 43 53 45 54 27 73 ubsets of CSET's
29e0: 20 72 65 76 69 73 69 6f 6e 0a 09 23 20 73 65 74 revision..# set
29f0: 2c 20 43 53 45 54 20 77 69 6c 6c 20 62 65 20 64 , CSET will be d
2a00: 72 6f 70 70 65 64 20 66 72 6f 6d 20 61 6c 6c 20 ropped from all
2a10: 64 61 74 61 62 61 73 65 73 2c 20 69 6e 20 61 6e databases, in an
2a20: 64 20 6f 75 74 20 6f 66 0a 09 23 20 6d 65 6d 6f d out of..# memo
2a30: 72 79 2c 20 61 6e 64 20 74 68 65 6e 20 64 65 73 ry, and then des
2a40: 74 72 6f 79 65 64 2e 0a 09 23 0a 09 23 20 4e 6f troyed...#..# No
2a50: 74 65 3a 20 54 68 65 20 69 74 65 6d 20 6c 69 73 te: The item lis
2a60: 74 73 20 66 6f 75 6e 64 20 69 6e 20 61 72 67 73 ts found in args
2a70: 20 61 72 65 20 74 61 67 67 65 64 20 69 74 65 6d are tagged item
2a80: 73 2e 20 54 68 65 79 0a 09 23 20 68 61 76 65 20 s. They..# have
2a90: 74 6f 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 to have the same
2aa0: 20 74 79 70 65 20 61 73 20 74 68 65 20 63 68 61 type as the cha
2ab0: 6e 67 65 73 65 74 2c 20 62 65 69 6e 67 20 73 75 ngeset, being su
2ac0: 62 73 65 74 73 0a 09 23 20 6f 66 20 69 74 73 20 bsets..# of its
2ad0: 69 74 65 6d 73 2e 20 54 68 69 73 20 69 73 20 63 items. This is c
2ae0: 68 65 63 6b 65 64 20 69 6e 20 55 6e 74 61 67 31 hecked in Untag1
2af0: 2e 0a 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 ....struct::list
2b00: 20 61 73 73 69 67 6e 20 5b 24 63 73 65 74 20 64 assign [$cset d
2b10: 61 74 61 5d 20 70 72 6f 6a 65 63 74 20 63 73 74 ata] project cst
2b20: 79 70 65 20 63 73 73 72 63 0a 0a 09 24 63 73 65 ype cssrc...$cse
2b30: 74 20 64 72 6f 70 0a 09 24 63 73 65 74 20 64 65 t drop..$cset de
2b40: 73 74 72 6f 79 0a 0a 09 73 65 74 20 6e 65 77 63 stroy...set newc
2b50: 73 65 74 73 20 7b 7d 0a 09 66 6f 72 65 61 63 68 sets {}..foreach
2b60: 20 66 72 61 67 6d 65 6e 74 72 65 76 69 73 69 6f fragmentrevisio
2b70: 6e 73 20 24 61 72 67 73 20 7b 0a 09 20 20 20 20 ns $args {..
2b80: 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 integrity assert
2b90: 20 7b 0a 09 09 5b 6c 6c 65 6e 67 74 68 20 24 66 {...[llength $f
2ba0: 72 61 67 6d 65 6e 74 72 65 76 69 73 69 6f 6e 73 ragmentrevisions
2bb0: 5d 0a 09 20 20 20 20 7d 20 7b 41 74 74 65 6d 70 ].. } {Attemp
2bc0: 74 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e ted to create an
2bd0: 20 65 6d 70 74 79 20 63 68 61 6e 67 65 73 65 74 empty changeset
2be0: 2c 20 69 2e 65 2e 20 77 69 74 68 6f 75 74 20 72 , i.e. without r
2bf0: 65 76 69 73 69 6f 6e 73 7d 0a 09 20 20 20 20 6c evisions}.. l
2c00: 61 70 70 65 6e 64 20 6e 65 77 63 73 65 74 73 20 append newcsets
2c10: 5b 24 74 79 70 65 20 25 41 55 54 4f 25 20 24 70 [$type %AUTO% $p
2c20: 72 6f 6a 65 63 74 20 24 63 73 74 79 70 65 20 24 roject $cstype $
2c30: 63 73 73 72 63 20 5c 0a 09 09 09 09 20 20 5b 55 cssrc \..... [U
2c40: 6e 74 61 67 20 24 66 72 61 67 6d 65 6e 74 72 65 ntag $fragmentre
2c50: 76 69 73 69 6f 6e 73 20 24 63 73 74 79 70 65 5d visions $cstype]
2c60: 5d 0a 09 7d 0a 0a 09 66 6f 72 65 61 63 68 20 63 ]..}...foreach c
2c70: 20 24 6e 65 77 63 73 65 74 73 20 7b 20 24 63 20 $newcsets { $c
2c80: 70 65 72 73 69 73 74 20 7d 0a 09 72 65 74 75 72 persist }..retur
2c90: 6e 20 24 6e 65 77 63 73 65 74 73 0a 20 20 20 20 n $newcsets.
2ca0: 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f }.. typemetho
2cb0: 64 20 73 74 72 6c 69 73 74 20 7b 63 68 61 6e 67 d strlist {chang
2cc0: 65 73 65 74 73 7d 20 7b 0a 09 72 65 74 75 72 6e esets} {..return
2cd0: 20 5b 6a 6f 69 6e 20 5b 73 74 72 75 63 74 3a 3a [join [struct::
2ce0: 6c 69 73 74 20 6d 61 70 20 24 63 68 61 6e 67 65 list map $change
2cf0: 73 65 74 73 20 5b 6d 79 70 72 6f 63 20 49 44 5d sets [myproc ID]
2d00: 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 ]]. }.. pr
2d10: 6f 63 20 49 44 20 7b 63 73 65 74 7d 20 7b 20 24 oc ID {cset} { $
2d20: 63 73 65 74 20 73 74 72 20 7d 0a 0a 20 20 20 20 cset str }..
2d30: 70 72 6f 63 20 55 6e 74 61 67 20 7b 74 61 67 67 proc Untag {tagg
2d40: 65 64 69 74 65 6d 73 20 63 73 74 79 70 65 7d 20 editems cstype}
2d50: 7b 0a 09 72 65 74 75 72 6e 20 5b 73 74 72 75 63 {..return [struc
2d60: 74 3a 3a 6c 69 73 74 20 6d 61 70 20 24 74 61 67 t::list map $tag
2d70: 67 65 64 69 74 65 6d 73 20 5b 6d 79 70 72 6f 63 geditems [myproc
2d80: 20 55 6e 74 61 67 31 20 24 63 73 74 79 70 65 5d Untag1 $cstype]
2d90: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f ]. }.. pro
2da0: 63 20 55 6e 74 61 67 31 20 7b 63 73 74 79 70 65 c Untag1 {cstype
2db0: 20 74 68 65 69 74 65 6d 7d 20 7b 0a 09 73 74 72 theitem} {..str
2dc0: 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e uct::list assign
2dd0: 20 24 74 68 65 69 74 65 6d 20 74 20 69 0a 09 69 $theitem t i..i
2de0: 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 ntegrity assert
2df0: 7b 24 63 73 74 79 70 65 20 65 71 20 24 74 7d 20 {$cstype eq $t}
2e00: 7b 49 74 65 6d 20 24 69 27 73 20 74 79 70 65 20 {Item $i's type
2e10: 69 73 20 27 24 74 27 2c 20 65 78 70 65 63 74 65 is '$t', expecte
2e20: 64 20 27 24 63 73 74 79 70 65 27 7d 0a 09 72 65 d '$cstype'}..re
2e30: 74 75 72 6e 20 24 69 0a 20 20 20 20 7d 0a 0a 20 turn $i. }..
2e40: 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 # # ## ### ##
2e50: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 ### ######## ###
2e60: 23 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 ##########. #
2e70: 23 20 53 74 61 74 65 0a 0a 20 20 20 20 76 61 72 # State.. var
2e80: 69 61 62 6c 65 20 6d 79 69 64 20 20 20 20 20 20 iable myid
2e90: 20 20 7b 7d 20 3b 20 23 20 49 64 20 6f 66 20 74 {} ; # Id of t
2ea0: 68 65 20 63 73 65 74 20 66 6f 72 20 74 68 65 20 he cset for the
2eb0: 70 65 72 73 69 73 74 65 6e 74 0a 09 09 09 20 20 persistent....
2ec0: 20 20 20 20 23 20 73 74 61 74 65 2e 0a 20 20 20 # state..
2ed0: 20 76 61 72 69 61 62 6c 65 20 6d 79 70 72 6f 6a variable myproj
2ee0: 65 63 74 20 20 20 7b 7d 20 3b 20 23 20 52 65 66 ect {} ; # Ref
2ef0: 65 72 65 6e 63 65 20 6f 66 20 74 68 65 20 70 72 erence of the pr
2f00: 6f 6a 65 63 74 20 6f 62 6a 65 63 74 20 74 68 65 oject object the
2f10: 0a 09 09 09 20 20 20 20 20 20 23 20 63 68 61 6e .... # chan
2f20: 67 65 73 65 74 20 62 65 6c 6f 6e 67 73 20 74 6f geset belongs to
2f30: 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d .. variable m
2f40: 79 74 79 70 65 20 20 20 20 20 20 7b 7d 20 3b 20 ytype {} ;
2f50: 23 20 57 68 61 74 20 74 68 65 20 63 68 61 6e 67 # What the chang
2f60: 65 73 65 74 20 69 73 20 62 61 73 65 64 20 6f 6e eset is based on
2f70: 0a 09 09 09 20 20 20 20 20 20 23 20 28 72 65 76 .... # (rev
2f80: 69 73 69 6f 6e 73 2c 20 74 61 67 73 2c 20 6f 72 isions, tags, or
2f90: 20 62 72 61 6e 63 68 65 73 29 2e 0a 09 09 09 20 branches).....
2fa0: 20 20 20 20 20 23 20 56 61 6c 75 65 73 3a 20 53 # Values: S
2fb0: 65 65 20 6d 79 63 73 74 79 70 65 2e 20 4e 6f 74 ee mycstype. Not
2fc0: 65 20 74 68 61 74 20 77 65 0a 09 09 09 20 20 20 e that we....
2fd0: 20 20 20 23 20 68 61 76 65 20 74 6f 20 6b 65 65 # have to kee
2fe0: 70 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 p the names of t
2ff0: 68 65 20 68 65 6c 70 65 72 0a 09 09 09 20 20 20 he helper....
3000: 20 20 20 23 20 73 69 6e 67 6c 65 74 6f 6e 73 20 # singletons
3010: 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 in sync with the
3020: 20 63 6f 6e 74 65 6e 74 73 0a 09 09 09 20 20 20 contents....
3030: 20 20 20 23 20 6f 66 20 73 74 61 74 65 20 74 61 # of state ta
3040: 62 6c 65 20 27 63 73 74 79 70 65 27 2c 20 61 6e ble 'cstype', an
3050: 64 20 76 61 72 69 6f 75 73 0a 09 09 09 20 20 20 d various....
3060: 20 20 20 23 20 6f 74 68 65 72 20 70 6c 61 63 65 # other place
3070: 73 20 75 73 69 6e 67 20 74 68 65 6d 20 68 61 72 s using them har
3080: 64 77 69 72 65 64 2e 0a 20 20 20 20 76 61 72 69 dwired.. vari
3090: 61 62 6c 65 20 6d 79 74 79 70 65 6f 62 6a 20 20 able mytypeobj
30a0: 20 7b 7d 20 3b 20 23 20 52 65 66 65 72 65 6e 63 {} ; # Referenc
30b0: 65 20 74 6f 20 74 68 65 20 63 6f 6e 74 61 69 6e e to the contain
30c0: 65 72 20 66 6f 72 20 74 68 65 0a 09 09 09 20 20 er for the....
30d0: 20 20 20 20 23 20 74 79 70 65 20 64 65 70 65 6e # type depen
30e0: 64 65 6e 74 20 63 6f 64 65 2e 20 44 65 72 69 76 dent code. Deriv
30f0: 65 64 20 66 72 6f 6d 0a 09 09 09 20 20 20 20 20 ed from....
3100: 20 23 20 6d 79 74 79 70 65 2e 0a 20 20 20 20 76 # mytype.. v
3110: 61 72 69 61 62 6c 65 20 6d 79 73 72 63 69 64 20 ariable mysrcid
3120: 20 20 20 20 7b 7d 20 3b 20 23 20 49 64 20 6f 66 {} ; # Id of
3130: 20 74 68 65 20 6d 65 74 61 64 61 74 61 20 6f 72 the metadata or
3140: 20 73 79 6d 62 6f 6c 20 74 68 65 20 63 73 65 74 symbol the cset
3150: 0a 09 09 09 20 20 20 20 20 20 23 20 69 73 20 62 .... # is b
3160: 61 73 65 64 20 6f 6e 2e 0a 20 20 20 20 76 61 72 ased on.. var
3170: 69 61 62 6c 65 20 6d 79 72 65 76 69 73 69 6f 6e iable myrevision
3180: 73 20 7b 7d 20 3b 20 23 20 4c 69 73 74 20 6f 66 s {} ; # List of
3190: 20 74 68 65 20 66 69 6c 65 20 6c 65 76 65 6c 20 the file level
31a0: 72 65 76 69 73 69 6f 6e 73 2c 0a 09 09 09 20 20 revisions,....
31b0: 20 20 20 20 23 20 74 61 67 73 2c 20 6f 72 20 62 # tags, or b
31c0: 72 61 6e 63 68 65 73 20 69 6e 20 74 68 65 20 63 ranches in the c
31d0: 73 65 74 2c 20 61 73 0a 09 09 09 20 20 20 20 20 set, as....
31e0: 20 23 20 69 64 73 2e 20 4e 6f 74 20 74 61 67 67 # ids. Not tagg
31f0: 65 64 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 ed.. variable
3200: 20 6d 79 74 69 74 65 6d 73 20 20 20 20 7b 7d 20 mytitems {}
3210: 3b 20 23 20 41 73 20 6d 79 72 65 76 69 73 69 6f ; # As myrevisio
3220: 6e 73 2c 20 74 68 65 20 74 61 67 67 65 64 20 66 ns, the tagged f
3230: 6f 72 6d 2e 0a 20 20 20 20 76 61 72 69 61 62 6c orm.. variabl
3240: 65 20 6d 79 70 72 65 6d 61 70 20 20 20 20 7b 7d e mypremap {}
3250: 20 3b 20 23 20 44 69 63 74 69 6f 6e 61 72 79 20 ; # Dictionary
3260: 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 mapping from the
3270: 20 69 74 65 6d 73 20 28 74 61 67 67 65 64 20 6e items (tagged n
3280: 6f 77 29 0a 09 09 09 20 20 20 20 20 20 23 20 74 ow).... # t
3290: 6f 20 74 68 65 69 72 20 70 72 65 64 65 63 65 73 o their predeces
32a0: 73 6f 72 73 2c 20 61 6c 73 6f 20 74 61 67 67 65 sors, also tagge
32b0: 64 2e 20 41 0a 09 09 09 20 20 20 20 20 20 23 20 d. A.... #
32c0: 63 61 63 68 65 20 74 6f 20 61 76 6f 69 64 20 6c cache to avoid l
32d0: 6f 61 64 69 6e 67 20 74 68 69 73 20 66 72 6f 6d oading this from
32e0: 20 74 68 65 0a 09 09 09 20 20 20 20 20 20 23 20 the.... #
32f0: 73 74 61 74 65 20 6d 6f 72 65 20 74 68 61 6e 20 state more than
3300: 6f 6e 63 65 2e 0a 20 20 20 20 76 61 72 69 61 62 once.. variab
3310: 6c 65 20 6d 79 6e 65 78 74 6d 61 70 20 20 20 7b le mynextmap {
3320: 7d 20 3b 20 23 20 44 69 63 74 69 6f 6e 61 72 79 } ; # Dictionary
3330: 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 mapping from th
3340: 65 20 69 74 65 6d 73 20 28 74 61 67 67 65 64 29 e items (tagged)
3350: 0a 09 09 09 20 20 20 20 20 20 23 20 74 6f 20 74 .... # to t
3360: 68 65 69 72 20 73 75 63 63 65 73 73 6f 72 73 20 heir successors
3370: 28 61 6c 73 6f 20 74 61 67 67 65 64 29 2e 20 41 (also tagged). A
3380: 0a 09 09 09 20 20 20 20 20 20 23 20 63 61 63 68 .... # cach
3390: 65 20 74 6f 20 61 76 6f 69 64 20 6c 6f 61 64 69 e to avoid loadi
33a0: 6e 67 20 74 68 69 73 20 66 72 6f 6d 20 74 68 65 ng this from the
33b0: 0a 09 09 09 20 20 20 20 20 20 23 20 73 74 61 74 .... # stat
33c0: 65 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 e more than once
33d0: 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d .. variable m
33e0: 79 70 6f 73 20 20 20 20 20 20 20 7b 7d 20 3b 20 ypos {} ;
33f0: 23 20 43 6f 6d 6d 69 74 20 70 6f 73 69 74 69 6f # Commit positio
3400: 6e 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73 n of the changes
3410: 65 74 2c 20 69 66 0a 09 09 09 20 20 20 20 20 20 et, if....
3420: 23 20 6b 6e 6f 77 6e 2e 0a 0a 20 20 20 20 23 20 # known... #
3430: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 # ## ### ##### #
3440: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 ####### ########
3450: 23 23 23 23 23 0a 20 20 20 20 23 23 20 49 6e 74 #####. ## Int
3460: 65 72 6e 61 6c 20 6d 65 74 68 6f 64 73 0a 0a 20 ernal methods..
3470: 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 typevariable
3480: 6d 79 63 6f 75 6e 74 65 72 20 20 20 20 20 20 20 mycounter
3490: 20 30 20 3b 20 23 20 49 64 20 63 6f 75 6e 74 65 0 ; # Id counte
34a0: 72 20 66 6f 72 20 63 73 65 74 73 2e 20 4c 61 73 r for csets. Las
34b0: 74 20 69 64 0a 09 09 09 09 20 20 20 20 20 20 23 t id..... #
34c0: 20 75 73 65 64 2e 0a 20 20 20 20 74 79 70 65 76 used.. typev
34d0: 61 72 69 61 62 6c 65 20 6d 79 63 73 74 79 70 65 ariable mycstype
34e0: 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d -array {} ; # M
34f0: 61 70 20 63 73 74 79 70 65 73 20 28 6e 61 6d 65 ap cstypes (name
3500: 73 29 20 74 6f 20 70 65 72 73 69 73 74 65 6e 74 s) to persistent
3510: 0a 09 09 09 09 20 20 20 20 20 20 23 20 69 64 73 ..... # ids
3520: 2e 20 4e 6f 74 65 20 74 68 61 74 20 77 65 20 68 . Note that we h
3530: 61 76 65 20 74 6f 20 6b 65 65 70 0a 09 09 09 09 ave to keep.....
3540: 20 20 20 20 20 20 23 20 74 68 65 20 6e 61 6d 65 # the name
3550: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 27 s in the table '
3560: 63 73 74 79 70 65 27 0a 09 09 09 09 20 20 20 20 cstype'.....
3570: 20 20 23 20 69 6e 20 73 79 6e 63 20 77 69 74 68 # in sync with
3580: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 the names of th
3590: 65 0a 09 09 09 09 20 20 20 20 20 20 23 20 68 65 e..... # he
35a0: 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 73 2e lper singletons.
35b0: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 .. typemethod
35c0: 20 67 65 74 63 73 74 79 70 65 73 20 7b 7d 20 7b getcstypes {} {
35d0: 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 6e ..foreach {tid n
35e0: 61 6d 65 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 ame} [state run
35f0: 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 74 69 {.. SELECT ti
3600: 64 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 63 73 74 d, name FROM cst
3610: 79 70 65 3b 0a 09 7d 5d 20 7b 20 73 65 74 20 6d ype;..}] { set m
3620: 79 63 73 74 79 70 65 28 24 6e 61 6d 65 29 20 24 ycstype($name) $
3630: 74 69 64 20 7d 0a 09 72 65 74 75 72 6e 0a 20 20 tid }..return.
3640: 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 }.. typemet
3650: 68 6f 64 20 6c 6f 61 64 63 6f 75 6e 74 65 72 20 hod loadcounter
3660: 7b 7d 20 7b 0a 09 23 20 49 6e 69 74 69 61 6c 69 {} {..# Initiali
3670: 7a 65 20 74 68 65 20 63 6f 75 6e 74 65 72 20 66 ze the counter f
3680: 72 6f 6d 20 74 68 65 20 73 74 61 74 65 0a 09 73 rom the state..s
3690: 65 74 20 6d 79 63 6f 75 6e 74 65 72 20 5b 73 74 et mycounter [st
36a0: 61 74 65 20 6f 6e 65 20 7b 20 53 45 4c 45 43 54 ate one { SELECT
36b0: 20 4d 41 58 28 63 69 64 29 20 46 52 4f 4d 20 63 MAX(cid) FROM c
36c0: 68 61 6e 67 65 73 65 74 20 7d 5d 0a 09 72 65 74 hangeset }]..ret
36d0: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 urn. }.. t
36e0: 79 70 65 6d 65 74 68 6f 64 20 6e 75 6d 20 7b 7d ypemethod num {}
36f0: 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 63 6f 75 { return $mycou
3700: 6e 74 65 72 20 7d 0a 0a 20 20 20 20 70 72 6f 63 nter }.. proc
3710: 20 49 6e 69 74 69 61 6c 69 7a 65 42 72 65 61 6b InitializeBreak
3720: 53 74 61 74 65 20 7b 72 65 76 69 73 69 6f 6e 73 State {revisions
3730: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 70 6f 73 } {..upvar 1 pos
3740: 20 70 6f 73 20 63 72 6f 73 73 20 63 72 6f 73 73 pos cross cross
3750: 20 72 61 6e 67 65 20 72 61 6e 67 65 20 64 65 70 range range dep
3760: 63 20 64 65 70 63 20 64 65 6c 74 61 20 64 65 6c c depc delta del
3770: 74 61 20 5c 0a 09 20 20 20 20 64 65 70 65 6e 64 ta \.. depend
3780: 65 6e 63 69 65 73 20 64 65 70 65 6e 64 65 6e 63 encies dependenc
3790: 69 65 73 0a 0a 09 23 20 46 69 72 73 74 20 77 65 ies...# First we
37a0: 20 63 72 65 61 74 65 20 61 20 6d 61 70 20 6f 66 create a map of
37b0: 20 70 6f 73 69 74 69 6f 6e 73 20 74 6f 20 6d 61 positions to ma
37c0: 6b 65 20 69 74 20 65 61 73 69 65 72 20 74 6f 0a ke it easier to.
37d0: 09 23 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 .# determine whe
37e0: 74 68 65 72 20 61 20 64 65 70 65 6e 64 65 6e 63 ther a dependenc
37f0: 79 20 63 72 6f 73 73 65 73 20 61 20 70 61 72 74 y crosses a part
3800: 69 63 75 6c 61 72 20 69 6e 64 65 78 2e 0a 0a 09 icular index....
3810: 61 72 72 61 79 20 73 65 74 20 70 6f 73 20 20 20 array set pos
3820: 7b 7d 0a 09 61 72 72 61 79 20 73 65 74 20 63 72 {}..array set cr
3830: 6f 73 73 20 7b 7d 0a 09 61 72 72 61 79 20 73 65 oss {}..array se
3840: 74 20 64 65 70 63 20 20 7b 7d 0a 09 73 65 74 20 t depc {}..set
3850: 72 61 6e 67 65 20 20 20 20 20 20 20 7b 7d 0a 09 range {}..
3860: 73 65 74 20 6e 20 30 0a 09 66 6f 72 65 61 63 68 set n 0..foreach
3870: 20 72 65 76 20 24 72 65 76 69 73 69 6f 6e 73 20 rev $revisions
3880: 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 72 {.. lappend r
3890: 61 6e 67 65 20 24 6e 0a 09 20 20 20 20 73 65 74 ange $n.. set
38a0: 20 70 6f 73 28 24 72 65 76 29 20 24 6e 0a 09 20 pos($rev) $n..
38b0: 20 20 20 73 65 74 20 63 72 6f 73 73 28 24 6e 29 set cross($n)
38c0: 20 30 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09 0.. incr n..
38d0: 7d 0a 0a 09 23 20 53 65 63 6f 6e 64 6c 79 20 77 }...# Secondly w
38e0: 65 20 63 6f 75 6e 74 20 74 68 65 20 63 72 6f 73 e count the cros
38f0: 73 69 6e 67 73 20 70 65 72 20 70 6f 73 69 74 69 sings per positi
3900: 6f 6e 2c 20 62 79 20 69 74 65 72 61 74 69 6e 67 on, by iterating
3910: 0a 09 23 20 6f 76 65 72 20 74 68 65 20 72 65 63 ..# over the rec
3920: 6f 72 64 65 64 20 69 6e 74 65 72 6e 61 6c 20 64 orded internal d
3930: 65 70 65 6e 64 65 6e 63 69 65 73 2e 0a 0a 09 23 ependencies....#
3940: 20 4e 6f 74 65 3a 20 49 66 20 74 68 65 20 74 69 Note: If the ti
3950: 6d 65 73 74 61 6d 70 73 20 61 72 65 20 62 61 64 mestamps are bad
3960: 6c 79 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 20 ly out of order
3970: 69 74 20 69 73 0a 09 23 20 20 20 20 20 20 20 70 it is..# p
3980: 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20 ossible to have
3990: 61 20 62 61 63 6b 77 61 72 64 20 73 75 63 63 65 a backward succe
39a0: 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 79 2c ssor dependency,
39b0: 0a 09 23 20 20 20 20 20 20 20 69 2e 65 2e 20 77 ..# i.e. w
39c0: 69 74 68 20 73 74 61 72 74 20 3e 20 65 6e 64 2e ith start > end.
39d0: 20 57 65 20 6d 61 79 20 68 61 76 65 20 74 6f 20 We may have to
39e0: 73 77 61 70 20 74 68 65 20 69 6e 64 69 63 65 73 swap the indices
39f0: 0a 09 23 20 20 20 20 20 20 20 74 6f 20 65 6e 73 ..# to ens
3a00: 75 72 65 20 74 68 61 74 20 74 68 65 20 66 6f 6c ure that the fol
3a10: 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 lowing loop runs
3a20: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 09 23 0a 09 correctly...#..
3a30: 23 20 4e 6f 74 65 20 32 3a 20 73 74 61 72 74 20 # Note 2: start
3a40: 3d 3d 20 65 6e 64 20 69 73 20 6e 6f 74 20 70 6f == end is not po
3a50: 73 73 69 62 6c 65 2e 20 49 74 20 69 6e 64 69 63 ssible. It indic
3a60: 61 74 65 73 20 61 0a 09 23 20 20 20 20 20 20 20 ates a..#
3a70: 20 20 73 65 6c 66 2d 64 65 70 65 6e 64 65 6e 63 self-dependenc
3a80: 79 20 64 75 65 20 74 6f 20 74 68 65 20 75 6e 69 y due to the uni
3a90: 71 75 65 6e 65 73 73 20 6f 66 20 70 6f 73 69 74 queness of posit
3aa0: 69 6f 6e 73 2c 0a 09 23 20 20 20 20 20 20 20 20 ions,..#
3ab0: 20 61 6e 64 20 74 68 61 74 20 69 73 20 73 6f 6d and that is som
3ac0: 65 74 68 69 6e 67 20 77 65 20 68 61 76 65 20 72 ething we have r
3ad0: 75 6c 65 64 20 6f 75 74 20 61 6c 72 65 61 64 79 uled out already
3ae0: 2c 20 73 65 65 0a 09 23 20 20 20 20 20 20 20 20 , see..#
3af0: 20 27 72 65 76 20 69 6e 74 65 72 6e 61 6c 73 75 'rev internalsu
3b00: 63 63 65 73 73 6f 72 73 27 2e 0a 0a 09 66 6f 72 ccessors'....for
3b10: 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 72 each {rid childr
3b20: 65 6e 7d 20 5b 61 72 72 61 79 20 67 65 74 20 64 en} [array get d
3b30: 65 70 65 6e 64 65 6e 63 69 65 73 5d 20 7b 0a 09 ependencies] {..
3b40: 20 20 20 20 66 6f 72 65 61 63 68 20 63 68 69 6c foreach chil
3b50: 64 20 24 63 68 69 6c 64 72 65 6e 20 7b 0a 09 09 d $children {...
3b60: 73 65 74 20 64 6b 65 79 20 20 20 20 5b 6c 69 73 set dkey [lis
3b70: 74 20 24 72 69 64 20 24 63 68 69 6c 64 5d 0a 09 t $rid $child]..
3b80: 09 73 65 74 20 73 74 61 72 74 20 20 20 24 70 6f .set start $po
3b90: 73 28 24 72 69 64 29 0a 09 09 73 65 74 20 65 6e s($rid)...set en
3ba0: 64 20 20 20 20 20 24 70 6f 73 28 24 63 68 69 6c d $pos($chil
3bb0: 64 29 0a 09 09 73 65 74 20 63 72 6f 73 73 65 73 d)...set crosses
3bc0: 20 7b 7d 0a 0a 09 09 69 66 20 7b 24 73 74 61 72 {}....if {$star
3bd0: 74 20 3e 20 24 65 6e 64 7d 20 7b 0a 09 09 20 20 t > $end} {...
3be0: 20 20 77 68 69 6c 65 20 7b 24 65 6e 64 20 3c 20 while {$end <
3bf0: 24 73 74 61 72 74 7d 20 7b 0a 09 09 09 6c 61 70 $start} {....lap
3c00: 70 65 6e 64 20 63 72 6f 73 73 65 73 20 24 65 6e pend crosses $en
3c10: 64 0a 09 09 09 69 6e 63 72 20 63 72 6f 73 73 28 d....incr cross(
3c20: 24 65 6e 64 29 0a 09 09 09 69 6e 63 72 20 65 6e $end)....incr en
3c30: 64 0a 09 09 20 20 20 20 7d 0a 09 09 7d 20 65 6c d... }...} el
3c40: 73 65 20 7b 0a 09 09 20 20 20 20 77 68 69 6c 65 se {... while
3c50: 20 7b 24 73 74 61 72 74 20 3c 20 24 65 6e 64 7d {$start < $end}
3c60: 20 7b 0a 09 09 09 6c 61 70 70 65 6e 64 20 63 72 {....lappend cr
3c70: 6f 73 73 65 73 20 24 73 74 61 72 74 0a 09 09 09 osses $start....
3c80: 69 6e 63 72 20 63 72 6f 73 73 28 24 73 74 61 72 incr cross($star
3c90: 74 29 0a 09 09 09 69 6e 63 72 20 73 74 61 72 74 t)....incr start
3ca0: 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 09 73 ... }...}...s
3cb0: 65 74 20 64 65 70 63 28 24 64 6b 65 79 29 20 24 et depc($dkey) $
3cc0: 63 72 6f 73 73 65 73 0a 09 20 20 20 20 7d 0a 09 crosses.. }..
3cd0: 7d 0a 0a 09 49 6e 69 74 69 61 6c 69 7a 65 44 65 }...InitializeDe
3ce0: 6c 74 61 73 20 24 72 65 76 69 73 69 6f 6e 73 0a ltas $revisions.
3cf0: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 .return. }..
3d00: 20 20 20 70 72 6f 63 20 49 6e 69 74 69 61 6c 69 proc Initiali
3d10: 7a 65 44 65 6c 74 61 73 20 7b 72 65 76 69 73 69 zeDeltas {revisi
3d20: 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 ons} {..upvar 1
3d30: 64 65 6c 74 61 20 64 65 6c 74 61 0a 0a 09 23 20 delta delta...#
3d40: 50 75 6c 6c 20 74 68 65 20 74 69 6d 65 73 74 61 Pull the timesta
3d50: 6d 70 73 20 66 6f 72 20 61 6c 6c 20 72 65 76 69 mps for all revi
3d60: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 63 68 61 sions in the cha
3d70: 6e 67 65 73 65 74 73 20 61 6e 64 0a 09 23 20 63 ngesets and..# c
3d80: 6f 6d 70 75 74 65 20 74 68 65 69 72 20 64 65 6c ompute their del
3d90: 74 61 73 20 66 6f 72 20 75 73 65 20 62 79 20 74 tas for use by t
3da0: 68 65 20 62 72 65 61 6b 20 66 69 6e 64 65 72 2e he break finder.
3db0: 0a 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 6c ...array set del
3dc0: 74 61 20 7b 7d 0a 09 61 72 72 61 79 20 73 65 74 ta {}..array set
3dd0: 20 73 74 61 6d 70 20 7b 7d 0a 0a 09 73 65 74 20 stamp {}...set
3de0: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 theset ('[join $
3df0: 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d revisions {','}]
3e00: 27 29 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 ')..foreach {rid
3e10: 20 74 69 6d 65 7d 20 5b 73 74 61 74 65 20 72 75 time} [state ru
3e20: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 n ".. SELECT
3e30: 52 2e 72 69 64 2c 20 52 2e 64 61 74 65 0a 09 20 R.rid, R.date..
3e40: 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e FROM revision
3e50: 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e R.. WHERE R.
3e60: 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 rid IN $theset..
3e70: 22 5d 20 7b 0a 09 20 20 20 20 73 65 74 20 73 74 "] {.. set st
3e80: 61 6d 70 28 24 72 69 64 29 20 24 74 69 6d 65 0a amp($rid) $time.
3e90: 09 7d 0a 0a 09 73 65 74 20 6e 20 30 0a 09 66 6f .}...set n 0..fo
3ea0: 72 65 61 63 68 20 72 69 64 20 5b 6c 72 61 6e 67 reach rid [lrang
3eb0: 65 20 24 72 65 76 69 73 69 6f 6e 73 20 30 20 65 e $revisions 0 e
3ec0: 6e 64 2d 31 5d 20 72 6e 65 78 74 20 5b 6c 72 61 nd-1] rnext [lra
3ed0: 6e 67 65 20 24 72 65 76 69 73 69 6f 6e 73 20 31 nge $revisions 1
3ee0: 20 65 6e 64 5d 20 7b 0a 09 20 20 20 20 73 65 74 end] {.. set
3ef0: 20 64 65 6c 74 61 28 24 6e 29 20 5b 65 78 70 72 delta($n) [expr
3f00: 20 7b 24 73 74 61 6d 70 28 24 72 6e 65 78 74 29 {$stamp($rnext)
3f10: 20 2d 20 24 73 74 61 6d 70 28 24 72 69 64 29 7d - $stamp($rid)}
3f20: 5d 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d ].. incr n..}
3f30: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a ..return. }..
3f40: 20 20 20 20 70 72 6f 63 20 46 69 6e 64 42 65 73 proc FindBes
3f50: 74 42 72 65 61 6b 20 7b 72 61 6e 67 65 7d 20 7b tBreak {range} {
3f60: 0a 09 75 70 76 61 72 20 31 20 63 72 6f 73 73 20 ..upvar 1 cross
3f70: 63 72 6f 73 73 20 64 65 6c 74 61 20 64 65 6c 74 cross delta delt
3f80: 61 0a 0a 09 23 20 44 65 74 65 72 6d 69 6e 65 20 a...# Determine
3f90: 74 68 65 20 62 65 73 74 20 62 72 65 61 6b 20 6c the best break l
3fa0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 67 ocation in the g
3fb0: 69 76 65 6e 20 72 61 6e 67 65 20 6f 66 0a 09 23 iven range of..#
3fc0: 20 70 6f 73 69 74 69 6f 6e 73 2e 20 46 69 72 73 positions. Firs
3fd0: 74 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 68 t we look for th
3fe0: 65 20 6c 6f 63 61 74 69 6f 6e 73 20 77 69 74 68 e locations with
3ff0: 20 74 68 65 20 6d 61 78 69 6d 61 6c 0a 09 23 20 the maximal..#
4000: 6e 75 6d 62 65 72 20 6f 66 20 63 72 6f 73 73 69 number of crossi
4010: 6e 67 73 2e 20 49 66 20 74 68 65 72 65 20 61 72 ngs. If there ar
4020: 65 20 73 65 76 65 72 61 6c 20 77 65 20 6c 6f 6f e several we loo
4030: 6b 20 66 6f 72 20 74 68 65 0a 09 23 20 73 68 6f k for the..# sho
4040: 72 74 65 73 74 20 74 69 6d 65 20 69 6e 74 65 72 rtest time inter
4050: 76 61 6c 20 61 6d 6f 6e 67 20 74 68 65 6d 2e 20 val among them.
4060: 49 66 20 77 65 20 73 74 69 6c 6c 20 68 61 76 65 If we still have
4070: 20 6d 75 6c 74 69 70 6c 65 0a 09 23 20 70 6f 73 multiple..# pos
4080: 73 69 62 69 6c 69 74 69 65 73 20 61 66 74 65 72 sibilities after
4090: 20 74 68 61 74 20 77 65 20 73 65 6c 65 63 74 20 that we select
40a0: 74 68 65 20 65 61 72 6c 69 65 73 74 20 6c 6f 63 the earliest loc
40b0: 61 74 69 6f 6e 0a 09 23 20 61 6d 6f 6e 67 20 74 ation..# among t
40c0: 68 65 73 65 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 hese....# Note:
40d0: 49 66 20 74 68 65 20 6d 61 78 69 6d 61 6c 20 6e If the maximal n
40e0: 75 6d 62 65 72 20 6f 66 20 63 72 6f 73 73 69 6e umber of crossin
40f0: 67 73 20 69 73 20 30 20 74 68 65 6e 20 74 68 65 gs is 0 then the
4100: 20 72 61 6e 67 65 0a 09 23 20 20 20 20 20 20 20 range..#
4110: 68 61 73 20 6e 6f 20 69 6e 74 65 72 6e 61 6c 20 has no internal
4120: 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 6e dependencies, an
4130: 64 20 6e 6f 20 62 72 65 61 6b 20 6c 6f 63 61 74 d no break locat
4140: 69 6f 6e 20 61 74 0a 09 23 20 20 20 20 20 20 20 ion at..#
4150: 61 6c 6c 2e 20 54 68 69 73 20 70 6f 73 73 69 62 all. This possib
4160: 69 6c 69 74 79 20 69 73 20 73 69 67 6e 61 6c 65 ility is signale
4170: 64 20 76 69 61 20 72 65 73 75 6c 74 20 2d 31 2e d via result -1.
4180: 0a 0a 09 23 20 4e 6f 74 65 3a 20 41 20 72 61 6e ...# Note: A ran
4190: 67 65 20 6f 66 20 6c 65 6e 67 74 68 20 31 20 6f ge of length 1 o
41a0: 72 20 6c 65 73 73 20 63 61 6e 6e 6f 74 20 68 61 r less cannot ha
41b0: 76 65 20 69 6e 74 65 72 6e 61 6c 0a 09 23 20 20 ve internal..#
41c0: 20 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65 dependencie
41d0: 73 2c 20 61 73 20 74 68 61 74 20 6e 65 65 64 73 s, as that needs
41e0: 20 61 74 20 6c 65 61 73 74 20 74 77 6f 20 72 65 at least two re
41f0: 76 69 73 69 6f 6e 73 20 69 6e 0a 09 23 20 20 20 visions in..#
4200: 20 20 20 20 74 68 65 20 72 61 6e 67 65 2e 0a 0a the range...
4210: 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 72 .if {[llength $r
4220: 61 6e 67 65 5d 20 3c 20 32 7d 20 7b 20 72 65 74 ange] < 2} { ret
4230: 75 72 6e 20 2d 31 20 7d 0a 0a 09 73 65 74 20 6d urn -1 }...set m
4240: 61 78 20 2d 31 0a 09 73 65 74 20 62 65 73 74 20 ax -1..set best
4250: 7b 7d 0a 0a 09 66 6f 72 65 61 63 68 20 6c 6f 63 {}...foreach loc
4260: 61 74 69 6f 6e 20 24 72 61 6e 67 65 20 7b 0a 09 ation $range {..
4270: 20 20 20 20 73 65 74 20 63 72 6f 73 73 69 6e 67 set crossing
4280: 73 20 24 63 72 6f 73 73 28 24 6c 6f 63 61 74 69 s $cross($locati
4290: 6f 6e 29 0a 09 20 20 20 20 69 66 20 7b 24 63 72 on).. if {$cr
42a0: 6f 73 73 69 6e 67 73 20 3e 20 24 6d 61 78 7d 20 ossings > $max}
42b0: 7b 0a 09 09 73 65 74 20 6d 61 78 20 20 24 63 72 {...set max $cr
42c0: 6f 73 73 69 6e 67 73 0a 09 09 73 65 74 20 62 65 ossings...set be
42d0: 73 74 20 5b 6c 69 73 74 20 24 6c 6f 63 61 74 69 st [list $locati
42e0: 6f 6e 5d 0a 09 09 63 6f 6e 74 69 6e 75 65 0a 09 on]...continue..
42f0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 } elseif {$c
4300: 72 6f 73 73 69 6e 67 73 20 3d 3d 20 24 6d 61 78 rossings == $max
4310: 7d 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 62 65 } {...lappend be
4320: 73 74 20 24 6c 6f 63 61 74 69 6f 6e 0a 09 20 20 st $location..
4330: 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b 24 6d 61 }..}...if {$ma
4340: 78 20 3d 3d 20 30 7d 20 20 20 20 20 20 20 20 20 x == 0}
4350: 20 20 20 7b 20 72 65 74 75 72 6e 20 2d 31 20 7d { return -1 }
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 73 65 74 20 6c 6f st 0] }...set lo
43a0: 63 61 74 69 6f 6e 73 20 24 62 65 73 74 0a 09 73 cations $best..s
43b0: 65 74 20 62 65 73 74 20 7b 7d 0a 09 73 65 74 20 et best {}..set
43c0: 6d 69 6e 20 2d 31 0a 0a 09 66 6f 72 65 61 63 68 min -1...foreach
43d0: 20 6c 6f 63 61 74 69 6f 6e 20 24 6c 6f 63 61 74 location $locat
43e0: 69 6f 6e 73 20 7b 0a 09 20 20 20 20 73 65 74 20 ions {.. set
43f0: 69 6e 74 65 72 76 61 6c 20 24 64 65 6c 74 61 28 interval $delta(
4400: 24 6c 6f 63 61 74 69 6f 6e 29 0a 09 20 20 20 20 $location)..
4410: 69 66 20 7b 28 24 6d 69 6e 20 3c 20 30 29 20 7c if {($min < 0) |
4420: 7c 20 28 24 69 6e 74 65 72 76 61 6c 20 3c 20 24 | ($interval < $
4430: 6d 69 6e 29 7d 20 7b 0a 09 09 73 65 74 20 6d 69 min)} {...set mi
4440: 6e 20 20 24 69 6e 74 65 72 76 61 6c 0a 09 09 73 n $interval...s
4450: 65 74 20 62 65 73 74 20 5b 6c 69 73 74 20 24 6c et best [list $l
4460: 6f 63 61 74 69 6f 6e 5d 0a 09 20 20 20 20 7d 20 ocation].. }
4470: 65 6c 73 65 69 66 20 7b 24 69 6e 74 65 72 76 61 elseif {$interva
4480: 6c 20 3d 3d 20 24 6d 69 6e 7d 20 7b 0a 09 09 6c l == $min} {...l
4490: 61 70 70 65 6e 64 20 62 65 73 74 20 24 6c 6f 63 append best $loc
44a0: 61 74 69 6f 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a ation.. }..}.
44b0: 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 ..if {[llength $
44c0: 62 65 73 74 5d 20 3d 3d 20 31 7d 20 7b 20 72 65 best] == 1} { re
44d0: 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 62 65 turn [lindex $be
44e0: 73 74 20 30 5d 20 7d 0a 0a 09 72 65 74 75 72 6e st 0] }...return
44f0: 20 5b 6c 69 6e 64 65 78 20 5b 6c 73 6f 72 74 20 [lindex [lsort
4500: 2d 69 6e 74 65 67 65 72 20 2d 69 6e 63 72 65 61 -integer -increa
4510: 73 69 6e 67 20 24 62 65 73 74 5d 20 30 5d 0a 20 sing $best] 0].
4520: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 43 }.. proc C
4530: 75 74 41 74 20 7b 6c 6f 63 61 74 69 6f 6e 7d 20 utAt {location}
4540: 7b 0a 09 75 70 76 61 72 20 31 20 63 72 6f 73 73 {..upvar 1 cross
4550: 20 63 72 6f 73 73 20 64 65 70 63 20 64 65 70 63 cross depc depc
4560: 0a 0a 09 23 20 49 74 20 77 61 73 20 64 65 63 69 ...# It was deci
4570: 64 65 64 20 74 6f 20 73 70 6c 69 74 20 74 68 65 ded to split the
4580: 20 63 68 61 6e 67 65 73 65 74 20 61 74 20 74 68 changeset at th
4590: 65 20 67 69 76 65 6e 0a 09 23 20 6c 6f 63 61 74 e given..# locat
45a0: 69 6f 6e 2e 20 54 68 69 73 20 63 75 74 73 20 61 ion. This cuts a
45b0: 20 6e 75 6d 62 65 72 20 6f 66 20 64 65 70 65 6e number of depen
45c0: 64 65 6e 63 69 65 73 2e 20 48 65 72 65 20 77 65 dencies. Here we
45d0: 20 75 70 64 61 74 65 0a 09 23 20 74 68 65 20 63 update..# the c
45e0: 72 6f 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e ross information
45f0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 62 72 65 so that the bre
4600: 61 6b 20 66 69 6e 64 65 72 20 68 61 73 20 61 63 ak finder has ac
4610: 63 75 72 61 74 65 0a 09 23 20 64 61 74 61 20 77 curate..# data w
4620: 68 65 6e 20 77 65 20 6c 6f 6f 6b 20 61 74 20 74 hen we look at t
4630: 68 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 61 he generated fra
4640: 67 6d 65 6e 74 73 2e 0a 0a 09 73 65 74 20 73 69 gments....set si
4650: 78 20 5b 6c 6f 67 20 76 69 73 69 62 6c 65 3f 20 x [log visible?
4660: 36 5d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 64 65 6]...foreach {de
4670: 70 20 72 61 6e 67 65 7d 20 5b 61 72 72 61 79 20 p range} [array
4680: 67 65 74 20 64 65 70 63 5d 20 7b 0a 09 20 20 20 get depc] {..
4690: 20 23 20 43 68 65 63 6b 20 61 6c 6c 20 64 65 70 # Check all dep
46a0: 65 6e 64 65 6e 63 69 65 73 20 73 74 69 6c 6c 20 endencies still
46b0: 6b 6e 6f 77 6e 2c 20 74 61 6b 65 20 74 68 65 69 known, take thei
46c0: 72 20 72 61 6e 67 65 20 61 6e 64 0a 09 20 20 20 r range and..
46d0: 20 23 20 73 65 65 20 69 66 20 74 68 65 20 62 72 # see if the br
46e0: 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 66 61 6c eak location fal
46f0: 6c 73 20 77 69 74 68 69 6e 2e 0a 0a 09 20 20 20 ls within....
4700: 20 42 6f 72 64 65 72 20 24 72 61 6e 67 65 20 73 Border $range s
4710: 20 65 0a 09 20 20 20 20 69 66 20 7b 24 6c 6f 63 e.. if {$loc
4720: 61 74 69 6f 6e 20 3c 20 24 73 7d 20 63 6f 6e 74 ation < $s} cont
4730: 69 6e 75 65 20 3b 20 23 20 62 72 65 61 6b 20 62 inue ; # break b
4740: 65 66 6f 72 65 20 72 61 6e 67 65 2c 20 69 67 6e efore range, ign
4750: 6f 72 65 0a 09 20 20 20 20 69 66 20 7b 24 6c 6f ore.. if {$lo
4760: 63 61 74 69 6f 6e 20 3e 20 24 65 7d 20 63 6f 6e cation > $e} con
4770: 74 69 6e 75 65 20 3b 20 23 20 62 72 65 61 6b 20 tinue ; # break
4780: 61 66 74 65 72 20 72 61 6e 67 65 2c 20 69 67 6e after range, ign
4790: 6f 72 65 2e 0a 0a 09 20 20 20 20 23 20 54 68 69 ore.... # Thi
47a0: 73 20 64 65 70 65 6e 64 65 6e 63 79 20 63 72 6f s dependency cro
47b0: 73 73 65 73 20 74 68 65 20 62 72 65 61 6b 20 6c sses the break l
47c0: 6f 63 61 74 69 6f 6e 2e 20 57 65 20 72 65 6d 6f ocation. We remo
47d0: 76 65 20 69 74 0a 09 20 20 20 20 23 20 66 72 6f ve it.. # fro
47e0: 6d 20 74 68 65 20 63 72 6f 73 73 69 6e 67 73 20 m the crossings
47f0: 63 6f 75 6e 74 65 72 73 2c 20 61 6e 64 20 74 68 counters, and th
4800: 65 6e 20 61 6c 73 6f 20 66 72 6f 6d 20 74 68 65 en also from the
4810: 20 73 65 74 0a 09 20 20 20 20 23 20 6f 66 20 6b set.. # of k
4820: 6e 6f 77 6e 20 64 65 70 65 6e 64 65 6e 63 69 65 nown dependencie
4830: 73 2c 20 61 73 20 77 65 20 61 72 65 20 64 6f 6e s, as we are don
4840: 65 20 77 69 74 68 20 69 74 2e 0a 0a 09 20 20 20 e with it....
4850: 20 66 6f 72 65 61 63 68 20 6c 6f 63 20 24 64 65 foreach loc $de
4860: 70 63 28 24 64 65 70 29 20 7b 20 69 6e 63 72 20 pc($dep) { incr
4870: 63 72 6f 73 73 28 24 6c 6f 63 29 20 2d 31 20 7d cross($loc) -1 }
4880: 0a 09 20 20 20 20 75 6e 73 65 74 20 64 65 70 63 .. unset depc
4890: 28 24 64 65 70 29 0a 0a 09 20 20 20 20 69 66 20 ($dep)... if
48a0: 7b 21 24 73 69 78 7d 20 63 6f 6e 74 69 6e 75 65 {!$six} continue
48b0: 0a 0a 09 20 20 20 20 73 74 72 75 63 74 3a 3a 6c ... struct::l
48c0: 69 73 74 20 61 73 73 69 67 6e 20 24 64 65 70 20 ist assign $dep
48d0: 70 61 72 65 6e 74 20 63 68 69 6c 64 0a 09 20 20 parent child..
48e0: 20 20 6c 6f 67 20 77 72 69 74 65 20 35 20 63 73 log write 5 cs
48f0: 65 74 73 20 22 42 72 6f 6b 65 20 64 65 70 65 6e ets "Broke depen
4900: 64 65 6e 63 79 20 5b 50 44 20 24 70 61 72 65 6e dency [PD $paren
4910: 74 5d 20 2d 2d 3e 20 5b 50 44 20 24 63 68 69 6c t] --> [PD $chil
4920: 64 5d 22 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 0a d]"..}...return.
4930: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 50 72 69 }.. # Pri
4940: 6e 74 20 69 64 65 6e 74 69 66 79 69 6e 67 20 64 nt identifying d
4950: 61 74 61 20 66 6f 72 20 61 20 72 65 76 69 73 69 ata for a revisi
4960: 6f 6e 20 28 70 72 6f 6a 65 63 74 2c 20 66 69 6c on (project, fil
4970: 65 2c 20 64 6f 74 74 65 64 20 72 65 76 0a 20 20 e, dotted rev.
4980: 20 20 23 20 6e 75 6d 62 65 72 29 2c 20 66 6f 72 # number), for
4990: 20 68 69 67 68 20 76 65 72 62 6f 73 69 74 79 20 high verbosity
49a0: 6c 6f 67 20 6f 75 74 70 75 74 2e 0a 0a 20 20 20 log output...
49b0: 20 70 72 6f 63 20 50 44 20 7b 69 64 7d 20 7b 0a proc PD {id} {.
49c0: 09 66 6f 72 65 61 63 68 20 7b 70 20 66 20 72 7d .foreach {p f r}
49d0: 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 [state run {...
49e0: 53 45 4c 45 43 54 20 50 2e 6e 61 6d 65 20 2c 20 SELECT P.name ,
49f0: 46 2e 6e 61 6d 65 2c 20 52 2e 72 65 76 0a 09 09 F.name, R.rev...
4a00: 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c FROM revision R,
4a10: 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65 63 74 file F, project
4a20: 20 50 0a 09 09 57 48 45 52 45 20 52 2e 72 69 64 P...WHERE R.rid
4a30: 20 3d 20 24 69 64 0a 09 09 41 4e 44 20 20 20 52 = $id...AND R
4a40: 2e 66 69 64 20 3d 20 46 2e 66 69 64 0a 09 09 41 .fid = F.fid...A
4a50: 4e 44 20 20 20 46 2e 70 69 64 20 3d 20 50 2e 70 ND F.pid = P.p
4a60: 69 64 0a 09 7d 5d 20 62 72 65 61 6b 0a 09 72 65 id..}] break..re
4a70: 74 75 72 6e 20 22 27 24 70 20 3a 20 24 66 2f 24 turn "'$p : $f/$
4a80: 72 27 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 r'". }.. #
4a90: 20 50 72 69 6e 74 69 6e 67 20 6f 6e 65 20 6f 72 Printing one or
4aa0: 20 6d 6f 72 65 20 72 61 6e 67 65 73 2c 20 66 6f more ranges, fo
4ab0: 72 6d 61 74 74 65 64 2c 20 61 6e 64 20 6f 6e 6c rmatted, and onl
4ac0: 79 20 74 68 65 69 72 20 62 6f 72 64 65 72 20 74 y their border t
4ad0: 6f 0a 20 20 20 20 23 20 6b 65 65 70 20 74 68 65 o. # keep the
4ae0: 20 73 74 72 69 6e 67 73 20 73 68 6f 72 74 2e 0a strings short..
4af0: 0a 20 20 20 20 70 72 6f 63 20 50 52 73 20 7b 72 . proc PRs {r
4b00: 61 6e 67 65 73 7d 20 7b 0a 09 72 65 74 75 72 6e anges} {..return
4b10: 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d [struct::list m
4b20: 61 70 20 24 72 61 6e 67 65 73 20 5b 6d 79 70 72 ap $ranges [mypr
4b30: 6f 63 20 50 52 5d 5d 0a 20 20 20 20 7d 0a 0a 20 oc PR]]. }..
4b40: 20 20 20 70 72 6f 63 20 50 52 20 7b 72 61 6e 67 proc PR {rang
4b50: 65 7d 20 7b 0a 09 42 6f 72 64 65 72 20 24 72 61 e} {..Border $ra
4b60: 6e 67 65 20 73 20 65 0a 09 72 65 74 75 72 6e 20 nge s e..return
4b70: 3c 24 7b 73 7d 2e 2e 2e 24 7b 65 7d 3e 0a 20 20 <${s}...${e}>.
4b80: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 42 6f }.. proc Bo
4b90: 72 64 65 72 20 7b 72 61 6e 67 65 20 73 76 20 65 rder {range sv e
4ba0: 76 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 73 v} {..upvar 1 $s
4bb0: 76 20 73 20 24 65 76 20 65 0a 09 73 65 74 20 73 v s $ev e..set s
4bc0: 20 5b 6c 69 6e 64 65 78 20 24 72 61 6e 67 65 20 [lindex $range
4bd0: 30 5d 0a 09 73 65 74 20 65 20 5b 6c 69 6e 64 65 0]..set e [linde
4be0: 78 20 24 72 61 6e 67 65 20 65 6e 64 5d 0a 09 72 x $range end]..r
4bf0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 eturn. }..
4c00: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 # # ## ### ####
4c10: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 # ######## #####
4c20: 23 23 23 23 23 23 23 23 0a 0a 20 20 20 20 74 79 ########.. ty
4c30: 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 68 61 pevariable mycha
4c40: 6e 67 65 73 65 74 73 20 20 20 20 7b 7d 20 3b 20 ngesets {} ;
4c50: 23 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 6b 6e # List of all kn
4c60: 6f 77 6e 20 63 68 61 6e 67 65 73 65 74 73 2e 0a own changesets..
4c70: 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 typevariable
4c80: 20 6d 79 72 65 76 6d 61 70 20 2d 61 72 72 61 79 myrevmap -array
4c90: 20 7b 7d 20 3b 20 23 20 4d 61 70 20 66 72 6f 6d {} ; # Map from
4ca0: 20 69 74 65 6d 73 20 28 74 61 67 67 65 64 29 20 items (tagged)
4cb0: 74 6f 20 74 68 65 0a 09 09 09 09 20 20 20 20 20 to the.....
4cc0: 20 23 20 6c 69 73 74 20 6f 66 20 63 68 61 6e 67 # list of chang
4cd0: 65 73 65 74 73 20 63 6f 6e 74 61 69 6e 69 6e 67 esets containing
4ce0: 0a 09 09 09 09 20 20 20 20 20 20 23 20 69 74 2e ..... # it.
4cf0: 20 45 61 63 68 20 69 74 65 6d 20 63 61 6e 20 62 Each item can b
4d00: 65 20 75 73 65 64 20 62 79 0a 09 09 09 09 20 20 e used by.....
4d10: 20 20 20 20 23 20 6f 6e 6c 79 20 6f 6e 65 20 63 # only one c
4d20: 68 61 6e 67 65 73 65 74 2e 0a 20 20 20 20 74 79 hangeset.. ty
4d30: 70 65 76 61 72 69 61 62 6c 65 20 6d 79 69 64 6d pevariable myidm
4d40: 61 70 20 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 ap -array {} ;
4d50: 23 20 4d 61 70 20 66 72 6f 6d 20 63 68 61 6e 67 # Map from chang
4d60: 65 73 65 74 20 69 64 20 74 6f 20 63 68 61 6e 67 eset id to chang
4d70: 65 73 65 74 2e 0a 0a 20 20 20 20 74 79 70 65 6d eset... typem
4d80: 65 74 68 6f 64 20 61 6c 6c 20 20 20 7b 7d 20 20 ethod all {}
4d90: 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 63 68 61 { return $mycha
4da0: 6e 67 65 73 65 74 73 20 7d 0a 20 20 20 20 74 79 ngesets }. ty
4db0: 70 65 6d 65 74 68 6f 64 20 6f 66 20 20 20 20 7b pemethod of {
4dc0: 69 64 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 id} { return $my
4dd0: 69 64 6d 61 70 28 24 69 64 29 20 7d 0a 20 20 20 idmap($id) }.
4de0: 20 74 79 70 65 6d 65 74 68 6f 64 20 6f 66 72 65 typemethod ofre
4df0: 76 20 7b 69 64 7d 20 7b 20 72 65 74 75 72 6e 20 v {id} { return
4e00: 24 6d 79 72 65 76 6d 61 70 28 24 69 64 29 20 7d $myrevmap($id) }
4e10: 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23 .. # # ## ###
4e20: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 ##### ########
4e30: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 20 #############.
4e40: 20 20 23 23 20 43 6f 6e 66 69 67 75 72 61 74 69 ## Configurati
4e50: 6f 6e 0a 0a 20 20 20 20 70 72 61 67 6d 61 20 2d on.. pragma -
4e60: 68 61 73 74 79 70 65 69 6e 66 6f 20 20 20 20 6e hastypeinfo n
4e70: 6f 20 20 3b 20 23 20 6e 6f 20 74 79 70 65 20 69 o ; # no type i
4e80: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20 20 20 ntrospection.
4e90: 20 70 72 61 67 6d 61 20 2d 68 61 73 69 6e 66 6f pragma -hasinfo
4ea0: 20 20 20 20 20 20 20 20 6e 6f 20 20 3b 20 23 20 no ; #
4eb0: 6e 6f 20 6f 62 6a 65 63 74 20 69 6e 74 72 6f 73 no object intros
4ec0: 70 65 63 74 69 6f 6e 0a 0a 20 20 20 20 23 20 23 pection.. # #
4ed0: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 ## ### ##### ##
4ee0: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 ###### #########
4ef0: 23 23 23 23 0a 7d 0a 0a 23 20 23 20 23 23 20 23 ####.}..# # ## #
4f00: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 ## ##### #######
4f10: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 # #############
4f20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
4f30: 23 23 23 23 23 0a 23 23 20 48 65 6c 70 65 72 20 #####.## Helper
4f40: 73 69 6e 67 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 singleton. Comma
4f50: 6e 64 73 20 66 6f 72 20 72 65 76 69 73 69 6f 6e nds for revision
4f60: 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e changesets...sn
4f70: 69 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 it::type ::vc::f
4f80: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 ossil::import::c
4f90: 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 vs::project::rev
4fa0: 3a 3a 72 65 76 20 7b 0a 20 20 20 20 74 79 70 65 ::rev {. type
4fb0: 6d 65 74 68 6f 64 20 62 79 72 65 76 69 73 69 6f method byrevisio
4fc0: 6e 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 n {} { return 1
4fd0: 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 }. typemethod
4fe0: 20 62 79 73 79 6d 62 6f 6c 20 20 20 7b 7d 20 7b bysymbol {} {
4ff0: 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20 return 0 }.
5000: 74 79 70 65 6d 65 74 68 6f 64 20 69 73 74 61 67 typemethod istag
5010: 20 20 20 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 {} { retur
5020: 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 n 0 }. typeme
5030: 74 68 6f 64 20 69 73 62 72 61 6e 63 68 20 20 20 thod isbranch
5040: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a {} { return 0 }.
5050: 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20 . # result =
5060: 6c 69 73 74 20 28 6d 69 6e 74 69 6d 65 2c 20 6d list (mintime, m
5070: 61 78 74 69 6d 65 29 0a 20 20 20 20 74 79 70 65 axtime). type
5080: 6d 65 74 68 6f 64 20 74 69 6d 65 72 61 6e 67 65 method timerange
5090: 20 7b 69 74 65 6d 73 7d 20 7b 0a 09 73 65 74 20 {items} {..set
50a0: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 theset ('[join $
50b0: 69 74 65 6d 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 items {','}]')..
50c0: 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75 return [state ru
50d0: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 n ".. SELECT
50e0: 4d 49 4e 28 52 2e 64 61 74 65 29 2c 20 4d 41 58 MIN(R.date), MAX
50f0: 28 52 2e 64 61 74 65 29 0a 09 20 20 20 20 46 52 (R.date).. FR
5100: 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 OM revision R..
5110: 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 49 WHERE R.rid I
5120: 4e 20 24 74 68 65 73 65 74 0a 09 22 5d 0a 20 20 N $theset.."].
5130: 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64 }.. # var(d
5140: 76 29 20 3d 20 64 69 63 74 20 28 72 65 76 69 73 v) = dict (revis
5150: 69 6f 6e 20 2d 3e 20 6c 69 73 74 20 28 72 65 76 ion -> list (rev
5160: 69 73 69 6f 6e 29 29 0a 20 20 20 20 74 79 70 65 ision)). type
5170: 6d 65 74 68 6f 64 20 69 6e 74 65 72 6e 61 6c 73 method internals
5180: 75 63 63 65 73 73 6f 72 73 20 7b 64 76 20 72 65 uccessors {dv re
5190: 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 visions} {..upva
51a0: 72 20 31 20 24 64 76 20 64 65 70 65 6e 64 65 6e r 1 $dv dependen
51b0: 63 69 65 73 0a 09 73 65 74 20 74 68 65 73 65 74 cies..set theset
51c0: 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 ('[join $revisi
51d0: 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 23 ons {','}]')...#
51e0: 20 53 65 65 20 27 73 75 63 63 65 73 73 6f 72 73 See 'successors
51f0: 27 20 62 65 6c 6f 77 20 66 6f 72 20 74 68 65 20 ' below for the
5200: 6d 61 69 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e main explanation
5210: 20 6f 66 0a 09 23 20 74 68 65 20 76 61 72 69 6f of..# the vario
5220: 75 73 20 63 61 73 65 73 2e 20 54 68 69 73 20 70 us cases. This p
5230: 69 65 63 65 20 69 73 20 73 70 65 63 69 61 6c 20 iece is special
5240: 69 6e 20 74 68 61 74 20 69 74 0a 09 23 20 72 65 in that it..# re
5250: 73 74 72 69 63 74 73 20 74 68 65 20 73 75 63 63 stricts the succ
5260: 65 73 73 6f 72 73 20 77 65 20 6c 6f 6f 6b 20 66 essors we look f
5270: 6f 72 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73 or to the same s
5280: 65 74 20 6f 66 0a 09 23 20 72 65 76 69 73 69 6f et of..# revisio
5290: 6e 73 20 77 65 20 73 74 61 72 74 20 66 72 6f 6d ns we start from
52a0: 2e 20 53 65 6e 73 69 62 6c 65 20 61 73 20 77 65 . Sensible as we
52b0: 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 are looking for
52c0: 0a 09 23 20 63 68 61 6e 67 65 73 65 74 20 69 6e ..# changeset in
52d0: 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 ternal dependenc
52e0: 69 65 73 2e 0a 0a 09 61 72 72 61 79 20 73 65 74 ies....array set
52f0: 20 64 65 70 20 7b 7d 0a 0a 09 66 6f 72 65 61 63 dep {}...foreac
5300: 68 20 7b 72 69 64 20 63 68 69 6c 64 7d 20 5b 73 h {rid child} [s
5310: 74 61 74 65 20 72 75 6e 20 22 0a 20 20 20 2d 2d tate run ". --
5320: 20 28 31 29 20 50 72 69 6d 61 72 79 20 63 68 69 (1) Primary chi
5330: 6c 64 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 ld.. SELECT R
5340: 2e 72 69 64 2c 20 52 2e 63 68 69 6c 64 0a 09 20 .rid, R.child..
5350: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 FROM revisi
5360: 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 on R.. WHERE
5370: 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 R.rid IN $the
5380: 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 set -- Restr
5390: 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 ict to revisions
53a0: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 of interest..
53b0: 20 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 AND R.child
53c0: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 IS NOT NULL
53d0: 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 -- Has primary c
53e0: 68 69 6c 64 0a 09 20 20 20 20 41 4e 44 20 20 20 hild.. AND
53f0: 20 52 2e 63 68 69 6c 64 20 49 4e 20 24 74 68 65 R.child IN $the
5400: 73 65 74 20 20 20 20 20 2d 2d 20 57 68 69 63 68 set -- Which
5410: 20 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e 74 65 is also of inte
5420: 72 65 73 74 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 rest. UNION.
5430: 20 20 20 2d 2d 20 28 32 29 20 53 65 63 6f 6e 64 -- (2) Second
5440: 61 72 79 20 28 62 72 61 6e 63 68 29 20 63 68 69 ary (branch) chi
5450: 6c 64 72 65 6e 0a 09 20 20 20 20 53 45 4c 45 43 ldren.. SELEC
5460: 54 20 52 2e 72 69 64 2c 20 42 2e 62 72 69 64 0a T R.rid, B.brid.
5470: 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 . FROM revi
5480: 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e sion R, revision
5490: 62 72 61 6e 63 68 63 68 69 6c 64 72 65 6e 20 42 branchchildren B
54a0: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 .. WHERE R.r
54b0: 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 id IN $theset
54c0: 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 -- Restrict
54d0: 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 to revisions of
54e0: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e interest.. AN
54f0: 44 20 20 20 20 52 2e 72 69 64 20 3d 20 42 2e 72 D R.rid = B.r
5500: 69 64 20 20 20 20 20 20 20 20 20 20 2d 2d 20 53 id -- S
5510: 65 6c 65 63 74 20 73 75 62 73 65 74 20 6f 66 20 elect subset of
5520: 62 72 61 6e 63 68 20 63 68 69 6c 64 72 65 6e 0a branch children.
5530: 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 62 72 . AND B.br
5540: 69 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 id IN $theset
5550: 20 20 20 2d 2d 20 57 68 69 63 68 20 69 73 20 61 -- Which is a
5560: 6c 73 6f 20 6f 66 20 69 6e 74 65 72 65 73 74 0a lso of interest.
5570: 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d UNION. --
5580: 20 28 34 29 20 43 68 69 6c 64 20 6f 66 20 74 72 (4) Child of tr
5590: 75 6e 6b 20 72 6f 6f 74 20 73 75 63 63 65 73 73 unk root success
55a0: 6f 72 20 6f 66 20 6c 61 73 74 20 4e 54 44 42 20 or of last NTDB
55b0: 6f 6e 20 74 72 75 6e 6b 2e 0a 09 20 20 20 20 53 on trunk... S
55c0: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 41 2e ELECT R.rid, RA.
55d0: 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 child.. FROM
55e0: 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 revision R, revi
55f0: 73 69 6f 6e 20 52 41 0a 09 20 20 20 20 57 48 45 sion RA.. WHE
5600: 52 45 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 RE R.rid IN $t
5610: 68 65 73 65 74 20 20 20 20 20 20 2d 2d 20 52 65 heset -- Re
5620: 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 strict to revisi
5630: 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a ons of interest.
5640: 09 20 20 20 20 41 4e 44 20 20 20 52 2e 69 73 64 . AND R.isd
5650: 65 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20 efault
5660: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 -- Restrict t
5670: 6f 20 4e 54 44 42 0a 09 20 20 20 20 41 4e 44 20 o NTDB.. AND
5680: 20 20 52 2e 64 62 63 68 69 6c 64 20 49 53 20 4e R.dbchild IS N
5690: 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d 20 61 6e 64 OT NULL -- and
56a0: 20 6c 61 73 74 20 4e 54 44 42 20 62 65 6c 6f 6e last NTDB belon
56b0: 67 69 6e 67 20 74 6f 20 74 72 75 6e 6b 0a 09 20 ging to trunk..
56c0: 20 20 20 41 4e 44 20 20 20 52 41 2e 72 69 64 20 AND RA.rid
56d0: 3d 20 52 2e 64 62 63 68 69 6c 64 20 20 20 20 20 = R.dbchild
56e0: 20 2d 2d 20 47 6f 20 64 69 72 65 63 74 6c 79 20 -- Go directly
56f0: 74 6f 20 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 to trunk root..
5700: 20 20 20 41 4e 44 20 20 20 52 41 2e 63 68 69 6c AND RA.chil
5710: 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 d IS NOT NULL
5720: 20 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 -- Has primary
5730: 63 68 69 6c 64 2e 0a 20 20 20 20 20 20 20 20 20 child..
5740: 20 20 20 41 4e 44 20 20 20 52 41 2e 63 68 69 6c AND RA.chil
5750: 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 d IN $theset
5760: 20 2d 2d 20 57 68 69 63 68 20 69 73 20 61 6c 73 -- Which is als
5770: 6f 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 22 o of interest.."
5780: 5d 20 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 69 ] {.. # Consi
5790: 64 65 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 20 der moving this
57a0: 74 6f 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 to the integrity
57b0: 20 6d 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 6e module... in
57c0: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b tegrity assert {
57d0: 24 72 69 64 20 21 3d 20 24 63 68 69 6c 64 7d 20 $rid != $child}
57e0: 7b 52 65 76 69 73 69 6f 6e 20 24 72 69 64 20 64 {Revision $rid d
57f0: 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 epends on itself
5800: 2e 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 .}.. lappend
5810: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 24 72 69 dependencies($ri
5820: 64 29 20 24 63 68 69 6c 64 0a 09 20 20 20 20 73 d) $child.. s
5830: 65 74 20 64 65 70 28 24 72 69 64 2c 24 63 68 69 et dep($rid,$chi
5840: 6c 64 29 20 2e 0a 09 7d 0a 0a 09 23 20 54 68 65 ld) ...}...# The
5850: 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 73 20 sql statements
5860: 61 62 6f 76 65 20 6c 6f 6f 6b 73 20 6f 6e 6c 79 above looks only
5870: 20 66 6f 72 20 64 69 72 65 63 74 20 64 65 70 65 for direct depe
5880: 6e 64 65 6e 63 69 65 73 0a 09 23 20 62 65 74 77 ndencies..# betw
5890: 65 65 6e 20 72 65 76 69 73 69 6f 6e 20 69 6e 20 een revision in
58a0: 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20 48 the changeset. H
58b0: 6f 77 65 76 65 72 20 64 75 65 20 74 6f 20 74 68 owever due to th
58c0: 65 0a 09 23 20 76 61 67 61 72 69 65 73 20 6f 66 e..# vagaries of
58d0: 20 6d 65 74 61 20 64 61 74 61 20 69 74 20 69 73 meta data it is
58e0: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 77 possible for tw
58f0: 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 0a 09 o revisions of..
5900: 23 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 # the same file
5910: 74 6f 20 65 6e 64 20 75 70 20 69 6e 20 74 68 65 to end up in the
5920: 20 73 61 6d 65 20 63 68 61 6e 67 65 73 65 74 2c same changeset,
5930: 20 77 69 74 68 6f 75 74 20 61 0a 09 23 20 64 69 without a..# di
5940: 72 65 63 74 20 64 65 70 65 6e 64 65 6e 63 79 20 rect dependency
5950: 62 65 74 77 65 65 6e 20 74 68 65 6d 2e 20 48 6f between them. Ho
5960: 77 65 76 65 72 20 77 65 20 6b 6e 6f 77 20 74 68 wever we know th
5970: 61 74 20 74 68 65 72 65 0a 09 23 20 68 61 73 20 at there..# has
5980: 74 6f 20 62 65 20 61 20 61 6e 20 69 6e 64 69 72 to be a an indir
5990: 65 63 74 20 64 65 70 65 6e 64 65 6e 63 79 2c 20 ect dependency,
59a0: 62 65 20 69 74 20 74 68 72 6f 75 67 68 20 70 72 be it through pr
59b0: 69 6d 61 72 79 0a 09 23 20 63 68 69 6c 64 72 65 imary..# childre
59c0: 6e 2c 20 62 72 61 6e 63 68 20 63 68 69 6c 64 72 n, branch childr
59d0: 65 6e 2c 20 6f 72 20 61 20 63 6f 6d 62 69 6e 61 en, or a combina
59e0: 74 69 6f 6e 20 74 68 65 72 65 6f 66 2e 0a 0a 09 tion thereof....
59f0: 23 20 57 65 20 6e 6f 77 20 66 69 6c 6c 20 69 6e # We now fill in
5a00: 20 74 68 65 73 65 20 70 73 65 75 64 6f 2d 64 65 these pseudo-de
5a10: 70 65 6e 64 65 6e 63 69 65 73 2c 20 69 66 20 6e pendencies, if n
5a20: 6f 20 73 75 63 68 0a 09 23 20 64 65 70 65 6e 64 o such..# depend
5a30: 65 6e 63 79 20 65 78 69 73 74 73 20 61 6c 72 65 ency exists alre
5a40: 61 64 79 2e 20 54 68 65 20 64 69 72 65 63 74 69 ady. The directi
5a50: 6f 6e 20 6f 66 20 74 68 65 20 64 65 70 65 6e 64 on of the depend
5a60: 65 6e 63 79 0a 09 23 20 69 73 20 61 63 74 75 61 ency..# is actua
5a70: 6c 6c 79 20 69 72 72 65 6c 65 76 61 6e 74 20 66 lly irrelevant f
5a80: 6f 72 20 74 68 69 73 2e 0a 0a 09 23 20 4e 4f 54 or this....# NOT
5a90: 45 3a 20 54 68 69 73 20 69 73 20 64 69 66 66 65 E: This is diffe
5aa0: 72 65 6e 74 20 66 72 6f 6d 20 63 76 73 32 73 76 rent from cvs2sv
5ab0: 6e 2e 20 4f 75 72 20 73 70 69 72 69 74 75 61 6c n. Our spiritual
5ac0: 20 61 6e 63 65 73 74 6f 72 0a 09 23 20 64 6f 65 ancestor..# doe
5ad0: 73 20 6e 6f 74 20 75 73 65 20 73 75 63 68 20 70 s not use such p
5ae0: 73 65 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63 69 seudo-dependenci
5af0: 65 73 2c 20 68 6f 77 65 76 65 72 20 69 74 20 75 es, however it u
5b00: 73 65 73 20 61 0a 09 23 20 43 4f 4d 4d 49 54 5f ses a..# COMMIT_
5b10: 54 48 52 45 53 48 4f 4c 44 2c 20 61 20 74 69 6d THRESHOLD, a tim
5b20: 65 20 69 6e 74 65 72 76 61 6c 20 63 6f 6d 6d 69 e interval commi
5b30: 74 73 20 73 68 6f 75 6c 64 20 66 61 6c 6c 2e 20 ts should fall.
5b40: 54 68 69 73 0a 09 23 20 77 69 6c 6c 20 67 72 65 This..# will gre
5b50: 61 74 6c 79 20 72 65 64 75 63 65 73 20 74 68 65 atly reduces the
5b60: 20 72 69 73 6b 20 6f 66 20 67 65 74 74 69 6e 67 risk of getting
5b70: 20 66 61 72 20 73 65 70 61 72 61 74 65 64 0a 09 far separated..
5b80: 23 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 74 # revisions of t
5b90: 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 6e 74 he same file int
5ba0: 6f 20 6f 6e 65 20 63 68 61 6e 67 65 73 65 74 2e o one changeset.
5bb0: 0a 0a 09 23 20 57 65 20 61 6c 6c 6f 77 20 72 65 ...# We allow re
5bc0: 76 69 73 69 6f 6e 73 20 74 6f 20 62 65 20 66 61 visions to be fa
5bd0: 72 20 61 70 61 72 74 20 69 6e 20 74 69 6d 65 20 r apart in time
5be0: 69 6e 20 74 68 65 20 73 61 6d 65 0a 09 23 20 63 in the same..# c
5bf0: 68 61 6e 67 65 73 65 74 2c 20 62 75 74 20 6e 65 hangeset, but ne
5c00: 65 64 20 74 68 65 20 70 73 65 75 64 6f 2d 64 65 ed the pseudo-de
5c10: 70 65 6e 64 65 6e 63 69 65 73 20 66 6f 72 20 74 pendencies for t
5c20: 68 69 73 2e 0a 0a 09 61 72 72 61 79 20 73 65 74 his....array set
5c30: 20 66 69 64 73 20 7b 7d 0a 09 66 6f 72 65 61 63 fids {}..foreac
5c40: 68 20 7b 72 69 64 20 66 69 64 7d 20 5b 73 74 61 h {rid fid} [sta
5c50: 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 te run ".. SE
5c60: 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 66 69 LECT R.rid, R.fi
5c70: 64 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 d FROM revision
5c80: 52 20 57 48 45 52 45 20 52 2e 72 69 64 20 49 4e R WHERE R.rid IN
5c90: 20 24 74 68 65 73 65 74 0a 09 22 5d 20 7b 20 6c $theset.."] { l
5ca0: 61 70 70 65 6e 64 20 66 69 64 73 28 24 66 69 64 append fids($fid
5cb0: 29 20 24 72 69 64 20 7d 0a 0a 09 66 6f 72 65 61 ) $rid }...forea
5cc0: 63 68 20 7b 66 69 64 20 72 69 64 73 7d 20 5b 61 ch {fid rids} [a
5cd0: 72 72 61 79 20 67 65 74 20 66 69 64 73 5d 20 7b rray get fids] {
5ce0: 0a 09 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 .. if {[lleng
5cf0: 74 68 20 24 72 69 64 73 5d 20 3c 20 32 7d 20 63 th $rids] < 2} c
5d00: 6f 6e 74 69 6e 75 65 0a 09 20 20 20 20 66 6f 72 ontinue.. for
5d10: 65 61 63 68 20 61 20 24 72 69 64 73 20 7b 0a 09 each a $rids {..
5d20: 09 66 6f 72 65 61 63 68 20 62 20 24 72 69 64 73 .foreach b $rids
5d30: 20 7b 0a 09 09 20 20 20 20 69 66 20 7b 24 61 20 {... if {$a
5d40: 3d 3d 20 24 62 7d 20 63 6f 6e 74 69 6e 75 65 0a == $b} continue.
5d50: 09 09 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 .. if {[info
5d60: 65 78 69 73 74 73 20 64 65 70 28 24 61 2c 24 62 exists dep($a,$b
5d70: 29 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 09 20 )]} continue...
5d80: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 if {[info exi
5d90: 73 74 73 20 64 65 70 28 24 62 2c 24 61 29 5d 7d sts dep($b,$a)]}
5da0: 20 63 6f 6e 74 69 6e 75 65 0a 09 09 20 20 20 20 continue...
5db0: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e lappend dependen
5dc0: 63 69 65 73 28 24 61 29 20 24 62 0a 09 09 20 20 cies($a) $b...
5dd0: 20 20 73 65 74 20 64 65 70 28 24 61 2c 24 62 29 set dep($a,$b)
5de0: 20 2e 0a 09 09 20 20 20 20 73 65 74 20 64 65 70 .... set dep
5df0: 28 24 62 2c 24 61 29 20 2e 0a 09 09 7d 0a 09 20 ($b,$a) ....}..
5e00: 20 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a }..}..return.
5e10: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 }.. # var
5e20: 28 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 (dv) = dict (ite
5e30: 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 m -> list (item)
5e40: 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 ), item = list
5e50: 28 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 (type id). ty
5e60: 70 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 pemethod success
5e70: 6f 72 73 20 7b 64 76 20 72 65 76 69 73 69 6f 6e ors {dv revision
5e80: 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64 s} {..upvar 1 $d
5e90: 76 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 v dependencies..
5ea0: 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f set theset ('[jo
5eb0: 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 in $revisions {'
5ec0: 2c 27 7d 5d 27 29 0a 0a 09 23 20 54 68 65 20 66 ,'}]')...# The f
5ed0: 6f 6c 6c 6f 77 69 6e 67 20 63 61 73 65 73 20 73 ollowing cases s
5ee0: 70 65 63 69 66 79 20 77 68 65 6e 20 61 20 72 65 pecify when a re
5ef0: 76 69 73 69 6f 6e 20 53 20 69 73 20 61 20 73 75 vision S is a su
5f00: 63 63 65 73 73 6f 72 0a 09 23 20 6f 66 20 61 20 ccessor..# of a
5f10: 72 65 76 69 73 69 6f 6e 20 52 2e 20 45 61 63 68 revision R. Each
5f20: 20 6f 66 20 74 68 65 20 63 61 73 65 73 20 74 72 of the cases tr
5f30: 61 6e 73 6c 61 74 65 73 20 69 6e 74 6f 20 6f 6e anslates into on
5f40: 65 20 6f 66 0a 09 23 20 74 68 65 20 62 72 61 6e e of..# the bran
5f50: 63 68 65 73 20 6f 66 20 74 68 65 20 53 51 4c 20 ches of the SQL
5f60: 55 4e 49 4f 4e 20 63 6f 6d 69 6e 67 20 62 65 6c UNION coming bel
5f70: 6f 77 2e 0a 09 23 0a 09 23 20 28 31 29 20 53 20 ow...#..# (1) S
5f80: 63 61 6e 20 62 65 20 61 20 70 72 69 6d 61 72 79 can be a primary
5f90: 20 63 68 69 6c 64 20 6f 66 20 52 2c 20 69 2e 65 child of R, i.e
5fa0: 2e 20 69 6e 20 74 68 65 20 73 61 6d 65 20 4c 4f . in the same LO
5fb0: 44 2e 20 52 0a 09 23 20 20 20 20 20 72 65 66 65 D. R..# refe
5fc0: 72 65 6e 63 65 73 20 53 20 64 69 72 65 63 74 6c rences S directl
5fd0: 79 2e 20 52 2e 63 68 69 6c 64 20 3d 20 53 28 2e y. R.child = S(.
5fe0: 72 69 64 29 2c 20 69 66 20 69 74 20 65 78 69 73 rid), if it exis
5ff0: 74 73 2e 0a 09 23 0a 09 23 20 28 32 29 20 53 20 ts...#..# (2) S
6000: 63 61 6e 20 62 65 20 61 20 73 65 63 6f 6e 64 61 can be a seconda
6010: 72 79 2c 20 69 2e 65 2e 20 62 72 61 6e 63 68 2c ry, i.e. branch,
6020: 20 63 68 69 6c 64 20 6f 66 20 52 2e 20 48 65 72 child of R. Her
6030: 65 20 74 68 65 0a 09 23 20 20 20 20 20 6c 69 6e e the..# lin
6040: 6b 20 69 73 20 6d 61 64 65 20 74 68 72 6f 75 67 k is made throug
6050: 68 20 74 68 65 20 68 65 6c 70 65 72 20 74 61 62 h the helper tab
6060: 6c 65 0a 09 23 20 20 20 20 20 52 45 56 49 53 49 le..# REVISI
6070: 4f 4e 42 52 41 4e 43 48 43 48 49 4c 44 52 45 4e ONBRANCHCHILDREN
6080: 2e 20 52 2e 72 69 64 20 2d 3e 20 52 42 43 2e 72 . R.rid -> RBC.r
6090: 69 64 2c 20 52 42 43 2e 62 72 69 64 20 3d 0a 09 id, RBC.brid =..
60a0: 23 20 20 20 20 20 53 28 2e 72 69 64 29 0a 09 23 # S(.rid)..#
60b0: 0a 09 23 20 28 33 29 20 4f 72 69 67 69 6e 61 6c ..# (3) Original
60c0: 6c 79 20 74 68 69 73 20 75 73 65 20 63 61 73 65 ly this use case
60d0: 20 64 65 66 69 6e 65 64 20 74 68 65 20 72 6f 6f defined the roo
60e0: 74 20 6f 66 20 61 20 64 65 74 61 63 68 65 64 0a t of a detached.
60f0: 09 23 20 20 20 20 20 4e 54 44 42 20 61 73 20 74 .# NTDB as t
6100: 68 65 20 73 75 63 63 65 73 73 6f 72 20 6f 66 20 he successor of
6110: 74 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74 2e 20 the trunk root.
6120: 54 68 69 73 20 6c 65 61 64 73 20 74 6f 20 61 0a This leads to a.
6130: 09 23 20 20 20 20 20 62 61 64 20 74 61 6e 67 6c .# bad tangl
6140: 65 20 6c 61 74 65 72 20 6f 6e 2e 20 57 69 74 68 e later on. With
6150: 20 61 20 64 65 74 61 63 68 65 64 20 4e 54 44 42 a detached NTDB
6160: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 09 23 the original..#
6170: 20 20 20 20 20 74 72 75 6e 6b 20 72 6f 6f 74 20 trunk root
6180: 72 65 76 69 73 69 6f 6e 20 77 61 73 20 72 65 6d revision was rem
6190: 6f 76 65 64 20 61 73 20 69 72 72 65 6c 65 76 61 oved as irreleva
61a0: 6e 74 2c 20 61 6c 6c 6f 77 69 6e 67 0a 09 23 20 nt, allowing..#
61b0: 20 20 20 20 74 68 65 20 6e 6f 6d 69 6e 61 6c 20 the nominal
61c0: 72 6f 6f 74 20 74 6f 20 62 65 20 6c 61 74 65 72 root to be later
61d0: 20 69 6e 20 74 69 6d 65 20 74 68 61 6e 20 74 68 in time than th
61e0: 65 20 4e 54 44 42 0a 09 23 20 20 20 20 20 72 6f e NTDB..# ro
61f0: 6f 74 2e 20 4e 6f 77 20 73 65 74 74 69 6e 67 20 ot. Now setting
6200: 74 68 69 73 20 64 65 70 65 6e 64 65 6e 63 79 20 this dependency
6210: 77 69 6c 6c 20 62 65 20 62 61 63 6b 77 61 72 64 will be backward
6220: 20 69 6e 0a 09 23 20 20 20 20 20 74 69 6d 65 2e in..# time.
6230: 20 52 45 4d 4f 56 45 44 2e 0a 09 23 0a 09 23 20 REMOVED...#..#
6240: 28 34 29 20 49 66 20 52 20 69 73 20 74 68 65 20 (4) If R is the
6250: 6c 61 73 74 20 6f 66 20 74 68 65 20 4e 54 44 42 last of the NTDB
6260: 20 72 65 76 69 73 69 6f 6e 73 20 77 68 69 63 68 revisions which
6270: 20 62 65 6c 6f 6e 67 20 74 6f 0a 09 23 20 20 20 belong to..#
6280: 20 20 74 68 65 20 74 72 75 6e 6b 2c 20 74 68 65 the trunk, the
6290: 6e 20 74 68 65 20 70 72 69 6d 61 72 79 20 63 68 n the primary ch
62a0: 69 6c 64 20 6f 66 20 74 68 65 20 74 72 75 6e 6b ild of the trunk
62b0: 20 72 6f 6f 74 20 28 74 68 65 0a 09 23 20 20 20 root (the..#
62c0: 20 20 27 31 2e 32 27 20 72 65 76 69 73 69 6f 6e '1.2' revision
62d0: 29 20 69 73 20 61 20 73 75 63 63 65 73 73 6f 72 ) is a successor
62e0: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a , if it exists..
62f0: 0a 09 23 20 4e 6f 74 65 20 74 68 61 74 20 74 68 ..# Note that th
6300: 65 20 62 72 61 6e 63 68 65 73 20 73 70 61 77 6e e branches spawn
6310: 65 64 20 66 72 6f 6d 20 74 68 65 20 72 65 76 69 ed from the revi
6320: 73 69 6f 6e 73 2c 20 61 6e 64 20 74 68 65 0a 09 sions, and the..
6330: 23 20 74 61 67 73 20 61 73 73 6f 63 69 61 74 65 # tags associate
6340: 64 20 77 69 74 68 20 74 68 65 6d 20 61 72 65 20 d with them are
6350: 73 75 63 63 65 73 73 6f 72 73 20 61 73 20 77 65 successors as we
6360: 6c 6c 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 ll....foreach {r
6370: 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 id child} [state
6380: 20 72 75 6e 20 22 0a 20 20 20 2d 2d 20 28 31 29 run ". -- (1)
6390: 20 50 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 09 Primary child..
63a0: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 SELECT R.rid
63b0: 2c 20 52 2e 63 68 69 6c 64 0a 09 20 20 20 20 46 , R.child.. F
63c0: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 ROM revision R
63d0: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 .. WHERE R.r
63e0: 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 id IN $theset
63f0: 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 -- Restrict
6400: 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 to revisions of
6410: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e interest.. AN
6420: 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49 53 20 D R.child IS
6430: 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 NOT NULL -- H
6440: 61 73 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 as primary child
6450: 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d . UNION. -
6460: 2d 20 28 32 29 20 53 65 63 6f 6e 64 61 72 79 20 - (2) Secondary
6470: 28 62 72 61 6e 63 68 29 20 63 68 69 6c 64 72 65 (branch) childre
6480: 6e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e n.. SELECT R.
6490: 72 69 64 2c 20 42 2e 62 72 69 64 0a 09 20 20 20 rid, B.brid..
64a0: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e FROM revision
64b0: 20 52 2c 20 72 65 76 69 73 69 6f 6e 62 72 61 6e R, revisionbran
64c0: 63 68 63 68 69 6c 64 72 65 6e 20 42 0a 09 20 20 chchildren B..
64d0: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 WHERE R.rid
64e0: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 IN $theset
64f0: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 -- Restrict to r
6500: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 evisions of inte
6510: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 rest.. AND
6520: 20 52 2e 72 69 64 20 3d 20 42 2e 72 69 64 20 20 R.rid = B.rid
6530: 20 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 -- Selec
6540: 74 20 73 75 62 73 65 74 20 6f 66 20 62 72 61 6e t subset of bran
6550: 63 68 20 63 68 69 6c 64 72 65 6e 0a 20 20 20 20 ch children.
6560: 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 34 29 UNION. -- (4)
6570: 20 43 68 69 6c 64 20 6f 66 20 74 72 75 6e 6b 20 Child of trunk
6580: 72 6f 6f 74 20 73 75 63 63 65 73 73 6f 72 20 6f root successor o
6590: 66 20 6c 61 73 74 20 4e 54 44 42 20 6f 6e 20 74 f last NTDB on t
65a0: 72 75 6e 6b 2e 0a 09 20 20 20 20 53 45 4c 45 43 runk... SELEC
65b0: 54 20 52 2e 72 69 64 2c 20 52 41 2e 63 68 69 6c T R.rid, RA.chil
65c0: 64 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69 d.. FROM revi
65d0: 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e sion R, revision
65e0: 20 52 41 0a 09 20 20 20 20 57 48 45 52 45 20 52 RA.. WHERE R
65f0: 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 .rid IN $these
6600: 74 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 t -- Restri
6610: 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 ct to revisions
6620: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 of interest..
6630: 20 41 4e 44 20 20 20 52 2e 69 73 64 65 66 61 75 AND R.isdefau
6640: 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2d lt -
6650: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 4e 54 - Restrict to NT
6660: 44 42 0a 09 20 20 20 20 41 4e 44 20 20 20 52 2e DB.. AND R.
6670: 64 62 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e dbchild IS NOT N
6680: 55 4c 4c 20 20 20 2d 2d 20 61 6e 64 20 6c 61 73 ULL -- and las
6690: 74 20 4e 54 44 42 20 62 65 6c 6f 6e 67 69 6e 67 t NTDB belonging
66a0: 20 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20 41 to trunk.. A
66b0: 4e 44 20 20 20 52 41 2e 72 69 64 20 3d 20 52 2e ND RA.rid = R.
66c0: 64 62 63 68 69 6c 64 20 20 20 20 20 20 2d 2d 20 dbchild --
66d0: 47 6f 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 Go directly to t
66e0: 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 20 41 runk root.. A
66f0: 4e 44 20 20 20 52 41 2e 63 68 69 6c 64 20 49 53 ND RA.child IS
6700: 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 NOT NULL --
6710: 48 61 73 20 70 72 69 6d 61 72 79 20 63 68 69 6c Has primary chil
6720: 64 2e 0a 09 22 5d 20 7b 0a 09 20 20 20 20 23 20 d..."] {.. #
6730: 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69 6e 67 20 Consider moving
6740: 74 68 69 73 20 74 6f 20 74 68 65 20 69 6e 74 65 this to the inte
6750: 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e 0a 09 20 grity module...
6760: 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 integrity ass
6770: 65 72 74 20 7b 24 72 69 64 20 21 3d 20 24 63 68 ert {$rid != $ch
6780: 69 6c 64 7d 20 7b 52 65 76 69 73 69 6f 6e 20 24 ild} {Revision $
6790: 72 69 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 rid depends on i
67a0: 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20 6c 61 70 tself.}.. lap
67b0: 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 pend dependencie
67c0: 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64 s([list rev $rid
67d0: 5d 29 20 5b 6c 69 73 74 20 72 65 76 20 24 63 68 ]) [list rev $ch
67e0: 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 ild]..}..foreach
67f0: 20 7b 72 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 {rid child} [st
6800: 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 ate run ".. S
6810: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 54 2e 74 ELECT R.rid, T.t
6820: 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 id.. FROM r
6830: 65 76 69 73 69 6f 6e 20 52 2c 20 74 61 67 20 54 evision R, tag T
6840: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 .. WHERE R.r
6850: 69 64 20 69 6e 20 24 74 68 65 73 65 74 0a 09 20 id in $theset..
6860: 20 20 20 41 4e 44 20 20 20 20 54 2e 72 65 76 20 AND T.rev
6870: 3d 20 52 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 = R.rid.."] {..
6880: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e lappend depen
6890: 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 65 dencies([list re
68a0: 76 20 24 72 69 64 5d 29 20 5b 6c 69 73 74 20 73 v $rid]) [list s
68b0: 79 6d 3a 3a 74 61 67 20 24 63 68 69 6c 64 5d 0a ym::tag $child].
68c0: 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 .}..foreach {rid
68d0: 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 child} [state r
68e0: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 un ".. SELECT
68f0: 20 52 2e 72 69 64 2c 20 42 2e 62 69 64 0a 09 20 R.rid, B.bid..
6900: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 FROM revisi
6910: 6f 6e 20 52 2c 20 62 72 61 6e 63 68 20 42 0a 09 on R, branch B..
6920: 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 WHERE R.rid
6930: 20 69 6e 20 24 74 68 65 73 65 74 0a 09 20 20 20 in $theset..
6940: 20 41 4e 44 20 20 20 20 42 2e 72 6f 6f 74 20 3d AND B.root =
6950: 20 52 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 R.rid.."] {..
6960: 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 lappend depend
6970: 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 65 76 encies([list rev
6980: 20 24 72 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 $rid]) [list sy
6990: 6d 3a 3a 62 72 61 6e 63 68 20 24 63 68 69 6c 64 m::branch $child
69a0: 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 ]..}..return.
69b0: 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76 }.. # var(dv
69c0: 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d ) = dict (item -
69d0: 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c 20 > list (item)),
69e0: 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 79 item = list (ty
69f0: 70 65 20 69 64 29 0a 20 20 20 20 74 79 70 65 6d pe id). typem
6a00: 65 74 68 6f 64 20 70 72 65 64 65 63 65 73 73 6f ethod predecesso
6a10: 72 73 20 7b 64 76 20 72 65 76 69 73 69 6f 6e 73 rs {dv revisions
6a20: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76 } {..upvar 1 $dv
6a30: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 73 dependencies..s
6a40: 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 et theset ('[joi
6a50: 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c n $revisions {',
6a60: 27 7d 5d 27 29 0a 0a 09 23 20 54 68 65 20 66 6f '}]')...# The fo
6a70: 6c 6c 6f 77 69 6e 67 20 63 61 73 65 73 20 73 70 llowing cases sp
6a80: 65 63 69 66 79 20 77 68 65 6e 20 61 20 72 65 76 ecify when a rev
6a90: 69 73 69 6f 6e 20 50 20 69 73 20 61 0a 09 23 20 ision P is a..#
6aa0: 70 72 65 64 65 63 65 73 73 6f 72 20 6f 66 20 61 predecessor of a
6ab0: 20 72 65 76 69 73 69 6f 6e 20 52 2e 20 45 61 63 revision R. Eac
6ac0: 68 20 6f 66 20 74 68 65 20 63 61 73 65 73 20 74 h of the cases t
6ad0: 72 61 6e 73 6c 61 74 65 73 0a 09 23 20 69 6e 74 ranslates..# int
6ae0: 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 72 61 o one of the bra
6af0: 6e 63 68 65 73 20 6f 66 20 74 68 65 20 53 51 4c nches of the SQL
6b00: 20 55 4e 49 4f 4e 20 63 6f 6d 69 6e 67 20 62 65 UNION coming be
6b10: 6c 6f 77 2e 0a 09 23 0a 09 23 20 28 31 29 20 54 low...#..# (1) T
6b20: 68 65 20 69 6d 6d 65 64 69 61 74 65 20 70 61 72 he immediate par
6b30: 65 6e 74 20 52 2e 70 61 72 65 6e 74 20 6f 66 20 ent R.parent of
6b40: 52 20 69 73 20 61 20 70 72 65 64 65 63 65 73 73 R is a predecess
6b50: 6f 72 20 6f 66 0a 09 23 20 20 20 20 20 52 2e 20 or of..# R.
6b60: 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20 74 72 NOTE: This is tr
6b70: 75 65 20 66 6f 72 20 52 20 65 69 74 68 65 72 20 ue for R either
6b80: 70 72 69 6d 61 72 79 20 6f 72 20 73 65 63 6f 6e primary or secon
6b90: 64 61 72 79 0a 09 23 20 20 20 20 20 63 68 69 6c dary..# chil
6ba0: 64 20 6f 66 20 50 2e 20 49 74 20 6e 6f 74 20 6e d of P. It not n
6bb0: 65 63 65 73 73 61 72 79 20 74 6f 20 64 69 73 74 ecessary to dist
6bc0: 69 6e 67 75 69 73 68 20 74 68 65 20 74 77 6f 0a inguish the two.
6bd0: 09 23 20 20 20 20 20 63 61 73 65 73 2c 20 69 6e .# cases, in
6be0: 20 63 6f 6e 74 72 61 73 74 20 74 6f 20 74 68 65 contrast to the
6bf0: 20 63 6f 64 65 20 72 65 74 72 69 65 76 69 6e 67 code retrieving
6c00: 20 74 68 65 20 73 75 63 63 65 73 73 6f 72 0a 09 the successor..
6c10: 23 20 20 20 20 20 69 6e 66 6f 72 6d 61 74 69 6f # informatio
6c20: 6e 2e 0a 09 23 0a 09 23 20 28 32 29 20 54 68 65 n...#..# (2) The
6c30: 20 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 73 complement of s
6c40: 75 63 63 65 73 73 6f 72 20 63 61 73 65 20 28 33 uccessor case (3
6c50: 29 2e 20 54 68 65 20 74 72 75 6e 6b 20 72 6f 6f ). The trunk roo
6c60: 74 20 69 73 0a 09 23 20 20 20 20 20 61 20 70 72 t is..# a pr
6c70: 65 64 65 63 65 73 73 6f 72 20 6f 66 20 61 20 4e edecessor of a N
6c80: 54 44 42 20 72 6f 6f 74 2e 20 52 45 4d 4f 56 45 TDB root. REMOVE
6c90: 44 2e 20 53 65 65 20 27 73 75 63 63 65 73 73 6f D. See 'successo
6ca0: 72 73 27 0a 09 23 20 20 20 20 20 66 6f 72 20 74 rs'..# for t
6cb0: 68 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a he explanation..
6cc0: 09 23 0a 09 23 20 28 33 29 20 54 68 65 20 63 6f .#..# (3) The co
6cd0: 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 73 75 63 63 mplement of succ
6ce0: 65 73 73 6f 72 20 63 61 73 65 20 28 34 29 2e 20 essor case (4).
6cf0: 54 68 65 20 6c 61 73 74 20 4e 54 44 42 0a 09 23 The last NTDB..#
6d00: 20 20 20 20 20 72 65 76 69 73 69 6f 6e 20 62 65 revision be
6d10: 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 74 longing to the t
6d20: 72 75 6e 6b 20 69 73 20 61 20 70 72 65 64 65 63 runk is a predec
6d30: 65 73 73 6f 72 20 6f 66 20 74 68 65 0a 09 23 20 essor of the..#
6d40: 20 20 20 20 70 72 69 6d 61 72 79 20 63 68 69 6c primary chil
6d50: 64 20 6f 66 20 74 68 65 20 74 72 75 6e 6b 20 72 d of the trunk r
6d60: 6f 6f 74 20 28 54 68 65 20 27 31 2e 32 27 20 72 oot (The '1.2' r
6d70: 65 76 69 73 69 6f 6e 29 2e 0a 0a 09 66 6f 72 65 evision)....fore
6d80: 61 63 68 20 7b 72 69 64 20 70 61 72 65 6e 74 7d ach {rid parent}
6d90: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 20 20 [state run ".
6da0: 20 2d 2d 20 28 31 29 20 50 72 69 6d 61 72 79 20 -- (1) Primary
6db0: 70 61 72 65 6e 74 2c 20 63 61 6e 20 62 65 20 69 parent, can be i
6dc0: 6e 20 64 69 66 66 65 72 65 6e 74 20 4c 4f 44 20 n different LOD
6dd0: 66 6f 72 20 66 69 72 73 74 20 69 6e 20 61 20 62 for first in a b
6de0: 72 61 6e 63 68 0a 09 20 20 20 20 53 45 4c 45 43 ranch.. SELEC
6df0: 54 20 52 2e 72 69 64 2c 20 52 2e 70 61 72 65 6e T R.rid, R.paren
6e00: 74 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 t.. FROM re
6e10: 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 vision R.. WH
6e20: 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 ERE R.rid IN
6e30: 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 $theset -- R
6e40: 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 estrict to revis
6e50: 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 ions of interest
6e60: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 70 .. AND R.p
6e70: 61 72 65 6e 74 20 49 53 20 4e 4f 54 20 4e 55 4c arent IS NOT NUL
6e80: 4c 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d 61 L -- Has prima
6e90: 72 79 20 70 61 72 65 6e 74 0a 20 20 20 20 55 4e ry parent. UN
6ea0: 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 33 29 20 4c ION. -- (3) L
6eb0: 61 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e ast NTDB on trun
6ec0: 6b 20 69 73 20 70 72 65 64 65 63 65 73 73 6f 72 k is predecessor
6ed0: 20 6f 66 20 63 68 69 6c 64 20 6f 66 20 74 72 75 of child of tru
6ee0: 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 20 53 45 4c nk root.. SEL
6ef0: 45 43 54 20 52 2e 72 69 64 2c 20 52 41 2e 64 62 ECT R.rid, RA.db
6f00: 70 61 72 65 6e 74 0a 09 20 20 20 20 46 52 4f 4d parent.. FROM
6f10: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 revision R, r
6f20: 65 76 69 73 69 6f 6e 20 52 41 0a 09 20 20 20 20 evision RA..
6f30: 57 48 45 52 45 20 20 52 2e 72 69 64 20 49 4e 20 WHERE R.rid IN
6f40: 24 74 68 65 73 65 74 20 20 20 20 20 20 20 20 20 $theset
6f50: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 -- Restrict to r
6f60: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 evisions of inte
6f70: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 rest.. AND
6f80: 20 4e 4f 54 20 52 2e 69 73 64 65 66 61 75 6c 74 NOT R.isdefault
6f90: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 6e 6f 74 -- not
6fa0: 20 6f 6e 20 4e 54 44 42 0a 09 20 20 20 20 41 4e on NTDB.. AN
6fb0: 44 20 20 20 20 52 2e 70 61 72 65 6e 74 20 49 53 D R.parent IS
6fc0: 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 20 2d 2d NOT NULL --
6fd0: 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 72 which are not r
6fe0: 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 oot.. AND
6ff0: 52 41 2e 72 69 64 20 3d 20 52 2e 70 61 72 65 6e RA.rid = R.paren
7000: 74 20 20 20 20 20 20 20 20 2d 2d 20 67 6f 20 74 t -- go t
7010: 6f 20 74 68 65 69 72 20 70 61 72 65 6e 74 0a 09 o their parent..
7020: 20 20 20 20 41 4e 44 20 20 20 20 52 41 2e 64 62 AND RA.db
7030: 70 61 72 65 6e 74 20 49 53 20 4e 4f 54 20 4e 55 parent IS NOT NU
7040: 4c 4c 20 20 2d 2d 20 77 68 69 63 68 20 68 61 73 LL -- which has
7050: 20 74 6f 20 72 65 66 65 72 20 74 6f 20 4e 54 44 to refer to NTD
7060: 42 27 73 20 72 6f 6f 74 0a 09 22 5d 20 7b 0a 09 B's root.."] {..
7070: 20 20 20 20 23 20 43 6f 6e 73 69 64 65 72 20 6d # Consider m
7080: 6f 76 69 6e 67 20 74 68 69 73 20 74 6f 20 74 68 oving this to th
7090: 65 20 69 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 e integrity modu
70a0: 6c 65 2e 0a 09 20 20 20 20 69 6e 74 65 67 72 69 le... integri
70b0: 74 79 20 61 73 73 65 72 74 20 7b 24 72 69 64 20 ty assert {$rid
70c0: 21 3d 20 24 70 61 72 65 6e 74 7d 20 7b 52 65 76 != $parent} {Rev
70d0: 69 73 69 6f 6e 20 24 72 69 64 20 64 65 70 65 6e ision $rid depen
70e0: 64 73 20 6f 6e 20 69 74 73 65 6c 66 2e 7d 0a 09 ds on itself.}..
70f0: 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 lappend depe
7100: 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 ndencies([list r
7110: 65 76 20 24 72 69 64 5d 29 20 5b 6c 69 73 74 20 ev $rid]) [list
7120: 72 65 76 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a rev $parent]..}.
7130: 0a 09 23 20 54 68 65 20 72 65 76 69 73 69 6f 6e ..# The revision
7140: 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65 20 s which are the
7150: 66 69 72 73 74 20 6f 6e 20 61 20 62 72 61 6e 63 first on a branc
7160: 68 20 68 61 76 65 20 74 68 61 74 0a 09 23 20 62 h have that..# b
7170: 72 61 6e 63 68 20 61 73 20 74 68 65 69 72 20 70 ranch as their p
7180: 72 65 64 65 63 65 73 73 6f 72 2e 20 4e 6f 74 65 redecessor. Note
7190: 20 74 68 61 74 20 72 65 76 69 73 69 6f 6e 73 20 that revisions
71a0: 63 61 6e 6e 6f 74 20 62 65 0a 09 23 20 6f 6e 20 cannot be..# on
71b0: 74 61 67 73 20 69 6e 20 74 68 65 20 73 61 6d 65 tags in the same
71c0: 20 6d 61 6e 6e 65 72 2c 20 73 6f 20 74 61 67 73 manner, so tags
71d0: 20 63 61 6e 6e 6f 74 20 62 65 20 70 72 65 64 65 cannot be prede
71e0: 63 65 73 73 6f 72 73 0a 09 23 20 6f 66 20 72 65 cessors..# of re
71f0: 76 69 73 69 6f 6e 73 2e 20 54 68 69 73 20 63 6f visions. This co
7200: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 74 mplements that t
7210: 68 65 79 20 68 61 76 65 20 6e 6f 20 73 75 63 63 hey have no succ
7220: 65 73 73 6f 72 73 0a 09 23 20 28 53 65 65 20 73 essors..# (See s
7230: 79 6d 3a 3a 74 61 67 2f 73 75 63 63 65 73 73 6f ym::tag/successo
7240: 72 73 29 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b rs)....foreach {
7250: 72 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 rid parent} [sta
7260: 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 te run ".. SE
7270: 4c 45 43 54 20 52 2e 72 69 64 20 42 2e 62 69 64 LECT R.rid B.bid
7280: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 .. FROM rev
7290: 69 73 69 6f 6e 20 52 2c 20 62 72 61 6e 63 68 20 ision R, branch
72a0: 42 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e B.. WHERE R.
72b0: 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 rid IN $theset..
72c0: 20 20 20 20 41 4e 44 20 20 20 20 42 2e 66 69 72 AND B.fir
72d0: 73 74 20 3d 20 52 2e 72 69 64 0a 09 22 5d 20 7b st = R.rid.."] {
72e0: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 .. lappend de
72f0: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 pendencies([list
7300: 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c 69 73 rev $rid]) [lis
7310: 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 70 t sym::branch $p
7320: 61 72 65 6e 74 5d 0a 09 7d 0a 09 72 65 74 75 72 arent]..}..retur
7330: 6e 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 n. }.}..# # #
7340: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 # ### ##### ####
7350: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 #### ###########
7360: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 ## #############
7370: 23 23 23 23 23 23 23 23 0a 23 23 20 48 65 6c 70 ########.## Help
7380: 65 72 20 73 69 6e 67 6c 65 74 6f 6e 2e 20 43 6f er singleton. Co
7390: 6d 6d 61 6e 64 73 20 66 6f 72 20 74 61 67 20 73 mmands for tag s
73a0: 79 6d 62 6f 6c 20 63 68 61 6e 67 65 73 65 74 73 ymbol changesets
73b0: 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20 3a 3a ...snit::type ::
73c0: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f vc::fossil::impo
73d0: 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 rt::cvs::project
73e0: 3a 3a 72 65 76 3a 3a 73 79 6d 3a 3a 74 61 67 20 ::rev::sym::tag
73f0: 7b 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 {. typemethod
7400: 20 62 79 72 65 76 69 73 69 6f 6e 20 7b 7d 20 7b byrevision {} {
7410: 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20 return 0 }.
7420: 74 79 70 65 6d 65 74 68 6f 64 20 62 79 73 79 6d typemethod bysym
7430: 62 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 bol {} { retur
7440: 6e 20 31 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 n 1 }. typeme
7450: 74 68 6f 64 20 69 73 74 61 67 20 20 20 20 20 20 thod istag
7460: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a {} { return 1 }.
7470: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 typemethod i
7480: 73 62 72 61 6e 63 68 20 20 20 7b 7d 20 7b 20 72 sbranch {} { r
7490: 65 74 75 72 6e 20 30 20 7d 0a 0a 20 20 20 20 23 eturn 0 }.. #
74a0: 20 72 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 result = list (
74b0: 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74 69 6d 65 mintime, maxtime
74c0: 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 ). typemethod
74d0: 20 74 69 6d 65 72 61 6e 67 65 20 7b 74 61 67 73 timerange {tags
74e0: 7d 20 7b 0a 09 23 20 54 68 65 20 72 61 6e 67 65 } {..# The range
74f0: 20 69 73 20 64 65 66 69 6e 65 64 20 61 73 20 74 is defined as t
7500: 68 65 20 72 61 6e 67 65 20 6f 66 20 74 68 65 20 he range of the
7510: 72 65 76 69 73 69 6f 6e 73 20 74 68 65 20 74 61 revisions the ta
7520: 67 73 0a 09 23 20 61 72 65 20 61 74 74 61 63 68 gs..# are attach
7530: 65 64 20 74 6f 2e 0a 0a 09 73 65 74 20 74 68 65 ed to....set the
7540: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 74 61 67 set ('[join $tag
7550: 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 s {','}]')..retu
7560: 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a rn [state run ".
7570: 09 20 20 20 20 53 45 4c 45 43 54 20 4d 49 4e 28 . SELECT MIN(
7580: 52 2e 64 61 74 65 29 2c 20 4d 41 58 28 52 2e 64 R.date), MAX(R.d
7590: 61 74 65 29 0a 09 20 20 20 20 46 52 4f 4d 20 72 ate).. FROM r
75a0: 65 76 69 73 69 6f 6e 20 52 2c 20 74 61 67 20 54 evision R, tag T
75b0: 0a 09 20 20 20 20 57 48 45 52 45 20 54 2e 74 69 .. WHERE T.ti
75c0: 64 20 49 4e 20 24 74 68 65 73 65 74 0a 20 20 20 d IN $theset.
75d0: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 52 AND R
75e0: 2e 72 69 64 20 3d 20 54 2e 72 65 76 0a 09 22 5d .rid = T.rev.."]
75f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 . }.. # va
7600: 72 28 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 r(dv) = dict (it
7610: 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d em -> list (item
7620: 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 )), item = list
7630: 20 28 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 (type id). t
7640: 79 70 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73 ypemethod succes
7650: 73 6f 72 73 20 7b 64 76 20 74 61 67 73 7d 20 7b sors {dv tags} {
7660: 0a 09 23 20 54 61 67 73 20 68 61 76 65 20 6e 6f ..# Tags have no
7670: 20 73 75 63 63 65 73 73 6f 72 73 2e 0a 09 72 65 successors...re
7680: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 turn. }..
7690: 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 # var(dv) = dict
76a0: 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 (item -> list (
76b0: 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 item)), item =
76c0: 6c 69 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 list (type id).
76d0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 70 72 typemethod pr
76e0: 65 64 65 63 65 73 73 6f 72 73 20 7b 64 76 20 74 edecessors {dv t
76f0: 61 67 73 7d 20 7b 0a 09 23 20 54 68 65 20 70 72 ags} {..# The pr
7700: 65 64 65 63 65 73 73 6f 72 73 20 6f 66 20 61 20 edecessors of a
7710: 74 61 67 20 61 72 65 20 61 6c 6c 20 74 68 65 20 tag are all the
7720: 72 65 76 69 73 69 6f 6e 73 20 74 68 65 20 74 61 revisions the ta
7730: 67 73 20 61 72 65 0a 09 23 20 61 74 74 61 63 68 gs are..# attach
7740: 65 64 20 74 6f 2c 20 61 73 20 77 65 6c 6c 20 61 ed to, as well a
7750: 73 20 61 6c 6c 20 74 68 65 20 62 72 61 6e 63 68 s all the branch
7760: 65 73 20 6f 72 20 74 61 67 73 20 77 68 69 63 68 es or tags which
7770: 20 61 72 65 0a 09 23 20 74 68 65 69 72 20 70 72 are..# their pr
7780: 65 66 65 72 65 64 20 70 61 72 65 6e 74 73 2e 0a efered parents..
7790: 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b ..set theset ('[
77a0: 6a 6f 69 6e 20 24 74 61 67 73 20 7b 27 2c 27 7d join $tags {','}
77b0: 5d 27 29 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 ]')..foreach {ti
77c0: 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 d parent} [state
77d0: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 run ".. SELE
77e0: 43 54 20 54 2e 74 69 64 2c 20 52 2e 72 69 64 0a CT T.tid, R.rid.
77f0: 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 . FROM revi
7800: 73 69 6f 6e 20 52 2c 20 74 61 67 20 54 0a 09 20 sion R, tag T..
7810: 20 20 20 57 48 45 52 45 20 20 54 2e 74 69 64 20 WHERE T.tid
7820: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 IN $theset..
7830: 41 4e 44 20 20 20 20 54 2e 72 65 76 20 3d 20 52 AND T.rev = R
7840: 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 .rid.."] {..
7850: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e lappend dependen
7860: 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a cies([list sym::
7870: 74 61 67 20 24 74 69 64 5d 29 20 5b 6c 69 73 74 tag $tid]) [list
7880: 20 72 65 76 20 24 70 61 72 65 6e 74 5d 0a 09 7d rev $parent]..}
7890: 0a 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 ...foreach {tid
78a0: 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 parent} [state r
78b0: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 un ".. SELECT
78c0: 20 54 2e 74 69 64 2c 20 42 2e 62 69 64 0a 09 20 T.tid, B.bid..
78d0: 20 20 20 46 52 4f 4d 20 20 20 74 61 67 20 54 2c FROM tag T,
78e0: 20 62 72 61 6e 63 68 20 42 2c 20 70 72 65 66 65 branch B, prefe
78f0: 72 65 64 70 61 72 65 6e 74 20 50 0a 09 20 20 20 redparent P..
7900: 20 57 48 45 52 45 20 20 54 2e 74 69 64 20 49 4e WHERE T.tid IN
7910: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e $theset.. AN
7920: 44 20 20 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 D T.sid = P.s
7930: 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50 id.. AND P
7940: 2e 70 69 64 20 3d 20 42 2e 73 69 64 0a 09 22 5d .pid = B.sid.."]
7950: 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 {.. lappend
7960: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 dependencies([li
7970: 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 74 69 64 st sym::tag $tid
7980: 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 ]) [list sym::br
7990: 61 6e 63 68 20 24 70 61 72 65 6e 74 5d 0a 09 7d anch $parent]..}
79a0: 0a 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 ...foreach {tid
79b0: 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 parent} [state r
79c0: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 un ".. SELECT
79d0: 20 54 2e 74 69 64 2c 20 54 58 2e 74 69 64 0a 09 T.tid, TX.tid..
79e0: 20 20 20 20 46 52 4f 4d 20 20 20 74 61 67 20 54 FROM tag T
79f0: 2c 20 74 61 67 20 54 58 2c 20 70 72 65 66 65 72 , tag TX, prefer
7a00: 65 64 70 61 72 65 6e 74 20 50 0a 09 20 20 20 20 edparent P..
7a10: 57 48 45 52 45 20 20 54 2e 74 69 64 20 49 4e 20 WHERE T.tid IN
7a20: 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 $theset.. AND
7a30: 20 20 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 69 T.sid = P.si
7a40: 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e d.. AND P.
7a50: 70 69 64 20 3d 20 54 58 2e 73 69 64 0a 09 22 5d pid = TX.sid.."]
7a60: 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 {.. lappend
7a70: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 dependencies([li
7a80: 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 74 69 64 st sym::tag $tid
7a90: 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 ]) [list sym::ta
7aa0: 67 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 72 g $parent]..}..r
7ab0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 7d 0a 0a 23 eturn. }.}..#
7ac0: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 # ## ### #####
7ad0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
7ae0: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 ###### #########
7af0: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 ############.##
7b00: 48 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e Helper singleton
7b10: 2e 20 43 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 62 . Commands for b
7b20: 72 61 6e 63 68 20 73 79 6d 62 6f 6c 20 63 68 61 ranch symbol cha
7b30: 6e 67 65 73 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a ngesets...snit::
7b40: 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 type ::vc::fossi
7b50: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a l::import::cvs::
7b60: 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 73 79 project::rev::sy
7b70: 6d 3a 3a 62 72 61 6e 63 68 20 7b 0a 20 20 20 20 m::branch {.
7b80: 74 79 70 65 6d 65 74 68 6f 64 20 62 79 72 65 76 typemethod byrev
7b90: 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75 72 ision {} { retur
7ba0: 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 n 0 }. typeme
7bb0: 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 20 thod bysymbol
7bc0: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a {} { return 1 }.
7bd0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 typemethod i
7be0: 73 74 61 67 20 20 20 20 20 20 7b 7d 20 7b 20 72 stag {} { r
7bf0: 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 eturn 0 }. ty
7c00: 70 65 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63 pemethod isbranc
7c10: 68 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 h {} { return
7c20: 31 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 1 }.. # resul
7c30: 74 20 3d 20 6c 69 73 74 20 28 6d 69 6e 74 69 6d t = list (mintim
7c40: 65 2c 20 6d 61 78 74 69 6d 65 29 0a 20 20 20 20 e, maxtime).
7c50: 74 79 70 65 6d 65 74 68 6f 64 20 74 69 6d 65 72 typemethod timer
7c60: 61 6e 67 65 20 7b 62 72 61 6e 63 68 65 73 7d 20 ange {branches}
7c70: 7b 0a 09 23 20 54 68 65 20 72 61 6e 67 65 20 6f {..# The range o
7c80: 66 20 61 20 62 72 61 6e 63 68 20 69 73 20 64 65 f a branch is de
7c90: 66 69 6e 65 64 20 61 73 20 74 68 65 20 72 61 6e fined as the ran
7ca0: 67 65 20 6f 66 20 74 68 65 0a 09 23 20 72 65 76 ge of the..# rev
7cb0: 69 73 69 6f 6e 73 20 74 68 65 20 62 72 61 6e 63 isions the branc
7cc0: 68 65 73 20 61 72 65 20 73 70 61 77 6e 65 64 20 hes are spawned
7cd0: 62 79 2e 20 4e 4f 54 45 20 68 6f 77 65 76 65 72 by. NOTE however
7ce0: 20 74 68 61 74 20 74 68 65 0a 09 23 20 62 72 61 that the..# bra
7cf0: 6e 63 68 65 73 20 61 73 73 6f 63 69 61 74 65 64 nches associated
7d00: 20 77 69 74 68 20 61 20 64 65 74 61 63 68 65 64 with a detached
7d10: 20 4e 54 44 42 20 77 69 6c 6c 20 68 61 76 65 20 NTDB will have
7d20: 6e 6f 20 72 6f 6f 74 0a 09 23 20 73 70 61 77 6e no root..# spawn
7d30: 69 6e 67 20 74 68 65 6d 2c 20 68 65 6e 63 65 20 ing them, hence
7d40: 74 68 65 79 20 68 61 76 65 20 6e 6f 20 72 65 61 they have no rea
7d50: 6c 20 74 69 6d 65 72 61 6e 67 65 20 61 6e 79 0a l timerange any.
7d60: 09 23 20 6c 6f 6e 67 65 72 2e 20 42 79 20 75 73 .# longer. By us
7d70: 69 6e 67 20 30 20 77 65 20 70 75 74 20 74 68 65 ing 0 we put the
7d80: 6d 20 69 6e 20 66 72 6f 6e 74 20 6f 66 20 65 76 m in front of ev
7d90: 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2c 0a 09 erything else,..
7da0: 23 20 61 73 20 74 68 65 79 20 6c 6f 67 69 63 61 # as they logica
7db0: 6c 6c 79 20 61 72 65 2e 0a 0a 09 73 65 74 20 74 lly are....set t
7dc0: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62 heset ('[join $b
7dd0: 72 61 6e 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29 ranches {','}]')
7de0: 0a 09 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20 ..return [state
7df0: 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 run ".. SELEC
7e00: 54 20 49 46 4e 55 4c 4c 28 4d 49 4e 28 52 2e 64 T IFNULL(MIN(R.d
7e10: 61 74 65 29 2c 30 29 2c 20 49 46 4e 55 4c 4c 28 ate),0), IFNULL(
7e20: 4d 41 58 28 52 2e 64 61 74 65 29 2c 30 29 0a 09 MAX(R.date),0)..
7e30: 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f FROM revisio
7e40: 6e 20 52 2c 20 62 72 61 6e 63 68 20 42 0a 09 20 n R, branch B..
7e50: 20 20 20 57 48 45 52 45 20 42 2e 62 69 64 20 49 WHERE B.bid I
7e60: 4e 20 24 74 68 65 73 65 74 0a 20 20 20 20 20 20 N $theset.
7e70: 20 20 20 20 20 20 41 4e 44 20 20 20 52 2e 72 69 AND R.ri
7e80: 64 20 3d 20 42 2e 72 6f 6f 74 0a 09 22 5d 0a 20 d = B.root.."].
7e90: 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 }.. # var(
7ea0: 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d dv) = dict (item
7eb0: 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29 -> list (item))
7ec0: 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 , item = list (
7ed0: 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 70 type id). typ
7ee0: 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f emethod successo
7ef0: 72 73 20 7b 64 76 20 62 72 61 6e 63 68 65 73 7d rs {dv branches}
7f00: 20 7b 0a 09 23 20 54 68 65 20 66 69 72 73 74 20 {..# The first
7f10: 72 65 76 69 73 69 6f 6e 20 63 6f 6d 6d 69 74 74 revision committ
7f20: 65 64 20 6f 6e 20 61 20 62 72 61 6e 63 68 2c 20 ed on a branch,
7f30: 61 6e 64 20 61 6c 6c 20 62 72 61 6e 63 68 65 73 and all branches
7f40: 0a 09 23 20 61 6e 64 20 74 61 67 73 20 77 68 69 ..# and tags whi
7f50: 63 68 20 68 61 76 65 20 69 74 20 61 73 20 74 68 ch have it as th
7f60: 65 69 72 20 70 72 65 66 65 72 65 64 20 70 61 72 eir prefered par
7f70: 65 6e 74 20 61 72 65 20 74 68 65 0a 09 23 20 73 ent are the..# s
7f80: 75 63 63 65 73 73 6f 72 73 20 6f 66 20 61 20 62 uccessors of a b
7f90: 72 61 6e 63 68 2e 0a 0a 09 73 65 74 20 74 68 65 ranch....set the
7fa0: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61 set ('[join $bra
7fb0: 6e 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 nches {','}]')..
7fc0: 66 6f 72 65 61 63 68 20 7b 62 69 64 20 63 68 69 foreach {bid chi
7fd0: 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 ld} [state run "
7fe0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62 .. SELECT B.b
7ff0: 69 64 2c 20 52 2e 72 69 64 0a 09 20 20 20 20 46 id, R.rid.. F
8000: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 ROM revision R
8010: 2c 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20 20 , branch B..
8020: 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20 WHERE B.bid IN
8030: 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 $theset.. AND
8040: 20 20 20 20 42 2e 66 69 72 73 74 20 3d 20 52 2e B.first = R.
8050: 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c rid.."] {.. l
8060: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 append dependenc
8070: 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 ies([list sym::t
8080: 61 67 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 20 ag $bid]) [list
8090: 72 65 76 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 rev $child]..}..
80a0: 66 6f 72 65 61 63 68 20 7b 62 69 64 20 63 68 69 foreach {bid chi
80b0: 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 ld} [state run "
80c0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62 .. SELECT B.b
80d0: 69 64 2c 20 42 58 2e 62 69 64 0a 09 20 20 20 20 id, BX.bid..
80e0: 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c FROM branch B,
80f0: 20 62 72 61 6e 63 68 20 42 58 2c 20 70 72 65 66 branch BX, pref
8100: 65 72 65 64 70 61 72 65 6e 74 20 50 0a 09 20 20 eredparent P..
8110: 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 WHERE B.bid I
8120: 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 N $theset.. A
8130: 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50 2e ND B.sid = P.
8140: 70 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 pid.. AND
8150: 42 58 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a 09 BX.sid = P.sid..
8160: 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e "] {.. lappen
8170: 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b d dependencies([
8180: 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 62 list sym::tag $b
8190: 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a id]) [list sym::
81a0: 62 72 61 6e 63 68 20 24 63 68 69 6c 64 5d 0a 09 branch $child]..
81b0: 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64 20 }..foreach {bid
81c0: 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 child} [state ru
81d0: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 n ".. SELECT
81e0: 42 2e 62 69 64 2c 20 54 2e 74 69 64 0a 09 20 20 B.bid, T.tid..
81f0: 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 FROM branch
8200: 42 2c 20 74 61 67 20 54 2c 20 70 72 65 66 65 72 B, tag T, prefer
8210: 65 64 70 61 72 65 6e 74 20 50 0a 09 20 20 20 20 edparent P..
8220: 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20 WHERE B.bid IN
8230: 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 $theset.. AND
8240: 20 20 20 20 42 2e 73 69 64 20 3d 20 50 2e 70 69 B.sid = P.pi
8250: 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 54 2e d.. AND T.
8260: 73 69 64 20 3d 20 50 2e 73 69 64 0a 09 22 5d 20 sid = P.sid.."]
8270: 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 {.. lappend d
8280: 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 ependencies([lis
8290: 74 20 73 79 6d 3a 3a 74 61 67 20 24 62 69 64 5d t sym::tag $bid]
82a0: 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 ) [list sym::tag
82b0: 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 72 65 74 $child]..}..ret
82c0: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 urn. }.. #
82d0: 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20 var(dv) = dict
82e0: 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 (item -> list (i
82f0: 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c tem)), item = l
8300: 69 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 20 ist (type id).
8310: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 70 72 65 typemethod pre
8320: 64 65 63 65 73 73 6f 72 73 20 7b 64 76 20 62 72 decessors {dv br
8330: 61 6e 63 68 65 73 7d 20 7b 0a 09 23 20 54 68 65 anches} {..# The
8340: 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 6f 66 predecessors of
8350: 20 61 20 62 72 61 6e 63 68 20 61 72 65 20 61 6c a branch are al
8360: 6c 20 74 68 65 20 72 65 76 69 73 69 6f 6e 73 20 l the revisions
8370: 74 68 65 0a 09 23 20 62 72 61 6e 63 68 65 73 20 the..# branches
8380: 61 72 65 20 73 70 61 77 6e 65 64 20 66 72 6f 6d are spawned from
8390: 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 61 6c 6c , as well as all
83a0: 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 6f 72 the branches or
83b0: 0a 09 23 20 74 61 67 73 20 77 68 69 63 68 20 61 ..# tags which a
83c0: 72 65 20 74 68 65 69 72 20 70 72 65 66 65 72 65 re their prefere
83d0: 64 20 70 61 72 65 6e 74 73 2e 0a 0a 09 73 65 74 d parents....set
83e0: 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 theset ('[join
83f0: 24 74 61 67 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 $tags {','}]')..
8400: 66 6f 72 65 61 63 68 20 7b 62 69 64 20 70 61 72 foreach {bid par
8410: 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 ent} [state run
8420: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e ".. SELECT B.
8430: 42 69 64 2c 20 52 2e 72 69 64 0a 09 20 20 20 20 Bid, R.rid..
8440: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 FROM revision
8450: 52 2c 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20 R, branch B..
8460: 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e WHERE B.bid IN
8470: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e $theset.. AN
8480: 44 20 20 20 20 42 2e 72 6f 6f 74 20 3d 20 52 2e D B.root = R.
8490: 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c rid.."] {.. l
84a0: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 append dependenc
84b0: 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 ies([list sym::b
84c0: 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c 69 ranch $bid]) [li
84d0: 73 74 20 72 65 76 20 24 70 61 72 65 6e 74 5d 0a st rev $parent].
84e0: 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64 .}..foreach {bid
84f0: 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 parent} [state
8500: 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 run ".. SELEC
8510: 54 20 42 2e 62 69 64 2c 20 42 58 2e 62 69 64 0a T B.bid, BX.bid.
8520: 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e . FROM bran
8530: 63 68 20 42 2c 20 62 72 61 6e 63 68 20 42 58 2c ch B, branch BX,
8540: 20 70 72 65 66 65 72 65 64 70 61 72 65 6e 74 20 preferedparent
8550: 50 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e P.. WHERE B.
8560: 62 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 bid IN $theset..
8570: 20 20 20 20 41 4e 44 20 20 20 20 42 2e 73 69 64 AND B.sid
8580: 20 3d 20 50 2e 73 69 64 0a 09 20 20 20 20 41 4e = P.sid.. AN
8590: 44 20 20 20 20 50 2e 70 69 64 20 3d 20 42 58 2e D P.pid = BX.
85a0: 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c sid.."] {.. l
85b0: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 append dependenc
85c0: 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 ies([list sym::b
85d0: 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c 69 ranch $bid]) [li
85e0: 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 st sym::branch $
85f0: 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 66 6f 72 65 parent]..}..fore
8600: 61 63 68 20 7b 62 69 64 20 70 61 72 65 6e 74 7d ach {bid parent}
8610: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 [state run "..
8620: 20 20 20 53 45 4c 45 43 54 20 42 2e 62 69 64 2c SELECT B.bid,
8630: 20 54 2e 74 69 64 0a 09 20 20 20 20 46 52 4f 4d T.tid.. FROM
8640: 20 20 20 62 72 61 6e 63 68 20 42 2c 20 74 61 67 branch B, tag
8650: 20 54 2c 20 70 72 65 66 65 72 65 64 70 61 72 65 T, preferedpare
8660: 6e 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 20 nt P.. WHERE
8670: 20 42 2e 74 69 64 20 49 4e 20 24 74 68 65 73 65 B.tid IN $these
8680: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e t.. AND B.
8690: 73 69 64 20 3d 20 50 2e 73 69 64 0a 09 20 20 20 sid = P.sid..
86a0: 20 41 4e 44 20 20 20 20 50 2e 70 69 64 20 3d 20 AND P.pid =
86b0: 54 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 T.sid.."] {..
86c0: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 lappend depende
86d0: 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a ncies([list sym:
86e0: 3a 62 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b :branch $bid]) [
86f0: 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 70 list sym::tag $p
8700: 61 72 65 6e 74 5d 0a 09 7d 0a 09 72 65 74 75 72 arent]..}..retur
8710: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 n. }.. # #
8720: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 ## ### ##### ##
8730: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 ###### #########
8740: 23 23 23 23 0a 20 20 20 20 23 23 20 43 6f 6e 66 ####. ## Conf
8750: 69 67 75 72 61 74 69 6f 6e 0a 0a 20 20 20 20 70 iguration.. p
8760: 72 61 67 6d 61 20 2d 68 61 73 69 6e 73 74 61 6e ragma -hasinstan
8770: 63 65 73 20 20 20 6e 6f 20 3b 20 23 20 73 69 6e ces no ; # sin
8780: 67 6c 65 74 6f 6e 0a 20 20 20 20 70 72 61 67 6d gleton. pragm
8790: 61 20 2d 68 61 73 74 79 70 65 69 6e 66 6f 20 20 a -hastypeinfo
87a0: 20 20 6e 6f 20 3b 20 23 20 6e 6f 20 69 6e 74 72 no ; # no intr
87b0: 6f 73 70 65 63 74 69 6f 6e 0a 20 20 20 20 70 72 ospection. pr
87c0: 61 67 6d 61 20 2d 68 61 73 74 79 70 65 64 65 73 agma -hastypedes
87d0: 74 72 6f 79 20 6e 6f 20 3b 20 23 20 69 6d 6d 6f troy no ; # immo
87e0: 72 74 61 6c 0a 7d 0a 0a 23 20 23 20 23 23 20 23 rtal.}..# # ## #
87f0: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 ## ##### #######
8800: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 # #############
8810: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
8820: 23 23 23 23 23 0a 23 23 0a 0a 6e 61 6d 65 73 70 #####.##..namesp
8830: 61 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a 66 ace eval ::vc::f
8840: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 ossil::import::c
8850: 76 73 3a 3a 70 72 6f 6a 65 63 74 20 7b 0a 20 20 vs::project {.
8860: 20 20 6e 61 6d 65 73 70 61 63 65 20 65 78 70 6f namespace expo
8870: 72 74 20 72 65 76 0a 20 20 20 20 6e 61 6d 65 73 rt rev. names
8880: 70 61 63 65 20 65 76 61 6c 20 72 65 76 20 7b 0a pace eval rev {.
8890: 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 .namespace impor
88a0: 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a t ::vc::fossil::
88b0: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 import::cvs::sta
88c0: 74 65 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d te..namespace im
88d0: 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 port ::vc::fossi
88e0: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a l::import::cvs::
88f0: 69 6e 74 65 67 72 69 74 79 0a 09 6e 61 6d 65 73 integrity..names
8900: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 pace import ::vc
8910: 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69 73 63 3a 3a 2a ::tools::misc::*
8920: 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f ..namespace impo
8930: 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a rt ::vc::tools::
8940: 74 72 6f 75 62 6c 65 0a 09 6e 61 6d 65 73 70 61 trouble..namespa
8950: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a ce import ::vc::
8960: 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 6c 6f 67 20 tools::log..log
8970: 72 65 67 69 73 74 65 72 20 63 73 65 74 73 0a 0a register csets..
8980: 09 23 20 53 65 74 20 75 70 20 74 68 65 20 68 65 .# Set up the he
8990: 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 73 0a lper singletons.
89a0: 09 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 .namespace eval
89b0: 72 65 76 20 7b 0a 09 20 20 20 20 6e 61 6d 65 73 rev {.. names
89c0: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 pace import ::vc
89d0: 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 ::fossil::import
89e0: 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09 20 20 ::cvs::state..
89f0: 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f namespace impo
8a00: 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a rt ::vc::fossil:
8a10: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e :import::cvs::in
8a20: 74 65 67 72 69 74 79 0a 09 7d 0a 09 6e 61 6d 65 tegrity..}..name
8a30: 73 70 61 63 65 20 65 76 61 6c 20 73 79 6d 3a 3a space eval sym::
8a40: 74 61 67 20 7b 0a 09 20 20 20 20 6e 61 6d 65 73 tag {.. names
8a50: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 pace import ::vc
8a60: 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 ::fossil::import
8a70: 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09 20 20 ::cvs::state..
8a80: 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f namespace impo
8a90: 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a rt ::vc::fossil:
8aa0: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e :import::cvs::in
8ab0: 74 65 67 72 69 74 79 0a 09 7d 0a 09 6e 61 6d 65 tegrity..}..name
8ac0: 73 70 61 63 65 20 65 76 61 6c 20 73 79 6d 3a 3a space eval sym::
8ad0: 62 72 61 6e 63 68 20 7b 0a 09 20 20 20 20 6e 61 branch {.. na
8ae0: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a mespace import :
8af0: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 :vc::fossil::imp
8b00: 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a ort::cvs::state.
8b10: 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 . namespace i
8b20: 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 mport ::vc::foss
8b30: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a il::import::cvs:
8b40: 3a 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a 20 20 :integrity..}.
8b50: 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 }.}..# # ## ##
8b60: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 # ##### ########
8b70: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23 ############# #
8b80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
8b90: 23 23 23 23 0a 23 23 20 52 65 61 64 79 0a 0a 70 ####.## Ready..p
8ba0: 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20 76 ackage provide v
8bb0: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 c::fossil::impor
8bc0: 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a t::cvs::project:
8bd0: 3a 72 65 76 20 31 2e 30 0a 72 65 74 75 72 6e 0a :rev 1.0.return.