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 20 6c 61 70 70 65 6e 64 20 6d ions { lappend m
0820: 79 72 65 76 6d 61 70 28 24 72 29 20 24 73 65 6c yrevmap($r) $sel
0830: 66 20 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 f }..return.
0840: 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 74 }.. method st
0850: 72 20 7b 7d 20 7b 0a 09 73 65 74 20 73 74 72 20 r {} {..set str
0860: 20 20 20 22 3c 22 0a 09 73 65 74 20 64 65 74 61 "<"..set deta
0870: 69 6c 20 22 22 0a 09 69 66 20 7b 5b 24 6d 79 74 il ""..if {[$myt
0880: 79 70 65 6f 62 6a 20 62 79 73 79 6d 62 6f 6c 5d ypeobj bysymbol]
0890: 7d 20 7b 0a 09 20 20 20 20 73 65 74 20 64 65 74 } {.. set det
08a0: 61 69 6c 20 22 20 27 5b 73 74 61 74 65 20 6f 6e ail " '[state on
08b0: 65 20 7b 0a 09 09 53 45 4c 45 43 54 20 53 2e 6e e {...SELECT S.n
08c0: 61 6d 65 0a 09 09 46 52 4f 4d 20 20 20 73 79 6d ame...FROM sym
08d0: 62 6f 6c 20 53 0a 09 09 57 48 45 52 45 20 20 53 bol S...WHERE S
08e0: 2e 73 69 64 20 3d 20 24 6d 79 73 72 63 69 64 0a .sid = $mysrcid.
08f0: 09 20 20 20 20 7d 5d 27 22 0a 09 7d 0a 09 61 70 . }]'"..}..ap
0900: 70 65 6e 64 20 73 74 72 20 22 24 6d 79 74 79 70 pend str "$mytyp
0910: 65 20 24 7b 6d 79 69 64 7d 24 7b 64 65 74 61 69 e ${myid}${detai
0920: 6c 7d 3e 22 0a 09 72 65 74 75 72 6e 20 24 73 74 l}>"..return $st
0930: 72 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 r. }.. met
0940: 68 6f 64 20 69 64 20 20 20 20 20 20 20 20 7b 7d hod id {}
0950: 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 64 20 { return $myid
0960: 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20 72 65 76 }. method rev
0970: 69 73 69 6f 6e 73 20 7b 7d 20 7b 20 72 65 74 75 isions {} { retu
0980: 72 6e 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 20 rn $myrevisions
0990: 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20 64 61 74 }. method dat
09a0: 61 20 20 20 20 20 20 7b 7d 20 7b 20 72 65 74 75 a {} { retu
09b0: 72 6e 20 5b 6c 69 73 74 20 24 6d 79 70 72 6f 6a rn [list $myproj
09c0: 65 63 74 20 24 6d 79 74 79 70 65 20 24 6d 79 73 ect $mytype $mys
09d0: 72 63 69 64 5d 20 7d 0a 0a 20 20 20 20 64 65 6c rcid] }.. del
09e0: 65 67 61 74 65 20 6d 65 74 68 6f 64 20 62 79 73 egate method bys
09f0: 79 6d 62 6f 6c 20 20 20 74 6f 20 6d 79 74 79 70 ymbol to mytyp
0a00: 65 6f 62 6a 0a 20 20 20 20 64 65 6c 65 67 61 74 eobj. delegat
0a10: 65 20 6d 65 74 68 6f 64 20 62 79 72 65 76 69 73 e method byrevis
0a20: 69 6f 6e 20 74 6f 20 6d 79 74 79 70 65 6f 62 6a ion to mytypeobj
0a30: 0a 20 20 20 20 64 65 6c 65 67 61 74 65 20 6d 65 . delegate me
0a40: 74 68 6f 64 20 69 73 62 72 61 6e 63 68 20 20 20 thod isbranch
0a50: 74 6f 20 6d 79 74 79 70 65 6f 62 6a 0a 20 20 20 to mytypeobj.
0a60: 20 64 65 6c 65 67 61 74 65 20 6d 65 74 68 6f 64 delegate method
0a70: 20 69 73 74 61 67 20 20 20 20 20 20 74 6f 20 6d istag to m
0a80: 79 74 79 70 65 6f 62 6a 0a 0a 20 20 20 20 6d 65 ytypeobj.. me
0a90: 74 68 6f 64 20 73 65 74 70 6f 73 20 7b 70 7d 20 thod setpos {p}
0aa0: 7b 20 73 65 74 20 6d 79 70 6f 73 20 24 70 20 3b { set mypos $p ;
0ab0: 20 72 65 74 75 72 6e 20 7d 0a 20 20 20 20 6d 65 return }. me
0ac0: 74 68 6f 64 20 70 6f 73 20 20 20 20 7b 7d 20 20 thod pos {}
0ad0: 7b 20 72 65 74 75 72 6e 20 24 6d 79 70 6f 73 20 { return $mypos
0ae0: 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 }.. # result
0af0: 3d 20 64 69 63 74 20 28 72 65 76 69 73 69 6f 6e = dict (revision
0b00: 20 2d 3e 20 6c 69 73 74 20 28 63 68 61 6e 67 65 -> list (change
0b10: 73 65 74 29 29 0a 20 20 20 20 6d 65 74 68 6f 64 set)). method
0b20: 20 73 75 63 63 65 73 73 6f 72 6d 61 70 20 7b 7d successormap {}
0b30: 20 7b 0a 09 23 20 4e 4f 54 45 20 2f 20 46 55 54 {..# NOTE / FUT
0b40: 55 52 45 3a 20 50 6f 73 73 69 62 6c 65 20 62 6f URE: Possible bo
0b50: 74 74 6c 65 6e 65 63 6b 2e 0a 09 61 72 72 61 79 ttleneck...array
0b60: 20 73 65 74 20 74 6d 70 20 7b 7d 0a 09 66 6f 72 set tmp {}..for
0b70: 65 61 63 68 20 7b 72 65 76 20 63 68 69 6c 64 72 each {rev childr
0b80: 65 6e 7d 20 5b 24 73 65 6c 66 20 6e 65 78 74 6d en} [$self nextm
0b90: 61 70 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 ap] {.. forea
0ba0: 63 68 20 63 68 69 6c 64 20 24 63 68 69 6c 64 72 ch child $childr
0bb0: 65 6e 20 7b 0a 09 09 23 20 38 2e 35 20 6c 61 70 en {...# 8.5 lap
0bc0: 70 65 6e 64 20 74 6d 70 28 24 72 65 76 29 20 7b pend tmp($rev) {
0bd0: 2a 7d 24 6d 79 72 65 76 6d 61 70 28 24 63 68 69 *}$myrevmap($chi
0be0: 6c 64 29 0a 09 09 66 6f 72 65 61 63 68 20 63 73 ld)...foreach cs
0bf0: 65 74 20 24 6d 79 72 65 76 6d 61 70 28 24 63 68 et $myrevmap($ch
0c00: 69 6c 64 29 20 7b 0a 09 09 20 20 20 20 6c 61 70 ild) {... lap
0c10: 70 65 6e 64 20 74 6d 70 28 24 72 65 76 29 20 24 pend tmp($rev) $
0c20: 63 73 65 74 0a 09 09 7d 0a 09 20 20 20 20 7d 0a cset...}.. }.
0c30: 09 20 20 20 20 73 65 74 20 74 6d 70 28 24 72 65 . set tmp($re
0c40: 76 29 20 5b 6c 73 6f 72 74 20 2d 75 6e 69 71 75 v) [lsort -uniqu
0c50: 65 20 24 74 6d 70 28 24 72 65 76 29 5d 0a 09 7d e $tmp($rev)]..}
0c60: 0a 09 72 65 74 75 72 6e 20 5b 61 72 72 61 79 20 ..return [array
0c70: 67 65 74 20 74 6d 70 5d 0a 20 20 20 20 7d 0a 0a get tmp]. }..
0c80: 20 20 20 20 6d 65 74 68 6f 64 20 73 75 63 63 65 method succe
0c90: 73 73 6f 72 73 20 7b 7d 20 7b 0a 09 23 20 4e 4f ssors {} {..# NO
0ca0: 54 45 20 2f 20 46 55 54 55 52 45 3a 20 50 6f 73 TE / FUTURE: Pos
0cb0: 73 69 62 6c 65 20 62 6f 74 74 6c 65 6e 65 63 6b sible bottleneck
0cc0: 2e 0a 09 73 65 74 20 63 73 65 74 73 20 7b 7d 0a ...set csets {}.
0cd0: 09 66 6f 72 65 61 63 68 20 7b 5f 20 63 68 69 6c .foreach {_ chil
0ce0: 64 72 65 6e 7d 20 5b 24 73 65 6c 66 20 6e 65 78 dren} [$self nex
0cf0: 74 6d 61 70 5d 20 7b 0a 09 20 20 20 20 66 6f 72 tmap] {.. for
0d00: 65 61 63 68 20 63 68 69 6c 64 20 24 63 68 69 6c each child $chil
0d10: 64 72 65 6e 20 7b 0a 09 09 23 20 38 2e 35 20 6c dren {...# 8.5 l
0d20: 61 70 70 65 6e 64 20 63 73 65 74 73 20 7b 2a 7d append csets {*}
0d30: 24 6d 79 72 65 76 6d 61 70 28 24 63 68 69 6c 64 $myrevmap($child
0d40: 29 0a 09 09 66 6f 72 65 61 63 68 20 63 73 65 74 )...foreach cset
0d50: 20 24 6d 79 72 65 76 6d 61 70 28 24 63 68 69 6c $myrevmap($chil
0d60: 64 29 20 7b 0a 09 09 20 20 20 20 6c 61 70 70 65 d) {... lappe
0d70: 6e 64 20 63 73 65 74 73 20 24 63 73 65 74 0a 09 nd csets $cset..
0d80: 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72 65 .}.. }..}..re
0d90: 74 75 72 6e 20 5b 6c 73 6f 72 74 20 2d 75 6e 69 turn [lsort -uni
0da0: 71 75 65 20 24 63 73 65 74 73 5d 0a 20 20 20 20 que $csets].
0db0: 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 }.. # result
0dc0: 3d 20 64 69 63 74 20 28 72 65 76 69 73 69 6f 6e = dict (revision
0dd0: 20 2d 3e 20 6c 69 73 74 20 28 63 68 61 6e 67 65 -> list (change
0de0: 73 65 74 29 29 0a 20 20 20 20 6d 65 74 68 6f 64 set)). method
0df0: 20 70 72 65 64 65 63 65 73 73 6f 72 6d 61 70 20 predecessormap
0e00: 7b 7d 20 7b 0a 09 23 20 4e 4f 54 45 20 2f 20 46 {} {..# NOTE / F
0e10: 55 54 55 52 45 3a 20 50 6f 73 73 69 62 6c 65 20 UTURE: Possible
0e20: 62 6f 74 74 6c 65 6e 65 63 6b 2e 0a 09 61 72 72 bottleneck...arr
0e30: 61 79 20 73 65 74 20 74 6d 70 20 7b 7d 0a 09 66 ay set tmp {}..f
0e40: 6f 72 65 61 63 68 20 7b 72 65 76 20 63 68 69 6c oreach {rev chil
0e50: 64 72 65 6e 7d 20 5b 24 73 65 6c 66 20 70 72 65 dren} [$self pre
0e60: 6d 61 70 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65 map] {.. fore
0e70: 61 63 68 20 63 68 69 6c 64 20 24 63 68 69 6c 64 ach child $child
0e80: 72 65 6e 20 7b 0a 09 09 23 20 38 2e 35 20 6c 61 ren {...# 8.5 la
0e90: 70 70 65 6e 64 20 74 6d 70 28 24 72 65 76 29 20 ppend tmp($rev)
0ea0: 7b 2a 7d 24 6d 79 72 65 76 6d 61 70 28 24 63 68 {*}$myrevmap($ch
0eb0: 69 6c 64 29 0a 09 09 66 6f 72 65 61 63 68 20 63 ild)...foreach c
0ec0: 73 65 74 20 24 6d 79 72 65 76 6d 61 70 28 24 63 set $myrevmap($c
0ed0: 68 69 6c 64 29 20 7b 0a 09 09 20 20 20 20 6c 61 hild) {... la
0ee0: 70 70 65 6e 64 20 74 6d 70 28 24 72 65 76 29 20 ppend tmp($rev)
0ef0: 24 63 73 65 74 0a 09 09 7d 0a 09 20 20 20 20 7d $cset...}.. }
0f00: 0a 09 20 20 20 20 73 65 74 20 74 6d 70 28 24 72 .. set tmp($r
0f10: 65 76 29 20 5b 6c 73 6f 72 74 20 2d 75 6e 69 71 ev) [lsort -uniq
0f20: 75 65 20 24 74 6d 70 28 24 72 65 76 29 5d 0a 09 ue $tmp($rev)]..
0f30: 7d 0a 09 72 65 74 75 72 6e 20 5b 61 72 72 61 79 }..return [array
0f40: 20 67 65 74 20 74 6d 70 5d 0a 20 20 20 20 7d 0a get tmp]. }.
0f50: 0a 20 20 20 20 23 20 72 65 76 69 73 69 6f 6e 20 . # revision
0f60: 2d 3e 20 6c 69 73 74 20 28 72 65 76 69 73 69 6f -> list (revisio
0f70: 6e 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 6e 65 n). method ne
0f80: 78 74 6d 61 70 20 7b 7d 20 7b 0a 09 69 66 20 7b xtmap {} {..if {
0f90: 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 6e 65 78 74 [llength $mynext
0fa0: 6d 61 70 5d 7d 20 7b 20 72 65 74 75 72 6e 20 24 map]} { return $
0fb0: 6d 79 6e 65 78 74 6d 61 70 20 7d 0a 09 24 6d 79 mynextmap }..$my
0fc0: 74 79 70 65 6f 62 6a 20 73 75 63 63 65 73 73 6f typeobj successo
0fd0: 72 73 20 74 6d 70 20 24 6d 79 72 65 76 69 73 69 rs tmp $myrevisi
0fe0: 6f 6e 73 0a 09 73 65 74 20 6d 79 6e 65 78 74 6d ons..set mynextm
0ff0: 61 70 20 5b 61 72 72 61 79 20 67 65 74 20 74 6d ap [array get tm
1000: 70 5d 0a 09 72 65 74 75 72 6e 20 24 6d 79 6e 65 p]..return $myne
1010: 78 74 6d 61 70 0a 20 20 20 20 7d 0a 0a 20 20 20 xtmap. }..
1020: 20 23 20 72 65 76 69 73 69 6f 6e 20 2d 3e 20 6c # revision -> l
1030: 69 73 74 20 28 72 65 76 69 73 69 6f 6e 29 0a 20 ist (revision).
1040: 20 20 20 6d 65 74 68 6f 64 20 70 72 65 6d 61 70 method premap
1050: 20 7b 7d 20 7b 0a 09 69 66 20 7b 5b 6c 6c 65 6e {} {..if {[llen
1060: 67 74 68 20 24 6d 79 70 72 65 6d 61 70 5d 7d 20 gth $mypremap]}
1070: 7b 20 72 65 74 75 72 6e 20 24 6d 79 70 72 65 6d { return $myprem
1080: 61 70 20 7d 0a 09 24 6d 79 74 79 70 65 6f 62 6a ap }..$mytypeobj
1090: 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 74 6d predecessors tm
10a0: 70 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 0a 09 p $myrevisions..
10b0: 73 65 74 20 6d 79 70 72 65 6d 61 70 20 5b 61 72 set mypremap [ar
10c0: 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 09 72 65 ray get tmp]..re
10d0: 74 75 72 6e 20 24 6d 79 70 72 65 6d 61 70 0a 20 turn $mypremap.
10e0: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 }.. method
10f0: 20 62 72 65 61 6b 69 6e 74 65 72 6e 61 6c 64 65 breakinternalde
1100: 70 65 6e 64 65 6e 63 69 65 73 20 7b 7d 20 7b 0a pendencies {} {.
1110: 09 23 20 54 68 69 73 20 6d 65 74 68 6f 64 20 69 .# This method i
1120: 6e 73 70 65 63 74 73 20 74 68 65 20 63 68 61 6e nspects the chan
1130: 67 65 73 65 74 73 20 66 6f 72 20 69 6e 74 65 72 gesets for inter
1140: 6e 61 6c 0a 09 23 20 64 65 70 65 6e 64 65 6e 63 nal..# dependenc
1150: 69 65 73 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 ies. Nothing is
1160: 64 6f 6e 65 20 69 66 20 74 68 65 72 65 20 61 72 done if there ar
1170: 65 20 6e 6f 0a 09 23 20 73 75 63 68 2e 20 4f 74 e no..# such. Ot
1180: 68 65 72 77 69 73 65 20 74 68 65 20 63 68 61 6e herwise the chan
1190: 67 65 73 65 74 20 69 73 20 73 70 6c 69 74 20 69 geset is split i
11a0: 6e 74 6f 20 61 20 73 65 74 20 6f 66 0a 09 23 20 nto a set of..#
11b0: 66 72 61 67 6d 65 6e 74 73 20 77 69 74 68 6f 75 fragments withou
11c0: 74 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e t internal depen
11d0: 64 65 6e 63 69 65 73 2c 20 74 72 61 6e 73 66 6f dencies, transfo
11e0: 72 6d 69 6e 67 20 74 68 65 0a 09 23 20 69 6e 74 rming the..# int
11f0: 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 ernal dependenci
1200: 65 73 20 69 6e 74 6f 20 65 78 74 65 72 6e 61 6c es into external
1210: 20 6f 6e 65 73 2e 20 54 68 65 20 6e 65 77 20 63 ones. The new c
1220: 68 61 6e 67 65 73 65 74 73 0a 09 23 20 61 72 65 hangesets..# are
1230: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69 added to the li
1240: 73 74 20 6f 66 20 61 6c 6c 20 63 68 61 6e 67 65 st of all change
1250: 73 65 74 73 2e 0a 0a 09 23 20 57 65 20 70 65 72 sets....# We per
1260: 66 6f 72 6d 20 61 6c 6c 20 6e 65 63 65 73 73 61 form all necessa
1270: 72 79 20 73 70 6c 69 74 73 20 69 6e 20 6f 6e 65 ry splits in one
1280: 20 67 6f 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 go, instead of
1290: 6f 6e 6c 79 0a 09 23 20 6f 6e 65 2e 20 54 68 65 only..# one. The
12a0: 20 70 72 65 76 69 6f 75 73 20 61 6c 67 6f 72 69 previous algori
12b0: 74 68 6d 2c 20 61 64 61 70 74 65 64 20 66 72 6f thm, adapted fro
12c0: 6d 20 63 76 73 32 73 76 6e 2c 20 63 6f 6d 70 75 m cvs2svn, compu
12d0: 74 65 64 0a 09 23 20 61 20 6c 6f 74 20 6f 66 20 ted..# a lot of
12e0: 73 74 61 74 65 20 77 68 69 63 68 20 77 61 73 20 state which was
12f0: 74 68 72 6f 77 6e 20 61 77 61 79 20 61 6e 64 20 thrown away and
1300: 74 68 65 6e 20 63 6f 6d 70 75 74 65 64 20 61 67 then computed ag
1310: 61 69 6e 0a 09 23 20 66 6f 72 20 65 61 63 68 20 ain..# for each
1320: 6f 66 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 of the fragments
1330: 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 65 . It should be e
1340: 61 73 69 65 72 20 74 6f 20 75 70 64 61 74 65 20 asier to update
1350: 61 6e 64 0a 09 23 20 72 65 75 73 65 20 74 68 61 and..# reuse tha
1360: 74 20 73 74 61 74 65 2e 0a 0a 09 23 20 54 68 65 t state....# The
1370: 20 63 6f 64 65 20 63 68 65 63 6b 73 20 6f 6e 6c code checks onl
1380: 79 20 73 75 63 65 73 73 6f 72 20 64 65 70 65 6e y sucessor depen
1390: 64 65 6e 63 69 65 73 2c 20 61 73 20 74 68 69 73 dencies, as this
13a0: 0a 09 23 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c ..# automaticall
13b0: 79 20 63 6f 76 65 72 73 20 74 68 65 20 70 72 65 y covers the pre
13c0: 64 65 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 decessor depende
13d0: 6e 63 69 65 73 20 61 73 20 77 65 6c 6c 20 28 41 ncies as well (A
13e0: 0a 09 23 20 73 75 63 63 65 73 73 6f 72 20 64 65 ..# successor de
13f0: 70 65 6e 64 65 6e 63 79 20 61 20 2d 3e 20 62 20 pendency a -> b
1400: 69 73 20 61 6c 73 6f 20 61 20 70 72 65 64 65 63 is also a predec
1410: 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 79 essor dependency
1420: 0a 09 23 20 62 20 2d 3e 20 61 29 2e 0a 0a 09 23 ..# b -> a)....#
1430: 20 41 72 72 61 79 20 6f 66 20 64 65 70 65 6e 64 Array of depend
1440: 65 6e 63 69 65 73 20 28 70 61 72 65 6e 74 20 2d encies (parent -
1450: 3e 20 63 68 69 6c 64 29 2e 20 54 68 69 73 20 69 > child). This i
1460: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 0a 09 23 s pulled from..#
1470: 20 74 68 65 20 73 74 61 74 65 2c 20 61 6e 64 20 the state, and
1480: 6c 69 6d 69 74 65 64 20 74 6f 20 73 75 63 63 65 limited to succe
1490: 73 73 6f 72 73 20 77 69 74 68 69 6e 20 74 68 65 ssors within the
14a0: 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 61 72 changeset....ar
14b0: 72 61 79 20 73 65 74 20 64 65 70 65 6e 64 65 6e ray set dependen
14c0: 63 69 65 73 20 7b 7d 0a 09 24 6d 79 74 79 70 65 cies {}..$mytype
14d0: 6f 62 6a 20 69 6e 74 65 72 6e 61 6c 73 75 63 63 obj internalsucc
14e0: 65 73 73 6f 72 73 20 64 65 70 65 6e 64 65 6e 63 essors dependenc
14f0: 69 65 73 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 ies $myrevisions
1500: 0a 09 69 66 20 7b 21 5b 61 72 72 61 79 20 73 69 ..if {![array si
1510: 7a 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73 5d ze dependencies]
1520: 7d 20 7b 72 65 74 75 72 6e 20 30 7d 20 3b 20 23 } {return 0} ; #
1530: 20 4e 6f 74 68 69 6e 67 20 74 6f 20 62 72 65 61 Nothing to brea
1540: 6b 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 35 k....log write 5
1550: 20 63 73 65 74 73 20 2e 2e 2e 5b 24 73 65 6c 66 csets ...[$self
1560: 20 73 74 72 5d 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e str]...........
1570: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
1580: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
1590: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 0a 0a 09 23 ...............#
15a0: 20 57 65 20 68 61 76 65 20 69 6e 74 65 72 6e 61 We have interna
15b0: 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 l dependencies t
15c0: 6f 20 62 72 65 61 6b 2e 20 57 65 20 6e 6f 77 20 o break. We now
15d0: 69 74 65 72 61 74 65 20 6f 76 65 72 0a 09 23 20 iterate over..#
15e0: 61 6c 6c 20 70 6f 73 69 74 69 6f 6e 73 20 69 6e all positions in
15f0: 20 74 68 65 20 6c 69 73 74 20 28 77 68 69 63 68 the list (which
1600: 20 69 73 20 63 68 72 6f 6e 6f 6c 6f 67 69 63 61 is chronologica
1610: 6c 2c 20 61 74 20 6c 65 61 73 74 0a 09 23 20 61 l, at least..# a
1620: 73 20 66 61 72 20 61 73 20 74 68 65 20 74 69 6d s far as the tim
1630: 65 73 74 61 6d 70 73 20 61 72 65 20 63 6f 72 72 estamps are corr
1640: 65 63 74 20 61 6e 64 20 75 6e 69 71 75 65 29 20 ect and unique)
1650: 61 6e 64 0a 09 23 20 64 65 74 65 72 6d 69 6e 65 and..# determine
1660: 20 74 68 65 20 62 65 73 74 20 70 6f 73 69 74 69 the best positi
1670: 6f 6e 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b on for the break
1680: 2c 20 62 79 20 74 72 79 69 6e 67 20 74 6f 0a 09 , by trying to..
1690: 23 20 62 72 65 61 6b 20 61 73 20 6d 61 6e 79 20 # break as many
16a0: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 61 73 20 dependencies as
16b0: 70 6f 73 73 69 62 6c 65 20 69 6e 20 6f 6e 65 20 possible in one
16c0: 67 6f 2e 20 57 68 65 6e 20 61 0a 09 23 20 62 72 go. When a..# br
16d0: 65 61 6b 20 77 61 73 20 66 6f 75 6e 64 20 74 68 eak was found th
16e0: 69 73 20 69 73 20 72 65 64 6f 6e 65 20 66 6f 72 is is redone for
16f0: 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 20 63 the fragments c
1700: 6f 6d 69 6e 67 20 61 6e 64 0a 09 23 20 61 66 74 oming and..# aft
1710: 65 72 2c 20 61 66 74 65 72 20 75 70 64 69 6e 67 er, after upding
1720: 20 74 68 65 20 63 72 6f 73 73 69 6e 67 20 69 6e the crossing in
1730: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 0a 09 23 20 44 formation....# D
1740: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 3a 0a ata structures:.
1750: 09 23 20 4d 61 70 3a 20 20 50 4f 53 20 20 20 72 .# Map: POS r
1760: 65 76 69 73 69 6f 6e 20 69 64 20 20 20 20 20 20 evision id
1770: 2d 3e 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c -> position in l
1780: 69 73 74 2e 0a 09 23 20 20 20 20 20 20 20 43 52 ist...# CR
1790: 4f 53 53 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 OSS position in
17a0: 6c 69 73 74 20 2d 3e 20 6e 75 6d 62 65 72 20 6f list -> number o
17b0: 66 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 63 f dependencies c
17c0: 72 6f 73 73 69 6e 67 20 69 74 0a 09 23 20 20 20 rossing it..#
17d0: 20 20 20 20 44 45 50 43 20 20 64 65 70 65 6e 64 DEPC depend
17e0: 65 6e 63 79 20 20 20 20 20 20 20 2d 3e 20 70 6f ency -> po
17f0: 73 69 74 69 6f 6e 73 20 69 74 20 63 72 6f 73 73 sitions it cross
1800: 65 73 0a 09 23 20 4c 69 73 74 3a 20 52 41 4e 47 es..# List: RANG
1810: 45 20 4f 66 20 74 68 65 20 70 6f 73 69 74 69 6f E Of the positio
1820: 6e 73 20 69 74 73 65 6c 66 2e 0a 09 23 20 41 20 ns itself...# A
1830: 64 65 70 65 6e 64 65 6e 63 79 20 69 73 20 61 20 dependency is a
1840: 73 69 6e 67 6c 65 2d 65 6c 65 6d 65 6e 74 20 6d single-element m
1850: 61 70 20 70 61 72 65 6e 74 20 2d 3e 20 63 68 69 ap parent -> chi
1860: 6c 64 0a 0a 09 49 6e 69 74 69 61 6c 69 7a 65 42 ld...InitializeB
1870: 72 65 61 6b 53 74 61 74 65 20 24 6d 79 72 65 76 reakState $myrev
1880: 69 73 69 6f 6e 73 0a 0a 09 73 65 74 20 66 72 61 isions...set fra
1890: 67 6d 65 6e 74 73 20 7b 7d 0a 09 73 65 74 20 70 gments {}..set p
18a0: 65 6e 64 69 6e 67 20 20 20 5b 6c 69 73 74 20 24 ending [list $
18b0: 72 61 6e 67 65 5d 0a 09 73 65 74 20 61 74 20 20 range]..set at
18c0: 20 20 20 20 20 20 30 0a 09 61 72 72 61 79 20 73 0..array s
18d0: 65 74 20 62 72 65 61 6b 73 20 7b 7d 0a 0a 09 77 et breaks {}...w
18e0: 68 69 6c 65 20 7b 24 61 74 20 3c 20 5b 6c 6c 65 hile {$at < [lle
18f0: 6e 67 74 68 20 24 70 65 6e 64 69 6e 67 5d 7d 20 ngth $pending]}
1900: 7b 0a 09 20 20 20 20 73 65 74 20 63 75 72 72 65 {.. set curre
1910: 6e 74 20 5b 6c 69 6e 64 65 78 20 24 70 65 6e 64 nt [lindex $pend
1920: 69 6e 67 20 24 61 74 5d 0a 0a 09 20 20 20 20 6c ing $at]... l
1930: 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73 og write 6 csets
1940: 20 7b 2e 20 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e {. . .. ... ...
1950: 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e .. ........ ....
1960: 2e 2e 2e 2e 2e 2e 2e 2e 2e 7d 0a 09 20 20 20 20 .........}..
1970: 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74 log write 6 cset
1980: 73 20 7b 53 63 68 65 64 75 6c 65 64 20 20 20 5b s {Scheduled [
1990: 6a 6f 69 6e 20 5b 50 52 73 20 5b 6c 72 61 6e 67 join [PRs [lrang
19a0: 65 20 24 70 65 6e 64 69 6e 67 20 24 61 74 20 65 e $pending $at e
19b0: 6e 64 5d 5d 20 7b 20 7d 5d 7d 0a 09 20 20 20 20 nd]] { }]}..
19c0: 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74 log write 6 cset
19d0: 73 20 7b 43 6f 6e 73 69 64 65 72 69 6e 67 20 5b s {Considering [
19e0: 50 52 20 24 63 75 72 72 65 6e 74 5d 20 5c 5b 24 PR $current] \[$
19f0: 61 74 2f 5b 6c 6c 65 6e 67 74 68 20 24 70 65 6e at/[llength $pen
1a00: 64 69 6e 67 5d 5c 5d 7d 0a 0a 09 20 20 20 20 73 ding]\]}... s
1a10: 65 74 20 62 65 73 74 20 5b 46 69 6e 64 42 65 73 et best [FindBes
1a20: 74 42 72 65 61 6b 20 24 63 75 72 72 65 6e 74 5d tBreak $current]
1a30: 0a 0a 09 20 20 20 20 69 66 20 7b 24 62 65 73 74 ... if {$best
1a40: 20 3c 20 30 7d 20 7b 0a 09 09 23 20 54 68 65 20 < 0} {...# The
1a50: 69 6e 73 70 65 63 74 65 64 20 72 61 6e 67 65 20 inspected range
1a60: 68 61 73 20 6e 6f 20 69 6e 74 65 72 6e 61 6c 0a has no internal.
1a70: 09 09 23 20 64 65 70 65 6e 64 65 6e 63 69 65 73 ..# dependencies
1a80: 2e 20 54 68 69 73 20 69 73 20 61 20 63 6f 6d 70 . This is a comp
1a90: 6c 65 74 65 20 66 72 61 67 6d 65 6e 74 2e 0a 09 lete fragment...
1aa0: 09 6c 61 70 70 65 6e 64 20 66 72 61 67 6d 65 6e .lappend fragmen
1ab0: 74 73 20 24 63 75 72 72 65 6e 74 0a 0a 09 09 6c ts $current....l
1ac0: 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73 og write 6 csets
1ad0: 20 22 4e 6f 20 62 72 65 61 6b 73 2c 20 66 69 6e "No breaks, fin
1ae0: 61 6c 22 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 al".. } else
1af0: 7b 0a 09 09 23 20 53 70 6c 69 74 20 74 68 65 20 {...# Split the
1b00: 72 61 6e 67 65 20 61 6e 64 20 73 63 68 65 64 75 range and schedu
1b10: 6c 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 le the resulting
1b20: 20 66 72 61 67 6d 65 6e 74 73 0a 09 09 23 20 66 fragments...# f
1b30: 6f 72 20 66 75 72 74 68 65 72 20 69 6e 73 70 65 or further inspe
1b40: 63 74 69 6f 6e 2e 20 52 65 6d 65 6d 62 65 72 20 ction. Remember
1b50: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 09 09 the number of...
1b60: 23 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 63 # dependencies c
1b70: 75 74 20 62 65 66 6f 72 65 20 77 65 20 72 65 6d ut before we rem
1b80: 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 0a 09 09 ove them from...
1b90: 23 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 2c # consideration,
1ba0: 20 66 6f 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 for documentati
1bb0: 6f 6e 20 6c 61 74 65 72 2e 0a 0a 09 09 73 65 74 on later.....set
1bc0: 20 62 72 65 61 6b 73 28 24 62 65 73 74 29 20 24 breaks($best) $
1bd0: 63 72 6f 73 73 28 24 62 65 73 74 29 0a 0a 09 09 cross($best)....
1be0: 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74 log write 6 cset
1bf0: 73 20 22 42 65 73 74 20 62 72 65 61 6b 20 40 20 s "Best break @
1c00: 24 62 65 73 74 2c 20 63 75 74 74 69 6e 67 20 5b $best, cutting [
1c10: 6e 73 70 20 24 63 72 6f 73 73 28 24 62 65 73 74 nsp $cross($best
1c20: 29 20 64 65 70 65 6e 64 65 6e 63 79 20 64 65 70 ) dependency dep
1c30: 65 6e 64 65 6e 63 69 65 73 5d 22 0a 0a 09 09 23 endencies]"....#
1c40: 20 4e 6f 74 65 3a 20 54 68 65 20 76 61 6c 75 65 Note: The value
1c50: 20 6f 66 20 62 65 73 74 20 69 73 20 61 6e 20 61 of best is an a
1c60: 62 6f 6c 75 74 65 20 6c 6f 63 61 74 69 6f 6e 20 bolute location
1c70: 69 6e 0a 09 09 23 20 6d 79 72 65 76 69 73 69 6f in...# myrevisio
1c80: 6e 73 2e 20 55 73 65 20 74 68 65 20 73 74 61 72 ns. Use the star
1c90: 74 20 6f 66 20 63 75 72 72 65 6e 74 20 74 6f 20 t of current to
1ca0: 6d 61 6b 65 20 69 74 20 61 6e 0a 09 09 23 20 69 make it an...# i
1cb0: 6e 64 65 78 20 61 62 73 6f 6c 75 74 65 20 74 6f ndex absolute to
1cc0: 20 63 75 72 72 65 6e 74 2e 0a 0a 09 09 73 65 74 current.....set
1cd0: 20 62 72 65 6c 20 5b 65 78 70 72 20 7b 24 62 65 brel [expr {$be
1ce0: 73 74 20 2d 20 5b 6c 69 6e 64 65 78 20 24 63 75 st - [lindex $cu
1cf0: 72 72 65 6e 74 20 30 5d 7d 5d 0a 09 09 73 65 74 rrent 0]}]...set
1d00: 20 62 6e 65 78 74 20 24 62 72 65 6c 20 3b 20 69 bnext $brel ; i
1d10: 6e 63 72 20 62 6e 65 78 74 0a 09 09 73 65 74 20 ncr bnext...set
1d20: 66 72 61 67 62 65 66 6f 72 65 20 5b 6c 72 61 6e fragbefore [lran
1d30: 67 65 20 24 63 75 72 72 65 6e 74 20 30 20 24 62 ge $current 0 $b
1d40: 72 65 6c 5d 0a 09 09 73 65 74 20 66 72 61 67 61 rel]...set fraga
1d50: 66 74 65 72 20 20 5b 6c 72 61 6e 67 65 20 24 63 fter [lrange $c
1d60: 75 72 72 65 6e 74 20 24 62 6e 65 78 74 20 65 6e urrent $bnext en
1d70: 64 5d 0a 0a 09 09 6c 6f 67 20 77 72 69 74 65 20 d]....log write
1d80: 36 20 63 73 65 74 73 20 22 4e 65 77 20 70 69 65 6 csets "New pie
1d90: 63 65 73 20 20 5b 50 52 20 24 66 72 61 67 62 65 ces [PR $fragbe
1da0: 66 6f 72 65 5d 20 5b 50 52 20 24 66 72 61 67 61 fore] [PR $fraga
1db0: 66 74 65 72 5d 22 0a 0a 09 09 69 6e 74 65 67 72 fter]"....integr
1dc0: 69 74 79 20 61 73 73 65 72 74 20 7b 5b 6c 6c 65 ity assert {[lle
1dd0: 6e 67 74 68 20 24 66 72 61 67 62 65 66 6f 72 65 ngth $fragbefore
1de0: 5d 7d 20 7b 46 6f 75 6e 64 20 7a 65 72 6f 2d 6c ]} {Found zero-l
1df0: 65 6e 67 74 68 20 66 72 61 67 6d 65 6e 74 20 61 ength fragment a
1e00: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 7d t the beginning}
1e10: 0a 09 09 69 6e 74 65 67 72 69 74 79 20 61 73 73 ...integrity ass
1e20: 65 72 74 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 ert {[llength $f
1e30: 72 61 67 61 66 74 65 72 5d 7d 20 20 7b 46 6f 75 ragafter]} {Fou
1e40: 6e 64 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 nd zero-length f
1e50: 72 61 67 6d 65 6e 74 20 61 74 20 74 68 65 20 65 ragment at the e
1e60: 6e 64 7d 0a 0a 09 09 6c 61 70 70 65 6e 64 20 70 nd}....lappend p
1e70: 65 6e 64 69 6e 67 20 24 66 72 61 67 62 65 66 6f ending $fragbefo
1e80: 72 65 20 24 66 72 61 67 61 66 74 65 72 0a 09 09 re $fragafter...
1e90: 43 75 74 41 74 20 24 62 65 73 74 0a 09 20 20 20 CutAt $best..
1ea0: 20 7d 0a 0a 09 20 20 20 20 69 6e 63 72 20 61 74 }... incr at
1eb0: 0a 09 7d 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 ..}...log write
1ec0: 36 20 63 73 65 74 73 20 22 2e 20 2e 20 2e 2e 20 6 csets ". . ..
1ed0: 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e ... ..... ......
1ee0: 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e .. .............
1ef0: 22 0a 0a 09 23 20 28 2a 29 20 57 65 20 63 6c 65 "...# (*) We cle
1f00: 61 72 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63 ar out the assoc
1f10: 69 61 74 65 64 20 70 61 72 74 20 6f 66 20 74 68 iated part of th
1f20: 65 20 6d 79 72 65 76 6d 61 70 0a 09 23 20 69 6e e myrevmap..# in
1f30: 2d 6d 65 6d 6f 72 79 20 69 6e 64 65 78 20 69 6e -memory index in
1f40: 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 preparation for
1f50: 20 6e 65 77 20 64 61 74 61 2e 20 41 20 73 69 6d new data. A sim
1f60: 70 6c 65 20 75 6e 73 65 74 0a 09 23 20 69 73 20 ple unset..# is
1f70: 65 6e 6f 75 67 68 2c 20 77 65 20 68 61 76 65 20 enough, we have
1f80: 6e 6f 20 73 79 6d 62 6f 6c 20 63 68 61 6e 67 65 no symbol change
1f90: 73 65 74 73 20 61 74 20 74 68 69 73 20 74 69 6d sets at this tim
1fa0: 65 2c 20 61 6e 64 0a 09 23 20 74 68 75 73 20 6e e, and..# thus n
1fb0: 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 6f ever more than o
1fc0: 6e 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20 ne reference in
1fd0: 74 68 65 20 6c 69 73 74 2e 0a 0a 09 66 6f 72 65 the list....fore
1fe0: 61 63 68 20 72 20 24 6d 79 72 65 76 69 73 69 6f ach r $myrevisio
1ff0: 6e 73 20 7b 20 75 6e 73 65 74 20 6d 79 72 65 76 ns { unset myrev
2000: 6d 61 70 28 24 72 29 20 7d 0a 0a 09 23 20 43 72 map($r) }...# Cr
2010: 65 61 74 65 20 63 68 61 6e 67 65 73 65 74 73 20 eate changesets
2020: 66 6f 72 20 74 68 65 20 66 72 61 67 6d 65 6e 74 for the fragment
2030: 73 2c 20 72 65 75 73 69 6e 67 20 74 68 65 20 63 s, reusing the c
2040: 75 72 72 65 6e 74 20 6f 6e 65 0a 09 23 20 66 6f urrent one..# fo
2050: 72 20 74 68 65 20 66 69 72 73 74 20 66 72 61 67 r the first frag
2060: 6d 65 6e 74 2e 20 57 65 20 73 6f 72 74 20 74 68 ment. We sort th
2070: 65 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 em in order to a
2080: 6c 6c 6f 77 0a 09 23 20 63 68 65 63 6b 69 6e 67 llow..# checking
2090: 20 66 6f 72 20 67 61 70 73 20 61 6e 64 20 6e 69 for gaps and ni
20a0: 63 65 20 6d 65 73 73 61 67 65 73 2e 0a 0a 09 73 ce messages....s
20b0: 65 74 20 66 72 61 67 6d 65 6e 74 73 20 5b 6c 73 et fragments [ls
20c0: 6f 72 74 20 2d 69 6e 64 65 78 20 30 20 2d 69 6e ort -index 0 -in
20d0: 74 65 67 65 72 20 24 66 72 61 67 6d 65 6e 74 73 teger $fragments
20e0: 5d 0a 0a 09 23 70 75 74 73 20 5c 74 2e 5b 6a 6f ]...#puts \t.[jo
20f0: 69 6e 20 5b 50 52 73 20 24 66 72 61 67 6d 65 6e in [PRs $fragmen
2100: 74 73 5d 20 2e 5c 6e 5c 74 2e 5d 2e 0a 0a 09 42 ts] .\n\t.]....B
2110: 6f 72 64 65 72 20 5b 6c 69 6e 64 65 78 20 24 66 order [lindex $f
2120: 72 61 67 6d 65 6e 74 73 20 30 5d 20 66 69 72 73 ragments 0] firs
2130: 74 73 20 66 69 72 73 74 65 0a 0a 09 69 6e 74 65 ts firste...inte
2140: 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24 66 grity assert {$f
2150: 69 72 73 74 73 20 3d 3d 20 30 7d 20 7b 42 61 64 irsts == 0} {Bad
2160: 20 66 72 61 67 6d 65 6e 74 20 73 74 61 72 74 20 fragment start
2170: 40 20 24 66 69 72 73 74 73 2c 20 67 61 70 2c 20 @ $firsts, gap,
2180: 6f 72 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e or before beginn
2190: 69 6e 67 20 6f 66 20 74 68 65 20 72 61 6e 67 65 ing of the range
21a0: 7d 0a 0a 09 73 65 74 20 6c 61 73 74 65 20 24 66 }...set laste $f
21b0: 69 72 73 74 65 0a 09 66 6f 72 65 61 63 68 20 66 irste..foreach f
21c0: 72 61 67 6d 65 6e 74 20 5b 6c 72 61 6e 67 65 20 ragment [lrange
21d0: 24 66 72 61 67 6d 65 6e 74 73 20 31 20 65 6e 64 $fragments 1 end
21e0: 5d 20 7b 0a 09 20 20 20 20 42 6f 72 64 65 72 20 ] {.. Border
21f0: 24 66 72 61 67 6d 65 6e 74 20 73 20 65 0a 09 20 $fragment s e..
2200: 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 integrity ass
2210: 65 72 74 20 7b 24 6c 61 73 74 65 20 3d 3d 20 28 ert {$laste == (
2220: 24 73 20 2d 20 31 29 7d 20 7b 42 61 64 20 66 72 $s - 1)} {Bad fr
2230: 61 67 6d 65 6e 74 20 62 6f 72 64 65 72 20 3c 24 agment border <$
2240: 6c 61 73 74 65 20 7c 20 24 73 3e 2c 20 67 61 70 laste | $s>, gap
2250: 20 6f 72 20 6f 76 65 72 6c 61 70 7d 0a 0a 09 20 or overlap}...
2260: 20 20 20 73 65 74 20 6e 65 77 20 5b 24 74 79 70 set new [$typ
2270: 65 20 25 41 55 54 4f 25 20 24 6d 79 70 72 6f 6a e %AUTO% $myproj
2280: 65 63 74 20 24 6d 79 74 79 70 65 20 24 6d 79 73 ect $mytype $mys
2290: 72 63 69 64 20 5b 6c 72 61 6e 67 65 20 24 6d 79 rcid [lrange $my
22a0: 72 65 76 69 73 69 6f 6e 73 20 24 73 20 24 65 5d revisions $s $e]
22b0: 5d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c ].. l
22c0: 6f 67 20 77 72 69 74 65 20 34 20 63 73 65 74 73 og write 4 csets
22d0: 20 22 42 72 65 61 6b 69 6e 67 20 5b 24 73 65 6c "Breaking [$sel
22e0: 66 20 73 74 72 20 5d 20 40 20 24 6c 61 73 74 65 f str ] @ $laste
22f0: 2c 20 6e 65 77 20 5b 24 6e 65 77 20 73 74 72 5d , new [$new str]
2300: 2c 20 63 75 74 74 69 6e 67 20 24 62 72 65 61 6b , cutting $break
2310: 73 28 24 6c 61 73 74 65 29 22 0a 0a 09 20 20 20 s($laste)"...
2320: 20 73 65 74 20 6c 61 73 74 65 20 24 65 0a 09 7d set laste $e..}
2330: 0a 0a 09 69 6e 74 65 67 72 69 74 79 20 61 73 73 ...integrity ass
2340: 65 72 74 20 7b 0a 09 20 20 20 20 24 6c 61 73 74 ert {.. $last
2350: 65 20 3d 3d 20 28 5b 6c 6c 65 6e 67 74 68 20 24 e == ([llength $
2360: 6d 79 72 65 76 69 73 69 6f 6e 73 5d 2d 31 29 0a myrevisions]-1).
2370: 09 7d 20 7b 42 61 64 20 66 72 61 67 6d 65 6e 74 .} {Bad fragment
2380: 20 65 6e 64 20 40 20 24 6c 61 73 74 65 2c 20 67 end @ $laste, g
2390: 61 70 2c 20 6f 72 20 62 65 79 6f 6e 64 20 65 6e ap, or beyond en
23a0: 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 7d 0a d of the range}.
23b0: 0a 09 23 20 50 75 74 20 74 68 65 20 66 69 72 73 ..# Put the firs
23c0: 74 20 66 72 61 67 6d 65 6e 74 20 69 6e 74 6f 20 t fragment into
23d0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e the current chan
23e0: 67 65 73 65 74 2c 20 61 6e 64 0a 09 23 20 75 70 geset, and..# up
23f0: 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f date the in-memo
2400: 72 79 20 69 6e 64 65 78 2e 20 57 65 20 63 61 6e ry index. We can
2410: 20 73 69 6d 70 6c 79 20 28 72 65 29 61 64 64 20 simply (re)add
2420: 74 68 65 0a 09 23 20 72 65 76 69 73 69 6f 6e 73 the..# revisions
2430: 20 62 65 63 61 75 73 65 20 77 65 20 63 6c 65 61 because we clea
2440: 72 65 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 red the previous
2450: 6c 79 20 65 78 69 73 74 69 6e 67 0a 09 23 20 69 ly existing..# i
2460: 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20 73 65 65 20 nformation, see
2470: 28 2a 29 20 61 62 6f 76 65 2e 20 50 65 72 73 69 (*) above. Persi
2480: 73 74 65 6e 63 65 20 64 6f 65 73 20 6e 6f 74 20 stence does not
2490: 6d 61 74 74 65 72 0a 09 23 20 68 65 72 65 2c 20 matter..# here,
24a0: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 63 68 61 6e none of the chan
24b0: 67 65 73 65 74 73 20 68 61 73 20 62 65 65 6e 20 gesets has been
24c0: 73 61 76 65 64 20 74 6f 20 74 68 65 0a 09 23 20 saved to the..#
24d0: 70 65 72 73 69 73 74 65 6e 74 20 73 74 61 74 65 persistent state
24e0: 20 79 65 74 2e 0a 0a 09 73 65 74 20 6d 79 72 65 yet....set myre
24f0: 76 69 73 69 6f 6e 73 20 5b 6c 72 61 6e 67 65 20 visions [lrange
2500: 24 6d 79 72 65 76 69 73 69 6f 6e 73 20 30 20 24 $myrevisions 0 $
2510: 66 69 72 73 74 65 5d 0a 09 66 6f 72 65 61 63 68 firste]..foreach
2520: 20 72 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 20 r $myrevisions
2530: 7b 20 6c 61 70 70 65 6e 64 20 6d 79 72 65 76 6d { lappend myrevm
2540: 61 70 28 24 72 29 20 24 73 65 6c 66 20 7d 0a 0a ap($r) $self }..
2550: 09 72 65 74 75 72 6e 20 31 0a 20 20 20 20 7d 0a .return 1. }.
2560: 0a 20 20 20 20 6d 65 74 68 6f 64 20 70 65 72 73 . method pers
2570: 69 73 74 20 7b 7d 20 7b 0a 09 73 65 74 20 74 69 ist {} {..set ti
2580: 64 20 24 6d 79 63 73 74 79 70 65 28 24 6d 79 74 d $mycstype($myt
2590: 79 70 65 29 0a 09 73 65 74 20 70 69 64 20 5b 24 ype)..set pid [$
25a0: 6d 79 70 72 6f 6a 65 63 74 20 69 64 5d 0a 09 73 myproject id]..s
25b0: 65 74 20 70 6f 73 20 30 0a 0a 09 73 74 61 74 65 et pos 0...state
25c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 09 transaction {..
25d0: 20 20 20 20 73 74 61 74 65 20 72 75 6e 20 7b 0a state run {.
25e0: 09 09 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 ..INSERT INTO ch
25f0: 61 6e 67 65 73 65 74 20 28 63 69 64 2c 20 20 20 angeset (cid,
2600: 70 69 64 2c 20 20 74 79 70 65 2c 20 73 72 63 29 pid, type, src)
2610: 0a 09 09 56 41 4c 55 45 53 20 20 20 20 20 20 20 ...VALUES
2620: 20 20 20 20 20 20 20 20 20 28 24 6d 79 69 64 2c ($myid,
2630: 20 24 70 69 64 2c 20 24 74 69 64 2c 20 24 6d 79 $pid, $tid, $my
2640: 73 72 63 69 64 29 3b 0a 09 20 20 20 20 7d 0a 0a srcid);.. }..
2650: 09 20 20 20 20 66 6f 72 65 61 63 68 20 72 69 64 . foreach rid
2660: 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 20 7b 0a $myrevisions {.
2670: 09 09 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 ..state run {...
2680: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 INSERT INTO
2690: 63 73 72 65 76 69 73 69 6f 6e 20 28 63 69 64 2c csrevision (cid,
26a0: 20 20 20 70 6f 73 2c 20 20 72 69 64 29 0a 09 09 pos, rid)...
26b0: 20 20 20 20 56 41 4c 55 45 53 20 20 20 20 20 20 VALUES
26c0: 20 20 20 20 20 20 20 20 20 20 20 28 24 6d 79 69 ($myi
26d0: 64 2c 20 24 70 6f 73 2c 20 24 72 69 64 29 3b 0a d, $pos, $rid);.
26e0: 09 09 7d 0a 09 09 69 6e 63 72 20 70 6f 73 0a 09 ..}...incr pos..
26f0: 20 20 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e }..}..return
2700: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 . }.. meth
2710: 6f 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 7d 20 od timerange {}
2720: 7b 20 72 65 74 75 72 6e 20 5b 24 6d 79 74 79 70 { return [$mytyp
2730: 65 6f 62 6a 20 74 69 6d 65 72 61 6e 67 65 20 24 eobj timerange $
2740: 6d 79 72 65 76 69 73 69 6f 6e 73 5d 20 7d 0a 0a myrevisions] }..
2750: 20 20 20 20 6d 65 74 68 6f 64 20 64 72 6f 70 20 method drop
2760: 7b 7d 20 7b 0a 09 73 74 61 74 65 20 74 72 61 6e {} {..state tran
2770: 73 61 63 74 69 6f 6e 20 7b 0a 09 20 20 20 20 73 saction {.. s
2780: 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 44 45 4c tate run {...DEL
2790: 45 54 45 20 46 52 4f 4d 20 63 68 61 6e 67 65 73 ETE FROM changes
27a0: 65 74 20 20 57 48 45 52 45 20 63 69 64 20 3d 20 et WHERE cid =
27b0: 24 6d 79 69 64 3b 0a 09 09 44 45 4c 45 54 45 20 $myid;...DELETE
27c0: 46 52 4f 4d 20 63 73 72 65 76 69 73 69 6f 6e 20 FROM csrevision
27d0: 57 48 45 52 45 20 63 69 64 20 3d 20 24 6d 79 69 WHERE cid = $myi
27e0: 64 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 66 6f d;.. }..}..fo
27f0: 72 65 61 63 68 20 72 20 24 6d 79 72 65 76 69 73 reach r $myrevis
2800: 69 6f 6e 73 20 7b 0a 09 20 20 20 20 69 66 20 7b ions {.. if {
2810: 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 72 65 76 6d [llength $myrevm
2820: 61 70 28 24 72 29 5d 20 3d 3d 20 31 7d 20 7b 0a ap($r)] == 1} {.
2830: 09 09 75 6e 73 65 74 20 6d 79 72 65 76 6d 61 70 ..unset myrevmap
2840: 28 24 72 29 0a 09 20 20 20 20 7d 20 65 6c 73 65 ($r).. } else
2850: 20 7b 0a 09 09 73 65 74 20 70 6f 73 20 5b 6c 73 {...set pos [ls
2860: 65 61 72 63 68 20 2d 65 78 61 63 74 20 24 6d 79 earch -exact $my
2870: 72 65 76 6d 61 70 28 24 72 29 20 24 73 65 6c 66 revmap($r) $self
2880: 5d 0a 09 09 73 65 74 20 6d 79 72 65 76 6d 61 70 ]...set myrevmap
2890: 28 24 72 29 20 5b 6c 72 65 70 6c 61 63 65 20 24 ($r) [lreplace $
28a0: 6d 79 72 65 76 6d 61 70 28 24 72 29 20 24 70 6f myrevmap($r) $po
28b0: 73 20 24 70 6f 73 5d 0a 09 20 20 20 20 7d 0a 09 s $pos].. }..
28c0: 7d 0a 09 73 65 74 20 70 6f 73 20 20 20 20 20 20 }..set pos
28d0: 20 20 20 20 5b 6c 73 65 61 72 63 68 20 2d 65 78 [lsearch -ex
28e0: 61 63 74 20 24 6d 79 63 68 61 6e 67 65 73 65 74 act $mychangeset
28f0: 73 20 24 73 65 6c 66 5d 0a 09 73 65 74 20 6d 79 s $self]..set my
2900: 63 68 61 6e 67 65 73 65 74 73 20 5b 6c 72 65 70 changesets [lrep
2910: 6c 61 63 65 20 24 6d 79 63 68 61 6e 67 65 73 65 lace $mychangese
2920: 74 73 20 24 70 6f 73 20 24 70 6f 73 5d 0a 09 72 ts $pos $pos]..r
2930: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 eturn. }..
2940: 20 74 79 70 65 6d 65 74 68 6f 64 20 73 70 6c 69 typemethod spli
2950: 74 20 7b 63 73 65 74 20 61 72 67 73 7d 20 7b 0a t {cset args} {.
2960: 09 23 20 41 73 20 70 61 72 74 20 6f 66 20 74 68 .# As part of th
2970: 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 e creation of th
2980: 65 20 6e 65 77 20 63 68 61 6e 67 65 73 65 74 73 e new changesets
2990: 20 73 70 65 63 69 66 69 65 64 20 69 6e 0a 09 23 specified in..#
29a0: 20 41 52 47 53 20 61 73 20 73 65 74 73 20 6f 66 ARGS as sets of
29b0: 20 72 65 76 69 73 69 6f 6e 73 2c 20 61 6c 6c 20 revisions, all
29c0: 73 75 62 73 65 74 73 20 6f 66 20 43 53 45 54 27 subsets of CSET'
29d0: 73 20 72 65 76 69 73 69 6f 6e 0a 09 23 20 73 65 s revision..# se
29e0: 74 2c 20 43 53 45 54 20 77 69 6c 6c 20 62 65 20 t, CSET will be
29f0: 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 61 6c 6c dropped from all
2a00: 20 64 61 74 61 62 61 73 65 73 2c 20 69 6e 20 61 databases, in a
2a10: 6e 64 20 6f 75 74 20 6f 66 0a 09 23 20 6d 65 6d nd out of..# mem
2a20: 6f 72 79 2c 20 61 6e 64 20 74 68 65 6e 20 64 65 ory, and then de
2a30: 73 74 72 6f 79 65 64 2e 0a 0a 09 73 74 72 75 63 stroyed....struc
2a40: 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b t::list assign [
2a50: 24 63 73 65 74 20 64 61 74 61 5d 20 70 72 6f 6a $cset data] proj
2a60: 65 63 74 20 63 73 74 79 70 65 20 63 73 73 72 63 ect cstype cssrc
2a70: 0a 0a 09 24 63 73 65 74 20 64 72 6f 70 0a 09 24 ...$cset drop..$
2a80: 63 73 65 74 20 64 65 73 74 72 6f 79 0a 0a 09 73 cset destroy...s
2a90: 65 74 20 6e 65 77 63 73 65 74 73 20 7b 7d 0a 09 et newcsets {}..
2aa0: 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65 6e 74 foreach fragment
2ab0: 72 65 76 69 73 69 6f 6e 73 20 24 61 72 67 73 20 revisions $args
2ac0: 7b 0a 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 {.. integrity
2ad0: 20 61 73 73 65 72 74 20 7b 0a 09 09 5b 6c 6c 65 assert {...[lle
2ae0: 6e 67 74 68 20 24 66 72 61 67 6d 65 6e 74 72 65 ngth $fragmentre
2af0: 76 69 73 69 6f 6e 73 5d 0a 09 20 20 20 20 7d 20 visions].. }
2b00: 7b 41 74 74 65 6d 70 74 65 64 20 74 6f 20 63 72 {Attempted to cr
2b10: 65 61 74 65 20 61 6e 20 65 6d 70 74 79 20 63 68 eate an empty ch
2b20: 61 6e 67 65 73 65 74 2c 20 69 2e 65 2e 20 77 69 angeset, i.e. wi
2b30: 74 68 6f 75 74 20 72 65 76 69 73 69 6f 6e 73 7d thout revisions}
2b40: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 6e 65 .. lappend ne
2b50: 77 63 73 65 74 73 20 5b 24 74 79 70 65 20 25 41 wcsets [$type %A
2b60: 55 54 4f 25 20 24 70 72 6f 6a 65 63 74 20 24 63 UTO% $project $c
2b70: 73 74 79 70 65 20 24 63 73 73 72 63 20 24 66 72 stype $cssrc $fr
2b80: 61 67 6d 65 6e 74 72 65 76 69 73 69 6f 6e 73 5d agmentrevisions]
2b90: 0a 09 7d 0a 0a 09 66 6f 72 65 61 63 68 20 63 20 ..}...foreach c
2ba0: 24 6e 65 77 63 73 65 74 73 20 7b 20 24 63 20 70 $newcsets { $c p
2bb0: 65 72 73 69 73 74 20 7d 0a 09 72 65 74 75 72 6e ersist }..return
2bc0: 20 24 6e 65 77 63 73 65 74 73 0a 20 20 20 20 7d $newcsets. }
2bd0: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 .. typemethod
2be0: 20 73 74 72 6c 69 73 74 20 7b 63 68 61 6e 67 65 strlist {change
2bf0: 73 65 74 73 7d 20 7b 0a 09 72 65 74 75 72 6e 20 sets} {..return
2c00: 5b 6a 6f 69 6e 20 5b 73 74 72 75 63 74 3a 3a 6c [join [struct::l
2c10: 69 73 74 20 6d 61 70 20 24 63 68 61 6e 67 65 73 ist map $changes
2c20: 65 74 73 20 5b 6d 79 70 72 6f 63 20 49 44 5d 5d ets [myproc ID]]
2c30: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f ]. }.. pro
2c40: 63 20 49 44 20 7b 63 73 65 74 7d 20 7b 20 24 63 c ID {cset} { $c
2c50: 73 65 74 20 73 74 72 20 7d 0a 0a 20 20 20 20 23 set str }.. #
2c60: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 # ## ### #####
2c70: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
2c80: 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 53 74 ######. ## St
2c90: 61 74 65 0a 0a 20 20 20 20 76 61 72 69 61 62 6c ate.. variabl
2ca0: 65 20 6d 79 69 64 20 20 20 20 20 20 20 20 7b 7d e myid {}
2cb0: 20 3b 20 23 20 49 64 20 6f 66 20 74 68 65 20 63 ; # Id of the c
2cc0: 73 65 74 20 66 6f 72 20 74 68 65 20 70 65 72 73 set for the pers
2cd0: 69 73 74 65 6e 74 0a 09 09 09 20 20 20 20 20 20 istent....
2ce0: 23 20 73 74 61 74 65 2e 0a 20 20 20 20 76 61 72 # state.. var
2cf0: 69 61 62 6c 65 20 6d 79 70 72 6f 6a 65 63 74 20 iable myproject
2d00: 20 20 7b 7d 20 3b 20 23 20 52 65 66 65 72 65 6e {} ; # Referen
2d10: 63 65 20 6f 66 20 74 68 65 20 70 72 6f 6a 65 63 ce of the projec
2d20: 74 20 6f 62 6a 65 63 74 20 74 68 65 0a 09 09 09 t object the....
2d30: 20 20 20 20 20 20 23 20 63 68 61 6e 67 65 73 65 # changese
2d40: 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 20 20 t belongs to..
2d50: 20 20 76 61 72 69 61 62 6c 65 20 6d 79 74 79 70 variable mytyp
2d60: 65 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 57 68 e {} ; # Wh
2d70: 61 74 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 at the changeset
2d80: 20 69 73 20 62 61 73 65 64 20 6f 6e 0a 09 09 09 is based on....
2d90: 20 20 20 20 20 20 23 20 28 72 65 76 69 73 69 6f # (revisio
2da0: 6e 73 2c 20 74 61 67 73 2c 20 6f 72 20 62 72 61 ns, tags, or bra
2db0: 6e 63 68 65 73 29 2e 0a 09 09 09 20 20 20 20 20 nches).....
2dc0: 20 23 20 56 61 6c 75 65 73 3a 20 53 65 65 20 6d # Values: See m
2dd0: 79 63 73 74 79 70 65 2e 20 4e 6f 74 65 20 74 68 ycstype. Note th
2de0: 61 74 20 77 65 0a 09 09 09 20 20 20 20 20 20 23 at we.... #
2df0: 20 68 61 76 65 20 74 6f 20 6b 65 65 70 20 74 68 have to keep th
2e00: 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 68 e names of the h
2e10: 65 6c 70 65 72 0a 09 09 09 20 20 20 20 20 20 23 elper.... #
2e20: 20 73 69 6e 67 6c 65 74 6f 6e 73 20 69 6e 20 73 singletons in s
2e30: 79 6e 63 20 77 69 74 68 20 74 68 65 20 63 6f 6e ync with the con
2e40: 74 65 6e 74 73 0a 09 09 09 20 20 20 20 20 20 23 tents.... #
2e50: 20 6f 66 20 73 74 61 74 65 20 74 61 62 6c 65 20 of state table
2e60: 27 63 73 74 79 70 65 27 2c 20 61 6e 64 20 76 61 'cstype', and va
2e70: 72 69 6f 75 73 0a 09 09 09 20 20 20 20 20 20 23 rious.... #
2e80: 20 6f 74 68 65 72 20 70 6c 61 63 65 73 20 75 73 other places us
2e90: 69 6e 67 20 74 68 65 6d 20 68 61 72 64 77 69 72 ing them hardwir
2ea0: 65 64 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 ed.. variable
2eb0: 20 6d 79 74 79 70 65 6f 62 6a 20 20 20 7b 7d 20 mytypeobj {}
2ec0: 3b 20 23 20 52 65 66 65 72 65 6e 63 65 20 74 6f ; # Reference to
2ed0: 20 74 68 65 20 63 6f 6e 74 61 69 6e 65 72 20 66 the container f
2ee0: 6f 72 20 74 68 65 0a 09 09 09 20 20 20 20 20 20 or the....
2ef0: 23 20 74 79 70 65 20 64 65 70 65 6e 64 65 6e 74 # type dependent
2f00: 20 63 6f 64 65 2e 20 44 65 72 69 76 65 64 20 66 code. Derived f
2f10: 72 6f 6d 0a 09 09 09 20 20 20 20 20 20 23 20 6d rom.... # m
2f20: 79 74 79 70 65 2e 0a 20 20 20 20 76 61 72 69 61 ytype.. varia
2f30: 62 6c 65 20 6d 79 73 72 63 69 64 20 20 20 20 20 ble mysrcid
2f40: 7b 7d 20 3b 20 23 20 49 64 20 6f 66 20 74 68 65 {} ; # Id of the
2f50: 20 6d 65 74 61 64 61 74 61 20 6f 72 20 73 79 6d metadata or sym
2f60: 62 6f 6c 20 74 68 65 20 63 73 65 74 0a 09 09 09 bol the cset....
2f70: 20 20 20 20 20 20 23 20 69 73 20 62 61 73 65 64 # is based
2f80: 20 6f 6e 2e 0a 20 20 20 20 76 61 72 69 61 62 6c on.. variabl
2f90: 65 20 6d 79 72 65 76 69 73 69 6f 6e 73 20 7b 7d e myrevisions {}
2fa0: 20 3b 20 23 20 4c 69 73 74 20 6f 66 20 74 68 65 ; # List of the
2fb0: 20 66 69 6c 65 20 6c 65 76 65 6c 20 72 65 76 69 file level revi
2fc0: 73 69 6f 6e 73 20 69 6e 0a 09 09 09 20 20 20 20 sions in....
2fd0: 20 20 23 20 74 68 65 20 63 73 65 74 2e 0a 20 20 # the cset..
2fe0: 20 20 76 61 72 69 61 62 6c 65 20 6d 79 70 72 65 variable mypre
2ff0: 6d 61 70 20 20 20 20 7b 7d 20 3b 20 23 20 44 69 map {} ; # Di
3000: 63 74 69 6f 6e 61 72 79 20 6d 61 70 70 69 6e 67 ctionary mapping
3010: 20 66 72 6f 6d 20 74 68 65 20 72 65 76 69 73 69 from the revisi
3020: 6f 6e 73 0a 09 09 09 20 20 20 20 20 20 23 20 74 ons.... # t
3030: 6f 20 74 68 65 69 72 20 70 72 65 64 65 63 65 73 o their predeces
3040: 73 6f 72 73 2e 20 43 61 63 68 65 20 74 6f 20 61 sors. Cache to a
3050: 76 6f 69 64 0a 09 09 09 20 20 20 20 20 20 23 20 void.... #
3060: 6c 6f 61 64 69 6e 67 20 74 68 69 73 20 66 72 6f loading this fro
3070: 6d 20 74 68 65 20 73 74 61 74 65 20 6d 6f 72 65 m the state more
3080: 20 74 68 61 6e 0a 09 09 09 20 20 20 20 20 20 23 than.... #
3090: 20 6f 6e 63 65 2e 0a 20 20 20 20 76 61 72 69 61 once.. varia
30a0: 62 6c 65 20 6d 79 6e 65 78 74 6d 61 70 20 20 20 ble mynextmap
30b0: 7b 7d 20 3b 20 23 20 44 69 63 74 69 6f 6e 61 72 {} ; # Dictionar
30c0: 79 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 y mapping from t
30d0: 68 65 20 72 65 76 69 73 69 6f 6e 73 0a 09 09 09 he revisions....
30e0: 20 20 20 20 20 20 23 20 74 6f 20 74 68 65 69 72 # to their
30f0: 20 73 75 63 63 65 73 73 6f 72 73 2e 20 43 61 63 successors. Cac
3100: 68 65 20 74 6f 20 61 76 6f 69 64 0a 09 09 09 20 he to avoid....
3110: 20 20 20 20 20 23 20 6c 6f 61 64 69 6e 67 20 74 # loading t
3120: 68 69 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 his from the sta
3130: 74 65 20 6d 6f 72 65 20 74 68 61 6e 0a 09 09 09 te more than....
3140: 20 20 20 20 20 20 23 20 6f 6e 63 65 2e 0a 20 20 # once..
3150: 20 20 76 61 72 69 61 62 6c 65 20 6d 79 70 6f 73 variable mypos
3160: 20 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 43 6f {} ; # Co
3170: 6d 6d 69 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 mmit position of
3180: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20 the changeset,
3190: 69 66 0a 09 09 09 20 20 20 20 20 20 23 20 6b 6e if.... # kn
31a0: 6f 77 6e 2e 0a 0a 20 20 20 20 23 20 23 20 23 23 own... # # ##
31b0: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 ### ##### #####
31c0: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 ### ############
31d0: 23 0a 20 20 20 20 23 23 20 49 6e 74 65 72 6e 61 #. ## Interna
31e0: 6c 20 6d 65 74 68 6f 64 73 0a 0a 20 20 20 20 74 l methods.. t
31f0: 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 6f ypevariable myco
3200: 75 6e 74 65 72 20 20 20 20 20 20 20 20 30 20 3b unter 0 ;
3210: 20 23 20 49 64 20 63 6f 75 6e 74 65 72 20 66 6f # Id counter fo
3220: 72 20 63 73 65 74 73 2e 20 4c 61 73 74 20 69 64 r csets. Last id
3230: 0a 09 09 09 09 20 20 20 20 20 20 23 20 75 73 65 ..... # use
3240: 64 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 d.. typevaria
3250: 62 6c 65 20 6d 79 63 73 74 79 70 65 20 2d 61 72 ble mycstype -ar
3260: 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 63 ray {} ; # Map c
3270: 73 74 79 70 65 73 20 28 6e 61 6d 65 73 29 20 74 stypes (names) t
3280: 6f 20 70 65 72 73 69 73 74 65 6e 74 0a 09 09 09 o persistent....
3290: 09 20 20 20 20 20 20 23 20 69 64 73 2e 20 4e 6f . # ids. No
32a0: 74 65 20 74 68 61 74 20 77 65 20 68 61 76 65 20 te that we have
32b0: 74 6f 20 6b 65 65 70 0a 09 09 09 09 20 20 20 20 to keep.....
32c0: 20 20 23 20 74 68 65 20 6e 61 6d 65 73 20 69 6e # the names in
32d0: 20 74 68 65 20 74 61 62 6c 65 20 27 63 73 74 79 the table 'csty
32e0: 70 65 27 0a 09 09 09 09 20 20 20 20 20 20 23 20 pe'..... #
32f0: 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 in sync with the
3300: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 0a 09 09 names of the...
3310: 09 09 20 20 20 20 20 20 23 20 68 65 6c 70 65 72 .. # helper
3320: 20 73 69 6e 67 6c 65 74 6f 6e 73 2e 0a 0a 20 20 singletons...
3330: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 67 65 74 typemethod get
3340: 63 73 74 79 70 65 73 20 7b 7d 20 7b 0a 09 66 6f cstypes {} {..fo
3350: 72 65 61 63 68 20 7b 74 69 64 20 6e 61 6d 65 7d reach {tid name}
3360: 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 [state run {..
3370: 20 20 20 53 45 4c 45 43 54 20 74 69 64 2c 20 6e SELECT tid, n
3380: 61 6d 65 20 46 52 4f 4d 20 63 73 74 79 70 65 3b ame FROM cstype;
3390: 0a 09 7d 5d 20 7b 20 73 65 74 20 6d 79 63 73 74 ..}] { set mycst
33a0: 79 70 65 28 24 6e 61 6d 65 29 20 24 74 69 64 20 ype($name) $tid
33b0: 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a }..return. }.
33c0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 . typemethod
33d0: 6c 6f 61 64 63 6f 75 6e 74 65 72 20 7b 7d 20 7b loadcounter {} {
33e0: 0a 09 23 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 ..# Initialize t
33f0: 68 65 20 63 6f 75 6e 74 65 72 20 66 72 6f 6d 20 he counter from
3400: 74 68 65 20 73 74 61 74 65 0a 09 73 65 74 20 6d the state..set m
3410: 79 63 6f 75 6e 74 65 72 20 5b 73 74 61 74 65 20 ycounter [state
3420: 6f 6e 65 20 7b 20 53 45 4c 45 43 54 20 4d 41 58 one { SELECT MAX
3430: 28 63 69 64 29 20 46 52 4f 4d 20 63 68 61 6e 67 (cid) FROM chang
3440: 65 73 65 74 20 7d 5d 0a 09 72 65 74 75 72 6e 0a eset }]..return.
3450: 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d }.. typem
3460: 65 74 68 6f 64 20 6e 75 6d 20 7b 7d 20 7b 20 72 ethod num {} { r
3470: 65 74 75 72 6e 20 24 6d 79 63 6f 75 6e 74 65 72 eturn $mycounter
3480: 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 49 6e 69 }.. proc Ini
3490: 74 69 61 6c 69 7a 65 42 72 65 61 6b 53 74 61 74 tializeBreakStat
34a0: 65 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a e {revisions} {.
34b0: 09 75 70 76 61 72 20 31 20 70 6f 73 20 70 6f 73 .upvar 1 pos pos
34c0: 20 63 72 6f 73 73 20 63 72 6f 73 73 20 72 61 6e cross cross ran
34d0: 67 65 20 72 61 6e 67 65 20 64 65 70 63 20 64 65 ge range depc de
34e0: 70 63 20 64 65 6c 74 61 20 64 65 6c 74 61 20 5c pc delta delta \
34f0: 0a 09 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69 .. dependenci
3500: 65 73 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a es dependencies.
3510: 0a 09 23 20 46 69 72 73 74 20 77 65 20 63 72 65 ..# First we cre
3520: 61 74 65 20 61 20 6d 61 70 20 6f 66 20 70 6f 73 ate a map of pos
3530: 69 74 69 6f 6e 73 20 74 6f 20 6d 61 6b 65 20 69 itions to make i
3540: 74 20 65 61 73 69 65 72 20 74 6f 0a 09 23 20 64 t easier to..# d
3550: 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 etermine whether
3560: 20 61 20 64 65 70 65 6e 64 65 6e 63 79 20 63 72 a dependency cr
3570: 6f 73 73 65 73 20 61 20 70 61 72 74 69 63 75 6c osses a particul
3580: 61 72 20 69 6e 64 65 78 2e 0a 0a 09 61 72 72 61 ar index....arra
3590: 79 20 73 65 74 20 70 6f 73 20 20 20 7b 7d 0a 09 y set pos {}..
35a0: 61 72 72 61 79 20 73 65 74 20 63 72 6f 73 73 20 array set cross
35b0: 7b 7d 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 {}..array set de
35c0: 70 63 20 20 7b 7d 0a 09 73 65 74 20 72 61 6e 67 pc {}..set rang
35d0: 65 20 20 20 20 20 20 20 7b 7d 0a 09 73 65 74 20 e {}..set
35e0: 6e 20 30 0a 09 66 6f 72 65 61 63 68 20 72 65 76 n 0..foreach rev
35f0: 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 0a 09 20 $revisions {..
3600: 20 20 20 6c 61 70 70 65 6e 64 20 72 61 6e 67 65 lappend range
3610: 20 24 6e 0a 09 20 20 20 20 73 65 74 20 70 6f 73 $n.. set pos
3620: 28 24 72 65 76 29 20 24 6e 0a 09 20 20 20 20 73 ($rev) $n.. s
3630: 65 74 20 63 72 6f 73 73 28 24 6e 29 20 30 0a 09 et cross($n) 0..
3640: 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 0a 09 incr n..}...
3650: 23 20 53 65 63 6f 6e 64 6c 79 20 77 65 20 63 6f # Secondly we co
3660: 75 6e 74 20 74 68 65 20 63 72 6f 73 73 69 6e 67 unt the crossing
3670: 73 20 70 65 72 20 70 6f 73 69 74 69 6f 6e 2c 20 s per position,
3680: 62 79 20 69 74 65 72 61 74 69 6e 67 0a 09 23 20 by iterating..#
3690: 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64 65 over the recorde
36a0: 64 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e d internal depen
36b0: 64 65 6e 63 69 65 73 2e 0a 0a 09 23 20 4e 6f 74 dencies....# Not
36c0: 65 3a 20 49 66 20 74 68 65 20 74 69 6d 65 73 74 e: If the timest
36d0: 61 6d 70 73 20 61 72 65 20 62 61 64 6c 79 20 6f amps are badly o
36e0: 75 74 20 6f 66 20 6f 72 64 65 72 20 69 74 20 69 ut of order it i
36f0: 73 0a 09 23 20 20 20 20 20 20 20 70 6f 73 73 69 s..# possi
3700: 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20 62 61 ble to have a ba
3710: 63 6b 77 61 72 64 20 73 75 63 63 65 73 73 6f 72 ckward successor
3720: 20 64 65 70 65 6e 64 65 6e 63 79 2c 0a 09 23 20 dependency,..#
3730: 20 20 20 20 20 20 69 2e 65 2e 20 77 69 74 68 20 i.e. with
3740: 73 74 61 72 74 20 3e 20 65 6e 64 2e 20 57 65 20 start > end. We
3750: 6d 61 79 20 68 61 76 65 20 74 6f 20 73 77 61 70 may have to swap
3760: 20 74 68 65 20 69 6e 64 69 63 65 73 0a 09 23 20 the indices..#
3770: 20 20 20 20 20 20 74 6f 20 65 6e 73 75 72 65 20 to ensure
3780: 74 68 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 that the followi
3790: 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 63 6f 72 ng loop runs cor
37a0: 72 65 63 74 6c 79 2e 0a 09 23 0a 09 23 20 4e 6f rectly...#..# No
37b0: 74 65 20 32 3a 20 73 74 61 72 74 20 3d 3d 20 65 te 2: start == e
37c0: 6e 64 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 nd is not possib
37d0: 6c 65 2e 20 49 74 20 69 6e 64 69 63 61 74 65 73 le. It indicates
37e0: 20 61 0a 09 23 20 20 20 20 20 20 20 20 20 73 65 a..# se
37f0: 6c 66 2d 64 65 70 65 6e 64 65 6e 63 79 20 64 75 lf-dependency du
3800: 65 20 74 6f 20 74 68 65 20 75 6e 69 71 75 65 6e e to the uniquen
3810: 65 73 73 20 6f 66 20 70 6f 73 69 74 69 6f 6e 73 ess of positions
3820: 2c 0a 09 23 20 20 20 20 20 20 20 20 20 61 6e 64 ,..# and
3830: 20 74 68 61 74 20 69 73 20 73 6f 6d 65 74 68 69 that is somethi
3840: 6e 67 20 77 65 20 68 61 76 65 20 72 75 6c 65 64 ng we have ruled
3850: 20 6f 75 74 20 61 6c 72 65 61 64 79 2c 20 73 65 out already, se
3860: 65 0a 09 23 20 20 20 20 20 20 20 20 20 27 72 65 e..# 're
3870: 76 20 69 6e 74 65 72 6e 61 6c 73 75 63 63 65 73 v internalsucces
3880: 73 6f 72 73 27 2e 0a 0a 09 66 6f 72 65 61 63 68 sors'....foreach
3890: 20 7b 72 69 64 20 63 68 69 6c 64 72 65 6e 7d 20 {rid children}
38a0: 5b 61 72 72 61 79 20 67 65 74 20 64 65 70 65 6e [array get depen
38b0: 64 65 6e 63 69 65 73 5d 20 7b 0a 09 20 20 20 20 dencies] {..
38c0: 66 6f 72 65 61 63 68 20 63 68 69 6c 64 20 24 63 foreach child $c
38d0: 68 69 6c 64 72 65 6e 20 7b 0a 09 09 73 65 74 20 hildren {...set
38e0: 64 6b 65 79 20 20 20 20 5b 6c 69 73 74 20 24 72 dkey [list $r
38f0: 69 64 20 24 63 68 69 6c 64 5d 0a 09 09 73 65 74 id $child]...set
3900: 20 73 74 61 72 74 20 20 20 24 70 6f 73 28 24 72 start $pos($r
3910: 69 64 29 0a 09 09 73 65 74 20 65 6e 64 20 20 20 id)...set end
3920: 20 20 24 70 6f 73 28 24 63 68 69 6c 64 29 0a 09 $pos($child)..
3930: 09 73 65 74 20 63 72 6f 73 73 65 73 20 7b 7d 0a .set crosses {}.
3940: 0a 09 09 69 66 20 7b 24 73 74 61 72 74 20 3e 20 ...if {$start >
3950: 24 65 6e 64 7d 20 7b 0a 09 09 20 20 20 20 77 68 $end} {... wh
3960: 69 6c 65 20 7b 24 65 6e 64 20 3c 20 24 73 74 61 ile {$end < $sta
3970: 72 74 7d 20 7b 0a 09 09 09 6c 61 70 70 65 6e 64 rt} {....lappend
3980: 20 63 72 6f 73 73 65 73 20 24 65 6e 64 0a 09 09 crosses $end...
3990: 09 69 6e 63 72 20 63 72 6f 73 73 28 24 65 6e 64 .incr cross($end
39a0: 29 0a 09 09 09 69 6e 63 72 20 65 6e 64 0a 09 09 )....incr end...
39b0: 20 20 20 20 7d 0a 09 09 7d 20 65 6c 73 65 20 7b }...} else {
39c0: 0a 09 09 20 20 20 20 77 68 69 6c 65 20 7b 24 73 ... while {$s
39d0: 74 61 72 74 20 3c 20 24 65 6e 64 7d 20 7b 0a 09 tart < $end} {..
39e0: 09 09 6c 61 70 70 65 6e 64 20 63 72 6f 73 73 65 ..lappend crosse
39f0: 73 20 24 73 74 61 72 74 0a 09 09 09 69 6e 63 72 s $start....incr
3a00: 20 63 72 6f 73 73 28 24 73 74 61 72 74 29 0a 09 cross($start)..
3a10: 09 09 69 6e 63 72 20 73 74 61 72 74 0a 09 09 20 ..incr start...
3a20: 20 20 20 7d 0a 09 09 7d 0a 09 09 73 65 74 20 64 }...}...set d
3a30: 65 70 63 28 24 64 6b 65 79 29 20 24 63 72 6f 73 epc($dkey) $cros
3a40: 73 65 73 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 ses.. }..}...
3a50: 49 6e 69 74 69 61 6c 69 7a 65 44 65 6c 74 61 73 InitializeDeltas
3a60: 20 24 72 65 76 69 73 69 6f 6e 73 0a 09 72 65 74 $revisions..ret
3a70: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 urn. }.. p
3a80: 72 6f 63 20 49 6e 69 74 69 61 6c 69 7a 65 44 65 roc InitializeDe
3a90: 6c 74 61 73 20 7b 72 65 76 69 73 69 6f 6e 73 7d ltas {revisions}
3aa0: 20 7b 0a 09 75 70 76 61 72 20 31 20 64 65 6c 74 {..upvar 1 delt
3ab0: 61 20 64 65 6c 74 61 0a 0a 09 23 20 50 75 6c 6c a delta...# Pull
3ac0: 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 73 20 the timestamps
3ad0: 66 6f 72 20 61 6c 6c 20 72 65 76 69 73 69 6f 6e for all revision
3ae0: 73 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 s in the changes
3af0: 65 74 73 20 61 6e 64 0a 09 23 20 63 6f 6d 70 75 ets and..# compu
3b00: 74 65 20 74 68 65 69 72 20 64 65 6c 74 61 73 20 te their deltas
3b10: 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 62 for use by the b
3b20: 72 65 61 6b 20 66 69 6e 64 65 72 2e 0a 0a 09 61 reak finder....a
3b30: 72 72 61 79 20 73 65 74 20 64 65 6c 74 61 20 7b rray set delta {
3b40: 7d 0a 09 61 72 72 61 79 20 73 65 74 20 73 74 61 }..array set sta
3b50: 6d 70 20 7b 7d 0a 0a 09 73 65 74 20 74 68 65 73 mp {}...set thes
3b60: 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 et ('[join $revi
3b70: 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 sions {','}]')..
3b80: 66 6f 72 65 61 63 68 20 7b 72 69 64 20 74 69 6d foreach {rid tim
3b90: 65 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a e} [state run ".
3ba0: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 . SELECT R.ri
3bb0: 64 2c 20 52 2e 64 61 74 65 0a 09 20 20 20 20 46 d, R.date.. F
3bc0: 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 ROM revision R..
3bd0: 20 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 WHERE R.rid
3be0: 49 4e 20 24 74 68 65 73 65 74 0a 09 22 5d 20 7b IN $theset.."] {
3bf0: 0a 09 20 20 20 20 73 65 74 20 73 74 61 6d 70 28 .. set stamp(
3c00: 24 72 69 64 29 20 24 74 69 6d 65 0a 09 7d 0a 0a $rid) $time..}..
3c10: 09 73 65 74 20 6e 20 30 0a 09 66 6f 72 65 61 63 .set n 0..foreac
3c20: 68 20 72 69 64 20 5b 6c 72 61 6e 67 65 20 24 72 h rid [lrange $r
3c30: 65 76 69 73 69 6f 6e 73 20 30 20 65 6e 64 2d 31 evisions 0 end-1
3c40: 5d 20 72 6e 65 78 74 20 5b 6c 72 61 6e 67 65 20 ] rnext [lrange
3c50: 24 72 65 76 69 73 69 6f 6e 73 20 31 20 65 6e 64 $revisions 1 end
3c60: 5d 20 7b 0a 09 20 20 20 20 73 65 74 20 64 65 6c ] {.. set del
3c70: 74 61 28 24 6e 29 20 5b 65 78 70 72 20 7b 24 73 ta($n) [expr {$s
3c80: 74 61 6d 70 28 24 72 6e 65 78 74 29 20 2d 20 24 tamp($rnext) - $
3c90: 73 74 61 6d 70 28 24 72 69 64 29 7d 5d 0a 09 20 stamp($rid)}]..
3ca0: 20 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 09 72 65 incr n..}..re
3cb0: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 turn. }..
3cc0: 70 72 6f 63 20 46 69 6e 64 42 65 73 74 42 72 65 proc FindBestBre
3cd0: 61 6b 20 7b 72 61 6e 67 65 7d 20 7b 0a 09 75 70 ak {range} {..up
3ce0: 76 61 72 20 31 20 63 72 6f 73 73 20 63 72 6f 73 var 1 cross cros
3cf0: 73 20 64 65 6c 74 61 20 64 65 6c 74 61 0a 0a 09 s delta delta...
3d00: 23 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 # Determine the
3d10: 62 65 73 74 20 62 72 65 61 6b 20 6c 6f 63 61 74 best break locat
3d20: 69 6f 6e 20 69 6e 20 74 68 65 20 67 69 76 65 6e ion in the given
3d30: 20 72 61 6e 67 65 20 6f 66 0a 09 23 20 70 6f 73 range of..# pos
3d40: 69 74 69 6f 6e 73 2e 20 46 69 72 73 74 20 77 65 itions. First we
3d50: 20 6c 6f 6f 6b 20 66 6f 72 20 74 68 65 20 6c 6f look for the lo
3d60: 63 61 74 69 6f 6e 73 20 77 69 74 68 20 74 68 65 cations with the
3d70: 20 6d 61 78 69 6d 61 6c 0a 09 23 20 6e 75 6d 62 maximal..# numb
3d80: 65 72 20 6f 66 20 63 72 6f 73 73 69 6e 67 73 2e er of crossings.
3d90: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 65 If there are se
3da0: 76 65 72 61 6c 20 77 65 20 6c 6f 6f 6b 20 66 6f veral we look fo
3db0: 72 20 74 68 65 0a 09 23 20 73 68 6f 72 74 65 73 r the..# shortes
3dc0: 74 20 74 69 6d 65 20 69 6e 74 65 72 76 61 6c 20 t time interval
3dd0: 61 6d 6f 6e 67 20 74 68 65 6d 2e 20 49 66 20 77 among them. If w
3de0: 65 20 73 74 69 6c 6c 20 68 61 76 65 20 6d 75 6c e still have mul
3df0: 74 69 70 6c 65 0a 09 23 20 70 6f 73 73 69 62 69 tiple..# possibi
3e00: 6c 69 74 69 65 73 20 61 66 74 65 72 20 74 68 61 lities after tha
3e10: 74 20 77 65 20 73 65 6c 65 63 74 20 74 68 65 20 t we select the
3e20: 65 61 72 6c 69 65 73 74 20 6c 6f 63 61 74 69 6f earliest locatio
3e30: 6e 0a 09 23 20 61 6d 6f 6e 67 20 74 68 65 73 65 n..# among these
3e40: 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 49 66 20 74 ....# Note: If t
3e50: 68 65 20 6d 61 78 69 6d 61 6c 20 6e 75 6d 62 65 he maximal numbe
3e60: 72 20 6f 66 20 63 72 6f 73 73 69 6e 67 73 20 69 r of crossings i
3e70: 73 20 30 20 74 68 65 6e 20 74 68 65 20 72 61 6e s 0 then the ran
3e80: 67 65 0a 09 23 20 20 20 20 20 20 20 68 61 73 20 ge..# has
3e90: 6e 6f 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 no internal depe
3ea0: 6e 64 65 6e 63 69 65 73 2c 20 61 6e 64 20 6e 6f ndencies, and no
3eb0: 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 break location
3ec0: 61 74 0a 09 23 20 20 20 20 20 20 20 61 6c 6c 2e at..# all.
3ed0: 20 54 68 69 73 20 70 6f 73 73 69 62 69 6c 69 74 This possibilit
3ee0: 79 20 69 73 20 73 69 67 6e 61 6c 65 64 20 76 69 y is signaled vi
3ef0: 61 20 72 65 73 75 6c 74 20 2d 31 2e 0a 0a 09 23 a result -1....#
3f00: 20 4e 6f 74 65 3a 20 41 20 72 61 6e 67 65 20 6f Note: A range o
3f10: 66 20 6c 65 6e 67 74 68 20 31 20 6f 72 20 6c 65 f length 1 or le
3f20: 73 73 20 63 61 6e 6e 6f 74 20 68 61 76 65 20 69 ss cannot have i
3f30: 6e 74 65 72 6e 61 6c 0a 09 23 20 20 20 20 20 20 nternal..#
3f40: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 dependencies, a
3f50: 73 20 74 68 61 74 20 6e 65 65 64 73 20 61 74 20 s that needs at
3f60: 6c 65 61 73 74 20 74 77 6f 20 72 65 76 69 73 69 least two revisi
3f70: 6f 6e 73 20 69 6e 0a 09 23 20 20 20 20 20 20 20 ons in..#
3f80: 74 68 65 20 72 61 6e 67 65 2e 0a 0a 09 69 66 20 the range....if
3f90: 7b 5b 6c 6c 65 6e 67 74 68 20 24 72 61 6e 67 65 {[llength $range
3fa0: 5d 20 3c 20 32 7d 20 7b 20 72 65 74 75 72 6e 20 ] < 2} { return
3fb0: 2d 31 20 7d 0a 0a 09 73 65 74 20 6d 61 78 20 2d -1 }...set max -
3fc0: 31 0a 09 73 65 74 20 62 65 73 74 20 7b 7d 0a 0a 1..set best {}..
3fd0: 09 66 6f 72 65 61 63 68 20 6c 6f 63 61 74 69 6f .foreach locatio
3fe0: 6e 20 24 72 61 6e 67 65 20 7b 0a 09 20 20 20 20 n $range {..
3ff0: 73 65 74 20 63 72 6f 73 73 69 6e 67 73 20 24 63 set crossings $c
4000: 72 6f 73 73 28 24 6c 6f 63 61 74 69 6f 6e 29 0a ross($location).
4010: 09 20 20 20 20 69 66 20 7b 24 63 72 6f 73 73 69 . if {$crossi
4020: 6e 67 73 20 3e 20 24 6d 61 78 7d 20 7b 0a 09 09 ngs > $max} {...
4030: 73 65 74 20 6d 61 78 20 20 24 63 72 6f 73 73 69 set max $crossi
4040: 6e 67 73 0a 09 09 73 65 74 20 62 65 73 74 20 5b ngs...set best [
4050: 6c 69 73 74 20 24 6c 6f 63 61 74 69 6f 6e 5d 0a list $location].
4060: 09 09 63 6f 6e 74 69 6e 75 65 0a 09 20 20 20 20 ..continue..
4070: 7d 20 65 6c 73 65 69 66 20 7b 24 63 72 6f 73 73 } elseif {$cross
4080: 69 6e 67 73 20 3d 3d 20 24 6d 61 78 7d 20 7b 0a ings == $max} {.
4090: 09 09 6c 61 70 70 65 6e 64 20 62 65 73 74 20 24 ..lappend best $
40a0: 6c 6f 63 61 74 69 6f 6e 0a 09 20 20 20 20 7d 0a location.. }.
40b0: 09 7d 0a 0a 09 69 66 20 7b 24 6d 61 78 20 3d 3d .}...if {$max ==
40c0: 20 30 7d 20 20 20 20 20 20 20 20 20 20 20 20 7b 0} {
40d0: 20 72 65 74 75 72 6e 20 2d 31 20 7d 0a 09 69 66 return -1 }..if
40e0: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 62 65 73 74 {[llength $best
40f0: 5d 20 3d 3d 20 31 7d 20 7b 20 72 65 74 75 72 6e ] == 1} { return
4100: 20 5b 6c 69 6e 64 65 78 20 24 62 65 73 74 20 30 [lindex $best 0
4110: 5d 20 7d 0a 0a 09 73 65 74 20 6c 6f 63 61 74 69 ] }...set locati
4120: 6f 6e 73 20 24 62 65 73 74 0a 09 73 65 74 20 62 ons $best..set b
4130: 65 73 74 20 7b 7d 0a 09 73 65 74 20 6d 69 6e 20 est {}..set min
4140: 2d 31 0a 0a 09 66 6f 72 65 61 63 68 20 6c 6f 63 -1...foreach loc
4150: 61 74 69 6f 6e 20 24 6c 6f 63 61 74 69 6f 6e 73 ation $locations
4160: 20 7b 0a 09 20 20 20 20 73 65 74 20 69 6e 74 65 {.. set inte
4170: 72 76 61 6c 20 24 64 65 6c 74 61 28 24 6c 6f 63 rval $delta($loc
4180: 61 74 69 6f 6e 29 0a 09 20 20 20 20 69 66 20 7b ation).. if {
4190: 28 24 6d 69 6e 20 3c 20 30 29 20 7c 7c 20 28 24 ($min < 0) || ($
41a0: 69 6e 74 65 72 76 61 6c 20 3c 20 24 6d 69 6e 29 interval < $min)
41b0: 7d 20 7b 0a 09 09 73 65 74 20 6d 69 6e 20 20 24 } {...set min $
41c0: 69 6e 74 65 72 76 61 6c 0a 09 09 73 65 74 20 62 interval...set b
41d0: 65 73 74 20 5b 6c 69 73 74 20 24 6c 6f 63 61 74 est [list $locat
41e0: 69 6f 6e 5d 0a 09 20 20 20 20 7d 20 65 6c 73 65 ion].. } else
41f0: 69 66 20 7b 24 69 6e 74 65 72 76 61 6c 20 3d 3d if {$interval ==
4200: 20 24 6d 69 6e 7d 20 7b 0a 09 09 6c 61 70 70 65 $min} {...lappe
4210: 6e 64 20 62 65 73 74 20 24 6c 6f 63 61 74 69 6f nd best $locatio
4220: 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 n.. }..}...if
4230: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 62 65 73 74 {[llength $best
4240: 5d 20 3d 3d 20 31 7d 20 7b 20 72 65 74 75 72 6e ] == 1} { return
4250: 20 5b 6c 69 6e 64 65 78 20 24 62 65 73 74 20 30 [lindex $best 0
4260: 5d 20 7d 0a 0a 09 72 65 74 75 72 6e 20 5b 6c 69 ] }...return [li
4270: 6e 64 65 78 20 5b 6c 73 6f 72 74 20 2d 69 6e 74 ndex [lsort -int
4280: 65 67 65 72 20 2d 69 6e 63 72 65 61 73 69 6e 67 eger -increasing
4290: 20 24 62 65 73 74 5d 20 30 5d 0a 20 20 20 20 7d $best] 0]. }
42a0: 0a 0a 20 20 20 20 70 72 6f 63 20 43 75 74 41 74 .. proc CutAt
42b0: 20 7b 6c 6f 63 61 74 69 6f 6e 7d 20 7b 0a 09 75 {location} {..u
42c0: 70 76 61 72 20 31 20 63 72 6f 73 73 20 63 72 6f pvar 1 cross cro
42d0: 73 73 20 64 65 70 63 20 64 65 70 63 0a 0a 09 23 ss depc depc...#
42e0: 20 49 74 20 77 61 73 20 64 65 63 69 64 65 64 20 It was decided
42f0: 74 6f 20 73 70 6c 69 74 20 74 68 65 20 63 68 61 to split the cha
4300: 6e 67 65 73 65 74 20 61 74 20 74 68 65 20 67 69 ngeset at the gi
4310: 76 65 6e 0a 09 23 20 6c 6f 63 61 74 69 6f 6e 2e ven..# location.
4320: 20 54 68 69 73 20 63 75 74 73 20 61 20 6e 75 6d This cuts a num
4330: 62 65 72 20 6f 66 20 64 65 70 65 6e 64 65 6e 63 ber of dependenc
4340: 69 65 73 2e 20 48 65 72 65 20 77 65 20 75 70 64 ies. Here we upd
4350: 61 74 65 0a 09 23 20 74 68 65 20 63 72 6f 73 73 ate..# the cross
4360: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 information so
4370: 74 68 61 74 20 74 68 65 20 62 72 65 61 6b 20 66 that the break f
4380: 69 6e 64 65 72 20 68 61 73 20 61 63 63 75 72 61 inder has accura
4390: 74 65 0a 09 23 20 64 61 74 61 20 77 68 65 6e 20 te..# data when
43a0: 77 65 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20 67 we look at the g
43b0: 65 6e 65 72 61 74 65 64 20 66 72 61 67 6d 65 6e enerated fragmen
43c0: 74 73 2e 0a 0a 09 73 65 74 20 73 69 78 20 5b 6c ts....set six [l
43d0: 6f 67 20 76 69 73 69 62 6c 65 3f 20 36 5d 0a 0a og visible? 6]..
43e0: 09 66 6f 72 65 61 63 68 20 7b 64 65 70 20 72 61 .foreach {dep ra
43f0: 6e 67 65 7d 20 5b 61 72 72 61 79 20 67 65 74 20 nge} [array get
4400: 64 65 70 63 5d 20 7b 0a 09 20 20 20 20 23 20 43 depc] {.. # C
4410: 68 65 63 6b 20 61 6c 6c 20 64 65 70 65 6e 64 65 heck all depende
4420: 6e 63 69 65 73 20 73 74 69 6c 6c 20 6b 6e 6f 77 ncies still know
4430: 6e 2c 20 74 61 6b 65 20 74 68 65 69 72 20 72 61 n, take their ra
4440: 6e 67 65 20 61 6e 64 0a 09 20 20 20 20 23 20 73 nge and.. # s
4450: 65 65 20 69 66 20 74 68 65 20 62 72 65 61 6b 20 ee if the break
4460: 6c 6f 63 61 74 69 6f 6e 20 66 61 6c 6c 73 20 77 location falls w
4470: 69 74 68 69 6e 2e 0a 0a 09 20 20 20 20 42 6f 72 ithin.... Bor
4480: 64 65 72 20 24 72 61 6e 67 65 20 73 20 65 0a 09 der $range s e..
4490: 20 20 20 20 69 66 20 7b 24 6c 6f 63 61 74 69 6f if {$locatio
44a0: 6e 20 3c 20 24 73 7d 20 63 6f 6e 74 69 6e 75 65 n < $s} continue
44b0: 20 3b 20 23 20 62 72 65 61 6b 20 62 65 66 6f 72 ; # break befor
44c0: 65 20 72 61 6e 67 65 2c 20 69 67 6e 6f 72 65 0a e range, ignore.
44d0: 09 20 20 20 20 69 66 20 7b 24 6c 6f 63 61 74 69 . if {$locati
44e0: 6f 6e 20 3e 20 24 65 7d 20 63 6f 6e 74 69 6e 75 on > $e} continu
44f0: 65 20 3b 20 23 20 62 72 65 61 6b 20 61 66 74 65 e ; # break afte
4500: 72 20 72 61 6e 67 65 2c 20 69 67 6e 6f 72 65 2e r range, ignore.
4510: 0a 0a 09 20 20 20 20 23 20 54 68 69 73 20 64 65 ... # This de
4520: 70 65 6e 64 65 6e 63 79 20 63 72 6f 73 73 65 73 pendency crosses
4530: 20 74 68 65 20 62 72 65 61 6b 20 6c 6f 63 61 74 the break locat
4540: 69 6f 6e 2e 20 57 65 20 72 65 6d 6f 76 65 20 69 ion. We remove i
4550: 74 0a 09 20 20 20 20 23 20 66 72 6f 6d 20 74 68 t.. # from th
4560: 65 20 63 72 6f 73 73 69 6e 67 73 20 63 6f 75 6e e crossings coun
4570: 74 65 72 73 2c 20 61 6e 64 20 74 68 65 6e 20 61 ters, and then a
4580: 6c 73 6f 20 66 72 6f 6d 20 74 68 65 20 73 65 74 lso from the set
4590: 0a 09 20 20 20 20 23 20 6f 66 20 6b 6e 6f 77 6e .. # of known
45a0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 dependencies, a
45b0: 73 20 77 65 20 61 72 65 20 64 6f 6e 65 20 77 69 s we are done wi
45c0: 74 68 20 69 74 2e 0a 0a 09 20 20 20 20 66 6f 72 th it.... for
45d0: 65 61 63 68 20 6c 6f 63 20 24 64 65 70 63 28 24 each loc $depc($
45e0: 64 65 70 29 20 7b 20 69 6e 63 72 20 63 72 6f 73 dep) { incr cros
45f0: 73 28 24 6c 6f 63 29 20 2d 31 20 7d 0a 09 20 20 s($loc) -1 }..
4600: 20 20 75 6e 73 65 74 20 64 65 70 63 28 24 64 65 unset depc($de
4610: 70 29 0a 0a 09 20 20 20 20 69 66 20 7b 21 24 73 p)... if {!$s
4620: 69 78 7d 20 63 6f 6e 74 69 6e 75 65 0a 0a 09 20 ix} continue...
4630: 20 20 20 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 struct::list
4640: 61 73 73 69 67 6e 20 24 64 65 70 20 70 61 72 65 assign $dep pare
4650: 6e 74 20 63 68 69 6c 64 0a 09 20 20 20 20 6c 6f nt child.. lo
4660: 67 20 77 72 69 74 65 20 35 20 63 73 65 74 73 20 g write 5 csets
4670: 22 42 72 6f 6b 65 20 64 65 70 65 6e 64 65 6e 63 "Broke dependenc
4680: 79 20 5b 50 44 20 24 70 61 72 65 6e 74 5d 20 2d y [PD $parent] -
4690: 2d 3e 20 5b 50 44 20 24 63 68 69 6c 64 5d 22 0a -> [PD $child]".
46a0: 09 7d 0a 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 .}...return.
46b0: 7d 0a 0a 20 20 20 20 23 20 50 72 69 6e 74 20 69 }.. # Print i
46c0: 64 65 6e 74 69 66 79 69 6e 67 20 64 61 74 61 20 dentifying data
46d0: 66 6f 72 20 61 20 72 65 76 69 73 69 6f 6e 20 28 for a revision (
46e0: 70 72 6f 6a 65 63 74 2c 20 66 69 6c 65 2c 20 64 project, file, d
46f0: 6f 74 74 65 64 20 72 65 76 0a 20 20 20 20 23 20 otted rev. #
4700: 6e 75 6d 62 65 72 29 2c 20 66 6f 72 20 68 69 67 number), for hig
4710: 68 20 76 65 72 62 6f 73 69 74 79 20 6c 6f 67 20 h verbosity log
4720: 6f 75 74 70 75 74 2e 0a 0a 20 20 20 20 70 72 6f output... pro
4730: 63 20 50 44 20 7b 69 64 7d 20 7b 0a 09 66 6f 72 c PD {id} {..for
4740: 65 61 63 68 20 7b 70 20 66 20 72 7d 20 5b 73 74 each {p f r} [st
4750: 61 74 65 20 72 75 6e 20 7b 0a 09 09 53 45 4c 45 ate run {...SELE
4760: 43 54 20 50 2e 6e 61 6d 65 20 2c 20 46 2e 6e 61 CT P.name , F.na
4770: 6d 65 2c 20 52 2e 72 65 76 0a 09 09 46 52 4f 4d me, R.rev...FROM
4780: 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 66 69 6c revision R, fil
4790: 65 20 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09 e F, project P..
47a0: 09 57 48 45 52 45 20 52 2e 72 69 64 20 3d 20 24 .WHERE R.rid = $
47b0: 69 64 0a 09 09 41 4e 44 20 20 20 52 2e 66 69 64 id...AND R.fid
47c0: 20 3d 20 46 2e 66 69 64 0a 09 09 41 4e 44 20 20 = F.fid...AND
47d0: 20 46 2e 70 69 64 20 3d 20 50 2e 70 69 64 0a 09 F.pid = P.pid..
47e0: 7d 5d 20 62 72 65 61 6b 0a 09 72 65 74 75 72 6e }] break..return
47f0: 20 22 27 24 70 20 3a 20 24 66 2f 24 72 27 22 0a "'$p : $f/$r'".
4800: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 50 72 69 }.. # Pri
4810: 6e 74 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 nting one or mor
4820: 65 20 72 61 6e 67 65 73 2c 20 66 6f 72 6d 61 74 e ranges, format
4830: 74 65 64 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 ted, and only th
4840: 65 69 72 20 62 6f 72 64 65 72 20 74 6f 0a 20 20 eir border to.
4850: 20 20 23 20 6b 65 65 70 20 74 68 65 20 73 74 72 # keep the str
4860: 69 6e 67 73 20 73 68 6f 72 74 2e 0a 0a 20 20 20 ings short...
4870: 20 70 72 6f 63 20 50 52 73 20 7b 72 61 6e 67 65 proc PRs {range
4880: 73 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b 73 74 s} {..return [st
4890: 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20 24 ruct::list map $
48a0: 72 61 6e 67 65 73 20 5b 6d 79 70 72 6f 63 20 50 ranges [myproc P
48b0: 52 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 R]]. }.. p
48c0: 72 6f 63 20 50 52 20 7b 72 61 6e 67 65 7d 20 7b roc PR {range} {
48d0: 0a 09 42 6f 72 64 65 72 20 24 72 61 6e 67 65 20 ..Border $range
48e0: 73 20 65 0a 09 72 65 74 75 72 6e 20 3c 24 7b 73 s e..return <${s
48f0: 7d 2e 2e 2e 24 7b 65 7d 3e 0a 20 20 20 20 7d 0a }...${e}>. }.
4900: 0a 20 20 20 20 70 72 6f 63 20 42 6f 72 64 65 72 . proc Border
4910: 20 7b 72 61 6e 67 65 20 73 76 20 65 76 7d 20 7b {range sv ev} {
4920: 0a 09 75 70 76 61 72 20 31 20 24 73 76 20 73 20 ..upvar 1 $sv s
4930: 24 65 76 20 65 0a 09 73 65 74 20 73 20 5b 6c 69 $ev e..set s [li
4940: 6e 64 65 78 20 24 72 61 6e 67 65 20 30 5d 0a 09 ndex $range 0]..
4950: 73 65 74 20 65 20 5b 6c 69 6e 64 65 78 20 24 72 set e [lindex $r
4960: 61 6e 67 65 20 65 6e 64 5d 0a 09 72 65 74 75 72 ange end]..retur
4970: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 n. }.. # #
4980: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 ## ### ##### ##
4990: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 ###### #########
49a0: 23 23 23 23 0a 0a 20 20 20 20 74 79 70 65 76 61 ####.. typeva
49b0: 72 69 61 62 6c 65 20 6d 79 63 68 61 6e 67 65 73 riable mychanges
49c0: 65 74 73 20 20 20 20 7b 7d 20 3b 20 23 20 4c 69 ets {} ; # Li
49d0: 73 74 20 6f 66 20 61 6c 6c 20 6b 6e 6f 77 6e 20 st of all known
49e0: 63 68 61 6e 67 65 73 65 74 73 2e 0a 20 20 20 20 changesets..
49f0: 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 72 typevariable myr
4a00: 65 76 6d 61 70 20 2d 61 72 72 61 79 20 7b 7d 20 evmap -array {}
4a10: 3b 20 23 20 4d 61 70 20 66 72 6f 6d 20 72 65 76 ; # Map from rev
4a20: 69 73 69 6f 6e 73 20 74 6f 20 74 68 65 20 6c 69 isions to the li
4a30: 73 74 0a 09 09 09 09 20 20 20 20 20 20 23 20 6f st..... # o
4a40: 66 20 63 68 61 6e 67 65 73 65 74 73 20 63 6f 6e f changesets con
4a50: 74 61 69 6e 69 6e 67 0a 09 09 09 09 20 20 20 20 taining.....
4a60: 20 20 23 20 69 74 2e 20 4e 4f 54 45 3a 20 57 68 # it. NOTE: Wh
4a70: 69 6c 65 20 6f 6e 6c 79 20 6f 6e 65 0a 09 09 09 ile only one....
4a80: 09 20 20 20 20 20 20 23 20 72 65 76 69 73 69 6f . # revisio
4a90: 6e 20 63 68 61 6e 67 65 73 65 74 20 63 61 6e 20 n changeset can
4aa0: 63 6f 6e 74 61 69 6e 0a 09 09 09 09 20 20 20 20 contain.....
4ab0: 20 20 23 20 74 68 65 20 72 65 76 69 73 69 6f 6e # the revision
4ac0: 2c 20 74 68 65 72 65 20 63 61 6e 0a 09 09 09 09 , there can.....
4ad0: 20 20 20 20 20 20 23 20 68 6f 77 65 76 65 72 20 # however
4ae0: 61 6c 73 6f 20 62 65 20 6f 6e 65 20 6f 72 20 6d also be one or m
4af0: 6f 72 65 0a 09 09 09 09 20 20 20 20 20 20 23 20 ore..... #
4b00: 61 64 64 69 74 69 6f 6e 61 6c 20 73 79 6d 62 6f additional symbo
4b10: 6c 20 63 68 61 6e 67 65 73 65 74 73 0a 09 09 09 l changesets....
4b20: 09 20 20 20 20 20 20 23 20 77 68 69 63 68 20 75 . # which u
4b30: 73 65 20 69 74 2c 20 68 65 6e 63 65 20 61 20 6c se it, hence a l
4b40: 69 73 74 2e 0a 20 20 20 20 74 79 70 65 76 61 72 ist.. typevar
4b50: 69 61 62 6c 65 20 6d 79 69 64 6d 61 70 20 20 2d iable myidmap -
4b60: 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 array {} ; # Map
4b70: 20 66 72 6f 6d 20 63 68 61 6e 67 65 73 65 74 20 from changeset
4b80: 69 64 20 74 6f 20 63 68 61 6e 67 65 73 65 74 2e id to changeset.
4b90: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 .. typemethod
4ba0: 20 61 6c 6c 20 20 20 7b 7d 20 20 20 7b 20 72 65 all {} { re
4bb0: 74 75 72 6e 20 24 6d 79 63 68 61 6e 67 65 73 65 turn $mychangese
4bc0: 74 73 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 ts }. typemet
4bd0: 68 6f 64 20 6f 66 20 20 20 20 7b 69 64 7d 20 7b hod of {id} {
4be0: 20 72 65 74 75 72 6e 20 24 6d 79 69 64 6d 61 70 return $myidmap
4bf0: 28 24 69 64 29 20 7d 0a 20 20 20 20 74 79 70 65 ($id) }. type
4c00: 6d 65 74 68 6f 64 20 6f 66 72 65 76 20 7b 69 64 method ofrev {id
4c10: 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 72 65 } { return $myre
4c20: 76 6d 61 70 28 24 69 64 29 20 7d 0a 0a 20 20 20 vmap($id) }..
4c30: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 # # ## ### ####
4c40: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 # ######## #####
4c50: 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 ########. ##
4c60: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a 20 Configuration..
4c70: 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79 pragma -hasty
4c80: 70 65 69 6e 66 6f 20 20 20 20 6e 6f 20 20 3b 20 peinfo no ;
4c90: 23 20 6e 6f 20 74 79 70 65 20 69 6e 74 72 6f 73 # no type intros
4ca0: 70 65 63 74 69 6f 6e 0a 20 20 20 20 70 72 61 67 pection. prag
4cb0: 6d 61 20 2d 68 61 73 69 6e 66 6f 20 20 20 20 20 ma -hasinfo
4cc0: 20 20 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 6f 62 no ; # no ob
4cd0: 6a 65 63 74 20 69 6e 74 72 6f 73 70 65 63 74 69 ject introspecti
4ce0: 6f 6e 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 on.. # # ## #
4cf0: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 ## ##### #######
4d00: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a # #############.
4d10: 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 }..# # ## ### ##
4d20: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 ### ######## ###
4d30: 23 23 23 23 23 23 23 23 23 23 20 23 23 23 23 23 ########## #####
4d40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
4d50: 0a 23 23 20 48 65 6c 70 65 72 20 73 69 6e 67 6c .## Helper singl
4d60: 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20 66 eton. Commands f
4d70: 6f 72 20 72 65 76 69 73 69 6f 6e 20 63 68 61 6e or revision chan
4d80: 67 65 73 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 gesets...snit::t
4d90: 79 70 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c ype ::vc::fossil
4da0: 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 ::import::cvs::p
4db0: 72 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 72 65 76 roject::rev::rev
4dc0: 20 7b 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f {. typemetho
4dd0: 64 20 62 79 72 65 76 69 73 69 6f 6e 20 7b 7d 20 d byrevision {}
4de0: 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 { return 1 }.
4df0: 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 73 79 typemethod bysy
4e00: 6d 62 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 74 75 mbol {} { retu
4e10: 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d rn 0 }. typem
4e20: 65 74 68 6f 64 20 69 73 74 61 67 20 20 20 20 20 ethod istag
4e30: 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d {} { return 0 }
4e40: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 . typemethod
4e50: 69 73 62 72 61 6e 63 68 20 20 20 7b 7d 20 7b 20 isbranch {} {
4e60: 72 65 74 75 72 6e 20 30 20 7d 0a 0a 20 20 20 20 return 0 }..
4e70: 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 # result = list
4e80: 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74 69 6d (mintime, maxtim
4e90: 65 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f e). typemetho
4ea0: 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 69 74 65 d timerange {ite
4eb0: 6d 73 7d 20 7b 0a 09 73 65 74 20 74 68 65 73 65 ms} {..set these
4ec0: 74 20 28 27 5b 6a 6f 69 6e 20 24 69 74 65 6d 73 t ('[join $items
4ed0: 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 {','}]')..retur
4ee0: 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 n [state run "..
4ef0: 20 20 20 20 53 45 4c 45 43 54 20 4d 49 4e 28 52 SELECT MIN(R
4f00: 2e 64 61 74 65 29 2c 20 4d 41 58 28 52 2e 64 61 .date), MAX(R.da
4f10: 74 65 29 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 te).. FROM re
4f20: 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 vision R.. WH
4f30: 45 52 45 20 52 2e 72 69 64 20 49 4e 20 24 74 68 ERE R.rid IN $th
4f40: 65 73 65 74 0a 09 22 5d 0a 20 20 20 20 7d 0a 0a eset.."]. }..
4f50: 20 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 # var(dv) =
4f60: 64 69 63 74 20 28 72 65 76 69 73 69 6f 6e 20 2d dict (revision -
4f70: 3e 20 6c 69 73 74 20 28 72 65 76 69 73 69 6f 6e > list (revision
4f80: 29 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f )). typemetho
4f90: 64 20 69 6e 74 65 72 6e 61 6c 73 75 63 63 65 73 d internalsucces
4fa0: 73 6f 72 73 20 7b 64 76 20 72 65 76 69 73 69 6f sors {dv revisio
4fb0: 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 ns} {..upvar 1 $
4fc0: 64 76 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a dv dependencies.
4fd0: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a .set theset ('[j
4fe0: 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b oin $revisions {
4ff0: 27 2c 27 7d 5d 27 29 0a 0a 09 23 20 53 65 65 20 ','}]')...# See
5000: 27 73 75 63 63 65 73 73 6f 72 73 27 20 62 65 6c 'successors' bel
5010: 6f 77 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 ow for the main
5020: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 0a 09 explanation of..
5030: 23 20 74 68 65 20 76 61 72 69 6f 75 73 20 63 61 # the various ca
5040: 73 65 73 2e 20 54 68 69 73 20 70 69 65 63 65 20 ses. This piece
5050: 69 73 20 73 70 65 63 69 61 6c 20 69 6e 20 74 68 is special in th
5060: 61 74 20 69 74 0a 09 23 20 72 65 73 74 72 69 63 at it..# restric
5070: 74 73 20 74 68 65 20 73 75 63 63 65 73 73 6f 72 ts the successor
5080: 73 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 6f s we look for to
5090: 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 the same set of
50a0: 0a 09 23 20 72 65 76 69 73 69 6f 6e 73 20 77 65 ..# revisions we
50b0: 20 73 74 61 72 74 20 66 72 6f 6d 2e 20 53 65 6e start from. Sen
50c0: 73 69 62 6c 65 20 61 73 20 77 65 20 61 72 65 20 sible as we are
50d0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 0a 09 23 20 63 looking for..# c
50e0: 68 61 6e 67 65 73 65 74 20 69 6e 74 65 72 6e 61 hangeset interna
50f0: 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 0a l dependencies..
5100: 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 70 20 ..array set dep
5110: 7b 7d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 {}...foreach {ri
5120: 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 d child} [state
5130: 72 75 6e 20 22 0a 20 20 20 2d 2d 20 28 31 29 20 run ". -- (1)
5140: 50 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 Primary child..
5150: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c SELECT R.rid,
5160: 20 52 2e 63 68 69 6c 64 0a 09 20 20 20 20 46 52 R.child.. FR
5170: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 0a OM revision R.
5180: 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 . WHERE R.ri
5190: 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 d IN $theset
51a0: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 -- Restrict t
51b0: 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 o revisions of i
51c0: 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 nterest.. AND
51d0: 20 20 20 20 52 2e 63 68 69 6c 64 20 49 53 20 4e R.child IS N
51e0: 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 OT NULL -- Ha
51f0: 73 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 0a s primary child.
5200: 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 63 68 . AND R.ch
5210: 69 6c 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 ild IN $theset
5220: 20 20 20 2d 2d 20 57 68 69 63 68 20 69 73 20 61 -- Which is a
5230: 6c 73 6f 20 6f 66 20 69 6e 74 65 72 65 73 74 0a lso of interest.
5240: 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d UNION. --
5250: 20 28 32 29 20 53 65 63 6f 6e 64 61 72 79 20 28 (2) Secondary (
5260: 62 72 61 6e 63 68 29 20 63 68 69 6c 64 72 65 6e branch) children
5270: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 .. SELECT R.r
5280: 69 64 2c 20 42 2e 62 72 69 64 0a 09 20 20 20 20 id, B.brid..
5290: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 FROM revision
52a0: 52 2c 20 72 65 76 69 73 69 6f 6e 62 72 61 6e 63 R, revisionbranc
52b0: 68 63 68 69 6c 64 72 65 6e 20 42 0a 09 20 20 20 hchildren B..
52c0: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 WHERE R.rid
52d0: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d IN $theset -
52e0: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 - Restrict to re
52f0: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 visions of inter
5300: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 est.. AND
5310: 52 2e 72 69 64 20 3d 20 42 2e 72 69 64 20 20 20 R.rid = B.rid
5320: 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 -- Select
5330: 20 73 75 62 73 65 74 20 6f 66 20 62 72 61 6e 63 subset of branc
5340: 68 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 h children..
5350: 41 4e 44 20 20 20 20 42 2e 62 72 69 64 20 49 4e AND B.brid IN
5360: 20 24 74 68 65 73 65 74 20 20 20 20 20 20 2d 2d $theset --
5370: 20 57 68 69 63 68 20 69 73 20 61 6c 73 6f 20 6f Which is also o
5380: 66 20 69 6e 74 65 72 65 73 74 0a 20 20 20 20 55 f interest. U
5390: 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 34 29 20 NION. -- (4)
53a0: 43 68 69 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 Child of trunk r
53b0: 6f 6f 74 20 73 75 63 63 65 73 73 6f 72 20 6f 66 oot successor of
53c0: 20 6c 61 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 last NTDB on tr
53d0: 75 6e 6b 2e 0a 09 20 20 20 20 53 45 4c 45 43 54 unk... SELECT
53e0: 20 52 2e 72 69 64 2c 20 52 41 2e 63 68 69 6c 64 R.rid, RA.child
53f0: 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73 .. FROM revis
5400: 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 ion R, revision
5410: 52 41 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e RA.. WHERE R.
5420: 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 rid IN $theset
5430: 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 -- Restric
5440: 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f t to revisions o
5450: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 f interest..
5460: 41 4e 44 20 20 20 52 2e 69 73 64 65 66 61 75 6c AND R.isdefaul
5470: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d t --
5480: 20 52 65 73 74 72 69 63 74 20 74 6f 20 4e 54 44 Restrict to NTD
5490: 42 0a 09 20 20 20 20 41 4e 44 20 20 20 52 2e 64 B.. AND R.d
54a0: 62 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 bchild IS NOT NU
54b0: 4c 4c 20 20 20 2d 2d 20 61 6e 64 20 6c 61 73 74 LL -- and last
54c0: 20 4e 54 44 42 20 62 65 6c 6f 6e 67 69 6e 67 20 NTDB belonging
54d0: 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20 41 4e to trunk.. AN
54e0: 44 20 20 20 52 41 2e 72 69 64 20 3d 20 52 2e 64 D RA.rid = R.d
54f0: 62 63 68 69 6c 64 20 20 20 20 20 20 2d 2d 20 47 bchild -- G
5500: 6f 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 72 o directly to tr
5510: 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 20 41 4e unk root.. AN
5520: 44 20 20 20 52 41 2e 63 68 69 6c 64 20 49 53 20 D RA.child IS
5530: 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 NOT NULL -- H
5540: 61 73 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 as primary child
5550: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e .. AN
5560: 44 20 20 20 52 41 2e 63 68 69 6c 64 20 49 4e 20 D RA.child IN
5570: 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 57 $theset -- W
5580: 68 69 63 68 20 69 73 20 61 6c 73 6f 20 6f 66 20 hich is also of
5590: 69 6e 74 65 72 65 73 74 0a 09 22 5d 20 7b 0a 09 interest.."] {..
55a0: 20 20 20 20 23 20 43 6f 6e 73 69 64 65 72 20 6d # Consider m
55b0: 6f 76 69 6e 67 20 74 68 69 73 20 74 6f 20 74 68 oving this to th
55c0: 65 20 69 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 e integrity modu
55d0: 6c 65 2e 0a 09 20 20 20 20 69 6e 74 65 67 72 69 le... integri
55e0: 74 79 20 61 73 73 65 72 74 20 7b 24 72 69 64 20 ty assert {$rid
55f0: 21 3d 20 24 63 68 69 6c 64 7d 20 7b 52 65 76 69 != $child} {Revi
5600: 73 69 6f 6e 20 24 72 69 64 20 64 65 70 65 6e 64 sion $rid depend
5610: 73 20 6f 6e 20 69 74 73 65 6c 66 2e 7d 0a 09 20 s on itself.}..
5620: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e lappend depen
5630: 64 65 6e 63 69 65 73 28 24 72 69 64 29 20 24 63 dencies($rid) $c
5640: 68 69 6c 64 0a 09 20 20 20 20 73 65 74 20 64 65 hild.. set de
5650: 70 28 24 72 69 64 2c 24 63 68 69 6c 64 29 20 2e p($rid,$child) .
5660: 0a 09 7d 0a 0a 09 23 20 54 68 65 20 73 71 6c 20 ..}...# The sql
5670: 73 74 61 74 65 6d 65 6e 74 73 20 61 62 6f 76 65 statements above
5680: 20 6c 6f 6f 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 looks only for
5690: 64 69 72 65 63 74 20 64 65 70 65 6e 64 65 6e 63 direct dependenc
56a0: 69 65 73 0a 09 23 20 62 65 74 77 65 65 6e 20 72 ies..# between r
56b0: 65 76 69 73 69 6f 6e 20 69 6e 20 74 68 65 20 63 evision in the c
56c0: 68 61 6e 67 65 73 65 74 2e 20 48 6f 77 65 76 65 hangeset. Howeve
56d0: 72 20 64 75 65 20 74 6f 20 74 68 65 0a 09 23 20 r due to the..#
56e0: 76 61 67 61 72 69 65 73 20 6f 66 20 6d 65 74 61 vagaries of meta
56f0: 20 64 61 74 61 20 69 74 20 69 73 20 70 6f 73 73 data it is poss
5700: 69 62 6c 65 20 66 6f 72 20 74 77 6f 20 72 65 76 ible for two rev
5710: 69 73 69 6f 6e 73 20 6f 66 0a 09 23 20 74 68 65 isions of..# the
5720: 20 73 61 6d 65 20 66 69 6c 65 20 74 6f 20 65 6e same file to en
5730: 64 20 75 70 20 69 6e 20 74 68 65 20 73 61 6d 65 d up in the same
5740: 20 63 68 61 6e 67 65 73 65 74 2c 20 77 69 74 68 changeset, with
5750: 6f 75 74 20 61 0a 09 23 20 64 69 72 65 63 74 20 out a..# direct
5760: 64 65 70 65 6e 64 65 6e 63 79 20 62 65 74 77 65 dependency betwe
5770: 65 6e 20 74 68 65 6d 2e 20 48 6f 77 65 76 65 72 en them. However
5780: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 we know that th
5790: 65 72 65 0a 09 23 20 68 61 73 20 74 6f 20 62 65 ere..# has to be
57a0: 20 61 20 61 6e 20 69 6e 64 69 72 65 63 74 20 64 a an indirect d
57b0: 65 70 65 6e 64 65 6e 63 79 2c 20 62 65 20 69 74 ependency, be it
57c0: 20 74 68 72 6f 75 67 68 20 70 72 69 6d 61 72 79 through primary
57d0: 0a 09 23 20 63 68 69 6c 64 72 65 6e 2c 20 62 72 ..# children, br
57e0: 61 6e 63 68 20 63 68 69 6c 64 72 65 6e 2c 20 6f anch children, o
57f0: 72 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 r a combination
5800: 74 68 65 72 65 6f 66 2e 0a 0a 09 23 20 57 65 20 thereof....# We
5810: 6e 6f 77 20 66 69 6c 6c 20 69 6e 20 74 68 65 73 now fill in thes
5820: 65 20 70 73 65 75 64 6f 2d 64 65 70 65 6e 64 65 e pseudo-depende
5830: 6e 63 69 65 73 2c 20 69 66 20 6e 6f 20 73 75 63 ncies, if no suc
5840: 68 0a 09 23 20 64 65 70 65 6e 64 65 6e 63 79 20 h..# dependency
5850: 65 78 69 73 74 73 20 61 6c 72 65 61 64 79 2e 20 exists already.
5860: 54 68 65 20 64 69 72 65 63 74 69 6f 6e 20 6f 66 The direction of
5870: 20 74 68 65 20 64 65 70 65 6e 64 65 6e 63 79 0a the dependency.
5880: 09 23 20 69 73 20 61 63 74 75 61 6c 6c 79 20 69 .# is actually i
5890: 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 74 68 rrelevant for th
58a0: 69 73 2e 0a 0a 09 23 20 4e 4f 54 45 3a 20 54 68 is....# NOTE: Th
58b0: 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 is is different
58c0: 66 72 6f 6d 20 63 76 73 32 73 76 6e 2e 20 4f 75 from cvs2svn. Ou
58d0: 72 20 73 70 69 72 69 74 75 61 6c 20 61 6e 63 65 r spiritual ance
58e0: 73 74 6f 72 0a 09 23 20 64 6f 65 73 20 6e 6f 74 stor..# does not
58f0: 20 75 73 65 20 73 75 63 68 20 70 73 65 75 64 6f use such pseudo
5900: 2d 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 68 -dependencies, h
5910: 6f 77 65 76 65 72 20 69 74 20 75 73 65 73 20 61 owever it uses a
5920: 0a 09 23 20 43 4f 4d 4d 49 54 5f 54 48 52 45 53 ..# COMMIT_THRES
5930: 48 4f 4c 44 2c 20 61 20 74 69 6d 65 20 69 6e 74 HOLD, a time int
5940: 65 72 76 61 6c 20 63 6f 6d 6d 69 74 73 20 73 68 erval commits sh
5950: 6f 75 6c 64 20 66 61 6c 6c 2e 20 54 68 69 73 0a ould fall. This.
5960: 09 23 20 77 69 6c 6c 20 67 72 65 61 74 6c 79 20 .# will greatly
5970: 72 65 64 75 63 65 73 20 74 68 65 20 72 69 73 6b reduces the risk
5980: 20 6f 66 20 67 65 74 74 69 6e 67 20 66 61 72 20 of getting far
5990: 73 65 70 61 72 61 74 65 64 0a 09 23 20 72 65 76 separated..# rev
59a0: 69 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 61 isions of the sa
59b0: 6d 65 20 66 69 6c 65 20 69 6e 74 6f 20 6f 6e 65 me file into one
59c0: 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 23 20 changeset....#
59d0: 57 65 20 61 6c 6c 6f 77 20 72 65 76 69 73 69 6f We allow revisio
59e0: 6e 73 20 74 6f 20 62 65 20 66 61 72 20 61 70 61 ns to be far apa
59f0: 72 74 20 69 6e 20 74 69 6d 65 20 69 6e 20 74 68 rt in time in th
5a00: 65 20 73 61 6d 65 0a 09 23 20 63 68 61 6e 67 65 e same..# change
5a10: 73 65 74 2c 20 62 75 74 20 6e 65 65 64 20 74 68 set, but need th
5a20: 65 20 70 73 65 75 64 6f 2d 64 65 70 65 6e 64 65 e pseudo-depende
5a30: 6e 63 69 65 73 20 66 6f 72 20 74 68 69 73 2e 0a ncies for this..
5a40: 0a 09 61 72 72 61 79 20 73 65 74 20 66 69 64 73 ..array set fids
5a50: 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 {}..foreach {ri
5a60: 64 20 66 69 64 7d 20 5b 73 74 61 74 65 20 72 75 d fid} [state ru
5a70: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 n ".. SELECT
5a80: 52 2e 72 69 64 2c 20 52 2e 66 69 64 20 46 52 4f R.rid, R.fid FRO
5a90: 4d 20 72 65 76 69 73 69 6f 6e 20 52 20 57 48 45 M revision R WHE
5aa0: 52 45 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 RE R.rid IN $the
5ab0: 73 65 74 0a 09 22 5d 20 7b 20 6c 61 70 70 65 6e set.."] { lappen
5ac0: 64 20 66 69 64 73 28 24 66 69 64 29 20 24 72 69 d fids($fid) $ri
5ad0: 64 20 7d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 66 d }...foreach {f
5ae0: 69 64 20 72 69 64 73 7d 20 5b 61 72 72 61 79 20 id rids} [array
5af0: 67 65 74 20 66 69 64 73 5d 20 7b 0a 09 20 20 20 get fids] {..
5b00: 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 72 if {[llength $r
5b10: 69 64 73 5d 20 3c 20 32 7d 20 63 6f 6e 74 69 6e ids] < 2} contin
5b20: 75 65 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 ue.. foreach
5b30: 61 20 24 72 69 64 73 20 7b 0a 09 09 66 6f 72 65 a $rids {...fore
5b40: 61 63 68 20 62 20 24 72 69 64 73 20 7b 0a 09 09 ach b $rids {...
5b50: 20 20 20 20 69 66 20 7b 24 61 20 3d 3d 20 24 62 if {$a == $b
5b60: 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 09 20 20 20 } continue...
5b70: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 if {[info exist
5b80: 73 20 64 65 70 28 24 61 2c 24 62 29 5d 7d 20 63 s dep($a,$b)]} c
5b90: 6f 6e 74 69 6e 75 65 0a 09 09 20 20 20 20 69 66 ontinue... if
5ba0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64 {[info exists d
5bb0: 65 70 28 24 62 2c 24 61 29 5d 7d 20 63 6f 6e 74 ep($b,$a)]} cont
5bc0: 69 6e 75 65 0a 09 09 20 20 20 20 6c 61 70 70 65 inue... lappe
5bd0: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 nd dependencies(
5be0: 24 61 29 20 24 62 0a 09 09 20 20 20 20 73 65 74 $a) $b... set
5bf0: 20 64 65 70 28 24 61 2c 24 62 29 20 2e 0a 09 09 dep($a,$b) ....
5c00: 20 20 20 20 73 65 74 20 64 65 70 28 24 62 2c 24 set dep($b,$
5c10: 61 29 20 2e 0a 09 09 7d 0a 09 20 20 20 20 7d 0a a) ....}.. }.
5c20: 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d .}..return. }
5c30: 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76 29 20 .. # var(dv)
5c40: 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 = dict (item ->
5c50: 6c 69 73 74 20 28 69 74 65 6d 29 29 2c 20 69 74 list (item)), it
5c60: 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 79 70 65 em = list (type
5c70: 20 69 64 29 0a 20 20 20 20 74 79 70 65 6d 65 74 id). typemet
5c80: 68 6f 64 20 73 75 63 63 65 73 73 6f 72 73 20 7b hod successors {
5c90: 64 76 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a dv revisions} {.
5ca0: 09 75 70 76 61 72 20 31 20 24 64 76 20 64 65 70 .upvar 1 $dv dep
5cb0: 65 6e 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74 endencies..set t
5cc0: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 heset ('[join $r
5cd0: 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 evisions {','}]'
5ce0: 29 0a 0a 09 23 20 54 68 65 20 66 6f 6c 6c 6f 77 )...# The follow
5cf0: 69 6e 67 20 63 61 73 65 73 20 73 70 65 63 69 66 ing cases specif
5d00: 79 20 77 68 65 6e 20 61 20 72 65 76 69 73 69 6f y when a revisio
5d10: 6e 20 53 20 69 73 20 61 20 73 75 63 63 65 73 73 n S is a success
5d20: 6f 72 0a 09 23 20 6f 66 20 61 20 72 65 76 69 73 or..# of a revis
5d30: 69 6f 6e 20 52 2e 20 45 61 63 68 20 6f 66 20 74 ion R. Each of t
5d40: 68 65 20 63 61 73 65 73 20 74 72 61 6e 73 6c 61 he cases transla
5d50: 74 65 73 20 69 6e 74 6f 20 6f 6e 65 20 6f 66 0a tes into one of.
5d60: 09 23 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 .# the branches
5d70: 6f 66 20 74 68 65 20 53 51 4c 20 55 4e 49 4f 4e of the SQL UNION
5d80: 20 63 6f 6d 69 6e 67 20 62 65 6c 6f 77 2e 0a 09 coming below...
5d90: 23 0a 09 23 20 28 31 29 20 53 20 63 61 6e 20 62 #..# (1) S can b
5da0: 65 20 61 20 70 72 69 6d 61 72 79 20 63 68 69 6c e a primary chil
5db0: 64 20 6f 66 20 52 2c 20 69 2e 65 2e 20 69 6e 20 d of R, i.e. in
5dc0: 74 68 65 20 73 61 6d 65 20 4c 4f 44 2e 20 52 0a the same LOD. R.
5dd0: 09 23 20 20 20 20 20 72 65 66 65 72 65 6e 63 65 .# reference
5de0: 73 20 53 20 64 69 72 65 63 74 6c 79 2e 20 52 2e s S directly. R.
5df0: 63 68 69 6c 64 20 3d 20 53 28 2e 72 69 64 29 2c child = S(.rid),
5e00: 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a 09 if it exists...
5e10: 23 0a 09 23 20 28 32 29 20 53 20 63 61 6e 20 62 #..# (2) S can b
5e20: 65 20 61 20 73 65 63 6f 6e 64 61 72 79 2c 20 69 e a secondary, i
5e30: 2e 65 2e 20 62 72 61 6e 63 68 2c 20 63 68 69 6c .e. branch, chil
5e40: 64 20 6f 66 20 52 2e 20 48 65 72 65 20 74 68 65 d of R. Here the
5e50: 0a 09 23 20 20 20 20 20 6c 69 6e 6b 20 69 73 20 ..# link is
5e60: 6d 61 64 65 20 74 68 72 6f 75 67 68 20 74 68 65 made through the
5e70: 20 68 65 6c 70 65 72 20 74 61 62 6c 65 0a 09 23 helper table..#
5e80: 20 20 20 20 20 52 45 56 49 53 49 4f 4e 42 52 41 REVISIONBRA
5e90: 4e 43 48 43 48 49 4c 44 52 45 4e 2e 20 52 2e 72 NCHCHILDREN. R.r
5ea0: 69 64 20 2d 3e 20 52 42 43 2e 72 69 64 2c 20 52 id -> RBC.rid, R
5eb0: 42 43 2e 62 72 69 64 20 3d 0a 09 23 20 20 20 20 BC.brid =..#
5ec0: 20 53 28 2e 72 69 64 29 0a 09 23 0a 09 23 20 28 S(.rid)..#..# (
5ed0: 33 29 20 4f 72 69 67 69 6e 61 6c 6c 79 20 74 68 3) Originally th
5ee0: 69 73 20 75 73 65 20 63 61 73 65 20 64 65 66 69 is use case defi
5ef0: 6e 65 64 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 ned the root of
5f00: 61 20 64 65 74 61 63 68 65 64 0a 09 23 20 20 20 a detached..#
5f10: 20 20 4e 54 44 42 20 61 73 20 74 68 65 20 73 75 NTDB as the su
5f20: 63 63 65 73 73 6f 72 20 6f 66 20 74 68 65 20 74 ccessor of the t
5f30: 72 75 6e 6b 20 72 6f 6f 74 2e 20 54 68 69 73 20 runk root. This
5f40: 6c 65 61 64 73 20 74 6f 20 61 0a 09 23 20 20 20 leads to a..#
5f50: 20 20 62 61 64 20 74 61 6e 67 6c 65 20 6c 61 74 bad tangle lat
5f60: 65 72 20 6f 6e 2e 20 57 69 74 68 20 61 20 64 65 er on. With a de
5f70: 74 61 63 68 65 64 20 4e 54 44 42 20 74 68 65 20 tached NTDB the
5f80: 6f 72 69 67 69 6e 61 6c 0a 09 23 20 20 20 20 20 original..#
5f90: 74 72 75 6e 6b 20 72 6f 6f 74 20 72 65 76 69 73 trunk root revis
5fa0: 69 6f 6e 20 77 61 73 20 72 65 6d 6f 76 65 64 20 ion was removed
5fb0: 61 73 20 69 72 72 65 6c 65 76 61 6e 74 2c 20 61 as irrelevant, a
5fc0: 6c 6c 6f 77 69 6e 67 0a 09 23 20 20 20 20 20 74 llowing..# t
5fd0: 68 65 20 6e 6f 6d 69 6e 61 6c 20 72 6f 6f 74 20 he nominal root
5fe0: 74 6f 20 62 65 20 6c 61 74 65 72 20 69 6e 20 74 to be later in t
5ff0: 69 6d 65 20 74 68 61 6e 20 74 68 65 20 4e 54 44 ime than the NTD
6000: 42 0a 09 23 20 20 20 20 20 72 6f 6f 74 2e 20 4e B..# root. N
6010: 6f 77 20 73 65 74 74 69 6e 67 20 74 68 69 73 20 ow setting this
6020: 64 65 70 65 6e 64 65 6e 63 79 20 77 69 6c 6c 20 dependency will
6030: 62 65 20 62 61 63 6b 77 61 72 64 20 69 6e 0a 09 be backward in..
6040: 23 20 20 20 20 20 74 69 6d 65 2e 20 52 45 4d 4f # time. REMO
6050: 56 45 44 2e 0a 09 23 0a 09 23 20 28 34 29 20 49 VED...#..# (4) I
6060: 66 20 52 20 69 73 20 74 68 65 20 6c 61 73 74 20 f R is the last
6070: 6f 66 20 74 68 65 20 4e 54 44 42 20 72 65 76 69 of the NTDB revi
6080: 73 69 6f 6e 73 20 77 68 69 63 68 20 62 65 6c 6f sions which belo
6090: 6e 67 20 74 6f 0a 09 23 20 20 20 20 20 74 68 65 ng to..# the
60a0: 20 74 72 75 6e 6b 2c 20 74 68 65 6e 20 74 68 65 trunk, then the
60b0: 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 20 6f primary child o
60c0: 66 20 74 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74 f the trunk root
60d0: 20 28 74 68 65 0a 09 23 20 20 20 20 20 27 31 2e (the..# '1.
60e0: 32 27 20 72 65 76 69 73 69 6f 6e 29 20 69 73 20 2' revision) is
60f0: 61 20 73 75 63 63 65 73 73 6f 72 2c 20 69 66 20 a successor, if
6100: 69 74 20 65 78 69 73 74 73 2e 0a 0a 09 23 20 4e it exists....# N
6110: 6f 74 65 20 74 68 61 74 20 74 68 65 20 62 72 61 ote that the bra
6120: 6e 63 68 65 73 20 73 70 61 77 6e 65 64 20 66 72 nches spawned fr
6130: 6f 6d 20 74 68 65 20 72 65 76 69 73 69 6f 6e 73 om the revisions
6140: 2c 20 61 6e 64 20 74 68 65 0a 09 23 20 74 61 67 , and the..# tag
6150: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 s associated wit
6160: 68 20 74 68 65 6d 20 61 72 65 20 73 75 63 63 65 h them are succe
6170: 73 73 6f 72 73 20 61 73 20 77 65 6c 6c 2e 0a 0a ssors as well...
6180: 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68 .foreach {rid ch
6190: 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 ild} [state run
61a0: 22 0a 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d ". -- (1) Prim
61b0: 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20 53 ary child.. S
61c0: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63 ELECT R.rid, R.c
61d0: 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 hild.. FROM
61e0: 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 revision R..
61f0: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 WHERE R.rid
6200: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d IN $theset -
6210: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 - Restrict to re
6220: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 visions of inter
6230: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 est.. AND
6240: 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e R.child IS NOT N
6250: 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 ULL -- Has pr
6260: 69 6d 61 72 79 20 63 68 69 6c 64 0a 20 20 20 20 imary child.
6270: 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32 29 UNION. -- (2)
6280: 20 53 65 63 6f 6e 64 61 72 79 20 28 62 72 61 6e Secondary (bran
6290: 63 68 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 ch) children..
62a0: 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 SELECT R.rid,
62b0: 42 2e 62 72 69 64 0a 09 20 20 20 20 46 52 4f 4d B.brid.. FROM
62c0: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 revision R, r
62d0: 65 76 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 69 evisionbranchchi
62e0: 6c 64 72 65 6e 20 42 0a 09 20 20 20 20 57 48 45 ldren B.. WHE
62f0: 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 RE R.rid IN $
6300: 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65 theset -- Re
6310: 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 strict to revisi
6320: 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a ons of interest.
6330: 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72 69 . AND R.ri
6340: 64 20 3d 20 42 2e 72 69 64 20 20 20 20 20 20 20 d = B.rid
6350: 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 73 75 62 -- Select sub
6360: 73 65 74 20 6f 66 20 62 72 61 6e 63 68 20 63 68 set of branch ch
6370: 69 6c 64 72 65 6e 0a 20 20 20 20 55 4e 49 4f 4e ildren. UNION
6380: 0a 20 20 20 20 2d 2d 20 28 34 29 20 43 68 69 6c . -- (4) Chil
6390: 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 20 d of trunk root
63a0: 73 75 63 63 65 73 73 6f 72 20 6f 66 20 6c 61 73 successor of las
63b0: 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b 2e t NTDB on trunk.
63c0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 .. SELECT R.r
63d0: 69 64 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20 20 id, RA.child..
63e0: 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 FROM revision
63f0: 52 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 0a 09 R, revision RA..
6400: 20 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 WHERE R.rid
6410: 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 IN $theset
6420: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f -- Restrict to
6430: 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e revisions of in
6440: 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 terest.. AND
6450: 20 20 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20 R.isdefault
6460: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 -- Res
6470: 74 72 69 63 74 20 74 6f 20 4e 54 44 42 0a 09 20 trict to NTDB..
6480: 20 20 20 41 4e 44 20 20 20 52 2e 64 62 63 68 69 AND R.dbchi
6490: 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 ld IS NOT NULL
64a0: 20 2d 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 -- and last NTD
64b0: 42 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 B belonging to t
64c0: 72 75 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 runk.. AND
64d0: 52 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69 RA.rid = R.dbchi
64e0: 6c 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 ld -- Go di
64f0: 72 65 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 rectly to trunk
6500: 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 root.. AND
6510: 52 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 RA.child IS NOT
6520: 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 NULL -- Has p
6530: 72 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 09 22 rimary child..."
6540: 5d 20 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 69 ] {.. # Consi
6550: 64 65 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 20 der moving this
6560: 74 6f 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 to the integrity
6570: 20 6d 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 6e module... in
6580: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b tegrity assert {
6590: 24 72 69 64 20 21 3d 20 24 63 68 69 6c 64 7d 20 $rid != $child}
65a0: 7b 52 65 76 69 73 69 6f 6e 20 24 72 69 64 20 64 {Revision $rid d
65b0: 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 epends on itself
65c0: 2e 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 .}.. lappend
65d0: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 dependencies([li
65e0: 73 74 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c st rev $rid]) [l
65f0: 69 73 74 20 72 65 76 20 24 63 68 69 6c 64 5d 0a ist rev $child].
6600: 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 .}..foreach {rid
6610: 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 child} [state r
6620: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 un ".. SELECT
6630: 20 52 2e 72 69 64 2c 20 54 2e 74 69 64 0a 09 20 R.rid, T.tid..
6640: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 FROM revisi
6650: 6f 6e 20 52 2c 20 74 61 67 20 54 0a 09 20 20 20 on R, tag T..
6660: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 69 6e WHERE R.rid in
6670: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e $theset.. AN
6680: 44 20 20 20 20 54 2e 72 65 76 20 3d 20 52 2e 72 D T.rev = R.r
6690: 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 id.."] {.. la
66a0: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 ppend dependenci
66b0: 65 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 es([list rev $ri
66c0: 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 d]) [list sym::t
66d0: 61 67 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 ag $child]..}..f
66e0: 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c oreach {rid chil
66f0: 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a d} [state run ".
6700: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 . SELECT R.ri
6710: 64 2c 20 42 2e 62 69 64 0a 09 20 20 20 20 46 52 d, B.bid.. FR
6720: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c OM revision R,
6730: 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20 20 57 branch B.. W
6740: 48 45 52 45 20 20 52 2e 72 69 64 20 69 6e 20 24 HERE R.rid in $
6750: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 theset.. AND
6760: 20 20 20 42 2e 72 6f 6f 74 20 3d 20 52 2e 72 69 B.root = R.ri
6770: 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 d.."] {.. lap
6780: 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 pend dependencie
6790: 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64 s([list rev $rid
67a0: 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 ]) [list sym::br
67b0: 61 6e 63 68 20 24 63 68 69 6c 64 5d 0a 09 7d 0a anch $child]..}.
67c0: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 .return. }..
67d0: 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 # var(dv) = d
67e0: 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 ict (item -> lis
67f0: 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 t (item)), item
6800: 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69 64 = list (type id
6810: 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 ). typemethod
6820: 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 7b 64 predecessors {d
6830: 76 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 v revisions} {..
6840: 75 70 76 61 72 20 31 20 24 64 76 20 64 65 70 65 upvar 1 $dv depe
6850: 6e 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74 68 ndencies..set th
6860: 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 eset ('[join $re
6870: 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 visions {','}]')
6880: 0a 0a 09 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 ...# The followi
6890: 6e 67 20 63 61 73 65 73 20 73 70 65 63 69 66 79 ng cases specify
68a0: 20 77 68 65 6e 20 61 20 72 65 76 69 73 69 6f 6e when a revision
68b0: 20 50 20 69 73 20 61 0a 09 23 20 70 72 65 64 65 P is a..# prede
68c0: 63 65 73 73 6f 72 20 6f 66 20 61 20 72 65 76 69 cessor of a revi
68d0: 73 69 6f 6e 20 52 2e 20 45 61 63 68 20 6f 66 20 sion R. Each of
68e0: 74 68 65 20 63 61 73 65 73 20 74 72 61 6e 73 6c the cases transl
68f0: 61 74 65 73 0a 09 23 20 69 6e 74 6f 20 6f 6e 65 ates..# into one
6900: 20 6f 66 20 74 68 65 20 62 72 61 6e 63 68 65 73 of the branches
6910: 20 6f 66 20 74 68 65 20 53 51 4c 20 55 4e 49 4f of the SQL UNIO
6920: 4e 20 63 6f 6d 69 6e 67 20 62 65 6c 6f 77 2e 0a N coming below..
6930: 09 23 0a 09 23 20 28 31 29 20 54 68 65 20 69 6d .#..# (1) The im
6940: 6d 65 64 69 61 74 65 20 70 61 72 65 6e 74 20 52 mediate parent R
6950: 2e 70 61 72 65 6e 74 20 6f 66 20 52 20 69 73 20 .parent of R is
6960: 61 20 70 72 65 64 65 63 65 73 73 6f 72 20 6f 66 a predecessor of
6970: 0a 09 23 20 20 20 20 20 52 2e 20 4e 4f 54 45 3a ..# R. NOTE:
6980: 20 54 68 69 73 20 69 73 20 74 72 75 65 20 66 6f This is true fo
6990: 72 20 52 20 65 69 74 68 65 72 20 70 72 69 6d 61 r R either prima
69a0: 72 79 20 6f 72 20 73 65 63 6f 6e 64 61 72 79 0a ry or secondary.
69b0: 09 23 20 20 20 20 20 63 68 69 6c 64 20 6f 66 20 .# child of
69c0: 50 2e 20 49 74 20 6e 6f 74 20 6e 65 63 65 73 73 P. It not necess
69d0: 61 72 79 20 74 6f 20 64 69 73 74 69 6e 67 75 69 ary to distingui
69e0: 73 68 20 74 68 65 20 74 77 6f 0a 09 23 20 20 20 sh the two..#
69f0: 20 20 63 61 73 65 73 2c 20 69 6e 20 63 6f 6e 74 cases, in cont
6a00: 72 61 73 74 20 74 6f 20 74 68 65 20 63 6f 64 65 rast to the code
6a10: 20 72 65 74 72 69 65 76 69 6e 67 20 74 68 65 20 retrieving the
6a20: 73 75 63 63 65 73 73 6f 72 0a 09 23 20 20 20 20 successor..#
6a30: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 09 23 information...#
6a40: 0a 09 23 20 28 32 29 20 54 68 65 20 63 6f 6d 70 ..# (2) The comp
6a50: 6c 65 6d 65 6e 74 20 6f 66 20 73 75 63 63 65 73 lement of succes
6a60: 73 6f 72 20 63 61 73 65 20 28 33 29 2e 20 54 68 sor case (3). Th
6a70: 65 20 74 72 75 6e 6b 20 72 6f 6f 74 20 69 73 0a e trunk root is.
6a80: 09 23 20 20 20 20 20 61 20 70 72 65 64 65 63 65 .# a predece
6a90: 73 73 6f 72 20 6f 66 20 61 20 4e 54 44 42 20 72 ssor of a NTDB r
6aa0: 6f 6f 74 2e 20 52 45 4d 4f 56 45 44 2e 20 53 65 oot. REMOVED. Se
6ab0: 65 20 27 73 75 63 63 65 73 73 6f 72 73 27 0a 09 e 'successors'..
6ac0: 23 20 20 20 20 20 66 6f 72 20 74 68 65 20 65 78 # for the ex
6ad0: 70 6c 61 6e 61 74 69 6f 6e 2e 0a 09 23 0a 09 23 planation...#..#
6ae0: 20 28 33 29 20 54 68 65 20 63 6f 6d 70 6c 65 6d (3) The complem
6af0: 65 6e 74 20 6f 66 20 73 75 63 63 65 73 73 6f 72 ent of successor
6b00: 20 63 61 73 65 20 28 34 29 2e 20 54 68 65 20 6c case (4). The l
6b10: 61 73 74 20 4e 54 44 42 0a 09 23 20 20 20 20 20 ast NTDB..#
6b20: 72 65 76 69 73 69 6f 6e 20 62 65 6c 6f 6e 67 69 revision belongi
6b30: 6e 67 20 74 6f 20 74 68 65 20 74 72 75 6e 6b 20 ng to the trunk
6b40: 69 73 20 61 20 70 72 65 64 65 63 65 73 73 6f 72 is a predecessor
6b50: 20 6f 66 20 74 68 65 0a 09 23 20 20 20 20 20 70 of the..# p
6b60: 72 69 6d 61 72 79 20 63 68 69 6c 64 20 6f 66 20 rimary child of
6b70: 74 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74 20 28 the trunk root (
6b80: 54 68 65 20 27 31 2e 32 27 20 72 65 76 69 73 69 The '1.2' revisi
6b90: 6f 6e 29 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b on)....foreach {
6ba0: 72 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 rid parent} [sta
6bb0: 74 65 20 72 75 6e 20 22 0a 20 20 20 2d 2d 20 28 te run ". -- (
6bc0: 31 29 20 50 72 69 6d 61 72 79 20 70 61 72 65 6e 1) Primary paren
6bd0: 74 2c 20 63 61 6e 20 62 65 20 69 6e 20 64 69 66 t, can be in dif
6be0: 66 65 72 65 6e 74 20 4c 4f 44 20 66 6f 72 20 66 ferent LOD for f
6bf0: 69 72 73 74 20 69 6e 20 61 20 62 72 61 6e 63 68 irst in a branch
6c00: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 .. SELECT R.r
6c10: 69 64 2c 20 52 2e 70 61 72 65 6e 74 0a 09 20 20 id, R.parent..
6c20: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f FROM revisio
6c30: 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 n R.. WHERE
6c40: 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 R.rid IN $thes
6c50: 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 et -- Restri
6c60: 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 ct to revisions
6c70: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 of interest..
6c80: 20 41 4e 44 20 20 20 20 52 2e 70 61 72 65 6e 74 AND R.parent
6c90: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d IS NOT NULL -
6ca0: 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 70 61 - Has primary pa
6cb0: 72 65 6e 74 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 rent. UNION.
6cc0: 20 20 20 2d 2d 20 28 33 29 20 4c 61 73 74 20 4e -- (3) Last N
6cd0: 54 44 42 20 6f 6e 20 74 72 75 6e 6b 20 69 73 20 TDB on trunk is
6ce0: 70 72 65 64 65 63 65 73 73 6f 72 20 6f 66 20 63 predecessor of c
6cf0: 68 69 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f hild of trunk ro
6d00: 6f 74 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 ot.. SELECT R
6d10: 2e 72 69 64 2c 20 52 41 2e 64 62 70 61 72 65 6e .rid, RA.dbparen
6d20: 74 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 t.. FROM re
6d30: 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 vision R, revisi
6d40: 6f 6e 20 52 41 0a 09 20 20 20 20 57 48 45 52 45 on RA.. WHERE
6d50: 20 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 R.rid IN $thes
6d60: 65 74 20 20 20 20 20 20 20 20 20 2d 2d 20 52 65 et -- Re
6d70: 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 strict to revisi
6d80: 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a ons of interest.
6d90: 09 20 20 20 20 41 4e 44 20 20 20 20 4e 4f 54 20 . AND NOT
6da0: 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20 20 R.isdefault
6db0: 20 20 20 20 20 2d 2d 20 6e 6f 74 20 6f 6e 20 4e -- not on N
6dc0: 54 44 42 0a 09 20 20 20 20 41 4e 44 20 20 20 20 TDB.. AND
6dd0: 52 2e 70 61 72 65 6e 74 20 49 53 20 4e 4f 54 20 R.parent IS NOT
6de0: 4e 55 4c 4c 20 20 20 20 20 2d 2d 20 77 68 69 63 NULL -- whic
6df0: 68 20 61 72 65 20 6e 6f 74 20 72 6f 6f 74 0a 09 h are not root..
6e00: 20 20 20 20 41 4e 44 20 20 20 20 52 41 2e 72 69 AND RA.ri
6e10: 64 20 3d 20 52 2e 70 61 72 65 6e 74 20 20 20 20 d = R.parent
6e20: 20 20 20 20 2d 2d 20 67 6f 20 74 6f 20 74 68 65 -- go to the
6e30: 69 72 20 70 61 72 65 6e 74 0a 09 20 20 20 20 41 ir parent.. A
6e40: 4e 44 20 20 20 20 52 41 2e 64 62 70 61 72 65 6e ND RA.dbparen
6e50: 74 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 2d t IS NOT NULL -
6e60: 2d 20 77 68 69 63 68 20 68 61 73 20 74 6f 20 72 - which has to r
6e70: 65 66 65 72 20 74 6f 20 4e 54 44 42 27 73 20 72 efer to NTDB's r
6e80: 6f 6f 74 0a 09 22 5d 20 7b 0a 09 20 20 20 20 23 oot.."] {.. #
6e90: 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69 6e 67 Consider moving
6ea0: 20 74 68 69 73 20 74 6f 20 74 68 65 20 69 6e 74 this to the int
6eb0: 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e 0a 09 egrity module...
6ec0: 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 integrity as
6ed0: 73 65 72 74 20 7b 24 72 69 64 20 21 3d 20 24 70 sert {$rid != $p
6ee0: 61 72 65 6e 74 7d 20 7b 52 65 76 69 73 69 6f 6e arent} {Revision
6ef0: 20 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f 6e $rid depends on
6f00: 20 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20 6c itself.}.. l
6f10: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 append dependenc
6f20: 69 65 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72 ies([list rev $r
6f30: 69 64 5d 29 20 5b 6c 69 73 74 20 72 65 76 20 24 id]) [list rev $
6f40: 70 61 72 65 6e 74 5d 0a 09 7d 0a 0a 09 23 20 54 parent]..}...# T
6f50: 68 65 20 72 65 76 69 73 69 6f 6e 73 20 77 68 69 he revisions whi
6f60: 63 68 20 61 72 65 20 74 68 65 20 66 69 72 73 74 ch are the first
6f70: 20 6f 6e 20 61 20 62 72 61 6e 63 68 20 68 61 76 on a branch hav
6f80: 65 20 74 68 61 74 0a 09 23 20 62 72 61 6e 63 68 e that..# branch
6f90: 20 61 73 20 74 68 65 69 72 20 70 72 65 64 65 63 as their predec
6fa0: 65 73 73 6f 72 2e 20 4e 6f 74 65 20 74 68 61 74 essor. Note that
6fb0: 20 72 65 76 69 73 69 6f 6e 73 20 63 61 6e 6e 6f revisions canno
6fc0: 74 20 62 65 0a 09 23 20 6f 6e 20 74 61 67 73 20 t be..# on tags
6fd0: 69 6e 20 74 68 65 20 73 61 6d 65 20 6d 61 6e 6e in the same mann
6fe0: 65 72 2c 20 73 6f 20 74 61 67 73 20 63 61 6e 6e er, so tags cann
6ff0: 6f 74 20 62 65 20 70 72 65 64 65 63 65 73 73 6f ot be predecesso
7000: 72 73 0a 09 23 20 6f 66 20 72 65 76 69 73 69 6f rs..# of revisio
7010: 6e 73 2e 20 54 68 69 73 20 63 6f 6d 70 6c 65 6d ns. This complem
7020: 65 6e 74 73 20 74 68 61 74 20 74 68 65 79 20 68 ents that they h
7030: 61 76 65 20 6e 6f 20 73 75 63 63 65 73 73 6f 72 ave no successor
7040: 73 0a 09 23 20 28 53 65 65 20 73 79 6d 3a 3a 74 s..# (See sym::t
7050: 61 67 2f 73 75 63 63 65 73 73 6f 72 73 29 2e 0a ag/successors)..
7060: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 70 ..foreach {rid p
7070: 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 arent} [state ru
7080: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 n ".. SELECT
7090: 52 2e 72 69 64 20 42 2e 62 69 64 0a 09 20 20 20 R.rid B.bid..
70a0: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e FROM revision
70b0: 20 52 2c 20 62 72 61 6e 63 68 20 42 0a 09 20 20 R, branch B..
70c0: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 49 WHERE R.rid I
70d0: 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 N $theset.. A
70e0: 4e 44 20 20 20 20 42 2e 66 69 72 73 74 20 3d 20 ND B.first =
70f0: 52 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 R.rid.."] {..
7100: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 lappend depende
7110: 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 65 76 20 ncies([list rev
7120: 24 72 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d $rid]) [list sym
7130: 3a 3a 62 72 61 6e 63 68 20 24 70 61 72 65 6e 74 ::branch $parent
7140: 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 ]..}..return.
7150: 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 }.}..# # ## ###
7160: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 ##### ########
7170: 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23 ############# ##
7180: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
7190: 23 23 23 0a 23 23 20 48 65 6c 70 65 72 20 73 69 ###.## Helper si
71a0: 6e 67 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 ngleton. Command
71b0: 73 20 66 6f 72 20 74 61 67 20 73 79 6d 62 6f 6c s for tag symbol
71c0: 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e changesets...sn
71d0: 69 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 it::type ::vc::f
71e0: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 ossil::import::c
71f0: 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 vs::project::rev
7200: 3a 3a 73 79 6d 3a 3a 74 61 67 20 7b 0a 20 20 20 ::sym::tag {.
7210: 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 72 65 typemethod byre
7220: 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75 vision {} { retu
7230: 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d rn 0 }. typem
7240: 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 ethod bysymbol
7250: 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d {} { return 1 }
7260: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 . typemethod
7270: 69 73 74 61 67 20 20 20 20 20 20 7b 7d 20 7b 20 istag {} {
7280: 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 return 1 }. t
7290: 79 70 65 6d 65 74 68 6f 64 20 69 73 62 72 61 6e ypemethod isbran
72a0: 63 68 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e ch {} { return
72b0: 20 30 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 0 }.. # resu
72c0: 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69 6e 74 69 lt = list (minti
72d0: 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a 20 20 20 me, maxtime).
72e0: 20 74 79 70 65 6d 65 74 68 6f 64 20 74 69 6d 65 typemethod time
72f0: 72 61 6e 67 65 20 7b 74 61 67 73 7d 20 7b 0a 20 range {tags} {.
7300: 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 }.. # var(
7310: 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d dv) = dict (item
7320: 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29 -> list (item))
7330: 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 , item = list (
7340: 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 70 type id). typ
7350: 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f emethod successo
7360: 72 73 20 7b 64 76 20 74 61 67 73 7d 20 7b 0a 20 rs {dv tags} {.
7370: 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 }.. # var(
7380: 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d dv) = dict (item
7390: 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29 -> list (item))
73a0: 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 , item = list (
73b0: 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 70 type id). typ
73c0: 65 6d 65 74 68 6f 64 20 70 72 65 64 65 63 65 73 emethod predeces
73d0: 73 6f 72 73 20 7b 64 76 20 74 61 67 73 7d 20 7b sors {dv tags} {
73e0: 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 . }.}..# # ##
73f0: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 ### ##### #####
7400: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 ### ############
7410: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 # ##############
7420: 23 23 23 23 23 23 23 0a 23 23 20 48 65 6c 70 65 #######.## Helpe
7430: 72 20 73 69 6e 67 6c 65 74 6f 6e 2e 20 43 6f 6d r singleton. Com
7440: 6d 61 6e 64 73 20 66 6f 72 20 62 72 61 6e 63 68 mands for branch
7450: 20 73 79 6d 62 6f 6c 20 63 68 61 6e 67 65 73 65 symbol changese
7460: 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20 ts...snit::type
7470: 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d ::vc::fossil::im
7480: 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 port::cvs::proje
7490: 63 74 3a 3a 72 65 76 3a 3a 73 79 6d 3a 3a 62 72 ct::rev::sym::br
74a0: 61 6e 63 68 20 7b 0a 20 20 20 20 74 79 70 65 6d anch {. typem
74b0: 65 74 68 6f 64 20 62 79 72 65 76 69 73 69 6f 6e ethod byrevision
74c0: 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d {} { return 0 }
74d0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 . typemethod
74e0: 62 79 73 79 6d 62 6f 6c 20 20 20 7b 7d 20 7b 20 bysymbol {} {
74f0: 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 return 1 }. t
7500: 79 70 65 6d 65 74 68 6f 64 20 69 73 74 61 67 20 ypemethod istag
7510: 20 20 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e {} { return
7520: 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 0 }. typemet
7530: 68 6f 64 20 69 73 62 72 61 6e 63 68 20 20 20 7b hod isbranch {
7540: 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a 0a } { return 1 }..
7550: 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c # result = l
7560: 69 73 74 20 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 ist (mintime, ma
7570: 78 74 69 6d 65 29 0a 20 20 20 20 74 79 70 65 6d xtime). typem
7580: 65 74 68 6f 64 20 74 69 6d 65 72 61 6e 67 65 20 ethod timerange
7590: 7b 62 72 61 6e 63 68 65 73 7d 20 7b 0a 20 20 20 {branches} {.
75a0: 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76 }.. # var(dv
75b0: 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d ) = dict (item -
75c0: 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c 20 > list (item)),
75d0: 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 79 item = list (ty
75e0: 70 65 20 69 64 29 0a 20 20 20 20 74 79 70 65 6d pe id). typem
75f0: 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f 72 73 ethod successors
7600: 20 7b 64 76 20 62 72 61 6e 63 68 65 73 7d 20 7b {dv branches} {
7610: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 . }.. # va
7620: 72 28 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 r(dv) = dict (it
7630: 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d em -> list (item
7640: 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 )), item = list
7650: 20 28 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 (type id). t
7660: 79 70 65 6d 65 74 68 6f 64 20 70 72 65 64 65 63 ypemethod predec
7670: 65 73 73 6f 72 73 20 7b 64 76 20 62 72 61 6e 63 essors {dv branc
7680: 68 65 73 7d 20 7b 0a 20 20 20 20 7d 0a 0a 20 20 hes} {. }..
7690: 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 # # ## ### ###
76a0: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 ## ######## ####
76b0: 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 #########. ##
76c0: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a Configuration..
76d0: 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 69 pragma -hasi
76e0: 6e 73 74 61 6e 63 65 73 20 20 20 6e 6f 20 3b 20 nstances no ;
76f0: 23 20 73 69 6e 67 6c 65 74 6f 6e 0a 20 20 20 20 # singleton.
7700: 70 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65 69 pragma -hastypei
7710: 6e 66 6f 20 20 20 20 6e 6f 20 3b 20 23 20 6e 6f nfo no ; # no
7720: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20 introspection.
7730: 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79 pragma -hasty
7740: 70 65 64 65 73 74 72 6f 79 20 6e 6f 20 3b 20 23 pedestroy no ; #
7750: 20 69 6d 6d 6f 72 74 61 6c 0a 7d 0a 0a 23 20 23 immortal.}..# #
7760: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 ## ### ##### ##
7770: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 ###### #########
7780: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 #### ###########
7790: 23 23 23 23 23 23 23 23 23 23 0a 23 23 0a 0a 6e ##########.##..n
77a0: 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a amespace eval ::
77b0: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f vc::fossil::impo
77c0: 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 rt::cvs::project
77d0: 20 7b 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65 {. namespace
77e0: 20 65 78 70 6f 72 74 20 72 65 76 0a 20 20 20 20 export rev.
77f0: 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 72 namespace eval r
7800: 65 76 20 7b 0a 09 6e 61 6d 65 73 70 61 63 65 20 ev {..namespace
7810: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 import ::vc::fos
7820: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 sil::import::cvs
7830: 3a 3a 73 74 61 74 65 0a 09 6e 61 6d 65 73 70 61 ::state..namespa
7840: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a ce import ::vc::
7850: 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a fossil::import::
7860: 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 cvs::integrity..
7870: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 namespace import
7880: 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69 ::vc::tools::mi
7890: 73 63 3a 3a 2a 0a 09 6e 61 6d 65 73 70 61 63 65 sc::*..namespace
78a0: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f import ::vc::to
78b0: 6f 6c 73 3a 3a 74 72 6f 75 62 6c 65 0a 09 6e 61 ols::trouble..na
78c0: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a mespace import :
78d0: 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a :vc::tools::log.
78e0: 09 6c 6f 67 20 72 65 67 69 73 74 65 72 20 63 73 .log register cs
78f0: 65 74 73 0a 0a 09 23 20 53 65 74 20 75 70 20 74 ets...# Set up t
7900: 68 65 20 68 65 6c 70 65 72 20 73 69 6e 67 6c 65 he helper single
7910: 74 6f 6e 73 0a 09 6e 61 6d 65 73 70 61 63 65 20 tons..namespace
7920: 65 76 61 6c 20 72 65 76 20 7b 0a 09 20 20 20 20 eval rev {..
7930: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 namespace import
7940: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 ::vc::fossil::i
7950: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 mport::cvs::stat
7960: 65 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 e.. namespace
7970: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f import ::vc::fo
7980: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 ssil::import::cv
7990: 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a s::integrity..}.
79a0: 09 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 .namespace eval
79b0: 73 79 6d 3a 3a 74 61 67 20 7b 0a 09 20 20 20 20 sym::tag {..
79c0: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 namespace import
79d0: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 ::vc::fossil::i
79e0: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 mport::cvs::stat
79f0: 65 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 e.. namespace
7a00: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f import ::vc::fo
7a10: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 ssil::import::cv
7a20: 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a s::integrity..}.
7a30: 09 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 .namespace eval
7a40: 73 79 6d 3a 3a 62 72 61 6e 63 68 20 7b 0a 09 20 sym::branch {..
7a50: 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 namespace imp
7a60: 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c ort ::vc::fossil
7a70: 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 ::import::cvs::s
7a80: 74 61 74 65 0a 09 20 20 20 20 6e 61 6d 65 73 70 tate.. namesp
7a90: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a ace import ::vc:
7aa0: 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a :fossil::import:
7ab0: 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a :cvs::integrity.
7ac0: 09 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 .}. }.}..# #
7ad0: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 ## ### ##### ###
7ae0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 ##### ##########
7af0: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 ### ############
7b00: 23 23 23 23 23 23 23 23 23 0a 23 23 20 52 65 61 #########.## Rea
7b10: 64 79 0a 0a 70 61 63 6b 61 67 65 20 70 72 6f 76 dy..package prov
7b20: 69 64 65 20 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a ide vc::fossil::
7b30: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f import::cvs::pro
7b40: 6a 65 63 74 3a 3a 72 65 76 20 31 2e 30 0a 72 65 ject::rev 1.0.re
7b50: 74 75 72 6e 0a turn.