Hex Artifact Content
Not logged in

Artifact d8c972790791297a8d7e26619a685fbcd0793b9b:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [184c56327e] - Bugfix in changeset class. Documented and fixed the SQL statements pulling the successor and predecessor information out of the state. It mishandled the Trunk <-> NTDB transitions. by aku on 2007-11-24 04:40:11.

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