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 69 66 20 7b 21 5b gs {.. if {![
2640: 6c 6c 65 6e 67 74 68 20 24 66 72 61 67 6d 65 6e llength $fragmen
2650: 74 72 65 76 69 73 69 6f 6e 73 5d 7d 20 7b 0a 09 trevisions]} {..
2660: 09 74 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61 .trouble interna
2670: 6c 20 22 41 74 74 65 6d 70 74 65 64 20 74 6f 20 l "Attempted to
2680: 63 72 65 61 74 65 20 61 6e 20 65 6d 70 74 79 20 create an empty
2690: 63 68 61 6e 67 65 73 65 74 2c 20 69 2e 65 2e 20 changeset, i.e.
26a0: 77 69 74 68 6f 75 74 20 72 65 76 69 73 69 6f 6e without revision
26b0: 73 22 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6c s".. }.. l
26c0: 61 70 70 65 6e 64 20 6e 65 77 63 73 65 74 73 20 append newcsets
26d0: 5b 24 74 79 70 65 20 25 41 55 54 4f 25 20 24 70 [$type %AUTO% $p
26e0: 72 6f 6a 65 63 74 20 24 63 73 74 79 70 65 20 24 roject $cstype $
26f0: 63 73 73 72 63 20 24 66 72 61 67 6d 65 6e 74 72 cssrc $fragmentr
2700: 65 76 69 73 69 6f 6e 73 5d 0a 09 7d 0a 0a 09 66 evisions]..}...f
2710: 6f 72 65 61 63 68 20 63 20 24 6e 65 77 63 73 65 oreach c $newcse
2720: 74 73 20 7b 20 24 63 20 70 65 72 73 69 73 74 20 ts { $c persist
2730: 7d 0a 09 72 65 74 75 72 6e 20 24 6e 65 77 63 73 }..return $newcs
2740: 65 74 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 ets. }.. #
2750: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 # ## ### #####
2760: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
2770: 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 53 74 ######. ## St
2780: 61 74 65 0a 0a 20 20 20 20 76 61 72 69 61 62 6c ate.. variabl
2790: 65 20 6d 79 69 64 20 20 20 20 20 20 20 20 7b 7d e myid {}
27a0: 20 3b 20 23 20 49 64 20 6f 66 20 74 68 65 20 63 ; # Id of the c
27b0: 73 65 74 20 66 6f 72 20 74 68 65 20 70 65 72 73 set for the pers
27c0: 69 73 74 65 6e 74 0a 09 09 09 20 20 20 20 20 20 istent....
27d0: 23 20 73 74 61 74 65 2e 0a 20 20 20 20 76 61 72 # state.. var
27e0: 69 61 62 6c 65 20 6d 79 70 72 6f 6a 65 63 74 20 iable myproject
27f0: 20 20 7b 7d 20 3b 20 23 20 52 65 66 65 72 65 6e {} ; # Referen
2800: 63 65 20 6f 66 20 74 68 65 20 70 72 6f 6a 65 63 ce of the projec
2810: 74 20 6f 62 6a 65 63 74 20 74 68 65 0a 09 09 09 t object the....
2820: 20 20 20 20 20 20 23 20 63 68 61 6e 67 65 73 65 # changese
2830: 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 20 20 t belongs to..
2840: 20 20 76 61 72 69 61 62 6c 65 20 6d 79 74 79 70 variable mytyp
2850: 65 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 72 65 e {} ; # re
2860: 76 20 6f 72 20 73 79 6d 2c 20 77 68 65 72 65 20 v or sym, where
2870: 74 68 65 20 63 73 65 74 20 6f 72 69 67 69 6e 61 the cset origina
2880: 74 65 64 0a 09 09 09 20 20 20 20 20 20 23 20 66 ted.... # f
2890: 72 6f 6d 2e 0a 20 20 20 20 76 61 72 69 61 62 6c rom.. variabl
28a0: 65 20 6d 79 73 72 63 69 64 20 20 20 20 20 7b 7d e mysrcid {}
28b0: 20 3b 20 23 20 49 64 20 6f 66 20 74 68 65 20 6d ; # Id of the m
28c0: 65 74 61 64 61 74 61 20 6f 72 20 73 79 6d 62 6f etadata or symbo
28d0: 6c 20 74 68 65 20 63 73 65 74 0a 09 09 09 20 20 l the cset....
28e0: 20 20 20 20 23 20 69 73 20 62 61 73 65 64 20 6f # is based o
28f0: 6e 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 n.. variable
2900: 6d 79 72 65 76 69 73 69 6f 6e 73 20 7b 7d 20 3b myrevisions {} ;
2910: 20 23 20 4c 69 73 74 20 6f 66 20 74 68 65 20 66 # List of the f
2920: 69 6c 65 20 6c 65 76 65 6c 20 72 65 76 69 73 69 ile level revisi
2930: 6f 6e 73 20 69 6e 0a 09 09 09 20 20 20 20 20 20 ons in....
2940: 23 20 74 68 65 20 63 73 65 74 2e 0a 20 20 20 20 # the cset..
2950: 76 61 72 69 61 62 6c 65 20 6d 79 70 72 65 6d 61 variable myprema
2960: 70 20 20 20 20 7b 7d 20 3b 20 23 20 44 69 63 74 p {} ; # Dict
2970: 69 6f 6e 61 72 79 20 6d 61 70 70 69 6e 67 20 66 ionary mapping f
2980: 72 6f 6d 20 74 68 65 20 72 65 76 69 73 69 6f 6e rom the revision
2990: 73 0a 09 09 09 20 20 20 20 20 20 23 20 74 6f 20 s.... # to
29a0: 74 68 65 69 72 20 70 72 65 64 65 63 65 73 73 6f their predecesso
29b0: 72 73 2e 20 43 61 63 68 65 20 74 6f 20 61 76 6f rs. Cache to avo
29c0: 69 64 0a 09 09 09 20 20 20 20 20 20 23 20 6c 6f id.... # lo
29d0: 61 64 69 6e 67 20 74 68 69 73 20 66 72 6f 6d 20 ading this from
29e0: 74 68 65 20 73 74 61 74 65 20 6d 6f 72 65 20 74 the state more t
29f0: 68 61 6e 0a 09 09 09 20 20 20 20 20 20 23 20 6f han.... # o
2a00: 6e 63 65 2e 0a 20 20 20 20 76 61 72 69 61 62 6c nce.. variabl
2a10: 65 20 6d 79 6e 65 78 74 6d 61 70 20 20 20 7b 7d e mynextmap {}
2a20: 20 3b 20 23 20 44 69 63 74 69 6f 6e 61 72 79 20 ; # Dictionary
2a30: 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 mapping from the
2a40: 20 72 65 76 69 73 69 6f 6e 73 0a 09 09 09 20 20 revisions....
2a50: 20 20 20 20 23 20 74 6f 20 74 68 65 69 72 20 73 # to their s
2a60: 75 63 63 65 73 73 6f 72 73 2e 20 43 61 63 68 65 uccessors. Cache
2a70: 20 74 6f 20 61 76 6f 69 64 0a 09 09 09 20 20 20 to avoid....
2a80: 20 20 20 23 20 6c 6f 61 64 69 6e 67 20 74 68 69 # loading thi
2a90: 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65 s from the state
2aa0: 20 6d 6f 72 65 20 74 68 61 6e 0a 09 09 09 20 20 more than....
2ab0: 20 20 20 20 23 20 6f 6e 63 65 2e 0a 20 20 20 20 # once..
2ac0: 76 61 72 69 61 62 6c 65 20 6d 79 70 6f 73 20 20 variable mypos
2ad0: 20 20 20 20 20 7b 7d 20 3b 20 23 20 43 6f 6d 6d {} ; # Comm
2ae0: 69 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 it position of t
2af0: 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20 69 66 he changeset, if
2b00: 0a 09 09 09 20 20 20 20 20 20 23 20 6b 6e 6f 77 .... # know
2b10: 6e 2e 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 n... # # ## #
2b20: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 ## ##### #######
2b30: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a # #############.
2b40: 20 20 20 20 23 23 20 49 6e 74 65 72 6e 61 6c 20 ## Internal
2b50: 6d 65 74 68 6f 64 73 0a 0a 20 20 20 20 74 79 70 methods.. typ
2b60: 65 76 61 72 69 61 62 6c 65 20 6d 79 63 6f 75 6e evariable mycoun
2b70: 74 65 72 20 20 20 20 20 20 20 20 30 20 3b 20 23 ter 0 ; #
2b80: 20 49 64 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 Id counter for
2b90: 63 73 65 74 73 2e 20 4c 61 73 74 20 69 64 20 75 csets. Last id u
2ba0: 73 65 64 2e 0a 20 20 20 20 74 79 70 65 76 61 72 sed.. typevar
2bb0: 69 61 62 6c 65 20 6d 79 63 73 74 79 70 65 20 2d iable mycstype -
2bc0: 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 array {} ; # Map
2bd0: 20 63 73 74 79 70 65 73 20 74 6f 20 70 65 72 73 cstypes to pers
2be0: 69 73 74 65 6e 74 20 69 64 73 2e 0a 0a 20 20 20 istent ids...
2bf0: 20 74 79 70 65 6d 65 74 68 6f 64 20 67 65 74 63 typemethod getc
2c00: 73 74 79 70 65 73 20 7b 7d 20 7b 0a 09 66 6f 72 stypes {} {..for
2c10: 65 61 63 68 20 7b 74 69 64 20 6e 61 6d 65 7d 20 each {tid name}
2c20: 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 [state run {..
2c30: 20 20 53 45 4c 45 43 54 20 74 69 64 2c 20 6e 61 SELECT tid, na
2c40: 6d 65 20 46 52 4f 4d 20 63 73 74 79 70 65 3b 0a me FROM cstype;.
2c50: 09 7d 5d 20 7b 20 73 65 74 20 6d 79 63 73 74 79 .}] { set mycsty
2c60: 70 65 28 24 6e 61 6d 65 29 20 24 74 69 64 20 7d pe($name) $tid }
2c70: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a ..return. }..
2c80: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c typemethod l
2c90: 6f 61 64 63 6f 75 6e 74 65 72 20 7b 7d 20 7b 0a oadcounter {} {.
2ca0: 09 23 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 .# Initialize th
2cb0: 65 20 63 6f 75 6e 74 65 72 20 66 72 6f 6d 20 74 e counter from t
2cc0: 68 65 20 73 74 61 74 65 0a 09 73 65 74 20 6d 79 he state..set my
2cd0: 63 6f 75 6e 74 65 72 20 5b 73 74 61 74 65 20 6f counter [state o
2ce0: 6e 65 20 7b 20 53 45 4c 45 43 54 20 4d 41 58 28 ne { SELECT MAX(
2cf0: 63 69 64 29 20 46 52 4f 4d 20 63 68 61 6e 67 65 cid) FROM change
2d00: 73 65 74 20 7d 5d 0a 09 72 65 74 75 72 6e 0a 20 set }]..return.
2d10: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 50 }.. proc P
2d20: 75 6c 6c 49 6e 74 65 72 6e 61 6c 53 75 63 63 65 ullInternalSucce
2d30: 73 73 6f 72 52 65 76 69 73 69 6f 6e 73 20 7b 64 ssorRevisions {d
2d40: 76 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 v revisions} {..
2d50: 75 70 76 61 72 20 31 20 24 64 76 20 64 65 70 65 upvar 1 $dv depe
2d60: 6e 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74 68 ndencies..set th
2d70: 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 eset ('[join $re
2d80: 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 visions {','}]')
2d90: 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 ...foreach {rid
2da0: 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 child} [state ru
2db0: 6e 20 22 0a 20 20 20 2d 2d 20 50 72 69 6d 61 72 n ". -- Primar
2dc0: 79 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 y children..
2dd0: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e SELECT R.rid, R.
2de0: 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 child.. FROM
2df0: 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 revision R..
2e00: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 WHERE R.rid
2e10: 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 IN $theset..
2e20: 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 AND R.child
2e30: 49 53 20 4e 4f 54 20 4e 55 4c 4c 0a 09 20 20 20 IS NOT NULL..
2e40: 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 AND R.child
2e50: 49 4e 20 24 74 68 65 73 65 74 0a 20 20 20 20 55 IN $theset. U
2e60: 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 54 72 61 6e NION. -- Tran
2e70: 73 69 74 69 6f 6e 20 4e 54 44 42 20 74 6f 20 74 sition NTDB to t
2e80: 72 75 6e 6b 0a 09 20 20 20 20 53 45 4c 45 43 54 runk.. SELECT
2e90: 20 52 2e 72 69 64 2c 20 52 2e 64 62 63 68 69 6c R.rid, R.dbchil
2ea0: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 d.. FROM re
2eb0: 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 vision R.. WH
2ec0: 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 ERE R.rid IN
2ed0: 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 $theset.. AND
2ee0: 20 20 20 20 52 2e 64 62 63 68 69 6c 64 20 49 53 R.dbchild IS
2ef0: 20 4e 4f 54 20 4e 55 4c 4c 0a 09 20 20 20 20 41 NOT NULL.. A
2f00: 4e 44 20 20 20 20 52 2e 64 62 63 68 69 6c 64 20 ND R.dbchild
2f10: 49 4e 20 24 74 68 65 73 65 74 0a 20 20 20 20 55 IN $theset. U
2f20: 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 53 65 63 6f NION. -- Seco
2f30: 6e 64 61 72 79 20 28 62 72 61 6e 63 68 29 20 63 ndary (branch) c
2f40: 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 53 45 4c hildren.. SEL
2f50: 45 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 72 69 ECT R.rid, B.bri
2f60: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 d.. FROM re
2f70: 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 vision R, revisi
2f80: 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64 72 65 6e onbranchchildren
2f90: 20 42 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 B.. WHERE R
2fa0: 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 .rid IN $these
2fb0: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e t.. AND R.
2fc0: 72 69 64 20 3d 20 42 2e 72 69 64 0a 09 20 20 20 rid = B.rid..
2fd0: 20 41 4e 44 20 20 20 20 42 2e 62 72 69 64 20 49 AND B.brid I
2fe0: 4e 20 24 74 68 65 73 65 74 0a 09 22 5d 20 7b 0a N $theset.."] {.
2ff0: 09 20 20 20 20 23 20 43 6f 6e 73 69 64 65 72 20 . # Consider
3000: 6d 6f 76 69 6e 67 20 74 68 69 73 20 74 6f 20 74 moving this to t
3010: 68 65 20 69 6e 74 65 67 72 69 74 79 20 6d 6f 64 he integrity mod
3020: 75 6c 65 2e 0a 09 20 20 20 20 69 66 20 7b 24 72 ule... if {$r
3030: 69 64 20 3d 3d 20 24 63 68 69 6c 64 7d 20 7b 0a id == $child} {.
3040: 09 09 74 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e ..trouble intern
3050: 61 6c 20 22 52 65 76 69 73 69 6f 6e 20 24 72 69 al "Revision $ri
3060: 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 d depends on its
3070: 65 6c 66 2e 22 0a 09 20 20 20 20 7d 0a 09 20 20 elf.".. }..
3080: 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 lappend depend
3090: 65 6e 63 69 65 73 28 24 72 69 64 29 20 24 63 68 encies($rid) $ch
30a0: 69 6c 64 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 ild..}. }..
30b0: 20 20 70 72 6f 63 20 50 75 6c 6c 53 75 63 63 65 proc PullSucce
30c0: 73 73 6f 72 52 65 76 69 73 69 6f 6e 73 20 7b 64 ssorRevisions {d
30d0: 76 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 v revisions} {..
30e0: 75 70 76 61 72 20 31 20 24 64 76 20 64 65 70 65 upvar 1 $dv depe
30f0: 6e 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74 68 ndencies..set th
3100: 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 eset ('[join $re
3110: 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 visions {','}]')
3120: 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 ...foreach {rid
3130: 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 child} [state ru
3140: 6e 20 22 0a 20 20 20 2d 2d 20 50 72 69 6d 61 72 n ". -- Primar
3150: 79 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 y children..
3160: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e SELECT R.rid, R.
3170: 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 child.. FROM
3180: 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 revision R..
3190: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 WHERE R.rid
31a0: 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 IN $theset..
31b0: 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 AND R.child
31c0: 49 53 20 4e 4f 54 20 4e 55 4c 4c 0a 20 20 20 20 IS NOT NULL.
31d0: 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 54 72 61 UNION. -- Tra
31e0: 6e 73 69 74 69 6f 6e 20 4e 54 44 42 20 74 6f 20 nsition NTDB to
31f0: 74 72 75 6e 6b 0a 09 20 20 20 20 53 45 4c 45 43 trunk.. SELEC
3200: 54 20 52 2e 72 69 64 2c 20 52 2e 64 62 63 68 69 T R.rid, R.dbchi
3210: 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 ld.. FROM r
3220: 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 evision R.. W
3230: 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e HERE R.rid IN
3240: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e $theset.. AN
3250: 44 20 20 20 20 52 2e 64 62 63 68 69 6c 64 20 49 D R.dbchild I
3260: 53 20 4e 4f 54 20 4e 55 4c 4c 0a 20 20 20 20 55 S NOT NULL. U
3270: 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 53 65 63 6f NION. -- Seco
3280: 6e 64 61 72 79 20 28 62 72 61 6e 63 68 29 20 63 ndary (branch) c
3290: 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 53 45 4c hildren.. SEL
32a0: 45 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 72 69 ECT R.rid, B.bri
32b0: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 d.. FROM re
32c0: 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 vision R, revisi
32d0: 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64 72 65 6e onbranchchildren
32e0: 20 42 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 B.. WHERE R
32f0: 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 .rid IN $these
3300: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e t.. AND R.
3310: 72 69 64 20 3d 20 42 2e 72 69 64 0a 09 22 5d 20 rid = B.rid.."]
3320: 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 69 64 65 {.. # Conside
3330: 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 20 74 6f r moving this to
3340: 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6d the integrity m
3350: 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 66 20 7b odule... if {
3360: 24 72 69 64 20 3d 3d 20 24 63 68 69 6c 64 7d 20 $rid == $child}
3370: 7b 0a 09 09 74 72 6f 75 62 6c 65 20 69 6e 74 65 {...trouble inte
3380: 72 6e 61 6c 20 22 52 65 76 69 73 69 6f 6e 20 24 rnal "Revision $
3390: 72 69 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 rid depends on i
33a0: 74 73 65 6c 66 2e 22 0a 09 20 20 20 20 7d 0a 09 tself.".. }..
33b0: 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 lappend depe
33c0: 6e 64 65 6e 63 69 65 73 28 24 72 69 64 29 20 24 ndencies($rid) $
33d0: 63 68 69 6c 64 0a 09 7d 0a 09 72 65 74 75 72 6e child..}..return
33e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 . }.. proc
33f0: 20 50 75 6c 6c 50 72 65 64 65 63 65 73 73 6f 72 PullPredecessor
3400: 52 65 76 69 73 69 6f 6e 73 20 7b 64 76 20 72 65 Revisions {dv re
3410: 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 visions} {..upva
3420: 72 20 31 20 24 64 76 20 64 65 70 65 6e 64 65 6e r 1 $dv dependen
3430: 63 69 65 73 0a 09 73 65 74 20 74 68 65 73 65 74 cies..set theset
3440: 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 ('[join $revisi
3450: 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 66 ons {','}]')...f
3460: 6f 72 65 61 63 68 20 7b 72 69 64 20 70 61 72 65 oreach {rid pare
3470: 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 nt} [state run "
3480: 0a 20 20 20 2d 2d 20 50 72 69 6d 61 72 79 20 70 . -- Primary p
3490: 61 72 65 6e 74 2c 20 63 61 6e 20 62 65 20 69 6e arent, can be in
34a0: 20 64 69 66 66 65 72 65 6e 74 20 4c 4f 44 20 66 different LOD f
34b0: 6f 72 20 66 69 72 73 74 20 69 6e 20 61 20 62 72 or first in a br
34c0: 61 6e 63 68 0a 09 20 20 20 20 53 45 4c 45 43 54 anch.. SELECT
34d0: 20 52 2e 72 69 64 2c 20 52 2e 70 61 72 65 6e 74 R.rid, R.parent
34e0: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 .. FROM rev
34f0: 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 ision R.. WHE
3500: 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 RE R.rid IN $
3510: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 theset.. AND
3520: 20 20 20 52 2e 70 61 72 65 6e 74 20 49 53 20 4e R.parent IS N
3530: 4f 54 20 4e 55 4c 4c 0a 20 20 20 20 55 4e 49 4f OT NULL. UNIO
3540: 4e 0a 20 20 20 20 2d 2d 20 54 72 61 6e 73 69 74 N. -- Transit
3550: 69 6f 6e 20 74 72 75 6e 6b 20 74 6f 20 4e 54 44 ion trunk to NTD
3560: 42 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e B.. SELECT R.
3570: 72 69 64 2c 20 52 2e 64 62 70 61 72 65 6e 74 0a rid, R.dbparent.
3580: 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 . FROM revi
3590: 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 sion R.. WHER
35a0: 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 E R.rid IN $t
35b0: 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 heset.. AND
35c0: 20 20 52 2e 64 62 70 61 72 65 6e 74 20 49 53 20 R.dbparent IS
35d0: 4e 4f 54 20 4e 55 4c 4c 0a 09 22 5d 20 7b 0a 09 NOT NULL.."] {..
35e0: 20 20 20 20 23 20 43 6f 6e 73 69 64 65 72 20 6d # Consider m
35f0: 6f 76 69 6e 67 20 74 68 69 73 20 74 6f 20 74 68 oving this to th
3600: 65 20 69 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 e integrity modu
3610: 6c 65 2e 0a 09 20 20 20 20 69 66 20 7b 24 72 69 le... if {$ri
3620: 64 20 3d 3d 20 24 70 61 72 65 6e 74 7d 20 7b 0a d == $parent} {.
3630: 09 09 74 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e ..trouble intern
3640: 61 6c 20 22 52 65 76 69 73 69 6f 6e 20 24 72 69 al "Revision $ri
3650: 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 d depends on its
3660: 65 6c 66 2e 22 0a 09 20 20 20 20 7d 0a 09 20 20 elf.".. }..
3670: 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 lappend depend
3680: 65 6e 63 69 65 73 28 24 72 69 64 29 20 24 70 61 encies($rid) $pa
3690: 72 65 6e 74 0a 09 7d 0a 09 72 65 74 75 72 6e 0a rent..}..return.
36a0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 }.. proc
36b0: 49 6e 69 74 69 61 6c 69 7a 65 42 72 65 61 6b 53 InitializeBreakS
36c0: 74 61 74 65 20 7b 72 65 76 69 73 69 6f 6e 73 7d tate {revisions}
36d0: 20 7b 0a 09 75 70 76 61 72 20 31 20 70 6f 73 20 {..upvar 1 pos
36e0: 70 6f 73 20 63 72 6f 73 73 20 63 72 6f 73 73 20 pos cross cross
36f0: 72 61 6e 67 65 20 72 61 6e 67 65 20 64 65 70 63 range range depc
3700: 20 64 65 70 63 20 64 65 6c 74 61 20 64 65 6c 74 depc delta delt
3710: 61 20 5c 0a 09 20 20 20 20 64 65 70 65 6e 64 65 a \.. depende
3720: 6e 63 69 65 73 20 64 65 70 65 6e 64 65 6e 63 69 ncies dependenci
3730: 65 73 0a 0a 09 23 20 46 69 72 73 74 20 77 65 20 es...# First we
3740: 63 72 65 61 74 65 20 61 20 6d 61 70 20 6f 66 20 create a map of
3750: 70 6f 73 69 74 69 6f 6e 73 20 74 6f 20 6d 61 6b positions to mak
3760: 65 20 69 74 20 65 61 73 69 65 72 20 74 6f 0a 09 e it easier to..
3770: 23 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 # determine whet
3780: 68 65 72 20 61 20 64 65 70 65 6e 64 65 6e 63 79 her a dependency
3790: 20 63 72 6f 73 73 65 73 20 61 20 70 61 72 74 69 crosses a parti
37a0: 63 75 6c 61 72 20 69 6e 64 65 78 2e 0a 0a 09 61 cular index....a
37b0: 72 72 61 79 20 73 65 74 20 70 6f 73 20 20 20 7b rray set pos {
37c0: 7d 0a 09 61 72 72 61 79 20 73 65 74 20 63 72 6f }..array set cro
37d0: 73 73 20 7b 7d 0a 09 61 72 72 61 79 20 73 65 74 ss {}..array set
37e0: 20 64 65 70 63 20 20 7b 7d 0a 09 73 65 74 20 72 depc {}..set r
37f0: 61 6e 67 65 20 20 20 20 20 20 20 7b 7d 0a 09 73 ange {}..s
3800: 65 74 20 6e 20 30 0a 09 66 6f 72 65 61 63 68 20 et n 0..foreach
3810: 72 65 76 20 24 72 65 76 69 73 69 6f 6e 73 20 7b rev $revisions {
3820: 20 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 72 .. lappend r
3830: 61 6e 67 65 20 24 6e 0a 09 20 20 20 20 73 65 74 ange $n.. set
3840: 20 70 6f 73 28 24 72 65 76 29 20 24 6e 0a 09 20 pos($rev) $n..
3850: 20 20 20 73 65 74 20 63 72 6f 73 73 28 24 6e 29 set cross($n)
3860: 20 30 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09 0.. incr n..
3870: 7d 0a 0a 09 23 20 53 65 63 6f 6e 64 6c 79 20 77 }...# Secondly w
3880: 65 20 63 6f 75 6e 74 20 74 68 65 20 63 72 6f 73 e count the cros
3890: 73 69 6e 67 73 20 70 65 72 20 70 6f 73 69 74 69 sings per positi
38a0: 6f 6e 2c 20 62 79 20 69 74 65 72 61 74 69 6e 67 on, by iterating
38b0: 0a 09 23 20 6f 76 65 72 20 74 68 65 20 72 65 63 ..# over the rec
38c0: 6f 72 64 65 64 20 69 6e 74 65 72 6e 61 6c 20 64 orded internal d
38d0: 65 70 65 6e 64 65 6e 63 69 65 73 2e 0a 0a 09 23 ependencies....#
38e0: 20 4e 6f 74 65 3a 20 49 66 20 74 68 65 20 74 69 Note: If the ti
38f0: 6d 65 73 74 61 6d 70 73 20 61 72 65 20 62 61 64 mestamps are bad
3900: 6c 79 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 20 ly out of order
3910: 69 74 20 69 73 0a 09 23 20 20 20 20 20 20 20 70 it is..# p
3920: 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20 ossible to have
3930: 61 20 62 61 63 6b 77 61 72 64 20 73 75 63 63 65 a backward succe
3940: 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 79 2c ssor dependency,
3950: 0a 09 23 20 20 20 20 20 20 20 69 2e 65 2e 20 77 ..# i.e. w
3960: 69 74 68 20 73 74 61 72 74 20 3e 20 65 6e 64 2e ith start > end.
3970: 20 57 65 20 6d 61 79 20 68 61 76 65 20 74 6f 20 We may have to
3980: 73 77 61 70 20 74 68 65 20 69 6e 64 69 63 65 73 swap the indices
3990: 0a 09 23 20 20 20 20 20 20 20 74 6f 20 65 6e 73 ..# to ens
39a0: 75 72 65 20 74 68 61 74 20 74 68 65 20 66 6f 6c ure that the fol
39b0: 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 lowing loop runs
39c0: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 09 23 0a 09 correctly...#..
39d0: 23 20 4e 6f 74 65 20 32 3a 20 73 74 61 72 74 20 # Note 2: start
39e0: 3d 3d 20 65 6e 64 20 69 73 20 6e 6f 74 20 70 6f == end is not po
39f0: 73 73 69 62 6c 65 2e 20 49 74 20 69 6e 64 69 63 ssible. It indic
3a00: 61 74 65 73 20 61 0a 09 23 20 20 20 20 20 20 20 ates a..#
3a10: 20 20 73 65 6c 66 2d 64 65 70 65 6e 64 65 6e 63 self-dependenc
3a20: 79 20 64 75 65 20 74 6f 20 74 68 65 20 75 6e 69 y due to the uni
3a30: 71 75 65 6e 65 73 73 20 6f 66 20 70 6f 73 69 74 queness of posit
3a40: 69 6f 6e 73 2c 0a 09 23 20 20 20 20 20 20 20 20 ions,..#
3a50: 20 61 6e 64 20 74 68 61 74 20 69 73 20 73 6f 6d and that is som
3a60: 65 74 68 69 6e 67 20 77 65 20 68 61 76 65 20 72 ething we have r
3a70: 75 6c 65 64 20 6f 75 74 20 61 6c 72 65 61 64 79 uled out already
3a80: 2c 20 73 65 65 0a 09 23 20 20 20 20 20 20 20 20 , see..#
3a90: 20 50 75 6c 6c 49 6e 74 65 72 6e 61 6c 53 75 63 PullInternalSuc
3aa0: 63 65 73 73 6f 72 52 65 76 69 73 69 6f 6e 73 2e cessorRevisions.
3ab0: 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 ...foreach {rid
3ac0: 63 68 69 6c 64 7d 20 5b 61 72 72 61 79 20 67 65 child} [array ge
3ad0: 74 20 64 65 70 65 6e 64 65 6e 63 69 65 73 5d 20 t dependencies]
3ae0: 7b 0a 09 20 20 20 20 73 65 74 20 64 6b 65 79 20 {.. set dkey
3af0: 20 20 20 5b 6c 69 73 74 20 24 72 69 64 20 24 63 [list $rid $c
3b00: 68 69 6c 64 5d 0a 09 20 20 20 20 73 65 74 20 73 hild].. set s
3b10: 74 61 72 74 20 20 20 24 70 6f 73 28 24 72 69 64 tart $pos($rid
3b20: 29 0a 09 20 20 20 20 73 65 74 20 65 6e 64 20 20 ).. set end
3b30: 20 20 20 24 70 6f 73 28 24 63 68 69 6c 64 29 0a $pos($child).
3b40: 09 20 20 20 20 73 65 74 20 63 72 6f 73 73 65 73 . set crosses
3b50: 20 7b 7d 0a 0a 09 20 20 20 20 69 66 20 7b 24 73 {}... if {$s
3b60: 74 61 72 74 20 3e 20 24 65 6e 64 7d 20 7b 0a 09 tart > $end} {..
3b70: 09 77 68 69 6c 65 20 7b 24 65 6e 64 20 3c 20 24 .while {$end < $
3b80: 73 74 61 72 74 7d 20 7b 0a 09 09 20 20 20 20 6c start} {... l
3b90: 61 70 70 65 6e 64 20 63 72 6f 73 73 65 73 20 24 append crosses $
3ba0: 65 6e 64 0a 09 09 20 20 20 20 69 6e 63 72 20 63 end... incr c
3bb0: 72 6f 73 73 28 24 65 6e 64 29 0a 09 09 20 20 20 ross($end)...
3bc0: 20 69 6e 63 72 20 65 6e 64 0a 09 09 7d 0a 09 20 incr end...}..
3bd0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 77 68 } else {...wh
3be0: 69 6c 65 20 7b 24 73 74 61 72 74 20 3c 20 24 65 ile {$start < $e
3bf0: 6e 64 7d 20 7b 0a 09 09 20 20 20 20 6c 61 70 70 nd} {... lapp
3c00: 65 6e 64 20 63 72 6f 73 73 65 73 20 24 73 74 61 end crosses $sta
3c10: 72 74 0a 09 09 20 20 20 20 69 6e 63 72 20 63 72 rt... incr cr
3c20: 6f 73 73 28 24 73 74 61 72 74 29 0a 09 09 20 20 oss($start)...
3c30: 20 20 69 6e 63 72 20 73 74 61 72 74 0a 09 09 7d incr start...}
3c40: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73 65 74 .. }.. set
3c50: 20 64 65 70 63 28 24 64 6b 65 79 29 20 24 63 72 depc($dkey) $cr
3c60: 6f 73 73 65 73 0a 09 7d 0a 0a 09 49 6e 69 74 69 osses..}...Initi
3c70: 61 6c 69 7a 65 44 65 6c 74 61 73 20 24 72 65 76 alizeDeltas $rev
3c80: 69 73 69 6f 6e 73 0a 09 72 65 74 75 72 6e 0a 20 isions..return.
3c90: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 49 }.. proc I
3ca0: 6e 69 74 69 61 6c 69 7a 65 44 65 6c 74 61 73 20 nitializeDeltas
3cb0: 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 {revisions} {..u
3cc0: 70 76 61 72 20 31 20 64 65 6c 74 61 20 64 65 6c pvar 1 delta del
3cd0: 74 61 0a 0a 09 23 20 50 75 6c 6c 20 74 68 65 20 ta...# Pull the
3ce0: 74 69 6d 65 73 74 61 6d 70 73 20 66 6f 72 20 61 timestamps for a
3cf0: 6c 6c 20 72 65 76 69 73 69 6f 6e 73 20 69 6e 20 ll revisions in
3d00: 74 68 65 20 63 68 61 6e 67 65 73 65 74 73 20 61 the changesets a
3d10: 6e 64 0a 09 23 20 63 6f 6d 70 75 74 65 20 74 68 nd..# compute th
3d20: 65 69 72 20 64 65 6c 74 61 73 20 66 6f 72 20 75 eir deltas for u
3d30: 73 65 20 62 79 20 74 68 65 20 62 72 65 61 6b 20 se by the break
3d40: 66 69 6e 64 65 72 2e 0a 0a 09 61 72 72 61 79 20 finder....array
3d50: 73 65 74 20 64 65 6c 74 61 20 7b 7d 0a 09 61 72 set delta {}..ar
3d60: 72 61 79 20 73 65 74 20 73 74 61 6d 70 20 7b 7d ray set stamp {}
3d70: 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 ...set theset ('
3d80: 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 [join $revisions
3d90: 20 7b 27 2c 27 7d 5d 27 29 0a 09 66 6f 72 65 61 {','}]')..forea
3da0: 63 68 20 7b 72 69 64 20 74 69 6d 65 7d 20 5b 73 ch {rid time} [s
3db0: 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 tate run "..
3dc0: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e SELECT R.rid, R.
3dd0: 64 61 74 65 0a 09 20 20 20 20 46 52 4f 4d 20 72 date.. FROM r
3de0: 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 evision R.. W
3df0: 48 45 52 45 20 52 2e 72 69 64 20 49 4e 20 24 74 HERE R.rid IN $t
3e00: 68 65 73 65 74 0a 09 22 5d 20 7b 0a 09 20 20 20 heset.."] {..
3e10: 20 73 65 74 20 73 74 61 6d 70 28 24 72 69 64 29 set stamp($rid)
3e20: 20 24 74 69 6d 65 0a 09 7d 0a 0a 09 73 65 74 20 $time..}...set
3e30: 6e 20 30 0a 09 66 6f 72 65 61 63 68 20 72 69 64 n 0..foreach rid
3e40: 20 5b 6c 72 61 6e 67 65 20 24 72 65 76 69 73 69 [lrange $revisi
3e50: 6f 6e 73 20 30 20 65 6e 64 2d 31 5d 20 72 6e 65 ons 0 end-1] rne
3e60: 78 74 20 5b 6c 72 61 6e 67 65 20 24 72 65 76 69 xt [lrange $revi
3e70: 73 69 6f 6e 73 20 31 20 65 6e 64 5d 20 7b 0a 09 sions 1 end] {..
3e80: 20 20 20 20 73 65 74 20 64 65 6c 74 61 28 24 6e set delta($n
3e90: 29 20 5b 65 78 70 72 20 7b 24 73 74 61 6d 70 28 ) [expr {$stamp(
3ea0: 24 72 6e 65 78 74 29 20 2d 20 24 73 74 61 6d 70 $rnext) - $stamp
3eb0: 28 24 72 69 64 29 7d 5d 0a 09 20 20 20 20 69 6e ($rid)}].. in
3ec0: 63 72 20 6e 0a 09 7d 0a 09 72 65 74 75 72 6e 0a cr n..}..return.
3ed0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 }.. proc
3ee0: 46 69 6e 64 42 65 73 74 42 72 65 61 6b 20 7b 72 FindBestBreak {r
3ef0: 61 6e 67 65 7d 20 7b 0a 09 75 70 76 61 72 20 31 ange} {..upvar 1
3f00: 20 63 72 6f 73 73 20 63 72 6f 73 73 20 64 65 6c cross cross del
3f10: 74 61 20 64 65 6c 74 61 0a 0a 09 23 20 44 65 74 ta delta...# Det
3f20: 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 ermine the best
3f30: 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 69 break location i
3f40: 6e 20 74 68 65 20 67 69 76 65 6e 20 72 61 6e 67 n the given rang
3f50: 65 20 6f 66 0a 09 23 20 70 6f 73 69 74 69 6f 6e e of..# position
3f60: 73 2e 20 46 69 72 73 74 20 77 65 20 6c 6f 6f 6b s. First we look
3f70: 20 66 6f 72 20 74 68 65 20 6c 6f 63 61 74 69 6f for the locatio
3f80: 6e 73 20 77 69 74 68 20 74 68 65 20 6d 61 78 69 ns with the maxi
3f90: 6d 61 6c 0a 09 23 20 6e 75 6d 62 65 72 20 6f 66 mal..# number of
3fa0: 20 63 72 6f 73 73 69 6e 67 73 2e 20 49 66 20 74 crossings. If t
3fb0: 68 65 72 65 20 61 72 65 20 73 65 76 65 72 61 6c here are several
3fc0: 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 68 65 we look for the
3fd0: 0a 09 23 20 73 68 6f 72 74 65 73 74 20 74 69 6d ..# shortest tim
3fe0: 65 20 69 6e 74 65 72 76 61 6c 20 61 6d 6f 6e 67 e interval among
3ff0: 20 74 68 65 6d 2e 20 49 66 20 77 65 20 73 74 69 them. If we sti
4000: 6c 6c 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 ll have multiple
4010: 0a 09 23 20 70 6f 73 73 69 62 69 6c 69 74 69 65 ..# possibilitie
4020: 73 20 61 66 74 65 72 20 74 68 61 74 20 77 65 20 s after that we
4030: 73 65 6c 65 63 74 20 74 68 65 20 65 61 72 6c 69 select the earli
4040: 65 73 74 20 6c 6f 63 61 74 69 6f 6e 0a 09 23 20 est location..#
4050: 61 6d 6f 6e 67 20 74 68 65 73 65 2e 0a 0a 09 23 among these....#
4060: 20 4e 6f 74 65 3a 20 49 66 20 74 68 65 20 6d 61 Note: If the ma
4070: 78 69 6d 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 ximal number of
4080: 63 72 6f 73 73 69 6e 67 73 20 69 73 20 30 20 74 crossings is 0 t
4090: 68 65 6e 20 74 68 65 20 72 61 6e 67 65 0a 09 23 hen the range..#
40a0: 20 20 20 20 20 20 20 68 61 73 20 6e 6f 20 69 6e has no in
40b0: 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 ternal dependenc
40c0: 69 65 73 2c 20 61 6e 64 20 6e 6f 20 62 72 65 61 ies, and no brea
40d0: 6b 20 6c 6f 63 61 74 69 6f 6e 20 61 74 0a 09 23 k location at..#
40e0: 20 20 20 20 20 20 20 61 6c 6c 2e 20 54 68 69 73 all. This
40f0: 20 70 6f 73 73 69 62 69 6c 69 74 79 20 69 73 20 possibility is
4100: 73 69 67 6e 61 6c 65 64 20 76 69 61 20 72 65 73 signaled via res
4110: 75 6c 74 20 2d 31 2e 0a 0a 09 23 20 4e 6f 74 65 ult -1....# Note
4120: 3a 20 41 20 72 61 6e 67 65 20 6f 66 20 6c 65 6e : A range of len
4130: 67 74 68 20 31 20 6f 72 20 6c 65 73 73 20 63 61 gth 1 or less ca
4140: 6e 6e 6f 74 20 68 61 76 65 20 69 6e 74 65 72 6e nnot have intern
4150: 61 6c 0a 09 23 20 20 20 20 20 20 20 64 65 70 65 al..# depe
4160: 6e 64 65 6e 63 69 65 73 2c 20 61 73 20 74 68 61 ndencies, as tha
4170: 74 20 6e 65 65 64 73 20 61 74 20 6c 65 61 73 74 t needs at least
4180: 20 74 77 6f 20 72 65 76 69 73 69 6f 6e 73 20 69 two revisions i
4190: 6e 0a 09 23 20 20 20 20 20 20 20 74 68 65 20 72 n..# the r
41a0: 61 6e 67 65 2e 0a 0a 09 69 66 20 7b 5b 6c 6c 65 ange....if {[lle
41b0: 6e 67 74 68 20 24 72 61 6e 67 65 5d 20 3c 20 32 ngth $range] < 2
41c0: 7d 20 7b 20 72 65 74 75 72 6e 20 2d 31 20 7d 0a } { return -1 }.
41d0: 0a 09 73 65 74 20 6d 61 78 20 2d 31 0a 09 73 65 ..set max -1..se
41e0: 74 20 62 65 73 74 20 7b 7d 0a 0a 09 66 6f 72 65 t best {}...fore
41f0: 61 63 68 20 6c 6f 63 61 74 69 6f 6e 20 24 72 61 ach location $ra
4200: 6e 67 65 20 7b 0a 09 20 20 20 20 73 65 74 20 63 nge {.. set c
4210: 72 6f 73 73 69 6e 67 73 20 24 63 72 6f 73 73 28 rossings $cross(
4220: 24 6c 6f 63 61 74 69 6f 6e 29 0a 09 20 20 20 20 $location)..
4230: 69 66 20 7b 24 63 72 6f 73 73 69 6e 67 73 20 3e if {$crossings >
4240: 20 24 6d 61 78 7d 20 7b 0a 09 09 73 65 74 20 6d $max} {...set m
4250: 61 78 20 20 24 63 72 6f 73 73 69 6e 67 73 0a 09 ax $crossings..
4260: 09 73 65 74 20 62 65 73 74 20 5b 6c 69 73 74 20 .set best [list
4270: 24 6c 6f 63 61 74 69 6f 6e 5d 0a 09 09 63 6f 6e $location]...con
4280: 74 69 6e 75 65 0a 09 20 20 20 20 7d 20 65 6c 73 tinue.. } els
4290: 65 69 66 20 7b 24 63 72 6f 73 73 69 6e 67 73 20 eif {$crossings
42a0: 3d 3d 20 24 6d 61 78 7d 20 7b 0a 09 09 6c 61 70 == $max} {...lap
42b0: 70 65 6e 64 20 62 65 73 74 20 24 6c 6f 63 61 74 pend best $locat
42c0: 69 6f 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 ion.. }..}...
42d0: 69 66 20 7b 24 6d 61 78 20 3d 3d 20 30 7d 20 20 if {$max == 0}
42e0: 20 20 20 20 20 20 20 20 20 20 7b 20 72 65 74 75 { retu
42f0: 72 6e 20 2d 31 20 7d 0a 09 69 66 20 7b 5b 6c 6c rn -1 }..if {[ll
4300: 65 6e 67 74 68 20 24 62 65 73 74 5d 20 3d 3d 20 ength $best] ==
4310: 31 7d 20 7b 20 72 65 74 75 72 6e 20 5b 6c 69 6e 1} { return [lin
4320: 64 65 78 20 24 62 65 73 74 20 30 5d 20 7d 0a 0a dex $best 0] }..
4330: 09 73 65 74 20 6c 6f 63 61 74 69 6f 6e 73 20 24 .set locations $
4340: 62 65 73 74 0a 09 73 65 74 20 62 65 73 74 20 7b best..set best {
4350: 7d 0a 09 73 65 74 20 6d 69 6e 20 2d 31 0a 0a 09 }..set min -1...
4360: 66 6f 72 65 61 63 68 20 6c 6f 63 61 74 69 6f 6e foreach location
4370: 20 24 6c 6f 63 61 74 69 6f 6e 73 20 7b 0a 09 20 $locations {..
4380: 20 20 20 73 65 74 20 69 6e 74 65 72 76 61 6c 20 set interval
4390: 24 64 65 6c 74 61 28 24 6c 6f 63 61 74 69 6f 6e $delta($location
43a0: 29 0a 09 20 20 20 20 69 66 20 7b 28 24 6d 69 6e ).. if {($min
43b0: 20 3c 20 30 29 20 7c 7c 20 28 24 69 6e 74 65 72 < 0) || ($inter
43c0: 76 61 6c 20 3c 20 24 6d 69 6e 29 7d 20 7b 0a 09 val < $min)} {..
43d0: 09 73 65 74 20 6d 69 6e 20 20 24 69 6e 74 65 72 .set min $inter
43e0: 76 61 6c 0a 09 09 73 65 74 20 62 65 73 74 20 5b val...set best [
43f0: 6c 69 73 74 20 24 6c 6f 63 61 74 69 6f 6e 5d 0a list $location].
4400: 09 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 . } elseif {$
4410: 69 6e 74 65 72 76 61 6c 20 3d 3d 20 24 6d 69 6e interval == $min
4420: 7d 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 62 65 } {...lappend be
4430: 73 74 20 24 6c 6f 63 61 74 69 6f 6e 0a 09 20 20 st $location..
4440: 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b 5b 6c 6c }..}...if {[ll
4450: 65 6e 67 74 68 20 24 62 65 73 74 5d 20 3d 3d 20 ength $best] ==
4460: 31 7d 20 7b 20 72 65 74 75 72 6e 20 5b 6c 69 6e 1} { return [lin
4470: 64 65 78 20 24 62 65 73 74 20 30 5d 20 7d 0a 0a dex $best 0] }..
4480: 09 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 .return [lindex
4490: 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65 72 20 [lsort -integer
44a0: 2d 69 6e 63 72 65 61 73 69 6e 67 20 24 62 65 73 -increasing $bes
44b0: 74 5d 20 30 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 t] 0]. }..
44c0: 20 70 72 6f 63 20 43 75 74 41 74 20 7b 6c 6f 63 proc CutAt {loc
44d0: 61 74 69 6f 6e 7d 20 7b 0a 09 75 70 76 61 72 20 ation} {..upvar
44e0: 31 20 63 72 6f 73 73 20 63 72 6f 73 73 20 64 65 1 cross cross de
44f0: 70 63 20 64 65 70 63 0a 0a 09 23 20 49 74 20 77 pc depc...# It w
4500: 61 73 20 64 65 63 69 64 65 64 20 74 6f 20 73 70 as decided to sp
4510: 6c 69 74 20 74 68 65 20 63 68 61 6e 67 65 73 65 lit the changese
4520: 74 20 61 74 20 74 68 65 20 67 69 76 65 6e 0a 09 t at the given..
4530: 23 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 69 73 # location. This
4540: 20 63 75 74 73 20 61 20 6e 75 6d 62 65 72 20 6f cuts a number o
4550: 66 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 f dependencies.
4560: 48 65 72 65 20 77 65 20 75 70 64 61 74 65 0a 09 Here we update..
4570: 23 20 74 68 65 20 63 72 6f 73 73 20 69 6e 66 6f # the cross info
4580: 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 rmation so that
4590: 74 68 65 20 62 72 65 61 6b 20 66 69 6e 64 65 72 the break finder
45a0: 20 68 61 73 20 61 63 63 75 72 61 74 65 0a 09 23 has accurate..#
45b0: 20 64 61 74 61 20 77 68 65 6e 20 77 65 20 6c 6f data when we lo
45c0: 6f 6b 20 61 74 20 74 68 65 20 67 65 6e 65 72 61 ok at the genera
45d0: 74 65 64 20 66 72 61 67 6d 65 6e 74 73 2e 0a 0a ted fragments...
45e0: 09 73 65 74 20 73 69 78 20 5b 6c 6f 67 20 76 69 .set six [log vi
45f0: 73 69 62 6c 65 3f 20 36 5d 0a 0a 09 66 6f 72 65 sible? 6]...fore
4600: 61 63 68 20 7b 64 65 70 20 72 61 6e 67 65 7d 20 ach {dep range}
4610: 5b 61 72 72 61 79 20 67 65 74 20 64 65 70 63 5d [array get depc]
4620: 20 7b 0a 09 20 20 20 20 23 20 43 68 65 63 6b 20 {.. # Check
4630: 61 6c 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 all dependencies
4640: 20 73 74 69 6c 6c 20 6b 6e 6f 77 6e 2c 20 74 61 still known, ta
4650: 6b 65 20 74 68 65 69 72 20 72 61 6e 67 65 20 61 ke their range a
4660: 6e 64 0a 09 20 20 20 20 23 20 73 65 65 20 69 66 nd.. # see if
4670: 20 74 68 65 20 62 72 65 61 6b 20 6c 6f 63 61 74 the break locat
4680: 69 6f 6e 20 66 61 6c 6c 73 20 77 69 74 68 69 6e ion falls within
4690: 2e 0a 0a 09 20 20 20 20 42 6f 72 64 65 72 20 24 .... Border $
46a0: 72 61 6e 67 65 20 73 20 65 0a 09 20 20 20 20 69 range s e.. i
46b0: 66 20 7b 24 6c 6f 63 61 74 69 6f 6e 20 3c 20 24 f {$location < $
46c0: 73 7d 20 63 6f 6e 74 69 6e 75 65 20 3b 20 23 20 s} continue ; #
46d0: 62 72 65 61 6b 20 62 65 66 6f 72 65 20 72 61 6e break before ran
46e0: 67 65 2c 20 69 67 6e 6f 72 65 0a 09 20 20 20 20 ge, ignore..
46f0: 69 66 20 7b 24 6c 6f 63 61 74 69 6f 6e 20 3e 20 if {$location >
4700: 24 65 7d 20 63 6f 6e 74 69 6e 75 65 20 3b 20 23 $e} continue ; #
4710: 20 62 72 65 61 6b 20 61 66 74 65 72 20 72 61 6e break after ran
4720: 67 65 2c 20 69 67 6e 6f 72 65 2e 0a 0a 09 20 20 ge, ignore....
4730: 20 20 23 20 54 68 69 73 20 64 65 70 65 6e 64 65 # This depende
4740: 6e 63 79 20 63 72 6f 73 73 65 73 20 74 68 65 20 ncy crosses the
4750: 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 2e 20 break location.
4760: 57 65 20 72 65 6d 6f 76 65 20 69 74 0a 09 20 20 We remove it..
4770: 20 20 23 20 66 72 6f 6d 20 74 68 65 20 63 72 6f # from the cro
4780: 73 73 69 6e 67 73 20 63 6f 75 6e 74 65 72 73 2c ssings counters,
4790: 20 61 6e 64 20 74 68 65 6e 20 61 6c 73 6f 20 66 and then also f
47a0: 72 6f 6d 20 74 68 65 20 73 65 74 0a 09 20 20 20 rom the set..
47b0: 20 23 20 6f 66 20 6b 6e 6f 77 6e 20 64 65 70 65 # of known depe
47c0: 6e 64 65 6e 63 69 65 73 2c 20 61 73 20 77 65 20 ndencies, as we
47d0: 61 72 65 20 64 6f 6e 65 20 77 69 74 68 20 69 74 are done with it
47e0: 2e 0a 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 .... foreach
47f0: 6c 6f 63 20 24 64 65 70 63 28 24 64 65 70 29 20 loc $depc($dep)
4800: 7b 20 69 6e 63 72 20 63 72 6f 73 73 28 24 6c 6f { incr cross($lo
4810: 63 29 20 2d 31 20 7d 0a 09 20 20 20 20 75 6e 73 c) -1 }.. uns
4820: 65 74 20 64 65 70 63 28 24 64 65 70 29 0a 0a 09 et depc($dep)...
4830: 20 20 20 20 69 66 20 7b 21 24 73 69 78 7d 20 63 if {!$six} c
4840: 6f 6e 74 69 6e 75 65 0a 0a 09 20 20 20 20 73 74 ontinue... st
4850: 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 ruct::list assig
4860: 6e 20 24 64 65 70 20 70 61 72 65 6e 74 20 63 68 n $dep parent ch
4870: 69 6c 64 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 ild.. log wri
4880: 74 65 20 36 20 63 73 65 74 73 20 22 42 72 6f 6b te 6 csets "Brok
4890: 65 20 64 65 70 65 6e 64 65 6e 63 79 20 5b 50 44 e dependency [PD
48a0: 20 24 70 61 72 65 6e 74 5d 20 2d 2d 3e 20 5b 50 $parent] --> [P
48b0: 44 20 24 63 68 69 6c 64 5d 22 0a 09 7d 0a 0a 09 D $child]"..}...
48c0: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 return. }..
48d0: 20 20 23 20 50 72 69 6e 74 20 69 64 65 6e 74 69 # Print identi
48e0: 66 79 69 6e 67 20 64 61 74 61 20 66 6f 72 20 61 fying data for a
48f0: 20 72 65 76 69 73 69 6f 6e 20 28 70 72 6f 6a 65 revision (proje
4900: 63 74 2c 20 66 69 6c 65 2c 20 64 6f 74 74 65 64 ct, file, dotted
4910: 20 72 65 76 0a 20 20 20 20 23 20 6e 75 6d 62 65 rev. # numbe
4920: 72 29 2c 20 66 6f 72 20 68 69 67 68 20 76 65 72 r), for high ver
4930: 62 6f 73 69 74 79 20 6c 6f 67 20 6f 75 74 70 75 bosity log outpu
4940: 74 2e 0a 0a 20 20 20 20 70 72 6f 63 20 50 44 20 t... proc PD
4950: 7b 69 64 7d 20 7b 0a 09 66 6f 72 65 61 63 68 20 {id} {..foreach
4960: 7b 70 20 66 20 72 7d 20 5b 73 74 61 74 65 20 72 {p f r} [state r
4970: 75 6e 20 7b 0a 09 09 53 45 4c 45 43 54 20 50 2e un {...SELECT P.
4980: 6e 61 6d 65 20 2c 20 46 2e 6e 61 6d 65 2c 20 52 name , F.name, R
4990: 2e 72 65 76 0a 09 09 46 52 4f 4d 20 72 65 76 69 .rev...FROM revi
49a0: 73 69 6f 6e 20 52 2c 20 66 69 6c 65 20 46 2c 20 sion R, file F,
49b0: 70 72 6f 6a 65 63 74 20 50 0a 09 09 57 48 45 52 project P...WHER
49c0: 45 20 52 2e 72 69 64 20 3d 20 24 69 64 0a 09 09 E R.rid = $id...
49d0: 41 4e 44 20 20 20 52 2e 66 69 64 20 3d 20 46 2e AND R.fid = F.
49e0: 66 69 64 0a 09 09 41 4e 44 20 20 20 46 2e 70 69 fid...AND F.pi
49f0: 64 20 3d 20 50 2e 70 69 64 0a 09 7d 5d 20 62 72 d = P.pid..}] br
4a00: 65 61 6b 0a 09 72 65 74 75 72 6e 20 22 27 24 70 eak..return "'$p
4a10: 20 3a 20 24 66 2f 24 72 27 22 0a 20 20 20 20 7d : $f/$r'". }
4a20: 0a 0a 20 20 20 20 23 20 50 72 69 6e 74 69 6e 67 .. # Printing
4a30: 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 72 61 6e one or more ran
4a40: 67 65 73 2c 20 66 6f 72 6d 61 74 74 65 64 2c 20 ges, formatted,
4a50: 61 6e 64 20 6f 6e 6c 79 20 74 68 65 69 72 20 62 and only their b
4a60: 6f 72 64 65 72 20 74 6f 0a 20 20 20 20 23 20 6b order to. # k
4a70: 65 65 70 20 74 68 65 20 73 74 72 69 6e 67 73 20 eep the strings
4a80: 73 68 6f 72 74 2e 0a 0a 20 20 20 20 70 72 6f 63 short... proc
4a90: 20 50 52 73 20 7b 72 61 6e 67 65 73 7d 20 7b 0a PRs {ranges} {.
4aa0: 09 72 65 74 75 72 6e 20 5b 73 74 72 75 63 74 3a .return [struct:
4ab0: 3a 6c 69 73 74 20 6d 61 70 20 24 72 61 6e 67 65 :list map $range
4ac0: 73 20 5b 6d 79 70 72 6f 63 20 50 52 5d 5d 0a 20 s [myproc PR]].
4ad0: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 50 }.. proc P
4ae0: 52 20 7b 72 61 6e 67 65 7d 20 7b 0a 09 42 6f 72 R {range} {..Bor
4af0: 64 65 72 20 24 72 61 6e 67 65 20 73 20 65 0a 09 der $range s e..
4b00: 72 65 74 75 72 6e 20 3c 24 7b 73 7d 2e 2e 2e 24 return <${s}...$
4b10: 7b 65 7d 3e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 {e}>. }..
4b20: 70 72 6f 63 20 42 6f 72 64 65 72 20 7b 72 61 6e proc Border {ran
4b30: 67 65 20 73 76 20 65 76 7d 20 7b 0a 09 75 70 76 ge sv ev} {..upv
4b40: 61 72 20 31 20 24 73 76 20 73 20 24 65 76 20 65 ar 1 $sv s $ev e
4b50: 0a 09 73 65 74 20 73 20 5b 6c 69 6e 64 65 78 20 ..set s [lindex
4b60: 24 72 61 6e 67 65 20 30 5d 0a 09 73 65 74 20 65 $range 0]..set e
4b70: 20 5b 6c 69 6e 64 65 78 20 24 72 61 6e 67 65 20 [lindex $range
4b80: 65 6e 64 5d 0a 09 72 65 74 75 72 6e 0a 20 20 20 end]..return.
4b90: 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 }.. # # ## #
4ba0: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 ## ##### #######
4bb0: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a # #############.
4bc0: 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c . typevariabl
4bd0: 65 20 6d 79 63 68 61 6e 67 65 73 65 74 73 20 20 e mychangesets
4be0: 20 20 7b 7d 20 3b 20 23 20 4c 69 73 74 20 6f 66 {} ; # List of
4bf0: 20 61 6c 6c 20 6b 6e 6f 77 6e 20 63 68 61 6e 67 all known chang
4c00: 65 73 65 74 73 2e 0a 20 20 20 20 74 79 70 65 76 esets.. typev
4c10: 61 72 69 61 62 6c 65 20 6d 79 72 65 76 6d 61 70 ariable myrevmap
4c20: 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d -array {} ; # M
4c30: 61 70 20 66 72 6f 6d 20 72 65 76 69 73 69 6f 6e ap from revision
4c40: 73 20 74 6f 20 74 68 65 69 72 20 63 68 61 6e 67 s to their chang
4c50: 65 73 65 74 2e 0a 20 20 20 20 74 79 70 65 76 61 eset.. typeva
4c60: 72 69 61 62 6c 65 20 6d 79 69 64 6d 61 70 20 20 riable myidmap
4c70: 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61 -array {} ; # Ma
4c80: 70 20 66 72 6f 6d 20 63 68 61 6e 67 65 73 65 74 p from changeset
4c90: 20 69 64 20 74 6f 20 63 68 61 6e 67 65 73 65 74 id to changeset
4ca0: 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62 .. typevariab
4cb0: 6c 65 20 6d 79 62 72 61 6e 63 68 63 6f 64 65 20 le mybranchcode
4cc0: 20 20 20 7b 7d 20 3b 20 23 20 4c 6f 63 61 6c 20 {} ; # Local
4cd0: 63 6f 70 79 20 6f 66 20 70 72 6f 6a 65 63 74 3a copy of project:
4ce0: 3a 73 79 6d 2f 6d 79 62 72 61 6e 63 68 2e 0a 0a :sym/mybranch...
4cf0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 61 typemethod a
4d00: 6c 6c 20 20 20 7b 7d 20 20 20 7b 20 72 65 74 75 ll {} { retu
4d10: 72 6e 20 24 6d 79 63 68 61 6e 67 65 73 65 74 73 rn $mychangesets
4d20: 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f }. typemetho
4d30: 64 20 6f 66 20 20 20 20 7b 69 64 7d 20 7b 20 72 d of {id} { r
4d40: 65 74 75 72 6e 20 24 6d 79 69 64 6d 61 70 28 24 eturn $myidmap($
4d50: 69 64 29 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 id) }. typeme
4d60: 74 68 6f 64 20 6f 66 72 65 76 20 7b 69 64 7d 20 thod ofrev {id}
4d70: 7b 20 72 65 74 75 72 6e 20 24 6d 79 72 65 76 6d { return $myrevm
4d80: 61 70 28 24 69 64 29 20 7d 0a 0a 20 20 20 20 23 ap($id) }.. #
4d90: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 # ## ### #####
4da0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
4db0: 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 43 6f ######. ## Co
4dc0: 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a 20 20 20 nfiguration..
4dd0: 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65 pragma -hastype
4de0: 69 6e 66 6f 20 20 20 20 6e 6f 20 20 3b 20 23 20 info no ; #
4df0: 6e 6f 20 74 79 70 65 20 69 6e 74 72 6f 73 70 65 no type introspe
4e00: 63 74 69 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61 ction. pragma
4e10: 20 2d 68 61 73 69 6e 66 6f 20 20 20 20 20 20 20 -hasinfo
4e20: 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 6f 62 6a 65 no ; # no obje
4e30: 63 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e ct introspection
4e40: 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 73 69 6d . pragma -sim
4e50: 70 6c 65 64 69 73 70 61 74 63 68 20 79 65 73 20 pledispatch yes
4e60: 3b 20 23 20 73 69 6d 70 6c 65 20 66 61 73 74 20 ; # simple fast
4e70: 64 69 73 70 61 74 63 68 0a 0a 20 20 20 20 23 20 dispatch.. #
4e80: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 # ## ### ##### #
4e90: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 ####### ########
4ea0: 23 23 23 23 23 0a 7d 0a 0a 6e 61 6d 65 73 70 61 #####.}..namespa
4eb0: 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a 66 6f ce eval ::vc::fo
4ec0: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 ssil::import::cv
4ed0: 73 3a 3a 70 72 6f 6a 65 63 74 20 7b 0a 20 20 20 s::project {.
4ee0: 20 6e 61 6d 65 73 70 61 63 65 20 65 78 70 6f 72 namespace expor
4ef0: 74 20 72 65 76 0a 20 20 20 20 6e 61 6d 65 73 70 t rev. namesp
4f00: 61 63 65 20 65 76 61 6c 20 72 65 76 20 7b 0a 09 ace eval rev {..
4f10: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 namespace import
4f20: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 ::vc::fossil::i
4f30: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 mport::cvs::stat
4f40: 65 0a 09 6e 61 6d 65 73 70 61 63 65 20 65 76 61 e..namespace eva
4f50: 6c 20 70 72 6f 6a 65 63 74 20 7b 0a 09 20 20 20 l project {..
4f60: 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 namespace impor
4f70: 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a t ::vc::fossil::
4f80: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f import::cvs::pro
4f90: 6a 65 63 74 3a 3a 73 79 6d 0a 09 7d 0a 09 3a 3a ject::sym..}..::
4fa0: 76 61 72 69 61 62 6c 65 20 6d 79 62 72 61 6e 63 variable mybranc
4fb0: 68 63 6f 64 65 20 5b 70 72 6f 6a 65 63 74 3a 3a hcode [project::
4fc0: 73 79 6d 20 62 72 61 6e 63 68 5d 0a 09 6e 61 6d sym branch]..nam
4fd0: 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a espace import ::
4fe0: 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69 73 63 3a vc::tools::misc:
4ff0: 3a 2a 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d :*..namespace im
5000: 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 port ::vc::tools
5010: 3a 3a 74 72 6f 75 62 6c 65 0a 09 6e 61 6d 65 73 ::trouble..names
5020: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 pace import ::vc
5030: 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 6c 6f ::tools::log..lo
5040: 67 20 72 65 67 69 73 74 65 72 20 63 73 65 74 73 g register csets
5050: 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 . }.}..# # ##
5060: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 ### ##### #####
5070: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 ### ############
5080: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 # ##############
5090: 23 23 23 23 23 23 23 0a 23 23 20 52 65 61 64 79 #######.## Ready
50a0: 0a 0a 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64 ..package provid
50b0: 65 20 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d e vc::fossil::im
50c0: 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 port::cvs::proje
50d0: 63 74 3a 3a 72 65 76 20 31 2e 30 0a 72 65 74 75 ct::rev 1.0.retu
50e0: 72 6e 0a rn.