Hex Artifact Content
Not logged in

Artifact 1769e1daa2bf15010e7142c579f6820e312e4493:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [de4cff4142] - Extended changeset class with in-memory database mapping from changeset ids to the proper object, and extended the objects with position information and associated accessors. Extended pass 8 to load the commit order computed in pass 6, this is stored in the new position slot of changesets, and an inverted index mapping from position to changeset at that position. by aku on 2007-11-22 03:21:43.

0000: 23 23 20 2d 2a 2d 20 74 63 6c 20 2d 2a 2d 0a 23  ## -*- tcl -*-.#
0010: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20   # ## ### ##### 
0020: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
0030: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
0040: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20  ############.## 
0050: 43 6f 70 79 72 69 67 68 74 20 28 63 29 20 32 30  Copyright (c) 20
0060: 30 37 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69  07 Andreas Kupri
0070: 65 73 2e 0a 23 0a 23 20 54 68 69 73 20 73 6f 66  es..#.# This sof
0080: 74 77 61 72 65 20 69 73 20 6c 69 63 65 6e 73 65  tware is license
0090: 64 20 61 73 20 64 65 73 63 72 69 62 65 64 20 69  d as described i
00a0: 6e 20 74 68 65 20 66 69 6c 65 20 4c 49 43 45 4e  n the file LICEN
00b0: 53 45 2c 20 77 68 69 63 68 0a 23 20 79 6f 75 20  SE, which.# you 
00c0: 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65 63 65  should have rece
00d0: 69 76 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ived as part of 
00e0: 74 68 69 73 20 64 69 73 74 72 69 62 75 74 69 6f  this distributio
00f0: 6e 2e 0a 23 0a 23 20 54 68 69 73 20 73 6f 66 74  n..#.# This soft
0100: 77 61 72 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  ware consists of
0110: 20 76 6f 6c 75 6e 74 61 72 79 20 63 6f 6e 74 72   voluntary contr
0120: 69 62 75 74 69 6f 6e 73 20 6d 61 64 65 20 62 79  ibutions made by
0130: 20 6d 61 6e 79 0a 23 20 69 6e 64 69 76 69 64 75   many.# individu
0140: 61 6c 73 2e 20 20 46 6f 72 20 65 78 61 63 74 20  als.  For exact 
0150: 63 6f 6e 74 72 69 62 75 74 69 6f 6e 20 68 69 73  contribution his
0160: 74 6f 72 79 2c 20 73 65 65 20 74 68 65 20 72 65  tory, see the re
0170: 76 69 73 69 6f 6e 0a 23 20 68 69 73 74 6f 72 79  vision.# history
0180: 20 61 6e 64 20 6c 6f 67 73 2c 20 61 76 61 69 6c   and logs, avail
0190: 61 62 6c 65 20 61 74 20 68 74 74 70 3a 2f 2f 66  able at http://f
01a0: 6f 73 73 69 6c 2d 73 63 6d 2e 68 77 61 63 69 2e  ossil-scm.hwaci.
01b0: 63 6f 6d 2f 66 6f 73 73 69 6c 0a 23 20 23 20 23  com/fossil.# # #
01c0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
01d0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
01e0: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
01f0: 23 23 23 23 23 23 23 23 0a 0a 23 23 20 52 65 76  ########..## Rev
0200: 69 73 69 6f 6e 73 20 70 65 72 20 70 72 6f 6a 65  isions per proje
0210: 63 74 2c 20 61 6b 61 20 43 68 61 6e 67 65 73 65  ct, aka Changese
0220: 74 73 2e 20 54 68 65 73 65 20 6f 62 6a 65 63 74  ts. These object
0230: 73 20 61 72 65 20 66 69 72 73 74 20 75 73 65 64  s are first used
0240: 0a 23 23 20 69 6e 20 70 61 73 73 20 35 2c 20 77  .## in pass 5, w
0250: 68 69 63 68 20 63 72 65 61 74 65 73 20 74 68 65  hich creates the
0260: 20 69 6e 69 74 69 61 6c 20 73 65 74 20 63 6f 76   initial set cov
0270: 65 72 69 6e 67 20 74 68 65 20 72 65 70 6f 73 69  ering the reposi
0280: 74 6f 72 79 2e 0a 0a 23 20 23 20 23 23 20 23 23  tory...# # ## ##
0290: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
02a0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23   ############# #
02b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02c0: 23 23 23 23 0a 23 23 20 52 65 71 75 69 72 65 6d  ####.## Requirem
02d0: 65 6e 74 73 0a 0a 70 61 63 6b 61 67 65 20 72 65  ents..package re
02e0: 71 75 69 72 65 20 54 63 6c 20 38 2e 34 20 20 20  quire Tcl 8.4   
02f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0300: 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23 20              ; # 
0310: 52 65 71 75 69 72 65 64 20 72 75 6e 74 69 6d 65  Required runtime
0320: 2e 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72  ..package requir
0330: 65 20 73 6e 69 74 20 20 20 20 20 20 20 20 20 20  e snit          
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0350: 20 20 20 20 20 20 20 20 3b 20 23 20 4f 4f 20 73          ; # OO s
0360: 79 73 74 65 6d 2e 0a 70 61 63 6b 61 67 65 20 72  ystem..package r
0370: 65 71 75 69 72 65 20 76 63 3a 3a 74 6f 6f 6c 73  equire vc::tools
0380: 3a 3a 6d 69 73 63 20 20 20 20 20 20 20 20 20 20  ::misc          
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23               ; #
03a0: 20 54 65 78 74 20 66 6f 72 6d 61 74 74 69 6e 67   Text formatting
03b0: 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65  .package require
03c0: 20 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 74 72 6f 75   vc::tools::trou
03d0: 62 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ble             
03e0: 20 20 20 20 20 20 20 3b 20 23 20 45 72 72 6f 72         ; # Error
03f0: 20 72 65 70 6f 72 74 69 6e 67 2e 0a 70 61 63 6b   reporting..pack
0400: 61 67 65 20 72 65 71 75 69 72 65 20 76 63 3a 3a  age require vc::
0410: 74 6f 6f 6c 73 3a 3a 6c 6f 67 20 20 20 20 20 20  tools::log      
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0430: 20 20 3b 20 23 20 55 73 65 72 20 66 65 65 64 62    ; # User feedb
0440: 61 63 6b 2e 0a 70 61 63 6b 61 67 65 20 72 65 71  ack..package req
0450: 75 69 72 65 20 76 63 3a 3a 66 6f 73 73 69 6c 3a  uire vc::fossil:
0460: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74  :import::cvs::st
0470: 61 74 65 20 20 20 20 20 20 20 20 3b 20 23 20 53  ate        ; # S
0480: 74 61 74 65 20 73 74 6f 72 61 67 65 2e 0a 0a 23  tate storage...#
0490: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20   # ## ### ##### 
04a0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
04b0: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
04c0: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20  ############.## 
04d0: 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20 3a 3a 76  ..snit::type ::v
04e0: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72  c::fossil::impor
04f0: 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a  t::cvs::project:
0500: 3a 72 65 76 20 7b 0a 20 20 20 20 23 20 23 20 23  :rev {.    # # #
0510: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
0520: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
0530: 23 23 0a 20 20 20 20 23 23 20 50 75 62 6c 69 63  ##.    ## Public
0540: 20 41 50 49 0a 0a 20 20 20 20 63 6f 6e 73 74 72   API..    constr
0550: 75 63 74 6f 72 20 7b 70 72 6f 6a 65 63 74 20 63  uctor {project c
0560: 73 74 79 70 65 20 73 72 63 69 64 20 72 65 76 69  stype srcid revi
0570: 73 69 6f 6e 73 20 7b 74 68 65 69 64 20 7b 7d 7d  sions {theid {}}
0580: 7d 20 7b 0a 09 69 66 20 7b 24 74 68 65 69 64 20  } {..if {$theid 
0590: 6e 65 20 22 22 7d 20 7b 0a 09 20 20 20 20 73 65  ne ""} {..    se
05a0: 74 20 6d 79 69 64 20 24 74 68 65 69 64 0a 09 7d  t myid $theid..}
05b0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 73 65 74   else {..    set
05c0: 20 6d 79 69 64 20 5b 69 6e 63 72 20 6d 79 63 6f   myid [incr myco
05d0: 75 6e 74 65 72 5d 0a 09 7d 0a 0a 09 73 65 74 20  unter]..}...set 
05e0: 6d 79 70 72 6f 6a 65 63 74 20 20 20 24 70 72 6f  myproject   $pro
05f0: 6a 65 63 74 0a 09 73 65 74 20 6d 79 74 79 70 65  ject..set mytype
0600: 20 20 20 20 20 20 24 63 73 74 79 70 65 09 20 20        $cstype.  
0610: 0a 09 73 65 74 20 6d 79 73 72 63 69 64 09 24 73  ..set mysrcid.$s
0620: 72 63 69 64 09 20 20 0a 09 73 65 74 20 6d 79 72  rcid.  ..set myr
0630: 65 76 69 73 69 6f 6e 73 20 24 72 65 76 69 73 69  evisions $revisi
0640: 6f 6e 73 0a 09 73 65 74 20 6d 79 70 6f 73 20 20  ons..set mypos  
0650: 20 20 20 20 20 7b 7d 20 3b 20 23 20 43 6f 6d 6d       {} ; # Comm
0660: 69 74 20 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6e  it location is n
0670: 6f 74 20 6b 6e 6f 77 6e 20 79 65 74 2e 0a 0a 09  ot known yet....
0680: 23 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20  # Keep track of 
0690: 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 63 68  the generated ch
06a0: 61 6e 67 65 73 65 74 73 20 61 6e 64 20 6f 66 20  angesets and of 
06b0: 74 68 65 20 69 6e 76 65 72 73 65 0a 09 23 20 6d  the inverse..# m
06c0: 61 70 70 69 6e 67 20 66 72 6f 6d 20 72 65 76 69  apping from revi
06d0: 73 69 6f 6e 73 20 74 6f 20 74 68 65 6d 2e 0a 09  sions to them...
06e0: 6c 61 70 70 65 6e 64 20 6d 79 63 68 61 6e 67 65  lappend mychange
06f0: 73 65 74 73 20 20 20 24 73 65 6c 66 0a 09 73 65  sets   $self..se
0700: 74 20 20 20 20 20 6d 79 69 64 6d 61 70 28 24 6d  t     myidmap($m
0710: 79 69 64 29 20 24 73 65 6c 66 0a 09 66 6f 72 65  yid) $self..fore
0720: 61 63 68 20 72 20 24 72 65 76 69 73 69 6f 6e 73  ach r $revisions
0730: 20 7b 20 73 65 74 20 6d 79 72 65 76 6d 61 70 28   { set myrevmap(
0740: 24 72 29 20 24 73 65 6c 66 20 7d 0a 09 72 65 74  $r) $self }..ret
0750: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d  urn.    }..    m
0760: 65 74 68 6f 64 20 69 64 20 20 20 20 20 20 20 20  ethod id        
0770: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69  {} { return $myi
0780: 64 20 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20 72  d }.    method r
0790: 65 76 69 73 69 6f 6e 73 20 7b 7d 20 7b 20 72 65  evisions {} { re
07a0: 74 75 72 6e 20 24 6d 79 72 65 76 69 73 69 6f 6e  turn $myrevision
07b0: 73 20 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20 64  s }.    method d
07c0: 61 74 61 20 20 20 20 20 20 7b 7d 20 7b 20 72 65  ata      {} { re
07d0: 74 75 72 6e 20 5b 6c 69 73 74 20 24 6d 79 70 72  turn [list $mypr
07e0: 6f 6a 65 63 74 20 24 6d 79 74 79 70 65 20 24 6d  oject $mytype $m
07f0: 79 73 72 63 69 64 5d 20 7d 0a 0a 20 20 20 20 6d  ysrcid] }..    m
0800: 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20  ethod bysymbol  
0810: 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 5b 65 78   {} { return [ex
0820: 70 72 20 7b 24 6d 79 74 79 70 65 20 65 71 20 22  pr {$mytype eq "
0830: 73 79 6d 22 7d 5d 20 7d 0a 20 20 20 20 6d 65 74  sym"}] }.    met
0840: 68 6f 64 20 62 79 72 65 76 69 73 69 6f 6e 20 7b  hod byrevision {
0850: 7d 20 7b 20 72 65 74 75 72 6e 20 5b 65 78 70 72  } { return [expr
0860: 20 7b 24 6d 79 74 79 70 65 20 65 71 20 22 72 65   {$mytype eq "re
0870: 76 22 7d 5d 20 7d 0a 0a 20 20 20 20 6d 65 74 68  v"}] }..    meth
0880: 6f 64 20 73 65 74 70 6f 73 20 7b 70 7d 20 7b 20  od setpos {p} { 
0890: 73 65 74 20 6d 79 70 6f 73 20 24 70 20 3b 20 72  set mypos $p ; r
08a0: 65 74 75 72 6e 20 7d 0a 20 20 20 20 6d 65 74 68  eturn }.    meth
08b0: 6f 64 20 70 6f 73 20 20 20 20 7b 7d 20 20 7b 20  od pos    {}  { 
08c0: 72 65 74 75 72 6e 20 24 6d 79 70 6f 73 20 7d 0a  return $mypos }.
08d0: 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 75 63 63  .    method succ
08e0: 65 73 73 6f 72 73 20 7b 7d 20 7b 0a 09 23 20 4e  essors {} {..# N
08f0: 4f 54 45 20 2f 20 46 55 54 55 52 45 3a 20 50 6f  OTE / FUTURE: Po
0900: 73 73 69 62 6c 65 20 62 6f 74 74 6c 65 6e 65 63  ssible bottlenec
0910: 6b 2e 0a 09 73 65 74 20 63 73 65 74 73 20 7b 7d  k...set csets {}
0920: 0a 09 66 6f 72 65 61 63 68 20 7b 5f 20 63 68 69  ..foreach {_ chi
0930: 6c 64 72 65 6e 7d 20 5b 24 73 65 6c 66 20 6e 65  ldren} [$self ne
0940: 78 74 6d 61 70 5d 20 7b 0a 09 20 20 20 20 66 6f  xtmap] {..    fo
0950: 72 65 61 63 68 20 63 68 69 6c 64 20 24 63 68 69  reach child $chi
0960: 6c 64 72 65 6e 20 7b 0a 09 09 6c 61 70 70 65 6e  ldren {...lappen
0970: 64 20 63 73 65 74 73 20 24 6d 79 72 65 76 6d 61  d csets $myrevma
0980: 70 28 24 63 68 69 6c 64 29 0a 09 20 20 20 20 7d  p($child)..    }
0990: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b 6c 73 6f  ..}..return [lso
09a0: 72 74 20 2d 75 6e 69 71 75 65 20 24 63 73 65 74  rt -unique $cset
09b0: 73 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  s].    }..    # 
09c0: 72 65 76 69 73 69 6f 6e 20 2d 3e 20 6c 69 73 74  revision -> list
09d0: 20 28 72 65 76 69 73 69 6f 6e 29 0a 20 20 20 20   (revision).    
09e0: 6d 65 74 68 6f 64 20 6e 65 78 74 6d 61 70 20 7b  method nextmap {
09f0: 7d 20 7b 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74  } {..if {[llengt
0a00: 68 20 24 6d 79 6e 65 78 74 6d 61 70 5d 7d 20 7b  h $mynextmap]} {
0a10: 20 72 65 74 75 72 6e 20 24 6d 79 6e 65 78 74 6d   return $mynextm
0a20: 61 70 20 7d 0a 09 50 75 6c 6c 53 75 63 63 65 73  ap }..PullSucces
0a30: 73 6f 72 52 65 76 69 73 69 6f 6e 73 20 74 6d 70  sorRevisions tmp
0a40: 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 0a 09 73   $myrevisions..s
0a50: 65 74 20 6d 79 6e 65 78 74 6d 61 70 20 5b 61 72  et mynextmap [ar
0a60: 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 09 72 65  ray get tmp]..re
0a70: 74 75 72 6e 20 24 6d 79 6e 65 78 74 6d 61 70 0a  turn $mynextmap.
0a80: 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f      }..    metho
0a90: 64 20 62 72 65 61 6b 69 6e 74 65 72 6e 61 6c 64  d breakinternald
0aa0: 65 70 65 6e 64 65 6e 63 69 65 73 20 7b 7d 20 7b  ependencies {} {
0ab0: 0a 09 23 20 54 68 69 73 20 6d 65 74 68 6f 64 20  ..# This method 
0ac0: 69 6e 73 70 65 63 74 73 20 74 68 65 20 63 68 61  inspects the cha
0ad0: 6e 67 65 73 65 74 73 20 66 6f 72 20 69 6e 74 65  ngesets for inte
0ae0: 72 6e 61 6c 0a 09 23 20 64 65 70 65 6e 64 65 6e  rnal..# dependen
0af0: 63 69 65 73 2e 20 4e 6f 74 68 69 6e 67 20 69 73  cies. Nothing is
0b00: 20 64 6f 6e 65 20 69 66 20 74 68 65 72 65 20 61   done if there a
0b10: 72 65 20 6e 6f 0a 09 23 20 73 75 63 68 2e 20 4f  re no..# such. O
0b20: 74 68 65 72 77 69 73 65 20 74 68 65 20 63 68 61  therwise the cha
0b30: 6e 67 65 73 65 74 20 69 73 20 73 70 6c 69 74 20  ngeset is split 
0b40: 69 6e 74 6f 20 61 20 73 65 74 20 6f 66 0a 09 23  into a set of..#
0b50: 20 66 72 61 67 6d 65 6e 74 73 20 77 69 74 68 6f   fragments witho
0b60: 75 74 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65  ut internal depe
0b70: 6e 64 65 6e 63 69 65 73 2c 20 74 72 61 6e 73 66  ndencies, transf
0b80: 6f 72 6d 69 6e 67 20 74 68 65 0a 09 23 20 69 6e  orming the..# in
0b90: 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63  ternal dependenc
0ba0: 69 65 73 20 69 6e 74 6f 20 65 78 74 65 72 6e 61  ies into externa
0bb0: 6c 20 6f 6e 65 73 2e 20 54 68 65 20 6e 65 77 20  l ones. The new 
0bc0: 63 68 61 6e 67 65 73 65 74 73 0a 09 23 20 61 72  changesets..# ar
0bd0: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c  e added to the l
0be0: 69 73 74 20 6f 66 20 61 6c 6c 20 63 68 61 6e 67  ist of all chang
0bf0: 65 73 65 74 73 2e 0a 0a 09 23 20 57 65 20 70 65  esets....# We pe
0c00: 72 66 6f 72 6d 20 61 6c 6c 20 6e 65 63 65 73 73  rform all necess
0c10: 61 72 79 20 73 70 6c 69 74 73 20 69 6e 20 6f 6e  ary splits in on
0c20: 65 20 67 6f 2c 20 69 6e 73 74 65 61 64 20 6f 66  e go, instead of
0c30: 20 6f 6e 6c 79 0a 09 23 20 6f 6e 65 2e 20 54 68   only..# one. Th
0c40: 65 20 70 72 65 76 69 6f 75 73 20 61 6c 67 6f 72  e previous algor
0c50: 69 74 68 6d 2c 20 61 64 61 70 74 65 64 20 66 72  ithm, adapted fr
0c60: 6f 6d 20 63 76 73 32 73 76 6e 2c 20 63 6f 6d 70  om cvs2svn, comp
0c70: 75 74 65 64 0a 09 23 20 61 20 6c 6f 74 20 6f 66  uted..# a lot of
0c80: 20 73 74 61 74 65 20 77 68 69 63 68 20 77 61 73   state which was
0c90: 20 74 68 72 6f 77 6e 20 61 77 61 79 20 61 6e 64   thrown away and
0ca0: 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 64 20 61   then computed a
0cb0: 67 61 69 6e 0a 09 23 20 66 6f 72 20 65 61 63 68  gain..# for each
0cc0: 20 6f 66 20 74 68 65 20 66 72 61 67 6d 65 6e 74   of the fragment
0cd0: 73 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  s. It should be 
0ce0: 65 61 73 69 65 72 20 74 6f 20 75 70 64 61 74 65  easier to update
0cf0: 20 61 6e 64 0a 09 23 20 72 65 75 73 65 20 74 68   and..# reuse th
0d00: 61 74 20 73 74 61 74 65 2e 0a 0a 09 23 20 54 68  at state....# Th
0d10: 65 20 63 6f 64 65 20 63 68 65 63 6b 73 20 6f 6e  e code checks on
0d20: 6c 79 20 73 75 63 65 73 73 6f 72 20 64 65 70 65  ly sucessor depe
0d30: 6e 64 65 6e 63 69 65 73 2c 20 61 73 20 74 68 69  ndencies, as thi
0d40: 73 0a 09 23 20 61 75 74 6f 6d 61 74 69 63 61 6c  s..# automatical
0d50: 6c 79 20 63 6f 76 65 72 73 20 74 68 65 20 70 72  ly covers the pr
0d60: 65 64 65 63 65 73 73 6f 72 20 64 65 70 65 6e 64  edecessor depend
0d70: 65 6e 63 69 65 73 20 61 73 20 77 65 6c 6c 20 28  encies as well (
0d80: 41 0a 09 23 20 73 75 63 63 65 73 73 6f 72 20 64  A..# successor d
0d90: 65 70 65 6e 64 65 6e 63 79 20 61 20 2d 3e 20 62  ependency a -> b
0da0: 20 69 73 20 61 6c 73 6f 20 61 20 70 72 65 64 65   is also a prede
0db0: 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63  cessor dependenc
0dc0: 79 0a 09 23 20 62 20 2d 3e 20 61 29 2e 0a 0a 09  y..# b -> a)....
0dd0: 23 20 41 72 72 61 79 20 6f 66 20 64 65 70 65 6e  # Array of depen
0de0: 64 65 6e 63 69 65 73 20 28 70 61 72 65 6e 74 20  dencies (parent 
0df0: 2d 3e 20 63 68 69 6c 64 29 2e 20 54 68 69 73 20  -> child). This 
0e00: 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 0a 09  is pulled from..
0e10: 23 20 74 68 65 20 73 74 61 74 65 2c 20 61 6e 64  # the state, and
0e20: 20 6c 69 6d 69 74 65 64 20 74 6f 20 73 75 63 63   limited to succ
0e30: 65 73 73 6f 72 73 20 77 69 74 68 69 6e 20 74 68  essors within th
0e40: 65 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 61  e changeset....a
0e50: 72 72 61 79 20 73 65 74 20 64 65 70 65 6e 64 65  rray set depende
0e60: 6e 63 69 65 73 20 7b 7d 0a 09 50 75 6c 6c 49 6e  ncies {}..PullIn
0e70: 74 65 72 6e 61 6c 53 75 63 63 65 73 73 6f 72 52  ternalSuccessorR
0e80: 65 76 69 73 69 6f 6e 73 20 64 65 70 65 6e 64 65  evisions depende
0e90: 6e 63 69 65 73 20 24 6d 79 72 65 76 69 73 69 6f  ncies $myrevisio
0ea0: 6e 73 0a 09 69 66 20 7b 21 5b 61 72 72 61 79 20  ns..if {![array 
0eb0: 73 69 7a 65 20 64 65 70 65 6e 64 65 6e 63 69 65  size dependencie
0ec0: 73 5d 7d 20 7b 72 65 74 75 72 6e 20 30 7d 20 3b  s]} {return 0} ;
0ed0: 20 23 20 4e 6f 74 68 69 6e 67 20 74 6f 20 62 72   # Nothing to br
0ee0: 65 61 6b 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65  eak....log write
0ef0: 20 36 20 63 73 65 74 73 20 2e 2e 2e 3c 24 6d 79   6 csets ...<$my
0f00: 69 64 3e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  id>.............
0f10: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
0f20: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
0f30: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 0a 0a 09 23 20 57  .............# W
0f40: 65 20 68 61 76 65 20 69 6e 74 65 72 6e 61 6c 20  e have internal 
0f50: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 6f 20  dependencies to 
0f60: 62 72 65 61 6b 2e 20 57 65 20 6e 6f 77 20 69 74  break. We now it
0f70: 65 72 61 74 65 20 6f 76 65 72 0a 09 23 20 61 6c  erate over..# al
0f80: 6c 20 70 6f 73 69 74 69 6f 6e 73 20 69 6e 20 74  l positions in t
0f90: 68 65 20 6c 69 73 74 20 28 77 68 69 63 68 20 69  he list (which i
0fa0: 73 20 63 68 72 6f 6e 6f 6c 6f 67 69 63 61 6c 2c  s chronological,
0fb0: 20 61 74 20 6c 65 61 73 74 0a 09 23 20 61 73 20   at least..# as 
0fc0: 66 61 72 20 61 73 20 74 68 65 20 74 69 6d 65 73  far as the times
0fd0: 74 61 6d 70 73 20 61 72 65 20 63 6f 72 72 65 63  tamps are correc
0fe0: 74 20 61 6e 64 20 75 6e 69 71 75 65 29 20 61 6e  t and unique) an
0ff0: 64 0a 09 23 20 64 65 74 65 72 6d 69 6e 65 20 74  d..# determine t
1000: 68 65 20 62 65 73 74 20 70 6f 73 69 74 69 6f 6e  he best position
1010: 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b 2c 20   for the break, 
1020: 62 79 20 74 72 79 69 6e 67 20 74 6f 0a 09 23 20  by trying to..# 
1030: 62 72 65 61 6b 20 61 73 20 6d 61 6e 79 20 64 65  break as many de
1040: 70 65 6e 64 65 6e 63 69 65 73 20 61 73 20 70 6f  pendencies as po
1050: 73 73 69 62 6c 65 20 69 6e 20 6f 6e 65 20 67 6f  ssible in one go
1060: 2e 20 57 68 65 6e 20 61 0a 09 23 20 62 72 65 61  . When a..# brea
1070: 6b 20 77 61 73 20 66 6f 75 6e 64 20 74 68 69 73  k was found this
1080: 20 69 73 20 72 65 64 6f 6e 65 20 66 6f 72 20 74   is redone for t
1090: 68 65 20 66 72 61 67 6d 65 6e 74 73 20 63 6f 6d  he fragments com
10a0: 69 6e 67 20 61 6e 64 0a 09 23 20 61 66 74 65 72  ing and..# after
10b0: 2c 20 61 66 74 65 72 20 75 70 64 69 6e 67 20 74  , after upding t
10c0: 68 65 20 63 72 6f 73 73 69 6e 67 20 69 6e 66 6f  he crossing info
10d0: 72 6d 61 74 69 6f 6e 2e 0a 0a 09 23 20 44 61 74  rmation....# Dat
10e0: 61 20 73 74 72 75 63 74 75 72 65 73 3a 0a 09 23  a structures:..#
10f0: 20 4d 61 70 3a 20 20 50 4f 53 20 20 20 72 65 76   Map:  POS   rev
1100: 69 73 69 6f 6e 20 69 64 20 20 20 20 20 20 2d 3e  ision id      ->
1110: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73   position in lis
1120: 74 2e 0a 09 23 20 20 20 20 20 20 20 43 52 4f 53  t...#       CROS
1130: 53 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69  S position in li
1140: 73 74 20 2d 3e 20 6e 75 6d 62 65 72 20 6f 66 20  st -> number of 
1150: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 63 72 6f  dependencies cro
1160: 73 73 69 6e 67 20 69 74 0a 09 23 20 20 20 20 20  ssing it..#     
1170: 20 20 44 45 50 43 20 20 64 65 70 65 6e 64 65 6e    DEPC  dependen
1180: 63 79 20 20 20 20 20 20 20 2d 3e 20 70 6f 73 69  cy       -> posi
1190: 74 69 6f 6e 73 20 69 74 20 63 72 6f 73 73 65 73  tions it crosses
11a0: 0a 09 23 20 4c 69 73 74 3a 20 52 41 4e 47 45 20  ..# List: RANGE 
11b0: 4f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73  Of the positions
11c0: 20 69 74 73 65 6c 66 2e 0a 09 23 20 41 20 64 65   itself...# A de
11d0: 70 65 6e 64 65 6e 63 79 20 69 73 20 61 20 73 69  pendency is a si
11e0: 6e 67 6c 65 2d 65 6c 65 6d 65 6e 74 20 6d 61 70  ngle-element map
11f0: 20 70 61 72 65 6e 74 20 2d 3e 20 63 68 69 6c 64   parent -> child
1200: 0a 0a 09 49 6e 69 74 69 61 6c 69 7a 65 42 72 65  ...InitializeBre
1210: 61 6b 53 74 61 74 65 20 24 6d 79 72 65 76 69 73  akState $myrevis
1220: 69 6f 6e 73 0a 0a 09 73 65 74 20 66 72 61 67 6d  ions...set fragm
1230: 65 6e 74 73 20 7b 7d 0a 09 73 65 74 20 70 65 6e  ents {}..set pen
1240: 64 69 6e 67 20 20 20 5b 6c 69 73 74 20 24 72 61  ding   [list $ra
1250: 6e 67 65 5d 0a 09 73 65 74 20 61 74 20 20 20 20  nge]..set at    
1260: 20 20 20 20 30 0a 09 61 72 72 61 79 20 73 65 74      0..array set
1270: 20 62 72 65 61 6b 73 20 7b 7d 0a 0a 09 77 68 69   breaks {}...whi
1280: 6c 65 20 7b 24 61 74 20 3c 20 5b 6c 6c 65 6e 67  le {$at < [lleng
1290: 74 68 20 24 70 65 6e 64 69 6e 67 5d 7d 20 7b 0a  th $pending]} {.
12a0: 09 20 20 20 20 73 65 74 20 63 75 72 72 65 6e 74  .    set current
12b0: 20 5b 6c 69 6e 64 65 78 20 24 70 65 6e 64 69 6e   [lindex $pendin
12c0: 67 20 24 61 74 5d 0a 0a 09 20 20 20 20 6c 6f 67  g $at]...    log
12d0: 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22   write 6 csets "
12e0: 2e 20 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e  . . .. ... .....
12f0: 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e   ........ ......
1300: 2e 2e 2e 2e 2e 2e 2e 22 0a 09 20 20 20 20 6c 6f  ......."..    lo
1310: 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20  g write 6 csets 
1320: 22 53 63 68 65 64 75 6c 65 64 20 20 20 5b 6a 6f  "Scheduled   [jo
1330: 69 6e 20 5b 50 52 73 20 5b 6c 72 61 6e 67 65 20  in [PRs [lrange 
1340: 24 70 65 6e 64 69 6e 67 20 24 61 74 20 65 6e 64  $pending $at end
1350: 5d 5d 20 7b 20 7d 5d 22 0a 09 20 20 20 20 6c 6f  ]] { }]"..    lo
1360: 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20  g write 6 csets 
1370: 22 43 6f 6e 73 69 64 65 72 69 6e 67 20 5b 50 52  "Considering [PR
1380: 20 24 63 75 72 72 65 6e 74 5d 20 5c 5b 24 61 74   $current] \[$at
1390: 2f 5b 6c 6c 65 6e 67 74 68 20 24 70 65 6e 64 69  /[llength $pendi
13a0: 6e 67 5d 5c 5d 22 0a 0a 09 20 20 20 20 73 65 74  ng]\]"...    set
13b0: 20 62 65 73 74 20 5b 46 69 6e 64 42 65 73 74 42   best [FindBestB
13c0: 72 65 61 6b 20 24 63 75 72 72 65 6e 74 5d 0a 0a  reak $current]..
13d0: 09 20 20 20 20 69 66 20 7b 24 62 65 73 74 20 3c  .    if {$best <
13e0: 20 30 7d 20 7b 0a 09 09 23 20 54 68 65 20 69 6e   0} {...# The in
13f0: 73 70 65 63 74 65 64 20 72 61 6e 67 65 20 68 61  spected range ha
1400: 73 20 6e 6f 20 69 6e 74 65 72 6e 61 6c 0a 09 09  s no internal...
1410: 23 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20  # dependencies. 
1420: 54 68 69 73 20 69 73 20 61 20 63 6f 6d 70 6c 65  This is a comple
1430: 74 65 20 66 72 61 67 6d 65 6e 74 2e 0a 09 09 6c  te fragment....l
1440: 61 70 70 65 6e 64 20 66 72 61 67 6d 65 6e 74 73  append fragments
1450: 20 24 63 75 72 72 65 6e 74 0a 0a 09 09 6c 6f 67   $current....log
1460: 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22   write 6 csets "
1470: 4e 6f 20 62 72 65 61 6b 73 2c 20 66 69 6e 61 6c  No breaks, final
1480: 22 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  "..    } else {.
1490: 09 09 23 20 53 70 6c 69 74 20 74 68 65 20 72 61  ..# Split the ra
14a0: 6e 67 65 20 61 6e 64 20 73 63 68 65 64 75 6c 65  nge and schedule
14b0: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 20 66   the resulting f
14c0: 72 61 67 6d 65 6e 74 73 0a 09 09 23 20 66 6f 72  ragments...# for
14d0: 20 66 75 72 74 68 65 72 20 69 6e 73 70 65 63 74   further inspect
14e0: 69 6f 6e 2e 20 52 65 6d 65 6d 62 65 72 20 74 68  ion. Remember th
14f0: 65 20 6e 75 6d 62 65 72 20 6f 66 0a 09 09 23 20  e number of...# 
1500: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 63 75 74  dependencies cut
1510: 20 62 65 66 6f 72 65 20 77 65 20 72 65 6d 6f 76   before we remov
1520: 65 20 74 68 65 6d 20 66 72 6f 6d 0a 09 09 23 20  e them from...# 
1530: 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 2c 20 66  consideration, f
1540: 6f 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e  or documentation
1550: 20 6c 61 74 65 72 2e 0a 0a 09 09 73 65 74 20 62   later.....set b
1560: 72 65 61 6b 73 28 24 62 65 73 74 29 20 24 63 72  reaks($best) $cr
1570: 6f 73 73 28 24 62 65 73 74 29 0a 0a 09 09 6c 6f  oss($best)....lo
1580: 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20  g write 6 csets 
1590: 22 42 65 73 74 20 62 72 65 61 6b 20 40 20 24 62  "Best break @ $b
15a0: 65 73 74 2c 20 63 75 74 74 69 6e 67 20 5b 6e 73  est, cutting [ns
15b0: 70 20 24 63 72 6f 73 73 28 24 62 65 73 74 29 20  p $cross($best) 
15c0: 64 65 70 65 6e 64 65 6e 63 79 20 64 65 70 65 6e  dependency depen
15d0: 64 65 6e 63 69 65 73 5d 22 0a 0a 09 09 23 20 4e  dencies]"....# N
15e0: 6f 74 65 3a 20 54 68 65 20 76 61 6c 75 65 20 6f  ote: The value o
15f0: 66 20 62 65 73 74 20 69 73 20 61 6e 20 61 62 6f  f best is an abo
1600: 6c 75 74 65 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  lute location in
1610: 0a 09 09 23 20 6d 79 72 65 76 69 73 69 6f 6e 73  ...# myrevisions
1620: 2e 20 55 73 65 20 74 68 65 20 73 74 61 72 74 20  . Use the start 
1630: 6f 66 20 63 75 72 72 65 6e 74 20 74 6f 20 6d 61  of current to ma
1640: 6b 65 20 69 74 20 61 6e 0a 09 09 23 20 69 6e 64  ke it an...# ind
1650: 65 78 20 61 62 73 6f 6c 75 74 65 20 74 6f 20 63  ex absolute to c
1660: 75 72 72 65 6e 74 2e 0a 0a 09 09 73 65 74 20 62  urrent.....set b
1670: 72 65 6c 20 5b 65 78 70 72 20 7b 24 62 65 73 74  rel [expr {$best
1680: 20 2d 20 5b 6c 69 6e 64 65 78 20 24 63 75 72 72   - [lindex $curr
1690: 65 6e 74 20 30 5d 7d 5d 0a 09 09 73 65 74 20 62  ent 0]}]...set b
16a0: 6e 65 78 74 20 24 62 72 65 6c 20 3b 20 69 6e 63  next $brel ; inc
16b0: 72 20 62 6e 65 78 74 0a 09 09 73 65 74 20 66 72  r bnext...set fr
16c0: 61 67 62 65 66 6f 72 65 20 5b 6c 72 61 6e 67 65  agbefore [lrange
16d0: 20 24 63 75 72 72 65 6e 74 20 30 20 24 62 72 65   $current 0 $bre
16e0: 6c 5d 0a 09 09 73 65 74 20 66 72 61 67 61 66 74  l]...set fragaft
16f0: 65 72 20 20 5b 6c 72 61 6e 67 65 20 24 63 75 72  er  [lrange $cur
1700: 72 65 6e 74 20 24 62 6e 65 78 74 20 65 6e 64 5d  rent $bnext end]
1710: 0a 0a 09 09 6c 6f 67 20 77 72 69 74 65 20 36 20  ....log write 6 
1720: 63 73 65 74 73 20 22 4e 65 77 20 70 69 65 63 65  csets "New piece
1730: 73 20 20 5b 50 52 20 24 66 72 61 67 62 65 66 6f  s  [PR $fragbefo
1740: 72 65 5d 20 5b 50 52 20 24 66 72 61 67 61 66 74  re] [PR $fragaft
1750: 65 72 5d 22 0a 0a 09 09 69 66 20 7b 21 5b 6c 6c  er]"....if {![ll
1760: 65 6e 67 74 68 20 24 66 72 61 67 62 65 66 6f 72  ength $fragbefor
1770: 65 5d 7d 20 7b 0a 09 09 20 20 20 20 74 72 6f 75  e]} {...    trou
1780: 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 22 54 72  ble internal "Tr
1790: 69 65 64 20 74 6f 20 73 70 6c 69 74 20 6f 66 66  ied to split off
17a0: 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66   a zero-length f
17b0: 72 61 67 6d 65 6e 74 20 61 74 20 74 68 65 20 62  ragment at the b
17c0: 65 67 69 6e 6e 69 6e 67 22 0a 09 09 7d 0a 09 09  eginning"...}...
17d0: 69 66 20 7b 21 5b 6c 6c 65 6e 67 74 68 20 24 66  if {![llength $f
17e0: 72 61 67 61 66 74 65 72 5d 7d 20 7b 0a 09 09 20  ragafter]} {... 
17f0: 20 20 20 74 72 6f 75 62 6c 65 20 69 6e 74 65 72     trouble inter
1800: 6e 61 6c 20 22 54 72 69 65 64 20 74 6f 20 73 70  nal "Tried to sp
1810: 6c 69 74 20 6f 66 66 20 61 20 7a 65 72 6f 2d 6c  lit off a zero-l
1820: 65 6e 67 74 68 20 66 72 61 67 6d 65 6e 74 20 61  ength fragment a
1830: 74 20 74 68 65 20 65 6e 64 22 0a 09 09 7d 0a 0a  t the end"...}..
1840: 09 09 6c 61 70 70 65 6e 64 20 70 65 6e 64 69 6e  ..lappend pendin
1850: 67 20 24 66 72 61 67 62 65 66 6f 72 65 20 24 66  g $fragbefore $f
1860: 72 61 67 61 66 74 65 72 0a 09 09 43 75 74 41 74  ragafter...CutAt
1870: 20 24 62 65 73 74 0a 09 20 20 20 20 7d 0a 0a 09   $best..    }...
1880: 20 20 20 20 69 6e 63 72 20 61 74 0a 09 7d 0a 0a      incr at..}..
1890: 09 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65  .log write 6 cse
18a0: 74 73 20 22 2e 20 2e 20 2e 2e 20 2e 2e 2e 20 2e  ts ". . .. ... .
18b0: 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e  .... ........ ..
18c0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 22 0a 0a 09 23  ..........."...#
18d0: 20 43 72 65 61 74 65 20 63 68 61 6e 67 65 73 65   Create changese
18e0: 74 73 20 66 6f 72 20 74 68 65 20 66 72 61 67 6d  ts for the fragm
18f0: 65 6e 74 73 2c 20 72 65 75 73 69 6e 67 20 74 68  ents, reusing th
1900: 65 20 63 75 72 72 65 6e 74 20 6f 6e 65 0a 09 23  e current one..#
1910: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 66   for the first f
1920: 72 61 67 6d 65 6e 74 2e 20 57 65 20 73 6f 72 74  ragment. We sort
1930: 20 74 68 65 6d 20 69 6e 20 6f 72 64 65 72 20 74   them in order t
1940: 6f 20 61 6c 6c 6f 77 0a 09 23 20 63 68 65 63 6b  o allow..# check
1950: 69 6e 67 20 66 6f 72 20 67 61 70 73 20 61 6e 64  ing for gaps and
1960: 20 6e 69 63 65 20 6d 65 73 73 61 67 65 73 2e 0a   nice messages..
1970: 0a 09 73 65 74 20 66 72 61 67 6d 65 6e 74 73 20  ..set fragments 
1980: 5b 6c 73 6f 72 74 20 2d 69 6e 64 65 78 20 30 20  [lsort -index 0 
1990: 2d 69 6e 74 65 67 65 72 20 24 66 72 61 67 6d 65  -integer $fragme
19a0: 6e 74 73 5d 0a 0a 09 23 70 75 74 73 20 5c 74 2e  nts]...#puts \t.
19b0: 5b 6a 6f 69 6e 20 5b 50 52 73 20 24 66 72 61 67  [join [PRs $frag
19c0: 6d 65 6e 74 73 5d 20 2e 5c 6e 5c 74 2e 5d 2e 0a  ments] .\n\t.]..
19d0: 0a 09 42 6f 72 64 65 72 20 5b 6c 69 6e 64 65 78  ..Border [lindex
19e0: 20 24 66 72 61 67 6d 65 6e 74 73 20 30 5d 20 66   $fragments 0] f
19f0: 69 72 73 74 73 20 66 69 72 73 74 65 0a 0a 09 69  irsts firste...i
1a00: 66 20 7b 24 66 69 72 73 74 73 20 21 3d 20 30 7d  f {$firsts != 0}
1a10: 20 7b 0a 09 20 20 20 20 74 72 6f 75 62 6c 65 20   {..    trouble 
1a20: 69 6e 74 65 72 6e 61 6c 20 22 42 61 64 20 66 72  internal "Bad fr
1a30: 61 67 6d 65 6e 74 20 73 74 61 72 74 20 40 20 24  agment start @ $
1a40: 66 69 72 73 74 73 2c 20 67 61 70 2c 20 6f 72 20  firsts, gap, or 
1a50: 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67  before beginning
1a60: 20 6f 66 20 74 68 65 20 72 61 6e 67 65 22 0a 09   of the range"..
1a70: 7d 0a 0a 09 73 65 74 20 6c 61 73 74 65 20 24 66  }...set laste $f
1a80: 69 72 73 74 65 0a 09 66 6f 72 65 61 63 68 20 66  irste..foreach f
1a90: 72 61 67 6d 65 6e 74 20 5b 6c 72 61 6e 67 65 20  ragment [lrange 
1aa0: 24 66 72 61 67 6d 65 6e 74 73 20 31 20 65 6e 64  $fragments 1 end
1ab0: 5d 20 7b 0a 09 20 20 20 20 42 6f 72 64 65 72 20  ] {..    Border 
1ac0: 24 66 72 61 67 6d 65 6e 74 20 73 20 65 0a 09 20  $fragment s e.. 
1ad0: 20 20 20 69 66 20 7b 24 6c 61 73 74 65 20 21 3d     if {$laste !=
1ae0: 20 28 24 73 20 2d 20 31 29 7d 20 7b 0a 09 09 74   ($s - 1)} {...t
1af0: 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20  rouble internal 
1b00: 22 42 61 64 20 66 72 61 67 6d 65 6e 74 20 62 6f  "Bad fragment bo
1b10: 72 64 65 72 20 3c 24 6c 61 73 74 65 20 7c 20 24  rder <$laste | $
1b20: 73 3e 2c 20 67 61 70 20 6f 72 20 6f 76 65 72 6c  s>, gap or overl
1b30: 61 70 22 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  ap"..    }...   
1b40: 20 73 65 74 20 6e 65 77 20 5b 24 74 79 70 65 20   set new [$type 
1b50: 25 41 55 54 4f 25 20 24 6d 79 70 72 6f 6a 65 63  %AUTO% $myprojec
1b60: 74 20 24 6d 79 74 79 70 65 20 24 6d 79 73 72 63  t $mytype $mysrc
1b70: 69 64 20 5b 6c 72 61 6e 67 65 20 24 6d 79 72 65  id [lrange $myre
1b80: 76 69 73 69 6f 6e 73 20 24 73 20 24 65 5d 5d 0a  visions $s $e]].
1b90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 67  .            log
1ba0: 20 77 72 69 74 65 20 34 20 63 73 65 74 73 20 22   write 4 csets "
1bb0: 42 72 65 61 6b 69 6e 67 20 3c 24 6d 79 69 64 3e  Breaking <$myid>
1bc0: 20 40 20 24 6c 61 73 74 65 2c 20 6e 65 77 20 3c   @ $laste, new <
1bd0: 5b 24 6e 65 77 20 69 64 5d 3e 2c 20 63 75 74 74  [$new id]>, cutt
1be0: 69 6e 67 20 24 62 72 65 61 6b 73 28 24 6c 61 73  ing $breaks($las
1bf0: 74 65 29 22 0a 0a 09 20 20 20 20 73 65 74 20 6c  te)"...    set l
1c00: 61 73 74 65 20 24 65 0a 09 7d 0a 0a 09 69 66 20  aste $e..}...if 
1c10: 7b 24 6c 61 73 74 65 20 21 3d 20 28 5b 6c 6c 65  {$laste != ([lle
1c20: 6e 67 74 68 20 24 6d 79 72 65 76 69 73 69 6f 6e  ngth $myrevision
1c30: 73 5d 2d 31 29 7d 20 7b 0a 09 20 20 20 20 74 72  s]-1)} {..    tr
1c40: 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 22  ouble internal "
1c50: 42 61 64 20 66 72 61 67 6d 65 6e 74 20 65 6e 64  Bad fragment end
1c60: 20 40 20 24 6c 61 73 74 65 2c 20 67 61 70 2c 20   @ $laste, gap, 
1c70: 6f 72 20 62 65 79 6f 6e 64 20 65 6e 64 20 6f 66  or beyond end of
1c80: 20 74 68 65 20 72 61 6e 67 65 22 0a 09 7d 0a 0a   the range"..}..
1c90: 09 23 20 50 75 74 20 74 68 65 20 66 69 72 73 74  .# Put the first
1ca0: 20 66 72 61 67 6d 65 6e 74 20 69 6e 74 6f 20 74   fragment into t
1cb0: 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67  he current chang
1cc0: 65 73 65 74 2e 0a 09 73 65 74 20 6d 79 72 65 76  eset...set myrev
1cd0: 69 73 69 6f 6e 73 20 5b 6c 72 61 6e 67 65 20 24  isions [lrange $
1ce0: 6d 79 72 65 76 69 73 69 6f 6e 73 20 30 20 24 66  myrevisions 0 $f
1cf0: 69 72 73 74 65 5d 0a 0a 09 72 65 74 75 72 6e 20  irste]...return 
1d00: 31 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74  1.    }..    met
1d10: 68 6f 64 20 70 65 72 73 69 73 74 20 7b 7d 20 7b  hod persist {} {
1d20: 0a 09 73 65 74 20 74 69 64 20 24 6d 79 63 73 74  ..set tid $mycst
1d30: 79 70 65 28 24 6d 79 74 79 70 65 29 0a 09 73 65  ype($mytype)..se
1d40: 74 20 70 69 64 20 5b 24 6d 79 70 72 6f 6a 65 63  t pid [$myprojec
1d50: 74 20 69 64 5d 0a 09 73 65 74 20 70 6f 73 20 30  t id]..set pos 0
1d60: 0a 0a 09 73 74 61 74 65 20 74 72 61 6e 73 61 63  ...state transac
1d70: 74 69 6f 6e 20 7b 0a 09 20 20 20 20 73 74 61 74  tion {..    stat
1d80: 65 20 72 75 6e 20 7b 0a 09 09 49 4e 53 45 52 54  e run {...INSERT
1d90: 20 49 4e 54 4f 20 63 68 61 6e 67 65 73 65 74 20   INTO changeset 
1da0: 28 63 69 64 2c 20 20 20 70 69 64 2c 20 20 74 79  (cid,   pid,  ty
1db0: 70 65 2c 20 73 72 63 29 0a 09 09 56 41 4c 55 45  pe, src)...VALUE
1dc0: 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S               
1dd0: 20 28 24 6d 79 69 64 2c 20 24 70 69 64 2c 20 24   ($myid, $pid, $
1de0: 74 69 64 2c 20 24 6d 79 73 72 63 69 64 29 3b 0a  tid, $mysrcid);.
1df0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 66 6f 72  .    }...    for
1e00: 65 61 63 68 20 72 69 64 20 24 6d 79 72 65 76 69  each rid $myrevi
1e10: 73 69 6f 6e 73 20 7b 0a 09 09 73 74 61 74 65 20  sions {...state 
1e20: 72 75 6e 20 7b 0a 09 09 20 20 20 20 49 4e 53 45  run {...    INSE
1e30: 52 54 20 49 4e 54 4f 20 63 73 72 65 76 69 73 69  RT INTO csrevisi
1e40: 6f 6e 20 28 63 69 64 2c 20 20 20 70 6f 73 2c 20  on (cid,   pos, 
1e50: 20 72 69 64 29 0a 09 09 20 20 20 20 56 41 4c 55   rid)...    VALU
1e60: 45 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ES              
1e70: 20 20 20 28 24 6d 79 69 64 2c 20 24 70 6f 73 2c     ($myid, $pos,
1e80: 20 24 72 69 64 29 3b 0a 09 09 7d 0a 09 09 69 6e   $rid);...}...in
1e90: 63 72 20 70 6f 73 0a 09 20 20 20 20 7d 0a 09 7d  cr pos..    }..}
1ea0: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
1eb0: 20 20 20 20 6d 65 74 68 6f 64 20 74 69 6d 65 72      method timer
1ec0: 61 6e 67 65 20 7b 7d 20 7b 0a 09 73 65 74 20 74  ange {} {..set t
1ed0: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 6d  heset ('[join $m
1ee0: 79 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d  yrevisions {','}
1ef0: 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61  ]')..return [sta
1f00: 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45  te run "..    SE
1f10: 4c 45 43 54 20 4d 49 4e 28 52 2e 64 61 74 65 29  LECT MIN(R.date)
1f20: 2c 20 4d 41 58 28 52 2e 64 61 74 65 29 0a 09 20  , MAX(R.date).. 
1f30: 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e     FROM revision
1f40: 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e   R..    WHERE R.
1f50: 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09  rid IN $theset..
1f60: 22 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65  "].    }..    me
1f70: 74 68 6f 64 20 64 72 6f 70 20 7b 7d 20 7b 0a 09  thod drop {} {..
1f80: 73 74 61 74 65 20 74 72 61 6e 73 61 63 74 69 6f  state transactio
1f90: 6e 20 7b 0a 09 20 20 20 20 73 74 61 74 65 20 72  n {..    state r
1fa0: 75 6e 20 7b 0a 09 09 44 45 4c 45 54 45 20 46 52  un {...DELETE FR
1fb0: 4f 4d 20 63 68 61 6e 67 65 73 65 74 20 20 57 48  OM changeset  WH
1fc0: 45 52 45 20 63 69 64 20 3d 20 24 6d 79 69 64 3b  ERE cid = $myid;
1fd0: 0a 09 09 44 45 4c 45 54 45 20 46 52 4f 4d 20 63  ...DELETE FROM c
1fe0: 73 72 65 76 69 73 69 6f 6e 20 57 48 45 52 45 20  srevision WHERE 
1ff0: 63 69 64 20 3d 20 24 6d 79 69 64 3b 0a 09 20 20  cid = $myid;..  
2000: 20 20 7d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20    }..}..foreach 
2010: 72 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 20 7b  r $myrevisions {
2020: 20 75 6e 73 65 74 20 6d 79 72 65 76 6d 61 70 28   unset myrevmap(
2030: 24 72 29 20 7d 0a 09 73 65 74 20 70 6f 73 20 20  $r) }..set pos  
2040: 20 20 20 20 20 20 20 20 5b 6c 73 65 61 72 63 68          [lsearch
2050: 20 2d 65 78 61 63 74 20 24 6d 79 63 68 61 6e 67   -exact $mychang
2060: 65 73 65 74 73 20 24 73 65 6c 66 5d 0a 09 73 65  esets $self]..se
2070: 74 20 6d 79 63 68 61 6e 67 65 73 65 74 73 20 5b  t mychangesets [
2080: 6c 72 65 70 6c 61 63 65 20 24 6d 79 63 68 61 6e  lreplace $mychan
2090: 67 65 73 65 74 73 20 24 70 6f 73 20 24 70 6f 73  gesets $pos $pos
20a0: 5d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  ]..return.    }.
20b0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
20c0: 73 70 6c 69 74 20 7b 63 73 65 74 20 61 72 67 73  split {cset args
20d0: 7d 20 7b 0a 09 23 20 41 73 20 70 61 72 74 20 6f  } {..# As part o
20e0: 66 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20 6f  f the creation o
20f0: 66 20 74 68 65 20 6e 65 77 20 63 68 61 6e 67 65  f the new change
2100: 73 65 74 73 20 73 70 65 63 69 66 69 65 64 20 69  sets specified i
2110: 6e 0a 09 23 20 41 52 47 53 20 61 73 20 73 65 74  n..# ARGS as set
2120: 73 20 6f 66 20 72 65 76 69 73 69 6f 6e 73 2c 20  s of revisions, 
2130: 61 6c 6c 20 73 75 62 73 65 74 73 20 6f 66 20 43  all subsets of C
2140: 53 45 54 27 73 20 72 65 76 69 73 69 6f 6e 0a 09  SET's revision..
2150: 23 20 73 65 74 2c 20 43 53 45 54 20 77 69 6c 6c  # set, CSET will
2160: 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d   be dropped from
2170: 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 2c 20   all databases, 
2180: 69 6e 20 61 6e 64 20 6f 75 74 20 6f 66 0a 09 23  in and out of..#
2190: 20 6d 65 6d 6f 72 79 2c 20 61 6e 64 20 74 68 65   memory, and the
21a0: 6e 20 64 65 73 74 72 6f 79 65 64 2e 0a 0a 09 73  n destroyed....s
21b0: 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69  truct::list assi
21c0: 67 6e 20 5b 24 63 73 65 74 20 64 61 74 61 5d 20  gn [$cset data] 
21d0: 70 72 6f 6a 65 63 74 20 63 73 74 79 70 65 20 63  project cstype c
21e0: 73 73 72 63 0a 0a 09 24 63 73 65 74 20 64 72 6f  ssrc...$cset dro
21f0: 70 0a 09 24 63 73 65 74 20 64 65 73 74 72 6f 79  p..$cset destroy
2200: 0a 0a 09 73 65 74 20 6e 65 77 63 73 65 74 73 20  ...set newcsets 
2210: 7b 7d 0a 09 66 6f 72 65 61 63 68 20 66 72 61 67  {}..foreach frag
2220: 6d 65 6e 74 72 65 76 69 73 69 6f 6e 73 20 24 61  mentrevisions $a
2230: 72 67 73 20 7b 0a 09 20 20 20 20 6c 61 70 70 65  rgs {..    lappe
2240: 6e 64 20 6e 65 77 63 73 65 74 73 20 5b 24 74 79  nd newcsets [$ty
2250: 70 65 20 25 41 55 54 4f 25 20 24 70 72 6f 6a 65  pe %AUTO% $proje
2260: 63 74 20 24 63 73 74 79 70 65 20 24 63 73 73 72  ct $cstype $cssr
2270: 63 20 24 66 72 61 67 6d 65 6e 74 72 65 76 69 73  c $fragmentrevis
2280: 69 6f 6e 73 5d 0a 09 7d 0a 0a 09 66 6f 72 65 61  ions]..}...forea
2290: 63 68 20 63 20 24 6e 65 77 63 73 65 74 73 20 7b  ch c $newcsets {
22a0: 20 24 63 20 70 65 72 73 69 73 74 20 7d 0a 09 72   $c persist }..r
22b0: 65 74 75 72 6e 20 24 6e 65 77 63 73 65 74 73 0a  eturn $newcsets.
22c0: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23      }..    # # #
22d0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
22e0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
22f0: 23 23 0a 20 20 20 20 23 23 20 53 74 61 74 65 0a  ##.    ## State.
2300: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79  .    variable my
2310: 69 64 20 20 20 20 20 20 20 20 7b 7d 20 3b 20 23  id        {} ; #
2320: 20 49 64 20 6f 66 20 74 68 65 20 63 73 65 74 20   Id of the cset 
2330: 66 6f 72 20 74 68 65 20 70 65 72 73 69 73 74 65  for the persiste
2340: 6e 74 0a 09 09 09 20 20 20 20 20 20 23 20 73 74  nt....      # st
2350: 61 74 65 2e 0a 20 20 20 20 76 61 72 69 61 62 6c  ate..    variabl
2360: 65 20 6d 79 70 72 6f 6a 65 63 74 20 20 20 7b 7d  e myproject   {}
2370: 20 3b 20 23 20 52 65 66 65 72 65 6e 63 65 20 6f   ; # Reference o
2380: 66 20 74 68 65 20 70 72 6f 6a 65 63 74 20 6f 62  f the project ob
2390: 6a 65 63 74 20 74 68 65 0a 09 09 09 20 20 20 20  ject the....    
23a0: 20 20 23 20 63 68 61 6e 67 65 73 65 74 20 62 65    # changeset be
23b0: 6c 6f 6e 67 73 20 74 6f 2e 0a 20 20 20 20 76 61  longs to..    va
23c0: 72 69 61 62 6c 65 20 6d 79 74 79 70 65 20 20 20  riable mytype   
23d0: 20 20 20 7b 7d 20 3b 20 23 20 72 65 76 20 6f 72     {} ; # rev or
23e0: 20 73 79 6d 2c 20 77 68 65 72 65 20 74 68 65 20   sym, where the 
23f0: 63 73 65 74 20 6f 72 69 67 69 6e 61 74 65 64 0a  cset originated.
2400: 09 09 09 20 20 20 20 20 20 23 20 66 72 6f 6d 2e  ...      # from.
2410: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79  .    variable my
2420: 73 72 63 69 64 20 20 20 20 20 7b 7d 20 3b 20 23  srcid     {} ; #
2430: 20 49 64 20 6f 66 20 74 68 65 20 6d 65 74 61 64   Id of the metad
2440: 61 74 61 20 6f 72 20 73 79 6d 62 6f 6c 20 74 68  ata or symbol th
2450: 65 20 63 73 65 74 0a 09 09 09 20 20 20 20 20 20  e cset....      
2460: 23 20 69 73 20 62 61 73 65 64 20 6f 6e 2e 0a 20  # is based on.. 
2470: 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 72 65     variable myre
2480: 76 69 73 69 6f 6e 73 20 7b 7d 20 3b 20 23 20 4c  visions {} ; # L
2490: 69 73 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20  ist of the file 
24a0: 6c 65 76 65 6c 20 72 65 76 69 73 69 6f 6e 73 20  level revisions 
24b0: 69 6e 0a 09 09 09 20 20 20 20 20 20 23 20 74 68  in....      # th
24c0: 65 20 63 73 65 74 2e 0a 20 20 20 20 76 61 72 69  e cset..    vari
24d0: 61 62 6c 65 20 6d 79 6e 65 78 74 6d 61 70 20 20  able mynextmap  
24e0: 20 7b 7d 20 3b 20 23 20 44 69 63 74 69 6f 6e 61   {} ; # Dictiona
24f0: 72 79 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20  ry mapping from 
2500: 74 68 65 20 72 65 76 69 73 69 6f 6e 73 0a 09 09  the revisions...
2510: 09 20 20 20 20 20 20 23 20 74 6f 20 74 68 65 69  .      # to thei
2520: 72 20 73 75 63 63 65 73 73 6f 72 73 2e 20 43 61  r successors. Ca
2530: 63 68 65 20 74 6f 20 61 76 6f 69 64 0a 09 09 09  che to avoid....
2540: 20 20 20 20 20 20 23 20 6c 6f 61 64 69 6e 67 20        # loading 
2550: 74 68 69 73 20 66 72 6f 6d 20 74 68 65 20 73 74  this from the st
2560: 61 74 65 20 6d 6f 72 65 20 74 68 61 6e 0a 09 09  ate more than...
2570: 09 20 20 20 20 20 20 23 20 6f 6e 63 65 2e 0a 20  .      # once.. 
2580: 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 70 6f     variable mypo
2590: 73 20 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 43  s       {} ; # C
25a0: 6f 6d 6d 69 74 20 70 6f 73 69 74 69 6f 6e 20 6f  ommit position o
25b0: 66 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c  f the changeset,
25c0: 20 69 66 0a 09 09 09 20 20 20 20 20 20 23 20 6b   if....      # k
25d0: 6e 6f 77 6e 2e 0a 0a 20 20 20 20 23 20 23 20 23  nown...    # # #
25e0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
25f0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
2600: 23 23 0a 20 20 20 20 23 23 20 49 6e 74 65 72 6e  ##.    ## Intern
2610: 61 6c 20 6d 65 74 68 6f 64 73 0a 0a 20 20 20 20  al methods..    
2620: 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63  typevariable myc
2630: 6f 75 6e 74 65 72 20 20 20 20 20 20 20 20 30 20  ounter        0 
2640: 3b 20 23 20 49 64 20 63 6f 75 6e 74 65 72 20 66  ; # Id counter f
2650: 6f 72 20 63 73 65 74 73 2e 20 4c 61 73 74 20 69  or csets. Last i
2660: 64 20 75 73 65 64 2e 0a 20 20 20 20 74 79 70 65  d used..    type
2670: 76 61 72 69 61 62 6c 65 20 6d 79 63 73 74 79 70  variable mycstyp
2680: 65 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20  e -array {} ; # 
2690: 4d 61 70 20 63 73 74 79 70 65 73 20 74 6f 20 70  Map cstypes to p
26a0: 65 72 73 69 73 74 65 6e 74 20 69 64 73 2e 0a 0a  ersistent ids...
26b0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 67      typemethod g
26c0: 65 74 63 73 74 79 70 65 73 20 7b 7d 20 7b 0a 09  etcstypes {} {..
26d0: 66 6f 72 65 61 63 68 20 7b 74 69 64 20 6e 61 6d  foreach {tid nam
26e0: 65 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a  e} [state run {.
26f0: 09 20 20 20 20 53 45 4c 45 43 54 20 74 69 64 2c  .    SELECT tid,
2700: 20 6e 61 6d 65 20 46 52 4f 4d 20 63 73 74 79 70   name FROM cstyp
2710: 65 3b 0a 09 7d 5d 20 7b 20 73 65 74 20 6d 79 63  e;..}] { set myc
2720: 73 74 79 70 65 28 24 6e 61 6d 65 29 20 24 74 69  stype($name) $ti
2730: 64 20 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  d }..return.    
2740: 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  }..    typemetho
2750: 64 20 6c 6f 61 64 63 6f 75 6e 74 65 72 20 7b 7d  d loadcounter {}
2760: 20 7b 0a 09 23 20 49 6e 69 74 69 61 6c 69 7a 65   {..# Initialize
2770: 20 74 68 65 20 63 6f 75 6e 74 65 72 20 66 72 6f   the counter fro
2780: 6d 20 74 68 65 20 73 74 61 74 65 0a 09 73 65 74  m the state..set
2790: 20 6d 79 63 6f 75 6e 74 65 72 20 5b 73 74 61 74   mycounter [stat
27a0: 65 20 6f 6e 65 20 7b 20 53 45 4c 45 43 54 20 4d  e one { SELECT M
27b0: 41 58 28 63 69 64 29 20 46 52 4f 4d 20 63 68 61  AX(cid) FROM cha
27c0: 6e 67 65 73 65 74 20 7d 5d 0a 09 72 65 74 75 72  ngeset }]..retur
27d0: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f  n.    }..    pro
27e0: 63 20 50 75 6c 6c 49 6e 74 65 72 6e 61 6c 53 75  c PullInternalSu
27f0: 63 63 65 73 73 6f 72 52 65 76 69 73 69 6f 6e 73  ccessorRevisions
2800: 20 7b 64 76 20 72 65 76 69 73 69 6f 6e 73 7d 20   {dv revisions} 
2810: 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76 20 64  {..upvar 1 $dv d
2820: 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 73 65 74  ependencies..set
2830: 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20   theset ('[join 
2840: 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d  $revisions {','}
2850: 5d 27 29 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72  ]')...foreach {r
2860: 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65  id child} [state
2870: 20 72 75 6e 20 22 0a 20 20 20 2d 2d 20 50 72 69   run ".   -- Pri
2880: 6d 61 72 79 20 63 68 69 6c 64 72 65 6e 0a 09 20  mary children.. 
2890: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c     SELECT R.rid,
28a0: 20 52 2e 63 68 69 6c 64 0a 09 20 20 20 20 46 52   R.child..    FR
28b0: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 0a  OM   revision R.
28c0: 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69  .    WHERE  R.ri
28d0: 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 0a 09  d   IN $theset..
28e0: 20 20 20 20 41 4e 44 20 20 20 20 52 2e 63 68 69      AND    R.chi
28f0: 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 0a 09  ld IS NOT NULL..
2900: 20 20 20 20 41 4e 44 20 20 20 20 52 2e 63 68 69      AND    R.chi
2910: 6c 64 20 49 4e 20 24 74 68 65 73 65 74 0a 20 20  ld IN $theset.  
2920: 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 54    UNION.    -- T
2930: 72 61 6e 73 69 74 69 6f 6e 20 4e 54 44 42 20 74  ransition NTDB t
2940: 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20 53 45 4c  o trunk..    SEL
2950: 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 64 62 63  ECT R.rid, R.dbc
2960: 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  hild..    FROM  
2970: 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20   revision R..   
2980: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20   WHERE  R.rid   
2990: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20  IN $theset..    
29a0: 41 4e 44 20 20 20 20 52 2e 64 62 63 68 69 6c 64  AND    R.dbchild
29b0: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 0a 09 20 20   IS NOT NULL..  
29c0: 20 20 41 4e 44 20 20 20 20 52 2e 64 62 63 68 69    AND    R.dbchi
29d0: 6c 64 20 49 4e 20 24 74 68 65 73 65 74 0a 20 20  ld IN $theset.  
29e0: 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 53    UNION.    -- S
29f0: 65 63 6f 6e 64 61 72 79 20 28 62 72 61 6e 63 68  econdary (branch
2a00: 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20  ) children..    
2a10: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 42 2e  SELECT R.rid, B.
2a20: 62 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  brid..    FROM  
2a30: 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76   revision R, rev
2a40: 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64  isionbranchchild
2a50: 72 65 6e 20 42 0a 09 20 20 20 20 57 48 45 52 45  ren B..    WHERE
2a60: 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68    R.rid   IN $th
2a70: 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20  eset..    AND   
2a80: 20 52 2e 72 69 64 20 3d 20 42 2e 72 69 64 0a 09   R.rid = B.rid..
2a90: 20 20 20 20 41 4e 44 20 20 20 20 42 2e 62 72 69      AND    B.bri
2aa0: 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 22 5d  d IN $theset.."]
2ab0: 20 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 69 64   {..    # Consid
2ac0: 65 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 20 74  er moving this t
2ad0: 6f 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  o the integrity 
2ae0: 6d 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 66 20  module...    if 
2af0: 7b 24 72 69 64 20 3d 3d 20 24 63 68 69 6c 64 7d  {$rid == $child}
2b00: 20 7b 0a 09 09 74 72 6f 75 62 6c 65 20 69 6e 74   {...trouble int
2b10: 65 72 6e 61 6c 20 22 52 65 76 69 73 69 6f 6e 20  ernal "Revision 
2b20: 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f 6e 20  $rid depends on 
2b30: 69 74 73 65 6c 66 2e 22 0a 09 20 20 20 20 7d 0a  itself."..    }.
2b40: 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70  .    lappend dep
2b50: 65 6e 64 65 6e 63 69 65 73 28 24 72 69 64 29 20  endencies($rid) 
2b60: 24 63 68 69 6c 64 0a 09 7d 0a 20 20 20 20 7d 0a  $child..}.    }.
2b70: 0a 20 20 20 20 70 72 6f 63 20 50 75 6c 6c 53 75  .    proc PullSu
2b80: 63 63 65 73 73 6f 72 52 65 76 69 73 69 6f 6e 73  ccessorRevisions
2b90: 20 7b 64 76 20 72 65 76 69 73 69 6f 6e 73 7d 20   {dv revisions} 
2ba0: 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76 20 64  {..upvar 1 $dv d
2bb0: 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 73 65 74  ependencies..set
2bc0: 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20   theset ('[join 
2bd0: 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d  $revisions {','}
2be0: 5d 27 29 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72  ]')...foreach {r
2bf0: 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65  id child} [state
2c00: 20 72 75 6e 20 22 0a 20 20 20 2d 2d 20 50 72 69   run ".   -- Pri
2c10: 6d 61 72 79 20 63 68 69 6c 64 72 65 6e 0a 09 20  mary children.. 
2c20: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c     SELECT R.rid,
2c30: 20 52 2e 63 68 69 6c 64 0a 09 20 20 20 20 46 52   R.child..    FR
2c40: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 0a  OM   revision R.
2c50: 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69  .    WHERE  R.ri
2c60: 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 0a 09  d   IN $theset..
2c70: 20 20 20 20 41 4e 44 20 20 20 20 52 2e 63 68 69      AND    R.chi
2c80: 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 0a 20  ld IS NOT NULL. 
2c90: 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20     UNION.    -- 
2ca0: 54 72 61 6e 73 69 74 69 6f 6e 20 4e 54 44 42 20  Transition NTDB 
2cb0: 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20 53 45  to trunk..    SE
2cc0: 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 64 62  LECT R.rid, R.db
2cd0: 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20  child..    FROM 
2ce0: 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20    revision R..  
2cf0: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20    WHERE  R.rid  
2d00: 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20   IN $theset..   
2d10: 20 41 4e 44 20 20 20 20 52 2e 64 62 63 68 69 6c   AND    R.dbchil
2d20: 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 0a 20 20  d IS NOT NULL.  
2d30: 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 53    UNION.    -- S
2d40: 65 63 6f 6e 64 61 72 79 20 28 62 72 61 6e 63 68  econdary (branch
2d50: 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20  ) children..    
2d60: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 42 2e  SELECT R.rid, B.
2d70: 62 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  brid..    FROM  
2d80: 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76   revision R, rev
2d90: 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64  isionbranchchild
2da0: 72 65 6e 20 42 0a 09 20 20 20 20 57 48 45 52 45  ren B..    WHERE
2db0: 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68    R.rid   IN $th
2dc0: 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20  eset..    AND   
2dd0: 20 52 2e 72 69 64 20 3d 20 42 2e 72 69 64 0a 09   R.rid = B.rid..
2de0: 22 5d 20 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73  "] {..    # Cons
2df0: 69 64 65 72 20 6d 6f 76 69 6e 67 20 74 68 69 73  ider moving this
2e00: 20 74 6f 20 74 68 65 20 69 6e 74 65 67 72 69 74   to the integrit
2e10: 79 20 6d 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69  y module...    i
2e20: 66 20 7b 24 72 69 64 20 3d 3d 20 24 63 68 69 6c  f {$rid == $chil
2e30: 64 7d 20 7b 0a 09 09 74 72 6f 75 62 6c 65 20 69  d} {...trouble i
2e40: 6e 74 65 72 6e 61 6c 20 22 52 65 76 69 73 69 6f  nternal "Revisio
2e50: 6e 20 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f  n $rid depends o
2e60: 6e 20 69 74 73 65 6c 66 2e 22 0a 09 20 20 20 20  n itself."..    
2e70: 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64  }..    lappend d
2e80: 65 70 65 6e 64 65 6e 63 69 65 73 28 24 72 69 64  ependencies($rid
2e90: 29 20 24 63 68 69 6c 64 0a 09 7d 0a 20 20 20 20  ) $child..}.    
2ea0: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 49 6e 69 74  }..    proc Init
2eb0: 69 61 6c 69 7a 65 42 72 65 61 6b 53 74 61 74 65  ializeBreakState
2ec0: 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09   {revisions} {..
2ed0: 75 70 76 61 72 20 31 20 70 6f 73 20 70 6f 73 20  upvar 1 pos pos 
2ee0: 63 72 6f 73 73 20 63 72 6f 73 73 20 72 61 6e 67  cross cross rang
2ef0: 65 20 72 61 6e 67 65 20 64 65 70 63 20 64 65 70  e range depc dep
2f00: 63 20 64 65 6c 74 61 20 64 65 6c 74 61 20 5c 0a  c delta delta \.
2f10: 09 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65  .    dependencie
2f20: 73 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 0a  s dependencies..
2f30: 09 23 20 46 69 72 73 74 20 77 65 20 63 72 65 61  .# First we crea
2f40: 74 65 20 61 20 6d 61 70 20 6f 66 20 70 6f 73 69  te a map of posi
2f50: 74 69 6f 6e 73 20 74 6f 20 6d 61 6b 65 20 69 74  tions to make it
2f60: 20 65 61 73 69 65 72 20 74 6f 0a 09 23 20 64 65   easier to..# de
2f70: 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
2f80: 61 20 64 65 70 65 6e 64 65 6e 63 79 20 63 72 6f  a dependency cro
2f90: 73 73 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  sses a particula
2fa0: 72 20 69 6e 64 65 78 2e 0a 0a 09 61 72 72 61 79  r index....array
2fb0: 20 73 65 74 20 70 6f 73 20 20 20 7b 7d 0a 09 61   set pos   {}..a
2fc0: 72 72 61 79 20 73 65 74 20 63 72 6f 73 73 20 7b  rray set cross {
2fd0: 7d 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 70  }..array set dep
2fe0: 63 20 20 7b 7d 0a 09 73 65 74 20 72 61 6e 67 65  c  {}..set range
2ff0: 20 20 20 20 20 20 20 7b 7d 0a 09 73 65 74 20 6e         {}..set n
3000: 20 30 0a 09 66 6f 72 65 61 63 68 20 72 65 76 20   0..foreach rev 
3010: 24 72 65 76 69 73 69 6f 6e 73 20 7b 20 0a 09 20  $revisions { .. 
3020: 20 20 20 6c 61 70 70 65 6e 64 20 72 61 6e 67 65     lappend range
3030: 20 24 6e 0a 09 20 20 20 20 73 65 74 20 70 6f 73   $n..    set pos
3040: 28 24 72 65 76 29 20 24 6e 0a 09 20 20 20 20 73  ($rev) $n..    s
3050: 65 74 20 63 72 6f 73 73 28 24 6e 29 20 30 0a 09  et cross($n) 0..
3060: 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 0a 09      incr n..}...
3070: 23 20 53 65 63 6f 6e 64 6c 79 20 77 65 20 63 6f  # Secondly we co
3080: 75 6e 74 20 74 68 65 20 63 72 6f 73 73 69 6e 67  unt the crossing
3090: 73 20 70 65 72 20 70 6f 73 69 74 69 6f 6e 2c 20  s per position, 
30a0: 62 79 20 69 74 65 72 61 74 69 6e 67 0a 09 23 20  by iterating..# 
30b0: 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64 65  over the recorde
30c0: 64 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e  d internal depen
30d0: 64 65 6e 63 69 65 73 2e 0a 0a 09 23 20 4e 6f 74  dencies....# Not
30e0: 65 3a 20 49 66 20 74 68 65 20 74 69 6d 65 73 74  e: If the timest
30f0: 61 6d 70 73 20 61 72 65 20 62 61 64 6c 79 20 6f  amps are badly o
3100: 75 74 20 6f 66 20 6f 72 64 65 72 20 69 74 20 69  ut of order it i
3110: 73 0a 09 23 20 20 20 20 20 20 20 70 6f 73 73 69  s..#       possi
3120: 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20 62 61  ble to have a ba
3130: 63 6b 77 61 72 64 20 73 75 63 63 65 73 73 6f 72  ckward successor
3140: 20 64 65 70 65 6e 64 65 6e 63 79 2c 0a 09 23 20   dependency,..# 
3150: 20 20 20 20 20 20 69 2e 65 2e 20 77 69 74 68 20        i.e. with 
3160: 73 74 61 72 74 20 3e 20 65 6e 64 2e 20 57 65 20  start > end. We 
3170: 6d 61 79 20 68 61 76 65 20 74 6f 20 73 77 61 70  may have to swap
3180: 20 74 68 65 20 69 6e 64 69 63 65 73 0a 09 23 20   the indices..# 
3190: 20 20 20 20 20 20 74 6f 20 65 6e 73 75 72 65 20        to ensure 
31a0: 74 68 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69  that the followi
31b0: 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 63 6f 72  ng loop runs cor
31c0: 72 65 63 74 6c 79 2e 0a 09 23 0a 09 23 20 4e 6f  rectly...#..# No
31d0: 74 65 20 32 3a 20 73 74 61 72 74 20 3d 3d 20 65  te 2: start == e
31e0: 6e 64 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  nd is not possib
31f0: 6c 65 2e 20 49 74 20 69 6e 64 69 63 61 74 65 73  le. It indicates
3200: 20 61 0a 09 23 20 20 20 20 20 20 20 20 20 73 65   a..#         se
3210: 6c 66 2d 64 65 70 65 6e 64 65 6e 63 79 20 64 75  lf-dependency du
3220: 65 20 74 6f 20 74 68 65 20 75 6e 69 71 75 65 6e  e to the uniquen
3230: 65 73 73 20 6f 66 20 70 6f 73 69 74 69 6f 6e 73  ess of positions
3240: 2c 0a 09 23 20 20 20 20 20 20 20 20 20 61 6e 64  ,..#         and
3250: 20 74 68 61 74 20 69 73 20 73 6f 6d 65 74 68 69   that is somethi
3260: 6e 67 20 77 65 20 68 61 76 65 20 72 75 6c 65 64  ng we have ruled
3270: 20 6f 75 74 20 61 6c 72 65 61 64 79 2c 20 73 65   out already, se
3280: 65 0a 09 23 20 20 20 20 20 20 20 20 20 50 75 6c  e..#         Pul
3290: 6c 49 6e 74 65 72 6e 61 6c 53 75 63 63 65 73 73  lInternalSuccess
32a0: 6f 72 52 65 76 69 73 69 6f 6e 73 2e 0a 0a 09 66  orRevisions....f
32b0: 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c  oreach {rid chil
32c0: 64 7d 20 5b 61 72 72 61 79 20 67 65 74 20 64 65  d} [array get de
32d0: 70 65 6e 64 65 6e 63 69 65 73 5d 20 7b 0a 09 20  pendencies] {.. 
32e0: 20 20 20 73 65 74 20 64 6b 65 79 20 20 20 20 5b     set dkey    [
32f0: 6c 69 73 74 20 24 72 69 64 20 24 63 68 69 6c 64  list $rid $child
3300: 5d 0a 09 20 20 20 20 73 65 74 20 73 74 61 72 74  ]..    set start
3310: 20 20 20 24 70 6f 73 28 24 72 69 64 29 0a 09 20     $pos($rid).. 
3320: 20 20 20 73 65 74 20 65 6e 64 20 20 20 20 20 24     set end     $
3330: 70 6f 73 28 24 63 68 69 6c 64 29 0a 09 20 20 20  pos($child)..   
3340: 20 73 65 74 20 63 72 6f 73 73 65 73 20 7b 7d 0a   set crosses {}.
3350: 0a 09 20 20 20 20 69 66 20 7b 24 73 74 61 72 74  ..    if {$start
3360: 20 3e 20 24 65 6e 64 7d 20 7b 0a 09 09 77 68 69   > $end} {...whi
3370: 6c 65 20 7b 24 65 6e 64 20 3c 20 24 73 74 61 72  le {$end < $star
3380: 74 7d 20 7b 0a 09 09 20 20 20 20 6c 61 70 70 65  t} {...    lappe
3390: 6e 64 20 63 72 6f 73 73 65 73 20 24 65 6e 64 0a  nd crosses $end.
33a0: 09 09 20 20 20 20 69 6e 63 72 20 63 72 6f 73 73  ..    incr cross
33b0: 28 24 65 6e 64 29 0a 09 09 20 20 20 20 69 6e 63  ($end)...    inc
33c0: 72 20 65 6e 64 0a 09 09 7d 0a 09 20 20 20 20 7d  r end...}..    }
33d0: 20 65 6c 73 65 20 7b 0a 09 09 77 68 69 6c 65 20   else {...while 
33e0: 7b 24 73 74 61 72 74 20 3c 20 24 65 6e 64 7d 20  {$start < $end} 
33f0: 7b 0a 09 09 20 20 20 20 6c 61 70 70 65 6e 64 20  {...    lappend 
3400: 63 72 6f 73 73 65 73 20 24 73 74 61 72 74 0a 09  crosses $start..
3410: 09 20 20 20 20 69 6e 63 72 20 63 72 6f 73 73 28  .    incr cross(
3420: 24 73 74 61 72 74 29 0a 09 09 20 20 20 20 69 6e  $start)...    in
3430: 63 72 20 73 74 61 72 74 0a 09 09 7d 0a 09 20 20  cr start...}..  
3440: 20 20 7d 0a 09 20 20 20 20 73 65 74 20 64 65 70    }..    set dep
3450: 63 28 24 64 6b 65 79 29 20 24 63 72 6f 73 73 65  c($dkey) $crosse
3460: 73 0a 09 7d 0a 0a 09 49 6e 69 74 69 61 6c 69 7a  s..}...Initializ
3470: 65 44 65 6c 74 61 73 20 24 72 65 76 69 73 69 6f  eDeltas $revisio
3480: 6e 73 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d  ns..return.    }
3490: 0a 0a 20 20 20 20 70 72 6f 63 20 49 6e 69 74 69  ..    proc Initi
34a0: 61 6c 69 7a 65 44 65 6c 74 61 73 20 7b 72 65 76  alizeDeltas {rev
34b0: 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72  isions} {..upvar
34c0: 20 31 20 64 65 6c 74 61 20 64 65 6c 74 61 0a 0a   1 delta delta..
34d0: 09 23 20 50 75 6c 6c 20 74 68 65 20 74 69 6d 65  .# Pull the time
34e0: 73 74 61 6d 70 73 20 66 6f 72 20 61 6c 6c 20 72  stamps for all r
34f0: 65 76 69 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  evisions in the 
3500: 63 68 61 6e 67 65 73 65 74 73 20 61 6e 64 0a 09  changesets and..
3510: 23 20 63 6f 6d 70 75 74 65 20 74 68 65 69 72 20  # compute their 
3520: 64 65 6c 74 61 73 20 66 6f 72 20 75 73 65 20 62  deltas for use b
3530: 79 20 74 68 65 20 62 72 65 61 6b 20 66 69 6e 64  y the break find
3540: 65 72 2e 0a 0a 09 61 72 72 61 79 20 73 65 74 20  er....array set 
3550: 64 65 6c 74 61 20 7b 7d 0a 09 61 72 72 61 79 20  delta {}..array 
3560: 73 65 74 20 73 74 61 6d 70 20 7b 7d 0a 0a 09 73  set stamp {}...s
3570: 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69  et theset ('[joi
3580: 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c  n $revisions {',
3590: 27 7d 5d 27 29 0a 09 66 6f 72 65 61 63 68 20 7b  '}]')..foreach {
35a0: 72 69 64 20 74 69 6d 65 7d 20 5b 73 74 61 74 65  rid time} [state
35b0: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45   run "..    SELE
35c0: 43 54 20 52 2e 72 69 64 2c 20 52 2e 64 61 74 65  CT R.rid, R.date
35d0: 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73  ..    FROM revis
35e0: 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45  ion R..    WHERE
35f0: 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65   R.rid IN $these
3600: 74 0a 09 22 5d 20 7b 0a 09 20 20 20 20 73 65 74  t.."] {..    set
3610: 20 73 74 61 6d 70 28 24 72 69 64 29 20 24 74 69   stamp($rid) $ti
3620: 6d 65 0a 09 7d 0a 0a 09 73 65 74 20 6e 20 30 0a  me..}...set n 0.
3630: 09 66 6f 72 65 61 63 68 20 72 69 64 20 5b 6c 72  .foreach rid [lr
3640: 61 6e 67 65 20 24 72 65 76 69 73 69 6f 6e 73 20  ange $revisions 
3650: 30 20 65 6e 64 2d 31 5d 20 72 6e 65 78 74 20 5b  0 end-1] rnext [
3660: 6c 72 61 6e 67 65 20 24 72 65 76 69 73 69 6f 6e  lrange $revision
3670: 73 20 31 20 65 6e 64 5d 20 7b 0a 09 20 20 20 20  s 1 end] {..    
3680: 73 65 74 20 64 65 6c 74 61 28 24 6e 29 20 5b 65  set delta($n) [e
3690: 78 70 72 20 7b 24 73 74 61 6d 70 28 24 72 6e 65  xpr {$stamp($rne
36a0: 78 74 29 20 2d 20 24 73 74 61 6d 70 28 24 72 69  xt) - $stamp($ri
36b0: 64 29 7d 5d 0a 09 20 20 20 20 69 6e 63 72 20 6e  d)}]..    incr n
36c0: 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  ..}..return.    
36d0: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 46 69 6e 64  }..    proc Find
36e0: 42 65 73 74 42 72 65 61 6b 20 7b 72 61 6e 67 65  BestBreak {range
36f0: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 63 72 6f  } {..upvar 1 cro
3700: 73 73 20 63 72 6f 73 73 20 64 65 6c 74 61 20 64  ss cross delta d
3710: 65 6c 74 61 0a 0a 09 23 20 44 65 74 65 72 6d 69  elta...# Determi
3720: 6e 65 20 74 68 65 20 62 65 73 74 20 62 72 65 61  ne the best brea
3730: 6b 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  k location in th
3740: 65 20 67 69 76 65 6e 20 72 61 6e 67 65 20 6f 66  e given range of
3750: 0a 09 23 20 70 6f 73 69 74 69 6f 6e 73 2e 20 46  ..# positions. F
3760: 69 72 73 74 20 77 65 20 6c 6f 6f 6b 20 66 6f 72  irst we look for
3770: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 73 20 77   the locations w
3780: 69 74 68 20 74 68 65 20 6d 61 78 69 6d 61 6c 0a  ith the maximal.
3790: 09 23 20 6e 75 6d 62 65 72 20 6f 66 20 63 72 6f  .# number of cro
37a0: 73 73 69 6e 67 73 2e 20 49 66 20 74 68 65 72 65  ssings. If there
37b0: 20 61 72 65 20 73 65 76 65 72 61 6c 20 77 65 20   are several we 
37c0: 6c 6f 6f 6b 20 66 6f 72 20 74 68 65 0a 09 23 20  look for the..# 
37d0: 73 68 6f 72 74 65 73 74 20 74 69 6d 65 20 69 6e  shortest time in
37e0: 74 65 72 76 61 6c 20 61 6d 6f 6e 67 20 74 68 65  terval among the
37f0: 6d 2e 20 49 66 20 77 65 20 73 74 69 6c 6c 20 68  m. If we still h
3800: 61 76 65 20 6d 75 6c 74 69 70 6c 65 0a 09 23 20  ave multiple..# 
3810: 70 6f 73 73 69 62 69 6c 69 74 69 65 73 20 61 66  possibilities af
3820: 74 65 72 20 74 68 61 74 20 77 65 20 73 65 6c 65  ter that we sele
3830: 63 74 20 74 68 65 20 65 61 72 6c 69 65 73 74 20  ct the earliest 
3840: 6c 6f 63 61 74 69 6f 6e 0a 09 23 20 61 6d 6f 6e  location..# amon
3850: 67 20 74 68 65 73 65 2e 0a 0a 09 23 20 4e 6f 74  g these....# Not
3860: 65 3a 20 49 66 20 74 68 65 20 6d 61 78 69 6d 61  e: If the maxima
3870: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 72 6f 73  l number of cros
3880: 73 69 6e 67 73 20 69 73 20 30 20 74 68 65 6e 20  sings is 0 then 
3890: 74 68 65 20 72 61 6e 67 65 0a 09 23 20 20 20 20  the range..#    
38a0: 20 20 20 68 61 73 20 6e 6f 20 69 6e 74 65 72 6e     has no intern
38b0: 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2c  al dependencies,
38c0: 20 61 6e 64 20 6e 6f 20 62 72 65 61 6b 20 6c 6f   and no break lo
38d0: 63 61 74 69 6f 6e 20 61 74 0a 09 23 20 20 20 20  cation at..#    
38e0: 20 20 20 61 6c 6c 2e 20 54 68 69 73 20 70 6f 73     all. This pos
38f0: 73 69 62 69 6c 69 74 79 20 69 73 20 73 69 67 6e  sibility is sign
3900: 61 6c 65 64 20 76 69 61 20 72 65 73 75 6c 74 20  aled via result 
3910: 2d 31 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 41 20  -1....# Note: A 
3920: 72 61 6e 67 65 20 6f 66 20 6c 65 6e 67 74 68 20  range of length 
3930: 31 20 6f 72 20 6c 65 73 73 20 63 61 6e 6e 6f 74  1 or less cannot
3940: 20 68 61 76 65 20 69 6e 74 65 72 6e 61 6c 0a 09   have internal..
3950: 23 20 20 20 20 20 20 20 64 65 70 65 6e 64 65 6e  #       dependen
3960: 63 69 65 73 2c 20 61 73 20 74 68 61 74 20 6e 65  cies, as that ne
3970: 65 64 73 20 61 74 20 6c 65 61 73 74 20 74 77 6f  eds at least two
3980: 20 72 65 76 69 73 69 6f 6e 73 20 69 6e 0a 09 23   revisions in..#
3990: 20 20 20 20 20 20 20 74 68 65 20 72 61 6e 67 65         the range
39a0: 2e 0a 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68  ....if {[llength
39b0: 20 24 72 61 6e 67 65 5d 20 3c 20 32 7d 20 7b 20   $range] < 2} { 
39c0: 72 65 74 75 72 6e 20 2d 31 20 7d 0a 0a 09 73 65  return -1 }...se
39d0: 74 20 6d 61 78 20 2d 31 0a 09 73 65 74 20 62 65  t max -1..set be
39e0: 73 74 20 7b 7d 0a 0a 09 66 6f 72 65 61 63 68 20  st {}...foreach 
39f0: 6c 6f 63 61 74 69 6f 6e 20 24 72 61 6e 67 65 20  location $range 
3a00: 7b 0a 09 20 20 20 20 73 65 74 20 63 72 6f 73 73  {..    set cross
3a10: 69 6e 67 73 20 24 63 72 6f 73 73 28 24 6c 6f 63  ings $cross($loc
3a20: 61 74 69 6f 6e 29 0a 09 20 20 20 20 69 66 20 7b  ation)..    if {
3a30: 24 63 72 6f 73 73 69 6e 67 73 20 3e 20 24 6d 61  $crossings > $ma
3a40: 78 7d 20 7b 0a 09 09 73 65 74 20 6d 61 78 20 20  x} {...set max  
3a50: 24 63 72 6f 73 73 69 6e 67 73 0a 09 09 73 65 74  $crossings...set
3a60: 20 62 65 73 74 20 5b 6c 69 73 74 20 24 6c 6f 63   best [list $loc
3a70: 61 74 69 6f 6e 5d 0a 09 09 63 6f 6e 74 69 6e 75  ation]...continu
3a80: 65 0a 09 20 20 20 20 7d 20 65 6c 73 65 69 66 20  e..    } elseif 
3a90: 7b 24 63 72 6f 73 73 69 6e 67 73 20 3d 3d 20 24  {$crossings == $
3aa0: 6d 61 78 7d 20 7b 0a 09 09 6c 61 70 70 65 6e 64  max} {...lappend
3ab0: 20 62 65 73 74 20 24 6c 6f 63 61 74 69 6f 6e 0a   best $location.
3ac0: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b  .    }..}...if {
3ad0: 24 6d 61 78 20 3d 3d 20 30 7d 20 20 20 20 20 20  $max == 0}      
3ae0: 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20 2d        { return -
3af0: 31 20 7d 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74  1 }..if {[llengt
3b00: 68 20 24 62 65 73 74 5d 20 3d 3d 20 31 7d 20 7b  h $best] == 1} {
3b10: 20 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20   return [lindex 
3b20: 24 62 65 73 74 20 30 5d 20 7d 0a 0a 09 73 65 74  $best 0] }...set
3b30: 20 6c 6f 63 61 74 69 6f 6e 73 20 24 62 65 73 74   locations $best
3b40: 0a 09 73 65 74 20 62 65 73 74 20 7b 7d 0a 09 73  ..set best {}..s
3b50: 65 74 20 6d 69 6e 20 2d 31 0a 0a 09 66 6f 72 65  et min -1...fore
3b60: 61 63 68 20 6c 6f 63 61 74 69 6f 6e 20 24 6c 6f  ach location $lo
3b70: 63 61 74 69 6f 6e 73 20 7b 0a 09 20 20 20 20 73  cations {..    s
3b80: 65 74 20 69 6e 74 65 72 76 61 6c 20 24 64 65 6c  et interval $del
3b90: 74 61 28 24 6c 6f 63 61 74 69 6f 6e 29 0a 09 20  ta($location).. 
3ba0: 20 20 20 69 66 20 7b 28 24 6d 69 6e 20 3c 20 30     if {($min < 0
3bb0: 29 20 7c 7c 20 28 24 69 6e 74 65 72 76 61 6c 20  ) || ($interval 
3bc0: 3c 20 24 6d 69 6e 29 7d 20 7b 0a 09 09 73 65 74  < $min)} {...set
3bd0: 20 6d 69 6e 20 20 24 69 6e 74 65 72 76 61 6c 0a   min  $interval.
3be0: 09 09 73 65 74 20 62 65 73 74 20 5b 6c 69 73 74  ..set best [list
3bf0: 20 24 6c 6f 63 61 74 69 6f 6e 5d 0a 09 20 20 20   $location]..   
3c00: 20 7d 20 65 6c 73 65 69 66 20 7b 24 69 6e 74 65   } elseif {$inte
3c10: 72 76 61 6c 20 3d 3d 20 24 6d 69 6e 7d 20 7b 0a  rval == $min} {.
3c20: 09 09 6c 61 70 70 65 6e 64 20 62 65 73 74 20 24  ..lappend best $
3c30: 6c 6f 63 61 74 69 6f 6e 0a 09 20 20 20 20 7d 0a  location..    }.
3c40: 09 7d 0a 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74  .}...if {[llengt
3c50: 68 20 24 62 65 73 74 5d 20 3d 3d 20 31 7d 20 7b  h $best] == 1} {
3c60: 20 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20   return [lindex 
3c70: 24 62 65 73 74 20 30 5d 20 7d 0a 0a 09 72 65 74  $best 0] }...ret
3c80: 75 72 6e 20 5b 6c 69 6e 64 65 78 20 5b 6c 73 6f  urn [lindex [lso
3c90: 72 74 20 2d 69 6e 74 65 67 65 72 20 2d 69 6e 63  rt -integer -inc
3ca0: 72 65 61 73 69 6e 67 20 24 62 65 73 74 5d 20 30  reasing $best] 0
3cb0: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f  ].    }..    pro
3cc0: 63 20 43 75 74 41 74 20 7b 6c 6f 63 61 74 69 6f  c CutAt {locatio
3cd0: 6e 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 63 72  n} {..upvar 1 cr
3ce0: 6f 73 73 20 63 72 6f 73 73 20 64 65 70 63 20 64  oss cross depc d
3cf0: 65 70 63 0a 0a 09 23 20 49 74 20 77 61 73 20 64  epc...# It was d
3d00: 65 63 69 64 65 64 20 74 6f 20 73 70 6c 69 74 20  ecided to split 
3d10: 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 61 74  the changeset at
3d20: 20 74 68 65 20 67 69 76 65 6e 0a 09 23 20 6c 6f   the given..# lo
3d30: 63 61 74 69 6f 6e 2e 20 54 68 69 73 20 63 75 74  cation. This cut
3d40: 73 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 64 65  s a number of de
3d50: 70 65 6e 64 65 6e 63 69 65 73 2e 20 48 65 72 65  pendencies. Here
3d60: 20 77 65 20 75 70 64 61 74 65 0a 09 23 20 74 68   we update..# th
3d70: 65 20 63 72 6f 73 73 20 69 6e 66 6f 72 6d 61 74  e cross informat
3d80: 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20  ion so that the 
3d90: 62 72 65 61 6b 20 66 69 6e 64 65 72 20 68 61 73  break finder has
3da0: 20 61 63 63 75 72 61 74 65 0a 09 23 20 64 61 74   accurate..# dat
3db0: 61 20 77 68 65 6e 20 77 65 20 6c 6f 6f 6b 20 61  a when we look a
3dc0: 74 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  t the generated 
3dd0: 66 72 61 67 6d 65 6e 74 73 2e 0a 0a 09 73 65 74  fragments....set
3de0: 20 73 69 78 20 5b 6c 6f 67 20 76 69 73 69 62 6c   six [log visibl
3df0: 65 3f 20 36 5d 0a 0a 09 66 6f 72 65 61 63 68 20  e? 6]...foreach 
3e00: 7b 64 65 70 20 72 61 6e 67 65 7d 20 5b 61 72 72  {dep range} [arr
3e10: 61 79 20 67 65 74 20 64 65 70 63 5d 20 7b 0a 09  ay get depc] {..
3e20: 20 20 20 20 23 20 43 68 65 63 6b 20 61 6c 6c 20      # Check all 
3e30: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 73 74 69  dependencies sti
3e40: 6c 6c 20 6b 6e 6f 77 6e 2c 20 74 61 6b 65 20 74  ll known, take t
3e50: 68 65 69 72 20 72 61 6e 67 65 20 61 6e 64 0a 09  heir range and..
3e60: 20 20 20 20 23 20 73 65 65 20 69 66 20 74 68 65      # see if the
3e70: 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20   break location 
3e80: 66 61 6c 6c 73 20 77 69 74 68 69 6e 2e 0a 0a 09  falls within....
3e90: 20 20 20 20 42 6f 72 64 65 72 20 24 72 61 6e 67      Border $rang
3ea0: 65 20 73 20 65 0a 09 20 20 20 20 69 66 20 7b 24  e s e..    if {$
3eb0: 6c 6f 63 61 74 69 6f 6e 20 3c 20 24 73 7d 20 63  location < $s} c
3ec0: 6f 6e 74 69 6e 75 65 20 3b 20 23 20 62 72 65 61  ontinue ; # brea
3ed0: 6b 20 62 65 66 6f 72 65 20 72 61 6e 67 65 2c 20  k before range, 
3ee0: 69 67 6e 6f 72 65 0a 09 20 20 20 20 69 66 20 7b  ignore..    if {
3ef0: 24 6c 6f 63 61 74 69 6f 6e 20 3e 20 24 65 7d 20  $location > $e} 
3f00: 63 6f 6e 74 69 6e 75 65 20 3b 20 23 20 62 72 65  continue ; # bre
3f10: 61 6b 20 61 66 74 65 72 20 72 61 6e 67 65 2c 20  ak after range, 
3f20: 69 67 6e 6f 72 65 2e 0a 0a 09 20 20 20 20 23 20  ignore....    # 
3f30: 54 68 69 73 20 64 65 70 65 6e 64 65 6e 63 79 20  This dependency 
3f40: 63 72 6f 73 73 65 73 20 74 68 65 20 62 72 65 61  crosses the brea
3f50: 6b 20 6c 6f 63 61 74 69 6f 6e 2e 20 57 65 20 72  k location. We r
3f60: 65 6d 6f 76 65 20 69 74 0a 09 20 20 20 20 23 20  emove it..    # 
3f70: 66 72 6f 6d 20 74 68 65 20 63 72 6f 73 73 69 6e  from the crossin
3f80: 67 73 20 63 6f 75 6e 74 65 72 73 2c 20 61 6e 64  gs counters, and
3f90: 20 74 68 65 6e 20 61 6c 73 6f 20 66 72 6f 6d 20   then also from 
3fa0: 74 68 65 20 73 65 74 0a 09 20 20 20 20 23 20 6f  the set..    # o
3fb0: 66 20 6b 6e 6f 77 6e 20 64 65 70 65 6e 64 65 6e  f known dependen
3fc0: 63 69 65 73 2c 20 61 73 20 77 65 20 61 72 65 20  cies, as we are 
3fd0: 64 6f 6e 65 20 77 69 74 68 20 69 74 2e 0a 0a 09  done with it....
3fe0: 20 20 20 20 66 6f 72 65 61 63 68 20 6c 6f 63 20      foreach loc 
3ff0: 24 64 65 70 63 28 24 64 65 70 29 20 7b 20 69 6e  $depc($dep) { in
4000: 63 72 20 63 72 6f 73 73 28 24 6c 6f 63 29 20 2d  cr cross($loc) -
4010: 31 20 7d 0a 09 20 20 20 20 75 6e 73 65 74 20 64  1 }..    unset d
4020: 65 70 63 28 24 64 65 70 29 0a 0a 09 20 20 20 20  epc($dep)...    
4030: 69 66 20 7b 21 24 73 69 78 7d 20 63 6f 6e 74 69  if {!$six} conti
4040: 6e 75 65 0a 0a 09 20 20 20 20 73 74 72 75 63 74  nue...    struct
4050: 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 24 64  ::list assign $d
4060: 65 70 20 70 61 72 65 6e 74 20 63 68 69 6c 64 0a  ep parent child.
4070: 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 36  .    log write 6
4080: 20 63 73 65 74 73 20 22 42 72 6f 6b 65 20 64 65   csets "Broke de
4090: 70 65 6e 64 65 6e 63 79 20 5b 50 44 20 24 70 61  pendency [PD $pa
40a0: 72 65 6e 74 5d 20 2d 2d 3e 20 5b 50 44 20 24 63  rent] --> [PD $c
40b0: 68 69 6c 64 5d 22 0a 09 7d 0a 0a 09 72 65 74 75  hild]"..}...retu
40c0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  rn.    }..    # 
40d0: 50 72 69 6e 74 20 69 64 65 6e 74 69 66 79 69 6e  Print identifyin
40e0: 67 20 64 61 74 61 20 66 6f 72 20 61 20 72 65 76  g data for a rev
40f0: 69 73 69 6f 6e 20 28 70 72 6f 6a 65 63 74 2c 20  ision (project, 
4100: 66 69 6c 65 2c 20 64 6f 74 74 65 64 20 72 65 76  file, dotted rev
4110: 0a 20 20 20 20 23 20 6e 75 6d 62 65 72 29 2c 20  .    # number), 
4120: 66 6f 72 20 68 69 67 68 20 76 65 72 62 6f 73 69  for high verbosi
4130: 74 79 20 6c 6f 67 20 6f 75 74 70 75 74 2e 0a 0a  ty log output...
4140: 20 20 20 20 70 72 6f 63 20 50 44 20 7b 69 64 7d      proc PD {id}
4150: 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b 70 20 66   {..foreach {p f
4160: 20 72 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 7b   r} [state run {
4170: 0a 09 09 53 45 4c 45 43 54 20 50 2e 6e 61 6d 65  ...SELECT P.name
4180: 20 2c 20 46 2e 6e 61 6d 65 2c 20 52 2e 72 65 76   , F.name, R.rev
4190: 0a 09 09 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e  ...FROM revision
41a0: 20 52 2c 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a   R, file F, proj
41b0: 65 63 74 20 50 0a 09 09 57 48 45 52 45 20 52 2e  ect P...WHERE R.
41c0: 72 69 64 20 3d 20 24 69 64 0a 09 09 41 4e 44 20  rid = $id...AND 
41d0: 20 20 52 2e 66 69 64 20 3d 20 46 2e 66 69 64 0a    R.fid = F.fid.
41e0: 09 09 41 4e 44 20 20 20 46 2e 70 69 64 20 3d 20  ..AND   F.pid = 
41f0: 50 2e 70 69 64 0a 09 7d 5d 20 62 72 65 61 6b 0a  P.pid..}] break.
4200: 09 72 65 74 75 72 6e 20 22 27 24 70 20 3a 20 24  .return "'$p : $
4210: 66 2f 24 72 27 22 0a 20 20 20 20 7d 0a 0a 20 20  f/$r'".    }..  
4220: 20 20 23 20 50 72 69 6e 74 69 6e 67 20 6f 6e 65    # Printing one
4230: 20 6f 72 20 6d 6f 72 65 20 72 61 6e 67 65 73 2c   or more ranges,
4240: 20 66 6f 72 6d 61 74 74 65 64 2c 20 61 6e 64 20   formatted, and 
4250: 6f 6e 6c 79 20 74 68 65 69 72 20 62 6f 72 64 65  only their borde
4260: 72 20 74 6f 0a 20 20 20 20 23 20 6b 65 65 70 20  r to.    # keep 
4270: 74 68 65 20 73 74 72 69 6e 67 73 20 73 68 6f 72  the strings shor
4280: 74 2e 0a 0a 20 20 20 20 70 72 6f 63 20 50 52 73  t...    proc PRs
4290: 20 7b 72 61 6e 67 65 73 7d 20 7b 0a 09 72 65 74   {ranges} {..ret
42a0: 75 72 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73  urn [struct::lis
42b0: 74 20 6d 61 70 20 24 72 61 6e 67 65 73 20 5b 6d  t map $ranges [m
42c0: 79 70 72 6f 63 20 50 52 5d 5d 0a 20 20 20 20 7d  yproc PR]].    }
42d0: 0a 0a 20 20 20 20 70 72 6f 63 20 50 52 20 7b 72  ..    proc PR {r
42e0: 61 6e 67 65 7d 20 7b 0a 09 42 6f 72 64 65 72 20  ange} {..Border 
42f0: 24 72 61 6e 67 65 20 73 20 65 0a 09 72 65 74 75  $range s e..retu
4300: 72 6e 20 3c 24 7b 73 7d 2e 2e 2e 24 7b 65 7d 3e  rn <${s}...${e}>
4310: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63  .    }..    proc
4320: 20 42 6f 72 64 65 72 20 7b 72 61 6e 67 65 20 73   Border {range s
4330: 76 20 65 76 7d 20 7b 0a 09 75 70 76 61 72 20 31  v ev} {..upvar 1
4340: 20 24 73 76 20 73 20 24 65 76 20 65 0a 09 73 65   $sv s $ev e..se
4350: 74 20 73 20 5b 6c 69 6e 64 65 78 20 24 72 61 6e  t s [lindex $ran
4360: 67 65 20 30 5d 0a 09 73 65 74 20 65 20 5b 6c 69  ge 0]..set e [li
4370: 6e 64 65 78 20 24 72 61 6e 67 65 20 65 6e 64 5d  ndex $range end]
4380: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
4390: 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23      # # ## ### #
43a0: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23  #### ######## ##
43b0: 23 23 23 23 23 23 23 23 23 23 23 0a 0a 20 20 20  ###########..   
43c0: 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79   typevariable my
43d0: 63 68 61 6e 67 65 73 65 74 73 20 20 20 20 7b 7d  changesets    {}
43e0: 20 3b 20 23 20 4c 69 73 74 20 6f 66 20 61 6c 6c   ; # List of all
43f0: 20 6b 6e 6f 77 6e 20 63 68 61 6e 67 65 73 65 74   known changeset
4400: 73 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69 61  s..    typevaria
4410: 62 6c 65 20 6d 79 72 65 76 6d 61 70 20 2d 61 72  ble myrevmap -ar
4420: 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 66  ray {} ; # Map f
4430: 72 6f 6d 20 72 65 76 69 73 69 6f 6e 73 20 74 6f  rom revisions to
4440: 20 74 68 65 69 72 20 63 68 61 6e 67 65 73 65 74   their changeset
4450: 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62  ..    typevariab
4460: 6c 65 20 6d 79 69 64 6d 61 70 20 20 2d 61 72 72  le myidmap  -arr
4470: 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 66 72  ay {} ; # Map fr
4480: 6f 6d 20 63 68 61 6e 67 65 73 65 74 20 69 64 20  om changeset id 
4490: 74 6f 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 20  to changeset... 
44a0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 61 6c     typemethod al
44b0: 6c 20 7b 7d 20 20 20 7b 20 72 65 74 75 72 6e 20  l {}   { return 
44c0: 24 6d 79 63 68 61 6e 67 65 73 65 74 73 20 7d 0a  $mychangesets }.
44d0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6f      typemethod o
44e0: 66 20 20 7b 69 64 7d 20 7b 20 72 65 74 75 72 6e  f  {id} { return
44f0: 20 24 6d 79 69 64 6d 61 70 28 24 69 64 29 20 7d   $myidmap($id) }
4500: 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23  ..    # # ## ###
4510: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20   ##### ######## 
4520: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 20  #############.  
4530: 20 20 23 23 20 43 6f 6e 66 69 67 75 72 61 74 69    ## Configurati
4540: 6f 6e 0a 0a 20 20 20 20 70 72 61 67 6d 61 20 2d  on..    pragma -
4550: 68 61 73 74 79 70 65 69 6e 66 6f 20 20 20 20 6e  hastypeinfo    n
4560: 6f 20 20 3b 20 23 20 6e 6f 20 74 79 70 65 20 69  o  ; # no type i
4570: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20 20 20  ntrospection.   
4580: 20 70 72 61 67 6d 61 20 2d 68 61 73 69 6e 66 6f   pragma -hasinfo
4590: 20 20 20 20 20 20 20 20 6e 6f 20 20 3b 20 23 20          no  ; # 
45a0: 6e 6f 20 6f 62 6a 65 63 74 20 69 6e 74 72 6f 73  no object intros
45b0: 70 65 63 74 69 6f 6e 0a 20 20 20 20 70 72 61 67  pection.    prag
45c0: 6d 61 20 2d 73 69 6d 70 6c 65 64 69 73 70 61 74  ma -simpledispat
45d0: 63 68 20 79 65 73 20 3b 20 23 20 73 69 6d 70 6c  ch yes ; # simpl
45e0: 65 20 66 61 73 74 20 64 69 73 70 61 74 63 68 0a  e fast dispatch.
45f0: 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20  .    # # ## ### 
4600: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23  ##### ######## #
4610: 23 23 23 23 23 23 23 23 23 23 23 23 0a 7d 0a 0a  ############.}..
4620: 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a  namespace eval :
4630: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70  :vc::fossil::imp
4640: 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63  ort::cvs::projec
4650: 74 20 7b 0a 20 20 20 20 6e 61 6d 65 73 70 61 63  t {.    namespac
4660: 65 20 65 78 70 6f 72 74 20 72 65 76 0a 20 20 20  e export rev.   
4670: 20 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20   namespace eval 
4680: 72 65 76 20 7b 0a 09 6e 61 6d 65 73 70 61 63 65  rev {..namespace
4690: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f   import ::vc::fo
46a0: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
46b0: 73 3a 3a 73 74 61 74 65 0a 09 6e 61 6d 65 73 70  s::state..namesp
46c0: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a  ace import ::vc:
46d0: 3a 74 6f 6f 6c 73 3a 3a 6d 69 73 63 3a 3a 2a 0a  :tools::misc::*.
46e0: 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72  .namespace impor
46f0: 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 74  t ::vc::tools::t
4700: 72 6f 75 62 6c 65 0a 09 6e 61 6d 65 73 70 61 63  rouble..namespac
4710: 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74  e import ::vc::t
4720: 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 6c 6f 67 20 72  ools::log..log r
4730: 65 67 69 73 74 65 72 20 63 73 65 74 73 0a 20 20  egister csets.  
4740: 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23    }.}..# # ## ##
4750: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
4760: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23   ############# #
4770: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4780: 23 23 23 23 0a 23 23 20 52 65 61 64 79 0a 0a 70  ####.## Ready..p
4790: 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20 76  ackage provide v
47a0: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72  c::fossil::impor
47b0: 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a  t::cvs::project:
47c0: 3a 72 65 76 20 31 2e 30 0a 72 65 74 75 72 6e 0a  :rev 1.0.return.