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 73 20 7b 7d 20 7b 0a 09 23 20 4e 4f 54 45 20 rs {} {..# NOTE
09f0: 2f 20 46 55 54 55 52 45 3a 20 50 6f 73 73 69 62 / FUTURE: Possib
0a00: 6c 65 20 62 6f 74 74 6c 65 6e 65 63 6b 2e 0a 09 le bottleneck...
0a10: 73 65 74 20 63 73 65 74 73 20 7b 7d 0a 09 66 6f set csets {}..fo
0a20: 72 65 61 63 68 20 7b 5f 20 63 68 69 6c 64 72 65 reach {_ childre
0a30: 6e 7d 20 5b 24 73 65 6c 66 20 6e 65 78 74 6d 61 n} [$self nextma
0a40: 70 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 63 p] {.. foreac
0a50: 68 20 63 68 69 6c 64 20 24 63 68 69 6c 64 72 65 h child $childre
0a60: 6e 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 63 73 n {...lappend cs
0a70: 65 74 73 20 24 6d 79 72 65 76 6d 61 70 28 24 63 ets $myrevmap($c
0a80: 68 69 6c 64 29 0a 09 20 20 20 20 7d 0a 09 7d 0a hild).. }..}.
0a90: 09 72 65 74 75 72 6e 20 5b 6c 73 6f 72 74 20 2d .return [lsort -
0aa0: 75 6e 69 71 75 65 20 24 63 73 65 74 73 5d 0a 20 unique $csets].
0ab0: 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 76 69 }.. # revi
0ac0: 73 69 6f 6e 20 2d 3e 20 6c 69 73 74 20 28 72 65 sion -> list (re
0ad0: 76 69 73 69 6f 6e 29 0a 20 20 20 20 6d 65 74 68 vision). meth
0ae0: 6f 64 20 6e 65 78 74 6d 61 70 20 7b 7d 20 7b 0a od nextmap {} {.
0af0: 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6d .if {[llength $m
0b00: 79 6e 65 78 74 6d 61 70 5d 7d 20 7b 20 72 65 74 ynextmap]} { ret
0b10: 75 72 6e 20 24 6d 79 6e 65 78 74 6d 61 70 20 7d urn $mynextmap }
0b20: 0a 09 50 75 6c 6c 53 75 63 63 65 73 73 6f 72 52 ..PullSuccessorR
0b30: 65 76 69 73 69 6f 6e 73 20 74 6d 70 20 24 6d 79 evisions tmp $my
0b40: 72 65 76 69 73 69 6f 6e 73 0a 09 73 65 74 20 6d revisions..set m
0b50: 79 6e 65 78 74 6d 61 70 20 5b 61 72 72 61 79 20 ynextmap [array
0b60: 67 65 74 20 74 6d 70 5d 0a 09 72 65 74 75 72 6e get tmp]..return
0b70: 20 24 6d 79 6e 65 78 74 6d 61 70 0a 20 20 20 20 $mynextmap.
0b80: 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 62 72 }.. method br
0b90: 65 61 6b 69 6e 74 65 72 6e 61 6c 64 65 70 65 6e eakinternaldepen
0ba0: 64 65 6e 63 69 65 73 20 7b 7d 20 7b 0a 09 23 20 dencies {} {..#
0bb0: 54 68 69 73 20 6d 65 74 68 6f 64 20 69 6e 73 70 This method insp
0bc0: 65 63 74 73 20 74 68 65 20 63 68 61 6e 67 65 73 ects the changes
0bd0: 65 74 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c ets for internal
0be0: 0a 09 23 20 64 65 70 65 6e 64 65 6e 63 69 65 73 ..# dependencies
0bf0: 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 64 6f 6e . Nothing is don
0c00: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e e if there are n
0c10: 6f 0a 09 23 20 73 75 63 68 2e 20 4f 74 68 65 72 o..# such. Other
0c20: 77 69 73 65 20 74 68 65 20 63 68 61 6e 67 65 73 wise the changes
0c30: 65 74 20 69 73 20 73 70 6c 69 74 20 69 6e 74 6f et is split into
0c40: 20 61 20 73 65 74 20 6f 66 0a 09 23 20 66 72 61 a set of..# fra
0c50: 67 6d 65 6e 74 73 20 77 69 74 68 6f 75 74 20 69 gments without i
0c60: 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e nternal dependen
0c70: 63 69 65 73 2c 20 74 72 61 6e 73 66 6f 72 6d 69 cies, transformi
0c80: 6e 67 20 74 68 65 0a 09 23 20 69 6e 74 65 72 6e ng the..# intern
0c90: 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 al dependencies
0ca0: 69 6e 74 6f 20 65 78 74 65 72 6e 61 6c 20 6f 6e into external on
0cb0: 65 73 2e 20 54 68 65 20 6e 65 77 20 63 68 61 6e es. The new chan
0cc0: 67 65 73 65 74 73 0a 09 23 20 61 72 65 20 61 64 gesets..# are ad
0cd0: 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73 74 20 ded to the list
0ce0: 6f 66 20 61 6c 6c 20 63 68 61 6e 67 65 73 65 74 of all changeset
0cf0: 73 2e 0a 0a 09 23 20 57 65 20 70 65 72 66 6f 72 s....# We perfor
0d00: 6d 20 61 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 m all necessary
0d10: 73 70 6c 69 74 73 20 69 6e 20 6f 6e 65 20 67 6f splits in one go
0d20: 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 6c , instead of onl
0d30: 79 0a 09 23 20 6f 6e 65 2e 20 54 68 65 20 70 72 y..# one. The pr
0d40: 65 76 69 6f 75 73 20 61 6c 67 6f 72 69 74 68 6d evious algorithm
0d50: 2c 20 61 64 61 70 74 65 64 20 66 72 6f 6d 20 63 , adapted from c
0d60: 76 73 32 73 76 6e 2c 20 63 6f 6d 70 75 74 65 64 vs2svn, computed
0d70: 0a 09 23 20 61 20 6c 6f 74 20 6f 66 20 73 74 61 ..# a lot of sta
0d80: 74 65 20 77 68 69 63 68 20 77 61 73 20 74 68 72 te which was thr
0d90: 6f 77 6e 20 61 77 61 79 20 61 6e 64 20 74 68 65 own away and the
0da0: 6e 20 63 6f 6d 70 75 74 65 64 20 61 67 61 69 6e n computed again
0db0: 0a 09 23 20 66 6f 72 20 65 61 63 68 20 6f 66 20 ..# for each of
0dc0: 74 68 65 20 66 72 61 67 6d 65 6e 74 73 2e 20 49 the fragments. I
0dd0: 74 20 73 68 6f 75 6c 64 20 62 65 20 65 61 73 69 t should be easi
0de0: 65 72 20 74 6f 20 75 70 64 61 74 65 20 61 6e 64 er to update and
0df0: 0a 09 23 20 72 65 75 73 65 20 74 68 61 74 20 73 ..# reuse that s
0e00: 74 61 74 65 2e 0a 0a 09 23 20 54 68 65 20 63 6f tate....# The co
0e10: 64 65 20 63 68 65 63 6b 73 20 6f 6e 6c 79 20 73 de checks only s
0e20: 75 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e ucessor dependen
0e30: 63 69 65 73 2c 20 61 73 20 74 68 69 73 0a 09 23 cies, as this..#
0e40: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 automatically c
0e50: 6f 76 65 72 73 20 74 68 65 20 70 72 65 64 65 63 overs the predec
0e60: 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 69 essor dependenci
0e70: 65 73 20 61 73 20 77 65 6c 6c 20 28 41 0a 09 23 es as well (A..#
0e80: 20 73 75 63 63 65 73 73 6f 72 20 64 65 70 65 6e successor depen
0e90: 64 65 6e 63 79 20 61 20 2d 3e 20 62 20 69 73 20 dency a -> b is
0ea0: 61 6c 73 6f 20 61 20 70 72 65 64 65 63 65 73 73 also a predecess
0eb0: 6f 72 20 64 65 70 65 6e 64 65 6e 63 79 0a 09 23 or dependency..#
0ec0: 20 62 20 2d 3e 20 61 29 2e 0a 0a 09 23 20 41 72 b -> a)....# Ar
0ed0: 72 61 79 20 6f 66 20 64 65 70 65 6e 64 65 6e 63 ray of dependenc
0ee0: 69 65 73 20 28 70 61 72 65 6e 74 20 2d 3e 20 63 ies (parent -> c
0ef0: 68 69 6c 64 29 2e 20 54 68 69 73 20 69 73 20 70 hild). This is p
0f00: 75 6c 6c 65 64 20 66 72 6f 6d 0a 09 23 20 74 68 ulled from..# th
0f10: 65 20 73 74 61 74 65 2c 20 61 6e 64 20 6c 69 6d e state, and lim
0f20: 69 74 65 64 20 74 6f 20 73 75 63 63 65 73 73 6f ited to successo
0f30: 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 63 68 rs within the ch
0f40: 61 6e 67 65 73 65 74 2e 0a 0a 09 61 72 72 61 79 angeset....array
0f50: 20 73 65 74 20 64 65 70 65 6e 64 65 6e 63 69 65 set dependencie
0f60: 73 20 7b 7d 0a 09 50 75 6c 6c 49 6e 74 65 72 6e s {}..PullIntern
0f70: 61 6c 53 75 63 63 65 73 73 6f 72 52 65 76 69 73 alSuccessorRevis
0f80: 69 6f 6e 73 20 64 65 70 65 6e 64 65 6e 63 69 65 ions dependencie
0f90: 73 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 0a 09 s $myrevisions..
0fa0: 69 66 20 7b 21 5b 61 72 72 61 79 20 73 69 7a 65 if {![array size
0fb0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 5d 7d 20 dependencies]}
0fc0: 7b 72 65 74 75 72 6e 20 30 7d 20 3b 20 23 20 4e {return 0} ; # N
0fd0: 6f 74 68 69 6e 67 20 74 6f 20 62 72 65 61 6b 2e othing to break.
0fe0: 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 36 20 63 ...log write 6 c
0ff0: 73 65 74 73 20 2e 2e 2e 3c 24 6d 79 69 64 3e 2e sets ...<$myid>.
1000: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
1010: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
1020: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
1030: 2e 2e 2e 2e 2e 2e 0a 0a 09 23 20 57 65 20 68 61 .........# We ha
1040: 76 65 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 ve internal depe
1050: 6e 64 65 6e 63 69 65 73 20 74 6f 20 62 72 65 61 ndencies to brea
1060: 6b 2e 20 57 65 20 6e 6f 77 20 69 74 65 72 61 74 k. We now iterat
1070: 65 20 6f 76 65 72 0a 09 23 20 61 6c 6c 20 70 6f e over..# all po
1080: 73 69 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c sitions in the l
1090: 69 73 74 20 28 77 68 69 63 68 20 69 73 20 63 68 ist (which is ch
10a0: 72 6f 6e 6f 6c 6f 67 69 63 61 6c 2c 20 61 74 20 ronological, at
10b0: 6c 65 61 73 74 0a 09 23 20 61 73 20 66 61 72 20 least..# as far
10c0: 61 73 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 as the timestamp
10d0: 73 20 61 72 65 20 63 6f 72 72 65 63 74 20 61 6e s are correct an
10e0: 64 20 75 6e 69 71 75 65 29 20 61 6e 64 0a 09 23 d unique) and..#
10f0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 determine the b
1100: 65 73 74 20 70 6f 73 69 74 69 6f 6e 20 66 6f 72 est position for
1110: 20 74 68 65 20 62 72 65 61 6b 2c 20 62 79 20 74 the break, by t
1120: 72 79 69 6e 67 20 74 6f 0a 09 23 20 62 72 65 61 rying to..# brea
1130: 6b 20 61 73 20 6d 61 6e 79 20 64 65 70 65 6e 64 k as many depend
1140: 65 6e 63 69 65 73 20 61 73 20 70 6f 73 73 69 62 encies as possib
1150: 6c 65 20 69 6e 20 6f 6e 65 20 67 6f 2e 20 57 68 le in one go. Wh
1160: 65 6e 20 61 0a 09 23 20 62 72 65 61 6b 20 77 61 en a..# break wa
1170: 73 20 66 6f 75 6e 64 20 74 68 69 73 20 69 73 20 s found this is
1180: 72 65 64 6f 6e 65 20 66 6f 72 20 74 68 65 20 66 redone for the f
1190: 72 61 67 6d 65 6e 74 73 20 63 6f 6d 69 6e 67 20 ragments coming
11a0: 61 6e 64 0a 09 23 20 61 66 74 65 72 2c 20 61 66 and..# after, af
11b0: 74 65 72 20 75 70 64 69 6e 67 20 74 68 65 20 63 ter upding the c
11c0: 72 6f 73 73 69 6e 67 20 69 6e 66 6f 72 6d 61 74 rossing informat
11d0: 69 6f 6e 2e 0a 0a 09 23 20 44 61 74 61 20 73 74 ion....# Data st
11e0: 72 75 63 74 75 72 65 73 3a 0a 09 23 20 4d 61 70 ructures:..# Map
11f0: 3a 20 20 50 4f 53 20 20 20 72 65 76 69 73 69 6f : POS revisio
1200: 6e 20 69 64 20 20 20 20 20 20 2d 3e 20 70 6f 73 n id -> pos
1210: 69 74 69 6f 6e 20 69 6e 20 6c 69 73 74 2e 0a 09 ition in list...
1220: 23 20 20 20 20 20 20 20 43 52 4f 53 53 20 70 6f # CROSS po
1230: 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73 74 20 2d sition in list -
1240: 3e 20 6e 75 6d 62 65 72 20 6f 66 20 64 65 70 65 > number of depe
1250: 6e 64 65 6e 63 69 65 73 20 63 72 6f 73 73 69 6e ndencies crossin
1260: 67 20 69 74 0a 09 23 20 20 20 20 20 20 20 44 45 g it..# DE
1270: 50 43 20 20 64 65 70 65 6e 64 65 6e 63 79 20 20 PC dependency
1280: 20 20 20 20 20 2d 3e 20 70 6f 73 69 74 69 6f 6e -> position
1290: 73 20 69 74 20 63 72 6f 73 73 65 73 0a 09 23 20 s it crosses..#
12a0: 4c 69 73 74 3a 20 52 41 4e 47 45 20 4f 66 20 74 List: RANGE Of t
12b0: 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 69 74 73 he positions its
12c0: 65 6c 66 2e 0a 09 23 20 41 20 64 65 70 65 6e 64 elf...# A depend
12d0: 65 6e 63 79 20 69 73 20 61 20 73 69 6e 67 6c 65 ency is a single
12e0: 2d 65 6c 65 6d 65 6e 74 20 6d 61 70 20 70 61 72 -element map par
12f0: 65 6e 74 20 2d 3e 20 63 68 69 6c 64 0a 0a 09 49 ent -> child...I
1300: 6e 69 74 69 61 6c 69 7a 65 42 72 65 61 6b 53 74 nitializeBreakSt
1310: 61 74 65 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 ate $myrevisions
1320: 0a 0a 09 73 65 74 20 66 72 61 67 6d 65 6e 74 73 ...set fragments
1330: 20 7b 7d 0a 09 73 65 74 20 70 65 6e 64 69 6e 67 {}..set pending
1340: 20 20 20 5b 6c 69 73 74 20 24 72 61 6e 67 65 5d [list $range]
1350: 0a 09 73 65 74 20 61 74 20 20 20 20 20 20 20 20 ..set at
1360: 30 0a 09 61 72 72 61 79 20 73 65 74 20 62 72 65 0..array set bre
1370: 61 6b 73 20 7b 7d 0a 0a 09 77 68 69 6c 65 20 7b aks {}...while {
1380: 24 61 74 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24 $at < [llength $
1390: 70 65 6e 64 69 6e 67 5d 7d 20 7b 0a 09 20 20 20 pending]} {..
13a0: 20 73 65 74 20 63 75 72 72 65 6e 74 20 5b 6c 69 set current [li
13b0: 6e 64 65 78 20 24 70 65 6e 64 69 6e 67 20 24 61 ndex $pending $a
13c0: 74 5d 0a 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 t]... log wri
13d0: 74 65 20 36 20 63 73 65 74 73 20 22 2e 20 2e 20 te 6 csets ". .
13e0: 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e 2e .. ... ..... ...
13f0: 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ..... ..........
1400: 2e 2e 2e 22 0a 09 20 20 20 20 6c 6f 67 20 77 72 ...".. log wr
1410: 69 74 65 20 36 20 63 73 65 74 73 20 22 53 63 68 ite 6 csets "Sch
1420: 65 64 75 6c 65 64 20 20 20 5b 6a 6f 69 6e 20 5b eduled [join [
1430: 50 52 73 20 5b 6c 72 61 6e 67 65 20 24 70 65 6e PRs [lrange $pen
1440: 64 69 6e 67 20 24 61 74 20 65 6e 64 5d 5d 20 7b ding $at end]] {
1450: 20 7d 5d 22 0a 09 20 20 20 20 6c 6f 67 20 77 72 }]".. log wr
1460: 69 74 65 20 36 20 63 73 65 74 73 20 22 43 6f 6e ite 6 csets "Con
1470: 73 69 64 65 72 69 6e 67 20 5b 50 52 20 24 63 75 sidering [PR $cu
1480: 72 72 65 6e 74 5d 20 5c 5b 24 61 74 2f 5b 6c 6c rrent] \[$at/[ll
1490: 65 6e 67 74 68 20 24 70 65 6e 64 69 6e 67 5d 5c ength $pending]\
14a0: 5d 22 0a 0a 09 20 20 20 20 73 65 74 20 62 65 73 ]"... set bes
14b0: 74 20 5b 46 69 6e 64 42 65 73 74 42 72 65 61 6b t [FindBestBreak
14c0: 20 24 63 75 72 72 65 6e 74 5d 0a 0a 09 20 20 20 $current]...
14d0: 20 69 66 20 7b 24 62 65 73 74 20 3c 20 30 7d 20 if {$best < 0}
14e0: 7b 0a 09 09 23 20 54 68 65 20 69 6e 73 70 65 63 {...# The inspec
14f0: 74 65 64 20 72 61 6e 67 65 20 68 61 73 20 6e 6f ted range has no
1500: 20 69 6e 74 65 72 6e 61 6c 0a 09 09 23 20 64 65 internal...# de
1510: 70 65 6e 64 65 6e 63 69 65 73 2e 20 54 68 69 73 pendencies. This
1520: 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 66 is a complete f
1530: 72 61 67 6d 65 6e 74 2e 0a 09 09 6c 61 70 70 65 ragment....lappe
1540: 6e 64 20 66 72 61 67 6d 65 6e 74 73 20 24 63 75 nd fragments $cu
1550: 72 72 65 6e 74 0a 0a 09 09 6c 6f 67 20 77 72 69 rrent....log wri
1560: 74 65 20 36 20 63 73 65 74 73 20 22 4e 6f 20 62 te 6 csets "No b
1570: 72 65 61 6b 73 2c 20 66 69 6e 61 6c 22 0a 09 20 reaks, final"..
1580: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 23 20 } else {...#
1590: 53 70 6c 69 74 20 74 68 65 20 72 61 6e 67 65 20 Split the range
15a0: 61 6e 64 20 73 63 68 65 64 75 6c 65 20 74 68 65 and schedule the
15b0: 20 72 65 73 75 6c 74 69 6e 67 20 66 72 61 67 6d resulting fragm
15c0: 65 6e 74 73 0a 09 09 23 20 66 6f 72 20 66 75 72 ents...# for fur
15d0: 74 68 65 72 20 69 6e 73 70 65 63 74 69 6f 6e 2e ther inspection.
15e0: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 6e 75 Remember the nu
15f0: 6d 62 65 72 20 6f 66 0a 09 09 23 20 64 65 70 65 mber of...# depe
1600: 6e 64 65 6e 63 69 65 73 20 63 75 74 20 62 65 66 ndencies cut bef
1610: 6f 72 65 20 77 65 20 72 65 6d 6f 76 65 20 74 68 ore we remove th
1620: 65 6d 20 66 72 6f 6d 0a 09 09 23 20 63 6f 6e 73 em from...# cons
1630: 69 64 65 72 61 74 69 6f 6e 2c 20 66 6f 72 20 64 ideration, for d
1640: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 6c 61 74 ocumentation lat
1650: 65 72 2e 0a 0a 09 09 73 65 74 20 62 72 65 61 6b er.....set break
1660: 73 28 24 62 65 73 74 29 20 24 63 72 6f 73 73 28 s($best) $cross(
1670: 24 62 65 73 74 29 0a 0a 09 09 6c 6f 67 20 77 72 $best)....log wr
1680: 69 74 65 20 36 20 63 73 65 74 73 20 22 42 65 73 ite 6 csets "Bes
1690: 74 20 62 72 65 61 6b 20 40 20 24 62 65 73 74 2c t break @ $best,
16a0: 20 63 75 74 74 69 6e 67 20 5b 6e 73 70 20 24 63 cutting [nsp $c
16b0: 72 6f 73 73 28 24 62 65 73 74 29 20 64 65 70 65 ross($best) depe
16c0: 6e 64 65 6e 63 79 20 64 65 70 65 6e 64 65 6e 63 ndency dependenc
16d0: 69 65 73 5d 22 0a 0a 09 09 23 20 4e 6f 74 65 3a ies]"....# Note:
16e0: 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 62 65 The value of be
16f0: 73 74 20 69 73 20 61 6e 20 61 62 6f 6c 75 74 65 st is an abolute
1700: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 0a 09 09 23 location in...#
1710: 20 6d 79 72 65 76 69 73 69 6f 6e 73 2e 20 55 73 myrevisions. Us
1720: 65 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 63 e the start of c
1730: 75 72 72 65 6e 74 20 74 6f 20 6d 61 6b 65 20 69 urrent to make i
1740: 74 20 61 6e 0a 09 09 23 20 69 6e 64 65 78 20 61 t an...# index a
1750: 62 73 6f 6c 75 74 65 20 74 6f 20 63 75 72 72 65 bsolute to curre
1760: 6e 74 2e 0a 0a 09 09 73 65 74 20 62 72 65 6c 20 nt.....set brel
1770: 5b 65 78 70 72 20 7b 24 62 65 73 74 20 2d 20 5b [expr {$best - [
1780: 6c 69 6e 64 65 78 20 24 63 75 72 72 65 6e 74 20 lindex $current
1790: 30 5d 7d 5d 0a 09 09 73 65 74 20 62 6e 65 78 74 0]}]...set bnext
17a0: 20 24 62 72 65 6c 20 3b 20 69 6e 63 72 20 62 6e $brel ; incr bn
17b0: 65 78 74 0a 09 09 73 65 74 20 66 72 61 67 62 65 ext...set fragbe
17c0: 66 6f 72 65 20 5b 6c 72 61 6e 67 65 20 24 63 75 fore [lrange $cu
17d0: 72 72 65 6e 74 20 30 20 24 62 72 65 6c 5d 0a 09 rrent 0 $brel]..
17e0: 09 73 65 74 20 66 72 61 67 61 66 74 65 72 20 20 .set fragafter
17f0: 5b 6c 72 61 6e 67 65 20 24 63 75 72 72 65 6e 74 [lrange $current
1800: 20 24 62 6e 65 78 74 20 65 6e 64 5d 0a 0a 09 09 $bnext end]....
1810: 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74 log write 6 cset
1820: 73 20 22 4e 65 77 20 70 69 65 63 65 73 20 20 5b s "New pieces [
1830: 50 52 20 24 66 72 61 67 62 65 66 6f 72 65 5d 20 PR $fragbefore]
1840: 5b 50 52 20 24 66 72 61 67 61 66 74 65 72 5d 22 [PR $fragafter]"
1850: 0a 0a 09 09 69 66 20 7b 21 5b 6c 6c 65 6e 67 74 ....if {![llengt
1860: 68 20 24 66 72 61 67 62 65 66 6f 72 65 5d 7d 20 h $fragbefore]}
1870: 7b 0a 09 09 20 20 20 20 74 72 6f 75 62 6c 65 20 {... trouble
1880: 69 6e 74 65 72 6e 61 6c 20 22 54 72 69 65 64 20 internal "Tried
1890: 74 6f 20 73 70 6c 69 74 20 6f 66 66 20 61 20 7a to split off a z
18a0: 65 72 6f 2d 6c 65 6e 67 74 68 20 66 72 61 67 6d ero-length fragm
18b0: 65 6e 74 20 61 74 20 74 68 65 20 62 65 67 69 6e ent at the begin
18c0: 6e 69 6e 67 22 0a 09 09 7d 0a 09 09 69 66 20 7b ning"...}...if {
18d0: 21 5b 6c 6c 65 6e 67 74 68 20 24 66 72 61 67 61 ![llength $fraga
18e0: 66 74 65 72 5d 7d 20 7b 0a 09 09 20 20 20 20 74 fter]} {... t
18f0: 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 rouble internal
1900: 22 54 72 69 65 64 20 74 6f 20 73 70 6c 69 74 20 "Tried to split
1910: 6f 66 66 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 off a zero-lengt
1920: 68 20 66 72 61 67 6d 65 6e 74 20 61 74 20 74 68 h fragment at th
1930: 65 20 65 6e 64 22 0a 09 09 7d 0a 0a 09 09 6c 61 e end"...}....la
1940: 70 70 65 6e 64 20 70 65 6e 64 69 6e 67 20 24 66 ppend pending $f
1950: 72 61 67 62 65 66 6f 72 65 20 24 66 72 61 67 61 ragbefore $fraga
1960: 66 74 65 72 0a 09 09 43 75 74 41 74 20 24 62 65 fter...CutAt $be
1970: 73 74 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 st.. }...
1980: 69 6e 63 72 20 61 74 0a 09 7d 0a 0a 09 6c 6f 67 incr at..}...log
1990: 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22 write 6 csets "
19a0: 2e 20 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e . . .. ... .....
19b0: 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e ........ ......
19c0: 2e 2e 2e 2e 2e 2e 2e 22 0a 0a 09 23 20 43 72 65 ......."...# Cre
19d0: 61 74 65 20 63 68 61 6e 67 65 73 65 74 73 20 66 ate changesets f
19e0: 6f 72 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 or the fragments
19f0: 2c 20 72 65 75 73 69 6e 67 20 74 68 65 20 63 75 , reusing the cu
1a00: 72 72 65 6e 74 20 6f 6e 65 0a 09 23 20 66 6f 72 rrent one..# for
1a10: 20 74 68 65 20 66 69 72 73 74 20 66 72 61 67 6d the first fragm
1a20: 65 6e 74 2e 20 57 65 20 73 6f 72 74 20 74 68 65 ent. We sort the
1a30: 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 6c m in order to al
1a40: 6c 6f 77 0a 09 23 20 63 68 65 63 6b 69 6e 67 20 low..# checking
1a50: 66 6f 72 20 67 61 70 73 20 61 6e 64 20 6e 69 63 for gaps and nic
1a60: 65 20 6d 65 73 73 61 67 65 73 2e 0a 0a 09 73 65 e messages....se
1a70: 74 20 66 72 61 67 6d 65 6e 74 73 20 5b 6c 73 6f t fragments [lso
1a80: 72 74 20 2d 69 6e 64 65 78 20 30 20 2d 69 6e 74 rt -index 0 -int
1a90: 65 67 65 72 20 24 66 72 61 67 6d 65 6e 74 73 5d eger $fragments]
1aa0: 0a 0a 09 23 70 75 74 73 20 5c 74 2e 5b 6a 6f 69 ...#puts \t.[joi
1ab0: 6e 20 5b 50 52 73 20 24 66 72 61 67 6d 65 6e 74 n [PRs $fragment
1ac0: 73 5d 20 2e 5c 6e 5c 74 2e 5d 2e 0a 0a 09 42 6f s] .\n\t.]....Bo
1ad0: 72 64 65 72 20 5b 6c 69 6e 64 65 78 20 24 66 72 rder [lindex $fr
1ae0: 61 67 6d 65 6e 74 73 20 30 5d 20 66 69 72 73 74 agments 0] first
1af0: 73 20 66 69 72 73 74 65 0a 0a 09 69 66 20 7b 24 s firste...if {$
1b00: 66 69 72 73 74 73 20 21 3d 20 30 7d 20 7b 0a 09 firsts != 0} {..
1b10: 20 20 20 20 74 72 6f 75 62 6c 65 20 69 6e 74 65 trouble inte
1b20: 72 6e 61 6c 20 22 42 61 64 20 66 72 61 67 6d 65 rnal "Bad fragme
1b30: 6e 74 20 73 74 61 72 74 20 40 20 24 66 69 72 73 nt start @ $firs
1b40: 74 73 2c 20 67 61 70 2c 20 6f 72 20 62 65 66 6f ts, gap, or befo
1b50: 72 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 re beginning of
1b60: 74 68 65 20 72 61 6e 67 65 22 0a 09 7d 0a 0a 09 the range"..}...
1b70: 73 65 74 20 6c 61 73 74 65 20 24 66 69 72 73 74 set laste $first
1b80: 65 0a 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d e..foreach fragm
1b90: 65 6e 74 20 5b 6c 72 61 6e 67 65 20 24 66 72 61 ent [lrange $fra
1ba0: 67 6d 65 6e 74 73 20 31 20 65 6e 64 5d 20 7b 0a gments 1 end] {.
1bb0: 09 20 20 20 20 42 6f 72 64 65 72 20 24 66 72 61 . Border $fra
1bc0: 67 6d 65 6e 74 20 73 20 65 0a 09 20 20 20 20 69 gment s e.. i
1bd0: 66 20 7b 24 6c 61 73 74 65 20 21 3d 20 28 24 73 f {$laste != ($s
1be0: 20 2d 20 31 29 7d 20 7b 0a 09 09 74 72 6f 75 62 - 1)} {...troub
1bf0: 6c 65 20 69 6e 74 65 72 6e 61 6c 20 22 42 61 64 le internal "Bad
1c00: 20 66 72 61 67 6d 65 6e 74 20 62 6f 72 64 65 72 fragment border
1c10: 20 3c 24 6c 61 73 74 65 20 7c 20 24 73 3e 2c 20 <$laste | $s>,
1c20: 67 61 70 20 6f 72 20 6f 76 65 72 6c 61 70 22 0a gap or overlap".
1c30: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 73 65 74 . }... set
1c40: 20 6e 65 77 20 5b 24 74 79 70 65 20 25 41 55 54 new [$type %AUT
1c50: 4f 25 20 24 6d 79 70 72 6f 6a 65 63 74 20 24 6d O% $myproject $m
1c60: 79 74 79 70 65 20 24 6d 79 73 72 63 69 64 20 5b ytype $mysrcid [
1c70: 6c 72 61 6e 67 65 20 24 6d 79 72 65 76 69 73 69 lrange $myrevisi
1c80: 6f 6e 73 20 24 73 20 24 65 5d 5d 0a 0a 20 20 20 ons $s $e]]..
1c90: 20 20 20 20 20 20 20 20 20 6c 6f 67 20 77 72 69 log wri
1ca0: 74 65 20 34 20 63 73 65 74 73 20 22 42 72 65 61 te 4 csets "Brea
1cb0: 6b 69 6e 67 20 3c 24 6d 79 69 64 3e 20 40 20 24 king <$myid> @ $
1cc0: 6c 61 73 74 65 2c 20 6e 65 77 20 3c 5b 24 6e 65 laste, new <[$ne
1cd0: 77 20 69 64 5d 3e 2c 20 63 75 74 74 69 6e 67 20 w id]>, cutting
1ce0: 24 62 72 65 61 6b 73 28 24 6c 61 73 74 65 29 22 $breaks($laste)"
1cf0: 0a 0a 09 20 20 20 20 73 65 74 20 6c 61 73 74 65 ... set laste
1d00: 20 24 65 0a 09 7d 0a 0a 09 69 66 20 7b 24 6c 61 $e..}...if {$la
1d10: 73 74 65 20 21 3d 20 28 5b 6c 6c 65 6e 67 74 68 ste != ([llength
1d20: 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 5d 2d 31 $myrevisions]-1
1d30: 29 7d 20 7b 0a 09 20 20 20 20 74 72 6f 75 62 6c )} {.. troubl
1d40: 65 20 69 6e 74 65 72 6e 61 6c 20 22 42 61 64 20 e internal "Bad
1d50: 66 72 61 67 6d 65 6e 74 20 65 6e 64 20 40 20 24 fragment end @ $
1d60: 6c 61 73 74 65 2c 20 67 61 70 2c 20 6f 72 20 62 laste, gap, or b
1d70: 65 79 6f 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 eyond end of the
1d80: 20 72 61 6e 67 65 22 0a 09 7d 0a 0a 09 23 20 50 range"..}...# P
1d90: 75 74 20 74 68 65 20 66 69 72 73 74 20 66 72 61 ut the first fra
1da0: 67 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 63 gment into the c
1db0: 75 72 72 65 6e 74 20 63 68 61 6e 67 65 73 65 74 urrent changeset
1dc0: 2e 0a 09 73 65 74 20 6d 79 72 65 76 69 73 69 6f ...set myrevisio
1dd0: 6e 73 20 5b 6c 72 61 6e 67 65 20 24 6d 79 72 65 ns [lrange $myre
1de0: 76 69 73 69 6f 6e 73 20 30 20 24 66 69 72 73 74 visions 0 $first
1df0: 65 5d 0a 0a 09 72 65 74 75 72 6e 20 31 0a 20 20 e]...return 1.
1e00: 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 }.. method
1e10: 70 65 72 73 69 73 74 20 7b 7d 20 7b 0a 09 73 65 persist {} {..se
1e20: 74 20 74 69 64 20 24 6d 79 63 73 74 79 70 65 28 t tid $mycstype(
1e30: 24 6d 79 74 79 70 65 29 0a 09 73 65 74 20 70 69 $mytype)..set pi
1e40: 64 20 5b 24 6d 79 70 72 6f 6a 65 63 74 20 69 64 d [$myproject id
1e50: 5d 0a 09 73 65 74 20 70 6f 73 20 30 0a 0a 09 73 ]..set pos 0...s
1e60: 74 61 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e tate transaction
1e70: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 20 72 75 {.. state ru
1e80: 6e 20 7b 0a 09 09 49 4e 53 45 52 54 20 49 4e 54 n {...INSERT INT
1e90: 4f 20 63 68 61 6e 67 65 73 65 74 20 28 63 69 64 O changeset (cid
1ea0: 2c 20 20 20 70 69 64 2c 20 20 74 79 70 65 2c 20 , pid, type,
1eb0: 73 72 63 29 0a 09 09 56 41 4c 55 45 53 20 20 20 src)...VALUES
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 24 6d ($m
1ed0: 79 69 64 2c 20 24 70 69 64 2c 20 24 74 69 64 2c yid, $pid, $tid,
1ee0: 20 24 6d 79 73 72 63 69 64 29 3b 0a 09 20 20 20 $mysrcid);..
1ef0: 20 7d 0a 0a 09 20 20 20 20 66 6f 72 65 61 63 68 }... foreach
1f00: 20 72 69 64 20 24 6d 79 72 65 76 69 73 69 6f 6e rid $myrevision
1f10: 73 20 7b 0a 09 09 73 74 61 74 65 20 72 75 6e 20 s {...state run
1f20: 7b 0a 09 09 20 20 20 20 49 4e 53 45 52 54 20 49 {... INSERT I
1f30: 4e 54 4f 20 63 73 72 65 76 69 73 69 6f 6e 20 28 NTO csrevision (
1f40: 63 69 64 2c 20 20 20 70 6f 73 2c 20 20 72 69 64 cid, pos, rid
1f50: 29 0a 09 09 20 20 20 20 56 41 4c 55 45 53 20 20 )... VALUES
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 (
1f70: 24 6d 79 69 64 2c 20 24 70 6f 73 2c 20 24 72 69 $myid, $pos, $ri
1f80: 64 29 3b 0a 09 09 7d 0a 09 09 69 6e 63 72 20 70 d);...}...incr p
1f90: 6f 73 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72 65 os.. }..}..re
1fa0: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 turn. }..
1fb0: 6d 65 74 68 6f 64 20 74 69 6d 65 72 61 6e 67 65 method timerange
1fc0: 20 7b 7d 20 7b 0a 09 73 65 74 20 74 68 65 73 65 {} {..set these
1fd0: 74 20 28 27 5b 6a 6f 69 6e 20 24 6d 79 72 65 76 t ('[join $myrev
1fe0: 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a isions {','}]').
1ff0: 09 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72 .return [state r
2000: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 un ".. SELECT
2010: 20 4d 49 4e 28 52 2e 64 61 74 65 29 2c 20 4d 41 MIN(R.date), MA
2020: 58 28 52 2e 64 61 74 65 29 0a 09 20 20 20 20 46 X(R.date).. F
2030: 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 ROM revision R..
2040: 20 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 WHERE R.rid
2050: 49 4e 20 24 74 68 65 73 65 74 0a 09 22 5d 0a 20 IN $theset.."].
2060: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 }.. method
2070: 20 64 72 6f 70 20 7b 7d 20 7b 0a 09 73 74 61 74 drop {} {..stat
2080: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a e transaction {.
2090: 09 20 20 20 20 73 74 61 74 65 20 72 75 6e 20 7b . state run {
20a0: 0a 09 09 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 ...DELETE FROM c
20b0: 68 61 6e 67 65 73 65 74 20 20 57 48 45 52 45 20 hangeset WHERE
20c0: 63 69 64 20 3d 20 24 6d 79 69 64 3b 0a 09 09 44 cid = $myid;...D
20d0: 45 4c 45 54 45 20 46 52 4f 4d 20 63 73 72 65 76 ELETE FROM csrev
20e0: 69 73 69 6f 6e 20 57 48 45 52 45 20 63 69 64 20 ision WHERE cid
20f0: 3d 20 24 6d 79 69 64 3b 0a 09 20 20 20 20 7d 0a = $myid;.. }.
2100: 09 7d 0a 09 66 6f 72 65 61 63 68 20 72 20 24 6d .}..foreach r $m
2110: 79 72 65 76 69 73 69 6f 6e 73 20 7b 20 75 6e 73 yrevisions { uns
2120: 65 74 20 6d 79 72 65 76 6d 61 70 28 24 72 29 20 et myrevmap($r)
2130: 7d 0a 09 73 65 74 20 70 6f 73 20 20 20 20 20 20 }..set pos
2140: 20 20 20 20 5b 6c 73 65 61 72 63 68 20 2d 65 78 [lsearch -ex
2150: 61 63 74 20 24 6d 79 63 68 61 6e 67 65 73 65 74 act $mychangeset
2160: 73 20 24 73 65 6c 66 5d 0a 09 73 65 74 20 6d 79 s $self]..set my
2170: 63 68 61 6e 67 65 73 65 74 73 20 5b 6c 72 65 70 changesets [lrep
2180: 6c 61 63 65 20 24 6d 79 63 68 61 6e 67 65 73 65 lace $mychangese
2190: 74 73 20 24 70 6f 73 20 24 70 6f 73 5d 0a 09 72 ts $pos $pos]..r
21a0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 eturn. }..
21b0: 20 74 79 70 65 6d 65 74 68 6f 64 20 73 70 6c 69 typemethod spli
21c0: 74 20 7b 63 73 65 74 20 61 72 67 73 7d 20 7b 0a t {cset args} {.
21d0: 09 23 20 41 73 20 70 61 72 74 20 6f 66 20 74 68 .# As part of th
21e0: 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 e creation of th
21f0: 65 20 6e 65 77 20 63 68 61 6e 67 65 73 65 74 73 e new changesets
2200: 20 73 70 65 63 69 66 69 65 64 20 69 6e 0a 09 23 specified in..#
2210: 20 41 52 47 53 20 61 73 20 73 65 74 73 20 6f 66 ARGS as sets of
2220: 20 72 65 76 69 73 69 6f 6e 73 2c 20 61 6c 6c 20 revisions, all
2230: 73 75 62 73 65 74 73 20 6f 66 20 43 53 45 54 27 subsets of CSET'
2240: 73 20 72 65 76 69 73 69 6f 6e 0a 09 23 20 73 65 s revision..# se
2250: 74 2c 20 43 53 45 54 20 77 69 6c 6c 20 62 65 20 t, CSET will be
2260: 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 61 6c 6c dropped from all
2270: 20 64 61 74 61 62 61 73 65 73 2c 20 69 6e 20 61 databases, in a
2280: 6e 64 20 6f 75 74 20 6f 66 0a 09 23 20 6d 65 6d nd out of..# mem
2290: 6f 72 79 2c 20 61 6e 64 20 74 68 65 6e 20 64 65 ory, and then de
22a0: 73 74 72 6f 79 65 64 2e 0a 0a 09 73 74 72 75 63 stroyed....struc
22b0: 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b t::list assign [
22c0: 24 63 73 65 74 20 64 61 74 61 5d 20 70 72 6f 6a $cset data] proj
22d0: 65 63 74 20 63 73 74 79 70 65 20 63 73 73 72 63 ect cstype cssrc
22e0: 0a 0a 09 24 63 73 65 74 20 64 72 6f 70 0a 09 24 ...$cset drop..$
22f0: 63 73 65 74 20 64 65 73 74 72 6f 79 0a 0a 09 73 cset destroy...s
2300: 65 74 20 6e 65 77 63 73 65 74 73 20 7b 7d 0a 09 et newcsets {}..
2310: 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65 6e 74 foreach fragment
2320: 72 65 76 69 73 69 6f 6e 73 20 24 61 72 67 73 20 revisions $args
2330: 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 6e {.. lappend n
2340: 65 77 63 73 65 74 73 20 5b 24 74 79 70 65 20 25 ewcsets [$type %
2350: 41 55 54 4f 25 20 24 70 72 6f 6a 65 63 74 20 24 AUTO% $project $
2360: 63 73 74 79 70 65 20 24 63 73 73 72 63 20 24 66 cstype $cssrc $f
2370: 72 61 67 6d 65 6e 74 72 65 76 69 73 69 6f 6e 73 ragmentrevisions
2380: 5d 0a 09 7d 0a 0a 09 66 6f 72 65 61 63 68 20 63 ]..}...foreach c
2390: 20 24 6e 65 77 63 73 65 74 73 20 7b 20 24 63 20 $newcsets { $c
23a0: 70 65 72 73 69 73 74 20 7d 0a 09 72 65 74 75 72 persist }..retur
23b0: 6e 20 24 6e 65 77 63 73 65 74 73 0a 20 20 20 20 n $newcsets.
23c0: 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 }.. # # ## ##
23d0: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 # ##### ########
23e0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 #############.
23f0: 20 20 20 23 23 20 53 74 61 74 65 0a 0a 20 20 20 ## State..
2400: 20 76 61 72 69 61 62 6c 65 20 6d 79 69 64 20 20 variable myid
2410: 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 49 64 20 {} ; # Id
2420: 6f 66 20 74 68 65 20 63 73 65 74 20 66 6f 72 20 of the cset for
2430: 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 0a 09 the persistent..
2440: 09 09 20 20 20 20 20 20 23 20 73 74 61 74 65 2e .. # state.
2450: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 . variable my
2460: 70 72 6f 6a 65 63 74 20 20 20 7b 7d 20 3b 20 23 project {} ; #
2470: 20 52 65 66 65 72 65 6e 63 65 20 6f 66 20 74 68 Reference of th
2480: 65 20 70 72 6f 6a 65 63 74 20 6f 62 6a 65 63 74 e project object
2490: 20 74 68 65 0a 09 09 09 20 20 20 20 20 20 23 20 the.... #
24a0: 63 68 61 6e 67 65 73 65 74 20 62 65 6c 6f 6e 67 changeset belong
24b0: 73 20 74 6f 2e 0a 20 20 20 20 76 61 72 69 61 62 s to.. variab
24c0: 6c 65 20 6d 79 74 79 70 65 20 20 20 20 20 20 7b le mytype {
24d0: 7d 20 3b 20 23 20 72 65 76 20 6f 72 20 73 79 6d } ; # rev or sym
24e0: 2c 20 77 68 65 72 65 20 74 68 65 20 63 73 65 74 , where the cset
24f0: 20 6f 72 69 67 69 6e 61 74 65 64 0a 09 09 09 20 originated....
2500: 20 20 20 20 20 23 20 66 72 6f 6d 2e 0a 20 20 20 # from..
2510: 20 76 61 72 69 61 62 6c 65 20 6d 79 73 72 63 69 variable mysrci
2520: 64 20 20 20 20 20 7b 7d 20 3b 20 23 20 49 64 20 d {} ; # Id
2530: 6f 66 20 74 68 65 20 6d 65 74 61 64 61 74 61 20 of the metadata
2540: 6f 72 20 73 79 6d 62 6f 6c 20 74 68 65 20 63 73 or symbol the cs
2550: 65 74 0a 09 09 09 20 20 20 20 20 20 23 20 69 73 et.... # is
2560: 20 62 61 73 65 64 20 6f 6e 2e 0a 20 20 20 20 76 based on.. v
2570: 61 72 69 61 62 6c 65 20 6d 79 72 65 76 69 73 69 ariable myrevisi
2580: 6f 6e 73 20 7b 7d 20 3b 20 23 20 4c 69 73 74 20 ons {} ; # List
2590: 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 65 76 65 of the file leve
25a0: 6c 20 72 65 76 69 73 69 6f 6e 73 20 69 6e 0a 09 l revisions in..
25b0: 09 09 20 20 20 20 20 20 23 20 74 68 65 20 63 73 .. # the cs
25c0: 65 74 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 et.. variable
25d0: 20 6d 79 6e 65 78 74 6d 61 70 20 20 20 7b 7d 20 mynextmap {}
25e0: 3b 20 23 20 44 69 63 74 69 6f 6e 61 72 79 20 6d ; # Dictionary m
25f0: 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 apping from the
2600: 72 65 76 69 73 69 6f 6e 73 0a 09 09 09 20 20 20 revisions....
2610: 20 20 20 23 20 74 6f 20 74 68 65 69 72 20 73 75 # to their su
2620: 63 63 65 73 73 6f 72 73 2e 20 43 61 63 68 65 20 ccessors. Cache
2630: 74 6f 20 61 76 6f 69 64 0a 09 09 09 20 20 20 20 to avoid....
2640: 20 20 23 20 6c 6f 61 64 69 6e 67 20 74 68 69 73 # loading this
2650: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65 20 from the state
2660: 6d 6f 72 65 20 74 68 61 6e 0a 09 09 09 20 20 20 more than....
2670: 20 20 20 23 20 6f 6e 63 65 2e 0a 20 20 20 20 76 # once.. v
2680: 61 72 69 61 62 6c 65 20 6d 79 70 6f 73 20 20 20 ariable mypos
2690: 20 20 20 20 7b 7d 20 3b 20 23 20 43 6f 6d 6d 69 {} ; # Commi
26a0: 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 t position of th
26b0: 65 20 63 68 61 6e 67 65 73 65 74 2c 20 69 66 0a e changeset, if.
26c0: 09 09 09 20 20 20 20 20 20 23 20 6b 6e 6f 77 6e ... # known
26d0: 2e 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 ... # # ## ##
26e0: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 # ##### ########
26f0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 #############.
2700: 20 20 20 23 23 20 49 6e 74 65 72 6e 61 6c 20 6d ## Internal m
2710: 65 74 68 6f 64 73 0a 0a 20 20 20 20 74 79 70 65 ethods.. type
2720: 76 61 72 69 61 62 6c 65 20 6d 79 63 6f 75 6e 74 variable mycount
2730: 65 72 20 20 20 20 20 20 20 20 30 20 3b 20 23 20 er 0 ; #
2740: 49 64 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 63 Id counter for c
2750: 73 65 74 73 2e 20 4c 61 73 74 20 69 64 20 75 73 sets. Last id us
2760: 65 64 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69 ed.. typevari
2770: 61 62 6c 65 20 6d 79 63 73 74 79 70 65 20 2d 61 able mycstype -a
2780: 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 rray {} ; # Map
2790: 63 73 74 79 70 65 73 20 74 6f 20 70 65 72 73 69 cstypes to persi
27a0: 73 74 65 6e 74 20 69 64 73 2e 0a 0a 20 20 20 20 stent ids...
27b0: 74 79 70 65 6d 65 74 68 6f 64 20 67 65 74 63 73 typemethod getcs
27c0: 74 79 70 65 73 20 7b 7d 20 7b 0a 09 66 6f 72 65 types {} {..fore
27d0: 61 63 68 20 7b 74 69 64 20 6e 61 6d 65 7d 20 5b ach {tid name} [
27e0: 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 state run {..
27f0: 20 53 45 4c 45 43 54 20 74 69 64 2c 20 6e 61 6d SELECT tid, nam
2800: 65 20 46 52 4f 4d 20 63 73 74 79 70 65 3b 0a 09 e FROM cstype;..
2810: 7d 5d 20 7b 20 73 65 74 20 6d 79 63 73 74 79 70 }] { set mycstyp
2820: 65 28 24 6e 61 6d 65 29 20 24 74 69 64 20 7d 0a e($name) $tid }.
2830: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 .return. }..
2840: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c 6f typemethod lo
2850: 61 64 63 6f 75 6e 74 65 72 20 7b 7d 20 7b 0a 09 adcounter {} {..
2860: 23 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 # Initialize the
2870: 20 63 6f 75 6e 74 65 72 20 66 72 6f 6d 20 74 68 counter from th
2880: 65 20 73 74 61 74 65 0a 09 73 65 74 20 6d 79 63 e state..set myc
2890: 6f 75 6e 74 65 72 20 5b 73 74 61 74 65 20 6f 6e ounter [state on
28a0: 65 20 7b 20 53 45 4c 45 43 54 20 4d 41 58 28 63 e { SELECT MAX(c
28b0: 69 64 29 20 46 52 4f 4d 20 63 68 61 6e 67 65 73 id) FROM changes
28c0: 65 74 20 7d 5d 0a 09 72 65 74 75 72 6e 0a 20 20 et }]..return.
28d0: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 50 75 }.. proc Pu
28e0: 6c 6c 49 6e 74 65 72 6e 61 6c 53 75 63 63 65 73 llInternalSucces
28f0: 73 6f 72 52 65 76 69 73 69 6f 6e 73 20 7b 64 76 sorRevisions {dv
2900: 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 revisions} {..u
2910: 70 76 61 72 20 31 20 24 64 76 20 64 65 70 65 6e pvar 1 $dv depen
2920: 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74 68 65 dencies..set the
2930: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 set ('[join $rev
2940: 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a isions {','}]').
2950: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63 ..foreach {rid c
2960: 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e hild} [state run
2970: 20 22 0a 20 20 20 2d 2d 20 50 72 69 6d 61 72 79 ". -- Primary
2980: 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 53 children.. S
2990: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63 ELECT R.rid, R.c
29a0: 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 hild.. FROM
29b0: 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 revision R..
29c0: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 WHERE R.rid
29d0: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 IN $theset..
29e0: 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49 AND R.child I
29f0: 53 20 4e 4f 54 20 4e 55 4c 4c 0a 09 20 20 20 20 S NOT NULL..
2a00: 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49 AND R.child I
2a10: 4e 20 24 74 68 65 73 65 74 0a 20 20 20 20 55 4e N $theset. UN
2a20: 49 4f 4e 0a 20 20 20 20 2d 2d 20 54 72 61 6e 73 ION. -- Trans
2a30: 69 74 69 6f 6e 20 4e 54 44 42 20 74 6f 20 74 72 ition NTDB to tr
2a40: 75 6e 6b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 unk.. SELECT
2a50: 52 2e 72 69 64 2c 20 52 2e 64 62 63 68 69 6c 64 R.rid, R.dbchild
2a60: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 .. FROM rev
2a70: 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 ision R.. WHE
2a80: 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 RE R.rid IN $
2a90: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 theset.. AND
2aa0: 20 20 20 52 2e 64 62 63 68 69 6c 64 20 49 53 20 R.dbchild IS
2ab0: 4e 4f 54 20 4e 55 4c 4c 0a 09 20 20 20 20 41 4e NOT NULL.. AN
2ac0: 44 20 20 20 20 52 2e 64 62 63 68 69 6c 64 20 49 D R.dbchild I
2ad0: 4e 20 24 74 68 65 73 65 74 0a 20 20 20 20 55 4e N $theset. UN
2ae0: 49 4f 4e 0a 20 20 20 20 2d 2d 20 53 65 63 6f 6e ION. -- Secon
2af0: 64 61 72 79 20 28 62 72 61 6e 63 68 29 20 63 68 dary (branch) ch
2b00: 69 6c 64 72 65 6e 0a 09 20 20 20 20 53 45 4c 45 ildren.. SELE
2b10: 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 72 69 64 CT R.rid, B.brid
2b20: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 .. FROM rev
2b30: 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f ision R, revisio
2b40: 6e 62 72 61 6e 63 68 63 68 69 6c 64 72 65 6e 20 nbranchchildren
2b50: 42 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e B.. WHERE R.
2b60: 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 rid IN $theset
2b70: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72 .. AND R.r
2b80: 69 64 20 3d 20 42 2e 72 69 64 0a 09 20 20 20 20 id = B.rid..
2b90: 41 4e 44 20 20 20 20 42 2e 62 72 69 64 20 49 4e AND B.brid IN
2ba0: 20 24 74 68 65 73 65 74 0a 09 22 5d 20 7b 0a 09 $theset.."] {..
2bb0: 20 20 20 20 23 20 43 6f 6e 73 69 64 65 72 20 6d # Consider m
2bc0: 6f 76 69 6e 67 20 74 68 69 73 20 74 6f 20 74 68 oving this to th
2bd0: 65 20 69 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 e integrity modu
2be0: 6c 65 2e 0a 09 20 20 20 20 69 66 20 7b 24 72 69 le... if {$ri
2bf0: 64 20 3d 3d 20 24 63 68 69 6c 64 7d 20 7b 0a 09 d == $child} {..
2c00: 09 74 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61 .trouble interna
2c10: 6c 20 22 52 65 76 69 73 69 6f 6e 20 24 72 69 64 l "Revision $rid
2c20: 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 depends on itse
2c30: 6c 66 2e 22 0a 09 20 20 20 20 7d 0a 09 20 20 20 lf.".. }..
2c40: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 lappend depende
2c50: 6e 63 69 65 73 28 24 72 69 64 29 20 24 63 68 69 ncies($rid) $chi
2c60: 6c 64 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 ld..}. }..
2c70: 20 70 72 6f 63 20 50 75 6c 6c 53 75 63 63 65 73 proc PullSucces
2c80: 73 6f 72 52 65 76 69 73 69 6f 6e 73 20 7b 64 76 sorRevisions {dv
2c90: 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 revisions} {..u
2ca0: 70 76 61 72 20 31 20 24 64 76 20 64 65 70 65 6e pvar 1 $dv depen
2cb0: 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74 68 65 dencies..set the
2cc0: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 set ('[join $rev
2cd0: 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a isions {','}]').
2ce0: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63 ..foreach {rid c
2cf0: 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e hild} [state run
2d00: 20 22 0a 20 20 20 2d 2d 20 50 72 69 6d 61 72 79 ". -- Primary
2d10: 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 53 children.. S
2d20: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63 ELECT R.rid, R.c
2d30: 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 hild.. FROM
2d40: 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 revision R..
2d50: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 WHERE R.rid
2d60: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 IN $theset..
2d70: 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49 AND R.child I
2d80: 53 20 4e 4f 54 20 4e 55 4c 4c 0a 20 20 20 20 55 S NOT NULL. U
2d90: 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 54 72 61 6e NION. -- Tran
2da0: 73 69 74 69 6f 6e 20 4e 54 44 42 20 74 6f 20 74 sition NTDB to t
2db0: 72 75 6e 6b 0a 09 20 20 20 20 53 45 4c 45 43 54 runk.. SELECT
2dc0: 20 52 2e 72 69 64 2c 20 52 2e 64 62 63 68 69 6c R.rid, R.dbchil
2dd0: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 d.. FROM re
2de0: 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 vision R.. WH
2df0: 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 ERE R.rid IN
2e00: 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 $theset.. AND
2e10: 20 20 20 20 52 2e 64 62 63 68 69 6c 64 20 49 53 R.dbchild IS
2e20: 20 4e 4f 54 20 4e 55 4c 4c 0a 20 20 20 20 55 4e NOT NULL. UN
2e30: 49 4f 4e 0a 20 20 20 20 2d 2d 20 53 65 63 6f 6e ION. -- Secon
2e40: 64 61 72 79 20 28 62 72 61 6e 63 68 29 20 63 68 dary (branch) ch
2e50: 69 6c 64 72 65 6e 0a 09 20 20 20 20 53 45 4c 45 ildren.. SELE
2e60: 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 72 69 64 CT R.rid, B.brid
2e70: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 .. FROM rev
2e80: 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f ision R, revisio
2e90: 6e 62 72 61 6e 63 68 63 68 69 6c 64 72 65 6e 20 nbranchchildren
2ea0: 42 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e B.. WHERE R.
2eb0: 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 rid IN $theset
2ec0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72 .. AND R.r
2ed0: 69 64 20 3d 20 42 2e 72 69 64 0a 09 22 5d 20 7b id = B.rid.."] {
2ee0: 0a 09 20 20 20 20 23 20 43 6f 6e 73 69 64 65 72 .. # Consider
2ef0: 20 6d 6f 76 69 6e 67 20 74 68 69 73 20 74 6f 20 moving this to
2f00: 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6d 6f the integrity mo
2f10: 64 75 6c 65 2e 0a 09 20 20 20 20 69 66 20 7b 24 dule... if {$
2f20: 72 69 64 20 3d 3d 20 24 63 68 69 6c 64 7d 20 7b rid == $child} {
2f30: 0a 09 09 74 72 6f 75 62 6c 65 20 69 6e 74 65 72 ...trouble inter
2f40: 6e 61 6c 20 22 52 65 76 69 73 69 6f 6e 20 24 72 nal "Revision $r
2f50: 69 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 74 id depends on it
2f60: 73 65 6c 66 2e 22 0a 09 20 20 20 20 7d 0a 09 20 self.".. }..
2f70: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e lappend depen
2f80: 64 65 6e 63 69 65 73 28 24 72 69 64 29 20 24 63 dencies($rid) $c
2f90: 68 69 6c 64 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 hild..}. }..
2fa0: 20 20 20 70 72 6f 63 20 49 6e 69 74 69 61 6c 69 proc Initiali
2fb0: 7a 65 42 72 65 61 6b 53 74 61 74 65 20 7b 72 65 zeBreakState {re
2fc0: 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 visions} {..upva
2fd0: 72 20 31 20 70 6f 73 20 70 6f 73 20 63 72 6f 73 r 1 pos pos cros
2fe0: 73 20 63 72 6f 73 73 20 72 61 6e 67 65 20 72 61 s cross range ra
2ff0: 6e 67 65 20 64 65 70 63 20 64 65 70 63 20 64 65 nge depc depc de
3000: 6c 74 61 20 64 65 6c 74 61 20 5c 0a 09 20 20 20 lta delta \..
3010: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 64 65 dependencies de
3020: 70 65 6e 64 65 6e 63 69 65 73 0a 0a 09 23 20 46 pendencies...# F
3030: 69 72 73 74 20 77 65 20 63 72 65 61 74 65 20 61 irst we create a
3040: 20 6d 61 70 20 6f 66 20 70 6f 73 69 74 69 6f 6e map of position
3050: 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 65 61 73 s to make it eas
3060: 69 65 72 20 74 6f 0a 09 23 20 64 65 74 65 72 6d ier to..# determ
3070: 69 6e 65 20 77 68 65 74 68 65 72 20 61 20 64 65 ine whether a de
3080: 70 65 6e 64 65 6e 63 79 20 63 72 6f 73 73 65 73 pendency crosses
3090: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e a particular in
30a0: 64 65 78 2e 0a 0a 09 61 72 72 61 79 20 73 65 74 dex....array set
30b0: 20 70 6f 73 20 20 20 7b 7d 0a 09 61 72 72 61 79 pos {}..array
30c0: 20 73 65 74 20 63 72 6f 73 73 20 7b 7d 0a 09 61 set cross {}..a
30d0: 72 72 61 79 20 73 65 74 20 64 65 70 63 20 20 7b rray set depc {
30e0: 7d 0a 09 73 65 74 20 72 61 6e 67 65 20 20 20 20 }..set range
30f0: 20 20 20 7b 7d 0a 09 73 65 74 20 6e 20 30 0a 09 {}..set n 0..
3100: 66 6f 72 65 61 63 68 20 72 65 76 20 24 72 65 76 foreach rev $rev
3110: 69 73 69 6f 6e 73 20 7b 20 0a 09 20 20 20 20 6c isions { .. l
3120: 61 70 70 65 6e 64 20 72 61 6e 67 65 20 24 6e 0a append range $n.
3130: 09 20 20 20 20 73 65 74 20 70 6f 73 28 24 72 65 . set pos($re
3140: 76 29 20 24 6e 0a 09 20 20 20 20 73 65 74 20 63 v) $n.. set c
3150: 72 6f 73 73 28 24 6e 29 20 30 0a 09 20 20 20 20 ross($n) 0..
3160: 69 6e 63 72 20 6e 0a 09 7d 0a 0a 09 23 20 53 65 incr n..}...# Se
3170: 63 6f 6e 64 6c 79 20 77 65 20 63 6f 75 6e 74 20 condly we count
3180: 74 68 65 20 63 72 6f 73 73 69 6e 67 73 20 70 65 the crossings pe
3190: 72 20 70 6f 73 69 74 69 6f 6e 2c 20 62 79 20 69 r position, by i
31a0: 74 65 72 61 74 69 6e 67 0a 09 23 20 6f 76 65 72 terating..# over
31b0: 20 74 68 65 20 72 65 63 6f 72 64 65 64 20 69 6e the recorded in
31c0: 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 ternal dependenc
31d0: 69 65 73 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 49 ies....# Note: I
31e0: 66 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 73 f the timestamps
31f0: 20 61 72 65 20 62 61 64 6c 79 20 6f 75 74 20 6f are badly out o
3200: 66 20 6f 72 64 65 72 20 69 74 20 69 73 0a 09 23 f order it is..#
3210: 20 20 20 20 20 20 20 70 6f 73 73 69 62 6c 65 20 possible
3220: 74 6f 20 68 61 76 65 20 61 20 62 61 63 6b 77 61 to have a backwa
3230: 72 64 20 73 75 63 63 65 73 73 6f 72 20 64 65 70 rd successor dep
3240: 65 6e 64 65 6e 63 79 2c 0a 09 23 20 20 20 20 20 endency,..#
3250: 20 20 69 2e 65 2e 20 77 69 74 68 20 73 74 61 72 i.e. with star
3260: 74 20 3e 20 65 6e 64 2e 20 57 65 20 6d 61 79 20 t > end. We may
3270: 68 61 76 65 20 74 6f 20 73 77 61 70 20 74 68 65 have to swap the
3280: 20 69 6e 64 69 63 65 73 0a 09 23 20 20 20 20 20 indices..#
3290: 20 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 to ensure that
32a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c the following l
32b0: 6f 6f 70 20 72 75 6e 73 20 63 6f 72 72 65 63 74 oop runs correct
32c0: 6c 79 2e 0a 09 23 0a 09 23 20 4e 6f 74 65 20 32 ly...#..# Note 2
32d0: 3a 20 73 74 61 72 74 20 3d 3d 20 65 6e 64 20 69 : start == end i
32e0: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 s not possible.
32f0: 49 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 09 It indicates a..
3300: 23 20 20 20 20 20 20 20 20 20 73 65 6c 66 2d 64 # self-d
3310: 65 70 65 6e 64 65 6e 63 79 20 64 75 65 20 74 6f ependency due to
3320: 20 74 68 65 20 75 6e 69 71 75 65 6e 65 73 73 20 the uniqueness
3330: 6f 66 20 70 6f 73 69 74 69 6f 6e 73 2c 0a 09 23 of positions,..#
3340: 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 61 and tha
3350: 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 77 t is something w
3360: 65 20 68 61 76 65 20 72 75 6c 65 64 20 6f 75 74 e have ruled out
3370: 20 61 6c 72 65 61 64 79 2c 20 73 65 65 0a 09 23 already, see..#
3380: 20 20 20 20 20 20 20 20 20 50 75 6c 6c 49 6e 74 PullInt
3390: 65 72 6e 61 6c 53 75 63 63 65 73 73 6f 72 52 65 ernalSuccessorRe
33a0: 76 69 73 69 6f 6e 73 2e 0a 0a 09 66 6f 72 65 61 visions....forea
33b0: 63 68 20 7b 72 69 64 20 63 68 69 6c 64 7d 20 5b ch {rid child} [
33c0: 61 72 72 61 79 20 67 65 74 20 64 65 70 65 6e 64 array get depend
33d0: 65 6e 63 69 65 73 5d 20 7b 0a 09 20 20 20 20 73 encies] {.. s
33e0: 65 74 20 64 6b 65 79 20 20 20 20 5b 6c 69 73 74 et dkey [list
33f0: 20 24 72 69 64 20 24 63 68 69 6c 64 5d 0a 09 20 $rid $child]..
3400: 20 20 20 73 65 74 20 73 74 61 72 74 20 20 20 24 set start $
3410: 70 6f 73 28 24 72 69 64 29 0a 09 20 20 20 20 73 pos($rid).. s
3420: 65 74 20 65 6e 64 20 20 20 20 20 24 70 6f 73 28 et end $pos(
3430: 24 63 68 69 6c 64 29 0a 09 20 20 20 20 73 65 74 $child).. set
3440: 20 63 72 6f 73 73 65 73 20 7b 7d 0a 0a 09 20 20 crosses {}...
3450: 20 20 69 66 20 7b 24 73 74 61 72 74 20 3e 20 24 if {$start > $
3460: 65 6e 64 7d 20 7b 0a 09 09 77 68 69 6c 65 20 7b end} {...while {
3470: 24 65 6e 64 20 3c 20 24 73 74 61 72 74 7d 20 7b $end < $start} {
3480: 0a 09 09 20 20 20 20 6c 61 70 70 65 6e 64 20 63 ... lappend c
3490: 72 6f 73 73 65 73 20 24 65 6e 64 0a 09 09 20 20 rosses $end...
34a0: 20 20 69 6e 63 72 20 63 72 6f 73 73 28 24 65 6e incr cross($en
34b0: 64 29 0a 09 09 20 20 20 20 69 6e 63 72 20 65 6e d)... incr en
34c0: 64 0a 09 09 7d 0a 09 20 20 20 20 7d 20 65 6c 73 d...}.. } els
34d0: 65 20 7b 0a 09 09 77 68 69 6c 65 20 7b 24 73 74 e {...while {$st
34e0: 61 72 74 20 3c 20 24 65 6e 64 7d 20 7b 0a 09 09 art < $end} {...
34f0: 20 20 20 20 6c 61 70 70 65 6e 64 20 63 72 6f 73 lappend cros
3500: 73 65 73 20 24 73 74 61 72 74 0a 09 09 20 20 20 ses $start...
3510: 20 69 6e 63 72 20 63 72 6f 73 73 28 24 73 74 61 incr cross($sta
3520: 72 74 29 0a 09 09 20 20 20 20 69 6e 63 72 20 73 rt)... incr s
3530: 74 61 72 74 0a 09 09 7d 0a 09 20 20 20 20 7d 0a tart...}.. }.
3540: 09 20 20 20 20 73 65 74 20 64 65 70 63 28 24 64 . set depc($d
3550: 6b 65 79 29 20 24 63 72 6f 73 73 65 73 0a 09 7d key) $crosses..}
3560: 0a 0a 09 49 6e 69 74 69 61 6c 69 7a 65 44 65 6c ...InitializeDel
3570: 74 61 73 20 24 72 65 76 69 73 69 6f 6e 73 0a 09 tas $revisions..
3580: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 return. }..
3590: 20 20 70 72 6f 63 20 49 6e 69 74 69 61 6c 69 7a proc Initializ
35a0: 65 44 65 6c 74 61 73 20 7b 72 65 76 69 73 69 6f eDeltas {revisio
35b0: 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 64 ns} {..upvar 1 d
35c0: 65 6c 74 61 20 64 65 6c 74 61 0a 0a 09 23 20 50 elta delta...# P
35d0: 75 6c 6c 20 74 68 65 20 74 69 6d 65 73 74 61 6d ull the timestam
35e0: 70 73 20 66 6f 72 20 61 6c 6c 20 72 65 76 69 73 ps for all revis
35f0: 69 6f 6e 73 20 69 6e 20 74 68 65 20 63 68 61 6e ions in the chan
3600: 67 65 73 65 74 73 20 61 6e 64 0a 09 23 20 63 6f gesets and..# co
3610: 6d 70 75 74 65 20 74 68 65 69 72 20 64 65 6c 74 mpute their delt
3620: 61 73 20 66 6f 72 20 75 73 65 20 62 79 20 74 68 as for use by th
3630: 65 20 62 72 65 61 6b 20 66 69 6e 64 65 72 2e 0a e break finder..
3640: 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 6c 74 ..array set delt
3650: 61 20 7b 7d 0a 09 61 72 72 61 79 20 73 65 74 20 a {}..array set
3660: 73 74 61 6d 70 20 7b 7d 0a 0a 09 73 65 74 20 74 stamp {}...set t
3670: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 heset ('[join $r
3680: 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 evisions {','}]'
3690: 29 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 )..foreach {rid
36a0: 74 69 6d 65 7d 20 5b 73 74 61 74 65 20 72 75 6e time} [state run
36b0: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 ".. SELECT R
36c0: 2e 72 69 64 2c 20 52 2e 64 61 74 65 0a 09 20 20 .rid, R.date..
36d0: 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 FROM revision
36e0: 52 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e 72 R.. WHERE R.r
36f0: 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 22 id IN $theset.."
3700: 5d 20 7b 0a 09 20 20 20 20 73 65 74 20 73 74 61 ] {.. set sta
3710: 6d 70 28 24 72 69 64 29 20 24 74 69 6d 65 0a 09 mp($rid) $time..
3720: 7d 0a 0a 09 73 65 74 20 6e 20 30 0a 09 66 6f 72 }...set n 0..for
3730: 65 61 63 68 20 72 69 64 20 5b 6c 72 61 6e 67 65 each rid [lrange
3740: 20 24 72 65 76 69 73 69 6f 6e 73 20 30 20 65 6e $revisions 0 en
3750: 64 2d 31 5d 20 72 6e 65 78 74 20 5b 6c 72 61 6e d-1] rnext [lran
3760: 67 65 20 24 72 65 76 69 73 69 6f 6e 73 20 31 20 ge $revisions 1
3770: 65 6e 64 5d 20 7b 0a 09 20 20 20 20 73 65 74 20 end] {.. set
3780: 64 65 6c 74 61 28 24 6e 29 20 5b 65 78 70 72 20 delta($n) [expr
3790: 7b 24 73 74 61 6d 70 28 24 72 6e 65 78 74 29 20 {$stamp($rnext)
37a0: 2d 20 24 73 74 61 6d 70 28 24 72 69 64 29 7d 5d - $stamp($rid)}]
37b0: 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d 0a .. incr n..}.
37c0: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 .return. }..
37d0: 20 20 20 70 72 6f 63 20 46 69 6e 64 42 65 73 74 proc FindBest
37e0: 42 72 65 61 6b 20 7b 72 61 6e 67 65 7d 20 7b 0a Break {range} {.
37f0: 09 75 70 76 61 72 20 31 20 63 72 6f 73 73 20 63 .upvar 1 cross c
3800: 72 6f 73 73 20 64 65 6c 74 61 20 64 65 6c 74 61 ross delta delta
3810: 0a 0a 09 23 20 44 65 74 65 72 6d 69 6e 65 20 74 ...# Determine t
3820: 68 65 20 62 65 73 74 20 62 72 65 61 6b 20 6c 6f he best break lo
3830: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 67 69 cation in the gi
3840: 76 65 6e 20 72 61 6e 67 65 20 6f 66 0a 09 23 20 ven range of..#
3850: 70 6f 73 69 74 69 6f 6e 73 2e 20 46 69 72 73 74 positions. First
3860: 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 68 65 we look for the
3870: 20 6c 6f 63 61 74 69 6f 6e 73 20 77 69 74 68 20 locations with
3880: 74 68 65 20 6d 61 78 69 6d 61 6c 0a 09 23 20 6e the maximal..# n
3890: 75 6d 62 65 72 20 6f 66 20 63 72 6f 73 73 69 6e umber of crossin
38a0: 67 73 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 gs. If there are
38b0: 20 73 65 76 65 72 61 6c 20 77 65 20 6c 6f 6f 6b several we look
38c0: 20 66 6f 72 20 74 68 65 0a 09 23 20 73 68 6f 72 for the..# shor
38d0: 74 65 73 74 20 74 69 6d 65 20 69 6e 74 65 72 76 test time interv
38e0: 61 6c 20 61 6d 6f 6e 67 20 74 68 65 6d 2e 20 49 al among them. I
38f0: 66 20 77 65 20 73 74 69 6c 6c 20 68 61 76 65 20 f we still have
3900: 6d 75 6c 74 69 70 6c 65 0a 09 23 20 70 6f 73 73 multiple..# poss
3910: 69 62 69 6c 69 74 69 65 73 20 61 66 74 65 72 20 ibilities after
3920: 74 68 61 74 20 77 65 20 73 65 6c 65 63 74 20 74 that we select t
3930: 68 65 20 65 61 72 6c 69 65 73 74 20 6c 6f 63 61 he earliest loca
3940: 74 69 6f 6e 0a 09 23 20 61 6d 6f 6e 67 20 74 68 tion..# among th
3950: 65 73 65 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 49 ese....# Note: I
3960: 66 20 74 68 65 20 6d 61 78 69 6d 61 6c 20 6e 75 f the maximal nu
3970: 6d 62 65 72 20 6f 66 20 63 72 6f 73 73 69 6e 67 mber of crossing
3980: 73 20 69 73 20 30 20 74 68 65 6e 20 74 68 65 20 s is 0 then the
3990: 72 61 6e 67 65 0a 09 23 20 20 20 20 20 20 20 68 range..# h
39a0: 61 73 20 6e 6f 20 69 6e 74 65 72 6e 61 6c 20 64 as no internal d
39b0: 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 6e 64 ependencies, and
39c0: 20 6e 6f 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 no break locati
39d0: 6f 6e 20 61 74 0a 09 23 20 20 20 20 20 20 20 61 on at..# a
39e0: 6c 6c 2e 20 54 68 69 73 20 70 6f 73 73 69 62 69 ll. This possibi
39f0: 6c 69 74 79 20 69 73 20 73 69 67 6e 61 6c 65 64 lity is signaled
3a00: 20 76 69 61 20 72 65 73 75 6c 74 20 2d 31 2e 0a via result -1..
3a10: 0a 09 23 20 4e 6f 74 65 3a 20 41 20 72 61 6e 67 ..# Note: A rang
3a20: 65 20 6f 66 20 6c 65 6e 67 74 68 20 31 20 6f 72 e of length 1 or
3a30: 20 6c 65 73 73 20 63 61 6e 6e 6f 74 20 68 61 76 less cannot hav
3a40: 65 20 69 6e 74 65 72 6e 61 6c 0a 09 23 20 20 20 e internal..#
3a50: 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65 73 dependencies
3a60: 2c 20 61 73 20 74 68 61 74 20 6e 65 65 64 73 20 , as that needs
3a70: 61 74 20 6c 65 61 73 74 20 74 77 6f 20 72 65 76 at least two rev
3a80: 69 73 69 6f 6e 73 20 69 6e 0a 09 23 20 20 20 20 isions in..#
3a90: 20 20 20 74 68 65 20 72 61 6e 67 65 2e 0a 0a 09 the range....
3aa0: 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 72 61 if {[llength $ra
3ab0: 6e 67 65 5d 20 3c 20 32 7d 20 7b 20 72 65 74 75 nge] < 2} { retu
3ac0: 72 6e 20 2d 31 20 7d 0a 0a 09 73 65 74 20 6d 61 rn -1 }...set ma
3ad0: 78 20 2d 31 0a 09 73 65 74 20 62 65 73 74 20 7b x -1..set best {
3ae0: 7d 0a 0a 09 66 6f 72 65 61 63 68 20 6c 6f 63 61 }...foreach loca
3af0: 74 69 6f 6e 20 24 72 61 6e 67 65 20 7b 0a 09 20 tion $range {..
3b00: 20 20 20 73 65 74 20 63 72 6f 73 73 69 6e 67 73 set crossings
3b10: 20 24 63 72 6f 73 73 28 24 6c 6f 63 61 74 69 6f $cross($locatio
3b20: 6e 29 0a 09 20 20 20 20 69 66 20 7b 24 63 72 6f n).. if {$cro
3b30: 73 73 69 6e 67 73 20 3e 20 24 6d 61 78 7d 20 7b ssings > $max} {
3b40: 0a 09 09 73 65 74 20 6d 61 78 20 20 24 63 72 6f ...set max $cro
3b50: 73 73 69 6e 67 73 0a 09 09 73 65 74 20 62 65 73 ssings...set bes
3b60: 74 20 5b 6c 69 73 74 20 24 6c 6f 63 61 74 69 6f t [list $locatio
3b70: 6e 5d 0a 09 09 63 6f 6e 74 69 6e 75 65 0a 09 20 n]...continue..
3b80: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 72 } elseif {$cr
3b90: 6f 73 73 69 6e 67 73 20 3d 3d 20 24 6d 61 78 7d ossings == $max}
3ba0: 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 62 65 73 {...lappend bes
3bb0: 74 20 24 6c 6f 63 61 74 69 6f 6e 0a 09 20 20 20 t $location..
3bc0: 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b 24 6d 61 78 }..}...if {$max
3bd0: 20 3d 3d 20 30 7d 20 20 20 20 20 20 20 20 20 20 == 0}
3be0: 20 20 7b 20 72 65 74 75 72 6e 20 2d 31 20 7d 0a { return -1 }.
3bf0: 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 62 .if {[llength $b
3c00: 65 73 74 5d 20 3d 3d 20 31 7d 20 7b 20 72 65 74 est] == 1} { ret
3c10: 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 62 65 73 urn [lindex $bes
3c20: 74 20 30 5d 20 7d 0a 0a 09 73 65 74 20 6c 6f 63 t 0] }...set loc
3c30: 61 74 69 6f 6e 73 20 24 62 65 73 74 0a 09 73 65 ations $best..se
3c40: 74 20 62 65 73 74 20 7b 7d 0a 09 73 65 74 20 6d t best {}..set m
3c50: 69 6e 20 2d 31 0a 0a 09 66 6f 72 65 61 63 68 20 in -1...foreach
3c60: 6c 6f 63 61 74 69 6f 6e 20 24 6c 6f 63 61 74 69 location $locati
3c70: 6f 6e 73 20 7b 0a 09 20 20 20 20 73 65 74 20 69 ons {.. set i
3c80: 6e 74 65 72 76 61 6c 20 24 64 65 6c 74 61 28 24 nterval $delta($
3c90: 6c 6f 63 61 74 69 6f 6e 29 0a 09 20 20 20 20 69 location).. i
3ca0: 66 20 7b 28 24 6d 69 6e 20 3c 20 30 29 20 7c 7c f {($min < 0) ||
3cb0: 20 28 24 69 6e 74 65 72 76 61 6c 20 3c 20 24 6d ($interval < $m
3cc0: 69 6e 29 7d 20 7b 0a 09 09 73 65 74 20 6d 69 6e in)} {...set min
3cd0: 20 20 24 69 6e 74 65 72 76 61 6c 0a 09 09 73 65 $interval...se
3ce0: 74 20 62 65 73 74 20 5b 6c 69 73 74 20 24 6c 6f t best [list $lo
3cf0: 63 61 74 69 6f 6e 5d 0a 09 20 20 20 20 7d 20 65 cation].. } e
3d00: 6c 73 65 69 66 20 7b 24 69 6e 74 65 72 76 61 6c lseif {$interval
3d10: 20 3d 3d 20 24 6d 69 6e 7d 20 7b 0a 09 09 6c 61 == $min} {...la
3d20: 70 70 65 6e 64 20 62 65 73 74 20 24 6c 6f 63 61 ppend best $loca
3d30: 74 69 6f 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a tion.. }..}..
3d40: 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 62 .if {[llength $b
3d50: 65 73 74 5d 20 3d 3d 20 31 7d 20 7b 20 72 65 74 est] == 1} { ret
3d60: 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 62 65 73 urn [lindex $bes
3d70: 74 20 30 5d 20 7d 0a 0a 09 72 65 74 75 72 6e 20 t 0] }...return
3d80: 5b 6c 69 6e 64 65 78 20 5b 6c 73 6f 72 74 20 2d [lindex [lsort -
3d90: 69 6e 74 65 67 65 72 20 2d 69 6e 63 72 65 61 73 integer -increas
3da0: 69 6e 67 20 24 62 65 73 74 5d 20 30 5d 0a 20 20 ing $best] 0].
3db0: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 43 75 }.. proc Cu
3dc0: 74 41 74 20 7b 6c 6f 63 61 74 69 6f 6e 7d 20 7b tAt {location} {
3dd0: 0a 09 75 70 76 61 72 20 31 20 63 72 6f 73 73 20 ..upvar 1 cross
3de0: 63 72 6f 73 73 20 64 65 70 63 20 64 65 70 63 0a cross depc depc.
3df0: 0a 09 23 20 49 74 20 77 61 73 20 64 65 63 69 64 ..# It was decid
3e00: 65 64 20 74 6f 20 73 70 6c 69 74 20 74 68 65 20 ed to split the
3e10: 63 68 61 6e 67 65 73 65 74 20 61 74 20 74 68 65 changeset at the
3e20: 20 67 69 76 65 6e 0a 09 23 20 6c 6f 63 61 74 69 given..# locati
3e30: 6f 6e 2e 20 54 68 69 73 20 63 75 74 73 20 61 20 on. This cuts a
3e40: 6e 75 6d 62 65 72 20 6f 66 20 64 65 70 65 6e 64 number of depend
3e50: 65 6e 63 69 65 73 2e 20 48 65 72 65 20 77 65 20 encies. Here we
3e60: 75 70 64 61 74 65 0a 09 23 20 74 68 65 20 63 72 update..# the cr
3e70: 6f 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 oss information
3e80: 73 6f 20 74 68 61 74 20 74 68 65 20 62 72 65 61 so that the brea
3e90: 6b 20 66 69 6e 64 65 72 20 68 61 73 20 61 63 63 k finder has acc
3ea0: 75 72 61 74 65 0a 09 23 20 64 61 74 61 20 77 68 urate..# data wh
3eb0: 65 6e 20 77 65 20 6c 6f 6f 6b 20 61 74 20 74 68 en we look at th
3ec0: 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 61 67 e generated frag
3ed0: 6d 65 6e 74 73 2e 0a 0a 09 73 65 74 20 73 69 78 ments....set six
3ee0: 20 5b 6c 6f 67 20 76 69 73 69 62 6c 65 3f 20 36 [log visible? 6
3ef0: 5d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 64 65 70 ]...foreach {dep
3f00: 20 72 61 6e 67 65 7d 20 5b 61 72 72 61 79 20 67 range} [array g
3f10: 65 74 20 64 65 70 63 5d 20 7b 0a 09 20 20 20 20 et depc] {..
3f20: 23 20 43 68 65 63 6b 20 61 6c 6c 20 64 65 70 65 # Check all depe
3f30: 6e 64 65 6e 63 69 65 73 20 73 74 69 6c 6c 20 6b ndencies still k
3f40: 6e 6f 77 6e 2c 20 74 61 6b 65 20 74 68 65 69 72 nown, take their
3f50: 20 72 61 6e 67 65 20 61 6e 64 0a 09 20 20 20 20 range and..
3f60: 23 20 73 65 65 20 69 66 20 74 68 65 20 62 72 65 # see if the bre
3f70: 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 66 61 6c 6c ak location fall
3f80: 73 20 77 69 74 68 69 6e 2e 0a 0a 09 20 20 20 20 s within....
3f90: 42 6f 72 64 65 72 20 24 72 61 6e 67 65 20 73 20 Border $range s
3fa0: 65 0a 09 20 20 20 20 69 66 20 7b 24 6c 6f 63 61 e.. if {$loca
3fb0: 74 69 6f 6e 20 3c 20 24 73 7d 20 63 6f 6e 74 69 tion < $s} conti
3fc0: 6e 75 65 20 3b 20 23 20 62 72 65 61 6b 20 62 65 nue ; # break be
3fd0: 66 6f 72 65 20 72 61 6e 67 65 2c 20 69 67 6e 6f fore range, igno
3fe0: 72 65 0a 09 20 20 20 20 69 66 20 7b 24 6c 6f 63 re.. if {$loc
3ff0: 61 74 69 6f 6e 20 3e 20 24 65 7d 20 63 6f 6e 74 ation > $e} cont
4000: 69 6e 75 65 20 3b 20 23 20 62 72 65 61 6b 20 61 inue ; # break a
4010: 66 74 65 72 20 72 61 6e 67 65 2c 20 69 67 6e 6f fter range, igno
4020: 72 65 2e 0a 0a 09 20 20 20 20 23 20 54 68 69 73 re.... # This
4030: 20 64 65 70 65 6e 64 65 6e 63 79 20 63 72 6f 73 dependency cros
4040: 73 65 73 20 74 68 65 20 62 72 65 61 6b 20 6c 6f ses the break lo
4050: 63 61 74 69 6f 6e 2e 20 57 65 20 72 65 6d 6f 76 cation. We remov
4060: 65 20 69 74 0a 09 20 20 20 20 23 20 66 72 6f 6d e it.. # from
4070: 20 74 68 65 20 63 72 6f 73 73 69 6e 67 73 20 63 the crossings c
4080: 6f 75 6e 74 65 72 73 2c 20 61 6e 64 20 74 68 65 ounters, and the
4090: 6e 20 61 6c 73 6f 20 66 72 6f 6d 20 74 68 65 20 n also from the
40a0: 73 65 74 0a 09 20 20 20 20 23 20 6f 66 20 6b 6e set.. # of kn
40b0: 6f 77 6e 20 64 65 70 65 6e 64 65 6e 63 69 65 73 own dependencies
40c0: 2c 20 61 73 20 77 65 20 61 72 65 20 64 6f 6e 65 , as we are done
40d0: 20 77 69 74 68 20 69 74 2e 0a 0a 09 20 20 20 20 with it....
40e0: 66 6f 72 65 61 63 68 20 6c 6f 63 20 24 64 65 70 foreach loc $dep
40f0: 63 28 24 64 65 70 29 20 7b 20 69 6e 63 72 20 63 c($dep) { incr c
4100: 72 6f 73 73 28 24 6c 6f 63 29 20 2d 31 20 7d 0a ross($loc) -1 }.
4110: 09 20 20 20 20 75 6e 73 65 74 20 64 65 70 63 28 . unset depc(
4120: 24 64 65 70 29 0a 0a 09 20 20 20 20 69 66 20 7b $dep)... if {
4130: 21 24 73 69 78 7d 20 63 6f 6e 74 69 6e 75 65 0a !$six} continue.
4140: 0a 09 20 20 20 20 73 74 72 75 63 74 3a 3a 6c 69 .. struct::li
4150: 73 74 20 61 73 73 69 67 6e 20 24 64 65 70 20 70 st assign $dep p
4160: 61 72 65 6e 74 20 63 68 69 6c 64 0a 09 20 20 20 arent child..
4170: 20 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 log write 6 cse
4180: 74 73 20 22 42 72 6f 6b 65 20 64 65 70 65 6e 64 ts "Broke depend
4190: 65 6e 63 79 20 5b 50 44 20 24 70 61 72 65 6e 74 ency [PD $parent
41a0: 5d 20 2d 2d 3e 20 5b 50 44 20 24 63 68 69 6c 64 ] --> [PD $child
41b0: 5d 22 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 0a 20 ]"..}...return.
41c0: 20 20 20 7d 0a 0a 20 20 20 20 23 20 50 72 69 6e }.. # Prin
41d0: 74 20 69 64 65 6e 74 69 66 79 69 6e 67 20 64 61 t identifying da
41e0: 74 61 20 66 6f 72 20 61 20 72 65 76 69 73 69 6f ta for a revisio
41f0: 6e 20 28 70 72 6f 6a 65 63 74 2c 20 66 69 6c 65 n (project, file
4200: 2c 20 64 6f 74 74 65 64 20 72 65 76 0a 20 20 20 , dotted rev.
4210: 20 23 20 6e 75 6d 62 65 72 29 2c 20 66 6f 72 20 # number), for
4220: 68 69 67 68 20 76 65 72 62 6f 73 69 74 79 20 6c high verbosity l
4230: 6f 67 20 6f 75 74 70 75 74 2e 0a 0a 20 20 20 20 og output...
4240: 70 72 6f 63 20 50 44 20 7b 69 64 7d 20 7b 0a 09 proc PD {id} {..
4250: 66 6f 72 65 61 63 68 20 7b 70 20 66 20 72 7d 20 foreach {p f r}
4260: 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 53 [state run {...S
4270: 45 4c 45 43 54 20 50 2e 6e 61 6d 65 20 2c 20 46 ELECT P.name , F
4280: 2e 6e 61 6d 65 2c 20 52 2e 72 65 76 0a 09 09 46 .name, R.rev...F
4290: 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 ROM revision R,
42a0: 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65 63 74 20 file F, project
42b0: 50 0a 09 09 57 48 45 52 45 20 52 2e 72 69 64 20 P...WHERE R.rid
42c0: 3d 20 24 69 64 0a 09 09 41 4e 44 20 20 20 52 2e = $id...AND R.
42d0: 66 69 64 20 3d 20 46 2e 66 69 64 0a 09 09 41 4e fid = F.fid...AN
42e0: 44 20 20 20 46 2e 70 69 64 20 3d 20 50 2e 70 69 D F.pid = P.pi
42f0: 64 0a 09 7d 5d 20 62 72 65 61 6b 0a 09 72 65 74 d..}] break..ret
4300: 75 72 6e 20 22 27 24 70 20 3a 20 24 66 2f 24 72 urn "'$p : $f/$r
4310: 27 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 '". }.. #
4320: 50 72 69 6e 74 69 6e 67 20 6f 6e 65 20 6f 72 20 Printing one or
4330: 6d 6f 72 65 20 72 61 6e 67 65 73 2c 20 66 6f 72 more ranges, for
4340: 6d 61 74 74 65 64 2c 20 61 6e 64 20 6f 6e 6c 79 matted, and only
4350: 20 74 68 65 69 72 20 62 6f 72 64 65 72 20 74 6f their border to
4360: 0a 20 20 20 20 23 20 6b 65 65 70 20 74 68 65 20 . # keep the
4370: 73 74 72 69 6e 67 73 20 73 68 6f 72 74 2e 0a 0a strings short...
4380: 20 20 20 20 70 72 6f 63 20 50 52 73 20 7b 72 61 proc PRs {ra
4390: 6e 67 65 73 7d 20 7b 0a 09 72 65 74 75 72 6e 20 nges} {..return
43a0: 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61 [struct::list ma
43b0: 70 20 24 72 61 6e 67 65 73 20 5b 6d 79 70 72 6f p $ranges [mypro
43c0: 63 20 50 52 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 c PR]]. }..
43d0: 20 20 70 72 6f 63 20 50 52 20 7b 72 61 6e 67 65 proc PR {range
43e0: 7d 20 7b 0a 09 42 6f 72 64 65 72 20 24 72 61 6e } {..Border $ran
43f0: 67 65 20 73 20 65 0a 09 72 65 74 75 72 6e 20 3c ge s e..return <
4400: 24 7b 73 7d 2e 2e 2e 24 7b 65 7d 3e 0a 20 20 20 ${s}...${e}>.
4410: 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 42 6f 72 }.. proc Bor
4420: 64 65 72 20 7b 72 61 6e 67 65 20 73 76 20 65 76 der {range sv ev
4430: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 73 76 } {..upvar 1 $sv
4440: 20 73 20 24 65 76 20 65 0a 09 73 65 74 20 73 20 s $ev e..set s
4450: 5b 6c 69 6e 64 65 78 20 24 72 61 6e 67 65 20 30 [lindex $range 0
4460: 5d 0a 09 73 65 74 20 65 20 5b 6c 69 6e 64 65 78 ]..set e [lindex
4470: 20 24 72 61 6e 67 65 20 65 6e 64 5d 0a 09 72 65 $range end]..re
4480: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 turn. }..
4490: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 # # ## ### #####
44a0: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 ######## ######
44b0: 23 23 23 23 23 23 23 0a 0a 20 20 20 20 74 79 70 #######.. typ
44c0: 65 76 61 72 69 61 62 6c 65 20 6d 79 63 68 61 6e evariable mychan
44d0: 67 65 73 65 74 73 20 20 20 20 7b 7d 20 3b 20 23 gesets {} ; #
44e0: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 6b 6e 6f List of all kno
44f0: 77 6e 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 20 wn changesets..
4500: 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 typevariable
4510: 6d 79 72 65 76 6d 61 70 20 2d 61 72 72 61 79 20 myrevmap -array
4520: 7b 7d 20 3b 20 23 20 4d 61 70 20 66 72 6f 6d 20 {} ; # Map from
4530: 72 65 76 69 73 69 6f 6e 73 20 74 6f 20 74 68 65 revisions to the
4540: 69 72 20 63 68 61 6e 67 65 73 65 74 2e 0a 20 20 ir changeset..
4550: 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d typevariable m
4560: 79 69 64 6d 61 70 20 20 2d 61 72 72 61 79 20 7b yidmap -array {
4570: 7d 20 3b 20 23 20 4d 61 70 20 66 72 6f 6d 20 63 } ; # Map from c
4580: 68 61 6e 67 65 73 65 74 20 69 64 20 74 6f 20 63 hangeset id to c
4590: 68 61 6e 67 65 73 65 74 2e 0a 20 20 20 20 74 79 hangeset.. ty
45a0: 70 65 76 61 72 69 61 62 6c 65 20 6d 79 62 72 61 pevariable mybra
45b0: 6e 63 68 63 6f 64 65 20 20 20 20 7b 7d 20 3b 20 nchcode {} ;
45c0: 23 20 4c 6f 63 61 6c 20 63 6f 70 79 20 6f 66 20 # Local copy of
45d0: 70 72 6f 6a 65 63 74 3a 3a 73 79 6d 2f 6d 79 62 project::sym/myb
45e0: 72 61 6e 63 68 2e 0a 0a 20 20 20 20 74 79 70 65 ranch... type
45f0: 6d 65 74 68 6f 64 20 61 6c 6c 20 7b 7d 20 20 20 method all {}
4600: 7b 20 72 65 74 75 72 6e 20 24 6d 79 63 68 61 6e { return $mychan
4610: 67 65 73 65 74 73 20 7d 0a 20 20 20 20 74 79 70 gesets }. typ
4620: 65 6d 65 74 68 6f 64 20 6f 66 20 20 7b 69 64 7d emethod of {id}
4630: 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 64 6d { return $myidm
4640: 61 70 28 24 69 64 29 20 7d 0a 0a 20 20 20 20 74 ap($id) }.. t
4650: 79 70 65 63 6f 6e 73 74 72 75 63 74 6f 72 20 7b ypeconstructor {
4660: 0a 09 73 65 74 20 6d 79 62 72 61 6e 63 68 63 6f ..set mybranchco
4670: 64 65 20 5b 70 72 6f 6a 65 63 74 3a 3a 73 79 6d de [project::sym
4680: 20 62 72 61 6e 63 68 5d 0a 09 72 65 74 75 72 6e branch]..return
4690: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 . }.. # #
46a0: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 ## ### ##### ###
46b0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 ##### ##########
46c0: 23 23 23 0a 20 20 20 20 23 23 20 43 6f 6e 66 69 ###. ## Confi
46d0: 67 75 72 61 74 69 6f 6e 0a 0a 20 20 20 20 70 72 guration.. pr
46e0: 61 67 6d 61 20 2d 68 61 73 74 79 70 65 69 6e 66 agma -hastypeinf
46f0: 6f 20 20 20 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 o no ; # no
4700: 74 79 70 65 20 69 6e 74 72 6f 73 70 65 63 74 69 type introspecti
4710: 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68 on. pragma -h
4720: 61 73 69 6e 66 6f 20 20 20 20 20 20 20 20 6e 6f asinfo no
4730: 20 20 3b 20 23 20 6e 6f 20 6f 62 6a 65 63 74 20 ; # no object
4740: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20 20 introspection.
4750: 20 20 70 72 61 67 6d 61 20 2d 73 69 6d 70 6c 65 pragma -simple
4760: 64 69 73 70 61 74 63 68 20 79 65 73 20 3b 20 23 dispatch yes ; #
4770: 20 73 69 6d 70 6c 65 20 66 61 73 74 20 64 69 73 simple fast dis
4780: 70 61 74 63 68 0a 0a 20 20 20 20 23 20 23 20 23 patch.. # # #
4790: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 # ### ##### ####
47a0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 #### ###########
47b0: 23 23 0a 7d 0a 0a 6e 61 6d 65 73 70 61 63 65 20 ##.}..namespace
47c0: 65 76 61 6c 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 eval ::vc::fossi
47d0: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a l::import::cvs::
47e0: 70 72 6f 6a 65 63 74 20 7b 0a 20 20 20 20 6e 61 project {. na
47f0: 6d 65 73 70 61 63 65 20 65 78 70 6f 72 74 20 72 mespace export r
4800: 65 76 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65 ev. namespace
4810: 20 65 76 61 6c 20 72 65 76 20 7b 0a 09 6e 61 6d eval rev {..nam
4820: 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a espace import ::
4830: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f vc::fossil::impo
4840: 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09 rt::cvs::state..
4850: 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 70 namespace eval p
4860: 72 6f 6a 65 63 74 20 7b 0a 09 20 20 20 20 6e 61 roject {.. na
4870: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a mespace import :
4880: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 :vc::fossil::imp
4890: 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 ort::cvs::projec
48a0: 74 3a 3a 73 79 6d 0a 09 7d 0a 09 6e 61 6d 65 73 t::sym..}..names
48b0: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 pace import ::vc
48c0: 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69 73 63 3a 3a 2a ::tools::misc::*
48d0: 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f ..namespace impo
48e0: 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a rt ::vc::tools::
48f0: 74 72 6f 75 62 6c 65 0a 09 6e 61 6d 65 73 70 61 trouble..namespa
4900: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a ce import ::vc::
4910: 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 6c 6f 67 20 tools::log..log
4920: 72 65 67 69 73 74 65 72 20 63 73 65 74 73 0a 20 register csets.
4930: 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 }.}..# # ## #
4940: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 ## ##### #######
4950: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 # #############
4960: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
4970: 23 23 23 23 23 0a 23 23 20 52 65 61 64 79 0a 0a #####.## Ready..
4980: 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20 package provide
4990: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f vc::fossil::impo
49a0: 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 rt::cvs::project
49b0: 3a 3a 72 65 76 20 31 2e 30 0a 72 65 74 75 72 6e ::rev 1.0.return
49c0: 0a .