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 0a 23 tate storage...#
0490: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 # ## ### #####
04a0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
04b0: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 ###### #########
04c0: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 ############.##
04d0: 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20 3a 3a 76 ..snit::type ::v
04e0: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 c::fossil::impor
04f0: 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a t::cvs::project:
0500: 3a 72 65 76 20 7b 0a 20 20 20 20 23 20 23 20 23 :rev {. # # #
0510: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 # ### ##### ####
0520: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 #### ###########
0530: 23 23 0a 20 20 20 20 23 23 20 50 75 62 6c 69 63 ##. ## Public
0540: 20 41 50 49 0a 0a 20 20 20 20 63 6f 6e 73 74 72 API.. constr
0550: 75 63 74 6f 72 20 7b 70 72 6f 6a 65 63 74 20 63 uctor {project c
0560: 73 74 79 70 65 20 73 72 63 69 64 20 72 65 76 69 stype srcid revi
0570: 73 69 6f 6e 73 20 7b 74 68 65 69 64 20 7b 7d 7d sions {theid {}}
0580: 7d 20 7b 0a 09 69 66 20 7b 24 74 68 65 69 64 20 } {..if {$theid
0590: 6e 65 20 22 22 7d 20 7b 0a 09 20 20 20 20 73 65 ne ""} {.. se
05a0: 74 20 6d 79 69 64 20 24 74 68 65 69 64 0a 09 7d t myid $theid..}
05b0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 73 65 74 else {.. set
05c0: 20 6d 79 69 64 20 5b 69 6e 63 72 20 6d 79 63 6f myid [incr myco
05d0: 75 6e 74 65 72 5d 0a 09 7d 0a 0a 09 73 65 74 20 unter]..}...set
05e0: 6d 79 70 72 6f 6a 65 63 74 20 20 20 24 70 72 6f myproject $pro
05f0: 6a 65 63 74 0a 09 73 65 74 20 6d 79 74 79 70 65 ject..set mytype
0600: 20 20 20 20 20 20 24 63 73 74 79 70 65 09 20 20 $cstype.
0610: 0a 09 73 65 74 20 6d 79 73 72 63 69 64 09 24 73 ..set mysrcid.$s
0620: 72 63 69 64 09 20 20 0a 09 73 65 74 20 6d 79 72 rcid. ..set myr
0630: 65 76 69 73 69 6f 6e 73 20 24 72 65 76 69 73 69 evisions $revisi
0640: 6f 6e 73 0a 09 73 65 74 20 6d 79 70 6f 73 20 20 ons..set mypos
0650: 20 20 20 20 20 7b 7d 20 3b 20 23 20 43 6f 6d 6d {} ; # Comm
0660: 69 74 20 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6e it location is n
0670: 6f 74 20 6b 6e 6f 77 6e 20 79 65 74 2e 0a 0a 09 ot known yet....
0680: 23 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 # Keep track of
0690: 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 63 68 the generated ch
06a0: 61 6e 67 65 73 65 74 73 20 61 6e 64 20 6f 66 20 angesets and of
06b0: 74 68 65 20 69 6e 76 65 72 73 65 0a 09 23 20 6d the inverse..# m
06c0: 61 70 70 69 6e 67 20 66 72 6f 6d 20 72 65 76 69 apping from revi
06d0: 73 69 6f 6e 73 20 74 6f 20 74 68 65 6d 2e 0a 09 sions to them...
06e0: 6c 61 70 70 65 6e 64 20 6d 79 63 68 61 6e 67 65 lappend mychange
06f0: 73 65 74 73 20 20 20 24 73 65 6c 66 0a 09 73 65 sets $self..se
0700: 74 20 20 20 20 20 6d 79 69 64 6d 61 70 28 24 6d t myidmap($m
0710: 79 69 64 29 20 24 73 65 6c 66 0a 09 66 6f 72 65 yid) $self..fore
0720: 61 63 68 20 72 20 24 72 65 76 69 73 69 6f 6e 73 ach r $revisions
0730: 20 7b 20 73 65 74 20 6d 79 72 65 76 6d 61 70 28 { set myrevmap(
0740: 24 72 29 20 24 73 65 6c 66 20 7d 0a 09 72 65 74 $r) $self }..ret
0750: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d urn. }.. m
0760: 65 74 68 6f 64 20 69 64 20 20 20 20 20 20 20 20 ethod id
0770: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 {} { return $myi
0780: 64 20 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20 72 d }. method r
0790: 65 76 69 73 69 6f 6e 73 20 7b 7d 20 7b 20 72 65 evisions {} { re
07a0: 74 75 72 6e 20 24 6d 79 72 65 76 69 73 69 6f 6e turn $myrevision
07b0: 73 20 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20 64 s }. method d
07c0: 61 74 61 20 20 20 20 20 20 7b 7d 20 7b 20 72 65 ata {} { re
07d0: 74 75 72 6e 20 5b 6c 69 73 74 20 24 6d 79 70 72 turn [list $mypr
07e0: 6f 6a 65 63 74 20 24 6d 79 74 79 70 65 20 24 6d oject $mytype $m
07f0: 79 73 72 63 69 64 5d 20 7d 0a 0a 20 20 20 20 6d ysrcid] }.. m
0800: 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 ethod bysymbol
0810: 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 5b 65 78 {} { return [ex
0820: 70 72 20 7b 24 6d 79 74 79 70 65 20 65 71 20 22 pr {$mytype eq "
0830: 73 79 6d 22 7d 5d 20 7d 0a 20 20 20 20 6d 65 74 sym"}] }. met
0840: 68 6f 64 20 62 79 72 65 76 69 73 69 6f 6e 20 7b hod byrevision {
0850: 7d 20 7b 20 72 65 74 75 72 6e 20 5b 65 78 70 72 } { return [expr
0860: 20 7b 24 6d 79 74 79 70 65 20 65 71 20 22 72 65 {$mytype eq "re
0870: 76 22 7d 5d 20 7d 0a 0a 20 20 20 20 6d 65 74 68 v"}] }.. meth
0880: 6f 64 20 73 65 74 70 6f 73 20 7b 70 7d 20 7b 20 od setpos {p} {
0890: 73 65 74 20 6d 79 70 6f 73 20 24 70 20 3b 20 72 set mypos $p ; r
08a0: 65 74 75 72 6e 20 7d 0a 20 20 20 20 6d 65 74 68 eturn }. meth
08b0: 6f 64 20 70 6f 73 20 20 20 20 7b 7d 20 20 7b 20 od pos {} {
08c0: 72 65 74 75 72 6e 20 24 6d 79 70 6f 73 20 7d 0a return $mypos }.
08d0: 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 75 63 63 . method succ
08e0: 65 73 73 6f 72 73 20 7b 7d 20 7b 0a 09 23 20 4e essors {} {..# N
08f0: 4f 54 45 20 2f 20 46 55 54 55 52 45 3a 20 50 6f OTE / FUTURE: Po
0900: 73 73 69 62 6c 65 20 62 6f 74 74 6c 65 6e 65 63 ssible bottlenec
0910: 6b 2e 0a 09 73 65 74 20 63 73 65 74 73 20 7b 7d k...set csets {}
0920: 0a 09 66 6f 72 65 61 63 68 20 7b 5f 20 63 68 69 ..foreach {_ chi
0930: 6c 64 72 65 6e 7d 20 5b 24 73 65 6c 66 20 6e 65 ldren} [$self ne
0940: 78 74 6d 61 70 5d 20 7b 0a 09 20 20 20 20 66 6f xtmap] {.. fo
0950: 72 65 61 63 68 20 63 68 69 6c 64 20 24 63 68 69 reach child $chi
0960: 6c 64 72 65 6e 20 7b 0a 09 09 6c 61 70 70 65 6e ldren {...lappen
0970: 64 20 63 73 65 74 73 20 24 6d 79 72 65 76 6d 61 d csets $myrevma
0980: 70 28 24 63 68 69 6c 64 29 0a 09 20 20 20 20 7d p($child).. }
0990: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b 6c 73 6f ..}..return [lso
09a0: 72 74 20 2d 75 6e 69 71 75 65 20 24 63 73 65 74 rt -unique $cset
09b0: 73 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 s]. }.. #
09c0: 72 65 76 69 73 69 6f 6e 20 2d 3e 20 6c 69 73 74 revision -> list
09d0: 20 28 72 65 76 69 73 69 6f 6e 29 0a 20 20 20 20 (revision).
09e0: 6d 65 74 68 6f 64 20 6e 65 78 74 6d 61 70 20 7b method nextmap {
09f0: 7d 20 7b 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 } {..if {[llengt
0a00: 68 20 24 6d 79 6e 65 78 74 6d 61 70 5d 7d 20 7b h $mynextmap]} {
0a10: 20 72 65 74 75 72 6e 20 24 6d 79 6e 65 78 74 6d return $mynextm
0a20: 61 70 20 7d 0a 09 50 75 6c 6c 53 75 63 63 65 73 ap }..PullSucces
0a30: 73 6f 72 52 65 76 69 73 69 6f 6e 73 20 74 6d 70 sorRevisions tmp
0a40: 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 0a 09 73 $myrevisions..s
0a50: 65 74 20 6d 79 6e 65 78 74 6d 61 70 20 5b 61 72 et mynextmap [ar
0a60: 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 09 72 65 ray get tmp]..re
0a70: 74 75 72 6e 20 24 6d 79 6e 65 78 74 6d 61 70 0a turn $mynextmap.
0a80: 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f }.. metho
0a90: 64 20 62 72 65 61 6b 69 6e 74 65 72 6e 61 6c 64 d breakinternald
0aa0: 65 70 65 6e 64 65 6e 63 69 65 73 20 7b 7d 20 7b ependencies {} {
0ab0: 0a 09 23 20 54 68 69 73 20 6d 65 74 68 6f 64 20 ..# This method
0ac0: 69 6e 73 70 65 63 74 73 20 74 68 65 20 63 68 61 inspects the cha
0ad0: 6e 67 65 73 65 74 73 20 66 6f 72 20 69 6e 74 65 ngesets for inte
0ae0: 72 6e 61 6c 0a 09 23 20 64 65 70 65 6e 64 65 6e rnal..# dependen
0af0: 63 69 65 73 2e 20 4e 6f 74 68 69 6e 67 20 69 73 cies. Nothing is
0b00: 20 64 6f 6e 65 20 69 66 20 74 68 65 72 65 20 61 done if there a
0b10: 72 65 20 6e 6f 0a 09 23 20 73 75 63 68 2e 20 4f re no..# such. O
0b20: 74 68 65 72 77 69 73 65 20 74 68 65 20 63 68 61 therwise the cha
0b30: 6e 67 65 73 65 74 20 69 73 20 73 70 6c 69 74 20 ngeset is split
0b40: 69 6e 74 6f 20 61 20 73 65 74 20 6f 66 0a 09 23 into a set of..#
0b50: 20 66 72 61 67 6d 65 6e 74 73 20 77 69 74 68 6f fragments witho
0b60: 75 74 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 ut internal depe
0b70: 6e 64 65 6e 63 69 65 73 2c 20 74 72 61 6e 73 66 ndencies, transf
0b80: 6f 72 6d 69 6e 67 20 74 68 65 0a 09 23 20 69 6e orming the..# in
0b90: 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 ternal dependenc
0ba0: 69 65 73 20 69 6e 74 6f 20 65 78 74 65 72 6e 61 ies into externa
0bb0: 6c 20 6f 6e 65 73 2e 20 54 68 65 20 6e 65 77 20 l ones. The new
0bc0: 63 68 61 6e 67 65 73 65 74 73 0a 09 23 20 61 72 changesets..# ar
0bd0: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c e added to the l
0be0: 69 73 74 20 6f 66 20 61 6c 6c 20 63 68 61 6e 67 ist of all chang
0bf0: 65 73 65 74 73 2e 0a 0a 09 23 20 57 65 20 70 65 esets....# We pe
0c00: 72 66 6f 72 6d 20 61 6c 6c 20 6e 65 63 65 73 73 rform all necess
0c10: 61 72 79 20 73 70 6c 69 74 73 20 69 6e 20 6f 6e ary splits in on
0c20: 65 20 67 6f 2c 20 69 6e 73 74 65 61 64 20 6f 66 e go, instead of
0c30: 20 6f 6e 6c 79 0a 09 23 20 6f 6e 65 2e 20 54 68 only..# one. Th
0c40: 65 20 70 72 65 76 69 6f 75 73 20 61 6c 67 6f 72 e previous algor
0c50: 69 74 68 6d 2c 20 61 64 61 70 74 65 64 20 66 72 ithm, adapted fr
0c60: 6f 6d 20 63 76 73 32 73 76 6e 2c 20 63 6f 6d 70 om cvs2svn, comp
0c70: 75 74 65 64 0a 09 23 20 61 20 6c 6f 74 20 6f 66 uted..# a lot of
0c80: 20 73 74 61 74 65 20 77 68 69 63 68 20 77 61 73 state which was
0c90: 20 74 68 72 6f 77 6e 20 61 77 61 79 20 61 6e 64 thrown away and
0ca0: 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 64 20 61 then computed a
0cb0: 67 61 69 6e 0a 09 23 20 66 6f 72 20 65 61 63 68 gain..# for each
0cc0: 20 6f 66 20 74 68 65 20 66 72 61 67 6d 65 6e 74 of the fragment
0cd0: 73 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 s. It should be
0ce0: 65 61 73 69 65 72 20 74 6f 20 75 70 64 61 74 65 easier to update
0cf0: 20 61 6e 64 0a 09 23 20 72 65 75 73 65 20 74 68 and..# reuse th
0d00: 61 74 20 73 74 61 74 65 2e 0a 0a 09 23 20 54 68 at state....# Th
0d10: 65 20 63 6f 64 65 20 63 68 65 63 6b 73 20 6f 6e e code checks on
0d20: 6c 79 20 73 75 63 65 73 73 6f 72 20 64 65 70 65 ly sucessor depe
0d30: 6e 64 65 6e 63 69 65 73 2c 20 61 73 20 74 68 69 ndencies, as thi
0d40: 73 0a 09 23 20 61 75 74 6f 6d 61 74 69 63 61 6c s..# automatical
0d50: 6c 79 20 63 6f 76 65 72 73 20 74 68 65 20 70 72 ly covers the pr
0d60: 65 64 65 63 65 73 73 6f 72 20 64 65 70 65 6e 64 edecessor depend
0d70: 65 6e 63 69 65 73 20 61 73 20 77 65 6c 6c 20 28 encies as well (
0d80: 41 0a 09 23 20 73 75 63 63 65 73 73 6f 72 20 64 A..# successor d
0d90: 65 70 65 6e 64 65 6e 63 79 20 61 20 2d 3e 20 62 ependency a -> b
0da0: 20 69 73 20 61 6c 73 6f 20 61 20 70 72 65 64 65 is also a prede
0db0: 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 cessor dependenc
0dc0: 79 0a 09 23 20 62 20 2d 3e 20 61 29 2e 0a 0a 09 y..# b -> a)....
0dd0: 23 20 41 72 72 61 79 20 6f 66 20 64 65 70 65 6e # Array of depen
0de0: 64 65 6e 63 69 65 73 20 28 70 61 72 65 6e 74 20 dencies (parent
0df0: 2d 3e 20 63 68 69 6c 64 29 2e 20 54 68 69 73 20 -> child). This
0e00: 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 0a 09 is pulled from..
0e10: 23 20 74 68 65 20 73 74 61 74 65 2c 20 61 6e 64 # the state, and
0e20: 20 6c 69 6d 69 74 65 64 20 74 6f 20 73 75 63 63 limited to succ
0e30: 65 73 73 6f 72 73 20 77 69 74 68 69 6e 20 74 68 essors within th
0e40: 65 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 61 e changeset....a
0e50: 72 72 61 79 20 73 65 74 20 64 65 70 65 6e 64 65 rray set depende
0e60: 6e 63 69 65 73 20 7b 7d 0a 09 50 75 6c 6c 49 6e ncies {}..PullIn
0e70: 74 65 72 6e 61 6c 53 75 63 63 65 73 73 6f 72 52 ternalSuccessorR
0e80: 65 76 69 73 69 6f 6e 73 20 64 65 70 65 6e 64 65 evisions depende
0e90: 6e 63 69 65 73 20 24 6d 79 72 65 76 69 73 69 6f ncies $myrevisio
0ea0: 6e 73 0a 09 69 66 20 7b 21 5b 61 72 72 61 79 20 ns..if {![array
0eb0: 73 69 7a 65 20 64 65 70 65 6e 64 65 6e 63 69 65 size dependencie
0ec0: 73 5d 7d 20 7b 72 65 74 75 72 6e 20 30 7d 20 3b s]} {return 0} ;
0ed0: 20 23 20 4e 6f 74 68 69 6e 67 20 74 6f 20 62 72 # Nothing to br
0ee0: 65 61 6b 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 eak....log write
0ef0: 20 36 20 63 73 65 74 73 20 2e 2e 2e 3c 24 6d 79 6 csets ...<$my
0f00: 69 64 3e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e id>.............
0f10: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
0f20: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
0f30: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 0a 0a 09 23 20 57 .............# W
0f40: 65 20 68 61 76 65 20 69 6e 74 65 72 6e 61 6c 20 e have internal
0f50: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 6f 20 dependencies to
0f60: 62 72 65 61 6b 2e 20 57 65 20 6e 6f 77 20 69 74 break. We now it
0f70: 65 72 61 74 65 20 6f 76 65 72 0a 09 23 20 61 6c erate over..# al
0f80: 6c 20 70 6f 73 69 74 69 6f 6e 73 20 69 6e 20 74 l positions in t
0f90: 68 65 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 he list (which i
0fa0: 73 20 63 68 72 6f 6e 6f 6c 6f 67 69 63 61 6c 2c s chronological,
0fb0: 20 61 74 20 6c 65 61 73 74 0a 09 23 20 61 73 20 at least..# as
0fc0: 66 61 72 20 61 73 20 74 68 65 20 74 69 6d 65 73 far as the times
0fd0: 74 61 6d 70 73 20 61 72 65 20 63 6f 72 72 65 63 tamps are correc
0fe0: 74 20 61 6e 64 20 75 6e 69 71 75 65 29 20 61 6e t and unique) an
0ff0: 64 0a 09 23 20 64 65 74 65 72 6d 69 6e 65 20 74 d..# determine t
1000: 68 65 20 62 65 73 74 20 70 6f 73 69 74 69 6f 6e he best position
1010: 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b 2c 20 for the break,
1020: 62 79 20 74 72 79 69 6e 67 20 74 6f 0a 09 23 20 by trying to..#
1030: 62 72 65 61 6b 20 61 73 20 6d 61 6e 79 20 64 65 break as many de
1040: 70 65 6e 64 65 6e 63 69 65 73 20 61 73 20 70 6f pendencies as po
1050: 73 73 69 62 6c 65 20 69 6e 20 6f 6e 65 20 67 6f ssible in one go
1060: 2e 20 57 68 65 6e 20 61 0a 09 23 20 62 72 65 61 . When a..# brea
1070: 6b 20 77 61 73 20 66 6f 75 6e 64 20 74 68 69 73 k was found this
1080: 20 69 73 20 72 65 64 6f 6e 65 20 66 6f 72 20 74 is redone for t
1090: 68 65 20 66 72 61 67 6d 65 6e 74 73 20 63 6f 6d he fragments com
10a0: 69 6e 67 20 61 6e 64 0a 09 23 20 61 66 74 65 72 ing and..# after
10b0: 2c 20 61 66 74 65 72 20 75 70 64 69 6e 67 20 74 , after upding t
10c0: 68 65 20 63 72 6f 73 73 69 6e 67 20 69 6e 66 6f he crossing info
10d0: 72 6d 61 74 69 6f 6e 2e 0a 0a 09 23 20 44 61 74 rmation....# Dat
10e0: 61 20 73 74 72 75 63 74 75 72 65 73 3a 0a 09 23 a structures:..#
10f0: 20 4d 61 70 3a 20 20 50 4f 53 20 20 20 72 65 76 Map: POS rev
1100: 69 73 69 6f 6e 20 69 64 20 20 20 20 20 20 2d 3e ision id ->
1110: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73 position in lis
1120: 74 2e 0a 09 23 20 20 20 20 20 20 20 43 52 4f 53 t...# CROS
1130: 53 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 S position in li
1140: 73 74 20 2d 3e 20 6e 75 6d 62 65 72 20 6f 66 20 st -> number of
1150: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 63 72 6f dependencies cro
1160: 73 73 69 6e 67 20 69 74 0a 09 23 20 20 20 20 20 ssing it..#
1170: 20 20 44 45 50 43 20 20 64 65 70 65 6e 64 65 6e DEPC dependen
1180: 63 79 20 20 20 20 20 20 20 2d 3e 20 70 6f 73 69 cy -> posi
1190: 74 69 6f 6e 73 20 69 74 20 63 72 6f 73 73 65 73 tions it crosses
11a0: 0a 09 23 20 4c 69 73 74 3a 20 52 41 4e 47 45 20 ..# List: RANGE
11b0: 4f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 Of the positions
11c0: 20 69 74 73 65 6c 66 2e 0a 09 23 20 41 20 64 65 itself...# A de
11d0: 70 65 6e 64 65 6e 63 79 20 69 73 20 61 20 73 69 pendency is a si
11e0: 6e 67 6c 65 2d 65 6c 65 6d 65 6e 74 20 6d 61 70 ngle-element map
11f0: 20 70 61 72 65 6e 74 20 2d 3e 20 63 68 69 6c 64 parent -> child
1200: 0a 0a 09 49 6e 69 74 69 61 6c 69 7a 65 42 72 65 ...InitializeBre
1210: 61 6b 53 74 61 74 65 20 24 6d 79 72 65 76 69 73 akState $myrevis
1220: 69 6f 6e 73 0a 0a 09 73 65 74 20 66 72 61 67 6d ions...set fragm
1230: 65 6e 74 73 20 7b 7d 0a 09 73 65 74 20 70 65 6e ents {}..set pen
1240: 64 69 6e 67 20 20 20 5b 6c 69 73 74 20 24 72 61 ding [list $ra
1250: 6e 67 65 5d 0a 09 73 65 74 20 61 74 20 20 20 20 nge]..set at
1260: 20 20 20 20 30 0a 09 61 72 72 61 79 20 73 65 74 0..array set
1270: 20 62 72 65 61 6b 73 20 7b 7d 0a 0a 09 77 68 69 breaks {}...whi
1280: 6c 65 20 7b 24 61 74 20 3c 20 5b 6c 6c 65 6e 67 le {$at < [lleng
1290: 74 68 20 24 70 65 6e 64 69 6e 67 5d 7d 20 7b 0a th $pending]} {.
12a0: 09 20 20 20 20 73 65 74 20 63 75 72 72 65 6e 74 . set current
12b0: 20 5b 6c 69 6e 64 65 78 20 24 70 65 6e 64 69 6e [lindex $pendin
12c0: 67 20 24 61 74 5d 0a 0a 09 20 20 20 20 6c 6f 67 g $at]... log
12d0: 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22 write 6 csets "
12e0: 2e 20 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e . . .. ... .....
12f0: 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e ........ ......
1300: 2e 2e 2e 2e 2e 2e 2e 22 0a 09 20 20 20 20 6c 6f .......".. lo
1310: 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 g write 6 csets
1320: 22 53 63 68 65 64 75 6c 65 64 20 20 20 5b 6a 6f "Scheduled [jo
1330: 69 6e 20 5b 50 52 73 20 5b 6c 72 61 6e 67 65 20 in [PRs [lrange
1340: 24 70 65 6e 64 69 6e 67 20 24 61 74 20 65 6e 64 $pending $at end
1350: 5d 5d 20 7b 20 7d 5d 22 0a 09 20 20 20 20 6c 6f ]] { }]".. lo
1360: 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 g write 6 csets
1370: 22 43 6f 6e 73 69 64 65 72 69 6e 67 20 5b 50 52 "Considering [PR
1380: 20 24 63 75 72 72 65 6e 74 5d 20 5c 5b 24 61 74 $current] \[$at
1390: 2f 5b 6c 6c 65 6e 67 74 68 20 24 70 65 6e 64 69 /[llength $pendi
13a0: 6e 67 5d 5c 5d 22 0a 0a 09 20 20 20 20 73 65 74 ng]\]"... set
13b0: 20 62 65 73 74 20 5b 46 69 6e 64 42 65 73 74 42 best [FindBestB
13c0: 72 65 61 6b 20 24 63 75 72 72 65 6e 74 5d 0a 0a reak $current]..
13d0: 09 20 20 20 20 69 66 20 7b 24 62 65 73 74 20 3c . if {$best <
13e0: 20 30 7d 20 7b 0a 09 09 23 20 54 68 65 20 69 6e 0} {...# The in
13f0: 73 70 65 63 74 65 64 20 72 61 6e 67 65 20 68 61 spected range ha
1400: 73 20 6e 6f 20 69 6e 74 65 72 6e 61 6c 0a 09 09 s no internal...
1410: 23 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 # dependencies.
1420: 54 68 69 73 20 69 73 20 61 20 63 6f 6d 70 6c 65 This is a comple
1430: 74 65 20 66 72 61 67 6d 65 6e 74 2e 0a 09 09 6c te fragment....l
1440: 61 70 70 65 6e 64 20 66 72 61 67 6d 65 6e 74 73 append fragments
1450: 20 24 63 75 72 72 65 6e 74 0a 0a 09 09 6c 6f 67 $current....log
1460: 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22 write 6 csets "
1470: 4e 6f 20 62 72 65 61 6b 73 2c 20 66 69 6e 61 6c No breaks, final
1480: 22 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a ".. } else {.
1490: 09 09 23 20 53 70 6c 69 74 20 74 68 65 20 72 61 ..# Split the ra
14a0: 6e 67 65 20 61 6e 64 20 73 63 68 65 64 75 6c 65 nge and schedule
14b0: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 66 the resulting f
14c0: 72 61 67 6d 65 6e 74 73 0a 09 09 23 20 66 6f 72 ragments...# for
14d0: 20 66 75 72 74 68 65 72 20 69 6e 73 70 65 63 74 further inspect
14e0: 69 6f 6e 2e 20 52 65 6d 65 6d 62 65 72 20 74 68 ion. Remember th
14f0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 09 09 23 20 e number of...#
1500: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 63 75 74 dependencies cut
1510: 20 62 65 66 6f 72 65 20 77 65 20 72 65 6d 6f 76 before we remov
1520: 65 20 74 68 65 6d 20 66 72 6f 6d 0a 09 09 23 20 e them from...#
1530: 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 2c 20 66 consideration, f
1540: 6f 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e or documentation
1550: 20 6c 61 74 65 72 2e 0a 0a 09 09 73 65 74 20 62 later.....set b
1560: 72 65 61 6b 73 28 24 62 65 73 74 29 20 24 63 72 reaks($best) $cr
1570: 6f 73 73 28 24 62 65 73 74 29 0a 0a 09 09 6c 6f oss($best)....lo
1580: 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 g write 6 csets
1590: 22 42 65 73 74 20 62 72 65 61 6b 20 40 20 24 62 "Best break @ $b
15a0: 65 73 74 2c 20 63 75 74 74 69 6e 67 20 5b 6e 73 est, cutting [ns
15b0: 70 20 24 63 72 6f 73 73 28 24 62 65 73 74 29 20 p $cross($best)
15c0: 64 65 70 65 6e 64 65 6e 63 79 20 64 65 70 65 6e dependency depen
15d0: 64 65 6e 63 69 65 73 5d 22 0a 0a 09 09 23 20 4e dencies]"....# N
15e0: 6f 74 65 3a 20 54 68 65 20 76 61 6c 75 65 20 6f ote: The value o
15f0: 66 20 62 65 73 74 20 69 73 20 61 6e 20 61 62 6f f best is an abo
1600: 6c 75 74 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e lute location in
1610: 0a 09 09 23 20 6d 79 72 65 76 69 73 69 6f 6e 73 ...# myrevisions
1620: 2e 20 55 73 65 20 74 68 65 20 73 74 61 72 74 20 . Use the start
1630: 6f 66 20 63 75 72 72 65 6e 74 20 74 6f 20 6d 61 of current to ma
1640: 6b 65 20 69 74 20 61 6e 0a 09 09 23 20 69 6e 64 ke it an...# ind
1650: 65 78 20 61 62 73 6f 6c 75 74 65 20 74 6f 20 63 ex absolute to c
1660: 75 72 72 65 6e 74 2e 0a 0a 09 09 73 65 74 20 62 urrent.....set b
1670: 72 65 6c 20 5b 65 78 70 72 20 7b 24 62 65 73 74 rel [expr {$best
1680: 20 2d 20 5b 6c 69 6e 64 65 78 20 24 63 75 72 72 - [lindex $curr
1690: 65 6e 74 20 30 5d 7d 5d 0a 09 09 73 65 74 20 62 ent 0]}]...set b
16a0: 6e 65 78 74 20 24 62 72 65 6c 20 3b 20 69 6e 63 next $brel ; inc
16b0: 72 20 62 6e 65 78 74 0a 09 09 73 65 74 20 66 72 r bnext...set fr
16c0: 61 67 62 65 66 6f 72 65 20 5b 6c 72 61 6e 67 65 agbefore [lrange
16d0: 20 24 63 75 72 72 65 6e 74 20 30 20 24 62 72 65 $current 0 $bre
16e0: 6c 5d 0a 09 09 73 65 74 20 66 72 61 67 61 66 74 l]...set fragaft
16f0: 65 72 20 20 5b 6c 72 61 6e 67 65 20 24 63 75 72 er [lrange $cur
1700: 72 65 6e 74 20 24 62 6e 65 78 74 20 65 6e 64 5d rent $bnext end]
1710: 0a 0a 09 09 6c 6f 67 20 77 72 69 74 65 20 36 20 ....log write 6
1720: 63 73 65 74 73 20 22 4e 65 77 20 70 69 65 63 65 csets "New piece
1730: 73 20 20 5b 50 52 20 24 66 72 61 67 62 65 66 6f s [PR $fragbefo
1740: 72 65 5d 20 5b 50 52 20 24 66 72 61 67 61 66 74 re] [PR $fragaft
1750: 65 72 5d 22 0a 0a 09 09 69 66 20 7b 21 5b 6c 6c er]"....if {![ll
1760: 65 6e 67 74 68 20 24 66 72 61 67 62 65 66 6f 72 ength $fragbefor
1770: 65 5d 7d 20 7b 0a 09 09 20 20 20 20 74 72 6f 75 e]} {... trou
1780: 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 22 54 72 ble internal "Tr
1790: 69 65 64 20 74 6f 20 73 70 6c 69 74 20 6f 66 66 ied to split off
17a0: 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 a zero-length f
17b0: 72 61 67 6d 65 6e 74 20 61 74 20 74 68 65 20 62 ragment at the b
17c0: 65 67 69 6e 6e 69 6e 67 22 0a 09 09 7d 0a 09 09 eginning"...}...
17d0: 69 66 20 7b 21 5b 6c 6c 65 6e 67 74 68 20 24 66 if {![llength $f
17e0: 72 61 67 61 66 74 65 72 5d 7d 20 7b 0a 09 09 20 ragafter]} {...
17f0: 20 20 20 74 72 6f 75 62 6c 65 20 69 6e 74 65 72 trouble inter
1800: 6e 61 6c 20 22 54 72 69 65 64 20 74 6f 20 73 70 nal "Tried to sp
1810: 6c 69 74 20 6f 66 66 20 61 20 7a 65 72 6f 2d 6c lit off a zero-l
1820: 65 6e 67 74 68 20 66 72 61 67 6d 65 6e 74 20 61 ength fragment a
1830: 74 20 74 68 65 20 65 6e 64 22 0a 09 09 7d 0a 0a t the end"...}..
1840: 09 09 6c 61 70 70 65 6e 64 20 70 65 6e 64 69 6e ..lappend pendin
1850: 67 20 24 66 72 61 67 62 65 66 6f 72 65 20 24 66 g $fragbefore $f
1860: 72 61 67 61 66 74 65 72 0a 09 09 43 75 74 41 74 ragafter...CutAt
1870: 20 24 62 65 73 74 0a 09 20 20 20 20 7d 0a 0a 09 $best.. }...
1880: 20 20 20 20 69 6e 63 72 20 61 74 0a 09 7d 0a 0a incr at..}..
1890: 09 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 .log write 6 cse
18a0: 74 73 20 22 2e 20 2e 20 2e 2e 20 2e 2e 2e 20 2e ts ". . .. ... .
18b0: 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e .... ........ ..
18c0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 22 0a 0a 09 23 ..........."...#
18d0: 20 43 72 65 61 74 65 20 63 68 61 6e 67 65 73 65 Create changese
18e0: 74 73 20 66 6f 72 20 74 68 65 20 66 72 61 67 6d ts for the fragm
18f0: 65 6e 74 73 2c 20 72 65 75 73 69 6e 67 20 74 68 ents, reusing th
1900: 65 20 63 75 72 72 65 6e 74 20 6f 6e 65 0a 09 23 e current one..#
1910: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 66 for the first f
1920: 72 61 67 6d 65 6e 74 2e 20 57 65 20 73 6f 72 74 ragment. We sort
1930: 20 74 68 65 6d 20 69 6e 20 6f 72 64 65 72 20 74 them in order t
1940: 6f 20 61 6c 6c 6f 77 0a 09 23 20 63 68 65 63 6b o allow..# check
1950: 69 6e 67 20 66 6f 72 20 67 61 70 73 20 61 6e 64 ing for gaps and
1960: 20 6e 69 63 65 20 6d 65 73 73 61 67 65 73 2e 0a nice messages..
1970: 0a 09 73 65 74 20 66 72 61 67 6d 65 6e 74 73 20 ..set fragments
1980: 5b 6c 73 6f 72 74 20 2d 69 6e 64 65 78 20 30 20 [lsort -index 0
1990: 2d 69 6e 74 65 67 65 72 20 24 66 72 61 67 6d 65 -integer $fragme
19a0: 6e 74 73 5d 0a 0a 09 23 70 75 74 73 20 5c 74 2e nts]...#puts \t.
19b0: 5b 6a 6f 69 6e 20 5b 50 52 73 20 24 66 72 61 67 [join [PRs $frag
19c0: 6d 65 6e 74 73 5d 20 2e 5c 6e 5c 74 2e 5d 2e 0a ments] .\n\t.]..
19d0: 0a 09 42 6f 72 64 65 72 20 5b 6c 69 6e 64 65 78 ..Border [lindex
19e0: 20 24 66 72 61 67 6d 65 6e 74 73 20 30 5d 20 66 $fragments 0] f
19f0: 69 72 73 74 73 20 66 69 72 73 74 65 0a 0a 09 69 irsts firste...i
1a00: 66 20 7b 24 66 69 72 73 74 73 20 21 3d 20 30 7d f {$firsts != 0}
1a10: 20 7b 0a 09 20 20 20 20 74 72 6f 75 62 6c 65 20 {.. trouble
1a20: 69 6e 74 65 72 6e 61 6c 20 22 42 61 64 20 66 72 internal "Bad fr
1a30: 61 67 6d 65 6e 74 20 73 74 61 72 74 20 40 20 24 agment start @ $
1a40: 66 69 72 73 74 73 2c 20 67 61 70 2c 20 6f 72 20 firsts, gap, or
1a50: 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 before beginning
1a60: 20 6f 66 20 74 68 65 20 72 61 6e 67 65 22 0a 09 of the range"..
1a70: 7d 0a 0a 09 73 65 74 20 6c 61 73 74 65 20 24 66 }...set laste $f
1a80: 69 72 73 74 65 0a 09 66 6f 72 65 61 63 68 20 66 irste..foreach f
1a90: 72 61 67 6d 65 6e 74 20 5b 6c 72 61 6e 67 65 20 ragment [lrange
1aa0: 24 66 72 61 67 6d 65 6e 74 73 20 31 20 65 6e 64 $fragments 1 end
1ab0: 5d 20 7b 0a 09 20 20 20 20 42 6f 72 64 65 72 20 ] {.. Border
1ac0: 24 66 72 61 67 6d 65 6e 74 20 73 20 65 0a 09 20 $fragment s e..
1ad0: 20 20 20 69 66 20 7b 24 6c 61 73 74 65 20 21 3d if {$laste !=
1ae0: 20 28 24 73 20 2d 20 31 29 7d 20 7b 0a 09 09 74 ($s - 1)} {...t
1af0: 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 rouble internal
1b00: 22 42 61 64 20 66 72 61 67 6d 65 6e 74 20 62 6f "Bad fragment bo
1b10: 72 64 65 72 20 3c 24 6c 61 73 74 65 20 7c 20 24 rder <$laste | $
1b20: 73 3e 2c 20 67 61 70 20 6f 72 20 6f 76 65 72 6c s>, gap or overl
1b30: 61 70 22 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 ap".. }...
1b40: 20 73 65 74 20 6e 65 77 20 5b 24 74 79 70 65 20 set new [$type
1b50: 25 41 55 54 4f 25 20 24 6d 79 70 72 6f 6a 65 63 %AUTO% $myprojec
1b60: 74 20 24 6d 79 74 79 70 65 20 24 6d 79 73 72 63 t $mytype $mysrc
1b70: 69 64 20 5b 6c 72 61 6e 67 65 20 24 6d 79 72 65 id [lrange $myre
1b80: 76 69 73 69 6f 6e 73 20 24 73 20 24 65 5d 5d 0a visions $s $e]].
1b90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 67 . log
1ba0: 20 77 72 69 74 65 20 34 20 63 73 65 74 73 20 22 write 4 csets "
1bb0: 42 72 65 61 6b 69 6e 67 20 3c 24 6d 79 69 64 3e Breaking <$myid>
1bc0: 20 40 20 24 6c 61 73 74 65 2c 20 6e 65 77 20 3c @ $laste, new <
1bd0: 5b 24 6e 65 77 20 69 64 5d 3e 2c 20 63 75 74 74 [$new id]>, cutt
1be0: 69 6e 67 20 24 62 72 65 61 6b 73 28 24 6c 61 73 ing $breaks($las
1bf0: 74 65 29 22 0a 0a 09 20 20 20 20 73 65 74 20 6c te)"... set l
1c00: 61 73 74 65 20 24 65 0a 09 7d 0a 0a 09 69 66 20 aste $e..}...if
1c10: 7b 24 6c 61 73 74 65 20 21 3d 20 28 5b 6c 6c 65 {$laste != ([lle
1c20: 6e 67 74 68 20 24 6d 79 72 65 76 69 73 69 6f 6e ngth $myrevision
1c30: 73 5d 2d 31 29 7d 20 7b 0a 09 20 20 20 20 74 72 s]-1)} {.. tr
1c40: 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 22 ouble internal "
1c50: 42 61 64 20 66 72 61 67 6d 65 6e 74 20 65 6e 64 Bad fragment end
1c60: 20 40 20 24 6c 61 73 74 65 2c 20 67 61 70 2c 20 @ $laste, gap,
1c70: 6f 72 20 62 65 79 6f 6e 64 20 65 6e 64 20 6f 66 or beyond end of
1c80: 20 74 68 65 20 72 61 6e 67 65 22 0a 09 7d 0a 0a the range"..}..
1c90: 09 23 20 50 75 74 20 74 68 65 20 66 69 72 73 74 .# Put the first
1ca0: 20 66 72 61 67 6d 65 6e 74 20 69 6e 74 6f 20 74 fragment into t
1cb0: 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 he current chang
1cc0: 65 73 65 74 2e 0a 09 73 65 74 20 6d 79 72 65 76 eset...set myrev
1cd0: 69 73 69 6f 6e 73 20 5b 6c 72 61 6e 67 65 20 24 isions [lrange $
1ce0: 6d 79 72 65 76 69 73 69 6f 6e 73 20 30 20 24 66 myrevisions 0 $f
1cf0: 69 72 73 74 65 5d 0a 0a 09 72 65 74 75 72 6e 20 irste]...return
1d00: 31 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 1. }.. met
1d10: 68 6f 64 20 70 65 72 73 69 73 74 20 7b 7d 20 7b hod persist {} {
1d20: 0a 09 73 65 74 20 74 69 64 20 24 6d 79 63 73 74 ..set tid $mycst
1d30: 79 70 65 28 24 6d 79 74 79 70 65 29 0a 09 73 65 ype($mytype)..se
1d40: 74 20 70 69 64 20 5b 24 6d 79 70 72 6f 6a 65 63 t pid [$myprojec
1d50: 74 20 69 64 5d 0a 09 73 65 74 20 70 6f 73 20 30 t id]..set pos 0
1d60: 0a 0a 09 73 74 61 74 65 20 74 72 61 6e 73 61 63 ...state transac
1d70: 74 69 6f 6e 20 7b 0a 09 20 20 20 20 73 74 61 74 tion {.. stat
1d80: 65 20 72 75 6e 20 7b 0a 09 09 49 4e 53 45 52 54 e run {...INSERT
1d90: 20 49 4e 54 4f 20 63 68 61 6e 67 65 73 65 74 20 INTO changeset
1da0: 28 63 69 64 2c 20 20 20 70 69 64 2c 20 20 74 79 (cid, pid, ty
1db0: 70 65 2c 20 73 72 63 29 0a 09 09 56 41 4c 55 45 pe, src)...VALUE
1dc0: 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 S
1dd0: 20 28 24 6d 79 69 64 2c 20 24 70 69 64 2c 20 24 ($myid, $pid, $
1de0: 74 69 64 2c 20 24 6d 79 73 72 63 69 64 29 3b 0a tid, $mysrcid);.
1df0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 66 6f 72 . }... for
1e00: 65 61 63 68 20 72 69 64 20 24 6d 79 72 65 76 69 each rid $myrevi
1e10: 73 69 6f 6e 73 20 7b 0a 09 09 73 74 61 74 65 20 sions {...state
1e20: 72 75 6e 20 7b 0a 09 09 20 20 20 20 49 4e 53 45 run {... INSE
1e30: 52 54 20 49 4e 54 4f 20 63 73 72 65 76 69 73 69 RT INTO csrevisi
1e40: 6f 6e 20 28 63 69 64 2c 20 20 20 70 6f 73 2c 20 on (cid, pos,
1e50: 20 72 69 64 29 0a 09 09 20 20 20 20 56 41 4c 55 rid)... VALU
1e60: 45 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20 ES
1e70: 20 20 20 28 24 6d 79 69 64 2c 20 24 70 6f 73 2c ($myid, $pos,
1e80: 20 24 72 69 64 29 3b 0a 09 09 7d 0a 09 09 69 6e $rid);...}...in
1e90: 63 72 20 70 6f 73 0a 09 20 20 20 20 7d 0a 09 7d cr pos.. }..}
1ea0: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a ..return. }..
1eb0: 20 20 20 20 6d 65 74 68 6f 64 20 74 69 6d 65 72 method timer
1ec0: 61 6e 67 65 20 7b 7d 20 7b 0a 09 73 65 74 20 74 ange {} {..set t
1ed0: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 6d heset ('[join $m
1ee0: 79 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d yrevisions {','}
1ef0: 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61 ]')..return [sta
1f00: 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 te run ".. SE
1f10: 4c 45 43 54 20 4d 49 4e 28 52 2e 64 61 74 65 29 LECT MIN(R.date)
1f20: 2c 20 4d 41 58 28 52 2e 64 61 74 65 29 0a 09 20 , MAX(R.date)..
1f30: 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e FROM revision
1f40: 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e R.. WHERE R.
1f50: 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 rid IN $theset..
1f60: 22 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 "]. }.. me
1f70: 74 68 6f 64 20 64 72 6f 70 20 7b 7d 20 7b 0a 09 thod drop {} {..
1f80: 73 74 61 74 65 20 74 72 61 6e 73 61 63 74 69 6f state transactio
1f90: 6e 20 7b 0a 09 20 20 20 20 73 74 61 74 65 20 72 n {.. state r
1fa0: 75 6e 20 7b 0a 09 09 44 45 4c 45 54 45 20 46 52 un {...DELETE FR
1fb0: 4f 4d 20 63 68 61 6e 67 65 73 65 74 20 20 57 48 OM changeset WH
1fc0: 45 52 45 20 63 69 64 20 3d 20 24 6d 79 69 64 3b ERE cid = $myid;
1fd0: 0a 09 09 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 ...DELETE FROM c
1fe0: 73 72 65 76 69 73 69 6f 6e 20 57 48 45 52 45 20 srevision WHERE
1ff0: 63 69 64 20 3d 20 24 6d 79 69 64 3b 0a 09 20 20 cid = $myid;..
2000: 20 20 7d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 }..}..foreach
2010: 72 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 20 7b r $myrevisions {
2020: 20 75 6e 73 65 74 20 6d 79 72 65 76 6d 61 70 28 unset myrevmap(
2030: 24 72 29 20 7d 0a 09 73 65 74 20 70 6f 73 20 20 $r) }..set pos
2040: 20 20 20 20 20 20 20 20 5b 6c 73 65 61 72 63 68 [lsearch
2050: 20 2d 65 78 61 63 74 20 24 6d 79 63 68 61 6e 67 -exact $mychang
2060: 65 73 65 74 73 20 24 73 65 6c 66 5d 0a 09 73 65 esets $self]..se
2070: 74 20 6d 79 63 68 61 6e 67 65 73 65 74 73 20 5b t mychangesets [
2080: 6c 72 65 70 6c 61 63 65 20 24 6d 79 63 68 61 6e lreplace $mychan
2090: 67 65 73 65 74 73 20 24 70 6f 73 20 24 70 6f 73 gesets $pos $pos
20a0: 5d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a ]..return. }.
20b0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 . typemethod
20c0: 73 70 6c 69 74 20 7b 63 73 65 74 20 61 72 67 73 split {cset args
20d0: 7d 20 7b 0a 09 23 20 41 73 20 70 61 72 74 20 6f } {..# As part o
20e0: 66 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f f the creation o
20f0: 66 20 74 68 65 20 6e 65 77 20 63 68 61 6e 67 65 f the new change
2100: 73 65 74 73 20 73 70 65 63 69 66 69 65 64 20 69 sets specified i
2110: 6e 0a 09 23 20 41 52 47 53 20 61 73 20 73 65 74 n..# ARGS as set
2120: 73 20 6f 66 20 72 65 76 69 73 69 6f 6e 73 2c 20 s of revisions,
2130: 61 6c 6c 20 73 75 62 73 65 74 73 20 6f 66 20 43 all subsets of C
2140: 53 45 54 27 73 20 72 65 76 69 73 69 6f 6e 0a 09 SET's revision..
2150: 23 20 73 65 74 2c 20 43 53 45 54 20 77 69 6c 6c # set, CSET will
2160: 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d be dropped from
2170: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 2c 20 all databases,
2180: 69 6e 20 61 6e 64 20 6f 75 74 20 6f 66 0a 09 23 in and out of..#
2190: 20 6d 65 6d 6f 72 79 2c 20 61 6e 64 20 74 68 65 memory, and the
21a0: 6e 20 64 65 73 74 72 6f 79 65 64 2e 0a 0a 09 73 n destroyed....s
21b0: 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 truct::list assi
21c0: 67 6e 20 5b 24 63 73 65 74 20 64 61 74 61 5d 20 gn [$cset data]
21d0: 70 72 6f 6a 65 63 74 20 63 73 74 79 70 65 20 63 project cstype c
21e0: 73 73 72 63 0a 0a 09 24 63 73 65 74 20 64 72 6f ssrc...$cset dro
21f0: 70 0a 09 24 63 73 65 74 20 64 65 73 74 72 6f 79 p..$cset destroy
2200: 0a 0a 09 73 65 74 20 6e 65 77 63 73 65 74 73 20 ...set newcsets
2210: 7b 7d 0a 09 66 6f 72 65 61 63 68 20 66 72 61 67 {}..foreach frag
2220: 6d 65 6e 74 72 65 76 69 73 69 6f 6e 73 20 24 61 mentrevisions $a
2230: 72 67 73 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 rgs {.. lappe
2240: 6e 64 20 6e 65 77 63 73 65 74 73 20 5b 24 74 79 nd newcsets [$ty
2250: 70 65 20 25 41 55 54 4f 25 20 24 70 72 6f 6a 65 pe %AUTO% $proje
2260: 63 74 20 24 63 73 74 79 70 65 20 24 63 73 73 72 ct $cstype $cssr
2270: 63 20 24 66 72 61 67 6d 65 6e 74 72 65 76 69 73 c $fragmentrevis
2280: 69 6f 6e 73 5d 0a 09 7d 0a 0a 09 66 6f 72 65 61 ions]..}...forea
2290: 63 68 20 63 20 24 6e 65 77 63 73 65 74 73 20 7b ch c $newcsets {
22a0: 20 24 63 20 70 65 72 73 69 73 74 20 7d 0a 09 72 $c persist }..r
22b0: 65 74 75 72 6e 20 24 6e 65 77 63 73 65 74 73 0a eturn $newcsets.
22c0: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 }.. # # #
22d0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 # ### ##### ####
22e0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 #### ###########
22f0: 23 23 0a 20 20 20 20 23 23 20 53 74 61 74 65 0a ##. ## State.
2300: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 . variable my
2310: 69 64 20 20 20 20 20 20 20 20 7b 7d 20 3b 20 23 id {} ; #
2320: 20 49 64 20 6f 66 20 74 68 65 20 63 73 65 74 20 Id of the cset
2330: 66 6f 72 20 74 68 65 20 70 65 72 73 69 73 74 65 for the persiste
2340: 6e 74 0a 09 09 09 20 20 20 20 20 20 23 20 73 74 nt.... # st
2350: 61 74 65 2e 0a 20 20 20 20 76 61 72 69 61 62 6c ate.. variabl
2360: 65 20 6d 79 70 72 6f 6a 65 63 74 20 20 20 7b 7d e myproject {}
2370: 20 3b 20 23 20 52 65 66 65 72 65 6e 63 65 20 6f ; # Reference o
2380: 66 20 74 68 65 20 70 72 6f 6a 65 63 74 20 6f 62 f the project ob
2390: 6a 65 63 74 20 74 68 65 0a 09 09 09 20 20 20 20 ject the....
23a0: 20 20 23 20 63 68 61 6e 67 65 73 65 74 20 62 65 # changeset be
23b0: 6c 6f 6e 67 73 20 74 6f 2e 0a 20 20 20 20 76 61 longs to.. va
23c0: 72 69 61 62 6c 65 20 6d 79 74 79 70 65 20 20 20 riable mytype
23d0: 20 20 20 7b 7d 20 3b 20 23 20 72 65 76 20 6f 72 {} ; # rev or
23e0: 20 73 79 6d 2c 20 77 68 65 72 65 20 74 68 65 20 sym, where the
23f0: 63 73 65 74 20 6f 72 69 67 69 6e 61 74 65 64 0a cset originated.
2400: 09 09 09 20 20 20 20 20 20 23 20 66 72 6f 6d 2e ... # from.
2410: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 . variable my
2420: 73 72 63 69 64 20 20 20 20 20 7b 7d 20 3b 20 23 srcid {} ; #
2430: 20 49 64 20 6f 66 20 74 68 65 20 6d 65 74 61 64 Id of the metad
2440: 61 74 61 20 6f 72 20 73 79 6d 62 6f 6c 20 74 68 ata or symbol th
2450: 65 20 63 73 65 74 0a 09 09 09 20 20 20 20 20 20 e cset....
2460: 23 20 69 73 20 62 61 73 65 64 20 6f 6e 2e 0a 20 # is based on..
2470: 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 72 65 variable myre
2480: 76 69 73 69 6f 6e 73 20 7b 7d 20 3b 20 23 20 4c visions {} ; # L
2490: 69 73 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 ist of the file
24a0: 6c 65 76 65 6c 20 72 65 76 69 73 69 6f 6e 73 20 level revisions
24b0: 69 6e 0a 09 09 09 20 20 20 20 20 20 23 20 74 68 in.... # th
24c0: 65 20 63 73 65 74 2e 0a 20 20 20 20 76 61 72 69 e cset.. vari
24d0: 61 62 6c 65 20 6d 79 6e 65 78 74 6d 61 70 20 20 able mynextmap
24e0: 20 7b 7d 20 3b 20 23 20 44 69 63 74 69 6f 6e 61 {} ; # Dictiona
24f0: 72 79 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 ry mapping from
2500: 74 68 65 20 72 65 76 69 73 69 6f 6e 73 0a 09 09 the revisions...
2510: 09 20 20 20 20 20 20 23 20 74 6f 20 74 68 65 69 . # to thei
2520: 72 20 73 75 63 63 65 73 73 6f 72 73 2e 20 43 61 r successors. Ca
2530: 63 68 65 20 74 6f 20 61 76 6f 69 64 0a 09 09 09 che to avoid....
2540: 20 20 20 20 20 20 23 20 6c 6f 61 64 69 6e 67 20 # loading
2550: 74 68 69 73 20 66 72 6f 6d 20 74 68 65 20 73 74 this from the st
2560: 61 74 65 20 6d 6f 72 65 20 74 68 61 6e 0a 09 09 ate more than...
2570: 09 20 20 20 20 20 20 23 20 6f 6e 63 65 2e 0a 20 . # once..
2580: 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 70 6f variable mypo
2590: 73 20 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 43 s {} ; # C
25a0: 6f 6d 6d 69 74 20 70 6f 73 69 74 69 6f 6e 20 6f ommit position o
25b0: 66 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c f the changeset,
25c0: 20 69 66 0a 09 09 09 20 20 20 20 20 20 23 20 6b if.... # k
25d0: 6e 6f 77 6e 2e 0a 0a 20 20 20 20 23 20 23 20 23 nown... # # #
25e0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 # ### ##### ####
25f0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 #### ###########
2600: 23 23 0a 20 20 20 20 23 23 20 49 6e 74 65 72 6e ##. ## Intern
2610: 61 6c 20 6d 65 74 68 6f 64 73 0a 0a 20 20 20 20 al methods..
2620: 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 typevariable myc
2630: 6f 75 6e 74 65 72 20 20 20 20 20 20 20 20 30 20 ounter 0
2640: 3b 20 23 20 49 64 20 63 6f 75 6e 74 65 72 20 66 ; # Id counter f
2650: 6f 72 20 63 73 65 74 73 2e 20 4c 61 73 74 20 69 or csets. Last i
2660: 64 20 75 73 65 64 2e 0a 20 20 20 20 74 79 70 65 d used.. type
2670: 76 61 72 69 61 62 6c 65 20 6d 79 63 73 74 79 70 variable mycstyp
2680: 65 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 e -array {} ; #
2690: 4d 61 70 20 63 73 74 79 70 65 73 20 74 6f 20 70 Map cstypes to p
26a0: 65 72 73 69 73 74 65 6e 74 20 69 64 73 2e 0a 0a ersistent ids...
26b0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 67 typemethod g
26c0: 65 74 63 73 74 79 70 65 73 20 7b 7d 20 7b 0a 09 etcstypes {} {..
26d0: 66 6f 72 65 61 63 68 20 7b 74 69 64 20 6e 61 6d foreach {tid nam
26e0: 65 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a e} [state run {.
26f0: 09 20 20 20 20 53 45 4c 45 43 54 20 74 69 64 2c . SELECT tid,
2700: 20 6e 61 6d 65 20 46 52 4f 4d 20 63 73 74 79 70 name FROM cstyp
2710: 65 3b 0a 09 7d 5d 20 7b 20 73 65 74 20 6d 79 63 e;..}] { set myc
2720: 73 74 79 70 65 28 24 6e 61 6d 65 29 20 24 74 69 stype($name) $ti
2730: 64 20 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 d }..return.
2740: 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f }.. typemetho
2750: 64 20 6c 6f 61 64 63 6f 75 6e 74 65 72 20 7b 7d d loadcounter {}
2760: 20 7b 0a 09 23 20 49 6e 69 74 69 61 6c 69 7a 65 {..# Initialize
2770: 20 74 68 65 20 63 6f 75 6e 74 65 72 20 66 72 6f the counter fro
2780: 6d 20 74 68 65 20 73 74 61 74 65 0a 09 73 65 74 m the state..set
2790: 20 6d 79 63 6f 75 6e 74 65 72 20 5b 73 74 61 74 mycounter [stat
27a0: 65 20 6f 6e 65 20 7b 20 53 45 4c 45 43 54 20 4d e one { SELECT M
27b0: 41 58 28 63 69 64 29 20 46 52 4f 4d 20 63 68 61 AX(cid) FROM cha
27c0: 6e 67 65 73 65 74 20 7d 5d 0a 09 72 65 74 75 72 ngeset }]..retur
27d0: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f n. }.. pro
27e0: 63 20 50 75 6c 6c 49 6e 74 65 72 6e 61 6c 53 75 c PullInternalSu
27f0: 63 63 65 73 73 6f 72 52 65 76 69 73 69 6f 6e 73 ccessorRevisions
2800: 20 7b 64 76 20 72 65 76 69 73 69 6f 6e 73 7d 20 {dv revisions}
2810: 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76 20 64 {..upvar 1 $dv d
2820: 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 73 65 74 ependencies..set
2830: 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 theset ('[join
2840: 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d $revisions {','}
2850: 5d 27 29 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 ]')...foreach {r
2860: 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 id child} [state
2870: 20 72 75 6e 20 22 0a 20 20 20 2d 2d 20 50 72 69 run ". -- Pri
2880: 6d 61 72 79 20 63 68 69 6c 64 72 65 6e 0a 09 20 mary children..
2890: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c SELECT R.rid,
28a0: 20 52 2e 63 68 69 6c 64 0a 09 20 20 20 20 46 52 R.child.. FR
28b0: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 0a OM revision R.
28c0: 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 . WHERE R.ri
28d0: 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 0a 09 d IN $theset..
28e0: 20 20 20 20 41 4e 44 20 20 20 20 52 2e 63 68 69 AND R.chi
28f0: 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 0a 09 ld IS NOT NULL..
2900: 20 20 20 20 41 4e 44 20 20 20 20 52 2e 63 68 69 AND R.chi
2910: 6c 64 20 49 4e 20 24 74 68 65 73 65 74 0a 20 20 ld IN $theset.
2920: 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 54 UNION. -- T
2930: 72 61 6e 73 69 74 69 6f 6e 20 4e 54 44 42 20 74 ransition NTDB t
2940: 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20 53 45 4c o trunk.. SEL
2950: 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 64 62 63 ECT R.rid, R.dbc
2960: 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 hild.. FROM
2970: 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 revision R..
2980: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 WHERE R.rid
2990: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 IN $theset..
29a0: 41 4e 44 20 20 20 20 52 2e 64 62 63 68 69 6c 64 AND R.dbchild
29b0: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 0a 09 20 20 IS NOT NULL..
29c0: 20 20 41 4e 44 20 20 20 20 52 2e 64 62 63 68 69 AND R.dbchi
29d0: 6c 64 20 49 4e 20 24 74 68 65 73 65 74 0a 20 20 ld IN $theset.
29e0: 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 53 UNION. -- S
29f0: 65 63 6f 6e 64 61 72 79 20 28 62 72 61 6e 63 68 econdary (branch
2a00: 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 ) children..
2a10: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 42 2e SELECT R.rid, B.
2a20: 62 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 brid.. FROM
2a30: 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 revision R, rev
2a40: 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64 isionbranchchild
2a50: 72 65 6e 20 42 0a 09 20 20 20 20 57 48 45 52 45 ren B.. WHERE
2a60: 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 R.rid IN $th
2a70: 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 eset.. AND
2a80: 20 52 2e 72 69 64 20 3d 20 42 2e 72 69 64 0a 09 R.rid = B.rid..
2a90: 20 20 20 20 41 4e 44 20 20 20 20 42 2e 62 72 69 AND B.bri
2aa0: 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 22 5d d IN $theset.."]
2ab0: 20 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 69 64 {.. # Consid
2ac0: 65 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 20 74 er moving this t
2ad0: 6f 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 o the integrity
2ae0: 6d 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 66 20 module... if
2af0: 7b 24 72 69 64 20 3d 3d 20 24 63 68 69 6c 64 7d {$rid == $child}
2b00: 20 7b 0a 09 09 74 72 6f 75 62 6c 65 20 69 6e 74 {...trouble int
2b10: 65 72 6e 61 6c 20 22 52 65 76 69 73 69 6f 6e 20 ernal "Revision
2b20: 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 $rid depends on
2b30: 69 74 73 65 6c 66 2e 22 0a 09 20 20 20 20 7d 0a itself.".. }.
2b40: 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 . lappend dep
2b50: 65 6e 64 65 6e 63 69 65 73 28 24 72 69 64 29 20 endencies($rid)
2b60: 24 63 68 69 6c 64 0a 09 7d 0a 20 20 20 20 7d 0a $child..}. }.
2b70: 0a 20 20 20 20 70 72 6f 63 20 50 75 6c 6c 53 75 . proc PullSu
2b80: 63 63 65 73 73 6f 72 52 65 76 69 73 69 6f 6e 73 ccessorRevisions
2b90: 20 7b 64 76 20 72 65 76 69 73 69 6f 6e 73 7d 20 {dv revisions}
2ba0: 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76 20 64 {..upvar 1 $dv d
2bb0: 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 73 65 74 ependencies..set
2bc0: 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 theset ('[join
2bd0: 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d $revisions {','}
2be0: 5d 27 29 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 ]')...foreach {r
2bf0: 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 id child} [state
2c00: 20 72 75 6e 20 22 0a 20 20 20 2d 2d 20 50 72 69 run ". -- Pri
2c10: 6d 61 72 79 20 63 68 69 6c 64 72 65 6e 0a 09 20 mary children..
2c20: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c SELECT R.rid,
2c30: 20 52 2e 63 68 69 6c 64 0a 09 20 20 20 20 46 52 R.child.. FR
2c40: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 0a OM revision R.
2c50: 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 . WHERE R.ri
2c60: 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 0a 09 d IN $theset..
2c70: 20 20 20 20 41 4e 44 20 20 20 20 52 2e 63 68 69 AND R.chi
2c80: 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 0a 20 ld IS NOT NULL.
2c90: 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 UNION. --
2ca0: 54 72 61 6e 73 69 74 69 6f 6e 20 4e 54 44 42 20 Transition NTDB
2cb0: 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20 53 45 to trunk.. SE
2cc0: 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 64 62 LECT R.rid, R.db
2cd0: 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 child.. FROM
2ce0: 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 revision R..
2cf0: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 WHERE R.rid
2d00: 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 IN $theset..
2d10: 20 41 4e 44 20 20 20 20 52 2e 64 62 63 68 69 6c AND R.dbchil
2d20: 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 0a 20 20 d IS NOT NULL.
2d30: 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 53 UNION. -- S
2d40: 65 63 6f 6e 64 61 72 79 20 28 62 72 61 6e 63 68 econdary (branch
2d50: 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 ) children..
2d60: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 42 2e SELECT R.rid, B.
2d70: 62 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 brid.. FROM
2d80: 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 revision R, rev
2d90: 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64 isionbranchchild
2da0: 72 65 6e 20 42 0a 09 20 20 20 20 57 48 45 52 45 ren B.. WHERE
2db0: 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 R.rid IN $th
2dc0: 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 eset.. AND
2dd0: 20 52 2e 72 69 64 20 3d 20 42 2e 72 69 64 0a 09 R.rid = B.rid..
2de0: 22 5d 20 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 "] {.. # Cons
2df0: 69 64 65 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 ider moving this
2e00: 20 74 6f 20 74 68 65 20 69 6e 74 65 67 72 69 74 to the integrit
2e10: 79 20 6d 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 y module... i
2e20: 66 20 7b 24 72 69 64 20 3d 3d 20 24 63 68 69 6c f {$rid == $chil
2e30: 64 7d 20 7b 0a 09 09 74 72 6f 75 62 6c 65 20 69 d} {...trouble i
2e40: 6e 74 65 72 6e 61 6c 20 22 52 65 76 69 73 69 6f nternal "Revisio
2e50: 6e 20 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f n $rid depends o
2e60: 6e 20 69 74 73 65 6c 66 2e 22 0a 09 20 20 20 20 n itself."..
2e70: 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 }.. lappend d
2e80: 65 70 65 6e 64 65 6e 63 69 65 73 28 24 72 69 64 ependencies($rid
2e90: 29 20 24 63 68 69 6c 64 0a 09 7d 0a 20 20 20 20 ) $child..}.
2ea0: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 49 6e 69 74 }.. proc Init
2eb0: 69 61 6c 69 7a 65 42 72 65 61 6b 53 74 61 74 65 ializeBreakState
2ec0: 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 {revisions} {..
2ed0: 75 70 76 61 72 20 31 20 70 6f 73 20 70 6f 73 20 upvar 1 pos pos
2ee0: 63 72 6f 73 73 20 63 72 6f 73 73 20 72 61 6e 67 cross cross rang
2ef0: 65 20 72 61 6e 67 65 20 64 65 70 63 20 64 65 70 e range depc dep
2f00: 63 20 64 65 6c 74 61 20 64 65 6c 74 61 20 5c 0a c delta delta \.
2f10: 09 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65 . dependencie
2f20: 73 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 0a s dependencies..
2f30: 09 23 20 46 69 72 73 74 20 77 65 20 63 72 65 61 .# First we crea
2f40: 74 65 20 61 20 6d 61 70 20 6f 66 20 70 6f 73 69 te a map of posi
2f50: 74 69 6f 6e 73 20 74 6f 20 6d 61 6b 65 20 69 74 tions to make it
2f60: 20 65 61 73 69 65 72 20 74 6f 0a 09 23 20 64 65 easier to..# de
2f70: 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 termine whether
2f80: 61 20 64 65 70 65 6e 64 65 6e 63 79 20 63 72 6f a dependency cro
2f90: 73 73 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 sses a particula
2fa0: 72 20 69 6e 64 65 78 2e 0a 0a 09 61 72 72 61 79 r index....array
2fb0: 20 73 65 74 20 70 6f 73 20 20 20 7b 7d 0a 09 61 set pos {}..a
2fc0: 72 72 61 79 20 73 65 74 20 63 72 6f 73 73 20 7b rray set cross {
2fd0: 7d 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 70 }..array set dep
2fe0: 63 20 20 7b 7d 0a 09 73 65 74 20 72 61 6e 67 65 c {}..set range
2ff0: 20 20 20 20 20 20 20 7b 7d 0a 09 73 65 74 20 6e {}..set n
3000: 20 30 0a 09 66 6f 72 65 61 63 68 20 72 65 76 20 0..foreach rev
3010: 24 72 65 76 69 73 69 6f 6e 73 20 7b 20 0a 09 20 $revisions { ..
3020: 20 20 20 6c 61 70 70 65 6e 64 20 72 61 6e 67 65 lappend range
3030: 20 24 6e 0a 09 20 20 20 20 73 65 74 20 70 6f 73 $n.. set pos
3040: 28 24 72 65 76 29 20 24 6e 0a 09 20 20 20 20 73 ($rev) $n.. s
3050: 65 74 20 63 72 6f 73 73 28 24 6e 29 20 30 0a 09 et cross($n) 0..
3060: 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 0a 09 incr n..}...
3070: 23 20 53 65 63 6f 6e 64 6c 79 20 77 65 20 63 6f # Secondly we co
3080: 75 6e 74 20 74 68 65 20 63 72 6f 73 73 69 6e 67 unt the crossing
3090: 73 20 70 65 72 20 70 6f 73 69 74 69 6f 6e 2c 20 s per position,
30a0: 62 79 20 69 74 65 72 61 74 69 6e 67 0a 09 23 20 by iterating..#
30b0: 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64 65 over the recorde
30c0: 64 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e d internal depen
30d0: 64 65 6e 63 69 65 73 2e 0a 0a 09 23 20 4e 6f 74 dencies....# Not
30e0: 65 3a 20 49 66 20 74 68 65 20 74 69 6d 65 73 74 e: If the timest
30f0: 61 6d 70 73 20 61 72 65 20 62 61 64 6c 79 20 6f amps are badly o
3100: 75 74 20 6f 66 20 6f 72 64 65 72 20 69 74 20 69 ut of order it i
3110: 73 0a 09 23 20 20 20 20 20 20 20 70 6f 73 73 69 s..# possi
3120: 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20 62 61 ble to have a ba
3130: 63 6b 77 61 72 64 20 73 75 63 63 65 73 73 6f 72 ckward successor
3140: 20 64 65 70 65 6e 64 65 6e 63 79 2c 0a 09 23 20 dependency,..#
3150: 20 20 20 20 20 20 69 2e 65 2e 20 77 69 74 68 20 i.e. with
3160: 73 74 61 72 74 20 3e 20 65 6e 64 2e 20 57 65 20 start > end. We
3170: 6d 61 79 20 68 61 76 65 20 74 6f 20 73 77 61 70 may have to swap
3180: 20 74 68 65 20 69 6e 64 69 63 65 73 0a 09 23 20 the indices..#
3190: 20 20 20 20 20 20 74 6f 20 65 6e 73 75 72 65 20 to ensure
31a0: 74 68 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 that the followi
31b0: 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 63 6f 72 ng loop runs cor
31c0: 72 65 63 74 6c 79 2e 0a 09 23 0a 09 23 20 4e 6f rectly...#..# No
31d0: 74 65 20 32 3a 20 73 74 61 72 74 20 3d 3d 20 65 te 2: start == e
31e0: 6e 64 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 nd is not possib
31f0: 6c 65 2e 20 49 74 20 69 6e 64 69 63 61 74 65 73 le. It indicates
3200: 20 61 0a 09 23 20 20 20 20 20 20 20 20 20 73 65 a..# se
3210: 6c 66 2d 64 65 70 65 6e 64 65 6e 63 79 20 64 75 lf-dependency du
3220: 65 20 74 6f 20 74 68 65 20 75 6e 69 71 75 65 6e e to the uniquen
3230: 65 73 73 20 6f 66 20 70 6f 73 69 74 69 6f 6e 73 ess of positions
3240: 2c 0a 09 23 20 20 20 20 20 20 20 20 20 61 6e 64 ,..# and
3250: 20 74 68 61 74 20 69 73 20 73 6f 6d 65 74 68 69 that is somethi
3260: 6e 67 20 77 65 20 68 61 76 65 20 72 75 6c 65 64 ng we have ruled
3270: 20 6f 75 74 20 61 6c 72 65 61 64 79 2c 20 73 65 out already, se
3280: 65 0a 09 23 20 20 20 20 20 20 20 20 20 50 75 6c e..# Pul
3290: 6c 49 6e 74 65 72 6e 61 6c 53 75 63 63 65 73 73 lInternalSuccess
32a0: 6f 72 52 65 76 69 73 69 6f 6e 73 2e 0a 0a 09 66 orRevisions....f
32b0: 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c oreach {rid chil
32c0: 64 7d 20 5b 61 72 72 61 79 20 67 65 74 20 64 65 d} [array get de
32d0: 70 65 6e 64 65 6e 63 69 65 73 5d 20 7b 0a 09 20 pendencies] {..
32e0: 20 20 20 73 65 74 20 64 6b 65 79 20 20 20 20 5b set dkey [
32f0: 6c 69 73 74 20 24 72 69 64 20 24 63 68 69 6c 64 list $rid $child
3300: 5d 0a 09 20 20 20 20 73 65 74 20 73 74 61 72 74 ].. set start
3310: 20 20 20 24 70 6f 73 28 24 72 69 64 29 0a 09 20 $pos($rid)..
3320: 20 20 20 73 65 74 20 65 6e 64 20 20 20 20 20 24 set end $
3330: 70 6f 73 28 24 63 68 69 6c 64 29 0a 09 20 20 20 pos($child)..
3340: 20 73 65 74 20 63 72 6f 73 73 65 73 20 7b 7d 0a set crosses {}.
3350: 0a 09 20 20 20 20 69 66 20 7b 24 73 74 61 72 74 .. if {$start
3360: 20 3e 20 24 65 6e 64 7d 20 7b 0a 09 09 77 68 69 > $end} {...whi
3370: 6c 65 20 7b 24 65 6e 64 20 3c 20 24 73 74 61 72 le {$end < $star
3380: 74 7d 20 7b 0a 09 09 20 20 20 20 6c 61 70 70 65 t} {... lappe
3390: 6e 64 20 63 72 6f 73 73 65 73 20 24 65 6e 64 0a nd crosses $end.
33a0: 09 09 20 20 20 20 69 6e 63 72 20 63 72 6f 73 73 .. incr cross
33b0: 28 24 65 6e 64 29 0a 09 09 20 20 20 20 69 6e 63 ($end)... inc
33c0: 72 20 65 6e 64 0a 09 09 7d 0a 09 20 20 20 20 7d r end...}.. }
33d0: 20 65 6c 73 65 20 7b 0a 09 09 77 68 69 6c 65 20 else {...while
33e0: 7b 24 73 74 61 72 74 20 3c 20 24 65 6e 64 7d 20 {$start < $end}
33f0: 7b 0a 09 09 20 20 20 20 6c 61 70 70 65 6e 64 20 {... lappend
3400: 63 72 6f 73 73 65 73 20 24 73 74 61 72 74 0a 09 crosses $start..
3410: 09 20 20 20 20 69 6e 63 72 20 63 72 6f 73 73 28 . incr cross(
3420: 24 73 74 61 72 74 29 0a 09 09 20 20 20 20 69 6e $start)... in
3430: 63 72 20 73 74 61 72 74 0a 09 09 7d 0a 09 20 20 cr start...}..
3440: 20 20 7d 0a 09 20 20 20 20 73 65 74 20 64 65 70 }.. set dep
3450: 63 28 24 64 6b 65 79 29 20 24 63 72 6f 73 73 65 c($dkey) $crosse
3460: 73 0a 09 7d 0a 0a 09 49 6e 69 74 69 61 6c 69 7a s..}...Initializ
3470: 65 44 65 6c 74 61 73 20 24 72 65 76 69 73 69 6f eDeltas $revisio
3480: 6e 73 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d ns..return. }
3490: 0a 0a 20 20 20 20 70 72 6f 63 20 49 6e 69 74 69 .. proc Initi
34a0: 61 6c 69 7a 65 44 65 6c 74 61 73 20 7b 72 65 76 alizeDeltas {rev
34b0: 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 isions} {..upvar
34c0: 20 31 20 64 65 6c 74 61 20 64 65 6c 74 61 0a 0a 1 delta delta..
34d0: 09 23 20 50 75 6c 6c 20 74 68 65 20 74 69 6d 65 .# Pull the time
34e0: 73 74 61 6d 70 73 20 66 6f 72 20 61 6c 6c 20 72 stamps for all r
34f0: 65 76 69 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 evisions in the
3500: 63 68 61 6e 67 65 73 65 74 73 20 61 6e 64 0a 09 changesets and..
3510: 23 20 63 6f 6d 70 75 74 65 20 74 68 65 69 72 20 # compute their
3520: 64 65 6c 74 61 73 20 66 6f 72 20 75 73 65 20 62 deltas for use b
3530: 79 20 74 68 65 20 62 72 65 61 6b 20 66 69 6e 64 y the break find
3540: 65 72 2e 0a 0a 09 61 72 72 61 79 20 73 65 74 20 er....array set
3550: 64 65 6c 74 61 20 7b 7d 0a 09 61 72 72 61 79 20 delta {}..array
3560: 73 65 74 20 73 74 61 6d 70 20 7b 7d 0a 0a 09 73 set stamp {}...s
3570: 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 et theset ('[joi
3580: 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c n $revisions {',
3590: 27 7d 5d 27 29 0a 09 66 6f 72 65 61 63 68 20 7b '}]')..foreach {
35a0: 72 69 64 20 74 69 6d 65 7d 20 5b 73 74 61 74 65 rid time} [state
35b0: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 run ".. SELE
35c0: 43 54 20 52 2e 72 69 64 2c 20 52 2e 64 61 74 65 CT R.rid, R.date
35d0: 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73 .. FROM revis
35e0: 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 ion R.. WHERE
35f0: 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 R.rid IN $these
3600: 74 0a 09 22 5d 20 7b 0a 09 20 20 20 20 73 65 74 t.."] {.. set
3610: 20 73 74 61 6d 70 28 24 72 69 64 29 20 24 74 69 stamp($rid) $ti
3620: 6d 65 0a 09 7d 0a 0a 09 73 65 74 20 6e 20 30 0a me..}...set n 0.
3630: 09 66 6f 72 65 61 63 68 20 72 69 64 20 5b 6c 72 .foreach rid [lr
3640: 61 6e 67 65 20 24 72 65 76 69 73 69 6f 6e 73 20 ange $revisions
3650: 30 20 65 6e 64 2d 31 5d 20 72 6e 65 78 74 20 5b 0 end-1] rnext [
3660: 6c 72 61 6e 67 65 20 24 72 65 76 69 73 69 6f 6e lrange $revision
3670: 73 20 31 20 65 6e 64 5d 20 7b 0a 09 20 20 20 20 s 1 end] {..
3680: 73 65 74 20 64 65 6c 74 61 28 24 6e 29 20 5b 65 set delta($n) [e
3690: 78 70 72 20 7b 24 73 74 61 6d 70 28 24 72 6e 65 xpr {$stamp($rne
36a0: 78 74 29 20 2d 20 24 73 74 61 6d 70 28 24 72 69 xt) - $stamp($ri
36b0: 64 29 7d 5d 0a 09 20 20 20 20 69 6e 63 72 20 6e d)}].. incr n
36c0: 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 ..}..return.
36d0: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 46 69 6e 64 }.. proc Find
36e0: 42 65 73 74 42 72 65 61 6b 20 7b 72 61 6e 67 65 BestBreak {range
36f0: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 63 72 6f } {..upvar 1 cro
3700: 73 73 20 63 72 6f 73 73 20 64 65 6c 74 61 20 64 ss cross delta d
3710: 65 6c 74 61 0a 0a 09 23 20 44 65 74 65 72 6d 69 elta...# Determi
3720: 6e 65 20 74 68 65 20 62 65 73 74 20 62 72 65 61 ne the best brea
3730: 6b 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 k location in th
3740: 65 20 67 69 76 65 6e 20 72 61 6e 67 65 20 6f 66 e given range of
3750: 0a 09 23 20 70 6f 73 69 74 69 6f 6e 73 2e 20 46 ..# positions. F
3760: 69 72 73 74 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 irst we look for
3770: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 73 20 77 the locations w
3780: 69 74 68 20 74 68 65 20 6d 61 78 69 6d 61 6c 0a ith the maximal.
3790: 09 23 20 6e 75 6d 62 65 72 20 6f 66 20 63 72 6f .# number of cro
37a0: 73 73 69 6e 67 73 2e 20 49 66 20 74 68 65 72 65 ssings. If there
37b0: 20 61 72 65 20 73 65 76 65 72 61 6c 20 77 65 20 are several we
37c0: 6c 6f 6f 6b 20 66 6f 72 20 74 68 65 0a 09 23 20 look for the..#
37d0: 73 68 6f 72 74 65 73 74 20 74 69 6d 65 20 69 6e shortest time in
37e0: 74 65 72 76 61 6c 20 61 6d 6f 6e 67 20 74 68 65 terval among the
37f0: 6d 2e 20 49 66 20 77 65 20 73 74 69 6c 6c 20 68 m. If we still h
3800: 61 76 65 20 6d 75 6c 74 69 70 6c 65 0a 09 23 20 ave multiple..#
3810: 70 6f 73 73 69 62 69 6c 69 74 69 65 73 20 61 66 possibilities af
3820: 74 65 72 20 74 68 61 74 20 77 65 20 73 65 6c 65 ter that we sele
3830: 63 74 20 74 68 65 20 65 61 72 6c 69 65 73 74 20 ct the earliest
3840: 6c 6f 63 61 74 69 6f 6e 0a 09 23 20 61 6d 6f 6e location..# amon
3850: 67 20 74 68 65 73 65 2e 0a 0a 09 23 20 4e 6f 74 g these....# Not
3860: 65 3a 20 49 66 20 74 68 65 20 6d 61 78 69 6d 61 e: If the maxima
3870: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 72 6f 73 l number of cros
3880: 73 69 6e 67 73 20 69 73 20 30 20 74 68 65 6e 20 sings is 0 then
3890: 74 68 65 20 72 61 6e 67 65 0a 09 23 20 20 20 20 the range..#
38a0: 20 20 20 68 61 73 20 6e 6f 20 69 6e 74 65 72 6e has no intern
38b0: 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2c al dependencies,
38c0: 20 61 6e 64 20 6e 6f 20 62 72 65 61 6b 20 6c 6f and no break lo
38d0: 63 61 74 69 6f 6e 20 61 74 0a 09 23 20 20 20 20 cation at..#
38e0: 20 20 20 61 6c 6c 2e 20 54 68 69 73 20 70 6f 73 all. This pos
38f0: 73 69 62 69 6c 69 74 79 20 69 73 20 73 69 67 6e sibility is sign
3900: 61 6c 65 64 20 76 69 61 20 72 65 73 75 6c 74 20 aled via result
3910: 2d 31 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 41 20 -1....# Note: A
3920: 72 61 6e 67 65 20 6f 66 20 6c 65 6e 67 74 68 20 range of length
3930: 31 20 6f 72 20 6c 65 73 73 20 63 61 6e 6e 6f 74 1 or less cannot
3940: 20 68 61 76 65 20 69 6e 74 65 72 6e 61 6c 0a 09 have internal..
3950: 23 20 20 20 20 20 20 20 64 65 70 65 6e 64 65 6e # dependen
3960: 63 69 65 73 2c 20 61 73 20 74 68 61 74 20 6e 65 cies, as that ne
3970: 65 64 73 20 61 74 20 6c 65 61 73 74 20 74 77 6f eds at least two
3980: 20 72 65 76 69 73 69 6f 6e 73 20 69 6e 0a 09 23 revisions in..#
3990: 20 20 20 20 20 20 20 74 68 65 20 72 61 6e 67 65 the range
39a0: 2e 0a 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 ....if {[llength
39b0: 20 24 72 61 6e 67 65 5d 20 3c 20 32 7d 20 7b 20 $range] < 2} {
39c0: 72 65 74 75 72 6e 20 2d 31 20 7d 0a 0a 09 73 65 return -1 }...se
39d0: 74 20 6d 61 78 20 2d 31 0a 09 73 65 74 20 62 65 t max -1..set be
39e0: 73 74 20 7b 7d 0a 0a 09 66 6f 72 65 61 63 68 20 st {}...foreach
39f0: 6c 6f 63 61 74 69 6f 6e 20 24 72 61 6e 67 65 20 location $range
3a00: 7b 0a 09 20 20 20 20 73 65 74 20 63 72 6f 73 73 {.. set cross
3a10: 69 6e 67 73 20 24 63 72 6f 73 73 28 24 6c 6f 63 ings $cross($loc
3a20: 61 74 69 6f 6e 29 0a 09 20 20 20 20 69 66 20 7b ation).. if {
3a30: 24 63 72 6f 73 73 69 6e 67 73 20 3e 20 24 6d 61 $crossings > $ma
3a40: 78 7d 20 7b 0a 09 09 73 65 74 20 6d 61 78 20 20 x} {...set max
3a50: 24 63 72 6f 73 73 69 6e 67 73 0a 09 09 73 65 74 $crossings...set
3a60: 20 62 65 73 74 20 5b 6c 69 73 74 20 24 6c 6f 63 best [list $loc
3a70: 61 74 69 6f 6e 5d 0a 09 09 63 6f 6e 74 69 6e 75 ation]...continu
3a80: 65 0a 09 20 20 20 20 7d 20 65 6c 73 65 69 66 20 e.. } elseif
3a90: 7b 24 63 72 6f 73 73 69 6e 67 73 20 3d 3d 20 24 {$crossings == $
3aa0: 6d 61 78 7d 20 7b 0a 09 09 6c 61 70 70 65 6e 64 max} {...lappend
3ab0: 20 62 65 73 74 20 24 6c 6f 63 61 74 69 6f 6e 0a best $location.
3ac0: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b . }..}...if {
3ad0: 24 6d 61 78 20 3d 3d 20 30 7d 20 20 20 20 20 20 $max == 0}
3ae0: 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20 2d { return -
3af0: 31 20 7d 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 1 }..if {[llengt
3b00: 68 20 24 62 65 73 74 5d 20 3d 3d 20 31 7d 20 7b h $best] == 1} {
3b10: 20 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 return [lindex
3b20: 24 62 65 73 74 20 30 5d 20 7d 0a 0a 09 73 65 74 $best 0] }...set
3b30: 20 6c 6f 63 61 74 69 6f 6e 73 20 24 62 65 73 74 locations $best
3b40: 0a 09 73 65 74 20 62 65 73 74 20 7b 7d 0a 09 73 ..set best {}..s
3b50: 65 74 20 6d 69 6e 20 2d 31 0a 0a 09 66 6f 72 65 et min -1...fore
3b60: 61 63 68 20 6c 6f 63 61 74 69 6f 6e 20 24 6c 6f ach location $lo
3b70: 63 61 74 69 6f 6e 73 20 7b 0a 09 20 20 20 20 73 cations {.. s
3b80: 65 74 20 69 6e 74 65 72 76 61 6c 20 24 64 65 6c et interval $del
3b90: 74 61 28 24 6c 6f 63 61 74 69 6f 6e 29 0a 09 20 ta($location)..
3ba0: 20 20 20 69 66 20 7b 28 24 6d 69 6e 20 3c 20 30 if {($min < 0
3bb0: 29 20 7c 7c 20 28 24 69 6e 74 65 72 76 61 6c 20 ) || ($interval
3bc0: 3c 20 24 6d 69 6e 29 7d 20 7b 0a 09 09 73 65 74 < $min)} {...set
3bd0: 20 6d 69 6e 20 20 24 69 6e 74 65 72 76 61 6c 0a min $interval.
3be0: 09 09 73 65 74 20 62 65 73 74 20 5b 6c 69 73 74 ..set best [list
3bf0: 20 24 6c 6f 63 61 74 69 6f 6e 5d 0a 09 20 20 20 $location]..
3c00: 20 7d 20 65 6c 73 65 69 66 20 7b 24 69 6e 74 65 } elseif {$inte
3c10: 72 76 61 6c 20 3d 3d 20 24 6d 69 6e 7d 20 7b 0a rval == $min} {.
3c20: 09 09 6c 61 70 70 65 6e 64 20 62 65 73 74 20 24 ..lappend best $
3c30: 6c 6f 63 61 74 69 6f 6e 0a 09 20 20 20 20 7d 0a location.. }.
3c40: 09 7d 0a 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 .}...if {[llengt
3c50: 68 20 24 62 65 73 74 5d 20 3d 3d 20 31 7d 20 7b h $best] == 1} {
3c60: 20 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 return [lindex
3c70: 24 62 65 73 74 20 30 5d 20 7d 0a 0a 09 72 65 74 $best 0] }...ret
3c80: 75 72 6e 20 5b 6c 69 6e 64 65 78 20 5b 6c 73 6f urn [lindex [lso
3c90: 72 74 20 2d 69 6e 74 65 67 65 72 20 2d 69 6e 63 rt -integer -inc
3ca0: 72 65 61 73 69 6e 67 20 24 62 65 73 74 5d 20 30 reasing $best] 0
3cb0: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f ]. }.. pro
3cc0: 63 20 43 75 74 41 74 20 7b 6c 6f 63 61 74 69 6f c CutAt {locatio
3cd0: 6e 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 63 72 n} {..upvar 1 cr
3ce0: 6f 73 73 20 63 72 6f 73 73 20 64 65 70 63 20 64 oss cross depc d
3cf0: 65 70 63 0a 0a 09 23 20 49 74 20 77 61 73 20 64 epc...# It was d
3d00: 65 63 69 64 65 64 20 74 6f 20 73 70 6c 69 74 20 ecided to split
3d10: 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 61 74 the changeset at
3d20: 20 74 68 65 20 67 69 76 65 6e 0a 09 23 20 6c 6f the given..# lo
3d30: 63 61 74 69 6f 6e 2e 20 54 68 69 73 20 63 75 74 cation. This cut
3d40: 73 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 64 65 s a number of de
3d50: 70 65 6e 64 65 6e 63 69 65 73 2e 20 48 65 72 65 pendencies. Here
3d60: 20 77 65 20 75 70 64 61 74 65 0a 09 23 20 74 68 we update..# th
3d70: 65 20 63 72 6f 73 73 20 69 6e 66 6f 72 6d 61 74 e cross informat
3d80: 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 ion so that the
3d90: 62 72 65 61 6b 20 66 69 6e 64 65 72 20 68 61 73 break finder has
3da0: 20 61 63 63 75 72 61 74 65 0a 09 23 20 64 61 74 accurate..# dat
3db0: 61 20 77 68 65 6e 20 77 65 20 6c 6f 6f 6b 20 61 a when we look a
3dc0: 74 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 t the generated
3dd0: 66 72 61 67 6d 65 6e 74 73 2e 0a 0a 09 73 65 74 fragments....set
3de0: 20 73 69 78 20 5b 6c 6f 67 20 76 69 73 69 62 6c six [log visibl
3df0: 65 3f 20 36 5d 0a 0a 09 66 6f 72 65 61 63 68 20 e? 6]...foreach
3e00: 7b 64 65 70 20 72 61 6e 67 65 7d 20 5b 61 72 72 {dep range} [arr
3e10: 61 79 20 67 65 74 20 64 65 70 63 5d 20 7b 0a 09 ay get depc] {..
3e20: 20 20 20 20 23 20 43 68 65 63 6b 20 61 6c 6c 20 # Check all
3e30: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 73 74 69 dependencies sti
3e40: 6c 6c 20 6b 6e 6f 77 6e 2c 20 74 61 6b 65 20 74 ll known, take t
3e50: 68 65 69 72 20 72 61 6e 67 65 20 61 6e 64 0a 09 heir range and..
3e60: 20 20 20 20 23 20 73 65 65 20 69 66 20 74 68 65 # see if the
3e70: 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 break location
3e80: 66 61 6c 6c 73 20 77 69 74 68 69 6e 2e 0a 0a 09 falls within....
3e90: 20 20 20 20 42 6f 72 64 65 72 20 24 72 61 6e 67 Border $rang
3ea0: 65 20 73 20 65 0a 09 20 20 20 20 69 66 20 7b 24 e s e.. if {$
3eb0: 6c 6f 63 61 74 69 6f 6e 20 3c 20 24 73 7d 20 63 location < $s} c
3ec0: 6f 6e 74 69 6e 75 65 20 3b 20 23 20 62 72 65 61 ontinue ; # brea
3ed0: 6b 20 62 65 66 6f 72 65 20 72 61 6e 67 65 2c 20 k before range,
3ee0: 69 67 6e 6f 72 65 0a 09 20 20 20 20 69 66 20 7b ignore.. if {
3ef0: 24 6c 6f 63 61 74 69 6f 6e 20 3e 20 24 65 7d 20 $location > $e}
3f00: 63 6f 6e 74 69 6e 75 65 20 3b 20 23 20 62 72 65 continue ; # bre
3f10: 61 6b 20 61 66 74 65 72 20 72 61 6e 67 65 2c 20 ak after range,
3f20: 69 67 6e 6f 72 65 2e 0a 0a 09 20 20 20 20 23 20 ignore.... #
3f30: 54 68 69 73 20 64 65 70 65 6e 64 65 6e 63 79 20 This dependency
3f40: 63 72 6f 73 73 65 73 20 74 68 65 20 62 72 65 61 crosses the brea
3f50: 6b 20 6c 6f 63 61 74 69 6f 6e 2e 20 57 65 20 72 k location. We r
3f60: 65 6d 6f 76 65 20 69 74 0a 09 20 20 20 20 23 20 emove it.. #
3f70: 66 72 6f 6d 20 74 68 65 20 63 72 6f 73 73 69 6e from the crossin
3f80: 67 73 20 63 6f 75 6e 74 65 72 73 2c 20 61 6e 64 gs counters, and
3f90: 20 74 68 65 6e 20 61 6c 73 6f 20 66 72 6f 6d 20 then also from
3fa0: 74 68 65 20 73 65 74 0a 09 20 20 20 20 23 20 6f the set.. # o
3fb0: 66 20 6b 6e 6f 77 6e 20 64 65 70 65 6e 64 65 6e f known dependen
3fc0: 63 69 65 73 2c 20 61 73 20 77 65 20 61 72 65 20 cies, as we are
3fd0: 64 6f 6e 65 20 77 69 74 68 20 69 74 2e 0a 0a 09 done with it....
3fe0: 20 20 20 20 66 6f 72 65 61 63 68 20 6c 6f 63 20 foreach loc
3ff0: 24 64 65 70 63 28 24 64 65 70 29 20 7b 20 69 6e $depc($dep) { in
4000: 63 72 20 63 72 6f 73 73 28 24 6c 6f 63 29 20 2d cr cross($loc) -
4010: 31 20 7d 0a 09 20 20 20 20 75 6e 73 65 74 20 64 1 }.. unset d
4020: 65 70 63 28 24 64 65 70 29 0a 0a 09 20 20 20 20 epc($dep)...
4030: 69 66 20 7b 21 24 73 69 78 7d 20 63 6f 6e 74 69 if {!$six} conti
4040: 6e 75 65 0a 0a 09 20 20 20 20 73 74 72 75 63 74 nue... struct
4050: 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 24 64 ::list assign $d
4060: 65 70 20 70 61 72 65 6e 74 20 63 68 69 6c 64 0a ep parent child.
4070: 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 36 . log write 6
4080: 20 63 73 65 74 73 20 22 42 72 6f 6b 65 20 64 65 csets "Broke de
4090: 70 65 6e 64 65 6e 63 79 20 5b 50 44 20 24 70 61 pendency [PD $pa
40a0: 72 65 6e 74 5d 20 2d 2d 3e 20 5b 50 44 20 24 63 rent] --> [PD $c
40b0: 68 69 6c 64 5d 22 0a 09 7d 0a 0a 09 72 65 74 75 hild]"..}...retu
40c0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 rn. }.. #
40d0: 50 72 69 6e 74 20 69 64 65 6e 74 69 66 79 69 6e Print identifyin
40e0: 67 20 64 61 74 61 20 66 6f 72 20 61 20 72 65 76 g data for a rev
40f0: 69 73 69 6f 6e 20 28 70 72 6f 6a 65 63 74 2c 20 ision (project,
4100: 66 69 6c 65 2c 20 64 6f 74 74 65 64 20 72 65 76 file, dotted rev
4110: 0a 20 20 20 20 23 20 6e 75 6d 62 65 72 29 2c 20 . # number),
4120: 66 6f 72 20 68 69 67 68 20 76 65 72 62 6f 73 69 for high verbosi
4130: 74 79 20 6c 6f 67 20 6f 75 74 70 75 74 2e 0a 0a ty log output...
4140: 20 20 20 20 70 72 6f 63 20 50 44 20 7b 69 64 7d proc PD {id}
4150: 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b 70 20 66 {..foreach {p f
4160: 20 72 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 7b r} [state run {
4170: 0a 09 09 53 45 4c 45 43 54 20 50 2e 6e 61 6d 65 ...SELECT P.name
4180: 20 2c 20 46 2e 6e 61 6d 65 2c 20 52 2e 72 65 76 , F.name, R.rev
4190: 0a 09 09 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e ...FROM revision
41a0: 20 52 2c 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a R, file F, proj
41b0: 65 63 74 20 50 0a 09 09 57 48 45 52 45 20 52 2e ect P...WHERE R.
41c0: 72 69 64 20 3d 20 24 69 64 0a 09 09 41 4e 44 20 rid = $id...AND
41d0: 20 20 52 2e 66 69 64 20 3d 20 46 2e 66 69 64 0a R.fid = F.fid.
41e0: 09 09 41 4e 44 20 20 20 46 2e 70 69 64 20 3d 20 ..AND F.pid =
41f0: 50 2e 70 69 64 0a 09 7d 5d 20 62 72 65 61 6b 0a P.pid..}] break.
4200: 09 72 65 74 75 72 6e 20 22 27 24 70 20 3a 20 24 .return "'$p : $
4210: 66 2f 24 72 27 22 0a 20 20 20 20 7d 0a 0a 20 20 f/$r'". }..
4220: 20 20 23 20 50 72 69 6e 74 69 6e 67 20 6f 6e 65 # Printing one
4230: 20 6f 72 20 6d 6f 72 65 20 72 61 6e 67 65 73 2c or more ranges,
4240: 20 66 6f 72 6d 61 74 74 65 64 2c 20 61 6e 64 20 formatted, and
4250: 6f 6e 6c 79 20 74 68 65 69 72 20 62 6f 72 64 65 only their borde
4260: 72 20 74 6f 0a 20 20 20 20 23 20 6b 65 65 70 20 r to. # keep
4270: 74 68 65 20 73 74 72 69 6e 67 73 20 73 68 6f 72 the strings shor
4280: 74 2e 0a 0a 20 20 20 20 70 72 6f 63 20 50 52 73 t... proc PRs
4290: 20 7b 72 61 6e 67 65 73 7d 20 7b 0a 09 72 65 74 {ranges} {..ret
42a0: 75 72 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 urn [struct::lis
42b0: 74 20 6d 61 70 20 24 72 61 6e 67 65 73 20 5b 6d t map $ranges [m
42c0: 79 70 72 6f 63 20 50 52 5d 5d 0a 20 20 20 20 7d yproc PR]]. }
42d0: 0a 0a 20 20 20 20 70 72 6f 63 20 50 52 20 7b 72 .. proc PR {r
42e0: 61 6e 67 65 7d 20 7b 0a 09 42 6f 72 64 65 72 20 ange} {..Border
42f0: 24 72 61 6e 67 65 20 73 20 65 0a 09 72 65 74 75 $range s e..retu
4300: 72 6e 20 3c 24 7b 73 7d 2e 2e 2e 24 7b 65 7d 3e rn <${s}...${e}>
4310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 . }.. proc
4320: 20 42 6f 72 64 65 72 20 7b 72 61 6e 67 65 20 73 Border {range s
4330: 76 20 65 76 7d 20 7b 0a 09 75 70 76 61 72 20 31 v ev} {..upvar 1
4340: 20 24 73 76 20 73 20 24 65 76 20 65 0a 09 73 65 $sv s $ev e..se
4350: 74 20 73 20 5b 6c 69 6e 64 65 78 20 24 72 61 6e t s [lindex $ran
4360: 67 65 20 30 5d 0a 09 73 65 74 20 65 20 5b 6c 69 ge 0]..set e [li
4370: 6e 64 65 78 20 24 72 61 6e 67 65 20 65 6e 64 5d ndex $range end]
4380: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a ..return. }..
4390: 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23 # # ## ### #
43a0: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 #### ######## ##
43b0: 23 23 23 23 23 23 23 23 23 23 23 0a 0a 20 20 20 ###########..
43c0: 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 typevariable my
43d0: 63 68 61 6e 67 65 73 65 74 73 20 20 20 20 7b 7d changesets {}
43e0: 20 3b 20 23 20 4c 69 73 74 20 6f 66 20 61 6c 6c ; # List of all
43f0: 20 6b 6e 6f 77 6e 20 63 68 61 6e 67 65 73 65 74 known changeset
4400: 73 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 s.. typevaria
4410: 62 6c 65 20 6d 79 72 65 76 6d 61 70 20 2d 61 72 ble myrevmap -ar
4420: 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 66 ray {} ; # Map f
4430: 72 6f 6d 20 72 65 76 69 73 69 6f 6e 73 20 74 6f rom revisions to
4440: 20 74 68 65 69 72 20 63 68 61 6e 67 65 73 65 74 their changeset
4450: 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62 .. typevariab
4460: 6c 65 20 6d 79 69 64 6d 61 70 20 20 2d 61 72 72 le myidmap -arr
4470: 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 66 72 ay {} ; # Map fr
4480: 6f 6d 20 63 68 61 6e 67 65 73 65 74 20 69 64 20 om changeset id
4490: 74 6f 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 20 to changeset...
44a0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 61 6c typemethod al
44b0: 6c 20 7b 7d 20 20 20 7b 20 72 65 74 75 72 6e 20 l {} { return
44c0: 24 6d 79 63 68 61 6e 67 65 73 65 74 73 20 7d 0a $mychangesets }.
44d0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6f typemethod o
44e0: 66 20 20 7b 69 64 7d 20 7b 20 72 65 74 75 72 6e f {id} { return
44f0: 20 24 6d 79 69 64 6d 61 70 28 24 69 64 29 20 7d $myidmap($id) }
4500: 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23 .. # # ## ###
4510: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 ##### ########
4520: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 20 #############.
4530: 20 20 23 23 20 43 6f 6e 66 69 67 75 72 61 74 69 ## Configurati
4540: 6f 6e 0a 0a 20 20 20 20 70 72 61 67 6d 61 20 2d on.. pragma -
4550: 68 61 73 74 79 70 65 69 6e 66 6f 20 20 20 20 6e hastypeinfo n
4560: 6f 20 20 3b 20 23 20 6e 6f 20 74 79 70 65 20 69 o ; # no type i
4570: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20 20 20 ntrospection.
4580: 20 70 72 61 67 6d 61 20 2d 68 61 73 69 6e 66 6f pragma -hasinfo
4590: 20 20 20 20 20 20 20 20 6e 6f 20 20 3b 20 23 20 no ; #
45a0: 6e 6f 20 6f 62 6a 65 63 74 20 69 6e 74 72 6f 73 no object intros
45b0: 70 65 63 74 69 6f 6e 0a 20 20 20 20 70 72 61 67 pection. prag
45c0: 6d 61 20 2d 73 69 6d 70 6c 65 64 69 73 70 61 74 ma -simpledispat
45d0: 63 68 20 79 65 73 20 3b 20 23 20 73 69 6d 70 6c ch yes ; # simpl
45e0: 65 20 66 61 73 74 20 64 69 73 70 61 74 63 68 0a e fast dispatch.
45f0: 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20 . # # ## ###
4600: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 ##### ######## #
4610: 23 23 23 23 23 23 23 23 23 23 23 23 0a 7d 0a 0a ############.}..
4620: 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a namespace eval :
4630: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 :vc::fossil::imp
4640: 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 ort::cvs::projec
4650: 74 20 7b 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 t {. namespac
4660: 65 20 65 78 70 6f 72 74 20 72 65 76 0a 20 20 20 e export rev.
4670: 20 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 namespace eval
4680: 72 65 76 20 7b 0a 09 6e 61 6d 65 73 70 61 63 65 rev {..namespace
4690: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f import ::vc::fo
46a0: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 ssil::import::cv
46b0: 73 3a 3a 73 74 61 74 65 0a 09 6e 61 6d 65 73 70 s::state..namesp
46c0: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a ace import ::vc:
46d0: 3a 74 6f 6f 6c 73 3a 3a 6d 69 73 63 3a 3a 2a 0a :tools::misc::*.
46e0: 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 .namespace impor
46f0: 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 74 t ::vc::tools::t
4700: 72 6f 75 62 6c 65 0a 09 6e 61 6d 65 73 70 61 63 rouble..namespac
4710: 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 e import ::vc::t
4720: 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 6c 6f 67 20 72 ools::log..log r
4730: 65 67 69 73 74 65 72 20 63 73 65 74 73 0a 20 20 egister csets.
4740: 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 }.}..# # ## ##
4750: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 # ##### ########
4760: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23 ############# #
4770: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
4780: 23 23 23 23 0a 23 23 20 52 65 61 64 79 0a 0a 70 ####.## Ready..p
4790: 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20 76 ackage provide v
47a0: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 c::fossil::impor
47b0: 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a t::cvs::project:
47c0: 3a 72 65 76 20 31 2e 30 0a 72 65 74 75 72 6e 0a :rev 1.0.return.