Hex Artifact Content
Not logged in

Artifact 15d330b01f73e588bd0b4a28a211d0f5deabf424:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [70d2283564] - Moved the existing successor/predecessor code from main class to the proper singleton. Fixed config of main class, isn't simple dispatch any longer. Simplified calculation of the readable representation of changesets and removed code which has become superfluous. by aku on 2007-11-29 06:58:08.

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 69 6e 74 65 67 72 69 74 79  ::cvs::integrity
04c0: 20 20 20 20 3b 20 23 20 53 74 61 74 65 20 69 6e      ; # State in
04d0: 74 65 67 72 69 74 79 20 63 68 65 63 6b 73 2e 0a  tegrity checks..
04e0: 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23  .# # ## ### ####
04f0: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
0500: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
0510: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23  ##############.#
0520: 23 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20 3a 3a  #..snit::type ::
0530: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f  vc::fossil::impo
0540: 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74  rt::cvs::project
0550: 3a 3a 72 65 76 20 7b 0a 20 20 20 20 23 20 23 20  ::rev {.    # # 
0560: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
0570: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
0580: 23 23 23 0a 20 20 20 20 23 23 20 50 75 62 6c 69  ###.    ## Publi
0590: 63 20 41 50 49 0a 0a 20 20 20 20 63 6f 6e 73 74  c API..    const
05a0: 72 75 63 74 6f 72 20 7b 70 72 6f 6a 65 63 74 20  ructor {project 
05b0: 63 73 74 79 70 65 20 73 72 63 69 64 20 72 65 76  cstype srcid rev
05c0: 69 73 69 6f 6e 73 20 7b 74 68 65 69 64 20 7b 7d  isions {theid {}
05d0: 7d 7d 20 7b 0a 09 69 66 20 7b 24 74 68 65 69 64  }} {..if {$theid
05e0: 20 6e 65 20 22 22 7d 20 7b 0a 09 20 20 20 20 73   ne ""} {..    s
05f0: 65 74 20 6d 79 69 64 20 24 74 68 65 69 64 0a 09  et myid $theid..
0600: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 73 65  } else {..    se
0610: 74 20 6d 79 69 64 20 5b 69 6e 63 72 20 6d 79 63  t myid [incr myc
0620: 6f 75 6e 74 65 72 5d 0a 09 7d 0a 0a 09 69 6e 74  ounter]..}...int
0630: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 5b  egrity assert {[
0640: 69 6e 66 6f 20 65 78 69 73 74 73 20 6d 79 63 73  info exists mycs
0650: 74 79 70 65 28 24 63 73 74 79 70 65 29 5d 7d 20  type($cstype)]} 
0660: 7b 42 61 64 20 63 68 61 6e 67 65 73 65 74 20 74  {Bad changeset t
0670: 79 70 65 20 27 24 63 73 74 79 70 65 27 2e 7d 0a  ype '$cstype'.}.
0680: 0a 09 73 65 74 20 6d 79 70 72 6f 6a 65 63 74 20  ..set myproject 
0690: 20 20 24 70 72 6f 6a 65 63 74 0a 09 73 65 74 20    $project..set 
06a0: 6d 79 74 79 70 65 20 20 20 20 20 20 24 63 73 74  mytype      $cst
06b0: 79 70 65 0a 09 73 65 74 20 6d 79 74 79 70 65 6f  ype..set mytypeo
06c0: 62 6a 20 20 20 3a 3a 76 63 3a 3a 66 6f 73 73 69  bj   ::vc::fossi
06d0: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a  l::import::cvs::
06e0: 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 24 7b  project::rev::${
06f0: 63 73 74 79 70 65 7d 0a 09 73 65 74 20 6d 79 73  cstype}..set mys
0700: 72 63 69 64 09 24 73 72 63 69 64 0a 09 73 65 74  rcid.$srcid..set
0710: 20 6d 79 72 65 76 69 73 69 6f 6e 73 20 24 72 65   myrevisions $re
0720: 76 69 73 69 6f 6e 73 0a 09 73 65 74 20 6d 79 70  visions..set myp
0730: 6f 73 20 20 20 20 20 20 20 7b 7d 20 3b 20 23 20  os       {} ; # 
0740: 43 6f 6d 6d 69 74 20 6c 6f 63 61 74 69 6f 6e 20  Commit location 
0750: 69 73 20 6e 6f 74 20 6b 6e 6f 77 6e 20 79 65 74  is not known yet
0760: 2e 0a 0a 09 23 20 4b 65 65 70 20 74 72 61 63 6b  ....# Keep track
0770: 20 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65   of the generate
0780: 64 20 63 68 61 6e 67 65 73 65 74 73 20 61 6e 64  d changesets and
0790: 20 6f 66 20 74 68 65 20 69 6e 76 65 72 73 65 0a   of the inverse.
07a0: 09 23 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20  .# mapping from 
07b0: 72 65 76 69 73 69 6f 6e 73 20 74 6f 20 74 68 65  revisions to the
07c0: 6d 2e 0a 09 6c 61 70 70 65 6e 64 20 6d 79 63 68  m...lappend mych
07d0: 61 6e 67 65 73 65 74 73 20 20 20 24 73 65 6c 66  angesets   $self
07e0: 0a 09 73 65 74 20 20 20 20 20 6d 79 69 64 6d 61  ..set     myidma
07f0: 70 28 24 6d 79 69 64 29 20 24 73 65 6c 66 0a 09  p($myid) $self..
0800: 66 6f 72 65 61 63 68 20 72 20 24 72 65 76 69 73  foreach r $revis
0810: 69 6f 6e 73 20 7b 20 6c 61 70 70 65 6e 64 20 6d  ions { lappend m
0820: 79 72 65 76 6d 61 70 28 24 72 29 20 24 73 65 6c  yrevmap($r) $sel
0830: 66 20 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  f }..return.    
0840: 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 74  }..    method st
0850: 72 20 7b 7d 20 7b 0a 09 73 65 74 20 73 74 72 20  r {} {..set str 
0860: 20 20 20 22 3c 22 0a 09 73 65 74 20 64 65 74 61     "<"..set deta
0870: 69 6c 20 22 22 0a 09 69 66 20 7b 5b 24 6d 79 74  il ""..if {[$myt
0880: 79 70 65 6f 62 6a 20 62 79 73 79 6d 62 6f 6c 5d  ypeobj bysymbol]
0890: 7d 20 7b 0a 09 20 20 20 20 73 65 74 20 64 65 74  } {..    set det
08a0: 61 69 6c 20 22 20 27 5b 73 74 61 74 65 20 6f 6e  ail " '[state on
08b0: 65 20 7b 0a 09 09 53 45 4c 45 43 54 20 53 2e 6e  e {...SELECT S.n
08c0: 61 6d 65 0a 09 09 46 52 4f 4d 20 20 20 73 79 6d  ame...FROM   sym
08d0: 62 6f 6c 20 53 0a 09 09 57 48 45 52 45 20 20 53  bol S...WHERE  S
08e0: 2e 73 69 64 20 3d 20 24 6d 79 73 72 63 69 64 0a  .sid = $mysrcid.
08f0: 09 20 20 20 20 7d 5d 27 22 0a 09 7d 0a 09 61 70  .    }]'"..}..ap
0900: 70 65 6e 64 20 73 74 72 20 22 24 6d 79 74 79 70  pend str "$mytyp
0910: 65 20 24 7b 6d 79 69 64 7d 24 7b 64 65 74 61 69  e ${myid}${detai
0920: 6c 7d 3e 22 0a 09 72 65 74 75 72 6e 20 24 73 74  l}>"..return $st
0930: 72 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74  r.    }..    met
0940: 68 6f 64 20 69 64 20 20 20 20 20 20 20 20 7b 7d  hod id        {}
0950: 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 64 20   { return $myid 
0960: 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20 72 65 76  }.    method rev
0970: 69 73 69 6f 6e 73 20 7b 7d 20 7b 20 72 65 74 75  isions {} { retu
0980: 72 6e 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 20  rn $myrevisions 
0990: 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20 64 61 74  }.    method dat
09a0: 61 20 20 20 20 20 20 7b 7d 20 7b 20 72 65 74 75  a      {} { retu
09b0: 72 6e 20 5b 6c 69 73 74 20 24 6d 79 70 72 6f 6a  rn [list $myproj
09c0: 65 63 74 20 24 6d 79 74 79 70 65 20 24 6d 79 73  ect $mytype $mys
09d0: 72 63 69 64 5d 20 7d 0a 0a 20 20 20 20 64 65 6c  rcid] }..    del
09e0: 65 67 61 74 65 20 6d 65 74 68 6f 64 20 62 79 73  egate method bys
09f0: 79 6d 62 6f 6c 20 20 20 74 6f 20 6d 79 74 79 70  ymbol   to mytyp
0a00: 65 6f 62 6a 0a 20 20 20 20 64 65 6c 65 67 61 74  eobj.    delegat
0a10: 65 20 6d 65 74 68 6f 64 20 62 79 72 65 76 69 73  e method byrevis
0a20: 69 6f 6e 20 74 6f 20 6d 79 74 79 70 65 6f 62 6a  ion to mytypeobj
0a30: 0a 20 20 20 20 64 65 6c 65 67 61 74 65 20 6d 65  .    delegate me
0a40: 74 68 6f 64 20 69 73 62 72 61 6e 63 68 20 20 20  thod isbranch   
0a50: 74 6f 20 6d 79 74 79 70 65 6f 62 6a 0a 20 20 20  to mytypeobj.   
0a60: 20 64 65 6c 65 67 61 74 65 20 6d 65 74 68 6f 64   delegate method
0a70: 20 69 73 74 61 67 20 20 20 20 20 20 74 6f 20 6d   istag      to m
0a80: 79 74 79 70 65 6f 62 6a 0a 0a 20 20 20 20 6d 65  ytypeobj..    me
0a90: 74 68 6f 64 20 73 65 74 70 6f 73 20 7b 70 7d 20  thod setpos {p} 
0aa0: 7b 20 73 65 74 20 6d 79 70 6f 73 20 24 70 20 3b  { set mypos $p ;
0ab0: 20 72 65 74 75 72 6e 20 7d 0a 20 20 20 20 6d 65   return }.    me
0ac0: 74 68 6f 64 20 70 6f 73 20 20 20 20 7b 7d 20 20  thod pos    {}  
0ad0: 7b 20 72 65 74 75 72 6e 20 24 6d 79 70 6f 73 20  { return $mypos 
0ae0: 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20  }..    # result 
0af0: 3d 20 64 69 63 74 20 28 72 65 76 69 73 69 6f 6e  = dict (revision
0b00: 20 2d 3e 20 6c 69 73 74 20 28 63 68 61 6e 67 65   -> list (change
0b10: 73 65 74 29 29 0a 20 20 20 20 6d 65 74 68 6f 64  set)).    method
0b20: 20 73 75 63 63 65 73 73 6f 72 6d 61 70 20 7b 7d   successormap {}
0b30: 20 7b 0a 09 23 20 4e 4f 54 45 20 2f 20 46 55 54   {..# NOTE / FUT
0b40: 55 52 45 3a 20 50 6f 73 73 69 62 6c 65 20 62 6f  URE: Possible bo
0b50: 74 74 6c 65 6e 65 63 6b 2e 0a 09 61 72 72 61 79  ttleneck...array
0b60: 20 73 65 74 20 74 6d 70 20 7b 7d 0a 09 66 6f 72   set tmp {}..for
0b70: 65 61 63 68 20 7b 72 65 76 20 63 68 69 6c 64 72  each {rev childr
0b80: 65 6e 7d 20 5b 24 73 65 6c 66 20 6e 65 78 74 6d  en} [$self nextm
0b90: 61 70 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65 61  ap] {..    forea
0ba0: 63 68 20 63 68 69 6c 64 20 24 63 68 69 6c 64 72  ch child $childr
0bb0: 65 6e 20 7b 0a 09 09 23 20 38 2e 35 20 6c 61 70  en {...# 8.5 lap
0bc0: 70 65 6e 64 20 74 6d 70 28 24 72 65 76 29 20 7b  pend tmp($rev) {
0bd0: 2a 7d 24 6d 79 72 65 76 6d 61 70 28 24 63 68 69  *}$myrevmap($chi
0be0: 6c 64 29 0a 09 09 66 6f 72 65 61 63 68 20 63 73  ld)...foreach cs
0bf0: 65 74 20 24 6d 79 72 65 76 6d 61 70 28 24 63 68  et $myrevmap($ch
0c00: 69 6c 64 29 20 7b 0a 09 09 20 20 20 20 6c 61 70  ild) {...    lap
0c10: 70 65 6e 64 20 74 6d 70 28 24 72 65 76 29 20 24  pend tmp($rev) $
0c20: 63 73 65 74 0a 09 09 7d 0a 09 20 20 20 20 7d 0a  cset...}..    }.
0c30: 09 20 20 20 20 73 65 74 20 74 6d 70 28 24 72 65  .    set tmp($re
0c40: 76 29 20 5b 6c 73 6f 72 74 20 2d 75 6e 69 71 75  v) [lsort -uniqu
0c50: 65 20 24 74 6d 70 28 24 72 65 76 29 5d 0a 09 7d  e $tmp($rev)]..}
0c60: 0a 09 72 65 74 75 72 6e 20 5b 61 72 72 61 79 20  ..return [array 
0c70: 67 65 74 20 74 6d 70 5d 0a 20 20 20 20 7d 0a 0a  get tmp].    }..
0c80: 20 20 20 20 6d 65 74 68 6f 64 20 73 75 63 63 65      method succe
0c90: 73 73 6f 72 73 20 7b 7d 20 7b 0a 09 23 20 4e 4f  ssors {} {..# NO
0ca0: 54 45 20 2f 20 46 55 54 55 52 45 3a 20 50 6f 73  TE / FUTURE: Pos
0cb0: 73 69 62 6c 65 20 62 6f 74 74 6c 65 6e 65 63 6b  sible bottleneck
0cc0: 2e 0a 09 73 65 74 20 63 73 65 74 73 20 7b 7d 0a  ...set csets {}.
0cd0: 09 66 6f 72 65 61 63 68 20 7b 5f 20 63 68 69 6c  .foreach {_ chil
0ce0: 64 72 65 6e 7d 20 5b 24 73 65 6c 66 20 6e 65 78  dren} [$self nex
0cf0: 74 6d 61 70 5d 20 7b 0a 09 20 20 20 20 66 6f 72  tmap] {..    for
0d00: 65 61 63 68 20 63 68 69 6c 64 20 24 63 68 69 6c  each child $chil
0d10: 64 72 65 6e 20 7b 0a 09 09 23 20 38 2e 35 20 6c  dren {...# 8.5 l
0d20: 61 70 70 65 6e 64 20 63 73 65 74 73 20 7b 2a 7d  append csets {*}
0d30: 24 6d 79 72 65 76 6d 61 70 28 24 63 68 69 6c 64  $myrevmap($child
0d40: 29 0a 09 09 66 6f 72 65 61 63 68 20 63 73 65 74  )...foreach cset
0d50: 20 24 6d 79 72 65 76 6d 61 70 28 24 63 68 69 6c   $myrevmap($chil
0d60: 64 29 20 7b 0a 09 09 20 20 20 20 6c 61 70 70 65  d) {...    lappe
0d70: 6e 64 20 63 73 65 74 73 20 24 63 73 65 74 0a 09  nd csets $cset..
0d80: 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72 65  .}..    }..}..re
0d90: 74 75 72 6e 20 5b 6c 73 6f 72 74 20 2d 75 6e 69  turn [lsort -uni
0da0: 71 75 65 20 24 63 73 65 74 73 5d 0a 20 20 20 20  que $csets].    
0db0: 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20  }..    # result 
0dc0: 3d 20 64 69 63 74 20 28 72 65 76 69 73 69 6f 6e  = dict (revision
0dd0: 20 2d 3e 20 6c 69 73 74 20 28 63 68 61 6e 67 65   -> list (change
0de0: 73 65 74 29 29 0a 20 20 20 20 6d 65 74 68 6f 64  set)).    method
0df0: 20 70 72 65 64 65 63 65 73 73 6f 72 6d 61 70 20   predecessormap 
0e00: 7b 7d 20 7b 0a 09 23 20 4e 4f 54 45 20 2f 20 46  {} {..# NOTE / F
0e10: 55 54 55 52 45 3a 20 50 6f 73 73 69 62 6c 65 20  UTURE: Possible 
0e20: 62 6f 74 74 6c 65 6e 65 63 6b 2e 0a 09 61 72 72  bottleneck...arr
0e30: 61 79 20 73 65 74 20 74 6d 70 20 7b 7d 0a 09 66  ay set tmp {}..f
0e40: 6f 72 65 61 63 68 20 7b 72 65 76 20 63 68 69 6c  oreach {rev chil
0e50: 64 72 65 6e 7d 20 5b 24 73 65 6c 66 20 70 72 65  dren} [$self pre
0e60: 6d 61 70 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65  map] {..    fore
0e70: 61 63 68 20 63 68 69 6c 64 20 24 63 68 69 6c 64  ach child $child
0e80: 72 65 6e 20 7b 0a 09 09 23 20 38 2e 35 20 6c 61  ren {...# 8.5 la
0e90: 70 70 65 6e 64 20 74 6d 70 28 24 72 65 76 29 20  ppend tmp($rev) 
0ea0: 7b 2a 7d 24 6d 79 72 65 76 6d 61 70 28 24 63 68  {*}$myrevmap($ch
0eb0: 69 6c 64 29 0a 09 09 66 6f 72 65 61 63 68 20 63  ild)...foreach c
0ec0: 73 65 74 20 24 6d 79 72 65 76 6d 61 70 28 24 63  set $myrevmap($c
0ed0: 68 69 6c 64 29 20 7b 0a 09 09 20 20 20 20 6c 61  hild) {...    la
0ee0: 70 70 65 6e 64 20 74 6d 70 28 24 72 65 76 29 20  ppend tmp($rev) 
0ef0: 24 63 73 65 74 0a 09 09 7d 0a 09 20 20 20 20 7d  $cset...}..    }
0f00: 0a 09 20 20 20 20 73 65 74 20 74 6d 70 28 24 72  ..    set tmp($r
0f10: 65 76 29 20 5b 6c 73 6f 72 74 20 2d 75 6e 69 71  ev) [lsort -uniq
0f20: 75 65 20 24 74 6d 70 28 24 72 65 76 29 5d 0a 09  ue $tmp($rev)]..
0f30: 7d 0a 09 72 65 74 75 72 6e 20 5b 61 72 72 61 79  }..return [array
0f40: 20 67 65 74 20 74 6d 70 5d 0a 20 20 20 20 7d 0a   get tmp].    }.
0f50: 0a 20 20 20 20 23 20 72 65 76 69 73 69 6f 6e 20  .    # revision 
0f60: 2d 3e 20 6c 69 73 74 20 28 72 65 76 69 73 69 6f  -> list (revisio
0f70: 6e 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 6e 65  n).    method ne
0f80: 78 74 6d 61 70 20 7b 7d 20 7b 0a 09 69 66 20 7b  xtmap {} {..if {
0f90: 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 6e 65 78 74  [llength $mynext
0fa0: 6d 61 70 5d 7d 20 7b 20 72 65 74 75 72 6e 20 24  map]} { return $
0fb0: 6d 79 6e 65 78 74 6d 61 70 20 7d 0a 09 24 6d 79  mynextmap }..$my
0fc0: 74 79 70 65 6f 62 6a 20 73 75 63 63 65 73 73 6f  typeobj successo
0fd0: 72 73 20 74 6d 70 20 24 6d 79 72 65 76 69 73 69  rs tmp $myrevisi
0fe0: 6f 6e 73 0a 09 73 65 74 20 6d 79 6e 65 78 74 6d  ons..set mynextm
0ff0: 61 70 20 5b 61 72 72 61 79 20 67 65 74 20 74 6d  ap [array get tm
1000: 70 5d 0a 09 72 65 74 75 72 6e 20 24 6d 79 6e 65  p]..return $myne
1010: 78 74 6d 61 70 0a 20 20 20 20 7d 0a 0a 20 20 20  xtmap.    }..   
1020: 20 23 20 72 65 76 69 73 69 6f 6e 20 2d 3e 20 6c   # revision -> l
1030: 69 73 74 20 28 72 65 76 69 73 69 6f 6e 29 0a 20  ist (revision). 
1040: 20 20 20 6d 65 74 68 6f 64 20 70 72 65 6d 61 70     method premap
1050: 20 7b 7d 20 7b 0a 09 69 66 20 7b 5b 6c 6c 65 6e   {} {..if {[llen
1060: 67 74 68 20 24 6d 79 70 72 65 6d 61 70 5d 7d 20  gth $mypremap]} 
1070: 7b 20 72 65 74 75 72 6e 20 24 6d 79 70 72 65 6d  { return $myprem
1080: 61 70 20 7d 0a 09 24 6d 79 74 79 70 65 6f 62 6a  ap }..$mytypeobj
1090: 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 74 6d   predecessors tm
10a0: 70 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 0a 09  p $myrevisions..
10b0: 73 65 74 20 6d 79 70 72 65 6d 61 70 20 5b 61 72  set mypremap [ar
10c0: 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 09 72 65  ray get tmp]..re
10d0: 74 75 72 6e 20 24 6d 79 70 72 65 6d 61 70 0a 20  turn $mypremap. 
10e0: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64     }..    method
10f0: 20 62 72 65 61 6b 69 6e 74 65 72 6e 61 6c 64 65   breakinternalde
1100: 70 65 6e 64 65 6e 63 69 65 73 20 7b 7d 20 7b 0a  pendencies {} {.
1110: 09 23 20 54 68 69 73 20 6d 65 74 68 6f 64 20 69  .# This method i
1120: 6e 73 70 65 63 74 73 20 74 68 65 20 63 68 61 6e  nspects the chan
1130: 67 65 73 65 74 73 20 66 6f 72 20 69 6e 74 65 72  gesets for inter
1140: 6e 61 6c 0a 09 23 20 64 65 70 65 6e 64 65 6e 63  nal..# dependenc
1150: 69 65 73 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20  ies. Nothing is 
1160: 64 6f 6e 65 20 69 66 20 74 68 65 72 65 20 61 72  done if there ar
1170: 65 20 6e 6f 0a 09 23 20 73 75 63 68 2e 20 4f 74  e no..# such. Ot
1180: 68 65 72 77 69 73 65 20 74 68 65 20 63 68 61 6e  herwise the chan
1190: 67 65 73 65 74 20 69 73 20 73 70 6c 69 74 20 69  geset is split i
11a0: 6e 74 6f 20 61 20 73 65 74 20 6f 66 0a 09 23 20  nto a set of..# 
11b0: 66 72 61 67 6d 65 6e 74 73 20 77 69 74 68 6f 75  fragments withou
11c0: 74 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e  t internal depen
11d0: 64 65 6e 63 69 65 73 2c 20 74 72 61 6e 73 66 6f  dencies, transfo
11e0: 72 6d 69 6e 67 20 74 68 65 0a 09 23 20 69 6e 74  rming the..# int
11f0: 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69  ernal dependenci
1200: 65 73 20 69 6e 74 6f 20 65 78 74 65 72 6e 61 6c  es into external
1210: 20 6f 6e 65 73 2e 20 54 68 65 20 6e 65 77 20 63   ones. The new c
1220: 68 61 6e 67 65 73 65 74 73 0a 09 23 20 61 72 65  hangesets..# are
1230: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69   added to the li
1240: 73 74 20 6f 66 20 61 6c 6c 20 63 68 61 6e 67 65  st of all change
1250: 73 65 74 73 2e 0a 0a 09 23 20 57 65 20 70 65 72  sets....# We per
1260: 66 6f 72 6d 20 61 6c 6c 20 6e 65 63 65 73 73 61  form all necessa
1270: 72 79 20 73 70 6c 69 74 73 20 69 6e 20 6f 6e 65  ry splits in one
1280: 20 67 6f 2c 20 69 6e 73 74 65 61 64 20 6f 66 20   go, instead of 
1290: 6f 6e 6c 79 0a 09 23 20 6f 6e 65 2e 20 54 68 65  only..# one. The
12a0: 20 70 72 65 76 69 6f 75 73 20 61 6c 67 6f 72 69   previous algori
12b0: 74 68 6d 2c 20 61 64 61 70 74 65 64 20 66 72 6f  thm, adapted fro
12c0: 6d 20 63 76 73 32 73 76 6e 2c 20 63 6f 6d 70 75  m cvs2svn, compu
12d0: 74 65 64 0a 09 23 20 61 20 6c 6f 74 20 6f 66 20  ted..# a lot of 
12e0: 73 74 61 74 65 20 77 68 69 63 68 20 77 61 73 20  state which was 
12f0: 74 68 72 6f 77 6e 20 61 77 61 79 20 61 6e 64 20  thrown away and 
1300: 74 68 65 6e 20 63 6f 6d 70 75 74 65 64 20 61 67  then computed ag
1310: 61 69 6e 0a 09 23 20 66 6f 72 20 65 61 63 68 20  ain..# for each 
1320: 6f 66 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73  of the fragments
1330: 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 65  . It should be e
1340: 61 73 69 65 72 20 74 6f 20 75 70 64 61 74 65 20  asier to update 
1350: 61 6e 64 0a 09 23 20 72 65 75 73 65 20 74 68 61  and..# reuse tha
1360: 74 20 73 74 61 74 65 2e 0a 0a 09 23 20 54 68 65  t state....# The
1370: 20 63 6f 64 65 20 63 68 65 63 6b 73 20 6f 6e 6c   code checks onl
1380: 79 20 73 75 63 65 73 73 6f 72 20 64 65 70 65 6e  y sucessor depen
1390: 64 65 6e 63 69 65 73 2c 20 61 73 20 74 68 69 73  dencies, as this
13a0: 0a 09 23 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c  ..# automaticall
13b0: 79 20 63 6f 76 65 72 73 20 74 68 65 20 70 72 65  y covers the pre
13c0: 64 65 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65  decessor depende
13d0: 6e 63 69 65 73 20 61 73 20 77 65 6c 6c 20 28 41  ncies as well (A
13e0: 0a 09 23 20 73 75 63 63 65 73 73 6f 72 20 64 65  ..# successor de
13f0: 70 65 6e 64 65 6e 63 79 20 61 20 2d 3e 20 62 20  pendency a -> b 
1400: 69 73 20 61 6c 73 6f 20 61 20 70 72 65 64 65 63  is also a predec
1410: 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 79  essor dependency
1420: 0a 09 23 20 62 20 2d 3e 20 61 29 2e 0a 0a 09 23  ..# b -> a)....#
1430: 20 41 72 72 61 79 20 6f 66 20 64 65 70 65 6e 64   Array of depend
1440: 65 6e 63 69 65 73 20 28 70 61 72 65 6e 74 20 2d  encies (parent -
1450: 3e 20 63 68 69 6c 64 29 2e 20 54 68 69 73 20 69  > child). This i
1460: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 0a 09 23  s pulled from..#
1470: 20 74 68 65 20 73 74 61 74 65 2c 20 61 6e 64 20   the state, and 
1480: 6c 69 6d 69 74 65 64 20 74 6f 20 73 75 63 63 65  limited to succe
1490: 73 73 6f 72 73 20 77 69 74 68 69 6e 20 74 68 65  ssors within the
14a0: 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 61 72   changeset....ar
14b0: 72 61 79 20 73 65 74 20 64 65 70 65 6e 64 65 6e  ray set dependen
14c0: 63 69 65 73 20 7b 7d 0a 09 24 6d 79 74 79 70 65  cies {}..$mytype
14d0: 6f 62 6a 20 69 6e 74 65 72 6e 61 6c 73 75 63 63  obj internalsucc
14e0: 65 73 73 6f 72 73 20 64 65 70 65 6e 64 65 6e 63  essors dependenc
14f0: 69 65 73 20 24 6d 79 72 65 76 69 73 69 6f 6e 73  ies $myrevisions
1500: 0a 09 69 66 20 7b 21 5b 61 72 72 61 79 20 73 69  ..if {![array si
1510: 7a 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73 5d  ze dependencies]
1520: 7d 20 7b 72 65 74 75 72 6e 20 30 7d 20 3b 20 23  } {return 0} ; #
1530: 20 4e 6f 74 68 69 6e 67 20 74 6f 20 62 72 65 61   Nothing to brea
1540: 6b 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 35  k....log write 5
1550: 20 63 73 65 74 73 20 2e 2e 2e 5b 24 73 65 6c 66   csets ...[$self
1560: 20 73 74 72 5d 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e   str]...........
1570: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1580: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1590: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 0a 0a 09 23  ...............#
15a0: 20 57 65 20 68 61 76 65 20 69 6e 74 65 72 6e 61   We have interna
15b0: 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74  l dependencies t
15c0: 6f 20 62 72 65 61 6b 2e 20 57 65 20 6e 6f 77 20  o break. We now 
15d0: 69 74 65 72 61 74 65 20 6f 76 65 72 0a 09 23 20  iterate over..# 
15e0: 61 6c 6c 20 70 6f 73 69 74 69 6f 6e 73 20 69 6e  all positions in
15f0: 20 74 68 65 20 6c 69 73 74 20 28 77 68 69 63 68   the list (which
1600: 20 69 73 20 63 68 72 6f 6e 6f 6c 6f 67 69 63 61   is chronologica
1610: 6c 2c 20 61 74 20 6c 65 61 73 74 0a 09 23 20 61  l, at least..# a
1620: 73 20 66 61 72 20 61 73 20 74 68 65 20 74 69 6d  s far as the tim
1630: 65 73 74 61 6d 70 73 20 61 72 65 20 63 6f 72 72  estamps are corr
1640: 65 63 74 20 61 6e 64 20 75 6e 69 71 75 65 29 20  ect and unique) 
1650: 61 6e 64 0a 09 23 20 64 65 74 65 72 6d 69 6e 65  and..# determine
1660: 20 74 68 65 20 62 65 73 74 20 70 6f 73 69 74 69   the best positi
1670: 6f 6e 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b  on for the break
1680: 2c 20 62 79 20 74 72 79 69 6e 67 20 74 6f 0a 09  , by trying to..
1690: 23 20 62 72 65 61 6b 20 61 73 20 6d 61 6e 79 20  # break as many 
16a0: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 61 73 20  dependencies as 
16b0: 70 6f 73 73 69 62 6c 65 20 69 6e 20 6f 6e 65 20  possible in one 
16c0: 67 6f 2e 20 57 68 65 6e 20 61 0a 09 23 20 62 72  go. When a..# br
16d0: 65 61 6b 20 77 61 73 20 66 6f 75 6e 64 20 74 68  eak was found th
16e0: 69 73 20 69 73 20 72 65 64 6f 6e 65 20 66 6f 72  is is redone for
16f0: 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 20 63   the fragments c
1700: 6f 6d 69 6e 67 20 61 6e 64 0a 09 23 20 61 66 74  oming and..# aft
1710: 65 72 2c 20 61 66 74 65 72 20 75 70 64 69 6e 67  er, after upding
1720: 20 74 68 65 20 63 72 6f 73 73 69 6e 67 20 69 6e   the crossing in
1730: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 0a 09 23 20 44  formation....# D
1740: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 3a 0a  ata structures:.
1750: 09 23 20 4d 61 70 3a 20 20 50 4f 53 20 20 20 72  .# Map:  POS   r
1760: 65 76 69 73 69 6f 6e 20 69 64 20 20 20 20 20 20  evision id      
1770: 2d 3e 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c  -> position in l
1780: 69 73 74 2e 0a 09 23 20 20 20 20 20 20 20 43 52  ist...#       CR
1790: 4f 53 53 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20  OSS position in 
17a0: 6c 69 73 74 20 2d 3e 20 6e 75 6d 62 65 72 20 6f  list -> number o
17b0: 66 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 63  f dependencies c
17c0: 72 6f 73 73 69 6e 67 20 69 74 0a 09 23 20 20 20  rossing it..#   
17d0: 20 20 20 20 44 45 50 43 20 20 64 65 70 65 6e 64      DEPC  depend
17e0: 65 6e 63 79 20 20 20 20 20 20 20 2d 3e 20 70 6f  ency       -> po
17f0: 73 69 74 69 6f 6e 73 20 69 74 20 63 72 6f 73 73  sitions it cross
1800: 65 73 0a 09 23 20 4c 69 73 74 3a 20 52 41 4e 47  es..# List: RANG
1810: 45 20 4f 66 20 74 68 65 20 70 6f 73 69 74 69 6f  E Of the positio
1820: 6e 73 20 69 74 73 65 6c 66 2e 0a 09 23 20 41 20  ns itself...# A 
1830: 64 65 70 65 6e 64 65 6e 63 79 20 69 73 20 61 20  dependency is a 
1840: 73 69 6e 67 6c 65 2d 65 6c 65 6d 65 6e 74 20 6d  single-element m
1850: 61 70 20 70 61 72 65 6e 74 20 2d 3e 20 63 68 69  ap parent -> chi
1860: 6c 64 0a 0a 09 49 6e 69 74 69 61 6c 69 7a 65 42  ld...InitializeB
1870: 72 65 61 6b 53 74 61 74 65 20 24 6d 79 72 65 76  reakState $myrev
1880: 69 73 69 6f 6e 73 0a 0a 09 73 65 74 20 66 72 61  isions...set fra
1890: 67 6d 65 6e 74 73 20 7b 7d 0a 09 73 65 74 20 70  gments {}..set p
18a0: 65 6e 64 69 6e 67 20 20 20 5b 6c 69 73 74 20 24  ending   [list $
18b0: 72 61 6e 67 65 5d 0a 09 73 65 74 20 61 74 20 20  range]..set at  
18c0: 20 20 20 20 20 20 30 0a 09 61 72 72 61 79 20 73        0..array s
18d0: 65 74 20 62 72 65 61 6b 73 20 7b 7d 0a 0a 09 77  et breaks {}...w
18e0: 68 69 6c 65 20 7b 24 61 74 20 3c 20 5b 6c 6c 65  hile {$at < [lle
18f0: 6e 67 74 68 20 24 70 65 6e 64 69 6e 67 5d 7d 20  ngth $pending]} 
1900: 7b 0a 09 20 20 20 20 73 65 74 20 63 75 72 72 65  {..    set curre
1910: 6e 74 20 5b 6c 69 6e 64 65 78 20 24 70 65 6e 64  nt [lindex $pend
1920: 69 6e 67 20 24 61 74 5d 0a 0a 09 20 20 20 20 6c  ing $at]...    l
1930: 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73  og write 6 csets
1940: 20 7b 2e 20 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e   {. . .. ... ...
1950: 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e  .. ........ ....
1960: 2e 2e 2e 2e 2e 2e 2e 2e 2e 7d 0a 09 20 20 20 20  .........}..    
1970: 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74  log write 6 cset
1980: 73 20 7b 53 63 68 65 64 75 6c 65 64 20 20 20 5b  s {Scheduled   [
1990: 6a 6f 69 6e 20 5b 50 52 73 20 5b 6c 72 61 6e 67  join [PRs [lrang
19a0: 65 20 24 70 65 6e 64 69 6e 67 20 24 61 74 20 65  e $pending $at e
19b0: 6e 64 5d 5d 20 7b 20 7d 5d 7d 0a 09 20 20 20 20  nd]] { }]}..    
19c0: 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74  log write 6 cset
19d0: 73 20 7b 43 6f 6e 73 69 64 65 72 69 6e 67 20 5b  s {Considering [
19e0: 50 52 20 24 63 75 72 72 65 6e 74 5d 20 5c 5b 24  PR $current] \[$
19f0: 61 74 2f 5b 6c 6c 65 6e 67 74 68 20 24 70 65 6e  at/[llength $pen
1a00: 64 69 6e 67 5d 5c 5d 7d 0a 0a 09 20 20 20 20 73  ding]\]}...    s
1a10: 65 74 20 62 65 73 74 20 5b 46 69 6e 64 42 65 73  et best [FindBes
1a20: 74 42 72 65 61 6b 20 24 63 75 72 72 65 6e 74 5d  tBreak $current]
1a30: 0a 0a 09 20 20 20 20 69 66 20 7b 24 62 65 73 74  ...    if {$best
1a40: 20 3c 20 30 7d 20 7b 0a 09 09 23 20 54 68 65 20   < 0} {...# The 
1a50: 69 6e 73 70 65 63 74 65 64 20 72 61 6e 67 65 20  inspected range 
1a60: 68 61 73 20 6e 6f 20 69 6e 74 65 72 6e 61 6c 0a  has no internal.
1a70: 09 09 23 20 64 65 70 65 6e 64 65 6e 63 69 65 73  ..# dependencies
1a80: 2e 20 54 68 69 73 20 69 73 20 61 20 63 6f 6d 70  . This is a comp
1a90: 6c 65 74 65 20 66 72 61 67 6d 65 6e 74 2e 0a 09  lete fragment...
1aa0: 09 6c 61 70 70 65 6e 64 20 66 72 61 67 6d 65 6e  .lappend fragmen
1ab0: 74 73 20 24 63 75 72 72 65 6e 74 0a 0a 09 09 6c  ts $current....l
1ac0: 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73  og write 6 csets
1ad0: 20 22 4e 6f 20 62 72 65 61 6b 73 2c 20 66 69 6e   "No breaks, fin
1ae0: 61 6c 22 0a 09 20 20 20 20 7d 20 65 6c 73 65 20  al"..    } else 
1af0: 7b 0a 09 09 23 20 53 70 6c 69 74 20 74 68 65 20  {...# Split the 
1b00: 72 61 6e 67 65 20 61 6e 64 20 73 63 68 65 64 75  range and schedu
1b10: 6c 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  le the resulting
1b20: 20 66 72 61 67 6d 65 6e 74 73 0a 09 09 23 20 66   fragments...# f
1b30: 6f 72 20 66 75 72 74 68 65 72 20 69 6e 73 70 65  or further inspe
1b40: 63 74 69 6f 6e 2e 20 52 65 6d 65 6d 62 65 72 20  ction. Remember 
1b50: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 09 09  the number of...
1b60: 23 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 63  # dependencies c
1b70: 75 74 20 62 65 66 6f 72 65 20 77 65 20 72 65 6d  ut before we rem
1b80: 6f 76 65 20 74 68 65 6d 20 66 72 6f 6d 0a 09 09  ove them from...
1b90: 23 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 2c  # consideration,
1ba0: 20 66 6f 72 20 64 6f 63 75 6d 65 6e 74 61 74 69   for documentati
1bb0: 6f 6e 20 6c 61 74 65 72 2e 0a 0a 09 09 73 65 74  on later.....set
1bc0: 20 62 72 65 61 6b 73 28 24 62 65 73 74 29 20 24   breaks($best) $
1bd0: 63 72 6f 73 73 28 24 62 65 73 74 29 0a 0a 09 09  cross($best)....
1be0: 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74  log write 6 cset
1bf0: 73 20 22 42 65 73 74 20 62 72 65 61 6b 20 40 20  s "Best break @ 
1c00: 24 62 65 73 74 2c 20 63 75 74 74 69 6e 67 20 5b  $best, cutting [
1c10: 6e 73 70 20 24 63 72 6f 73 73 28 24 62 65 73 74  nsp $cross($best
1c20: 29 20 64 65 70 65 6e 64 65 6e 63 79 20 64 65 70  ) dependency dep
1c30: 65 6e 64 65 6e 63 69 65 73 5d 22 0a 0a 09 09 23  endencies]"....#
1c40: 20 4e 6f 74 65 3a 20 54 68 65 20 76 61 6c 75 65   Note: The value
1c50: 20 6f 66 20 62 65 73 74 20 69 73 20 61 6e 20 61   of best is an a
1c60: 62 6f 6c 75 74 65 20 6c 6f 63 61 74 69 6f 6e 20  bolute location 
1c70: 69 6e 0a 09 09 23 20 6d 79 72 65 76 69 73 69 6f  in...# myrevisio
1c80: 6e 73 2e 20 55 73 65 20 74 68 65 20 73 74 61 72  ns. Use the star
1c90: 74 20 6f 66 20 63 75 72 72 65 6e 74 20 74 6f 20  t of current to 
1ca0: 6d 61 6b 65 20 69 74 20 61 6e 0a 09 09 23 20 69  make it an...# i
1cb0: 6e 64 65 78 20 61 62 73 6f 6c 75 74 65 20 74 6f  ndex absolute to
1cc0: 20 63 75 72 72 65 6e 74 2e 0a 0a 09 09 73 65 74   current.....set
1cd0: 20 62 72 65 6c 20 5b 65 78 70 72 20 7b 24 62 65   brel [expr {$be
1ce0: 73 74 20 2d 20 5b 6c 69 6e 64 65 78 20 24 63 75  st - [lindex $cu
1cf0: 72 72 65 6e 74 20 30 5d 7d 5d 0a 09 09 73 65 74  rrent 0]}]...set
1d00: 20 62 6e 65 78 74 20 24 62 72 65 6c 20 3b 20 69   bnext $brel ; i
1d10: 6e 63 72 20 62 6e 65 78 74 0a 09 09 73 65 74 20  ncr bnext...set 
1d20: 66 72 61 67 62 65 66 6f 72 65 20 5b 6c 72 61 6e  fragbefore [lran
1d30: 67 65 20 24 63 75 72 72 65 6e 74 20 30 20 24 62  ge $current 0 $b
1d40: 72 65 6c 5d 0a 09 09 73 65 74 20 66 72 61 67 61  rel]...set fraga
1d50: 66 74 65 72 20 20 5b 6c 72 61 6e 67 65 20 24 63  fter  [lrange $c
1d60: 75 72 72 65 6e 74 20 24 62 6e 65 78 74 20 65 6e  urrent $bnext en
1d70: 64 5d 0a 0a 09 09 6c 6f 67 20 77 72 69 74 65 20  d]....log write 
1d80: 36 20 63 73 65 74 73 20 22 4e 65 77 20 70 69 65  6 csets "New pie
1d90: 63 65 73 20 20 5b 50 52 20 24 66 72 61 67 62 65  ces  [PR $fragbe
1da0: 66 6f 72 65 5d 20 5b 50 52 20 24 66 72 61 67 61  fore] [PR $fraga
1db0: 66 74 65 72 5d 22 0a 0a 09 09 69 6e 74 65 67 72  fter]"....integr
1dc0: 69 74 79 20 61 73 73 65 72 74 20 7b 5b 6c 6c 65  ity assert {[lle
1dd0: 6e 67 74 68 20 24 66 72 61 67 62 65 66 6f 72 65  ngth $fragbefore
1de0: 5d 7d 20 7b 46 6f 75 6e 64 20 7a 65 72 6f 2d 6c  ]} {Found zero-l
1df0: 65 6e 67 74 68 20 66 72 61 67 6d 65 6e 74 20 61  ength fragment a
1e00: 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 7d  t the beginning}
1e10: 0a 09 09 69 6e 74 65 67 72 69 74 79 20 61 73 73  ...integrity ass
1e20: 65 72 74 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66  ert {[llength $f
1e30: 72 61 67 61 66 74 65 72 5d 7d 20 20 7b 46 6f 75  ragafter]}  {Fou
1e40: 6e 64 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66  nd zero-length f
1e50: 72 61 67 6d 65 6e 74 20 61 74 20 74 68 65 20 65  ragment at the e
1e60: 6e 64 7d 0a 0a 09 09 6c 61 70 70 65 6e 64 20 70  nd}....lappend p
1e70: 65 6e 64 69 6e 67 20 24 66 72 61 67 62 65 66 6f  ending $fragbefo
1e80: 72 65 20 24 66 72 61 67 61 66 74 65 72 0a 09 09  re $fragafter...
1e90: 43 75 74 41 74 20 24 62 65 73 74 0a 09 20 20 20  CutAt $best..   
1ea0: 20 7d 0a 0a 09 20 20 20 20 69 6e 63 72 20 61 74   }...    incr at
1eb0: 0a 09 7d 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20  ..}...log write 
1ec0: 36 20 63 73 65 74 73 20 22 2e 20 2e 20 2e 2e 20  6 csets ". . .. 
1ed0: 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e  ... ..... ......
1ee0: 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  .. .............
1ef0: 22 0a 0a 09 23 20 28 2a 29 20 57 65 20 63 6c 65  "...# (*) We cle
1f00: 61 72 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63  ar out the assoc
1f10: 69 61 74 65 64 20 70 61 72 74 20 6f 66 20 74 68  iated part of th
1f20: 65 20 6d 79 72 65 76 6d 61 70 0a 09 23 20 69 6e  e myrevmap..# in
1f30: 2d 6d 65 6d 6f 72 79 20 69 6e 64 65 78 20 69 6e  -memory index in
1f40: 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f 72   preparation for
1f50: 20 6e 65 77 20 64 61 74 61 2e 20 41 20 73 69 6d   new data. A sim
1f60: 70 6c 65 20 75 6e 73 65 74 0a 09 23 20 69 73 20  ple unset..# is 
1f70: 65 6e 6f 75 67 68 2c 20 77 65 20 68 61 76 65 20  enough, we have 
1f80: 6e 6f 20 73 79 6d 62 6f 6c 20 63 68 61 6e 67 65  no symbol change
1f90: 73 65 74 73 20 61 74 20 74 68 69 73 20 74 69 6d  sets at this tim
1fa0: 65 2c 20 61 6e 64 0a 09 23 20 74 68 75 73 20 6e  e, and..# thus n
1fb0: 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 6f  ever more than o
1fc0: 6e 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e 20  ne reference in 
1fd0: 74 68 65 20 6c 69 73 74 2e 0a 0a 09 66 6f 72 65  the list....fore
1fe0: 61 63 68 20 72 20 24 6d 79 72 65 76 69 73 69 6f  ach r $myrevisio
1ff0: 6e 73 20 7b 20 75 6e 73 65 74 20 6d 79 72 65 76  ns { unset myrev
2000: 6d 61 70 28 24 72 29 20 7d 0a 0a 09 23 20 43 72  map($r) }...# Cr
2010: 65 61 74 65 20 63 68 61 6e 67 65 73 65 74 73 20  eate changesets 
2020: 66 6f 72 20 74 68 65 20 66 72 61 67 6d 65 6e 74  for the fragment
2030: 73 2c 20 72 65 75 73 69 6e 67 20 74 68 65 20 63  s, reusing the c
2040: 75 72 72 65 6e 74 20 6f 6e 65 0a 09 23 20 66 6f  urrent one..# fo
2050: 72 20 74 68 65 20 66 69 72 73 74 20 66 72 61 67  r the first frag
2060: 6d 65 6e 74 2e 20 57 65 20 73 6f 72 74 20 74 68  ment. We sort th
2070: 65 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61  em in order to a
2080: 6c 6c 6f 77 0a 09 23 20 63 68 65 63 6b 69 6e 67  llow..# checking
2090: 20 66 6f 72 20 67 61 70 73 20 61 6e 64 20 6e 69   for gaps and ni
20a0: 63 65 20 6d 65 73 73 61 67 65 73 2e 0a 0a 09 73  ce messages....s
20b0: 65 74 20 66 72 61 67 6d 65 6e 74 73 20 5b 6c 73  et fragments [ls
20c0: 6f 72 74 20 2d 69 6e 64 65 78 20 30 20 2d 69 6e  ort -index 0 -in
20d0: 74 65 67 65 72 20 24 66 72 61 67 6d 65 6e 74 73  teger $fragments
20e0: 5d 0a 0a 09 23 70 75 74 73 20 5c 74 2e 5b 6a 6f  ]...#puts \t.[jo
20f0: 69 6e 20 5b 50 52 73 20 24 66 72 61 67 6d 65 6e  in [PRs $fragmen
2100: 74 73 5d 20 2e 5c 6e 5c 74 2e 5d 2e 0a 0a 09 42  ts] .\n\t.]....B
2110: 6f 72 64 65 72 20 5b 6c 69 6e 64 65 78 20 24 66  order [lindex $f
2120: 72 61 67 6d 65 6e 74 73 20 30 5d 20 66 69 72 73  ragments 0] firs
2130: 74 73 20 66 69 72 73 74 65 0a 0a 09 69 6e 74 65  ts firste...inte
2140: 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24 66  grity assert {$f
2150: 69 72 73 74 73 20 3d 3d 20 30 7d 20 7b 42 61 64  irsts == 0} {Bad
2160: 20 66 72 61 67 6d 65 6e 74 20 73 74 61 72 74 20   fragment start 
2170: 40 20 24 66 69 72 73 74 73 2c 20 67 61 70 2c 20  @ $firsts, gap, 
2180: 6f 72 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e  or before beginn
2190: 69 6e 67 20 6f 66 20 74 68 65 20 72 61 6e 67 65  ing of the range
21a0: 7d 0a 0a 09 73 65 74 20 6c 61 73 74 65 20 24 66  }...set laste $f
21b0: 69 72 73 74 65 0a 09 66 6f 72 65 61 63 68 20 66  irste..foreach f
21c0: 72 61 67 6d 65 6e 74 20 5b 6c 72 61 6e 67 65 20  ragment [lrange 
21d0: 24 66 72 61 67 6d 65 6e 74 73 20 31 20 65 6e 64  $fragments 1 end
21e0: 5d 20 7b 0a 09 20 20 20 20 42 6f 72 64 65 72 20  ] {..    Border 
21f0: 24 66 72 61 67 6d 65 6e 74 20 73 20 65 0a 09 20  $fragment s e.. 
2200: 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 73     integrity ass
2210: 65 72 74 20 7b 24 6c 61 73 74 65 20 3d 3d 20 28  ert {$laste == (
2220: 24 73 20 2d 20 31 29 7d 20 7b 42 61 64 20 66 72  $s - 1)} {Bad fr
2230: 61 67 6d 65 6e 74 20 62 6f 72 64 65 72 20 3c 24  agment border <$
2240: 6c 61 73 74 65 20 7c 20 24 73 3e 2c 20 67 61 70  laste | $s>, gap
2250: 20 6f 72 20 6f 76 65 72 6c 61 70 7d 0a 0a 09 20   or overlap}... 
2260: 20 20 20 73 65 74 20 6e 65 77 20 5b 24 74 79 70     set new [$typ
2270: 65 20 25 41 55 54 4f 25 20 24 6d 79 70 72 6f 6a  e %AUTO% $myproj
2280: 65 63 74 20 24 6d 79 74 79 70 65 20 24 6d 79 73  ect $mytype $mys
2290: 72 63 69 64 20 5b 6c 72 61 6e 67 65 20 24 6d 79  rcid [lrange $my
22a0: 72 65 76 69 73 69 6f 6e 73 20 24 73 20 24 65 5d  revisions $s $e]
22b0: 5d 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c  ]..            l
22c0: 6f 67 20 77 72 69 74 65 20 34 20 63 73 65 74 73  og write 4 csets
22d0: 20 22 42 72 65 61 6b 69 6e 67 20 5b 24 73 65 6c   "Breaking [$sel
22e0: 66 20 73 74 72 20 5d 20 40 20 24 6c 61 73 74 65  f str ] @ $laste
22f0: 2c 20 6e 65 77 20 5b 24 6e 65 77 20 73 74 72 5d  , new [$new str]
2300: 2c 20 63 75 74 74 69 6e 67 20 24 62 72 65 61 6b  , cutting $break
2310: 73 28 24 6c 61 73 74 65 29 22 0a 0a 09 20 20 20  s($laste)"...   
2320: 20 73 65 74 20 6c 61 73 74 65 20 24 65 0a 09 7d   set laste $e..}
2330: 0a 0a 09 69 6e 74 65 67 72 69 74 79 20 61 73 73  ...integrity ass
2340: 65 72 74 20 7b 0a 09 20 20 20 20 24 6c 61 73 74  ert {..    $last
2350: 65 20 3d 3d 20 28 5b 6c 6c 65 6e 67 74 68 20 24  e == ([llength $
2360: 6d 79 72 65 76 69 73 69 6f 6e 73 5d 2d 31 29 0a  myrevisions]-1).
2370: 09 7d 20 7b 42 61 64 20 66 72 61 67 6d 65 6e 74  .} {Bad fragment
2380: 20 65 6e 64 20 40 20 24 6c 61 73 74 65 2c 20 67   end @ $laste, g
2390: 61 70 2c 20 6f 72 20 62 65 79 6f 6e 64 20 65 6e  ap, or beyond en
23a0: 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 7d 0a  d of the range}.
23b0: 0a 09 23 20 50 75 74 20 74 68 65 20 66 69 72 73  ..# Put the firs
23c0: 74 20 66 72 61 67 6d 65 6e 74 20 69 6e 74 6f 20  t fragment into 
23d0: 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e  the current chan
23e0: 67 65 73 65 74 2c 20 61 6e 64 0a 09 23 20 75 70  geset, and..# up
23f0: 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f  date the in-memo
2400: 72 79 20 69 6e 64 65 78 2e 20 57 65 20 63 61 6e  ry index. We can
2410: 20 73 69 6d 70 6c 79 20 28 72 65 29 61 64 64 20   simply (re)add 
2420: 74 68 65 0a 09 23 20 72 65 76 69 73 69 6f 6e 73  the..# revisions
2430: 20 62 65 63 61 75 73 65 20 77 65 20 63 6c 65 61   because we clea
2440: 72 65 64 20 74 68 65 20 70 72 65 76 69 6f 75 73  red the previous
2450: 6c 79 20 65 78 69 73 74 69 6e 67 0a 09 23 20 69  ly existing..# i
2460: 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20 73 65 65 20  nformation, see 
2470: 28 2a 29 20 61 62 6f 76 65 2e 20 50 65 72 73 69  (*) above. Persi
2480: 73 74 65 6e 63 65 20 64 6f 65 73 20 6e 6f 74 20  stence does not 
2490: 6d 61 74 74 65 72 0a 09 23 20 68 65 72 65 2c 20  matter..# here, 
24a0: 6e 6f 6e 65 20 6f 66 20 74 68 65 20 63 68 61 6e  none of the chan
24b0: 67 65 73 65 74 73 20 68 61 73 20 62 65 65 6e 20  gesets has been 
24c0: 73 61 76 65 64 20 74 6f 20 74 68 65 0a 09 23 20  saved to the..# 
24d0: 70 65 72 73 69 73 74 65 6e 74 20 73 74 61 74 65  persistent state
24e0: 20 79 65 74 2e 0a 0a 09 73 65 74 20 6d 79 72 65   yet....set myre
24f0: 76 69 73 69 6f 6e 73 20 5b 6c 72 61 6e 67 65 20  visions [lrange 
2500: 24 6d 79 72 65 76 69 73 69 6f 6e 73 20 30 20 24  $myrevisions 0 $
2510: 66 69 72 73 74 65 5d 0a 09 66 6f 72 65 61 63 68  firste]..foreach
2520: 20 72 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 20   r $myrevisions 
2530: 7b 20 6c 61 70 70 65 6e 64 20 6d 79 72 65 76 6d  { lappend myrevm
2540: 61 70 28 24 72 29 20 24 73 65 6c 66 20 7d 0a 0a  ap($r) $self }..
2550: 09 72 65 74 75 72 6e 20 31 0a 20 20 20 20 7d 0a  .return 1.    }.
2560: 0a 20 20 20 20 6d 65 74 68 6f 64 20 70 65 72 73  .    method pers
2570: 69 73 74 20 7b 7d 20 7b 0a 09 73 65 74 20 74 69  ist {} {..set ti
2580: 64 20 24 6d 79 63 73 74 79 70 65 28 24 6d 79 74  d $mycstype($myt
2590: 79 70 65 29 0a 09 73 65 74 20 70 69 64 20 5b 24  ype)..set pid [$
25a0: 6d 79 70 72 6f 6a 65 63 74 20 69 64 5d 0a 09 73  myproject id]..s
25b0: 65 74 20 70 6f 73 20 30 0a 0a 09 73 74 61 74 65  et pos 0...state
25c0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 09   transaction {..
25d0: 20 20 20 20 73 74 61 74 65 20 72 75 6e 20 7b 0a      state run {.
25e0: 09 09 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68  ..INSERT INTO ch
25f0: 61 6e 67 65 73 65 74 20 28 63 69 64 2c 20 20 20  angeset (cid,   
2600: 70 69 64 2c 20 20 74 79 70 65 2c 20 73 72 63 29  pid,  type, src)
2610: 0a 09 09 56 41 4c 55 45 53 20 20 20 20 20 20 20  ...VALUES       
2620: 20 20 20 20 20 20 20 20 20 28 24 6d 79 69 64 2c           ($myid,
2630: 20 24 70 69 64 2c 20 24 74 69 64 2c 20 24 6d 79   $pid, $tid, $my
2640: 73 72 63 69 64 29 3b 0a 09 20 20 20 20 7d 0a 0a  srcid);..    }..
2650: 09 20 20 20 20 66 6f 72 65 61 63 68 20 72 69 64  .    foreach rid
2660: 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 20 7b 0a   $myrevisions {.
2670: 09 09 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09  ..state run {...
2680: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2690: 63 73 72 65 76 69 73 69 6f 6e 20 28 63 69 64 2c  csrevision (cid,
26a0: 20 20 20 70 6f 73 2c 20 20 72 69 64 29 0a 09 09     pos,  rid)...
26b0: 20 20 20 20 56 41 4c 55 45 53 20 20 20 20 20 20      VALUES      
26c0: 20 20 20 20 20 20 20 20 20 20 20 28 24 6d 79 69             ($myi
26d0: 64 2c 20 24 70 6f 73 2c 20 24 72 69 64 29 3b 0a  d, $pos, $rid);.
26e0: 09 09 7d 0a 09 09 69 6e 63 72 20 70 6f 73 0a 09  ..}...incr pos..
26f0: 20 20 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e      }..}..return
2700: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68  .    }..    meth
2710: 6f 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 7d 20  od timerange {} 
2720: 7b 20 72 65 74 75 72 6e 20 5b 24 6d 79 74 79 70  { return [$mytyp
2730: 65 6f 62 6a 20 74 69 6d 65 72 61 6e 67 65 20 24  eobj timerange $
2740: 6d 79 72 65 76 69 73 69 6f 6e 73 5d 20 7d 0a 0a  myrevisions] }..
2750: 20 20 20 20 6d 65 74 68 6f 64 20 64 72 6f 70 20      method drop 
2760: 7b 7d 20 7b 0a 09 73 74 61 74 65 20 74 72 61 6e  {} {..state tran
2770: 73 61 63 74 69 6f 6e 20 7b 0a 09 20 20 20 20 73  saction {..    s
2780: 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 44 45 4c  tate run {...DEL
2790: 45 54 45 20 46 52 4f 4d 20 63 68 61 6e 67 65 73  ETE FROM changes
27a0: 65 74 20 20 57 48 45 52 45 20 63 69 64 20 3d 20  et  WHERE cid = 
27b0: 24 6d 79 69 64 3b 0a 09 09 44 45 4c 45 54 45 20  $myid;...DELETE 
27c0: 46 52 4f 4d 20 63 73 72 65 76 69 73 69 6f 6e 20  FROM csrevision 
27d0: 57 48 45 52 45 20 63 69 64 20 3d 20 24 6d 79 69  WHERE cid = $myi
27e0: 64 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 66 6f  d;..    }..}..fo
27f0: 72 65 61 63 68 20 72 20 24 6d 79 72 65 76 69 73  reach r $myrevis
2800: 69 6f 6e 73 20 7b 0a 09 20 20 20 20 69 66 20 7b  ions {..    if {
2810: 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 72 65 76 6d  [llength $myrevm
2820: 61 70 28 24 72 29 5d 20 3d 3d 20 31 7d 20 7b 0a  ap($r)] == 1} {.
2830: 09 09 75 6e 73 65 74 20 6d 79 72 65 76 6d 61 70  ..unset myrevmap
2840: 28 24 72 29 0a 09 20 20 20 20 7d 20 65 6c 73 65  ($r)..    } else
2850: 20 7b 0a 09 09 73 65 74 20 70 6f 73 20 5b 6c 73   {...set pos [ls
2860: 65 61 72 63 68 20 2d 65 78 61 63 74 20 24 6d 79  earch -exact $my
2870: 72 65 76 6d 61 70 28 24 72 29 20 24 73 65 6c 66  revmap($r) $self
2880: 5d 0a 09 09 73 65 74 20 6d 79 72 65 76 6d 61 70  ]...set myrevmap
2890: 28 24 72 29 20 5b 6c 72 65 70 6c 61 63 65 20 24  ($r) [lreplace $
28a0: 6d 79 72 65 76 6d 61 70 28 24 72 29 20 24 70 6f  myrevmap($r) $po
28b0: 73 20 24 70 6f 73 5d 0a 09 20 20 20 20 7d 0a 09  s $pos]..    }..
28c0: 7d 0a 09 73 65 74 20 70 6f 73 20 20 20 20 20 20  }..set pos      
28d0: 20 20 20 20 5b 6c 73 65 61 72 63 68 20 2d 65 78      [lsearch -ex
28e0: 61 63 74 20 24 6d 79 63 68 61 6e 67 65 73 65 74  act $mychangeset
28f0: 73 20 24 73 65 6c 66 5d 0a 09 73 65 74 20 6d 79  s $self]..set my
2900: 63 68 61 6e 67 65 73 65 74 73 20 5b 6c 72 65 70  changesets [lrep
2910: 6c 61 63 65 20 24 6d 79 63 68 61 6e 67 65 73 65  lace $mychangese
2920: 74 73 20 24 70 6f 73 20 24 70 6f 73 5d 0a 09 72  ts $pos $pos]..r
2930: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
2940: 20 74 79 70 65 6d 65 74 68 6f 64 20 73 70 6c 69   typemethod spli
2950: 74 20 7b 63 73 65 74 20 61 72 67 73 7d 20 7b 0a  t {cset args} {.
2960: 09 23 20 41 73 20 70 61 72 74 20 6f 66 20 74 68  .# As part of th
2970: 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68  e creation of th
2980: 65 20 6e 65 77 20 63 68 61 6e 67 65 73 65 74 73  e new changesets
2990: 20 73 70 65 63 69 66 69 65 64 20 69 6e 0a 09 23   specified in..#
29a0: 20 41 52 47 53 20 61 73 20 73 65 74 73 20 6f 66   ARGS as sets of
29b0: 20 72 65 76 69 73 69 6f 6e 73 2c 20 61 6c 6c 20   revisions, all 
29c0: 73 75 62 73 65 74 73 20 6f 66 20 43 53 45 54 27  subsets of CSET'
29d0: 73 20 72 65 76 69 73 69 6f 6e 0a 09 23 20 73 65  s revision..# se
29e0: 74 2c 20 43 53 45 54 20 77 69 6c 6c 20 62 65 20  t, CSET will be 
29f0: 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 61 6c 6c  dropped from all
2a00: 20 64 61 74 61 62 61 73 65 73 2c 20 69 6e 20 61   databases, in a
2a10: 6e 64 20 6f 75 74 20 6f 66 0a 09 23 20 6d 65 6d  nd out of..# mem
2a20: 6f 72 79 2c 20 61 6e 64 20 74 68 65 6e 20 64 65  ory, and then de
2a30: 73 74 72 6f 79 65 64 2e 0a 0a 09 73 74 72 75 63  stroyed....struc
2a40: 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b  t::list assign [
2a50: 24 63 73 65 74 20 64 61 74 61 5d 20 70 72 6f 6a  $cset data] proj
2a60: 65 63 74 20 63 73 74 79 70 65 20 63 73 73 72 63  ect cstype cssrc
2a70: 0a 0a 09 24 63 73 65 74 20 64 72 6f 70 0a 09 24  ...$cset drop..$
2a80: 63 73 65 74 20 64 65 73 74 72 6f 79 0a 0a 09 73  cset destroy...s
2a90: 65 74 20 6e 65 77 63 73 65 74 73 20 7b 7d 0a 09  et newcsets {}..
2aa0: 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65 6e 74  foreach fragment
2ab0: 72 65 76 69 73 69 6f 6e 73 20 24 61 72 67 73 20  revisions $args 
2ac0: 7b 0a 09 20 20 20 20 69 6e 74 65 67 72 69 74 79  {..    integrity
2ad0: 20 61 73 73 65 72 74 20 7b 0a 09 09 5b 6c 6c 65   assert {...[lle
2ae0: 6e 67 74 68 20 24 66 72 61 67 6d 65 6e 74 72 65  ngth $fragmentre
2af0: 76 69 73 69 6f 6e 73 5d 0a 09 20 20 20 20 7d 20  visions]..    } 
2b00: 7b 41 74 74 65 6d 70 74 65 64 20 74 6f 20 63 72  {Attempted to cr
2b10: 65 61 74 65 20 61 6e 20 65 6d 70 74 79 20 63 68  eate an empty ch
2b20: 61 6e 67 65 73 65 74 2c 20 69 2e 65 2e 20 77 69  angeset, i.e. wi
2b30: 74 68 6f 75 74 20 72 65 76 69 73 69 6f 6e 73 7d  thout revisions}
2b40: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 6e 65  ..    lappend ne
2b50: 77 63 73 65 74 73 20 5b 24 74 79 70 65 20 25 41  wcsets [$type %A
2b60: 55 54 4f 25 20 24 70 72 6f 6a 65 63 74 20 24 63  UTO% $project $c
2b70: 73 74 79 70 65 20 24 63 73 73 72 63 20 24 66 72  stype $cssrc $fr
2b80: 61 67 6d 65 6e 74 72 65 76 69 73 69 6f 6e 73 5d  agmentrevisions]
2b90: 0a 09 7d 0a 0a 09 66 6f 72 65 61 63 68 20 63 20  ..}...foreach c 
2ba0: 24 6e 65 77 63 73 65 74 73 20 7b 20 24 63 20 70  $newcsets { $c p
2bb0: 65 72 73 69 73 74 20 7d 0a 09 72 65 74 75 72 6e  ersist }..return
2bc0: 20 24 6e 65 77 63 73 65 74 73 0a 20 20 20 20 7d   $newcsets.    }
2bd0: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ..    typemethod
2be0: 20 73 74 72 6c 69 73 74 20 7b 63 68 61 6e 67 65   strlist {change
2bf0: 73 65 74 73 7d 20 7b 0a 09 72 65 74 75 72 6e 20  sets} {..return 
2c00: 5b 6a 6f 69 6e 20 5b 73 74 72 75 63 74 3a 3a 6c  [join [struct::l
2c10: 69 73 74 20 6d 61 70 20 24 63 68 61 6e 67 65 73  ist map $changes
2c20: 65 74 73 20 5b 6d 79 70 72 6f 63 20 49 44 5d 5d  ets [myproc ID]]
2c30: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f  ].    }..    pro
2c40: 63 20 49 44 20 7b 63 73 65 74 7d 20 7b 20 24 63  c ID {cset} { $c
2c50: 73 65 74 20 73 74 72 20 7d 0a 0a 20 20 20 20 23  set str }..    #
2c60: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20   # ## ### ##### 
2c70: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
2c80: 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 53 74  ######.    ## St
2c90: 61 74 65 0a 0a 20 20 20 20 76 61 72 69 61 62 6c  ate..    variabl
2ca0: 65 20 6d 79 69 64 20 20 20 20 20 20 20 20 7b 7d  e myid        {}
2cb0: 20 3b 20 23 20 49 64 20 6f 66 20 74 68 65 20 63   ; # Id of the c
2cc0: 73 65 74 20 66 6f 72 20 74 68 65 20 70 65 72 73  set for the pers
2cd0: 69 73 74 65 6e 74 0a 09 09 09 20 20 20 20 20 20  istent....      
2ce0: 23 20 73 74 61 74 65 2e 0a 20 20 20 20 76 61 72  # state..    var
2cf0: 69 61 62 6c 65 20 6d 79 70 72 6f 6a 65 63 74 20  iable myproject 
2d00: 20 20 7b 7d 20 3b 20 23 20 52 65 66 65 72 65 6e    {} ; # Referen
2d10: 63 65 20 6f 66 20 74 68 65 20 70 72 6f 6a 65 63  ce of the projec
2d20: 74 20 6f 62 6a 65 63 74 20 74 68 65 0a 09 09 09  t object the....
2d30: 20 20 20 20 20 20 23 20 63 68 61 6e 67 65 73 65        # changese
2d40: 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 20 20  t belongs to..  
2d50: 20 20 76 61 72 69 61 62 6c 65 20 6d 79 74 79 70    variable mytyp
2d60: 65 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 57 68  e      {} ; # Wh
2d70: 61 74 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  at the changeset
2d80: 20 69 73 20 62 61 73 65 64 20 6f 6e 0a 09 09 09   is based on....
2d90: 20 20 20 20 20 20 23 20 28 72 65 76 69 73 69 6f        # (revisio
2da0: 6e 73 2c 20 74 61 67 73 2c 20 6f 72 20 62 72 61  ns, tags, or bra
2db0: 6e 63 68 65 73 29 2e 0a 09 09 09 20 20 20 20 20  nches).....     
2dc0: 20 23 20 56 61 6c 75 65 73 3a 20 53 65 65 20 6d   # Values: See m
2dd0: 79 63 73 74 79 70 65 2e 20 4e 6f 74 65 20 74 68  ycstype. Note th
2de0: 61 74 20 77 65 0a 09 09 09 20 20 20 20 20 20 23  at we....      #
2df0: 20 68 61 76 65 20 74 6f 20 6b 65 65 70 20 74 68   have to keep th
2e00: 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 68  e names of the h
2e10: 65 6c 70 65 72 0a 09 09 09 20 20 20 20 20 20 23  elper....      #
2e20: 20 73 69 6e 67 6c 65 74 6f 6e 73 20 69 6e 20 73   singletons in s
2e30: 79 6e 63 20 77 69 74 68 20 74 68 65 20 63 6f 6e  ync with the con
2e40: 74 65 6e 74 73 0a 09 09 09 20 20 20 20 20 20 23  tents....      #
2e50: 20 6f 66 20 73 74 61 74 65 20 74 61 62 6c 65 20   of state table 
2e60: 27 63 73 74 79 70 65 27 2c 20 61 6e 64 20 76 61  'cstype', and va
2e70: 72 69 6f 75 73 0a 09 09 09 20 20 20 20 20 20 23  rious....      #
2e80: 20 6f 74 68 65 72 20 70 6c 61 63 65 73 20 75 73   other places us
2e90: 69 6e 67 20 74 68 65 6d 20 68 61 72 64 77 69 72  ing them hardwir
2ea0: 65 64 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65  ed..    variable
2eb0: 20 6d 79 74 79 70 65 6f 62 6a 20 20 20 7b 7d 20   mytypeobj   {} 
2ec0: 3b 20 23 20 52 65 66 65 72 65 6e 63 65 20 74 6f  ; # Reference to
2ed0: 20 74 68 65 20 63 6f 6e 74 61 69 6e 65 72 20 66   the container f
2ee0: 6f 72 20 74 68 65 0a 09 09 09 20 20 20 20 20 20  or the....      
2ef0: 23 20 74 79 70 65 20 64 65 70 65 6e 64 65 6e 74  # type dependent
2f00: 20 63 6f 64 65 2e 20 44 65 72 69 76 65 64 20 66   code. Derived f
2f10: 72 6f 6d 0a 09 09 09 20 20 20 20 20 20 23 20 6d  rom....      # m
2f20: 79 74 79 70 65 2e 0a 20 20 20 20 76 61 72 69 61  ytype..    varia
2f30: 62 6c 65 20 6d 79 73 72 63 69 64 20 20 20 20 20  ble mysrcid     
2f40: 7b 7d 20 3b 20 23 20 49 64 20 6f 66 20 74 68 65  {} ; # Id of the
2f50: 20 6d 65 74 61 64 61 74 61 20 6f 72 20 73 79 6d   metadata or sym
2f60: 62 6f 6c 20 74 68 65 20 63 73 65 74 0a 09 09 09  bol the cset....
2f70: 20 20 20 20 20 20 23 20 69 73 20 62 61 73 65 64        # is based
2f80: 20 6f 6e 2e 0a 20 20 20 20 76 61 72 69 61 62 6c   on..    variabl
2f90: 65 20 6d 79 72 65 76 69 73 69 6f 6e 73 20 7b 7d  e myrevisions {}
2fa0: 20 3b 20 23 20 4c 69 73 74 20 6f 66 20 74 68 65   ; # List of the
2fb0: 20 66 69 6c 65 20 6c 65 76 65 6c 20 72 65 76 69   file level revi
2fc0: 73 69 6f 6e 73 20 69 6e 0a 09 09 09 20 20 20 20  sions in....    
2fd0: 20 20 23 20 74 68 65 20 63 73 65 74 2e 0a 20 20    # the cset..  
2fe0: 20 20 76 61 72 69 61 62 6c 65 20 6d 79 70 72 65    variable mypre
2ff0: 6d 61 70 20 20 20 20 7b 7d 20 3b 20 23 20 44 69  map    {} ; # Di
3000: 63 74 69 6f 6e 61 72 79 20 6d 61 70 70 69 6e 67  ctionary mapping
3010: 20 66 72 6f 6d 20 74 68 65 20 72 65 76 69 73 69   from the revisi
3020: 6f 6e 73 0a 09 09 09 20 20 20 20 20 20 23 20 74  ons....      # t
3030: 6f 20 74 68 65 69 72 20 70 72 65 64 65 63 65 73  o their predeces
3040: 73 6f 72 73 2e 20 43 61 63 68 65 20 74 6f 20 61  sors. Cache to a
3050: 76 6f 69 64 0a 09 09 09 20 20 20 20 20 20 23 20  void....      # 
3060: 6c 6f 61 64 69 6e 67 20 74 68 69 73 20 66 72 6f  loading this fro
3070: 6d 20 74 68 65 20 73 74 61 74 65 20 6d 6f 72 65  m the state more
3080: 20 74 68 61 6e 0a 09 09 09 20 20 20 20 20 20 23   than....      #
3090: 20 6f 6e 63 65 2e 0a 20 20 20 20 76 61 72 69 61   once..    varia
30a0: 62 6c 65 20 6d 79 6e 65 78 74 6d 61 70 20 20 20  ble mynextmap   
30b0: 7b 7d 20 3b 20 23 20 44 69 63 74 69 6f 6e 61 72  {} ; # Dictionar
30c0: 79 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74  y mapping from t
30d0: 68 65 20 72 65 76 69 73 69 6f 6e 73 0a 09 09 09  he revisions....
30e0: 20 20 20 20 20 20 23 20 74 6f 20 74 68 65 69 72        # to their
30f0: 20 73 75 63 63 65 73 73 6f 72 73 2e 20 43 61 63   successors. Cac
3100: 68 65 20 74 6f 20 61 76 6f 69 64 0a 09 09 09 20  he to avoid.... 
3110: 20 20 20 20 20 23 20 6c 6f 61 64 69 6e 67 20 74       # loading t
3120: 68 69 73 20 66 72 6f 6d 20 74 68 65 20 73 74 61  his from the sta
3130: 74 65 20 6d 6f 72 65 20 74 68 61 6e 0a 09 09 09  te more than....
3140: 20 20 20 20 20 20 23 20 6f 6e 63 65 2e 0a 20 20        # once..  
3150: 20 20 76 61 72 69 61 62 6c 65 20 6d 79 70 6f 73    variable mypos
3160: 20 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 43 6f         {} ; # Co
3170: 6d 6d 69 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  mmit position of
3180: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20   the changeset, 
3190: 69 66 0a 09 09 09 20 20 20 20 20 20 23 20 6b 6e  if....      # kn
31a0: 6f 77 6e 2e 0a 0a 20 20 20 20 23 20 23 20 23 23  own...    # # ##
31b0: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23   ### ##### #####
31c0: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
31d0: 23 0a 20 20 20 20 23 23 20 49 6e 74 65 72 6e 61  #.    ## Interna
31e0: 6c 20 6d 65 74 68 6f 64 73 0a 0a 20 20 20 20 74  l methods..    t
31f0: 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 6f  ypevariable myco
3200: 75 6e 74 65 72 20 20 20 20 20 20 20 20 30 20 3b  unter        0 ;
3210: 20 23 20 49 64 20 63 6f 75 6e 74 65 72 20 66 6f   # Id counter fo
3220: 72 20 63 73 65 74 73 2e 20 4c 61 73 74 20 69 64  r csets. Last id
3230: 0a 09 09 09 09 20 20 20 20 20 20 23 20 75 73 65  .....      # use
3240: 64 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69 61  d..    typevaria
3250: 62 6c 65 20 6d 79 63 73 74 79 70 65 20 2d 61 72  ble mycstype -ar
3260: 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 63  ray {} ; # Map c
3270: 73 74 79 70 65 73 20 28 6e 61 6d 65 73 29 20 74  stypes (names) t
3280: 6f 20 70 65 72 73 69 73 74 65 6e 74 0a 09 09 09  o persistent....
3290: 09 20 20 20 20 20 20 23 20 69 64 73 2e 20 4e 6f  .      # ids. No
32a0: 74 65 20 74 68 61 74 20 77 65 20 68 61 76 65 20  te that we have 
32b0: 74 6f 20 6b 65 65 70 0a 09 09 09 09 20 20 20 20  to keep.....    
32c0: 20 20 23 20 74 68 65 20 6e 61 6d 65 73 20 69 6e    # the names in
32d0: 20 74 68 65 20 74 61 62 6c 65 20 27 63 73 74 79   the table 'csty
32e0: 70 65 27 0a 09 09 09 09 20 20 20 20 20 20 23 20  pe'.....      # 
32f0: 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65  in sync with the
3300: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 0a 09 09   names of the...
3310: 09 09 20 20 20 20 20 20 23 20 68 65 6c 70 65 72  ..      # helper
3320: 20 73 69 6e 67 6c 65 74 6f 6e 73 2e 0a 0a 20 20   singletons...  
3330: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 67 65 74    typemethod get
3340: 63 73 74 79 70 65 73 20 7b 7d 20 7b 0a 09 66 6f  cstypes {} {..fo
3350: 72 65 61 63 68 20 7b 74 69 64 20 6e 61 6d 65 7d  reach {tid name}
3360: 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20   [state run {.. 
3370: 20 20 20 53 45 4c 45 43 54 20 74 69 64 2c 20 6e     SELECT tid, n
3380: 61 6d 65 20 46 52 4f 4d 20 63 73 74 79 70 65 3b  ame FROM cstype;
3390: 0a 09 7d 5d 20 7b 20 73 65 74 20 6d 79 63 73 74  ..}] { set mycst
33a0: 79 70 65 28 24 6e 61 6d 65 29 20 24 74 69 64 20  ype($name) $tid 
33b0: 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  }..return.    }.
33c0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
33d0: 6c 6f 61 64 63 6f 75 6e 74 65 72 20 7b 7d 20 7b  loadcounter {} {
33e0: 0a 09 23 20 49 6e 69 74 69 61 6c 69 7a 65 20 74  ..# Initialize t
33f0: 68 65 20 63 6f 75 6e 74 65 72 20 66 72 6f 6d 20  he counter from 
3400: 74 68 65 20 73 74 61 74 65 0a 09 73 65 74 20 6d  the state..set m
3410: 79 63 6f 75 6e 74 65 72 20 5b 73 74 61 74 65 20  ycounter [state 
3420: 6f 6e 65 20 7b 20 53 45 4c 45 43 54 20 4d 41 58  one { SELECT MAX
3430: 28 63 69 64 29 20 46 52 4f 4d 20 63 68 61 6e 67  (cid) FROM chang
3440: 65 73 65 74 20 7d 5d 0a 09 72 65 74 75 72 6e 0a  eset }]..return.
3450: 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d      }..    typem
3460: 65 74 68 6f 64 20 6e 75 6d 20 7b 7d 20 7b 20 72  ethod num {} { r
3470: 65 74 75 72 6e 20 24 6d 79 63 6f 75 6e 74 65 72  eturn $mycounter
3480: 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 49 6e 69   }..    proc Ini
3490: 74 69 61 6c 69 7a 65 42 72 65 61 6b 53 74 61 74  tializeBreakStat
34a0: 65 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a  e {revisions} {.
34b0: 09 75 70 76 61 72 20 31 20 70 6f 73 20 70 6f 73  .upvar 1 pos pos
34c0: 20 63 72 6f 73 73 20 63 72 6f 73 73 20 72 61 6e   cross cross ran
34d0: 67 65 20 72 61 6e 67 65 20 64 65 70 63 20 64 65  ge range depc de
34e0: 70 63 20 64 65 6c 74 61 20 64 65 6c 74 61 20 5c  pc delta delta \
34f0: 0a 09 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69  ..    dependenci
3500: 65 73 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a  es dependencies.
3510: 0a 09 23 20 46 69 72 73 74 20 77 65 20 63 72 65  ..# First we cre
3520: 61 74 65 20 61 20 6d 61 70 20 6f 66 20 70 6f 73  ate a map of pos
3530: 69 74 69 6f 6e 73 20 74 6f 20 6d 61 6b 65 20 69  itions to make i
3540: 74 20 65 61 73 69 65 72 20 74 6f 0a 09 23 20 64  t easier to..# d
3550: 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72  etermine whether
3560: 20 61 20 64 65 70 65 6e 64 65 6e 63 79 20 63 72   a dependency cr
3570: 6f 73 73 65 73 20 61 20 70 61 72 74 69 63 75 6c  osses a particul
3580: 61 72 20 69 6e 64 65 78 2e 0a 0a 09 61 72 72 61  ar index....arra
3590: 79 20 73 65 74 20 70 6f 73 20 20 20 7b 7d 0a 09  y set pos   {}..
35a0: 61 72 72 61 79 20 73 65 74 20 63 72 6f 73 73 20  array set cross 
35b0: 7b 7d 0a 09 61 72 72 61 79 20 73 65 74 20 64 65  {}..array set de
35c0: 70 63 20 20 7b 7d 0a 09 73 65 74 20 72 61 6e 67  pc  {}..set rang
35d0: 65 20 20 20 20 20 20 20 7b 7d 0a 09 73 65 74 20  e       {}..set 
35e0: 6e 20 30 0a 09 66 6f 72 65 61 63 68 20 72 65 76  n 0..foreach rev
35f0: 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 0a 09 20   $revisions {.. 
3600: 20 20 20 6c 61 70 70 65 6e 64 20 72 61 6e 67 65     lappend range
3610: 20 24 6e 0a 09 20 20 20 20 73 65 74 20 70 6f 73   $n..    set pos
3620: 28 24 72 65 76 29 20 24 6e 0a 09 20 20 20 20 73  ($rev) $n..    s
3630: 65 74 20 63 72 6f 73 73 28 24 6e 29 20 30 0a 09  et cross($n) 0..
3640: 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 0a 09      incr n..}...
3650: 23 20 53 65 63 6f 6e 64 6c 79 20 77 65 20 63 6f  # Secondly we co
3660: 75 6e 74 20 74 68 65 20 63 72 6f 73 73 69 6e 67  unt the crossing
3670: 73 20 70 65 72 20 70 6f 73 69 74 69 6f 6e 2c 20  s per position, 
3680: 62 79 20 69 74 65 72 61 74 69 6e 67 0a 09 23 20  by iterating..# 
3690: 6f 76 65 72 20 74 68 65 20 72 65 63 6f 72 64 65  over the recorde
36a0: 64 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e  d internal depen
36b0: 64 65 6e 63 69 65 73 2e 0a 0a 09 23 20 4e 6f 74  dencies....# Not
36c0: 65 3a 20 49 66 20 74 68 65 20 74 69 6d 65 73 74  e: If the timest
36d0: 61 6d 70 73 20 61 72 65 20 62 61 64 6c 79 20 6f  amps are badly o
36e0: 75 74 20 6f 66 20 6f 72 64 65 72 20 69 74 20 69  ut of order it i
36f0: 73 0a 09 23 20 20 20 20 20 20 20 70 6f 73 73 69  s..#       possi
3700: 62 6c 65 20 74 6f 20 68 61 76 65 20 61 20 62 61  ble to have a ba
3710: 63 6b 77 61 72 64 20 73 75 63 63 65 73 73 6f 72  ckward successor
3720: 20 64 65 70 65 6e 64 65 6e 63 79 2c 0a 09 23 20   dependency,..# 
3730: 20 20 20 20 20 20 69 2e 65 2e 20 77 69 74 68 20        i.e. with 
3740: 73 74 61 72 74 20 3e 20 65 6e 64 2e 20 57 65 20  start > end. We 
3750: 6d 61 79 20 68 61 76 65 20 74 6f 20 73 77 61 70  may have to swap
3760: 20 74 68 65 20 69 6e 64 69 63 65 73 0a 09 23 20   the indices..# 
3770: 20 20 20 20 20 20 74 6f 20 65 6e 73 75 72 65 20        to ensure 
3780: 74 68 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69  that the followi
3790: 6e 67 20 6c 6f 6f 70 20 72 75 6e 73 20 63 6f 72  ng loop runs cor
37a0: 72 65 63 74 6c 79 2e 0a 09 23 0a 09 23 20 4e 6f  rectly...#..# No
37b0: 74 65 20 32 3a 20 73 74 61 72 74 20 3d 3d 20 65  te 2: start == e
37c0: 6e 64 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62  nd is not possib
37d0: 6c 65 2e 20 49 74 20 69 6e 64 69 63 61 74 65 73  le. It indicates
37e0: 20 61 0a 09 23 20 20 20 20 20 20 20 20 20 73 65   a..#         se
37f0: 6c 66 2d 64 65 70 65 6e 64 65 6e 63 79 20 64 75  lf-dependency du
3800: 65 20 74 6f 20 74 68 65 20 75 6e 69 71 75 65 6e  e to the uniquen
3810: 65 73 73 20 6f 66 20 70 6f 73 69 74 69 6f 6e 73  ess of positions
3820: 2c 0a 09 23 20 20 20 20 20 20 20 20 20 61 6e 64  ,..#         and
3830: 20 74 68 61 74 20 69 73 20 73 6f 6d 65 74 68 69   that is somethi
3840: 6e 67 20 77 65 20 68 61 76 65 20 72 75 6c 65 64  ng we have ruled
3850: 20 6f 75 74 20 61 6c 72 65 61 64 79 2c 20 73 65   out already, se
3860: 65 0a 09 23 20 20 20 20 20 20 20 20 20 27 72 65  e..#         're
3870: 76 20 69 6e 74 65 72 6e 61 6c 73 75 63 63 65 73  v internalsucces
3880: 73 6f 72 73 27 2e 0a 0a 09 66 6f 72 65 61 63 68  sors'....foreach
3890: 20 7b 72 69 64 20 63 68 69 6c 64 72 65 6e 7d 20   {rid children} 
38a0: 5b 61 72 72 61 79 20 67 65 74 20 64 65 70 65 6e  [array get depen
38b0: 64 65 6e 63 69 65 73 5d 20 7b 0a 09 20 20 20 20  dencies] {..    
38c0: 66 6f 72 65 61 63 68 20 63 68 69 6c 64 20 24 63  foreach child $c
38d0: 68 69 6c 64 72 65 6e 20 7b 0a 09 09 73 65 74 20  hildren {...set 
38e0: 64 6b 65 79 20 20 20 20 5b 6c 69 73 74 20 24 72  dkey    [list $r
38f0: 69 64 20 24 63 68 69 6c 64 5d 0a 09 09 73 65 74  id $child]...set
3900: 20 73 74 61 72 74 20 20 20 24 70 6f 73 28 24 72   start   $pos($r
3910: 69 64 29 0a 09 09 73 65 74 20 65 6e 64 20 20 20  id)...set end   
3920: 20 20 24 70 6f 73 28 24 63 68 69 6c 64 29 0a 09    $pos($child)..
3930: 09 73 65 74 20 63 72 6f 73 73 65 73 20 7b 7d 0a  .set crosses {}.
3940: 0a 09 09 69 66 20 7b 24 73 74 61 72 74 20 3e 20  ...if {$start > 
3950: 24 65 6e 64 7d 20 7b 0a 09 09 20 20 20 20 77 68  $end} {...    wh
3960: 69 6c 65 20 7b 24 65 6e 64 20 3c 20 24 73 74 61  ile {$end < $sta
3970: 72 74 7d 20 7b 0a 09 09 09 6c 61 70 70 65 6e 64  rt} {....lappend
3980: 20 63 72 6f 73 73 65 73 20 24 65 6e 64 0a 09 09   crosses $end...
3990: 09 69 6e 63 72 20 63 72 6f 73 73 28 24 65 6e 64  .incr cross($end
39a0: 29 0a 09 09 09 69 6e 63 72 20 65 6e 64 0a 09 09  )....incr end...
39b0: 20 20 20 20 7d 0a 09 09 7d 20 65 6c 73 65 20 7b      }...} else {
39c0: 0a 09 09 20 20 20 20 77 68 69 6c 65 20 7b 24 73  ...    while {$s
39d0: 74 61 72 74 20 3c 20 24 65 6e 64 7d 20 7b 0a 09  tart < $end} {..
39e0: 09 09 6c 61 70 70 65 6e 64 20 63 72 6f 73 73 65  ..lappend crosse
39f0: 73 20 24 73 74 61 72 74 0a 09 09 09 69 6e 63 72  s $start....incr
3a00: 20 63 72 6f 73 73 28 24 73 74 61 72 74 29 0a 09   cross($start)..
3a10: 09 09 69 6e 63 72 20 73 74 61 72 74 0a 09 09 20  ..incr start... 
3a20: 20 20 20 7d 0a 09 09 7d 0a 09 09 73 65 74 20 64     }...}...set d
3a30: 65 70 63 28 24 64 6b 65 79 29 20 24 63 72 6f 73  epc($dkey) $cros
3a40: 73 65 73 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09  ses..    }..}...
3a50: 49 6e 69 74 69 61 6c 69 7a 65 44 65 6c 74 61 73  InitializeDeltas
3a60: 20 24 72 65 76 69 73 69 6f 6e 73 0a 09 72 65 74   $revisions..ret
3a70: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  urn.    }..    p
3a80: 72 6f 63 20 49 6e 69 74 69 61 6c 69 7a 65 44 65  roc InitializeDe
3a90: 6c 74 61 73 20 7b 72 65 76 69 73 69 6f 6e 73 7d  ltas {revisions}
3aa0: 20 7b 0a 09 75 70 76 61 72 20 31 20 64 65 6c 74   {..upvar 1 delt
3ab0: 61 20 64 65 6c 74 61 0a 0a 09 23 20 50 75 6c 6c  a delta...# Pull
3ac0: 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 73 20   the timestamps 
3ad0: 66 6f 72 20 61 6c 6c 20 72 65 76 69 73 69 6f 6e  for all revision
3ae0: 73 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73  s in the changes
3af0: 65 74 73 20 61 6e 64 0a 09 23 20 63 6f 6d 70 75  ets and..# compu
3b00: 74 65 20 74 68 65 69 72 20 64 65 6c 74 61 73 20  te their deltas 
3b10: 66 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 62  for use by the b
3b20: 72 65 61 6b 20 66 69 6e 64 65 72 2e 0a 0a 09 61  reak finder....a
3b30: 72 72 61 79 20 73 65 74 20 64 65 6c 74 61 20 7b  rray set delta {
3b40: 7d 0a 09 61 72 72 61 79 20 73 65 74 20 73 74 61  }..array set sta
3b50: 6d 70 20 7b 7d 0a 0a 09 73 65 74 20 74 68 65 73  mp {}...set thes
3b60: 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69  et ('[join $revi
3b70: 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 09  sions {','}]')..
3b80: 66 6f 72 65 61 63 68 20 7b 72 69 64 20 74 69 6d  foreach {rid tim
3b90: 65 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a  e} [state run ".
3ba0: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69  .    SELECT R.ri
3bb0: 64 2c 20 52 2e 64 61 74 65 0a 09 20 20 20 20 46  d, R.date..    F
3bc0: 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 0a 09  ROM revision R..
3bd0: 20 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 20      WHERE R.rid 
3be0: 49 4e 20 24 74 68 65 73 65 74 0a 09 22 5d 20 7b  IN $theset.."] {
3bf0: 0a 09 20 20 20 20 73 65 74 20 73 74 61 6d 70 28  ..    set stamp(
3c00: 24 72 69 64 29 20 24 74 69 6d 65 0a 09 7d 0a 0a  $rid) $time..}..
3c10: 09 73 65 74 20 6e 20 30 0a 09 66 6f 72 65 61 63  .set n 0..foreac
3c20: 68 20 72 69 64 20 5b 6c 72 61 6e 67 65 20 24 72  h rid [lrange $r
3c30: 65 76 69 73 69 6f 6e 73 20 30 20 65 6e 64 2d 31  evisions 0 end-1
3c40: 5d 20 72 6e 65 78 74 20 5b 6c 72 61 6e 67 65 20  ] rnext [lrange 
3c50: 24 72 65 76 69 73 69 6f 6e 73 20 31 20 65 6e 64  $revisions 1 end
3c60: 5d 20 7b 0a 09 20 20 20 20 73 65 74 20 64 65 6c  ] {..    set del
3c70: 74 61 28 24 6e 29 20 5b 65 78 70 72 20 7b 24 73  ta($n) [expr {$s
3c80: 74 61 6d 70 28 24 72 6e 65 78 74 29 20 2d 20 24  tamp($rnext) - $
3c90: 73 74 61 6d 70 28 24 72 69 64 29 7d 5d 0a 09 20  stamp($rid)}].. 
3ca0: 20 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 09 72 65     incr n..}..re
3cb0: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
3cc0: 70 72 6f 63 20 46 69 6e 64 42 65 73 74 42 72 65  proc FindBestBre
3cd0: 61 6b 20 7b 72 61 6e 67 65 7d 20 7b 0a 09 75 70  ak {range} {..up
3ce0: 76 61 72 20 31 20 63 72 6f 73 73 20 63 72 6f 73  var 1 cross cros
3cf0: 73 20 64 65 6c 74 61 20 64 65 6c 74 61 0a 0a 09  s delta delta...
3d00: 23 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  # Determine the 
3d10: 62 65 73 74 20 62 72 65 61 6b 20 6c 6f 63 61 74  best break locat
3d20: 69 6f 6e 20 69 6e 20 74 68 65 20 67 69 76 65 6e  ion in the given
3d30: 20 72 61 6e 67 65 20 6f 66 0a 09 23 20 70 6f 73   range of..# pos
3d40: 69 74 69 6f 6e 73 2e 20 46 69 72 73 74 20 77 65  itions. First we
3d50: 20 6c 6f 6f 6b 20 66 6f 72 20 74 68 65 20 6c 6f   look for the lo
3d60: 63 61 74 69 6f 6e 73 20 77 69 74 68 20 74 68 65  cations with the
3d70: 20 6d 61 78 69 6d 61 6c 0a 09 23 20 6e 75 6d 62   maximal..# numb
3d80: 65 72 20 6f 66 20 63 72 6f 73 73 69 6e 67 73 2e  er of crossings.
3d90: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 65   If there are se
3da0: 76 65 72 61 6c 20 77 65 20 6c 6f 6f 6b 20 66 6f  veral we look fo
3db0: 72 20 74 68 65 0a 09 23 20 73 68 6f 72 74 65 73  r the..# shortes
3dc0: 74 20 74 69 6d 65 20 69 6e 74 65 72 76 61 6c 20  t time interval 
3dd0: 61 6d 6f 6e 67 20 74 68 65 6d 2e 20 49 66 20 77  among them. If w
3de0: 65 20 73 74 69 6c 6c 20 68 61 76 65 20 6d 75 6c  e still have mul
3df0: 74 69 70 6c 65 0a 09 23 20 70 6f 73 73 69 62 69  tiple..# possibi
3e00: 6c 69 74 69 65 73 20 61 66 74 65 72 20 74 68 61  lities after tha
3e10: 74 20 77 65 20 73 65 6c 65 63 74 20 74 68 65 20  t we select the 
3e20: 65 61 72 6c 69 65 73 74 20 6c 6f 63 61 74 69 6f  earliest locatio
3e30: 6e 0a 09 23 20 61 6d 6f 6e 67 20 74 68 65 73 65  n..# among these
3e40: 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 49 66 20 74  ....# Note: If t
3e50: 68 65 20 6d 61 78 69 6d 61 6c 20 6e 75 6d 62 65  he maximal numbe
3e60: 72 20 6f 66 20 63 72 6f 73 73 69 6e 67 73 20 69  r of crossings i
3e70: 73 20 30 20 74 68 65 6e 20 74 68 65 20 72 61 6e  s 0 then the ran
3e80: 67 65 0a 09 23 20 20 20 20 20 20 20 68 61 73 20  ge..#       has 
3e90: 6e 6f 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65  no internal depe
3ea0: 6e 64 65 6e 63 69 65 73 2c 20 61 6e 64 20 6e 6f  ndencies, and no
3eb0: 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20   break location 
3ec0: 61 74 0a 09 23 20 20 20 20 20 20 20 61 6c 6c 2e  at..#       all.
3ed0: 20 54 68 69 73 20 70 6f 73 73 69 62 69 6c 69 74   This possibilit
3ee0: 79 20 69 73 20 73 69 67 6e 61 6c 65 64 20 76 69  y is signaled vi
3ef0: 61 20 72 65 73 75 6c 74 20 2d 31 2e 0a 0a 09 23  a result -1....#
3f00: 20 4e 6f 74 65 3a 20 41 20 72 61 6e 67 65 20 6f   Note: A range o
3f10: 66 20 6c 65 6e 67 74 68 20 31 20 6f 72 20 6c 65  f length 1 or le
3f20: 73 73 20 63 61 6e 6e 6f 74 20 68 61 76 65 20 69  ss cannot have i
3f30: 6e 74 65 72 6e 61 6c 0a 09 23 20 20 20 20 20 20  nternal..#      
3f40: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61   dependencies, a
3f50: 73 20 74 68 61 74 20 6e 65 65 64 73 20 61 74 20  s that needs at 
3f60: 6c 65 61 73 74 20 74 77 6f 20 72 65 76 69 73 69  least two revisi
3f70: 6f 6e 73 20 69 6e 0a 09 23 20 20 20 20 20 20 20  ons in..#       
3f80: 74 68 65 20 72 61 6e 67 65 2e 0a 0a 09 69 66 20  the range....if 
3f90: 7b 5b 6c 6c 65 6e 67 74 68 20 24 72 61 6e 67 65  {[llength $range
3fa0: 5d 20 3c 20 32 7d 20 7b 20 72 65 74 75 72 6e 20  ] < 2} { return 
3fb0: 2d 31 20 7d 0a 0a 09 73 65 74 20 6d 61 78 20 2d  -1 }...set max -
3fc0: 31 0a 09 73 65 74 20 62 65 73 74 20 7b 7d 0a 0a  1..set best {}..
3fd0: 09 66 6f 72 65 61 63 68 20 6c 6f 63 61 74 69 6f  .foreach locatio
3fe0: 6e 20 24 72 61 6e 67 65 20 7b 0a 09 20 20 20 20  n $range {..    
3ff0: 73 65 74 20 63 72 6f 73 73 69 6e 67 73 20 24 63  set crossings $c
4000: 72 6f 73 73 28 24 6c 6f 63 61 74 69 6f 6e 29 0a  ross($location).
4010: 09 20 20 20 20 69 66 20 7b 24 63 72 6f 73 73 69  .    if {$crossi
4020: 6e 67 73 20 3e 20 24 6d 61 78 7d 20 7b 0a 09 09  ngs > $max} {...
4030: 73 65 74 20 6d 61 78 20 20 24 63 72 6f 73 73 69  set max  $crossi
4040: 6e 67 73 0a 09 09 73 65 74 20 62 65 73 74 20 5b  ngs...set best [
4050: 6c 69 73 74 20 24 6c 6f 63 61 74 69 6f 6e 5d 0a  list $location].
4060: 09 09 63 6f 6e 74 69 6e 75 65 0a 09 20 20 20 20  ..continue..    
4070: 7d 20 65 6c 73 65 69 66 20 7b 24 63 72 6f 73 73  } elseif {$cross
4080: 69 6e 67 73 20 3d 3d 20 24 6d 61 78 7d 20 7b 0a  ings == $max} {.
4090: 09 09 6c 61 70 70 65 6e 64 20 62 65 73 74 20 24  ..lappend best $
40a0: 6c 6f 63 61 74 69 6f 6e 0a 09 20 20 20 20 7d 0a  location..    }.
40b0: 09 7d 0a 0a 09 69 66 20 7b 24 6d 61 78 20 3d 3d  .}...if {$max ==
40c0: 20 30 7d 20 20 20 20 20 20 20 20 20 20 20 20 7b   0}            {
40d0: 20 72 65 74 75 72 6e 20 2d 31 20 7d 0a 09 69 66   return -1 }..if
40e0: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 62 65 73 74   {[llength $best
40f0: 5d 20 3d 3d 20 31 7d 20 7b 20 72 65 74 75 72 6e  ] == 1} { return
4100: 20 5b 6c 69 6e 64 65 78 20 24 62 65 73 74 20 30   [lindex $best 0
4110: 5d 20 7d 0a 0a 09 73 65 74 20 6c 6f 63 61 74 69  ] }...set locati
4120: 6f 6e 73 20 24 62 65 73 74 0a 09 73 65 74 20 62  ons $best..set b
4130: 65 73 74 20 7b 7d 0a 09 73 65 74 20 6d 69 6e 20  est {}..set min 
4140: 2d 31 0a 0a 09 66 6f 72 65 61 63 68 20 6c 6f 63  -1...foreach loc
4150: 61 74 69 6f 6e 20 24 6c 6f 63 61 74 69 6f 6e 73  ation $locations
4160: 20 7b 0a 09 20 20 20 20 73 65 74 20 69 6e 74 65   {..    set inte
4170: 72 76 61 6c 20 24 64 65 6c 74 61 28 24 6c 6f 63  rval $delta($loc
4180: 61 74 69 6f 6e 29 0a 09 20 20 20 20 69 66 20 7b  ation)..    if {
4190: 28 24 6d 69 6e 20 3c 20 30 29 20 7c 7c 20 28 24  ($min < 0) || ($
41a0: 69 6e 74 65 72 76 61 6c 20 3c 20 24 6d 69 6e 29  interval < $min)
41b0: 7d 20 7b 0a 09 09 73 65 74 20 6d 69 6e 20 20 24  } {...set min  $
41c0: 69 6e 74 65 72 76 61 6c 0a 09 09 73 65 74 20 62  interval...set b
41d0: 65 73 74 20 5b 6c 69 73 74 20 24 6c 6f 63 61 74  est [list $locat
41e0: 69 6f 6e 5d 0a 09 20 20 20 20 7d 20 65 6c 73 65  ion]..    } else
41f0: 69 66 20 7b 24 69 6e 74 65 72 76 61 6c 20 3d 3d  if {$interval ==
4200: 20 24 6d 69 6e 7d 20 7b 0a 09 09 6c 61 70 70 65   $min} {...lappe
4210: 6e 64 20 62 65 73 74 20 24 6c 6f 63 61 74 69 6f  nd best $locatio
4220: 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66  n..    }..}...if
4230: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 62 65 73 74   {[llength $best
4240: 5d 20 3d 3d 20 31 7d 20 7b 20 72 65 74 75 72 6e  ] == 1} { return
4250: 20 5b 6c 69 6e 64 65 78 20 24 62 65 73 74 20 30   [lindex $best 0
4260: 5d 20 7d 0a 0a 09 72 65 74 75 72 6e 20 5b 6c 69  ] }...return [li
4270: 6e 64 65 78 20 5b 6c 73 6f 72 74 20 2d 69 6e 74  ndex [lsort -int
4280: 65 67 65 72 20 2d 69 6e 63 72 65 61 73 69 6e 67  eger -increasing
4290: 20 24 62 65 73 74 5d 20 30 5d 0a 20 20 20 20 7d   $best] 0].    }
42a0: 0a 0a 20 20 20 20 70 72 6f 63 20 43 75 74 41 74  ..    proc CutAt
42b0: 20 7b 6c 6f 63 61 74 69 6f 6e 7d 20 7b 0a 09 75   {location} {..u
42c0: 70 76 61 72 20 31 20 63 72 6f 73 73 20 63 72 6f  pvar 1 cross cro
42d0: 73 73 20 64 65 70 63 20 64 65 70 63 0a 0a 09 23  ss depc depc...#
42e0: 20 49 74 20 77 61 73 20 64 65 63 69 64 65 64 20   It was decided 
42f0: 74 6f 20 73 70 6c 69 74 20 74 68 65 20 63 68 61  to split the cha
4300: 6e 67 65 73 65 74 20 61 74 20 74 68 65 20 67 69  ngeset at the gi
4310: 76 65 6e 0a 09 23 20 6c 6f 63 61 74 69 6f 6e 2e  ven..# location.
4320: 20 54 68 69 73 20 63 75 74 73 20 61 20 6e 75 6d   This cuts a num
4330: 62 65 72 20 6f 66 20 64 65 70 65 6e 64 65 6e 63  ber of dependenc
4340: 69 65 73 2e 20 48 65 72 65 20 77 65 20 75 70 64  ies. Here we upd
4350: 61 74 65 0a 09 23 20 74 68 65 20 63 72 6f 73 73  ate..# the cross
4360: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20   information so 
4370: 74 68 61 74 20 74 68 65 20 62 72 65 61 6b 20 66  that the break f
4380: 69 6e 64 65 72 20 68 61 73 20 61 63 63 75 72 61  inder has accura
4390: 74 65 0a 09 23 20 64 61 74 61 20 77 68 65 6e 20  te..# data when 
43a0: 77 65 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20 67  we look at the g
43b0: 65 6e 65 72 61 74 65 64 20 66 72 61 67 6d 65 6e  enerated fragmen
43c0: 74 73 2e 0a 0a 09 73 65 74 20 73 69 78 20 5b 6c  ts....set six [l
43d0: 6f 67 20 76 69 73 69 62 6c 65 3f 20 36 5d 0a 0a  og visible? 6]..
43e0: 09 66 6f 72 65 61 63 68 20 7b 64 65 70 20 72 61  .foreach {dep ra
43f0: 6e 67 65 7d 20 5b 61 72 72 61 79 20 67 65 74 20  nge} [array get 
4400: 64 65 70 63 5d 20 7b 0a 09 20 20 20 20 23 20 43  depc] {..    # C
4410: 68 65 63 6b 20 61 6c 6c 20 64 65 70 65 6e 64 65  heck all depende
4420: 6e 63 69 65 73 20 73 74 69 6c 6c 20 6b 6e 6f 77  ncies still know
4430: 6e 2c 20 74 61 6b 65 20 74 68 65 69 72 20 72 61  n, take their ra
4440: 6e 67 65 20 61 6e 64 0a 09 20 20 20 20 23 20 73  nge and..    # s
4450: 65 65 20 69 66 20 74 68 65 20 62 72 65 61 6b 20  ee if the break 
4460: 6c 6f 63 61 74 69 6f 6e 20 66 61 6c 6c 73 20 77  location falls w
4470: 69 74 68 69 6e 2e 0a 0a 09 20 20 20 20 42 6f 72  ithin....    Bor
4480: 64 65 72 20 24 72 61 6e 67 65 20 73 20 65 0a 09  der $range s e..
4490: 20 20 20 20 69 66 20 7b 24 6c 6f 63 61 74 69 6f      if {$locatio
44a0: 6e 20 3c 20 24 73 7d 20 63 6f 6e 74 69 6e 75 65  n < $s} continue
44b0: 20 3b 20 23 20 62 72 65 61 6b 20 62 65 66 6f 72   ; # break befor
44c0: 65 20 72 61 6e 67 65 2c 20 69 67 6e 6f 72 65 0a  e range, ignore.
44d0: 09 20 20 20 20 69 66 20 7b 24 6c 6f 63 61 74 69  .    if {$locati
44e0: 6f 6e 20 3e 20 24 65 7d 20 63 6f 6e 74 69 6e 75  on > $e} continu
44f0: 65 20 3b 20 23 20 62 72 65 61 6b 20 61 66 74 65  e ; # break afte
4500: 72 20 72 61 6e 67 65 2c 20 69 67 6e 6f 72 65 2e  r range, ignore.
4510: 0a 0a 09 20 20 20 20 23 20 54 68 69 73 20 64 65  ...    # This de
4520: 70 65 6e 64 65 6e 63 79 20 63 72 6f 73 73 65 73  pendency crosses
4530: 20 74 68 65 20 62 72 65 61 6b 20 6c 6f 63 61 74   the break locat
4540: 69 6f 6e 2e 20 57 65 20 72 65 6d 6f 76 65 20 69  ion. We remove i
4550: 74 0a 09 20 20 20 20 23 20 66 72 6f 6d 20 74 68  t..    # from th
4560: 65 20 63 72 6f 73 73 69 6e 67 73 20 63 6f 75 6e  e crossings coun
4570: 74 65 72 73 2c 20 61 6e 64 20 74 68 65 6e 20 61  ters, and then a
4580: 6c 73 6f 20 66 72 6f 6d 20 74 68 65 20 73 65 74  lso from the set
4590: 0a 09 20 20 20 20 23 20 6f 66 20 6b 6e 6f 77 6e  ..    # of known
45a0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61   dependencies, a
45b0: 73 20 77 65 20 61 72 65 20 64 6f 6e 65 20 77 69  s we are done wi
45c0: 74 68 20 69 74 2e 0a 0a 09 20 20 20 20 66 6f 72  th it....    for
45d0: 65 61 63 68 20 6c 6f 63 20 24 64 65 70 63 28 24  each loc $depc($
45e0: 64 65 70 29 20 7b 20 69 6e 63 72 20 63 72 6f 73  dep) { incr cros
45f0: 73 28 24 6c 6f 63 29 20 2d 31 20 7d 0a 09 20 20  s($loc) -1 }..  
4600: 20 20 75 6e 73 65 74 20 64 65 70 63 28 24 64 65    unset depc($de
4610: 70 29 0a 0a 09 20 20 20 20 69 66 20 7b 21 24 73  p)...    if {!$s
4620: 69 78 7d 20 63 6f 6e 74 69 6e 75 65 0a 0a 09 20  ix} continue... 
4630: 20 20 20 73 74 72 75 63 74 3a 3a 6c 69 73 74 20     struct::list 
4640: 61 73 73 69 67 6e 20 24 64 65 70 20 70 61 72 65  assign $dep pare
4650: 6e 74 20 63 68 69 6c 64 0a 09 20 20 20 20 6c 6f  nt child..    lo
4660: 67 20 77 72 69 74 65 20 35 20 63 73 65 74 73 20  g write 5 csets 
4670: 22 42 72 6f 6b 65 20 64 65 70 65 6e 64 65 6e 63  "Broke dependenc
4680: 79 20 5b 50 44 20 24 70 61 72 65 6e 74 5d 20 2d  y [PD $parent] -
4690: 2d 3e 20 5b 50 44 20 24 63 68 69 6c 64 5d 22 0a  -> [PD $child]".
46a0: 09 7d 0a 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  .}...return.    
46b0: 7d 0a 0a 20 20 20 20 23 20 50 72 69 6e 74 20 69  }..    # Print i
46c0: 64 65 6e 74 69 66 79 69 6e 67 20 64 61 74 61 20  dentifying data 
46d0: 66 6f 72 20 61 20 72 65 76 69 73 69 6f 6e 20 28  for a revision (
46e0: 70 72 6f 6a 65 63 74 2c 20 66 69 6c 65 2c 20 64  project, file, d
46f0: 6f 74 74 65 64 20 72 65 76 0a 20 20 20 20 23 20  otted rev.    # 
4700: 6e 75 6d 62 65 72 29 2c 20 66 6f 72 20 68 69 67  number), for hig
4710: 68 20 76 65 72 62 6f 73 69 74 79 20 6c 6f 67 20  h verbosity log 
4720: 6f 75 74 70 75 74 2e 0a 0a 20 20 20 20 70 72 6f  output...    pro
4730: 63 20 50 44 20 7b 69 64 7d 20 7b 0a 09 66 6f 72  c PD {id} {..for
4740: 65 61 63 68 20 7b 70 20 66 20 72 7d 20 5b 73 74  each {p f r} [st
4750: 61 74 65 20 72 75 6e 20 7b 0a 09 09 53 45 4c 45  ate run {...SELE
4760: 43 54 20 50 2e 6e 61 6d 65 20 2c 20 46 2e 6e 61  CT P.name , F.na
4770: 6d 65 2c 20 52 2e 72 65 76 0a 09 09 46 52 4f 4d  me, R.rev...FROM
4780: 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 66 69 6c   revision R, fil
4790: 65 20 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09  e F, project P..
47a0: 09 57 48 45 52 45 20 52 2e 72 69 64 20 3d 20 24  .WHERE R.rid = $
47b0: 69 64 0a 09 09 41 4e 44 20 20 20 52 2e 66 69 64  id...AND   R.fid
47c0: 20 3d 20 46 2e 66 69 64 0a 09 09 41 4e 44 20 20   = F.fid...AND  
47d0: 20 46 2e 70 69 64 20 3d 20 50 2e 70 69 64 0a 09   F.pid = P.pid..
47e0: 7d 5d 20 62 72 65 61 6b 0a 09 72 65 74 75 72 6e  }] break..return
47f0: 20 22 27 24 70 20 3a 20 24 66 2f 24 72 27 22 0a   "'$p : $f/$r'".
4800: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 50 72 69      }..    # Pri
4810: 6e 74 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72  nting one or mor
4820: 65 20 72 61 6e 67 65 73 2c 20 66 6f 72 6d 61 74  e ranges, format
4830: 74 65 64 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68  ted, and only th
4840: 65 69 72 20 62 6f 72 64 65 72 20 74 6f 0a 20 20  eir border to.  
4850: 20 20 23 20 6b 65 65 70 20 74 68 65 20 73 74 72    # keep the str
4860: 69 6e 67 73 20 73 68 6f 72 74 2e 0a 0a 20 20 20  ings short...   
4870: 20 70 72 6f 63 20 50 52 73 20 7b 72 61 6e 67 65   proc PRs {range
4880: 73 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b 73 74  s} {..return [st
4890: 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20 24  ruct::list map $
48a0: 72 61 6e 67 65 73 20 5b 6d 79 70 72 6f 63 20 50  ranges [myproc P
48b0: 52 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  R]].    }..    p
48c0: 72 6f 63 20 50 52 20 7b 72 61 6e 67 65 7d 20 7b  roc PR {range} {
48d0: 0a 09 42 6f 72 64 65 72 20 24 72 61 6e 67 65 20  ..Border $range 
48e0: 73 20 65 0a 09 72 65 74 75 72 6e 20 3c 24 7b 73  s e..return <${s
48f0: 7d 2e 2e 2e 24 7b 65 7d 3e 0a 20 20 20 20 7d 0a  }...${e}>.    }.
4900: 0a 20 20 20 20 70 72 6f 63 20 42 6f 72 64 65 72  .    proc Border
4910: 20 7b 72 61 6e 67 65 20 73 76 20 65 76 7d 20 7b   {range sv ev} {
4920: 0a 09 75 70 76 61 72 20 31 20 24 73 76 20 73 20  ..upvar 1 $sv s 
4930: 24 65 76 20 65 0a 09 73 65 74 20 73 20 5b 6c 69  $ev e..set s [li
4940: 6e 64 65 78 20 24 72 61 6e 67 65 20 30 5d 0a 09  ndex $range 0]..
4950: 73 65 74 20 65 20 5b 6c 69 6e 64 65 78 20 24 72  set e [lindex $r
4960: 61 6e 67 65 20 65 6e 64 5d 0a 09 72 65 74 75 72  ange end]..retur
4970: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23  n.    }..    # #
4980: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23   ## ### ##### ##
4990: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
49a0: 23 23 23 23 0a 0a 20 20 20 20 74 79 70 65 76 61  ####..    typeva
49b0: 72 69 61 62 6c 65 20 6d 79 63 68 61 6e 67 65 73  riable mychanges
49c0: 65 74 73 20 20 20 20 7b 7d 20 3b 20 23 20 4c 69  ets    {} ; # Li
49d0: 73 74 20 6f 66 20 61 6c 6c 20 6b 6e 6f 77 6e 20  st of all known 
49e0: 63 68 61 6e 67 65 73 65 74 73 2e 0a 20 20 20 20  changesets..    
49f0: 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 72  typevariable myr
4a00: 65 76 6d 61 70 20 2d 61 72 72 61 79 20 7b 7d 20  evmap -array {} 
4a10: 3b 20 23 20 4d 61 70 20 66 72 6f 6d 20 72 65 76  ; # Map from rev
4a20: 69 73 69 6f 6e 73 20 74 6f 20 74 68 65 20 6c 69  isions to the li
4a30: 73 74 0a 09 09 09 09 20 20 20 20 20 20 23 20 6f  st.....      # o
4a40: 66 20 63 68 61 6e 67 65 73 65 74 73 20 63 6f 6e  f changesets con
4a50: 74 61 69 6e 69 6e 67 0a 09 09 09 09 20 20 20 20  taining.....    
4a60: 20 20 23 20 69 74 2e 20 4e 4f 54 45 3a 20 57 68    # it. NOTE: Wh
4a70: 69 6c 65 20 6f 6e 6c 79 20 6f 6e 65 0a 09 09 09  ile only one....
4a80: 09 20 20 20 20 20 20 23 20 72 65 76 69 73 69 6f  .      # revisio
4a90: 6e 20 63 68 61 6e 67 65 73 65 74 20 63 61 6e 20  n changeset can 
4aa0: 63 6f 6e 74 61 69 6e 0a 09 09 09 09 20 20 20 20  contain.....    
4ab0: 20 20 23 20 74 68 65 20 72 65 76 69 73 69 6f 6e    # the revision
4ac0: 2c 20 74 68 65 72 65 20 63 61 6e 0a 09 09 09 09  , there can.....
4ad0: 20 20 20 20 20 20 23 20 68 6f 77 65 76 65 72 20        # however 
4ae0: 61 6c 73 6f 20 62 65 20 6f 6e 65 20 6f 72 20 6d  also be one or m
4af0: 6f 72 65 0a 09 09 09 09 20 20 20 20 20 20 23 20  ore.....      # 
4b00: 61 64 64 69 74 69 6f 6e 61 6c 20 73 79 6d 62 6f  additional symbo
4b10: 6c 20 63 68 61 6e 67 65 73 65 74 73 0a 09 09 09  l changesets....
4b20: 09 20 20 20 20 20 20 23 20 77 68 69 63 68 20 75  .      # which u
4b30: 73 65 20 69 74 2c 20 68 65 6e 63 65 20 61 20 6c  se it, hence a l
4b40: 69 73 74 2e 0a 20 20 20 20 74 79 70 65 76 61 72  ist..    typevar
4b50: 69 61 62 6c 65 20 6d 79 69 64 6d 61 70 20 20 2d  iable myidmap  -
4b60: 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70  array {} ; # Map
4b70: 20 66 72 6f 6d 20 63 68 61 6e 67 65 73 65 74 20   from changeset 
4b80: 69 64 20 74 6f 20 63 68 61 6e 67 65 73 65 74 2e  id to changeset.
4b90: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ..    typemethod
4ba0: 20 61 6c 6c 20 20 20 7b 7d 20 20 20 7b 20 72 65   all   {}   { re
4bb0: 74 75 72 6e 20 24 6d 79 63 68 61 6e 67 65 73 65  turn $mychangese
4bc0: 74 73 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74  ts }.    typemet
4bd0: 68 6f 64 20 6f 66 20 20 20 20 7b 69 64 7d 20 7b  hod of    {id} {
4be0: 20 72 65 74 75 72 6e 20 24 6d 79 69 64 6d 61 70   return $myidmap
4bf0: 28 24 69 64 29 20 7d 0a 20 20 20 20 74 79 70 65  ($id) }.    type
4c00: 6d 65 74 68 6f 64 20 6f 66 72 65 76 20 7b 69 64  method ofrev {id
4c10: 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 72 65  } { return $myre
4c20: 76 6d 61 70 28 24 69 64 29 20 7d 0a 0a 20 20 20  vmap($id) }..   
4c30: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23   # # ## ### ####
4c40: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
4c50: 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20  ########.    ## 
4c60: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a 20  Configuration.. 
4c70: 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79     pragma -hasty
4c80: 70 65 69 6e 66 6f 20 20 20 20 6e 6f 20 20 3b 20  peinfo    no  ; 
4c90: 23 20 6e 6f 20 74 79 70 65 20 69 6e 74 72 6f 73  # no type intros
4ca0: 70 65 63 74 69 6f 6e 0a 20 20 20 20 70 72 61 67  pection.    prag
4cb0: 6d 61 20 2d 68 61 73 69 6e 66 6f 20 20 20 20 20  ma -hasinfo     
4cc0: 20 20 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 6f 62     no  ; # no ob
4cd0: 6a 65 63 74 20 69 6e 74 72 6f 73 70 65 63 74 69  ject introspecti
4ce0: 6f 6e 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23  on..    # # ## #
4cf0: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
4d00: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  # #############.
4d10: 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23 23  }..# # ## ### ##
4d20: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23  ### ######## ###
4d30: 23 23 23 23 23 23 23 23 23 23 20 23 23 23 23 23  ########## #####
4d40: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4d50: 0a 23 23 20 48 65 6c 70 65 72 20 73 69 6e 67 6c  .## Helper singl
4d60: 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20 66  eton. Commands f
4d70: 6f 72 20 72 65 76 69 73 69 6f 6e 20 63 68 61 6e  or revision chan
4d80: 67 65 73 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74  gesets...snit::t
4d90: 79 70 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c  ype ::vc::fossil
4da0: 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70  ::import::cvs::p
4db0: 72 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 72 65 76  roject::rev::rev
4dc0: 20 7b 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f   {.    typemetho
4dd0: 64 20 62 79 72 65 76 69 73 69 6f 6e 20 7b 7d 20  d byrevision {} 
4de0: 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20  { return 1 }.   
4df0: 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 73 79   typemethod bysy
4e00: 6d 62 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 74 75  mbol   {} { retu
4e10: 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d  rn 0 }.    typem
4e20: 65 74 68 6f 64 20 69 73 74 61 67 20 20 20 20 20  ethod istag     
4e30: 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d   {} { return 0 }
4e40: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
4e50: 69 73 62 72 61 6e 63 68 20 20 20 7b 7d 20 7b 20  isbranch   {} { 
4e60: 72 65 74 75 72 6e 20 30 20 7d 0a 0a 20 20 20 20  return 0 }..    
4e70: 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73 74 20  # result = list 
4e80: 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74 69 6d  (mintime, maxtim
4e90: 65 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  e).    typemetho
4ea0: 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 69 74 65  d timerange {ite
4eb0: 6d 73 7d 20 7b 0a 09 73 65 74 20 74 68 65 73 65  ms} {..set these
4ec0: 74 20 28 27 5b 6a 6f 69 6e 20 24 69 74 65 6d 73  t ('[join $items
4ed0: 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72   {','}]')..retur
4ee0: 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09  n [state run "..
4ef0: 20 20 20 20 53 45 4c 45 43 54 20 4d 49 4e 28 52      SELECT MIN(R
4f00: 2e 64 61 74 65 29 2c 20 4d 41 58 28 52 2e 64 61  .date), MAX(R.da
4f10: 74 65 29 0a 09 20 20 20 20 46 52 4f 4d 20 72 65  te)..    FROM re
4f20: 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48  vision R..    WH
4f30: 45 52 45 20 52 2e 72 69 64 20 49 4e 20 24 74 68  ERE R.rid IN $th
4f40: 65 73 65 74 0a 09 22 5d 0a 20 20 20 20 7d 0a 0a  eset.."].    }..
4f50: 20 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20      # var(dv) = 
4f60: 64 69 63 74 20 28 72 65 76 69 73 69 6f 6e 20 2d  dict (revision -
4f70: 3e 20 6c 69 73 74 20 28 72 65 76 69 73 69 6f 6e  > list (revision
4f80: 29 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  )).    typemetho
4f90: 64 20 69 6e 74 65 72 6e 61 6c 73 75 63 63 65 73  d internalsucces
4fa0: 73 6f 72 73 20 7b 64 76 20 72 65 76 69 73 69 6f  sors {dv revisio
4fb0: 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24  ns} {..upvar 1 $
4fc0: 64 76 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a  dv dependencies.
4fd0: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a  .set theset ('[j
4fe0: 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b  oin $revisions {
4ff0: 27 2c 27 7d 5d 27 29 0a 0a 09 23 20 53 65 65 20  ','}]')...# See 
5000: 27 73 75 63 63 65 73 73 6f 72 73 27 20 62 65 6c  'successors' bel
5010: 6f 77 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  ow for the main 
5020: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 0a 09  explanation of..
5030: 23 20 74 68 65 20 76 61 72 69 6f 75 73 20 63 61  # the various ca
5040: 73 65 73 2e 20 54 68 69 73 20 70 69 65 63 65 20  ses. This piece 
5050: 69 73 20 73 70 65 63 69 61 6c 20 69 6e 20 74 68  is special in th
5060: 61 74 20 69 74 0a 09 23 20 72 65 73 74 72 69 63  at it..# restric
5070: 74 73 20 74 68 65 20 73 75 63 63 65 73 73 6f 72  ts the successor
5080: 73 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 6f  s we look for to
5090: 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66   the same set of
50a0: 0a 09 23 20 72 65 76 69 73 69 6f 6e 73 20 77 65  ..# revisions we
50b0: 20 73 74 61 72 74 20 66 72 6f 6d 2e 20 53 65 6e   start from. Sen
50c0: 73 69 62 6c 65 20 61 73 20 77 65 20 61 72 65 20  sible as we are 
50d0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 0a 09 23 20 63  looking for..# c
50e0: 68 61 6e 67 65 73 65 74 20 69 6e 74 65 72 6e 61  hangeset interna
50f0: 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 0a  l dependencies..
5100: 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 70 20  ..array set dep 
5110: 7b 7d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69  {}...foreach {ri
5120: 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20  d child} [state 
5130: 72 75 6e 20 22 0a 20 20 20 2d 2d 20 28 31 29 20  run ".   -- (1) 
5140: 50 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 09 20  Primary child.. 
5150: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c     SELECT R.rid,
5160: 20 52 2e 63 68 69 6c 64 0a 09 20 20 20 20 46 52   R.child..    FR
5170: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 0a  OM   revision R.
5180: 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69  .    WHERE  R.ri
5190: 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20  d   IN $theset  
51a0: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74     -- Restrict t
51b0: 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69  o revisions of i
51c0: 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44  nterest..    AND
51d0: 20 20 20 20 52 2e 63 68 69 6c 64 20 49 53 20 4e      R.child IS N
51e0: 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61  OT NULL    -- Ha
51f0: 73 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 0a  s primary child.
5200: 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 63 68  .    AND    R.ch
5210: 69 6c 64 20 49 4e 20 24 74 68 65 73 65 74 20 20  ild IN $theset  
5220: 20 20 20 2d 2d 20 57 68 69 63 68 20 69 73 20 61     -- Which is a
5230: 6c 73 6f 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  lso of interest.
5240: 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d      UNION.    --
5250: 20 28 32 29 20 53 65 63 6f 6e 64 61 72 79 20 28   (2) Secondary (
5260: 62 72 61 6e 63 68 29 20 63 68 69 6c 64 72 65 6e  branch) children
5270: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
5280: 69 64 2c 20 42 2e 62 72 69 64 0a 09 20 20 20 20  id, B.brid..    
5290: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20  FROM   revision 
52a0: 52 2c 20 72 65 76 69 73 69 6f 6e 62 72 61 6e 63  R, revisionbranc
52b0: 68 63 68 69 6c 64 72 65 6e 20 42 0a 09 20 20 20  hchildren B..   
52c0: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20   WHERE  R.rid   
52d0: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d  IN $theset     -
52e0: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65  - Restrict to re
52f0: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72  visions of inter
5300: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  est..    AND    
5310: 52 2e 72 69 64 20 3d 20 42 2e 72 69 64 20 20 20  R.rid = B.rid   
5320: 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74         -- Select
5330: 20 73 75 62 73 65 74 20 6f 66 20 62 72 61 6e 63   subset of branc
5340: 68 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20  h children..    
5350: 41 4e 44 20 20 20 20 42 2e 62 72 69 64 20 49 4e  AND    B.brid IN
5360: 20 24 74 68 65 73 65 74 20 20 20 20 20 20 2d 2d   $theset      --
5370: 20 57 68 69 63 68 20 69 73 20 61 6c 73 6f 20 6f   Which is also o
5380: 66 20 69 6e 74 65 72 65 73 74 0a 20 20 20 20 55  f interest.    U
5390: 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 34 29 20  NION.    -- (4) 
53a0: 43 68 69 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72  Child of trunk r
53b0: 6f 6f 74 20 73 75 63 63 65 73 73 6f 72 20 6f 66  oot successor of
53c0: 20 6c 61 73 74 20 4e 54 44 42 20 6f 6e 20 74 72   last NTDB on tr
53d0: 75 6e 6b 2e 0a 09 20 20 20 20 53 45 4c 45 43 54  unk...    SELECT
53e0: 20 52 2e 72 69 64 2c 20 52 41 2e 63 68 69 6c 64   R.rid, RA.child
53f0: 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73  ..    FROM revis
5400: 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 20  ion R, revision 
5410: 52 41 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e  RA..    WHERE R.
5420: 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74  rid   IN $theset
5430: 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63        -- Restric
5440: 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f  t to revisions o
5450: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20  f interest..    
5460: 41 4e 44 20 20 20 52 2e 69 73 64 65 66 61 75 6c  AND   R.isdefaul
5470: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d  t             --
5480: 20 52 65 73 74 72 69 63 74 20 74 6f 20 4e 54 44   Restrict to NTD
5490: 42 0a 09 20 20 20 20 41 4e 44 20 20 20 52 2e 64  B..    AND   R.d
54a0: 62 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55  bchild IS NOT NU
54b0: 4c 4c 20 20 20 2d 2d 20 61 6e 64 20 6c 61 73 74  LL   -- and last
54c0: 20 4e 54 44 42 20 62 65 6c 6f 6e 67 69 6e 67 20   NTDB belonging 
54d0: 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20 41 4e  to trunk..    AN
54e0: 44 20 20 20 52 41 2e 72 69 64 20 3d 20 52 2e 64  D   RA.rid = R.d
54f0: 62 63 68 69 6c 64 20 20 20 20 20 20 2d 2d 20 47  bchild      -- G
5500: 6f 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 72  o directly to tr
5510: 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 20 41 4e  unk root..    AN
5520: 44 20 20 20 52 41 2e 63 68 69 6c 64 20 49 53 20  D   RA.child IS 
5530: 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48  NOT NULL    -- H
5540: 61 73 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64  as primary child
5550: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e  ..            AN
5560: 44 20 20 20 52 41 2e 63 68 69 6c 64 20 49 4e 20  D   RA.child IN 
5570: 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 57  $theset     -- W
5580: 68 69 63 68 20 69 73 20 61 6c 73 6f 20 6f 66 20  hich is also of 
5590: 69 6e 74 65 72 65 73 74 0a 09 22 5d 20 7b 0a 09  interest.."] {..
55a0: 20 20 20 20 23 20 43 6f 6e 73 69 64 65 72 20 6d      # Consider m
55b0: 6f 76 69 6e 67 20 74 68 69 73 20 74 6f 20 74 68  oving this to th
55c0: 65 20 69 6e 74 65 67 72 69 74 79 20 6d 6f 64 75  e integrity modu
55d0: 6c 65 2e 0a 09 20 20 20 20 69 6e 74 65 67 72 69  le...    integri
55e0: 74 79 20 61 73 73 65 72 74 20 7b 24 72 69 64 20  ty assert {$rid 
55f0: 21 3d 20 24 63 68 69 6c 64 7d 20 7b 52 65 76 69  != $child} {Revi
5600: 73 69 6f 6e 20 24 72 69 64 20 64 65 70 65 6e 64  sion $rid depend
5610: 73 20 6f 6e 20 69 74 73 65 6c 66 2e 7d 0a 09 20  s on itself.}.. 
5620: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e     lappend depen
5630: 64 65 6e 63 69 65 73 28 24 72 69 64 29 20 24 63  dencies($rid) $c
5640: 68 69 6c 64 0a 09 20 20 20 20 73 65 74 20 64 65  hild..    set de
5650: 70 28 24 72 69 64 2c 24 63 68 69 6c 64 29 20 2e  p($rid,$child) .
5660: 0a 09 7d 0a 0a 09 23 20 54 68 65 20 73 71 6c 20  ..}...# The sql 
5670: 73 74 61 74 65 6d 65 6e 74 73 20 61 62 6f 76 65  statements above
5680: 20 6c 6f 6f 6b 73 20 6f 6e 6c 79 20 66 6f 72 20   looks only for 
5690: 64 69 72 65 63 74 20 64 65 70 65 6e 64 65 6e 63  direct dependenc
56a0: 69 65 73 0a 09 23 20 62 65 74 77 65 65 6e 20 72  ies..# between r
56b0: 65 76 69 73 69 6f 6e 20 69 6e 20 74 68 65 20 63  evision in the c
56c0: 68 61 6e 67 65 73 65 74 2e 20 48 6f 77 65 76 65  hangeset. Howeve
56d0: 72 20 64 75 65 20 74 6f 20 74 68 65 0a 09 23 20  r due to the..# 
56e0: 76 61 67 61 72 69 65 73 20 6f 66 20 6d 65 74 61  vagaries of meta
56f0: 20 64 61 74 61 20 69 74 20 69 73 20 70 6f 73 73   data it is poss
5700: 69 62 6c 65 20 66 6f 72 20 74 77 6f 20 72 65 76  ible for two rev
5710: 69 73 69 6f 6e 73 20 6f 66 0a 09 23 20 74 68 65  isions of..# the
5720: 20 73 61 6d 65 20 66 69 6c 65 20 74 6f 20 65 6e   same file to en
5730: 64 20 75 70 20 69 6e 20 74 68 65 20 73 61 6d 65  d up in the same
5740: 20 63 68 61 6e 67 65 73 65 74 2c 20 77 69 74 68   changeset, with
5750: 6f 75 74 20 61 0a 09 23 20 64 69 72 65 63 74 20  out a..# direct 
5760: 64 65 70 65 6e 64 65 6e 63 79 20 62 65 74 77 65  dependency betwe
5770: 65 6e 20 74 68 65 6d 2e 20 48 6f 77 65 76 65 72  en them. However
5780: 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68   we know that th
5790: 65 72 65 0a 09 23 20 68 61 73 20 74 6f 20 62 65  ere..# has to be
57a0: 20 61 20 61 6e 20 69 6e 64 69 72 65 63 74 20 64   a an indirect d
57b0: 65 70 65 6e 64 65 6e 63 79 2c 20 62 65 20 69 74  ependency, be it
57c0: 20 74 68 72 6f 75 67 68 20 70 72 69 6d 61 72 79   through primary
57d0: 0a 09 23 20 63 68 69 6c 64 72 65 6e 2c 20 62 72  ..# children, br
57e0: 61 6e 63 68 20 63 68 69 6c 64 72 65 6e 2c 20 6f  anch children, o
57f0: 72 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20  r a combination 
5800: 74 68 65 72 65 6f 66 2e 0a 0a 09 23 20 57 65 20  thereof....# We 
5810: 6e 6f 77 20 66 69 6c 6c 20 69 6e 20 74 68 65 73  now fill in thes
5820: 65 20 70 73 65 75 64 6f 2d 64 65 70 65 6e 64 65  e pseudo-depende
5830: 6e 63 69 65 73 2c 20 69 66 20 6e 6f 20 73 75 63  ncies, if no suc
5840: 68 0a 09 23 20 64 65 70 65 6e 64 65 6e 63 79 20  h..# dependency 
5850: 65 78 69 73 74 73 20 61 6c 72 65 61 64 79 2e 20  exists already. 
5860: 54 68 65 20 64 69 72 65 63 74 69 6f 6e 20 6f 66  The direction of
5870: 20 74 68 65 20 64 65 70 65 6e 64 65 6e 63 79 0a   the dependency.
5880: 09 23 20 69 73 20 61 63 74 75 61 6c 6c 79 20 69  .# is actually i
5890: 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 74 68  rrelevant for th
58a0: 69 73 2e 0a 0a 09 23 20 4e 4f 54 45 3a 20 54 68  is....# NOTE: Th
58b0: 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74 20  is is different 
58c0: 66 72 6f 6d 20 63 76 73 32 73 76 6e 2e 20 4f 75  from cvs2svn. Ou
58d0: 72 20 73 70 69 72 69 74 75 61 6c 20 61 6e 63 65  r spiritual ance
58e0: 73 74 6f 72 0a 09 23 20 64 6f 65 73 20 6e 6f 74  stor..# does not
58f0: 20 75 73 65 20 73 75 63 68 20 70 73 65 75 64 6f   use such pseudo
5900: 2d 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 68  -dependencies, h
5910: 6f 77 65 76 65 72 20 69 74 20 75 73 65 73 20 61  owever it uses a
5920: 0a 09 23 20 43 4f 4d 4d 49 54 5f 54 48 52 45 53  ..# COMMIT_THRES
5930: 48 4f 4c 44 2c 20 61 20 74 69 6d 65 20 69 6e 74  HOLD, a time int
5940: 65 72 76 61 6c 20 63 6f 6d 6d 69 74 73 20 73 68  erval commits sh
5950: 6f 75 6c 64 20 66 61 6c 6c 2e 20 54 68 69 73 0a  ould fall. This.
5960: 09 23 20 77 69 6c 6c 20 67 72 65 61 74 6c 79 20  .# will greatly 
5970: 72 65 64 75 63 65 73 20 74 68 65 20 72 69 73 6b  reduces the risk
5980: 20 6f 66 20 67 65 74 74 69 6e 67 20 66 61 72 20   of getting far 
5990: 73 65 70 61 72 61 74 65 64 0a 09 23 20 72 65 76  separated..# rev
59a0: 69 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 61  isions of the sa
59b0: 6d 65 20 66 69 6c 65 20 69 6e 74 6f 20 6f 6e 65  me file into one
59c0: 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 23 20   changeset....# 
59d0: 57 65 20 61 6c 6c 6f 77 20 72 65 76 69 73 69 6f  We allow revisio
59e0: 6e 73 20 74 6f 20 62 65 20 66 61 72 20 61 70 61  ns to be far apa
59f0: 72 74 20 69 6e 20 74 69 6d 65 20 69 6e 20 74 68  rt in time in th
5a00: 65 20 73 61 6d 65 0a 09 23 20 63 68 61 6e 67 65  e same..# change
5a10: 73 65 74 2c 20 62 75 74 20 6e 65 65 64 20 74 68  set, but need th
5a20: 65 20 70 73 65 75 64 6f 2d 64 65 70 65 6e 64 65  e pseudo-depende
5a30: 6e 63 69 65 73 20 66 6f 72 20 74 68 69 73 2e 0a  ncies for this..
5a40: 0a 09 61 72 72 61 79 20 73 65 74 20 66 69 64 73  ..array set fids
5a50: 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 69   {}..foreach {ri
5a60: 64 20 66 69 64 7d 20 5b 73 74 61 74 65 20 72 75  d fid} [state ru
5a70: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20  n "..    SELECT 
5a80: 52 2e 72 69 64 2c 20 52 2e 66 69 64 20 46 52 4f  R.rid, R.fid FRO
5a90: 4d 20 72 65 76 69 73 69 6f 6e 20 52 20 57 48 45  M revision R WHE
5aa0: 52 45 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65  RE R.rid IN $the
5ab0: 73 65 74 0a 09 22 5d 20 7b 20 6c 61 70 70 65 6e  set.."] { lappen
5ac0: 64 20 66 69 64 73 28 24 66 69 64 29 20 24 72 69  d fids($fid) $ri
5ad0: 64 20 7d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 66  d }...foreach {f
5ae0: 69 64 20 72 69 64 73 7d 20 5b 61 72 72 61 79 20  id rids} [array 
5af0: 67 65 74 20 66 69 64 73 5d 20 7b 0a 09 20 20 20  get fids] {..   
5b00: 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 72   if {[llength $r
5b10: 69 64 73 5d 20 3c 20 32 7d 20 63 6f 6e 74 69 6e  ids] < 2} contin
5b20: 75 65 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20  ue..    foreach 
5b30: 61 20 24 72 69 64 73 20 7b 0a 09 09 66 6f 72 65  a $rids {...fore
5b40: 61 63 68 20 62 20 24 72 69 64 73 20 7b 0a 09 09  ach b $rids {...
5b50: 20 20 20 20 69 66 20 7b 24 61 20 3d 3d 20 24 62      if {$a == $b
5b60: 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 09 20 20 20  } continue...   
5b70: 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74   if {[info exist
5b80: 73 20 64 65 70 28 24 61 2c 24 62 29 5d 7d 20 63  s dep($a,$b)]} c
5b90: 6f 6e 74 69 6e 75 65 0a 09 09 20 20 20 20 69 66  ontinue...    if
5ba0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64   {[info exists d
5bb0: 65 70 28 24 62 2c 24 61 29 5d 7d 20 63 6f 6e 74  ep($b,$a)]} cont
5bc0: 69 6e 75 65 0a 09 09 20 20 20 20 6c 61 70 70 65  inue...    lappe
5bd0: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28  nd dependencies(
5be0: 24 61 29 20 24 62 0a 09 09 20 20 20 20 73 65 74  $a) $b...    set
5bf0: 20 64 65 70 28 24 61 2c 24 62 29 20 2e 0a 09 09   dep($a,$b) ....
5c00: 20 20 20 20 73 65 74 20 64 65 70 28 24 62 2c 24      set dep($b,$
5c10: 61 29 20 2e 0a 09 09 7d 0a 09 20 20 20 20 7d 0a  a) ....}..    }.
5c20: 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d  .}..return.    }
5c30: 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76 29 20  ..    # var(dv) 
5c40: 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d 3e 20  = dict (item -> 
5c50: 6c 69 73 74 20 28 69 74 65 6d 29 29 2c 20 69 74  list (item)), it
5c60: 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 79 70 65  em  = list (type
5c70: 20 69 64 29 0a 20 20 20 20 74 79 70 65 6d 65 74   id).    typemet
5c80: 68 6f 64 20 73 75 63 63 65 73 73 6f 72 73 20 7b  hod successors {
5c90: 64 76 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a  dv revisions} {.
5ca0: 09 75 70 76 61 72 20 31 20 24 64 76 20 64 65 70  .upvar 1 $dv dep
5cb0: 65 6e 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74  endencies..set t
5cc0: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72  heset ('[join $r
5cd0: 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27  evisions {','}]'
5ce0: 29 0a 0a 09 23 20 54 68 65 20 66 6f 6c 6c 6f 77  )...# The follow
5cf0: 69 6e 67 20 63 61 73 65 73 20 73 70 65 63 69 66  ing cases specif
5d00: 79 20 77 68 65 6e 20 61 20 72 65 76 69 73 69 6f  y when a revisio
5d10: 6e 20 53 20 69 73 20 61 20 73 75 63 63 65 73 73  n S is a success
5d20: 6f 72 0a 09 23 20 6f 66 20 61 20 72 65 76 69 73  or..# of a revis
5d30: 69 6f 6e 20 52 2e 20 45 61 63 68 20 6f 66 20 74  ion R. Each of t
5d40: 68 65 20 63 61 73 65 73 20 74 72 61 6e 73 6c 61  he cases transla
5d50: 74 65 73 20 69 6e 74 6f 20 6f 6e 65 20 6f 66 0a  tes into one of.
5d60: 09 23 20 74 68 65 20 62 72 61 6e 63 68 65 73 20  .# the branches 
5d70: 6f 66 20 74 68 65 20 53 51 4c 20 55 4e 49 4f 4e  of the SQL UNION
5d80: 20 63 6f 6d 69 6e 67 20 62 65 6c 6f 77 2e 0a 09   coming below...
5d90: 23 0a 09 23 20 28 31 29 20 53 20 63 61 6e 20 62  #..# (1) S can b
5da0: 65 20 61 20 70 72 69 6d 61 72 79 20 63 68 69 6c  e a primary chil
5db0: 64 20 6f 66 20 52 2c 20 69 2e 65 2e 20 69 6e 20  d of R, i.e. in 
5dc0: 74 68 65 20 73 61 6d 65 20 4c 4f 44 2e 20 52 0a  the same LOD. R.
5dd0: 09 23 20 20 20 20 20 72 65 66 65 72 65 6e 63 65  .#     reference
5de0: 73 20 53 20 64 69 72 65 63 74 6c 79 2e 20 52 2e  s S directly. R.
5df0: 63 68 69 6c 64 20 3d 20 53 28 2e 72 69 64 29 2c  child = S(.rid),
5e00: 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a 09   if it exists...
5e10: 23 0a 09 23 20 28 32 29 20 53 20 63 61 6e 20 62  #..# (2) S can b
5e20: 65 20 61 20 73 65 63 6f 6e 64 61 72 79 2c 20 69  e a secondary, i
5e30: 2e 65 2e 20 62 72 61 6e 63 68 2c 20 63 68 69 6c  .e. branch, chil
5e40: 64 20 6f 66 20 52 2e 20 48 65 72 65 20 74 68 65  d of R. Here the
5e50: 0a 09 23 20 20 20 20 20 6c 69 6e 6b 20 69 73 20  ..#     link is 
5e60: 6d 61 64 65 20 74 68 72 6f 75 67 68 20 74 68 65  made through the
5e70: 20 68 65 6c 70 65 72 20 74 61 62 6c 65 0a 09 23   helper table..#
5e80: 20 20 20 20 20 52 45 56 49 53 49 4f 4e 42 52 41       REVISIONBRA
5e90: 4e 43 48 43 48 49 4c 44 52 45 4e 2e 20 52 2e 72  NCHCHILDREN. R.r
5ea0: 69 64 20 2d 3e 20 52 42 43 2e 72 69 64 2c 20 52  id -> RBC.rid, R
5eb0: 42 43 2e 62 72 69 64 20 3d 0a 09 23 20 20 20 20  BC.brid =..#    
5ec0: 20 53 28 2e 72 69 64 29 0a 09 23 0a 09 23 20 28   S(.rid)..#..# (
5ed0: 33 29 20 4f 72 69 67 69 6e 61 6c 6c 79 20 74 68  3) Originally th
5ee0: 69 73 20 75 73 65 20 63 61 73 65 20 64 65 66 69  is use case defi
5ef0: 6e 65 64 20 74 68 65 20 72 6f 6f 74 20 6f 66 20  ned the root of 
5f00: 61 20 64 65 74 61 63 68 65 64 0a 09 23 20 20 20  a detached..#   
5f10: 20 20 4e 54 44 42 20 61 73 20 74 68 65 20 73 75    NTDB as the su
5f20: 63 63 65 73 73 6f 72 20 6f 66 20 74 68 65 20 74  ccessor of the t
5f30: 72 75 6e 6b 20 72 6f 6f 74 2e 20 54 68 69 73 20  runk root. This 
5f40: 6c 65 61 64 73 20 74 6f 20 61 0a 09 23 20 20 20  leads to a..#   
5f50: 20 20 62 61 64 20 74 61 6e 67 6c 65 20 6c 61 74    bad tangle lat
5f60: 65 72 20 6f 6e 2e 20 57 69 74 68 20 61 20 64 65  er on. With a de
5f70: 74 61 63 68 65 64 20 4e 54 44 42 20 74 68 65 20  tached NTDB the 
5f80: 6f 72 69 67 69 6e 61 6c 0a 09 23 20 20 20 20 20  original..#     
5f90: 74 72 75 6e 6b 20 72 6f 6f 74 20 72 65 76 69 73  trunk root revis
5fa0: 69 6f 6e 20 77 61 73 20 72 65 6d 6f 76 65 64 20  ion was removed 
5fb0: 61 73 20 69 72 72 65 6c 65 76 61 6e 74 2c 20 61  as irrelevant, a
5fc0: 6c 6c 6f 77 69 6e 67 0a 09 23 20 20 20 20 20 74  llowing..#     t
5fd0: 68 65 20 6e 6f 6d 69 6e 61 6c 20 72 6f 6f 74 20  he nominal root 
5fe0: 74 6f 20 62 65 20 6c 61 74 65 72 20 69 6e 20 74  to be later in t
5ff0: 69 6d 65 20 74 68 61 6e 20 74 68 65 20 4e 54 44  ime than the NTD
6000: 42 0a 09 23 20 20 20 20 20 72 6f 6f 74 2e 20 4e  B..#     root. N
6010: 6f 77 20 73 65 74 74 69 6e 67 20 74 68 69 73 20  ow setting this 
6020: 64 65 70 65 6e 64 65 6e 63 79 20 77 69 6c 6c 20  dependency will 
6030: 62 65 20 62 61 63 6b 77 61 72 64 20 69 6e 0a 09  be backward in..
6040: 23 20 20 20 20 20 74 69 6d 65 2e 20 52 45 4d 4f  #     time. REMO
6050: 56 45 44 2e 0a 09 23 0a 09 23 20 28 34 29 20 49  VED...#..# (4) I
6060: 66 20 52 20 69 73 20 74 68 65 20 6c 61 73 74 20  f R is the last 
6070: 6f 66 20 74 68 65 20 4e 54 44 42 20 72 65 76 69  of the NTDB revi
6080: 73 69 6f 6e 73 20 77 68 69 63 68 20 62 65 6c 6f  sions which belo
6090: 6e 67 20 74 6f 0a 09 23 20 20 20 20 20 74 68 65  ng to..#     the
60a0: 20 74 72 75 6e 6b 2c 20 74 68 65 6e 20 74 68 65   trunk, then the
60b0: 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 20 6f   primary child o
60c0: 66 20 74 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74  f the trunk root
60d0: 20 28 74 68 65 0a 09 23 20 20 20 20 20 27 31 2e   (the..#     '1.
60e0: 32 27 20 72 65 76 69 73 69 6f 6e 29 20 69 73 20  2' revision) is 
60f0: 61 20 73 75 63 63 65 73 73 6f 72 2c 20 69 66 20  a successor, if 
6100: 69 74 20 65 78 69 73 74 73 2e 0a 0a 09 23 20 4e  it exists....# N
6110: 6f 74 65 20 74 68 61 74 20 74 68 65 20 62 72 61  ote that the bra
6120: 6e 63 68 65 73 20 73 70 61 77 6e 65 64 20 66 72  nches spawned fr
6130: 6f 6d 20 74 68 65 20 72 65 76 69 73 69 6f 6e 73  om the revisions
6140: 2c 20 61 6e 64 20 74 68 65 0a 09 23 20 74 61 67  , and the..# tag
6150: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
6160: 68 20 74 68 65 6d 20 61 72 65 20 73 75 63 63 65  h them are succe
6170: 73 73 6f 72 73 20 61 73 20 77 65 6c 6c 2e 0a 0a  ssors as well...
6180: 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68  .foreach {rid ch
6190: 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20  ild} [state run 
61a0: 22 0a 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d  ".   -- (1) Prim
61b0: 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20 53  ary child..    S
61c0: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63  ELECT R.rid, R.c
61d0: 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  hild..    FROM  
61e0: 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20   revision R..   
61f0: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20   WHERE  R.rid   
6200: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d  IN $theset     -
6210: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65  - Restrict to re
6220: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72  visions of inter
6230: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  est..    AND    
6240: 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e  R.child IS NOT N
6250: 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72  ULL    -- Has pr
6260: 69 6d 61 72 79 20 63 68 69 6c 64 0a 20 20 20 20  imary child.    
6270: 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32 29  UNION.    -- (2)
6280: 20 53 65 63 6f 6e 64 61 72 79 20 28 62 72 61 6e   Secondary (bran
6290: 63 68 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 20  ch) children..  
62a0: 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20    SELECT R.rid, 
62b0: 42 2e 62 72 69 64 0a 09 20 20 20 20 46 52 4f 4d  B.brid..    FROM
62c0: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72     revision R, r
62d0: 65 76 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 69  evisionbranchchi
62e0: 6c 64 72 65 6e 20 42 0a 09 20 20 20 20 57 48 45  ldren B..    WHE
62f0: 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24  RE  R.rid   IN $
6300: 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65  theset     -- Re
6310: 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69  strict to revisi
6320: 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  ons of interest.
6330: 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72 69  .    AND    R.ri
6340: 64 20 3d 20 42 2e 72 69 64 20 20 20 20 20 20 20  d = B.rid       
6350: 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 73 75 62     -- Select sub
6360: 73 65 74 20 6f 66 20 62 72 61 6e 63 68 20 63 68  set of branch ch
6370: 69 6c 64 72 65 6e 0a 20 20 20 20 55 4e 49 4f 4e  ildren.    UNION
6380: 0a 20 20 20 20 2d 2d 20 28 34 29 20 43 68 69 6c  .    -- (4) Chil
6390: 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 20  d of trunk root 
63a0: 73 75 63 63 65 73 73 6f 72 20 6f 66 20 6c 61 73  successor of las
63b0: 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b 2e  t NTDB on trunk.
63c0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
63d0: 69 64 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20 20  id, RA.child..  
63e0: 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20    FROM revision 
63f0: 52 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 0a 09  R, revision RA..
6400: 20 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 20      WHERE R.rid 
6410: 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20    IN $theset    
6420: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f    -- Restrict to
6430: 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e   revisions of in
6440: 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20  terest..    AND 
6450: 20 20 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20    R.isdefault   
6460: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73            -- Res
6470: 74 72 69 63 74 20 74 6f 20 4e 54 44 42 0a 09 20  trict to NTDB.. 
6480: 20 20 20 41 4e 44 20 20 20 52 2e 64 62 63 68 69     AND   R.dbchi
6490: 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20  ld IS NOT NULL  
64a0: 20 2d 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 44   -- and last NTD
64b0: 42 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  B belonging to t
64c0: 72 75 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 20  runk..    AND   
64d0: 52 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69  RA.rid = R.dbchi
64e0: 6c 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69  ld      -- Go di
64f0: 72 65 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20  rectly to trunk 
6500: 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20  root..    AND   
6510: 52 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20  RA.child IS NOT 
6520: 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70  NULL    -- Has p
6530: 72 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 09 22  rimary child..."
6540: 5d 20 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 69  ] {..    # Consi
6550: 64 65 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 20  der moving this 
6560: 74 6f 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  to the integrity
6570: 20 6d 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 6e   module...    in
6580: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b  tegrity assert {
6590: 24 72 69 64 20 21 3d 20 24 63 68 69 6c 64 7d 20  $rid != $child} 
65a0: 7b 52 65 76 69 73 69 6f 6e 20 24 72 69 64 20 64  {Revision $rid d
65b0: 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66  epends on itself
65c0: 2e 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20  .}..    lappend 
65d0: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69  dependencies([li
65e0: 73 74 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c  st rev $rid]) [l
65f0: 69 73 74 20 72 65 76 20 24 63 68 69 6c 64 5d 0a  ist rev $child].
6600: 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64  .}..foreach {rid
6610: 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72   child} [state r
6620: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54  un "..    SELECT
6630: 20 52 2e 72 69 64 2c 20 54 2e 74 69 64 0a 09 20   R.rid, T.tid.. 
6640: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69     FROM   revisi
6650: 6f 6e 20 52 2c 20 74 61 67 20 54 0a 09 20 20 20  on R, tag T..   
6660: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 69 6e   WHERE  R.rid in
6670: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e   $theset..    AN
6680: 44 20 20 20 20 54 2e 72 65 76 20 3d 20 52 2e 72  D    T.rev = R.r
6690: 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61  id.."] {..    la
66a0: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69  ppend dependenci
66b0: 65 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69  es([list rev $ri
66c0: 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74  d]) [list sym::t
66d0: 61 67 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66  ag $child]..}..f
66e0: 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c  oreach {rid chil
66f0: 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a  d} [state run ".
6700: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69  .    SELECT R.ri
6710: 64 2c 20 42 2e 62 69 64 0a 09 20 20 20 20 46 52  d, B.bid..    FR
6720: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c  OM   revision R,
6730: 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20 20 57   branch B..    W
6740: 48 45 52 45 20 20 52 2e 72 69 64 20 69 6e 20 24  HERE  R.rid in $
6750: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20  theset..    AND 
6760: 20 20 20 42 2e 72 6f 6f 74 20 3d 20 52 2e 72 69     B.root = R.ri
6770: 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70  d.."] {..    lap
6780: 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65  pend dependencie
6790: 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64  s([list rev $rid
67a0: 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72  ]) [list sym::br
67b0: 61 6e 63 68 20 24 63 68 69 6c 64 5d 0a 09 7d 0a  anch $child]..}.
67c0: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
67d0: 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 64     # var(dv) = d
67e0: 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73  ict (item -> lis
67f0: 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20  t (item)), item 
6800: 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69 64   = list (type id
6810: 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ).    typemethod
6820: 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 7b 64   predecessors {d
6830: 76 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09  v revisions} {..
6840: 75 70 76 61 72 20 31 20 24 64 76 20 64 65 70 65  upvar 1 $dv depe
6850: 6e 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74 68  ndencies..set th
6860: 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65  eset ('[join $re
6870: 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29  visions {','}]')
6880: 0a 0a 09 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69  ...# The followi
6890: 6e 67 20 63 61 73 65 73 20 73 70 65 63 69 66 79  ng cases specify
68a0: 20 77 68 65 6e 20 61 20 72 65 76 69 73 69 6f 6e   when a revision
68b0: 20 50 20 69 73 20 61 0a 09 23 20 70 72 65 64 65   P is a..# prede
68c0: 63 65 73 73 6f 72 20 6f 66 20 61 20 72 65 76 69  cessor of a revi
68d0: 73 69 6f 6e 20 52 2e 20 45 61 63 68 20 6f 66 20  sion R. Each of 
68e0: 74 68 65 20 63 61 73 65 73 20 74 72 61 6e 73 6c  the cases transl
68f0: 61 74 65 73 0a 09 23 20 69 6e 74 6f 20 6f 6e 65  ates..# into one
6900: 20 6f 66 20 74 68 65 20 62 72 61 6e 63 68 65 73   of the branches
6910: 20 6f 66 20 74 68 65 20 53 51 4c 20 55 4e 49 4f   of the SQL UNIO
6920: 4e 20 63 6f 6d 69 6e 67 20 62 65 6c 6f 77 2e 0a  N coming below..
6930: 09 23 0a 09 23 20 28 31 29 20 54 68 65 20 69 6d  .#..# (1) The im
6940: 6d 65 64 69 61 74 65 20 70 61 72 65 6e 74 20 52  mediate parent R
6950: 2e 70 61 72 65 6e 74 20 6f 66 20 52 20 69 73 20  .parent of R is 
6960: 61 20 70 72 65 64 65 63 65 73 73 6f 72 20 6f 66  a predecessor of
6970: 0a 09 23 20 20 20 20 20 52 2e 20 4e 4f 54 45 3a  ..#     R. NOTE:
6980: 20 54 68 69 73 20 69 73 20 74 72 75 65 20 66 6f   This is true fo
6990: 72 20 52 20 65 69 74 68 65 72 20 70 72 69 6d 61  r R either prima
69a0: 72 79 20 6f 72 20 73 65 63 6f 6e 64 61 72 79 0a  ry or secondary.
69b0: 09 23 20 20 20 20 20 63 68 69 6c 64 20 6f 66 20  .#     child of 
69c0: 50 2e 20 49 74 20 6e 6f 74 20 6e 65 63 65 73 73  P. It not necess
69d0: 61 72 79 20 74 6f 20 64 69 73 74 69 6e 67 75 69  ary to distingui
69e0: 73 68 20 74 68 65 20 74 77 6f 0a 09 23 20 20 20  sh the two..#   
69f0: 20 20 63 61 73 65 73 2c 20 69 6e 20 63 6f 6e 74    cases, in cont
6a00: 72 61 73 74 20 74 6f 20 74 68 65 20 63 6f 64 65  rast to the code
6a10: 20 72 65 74 72 69 65 76 69 6e 67 20 74 68 65 20   retrieving the 
6a20: 73 75 63 63 65 73 73 6f 72 0a 09 23 20 20 20 20  successor..#    
6a30: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 09 23   information...#
6a40: 0a 09 23 20 28 32 29 20 54 68 65 20 63 6f 6d 70  ..# (2) The comp
6a50: 6c 65 6d 65 6e 74 20 6f 66 20 73 75 63 63 65 73  lement of succes
6a60: 73 6f 72 20 63 61 73 65 20 28 33 29 2e 20 54 68  sor case (3). Th
6a70: 65 20 74 72 75 6e 6b 20 72 6f 6f 74 20 69 73 0a  e trunk root is.
6a80: 09 23 20 20 20 20 20 61 20 70 72 65 64 65 63 65  .#     a predece
6a90: 73 73 6f 72 20 6f 66 20 61 20 4e 54 44 42 20 72  ssor of a NTDB r
6aa0: 6f 6f 74 2e 20 52 45 4d 4f 56 45 44 2e 20 53 65  oot. REMOVED. Se
6ab0: 65 20 27 73 75 63 63 65 73 73 6f 72 73 27 0a 09  e 'successors'..
6ac0: 23 20 20 20 20 20 66 6f 72 20 74 68 65 20 65 78  #     for the ex
6ad0: 70 6c 61 6e 61 74 69 6f 6e 2e 0a 09 23 0a 09 23  planation...#..#
6ae0: 20 28 33 29 20 54 68 65 20 63 6f 6d 70 6c 65 6d   (3) The complem
6af0: 65 6e 74 20 6f 66 20 73 75 63 63 65 73 73 6f 72  ent of successor
6b00: 20 63 61 73 65 20 28 34 29 2e 20 54 68 65 20 6c   case (4). The l
6b10: 61 73 74 20 4e 54 44 42 0a 09 23 20 20 20 20 20  ast NTDB..#     
6b20: 72 65 76 69 73 69 6f 6e 20 62 65 6c 6f 6e 67 69  revision belongi
6b30: 6e 67 20 74 6f 20 74 68 65 20 74 72 75 6e 6b 20  ng to the trunk 
6b40: 69 73 20 61 20 70 72 65 64 65 63 65 73 73 6f 72  is a predecessor
6b50: 20 6f 66 20 74 68 65 0a 09 23 20 20 20 20 20 70   of the..#     p
6b60: 72 69 6d 61 72 79 20 63 68 69 6c 64 20 6f 66 20  rimary child of 
6b70: 74 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74 20 28  the trunk root (
6b80: 54 68 65 20 27 31 2e 32 27 20 72 65 76 69 73 69  The '1.2' revisi
6b90: 6f 6e 29 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b  on)....foreach {
6ba0: 72 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61  rid parent} [sta
6bb0: 74 65 20 72 75 6e 20 22 0a 20 20 20 2d 2d 20 28  te run ".   -- (
6bc0: 31 29 20 50 72 69 6d 61 72 79 20 70 61 72 65 6e  1) Primary paren
6bd0: 74 2c 20 63 61 6e 20 62 65 20 69 6e 20 64 69 66  t, can be in dif
6be0: 66 65 72 65 6e 74 20 4c 4f 44 20 66 6f 72 20 66  ferent LOD for f
6bf0: 69 72 73 74 20 69 6e 20 61 20 62 72 61 6e 63 68  irst in a branch
6c00: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
6c10: 69 64 2c 20 52 2e 70 61 72 65 6e 74 0a 09 20 20  id, R.parent..  
6c20: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f    FROM   revisio
6c30: 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 20  n R..    WHERE  
6c40: 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73  R.rid   IN $thes
6c50: 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69  et     -- Restri
6c60: 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20  ct to revisions 
6c70: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20  of interest..   
6c80: 20 41 4e 44 20 20 20 20 52 2e 70 61 72 65 6e 74   AND    R.parent
6c90: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d   IS NOT NULL   -
6ca0: 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 70 61  - Has primary pa
6cb0: 72 65 6e 74 0a 20 20 20 20 55 4e 49 4f 4e 0a 20  rent.    UNION. 
6cc0: 20 20 20 2d 2d 20 28 33 29 20 4c 61 73 74 20 4e     -- (3) Last N
6cd0: 54 44 42 20 6f 6e 20 74 72 75 6e 6b 20 69 73 20  TDB on trunk is 
6ce0: 70 72 65 64 65 63 65 73 73 6f 72 20 6f 66 20 63  predecessor of c
6cf0: 68 69 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f  hild of trunk ro
6d00: 6f 74 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52  ot..    SELECT R
6d10: 2e 72 69 64 2c 20 52 41 2e 64 62 70 61 72 65 6e  .rid, RA.dbparen
6d20: 74 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65  t..    FROM   re
6d30: 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69  vision R, revisi
6d40: 6f 6e 20 52 41 0a 09 20 20 20 20 57 48 45 52 45  on RA..    WHERE
6d50: 20 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73    R.rid IN $thes
6d60: 65 74 20 20 20 20 20 20 20 20 20 2d 2d 20 52 65  et         -- Re
6d70: 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69  strict to revisi
6d80: 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  ons of interest.
6d90: 09 20 20 20 20 41 4e 44 20 20 20 20 4e 4f 54 20  .    AND    NOT 
6da0: 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20 20  R.isdefault     
6db0: 20 20 20 20 20 2d 2d 20 6e 6f 74 20 6f 6e 20 4e       -- not on N
6dc0: 54 44 42 0a 09 20 20 20 20 41 4e 44 20 20 20 20  TDB..    AND    
6dd0: 52 2e 70 61 72 65 6e 74 20 49 53 20 4e 4f 54 20  R.parent IS NOT 
6de0: 4e 55 4c 4c 20 20 20 20 20 2d 2d 20 77 68 69 63  NULL     -- whic
6df0: 68 20 61 72 65 20 6e 6f 74 20 72 6f 6f 74 0a 09  h are not root..
6e00: 20 20 20 20 41 4e 44 20 20 20 20 52 41 2e 72 69      AND    RA.ri
6e10: 64 20 3d 20 52 2e 70 61 72 65 6e 74 20 20 20 20  d = R.parent    
6e20: 20 20 20 20 2d 2d 20 67 6f 20 74 6f 20 74 68 65      -- go to the
6e30: 69 72 20 70 61 72 65 6e 74 0a 09 20 20 20 20 41  ir parent..    A
6e40: 4e 44 20 20 20 20 52 41 2e 64 62 70 61 72 65 6e  ND    RA.dbparen
6e50: 74 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 2d  t IS NOT NULL  -
6e60: 2d 20 77 68 69 63 68 20 68 61 73 20 74 6f 20 72  - which has to r
6e70: 65 66 65 72 20 74 6f 20 4e 54 44 42 27 73 20 72  efer to NTDB's r
6e80: 6f 6f 74 0a 09 22 5d 20 7b 0a 09 20 20 20 20 23  oot.."] {..    #
6e90: 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69 6e 67   Consider moving
6ea0: 20 74 68 69 73 20 74 6f 20 74 68 65 20 69 6e 74   this to the int
6eb0: 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e 0a 09  egrity module...
6ec0: 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73      integrity as
6ed0: 73 65 72 74 20 7b 24 72 69 64 20 21 3d 20 24 70  sert {$rid != $p
6ee0: 61 72 65 6e 74 7d 20 7b 52 65 76 69 73 69 6f 6e  arent} {Revision
6ef0: 20 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f 6e   $rid depends on
6f00: 20 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20 6c   itself.}..    l
6f10: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63  append dependenc
6f20: 69 65 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72  ies([list rev $r
6f30: 69 64 5d 29 20 5b 6c 69 73 74 20 72 65 76 20 24  id]) [list rev $
6f40: 70 61 72 65 6e 74 5d 0a 09 7d 0a 0a 09 23 20 54  parent]..}...# T
6f50: 68 65 20 72 65 76 69 73 69 6f 6e 73 20 77 68 69  he revisions whi
6f60: 63 68 20 61 72 65 20 74 68 65 20 66 69 72 73 74  ch are the first
6f70: 20 6f 6e 20 61 20 62 72 61 6e 63 68 20 68 61 76   on a branch hav
6f80: 65 20 74 68 61 74 0a 09 23 20 62 72 61 6e 63 68  e that..# branch
6f90: 20 61 73 20 74 68 65 69 72 20 70 72 65 64 65 63   as their predec
6fa0: 65 73 73 6f 72 2e 20 4e 6f 74 65 20 74 68 61 74  essor. Note that
6fb0: 20 72 65 76 69 73 69 6f 6e 73 20 63 61 6e 6e 6f   revisions canno
6fc0: 74 20 62 65 0a 09 23 20 6f 6e 20 74 61 67 73 20  t be..# on tags 
6fd0: 69 6e 20 74 68 65 20 73 61 6d 65 20 6d 61 6e 6e  in the same mann
6fe0: 65 72 2c 20 73 6f 20 74 61 67 73 20 63 61 6e 6e  er, so tags cann
6ff0: 6f 74 20 62 65 20 70 72 65 64 65 63 65 73 73 6f  ot be predecesso
7000: 72 73 0a 09 23 20 6f 66 20 72 65 76 69 73 69 6f  rs..# of revisio
7010: 6e 73 2e 20 54 68 69 73 20 63 6f 6d 70 6c 65 6d  ns. This complem
7020: 65 6e 74 73 20 74 68 61 74 20 74 68 65 79 20 68  ents that they h
7030: 61 76 65 20 6e 6f 20 73 75 63 63 65 73 73 6f 72  ave no successor
7040: 73 0a 09 23 20 28 53 65 65 20 73 79 6d 3a 3a 74  s..# (See sym::t
7050: 61 67 2f 73 75 63 63 65 73 73 6f 72 73 29 2e 0a  ag/successors)..
7060: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 70  ..foreach {rid p
7070: 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75  arent} [state ru
7080: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20  n "..    SELECT 
7090: 52 2e 72 69 64 20 42 2e 62 69 64 0a 09 20 20 20  R.rid B.bid..   
70a0: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
70b0: 20 52 2c 20 62 72 61 6e 63 68 20 42 0a 09 20 20   R, branch B..  
70c0: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 49    WHERE  R.rid I
70d0: 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41  N $theset..    A
70e0: 4e 44 20 20 20 20 42 2e 66 69 72 73 74 20 3d 20  ND    B.first = 
70f0: 52 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20  R.rid.."] {..   
7100: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65   lappend depende
7110: 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 65 76 20  ncies([list rev 
7120: 24 72 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d  $rid]) [list sym
7130: 3a 3a 62 72 61 6e 63 68 20 24 70 61 72 65 6e 74  ::branch $parent
7140: 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20  ]..}..return.   
7150: 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 23   }.}..# # ## ###
7160: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20   ##### ######## 
7170: 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23  ############# ##
7180: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7190: 23 23 23 0a 23 23 20 48 65 6c 70 65 72 20 73 69  ###.## Helper si
71a0: 6e 67 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64  ngleton. Command
71b0: 73 20 66 6f 72 20 74 61 67 20 73 79 6d 62 6f 6c  s for tag symbol
71c0: 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e   changesets...sn
71d0: 69 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66  it::type ::vc::f
71e0: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63  ossil::import::c
71f0: 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76  vs::project::rev
7200: 3a 3a 73 79 6d 3a 3a 74 61 67 20 7b 0a 20 20 20  ::sym::tag {.   
7210: 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 72 65   typemethod byre
7220: 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75  vision {} { retu
7230: 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d  rn 0 }.    typem
7240: 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20  ethod bysymbol  
7250: 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d   {} { return 1 }
7260: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
7270: 69 73 74 61 67 20 20 20 20 20 20 7b 7d 20 7b 20  istag      {} { 
7280: 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74  return 1 }.    t
7290: 79 70 65 6d 65 74 68 6f 64 20 69 73 62 72 61 6e  ypemethod isbran
72a0: 63 68 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e  ch   {} { return
72b0: 20 30 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75   0 }..    # resu
72c0: 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69 6e 74 69  lt = list (minti
72d0: 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a 20 20 20  me, maxtime).   
72e0: 20 74 79 70 65 6d 65 74 68 6f 64 20 74 69 6d 65   typemethod time
72f0: 72 61 6e 67 65 20 7b 74 61 67 73 7d 20 7b 0a 20  range {tags} {. 
7300: 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28     }..    # var(
7310: 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d  dv) = dict (item
7320: 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29   -> list (item))
7330: 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28  , item  = list (
7340: 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 70  type id).    typ
7350: 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f  emethod successo
7360: 72 73 20 7b 64 76 20 74 61 67 73 7d 20 7b 0a 20  rs {dv tags} {. 
7370: 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28     }..    # var(
7380: 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d  dv) = dict (item
7390: 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29   -> list (item))
73a0: 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28  , item  = list (
73b0: 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 70  type id).    typ
73c0: 65 6d 65 74 68 6f 64 20 70 72 65 64 65 63 65 73  emethod predeces
73d0: 73 6f 72 73 20 7b 64 76 20 74 61 67 73 7d 20 7b  sors {dv tags} {
73e0: 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23  .    }.}..# # ##
73f0: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23   ### ##### #####
7400: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
7410: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23  # ##############
7420: 23 23 23 23 23 23 23 0a 23 23 20 48 65 6c 70 65  #######.## Helpe
7430: 72 20 73 69 6e 67 6c 65 74 6f 6e 2e 20 43 6f 6d  r singleton. Com
7440: 6d 61 6e 64 73 20 66 6f 72 20 62 72 61 6e 63 68  mands for branch
7450: 20 73 79 6d 62 6f 6c 20 63 68 61 6e 67 65 73 65   symbol changese
7460: 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20  ts...snit::type 
7470: 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d  ::vc::fossil::im
7480: 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65  port::cvs::proje
7490: 63 74 3a 3a 72 65 76 3a 3a 73 79 6d 3a 3a 62 72  ct::rev::sym::br
74a0: 61 6e 63 68 20 7b 0a 20 20 20 20 74 79 70 65 6d  anch {.    typem
74b0: 65 74 68 6f 64 20 62 79 72 65 76 69 73 69 6f 6e  ethod byrevision
74c0: 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d   {} { return 0 }
74d0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
74e0: 62 79 73 79 6d 62 6f 6c 20 20 20 7b 7d 20 7b 20  bysymbol   {} { 
74f0: 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74  return 1 }.    t
7500: 79 70 65 6d 65 74 68 6f 64 20 69 73 74 61 67 20  ypemethod istag 
7510: 20 20 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e       {} { return
7520: 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74   0 }.    typemet
7530: 68 6f 64 20 69 73 62 72 61 6e 63 68 20 20 20 7b  hod isbranch   {
7540: 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a 0a  } { return 1 }..
7550: 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c      # result = l
7560: 69 73 74 20 28 6d 69 6e 74 69 6d 65 2c 20 6d 61  ist (mintime, ma
7570: 78 74 69 6d 65 29 0a 20 20 20 20 74 79 70 65 6d  xtime).    typem
7580: 65 74 68 6f 64 20 74 69 6d 65 72 61 6e 67 65 20  ethod timerange 
7590: 7b 62 72 61 6e 63 68 65 73 7d 20 7b 0a 20 20 20  {branches} {.   
75a0: 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76   }..    # var(dv
75b0: 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d  ) = dict (item -
75c0: 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c 20  > list (item)), 
75d0: 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 79  item  = list (ty
75e0: 70 65 20 69 64 29 0a 20 20 20 20 74 79 70 65 6d  pe id).    typem
75f0: 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f 72 73  ethod successors
7600: 20 7b 64 76 20 62 72 61 6e 63 68 65 73 7d 20 7b   {dv branches} {
7610: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61  .    }..    # va
7620: 72 28 64 76 29 20 3d 20 64 69 63 74 20 28 69 74  r(dv) = dict (it
7630: 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d  em -> list (item
7640: 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74  )), item  = list
7650: 20 28 74 79 70 65 20 69 64 29 0a 20 20 20 20 74   (type id).    t
7660: 79 70 65 6d 65 74 68 6f 64 20 70 72 65 64 65 63  ypemethod predec
7670: 65 73 73 6f 72 73 20 7b 64 76 20 62 72 61 6e 63  essors {dv branc
7680: 68 65 73 7d 20 7b 0a 20 20 20 20 7d 0a 0a 20 20  hes} {.    }..  
7690: 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23    # # ## ### ###
76a0: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23  ## ######## ####
76b0: 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23  #########.    ##
76c0: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a   Configuration..
76d0: 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 69      pragma -hasi
76e0: 6e 73 74 61 6e 63 65 73 20 20 20 6e 6f 20 3b 20  nstances   no ; 
76f0: 23 20 73 69 6e 67 6c 65 74 6f 6e 0a 20 20 20 20  # singleton.    
7700: 70 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65 69  pragma -hastypei
7710: 6e 66 6f 20 20 20 20 6e 6f 20 3b 20 23 20 6e 6f  nfo    no ; # no
7720: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20   introspection. 
7730: 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79     pragma -hasty
7740: 70 65 64 65 73 74 72 6f 79 20 6e 6f 20 3b 20 23  pedestroy no ; #
7750: 20 69 6d 6d 6f 72 74 61 6c 0a 7d 0a 0a 23 20 23   immortal.}..# #
7760: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23   ## ### ##### ##
7770: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
7780: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
7790: 23 23 23 23 23 23 23 23 23 23 0a 23 23 0a 0a 6e  ##########.##..n
77a0: 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a  amespace eval ::
77b0: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f  vc::fossil::impo
77c0: 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74  rt::cvs::project
77d0: 20 7b 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65   {.    namespace
77e0: 20 65 78 70 6f 72 74 20 72 65 76 0a 20 20 20 20   export rev.    
77f0: 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 72  namespace eval r
7800: 65 76 20 7b 0a 09 6e 61 6d 65 73 70 61 63 65 20  ev {..namespace 
7810: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73  import ::vc::fos
7820: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73  sil::import::cvs
7830: 3a 3a 73 74 61 74 65 0a 09 6e 61 6d 65 73 70 61  ::state..namespa
7840: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a  ce import ::vc::
7850: 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a  fossil::import::
7860: 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09  cvs::integrity..
7870: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74  namespace import
7880: 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69   ::vc::tools::mi
7890: 73 63 3a 3a 2a 0a 09 6e 61 6d 65 73 70 61 63 65  sc::*..namespace
78a0: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f   import ::vc::to
78b0: 6f 6c 73 3a 3a 74 72 6f 75 62 6c 65 0a 09 6e 61  ols::trouble..na
78c0: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
78d0: 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a  :vc::tools::log.
78e0: 09 6c 6f 67 20 72 65 67 69 73 74 65 72 20 63 73  .log register cs
78f0: 65 74 73 0a 0a 09 23 20 53 65 74 20 75 70 20 74  ets...# Set up t
7900: 68 65 20 68 65 6c 70 65 72 20 73 69 6e 67 6c 65  he helper single
7910: 74 6f 6e 73 0a 09 6e 61 6d 65 73 70 61 63 65 20  tons..namespace 
7920: 65 76 61 6c 20 72 65 76 20 7b 0a 09 20 20 20 20  eval rev {..    
7930: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74  namespace import
7940: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
7950: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74  mport::cvs::stat
7960: 65 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65  e..    namespace
7970: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f   import ::vc::fo
7980: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
7990: 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a  s::integrity..}.
79a0: 09 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20  .namespace eval 
79b0: 73 79 6d 3a 3a 74 61 67 20 7b 0a 09 20 20 20 20  sym::tag {..    
79c0: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74  namespace import
79d0: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
79e0: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74  mport::cvs::stat
79f0: 65 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65  e..    namespace
7a00: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f   import ::vc::fo
7a10: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
7a20: 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a  s::integrity..}.
7a30: 09 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20  .namespace eval 
7a40: 73 79 6d 3a 3a 62 72 61 6e 63 68 20 7b 0a 09 20  sym::branch {.. 
7a50: 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70     namespace imp
7a60: 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c  ort ::vc::fossil
7a70: 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73  ::import::cvs::s
7a80: 74 61 74 65 0a 09 20 20 20 20 6e 61 6d 65 73 70  tate..    namesp
7a90: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a  ace import ::vc:
7aa0: 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a  :fossil::import:
7ab0: 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a  :cvs::integrity.
7ac0: 09 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 20  .}.    }.}..# # 
7ad0: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
7ae0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
7af0: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
7b00: 23 23 23 23 23 23 23 23 23 0a 23 23 20 52 65 61  #########.## Rea
7b10: 64 79 0a 0a 70 61 63 6b 61 67 65 20 70 72 6f 76  dy..package prov
7b20: 69 64 65 20 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a  ide vc::fossil::
7b30: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f  import::cvs::pro
7b40: 6a 65 63 74 3a 3a 72 65 76 20 31 2e 30 0a 72 65  ject::rev 1.0.re
7b50: 74 75 72 6e 0a                                   turn.