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 6c 61 70 70 65 6e 64 20 6d 79 72 65 76 { lappend myrev
0790: 6d 61 70 28 24 72 29 20 24 73 65 6c 66 20 7d 0a map($r) $self }.
07a0: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 .return. }..
07b0: 20 20 20 6d 65 74 68 6f 64 20 69 64 20 20 20 20 method id
07c0: 20 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 {} { return
07d0: 24 6d 79 69 64 20 7d 0a 20 20 20 20 6d 65 74 68 $myid }. meth
07e0: 6f 64 20 72 65 76 69 73 69 6f 6e 73 20 7b 7d 20 od revisions {}
07f0: 7b 20 72 65 74 75 72 6e 20 24 6d 79 72 65 76 69 { return $myrevi
0800: 73 69 6f 6e 73 20 7d 0a 20 20 20 20 6d 65 74 68 sions }. meth
0810: 6f 64 20 64 61 74 61 20 20 20 20 20 20 7b 7d 20 od data {}
0820: 7b 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 { return [list $
0830: 6d 79 70 72 6f 6a 65 63 74 20 24 6d 79 74 79 70 myproject $mytyp
0840: 65 20 24 6d 79 73 72 63 69 64 5d 20 7d 0a 0a 20 e $mysrcid] }..
0850: 20 20 20 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 method bysymb
0860: 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e ol {} { return
0870: 20 5b 65 78 70 72 20 7b 24 6d 79 74 79 70 65 20 [expr {$mytype
0880: 65 71 20 22 73 79 6d 22 7d 5d 20 7d 0a 20 20 20 eq "sym"}] }.
0890: 20 6d 65 74 68 6f 64 20 62 79 72 65 76 69 73 69 method byrevisi
08a0: 6f 6e 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 5b on {} { return [
08b0: 65 78 70 72 20 7b 24 6d 79 74 79 70 65 20 65 71 expr {$mytype eq
08c0: 20 22 72 65 76 22 7d 5d 20 7d 0a 0a 20 20 20 20 "rev"}] }..
08d0: 6d 65 74 68 6f 64 20 73 65 74 70 6f 73 20 7b 70 method setpos {p
08e0: 7d 20 7b 20 73 65 74 20 6d 79 70 6f 73 20 24 70 } { set mypos $p
08f0: 20 3b 20 72 65 74 75 72 6e 20 7d 0a 20 20 20 20 ; return }.
0900: 6d 65 74 68 6f 64 20 70 6f 73 20 20 20 20 7b 7d method pos {}
0910: 20 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 70 6f { return $mypo
0920: 73 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 s }.. method
0930: 69 73 62 72 61 6e 63 68 20 7b 7d 20 7b 0a 09 72 isbranch {} {..r
0940: 65 74 75 72 6e 20 5b 65 78 70 72 20 7b 28 24 6d eturn [expr {($m
0950: 79 74 79 70 65 20 65 71 20 22 73 79 6d 22 29 20 ytype eq "sym")
0960: 26 26 0a 09 09 20 20 20 20 20 20 28 24 6d 79 62 &&... ($myb
0970: 72 61 6e 63 68 63 6f 64 65 20 3d 3d 20 5b 73 74 ranchcode == [st
0980: 61 74 65 20 6f 6e 65 20 7b 0a 09 09 09 20 20 53 ate one {.... S
0990: 45 4c 45 43 54 20 74 79 70 65 20 46 52 4f 4d 20 ELECT type FROM
09a0: 73 79 6d 62 6f 6c 20 57 48 45 52 45 20 73 69 64 symbol WHERE sid
09b0: 20 3d 20 24 6d 79 73 72 63 69 64 0a 09 09 20 20 = $mysrcid...
09c0: 20 20 20 20 7d 5d 29 7d 5d 0a 20 20 20 20 7d 0a }])}]. }.
09d0: 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20 . # result =
09e0: 64 69 63 74 20 28 72 65 76 69 73 69 6f 6e 20 2d dict (revision -
09f0: 3e 20 6c 69 73 74 20 28 63 68 61 6e 67 65 73 65 > list (changese
0a00: 74 29 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 t)). method s
0a10: 75 63 63 65 73 73 6f 72 6d 61 70 20 7b 7d 20 7b uccessormap {} {
0a20: 0a 09 23 20 4e 4f 54 45 20 2f 20 46 55 54 55 52 ..# NOTE / FUTUR
0a30: 45 3a 20 50 6f 73 73 69 62 6c 65 20 62 6f 74 74 E: Possible bott
0a40: 6c 65 6e 65 63 6b 2e 0a 09 61 72 72 61 79 20 73 leneck...array s
0a50: 65 74 20 74 6d 70 20 7b 7d 0a 09 66 6f 72 65 61 et tmp {}..forea
0a60: 63 68 20 7b 72 65 76 20 63 68 69 6c 64 72 65 6e ch {rev children
0a70: 7d 20 5b 24 73 65 6c 66 20 6e 65 78 74 6d 61 70 } [$self nextmap
0a80: 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 63 68 ] {.. foreach
0a90: 20 63 68 69 6c 64 20 24 63 68 69 6c 64 72 65 6e child $children
0aa0: 20 7b 0a 09 09 23 20 38 2e 35 20 6c 61 70 70 65 {...# 8.5 lappe
0ab0: 6e 64 20 74 6d 70 28 24 72 65 76 29 20 7b 2a 7d nd tmp($rev) {*}
0ac0: 24 6d 79 72 65 76 6d 61 70 28 24 63 68 69 6c 64 $myrevmap($child
0ad0: 29 0a 09 09 66 6f 72 65 61 63 68 20 63 73 65 74 )...foreach cset
0ae0: 20 24 6d 79 72 65 76 6d 61 70 28 24 63 68 69 6c $myrevmap($chil
0af0: 64 29 20 7b 0a 09 09 20 20 20 20 6c 61 70 70 65 d) {... lappe
0b00: 6e 64 20 74 6d 70 28 24 72 65 76 29 20 24 63 73 nd tmp($rev) $cs
0b10: 65 74 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 et...}.. }..
0b20: 20 20 20 73 65 74 20 74 6d 70 28 24 72 65 76 29 set tmp($rev)
0b30: 20 5b 6c 73 6f 72 74 20 2d 75 6e 69 71 75 65 20 [lsort -unique
0b40: 24 74 6d 70 28 24 72 65 76 29 5d 0a 09 7d 0a 09 $tmp($rev)]..}..
0b50: 72 65 74 75 72 6e 20 5b 61 72 72 61 79 20 67 65 return [array ge
0b60: 74 20 74 6d 70 5d 0a 20 20 20 20 7d 0a 0a 20 20 t tmp]. }..
0b70: 20 20 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 method success
0b80: 6f 72 73 20 7b 7d 20 7b 0a 09 23 20 4e 4f 54 45 ors {} {..# NOTE
0b90: 20 2f 20 46 55 54 55 52 45 3a 20 50 6f 73 73 69 / FUTURE: Possi
0ba0: 62 6c 65 20 62 6f 74 74 6c 65 6e 65 63 6b 2e 0a ble bottleneck..
0bb0: 09 73 65 74 20 63 73 65 74 73 20 7b 7d 0a 09 66 .set csets {}..f
0bc0: 6f 72 65 61 63 68 20 7b 5f 20 63 68 69 6c 64 72 oreach {_ childr
0bd0: 65 6e 7d 20 5b 24 73 65 6c 66 20 6e 65 78 74 6d en} [$self nextm
0be0: 61 70 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 ap] {.. forea
0bf0: 63 68 20 63 68 69 6c 64 20 24 63 68 69 6c 64 72 ch child $childr
0c00: 65 6e 20 7b 0a 09 09 23 20 38 2e 35 20 6c 61 70 en {...# 8.5 lap
0c10: 70 65 6e 64 20 63 73 65 74 73 20 7b 2a 7d 24 6d pend csets {*}$m
0c20: 79 72 65 76 6d 61 70 28 24 63 68 69 6c 64 29 0a yrevmap($child).
0c30: 09 09 66 6f 72 65 61 63 68 20 63 73 65 74 20 24 ..foreach cset $
0c40: 6d 79 72 65 76 6d 61 70 28 24 63 68 69 6c 64 29 myrevmap($child)
0c50: 20 7b 0a 09 09 20 20 20 20 6c 61 70 70 65 6e 64 {... lappend
0c60: 20 63 73 65 74 73 20 24 63 73 65 74 0a 09 09 7d csets $cset...}
0c70: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72 65 74 75 .. }..}..retu
0c80: 72 6e 20 5b 6c 73 6f 72 74 20 2d 75 6e 69 71 75 rn [lsort -uniqu
0c90: 65 20 24 63 73 65 74 73 5d 0a 20 20 20 20 7d 0a e $csets]. }.
0ca0: 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20 . # result =
0cb0: 64 69 63 74 20 28 72 65 76 69 73 69 6f 6e 20 2d dict (revision -
0cc0: 3e 20 6c 69 73 74 20 28 63 68 61 6e 67 65 73 65 > list (changese
0cd0: 74 29 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 70 t)). method p
0ce0: 72 65 64 65 63 65 73 73 6f 72 6d 61 70 20 7b 7d redecessormap {}
0cf0: 20 7b 0a 09 23 20 4e 4f 54 45 20 2f 20 46 55 54 {..# NOTE / FUT
0d00: 55 52 45 3a 20 50 6f 73 73 69 62 6c 65 20 62 6f URE: Possible bo
0d10: 74 74 6c 65 6e 65 63 6b 2e 0a 09 61 72 72 61 79 ttleneck...array
0d20: 20 73 65 74 20 74 6d 70 20 7b 7d 0a 09 66 6f 72 set tmp {}..for
0d30: 65 61 63 68 20 7b 72 65 76 20 63 68 69 6c 64 72 each {rev childr
0d40: 65 6e 7d 20 5b 24 73 65 6c 66 20 70 72 65 6d 61 en} [$self prema
0d50: 70 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 63 p] {.. foreac
0d60: 68 20 63 68 69 6c 64 20 24 63 68 69 6c 64 72 65 h child $childre
0d70: 6e 20 7b 0a 09 09 23 20 38 2e 35 20 6c 61 70 70 n {...# 8.5 lapp
0d80: 65 6e 64 20 74 6d 70 28 24 72 65 76 29 20 7b 2a end tmp($rev) {*
0d90: 7d 24 6d 79 72 65 76 6d 61 70 28 24 63 68 69 6c }$myrevmap($chil
0da0: 64 29 0a 09 09 66 6f 72 65 61 63 68 20 63 73 65 d)...foreach cse
0db0: 74 20 24 6d 79 72 65 76 6d 61 70 28 24 63 68 69 t $myrevmap($chi
0dc0: 6c 64 29 20 7b 0a 09 09 20 20 20 20 6c 61 70 70 ld) {... lapp
0dd0: 65 6e 64 20 74 6d 70 28 24 72 65 76 29 20 24 63 end tmp($rev) $c
0de0: 73 65 74 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 set...}.. }..
0df0: 20 20 20 20 73 65 74 20 74 6d 70 28 24 72 65 76 set tmp($rev
0e00: 29 20 5b 6c 73 6f 72 74 20 2d 75 6e 69 71 75 65 ) [lsort -unique
0e10: 20 24 74 6d 70 28 24 72 65 76 29 5d 0a 09 7d 0a $tmp($rev)]..}.
0e20: 09 72 65 74 75 72 6e 20 5b 61 72 72 61 79 20 67 .return [array g
0e30: 65 74 20 74 6d 70 5d 0a 20 20 20 20 7d 0a 0a 20 et tmp]. }..
0e40: 20 20 20 23 20 72 65 76 69 73 69 6f 6e 20 2d 3e # revision ->
0e50: 20 6c 69 73 74 20 28 72 65 76 69 73 69 6f 6e 29 list (revision)
0e60: 0a 20 20 20 20 6d 65 74 68 6f 64 20 6e 65 78 74 . method next
0e70: 6d 61 70 20 7b 7d 20 7b 0a 09 69 66 20 7b 5b 6c map {} {..if {[l
0e80: 6c 65 6e 67 74 68 20 24 6d 79 6e 65 78 74 6d 61 length $mynextma
0e90: 70 5d 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 p]} { return $my
0ea0: 6e 65 78 74 6d 61 70 20 7d 0a 09 50 75 6c 6c 53 nextmap }..PullS
0eb0: 75 63 63 65 73 73 6f 72 52 65 76 69 73 69 6f 6e uccessorRevision
0ec0: 73 20 74 6d 70 20 24 6d 79 72 65 76 69 73 69 6f s tmp $myrevisio
0ed0: 6e 73 0a 09 73 65 74 20 6d 79 6e 65 78 74 6d 61 ns..set mynextma
0ee0: 70 20 5b 61 72 72 61 79 20 67 65 74 20 74 6d 70 p [array get tmp
0ef0: 5d 0a 09 72 65 74 75 72 6e 20 24 6d 79 6e 65 78 ]..return $mynex
0f00: 74 6d 61 70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 tmap. }..
0f10: 23 20 72 65 76 69 73 69 6f 6e 20 2d 3e 20 6c 69 # revision -> li
0f20: 73 74 20 28 72 65 76 69 73 69 6f 6e 29 0a 20 20 st (revision).
0f30: 20 20 6d 65 74 68 6f 64 20 70 72 65 6d 61 70 20 method premap
0f40: 7b 7d 20 7b 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 {} {..if {[lleng
0f50: 74 68 20 24 6d 79 70 72 65 6d 61 70 5d 7d 20 7b th $mypremap]} {
0f60: 20 72 65 74 75 72 6e 20 24 6d 79 70 72 65 6d 61 return $myprema
0f70: 70 20 7d 0a 09 50 75 6c 6c 50 72 65 64 65 63 65 p }..PullPredece
0f80: 73 73 6f 72 52 65 76 69 73 69 6f 6e 73 20 74 6d ssorRevisions tm
0f90: 70 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 0a 09 p $myrevisions..
0fa0: 73 65 74 20 6d 79 70 72 65 6d 61 70 20 5b 61 72 set mypremap [ar
0fb0: 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 09 72 65 ray get tmp]..re
0fc0: 74 75 72 6e 20 24 6d 79 70 72 65 6d 61 70 0a 20 turn $mypremap.
0fd0: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 }.. method
0fe0: 20 62 72 65 61 6b 69 6e 74 65 72 6e 61 6c 64 65 breakinternalde
0ff0: 70 65 6e 64 65 6e 63 69 65 73 20 7b 7d 20 7b 0a pendencies {} {.
1000: 09 23 20 54 68 69 73 20 6d 65 74 68 6f 64 20 69 .# This method i
1010: 6e 73 70 65 63 74 73 20 74 68 65 20 63 68 61 6e nspects the chan
1020: 67 65 73 65 74 73 20 66 6f 72 20 69 6e 74 65 72 gesets for inter
1030: 6e 61 6c 0a 09 23 20 64 65 70 65 6e 64 65 6e 63 nal..# dependenc
1040: 69 65 73 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 ies. Nothing is
1050: 64 6f 6e 65 20 69 66 20 74 68 65 72 65 20 61 72 done if there ar
1060: 65 20 6e 6f 0a 09 23 20 73 75 63 68 2e 20 4f 74 e no..# such. Ot
1070: 68 65 72 77 69 73 65 20 74 68 65 20 63 68 61 6e herwise the chan
1080: 67 65 73 65 74 20 69 73 20 73 70 6c 69 74 20 69 geset is split i
1090: 6e 74 6f 20 61 20 73 65 74 20 6f 66 0a 09 23 20 nto a set of..#
10a0: 66 72 61 67 6d 65 6e 74 73 20 77 69 74 68 6f 75 fragments withou
10b0: 74 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e t internal depen
10c0: 64 65 6e 63 69 65 73 2c 20 74 72 61 6e 73 66 6f dencies, transfo
10d0: 72 6d 69 6e 67 20 74 68 65 0a 09 23 20 69 6e 74 rming the..# int
10e0: 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 ernal dependenci
10f0: 65 73 20 69 6e 74 6f 20 65 78 74 65 72 6e 61 6c es into external
1100: 20 6f 6e 65 73 2e 20 54 68 65 20 6e 65 77 20 63 ones. The new c
1110: 68 61 6e 67 65 73 65 74 73 0a 09 23 20 61 72 65 hangesets..# are
1120: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69 added to the li
1130: 73 74 20 6f 66 20 61 6c 6c 20 63 68 61 6e 67 65 st of all change
1140: 73 65 74 73 2e 0a 0a 09 23 20 57 65 20 70 65 72 sets....# We per
1150: 66 6f 72 6d 20 61 6c 6c 20 6e 65 63 65 73 73 61 form all necessa
1160: 72 79 20 73 70 6c 69 74 73 20 69 6e 20 6f 6e 65 ry splits in one
1170: 20 67 6f 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 go, instead of
1180: 6f 6e 6c 79 0a 09 23 20 6f 6e 65 2e 20 54 68 65 only..# one. The
1190: 20 70 72 65 76 69 6f 75 73 20 61 6c 67 6f 72 69 previous algori
11a0: 74 68 6d 2c 20 61 64 61 70 74 65 64 20 66 72 6f thm, adapted fro
11b0: 6d 20 63 76 73 32 73 76 6e 2c 20 63 6f 6d 70 75 m cvs2svn, compu
11c0: 74 65 64 0a 09 23 20 61 20 6c 6f 74 20 6f 66 20 ted..# a lot of
11d0: 73 74 61 74 65 20 77 68 69 63 68 20 77 61 73 20 state which was
11e0: 74 68 72 6f 77 6e 20 61 77 61 79 20 61 6e 64 20 thrown away and
11f0: 74 68 65 6e 20 63 6f 6d 70 75 74 65 64 20 61 67 then computed ag
1200: 61 69 6e 0a 09 23 20 66 6f 72 20 65 61 63 68 20 ain..# for each
1210: 6f 66 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 of the fragments
1220: 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 65 . It should be e
1230: 61 73 69 65 72 20 74 6f 20 75 70 64 61 74 65 20 asier to update
1240: 61 6e 64 0a 09 23 20 72 65 75 73 65 20 74 68 61 and..# reuse tha
1250: 74 20 73 74 61 74 65 2e 0a 0a 09 23 20 54 68 65 t state....# The
1260: 20 63 6f 64 65 20 63 68 65 63 6b 73 20 6f 6e 6c code checks onl
1270: 79 20 73 75 63 65 73 73 6f 72 20 64 65 70 65 6e y sucessor depen
1280: 64 65 6e 63 69 65 73 2c 20 61 73 20 74 68 69 73 dencies, as this
1290: 0a 09 23 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c ..# automaticall
12a0: 79 20 63 6f 76 65 72 73 20 74 68 65 20 70 72 65 y covers the pre
12b0: 64 65 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 decessor depende
12c0: 6e 63 69 65 73 20 61 73 20 77 65 6c 6c 20 28 41 ncies as well (A
12d0: 0a 09 23 20 73 75 63 63 65 73 73 6f 72 20 64 65 ..# successor de
12e0: 70 65 6e 64 65 6e 63 79 20 61 20 2d 3e 20 62 20 pendency a -> b
12f0: 69 73 20 61 6c 73 6f 20 61 20 70 72 65 64 65 63 is also a predec
1300: 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 79 essor dependency
1310: 0a 09 23 20 62 20 2d 3e 20 61 29 2e 0a 0a 09 23 ..# b -> a)....#
1320: 20 41 72 72 61 79 20 6f 66 20 64 65 70 65 6e 64 Array of depend
1330: 65 6e 63 69 65 73 20 28 70 61 72 65 6e 74 20 2d encies (parent -
1340: 3e 20 63 68 69 6c 64 29 2e 20 54 68 69 73 20 69 > child). This i
1350: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 0a 09 23 s pulled from..#
1360: 20 74 68 65 20 73 74 61 74 65 2c 20 61 6e 64 20 the state, and
1370: 6c 69 6d 69 74 65 64 20 74 6f 20 73 75 63 63 65 limited to succe
1380: 73 73 6f 72 73 20 77 69 74 68 69 6e 20 74 68 65 ssors within the
1390: 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 61 72 changeset....ar
13a0: 72 61 79 20 73 65 74 20 64 65 70 65 6e 64 65 6e ray set dependen
13b0: 63 69 65 73 20 7b 7d 0a 09 50 75 6c 6c 49 6e 74 cies {}..PullInt
13c0: 65 72 6e 61 6c 53 75 63 63 65 73 73 6f 72 52 65 ernalSuccessorRe
13d0: 76 69 73 69 6f 6e 73 20 64 65 70 65 6e 64 65 6e visions dependen
13e0: 63 69 65 73 20 24 6d 79 72 65 76 69 73 69 6f 6e cies $myrevision
13f0: 73 0a 09 69 66 20 7b 21 5b 61 72 72 61 79 20 73 s..if {![array s
1400: 69 7a 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73 ize dependencies
1410: 5d 7d 20 7b 72 65 74 75 72 6e 20 30 7d 20 3b 20 ]} {return 0} ;
1420: 23 20 4e 6f 74 68 69 6e 67 20 74 6f 20 62 72 65 # Nothing to bre
1430: 61 6b 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 ak....log write
1440: 36 20 63 73 65 74 73 20 2e 2e 2e 3c 24 6d 79 69 6 csets ...<$myi
1450: 64 3e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e d>..............
1460: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
1470: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................
1480: 2e 2e 2e 2e 2e 2e 2e 2e 2e 0a 0a 09 23 20 57 65 ............# We
1490: 20 68 61 76 65 20 69 6e 74 65 72 6e 61 6c 20 64 have internal d
14a0: 65 70 65 6e 64 65 6e 63 69 65 73 20 74 6f 20 62 ependencies to b
14b0: 72 65 61 6b 2e 20 57 65 20 6e 6f 77 20 69 74 65 reak. We now ite
14c0: 72 61 74 65 20 6f 76 65 72 0a 09 23 20 61 6c 6c rate over..# all
14d0: 20 70 6f 73 69 74 69 6f 6e 73 20 69 6e 20 74 68 positions in th
14e0: 65 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 e list (which is
14f0: 20 63 68 72 6f 6e 6f 6c 6f 67 69 63 61 6c 2c 20 chronological,
1500: 61 74 20 6c 65 61 73 74 0a 09 23 20 61 73 20 66 at least..# as f
1510: 61 72 20 61 73 20 74 68 65 20 74 69 6d 65 73 74 ar as the timest
1520: 61 6d 70 73 20 61 72 65 20 63 6f 72 72 65 63 74 amps are correct
1530: 20 61 6e 64 20 75 6e 69 71 75 65 29 20 61 6e 64 and unique) and
1540: 0a 09 23 20 64 65 74 65 72 6d 69 6e 65 20 74 68 ..# determine th
1550: 65 20 62 65 73 74 20 70 6f 73 69 74 69 6f 6e 20 e best position
1560: 66 6f 72 20 74 68 65 20 62 72 65 61 6b 2c 20 62 for the break, b
1570: 79 20 74 72 79 69 6e 67 20 74 6f 0a 09 23 20 62 y trying to..# b
1580: 72 65 61 6b 20 61 73 20 6d 61 6e 79 20 64 65 70 reak as many dep
1590: 65 6e 64 65 6e 63 69 65 73 20 61 73 20 70 6f 73 endencies as pos
15a0: 73 69 62 6c 65 20 69 6e 20 6f 6e 65 20 67 6f 2e sible in one go.
15b0: 20 57 68 65 6e 20 61 0a 09 23 20 62 72 65 61 6b When a..# break
15c0: 20 77 61 73 20 66 6f 75 6e 64 20 74 68 69 73 20 was found this
15d0: 69 73 20 72 65 64 6f 6e 65 20 66 6f 72 20 74 68 is redone for th
15e0: 65 20 66 72 61 67 6d 65 6e 74 73 20 63 6f 6d 69 e fragments comi
15f0: 6e 67 20 61 6e 64 0a 09 23 20 61 66 74 65 72 2c ng and..# after,
1600: 20 61 66 74 65 72 20 75 70 64 69 6e 67 20 74 68 after upding th
1610: 65 20 63 72 6f 73 73 69 6e 67 20 69 6e 66 6f 72 e crossing infor
1620: 6d 61 74 69 6f 6e 2e 0a 0a 09 23 20 44 61 74 61 mation....# Data
1630: 20 73 74 72 75 63 74 75 72 65 73 3a 0a 09 23 20 structures:..#
1640: 4d 61 70 3a 20 20 50 4f 53 20 20 20 72 65 76 69 Map: POS revi
1650: 73 69 6f 6e 20 69 64 20 20 20 20 20 20 2d 3e 20 sion id ->
1660: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73 74 position in list
1670: 2e 0a 09 23 20 20 20 20 20 20 20 43 52 4f 53 53 ...# CROSS
1680: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73 position in lis
1690: 74 20 2d 3e 20 6e 75 6d 62 65 72 20 6f 66 20 64 t -> number of d
16a0: 65 70 65 6e 64 65 6e 63 69 65 73 20 63 72 6f 73 ependencies cros
16b0: 73 69 6e 67 20 69 74 0a 09 23 20 20 20 20 20 20 sing it..#
16c0: 20 44 45 50 43 20 20 64 65 70 65 6e 64 65 6e 63 DEPC dependenc
16d0: 79 20 20 20 20 20 20 20 2d 3e 20 70 6f 73 69 74 y -> posit
16e0: 69 6f 6e 73 20 69 74 20 63 72 6f 73 73 65 73 0a ions it crosses.
16f0: 09 23 20 4c 69 73 74 3a 20 52 41 4e 47 45 20 4f .# List: RANGE O
1700: 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 f the positions
1710: 69 74 73 65 6c 66 2e 0a 09 23 20 41 20 64 65 70 itself...# A dep
1720: 65 6e 64 65 6e 63 79 20 69 73 20 61 20 73 69 6e endency is a sin
1730: 67 6c 65 2d 65 6c 65 6d 65 6e 74 20 6d 61 70 20 gle-element map
1740: 70 61 72 65 6e 74 20 2d 3e 20 63 68 69 6c 64 0a parent -> child.
1750: 0a 09 49 6e 69 74 69 61 6c 69 7a 65 42 72 65 61 ..InitializeBrea
1760: 6b 53 74 61 74 65 20 24 6d 79 72 65 76 69 73 69 kState $myrevisi
1770: 6f 6e 73 0a 0a 09 73 65 74 20 66 72 61 67 6d 65 ons...set fragme
1780: 6e 74 73 20 7b 7d 0a 09 73 65 74 20 70 65 6e 64 nts {}..set pend
1790: 69 6e 67 20 20 20 5b 6c 69 73 74 20 24 72 61 6e ing [list $ran
17a0: 67 65 5d 0a 09 73 65 74 20 61 74 20 20 20 20 20 ge]..set at
17b0: 20 20 20 30 0a 09 61 72 72 61 79 20 73 65 74 20 0..array set
17c0: 62 72 65 61 6b 73 20 7b 7d 0a 0a 09 77 68 69 6c breaks {}...whil
17d0: 65 20 7b 24 61 74 20 3c 20 5b 6c 6c 65 6e 67 74 e {$at < [llengt
17e0: 68 20 24 70 65 6e 64 69 6e 67 5d 7d 20 7b 0a 09 h $pending]} {..
17f0: 20 20 20 20 73 65 74 20 63 75 72 72 65 6e 74 20 set current
1800: 5b 6c 69 6e 64 65 78 20 24 70 65 6e 64 69 6e 67 [lindex $pending
1810: 20 24 61 74 5d 0a 0a 09 20 20 20 20 6c 6f 67 20 $at]... log
1820: 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22 2e write 6 csets ".
1830: 20 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 . .. ... .....
1840: 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e ........ .......
1850: 2e 2e 2e 2e 2e 2e 22 0a 09 20 20 20 20 6c 6f 67 ......".. log
1860: 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22 write 6 csets "
1870: 53 63 68 65 64 75 6c 65 64 20 20 20 5b 6a 6f 69 Scheduled [joi
1880: 6e 20 5b 50 52 73 20 5b 6c 72 61 6e 67 65 20 24 n [PRs [lrange $
1890: 70 65 6e 64 69 6e 67 20 24 61 74 20 65 6e 64 5d pending $at end]
18a0: 5d 20 7b 20 7d 5d 22 0a 09 20 20 20 20 6c 6f 67 ] { }]".. log
18b0: 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22 write 6 csets "
18c0: 43 6f 6e 73 69 64 65 72 69 6e 67 20 5b 50 52 20 Considering [PR
18d0: 24 63 75 72 72 65 6e 74 5d 20 5c 5b 24 61 74 2f $current] \[$at/
18e0: 5b 6c 6c 65 6e 67 74 68 20 24 70 65 6e 64 69 6e [llength $pendin
18f0: 67 5d 5c 5d 22 0a 0a 09 20 20 20 20 73 65 74 20 g]\]"... set
1900: 62 65 73 74 20 5b 46 69 6e 64 42 65 73 74 42 72 best [FindBestBr
1910: 65 61 6b 20 24 63 75 72 72 65 6e 74 5d 0a 0a 09 eak $current]...
1920: 20 20 20 20 69 66 20 7b 24 62 65 73 74 20 3c 20 if {$best <
1930: 30 7d 20 7b 0a 09 09 23 20 54 68 65 20 69 6e 73 0} {...# The ins
1940: 70 65 63 74 65 64 20 72 61 6e 67 65 20 68 61 73 pected range has
1950: 20 6e 6f 20 69 6e 74 65 72 6e 61 6c 0a 09 09 23 no internal...#
1960: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 54 dependencies. T
1970: 68 69 73 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 his is a complet
1980: 65 20 66 72 61 67 6d 65 6e 74 2e 0a 09 09 6c 61 e fragment....la
1990: 70 70 65 6e 64 20 66 72 61 67 6d 65 6e 74 73 20 ppend fragments
19a0: 24 63 75 72 72 65 6e 74 0a 0a 09 09 6c 6f 67 20 $current....log
19b0: 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22 4e write 6 csets "N
19c0: 6f 20 62 72 65 61 6b 73 2c 20 66 69 6e 61 6c 22 o breaks, final"
19d0: 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 .. } else {..
19e0: 09 23 20 53 70 6c 69 74 20 74 68 65 20 72 61 6e .# Split the ran
19f0: 67 65 20 61 6e 64 20 73 63 68 65 64 75 6c 65 20 ge and schedule
1a00: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 66 72 the resulting fr
1a10: 61 67 6d 65 6e 74 73 0a 09 09 23 20 66 6f 72 20 agments...# for
1a20: 66 75 72 74 68 65 72 20 69 6e 73 70 65 63 74 69 further inspecti
1a30: 6f 6e 2e 20 52 65 6d 65 6d 62 65 72 20 74 68 65 on. Remember the
1a40: 20 6e 75 6d 62 65 72 20 6f 66 0a 09 09 23 20 64 number of...# d
1a50: 65 70 65 6e 64 65 6e 63 69 65 73 20 63 75 74 20 ependencies cut
1a60: 62 65 66 6f 72 65 20 77 65 20 72 65 6d 6f 76 65 before we remove
1a70: 20 74 68 65 6d 20 66 72 6f 6d 0a 09 09 23 20 63 them from...# c
1a80: 6f 6e 73 69 64 65 72 61 74 69 6f 6e 2c 20 66 6f onsideration, fo
1a90: 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 r documentation
1aa0: 6c 61 74 65 72 2e 0a 0a 09 09 73 65 74 20 62 72 later.....set br
1ab0: 65 61 6b 73 28 24 62 65 73 74 29 20 24 63 72 6f eaks($best) $cro
1ac0: 73 73 28 24 62 65 73 74 29 0a 0a 09 09 6c 6f 67 ss($best)....log
1ad0: 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22 write 6 csets "
1ae0: 42 65 73 74 20 62 72 65 61 6b 20 40 20 24 62 65 Best break @ $be
1af0: 73 74 2c 20 63 75 74 74 69 6e 67 20 5b 6e 73 70 st, cutting [nsp
1b00: 20 24 63 72 6f 73 73 28 24 62 65 73 74 29 20 64 $cross($best) d
1b10: 65 70 65 6e 64 65 6e 63 79 20 64 65 70 65 6e 64 ependency depend
1b20: 65 6e 63 69 65 73 5d 22 0a 0a 09 09 23 20 4e 6f encies]"....# No
1b30: 74 65 3a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 te: The value of
1b40: 20 62 65 73 74 20 69 73 20 61 6e 20 61 62 6f 6c best is an abol
1b50: 75 74 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 0a ute location in.
1b60: 09 09 23 20 6d 79 72 65 76 69 73 69 6f 6e 73 2e ..# myrevisions.
1b70: 20 55 73 65 20 74 68 65 20 73 74 61 72 74 20 6f Use the start o
1b80: 66 20 63 75 72 72 65 6e 74 20 74 6f 20 6d 61 6b f current to mak
1b90: 65 20 69 74 20 61 6e 0a 09 09 23 20 69 6e 64 65 e it an...# inde
1ba0: 78 20 61 62 73 6f 6c 75 74 65 20 74 6f 20 63 75 x absolute to cu
1bb0: 72 72 65 6e 74 2e 0a 0a 09 09 73 65 74 20 62 72 rrent.....set br
1bc0: 65 6c 20 5b 65 78 70 72 20 7b 24 62 65 73 74 20 el [expr {$best
1bd0: 2d 20 5b 6c 69 6e 64 65 78 20 24 63 75 72 72 65 - [lindex $curre
1be0: 6e 74 20 30 5d 7d 5d 0a 09 09 73 65 74 20 62 6e nt 0]}]...set bn
1bf0: 65 78 74 20 24 62 72 65 6c 20 3b 20 69 6e 63 72 ext $brel ; incr
1c00: 20 62 6e 65 78 74 0a 09 09 73 65 74 20 66 72 61 bnext...set fra
1c10: 67 62 65 66 6f 72 65 20 5b 6c 72 61 6e 67 65 20 gbefore [lrange
1c20: 24 63 75 72 72 65 6e 74 20 30 20 24 62 72 65 6c $current 0 $brel
1c30: 5d 0a 09 09 73 65 74 20 66 72 61 67 61 66 74 65 ]...set fragafte
1c40: 72 20 20 5b 6c 72 61 6e 67 65 20 24 63 75 72 72 r [lrange $curr
1c50: 65 6e 74 20 24 62 6e 65 78 74 20 65 6e 64 5d 0a ent $bnext end].
1c60: 0a 09 09 6c 6f 67 20 77 72 69 74 65 20 36 20 63 ...log write 6 c
1c70: 73 65 74 73 20 22 4e 65 77 20 70 69 65 63 65 73 sets "New pieces
1c80: 20 20 5b 50 52 20 24 66 72 61 67 62 65 66 6f 72 [PR $fragbefor
1c90: 65 5d 20 5b 50 52 20 24 66 72 61 67 61 66 74 65 e] [PR $fragafte
1ca0: 72 5d 22 0a 0a 09 09 69 66 20 7b 21 5b 6c 6c 65 r]"....if {![lle
1cb0: 6e 67 74 68 20 24 66 72 61 67 62 65 66 6f 72 65 ngth $fragbefore
1cc0: 5d 7d 20 7b 0a 09 09 20 20 20 20 74 72 6f 75 62 ]} {... troub
1cd0: 6c 65 20 69 6e 74 65 72 6e 61 6c 20 22 54 72 69 le internal "Tri
1ce0: 65 64 20 74 6f 20 73 70 6c 69 74 20 6f 66 66 20 ed to split off
1cf0: 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 72 a zero-length fr
1d00: 61 67 6d 65 6e 74 20 61 74 20 74 68 65 20 62 65 agment at the be
1d10: 67 69 6e 6e 69 6e 67 22 0a 09 09 7d 0a 09 09 69 ginning"...}...i
1d20: 66 20 7b 21 5b 6c 6c 65 6e 67 74 68 20 24 66 72 f {![llength $fr
1d30: 61 67 61 66 74 65 72 5d 7d 20 7b 0a 09 09 20 20 agafter]} {...
1d40: 20 20 74 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e trouble intern
1d50: 61 6c 20 22 54 72 69 65 64 20 74 6f 20 73 70 6c al "Tried to spl
1d60: 69 74 20 6f 66 66 20 61 20 7a 65 72 6f 2d 6c 65 it off a zero-le
1d70: 6e 67 74 68 20 66 72 61 67 6d 65 6e 74 20 61 74 ngth fragment at
1d80: 20 74 68 65 20 65 6e 64 22 0a 09 09 7d 0a 0a 09 the end"...}...
1d90: 09 6c 61 70 70 65 6e 64 20 70 65 6e 64 69 6e 67 .lappend pending
1da0: 20 24 66 72 61 67 62 65 66 6f 72 65 20 24 66 72 $fragbefore $fr
1db0: 61 67 61 66 74 65 72 0a 09 09 43 75 74 41 74 20 agafter...CutAt
1dc0: 24 62 65 73 74 0a 09 20 20 20 20 7d 0a 0a 09 20 $best.. }...
1dd0: 20 20 20 69 6e 63 72 20 61 74 0a 09 7d 0a 0a 09 incr at..}...
1de0: 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74 log write 6 cset
1df0: 73 20 22 2e 20 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e s ". . .. ... ..
1e00: 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e ... ........ ...
1e10: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 22 0a 0a 09 23 20 .........."...#
1e20: 28 2a 29 20 57 65 20 63 6c 65 61 72 20 6f 75 74 (*) We clear out
1e30: 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 the associated
1e40: 70 61 72 74 20 6f 66 20 74 68 65 20 6d 79 72 65 part of the myre
1e50: 76 6d 61 70 0a 09 23 20 69 6e 2d 6d 65 6d 6f 72 vmap..# in-memor
1e60: 79 20 69 6e 64 65 78 20 69 6e 20 70 72 65 70 61 y index in prepa
1e70: 72 61 74 69 6f 6e 20 66 6f 72 20 6e 65 77 20 64 ration for new d
1e80: 61 74 61 2e 20 41 20 73 69 6d 70 6c 65 20 75 6e ata. A simple un
1e90: 73 65 74 0a 09 23 20 69 73 20 65 6e 6f 75 67 68 set..# is enough
1ea0: 2c 20 77 65 20 68 61 76 65 20 6e 6f 20 73 79 6d , we have no sym
1eb0: 62 6f 6c 20 63 68 61 6e 67 65 73 65 74 73 20 61 bol changesets a
1ec0: 74 20 74 68 69 73 20 74 69 6d 65 2c 20 61 6e 64 t this time, and
1ed0: 0a 09 23 20 74 68 75 73 20 6e 65 76 65 72 20 6d ..# thus never m
1ee0: 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 ore than one ref
1ef0: 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6c 69 erence in the li
1f00: 73 74 2e 0a 0a 09 66 6f 72 65 61 63 68 20 72 20 st....foreach r
1f10: 24 6d 79 72 65 76 69 73 69 6f 6e 73 20 7b 20 75 $myrevisions { u
1f20: 6e 73 65 74 20 6d 79 72 65 76 6d 61 70 28 24 72 nset myrevmap($r
1f30: 29 20 7d 0a 0a 09 23 20 43 72 65 61 74 65 20 63 ) }...# Create c
1f40: 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20 74 68 hangesets for th
1f50: 65 20 66 72 61 67 6d 65 6e 74 73 2c 20 72 65 75 e fragments, reu
1f60: 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 sing the current
1f70: 20 6f 6e 65 0a 09 23 20 66 6f 72 20 74 68 65 20 one..# for the
1f80: 66 69 72 73 74 20 66 72 61 67 6d 65 6e 74 2e 20 first fragment.
1f90: 57 65 20 73 6f 72 74 20 74 68 65 6d 20 69 6e 20 We sort them in
1fa0: 6f 72 64 65 72 20 74 6f 20 61 6c 6c 6f 77 0a 09 order to allow..
1fb0: 23 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 67 # checking for g
1fc0: 61 70 73 20 61 6e 64 20 6e 69 63 65 20 6d 65 73 aps and nice mes
1fd0: 73 61 67 65 73 2e 0a 0a 09 73 65 74 20 66 72 61 sages....set fra
1fe0: 67 6d 65 6e 74 73 20 5b 6c 73 6f 72 74 20 2d 69 gments [lsort -i
1ff0: 6e 64 65 78 20 30 20 2d 69 6e 74 65 67 65 72 20 ndex 0 -integer
2000: 24 66 72 61 67 6d 65 6e 74 73 5d 0a 0a 09 23 70 $fragments]...#p
2010: 75 74 73 20 5c 74 2e 5b 6a 6f 69 6e 20 5b 50 52 uts \t.[join [PR
2020: 73 20 24 66 72 61 67 6d 65 6e 74 73 5d 20 2e 5c s $fragments] .\
2030: 6e 5c 74 2e 5d 2e 0a 0a 09 42 6f 72 64 65 72 20 n\t.]....Border
2040: 5b 6c 69 6e 64 65 78 20 24 66 72 61 67 6d 65 6e [lindex $fragmen
2050: 74 73 20 30 5d 20 66 69 72 73 74 73 20 66 69 72 ts 0] firsts fir
2060: 73 74 65 0a 0a 09 69 66 20 7b 24 66 69 72 73 74 ste...if {$first
2070: 73 20 21 3d 20 30 7d 20 7b 0a 09 20 20 20 20 74 s != 0} {.. t
2080: 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 rouble internal
2090: 22 42 61 64 20 66 72 61 67 6d 65 6e 74 20 73 74 "Bad fragment st
20a0: 61 72 74 20 40 20 24 66 69 72 73 74 73 2c 20 67 art @ $firsts, g
20b0: 61 70 2c 20 6f 72 20 62 65 66 6f 72 65 20 62 65 ap, or before be
20c0: 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 72 ginning of the r
20d0: 61 6e 67 65 22 0a 09 7d 0a 0a 09 73 65 74 20 6c ange"..}...set l
20e0: 61 73 74 65 20 24 66 69 72 73 74 65 0a 09 66 6f aste $firste..fo
20f0: 72 65 61 63 68 20 66 72 61 67 6d 65 6e 74 20 5b reach fragment [
2100: 6c 72 61 6e 67 65 20 24 66 72 61 67 6d 65 6e 74 lrange $fragment
2110: 73 20 31 20 65 6e 64 5d 20 7b 0a 09 20 20 20 20 s 1 end] {..
2120: 42 6f 72 64 65 72 20 24 66 72 61 67 6d 65 6e 74 Border $fragment
2130: 20 73 20 65 0a 09 20 20 20 20 69 66 20 7b 24 6c s e.. if {$l
2140: 61 73 74 65 20 21 3d 20 28 24 73 20 2d 20 31 29 aste != ($s - 1)
2150: 7d 20 7b 0a 09 09 74 72 6f 75 62 6c 65 20 69 6e } {...trouble in
2160: 74 65 72 6e 61 6c 20 22 42 61 64 20 66 72 61 67 ternal "Bad frag
2170: 6d 65 6e 74 20 62 6f 72 64 65 72 20 3c 24 6c 61 ment border <$la
2180: 73 74 65 20 7c 20 24 73 3e 2c 20 67 61 70 20 6f ste | $s>, gap o
2190: 72 20 6f 76 65 72 6c 61 70 22 0a 09 20 20 20 20 r overlap"..
21a0: 7d 0a 0a 09 20 20 20 20 73 65 74 20 6e 65 77 20 }... set new
21b0: 5b 24 74 79 70 65 20 25 41 55 54 4f 25 20 24 6d [$type %AUTO% $m
21c0: 79 70 72 6f 6a 65 63 74 20 24 6d 79 74 79 70 65 yproject $mytype
21d0: 20 24 6d 79 73 72 63 69 64 20 5b 6c 72 61 6e 67 $mysrcid [lrang
21e0: 65 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 20 24 e $myrevisions $
21f0: 73 20 24 65 5d 5d 0a 0a 20 20 20 20 20 20 20 20 s $e]]..
2200: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 34 20 log write 4
2210: 63 73 65 74 73 20 22 42 72 65 61 6b 69 6e 67 20 csets "Breaking
2220: 3c 24 6d 79 69 64 3e 20 40 20 24 6c 61 73 74 65 <$myid> @ $laste
2230: 2c 20 6e 65 77 20 3c 5b 24 6e 65 77 20 69 64 5d , new <[$new id]
2240: 3e 2c 20 63 75 74 74 69 6e 67 20 24 62 72 65 61 >, cutting $brea
2250: 6b 73 28 24 6c 61 73 74 65 29 22 0a 0a 09 20 20 ks($laste)"...
2260: 20 20 73 65 74 20 6c 61 73 74 65 20 24 65 0a 09 set laste $e..
2270: 7d 0a 0a 09 69 66 20 7b 24 6c 61 73 74 65 20 21 }...if {$laste !
2280: 3d 20 28 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 72 = ([llength $myr
2290: 65 76 69 73 69 6f 6e 73 5d 2d 31 29 7d 20 7b 0a evisions]-1)} {.
22a0: 09 20 20 20 20 74 72 6f 75 62 6c 65 20 69 6e 74 . trouble int
22b0: 65 72 6e 61 6c 20 22 42 61 64 20 66 72 61 67 6d ernal "Bad fragm
22c0: 65 6e 74 20 65 6e 64 20 40 20 24 6c 61 73 74 65 ent end @ $laste
22d0: 2c 20 67 61 70 2c 20 6f 72 20 62 65 79 6f 6e 64 , gap, or beyond
22e0: 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 end of the rang
22f0: 65 22 0a 09 7d 0a 0a 09 23 20 50 75 74 20 74 68 e"..}...# Put th
2300: 65 20 66 69 72 73 74 20 66 72 61 67 6d 65 6e 74 e first fragment
2310: 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e into the curren
2320: 74 20 63 68 61 6e 67 65 73 65 74 2c 20 61 6e 64 t changeset, and
2330: 0a 09 23 20 75 70 64 61 74 65 20 74 68 65 20 69 ..# update the i
2340: 6e 2d 6d 65 6d 6f 72 79 20 69 6e 64 65 78 2e 20 n-memory index.
2350: 57 65 20 63 61 6e 20 73 69 6d 70 6c 79 20 28 72 We can simply (r
2360: 65 29 61 64 64 20 74 68 65 0a 09 23 20 72 65 76 e)add the..# rev
2370: 69 73 69 6f 6e 73 20 62 65 63 61 75 73 65 20 77 isions because w
2380: 65 20 63 6c 65 61 72 65 64 20 74 68 65 20 70 72 e cleared the pr
2390: 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74 69 6e eviously existin
23a0: 67 0a 09 23 20 69 6e 66 6f 72 6d 61 74 69 6f 6e g..# information
23b0: 2c 20 73 65 65 20 28 2a 29 20 61 62 6f 76 65 2e , see (*) above.
23c0: 20 50 65 72 73 69 73 74 65 6e 63 65 20 64 6f 65 Persistence doe
23d0: 73 20 6e 6f 74 20 6d 61 74 74 65 72 0a 09 23 20 s not matter..#
23e0: 68 65 72 65 2c 20 6e 6f 6e 65 20 6f 66 20 74 68 here, none of th
23f0: 65 20 63 68 61 6e 67 65 73 65 74 73 20 68 61 73 e changesets has
2400: 20 62 65 65 6e 20 73 61 76 65 64 20 74 6f 20 74 been saved to t
2410: 68 65 0a 09 23 20 70 65 72 73 69 73 74 65 6e 74 he..# persistent
2420: 20 73 74 61 74 65 20 79 65 74 2e 0a 0a 09 73 65 state yet....se
2430: 74 20 6d 79 72 65 76 69 73 69 6f 6e 73 20 5b 6c t myrevisions [l
2440: 72 61 6e 67 65 20 24 6d 79 72 65 76 69 73 69 6f range $myrevisio
2450: 6e 73 20 30 20 24 66 69 72 73 74 65 5d 0a 09 66 ns 0 $firste]..f
2460: 6f 72 65 61 63 68 20 72 20 24 6d 79 72 65 76 69 oreach r $myrevi
2470: 73 69 6f 6e 73 20 7b 20 6c 61 70 70 65 6e 64 20 sions { lappend
2480: 6d 79 72 65 76 6d 61 70 28 24 72 29 20 24 73 65 myrevmap($r) $se
2490: 6c 66 20 7d 0a 0a 09 72 65 74 75 72 6e 20 31 0a lf }...return 1.
24a0: 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f }.. metho
24b0: 64 20 70 65 72 73 69 73 74 20 7b 7d 20 7b 0a 09 d persist {} {..
24c0: 73 65 74 20 74 69 64 20 24 6d 79 63 73 74 79 70 set tid $mycstyp
24d0: 65 28 24 6d 79 74 79 70 65 29 0a 09 73 65 74 20 e($mytype)..set
24e0: 70 69 64 20 5b 24 6d 79 70 72 6f 6a 65 63 74 20 pid [$myproject
24f0: 69 64 5d 0a 09 73 65 74 20 70 6f 73 20 30 0a 0a id]..set pos 0..
2500: 09 73 74 61 74 65 20 74 72 61 6e 73 61 63 74 69 .state transacti
2510: 6f 6e 20 7b 0a 09 20 20 20 20 73 74 61 74 65 20 on {.. state
2520: 72 75 6e 20 7b 0a 09 09 49 4e 53 45 52 54 20 49 run {...INSERT I
2530: 4e 54 4f 20 63 68 61 6e 67 65 73 65 74 20 28 63 NTO changeset (c
2540: 69 64 2c 20 20 20 70 69 64 2c 20 20 74 79 70 65 id, pid, type
2550: 2c 20 73 72 63 29 0a 09 09 56 41 4c 55 45 53 20 , src)...VALUES
2560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 (
2570: 24 6d 79 69 64 2c 20 24 70 69 64 2c 20 24 74 69 $myid, $pid, $ti
2580: 64 2c 20 24 6d 79 73 72 63 69 64 29 3b 0a 09 20 d, $mysrcid);..
2590: 20 20 20 7d 0a 0a 09 20 20 20 20 66 6f 72 65 61 }... forea
25a0: 63 68 20 72 69 64 20 24 6d 79 72 65 76 69 73 69 ch rid $myrevisi
25b0: 6f 6e 73 20 7b 0a 09 09 73 74 61 74 65 20 72 75 ons {...state ru
25c0: 6e 20 7b 0a 09 09 20 20 20 20 49 4e 53 45 52 54 n {... INSERT
25d0: 20 49 4e 54 4f 20 63 73 72 65 76 69 73 69 6f 6e INTO csrevision
25e0: 20 28 63 69 64 2c 20 20 20 70 6f 73 2c 20 20 72 (cid, pos, r
25f0: 69 64 29 0a 09 09 20 20 20 20 56 41 4c 55 45 53 id)... VALUES
2600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20
2610: 20 28 24 6d 79 69 64 2c 20 24 70 6f 73 2c 20 24 ($myid, $pos, $
2620: 72 69 64 29 3b 0a 09 09 7d 0a 09 09 69 6e 63 72 rid);...}...incr
2630: 20 70 6f 73 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 pos.. }..}..
2640: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 return. }..
2650: 20 20 6d 65 74 68 6f 64 20 74 69 6d 65 72 61 6e method timeran
2660: 67 65 20 7b 7d 20 7b 0a 09 73 65 74 20 74 68 65 ge {} {..set the
2670: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 6d 79 72 set ('[join $myr
2680: 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 evisions {','}]'
2690: 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61 74 65 )..return [state
26a0: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 run ".. SELE
26b0: 43 54 20 4d 49 4e 28 52 2e 64 61 74 65 29 2c 20 CT MIN(R.date),
26c0: 4d 41 58 28 52 2e 64 61 74 65 29 0a 09 20 20 20 MAX(R.date)..
26d0: 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 FROM revision R
26e0: 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e 72 69 .. WHERE R.ri
26f0: 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 22 5d d IN $theset.."]
2700: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 . }.. meth
2710: 6f 64 20 64 72 6f 70 20 7b 7d 20 7b 0a 09 73 74 od drop {} {..st
2720: 61 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 ate transaction
2730: 7b 0a 09 20 20 20 20 73 74 61 74 65 20 72 75 6e {.. state run
2740: 20 7b 0a 09 09 44 45 4c 45 54 45 20 46 52 4f 4d {...DELETE FROM
2750: 20 63 68 61 6e 67 65 73 65 74 20 20 57 48 45 52 changeset WHER
2760: 45 20 63 69 64 20 3d 20 24 6d 79 69 64 3b 0a 09 E cid = $myid;..
2770: 09 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 73 72 .DELETE FROM csr
2780: 65 76 69 73 69 6f 6e 20 57 48 45 52 45 20 63 69 evision WHERE ci
2790: 64 20 3d 20 24 6d 79 69 64 3b 0a 09 20 20 20 20 d = $myid;..
27a0: 7d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 72 20 }..}..foreach r
27b0: 24 6d 79 72 65 76 69 73 69 6f 6e 73 20 7b 0a 09 $myrevisions {..
27c0: 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 if {[llength
27d0: 20 24 6d 79 72 65 76 6d 61 70 28 24 72 29 5d 20 $myrevmap($r)]
27e0: 3d 3d 20 31 7d 20 7b 0a 09 09 75 6e 73 65 74 20 == 1} {...unset
27f0: 6d 79 72 65 76 6d 61 70 28 24 72 29 0a 09 20 20 myrevmap($r)..
2800: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 73 65 74 } else {...set
2810: 20 70 6f 73 20 5b 6c 73 65 61 72 63 68 20 2d 65 pos [lsearch -e
2820: 78 61 63 74 20 24 6d 79 72 65 76 6d 61 70 28 24 xact $myrevmap($
2830: 72 29 20 24 73 65 6c 66 5d 0a 09 09 73 65 74 20 r) $self]...set
2840: 6d 79 72 65 76 6d 61 70 28 24 72 29 20 5b 6c 72 myrevmap($r) [lr
2850: 65 70 6c 61 63 65 20 24 6d 79 72 65 76 6d 61 70 eplace $myrevmap
2860: 28 24 72 29 20 24 70 6f 73 20 24 70 6f 73 5d 0a ($r) $pos $pos].
2870: 09 20 20 20 20 7d 0a 09 7d 0a 09 73 65 74 20 70 . }..}..set p
2880: 6f 73 20 20 20 20 20 20 20 20 20 20 5b 6c 73 65 os [lse
2890: 61 72 63 68 20 2d 65 78 61 63 74 20 24 6d 79 63 arch -exact $myc
28a0: 68 61 6e 67 65 73 65 74 73 20 24 73 65 6c 66 5d hangesets $self]
28b0: 0a 09 73 65 74 20 6d 79 63 68 61 6e 67 65 73 65 ..set mychangese
28c0: 74 73 20 5b 6c 72 65 70 6c 61 63 65 20 24 6d 79 ts [lreplace $my
28d0: 63 68 61 6e 67 65 73 65 74 73 20 24 70 6f 73 20 changesets $pos
28e0: 24 70 6f 73 5d 0a 09 72 65 74 75 72 6e 0a 20 20 $pos]..return.
28f0: 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 }.. typemet
2900: 68 6f 64 20 73 70 6c 69 74 20 7b 63 73 65 74 20 hod split {cset
2910: 61 72 67 73 7d 20 7b 0a 09 23 20 41 73 20 70 61 args} {..# As pa
2920: 72 74 20 6f 66 20 74 68 65 20 63 72 65 61 74 69 rt of the creati
2930: 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 on of the new ch
2940: 61 6e 67 65 73 65 74 73 20 73 70 65 63 69 66 69 angesets specifi
2950: 65 64 20 69 6e 0a 09 23 20 41 52 47 53 20 61 73 ed in..# ARGS as
2960: 20 73 65 74 73 20 6f 66 20 72 65 76 69 73 69 6f sets of revisio
2970: 6e 73 2c 20 61 6c 6c 20 73 75 62 73 65 74 73 20 ns, all subsets
2980: 6f 66 20 43 53 45 54 27 73 20 72 65 76 69 73 69 of CSET's revisi
2990: 6f 6e 0a 09 23 20 73 65 74 2c 20 43 53 45 54 20 on..# set, CSET
29a0: 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 will be dropped
29b0: 66 72 6f 6d 20 61 6c 6c 20 64 61 74 61 62 61 73 from all databas
29c0: 65 73 2c 20 69 6e 20 61 6e 64 20 6f 75 74 20 6f es, in and out o
29d0: 66 0a 09 23 20 6d 65 6d 6f 72 79 2c 20 61 6e 64 f..# memory, and
29e0: 20 74 68 65 6e 20 64 65 73 74 72 6f 79 65 64 2e then destroyed.
29f0: 0a 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 ...struct::list
2a00: 61 73 73 69 67 6e 20 5b 24 63 73 65 74 20 64 61 assign [$cset da
2a10: 74 61 5d 20 70 72 6f 6a 65 63 74 20 63 73 74 79 ta] project csty
2a20: 70 65 20 63 73 73 72 63 0a 0a 09 24 63 73 65 74 pe cssrc...$cset
2a30: 20 64 72 6f 70 0a 09 24 63 73 65 74 20 64 65 73 drop..$cset des
2a40: 74 72 6f 79 0a 0a 09 73 65 74 20 6e 65 77 63 73 troy...set newcs
2a50: 65 74 73 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 ets {}..foreach
2a60: 66 72 61 67 6d 65 6e 74 72 65 76 69 73 69 6f 6e fragmentrevision
2a70: 73 20 24 61 72 67 73 20 7b 0a 09 20 20 20 20 69 s $args {.. i
2a80: 66 20 7b 21 5b 6c 6c 65 6e 67 74 68 20 24 66 72 f {![llength $fr
2a90: 61 67 6d 65 6e 74 72 65 76 69 73 69 6f 6e 73 5d agmentrevisions]
2aa0: 7d 20 7b 0a 09 09 74 72 6f 75 62 6c 65 20 69 6e } {...trouble in
2ab0: 74 65 72 6e 61 6c 20 22 41 74 74 65 6d 70 74 65 ternal "Attempte
2ac0: 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e 20 65 d to create an e
2ad0: 6d 70 74 79 20 63 68 61 6e 67 65 73 65 74 2c 20 mpty changeset,
2ae0: 69 2e 65 2e 20 77 69 74 68 6f 75 74 20 72 65 76 i.e. without rev
2af0: 69 73 69 6f 6e 73 22 0a 09 20 20 20 20 7d 0a 09 isions".. }..
2b00: 20 20 20 20 6c 61 70 70 65 6e 64 20 6e 65 77 63 lappend newc
2b10: 73 65 74 73 20 5b 24 74 79 70 65 20 25 41 55 54 sets [$type %AUT
2b20: 4f 25 20 24 70 72 6f 6a 65 63 74 20 24 63 73 74 O% $project $cst
2b30: 79 70 65 20 24 63 73 73 72 63 20 24 66 72 61 67 ype $cssrc $frag
2b40: 6d 65 6e 74 72 65 76 69 73 69 6f 6e 73 5d 0a 09 mentrevisions]..
2b50: 7d 0a 0a 09 66 6f 72 65 61 63 68 20 63 20 24 6e }...foreach c $n
2b60: 65 77 63 73 65 74 73 20 7b 20 24 63 20 70 65 72 ewcsets { $c per
2b70: 73 69 73 74 20 7d 0a 09 72 65 74 75 72 6e 20 24 sist }..return $
2b80: 6e 65 77 63 73 65 74 73 0a 20 20 20 20 7d 0a 0a newcsets. }..
2b90: 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23 # # ## ### #
2ba0: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 #### ######## ##
2bb0: 23 23 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 ###########.
2bc0: 23 23 20 53 74 61 74 65 0a 0a 20 20 20 20 76 61 ## State.. va
2bd0: 72 69 61 62 6c 65 20 6d 79 69 64 20 20 20 20 20 riable myid
2be0: 20 20 20 7b 7d 20 3b 20 23 20 49 64 20 6f 66 20 {} ; # Id of
2bf0: 74 68 65 20 63 73 65 74 20 66 6f 72 20 74 68 65 the cset for the
2c00: 20 70 65 72 73 69 73 74 65 6e 74 0a 09 09 09 20 persistent....
2c10: 20 20 20 20 20 23 20 73 74 61 74 65 2e 0a 20 20 # state..
2c20: 20 20 76 61 72 69 61 62 6c 65 20 6d 79 70 72 6f variable mypro
2c30: 6a 65 63 74 20 20 20 7b 7d 20 3b 20 23 20 52 65 ject {} ; # Re
2c40: 66 65 72 65 6e 63 65 20 6f 66 20 74 68 65 20 70 ference of the p
2c50: 72 6f 6a 65 63 74 20 6f 62 6a 65 63 74 20 74 68 roject object th
2c60: 65 0a 09 09 09 20 20 20 20 20 20 23 20 63 68 61 e.... # cha
2c70: 6e 67 65 73 65 74 20 62 65 6c 6f 6e 67 73 20 74 ngeset belongs t
2c80: 6f 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 o.. variable
2c90: 6d 79 74 79 70 65 20 20 20 20 20 20 7b 7d 20 3b mytype {} ;
2ca0: 20 23 20 72 65 76 20 6f 72 20 73 79 6d 2c 20 77 # rev or sym, w
2cb0: 68 65 72 65 20 74 68 65 20 63 73 65 74 20 6f 72 here the cset or
2cc0: 69 67 69 6e 61 74 65 64 0a 09 09 09 20 20 20 20 iginated....
2cd0: 20 20 23 20 66 72 6f 6d 2e 0a 20 20 20 20 76 61 # from.. va
2ce0: 72 69 61 62 6c 65 20 6d 79 73 72 63 69 64 20 20 riable mysrcid
2cf0: 20 20 20 7b 7d 20 3b 20 23 20 49 64 20 6f 66 20 {} ; # Id of
2d00: 74 68 65 20 6d 65 74 61 64 61 74 61 20 6f 72 20 the metadata or
2d10: 73 79 6d 62 6f 6c 20 74 68 65 20 63 73 65 74 0a symbol the cset.
2d20: 09 09 09 20 20 20 20 20 20 23 20 69 73 20 62 61 ... # is ba
2d30: 73 65 64 20 6f 6e 2e 0a 20 20 20 20 76 61 72 69 sed on.. vari
2d40: 61 62 6c 65 20 6d 79 72 65 76 69 73 69 6f 6e 73 able myrevisions
2d50: 20 7b 7d 20 3b 20 23 20 4c 69 73 74 20 6f 66 20 {} ; # List of
2d60: 74 68 65 20 66 69 6c 65 20 6c 65 76 65 6c 20 72 the file level r
2d70: 65 76 69 73 69 6f 6e 73 20 69 6e 0a 09 09 09 20 evisions in....
2d80: 20 20 20 20 20 23 20 74 68 65 20 63 73 65 74 2e # the cset.
2d90: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 . variable my
2da0: 70 72 65 6d 61 70 20 20 20 20 7b 7d 20 3b 20 23 premap {} ; #
2db0: 20 44 69 63 74 69 6f 6e 61 72 79 20 6d 61 70 70 Dictionary mapp
2dc0: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 72 65 76 ing from the rev
2dd0: 69 73 69 6f 6e 73 0a 09 09 09 20 20 20 20 20 20 isions....
2de0: 23 20 74 6f 20 74 68 65 69 72 20 70 72 65 64 65 # to their prede
2df0: 63 65 73 73 6f 72 73 2e 20 43 61 63 68 65 20 74 cessors. Cache t
2e00: 6f 20 61 76 6f 69 64 0a 09 09 09 20 20 20 20 20 o avoid....
2e10: 20 23 20 6c 6f 61 64 69 6e 67 20 74 68 69 73 20 # loading this
2e20: 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65 20 6d from the state m
2e30: 6f 72 65 20 74 68 61 6e 0a 09 09 09 20 20 20 20 ore than....
2e40: 20 20 23 20 6f 6e 63 65 2e 0a 20 20 20 20 76 61 # once.. va
2e50: 72 69 61 62 6c 65 20 6d 79 6e 65 78 74 6d 61 70 riable mynextmap
2e60: 20 20 20 7b 7d 20 3b 20 23 20 44 69 63 74 69 6f {} ; # Dictio
2e70: 6e 61 72 79 20 6d 61 70 70 69 6e 67 20 66 72 6f nary mapping fro
2e80: 6d 20 74 68 65 20 72 65 76 69 73 69 6f 6e 73 0a m the revisions.
2e90: 09 09 09 20 20 20 20 20 20 23 20 74 6f 20 74 68 ... # to th
2ea0: 65 69 72 20 73 75 63 63 65 73 73 6f 72 73 2e 20 eir successors.
2eb0: 43 61 63 68 65 20 74 6f 20 61 76 6f 69 64 0a 09 Cache to avoid..
2ec0: 09 09 20 20 20 20 20 20 23 20 6c 6f 61 64 69 6e .. # loadin
2ed0: 67 20 74 68 69 73 20 66 72 6f 6d 20 74 68 65 20 g this from the
2ee0: 73 74 61 74 65 20 6d 6f 72 65 20 74 68 61 6e 0a state more than.
2ef0: 09 09 09 20 20 20 20 20 20 23 20 6f 6e 63 65 2e ... # once.
2f00: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 . variable my
2f10: 70 6f 73 20 20 20 20 20 20 20 7b 7d 20 3b 20 23 pos {} ; #
2f20: 20 43 6f 6d 6d 69 74 20 70 6f 73 69 74 69 6f 6e Commit position
2f30: 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73 65 of the changese
2f40: 74 2c 20 69 66 0a 09 09 09 20 20 20 20 20 20 23 t, if.... #
2f50: 20 6b 6e 6f 77 6e 2e 0a 0a 20 20 20 20 23 20 23 known... # #
2f60: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 ## ### ##### ##
2f70: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 ###### #########
2f80: 23 23 23 23 0a 20 20 20 20 23 23 20 49 6e 74 65 ####. ## Inte
2f90: 72 6e 61 6c 20 6d 65 74 68 6f 64 73 0a 0a 20 20 rnal methods..
2fa0: 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d typevariable m
2fb0: 79 63 6f 75 6e 74 65 72 20 20 20 20 20 20 20 20 ycounter
2fc0: 30 20 3b 20 23 20 49 64 20 63 6f 75 6e 74 65 72 0 ; # Id counter
2fd0: 20 66 6f 72 20 63 73 65 74 73 2e 20 4c 61 73 74 for csets. Last
2fe0: 20 69 64 20 75 73 65 64 2e 0a 20 20 20 20 74 79 id used.. ty
2ff0: 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 73 74 pevariable mycst
3000: 79 70 65 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 ype -array {} ;
3010: 23 20 4d 61 70 20 63 73 74 79 70 65 73 20 74 6f # Map cstypes to
3020: 20 70 65 72 73 69 73 74 65 6e 74 20 69 64 73 2e persistent ids.
3030: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 .. typemethod
3040: 20 67 65 74 63 73 74 79 70 65 73 20 7b 7d 20 7b getcstypes {} {
3050: 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 6e ..foreach {tid n
3060: 61 6d 65 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 ame} [state run
3070: 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 74 69 {.. SELECT ti
3080: 64 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 63 73 74 d, name FROM cst
3090: 79 70 65 3b 0a 09 7d 5d 20 7b 20 73 65 74 20 6d ype;..}] { set m
30a0: 79 63 73 74 79 70 65 28 24 6e 61 6d 65 29 20 24 ycstype($name) $
30b0: 74 69 64 20 7d 0a 09 72 65 74 75 72 6e 0a 20 20 tid }..return.
30c0: 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 }.. typemet
30d0: 68 6f 64 20 6c 6f 61 64 63 6f 75 6e 74 65 72 20 hod loadcounter
30e0: 7b 7d 20 7b 0a 09 23 20 49 6e 69 74 69 61 6c 69 {} {..# Initiali
30f0: 7a 65 20 74 68 65 20 63 6f 75 6e 74 65 72 20 66 ze the counter f
3100: 72 6f 6d 20 74 68 65 20 73 74 61 74 65 0a 09 73 rom the state..s
3110: 65 74 20 6d 79 63 6f 75 6e 74 65 72 20 5b 73 74 et mycounter [st
3120: 61 74 65 20 6f 6e 65 20 7b 20 53 45 4c 45 43 54 ate one { SELECT
3130: 20 4d 41 58 28 63 69 64 29 20 46 52 4f 4d 20 63 MAX(cid) FROM c
3140: 68 61 6e 67 65 73 65 74 20 7d 5d 0a 09 72 65 74 hangeset }]..ret
3150: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 urn. }.. p
3160: 72 6f 63 20 50 75 6c 6c 49 6e 74 65 72 6e 61 6c roc PullInternal
3170: 53 75 63 63 65 73 73 6f 72 52 65 76 69 73 69 6f SuccessorRevisio
3180: 6e 73 20 7b 64 76 20 72 65 76 69 73 69 6f 6e 73 ns {dv revisions
3190: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76 } {..upvar 1 $dv
31a0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 73 dependencies..s
31b0: 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 et theset ('[joi
31c0: 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c n $revisions {',
31d0: 27 7d 5d 27 29 0a 0a 09 66 6f 72 65 61 63 68 20 '}]')...foreach
31e0: 7b 72 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 {rid child} [sta
31f0: 74 65 20 72 75 6e 20 22 0a 20 20 20 2d 2d 20 50 te run ". -- P
3200: 72 69 6d 61 72 79 20 63 68 69 6c 64 72 65 6e 0a rimary children.
3210: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 . SELECT R.ri
3220: 64 2c 20 52 2e 63 68 69 6c 64 0a 09 20 20 20 20 d, R.child..
3230: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 FROM revision
3240: 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e R.. WHERE R.
3250: 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 rid IN $theset
3260: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 63 .. AND R.c
3270: 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c hild IS NOT NULL
3280: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 63 .. AND R.c
3290: 68 69 6c 64 20 49 4e 20 24 74 68 65 73 65 74 0a hild IN $theset.
32a0: 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d UNION. --
32b0: 20 54 72 61 6e 73 69 74 69 6f 6e 20 4e 54 44 42 Transition NTDB
32c0: 20 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20 53 to trunk.. S
32d0: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 64 ELECT R.rid, R.d
32e0: 62 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d bchild.. FROM
32f0: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 revision R..
3300: 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 WHERE R.rid
3310: 20 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 IN $theset..
3320: 20 20 41 4e 44 20 20 20 20 52 2e 64 62 63 68 69 AND R.dbchi
3330: 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 0a 09 ld IS NOT NULL..
3340: 20 20 20 20 41 4e 44 20 20 20 20 52 2e 64 62 63 AND R.dbc
3350: 68 69 6c 64 20 49 4e 20 24 74 68 65 73 65 74 0a hild IN $theset.
3360: 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d UNION. --
3370: 20 53 65 63 6f 6e 64 61 72 79 20 28 62 72 61 6e Secondary (bran
3380: 63 68 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 ch) children..
3390: 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 SELECT R.rid,
33a0: 42 2e 62 72 69 64 0a 09 20 20 20 20 46 52 4f 4d B.brid.. FROM
33b0: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 revision R, r
33c0: 65 76 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 69 evisionbranchchi
33d0: 6c 64 72 65 6e 20 42 0a 09 20 20 20 20 57 48 45 ldren B.. WHE
33e0: 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 RE R.rid IN $
33f0: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 theset.. AND
3400: 20 20 20 52 2e 72 69 64 20 3d 20 42 2e 72 69 64 R.rid = B.rid
3410: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 62 .. AND B.b
3420: 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 rid IN $theset..
3430: 22 5d 20 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 "] {.. # Cons
3440: 69 64 65 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 ider moving this
3450: 20 74 6f 20 74 68 65 20 69 6e 74 65 67 72 69 74 to the integrit
3460: 79 20 6d 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 y module... i
3470: 66 20 7b 24 72 69 64 20 3d 3d 20 24 63 68 69 6c f {$rid == $chil
3480: 64 7d 20 7b 0a 09 09 74 72 6f 75 62 6c 65 20 69 d} {...trouble i
3490: 6e 74 65 72 6e 61 6c 20 22 52 65 76 69 73 69 6f nternal "Revisio
34a0: 6e 20 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f n $rid depends o
34b0: 6e 20 69 74 73 65 6c 66 2e 22 0a 09 20 20 20 20 n itself."..
34c0: 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 }.. lappend d
34d0: 65 70 65 6e 64 65 6e 63 69 65 73 28 24 72 69 64 ependencies($rid
34e0: 29 20 24 63 68 69 6c 64 0a 09 7d 0a 20 20 20 20 ) $child..}.
34f0: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 50 75 6c 6c }.. proc Pull
3500: 53 75 63 63 65 73 73 6f 72 52 65 76 69 73 69 6f SuccessorRevisio
3510: 6e 73 20 7b 64 76 20 72 65 76 69 73 69 6f 6e 73 ns {dv revisions
3520: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76 } {..upvar 1 $dv
3530: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 73 dependencies..s
3540: 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 et theset ('[joi
3550: 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c n $revisions {',
3560: 27 7d 5d 27 29 0a 0a 09 23 20 54 68 65 20 66 6f '}]')...# The fo
3570: 6c 6c 6f 77 69 6e 67 20 63 61 73 65 73 20 73 70 llowing cases sp
3580: 65 63 69 66 79 20 77 68 65 6e 20 61 20 72 65 76 ecify when a rev
3590: 69 73 69 6f 6e 20 53 20 69 73 20 61 20 73 75 63 ision S is a suc
35a0: 63 65 73 73 6f 72 0a 09 23 20 6f 66 20 61 20 72 cessor..# of a r
35b0: 65 76 69 73 69 6f 6e 20 52 2e 20 45 61 63 68 20 evision R. Each
35c0: 6f 66 20 74 68 65 20 63 61 73 65 73 20 74 72 61 of the cases tra
35d0: 6e 73 6c 61 74 65 73 20 69 6e 74 6f 20 6f 6e 65 nslates into one
35e0: 20 6f 66 0a 09 23 20 74 68 65 20 62 72 61 6e 63 of..# the branc
35f0: 68 65 73 20 6f 66 20 74 68 65 20 53 51 4c 20 55 hes of the SQL U
3600: 4e 49 4f 4e 20 63 6f 6d 69 6e 67 20 62 65 6c 6f NION coming belo
3610: 77 2e 0a 09 23 0a 09 23 20 28 31 29 20 53 20 63 w...#..# (1) S c
3620: 61 6e 20 62 65 20 61 20 70 72 69 6d 61 72 79 20 an be a primary
3630: 63 68 69 6c 64 20 6f 66 20 52 2c 20 69 2e 65 2e child of R, i.e.
3640: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 4c 4f 44 in the same LOD
3650: 2e 20 52 0a 09 23 20 20 20 20 20 72 65 66 65 72 . R..# refer
3660: 65 6e 63 65 73 20 53 20 64 69 72 65 63 74 6c 79 ences S directly
3670: 2e 20 52 2e 63 68 69 6c 64 20 3d 20 53 28 2e 72 . R.child = S(.r
3680: 69 64 29 2c 20 69 66 20 69 74 20 65 78 69 73 74 id), if it exist
3690: 73 2e 0a 09 23 0a 09 23 20 28 32 29 20 53 20 63 s...#..# (2) S c
36a0: 61 6e 20 62 65 20 61 20 73 65 63 6f 6e 64 61 72 an be a secondar
36b0: 79 2c 20 69 2e 65 2e 20 62 72 61 6e 63 68 2c 20 y, i.e. branch,
36c0: 63 68 69 6c 64 20 6f 66 20 52 2e 20 48 65 72 65 child of R. Here
36d0: 20 74 68 65 0a 09 23 20 20 20 20 20 6c 69 6e 6b the..# link
36e0: 20 69 73 20 6d 61 64 65 20 74 68 72 6f 75 67 68 is made through
36f0: 20 74 68 65 20 68 65 6c 70 65 72 20 74 61 62 6c the helper tabl
3700: 65 0a 09 23 20 20 20 20 20 52 45 56 49 53 49 4f e..# REVISIO
3710: 4e 42 52 41 4e 43 48 43 48 49 4c 44 52 45 4e 2e NBRANCHCHILDREN.
3720: 20 52 2e 72 69 64 20 2d 3e 20 52 42 43 2e 72 69 R.rid -> RBC.ri
3730: 64 2c 20 52 42 43 2e 62 72 69 64 20 3d 0a 09 23 d, RBC.brid =..#
3740: 20 20 20 20 20 53 28 2e 72 69 64 29 0a 09 23 0a S(.rid)..#.
3750: 09 23 20 28 33 29 20 49 66 20 52 20 69 73 20 74 .# (3) If R is t
3760: 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74 20 6f 66 he trunk root of
3770: 20 69 74 73 20 66 69 6c 65 20 61 6e 64 20 53 20 its file and S
3780: 69 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 0a 09 is the root of..
3790: 23 20 20 20 20 20 74 68 65 20 4e 54 44 42 20 6f # the NTDB o
37a0: 66 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 2c f the same file,
37b0: 20 74 68 65 6e 20 53 20 69 73 20 61 20 73 75 63 then S is a suc
37c0: 63 65 73 73 6f 72 20 6f 66 0a 09 23 20 20 20 20 cessor of..#
37d0: 20 52 2e 20 54 68 65 72 65 20 69 73 20 6e 6f 20 R. There is no
37e0: 64 69 72 65 63 74 20 6c 69 6e 6b 20 62 65 74 77 direct link betw
37f0: 65 65 6e 20 74 68 65 20 74 77 6f 20 69 6e 20 74 een the two in t
3800: 68 65 0a 09 23 20 20 20 20 20 64 61 74 61 62 61 he..# databa
3810: 73 65 2e 20 41 6e 20 69 6e 64 69 72 65 63 74 20 se. An indirect
3820: 6c 69 6e 6b 20 63 61 6e 20 62 65 20 6d 61 64 65 link can be made
3830: 20 74 68 72 6f 75 67 68 20 74 68 65 20 46 49 4c through the FIL
3840: 45 0a 09 23 20 20 20 20 20 74 68 65 79 20 62 65 E..# they be
3850: 6c 6f 6e 67 20 74 6f 6f 2c 20 61 6e 64 20 74 68 long too, and th
3860: 65 69 72 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 eir combination
3870: 6f 66 20 61 74 74 72 69 62 75 74 65 73 20 74 6f of attributes to
3880: 0a 09 23 20 20 20 20 20 69 64 65 6e 74 69 66 79 ..# identify
3890: 20 74 68 65 6d 2e 20 57 65 20 63 68 65 63 6b 20 them. We check
38a0: 52 20 66 6f 72 20 74 72 75 6e 6b 20 72 6f 6f 74 R for trunk root
38b0: 6e 65 73 73 20 61 6e 64 20 74 68 65 6e 0a 09 23 ness and then..#
38c0: 20 20 20 20 20 73 65 6c 65 63 74 20 66 6f 72 20 select for
38d0: 74 68 65 20 4e 54 44 42 20 72 6f 6f 74 2c 20 63 the NTDB root, c
38e0: 72 6f 73 73 69 6e 67 20 74 68 65 20 74 61 62 6c rossing the tabl
38f0: 65 20 77 69 74 68 0a 09 23 20 20 20 20 20 69 74 e with..# it
3900: 73 65 6c 66 2e 0a 09 23 0a 09 23 20 28 34 29 20 self...#..# (4)
3910: 49 66 20 52 20 69 73 20 74 68 65 20 6c 61 73 74 If R is the last
3920: 20 6f 66 20 74 68 65 20 4e 54 44 42 20 72 65 76 of the NTDB rev
3930: 69 73 69 6f 6e 73 20 77 68 69 63 68 20 62 65 6c isions which bel
3940: 6f 6e 67 20 74 6f 0a 09 23 20 20 20 20 20 74 68 ong to..# th
3950: 65 20 74 72 75 6e 6b 2c 20 74 68 65 6e 20 74 68 e trunk, then th
3960: 65 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 20 e primary child
3970: 6f 66 20 74 68 65 20 74 72 75 6e 6b 20 72 6f 6f of the trunk roo
3980: 74 20 28 74 68 65 0a 09 23 20 20 20 20 20 27 31 t (the..# '1
3990: 2e 32 27 20 72 65 76 69 73 69 6f 6e 29 20 69 73 .2' revision) is
39a0: 20 61 20 73 75 63 63 65 73 73 6f 72 2c 20 69 66 a successor, if
39b0: 20 69 74 20 65 78 69 73 74 73 2e 0a 0a 09 66 6f it exists....fo
39c0: 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 reach {rid child
39d0: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 20 } [state run ".
39e0: 20 20 2d 2d 20 28 31 29 20 50 72 69 6d 61 72 79 -- (1) Primary
39f0: 20 63 68 69 6c 64 0a 09 20 20 20 20 53 45 4c 45 child.. SELE
3a00: 43 54 20 52 2e 72 69 64 2c 20 52 2e 63 68 69 6c CT R.rid, R.chil
3a10: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 d.. FROM re
3a20: 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 vision R.. WH
3a30: 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 ERE R.rid IN
3a40: 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 $theset -- R
3a50: 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 estrict to revis
3a60: 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 ions of interest
3a70: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 63 .. AND R.c
3a80: 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c hild IS NOT NULL
3a90: 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d 61 -- Has prima
3aa0: 72 79 20 63 68 69 6c 64 0a 20 20 20 20 55 4e 49 ry child. UNI
3ab0: 4f 4e 0a 20 20 20 20 2d 2d 20 28 32 29 20 53 65 ON. -- (2) Se
3ac0: 63 6f 6e 64 61 72 79 20 28 62 72 61 6e 63 68 29 condary (branch)
3ad0: 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 53 children.. S
3ae0: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 ELECT R.rid, B.b
3af0: 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 rid.. FROM
3b00: 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 revision R, revi
3b10: 73 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64 72 sionbranchchildr
3b20: 65 6e 20 42 0a 09 20 20 20 20 57 48 45 52 45 20 en B.. WHERE
3b30: 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 R.rid IN $the
3b40: 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 set -- Restr
3b50: 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 ict to revisions
3b60: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 of interest..
3b70: 20 20 41 4e 44 20 20 20 20 52 2e 72 69 64 20 3d AND R.rid =
3b80: 20 42 2e 72 69 64 20 20 20 20 20 20 20 20 20 20 B.rid
3b90: 2d 2d 20 53 65 6c 65 63 74 20 73 75 62 73 65 74 -- Select subset
3ba0: 20 6f 66 20 62 72 61 6e 63 68 20 63 68 69 6c 64 of branch child
3bb0: 72 65 6e 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 ren. UNION.
3bc0: 20 20 2d 2d 20 28 33 29 20 4e 54 44 42 20 72 6f -- (3) NTDB ro
3bd0: 6f 74 20 73 75 63 63 65 73 73 6f 72 20 6f 66 20 ot successor of
3be0: 54 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 20 Trunk root..
3bf0: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 58 SELECT R.rid, RX
3c00: 2e 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 .rid.. FROM
3c10: 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 revision R, rev
3c20: 69 73 69 6f 6e 20 52 58 0a 09 20 20 20 20 57 48 ision RX.. WH
3c30: 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 ERE R.rid IN
3c40: 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 $theset -- R
3c50: 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 estrict to revis
3c60: 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 ions of interest
3c70: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 70 .. AND R.p
3c80: 61 72 65 6e 74 20 49 53 20 4e 55 4c 4c 20 20 20 arent IS NULL
3c90: 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 -- Restrict
3ca0: 74 6f 20 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44 to root.. AND
3cb0: 20 20 20 20 4e 4f 54 20 52 2e 69 73 64 65 66 61 NOT R.isdefa
3cc0: 75 6c 74 20 20 20 20 20 20 20 20 2d 2d 20 6f 6e ult -- on
3cd0: 20 74 68 65 20 74 72 75 6e 6b 0a 09 20 20 20 20 the trunk..
3ce0: 41 4e 44 20 20 20 20 52 2e 66 69 64 20 3d 20 52 AND R.fid = R
3cf0: 58 2e 66 69 64 20 20 20 20 20 20 20 20 20 2d 2d X.fid --
3d00: 20 53 65 6c 65 63 74 20 61 6c 6c 20 72 65 76 69 Select all revi
3d10: 73 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65 sion in the same
3d20: 20 66 69 6c 65 0a 09 20 20 20 20 41 4e 44 20 20 file.. AND
3d30: 20 20 52 58 2e 70 61 72 65 6e 74 20 49 53 20 4e RX.parent IS N
3d40: 55 4c 4c 20 20 20 20 20 20 2d 2d 20 52 65 73 74 ULL -- Rest
3d50: 72 69 63 74 20 74 6f 20 72 6f 6f 74 0a 09 20 20 rict to root..
3d60: 20 20 41 4e 44 20 20 20 20 52 58 2e 69 73 64 65 AND RX.isde
3d70: 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 fault
3d80: 2d 2d 20 6f 6e 20 74 68 65 20 4e 54 44 42 0a 20 -- on the NTDB.
3d90: 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 UNION. --
3da0: 28 34 29 20 43 68 69 6c 64 20 6f 66 20 74 72 75 (4) Child of tru
3db0: 6e 6b 20 72 6f 6f 74 20 73 75 63 63 65 73 73 6f nk root successo
3dc0: 72 20 6f 66 20 6c 61 73 74 20 4e 54 44 42 20 6f r of last NTDB o
3dd0: 6e 20 74 72 75 6e 6b 2e 0a 09 20 20 20 20 53 45 n trunk... SE
3de0: 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 41 2e 63 LECT R.rid, RA.c
3df0: 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 72 hild.. FROM r
3e00: 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 evision R, revis
3e10: 69 6f 6e 20 52 41 0a 09 20 20 20 20 57 48 45 52 ion RA.. WHER
3e20: 45 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 E R.rid IN $th
3e30: 65 73 65 74 20 20 20 20 20 20 2d 2d 20 52 65 73 eset -- Res
3e40: 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f trict to revisio
3e50: 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 ns of interest..
3e60: 20 20 20 20 41 4e 44 20 20 20 52 2e 69 73 64 65 AND R.isde
3e70: 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 fault
3e80: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f -- Restrict to
3e90: 20 4e 54 44 42 0a 09 20 20 20 20 41 4e 44 20 20 NTDB.. AND
3ea0: 20 52 2e 64 62 63 68 69 6c 64 20 49 53 20 4e 4f R.dbchild IS NO
3eb0: 54 20 4e 55 4c 4c 20 20 20 2d 2d 20 61 6e 64 20 T NULL -- and
3ec0: 6c 61 73 74 20 4e 54 44 42 20 62 65 6c 6f 6e 67 last NTDB belong
3ed0: 69 6e 67 20 74 6f 20 74 72 75 6e 6b 0a 09 20 20 ing to trunk..
3ee0: 20 20 41 4e 44 20 20 20 52 41 2e 72 69 64 20 3d AND RA.rid =
3ef0: 20 52 2e 64 62 63 68 69 6c 64 20 20 20 20 20 20 R.dbchild
3f00: 2d 2d 20 47 6f 20 64 69 72 65 63 74 6c 79 20 74 -- Go directly t
3f10: 6f 20 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 o trunk root..
3f20: 20 20 41 4e 44 20 20 20 52 41 2e 63 68 69 6c 64 AND RA.child
3f30: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 IS NOT NULL
3f40: 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 -- Has primary c
3f50: 68 69 6c 64 2e 0a 09 22 5d 20 7b 0a 09 20 20 20 hild..."] {..
3f60: 20 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69 # Consider movi
3f70: 6e 67 20 74 68 69 73 20 74 6f 20 74 68 65 20 69 ng this to the i
3f80: 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e ntegrity module.
3f90: 0a 09 20 20 20 20 69 66 20 7b 24 72 69 64 20 3d .. if {$rid =
3fa0: 3d 20 24 63 68 69 6c 64 7d 20 7b 0a 09 09 74 72 = $child} {...tr
3fb0: 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 22 ouble internal "
3fc0: 52 65 76 69 73 69 6f 6e 20 24 72 69 64 20 64 65 Revision $rid de
3fd0: 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 2e pends on itself.
3fe0: 22 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 6c 61 ".. }.. la
3ff0: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 ppend dependenci
4000: 65 73 28 24 72 69 64 29 20 24 63 68 69 6c 64 0a es($rid) $child.
4010: 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d .}..return. }
4020: 0a 0a 20 20 20 20 70 72 6f 63 20 50 75 6c 6c 50 .. proc PullP
4030: 72 65 64 65 63 65 73 73 6f 72 52 65 76 69 73 69 redecessorRevisi
4040: 6f 6e 73 20 7b 64 76 20 72 65 76 69 73 69 6f 6e ons {dv revision
4050: 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64 s} {..upvar 1 $d
4060: 76 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 v dependencies..
4070: 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f set theset ('[jo
4080: 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 in $revisions {'
4090: 2c 27 7d 5d 27 29 0a 0a 09 23 20 54 68 65 20 66 ,'}]')...# The f
40a0: 6f 6c 6c 6f 77 69 6e 67 20 63 61 73 65 73 20 73 ollowing cases s
40b0: 70 65 63 69 66 79 20 77 68 65 6e 20 61 20 72 65 pecify when a re
40c0: 76 69 73 69 6f 6e 20 50 20 69 73 20 61 0a 09 23 vision P is a..#
40d0: 20 70 72 65 64 65 63 65 73 73 6f 72 20 6f 66 20 predecessor of
40e0: 61 20 72 65 76 69 73 69 6f 6e 20 52 2e 20 45 61 a revision R. Ea
40f0: 63 68 20 6f 66 20 74 68 65 20 63 61 73 65 73 20 ch of the cases
4100: 74 72 61 6e 73 6c 61 74 65 73 0a 09 23 20 69 6e translates..# in
4110: 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 72 to one of the br
4120: 61 6e 63 68 65 73 20 6f 66 20 74 68 65 20 53 51 anches of the SQ
4130: 4c 20 55 4e 49 4f 4e 20 63 6f 6d 69 6e 67 20 62 L UNION coming b
4140: 65 6c 6f 77 2e 0a 09 23 0a 09 23 20 28 31 29 20 elow...#..# (1)
4150: 54 68 65 20 69 6d 6d 65 64 69 61 74 65 20 70 61 The immediate pa
4160: 72 65 6e 74 20 52 2e 70 61 72 65 6e 74 20 6f 66 rent R.parent of
4170: 20 52 20 69 73 20 61 20 70 72 65 64 65 63 65 73 R is a predeces
4180: 73 6f 72 20 6f 66 0a 09 23 20 20 20 20 20 52 2e sor of..# R.
4190: 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20 74 NOTE: This is t
41a0: 72 75 65 20 66 6f 72 20 52 20 65 69 74 68 65 72 rue for R either
41b0: 20 70 72 69 6d 61 72 79 20 6f 72 20 73 65 63 6f primary or seco
41c0: 6e 64 61 72 79 0a 09 23 20 20 20 20 20 63 68 69 ndary..# chi
41d0: 6c 64 20 6f 66 20 50 2e 20 49 74 20 6e 6f 74 20 ld of P. It not
41e0: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 69 73 necessary to dis
41f0: 74 69 6e 67 75 69 73 68 20 74 68 65 20 74 77 6f tinguish the two
4200: 0a 09 23 20 20 20 20 20 63 61 73 65 73 2c 20 69 ..# cases, i
4210: 6e 20 63 6f 6e 74 72 61 73 74 20 74 6f 20 74 68 n contrast to th
4220: 65 20 63 6f 64 65 20 72 65 74 72 69 65 76 69 6e e code retrievin
4230: 67 20 74 68 65 20 73 75 63 63 65 73 73 6f 72 0a g the successor.
4240: 09 23 20 20 20 20 20 69 6e 66 6f 72 6d 61 74 69 .# informati
4250: 6f 6e 2e 0a 09 23 0a 09 23 20 28 32 29 20 54 68 on...#..# (2) Th
4260: 65 20 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 e complement of
4270: 73 75 63 63 65 73 73 6f 72 20 63 61 73 65 20 28 successor case (
4280: 33 29 2e 20 54 68 65 20 74 72 75 6e 6b 20 72 6f 3). The trunk ro
4290: 6f 74 20 69 73 0a 09 23 20 20 20 20 20 61 20 70 ot is..# a p
42a0: 72 65 64 65 63 65 73 73 6f 72 20 6f 66 20 61 20 redecessor of a
42b0: 4e 54 44 42 20 72 6f 6f 74 2e 0a 09 23 0a 09 23 NTDB root...#..#
42c0: 20 28 33 29 20 54 68 65 20 63 6f 6d 70 6c 65 6d (3) The complem
42d0: 65 6e 74 20 6f 66 20 73 75 63 63 65 73 73 6f 72 ent of successor
42e0: 20 63 61 73 65 20 28 34 29 2e 20 54 68 65 20 6c case (4). The l
42f0: 61 73 74 20 4e 54 44 42 0a 09 23 20 20 20 20 20 ast NTDB..#
4300: 72 65 76 69 73 69 6f 6e 20 62 65 6c 6f 6e 67 69 revision belongi
4310: 6e 67 20 74 6f 20 74 68 65 20 74 72 75 6e 6b 20 ng to the trunk
4320: 69 73 20 61 20 70 72 65 64 65 63 65 73 73 6f 72 is a predecessor
4330: 20 6f 66 20 74 68 65 0a 09 23 20 20 20 20 20 70 of the..# p
4340: 72 69 6d 61 72 79 20 63 68 69 6c 64 20 6f 66 20 rimary child of
4350: 74 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74 20 28 the trunk root (
4360: 54 68 65 20 27 31 2e 32 27 20 72 65 76 69 73 69 The '1.2' revisi
4370: 6f 6e 29 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b on)....foreach {
4380: 72 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 rid parent} [sta
4390: 74 65 20 72 75 6e 20 22 0a 20 20 20 2d 2d 20 28 te run ". -- (
43a0: 31 29 20 50 72 69 6d 61 72 79 20 70 61 72 65 6e 1) Primary paren
43b0: 74 2c 20 63 61 6e 20 62 65 20 69 6e 20 64 69 66 t, can be in dif
43c0: 66 65 72 65 6e 74 20 4c 4f 44 20 66 6f 72 20 66 ferent LOD for f
43d0: 69 72 73 74 20 69 6e 20 61 20 62 72 61 6e 63 68 irst in a branch
43e0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 .. SELECT R.r
43f0: 69 64 2c 20 52 2e 70 61 72 65 6e 74 0a 09 20 20 id, R.parent..
4400: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f FROM revisio
4410: 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 n R.. WHERE
4420: 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 R.rid IN $thes
4430: 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 et -- Restri
4440: 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 ct to revisions
4450: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 of interest..
4460: 20 41 4e 44 20 20 20 20 52 2e 70 61 72 65 6e 74 AND R.parent
4470: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d IS NOT NULL -
4480: 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 70 61 - Has primary pa
4490: 72 65 6e 74 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 rent. UNION.
44a0: 20 20 20 2d 2d 20 28 32 29 20 54 72 75 6e 6b 20 -- (2) Trunk
44b0: 72 6f 6f 74 20 70 72 65 64 65 63 65 73 73 6f 72 root predecessor
44c0: 20 6f 66 20 4e 54 44 42 20 72 6f 6f 74 2e 0a 09 of NTDB root...
44d0: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 SELECT R.rid
44e0: 2c 20 52 58 2e 72 69 64 0a 09 20 20 20 20 46 52 , RX.rid.. FR
44f0: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c OM revision R,
4500: 20 72 65 76 69 73 69 6f 6e 20 52 58 0a 09 20 20 revision RX..
4510: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 49 WHERE R.rid I
4520: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d N $theset --
4530: 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 Restrict to rev
4540: 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 isions of intere
4550: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 st.. AND R
4560: 2e 70 61 72 65 6e 74 20 49 53 20 4e 55 4c 4c 20 .parent IS NULL
4570: 20 20 20 20 2d 2d 20 77 68 69 63 68 20 61 72 65 -- which are
4580: 20 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 root.. AND
4590: 20 20 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20 R.isdefault
45a0: 20 20 20 20 20 20 20 2d 2d 20 6f 6e 20 4e 54 44 -- on NTD
45b0: 42 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e B.. AND R.
45c0: 66 69 64 20 3d 20 52 58 2e 66 69 64 20 20 20 20 fid = RX.fid
45d0: 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 61 6c 6c -- Select all
45e0: 20 72 65 76 69 73 69 6f 6e 20 69 6e 20 74 68 65 revision in the
45f0: 20 73 61 6d 65 20 66 69 6c 65 0a 09 20 20 20 20 same file..
4600: 41 4e 44 20 20 20 20 52 58 2e 70 61 72 65 6e 74 AND RX.parent
4610: 20 49 53 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 77 IS NULL -- w
4620: 68 69 63 68 20 61 72 65 20 72 6f 6f 74 0a 09 20 hich are root..
4630: 20 20 20 41 4e 44 20 20 20 20 4e 4f 54 20 52 58 AND NOT RX
4640: 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20 20 2d .isdefault -
4650: 2d 20 6f 6e 20 74 68 65 20 74 72 75 6e 6b 0a 20 - on the trunk.
4660: 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 UNION. --
4670: 28 33 29 20 4c 61 73 74 20 4e 54 44 42 20 6f 6e (3) Last NTDB on
4680: 20 74 72 75 6e 6b 20 69 73 20 70 72 65 64 65 63 trunk is predec
4690: 65 73 73 6f 72 20 6f 66 20 63 68 69 6c 64 20 6f essor of child o
46a0: 66 20 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 f trunk root..
46b0: 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 SELECT R.rid,
46c0: 52 41 2e 64 62 70 61 72 65 6e 74 0a 09 20 20 20 RA.dbparent..
46d0: 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 FROM revision R
46e0: 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 0a 09 20 , revision RA..
46f0: 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 49 WHERE R.rid I
4700: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 20 20 N $theset
4710: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 -- Restrict to r
4720: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 evisions of inte
4730: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 4e 4f rest.. AND NO
4740: 54 20 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20 T R.isdefault
4750: 20 20 20 20 20 20 20 2d 2d 20 6e 6f 74 20 6f 6e -- not on
4760: 20 4e 54 44 42 0a 09 20 20 20 20 41 4e 44 20 52 NTDB.. AND R
4770: 2e 70 61 72 65 6e 74 20 49 53 20 4e 4f 54 20 4e .parent IS NOT N
4780: 55 4c 4c 20 20 20 20 20 2d 2d 20 77 68 69 63 68 ULL -- which
4790: 20 61 72 65 20 6e 6f 74 20 72 6f 6f 74 0a 09 20 are not root..
47a0: 20 20 20 41 4e 44 20 52 41 2e 72 69 64 20 3d 20 AND RA.rid =
47b0: 52 2e 70 61 72 65 6e 74 20 20 20 20 20 20 20 20 R.parent
47c0: 2d 2d 20 67 6f 20 74 6f 20 74 68 65 69 72 20 70 -- go to their p
47d0: 61 72 65 6e 74 0a 09 20 20 20 20 41 4e 44 20 52 arent.. AND R
47e0: 41 2e 64 62 70 61 72 65 6e 74 20 49 53 20 4e 4f A.dbparent IS NO
47f0: 54 20 4e 55 4c 4c 20 20 2d 2d 20 77 68 69 63 68 T NULL -- which
4800: 20 68 61 73 20 74 6f 20 72 65 66 65 72 20 74 6f has to refer to
4810: 20 4e 54 44 42 27 73 20 72 6f 6f 74 0a 09 22 5d NTDB's root.."]
4820: 20 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 69 64 {.. # Consid
4830: 65 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 20 74 er moving this t
4840: 6f 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 o the integrity
4850: 6d 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 66 20 module... if
4860: 7b 24 72 69 64 20 3d 3d 20 24 70 61 72 65 6e 74 {$rid == $parent
4870: 7d 20 7b 0a 09 09 74 72 6f 75 62 6c 65 20 69 6e } {...trouble in
4880: 74 65 72 6e 61 6c 20 22 52 65 76 69 73 69 6f 6e ternal "Revision
4890: 20 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f 6e $rid depends on
48a0: 20 69 74 73 65 6c 66 2e 22 0a 09 20 20 20 20 7d itself.".. }
48b0: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 .. lappend de
48c0: 70 65 6e 64 65 6e 63 69 65 73 28 24 72 69 64 29 pendencies($rid)
48d0: 20 24 70 61 72 65 6e 74 0a 09 7d 0a 09 72 65 74 $parent..}..ret
48e0: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 urn. }.. p
48f0: 72 6f 63 20 49 6e 69 74 69 61 6c 69 7a 65 42 72 roc InitializeBr
4900: 65 61 6b 53 74 61 74 65 20 7b 72 65 76 69 73 69 eakState {revisi
4910: 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 ons} {..upvar 1
4920: 70 6f 73 20 70 6f 73 20 63 72 6f 73 73 20 63 72 pos pos cross cr
4930: 6f 73 73 20 72 61 6e 67 65 20 72 61 6e 67 65 20 oss range range
4940: 64 65 70 63 20 64 65 70 63 20 64 65 6c 74 61 20 depc depc delta
4950: 64 65 6c 74 61 20 5c 0a 09 20 20 20 20 64 65 70 delta \.. dep
4960: 65 6e 64 65 6e 63 69 65 73 20 64 65 70 65 6e 64 endencies depend
4970: 65 6e 63 69 65 73 0a 0a 09 23 20 46 69 72 73 74 encies...# First
4980: 20 77 65 20 63 72 65 61 74 65 20 61 20 6d 61 70 we create a map
4990: 20 6f 66 20 70 6f 73 69 74 69 6f 6e 73 20 74 6f of positions to
49a0: 20 6d 61 6b 65 20 69 74 20 65 61 73 69 65 72 20 make it easier
49b0: 74 6f 0a 09 23 20 64 65 74 65 72 6d 69 6e 65 20 to..# determine
49c0: 77 68 65 74 68 65 72 20 61 20 64 65 70 65 6e 64 whether a depend
49d0: 65 6e 63 79 20 63 72 6f 73 73 65 73 20 61 20 70 ency crosses a p
49e0: 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 2e articular index.
49f0: 0a 0a 09 61 72 72 61 79 20 73 65 74 20 70 6f 73 ...array set pos
4a00: 20 20 20 7b 7d 0a 09 61 72 72 61 79 20 73 65 74 {}..array set
4a10: 20 63 72 6f 73 73 20 7b 7d 0a 09 61 72 72 61 79 cross {}..array
4a20: 20 73 65 74 20 64 65 70 63 20 20 7b 7d 0a 09 73 set depc {}..s
4a30: 65 74 20 72 61 6e 67 65 20 20 20 20 20 20 20 7b et range {
4a40: 7d 0a 09 73 65 74 20 6e 20 30 0a 09 66 6f 72 65 }..set n 0..fore
4a50: 61 63 68 20 72 65 76 20 24 72 65 76 69 73 69 6f ach rev $revisio
4a60: 6e 73 20 7b 20 0a 09 20 20 20 20 6c 61 70 70 65 ns { .. lappe
4a70: 6e 64 20 72 61 6e 67 65 20 24 6e 0a 09 20 20 20 nd range $n..
4a80: 20 73 65 74 20 70 6f 73 28 24 72 65 76 29 20 24 set pos($rev) $
4a90: 6e 0a 09 20 20 20 20 73 65 74 20 63 72 6f 73 73 n.. set cross
4aa0: 28 24 6e 29 20 30 0a 09 20 20 20 20 69 6e 63 72 ($n) 0.. incr
4ab0: 20 6e 0a 09 7d 0a 0a 09 23 20 53 65 63 6f 6e 64 n..}...# Second
4ac0: 6c 79 20 77 65 20 63 6f 75 6e 74 20 74 68 65 20 ly we count the
4ad0: 63 72 6f 73 73 69 6e 67 73 20 70 65 72 20 70 6f crossings per po
4ae0: 73 69 74 69 6f 6e 2c 20 62 79 20 69 74 65 72 61 sition, by itera
4af0: 74 69 6e 67 0a 09 23 20 6f 76 65 72 20 74 68 65 ting..# over the
4b00: 20 72 65 63 6f 72 64 65 64 20 69 6e 74 65 72 6e recorded intern
4b10: 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e al dependencies.
4b20: 0a 0a 09 23 20 4e 6f 74 65 3a 20 49 66 20 74 68 ...# Note: If th
4b30: 65 20 74 69 6d 65 73 74 61 6d 70 73 20 61 72 65 e timestamps are
4b40: 20 62 61 64 6c 79 20 6f 75 74 20 6f 66 20 6f 72 badly out of or
4b50: 64 65 72 20 69 74 20 69 73 0a 09 23 20 20 20 20 der it is..#
4b60: 20 20 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 possible to h
4b70: 61 76 65 20 61 20 62 61 63 6b 77 61 72 64 20 73 ave a backward s
4b80: 75 63 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 uccessor depende
4b90: 6e 63 79 2c 0a 09 23 20 20 20 20 20 20 20 69 2e ncy,..# i.
4ba0: 65 2e 20 77 69 74 68 20 73 74 61 72 74 20 3e 20 e. with start >
4bb0: 65 6e 64 2e 20 57 65 20 6d 61 79 20 68 61 76 65 end. We may have
4bc0: 20 74 6f 20 73 77 61 70 20 74 68 65 20 69 6e 64 to swap the ind
4bd0: 69 63 65 73 0a 09 23 20 20 20 20 20 20 20 74 6f ices..# to
4be0: 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 ensure that the
4bf0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 following loop
4c00: 72 75 6e 73 20 63 6f 72 72 65 63 74 6c 79 2e 0a runs correctly..
4c10: 09 23 0a 09 23 20 4e 6f 74 65 20 32 3a 20 73 74 .#..# Note 2: st
4c20: 61 72 74 20 3d 3d 20 65 6e 64 20 69 73 20 6e 6f art == end is no
4c30: 74 20 70 6f 73 73 69 62 6c 65 2e 20 49 74 20 69 t possible. It i
4c40: 6e 64 69 63 61 74 65 73 20 61 0a 09 23 20 20 20 ndicates a..#
4c50: 20 20 20 20 20 20 73 65 6c 66 2d 64 65 70 65 6e self-depen
4c60: 64 65 6e 63 79 20 64 75 65 20 74 6f 20 74 68 65 dency due to the
4c70: 20 75 6e 69 71 75 65 6e 65 73 73 20 6f 66 20 70 uniqueness of p
4c80: 6f 73 69 74 69 6f 6e 73 2c 0a 09 23 20 20 20 20 ositions,..#
4c90: 20 20 20 20 20 61 6e 64 20 74 68 61 74 20 69 73 and that is
4ca0: 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 20 68 61 something we ha
4cb0: 76 65 20 72 75 6c 65 64 20 6f 75 74 20 61 6c 72 ve ruled out alr
4cc0: 65 61 64 79 2c 20 73 65 65 0a 09 23 20 20 20 20 eady, see..#
4cd0: 20 20 20 20 20 50 75 6c 6c 49 6e 74 65 72 6e 61 PullInterna
4ce0: 6c 53 75 63 63 65 73 73 6f 72 52 65 76 69 73 69 lSuccessorRevisi
4cf0: 6f 6e 73 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b ons....foreach {
4d00: 72 69 64 20 63 68 69 6c 64 7d 20 5b 61 72 72 61 rid child} [arra
4d10: 79 20 67 65 74 20 64 65 70 65 6e 64 65 6e 63 69 y get dependenci
4d20: 65 73 5d 20 7b 0a 09 20 20 20 20 73 65 74 20 64 es] {.. set d
4d30: 6b 65 79 20 20 20 20 5b 6c 69 73 74 20 24 72 69 key [list $ri
4d40: 64 20 24 63 68 69 6c 64 5d 0a 09 20 20 20 20 73 d $child].. s
4d50: 65 74 20 73 74 61 72 74 20 20 20 24 70 6f 73 28 et start $pos(
4d60: 24 72 69 64 29 0a 09 20 20 20 20 73 65 74 20 65 $rid).. set e
4d70: 6e 64 20 20 20 20 20 24 70 6f 73 28 24 63 68 69 nd $pos($chi
4d80: 6c 64 29 0a 09 20 20 20 20 73 65 74 20 63 72 6f ld).. set cro
4d90: 73 73 65 73 20 7b 7d 0a 0a 09 20 20 20 20 69 66 sses {}... if
4da0: 20 7b 24 73 74 61 72 74 20 3e 20 24 65 6e 64 7d {$start > $end}
4db0: 20 7b 0a 09 09 77 68 69 6c 65 20 7b 24 65 6e 64 {...while {$end
4dc0: 20 3c 20 24 73 74 61 72 74 7d 20 7b 0a 09 09 20 < $start} {...
4dd0: 20 20 20 6c 61 70 70 65 6e 64 20 63 72 6f 73 73 lappend cross
4de0: 65 73 20 24 65 6e 64 0a 09 09 20 20 20 20 69 6e es $end... in
4df0: 63 72 20 63 72 6f 73 73 28 24 65 6e 64 29 0a 09 cr cross($end)..
4e00: 09 20 20 20 20 69 6e 63 72 20 65 6e 64 0a 09 09 . incr end...
4e10: 7d 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a }.. } else {.
4e20: 09 09 77 68 69 6c 65 20 7b 24 73 74 61 72 74 20 ..while {$start
4e30: 3c 20 24 65 6e 64 7d 20 7b 0a 09 09 20 20 20 20 < $end} {...
4e40: 6c 61 70 70 65 6e 64 20 63 72 6f 73 73 65 73 20 lappend crosses
4e50: 24 73 74 61 72 74 0a 09 09 20 20 20 20 69 6e 63 $start... inc
4e60: 72 20 63 72 6f 73 73 28 24 73 74 61 72 74 29 0a r cross($start).
4e70: 09 09 20 20 20 20 69 6e 63 72 20 73 74 61 72 74 .. incr start
4e80: 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 ...}.. }..
4e90: 20 73 65 74 20 64 65 70 63 28 24 64 6b 65 79 29 set depc($dkey)
4ea0: 20 24 63 72 6f 73 73 65 73 0a 09 7d 0a 0a 09 49 $crosses..}...I
4eb0: 6e 69 74 69 61 6c 69 7a 65 44 65 6c 74 61 73 20 nitializeDeltas
4ec0: 24 72 65 76 69 73 69 6f 6e 73 0a 09 72 65 74 75 $revisions..retu
4ed0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 rn. }.. pr
4ee0: 6f 63 20 49 6e 69 74 69 61 6c 69 7a 65 44 65 6c oc InitializeDel
4ef0: 74 61 73 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 tas {revisions}
4f00: 7b 0a 09 75 70 76 61 72 20 31 20 64 65 6c 74 61 {..upvar 1 delta
4f10: 20 64 65 6c 74 61 0a 0a 09 23 20 50 75 6c 6c 20 delta...# Pull
4f20: 74 68 65 20 74 69 6d 65 73 74 61 6d 70 73 20 66 the timestamps f
4f30: 6f 72 20 61 6c 6c 20 72 65 76 69 73 69 6f 6e 73 or all revisions
4f40: 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 in the changese
4f50: 74 73 20 61 6e 64 0a 09 23 20 63 6f 6d 70 75 74 ts and..# comput
4f60: 65 20 74 68 65 69 72 20 64 65 6c 74 61 73 20 66 e their deltas f
4f70: 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 62 72 or use by the br
4f80: 65 61 6b 20 66 69 6e 64 65 72 2e 0a 0a 09 61 72 eak finder....ar
4f90: 72 61 79 20 73 65 74 20 64 65 6c 74 61 20 7b 7d ray set delta {}
4fa0: 0a 09 61 72 72 61 79 20 73 65 74 20 73 74 61 6d ..array set stam
4fb0: 70 20 7b 7d 0a 0a 09 73 65 74 20 74 68 65 73 65 p {}...set these
4fc0: 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 t ('[join $revis
4fd0: 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66 ions {','}]')..f
4fe0: 6f 72 65 61 63 68 20 7b 72 69 64 20 74 69 6d 65 oreach {rid time
4ff0: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 } [state run "..
5000: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 SELECT R.rid
5010: 2c 20 52 2e 64 61 74 65 0a 09 20 20 20 20 46 52 , R.date.. FR
5020: 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 OM revision R..
5030: 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 49 WHERE R.rid I
5040: 4e 20 24 74 68 65 73 65 74 0a 09 22 5d 20 7b 0a N $theset.."] {.
5050: 09 20 20 20 20 73 65 74 20 73 74 61 6d 70 28 24 . set stamp($
5060: 72 69 64 29 20 24 74 69 6d 65 0a 09 7d 0a 0a 09 rid) $time..}...
5070: 73 65 74 20 6e 20 30 0a 09 66 6f 72 65 61 63 68 set n 0..foreach
5080: 20 72 69 64 20 5b 6c 72 61 6e 67 65 20 24 72 65 rid [lrange $re
5090: 76 69 73 69 6f 6e 73 20 30 20 65 6e 64 2d 31 5d visions 0 end-1]
50a0: 20 72 6e 65 78 74 20 5b 6c 72 61 6e 67 65 20 24 rnext [lrange $
50b0: 72 65 76 69 73 69 6f 6e 73 20 31 20 65 6e 64 5d revisions 1 end]
50c0: 20 7b 0a 09 20 20 20 20 73 65 74 20 64 65 6c 74 {.. set delt
50d0: 61 28 24 6e 29 20 5b 65 78 70 72 20 7b 24 73 74 a($n) [expr {$st
50e0: 61 6d 70 28 24 72 6e 65 78 74 29 20 2d 20 24 73 amp($rnext) - $s
50f0: 74 61 6d 70 28 24 72 69 64 29 7d 5d 0a 09 20 20 tamp($rid)}]..
5100: 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 09 72 65 74 incr n..}..ret
5110: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 urn. }.. p
5120: 72 6f 63 20 46 69 6e 64 42 65 73 74 42 72 65 61 roc FindBestBrea
5130: 6b 20 7b 72 61 6e 67 65 7d 20 7b 0a 09 75 70 76 k {range} {..upv
5140: 61 72 20 31 20 63 72 6f 73 73 20 63 72 6f 73 73 ar 1 cross cross
5150: 20 64 65 6c 74 61 20 64 65 6c 74 61 0a 0a 09 23 delta delta...#
5160: 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 Determine the b
5170: 65 73 74 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 est break locati
5180: 6f 6e 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 on in the given
5190: 72 61 6e 67 65 20 6f 66 0a 09 23 20 70 6f 73 69 range of..# posi
51a0: 74 69 6f 6e 73 2e 20 46 69 72 73 74 20 77 65 20 tions. First we
51b0: 6c 6f 6f 6b 20 66 6f 72 20 74 68 65 20 6c 6f 63 look for the loc
51c0: 61 74 69 6f 6e 73 20 77 69 74 68 20 74 68 65 20 ations with the
51d0: 6d 61 78 69 6d 61 6c 0a 09 23 20 6e 75 6d 62 65 maximal..# numbe
51e0: 72 20 6f 66 20 63 72 6f 73 73 69 6e 67 73 2e 20 r of crossings.
51f0: 49 66 20 74 68 65 72 65 20 61 72 65 20 73 65 76 If there are sev
5200: 65 72 61 6c 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 eral we look for
5210: 20 74 68 65 0a 09 23 20 73 68 6f 72 74 65 73 74 the..# shortest
5220: 20 74 69 6d 65 20 69 6e 74 65 72 76 61 6c 20 61 time interval a
5230: 6d 6f 6e 67 20 74 68 65 6d 2e 20 49 66 20 77 65 mong them. If we
5240: 20 73 74 69 6c 6c 20 68 61 76 65 20 6d 75 6c 74 still have mult
5250: 69 70 6c 65 0a 09 23 20 70 6f 73 73 69 62 69 6c iple..# possibil
5260: 69 74 69 65 73 20 61 66 74 65 72 20 74 68 61 74 ities after that
5270: 20 77 65 20 73 65 6c 65 63 74 20 74 68 65 20 65 we select the e
5280: 61 72 6c 69 65 73 74 20 6c 6f 63 61 74 69 6f 6e arliest location
5290: 0a 09 23 20 61 6d 6f 6e 67 20 74 68 65 73 65 2e ..# among these.
52a0: 0a 0a 09 23 20 4e 6f 74 65 3a 20 49 66 20 74 68 ...# Note: If th
52b0: 65 20 6d 61 78 69 6d 61 6c 20 6e 75 6d 62 65 72 e maximal number
52c0: 20 6f 66 20 63 72 6f 73 73 69 6e 67 73 20 69 73 of crossings is
52d0: 20 30 20 74 68 65 6e 20 74 68 65 20 72 61 6e 67 0 then the rang
52e0: 65 0a 09 23 20 20 20 20 20 20 20 68 61 73 20 6e e..# has n
52f0: 6f 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e o internal depen
5300: 64 65 6e 63 69 65 73 2c 20 61 6e 64 20 6e 6f 20 dencies, and no
5310: 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 61 break location a
5320: 74 0a 09 23 20 20 20 20 20 20 20 61 6c 6c 2e 20 t..# all.
5330: 54 68 69 73 20 70 6f 73 73 69 62 69 6c 69 74 79 This possibility
5340: 20 69 73 20 73 69 67 6e 61 6c 65 64 20 76 69 61 is signaled via
5350: 20 72 65 73 75 6c 74 20 2d 31 2e 0a 0a 09 23 20 result -1....#
5360: 4e 6f 74 65 3a 20 41 20 72 61 6e 67 65 20 6f 66 Note: A range of
5370: 20 6c 65 6e 67 74 68 20 31 20 6f 72 20 6c 65 73 length 1 or les
5380: 73 20 63 61 6e 6e 6f 74 20 68 61 76 65 20 69 6e s cannot have in
5390: 74 65 72 6e 61 6c 0a 09 23 20 20 20 20 20 20 20 ternal..#
53a0: 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 dependencies, as
53b0: 20 74 68 61 74 20 6e 65 65 64 73 20 61 74 20 6c that needs at l
53c0: 65 61 73 74 20 74 77 6f 20 72 65 76 69 73 69 6f east two revisio
53d0: 6e 73 20 69 6e 0a 09 23 20 20 20 20 20 20 20 74 ns in..# t
53e0: 68 65 20 72 61 6e 67 65 2e 0a 0a 09 69 66 20 7b he range....if {
53f0: 5b 6c 6c 65 6e 67 74 68 20 24 72 61 6e 67 65 5d [llength $range]
5400: 20 3c 20 32 7d 20 7b 20 72 65 74 75 72 6e 20 2d < 2} { return -
5410: 31 20 7d 0a 0a 09 73 65 74 20 6d 61 78 20 2d 31 1 }...set max -1
5420: 0a 09 73 65 74 20 62 65 73 74 20 7b 7d 0a 0a 09 ..set best {}...
5430: 66 6f 72 65 61 63 68 20 6c 6f 63 61 74 69 6f 6e foreach location
5440: 20 24 72 61 6e 67 65 20 7b 0a 09 20 20 20 20 73 $range {.. s
5450: 65 74 20 63 72 6f 73 73 69 6e 67 73 20 24 63 72 et crossings $cr
5460: 6f 73 73 28 24 6c 6f 63 61 74 69 6f 6e 29 0a 09 oss($location)..
5470: 20 20 20 20 69 66 20 7b 24 63 72 6f 73 73 69 6e if {$crossin
5480: 67 73 20 3e 20 24 6d 61 78 7d 20 7b 0a 09 09 73 gs > $max} {...s
5490: 65 74 20 6d 61 78 20 20 24 63 72 6f 73 73 69 6e et max $crossin
54a0: 67 73 0a 09 09 73 65 74 20 62 65 73 74 20 5b 6c gs...set best [l
54b0: 69 73 74 20 24 6c 6f 63 61 74 69 6f 6e 5d 0a 09 ist $location]..
54c0: 09 63 6f 6e 74 69 6e 75 65 0a 09 20 20 20 20 7d .continue.. }
54d0: 20 65 6c 73 65 69 66 20 7b 24 63 72 6f 73 73 69 elseif {$crossi
54e0: 6e 67 73 20 3d 3d 20 24 6d 61 78 7d 20 7b 0a 09 ngs == $max} {..
54f0: 09 6c 61 70 70 65 6e 64 20 62 65 73 74 20 24 6c .lappend best $l
5500: 6f 63 61 74 69 6f 6e 0a 09 20 20 20 20 7d 0a 09 ocation.. }..
5510: 7d 0a 0a 09 69 66 20 7b 24 6d 61 78 20 3d 3d 20 }...if {$max ==
5520: 30 7d 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 0} {
5530: 72 65 74 75 72 6e 20 2d 31 20 7d 0a 09 69 66 20 return -1 }..if
5540: 7b 5b 6c 6c 65 6e 67 74 68 20 24 62 65 73 74 5d {[llength $best]
5550: 20 3d 3d 20 31 7d 20 7b 20 72 65 74 75 72 6e 20 == 1} { return
5560: 5b 6c 69 6e 64 65 78 20 24 62 65 73 74 20 30 5d [lindex $best 0]
5570: 20 7d 0a 0a 09 73 65 74 20 6c 6f 63 61 74 69 6f }...set locatio
5580: 6e 73 20 24 62 65 73 74 0a 09 73 65 74 20 62 65 ns $best..set be
5590: 73 74 20 7b 7d 0a 09 73 65 74 20 6d 69 6e 20 2d st {}..set min -
55a0: 31 0a 0a 09 66 6f 72 65 61 63 68 20 6c 6f 63 61 1...foreach loca
55b0: 74 69 6f 6e 20 24 6c 6f 63 61 74 69 6f 6e 73 20 tion $locations
55c0: 7b 0a 09 20 20 20 20 73 65 74 20 69 6e 74 65 72 {.. set inter
55d0: 76 61 6c 20 24 64 65 6c 74 61 28 24 6c 6f 63 61 val $delta($loca
55e0: 74 69 6f 6e 29 0a 09 20 20 20 20 69 66 20 7b 28 tion).. if {(
55f0: 24 6d 69 6e 20 3c 20 30 29 20 7c 7c 20 28 24 69 $min < 0) || ($i
5600: 6e 74 65 72 76 61 6c 20 3c 20 24 6d 69 6e 29 7d nterval < $min)}
5610: 20 7b 0a 09 09 73 65 74 20 6d 69 6e 20 20 24 69 {...set min $i
5620: 6e 74 65 72 76 61 6c 0a 09 09 73 65 74 20 62 65 nterval...set be
5630: 73 74 20 5b 6c 69 73 74 20 24 6c 6f 63 61 74 69 st [list $locati
5640: 6f 6e 5d 0a 09 20 20 20 20 7d 20 65 6c 73 65 69 on].. } elsei
5650: 66 20 7b 24 69 6e 74 65 72 76 61 6c 20 3d 3d 20 f {$interval ==
5660: 24 6d 69 6e 7d 20 7b 0a 09 09 6c 61 70 70 65 6e $min} {...lappen
5670: 64 20 62 65 73 74 20 24 6c 6f 63 61 74 69 6f 6e d best $location
5680: 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 .. }..}...if
5690: 7b 5b 6c 6c 65 6e 67 74 68 20 24 62 65 73 74 5d {[llength $best]
56a0: 20 3d 3d 20 31 7d 20 7b 20 72 65 74 75 72 6e 20 == 1} { return
56b0: 5b 6c 69 6e 64 65 78 20 24 62 65 73 74 20 30 5d [lindex $best 0]
56c0: 20 7d 0a 0a 09 72 65 74 75 72 6e 20 5b 6c 69 6e }...return [lin
56d0: 64 65 78 20 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 dex [lsort -inte
56e0: 67 65 72 20 2d 69 6e 63 72 65 61 73 69 6e 67 20 ger -increasing
56f0: 24 62 65 73 74 5d 20 30 5d 0a 20 20 20 20 7d 0a $best] 0]. }.
5700: 0a 20 20 20 20 70 72 6f 63 20 43 75 74 41 74 20 . proc CutAt
5710: 7b 6c 6f 63 61 74 69 6f 6e 7d 20 7b 0a 09 75 70 {location} {..up
5720: 76 61 72 20 31 20 63 72 6f 73 73 20 63 72 6f 73 var 1 cross cros
5730: 73 20 64 65 70 63 20 64 65 70 63 0a 0a 09 23 20 s depc depc...#
5740: 49 74 20 77 61 73 20 64 65 63 69 64 65 64 20 74 It was decided t
5750: 6f 20 73 70 6c 69 74 20 74 68 65 20 63 68 61 6e o split the chan
5760: 67 65 73 65 74 20 61 74 20 74 68 65 20 67 69 76 geset at the giv
5770: 65 6e 0a 09 23 20 6c 6f 63 61 74 69 6f 6e 2e 20 en..# location.
5780: 54 68 69 73 20 63 75 74 73 20 61 20 6e 75 6d 62 This cuts a numb
5790: 65 72 20 6f 66 20 64 65 70 65 6e 64 65 6e 63 69 er of dependenci
57a0: 65 73 2e 20 48 65 72 65 20 77 65 20 75 70 64 61 es. Here we upda
57b0: 74 65 0a 09 23 20 74 68 65 20 63 72 6f 73 73 20 te..# the cross
57c0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 information so t
57d0: 68 61 74 20 74 68 65 20 62 72 65 61 6b 20 66 69 hat the break fi
57e0: 6e 64 65 72 20 68 61 73 20 61 63 63 75 72 61 74 nder has accurat
57f0: 65 0a 09 23 20 64 61 74 61 20 77 68 65 6e 20 77 e..# data when w
5800: 65 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20 67 65 e look at the ge
5810: 6e 65 72 61 74 65 64 20 66 72 61 67 6d 65 6e 74 nerated fragment
5820: 73 2e 0a 0a 09 73 65 74 20 73 69 78 20 5b 6c 6f s....set six [lo
5830: 67 20 76 69 73 69 62 6c 65 3f 20 36 5d 0a 0a 09 g visible? 6]...
5840: 66 6f 72 65 61 63 68 20 7b 64 65 70 20 72 61 6e foreach {dep ran
5850: 67 65 7d 20 5b 61 72 72 61 79 20 67 65 74 20 64 ge} [array get d
5860: 65 70 63 5d 20 7b 0a 09 20 20 20 20 23 20 43 68 epc] {.. # Ch
5870: 65 63 6b 20 61 6c 6c 20 64 65 70 65 6e 64 65 6e eck all dependen
5880: 63 69 65 73 20 73 74 69 6c 6c 20 6b 6e 6f 77 6e cies still known
5890: 2c 20 74 61 6b 65 20 74 68 65 69 72 20 72 61 6e , take their ran
58a0: 67 65 20 61 6e 64 0a 09 20 20 20 20 23 20 73 65 ge and.. # se
58b0: 65 20 69 66 20 74 68 65 20 62 72 65 61 6b 20 6c e if the break l
58c0: 6f 63 61 74 69 6f 6e 20 66 61 6c 6c 73 20 77 69 ocation falls wi
58d0: 74 68 69 6e 2e 0a 0a 09 20 20 20 20 42 6f 72 64 thin.... Bord
58e0: 65 72 20 24 72 61 6e 67 65 20 73 20 65 0a 09 20 er $range s e..
58f0: 20 20 20 69 66 20 7b 24 6c 6f 63 61 74 69 6f 6e if {$location
5900: 20 3c 20 24 73 7d 20 63 6f 6e 74 69 6e 75 65 20 < $s} continue
5910: 3b 20 23 20 62 72 65 61 6b 20 62 65 66 6f 72 65 ; # break before
5920: 20 72 61 6e 67 65 2c 20 69 67 6e 6f 72 65 0a 09 range, ignore..
5930: 20 20 20 20 69 66 20 7b 24 6c 6f 63 61 74 69 6f if {$locatio
5940: 6e 20 3e 20 24 65 7d 20 63 6f 6e 74 69 6e 75 65 n > $e} continue
5950: 20 3b 20 23 20 62 72 65 61 6b 20 61 66 74 65 72 ; # break after
5960: 20 72 61 6e 67 65 2c 20 69 67 6e 6f 72 65 2e 0a range, ignore..
5970: 0a 09 20 20 20 20 23 20 54 68 69 73 20 64 65 70 .. # This dep
5980: 65 6e 64 65 6e 63 79 20 63 72 6f 73 73 65 73 20 endency crosses
5990: 74 68 65 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 the break locati
59a0: 6f 6e 2e 20 57 65 20 72 65 6d 6f 76 65 20 69 74 on. We remove it
59b0: 0a 09 20 20 20 20 23 20 66 72 6f 6d 20 74 68 65 .. # from the
59c0: 20 63 72 6f 73 73 69 6e 67 73 20 63 6f 75 6e 74 crossings count
59d0: 65 72 73 2c 20 61 6e 64 20 74 68 65 6e 20 61 6c ers, and then al
59e0: 73 6f 20 66 72 6f 6d 20 74 68 65 20 73 65 74 0a so from the set.
59f0: 09 20 20 20 20 23 20 6f 66 20 6b 6e 6f 77 6e 20 . # of known
5a00: 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 dependencies, as
5a10: 20 77 65 20 61 72 65 20 64 6f 6e 65 20 77 69 74 we are done wit
5a20: 68 20 69 74 2e 0a 0a 09 20 20 20 20 66 6f 72 65 h it.... fore
5a30: 61 63 68 20 6c 6f 63 20 24 64 65 70 63 28 24 64 ach loc $depc($d
5a40: 65 70 29 20 7b 20 69 6e 63 72 20 63 72 6f 73 73 ep) { incr cross
5a50: 28 24 6c 6f 63 29 20 2d 31 20 7d 0a 09 20 20 20 ($loc) -1 }..
5a60: 20 75 6e 73 65 74 20 64 65 70 63 28 24 64 65 70 unset depc($dep
5a70: 29 0a 0a 09 20 20 20 20 69 66 20 7b 21 24 73 69 )... if {!$si
5a80: 78 7d 20 63 6f 6e 74 69 6e 75 65 0a 0a 09 20 20 x} continue...
5a90: 20 20 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 struct::list a
5aa0: 73 73 69 67 6e 20 24 64 65 70 20 70 61 72 65 6e ssign $dep paren
5ab0: 74 20 63 68 69 6c 64 0a 09 20 20 20 20 6c 6f 67 t child.. log
5ac0: 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22 write 6 csets "
5ad0: 42 72 6f 6b 65 20 64 65 70 65 6e 64 65 6e 63 79 Broke dependency
5ae0: 20 5b 50 44 20 24 70 61 72 65 6e 74 5d 20 2d 2d [PD $parent] --
5af0: 3e 20 5b 50 44 20 24 63 68 69 6c 64 5d 22 0a 09 > [PD $child]"..
5b00: 7d 0a 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d }...return. }
5b10: 0a 0a 20 20 20 20 23 20 50 72 69 6e 74 20 69 64 .. # Print id
5b20: 65 6e 74 69 66 79 69 6e 67 20 64 61 74 61 20 66 entifying data f
5b30: 6f 72 20 61 20 72 65 76 69 73 69 6f 6e 20 28 70 or a revision (p
5b40: 72 6f 6a 65 63 74 2c 20 66 69 6c 65 2c 20 64 6f roject, file, do
5b50: 74 74 65 64 20 72 65 76 0a 20 20 20 20 23 20 6e tted rev. # n
5b60: 75 6d 62 65 72 29 2c 20 66 6f 72 20 68 69 67 68 umber), for high
5b70: 20 76 65 72 62 6f 73 69 74 79 20 6c 6f 67 20 6f verbosity log o
5b80: 75 74 70 75 74 2e 0a 0a 20 20 20 20 70 72 6f 63 utput... proc
5b90: 20 50 44 20 7b 69 64 7d 20 7b 0a 09 66 6f 72 65 PD {id} {..fore
5ba0: 61 63 68 20 7b 70 20 66 20 72 7d 20 5b 73 74 61 ach {p f r} [sta
5bb0: 74 65 20 72 75 6e 20 7b 0a 09 09 53 45 4c 45 43 te run {...SELEC
5bc0: 54 20 50 2e 6e 61 6d 65 20 2c 20 46 2e 6e 61 6d T P.name , F.nam
5bd0: 65 2c 20 52 2e 72 65 76 0a 09 09 46 52 4f 4d 20 e, R.rev...FROM
5be0: 72 65 76 69 73 69 6f 6e 20 52 2c 20 66 69 6c 65 revision R, file
5bf0: 20 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09 09 F, project P...
5c00: 57 48 45 52 45 20 52 2e 72 69 64 20 3d 20 24 69 WHERE R.rid = $i
5c10: 64 0a 09 09 41 4e 44 20 20 20 52 2e 66 69 64 20 d...AND R.fid
5c20: 3d 20 46 2e 66 69 64 0a 09 09 41 4e 44 20 20 20 = F.fid...AND
5c30: 46 2e 70 69 64 20 3d 20 50 2e 70 69 64 0a 09 7d F.pid = P.pid..}
5c40: 5d 20 62 72 65 61 6b 0a 09 72 65 74 75 72 6e 20 ] break..return
5c50: 22 27 24 70 20 3a 20 24 66 2f 24 72 27 22 0a 20 "'$p : $f/$r'".
5c60: 20 20 20 7d 0a 0a 20 20 20 20 23 20 50 72 69 6e }.. # Prin
5c70: 74 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 ting one or more
5c80: 20 72 61 6e 67 65 73 2c 20 66 6f 72 6d 61 74 74 ranges, formatt
5c90: 65 64 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 ed, and only the
5ca0: 69 72 20 62 6f 72 64 65 72 20 74 6f 0a 20 20 20 ir border to.
5cb0: 20 23 20 6b 65 65 70 20 74 68 65 20 73 74 72 69 # keep the stri
5cc0: 6e 67 73 20 73 68 6f 72 74 2e 0a 0a 20 20 20 20 ngs short...
5cd0: 70 72 6f 63 20 50 52 73 20 7b 72 61 6e 67 65 73 proc PRs {ranges
5ce0: 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b 73 74 72 } {..return [str
5cf0: 75 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20 24 72 uct::list map $r
5d00: 61 6e 67 65 73 20 5b 6d 79 70 72 6f 63 20 50 52 anges [myproc PR
5d10: 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 ]]. }.. pr
5d20: 6f 63 20 50 52 20 7b 72 61 6e 67 65 7d 20 7b 0a oc PR {range} {.
5d30: 09 42 6f 72 64 65 72 20 24 72 61 6e 67 65 20 73 .Border $range s
5d40: 20 65 0a 09 72 65 74 75 72 6e 20 3c 24 7b 73 7d e..return <${s}
5d50: 2e 2e 2e 24 7b 65 7d 3e 0a 20 20 20 20 7d 0a 0a ...${e}>. }..
5d60: 20 20 20 20 70 72 6f 63 20 42 6f 72 64 65 72 20 proc Border
5d70: 7b 72 61 6e 67 65 20 73 76 20 65 76 7d 20 7b 0a {range sv ev} {.
5d80: 09 75 70 76 61 72 20 31 20 24 73 76 20 73 20 24 .upvar 1 $sv s $
5d90: 65 76 20 65 0a 09 73 65 74 20 73 20 5b 6c 69 6e ev e..set s [lin
5da0: 64 65 78 20 24 72 61 6e 67 65 20 30 5d 0a 09 73 dex $range 0]..s
5db0: 65 74 20 65 20 5b 6c 69 6e 64 65 78 20 24 72 61 et e [lindex $ra
5dc0: 6e 67 65 20 65 6e 64 5d 0a 09 72 65 74 75 72 6e nge end]..return
5dd0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 . }.. # #
5de0: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 ## ### ##### ###
5df0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 ##### ##########
5e00: 23 23 23 0a 0a 20 20 20 20 74 79 70 65 76 61 72 ###.. typevar
5e10: 69 61 62 6c 65 20 6d 79 63 68 61 6e 67 65 73 65 iable mychangese
5e20: 74 73 20 20 20 20 7b 7d 20 3b 20 23 20 4c 69 73 ts {} ; # Lis
5e30: 74 20 6f 66 20 61 6c 6c 20 6b 6e 6f 77 6e 20 63 t of all known c
5e40: 68 61 6e 67 65 73 65 74 73 2e 0a 20 20 20 20 74 hangesets.. t
5e50: 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 72 65 ypevariable myre
5e60: 76 6d 61 70 20 2d 61 72 72 61 79 20 7b 7d 20 3b vmap -array {} ;
5e70: 20 23 20 4d 61 70 20 66 72 6f 6d 20 72 65 76 69 # Map from revi
5e80: 73 69 6f 6e 73 20 74 6f 20 74 68 65 20 6c 69 73 sions to the lis
5e90: 74 0a 09 09 09 09 20 20 20 20 20 20 23 20 6f 66 t..... # of
5ea0: 20 63 68 61 6e 67 65 73 65 74 73 20 63 6f 6e 74 changesets cont
5eb0: 61 69 6e 69 6e 67 0a 09 09 09 09 20 20 20 20 20 aining.....
5ec0: 20 23 20 69 74 2e 20 4e 4f 54 45 3a 20 57 68 69 # it. NOTE: Whi
5ed0: 6c 65 20 6f 6e 6c 79 20 6f 6e 65 0a 09 09 09 09 le only one.....
5ee0: 20 20 20 20 20 20 23 20 72 65 76 69 73 69 6f 6e # revision
5ef0: 20 63 68 61 6e 67 65 73 65 74 20 63 61 6e 20 63 changeset can c
5f00: 6f 6e 74 61 69 6e 0a 09 09 09 09 20 20 20 20 20 ontain.....
5f10: 20 23 20 74 68 65 20 72 65 76 69 73 69 6f 6e 2c # the revision,
5f20: 20 74 68 65 72 65 20 63 61 6e 0a 09 09 09 09 20 there can.....
5f30: 20 20 20 20 20 23 20 68 6f 77 65 76 65 72 20 61 # however a
5f40: 6c 73 6f 20 62 65 20 6f 6e 65 20 6f 72 20 6d 6f lso be one or mo
5f50: 72 65 0a 09 09 09 09 20 20 20 20 20 20 23 20 61 re..... # a
5f60: 64 64 69 74 69 6f 6e 61 6c 20 73 79 6d 62 6f 6c dditional symbol
5f70: 20 63 68 61 6e 67 65 73 65 74 73 0a 09 09 09 09 changesets.....
5f80: 20 20 20 20 20 20 23 20 77 68 69 63 68 20 75 73 # which us
5f90: 65 20 69 74 2c 20 68 65 6e 63 65 20 61 20 6c 69 e it, hence a li
5fa0: 73 74 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69 st.. typevari
5fb0: 61 62 6c 65 20 6d 79 69 64 6d 61 70 20 20 2d 61 able myidmap -a
5fc0: 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 rray {} ; # Map
5fd0: 66 72 6f 6d 20 63 68 61 6e 67 65 73 65 74 20 69 from changeset i
5fe0: 64 20 74 6f 20 63 68 61 6e 67 65 73 65 74 2e 0a d to changeset..
5ff0: 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 typevariable
6000: 20 6d 79 62 72 61 6e 63 68 63 6f 64 65 20 20 20 mybranchcode
6010: 20 7b 7d 20 3b 20 23 20 4c 6f 63 61 6c 20 63 6f {} ; # Local co
6020: 70 79 20 6f 66 20 70 72 6f 6a 65 63 74 3a 3a 73 py of project::s
6030: 79 6d 2f 6d 79 62 72 61 6e 63 68 2e 0a 0a 20 20 ym/mybranch...
6040: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 61 6c 6c typemethod all
6050: 20 20 20 7b 7d 20 20 20 7b 20 72 65 74 75 72 6e {} { return
6060: 20 24 6d 79 63 68 61 6e 67 65 73 65 74 73 20 7d $mychangesets }
6070: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 . typemethod
6080: 6f 66 20 20 20 20 7b 69 64 7d 20 7b 20 72 65 74 of {id} { ret
6090: 75 72 6e 20 24 6d 79 69 64 6d 61 70 28 24 69 64 urn $myidmap($id
60a0: 29 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 ) }. typemeth
60b0: 6f 64 20 6f 66 72 65 76 20 7b 69 64 7d 20 7b 20 od ofrev {id} {
60c0: 72 65 74 75 72 6e 20 24 6d 79 72 65 76 6d 61 70 return $myrevmap
60d0: 28 24 69 64 29 20 7d 0a 0a 20 20 20 20 23 20 23 ($id) }.. # #
60e0: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 ## ### ##### ##
60f0: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 ###### #########
6100: 23 23 23 23 0a 20 20 20 20 23 23 20 43 6f 6e 66 ####. ## Conf
6110: 69 67 75 72 61 74 69 6f 6e 0a 0a 20 20 20 20 70 iguration.. p
6120: 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65 69 6e ragma -hastypein
6130: 66 6f 20 20 20 20 6e 6f 20 20 3b 20 23 20 6e 6f fo no ; # no
6140: 20 74 79 70 65 20 69 6e 74 72 6f 73 70 65 63 74 type introspect
6150: 69 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61 20 2d ion. pragma -
6160: 68 61 73 69 6e 66 6f 20 20 20 20 20 20 20 20 6e hasinfo n
6170: 6f 20 20 3b 20 23 20 6e 6f 20 6f 62 6a 65 63 74 o ; # no object
6180: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20 introspection.
6190: 20 20 20 70 72 61 67 6d 61 20 2d 73 69 6d 70 6c pragma -simpl
61a0: 65 64 69 73 70 61 74 63 68 20 79 65 73 20 3b 20 edispatch yes ;
61b0: 23 20 73 69 6d 70 6c 65 20 66 61 73 74 20 64 69 # simple fast di
61c0: 73 70 61 74 63 68 0a 0a 20 20 20 20 23 20 23 20 spatch.. # #
61d0: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 ## ### ##### ###
61e0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 ##### ##########
61f0: 23 23 23 0a 7d 0a 0a 6e 61 6d 65 73 70 61 63 65 ###.}..namespace
6200: 20 65 76 61 6c 20 3a 3a 76 63 3a 3a 66 6f 73 73 eval ::vc::foss
6210: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a il::import::cvs:
6220: 3a 70 72 6f 6a 65 63 74 20 7b 0a 20 20 20 20 6e :project {. n
6230: 61 6d 65 73 70 61 63 65 20 65 78 70 6f 72 74 20 amespace export
6240: 72 65 76 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 rev. namespac
6250: 65 20 65 76 61 6c 20 72 65 76 20 7b 0a 09 6e 61 e eval rev {..na
6260: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a mespace import :
6270: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 :vc::fossil::imp
6280: 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a ort::cvs::state.
6290: 09 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 .namespace eval
62a0: 70 72 6f 6a 65 63 74 20 7b 0a 09 20 20 20 20 6e project {.. n
62b0: 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 amespace import
62c0: 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d ::vc::fossil::im
62d0: 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 port::cvs::proje
62e0: 63 74 3a 3a 73 79 6d 0a 09 7d 0a 09 3a 3a 76 61 ct::sym..}..::va
62f0: 72 69 61 62 6c 65 20 6d 79 62 72 61 6e 63 68 63 riable mybranchc
6300: 6f 64 65 20 5b 70 72 6f 6a 65 63 74 3a 3a 73 79 ode [project::sy
6310: 6d 20 62 72 61 6e 63 68 5d 0a 09 6e 61 6d 65 73 m branch]..names
6320: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 pace import ::vc
6330: 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69 73 63 3a 3a 2a ::tools::misc::*
6340: 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f ..namespace impo
6350: 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a rt ::vc::tools::
6360: 74 72 6f 75 62 6c 65 0a 09 6e 61 6d 65 73 70 61 trouble..namespa
6370: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a ce import ::vc::
6380: 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 6c 6f 67 20 tools::log..log
6390: 72 65 67 69 73 74 65 72 20 63 73 65 74 73 0a 20 register csets.
63a0: 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 }.}..# # ## #
63b0: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 ## ##### #######
63c0: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 # #############
63d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################
63e0: 23 23 23 23 23 0a 23 23 20 52 65 61 64 79 0a 0a #####.## Ready..
63f0: 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20 package provide
6400: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f vc::fossil::impo
6410: 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 rt::cvs::project
6420: 3a 3a 72 65 76 20 31 2e 30 0a 72 65 74 75 72 6e ::rev 1.0.return
6430: 0a .