0000: 23 23 20 2d 2a 2d 20 74 63 6c 20 2d 2a 2d 0a 23 ## -*- tcl -*-.#
0010: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 # ## ### #####
0020: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
0030: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 ###### #########
0040: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 ############.##
0050: 43 6f 70 79 72 69 67 68 74 20 28 63 29 20 32 30 Copyright (c) 20
0060: 30 37 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69 07 Andreas Kupri
0070: 65 73 2e 0a 23 0a 23 20 54 68 69 73 20 73 6f 66 es..#.# This sof
0080: 74 77 61 72 65 20 69 73 20 6c 69 63 65 6e 73 65 tware is license
0090: 64 20 61 73 20 64 65 73 63 72 69 62 65 64 20 69 d as described i
00a0: 6e 20 74 68 65 20 66 69 6c 65 20 4c 49 43 45 4e n the file LICEN
00b0: 53 45 2c 20 77 68 69 63 68 0a 23 20 79 6f 75 20 SE, which.# you
00c0: 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65 63 65 should have rece
00d0: 69 76 65 64 20 61 73 20 70 61 72 74 20 6f 66 20 ived as part of
00e0: 74 68 69 73 20 64 69 73 74 72 69 62 75 74 69 6f this distributio
00f0: 6e 2e 0a 23 0a 23 20 54 68 69 73 20 73 6f 66 74 n..#.# This soft
0100: 77 61 72 65 20 63 6f 6e 73 69 73 74 73 20 6f 66 ware consists of
0110: 20 76 6f 6c 75 6e 74 61 72 79 20 63 6f 6e 74 72 voluntary contr
0120: 69 62 75 74 69 6f 6e 73 20 6d 61 64 65 20 62 79 ibutions made by
0130: 20 6d 61 6e 79 0a 23 20 69 6e 64 69 76 69 64 75 many.# individu
0140: 61 6c 73 2e 20 20 46 6f 72 20 65 78 61 63 74 20 als. For exact
0150: 63 6f 6e 74 72 69 62 75 74 69 6f 6e 20 68 69 73 contribution his
0160: 74 6f 72 79 2c 20 73 65 65 20 74 68 65 20 72 65 tory, see the re
0170: 76 69 73 69 6f 6e 0a 23 20 68 69 73 74 6f 72 79 vision.# history
0180: 20 61 6e 64 20 6c 6f 67 73 2c 20 61 76 61 69 6c and logs, avail
0190: 61 62 6c 65 20 61 74 20 68 74 74 70 3a 2f 2f 66 able at http://f
01a0: 6f 73 73 69 6c 2d 73 63 6d 2e 68 77 61 63 69 2e ossil-scm.hwaci.
01b0: 63 6f 6d 2f 66 6f 73 73 69 6c 0a 23 20 23 20 23 com/fossil.# # #
01c0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 # ### ##### ####
01d0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 #### ###########
01e0: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 ## #############
01f0: 23 23 23 23 23 23 23 23 0a 0a 23 23 20 52 65 76 ########..## Rev
0200: 69 73 69 6f 6e 73 20 70 65 72 20 70 72 6f 6a 65 isions per proje
0210: 63 74 2c 20 61 6b 61 20 43 68 61 6e 67 65 73 65 ct, aka Changese
0220: 74 73 2e 20 54 68 65 73 65 20 6f 62 6a 65 63 74 ts. These object
0230: 73 20 61 72 65 20 66 69 72 73 74 20 75 73 65 64 s are first used
0240: 0a 23 23 20 69 6e 20 70 61 73 73 20 35 2c 20 77 .## in pass 5, w
0250: 68 69 63 68 20 63 72 65 61 74 65 73 20 74 68 65 hich creates the
0260: 20 69 6e 69 74 69 61 6c 20 73 65 74 20 63 6f 76 initial set cov
0270: 65 72 69 6e 67 20 74 68 65 20 72 65 70 6f 73 69 ering the reposi
0280: 74 6f 72 79 2e 0a 0a 23 20 23 20 23 23 20 23 23 tory...# # ## ##
0290: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 # ##### ########
02a0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23 ############# #
02b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
02c0: 23 23 23 23 0a 23 23 20 52 65 71 75 69 72 65 6d ####.## Requirem
02d0: 65 6e 74 73 0a 0a 70 61 63 6b 61 67 65 20 72 65 ents..package re
02e0: 71 75 69 72 65 20 54 63 6c 20 38 2e 34 20 20 20 quire Tcl 8.4
02f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0300: 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23 20 ; #
0310: 52 65 71 75 69 72 65 64 20 72 75 6e 74 69 6d 65 Required runtime
0320: 2e 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 ..package requir
0330: 65 20 73 6e 69 74 20 20 20 20 20 20 20 20 20 20 e snit
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0350: 20 20 20 20 20 20 20 20 3b 20 23 20 4f 4f 20 73 ; # OO s
0360: 79 73 74 65 6d 2e 0a 70 61 63 6b 61 67 65 20 72 ystem..package r
0370: 65 71 75 69 72 65 20 76 63 3a 3a 74 6f 6f 6c 73 equire vc::tools
0380: 3a 3a 6d 69 73 63 20 20 20 20 20 20 20 20 20 20 ::misc
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23 ; #
03a0: 20 54 65 78 74 20 66 6f 72 6d 61 74 74 69 6e 67 Text formatting
03b0: 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 .package require
03c0: 20 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 74 72 6f 75 vc::tools::trou
03d0: 62 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 20 ble
03e0: 20 20 20 20 20 20 20 3b 20 23 20 45 72 72 6f 72 ; # Error
03f0: 20 72 65 70 6f 72 74 69 6e 67 2e 0a 70 61 63 6b reporting..pack
0400: 61 67 65 20 72 65 71 75 69 72 65 20 76 63 3a 3a age require vc::
0410: 74 6f 6f 6c 73 3a 3a 6c 6f 67 20 20 20 20 20 20 tools::log
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
0430: 20 20 3b 20 23 20 55 73 65 72 20 66 65 65 64 62 ; # User feedb
0440: 61 63 6b 2e 0a 70 61 63 6b 61 67 65 20 72 65 71 ack..package req
0450: 75 69 72 65 20 76 63 3a 3a 66 6f 73 73 69 6c 3a uire vc::fossil:
0460: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 :import::cvs::st
0470: 61 74 65 20 20 20 20 20 20 20 20 3b 20 23 20 53 ate ; # S
0480: 74 61 74 65 20 73 74 6f 72 61 67 65 2e 0a 0a 23 tate storage...#
0490: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 # ## ### #####
04a0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## #######
04b0: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 ###### #########
04c0: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 ############.##
04d0: 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20 3a 3a 76 ..snit::type ::v
04e0: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 c::fossil::impor
04f0: 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a t::cvs::project:
0500: 3a 72 65 76 20 7b 0a 20 20 20 20 23 20 23 20 23 :rev {. # # #
0510: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 # ### ##### ####
0520: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 #### ###########
0530: 23 23 0a 20 20 20 20 23 23 20 50 75 62 6c 69 63 ##. ## Public
0540: 20 41 50 49 0a 0a 20 20 20 20 63 6f 6e 73 74 72 API.. constr
0550: 75 63 74 6f 72 20 7b 70 72 6f 6a 65 63 74 20 63 uctor {project c
0560: 73 74 79 70 65 20 73 72 63 69 64 20 72 65 76 69 stype srcid revi
0570: 73 69 6f 6e 73 20 7b 74 68 65 69 64 20 7b 7d 7d sions {theid {}}
0580: 7d 20 7b 0a 09 69 66 20 7b 24 74 68 65 69 64 20 } {..if {$theid
0590: 6e 65 20 22 22 7d 20 7b 0a 09 20 20 20 20 73 65 ne ""} {.. se
05a0: 74 20 6d 79 69 64 20 24 74 68 65 69 64 0a 09 7d t myid $theid..}
05b0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 73 65 74 else {.. set
05c0: 20 6d 79 69 64 20 5b 69 6e 63 72 20 6d 79 63 6f myid [incr myco
05d0: 75 6e 74 65 72 5d 0a 09 7d 0a 0a 09 73 65 74 20 unter]..}...set
05e0: 6d 79 70 72 6f 6a 65 63 74 20 20 20 24 70 72 6f myproject $pro
05f0: 6a 65 63 74 0a 09 73 65 74 20 6d 79 74 79 70 65 ject..set mytype
0600: 20 20 20 20 20 20 24 63 73 74 79 70 65 09 20 20 $cstype.
0610: 0a 09 73 65 74 20 6d 79 73 72 63 69 64 09 24 73 ..set mysrcid.$s
0620: 72 63 69 64 09 20 20 0a 09 73 65 74 20 6d 79 72 rcid. ..set myr
0630: 65 76 69 73 69 6f 6e 73 20 24 72 65 76 69 73 69 evisions $revisi
0640: 6f 6e 73 0a 0a 09 23 20 4b 65 65 70 20 74 72 61 ons...# Keep tra
0650: 63 6b 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 ck of the genera
0660: 74 65 64 20 63 68 61 6e 67 65 73 65 74 73 20 61 ted changesets a
0670: 6e 64 20 6f 66 20 74 68 65 20 69 6e 76 65 72 73 nd of the invers
0680: 65 0a 09 23 20 6d 61 70 70 69 6e 67 20 66 72 6f e..# mapping fro
0690: 6d 20 72 65 76 69 73 69 6f 6e 73 20 74 6f 20 74 m revisions to t
06a0: 68 65 6d 2e 0a 09 6c 61 70 70 65 6e 64 20 6d 79 hem...lappend my
06b0: 63 68 61 6e 67 65 73 65 74 73 20 24 73 65 6c 66 changesets $self
06c0: 0a 09 66 6f 72 65 61 63 68 20 72 20 24 72 65 76 ..foreach r $rev
06d0: 69 73 69 6f 6e 73 20 7b 20 73 65 74 20 6d 79 72 isions { set myr
06e0: 65 76 6d 61 70 28 24 72 29 20 24 73 65 6c 66 20 evmap($r) $self
06f0: 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a }..return. }.
0700: 0a 20 20 20 20 6d 65 74 68 6f 64 20 69 64 20 20 . method id
0710: 20 20 20 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 {} { retur
0720: 6e 20 24 6d 79 69 64 20 7d 0a 20 20 20 20 6d 65 n $myid }. me
0730: 74 68 6f 64 20 72 65 76 69 73 69 6f 6e 73 20 7b thod revisions {
0740: 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 72 65 } { return $myre
0750: 76 69 73 69 6f 6e 73 20 7d 0a 20 20 20 20 6d 65 visions }. me
0760: 74 68 6f 64 20 64 61 74 61 20 20 20 20 20 20 7b thod data {
0770: 7d 20 7b 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 } { return [list
0780: 20 24 6d 79 70 72 6f 6a 65 63 74 20 24 6d 79 74 $myproject $myt
0790: 79 70 65 20 24 6d 79 73 72 63 69 64 5d 20 7d 0a ype $mysrcid] }.
07a0: 0a 20 20 20 20 6d 65 74 68 6f 64 20 62 79 73 79 . method bysy
07b0: 6d 62 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 74 75 mbol {} { retu
07c0: 72 6e 20 5b 65 78 70 72 20 7b 24 6d 79 74 79 70 rn [expr {$mytyp
07d0: 65 20 65 71 20 22 73 79 6d 22 7d 5d 20 7d 0a 20 e eq "sym"}] }.
07e0: 20 20 20 6d 65 74 68 6f 64 20 62 79 72 65 76 69 method byrevi
07f0: 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75 72 6e sion {} { return
0800: 20 5b 65 78 70 72 20 7b 24 6d 79 74 79 70 65 20 [expr {$mytype
0810: 65 71 20 22 72 65 76 22 7d 5d 20 7d 0a 0a 20 20 eq "rev"}] }..
0820: 20 20 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 method success
0830: 6f 72 73 20 7b 7d 20 7b 0a 09 23 20 4e 4f 54 45 ors {} {..# NOTE
0840: 20 2f 20 46 55 54 55 52 45 3a 20 50 6f 73 73 69 / FUTURE: Possi
0850: 62 6c 65 20 62 6f 74 74 6c 65 6e 65 63 6b 2e 0a ble bottleneck..
0860: 09 73 65 74 20 63 73 65 74 73 20 7b 7d 0a 09 66 .set csets {}..f
0870: 6f 72 65 61 63 68 20 7b 5f 20 63 68 69 6c 64 72 oreach {_ childr
0880: 65 6e 7d 20 5b 24 73 65 6c 66 20 6e 65 78 74 6d en} [$self nextm
0890: 61 70 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 ap] {.. forea
08a0: 63 68 20 63 68 69 6c 64 20 24 63 68 69 6c 64 72 ch child $childr
08b0: 65 6e 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 63 en {...lappend c
08c0: 73 65 74 73 20 24 6d 79 72 65 76 6d 61 70 28 24 sets $myrevmap($
08d0: 63 68 69 6c 64 29 0a 09 20 20 20 20 7d 0a 09 7d child).. }..}
08e0: 0a 09 72 65 74 75 72 6e 20 5b 6c 73 6f 72 74 20 ..return [lsort
08f0: 2d 75 6e 69 71 75 65 20 24 63 73 65 74 73 5d 0a -unique $csets].
0900: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 76 }.. # rev
0910: 69 73 69 6f 6e 20 2d 3e 20 6c 69 73 74 20 28 72 ision -> list (r
0920: 65 76 69 73 69 6f 6e 29 0a 20 20 20 20 6d 65 74 evision). met
0930: 68 6f 64 20 6e 65 78 74 6d 61 70 20 7b 7d 20 7b hod nextmap {} {
0940: 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 ..if {[llength $
0950: 6d 79 6e 65 78 74 6d 61 70 5d 7d 20 7b 20 72 65 mynextmap]} { re
0960: 74 75 72 6e 20 24 6d 79 6e 65 78 74 6d 61 70 20 turn $mynextmap
0970: 7d 0a 09 50 75 6c 6c 53 75 63 63 65 73 73 6f 72 }..PullSuccessor
0980: 52 65 76 69 73 69 6f 6e 73 20 74 6d 70 20 24 6d Revisions tmp $m
0990: 79 72 65 76 69 73 69 6f 6e 73 0a 09 73 65 74 20 yrevisions..set
09a0: 6d 79 6e 65 78 74 6d 61 70 20 5b 61 72 72 61 79 mynextmap [array
09b0: 20 67 65 74 20 74 6d 70 5d 0a 09 72 65 74 75 72 get tmp]..retur
09c0: 6e 20 24 6d 79 6e 65 78 74 6d 61 70 0a 20 20 20 n $mynextmap.
09d0: 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 62 }.. method b
09e0: 72 65 61 6b 69 6e 74 65 72 6e 61 6c 64 65 70 65 reakinternaldepe
09f0: 6e 64 65 6e 63 69 65 73 20 7b 7d 20 7b 0a 09 23 ndencies {} {..#
0a00: 20 54 68 69 73 20 6d 65 74 68 6f 64 20 69 6e 73 This method ins
0a10: 70 65 63 74 73 20 74 68 65 20 63 68 61 6e 67 65 pects the change
0a20: 73 65 74 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 sets for interna
0a30: 6c 0a 09 23 20 64 65 70 65 6e 64 65 6e 63 69 65 l..# dependencie
0a40: 73 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 64 6f s. Nothing is do
0a50: 6e 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 ne if there are
0a60: 6e 6f 0a 09 23 20 73 75 63 68 2e 20 4f 74 68 65 no..# such. Othe
0a70: 72 77 69 73 65 20 74 68 65 20 63 68 61 6e 67 65 rwise the change
0a80: 73 65 74 20 69 73 20 73 70 6c 69 74 20 69 6e 74 set is split int
0a90: 6f 20 61 20 73 65 74 20 6f 66 0a 09 23 20 66 72 o a set of..# fr
0aa0: 61 67 6d 65 6e 74 73 20 77 69 74 68 6f 75 74 20 agments without
0ab0: 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 internal depende
0ac0: 6e 63 69 65 73 2c 20 74 72 61 6e 73 66 6f 72 6d ncies, transform
0ad0: 69 6e 67 20 74 68 65 0a 09 23 20 69 6e 74 65 72 ing the..# inter
0ae0: 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 nal dependencies
0af0: 20 69 6e 74 6f 20 65 78 74 65 72 6e 61 6c 20 6f into external o
0b00: 6e 65 73 2e 20 54 68 65 20 6e 65 77 20 63 68 61 nes. The new cha
0b10: 6e 67 65 73 65 74 73 0a 09 23 20 61 72 65 20 61 ngesets..# are a
0b20: 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73 74 dded to the list
0b30: 20 6f 66 20 61 6c 6c 20 63 68 61 6e 67 65 73 65 of all changese
0b40: 74 73 2e 0a 0a 09 23 20 57 65 20 70 65 72 66 6f ts....# We perfo
0b50: 72 6d 20 61 6c 6c 20 6e 65 63 65 73 73 61 72 79 rm all necessary
0b60: 20 73 70 6c 69 74 73 20 69 6e 20 6f 6e 65 20 67 splits in one g
0b70: 6f 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e o, instead of on
0b80: 6c 79 0a 09 23 20 6f 6e 65 2e 20 54 68 65 20 70 ly..# one. The p
0b90: 72 65 76 69 6f 75 73 20 61 6c 67 6f 72 69 74 68 revious algorith
0ba0: 6d 2c 20 61 64 61 70 74 65 64 20 66 72 6f 6d 20 m, adapted from
0bb0: 63 76 73 32 73 76 6e 2c 20 63 6f 6d 70 75 74 65 cvs2svn, compute
0bc0: 64 0a 09 23 20 61 20 6c 6f 74 20 6f 66 20 73 74 d..# a lot of st
0bd0: 61 74 65 20 77 68 69 63 68 20 77 61 73 20 74 68 ate which was th
0be0: 72 6f 77 6e 20 61 77 61 79 20 61 6e 64 20 74 68 rown away and th
0bf0: 65 6e 20 63 6f 6d 70 75 74 65 64 20 61 67 61 69 en computed agai
0c00: 6e 0a 09 23 20 66 6f 72 20 65 61 63 68 20 6f 66 n..# for each of
0c10: 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 2e 20 the fragments.
0c20: 49 74 20 73 68 6f 75 6c 64 20 62 65 20 65 61 73 It should be eas
0c30: 69 65 72 20 74 6f 20 75 70 64 61 74 65 20 61 6e ier to update an
0c40: 64 0a 09 23 20 72 65 75 73 65 20 74 68 61 74 20 d..# reuse that
0c50: 73 74 61 74 65 2e 0a 0a 09 23 20 54 68 65 20 63 state....# The c
0c60: 6f 64 65 20 63 68 65 63 6b 73 20 6f 6e 6c 79 20 ode checks only
0c70: 73 75 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 sucessor depende
0c80: 6e 63 69 65 73 2c 20 61 73 20 74 68 69 73 0a 09 ncies, as this..
0c90: 23 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 # automatically
0ca0: 63 6f 76 65 72 73 20 74 68 65 20 70 72 65 64 65 covers the prede
0cb0: 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 cessor dependenc
0cc0: 69 65 73 20 61 73 20 77 65 6c 6c 20 28 41 0a 09 ies as well (A..
0cd0: 23 20 73 75 63 63 65 73 73 6f 72 20 64 65 70 65 # successor depe
0ce0: 6e 64 65 6e 63 79 20 61 20 2d 3e 20 62 20 69 73 ndency a -> b is
0cf0: 20 61 6c 73 6f 20 61 20 70 72 65 64 65 63 65 73 also a predeces
0d00: 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 79 0a 09 sor dependency..
0d10: 23 20 62 20 2d 3e 20 61 29 2e 0a 0a 09 23 20 41 # b -> a)....# A
0d20: 72 72 61 79 20 6f 66 20 64 65 70 65 6e 64 65 6e rray of dependen
0d30: 63 69 65 73 20 28 70 61 72 65 6e 74 20 2d 3e 20 cies (parent ->
0d40: 63 68 69 6c 64 29 2e 20 54 68 69 73 20 69 73 20 child). This is
0d50: 70 75 6c 6c 65 64 20 66 72 6f 6d 0a 09 23 20 74 pulled from..# t
0d60: 68 65 20 73 74 61 74 65 2c 20 61 6e 64 20 6c 69 he state, and li
0d70: 6d 69 74 65 64 20 74 6f 20 73 75 63 63 65 73 73 mited to success
0d80: 6f 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 63 ors within the c
0d90: 68 61 6e 67 65 73 65 74 2e 0a 0a 09 61 72 72 61 hangeset....arra
0da0: 79 20 73 65 74 20 64 65 70 65 6e 64 65 6e 63 69 y set dependenci
0db0: 65 73 20 7b 7d 0a 09 50 75 6c 6c 49 6e 74 65 72 es {}..PullInter
0dc0: 6e 61 6c 53 75 63 63 65 73 73 6f 72 52 65 76 69 nalSuccessorRevi
0dd0: 73 69 6f 6e 73 20 64 65 70 65 6e 64 65 6e 63 69 sions dependenci
0de0: 65 73 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 0a es $myrevisions.
0df0: 09 69 66 20 7b 21 5b 61 72 72 61 79 20 73 69 7a .if {![array siz
0e00: 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73 5d 7d e dependencies]}
0e10: 20 7b 72 65 74 75 72 6e 20 30 7d 20 3b 20 23 20 {return 0} ; #
0e20: 4e 6f 74 68 69 6e 67 20 74 6f 20 62 72 65 61 6b Nothing to break
0e30: 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 36 20 ....log write 6
0e40: 63 73 65 74 73 20 2e 2e 2e 3c 24 6d 79 69 64 3e csets ...<$myid>
0e50: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
0e60: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
0e70: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
0e80: 2e 2e 2e 2e 2e 2e 2e 0a 0a 09 23 20 57 65 20 68 ..........# We h
0e90: 61 76 65 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 ave internal dep
0ea0: 65 6e 64 65 6e 63 69 65 73 20 74 6f 20 62 72 65 endencies to bre
0eb0: 61 6b 2e 20 57 65 20 6e 6f 77 20 69 74 65 72 61 ak. We now itera
0ec0: 74 65 20 6f 76 65 72 0a 09 23 20 61 6c 6c 20 70 te over..# all p
0ed0: 6f 73 69 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 ositions in the
0ee0: 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20 63 list (which is c
0ef0: 68 72 6f 6e 6f 6c 6f 67 69 63 61 6c 2c 20 61 74 hronological, at
0f00: 20 6c 65 61 73 74 0a 09 23 20 61 73 20 66 61 72 least..# as far
0f10: 20 61 73 20 74 68 65 20 74 69 6d 65 73 74 61 6d as the timestam
0f20: 70 73 20 61 72 65 20 63 6f 72 72 65 63 74 20 61 ps are correct a
0f30: 6e 64 20 75 6e 69 71 75 65 29 20 61 6e 64 0a 09 nd unique) and..
0f40: 23 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 # determine the
0f50: 62 65 73 74 20 70 6f 73 69 74 69 6f 6e 20 66 6f best position fo
0f60: 72 20 74 68 65 20 62 72 65 61 6b 2c 20 62 79 20 r the break, by
0f70: 74 72 79 69 6e 67 20 74 6f 0a 09 23 20 62 72 65 trying to..# bre
0f80: 61 6b 20 61 73 20 6d 61 6e 79 20 64 65 70 65 6e ak as many depen
0f90: 64 65 6e 63 69 65 73 20 61 73 20 70 6f 73 73 69 dencies as possi
0fa0: 62 6c 65 20 69 6e 20 6f 6e 65 20 67 6f 2e 20 57 ble in one go. W
0fb0: 68 65 6e 20 61 0a 09 23 20 62 72 65 61 6b 20 77 hen a..# break w
0fc0: 61 73 20 66 6f 75 6e 64 20 74 68 69 73 20 69 73 as found this is
0fd0: 20 72 65 64 6f 6e 65 20 66 6f 72 20 74 68 65 20 redone for the
0fe0: 66 72 61 67 6d 65 6e 74 73 20 63 6f 6d 69 6e 67 fragments coming
0ff0: 20 61 6e 64 0a 09 23 20 61 66 74 65 72 2c 20 61 and..# after, a
1000: 66 74 65 72 20 75 70 64 69 6e 67 20 74 68 65 20 fter upding the
1010: 63 72 6f 73 73 69 6e 67 20 69 6e 66 6f 72 6d 61 crossing informa
1020: 74 69 6f 6e 2e 0a 0a 09 23 20 44 61 74 61 20 73 tion....# Data s
1030: 74 72 75 63 74 75 72 65 73 3a 0a 09 23 20 4d 61 tructures:..# Ma
1040: 70 3a 20 20 50 4f 53 20 20 20 72 65 76 69 73 69 p: POS revisi
1050: 6f 6e 20 69 64 20 20 20 20 20 20 2d 3e 20 70 6f on id -> po
1060: 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73 74 2e 0a sition in list..
1070: 09 23 20 20 20 20 20 20 20 43 52 4f 53 53 20 70 .# CROSS p
1080: 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73 74 20 osition in list
1090: 2d 3e 20 6e 75 6d 62 65 72 20 6f 66 20 64 65 70 -> number of dep
10a0: 65 6e 64 65 6e 63 69 65 73 20 63 72 6f 73 73 69 endencies crossi
10b0: 6e 67 20 69 74 0a 09 23 20 20 20 20 20 20 20 44 ng it..# D
10c0: 45 50 43 20 20 64 65 70 65 6e 64 65 6e 63 79 20 EPC dependency
10d0: 20 20 20 20 20 20 2d 3e 20 70 6f 73 69 74 69 6f -> positio
10e0: 6e 73 20 69 74 20 63 72 6f 73 73 65 73 0a 09 23 ns it crosses..#
10f0: 20 4c 69 73 74 3a 20 52 41 4e 47 45 20 4f 66 20 List: RANGE Of
1100: 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 69 74 the positions it
1110: 73 65 6c 66 2e 0a 09 23 20 41 20 64 65 70 65 6e self...# A depen
1120: 64 65 6e 63 79 20 69 73 20 61 20 73 69 6e 67 6c dency is a singl
1130: 65 2d 65 6c 65 6d 65 6e 74 20 6d 61 70 20 70 61 e-element map pa
1140: 72 65 6e 74 20 2d 3e 20 63 68 69 6c 64 0a 0a 09 rent -> child...
1150: 49 6e 69 74 69 61 6c 69 7a 65 42 72 65 61 6b 53 InitializeBreakS
1160: 74 61 74 65 20 24 6d 79 72 65 76 69 73 69 6f 6e tate $myrevision
1170: 73 0a 0a 09 73 65 74 20 66 72 61 67 6d 65 6e 74 s...set fragment
1180: 73 20 7b 7d 0a 09 73 65 74 20 70 65 6e 64 69 6e s {}..set pendin
1190: 67 20 20 20 5b 6c 69 73 74 20 24 72 61 6e 67 65 g [list $range
11a0: 5d 0a 09 73 65 74 20 61 74 20 20 20 20 20 20 20 ]..set at
11b0: 20 30 0a 09 61 72 72 61 79 20 73 65 74 20 62 72 0..array set br
11c0: 65 61 6b 73 20 7b 7d 0a 0a 09 77 68 69 6c 65 20 eaks {}...while
11d0: 7b 24 61 74 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 {$at < [llength
11e0: 24 70 65 6e 64 69 6e 67 5d 7d 20 7b 0a 09 20 20 $pending]} {..
11f0: 20 20 73 65 74 20 63 75 72 72 65 6e 74 20 5b 6c set current [l
1200: 69 6e 64 65 78 20 24 70 65 6e 64 69 6e 67 20 24 index $pending $
1210: 61 74 5d 0a 0a 09 20 20 20 20 6c 6f 67 20 77 72 at]... log wr
1220: 69 74 65 20 36 20 63 73 65 74 73 20 22 2e 20 2e ite 6 csets ". .
1230: 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e .. ... ..... ..
1240: 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e ...... .........
1250: 2e 2e 2e 2e 22 0a 09 20 20 20 20 6c 6f 67 20 77 ....".. log w
1260: 72 69 74 65 20 36 20 63 73 65 74 73 20 22 53 63 rite 6 csets "Sc
1270: 68 65 64 75 6c 65 64 20 20 20 5b 6a 6f 69 6e 20 heduled [join
1280: 5b 50 52 73 20 5b 6c 72 61 6e 67 65 20 24 70 65 [PRs [lrange $pe
1290: 6e 64 69 6e 67 20 24 61 74 20 65 6e 64 5d 5d 20 nding $at end]]
12a0: 7b 20 7d 5d 22 0a 09 20 20 20 20 6c 6f 67 20 77 { }]".. log w
12b0: 72 69 74 65 20 36 20 63 73 65 74 73 20 22 43 6f rite 6 csets "Co
12c0: 6e 73 69 64 65 72 69 6e 67 20 5b 50 52 20 24 63 nsidering [PR $c
12d0: 75 72 72 65 6e 74 5d 20 5c 5b 24 61 74 2f 5b 6c urrent] \[$at/[l
12e0: 6c 65 6e 67 74 68 20 24 70 65 6e 64 69 6e 67 5d length $pending]
12f0: 5c 5d 22 0a 0a 09 20 20 20 20 73 65 74 20 62 65 \]"... set be
1300: 73 74 20 5b 46 69 6e 64 42 65 73 74 42 72 65 61 st [FindBestBrea
1310: 6b 20 24 63 75 72 72 65 6e 74 5d 0a 0a 09 20 20 k $current]...
1320: 20 20 69 66 20 7b 24 62 65 73 74 20 3c 20 30 7d if {$best < 0}
1330: 20 7b 0a 09 09 23 20 54 68 65 20 69 6e 73 70 65 {...# The inspe
1340: 63 74 65 64 20 72 61 6e 67 65 20 68 61 73 20 6e cted range has n
1350: 6f 20 69 6e 74 65 72 6e 61 6c 0a 09 09 23 20 64 o internal...# d
1360: 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 54 68 69 ependencies. Thi
1370: 73 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 s is a complete
1380: 66 72 61 67 6d 65 6e 74 2e 0a 09 09 6c 61 70 70 fragment....lapp
1390: 65 6e 64 20 66 72 61 67 6d 65 6e 74 73 20 24 63 end fragments $c
13a0: 75 72 72 65 6e 74 0a 0a 09 09 6c 6f 67 20 77 72 urrent....log wr
13b0: 69 74 65 20 36 20 63 73 65 74 73 20 22 4e 6f 20 ite 6 csets "No
13c0: 62 72 65 61 6b 73 2c 20 66 69 6e 61 6c 22 0a 09 breaks, final"..
13d0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 23 } else {...#
13e0: 20 53 70 6c 69 74 20 74 68 65 20 72 61 6e 67 65 Split the range
13f0: 20 61 6e 64 20 73 63 68 65 64 75 6c 65 20 74 68 and schedule th
1400: 65 20 72 65 73 75 6c 74 69 6e 67 20 66 72 61 67 e resulting frag
1410: 6d 65 6e 74 73 0a 09 09 23 20 66 6f 72 20 66 75 ments...# for fu
1420: 72 74 68 65 72 20 69 6e 73 70 65 63 74 69 6f 6e rther inspection
1430: 2e 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 6e . Remember the n
1440: 75 6d 62 65 72 20 6f 66 0a 09 09 23 20 64 65 70 umber of...# dep
1450: 65 6e 64 65 6e 63 69 65 73 20 63 75 74 20 62 65 endencies cut be
1460: 66 6f 72 65 20 77 65 20 72 65 6d 6f 76 65 20 74 fore we remove t
1470: 68 65 6d 20 66 72 6f 6d 0a 09 09 23 20 63 6f 6e hem from...# con
1480: 73 69 64 65 72 61 74 69 6f 6e 2c 20 66 6f 72 20 sideration, for
1490: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 6c 61 documentation la
14a0: 74 65 72 2e 0a 0a 09 09 73 65 74 20 62 72 65 61 ter.....set brea
14b0: 6b 73 28 24 62 65 73 74 29 20 24 63 72 6f 73 73 ks($best) $cross
14c0: 28 24 62 65 73 74 29 0a 0a 09 09 6c 6f 67 20 77 ($best)....log w
14d0: 72 69 74 65 20 36 20 63 73 65 74 73 20 22 42 65 rite 6 csets "Be
14e0: 73 74 20 62 72 65 61 6b 20 40 20 24 62 65 73 74 st break @ $best
14f0: 2c 20 63 75 74 74 69 6e 67 20 5b 6e 73 70 20 24 , cutting [nsp $
1500: 63 72 6f 73 73 28 24 62 65 73 74 29 20 64 65 70 cross($best) dep
1510: 65 6e 64 65 6e 63 79 20 64 65 70 65 6e 64 65 6e endency dependen
1520: 63 69 65 73 5d 22 0a 0a 09 09 23 20 4e 6f 74 65 cies]"....# Note
1530: 3a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 62 : The value of b
1540: 65 73 74 20 69 73 20 61 6e 20 61 62 6f 6c 75 74 est is an abolut
1550: 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 0a 09 09 e location in...
1560: 23 20 6d 79 72 65 76 69 73 69 6f 6e 73 2e 20 55 # myrevisions. U
1570: 73 65 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 se the start of
1580: 63 75 72 72 65 6e 74 20 74 6f 20 6d 61 6b 65 20 current to make
1590: 69 74 20 61 6e 0a 09 09 23 20 69 6e 64 65 78 20 it an...# index
15a0: 61 62 73 6f 6c 75 74 65 20 74 6f 20 63 75 72 72 absolute to curr
15b0: 65 6e 74 2e 0a 0a 09 09 73 65 74 20 62 72 65 6c ent.....set brel
15c0: 20 5b 65 78 70 72 20 7b 24 62 65 73 74 20 2d 20 [expr {$best -
15d0: 5b 6c 69 6e 64 65 78 20 24 63 75 72 72 65 6e 74 [lindex $current
15e0: 20 30 5d 7d 5d 0a 09 09 73 65 74 20 62 6e 65 78 0]}]...set bnex
15f0: 74 20 24 62 72 65 6c 20 3b 20 69 6e 63 72 20 62 t $brel ; incr b
1600: 6e 65 78 74 0a 09 09 73 65 74 20 66 72 61 67 62 next...set fragb
1610: 65 66 6f 72 65 20 5b 6c 72 61 6e 67 65 20 24 63 efore [lrange $c
1620: 75 72 72 65 6e 74 20 30 20 24 62 72 65 6c 5d 0a urrent 0 $brel].
1630: 09 09 73 65 74 20 66 72 61 67 61 66 74 65 72 20 ..set fragafter
1640: 20 5b 6c 72 61 6e 67 65 20 24 63 75 72 72 65 6e [lrange $curren
1650: 74 20 24 62 6e 65 78 74 20 65 6e 64 5d 0a 0a 09 t $bnext end]...
1660: 09 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 .log write 6 cse
1670: 74 73 20 22 4e 65 77 20 70 69 65 63 65 73 20 20 ts "New pieces
1680: 5b 50 52 20 24 66 72 61 67 62 65 66 6f 72 65 5d [PR $fragbefore]
1690: 20 5b 50 52 20 24 66 72 61 67 61 66 74 65 72 5d [PR $fragafter]
16a0: 22 0a 0a 09 09 69 66 20 7b 21 5b 6c 6c 65 6e 67 "....if {![lleng
16b0: 74 68 20 24 66 72 61 67 62 65 66 6f 72 65 5d 7d th $fragbefore]}
16c0: 20 7b 0a 09 09 20 20 20 20 74 72 6f 75 62 6c 65 {... trouble
16d0: 20 69 6e 74 65 72 6e 61 6c 20 22 54 72 69 65 64 internal "Tried
16e0: 20 74 6f 20 73 70 6c 69 74 20 6f 66 66 20 61 20 to split off a
16f0: 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 72 61 67 zero-length frag
1700: 6d 65 6e 74 20 61 74 20 74 68 65 20 62 65 67 69 ment at the begi
1710: 6e 6e 69 6e 67 22 0a 09 09 7d 0a 09 09 69 66 20 nning"...}...if
1720: 7b 21 5b 6c 6c 65 6e 67 74 68 20 24 66 72 61 67 {![llength $frag
1730: 61 66 74 65 72 5d 7d 20 7b 0a 09 09 20 20 20 20 after]} {...
1740: 74 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61 6c trouble internal
1750: 20 22 54 72 69 65 64 20 74 6f 20 73 70 6c 69 74 "Tried to split
1760: 20 6f 66 66 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 off a zero-leng
1770: 74 68 20 66 72 61 67 6d 65 6e 74 20 61 74 20 74 th fragment at t
1780: 68 65 20 65 6e 64 22 0a 09 09 7d 0a 0a 09 09 6c he end"...}....l
1790: 61 70 70 65 6e 64 20 70 65 6e 64 69 6e 67 20 24 append pending $
17a0: 66 72 61 67 62 65 66 6f 72 65 20 24 66 72 61 67 fragbefore $frag
17b0: 61 66 74 65 72 0a 09 09 43 75 74 41 74 20 24 62 after...CutAt $b
17c0: 65 73 74 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 est.. }...
17d0: 20 69 6e 63 72 20 61 74 0a 09 7d 0a 0a 09 6c 6f incr at..}...lo
17e0: 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 g write 6 csets
17f0: 22 2e 20 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e ". . .. ... ....
1800: 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e . ........ .....
1810: 2e 2e 2e 2e 2e 2e 2e 2e 22 0a 0a 09 23 20 43 72 ........"...# Cr
1820: 65 61 74 65 20 63 68 61 6e 67 65 73 65 74 73 20 eate changesets
1830: 66 6f 72 20 74 68 65 20 66 72 61 67 6d 65 6e 74 for the fragment
1840: 73 2c 20 72 65 75 73 69 6e 67 20 74 68 65 20 63 s, reusing the c
1850: 75 72 72 65 6e 74 20 6f 6e 65 0a 09 23 20 66 6f urrent one..# fo
1860: 72 20 74 68 65 20 66 69 72 73 74 20 66 72 61 67 r the first frag
1870: 6d 65 6e 74 2e 20 57 65 20 73 6f 72 74 20 74 68 ment. We sort th
1880: 65 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 em in order to a
1890: 6c 6c 6f 77 0a 09 23 20 63 68 65 63 6b 69 6e 67 llow..# checking
18a0: 20 66 6f 72 20 67 61 70 73 20 61 6e 64 20 6e 69 for gaps and ni
18b0: 63 65 20 6d 65 73 73 61 67 65 73 2e 0a 0a 09 73 ce messages....s
18c0: 65 74 20 66 72 61 67 6d 65 6e 74 73 20 5b 6c 73 et fragments [ls
18d0: 6f 72 74 20 2d 69 6e 64 65 78 20 30 20 2d 69 6e ort -index 0 -in
18e0: 74 65 67 65 72 20 24 66 72 61 67 6d 65 6e 74 73 teger $fragments
18f0: 5d 0a 0a 09 23 70 75 74 73 20 5c 74 2e 5b 6a 6f ]...#puts \t.[jo
1900: 69 6e 20 5b 50 52 73 20 24 66 72 61 67 6d 65 6e in [PRs $fragmen
1910: 74 73 5d 20 2e 5c 6e 5c 74 2e 5d 2e 0a 0a 09 42 ts] .\n\t.]....B
1920: 6f 72 64 65 72 20 5b 6c 69 6e 64 65 78 20 24 66 order [lindex $f
1930: 72 61 67 6d 65 6e 74 73 20 30 5d 20 66 69 72 73 ragments 0] firs
1940: 74 73 20 66 69 72 73 74 65 0a 0a 09 69 66 20 7b ts firste...if {
1950: 24 66 69 72 73 74 73 20 21 3d 20 30 7d 20 7b 0a $firsts != 0} {.
1960: 09 20 20 20 20 74 72 6f 75 62 6c 65 20 69 6e 74 . trouble int
1970: 65 72 6e 61 6c 20 22 42 61 64 20 66 72 61 67 6d ernal "Bad fragm
1980: 65 6e 74 20 73 74 61 72 74 20 40 20 24 66 69 72 ent start @ $fir
1990: 73 74 73 2c 20 67 61 70 2c 20 6f 72 20 62 65 66 sts, gap, or bef
19a0: 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 ore beginning of
19b0: 20 74 68 65 20 72 61 6e 67 65 22 0a 09 7d 0a 0a the range"..}..
19c0: 09 73 65 74 20 6c 61 73 74 65 20 24 66 69 72 73 .set laste $firs
19d0: 74 65 0a 09 66 6f 72 65 61 63 68 20 66 72 61 67 te..foreach frag
19e0: 6d 65 6e 74 20 5b 6c 72 61 6e 67 65 20 24 66 72 ment [lrange $fr
19f0: 61 67 6d 65 6e 74 73 20 31 20 65 6e 64 5d 20 7b agments 1 end] {
1a00: 0a 09 20 20 20 20 42 6f 72 64 65 72 20 24 66 72 .. Border $fr
1a10: 61 67 6d 65 6e 74 20 73 20 65 0a 09 20 20 20 20 agment s e..
1a20: 69 66 20 7b 24 6c 61 73 74 65 20 21 3d 20 28 24 if {$laste != ($
1a30: 73 20 2d 20 31 29 7d 20 7b 0a 09 09 74 72 6f 75 s - 1)} {...trou
1a40: 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 22 42 61 ble internal "Ba
1a50: 64 20 66 72 61 67 6d 65 6e 74 20 62 6f 72 64 65 d fragment borde
1a60: 72 20 3c 24 6c 61 73 74 65 20 7c 20 24 73 3e 2c r <$laste | $s>,
1a70: 20 67 61 70 20 6f 72 20 6f 76 65 72 6c 61 70 22 gap or overlap"
1a80: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 73 65 .. }... se
1a90: 74 20 6e 65 77 20 5b 24 74 79 70 65 20 25 41 55 t new [$type %AU
1aa0: 54 4f 25 20 24 6d 79 70 72 6f 6a 65 63 74 20 24 TO% $myproject $
1ab0: 6d 79 74 79 70 65 20 24 6d 79 73 72 63 69 64 20 mytype $mysrcid
1ac0: 5b 6c 72 61 6e 67 65 20 24 6d 79 72 65 76 69 73 [lrange $myrevis
1ad0: 69 6f 6e 73 20 24 73 20 24 65 5d 5d 0a 0a 20 20 ions $s $e]]..
1ae0: 20 20 20 20 20 20 20 20 20 20 6c 6f 67 20 77 72 log wr
1af0: 69 74 65 20 34 20 63 73 65 74 73 20 22 42 72 65 ite 4 csets "Bre
1b00: 61 6b 69 6e 67 20 3c 24 6d 79 69 64 3e 20 40 20 aking <$myid> @
1b10: 24 6c 61 73 74 65 2c 20 6e 65 77 20 3c 5b 24 6e $laste, new <[$n
1b20: 65 77 20 69 64 5d 3e 2c 20 63 75 74 74 69 6e 67 ew id]>, cutting
1b30: 20 24 62 72 65 61 6b 73 28 24 6c 61 73 74 65 29 $breaks($laste)
1b40: 22 0a 0a 09 20 20 20 20 73 65 74 20 6c 61 73 74 "... set last
1b50: 65 20 24 65 0a 09 7d 0a 0a 09 69 66 20 7b 24 6c e $e..}...if {$l
1b60: 61 73 74 65 20 21 3d 20 28 5b 6c 6c 65 6e 67 74 aste != ([llengt
1b70: 68 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 5d 2d h $myrevisions]-
1b80: 31 29 7d 20 7b 0a 09 20 20 20 20 74 72 6f 75 62 1)} {.. troub
1b90: 6c 65 20 69 6e 74 65 72 6e 61 6c 20 22 42 61 64 le internal "Bad
1ba0: 20 66 72 61 67 6d 65 6e 74 20 65 6e 64 20 40 20 fragment end @
1bb0: 24 6c 61 73 74 65 2c 20 67 61 70 2c 20 6f 72 20 $laste, gap, or
1bc0: 62 65 79 6f 6e 64 20 65 6e 64 20 6f 66 20 74 68 beyond end of th
1bd0: 65 20 72 61 6e 67 65 22 0a 09 7d 0a 0a 09 23 20 e range"..}...#
1be0: 50 75 74 20 74 68 65 20 66 69 72 73 74 20 66 72 Put the first fr
1bf0: 61 67 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 agment into the
1c00: 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 73 65 current changese
1c10: 74 2e 0a 09 73 65 74 20 6d 79 72 65 76 69 73 69 t...set myrevisi
1c20: 6f 6e 73 20 5b 6c 72 61 6e 67 65 20 24 6d 79 72 ons [lrange $myr
1c30: 65 76 69 73 69 6f 6e 73 20 30 20 24 66 69 72 73 evisions 0 $firs
1c40: 74 65 5d 0a 0a 09 72 65 74 75 72 6e 20 31 0a 20 te]...return 1.
1c50: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 }.. method
1c60: 20 70 65 72 73 69 73 74 20 7b 7d 20 7b 0a 09 73 persist {} {..s
1c70: 65 74 20 74 69 64 20 24 6d 79 63 73 74 79 70 65 et tid $mycstype
1c80: 28 24 6d 79 74 79 70 65 29 0a 09 73 65 74 20 70 ($mytype)..set p
1c90: 69 64 20 5b 24 6d 79 70 72 6f 6a 65 63 74 20 69 id [$myproject i
1ca0: 64 5d 0a 09 73 65 74 20 70 6f 73 20 30 0a 0a 09 d]..set pos 0...
1cb0: 73 74 61 74 65 20 74 72 61 6e 73 61 63 74 69 6f state transactio
1cc0: 6e 20 7b 0a 09 20 20 20 20 73 74 61 74 65 20 72 n {.. state r
1cd0: 75 6e 20 7b 0a 09 09 49 4e 53 45 52 54 20 49 4e un {...INSERT IN
1ce0: 54 4f 20 63 68 61 6e 67 65 73 65 74 20 28 63 69 TO changeset (ci
1cf0: 64 2c 20 20 20 70 69 64 2c 20 20 74 79 70 65 2c d, pid, type,
1d00: 20 73 72 63 29 0a 09 09 56 41 4c 55 45 53 20 20 src)...VALUES
1d10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 24 ($
1d20: 6d 79 69 64 2c 20 24 70 69 64 2c 20 24 74 69 64 myid, $pid, $tid
1d30: 2c 20 24 6d 79 73 72 63 69 64 29 3b 0a 09 20 20 , $mysrcid);..
1d40: 20 20 7d 0a 0a 09 20 20 20 20 66 6f 72 65 61 63 }... foreac
1d50: 68 20 72 69 64 20 24 6d 79 72 65 76 69 73 69 6f h rid $myrevisio
1d60: 6e 73 20 7b 0a 09 09 73 74 61 74 65 20 72 75 6e ns {...state run
1d70: 20 7b 0a 09 09 20 20 20 20 49 4e 53 45 52 54 20 {... INSERT
1d80: 49 4e 54 4f 20 63 73 72 65 76 69 73 69 6f 6e 20 INTO csrevision
1d90: 28 63 69 64 2c 20 20 20 70 6f 73 2c 20 20 72 69 (cid, pos, ri
1da0: 64 29 0a 09 09 20 20 20 20 56 41 4c 55 45 53 20 d)... VALUES
1db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
1dc0: 28 24 6d 79 69 64 2c 20 24 70 6f 73 2c 20 24 72 ($myid, $pos, $r
1dd0: 69 64 29 3b 0a 09 09 7d 0a 09 09 69 6e 63 72 20 id);...}...incr
1de0: 70 6f 73 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72 pos.. }..}..r
1df0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 eturn. }..
1e00: 20 6d 65 74 68 6f 64 20 74 69 6d 65 72 61 6e 67 method timerang
1e10: 65 20 7b 7d 20 7b 0a 09 73 65 74 20 74 68 65 73 e {} {..set thes
1e20: 65 74 20 28 27 5b 6a 6f 69 6e 20 24 6d 79 72 65 et ('[join $myre
1e30: 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 visions {','}]')
1e40: 0a 09 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20 ..return [state
1e50: 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 run ".. SELEC
1e60: 54 20 4d 49 4e 28 52 2e 64 61 74 65 29 2c 20 4d T MIN(R.date), M
1e70: 41 58 28 52 2e 64 61 74 65 29 0a 09 20 20 20 20 AX(R.date)..
1e80: 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 0a FROM revision R.
1e90: 09 20 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 . WHERE R.rid
1ea0: 20 49 4e 20 24 74 68 65 73 65 74 0a 09 22 5d 0a IN $theset.."].
1eb0: 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f }.. metho
1ec0: 64 20 64 72 6f 70 20 7b 7d 20 7b 0a 09 73 74 61 d drop {} {..sta
1ed0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b te transaction {
1ee0: 0a 09 20 20 20 20 73 74 61 74 65 20 72 75 6e 20 .. state run
1ef0: 7b 0a 09 09 44 45 4c 45 54 45 20 46 52 4f 4d 20 {...DELETE FROM
1f00: 63 68 61 6e 67 65 73 65 74 20 20 57 48 45 52 45 changeset WHERE
1f10: 20 63 69 64 20 3d 20 24 6d 79 69 64 3b 0a 09 09 cid = $myid;...
1f20: 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 73 72 65 DELETE FROM csre
1f30: 76 69 73 69 6f 6e 20 57 48 45 52 45 20 63 69 64 vision WHERE cid
1f40: 20 3d 20 24 6d 79 69 64 3b 0a 09 20 20 20 20 7d = $myid;.. }
1f50: 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 72 20 24 ..}..foreach r $
1f60: 6d 79 72 65 76 69 73 69 6f 6e 73 20 7b 20 75 6e myrevisions { un
1f70: 73 65 74 20 6d 79 72 65 76 6d 61 70 28 24 72 29 set myrevmap($r)
1f80: 20 7d 0a 09 73 65 74 20 70 6f 73 20 20 20 20 20 }..set pos
1f90: 20 20 20 20 20 5b 6c 73 65 61 72 63 68 20 2d 65 [lsearch -e
1fa0: 78 61 63 74 20 24 6d 79 63 68 61 6e 67 65 73 65 xact $mychangese
1fb0: 74 73 20 24 73 65 6c 66 5d 0a 09 73 65 74 20 6d ts $self]..set m
1fc0: 79 63 68 61 6e 67 65 73 65 74 73 20 5b 6c 72 65 ychangesets [lre
1fd0: 70 6c 61 63 65 20 24 6d 79 63 68 61 6e 67 65 73 place $mychanges
1fe0: 65 74 73 20 24 70 6f 73 20 24 70 6f 73 5d 0a 09 ets $pos $pos]..
1ff0: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 return. }..
2000: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 73 70 6c typemethod spl
2010: 69 74 20 7b 63 73 65 74 20 61 72 67 73 7d 20 7b it {cset args} {
2020: 0a 09 23 20 41 73 20 70 61 72 74 20 6f 66 20 74 ..# As part of t
2030: 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 he creation of t
2040: 68 65 20 6e 65 77 20 63 68 61 6e 67 65 73 65 74 he new changeset
2050: 73 20 73 70 65 63 69 66 69 65 64 20 69 6e 0a 09 s specified in..
2060: 23 20 41 52 47 53 20 61 73 20 73 65 74 73 20 6f # ARGS as sets o
2070: 66 20 72 65 76 69 73 69 6f 6e 73 2c 20 61 6c 6c f revisions, all
2080: 20 73 75 62 73 65 74 73 20 6f 66 20 43 53 45 54 subsets of CSET
2090: 27 73 20 72 65 76 69 73 69 6f 6e 0a 09 23 20 73 's revision..# s
20a0: 65 74 2c 20 43 53 45 54 20 77 69 6c 6c 20 62 65 et, CSET will be
20b0: 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 61 6c dropped from al
20c0: 6c 20 64 61 74 61 62 61 73 65 73 2c 20 69 6e 20 l databases, in
20d0: 61 6e 64 20 6f 75 74 20 6f 66 0a 09 23 20 6d 65 and out of..# me
20e0: 6d 6f 72 79 2c 20 61 6e 64 20 74 68 65 6e 20 64 mory, and then d
20f0: 65 73 74 72 6f 79 65 64 2e 0a 0a 09 73 74 72 75 estroyed....stru
2100: 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 ct::list assign
2110: 5b 24 63 73 65 74 20 64 61 74 61 5d 20 70 72 6f [$cset data] pro
2120: 6a 65 63 74 20 63 73 74 79 70 65 20 63 73 73 72 ject cstype cssr
2130: 63 0a 0a 09 24 63 73 65 74 20 64 72 6f 70 0a 09 c...$cset drop..
2140: 24 63 73 65 74 20 64 65 73 74 72 6f 79 0a 0a 09 $cset destroy...
2150: 73 65 74 20 6e 65 77 63 73 65 74 73 20 7b 7d 0a set newcsets {}.
2160: 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65 6e .foreach fragmen
2170: 74 72 65 76 69 73 69 6f 6e 73 20 24 61 72 67 73 trevisions $args
2180: 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 {.. lappend
2190: 6e 65 77 63 73 65 74 73 20 5b 24 74 79 70 65 20 newcsets [$type
21a0: 25 41 55 54 4f 25 20 24 70 72 6f 6a 65 63 74 20 %AUTO% $project
21b0: 24 63 73 74 79 70 65 20 24 63 73 73 72 63 20 24 $cstype $cssrc $
21c0: 66 72 61 67 6d 65 6e 74 72 65 76 69 73 69 6f 6e fragmentrevision
21d0: 73 5d 0a 09 7d 0a 0a 09 66 6f 72 65 61 63 68 20 s]..}...foreach
21e0: 63 20 24 6e 65 77 63 73 65 74 73 20 7b 20 24 63 c $newcsets { $c
21f0: 20 70 65 72 73 69 73 74 20 7d 0a 09 72 65 74 75 persist }..retu
2200: 72 6e 20 24 6e 65 77 63 73 65 74 73 0a 20 20 20 rn $newcsets.
2210: 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 }.. # # ## #
2220: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 ## ##### #######
2230: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a # #############.
2240: 20 20 20 20 23 23 20 53 74 61 74 65 0a 0a 20 20 ## State..
2250: 20 20 76 61 72 69 61 62 6c 65 20 6d 79 69 64 20 variable myid
2260: 20 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 49 64 {} ; # Id
2270: 20 6f 66 20 74 68 65 20 63 73 65 74 20 66 6f 72 of the cset for
2280: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 0a the persistent.
2290: 09 09 09 20 20 20 20 20 20 23 20 73 74 61 74 65 ... # state
22a0: 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d .. variable m
22b0: 79 70 72 6f 6a 65 63 74 20 20 20 7b 7d 20 3b 20 yproject {} ;
22c0: 23 20 52 65 66 65 72 65 6e 63 65 20 6f 66 20 74 # Reference of t
22d0: 68 65 20 70 72 6f 6a 65 63 74 20 6f 62 6a 65 63 he project objec
22e0: 74 20 74 68 65 0a 09 09 09 20 20 20 20 20 20 23 t the.... #
22f0: 20 63 68 61 6e 67 65 73 65 74 20 62 65 6c 6f 6e changeset belon
2300: 67 73 20 74 6f 2e 0a 20 20 20 20 76 61 72 69 61 gs to.. varia
2310: 62 6c 65 20 6d 79 74 79 70 65 20 20 20 20 20 20 ble mytype
2320: 7b 7d 20 3b 20 23 20 72 65 76 20 6f 72 20 73 79 {} ; # rev or sy
2330: 6d 2c 20 77 68 65 72 65 20 74 68 65 20 63 73 65 m, where the cse
2340: 74 20 6f 72 69 67 69 6e 61 74 65 64 0a 09 09 09 t originated....
2350: 20 20 20 20 20 20 23 20 66 72 6f 6d 2e 0a 20 20 # from..
2360: 20 20 76 61 72 69 61 62 6c 65 20 6d 79 73 72 63 variable mysrc
2370: 69 64 20 20 20 20 20 7b 7d 20 3b 20 23 20 49 64 id {} ; # Id
2380: 20 6f 66 20 74 68 65 20 6d 65 74 61 64 61 74 61 of the metadata
2390: 20 6f 72 20 73 79 6d 62 6f 6c 20 74 68 65 20 63 or symbol the c
23a0: 73 65 74 0a 09 09 09 20 20 20 20 20 20 23 20 69 set.... # i
23b0: 73 20 62 61 73 65 64 20 6f 6e 2e 0a 20 20 20 20 s based on..
23c0: 76 61 72 69 61 62 6c 65 20 6d 79 72 65 76 69 73 variable myrevis
23d0: 69 6f 6e 73 20 7b 7d 20 3b 20 23 20 4c 69 73 74 ions {} ; # List
23e0: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 65 76 of the file lev
23f0: 65 6c 20 72 65 76 69 73 69 6f 6e 73 20 69 6e 0a el revisions in.
2400: 09 09 09 20 20 20 20 20 20 23 20 74 68 65 20 63 ... # the c
2410: 73 65 74 2e 0a 20 20 20 20 76 61 72 69 61 62 6c set.. variabl
2420: 65 20 6d 79 6e 65 78 74 6d 61 70 20 20 20 7b 7d e mynextmap {}
2430: 20 3b 20 23 20 44 69 63 74 69 6f 6e 61 72 79 20 ; # Dictionary
2440: 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 mapping from the
2450: 20 72 65 76 69 73 69 6f 6e 73 0a 09 09 09 20 20 revisions....
2460: 20 20 20 20 23 20 74 6f 20 74 68 65 69 72 20 73 # to their s
2470: 75 63 63 65 73 73 6f 72 73 2e 20 43 61 63 68 65 uccessors. Cache
2480: 20 74 6f 20 61 76 6f 69 64 0a 09 09 09 20 20 20 to avoid....
2490: 20 20 20 23 20 6c 6f 61 64 69 6e 67 20 74 68 69 # loading thi
24a0: 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65 s from the state
24b0: 20 6d 6f 72 65 20 74 68 61 6e 0a 09 09 09 20 20 more than....
24c0: 20 20 20 20 23 20 6f 6e 63 65 2e 0a 0a 20 20 20 # once...
24d0: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 # # ## ### ####
24e0: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 # ######## #####
24f0: 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 ########. ##
2500: 49 6e 74 65 72 6e 61 6c 20 6d 65 74 68 6f 64 73 Internal methods
2510: 0a 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62 .. typevariab
2520: 6c 65 20 6d 79 63 6f 75 6e 74 65 72 20 20 20 20 le mycounter
2530: 20 20 20 20 30 20 3b 20 23 20 49 64 20 63 6f 75 0 ; # Id cou
2540: 6e 74 65 72 20 66 6f 72 20 63 73 65 74 73 2e 20 nter for csets.
2550: 4c 61 73 74 20 69 64 20 75 73 65 64 2e 0a 20 20 Last id used..
2560: 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d typevariable m
2570: 79 63 73 74 79 70 65 20 2d 61 72 72 61 79 20 7b ycstype -array {
2580: 7d 20 3b 20 23 20 4d 61 70 20 63 73 74 79 70 65 } ; # Map cstype
2590: 73 20 74 6f 20 70 65 72 73 69 73 74 65 6e 74 20 s to persistent
25a0: 69 64 73 2e 0a 0a 20 20 20 20 74 79 70 65 6d 65 ids... typeme
25b0: 74 68 6f 64 20 67 65 74 63 73 74 79 70 65 73 20 thod getcstypes
25c0: 7b 7d 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b 74 {} {..foreach {t
25d0: 69 64 20 6e 61 6d 65 7d 20 5b 73 74 61 74 65 20 id name} [state
25e0: 72 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 run {.. SELEC
25f0: 54 20 74 69 64 2c 20 6e 61 6d 65 20 46 52 4f 4d T tid, name FROM
2600: 20 63 73 74 79 70 65 3b 0a 09 7d 5d 20 7b 20 73 cstype;..}] { s
2610: 65 74 20 6d 79 63 73 74 79 70 65 28 24 6e 61 6d et mycstype($nam
2620: 65 29 20 24 74 69 64 20 7d 0a 09 72 65 74 75 72 e) $tid }..retur
2630: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 n. }.. typ
2640: 65 6d 65 74 68 6f 64 20 6c 6f 61 64 63 6f 75 6e emethod loadcoun
2650: 74 65 72 20 7b 7d 20 7b 0a 09 23 20 49 6e 69 74 ter {} {..# Init
2660: 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 75 6e 74 ialize the count
2670: 65 72 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74 er from the stat
2680: 65 0a 09 73 65 74 20 6d 79 63 6f 75 6e 74 65 72 e..set mycounter
2690: 20 5b 73 74 61 74 65 20 6f 6e 65 20 7b 20 53 45 [state one { SE
26a0: 4c 45 43 54 20 4d 41 58 28 63 69 64 29 20 46 52 LECT MAX(cid) FR
26b0: 4f 4d 20 63 68 61 6e 67 65 73 65 74 20 7d 5d 0a OM changeset }].
26c0: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 .return. }..
26d0: 20 20 20 70 72 6f 63 20 50 75 6c 6c 49 6e 74 65 proc PullInte
26e0: 72 6e 61 6c 53 75 63 63 65 73 73 6f 72 52 65 76 rnalSuccessorRev
26f0: 69 73 69 6f 6e 73 20 7b 64 76 20 72 65 76 69 73 isions {dv revis
2700: 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 ions} {..upvar 1
2710: 20 24 64 76 20 64 65 70 65 6e 64 65 6e 63 69 65 $dv dependencie
2720: 73 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 s..set theset ('
2730: 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 [join $revisions
2740: 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 66 6f 72 65 {','}]')...fore
2750: 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 7d 20 ach {rid child}
2760: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 20 20 20 [state run ".
2770: 2d 2d 20 50 72 69 6d 61 72 79 20 63 68 69 6c 64 -- Primary child
2780: 72 65 6e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 ren.. SELECT
2790: 52 2e 72 69 64 2c 20 52 2e 63 68 69 6c 64 0a 09 R.rid, R.child..
27a0: 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 FROM revis
27b0: 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 ion R.. WHERE
27c0: 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 R.rid IN $th
27d0: 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 eset.. AND
27e0: 20 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 R.child IS NOT
27f0: 4e 55 4c 4c 0a 09 20 20 20 20 41 4e 44 20 20 20 NULL.. AND
2800: 20 52 2e 63 68 69 6c 64 20 49 4e 20 24 74 68 65 R.child IN $the
2810: 73 65 74 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 set. UNION.
2820: 20 20 2d 2d 20 54 72 61 6e 73 69 74 69 6f 6e 20 -- Transition
2830: 4e 54 44 42 20 74 6f 20 74 72 75 6e 6b 0a 09 20 NTDB to trunk..
2840: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c SELECT R.rid,
2850: 20 52 2e 64 62 63 68 69 6c 64 0a 09 20 20 20 20 R.dbchild..
2860: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 FROM revision
2870: 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e R.. WHERE R.
2880: 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 rid IN $theset
2890: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 64 .. AND R.d
28a0: 62 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 bchild IS NOT NU
28b0: 4c 4c 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 LL.. AND R
28c0: 2e 64 62 63 68 69 6c 64 20 49 4e 20 24 74 68 65 .dbchild IN $the
28d0: 73 65 74 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 set. UNION.
28e0: 20 20 2d 2d 20 53 65 63 6f 6e 64 61 72 79 20 28 -- Secondary (
28f0: 62 72 61 6e 63 68 29 20 63 68 69 6c 64 72 65 6e branch) children
2900: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 .. SELECT R.r
2910: 69 64 2c 20 42 2e 62 72 69 64 0a 09 20 20 20 20 id, B.brid..
2920: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 FROM revision
2930: 52 2c 20 72 65 76 69 73 69 6f 6e 62 72 61 6e 63 R, revisionbranc
2940: 68 63 68 69 6c 64 72 65 6e 20 42 0a 09 20 20 20 hchildren B..
2950: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 WHERE R.rid
2960: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 IN $theset..
2970: 41 4e 44 20 20 20 20 52 2e 72 69 64 20 3d 20 42 AND R.rid = B
2980: 2e 72 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 .rid.. AND
2990: 20 42 2e 62 72 69 64 20 49 4e 20 24 74 68 65 73 B.brid IN $thes
29a0: 65 74 0a 09 22 5d 20 7b 0a 09 20 20 20 20 23 20 et.."] {.. #
29b0: 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69 6e 67 20 Consider moving
29c0: 74 68 69 73 20 74 6f 20 74 68 65 20 69 6e 74 65 this to the inte
29d0: 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e 0a 09 20 grity module...
29e0: 20 20 20 69 66 20 7b 24 72 69 64 20 3d 3d 20 24 if {$rid == $
29f0: 63 68 69 6c 64 7d 20 7b 0a 09 09 74 72 6f 75 62 child} {...troub
2a00: 6c 65 20 69 6e 74 65 72 6e 61 6c 20 22 52 65 76 le internal "Rev
2a10: 69 73 69 6f 6e 20 24 72 69 64 20 64 65 70 65 6e ision $rid depen
2a20: 64 73 20 6f 6e 20 69 74 73 65 6c 66 2e 22 0a 09 ds on itself."..
2a30: 20 20 20 20 7d 0a 09 20 20 20 20 6c 61 70 70 65 }.. lappe
2a40: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 nd dependencies(
2a50: 24 72 69 64 29 20 24 63 68 69 6c 64 0a 09 7d 0a $rid) $child..}.
2a60: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 }.. proc
2a70: 50 75 6c 6c 53 75 63 63 65 73 73 6f 72 52 65 76 PullSuccessorRev
2a80: 69 73 69 6f 6e 73 20 7b 64 76 20 72 65 76 69 73 isions {dv revis
2a90: 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 ions} {..upvar 1
2aa0: 20 24 64 76 20 64 65 70 65 6e 64 65 6e 63 69 65 $dv dependencie
2ab0: 73 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 s..set theset ('
2ac0: 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 [join $revisions
2ad0: 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 66 6f 72 65 {','}]')...fore
2ae0: 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 7d 20 ach {rid child}
2af0: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 20 20 20 [state run ".
2b00: 2d 2d 20 50 72 69 6d 61 72 79 20 63 68 69 6c 64 -- Primary child
2b10: 72 65 6e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 ren.. SELECT
2b20: 52 2e 72 69 64 2c 20 52 2e 63 68 69 6c 64 0a 09 R.rid, R.child..
2b30: 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 FROM revis
2b40: 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 ion R.. WHERE
2b50: 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 R.rid IN $th
2b60: 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 eset.. AND
2b70: 20 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 R.child IS NOT
2b80: 4e 55 4c 4c 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 NULL. UNION.
2b90: 20 20 20 2d 2d 20 54 72 61 6e 73 69 74 69 6f 6e -- Transition
2ba0: 20 4e 54 44 42 20 74 6f 20 74 72 75 6e 6b 0a 09 NTDB to trunk..
2bb0: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 SELECT R.rid
2bc0: 2c 20 52 2e 64 62 63 68 69 6c 64 0a 09 20 20 20 , R.dbchild..
2bd0: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e FROM revision
2be0: 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 R.. WHERE R
2bf0: 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 .rid IN $these
2c00: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e t.. AND R.
2c10: 64 62 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e dbchild IS NOT N
2c20: 55 4c 4c 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 ULL. UNION.
2c30: 20 20 2d 2d 20 53 65 63 6f 6e 64 61 72 79 20 28 -- Secondary (
2c40: 62 72 61 6e 63 68 29 20 63 68 69 6c 64 72 65 6e branch) children
2c50: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 .. SELECT R.r
2c60: 69 64 2c 20 42 2e 62 72 69 64 0a 09 20 20 20 20 id, B.brid..
2c70: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 FROM revision
2c80: 52 2c 20 72 65 76 69 73 69 6f 6e 62 72 61 6e 63 R, revisionbranc
2c90: 68 63 68 69 6c 64 72 65 6e 20 42 0a 09 20 20 20 hchildren B..
2ca0: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 WHERE R.rid
2cb0: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 IN $theset..
2cc0: 41 4e 44 20 20 20 20 52 2e 72 69 64 20 3d 20 42 AND R.rid = B
2cd0: 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 .rid.."] {..
2ce0: 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69 6e # Consider movin
2cf0: 67 20 74 68 69 73 20 74 6f 20 74 68 65 20 69 6e g this to the in
2d00: 74 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e 0a tegrity module..
2d10: 09 20 20 20 20 69 66 20 7b 24 72 69 64 20 3d 3d . if {$rid ==
2d20: 20 24 63 68 69 6c 64 7d 20 7b 0a 09 09 74 72 6f $child} {...tro
2d30: 75 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 22 52 uble internal "R
2d40: 65 76 69 73 69 6f 6e 20 24 72 69 64 20 64 65 70 evision $rid dep
2d50: 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 2e 22 ends on itself."
2d60: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6c 61 70 .. }.. lap
2d70: 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 pend dependencie
2d80: 73 28 24 72 69 64 29 20 24 63 68 69 6c 64 0a 09 s($rid) $child..
2d90: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f }. }.. pro
2da0: 63 20 49 6e 69 74 69 61 6c 69 7a 65 42 72 65 61 c InitializeBrea
2db0: 6b 53 74 61 74 65 20 7b 72 65 76 69 73 69 6f 6e kState {revision
2dc0: 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 70 6f s} {..upvar 1 po
2dd0: 73 20 70 6f 73 20 63 72 6f 73 73 20 63 72 6f 73 s pos cross cros
2de0: 73 20 72 61 6e 67 65 20 72 61 6e 67 65 20 64 65 s range range de
2df0: 70 63 20 64 65 70 63 20 64 65 6c 74 61 20 64 65 pc depc delta de
2e00: 6c 74 61 20 5c 0a 09 20 20 20 20 64 65 70 65 6e lta \.. depen
2e10: 64 65 6e 63 69 65 73 20 64 65 70 65 6e 64 65 6e dencies dependen
2e20: 63 69 65 73 0a 0a 09 23 20 46 69 72 73 74 20 77 cies...# First w
2e30: 65 20 63 72 65 61 74 65 20 61 20 6d 61 70 20 6f e create a map o
2e40: 66 20 70 6f 73 69 74 69 6f 6e 73 20 74 6f 20 6d f positions to m
2e50: 61 6b 65 20 69 74 20 65 61 73 69 65 72 20 74 6f ake it easier to
2e60: 0a 09 23 20 64 65 74 65 72 6d 69 6e 65 20 77 68 ..# determine wh
2e70: 65 74 68 65 72 20 61 20 64 65 70 65 6e 64 65 6e ether a dependen
2e80: 63 79 20 63 72 6f 73 73 65 73 20 61 20 70 61 72 cy crosses a par
2e90: 74 69 63 75 6c 61 72 20 69 6e 64 65 78 2e 0a 0a ticular index...
2ea0: 09 61 72 72 61 79 20 73 65 74 20 70 6f 73 20 20 .array set pos
2eb0: 20 7b 7d 0a 09 61 72 72 61 79 20 73 65 74 20 63 {}..array set c
2ec0: 72 6f 73 73 20 7b 7d 0a 09 61 72 72 61 79 20 73 ross {}..array s
2ed0: 65 74 20 64 65 70 63 20 20 7b 7d 0a 09 73 65 74 et depc {}..set
2ee0: 20 72 61 6e 67 65 20 20 20 20 20 20 20 7b 7d 0a range {}.
2ef0: 09 73 65 74 20 6e 20 30 0a 09 66 6f 72 65 61 63 .set n 0..foreac
2f00: 68 20 72 65 76 20 24 72 65 76 69 73 69 6f 6e 73 h rev $revisions
2f10: 20 7b 20 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 { .. lappend
2f20: 20 72 61 6e 67 65 20 24 6e 0a 09 20 20 20 20 73 range $n.. s
2f30: 65 74 20 70 6f 73 28 24 72 65 76 29 20 24 6e 0a et pos($rev) $n.
2f40: 09 20 20 20 20 73 65 74 20 63 72 6f 73 73 28 24 . set cross($
2f50: 6e 29 20 30 0a 09 20 20 20 20 69 6e 63 72 20 6e n) 0.. incr n
2f60: 0a 09 7d 0a 0a 09 23 20 53 65 63 6f 6e 64 6c 79 ..}...# Secondly
2f70: 20 77 65 20 63 6f 75 6e 74 20 74 68 65 20 63 72 we count the cr
2f80: 6f 73 73 69 6e 67 73 20 70 65 72 20 70 6f 73 69 ossings per posi
2f90: 74 69 6f 6e 2c 20 62 79 20 69 74 65 72 61 74 69 tion, by iterati
2fa0: 6e 67 0a 09 23 20 6f 76 65 72 20 74 68 65 20 72 ng..# over the r
2fb0: 65 63 6f 72 64 65 64 20 69 6e 74 65 72 6e 61 6c ecorded internal
2fc0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 0a 0a dependencies...
2fd0: 09 23 20 4e 6f 74 65 3a 20 49 66 20 74 68 65 20 .# Note: If the
2fe0: 74 69 6d 65 73 74 61 6d 70 73 20 61 72 65 20 62 timestamps are b
2ff0: 61 64 6c 79 20 6f 75 74 20 6f 66 20 6f 72 64 65 adly out of orde
3000: 72 20 69 74 20 69 73 0a 09 23 20 20 20 20 20 20 r it is..#
3010: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76 possible to hav
3020: 65 20 61 20 62 61 63 6b 77 61 72 64 20 73 75 63 e a backward suc
3030: 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 cessor dependenc
3040: 79 2c 0a 09 23 20 20 20 20 20 20 20 69 2e 65 2e y,..# i.e.
3050: 20 77 69 74 68 20 73 74 61 72 74 20 3e 20 65 6e with start > en
3060: 64 2e 20 57 65 20 6d 61 79 20 68 61 76 65 20 74 d. We may have t
3070: 6f 20 73 77 61 70 20 74 68 65 20 69 6e 64 69 63 o swap the indic
3080: 65 73 0a 09 23 20 20 20 20 20 20 20 74 6f 20 65 es..# to e
3090: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 66 nsure that the f
30a0: 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 ollowing loop ru
30b0: 6e 73 20 63 6f 72 72 65 63 74 6c 79 2e 0a 09 23 ns correctly...#
30c0: 0a 09 23 20 4e 6f 74 65 20 32 3a 20 73 74 61 72 ..# Note 2: star
30d0: 74 20 3d 3d 20 65 6e 64 20 69 73 20 6e 6f 74 20 t == end is not
30e0: 70 6f 73 73 69 62 6c 65 2e 20 49 74 20 69 6e 64 possible. It ind
30f0: 69 63 61 74 65 73 20 61 0a 09 23 20 20 20 20 20 icates a..#
3100: 20 20 20 20 73 65 6c 66 2d 64 65 70 65 6e 64 65 self-depende
3110: 6e 63 79 20 64 75 65 20 74 6f 20 74 68 65 20 75 ncy due to the u
3120: 6e 69 71 75 65 6e 65 73 73 20 6f 66 20 70 6f 73 niqueness of pos
3130: 69 74 69 6f 6e 73 2c 0a 09 23 20 20 20 20 20 20 itions,..#
3140: 20 20 20 61 6e 64 20 74 68 61 74 20 69 73 20 73 and that is s
3150: 6f 6d 65 74 68 69 6e 67 20 77 65 20 68 61 76 65 omething we have
3160: 20 72 75 6c 65 64 20 6f 75 74 20 61 6c 72 65 61 ruled out alrea
3170: 64 79 2c 20 73 65 65 0a 09 23 20 20 20 20 20 20 dy, see..#
3180: 20 20 20 50 75 6c 6c 49 6e 74 65 72 6e 61 6c 53 PullInternalS
3190: 75 63 63 65 73 73 6f 72 52 65 76 69 73 69 6f 6e uccessorRevision
31a0: 73 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 s....foreach {ri
31b0: 64 20 63 68 69 6c 64 7d 20 5b 61 72 72 61 79 20 d child} [array
31c0: 67 65 74 20 64 65 70 65 6e 64 65 6e 63 69 65 73 get dependencies
31d0: 5d 20 7b 0a 09 20 20 20 20 73 65 74 20 64 6b 65 ] {.. set dke
31e0: 79 20 20 20 20 5b 6c 69 73 74 20 24 72 69 64 20 y [list $rid
31f0: 24 63 68 69 6c 64 5d 0a 09 20 20 20 20 73 65 74 $child].. set
3200: 20 73 74 61 72 74 20 20 20 24 70 6f 73 28 24 72 start $pos($r
3210: 69 64 29 0a 09 20 20 20 20 73 65 74 20 65 6e 64 id).. set end
3220: 20 20 20 20 20 24 70 6f 73 28 24 63 68 69 6c 64 $pos($child
3230: 29 0a 09 20 20 20 20 73 65 74 20 63 72 6f 73 73 ).. set cross
3240: 65 73 20 7b 7d 0a 0a 09 20 20 20 20 69 66 20 7b es {}... if {
3250: 24 73 74 61 72 74 20 3e 20 24 65 6e 64 7d 20 7b $start > $end} {
3260: 0a 09 09 77 68 69 6c 65 20 7b 24 65 6e 64 20 3c ...while {$end <
3270: 20 24 73 74 61 72 74 7d 20 7b 0a 09 09 20 20 20 $start} {...
3280: 20 6c 61 70 70 65 6e 64 20 63 72 6f 73 73 65 73 lappend crosses
3290: 20 24 65 6e 64 0a 09 09 20 20 20 20 69 6e 63 72 $end... incr
32a0: 20 63 72 6f 73 73 28 24 65 6e 64 29 0a 09 09 20 cross($end)...
32b0: 20 20 20 69 6e 63 72 20 65 6e 64 0a 09 09 7d 0a incr end...}.
32c0: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 . } else {...
32d0: 77 68 69 6c 65 20 7b 24 73 74 61 72 74 20 3c 20 while {$start <
32e0: 24 65 6e 64 7d 20 7b 0a 09 09 20 20 20 20 6c 61 $end} {... la
32f0: 70 70 65 6e 64 20 63 72 6f 73 73 65 73 20 24 73 ppend crosses $s
3300: 74 61 72 74 0a 09 09 20 20 20 20 69 6e 63 72 20 tart... incr
3310: 63 72 6f 73 73 28 24 73 74 61 72 74 29 0a 09 09 cross($start)...
3320: 20 20 20 20 69 6e 63 72 20 73 74 61 72 74 0a 09 incr start..
3330: 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73 .}.. }.. s
3340: 65 74 20 64 65 70 63 28 24 64 6b 65 79 29 20 24 et depc($dkey) $
3350: 63 72 6f 73 73 65 73 0a 09 7d 0a 0a 09 49 6e 69 crosses..}...Ini
3360: 74 69 61 6c 69 7a 65 44 65 6c 74 61 73 20 24 72 tializeDeltas $r
3370: 65 76 69 73 69 6f 6e 73 0a 09 72 65 74 75 72 6e evisions..return
3380: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 . }.. proc
3390: 20 49 6e 69 74 69 61 6c 69 7a 65 44 65 6c 74 61 InitializeDelta
33a0: 73 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a s {revisions} {.
33b0: 09 75 70 76 61 72 20 31 20 64 65 6c 74 61 20 64 .upvar 1 delta d
33c0: 65 6c 74 61 0a 0a 09 23 20 50 75 6c 6c 20 74 68 elta...# Pull th
33d0: 65 20 74 69 6d 65 73 74 61 6d 70 73 20 66 6f 72 e timestamps for
33e0: 20 61 6c 6c 20 72 65 76 69 73 69 6f 6e 73 20 69 all revisions i
33f0: 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 73 n the changesets
3400: 20 61 6e 64 0a 09 23 20 63 6f 6d 70 75 74 65 20 and..# compute
3410: 74 68 65 69 72 20 64 65 6c 74 61 73 20 66 6f 72 their deltas for
3420: 20 75 73 65 20 62 79 20 74 68 65 20 62 72 65 61 use by the brea
3430: 6b 20 66 69 6e 64 65 72 2e 0a 0a 09 61 72 72 61 k finder....arra
3440: 79 20 73 65 74 20 64 65 6c 74 61 20 7b 7d 0a 09 y set delta {}..
3450: 61 72 72 61 79 20 73 65 74 20 73 74 61 6d 70 20 array set stamp
3460: 7b 7d 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20 {}...set theset
3470: 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f ('[join $revisio
3480: 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66 6f 72 ns {','}]')..for
3490: 65 61 63 68 20 7b 72 69 64 20 74 69 6d 65 7d 20 each {rid time}
34a0: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 [state run "..
34b0: 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 SELECT R.rid,
34c0: 52 2e 64 61 74 65 0a 09 20 20 20 20 46 52 4f 4d R.date.. FROM
34d0: 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 revision R..
34e0: 20 57 48 45 52 45 20 52 2e 72 69 64 20 49 4e 20 WHERE R.rid IN
34f0: 24 74 68 65 73 65 74 0a 09 22 5d 20 7b 0a 09 20 $theset.."] {..
3500: 20 20 20 73 65 74 20 73 74 61 6d 70 28 24 72 69 set stamp($ri
3510: 64 29 20 24 74 69 6d 65 0a 09 7d 0a 0a 09 73 65 d) $time..}...se
3520: 74 20 6e 20 30 0a 09 66 6f 72 65 61 63 68 20 72 t n 0..foreach r
3530: 69 64 20 5b 6c 72 61 6e 67 65 20 24 72 65 76 69 id [lrange $revi
3540: 73 69 6f 6e 73 20 30 20 65 6e 64 2d 31 5d 20 72 sions 0 end-1] r
3550: 6e 65 78 74 20 5b 6c 72 61 6e 67 65 20 24 72 65 next [lrange $re
3560: 76 69 73 69 6f 6e 73 20 31 20 65 6e 64 5d 20 7b visions 1 end] {
3570: 0a 09 20 20 20 20 73 65 74 20 64 65 6c 74 61 28 .. set delta(
3580: 24 6e 29 20 5b 65 78 70 72 20 7b 24 73 74 61 6d $n) [expr {$stam
3590: 70 28 24 72 6e 65 78 74 29 20 2d 20 24 73 74 61 p($rnext) - $sta
35a0: 6d 70 28 24 72 69 64 29 7d 5d 0a 09 20 20 20 20 mp($rid)}]..
35b0: 69 6e 63 72 20 6e 0a 09 7d 0a 09 72 65 74 75 72 incr n..}..retur
35c0: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f n. }.. pro
35d0: 63 20 46 69 6e 64 42 65 73 74 42 72 65 61 6b 20 c FindBestBreak
35e0: 7b 72 61 6e 67 65 7d 20 7b 0a 09 75 70 76 61 72 {range} {..upvar
35f0: 20 31 20 63 72 6f 73 73 20 63 72 6f 73 73 20 64 1 cross cross d
3600: 65 6c 74 61 20 64 65 6c 74 61 0a 0a 09 23 20 44 elta delta...# D
3610: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 etermine the bes
3620: 74 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e t break location
3630: 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 72 61 in the given ra
3640: 6e 67 65 20 6f 66 0a 09 23 20 70 6f 73 69 74 69 nge of..# positi
3650: 6f 6e 73 2e 20 46 69 72 73 74 20 77 65 20 6c 6f ons. First we lo
3660: 6f 6b 20 66 6f 72 20 74 68 65 20 6c 6f 63 61 74 ok for the locat
3670: 69 6f 6e 73 20 77 69 74 68 20 74 68 65 20 6d 61 ions with the ma
3680: 78 69 6d 61 6c 0a 09 23 20 6e 75 6d 62 65 72 20 ximal..# number
3690: 6f 66 20 63 72 6f 73 73 69 6e 67 73 2e 20 49 66 of crossings. If
36a0: 20 74 68 65 72 65 20 61 72 65 20 73 65 76 65 72 there are sever
36b0: 61 6c 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 al we look for t
36c0: 68 65 0a 09 23 20 73 68 6f 72 74 65 73 74 20 74 he..# shortest t
36d0: 69 6d 65 20 69 6e 74 65 72 76 61 6c 20 61 6d 6f ime interval amo
36e0: 6e 67 20 74 68 65 6d 2e 20 49 66 20 77 65 20 73 ng them. If we s
36f0: 74 69 6c 6c 20 68 61 76 65 20 6d 75 6c 74 69 70 till have multip
3700: 6c 65 0a 09 23 20 70 6f 73 73 69 62 69 6c 69 74 le..# possibilit
3710: 69 65 73 20 61 66 74 65 72 20 74 68 61 74 20 77 ies after that w
3720: 65 20 73 65 6c 65 63 74 20 74 68 65 20 65 61 72 e select the ear
3730: 6c 69 65 73 74 20 6c 6f 63 61 74 69 6f 6e 0a 09 liest location..
3740: 23 20 61 6d 6f 6e 67 20 74 68 65 73 65 2e 0a 0a # among these...
3750: 09 23 20 4e 6f 74 65 3a 20 49 66 20 74 68 65 20 .# Note: If the
3760: 6d 61 78 69 6d 61 6c 20 6e 75 6d 62 65 72 20 6f maximal number o
3770: 66 20 63 72 6f 73 73 69 6e 67 73 20 69 73 20 30 f crossings is 0
3780: 20 74 68 65 6e 20 74 68 65 20 72 61 6e 67 65 0a then the range.
3790: 09 23 20 20 20 20 20 20 20 68 61 73 20 6e 6f 20 .# has no
37a0: 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 internal depende
37b0: 6e 63 69 65 73 2c 20 61 6e 64 20 6e 6f 20 62 72 ncies, and no br
37c0: 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 61 74 0a eak location at.
37d0: 09 23 20 20 20 20 20 20 20 61 6c 6c 2e 20 54 68 .# all. Th
37e0: 69 73 20 70 6f 73 73 69 62 69 6c 69 74 79 20 69 is possibility i
37f0: 73 20 73 69 67 6e 61 6c 65 64 20 76 69 61 20 72 s signaled via r
3800: 65 73 75 6c 74 20 2d 31 2e 0a 0a 09 23 20 4e 6f esult -1....# No
3810: 74 65 3a 20 41 20 72 61 6e 67 65 20 6f 66 20 6c te: A range of l
3820: 65 6e 67 74 68 20 31 20 6f 72 20 6c 65 73 73 20 ength 1 or less
3830: 63 61 6e 6e 6f 74 20 68 61 76 65 20 69 6e 74 65 cannot have inte
3840: 72 6e 61 6c 0a 09 23 20 20 20 20 20 20 20 64 65 rnal..# de
3850: 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 20 74 pendencies, as t
3860: 68 61 74 20 6e 65 65 64 73 20 61 74 20 6c 65 61 hat needs at lea
3870: 73 74 20 74 77 6f 20 72 65 76 69 73 69 6f 6e 73 st two revisions
3880: 20 69 6e 0a 09 23 20 20 20 20 20 20 20 74 68 65 in..# the
3890: 20 72 61 6e 67 65 2e 0a 0a 09 69 66 20 7b 5b 6c range....if {[l
38a0: 6c 65 6e 67 74 68 20 24 72 61 6e 67 65 5d 20 3c length $range] <
38b0: 20 32 7d 20 7b 20 72 65 74 75 72 6e 20 2d 31 20 2} { return -1
38c0: 7d 0a 0a 09 73 65 74 20 6d 61 78 20 2d 31 0a 09 }...set max -1..
38d0: 73 65 74 20 62 65 73 74 20 7b 7d 0a 0a 09 66 6f set best {}...fo
38e0: 72 65 61 63 68 20 6c 6f 63 61 74 69 6f 6e 20 24 reach location $
38f0: 72 61 6e 67 65 20 7b 0a 09 20 20 20 20 73 65 74 range {.. set
3900: 20 63 72 6f 73 73 69 6e 67 73 20 24 63 72 6f 73 crossings $cros
3910: 73 28 24 6c 6f 63 61 74 69 6f 6e 29 0a 09 20 20 s($location)..
3920: 20 20 69 66 20 7b 24 63 72 6f 73 73 69 6e 67 73 if {$crossings
3930: 20 3e 20 24 6d 61 78 7d 20 7b 0a 09 09 73 65 74 > $max} {...set
3940: 20 6d 61 78 20 20 24 63 72 6f 73 73 69 6e 67 73 max $crossings
3950: 0a 09 09 73 65 74 20 62 65 73 74 20 5b 6c 69 73 ...set best [lis
3960: 74 20 24 6c 6f 63 61 74 69 6f 6e 5d 0a 09 09 63 t $location]...c
3970: 6f 6e 74 69 6e 75 65 0a 09 20 20 20 20 7d 20 65 ontinue.. } e
3980: 6c 73 65 69 66 20 7b 24 63 72 6f 73 73 69 6e 67 lseif {$crossing
3990: 73 20 3d 3d 20 24 6d 61 78 7d 20 7b 0a 09 09 6c s == $max} {...l
39a0: 61 70 70 65 6e 64 20 62 65 73 74 20 24 6c 6f 63 append best $loc
39b0: 61 74 69 6f 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a ation.. }..}.
39c0: 0a 09 69 66 20 7b 24 6d 61 78 20 3d 3d 20 30 7d ..if {$max == 0}
39d0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 72 65 { re
39e0: 74 75 72 6e 20 2d 31 20 7d 0a 09 69 66 20 7b 5b turn -1 }..if {[
39f0: 6c 6c 65 6e 67 74 68 20 24 62 65 73 74 5d 20 3d llength $best] =
3a00: 3d 20 31 7d 20 7b 20 72 65 74 75 72 6e 20 5b 6c = 1} { return [l
3a10: 69 6e 64 65 78 20 24 62 65 73 74 20 30 5d 20 7d index $best 0] }
3a20: 0a 0a 09 73 65 74 20 6c 6f 63 61 74 69 6f 6e 73 ...set locations
3a30: 20 24 62 65 73 74 0a 09 73 65 74 20 62 65 73 74 $best..set best
3a40: 20 7b 7d 0a 09 73 65 74 20 6d 69 6e 20 2d 31 0a {}..set min -1.
3a50: 0a 09 66 6f 72 65 61 63 68 20 6c 6f 63 61 74 69 ..foreach locati
3a60: 6f 6e 20 24 6c 6f 63 61 74 69 6f 6e 73 20 7b 0a on $locations {.
3a70: 09 20 20 20 20 73 65 74 20 69 6e 74 65 72 76 61 . set interva
3a80: 6c 20 24 64 65 6c 74 61 28 24 6c 6f 63 61 74 69 l $delta($locati
3a90: 6f 6e 29 0a 09 20 20 20 20 69 66 20 7b 28 24 6d on).. if {($m
3aa0: 69 6e 20 3c 20 30 29 20 7c 7c 20 28 24 69 6e 74 in < 0) || ($int
3ab0: 65 72 76 61 6c 20 3c 20 24 6d 69 6e 29 7d 20 7b erval < $min)} {
3ac0: 0a 09 09 73 65 74 20 6d 69 6e 20 20 24 69 6e 74 ...set min $int
3ad0: 65 72 76 61 6c 0a 09 09 73 65 74 20 62 65 73 74 erval...set best
3ae0: 20 5b 6c 69 73 74 20 24 6c 6f 63 61 74 69 6f 6e [list $location
3af0: 5d 0a 09 20 20 20 20 7d 20 65 6c 73 65 69 66 20 ].. } elseif
3b00: 7b 24 69 6e 74 65 72 76 61 6c 20 3d 3d 20 24 6d {$interval == $m
3b10: 69 6e 7d 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 in} {...lappend
3b20: 62 65 73 74 20 24 6c 6f 63 61 74 69 6f 6e 0a 09 best $location..
3b30: 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b 5b }..}...if {[
3b40: 6c 6c 65 6e 67 74 68 20 24 62 65 73 74 5d 20 3d llength $best] =
3b50: 3d 20 31 7d 20 7b 20 72 65 74 75 72 6e 20 5b 6c = 1} { return [l
3b60: 69 6e 64 65 78 20 24 62 65 73 74 20 30 5d 20 7d index $best 0] }
3b70: 0a 0a 09 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65 ...return [linde
3b80: 78 20 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65 x [lsort -intege
3b90: 72 20 2d 69 6e 63 72 65 61 73 69 6e 67 20 24 62 r -increasing $b
3ba0: 65 73 74 5d 20 30 5d 0a 20 20 20 20 7d 0a 0a 20 est] 0]. }..
3bb0: 20 20 20 70 72 6f 63 20 43 75 74 41 74 20 7b 6c proc CutAt {l
3bc0: 6f 63 61 74 69 6f 6e 7d 20 7b 0a 09 75 70 76 61 ocation} {..upva
3bd0: 72 20 31 20 63 72 6f 73 73 20 63 72 6f 73 73 20 r 1 cross cross
3be0: 64 65 70 63 20 64 65 70 63 0a 0a 09 23 20 49 74 depc depc...# It
3bf0: 20 77 61 73 20 64 65 63 69 64 65 64 20 74 6f 20 was decided to
3c00: 73 70 6c 69 74 20 74 68 65 20 63 68 61 6e 67 65 split the change
3c10: 73 65 74 20 61 74 20 74 68 65 20 67 69 76 65 6e set at the given
3c20: 0a 09 23 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 ..# location. Th
3c30: 69 73 20 63 75 74 73 20 61 20 6e 75 6d 62 65 72 is cuts a number
3c40: 20 6f 66 20 64 65 70 65 6e 64 65 6e 63 69 65 73 of dependencies
3c50: 2e 20 48 65 72 65 20 77 65 20 75 70 64 61 74 65 . Here we update
3c60: 0a 09 23 20 74 68 65 20 63 72 6f 73 73 20 69 6e ..# the cross in
3c70: 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 formation so tha
3c80: 74 20 74 68 65 20 62 72 65 61 6b 20 66 69 6e 64 t the break find
3c90: 65 72 20 68 61 73 20 61 63 63 75 72 61 74 65 0a er has accurate.
3ca0: 09 23 20 64 61 74 61 20 77 68 65 6e 20 77 65 20 .# data when we
3cb0: 6c 6f 6f 6b 20 61 74 20 74 68 65 20 67 65 6e 65 look at the gene
3cc0: 72 61 74 65 64 20 66 72 61 67 6d 65 6e 74 73 2e rated fragments.
3cd0: 0a 0a 09 73 65 74 20 73 69 78 20 5b 6c 6f 67 20 ...set six [log
3ce0: 76 69 73 69 62 6c 65 3f 20 36 5d 0a 0a 09 66 6f visible? 6]...fo
3cf0: 72 65 61 63 68 20 7b 64 65 70 20 72 61 6e 67 65 reach {dep range
3d00: 7d 20 5b 61 72 72 61 79 20 67 65 74 20 64 65 70 } [array get dep
3d10: 63 5d 20 7b 0a 09 20 20 20 20 23 20 43 68 65 63 c] {.. # Chec
3d20: 6b 20 61 6c 6c 20 64 65 70 65 6e 64 65 6e 63 69 k all dependenci
3d30: 65 73 20 73 74 69 6c 6c 20 6b 6e 6f 77 6e 2c 20 es still known,
3d40: 74 61 6b 65 20 74 68 65 69 72 20 72 61 6e 67 65 take their range
3d50: 20 61 6e 64 0a 09 20 20 20 20 23 20 73 65 65 20 and.. # see
3d60: 69 66 20 74 68 65 20 62 72 65 61 6b 20 6c 6f 63 if the break loc
3d70: 61 74 69 6f 6e 20 66 61 6c 6c 73 20 77 69 74 68 ation falls with
3d80: 69 6e 2e 0a 0a 09 20 20 20 20 42 6f 72 64 65 72 in.... Border
3d90: 20 24 72 61 6e 67 65 20 73 20 65 0a 09 20 20 20 $range s e..
3da0: 20 69 66 20 7b 24 6c 6f 63 61 74 69 6f 6e 20 3c if {$location <
3db0: 20 24 73 7d 20 63 6f 6e 74 69 6e 75 65 20 3b 20 $s} continue ;
3dc0: 23 20 62 72 65 61 6b 20 62 65 66 6f 72 65 20 72 # break before r
3dd0: 61 6e 67 65 2c 20 69 67 6e 6f 72 65 0a 09 20 20 ange, ignore..
3de0: 20 20 69 66 20 7b 24 6c 6f 63 61 74 69 6f 6e 20 if {$location
3df0: 3e 20 24 65 7d 20 63 6f 6e 74 69 6e 75 65 20 3b > $e} continue ;
3e00: 20 23 20 62 72 65 61 6b 20 61 66 74 65 72 20 72 # break after r
3e10: 61 6e 67 65 2c 20 69 67 6e 6f 72 65 2e 0a 0a 09 ange, ignore....
3e20: 20 20 20 20 23 20 54 68 69 73 20 64 65 70 65 6e # This depen
3e30: 64 65 6e 63 79 20 63 72 6f 73 73 65 73 20 74 68 dency crosses th
3e40: 65 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e e break location
3e50: 2e 20 57 65 20 72 65 6d 6f 76 65 20 69 74 0a 09 . We remove it..
3e60: 20 20 20 20 23 20 66 72 6f 6d 20 74 68 65 20 63 # from the c
3e70: 72 6f 73 73 69 6e 67 73 20 63 6f 75 6e 74 65 72 rossings counter
3e80: 73 2c 20 61 6e 64 20 74 68 65 6e 20 61 6c 73 6f s, and then also
3e90: 20 66 72 6f 6d 20 74 68 65 20 73 65 74 0a 09 20 from the set..
3ea0: 20 20 20 23 20 6f 66 20 6b 6e 6f 77 6e 20 64 65 # of known de
3eb0: 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 20 77 pendencies, as w
3ec0: 65 20 61 72 65 20 64 6f 6e 65 20 77 69 74 68 20 e are done with
3ed0: 69 74 2e 0a 0a 09 20 20 20 20 66 6f 72 65 61 63 it.... foreac
3ee0: 68 20 6c 6f 63 20 24 64 65 70 63 28 24 64 65 70 h loc $depc($dep
3ef0: 29 20 7b 20 69 6e 63 72 20 63 72 6f 73 73 28 24 ) { incr cross($
3f00: 6c 6f 63 29 20 2d 31 20 7d 0a 09 20 20 20 20 75 loc) -1 }.. u
3f10: 6e 73 65 74 20 64 65 70 63 28 24 64 65 70 29 0a nset depc($dep).
3f20: 0a 09 20 20 20 20 69 66 20 7b 21 24 73 69 78 7d .. if {!$six}
3f30: 20 63 6f 6e 74 69 6e 75 65 0a 0a 09 20 20 20 20 continue...
3f40: 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 struct::list ass
3f50: 69 67 6e 20 24 64 65 70 20 70 61 72 65 6e 74 20 ign $dep parent
3f60: 63 68 69 6c 64 0a 09 20 20 20 20 6c 6f 67 20 77 child.. log w
3f70: 72 69 74 65 20 36 20 63 73 65 74 73 20 22 42 72 rite 6 csets "Br
3f80: 6f 6b 65 20 64 65 70 65 6e 64 65 6e 63 79 20 5b oke dependency [
3f90: 50 44 20 24 70 61 72 65 6e 74 5d 20 2d 2d 3e 20 PD $parent] -->
3fa0: 5b 50 44 20 24 63 68 69 6c 64 5d 22 0a 09 7d 0a [PD $child]"..}.
3fb0: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a ..return. }..
3fc0: 20 20 20 20 23 20 50 72 69 6e 74 20 69 64 65 6e # Print iden
3fd0: 74 69 66 79 69 6e 67 20 64 61 74 61 20 66 6f 72 tifying data for
3fe0: 20 61 20 72 65 76 69 73 69 6f 6e 20 28 70 72 6f a revision (pro
3ff0: 6a 65 63 74 2c 20 66 69 6c 65 2c 20 64 6f 74 74 ject, file, dott
4000: 65 64 20 72 65 76 0a 20 20 20 20 23 20 6e 75 6d ed rev. # num
4010: 62 65 72 29 2c 20 66 6f 72 20 68 69 67 68 20 76 ber), for high v
4020: 65 72 62 6f 73 69 74 79 20 6c 6f 67 20 6f 75 74 erbosity log out
4030: 70 75 74 2e 0a 0a 20 20 20 20 70 72 6f 63 20 50 put... proc P
4040: 44 20 7b 69 64 7d 20 7b 0a 09 66 6f 72 65 61 63 D {id} {..foreac
4050: 68 20 7b 70 20 66 20 72 7d 20 5b 73 74 61 74 65 h {p f r} [state
4060: 20 72 75 6e 20 7b 0a 09 09 53 45 4c 45 43 54 20 run {...SELECT
4070: 50 2e 6e 61 6d 65 20 2c 20 46 2e 6e 61 6d 65 2c P.name , F.name,
4080: 20 52 2e 72 65 76 0a 09 09 46 52 4f 4d 20 72 65 R.rev...FROM re
4090: 76 69 73 69 6f 6e 20 52 2c 20 66 69 6c 65 20 46 vision R, file F
40a0: 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09 09 57 48 , project P...WH
40b0: 45 52 45 20 52 2e 72 69 64 20 3d 20 24 69 64 0a ERE R.rid = $id.
40c0: 09 09 41 4e 44 20 20 20 52 2e 66 69 64 20 3d 20 ..AND R.fid =
40d0: 46 2e 66 69 64 0a 09 09 41 4e 44 20 20 20 46 2e F.fid...AND F.
40e0: 70 69 64 20 3d 20 50 2e 70 69 64 0a 09 7d 5d 20 pid = P.pid..}]
40f0: 62 72 65 61 6b 0a 09 72 65 74 75 72 6e 20 22 27 break..return "'
4100: 24 70 20 3a 20 24 66 2f 24 72 27 22 0a 20 20 20 $p : $f/$r'".
4110: 20 7d 0a 0a 20 20 20 20 23 20 50 72 69 6e 74 69 }.. # Printi
4120: 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 72 ng one or more r
4130: 61 6e 67 65 73 2c 20 66 6f 72 6d 61 74 74 65 64 anges, formatted
4140: 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 69 72 , and only their
4150: 20 62 6f 72 64 65 72 20 74 6f 0a 20 20 20 20 23 border to. #
4160: 20 6b 65 65 70 20 74 68 65 20 73 74 72 69 6e 67 keep the string
4170: 73 20 73 68 6f 72 74 2e 0a 0a 20 20 20 20 70 72 s short... pr
4180: 6f 63 20 50 52 73 20 7b 72 61 6e 67 65 73 7d 20 oc PRs {ranges}
4190: 7b 0a 09 72 65 74 75 72 6e 20 5b 73 74 72 75 63 {..return [struc
41a0: 74 3a 3a 6c 69 73 74 20 6d 61 70 20 24 72 61 6e t::list map $ran
41b0: 67 65 73 20 5b 6d 79 70 72 6f 63 20 50 52 5d 5d ges [myproc PR]]
41c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 . }.. proc
41d0: 20 50 52 20 7b 72 61 6e 67 65 7d 20 7b 0a 09 42 PR {range} {..B
41e0: 6f 72 64 65 72 20 24 72 61 6e 67 65 20 73 20 65 order $range s e
41f0: 0a 09 72 65 74 75 72 6e 20 3c 24 7b 73 7d 2e 2e ..return <${s}..
4200: 2e 24 7b 65 7d 3e 0a 20 20 20 20 7d 0a 0a 20 20 .${e}>. }..
4210: 20 20 70 72 6f 63 20 42 6f 72 64 65 72 20 7b 72 proc Border {r
4220: 61 6e 67 65 20 73 76 20 65 76 7d 20 7b 0a 09 75 ange sv ev} {..u
4230: 70 76 61 72 20 31 20 24 73 76 20 73 20 24 65 76 pvar 1 $sv s $ev
4240: 20 65 0a 09 73 65 74 20 73 20 5b 6c 69 6e 64 65 e..set s [linde
4250: 78 20 24 72 61 6e 67 65 20 30 5d 0a 09 73 65 74 x $range 0]..set
4260: 20 65 20 5b 6c 69 6e 64 65 78 20 24 72 61 6e 67 e [lindex $rang
4270: 65 20 65 6e 64 5d 0a 09 72 65 74 75 72 6e 0a 20 e end]..return.
4280: 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 }.. # # ##
4290: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 ### ##### #####
42a0: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 ### ############
42b0: 23 0a 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 #.. typevaria
42c0: 62 6c 65 20 6d 79 63 68 61 6e 67 65 73 65 74 73 ble mychangesets
42d0: 20 20 20 20 7b 7d 20 3b 20 23 20 4c 69 73 74 20 {} ; # List
42e0: 6f 66 20 61 6c 6c 20 6b 6e 6f 77 6e 20 63 68 61 of all known cha
42f0: 6e 67 65 73 65 74 73 2e 0a 20 20 20 20 74 79 70 ngesets.. typ
4300: 65 76 61 72 69 61 62 6c 65 20 6d 79 72 65 76 6d evariable myrevm
4310: 61 70 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 ap -array {} ; #
4320: 20 4d 61 70 20 66 72 6f 6d 20 72 65 76 69 73 69 Map from revisi
4330: 6f 6e 73 20 74 6f 20 74 68 65 69 72 20 63 68 61 ons to their cha
4340: 6e 67 65 73 65 74 2e 0a 0a 20 20 20 20 74 79 70 ngeset... typ
4350: 65 6d 65 74 68 6f 64 20 61 6c 6c 20 7b 7d 20 7b emethod all {} {
4360: 20 72 65 74 75 72 6e 20 24 6d 79 63 68 61 6e 67 return $mychang
4370: 65 73 65 74 73 20 7d 0a 0a 20 20 20 20 23 20 23 esets }.. # #
4380: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 ## ### ##### ##
4390: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 ###### #########
43a0: 23 23 23 23 0a 20 20 20 20 23 23 20 43 6f 6e 66 ####. ## Conf
43b0: 69 67 75 72 61 74 69 6f 6e 0a 0a 20 20 20 20 70 iguration.. p
43c0: 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65 69 6e ragma -hastypein
43d0: 66 6f 20 20 20 20 6e 6f 20 20 3b 20 23 20 6e 6f fo no ; # no
43e0: 20 74 79 70 65 20 69 6e 74 72 6f 73 70 65 63 74 type introspect
43f0: 69 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61 20 2d ion. pragma -
4400: 68 61 73 69 6e 66 6f 20 20 20 20 20 20 20 20 6e hasinfo n
4410: 6f 20 20 3b 20 23 20 6e 6f 20 6f 62 6a 65 63 74 o ; # no object
4420: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20 introspection.
4430: 20 20 20 70 72 61 67 6d 61 20 2d 73 69 6d 70 6c pragma -simpl
4440: 65 64 69 73 70 61 74 63 68 20 79 65 73 20 3b 20 edispatch yes ;
4450: 23 20 73 69 6d 70 6c 65 20 66 61 73 74 20 64 69 # simple fast di
4460: 73 70 61 74 63 68 0a 0a 20 20 20 20 23 20 23 20 spatch.. # #
4470: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 ## ### ##### ###
4480: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 ##### ##########
4490: 23 23 23 0a 7d 0a 0a 6e 61 6d 65 73 70 61 63 65 ###.}..namespace
44a0: 20 65 76 61 6c 20 3a 3a 76 63 3a 3a 66 6f 73 73 eval ::vc::foss
44b0: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a il::import::cvs:
44c0: 3a 70 72 6f 6a 65 63 74 20 7b 0a 20 20 20 20 6e :project {. n
44d0: 61 6d 65 73 70 61 63 65 20 65 78 70 6f 72 74 20 amespace export
44e0: 72 65 76 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 rev. namespac
44f0: 65 20 65 76 61 6c 20 72 65 76 20 7b 0a 09 6e 61 e eval rev {..na
4500: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a mespace import :
4510: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 :vc::fossil::imp
4520: 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a ort::cvs::state.
4530: 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 .namespace impor
4540: 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d t ::vc::tools::m
4550: 69 73 63 3a 3a 2a 0a 09 6e 61 6d 65 73 70 61 63 isc::*..namespac
4560: 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 e import ::vc::t
4570: 6f 6f 6c 73 3a 3a 74 72 6f 75 62 6c 65 0a 09 6e ools::trouble..n
4580: 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 amespace import
4590: 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 ::vc::tools::log
45a0: 0a 09 6c 6f 67 20 72 65 67 69 73 74 65 72 20 63 ..log register c
45b0: 73 65 74 73 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 sets. }.}..#
45c0: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 # ## ### ##### #
45d0: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 ####### ########
45e0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 ##### ##########
45f0: 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 52 ###########.## R
4600: 65 61 64 79 0a 0a 70 61 63 6b 61 67 65 20 70 72 eady..package pr
4610: 6f 76 69 64 65 20 76 63 3a 3a 66 6f 73 73 69 6c ovide vc::fossil
4620: 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 ::import::cvs::p
4630: 72 6f 6a 65 63 74 3a 3a 72 65 76 20 31 2e 30 0a roject::rev 1.0.
4640: 72 65 74 75 72 6e 0a return.