Hex Artifact Content
Not logged in

Artifact 82795e9f924cd2e3196d85462f6342addb0c9859:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [87cf609021] - Created convenience methods to create the human readable repesentation of a changeset and lists of such, and made liberal use of them. by aku on 2007-11-24 05:31:30.

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 73 74 72 20 7b 7d     method str {}
07c0: 20 7b 20 72 65 74 75 72 6e 20 22 3c 24 7b 6d 79   { return "<${my
07d0: 69 64 7d 3e 22 20 7d 0a 0a 20 20 20 20 6d 65 74  id}>" }..    met
07e0: 68 6f 64 20 69 64 20 20 20 20 20 20 20 20 7b 7d  hod id        {}
07f0: 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 64 20   { return $myid 
0800: 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20 72 65 76  }.    method rev
0810: 69 73 69 6f 6e 73 20 7b 7d 20 7b 20 72 65 74 75  isions {} { retu
0820: 72 6e 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 20  rn $myrevisions 
0830: 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20 64 61 74  }.    method dat
0840: 61 20 20 20 20 20 20 7b 7d 20 7b 20 72 65 74 75  a      {} { retu
0850: 72 6e 20 5b 6c 69 73 74 20 24 6d 79 70 72 6f 6a  rn [list $myproj
0860: 65 63 74 20 24 6d 79 74 79 70 65 20 24 6d 79 73  ect $mytype $mys
0870: 72 63 69 64 5d 20 7d 0a 0a 20 20 20 20 6d 65 74  rcid] }..    met
0880: 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 20 7b  hod bysymbol   {
0890: 7d 20 7b 20 72 65 74 75 72 6e 20 5b 65 78 70 72  } { return [expr
08a0: 20 7b 24 6d 79 74 79 70 65 20 65 71 20 22 73 79   {$mytype eq "sy
08b0: 6d 22 7d 5d 20 7d 0a 20 20 20 20 6d 65 74 68 6f  m"}] }.    metho
08c0: 64 20 62 79 72 65 76 69 73 69 6f 6e 20 7b 7d 20  d byrevision {} 
08d0: 7b 20 72 65 74 75 72 6e 20 5b 65 78 70 72 20 7b  { return [expr {
08e0: 24 6d 79 74 79 70 65 20 65 71 20 22 72 65 76 22  $mytype eq "rev"
08f0: 7d 5d 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64  }] }..    method
0900: 20 73 65 74 70 6f 73 20 7b 70 7d 20 7b 20 73 65   setpos {p} { se
0910: 74 20 6d 79 70 6f 73 20 24 70 20 3b 20 72 65 74  t mypos $p ; ret
0920: 75 72 6e 20 7d 0a 20 20 20 20 6d 65 74 68 6f 64  urn }.    method
0930: 20 70 6f 73 20 20 20 20 7b 7d 20 20 7b 20 72 65   pos    {}  { re
0940: 74 75 72 6e 20 24 6d 79 70 6f 73 20 7d 0a 0a 20  turn $mypos }.. 
0950: 20 20 20 6d 65 74 68 6f 64 20 69 73 62 72 61 6e     method isbran
0960: 63 68 20 7b 7d 20 7b 0a 09 72 65 74 75 72 6e 20  ch {} {..return 
0970: 5b 65 78 70 72 20 7b 28 24 6d 79 74 79 70 65 20  [expr {($mytype 
0980: 65 71 20 22 73 79 6d 22 29 20 26 26 0a 09 09 20  eq "sym") &&... 
0990: 20 20 20 20 20 28 24 6d 79 62 72 61 6e 63 68 63       ($mybranchc
09a0: 6f 64 65 20 3d 3d 20 5b 73 74 61 74 65 20 6f 6e  ode == [state on
09b0: 65 20 7b 0a 09 09 09 20 20 53 45 4c 45 43 54 20  e {....  SELECT 
09c0: 74 79 70 65 20 46 52 4f 4d 20 73 79 6d 62 6f 6c  type FROM symbol
09d0: 20 57 48 45 52 45 20 73 69 64 20 3d 20 24 6d 79   WHERE sid = $my
09e0: 73 72 63 69 64 0a 09 09 20 20 20 20 20 20 7d 5d  srcid...      }]
09f0: 29 7d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  )}].    }..    #
0a00: 20 72 65 73 75 6c 74 20 3d 20 64 69 63 74 20 28   result = dict (
0a10: 72 65 76 69 73 69 6f 6e 20 2d 3e 20 6c 69 73 74  revision -> list
0a20: 20 28 63 68 61 6e 67 65 73 65 74 29 29 0a 20 20   (changeset)).  
0a30: 20 20 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73    method success
0a40: 6f 72 6d 61 70 20 7b 7d 20 7b 0a 09 23 20 4e 4f  ormap {} {..# NO
0a50: 54 45 20 2f 20 46 55 54 55 52 45 3a 20 50 6f 73  TE / FUTURE: Pos
0a60: 73 69 62 6c 65 20 62 6f 74 74 6c 65 6e 65 63 6b  sible bottleneck
0a70: 2e 0a 09 61 72 72 61 79 20 73 65 74 20 74 6d 70  ...array set tmp
0a80: 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 65   {}..foreach {re
0a90: 76 20 63 68 69 6c 64 72 65 6e 7d 20 5b 24 73 65  v children} [$se
0aa0: 6c 66 20 6e 65 78 74 6d 61 70 5d 20 7b 0a 09 20  lf nextmap] {.. 
0ab0: 20 20 20 66 6f 72 65 61 63 68 20 63 68 69 6c 64     foreach child
0ac0: 20 24 63 68 69 6c 64 72 65 6e 20 7b 0a 09 09 23   $children {...#
0ad0: 20 38 2e 35 20 6c 61 70 70 65 6e 64 20 74 6d 70   8.5 lappend tmp
0ae0: 28 24 72 65 76 29 20 7b 2a 7d 24 6d 79 72 65 76  ($rev) {*}$myrev
0af0: 6d 61 70 28 24 63 68 69 6c 64 29 0a 09 09 66 6f  map($child)...fo
0b00: 72 65 61 63 68 20 63 73 65 74 20 24 6d 79 72 65  reach cset $myre
0b10: 76 6d 61 70 28 24 63 68 69 6c 64 29 20 7b 0a 09  vmap($child) {..
0b20: 09 20 20 20 20 6c 61 70 70 65 6e 64 20 74 6d 70  .    lappend tmp
0b30: 28 24 72 65 76 29 20 24 63 73 65 74 0a 09 09 7d  ($rev) $cset...}
0b40: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73 65 74  ..    }..    set
0b50: 20 74 6d 70 28 24 72 65 76 29 20 5b 6c 73 6f 72   tmp($rev) [lsor
0b60: 74 20 2d 75 6e 69 71 75 65 20 24 74 6d 70 28 24  t -unique $tmp($
0b70: 72 65 76 29 5d 0a 09 7d 0a 09 72 65 74 75 72 6e  rev)]..}..return
0b80: 20 5b 61 72 72 61 79 20 67 65 74 20 74 6d 70 5d   [array get tmp]
0b90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68  .    }..    meth
0ba0: 6f 64 20 73 75 63 63 65 73 73 6f 72 73 20 7b 7d  od successors {}
0bb0: 20 7b 0a 09 23 20 4e 4f 54 45 20 2f 20 46 55 54   {..# NOTE / FUT
0bc0: 55 52 45 3a 20 50 6f 73 73 69 62 6c 65 20 62 6f  URE: Possible bo
0bd0: 74 74 6c 65 6e 65 63 6b 2e 0a 09 73 65 74 20 63  ttleneck...set c
0be0: 73 65 74 73 20 7b 7d 0a 09 66 6f 72 65 61 63 68  sets {}..foreach
0bf0: 20 7b 5f 20 63 68 69 6c 64 72 65 6e 7d 20 5b 24   {_ children} [$
0c00: 73 65 6c 66 20 6e 65 78 74 6d 61 70 5d 20 7b 0a  self nextmap] {.
0c10: 09 20 20 20 20 66 6f 72 65 61 63 68 20 63 68 69  .    foreach chi
0c20: 6c 64 20 24 63 68 69 6c 64 72 65 6e 20 7b 0a 09  ld $children {..
0c30: 09 23 20 38 2e 35 20 6c 61 70 70 65 6e 64 20 63  .# 8.5 lappend c
0c40: 73 65 74 73 20 7b 2a 7d 24 6d 79 72 65 76 6d 61  sets {*}$myrevma
0c50: 70 28 24 63 68 69 6c 64 29 0a 09 09 66 6f 72 65  p($child)...fore
0c60: 61 63 68 20 63 73 65 74 20 24 6d 79 72 65 76 6d  ach cset $myrevm
0c70: 61 70 28 24 63 68 69 6c 64 29 20 7b 0a 09 09 20  ap($child) {... 
0c80: 20 20 20 6c 61 70 70 65 6e 64 20 63 73 65 74 73     lappend csets
0c90: 20 24 63 73 65 74 0a 09 09 7d 0a 09 20 20 20 20   $cset...}..    
0ca0: 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b 6c 73  }..}..return [ls
0cb0: 6f 72 74 20 2d 75 6e 69 71 75 65 20 24 63 73 65  ort -unique $cse
0cc0: 74 73 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  ts].    }..    #
0cd0: 20 72 65 73 75 6c 74 20 3d 20 64 69 63 74 20 28   result = dict (
0ce0: 72 65 76 69 73 69 6f 6e 20 2d 3e 20 6c 69 73 74  revision -> list
0cf0: 20 28 63 68 61 6e 67 65 73 65 74 29 29 0a 20 20   (changeset)).  
0d00: 20 20 6d 65 74 68 6f 64 20 70 72 65 64 65 63 65    method predece
0d10: 73 73 6f 72 6d 61 70 20 7b 7d 20 7b 0a 09 23 20  ssormap {} {..# 
0d20: 4e 4f 54 45 20 2f 20 46 55 54 55 52 45 3a 20 50  NOTE / FUTURE: P
0d30: 6f 73 73 69 62 6c 65 20 62 6f 74 74 6c 65 6e 65  ossible bottlene
0d40: 63 6b 2e 0a 09 61 72 72 61 79 20 73 65 74 20 74  ck...array set t
0d50: 6d 70 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b  mp {}..foreach {
0d60: 72 65 76 20 63 68 69 6c 64 72 65 6e 7d 20 5b 24  rev children} [$
0d70: 73 65 6c 66 20 70 72 65 6d 61 70 5d 20 7b 0a 09  self premap] {..
0d80: 20 20 20 20 66 6f 72 65 61 63 68 20 63 68 69 6c      foreach chil
0d90: 64 20 24 63 68 69 6c 64 72 65 6e 20 7b 0a 09 09  d $children {...
0da0: 23 20 38 2e 35 20 6c 61 70 70 65 6e 64 20 74 6d  # 8.5 lappend tm
0db0: 70 28 24 72 65 76 29 20 7b 2a 7d 24 6d 79 72 65  p($rev) {*}$myre
0dc0: 76 6d 61 70 28 24 63 68 69 6c 64 29 0a 09 09 66  vmap($child)...f
0dd0: 6f 72 65 61 63 68 20 63 73 65 74 20 24 6d 79 72  oreach cset $myr
0de0: 65 76 6d 61 70 28 24 63 68 69 6c 64 29 20 7b 0a  evmap($child) {.
0df0: 09 09 20 20 20 20 6c 61 70 70 65 6e 64 20 74 6d  ..    lappend tm
0e00: 70 28 24 72 65 76 29 20 24 63 73 65 74 0a 09 09  p($rev) $cset...
0e10: 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73 65  }..    }..    se
0e20: 74 20 74 6d 70 28 24 72 65 76 29 20 5b 6c 73 6f  t tmp($rev) [lso
0e30: 72 74 20 2d 75 6e 69 71 75 65 20 24 74 6d 70 28  rt -unique $tmp(
0e40: 24 72 65 76 29 5d 0a 09 7d 0a 09 72 65 74 75 72  $rev)]..}..retur
0e50: 6e 20 5b 61 72 72 61 79 20 67 65 74 20 74 6d 70  n [array get tmp
0e60: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72  ].    }..    # r
0e70: 65 76 69 73 69 6f 6e 20 2d 3e 20 6c 69 73 74 20  evision -> list 
0e80: 28 72 65 76 69 73 69 6f 6e 29 0a 20 20 20 20 6d  (revision).    m
0e90: 65 74 68 6f 64 20 6e 65 78 74 6d 61 70 20 7b 7d  ethod nextmap {}
0ea0: 20 7b 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68   {..if {[llength
0eb0: 20 24 6d 79 6e 65 78 74 6d 61 70 5d 7d 20 7b 20   $mynextmap]} { 
0ec0: 72 65 74 75 72 6e 20 24 6d 79 6e 65 78 74 6d 61  return $mynextma
0ed0: 70 20 7d 0a 09 50 75 6c 6c 53 75 63 63 65 73 73  p }..PullSuccess
0ee0: 6f 72 52 65 76 69 73 69 6f 6e 73 20 74 6d 70 20  orRevisions tmp 
0ef0: 24 6d 79 72 65 76 69 73 69 6f 6e 73 0a 09 73 65  $myrevisions..se
0f00: 74 20 6d 79 6e 65 78 74 6d 61 70 20 5b 61 72 72  t mynextmap [arr
0f10: 61 79 20 67 65 74 20 74 6d 70 5d 0a 09 72 65 74  ay get tmp]..ret
0f20: 75 72 6e 20 24 6d 79 6e 65 78 74 6d 61 70 0a 20  urn $mynextmap. 
0f30: 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 76 69     }..    # revi
0f40: 73 69 6f 6e 20 2d 3e 20 6c 69 73 74 20 28 72 65  sion -> list (re
0f50: 76 69 73 69 6f 6e 29 0a 20 20 20 20 6d 65 74 68  vision).    meth
0f60: 6f 64 20 70 72 65 6d 61 70 20 7b 7d 20 7b 0a 09  od premap {} {..
0f70: 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6d 79  if {[llength $my
0f80: 70 72 65 6d 61 70 5d 7d 20 7b 20 72 65 74 75 72  premap]} { retur
0f90: 6e 20 24 6d 79 70 72 65 6d 61 70 20 7d 0a 09 50  n $mypremap }..P
0fa0: 75 6c 6c 50 72 65 64 65 63 65 73 73 6f 72 52 65  ullPredecessorRe
0fb0: 76 69 73 69 6f 6e 73 20 74 6d 70 20 24 6d 79 72  visions tmp $myr
0fc0: 65 76 69 73 69 6f 6e 73 0a 09 73 65 74 20 6d 79  evisions..set my
0fd0: 70 72 65 6d 61 70 20 5b 61 72 72 61 79 20 67 65  premap [array ge
0fe0: 74 20 74 6d 70 5d 0a 09 72 65 74 75 72 6e 20 24  t tmp]..return $
0ff0: 6d 79 70 72 65 6d 61 70 0a 20 20 20 20 7d 0a 0a  mypremap.    }..
1000: 20 20 20 20 6d 65 74 68 6f 64 20 62 72 65 61 6b      method break
1010: 69 6e 74 65 72 6e 61 6c 64 65 70 65 6e 64 65 6e  internaldependen
1020: 63 69 65 73 20 7b 7d 20 7b 0a 09 23 20 54 68 69  cies {} {..# Thi
1030: 73 20 6d 65 74 68 6f 64 20 69 6e 73 70 65 63 74  s method inspect
1040: 73 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 73  s the changesets
1050: 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 09 23   for internal..#
1060: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 4e   dependencies. N
1070: 6f 74 68 69 6e 67 20 69 73 20 64 6f 6e 65 20 69  othing is done i
1080: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 09  f there are no..
1090: 23 20 73 75 63 68 2e 20 4f 74 68 65 72 77 69 73  # such. Otherwis
10a0: 65 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20  e the changeset 
10b0: 69 73 20 73 70 6c 69 74 20 69 6e 74 6f 20 61 20  is split into a 
10c0: 73 65 74 20 6f 66 0a 09 23 20 66 72 61 67 6d 65  set of..# fragme
10d0: 6e 74 73 20 77 69 74 68 6f 75 74 20 69 6e 74 65  nts without inte
10e0: 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65  rnal dependencie
10f0: 73 2c 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20  s, transforming 
1100: 74 68 65 0a 09 23 20 69 6e 74 65 72 6e 61 6c 20  the..# internal 
1110: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 69 6e 74  dependencies int
1120: 6f 20 65 78 74 65 72 6e 61 6c 20 6f 6e 65 73 2e  o external ones.
1130: 20 54 68 65 20 6e 65 77 20 63 68 61 6e 67 65 73   The new changes
1140: 65 74 73 0a 09 23 20 61 72 65 20 61 64 64 65 64  ets..# are added
1150: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
1160: 61 6c 6c 20 63 68 61 6e 67 65 73 65 74 73 2e 0a  all changesets..
1170: 0a 09 23 20 57 65 20 70 65 72 66 6f 72 6d 20 61  ..# We perform a
1180: 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 73 70 6c  ll necessary spl
1190: 69 74 73 20 69 6e 20 6f 6e 65 20 67 6f 2c 20 69  its in one go, i
11a0: 6e 73 74 65 61 64 20 6f 66 20 6f 6e 6c 79 0a 09  nstead of only..
11b0: 23 20 6f 6e 65 2e 20 54 68 65 20 70 72 65 76 69  # one. The previ
11c0: 6f 75 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 61  ous algorithm, a
11d0: 64 61 70 74 65 64 20 66 72 6f 6d 20 63 76 73 32  dapted from cvs2
11e0: 73 76 6e 2c 20 63 6f 6d 70 75 74 65 64 0a 09 23  svn, computed..#
11f0: 20 61 20 6c 6f 74 20 6f 66 20 73 74 61 74 65 20   a lot of state 
1200: 77 68 69 63 68 20 77 61 73 20 74 68 72 6f 77 6e  which was thrown
1210: 20 61 77 61 79 20 61 6e 64 20 74 68 65 6e 20 63   away and then c
1220: 6f 6d 70 75 74 65 64 20 61 67 61 69 6e 0a 09 23  omputed again..#
1230: 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65   for each of the
1240: 20 66 72 61 67 6d 65 6e 74 73 2e 20 49 74 20 73   fragments. It s
1250: 68 6f 75 6c 64 20 62 65 20 65 61 73 69 65 72 20  hould be easier 
1260: 74 6f 20 75 70 64 61 74 65 20 61 6e 64 0a 09 23  to update and..#
1270: 20 72 65 75 73 65 20 74 68 61 74 20 73 74 61 74   reuse that stat
1280: 65 2e 0a 0a 09 23 20 54 68 65 20 63 6f 64 65 20  e....# The code 
1290: 63 68 65 63 6b 73 20 6f 6e 6c 79 20 73 75 63 65  checks only suce
12a0: 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ssor dependencie
12b0: 73 2c 20 61 73 20 74 68 69 73 0a 09 23 20 61 75  s, as this..# au
12c0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 76 65  tomatically cove
12d0: 72 73 20 74 68 65 20 70 72 65 64 65 63 65 73 73  rs the predecess
12e0: 6f 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  or dependencies 
12f0: 61 73 20 77 65 6c 6c 20 28 41 0a 09 23 20 73 75  as well (A..# su
1300: 63 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e  ccessor dependen
1310: 63 79 20 61 20 2d 3e 20 62 20 69 73 20 61 6c 73  cy a -> b is als
1320: 6f 20 61 20 70 72 65 64 65 63 65 73 73 6f 72 20  o a predecessor 
1330: 64 65 70 65 6e 64 65 6e 63 79 0a 09 23 20 62 20  dependency..# b 
1340: 2d 3e 20 61 29 2e 0a 0a 09 23 20 41 72 72 61 79  -> a)....# Array
1350: 20 6f 66 20 64 65 70 65 6e 64 65 6e 63 69 65 73   of dependencies
1360: 20 28 70 61 72 65 6e 74 20 2d 3e 20 63 68 69 6c   (parent -> chil
1370: 64 29 2e 20 54 68 69 73 20 69 73 20 70 75 6c 6c  d). This is pull
1380: 65 64 20 66 72 6f 6d 0a 09 23 20 74 68 65 20 73  ed from..# the s
1390: 74 61 74 65 2c 20 61 6e 64 20 6c 69 6d 69 74 65  tate, and limite
13a0: 64 20 74 6f 20 73 75 63 63 65 73 73 6f 72 73 20  d to successors 
13b0: 77 69 74 68 69 6e 20 74 68 65 20 63 68 61 6e 67  within the chang
13c0: 65 73 65 74 2e 0a 0a 09 61 72 72 61 79 20 73 65  eset....array se
13d0: 74 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 7b  t dependencies {
13e0: 7d 0a 09 50 75 6c 6c 49 6e 74 65 72 6e 61 6c 53  }..PullInternalS
13f0: 75 63 63 65 73 73 6f 72 52 65 76 69 73 69 6f 6e  uccessorRevision
1400: 73 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 24  s dependencies $
1410: 6d 79 72 65 76 69 73 69 6f 6e 73 0a 09 69 66 20  myrevisions..if 
1420: 7b 21 5b 61 72 72 61 79 20 73 69 7a 65 20 64 65  {![array size de
1430: 70 65 6e 64 65 6e 63 69 65 73 5d 7d 20 7b 72 65  pendencies]} {re
1440: 74 75 72 6e 20 30 7d 20 3b 20 23 20 4e 6f 74 68  turn 0} ; # Noth
1450: 69 6e 67 20 74 6f 20 62 72 65 61 6b 2e 0a 0a 09  ing to break....
1460: 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74  log write 6 cset
1470: 73 20 2e 2e 2e 5b 24 73 65 6c 66 20 73 74 72 5d  s ...[$self str]
1480: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1490: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
14a0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
14b0: 2e 2e 2e 2e 2e 2e 2e 0a 0a 09 23 20 57 65 20 68  ..........# We h
14c0: 61 76 65 20 69 6e 74 65 72 6e 61 6c 20 64 65 70  ave internal dep
14d0: 65 6e 64 65 6e 63 69 65 73 20 74 6f 20 62 72 65  endencies to bre
14e0: 61 6b 2e 20 57 65 20 6e 6f 77 20 69 74 65 72 61  ak. We now itera
14f0: 74 65 20 6f 76 65 72 0a 09 23 20 61 6c 6c 20 70  te over..# all p
1500: 6f 73 69 74 69 6f 6e 73 20 69 6e 20 74 68 65 20  ositions in the 
1510: 6c 69 73 74 20 28 77 68 69 63 68 20 69 73 20 63  list (which is c
1520: 68 72 6f 6e 6f 6c 6f 67 69 63 61 6c 2c 20 61 74  hronological, at
1530: 20 6c 65 61 73 74 0a 09 23 20 61 73 20 66 61 72   least..# as far
1540: 20 61 73 20 74 68 65 20 74 69 6d 65 73 74 61 6d   as the timestam
1550: 70 73 20 61 72 65 20 63 6f 72 72 65 63 74 20 61  ps are correct a
1560: 6e 64 20 75 6e 69 71 75 65 29 20 61 6e 64 0a 09  nd unique) and..
1570: 23 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20  # determine the 
1580: 62 65 73 74 20 70 6f 73 69 74 69 6f 6e 20 66 6f  best position fo
1590: 72 20 74 68 65 20 62 72 65 61 6b 2c 20 62 79 20  r the break, by 
15a0: 74 72 79 69 6e 67 20 74 6f 0a 09 23 20 62 72 65  trying to..# bre
15b0: 61 6b 20 61 73 20 6d 61 6e 79 20 64 65 70 65 6e  ak as many depen
15c0: 64 65 6e 63 69 65 73 20 61 73 20 70 6f 73 73 69  dencies as possi
15d0: 62 6c 65 20 69 6e 20 6f 6e 65 20 67 6f 2e 20 57  ble in one go. W
15e0: 68 65 6e 20 61 0a 09 23 20 62 72 65 61 6b 20 77  hen a..# break w
15f0: 61 73 20 66 6f 75 6e 64 20 74 68 69 73 20 69 73  as found this is
1600: 20 72 65 64 6f 6e 65 20 66 6f 72 20 74 68 65 20   redone for the 
1610: 66 72 61 67 6d 65 6e 74 73 20 63 6f 6d 69 6e 67  fragments coming
1620: 20 61 6e 64 0a 09 23 20 61 66 74 65 72 2c 20 61   and..# after, a
1630: 66 74 65 72 20 75 70 64 69 6e 67 20 74 68 65 20  fter upding the 
1640: 63 72 6f 73 73 69 6e 67 20 69 6e 66 6f 72 6d 61  crossing informa
1650: 74 69 6f 6e 2e 0a 0a 09 23 20 44 61 74 61 20 73  tion....# Data s
1660: 74 72 75 63 74 75 72 65 73 3a 0a 09 23 20 4d 61  tructures:..# Ma
1670: 70 3a 20 20 50 4f 53 20 20 20 72 65 76 69 73 69  p:  POS   revisi
1680: 6f 6e 20 69 64 20 20 20 20 20 20 2d 3e 20 70 6f  on id      -> po
1690: 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73 74 2e 0a  sition in list..
16a0: 09 23 20 20 20 20 20 20 20 43 52 4f 53 53 20 70  .#       CROSS p
16b0: 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73 74 20  osition in list 
16c0: 2d 3e 20 6e 75 6d 62 65 72 20 6f 66 20 64 65 70  -> number of dep
16d0: 65 6e 64 65 6e 63 69 65 73 20 63 72 6f 73 73 69  endencies crossi
16e0: 6e 67 20 69 74 0a 09 23 20 20 20 20 20 20 20 44  ng it..#       D
16f0: 45 50 43 20 20 64 65 70 65 6e 64 65 6e 63 79 20  EPC  dependency 
1700: 20 20 20 20 20 20 2d 3e 20 70 6f 73 69 74 69 6f        -> positio
1710: 6e 73 20 69 74 20 63 72 6f 73 73 65 73 0a 09 23  ns it crosses..#
1720: 20 4c 69 73 74 3a 20 52 41 4e 47 45 20 4f 66 20   List: RANGE Of 
1730: 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 69 74  the positions it
1740: 73 65 6c 66 2e 0a 09 23 20 41 20 64 65 70 65 6e  self...# A depen
1750: 64 65 6e 63 79 20 69 73 20 61 20 73 69 6e 67 6c  dency is a singl
1760: 65 2d 65 6c 65 6d 65 6e 74 20 6d 61 70 20 70 61  e-element map pa
1770: 72 65 6e 74 20 2d 3e 20 63 68 69 6c 64 0a 0a 09  rent -> child...
1780: 49 6e 69 74 69 61 6c 69 7a 65 42 72 65 61 6b 53  InitializeBreakS
1790: 74 61 74 65 20 24 6d 79 72 65 76 69 73 69 6f 6e  tate $myrevision
17a0: 73 0a 0a 09 73 65 74 20 66 72 61 67 6d 65 6e 74  s...set fragment
17b0: 73 20 7b 7d 0a 09 73 65 74 20 70 65 6e 64 69 6e  s {}..set pendin
17c0: 67 20 20 20 5b 6c 69 73 74 20 24 72 61 6e 67 65  g   [list $range
17d0: 5d 0a 09 73 65 74 20 61 74 20 20 20 20 20 20 20  ]..set at       
17e0: 20 30 0a 09 61 72 72 61 79 20 73 65 74 20 62 72   0..array set br
17f0: 65 61 6b 73 20 7b 7d 0a 0a 09 77 68 69 6c 65 20  eaks {}...while 
1800: 7b 24 61 74 20 3c 20 5b 6c 6c 65 6e 67 74 68 20  {$at < [llength 
1810: 24 70 65 6e 64 69 6e 67 5d 7d 20 7b 0a 09 20 20  $pending]} {..  
1820: 20 20 73 65 74 20 63 75 72 72 65 6e 74 20 5b 6c    set current [l
1830: 69 6e 64 65 78 20 24 70 65 6e 64 69 6e 67 20 24  index $pending $
1840: 61 74 5d 0a 0a 09 20 20 20 20 6c 6f 67 20 77 72  at]...    log wr
1850: 69 74 65 20 36 20 63 73 65 74 73 20 22 2e 20 2e  ite 6 csets ". .
1860: 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e   .. ... ..... ..
1870: 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e  ...... .........
1880: 2e 2e 2e 2e 22 0a 09 20 20 20 20 6c 6f 67 20 77  ...."..    log w
1890: 72 69 74 65 20 36 20 63 73 65 74 73 20 22 53 63  rite 6 csets "Sc
18a0: 68 65 64 75 6c 65 64 20 20 20 5b 6a 6f 69 6e 20  heduled   [join 
18b0: 5b 50 52 73 20 5b 6c 72 61 6e 67 65 20 24 70 65  [PRs [lrange $pe
18c0: 6e 64 69 6e 67 20 24 61 74 20 65 6e 64 5d 5d 20  nding $at end]] 
18d0: 7b 20 7d 5d 22 0a 09 20 20 20 20 6c 6f 67 20 77  { }]"..    log w
18e0: 72 69 74 65 20 36 20 63 73 65 74 73 20 22 43 6f  rite 6 csets "Co
18f0: 6e 73 69 64 65 72 69 6e 67 20 5b 50 52 20 24 63  nsidering [PR $c
1900: 75 72 72 65 6e 74 5d 20 5c 5b 24 61 74 2f 5b 6c  urrent] \[$at/[l
1910: 6c 65 6e 67 74 68 20 24 70 65 6e 64 69 6e 67 5d  length $pending]
1920: 5c 5d 22 0a 0a 09 20 20 20 20 73 65 74 20 62 65  \]"...    set be
1930: 73 74 20 5b 46 69 6e 64 42 65 73 74 42 72 65 61  st [FindBestBrea
1940: 6b 20 24 63 75 72 72 65 6e 74 5d 0a 0a 09 20 20  k $current]...  
1950: 20 20 69 66 20 7b 24 62 65 73 74 20 3c 20 30 7d    if {$best < 0}
1960: 20 7b 0a 09 09 23 20 54 68 65 20 69 6e 73 70 65   {...# The inspe
1970: 63 74 65 64 20 72 61 6e 67 65 20 68 61 73 20 6e  cted range has n
1980: 6f 20 69 6e 74 65 72 6e 61 6c 0a 09 09 23 20 64  o internal...# d
1990: 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 54 68 69  ependencies. Thi
19a0: 73 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20  s is a complete 
19b0: 66 72 61 67 6d 65 6e 74 2e 0a 09 09 6c 61 70 70  fragment....lapp
19c0: 65 6e 64 20 66 72 61 67 6d 65 6e 74 73 20 24 63  end fragments $c
19d0: 75 72 72 65 6e 74 0a 0a 09 09 6c 6f 67 20 77 72  urrent....log wr
19e0: 69 74 65 20 36 20 63 73 65 74 73 20 22 4e 6f 20  ite 6 csets "No 
19f0: 62 72 65 61 6b 73 2c 20 66 69 6e 61 6c 22 0a 09  breaks, final"..
1a00: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 23      } else {...#
1a10: 20 53 70 6c 69 74 20 74 68 65 20 72 61 6e 67 65   Split the range
1a20: 20 61 6e 64 20 73 63 68 65 64 75 6c 65 20 74 68   and schedule th
1a30: 65 20 72 65 73 75 6c 74 69 6e 67 20 66 72 61 67  e resulting frag
1a40: 6d 65 6e 74 73 0a 09 09 23 20 66 6f 72 20 66 75  ments...# for fu
1a50: 72 74 68 65 72 20 69 6e 73 70 65 63 74 69 6f 6e  rther inspection
1a60: 2e 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 6e  . Remember the n
1a70: 75 6d 62 65 72 20 6f 66 0a 09 09 23 20 64 65 70  umber of...# dep
1a80: 65 6e 64 65 6e 63 69 65 73 20 63 75 74 20 62 65  endencies cut be
1a90: 66 6f 72 65 20 77 65 20 72 65 6d 6f 76 65 20 74  fore we remove t
1aa0: 68 65 6d 20 66 72 6f 6d 0a 09 09 23 20 63 6f 6e  hem from...# con
1ab0: 73 69 64 65 72 61 74 69 6f 6e 2c 20 66 6f 72 20  sideration, for 
1ac0: 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 6c 61  documentation la
1ad0: 74 65 72 2e 0a 0a 09 09 73 65 74 20 62 72 65 61  ter.....set brea
1ae0: 6b 73 28 24 62 65 73 74 29 20 24 63 72 6f 73 73  ks($best) $cross
1af0: 28 24 62 65 73 74 29 0a 0a 09 09 6c 6f 67 20 77  ($best)....log w
1b00: 72 69 74 65 20 36 20 63 73 65 74 73 20 22 42 65  rite 6 csets "Be
1b10: 73 74 20 62 72 65 61 6b 20 40 20 24 62 65 73 74  st break @ $best
1b20: 2c 20 63 75 74 74 69 6e 67 20 5b 6e 73 70 20 24  , cutting [nsp $
1b30: 63 72 6f 73 73 28 24 62 65 73 74 29 20 64 65 70  cross($best) dep
1b40: 65 6e 64 65 6e 63 79 20 64 65 70 65 6e 64 65 6e  endency dependen
1b50: 63 69 65 73 5d 22 0a 0a 09 09 23 20 4e 6f 74 65  cies]"....# Note
1b60: 3a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 62  : The value of b
1b70: 65 73 74 20 69 73 20 61 6e 20 61 62 6f 6c 75 74  est is an abolut
1b80: 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 0a 09 09  e location in...
1b90: 23 20 6d 79 72 65 76 69 73 69 6f 6e 73 2e 20 55  # myrevisions. U
1ba0: 73 65 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  se the start of 
1bb0: 63 75 72 72 65 6e 74 20 74 6f 20 6d 61 6b 65 20  current to make 
1bc0: 69 74 20 61 6e 0a 09 09 23 20 69 6e 64 65 78 20  it an...# index 
1bd0: 61 62 73 6f 6c 75 74 65 20 74 6f 20 63 75 72 72  absolute to curr
1be0: 65 6e 74 2e 0a 0a 09 09 73 65 74 20 62 72 65 6c  ent.....set brel
1bf0: 20 5b 65 78 70 72 20 7b 24 62 65 73 74 20 2d 20   [expr {$best - 
1c00: 5b 6c 69 6e 64 65 78 20 24 63 75 72 72 65 6e 74  [lindex $current
1c10: 20 30 5d 7d 5d 0a 09 09 73 65 74 20 62 6e 65 78   0]}]...set bnex
1c20: 74 20 24 62 72 65 6c 20 3b 20 69 6e 63 72 20 62  t $brel ; incr b
1c30: 6e 65 78 74 0a 09 09 73 65 74 20 66 72 61 67 62  next...set fragb
1c40: 65 66 6f 72 65 20 5b 6c 72 61 6e 67 65 20 24 63  efore [lrange $c
1c50: 75 72 72 65 6e 74 20 30 20 24 62 72 65 6c 5d 0a  urrent 0 $brel].
1c60: 09 09 73 65 74 20 66 72 61 67 61 66 74 65 72 20  ..set fragafter 
1c70: 20 5b 6c 72 61 6e 67 65 20 24 63 75 72 72 65 6e   [lrange $curren
1c80: 74 20 24 62 6e 65 78 74 20 65 6e 64 5d 0a 0a 09  t $bnext end]...
1c90: 09 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65  .log write 6 cse
1ca0: 74 73 20 22 4e 65 77 20 70 69 65 63 65 73 20 20  ts "New pieces  
1cb0: 5b 50 52 20 24 66 72 61 67 62 65 66 6f 72 65 5d  [PR $fragbefore]
1cc0: 20 5b 50 52 20 24 66 72 61 67 61 66 74 65 72 5d   [PR $fragafter]
1cd0: 22 0a 0a 09 09 69 66 20 7b 21 5b 6c 6c 65 6e 67  "....if {![lleng
1ce0: 74 68 20 24 66 72 61 67 62 65 66 6f 72 65 5d 7d  th $fragbefore]}
1cf0: 20 7b 0a 09 09 20 20 20 20 74 72 6f 75 62 6c 65   {...    trouble
1d00: 20 69 6e 74 65 72 6e 61 6c 20 22 54 72 69 65 64   internal "Tried
1d10: 20 74 6f 20 73 70 6c 69 74 20 6f 66 66 20 61 20   to split off a 
1d20: 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 72 61 67  zero-length frag
1d30: 6d 65 6e 74 20 61 74 20 74 68 65 20 62 65 67 69  ment at the begi
1d40: 6e 6e 69 6e 67 22 0a 09 09 7d 0a 09 09 69 66 20  nning"...}...if 
1d50: 7b 21 5b 6c 6c 65 6e 67 74 68 20 24 66 72 61 67  {![llength $frag
1d60: 61 66 74 65 72 5d 7d 20 7b 0a 09 09 20 20 20 20  after]} {...    
1d70: 74 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61 6c  trouble internal
1d80: 20 22 54 72 69 65 64 20 74 6f 20 73 70 6c 69 74   "Tried to split
1d90: 20 6f 66 66 20 61 20 7a 65 72 6f 2d 6c 65 6e 67   off a zero-leng
1da0: 74 68 20 66 72 61 67 6d 65 6e 74 20 61 74 20 74  th fragment at t
1db0: 68 65 20 65 6e 64 22 0a 09 09 7d 0a 0a 09 09 6c  he end"...}....l
1dc0: 61 70 70 65 6e 64 20 70 65 6e 64 69 6e 67 20 24  append pending $
1dd0: 66 72 61 67 62 65 66 6f 72 65 20 24 66 72 61 67  fragbefore $frag
1de0: 61 66 74 65 72 0a 09 09 43 75 74 41 74 20 24 62  after...CutAt $b
1df0: 65 73 74 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  est..    }...   
1e00: 20 69 6e 63 72 20 61 74 0a 09 7d 0a 0a 09 6c 6f   incr at..}...lo
1e10: 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20  g write 6 csets 
1e20: 22 2e 20 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e  ". . .. ... ....
1e30: 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e  . ........ .....
1e40: 2e 2e 2e 2e 2e 2e 2e 2e 22 0a 0a 09 23 20 28 2a  ........"...# (*
1e50: 29 20 57 65 20 63 6c 65 61 72 20 6f 75 74 20 74  ) We clear out t
1e60: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 70 61  he associated pa
1e70: 72 74 20 6f 66 20 74 68 65 20 6d 79 72 65 76 6d  rt of the myrevm
1e80: 61 70 0a 09 23 20 69 6e 2d 6d 65 6d 6f 72 79 20  ap..# in-memory 
1e90: 69 6e 64 65 78 20 69 6e 20 70 72 65 70 61 72 61  index in prepara
1ea0: 74 69 6f 6e 20 66 6f 72 20 6e 65 77 20 64 61 74  tion for new dat
1eb0: 61 2e 20 41 20 73 69 6d 70 6c 65 20 75 6e 73 65  a. A simple unse
1ec0: 74 0a 09 23 20 69 73 20 65 6e 6f 75 67 68 2c 20  t..# is enough, 
1ed0: 77 65 20 68 61 76 65 20 6e 6f 20 73 79 6d 62 6f  we have no symbo
1ee0: 6c 20 63 68 61 6e 67 65 73 65 74 73 20 61 74 20  l changesets at 
1ef0: 74 68 69 73 20 74 69 6d 65 2c 20 61 6e 64 0a 09  this time, and..
1f00: 23 20 74 68 75 73 20 6e 65 76 65 72 20 6d 6f 72  # thus never mor
1f10: 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72  e than one refer
1f20: 65 6e 63 65 20 69 6e 20 74 68 65 20 6c 69 73 74  ence in the list
1f30: 2e 0a 0a 09 66 6f 72 65 61 63 68 20 72 20 24 6d  ....foreach r $m
1f40: 79 72 65 76 69 73 69 6f 6e 73 20 7b 20 75 6e 73  yrevisions { uns
1f50: 65 74 20 6d 79 72 65 76 6d 61 70 28 24 72 29 20  et myrevmap($r) 
1f60: 7d 0a 0a 09 23 20 43 72 65 61 74 65 20 63 68 61  }...# Create cha
1f70: 6e 67 65 73 65 74 73 20 66 6f 72 20 74 68 65 20  ngesets for the 
1f80: 66 72 61 67 6d 65 6e 74 73 2c 20 72 65 75 73 69  fragments, reusi
1f90: 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f  ng the current o
1fa0: 6e 65 0a 09 23 20 66 6f 72 20 74 68 65 20 66 69  ne..# for the fi
1fb0: 72 73 74 20 66 72 61 67 6d 65 6e 74 2e 20 57 65  rst fragment. We
1fc0: 20 73 6f 72 74 20 74 68 65 6d 20 69 6e 20 6f 72   sort them in or
1fd0: 64 65 72 20 74 6f 20 61 6c 6c 6f 77 0a 09 23 20  der to allow..# 
1fe0: 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 67 61 70  checking for gap
1ff0: 73 20 61 6e 64 20 6e 69 63 65 20 6d 65 73 73 61  s and nice messa
2000: 67 65 73 2e 0a 0a 09 73 65 74 20 66 72 61 67 6d  ges....set fragm
2010: 65 6e 74 73 20 5b 6c 73 6f 72 74 20 2d 69 6e 64  ents [lsort -ind
2020: 65 78 20 30 20 2d 69 6e 74 65 67 65 72 20 24 66  ex 0 -integer $f
2030: 72 61 67 6d 65 6e 74 73 5d 0a 0a 09 23 70 75 74  ragments]...#put
2040: 73 20 5c 74 2e 5b 6a 6f 69 6e 20 5b 50 52 73 20  s \t.[join [PRs 
2050: 24 66 72 61 67 6d 65 6e 74 73 5d 20 2e 5c 6e 5c  $fragments] .\n\
2060: 74 2e 5d 2e 0a 0a 09 42 6f 72 64 65 72 20 5b 6c  t.]....Border [l
2070: 69 6e 64 65 78 20 24 66 72 61 67 6d 65 6e 74 73  index $fragments
2080: 20 30 5d 20 66 69 72 73 74 73 20 66 69 72 73 74   0] firsts first
2090: 65 0a 0a 09 69 66 20 7b 24 66 69 72 73 74 73 20  e...if {$firsts 
20a0: 21 3d 20 30 7d 20 7b 0a 09 20 20 20 20 74 72 6f  != 0} {..    tro
20b0: 75 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 22 42  uble internal "B
20c0: 61 64 20 66 72 61 67 6d 65 6e 74 20 73 74 61 72  ad fragment star
20d0: 74 20 40 20 24 66 69 72 73 74 73 2c 20 67 61 70  t @ $firsts, gap
20e0: 2c 20 6f 72 20 62 65 66 6f 72 65 20 62 65 67 69  , or before begi
20f0: 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 72 61 6e  nning of the ran
2100: 67 65 22 0a 09 7d 0a 0a 09 73 65 74 20 6c 61 73  ge"..}...set las
2110: 74 65 20 24 66 69 72 73 74 65 0a 09 66 6f 72 65  te $firste..fore
2120: 61 63 68 20 66 72 61 67 6d 65 6e 74 20 5b 6c 72  ach fragment [lr
2130: 61 6e 67 65 20 24 66 72 61 67 6d 65 6e 74 73 20  ange $fragments 
2140: 31 20 65 6e 64 5d 20 7b 0a 09 20 20 20 20 42 6f  1 end] {..    Bo
2150: 72 64 65 72 20 24 66 72 61 67 6d 65 6e 74 20 73  rder $fragment s
2160: 20 65 0a 09 20 20 20 20 69 66 20 7b 24 6c 61 73   e..    if {$las
2170: 74 65 20 21 3d 20 28 24 73 20 2d 20 31 29 7d 20  te != ($s - 1)} 
2180: 7b 0a 09 09 74 72 6f 75 62 6c 65 20 69 6e 74 65  {...trouble inte
2190: 72 6e 61 6c 20 22 42 61 64 20 66 72 61 67 6d 65  rnal "Bad fragme
21a0: 6e 74 20 62 6f 72 64 65 72 20 3c 24 6c 61 73 74  nt border <$last
21b0: 65 20 7c 20 24 73 3e 2c 20 67 61 70 20 6f 72 20  e | $s>, gap or 
21c0: 6f 76 65 72 6c 61 70 22 0a 09 20 20 20 20 7d 0a  overlap"..    }.
21d0: 0a 09 20 20 20 20 73 65 74 20 6e 65 77 20 5b 24  ..    set new [$
21e0: 74 79 70 65 20 25 41 55 54 4f 25 20 24 6d 79 70  type %AUTO% $myp
21f0: 72 6f 6a 65 63 74 20 24 6d 79 74 79 70 65 20 24  roject $mytype $
2200: 6d 79 73 72 63 69 64 20 5b 6c 72 61 6e 67 65 20  mysrcid [lrange 
2210: 24 6d 79 72 65 76 69 73 69 6f 6e 73 20 24 73 20  $myrevisions $s 
2220: 24 65 5d 5d 0a 0a 20 20 20 20 20 20 20 20 20 20  $e]]..          
2230: 20 20 6c 6f 67 20 77 72 69 74 65 20 34 20 63 73    log write 4 cs
2240: 65 74 73 20 22 42 72 65 61 6b 69 6e 67 20 5b 24  ets "Breaking [$
2250: 73 65 6c 66 20 73 74 72 20 5d 20 40 20 24 6c 61  self str ] @ $la
2260: 73 74 65 2c 20 6e 65 77 20 5b 24 6e 65 77 20 73  ste, new [$new s
2270: 74 72 5d 2c 20 63 75 74 74 69 6e 67 20 24 62 72  tr], cutting $br
2280: 65 61 6b 73 28 24 6c 61 73 74 65 29 22 0a 0a 09  eaks($laste)"...
2290: 20 20 20 20 73 65 74 20 6c 61 73 74 65 20 24 65      set laste $e
22a0: 0a 09 7d 0a 0a 09 69 66 20 7b 24 6c 61 73 74 65  ..}...if {$laste
22b0: 20 21 3d 20 28 5b 6c 6c 65 6e 67 74 68 20 24 6d   != ([llength $m
22c0: 79 72 65 76 69 73 69 6f 6e 73 5d 2d 31 29 7d 20  yrevisions]-1)} 
22d0: 7b 0a 09 20 20 20 20 74 72 6f 75 62 6c 65 20 69  {..    trouble i
22e0: 6e 74 65 72 6e 61 6c 20 22 42 61 64 20 66 72 61  nternal "Bad fra
22f0: 67 6d 65 6e 74 20 65 6e 64 20 40 20 24 6c 61 73  gment end @ $las
2300: 74 65 2c 20 67 61 70 2c 20 6f 72 20 62 65 79 6f  te, gap, or beyo
2310: 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61  nd end of the ra
2320: 6e 67 65 22 0a 09 7d 0a 0a 09 23 20 50 75 74 20  nge"..}...# Put 
2330: 74 68 65 20 66 69 72 73 74 20 66 72 61 67 6d 65  the first fragme
2340: 6e 74 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72  nt into the curr
2350: 65 6e 74 20 63 68 61 6e 67 65 73 65 74 2c 20 61  ent changeset, a
2360: 6e 64 0a 09 23 20 75 70 64 61 74 65 20 74 68 65  nd..# update the
2370: 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6e 64 65 78   in-memory index
2380: 2e 20 57 65 20 63 61 6e 20 73 69 6d 70 6c 79 20  . We can simply 
2390: 28 72 65 29 61 64 64 20 74 68 65 0a 09 23 20 72  (re)add the..# r
23a0: 65 76 69 73 69 6f 6e 73 20 62 65 63 61 75 73 65  evisions because
23b0: 20 77 65 20 63 6c 65 61 72 65 64 20 74 68 65 20   we cleared the 
23c0: 70 72 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74  previously exist
23d0: 69 6e 67 0a 09 23 20 69 6e 66 6f 72 6d 61 74 69  ing..# informati
23e0: 6f 6e 2c 20 73 65 65 20 28 2a 29 20 61 62 6f 76  on, see (*) abov
23f0: 65 2e 20 50 65 72 73 69 73 74 65 6e 63 65 20 64  e. Persistence d
2400: 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 0a 09  oes not matter..
2410: 23 20 68 65 72 65 2c 20 6e 6f 6e 65 20 6f 66 20  # here, none of 
2420: 74 68 65 20 63 68 61 6e 67 65 73 65 74 73 20 68  the changesets h
2430: 61 73 20 62 65 65 6e 20 73 61 76 65 64 20 74 6f  as been saved to
2440: 20 74 68 65 0a 09 23 20 70 65 72 73 69 73 74 65   the..# persiste
2450: 6e 74 20 73 74 61 74 65 20 79 65 74 2e 0a 0a 09  nt state yet....
2460: 73 65 74 20 6d 79 72 65 76 69 73 69 6f 6e 73 20  set myrevisions 
2470: 5b 6c 72 61 6e 67 65 20 24 6d 79 72 65 76 69 73  [lrange $myrevis
2480: 69 6f 6e 73 20 30 20 24 66 69 72 73 74 65 5d 0a  ions 0 $firste].
2490: 09 66 6f 72 65 61 63 68 20 72 20 24 6d 79 72 65  .foreach r $myre
24a0: 76 69 73 69 6f 6e 73 20 7b 20 6c 61 70 70 65 6e  visions { lappen
24b0: 64 20 6d 79 72 65 76 6d 61 70 28 24 72 29 20 24  d myrevmap($r) $
24c0: 73 65 6c 66 20 7d 0a 0a 09 72 65 74 75 72 6e 20  self }...return 
24d0: 31 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74  1.    }..    met
24e0: 68 6f 64 20 70 65 72 73 69 73 74 20 7b 7d 20 7b  hod persist {} {
24f0: 0a 09 73 65 74 20 74 69 64 20 24 6d 79 63 73 74  ..set tid $mycst
2500: 79 70 65 28 24 6d 79 74 79 70 65 29 0a 09 73 65  ype($mytype)..se
2510: 74 20 70 69 64 20 5b 24 6d 79 70 72 6f 6a 65 63  t pid [$myprojec
2520: 74 20 69 64 5d 0a 09 73 65 74 20 70 6f 73 20 30  t id]..set pos 0
2530: 0a 0a 09 73 74 61 74 65 20 74 72 61 6e 73 61 63  ...state transac
2540: 74 69 6f 6e 20 7b 0a 09 20 20 20 20 73 74 61 74  tion {..    stat
2550: 65 20 72 75 6e 20 7b 0a 09 09 49 4e 53 45 52 54  e run {...INSERT
2560: 20 49 4e 54 4f 20 63 68 61 6e 67 65 73 65 74 20   INTO changeset 
2570: 28 63 69 64 2c 20 20 20 70 69 64 2c 20 20 74 79  (cid,   pid,  ty
2580: 70 65 2c 20 73 72 63 29 0a 09 09 56 41 4c 55 45  pe, src)...VALUE
2590: 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S               
25a0: 20 28 24 6d 79 69 64 2c 20 24 70 69 64 2c 20 24   ($myid, $pid, $
25b0: 74 69 64 2c 20 24 6d 79 73 72 63 69 64 29 3b 0a  tid, $mysrcid);.
25c0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 66 6f 72  .    }...    for
25d0: 65 61 63 68 20 72 69 64 20 24 6d 79 72 65 76 69  each rid $myrevi
25e0: 73 69 6f 6e 73 20 7b 0a 09 09 73 74 61 74 65 20  sions {...state 
25f0: 72 75 6e 20 7b 0a 09 09 20 20 20 20 49 4e 53 45  run {...    INSE
2600: 52 54 20 49 4e 54 4f 20 63 73 72 65 76 69 73 69  RT INTO csrevisi
2610: 6f 6e 20 28 63 69 64 2c 20 20 20 70 6f 73 2c 20  on (cid,   pos, 
2620: 20 72 69 64 29 0a 09 09 20 20 20 20 56 41 4c 55   rid)...    VALU
2630: 45 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ES              
2640: 20 20 20 28 24 6d 79 69 64 2c 20 24 70 6f 73 2c     ($myid, $pos,
2650: 20 24 72 69 64 29 3b 0a 09 09 7d 0a 09 09 69 6e   $rid);...}...in
2660: 63 72 20 70 6f 73 0a 09 20 20 20 20 7d 0a 09 7d  cr pos..    }..}
2670: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
2680: 20 20 20 20 6d 65 74 68 6f 64 20 74 69 6d 65 72      method timer
2690: 61 6e 67 65 20 7b 7d 20 7b 0a 09 73 65 74 20 74  ange {} {..set t
26a0: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 6d  heset ('[join $m
26b0: 79 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d  yrevisions {','}
26c0: 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61  ]')..return [sta
26d0: 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45  te run "..    SE
26e0: 4c 45 43 54 20 4d 49 4e 28 52 2e 64 61 74 65 29  LECT MIN(R.date)
26f0: 2c 20 4d 41 58 28 52 2e 64 61 74 65 29 0a 09 20  , MAX(R.date).. 
2700: 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e     FROM revision
2710: 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e   R..    WHERE R.
2720: 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09  rid IN $theset..
2730: 22 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65  "].    }..    me
2740: 74 68 6f 64 20 64 72 6f 70 20 7b 7d 20 7b 0a 09  thod drop {} {..
2750: 73 74 61 74 65 20 74 72 61 6e 73 61 63 74 69 6f  state transactio
2760: 6e 20 7b 0a 09 20 20 20 20 73 74 61 74 65 20 72  n {..    state r
2770: 75 6e 20 7b 0a 09 09 44 45 4c 45 54 45 20 46 52  un {...DELETE FR
2780: 4f 4d 20 63 68 61 6e 67 65 73 65 74 20 20 57 48  OM changeset  WH
2790: 45 52 45 20 63 69 64 20 3d 20 24 6d 79 69 64 3b  ERE cid = $myid;
27a0: 0a 09 09 44 45 4c 45 54 45 20 46 52 4f 4d 20 63  ...DELETE FROM c
27b0: 73 72 65 76 69 73 69 6f 6e 20 57 48 45 52 45 20  srevision WHERE 
27c0: 63 69 64 20 3d 20 24 6d 79 69 64 3b 0a 09 20 20  cid = $myid;..  
27d0: 20 20 7d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20    }..}..foreach 
27e0: 72 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 20 7b  r $myrevisions {
27f0: 0a 09 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67  ..    if {[lleng
2800: 74 68 20 24 6d 79 72 65 76 6d 61 70 28 24 72 29  th $myrevmap($r)
2810: 5d 20 3d 3d 20 31 7d 20 7b 0a 09 09 75 6e 73 65  ] == 1} {...unse
2820: 74 20 6d 79 72 65 76 6d 61 70 28 24 72 29 0a 09  t myrevmap($r)..
2830: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 73      } else {...s
2840: 65 74 20 70 6f 73 20 5b 6c 73 65 61 72 63 68 20  et pos [lsearch 
2850: 2d 65 78 61 63 74 20 24 6d 79 72 65 76 6d 61 70  -exact $myrevmap
2860: 28 24 72 29 20 24 73 65 6c 66 5d 0a 09 09 73 65  ($r) $self]...se
2870: 74 20 6d 79 72 65 76 6d 61 70 28 24 72 29 20 5b  t myrevmap($r) [
2880: 6c 72 65 70 6c 61 63 65 20 24 6d 79 72 65 76 6d  lreplace $myrevm
2890: 61 70 28 24 72 29 20 24 70 6f 73 20 24 70 6f 73  ap($r) $pos $pos
28a0: 5d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 73 65 74  ]..    }..}..set
28b0: 20 70 6f 73 20 20 20 20 20 20 20 20 20 20 5b 6c   pos          [l
28c0: 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 24 6d  search -exact $m
28d0: 79 63 68 61 6e 67 65 73 65 74 73 20 24 73 65 6c  ychangesets $sel
28e0: 66 5d 0a 09 73 65 74 20 6d 79 63 68 61 6e 67 65  f]..set mychange
28f0: 73 65 74 73 20 5b 6c 72 65 70 6c 61 63 65 20 24  sets [lreplace $
2900: 6d 79 63 68 61 6e 67 65 73 65 74 73 20 24 70 6f  mychangesets $po
2910: 73 20 24 70 6f 73 5d 0a 09 72 65 74 75 72 6e 0a  s $pos]..return.
2920: 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d      }..    typem
2930: 65 74 68 6f 64 20 73 70 6c 69 74 20 7b 63 73 65  ethod split {cse
2940: 74 20 61 72 67 73 7d 20 7b 0a 09 23 20 41 73 20  t args} {..# As 
2950: 70 61 72 74 20 6f 66 20 74 68 65 20 63 72 65 61  part of the crea
2960: 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20  tion of the new 
2970: 63 68 61 6e 67 65 73 65 74 73 20 73 70 65 63 69  changesets speci
2980: 66 69 65 64 20 69 6e 0a 09 23 20 41 52 47 53 20  fied in..# ARGS 
2990: 61 73 20 73 65 74 73 20 6f 66 20 72 65 76 69 73  as sets of revis
29a0: 69 6f 6e 73 2c 20 61 6c 6c 20 73 75 62 73 65 74  ions, all subset
29b0: 73 20 6f 66 20 43 53 45 54 27 73 20 72 65 76 69  s of CSET's revi
29c0: 73 69 6f 6e 0a 09 23 20 73 65 74 2c 20 43 53 45  sion..# set, CSE
29d0: 54 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65  T will be droppe
29e0: 64 20 66 72 6f 6d 20 61 6c 6c 20 64 61 74 61 62  d from all datab
29f0: 61 73 65 73 2c 20 69 6e 20 61 6e 64 20 6f 75 74  ases, in and out
2a00: 20 6f 66 0a 09 23 20 6d 65 6d 6f 72 79 2c 20 61   of..# memory, a
2a10: 6e 64 20 74 68 65 6e 20 64 65 73 74 72 6f 79 65  nd then destroye
2a20: 64 2e 0a 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73  d....struct::lis
2a30: 74 20 61 73 73 69 67 6e 20 5b 24 63 73 65 74 20  t assign [$cset 
2a40: 64 61 74 61 5d 20 70 72 6f 6a 65 63 74 20 63 73  data] project cs
2a50: 74 79 70 65 20 63 73 73 72 63 0a 0a 09 24 63 73  type cssrc...$cs
2a60: 65 74 20 64 72 6f 70 0a 09 24 63 73 65 74 20 64  et drop..$cset d
2a70: 65 73 74 72 6f 79 0a 0a 09 73 65 74 20 6e 65 77  estroy...set new
2a80: 63 73 65 74 73 20 7b 7d 0a 09 66 6f 72 65 61 63  csets {}..foreac
2a90: 68 20 66 72 61 67 6d 65 6e 74 72 65 76 69 73 69  h fragmentrevisi
2aa0: 6f 6e 73 20 24 61 72 67 73 20 7b 0a 09 20 20 20  ons $args {..   
2ab0: 20 69 66 20 7b 21 5b 6c 6c 65 6e 67 74 68 20 24   if {![llength $
2ac0: 66 72 61 67 6d 65 6e 74 72 65 76 69 73 69 6f 6e  fragmentrevision
2ad0: 73 5d 7d 20 7b 0a 09 09 74 72 6f 75 62 6c 65 20  s]} {...trouble 
2ae0: 69 6e 74 65 72 6e 61 6c 20 22 41 74 74 65 6d 70  internal "Attemp
2af0: 74 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e  ted to create an
2b00: 20 65 6d 70 74 79 20 63 68 61 6e 67 65 73 65 74   empty changeset
2b10: 2c 20 69 2e 65 2e 20 77 69 74 68 6f 75 74 20 72  , i.e. without r
2b20: 65 76 69 73 69 6f 6e 73 22 0a 09 20 20 20 20 7d  evisions"..    }
2b30: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 6e 65  ..    lappend ne
2b40: 77 63 73 65 74 73 20 5b 24 74 79 70 65 20 25 41  wcsets [$type %A
2b50: 55 54 4f 25 20 24 70 72 6f 6a 65 63 74 20 24 63  UTO% $project $c
2b60: 73 74 79 70 65 20 24 63 73 73 72 63 20 24 66 72  stype $cssrc $fr
2b70: 61 67 6d 65 6e 74 72 65 76 69 73 69 6f 6e 73 5d  agmentrevisions]
2b80: 0a 09 7d 0a 0a 09 66 6f 72 65 61 63 68 20 63 20  ..}...foreach c 
2b90: 24 6e 65 77 63 73 65 74 73 20 7b 20 24 63 20 70  $newcsets { $c p
2ba0: 65 72 73 69 73 74 20 7d 0a 09 72 65 74 75 72 6e  ersist }..return
2bb0: 20 24 6e 65 77 63 73 65 74 73 0a 20 20 20 20 7d   $newcsets.    }
2bc0: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ..    typemethod
2bd0: 20 73 74 72 6c 69 73 74 20 7b 63 68 61 6e 67 65   strlist {change
2be0: 73 65 74 73 7d 20 7b 0a 09 72 65 74 75 72 6e 20  sets} {..return 
2bf0: 5b 6a 6f 69 6e 20 5b 73 74 72 75 63 74 3a 3a 6c  [join [struct::l
2c00: 69 73 74 20 6d 61 70 20 24 63 68 61 6e 67 65 73  ist map $changes
2c10: 65 74 73 20 5b 6d 79 70 72 6f 63 20 49 44 5d 5d  ets [myproc ID]]
2c20: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f  ].    }..    pro
2c30: 63 20 49 44 20 7b 63 73 65 74 7d 20 7b 20 24 63  c ID {cset} { $c
2c40: 73 65 74 20 73 74 72 20 7d 0a 0a 20 20 20 20 23  set str }..    #
2c50: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20   # ## ### ##### 
2c60: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
2c70: 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 53 74  ######.    ## St
2c80: 61 74 65 0a 0a 20 20 20 20 76 61 72 69 61 62 6c  ate..    variabl
2c90: 65 20 6d 79 69 64 20 20 20 20 20 20 20 20 7b 7d  e myid        {}
2ca0: 20 3b 20 23 20 49 64 20 6f 66 20 74 68 65 20 63   ; # Id of the c
2cb0: 73 65 74 20 66 6f 72 20 74 68 65 20 70 65 72 73  set for the pers
2cc0: 69 73 74 65 6e 74 0a 09 09 09 20 20 20 20 20 20  istent....      
2cd0: 23 20 73 74 61 74 65 2e 0a 20 20 20 20 76 61 72  # state..    var
2ce0: 69 61 62 6c 65 20 6d 79 70 72 6f 6a 65 63 74 20  iable myproject 
2cf0: 20 20 7b 7d 20 3b 20 23 20 52 65 66 65 72 65 6e    {} ; # Referen
2d00: 63 65 20 6f 66 20 74 68 65 20 70 72 6f 6a 65 63  ce of the projec
2d10: 74 20 6f 62 6a 65 63 74 20 74 68 65 0a 09 09 09  t object the....
2d20: 20 20 20 20 20 20 23 20 63 68 61 6e 67 65 73 65        # changese
2d30: 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 20 20  t belongs to..  
2d40: 20 20 76 61 72 69 61 62 6c 65 20 6d 79 74 79 70    variable mytyp
2d50: 65 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 72 65  e      {} ; # re
2d60: 76 20 6f 72 20 73 79 6d 2c 20 77 68 65 72 65 20  v or sym, where 
2d70: 74 68 65 20 63 73 65 74 20 6f 72 69 67 69 6e 61  the cset origina
2d80: 74 65 64 0a 09 09 09 20 20 20 20 20 20 23 20 66  ted....      # f
2d90: 72 6f 6d 2e 0a 20 20 20 20 76 61 72 69 61 62 6c  rom..    variabl
2da0: 65 20 6d 79 73 72 63 69 64 20 20 20 20 20 7b 7d  e mysrcid     {}
2db0: 20 3b 20 23 20 49 64 20 6f 66 20 74 68 65 20 6d   ; # Id of the m
2dc0: 65 74 61 64 61 74 61 20 6f 72 20 73 79 6d 62 6f  etadata or symbo
2dd0: 6c 20 74 68 65 20 63 73 65 74 0a 09 09 09 20 20  l the cset....  
2de0: 20 20 20 20 23 20 69 73 20 62 61 73 65 64 20 6f      # is based o
2df0: 6e 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20  n..    variable 
2e00: 6d 79 72 65 76 69 73 69 6f 6e 73 20 7b 7d 20 3b  myrevisions {} ;
2e10: 20 23 20 4c 69 73 74 20 6f 66 20 74 68 65 20 66   # List of the f
2e20: 69 6c 65 20 6c 65 76 65 6c 20 72 65 76 69 73 69  ile level revisi
2e30: 6f 6e 73 20 69 6e 0a 09 09 09 20 20 20 20 20 20  ons in....      
2e40: 23 20 74 68 65 20 63 73 65 74 2e 0a 20 20 20 20  # the cset..    
2e50: 76 61 72 69 61 62 6c 65 20 6d 79 70 72 65 6d 61  variable myprema
2e60: 70 20 20 20 20 7b 7d 20 3b 20 23 20 44 69 63 74  p    {} ; # Dict
2e70: 69 6f 6e 61 72 79 20 6d 61 70 70 69 6e 67 20 66  ionary mapping f
2e80: 72 6f 6d 20 74 68 65 20 72 65 76 69 73 69 6f 6e  rom the revision
2e90: 73 0a 09 09 09 20 20 20 20 20 20 23 20 74 6f 20  s....      # to 
2ea0: 74 68 65 69 72 20 70 72 65 64 65 63 65 73 73 6f  their predecesso
2eb0: 72 73 2e 20 43 61 63 68 65 20 74 6f 20 61 76 6f  rs. Cache to avo
2ec0: 69 64 0a 09 09 09 20 20 20 20 20 20 23 20 6c 6f  id....      # lo
2ed0: 61 64 69 6e 67 20 74 68 69 73 20 66 72 6f 6d 20  ading this from 
2ee0: 74 68 65 20 73 74 61 74 65 20 6d 6f 72 65 20 74  the state more t
2ef0: 68 61 6e 0a 09 09 09 20 20 20 20 20 20 23 20 6f  han....      # o
2f00: 6e 63 65 2e 0a 20 20 20 20 76 61 72 69 61 62 6c  nce..    variabl
2f10: 65 20 6d 79 6e 65 78 74 6d 61 70 20 20 20 7b 7d  e mynextmap   {}
2f20: 20 3b 20 23 20 44 69 63 74 69 6f 6e 61 72 79 20   ; # Dictionary 
2f30: 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65  mapping from the
2f40: 20 72 65 76 69 73 69 6f 6e 73 0a 09 09 09 20 20   revisions....  
2f50: 20 20 20 20 23 20 74 6f 20 74 68 65 69 72 20 73      # to their s
2f60: 75 63 63 65 73 73 6f 72 73 2e 20 43 61 63 68 65  uccessors. Cache
2f70: 20 74 6f 20 61 76 6f 69 64 0a 09 09 09 20 20 20   to avoid....   
2f80: 20 20 20 23 20 6c 6f 61 64 69 6e 67 20 74 68 69     # loading thi
2f90: 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65  s from the state
2fa0: 20 6d 6f 72 65 20 74 68 61 6e 0a 09 09 09 20 20   more than....  
2fb0: 20 20 20 20 23 20 6f 6e 63 65 2e 0a 20 20 20 20      # once..    
2fc0: 76 61 72 69 61 62 6c 65 20 6d 79 70 6f 73 20 20  variable mypos  
2fd0: 20 20 20 20 20 7b 7d 20 3b 20 23 20 43 6f 6d 6d       {} ; # Comm
2fe0: 69 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  it position of t
2ff0: 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20 69 66  he changeset, if
3000: 0a 09 09 09 20 20 20 20 20 20 23 20 6b 6e 6f 77  ....      # know
3010: 6e 2e 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23  n...    # # ## #
3020: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
3030: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  # #############.
3040: 20 20 20 20 23 23 20 49 6e 74 65 72 6e 61 6c 20      ## Internal 
3050: 6d 65 74 68 6f 64 73 0a 0a 20 20 20 20 74 79 70  methods..    typ
3060: 65 76 61 72 69 61 62 6c 65 20 6d 79 63 6f 75 6e  evariable mycoun
3070: 74 65 72 20 20 20 20 20 20 20 20 30 20 3b 20 23  ter        0 ; #
3080: 20 49 64 20 63 6f 75 6e 74 65 72 20 66 6f 72 20   Id counter for 
3090: 63 73 65 74 73 2e 20 4c 61 73 74 20 69 64 20 75  csets. Last id u
30a0: 73 65 64 2e 0a 20 20 20 20 74 79 70 65 76 61 72  sed..    typevar
30b0: 69 61 62 6c 65 20 6d 79 63 73 74 79 70 65 20 2d  iable mycstype -
30c0: 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70  array {} ; # Map
30d0: 20 63 73 74 79 70 65 73 20 74 6f 20 70 65 72 73   cstypes to pers
30e0: 69 73 74 65 6e 74 20 69 64 73 2e 0a 0a 20 20 20  istent ids...   
30f0: 20 74 79 70 65 6d 65 74 68 6f 64 20 67 65 74 63   typemethod getc
3100: 73 74 79 70 65 73 20 7b 7d 20 7b 0a 09 66 6f 72  stypes {} {..for
3110: 65 61 63 68 20 7b 74 69 64 20 6e 61 6d 65 7d 20  each {tid name} 
3120: 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20  [state run {..  
3130: 20 20 53 45 4c 45 43 54 20 74 69 64 2c 20 6e 61    SELECT tid, na
3140: 6d 65 20 46 52 4f 4d 20 63 73 74 79 70 65 3b 0a  me FROM cstype;.
3150: 09 7d 5d 20 7b 20 73 65 74 20 6d 79 63 73 74 79  .}] { set mycsty
3160: 70 65 28 24 6e 61 6d 65 29 20 24 74 69 64 20 7d  pe($name) $tid }
3170: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
3180: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c      typemethod l
3190: 6f 61 64 63 6f 75 6e 74 65 72 20 7b 7d 20 7b 0a  oadcounter {} {.
31a0: 09 23 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  .# Initialize th
31b0: 65 20 63 6f 75 6e 74 65 72 20 66 72 6f 6d 20 74  e counter from t
31c0: 68 65 20 73 74 61 74 65 0a 09 73 65 74 20 6d 79  he state..set my
31d0: 63 6f 75 6e 74 65 72 20 5b 73 74 61 74 65 20 6f  counter [state o
31e0: 6e 65 20 7b 20 53 45 4c 45 43 54 20 4d 41 58 28  ne { SELECT MAX(
31f0: 63 69 64 29 20 46 52 4f 4d 20 63 68 61 6e 67 65  cid) FROM change
3200: 73 65 74 20 7d 5d 0a 09 72 65 74 75 72 6e 0a 20  set }]..return. 
3210: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 50     }..    proc P
3220: 75 6c 6c 49 6e 74 65 72 6e 61 6c 53 75 63 63 65  ullInternalSucce
3230: 73 73 6f 72 52 65 76 69 73 69 6f 6e 73 20 7b 64  ssorRevisions {d
3240: 76 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09  v revisions} {..
3250: 75 70 76 61 72 20 31 20 24 64 76 20 64 65 70 65  upvar 1 $dv depe
3260: 6e 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74 68  ndencies..set th
3270: 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65  eset ('[join $re
3280: 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29  visions {','}]')
3290: 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20  ...foreach {rid 
32a0: 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75  child} [state ru
32b0: 6e 20 22 0a 20 20 20 2d 2d 20 50 72 69 6d 61 72  n ".   -- Primar
32c0: 79 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20  y children..    
32d0: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e  SELECT R.rid, R.
32e0: 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20  child..    FROM 
32f0: 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20    revision R..  
3300: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20    WHERE  R.rid  
3310: 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20   IN $theset..   
3320: 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20   AND    R.child 
3330: 49 53 20 4e 4f 54 20 4e 55 4c 4c 0a 09 20 20 20  IS NOT NULL..   
3340: 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20   AND    R.child 
3350: 49 4e 20 24 74 68 65 73 65 74 0a 20 20 20 20 55  IN $theset.    U
3360: 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 54 72 61 6e  NION.    -- Tran
3370: 73 69 74 69 6f 6e 20 4e 54 44 42 20 74 6f 20 74  sition NTDB to t
3380: 72 75 6e 6b 0a 09 20 20 20 20 53 45 4c 45 43 54  runk..    SELECT
3390: 20 52 2e 72 69 64 2c 20 52 2e 64 62 63 68 69 6c   R.rid, R.dbchil
33a0: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65  d..    FROM   re
33b0: 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48  vision R..    WH
33c0: 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20  ERE  R.rid   IN 
33d0: 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44  $theset..    AND
33e0: 20 20 20 20 52 2e 64 62 63 68 69 6c 64 20 49 53      R.dbchild IS
33f0: 20 4e 4f 54 20 4e 55 4c 4c 0a 09 20 20 20 20 41   NOT NULL..    A
3400: 4e 44 20 20 20 20 52 2e 64 62 63 68 69 6c 64 20  ND    R.dbchild 
3410: 49 4e 20 24 74 68 65 73 65 74 0a 20 20 20 20 55  IN $theset.    U
3420: 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 53 65 63 6f  NION.    -- Seco
3430: 6e 64 61 72 79 20 28 62 72 61 6e 63 68 29 20 63  ndary (branch) c
3440: 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 53 45 4c  hildren..    SEL
3450: 45 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 72 69  ECT R.rid, B.bri
3460: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65  d..    FROM   re
3470: 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69  vision R, revisi
3480: 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64 72 65 6e  onbranchchildren
3490: 20 42 0a 09 20 20 20 20 57 48 45 52 45 20 20 52   B..    WHERE  R
34a0: 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65  .rid   IN $these
34b0: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e  t..    AND    R.
34c0: 72 69 64 20 3d 20 42 2e 72 69 64 0a 09 20 20 20  rid = B.rid..   
34d0: 20 41 4e 44 20 20 20 20 42 2e 62 72 69 64 20 49   AND    B.brid I
34e0: 4e 20 24 74 68 65 73 65 74 0a 09 22 5d 20 7b 0a  N $theset.."] {.
34f0: 09 20 20 20 20 23 20 43 6f 6e 73 69 64 65 72 20  .    # Consider 
3500: 6d 6f 76 69 6e 67 20 74 68 69 73 20 74 6f 20 74  moving this to t
3510: 68 65 20 69 6e 74 65 67 72 69 74 79 20 6d 6f 64  he integrity mod
3520: 75 6c 65 2e 0a 09 20 20 20 20 69 66 20 7b 24 72  ule...    if {$r
3530: 69 64 20 3d 3d 20 24 63 68 69 6c 64 7d 20 7b 0a  id == $child} {.
3540: 09 09 74 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e  ..trouble intern
3550: 61 6c 20 22 52 65 76 69 73 69 6f 6e 20 24 72 69  al "Revision $ri
3560: 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 74 73  d depends on its
3570: 65 6c 66 2e 22 0a 09 20 20 20 20 7d 0a 09 20 20  elf."..    }..  
3580: 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64    lappend depend
3590: 65 6e 63 69 65 73 28 24 72 69 64 29 20 24 63 68  encies($rid) $ch
35a0: 69 6c 64 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20  ild..}.    }..  
35b0: 20 20 70 72 6f 63 20 50 75 6c 6c 53 75 63 63 65    proc PullSucce
35c0: 73 73 6f 72 52 65 76 69 73 69 6f 6e 73 20 7b 64  ssorRevisions {d
35d0: 76 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09  v revisions} {..
35e0: 75 70 76 61 72 20 31 20 24 64 76 20 64 65 70 65  upvar 1 $dv depe
35f0: 6e 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74 68  ndencies..set th
3600: 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65  eset ('[join $re
3610: 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29  visions {','}]')
3620: 0a 0a 09 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ...# The followi
3630: 6e 67 20 63 61 73 65 73 20 73 70 65 63 69 66 79  ng cases specify
3640: 20 77 68 65 6e 20 61 20 72 65 76 69 73 69 6f 6e   when a revision
3650: 20 53 20 69 73 20 61 20 73 75 63 63 65 73 73 6f   S is a successo
3660: 72 0a 09 23 20 6f 66 20 61 20 72 65 76 69 73 69  r..# of a revisi
3670: 6f 6e 20 52 2e 20 45 61 63 68 20 6f 66 20 74 68  on R. Each of th
3680: 65 20 63 61 73 65 73 20 74 72 61 6e 73 6c 61 74  e cases translat
3690: 65 73 20 69 6e 74 6f 20 6f 6e 65 20 6f 66 0a 09  es into one of..
36a0: 23 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 6f  # the branches o
36b0: 66 20 74 68 65 20 53 51 4c 20 55 4e 49 4f 4e 20  f the SQL UNION 
36c0: 63 6f 6d 69 6e 67 20 62 65 6c 6f 77 2e 0a 09 23  coming below...#
36d0: 0a 09 23 20 28 31 29 20 53 20 63 61 6e 20 62 65  ..# (1) S can be
36e0: 20 61 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64   a primary child
36f0: 20 6f 66 20 52 2c 20 69 2e 65 2e 20 69 6e 20 74   of R, i.e. in t
3700: 68 65 20 73 61 6d 65 20 4c 4f 44 2e 20 52 0a 09  he same LOD. R..
3710: 23 20 20 20 20 20 72 65 66 65 72 65 6e 63 65 73  #     references
3720: 20 53 20 64 69 72 65 63 74 6c 79 2e 20 52 2e 63   S directly. R.c
3730: 68 69 6c 64 20 3d 20 53 28 2e 72 69 64 29 2c 20  hild = S(.rid), 
3740: 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a 09 23  if it exists...#
3750: 0a 09 23 20 28 32 29 20 53 20 63 61 6e 20 62 65  ..# (2) S can be
3760: 20 61 20 73 65 63 6f 6e 64 61 72 79 2c 20 69 2e   a secondary, i.
3770: 65 2e 20 62 72 61 6e 63 68 2c 20 63 68 69 6c 64  e. branch, child
3780: 20 6f 66 20 52 2e 20 48 65 72 65 20 74 68 65 0a   of R. Here the.
3790: 09 23 20 20 20 20 20 6c 69 6e 6b 20 69 73 20 6d  .#     link is m
37a0: 61 64 65 20 74 68 72 6f 75 67 68 20 74 68 65 20  ade through the 
37b0: 68 65 6c 70 65 72 20 74 61 62 6c 65 0a 09 23 20  helper table..# 
37c0: 20 20 20 20 52 45 56 49 53 49 4f 4e 42 52 41 4e      REVISIONBRAN
37d0: 43 48 43 48 49 4c 44 52 45 4e 2e 20 52 2e 72 69  CHCHILDREN. R.ri
37e0: 64 20 2d 3e 20 52 42 43 2e 72 69 64 2c 20 52 42  d -> RBC.rid, RB
37f0: 43 2e 62 72 69 64 20 3d 0a 09 23 20 20 20 20 20  C.brid =..#     
3800: 53 28 2e 72 69 64 29 0a 09 23 0a 09 23 20 28 33  S(.rid)..#..# (3
3810: 29 20 49 66 20 52 20 69 73 20 74 68 65 20 74 72  ) If R is the tr
3820: 75 6e 6b 20 72 6f 6f 74 20 6f 66 20 69 74 73 20  unk root of its 
3830: 66 69 6c 65 20 61 6e 64 20 53 20 69 73 20 74 68  file and S is th
3840: 65 20 72 6f 6f 74 20 6f 66 0a 09 23 20 20 20 20  e root of..#    
3850: 20 74 68 65 20 4e 54 44 42 20 6f 66 20 74 68 65   the NTDB of the
3860: 20 73 61 6d 65 20 66 69 6c 65 2c 20 74 68 65 6e   same file, then
3870: 20 53 20 69 73 20 61 20 73 75 63 63 65 73 73 6f   S is a successo
3880: 72 20 6f 66 0a 09 23 20 20 20 20 20 52 2e 20 54  r of..#     R. T
3890: 68 65 72 65 20 69 73 20 6e 6f 20 64 69 72 65 63  here is no direc
38a0: 74 20 6c 69 6e 6b 20 62 65 74 77 65 65 6e 20 74  t link between t
38b0: 68 65 20 74 77 6f 20 69 6e 20 74 68 65 0a 09 23  he two in the..#
38c0: 20 20 20 20 20 64 61 74 61 62 61 73 65 2e 20 41       database. A
38d0: 6e 20 69 6e 64 69 72 65 63 74 20 6c 69 6e 6b 20  n indirect link 
38e0: 63 61 6e 20 62 65 20 6d 61 64 65 20 74 68 72 6f  can be made thro
38f0: 75 67 68 20 74 68 65 20 46 49 4c 45 0a 09 23 20  ugh the FILE..# 
3900: 20 20 20 20 74 68 65 79 20 62 65 6c 6f 6e 67 20      they belong 
3910: 74 6f 6f 2c 20 61 6e 64 20 74 68 65 69 72 20 63  too, and their c
3920: 6f 6d 62 69 6e 61 74 69 6f 6e 20 6f 66 20 61 74  ombination of at
3930: 74 72 69 62 75 74 65 73 20 74 6f 0a 09 23 20 20  tributes to..#  
3940: 20 20 20 69 64 65 6e 74 69 66 79 20 74 68 65 6d     identify them
3950: 2e 20 57 65 20 63 68 65 63 6b 20 52 20 66 6f 72  . We check R for
3960: 20 74 72 75 6e 6b 20 72 6f 6f 74 6e 65 73 73 20   trunk rootness 
3970: 61 6e 64 20 74 68 65 6e 0a 09 23 20 20 20 20 20  and then..#     
3980: 73 65 6c 65 63 74 20 66 6f 72 20 74 68 65 20 4e  select for the N
3990: 54 44 42 20 72 6f 6f 74 2c 20 63 72 6f 73 73 69  TDB root, crossi
39a0: 6e 67 20 74 68 65 20 74 61 62 6c 65 20 77 69 74  ng the table wit
39b0: 68 0a 09 23 20 20 20 20 20 69 74 73 65 6c 66 2e  h..#     itself.
39c0: 0a 09 23 0a 09 23 20 28 34 29 20 49 66 20 52 20  ..#..# (4) If R 
39d0: 69 73 20 74 68 65 20 6c 61 73 74 20 6f 66 20 74  is the last of t
39e0: 68 65 20 4e 54 44 42 20 72 65 76 69 73 69 6f 6e  he NTDB revision
39f0: 73 20 77 68 69 63 68 20 62 65 6c 6f 6e 67 20 74  s which belong t
3a00: 6f 0a 09 23 20 20 20 20 20 74 68 65 20 74 72 75  o..#     the tru
3a10: 6e 6b 2c 20 74 68 65 6e 20 74 68 65 20 70 72 69  nk, then the pri
3a20: 6d 61 72 79 20 63 68 69 6c 64 20 6f 66 20 74 68  mary child of th
3a30: 65 20 74 72 75 6e 6b 20 72 6f 6f 74 20 28 74 68  e trunk root (th
3a40: 65 0a 09 23 20 20 20 20 20 27 31 2e 32 27 20 72  e..#     '1.2' r
3a50: 65 76 69 73 69 6f 6e 29 20 69 73 20 61 20 73 75  evision) is a su
3a60: 63 63 65 73 73 6f 72 2c 20 69 66 20 69 74 20 65  ccessor, if it e
3a70: 78 69 73 74 73 2e 0a 0a 09 66 6f 72 65 61 63 68  xists....foreach
3a80: 20 7b 72 69 64 20 63 68 69 6c 64 7d 20 5b 73 74   {rid child} [st
3a90: 61 74 65 20 72 75 6e 20 22 0a 20 20 20 2d 2d 20  ate run ".   -- 
3aa0: 28 31 29 20 50 72 69 6d 61 72 79 20 63 68 69 6c  (1) Primary chil
3ab0: 64 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e  d..    SELECT R.
3ac0: 72 69 64 2c 20 52 2e 63 68 69 6c 64 0a 09 20 20  rid, R.child..  
3ad0: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f    FROM   revisio
3ae0: 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 20  n R..    WHERE  
3af0: 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73  R.rid   IN $thes
3b00: 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69  et     -- Restri
3b10: 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20  ct to revisions 
3b20: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20  of interest..   
3b30: 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20   AND    R.child 
3b40: 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d  IS NOT NULL    -
3b50: 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 68  - Has primary ch
3b60: 69 6c 64 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20  ild.    UNION.  
3b70: 20 20 2d 2d 20 28 32 29 20 53 65 63 6f 6e 64 61    -- (2) Seconda
3b80: 72 79 20 28 62 72 61 6e 63 68 29 20 63 68 69 6c  ry (branch) chil
3b90: 64 72 65 6e 0a 09 20 20 20 20 53 45 4c 45 43 54  dren..    SELECT
3ba0: 20 52 2e 72 69 64 2c 20 42 2e 62 72 69 64 0a 09   R.rid, B.brid..
3bb0: 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73      FROM   revis
3bc0: 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 62  ion R, revisionb
3bd0: 72 61 6e 63 68 63 68 69 6c 64 72 65 6e 20 42 0a  ranchchildren B.
3be0: 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69  .    WHERE  R.ri
3bf0: 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20  d   IN $theset  
3c00: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74     -- Restrict t
3c10: 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69  o revisions of i
3c20: 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44  nterest..    AND
3c30: 20 20 20 20 52 2e 72 69 64 20 3d 20 42 2e 72 69      R.rid = B.ri
3c40: 64 20 20 20 20 20 20 20 20 20 20 2d 2d 20 53 65  d          -- Se
3c50: 6c 65 63 74 20 73 75 62 73 65 74 20 6f 66 20 62  lect subset of b
3c60: 72 61 6e 63 68 20 63 68 69 6c 64 72 65 6e 0a 20  ranch children. 
3c70: 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20     UNION.    -- 
3c80: 28 33 29 20 4e 54 44 42 20 72 6f 6f 74 20 73 75  (3) NTDB root su
3c90: 63 63 65 73 73 6f 72 20 6f 66 20 54 72 75 6e 6b  ccessor of Trunk
3ca0: 20 72 6f 6f 74 0a 09 20 20 20 20 53 45 4c 45 43   root..    SELEC
3cb0: 54 20 52 2e 72 69 64 2c 20 52 58 2e 72 69 64 0a  T R.rid, RX.rid.
3cc0: 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69  .    FROM   revi
3cd0: 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e  sion R, revision
3ce0: 20 52 58 0a 09 20 20 20 20 57 48 45 52 45 20 20   RX..    WHERE  
3cf0: 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73  R.rid   IN $thes
3d00: 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69  et     -- Restri
3d10: 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20  ct to revisions 
3d20: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20  of interest..   
3d30: 20 41 4e 44 20 20 20 20 52 2e 70 61 72 65 6e 74   AND    R.parent
3d40: 20 49 53 20 4e 55 4c 4c 20 20 20 20 20 20 20 2d   IS NULL       -
3d50: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 6f  - Restrict to ro
3d60: 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 4e  ot..    AND    N
3d70: 4f 54 20 52 2e 69 73 64 65 66 61 75 6c 74 20 20  OT R.isdefault  
3d80: 20 20 20 20 20 20 2d 2d 20 6f 6e 20 74 68 65 20        -- on the 
3d90: 74 72 75 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20  trunk..    AND  
3da0: 20 20 52 2e 66 69 64 20 3d 20 52 58 2e 66 69 64    R.fid = RX.fid
3db0: 20 20 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65           -- Sele
3dc0: 63 74 20 61 6c 6c 20 72 65 76 69 73 69 6f 6e 20  ct all revision 
3dd0: 69 6e 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  in the same file
3de0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 58 2e  ..    AND    RX.
3df0: 70 61 72 65 6e 74 20 49 53 20 4e 55 4c 4c 20 20  parent IS NULL  
3e00: 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20      -- Restrict 
3e10: 74 6f 20 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44  to root..    AND
3e20: 20 20 20 20 52 58 2e 69 73 64 65 66 61 75 6c 74      RX.isdefault
3e30: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 6f 6e             -- on
3e40: 20 74 68 65 20 4e 54 44 42 0a 20 20 20 20 55 4e   the NTDB.    UN
3e50: 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 34 29 20 43  ION.    -- (4) C
3e60: 68 69 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f  hild of trunk ro
3e70: 6f 74 20 73 75 63 63 65 73 73 6f 72 20 6f 66 20  ot successor of 
3e80: 6c 61 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 75  last NTDB on tru
3e90: 6e 6b 2e 0a 09 20 20 20 20 53 45 4c 45 43 54 20  nk...    SELECT 
3ea0: 52 2e 72 69 64 2c 20 52 41 2e 63 68 69 6c 64 0a  R.rid, RA.child.
3eb0: 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69  .    FROM revisi
3ec0: 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 52  on R, revision R
3ed0: 41 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e 72  A..    WHERE R.r
3ee0: 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20  id   IN $theset 
3ef0: 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74       -- Restrict
3f00: 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66   to revisions of
3f10: 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41   interest..    A
3f20: 4e 44 20 20 20 52 2e 69 73 64 65 66 61 75 6c 74  ND   R.isdefault
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
3f40: 52 65 73 74 72 69 63 74 20 74 6f 20 4e 54 44 42  Restrict to NTDB
3f50: 0a 09 20 20 20 20 41 4e 44 20 20 20 52 2e 64 62  ..    AND   R.db
3f60: 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c  child IS NOT NUL
3f70: 4c 20 20 20 2d 2d 20 61 6e 64 20 6c 61 73 74 20  L   -- and last 
3f80: 4e 54 44 42 20 62 65 6c 6f 6e 67 69 6e 67 20 74  NTDB belonging t
3f90: 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20 41 4e 44  o trunk..    AND
3fa0: 20 20 20 52 41 2e 72 69 64 20 3d 20 52 2e 64 62     RA.rid = R.db
3fb0: 63 68 69 6c 64 20 20 20 20 20 20 2d 2d 20 47 6f  child      -- Go
3fc0: 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 72 75   directly to tru
3fd0: 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44  nk root..    AND
3fe0: 20 20 20 52 41 2e 63 68 69 6c 64 20 49 53 20 4e     RA.child IS N
3ff0: 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61  OT NULL    -- Ha
4000: 73 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 2e  s primary child.
4010: 0a 09 22 5d 20 7b 0a 09 20 20 20 20 23 20 43 6f  .."] {..    # Co
4020: 6e 73 69 64 65 72 20 6d 6f 76 69 6e 67 20 74 68  nsider moving th
4030: 69 73 20 74 6f 20 74 68 65 20 69 6e 74 65 67 72  is to the integr
4040: 69 74 79 20 6d 6f 64 75 6c 65 2e 0a 09 20 20 20  ity module...   
4050: 20 69 66 20 7b 24 72 69 64 20 3d 3d 20 24 63 68   if {$rid == $ch
4060: 69 6c 64 7d 20 7b 0a 09 09 74 72 6f 75 62 6c 65  ild} {...trouble
4070: 20 69 6e 74 65 72 6e 61 6c 20 22 52 65 76 69 73   internal "Revis
4080: 69 6f 6e 20 24 72 69 64 20 64 65 70 65 6e 64 73  ion $rid depends
4090: 20 6f 6e 20 69 74 73 65 6c 66 2e 22 0a 09 20 20   on itself."..  
40a0: 20 20 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64    }..    lappend
40b0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 24 72   dependencies($r
40c0: 69 64 29 20 24 63 68 69 6c 64 0a 09 7d 0a 09 72  id) $child..}..r
40d0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
40e0: 20 70 72 6f 63 20 50 75 6c 6c 50 72 65 64 65 63   proc PullPredec
40f0: 65 73 73 6f 72 52 65 76 69 73 69 6f 6e 73 20 7b  essorRevisions {
4100: 64 76 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a  dv revisions} {.
4110: 09 75 70 76 61 72 20 31 20 24 64 76 20 64 65 70  .upvar 1 $dv dep
4120: 65 6e 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74  endencies..set t
4130: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72  heset ('[join $r
4140: 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27  evisions {','}]'
4150: 29 0a 0a 09 23 20 54 68 65 20 66 6f 6c 6c 6f 77  )...# The follow
4160: 69 6e 67 20 63 61 73 65 73 20 73 70 65 63 69 66  ing cases specif
4170: 79 20 77 68 65 6e 20 61 20 72 65 76 69 73 69 6f  y when a revisio
4180: 6e 20 50 20 69 73 20 61 0a 09 23 20 70 72 65 64  n P is a..# pred
4190: 65 63 65 73 73 6f 72 20 6f 66 20 61 20 72 65 76  ecessor of a rev
41a0: 69 73 69 6f 6e 20 52 2e 20 45 61 63 68 20 6f 66  ision R. Each of
41b0: 20 74 68 65 20 63 61 73 65 73 20 74 72 61 6e 73   the cases trans
41c0: 6c 61 74 65 73 0a 09 23 20 69 6e 74 6f 20 6f 6e  lates..# into on
41d0: 65 20 6f 66 20 74 68 65 20 62 72 61 6e 63 68 65  e of the branche
41e0: 73 20 6f 66 20 74 68 65 20 53 51 4c 20 55 4e 49  s of the SQL UNI
41f0: 4f 4e 20 63 6f 6d 69 6e 67 20 62 65 6c 6f 77 2e  ON coming below.
4200: 0a 09 23 0a 09 23 20 28 31 29 20 54 68 65 20 69  ..#..# (1) The i
4210: 6d 6d 65 64 69 61 74 65 20 70 61 72 65 6e 74 20  mmediate parent 
4220: 52 2e 70 61 72 65 6e 74 20 6f 66 20 52 20 69 73  R.parent of R is
4230: 20 61 20 70 72 65 64 65 63 65 73 73 6f 72 20 6f   a predecessor o
4240: 66 0a 09 23 20 20 20 20 20 52 2e 20 4e 4f 54 45  f..#     R. NOTE
4250: 3a 20 54 68 69 73 20 69 73 20 74 72 75 65 20 66  : This is true f
4260: 6f 72 20 52 20 65 69 74 68 65 72 20 70 72 69 6d  or R either prim
4270: 61 72 79 20 6f 72 20 73 65 63 6f 6e 64 61 72 79  ary or secondary
4280: 0a 09 23 20 20 20 20 20 63 68 69 6c 64 20 6f 66  ..#     child of
4290: 20 50 2e 20 49 74 20 6e 6f 74 20 6e 65 63 65 73   P. It not neces
42a0: 73 61 72 79 20 74 6f 20 64 69 73 74 69 6e 67 75  sary to distingu
42b0: 69 73 68 20 74 68 65 20 74 77 6f 0a 09 23 20 20  ish the two..#  
42c0: 20 20 20 63 61 73 65 73 2c 20 69 6e 20 63 6f 6e     cases, in con
42d0: 74 72 61 73 74 20 74 6f 20 74 68 65 20 63 6f 64  trast to the cod
42e0: 65 20 72 65 74 72 69 65 76 69 6e 67 20 74 68 65  e retrieving the
42f0: 20 73 75 63 63 65 73 73 6f 72 0a 09 23 20 20 20   successor..#   
4300: 20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 09    information...
4310: 23 0a 09 23 20 28 32 29 20 54 68 65 20 63 6f 6d  #..# (2) The com
4320: 70 6c 65 6d 65 6e 74 20 6f 66 20 73 75 63 63 65  plement of succe
4330: 73 73 6f 72 20 63 61 73 65 20 28 33 29 2e 20 54  ssor case (3). T
4340: 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74 20 69 73  he trunk root is
4350: 0a 09 23 20 20 20 20 20 61 20 70 72 65 64 65 63  ..#     a predec
4360: 65 73 73 6f 72 20 6f 66 20 61 20 4e 54 44 42 20  essor of a NTDB 
4370: 72 6f 6f 74 2e 0a 09 23 0a 09 23 20 28 33 29 20  root...#..# (3) 
4380: 54 68 65 20 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f  The complement o
4390: 66 20 73 75 63 63 65 73 73 6f 72 20 63 61 73 65  f successor case
43a0: 20 28 34 29 2e 20 54 68 65 20 6c 61 73 74 20 4e   (4). The last N
43b0: 54 44 42 0a 09 23 20 20 20 20 20 72 65 76 69 73  TDB..#     revis
43c0: 69 6f 6e 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  ion belonging to
43d0: 20 74 68 65 20 74 72 75 6e 6b 20 69 73 20 61 20   the trunk is a 
43e0: 70 72 65 64 65 63 65 73 73 6f 72 20 6f 66 20 74  predecessor of t
43f0: 68 65 0a 09 23 20 20 20 20 20 70 72 69 6d 61 72  he..#     primar
4400: 79 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 74  y child of the t
4410: 72 75 6e 6b 20 72 6f 6f 74 20 28 54 68 65 20 27  runk root (The '
4420: 31 2e 32 27 20 72 65 76 69 73 69 6f 6e 29 2e 0a  1.2' revision)..
4430: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 70  ..foreach {rid p
4440: 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75  arent} [state ru
4450: 6e 20 22 0a 20 20 20 2d 2d 20 28 31 29 20 50 72  n ".   -- (1) Pr
4460: 69 6d 61 72 79 20 70 61 72 65 6e 74 2c 20 63 61  imary parent, ca
4470: 6e 20 62 65 20 69 6e 20 64 69 66 66 65 72 65 6e  n be in differen
4480: 74 20 4c 4f 44 20 66 6f 72 20 66 69 72 73 74 20  t LOD for first 
4490: 69 6e 20 61 20 62 72 61 6e 63 68 0a 09 20 20 20  in a branch..   
44a0: 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52   SELECT R.rid, R
44b0: 2e 70 61 72 65 6e 74 0a 09 20 20 20 20 46 52 4f  .parent..    FRO
44c0: 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 09  M   revision R..
44d0: 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64      WHERE  R.rid
44e0: 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20     IN $theset   
44f0: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f    -- Restrict to
4500: 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e   revisions of in
4510: 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20  terest..    AND 
4520: 20 20 20 52 2e 70 61 72 65 6e 74 20 49 53 20 4e     R.parent IS N
4530: 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d 20 48 61 73  OT NULL   -- Has
4540: 20 70 72 69 6d 61 72 79 20 70 61 72 65 6e 74 0a   primary parent.
4550: 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d      UNION.    --
4560: 20 28 32 29 20 54 72 75 6e 6b 20 72 6f 6f 74 20   (2) Trunk root 
4570: 70 72 65 64 65 63 65 73 73 6f 72 20 6f 66 20 4e  predecessor of N
4580: 54 44 42 20 72 6f 6f 74 2e 0a 09 20 20 20 20 53  TDB root...    S
4590: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 58 2e  ELECT R.rid, RX.
45a0: 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  rid..    FROM   
45b0: 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69  revision R, revi
45c0: 73 69 6f 6e 20 52 58 0a 09 20 20 20 20 57 48 45  sion RX..    WHE
45d0: 52 45 20 20 52 2e 72 69 64 20 49 4e 20 24 74 68  RE  R.rid IN $th
45e0: 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74  eset     -- Rest
45f0: 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e  rict to revision
4600: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20  s of interest.. 
4610: 20 20 20 41 4e 44 20 20 20 20 52 2e 70 61 72 65     AND    R.pare
4620: 6e 74 20 49 53 20 4e 55 4c 4c 20 20 20 20 20 2d  nt IS NULL     -
4630: 2d 20 77 68 69 63 68 20 61 72 65 20 72 6f 6f 74  - which are root
4640: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 69  ..    AND    R.i
4650: 73 64 65 66 61 75 6c 74 20 20 20 20 20 20 20 20  sdefault        
4660: 20 20 2d 2d 20 6f 6e 20 4e 54 44 42 0a 09 20 20    -- on NTDB..  
4670: 20 20 41 4e 44 20 20 20 20 52 2e 66 69 64 20 3d    AND    R.fid =
4680: 20 52 58 2e 66 69 64 20 20 20 20 20 20 20 2d 2d   RX.fid       --
4690: 20 53 65 6c 65 63 74 20 61 6c 6c 20 72 65 76 69   Select all revi
46a0: 73 69 6f 6e 20 69 6e 20 74 68 65 20 73 61 6d 65  sion in the same
46b0: 20 66 69 6c 65 0a 09 20 20 20 20 41 4e 44 20 20   file..    AND  
46c0: 20 20 52 58 2e 70 61 72 65 6e 74 20 49 53 20 4e    RX.parent IS N
46d0: 55 4c 4c 20 20 20 20 2d 2d 20 77 68 69 63 68 20  ULL    -- which 
46e0: 61 72 65 20 72 6f 6f 74 0a 09 20 20 20 20 41 4e  are root..    AN
46f0: 44 20 20 20 20 4e 4f 54 20 52 58 2e 69 73 64 65  D    NOT RX.isde
4700: 66 61 75 6c 74 20 20 20 20 20 2d 2d 20 6f 6e 20  fault     -- on 
4710: 74 68 65 20 74 72 75 6e 6b 0a 20 20 20 20 55 4e  the trunk.    UN
4720: 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 33 29 20 4c  ION.    -- (3) L
4730: 61 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e  ast NTDB on trun
4740: 6b 20 69 73 20 70 72 65 64 65 63 65 73 73 6f 72  k is predecessor
4750: 20 6f 66 20 63 68 69 6c 64 20 6f 66 20 74 72 75   of child of tru
4760: 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 20 53 45 4c  nk root..    SEL
4770: 45 43 54 20 52 2e 72 69 64 2c 20 52 41 2e 64 62  ECT R.rid, RA.db
4780: 70 61 72 65 6e 74 0a 09 20 20 20 20 46 52 4f 4d  parent..    FROM
4790: 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76   revision R, rev
47a0: 69 73 69 6f 6e 20 52 41 0a 09 20 20 20 20 57 48  ision RA..    WH
47b0: 45 52 45 20 52 2e 72 69 64 20 49 4e 20 24 74 68  ERE R.rid IN $th
47c0: 65 73 65 74 20 20 20 20 20 20 20 2d 2d 20 52 65  eset       -- Re
47d0: 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69  strict to revisi
47e0: 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  ons of interest.
47f0: 09 20 20 20 20 41 4e 44 20 4e 4f 54 20 52 2e 69  .    AND NOT R.i
4800: 73 64 65 66 61 75 6c 74 20 20 20 20 20 20 20 20  sdefault        
4810: 20 20 2d 2d 20 6e 6f 74 20 6f 6e 20 4e 54 44 42    -- not on NTDB
4820: 0a 09 20 20 20 20 41 4e 44 20 52 2e 70 61 72 65  ..    AND R.pare
4830: 6e 74 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20  nt IS NOT NULL  
4840: 20 20 20 2d 2d 20 77 68 69 63 68 20 61 72 65 20     -- which are 
4850: 6e 6f 74 20 72 6f 6f 74 0a 09 20 20 20 20 41 4e  not root..    AN
4860: 44 20 52 41 2e 72 69 64 20 3d 20 52 2e 70 61 72  D RA.rid = R.par
4870: 65 6e 74 20 20 20 20 20 20 20 20 2d 2d 20 67 6f  ent        -- go
4880: 20 74 6f 20 74 68 65 69 72 20 70 61 72 65 6e 74   to their parent
4890: 0a 09 20 20 20 20 41 4e 44 20 52 41 2e 64 62 70  ..    AND RA.dbp
48a0: 61 72 65 6e 74 20 49 53 20 4e 4f 54 20 4e 55 4c  arent IS NOT NUL
48b0: 4c 20 20 2d 2d 20 77 68 69 63 68 20 68 61 73 20  L  -- which has 
48c0: 74 6f 20 72 65 66 65 72 20 74 6f 20 4e 54 44 42  to refer to NTDB
48d0: 27 73 20 72 6f 6f 74 0a 09 22 5d 20 7b 0a 09 20  's root.."] {.. 
48e0: 20 20 20 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f     # Consider mo
48f0: 76 69 6e 67 20 74 68 69 73 20 74 6f 20 74 68 65  ving this to the
4900: 20 69 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 6c   integrity modul
4910: 65 2e 0a 09 20 20 20 20 69 66 20 7b 24 72 69 64  e...    if {$rid
4920: 20 3d 3d 20 24 70 61 72 65 6e 74 7d 20 7b 0a 09   == $parent} {..
4930: 09 74 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61  .trouble interna
4940: 6c 20 22 52 65 76 69 73 69 6f 6e 20 24 72 69 64  l "Revision $rid
4950: 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 65   depends on itse
4960: 6c 66 2e 22 0a 09 20 20 20 20 7d 0a 09 20 20 20  lf."..    }..   
4970: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65   lappend depende
4980: 6e 63 69 65 73 28 24 72 69 64 29 20 24 70 61 72  ncies($rid) $par
4990: 65 6e 74 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20  ent..}..return. 
49a0: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 49     }..    proc I
49b0: 6e 69 74 69 61 6c 69 7a 65 42 72 65 61 6b 53 74  nitializeBreakSt
49c0: 61 74 65 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20  ate {revisions} 
49d0: 7b 0a 09 75 70 76 61 72 20 31 20 70 6f 73 20 70  {..upvar 1 pos p
49e0: 6f 73 20 63 72 6f 73 73 20 63 72 6f 73 73 20 72  os cross cross r
49f0: 61 6e 67 65 20 72 61 6e 67 65 20 64 65 70 63 20  ange range depc 
4a00: 64 65 70 63 20 64 65 6c 74 61 20 64 65 6c 74 61  depc delta delta
4a10: 20 5c 0a 09 20 20 20 20 64 65 70 65 6e 64 65 6e   \..    dependen
4a20: 63 69 65 73 20 64 65 70 65 6e 64 65 6e 63 69 65  cies dependencie
4a30: 73 0a 0a 09 23 20 46 69 72 73 74 20 77 65 20 63  s...# First we c
4a40: 72 65 61 74 65 20 61 20 6d 61 70 20 6f 66 20 70  reate a map of p
4a50: 6f 73 69 74 69 6f 6e 73 20 74 6f 20 6d 61 6b 65  ositions to make
4a60: 20 69 74 20 65 61 73 69 65 72 20 74 6f 0a 09 23   it easier to..#
4a70: 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   determine wheth
4a80: 65 72 20 61 20 64 65 70 65 6e 64 65 6e 63 79 20  er a dependency 
4a90: 63 72 6f 73 73 65 73 20 61 20 70 61 72 74 69 63  crosses a partic
4aa0: 75 6c 61 72 20 69 6e 64 65 78 2e 0a 0a 09 61 72  ular index....ar
4ab0: 72 61 79 20 73 65 74 20 70 6f 73 20 20 20 7b 7d  ray set pos   {}
4ac0: 0a 09 61 72 72 61 79 20 73 65 74 20 63 72 6f 73  ..array set cros
4ad0: 73 20 7b 7d 0a 09 61 72 72 61 79 20 73 65 74 20  s {}..array set 
4ae0: 64 65 70 63 20 20 7b 7d 0a 09 73 65 74 20 72 61  depc  {}..set ra
4af0: 6e 67 65 20 20 20 20 20 20 20 7b 7d 0a 09 73 65  nge       {}..se
4b00: 74 20 6e 20 30 0a 09 66 6f 72 65 61 63 68 20 72  t n 0..foreach r
4b10: 65 76 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 20  ev $revisions { 
4b20: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 72 61  ..    lappend ra
4b30: 6e 67 65 20 24 6e 0a 09 20 20 20 20 73 65 74 20  nge $n..    set 
4b40: 70 6f 73 28 24 72 65 76 29 20 24 6e 0a 09 20 20  pos($rev) $n..  
4b50: 20 20 73 65 74 20 63 72 6f 73 73 28 24 6e 29 20    set cross($n) 
4b60: 30 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d  0..    incr n..}
4b70: 0a 0a 09 23 20 53 65 63 6f 6e 64 6c 79 20 77 65  ...# Secondly we
4b80: 20 63 6f 75 6e 74 20 74 68 65 20 63 72 6f 73 73   count the cross
4b90: 69 6e 67 73 20 70 65 72 20 70 6f 73 69 74 69 6f  ings per positio
4ba0: 6e 2c 20 62 79 20 69 74 65 72 61 74 69 6e 67 0a  n, by iterating.
4bb0: 09 23 20 6f 76 65 72 20 74 68 65 20 72 65 63 6f  .# over the reco
4bc0: 72 64 65 64 20 69 6e 74 65 72 6e 61 6c 20 64 65  rded internal de
4bd0: 70 65 6e 64 65 6e 63 69 65 73 2e 0a 0a 09 23 20  pendencies....# 
4be0: 4e 6f 74 65 3a 20 49 66 20 74 68 65 20 74 69 6d  Note: If the tim
4bf0: 65 73 74 61 6d 70 73 20 61 72 65 20 62 61 64 6c  estamps are badl
4c00: 79 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 20 69  y out of order i
4c10: 74 20 69 73 0a 09 23 20 20 20 20 20 20 20 70 6f  t is..#       po
4c20: 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20 61  ssible to have a
4c30: 20 62 61 63 6b 77 61 72 64 20 73 75 63 63 65 73   backward succes
4c40: 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 79 2c 0a  sor dependency,.
4c50: 09 23 20 20 20 20 20 20 20 69 2e 65 2e 20 77 69  .#       i.e. wi
4c60: 74 68 20 73 74 61 72 74 20 3e 20 65 6e 64 2e 20  th start > end. 
4c70: 57 65 20 6d 61 79 20 68 61 76 65 20 74 6f 20 73  We may have to s
4c80: 77 61 70 20 74 68 65 20 69 6e 64 69 63 65 73 0a  wap the indices.
4c90: 09 23 20 20 20 20 20 20 20 74 6f 20 65 6e 73 75  .#       to ensu
4ca0: 72 65 20 74 68 61 74 20 74 68 65 20 66 6f 6c 6c  re that the foll
4cb0: 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20  owing loop runs 
4cc0: 63 6f 72 72 65 63 74 6c 79 2e 0a 09 23 0a 09 23  correctly...#..#
4cd0: 20 4e 6f 74 65 20 32 3a 20 73 74 61 72 74 20 3d   Note 2: start =
4ce0: 3d 20 65 6e 64 20 69 73 20 6e 6f 74 20 70 6f 73  = end is not pos
4cf0: 73 69 62 6c 65 2e 20 49 74 20 69 6e 64 69 63 61  sible. It indica
4d00: 74 65 73 20 61 0a 09 23 20 20 20 20 20 20 20 20  tes a..#        
4d10: 20 73 65 6c 66 2d 64 65 70 65 6e 64 65 6e 63 79   self-dependency
4d20: 20 64 75 65 20 74 6f 20 74 68 65 20 75 6e 69 71   due to the uniq
4d30: 75 65 6e 65 73 73 20 6f 66 20 70 6f 73 69 74 69  ueness of positi
4d40: 6f 6e 73 2c 0a 09 23 20 20 20 20 20 20 20 20 20  ons,..#         
4d50: 61 6e 64 20 74 68 61 74 20 69 73 20 73 6f 6d 65  and that is some
4d60: 74 68 69 6e 67 20 77 65 20 68 61 76 65 20 72 75  thing we have ru
4d70: 6c 65 64 20 6f 75 74 20 61 6c 72 65 61 64 79 2c  led out already,
4d80: 20 73 65 65 0a 09 23 20 20 20 20 20 20 20 20 20   see..#         
4d90: 50 75 6c 6c 49 6e 74 65 72 6e 61 6c 53 75 63 63  PullInternalSucc
4da0: 65 73 73 6f 72 52 65 76 69 73 69 6f 6e 73 2e 0a  essorRevisions..
4db0: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63  ..foreach {rid c
4dc0: 68 69 6c 64 7d 20 5b 61 72 72 61 79 20 67 65 74  hild} [array get
4dd0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 5d 20 7b   dependencies] {
4de0: 0a 09 20 20 20 20 73 65 74 20 64 6b 65 79 20 20  ..    set dkey  
4df0: 20 20 5b 6c 69 73 74 20 24 72 69 64 20 24 63 68    [list $rid $ch
4e00: 69 6c 64 5d 0a 09 20 20 20 20 73 65 74 20 73 74  ild]..    set st
4e10: 61 72 74 20 20 20 24 70 6f 73 28 24 72 69 64 29  art   $pos($rid)
4e20: 0a 09 20 20 20 20 73 65 74 20 65 6e 64 20 20 20  ..    set end   
4e30: 20 20 24 70 6f 73 28 24 63 68 69 6c 64 29 0a 09    $pos($child)..
4e40: 20 20 20 20 73 65 74 20 63 72 6f 73 73 65 73 20      set crosses 
4e50: 7b 7d 0a 0a 09 20 20 20 20 69 66 20 7b 24 73 74  {}...    if {$st
4e60: 61 72 74 20 3e 20 24 65 6e 64 7d 20 7b 0a 09 09  art > $end} {...
4e70: 77 68 69 6c 65 20 7b 24 65 6e 64 20 3c 20 24 73  while {$end < $s
4e80: 74 61 72 74 7d 20 7b 0a 09 09 20 20 20 20 6c 61  tart} {...    la
4e90: 70 70 65 6e 64 20 63 72 6f 73 73 65 73 20 24 65  ppend crosses $e
4ea0: 6e 64 0a 09 09 20 20 20 20 69 6e 63 72 20 63 72  nd...    incr cr
4eb0: 6f 73 73 28 24 65 6e 64 29 0a 09 09 20 20 20 20  oss($end)...    
4ec0: 69 6e 63 72 20 65 6e 64 0a 09 09 7d 0a 09 20 20  incr end...}..  
4ed0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 77 68 69    } else {...whi
4ee0: 6c 65 20 7b 24 73 74 61 72 74 20 3c 20 24 65 6e  le {$start < $en
4ef0: 64 7d 20 7b 0a 09 09 20 20 20 20 6c 61 70 70 65  d} {...    lappe
4f00: 6e 64 20 63 72 6f 73 73 65 73 20 24 73 74 61 72  nd crosses $star
4f10: 74 0a 09 09 20 20 20 20 69 6e 63 72 20 63 72 6f  t...    incr cro
4f20: 73 73 28 24 73 74 61 72 74 29 0a 09 09 20 20 20  ss($start)...   
4f30: 20 69 6e 63 72 20 73 74 61 72 74 0a 09 09 7d 0a   incr start...}.
4f40: 09 20 20 20 20 7d 0a 09 20 20 20 20 73 65 74 20  .    }..    set 
4f50: 64 65 70 63 28 24 64 6b 65 79 29 20 24 63 72 6f  depc($dkey) $cro
4f60: 73 73 65 73 0a 09 7d 0a 0a 09 49 6e 69 74 69 61  sses..}...Initia
4f70: 6c 69 7a 65 44 65 6c 74 61 73 20 24 72 65 76 69  lizeDeltas $revi
4f80: 73 69 6f 6e 73 0a 09 72 65 74 75 72 6e 0a 20 20  sions..return.  
4f90: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 49 6e    }..    proc In
4fa0: 69 74 69 61 6c 69 7a 65 44 65 6c 74 61 73 20 7b  itializeDeltas {
4fb0: 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70  revisions} {..up
4fc0: 76 61 72 20 31 20 64 65 6c 74 61 20 64 65 6c 74  var 1 delta delt
4fd0: 61 0a 0a 09 23 20 50 75 6c 6c 20 74 68 65 20 74  a...# Pull the t
4fe0: 69 6d 65 73 74 61 6d 70 73 20 66 6f 72 20 61 6c  imestamps for al
4ff0: 6c 20 72 65 76 69 73 69 6f 6e 73 20 69 6e 20 74  l revisions in t
5000: 68 65 20 63 68 61 6e 67 65 73 65 74 73 20 61 6e  he changesets an
5010: 64 0a 09 23 20 63 6f 6d 70 75 74 65 20 74 68 65  d..# compute the
5020: 69 72 20 64 65 6c 74 61 73 20 66 6f 72 20 75 73  ir deltas for us
5030: 65 20 62 79 20 74 68 65 20 62 72 65 61 6b 20 66  e by the break f
5040: 69 6e 64 65 72 2e 0a 0a 09 61 72 72 61 79 20 73  inder....array s
5050: 65 74 20 64 65 6c 74 61 20 7b 7d 0a 09 61 72 72  et delta {}..arr
5060: 61 79 20 73 65 74 20 73 74 61 6d 70 20 7b 7d 0a  ay set stamp {}.
5070: 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b  ..set theset ('[
5080: 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20  join $revisions 
5090: 7b 27 2c 27 7d 5d 27 29 0a 09 66 6f 72 65 61 63  {','}]')..foreac
50a0: 68 20 7b 72 69 64 20 74 69 6d 65 7d 20 5b 73 74  h {rid time} [st
50b0: 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53  ate run "..    S
50c0: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 64  ELECT R.rid, R.d
50d0: 61 74 65 0a 09 20 20 20 20 46 52 4f 4d 20 72 65  ate..    FROM re
50e0: 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48  vision R..    WH
50f0: 45 52 45 20 52 2e 72 69 64 20 49 4e 20 24 74 68  ERE R.rid IN $th
5100: 65 73 65 74 0a 09 22 5d 20 7b 0a 09 20 20 20 20  eset.."] {..    
5110: 73 65 74 20 73 74 61 6d 70 28 24 72 69 64 29 20  set stamp($rid) 
5120: 24 74 69 6d 65 0a 09 7d 0a 0a 09 73 65 74 20 6e  $time..}...set n
5130: 20 30 0a 09 66 6f 72 65 61 63 68 20 72 69 64 20   0..foreach rid 
5140: 5b 6c 72 61 6e 67 65 20 24 72 65 76 69 73 69 6f  [lrange $revisio
5150: 6e 73 20 30 20 65 6e 64 2d 31 5d 20 72 6e 65 78  ns 0 end-1] rnex
5160: 74 20 5b 6c 72 61 6e 67 65 20 24 72 65 76 69 73  t [lrange $revis
5170: 69 6f 6e 73 20 31 20 65 6e 64 5d 20 7b 0a 09 20  ions 1 end] {.. 
5180: 20 20 20 73 65 74 20 64 65 6c 74 61 28 24 6e 29     set delta($n)
5190: 20 5b 65 78 70 72 20 7b 24 73 74 61 6d 70 28 24   [expr {$stamp($
51a0: 72 6e 65 78 74 29 20 2d 20 24 73 74 61 6d 70 28  rnext) - $stamp(
51b0: 24 72 69 64 29 7d 5d 0a 09 20 20 20 20 69 6e 63  $rid)}]..    inc
51c0: 72 20 6e 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20  r n..}..return. 
51d0: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 46     }..    proc F
51e0: 69 6e 64 42 65 73 74 42 72 65 61 6b 20 7b 72 61  indBestBreak {ra
51f0: 6e 67 65 7d 20 7b 0a 09 75 70 76 61 72 20 31 20  nge} {..upvar 1 
5200: 63 72 6f 73 73 20 63 72 6f 73 73 20 64 65 6c 74  cross cross delt
5210: 61 20 64 65 6c 74 61 0a 0a 09 23 20 44 65 74 65  a delta...# Dete
5220: 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 62  rmine the best b
5230: 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  reak location in
5240: 20 74 68 65 20 67 69 76 65 6e 20 72 61 6e 67 65   the given range
5250: 20 6f 66 0a 09 23 20 70 6f 73 69 74 69 6f 6e 73   of..# positions
5260: 2e 20 46 69 72 73 74 20 77 65 20 6c 6f 6f 6b 20  . First we look 
5270: 66 6f 72 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  for the location
5280: 73 20 77 69 74 68 20 74 68 65 20 6d 61 78 69 6d  s with the maxim
5290: 61 6c 0a 09 23 20 6e 75 6d 62 65 72 20 6f 66 20  al..# number of 
52a0: 63 72 6f 73 73 69 6e 67 73 2e 20 49 66 20 74 68  crossings. If th
52b0: 65 72 65 20 61 72 65 20 73 65 76 65 72 61 6c 20  ere are several 
52c0: 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 68 65 0a  we look for the.
52d0: 09 23 20 73 68 6f 72 74 65 73 74 20 74 69 6d 65  .# shortest time
52e0: 20 69 6e 74 65 72 76 61 6c 20 61 6d 6f 6e 67 20   interval among 
52f0: 74 68 65 6d 2e 20 49 66 20 77 65 20 73 74 69 6c  them. If we stil
5300: 6c 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 0a  l have multiple.
5310: 09 23 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  .# possibilities
5320: 20 61 66 74 65 72 20 74 68 61 74 20 77 65 20 73   after that we s
5330: 65 6c 65 63 74 20 74 68 65 20 65 61 72 6c 69 65  elect the earlie
5340: 73 74 20 6c 6f 63 61 74 69 6f 6e 0a 09 23 20 61  st location..# a
5350: 6d 6f 6e 67 20 74 68 65 73 65 2e 0a 0a 09 23 20  mong these....# 
5360: 4e 6f 74 65 3a 20 49 66 20 74 68 65 20 6d 61 78  Note: If the max
5370: 69 6d 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63  imal number of c
5380: 72 6f 73 73 69 6e 67 73 20 69 73 20 30 20 74 68  rossings is 0 th
5390: 65 6e 20 74 68 65 20 72 61 6e 67 65 0a 09 23 20  en the range..# 
53a0: 20 20 20 20 20 20 68 61 73 20 6e 6f 20 69 6e 74        has no int
53b0: 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69  ernal dependenci
53c0: 65 73 2c 20 61 6e 64 20 6e 6f 20 62 72 65 61 6b  es, and no break
53d0: 20 6c 6f 63 61 74 69 6f 6e 20 61 74 0a 09 23 20   location at..# 
53e0: 20 20 20 20 20 20 61 6c 6c 2e 20 54 68 69 73 20        all. This 
53f0: 70 6f 73 73 69 62 69 6c 69 74 79 20 69 73 20 73  possibility is s
5400: 69 67 6e 61 6c 65 64 20 76 69 61 20 72 65 73 75  ignaled via resu
5410: 6c 74 20 2d 31 2e 0a 0a 09 23 20 4e 6f 74 65 3a  lt -1....# Note:
5420: 20 41 20 72 61 6e 67 65 20 6f 66 20 6c 65 6e 67   A range of leng
5430: 74 68 20 31 20 6f 72 20 6c 65 73 73 20 63 61 6e  th 1 or less can
5440: 6e 6f 74 20 68 61 76 65 20 69 6e 74 65 72 6e 61  not have interna
5450: 6c 0a 09 23 20 20 20 20 20 20 20 64 65 70 65 6e  l..#       depen
5460: 64 65 6e 63 69 65 73 2c 20 61 73 20 74 68 61 74  dencies, as that
5470: 20 6e 65 65 64 73 20 61 74 20 6c 65 61 73 74 20   needs at least 
5480: 74 77 6f 20 72 65 76 69 73 69 6f 6e 73 20 69 6e  two revisions in
5490: 0a 09 23 20 20 20 20 20 20 20 74 68 65 20 72 61  ..#       the ra
54a0: 6e 67 65 2e 0a 0a 09 69 66 20 7b 5b 6c 6c 65 6e  nge....if {[llen
54b0: 67 74 68 20 24 72 61 6e 67 65 5d 20 3c 20 32 7d  gth $range] < 2}
54c0: 20 7b 20 72 65 74 75 72 6e 20 2d 31 20 7d 0a 0a   { return -1 }..
54d0: 09 73 65 74 20 6d 61 78 20 2d 31 0a 09 73 65 74  .set max -1..set
54e0: 20 62 65 73 74 20 7b 7d 0a 0a 09 66 6f 72 65 61   best {}...forea
54f0: 63 68 20 6c 6f 63 61 74 69 6f 6e 20 24 72 61 6e  ch location $ran
5500: 67 65 20 7b 0a 09 20 20 20 20 73 65 74 20 63 72  ge {..    set cr
5510: 6f 73 73 69 6e 67 73 20 24 63 72 6f 73 73 28 24  ossings $cross($
5520: 6c 6f 63 61 74 69 6f 6e 29 0a 09 20 20 20 20 69  location)..    i
5530: 66 20 7b 24 63 72 6f 73 73 69 6e 67 73 20 3e 20  f {$crossings > 
5540: 24 6d 61 78 7d 20 7b 0a 09 09 73 65 74 20 6d 61  $max} {...set ma
5550: 78 20 20 24 63 72 6f 73 73 69 6e 67 73 0a 09 09  x  $crossings...
5560: 73 65 74 20 62 65 73 74 20 5b 6c 69 73 74 20 24  set best [list $
5570: 6c 6f 63 61 74 69 6f 6e 5d 0a 09 09 63 6f 6e 74  location]...cont
5580: 69 6e 75 65 0a 09 20 20 20 20 7d 20 65 6c 73 65  inue..    } else
5590: 69 66 20 7b 24 63 72 6f 73 73 69 6e 67 73 20 3d  if {$crossings =
55a0: 3d 20 24 6d 61 78 7d 20 7b 0a 09 09 6c 61 70 70  = $max} {...lapp
55b0: 65 6e 64 20 62 65 73 74 20 24 6c 6f 63 61 74 69  end best $locati
55c0: 6f 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69  on..    }..}...i
55d0: 66 20 7b 24 6d 61 78 20 3d 3d 20 30 7d 20 20 20  f {$max == 0}   
55e0: 20 20 20 20 20 20 20 20 20 7b 20 72 65 74 75 72           { retur
55f0: 6e 20 2d 31 20 7d 0a 09 69 66 20 7b 5b 6c 6c 65  n -1 }..if {[lle
5600: 6e 67 74 68 20 24 62 65 73 74 5d 20 3d 3d 20 31  ngth $best] == 1
5610: 7d 20 7b 20 72 65 74 75 72 6e 20 5b 6c 69 6e 64  } { return [lind
5620: 65 78 20 24 62 65 73 74 20 30 5d 20 7d 0a 0a 09  ex $best 0] }...
5630: 73 65 74 20 6c 6f 63 61 74 69 6f 6e 73 20 24 62  set locations $b
5640: 65 73 74 0a 09 73 65 74 20 62 65 73 74 20 7b 7d  est..set best {}
5650: 0a 09 73 65 74 20 6d 69 6e 20 2d 31 0a 0a 09 66  ..set min -1...f
5660: 6f 72 65 61 63 68 20 6c 6f 63 61 74 69 6f 6e 20  oreach location 
5670: 24 6c 6f 63 61 74 69 6f 6e 73 20 7b 0a 09 20 20  $locations {..  
5680: 20 20 73 65 74 20 69 6e 74 65 72 76 61 6c 20 24    set interval $
5690: 64 65 6c 74 61 28 24 6c 6f 63 61 74 69 6f 6e 29  delta($location)
56a0: 0a 09 20 20 20 20 69 66 20 7b 28 24 6d 69 6e 20  ..    if {($min 
56b0: 3c 20 30 29 20 7c 7c 20 28 24 69 6e 74 65 72 76  < 0) || ($interv
56c0: 61 6c 20 3c 20 24 6d 69 6e 29 7d 20 7b 0a 09 09  al < $min)} {...
56d0: 73 65 74 20 6d 69 6e 20 20 24 69 6e 74 65 72 76  set min  $interv
56e0: 61 6c 0a 09 09 73 65 74 20 62 65 73 74 20 5b 6c  al...set best [l
56f0: 69 73 74 20 24 6c 6f 63 61 74 69 6f 6e 5d 0a 09  ist $location]..
5700: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 69      } elseif {$i
5710: 6e 74 65 72 76 61 6c 20 3d 3d 20 24 6d 69 6e 7d  nterval == $min}
5720: 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 62 65 73   {...lappend bes
5730: 74 20 24 6c 6f 63 61 74 69 6f 6e 0a 09 20 20 20  t $location..   
5740: 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b 5b 6c 6c 65   }..}...if {[lle
5750: 6e 67 74 68 20 24 62 65 73 74 5d 20 3d 3d 20 31  ngth $best] == 1
5760: 7d 20 7b 20 72 65 74 75 72 6e 20 5b 6c 69 6e 64  } { return [lind
5770: 65 78 20 24 62 65 73 74 20 30 5d 20 7d 0a 0a 09  ex $best 0] }...
5780: 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 5b  return [lindex [
5790: 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65 72 20 2d  lsort -integer -
57a0: 69 6e 63 72 65 61 73 69 6e 67 20 24 62 65 73 74  increasing $best
57b0: 5d 20 30 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ] 0].    }..    
57c0: 70 72 6f 63 20 43 75 74 41 74 20 7b 6c 6f 63 61  proc CutAt {loca
57d0: 74 69 6f 6e 7d 20 7b 0a 09 75 70 76 61 72 20 31  tion} {..upvar 1
57e0: 20 63 72 6f 73 73 20 63 72 6f 73 73 20 64 65 70   cross cross dep
57f0: 63 20 64 65 70 63 0a 0a 09 23 20 49 74 20 77 61  c depc...# It wa
5800: 73 20 64 65 63 69 64 65 64 20 74 6f 20 73 70 6c  s decided to spl
5810: 69 74 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  it the changeset
5820: 20 61 74 20 74 68 65 20 67 69 76 65 6e 0a 09 23   at the given..#
5830: 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 69 73 20   location. This 
5840: 63 75 74 73 20 61 20 6e 75 6d 62 65 72 20 6f 66  cuts a number of
5850: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 48   dependencies. H
5860: 65 72 65 20 77 65 20 75 70 64 61 74 65 0a 09 23  ere we update..#
5870: 20 74 68 65 20 63 72 6f 73 73 20 69 6e 66 6f 72   the cross infor
5880: 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 74  mation so that t
5890: 68 65 20 62 72 65 61 6b 20 66 69 6e 64 65 72 20  he break finder 
58a0: 68 61 73 20 61 63 63 75 72 61 74 65 0a 09 23 20  has accurate..# 
58b0: 64 61 74 61 20 77 68 65 6e 20 77 65 20 6c 6f 6f  data when we loo
58c0: 6b 20 61 74 20 74 68 65 20 67 65 6e 65 72 61 74  k at the generat
58d0: 65 64 20 66 72 61 67 6d 65 6e 74 73 2e 0a 0a 09  ed fragments....
58e0: 73 65 74 20 73 69 78 20 5b 6c 6f 67 20 76 69 73  set six [log vis
58f0: 69 62 6c 65 3f 20 36 5d 0a 0a 09 66 6f 72 65 61  ible? 6]...forea
5900: 63 68 20 7b 64 65 70 20 72 61 6e 67 65 7d 20 5b  ch {dep range} [
5910: 61 72 72 61 79 20 67 65 74 20 64 65 70 63 5d 20  array get depc] 
5920: 7b 0a 09 20 20 20 20 23 20 43 68 65 63 6b 20 61  {..    # Check a
5930: 6c 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  ll dependencies 
5940: 73 74 69 6c 6c 20 6b 6e 6f 77 6e 2c 20 74 61 6b  still known, tak
5950: 65 20 74 68 65 69 72 20 72 61 6e 67 65 20 61 6e  e their range an
5960: 64 0a 09 20 20 20 20 23 20 73 65 65 20 69 66 20  d..    # see if 
5970: 74 68 65 20 62 72 65 61 6b 20 6c 6f 63 61 74 69  the break locati
5980: 6f 6e 20 66 61 6c 6c 73 20 77 69 74 68 69 6e 2e  on falls within.
5990: 0a 0a 09 20 20 20 20 42 6f 72 64 65 72 20 24 72  ...    Border $r
59a0: 61 6e 67 65 20 73 20 65 0a 09 20 20 20 20 69 66  ange s e..    if
59b0: 20 7b 24 6c 6f 63 61 74 69 6f 6e 20 3c 20 24 73   {$location < $s
59c0: 7d 20 63 6f 6e 74 69 6e 75 65 20 3b 20 23 20 62  } continue ; # b
59d0: 72 65 61 6b 20 62 65 66 6f 72 65 20 72 61 6e 67  reak before rang
59e0: 65 2c 20 69 67 6e 6f 72 65 0a 09 20 20 20 20 69  e, ignore..    i
59f0: 66 20 7b 24 6c 6f 63 61 74 69 6f 6e 20 3e 20 24  f {$location > $
5a00: 65 7d 20 63 6f 6e 74 69 6e 75 65 20 3b 20 23 20  e} continue ; # 
5a10: 62 72 65 61 6b 20 61 66 74 65 72 20 72 61 6e 67  break after rang
5a20: 65 2c 20 69 67 6e 6f 72 65 2e 0a 0a 09 20 20 20  e, ignore....   
5a30: 20 23 20 54 68 69 73 20 64 65 70 65 6e 64 65 6e   # This dependen
5a40: 63 79 20 63 72 6f 73 73 65 73 20 74 68 65 20 62  cy crosses the b
5a50: 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 2e 20 57  reak location. W
5a60: 65 20 72 65 6d 6f 76 65 20 69 74 0a 09 20 20 20  e remove it..   
5a70: 20 23 20 66 72 6f 6d 20 74 68 65 20 63 72 6f 73   # from the cros
5a80: 73 69 6e 67 73 20 63 6f 75 6e 74 65 72 73 2c 20  sings counters, 
5a90: 61 6e 64 20 74 68 65 6e 20 61 6c 73 6f 20 66 72  and then also fr
5aa0: 6f 6d 20 74 68 65 20 73 65 74 0a 09 20 20 20 20  om the set..    
5ab0: 23 20 6f 66 20 6b 6e 6f 77 6e 20 64 65 70 65 6e  # of known depen
5ac0: 64 65 6e 63 69 65 73 2c 20 61 73 20 77 65 20 61  dencies, as we a
5ad0: 72 65 20 64 6f 6e 65 20 77 69 74 68 20 69 74 2e  re done with it.
5ae0: 0a 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 6c  ...    foreach l
5af0: 6f 63 20 24 64 65 70 63 28 24 64 65 70 29 20 7b  oc $depc($dep) {
5b00: 20 69 6e 63 72 20 63 72 6f 73 73 28 24 6c 6f 63   incr cross($loc
5b10: 29 20 2d 31 20 7d 0a 09 20 20 20 20 75 6e 73 65  ) -1 }..    unse
5b20: 74 20 64 65 70 63 28 24 64 65 70 29 0a 0a 09 20  t depc($dep)... 
5b30: 20 20 20 69 66 20 7b 21 24 73 69 78 7d 20 63 6f     if {!$six} co
5b40: 6e 74 69 6e 75 65 0a 0a 09 20 20 20 20 73 74 72  ntinue...    str
5b50: 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e  uct::list assign
5b60: 20 24 64 65 70 20 70 61 72 65 6e 74 20 63 68 69   $dep parent chi
5b70: 6c 64 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74  ld..    log writ
5b80: 65 20 36 20 63 73 65 74 73 20 22 42 72 6f 6b 65  e 6 csets "Broke
5b90: 20 64 65 70 65 6e 64 65 6e 63 79 20 5b 50 44 20   dependency [PD 
5ba0: 24 70 61 72 65 6e 74 5d 20 2d 2d 3e 20 5b 50 44  $parent] --> [PD
5bb0: 20 24 63 68 69 6c 64 5d 22 0a 09 7d 0a 0a 09 72   $child]"..}...r
5bc0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
5bd0: 20 23 20 50 72 69 6e 74 20 69 64 65 6e 74 69 66   # Print identif
5be0: 79 69 6e 67 20 64 61 74 61 20 66 6f 72 20 61 20  ying data for a 
5bf0: 72 65 76 69 73 69 6f 6e 20 28 70 72 6f 6a 65 63  revision (projec
5c00: 74 2c 20 66 69 6c 65 2c 20 64 6f 74 74 65 64 20  t, file, dotted 
5c10: 72 65 76 0a 20 20 20 20 23 20 6e 75 6d 62 65 72  rev.    # number
5c20: 29 2c 20 66 6f 72 20 68 69 67 68 20 76 65 72 62  ), for high verb
5c30: 6f 73 69 74 79 20 6c 6f 67 20 6f 75 74 70 75 74  osity log output
5c40: 2e 0a 0a 20 20 20 20 70 72 6f 63 20 50 44 20 7b  ...    proc PD {
5c50: 69 64 7d 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b  id} {..foreach {
5c60: 70 20 66 20 72 7d 20 5b 73 74 61 74 65 20 72 75  p f r} [state ru
5c70: 6e 20 7b 0a 09 09 53 45 4c 45 43 54 20 50 2e 6e  n {...SELECT P.n
5c80: 61 6d 65 20 2c 20 46 2e 6e 61 6d 65 2c 20 52 2e  ame , F.name, R.
5c90: 72 65 76 0a 09 09 46 52 4f 4d 20 72 65 76 69 73  rev...FROM revis
5ca0: 69 6f 6e 20 52 2c 20 66 69 6c 65 20 46 2c 20 70  ion R, file F, p
5cb0: 72 6f 6a 65 63 74 20 50 0a 09 09 57 48 45 52 45  roject P...WHERE
5cc0: 20 52 2e 72 69 64 20 3d 20 24 69 64 0a 09 09 41   R.rid = $id...A
5cd0: 4e 44 20 20 20 52 2e 66 69 64 20 3d 20 46 2e 66  ND   R.fid = F.f
5ce0: 69 64 0a 09 09 41 4e 44 20 20 20 46 2e 70 69 64  id...AND   F.pid
5cf0: 20 3d 20 50 2e 70 69 64 0a 09 7d 5d 20 62 72 65   = P.pid..}] bre
5d00: 61 6b 0a 09 72 65 74 75 72 6e 20 22 27 24 70 20  ak..return "'$p 
5d10: 3a 20 24 66 2f 24 72 27 22 0a 20 20 20 20 7d 0a  : $f/$r'".    }.
5d20: 0a 20 20 20 20 23 20 50 72 69 6e 74 69 6e 67 20  .    # Printing 
5d30: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 72 61 6e 67  one or more rang
5d40: 65 73 2c 20 66 6f 72 6d 61 74 74 65 64 2c 20 61  es, formatted, a
5d50: 6e 64 20 6f 6e 6c 79 20 74 68 65 69 72 20 62 6f  nd only their bo
5d60: 72 64 65 72 20 74 6f 0a 20 20 20 20 23 20 6b 65  rder to.    # ke
5d70: 65 70 20 74 68 65 20 73 74 72 69 6e 67 73 20 73  ep the strings s
5d80: 68 6f 72 74 2e 0a 0a 20 20 20 20 70 72 6f 63 20  hort...    proc 
5d90: 50 52 73 20 7b 72 61 6e 67 65 73 7d 20 7b 0a 09  PRs {ranges} {..
5da0: 72 65 74 75 72 6e 20 5b 73 74 72 75 63 74 3a 3a  return [struct::
5db0: 6c 69 73 74 20 6d 61 70 20 24 72 61 6e 67 65 73  list map $ranges
5dc0: 20 5b 6d 79 70 72 6f 63 20 50 52 5d 5d 0a 20 20   [myproc PR]].  
5dd0: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 50 52    }..    proc PR
5de0: 20 7b 72 61 6e 67 65 7d 20 7b 0a 09 42 6f 72 64   {range} {..Bord
5df0: 65 72 20 24 72 61 6e 67 65 20 73 20 65 0a 09 72  er $range s e..r
5e00: 65 74 75 72 6e 20 3c 24 7b 73 7d 2e 2e 2e 24 7b  eturn <${s}...${
5e10: 65 7d 3e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  e}>.    }..    p
5e20: 72 6f 63 20 42 6f 72 64 65 72 20 7b 72 61 6e 67  roc Border {rang
5e30: 65 20 73 76 20 65 76 7d 20 7b 0a 09 75 70 76 61  e sv ev} {..upva
5e40: 72 20 31 20 24 73 76 20 73 20 24 65 76 20 65 0a  r 1 $sv s $ev e.
5e50: 09 73 65 74 20 73 20 5b 6c 69 6e 64 65 78 20 24  .set s [lindex $
5e60: 72 61 6e 67 65 20 30 5d 0a 09 73 65 74 20 65 20  range 0]..set e 
5e70: 5b 6c 69 6e 64 65 78 20 24 72 61 6e 67 65 20 65  [lindex $range e
5e80: 6e 64 5d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  nd]..return.    
5e90: 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23  }..    # # ## ##
5ea0: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
5eb0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a   #############..
5ec0: 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65      typevariable
5ed0: 20 6d 79 63 68 61 6e 67 65 73 65 74 73 20 20 20   mychangesets   
5ee0: 20 7b 7d 20 3b 20 23 20 4c 69 73 74 20 6f 66 20   {} ; # List of 
5ef0: 61 6c 6c 20 6b 6e 6f 77 6e 20 63 68 61 6e 67 65  all known change
5f00: 73 65 74 73 2e 0a 20 20 20 20 74 79 70 65 76 61  sets..    typeva
5f10: 72 69 61 62 6c 65 20 6d 79 72 65 76 6d 61 70 20  riable myrevmap 
5f20: 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61  -array {} ; # Ma
5f30: 70 20 66 72 6f 6d 20 72 65 76 69 73 69 6f 6e 73  p from revisions
5f40: 20 74 6f 20 74 68 65 20 6c 69 73 74 0a 09 09 09   to the list....
5f50: 09 20 20 20 20 20 20 23 20 6f 66 20 63 68 61 6e  .      # of chan
5f60: 67 65 73 65 74 73 20 63 6f 6e 74 61 69 6e 69 6e  gesets containin
5f70: 67 0a 09 09 09 09 20 20 20 20 20 20 23 20 69 74  g.....      # it
5f80: 2e 20 4e 4f 54 45 3a 20 57 68 69 6c 65 20 6f 6e  . NOTE: While on
5f90: 6c 79 20 6f 6e 65 0a 09 09 09 09 20 20 20 20 20  ly one.....     
5fa0: 20 23 20 72 65 76 69 73 69 6f 6e 20 63 68 61 6e   # revision chan
5fb0: 67 65 73 65 74 20 63 61 6e 20 63 6f 6e 74 61 69  geset can contai
5fc0: 6e 0a 09 09 09 09 20 20 20 20 20 20 23 20 74 68  n.....      # th
5fd0: 65 20 72 65 76 69 73 69 6f 6e 2c 20 74 68 65 72  e revision, ther
5fe0: 65 20 63 61 6e 0a 09 09 09 09 20 20 20 20 20 20  e can.....      
5ff0: 23 20 68 6f 77 65 76 65 72 20 61 6c 73 6f 20 62  # however also b
6000: 65 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 0a 09 09  e one or more...
6010: 09 09 20 20 20 20 20 20 23 20 61 64 64 69 74 69  ..      # additi
6020: 6f 6e 61 6c 20 73 79 6d 62 6f 6c 20 63 68 61 6e  onal symbol chan
6030: 67 65 73 65 74 73 0a 09 09 09 09 20 20 20 20 20  gesets.....     
6040: 20 23 20 77 68 69 63 68 20 75 73 65 20 69 74 2c   # which use it,
6050: 20 68 65 6e 63 65 20 61 20 6c 69 73 74 2e 0a 20   hence a list.. 
6060: 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20     typevariable 
6070: 6d 79 69 64 6d 61 70 20 20 2d 61 72 72 61 79 20  myidmap  -array 
6080: 7b 7d 20 3b 20 23 20 4d 61 70 20 66 72 6f 6d 20  {} ; # Map from 
6090: 63 68 61 6e 67 65 73 65 74 20 69 64 20 74 6f 20  changeset id to 
60a0: 63 68 61 6e 67 65 73 65 74 2e 0a 20 20 20 20 74  changeset..    t
60b0: 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 62 72  ypevariable mybr
60c0: 61 6e 63 68 63 6f 64 65 20 20 20 20 7b 7d 20 3b  anchcode    {} ;
60d0: 20 23 20 4c 6f 63 61 6c 20 63 6f 70 79 20 6f 66   # Local copy of
60e0: 20 70 72 6f 6a 65 63 74 3a 3a 73 79 6d 2f 6d 79   project::sym/my
60f0: 62 72 61 6e 63 68 2e 0a 0a 20 20 20 20 74 79 70  branch...    typ
6100: 65 6d 65 74 68 6f 64 20 61 6c 6c 20 20 20 7b 7d  emethod all   {}
6110: 20 20 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 63     { return $myc
6120: 68 61 6e 67 65 73 65 74 73 20 7d 0a 20 20 20 20  hangesets }.    
6130: 74 79 70 65 6d 65 74 68 6f 64 20 6f 66 20 20 20  typemethod of   
6140: 20 7b 69 64 7d 20 7b 20 72 65 74 75 72 6e 20 24   {id} { return $
6150: 6d 79 69 64 6d 61 70 28 24 69 64 29 20 7d 0a 20  myidmap($id) }. 
6160: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6f 66     typemethod of
6170: 72 65 76 20 7b 69 64 7d 20 7b 20 72 65 74 75 72  rev {id} { retur
6180: 6e 20 24 6d 79 72 65 76 6d 61 70 28 24 69 64 29  n $myrevmap($id)
6190: 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23   }..    # # ## #
61a0: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
61b0: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  # #############.
61c0: 20 20 20 20 23 23 20 43 6f 6e 66 69 67 75 72 61      ## Configura
61d0: 74 69 6f 6e 0a 0a 20 20 20 20 70 72 61 67 6d 61  tion..    pragma
61e0: 20 2d 68 61 73 74 79 70 65 69 6e 66 6f 20 20 20   -hastypeinfo   
61f0: 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 74 79 70 65   no  ; # no type
6200: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20   introspection. 
6210: 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 69 6e     pragma -hasin
6220: 66 6f 20 20 20 20 20 20 20 20 6e 6f 20 20 3b 20  fo        no  ; 
6230: 23 20 6e 6f 20 6f 62 6a 65 63 74 20 69 6e 74 72  # no object intr
6240: 6f 73 70 65 63 74 69 6f 6e 0a 20 20 20 20 70 72  ospection.    pr
6250: 61 67 6d 61 20 2d 73 69 6d 70 6c 65 64 69 73 70  agma -simpledisp
6260: 61 74 63 68 20 79 65 73 20 3b 20 23 20 73 69 6d  atch yes ; # sim
6270: 70 6c 65 20 66 61 73 74 20 64 69 73 70 61 74 63  ple fast dispatc
6280: 68 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23  h..    # # ## ##
6290: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
62a0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 7d   #############.}
62b0: 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c  ..namespace eval
62c0: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
62d0: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a  mport::cvs::proj
62e0: 65 63 74 20 7b 0a 20 20 20 20 6e 61 6d 65 73 70  ect {.    namesp
62f0: 61 63 65 20 65 78 70 6f 72 74 20 72 65 76 0a 20  ace export rev. 
6300: 20 20 20 6e 61 6d 65 73 70 61 63 65 20 65 76 61     namespace eva
6310: 6c 20 72 65 76 20 7b 0a 09 6e 61 6d 65 73 70 61  l rev {..namespa
6320: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a  ce import ::vc::
6330: 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a  fossil::import::
6340: 63 76 73 3a 3a 73 74 61 74 65 0a 09 6e 61 6d 65  cvs::state..name
6350: 73 70 61 63 65 20 65 76 61 6c 20 70 72 6f 6a 65  space eval proje
6360: 63 74 20 7b 0a 09 20 20 20 20 6e 61 6d 65 73 70  ct {..    namesp
6370: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a  ace import ::vc:
6380: 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a  :fossil::import:
6390: 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 73  :cvs::project::s
63a0: 79 6d 0a 09 7d 0a 09 3a 3a 76 61 72 69 61 62 6c  ym..}..::variabl
63b0: 65 20 6d 79 62 72 61 6e 63 68 63 6f 64 65 20 5b  e mybranchcode [
63c0: 70 72 6f 6a 65 63 74 3a 3a 73 79 6d 20 62 72 61  project::sym bra
63d0: 6e 63 68 5d 0a 09 6e 61 6d 65 73 70 61 63 65 20  nch]..namespace 
63e0: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f  import ::vc::too
63f0: 6c 73 3a 3a 6d 69 73 63 3a 3a 2a 0a 09 6e 61 6d  ls::misc::*..nam
6400: 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a  espace import ::
6410: 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 74 72 6f 75 62  vc::tools::troub
6420: 6c 65 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d  le..namespace im
6430: 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73  port ::vc::tools
6440: 3a 3a 6c 6f 67 0a 09 6c 6f 67 20 72 65 67 69 73  ::log..log regis
6450: 74 65 72 20 63 73 65 74 73 0a 20 20 20 20 7d 0a  ter csets.    }.
6460: 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23 23  }..# # ## ### ##
6470: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23  ### ######## ###
6480: 23 23 23 23 23 23 23 23 23 23 20 23 23 23 23 23  ########## #####
6490: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
64a0: 0a 23 23 20 52 65 61 64 79 0a 0a 70 61 63 6b 61  .## Ready..packa
64b0: 67 65 20 70 72 6f 76 69 64 65 20 76 63 3a 3a 66  ge provide vc::f
64c0: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63  ossil::import::c
64d0: 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76  vs::project::rev
64e0: 20 31 2e 30 0a 72 65 74 75 72 6e 0a               1.0.return.