Hex Artifact Content
Not logged in

Artifact 75f13681e5bab18fb4dd6b68172f1693532a42ad:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [4866889e88] - Continued work on pass 8, added outline for handling of retrograde branches, extended changesets with predicate allowing us to find the branch changesets. by aku on 2007-11-22 03:33:32.

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 73 65 74 20 6d 79 72 65 76 6d 61 70 28   { set myrevmap(
0790: 24 72 29 20 24 73 65 6c 66 20 7d 0a 09 72 65 74  $r) $self }..ret
07a0: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d  urn.    }..    m
07b0: 65 74 68 6f 64 20 69 64 20 20 20 20 20 20 20 20  ethod id        
07c0: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69  {} { return $myi
07d0: 64 20 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20 72  d }.    method r
07e0: 65 76 69 73 69 6f 6e 73 20 7b 7d 20 7b 20 72 65  evisions {} { re
07f0: 74 75 72 6e 20 24 6d 79 72 65 76 69 73 69 6f 6e  turn $myrevision
0800: 73 20 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20 64  s }.    method d
0810: 61 74 61 20 20 20 20 20 20 7b 7d 20 7b 20 72 65  ata      {} { re
0820: 74 75 72 6e 20 5b 6c 69 73 74 20 24 6d 79 70 72  turn [list $mypr
0830: 6f 6a 65 63 74 20 24 6d 79 74 79 70 65 20 24 6d  oject $mytype $m
0840: 79 73 72 63 69 64 5d 20 7d 0a 0a 20 20 20 20 6d  ysrcid] }..    m
0850: 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20  ethod bysymbol  
0860: 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 5b 65 78   {} { return [ex
0870: 70 72 20 7b 24 6d 79 74 79 70 65 20 65 71 20 22  pr {$mytype eq "
0880: 73 79 6d 22 7d 5d 20 7d 0a 20 20 20 20 6d 65 74  sym"}] }.    met
0890: 68 6f 64 20 62 79 72 65 76 69 73 69 6f 6e 20 7b  hod byrevision {
08a0: 7d 20 7b 20 72 65 74 75 72 6e 20 5b 65 78 70 72  } { return [expr
08b0: 20 7b 24 6d 79 74 79 70 65 20 65 71 20 22 72 65   {$mytype eq "re
08c0: 76 22 7d 5d 20 7d 0a 0a 20 20 20 20 6d 65 74 68  v"}] }..    meth
08d0: 6f 64 20 73 65 74 70 6f 73 20 7b 70 7d 20 7b 20  od setpos {p} { 
08e0: 73 65 74 20 6d 79 70 6f 73 20 24 70 20 3b 20 72  set mypos $p ; r
08f0: 65 74 75 72 6e 20 7d 0a 20 20 20 20 6d 65 74 68  eturn }.    meth
0900: 6f 64 20 70 6f 73 20 20 20 20 7b 7d 20 20 7b 20  od pos    {}  { 
0910: 72 65 74 75 72 6e 20 24 6d 79 70 6f 73 20 7d 0a  return $mypos }.
0920: 0a 20 20 20 20 6d 65 74 68 6f 64 20 69 73 62 72  .    method isbr
0930: 61 6e 63 68 20 7b 7d 20 7b 0a 09 72 65 74 75 72  anch {} {..retur
0940: 6e 20 5b 65 78 70 72 20 7b 28 24 6d 79 74 79 70  n [expr {($mytyp
0950: 65 20 65 71 20 22 73 79 6d 22 29 20 26 26 0a 09  e eq "sym") &&..
0960: 09 20 20 20 20 20 20 28 24 6d 79 62 72 61 6e 63  .      ($mybranc
0970: 68 63 6f 64 65 20 3d 3d 20 5b 73 74 61 74 65 20  hcode == [state 
0980: 6f 6e 65 20 7b 0a 09 09 09 20 20 53 45 4c 45 43  one {....  SELEC
0990: 54 20 74 79 70 65 20 46 52 4f 4d 20 73 79 6d 62  T type FROM symb
09a0: 6f 6c 20 57 48 45 52 45 20 73 69 64 20 3d 20 24  ol WHERE sid = $
09b0: 6d 79 73 72 63 69 64 0a 09 09 20 20 20 20 20 20  mysrcid...      
09c0: 7d 5d 29 7d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20  }])}].    }..   
09d0: 20 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f   method successo
09e0: 72 73 20 7b 7d 20 7b 0a 09 23 20 4e 4f 54 45 20  rs {} {..# NOTE 
09f0: 2f 20 46 55 54 55 52 45 3a 20 50 6f 73 73 69 62  / FUTURE: Possib
0a00: 6c 65 20 62 6f 74 74 6c 65 6e 65 63 6b 2e 0a 09  le bottleneck...
0a10: 73 65 74 20 63 73 65 74 73 20 7b 7d 0a 09 66 6f  set csets {}..fo
0a20: 72 65 61 63 68 20 7b 5f 20 63 68 69 6c 64 72 65  reach {_ childre
0a30: 6e 7d 20 5b 24 73 65 6c 66 20 6e 65 78 74 6d 61  n} [$self nextma
0a40: 70 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 63  p] {..    foreac
0a50: 68 20 63 68 69 6c 64 20 24 63 68 69 6c 64 72 65  h child $childre
0a60: 6e 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 63 73  n {...lappend cs
0a70: 65 74 73 20 24 6d 79 72 65 76 6d 61 70 28 24 63  ets $myrevmap($c
0a80: 68 69 6c 64 29 0a 09 20 20 20 20 7d 0a 09 7d 0a  hild)..    }..}.
0a90: 09 72 65 74 75 72 6e 20 5b 6c 73 6f 72 74 20 2d  .return [lsort -
0aa0: 75 6e 69 71 75 65 20 24 63 73 65 74 73 5d 0a 20  unique $csets]. 
0ab0: 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 76 69     }..    # revi
0ac0: 73 69 6f 6e 20 2d 3e 20 6c 69 73 74 20 28 72 65  sion -> list (re
0ad0: 76 69 73 69 6f 6e 29 0a 20 20 20 20 6d 65 74 68  vision).    meth
0ae0: 6f 64 20 6e 65 78 74 6d 61 70 20 7b 7d 20 7b 0a  od nextmap {} {.
0af0: 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6d  .if {[llength $m
0b00: 79 6e 65 78 74 6d 61 70 5d 7d 20 7b 20 72 65 74  ynextmap]} { ret
0b10: 75 72 6e 20 24 6d 79 6e 65 78 74 6d 61 70 20 7d  urn $mynextmap }
0b20: 0a 09 50 75 6c 6c 53 75 63 63 65 73 73 6f 72 52  ..PullSuccessorR
0b30: 65 76 69 73 69 6f 6e 73 20 74 6d 70 20 24 6d 79  evisions tmp $my
0b40: 72 65 76 69 73 69 6f 6e 73 0a 09 73 65 74 20 6d  revisions..set m
0b50: 79 6e 65 78 74 6d 61 70 20 5b 61 72 72 61 79 20  ynextmap [array 
0b60: 67 65 74 20 74 6d 70 5d 0a 09 72 65 74 75 72 6e  get tmp]..return
0b70: 20 24 6d 79 6e 65 78 74 6d 61 70 0a 20 20 20 20   $mynextmap.    
0b80: 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 62 72  }..    method br
0b90: 65 61 6b 69 6e 74 65 72 6e 61 6c 64 65 70 65 6e  eakinternaldepen
0ba0: 64 65 6e 63 69 65 73 20 7b 7d 20 7b 0a 09 23 20  dencies {} {..# 
0bb0: 54 68 69 73 20 6d 65 74 68 6f 64 20 69 6e 73 70  This method insp
0bc0: 65 63 74 73 20 74 68 65 20 63 68 61 6e 67 65 73  ects the changes
0bd0: 65 74 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ets for internal
0be0: 0a 09 23 20 64 65 70 65 6e 64 65 6e 63 69 65 73  ..# dependencies
0bf0: 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 64 6f 6e  . Nothing is don
0c00: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  e if there are n
0c10: 6f 0a 09 23 20 73 75 63 68 2e 20 4f 74 68 65 72  o..# such. Other
0c20: 77 69 73 65 20 74 68 65 20 63 68 61 6e 67 65 73  wise the changes
0c30: 65 74 20 69 73 20 73 70 6c 69 74 20 69 6e 74 6f  et is split into
0c40: 20 61 20 73 65 74 20 6f 66 0a 09 23 20 66 72 61   a set of..# fra
0c50: 67 6d 65 6e 74 73 20 77 69 74 68 6f 75 74 20 69  gments without i
0c60: 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e  nternal dependen
0c70: 63 69 65 73 2c 20 74 72 61 6e 73 66 6f 72 6d 69  cies, transformi
0c80: 6e 67 20 74 68 65 0a 09 23 20 69 6e 74 65 72 6e  ng the..# intern
0c90: 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  al dependencies 
0ca0: 69 6e 74 6f 20 65 78 74 65 72 6e 61 6c 20 6f 6e  into external on
0cb0: 65 73 2e 20 54 68 65 20 6e 65 77 20 63 68 61 6e  es. The new chan
0cc0: 67 65 73 65 74 73 0a 09 23 20 61 72 65 20 61 64  gesets..# are ad
0cd0: 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73 74 20  ded to the list 
0ce0: 6f 66 20 61 6c 6c 20 63 68 61 6e 67 65 73 65 74  of all changeset
0cf0: 73 2e 0a 0a 09 23 20 57 65 20 70 65 72 66 6f 72  s....# We perfor
0d00: 6d 20 61 6c 6c 20 6e 65 63 65 73 73 61 72 79 20  m all necessary 
0d10: 73 70 6c 69 74 73 20 69 6e 20 6f 6e 65 20 67 6f  splits in one go
0d20: 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 6c  , instead of onl
0d30: 79 0a 09 23 20 6f 6e 65 2e 20 54 68 65 20 70 72  y..# one. The pr
0d40: 65 76 69 6f 75 73 20 61 6c 67 6f 72 69 74 68 6d  evious algorithm
0d50: 2c 20 61 64 61 70 74 65 64 20 66 72 6f 6d 20 63  , adapted from c
0d60: 76 73 32 73 76 6e 2c 20 63 6f 6d 70 75 74 65 64  vs2svn, computed
0d70: 0a 09 23 20 61 20 6c 6f 74 20 6f 66 20 73 74 61  ..# a lot of sta
0d80: 74 65 20 77 68 69 63 68 20 77 61 73 20 74 68 72  te which was thr
0d90: 6f 77 6e 20 61 77 61 79 20 61 6e 64 20 74 68 65  own away and the
0da0: 6e 20 63 6f 6d 70 75 74 65 64 20 61 67 61 69 6e  n computed again
0db0: 0a 09 23 20 66 6f 72 20 65 61 63 68 20 6f 66 20  ..# for each of 
0dc0: 74 68 65 20 66 72 61 67 6d 65 6e 74 73 2e 20 49  the fragments. I
0dd0: 74 20 73 68 6f 75 6c 64 20 62 65 20 65 61 73 69  t should be easi
0de0: 65 72 20 74 6f 20 75 70 64 61 74 65 20 61 6e 64  er to update and
0df0: 0a 09 23 20 72 65 75 73 65 20 74 68 61 74 20 73  ..# reuse that s
0e00: 74 61 74 65 2e 0a 0a 09 23 20 54 68 65 20 63 6f  tate....# The co
0e10: 64 65 20 63 68 65 63 6b 73 20 6f 6e 6c 79 20 73  de checks only s
0e20: 75 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e  ucessor dependen
0e30: 63 69 65 73 2c 20 61 73 20 74 68 69 73 0a 09 23  cies, as this..#
0e40: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
0e50: 6f 76 65 72 73 20 74 68 65 20 70 72 65 64 65 63  overs the predec
0e60: 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 69  essor dependenci
0e70: 65 73 20 61 73 20 77 65 6c 6c 20 28 41 0a 09 23  es as well (A..#
0e80: 20 73 75 63 63 65 73 73 6f 72 20 64 65 70 65 6e   successor depen
0e90: 64 65 6e 63 79 20 61 20 2d 3e 20 62 20 69 73 20  dency a -> b is 
0ea0: 61 6c 73 6f 20 61 20 70 72 65 64 65 63 65 73 73  also a predecess
0eb0: 6f 72 20 64 65 70 65 6e 64 65 6e 63 79 0a 09 23  or dependency..#
0ec0: 20 62 20 2d 3e 20 61 29 2e 0a 0a 09 23 20 41 72   b -> a)....# Ar
0ed0: 72 61 79 20 6f 66 20 64 65 70 65 6e 64 65 6e 63  ray of dependenc
0ee0: 69 65 73 20 28 70 61 72 65 6e 74 20 2d 3e 20 63  ies (parent -> c
0ef0: 68 69 6c 64 29 2e 20 54 68 69 73 20 69 73 20 70  hild). This is p
0f00: 75 6c 6c 65 64 20 66 72 6f 6d 0a 09 23 20 74 68  ulled from..# th
0f10: 65 20 73 74 61 74 65 2c 20 61 6e 64 20 6c 69 6d  e state, and lim
0f20: 69 74 65 64 20 74 6f 20 73 75 63 63 65 73 73 6f  ited to successo
0f30: 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 63 68  rs within the ch
0f40: 61 6e 67 65 73 65 74 2e 0a 0a 09 61 72 72 61 79  angeset....array
0f50: 20 73 65 74 20 64 65 70 65 6e 64 65 6e 63 69 65   set dependencie
0f60: 73 20 7b 7d 0a 09 50 75 6c 6c 49 6e 74 65 72 6e  s {}..PullIntern
0f70: 61 6c 53 75 63 63 65 73 73 6f 72 52 65 76 69 73  alSuccessorRevis
0f80: 69 6f 6e 73 20 64 65 70 65 6e 64 65 6e 63 69 65  ions dependencie
0f90: 73 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 0a 09  s $myrevisions..
0fa0: 69 66 20 7b 21 5b 61 72 72 61 79 20 73 69 7a 65  if {![array size
0fb0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 5d 7d 20   dependencies]} 
0fc0: 7b 72 65 74 75 72 6e 20 30 7d 20 3b 20 23 20 4e  {return 0} ; # N
0fd0: 6f 74 68 69 6e 67 20 74 6f 20 62 72 65 61 6b 2e  othing to break.
0fe0: 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 36 20 63  ...log write 6 c
0ff0: 73 65 74 73 20 2e 2e 2e 3c 24 6d 79 69 64 3e 2e  sets ...<$myid>.
1000: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1010: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1020: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1030: 2e 2e 2e 2e 2e 2e 0a 0a 09 23 20 57 65 20 68 61  .........# We ha
1040: 76 65 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65  ve internal depe
1050: 6e 64 65 6e 63 69 65 73 20 74 6f 20 62 72 65 61  ndencies to brea
1060: 6b 2e 20 57 65 20 6e 6f 77 20 69 74 65 72 61 74  k. We now iterat
1070: 65 20 6f 76 65 72 0a 09 23 20 61 6c 6c 20 70 6f  e over..# all po
1080: 73 69 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c  sitions in the l
1090: 69 73 74 20 28 77 68 69 63 68 20 69 73 20 63 68  ist (which is ch
10a0: 72 6f 6e 6f 6c 6f 67 69 63 61 6c 2c 20 61 74 20  ronological, at 
10b0: 6c 65 61 73 74 0a 09 23 20 61 73 20 66 61 72 20  least..# as far 
10c0: 61 73 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70  as the timestamp
10d0: 73 20 61 72 65 20 63 6f 72 72 65 63 74 20 61 6e  s are correct an
10e0: 64 20 75 6e 69 71 75 65 29 20 61 6e 64 0a 09 23  d unique) and..#
10f0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62   determine the b
1100: 65 73 74 20 70 6f 73 69 74 69 6f 6e 20 66 6f 72  est position for
1110: 20 74 68 65 20 62 72 65 61 6b 2c 20 62 79 20 74   the break, by t
1120: 72 79 69 6e 67 20 74 6f 0a 09 23 20 62 72 65 61  rying to..# brea
1130: 6b 20 61 73 20 6d 61 6e 79 20 64 65 70 65 6e 64  k as many depend
1140: 65 6e 63 69 65 73 20 61 73 20 70 6f 73 73 69 62  encies as possib
1150: 6c 65 20 69 6e 20 6f 6e 65 20 67 6f 2e 20 57 68  le in one go. Wh
1160: 65 6e 20 61 0a 09 23 20 62 72 65 61 6b 20 77 61  en a..# break wa
1170: 73 20 66 6f 75 6e 64 20 74 68 69 73 20 69 73 20  s found this is 
1180: 72 65 64 6f 6e 65 20 66 6f 72 20 74 68 65 20 66  redone for the f
1190: 72 61 67 6d 65 6e 74 73 20 63 6f 6d 69 6e 67 20  ragments coming 
11a0: 61 6e 64 0a 09 23 20 61 66 74 65 72 2c 20 61 66  and..# after, af
11b0: 74 65 72 20 75 70 64 69 6e 67 20 74 68 65 20 63  ter upding the c
11c0: 72 6f 73 73 69 6e 67 20 69 6e 66 6f 72 6d 61 74  rossing informat
11d0: 69 6f 6e 2e 0a 0a 09 23 20 44 61 74 61 20 73 74  ion....# Data st
11e0: 72 75 63 74 75 72 65 73 3a 0a 09 23 20 4d 61 70  ructures:..# Map
11f0: 3a 20 20 50 4f 53 20 20 20 72 65 76 69 73 69 6f  :  POS   revisio
1200: 6e 20 69 64 20 20 20 20 20 20 2d 3e 20 70 6f 73  n id      -> pos
1210: 69 74 69 6f 6e 20 69 6e 20 6c 69 73 74 2e 0a 09  ition in list...
1220: 23 20 20 20 20 20 20 20 43 52 4f 53 53 20 70 6f  #       CROSS po
1230: 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73 74 20 2d  sition in list -
1240: 3e 20 6e 75 6d 62 65 72 20 6f 66 20 64 65 70 65  > number of depe
1250: 6e 64 65 6e 63 69 65 73 20 63 72 6f 73 73 69 6e  ndencies crossin
1260: 67 20 69 74 0a 09 23 20 20 20 20 20 20 20 44 45  g it..#       DE
1270: 50 43 20 20 64 65 70 65 6e 64 65 6e 63 79 20 20  PC  dependency  
1280: 20 20 20 20 20 2d 3e 20 70 6f 73 69 74 69 6f 6e       -> position
1290: 73 20 69 74 20 63 72 6f 73 73 65 73 0a 09 23 20  s it crosses..# 
12a0: 4c 69 73 74 3a 20 52 41 4e 47 45 20 4f 66 20 74  List: RANGE Of t
12b0: 68 65 20 70 6f 73 69 74 69 6f 6e 73 20 69 74 73  he positions its
12c0: 65 6c 66 2e 0a 09 23 20 41 20 64 65 70 65 6e 64  elf...# A depend
12d0: 65 6e 63 79 20 69 73 20 61 20 73 69 6e 67 6c 65  ency is a single
12e0: 2d 65 6c 65 6d 65 6e 74 20 6d 61 70 20 70 61 72  -element map par
12f0: 65 6e 74 20 2d 3e 20 63 68 69 6c 64 0a 0a 09 49  ent -> child...I
1300: 6e 69 74 69 61 6c 69 7a 65 42 72 65 61 6b 53 74  nitializeBreakSt
1310: 61 74 65 20 24 6d 79 72 65 76 69 73 69 6f 6e 73  ate $myrevisions
1320: 0a 0a 09 73 65 74 20 66 72 61 67 6d 65 6e 74 73  ...set fragments
1330: 20 7b 7d 0a 09 73 65 74 20 70 65 6e 64 69 6e 67   {}..set pending
1340: 20 20 20 5b 6c 69 73 74 20 24 72 61 6e 67 65 5d     [list $range]
1350: 0a 09 73 65 74 20 61 74 20 20 20 20 20 20 20 20  ..set at        
1360: 30 0a 09 61 72 72 61 79 20 73 65 74 20 62 72 65  0..array set bre
1370: 61 6b 73 20 7b 7d 0a 0a 09 77 68 69 6c 65 20 7b  aks {}...while {
1380: 24 61 74 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24  $at < [llength $
1390: 70 65 6e 64 69 6e 67 5d 7d 20 7b 0a 09 20 20 20  pending]} {..   
13a0: 20 73 65 74 20 63 75 72 72 65 6e 74 20 5b 6c 69   set current [li
13b0: 6e 64 65 78 20 24 70 65 6e 64 69 6e 67 20 24 61  ndex $pending $a
13c0: 74 5d 0a 0a 09 20 20 20 20 6c 6f 67 20 77 72 69  t]...    log wri
13d0: 74 65 20 36 20 63 73 65 74 73 20 22 2e 20 2e 20  te 6 csets ". . 
13e0: 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e 2e  .. ... ..... ...
13f0: 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ..... ..........
1400: 2e 2e 2e 22 0a 09 20 20 20 20 6c 6f 67 20 77 72  ..."..    log wr
1410: 69 74 65 20 36 20 63 73 65 74 73 20 22 53 63 68  ite 6 csets "Sch
1420: 65 64 75 6c 65 64 20 20 20 5b 6a 6f 69 6e 20 5b  eduled   [join [
1430: 50 52 73 20 5b 6c 72 61 6e 67 65 20 24 70 65 6e  PRs [lrange $pen
1440: 64 69 6e 67 20 24 61 74 20 65 6e 64 5d 5d 20 7b  ding $at end]] {
1450: 20 7d 5d 22 0a 09 20 20 20 20 6c 6f 67 20 77 72   }]"..    log wr
1460: 69 74 65 20 36 20 63 73 65 74 73 20 22 43 6f 6e  ite 6 csets "Con
1470: 73 69 64 65 72 69 6e 67 20 5b 50 52 20 24 63 75  sidering [PR $cu
1480: 72 72 65 6e 74 5d 20 5c 5b 24 61 74 2f 5b 6c 6c  rrent] \[$at/[ll
1490: 65 6e 67 74 68 20 24 70 65 6e 64 69 6e 67 5d 5c  ength $pending]\
14a0: 5d 22 0a 0a 09 20 20 20 20 73 65 74 20 62 65 73  ]"...    set bes
14b0: 74 20 5b 46 69 6e 64 42 65 73 74 42 72 65 61 6b  t [FindBestBreak
14c0: 20 24 63 75 72 72 65 6e 74 5d 0a 0a 09 20 20 20   $current]...   
14d0: 20 69 66 20 7b 24 62 65 73 74 20 3c 20 30 7d 20   if {$best < 0} 
14e0: 7b 0a 09 09 23 20 54 68 65 20 69 6e 73 70 65 63  {...# The inspec
14f0: 74 65 64 20 72 61 6e 67 65 20 68 61 73 20 6e 6f  ted range has no
1500: 20 69 6e 74 65 72 6e 61 6c 0a 09 09 23 20 64 65   internal...# de
1510: 70 65 6e 64 65 6e 63 69 65 73 2e 20 54 68 69 73  pendencies. This
1520: 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 66   is a complete f
1530: 72 61 67 6d 65 6e 74 2e 0a 09 09 6c 61 70 70 65  ragment....lappe
1540: 6e 64 20 66 72 61 67 6d 65 6e 74 73 20 24 63 75  nd fragments $cu
1550: 72 72 65 6e 74 0a 0a 09 09 6c 6f 67 20 77 72 69  rrent....log wri
1560: 74 65 20 36 20 63 73 65 74 73 20 22 4e 6f 20 62  te 6 csets "No b
1570: 72 65 61 6b 73 2c 20 66 69 6e 61 6c 22 0a 09 20  reaks, final".. 
1580: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 23 20     } else {...# 
1590: 53 70 6c 69 74 20 74 68 65 20 72 61 6e 67 65 20  Split the range 
15a0: 61 6e 64 20 73 63 68 65 64 75 6c 65 20 74 68 65  and schedule the
15b0: 20 72 65 73 75 6c 74 69 6e 67 20 66 72 61 67 6d   resulting fragm
15c0: 65 6e 74 73 0a 09 09 23 20 66 6f 72 20 66 75 72  ents...# for fur
15d0: 74 68 65 72 20 69 6e 73 70 65 63 74 69 6f 6e 2e  ther inspection.
15e0: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 6e 75   Remember the nu
15f0: 6d 62 65 72 20 6f 66 0a 09 09 23 20 64 65 70 65  mber of...# depe
1600: 6e 64 65 6e 63 69 65 73 20 63 75 74 20 62 65 66  ndencies cut bef
1610: 6f 72 65 20 77 65 20 72 65 6d 6f 76 65 20 74 68  ore we remove th
1620: 65 6d 20 66 72 6f 6d 0a 09 09 23 20 63 6f 6e 73  em from...# cons
1630: 69 64 65 72 61 74 69 6f 6e 2c 20 66 6f 72 20 64  ideration, for d
1640: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 6c 61 74  ocumentation lat
1650: 65 72 2e 0a 0a 09 09 73 65 74 20 62 72 65 61 6b  er.....set break
1660: 73 28 24 62 65 73 74 29 20 24 63 72 6f 73 73 28  s($best) $cross(
1670: 24 62 65 73 74 29 0a 0a 09 09 6c 6f 67 20 77 72  $best)....log wr
1680: 69 74 65 20 36 20 63 73 65 74 73 20 22 42 65 73  ite 6 csets "Bes
1690: 74 20 62 72 65 61 6b 20 40 20 24 62 65 73 74 2c  t break @ $best,
16a0: 20 63 75 74 74 69 6e 67 20 5b 6e 73 70 20 24 63   cutting [nsp $c
16b0: 72 6f 73 73 28 24 62 65 73 74 29 20 64 65 70 65  ross($best) depe
16c0: 6e 64 65 6e 63 79 20 64 65 70 65 6e 64 65 6e 63  ndency dependenc
16d0: 69 65 73 5d 22 0a 0a 09 09 23 20 4e 6f 74 65 3a  ies]"....# Note:
16e0: 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 62 65   The value of be
16f0: 73 74 20 69 73 20 61 6e 20 61 62 6f 6c 75 74 65  st is an abolute
1700: 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 0a 09 09 23   location in...#
1710: 20 6d 79 72 65 76 69 73 69 6f 6e 73 2e 20 55 73   myrevisions. Us
1720: 65 20 74 68 65 20 73 74 61 72 74 20 6f 66 20 63  e the start of c
1730: 75 72 72 65 6e 74 20 74 6f 20 6d 61 6b 65 20 69  urrent to make i
1740: 74 20 61 6e 0a 09 09 23 20 69 6e 64 65 78 20 61  t an...# index a
1750: 62 73 6f 6c 75 74 65 20 74 6f 20 63 75 72 72 65  bsolute to curre
1760: 6e 74 2e 0a 0a 09 09 73 65 74 20 62 72 65 6c 20  nt.....set brel 
1770: 5b 65 78 70 72 20 7b 24 62 65 73 74 20 2d 20 5b  [expr {$best - [
1780: 6c 69 6e 64 65 78 20 24 63 75 72 72 65 6e 74 20  lindex $current 
1790: 30 5d 7d 5d 0a 09 09 73 65 74 20 62 6e 65 78 74  0]}]...set bnext
17a0: 20 24 62 72 65 6c 20 3b 20 69 6e 63 72 20 62 6e   $brel ; incr bn
17b0: 65 78 74 0a 09 09 73 65 74 20 66 72 61 67 62 65  ext...set fragbe
17c0: 66 6f 72 65 20 5b 6c 72 61 6e 67 65 20 24 63 75  fore [lrange $cu
17d0: 72 72 65 6e 74 20 30 20 24 62 72 65 6c 5d 0a 09  rrent 0 $brel]..
17e0: 09 73 65 74 20 66 72 61 67 61 66 74 65 72 20 20  .set fragafter  
17f0: 5b 6c 72 61 6e 67 65 20 24 63 75 72 72 65 6e 74  [lrange $current
1800: 20 24 62 6e 65 78 74 20 65 6e 64 5d 0a 0a 09 09   $bnext end]....
1810: 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74  log write 6 cset
1820: 73 20 22 4e 65 77 20 70 69 65 63 65 73 20 20 5b  s "New pieces  [
1830: 50 52 20 24 66 72 61 67 62 65 66 6f 72 65 5d 20  PR $fragbefore] 
1840: 5b 50 52 20 24 66 72 61 67 61 66 74 65 72 5d 22  [PR $fragafter]"
1850: 0a 0a 09 09 69 66 20 7b 21 5b 6c 6c 65 6e 67 74  ....if {![llengt
1860: 68 20 24 66 72 61 67 62 65 66 6f 72 65 5d 7d 20  h $fragbefore]} 
1870: 7b 0a 09 09 20 20 20 20 74 72 6f 75 62 6c 65 20  {...    trouble 
1880: 69 6e 74 65 72 6e 61 6c 20 22 54 72 69 65 64 20  internal "Tried 
1890: 74 6f 20 73 70 6c 69 74 20 6f 66 66 20 61 20 7a  to split off a z
18a0: 65 72 6f 2d 6c 65 6e 67 74 68 20 66 72 61 67 6d  ero-length fragm
18b0: 65 6e 74 20 61 74 20 74 68 65 20 62 65 67 69 6e  ent at the begin
18c0: 6e 69 6e 67 22 0a 09 09 7d 0a 09 09 69 66 20 7b  ning"...}...if {
18d0: 21 5b 6c 6c 65 6e 67 74 68 20 24 66 72 61 67 61  ![llength $fraga
18e0: 66 74 65 72 5d 7d 20 7b 0a 09 09 20 20 20 20 74  fter]} {...    t
18f0: 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20  rouble internal 
1900: 22 54 72 69 65 64 20 74 6f 20 73 70 6c 69 74 20  "Tried to split 
1910: 6f 66 66 20 61 20 7a 65 72 6f 2d 6c 65 6e 67 74  off a zero-lengt
1920: 68 20 66 72 61 67 6d 65 6e 74 20 61 74 20 74 68  h fragment at th
1930: 65 20 65 6e 64 22 0a 09 09 7d 0a 0a 09 09 6c 61  e end"...}....la
1940: 70 70 65 6e 64 20 70 65 6e 64 69 6e 67 20 24 66  ppend pending $f
1950: 72 61 67 62 65 66 6f 72 65 20 24 66 72 61 67 61  ragbefore $fraga
1960: 66 74 65 72 0a 09 09 43 75 74 41 74 20 24 62 65  fter...CutAt $be
1970: 73 74 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  st..    }...    
1980: 69 6e 63 72 20 61 74 0a 09 7d 0a 0a 09 6c 6f 67  incr at..}...log
1990: 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22   write 6 csets "
19a0: 2e 20 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e  . . .. ... .....
19b0: 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e   ........ ......
19c0: 2e 2e 2e 2e 2e 2e 2e 22 0a 0a 09 23 20 43 72 65  ......."...# Cre
19d0: 61 74 65 20 63 68 61 6e 67 65 73 65 74 73 20 66  ate changesets f
19e0: 6f 72 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73  or the fragments
19f0: 2c 20 72 65 75 73 69 6e 67 20 74 68 65 20 63 75  , reusing the cu
1a00: 72 72 65 6e 74 20 6f 6e 65 0a 09 23 20 66 6f 72  rrent one..# for
1a10: 20 74 68 65 20 66 69 72 73 74 20 66 72 61 67 6d   the first fragm
1a20: 65 6e 74 2e 20 57 65 20 73 6f 72 74 20 74 68 65  ent. We sort the
1a30: 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 6c  m in order to al
1a40: 6c 6f 77 0a 09 23 20 63 68 65 63 6b 69 6e 67 20  low..# checking 
1a50: 66 6f 72 20 67 61 70 73 20 61 6e 64 20 6e 69 63  for gaps and nic
1a60: 65 20 6d 65 73 73 61 67 65 73 2e 0a 0a 09 73 65  e messages....se
1a70: 74 20 66 72 61 67 6d 65 6e 74 73 20 5b 6c 73 6f  t fragments [lso
1a80: 72 74 20 2d 69 6e 64 65 78 20 30 20 2d 69 6e 74  rt -index 0 -int
1a90: 65 67 65 72 20 24 66 72 61 67 6d 65 6e 74 73 5d  eger $fragments]
1aa0: 0a 0a 09 23 70 75 74 73 20 5c 74 2e 5b 6a 6f 69  ...#puts \t.[joi
1ab0: 6e 20 5b 50 52 73 20 24 66 72 61 67 6d 65 6e 74  n [PRs $fragment
1ac0: 73 5d 20 2e 5c 6e 5c 74 2e 5d 2e 0a 0a 09 42 6f  s] .\n\t.]....Bo
1ad0: 72 64 65 72 20 5b 6c 69 6e 64 65 78 20 24 66 72  rder [lindex $fr
1ae0: 61 67 6d 65 6e 74 73 20 30 5d 20 66 69 72 73 74  agments 0] first
1af0: 73 20 66 69 72 73 74 65 0a 0a 09 69 66 20 7b 24  s firste...if {$
1b00: 66 69 72 73 74 73 20 21 3d 20 30 7d 20 7b 0a 09  firsts != 0} {..
1b10: 20 20 20 20 74 72 6f 75 62 6c 65 20 69 6e 74 65      trouble inte
1b20: 72 6e 61 6c 20 22 42 61 64 20 66 72 61 67 6d 65  rnal "Bad fragme
1b30: 6e 74 20 73 74 61 72 74 20 40 20 24 66 69 72 73  nt start @ $firs
1b40: 74 73 2c 20 67 61 70 2c 20 6f 72 20 62 65 66 6f  ts, gap, or befo
1b50: 72 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  re beginning of 
1b60: 74 68 65 20 72 61 6e 67 65 22 0a 09 7d 0a 0a 09  the range"..}...
1b70: 73 65 74 20 6c 61 73 74 65 20 24 66 69 72 73 74  set laste $first
1b80: 65 0a 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d  e..foreach fragm
1b90: 65 6e 74 20 5b 6c 72 61 6e 67 65 20 24 66 72 61  ent [lrange $fra
1ba0: 67 6d 65 6e 74 73 20 31 20 65 6e 64 5d 20 7b 0a  gments 1 end] {.
1bb0: 09 20 20 20 20 42 6f 72 64 65 72 20 24 66 72 61  .    Border $fra
1bc0: 67 6d 65 6e 74 20 73 20 65 0a 09 20 20 20 20 69  gment s e..    i
1bd0: 66 20 7b 24 6c 61 73 74 65 20 21 3d 20 28 24 73  f {$laste != ($s
1be0: 20 2d 20 31 29 7d 20 7b 0a 09 09 74 72 6f 75 62   - 1)} {...troub
1bf0: 6c 65 20 69 6e 74 65 72 6e 61 6c 20 22 42 61 64  le internal "Bad
1c00: 20 66 72 61 67 6d 65 6e 74 20 62 6f 72 64 65 72   fragment border
1c10: 20 3c 24 6c 61 73 74 65 20 7c 20 24 73 3e 2c 20   <$laste | $s>, 
1c20: 67 61 70 20 6f 72 20 6f 76 65 72 6c 61 70 22 0a  gap or overlap".
1c30: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 73 65 74  .    }...    set
1c40: 20 6e 65 77 20 5b 24 74 79 70 65 20 25 41 55 54   new [$type %AUT
1c50: 4f 25 20 24 6d 79 70 72 6f 6a 65 63 74 20 24 6d  O% $myproject $m
1c60: 79 74 79 70 65 20 24 6d 79 73 72 63 69 64 20 5b  ytype $mysrcid [
1c70: 6c 72 61 6e 67 65 20 24 6d 79 72 65 76 69 73 69  lrange $myrevisi
1c80: 6f 6e 73 20 24 73 20 24 65 5d 5d 0a 0a 20 20 20  ons $s $e]]..   
1c90: 20 20 20 20 20 20 20 20 20 6c 6f 67 20 77 72 69           log wri
1ca0: 74 65 20 34 20 63 73 65 74 73 20 22 42 72 65 61  te 4 csets "Brea
1cb0: 6b 69 6e 67 20 3c 24 6d 79 69 64 3e 20 40 20 24  king <$myid> @ $
1cc0: 6c 61 73 74 65 2c 20 6e 65 77 20 3c 5b 24 6e 65  laste, new <[$ne
1cd0: 77 20 69 64 5d 3e 2c 20 63 75 74 74 69 6e 67 20  w id]>, cutting 
1ce0: 24 62 72 65 61 6b 73 28 24 6c 61 73 74 65 29 22  $breaks($laste)"
1cf0: 0a 0a 09 20 20 20 20 73 65 74 20 6c 61 73 74 65  ...    set laste
1d00: 20 24 65 0a 09 7d 0a 0a 09 69 66 20 7b 24 6c 61   $e..}...if {$la
1d10: 73 74 65 20 21 3d 20 28 5b 6c 6c 65 6e 67 74 68  ste != ([llength
1d20: 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 5d 2d 31   $myrevisions]-1
1d30: 29 7d 20 7b 0a 09 20 20 20 20 74 72 6f 75 62 6c  )} {..    troubl
1d40: 65 20 69 6e 74 65 72 6e 61 6c 20 22 42 61 64 20  e internal "Bad 
1d50: 66 72 61 67 6d 65 6e 74 20 65 6e 64 20 40 20 24  fragment end @ $
1d60: 6c 61 73 74 65 2c 20 67 61 70 2c 20 6f 72 20 62  laste, gap, or b
1d70: 65 79 6f 6e 64 20 65 6e 64 20 6f 66 20 74 68 65  eyond end of the
1d80: 20 72 61 6e 67 65 22 0a 09 7d 0a 0a 09 23 20 50   range"..}...# P
1d90: 75 74 20 74 68 65 20 66 69 72 73 74 20 66 72 61  ut the first fra
1da0: 67 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 63  gment into the c
1db0: 75 72 72 65 6e 74 20 63 68 61 6e 67 65 73 65 74  urrent changeset
1dc0: 2e 0a 09 73 65 74 20 6d 79 72 65 76 69 73 69 6f  ...set myrevisio
1dd0: 6e 73 20 5b 6c 72 61 6e 67 65 20 24 6d 79 72 65  ns [lrange $myre
1de0: 76 69 73 69 6f 6e 73 20 30 20 24 66 69 72 73 74  visions 0 $first
1df0: 65 5d 0a 0a 09 72 65 74 75 72 6e 20 31 0a 20 20  e]...return 1.  
1e00: 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20    }..    method 
1e10: 70 65 72 73 69 73 74 20 7b 7d 20 7b 0a 09 73 65  persist {} {..se
1e20: 74 20 74 69 64 20 24 6d 79 63 73 74 79 70 65 28  t tid $mycstype(
1e30: 24 6d 79 74 79 70 65 29 0a 09 73 65 74 20 70 69  $mytype)..set pi
1e40: 64 20 5b 24 6d 79 70 72 6f 6a 65 63 74 20 69 64  d [$myproject id
1e50: 5d 0a 09 73 65 74 20 70 6f 73 20 30 0a 0a 09 73  ]..set pos 0...s
1e60: 74 61 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tate transaction
1e70: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 20 72 75   {..    state ru
1e80: 6e 20 7b 0a 09 09 49 4e 53 45 52 54 20 49 4e 54  n {...INSERT INT
1e90: 4f 20 63 68 61 6e 67 65 73 65 74 20 28 63 69 64  O changeset (cid
1ea0: 2c 20 20 20 70 69 64 2c 20 20 74 79 70 65 2c 20  ,   pid,  type, 
1eb0: 73 72 63 29 0a 09 09 56 41 4c 55 45 53 20 20 20  src)...VALUES   
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 24 6d               ($m
1ed0: 79 69 64 2c 20 24 70 69 64 2c 20 24 74 69 64 2c  yid, $pid, $tid,
1ee0: 20 24 6d 79 73 72 63 69 64 29 3b 0a 09 20 20 20   $mysrcid);..   
1ef0: 20 7d 0a 0a 09 20 20 20 20 66 6f 72 65 61 63 68   }...    foreach
1f00: 20 72 69 64 20 24 6d 79 72 65 76 69 73 69 6f 6e   rid $myrevision
1f10: 73 20 7b 0a 09 09 73 74 61 74 65 20 72 75 6e 20  s {...state run 
1f20: 7b 0a 09 09 20 20 20 20 49 4e 53 45 52 54 20 49  {...    INSERT I
1f30: 4e 54 4f 20 63 73 72 65 76 69 73 69 6f 6e 20 28  NTO csrevision (
1f40: 63 69 64 2c 20 20 20 70 6f 73 2c 20 20 72 69 64  cid,   pos,  rid
1f50: 29 0a 09 09 20 20 20 20 56 41 4c 55 45 53 20 20  )...    VALUES  
1f60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
1f70: 24 6d 79 69 64 2c 20 24 70 6f 73 2c 20 24 72 69  $myid, $pos, $ri
1f80: 64 29 3b 0a 09 09 7d 0a 09 09 69 6e 63 72 20 70  d);...}...incr p
1f90: 6f 73 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72 65  os..    }..}..re
1fa0: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
1fb0: 6d 65 74 68 6f 64 20 74 69 6d 65 72 61 6e 67 65  method timerange
1fc0: 20 7b 7d 20 7b 0a 09 73 65 74 20 74 68 65 73 65   {} {..set these
1fd0: 74 20 28 27 5b 6a 6f 69 6e 20 24 6d 79 72 65 76  t ('[join $myrev
1fe0: 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a  isions {','}]').
1ff0: 09 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72  .return [state r
2000: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54  un "..    SELECT
2010: 20 4d 49 4e 28 52 2e 64 61 74 65 29 2c 20 4d 41   MIN(R.date), MA
2020: 58 28 52 2e 64 61 74 65 29 0a 09 20 20 20 20 46  X(R.date)..    F
2030: 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 0a 09  ROM revision R..
2040: 20 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 20      WHERE R.rid 
2050: 49 4e 20 24 74 68 65 73 65 74 0a 09 22 5d 0a 20  IN $theset.."]. 
2060: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64     }..    method
2070: 20 64 72 6f 70 20 7b 7d 20 7b 0a 09 73 74 61 74   drop {} {..stat
2080: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a  e transaction {.
2090: 09 20 20 20 20 73 74 61 74 65 20 72 75 6e 20 7b  .    state run {
20a0: 0a 09 09 44 45 4c 45 54 45 20 46 52 4f 4d 20 63  ...DELETE FROM c
20b0: 68 61 6e 67 65 73 65 74 20 20 57 48 45 52 45 20  hangeset  WHERE 
20c0: 63 69 64 20 3d 20 24 6d 79 69 64 3b 0a 09 09 44  cid = $myid;...D
20d0: 45 4c 45 54 45 20 46 52 4f 4d 20 63 73 72 65 76  ELETE FROM csrev
20e0: 69 73 69 6f 6e 20 57 48 45 52 45 20 63 69 64 20  ision WHERE cid 
20f0: 3d 20 24 6d 79 69 64 3b 0a 09 20 20 20 20 7d 0a  = $myid;..    }.
2100: 09 7d 0a 09 66 6f 72 65 61 63 68 20 72 20 24 6d  .}..foreach r $m
2110: 79 72 65 76 69 73 69 6f 6e 73 20 7b 20 75 6e 73  yrevisions { uns
2120: 65 74 20 6d 79 72 65 76 6d 61 70 28 24 72 29 20  et myrevmap($r) 
2130: 7d 0a 09 73 65 74 20 70 6f 73 20 20 20 20 20 20  }..set pos      
2140: 20 20 20 20 5b 6c 73 65 61 72 63 68 20 2d 65 78      [lsearch -ex
2150: 61 63 74 20 24 6d 79 63 68 61 6e 67 65 73 65 74  act $mychangeset
2160: 73 20 24 73 65 6c 66 5d 0a 09 73 65 74 20 6d 79  s $self]..set my
2170: 63 68 61 6e 67 65 73 65 74 73 20 5b 6c 72 65 70  changesets [lrep
2180: 6c 61 63 65 20 24 6d 79 63 68 61 6e 67 65 73 65  lace $mychangese
2190: 74 73 20 24 70 6f 73 20 24 70 6f 73 5d 0a 09 72  ts $pos $pos]..r
21a0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
21b0: 20 74 79 70 65 6d 65 74 68 6f 64 20 73 70 6c 69   typemethod spli
21c0: 74 20 7b 63 73 65 74 20 61 72 67 73 7d 20 7b 0a  t {cset args} {.
21d0: 09 23 20 41 73 20 70 61 72 74 20 6f 66 20 74 68  .# As part of th
21e0: 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68  e creation of th
21f0: 65 20 6e 65 77 20 63 68 61 6e 67 65 73 65 74 73  e new changesets
2200: 20 73 70 65 63 69 66 69 65 64 20 69 6e 0a 09 23   specified in..#
2210: 20 41 52 47 53 20 61 73 20 73 65 74 73 20 6f 66   ARGS as sets of
2220: 20 72 65 76 69 73 69 6f 6e 73 2c 20 61 6c 6c 20   revisions, all 
2230: 73 75 62 73 65 74 73 20 6f 66 20 43 53 45 54 27  subsets of CSET'
2240: 73 20 72 65 76 69 73 69 6f 6e 0a 09 23 20 73 65  s revision..# se
2250: 74 2c 20 43 53 45 54 20 77 69 6c 6c 20 62 65 20  t, CSET will be 
2260: 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 61 6c 6c  dropped from all
2270: 20 64 61 74 61 62 61 73 65 73 2c 20 69 6e 20 61   databases, in a
2280: 6e 64 20 6f 75 74 20 6f 66 0a 09 23 20 6d 65 6d  nd out of..# mem
2290: 6f 72 79 2c 20 61 6e 64 20 74 68 65 6e 20 64 65  ory, and then de
22a0: 73 74 72 6f 79 65 64 2e 0a 0a 09 73 74 72 75 63  stroyed....struc
22b0: 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b  t::list assign [
22c0: 24 63 73 65 74 20 64 61 74 61 5d 20 70 72 6f 6a  $cset data] proj
22d0: 65 63 74 20 63 73 74 79 70 65 20 63 73 73 72 63  ect cstype cssrc
22e0: 0a 0a 09 24 63 73 65 74 20 64 72 6f 70 0a 09 24  ...$cset drop..$
22f0: 63 73 65 74 20 64 65 73 74 72 6f 79 0a 0a 09 73  cset destroy...s
2300: 65 74 20 6e 65 77 63 73 65 74 73 20 7b 7d 0a 09  et newcsets {}..
2310: 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65 6e 74  foreach fragment
2320: 72 65 76 69 73 69 6f 6e 73 20 24 61 72 67 73 20  revisions $args 
2330: 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 6e  {..    lappend n
2340: 65 77 63 73 65 74 73 20 5b 24 74 79 70 65 20 25  ewcsets [$type %
2350: 41 55 54 4f 25 20 24 70 72 6f 6a 65 63 74 20 24  AUTO% $project $
2360: 63 73 74 79 70 65 20 24 63 73 73 72 63 20 24 66  cstype $cssrc $f
2370: 72 61 67 6d 65 6e 74 72 65 76 69 73 69 6f 6e 73  ragmentrevisions
2380: 5d 0a 09 7d 0a 0a 09 66 6f 72 65 61 63 68 20 63  ]..}...foreach c
2390: 20 24 6e 65 77 63 73 65 74 73 20 7b 20 24 63 20   $newcsets { $c 
23a0: 70 65 72 73 69 73 74 20 7d 0a 09 72 65 74 75 72  persist }..retur
23b0: 6e 20 24 6e 65 77 63 73 65 74 73 0a 20 20 20 20  n $newcsets.    
23c0: 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23  }..    # # ## ##
23d0: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
23e0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20   #############. 
23f0: 20 20 20 23 23 20 53 74 61 74 65 0a 0a 20 20 20     ## State..   
2400: 20 76 61 72 69 61 62 6c 65 20 6d 79 69 64 20 20   variable myid  
2410: 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 49 64 20        {} ; # Id 
2420: 6f 66 20 74 68 65 20 63 73 65 74 20 66 6f 72 20  of the cset for 
2430: 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 0a 09  the persistent..
2440: 09 09 20 20 20 20 20 20 23 20 73 74 61 74 65 2e  ..      # state.
2450: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79  .    variable my
2460: 70 72 6f 6a 65 63 74 20 20 20 7b 7d 20 3b 20 23  project   {} ; #
2470: 20 52 65 66 65 72 65 6e 63 65 20 6f 66 20 74 68   Reference of th
2480: 65 20 70 72 6f 6a 65 63 74 20 6f 62 6a 65 63 74  e project object
2490: 20 74 68 65 0a 09 09 09 20 20 20 20 20 20 23 20   the....      # 
24a0: 63 68 61 6e 67 65 73 65 74 20 62 65 6c 6f 6e 67  changeset belong
24b0: 73 20 74 6f 2e 0a 20 20 20 20 76 61 72 69 61 62  s to..    variab
24c0: 6c 65 20 6d 79 74 79 70 65 20 20 20 20 20 20 7b  le mytype      {
24d0: 7d 20 3b 20 23 20 72 65 76 20 6f 72 20 73 79 6d  } ; # rev or sym
24e0: 2c 20 77 68 65 72 65 20 74 68 65 20 63 73 65 74  , where the cset
24f0: 20 6f 72 69 67 69 6e 61 74 65 64 0a 09 09 09 20   originated.... 
2500: 20 20 20 20 20 23 20 66 72 6f 6d 2e 0a 20 20 20       # from..   
2510: 20 76 61 72 69 61 62 6c 65 20 6d 79 73 72 63 69   variable mysrci
2520: 64 20 20 20 20 20 7b 7d 20 3b 20 23 20 49 64 20  d     {} ; # Id 
2530: 6f 66 20 74 68 65 20 6d 65 74 61 64 61 74 61 20  of the metadata 
2540: 6f 72 20 73 79 6d 62 6f 6c 20 74 68 65 20 63 73  or symbol the cs
2550: 65 74 0a 09 09 09 20 20 20 20 20 20 23 20 69 73  et....      # is
2560: 20 62 61 73 65 64 20 6f 6e 2e 0a 20 20 20 20 76   based on..    v
2570: 61 72 69 61 62 6c 65 20 6d 79 72 65 76 69 73 69  ariable myrevisi
2580: 6f 6e 73 20 7b 7d 20 3b 20 23 20 4c 69 73 74 20  ons {} ; # List 
2590: 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 65 76 65  of the file leve
25a0: 6c 20 72 65 76 69 73 69 6f 6e 73 20 69 6e 0a 09  l revisions in..
25b0: 09 09 20 20 20 20 20 20 23 20 74 68 65 20 63 73  ..      # the cs
25c0: 65 74 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65  et..    variable
25d0: 20 6d 79 6e 65 78 74 6d 61 70 20 20 20 7b 7d 20   mynextmap   {} 
25e0: 3b 20 23 20 44 69 63 74 69 6f 6e 61 72 79 20 6d  ; # Dictionary m
25f0: 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65 20  apping from the 
2600: 72 65 76 69 73 69 6f 6e 73 0a 09 09 09 20 20 20  revisions....   
2610: 20 20 20 23 20 74 6f 20 74 68 65 69 72 20 73 75     # to their su
2620: 63 63 65 73 73 6f 72 73 2e 20 43 61 63 68 65 20  ccessors. Cache 
2630: 74 6f 20 61 76 6f 69 64 0a 09 09 09 20 20 20 20  to avoid....    
2640: 20 20 23 20 6c 6f 61 64 69 6e 67 20 74 68 69 73    # loading this
2650: 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65 20   from the state 
2660: 6d 6f 72 65 20 74 68 61 6e 0a 09 09 09 20 20 20  more than....   
2670: 20 20 20 23 20 6f 6e 63 65 2e 0a 20 20 20 20 76     # once..    v
2680: 61 72 69 61 62 6c 65 20 6d 79 70 6f 73 20 20 20  ariable mypos   
2690: 20 20 20 20 7b 7d 20 3b 20 23 20 43 6f 6d 6d 69      {} ; # Commi
26a0: 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68  t position of th
26b0: 65 20 63 68 61 6e 67 65 73 65 74 2c 20 69 66 0a  e changeset, if.
26c0: 09 09 09 20 20 20 20 20 20 23 20 6b 6e 6f 77 6e  ...      # known
26d0: 2e 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23  ...    # # ## ##
26e0: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
26f0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20   #############. 
2700: 20 20 20 23 23 20 49 6e 74 65 72 6e 61 6c 20 6d     ## Internal m
2710: 65 74 68 6f 64 73 0a 0a 20 20 20 20 74 79 70 65  ethods..    type
2720: 76 61 72 69 61 62 6c 65 20 6d 79 63 6f 75 6e 74  variable mycount
2730: 65 72 20 20 20 20 20 20 20 20 30 20 3b 20 23 20  er        0 ; # 
2740: 49 64 20 63 6f 75 6e 74 65 72 20 66 6f 72 20 63  Id counter for c
2750: 73 65 74 73 2e 20 4c 61 73 74 20 69 64 20 75 73  sets. Last id us
2760: 65 64 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69  ed..    typevari
2770: 61 62 6c 65 20 6d 79 63 73 74 79 70 65 20 2d 61  able mycstype -a
2780: 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20  rray {} ; # Map 
2790: 63 73 74 79 70 65 73 20 74 6f 20 70 65 72 73 69  cstypes to persi
27a0: 73 74 65 6e 74 20 69 64 73 2e 0a 0a 20 20 20 20  stent ids...    
27b0: 74 79 70 65 6d 65 74 68 6f 64 20 67 65 74 63 73  typemethod getcs
27c0: 74 79 70 65 73 20 7b 7d 20 7b 0a 09 66 6f 72 65  types {} {..fore
27d0: 61 63 68 20 7b 74 69 64 20 6e 61 6d 65 7d 20 5b  ach {tid name} [
27e0: 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20  state run {..   
27f0: 20 53 45 4c 45 43 54 20 74 69 64 2c 20 6e 61 6d   SELECT tid, nam
2800: 65 20 46 52 4f 4d 20 63 73 74 79 70 65 3b 0a 09  e FROM cstype;..
2810: 7d 5d 20 7b 20 73 65 74 20 6d 79 63 73 74 79 70  }] { set mycstyp
2820: 65 28 24 6e 61 6d 65 29 20 24 74 69 64 20 7d 0a  e($name) $tid }.
2830: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
2840: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c 6f     typemethod lo
2850: 61 64 63 6f 75 6e 74 65 72 20 7b 7d 20 7b 0a 09  adcounter {} {..
2860: 23 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  # Initialize the
2870: 20 63 6f 75 6e 74 65 72 20 66 72 6f 6d 20 74 68   counter from th
2880: 65 20 73 74 61 74 65 0a 09 73 65 74 20 6d 79 63  e state..set myc
2890: 6f 75 6e 74 65 72 20 5b 73 74 61 74 65 20 6f 6e  ounter [state on
28a0: 65 20 7b 20 53 45 4c 45 43 54 20 4d 41 58 28 63  e { SELECT MAX(c
28b0: 69 64 29 20 46 52 4f 4d 20 63 68 61 6e 67 65 73  id) FROM changes
28c0: 65 74 20 7d 5d 0a 09 72 65 74 75 72 6e 0a 20 20  et }]..return.  
28d0: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 50 75    }..    proc Pu
28e0: 6c 6c 49 6e 74 65 72 6e 61 6c 53 75 63 63 65 73  llInternalSucces
28f0: 73 6f 72 52 65 76 69 73 69 6f 6e 73 20 7b 64 76  sorRevisions {dv
2900: 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75   revisions} {..u
2910: 70 76 61 72 20 31 20 24 64 76 20 64 65 70 65 6e  pvar 1 $dv depen
2920: 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74 68 65  dencies..set the
2930: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76  set ('[join $rev
2940: 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a  isions {','}]').
2950: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63  ..foreach {rid c
2960: 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e  hild} [state run
2970: 20 22 0a 20 20 20 2d 2d 20 50 72 69 6d 61 72 79   ".   -- Primary
2980: 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 53   children..    S
2990: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63  ELECT R.rid, R.c
29a0: 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  hild..    FROM  
29b0: 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20   revision R..   
29c0: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20   WHERE  R.rid   
29d0: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20  IN $theset..    
29e0: 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49  AND    R.child I
29f0: 53 20 4e 4f 54 20 4e 55 4c 4c 0a 09 20 20 20 20  S NOT NULL..    
2a00: 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49  AND    R.child I
2a10: 4e 20 24 74 68 65 73 65 74 0a 20 20 20 20 55 4e  N $theset.    UN
2a20: 49 4f 4e 0a 20 20 20 20 2d 2d 20 54 72 61 6e 73  ION.    -- Trans
2a30: 69 74 69 6f 6e 20 4e 54 44 42 20 74 6f 20 74 72  ition NTDB to tr
2a40: 75 6e 6b 0a 09 20 20 20 20 53 45 4c 45 43 54 20  unk..    SELECT 
2a50: 52 2e 72 69 64 2c 20 52 2e 64 62 63 68 69 6c 64  R.rid, R.dbchild
2a60: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76  ..    FROM   rev
2a70: 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45  ision R..    WHE
2a80: 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24  RE  R.rid   IN $
2a90: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20  theset..    AND 
2aa0: 20 20 20 52 2e 64 62 63 68 69 6c 64 20 49 53 20     R.dbchild IS 
2ab0: 4e 4f 54 20 4e 55 4c 4c 0a 09 20 20 20 20 41 4e  NOT NULL..    AN
2ac0: 44 20 20 20 20 52 2e 64 62 63 68 69 6c 64 20 49  D    R.dbchild I
2ad0: 4e 20 24 74 68 65 73 65 74 0a 20 20 20 20 55 4e  N $theset.    UN
2ae0: 49 4f 4e 0a 20 20 20 20 2d 2d 20 53 65 63 6f 6e  ION.    -- Secon
2af0: 64 61 72 79 20 28 62 72 61 6e 63 68 29 20 63 68  dary (branch) ch
2b00: 69 6c 64 72 65 6e 0a 09 20 20 20 20 53 45 4c 45  ildren..    SELE
2b10: 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 72 69 64  CT R.rid, B.brid
2b20: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76  ..    FROM   rev
2b30: 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f  ision R, revisio
2b40: 6e 62 72 61 6e 63 68 63 68 69 6c 64 72 65 6e 20  nbranchchildren 
2b50: 42 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e  B..    WHERE  R.
2b60: 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74  rid   IN $theset
2b70: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72  ..    AND    R.r
2b80: 69 64 20 3d 20 42 2e 72 69 64 0a 09 20 20 20 20  id = B.rid..    
2b90: 41 4e 44 20 20 20 20 42 2e 62 72 69 64 20 49 4e  AND    B.brid IN
2ba0: 20 24 74 68 65 73 65 74 0a 09 22 5d 20 7b 0a 09   $theset.."] {..
2bb0: 20 20 20 20 23 20 43 6f 6e 73 69 64 65 72 20 6d      # Consider m
2bc0: 6f 76 69 6e 67 20 74 68 69 73 20 74 6f 20 74 68  oving this to th
2bd0: 65 20 69 6e 74 65 67 72 69 74 79 20 6d 6f 64 75  e integrity modu
2be0: 6c 65 2e 0a 09 20 20 20 20 69 66 20 7b 24 72 69  le...    if {$ri
2bf0: 64 20 3d 3d 20 24 63 68 69 6c 64 7d 20 7b 0a 09  d == $child} {..
2c00: 09 74 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61  .trouble interna
2c10: 6c 20 22 52 65 76 69 73 69 6f 6e 20 24 72 69 64  l "Revision $rid
2c20: 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 65   depends on itse
2c30: 6c 66 2e 22 0a 09 20 20 20 20 7d 0a 09 20 20 20  lf."..    }..   
2c40: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65   lappend depende
2c50: 6e 63 69 65 73 28 24 72 69 64 29 20 24 63 68 69  ncies($rid) $chi
2c60: 6c 64 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20  ld..}.    }..   
2c70: 20 70 72 6f 63 20 50 75 6c 6c 53 75 63 63 65 73   proc PullSucces
2c80: 73 6f 72 52 65 76 69 73 69 6f 6e 73 20 7b 64 76  sorRevisions {dv
2c90: 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75   revisions} {..u
2ca0: 70 76 61 72 20 31 20 24 64 76 20 64 65 70 65 6e  pvar 1 $dv depen
2cb0: 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74 68 65  dencies..set the
2cc0: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76  set ('[join $rev
2cd0: 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a  isions {','}]').
2ce0: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63  ..foreach {rid c
2cf0: 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e  hild} [state run
2d00: 20 22 0a 20 20 20 2d 2d 20 50 72 69 6d 61 72 79   ".   -- Primary
2d10: 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 53   children..    S
2d20: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63  ELECT R.rid, R.c
2d30: 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  hild..    FROM  
2d40: 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20   revision R..   
2d50: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20   WHERE  R.rid   
2d60: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20  IN $theset..    
2d70: 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49  AND    R.child I
2d80: 53 20 4e 4f 54 20 4e 55 4c 4c 0a 20 20 20 20 55  S NOT NULL.    U
2d90: 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 54 72 61 6e  NION.    -- Tran
2da0: 73 69 74 69 6f 6e 20 4e 54 44 42 20 74 6f 20 74  sition NTDB to t
2db0: 72 75 6e 6b 0a 09 20 20 20 20 53 45 4c 45 43 54  runk..    SELECT
2dc0: 20 52 2e 72 69 64 2c 20 52 2e 64 62 63 68 69 6c   R.rid, R.dbchil
2dd0: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65  d..    FROM   re
2de0: 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48  vision R..    WH
2df0: 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20  ERE  R.rid   IN 
2e00: 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44  $theset..    AND
2e10: 20 20 20 20 52 2e 64 62 63 68 69 6c 64 20 49 53      R.dbchild IS
2e20: 20 4e 4f 54 20 4e 55 4c 4c 0a 20 20 20 20 55 4e   NOT NULL.    UN
2e30: 49 4f 4e 0a 20 20 20 20 2d 2d 20 53 65 63 6f 6e  ION.    -- Secon
2e40: 64 61 72 79 20 28 62 72 61 6e 63 68 29 20 63 68  dary (branch) ch
2e50: 69 6c 64 72 65 6e 0a 09 20 20 20 20 53 45 4c 45  ildren..    SELE
2e60: 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 72 69 64  CT R.rid, B.brid
2e70: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76  ..    FROM   rev
2e80: 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f  ision R, revisio
2e90: 6e 62 72 61 6e 63 68 63 68 69 6c 64 72 65 6e 20  nbranchchildren 
2ea0: 42 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e  B..    WHERE  R.
2eb0: 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74  rid   IN $theset
2ec0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72  ..    AND    R.r
2ed0: 69 64 20 3d 20 42 2e 72 69 64 0a 09 22 5d 20 7b  id = B.rid.."] {
2ee0: 0a 09 20 20 20 20 23 20 43 6f 6e 73 69 64 65 72  ..    # Consider
2ef0: 20 6d 6f 76 69 6e 67 20 74 68 69 73 20 74 6f 20   moving this to 
2f00: 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6d 6f  the integrity mo
2f10: 64 75 6c 65 2e 0a 09 20 20 20 20 69 66 20 7b 24  dule...    if {$
2f20: 72 69 64 20 3d 3d 20 24 63 68 69 6c 64 7d 20 7b  rid == $child} {
2f30: 0a 09 09 74 72 6f 75 62 6c 65 20 69 6e 74 65 72  ...trouble inter
2f40: 6e 61 6c 20 22 52 65 76 69 73 69 6f 6e 20 24 72  nal "Revision $r
2f50: 69 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 74  id depends on it
2f60: 73 65 6c 66 2e 22 0a 09 20 20 20 20 7d 0a 09 20  self."..    }.. 
2f70: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e     lappend depen
2f80: 64 65 6e 63 69 65 73 28 24 72 69 64 29 20 24 63  dencies($rid) $c
2f90: 68 69 6c 64 0a 09 7d 0a 20 20 20 20 7d 0a 0a 20  hild..}.    }.. 
2fa0: 20 20 20 70 72 6f 63 20 49 6e 69 74 69 61 6c 69     proc Initiali
2fb0: 7a 65 42 72 65 61 6b 53 74 61 74 65 20 7b 72 65  zeBreakState {re
2fc0: 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61  visions} {..upva
2fd0: 72 20 31 20 70 6f 73 20 70 6f 73 20 63 72 6f 73  r 1 pos pos cros
2fe0: 73 20 63 72 6f 73 73 20 72 61 6e 67 65 20 72 61  s cross range ra
2ff0: 6e 67 65 20 64 65 70 63 20 64 65 70 63 20 64 65  nge depc depc de
3000: 6c 74 61 20 64 65 6c 74 61 20 5c 0a 09 20 20 20  lta delta \..   
3010: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 64 65   dependencies de
3020: 70 65 6e 64 65 6e 63 69 65 73 0a 0a 09 23 20 46  pendencies...# F
3030: 69 72 73 74 20 77 65 20 63 72 65 61 74 65 20 61  irst we create a
3040: 20 6d 61 70 20 6f 66 20 70 6f 73 69 74 69 6f 6e   map of position
3050: 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 65 61 73  s to make it eas
3060: 69 65 72 20 74 6f 0a 09 23 20 64 65 74 65 72 6d  ier to..# determ
3070: 69 6e 65 20 77 68 65 74 68 65 72 20 61 20 64 65  ine whether a de
3080: 70 65 6e 64 65 6e 63 79 20 63 72 6f 73 73 65 73  pendency crosses
3090: 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e   a particular in
30a0: 64 65 78 2e 0a 0a 09 61 72 72 61 79 20 73 65 74  dex....array set
30b0: 20 70 6f 73 20 20 20 7b 7d 0a 09 61 72 72 61 79   pos   {}..array
30c0: 20 73 65 74 20 63 72 6f 73 73 20 7b 7d 0a 09 61   set cross {}..a
30d0: 72 72 61 79 20 73 65 74 20 64 65 70 63 20 20 7b  rray set depc  {
30e0: 7d 0a 09 73 65 74 20 72 61 6e 67 65 20 20 20 20  }..set range    
30f0: 20 20 20 7b 7d 0a 09 73 65 74 20 6e 20 30 0a 09     {}..set n 0..
3100: 66 6f 72 65 61 63 68 20 72 65 76 20 24 72 65 76  foreach rev $rev
3110: 69 73 69 6f 6e 73 20 7b 20 0a 09 20 20 20 20 6c  isions { ..    l
3120: 61 70 70 65 6e 64 20 72 61 6e 67 65 20 24 6e 0a  append range $n.
3130: 09 20 20 20 20 73 65 74 20 70 6f 73 28 24 72 65  .    set pos($re
3140: 76 29 20 24 6e 0a 09 20 20 20 20 73 65 74 20 63  v) $n..    set c
3150: 72 6f 73 73 28 24 6e 29 20 30 0a 09 20 20 20 20  ross($n) 0..    
3160: 69 6e 63 72 20 6e 0a 09 7d 0a 0a 09 23 20 53 65  incr n..}...# Se
3170: 63 6f 6e 64 6c 79 20 77 65 20 63 6f 75 6e 74 20  condly we count 
3180: 74 68 65 20 63 72 6f 73 73 69 6e 67 73 20 70 65  the crossings pe
3190: 72 20 70 6f 73 69 74 69 6f 6e 2c 20 62 79 20 69  r position, by i
31a0: 74 65 72 61 74 69 6e 67 0a 09 23 20 6f 76 65 72  terating..# over
31b0: 20 74 68 65 20 72 65 63 6f 72 64 65 64 20 69 6e   the recorded in
31c0: 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63  ternal dependenc
31d0: 69 65 73 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 49  ies....# Note: I
31e0: 66 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 73  f the timestamps
31f0: 20 61 72 65 20 62 61 64 6c 79 20 6f 75 74 20 6f   are badly out o
3200: 66 20 6f 72 64 65 72 20 69 74 20 69 73 0a 09 23  f order it is..#
3210: 20 20 20 20 20 20 20 70 6f 73 73 69 62 6c 65 20         possible 
3220: 74 6f 20 68 61 76 65 20 61 20 62 61 63 6b 77 61  to have a backwa
3230: 72 64 20 73 75 63 63 65 73 73 6f 72 20 64 65 70  rd successor dep
3240: 65 6e 64 65 6e 63 79 2c 0a 09 23 20 20 20 20 20  endency,..#     
3250: 20 20 69 2e 65 2e 20 77 69 74 68 20 73 74 61 72    i.e. with star
3260: 74 20 3e 20 65 6e 64 2e 20 57 65 20 6d 61 79 20  t > end. We may 
3270: 68 61 76 65 20 74 6f 20 73 77 61 70 20 74 68 65  have to swap the
3280: 20 69 6e 64 69 63 65 73 0a 09 23 20 20 20 20 20   indices..#     
3290: 20 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74    to ensure that
32a0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c   the following l
32b0: 6f 6f 70 20 72 75 6e 73 20 63 6f 72 72 65 63 74  oop runs correct
32c0: 6c 79 2e 0a 09 23 0a 09 23 20 4e 6f 74 65 20 32  ly...#..# Note 2
32d0: 3a 20 73 74 61 72 74 20 3d 3d 20 65 6e 64 20 69  : start == end i
32e0: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
32f0: 49 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 09  It indicates a..
3300: 23 20 20 20 20 20 20 20 20 20 73 65 6c 66 2d 64  #         self-d
3310: 65 70 65 6e 64 65 6e 63 79 20 64 75 65 20 74 6f  ependency due to
3320: 20 74 68 65 20 75 6e 69 71 75 65 6e 65 73 73 20   the uniqueness 
3330: 6f 66 20 70 6f 73 69 74 69 6f 6e 73 2c 0a 09 23  of positions,..#
3340: 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 61           and tha
3350: 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 77  t is something w
3360: 65 20 68 61 76 65 20 72 75 6c 65 64 20 6f 75 74  e have ruled out
3370: 20 61 6c 72 65 61 64 79 2c 20 73 65 65 0a 09 23   already, see..#
3380: 20 20 20 20 20 20 20 20 20 50 75 6c 6c 49 6e 74           PullInt
3390: 65 72 6e 61 6c 53 75 63 63 65 73 73 6f 72 52 65  ernalSuccessorRe
33a0: 76 69 73 69 6f 6e 73 2e 0a 0a 09 66 6f 72 65 61  visions....forea
33b0: 63 68 20 7b 72 69 64 20 63 68 69 6c 64 7d 20 5b  ch {rid child} [
33c0: 61 72 72 61 79 20 67 65 74 20 64 65 70 65 6e 64  array get depend
33d0: 65 6e 63 69 65 73 5d 20 7b 0a 09 20 20 20 20 73  encies] {..    s
33e0: 65 74 20 64 6b 65 79 20 20 20 20 5b 6c 69 73 74  et dkey    [list
33f0: 20 24 72 69 64 20 24 63 68 69 6c 64 5d 0a 09 20   $rid $child].. 
3400: 20 20 20 73 65 74 20 73 74 61 72 74 20 20 20 24     set start   $
3410: 70 6f 73 28 24 72 69 64 29 0a 09 20 20 20 20 73  pos($rid)..    s
3420: 65 74 20 65 6e 64 20 20 20 20 20 24 70 6f 73 28  et end     $pos(
3430: 24 63 68 69 6c 64 29 0a 09 20 20 20 20 73 65 74  $child)..    set
3440: 20 63 72 6f 73 73 65 73 20 7b 7d 0a 0a 09 20 20   crosses {}...  
3450: 20 20 69 66 20 7b 24 73 74 61 72 74 20 3e 20 24    if {$start > $
3460: 65 6e 64 7d 20 7b 0a 09 09 77 68 69 6c 65 20 7b  end} {...while {
3470: 24 65 6e 64 20 3c 20 24 73 74 61 72 74 7d 20 7b  $end < $start} {
3480: 0a 09 09 20 20 20 20 6c 61 70 70 65 6e 64 20 63  ...    lappend c
3490: 72 6f 73 73 65 73 20 24 65 6e 64 0a 09 09 20 20  rosses $end...  
34a0: 20 20 69 6e 63 72 20 63 72 6f 73 73 28 24 65 6e    incr cross($en
34b0: 64 29 0a 09 09 20 20 20 20 69 6e 63 72 20 65 6e  d)...    incr en
34c0: 64 0a 09 09 7d 0a 09 20 20 20 20 7d 20 65 6c 73  d...}..    } els
34d0: 65 20 7b 0a 09 09 77 68 69 6c 65 20 7b 24 73 74  e {...while {$st
34e0: 61 72 74 20 3c 20 24 65 6e 64 7d 20 7b 0a 09 09  art < $end} {...
34f0: 20 20 20 20 6c 61 70 70 65 6e 64 20 63 72 6f 73      lappend cros
3500: 73 65 73 20 24 73 74 61 72 74 0a 09 09 20 20 20  ses $start...   
3510: 20 69 6e 63 72 20 63 72 6f 73 73 28 24 73 74 61   incr cross($sta
3520: 72 74 29 0a 09 09 20 20 20 20 69 6e 63 72 20 73  rt)...    incr s
3530: 74 61 72 74 0a 09 09 7d 0a 09 20 20 20 20 7d 0a  tart...}..    }.
3540: 09 20 20 20 20 73 65 74 20 64 65 70 63 28 24 64  .    set depc($d
3550: 6b 65 79 29 20 24 63 72 6f 73 73 65 73 0a 09 7d  key) $crosses..}
3560: 0a 0a 09 49 6e 69 74 69 61 6c 69 7a 65 44 65 6c  ...InitializeDel
3570: 74 61 73 20 24 72 65 76 69 73 69 6f 6e 73 0a 09  tas $revisions..
3580: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20  return.    }..  
3590: 20 20 70 72 6f 63 20 49 6e 69 74 69 61 6c 69 7a    proc Initializ
35a0: 65 44 65 6c 74 61 73 20 7b 72 65 76 69 73 69 6f  eDeltas {revisio
35b0: 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 64  ns} {..upvar 1 d
35c0: 65 6c 74 61 20 64 65 6c 74 61 0a 0a 09 23 20 50  elta delta...# P
35d0: 75 6c 6c 20 74 68 65 20 74 69 6d 65 73 74 61 6d  ull the timestam
35e0: 70 73 20 66 6f 72 20 61 6c 6c 20 72 65 76 69 73  ps for all revis
35f0: 69 6f 6e 73 20 69 6e 20 74 68 65 20 63 68 61 6e  ions in the chan
3600: 67 65 73 65 74 73 20 61 6e 64 0a 09 23 20 63 6f  gesets and..# co
3610: 6d 70 75 74 65 20 74 68 65 69 72 20 64 65 6c 74  mpute their delt
3620: 61 73 20 66 6f 72 20 75 73 65 20 62 79 20 74 68  as for use by th
3630: 65 20 62 72 65 61 6b 20 66 69 6e 64 65 72 2e 0a  e break finder..
3640: 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 6c 74  ..array set delt
3650: 61 20 7b 7d 0a 09 61 72 72 61 79 20 73 65 74 20  a {}..array set 
3660: 73 74 61 6d 70 20 7b 7d 0a 0a 09 73 65 74 20 74  stamp {}...set t
3670: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72  heset ('[join $r
3680: 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27  evisions {','}]'
3690: 29 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20  )..foreach {rid 
36a0: 74 69 6d 65 7d 20 5b 73 74 61 74 65 20 72 75 6e  time} [state run
36b0: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52   "..    SELECT R
36c0: 2e 72 69 64 2c 20 52 2e 64 61 74 65 0a 09 20 20  .rid, R.date..  
36d0: 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20    FROM revision 
36e0: 52 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e 72  R..    WHERE R.r
36f0: 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 22  id IN $theset.."
3700: 5d 20 7b 0a 09 20 20 20 20 73 65 74 20 73 74 61  ] {..    set sta
3710: 6d 70 28 24 72 69 64 29 20 24 74 69 6d 65 0a 09  mp($rid) $time..
3720: 7d 0a 0a 09 73 65 74 20 6e 20 30 0a 09 66 6f 72  }...set n 0..for
3730: 65 61 63 68 20 72 69 64 20 5b 6c 72 61 6e 67 65  each rid [lrange
3740: 20 24 72 65 76 69 73 69 6f 6e 73 20 30 20 65 6e   $revisions 0 en
3750: 64 2d 31 5d 20 72 6e 65 78 74 20 5b 6c 72 61 6e  d-1] rnext [lran
3760: 67 65 20 24 72 65 76 69 73 69 6f 6e 73 20 31 20  ge $revisions 1 
3770: 65 6e 64 5d 20 7b 0a 09 20 20 20 20 73 65 74 20  end] {..    set 
3780: 64 65 6c 74 61 28 24 6e 29 20 5b 65 78 70 72 20  delta($n) [expr 
3790: 7b 24 73 74 61 6d 70 28 24 72 6e 65 78 74 29 20  {$stamp($rnext) 
37a0: 2d 20 24 73 74 61 6d 70 28 24 72 69 64 29 7d 5d  - $stamp($rid)}]
37b0: 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d 0a  ..    incr n..}.
37c0: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
37d0: 20 20 20 70 72 6f 63 20 46 69 6e 64 42 65 73 74     proc FindBest
37e0: 42 72 65 61 6b 20 7b 72 61 6e 67 65 7d 20 7b 0a  Break {range} {.
37f0: 09 75 70 76 61 72 20 31 20 63 72 6f 73 73 20 63  .upvar 1 cross c
3800: 72 6f 73 73 20 64 65 6c 74 61 20 64 65 6c 74 61  ross delta delta
3810: 0a 0a 09 23 20 44 65 74 65 72 6d 69 6e 65 20 74  ...# Determine t
3820: 68 65 20 62 65 73 74 20 62 72 65 61 6b 20 6c 6f  he best break lo
3830: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 67 69  cation in the gi
3840: 76 65 6e 20 72 61 6e 67 65 20 6f 66 0a 09 23 20  ven range of..# 
3850: 70 6f 73 69 74 69 6f 6e 73 2e 20 46 69 72 73 74  positions. First
3860: 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 68 65   we look for the
3870: 20 6c 6f 63 61 74 69 6f 6e 73 20 77 69 74 68 20   locations with 
3880: 74 68 65 20 6d 61 78 69 6d 61 6c 0a 09 23 20 6e  the maximal..# n
3890: 75 6d 62 65 72 20 6f 66 20 63 72 6f 73 73 69 6e  umber of crossin
38a0: 67 73 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  gs. If there are
38b0: 20 73 65 76 65 72 61 6c 20 77 65 20 6c 6f 6f 6b   several we look
38c0: 20 66 6f 72 20 74 68 65 0a 09 23 20 73 68 6f 72   for the..# shor
38d0: 74 65 73 74 20 74 69 6d 65 20 69 6e 74 65 72 76  test time interv
38e0: 61 6c 20 61 6d 6f 6e 67 20 74 68 65 6d 2e 20 49  al among them. I
38f0: 66 20 77 65 20 73 74 69 6c 6c 20 68 61 76 65 20  f we still have 
3900: 6d 75 6c 74 69 70 6c 65 0a 09 23 20 70 6f 73 73  multiple..# poss
3910: 69 62 69 6c 69 74 69 65 73 20 61 66 74 65 72 20  ibilities after 
3920: 74 68 61 74 20 77 65 20 73 65 6c 65 63 74 20 74  that we select t
3930: 68 65 20 65 61 72 6c 69 65 73 74 20 6c 6f 63 61  he earliest loca
3940: 74 69 6f 6e 0a 09 23 20 61 6d 6f 6e 67 20 74 68  tion..# among th
3950: 65 73 65 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 49  ese....# Note: I
3960: 66 20 74 68 65 20 6d 61 78 69 6d 61 6c 20 6e 75  f the maximal nu
3970: 6d 62 65 72 20 6f 66 20 63 72 6f 73 73 69 6e 67  mber of crossing
3980: 73 20 69 73 20 30 20 74 68 65 6e 20 74 68 65 20  s is 0 then the 
3990: 72 61 6e 67 65 0a 09 23 20 20 20 20 20 20 20 68  range..#       h
39a0: 61 73 20 6e 6f 20 69 6e 74 65 72 6e 61 6c 20 64  as no internal d
39b0: 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 6e 64  ependencies, and
39c0: 20 6e 6f 20 62 72 65 61 6b 20 6c 6f 63 61 74 69   no break locati
39d0: 6f 6e 20 61 74 0a 09 23 20 20 20 20 20 20 20 61  on at..#       a
39e0: 6c 6c 2e 20 54 68 69 73 20 70 6f 73 73 69 62 69  ll. This possibi
39f0: 6c 69 74 79 20 69 73 20 73 69 67 6e 61 6c 65 64  lity is signaled
3a00: 20 76 69 61 20 72 65 73 75 6c 74 20 2d 31 2e 0a   via result -1..
3a10: 0a 09 23 20 4e 6f 74 65 3a 20 41 20 72 61 6e 67  ..# Note: A rang
3a20: 65 20 6f 66 20 6c 65 6e 67 74 68 20 31 20 6f 72  e of length 1 or
3a30: 20 6c 65 73 73 20 63 61 6e 6e 6f 74 20 68 61 76   less cannot hav
3a40: 65 20 69 6e 74 65 72 6e 61 6c 0a 09 23 20 20 20  e internal..#   
3a50: 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65 73      dependencies
3a60: 2c 20 61 73 20 74 68 61 74 20 6e 65 65 64 73 20  , as that needs 
3a70: 61 74 20 6c 65 61 73 74 20 74 77 6f 20 72 65 76  at least two rev
3a80: 69 73 69 6f 6e 73 20 69 6e 0a 09 23 20 20 20 20  isions in..#    
3a90: 20 20 20 74 68 65 20 72 61 6e 67 65 2e 0a 0a 09     the range....
3aa0: 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 72 61  if {[llength $ra
3ab0: 6e 67 65 5d 20 3c 20 32 7d 20 7b 20 72 65 74 75  nge] < 2} { retu
3ac0: 72 6e 20 2d 31 20 7d 0a 0a 09 73 65 74 20 6d 61  rn -1 }...set ma
3ad0: 78 20 2d 31 0a 09 73 65 74 20 62 65 73 74 20 7b  x -1..set best {
3ae0: 7d 0a 0a 09 66 6f 72 65 61 63 68 20 6c 6f 63 61  }...foreach loca
3af0: 74 69 6f 6e 20 24 72 61 6e 67 65 20 7b 0a 09 20  tion $range {.. 
3b00: 20 20 20 73 65 74 20 63 72 6f 73 73 69 6e 67 73     set crossings
3b10: 20 24 63 72 6f 73 73 28 24 6c 6f 63 61 74 69 6f   $cross($locatio
3b20: 6e 29 0a 09 20 20 20 20 69 66 20 7b 24 63 72 6f  n)..    if {$cro
3b30: 73 73 69 6e 67 73 20 3e 20 24 6d 61 78 7d 20 7b  ssings > $max} {
3b40: 0a 09 09 73 65 74 20 6d 61 78 20 20 24 63 72 6f  ...set max  $cro
3b50: 73 73 69 6e 67 73 0a 09 09 73 65 74 20 62 65 73  ssings...set bes
3b60: 74 20 5b 6c 69 73 74 20 24 6c 6f 63 61 74 69 6f  t [list $locatio
3b70: 6e 5d 0a 09 09 63 6f 6e 74 69 6e 75 65 0a 09 20  n]...continue.. 
3b80: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 72     } elseif {$cr
3b90: 6f 73 73 69 6e 67 73 20 3d 3d 20 24 6d 61 78 7d  ossings == $max}
3ba0: 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 62 65 73   {...lappend bes
3bb0: 74 20 24 6c 6f 63 61 74 69 6f 6e 0a 09 20 20 20  t $location..   
3bc0: 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b 24 6d 61 78   }..}...if {$max
3bd0: 20 3d 3d 20 30 7d 20 20 20 20 20 20 20 20 20 20   == 0}          
3be0: 20 20 7b 20 72 65 74 75 72 6e 20 2d 31 20 7d 0a    { return -1 }.
3bf0: 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 62  .if {[llength $b
3c00: 65 73 74 5d 20 3d 3d 20 31 7d 20 7b 20 72 65 74  est] == 1} { ret
3c10: 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 62 65 73  urn [lindex $bes
3c20: 74 20 30 5d 20 7d 0a 0a 09 73 65 74 20 6c 6f 63  t 0] }...set loc
3c30: 61 74 69 6f 6e 73 20 24 62 65 73 74 0a 09 73 65  ations $best..se
3c40: 74 20 62 65 73 74 20 7b 7d 0a 09 73 65 74 20 6d  t best {}..set m
3c50: 69 6e 20 2d 31 0a 0a 09 66 6f 72 65 61 63 68 20  in -1...foreach 
3c60: 6c 6f 63 61 74 69 6f 6e 20 24 6c 6f 63 61 74 69  location $locati
3c70: 6f 6e 73 20 7b 0a 09 20 20 20 20 73 65 74 20 69  ons {..    set i
3c80: 6e 74 65 72 76 61 6c 20 24 64 65 6c 74 61 28 24  nterval $delta($
3c90: 6c 6f 63 61 74 69 6f 6e 29 0a 09 20 20 20 20 69  location)..    i
3ca0: 66 20 7b 28 24 6d 69 6e 20 3c 20 30 29 20 7c 7c  f {($min < 0) ||
3cb0: 20 28 24 69 6e 74 65 72 76 61 6c 20 3c 20 24 6d   ($interval < $m
3cc0: 69 6e 29 7d 20 7b 0a 09 09 73 65 74 20 6d 69 6e  in)} {...set min
3cd0: 20 20 24 69 6e 74 65 72 76 61 6c 0a 09 09 73 65    $interval...se
3ce0: 74 20 62 65 73 74 20 5b 6c 69 73 74 20 24 6c 6f  t best [list $lo
3cf0: 63 61 74 69 6f 6e 5d 0a 09 20 20 20 20 7d 20 65  cation]..    } e
3d00: 6c 73 65 69 66 20 7b 24 69 6e 74 65 72 76 61 6c  lseif {$interval
3d10: 20 3d 3d 20 24 6d 69 6e 7d 20 7b 0a 09 09 6c 61   == $min} {...la
3d20: 70 70 65 6e 64 20 62 65 73 74 20 24 6c 6f 63 61  ppend best $loca
3d30: 74 69 6f 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a  tion..    }..}..
3d40: 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 62  .if {[llength $b
3d50: 65 73 74 5d 20 3d 3d 20 31 7d 20 7b 20 72 65 74  est] == 1} { ret
3d60: 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 62 65 73  urn [lindex $bes
3d70: 74 20 30 5d 20 7d 0a 0a 09 72 65 74 75 72 6e 20  t 0] }...return 
3d80: 5b 6c 69 6e 64 65 78 20 5b 6c 73 6f 72 74 20 2d  [lindex [lsort -
3d90: 69 6e 74 65 67 65 72 20 2d 69 6e 63 72 65 61 73  integer -increas
3da0: 69 6e 67 20 24 62 65 73 74 5d 20 30 5d 0a 20 20  ing $best] 0].  
3db0: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 43 75    }..    proc Cu
3dc0: 74 41 74 20 7b 6c 6f 63 61 74 69 6f 6e 7d 20 7b  tAt {location} {
3dd0: 0a 09 75 70 76 61 72 20 31 20 63 72 6f 73 73 20  ..upvar 1 cross 
3de0: 63 72 6f 73 73 20 64 65 70 63 20 64 65 70 63 0a  cross depc depc.
3df0: 0a 09 23 20 49 74 20 77 61 73 20 64 65 63 69 64  ..# It was decid
3e00: 65 64 20 74 6f 20 73 70 6c 69 74 20 74 68 65 20  ed to split the 
3e10: 63 68 61 6e 67 65 73 65 74 20 61 74 20 74 68 65  changeset at the
3e20: 20 67 69 76 65 6e 0a 09 23 20 6c 6f 63 61 74 69   given..# locati
3e30: 6f 6e 2e 20 54 68 69 73 20 63 75 74 73 20 61 20  on. This cuts a 
3e40: 6e 75 6d 62 65 72 20 6f 66 20 64 65 70 65 6e 64  number of depend
3e50: 65 6e 63 69 65 73 2e 20 48 65 72 65 20 77 65 20  encies. Here we 
3e60: 75 70 64 61 74 65 0a 09 23 20 74 68 65 20 63 72  update..# the cr
3e70: 6f 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oss information 
3e80: 73 6f 20 74 68 61 74 20 74 68 65 20 62 72 65 61  so that the brea
3e90: 6b 20 66 69 6e 64 65 72 20 68 61 73 20 61 63 63  k finder has acc
3ea0: 75 72 61 74 65 0a 09 23 20 64 61 74 61 20 77 68  urate..# data wh
3eb0: 65 6e 20 77 65 20 6c 6f 6f 6b 20 61 74 20 74 68  en we look at th
3ec0: 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 61 67  e generated frag
3ed0: 6d 65 6e 74 73 2e 0a 0a 09 73 65 74 20 73 69 78  ments....set six
3ee0: 20 5b 6c 6f 67 20 76 69 73 69 62 6c 65 3f 20 36   [log visible? 6
3ef0: 5d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 64 65 70  ]...foreach {dep
3f00: 20 72 61 6e 67 65 7d 20 5b 61 72 72 61 79 20 67   range} [array g
3f10: 65 74 20 64 65 70 63 5d 20 7b 0a 09 20 20 20 20  et depc] {..    
3f20: 23 20 43 68 65 63 6b 20 61 6c 6c 20 64 65 70 65  # Check all depe
3f30: 6e 64 65 6e 63 69 65 73 20 73 74 69 6c 6c 20 6b  ndencies still k
3f40: 6e 6f 77 6e 2c 20 74 61 6b 65 20 74 68 65 69 72  nown, take their
3f50: 20 72 61 6e 67 65 20 61 6e 64 0a 09 20 20 20 20   range and..    
3f60: 23 20 73 65 65 20 69 66 20 74 68 65 20 62 72 65  # see if the bre
3f70: 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 66 61 6c 6c  ak location fall
3f80: 73 20 77 69 74 68 69 6e 2e 0a 0a 09 20 20 20 20  s within....    
3f90: 42 6f 72 64 65 72 20 24 72 61 6e 67 65 20 73 20  Border $range s 
3fa0: 65 0a 09 20 20 20 20 69 66 20 7b 24 6c 6f 63 61  e..    if {$loca
3fb0: 74 69 6f 6e 20 3c 20 24 73 7d 20 63 6f 6e 74 69  tion < $s} conti
3fc0: 6e 75 65 20 3b 20 23 20 62 72 65 61 6b 20 62 65  nue ; # break be
3fd0: 66 6f 72 65 20 72 61 6e 67 65 2c 20 69 67 6e 6f  fore range, igno
3fe0: 72 65 0a 09 20 20 20 20 69 66 20 7b 24 6c 6f 63  re..    if {$loc
3ff0: 61 74 69 6f 6e 20 3e 20 24 65 7d 20 63 6f 6e 74  ation > $e} cont
4000: 69 6e 75 65 20 3b 20 23 20 62 72 65 61 6b 20 61  inue ; # break a
4010: 66 74 65 72 20 72 61 6e 67 65 2c 20 69 67 6e 6f  fter range, igno
4020: 72 65 2e 0a 0a 09 20 20 20 20 23 20 54 68 69 73  re....    # This
4030: 20 64 65 70 65 6e 64 65 6e 63 79 20 63 72 6f 73   dependency cros
4040: 73 65 73 20 74 68 65 20 62 72 65 61 6b 20 6c 6f  ses the break lo
4050: 63 61 74 69 6f 6e 2e 20 57 65 20 72 65 6d 6f 76  cation. We remov
4060: 65 20 69 74 0a 09 20 20 20 20 23 20 66 72 6f 6d  e it..    # from
4070: 20 74 68 65 20 63 72 6f 73 73 69 6e 67 73 20 63   the crossings c
4080: 6f 75 6e 74 65 72 73 2c 20 61 6e 64 20 74 68 65  ounters, and the
4090: 6e 20 61 6c 73 6f 20 66 72 6f 6d 20 74 68 65 20  n also from the 
40a0: 73 65 74 0a 09 20 20 20 20 23 20 6f 66 20 6b 6e  set..    # of kn
40b0: 6f 77 6e 20 64 65 70 65 6e 64 65 6e 63 69 65 73  own dependencies
40c0: 2c 20 61 73 20 77 65 20 61 72 65 20 64 6f 6e 65  , as we are done
40d0: 20 77 69 74 68 20 69 74 2e 0a 0a 09 20 20 20 20   with it....    
40e0: 66 6f 72 65 61 63 68 20 6c 6f 63 20 24 64 65 70  foreach loc $dep
40f0: 63 28 24 64 65 70 29 20 7b 20 69 6e 63 72 20 63  c($dep) { incr c
4100: 72 6f 73 73 28 24 6c 6f 63 29 20 2d 31 20 7d 0a  ross($loc) -1 }.
4110: 09 20 20 20 20 75 6e 73 65 74 20 64 65 70 63 28  .    unset depc(
4120: 24 64 65 70 29 0a 0a 09 20 20 20 20 69 66 20 7b  $dep)...    if {
4130: 21 24 73 69 78 7d 20 63 6f 6e 74 69 6e 75 65 0a  !$six} continue.
4140: 0a 09 20 20 20 20 73 74 72 75 63 74 3a 3a 6c 69  ..    struct::li
4150: 73 74 20 61 73 73 69 67 6e 20 24 64 65 70 20 70  st assign $dep p
4160: 61 72 65 6e 74 20 63 68 69 6c 64 0a 09 20 20 20  arent child..   
4170: 20 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65   log write 6 cse
4180: 74 73 20 22 42 72 6f 6b 65 20 64 65 70 65 6e 64  ts "Broke depend
4190: 65 6e 63 79 20 5b 50 44 20 24 70 61 72 65 6e 74  ency [PD $parent
41a0: 5d 20 2d 2d 3e 20 5b 50 44 20 24 63 68 69 6c 64  ] --> [PD $child
41b0: 5d 22 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 0a 20  ]"..}...return. 
41c0: 20 20 20 7d 0a 0a 20 20 20 20 23 20 50 72 69 6e     }..    # Prin
41d0: 74 20 69 64 65 6e 74 69 66 79 69 6e 67 20 64 61  t identifying da
41e0: 74 61 20 66 6f 72 20 61 20 72 65 76 69 73 69 6f  ta for a revisio
41f0: 6e 20 28 70 72 6f 6a 65 63 74 2c 20 66 69 6c 65  n (project, file
4200: 2c 20 64 6f 74 74 65 64 20 72 65 76 0a 20 20 20  , dotted rev.   
4210: 20 23 20 6e 75 6d 62 65 72 29 2c 20 66 6f 72 20   # number), for 
4220: 68 69 67 68 20 76 65 72 62 6f 73 69 74 79 20 6c  high verbosity l
4230: 6f 67 20 6f 75 74 70 75 74 2e 0a 0a 20 20 20 20  og output...    
4240: 70 72 6f 63 20 50 44 20 7b 69 64 7d 20 7b 0a 09  proc PD {id} {..
4250: 66 6f 72 65 61 63 68 20 7b 70 20 66 20 72 7d 20  foreach {p f r} 
4260: 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 53  [state run {...S
4270: 45 4c 45 43 54 20 50 2e 6e 61 6d 65 20 2c 20 46  ELECT P.name , F
4280: 2e 6e 61 6d 65 2c 20 52 2e 72 65 76 0a 09 09 46  .name, R.rev...F
4290: 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c 20  ROM revision R, 
42a0: 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65 63 74 20  file F, project 
42b0: 50 0a 09 09 57 48 45 52 45 20 52 2e 72 69 64 20  P...WHERE R.rid 
42c0: 3d 20 24 69 64 0a 09 09 41 4e 44 20 20 20 52 2e  = $id...AND   R.
42d0: 66 69 64 20 3d 20 46 2e 66 69 64 0a 09 09 41 4e  fid = F.fid...AN
42e0: 44 20 20 20 46 2e 70 69 64 20 3d 20 50 2e 70 69  D   F.pid = P.pi
42f0: 64 0a 09 7d 5d 20 62 72 65 61 6b 0a 09 72 65 74  d..}] break..ret
4300: 75 72 6e 20 22 27 24 70 20 3a 20 24 66 2f 24 72  urn "'$p : $f/$r
4310: 27 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  '".    }..    # 
4320: 50 72 69 6e 74 69 6e 67 20 6f 6e 65 20 6f 72 20  Printing one or 
4330: 6d 6f 72 65 20 72 61 6e 67 65 73 2c 20 66 6f 72  more ranges, for
4340: 6d 61 74 74 65 64 2c 20 61 6e 64 20 6f 6e 6c 79  matted, and only
4350: 20 74 68 65 69 72 20 62 6f 72 64 65 72 20 74 6f   their border to
4360: 0a 20 20 20 20 23 20 6b 65 65 70 20 74 68 65 20  .    # keep the 
4370: 73 74 72 69 6e 67 73 20 73 68 6f 72 74 2e 0a 0a  strings short...
4380: 20 20 20 20 70 72 6f 63 20 50 52 73 20 7b 72 61      proc PRs {ra
4390: 6e 67 65 73 7d 20 7b 0a 09 72 65 74 75 72 6e 20  nges} {..return 
43a0: 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61  [struct::list ma
43b0: 70 20 24 72 61 6e 67 65 73 20 5b 6d 79 70 72 6f  p $ranges [mypro
43c0: 63 20 50 52 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20  c PR]].    }..  
43d0: 20 20 70 72 6f 63 20 50 52 20 7b 72 61 6e 67 65    proc PR {range
43e0: 7d 20 7b 0a 09 42 6f 72 64 65 72 20 24 72 61 6e  } {..Border $ran
43f0: 67 65 20 73 20 65 0a 09 72 65 74 75 72 6e 20 3c  ge s e..return <
4400: 24 7b 73 7d 2e 2e 2e 24 7b 65 7d 3e 0a 20 20 20  ${s}...${e}>.   
4410: 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 42 6f 72   }..    proc Bor
4420: 64 65 72 20 7b 72 61 6e 67 65 20 73 76 20 65 76  der {range sv ev
4430: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 73 76  } {..upvar 1 $sv
4440: 20 73 20 24 65 76 20 65 0a 09 73 65 74 20 73 20   s $ev e..set s 
4450: 5b 6c 69 6e 64 65 78 20 24 72 61 6e 67 65 20 30  [lindex $range 0
4460: 5d 0a 09 73 65 74 20 65 20 5b 6c 69 6e 64 65 78  ]..set e [lindex
4470: 20 24 72 61 6e 67 65 20 65 6e 64 5d 0a 09 72 65   $range end]..re
4480: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
4490: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
44a0: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
44b0: 23 23 23 23 23 23 23 0a 0a 20 20 20 20 74 79 70  #######..    typ
44c0: 65 76 61 72 69 61 62 6c 65 20 6d 79 63 68 61 6e  evariable mychan
44d0: 67 65 73 65 74 73 20 20 20 20 7b 7d 20 3b 20 23  gesets    {} ; #
44e0: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 6b 6e 6f   List of all kno
44f0: 77 6e 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 20  wn changesets.. 
4500: 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20     typevariable 
4510: 6d 79 72 65 76 6d 61 70 20 2d 61 72 72 61 79 20  myrevmap -array 
4520: 7b 7d 20 3b 20 23 20 4d 61 70 20 66 72 6f 6d 20  {} ; # Map from 
4530: 72 65 76 69 73 69 6f 6e 73 20 74 6f 20 74 68 65  revisions to the
4540: 69 72 20 63 68 61 6e 67 65 73 65 74 2e 0a 20 20  ir changeset..  
4550: 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d    typevariable m
4560: 79 69 64 6d 61 70 20 20 2d 61 72 72 61 79 20 7b  yidmap  -array {
4570: 7d 20 3b 20 23 20 4d 61 70 20 66 72 6f 6d 20 63  } ; # Map from c
4580: 68 61 6e 67 65 73 65 74 20 69 64 20 74 6f 20 63  hangeset id to c
4590: 68 61 6e 67 65 73 65 74 2e 0a 20 20 20 20 74 79  hangeset..    ty
45a0: 70 65 76 61 72 69 61 62 6c 65 20 6d 79 62 72 61  pevariable mybra
45b0: 6e 63 68 63 6f 64 65 20 20 20 20 7b 7d 20 3b 20  nchcode    {} ; 
45c0: 23 20 4c 6f 63 61 6c 20 63 6f 70 79 20 6f 66 20  # Local copy of 
45d0: 70 72 6f 6a 65 63 74 3a 3a 73 79 6d 2f 6d 79 62  project::sym/myb
45e0: 72 61 6e 63 68 2e 0a 0a 20 20 20 20 74 79 70 65  ranch...    type
45f0: 6d 65 74 68 6f 64 20 61 6c 6c 20 7b 7d 20 20 20  method all {}   
4600: 7b 20 72 65 74 75 72 6e 20 24 6d 79 63 68 61 6e  { return $mychan
4610: 67 65 73 65 74 73 20 7d 0a 20 20 20 20 74 79 70  gesets }.    typ
4620: 65 6d 65 74 68 6f 64 20 6f 66 20 20 7b 69 64 7d  emethod of  {id}
4630: 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 64 6d   { return $myidm
4640: 61 70 28 24 69 64 29 20 7d 0a 0a 20 20 20 20 74  ap($id) }..    t
4650: 79 70 65 63 6f 6e 73 74 72 75 63 74 6f 72 20 7b  ypeconstructor {
4660: 0a 09 73 65 74 20 6d 79 62 72 61 6e 63 68 63 6f  ..set mybranchco
4670: 64 65 20 5b 70 72 6f 6a 65 63 74 3a 3a 73 79 6d  de [project::sym
4680: 20 62 72 61 6e 63 68 5d 0a 09 72 65 74 75 72 6e   branch]..return
4690: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20  .    }..    # # 
46a0: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
46b0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
46c0: 23 23 23 0a 20 20 20 20 23 23 20 43 6f 6e 66 69  ###.    ## Confi
46d0: 67 75 72 61 74 69 6f 6e 0a 0a 20 20 20 20 70 72  guration..    pr
46e0: 61 67 6d 61 20 2d 68 61 73 74 79 70 65 69 6e 66  agma -hastypeinf
46f0: 6f 20 20 20 20 6e 6f 20 20 3b 20 23 20 6e 6f 20  o    no  ; # no 
4700: 74 79 70 65 20 69 6e 74 72 6f 73 70 65 63 74 69  type introspecti
4710: 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68  on.    pragma -h
4720: 61 73 69 6e 66 6f 20 20 20 20 20 20 20 20 6e 6f  asinfo        no
4730: 20 20 3b 20 23 20 6e 6f 20 6f 62 6a 65 63 74 20    ; # no object 
4740: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20 20  introspection.  
4750: 20 20 70 72 61 67 6d 61 20 2d 73 69 6d 70 6c 65    pragma -simple
4760: 64 69 73 70 61 74 63 68 20 79 65 73 20 3b 20 23  dispatch yes ; #
4770: 20 73 69 6d 70 6c 65 20 66 61 73 74 20 64 69 73   simple fast dis
4780: 70 61 74 63 68 0a 0a 20 20 20 20 23 20 23 20 23  patch..    # # #
4790: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
47a0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
47b0: 23 23 0a 7d 0a 0a 6e 61 6d 65 73 70 61 63 65 20  ##.}..namespace 
47c0: 65 76 61 6c 20 3a 3a 76 63 3a 3a 66 6f 73 73 69  eval ::vc::fossi
47d0: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a  l::import::cvs::
47e0: 70 72 6f 6a 65 63 74 20 7b 0a 20 20 20 20 6e 61  project {.    na
47f0: 6d 65 73 70 61 63 65 20 65 78 70 6f 72 74 20 72  mespace export r
4800: 65 76 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65  ev.    namespace
4810: 20 65 76 61 6c 20 72 65 76 20 7b 0a 09 6e 61 6d   eval rev {..nam
4820: 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a  espace import ::
4830: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f  vc::fossil::impo
4840: 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09  rt::cvs::state..
4850: 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 70  namespace eval p
4860: 72 6f 6a 65 63 74 20 7b 0a 09 20 20 20 20 6e 61  roject {..    na
4870: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
4880: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70  :vc::fossil::imp
4890: 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63  ort::cvs::projec
48a0: 74 3a 3a 73 79 6d 0a 09 7d 0a 09 6e 61 6d 65 73  t::sym..}..names
48b0: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63  pace import ::vc
48c0: 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69 73 63 3a 3a 2a  ::tools::misc::*
48d0: 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f  ..namespace impo
48e0: 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a  rt ::vc::tools::
48f0: 74 72 6f 75 62 6c 65 0a 09 6e 61 6d 65 73 70 61  trouble..namespa
4900: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a  ce import ::vc::
4910: 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 6c 6f 67 20  tools::log..log 
4920: 72 65 67 69 73 74 65 72 20 63 73 65 74 73 0a 20  register csets. 
4930: 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23     }.}..# # ## #
4940: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
4950: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20  # ############# 
4960: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4970: 23 23 23 23 23 0a 23 23 20 52 65 61 64 79 0a 0a  #####.## Ready..
4980: 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20  package provide 
4990: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f  vc::fossil::impo
49a0: 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74  rt::cvs::project
49b0: 3a 3a 72 65 76 20 31 2e 30 0a 72 65 74 75 72 6e  ::rev 1.0.return
49c0: 0a                                               .