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 70 72 6f 6a 65 63 74 3a 3a ::cvs::project::
04c0: 73 79 6d 20 3b 20 23 20 50 72 6f 6a 65 63 74 20 sym ; # Project
04d0: 6c 65 76 65 6c 20 73 79 6d 62 6f 6c 73 0a 0a 23 level symbols..#
04e0: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 # ## ### #####
04f0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
0500: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 ###### #########
0510: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 ############.##
0520: 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20 3a 3a 76 ..snit::type ::v
0530: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 c::fossil::impor
0540: 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a t::cvs::project:
0550: 3a 72 65 76 20 7b 0a 20 20 20 20 23 20 23 20 23 :rev {. # # #
0560: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 # ### ##### ####
0570: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 #### ###########
0580: 23 23 0a 20 20 20 20 23 23 20 50 75 62 6c 69 63 ##. ## Public
0590: 20 41 50 49 0a 0a 20 20 20 20 63 6f 6e 73 74 72 API.. constr
05a0: 75 63 74 6f 72 20 7b 70 72 6f 6a 65 63 74 20 63 uctor {project c
05b0: 73 74 79 70 65 20 73 72 63 69 64 20 72 65 76 69 stype srcid revi
05c0: 73 69 6f 6e 73 20 7b 74 68 65 69 64 20 7b 7d 7d sions {theid {}}
05d0: 7d 20 7b 0a 09 69 66 20 7b 24 74 68 65 69 64 20 } {..if {$theid
05e0: 6e 65 20 22 22 7d 20 7b 0a 09 20 20 20 20 73 65 ne ""} {.. se
05f0: 74 20 6d 79 69 64 20 24 74 68 65 69 64 0a 09 7d t myid $theid..}
0600: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 73 65 74 else {.. set
0610: 20 6d 79 69 64 20 5b 69 6e 63 72 20 6d 79 63 6f myid [incr myco
0620: 75 6e 74 65 72 5d 0a 09 7d 0a 0a 09 73 65 74 20 unter]..}...set
0630: 6d 79 70 72 6f 6a 65 63 74 20 20 20 24 70 72 6f myproject $pro
0640: 6a 65 63 74 0a 09 73 65 74 20 6d 79 74 79 70 65 ject..set mytype
0650: 20 20 20 20 20 20 24 63 73 74 79 70 65 09 20 20 $cstype.
0660: 0a 09 73 65 74 20 6d 79 73 72 63 69 64 09 24 73 ..set mysrcid.$s
0670: 72 63 69 64 09 20 20 0a 09 73 65 74 20 6d 79 72 rcid. ..set myr
0680: 65 76 69 73 69 6f 6e 73 20 24 72 65 76 69 73 69 evisions $revisi
0690: 6f 6e 73 0a 09 73 65 74 20 6d 79 70 6f 73 20 20 ons..set mypos
06a0: 20 20 20 20 20 7b 7d 20 3b 20 23 20 43 6f 6d 6d {} ; # Comm
06b0: 69 74 20 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6e it location is n
06c0: 6f 74 20 6b 6e 6f 77 6e 20 79 65 74 2e 0a 0a 09 ot known yet....
06d0: 23 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 # Keep track of
06e0: 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 63 68 the generated ch
06f0: 61 6e 67 65 73 65 74 73 20 61 6e 64 20 6f 66 20 angesets and of
0700: 74 68 65 20 69 6e 76 65 72 73 65 0a 09 23 20 6d the inverse..# m
0710: 61 70 70 69 6e 67 20 66 72 6f 6d 20 72 65 76 69 apping from revi
0720: 73 69 6f 6e 73 20 74 6f 20 74 68 65 6d 2e 0a 09 sions to them...
0730: 6c 61 70 70 65 6e 64 20 6d 79 63 68 61 6e 67 65 lappend mychange
0740: 73 65 74 73 20 20 20 24 73 65 6c 66 0a 09 73 65 sets $self..se
0750: 74 20 20 20 20 20 6d 79 69 64 6d 61 70 28 24 6d t myidmap($m
0760: 79 69 64 29 20 24 73 65 6c 66 0a 09 66 6f 72 65 yid) $self..fore
0770: 61 63 68 20 72 20 24 72 65 76 69 73 69 6f 6e 73 ach r $revisions
0780: 20 7b 20 73 65 74 20 6d 79 72 65 76 6d 61 70 28 { set myrevmap(
0790: 24 72 29 20 24 73 65 6c 66 20 7d 0a 09 72 65 74 $r) $self }..ret
07a0: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d urn. }.. m
07b0: 65 74 68 6f 64 20 69 64 20 20 20 20 20 20 20 20 ethod id
07c0: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 {} { return $myi
07d0: 64 20 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20 72 d }. method r
07e0: 65 76 69 73 69 6f 6e 73 20 7b 7d 20 7b 20 72 65 evisions {} { re
07f0: 74 75 72 6e 20 24 6d 79 72 65 76 69 73 69 6f 6e turn $myrevision
0800: 73 20 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20 64 s }. method d
0810: 61 74 61 20 20 20 20 20 20 7b 7d 20 7b 20 72 65 ata {} { re
0820: 74 75 72 6e 20 5b 6c 69 73 74 20 24 6d 79 70 72 turn [list $mypr
0830: 6f 6a 65 63 74 20 24 6d 79 74 79 70 65 20 24 6d oject $mytype $m
0840: 79 73 72 63 69 64 5d 20 7d 0a 0a 20 20 20 20 6d ysrcid] }.. m
0850: 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 ethod bysymbol
0860: 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 5b 65 78 {} { return [ex
0870: 70 72 20 7b 24 6d 79 74 79 70 65 20 65 71 20 22 pr {$mytype eq "
0880: 73 79 6d 22 7d 5d 20 7d 0a 20 20 20 20 6d 65 74 sym"}] }. met
0890: 68 6f 64 20 62 79 72 65 76 69 73 69 6f 6e 20 7b hod byrevision {
08a0: 7d 20 7b 20 72 65 74 75 72 6e 20 5b 65 78 70 72 } { return [expr
08b0: 20 7b 24 6d 79 74 79 70 65 20 65 71 20 22 72 65 {$mytype eq "re
08c0: 76 22 7d 5d 20 7d 0a 0a 20 20 20 20 6d 65 74 68 v"}] }.. meth
08d0: 6f 64 20 73 65 74 70 6f 73 20 7b 70 7d 20 7b 20 od setpos {p} {
08e0: 73 65 74 20 6d 79 70 6f 73 20 24 70 20 3b 20 72 set mypos $p ; r
08f0: 65 74 75 72 6e 20 7d 0a 20 20 20 20 6d 65 74 68 eturn }. meth
0900: 6f 64 20 70 6f 73 20 20 20 20 7b 7d 20 20 7b 20 od pos {} {
0910: 72 65 74 75 72 6e 20 24 6d 79 70 6f 73 20 7d 0a return $mypos }.
0920: 0a 20 20 20 20 6d 65 74 68 6f 64 20 69 73 62 72 . method isbr
0930: 61 6e 63 68 20 7b 7d 20 7b 0a 09 72 65 74 75 72 anch {} {..retur
0940: 6e 20 5b 65 78 70 72 20 7b 28 24 6d 79 74 79 70 n [expr {($mytyp
0950: 65 20 65 71 20 22 73 79 6d 22 29 20 26 26 0a 09 e eq "sym") &&..
0960: 09 20 20 20 20 20 20 28 24 6d 79 62 72 61 6e 63 . ($mybranc
0970: 68 63 6f 64 65 20 3d 3d 20 5b 73 74 61 74 65 20 hcode == [state
0980: 6f 6e 65 20 7b 0a 09 09 09 20 20 53 45 4c 45 43 one {.... SELEC
0990: 54 20 74 79 70 65 20 46 52 4f 4d 20 73 79 6d 62 T type FROM symb
09a0: 6f 6c 20 57 48 45 52 45 20 73 69 64 20 3d 20 24 ol WHERE sid = $
09b0: 6d 79 73 72 63 69 64 0a 09 09 20 20 20 20 20 20 mysrcid...
09c0: 7d 5d 29 7d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 }])}]. }..
09d0: 20 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f method successo
09e0: 72 6d 61 70 20 7b 7d 20 7b 0a 09 23 20 4e 4f 54 rmap {} {..# NOT
09f0: 45 20 2f 20 46 55 54 55 52 45 3a 20 50 6f 73 73 E / FUTURE: Poss
0a00: 69 62 6c 65 20 62 6f 74 74 6c 65 6e 65 63 6b 2e ible bottleneck.
0a10: 0a 09 61 72 72 61 79 20 73 65 74 20 74 6d 70 20 ..array set tmp
0a20: 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 65 76 {}..foreach {rev
0a30: 20 63 68 69 6c 64 72 65 6e 7d 20 5b 24 73 65 6c children} [$sel
0a40: 66 20 6e 65 78 74 6d 61 70 5d 20 7b 0a 09 20 20 f nextmap] {..
0a50: 20 20 66 6f 72 65 61 63 68 20 63 68 69 6c 64 20 foreach child
0a60: 24 63 68 69 6c 64 72 65 6e 20 7b 0a 09 09 6c 61 $children {...la
0a70: 70 70 65 6e 64 20 74 6d 70 28 24 72 65 76 29 20 ppend tmp($rev)
0a80: 24 6d 79 72 65 76 6d 61 70 28 24 63 68 69 6c 64 $myrevmap($child
0a90: 29 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73 65 ).. }.. se
0aa0: 74 20 74 6d 70 28 24 72 65 76 29 20 5b 6c 73 6f t tmp($rev) [lso
0ab0: 72 74 20 2d 75 6e 69 71 75 65 20 24 74 6d 70 28 rt -unique $tmp(
0ac0: 24 72 65 76 29 5d 0a 09 7d 0a 09 72 65 74 75 72 $rev)]..}..retur
0ad0: 6e 20 5b 61 72 72 61 79 20 67 65 74 20 74 6d 70 n [array get tmp
0ae0: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 ]. }.. met
0af0: 68 6f 64 20 73 75 63 63 65 73 73 6f 72 73 20 7b hod successors {
0b00: 7d 20 7b 0a 09 23 20 4e 4f 54 45 20 2f 20 46 55 } {..# NOTE / FU
0b10: 54 55 52 45 3a 20 50 6f 73 73 69 62 6c 65 20 62 TURE: Possible b
0b20: 6f 74 74 6c 65 6e 65 63 6b 2e 0a 09 73 65 74 20 ottleneck...set
0b30: 63 73 65 74 73 20 7b 7d 0a 09 66 6f 72 65 61 63 csets {}..foreac
0b40: 68 20 7b 5f 20 63 68 69 6c 64 72 65 6e 7d 20 5b h {_ children} [
0b50: 24 73 65 6c 66 20 6e 65 78 74 6d 61 70 5d 20 7b $self nextmap] {
0b60: 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 63 68 .. foreach ch
0b70: 69 6c 64 20 24 63 68 69 6c 64 72 65 6e 20 7b 0a ild $children {.
0b80: 09 09 6c 61 70 70 65 6e 64 20 63 73 65 74 73 20 ..lappend csets
0b90: 24 6d 79 72 65 76 6d 61 70 28 24 63 68 69 6c 64 $myrevmap($child
0ba0: 29 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72 65 74 ).. }..}..ret
0bb0: 75 72 6e 20 5b 6c 73 6f 72 74 20 2d 75 6e 69 71 urn [lsort -uniq
0bc0: 75 65 20 24 63 73 65 74 73 5d 0a 20 20 20 20 7d ue $csets]. }
0bd0: 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 70 72 65 .. method pre
0be0: 64 65 63 65 73 73 6f 72 6d 61 70 20 7b 7d 20 7b decessormap {} {
0bf0: 0a 09 23 20 4e 4f 54 45 20 2f 20 46 55 54 55 52 ..# NOTE / FUTUR
0c00: 45 3a 20 50 6f 73 73 69 62 6c 65 20 62 6f 74 74 E: Possible bott
0c10: 6c 65 6e 65 63 6b 2e 0a 09 61 72 72 61 79 20 73 leneck...array s
0c20: 65 74 20 74 6d 70 20 7b 7d 0a 09 66 6f 72 65 61 et tmp {}..forea
0c30: 63 68 20 7b 72 65 76 20 63 68 69 6c 64 72 65 6e ch {rev children
0c40: 7d 20 5b 24 73 65 6c 66 20 70 72 65 6d 61 70 5d } [$self premap]
0c50: 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 {.. foreach
0c60: 63 68 69 6c 64 20 24 63 68 69 6c 64 72 65 6e 20 child $children
0c70: 7b 0a 09 09 6c 61 70 70 65 6e 64 20 74 6d 70 28 {...lappend tmp(
0c80: 24 72 65 76 29 20 24 6d 79 72 65 76 6d 61 70 28 $rev) $myrevmap(
0c90: 24 63 68 69 6c 64 29 0a 09 20 20 20 20 7d 0a 09 $child).. }..
0ca0: 20 20 20 20 73 65 74 20 74 6d 70 28 24 72 65 76 set tmp($rev
0cb0: 29 20 5b 6c 73 6f 72 74 20 2d 75 6e 69 71 75 65 ) [lsort -unique
0cc0: 20 24 74 6d 70 28 24 72 65 76 29 5d 0a 09 7d 0a $tmp($rev)]..}.
0cd0: 09 72 65 74 75 72 6e 20 5b 61 72 72 61 79 20 67 .return [array g
0ce0: 65 74 20 74 6d 70 5d 0a 20 20 20 20 7d 0a 0a 20 et tmp]. }..
0cf0: 20 20 20 23 20 72 65 76 69 73 69 6f 6e 20 2d 3e # revision ->
0d00: 20 6c 69 73 74 20 28 72 65 76 69 73 69 6f 6e 29 list (revision)
0d10: 0a 20 20 20 20 6d 65 74 68 6f 64 20 6e 65 78 74 . method next
0d20: 6d 61 70 20 7b 7d 20 7b 0a 09 69 66 20 7b 5b 6c map {} {..if {[l
0d30: 6c 65 6e 67 74 68 20 24 6d 79 6e 65 78 74 6d 61 length $mynextma
0d40: 70 5d 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 p]} { return $my
0d50: 6e 65 78 74 6d 61 70 20 7d 0a 09 50 75 6c 6c 53 nextmap }..PullS
0d60: 75 63 63 65 73 73 6f 72 52 65 76 69 73 69 6f 6e uccessorRevision
0d70: 73 20 74 6d 70 20 24 6d 79 72 65 76 69 73 69 6f s tmp $myrevisio
0d80: 6e 73 0a 09 73 65 74 20 6d 79 6e 65 78 74 6d 61 ns..set mynextma
0d90: 70 20 5b 61 72 72 61 79 20 67 65 74 20 74 6d 70 p [array get tmp
0da0: 5d 0a 09 72 65 74 75 72 6e 20 24 6d 79 6e 65 78 ]..return $mynex
0db0: 74 6d 61 70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 tmap. }..
0dc0: 23 20 72 65 76 69 73 69 6f 6e 20 2d 3e 20 6c 69 # revision -> li
0dd0: 73 74 20 28 72 65 76 69 73 69 6f 6e 29 0a 20 20 st (revision).
0de0: 20 20 6d 65 74 68 6f 64 20 70 72 65 6d 61 70 20 method premap
0df0: 7b 7d 20 7b 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 {} {..if {[lleng
0e00: 74 68 20 24 6d 79 70 72 65 6d 61 70 5d 7d 20 7b th $mypremap]} {
0e10: 20 72 65 74 75 72 6e 20 24 6d 79 70 72 65 6d 61 return $myprema
0e20: 70 20 7d 0a 09 50 75 6c 6c 50 72 65 64 65 63 65 p }..PullPredece
0e30: 73 73 6f 72 52 65 76 69 73 69 6f 6e 73 20 74 6d ssorRevisions tm
0e40: 70 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 0a 09 p $myrevisions..
0e50: 73 65 74 20 6d 79 70 72 65 6d 61 70 20 5b 61 72 set mypremap [ar
0e60: 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 09 72 65 ray get tmp]..re
0e70: 74 75 72 6e 20 24 6d 79 70 72 65 6d 61 70 0a 20 turn $mypremap.
0e80: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 }.. method
0e90: 20 62 72 65 61 6b 69 6e 74 65 72 6e 61 6c 64 65 breakinternalde
0ea0: 70 65 6e 64 65 6e 63 69 65 73 20 7b 7d 20 7b 0a pendencies {} {.
0eb0: 09 23 20 54 68 69 73 20 6d 65 74 68 6f 64 20 69 .# This method i
0ec0: 6e 73 70 65 63 74 73 20 74 68 65 20 63 68 61 6e nspects the chan
0ed0: 67 65 73 65 74 73 20 66 6f 72 20 69 6e 74 65 72 gesets for inter
0ee0: 6e 61 6c 0a 09 23 20 64 65 70 65 6e 64 65 6e 63 nal..# dependenc
0ef0: 69 65 73 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 ies. Nothing is
0f00: 64 6f 6e 65 20 69 66 20 74 68 65 72 65 20 61 72 done if there ar
0f10: 65 20 6e 6f 0a 09 23 20 73 75 63 68 2e 20 4f 74 e no..# such. Ot
0f20: 68 65 72 77 69 73 65 20 74 68 65 20 63 68 61 6e herwise the chan
0f30: 67 65 73 65 74 20 69 73 20 73 70 6c 69 74 20 69 geset is split i
0f40: 6e 74 6f 20 61 20 73 65 74 20 6f 66 0a 09 23 20 nto a set of..#
0f50: 66 72 61 67 6d 65 6e 74 73 20 77 69 74 68 6f 75 fragments withou
0f60: 74 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e t internal depen
0f70: 64 65 6e 63 69 65 73 2c 20 74 72 61 6e 73 66 6f dencies, transfo
0f80: 72 6d 69 6e 67 20 74 68 65 0a 09 23 20 69 6e 74 rming the..# int
0f90: 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 ernal dependenci
0fa0: 65 73 20 69 6e 74 6f 20 65 78 74 65 72 6e 61 6c es into external
0fb0: 20 6f 6e 65 73 2e 20 54 68 65 20 6e 65 77 20 63 ones. The new c
0fc0: 68 61 6e 67 65 73 65 74 73 0a 09 23 20 61 72 65 hangesets..# are
0fd0: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69 added to the li
0fe0: 73 74 20 6f 66 20 61 6c 6c 20 63 68 61 6e 67 65 st of all change
0ff0: 73 65 74 73 2e 0a 0a 09 23 20 57 65 20 70 65 72 sets....# We per
1000: 66 6f 72 6d 20 61 6c 6c 20 6e 65 63 65 73 73 61 form all necessa
1010: 72 79 20 73 70 6c 69 74 73 20 69 6e 20 6f 6e 65 ry splits in one
1020: 20 67 6f 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 go, instead of
1030: 6f 6e 6c 79 0a 09 23 20 6f 6e 65 2e 20 54 68 65 only..# one. The
1040: 20 70 72 65 76 69 6f 75 73 20 61 6c 67 6f 72 69 previous algori
1050: 74 68 6d 2c 20 61 64 61 70 74 65 64 20 66 72 6f thm, adapted fro
1060: 6d 20 63 76 73 32 73 76 6e 2c 20 63 6f 6d 70 75 m cvs2svn, compu
1070: 74 65 64 0a 09 23 20 61 20 6c 6f 74 20 6f 66 20 ted..# a lot of
1080: 73 74 61 74 65 20 77 68 69 63 68 20 77 61 73 20 state which was
1090: 74 68 72 6f 77 6e 20 61 77 61 79 20 61 6e 64 20 thrown away and
10a0: 74 68 65 6e 20 63 6f 6d 70 75 74 65 64 20 61 67 then computed ag
10b0: 61 69 6e 0a 09 23 20 66 6f 72 20 65 61 63 68 20 ain..# for each
10c0: 6f 66 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 of the fragments
10d0: 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 65 . It should be e
10e0: 61 73 69 65 72 20 74 6f 20 75 70 64 61 74 65 20 asier to update
10f0: 61 6e 64 0a 09 23 20 72 65 75 73 65 20 74 68 61 and..# reuse tha
1100: 74 20 73 74 61 74 65 2e 0a 0a 09 23 20 54 68 65 t state....# The
1110: 20 63 6f 64 65 20 63 68 65 63 6b 73 20 6f 6e 6c code checks onl
1120: 79 20 73 75 63 65 73 73 6f 72 20 64 65 70 65 6e y sucessor depen
1130: 64 65 6e 63 69 65 73 2c 20 61 73 20 74 68 69 73 dencies, as this
1140: 0a 09 23 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c ..# automaticall
1150: 79 20 63 6f 76 65 72 73 20 74 68 65 20 70 72 65 y covers the pre
1160: 64 65 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 decessor depende
1170: 6e 63 69 65 73 20 61 73 20 77 65 6c 6c 20 28 41 ncies as well (A
1180: 0a 09 23 20 73 75 63 63 65 73 73 6f 72 20 64 65 ..# successor de
1190: 70 65 6e 64 65 6e 63 79 20 61 20 2d 3e 20 62 20 pendency a -> b
11a0: 69 73 20 61 6c 73 6f 20 61 20 70 72 65 64 65 63 is also a predec
11b0: 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 79 essor dependency
11c0: 0a 09 23 20 62 20 2d 3e 20 61 29 2e 0a 0a 09 23 ..# b -> a)....#
11d0: 20 41 72 72 61 79 20 6f 66 20 64 65 70 65 6e 64 Array of depend
11e0: 65 6e 63 69 65 73 20 28 70 61 72 65 6e 74 20 2d encies (parent -
11f0: 3e 20 63 68 69 6c 64 29 2e 20 54 68 69 73 20 69 > child). This i
1200: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 0a 09 23 s pulled from..#
1210: 20 74 68 65 20 73 74 61 74 65 2c 20 61 6e 64 20 the state, and
1220: 6c 69 6d 69 74 65 64 20 74 6f 20 73 75 63 63 65 limited to succe
1230: 73 73 6f 72 73 20 77 69 74 68 69 6e 20 74 68 65 ssors within the
1240: 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 61 72 changeset....ar
1250: 72 61 79 20 73 65 74 20 64 65 70 65 6e 64 65 6e ray set dependen
1260: 63 69 65 73 20 7b 7d 0a 09 50 75 6c 6c 49 6e 74 cies {}..PullInt
1270: 65 72 6e 61 6c 53 75 63 63 65 73 73 6f 72 52 65 ernalSuccessorRe
1280: 76 69 73 69 6f 6e 73 20 64 65 70 65 6e 64 65 6e visions dependen
1290: 63 69 65 73 20 24 6d 79 72 65 76 69 73 69 6f 6e cies $myrevision
12a0: 73 0a 09 69 66 20 7b 21 5b 61 72 72 61 79 20 73 s..if {![array s
12b0: 69 7a 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73 ize dependencies
12c0: 5d 7d 20 7b 72 65 74 75 72 6e 20 30 7d 20 3b 20 ]} {return 0} ;
12d0: 23 20 4e 6f 74 68 69 6e 67 20 74 6f 20 62 72 65 # Nothing to bre
12e0: 61 6b 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 ak....log write
12f0: 36 20 63 73 65 74 73 20 2e 2e 2e 3c 24 6d 79 69 6 csets ...<$myi
1300: 64 3e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e d>..............
1310: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
1320: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
1330: 2e 2e 2e 2e 2e 2e 2e 2e 2e 0a 0a 09 23 20 57 65 ............# We
1340: 20 68 61 76 65 20 69 6e 74 65 72 6e 61 6c 20 64 have internal d
1350: 65 70 65 6e 64 65 6e 63 69 65 73 20 74 6f 20 62 ependencies to b
1360: 72 65 61 6b 2e 20 57 65 20 6e 6f 77 20 69 74 65 reak. We now ite
1370: 72 61 74 65 20 6f 76 65 72 0a 09 23 20 61 6c 6c rate over..# all
1380: 20 70 6f 73 69 74 69 6f 6e 73 20 69 6e 20 74 68 positions in th
1390: 65 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 e list (which is
13a0: 20 63 68 72 6f 6e 6f 6c 6f 67 69 63 61 6c 2c 20 chronological,
13b0: 61 74 20 6c 65 61 73 74 0a 09 23 20 61 73 20 66 at least..# as f
13c0: 61 72 20 61 73 20 74 68 65 20 74 69 6d 65 73 74 ar as the timest
13d0: 61 6d 70 73 20 61 72 65 20 63 6f 72 72 65 63 74 amps are correct
13e0: 20 61 6e 64 20 75 6e 69 71 75 65 29 20 61 6e 64 and unique) and
13f0: 0a 09 23 20 64 65 74 65 72 6d 69 6e 65 20 74 68 ..# determine th
1400: 65 20 62 65 73 74 20 70 6f 73 69 74 69 6f 6e 20 e best position
1410: 66 6f 72 20 74 68 65 20 62 72 65 61 6b 2c 20 62 for the break, b
1420: 79 20 74 72 79 69 6e 67 20 74 6f 0a 09 23 20 62 y trying to..# b
1430: 72 65 61 6b 20 61 73 20 6d 61 6e 79 20 64 65 70 reak as many dep
1440: 65 6e 64 65 6e 63 69 65 73 20 61 73 20 70 6f 73 endencies as pos
1450: 73 69 62 6c 65 20 69 6e 20 6f 6e 65 20 67 6f 2e sible in one go.
1460: 20 57 68 65 6e 20 61 0a 09 23 20 62 72 65 61 6b When a..# break
1470: 20 77 61 73 20 66 6f 75 6e 64 20 74 68 69 73 20 was found this
1480: 69 73 20 72 65 64 6f 6e 65 20 66 6f 72 20 74 68 is redone for th
1490: 65 20 66 72 61 67 6d 65 6e 74 73 20 63 6f 6d 69 e fragments comi
14a0: 6e 67 20 61 6e 64 0a 09 23 20 61 66 74 65 72 2c ng and..# after,
14b0: 20 61 66 74 65 72 20 75 70 64 69 6e 67 20 74 68 after upding th
14c0: 65 20 63 72 6f 73 73 69 6e 67 20 69 6e 66 6f 72 e crossing infor
14d0: 6d 61 74 69 6f 6e 2e 0a 0a 09 23 20 44 61 74 61 mation....# Data
14e0: 20 73 74 72 75 63 74 75 72 65 73 3a 0a 09 23 20 structures:..#
14f0: 4d 61 70 3a 20 20 50 4f 53 20 20 20 72 65 76 69 Map: POS revi
1500: 73 69 6f 6e 20 69 64 20 20 20 20 20 20 2d 3e 20 sion id ->
1510: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73 74 position in list
1520: 2e 0a 09 23 20 20 20 20 20 20 20 43 52 4f 53 53 ...# CROSS
1530: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73 position in lis
1540: 74 20 2d 3e 20 6e 75 6d 62 65 72 20 6f 66 20 64 t -> number of d
1550: 65 70 65 6e 64 65 6e 63 69 65 73 20 63 72 6f 73 ependencies cros
1560: 73 69 6e 67 20 69 74 0a 09 23 20 20 20 20 20 20 sing it..#
1570: 20 44 45 50 43 20 20 64 65 70 65 6e 64 65 6e 63 DEPC dependenc
1580: 79 20 20 20 20 20 20 20 2d 3e 20 70 6f 73 69 74 y -> posit
1590: 69 6f 6e 73 20 69 74 20 63 72 6f 73 73 65 73 0a ions it crosses.
15a0: 09 23 20 4c 69 73 74 3a 20 52 41 4e 47 45 20 4f .# List: RANGE O
15b0: 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 f the positions
15c0: 69 74 73 65 6c 66 2e 0a 09 23 20 41 20 64 65 70 itself...# A dep
15d0: 65 6e 64 65 6e 63 79 20 69 73 20 61 20 73 69 6e endency is a sin
15e0: 67 6c 65 2d 65 6c 65 6d 65 6e 74 20 6d 61 70 20 gle-element map
15f0: 70 61 72 65 6e 74 20 2d 3e 20 63 68 69 6c 64 0a parent -> child.
1600: 0a 09 49 6e 69 74 69 61 6c 69 7a 65 42 72 65 61 ..InitializeBrea
1610: 6b 53 74 61 74 65 20 24 6d 79 72 65 76 69 73 69 kState $myrevisi
1620: 6f 6e 73 0a 0a 09 73 65 74 20 66 72 61 67 6d 65 ons...set fragme
1630: 6e 74 73 20 7b 7d 0a 09 73 65 74 20 70 65 6e 64 nts {}..set pend
1640: 69 6e 67 20 20 20 5b 6c 69 73 74 20 24 72 61 6e ing [list $ran
1650: 67 65 5d 0a 09 73 65 74 20 61 74 20 20 20 20 20 ge]..set at
1660: 20 20 20 30 0a 09 61 72 72 61 79 20 73 65 74 20 0..array set
1670: 62 72 65 61 6b 73 20 7b 7d 0a 0a 09 77 68 69 6c breaks {}...whil
1680: 65 20 7b 24 61 74 20 3c 20 5b 6c 6c 65 6e 67 74 e {$at < [llengt
1690: 68 20 24 70 65 6e 64 69 6e 67 5d 7d 20 7b 0a 09 h $pending]} {..
16a0: 20 20 20 20 73 65 74 20 63 75 72 72 65 6e 74 20 set current
16b0: 5b 6c 69 6e 64 65 78 20 24 70 65 6e 64 69 6e 67 [lindex $pending
16c0: 20 24 61 74 5d 0a 0a 09 20 20 20 20 6c 6f 67 20 $at]... log
16d0: 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22 2e write 6 csets ".
16e0: 20 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 . .. ... .....
16f0: 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e ........ .......
1700: 2e 2e 2e 2e 2e 2e 22 0a 09 20 20 20 20 6c 6f 67 ......".. log
1710: 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22 write 6 csets "
1720: 53 63 68 65 64 75 6c 65 64 20 20 20 5b 6a 6f 69 Scheduled [joi
1730: 6e 20 5b 50 52 73 20 5b 6c 72 61 6e 67 65 20 24 n [PRs [lrange $
1740: 70 65 6e 64 69 6e 67 20 24 61 74 20 65 6e 64 5d pending $at end]
1750: 5d 20 7b 20 7d 5d 22 0a 09 20 20 20 20 6c 6f 67 ] { }]".. log
1760: 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22 write 6 csets "
1770: 43 6f 6e 73 69 64 65 72 69 6e 67 20 5b 50 52 20 Considering [PR
1780: 24 63 75 72 72 65 6e 74 5d 20 5c 5b 24 61 74 2f $current] \[$at/
1790: 5b 6c 6c 65 6e 67 74 68 20 24 70 65 6e 64 69 6e [llength $pendin
17a0: 67 5d 5c 5d 22 0a 0a 09 20 20 20 20 73 65 74 20 g]\]"... set
17b0: 62 65 73 74 20 5b 46 69 6e 64 42 65 73 74 42 72 best [FindBestBr
17c0: 65 61 6b 20 24 63 75 72 72 65 6e 74 5d 0a 0a 09 eak $current]...
17d0: 20 20 20 20 69 66 20 7b 24 62 65 73 74 20 3c 20 if {$best <
17e0: 30 7d 20 7b 0a 09 09 23 20 54 68 65 20 69 6e 73 0} {...# The ins
17f0: 70 65 63 74 65 64 20 72 61 6e 67 65 20 68 61 73 pected range has
1800: 20 6e 6f 20 69 6e 74 65 72 6e 61 6c 0a 09 09 23 no internal...#
1810: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 54 dependencies. T
1820: 68 69 73 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 his is a complet
1830: 65 20 66 72 61 67 6d 65 6e 74 2e 0a 09 09 6c 61 e fragment....la
1840: 70 70 65 6e 64 20 66 72 61 67 6d 65 6e 74 73 20 ppend fragments
1850: 24 63 75 72 72 65 6e 74 0a 0a 09 09 6c 6f 67 20 $current....log
1860: 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22 4e write 6 csets "N
1870: 6f 20 62 72 65 61 6b 73 2c 20 66 69 6e 61 6c 22 o breaks, final"
1880: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 .. } else {..
1890: 09 23 20 53 70 6c 69 74 20 74 68 65 20 72 61 6e .# Split the ran
18a0: 67 65 20 61 6e 64 20 73 63 68 65 64 75 6c 65 20 ge and schedule
18b0: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 66 72 the resulting fr
18c0: 61 67 6d 65 6e 74 73 0a 09 09 23 20 66 6f 72 20 agments...# for
18d0: 66 75 72 74 68 65 72 20 69 6e 73 70 65 63 74 69 further inspecti
18e0: 6f 6e 2e 20 52 65 6d 65 6d 62 65 72 20 74 68 65 on. Remember the
18f0: 20 6e 75 6d 62 65 72 20 6f 66 0a 09 09 23 20 64 number of...# d
1900: 65 70 65 6e 64 65 6e 63 69 65 73 20 63 75 74 20 ependencies cut
1910: 62 65 66 6f 72 65 20 77 65 20 72 65 6d 6f 76 65 before we remove
1920: 20 74 68 65 6d 20 66 72 6f 6d 0a 09 09 23 20 63 them from...# c
1930: 6f 6e 73 69 64 65 72 61 74 69 6f 6e 2c 20 66 6f onsideration, fo
1940: 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 r documentation
1950: 6c 61 74 65 72 2e 0a 0a 09 09 73 65 74 20 62 72 later.....set br
1960: 65 61 6b 73 28 24 62 65 73 74 29 20 24 63 72 6f eaks($best) $cro
1970: 73 73 28 24 62 65 73 74 29 0a 0a 09 09 6c 6f 67 ss($best)....log
1980: 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22 write 6 csets "
1990: 42 65 73 74 20 62 72 65 61 6b 20 40 20 24 62 65 Best break @ $be
19a0: 73 74 2c 20 63 75 74 74 69 6e 67 20 5b 6e 73 70 st, cutting [nsp
19b0: 20 24 63 72 6f 73 73 28 24 62 65 73 74 29 20 64 $cross($best) d
19c0: 65 70 65 6e 64 65 6e 63 79 20 64 65 70 65 6e 64 ependency depend
19d0: 65 6e 63 69 65 73 5d 22 0a 0a 09 09 23 20 4e 6f encies]"....# No
19e0: 74 65 3a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 te: The value of
19f0: 20 62 65 73 74 20 69 73 20 61 6e 20 61 62 6f 6c best is an abol
1a00: 75 74 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 0a ute location in.
1a10: 09 09 23 20 6d 79 72 65 76 69 73 69 6f 6e 73 2e ..# myrevisions.
1a20: 20 55 73 65 20 74 68 65 20 73 74 61 72 74 20 6f Use the start o
1a30: 66 20 63 75 72 72 65 6e 74 20 74 6f 20 6d 61 6b f current to mak
1a40: 65 20 69 74 20 61 6e 0a 09 09 23 20 69 6e 64 65 e it an...# inde
1a50: 78 20 61 62 73 6f 6c 75 74 65 20 74 6f 20 63 75 x absolute to cu
1a60: 72 72 65 6e 74 2e 0a 0a 09 09 73 65 74 20 62 72 rrent.....set br
1a70: 65 6c 20 5b 65 78 70 72 20 7b 24 62 65 73 74 20 el [expr {$best
1a80: 2d 20 5b 6c 69 6e 64 65 78 20 24 63 75 72 72 65 - [lindex $curre
1a90: 6e 74 20 30 5d 7d 5d 0a 09 09 73 65 74 20 62 6e nt 0]}]...set bn
1aa0: 65 78 74 20 24 62 72 65 6c 20 3b 20 69 6e 63 72 ext $brel ; incr
1ab0: 20 62 6e 65 78 74 0a 09 09 73 65 74 20 66 72 61 bnext...set fra
1ac0: 67 62 65 66 6f 72 65 20 5b 6c 72 61 6e 67 65 20 gbefore [lrange
1ad0: 24 63 75 72 72 65 6e 74 20 30 20 24 62 72 65 6c $current 0 $brel
1ae0: 5d 0a 09 09 73 65 74 20 66 72 61 67 61 66 74 65 ]...set fragafte
1af0: 72 20 20 5b 6c 72 61 6e 67 65 20 24 63 75 72 72 r [lrange $curr
1b00: 65 6e 74 20 24 62 6e 65 78 74 20 65 6e 64 5d 0a ent $bnext end].
1b10: 0a 09 09 6c 6f 67 20 77 72 69 74 65 20 36 20 63 ...log write 6 c
1b20: 73 65 74 73 20 22 4e 65 77 20 70 69 65 63 65 73 sets "New pieces
1b30: 20 20 5b 50 52 20 24 66 72 61 67 62 65 66 6f 72 [PR $fragbefor
1b40: 65 5d 20 5b 50 52 20 24 66 72 61 67 61 66 74 65 e] [PR $fragafte
1b50: 72 5d 22 0a 0a 09 09 69 66 20 7b 21 5b 6c 6c 65 r]"....if {![lle
1b60: 6e 67 74 68 20 24 66 72 61 67 62 65 66 6f 72 65 ngth $fragbefore
1b70: 5d 7d 20 7b 0a 09 09 20 20 20 20 74 72 6f 75 62 ]} {... troub
1b80: 6c 65 20 69 6e 74 65 72 6e 61 6c 20 22 54 72 69 le internal "Tri
1b90: 65 64 20 74 6f 20 73 70 6c 69 74 20 6f 66 66 20 ed to split off
1ba0: 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 72 a zero-length fr
1bb0: 61 67 6d 65 6e 74 20 61 74 20 74 68 65 20 62 65 agment at the be
1bc0: 67 69 6e 6e 69 6e 67 22 0a 09 09 7d 0a 09 09 69 ginning"...}...i
1bd0: 66 20 7b 21 5b 6c 6c 65 6e 67 74 68 20 24 66 72 f {![llength $fr
1be0: 61 67 61 66 74 65 72 5d 7d 20 7b 0a 09 09 20 20 agafter]} {...
1bf0: 20 20 74 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e trouble intern
1c00: 61 6c 20 22 54 72 69 65 64 20 74 6f 20 73 70 6c al "Tried to spl
1c10: 69 74 20 6f 66 66 20 61 20 7a 65 72 6f 2d 6c 65 it off a zero-le
1c20: 6e 67 74 68 20 66 72 61 67 6d 65 6e 74 20 61 74 ngth fragment at
1c30: 20 74 68 65 20 65 6e 64 22 0a 09 09 7d 0a 0a 09 the end"...}...
1c40: 09 6c 61 70 70 65 6e 64 20 70 65 6e 64 69 6e 67 .lappend pending
1c50: 20 24 66 72 61 67 62 65 66 6f 72 65 20 24 66 72 $fragbefore $fr
1c60: 61 67 61 66 74 65 72 0a 09 09 43 75 74 41 74 20 agafter...CutAt
1c70: 24 62 65 73 74 0a 09 20 20 20 20 7d 0a 0a 09 20 $best.. }...
1c80: 20 20 20 69 6e 63 72 20 61 74 0a 09 7d 0a 0a 09 incr at..}...
1c90: 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74 log write 6 cset
1ca0: 73 20 22 2e 20 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e s ". . .. ... ..
1cb0: 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e ... ........ ...
1cc0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 22 0a 0a 09 23 20 .........."...#
1cd0: 43 72 65 61 74 65 20 63 68 61 6e 67 65 73 65 74 Create changeset
1ce0: 73 20 66 6f 72 20 74 68 65 20 66 72 61 67 6d 65 s for the fragme
1cf0: 6e 74 73 2c 20 72 65 75 73 69 6e 67 20 74 68 65 nts, reusing the
1d00: 20 63 75 72 72 65 6e 74 20 6f 6e 65 0a 09 23 20 current one..#
1d10: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 66 72 for the first fr
1d20: 61 67 6d 65 6e 74 2e 20 57 65 20 73 6f 72 74 20 agment. We sort
1d30: 74 68 65 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f them in order to
1d40: 20 61 6c 6c 6f 77 0a 09 23 20 63 68 65 63 6b 69 allow..# checki
1d50: 6e 67 20 66 6f 72 20 67 61 70 73 20 61 6e 64 20 ng for gaps and
1d60: 6e 69 63 65 20 6d 65 73 73 61 67 65 73 2e 0a 0a nice messages...
1d70: 09 73 65 74 20 66 72 61 67 6d 65 6e 74 73 20 5b .set fragments [
1d80: 6c 73 6f 72 74 20 2d 69 6e 64 65 78 20 30 20 2d lsort -index 0 -
1d90: 69 6e 74 65 67 65 72 20 24 66 72 61 67 6d 65 6e integer $fragmen
1da0: 74 73 5d 0a 0a 09 23 70 75 74 73 20 5c 74 2e 5b ts]...#puts \t.[
1db0: 6a 6f 69 6e 20 5b 50 52 73 20 24 66 72 61 67 6d join [PRs $fragm
1dc0: 65 6e 74 73 5d 20 2e 5c 6e 5c 74 2e 5d 2e 0a 0a ents] .\n\t.]...
1dd0: 09 42 6f 72 64 65 72 20 5b 6c 69 6e 64 65 78 20 .Border [lindex
1de0: 24 66 72 61 67 6d 65 6e 74 73 20 30 5d 20 66 69 $fragments 0] fi
1df0: 72 73 74 73 20 66 69 72 73 74 65 0a 0a 09 69 66 rsts firste...if
1e00: 20 7b 24 66 69 72 73 74 73 20 21 3d 20 30 7d 20 {$firsts != 0}
1e10: 7b 0a 09 20 20 20 20 74 72 6f 75 62 6c 65 20 69 {.. trouble i
1e20: 6e 74 65 72 6e 61 6c 20 22 42 61 64 20 66 72 61 nternal "Bad fra
1e30: 67 6d 65 6e 74 20 73 74 61 72 74 20 40 20 24 66 gment start @ $f
1e40: 69 72 73 74 73 2c 20 67 61 70 2c 20 6f 72 20 62 irsts, gap, or b
1e50: 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 20 efore beginning
1e60: 6f 66 20 74 68 65 20 72 61 6e 67 65 22 0a 09 7d of the range"..}
1e70: 0a 0a 09 73 65 74 20 6c 61 73 74 65 20 24 66 69 ...set laste $fi
1e80: 72 73 74 65 0a 09 66 6f 72 65 61 63 68 20 66 72 rste..foreach fr
1e90: 61 67 6d 65 6e 74 20 5b 6c 72 61 6e 67 65 20 24 agment [lrange $
1ea0: 66 72 61 67 6d 65 6e 74 73 20 31 20 65 6e 64 5d fragments 1 end]
1eb0: 20 7b 0a 09 20 20 20 20 42 6f 72 64 65 72 20 24 {.. Border $
1ec0: 66 72 61 67 6d 65 6e 74 20 73 20 65 0a 09 20 20 fragment s e..
1ed0: 20 20 69 66 20 7b 24 6c 61 73 74 65 20 21 3d 20 if {$laste !=
1ee0: 28 24 73 20 2d 20 31 29 7d 20 7b 0a 09 09 74 72 ($s - 1)} {...tr
1ef0: 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 22 ouble internal "
1f00: 42 61 64 20 66 72 61 67 6d 65 6e 74 20 62 6f 72 Bad fragment bor
1f10: 64 65 72 20 3c 24 6c 61 73 74 65 20 7c 20 24 73 der <$laste | $s
1f20: 3e 2c 20 67 61 70 20 6f 72 20 6f 76 65 72 6c 61 >, gap or overla
1f30: 70 22 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 p".. }...
1f40: 73 65 74 20 6e 65 77 20 5b 24 74 79 70 65 20 25 set new [$type %
1f50: 41 55 54 4f 25 20 24 6d 79 70 72 6f 6a 65 63 74 AUTO% $myproject
1f60: 20 24 6d 79 74 79 70 65 20 24 6d 79 73 72 63 69 $mytype $mysrci
1f70: 64 20 5b 6c 72 61 6e 67 65 20 24 6d 79 72 65 76 d [lrange $myrev
1f80: 69 73 69 6f 6e 73 20 24 73 20 24 65 5d 5d 0a 0a isions $s $e]]..
1f90: 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 67 20 log
1fa0: 77 72 69 74 65 20 34 20 63 73 65 74 73 20 22 42 write 4 csets "B
1fb0: 72 65 61 6b 69 6e 67 20 3c 24 6d 79 69 64 3e 20 reaking <$myid>
1fc0: 40 20 24 6c 61 73 74 65 2c 20 6e 65 77 20 3c 5b @ $laste, new <[
1fd0: 24 6e 65 77 20 69 64 5d 3e 2c 20 63 75 74 74 69 $new id]>, cutti
1fe0: 6e 67 20 24 62 72 65 61 6b 73 28 24 6c 61 73 74 ng $breaks($last
1ff0: 65 29 22 0a 0a 09 20 20 20 20 73 65 74 20 6c 61 e)"... set la
2000: 73 74 65 20 24 65 0a 09 7d 0a 0a 09 69 66 20 7b ste $e..}...if {
2010: 24 6c 61 73 74 65 20 21 3d 20 28 5b 6c 6c 65 6e $laste != ([llen
2020: 67 74 68 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 gth $myrevisions
2030: 5d 2d 31 29 7d 20 7b 0a 09 20 20 20 20 74 72 6f ]-1)} {.. tro
2040: 75 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 22 42 uble internal "B
2050: 61 64 20 66 72 61 67 6d 65 6e 74 20 65 6e 64 20 ad fragment end
2060: 40 20 24 6c 61 73 74 65 2c 20 67 61 70 2c 20 6f @ $laste, gap, o
2070: 72 20 62 65 79 6f 6e 64 20 65 6e 64 20 6f 66 20 r beyond end of
2080: 74 68 65 20 72 61 6e 67 65 22 0a 09 7d 0a 0a 09 the range"..}...
2090: 23 20 50 75 74 20 74 68 65 20 66 69 72 73 74 20 # Put the first
20a0: 66 72 61 67 6d 65 6e 74 20 69 6e 74 6f 20 74 68 fragment into th
20b0: 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 e current change
20c0: 73 65 74 2e 0a 09 73 65 74 20 6d 79 72 65 76 69 set...set myrevi
20d0: 73 69 6f 6e 73 20 5b 6c 72 61 6e 67 65 20 24 6d sions [lrange $m
20e0: 79 72 65 76 69 73 69 6f 6e 73 20 30 20 24 66 69 yrevisions 0 $fi
20f0: 72 73 74 65 5d 0a 0a 09 72 65 74 75 72 6e 20 31 rste]...return 1
2100: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 . }.. meth
2110: 6f 64 20 70 65 72 73 69 73 74 20 7b 7d 20 7b 0a od persist {} {.
2120: 09 73 65 74 20 74 69 64 20 24 6d 79 63 73 74 79 .set tid $mycsty
2130: 70 65 28 24 6d 79 74 79 70 65 29 0a 09 73 65 74 pe($mytype)..set
2140: 20 70 69 64 20 5b 24 6d 79 70 72 6f 6a 65 63 74 pid [$myproject
2150: 20 69 64 5d 0a 09 73 65 74 20 70 6f 73 20 30 0a id]..set pos 0.
2160: 0a 09 73 74 61 74 65 20 74 72 61 6e 73 61 63 74 ..state transact
2170: 69 6f 6e 20 7b 0a 09 20 20 20 20 73 74 61 74 65 ion {.. state
2180: 20 72 75 6e 20 7b 0a 09 09 49 4e 53 45 52 54 20 run {...INSERT
2190: 49 4e 54 4f 20 63 68 61 6e 67 65 73 65 74 20 28 INTO changeset (
21a0: 63 69 64 2c 20 20 20 70 69 64 2c 20 20 74 79 70 cid, pid, typ
21b0: 65 2c 20 73 72 63 29 0a 09 09 56 41 4c 55 45 53 e, src)...VALUES
21c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
21d0: 28 24 6d 79 69 64 2c 20 24 70 69 64 2c 20 24 74 ($myid, $pid, $t
21e0: 69 64 2c 20 24 6d 79 73 72 63 69 64 29 3b 0a 09 id, $mysrcid);..
21f0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 66 6f 72 65 }... fore
2200: 61 63 68 20 72 69 64 20 24 6d 79 72 65 76 69 73 ach rid $myrevis
2210: 69 6f 6e 73 20 7b 0a 09 09 73 74 61 74 65 20 72 ions {...state r
2220: 75 6e 20 7b 0a 09 09 20 20 20 20 49 4e 53 45 52 un {... INSER
2230: 54 20 49 4e 54 4f 20 63 73 72 65 76 69 73 69 6f T INTO csrevisio
2240: 6e 20 28 63 69 64 2c 20 20 20 70 6f 73 2c 20 20 n (cid, pos,
2250: 72 69 64 29 0a 09 09 20 20 20 20 56 41 4c 55 45 rid)... VALUE
2260: 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 S
2270: 20 20 28 24 6d 79 69 64 2c 20 24 70 6f 73 2c 20 ($myid, $pos,
2280: 24 72 69 64 29 3b 0a 09 09 7d 0a 09 09 69 6e 63 $rid);...}...inc
2290: 72 20 70 6f 73 0a 09 20 20 20 20 7d 0a 09 7d 0a r pos.. }..}.
22a0: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 .return. }..
22b0: 20 20 20 6d 65 74 68 6f 64 20 74 69 6d 65 72 61 method timera
22c0: 6e 67 65 20 7b 7d 20 7b 0a 09 73 65 74 20 74 68 nge {} {..set th
22d0: 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 6d 79 eset ('[join $my
22e0: 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d revisions {','}]
22f0: 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61 74 ')..return [stat
2300: 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c e run ".. SEL
2310: 45 43 54 20 4d 49 4e 28 52 2e 64 61 74 65 29 2c ECT MIN(R.date),
2320: 20 4d 41 58 28 52 2e 64 61 74 65 29 0a 09 20 20 MAX(R.date)..
2330: 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 FROM revision
2340: 52 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e 72 R.. WHERE R.r
2350: 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 22 id IN $theset.."
2360: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 ]. }.. met
2370: 68 6f 64 20 64 72 6f 70 20 7b 7d 20 7b 0a 09 73 hod drop {} {..s
2380: 74 61 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e tate transaction
2390: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 20 72 75 {.. state ru
23a0: 6e 20 7b 0a 09 09 44 45 4c 45 54 45 20 46 52 4f n {...DELETE FRO
23b0: 4d 20 63 68 61 6e 67 65 73 65 74 20 20 57 48 45 M changeset WHE
23c0: 52 45 20 63 69 64 20 3d 20 24 6d 79 69 64 3b 0a RE cid = $myid;.
23d0: 09 09 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 73 ..DELETE FROM cs
23e0: 72 65 76 69 73 69 6f 6e 20 57 48 45 52 45 20 63 revision WHERE c
23f0: 69 64 20 3d 20 24 6d 79 69 64 3b 0a 09 20 20 20 id = $myid;..
2400: 20 7d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 72 }..}..foreach r
2410: 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 20 7b 20 $myrevisions {
2420: 75 6e 73 65 74 20 6d 79 72 65 76 6d 61 70 28 24 unset myrevmap($
2430: 72 29 20 7d 0a 09 73 65 74 20 70 6f 73 20 20 20 r) }..set pos
2440: 20 20 20 20 20 20 20 5b 6c 73 65 61 72 63 68 20 [lsearch
2450: 2d 65 78 61 63 74 20 24 6d 79 63 68 61 6e 67 65 -exact $mychange
2460: 73 65 74 73 20 24 73 65 6c 66 5d 0a 09 73 65 74 sets $self]..set
2470: 20 6d 79 63 68 61 6e 67 65 73 65 74 73 20 5b 6c mychangesets [l
2480: 72 65 70 6c 61 63 65 20 24 6d 79 63 68 61 6e 67 replace $mychang
2490: 65 73 65 74 73 20 24 70 6f 73 20 24 70 6f 73 5d esets $pos $pos]
24a0: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a ..return. }..
24b0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 73 typemethod s
24c0: 70 6c 69 74 20 7b 63 73 65 74 20 61 72 67 73 7d plit {cset args}
24d0: 20 7b 0a 09 23 20 41 73 20 70 61 72 74 20 6f 66 {..# As part of
24e0: 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 the creation of
24f0: 20 74 68 65 20 6e 65 77 20 63 68 61 6e 67 65 73 the new changes
2500: 65 74 73 20 73 70 65 63 69 66 69 65 64 20 69 6e ets specified in
2510: 0a 09 23 20 41 52 47 53 20 61 73 20 73 65 74 73 ..# ARGS as sets
2520: 20 6f 66 20 72 65 76 69 73 69 6f 6e 73 2c 20 61 of revisions, a
2530: 6c 6c 20 73 75 62 73 65 74 73 20 6f 66 20 43 53 ll subsets of CS
2540: 45 54 27 73 20 72 65 76 69 73 69 6f 6e 0a 09 23 ET's revision..#
2550: 20 73 65 74 2c 20 43 53 45 54 20 77 69 6c 6c 20 set, CSET will
2560: 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 be dropped from
2570: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 2c 20 69 all databases, i
2580: 6e 20 61 6e 64 20 6f 75 74 20 6f 66 0a 09 23 20 n and out of..#
2590: 6d 65 6d 6f 72 79 2c 20 61 6e 64 20 74 68 65 6e memory, and then
25a0: 20 64 65 73 74 72 6f 79 65 64 2e 0a 0a 09 73 74 destroyed....st
25b0: 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 ruct::list assig
25c0: 6e 20 5b 24 63 73 65 74 20 64 61 74 61 5d 20 70 n [$cset data] p
25d0: 72 6f 6a 65 63 74 20 63 73 74 79 70 65 20 63 73 roject cstype cs
25e0: 73 72 63 0a 0a 09 24 63 73 65 74 20 64 72 6f 70 src...$cset drop
25f0: 0a 09 24 63 73 65 74 20 64 65 73 74 72 6f 79 0a ..$cset destroy.
2600: 0a 09 73 65 74 20 6e 65 77 63 73 65 74 73 20 7b ..set newcsets {
2610: 7d 0a 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d }..foreach fragm
2620: 65 6e 74 72 65 76 69 73 69 6f 6e 73 20 24 61 72 entrevisions $ar
2630: 67 73 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e gs {.. lappen
2640: 64 20 6e 65 77 63 73 65 74 73 20 5b 24 74 79 70 d newcsets [$typ
2650: 65 20 25 41 55 54 4f 25 20 24 70 72 6f 6a 65 63 e %AUTO% $projec
2660: 74 20 24 63 73 74 79 70 65 20 24 63 73 73 72 63 t $cstype $cssrc
2670: 20 24 66 72 61 67 6d 65 6e 74 72 65 76 69 73 69 $fragmentrevisi
2680: 6f 6e 73 5d 0a 09 7d 0a 0a 09 66 6f 72 65 61 63 ons]..}...foreac
2690: 68 20 63 20 24 6e 65 77 63 73 65 74 73 20 7b 20 h c $newcsets {
26a0: 24 63 20 70 65 72 73 69 73 74 20 7d 0a 09 72 65 $c persist }..re
26b0: 74 75 72 6e 20 24 6e 65 77 63 73 65 74 73 0a 20 turn $newcsets.
26c0: 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 }.. # # ##
26d0: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 ### ##### #####
26e0: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 ### ############
26f0: 23 0a 20 20 20 20 23 23 20 53 74 61 74 65 0a 0a #. ## State..
2700: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 69 variable myi
2710: 64 20 20 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 d {} ; #
2720: 49 64 20 6f 66 20 74 68 65 20 63 73 65 74 20 66 Id of the cset f
2730: 6f 72 20 74 68 65 20 70 65 72 73 69 73 74 65 6e or the persisten
2740: 74 0a 09 09 09 20 20 20 20 20 20 23 20 73 74 61 t.... # sta
2750: 74 65 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 te.. variable
2760: 20 6d 79 70 72 6f 6a 65 63 74 20 20 20 7b 7d 20 myproject {}
2770: 3b 20 23 20 52 65 66 65 72 65 6e 63 65 20 6f 66 ; # Reference of
2780: 20 74 68 65 20 70 72 6f 6a 65 63 74 20 6f 62 6a the project obj
2790: 65 63 74 20 74 68 65 0a 09 09 09 20 20 20 20 20 ect the....
27a0: 20 23 20 63 68 61 6e 67 65 73 65 74 20 62 65 6c # changeset bel
27b0: 6f 6e 67 73 20 74 6f 2e 0a 20 20 20 20 76 61 72 ongs to.. var
27c0: 69 61 62 6c 65 20 6d 79 74 79 70 65 20 20 20 20 iable mytype
27d0: 20 20 7b 7d 20 3b 20 23 20 72 65 76 20 6f 72 20 {} ; # rev or
27e0: 73 79 6d 2c 20 77 68 65 72 65 20 74 68 65 20 63 sym, where the c
27f0: 73 65 74 20 6f 72 69 67 69 6e 61 74 65 64 0a 09 set originated..
2800: 09 09 20 20 20 20 20 20 23 20 66 72 6f 6d 2e 0a .. # from..
2810: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 73 variable mys
2820: 72 63 69 64 20 20 20 20 20 7b 7d 20 3b 20 23 20 rcid {} ; #
2830: 49 64 20 6f 66 20 74 68 65 20 6d 65 74 61 64 61 Id of the metada
2840: 74 61 20 6f 72 20 73 79 6d 62 6f 6c 20 74 68 65 ta or symbol the
2850: 20 63 73 65 74 0a 09 09 09 20 20 20 20 20 20 23 cset.... #
2860: 20 69 73 20 62 61 73 65 64 20 6f 6e 2e 0a 20 20 is based on..
2870: 20 20 76 61 72 69 61 62 6c 65 20 6d 79 72 65 76 variable myrev
2880: 69 73 69 6f 6e 73 20 7b 7d 20 3b 20 23 20 4c 69 isions {} ; # Li
2890: 73 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c st of the file l
28a0: 65 76 65 6c 20 72 65 76 69 73 69 6f 6e 73 20 69 evel revisions i
28b0: 6e 0a 09 09 09 20 20 20 20 20 20 23 20 74 68 65 n.... # the
28c0: 20 63 73 65 74 2e 0a 20 20 20 20 76 61 72 69 61 cset.. varia
28d0: 62 6c 65 20 6d 79 70 72 65 6d 61 70 20 20 20 20 ble mypremap
28e0: 7b 7d 20 3b 20 23 20 44 69 63 74 69 6f 6e 61 72 {} ; # Dictionar
28f0: 79 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 y mapping from t
2900: 68 65 20 72 65 76 69 73 69 6f 6e 73 0a 09 09 09 he revisions....
2910: 20 20 20 20 20 20 23 20 74 6f 20 74 68 65 69 72 # to their
2920: 20 70 72 65 64 65 63 65 73 73 6f 72 73 2e 20 43 predecessors. C
2930: 61 63 68 65 20 74 6f 20 61 76 6f 69 64 0a 09 09 ache to avoid...
2940: 09 20 20 20 20 20 20 23 20 6c 6f 61 64 69 6e 67 . # loading
2950: 20 74 68 69 73 20 66 72 6f 6d 20 74 68 65 20 73 this from the s
2960: 74 61 74 65 20 6d 6f 72 65 20 74 68 61 6e 0a 09 tate more than..
2970: 09 09 20 20 20 20 20 20 23 20 6f 6e 63 65 2e 0a .. # once..
2980: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 6e variable myn
2990: 65 78 74 6d 61 70 20 20 20 7b 7d 20 3b 20 23 20 extmap {} ; #
29a0: 44 69 63 74 69 6f 6e 61 72 79 20 6d 61 70 70 69 Dictionary mappi
29b0: 6e 67 20 66 72 6f 6d 20 74 68 65 20 72 65 76 69 ng from the revi
29c0: 73 69 6f 6e 73 0a 09 09 09 20 20 20 20 20 20 23 sions.... #
29d0: 20 74 6f 20 74 68 65 69 72 20 73 75 63 63 65 73 to their succes
29e0: 73 6f 72 73 2e 20 43 61 63 68 65 20 74 6f 20 61 sors. Cache to a
29f0: 76 6f 69 64 0a 09 09 09 20 20 20 20 20 20 23 20 void.... #
2a00: 6c 6f 61 64 69 6e 67 20 74 68 69 73 20 66 72 6f loading this fro
2a10: 6d 20 74 68 65 20 73 74 61 74 65 20 6d 6f 72 65 m the state more
2a20: 20 74 68 61 6e 0a 09 09 09 20 20 20 20 20 20 23 than.... #
2a30: 20 6f 6e 63 65 2e 0a 20 20 20 20 76 61 72 69 61 once.. varia
2a40: 62 6c 65 20 6d 79 70 6f 73 20 20 20 20 20 20 20 ble mypos
2a50: 7b 7d 20 3b 20 23 20 43 6f 6d 6d 69 74 20 70 6f {} ; # Commit po
2a60: 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 sition of the ch
2a70: 61 6e 67 65 73 65 74 2c 20 69 66 0a 09 09 09 20 angeset, if....
2a80: 20 20 20 20 20 23 20 6b 6e 6f 77 6e 2e 0a 0a 20 # known...
2a90: 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 # # ## ### ##
2aa0: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 ### ######## ###
2ab0: 23 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 ##########. #
2ac0: 23 20 49 6e 74 65 72 6e 61 6c 20 6d 65 74 68 6f # Internal metho
2ad0: 64 73 0a 0a 20 20 20 20 74 79 70 65 76 61 72 69 ds.. typevari
2ae0: 61 62 6c 65 20 6d 79 63 6f 75 6e 74 65 72 20 20 able mycounter
2af0: 20 20 20 20 20 20 30 20 3b 20 23 20 49 64 20 63 0 ; # Id c
2b00: 6f 75 6e 74 65 72 20 66 6f 72 20 63 73 65 74 73 ounter for csets
2b10: 2e 20 4c 61 73 74 20 69 64 20 75 73 65 64 2e 0a . Last id used..
2b20: 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 typevariable
2b30: 20 6d 79 63 73 74 79 70 65 20 2d 61 72 72 61 79 mycstype -array
2b40: 20 7b 7d 20 3b 20 23 20 4d 61 70 20 63 73 74 79 {} ; # Map csty
2b50: 70 65 73 20 74 6f 20 70 65 72 73 69 73 74 65 6e pes to persisten
2b60: 74 20 69 64 73 2e 0a 0a 20 20 20 20 74 79 70 65 t ids... type
2b70: 6d 65 74 68 6f 64 20 67 65 74 63 73 74 79 70 65 method getcstype
2b80: 73 20 7b 7d 20 7b 0a 09 66 6f 72 65 61 63 68 20 s {} {..foreach
2b90: 7b 74 69 64 20 6e 61 6d 65 7d 20 5b 73 74 61 74 {tid name} [stat
2ba0: 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c e run {.. SEL
2bb0: 45 43 54 20 74 69 64 2c 20 6e 61 6d 65 20 46 52 ECT tid, name FR
2bc0: 4f 4d 20 63 73 74 79 70 65 3b 0a 09 7d 5d 20 7b OM cstype;..}] {
2bd0: 20 73 65 74 20 6d 79 63 73 74 79 70 65 28 24 6e set mycstype($n
2be0: 61 6d 65 29 20 24 74 69 64 20 7d 0a 09 72 65 74 ame) $tid }..ret
2bf0: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 urn. }.. t
2c00: 79 70 65 6d 65 74 68 6f 64 20 6c 6f 61 64 63 6f ypemethod loadco
2c10: 75 6e 74 65 72 20 7b 7d 20 7b 0a 09 23 20 49 6e unter {} {..# In
2c20: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 75 itialize the cou
2c30: 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 74 nter from the st
2c40: 61 74 65 0a 09 73 65 74 20 6d 79 63 6f 75 6e 74 ate..set mycount
2c50: 65 72 20 5b 73 74 61 74 65 20 6f 6e 65 20 7b 20 er [state one {
2c60: 53 45 4c 45 43 54 20 4d 41 58 28 63 69 64 29 20 SELECT MAX(cid)
2c70: 46 52 4f 4d 20 63 68 61 6e 67 65 73 65 74 20 7d FROM changeset }
2c80: 5d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a ]..return. }.
2c90: 0a 20 20 20 20 70 72 6f 63 20 50 75 6c 6c 49 6e . proc PullIn
2ca0: 74 65 72 6e 61 6c 53 75 63 63 65 73 73 6f 72 52 ternalSuccessorR
2cb0: 65 76 69 73 69 6f 6e 73 20 7b 64 76 20 72 65 76 evisions {dv rev
2cc0: 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 isions} {..upvar
2cd0: 20 31 20 24 64 76 20 64 65 70 65 6e 64 65 6e 63 1 $dv dependenc
2ce0: 69 65 73 0a 09 73 65 74 20 74 68 65 73 65 74 20 ies..set theset
2cf0: 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f ('[join $revisio
2d00: 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 66 6f ns {','}]')...fo
2d10: 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 reach {rid child
2d20: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 20 } [state run ".
2d30: 20 20 2d 2d 20 50 72 69 6d 61 72 79 20 63 68 69 -- Primary chi
2d40: 6c 64 72 65 6e 0a 09 20 20 20 20 53 45 4c 45 43 ldren.. SELEC
2d50: 54 20 52 2e 72 69 64 2c 20 52 2e 63 68 69 6c 64 T R.rid, R.child
2d60: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 .. FROM rev
2d70: 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 ision R.. WHE
2d80: 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 RE R.rid IN $
2d90: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 theset.. AND
2da0: 20 20 20 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f R.child IS NO
2db0: 54 20 4e 55 4c 4c 0a 09 20 20 20 20 41 4e 44 20 T NULL.. AND
2dc0: 20 20 20 52 2e 63 68 69 6c 64 20 49 4e 20 24 74 R.child IN $t
2dd0: 68 65 73 65 74 0a 20 20 20 20 55 4e 49 4f 4e 0a heset. UNION.
2de0: 20 20 20 20 2d 2d 20 54 72 61 6e 73 69 74 69 6f -- Transitio
2df0: 6e 20 4e 54 44 42 20 74 6f 20 74 72 75 6e 6b 0a n NTDB to trunk.
2e00: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 . SELECT R.ri
2e10: 64 2c 20 52 2e 64 62 63 68 69 6c 64 0a 09 20 20 d, R.dbchild..
2e20: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f FROM revisio
2e30: 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 n R.. WHERE
2e40: 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 R.rid IN $thes
2e50: 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 et.. AND R
2e60: 2e 64 62 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 .dbchild IS NOT
2e70: 4e 55 4c 4c 0a 09 20 20 20 20 41 4e 44 20 20 20 NULL.. AND
2e80: 20 52 2e 64 62 63 68 69 6c 64 20 49 4e 20 24 74 R.dbchild IN $t
2e90: 68 65 73 65 74 0a 20 20 20 20 55 4e 49 4f 4e 0a heset. UNION.
2ea0: 20 20 20 20 2d 2d 20 53 65 63 6f 6e 64 61 72 79 -- Secondary
2eb0: 20 28 62 72 61 6e 63 68 29 20 63 68 69 6c 64 72 (branch) childr
2ec0: 65 6e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 en.. SELECT R
2ed0: 2e 72 69 64 2c 20 42 2e 62 72 69 64 0a 09 20 20 .rid, B.brid..
2ee0: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f FROM revisio
2ef0: 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 62 72 61 n R, revisionbra
2f00: 6e 63 68 63 68 69 6c 64 72 65 6e 20 42 0a 09 20 nchchildren B..
2f10: 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 WHERE R.rid
2f20: 20 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 IN $theset..
2f30: 20 20 41 4e 44 20 20 20 20 52 2e 72 69 64 20 3d AND R.rid =
2f40: 20 42 2e 72 69 64 0a 09 20 20 20 20 41 4e 44 20 B.rid.. AND
2f50: 20 20 20 42 2e 62 72 69 64 20 49 4e 20 24 74 68 B.brid IN $th
2f60: 65 73 65 74 0a 09 22 5d 20 7b 0a 09 20 20 20 20 eset.."] {..
2f70: 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69 6e # Consider movin
2f80: 67 20 74 68 69 73 20 74 6f 20 74 68 65 20 69 6e g this to the in
2f90: 74 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e 0a tegrity module..
2fa0: 09 20 20 20 20 69 66 20 7b 24 72 69 64 20 3d 3d . if {$rid ==
2fb0: 20 24 63 68 69 6c 64 7d 20 7b 0a 09 09 74 72 6f $child} {...tro
2fc0: 75 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 22 52 uble internal "R
2fd0: 65 76 69 73 69 6f 6e 20 24 72 69 64 20 64 65 70 evision $rid dep
2fe0: 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 2e 22 ends on itself."
2ff0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6c 61 70 .. }.. lap
3000: 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 pend dependencie
3010: 73 28 24 72 69 64 29 20 24 63 68 69 6c 64 0a 09 s($rid) $child..
3020: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f }. }.. pro
3030: 63 20 50 75 6c 6c 53 75 63 63 65 73 73 6f 72 52 c PullSuccessorR
3040: 65 76 69 73 69 6f 6e 73 20 7b 64 76 20 72 65 76 evisions {dv rev
3050: 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 isions} {..upvar
3060: 20 31 20 24 64 76 20 64 65 70 65 6e 64 65 6e 63 1 $dv dependenc
3070: 69 65 73 0a 09 73 65 74 20 74 68 65 73 65 74 20 ies..set theset
3080: 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f ('[join $revisio
3090: 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 66 6f ns {','}]')...fo
30a0: 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 reach {rid child
30b0: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 20 } [state run ".
30c0: 20 20 2d 2d 20 50 72 69 6d 61 72 79 20 63 68 69 -- Primary chi
30d0: 6c 64 72 65 6e 0a 09 20 20 20 20 53 45 4c 45 43 ldren.. SELEC
30e0: 54 20 52 2e 72 69 64 2c 20 52 2e 63 68 69 6c 64 T R.rid, R.child
30f0: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 .. FROM rev
3100: 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 ision R.. WHE
3110: 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 RE R.rid IN $
3120: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 theset.. AND
3130: 20 20 20 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f R.child IS NO
3140: 54 20 4e 55 4c 4c 0a 20 20 20 20 55 4e 49 4f 4e T NULL. UNION
3150: 0a 20 20 20 20 2d 2d 20 54 72 61 6e 73 69 74 69 . -- Transiti
3160: 6f 6e 20 4e 54 44 42 20 74 6f 20 74 72 75 6e 6b on NTDB to trunk
3170: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 .. SELECT R.r
3180: 69 64 2c 20 52 2e 64 62 63 68 69 6c 64 0a 09 20 id, R.dbchild..
3190: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 FROM revisi
31a0: 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 on R.. WHERE
31b0: 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 R.rid IN $the
31c0: 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 set.. AND
31d0: 52 2e 64 62 63 68 69 6c 64 20 49 53 20 4e 4f 54 R.dbchild IS NOT
31e0: 20 4e 55 4c 4c 0a 20 20 20 20 55 4e 49 4f 4e 0a NULL. UNION.
31f0: 20 20 20 20 2d 2d 20 53 65 63 6f 6e 64 61 72 79 -- Secondary
3200: 20 28 62 72 61 6e 63 68 29 20 63 68 69 6c 64 72 (branch) childr
3210: 65 6e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 en.. SELECT R
3220: 2e 72 69 64 2c 20 42 2e 62 72 69 64 0a 09 20 20 .rid, B.brid..
3230: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f FROM revisio
3240: 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 62 72 61 n R, revisionbra
3250: 6e 63 68 63 68 69 6c 64 72 65 6e 20 42 0a 09 20 nchchildren B..
3260: 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 WHERE R.rid
3270: 20 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 IN $theset..
3280: 20 20 41 4e 44 20 20 20 20 52 2e 72 69 64 20 3d AND R.rid =
3290: 20 42 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 B.rid.."] {..
32a0: 20 20 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 # Consider mov
32b0: 69 6e 67 20 74 68 69 73 20 74 6f 20 74 68 65 20 ing this to the
32c0: 69 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 integrity module
32d0: 2e 0a 09 20 20 20 20 69 66 20 7b 24 72 69 64 20 ... if {$rid
32e0: 3d 3d 20 24 63 68 69 6c 64 7d 20 7b 0a 09 09 74 == $child} {...t
32f0: 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 rouble internal
3300: 22 52 65 76 69 73 69 6f 6e 20 24 72 69 64 20 64 "Revision $rid d
3310: 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 epends on itself
3320: 2e 22 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6c .".. }.. l
3330: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 append dependenc
3340: 69 65 73 28 24 72 69 64 29 20 24 63 68 69 6c 64 ies($rid) $child
3350: 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 ..}. }.. p
3360: 72 6f 63 20 50 75 6c 6c 50 72 65 64 65 63 65 73 roc PullPredeces
3370: 73 6f 72 52 65 76 69 73 69 6f 6e 73 20 7b 64 76 sorRevisions {dv
3380: 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 revisions} {..u
3390: 70 76 61 72 20 31 20 24 64 76 20 64 65 70 65 6e pvar 1 $dv depen
33a0: 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74 68 65 dencies..set the
33b0: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 set ('[join $rev
33c0: 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a isions {','}]').
33d0: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 70 ..foreach {rid p
33e0: 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 arent} [state ru
33f0: 6e 20 22 0a 20 20 20 2d 2d 20 50 72 69 6d 61 72 n ". -- Primar
3400: 79 20 70 61 72 65 6e 74 2c 20 63 61 6e 20 62 65 y parent, can be
3410: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 4c 4f in different LO
3420: 44 20 66 6f 72 20 66 69 72 73 74 20 69 6e 20 61 D for first in a
3430: 20 62 72 61 6e 63 68 0a 09 20 20 20 20 53 45 4c branch.. SEL
3440: 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 70 61 72 ECT R.rid, R.par
3450: 65 6e 74 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 ent.. FROM
3460: 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 revision R..
3470: 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 WHERE R.rid I
3480: 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 N $theset.. A
3490: 4e 44 20 20 20 20 52 2e 70 61 72 65 6e 74 20 49 ND R.parent I
34a0: 53 20 4e 4f 54 20 4e 55 4c 4c 0a 20 20 20 20 55 S NOT NULL. U
34b0: 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 54 72 61 6e NION. -- Tran
34c0: 73 69 74 69 6f 6e 20 74 72 75 6e 6b 20 74 6f 20 sition trunk to
34d0: 4e 54 44 42 0a 09 20 20 20 20 53 45 4c 45 43 54 NTDB.. SELECT
34e0: 20 52 2e 72 69 64 2c 20 52 2e 64 62 70 61 72 65 R.rid, R.dbpare
34f0: 6e 74 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 nt.. FROM r
3500: 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 evision R.. W
3510: 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e HERE R.rid IN
3520: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e $theset.. AN
3530: 44 20 20 20 20 52 2e 64 62 70 61 72 65 6e 74 20 D R.dbparent
3540: 49 53 20 4e 4f 54 20 4e 55 4c 4c 0a 09 22 5d 20 IS NOT NULL.."]
3550: 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 69 64 65 {.. # Conside
3560: 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 20 74 6f r moving this to
3570: 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6d the integrity m
3580: 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 66 20 7b odule... if {
3590: 24 72 69 64 20 3d 3d 20 24 70 61 72 65 6e 74 7d $rid == $parent}
35a0: 20 7b 0a 09 09 74 72 6f 75 62 6c 65 20 69 6e 74 {...trouble int
35b0: 65 72 6e 61 6c 20 22 52 65 76 69 73 69 6f 6e 20 ernal "Revision
35c0: 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 $rid depends on
35d0: 69 74 73 65 6c 66 2e 22 0a 09 20 20 20 20 7d 0a itself.".. }.
35e0: 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 . lappend dep
35f0: 65 6e 64 65 6e 63 69 65 73 28 24 72 69 64 29 20 endencies($rid)
3600: 24 70 61 72 65 6e 74 0a 09 7d 0a 20 20 20 20 7d $parent..}. }
3610: 0a 0a 20 20 20 20 70 72 6f 63 20 49 6e 69 74 69 .. proc Initi
3620: 61 6c 69 7a 65 42 72 65 61 6b 53 74 61 74 65 20 alizeBreakState
3630: 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 {revisions} {..u
3640: 70 76 61 72 20 31 20 70 6f 73 20 70 6f 73 20 63 pvar 1 pos pos c
3650: 72 6f 73 73 20 63 72 6f 73 73 20 72 61 6e 67 65 ross cross range
3660: 20 72 61 6e 67 65 20 64 65 70 63 20 64 65 70 63 range depc depc
3670: 20 64 65 6c 74 61 20 64 65 6c 74 61 20 5c 0a 09 delta delta \..
3680: 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65 73 dependencies
3690: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 0a 09 dependencies...
36a0: 23 20 46 69 72 73 74 20 77 65 20 63 72 65 61 74 # First we creat
36b0: 65 20 61 20 6d 61 70 20 6f 66 20 70 6f 73 69 74 e a map of posit
36c0: 69 6f 6e 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 ions to make it
36d0: 65 61 73 69 65 72 20 74 6f 0a 09 23 20 64 65 74 easier to..# det
36e0: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 61 ermine whether a
36f0: 20 64 65 70 65 6e 64 65 6e 63 79 20 63 72 6f 73 dependency cros
3700: 73 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 ses a particular
3710: 20 69 6e 64 65 78 2e 0a 0a 09 61 72 72 61 79 20 index....array
3720: 73 65 74 20 70 6f 73 20 20 20 7b 7d 0a 09 61 72 set pos {}..ar
3730: 72 61 79 20 73 65 74 20 63 72 6f 73 73 20 7b 7d ray set cross {}
3740: 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 70 63 ..array set depc
3750: 20 20 7b 7d 0a 09 73 65 74 20 72 61 6e 67 65 20 {}..set range
3760: 20 20 20 20 20 20 7b 7d 0a 09 73 65 74 20 6e 20 {}..set n
3770: 30 0a 09 66 6f 72 65 61 63 68 20 72 65 76 20 24 0..foreach rev $
3780: 72 65 76 69 73 69 6f 6e 73 20 7b 20 0a 09 20 20 revisions { ..
3790: 20 20 6c 61 70 70 65 6e 64 20 72 61 6e 67 65 20 lappend range
37a0: 24 6e 0a 09 20 20 20 20 73 65 74 20 70 6f 73 28 $n.. set pos(
37b0: 24 72 65 76 29 20 24 6e 0a 09 20 20 20 20 73 65 $rev) $n.. se
37c0: 74 20 63 72 6f 73 73 28 24 6e 29 20 30 0a 09 20 t cross($n) 0..
37d0: 20 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 0a 09 23 incr n..}...#
37e0: 20 53 65 63 6f 6e 64 6c 79 20 77 65 20 63 6f 75 Secondly we cou
37f0: 6e 74 20 74 68 65 20 63 72 6f 73 73 69 6e 67 73 nt the crossings
3800: 20 70 65 72 20 70 6f 73 69 74 69 6f 6e 2c 20 62 per position, b
3810: 79 20 69 74 65 72 61 74 69 6e 67 0a 09 23 20 6f y iterating..# o
3820: 76 65 72 20 74 68 65 20 72 65 63 6f 72 64 65 64 ver the recorded
3830: 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 internal depend
3840: 65 6e 63 69 65 73 2e 0a 0a 09 23 20 4e 6f 74 65 encies....# Note
3850: 3a 20 49 66 20 74 68 65 20 74 69 6d 65 73 74 61 : If the timesta
3860: 6d 70 73 20 61 72 65 20 62 61 64 6c 79 20 6f 75 mps are badly ou
3870: 74 20 6f 66 20 6f 72 64 65 72 20 69 74 20 69 73 t of order it is
3880: 0a 09 23 20 20 20 20 20 20 20 70 6f 73 73 69 62 ..# possib
3890: 6c 65 20 74 6f 20 68 61 76 65 20 61 20 62 61 63 le to have a bac
38a0: 6b 77 61 72 64 20 73 75 63 63 65 73 73 6f 72 20 kward successor
38b0: 64 65 70 65 6e 64 65 6e 63 79 2c 0a 09 23 20 20 dependency,..#
38c0: 20 20 20 20 20 69 2e 65 2e 20 77 69 74 68 20 73 i.e. with s
38d0: 74 61 72 74 20 3e 20 65 6e 64 2e 20 57 65 20 6d tart > end. We m
38e0: 61 79 20 68 61 76 65 20 74 6f 20 73 77 61 70 20 ay have to swap
38f0: 74 68 65 20 69 6e 64 69 63 65 73 0a 09 23 20 20 the indices..#
3900: 20 20 20 20 20 74 6f 20 65 6e 73 75 72 65 20 74 to ensure t
3910: 68 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e hat the followin
3920: 67 20 6c 6f 6f 70 20 72 75 6e 73 20 63 6f 72 72 g loop runs corr
3930: 65 63 74 6c 79 2e 0a 09 23 0a 09 23 20 4e 6f 74 ectly...#..# Not
3940: 65 20 32 3a 20 73 74 61 72 74 20 3d 3d 20 65 6e e 2: start == en
3950: 64 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c d is not possibl
3960: 65 2e 20 49 74 20 69 6e 64 69 63 61 74 65 73 20 e. It indicates
3970: 61 0a 09 23 20 20 20 20 20 20 20 20 20 73 65 6c a..# sel
3980: 66 2d 64 65 70 65 6e 64 65 6e 63 79 20 64 75 65 f-dependency due
3990: 20 74 6f 20 74 68 65 20 75 6e 69 71 75 65 6e 65 to the uniquene
39a0: 73 73 20 6f 66 20 70 6f 73 69 74 69 6f 6e 73 2c ss of positions,
39b0: 0a 09 23 20 20 20 20 20 20 20 20 20 61 6e 64 20 ..# and
39c0: 74 68 61 74 20 69 73 20 73 6f 6d 65 74 68 69 6e that is somethin
39d0: 67 20 77 65 20 68 61 76 65 20 72 75 6c 65 64 20 g we have ruled
39e0: 6f 75 74 20 61 6c 72 65 61 64 79 2c 20 73 65 65 out already, see
39f0: 0a 09 23 20 20 20 20 20 20 20 20 20 50 75 6c 6c ..# Pull
3a00: 49 6e 74 65 72 6e 61 6c 53 75 63 63 65 73 73 6f InternalSuccesso
3a10: 72 52 65 76 69 73 69 6f 6e 73 2e 0a 0a 09 66 6f rRevisions....fo
3a20: 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 reach {rid child
3a30: 7d 20 5b 61 72 72 61 79 20 67 65 74 20 64 65 70 } [array get dep
3a40: 65 6e 64 65 6e 63 69 65 73 5d 20 7b 0a 09 20 20 endencies] {..
3a50: 20 20 73 65 74 20 64 6b 65 79 20 20 20 20 5b 6c set dkey [l
3a60: 69 73 74 20 24 72 69 64 20 24 63 68 69 6c 64 5d ist $rid $child]
3a70: 0a 09 20 20 20 20 73 65 74 20 73 74 61 72 74 20 .. set start
3a80: 20 20 24 70 6f 73 28 24 72 69 64 29 0a 09 20 20 $pos($rid)..
3a90: 20 20 73 65 74 20 65 6e 64 20 20 20 20 20 24 70 set end $p
3aa0: 6f 73 28 24 63 68 69 6c 64 29 0a 09 20 20 20 20 os($child)..
3ab0: 73 65 74 20 63 72 6f 73 73 65 73 20 7b 7d 0a 0a set crosses {}..
3ac0: 09 20 20 20 20 69 66 20 7b 24 73 74 61 72 74 20 . if {$start
3ad0: 3e 20 24 65 6e 64 7d 20 7b 0a 09 09 77 68 69 6c > $end} {...whil
3ae0: 65 20 7b 24 65 6e 64 20 3c 20 24 73 74 61 72 74 e {$end < $start
3af0: 7d 20 7b 0a 09 09 20 20 20 20 6c 61 70 70 65 6e } {... lappen
3b00: 64 20 63 72 6f 73 73 65 73 20 24 65 6e 64 0a 09 d crosses $end..
3b10: 09 20 20 20 20 69 6e 63 72 20 63 72 6f 73 73 28 . incr cross(
3b20: 24 65 6e 64 29 0a 09 09 20 20 20 20 69 6e 63 72 $end)... incr
3b30: 20 65 6e 64 0a 09 09 7d 0a 09 20 20 20 20 7d 20 end...}.. }
3b40: 65 6c 73 65 20 7b 0a 09 09 77 68 69 6c 65 20 7b else {...while {
3b50: 24 73 74 61 72 74 20 3c 20 24 65 6e 64 7d 20 7b $start < $end} {
3b60: 0a 09 09 20 20 20 20 6c 61 70 70 65 6e 64 20 63 ... lappend c
3b70: 72 6f 73 73 65 73 20 24 73 74 61 72 74 0a 09 09 rosses $start...
3b80: 20 20 20 20 69 6e 63 72 20 63 72 6f 73 73 28 24 incr cross($
3b90: 73 74 61 72 74 29 0a 09 09 20 20 20 20 69 6e 63 start)... inc
3ba0: 72 20 73 74 61 72 74 0a 09 09 7d 0a 09 20 20 20 r start...}..
3bb0: 20 7d 0a 09 20 20 20 20 73 65 74 20 64 65 70 63 }.. set depc
3bc0: 28 24 64 6b 65 79 29 20 24 63 72 6f 73 73 65 73 ($dkey) $crosses
3bd0: 0a 09 7d 0a 0a 09 49 6e 69 74 69 61 6c 69 7a 65 ..}...Initialize
3be0: 44 65 6c 74 61 73 20 24 72 65 76 69 73 69 6f 6e Deltas $revision
3bf0: 73 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a s..return. }.
3c00: 0a 20 20 20 20 70 72 6f 63 20 49 6e 69 74 69 61 . proc Initia
3c10: 6c 69 7a 65 44 65 6c 74 61 73 20 7b 72 65 76 69 lizeDeltas {revi
3c20: 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 sions} {..upvar
3c30: 31 20 64 65 6c 74 61 20 64 65 6c 74 61 0a 0a 09 1 delta delta...
3c40: 23 20 50 75 6c 6c 20 74 68 65 20 74 69 6d 65 73 # Pull the times
3c50: 74 61 6d 70 73 20 66 6f 72 20 61 6c 6c 20 72 65 tamps for all re
3c60: 76 69 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 63 visions in the c
3c70: 68 61 6e 67 65 73 65 74 73 20 61 6e 64 0a 09 23 hangesets and..#
3c80: 20 63 6f 6d 70 75 74 65 20 74 68 65 69 72 20 64 compute their d
3c90: 65 6c 74 61 73 20 66 6f 72 20 75 73 65 20 62 79 eltas for use by
3ca0: 20 74 68 65 20 62 72 65 61 6b 20 66 69 6e 64 65 the break finde
3cb0: 72 2e 0a 0a 09 61 72 72 61 79 20 73 65 74 20 64 r....array set d
3cc0: 65 6c 74 61 20 7b 7d 0a 09 61 72 72 61 79 20 73 elta {}..array s
3cd0: 65 74 20 73 74 61 6d 70 20 7b 7d 0a 0a 09 73 65 et stamp {}...se
3ce0: 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e t theset ('[join
3cf0: 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 $revisions {','
3d00: 7d 5d 27 29 0a 09 66 6f 72 65 61 63 68 20 7b 72 }]')..foreach {r
3d10: 69 64 20 74 69 6d 65 7d 20 5b 73 74 61 74 65 20 id time} [state
3d20: 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 run ".. SELEC
3d30: 54 20 52 2e 72 69 64 2c 20 52 2e 64 61 74 65 0a T R.rid, R.date.
3d40: 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 . FROM revisi
3d50: 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 on R.. WHERE
3d60: 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 R.rid IN $theset
3d70: 0a 09 22 5d 20 7b 0a 09 20 20 20 20 73 65 74 20 .."] {.. set
3d80: 73 74 61 6d 70 28 24 72 69 64 29 20 24 74 69 6d stamp($rid) $tim
3d90: 65 0a 09 7d 0a 0a 09 73 65 74 20 6e 20 30 0a 09 e..}...set n 0..
3da0: 66 6f 72 65 61 63 68 20 72 69 64 20 5b 6c 72 61 foreach rid [lra
3db0: 6e 67 65 20 24 72 65 76 69 73 69 6f 6e 73 20 30 nge $revisions 0
3dc0: 20 65 6e 64 2d 31 5d 20 72 6e 65 78 74 20 5b 6c end-1] rnext [l
3dd0: 72 61 6e 67 65 20 24 72 65 76 69 73 69 6f 6e 73 range $revisions
3de0: 20 31 20 65 6e 64 5d 20 7b 0a 09 20 20 20 20 73 1 end] {.. s
3df0: 65 74 20 64 65 6c 74 61 28 24 6e 29 20 5b 65 78 et delta($n) [ex
3e00: 70 72 20 7b 24 73 74 61 6d 70 28 24 72 6e 65 78 pr {$stamp($rnex
3e10: 74 29 20 2d 20 24 73 74 61 6d 70 28 24 72 69 64 t) - $stamp($rid
3e20: 29 7d 5d 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a )}].. incr n.
3e30: 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d .}..return. }
3e40: 0a 0a 20 20 20 20 70 72 6f 63 20 46 69 6e 64 42 .. proc FindB
3e50: 65 73 74 42 72 65 61 6b 20 7b 72 61 6e 67 65 7d estBreak {range}
3e60: 20 7b 0a 09 75 70 76 61 72 20 31 20 63 72 6f 73 {..upvar 1 cros
3e70: 73 20 63 72 6f 73 73 20 64 65 6c 74 61 20 64 65 s cross delta de
3e80: 6c 74 61 0a 0a 09 23 20 44 65 74 65 72 6d 69 6e lta...# Determin
3e90: 65 20 74 68 65 20 62 65 73 74 20 62 72 65 61 6b e the best break
3ea0: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 location in the
3eb0: 20 67 69 76 65 6e 20 72 61 6e 67 65 20 6f 66 0a given range of.
3ec0: 09 23 20 70 6f 73 69 74 69 6f 6e 73 2e 20 46 69 .# positions. Fi
3ed0: 72 73 74 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 rst we look for
3ee0: 74 68 65 20 6c 6f 63 61 74 69 6f 6e 73 20 77 69 the locations wi
3ef0: 74 68 20 74 68 65 20 6d 61 78 69 6d 61 6c 0a 09 th the maximal..
3f00: 23 20 6e 75 6d 62 65 72 20 6f 66 20 63 72 6f 73 # number of cros
3f10: 73 69 6e 67 73 2e 20 49 66 20 74 68 65 72 65 20 sings. If there
3f20: 61 72 65 20 73 65 76 65 72 61 6c 20 77 65 20 6c are several we l
3f30: 6f 6f 6b 20 66 6f 72 20 74 68 65 0a 09 23 20 73 ook for the..# s
3f40: 68 6f 72 74 65 73 74 20 74 69 6d 65 20 69 6e 74 hortest time int
3f50: 65 72 76 61 6c 20 61 6d 6f 6e 67 20 74 68 65 6d erval among them
3f60: 2e 20 49 66 20 77 65 20 73 74 69 6c 6c 20 68 61 . If we still ha
3f70: 76 65 20 6d 75 6c 74 69 70 6c 65 0a 09 23 20 70 ve multiple..# p
3f80: 6f 73 73 69 62 69 6c 69 74 69 65 73 20 61 66 74 ossibilities aft
3f90: 65 72 20 74 68 61 74 20 77 65 20 73 65 6c 65 63 er that we selec
3fa0: 74 20 74 68 65 20 65 61 72 6c 69 65 73 74 20 6c t the earliest l
3fb0: 6f 63 61 74 69 6f 6e 0a 09 23 20 61 6d 6f 6e 67 ocation..# among
3fc0: 20 74 68 65 73 65 2e 0a 0a 09 23 20 4e 6f 74 65 these....# Note
3fd0: 3a 20 49 66 20 74 68 65 20 6d 61 78 69 6d 61 6c : If the maximal
3fe0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 72 6f 73 73 number of cross
3ff0: 69 6e 67 73 20 69 73 20 30 20 74 68 65 6e 20 74 ings is 0 then t
4000: 68 65 20 72 61 6e 67 65 0a 09 23 20 20 20 20 20 he range..#
4010: 20 20 68 61 73 20 6e 6f 20 69 6e 74 65 72 6e 61 has no interna
4020: 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 l dependencies,
4030: 61 6e 64 20 6e 6f 20 62 72 65 61 6b 20 6c 6f 63 and no break loc
4040: 61 74 69 6f 6e 20 61 74 0a 09 23 20 20 20 20 20 ation at..#
4050: 20 20 61 6c 6c 2e 20 54 68 69 73 20 70 6f 73 73 all. This poss
4060: 69 62 69 6c 69 74 79 20 69 73 20 73 69 67 6e 61 ibility is signa
4070: 6c 65 64 20 76 69 61 20 72 65 73 75 6c 74 20 2d led via result -
4080: 31 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 41 20 72 1....# Note: A r
4090: 61 6e 67 65 20 6f 66 20 6c 65 6e 67 74 68 20 31 ange of length 1
40a0: 20 6f 72 20 6c 65 73 73 20 63 61 6e 6e 6f 74 20 or less cannot
40b0: 68 61 76 65 20 69 6e 74 65 72 6e 61 6c 0a 09 23 have internal..#
40c0: 20 20 20 20 20 20 20 64 65 70 65 6e 64 65 6e 63 dependenc
40d0: 69 65 73 2c 20 61 73 20 74 68 61 74 20 6e 65 65 ies, as that nee
40e0: 64 73 20 61 74 20 6c 65 61 73 74 20 74 77 6f 20 ds at least two
40f0: 72 65 76 69 73 69 6f 6e 73 20 69 6e 0a 09 23 20 revisions in..#
4100: 20 20 20 20 20 20 74 68 65 20 72 61 6e 67 65 2e the range.
4110: 0a 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 ...if {[llength
4120: 24 72 61 6e 67 65 5d 20 3c 20 32 7d 20 7b 20 72 $range] < 2} { r
4130: 65 74 75 72 6e 20 2d 31 20 7d 0a 0a 09 73 65 74 eturn -1 }...set
4140: 20 6d 61 78 20 2d 31 0a 09 73 65 74 20 62 65 73 max -1..set bes
4150: 74 20 7b 7d 0a 0a 09 66 6f 72 65 61 63 68 20 6c t {}...foreach l
4160: 6f 63 61 74 69 6f 6e 20 24 72 61 6e 67 65 20 7b ocation $range {
4170: 0a 09 20 20 20 20 73 65 74 20 63 72 6f 73 73 69 .. set crossi
4180: 6e 67 73 20 24 63 72 6f 73 73 28 24 6c 6f 63 61 ngs $cross($loca
4190: 74 69 6f 6e 29 0a 09 20 20 20 20 69 66 20 7b 24 tion).. if {$
41a0: 63 72 6f 73 73 69 6e 67 73 20 3e 20 24 6d 61 78 crossings > $max
41b0: 7d 20 7b 0a 09 09 73 65 74 20 6d 61 78 20 20 24 } {...set max $
41c0: 63 72 6f 73 73 69 6e 67 73 0a 09 09 73 65 74 20 crossings...set
41d0: 62 65 73 74 20 5b 6c 69 73 74 20 24 6c 6f 63 61 best [list $loca
41e0: 74 69 6f 6e 5d 0a 09 09 63 6f 6e 74 69 6e 75 65 tion]...continue
41f0: 0a 09 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b .. } elseif {
4200: 24 63 72 6f 73 73 69 6e 67 73 20 3d 3d 20 24 6d $crossings == $m
4210: 61 78 7d 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 ax} {...lappend
4220: 62 65 73 74 20 24 6c 6f 63 61 74 69 6f 6e 0a 09 best $location..
4230: 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b 24 }..}...if {$
4240: 6d 61 78 20 3d 3d 20 30 7d 20 20 20 20 20 20 20 max == 0}
4250: 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20 2d 31 { return -1
4260: 20 7d 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 }..if {[llength
4270: 20 24 62 65 73 74 5d 20 3d 3d 20 31 7d 20 7b 20 $best] == 1} {
4280: 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 return [lindex $
4290: 62 65 73 74 20 30 5d 20 7d 0a 0a 09 73 65 74 20 best 0] }...set
42a0: 6c 6f 63 61 74 69 6f 6e 73 20 24 62 65 73 74 0a locations $best.
42b0: 09 73 65 74 20 62 65 73 74 20 7b 7d 0a 09 73 65 .set best {}..se
42c0: 74 20 6d 69 6e 20 2d 31 0a 0a 09 66 6f 72 65 61 t min -1...forea
42d0: 63 68 20 6c 6f 63 61 74 69 6f 6e 20 24 6c 6f 63 ch location $loc
42e0: 61 74 69 6f 6e 73 20 7b 0a 09 20 20 20 20 73 65 ations {.. se
42f0: 74 20 69 6e 74 65 72 76 61 6c 20 24 64 65 6c 74 t interval $delt
4300: 61 28 24 6c 6f 63 61 74 69 6f 6e 29 0a 09 20 20 a($location)..
4310: 20 20 69 66 20 7b 28 24 6d 69 6e 20 3c 20 30 29 if {($min < 0)
4320: 20 7c 7c 20 28 24 69 6e 74 65 72 76 61 6c 20 3c || ($interval <
4330: 20 24 6d 69 6e 29 7d 20 7b 0a 09 09 73 65 74 20 $min)} {...set
4340: 6d 69 6e 20 20 24 69 6e 74 65 72 76 61 6c 0a 09 min $interval..
4350: 09 73 65 74 20 62 65 73 74 20 5b 6c 69 73 74 20 .set best [list
4360: 24 6c 6f 63 61 74 69 6f 6e 5d 0a 09 20 20 20 20 $location]..
4370: 7d 20 65 6c 73 65 69 66 20 7b 24 69 6e 74 65 72 } elseif {$inter
4380: 76 61 6c 20 3d 3d 20 24 6d 69 6e 7d 20 7b 0a 09 val == $min} {..
4390: 09 6c 61 70 70 65 6e 64 20 62 65 73 74 20 24 6c .lappend best $l
43a0: 6f 63 61 74 69 6f 6e 0a 09 20 20 20 20 7d 0a 09 ocation.. }..
43b0: 7d 0a 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 }...if {[llength
43c0: 20 24 62 65 73 74 5d 20 3d 3d 20 31 7d 20 7b 20 $best] == 1} {
43d0: 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 return [lindex $
43e0: 62 65 73 74 20 30 5d 20 7d 0a 0a 09 72 65 74 75 best 0] }...retu
43f0: 72 6e 20 5b 6c 69 6e 64 65 78 20 5b 6c 73 6f 72 rn [lindex [lsor
4400: 74 20 2d 69 6e 74 65 67 65 72 20 2d 69 6e 63 72 t -integer -incr
4410: 65 61 73 69 6e 67 20 24 62 65 73 74 5d 20 30 5d easing $best] 0]
4420: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 . }.. proc
4430: 20 43 75 74 41 74 20 7b 6c 6f 63 61 74 69 6f 6e CutAt {location
4440: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 63 72 6f } {..upvar 1 cro
4450: 73 73 20 63 72 6f 73 73 20 64 65 70 63 20 64 65 ss cross depc de
4460: 70 63 0a 0a 09 23 20 49 74 20 77 61 73 20 64 65 pc...# It was de
4470: 63 69 64 65 64 20 74 6f 20 73 70 6c 69 74 20 74 cided to split t
4480: 68 65 20 63 68 61 6e 67 65 73 65 74 20 61 74 20 he changeset at
4490: 74 68 65 20 67 69 76 65 6e 0a 09 23 20 6c 6f 63 the given..# loc
44a0: 61 74 69 6f 6e 2e 20 54 68 69 73 20 63 75 74 73 ation. This cuts
44b0: 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 64 65 70 a number of dep
44c0: 65 6e 64 65 6e 63 69 65 73 2e 20 48 65 72 65 20 endencies. Here
44d0: 77 65 20 75 70 64 61 74 65 0a 09 23 20 74 68 65 we update..# the
44e0: 20 63 72 6f 73 73 20 69 6e 66 6f 72 6d 61 74 69 cross informati
44f0: 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20 62 on so that the b
4500: 72 65 61 6b 20 66 69 6e 64 65 72 20 68 61 73 20 reak finder has
4510: 61 63 63 75 72 61 74 65 0a 09 23 20 64 61 74 61 accurate..# data
4520: 20 77 68 65 6e 20 77 65 20 6c 6f 6f 6b 20 61 74 when we look at
4530: 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 66 the generated f
4540: 72 61 67 6d 65 6e 74 73 2e 0a 0a 09 73 65 74 20 ragments....set
4550: 73 69 78 20 5b 6c 6f 67 20 76 69 73 69 62 6c 65 six [log visible
4560: 3f 20 36 5d 0a 0a 09 66 6f 72 65 61 63 68 20 7b ? 6]...foreach {
4570: 64 65 70 20 72 61 6e 67 65 7d 20 5b 61 72 72 61 dep range} [arra
4580: 79 20 67 65 74 20 64 65 70 63 5d 20 7b 0a 09 20 y get depc] {..
4590: 20 20 20 23 20 43 68 65 63 6b 20 61 6c 6c 20 64 # Check all d
45a0: 65 70 65 6e 64 65 6e 63 69 65 73 20 73 74 69 6c ependencies stil
45b0: 6c 20 6b 6e 6f 77 6e 2c 20 74 61 6b 65 20 74 68 l known, take th
45c0: 65 69 72 20 72 61 6e 67 65 20 61 6e 64 0a 09 20 eir range and..
45d0: 20 20 20 23 20 73 65 65 20 69 66 20 74 68 65 20 # see if the
45e0: 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 66 break location f
45f0: 61 6c 6c 73 20 77 69 74 68 69 6e 2e 0a 0a 09 20 alls within....
4600: 20 20 20 42 6f 72 64 65 72 20 24 72 61 6e 67 65 Border $range
4610: 20 73 20 65 0a 09 20 20 20 20 69 66 20 7b 24 6c s e.. if {$l
4620: 6f 63 61 74 69 6f 6e 20 3c 20 24 73 7d 20 63 6f ocation < $s} co
4630: 6e 74 69 6e 75 65 20 3b 20 23 20 62 72 65 61 6b ntinue ; # break
4640: 20 62 65 66 6f 72 65 20 72 61 6e 67 65 2c 20 69 before range, i
4650: 67 6e 6f 72 65 0a 09 20 20 20 20 69 66 20 7b 24 gnore.. if {$
4660: 6c 6f 63 61 74 69 6f 6e 20 3e 20 24 65 7d 20 63 location > $e} c
4670: 6f 6e 74 69 6e 75 65 20 3b 20 23 20 62 72 65 61 ontinue ; # brea
4680: 6b 20 61 66 74 65 72 20 72 61 6e 67 65 2c 20 69 k after range, i
4690: 67 6e 6f 72 65 2e 0a 0a 09 20 20 20 20 23 20 54 gnore.... # T
46a0: 68 69 73 20 64 65 70 65 6e 64 65 6e 63 79 20 63 his dependency c
46b0: 72 6f 73 73 65 73 20 74 68 65 20 62 72 65 61 6b rosses the break
46c0: 20 6c 6f 63 61 74 69 6f 6e 2e 20 57 65 20 72 65 location. We re
46d0: 6d 6f 76 65 20 69 74 0a 09 20 20 20 20 23 20 66 move it.. # f
46e0: 72 6f 6d 20 74 68 65 20 63 72 6f 73 73 69 6e 67 rom the crossing
46f0: 73 20 63 6f 75 6e 74 65 72 73 2c 20 61 6e 64 20 s counters, and
4700: 74 68 65 6e 20 61 6c 73 6f 20 66 72 6f 6d 20 74 then also from t
4710: 68 65 20 73 65 74 0a 09 20 20 20 20 23 20 6f 66 he set.. # of
4720: 20 6b 6e 6f 77 6e 20 64 65 70 65 6e 64 65 6e 63 known dependenc
4730: 69 65 73 2c 20 61 73 20 77 65 20 61 72 65 20 64 ies, as we are d
4740: 6f 6e 65 20 77 69 74 68 20 69 74 2e 0a 0a 09 20 one with it....
4750: 20 20 20 66 6f 72 65 61 63 68 20 6c 6f 63 20 24 foreach loc $
4760: 64 65 70 63 28 24 64 65 70 29 20 7b 20 69 6e 63 depc($dep) { inc
4770: 72 20 63 72 6f 73 73 28 24 6c 6f 63 29 20 2d 31 r cross($loc) -1
4780: 20 7d 0a 09 20 20 20 20 75 6e 73 65 74 20 64 65 }.. unset de
4790: 70 63 28 24 64 65 70 29 0a 0a 09 20 20 20 20 69 pc($dep)... i
47a0: 66 20 7b 21 24 73 69 78 7d 20 63 6f 6e 74 69 6e f {!$six} contin
47b0: 75 65 0a 0a 09 20 20 20 20 73 74 72 75 63 74 3a ue... struct:
47c0: 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 24 64 65 :list assign $de
47d0: 70 20 70 61 72 65 6e 74 20 63 68 69 6c 64 0a 09 p parent child..
47e0: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 36 20 log write 6
47f0: 63 73 65 74 73 20 22 42 72 6f 6b 65 20 64 65 70 csets "Broke dep
4800: 65 6e 64 65 6e 63 79 20 5b 50 44 20 24 70 61 72 endency [PD $par
4810: 65 6e 74 5d 20 2d 2d 3e 20 5b 50 44 20 24 63 68 ent] --> [PD $ch
4820: 69 6c 64 5d 22 0a 09 7d 0a 0a 09 72 65 74 75 72 ild]"..}...retur
4830: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 50 n. }.. # P
4840: 72 69 6e 74 20 69 64 65 6e 74 69 66 79 69 6e 67 rint identifying
4850: 20 64 61 74 61 20 66 6f 72 20 61 20 72 65 76 69 data for a revi
4860: 73 69 6f 6e 20 28 70 72 6f 6a 65 63 74 2c 20 66 sion (project, f
4870: 69 6c 65 2c 20 64 6f 74 74 65 64 20 72 65 76 0a ile, dotted rev.
4880: 20 20 20 20 23 20 6e 75 6d 62 65 72 29 2c 20 66 # number), f
4890: 6f 72 20 68 69 67 68 20 76 65 72 62 6f 73 69 74 or high verbosit
48a0: 79 20 6c 6f 67 20 6f 75 74 70 75 74 2e 0a 0a 20 y log output...
48b0: 20 20 20 70 72 6f 63 20 50 44 20 7b 69 64 7d 20 proc PD {id}
48c0: 7b 0a 09 66 6f 72 65 61 63 68 20 7b 70 20 66 20 {..foreach {p f
48d0: 72 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a r} [state run {.
48e0: 09 09 53 45 4c 45 43 54 20 50 2e 6e 61 6d 65 20 ..SELECT P.name
48f0: 2c 20 46 2e 6e 61 6d 65 2c 20 52 2e 72 65 76 0a , F.name, R.rev.
4900: 09 09 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 ..FROM revision
4910: 52 2c 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65 R, file F, proje
4920: 63 74 20 50 0a 09 09 57 48 45 52 45 20 52 2e 72 ct P...WHERE R.r
4930: 69 64 20 3d 20 24 69 64 0a 09 09 41 4e 44 20 20 id = $id...AND
4940: 20 52 2e 66 69 64 20 3d 20 46 2e 66 69 64 0a 09 R.fid = F.fid..
4950: 09 41 4e 44 20 20 20 46 2e 70 69 64 20 3d 20 50 .AND F.pid = P
4960: 2e 70 69 64 0a 09 7d 5d 20 62 72 65 61 6b 0a 09 .pid..}] break..
4970: 72 65 74 75 72 6e 20 22 27 24 70 20 3a 20 24 66 return "'$p : $f
4980: 2f 24 72 27 22 0a 20 20 20 20 7d 0a 0a 20 20 20 /$r'". }..
4990: 20 23 20 50 72 69 6e 74 69 6e 67 20 6f 6e 65 20 # Printing one
49a0: 6f 72 20 6d 6f 72 65 20 72 61 6e 67 65 73 2c 20 or more ranges,
49b0: 66 6f 72 6d 61 74 74 65 64 2c 20 61 6e 64 20 6f formatted, and o
49c0: 6e 6c 79 20 74 68 65 69 72 20 62 6f 72 64 65 72 nly their border
49d0: 20 74 6f 0a 20 20 20 20 23 20 6b 65 65 70 20 74 to. # keep t
49e0: 68 65 20 73 74 72 69 6e 67 73 20 73 68 6f 72 74 he strings short
49f0: 2e 0a 0a 20 20 20 20 70 72 6f 63 20 50 52 73 20 ... proc PRs
4a00: 7b 72 61 6e 67 65 73 7d 20 7b 0a 09 72 65 74 75 {ranges} {..retu
4a10: 72 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 rn [struct::list
4a20: 20 6d 61 70 20 24 72 61 6e 67 65 73 20 5b 6d 79 map $ranges [my
4a30: 70 72 6f 63 20 50 52 5d 5d 0a 20 20 20 20 7d 0a proc PR]]. }.
4a40: 0a 20 20 20 20 70 72 6f 63 20 50 52 20 7b 72 61 . proc PR {ra
4a50: 6e 67 65 7d 20 7b 0a 09 42 6f 72 64 65 72 20 24 nge} {..Border $
4a60: 72 61 6e 67 65 20 73 20 65 0a 09 72 65 74 75 72 range s e..retur
4a70: 6e 20 3c 24 7b 73 7d 2e 2e 2e 24 7b 65 7d 3e 0a n <${s}...${e}>.
4a80: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 }.. proc
4a90: 42 6f 72 64 65 72 20 7b 72 61 6e 67 65 20 73 76 Border {range sv
4aa0: 20 65 76 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 ev} {..upvar 1
4ab0: 24 73 76 20 73 20 24 65 76 20 65 0a 09 73 65 74 $sv s $ev e..set
4ac0: 20 73 20 5b 6c 69 6e 64 65 78 20 24 72 61 6e 67 s [lindex $rang
4ad0: 65 20 30 5d 0a 09 73 65 74 20 65 20 5b 6c 69 6e e 0]..set e [lin
4ae0: 64 65 78 20 24 72 61 6e 67 65 20 65 6e 64 5d 0a dex $range end].
4af0: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 .return. }..
4b00: 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 # # ## ### ##
4b10: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 ### ######## ###
4b20: 23 23 23 23 23 23 23 23 23 23 0a 0a 20 20 20 20 ##########..
4b30: 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 typevariable myc
4b40: 68 61 6e 67 65 73 65 74 73 20 20 20 20 7b 7d 20 hangesets {}
4b50: 3b 20 23 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 ; # List of all
4b60: 6b 6e 6f 77 6e 20 63 68 61 6e 67 65 73 65 74 73 known changesets
4b70: 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62 .. typevariab
4b80: 6c 65 20 6d 79 72 65 76 6d 61 70 20 2d 61 72 72 le myrevmap -arr
4b90: 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 66 72 ay {} ; # Map fr
4ba0: 6f 6d 20 72 65 76 69 73 69 6f 6e 73 20 74 6f 20 om revisions to
4bb0: 74 68 65 69 72 20 63 68 61 6e 67 65 73 65 74 2e their changeset.
4bc0: 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c . typevariabl
4bd0: 65 20 6d 79 69 64 6d 61 70 20 20 2d 61 72 72 61 e myidmap -arra
4be0: 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 66 72 6f y {} ; # Map fro
4bf0: 6d 20 63 68 61 6e 67 65 73 65 74 20 69 64 20 74 m changeset id t
4c00: 6f 20 63 68 61 6e 67 65 73 65 74 2e 0a 20 20 20 o changeset..
4c10: 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 typevariable my
4c20: 62 72 61 6e 63 68 63 6f 64 65 20 20 20 20 7b 7d branchcode {}
4c30: 20 3b 20 23 20 4c 6f 63 61 6c 20 63 6f 70 79 20 ; # Local copy
4c40: 6f 66 20 70 72 6f 6a 65 63 74 3a 3a 73 79 6d 2f of project::sym/
4c50: 6d 79 62 72 61 6e 63 68 2e 0a 0a 20 20 20 20 74 mybranch... t
4c60: 79 70 65 6d 65 74 68 6f 64 20 61 6c 6c 20 20 20 ypemethod all
4c70: 7b 7d 20 20 20 7b 20 72 65 74 75 72 6e 20 24 6d {} { return $m
4c80: 79 63 68 61 6e 67 65 73 65 74 73 20 7d 0a 20 20 ychangesets }.
4c90: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6f 66 20 typemethod of
4ca0: 20 20 20 7b 69 64 7d 20 7b 20 72 65 74 75 72 6e {id} { return
4cb0: 20 24 6d 79 69 64 6d 61 70 28 24 69 64 29 20 7d $myidmap($id) }
4cc0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 . typemethod
4cd0: 6f 66 72 65 76 20 7b 69 64 7d 20 7b 20 72 65 74 ofrev {id} { ret
4ce0: 75 72 6e 20 24 6d 79 72 65 76 6d 61 70 28 24 69 urn $myrevmap($i
4cf0: 64 29 20 7d 0a 0a 20 20 20 20 74 79 70 65 63 6f d) }.. typeco
4d00: 6e 73 74 72 75 63 74 6f 72 20 7b 0a 09 73 65 74 nstructor {..set
4d10: 20 6d 79 62 72 61 6e 63 68 63 6f 64 65 20 5b 70 mybranchcode [p
4d20: 72 6f 6a 65 63 74 3a 3a 73 79 6d 20 62 72 61 6e roject::sym bran
4d30: 63 68 5d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 ch]..return.
4d40: 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 }.. # # ## ##
4d50: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 # ##### ########
4d60: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 #############.
4d70: 20 20 20 23 23 20 43 6f 6e 66 69 67 75 72 61 74 ## Configurat
4d80: 69 6f 6e 0a 0a 20 20 20 20 70 72 61 67 6d 61 20 ion.. pragma
4d90: 2d 68 61 73 74 79 70 65 69 6e 66 6f 20 20 20 20 -hastypeinfo
4da0: 6e 6f 20 20 3b 20 23 20 6e 6f 20 74 79 70 65 20 no ; # no type
4db0: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20 20 introspection.
4dc0: 20 20 70 72 61 67 6d 61 20 2d 68 61 73 69 6e 66 pragma -hasinf
4dd0: 6f 20 20 20 20 20 20 20 20 6e 6f 20 20 3b 20 23 o no ; #
4de0: 20 6e 6f 20 6f 62 6a 65 63 74 20 69 6e 74 72 6f no object intro
4df0: 73 70 65 63 74 69 6f 6e 0a 20 20 20 20 70 72 61 spection. pra
4e00: 67 6d 61 20 2d 73 69 6d 70 6c 65 64 69 73 70 61 gma -simpledispa
4e10: 74 63 68 20 79 65 73 20 3b 20 23 20 73 69 6d 70 tch yes ; # simp
4e20: 6c 65 20 66 61 73 74 20 64 69 73 70 61 74 63 68 le fast dispatch
4e30: 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23 .. # # ## ###
4e40: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 ##### ########
4e50: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 7d 0a #############.}.
4e60: 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 .namespace eval
4e70: 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d ::vc::fossil::im
4e80: 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 port::cvs::proje
4e90: 63 74 20 7b 0a 20 20 20 20 6e 61 6d 65 73 70 61 ct {. namespa
4ea0: 63 65 20 65 78 70 6f 72 74 20 72 65 76 0a 20 20 ce export rev.
4eb0: 20 20 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c namespace eval
4ec0: 20 72 65 76 20 7b 0a 09 6e 61 6d 65 73 70 61 63 rev {..namespac
4ed0: 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 e import ::vc::f
4ee0: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 ossil::import::c
4ef0: 76 73 3a 3a 73 74 61 74 65 0a 09 6e 61 6d 65 73 vs::state..names
4f00: 70 61 63 65 20 65 76 61 6c 20 70 72 6f 6a 65 63 pace eval projec
4f10: 74 20 7b 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 t {.. namespa
4f20: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a ce import ::vc::
4f30: 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a fossil::import::
4f40: 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 73 79 cvs::project::sy
4f50: 6d 0a 09 7d 0a 09 6e 61 6d 65 73 70 61 63 65 20 m..}..namespace
4f60: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f import ::vc::too
4f70: 6c 73 3a 3a 6d 69 73 63 3a 3a 2a 0a 09 6e 61 6d ls::misc::*..nam
4f80: 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a espace import ::
4f90: 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 74 72 6f 75 62 vc::tools::troub
4fa0: 6c 65 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d le..namespace im
4fb0: 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 port ::vc::tools
4fc0: 3a 3a 6c 6f 67 0a 09 6c 6f 67 20 72 65 67 69 73 ::log..log regis
4fd0: 74 65 72 20 63 73 65 74 73 0a 20 20 20 20 7d 0a ter csets. }.
4fe0: 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 }..# # ## ### ##
4ff0: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 ### ######## ###
5000: 23 23 23 23 23 23 23 23 23 23 20 23 23 23 23 23 ########## #####
5010: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
5020: 0a 23 23 20 52 65 61 64 79 0a 0a 70 61 63 6b 61 .## Ready..packa
5030: 67 65 20 70 72 6f 76 69 64 65 20 76 63 3a 3a 66 ge provide vc::f
5040: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 ossil::import::c
5050: 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 vs::project::rev
5060: 20 31 2e 30 0a 72 65 74 75 72 6e 0a 1.0.return.