Artifact bf483d028a0f07379f4eb34cc68a40d3e395f607:
File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [00bf8c198e] - The performance was still not satisfying, even with faster recomputing of successors. Doing it multiple times (Building the graph in each breaker and sort passes) eats time. Caching in memory blows the memory. Chosen solution: Cache this information in the database.Created a new pass 'CsetDeps' which is run between 'InitCsets' and 'BreakRevCsetCycles' (i.e. changeset creation and first breaker pass). It computes the changeset dependencies from the file-level dependencies once and saves the result in the state, in the new table 'cssuccessor'. Now the breaker and sort passes can get the information quickly, with virtually no effort. The dependencies are recomputed incrementally when a changeset is split by one of the breaker passes, for its fragments and its predecessors.
The loop check is now trivial, and integrated into the successor computation, with the heavy lifting for the detailed analysis and reporting moved down into the type-dependent SQL queries. The relevant new method is 'loops'. Now that the loop check is incremental the pass based checks have been removed from the integrity module, and the option '--loopcheck' has been eliminated. For paranoia the graph setup and modification code got its loop check reinstated as an assert, redusing the changeset report code.
Renumbered the breaker and sort passes. A number of places, like graph setup and traversal, loading of changesets, etc. got feedback indicators to show their progress.
The selection of revision and symbol changesets for the associated breaker passes was a bit on the slow side. We now keep changeset lists sorted by type (during loading or general construction) and access them directly.
by aku on 2007-12-02 20:04:40.
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 73 74 72 75 63 74 3a 3a 73 equire struct::s 0380: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20 et 0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23 ; # 03a0: 20 53 65 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e Set operations. 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 6d 69 73 63 vc::tools::misc 03d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 03e0: 20 20 20 20 20 20 20 3b 20 23 20 54 65 78 74 20 ; # Text 03f0: 66 6f 72 6d 61 74 74 69 6e 67 0a 70 61 63 6b 61 formatting.packa 0400: 67 65 20 72 65 71 75 69 72 65 20 76 63 3a 3a 74 ge require vc::t 0410: 6f 6f 6c 73 3a 3a 74 72 6f 75 62 6c 65 20 20 20 ools::trouble 0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 0430: 20 3b 20 23 20 45 72 72 6f 72 20 72 65 70 6f 72 ; # Error repor 0440: 74 69 6e 67 2e 0a 70 61 63 6b 61 67 65 20 72 65 ting..package re 0450: 71 75 69 72 65 20 76 63 3a 3a 74 6f 6f 6c 73 3a quire vc::tools: 0460: 3a 6c 6f 67 20 20 20 20 20 20 20 20 20 20 20 20 :log 0470: 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23 20 ; # 0480: 55 73 65 72 20 66 65 65 64 62 61 63 6b 2e 0a 70 User feedback..p 0490: 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 76 ackage require v 04a0: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 c::fossil::impor 04b0: 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 20 20 20 t::cvs::state 04c0: 20 20 20 20 20 3b 20 23 20 53 74 61 74 65 20 73 ; # State s 04d0: 74 6f 72 61 67 65 2e 0a 70 61 63 6b 61 67 65 20 torage..package 04e0: 72 65 71 75 69 72 65 20 76 63 3a 3a 66 6f 73 73 require vc::foss 04f0: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a il::import::cvs: 0500: 3a 69 6e 74 65 67 72 69 74 79 20 20 20 20 3b 20 :integrity ; 0510: 23 20 53 74 61 74 65 20 69 6e 74 65 67 72 69 74 # State integrit 0520: 79 20 63 68 65 63 6b 73 2e 0a 0a 23 20 23 20 23 y checks...# # # 0530: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 # ### ##### #### 0540: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 #### ########### 0550: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 ## ############# 0560: 23 23 23 23 23 23 23 23 0a 23 23 0a 0a 73 6e 69 ########.##..sni 0570: 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f t::type ::vc::fo 0580: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 ssil::import::cv 0590: 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 20 s::project::rev 05a0: 7b 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23 {. # # ## ### 05b0: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 ##### ######## 05c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 20 #############. 05d0: 20 20 23 23 20 50 75 62 6c 69 63 20 41 50 49 0a ## Public API. 05e0: 0a 20 20 20 20 63 6f 6e 73 74 72 75 63 74 6f 72 . constructor 05f0: 20 7b 70 72 6f 6a 65 63 74 20 63 73 74 79 70 65 {project cstype 0600: 20 73 72 63 69 64 20 69 74 65 6d 73 20 7b 74 68 srcid items {th 0610: 65 69 64 20 7b 7d 7d 7d 20 7b 0a 09 69 66 20 7b eid {}}} {..if { 0620: 24 74 68 65 69 64 20 6e 65 20 22 22 7d 20 7b 0a $theid ne ""} {. 0630: 09 20 20 20 20 73 65 74 20 6d 79 69 64 20 24 74 . set myid $t 0640: 68 65 69 64 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 heid..} else {.. 0650: 20 20 20 20 73 65 74 20 6d 79 69 64 20 5b 69 6e set myid [in 0660: 63 72 20 6d 79 63 6f 75 6e 74 65 72 5d 0a 09 7d cr mycounter]..} 0670: 0a 0a 09 69 6e 74 65 67 72 69 74 79 20 61 73 73 ...integrity ass 0680: 65 72 74 20 7b 0a 09 20 20 20 20 5b 69 6e 66 6f ert {.. [info 0690: 20 65 78 69 73 74 73 20 6d 79 63 73 74 79 70 65 exists mycstype 06a0: 28 24 63 73 74 79 70 65 29 5d 0a 09 7d 20 7b 42 ($cstype)]..} {B 06b0: 61 64 20 63 68 61 6e 67 65 73 65 74 20 74 79 70 ad changeset typ 06c0: 65 20 27 24 63 73 74 79 70 65 27 2e 7d 0a 0a 09 e '$cstype'.}... 06d0: 73 65 74 20 6d 79 70 72 6f 6a 65 63 74 20 20 20 set myproject 06e0: 24 70 72 6f 6a 65 63 74 0a 09 73 65 74 20 6d 79 $project..set my 06f0: 74 79 70 65 20 20 20 20 20 20 24 63 73 74 79 70 type $cstyp 0700: 65 0a 09 73 65 74 20 6d 79 74 79 70 65 6f 62 6a e..set mytypeobj 0710: 20 20 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a ::vc::fossil: 0720: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 :import::cvs::pr 0730: 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 24 7b 63 73 oject::rev::${cs 0740: 74 79 70 65 7d 0a 09 73 65 74 20 6d 79 73 72 63 type}..set mysrc 0750: 69 64 09 24 73 72 63 69 64 0a 09 73 65 74 20 6d id.$srcid..set m 0760: 79 69 74 65 6d 73 20 20 20 20 20 24 69 74 65 6d yitems $item 0770: 73 0a 09 73 65 74 20 6d 79 70 6f 73 20 20 20 20 s..set mypos 0780: 20 20 20 7b 7d 20 3b 20 23 20 43 6f 6d 6d 69 74 {} ; # Commit 0790: 20 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6e 6f 74 location is not 07a0: 20 6b 6e 6f 77 6e 20 79 65 74 2e 0a 0a 09 23 20 known yet....# 07b0: 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 Keep track of th 07c0: 65 20 67 65 6e 65 72 61 74 65 64 20 63 68 61 6e e generated chan 07d0: 67 65 73 65 74 73 20 61 6e 64 20 6f 66 20 74 68 gesets and of th 07e0: 65 20 69 6e 76 65 72 73 65 0a 09 23 20 6d 61 70 e inverse..# map 07f0: 70 69 6e 67 20 66 72 6f 6d 20 69 74 65 6d 73 20 ping from items 0800: 74 6f 20 74 68 65 6d 2e 0a 09 6c 61 70 70 65 6e to them...lappen 0810: 64 20 6d 79 63 68 61 6e 67 65 73 65 74 73 20 20 d mychangesets 0820: 20 24 73 65 6c 66 0a 09 6c 61 70 70 65 6e 64 20 $self..lappend 0830: 6d 79 74 63 68 61 6e 67 65 73 65 74 73 28 24 63 mytchangesets($c 0840: 73 74 79 70 65 29 20 24 73 65 6c 66 0a 09 73 65 stype) $self..se 0850: 74 20 20 20 20 20 6d 79 69 64 6d 61 70 28 24 6d t myidmap($m 0860: 79 69 64 29 20 24 73 65 6c 66 0a 09 66 6f 72 65 yid) $self..fore 0870: 61 63 68 20 69 69 64 20 24 69 74 65 6d 73 20 7b ach iid $items { 0880: 0a 09 20 20 20 20 73 65 74 20 6b 65 79 20 5b 6c .. set key [l 0890: 69 73 74 20 24 63 73 74 79 70 65 20 24 69 69 64 ist $cstype $iid 08a0: 5d 0a 09 20 20 20 20 73 65 74 20 6d 79 69 74 65 ].. set myite 08b0: 6d 6d 61 70 28 24 6b 65 79 29 20 24 73 65 6c 66 mmap($key) $self 08c0: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 6d 79 .. lappend my 08d0: 74 69 74 65 6d 73 20 24 6b 65 79 0a 09 20 20 20 titems $key.. 08e0: 20 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73 65 log write 8 cse 08f0: 74 73 20 7b 4d 41 50 2b 20 69 74 65 6d 20 3c 24 ts {MAP+ item <$ 0900: 6b 65 79 3e 20 24 73 65 6c 66 20 3d 20 5b 24 73 key> $self = [$s 0910: 65 6c 66 20 73 74 72 5d 7d 0a 09 7d 0a 09 72 65 elf str]}..}..re 0920: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 turn. }.. 0930: 6d 65 74 68 6f 64 20 73 74 72 20 7b 7d 20 7b 0a method str {} {. 0940: 09 73 65 74 20 73 74 72 20 20 20 20 22 3c 22 0a .set str "<". 0950: 09 73 65 74 20 64 65 74 61 69 6c 20 22 22 0a 09 .set detail "".. 0960: 69 66 20 7b 5b 24 6d 79 74 79 70 65 6f 62 6a 20 if {[$mytypeobj 0970: 62 79 73 79 6d 62 6f 6c 5d 7d 20 7b 0a 09 20 20 bysymbol]} {.. 0980: 20 20 73 65 74 20 64 65 74 61 69 6c 20 22 20 27 set detail " ' 0990: 5b 73 74 61 74 65 20 6f 6e 65 20 7b 0a 09 09 53 [state one {...S 09a0: 45 4c 45 43 54 20 53 2e 6e 61 6d 65 0a 09 09 46 ELECT S.name...F 09b0: 52 4f 4d 20 20 20 73 79 6d 62 6f 6c 20 53 0a 09 ROM symbol S.. 09c0: 09 57 48 45 52 45 20 20 53 2e 73 69 64 20 3d 20 .WHERE S.sid = 09d0: 24 6d 79 73 72 63 69 64 0a 09 20 20 20 20 7d 5d $mysrcid.. }] 09e0: 27 22 0a 09 7d 0a 09 61 70 70 65 6e 64 20 73 74 '"..}..append st 09f0: 72 20 22 24 6d 79 74 79 70 65 20 24 7b 6d 79 69 r "$mytype ${myi 0a00: 64 7d 24 7b 64 65 74 61 69 6c 7d 3e 22 0a 09 72 d}${detail}>"..r 0a10: 65 74 75 72 6e 20 24 73 74 72 0a 20 20 20 20 7d eturn $str. } 0a20: 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 69 64 20 .. method id 0a30: 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 24 {} { return $ 0a40: 6d 79 69 64 20 7d 0a 20 20 20 20 6d 65 74 68 6f myid }. metho 0a50: 64 20 69 74 65 6d 73 20 7b 7d 20 7b 20 72 65 74 d items {} { ret 0a60: 75 72 6e 20 24 6d 79 74 69 74 65 6d 73 20 7d 0a urn $mytitems }. 0a70: 20 20 20 20 6d 65 74 68 6f 64 20 64 61 74 61 20 method data 0a80: 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 5b 6c 69 {} { return [li 0a90: 73 74 20 24 6d 79 70 72 6f 6a 65 63 74 20 24 6d st $myproject $m 0aa0: 79 74 79 70 65 20 24 6d 79 73 72 63 69 64 5d 20 ytype $mysrcid] 0ab0: 7d 0a 0a 20 20 20 20 64 65 6c 65 67 61 74 65 20 }.. delegate 0ac0: 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 method bysymbol 0ad0: 20 20 74 6f 20 6d 79 74 79 70 65 6f 62 6a 0a 20 to mytypeobj. 0ae0: 20 20 20 64 65 6c 65 67 61 74 65 20 6d 65 74 68 delegate meth 0af0: 6f 64 20 62 79 72 65 76 69 73 69 6f 6e 20 74 6f od byrevision to 0b00: 20 6d 79 74 79 70 65 6f 62 6a 0a 20 20 20 20 64 mytypeobj. d 0b10: 65 6c 65 67 61 74 65 20 6d 65 74 68 6f 64 20 69 elegate method i 0b20: 73 62 72 61 6e 63 68 20 20 20 74 6f 20 6d 79 74 sbranch to myt 0b30: 79 70 65 6f 62 6a 0a 20 20 20 20 64 65 6c 65 67 ypeobj. deleg 0b40: 61 74 65 20 6d 65 74 68 6f 64 20 69 73 74 61 67 ate method istag 0b50: 20 20 20 20 20 20 74 6f 20 6d 79 74 79 70 65 6f to mytypeo 0b60: 62 6a 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 bj.. method s 0b70: 65 74 70 6f 73 20 7b 70 7d 20 7b 20 73 65 74 20 etpos {p} { set 0b80: 6d 79 70 6f 73 20 24 70 20 3b 20 72 65 74 75 72 mypos $p ; retur 0b90: 6e 20 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20 70 n }. method p 0ba0: 6f 73 20 20 20 20 7b 7d 20 20 7b 20 72 65 74 75 os {} { retu 0bb0: 72 6e 20 24 6d 79 70 6f 73 20 7d 0a 0a 20 20 20 rn $mypos }.. 0bc0: 20 6d 65 74 68 6f 64 20 64 65 74 65 72 6d 69 6e method determin 0bd0: 65 73 75 63 63 65 73 73 6f 72 73 20 7b 7d 20 7b esuccessors {} { 0be0: 0a 09 23 20 50 61 73 73 20 36 20 6f 70 65 72 61 ..# Pass 6 opera 0bf0: 74 69 6f 6e 2e 20 43 6f 6d 70 75 74 65 20 70 72 tion. Compute pr 0c00: 6f 6a 65 63 74 2d 6c 65 76 65 6c 20 64 65 70 65 oject-level depe 0c10: 6e 64 65 6e 63 69 65 73 20 66 72 6f 6d 0a 09 23 ndencies from..# 0c20: 20 74 68 65 20 66 69 6c 65 2d 6c 65 76 65 6c 20 the file-level 0c30: 64 61 74 61 20 61 6e 64 20 73 61 76 65 20 69 74 data and save it 0c40: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 74 61 back to the sta 0c50: 74 65 2e 20 54 68 69 73 20 6d 61 79 0a 09 23 20 te. This may..# 0c60: 62 65 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 be called during 0c70: 20 74 68 65 20 63 79 63 6c 65 20 62 72 65 61 6b the cycle break 0c80: 65 72 20 70 61 73 73 65 73 20 61 73 20 77 65 6c er passes as wel 0c90: 6c 2c 20 74 6f 20 61 64 6a 75 73 74 0a 09 23 20 l, to adjust..# 0ca0: 74 68 65 20 73 75 63 63 65 73 73 6f 72 20 69 6e the successor in 0cb0: 66 6f 72 6d 61 74 69 6f 6e 20 6f 66 20 63 68 61 formation of cha 0cc0: 6e 67 65 73 65 74 73 20 77 68 69 63 68 20 61 72 ngesets which ar 0cd0: 65 20 74 68 65 0a 09 23 20 70 72 65 64 65 63 65 e the..# predece 0ce0: 73 73 6f 72 73 20 6f 66 20 64 72 6f 70 70 65 64 ssors of dropped 0cf0: 20 63 68 61 6e 67 65 73 65 74 73 2e 20 46 6f 72 changesets. For 0d00: 20 74 68 65 6d 20 77 65 20 68 61 76 65 20 74 6f them we have to 0d10: 0a 09 23 20 72 65 6d 6f 76 65 20 74 68 65 69 72 ..# remove their 0d20: 20 65 78 69 73 74 69 6e 67 20 69 6e 66 6f 72 6d existing inform 0d30: 61 74 69 6f 6e 20 66 69 72 73 74 20 62 65 66 6f ation first befo 0d40: 72 65 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65 re inserting the 0d50: 0a 09 23 20 6e 65 77 20 64 61 74 61 2e 0a 09 73 ..# new data...s 0d60: 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 tate run {.. 0d70: 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 73 73 75 DELETE FROM cssu 0d80: 63 63 65 73 73 6f 72 20 57 48 45 52 45 20 63 69 ccessor WHERE ci 0d90: 64 20 3d 20 24 6d 79 69 64 3b 0a 09 7d 0a 09 73 d = $myid;..}..s 0da0: 65 74 20 6c 6f 6f 70 20 30 0a 09 66 6f 72 65 61 et loop 0..forea 0db0: 63 68 20 6e 69 64 20 5b 24 6d 79 74 79 70 65 6f ch nid [$mytypeo 0dc0: 62 6a 20 63 73 5f 73 75 63 63 65 73 73 6f 72 73 bj cs_successors 0dd0: 20 24 6d 79 69 74 65 6d 73 5d 20 7b 0a 09 20 20 $myitems] {.. 0de0: 20 20 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 state run {... 0df0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 73 73 75 INSERT INTO cssu 0e00: 63 63 65 73 73 6f 72 20 28 63 69 64 2c 20 20 6e ccessor (cid, n 0e10: 69 64 29 0a 09 09 56 41 4c 55 45 53 20 20 20 20 id)...VALUES 0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 24 ($ 0e30: 6d 79 69 64 2c 24 6e 69 64 29 0a 09 20 20 20 20 myid,$nid).. 0e40: 7d 0a 09 20 20 20 20 69 66 20 7b 24 6e 69 64 20 }.. if {$nid 0e50: 3d 3d 20 24 6d 79 69 64 7d 20 7b 20 73 65 74 20 == $myid} { set 0e60: 6c 6f 6f 70 20 31 20 7d 0a 09 7d 0a 09 23 20 52 loop 1 }..}..# R 0e70: 65 70 6f 72 74 20 61 66 74 65 72 20 74 68 65 20 eport after the 0e80: 63 6f 6d 70 6c 65 74 65 20 73 74 72 75 63 74 75 complete structu 0e90: 72 65 20 68 61 73 20 62 65 65 6e 20 73 61 76 65 re has been save 0ea0: 64 2e 0a 09 69 66 20 7b 24 6c 6f 6f 70 7d 20 7b d...if {$loop} { 0eb0: 20 24 73 65 6c 66 20 72 65 70 6f 72 74 6c 6f 6f $self reportloo 0ec0: 70 20 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 p }..return. 0ed0: 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 }.. # result 0ee0: 3d 20 6c 69 73 74 20 28 63 68 61 6e 67 65 73 65 = list (changese 0ef0: 74 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 75 t). method su 0f00: 63 63 65 73 73 6f 72 73 20 7b 7d 20 7b 0a 09 23 ccessors {} {..# 0f10: 20 55 73 65 20 74 68 65 20 64 61 74 61 20 73 61 Use the data sa 0f20: 76 65 64 20 62 79 20 70 61 73 73 20 36 2e 0a 09 ved by pass 6... 0f30: 72 65 74 75 72 6e 20 5b 73 74 72 75 63 74 3a 3a return [struct:: 0f40: 6c 69 73 74 20 6d 61 70 20 5b 73 74 61 74 65 20 list map [state 0f50: 72 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 run {.. SELEC 0f60: 54 20 53 2e 6e 69 64 0a 09 20 20 20 20 46 52 4f T S.nid.. FRO 0f70: 4d 20 20 20 63 73 73 75 63 63 65 73 73 6f 72 20 M cssuccessor 0f80: 53 0a 09 20 20 20 20 57 48 45 52 45 20 20 53 2e S.. WHERE S. 0f90: 63 69 64 20 3d 20 24 6d 79 69 64 0a 09 7d 5d 20 cid = $myid..}] 0fa0: 5b 6d 79 74 79 70 65 6d 65 74 68 6f 64 20 6f 66 [mytypemethod of 0fb0: 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 ]]. }.. # 0fc0: 72 65 73 75 6c 74 20 3d 20 64 69 63 74 20 28 69 result = dict (i 0fd0: 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 63 68 61 tem -> list (cha 0fe0: 6e 67 65 73 65 74 29 29 0a 20 20 20 20 6d 65 74 ngeset)). met 0ff0: 68 6f 64 20 73 75 63 63 65 73 73 6f 72 6d 61 70 hod successormap 1000: 20 7b 7d 20 7b 0a 09 23 20 4e 4f 54 45 20 2f 20 {} {..# NOTE / 1010: 46 55 54 55 52 45 3a 20 44 65 66 69 6e 69 74 69 FUTURE: Definiti 1020: 76 65 20 62 6f 74 74 6c 65 6e 65 63 6b 20 28 63 ve bottleneck (c 1030: 61 6e 20 62 65 20 6d 69 6c 6c 69 6f 6e 73 20 6f an be millions o 1040: 66 20 70 61 69 72 73 29 2e 0a 09 23 0a 09 23 20 f pairs)...#..# 1050: 4f 6e 6c 79 20 75 73 65 72 20 69 73 20 70 61 73 Only user is pas 1060: 73 20 39 2c 20 63 6f 6d 70 75 74 69 6e 67 20 74 s 9, computing t 1070: 68 65 20 6c 69 6d 69 74 73 20 6f 66 20 62 61 63 he limits of bac 1080: 6b 77 61 72 64 0a 09 23 20 62 72 61 6e 63 68 65 kward..# branche 1090: 73 20 70 65 72 20 62 72 61 6e 63 68 20 69 6e 20 s per branch in 10a0: 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20 54 the changeset. T 10b0: 4f 44 4f 3a 20 46 6f 6c 64 20 74 68 61 74 20 69 ODO: Fold that i 10c0: 6e 74 6f 0a 09 23 20 74 68 65 20 53 51 4c 20 71 nto..# the SQL q 10d0: 75 65 72 79 2c 20 69 2e 65 2e 20 6d 6f 76 65 20 uery, i.e. move 10e0: 74 68 65 20 63 72 75 6e 63 68 69 6e 67 20 66 72 the crunching fr 10f0: 6f 6d 20 54 63 6c 20 74 6f 20 43 2e 0a 0a 09 61 om Tcl to C....a 1100: 72 72 61 79 20 73 65 74 20 74 6d 70 20 7b 7d 0a rray set tmp {}. 1110: 09 66 6f 72 65 61 63 68 20 7b 72 65 76 20 63 68 .foreach {rev ch 1120: 69 6c 64 72 65 6e 7d 20 5b 24 73 65 6c 66 20 6e ildren} [$self n 1130: 65 78 74 6d 61 70 5d 20 7b 0a 09 20 20 20 20 66 extmap] {.. f 1140: 6f 72 65 61 63 68 20 63 68 69 6c 64 20 24 63 68 oreach child $ch 1150: 69 6c 64 72 65 6e 20 7b 0a 09 09 6c 61 70 70 65 ildren {...lappe 1160: 6e 64 20 74 6d 70 28 24 72 65 76 29 20 24 6d 79 nd tmp($rev) $my 1170: 69 74 65 6d 6d 61 70 28 24 63 68 69 6c 64 29 0a itemmap($child). 1180: 09 20 20 20 20 7d 0a 09 20 20 20 20 73 65 74 20 . }.. set 1190: 74 6d 70 28 24 72 65 76 29 20 5b 6c 73 6f 72 74 tmp($rev) [lsort 11a0: 20 2d 75 6e 69 71 75 65 20 24 74 6d 70 28 24 72 -unique $tmp($r 11b0: 65 76 29 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 20 ev)]..}..return 11c0: 5b 61 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a [array get tmp]. 11d0: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 }.. # res 11e0: 75 6c 74 20 3d 20 64 69 63 74 20 28 69 74 65 6d ult = dict (item 11f0: 20 2d 3e 20 6c 69 73 74 20 28 63 68 61 6e 67 65 -> list (change 1200: 73 65 74 29 29 0a 20 20 20 20 6d 65 74 68 6f 64 set)). method 1210: 20 70 72 65 64 65 63 65 73 73 6f 72 6d 61 70 20 predecessormap 1220: 7b 7d 20 7b 0a 09 23 20 4e 4f 54 45 20 2f 20 46 {} {..# NOTE / F 1230: 55 54 55 52 45 3a 20 44 65 66 69 6e 69 74 69 76 UTURE: Definitiv 1240: 65 20 62 6f 74 74 6c 65 6e 65 63 6b 20 28 63 61 e bottleneck (ca 1250: 6e 20 62 65 20 6d 69 6c 6c 69 6f 6e 73 20 6f 66 n be millions of 1260: 20 70 61 69 72 73 29 2e 0a 09 23 0a 09 23 20 4f pairs)...#..# O 1270: 6e 6c 79 20 75 73 65 72 20 69 73 20 70 61 73 73 nly user is pass 1280: 20 39 2c 20 63 6f 6d 70 75 74 69 6e 67 20 74 68 9, computing th 1290: 65 20 6c 69 6d 69 74 73 20 6f 66 20 62 61 63 6b e limits of back 12a0: 77 61 72 64 0a 09 23 20 62 72 61 6e 63 68 65 73 ward..# branches 12b0: 20 70 65 72 20 62 72 61 6e 63 68 20 69 6e 20 74 per branch in t 12c0: 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20 54 4f he changeset. TO 12d0: 44 4f 3a 20 46 6f 6c 64 20 74 68 61 74 20 69 6e DO: Fold that in 12e0: 74 6f 0a 09 23 20 74 68 65 20 53 51 4c 20 71 75 to..# the SQL qu 12f0: 65 72 79 2c 20 69 2e 65 2e 20 6d 6f 76 65 20 74 ery, i.e. move t 1300: 68 65 20 63 72 75 6e 63 68 69 6e 67 20 66 72 6f he crunching fro 1310: 6d 20 54 63 6c 20 74 6f 20 43 2e 0a 0a 09 61 72 m Tcl to C....ar 1320: 72 61 79 20 73 65 74 20 74 6d 70 20 7b 7d 0a 09 ray set tmp {}.. 1330: 66 6f 72 65 61 63 68 20 7b 72 65 76 20 63 68 69 foreach {rev chi 1340: 6c 64 72 65 6e 7d 20 5b 24 73 65 6c 66 20 70 72 ldren} [$self pr 1350: 65 6d 61 70 5d 20 7b 0a 09 20 20 20 20 66 6f 72 emap] {.. for 1360: 65 61 63 68 20 63 68 69 6c 64 20 24 63 68 69 6c each child $chil 1370: 64 72 65 6e 20 7b 0a 09 09 6c 61 70 70 65 6e 64 dren {...lappend 1380: 20 74 6d 70 28 24 72 65 76 29 20 24 6d 79 69 74 tmp($rev) $myit 1390: 65 6d 6d 61 70 28 24 63 68 69 6c 64 29 0a 09 20 emmap($child).. 13a0: 20 20 20 7d 0a 09 20 20 20 20 73 65 74 20 74 6d }.. set tm 13b0: 70 28 24 72 65 76 29 20 5b 6c 73 6f 72 74 20 2d p($rev) [lsort - 13c0: 75 6e 69 71 75 65 20 24 74 6d 70 28 24 72 65 76 unique $tmp($rev 13d0: 29 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b 61 )]..}..return [a 13e0: 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 20 20 rray get tmp]. 13f0: 20 20 7d 0a 0a 20 20 20 20 23 20 69 74 65 6d 20 }.. # item 1400: 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 0a 20 -> list (item). 1410: 20 20 20 6d 65 74 68 6f 64 20 6e 65 78 74 6d 61 method nextma 1420: 70 20 7b 7d 20 7b 0a 09 23 69 66 20 7b 5b 6c 6c p {} {..#if {[ll 1430: 65 6e 67 74 68 20 24 6d 79 6e 65 78 74 6d 61 70 ength $mynextmap 1440: 5d 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 6e ]} { return $myn 1450: 65 78 74 6d 61 70 20 7d 0a 09 24 6d 79 74 79 70 extmap }..$mytyp 1460: 65 6f 62 6a 20 73 75 63 63 65 73 73 6f 72 73 20 eobj successors 1470: 74 6d 70 20 24 6d 79 69 74 65 6d 73 0a 09 72 65 tmp $myitems..re 1480: 74 75 72 6e 20 5b 61 72 72 61 79 20 67 65 74 20 turn [array get 1490: 74 6d 70 5d 0a 09 23 73 65 74 20 6d 79 6e 65 78 tmp]..#set mynex 14a0: 74 6d 61 70 20 5b 61 72 72 61 79 20 67 65 74 20 tmap [array get 14b0: 74 6d 70 5d 0a 09 23 72 65 74 75 72 6e 20 24 6d tmp]..#return $m 14c0: 79 6e 65 78 74 6d 61 70 0a 20 20 20 20 7d 0a 0a ynextmap. }.. 14d0: 20 20 20 20 23 20 69 74 65 6d 20 2d 3e 20 6c 69 # item -> li 14e0: 73 74 20 28 69 74 65 6d 29 0a 20 20 20 20 6d 65 st (item). me 14f0: 74 68 6f 64 20 70 72 65 6d 61 70 20 7b 7d 20 7b thod premap {} { 1500: 0a 09 23 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 ..#if {[llength 1510: 24 6d 79 70 72 65 6d 61 70 5d 7d 20 7b 20 72 65 $mypremap]} { re 1520: 74 75 72 6e 20 24 6d 79 70 72 65 6d 61 70 20 7d turn $mypremap } 1530: 0a 09 24 6d 79 74 79 70 65 6f 62 6a 20 70 72 65 ..$mytypeobj pre 1540: 64 65 63 65 73 73 6f 72 73 20 74 6d 70 20 24 6d decessors tmp $m 1550: 79 69 74 65 6d 73 0a 09 72 65 74 75 72 6e 20 5b yitems..return [ 1560: 61 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 09 array get tmp].. 1570: 23 73 65 74 20 6d 79 70 72 65 6d 61 70 20 5b 61 #set mypremap [a 1580: 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 09 23 rray get tmp]..# 1590: 72 65 74 75 72 6e 20 24 6d 79 70 72 65 6d 61 70 return $mypremap 15a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 . }.. meth 15b0: 6f 64 20 62 72 65 61 6b 69 6e 74 65 72 6e 61 6c od breakinternal 15c0: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 7b 7d 20 dependencies {} 15d0: 7b 0a 0a 09 23 23 0a 09 23 23 20 4e 4f 54 45 3a {...##..## NOTE: 15e0: 20 54 68 69 73 20 6d 65 74 68 6f 64 2c 20 6d 61 This method, ma 15f0: 79 62 65 20 69 6e 20 63 6f 6e 6a 75 6e 63 74 69 ybe in conjuncti 1600: 6f 6e 20 77 69 74 68 20 69 74 73 20 63 61 6c 6c on with its call 1610: 65 72 0a 09 23 23 20 20 20 20 20 20 20 73 65 65 er..## see 1620: 6d 73 20 74 6f 20 62 65 20 61 20 6d 65 6d 6f 72 ms to be a memor 1630: 79 20 68 6f 67 2c 20 65 73 70 65 63 69 61 6c 6c y hog, especiall 1640: 79 20 66 6f 72 20 6c 61 72 67 65 0a 09 23 23 20 y for large..## 1650: 20 20 20 20 20 20 63 68 61 6e 67 65 73 65 74 73 changesets 1660: 2c 20 77 69 74 68 20 27 6c 61 72 67 65 27 20 6d , with 'large' m 1670: 65 61 6e 69 6e 67 20 74 6f 20 68 61 76 65 20 61 eaning to have a 1680: 20 27 6c 6f 6e 67 20 6c 69 73 74 0a 09 23 23 20 'long list..## 1690: 20 20 20 20 20 20 6f 66 20 69 74 65 6d 73 2c 20 of items, 16a0: 73 65 76 65 72 61 6c 20 74 68 6f 75 73 61 6e 64 several thousand 16b0: 27 2e 20 49 6e 76 65 73 74 69 67 61 74 65 20 77 '. Investigate w 16c0: 68 65 72 65 20 74 68 65 0a 09 23 23 20 20 20 20 here the..## 16d0: 20 20 20 6d 65 6d 6f 72 79 20 69 73 20 73 70 65 memory is spe 16e0: 6e 74 20 61 6e 64 20 74 68 65 6e 20 6c 6f 6f 6b nt and then look 16f0: 20 66 6f 72 20 77 61 79 73 20 6f 66 20 72 65 63 for ways of rec 1700: 74 69 66 79 69 6e 67 0a 09 23 23 20 20 20 20 20 tifying..## 1710: 20 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 09 the problem... 1720: 23 23 0a 0a 09 23 20 54 68 69 73 20 6d 65 74 68 ##...# This meth 1730: 6f 64 20 69 6e 73 70 65 63 74 73 20 74 68 65 20 od inspects the 1740: 63 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20 69 changesets for i 1750: 6e 74 65 72 6e 61 6c 0a 09 23 20 64 65 70 65 6e nternal..# depen 1760: 64 65 6e 63 69 65 73 2e 20 4e 6f 74 68 69 6e 67 dencies. Nothing 1770: 20 69 73 20 64 6f 6e 65 20 69 66 20 74 68 65 72 is done if ther 1780: 65 20 61 72 65 20 6e 6f 0a 09 23 20 73 75 63 68 e are no..# such 1790: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 . Otherwise the 17a0: 63 68 61 6e 67 65 73 65 74 20 69 73 20 73 70 6c changeset is spl 17b0: 69 74 20 69 6e 74 6f 20 61 20 73 65 74 20 6f 66 it into a set of 17c0: 0a 09 23 20 66 72 61 67 6d 65 6e 74 73 20 77 69 ..# fragments wi 17d0: 74 68 6f 75 74 20 69 6e 74 65 72 6e 61 6c 20 64 thout internal d 17e0: 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 74 72 61 ependencies, tra 17f0: 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 09 23 nsforming the..# 1800: 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 internal depend 1810: 65 6e 63 69 65 73 20 69 6e 74 6f 20 65 78 74 65 encies into exte 1820: 72 6e 61 6c 20 6f 6e 65 73 2e 20 54 68 65 20 6e rnal ones. The n 1830: 65 77 20 63 68 61 6e 67 65 73 65 74 73 0a 09 23 ew changesets..# 1840: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 are added to th 1850: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 68 e list of all ch 1860: 61 6e 67 65 73 65 74 73 2e 0a 0a 09 23 20 57 65 angesets....# We 1870: 20 70 65 72 66 6f 72 6d 20 61 6c 6c 20 6e 65 63 perform all nec 1880: 65 73 73 61 72 79 20 73 70 6c 69 74 73 20 69 6e essary splits in 1890: 20 6f 6e 65 20 67 6f 2c 20 69 6e 73 74 65 61 64 one go, instead 18a0: 20 6f 66 20 6f 6e 6c 79 0a 09 23 20 6f 6e 65 2e of only..# one. 18b0: 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 61 6c The previous al 18c0: 67 6f 72 69 74 68 6d 2c 20 61 64 61 70 74 65 64 gorithm, adapted 18d0: 20 66 72 6f 6d 20 63 76 73 32 73 76 6e 2c 20 63 from cvs2svn, c 18e0: 6f 6d 70 75 74 65 64 0a 09 23 20 61 20 6c 6f 74 omputed..# a lot 18f0: 20 6f 66 20 73 74 61 74 65 20 77 68 69 63 68 20 of state which 1900: 77 61 73 20 74 68 72 6f 77 6e 20 61 77 61 79 20 was thrown away 1910: 61 6e 64 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 and then compute 1920: 64 20 61 67 61 69 6e 0a 09 23 20 66 6f 72 20 65 d again..# for e 1930: 61 63 68 20 6f 66 20 74 68 65 20 66 72 61 67 6d ach of the fragm 1940: 65 6e 74 73 2e 20 49 74 20 73 68 6f 75 6c 64 20 ents. It should 1950: 62 65 20 65 61 73 69 65 72 20 74 6f 20 75 70 64 be easier to upd 1960: 61 74 65 20 61 6e 64 0a 09 23 20 72 65 75 73 65 ate and..# reuse 1970: 20 74 68 61 74 20 73 74 61 74 65 2e 0a 0a 09 23 that state....# 1980: 20 54 68 65 20 63 6f 64 65 20 63 68 65 63 6b 73 The code checks 1990: 20 6f 6e 6c 79 20 73 75 63 63 65 73 73 6f 72 20 only successor 19a0: 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 dependencies, as 19b0: 20 74 68 69 73 0a 09 23 20 61 75 74 6f 6d 61 74 this..# automat 19c0: 69 63 61 6c 6c 79 20 63 6f 76 65 72 73 20 74 68 ically covers th 19d0: 65 20 70 72 65 64 65 63 65 73 73 6f 72 20 64 65 e predecessor de 19e0: 70 65 6e 64 65 6e 63 69 65 73 20 61 73 20 77 65 pendencies as we 19f0: 6c 6c 20 28 41 0a 09 23 20 73 75 63 63 65 73 73 ll (A..# success 1a00: 6f 72 20 64 65 70 65 6e 64 65 6e 63 79 20 61 20 or dependency a 1a10: 2d 3e 20 62 20 69 73 20 61 6c 73 6f 20 61 20 70 -> b is also a p 1a20: 72 65 64 65 63 65 73 73 6f 72 20 64 65 70 65 6e redecessor depen 1a30: 64 65 6e 63 79 0a 09 23 20 62 20 2d 3e 20 61 29 dency..# b -> a) 1a40: 2e 0a 0a 09 23 20 41 72 72 61 79 20 6f 66 20 64 ....# Array of d 1a50: 65 70 65 6e 64 65 6e 63 69 65 73 20 28 70 61 72 ependencies (par 1a60: 65 6e 74 20 2d 3e 20 63 68 69 6c 64 29 2e 20 54 ent -> child). T 1a70: 68 69 73 20 69 73 20 70 75 6c 6c 65 64 20 66 72 his is pulled fr 1a80: 6f 6d 0a 09 23 20 74 68 65 20 73 74 61 74 65 2c om..# the state, 1a90: 20 61 6e 64 20 6c 69 6d 69 74 65 64 20 74 6f 20 and limited to 1aa0: 73 75 63 63 65 73 73 6f 72 73 20 77 69 74 68 69 successors withi 1ab0: 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e n the changeset. 1ac0: 0a 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 70 ...array set dep 1ad0: 65 6e 64 65 6e 63 69 65 73 20 7b 7d 0a 09 24 6d endencies {}..$m 1ae0: 79 74 79 70 65 6f 62 6a 20 69 6e 74 65 72 6e 61 ytypeobj interna 1af0: 6c 73 75 63 63 65 73 73 6f 72 73 20 64 65 70 65 lsuccessors depe 1b00: 6e 64 65 6e 63 69 65 73 20 24 6d 79 69 74 65 6d ndencies $myitem 1b10: 73 0a 09 69 66 20 7b 21 5b 61 72 72 61 79 20 73 s..if {![array s 1b20: 69 7a 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73 ize dependencies 1b30: 5d 7d 20 7b 72 65 74 75 72 6e 20 30 7d 20 3b 20 ]} {return 0} ; 1b40: 23 20 4e 6f 74 68 69 6e 67 20 74 6f 20 62 72 65 # Nothing to bre 1b50: 61 6b 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 ak....log write 1b60: 35 20 63 73 65 74 73 20 2e 2e 2e 5b 24 73 65 6c 5 csets ...[$sel 1b70: 66 20 73 74 72 5d 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e f str].......... 1b80: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................ 1b90: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e ................ 1ba0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 0a 0a 09 ................ 1bb0: 23 20 57 65 20 68 61 76 65 20 69 6e 74 65 72 6e # We have intern 1bc0: 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 al dependencies 1bd0: 74 6f 20 62 72 65 61 6b 2e 20 57 65 20 6e 6f 77 to break. We now 1be0: 20 69 74 65 72 61 74 65 20 6f 76 65 72 0a 09 23 iterate over..# 1bf0: 20 61 6c 6c 20 70 6f 73 69 74 69 6f 6e 73 20 69 all positions i 1c00: 6e 20 74 68 65 20 6c 69 73 74 20 28 77 68 69 63 n the list (whic 1c10: 68 20 69 73 20 63 68 72 6f 6e 6f 6c 6f 67 69 63 h is chronologic 1c20: 61 6c 2c 20 61 74 20 6c 65 61 73 74 0a 09 23 20 al, at least..# 1c30: 61 73 20 66 61 72 20 61 73 20 74 68 65 20 74 69 as far as the ti 1c40: 6d 65 73 74 61 6d 70 73 20 61 72 65 20 63 6f 72 mestamps are cor 1c50: 72 65 63 74 20 61 6e 64 20 75 6e 69 71 75 65 29 rect and unique) 1c60: 20 61 6e 64 0a 09 23 20 64 65 74 65 72 6d 69 6e and..# determin 1c70: 65 20 74 68 65 20 62 65 73 74 20 70 6f 73 69 74 e the best posit 1c80: 69 6f 6e 20 66 6f 72 20 74 68 65 20 62 72 65 61 ion for the brea 1c90: 6b 2c 20 62 79 20 74 72 79 69 6e 67 20 74 6f 0a k, by trying to. 1ca0: 09 23 20 62 72 65 61 6b 20 61 73 20 6d 61 6e 79 .# break as many 1cb0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 61 73 dependencies as 1cc0: 20 70 6f 73 73 69 62 6c 65 20 69 6e 20 6f 6e 65 possible in one 1cd0: 20 67 6f 2e 20 57 68 65 6e 20 61 0a 09 23 20 62 go. When a..# b 1ce0: 72 65 61 6b 20 77 61 73 20 66 6f 75 6e 64 20 74 reak was found t 1cf0: 68 69 73 20 69 73 20 72 65 64 6f 6e 65 20 66 6f his is redone fo 1d00: 72 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 20 r the fragments 1d10: 63 6f 6d 69 6e 67 20 61 6e 64 0a 09 23 20 61 66 coming and..# af 1d20: 74 65 72 2c 20 61 66 74 65 72 20 75 70 64 69 6e ter, after updin 1d30: 67 20 74 68 65 20 63 72 6f 73 73 69 6e 67 20 69 g the crossing i 1d40: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 0a 09 23 20 nformation....# 1d50: 44 61 74 61 20 73 74 72 75 63 74 75 72 65 73 3a Data structures: 1d60: 0a 09 23 20 4d 61 70 3a 20 20 50 4f 53 20 20 20 ..# Map: POS 1d70: 72 65 76 69 73 69 6f 6e 20 69 64 20 20 20 20 20 revision id 1d80: 20 2d 3e 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 -> position in 1d90: 6c 69 73 74 2e 0a 09 23 20 20 20 20 20 20 20 43 list...# C 1da0: 52 4f 53 53 20 70 6f 73 69 74 69 6f 6e 20 69 6e ROSS position in 1db0: 20 6c 69 73 74 20 2d 3e 20 6e 75 6d 62 65 72 20 list -> number 1dc0: 6f 66 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 of dependencies 1dd0: 63 72 6f 73 73 69 6e 67 20 69 74 0a 09 23 20 20 crossing it..# 1de0: 20 20 20 20 20 44 45 50 43 20 20 64 65 70 65 6e DEPC depen 1df0: 64 65 6e 63 79 20 20 20 20 20 20 20 2d 3e 20 70 dency -> p 1e00: 6f 73 69 74 69 6f 6e 73 20 69 74 20 63 72 6f 73 ositions it cros 1e10: 73 65 73 0a 09 23 20 4c 69 73 74 3a 20 52 41 4e ses..# List: RAN 1e20: 47 45 20 4f 66 20 74 68 65 20 70 6f 73 69 74 69 GE Of the positi 1e30: 6f 6e 73 20 69 74 73 65 6c 66 2e 0a 09 23 20 41 ons itself...# A 1e40: 20 64 65 70 65 6e 64 65 6e 63 79 20 69 73 20 61 dependency is a 1e50: 20 73 69 6e 67 6c 65 2d 65 6c 65 6d 65 6e 74 20 single-element 1e60: 6d 61 70 20 70 61 72 65 6e 74 20 2d 3e 20 63 68 map parent -> ch 1e70: 69 6c 64 0a 0a 09 49 6e 69 74 69 61 6c 69 7a 65 ild...Initialize 1e80: 42 72 65 61 6b 53 74 61 74 65 20 24 6d 79 69 74 BreakState $myit 1e90: 65 6d 73 0a 0a 09 73 65 74 20 66 72 61 67 6d 65 ems...set fragme 1ea0: 6e 74 73 20 7b 7d 0a 09 73 65 74 20 6e 65 77 20 nts {}..set new 1eb0: 20 20 20 20 20 20 5b 6c 69 73 74 20 24 72 61 6e [list $ran 1ec0: 67 65 5d 0a 09 61 72 72 61 79 20 73 65 74 20 62 ge]..array set b 1ed0: 72 65 61 6b 73 20 7b 7d 0a 0a 09 23 20 49 6e 73 reaks {}...# Ins 1ee0: 74 65 61 64 20 6f 66 20 6f 6e 65 20 6c 69 73 74 tead of one list 1ef0: 20 68 6f 6c 64 69 6e 67 20 62 6f 74 68 20 70 72 holding both pr 1f00: 6f 63 65 73 73 65 64 20 61 6e 64 20 70 65 6e 64 ocessed and pend 1f10: 69 6e 67 0a 09 23 20 66 72 61 67 6d 65 6e 74 73 ing..# fragments 1f20: 20 77 65 20 75 73 65 20 74 77 6f 2c 20 6f 6e 65 we use two, one 1f30: 20 66 6f 72 20 74 68 65 20 66 72 61 6d 65 6e 74 for the frament 1f40: 73 20 74 6f 20 70 72 6f 63 65 73 73 2c 20 6f 6e s to process, on 1f50: 65 0a 09 23 20 74 6f 20 68 6f 6c 64 20 74 68 65 e..# to hold the 1f60: 20 6e 65 77 20 66 72 61 67 6d 65 6e 74 73 2c 20 new fragments, 1f70: 61 6e 64 20 74 68 65 20 6c 61 74 74 65 72 20 69 and the latter i 1f80: 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 0a s copied to the. 1f90: 09 23 20 66 6f 72 6d 65 72 20 77 68 65 6e 20 74 .# former when t 1fa0: 68 65 79 20 72 75 6e 20 6f 75 74 2e 20 54 68 69 hey run out. Thi 1fb0: 73 20 6b 65 65 70 73 20 74 68 65 20 6c 69 73 74 s keeps the list 1fc0: 20 6f 66 20 70 65 6e 64 69 6e 67 0a 09 23 20 66 of pending..# f 1fd0: 72 61 67 6d 65 6e 74 73 20 73 68 6f 72 74 20 77 ragments short w 1fe0: 69 74 68 6f 75 74 20 73 61 63 72 69 66 69 63 69 ithout sacrifici 1ff0: 6e 67 20 73 70 65 65 64 20 62 79 20 73 68 69 66 ng speed by shif 2000: 74 69 6e 67 20 73 74 75 66 66 0a 09 23 20 64 6f ting stuff..# do 2010: 77 6e 2e 20 57 65 20 65 73 70 65 63 69 61 6c 6c wn. We especiall 2020: 79 20 64 72 6f 70 20 74 68 65 20 6d 65 6d 6f 72 y drop the memor 2030: 79 20 6f 66 20 66 72 61 67 6d 65 6e 74 73 20 62 y of fragments b 2040: 72 6f 6b 65 6e 0a 09 23 20 64 75 72 69 6e 67 20 roken..# during 2050: 70 72 6f 63 65 73 73 69 6e 67 20 61 66 74 65 72 processing after 2060: 20 61 20 73 68 6f 72 74 20 74 69 6d 65 2c 20 69 a short time, i 2070: 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e nstead of lettin 2080: 67 20 69 74 0a 09 23 20 63 6f 6e 73 75 6d 65 20 g it..# consume 2090: 6d 65 6d 6f 72 79 2e 0a 0a 09 77 68 69 6c 65 20 memory....while 20a0: 7b 5b 6c 6c 65 6e 67 74 68 20 24 6e 65 77 5d 7d {[llength $new]} 20b0: 20 7b 0a 0a 09 20 20 20 20 73 65 74 20 70 65 6e {... set pen 20c0: 64 69 6e 67 20 24 6e 65 77 0a 09 20 20 20 20 73 ding $new.. s 20d0: 65 74 20 6e 65 77 20 20 20 20 20 7b 7d 0a 09 20 et new {}.. 20e0: 20 20 20 73 65 74 20 61 74 20 20 20 20 20 20 30 set at 0 20f0: 0a 0a 09 20 20 20 20 77 68 69 6c 65 20 7b 24 61 ... while {$a 2100: 74 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24 70 65 t < [llength $pe 2110: 6e 64 69 6e 67 5d 7d 20 7b 0a 09 09 73 65 74 20 nding]} {...set 2120: 63 75 72 72 65 6e 74 20 5b 6c 69 6e 64 65 78 20 current [lindex 2130: 24 70 65 6e 64 69 6e 67 20 24 61 74 5d 0a 0a 09 $pending $at]... 2140: 09 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 .log write 6 cse 2150: 74 73 20 7b 2e 20 2e 20 2e 2e 20 2e 2e 2e 20 2e ts {. . .. ... . 2160: 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e .... ........ .. 2170: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 7d 0a 09 09 6c ...........}...l 2180: 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73 og write 6 csets 2190: 20 7b 53 63 68 65 64 75 6c 65 64 20 20 20 5b 6a {Scheduled [j 21a0: 6f 69 6e 20 5b 50 52 73 20 5b 6c 72 61 6e 67 65 oin [PRs [lrange 21b0: 20 24 70 65 6e 64 69 6e 67 20 24 61 74 20 65 6e $pending $at en 21c0: 64 5d 5d 20 7b 20 7d 5d 7d 0a 09 09 6c 6f 67 20 d]] { }]}...log 21d0: 77 72 69 74 65 20 36 20 63 73 65 74 73 20 7b 43 write 6 csets {C 21e0: 6f 6e 73 69 64 65 72 69 6e 67 20 5b 50 52 20 24 onsidering [PR $ 21f0: 63 75 72 72 65 6e 74 5d 20 5c 5b 24 61 74 2f 5b current] \[$at/[ 2200: 6c 6c 65 6e 67 74 68 20 24 70 65 6e 64 69 6e 67 llength $pending 2210: 5d 5c 5d 7d 0a 0a 09 09 73 65 74 20 62 65 73 74 ]\]}....set best 2220: 20 5b 46 69 6e 64 42 65 73 74 42 72 65 61 6b 20 [FindBestBreak 2230: 24 63 75 72 72 65 6e 74 5d 0a 0a 09 09 69 66 20 $current]....if 2240: 7b 24 62 65 73 74 20 3c 20 30 7d 20 7b 0a 09 09 {$best < 0} {... 2250: 20 20 20 20 23 20 54 68 65 20 69 6e 73 70 65 63 # The inspec 2260: 74 65 64 20 72 61 6e 67 65 20 68 61 73 20 6e 6f ted range has no 2270: 20 69 6e 74 65 72 6e 61 6c 0a 09 09 20 20 20 20 internal... 2280: 23 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 # dependencies. 2290: 54 68 69 73 20 69 73 20 61 20 63 6f 6d 70 6c 65 This is a comple 22a0: 74 65 20 66 72 61 67 6d 65 6e 74 2e 0a 09 09 20 te fragment.... 22b0: 20 20 20 6c 61 70 70 65 6e 64 20 66 72 61 67 6d lappend fragm 22c0: 65 6e 74 73 20 24 63 75 72 72 65 6e 74 0a 0a 09 ents $current... 22d0: 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 36 . log write 6 22e0: 20 63 73 65 74 73 20 22 4e 6f 20 62 72 65 61 6b csets "No break 22f0: 73 2c 20 66 69 6e 61 6c 22 0a 09 09 7d 20 65 6c s, final"...} el 2300: 73 65 20 7b 0a 09 09 20 20 20 20 23 20 53 70 6c se {... # Spl 2310: 69 74 20 74 68 65 20 72 61 6e 67 65 20 61 6e 64 it the range and 2320: 20 73 63 68 65 64 75 6c 65 20 74 68 65 20 72 65 schedule the re 2330: 73 75 6c 74 69 6e 67 0a 09 09 20 20 20 20 23 20 sulting... # 2340: 66 72 61 67 6d 65 6e 74 73 20 66 6f 72 20 66 75 fragments for fu 2350: 72 74 68 65 72 20 69 6e 73 70 65 63 74 69 6f 6e rther inspection 2360: 2e 20 52 65 6d 65 6d 62 65 72 20 74 68 65 0a 09 . Remember the.. 2370: 09 20 20 20 20 23 20 6e 75 6d 62 65 72 20 6f 66 . # number of 2380: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 63 75 dependencies cu 2390: 74 20 62 65 66 6f 72 65 20 77 65 20 72 65 6d 6f t before we remo 23a0: 76 65 20 74 68 65 6d 0a 09 09 20 20 20 20 23 20 ve them... # 23b0: 66 72 6f 6d 20 63 6f 6e 73 69 64 65 72 61 74 69 from considerati 23c0: 6f 6e 2c 20 66 6f 72 20 64 6f 63 75 6d 65 6e 74 on, for document 23d0: 61 74 69 6f 6e 20 6c 61 74 65 72 2e 0a 0a 09 09 ation later..... 23e0: 20 20 20 20 73 65 74 20 62 72 65 61 6b 73 28 24 set breaks($ 23f0: 62 65 73 74 29 20 24 63 72 6f 73 73 28 24 62 65 best) $cross($be 2400: 73 74 29 0a 0a 09 09 20 20 20 20 6c 6f 67 20 77 st).... log w 2410: 72 69 74 65 20 36 20 63 73 65 74 73 20 22 42 65 rite 6 csets "Be 2420: 73 74 20 62 72 65 61 6b 20 40 20 24 62 65 73 74 st break @ $best 2430: 2c 20 63 75 74 74 69 6e 67 20 5b 6e 73 70 20 24 , cutting [nsp $ 2440: 63 72 6f 73 73 28 24 62 65 73 74 29 20 64 65 70 cross($best) dep 2450: 65 6e 64 65 6e 63 79 20 64 65 70 65 6e 64 65 6e endency dependen 2460: 63 69 65 73 5d 22 0a 0a 09 09 20 20 20 20 23 20 cies]".... # 2470: 4e 6f 74 65 3a 20 54 68 65 20 76 61 6c 75 65 20 Note: The value 2480: 6f 66 20 62 65 73 74 20 69 73 20 61 6e 20 61 62 of best is an ab 2490: 6f 6c 75 74 65 20 6c 6f 63 61 74 69 6f 6e 0a 09 olute location.. 24a0: 09 20 20 20 20 23 20 69 6e 20 6d 79 69 74 65 6d . # in myitem 24b0: 73 2e 20 55 73 65 20 74 68 65 20 73 74 61 72 74 s. Use the start 24c0: 20 6f 66 20 63 75 72 72 65 6e 74 20 74 6f 20 6d of current to m 24d0: 61 6b 65 20 69 74 0a 09 09 20 20 20 20 23 20 61 ake it... # a 24e0: 6e 20 69 6e 64 65 78 20 61 62 73 6f 6c 75 74 65 n index absolute 24f0: 20 74 6f 20 63 75 72 72 65 6e 74 2e 0a 0a 09 09 to current..... 2500: 20 20 20 20 73 65 74 20 62 72 65 6c 20 5b 65 78 set brel [ex 2510: 70 72 20 7b 24 62 65 73 74 20 2d 20 5b 6c 69 6e pr {$best - [lin 2520: 64 65 78 20 24 63 75 72 72 65 6e 74 20 30 5d 7d dex $current 0]} 2530: 5d 0a 09 09 20 20 20 20 73 65 74 20 62 6e 65 78 ]... set bnex 2540: 74 20 24 62 72 65 6c 20 3b 20 69 6e 63 72 20 62 t $brel ; incr b 2550: 6e 65 78 74 0a 09 09 20 20 20 20 73 65 74 20 66 next... set f 2560: 72 61 67 62 65 66 6f 72 65 20 5b 6c 72 61 6e 67 ragbefore [lrang 2570: 65 20 24 63 75 72 72 65 6e 74 20 30 20 24 62 72 e $current 0 $br 2580: 65 6c 5d 0a 09 09 20 20 20 20 73 65 74 20 66 72 el]... set fr 2590: 61 67 61 66 74 65 72 20 20 5b 6c 72 61 6e 67 65 agafter [lrange 25a0: 20 24 63 75 72 72 65 6e 74 20 24 62 6e 65 78 74 $current $bnext 25b0: 20 65 6e 64 5d 0a 0a 09 09 20 20 20 20 6c 6f 67 end].... log 25c0: 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22 write 6 csets " 25d0: 4e 65 77 20 70 69 65 63 65 73 20 20 5b 50 52 20 New pieces [PR 25e0: 24 66 72 61 67 62 65 66 6f 72 65 5d 20 5b 50 52 $fragbefore] [PR 25f0: 20 24 66 72 61 67 61 66 74 65 72 5d 22 0a 0a 09 $fragafter]"... 2600: 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 . integrity a 2610: 73 73 65 72 74 20 7b 5b 6c 6c 65 6e 67 74 68 20 ssert {[llength 2620: 24 66 72 61 67 62 65 66 6f 72 65 5d 7d 20 7b 46 $fragbefore]} {F 2630: 6f 75 6e 64 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 ound zero-length 2640: 20 66 72 61 67 6d 65 6e 74 20 61 74 20 74 68 65 fragment at the 2650: 20 62 65 67 69 6e 6e 69 6e 67 7d 0a 09 09 20 20 beginning}... 2660: 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 integrity asse 2670: 72 74 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 72 rt {[llength $fr 2680: 61 67 61 66 74 65 72 5d 7d 20 20 7b 46 6f 75 6e agafter]} {Foun 2690: 64 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 72 d zero-length fr 26a0: 61 67 6d 65 6e 74 20 61 74 20 74 68 65 20 65 6e agment at the en 26b0: 64 7d 0a 0a 09 09 20 20 20 20 6c 61 70 70 65 6e d}.... lappen 26c0: 64 20 6e 65 77 20 24 66 72 61 67 62 65 66 6f 72 d new $fragbefor 26d0: 65 20 24 66 72 61 67 61 66 74 65 72 0a 09 09 20 e $fragafter... 26e0: 20 20 20 43 75 74 41 74 20 24 62 65 73 74 0a 09 CutAt $best.. 26f0: 09 7d 0a 0a 09 09 69 6e 63 72 20 61 74 0a 09 20 .}....incr at.. 2700: 20 20 20 7d 0a 09 7d 0a 0a 09 6c 6f 67 20 77 72 }..}...log wr 2710: 69 74 65 20 36 20 63 73 65 74 73 20 22 2e 20 2e ite 6 csets ". . 2720: 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e .. ... ..... .. 2730: 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e ...... ......... 2740: 2e 2e 2e 2e 22 0a 0a 09 23 20 28 2a 29 20 57 65 ...."...# (*) We 2750: 20 63 6c 65 61 72 20 6f 75 74 20 74 68 65 20 61 clear out the a 2760: 73 73 6f 63 69 61 74 65 64 20 70 61 72 74 20 6f ssociated part o 2770: 66 20 74 68 65 20 6d 79 69 74 65 6d 6d 61 70 0a f the myitemmap. 2780: 09 23 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6e 64 .# in-memory ind 2790: 65 78 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f ex in preparatio 27a0: 6e 20 66 6f 72 20 6e 65 77 20 64 61 74 61 2e 20 n for new data. 27b0: 41 20 73 69 6d 70 6c 65 20 75 6e 73 65 74 0a 09 A simple unset.. 27c0: 23 20 69 73 20 65 6e 6f 75 67 68 2c 20 77 65 20 # is enough, we 27d0: 68 61 76 65 20 6e 6f 20 73 79 6d 62 6f 6c 20 63 have no symbol c 27e0: 68 61 6e 67 65 73 65 74 73 20 61 74 20 74 68 69 hangesets at thi 27f0: 73 20 74 69 6d 65 2c 20 61 6e 64 0a 09 23 20 74 s time, and..# t 2800: 68 75 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 hus never more t 2810: 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 han one referenc 2820: 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 0a e in the list... 2830: 09 66 6f 72 65 61 63 68 20 69 69 64 20 24 6d 79 .foreach iid $my 2840: 69 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65 74 items {.. set 2850: 20 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79 74 79 key [list $myty 2860: 70 65 20 24 69 69 64 5d 0a 09 20 20 20 20 75 6e pe $iid].. un 2870: 73 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24 6b set myitemmap($k 2880: 65 79 29 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 ey).. log wri 2890: 74 65 20 38 20 63 73 65 74 73 20 7b 4d 41 50 2d te 8 csets {MAP- 28a0: 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73 65 item <$key> $se 28b0: 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d lf = [$self str] 28c0: 7d 0a 09 7d 0a 0a 09 23 20 43 72 65 61 74 65 20 }..}...# Create 28d0: 63 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20 74 changesets for t 28e0: 68 65 20 66 72 61 67 6d 65 6e 74 73 2c 20 72 65 he fragments, re 28f0: 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e using the curren 2900: 74 20 6f 6e 65 0a 09 23 20 66 6f 72 20 74 68 65 t one..# for the 2910: 20 66 69 72 73 74 20 66 72 61 67 6d 65 6e 74 2e first fragment. 2920: 20 57 65 20 73 6f 72 74 20 74 68 65 6d 20 69 6e We sort them in 2930: 20 6f 72 64 65 72 20 74 6f 20 61 6c 6c 6f 77 0a order to allow. 2940: 09 23 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 .# checking for 2950: 67 61 70 73 20 61 6e 64 20 6e 69 63 65 20 6d 65 gaps and nice me 2960: 73 73 61 67 65 73 2e 0a 0a 09 73 65 74 20 66 72 ssages....set fr 2970: 61 67 6d 65 6e 74 73 20 5b 6c 73 6f 72 74 20 2d agments [lsort - 2980: 69 6e 64 65 78 20 30 20 2d 69 6e 74 65 67 65 72 index 0 -integer 2990: 20 24 66 72 61 67 6d 65 6e 74 73 5d 0a 0a 09 23 $fragments]...# 29a0: 70 75 74 73 20 5c 74 2e 5b 6a 6f 69 6e 20 5b 50 puts \t.[join [P 29b0: 52 73 20 24 66 72 61 67 6d 65 6e 74 73 5d 20 2e Rs $fragments] . 29c0: 5c 6e 5c 74 2e 5d 2e 0a 0a 09 42 6f 72 64 65 72 \n\t.]....Border 29d0: 20 5b 6c 69 6e 64 65 78 20 24 66 72 61 67 6d 65 [lindex $fragme 29e0: 6e 74 73 20 30 5d 20 66 69 72 73 74 73 20 66 69 nts 0] firsts fi 29f0: 72 73 74 65 0a 0a 09 69 6e 74 65 67 72 69 74 79 rste...integrity 2a00: 20 61 73 73 65 72 74 20 7b 24 66 69 72 73 74 73 assert {$firsts 2a10: 20 3d 3d 20 30 7d 20 7b 42 61 64 20 66 72 61 67 == 0} {Bad frag 2a20: 6d 65 6e 74 20 73 74 61 72 74 20 40 20 24 66 69 ment start @ $fi 2a30: 72 73 74 73 2c 20 67 61 70 2c 20 6f 72 20 62 65 rsts, gap, or be 2a40: 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f fore beginning o 2a50: 66 20 74 68 65 20 72 61 6e 67 65 7d 0a 0a 09 73 f the range}...s 2a60: 65 74 20 6c 61 73 74 65 20 24 66 69 72 73 74 65 et laste $firste 2a70: 0a 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65 ..foreach fragme 2a80: 6e 74 20 5b 6c 72 61 6e 67 65 20 24 66 72 61 67 nt [lrange $frag 2a90: 6d 65 6e 74 73 20 31 20 65 6e 64 5d 20 7b 0a 09 ments 1 end] {.. 2aa0: 20 20 20 20 42 6f 72 64 65 72 20 24 66 72 61 67 Border $frag 2ab0: 6d 65 6e 74 20 73 20 65 0a 09 20 20 20 20 69 6e ment s e.. in 2ac0: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b tegrity assert { 2ad0: 24 6c 61 73 74 65 20 3d 3d 20 28 24 73 20 2d 20 $laste == ($s - 2ae0: 31 29 7d 20 7b 42 61 64 20 66 72 61 67 6d 65 6e 1)} {Bad fragmen 2af0: 74 20 62 6f 72 64 65 72 20 3c 24 6c 61 73 74 65 t border <$laste 2b00: 20 7c 20 24 73 3e 2c 20 67 61 70 20 6f 72 20 6f | $s>, gap or o 2b10: 76 65 72 6c 61 70 7d 0a 0a 09 20 20 20 20 73 65 verlap}... se 2b20: 74 20 6e 65 77 20 5b 24 74 79 70 65 20 25 41 55 t new [$type %AU 2b30: 54 4f 25 20 24 6d 79 70 72 6f 6a 65 63 74 20 24 TO% $myproject $ 2b40: 6d 79 74 79 70 65 20 24 6d 79 73 72 63 69 64 20 mytype $mysrcid 2b50: 5b 6c 72 61 6e 67 65 20 24 6d 79 69 74 65 6d 73 [lrange $myitems 2b60: 20 24 73 20 24 65 5d 5d 0a 0a 20 20 20 20 20 20 $s $e]].. 2b70: 20 20 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 log write 2b80: 34 20 63 73 65 74 73 20 22 42 72 65 61 6b 69 6e 4 csets "Breakin 2b90: 67 20 5b 24 73 65 6c 66 20 73 74 72 20 5d 20 40 g [$self str ] @ 2ba0: 20 24 6c 61 73 74 65 2c 20 6e 65 77 20 5b 24 6e $laste, new [$n 2bb0: 65 77 20 73 74 72 5d 2c 20 63 75 74 74 69 6e 67 ew str], cutting 2bc0: 20 24 62 72 65 61 6b 73 28 24 6c 61 73 74 65 29 $breaks($laste) 2bd0: 22 0a 0a 09 20 20 20 20 73 65 74 20 6c 61 73 74 "... set last 2be0: 65 20 24 65 0a 09 7d 0a 0a 09 69 6e 74 65 67 72 e $e..}...integr 2bf0: 69 74 79 20 61 73 73 65 72 74 20 7b 0a 09 20 20 ity assert {.. 2c00: 20 20 24 6c 61 73 74 65 20 3d 3d 20 28 5b 6c 6c $laste == ([ll 2c10: 65 6e 67 74 68 20 24 6d 79 69 74 65 6d 73 5d 2d ength $myitems]- 2c20: 31 29 0a 09 7d 20 7b 42 61 64 20 66 72 61 67 6d 1)..} {Bad fragm 2c30: 65 6e 74 20 65 6e 64 20 40 20 24 6c 61 73 74 65 ent end @ $laste 2c40: 2c 20 67 61 70 2c 20 6f 72 20 62 65 79 6f 6e 64 , gap, or beyond 2c50: 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 end of the rang 2c60: 65 7d 0a 0a 09 23 20 50 75 74 20 74 68 65 20 66 e}...# Put the f 2c70: 69 72 73 74 20 66 72 61 67 6d 65 6e 74 20 69 6e irst fragment in 2c80: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 to the current c 2c90: 68 61 6e 67 65 73 65 74 2c 20 61 6e 64 0a 09 23 hangeset, and..# 2ca0: 20 75 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d update the in-m 2cb0: 65 6d 6f 72 79 20 69 6e 64 65 78 2e 20 57 65 20 emory index. We 2cc0: 63 61 6e 20 73 69 6d 70 6c 79 20 28 72 65 29 61 can simply (re)a 2cd0: 64 64 20 74 68 65 20 69 74 65 6d 73 0a 09 23 20 dd the items..# 2ce0: 62 65 63 61 75 73 65 20 77 65 20 63 6c 65 61 72 because we clear 2cf0: 65 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c ed the previousl 2d00: 79 20 65 78 69 73 74 69 6e 67 20 69 6e 66 6f 72 y existing infor 2d10: 6d 61 74 69 6f 6e 2c 20 73 65 65 0a 09 23 20 28 mation, see..# ( 2d20: 2a 29 20 61 62 6f 76 65 2e 20 50 65 72 73 69 73 *) above. Persis 2d30: 74 65 6e 63 65 20 64 6f 65 73 20 6e 6f 74 20 6d tence does not m 2d40: 61 74 74 65 72 20 68 65 72 65 2c 20 6e 6f 6e 65 atter here, none 2d50: 20 6f 66 20 74 68 65 0a 09 23 20 63 68 61 6e 67 of the..# chang 2d60: 65 73 65 74 73 20 68 61 73 20 62 65 65 6e 20 73 esets has been s 2d70: 61 76 65 64 20 74 6f 20 74 68 65 20 70 65 72 73 aved to the pers 2d80: 69 73 74 65 6e 74 20 73 74 61 74 65 20 79 65 74 istent state yet 2d90: 2e 0a 0a 09 73 65 74 20 6d 79 69 74 65 6d 73 20 ....set myitems 2da0: 20 5b 6c 72 61 6e 67 65 20 24 6d 79 69 74 65 6d [lrange $myitem 2db0: 73 20 20 30 20 24 66 69 72 73 74 65 5d 0a 09 73 s 0 $firste]..s 2dc0: 65 74 20 6d 79 74 69 74 65 6d 73 20 5b 6c 72 61 et mytitems [lra 2dd0: 6e 67 65 20 24 6d 79 74 69 74 65 6d 73 20 30 20 nge $mytitems 0 2de0: 24 66 69 72 73 74 65 5d 0a 09 66 6f 72 65 61 63 $firste]..foreac 2df0: 68 20 69 69 64 20 24 6d 79 69 74 65 6d 73 20 7b h iid $myitems { 2e00: 0a 09 20 20 20 20 73 65 74 20 6b 65 79 20 5b 6c .. set key [l 2e10: 69 73 74 20 24 6d 79 74 79 70 65 20 24 69 69 64 ist $mytype $iid 2e20: 5d 0a 09 20 20 20 20 73 65 74 20 6d 79 69 74 65 ].. set myite 2e30: 6d 6d 61 70 28 24 6b 65 79 29 20 24 73 65 6c 66 mmap($key) $self 2e40: 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 .. log write 2e50: 38 20 63 73 65 74 73 20 7b 4d 41 50 2b 20 69 74 8 csets {MAP+ it 2e60: 65 6d 20 3c 24 6b 65 79 3e 20 24 73 65 6c 66 20 em <$key> $self 2e70: 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d 7d 0a 09 = [$self str]}.. 2e80: 7d 0a 0a 09 72 65 74 75 72 6e 20 31 0a 20 20 20 }...return 1. 2e90: 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 70 }.. method p 2ea0: 65 72 73 69 73 74 20 7b 7d 20 7b 0a 09 73 65 74 ersist {} {..set 2eb0: 20 74 69 64 20 24 6d 79 63 73 74 79 70 65 28 24 tid $mycstype($ 2ec0: 6d 79 74 79 70 65 29 0a 09 73 65 74 20 70 69 64 mytype)..set pid 2ed0: 20 5b 24 6d 79 70 72 6f 6a 65 63 74 20 69 64 5d [$myproject id] 2ee0: 0a 09 73 65 74 20 70 6f 73 20 30 0a 0a 09 73 74 ..set pos 0...st 2ef0: 61 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 ate transaction 2f00: 7b 0a 09 20 20 20 20 73 74 61 74 65 20 72 75 6e {.. state run 2f10: 20 7b 0a 09 09 49 4e 53 45 52 54 20 49 4e 54 4f {...INSERT INTO 2f20: 20 63 68 61 6e 67 65 73 65 74 20 28 63 69 64 2c changeset (cid, 2f30: 20 20 20 70 69 64 2c 20 20 74 79 70 65 2c 20 73 pid, type, s 2f40: 72 63 29 0a 09 09 56 41 4c 55 45 53 20 20 20 20 rc)...VALUES 2f50: 20 20 20 20 20 20 20 20 20 20 20 20 28 24 6d 79 ($my 2f60: 69 64 2c 20 24 70 69 64 2c 20 24 74 69 64 2c 20 id, $pid, $tid, 2f70: 24 6d 79 73 72 63 69 64 29 3b 0a 09 20 20 20 20 $mysrcid);.. 2f80: 7d 0a 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 }... foreach 2f90: 69 69 64 20 24 6d 79 69 74 65 6d 73 20 7b 0a 09 iid $myitems {.. 2fa0: 09 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 20 .state run {... 2fb0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 INSERT INTO c 2fc0: 73 69 74 65 6d 20 28 63 69 64 2c 20 20 20 70 6f sitem (cid, po 2fd0: 73 2c 20 20 69 69 64 29 0a 09 09 20 20 20 20 56 s, iid)... V 2fe0: 41 4c 55 45 53 20 20 20 20 20 20 20 20 20 20 20 ALUES 2ff0: 20 20 28 24 6d 79 69 64 2c 20 24 70 6f 73 2c 20 ($myid, $pos, 3000: 24 69 69 64 29 3b 0a 09 09 7d 0a 09 09 69 6e 63 $iid);...}...inc 3010: 72 20 70 6f 73 0a 09 20 20 20 20 7d 0a 09 7d 0a r pos.. }..}. 3020: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 .return. }.. 3030: 20 20 20 6d 65 74 68 6f 64 20 74 69 6d 65 72 61 method timera 3040: 6e 67 65 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 nge {} { return 3050: 5b 24 6d 79 74 79 70 65 6f 62 6a 20 74 69 6d 65 [$mytypeobj time 3060: 72 61 6e 67 65 20 24 6d 79 69 74 65 6d 73 5d 20 range $myitems] 3070: 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 64 72 }.. method dr 3080: 6f 70 20 7b 7d 20 7b 0a 09 6c 6f 67 20 77 72 69 op {} {..log wri 3090: 74 65 20 38 20 63 73 65 74 73 20 7b 44 72 6f 70 te 8 csets {Drop 30a0: 70 69 6e 67 20 24 73 65 6c 66 20 3d 20 5b 24 73 ping $self = [$s 30b0: 65 6c 66 20 73 74 72 5d 7d 0a 0a 09 73 74 61 74 elf str]}...stat 30c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a e transaction {. 30d0: 09 20 20 20 20 73 74 61 74 65 20 72 75 6e 20 7b . state run { 30e0: 0a 09 09 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 ...DELETE FROM c 30f0: 68 61 6e 67 65 73 65 74 20 20 20 57 48 45 52 45 hangeset WHERE 3100: 20 63 69 64 20 3d 20 24 6d 79 69 64 3b 0a 09 09 cid = $myid;... 3110: 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 73 69 74 DELETE FROM csit 3120: 65 6d 20 20 20 20 20 20 57 48 45 52 45 20 63 69 em WHERE ci 3130: 64 20 3d 20 24 6d 79 69 64 3b 0a 09 09 44 45 4c d = $myid;...DEL 3140: 45 54 45 20 46 52 4f 4d 20 63 73 73 75 63 63 65 ETE FROM cssucce 3150: 73 73 6f 72 20 57 48 45 52 45 20 63 69 64 20 3d ssor WHERE cid = 3160: 20 24 6d 79 69 64 3b 0a 09 20 20 20 20 7d 0a 09 $myid;.. }.. 3170: 7d 0a 09 66 6f 72 65 61 63 68 20 69 69 64 20 24 }..foreach iid $ 3180: 6d 79 69 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 myitems {.. s 3190: 65 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79 et key [list $my 31a0: 74 79 70 65 20 24 69 69 64 5d 0a 09 20 20 20 20 type $iid].. 31b0: 75 6e 73 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 unset myitemmap( 31c0: 24 6b 65 79 29 0a 09 20 20 20 20 6c 6f 67 20 77 $key).. log w 31d0: 72 69 74 65 20 38 20 63 73 65 74 73 20 7b 4d 41 rite 8 csets {MA 31e0: 50 2d 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24 P- item <$key> $ 31f0: 73 65 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74 self = [$self st 3200: 72 5d 7d 0a 09 7d 0a 09 73 65 74 20 70 6f 73 20 r]}..}..set pos 3210: 20 20 20 20 20 20 20 20 20 5b 6c 73 65 61 72 63 [lsearc 3220: 68 20 2d 65 78 61 63 74 20 24 6d 79 63 68 61 6e h -exact $mychan 3230: 67 65 73 65 74 73 20 24 73 65 6c 66 5d 0a 09 73 gesets $self]..s 3240: 65 74 20 6d 79 63 68 61 6e 67 65 73 65 74 73 20 et mychangesets 3250: 5b 6c 72 65 70 6c 61 63 65 20 24 6d 79 63 68 61 [lreplace $mycha 3260: 6e 67 65 73 65 74 73 20 24 70 6f 73 20 24 70 6f ngesets $pos $po 3270: 73 5d 0a 09 73 65 74 20 70 6f 73 20 20 20 20 20 s]..set pos 3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b [ 3290: 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 24 lsearch -exact $ 32a0: 6d 79 74 63 68 61 6e 67 65 73 65 74 73 28 24 6d mytchangesets($m 32b0: 79 74 79 70 65 29 20 24 73 65 6c 66 5d 0a 09 73 ytype) $self]..s 32c0: 65 74 20 6d 79 74 63 68 61 6e 67 65 73 65 74 73 et mytchangesets 32d0: 28 24 6d 79 74 79 70 65 29 20 5b 6c 72 65 70 6c ($mytype) [lrepl 32e0: 61 63 65 20 24 6d 79 74 63 68 61 6e 67 65 73 65 ace $mytchangese 32f0: 74 73 28 24 6d 79 74 79 70 65 29 20 24 70 6f 73 ts($mytype) $pos 3300: 20 24 70 6f 73 5d 0a 0a 09 23 20 52 65 74 75 72 $pos]...# Retur 3310: 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 72 n the list of pr 3320: 65 64 65 63 65 73 73 6f 72 73 20 73 6f 20 74 68 edecessors so th 3330: 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 61 at they can be a 3340: 64 6a 75 73 74 65 64 2e 0a 09 72 65 74 75 72 6e djusted...return 3350: 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d [struct::list m 3360: 61 70 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a ap [state run {. 3370: 09 20 20 20 20 53 45 4c 45 43 54 20 63 69 64 0a . SELECT cid. 3380: 09 20 20 20 20 46 52 4f 4d 20 20 20 63 73 73 75 . FROM cssu 3390: 63 63 65 73 73 6f 72 0a 09 20 20 20 20 57 48 45 ccessor.. WHE 33a0: 52 45 20 20 6e 69 64 20 3d 20 24 6d 79 69 64 0a RE nid = $myid. 33b0: 09 7d 5d 20 5b 6d 79 74 79 70 65 6d 65 74 68 6f .}] [mytypemetho 33c0: 64 20 6f 66 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 d of]]. }.. 33d0: 20 20 6d 65 74 68 6f 64 20 72 65 70 6f 72 74 6c method reportl 33e0: 6f 6f 70 20 7b 7b 6b 69 6c 6c 20 31 7d 7d 20 7b oop {{kill 1}} { 33f0: 0a 09 23 20 57 65 20 70 72 69 6e 74 20 74 68 65 ..# We print the 3400: 20 69 74 65 6d 73 20 77 68 69 63 68 20 61 72 65 items which are 3410: 20 70 72 6f 64 75 63 69 6e 67 20 74 68 65 20 6c producing the l 3420: 6f 6f 70 2c 20 61 6e 64 20 68 6f 77 2e 0a 0a 09 oop, and how.... 3430: 73 65 74 20 68 64 72 20 22 53 65 6c 66 2d 72 65 set hdr "Self-re 3440: 66 65 72 65 6e 74 69 61 6c 20 63 68 61 6e 67 65 ferential change 3450: 73 65 74 20 5b 24 73 65 6c 66 20 73 74 72 5d 20 set [$self str] 3460: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f ________________ 3470: 5f 5f 22 0a 09 73 65 74 20 66 74 72 20 5b 72 65 __"..set ftr [re 3480: 67 73 75 62 20 2d 61 6c 6c 20 7b 5b 5e 20 09 5d gsub -all {[^ .] 3490: 7d 20 24 68 64 72 20 7b 5f 7d 5d 0a 0a 09 6c 6f } $hdr {_}]...lo 34a0: 67 20 77 72 69 74 65 20 30 20 63 73 65 74 73 20 g write 0 csets 34b0: 24 68 64 72 0a 09 66 6f 72 65 61 63 68 20 7b 69 $hdr..foreach {i 34c0: 74 65 6d 20 6e 65 78 74 69 74 65 6d 7d 20 5b 24 tem nextitem} [$ 34d0: 6d 79 74 79 70 65 6f 62 6a 20 6c 6f 6f 70 73 20 mytypeobj loops 34e0: 24 6d 79 69 74 65 6d 73 5d 20 7b 0a 09 20 20 20 $myitems] {.. 34f0: 20 23 20 43 72 65 61 74 65 20 74 61 67 67 65 64 # Create tagged 3500: 20 69 74 65 6d 73 20 66 72 6f 6d 20 74 68 65 20 items from the 3510: 69 64 20 61 6e 64 20 6f 75 72 20 74 79 70 65 2e id and our type. 3520: 0a 09 20 20 20 20 73 65 74 20 69 74 65 6d 20 20 .. set item 3530: 20 20 20 5b 6c 69 73 74 20 24 6d 79 74 79 70 65 [list $mytype 3540: 20 20 24 69 74 65 6d 5d 0a 09 20 20 20 20 73 65 $item].. se 3550: 74 20 6e 65 78 74 69 74 65 6d 20 5b 6c 69 73 74 t nextitem [list 3560: 20 24 6d 79 74 79 70 65 20 24 6e 65 78 74 69 74 $mytype $nextit 3570: 65 6d 5d 0a 09 20 20 20 20 23 20 50 72 69 6e 74 em].. # Print 3580: 61 62 6c 65 20 6c 61 62 65 6c 73 2e 0a 09 20 20 able labels... 3590: 20 20 73 65 74 20 69 20 20 22 3c 5b 24 74 79 70 set i "<[$typ 35a0: 65 20 69 74 65 6d 73 74 72 20 24 69 74 65 6d 5d e itemstr $item] 35b0: 3e 22 0a 09 20 20 20 20 73 65 74 20 6e 20 20 22 >".. set n " 35c0: 3c 5b 24 74 79 70 65 20 69 74 65 6d 73 74 72 20 <[$type itemstr 35d0: 24 6e 65 78 74 69 74 65 6d 5d 3e 22 0a 09 20 20 $nextitem]>".. 35e0: 20 20 73 65 74 20 6e 63 73 20 24 6d 79 69 74 65 set ncs $myite 35f0: 6d 6d 61 70 28 24 6e 65 78 74 69 74 65 6d 29 0a mmap($nextitem). 3600: 09 20 20 20 20 23 20 50 72 69 6e 74 0a 09 20 20 . # Print.. 3610: 20 20 6c 6f 67 20 77 72 69 74 65 20 30 20 63 73 log write 0 cs 3620: 65 74 73 20 7b 2a 20 24 69 20 2d 2d 3e 20 24 6e ets {* $i --> $n 3630: 20 2d 2d 3e 20 63 73 20 5b 24 6e 63 73 20 73 74 --> cs [$ncs st 3640: 72 5d 7d 0a 09 7d 0a 09 6c 6f 67 20 77 72 69 74 r]}..}..log writ 3650: 65 20 30 20 63 73 65 74 73 20 24 66 74 72 0a 0a e 0 csets $ftr.. 3660: 09 69 66 20 7b 21 24 6b 69 6c 6c 7d 20 72 65 74 .if {!$kill} ret 3670: 75 72 6e 0a 09 74 72 6f 75 62 6c 65 20 69 6e 74 urn..trouble int 3680: 65 72 6e 61 6c 20 22 5b 24 73 65 6c 66 20 73 74 ernal "[$self st 3690: 72 5d 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 74 r] depends on it 36a0: 73 65 6c 66 22 0a 09 72 65 74 75 72 6e 0a 20 20 self"..return. 36b0: 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 }.. typemet 36c0: 68 6f 64 20 73 70 6c 69 74 20 7b 63 73 65 74 20 hod split {cset 36d0: 61 72 67 73 7d 20 7b 0a 09 23 20 41 73 20 70 61 args} {..# As pa 36e0: 72 74 20 6f 66 20 74 68 65 20 63 72 65 61 74 69 rt of the creati 36f0: 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 on of the new ch 3700: 61 6e 67 65 73 65 74 73 20 73 70 65 63 69 66 69 angesets specifi 3710: 65 64 20 69 6e 0a 09 23 20 41 52 47 53 20 61 73 ed in..# ARGS as 3720: 20 73 65 74 73 20 6f 66 20 69 74 65 6d 73 2c 20 sets of items, 3730: 61 6c 6c 20 73 75 62 73 65 74 73 20 6f 66 20 43 all subsets of C 3740: 53 45 54 27 73 20 69 74 65 6d 20 73 65 74 2c 20 SET's item set, 3750: 43 53 45 54 0a 09 23 20 77 69 6c 6c 20 62 65 20 CSET..# will be 3760: 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 61 6c 6c dropped from all 3770: 20 64 61 74 61 62 61 73 65 73 2c 20 69 6e 20 61 databases, in a 3780: 6e 64 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 nd out of memory 3790: 2c 0a 09 23 20 61 6e 64 20 74 68 65 6e 20 64 65 ,..# and then de 37a0: 73 74 72 6f 79 65 64 2e 0a 09 23 0a 09 23 20 4e stroyed...#..# N 37b0: 6f 74 65 3a 20 54 68 65 20 69 74 65 6d 20 6c 69 ote: The item li 37c0: 73 74 73 20 66 6f 75 6e 64 20 69 6e 20 61 72 67 sts found in arg 37d0: 73 20 61 72 65 20 74 61 67 67 65 64 20 69 74 65 s are tagged ite 37e0: 6d 73 2e 20 54 68 65 79 0a 09 23 20 68 61 76 65 ms. They..# have 37f0: 20 74 6f 20 68 61 76 65 20 74 68 65 20 73 61 6d to have the sam 3800: 65 20 74 79 70 65 20 61 73 20 74 68 65 20 63 68 e type as the ch 3810: 61 6e 67 65 73 65 74 2c 20 62 65 69 6e 67 20 73 angeset, being s 3820: 75 62 73 65 74 73 0a 09 23 20 6f 66 20 69 74 73 ubsets..# of its 3830: 20 69 74 65 6d 73 2e 20 54 68 69 73 20 69 73 20 items. This is 3840: 63 68 65 63 6b 65 64 20 69 6e 20 55 6e 74 61 67 checked in Untag 3850: 31 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 38 1....log write 8 3860: 20 63 73 65 74 73 20 7b 4f 4c 44 3a 20 5b 6c 73 csets {OLD: [ls 3870: 6f 72 74 20 5b 24 63 73 65 74 20 69 74 65 6d 73 ort [$cset items 3880: 5d 5d 7d 0a 09 56 61 6c 69 64 61 74 65 46 72 61 ]]}..ValidateFra 3890: 67 6d 65 6e 74 73 20 24 63 73 65 74 20 24 61 72 gments $cset $ar 38a0: 67 73 0a 0a 09 23 20 41 6c 6c 20 63 68 65 63 6b gs...# All check 38b0: 73 20 70 61 73 73 2c 20 61 63 74 75 61 6c 6c 79 s pass, actually 38c0: 20 70 65 72 66 6f 72 6d 20 74 68 65 20 73 70 6c perform the spl 38d0: 69 74 2e 0a 0a 09 73 74 72 75 63 74 3a 3a 6c 69 it....struct::li 38e0: 73 74 20 61 73 73 69 67 6e 20 5b 24 63 73 65 74 st assign [$cset 38f0: 20 64 61 74 61 5d 20 70 72 6f 6a 65 63 74 20 63 data] project c 3900: 73 74 79 70 65 20 63 73 73 72 63 0a 0a 09 73 65 stype cssrc...se 3910: 74 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 5b t predecessors [ 3920: 24 63 73 65 74 20 64 72 6f 70 5d 0a 09 24 63 73 $cset drop]..$cs 3930: 65 74 20 64 65 73 74 72 6f 79 0a 0a 09 73 65 74 et destroy...set 3940: 20 6e 65 77 63 73 65 74 73 20 7b 7d 0a 09 66 6f newcsets {}..fo 3950: 72 65 61 63 68 20 66 72 61 67 6d 65 6e 74 69 74 reach fragmentit 3960: 65 6d 73 20 24 61 72 67 73 20 7b 0a 09 20 20 20 ems $args {.. 3970: 20 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73 65 log write 8 cse 3980: 74 73 20 7b 4d 41 4b 45 3a 20 5b 6c 73 6f 72 74 ts {MAKE: [lsort 3990: 20 24 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 5d $fragmentitems] 39a0: 7d 0a 0a 09 20 20 20 20 73 65 74 20 66 72 61 67 }... set frag 39b0: 6d 65 6e 74 20 5b 24 74 79 70 65 20 25 41 55 54 ment [$type %AUT 39c0: 4f 25 20 24 70 72 6f 6a 65 63 74 20 24 63 73 74 O% $project $cst 39d0: 79 70 65 20 24 63 73 73 72 63 20 5c 0a 09 09 09 ype $cssrc \.... 39e0: 20 20 20 20 20 20 5b 55 6e 74 61 67 20 24 66 72 [Untag $fr 39f0: 61 67 6d 65 6e 74 69 74 65 6d 73 20 24 63 73 74 agmentitems $cst 3a00: 79 70 65 5d 5d 0a 09 20 20 20 20 6c 61 70 70 65 ype]].. lappe 3a10: 6e 64 20 6e 65 77 63 73 65 74 73 20 24 66 72 61 nd newcsets $fra 3a20: 67 6d 65 6e 74 0a 0a 09 20 20 20 20 24 66 72 61 gment... $fra 3a30: 67 6d 65 6e 74 20 70 65 72 73 69 73 74 0a 09 20 gment persist.. 3a40: 20 20 20 24 66 72 61 67 6d 65 6e 74 20 64 65 74 $fragment det 3a50: 65 72 6d 69 6e 65 73 75 63 63 65 73 73 6f 72 73 erminesuccessors 3a60: 0a 09 7d 0a 0a 09 23 20 54 68 65 20 70 72 65 64 ..}...# The pred 3a70: 65 63 65 73 73 6f 72 73 20 68 61 76 65 20 74 6f ecessors have to 3a80: 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 69 72 recompute their 3a90: 20 73 75 63 63 65 73 73 6f 72 73 2c 20 69 2e 65 successors, i.e 3aa0: 2e 0a 09 23 20 72 65 6d 6f 76 65 20 74 68 65 20 ...# remove the 3ab0: 64 72 6f 70 70 65 64 20 63 68 61 6e 67 65 73 65 dropped changese 3ac0: 74 20 61 6e 64 20 70 75 74 20 6f 6e 65 20 6f 66 t and put one of 3ad0: 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 0a 09 the fragments.. 3ae0: 23 20 69 6e 74 6f 20 69 74 73 20 70 6c 61 63 65 # into its place 3af0: 2e 0a 09 66 6f 72 65 61 63 68 20 70 20 24 70 72 ...foreach p $pr 3b00: 65 64 65 63 65 73 73 6f 72 73 20 7b 0a 09 20 20 edecessors {.. 3b10: 20 20 24 70 20 64 65 74 65 72 6d 69 6e 65 73 75 $p determinesu 3b20: 63 63 65 73 73 6f 72 73 0a 09 7d 0a 0a 09 72 65 ccessors..}...re 3b30: 74 75 72 6e 20 24 6e 65 77 63 73 65 74 73 0a 20 turn $newcsets. 3b40: 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 }.. typeme 3b50: 74 68 6f 64 20 69 74 65 6d 73 74 72 20 7b 69 74 thod itemstr {it 3b60: 65 6d 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c em} {..struct::l 3b70: 69 73 74 20 61 73 73 69 67 6e 20 24 69 74 65 6d ist assign $item 3b80: 20 69 74 79 70 65 20 69 69 64 0a 09 72 65 74 75 itype iid..retu 3b90: 72 6e 20 5b 24 69 74 79 70 65 20 73 74 72 20 24 rn [$itype str $ 3ba0: 69 69 64 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 iid]. }.. 3bb0: 74 79 70 65 6d 65 74 68 6f 64 20 73 74 72 6c 69 typemethod strli 3bc0: 73 74 20 7b 63 68 61 6e 67 65 73 65 74 73 7d 20 st {changesets} 3bd0: 7b 0a 09 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 20 {..return [join 3be0: 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61 [struct::list ma 3bf0: 70 20 24 63 68 61 6e 67 65 73 65 74 73 20 5b 6d p $changesets [m 3c00: 79 70 72 6f 63 20 49 44 5d 5d 5d 0a 20 20 20 20 yproc ID]]]. 3c10: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 49 44 20 7b }.. proc ID { 3c20: 63 73 65 74 7d 20 7b 20 24 63 73 65 74 20 73 74 cset} { $cset st 3c30: 72 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 55 6e r }.. proc Un 3c40: 74 61 67 20 7b 74 61 67 67 65 64 69 74 65 6d 73 tag {taggeditems 3c50: 20 63 73 74 79 70 65 7d 20 7b 0a 09 72 65 74 75 cstype} {..retu 3c60: 72 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 rn [struct::list 3c70: 20 6d 61 70 20 24 74 61 67 67 65 64 69 74 65 6d map $taggeditem 3c80: 73 20 5b 6d 79 70 72 6f 63 20 55 6e 74 61 67 31 s [myproc Untag1 3c90: 20 24 63 73 74 79 70 65 5d 5d 0a 20 20 20 20 7d $cstype]]. } 3ca0: 0a 0a 20 20 20 20 70 72 6f 63 20 55 6e 74 61 67 .. proc Untag 3cb0: 31 20 7b 63 73 74 79 70 65 20 74 68 65 69 74 65 1 {cstype theite 3cc0: 6d 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c 69 m} {..struct::li 3cd0: 73 74 20 61 73 73 69 67 6e 20 24 74 68 65 69 74 st assign $theit 3ce0: 65 6d 20 74 20 69 0a 09 69 6e 74 65 67 72 69 74 em t i..integrit 3cf0: 79 20 61 73 73 65 72 74 20 7b 24 63 73 74 79 70 y assert {$cstyp 3d00: 65 20 65 71 20 24 74 7d 20 7b 49 74 65 6d 20 24 e eq $t} {Item $ 3d10: 69 27 73 20 74 79 70 65 20 69 73 20 27 24 74 27 i's type is '$t' 3d20: 2c 20 65 78 70 65 63 74 65 64 20 27 24 63 73 74 , expected '$cst 3d30: 79 70 65 27 7d 0a 09 72 65 74 75 72 6e 20 24 69 ype'}..return $i 3d40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 . }.. proc 3d50: 20 56 61 6c 69 64 61 74 65 46 72 61 67 6d 65 6e ValidateFragmen 3d60: 74 73 20 7b 63 73 65 74 20 66 72 61 67 6d 65 6e ts {cset fragmen 3d70: 74 73 7d 20 7b 0a 09 23 20 43 68 65 63 6b 20 74 ts} {..# Check t 3d80: 68 65 20 76 61 72 69 6f 75 73 20 69 6e 74 65 67 he various integ 3d90: 72 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 rity constraints 3da0: 20 66 6f 72 20 74 68 65 20 66 72 61 67 6d 65 6e for the fragmen 3db0: 74 73 0a 09 23 20 73 70 65 63 69 66 79 69 6e 67 ts..# specifying 3dc0: 20 68 6f 77 20 74 6f 20 73 70 6c 69 74 20 74 68 how to split th 3dd0: 65 20 63 68 61 6e 67 65 73 65 74 3a 0a 09 23 0a e changeset:..#. 3de0: 09 23 20 2a 20 57 65 20 6d 75 73 74 20 68 61 76 .# * We must hav 3df0: 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 66 72 e two or more fr 3e00: 61 67 6d 65 6e 74 73 2c 20 61 73 20 73 70 6c 69 agments, as spli 3e10: 74 74 69 6e 67 20 61 0a 09 23 20 20 20 63 68 61 tting a..# cha 3e20: 6e 67 65 73 65 74 20 69 6e 74 6f 20 6f 6e 65 20 ngeset into one 3e30: 6d 61 6b 65 73 20 6e 6f 20 73 65 6e 73 65 2e 0a makes no sense.. 3e40: 09 23 20 2a 20 4e 6f 20 66 72 61 67 6d 65 6e 74 .# * No fragment 3e50: 20 6d 61 79 20 62 65 20 65 6d 70 74 79 2e 0a 09 may be empty... 3e60: 23 20 2a 20 41 6c 6c 20 66 72 61 67 6d 65 6e 74 # * All fragment 3e70: 73 20 68 61 76 65 20 74 6f 20 62 65 20 74 72 75 s have to be tru 3e80: 65 20 73 75 62 73 65 74 73 20 6f 66 20 74 68 65 e subsets of the 3e90: 20 69 74 65 6d 73 20 69 6e 20 74 68 65 0a 09 23 items in the..# 3ea0: 20 20 20 63 68 61 6e 67 65 73 65 74 20 74 6f 20 changeset to 3eb0: 73 70 6c 69 74 2e 20 54 68 65 20 27 74 72 75 65 split. The 'true 3ec0: 27 20 69 73 20 69 6d 70 6c 69 65 64 20 62 65 63 ' is implied bec 3ed0: 61 75 73 65 20 6e 6f 6e 65 20 61 72 65 0a 09 23 ause none are..# 3ee0: 20 20 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 allowed to be 3ef0: 20 65 6d 70 74 79 2c 20 73 6f 20 65 61 63 68 20 empty, so each 3f00: 68 61 73 20 74 6f 20 62 65 20 73 6d 61 6c 6c 65 has to be smalle 3f10: 72 20 74 68 61 6e 20 74 68 65 0a 09 23 20 20 20 r than the..# 3f20: 74 6f 74 61 6c 2e 0a 09 23 20 2a 20 54 68 65 20 total...# * The 3f30: 75 6e 69 6f 6e 20 6f 66 20 74 68 65 20 66 72 61 union of the fra 3f40: 67 6d 65 6e 74 73 20 68 61 73 20 74 6f 20 62 65 gments has to be 3f50: 20 74 68 65 20 69 74 65 6d 20 73 65 74 20 6f 66 the item set of 3f60: 20 74 68 65 0a 09 23 20 20 20 63 68 61 6e 67 65 the..# change 3f70: 73 65 74 2e 0a 09 23 20 2a 20 54 68 65 20 66 72 set...# * The fr 3f80: 61 67 6d 65 6e 74 20 6d 75 73 74 20 6e 6f 74 20 agment must not 3f90: 6f 76 65 72 6c 61 70 2c 20 69 2e 65 2e 20 74 68 overlap, i.e. th 3fa0: 65 69 72 20 70 61 69 72 77 69 73 65 0a 09 23 20 eir pairwise..# 3fb0: 20 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 73 20 intersections 3fc0: 68 61 76 65 20 74 6f 20 62 65 20 65 6d 70 74 79 have to be empty 3fd0: 2e 0a 0a 09 73 65 74 20 63 6f 76 65 72 20 7b 7d ....set cover {} 3fe0: 0a 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65 ..foreach fragme 3ff0: 6e 74 69 74 65 6d 73 20 24 66 72 61 67 6d 65 6e ntitems $fragmen 4000: 74 73 20 7b 0a 09 20 20 20 20 6c 6f 67 20 77 72 ts {.. log wr 4010: 69 74 65 20 38 20 63 73 65 74 73 20 7b 4e 45 57 ite 8 csets {NEW 4020: 3a 20 5b 6c 73 6f 72 74 20 24 66 72 61 67 6d 65 : [lsort $fragme 4030: 6e 74 69 74 65 6d 73 5d 7d 0a 0a 09 20 20 20 20 ntitems]}... 4040: 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 integrity assert 4050: 20 7b 0a 09 09 21 5b 73 74 72 75 63 74 3a 3a 73 {...![struct::s 4060: 65 74 20 65 6d 70 74 79 20 24 66 72 61 67 6d 65 et empty $fragme 4070: 6e 74 69 74 65 6d 73 5d 0a 09 20 20 20 20 7d 20 ntitems].. } 4080: 7b 63 68 61 6e 67 65 73 65 74 20 66 72 61 67 6d {changeset fragm 4090: 65 6e 74 20 69 73 20 65 6d 70 74 79 7d 0a 0a 09 ent is empty}... 40a0: 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 integrity as 40b0: 73 65 72 74 20 7b 0a 09 09 5b 73 74 72 75 63 74 sert {...[struct 40c0: 3a 3a 73 65 74 20 73 75 62 73 65 74 6f 66 20 24 ::set subsetof $ 40d0: 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 20 5b 24 fragmentitems [$ 40e0: 63 73 65 74 20 69 74 65 6d 73 5d 5d 0a 09 20 20 cset items]].. 40f0: 20 20 7d 20 7b 63 68 61 6e 67 65 73 65 74 20 66 } {changeset f 4100: 72 61 67 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61 ragment is not a 4110: 20 73 75 62 73 65 74 7d 0a 09 20 20 20 20 73 74 subset}.. st 4120: 72 75 63 74 3a 3a 73 65 74 20 61 64 64 20 63 6f ruct::set add co 4130: 76 65 72 20 24 66 72 61 67 6d 65 6e 74 69 74 65 ver $fragmentite 4140: 6d 73 0a 09 7d 0a 0a 09 69 6e 74 65 67 72 69 74 ms..}...integrit 4150: 79 20 61 73 73 65 72 74 20 7b 0a 09 20 20 20 20 y assert {.. 4160: 5b 73 74 72 75 63 74 3a 3a 73 65 74 20 65 71 75 [struct::set equ 4170: 61 6c 20 24 63 6f 76 65 72 20 5b 24 63 73 65 74 al $cover [$cset 4180: 20 69 74 65 6d 73 5d 5d 0a 09 20 7d 20 7b 54 68 items]].. } {Th 4190: 65 20 66 72 61 67 6d 65 6e 74 73 20 64 6f 20 6e e fragments do n 41a0: 6f 74 20 63 6f 76 65 72 20 74 68 65 20 6f 72 69 ot cover the ori 41b0: 67 69 6e 61 6c 20 63 68 61 6e 67 65 73 65 74 7d ginal changeset} 41c0: 0a 0a 09 73 65 74 20 69 20 31 0a 09 66 6f 72 65 ...set i 1..fore 41d0: 61 63 68 20 66 69 61 20 24 66 72 61 67 6d 65 6e ach fia $fragmen 41e0: 74 73 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 63 ts {.. foreac 41f0: 68 20 66 69 62 20 5b 6c 72 61 6e 67 65 20 24 66 h fib [lrange $f 4200: 72 61 67 6d 65 6e 74 73 20 24 69 20 65 6e 64 5d ragments $i end] 4210: 20 7b 0a 09 09 69 6e 74 65 67 72 69 74 79 20 61 {...integrity a 4220: 73 73 65 72 74 20 7b 0a 09 09 20 20 20 20 5b 73 ssert {... [s 4230: 74 72 75 63 74 3a 3a 73 65 74 20 65 6d 70 74 79 truct::set empty 4240: 20 5b 73 74 72 75 63 74 3a 3a 73 65 74 20 69 6e [struct::set in 4250: 74 65 72 73 65 63 74 20 24 66 69 61 20 24 66 69 tersect $fia $fi 4260: 62 5d 5d 0a 09 09 7d 20 7b 54 68 65 20 66 72 61 b]]...} {The fra 4270: 67 6d 65 6e 74 73 20 3c 24 66 69 61 3e 20 61 6e gments <$fia> an 4280: 64 20 3c 24 66 69 62 3e 20 6f 76 65 72 6c 61 70 d <$fib> overlap 4290: 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 6e }.. }.. in 42a0: 63 72 20 69 0a 09 7d 0a 0a 09 72 65 74 75 72 6e cr i..}...return 42b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 . }.. # # 42c0: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 ## ### ##### ### 42d0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 ##### ########## 42e0: 23 23 23 0a 20 20 20 20 23 23 20 53 74 61 74 65 ###. ## State 42f0: 0a 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d .. variable m 4300: 79 69 64 20 20 20 20 20 20 20 20 7b 7d 20 3b 20 yid {} ; 4310: 23 20 49 64 20 6f 66 20 74 68 65 20 63 73 65 74 # Id of the cset 4320: 20 66 6f 72 20 74 68 65 20 70 65 72 73 69 73 74 for the persist 4330: 65 6e 74 0a 09 09 09 20 20 20 20 20 20 23 20 73 ent.... # s 4340: 74 61 74 65 2e 0a 20 20 20 20 76 61 72 69 61 62 tate.. variab 4350: 6c 65 20 6d 79 70 72 6f 6a 65 63 74 20 20 20 7b le myproject { 4360: 7d 20 3b 20 23 20 52 65 66 65 72 65 6e 63 65 20 } ; # Reference 4370: 6f 66 20 74 68 65 20 70 72 6f 6a 65 63 74 20 6f of the project o 4380: 62 6a 65 63 74 20 74 68 65 0a 09 09 09 20 20 20 bject the.... 4390: 20 20 20 23 20 63 68 61 6e 67 65 73 65 74 20 62 # changeset b 43a0: 65 6c 6f 6e 67 73 20 74 6f 2e 0a 20 20 20 20 76 elongs to.. v 43b0: 61 72 69 61 62 6c 65 20 6d 79 74 79 70 65 20 20 ariable mytype 43c0: 20 20 20 20 7b 7d 20 3b 20 23 20 57 68 61 74 20 {} ; # What 43d0: 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 69 73 the changeset is 43e0: 20 62 61 73 65 64 20 6f 6e 0a 09 09 09 20 20 20 based on.... 43f0: 20 20 20 23 20 28 72 65 76 69 73 69 6f 6e 73 2c # (revisions, 4400: 20 74 61 67 73 2c 20 6f 72 20 62 72 61 6e 63 68 tags, or branch 4410: 65 73 29 2e 0a 09 09 09 20 20 20 20 20 20 23 20 es)..... # 4420: 56 61 6c 75 65 73 3a 20 53 65 65 20 6d 79 63 73 Values: See mycs 4430: 74 79 70 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 type. Note that 4440: 77 65 0a 09 09 09 20 20 20 20 20 20 23 20 68 61 we.... # ha 4450: 76 65 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6e ve to keep the n 4460: 61 6d 65 73 20 6f 66 20 74 68 65 20 68 65 6c 70 ames of the help 4470: 65 72 0a 09 09 09 20 20 20 20 20 20 23 20 73 69 er.... # si 4480: 6e 67 6c 65 74 6f 6e 73 20 69 6e 20 73 79 6e 63 ngletons in sync 4490: 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e with the conten 44a0: 74 73 0a 09 09 09 20 20 20 20 20 20 23 20 6f 66 ts.... # of 44b0: 20 73 74 61 74 65 20 74 61 62 6c 65 20 27 63 73 state table 'cs 44c0: 74 79 70 65 27 2c 20 61 6e 64 20 76 61 72 69 6f type', and vario 44d0: 75 73 0a 09 09 09 20 20 20 20 20 20 23 20 6f 74 us.... # ot 44e0: 68 65 72 20 70 6c 61 63 65 73 20 75 73 69 6e 67 her places using 44f0: 20 74 68 65 6d 20 68 61 72 64 77 69 72 65 64 2e them hardwired. 4500: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 . variable my 4510: 74 79 70 65 6f 62 6a 20 20 20 7b 7d 20 3b 20 23 typeobj {} ; # 4520: 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 Reference to th 4530: 65 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20 e container for 4540: 74 68 65 0a 09 09 09 20 20 20 20 20 20 23 20 74 the.... # t 4550: 79 70 65 20 64 65 70 65 6e 64 65 6e 74 20 63 6f ype dependent co 4560: 64 65 2e 20 44 65 72 69 76 65 64 20 66 72 6f 6d de. Derived from 4570: 0a 09 09 09 20 20 20 20 20 20 23 20 6d 79 74 79 .... # myty 4580: 70 65 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 pe.. variable 4590: 20 6d 79 73 72 63 69 64 20 20 20 20 20 7b 7d 20 mysrcid {} 45a0: 3b 20 23 20 49 64 20 6f 66 20 74 68 65 20 6d 65 ; # Id of the me 45b0: 74 61 64 61 74 61 20 6f 72 20 73 79 6d 62 6f 6c tadata or symbol 45c0: 20 74 68 65 20 63 73 65 74 0a 09 09 09 20 20 20 the cset.... 45d0: 20 20 20 23 20 69 73 20 62 61 73 65 64 20 6f 6e # is based on 45e0: 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d .. variable m 45f0: 79 69 74 65 6d 73 20 20 20 20 20 7b 7d 20 3b 20 yitems {} ; 4600: 23 20 4c 69 73 74 20 6f 66 20 74 68 65 20 66 69 # List of the fi 4610: 6c 65 20 6c 65 76 65 6c 20 72 65 76 69 73 69 6f le level revisio 4620: 6e 73 2c 0a 09 09 09 20 20 20 20 20 20 23 20 74 ns,.... # t 4630: 61 67 73 2c 20 6f 72 20 62 72 61 6e 63 68 65 73 ags, or branches 4640: 20 69 6e 20 74 68 65 20 63 73 65 74 2c 20 61 73 in the cset, as 4650: 0a 09 09 09 20 20 20 20 20 20 23 20 69 64 73 2e .... # ids. 4660: 20 4e 6f 74 20 74 61 67 67 65 64 2e 0a 20 20 20 Not tagged.. 4670: 20 76 61 72 69 61 62 6c 65 20 6d 79 74 69 74 65 variable mytite 4680: 6d 73 20 20 20 20 7b 7d 20 3b 20 23 20 41 73 20 ms {} ; # As 4690: 6d 79 69 74 65 6d 73 2c 20 74 68 65 20 74 61 67 myitems, the tag 46a0: 67 65 64 20 66 6f 72 6d 2e 0a 20 20 20 20 76 61 ged form.. va 46b0: 72 69 61 62 6c 65 20 6d 79 70 72 65 6d 61 70 20 riable mypremap 46c0: 20 20 20 7b 7d 20 3b 20 23 20 44 69 63 74 69 6f {} ; # Dictio 46d0: 6e 61 72 79 20 6d 61 70 70 69 6e 67 20 66 72 6f nary mapping fro 46e0: 6d 20 74 68 65 20 69 74 65 6d 73 20 28 74 61 67 m the items (tag 46f0: 67 65 64 20 6e 6f 77 29 0a 09 09 09 20 20 20 20 ged now).... 4700: 20 20 23 20 74 6f 20 74 68 65 69 72 20 70 72 65 # to their pre 4710: 64 65 63 65 73 73 6f 72 73 2c 20 61 6c 73 6f 20 decessors, also 4720: 74 61 67 67 65 64 2e 20 41 0a 09 09 09 20 20 20 tagged. A.... 4730: 20 20 20 23 20 63 61 63 68 65 20 74 6f 20 61 76 # cache to av 4740: 6f 69 64 20 6c 6f 61 64 69 6e 67 20 74 68 69 73 oid loading this 4750: 20 66 72 6f 6d 20 74 68 65 0a 09 09 09 20 20 20 from the.... 4760: 20 20 20 23 20 73 74 61 74 65 20 6d 6f 72 65 20 # state more 4770: 74 68 61 6e 20 6f 6e 63 65 2e 0a 20 20 20 20 76 than once.. v 4780: 61 72 69 61 62 6c 65 20 6d 79 6e 65 78 74 6d 61 ariable mynextma 4790: 70 20 20 20 7b 7d 20 3b 20 23 20 44 69 63 74 69 p {} ; # Dicti 47a0: 6f 6e 61 72 79 20 6d 61 70 70 69 6e 67 20 66 72 onary mapping fr 47b0: 6f 6d 20 74 68 65 20 69 74 65 6d 73 20 28 74 61 om the items (ta 47c0: 67 67 65 64 29 0a 09 09 09 20 20 20 20 20 20 23 gged).... # 47d0: 20 74 6f 20 74 68 65 69 72 20 73 75 63 63 65 73 to their succes 47e0: 73 6f 72 73 20 28 61 6c 73 6f 20 74 61 67 67 65 sors (also tagge 47f0: 64 29 2e 20 41 0a 09 09 09 20 20 20 20 20 20 23 d). A.... # 4800: 20 63 61 63 68 65 20 74 6f 20 61 76 6f 69 64 20 cache to avoid 4810: 6c 6f 61 64 69 6e 67 20 74 68 69 73 20 66 72 6f loading this fro 4820: 6d 20 74 68 65 0a 09 09 09 20 20 20 20 20 20 23 m the.... # 4830: 20 73 74 61 74 65 20 6d 6f 72 65 20 74 68 61 6e state more than 4840: 20 6f 6e 63 65 2e 0a 20 20 20 20 76 61 72 69 61 once.. varia 4850: 62 6c 65 20 6d 79 70 6f 73 20 20 20 20 20 20 20 ble mypos 4860: 7b 7d 20 3b 20 23 20 43 6f 6d 6d 69 74 20 70 6f {} ; # Commit po 4870: 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 sition of the ch 4880: 61 6e 67 65 73 65 74 2c 20 69 66 0a 09 09 09 20 angeset, if.... 4890: 20 20 20 20 20 23 20 6b 6e 6f 77 6e 2e 0a 0a 20 # known... 48a0: 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 # # ## ### ## 48b0: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 ### ######## ### 48c0: 23 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 ##########. # 48d0: 23 20 49 6e 74 65 72 6e 61 6c 20 6d 65 74 68 6f # Internal metho 48e0: 64 73 0a 0a 20 20 20 20 74 79 70 65 76 61 72 69 ds.. typevari 48f0: 61 62 6c 65 20 6d 79 63 6f 75 6e 74 65 72 20 20 able mycounter 4900: 20 20 20 20 20 20 30 20 3b 20 23 20 49 64 20 63 0 ; # Id c 4910: 6f 75 6e 74 65 72 20 66 6f 72 20 63 73 65 74 73 ounter for csets 4920: 2e 20 4c 61 73 74 20 69 64 0a 09 09 09 09 20 20 . Last id..... 4930: 20 20 20 20 23 20 75 73 65 64 2e 0a 20 20 20 20 # used.. 4940: 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 typevariable myc 4950: 73 74 79 70 65 20 2d 61 72 72 61 79 20 7b 7d 20 stype -array {} 4960: 3b 20 23 20 4d 61 70 20 63 73 74 79 70 65 73 20 ; # Map cstypes 4970: 28 6e 61 6d 65 73 29 20 74 6f 20 70 65 72 73 69 (names) to persi 4980: 73 74 65 6e 74 0a 09 09 09 09 20 20 20 20 20 20 stent..... 4990: 23 20 69 64 73 2e 20 4e 6f 74 65 20 74 68 61 74 # ids. Note that 49a0: 20 77 65 20 68 61 76 65 20 74 6f 20 6b 65 65 70 we have to keep 49b0: 0a 09 09 09 09 20 20 20 20 20 20 23 20 74 68 65 ..... # the 49c0: 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 74 61 names in the ta 49d0: 62 6c 65 20 27 63 73 74 79 70 65 27 0a 09 09 09 ble 'cstype'.... 49e0: 09 20 20 20 20 20 20 23 20 69 6e 20 73 79 6e 63 . # in sync 49f0: 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 with the names 4a00: 6f 66 20 74 68 65 0a 09 09 09 09 20 20 20 20 20 of the..... 4a10: 20 23 20 68 65 6c 70 65 72 20 73 69 6e 67 6c 65 # helper single 4a20: 74 6f 6e 73 2e 0a 0a 20 20 20 20 74 79 70 65 6d tons... typem 4a30: 65 74 68 6f 64 20 67 65 74 63 73 74 79 70 65 73 ethod getcstypes 4a40: 20 7b 7d 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b {} {..foreach { 4a50: 74 69 64 20 6e 61 6d 65 7d 20 5b 73 74 61 74 65 tid name} [state 4a60: 20 72 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c 45 run {.. SELE 4a70: 43 54 20 74 69 64 2c 20 6e 61 6d 65 20 46 52 4f CT tid, name FRO 4a80: 4d 20 63 73 74 79 70 65 3b 0a 09 7d 5d 20 7b 20 M cstype;..}] { 4a90: 73 65 74 20 6d 79 63 73 74 79 70 65 28 24 6e 61 set mycstype($na 4aa0: 6d 65 29 20 24 74 69 64 20 7d 0a 09 72 65 74 75 me) $tid }..retu 4ab0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 rn. }.. ty 4ac0: 70 65 6d 65 74 68 6f 64 20 6c 6f 61 64 63 6f 75 pemethod loadcou 4ad0: 6e 74 65 72 20 7b 7d 20 7b 0a 09 23 20 49 6e 69 nter {} {..# Ini 4ae0: 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 75 6e tialize the coun 4af0: 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 74 61 ter from the sta 4b00: 74 65 0a 09 6c 6f 67 20 77 72 69 74 65 20 32 20 te..log write 2 4b10: 69 6e 69 74 63 73 65 74 73 20 7b 4c 6f 61 64 69 initcsets {Loadi 4b20: 6e 67 20 63 68 61 6e 67 65 73 65 74 20 63 6f 75 ng changeset cou 4b30: 6e 74 65 72 7d 0a 09 73 65 74 20 6d 79 63 6f 75 nter}..set mycou 4b40: 6e 74 65 72 20 5b 73 74 61 74 65 20 6f 6e 65 20 nter [state one 4b50: 7b 20 53 45 4c 45 43 54 20 4d 41 58 28 63 69 64 { SELECT MAX(cid 4b60: 29 20 46 52 4f 4d 20 63 68 61 6e 67 65 73 65 74 ) FROM changeset 4b70: 20 7d 5d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 }]..return. 4b80: 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f }.. typemetho 4b90: 64 20 6e 75 6d 20 7b 7d 20 7b 20 72 65 74 75 72 d num {} { retur 4ba0: 6e 20 24 6d 79 63 6f 75 6e 74 65 72 20 7d 0a 0a n $mycounter }.. 4bb0: 20 20 20 20 70 72 6f 63 20 49 6e 69 74 69 61 6c proc Initial 4bc0: 69 7a 65 42 72 65 61 6b 53 74 61 74 65 20 7b 72 izeBreakState {r 4bd0: 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 evisions} {..upv 4be0: 61 72 20 31 20 70 6f 73 20 70 6f 73 20 63 72 6f ar 1 pos pos cro 4bf0: 73 73 20 63 72 6f 73 73 20 72 61 6e 67 65 20 72 ss cross range r 4c00: 61 6e 67 65 20 64 65 70 63 20 64 65 70 63 20 64 ange depc depc d 4c10: 65 6c 74 61 20 64 65 6c 74 61 20 5c 0a 09 20 20 elta delta \.. 4c20: 20 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 64 dependencies d 4c30: 65 70 65 6e 64 65 6e 63 69 65 73 0a 0a 09 23 20 ependencies...# 4c40: 46 69 72 73 74 20 77 65 20 63 72 65 61 74 65 20 First we create 4c50: 61 20 6d 61 70 20 6f 66 20 70 6f 73 69 74 69 6f a map of positio 4c60: 6e 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 65 61 ns to make it ea 4c70: 73 69 65 72 20 74 6f 0a 09 23 20 64 65 74 65 72 sier to..# deter 4c80: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 61 20 64 mine whether a d 4c90: 65 70 65 6e 64 65 6e 63 79 20 63 72 6f 73 73 65 ependency crosse 4ca0: 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 s a particular i 4cb0: 6e 64 65 78 2e 0a 0a 09 61 72 72 61 79 20 73 65 ndex....array se 4cc0: 74 20 70 6f 73 20 20 20 7b 7d 0a 09 61 72 72 61 t pos {}..arra 4cd0: 79 20 73 65 74 20 63 72 6f 73 73 20 7b 7d 0a 09 y set cross {}.. 4ce0: 61 72 72 61 79 20 73 65 74 20 64 65 70 63 20 20 array set depc 4cf0: 7b 7d 0a 09 73 65 74 20 72 61 6e 67 65 20 20 20 {}..set range 4d00: 20 20 20 20 7b 7d 0a 09 73 65 74 20 6e 20 30 0a {}..set n 0. 4d10: 09 66 6f 72 65 61 63 68 20 72 65 76 20 24 72 65 .foreach rev $re 4d20: 76 69 73 69 6f 6e 73 20 7b 0a 09 20 20 20 20 6c visions {.. l 4d30: 61 70 70 65 6e 64 20 72 61 6e 67 65 20 24 6e 0a append range $n. 4d40: 09 20 20 20 20 73 65 74 20 70 6f 73 28 24 72 65 . set pos($re 4d50: 76 29 20 24 6e 0a 09 20 20 20 20 73 65 74 20 63 v) $n.. set c 4d60: 72 6f 73 73 28 24 6e 29 20 30 0a 09 20 20 20 20 ross($n) 0.. 4d70: 69 6e 63 72 20 6e 0a 09 7d 0a 0a 09 23 20 53 65 incr n..}...# Se 4d80: 63 6f 6e 64 6c 79 20 77 65 20 63 6f 75 6e 74 20 condly we count 4d90: 74 68 65 20 63 72 6f 73 73 69 6e 67 73 20 70 65 the crossings pe 4da0: 72 20 70 6f 73 69 74 69 6f 6e 2c 20 62 79 20 69 r position, by i 4db0: 74 65 72 61 74 69 6e 67 0a 09 23 20 6f 76 65 72 terating..# over 4dc0: 20 74 68 65 20 72 65 63 6f 72 64 65 64 20 69 6e the recorded in 4dd0: 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 ternal dependenc 4de0: 69 65 73 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 49 ies....# Note: I 4df0: 66 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 73 f the timestamps 4e00: 20 61 72 65 20 62 61 64 6c 79 20 6f 75 74 20 6f are badly out o 4e10: 66 20 6f 72 64 65 72 20 69 74 20 69 73 0a 09 23 f order it is..# 4e20: 20 20 20 20 20 20 20 70 6f 73 73 69 62 6c 65 20 possible 4e30: 74 6f 20 68 61 76 65 20 61 20 62 61 63 6b 77 61 to have a backwa 4e40: 72 64 20 73 75 63 63 65 73 73 6f 72 20 64 65 70 rd successor dep 4e50: 65 6e 64 65 6e 63 79 2c 0a 09 23 20 20 20 20 20 endency,..# 4e60: 20 20 69 2e 65 2e 20 77 69 74 68 20 73 74 61 72 i.e. with star 4e70: 74 20 3e 20 65 6e 64 2e 20 57 65 20 6d 61 79 20 t > end. We may 4e80: 68 61 76 65 20 74 6f 20 73 77 61 70 20 74 68 65 have to swap the 4e90: 20 69 6e 64 69 63 65 73 0a 09 23 20 20 20 20 20 indices..# 4ea0: 20 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 to ensure that 4eb0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c the following l 4ec0: 6f 6f 70 20 72 75 6e 73 20 63 6f 72 72 65 63 74 oop runs correct 4ed0: 6c 79 2e 0a 09 23 0a 09 23 20 4e 6f 74 65 20 32 ly...#..# Note 2 4ee0: 3a 20 73 74 61 72 74 20 3d 3d 20 65 6e 64 20 69 : start == end i 4ef0: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 s not possible. 4f00: 49 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 09 It indicates a.. 4f10: 23 20 20 20 20 20 20 20 20 20 73 65 6c 66 2d 64 # self-d 4f20: 65 70 65 6e 64 65 6e 63 79 20 64 75 65 20 74 6f ependency due to 4f30: 20 74 68 65 20 75 6e 69 71 75 65 6e 65 73 73 20 the uniqueness 4f40: 6f 66 20 70 6f 73 69 74 69 6f 6e 73 2c 0a 09 23 of positions,..# 4f50: 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 61 and tha 4f60: 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 77 t is something w 4f70: 65 20 68 61 76 65 20 72 75 6c 65 64 20 6f 75 74 e have ruled out 4f80: 20 61 6c 72 65 61 64 79 2c 20 73 65 65 0a 09 23 already, see..# 4f90: 20 20 20 20 20 20 20 20 20 27 72 65 76 20 69 6e 'rev in 4fa0: 74 65 72 6e 61 6c 73 75 63 63 65 73 73 6f 72 73 ternalsuccessors 4fb0: 27 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 '....foreach {ri 4fc0: 64 20 63 68 69 6c 64 72 65 6e 7d 20 5b 61 72 72 d children} [arr 4fd0: 61 79 20 67 65 74 20 64 65 70 65 6e 64 65 6e 63 ay get dependenc 4fe0: 69 65 73 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65 ies] {.. fore 4ff0: 61 63 68 20 63 68 69 6c 64 20 24 63 68 69 6c 64 ach child $child 5000: 72 65 6e 20 7b 0a 09 09 73 65 74 20 64 6b 65 79 ren {...set dkey 5010: 20 20 20 20 5b 6c 69 73 74 20 24 72 69 64 20 24 [list $rid $ 5020: 63 68 69 6c 64 5d 0a 09 09 73 65 74 20 73 74 61 child]...set sta 5030: 72 74 20 20 20 24 70 6f 73 28 24 72 69 64 29 0a rt $pos($rid). 5040: 09 09 73 65 74 20 65 6e 64 20 20 20 20 20 24 70 ..set end $p 5050: 6f 73 28 24 63 68 69 6c 64 29 0a 09 09 73 65 74 os($child)...set 5060: 20 63 72 6f 73 73 65 73 20 7b 7d 0a 0a 09 09 69 crosses {}....i 5070: 66 20 7b 24 73 74 61 72 74 20 3e 20 24 65 6e 64 f {$start > $end 5080: 7d 20 7b 0a 09 09 20 20 20 20 77 68 69 6c 65 20 } {... while 5090: 7b 24 65 6e 64 20 3c 20 24 73 74 61 72 74 7d 20 {$end < $start} 50a0: 7b 0a 09 09 09 6c 61 70 70 65 6e 64 20 63 72 6f {....lappend cro 50b0: 73 73 65 73 20 24 65 6e 64 0a 09 09 09 69 6e 63 sses $end....inc 50c0: 72 20 63 72 6f 73 73 28 24 65 6e 64 29 0a 09 09 r cross($end)... 50d0: 09 69 6e 63 72 20 65 6e 64 0a 09 09 20 20 20 20 .incr end... 50e0: 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 }...} else {... 50f0: 20 20 20 77 68 69 6c 65 20 7b 24 73 74 61 72 74 while {$start 5100: 20 3c 20 24 65 6e 64 7d 20 7b 0a 09 09 09 6c 61 < $end} {....la 5110: 70 70 65 6e 64 20 63 72 6f 73 73 65 73 20 24 73 ppend crosses $s 5120: 74 61 72 74 0a 09 09 09 69 6e 63 72 20 63 72 6f tart....incr cro 5130: 73 73 28 24 73 74 61 72 74 29 0a 09 09 09 69 6e ss($start)....in 5140: 63 72 20 73 74 61 72 74 0a 09 09 20 20 20 20 7d cr start... } 5150: 0a 09 09 7d 0a 09 09 73 65 74 20 64 65 70 63 28 ...}...set depc( 5160: 24 64 6b 65 79 29 20 24 63 72 6f 73 73 65 73 0a $dkey) $crosses. 5170: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 49 6e 69 74 . }..}...Init 5180: 69 61 6c 69 7a 65 44 65 6c 74 61 73 20 24 72 65 ializeDeltas $re 5190: 76 69 73 69 6f 6e 73 0a 09 72 65 74 75 72 6e 0a visions..return. 51a0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 }.. proc 51b0: 49 6e 69 74 69 61 6c 69 7a 65 44 65 6c 74 61 73 InitializeDeltas 51c0: 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 {revisions} {.. 51d0: 75 70 76 61 72 20 31 20 64 65 6c 74 61 20 64 65 upvar 1 delta de 51e0: 6c 74 61 0a 0a 09 23 20 50 75 6c 6c 20 74 68 65 lta...# Pull the 51f0: 20 74 69 6d 65 73 74 61 6d 70 73 20 66 6f 72 20 timestamps for 5200: 61 6c 6c 20 72 65 76 69 73 69 6f 6e 73 20 69 6e all revisions in 5210: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 73 20 the changesets 5220: 61 6e 64 0a 09 23 20 63 6f 6d 70 75 74 65 20 74 and..# compute t 5230: 68 65 69 72 20 64 65 6c 74 61 73 20 66 6f 72 20 heir deltas for 5240: 75 73 65 20 62 79 20 74 68 65 20 62 72 65 61 6b use by the break 5250: 20 66 69 6e 64 65 72 2e 0a 0a 09 61 72 72 61 79 finder....array 5260: 20 73 65 74 20 64 65 6c 74 61 20 7b 7d 0a 09 61 set delta {}..a 5270: 72 72 61 79 20 73 65 74 20 73 74 61 6d 70 20 7b rray set stamp { 5280: 7d 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 }...set theset ( 5290: 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e '[join $revision 52a0: 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66 6f 72 65 s {','}]')..fore 52b0: 61 63 68 20 7b 72 69 64 20 74 69 6d 65 7d 20 5b ach {rid time} [ 52c0: 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 state run ".. 52d0: 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 SELECT R.rid, R 52e0: 2e 64 61 74 65 0a 09 20 20 20 20 46 52 4f 4d 20 .date.. FROM 52f0: 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 revision R.. 5300: 57 48 45 52 45 20 52 2e 72 69 64 20 49 4e 20 24 WHERE R.rid IN $ 5310: 74 68 65 73 65 74 0a 09 22 5d 20 7b 0a 09 20 20 theset.."] {.. 5320: 20 20 73 65 74 20 73 74 61 6d 70 28 24 72 69 64 set stamp($rid 5330: 29 20 24 74 69 6d 65 0a 09 7d 0a 0a 09 73 65 74 ) $time..}...set 5340: 20 6e 20 30 0a 09 66 6f 72 65 61 63 68 20 72 69 n 0..foreach ri 5350: 64 20 5b 6c 72 61 6e 67 65 20 24 72 65 76 69 73 d [lrange $revis 5360: 69 6f 6e 73 20 30 20 65 6e 64 2d 31 5d 20 72 6e ions 0 end-1] rn 5370: 65 78 74 20 5b 6c 72 61 6e 67 65 20 24 72 65 76 ext [lrange $rev 5380: 69 73 69 6f 6e 73 20 31 20 65 6e 64 5d 20 7b 0a isions 1 end] {. 5390: 09 20 20 20 20 73 65 74 20 64 65 6c 74 61 28 24 . set delta($ 53a0: 6e 29 20 5b 65 78 70 72 20 7b 24 73 74 61 6d 70 n) [expr {$stamp 53b0: 28 24 72 6e 65 78 74 29 20 2d 20 24 73 74 61 6d ($rnext) - $stam 53c0: 70 28 24 72 69 64 29 7d 5d 0a 09 20 20 20 20 69 p($rid)}].. i 53d0: 6e 63 72 20 6e 0a 09 7d 0a 09 72 65 74 75 72 6e ncr n..}..return 53e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 . }.. proc 53f0: 20 46 69 6e 64 42 65 73 74 42 72 65 61 6b 20 7b FindBestBreak { 5400: 72 61 6e 67 65 7d 20 7b 0a 09 75 70 76 61 72 20 range} {..upvar 5410: 31 20 63 72 6f 73 73 20 63 72 6f 73 73 20 64 65 1 cross cross de 5420: 6c 74 61 20 64 65 6c 74 61 0a 0a 09 23 20 44 65 lta delta...# De 5430: 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 termine the best 5440: 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 break location 5450: 69 6e 20 74 68 65 20 67 69 76 65 6e 20 72 61 6e in the given ran 5460: 67 65 20 6f 66 0a 09 23 20 70 6f 73 69 74 69 6f ge of..# positio 5470: 6e 73 2e 20 46 69 72 73 74 20 77 65 20 6c 6f 6f ns. First we loo 5480: 6b 20 66 6f 72 20 74 68 65 20 6c 6f 63 61 74 69 k for the locati 5490: 6f 6e 73 20 77 69 74 68 20 74 68 65 20 6d 61 78 ons with the max 54a0: 69 6d 61 6c 0a 09 23 20 6e 75 6d 62 65 72 20 6f imal..# number o 54b0: 66 20 63 72 6f 73 73 69 6e 67 73 2e 20 49 66 20 f crossings. If 54c0: 74 68 65 72 65 20 61 72 65 20 73 65 76 65 72 61 there are severa 54d0: 6c 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 68 l we look for th 54e0: 65 0a 09 23 20 73 68 6f 72 74 65 73 74 20 74 69 e..# shortest ti 54f0: 6d 65 20 69 6e 74 65 72 76 61 6c 20 61 6d 6f 6e me interval amon 5500: 67 20 74 68 65 6d 2e 20 49 66 20 77 65 20 73 74 g them. If we st 5510: 69 6c 6c 20 68 61 76 65 20 6d 75 6c 74 69 70 6c ill have multipl 5520: 65 0a 09 23 20 70 6f 73 73 69 62 69 6c 69 74 69 e..# possibiliti 5530: 65 73 20 61 66 74 65 72 20 74 68 61 74 20 77 65 es after that we 5540: 20 73 65 6c 65 63 74 20 74 68 65 20 65 61 72 6c select the earl 5550: 69 65 73 74 20 6c 6f 63 61 74 69 6f 6e 0a 09 23 iest location..# 5560: 20 61 6d 6f 6e 67 20 74 68 65 73 65 2e 0a 0a 09 among these.... 5570: 23 20 4e 6f 74 65 3a 20 49 66 20 74 68 65 20 6d # Note: If the m 5580: 61 78 69 6d 61 6c 20 6e 75 6d 62 65 72 20 6f 66 aximal number of 5590: 20 63 72 6f 73 73 69 6e 67 73 20 69 73 20 30 20 crossings is 0 55a0: 74 68 65 6e 20 74 68 65 20 72 61 6e 67 65 0a 09 then the range.. 55b0: 23 20 20 20 20 20 20 20 68 61 73 20 6e 6f 20 69 # has no i 55c0: 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e nternal dependen 55d0: 63 69 65 73 2c 20 61 6e 64 20 6e 6f 20 62 72 65 cies, and no bre 55e0: 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 61 74 0a 09 ak location at.. 55f0: 23 20 20 20 20 20 20 20 61 6c 6c 2e 20 54 68 69 # all. Thi 5600: 73 20 70 6f 73 73 69 62 69 6c 69 74 79 20 69 73 s possibility is 5610: 20 73 69 67 6e 61 6c 65 64 20 76 69 61 20 72 65 signaled via re 5620: 73 75 6c 74 20 2d 31 2e 0a 0a 09 23 20 4e 6f 74 sult -1....# Not 5630: 65 3a 20 41 20 72 61 6e 67 65 20 6f 66 20 6c 65 e: A range of le 5640: 6e 67 74 68 20 31 20 6f 72 20 6c 65 73 73 20 63 ngth 1 or less c 5650: 61 6e 6e 6f 74 20 68 61 76 65 20 69 6e 74 65 72 annot have inter 5660: 6e 61 6c 0a 09 23 20 20 20 20 20 20 20 64 65 70 nal..# dep 5670: 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 20 74 68 endencies, as th 5680: 61 74 20 6e 65 65 64 73 20 61 74 20 6c 65 61 73 at needs at leas 5690: 74 20 74 77 6f 20 72 65 76 69 73 69 6f 6e 73 20 t two revisions 56a0: 69 6e 0a 09 23 20 20 20 20 20 20 20 74 68 65 20 in..# the 56b0: 72 61 6e 67 65 2e 0a 0a 09 69 66 20 7b 5b 6c 6c range....if {[ll 56c0: 65 6e 67 74 68 20 24 72 61 6e 67 65 5d 20 3c 20 ength $range] < 56d0: 32 7d 20 7b 20 72 65 74 75 72 6e 20 2d 31 20 7d 2} { return -1 } 56e0: 0a 0a 09 73 65 74 20 6d 61 78 20 2d 31 0a 09 73 ...set max -1..s 56f0: 65 74 20 62 65 73 74 20 7b 7d 0a 0a 09 66 6f 72 et best {}...for 5700: 65 61 63 68 20 6c 6f 63 61 74 69 6f 6e 20 24 72 each location $r 5710: 61 6e 67 65 20 7b 0a 09 20 20 20 20 73 65 74 20 ange {.. set 5720: 63 72 6f 73 73 69 6e 67 73 20 24 63 72 6f 73 73 crossings $cross 5730: 28 24 6c 6f 63 61 74 69 6f 6e 29 0a 09 20 20 20 ($location).. 5740: 20 69 66 20 7b 24 63 72 6f 73 73 69 6e 67 73 20 if {$crossings 5750: 3e 20 24 6d 61 78 7d 20 7b 0a 09 09 73 65 74 20 > $max} {...set 5760: 6d 61 78 20 20 24 63 72 6f 73 73 69 6e 67 73 0a max $crossings. 5770: 09 09 73 65 74 20 62 65 73 74 20 5b 6c 69 73 74 ..set best [list 5780: 20 24 6c 6f 63 61 74 69 6f 6e 5d 0a 09 09 63 6f $location]...co 5790: 6e 74 69 6e 75 65 0a 09 20 20 20 20 7d 20 65 6c ntinue.. } el 57a0: 73 65 69 66 20 7b 24 63 72 6f 73 73 69 6e 67 73 seif {$crossings 57b0: 20 3d 3d 20 24 6d 61 78 7d 20 7b 0a 09 09 6c 61 == $max} {...la 57c0: 70 70 65 6e 64 20 62 65 73 74 20 24 6c 6f 63 61 ppend best $loca 57d0: 74 69 6f 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a tion.. }..}.. 57e0: 09 69 66 20 7b 24 6d 61 78 20 3d 3d 20 30 7d 20 .if {$max == 0} 57f0: 20 20 20 20 20 20 20 20 20 20 20 7b 20 72 65 74 { ret 5800: 75 72 6e 20 2d 31 20 7d 0a 09 69 66 20 7b 5b 6c urn -1 }..if {[l 5810: 6c 65 6e 67 74 68 20 24 62 65 73 74 5d 20 3d 3d length $best] == 5820: 20 31 7d 20 7b 20 72 65 74 75 72 6e 20 5b 6c 69 1} { return [li 5830: 6e 64 65 78 20 24 62 65 73 74 20 30 5d 20 7d 0a ndex $best 0] }. 5840: 0a 09 73 65 74 20 6c 6f 63 61 74 69 6f 6e 73 20 ..set locations 5850: 24 62 65 73 74 0a 09 73 65 74 20 62 65 73 74 20 $best..set best 5860: 7b 7d 0a 09 73 65 74 20 6d 69 6e 20 2d 31 0a 0a {}..set min -1.. 5870: 09 66 6f 72 65 61 63 68 20 6c 6f 63 61 74 69 6f .foreach locatio 5880: 6e 20 24 6c 6f 63 61 74 69 6f 6e 73 20 7b 0a 09 n $locations {.. 5890: 20 20 20 20 73 65 74 20 69 6e 74 65 72 76 61 6c set interval 58a0: 20 24 64 65 6c 74 61 28 24 6c 6f 63 61 74 69 6f $delta($locatio 58b0: 6e 29 0a 09 20 20 20 20 69 66 20 7b 28 24 6d 69 n).. if {($mi 58c0: 6e 20 3c 20 30 29 20 7c 7c 20 28 24 69 6e 74 65 n < 0) || ($inte 58d0: 72 76 61 6c 20 3c 20 24 6d 69 6e 29 7d 20 7b 0a rval < $min)} {. 58e0: 09 09 73 65 74 20 6d 69 6e 20 20 24 69 6e 74 65 ..set min $inte 58f0: 72 76 61 6c 0a 09 09 73 65 74 20 62 65 73 74 20 rval...set best 5900: 5b 6c 69 73 74 20 24 6c 6f 63 61 74 69 6f 6e 5d [list $location] 5910: 0a 09 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b .. } elseif { 5920: 24 69 6e 74 65 72 76 61 6c 20 3d 3d 20 24 6d 69 $interval == $mi 5930: 6e 7d 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 62 n} {...lappend b 5940: 65 73 74 20 24 6c 6f 63 61 74 69 6f 6e 0a 09 20 est $location.. 5950: 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b 5b 6c }..}...if {[l 5960: 6c 65 6e 67 74 68 20 24 62 65 73 74 5d 20 3d 3d length $best] == 5970: 20 31 7d 20 7b 20 72 65 74 75 72 6e 20 5b 6c 69 1} { return [li 5980: 6e 64 65 78 20 24 62 65 73 74 20 30 5d 20 7d 0a ndex $best 0] }. 5990: 0a 09 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78 ..return [lindex 59a0: 20 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65 72 [lsort -integer 59b0: 20 2d 69 6e 63 72 65 61 73 69 6e 67 20 24 62 65 -increasing $be 59c0: 73 74 5d 20 30 5d 0a 20 20 20 20 7d 0a 0a 20 20 st] 0]. }.. 59d0: 20 20 70 72 6f 63 20 43 75 74 41 74 20 7b 6c 6f proc CutAt {lo 59e0: 63 61 74 69 6f 6e 7d 20 7b 0a 09 75 70 76 61 72 cation} {..upvar 59f0: 20 31 20 63 72 6f 73 73 20 63 72 6f 73 73 20 64 1 cross cross d 5a00: 65 70 63 20 64 65 70 63 0a 0a 09 23 20 49 74 20 epc depc...# It 5a10: 77 61 73 20 64 65 63 69 64 65 64 20 74 6f 20 73 was decided to s 5a20: 70 6c 69 74 20 74 68 65 20 63 68 61 6e 67 65 73 plit the changes 5a30: 65 74 20 61 74 20 74 68 65 20 67 69 76 65 6e 0a et at the given. 5a40: 09 23 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 69 .# location. Thi 5a50: 73 20 63 75 74 73 20 61 20 6e 75 6d 62 65 72 20 s cuts a number 5a60: 6f 66 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e of dependencies. 5a70: 20 48 65 72 65 20 77 65 20 75 70 64 61 74 65 0a Here we update. 5a80: 09 23 20 74 68 65 20 63 72 6f 73 73 20 69 6e 66 .# the cross inf 5a90: 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 ormation so that 5aa0: 20 74 68 65 20 62 72 65 61 6b 20 66 69 6e 64 65 the break finde 5ab0: 72 20 68 61 73 20 61 63 63 75 72 61 74 65 0a 09 r has accurate.. 5ac0: 23 20 64 61 74 61 20 77 68 65 6e 20 77 65 20 6c # data when we l 5ad0: 6f 6f 6b 20 61 74 20 74 68 65 20 67 65 6e 65 72 ook at the gener 5ae0: 61 74 65 64 20 66 72 61 67 6d 65 6e 74 73 2e 0a ated fragments.. 5af0: 0a 09 73 65 74 20 73 69 78 20 5b 6c 6f 67 20 76 ..set six [log v 5b00: 69 73 69 62 6c 65 3f 20 36 5d 0a 0a 09 66 6f 72 isible? 6]...for 5b10: 65 61 63 68 20 7b 64 65 70 20 72 61 6e 67 65 7d each {dep range} 5b20: 20 5b 61 72 72 61 79 20 67 65 74 20 64 65 70 63 [array get depc 5b30: 5d 20 7b 0a 09 20 20 20 20 23 20 43 68 65 63 6b ] {.. # Check 5b40: 20 61 6c 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 all dependencie 5b50: 73 20 73 74 69 6c 6c 20 6b 6e 6f 77 6e 2c 20 74 s still known, t 5b60: 61 6b 65 20 74 68 65 69 72 20 72 61 6e 67 65 20 ake their range 5b70: 61 6e 64 0a 09 20 20 20 20 23 20 73 65 65 20 69 and.. # see i 5b80: 66 20 74 68 65 20 62 72 65 61 6b 20 6c 6f 63 61 f the break loca 5b90: 74 69 6f 6e 20 66 61 6c 6c 73 20 77 69 74 68 69 tion falls withi 5ba0: 6e 2e 0a 0a 09 20 20 20 20 42 6f 72 64 65 72 20 n.... Border 5bb0: 24 72 61 6e 67 65 20 73 20 65 0a 09 20 20 20 20 $range s e.. 5bc0: 69 66 20 7b 24 6c 6f 63 61 74 69 6f 6e 20 3c 20 if {$location < 5bd0: 24 73 7d 20 63 6f 6e 74 69 6e 75 65 20 3b 20 23 $s} continue ; # 5be0: 20 62 72 65 61 6b 20 62 65 66 6f 72 65 20 72 61 break before ra 5bf0: 6e 67 65 2c 20 69 67 6e 6f 72 65 0a 09 20 20 20 nge, ignore.. 5c00: 20 69 66 20 7b 24 6c 6f 63 61 74 69 6f 6e 20 3e if {$location > 5c10: 20 24 65 7d 20 63 6f 6e 74 69 6e 75 65 20 3b 20 $e} continue ; 5c20: 23 20 62 72 65 61 6b 20 61 66 74 65 72 20 72 61 # break after ra 5c30: 6e 67 65 2c 20 69 67 6e 6f 72 65 2e 0a 0a 09 20 nge, ignore.... 5c40: 20 20 20 23 20 54 68 69 73 20 64 65 70 65 6e 64 # This depend 5c50: 65 6e 63 79 20 63 72 6f 73 73 65 73 20 74 68 65 ency crosses the 5c60: 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 2e break location. 5c70: 20 57 65 20 72 65 6d 6f 76 65 20 69 74 0a 09 20 We remove it.. 5c80: 20 20 20 23 20 66 72 6f 6d 20 74 68 65 20 63 72 # from the cr 5c90: 6f 73 73 69 6e 67 73 20 63 6f 75 6e 74 65 72 73 ossings counters 5ca0: 2c 20 61 6e 64 20 74 68 65 6e 20 61 6c 73 6f 20 , and then also 5cb0: 66 72 6f 6d 20 74 68 65 20 73 65 74 0a 09 20 20 from the set.. 5cc0: 20 20 23 20 6f 66 20 6b 6e 6f 77 6e 20 64 65 70 # of known dep 5cd0: 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 20 77 65 endencies, as we 5ce0: 20 61 72 65 20 64 6f 6e 65 20 77 69 74 68 20 69 are done with i 5cf0: 74 2e 0a 0a 09 20 20 20 20 66 6f 72 65 61 63 68 t.... foreach 5d00: 20 6c 6f 63 20 24 64 65 70 63 28 24 64 65 70 29 loc $depc($dep) 5d10: 20 7b 20 69 6e 63 72 20 63 72 6f 73 73 28 24 6c { incr cross($l 5d20: 6f 63 29 20 2d 31 20 7d 0a 09 20 20 20 20 75 6e oc) -1 }.. un 5d30: 73 65 74 20 64 65 70 63 28 24 64 65 70 29 0a 0a set depc($dep).. 5d40: 09 20 20 20 20 69 66 20 7b 21 24 73 69 78 7d 20 . if {!$six} 5d50: 63 6f 6e 74 69 6e 75 65 0a 0a 09 20 20 20 20 73 continue... s 5d60: 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 truct::list assi 5d70: 67 6e 20 24 64 65 70 20 70 61 72 65 6e 74 20 63 gn $dep parent c 5d80: 68 69 6c 64 0a 09 20 20 20 20 6c 6f 67 20 77 72 hild.. log wr 5d90: 69 74 65 20 35 20 63 73 65 74 73 20 22 42 72 6f ite 5 csets "Bro 5da0: 6b 65 20 64 65 70 65 6e 64 65 6e 63 79 20 5b 50 ke dependency [P 5db0: 44 20 24 70 61 72 65 6e 74 5d 20 2d 2d 3e 20 5b D $parent] --> [ 5dc0: 50 44 20 24 63 68 69 6c 64 5d 22 0a 09 7d 0a 0a PD $child]"..}.. 5dd0: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 .return. }.. 5de0: 20 20 20 23 20 50 72 69 6e 74 20 69 64 65 6e 74 # Print ident 5df0: 69 66 79 69 6e 67 20 64 61 74 61 20 66 6f 72 20 ifying data for 5e00: 61 20 72 65 76 69 73 69 6f 6e 20 28 70 72 6f 6a a revision (proj 5e10: 65 63 74 2c 20 66 69 6c 65 2c 20 64 6f 74 74 65 ect, file, dotte 5e20: 64 20 72 65 76 0a 20 20 20 20 23 20 6e 75 6d 62 d rev. # numb 5e30: 65 72 29 2c 20 66 6f 72 20 68 69 67 68 20 76 65 er), for high ve 5e40: 72 62 6f 73 69 74 79 20 6c 6f 67 20 6f 75 74 70 rbosity log outp 5e50: 75 74 2e 0a 20 20 20 20 23 20 54 4f 44 4f 3a 20 ut.. # TODO: 5e60: 52 65 70 6c 61 63 65 20 77 69 74 68 20 63 61 6c Replace with cal 5e70: 6c 20 74 6f 20 69 74 65 6d 73 74 72 20 28 6c 69 l to itemstr (li 5e80: 73 74 20 72 65 76 20 24 69 64 29 0a 0a 20 20 20 st rev $id).. 5e90: 20 70 72 6f 63 20 50 44 20 7b 69 64 7d 20 7b 0a proc PD {id} {. 5ea0: 09 66 6f 72 65 61 63 68 20 7b 70 20 66 20 72 7d .foreach {p f r} 5eb0: 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 [state run {... 5ec0: 53 45 4c 45 43 54 20 50 2e 6e 61 6d 65 20 2c 20 SELECT P.name , 5ed0: 46 2e 6e 61 6d 65 2c 20 52 2e 72 65 76 0a 09 09 F.name, R.rev... 5ee0: 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c FROM revision R, 5ef0: 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65 63 74 file F, project 5f00: 20 50 0a 09 09 57 48 45 52 45 20 52 2e 72 69 64 P...WHERE R.rid 5f10: 20 3d 20 24 69 64 0a 09 09 41 4e 44 20 20 20 46 = $id...AND F 5f20: 2e 66 69 64 20 3d 20 52 2e 66 69 64 0a 09 09 41 .fid = R.fid...A 5f30: 4e 44 20 20 20 50 2e 70 69 64 20 3d 20 46 2e 70 ND P.pid = F.p 5f40: 69 64 0a 09 7d 5d 20 62 72 65 61 6b 0a 09 72 65 id..}] break..re 5f50: 74 75 72 6e 20 22 27 24 70 20 3a 20 24 66 2f 24 turn "'$p : $f/$ 5f60: 72 27 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 r'". }.. # 5f70: 20 50 72 69 6e 74 69 6e 67 20 6f 6e 65 20 6f 72 Printing one or 5f80: 20 6d 6f 72 65 20 72 61 6e 67 65 73 2c 20 66 6f more ranges, fo 5f90: 72 6d 61 74 74 65 64 2c 20 61 6e 64 20 6f 6e 6c rmatted, and onl 5fa0: 79 20 74 68 65 69 72 20 62 6f 72 64 65 72 20 74 y their border t 5fb0: 6f 0a 20 20 20 20 23 20 6b 65 65 70 20 74 68 65 o. # keep the 5fc0: 20 73 74 72 69 6e 67 73 20 73 68 6f 72 74 2e 0a strings short.. 5fd0: 0a 20 20 20 20 70 72 6f 63 20 50 52 73 20 7b 72 . proc PRs {r 5fe0: 61 6e 67 65 73 7d 20 7b 0a 09 72 65 74 75 72 6e anges} {..return 5ff0: 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d [struct::list m 6000: 61 70 20 24 72 61 6e 67 65 73 20 5b 6d 79 70 72 ap $ranges [mypr 6010: 6f 63 20 50 52 5d 5d 0a 20 20 20 20 7d 0a 0a 20 oc PR]]. }.. 6020: 20 20 20 70 72 6f 63 20 50 52 20 7b 72 61 6e 67 proc PR {rang 6030: 65 7d 20 7b 0a 09 42 6f 72 64 65 72 20 24 72 61 e} {..Border $ra 6040: 6e 67 65 20 73 20 65 0a 09 72 65 74 75 72 6e 20 nge s e..return 6050: 3c 24 7b 73 7d 2e 2e 2e 24 7b 65 7d 3e 0a 20 20 <${s}...${e}>. 6060: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 42 6f }.. proc Bo 6070: 72 64 65 72 20 7b 72 61 6e 67 65 20 73 76 20 65 rder {range sv e 6080: 76 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 73 v} {..upvar 1 $s 6090: 76 20 73 20 24 65 76 20 65 0a 09 73 65 74 20 73 v s $ev e..set s 60a0: 20 5b 6c 69 6e 64 65 78 20 24 72 61 6e 67 65 20 [lindex $range 60b0: 30 5d 0a 09 73 65 74 20 65 20 5b 6c 69 6e 64 65 0]..set e [linde 60c0: 78 20 24 72 61 6e 67 65 20 65 6e 64 5d 0a 09 72 x $range end]..r 60d0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 eturn. }.. 60e0: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 # # ## ### #### 60f0: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 # ######## ##### 6100: 23 23 23 23 23 23 23 23 0a 0a 20 20 20 20 74 79 ########.. ty 6110: 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 68 61 pevariable mycha 6120: 6e 67 65 73 65 74 73 20 20 20 20 20 20 20 20 20 ngesets 6130: 7b 7d 20 3b 20 23 20 4c 69 73 74 20 6f 66 20 61 {} ; # List of a 6140: 6c 6c 20 6b 6e 6f 77 6e 0a 09 09 09 09 09 20 20 ll known...... 6150: 20 23 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 20 # changesets.. 6160: 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 typevariable 6170: 6d 79 74 63 68 61 6e 67 65 73 65 74 73 20 2d 61 mytchangesets -a 6180: 72 72 61 79 20 7b 7d 20 3b 20 23 20 4c 69 73 74 rray {} ; # List 6190: 20 6f 66 20 61 6c 6c 20 6b 6e 6f 77 6e 0a 09 09 of all known... 61a0: 09 09 09 20 20 20 23 20 63 68 61 6e 67 65 73 65 ... # changese 61b0: 74 73 20 6f 66 20 61 20 74 79 70 65 2e 0a 20 20 ts of a type.. 61c0: 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d typevariable m 61d0: 79 69 74 65 6d 6d 61 70 20 20 20 20 20 2d 61 72 yitemmap -ar 61e0: 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 66 ray {} ; # Map f 61f0: 72 6f 6d 20 69 74 65 6d 73 20 28 74 61 67 67 65 rom items (tagge 6200: 64 29 0a 09 09 09 09 09 20 20 20 23 20 74 6f 20 d)...... # to 6210: 74 68 65 20 6c 69 73 74 20 6f 66 20 63 68 61 6e the list of chan 6220: 67 65 73 65 74 73 0a 09 09 09 09 09 20 20 20 23 gesets...... # 6230: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 69 74 2e 20 containing it. 6240: 45 61 63 68 20 69 74 65 6d 0a 09 09 09 09 09 20 Each item...... 6250: 20 20 23 20 63 61 6e 20 62 65 20 75 73 65 64 20 # can be used 6260: 62 79 20 6f 6e 6c 79 20 6f 6e 65 0a 09 09 09 09 by only one..... 6270: 09 20 20 20 23 20 63 68 61 6e 67 65 73 65 74 2e . # changeset. 6280: 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c . typevariabl 6290: 65 20 6d 79 69 64 6d 61 70 20 20 20 2d 61 72 72 e myidmap -arr 62a0: 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 66 72 ay {} ; # Map fr 62b0: 6f 6d 20 63 68 61 6e 67 65 73 65 74 20 69 64 20 om changeset id 62c0: 74 6f 0a 09 09 09 09 20 20 20 20 20 20 20 23 20 to..... # 62d0: 63 68 61 6e 67 65 73 65 74 2e 0a 0a 20 20 20 20 changeset... 62e0: 74 79 70 65 6d 65 74 68 6f 64 20 61 6c 6c 20 20 typemethod all 62f0: 20 20 7b 7d 20 20 20 20 7b 20 72 65 74 75 72 6e {} { return 6300: 20 24 6d 79 63 68 61 6e 67 65 73 65 74 73 20 7d $mychangesets } 6310: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 . typemethod 6320: 6f 66 20 20 20 20 20 7b 63 69 64 7d 20 7b 20 72 of {cid} { r 6330: 65 74 75 72 6e 20 24 6d 79 69 64 6d 61 70 28 24 eturn $myidmap($ 6340: 63 69 64 29 20 7d 0a 20 20 20 20 74 79 70 65 6d cid) }. typem 6350: 65 74 68 6f 64 20 6f 66 69 74 65 6d 20 7b 69 69 ethod ofitem {ii 6360: 64 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 d} { return $myi 6370: 74 65 6d 6d 61 70 28 24 69 69 64 29 20 7d 0a 0a temmap($iid) }.. 6380: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 72 typemethod r 6390: 65 76 20 20 20 20 7b 7d 20 20 20 20 7b 20 72 65 ev {} { re 63a0: 74 75 72 6e 20 24 6d 79 74 63 68 61 6e 67 65 73 turn $mytchanges 63b0: 65 74 73 28 72 65 76 29 20 7d 0a 20 20 20 20 74 ets(rev) }. t 63c0: 79 70 65 6d 65 74 68 6f 64 20 73 79 6d 20 20 20 ypemethod sym 63d0: 20 7b 7d 20 20 20 20 7b 20 72 65 74 75 72 6e 20 {} { return 63e0: 5b 63 6f 6e 63 61 74 20 5c 0a 09 09 09 09 09 20 [concat \...... 63f0: 20 24 7b 6d 79 74 63 68 61 6e 67 65 73 65 74 73 ${mytchangesets 6400: 28 73 79 6d 3a 3a 62 72 61 6e 63 68 29 7d 20 5c (sym::branch)} \ 6410: 0a 09 09 09 09 09 20 20 24 7b 6d 79 74 63 68 61 ...... ${mytcha 6420: 6e 67 65 73 65 74 73 28 73 79 6d 3a 3a 74 61 67 ngesets(sym::tag 6430: 29 7d 5d 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 )}] }.. # # # 6440: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 # ### ##### #### 6450: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 #### ########### 6460: 23 23 0a 20 20 20 20 23 23 20 43 6f 6e 66 69 67 ##. ## Config 6470: 75 72 61 74 69 6f 6e 0a 0a 20 20 20 20 70 72 61 uration.. pra 6480: 67 6d 61 20 2d 68 61 73 74 79 70 65 69 6e 66 6f gma -hastypeinfo 6490: 20 20 20 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 74 no ; # no t 64a0: 79 70 65 20 69 6e 74 72 6f 73 70 65 63 74 69 6f ype introspectio 64b0: 6e 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 n. pragma -ha 64c0: 73 69 6e 66 6f 20 20 20 20 20 20 20 20 6e 6f 20 sinfo no 64d0: 20 3b 20 23 20 6e 6f 20 6f 62 6a 65 63 74 20 69 ; # no object i 64e0: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 0a 20 20 ntrospection.. 64f0: 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 # # ## ### ### 6500: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 ## ######## #### 6510: 23 23 23 23 23 23 23 23 23 0a 7d 0a 0a 23 23 0a #########.}..##. 6520: 23 23 20 4e 4f 54 45 3a 20 54 68 65 20 73 75 63 ## NOTE: The suc 6530: 63 65 73 73 6f 72 20 61 6e 64 20 70 72 65 64 65 cessor and prede 6540: 63 65 73 73 6f 72 20 6d 65 74 68 6f 64 73 20 64 cessor methods d 6550: 65 66 69 6e 65 64 20 62 79 20 74 68 65 20 63 6c efined by the cl 6560: 61 73 73 65 73 0a 23 23 20 20 20 20 20 20 20 62 asses.## b 6570: 65 6c 6f 77 20 61 72 65 20 2d 2d 20 62 6f 74 74 elow are -- bott 6580: 6c 65 20 6e 65 63 6b 73 20 2d 2d 2e 20 4c 6f 6f le necks --. Loo 6590: 6b 20 66 6f 72 20 77 61 79 73 20 74 6f 20 6d 61 k for ways to ma 65a0: 6b 65 20 74 68 65 20 53 51 4c 0a 23 23 20 20 20 ke the SQL.## 65b0: 20 20 20 20 66 61 73 74 65 72 2e 0a 23 23 0a 0a faster..##.. 65c0: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 # # ## ### ##### 65d0: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 ######## ###### 65e0: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 ####### ######## 65f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 #############.## 6600: 20 48 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f Helper singleto 6610: 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 n. Commands for 6620: 72 65 76 69 73 69 6f 6e 20 63 68 61 6e 67 65 73 revision changes 6630: 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 ets...snit::type 6640: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 ::vc::fossil::i 6650: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a mport::cvs::proj 6660: 65 63 74 3a 3a 72 65 76 3a 3a 72 65 76 20 7b 0a ect::rev::rev {. 6670: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62 typemethod b 6680: 79 72 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 yrevision {} { r 6690: 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 79 eturn 1 }. ty 66a0: 70 65 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 6f pemethod bysymbo 66b0: 6c 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 l {} { return 66c0: 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 0 }. typemeth 66d0: 6f 64 20 69 73 74 61 67 20 20 20 20 20 20 7b 7d od istag {} 66e0: 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20 { return 0 }. 66f0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73 62 typemethod isb 6700: 72 61 6e 63 68 20 20 20 7b 7d 20 7b 20 72 65 74 ranch {} { ret 6710: 75 72 6e 20 30 20 7d 0a 0a 20 20 20 20 74 79 70 urn 0 }.. typ 6720: 65 6d 65 74 68 6f 64 20 73 74 72 20 7b 72 65 76 emethod str {rev 6730: 69 73 69 6f 6e 7d 20 7b 0a 09 73 74 72 75 63 74 ision} {..struct 6740: 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b 73 ::list assign [s 6750: 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 tate run {.. 6760: 53 45 4c 45 43 54 20 52 2e 72 65 76 2c 20 46 2e SELECT R.rev, F. 6770: 6e 61 6d 65 2c 20 50 2e 6e 61 6d 65 0a 09 20 20 name, P.name.. 6780: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f FROM revisio 6790: 6e 20 52 2c 20 66 69 6c 65 20 46 2c 20 70 72 6f n R, file F, pro 67a0: 6a 65 63 74 20 50 0a 09 20 20 20 20 57 48 45 52 ject P.. WHER 67b0: 45 20 20 52 2e 72 69 64 20 3d 20 24 72 65 76 69 E R.rid = $revi 67c0: 73 69 6f 6e 0a 09 20 20 20 20 41 4e 44 20 20 20 sion.. AND 67d0: 20 46 2e 66 69 64 20 3d 20 52 2e 66 69 64 0a 09 F.fid = R.fid.. 67e0: 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69 64 AND P.pid 67f0: 20 3d 20 46 2e 70 69 64 0a 09 7d 5d 20 72 65 76 = F.pid..}] rev 6800: 6e 72 20 66 6e 61 6d 65 20 70 6e 61 6d 65 0a 09 nr fname pname.. 6810: 72 65 74 75 72 6e 20 22 24 70 6e 61 6d 65 2f 24 return "$pname/$ 6820: 7b 72 65 76 6e 72 7d 3a 3a 24 66 6e 61 6d 65 22 {revnr}::$fname" 6830: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 . }.. # re 6840: 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69 6e sult = list (min 6850: 74 69 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a 20 time, maxtime). 6860: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 74 69 typemethod ti 6870: 6d 65 72 61 6e 67 65 20 7b 69 74 65 6d 73 7d 20 merange {items} 6880: 7b 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 {..set theset (' 6890: 5b 6a 6f 69 6e 20 24 69 74 65 6d 73 20 7b 27 2c [join $items {', 68a0: 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 '}]')..return [s 68b0: 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 tate run ".. 68c0: 53 45 4c 45 43 54 20 4d 49 4e 28 52 2e 64 61 74 SELECT MIN(R.dat 68d0: 65 29 2c 20 4d 41 58 28 52 2e 64 61 74 65 29 0a e), MAX(R.date). 68e0: 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 . FROM revisi 68f0: 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 on R.. WHERE 6900: 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 R.rid IN $theset 6910: 0a 09 22 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 .."]. }.. 6920: 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 # var(dv) = dict 6930: 20 28 72 65 76 69 73 69 6f 6e 20 2d 3e 20 6c 69 (revision -> li 6940: 73 74 20 28 72 65 76 69 73 69 6f 6e 29 29 0a 20 st (revision)). 6950: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 6e typemethod in 6960: 74 65 72 6e 61 6c 73 75 63 63 65 73 73 6f 72 73 ternalsuccessors 6970: 20 7b 64 76 20 72 65 76 69 73 69 6f 6e 73 7d 20 {dv revisions} 6980: 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76 20 64 {..upvar 1 $dv d 6990: 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 73 65 74 ependencies..set 69a0: 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 theset ('[join 69b0: 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d $revisions {','} 69c0: 5d 27 29 0a 0a 09 23 20 53 65 65 20 27 73 75 63 ]')...# See 'suc 69d0: 63 65 73 73 6f 72 73 27 20 62 65 6c 6f 77 20 66 cessors' below f 69e0: 6f 72 20 74 68 65 20 6d 61 69 6e 20 65 78 70 6c or the main expl 69f0: 61 6e 61 74 69 6f 6e 20 6f 66 0a 09 23 20 74 68 anation of..# th 6a00: 65 20 76 61 72 69 6f 75 73 20 63 61 73 65 73 2e e various cases. 6a10: 20 54 68 69 73 20 70 69 65 63 65 20 69 73 20 73 This piece is s 6a20: 70 65 63 69 61 6c 20 69 6e 20 74 68 61 74 20 69 pecial in that i 6a30: 74 0a 09 23 20 72 65 73 74 72 69 63 74 73 20 74 t..# restricts t 6a40: 68 65 20 73 75 63 63 65 73 73 6f 72 73 20 77 65 he successors we 6a50: 20 6c 6f 6f 6b 20 66 6f 72 20 74 6f 20 74 68 65 look for to the 6a60: 20 73 61 6d 65 20 73 65 74 20 6f 66 0a 09 23 20 same set of..# 6a70: 72 65 76 69 73 69 6f 6e 73 20 77 65 20 73 74 61 revisions we sta 6a80: 72 74 20 66 72 6f 6d 2e 20 53 65 6e 73 69 62 6c rt from. Sensibl 6a90: 65 20 61 73 20 77 65 20 61 72 65 20 6c 6f 6f 6b e as we are look 6aa0: 69 6e 67 20 66 6f 72 0a 09 23 20 63 68 61 6e 67 ing for..# chang 6ab0: 65 73 65 74 20 69 6e 74 65 72 6e 61 6c 20 64 65 eset internal de 6ac0: 70 65 6e 64 65 6e 63 69 65 73 2e 0a 0a 09 61 72 pendencies....ar 6ad0: 72 61 79 20 73 65 74 20 64 65 70 20 7b 7d 0a 0a ray set dep {}.. 6ae0: 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68 .foreach {rid ch 6af0: 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 ild} [state run 6b00: 22 0a 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d ". -- (1) Prim 6b10: 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20 53 ary child.. S 6b20: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63 ELECT R.rid, R.c 6b30: 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 hild.. FROM 6b40: 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 revision R.. 6b50: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 WHERE R.rid 6b60: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d IN $theset - 6b70: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 - Restrict to re 6b80: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 visions of inter 6b90: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 est.. AND 6ba0: 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e R.child IS NOT N 6bb0: 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 ULL -- Has pr 6bc0: 69 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 imary child.. 6bd0: 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 AND R.child 6be0: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d IN $theset - 6bf0: 2d 20 57 68 69 63 68 20 69 73 20 61 6c 73 6f 20 - Which is also 6c00: 6f 66 20 69 6e 74 65 72 65 73 74 0a 20 20 20 20 of interest. 6c10: 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32 29 UNION. -- (2) 6c20: 20 53 65 63 6f 6e 64 61 72 79 20 28 62 72 61 6e Secondary (bran 6c30: 63 68 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 ch) children.. 6c40: 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 SELECT R.rid, 6c50: 42 2e 62 72 69 64 0a 09 20 20 20 20 46 52 4f 4d B.brid.. FROM 6c60: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 revision R, r 6c70: 65 76 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 69 evisionbranchchi 6c80: 6c 64 72 65 6e 20 42 0a 09 20 20 20 20 57 48 45 ldren B.. WHE 6c90: 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 RE R.rid IN $ 6ca0: 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65 theset -- Re 6cb0: 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 strict to revisi 6cc0: 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a ons of interest. 6cd0: 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72 69 . AND R.ri 6ce0: 64 20 3d 20 42 2e 72 69 64 20 20 20 20 20 20 20 d = B.rid 6cf0: 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 73 75 62 -- Select sub 6d00: 73 65 74 20 6f 66 20 62 72 61 6e 63 68 20 63 68 set of branch ch 6d10: 69 6c 64 72 65 6e 0a 09 20 20 20 20 41 4e 44 20 ildren.. AND 6d20: 20 20 20 42 2e 62 72 69 64 20 49 4e 20 24 74 68 B.brid IN $th 6d30: 65 73 65 74 20 20 20 20 20 20 2d 2d 20 57 68 69 eset -- Whi 6d40: 63 68 20 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e ch is also of in 6d50: 74 65 72 65 73 74 0a 20 20 20 20 55 4e 49 4f 4e terest. UNION 6d60: 0a 20 20 20 20 2d 2d 20 28 34 29 20 43 68 69 6c . -- (4) Chil 6d70: 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 20 d of trunk root 6d80: 73 75 63 63 65 73 73 6f 72 20 6f 66 20 6c 61 73 successor of las 6d90: 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b 2e t NTDB on trunk. 6da0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 .. SELECT R.r 6db0: 69 64 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20 20 id, RA.child.. 6dc0: 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 FROM revision 6dd0: 52 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 0a 09 R, revision RA.. 6de0: 20 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 WHERE R.rid 6df0: 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 IN $theset 6e00: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f -- Restrict to 6e10: 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e revisions of in 6e20: 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 terest.. AND 6e30: 20 20 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20 R.isdefault 6e40: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 -- Res 6e50: 74 72 69 63 74 20 74 6f 20 4e 54 44 42 0a 09 20 trict to NTDB.. 6e60: 20 20 20 41 4e 44 20 20 20 52 2e 64 62 63 68 69 AND R.dbchi 6e70: 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 ld IS NOT NULL 6e80: 20 2d 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 -- and last NTD 6e90: 42 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 B belonging to t 6ea0: 72 75 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 runk.. AND 6eb0: 52 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69 RA.rid = R.dbchi 6ec0: 6c 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 ld -- Go di 6ed0: 72 65 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 rectly to trunk 6ee0: 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 root.. AND 6ef0: 52 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 RA.child IS NOT 6f00: 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 NULL -- Has p 6f10: 72 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 20 20 rimary child.. 6f20: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 AND 6f30: 52 41 2e 63 68 69 6c 64 20 49 4e 20 24 74 68 65 RA.child IN $the 6f40: 73 65 74 20 20 20 20 20 2d 2d 20 57 68 69 63 68 set -- Which 6f50: 20 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e 74 65 is also of inte 6f60: 72 65 73 74 0a 09 22 5d 20 7b 0a 09 20 20 20 20 rest.."] {.. 6f70: 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69 6e # Consider movin 6f80: 67 20 74 68 69 73 20 74 6f 20 74 68 65 20 69 6e g this to the in 6f90: 74 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e 0a tegrity module.. 6fa0: 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 . integrity a 6fb0: 73 73 65 72 74 20 7b 24 72 69 64 20 21 3d 20 24 ssert {$rid != $ 6fc0: 63 68 69 6c 64 7d 20 7b 52 65 76 69 73 69 6f 6e child} {Revision 6fd0: 20 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f 6e $rid depends on 6fe0: 20 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20 6c itself.}.. l 6ff0: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 append dependenc 7000: 69 65 73 28 24 72 69 64 29 20 24 63 68 69 6c 64 ies($rid) $child 7010: 0a 09 20 20 20 20 73 65 74 20 64 65 70 28 24 72 .. set dep($r 7020: 69 64 2c 24 63 68 69 6c 64 29 20 2e 0a 09 7d 0a id,$child) ...}. 7030: 0a 09 23 20 54 68 65 20 73 71 6c 20 73 74 61 74 ..# The sql stat 7040: 65 6d 65 6e 74 73 20 61 62 6f 76 65 20 6c 6f 6f ements above loo 7050: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 64 69 72 65 ks only for dire 7060: 63 74 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a ct dependencies. 7070: 09 23 20 62 65 74 77 65 65 6e 20 72 65 76 69 73 .# between revis 7080: 69 6f 6e 20 69 6e 20 74 68 65 20 63 68 61 6e 67 ion in the chang 7090: 65 73 65 74 2e 20 48 6f 77 65 76 65 72 20 64 75 eset. However du 70a0: 65 20 74 6f 20 74 68 65 0a 09 23 20 76 61 67 61 e to the..# vaga 70b0: 72 69 65 73 20 6f 66 20 6d 65 74 61 20 64 61 74 ries of meta dat 70c0: 61 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 a it is possible 70d0: 20 66 6f 72 20 74 77 6f 20 72 65 76 69 73 69 6f for two revisio 70e0: 6e 73 20 6f 66 0a 09 23 20 74 68 65 20 73 61 6d ns of..# the sam 70f0: 65 20 66 69 6c 65 20 74 6f 20 65 6e 64 20 75 70 e file to end up 7100: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 63 68 61 in the same cha 7110: 6e 67 65 73 65 74 2c 20 77 69 74 68 6f 75 74 20 ngeset, without 7120: 61 0a 09 23 20 64 69 72 65 63 74 20 64 65 70 65 a..# direct depe 7130: 6e 64 65 6e 63 79 20 62 65 74 77 65 65 6e 20 74 ndency between t 7140: 68 65 6d 2e 20 48 6f 77 65 76 65 72 20 77 65 20 hem. However we 7150: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 72 65 0a know that there. 7160: 09 23 20 68 61 73 20 74 6f 20 62 65 20 61 20 61 .# has to be a a 7170: 6e 20 69 6e 64 69 72 65 63 74 20 64 65 70 65 6e n indirect depen 7180: 64 65 6e 63 79 2c 20 62 65 20 69 74 20 74 68 72 dency, be it thr 7190: 6f 75 67 68 20 70 72 69 6d 61 72 79 0a 09 23 20 ough primary..# 71a0: 63 68 69 6c 64 72 65 6e 2c 20 62 72 61 6e 63 68 children, branch 71b0: 20 63 68 69 6c 64 72 65 6e 2c 20 6f 72 20 61 20 children, or a 71c0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68 65 72 combination ther 71d0: 65 6f 66 2e 0a 0a 09 23 20 57 65 20 6e 6f 77 20 eof....# We now 71e0: 66 69 6c 6c 20 69 6e 20 74 68 65 73 65 20 70 73 fill in these ps 71f0: 65 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63 69 65 eudo-dependencie 7200: 73 2c 20 69 66 20 6e 6f 20 73 75 63 68 0a 09 23 s, if no such..# 7210: 20 64 65 70 65 6e 64 65 6e 63 79 20 65 78 69 73 dependency exis 7220: 74 73 20 61 6c 72 65 61 64 79 2e 20 54 68 65 20 ts already. The 7230: 64 69 72 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 direction of the 7240: 20 64 65 70 65 6e 64 65 6e 63 79 0a 09 23 20 69 dependency..# i 7250: 73 20 61 63 74 75 61 6c 6c 79 20 69 72 72 65 6c s actually irrel 7260: 65 76 61 6e 74 20 66 6f 72 20 74 68 69 73 2e 0a evant for this.. 7270: 0a 09 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 ..# NOTE: This i 7280: 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d s different from 7290: 20 63 76 73 32 73 76 6e 2e 20 4f 75 72 20 73 70 cvs2svn. Our sp 72a0: 69 72 69 74 75 61 6c 20 61 6e 63 65 73 74 6f 72 iritual ancestor 72b0: 0a 09 23 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 ..# does not use 72c0: 20 73 75 63 68 20 70 73 65 75 64 6f 2d 64 65 70 such pseudo-dep 72d0: 65 6e 64 65 6e 63 69 65 73 2c 20 68 6f 77 65 76 endencies, howev 72e0: 65 72 20 69 74 20 75 73 65 73 20 61 0a 09 23 20 er it uses a..# 72f0: 43 4f 4d 4d 49 54 5f 54 48 52 45 53 48 4f 4c 44 COMMIT_THRESHOLD 7300: 2c 20 61 20 74 69 6d 65 20 69 6e 74 65 72 76 61 , a time interva 7310: 6c 20 63 6f 6d 6d 69 74 73 20 73 68 6f 75 6c 64 l commits should 7320: 20 66 61 6c 6c 2e 20 54 68 69 73 0a 09 23 20 77 fall. This..# w 7330: 69 6c 6c 20 67 72 65 61 74 6c 79 20 72 65 64 75 ill greatly redu 7340: 63 65 73 20 74 68 65 20 72 69 73 6b 20 6f 66 20 ces the risk of 7350: 67 65 74 74 69 6e 67 20 66 61 72 20 73 65 70 61 getting far sepa 7360: 72 61 74 65 64 0a 09 23 20 72 65 76 69 73 69 6f rated..# revisio 7370: 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 66 ns of the same f 7380: 69 6c 65 20 69 6e 74 6f 20 6f 6e 65 20 63 68 61 ile into one cha 7390: 6e 67 65 73 65 74 2e 0a 0a 09 23 20 57 65 20 61 ngeset....# We a 73a0: 6c 6c 6f 77 20 72 65 76 69 73 69 6f 6e 73 20 74 llow revisions t 73b0: 6f 20 62 65 20 66 61 72 20 61 70 61 72 74 20 69 o be far apart i 73c0: 6e 20 74 69 6d 65 20 69 6e 20 74 68 65 20 73 61 n time in the sa 73d0: 6d 65 0a 09 23 20 63 68 61 6e 67 65 73 65 74 2c me..# changeset, 73e0: 20 62 75 74 20 69 6e 20 74 75 72 6e 20 6e 65 65 but in turn nee 73f0: 64 20 74 68 65 20 70 73 65 75 64 6f 2d 64 65 70 d the pseudo-dep 7400: 65 6e 64 65 6e 63 69 65 73 20 74 6f 0a 09 23 20 endencies to..# 7410: 68 61 6e 64 6c 65 20 74 68 69 73 2e 0a 0a 09 61 handle this....a 7420: 72 72 61 79 20 73 65 74 20 66 69 64 73 20 7b 7d rray set fids {} 7430: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 66 ..foreach {rid f 7440: 69 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 id} [state run " 7450: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 .. SELECT R.r 7460: 69 64 2c 20 52 2e 66 69 64 0a 20 20 20 20 20 20 id, R.fid. 7470: 20 20 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 FROM rev 7480: 69 73 69 6f 6e 20 52 0a 20 20 20 20 20 20 20 20 ision R. 7490: 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 WHERE R.rid 74a0: 20 49 4e 20 24 74 68 65 73 65 74 0a 09 22 5d 20 IN $theset.."] 74b0: 7b 20 6c 61 70 70 65 6e 64 20 66 69 64 73 28 24 { lappend fids($ 74c0: 66 69 64 29 20 24 72 69 64 20 7d 0a 0a 09 66 6f fid) $rid }...fo 74d0: 72 65 61 63 68 20 7b 66 69 64 20 72 69 64 73 7d reach {fid rids} 74e0: 20 5b 61 72 72 61 79 20 67 65 74 20 66 69 64 73 [array get fids 74f0: 5d 20 7b 0a 09 20 20 20 20 69 66 20 7b 5b 6c 6c ] {.. if {[ll 7500: 65 6e 67 74 68 20 24 72 69 64 73 5d 20 3c 20 32 ength $rids] < 2 7510: 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 20 20 20 20 } continue.. 7520: 66 6f 72 65 61 63 68 20 61 20 24 72 69 64 73 20 foreach a $rids 7530: 7b 0a 09 09 66 6f 72 65 61 63 68 20 62 20 24 72 {...foreach b $r 7540: 69 64 73 20 7b 0a 09 09 20 20 20 20 69 66 20 7b ids {... if { 7550: 24 61 20 3d 3d 20 24 62 7d 20 63 6f 6e 74 69 6e $a == $b} contin 7560: 75 65 0a 09 09 20 20 20 20 69 66 20 7b 5b 69 6e ue... if {[in 7570: 66 6f 20 65 78 69 73 74 73 20 64 65 70 28 24 61 fo exists dep($a 7580: 2c 24 62 29 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a ,$b)]} continue. 7590: 09 09 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 .. if {[info 75a0: 65 78 69 73 74 73 20 64 65 70 28 24 62 2c 24 61 exists dep($b,$a 75b0: 29 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 09 20 )]} continue... 75c0: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e lappend depen 75d0: 64 65 6e 63 69 65 73 28 24 61 29 20 24 62 0a 09 dencies($a) $b.. 75e0: 09 20 20 20 20 73 65 74 20 64 65 70 28 24 61 2c . set dep($a, 75f0: 24 62 29 20 2e 0a 09 09 20 20 20 20 73 65 74 20 $b) .... set 7600: 64 65 70 28 24 62 2c 24 61 29 20 2e 0a 09 09 7d dep($b,$a) ....} 7610: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72 65 74 75 .. }..}..retu 7620: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 rn. }.. # 7630: 72 65 73 75 6c 74 20 3d 20 34 2d 6c 69 73 74 20 result = 4-list 7640: 28 69 74 65 6d 74 79 70 65 20 69 74 65 6d 69 64 (itemtype itemid 7650: 20 6e 65 78 74 69 74 65 6d 74 79 70 65 20 6e 65 nextitemtype ne 7660: 78 74 69 74 65 6d 69 64 20 2e 2e 2e 29 0a 20 20 xtitemid ...). 7670: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c 6f 6f typemethod loo 7680: 70 73 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b ps {revisions} { 7690: 0a 09 23 20 4e 6f 74 65 3a 20 54 61 67 73 20 61 ..# Note: Tags a 76a0: 6e 64 20 62 72 61 6e 63 68 65 73 20 63 61 6e 6e nd branches cann 76b0: 6f 74 20 63 61 75 73 65 20 74 68 65 20 6c 6f 6f ot cause the loo 76c0: 70 2e 20 54 68 65 69 72 20 69 64 27 73 2c 0a 09 p. Their id's,.. 76d0: 23 20 62 65 69 6e 20 6f 66 20 61 20 66 75 6e 64 # bein of a fund 76e0: 61 6d 65 6e 74 61 6c 6c 79 20 64 69 66 66 65 72 amentally differ 76f0: 65 6e 74 20 74 79 70 65 20 74 68 61 6e 20 74 68 ent type than th 7700: 65 20 72 65 76 69 73 69 6f 6e 73 0a 09 23 20 63 e revisions..# c 7710: 6f 6d 69 6e 67 20 69 6e 20 63 61 6e 6e 6f 74 20 oming in cannot 7720: 62 65 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 0a be in the set... 7730: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a .set theset ('[j 7740: 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b oin $revisions { 7750: 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20 ','}]')..return 7760: 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73 [state run [subs 7770: 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e t -nocommands -n 7780: 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09 obackslashes {.. 7790: 20 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d 61 -- (1) Prima 77a0: 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20 53 45 ry child.. SE 77b0: 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63 68 LECT R.rid, R.ch 77c0: 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 ild.. FROM 77d0: 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 revision R.. 77e0: 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 WHERE R.rid I 77f0: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d N $theset -- 7800: 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 Restrict to rev 7810: 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 isions of intere 7820: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 st.. AND R 7830: 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 .child IS NOT NU 7840: 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69 LL -- Has pri 7850: 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20 mary child.. 7860: 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49 AND R.child I 7870: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d N $theset -- 7880: 20 4c 6f 6f 70 0a 09 20 20 20 20 2d 2d 0a 09 20 Loop.. --.. 7890: 20 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 2d 2d UNION.. -- 78a0: 20 28 32 29 20 53 65 63 6f 6e 64 61 72 79 20 28 (2) Secondary ( 78b0: 62 72 61 6e 63 68 29 20 63 68 69 6c 64 72 65 6e branch) children 78c0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 .. SELECT R.r 78d0: 69 64 2c 20 42 2e 62 72 69 64 0a 09 20 20 20 20 id, B.brid.. 78e0: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 FROM revision 78f0: 52 2c 20 72 65 76 69 73 69 6f 6e 62 72 61 6e 63 R, revisionbranc 7900: 68 63 68 69 6c 64 72 65 6e 20 42 0a 09 20 20 20 hchildren B.. 7910: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 WHERE R.rid 7920: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d IN $theset - 7930: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 - Restrict to re 7940: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 visions of inter 7950: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 est.. AND 7960: 52 2e 72 69 64 20 3d 20 42 2e 72 69 64 20 20 20 R.rid = B.rid 7970: 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 -- Select 7980: 20 73 75 62 73 65 74 20 6f 66 20 62 72 61 6e 63 subset of branc 7990: 68 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 h children.. 79a0: 41 4e 44 20 20 20 20 42 2e 72 69 64 20 20 20 49 AND B.rid I 79b0: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d N $theset -- 79c0: 20 4c 6f 6f 70 0a 09 20 20 20 20 2d 2d 0a 09 20 Loop.. --.. 79d0: 20 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 2d 2d UNION.. -- 79e0: 20 28 34 29 20 43 68 69 6c 64 20 6f 66 20 74 72 (4) Child of tr 79f0: 75 6e 6b 20 72 6f 6f 74 20 73 75 63 63 65 73 73 unk root success 7a00: 6f 72 20 6f 66 20 6c 61 73 74 20 4e 54 44 42 20 or of last NTDB 7a10: 6f 6e 20 74 72 75 6e 6b 2e 0a 09 20 20 20 20 53 on trunk... S 7a20: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 41 2e ELECT R.rid, RA. 7a30: 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 child.. FROM 7a40: 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 revision R, re 7a50: 76 69 73 69 6f 6e 20 52 41 0a 09 20 20 20 20 57 vision RA.. W 7a60: 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 20 49 HERE R.rid I 7a70: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d N $theset -- 7a80: 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 Restrict to rev 7a90: 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 isions of intere 7aa0: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 st.. AND R 7ab0: 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20 20 20 .isdefault 7ac0: 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 -- Restri 7ad0: 63 74 20 74 6f 20 4e 54 44 42 0a 09 20 20 20 20 ct to NTDB.. 7ae0: 41 4e 44 20 20 20 20 52 2e 64 62 63 68 69 6c 64 AND R.dbchild 7af0: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d IS NOT NULL - 7b00: 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 42 20 - and last NTDB 7b10: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72 75 belonging to tru 7b20: 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 nk.. AND R 7b30: 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69 6c A.rid = R.dbchil 7b40: 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 72 d -- Go dir 7b50: 65 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 72 ectly to trunk r 7b60: 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 oot.. AND 7b70: 52 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 RA.child IS NOT 7b80: 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 NULL -- Has p 7b90: 72 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 09 20 rimary child... 7ba0: 20 20 20 41 4e 44 20 20 20 20 52 41 2e 63 68 69 AND RA.chi 7bb0: 6c 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 ld IN $theset 7bc0: 20 20 2d 2d 20 4c 6f 6f 70 0a 09 7d 5d 5d 0a 20 -- Loop..}]]. 7bd0: 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 }.. # var( 7be0: 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d dv) = dict (item 7bf0: 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29 -> list (item)) 7c00: 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 , item = list ( 7c10: 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 70 type id). typ 7c20: 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f emethod successo 7c30: 72 73 20 7b 64 76 20 72 65 76 69 73 69 6f 6e 73 rs {dv revisions 7c40: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76 } {..upvar 1 $dv 7c50: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 73 dependencies..s 7c60: 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 et theset ('[joi 7c70: 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c n $revisions {', 7c80: 27 7d 5d 27 29 0a 0a 09 23 20 54 68 65 20 66 6f '}]')...# The fo 7c90: 6c 6c 6f 77 69 6e 67 20 63 61 73 65 73 20 73 70 llowing cases sp 7ca0: 65 63 69 66 79 20 77 68 65 6e 20 61 20 72 65 76 ecify when a rev 7cb0: 69 73 69 6f 6e 20 53 20 69 73 20 61 20 73 75 63 ision S is a suc 7cc0: 63 65 73 73 6f 72 0a 09 23 20 6f 66 20 61 20 72 cessor..# of a r 7cd0: 65 76 69 73 69 6f 6e 20 52 2e 20 45 61 63 68 20 evision R. Each 7ce0: 6f 66 20 74 68 65 20 63 61 73 65 73 20 74 72 61 of the cases tra 7cf0: 6e 73 6c 61 74 65 73 20 69 6e 74 6f 20 6f 6e 65 nslates into one 7d00: 20 6f 66 0a 09 23 20 74 68 65 20 62 72 61 6e 63 of..# the branc 7d10: 68 65 73 20 6f 66 20 74 68 65 20 53 51 4c 20 55 hes of the SQL U 7d20: 4e 49 4f 4e 20 63 6f 6d 69 6e 67 20 62 65 6c 6f NION coming belo 7d30: 77 2e 0a 09 23 0a 09 23 20 28 31 29 20 53 20 63 w...#..# (1) S c 7d40: 61 6e 20 62 65 20 61 20 70 72 69 6d 61 72 79 20 an be a primary 7d50: 63 68 69 6c 64 20 6f 66 20 52 2c 20 69 2e 65 2e child of R, i.e. 7d60: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 4c 4f 44 in the same LOD 7d70: 2e 20 52 0a 09 23 20 20 20 20 20 72 65 66 65 72 . R..# refer 7d80: 65 6e 63 65 73 20 53 20 64 69 72 65 63 74 6c 79 ences S directly 7d90: 2e 20 52 2e 63 68 69 6c 64 20 3d 20 53 28 2e 72 . R.child = S(.r 7da0: 69 64 29 2c 20 69 66 20 69 74 20 65 78 69 73 74 id), if it exist 7db0: 73 2e 0a 09 23 0a 09 23 20 28 32 29 20 53 20 63 s...#..# (2) S c 7dc0: 61 6e 20 62 65 20 61 20 73 65 63 6f 6e 64 61 72 an be a secondar 7dd0: 79 2c 20 69 2e 65 2e 20 62 72 61 6e 63 68 2c 20 y, i.e. branch, 7de0: 63 68 69 6c 64 20 6f 66 20 52 2e 20 48 65 72 65 child of R. Here 7df0: 20 74 68 65 0a 09 23 20 20 20 20 20 6c 69 6e 6b the..# link 7e00: 20 69 73 20 6d 61 64 65 20 74 68 72 6f 75 67 68 is made through 7e10: 20 74 68 65 20 68 65 6c 70 65 72 20 74 61 62 6c the helper tabl 7e20: 65 0a 09 23 20 20 20 20 20 52 45 56 49 53 49 4f e..# REVISIO 7e30: 4e 42 52 41 4e 43 48 43 48 49 4c 44 52 45 4e 2e NBRANCHCHILDREN. 7e40: 20 52 2e 72 69 64 20 2d 3e 20 52 42 43 2e 72 69 R.rid -> RBC.ri 7e50: 64 2c 20 52 42 43 2e 62 72 69 64 20 3d 0a 09 23 d, RBC.brid =..# 7e60: 20 20 20 20 20 53 28 2e 72 69 64 29 0a 09 23 0a S(.rid)..#. 7e70: 09 23 20 28 33 29 20 4f 72 69 67 69 6e 61 6c 6c .# (3) Originall 7e80: 79 20 74 68 69 73 20 75 73 65 20 63 61 73 65 20 y this use case 7e90: 64 65 66 69 6e 65 64 20 74 68 65 20 72 6f 6f 74 defined the root 7ea0: 20 6f 66 20 61 20 64 65 74 61 63 68 65 64 0a 09 of a detached.. 7eb0: 23 20 20 20 20 20 4e 54 44 42 20 61 73 20 74 68 # NTDB as th 7ec0: 65 20 73 75 63 63 65 73 73 6f 72 20 6f 66 20 74 e successor of t 7ed0: 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74 2e 20 54 he trunk root. T 7ee0: 68 69 73 20 6c 65 61 64 73 20 74 6f 20 61 0a 09 his leads to a.. 7ef0: 23 20 20 20 20 20 62 61 64 20 74 61 6e 67 6c 65 # bad tangle 7f00: 20 6c 61 74 65 72 20 6f 6e 2e 20 57 69 74 68 20 later on. With 7f10: 61 20 64 65 74 61 63 68 65 64 20 4e 54 44 42 20 a detached NTDB 7f20: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 09 23 20 the original..# 7f30: 20 20 20 20 74 72 75 6e 6b 20 72 6f 6f 74 20 72 trunk root r 7f40: 65 76 69 73 69 6f 6e 20 77 61 73 20 72 65 6d 6f evision was remo 7f50: 76 65 64 20 61 73 20 69 72 72 65 6c 65 76 61 6e ved as irrelevan 7f60: 74 2c 20 61 6c 6c 6f 77 69 6e 67 0a 09 23 20 20 t, allowing..# 7f70: 20 20 20 74 68 65 20 6e 6f 6d 69 6e 61 6c 20 72 the nominal r 7f80: 6f 6f 74 20 74 6f 20 62 65 20 6c 61 74 65 72 20 oot to be later 7f90: 69 6e 20 74 69 6d 65 20 74 68 61 6e 20 74 68 65 in time than the 7fa0: 20 4e 54 44 42 0a 09 23 20 20 20 20 20 72 6f 6f NTDB..# roo 7fb0: 74 2e 20 4e 6f 77 20 73 65 74 74 69 6e 67 20 74 t. Now setting t 7fc0: 68 69 73 20 64 65 70 65 6e 64 65 6e 63 79 20 77 his dependency w 7fd0: 69 6c 6c 20 62 65 20 62 61 63 6b 77 61 72 64 20 ill be backward 7fe0: 69 6e 0a 09 23 20 20 20 20 20 74 69 6d 65 2e 20 in..# time. 7ff0: 52 45 4d 4f 56 45 44 2e 0a 09 23 0a 09 23 20 28 REMOVED...#..# ( 8000: 34 29 20 49 66 20 52 20 69 73 20 74 68 65 20 6c 4) If R is the l 8010: 61 73 74 20 6f 66 20 74 68 65 20 4e 54 44 42 20 ast of the NTDB 8020: 72 65 76 69 73 69 6f 6e 73 20 77 68 69 63 68 20 revisions which 8030: 62 65 6c 6f 6e 67 20 74 6f 0a 09 23 20 20 20 20 belong to..# 8040: 20 74 68 65 20 74 72 75 6e 6b 2c 20 74 68 65 6e the trunk, then 8050: 20 74 68 65 20 70 72 69 6d 61 72 79 20 63 68 69 the primary chi 8060: 6c 64 20 6f 66 20 74 68 65 20 74 72 75 6e 6b 20 ld of the trunk 8070: 72 6f 6f 74 20 28 74 68 65 0a 09 23 20 20 20 20 root (the..# 8080: 20 27 31 2e 32 27 20 72 65 76 69 73 69 6f 6e 29 '1.2' revision) 8090: 20 69 73 20 61 20 73 75 63 63 65 73 73 6f 72 2c is a successor, 80a0: 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a 0a if it exists... 80b0: 09 23 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 .# Note that the 80c0: 20 62 72 61 6e 63 68 65 73 20 73 70 61 77 6e 65 branches spawne 80d0: 64 20 66 72 6f 6d 20 74 68 65 20 72 65 76 69 73 d from the revis 80e0: 69 6f 6e 73 2c 20 61 6e 64 20 74 68 65 0a 09 23 ions, and the..# 80f0: 20 74 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 tags associated 8100: 20 77 69 74 68 20 74 68 65 6d 20 61 72 65 20 73 with them are s 8110: 75 63 63 65 73 73 6f 72 73 20 61 73 20 77 65 6c uccessors as wel 8120: 6c 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 l....foreach {ri 8130: 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 d child} [state 8140: 72 75 6e 20 22 0a 20 20 20 2d 2d 20 28 31 29 20 run ". -- (1) 8150: 50 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 Primary child.. 8160: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c SELECT R.rid, 8170: 20 52 2e 63 68 69 6c 64 0a 09 20 20 20 20 46 52 R.child.. FR 8180: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 0a OM revision R. 8190: 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 . WHERE R.ri 81a0: 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 d IN $theset 81b0: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 -- Restrict t 81c0: 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 o revisions of i 81d0: 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 nterest.. AND 81e0: 20 20 20 20 52 2e 63 68 69 6c 64 20 49 53 20 4e R.child IS N 81f0: 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 OT NULL -- Ha 8200: 73 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 0a s primary child. 8210: 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d UNION. -- 8220: 20 28 32 29 20 53 65 63 6f 6e 64 61 72 79 20 28 (2) Secondary ( 8230: 62 72 61 6e 63 68 29 20 63 68 69 6c 64 72 65 6e branch) children 8240: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 .. SELECT R.r 8250: 69 64 2c 20 42 2e 62 72 69 64 0a 09 20 20 20 20 id, B.brid.. 8260: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 FROM revision 8270: 52 2c 20 72 65 76 69 73 69 6f 6e 62 72 61 6e 63 R, revisionbranc 8280: 68 63 68 69 6c 64 72 65 6e 20 42 0a 09 20 20 20 hchildren B.. 8290: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 WHERE R.rid 82a0: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d IN $theset - 82b0: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 - Restrict to re 82c0: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 visions of inter 82d0: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 est.. AND 82e0: 52 2e 72 69 64 20 3d 20 42 2e 72 69 64 20 20 20 R.rid = B.rid 82f0: 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 -- Select 8300: 20 73 75 62 73 65 74 20 6f 66 20 62 72 61 6e 63 subset of branc 8310: 68 20 63 68 69 6c 64 72 65 6e 0a 20 20 20 20 55 h children. U 8320: 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 34 29 20 NION. -- (4) 8330: 43 68 69 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 Child of trunk r 8340: 6f 6f 74 20 73 75 63 63 65 73 73 6f 72 20 6f 66 oot successor of 8350: 20 6c 61 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 last NTDB on tr 8360: 75 6e 6b 2e 0a 09 20 20 20 20 53 45 4c 45 43 54 unk... SELECT 8370: 20 52 2e 72 69 64 2c 20 52 41 2e 63 68 69 6c 64 R.rid, RA.child 8380: 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73 .. FROM revis 8390: 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 ion R, revision 83a0: 52 41 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e RA.. WHERE R. 83b0: 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 rid IN $theset 83c0: 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 -- Restric 83d0: 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f t to revisions o 83e0: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 f interest.. 83f0: 41 4e 44 20 20 20 52 2e 69 73 64 65 66 61 75 6c AND R.isdefaul 8400: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d t -- 8410: 20 52 65 73 74 72 69 63 74 20 74 6f 20 4e 54 44 Restrict to NTD 8420: 42 0a 09 20 20 20 20 41 4e 44 20 20 20 52 2e 64 B.. AND R.d 8430: 62 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 bchild IS NOT NU 8440: 4c 4c 20 20 20 2d 2d 20 61 6e 64 20 6c 61 73 74 LL -- and last 8450: 20 4e 54 44 42 20 62 65 6c 6f 6e 67 69 6e 67 20 NTDB belonging 8460: 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20 41 4e to trunk.. AN 8470: 44 20 20 20 52 41 2e 72 69 64 20 3d 20 52 2e 64 D RA.rid = R.d 8480: 62 63 68 69 6c 64 20 20 20 20 20 20 2d 2d 20 47 bchild -- G 8490: 6f 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 72 o directly to tr 84a0: 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 20 41 4e unk root.. AN 84b0: 44 20 20 20 52 41 2e 63 68 69 6c 64 20 49 53 20 D RA.child IS 84c0: 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 NOT NULL -- H 84d0: 61 73 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 as primary child 84e0: 2e 0a 09 22 5d 20 7b 0a 09 20 20 20 20 23 20 43 ..."] {.. # C 84f0: 6f 6e 73 69 64 65 72 20 6d 6f 76 69 6e 67 20 74 onsider moving t 8500: 68 69 73 20 74 6f 20 74 68 65 20 69 6e 74 65 67 his to the integ 8510: 72 69 74 79 20 6d 6f 64 75 6c 65 2e 0a 09 20 20 rity module... 8520: 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 integrity asse 8530: 72 74 20 7b 24 72 69 64 20 21 3d 20 24 63 68 69 rt {$rid != $chi 8540: 6c 64 7d 20 7b 52 65 76 69 73 69 6f 6e 20 24 72 ld} {Revision $r 8550: 69 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 74 id depends on it 8560: 73 65 6c 66 2e 7d 0a 09 20 20 20 20 6c 61 70 70 self.}.. lapp 8570: 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 end dependencies 8580: 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64 5d ([list rev $rid] 8590: 29 20 5b 6c 69 73 74 20 72 65 76 20 24 63 68 69 ) [list rev $chi 85a0: 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 ld]..}..foreach 85b0: 7b 72 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 {rid child} [sta 85c0: 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 te run ".. SE 85d0: 4c 45 43 54 20 52 2e 72 69 64 2c 20 54 2e 74 69 LECT R.rid, T.ti 85e0: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 d.. FROM re 85f0: 76 69 73 69 6f 6e 20 52 2c 20 74 61 67 20 54 0a vision R, tag T. 8600: 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 . WHERE R.ri 8610: 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 d IN $theset.. 8620: 20 20 41 4e 44 20 20 20 20 54 2e 72 65 76 20 3d AND T.rev = 8630: 20 52 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 R.rid.."] {.. 8640: 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 lappend depend 8650: 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 65 76 encies([list rev 8660: 20 24 72 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 $rid]) [list sy 8670: 6d 3a 3a 74 61 67 20 24 63 68 69 6c 64 5d 0a 09 m::tag $child].. 8680: 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 }..foreach {rid 8690: 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 child} [state ru 86a0: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 n ".. SELECT 86b0: 52 2e 72 69 64 2c 20 42 2e 62 69 64 0a 09 20 20 R.rid, B.bid.. 86c0: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f FROM revisio 86d0: 6e 20 52 2c 20 62 72 61 6e 63 68 20 42 0a 09 20 n R, branch B.. 86e0: 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 WHERE R.rid 86f0: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 IN $theset.. 8700: 41 4e 44 20 20 20 20 42 2e 72 6f 6f 74 20 3d 20 AND B.root = 8710: 52 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 R.rid.."] {.. 8720: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 lappend depende 8730: 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 65 76 20 ncies([list rev 8740: 24 72 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d $rid]) [list sym 8750: 3a 3a 62 72 61 6e 63 68 20 24 63 68 69 6c 64 5d ::branch $child] 8760: 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 ..}..return. 8770: 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76 29 }.. # var(dv) 8780: 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d 3e = dict (item -> 8790: 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c 20 69 list (item)), i 87a0: 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 79 70 tem = list (typ 87b0: 65 20 69 64 29 0a 20 20 20 20 74 79 70 65 6d 65 e id). typeme 87c0: 74 68 6f 64 20 70 72 65 64 65 63 65 73 73 6f 72 thod predecessor 87d0: 73 20 7b 64 76 20 72 65 76 69 73 69 6f 6e 73 7d s {dv revisions} 87e0: 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76 20 {..upvar 1 $dv 87f0: 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 73 65 dependencies..se 8800: 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e t theset ('[join 8810: 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 $revisions {',' 8820: 7d 5d 27 29 0a 0a 09 23 20 54 68 65 20 66 6f 6c }]')...# The fol 8830: 6c 6f 77 69 6e 67 20 63 61 73 65 73 20 73 70 65 lowing cases spe 8840: 63 69 66 79 20 77 68 65 6e 20 61 20 72 65 76 69 cify when a revi 8850: 73 69 6f 6e 20 50 20 69 73 20 61 0a 09 23 20 70 sion P is a..# p 8860: 72 65 64 65 63 65 73 73 6f 72 20 6f 66 20 61 20 redecessor of a 8870: 72 65 76 69 73 69 6f 6e 20 52 2e 20 45 61 63 68 revision R. Each 8880: 20 6f 66 20 74 68 65 20 63 61 73 65 73 20 74 72 of the cases tr 8890: 61 6e 73 6c 61 74 65 73 0a 09 23 20 69 6e 74 6f anslates..# into 88a0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 72 61 6e one of the bran 88b0: 63 68 65 73 20 6f 66 20 74 68 65 20 53 51 4c 20 ches of the SQL 88c0: 55 4e 49 4f 4e 20 63 6f 6d 69 6e 67 20 62 65 6c UNION coming bel 88d0: 6f 77 2e 0a 09 23 0a 09 23 20 28 31 29 20 54 68 ow...#..# (1) Th 88e0: 65 20 69 6d 6d 65 64 69 61 74 65 20 70 61 72 65 e immediate pare 88f0: 6e 74 20 52 2e 70 61 72 65 6e 74 20 6f 66 20 52 nt R.parent of R 8900: 20 69 73 20 61 20 70 72 65 64 65 63 65 73 73 6f is a predecesso 8910: 72 20 6f 66 0a 09 23 20 20 20 20 20 52 2e 20 4e r of..# R. N 8920: 4f 54 45 3a 20 54 68 69 73 20 69 73 20 74 72 75 OTE: This is tru 8930: 65 20 66 6f 72 20 52 20 65 69 74 68 65 72 20 70 e for R either p 8940: 72 69 6d 61 72 79 20 6f 72 20 73 65 63 6f 6e 64 rimary or second 8950: 61 72 79 0a 09 23 20 20 20 20 20 63 68 69 6c 64 ary..# child 8960: 20 6f 66 20 50 2e 20 49 74 20 6e 6f 74 20 6e 65 of P. It not ne 8970: 63 65 73 73 61 72 79 20 74 6f 20 64 69 73 74 69 cessary to disti 8980: 6e 67 75 69 73 68 20 74 68 65 20 74 77 6f 0a 09 nguish the two.. 8990: 23 20 20 20 20 20 63 61 73 65 73 2c 20 69 6e 20 # cases, in 89a0: 63 6f 6e 74 72 61 73 74 20 74 6f 20 74 68 65 20 contrast to the 89b0: 63 6f 64 65 20 72 65 74 72 69 65 76 69 6e 67 20 code retrieving 89c0: 74 68 65 20 73 75 63 63 65 73 73 6f 72 0a 09 23 the successor..# 89d0: 20 20 20 20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e information 89e0: 2e 0a 09 23 0a 09 23 20 28 32 29 20 54 68 65 20 ...#..# (2) The 89f0: 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 73 75 complement of su 8a00: 63 63 65 73 73 6f 72 20 63 61 73 65 20 28 33 29 ccessor case (3) 8a10: 2e 20 54 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74 . The trunk root 8a20: 20 69 73 0a 09 23 20 20 20 20 20 61 20 70 72 65 is..# a pre 8a30: 64 65 63 65 73 73 6f 72 20 6f 66 20 61 20 4e 54 decessor of a NT 8a40: 44 42 20 72 6f 6f 74 2e 20 52 45 4d 4f 56 45 44 DB root. REMOVED 8a50: 2e 20 53 65 65 20 27 73 75 63 63 65 73 73 6f 72 . See 'successor 8a60: 73 27 0a 09 23 20 20 20 20 20 66 6f 72 20 74 68 s'..# for th 8a70: 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a 09 e explanation... 8a80: 23 0a 09 23 20 28 33 29 20 54 68 65 20 63 6f 6d #..# (3) The com 8a90: 70 6c 65 6d 65 6e 74 20 6f 66 20 73 75 63 63 65 plement of succe 8aa0: 73 73 6f 72 20 63 61 73 65 20 28 34 29 2e 20 54 ssor case (4). T 8ab0: 68 65 20 6c 61 73 74 20 4e 54 44 42 0a 09 23 20 he last NTDB..# 8ac0: 20 20 20 20 72 65 76 69 73 69 6f 6e 20 62 65 6c revision bel 8ad0: 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 74 72 onging to the tr 8ae0: 75 6e 6b 20 69 73 20 61 20 70 72 65 64 65 63 65 unk is a predece 8af0: 73 73 6f 72 20 6f 66 20 74 68 65 0a 09 23 20 20 ssor of the..# 8b00: 20 20 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 primary child 8b10: 20 6f 66 20 74 68 65 20 74 72 75 6e 6b 20 72 6f of the trunk ro 8b20: 6f 74 20 28 54 68 65 20 27 31 2e 32 27 20 72 65 ot (The '1.2' re 8b30: 76 69 73 69 6f 6e 29 2e 0a 0a 09 66 6f 72 65 61 vision)....forea 8b40: 63 68 20 7b 72 69 64 20 70 61 72 65 6e 74 7d 20 ch {rid parent} 8b50: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 20 20 20 [state run ". 8b60: 2d 2d 20 28 31 29 20 50 72 69 6d 61 72 79 20 70 -- (1) Primary p 8b70: 61 72 65 6e 74 2c 20 63 61 6e 20 62 65 20 69 6e arent, can be in 8b80: 20 64 69 66 66 65 72 65 6e 74 20 4c 4f 44 20 66 different LOD f 8b90: 6f 72 20 66 69 72 73 74 20 69 6e 20 61 20 62 72 or first in a br 8ba0: 61 6e 63 68 0a 09 20 20 20 20 53 45 4c 45 43 54 anch.. SELECT 8bb0: 20 52 2e 72 69 64 2c 20 52 2e 70 61 72 65 6e 74 R.rid, R.parent 8bc0: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 .. FROM rev 8bd0: 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 ision R.. WHE 8be0: 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 RE R.rid IN $ 8bf0: 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65 theset -- Re 8c00: 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 strict to revisi 8c10: 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a ons of interest. 8c20: 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 70 61 . AND R.pa 8c30: 72 65 6e 74 20 49 53 20 4e 4f 54 20 4e 55 4c 4c rent IS NOT NULL 8c40: 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 -- Has primar 8c50: 79 20 70 61 72 65 6e 74 0a 20 20 20 20 55 4e 49 y parent. UNI 8c60: 4f 4e 0a 20 20 20 20 2d 2d 20 28 33 29 20 4c 61 ON. -- (3) La 8c70: 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b st NTDB on trunk 8c80: 20 69 73 20 70 72 65 64 65 63 65 73 73 6f 72 20 is predecessor 8c90: 6f 66 20 63 68 69 6c 64 20 6f 66 20 74 72 75 6e of child of trun 8ca0: 6b 20 72 6f 6f 74 0a 09 20 20 20 20 53 45 4c 45 k root.. SELE 8cb0: 43 54 20 52 2e 72 69 64 2c 20 52 41 2e 64 62 70 CT R.rid, RA.dbp 8cc0: 61 72 65 6e 74 0a 09 20 20 20 20 46 52 4f 4d 20 arent.. FROM 8cd0: 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 revision R, re 8ce0: 76 69 73 69 6f 6e 20 52 41 0a 09 20 20 20 20 57 vision RA.. W 8cf0: 48 45 52 45 20 20 52 2e 72 69 64 20 49 4e 20 24 HERE R.rid IN $ 8d00: 74 68 65 73 65 74 20 20 20 20 20 20 20 20 20 2d theset - 8d10: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 - Restrict to re 8d20: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 visions of inter 8d30: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 est.. AND 8d40: 4e 4f 54 20 52 2e 69 73 64 65 66 61 75 6c 74 20 NOT R.isdefault 8d50: 20 20 20 20 20 20 20 20 20 2d 2d 20 6e 6f 74 20 -- not 8d60: 6f 6e 20 4e 54 44 42 0a 09 20 20 20 20 41 4e 44 on NTDB.. AND 8d70: 20 20 20 20 52 2e 70 61 72 65 6e 74 20 49 53 20 R.parent IS 8d80: 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 20 2d 2d 20 NOT NULL -- 8d90: 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 72 6f which are not ro 8da0: 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 ot.. AND R 8db0: 41 2e 72 69 64 20 3d 20 52 2e 70 61 72 65 6e 74 A.rid = R.parent 8dc0: 20 20 20 20 20 20 20 20 2d 2d 20 67 6f 20 74 6f -- go to 8dd0: 20 74 68 65 69 72 20 70 61 72 65 6e 74 0a 09 20 their parent.. 8de0: 20 20 20 41 4e 44 20 20 20 20 52 41 2e 64 62 70 AND RA.dbp 8df0: 61 72 65 6e 74 20 49 53 20 4e 4f 54 20 4e 55 4c arent IS NOT NUL 8e00: 4c 20 20 2d 2d 20 77 68 69 63 68 20 68 61 73 20 L -- which has 8e10: 74 6f 20 72 65 66 65 72 20 74 6f 20 4e 54 44 42 to refer to NTDB 8e20: 27 73 20 72 6f 6f 74 0a 09 22 5d 20 7b 0a 09 20 's root.."] {.. 8e30: 20 20 20 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f # Consider mo 8e40: 76 69 6e 67 20 74 68 69 73 20 74 6f 20 74 68 65 ving this to the 8e50: 20 69 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 6c integrity modul 8e60: 65 2e 0a 09 20 20 20 20 69 6e 74 65 67 72 69 74 e... integrit 8e70: 79 20 61 73 73 65 72 74 20 7b 24 72 69 64 20 21 y assert {$rid ! 8e80: 3d 20 24 70 61 72 65 6e 74 7d 20 7b 52 65 76 69 = $parent} {Revi 8e90: 73 69 6f 6e 20 24 72 69 64 20 64 65 70 65 6e 64 sion $rid depend 8ea0: 73 20 6f 6e 20 69 74 73 65 6c 66 2e 7d 0a 09 20 s on itself.}.. 8eb0: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e lappend depen 8ec0: 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 65 dencies([list re 8ed0: 76 20 24 72 69 64 5d 29 20 5b 6c 69 73 74 20 72 v $rid]) [list r 8ee0: 65 76 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 0a ev $parent]..}.. 8ef0: 09 23 20 54 68 65 20 72 65 76 69 73 69 6f 6e 73 .# The revisions 8f00: 20 77 68 69 63 68 20 61 72 65 20 74 68 65 20 66 which are the f 8f10: 69 72 73 74 20 6f 6e 20 61 20 62 72 61 6e 63 68 irst on a branch 8f20: 20 68 61 76 65 20 74 68 61 74 0a 09 23 20 62 72 have that..# br 8f30: 61 6e 63 68 20 61 73 20 74 68 65 69 72 20 70 72 anch as their pr 8f40: 65 64 65 63 65 73 73 6f 72 2e 20 4e 6f 74 65 20 edecessor. Note 8f50: 74 68 61 74 20 72 65 76 69 73 69 6f 6e 73 20 63 that revisions c 8f60: 61 6e 6e 6f 74 20 62 65 0a 09 23 20 6f 6e 20 74 annot be..# on t 8f70: 61 67 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20 ags in the same 8f80: 6d 61 6e 6e 65 72 2c 20 73 6f 20 74 61 67 73 20 manner, so tags 8f90: 63 61 6e 6e 6f 74 20 62 65 20 70 72 65 64 65 63 cannot be predec 8fa0: 65 73 73 6f 72 73 0a 09 23 20 6f 66 20 72 65 76 essors..# of rev 8fb0: 69 73 69 6f 6e 73 2e 20 54 68 69 73 20 63 6f 6d isions. This com 8fc0: 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 74 68 plements that th 8fd0: 65 79 20 68 61 76 65 20 6e 6f 20 73 75 63 63 65 ey have no succe 8fe0: 73 73 6f 72 73 0a 09 23 20 28 53 65 65 20 73 79 ssors..# (See sy 8ff0: 6d 3a 3a 74 61 67 2f 73 75 63 63 65 73 73 6f 72 m::tag/successor 9000: 73 29 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 s)....foreach {r 9010: 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 id parent} [stat 9020: 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c e run ".. SEL 9030: 45 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 69 64 ECT R.rid, B.bid 9040: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 .. FROM rev 9050: 69 73 69 6f 6e 20 52 2c 20 62 72 61 6e 63 68 20 ision R, branch 9060: 42 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e B.. WHERE R. 9070: 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 rid IN $theset.. 9080: 20 20 20 20 41 4e 44 20 20 20 20 42 2e 66 69 72 AND B.fir 9090: 73 74 20 3d 20 52 2e 72 69 64 0a 09 22 5d 20 7b st = R.rid.."] { 90a0: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 .. lappend de 90b0: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 pendencies([list 90c0: 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c 69 73 rev $rid]) [lis 90d0: 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 70 t sym::branch $p 90e0: 61 72 65 6e 74 5d 0a 09 7d 0a 09 72 65 74 75 72 arent]..}..retur 90f0: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 n. }.. # r 9100: 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 63 68 esult = list (ch 9110: 61 6e 67 65 73 65 74 2d 69 64 29 0a 20 20 20 20 angeset-id). 9120: 74 79 70 65 6d 65 74 68 6f 64 20 63 73 5f 73 75 typemethod cs_su 9130: 63 63 65 73 73 6f 72 73 20 7b 72 65 76 69 73 69 ccessors {revisi 9140: 6f 6e 73 7d 20 7b 0a 20 20 20 20 20 20 20 20 23 ons} {. # 9150: 20 54 68 69 73 20 69 73 20 61 20 76 61 72 69 61 This is a varia 9160: 6e 74 20 6f 66 20 27 73 75 63 63 65 73 73 6f 72 nt of 'successor 9170: 73 27 20 77 68 69 63 68 20 6d 61 70 73 20 74 68 s' which maps th 9180: 65 20 6c 6f 77 2d 6c 65 76 65 6c 0a 20 20 20 20 e low-level. 9190: 20 20 20 20 23 20 64 61 74 61 20 64 69 72 65 63 # data direc 91a0: 74 6c 79 20 74 6f 20 74 68 65 20 61 73 73 6f 63 tly to the assoc 91b0: 69 61 74 65 64 20 63 68 61 6e 67 65 73 65 74 73 iated changesets 91c0: 2e 20 49 2e 65 2e 20 69 6e 73 74 65 61 64 0a 20 . I.e. instead. 91d0: 20 20 20 20 20 20 20 23 20 6d 69 6c 6c 69 6f 6e # million 91e0: 73 20 6f 66 20 64 65 70 65 6e 64 65 6e 63 79 20 s of dependency 91f0: 70 61 69 72 73 20 28 69 6e 20 65 78 74 72 65 6d pairs (in extrem 9200: 65 20 63 61 73 65 73 20 28 45 78 61 6d 70 6c 65 e cases (Example 9210: 3a 20 54 63 6c 0a 20 20 20 20 20 20 20 20 23 20 : Tcl. # 9220: 43 56 53 29 29 20 77 65 20 72 65 74 75 72 6e 20 CVS)) we return 9230: 61 20 76 65 72 79 20 73 68 6f 72 74 20 61 6e 64 a very short and 9240: 20 6d 75 63 68 20 6d 6f 72 65 20 6d 61 6e 61 67 much more manag 9250: 65 61 62 6c 65 20 6c 69 73 74 0a 20 20 20 20 20 eable list. 9260: 20 20 20 23 20 6f 66 20 63 68 61 6e 67 65 73 65 # of changese 9270: 74 73 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74 ts....set theset 9280: 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 ('[join $revisi 9290: 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 ons {','}]')..re 92a0: 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 turn [state run 92b0: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 43 2e ".. SELECT C. 92c0: 63 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 cid.. FROM 92d0: 72 65 76 69 73 69 6f 6e 20 52 2c 20 63 73 69 74 revision R, csit 92e0: 65 6d 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74 em CI, changeset 92f0: 20 43 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 C.. WHERE R 9300: 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 .rid IN $these 9310: 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 t -- Restric 9320: 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f t to revisions o 9330: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 f interest.. 9340: 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49 AND R.child I 9350: 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d S NOT NULL -- 9360: 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 68 69 Has primary chi 9370: 6c 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 ld. A 9380: 4e 44 20 20 20 20 43 49 2e 69 69 64 20 3d 20 52 ND CI.iid = R 9390: 2e 63 68 69 6c 64 0a 20 20 20 20 20 20 20 20 20 .child. 93a0: 20 20 20 41 4e 44 20 20 20 20 43 2e 63 69 64 20 AND C.cid 93b0: 3d 20 43 49 2e 63 69 64 0a 20 20 20 20 20 20 20 = CI.cid. 93c0: 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e 74 79 AND C.ty 93d0: 70 65 20 3d 20 30 0a 20 20 20 20 55 4e 49 4f 4e pe = 0. UNION 93e0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 43 2e 63 .. SELECT C.c 93f0: 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 id.. FROM r 9400: 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 evision R, revis 9410: 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64 72 65 ionbranchchildre 9420: 6e 20 42 2c 20 63 73 69 74 65 6d 20 43 49 2c 20 n B, csitem CI, 9430: 63 68 61 6e 67 65 73 65 74 20 43 0a 09 20 20 20 changeset C.. 9440: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 WHERE R.rid 9450: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d IN $theset - 9460: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 - Restrict to re 9470: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 visions of inter 9480: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 est.. AND 9490: 52 2e 72 69 64 20 3d 20 42 2e 72 69 64 20 20 20 R.rid = B.rid 94a0: 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 -- Select 94b0: 20 73 75 62 73 65 74 20 6f 66 20 62 72 61 6e 63 subset of branc 94c0: 68 20 63 68 69 6c 64 72 65 6e 0a 20 20 20 20 20 h children. 94d0: 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 49 AND CI 94e0: 2e 69 69 64 20 3d 20 42 2e 62 72 69 64 0a 20 20 .iid = B.brid. 94f0: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 AND 9500: 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69 64 0a C.cid = CI.cid. 9510: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 AND 9520: 20 20 20 43 2e 74 79 70 65 20 3d 20 30 0a 20 20 C.type = 0. 9530: 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 53 45 4c UNION.. SEL 9540: 45 43 54 20 43 2e 63 69 64 0a 09 20 20 20 20 46 ECT C.cid.. F 9550: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 ROM revision R 9560: 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 2c 20 63 , revision RA, c 9570: 73 69 74 65 6d 20 43 49 2c 20 63 68 61 6e 67 65 sitem CI, change 9580: 73 65 74 20 43 0a 09 20 20 20 20 57 48 45 52 45 set C.. WHERE 9590: 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 R.rid IN $th 95a0: 65 73 65 74 20 20 20 20 20 20 2d 2d 20 52 65 73 eset -- Res 95b0: 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f trict to revisio 95c0: 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 ns of interest.. 95d0: 20 20 20 20 41 4e 44 20 20 20 20 52 2e 69 73 64 AND R.isd 95e0: 65 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20 efault 95f0: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 -- Restrict t 9600: 6f 20 4e 54 44 42 0a 09 20 20 20 20 41 4e 44 20 o NTDB.. AND 9610: 20 20 20 52 2e 64 62 63 68 69 6c 64 20 49 53 20 R.dbchild IS 9620: 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d 20 61 6e NOT NULL -- an 9630: 64 20 6c 61 73 74 20 4e 54 44 42 20 62 65 6c 6f d last NTDB belo 9640: 6e 67 69 6e 67 20 74 6f 20 74 72 75 6e 6b 0a 09 nging to trunk.. 9650: 20 20 20 20 41 4e 44 20 20 20 20 52 41 2e 72 69 AND RA.ri 9660: 64 20 3d 20 52 2e 64 62 63 68 69 6c 64 20 20 20 d = R.dbchild 9670: 20 20 20 2d 2d 20 47 6f 20 64 69 72 65 63 74 6c -- Go directl 9680: 79 20 74 6f 20 74 72 75 6e 6b 20 72 6f 6f 74 0a y to trunk root. 9690: 09 20 20 20 20 41 4e 44 20 20 20 20 52 41 2e 63 . AND RA.c 96a0: 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c hild IS NOT NULL 96b0: 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d 61 -- Has prima 96c0: 72 79 20 63 68 69 6c 64 2e 0a 20 20 20 20 20 20 ry child.. 96d0: 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 49 2e AND CI. 96e0: 69 69 64 20 3d 20 52 41 2e 63 68 69 6c 64 0a 20 iid = RA.child. 96f0: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 AND 9700: 20 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69 64 C.cid = CI.cid 9710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 . AND 9720: 20 20 20 20 43 2e 74 79 70 65 20 3d 20 30 0a 20 C.type = 0. 9730: 20 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 53 45 UNION.. SE 9740: 4c 45 43 54 20 43 2e 63 69 64 0a 09 20 20 20 20 LECT C.cid.. 9750: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 FROM revision 9760: 52 2c 20 74 61 67 20 54 2c 20 63 73 69 74 65 6d R, tag T, csitem 9770: 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43 CI, changeset C 9780: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 .. WHERE R.r 9790: 69 64 20 69 6e 20 24 74 68 65 73 65 74 0a 09 20 id in $theset.. 97a0: 20 20 20 41 4e 44 20 20 20 20 54 2e 72 65 76 20 AND T.rev 97b0: 3d 20 52 2e 72 69 64 0a 20 20 20 20 20 20 20 20 = R.rid. 97c0: 20 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69 AND CI.ii 97d0: 64 20 3d 20 54 2e 74 69 64 0a 20 20 20 20 20 20 d = T.tid. 97e0: 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e 63 AND C.c 97f0: 69 64 20 3d 20 43 49 2e 63 69 64 0a 20 20 20 20 id = CI.cid. 9800: 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 AND C 9810: 2e 74 79 70 65 20 3d 20 31 0a 20 20 20 20 55 4e .type = 1. UN 9820: 49 4f 4e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 ION.. SELECT 9830: 43 2e 63 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 C.cid.. FROM 9840: 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 62 72 revision R, br 9850: 61 6e 63 68 20 42 2c 20 63 73 69 74 65 6d 20 43 anch B, csitem C 9860: 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43 0a 09 I, changeset C.. 9870: 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 WHERE R.rid 9880: 20 69 6e 20 24 74 68 65 73 65 74 0a 09 20 20 20 in $theset.. 9890: 20 41 4e 44 20 20 20 20 42 2e 72 6f 6f 74 20 3d AND B.root = 98a0: 20 52 2e 72 69 64 0a 20 20 20 20 20 20 20 20 20 R.rid. 98b0: 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69 64 AND CI.iid 98c0: 20 3d 20 42 2e 62 69 64 0a 20 20 20 20 20 20 20 = B.bid. 98d0: 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e 63 69 AND C.ci 98e0: 64 20 3d 20 43 49 2e 63 69 64 0a 20 20 20 20 20 d = CI.cid. 98f0: 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e AND C. 9900: 74 79 70 65 20 3d 20 32 0a 09 22 5d 0a 20 20 20 type = 2.."]. 9910: 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 }.}..# # ## ### 9920: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 ##### ######## 9930: 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23 ############# ## 9940: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 ################ 9950: 23 23 23 0a 23 23 20 48 65 6c 70 65 72 20 73 69 ###.## Helper si 9960: 6e 67 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 ngleton. Command 9970: 73 20 66 6f 72 20 74 61 67 20 73 79 6d 62 6f 6c s for tag symbol 9980: 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e changesets...sn 9990: 69 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 it::type ::vc::f 99a0: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 ossil::import::c 99b0: 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 vs::project::rev 99c0: 3a 3a 73 79 6d 3a 3a 74 61 67 20 7b 0a 20 20 20 ::sym::tag {. 99d0: 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 72 65 typemethod byre 99e0: 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75 vision {} { retu 99f0: 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d rn 0 }. typem 9a00: 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 ethod bysymbol 9a10: 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d {} { return 1 } 9a20: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 . typemethod 9a30: 69 73 74 61 67 20 20 20 20 20 20 7b 7d 20 7b 20 istag {} { 9a40: 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 return 1 }. t 9a50: 79 70 65 6d 65 74 68 6f 64 20 69 73 62 72 61 6e ypemethod isbran 9a60: 63 68 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e ch {} { return 9a70: 20 30 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 0 }.. typeme 9a80: 74 68 6f 64 20 73 74 72 20 7b 74 61 67 7d 20 7b thod str {tag} { 9a90: 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 ..struct::list a 9aa0: 73 73 69 67 6e 20 5b 73 74 61 74 65 20 72 75 6e ssign [state run 9ab0: 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 53 {.. SELECT S 9ac0: 2e 6e 61 6d 65 2c 20 46 2e 6e 61 6d 65 2c 20 50 .name, F.name, P 9ad0: 2e 6e 61 6d 65 0a 09 20 20 20 20 46 52 4f 4d 20 .name.. FROM 9ae0: 20 20 74 61 67 20 54 2c 20 73 79 6d 62 6f 6c 20 tag T, symbol 9af0: 53 2c 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65 S, file F, proje 9b00: 63 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 20 ct P.. WHERE 9b10: 20 54 2e 74 69 64 20 3d 20 24 74 61 67 0a 09 20 T.tid = $tag.. 9b20: 20 20 20 41 4e 44 20 20 20 20 46 2e 66 69 64 20 AND F.fid 9b30: 3d 20 54 2e 66 69 64 0a 09 20 20 20 20 41 4e 44 = T.fid.. AND 9b40: 20 20 20 20 50 2e 70 69 64 20 3d 20 46 2e 70 69 P.pid = F.pi 9b50: 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 53 2e d.. AND S. 9b60: 73 69 64 20 3d 20 54 2e 73 69 64 0a 09 7d 5d 20 sid = T.sid..}] 9b70: 73 6e 61 6d 65 20 66 6e 61 6d 65 20 70 6e 61 6d sname fname pnam 9b80: 65 0a 09 72 65 74 75 72 6e 20 22 24 70 6e 61 6d e..return "$pnam 9b90: 65 2f 54 27 24 7b 73 6e 61 6d 65 7d 27 3a 3a 24 e/T'${sname}'::$ 9ba0: 66 6e 61 6d 65 22 0a 20 20 20 20 7d 0a 0a 20 20 fname". }.. 9bb0: 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73 # result = lis 9bc0: 74 20 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74 t (mintime, maxt 9bd0: 69 6d 65 29 0a 20 20 20 20 74 79 70 65 6d 65 74 ime). typemet 9be0: 68 6f 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 74 hod timerange {t 9bf0: 61 67 73 7d 20 7b 0a 09 23 20 54 68 65 20 72 61 ags} {..# The ra 9c00: 6e 67 65 20 69 73 20 64 65 66 69 6e 65 64 20 61 nge is defined a 9c10: 73 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 74 s the range of t 9c20: 68 65 20 72 65 76 69 73 69 6f 6e 73 20 74 68 65 he revisions the 9c30: 20 74 61 67 73 0a 09 23 20 61 72 65 20 61 74 74 tags..# are att 9c40: 61 63 68 65 64 20 74 6f 2e 0a 0a 09 73 65 74 20 ached to....set 9c50: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 theset ('[join $ 9c60: 74 61 67 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 tags {','}]')..r 9c70: 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e eturn [state run 9c80: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 4d ".. SELECT M 9c90: 49 4e 28 52 2e 64 61 74 65 29 2c 20 4d 41 58 28 IN(R.date), MAX( 9ca0: 52 2e 64 61 74 65 29 0a 09 20 20 20 20 46 52 4f R.date).. FRO 9cb0: 4d 20 20 20 74 61 67 20 54 2c 20 72 65 76 69 73 M tag T, revis 9cc0: 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 ion R.. WHERE 9cd0: 20 20 54 2e 74 69 64 20 49 4e 20 24 74 68 65 73 T.tid IN $thes 9ce0: 65 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 et. A 9cf0: 4e 44 20 20 20 20 52 2e 72 69 64 20 3d 20 54 2e ND R.rid = T. 9d00: 72 65 76 0a 09 22 5d 0a 20 20 20 20 7d 0a 0a 20 rev.."]. }.. 9d10: 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 # var(dv) = d 9d20: 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 ict (item -> lis 9d30: 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 t (item)), item 9d40: 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69 64 = list (type id 9d50: 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 ). typemethod 9d60: 20 73 75 63 63 65 73 73 6f 72 73 20 7b 64 76 20 successors {dv 9d70: 74 61 67 73 7d 20 7b 0a 09 23 20 54 61 67 73 20 tags} {..# Tags 9d80: 68 61 76 65 20 6e 6f 20 73 75 63 63 65 73 73 6f have no successo 9d90: 72 73 2e 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 rs...return. 9da0: 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 }.. # result 9db0: 3d 20 34 2d 6c 69 73 74 20 28 69 74 65 6d 74 79 = 4-list (itemty 9dc0: 70 65 20 69 74 65 6d 69 64 20 6e 65 78 74 69 74 pe itemid nextit 9dd0: 65 6d 74 79 70 65 20 6e 65 78 74 69 74 65 6d 69 emtype nextitemi 9de0: 64 20 2e 2e 2e 29 0a 20 20 20 20 74 79 70 65 6d d ...). typem 9df0: 65 74 68 6f 64 20 6c 6f 6f 70 73 20 7b 74 61 67 ethod loops {tag 9e00: 73 7d 20 7b 0a 09 23 20 54 61 67 73 20 68 61 76 s} {..# Tags hav 9e10: 65 20 6e 6f 20 73 75 63 63 65 73 73 6f 72 73 2c e no successors, 9e20: 20 74 68 65 72 65 66 6f 72 65 20 63 61 6e 6e 6f therefore canno 9e30: 74 20 63 61 75 73 65 20 6c 6f 6f 70 73 0a 09 72 t cause loops..r 9e40: 65 74 75 72 6e 20 7b 7d 0a 20 20 20 20 7d 0a 0a eturn {}. }.. 9e50: 20 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 # var(dv) = 9e60: 64 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 dict (item -> li 9e70: 73 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d st (item)), item 9e80: 20 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69 = list (type i 9e90: 64 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f d). typemetho 9ea0: 64 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 7b d predecessors { 9eb0: 64 76 20 74 61 67 73 7d 20 7b 0a 09 75 70 76 61 dv tags} {..upva 9ec0: 72 20 31 20 24 64 76 20 64 65 70 65 6e 64 65 6e r 1 $dv dependen 9ed0: 63 69 65 73 0a 09 23 20 54 68 65 20 70 72 65 64 cies..# The pred 9ee0: 65 63 65 73 73 6f 72 73 20 6f 66 20 61 20 74 61 ecessors of a ta 9ef0: 67 20 61 72 65 20 61 6c 6c 20 74 68 65 20 72 65 g are all the re 9f00: 76 69 73 69 6f 6e 73 20 74 68 65 20 74 61 67 73 visions the tags 9f10: 20 61 72 65 0a 09 23 20 61 74 74 61 63 68 65 64 are..# attached 9f20: 20 74 6f 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 to, as well as 9f30: 61 6c 6c 20 74 68 65 20 62 72 61 6e 63 68 65 73 all the branches 9f40: 20 6f 72 20 74 61 67 73 20 77 68 69 63 68 20 61 or tags which a 9f50: 72 65 0a 09 23 20 74 68 65 69 72 20 70 72 65 66 re..# their pref 9f60: 65 72 65 64 20 70 61 72 65 6e 74 73 2e 0a 0a 09 ered parents.... 9f70: 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f set theset ('[jo 9f80: 69 6e 20 24 74 61 67 73 20 7b 27 2c 27 7d 5d 27 in $tags {','}]' 9f90: 29 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 )..foreach {tid 9fa0: 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 parent} [state r 9fb0: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 un ".. SELECT 9fc0: 20 54 2e 74 69 64 2c 20 52 2e 72 69 64 0a 09 20 T.tid, R.rid.. 9fd0: 20 20 20 46 52 4f 4d 20 20 20 74 61 67 20 54 2c FROM tag T, 9fe0: 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 revision R.. 9ff0: 20 57 48 45 52 45 20 20 54 2e 74 69 64 20 49 4e WHERE T.tid IN a000: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e $theset.. AN a010: 44 20 20 20 20 54 2e 72 65 76 20 3d 20 52 2e 72 D T.rev = R.r a020: 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 id.."] {.. la a030: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 ppend dependenci a040: 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 es([list sym::ta a050: 67 20 24 74 69 64 5d 29 20 5b 6c 69 73 74 20 72 g $tid]) [list r a060: 65 76 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 0a ev $parent]..}.. a070: 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 70 61 .foreach {tid pa a080: 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e rent} [state run a090: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 54 ".. SELECT T a0a0: 2e 74 69 64 2c 20 42 2e 62 69 64 0a 09 20 20 20 .tid, B.bid.. a0b0: 20 46 52 4f 4d 20 20 20 74 61 67 20 54 2c 20 70 FROM tag T, p a0c0: 72 65 66 65 72 65 64 70 61 72 65 6e 74 20 50 2c referedparent P, a0d0: 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20 20 57 branch B.. W a0e0: 48 45 52 45 20 20 54 2e 74 69 64 20 49 4e 20 24 HERE T.tid IN $ a0f0: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 theset.. AND a100: 20 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 69 64 T.sid = P.sid a110: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70 .. AND P.p a120: 69 64 20 3d 20 42 2e 73 69 64 0a 09 22 5d 20 7b id = B.sid.."] { a130: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 .. lappend de a140: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 pendencies([list a150: 20 73 79 6d 3a 3a 74 61 67 20 24 74 69 64 5d 29 sym::tag $tid]) a160: 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e [list sym::bran a170: 63 68 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 0a ch $parent]..}.. a180: 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 70 61 .foreach {tid pa a190: 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e rent} [state run a1a0: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 54 ".. SELECT T a1b0: 2e 74 69 64 2c 20 54 58 2e 74 69 64 0a 09 20 20 .tid, TX.tid.. a1c0: 20 20 46 52 4f 4d 20 20 20 74 61 67 20 54 2c 20 FROM tag T, a1d0: 70 72 65 66 65 72 65 64 70 61 72 65 6e 74 20 50 preferedparent P a1e0: 2c 20 74 61 67 20 54 58 0a 09 20 20 20 20 57 48 , tag TX.. WH a1f0: 45 52 45 20 20 54 2e 74 69 64 20 49 4e 20 24 74 ERE T.tid IN $t a200: 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 heset.. AND a210: 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a T.sid = P.sid. a220: 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69 . AND P.pi a230: 64 20 3d 20 54 58 2e 73 69 64 0a 09 22 5d 20 7b d = TX.sid.."] { a240: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 .. lappend de a250: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 pendencies([list a260: 20 73 79 6d 3a 3a 74 61 67 20 24 74 69 64 5d 29 sym::tag $tid]) a270: 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 [list sym::tag a280: 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 72 65 74 $parent]..}..ret a290: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 urn. }.. # a2a0: 20 72 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 result = list ( a2b0: 63 68 61 6e 67 65 73 65 74 2d 69 64 29 0a 20 20 changeset-id). a2c0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 63 73 5f typemethod cs_ a2d0: 73 75 63 63 65 73 73 6f 72 73 20 7b 74 61 67 73 successors {tags a2e0: 7d 20 7b 0a 09 23 20 54 61 67 73 20 68 61 76 65 } {..# Tags have a2f0: 20 6e 6f 20 73 75 63 63 65 73 73 6f 72 73 2e 0a no successors.. a300: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 7d 0a .return. }.}. a310: 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 .# # ## ### #### a320: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 # ######## ##### a330: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 ######## ####### a340: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 ##############.# a350: 23 20 48 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 # Helper singlet a360: 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20 66 6f 72 on. Commands for a370: 20 62 72 61 6e 63 68 20 73 79 6d 62 6f 6c 20 63 branch symbol c a380: 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e 69 74 hangesets...snit a390: 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f 73 ::type ::vc::fos a3a0: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 sil::import::cvs a3b0: 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a ::project::rev:: a3c0: 73 79 6d 3a 3a 62 72 61 6e 63 68 20 7b 0a 20 20 sym::branch {. a3d0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 72 typemethod byr a3e0: 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 evision {} { ret a3f0: 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65 urn 0 }. type a400: 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 method bysymbol a410: 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 {} { return 1 a420: 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 }. typemethod a430: 20 69 73 74 61 67 20 20 20 20 20 20 7b 7d 20 7b istag {} { a440: 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20 return 0 }. a450: 74 79 70 65 6d 65 74 68 6f 64 20 69 73 62 72 61 typemethod isbra a460: 6e 63 68 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 nch {} { retur a470: 6e 20 31 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d n 1 }.. typem a480: 65 74 68 6f 64 20 73 74 72 20 7b 62 72 61 6e 63 ethod str {branc a490: 68 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c 69 h} {..struct::li a4a0: 73 74 20 61 73 73 69 67 6e 20 5b 73 74 61 74 65 st assign [state a4b0: 20 72 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c 45 run {.. SELE a4c0: 43 54 20 53 2e 6e 61 6d 65 2c 20 46 2e 6e 61 6d CT S.name, F.nam a4d0: 65 2c 20 50 2e 6e 61 6d 65 0a 09 20 20 20 20 46 e, P.name.. F a4e0: 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20 ROM branch B, a4f0: 73 79 6d 62 6f 6c 20 53 2c 20 66 69 6c 65 20 46 symbol S, file F a500: 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09 20 20 20 , project P.. a510: 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 3d 20 WHERE B.bid = a520: 24 62 72 61 6e 63 68 0a 09 20 20 20 20 41 4e 44 $branch.. AND a530: 20 20 20 20 46 2e 66 69 64 20 3d 20 42 2e 66 69 F.fid = B.fi a540: 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e d.. AND P. a550: 70 69 64 20 3d 20 46 2e 70 69 64 0a 09 20 20 20 pid = F.pid.. a560: 20 41 4e 44 20 20 20 20 53 2e 73 69 64 20 3d 20 AND S.sid = a570: 42 2e 73 69 64 0a 09 7d 5d 20 73 6e 61 6d 65 20 B.sid..}] sname a580: 66 6e 61 6d 65 20 70 6e 61 6d 65 0a 09 72 65 74 fname pname..ret a590: 75 72 6e 20 22 24 70 6e 61 6d 65 2f 42 27 24 7b urn "$pname/B'${ a5a0: 73 6e 61 6d 65 7d 27 3a 3a 24 66 6e 61 6d 65 22 sname}'::$fname" a5b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 . }.. # re a5c0: 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69 6e sult = list (min a5d0: 74 69 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a 20 time, maxtime). a5e0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 74 69 typemethod ti a5f0: 6d 65 72 61 6e 67 65 20 7b 62 72 61 6e 63 68 65 merange {branche a600: 73 7d 20 7b 0a 09 23 20 54 68 65 20 72 61 6e 67 s} {..# The rang a610: 65 20 6f 66 20 61 20 62 72 61 6e 63 68 20 69 73 e of a branch is a620: 20 64 65 66 69 6e 65 64 20 61 73 20 74 68 65 20 defined as the a630: 72 61 6e 67 65 20 6f 66 20 74 68 65 0a 09 23 20 range of the..# a640: 72 65 76 69 73 69 6f 6e 73 20 74 68 65 20 62 72 revisions the br a650: 61 6e 63 68 65 73 20 61 72 65 20 73 70 61 77 6e anches are spawn a660: 65 64 20 62 79 2e 20 4e 4f 54 45 20 68 6f 77 65 ed by. NOTE howe a670: 76 65 72 20 74 68 61 74 20 74 68 65 0a 09 23 20 ver that the..# a680: 62 72 61 6e 63 68 65 73 20 61 73 73 6f 63 69 61 branches associa a690: 74 65 64 20 77 69 74 68 20 61 20 64 65 74 61 63 ted with a detac a6a0: 68 65 64 20 4e 54 44 42 20 77 69 6c 6c 20 68 61 hed NTDB will ha a6b0: 76 65 20 6e 6f 20 72 6f 6f 74 0a 09 23 20 73 70 ve no root..# sp a6c0: 61 77 6e 69 6e 67 20 74 68 65 6d 2c 20 68 65 6e awning them, hen a6d0: 63 65 20 74 68 65 79 20 68 61 76 65 20 6e 6f 20 ce they have no a6e0: 72 65 61 6c 20 74 69 6d 65 72 61 6e 67 65 20 61 real timerange a a6f0: 6e 79 0a 09 23 20 6c 6f 6e 67 65 72 2e 20 42 79 ny..# longer. By a700: 20 75 73 69 6e 67 20 30 20 77 65 20 70 75 74 20 using 0 we put a710: 74 68 65 6d 20 69 6e 20 66 72 6f 6e 74 20 6f 66 them in front of a720: 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 everything else a730: 2c 0a 09 23 20 61 73 20 74 68 65 79 20 6c 6f 67 ,..# as they log a740: 69 63 61 6c 6c 79 20 61 72 65 2e 0a 0a 09 73 65 ically are....se a750: 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e t theset ('[join a760: 20 24 62 72 61 6e 63 68 65 73 20 7b 27 2c 27 7d $branches {','} a770: 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61 ]')..return [sta a780: 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 te run ".. SE a790: 4c 45 43 54 20 49 46 4e 55 4c 4c 28 4d 49 4e 28 LECT IFNULL(MIN( a7a0: 52 2e 64 61 74 65 29 2c 30 29 2c 20 49 46 4e 55 R.date),0), IFNU a7b0: 4c 4c 28 4d 41 58 28 52 2e 64 61 74 65 29 2c 30 LL(MAX(R.date),0 a7c0: 29 0a 09 20 20 20 20 46 52 4f 4d 20 20 62 72 61 ).. FROM bra a7d0: 6e 63 68 20 42 2c 20 72 65 76 69 73 69 6f 6e 20 nch B, revision a7e0: 52 0a 09 20 20 20 20 57 48 45 52 45 20 42 2e 62 R.. WHERE B.b a7f0: 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 20 20 id IN $theset. a800: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 AND a810: 52 2e 72 69 64 20 3d 20 42 2e 72 6f 6f 74 0a 09 R.rid = B.root.. a820: 22 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 "]. }.. # a830: 72 65 73 75 6c 74 20 3d 20 34 2d 6c 69 73 74 20 result = 4-list a840: 28 69 74 65 6d 74 79 70 65 20 69 74 65 6d 69 64 (itemtype itemid a850: 20 6e 65 78 74 69 74 65 6d 74 79 70 65 20 6e 65 nextitemtype ne a860: 78 74 69 74 65 6d 69 64 20 2e 2e 2e 29 0a 20 20 xtitemid ...). a870: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c 6f 6f typemethod loo a880: 70 73 20 7b 62 72 61 6e 63 68 65 73 7d 20 7b 0a ps {branches} {. a890: 09 23 20 4e 6f 74 65 3a 20 52 65 76 69 73 69 6f .# Note: Revisio a8a0: 6e 73 20 61 6e 64 20 74 61 67 73 20 63 61 6e 6e ns and tags cann a8b0: 6f 74 20 63 61 75 73 65 20 74 68 65 20 6c 6f 6f ot cause the loo a8c0: 70 2e 20 42 65 69 6e 67 20 6f 66 20 61 0a 09 23 p. Being of a..# a8d0: 20 66 75 6e 64 61 6d 65 6e 74 61 6c 6c 79 20 64 fundamentally d a8e0: 69 66 66 65 72 65 6e 74 20 74 79 70 65 20 74 68 ifferent type th a8f0: 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 69 6e 20 ey cannot be in a900: 74 68 65 20 69 6e 63 6f 6d 69 6e 67 0a 09 23 20 the incoming..# a910: 73 65 74 20 6f 66 20 69 64 73 2e 0a 0a 09 73 65 set of ids....se a920: 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e t theset ('[join a930: 20 24 62 72 61 6e 63 68 65 73 20 7b 27 2c 27 7d $branches {','} a940: 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61 ]')..return [sta a950: 74 65 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e te run [subst -n a960: 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 ocommands -nobac a970: 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20 20 20 kslashes {.. a980: 53 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 42 58 SELECT B.bid, BX a990: 2e 62 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 .bid.. FROM a9a0: 20 62 72 61 6e 63 68 20 42 2c 20 70 72 65 66 65 branch B, prefe a9b0: 72 65 64 70 61 72 65 6e 74 20 50 2c 20 62 72 61 redparent P, bra a9c0: 6e 63 68 20 42 58 0a 09 20 20 20 20 57 48 45 52 nch BX.. WHER a9d0: 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 E B.bid IN $the a9e0: 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 set.. AND a9f0: 42 2e 73 69 64 20 3d 20 50 2e 70 69 64 0a 09 20 B.sid = P.pid.. aa00: 20 20 20 41 4e 44 20 20 20 20 42 58 2e 73 69 64 AND BX.sid aa10: 20 3d 20 50 2e 73 69 64 0a 09 20 20 20 20 41 4e = P.sid.. AN aa20: 44 20 20 20 20 42 58 2e 62 69 64 20 49 4e 20 24 D BX.bid IN $ aa30: 74 68 65 73 65 74 0a 09 7d 5d 5d 0a 20 20 20 20 theset..}]]. aa40: 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76 29 }.. # var(dv) aa50: 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d 3e = dict (item -> aa60: 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c 20 69 list (item)), i aa70: 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 79 70 tem = list (typ aa80: 65 20 69 64 29 0a 20 20 20 20 74 79 70 65 6d 65 e id). typeme aa90: 74 68 6f 64 20 73 75 63 63 65 73 73 6f 72 73 20 thod successors aaa0: 7b 64 76 20 62 72 61 6e 63 68 65 73 7d 20 7b 0a {dv branches} {. aab0: 09 75 70 76 61 72 20 31 20 24 64 76 20 64 65 70 .upvar 1 $dv dep aac0: 65 6e 64 65 6e 63 69 65 73 0a 09 23 20 54 68 65 endencies..# The aad0: 20 66 69 72 73 74 20 72 65 76 69 73 69 6f 6e 20 first revision aae0: 63 6f 6d 6d 69 74 74 65 64 20 6f 6e 20 61 20 62 committed on a b aaf0: 72 61 6e 63 68 2c 20 61 6e 64 20 61 6c 6c 20 62 ranch, and all b ab00: 72 61 6e 63 68 65 73 0a 09 23 20 61 6e 64 20 74 ranches..# and t ab10: 61 67 73 20 77 68 69 63 68 20 68 61 76 65 20 69 ags which have i ab20: 74 20 61 73 20 74 68 65 69 72 20 70 72 65 66 65 t as their prefe ab30: 72 65 64 20 70 61 72 65 6e 74 20 61 72 65 20 74 red parent are t ab40: 68 65 0a 09 23 20 73 75 63 63 65 73 73 6f 72 73 he..# successors ab50: 20 6f 66 20 61 20 62 72 61 6e 63 68 2e 0a 0a 09 of a branch.... ab60: 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f set theset ('[jo ab70: 69 6e 20 24 62 72 61 6e 63 68 65 73 20 7b 27 2c in $branches {', ab80: 27 7d 5d 27 29 0a 09 66 6f 72 65 61 63 68 20 7b '}]')..foreach { ab90: 62 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 bid child} [stat aba0: 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c e run ".. SEL abb0: 45 43 54 20 42 2e 62 69 64 2c 20 52 2e 72 69 64 ECT B.bid, R.rid abc0: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 .. FROM bra abd0: 6e 63 68 20 42 2c 20 72 65 76 69 73 69 6f 6e 20 nch B, revision abe0: 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e R.. WHERE B. abf0: 62 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 bid IN $theset.. ac00: 20 20 20 20 41 4e 44 20 20 20 20 42 2e 66 69 72 AND B.fir ac10: 73 74 20 3d 20 52 2e 72 69 64 0a 09 22 5d 20 7b st = R.rid.."] { ac20: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 .. lappend de ac30: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 pendencies([list ac40: 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 62 69 sym::branch $bi ac50: 64 5d 29 20 5b 6c 69 73 74 20 72 65 76 20 24 63 d]) [list rev $c ac60: 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 hild]..}..foreac ac70: 68 20 7b 62 69 64 20 63 68 69 6c 64 7d 20 5b 73 h {bid child} [s ac80: 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 tate run ".. ac90: 53 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 42 58 SELECT B.bid, BX aca0: 2e 62 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 .bid.. FROM acb0: 20 62 72 61 6e 63 68 20 42 2c 20 70 72 65 66 65 branch B, prefe acc0: 72 65 64 70 61 72 65 6e 74 20 50 2c 20 62 72 61 redparent P, bra acd0: 6e 63 68 20 42 58 0a 09 20 20 20 20 57 48 45 52 nch BX.. WHER ace0: 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 E B.bid IN $the acf0: 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 set.. AND ad00: 42 2e 73 69 64 20 3d 20 50 2e 70 69 64 0a 09 20 B.sid = P.pid.. ad10: 20 20 20 41 4e 44 20 20 20 20 42 58 2e 73 69 64 AND BX.sid ad20: 20 3d 20 50 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 = P.sid.."] {.. ad30: 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 lappend depe ad40: 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 ndencies([list s ad50: 79 6d 3a 3a 62 72 61 6e 63 68 20 24 62 69 64 5d ym::branch $bid] ad60: 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 ) [list sym::bra ad70: 6e 63 68 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 nch $child]..}.. ad80: 66 6f 72 65 61 63 68 20 7b 62 69 64 20 63 68 69 foreach {bid chi ad90: 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 ld} [state run " ada0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62 .. SELECT B.b adb0: 69 64 2c 20 54 2e 74 69 64 0a 09 20 20 20 20 46 id, T.tid.. F adc0: 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20 ROM branch B, add0: 70 72 65 66 65 72 65 64 70 61 72 65 6e 74 20 50 preferedparent P ade0: 2c 20 74 61 67 20 54 0a 09 20 20 20 20 57 48 45 , tag T.. WHE adf0: 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68 RE B.bid IN $th ae00: 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 eset.. AND ae10: 20 42 2e 73 69 64 20 3d 20 50 2e 70 69 64 0a 09 B.sid = P.pid.. ae20: 20 20 20 20 41 4e 44 20 20 20 20 54 2e 73 69 64 AND T.sid ae30: 20 3d 20 50 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 = P.sid.."] {.. ae40: 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 lappend depe ae50: 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 ndencies([list s ae60: 79 6d 3a 3a 62 72 61 6e 63 68 20 24 62 69 64 5d ym::branch $bid] ae70: 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 ) [list sym::tag ae80: 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 72 65 74 $child]..}..ret ae90: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 urn. }.. # aea0: 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20 var(dv) = dict aeb0: 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 (item -> list (i aec0: 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c tem)), item = l aed0: 69 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 20 ist (type id). aee0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 70 72 65 typemethod pre aef0: 64 65 63 65 73 73 6f 72 73 20 7b 64 76 20 62 72 decessors {dv br af00: 61 6e 63 68 65 73 7d 20 7b 0a 09 75 70 76 61 72 anches} {..upvar af10: 20 31 20 24 64 76 20 64 65 70 65 6e 64 65 6e 63 1 $dv dependenc af20: 69 65 73 0a 09 23 20 54 68 65 20 70 72 65 64 65 ies..# The prede af30: 63 65 73 73 6f 72 73 20 6f 66 20 61 20 62 72 61 cessors of a bra af40: 6e 63 68 20 61 72 65 20 61 6c 6c 20 74 68 65 20 nch are all the af50: 72 65 76 69 73 69 6f 6e 73 20 74 68 65 0a 09 23 revisions the..# af60: 20 62 72 61 6e 63 68 65 73 20 61 72 65 20 73 70 branches are sp af70: 61 77 6e 65 64 20 66 72 6f 6d 2c 20 61 73 20 77 awned from, as w af80: 65 6c 6c 20 61 73 20 61 6c 6c 20 74 68 65 20 62 ell as all the b af90: 72 61 6e 63 68 65 73 20 6f 72 0a 09 23 20 74 61 ranches or..# ta afa0: 67 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65 gs which are the afb0: 69 72 20 70 72 65 66 65 72 65 64 20 70 61 72 65 ir prefered pare afc0: 6e 74 73 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 nts....set these afd0: 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61 6e 63 t ('[join $branc afe0: 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66 6f hes {','}]')..fo aff0: 72 65 61 63 68 20 7b 62 69 64 20 70 61 72 65 6e reach {bid paren b000: 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a t} [state run ". b010: 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 42 69 . SELECT B.Bi b020: 64 2c 20 52 2e 72 69 64 0a 09 20 20 20 20 46 52 d, R.rid.. FR b030: 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20 72 OM branch B, r b040: 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 evision R.. W b050: 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24 HERE B.bid IN $ b060: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 theset.. AND b070: 20 20 20 42 2e 72 6f 6f 74 20 3d 20 52 2e 72 69 B.root = R.ri b080: 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 d.."] {.. lap b090: 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 pend dependencie b0a0: 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 s([list sym::bra b0b0: 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 nch $bid]) [list b0c0: 20 72 65 76 20 24 70 61 72 65 6e 74 5d 0a 09 7d rev $parent]..} b0d0: 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64 20 70 ..foreach {bid p b0e0: 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 arent} [state ru b0f0: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 n ".. SELECT b100: 42 2e 62 69 64 2c 20 42 58 2e 62 69 64 0a 09 20 B.bid, BX.bid.. b110: 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 FROM branch b120: 20 42 2c 20 70 72 65 66 65 72 65 64 70 61 72 65 B, preferedpare b130: 6e 74 20 50 2c 20 62 72 61 6e 63 68 20 42 58 0a nt P, branch BX. b140: 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 . WHERE B.bi b150: 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 d IN $theset.. b160: 20 20 41 4e 44 20 20 20 20 42 2e 73 69 64 20 3d AND B.sid = b170: 20 50 2e 73 69 64 0a 09 20 20 20 20 41 4e 44 20 P.sid.. AND b180: 20 20 20 50 2e 70 69 64 20 3d 20 42 58 2e 73 69 P.pid = BX.si b190: 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 d.."] {.. lap b1a0: 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 pend dependencie b1b0: 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 s([list sym::bra b1c0: 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 nch $bid]) [list b1d0: 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 70 61 sym::branch $pa b1e0: 72 65 6e 74 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 rent]..}..foreac b1f0: 68 20 7b 62 69 64 20 70 61 72 65 6e 74 7d 20 5b h {bid parent} [ b200: 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 state run ".. b210: 20 53 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 54 SELECT B.bid, T b220: 2e 74 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 .tid.. FROM b230: 20 62 72 61 6e 63 68 20 42 2c 20 70 72 65 66 65 branch B, prefe b240: 72 65 64 70 61 72 65 6e 74 20 50 2c 20 74 61 67 redparent P, tag b250: 20 54 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 T.. WHERE B b260: 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a .bid IN $theset. b270: 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 73 69 . AND B.si b280: 64 20 3d 20 50 2e 73 69 64 0a 09 20 20 20 20 41 d = P.sid.. A b290: 4e 44 20 20 20 20 50 2e 70 69 64 20 3d 20 54 2e ND P.pid = T. b2a0: 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c sid.."] {.. l b2b0: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 append dependenc b2c0: 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 ies([list sym::b b2d0: 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c 69 ranch $bid]) [li b2e0: 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 70 61 72 st sym::tag $par b2f0: 65 6e 74 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a ent]..}..return. b300: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 }.. # res b310: 75 6c 74 20 3d 20 6c 69 73 74 20 28 63 68 61 6e ult = list (chan b320: 67 65 73 65 74 2d 69 64 29 0a 20 20 20 20 74 79 geset-id). ty b330: 70 65 6d 65 74 68 6f 64 20 63 73 5f 73 75 63 63 pemethod cs_succ b340: 65 73 73 6f 72 73 20 7b 62 72 61 6e 63 68 65 73 essors {branches b350: 7d 20 7b 0a 20 20 20 20 20 20 20 20 23 20 54 68 } {. # Th b360: 69 73 20 69 73 20 61 20 76 61 72 69 61 6e 74 20 is is a variant b370: 6f 66 20 27 73 75 63 63 65 73 73 6f 72 73 27 20 of 'successors' b380: 77 68 69 63 68 20 6d 61 70 73 20 74 68 65 20 6c which maps the l b390: 6f 77 2d 6c 65 76 65 6c 0a 20 20 20 20 20 20 20 ow-level. b3a0: 20 23 20 64 61 74 61 20 64 69 72 65 63 74 6c 79 # data directly b3b0: 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74 to the associat b3c0: 65 64 20 63 68 61 6e 67 65 73 65 74 73 2e 20 49 ed changesets. I b3d0: 2e 65 2e 20 69 6e 73 74 65 61 64 0a 20 20 20 20 .e. instead. b3e0: 20 20 20 20 23 20 6d 69 6c 6c 69 6f 6e 73 20 6f # millions o b3f0: 66 20 64 65 70 65 6e 64 65 6e 63 79 20 70 61 69 f dependency pai b400: 72 73 20 28 69 6e 20 65 78 74 72 65 6d 65 20 63 rs (in extreme c b410: 61 73 65 73 20 28 45 78 61 6d 70 6c 65 3a 20 54 ases (Example: T b420: 63 6c 0a 20 20 20 20 20 20 20 20 23 20 43 56 53 cl. # CVS b430: 29 29 20 77 65 20 72 65 74 75 72 6e 20 61 20 76 )) we return a v b440: 65 72 79 20 73 68 6f 72 74 20 61 6e 64 20 6d 75 ery short and mu b450: 63 68 20 6d 6f 72 65 20 6d 61 6e 61 67 65 61 62 ch more manageab b460: 6c 65 20 6c 69 73 74 0a 20 20 20 20 20 20 20 20 le list. b470: 23 20 6f 66 20 63 68 61 6e 67 65 73 65 74 73 2e # of changesets. b480: 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 ...set theset (' b490: 5b 6a 6f 69 6e 20 24 62 72 61 6e 63 68 65 73 20 [join $branches b4a0: 7b 27 2c 27 7d 5d 27 29 0a 20 20 20 20 20 20 20 {','}]'). b4b0: 20 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72 return [state r b4c0: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 un ".. SELECT b4d0: 20 43 2e 63 69 64 0a 09 20 20 20 20 46 52 4f 4d C.cid.. FROM b4e0: 20 20 20 62 72 61 6e 63 68 20 42 2c 20 72 65 76 branch B, rev b4f0: 69 73 69 6f 6e 20 52 2c 20 63 73 69 74 65 6d 20 ision R, csitem b500: 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43 0a CI, changeset C. b510: 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 . WHERE B.bi b520: 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 d IN $theset.. b530: 20 20 41 4e 44 20 20 20 20 42 2e 66 69 72 73 74 AND B.first b540: 20 3d 20 52 2e 72 69 64 0a 20 20 20 20 20 20 20 = R.rid. b550: 20 20 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69 AND CI.i b560: 69 64 20 3d 20 52 2e 72 69 64 0a 20 20 20 20 20 id = R.rid. b570: 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e AND C. b580: 63 69 64 20 3d 20 43 49 2e 63 69 64 0a 20 20 20 cid = CI.cid. b590: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 AND b5a0: 43 2e 74 79 70 65 20 3d 20 30 0a 20 20 20 20 55 C.type = 0. U b5b0: 4e 49 4f 4e 0a 09 20 20 20 20 53 45 4c 45 43 54 NION.. SELECT b5c0: 20 43 2e 63 69 64 0a 09 20 20 20 20 46 52 4f 4d C.cid.. FROM b5d0: 20 20 20 62 72 61 6e 63 68 20 42 2c 20 70 72 65 branch B, pre b5e0: 66 65 72 65 64 70 61 72 65 6e 74 20 50 2c 20 62 feredparent P, b b5f0: 72 61 6e 63 68 20 42 58 2c 20 63 73 69 74 65 6d ranch BX, csitem b600: 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43 CI, changeset C b610: 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 .. WHERE B.b b620: 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 id IN $theset.. b630: 20 20 20 41 4e 44 20 20 20 20 42 2e 73 69 64 20 AND B.sid b640: 3d 20 50 2e 70 69 64 0a 09 20 20 20 20 41 4e 44 = P.pid.. AND b650: 20 20 20 20 42 58 2e 73 69 64 20 3d 20 50 2e 73 BX.sid = P.s b660: 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 id. A b670: 4e 44 20 20 20 20 43 49 2e 69 69 64 20 3d 20 42 ND CI.iid = B b680: 58 2e 62 69 64 0a 20 20 20 20 20 20 20 20 20 20 X.bid. b690: 20 20 41 4e 44 20 20 20 20 43 2e 63 69 64 20 3d AND C.cid = b6a0: 20 43 49 2e 63 69 64 0a 20 20 20 20 20 20 20 20 CI.cid. b6b0: 20 20 20 20 41 4e 44 20 20 20 20 43 2e 74 79 70 AND C.typ b6c0: 65 20 3d 20 32 0a 20 20 20 20 55 4e 49 4f 4e 0a e = 2. UNION. b6d0: 09 20 20 20 20 53 45 4c 45 43 54 20 43 2e 63 69 . SELECT C.ci b6e0: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 d.. FROM br b6f0: 61 6e 63 68 20 42 2c 20 70 72 65 66 65 72 65 64 anch B, prefered b700: 70 61 72 65 6e 74 20 50 2c 20 74 61 67 20 54 2c parent P, tag T, b710: 20 63 73 69 74 65 6d 20 43 49 2c 20 63 68 61 6e csitem CI, chan b720: 67 65 73 65 74 20 43 0a 09 20 20 20 20 57 48 45 geset C.. WHE b730: 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68 RE B.bid IN $th b740: 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 eset.. AND b750: 20 42 2e 73 69 64 20 3d 20 50 2e 70 69 64 0a 09 B.sid = P.pid.. b760: 20 20 20 20 41 4e 44 20 20 20 20 54 2e 73 69 64 AND T.sid b770: 20 3d 20 50 2e 73 69 64 0a 20 20 20 20 20 20 20 = P.sid. b780: 20 20 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69 AND CI.i b790: 69 64 20 3d 20 54 2e 74 69 64 0a 20 20 20 20 20 id = T.tid. b7a0: 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e AND C. b7b0: 63 69 64 20 3d 20 43 49 2e 63 69 64 0a 20 20 20 cid = CI.cid. b7c0: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 AND b7d0: 43 2e 74 79 70 65 20 3d 20 31 0a 09 22 5d 0a 09 C.type = 1.."].. b7e0: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 return. }.. b7f0: 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 # # ## ### ### b800: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 ## ######## #### b810: 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 #########. ## b820: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a Configuration.. b830: 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 69 pragma -hasi b840: 6e 73 74 61 6e 63 65 73 20 20 20 6e 6f 20 3b 20 nstances no ; b850: 23 20 73 69 6e 67 6c 65 74 6f 6e 0a 20 20 20 20 # singleton. b860: 70 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65 69 pragma -hastypei b870: 6e 66 6f 20 20 20 20 6e 6f 20 3b 20 23 20 6e 6f nfo no ; # no b880: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20 introspection. b890: 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79 pragma -hasty b8a0: 70 65 64 65 73 74 72 6f 79 20 6e 6f 20 3b 20 23 pedestroy no ; # b8b0: 20 69 6d 6d 6f 72 74 61 6c 0a 7d 0a 0a 23 20 23 immortal.}..# # b8c0: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 ## ### ##### ## b8d0: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 ###### ######### b8e0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 #### ########### b8f0: 23 23 23 23 23 23 23 23 23 23 0a 23 23 0a 0a 6e ##########.##..n b900: 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a amespace eval :: b910: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f vc::fossil::impo b920: 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 rt::cvs::project b930: 20 7b 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65 {. namespace b940: 20 65 78 70 6f 72 74 20 72 65 76 0a 20 20 20 20 export rev. b950: 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 72 namespace eval r b960: 65 76 20 7b 0a 09 6e 61 6d 65 73 70 61 63 65 20 ev {..namespace b970: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 import ::vc::fos b980: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 sil::import::cvs b990: 3a 3a 73 74 61 74 65 0a 09 6e 61 6d 65 73 70 61 ::state..namespa b9a0: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a ce import ::vc:: b9b0: 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a fossil::import:: b9c0: 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 cvs::integrity.. b9d0: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 namespace import b9e0: 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69 ::vc::tools::mi b9f0: 73 63 3a 3a 2a 0a 09 6e 61 6d 65 73 70 61 63 65 sc::*..namespace ba00: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f import ::vc::to ba10: 6f 6c 73 3a 3a 74 72 6f 75 62 6c 65 0a 09 6e 61 ols::trouble..na ba20: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a mespace import : ba30: 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a :vc::tools::log. ba40: 09 6c 6f 67 20 72 65 67 69 73 74 65 72 20 63 73 .log register cs ba50: 65 74 73 0a 0a 09 23 20 53 65 74 20 75 70 20 74 ets...# Set up t ba60: 68 65 20 68 65 6c 70 65 72 20 73 69 6e 67 6c 65 he helper single ba70: 74 6f 6e 73 0a 09 6e 61 6d 65 73 70 61 63 65 20 tons..namespace ba80: 65 76 61 6c 20 72 65 76 20 7b 0a 09 20 20 20 20 eval rev {.. ba90: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 namespace import baa0: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 ::vc::fossil::i bab0: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 mport::cvs::stat bac0: 65 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 e.. namespace bad0: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f import ::vc::fo bae0: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 ssil::import::cv baf0: 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a s::integrity..}. bb00: 09 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 .namespace eval bb10: 73 79 6d 3a 3a 74 61 67 20 7b 0a 09 20 20 20 20 sym::tag {.. bb20: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 namespace import bb30: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 ::vc::fossil::i bb40: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 mport::cvs::stat bb50: 65 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 e.. namespace bb60: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f import ::vc::fo bb70: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 ssil::import::cv bb80: 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a s::integrity..}. bb90: 09 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 .namespace eval bba0: 73 79 6d 3a 3a 62 72 61 6e 63 68 20 7b 0a 09 20 sym::branch {.. bbb0: 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 namespace imp bbc0: 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c ort ::vc::fossil bbd0: 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 ::import::cvs::s bbe0: 74 61 74 65 0a 09 20 20 20 20 6e 61 6d 65 73 70 tate.. namesp bbf0: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a ace import ::vc: bc00: 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a :fossil::import: bc10: 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a :cvs::integrity. bc20: 09 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 .}. }.}..# # bc30: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 ## ### ##### ### bc40: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 ##### ########## bc50: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 ### ############ bc60: 23 23 23 23 23 23 23 23 23 0a 23 23 20 52 65 61 #########.## Rea bc70: 64 79 0a 0a 70 61 63 6b 61 67 65 20 70 72 6f 76 dy..package prov bc80: 69 64 65 20 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a ide vc::fossil:: bc90: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f import::cvs::pro bca0: 6a 65 63 74 3a 3a 72 65 76 20 31 2e 30 0a 72 65 ject::rev 1.0.re bcb0: 74 75 72 6e 0a turn.