Hex Artifact Content
Not logged in

Artifact 2ef585bdd8bc54b990e3f7a4c8f89fae62937696:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [0fcfbf7828] - Reworked the in-memory databases of changesets. Objects now hold items, not only revisions. Tags, and branches are new possibilities. Lists of ids go to the type-dependent retrieval command. List of tagged items (type/id pairs) come back, and are in the API. The 1:n map revisions to changesets is now an 1:1-map tagged items to changeset. by aku on 2007-11-29 07:24:39.

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 0a 09 20 20 20 20 73 65 74 20  ions {..    set 
0820: 6b 65 79 20 5b 6c 69 73 74 20 24 63 73 74 79 70  key [list $cstyp
0830: 65 20 24 69 64 5d 0a 09 20 20 20 20 73 65 74 20  e $id]..    set 
0840: 6d 79 72 65 76 6d 61 70 28 24 6b 65 79 29 20 24  myrevmap($key) $
0850: 73 65 6c 66 0a 09 20 20 20 20 6c 61 70 70 65 6e  self..    lappen
0860: 64 20 6d 79 74 69 74 65 6d 73 20 24 6b 65 79 0a  d mytitems $key.
0870: 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d  .}..return.    }
0880: 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 74 72  ..    method str
0890: 20 7b 7d 20 7b 0a 09 73 65 74 20 73 74 72 20 20   {} {..set str  
08a0: 20 20 22 3c 22 0a 09 73 65 74 20 64 65 74 61 69    "<"..set detai
08b0: 6c 20 22 22 0a 09 69 66 20 7b 5b 24 6d 79 74 79  l ""..if {[$myty
08c0: 70 65 6f 62 6a 20 62 79 73 79 6d 62 6f 6c 5d 7d  peobj bysymbol]}
08d0: 20 7b 0a 09 20 20 20 20 73 65 74 20 64 65 74 61   {..    set deta
08e0: 69 6c 20 22 20 27 5b 73 74 61 74 65 20 6f 6e 65  il " '[state one
08f0: 20 7b 0a 09 09 53 45 4c 45 43 54 20 53 2e 6e 61   {...SELECT S.na
0900: 6d 65 0a 09 09 46 52 4f 4d 20 20 20 73 79 6d 62  me...FROM   symb
0910: 6f 6c 20 53 0a 09 09 57 48 45 52 45 20 20 53 2e  ol S...WHERE  S.
0920: 73 69 64 20 3d 20 24 6d 79 73 72 63 69 64 0a 09  sid = $mysrcid..
0930: 20 20 20 20 7d 5d 27 22 0a 09 7d 0a 09 61 70 70      }]'"..}..app
0940: 65 6e 64 20 73 74 72 20 22 24 6d 79 74 79 70 65  end str "$mytype
0950: 20 24 7b 6d 79 69 64 7d 24 7b 64 65 74 61 69 6c   ${myid}${detail
0960: 7d 3e 22 0a 09 72 65 74 75 72 6e 20 24 73 74 72  }>"..return $str
0970: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68  .    }..    meth
0980: 6f 64 20 69 64 20 20 20 20 20 20 20 20 7b 7d 20  od id        {} 
0990: 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 64 20 7d  { return $myid }
09a0: 0a 20 20 20 20 6d 65 74 68 6f 64 20 72 65 76 69  .    method revi
09b0: 73 69 6f 6e 73 20 7b 7d 20 7b 20 72 65 74 75 72  sions {} { retur
09c0: 6e 20 24 6d 79 74 69 74 65 6d 73 20 7d 0a 20 20  n $mytitems }.  
09d0: 20 20 6d 65 74 68 6f 64 20 64 61 74 61 20 20 20    method data   
09e0: 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 5b     {} { return [
09f0: 6c 69 73 74 20 24 6d 79 70 72 6f 6a 65 63 74 20  list $myproject 
0a00: 24 6d 79 74 79 70 65 20 24 6d 79 73 72 63 69 64  $mytype $mysrcid
0a10: 5d 20 7d 0a 0a 20 20 20 20 64 65 6c 65 67 61 74  ] }..    delegat
0a20: 65 20 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 6f  e method bysymbo
0a30: 6c 20 20 20 74 6f 20 6d 79 74 79 70 65 6f 62 6a  l   to mytypeobj
0a40: 0a 20 20 20 20 64 65 6c 65 67 61 74 65 20 6d 65  .    delegate me
0a50: 74 68 6f 64 20 62 79 72 65 76 69 73 69 6f 6e 20  thod byrevision 
0a60: 74 6f 20 6d 79 74 79 70 65 6f 62 6a 0a 20 20 20  to mytypeobj.   
0a70: 20 64 65 6c 65 67 61 74 65 20 6d 65 74 68 6f 64   delegate method
0a80: 20 69 73 62 72 61 6e 63 68 20 20 20 74 6f 20 6d   isbranch   to m
0a90: 79 74 79 70 65 6f 62 6a 0a 20 20 20 20 64 65 6c  ytypeobj.    del
0aa0: 65 67 61 74 65 20 6d 65 74 68 6f 64 20 69 73 74  egate method ist
0ab0: 61 67 20 20 20 20 20 20 74 6f 20 6d 79 74 79 70  ag      to mytyp
0ac0: 65 6f 62 6a 0a 0a 20 20 20 20 6d 65 74 68 6f 64  eobj..    method
0ad0: 20 73 65 74 70 6f 73 20 7b 70 7d 20 7b 20 73 65   setpos {p} { se
0ae0: 74 20 6d 79 70 6f 73 20 24 70 20 3b 20 72 65 74  t mypos $p ; ret
0af0: 75 72 6e 20 7d 0a 20 20 20 20 6d 65 74 68 6f 64  urn }.    method
0b00: 20 70 6f 73 20 20 20 20 7b 7d 20 20 7b 20 72 65   pos    {}  { re
0b10: 74 75 72 6e 20 24 6d 79 70 6f 73 20 7d 0a 0a 20  turn $mypos }.. 
0b20: 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20 64 69     # result = di
0b30: 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74  ct (item -> list
0b40: 20 28 63 68 61 6e 67 65 73 65 74 29 29 0a 20 20   (changeset)).  
0b50: 20 20 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73    method success
0b60: 6f 72 6d 61 70 20 7b 7d 20 7b 0a 09 23 20 4e 4f  ormap {} {..# NO
0b70: 54 45 20 2f 20 46 55 54 55 52 45 3a 20 50 6f 73  TE / FUTURE: Pos
0b80: 73 69 62 6c 65 20 62 6f 74 74 6c 65 6e 65 63 6b  sible bottleneck
0b90: 2e 0a 09 61 72 72 61 79 20 73 65 74 20 74 6d 70  ...array set tmp
0ba0: 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 65   {}..foreach {re
0bb0: 76 20 63 68 69 6c 64 72 65 6e 7d 20 5b 24 73 65  v children} [$se
0bc0: 6c 66 20 6e 65 78 74 6d 61 70 5d 20 7b 0a 09 20  lf nextmap] {.. 
0bd0: 20 20 20 66 6f 72 65 61 63 68 20 63 68 69 6c 64     foreach child
0be0: 20 24 63 68 69 6c 64 72 65 6e 20 7b 0a 09 09 23   $children {...#
0bf0: 20 38 2e 35 20 6c 61 70 70 65 6e 64 20 74 6d 70   8.5 lappend tmp
0c00: 28 24 72 65 76 29 20 7b 2a 7d 24 6d 79 72 65 76  ($rev) {*}$myrev
0c10: 6d 61 70 28 24 63 68 69 6c 64 29 0a 09 09 66 6f  map($child)...fo
0c20: 72 65 61 63 68 20 63 73 65 74 20 24 6d 79 72 65  reach cset $myre
0c30: 76 6d 61 70 28 24 63 68 69 6c 64 29 20 7b 0a 09  vmap($child) {..
0c40: 09 20 20 20 20 6c 61 70 70 65 6e 64 20 74 6d 70  .    lappend tmp
0c50: 28 24 72 65 76 29 20 24 63 73 65 74 0a 09 09 7d  ($rev) $cset...}
0c60: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73 65 74  ..    }..    set
0c70: 20 74 6d 70 28 24 72 65 76 29 20 5b 6c 73 6f 72   tmp($rev) [lsor
0c80: 74 20 2d 75 6e 69 71 75 65 20 24 74 6d 70 28 24  t -unique $tmp($
0c90: 72 65 76 29 5d 0a 09 7d 0a 09 72 65 74 75 72 6e  rev)]..}..return
0ca0: 20 5b 61 72 72 61 79 20 67 65 74 20 74 6d 70 5d   [array get tmp]
0cb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65  .    }..    # re
0cc0: 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 63 68 61  sult = list (cha
0cd0: 6e 67 65 73 65 74 29 0a 20 20 20 20 6d 65 74 68  ngeset).    meth
0ce0: 6f 64 20 73 75 63 63 65 73 73 6f 72 73 20 7b 7d  od successors {}
0cf0: 20 7b 0a 09 23 20 4e 4f 54 45 20 2f 20 46 55 54   {..# NOTE / FUT
0d00: 55 52 45 3a 20 50 6f 73 73 69 62 6c 65 20 62 6f  URE: Possible bo
0d10: 74 74 6c 65 6e 65 63 6b 2e 0a 09 73 65 74 20 63  ttleneck...set c
0d20: 73 65 74 73 20 7b 7d 0a 09 66 6f 72 65 61 63 68  sets {}..foreach
0d30: 20 7b 5f 20 63 68 69 6c 64 72 65 6e 7d 20 5b 24   {_ children} [$
0d40: 73 65 6c 66 20 6e 65 78 74 6d 61 70 5d 20 7b 0a  self nextmap] {.
0d50: 09 20 20 20 20 66 6f 72 65 61 63 68 20 63 68 69  .    foreach chi
0d60: 6c 64 20 24 63 68 69 6c 64 72 65 6e 20 7b 0a 09  ld $children {..
0d70: 09 23 20 38 2e 35 20 6c 61 70 70 65 6e 64 20 63  .# 8.5 lappend c
0d80: 73 65 74 73 20 7b 2a 7d 24 6d 79 72 65 76 6d 61  sets {*}$myrevma
0d90: 70 28 24 63 68 69 6c 64 29 0a 09 09 66 6f 72 65  p($child)...fore
0da0: 61 63 68 20 63 73 65 74 20 24 6d 79 72 65 76 6d  ach cset $myrevm
0db0: 61 70 28 24 63 68 69 6c 64 29 20 7b 0a 09 09 20  ap($child) {... 
0dc0: 20 20 20 6c 61 70 70 65 6e 64 20 63 73 65 74 73     lappend csets
0dd0: 20 24 63 73 65 74 0a 09 09 7d 0a 09 20 20 20 20   $cset...}..    
0de0: 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b 6c 73  }..}..return [ls
0df0: 6f 72 74 20 2d 75 6e 69 71 75 65 20 24 63 73 65  ort -unique $cse
0e00: 74 73 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  ts].    }..    #
0e10: 20 72 65 73 75 6c 74 20 3d 20 64 69 63 74 20 28   result = dict (
0e20: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 63 68  item -> list (ch
0e30: 61 6e 67 65 73 65 74 29 29 0a 20 20 20 20 6d 65  angeset)).    me
0e40: 74 68 6f 64 20 70 72 65 64 65 63 65 73 73 6f 72  thod predecessor
0e50: 6d 61 70 20 7b 7d 20 7b 0a 09 23 20 4e 4f 54 45  map {} {..# NOTE
0e60: 20 2f 20 46 55 54 55 52 45 3a 20 50 6f 73 73 69   / FUTURE: Possi
0e70: 62 6c 65 20 62 6f 74 74 6c 65 6e 65 63 6b 2e 0a  ble bottleneck..
0e80: 09 61 72 72 61 79 20 73 65 74 20 74 6d 70 20 7b  .array set tmp {
0e90: 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 65 76 20  }..foreach {rev 
0ea0: 63 68 69 6c 64 72 65 6e 7d 20 5b 24 73 65 6c 66  children} [$self
0eb0: 20 70 72 65 6d 61 70 5d 20 7b 0a 09 20 20 20 20   premap] {..    
0ec0: 66 6f 72 65 61 63 68 20 63 68 69 6c 64 20 24 63  foreach child $c
0ed0: 68 69 6c 64 72 65 6e 20 7b 0a 09 09 23 20 38 2e  hildren {...# 8.
0ee0: 35 20 6c 61 70 70 65 6e 64 20 74 6d 70 28 24 72  5 lappend tmp($r
0ef0: 65 76 29 20 7b 2a 7d 24 6d 79 72 65 76 6d 61 70  ev) {*}$myrevmap
0f00: 28 24 63 68 69 6c 64 29 0a 09 09 66 6f 72 65 61  ($child)...forea
0f10: 63 68 20 63 73 65 74 20 24 6d 79 72 65 76 6d 61  ch cset $myrevma
0f20: 70 28 24 63 68 69 6c 64 29 20 7b 0a 09 09 20 20  p($child) {...  
0f30: 20 20 6c 61 70 70 65 6e 64 20 74 6d 70 28 24 72    lappend tmp($r
0f40: 65 76 29 20 24 63 73 65 74 0a 09 09 7d 0a 09 20  ev) $cset...}.. 
0f50: 20 20 20 7d 0a 09 20 20 20 20 73 65 74 20 74 6d     }..    set tm
0f60: 70 28 24 72 65 76 29 20 5b 6c 73 6f 72 74 20 2d  p($rev) [lsort -
0f70: 75 6e 69 71 75 65 20 24 74 6d 70 28 24 72 65 76  unique $tmp($rev
0f80: 29 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b 61  )]..}..return [a
0f90: 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 20 20  rray get tmp].  
0fa0: 20 20 7d 0a 0a 20 20 20 20 23 20 69 74 65 6d 20    }..    # item 
0fb0: 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 0a 20  -> list (item). 
0fc0: 20 20 20 6d 65 74 68 6f 64 20 6e 65 78 74 6d 61     method nextma
0fd0: 70 20 7b 7d 20 7b 0a 09 69 66 20 7b 5b 6c 6c 65  p {} {..if {[lle
0fe0: 6e 67 74 68 20 24 6d 79 6e 65 78 74 6d 61 70 5d  ngth $mynextmap]
0ff0: 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 6e 65  } { return $myne
1000: 78 74 6d 61 70 20 7d 0a 09 24 6d 79 74 79 70 65  xtmap }..$mytype
1010: 6f 62 6a 20 73 75 63 63 65 73 73 6f 72 73 20 74  obj successors t
1020: 6d 70 20 24 6d 79 72 65 76 69 73 69 6f 6e 73 0a  mp $myrevisions.
1030: 09 73 65 74 20 6d 79 6e 65 78 74 6d 61 70 20 5b  .set mynextmap [
1040: 61 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 09  array get tmp]..
1050: 72 65 74 75 72 6e 20 24 6d 79 6e 65 78 74 6d 61  return $mynextma
1060: 70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 69  p.    }..    # i
1070: 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65  tem -> list (ite
1080: 6d 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 70 72  m).    method pr
1090: 65 6d 61 70 20 7b 7d 20 7b 0a 09 69 66 20 7b 5b  emap {} {..if {[
10a0: 6c 6c 65 6e 67 74 68 20 24 6d 79 70 72 65 6d 61  llength $myprema
10b0: 70 5d 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79  p]} { return $my
10c0: 70 72 65 6d 61 70 20 7d 0a 09 24 6d 79 74 79 70  premap }..$mytyp
10d0: 65 6f 62 6a 20 70 72 65 64 65 63 65 73 73 6f 72  eobj predecessor
10e0: 73 20 74 6d 70 20 24 6d 79 72 65 76 69 73 69 6f  s tmp $myrevisio
10f0: 6e 73 0a 09 73 65 74 20 6d 79 70 72 65 6d 61 70  ns..set mypremap
1100: 20 5b 61 72 72 61 79 20 67 65 74 20 74 6d 70 5d   [array get tmp]
1110: 0a 09 72 65 74 75 72 6e 20 24 6d 79 70 72 65 6d  ..return $myprem
1120: 61 70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65  ap.    }..    me
1130: 74 68 6f 64 20 62 72 65 61 6b 69 6e 74 65 72 6e  thod breakintern
1140: 61 6c 64 65 70 65 6e 64 65 6e 63 69 65 73 20 7b  aldependencies {
1150: 7d 20 7b 0a 09 23 20 54 68 69 73 20 6d 65 74 68  } {..# This meth
1160: 6f 64 20 69 6e 73 70 65 63 74 73 20 74 68 65 20  od inspects the 
1170: 63 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20 69  changesets for i
1180: 6e 74 65 72 6e 61 6c 0a 09 23 20 64 65 70 65 6e  nternal..# depen
1190: 64 65 6e 63 69 65 73 2e 20 4e 6f 74 68 69 6e 67  dencies. Nothing
11a0: 20 69 73 20 64 6f 6e 65 20 69 66 20 74 68 65 72   is done if ther
11b0: 65 20 61 72 65 20 6e 6f 0a 09 23 20 73 75 63 68  e are no..# such
11c0: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
11d0: 63 68 61 6e 67 65 73 65 74 20 69 73 20 73 70 6c  changeset is spl
11e0: 69 74 20 69 6e 74 6f 20 61 20 73 65 74 20 6f 66  it into a set of
11f0: 0a 09 23 20 66 72 61 67 6d 65 6e 74 73 20 77 69  ..# fragments wi
1200: 74 68 6f 75 74 20 69 6e 74 65 72 6e 61 6c 20 64  thout internal d
1210: 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 74 72 61  ependencies, tra
1220: 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 09 23  nsforming the..#
1230: 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64   internal depend
1240: 65 6e 63 69 65 73 20 69 6e 74 6f 20 65 78 74 65  encies into exte
1250: 72 6e 61 6c 20 6f 6e 65 73 2e 20 54 68 65 20 6e  rnal ones. The n
1260: 65 77 20 63 68 61 6e 67 65 73 65 74 73 0a 09 23  ew changesets..#
1270: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
1280: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 68  e list of all ch
1290: 61 6e 67 65 73 65 74 73 2e 0a 0a 09 23 20 57 65  angesets....# We
12a0: 20 70 65 72 66 6f 72 6d 20 61 6c 6c 20 6e 65 63   perform all nec
12b0: 65 73 73 61 72 79 20 73 70 6c 69 74 73 20 69 6e  essary splits in
12c0: 20 6f 6e 65 20 67 6f 2c 20 69 6e 73 74 65 61 64   one go, instead
12d0: 20 6f 66 20 6f 6e 6c 79 0a 09 23 20 6f 6e 65 2e   of only..# one.
12e0: 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 61 6c   The previous al
12f0: 67 6f 72 69 74 68 6d 2c 20 61 64 61 70 74 65 64  gorithm, adapted
1300: 20 66 72 6f 6d 20 63 76 73 32 73 76 6e 2c 20 63   from cvs2svn, c
1310: 6f 6d 70 75 74 65 64 0a 09 23 20 61 20 6c 6f 74  omputed..# a lot
1320: 20 6f 66 20 73 74 61 74 65 20 77 68 69 63 68 20   of state which 
1330: 77 61 73 20 74 68 72 6f 77 6e 20 61 77 61 79 20  was thrown away 
1340: 61 6e 64 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  and then compute
1350: 64 20 61 67 61 69 6e 0a 09 23 20 66 6f 72 20 65  d again..# for e
1360: 61 63 68 20 6f 66 20 74 68 65 20 66 72 61 67 6d  ach of the fragm
1370: 65 6e 74 73 2e 20 49 74 20 73 68 6f 75 6c 64 20  ents. It should 
1380: 62 65 20 65 61 73 69 65 72 20 74 6f 20 75 70 64  be easier to upd
1390: 61 74 65 20 61 6e 64 0a 09 23 20 72 65 75 73 65  ate and..# reuse
13a0: 20 74 68 61 74 20 73 74 61 74 65 2e 0a 0a 09 23   that state....#
13b0: 20 54 68 65 20 63 6f 64 65 20 63 68 65 63 6b 73   The code checks
13c0: 20 6f 6e 6c 79 20 73 75 63 65 73 73 6f 72 20 64   only sucessor d
13d0: 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 20  ependencies, as 
13e0: 74 68 69 73 0a 09 23 20 61 75 74 6f 6d 61 74 69  this..# automati
13f0: 63 61 6c 6c 79 20 63 6f 76 65 72 73 20 74 68 65  cally covers the
1400: 20 70 72 65 64 65 63 65 73 73 6f 72 20 64 65 70   predecessor dep
1410: 65 6e 64 65 6e 63 69 65 73 20 61 73 20 77 65 6c  endencies as wel
1420: 6c 20 28 41 0a 09 23 20 73 75 63 63 65 73 73 6f  l (A..# successo
1430: 72 20 64 65 70 65 6e 64 65 6e 63 79 20 61 20 2d  r dependency a -
1440: 3e 20 62 20 69 73 20 61 6c 73 6f 20 61 20 70 72  > b is also a pr
1450: 65 64 65 63 65 73 73 6f 72 20 64 65 70 65 6e 64  edecessor depend
1460: 65 6e 63 79 0a 09 23 20 62 20 2d 3e 20 61 29 2e  ency..# b -> a).
1470: 0a 0a 09 23 20 41 72 72 61 79 20 6f 66 20 64 65  ...# Array of de
1480: 70 65 6e 64 65 6e 63 69 65 73 20 28 70 61 72 65  pendencies (pare
1490: 6e 74 20 2d 3e 20 63 68 69 6c 64 29 2e 20 54 68  nt -> child). Th
14a0: 69 73 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f  is is pulled fro
14b0: 6d 0a 09 23 20 74 68 65 20 73 74 61 74 65 2c 20  m..# the state, 
14c0: 61 6e 64 20 6c 69 6d 69 74 65 64 20 74 6f 20 73  and limited to s
14d0: 75 63 63 65 73 73 6f 72 73 20 77 69 74 68 69 6e  uccessors within
14e0: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 0a   the changeset..
14f0: 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 70 65  ..array set depe
1500: 6e 64 65 6e 63 69 65 73 20 7b 7d 0a 09 24 6d 79  ndencies {}..$my
1510: 74 79 70 65 6f 62 6a 20 69 6e 74 65 72 6e 61 6c  typeobj internal
1520: 73 75 63 63 65 73 73 6f 72 73 20 64 65 70 65 6e  successors depen
1530: 64 65 6e 63 69 65 73 20 24 6d 79 72 65 76 69 73  dencies $myrevis
1540: 69 6f 6e 73 0a 09 69 66 20 7b 21 5b 61 72 72 61  ions..if {![arra
1550: 79 20 73 69 7a 65 20 64 65 70 65 6e 64 65 6e 63  y size dependenc
1560: 69 65 73 5d 7d 20 7b 72 65 74 75 72 6e 20 30 7d  ies]} {return 0}
1570: 20 3b 20 23 20 4e 6f 74 68 69 6e 67 20 74 6f 20   ; # Nothing to 
1580: 62 72 65 61 6b 2e 0a 0a 09 6c 6f 67 20 77 72 69  break....log wri
1590: 74 65 20 35 20 63 73 65 74 73 20 2e 2e 2e 5b 24  te 5 csets ...[$
15a0: 73 65 6c 66 20 73 74 72 5d 2e 2e 2e 2e 2e 2e 2e  self str].......
15b0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
15c0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
15d0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
15e0: 0a 0a 09 23 20 57 65 20 68 61 76 65 20 69 6e 74  ...# We have int
15f0: 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69  ernal dependenci
1600: 65 73 20 74 6f 20 62 72 65 61 6b 2e 20 57 65 20  es to break. We 
1610: 6e 6f 77 20 69 74 65 72 61 74 65 20 6f 76 65 72  now iterate over
1620: 0a 09 23 20 61 6c 6c 20 70 6f 73 69 74 69 6f 6e  ..# all position
1630: 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 28 77  s in the list (w
1640: 68 69 63 68 20 69 73 20 63 68 72 6f 6e 6f 6c 6f  hich is chronolo
1650: 67 69 63 61 6c 2c 20 61 74 20 6c 65 61 73 74 0a  gical, at least.
1660: 09 23 20 61 73 20 66 61 72 20 61 73 20 74 68 65  .# as far as the
1670: 20 74 69 6d 65 73 74 61 6d 70 73 20 61 72 65 20   timestamps are 
1680: 63 6f 72 72 65 63 74 20 61 6e 64 20 75 6e 69 71  correct and uniq
1690: 75 65 29 20 61 6e 64 0a 09 23 20 64 65 74 65 72  ue) and..# deter
16a0: 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 70 6f  mine the best po
16b0: 73 69 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 62  sition for the b
16c0: 72 65 61 6b 2c 20 62 79 20 74 72 79 69 6e 67 20  reak, by trying 
16d0: 74 6f 0a 09 23 20 62 72 65 61 6b 20 61 73 20 6d  to..# break as m
16e0: 61 6e 79 20 64 65 70 65 6e 64 65 6e 63 69 65 73  any dependencies
16f0: 20 61 73 20 70 6f 73 73 69 62 6c 65 20 69 6e 20   as possible in 
1700: 6f 6e 65 20 67 6f 2e 20 57 68 65 6e 20 61 0a 09  one go. When a..
1710: 23 20 62 72 65 61 6b 20 77 61 73 20 66 6f 75 6e  # break was foun
1720: 64 20 74 68 69 73 20 69 73 20 72 65 64 6f 6e 65  d this is redone
1730: 20 66 6f 72 20 74 68 65 20 66 72 61 67 6d 65 6e   for the fragmen
1740: 74 73 20 63 6f 6d 69 6e 67 20 61 6e 64 0a 09 23  ts coming and..#
1750: 20 61 66 74 65 72 2c 20 61 66 74 65 72 20 75 70   after, after up
1760: 64 69 6e 67 20 74 68 65 20 63 72 6f 73 73 69 6e  ding the crossin
1770: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 0a  g information...
1780: 09 23 20 44 61 74 61 20 73 74 72 75 63 74 75 72  .# Data structur
1790: 65 73 3a 0a 09 23 20 4d 61 70 3a 20 20 50 4f 53  es:..# Map:  POS
17a0: 20 20 20 72 65 76 69 73 69 6f 6e 20 69 64 20 20     revision id  
17b0: 20 20 20 20 2d 3e 20 70 6f 73 69 74 69 6f 6e 20      -> position 
17c0: 69 6e 20 6c 69 73 74 2e 0a 09 23 20 20 20 20 20  in list...#     
17d0: 20 20 43 52 4f 53 53 20 70 6f 73 69 74 69 6f 6e    CROSS position
17e0: 20 69 6e 20 6c 69 73 74 20 2d 3e 20 6e 75 6d 62   in list -> numb
17f0: 65 72 20 6f 66 20 64 65 70 65 6e 64 65 6e 63 69  er of dependenci
1800: 65 73 20 63 72 6f 73 73 69 6e 67 20 69 74 0a 09  es crossing it..
1810: 23 20 20 20 20 20 20 20 44 45 50 43 20 20 64 65  #       DEPC  de
1820: 70 65 6e 64 65 6e 63 79 20 20 20 20 20 20 20 2d  pendency       -
1830: 3e 20 70 6f 73 69 74 69 6f 6e 73 20 69 74 20 63  > positions it c
1840: 72 6f 73 73 65 73 0a 09 23 20 4c 69 73 74 3a 20  rosses..# List: 
1850: 52 41 4e 47 45 20 4f 66 20 74 68 65 20 70 6f 73  RANGE Of the pos
1860: 69 74 69 6f 6e 73 20 69 74 73 65 6c 66 2e 0a 09  itions itself...
1870: 23 20 41 20 64 65 70 65 6e 64 65 6e 63 79 20 69  # A dependency i
1880: 73 20 61 20 73 69 6e 67 6c 65 2d 65 6c 65 6d 65  s a single-eleme
1890: 6e 74 20 6d 61 70 20 70 61 72 65 6e 74 20 2d 3e  nt map parent ->
18a0: 20 63 68 69 6c 64 0a 0a 09 49 6e 69 74 69 61 6c   child...Initial
18b0: 69 7a 65 42 72 65 61 6b 53 74 61 74 65 20 24 6d  izeBreakState $m
18c0: 79 72 65 76 69 73 69 6f 6e 73 0a 0a 09 73 65 74  yrevisions...set
18d0: 20 66 72 61 67 6d 65 6e 74 73 20 7b 7d 0a 09 73   fragments {}..s
18e0: 65 74 20 70 65 6e 64 69 6e 67 20 20 20 5b 6c 69  et pending   [li
18f0: 73 74 20 24 72 61 6e 67 65 5d 0a 09 73 65 74 20  st $range]..set 
1900: 61 74 20 20 20 20 20 20 20 20 30 0a 09 61 72 72  at        0..arr
1910: 61 79 20 73 65 74 20 62 72 65 61 6b 73 20 7b 7d  ay set breaks {}
1920: 0a 0a 09 77 68 69 6c 65 20 7b 24 61 74 20 3c 20  ...while {$at < 
1930: 5b 6c 6c 65 6e 67 74 68 20 24 70 65 6e 64 69 6e  [llength $pendin
1940: 67 5d 7d 20 7b 0a 09 20 20 20 20 73 65 74 20 63  g]} {..    set c
1950: 75 72 72 65 6e 74 20 5b 6c 69 6e 64 65 78 20 24  urrent [lindex $
1960: 70 65 6e 64 69 6e 67 20 24 61 74 5d 0a 0a 09 20  pending $at]... 
1970: 20 20 20 6c 6f 67 20 77 72 69 74 65 20 36 20 63     log write 6 c
1980: 73 65 74 73 20 7b 2e 20 2e 20 2e 2e 20 2e 2e 2e  sets {. . .. ...
1990: 20 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 20   ..... ........ 
19a0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 7d 0a 09  .............}..
19b0: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 36 20      log write 6 
19c0: 63 73 65 74 73 20 7b 53 63 68 65 64 75 6c 65 64  csets {Scheduled
19d0: 20 20 20 5b 6a 6f 69 6e 20 5b 50 52 73 20 5b 6c     [join [PRs [l
19e0: 72 61 6e 67 65 20 24 70 65 6e 64 69 6e 67 20 24  range $pending $
19f0: 61 74 20 65 6e 64 5d 5d 20 7b 20 7d 5d 7d 0a 09  at end]] { }]}..
1a00: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 36 20      log write 6 
1a10: 63 73 65 74 73 20 7b 43 6f 6e 73 69 64 65 72 69  csets {Consideri
1a20: 6e 67 20 5b 50 52 20 24 63 75 72 72 65 6e 74 5d  ng [PR $current]
1a30: 20 5c 5b 24 61 74 2f 5b 6c 6c 65 6e 67 74 68 20   \[$at/[llength 
1a40: 24 70 65 6e 64 69 6e 67 5d 5c 5d 7d 0a 0a 09 20  $pending]\]}... 
1a50: 20 20 20 73 65 74 20 62 65 73 74 20 5b 46 69 6e     set best [Fin
1a60: 64 42 65 73 74 42 72 65 61 6b 20 24 63 75 72 72  dBestBreak $curr
1a70: 65 6e 74 5d 0a 0a 09 20 20 20 20 69 66 20 7b 24  ent]...    if {$
1a80: 62 65 73 74 20 3c 20 30 7d 20 7b 0a 09 09 23 20  best < 0} {...# 
1a90: 54 68 65 20 69 6e 73 70 65 63 74 65 64 20 72 61  The inspected ra
1aa0: 6e 67 65 20 68 61 73 20 6e 6f 20 69 6e 74 65 72  nge has no inter
1ab0: 6e 61 6c 0a 09 09 23 20 64 65 70 65 6e 64 65 6e  nal...# dependen
1ac0: 63 69 65 73 2e 20 54 68 69 73 20 69 73 20 61 20  cies. This is a 
1ad0: 63 6f 6d 70 6c 65 74 65 20 66 72 61 67 6d 65 6e  complete fragmen
1ae0: 74 2e 0a 09 09 6c 61 70 70 65 6e 64 20 66 72 61  t....lappend fra
1af0: 67 6d 65 6e 74 73 20 24 63 75 72 72 65 6e 74 0a  gments $current.
1b00: 0a 09 09 6c 6f 67 20 77 72 69 74 65 20 36 20 63  ...log write 6 c
1b10: 73 65 74 73 20 22 4e 6f 20 62 72 65 61 6b 73 2c  sets "No breaks,
1b20: 20 66 69 6e 61 6c 22 0a 09 20 20 20 20 7d 20 65   final"..    } e
1b30: 6c 73 65 20 7b 0a 09 09 23 20 53 70 6c 69 74 20  lse {...# Split 
1b40: 74 68 65 20 72 61 6e 67 65 20 61 6e 64 20 73 63  the range and sc
1b50: 68 65 64 75 6c 65 20 74 68 65 20 72 65 73 75 6c  hedule the resul
1b60: 74 69 6e 67 20 66 72 61 67 6d 65 6e 74 73 0a 09  ting fragments..
1b70: 09 23 20 66 6f 72 20 66 75 72 74 68 65 72 20 69  .# for further i
1b80: 6e 73 70 65 63 74 69 6f 6e 2e 20 52 65 6d 65 6d  nspection. Remem
1b90: 62 65 72 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  ber the number o
1ba0: 66 0a 09 09 23 20 64 65 70 65 6e 64 65 6e 63 69  f...# dependenci
1bb0: 65 73 20 63 75 74 20 62 65 66 6f 72 65 20 77 65  es cut before we
1bc0: 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72 6f   remove them fro
1bd0: 6d 0a 09 09 23 20 63 6f 6e 73 69 64 65 72 61 74  m...# considerat
1be0: 69 6f 6e 2c 20 66 6f 72 20 64 6f 63 75 6d 65 6e  ion, for documen
1bf0: 74 61 74 69 6f 6e 20 6c 61 74 65 72 2e 0a 0a 09  tation later....
1c00: 09 73 65 74 20 62 72 65 61 6b 73 28 24 62 65 73  .set breaks($bes
1c10: 74 29 20 24 63 72 6f 73 73 28 24 62 65 73 74 29  t) $cross($best)
1c20: 0a 0a 09 09 6c 6f 67 20 77 72 69 74 65 20 36 20  ....log write 6 
1c30: 63 73 65 74 73 20 22 42 65 73 74 20 62 72 65 61  csets "Best brea
1c40: 6b 20 40 20 24 62 65 73 74 2c 20 63 75 74 74 69  k @ $best, cutti
1c50: 6e 67 20 5b 6e 73 70 20 24 63 72 6f 73 73 28 24  ng [nsp $cross($
1c60: 62 65 73 74 29 20 64 65 70 65 6e 64 65 6e 63 79  best) dependency
1c70: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 5d 22 0a   dependencies]".
1c80: 0a 09 09 23 20 4e 6f 74 65 3a 20 54 68 65 20 76  ...# Note: The v
1c90: 61 6c 75 65 20 6f 66 20 62 65 73 74 20 69 73 20  alue of best is 
1ca0: 61 6e 20 61 62 6f 6c 75 74 65 20 6c 6f 63 61 74  an abolute locat
1cb0: 69 6f 6e 20 69 6e 0a 09 09 23 20 6d 79 72 65 76  ion in...# myrev
1cc0: 69 73 69 6f 6e 73 2e 20 55 73 65 20 74 68 65 20  isions. Use the 
1cd0: 73 74 61 72 74 20 6f 66 20 63 75 72 72 65 6e 74  start of current
1ce0: 20 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 0a 09   to make it an..
1cf0: 09 23 20 69 6e 64 65 78 20 61 62 73 6f 6c 75 74  .# index absolut
1d00: 65 20 74 6f 20 63 75 72 72 65 6e 74 2e 0a 0a 09  e to current....
1d10: 09 73 65 74 20 62 72 65 6c 20 5b 65 78 70 72 20  .set brel [expr 
1d20: 7b 24 62 65 73 74 20 2d 20 5b 6c 69 6e 64 65 78  {$best - [lindex
1d30: 20 24 63 75 72 72 65 6e 74 20 30 5d 7d 5d 0a 09   $current 0]}]..
1d40: 09 73 65 74 20 62 6e 65 78 74 20 24 62 72 65 6c  .set bnext $brel
1d50: 20 3b 20 69 6e 63 72 20 62 6e 65 78 74 0a 09 09   ; incr bnext...
1d60: 73 65 74 20 66 72 61 67 62 65 66 6f 72 65 20 5b  set fragbefore [
1d70: 6c 72 61 6e 67 65 20 24 63 75 72 72 65 6e 74 20  lrange $current 
1d80: 30 20 24 62 72 65 6c 5d 0a 09 09 73 65 74 20 66  0 $brel]...set f
1d90: 72 61 67 61 66 74 65 72 20 20 5b 6c 72 61 6e 67  ragafter  [lrang
1da0: 65 20 24 63 75 72 72 65 6e 74 20 24 62 6e 65 78  e $current $bnex
1db0: 74 20 65 6e 64 5d 0a 0a 09 09 6c 6f 67 20 77 72  t end]....log wr
1dc0: 69 74 65 20 36 20 63 73 65 74 73 20 22 4e 65 77  ite 6 csets "New
1dd0: 20 70 69 65 63 65 73 20 20 5b 50 52 20 24 66 72   pieces  [PR $fr
1de0: 61 67 62 65 66 6f 72 65 5d 20 5b 50 52 20 24 66  agbefore] [PR $f
1df0: 72 61 67 61 66 74 65 72 5d 22 0a 0a 09 09 69 6e  ragafter]"....in
1e00: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b  tegrity assert {
1e10: 5b 6c 6c 65 6e 67 74 68 20 24 66 72 61 67 62 65  [llength $fragbe
1e20: 66 6f 72 65 5d 7d 20 7b 46 6f 75 6e 64 20 7a 65  fore]} {Found ze
1e30: 72 6f 2d 6c 65 6e 67 74 68 20 66 72 61 67 6d 65  ro-length fragme
1e40: 6e 74 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  nt at the beginn
1e50: 69 6e 67 7d 0a 09 09 69 6e 74 65 67 72 69 74 79  ing}...integrity
1e60: 20 61 73 73 65 72 74 20 7b 5b 6c 6c 65 6e 67 74   assert {[llengt
1e70: 68 20 24 66 72 61 67 61 66 74 65 72 5d 7d 20 20  h $fragafter]}  
1e80: 7b 46 6f 75 6e 64 20 7a 65 72 6f 2d 6c 65 6e 67  {Found zero-leng
1e90: 74 68 20 66 72 61 67 6d 65 6e 74 20 61 74 20 74  th fragment at t
1ea0: 68 65 20 65 6e 64 7d 0a 0a 09 09 6c 61 70 70 65  he end}....lappe
1eb0: 6e 64 20 70 65 6e 64 69 6e 67 20 24 66 72 61 67  nd pending $frag
1ec0: 62 65 66 6f 72 65 20 24 66 72 61 67 61 66 74 65  before $fragafte
1ed0: 72 0a 09 09 43 75 74 41 74 20 24 62 65 73 74 0a  r...CutAt $best.
1ee0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 6e 63  .    }...    inc
1ef0: 72 20 61 74 0a 09 7d 0a 0a 09 6c 6f 67 20 77 72  r at..}...log wr
1f00: 69 74 65 20 36 20 63 73 65 74 73 20 22 2e 20 2e  ite 6 csets ". .
1f10: 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e   .. ... ..... ..
1f20: 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e  ...... .........
1f30: 2e 2e 2e 2e 22 0a 0a 09 23 20 28 2a 29 20 57 65  ...."...# (*) We
1f40: 20 63 6c 65 61 72 20 6f 75 74 20 74 68 65 20 61   clear out the a
1f50: 73 73 6f 63 69 61 74 65 64 20 70 61 72 74 20 6f  ssociated part o
1f60: 66 20 74 68 65 20 6d 79 72 65 76 6d 61 70 0a 09  f the myrevmap..
1f70: 23 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6e 64 65  # in-memory inde
1f80: 78 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e  x in preparation
1f90: 20 66 6f 72 20 6e 65 77 20 64 61 74 61 2e 20 41   for new data. A
1fa0: 20 73 69 6d 70 6c 65 20 75 6e 73 65 74 0a 09 23   simple unset..#
1fb0: 20 69 73 20 65 6e 6f 75 67 68 2c 20 77 65 20 68   is enough, we h
1fc0: 61 76 65 20 6e 6f 20 73 79 6d 62 6f 6c 20 63 68  ave no symbol ch
1fd0: 61 6e 67 65 73 65 74 73 20 61 74 20 74 68 69 73  angesets at this
1fe0: 20 74 69 6d 65 2c 20 61 6e 64 0a 09 23 20 74 68   time, and..# th
1ff0: 75 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68  us never more th
2000: 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  an one reference
2010: 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 0a 09   in the list....
2020: 66 6f 72 65 61 63 68 20 72 20 24 6d 79 72 65 76  foreach r $myrev
2030: 69 73 69 6f 6e 73 20 7b 0a 09 20 20 20 20 73 65  isions {..    se
2040: 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79 74  t key [list $myt
2050: 79 70 65 20 24 72 5d 0a 09 20 20 20 20 75 6e 73  ype $r]..    uns
2060: 65 74 20 6d 79 72 65 76 6d 61 70 28 24 6b 65 79  et myrevmap($key
2070: 29 0a 09 7d 0a 0a 09 23 20 43 72 65 61 74 65 20  )..}...# Create 
2080: 63 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20 74  changesets for t
2090: 68 65 20 66 72 61 67 6d 65 6e 74 73 2c 20 72 65  he fragments, re
20a0: 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  using the curren
20b0: 74 20 6f 6e 65 0a 09 23 20 66 6f 72 20 74 68 65  t one..# for the
20c0: 20 66 69 72 73 74 20 66 72 61 67 6d 65 6e 74 2e   first fragment.
20d0: 20 57 65 20 73 6f 72 74 20 74 68 65 6d 20 69 6e   We sort them in
20e0: 20 6f 72 64 65 72 20 74 6f 20 61 6c 6c 6f 77 0a   order to allow.
20f0: 09 23 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  .# checking for 
2100: 67 61 70 73 20 61 6e 64 20 6e 69 63 65 20 6d 65  gaps and nice me
2110: 73 73 61 67 65 73 2e 0a 0a 09 73 65 74 20 66 72  ssages....set fr
2120: 61 67 6d 65 6e 74 73 20 5b 6c 73 6f 72 74 20 2d  agments [lsort -
2130: 69 6e 64 65 78 20 30 20 2d 69 6e 74 65 67 65 72  index 0 -integer
2140: 20 24 66 72 61 67 6d 65 6e 74 73 5d 0a 0a 09 23   $fragments]...#
2150: 70 75 74 73 20 5c 74 2e 5b 6a 6f 69 6e 20 5b 50  puts \t.[join [P
2160: 52 73 20 24 66 72 61 67 6d 65 6e 74 73 5d 20 2e  Rs $fragments] .
2170: 5c 6e 5c 74 2e 5d 2e 0a 0a 09 42 6f 72 64 65 72  \n\t.]....Border
2180: 20 5b 6c 69 6e 64 65 78 20 24 66 72 61 67 6d 65   [lindex $fragme
2190: 6e 74 73 20 30 5d 20 66 69 72 73 74 73 20 66 69  nts 0] firsts fi
21a0: 72 73 74 65 0a 0a 09 69 6e 74 65 67 72 69 74 79  rste...integrity
21b0: 20 61 73 73 65 72 74 20 7b 24 66 69 72 73 74 73   assert {$firsts
21c0: 20 3d 3d 20 30 7d 20 7b 42 61 64 20 66 72 61 67   == 0} {Bad frag
21d0: 6d 65 6e 74 20 73 74 61 72 74 20 40 20 24 66 69  ment start @ $fi
21e0: 72 73 74 73 2c 20 67 61 70 2c 20 6f 72 20 62 65  rsts, gap, or be
21f0: 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f  fore beginning o
2200: 66 20 74 68 65 20 72 61 6e 67 65 7d 0a 0a 09 73  f the range}...s
2210: 65 74 20 6c 61 73 74 65 20 24 66 69 72 73 74 65  et laste $firste
2220: 0a 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65  ..foreach fragme
2230: 6e 74 20 5b 6c 72 61 6e 67 65 20 24 66 72 61 67  nt [lrange $frag
2240: 6d 65 6e 74 73 20 31 20 65 6e 64 5d 20 7b 0a 09  ments 1 end] {..
2250: 20 20 20 20 42 6f 72 64 65 72 20 24 66 72 61 67      Border $frag
2260: 6d 65 6e 74 20 73 20 65 0a 09 20 20 20 20 69 6e  ment s e..    in
2270: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b  tegrity assert {
2280: 24 6c 61 73 74 65 20 3d 3d 20 28 24 73 20 2d 20  $laste == ($s - 
2290: 31 29 7d 20 7b 42 61 64 20 66 72 61 67 6d 65 6e  1)} {Bad fragmen
22a0: 74 20 62 6f 72 64 65 72 20 3c 24 6c 61 73 74 65  t border <$laste
22b0: 20 7c 20 24 73 3e 2c 20 67 61 70 20 6f 72 20 6f   | $s>, gap or o
22c0: 76 65 72 6c 61 70 7d 0a 0a 09 20 20 20 20 73 65  verlap}...    se
22d0: 74 20 6e 65 77 20 5b 24 74 79 70 65 20 25 41 55  t new [$type %AU
22e0: 54 4f 25 20 24 6d 79 70 72 6f 6a 65 63 74 20 24  TO% $myproject $
22f0: 6d 79 74 79 70 65 20 24 6d 79 73 72 63 69 64 20  mytype $mysrcid 
2300: 5b 6c 72 61 6e 67 65 20 24 6d 79 72 65 76 69 73  [lrange $myrevis
2310: 69 6f 6e 73 20 24 73 20 24 65 5d 5d 0a 0a 20 20  ions $s $e]]..  
2320: 20 20 20 20 20 20 20 20 20 20 6c 6f 67 20 77 72            log wr
2330: 69 74 65 20 34 20 63 73 65 74 73 20 22 42 72 65  ite 4 csets "Bre
2340: 61 6b 69 6e 67 20 5b 24 73 65 6c 66 20 73 74 72  aking [$self str
2350: 20 5d 20 40 20 24 6c 61 73 74 65 2c 20 6e 65 77   ] @ $laste, new
2360: 20 5b 24 6e 65 77 20 73 74 72 5d 2c 20 63 75 74   [$new str], cut
2370: 74 69 6e 67 20 24 62 72 65 61 6b 73 28 24 6c 61  ting $breaks($la
2380: 73 74 65 29 22 0a 0a 09 20 20 20 20 73 65 74 20  ste)"...    set 
2390: 6c 61 73 74 65 20 24 65 0a 09 7d 0a 0a 09 69 6e  laste $e..}...in
23a0: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b  tegrity assert {
23b0: 0a 09 20 20 20 20 24 6c 61 73 74 65 20 3d 3d 20  ..    $laste == 
23c0: 28 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 72 65 76  ([llength $myrev
23d0: 69 73 69 6f 6e 73 5d 2d 31 29 0a 09 7d 20 7b 42  isions]-1)..} {B
23e0: 61 64 20 66 72 61 67 6d 65 6e 74 20 65 6e 64 20  ad fragment end 
23f0: 40 20 24 6c 61 73 74 65 2c 20 67 61 70 2c 20 6f  @ $laste, gap, o
2400: 72 20 62 65 79 6f 6e 64 20 65 6e 64 20 6f 66 20  r beyond end of 
2410: 74 68 65 20 72 61 6e 67 65 7d 0a 0a 09 23 20 50  the range}...# P
2420: 75 74 20 74 68 65 20 66 69 72 73 74 20 66 72 61  ut the first fra
2430: 67 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 63  gment into the c
2440: 75 72 72 65 6e 74 20 63 68 61 6e 67 65 73 65 74  urrent changeset
2450: 2c 20 61 6e 64 0a 09 23 20 75 70 64 61 74 65 20  , and..# update 
2460: 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6e  the in-memory in
2470: 64 65 78 2e 20 57 65 20 63 61 6e 20 73 69 6d 70  dex. We can simp
2480: 6c 79 20 28 72 65 29 61 64 64 20 74 68 65 0a 09  ly (re)add the..
2490: 23 20 72 65 76 69 73 69 6f 6e 73 20 62 65 63 61  # revisions beca
24a0: 75 73 65 20 77 65 20 63 6c 65 61 72 65 64 20 74  use we cleared t
24b0: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78  he previously ex
24c0: 69 73 74 69 6e 67 0a 09 23 20 69 6e 66 6f 72 6d  isting..# inform
24d0: 61 74 69 6f 6e 2c 20 73 65 65 20 28 2a 29 20 61  ation, see (*) a
24e0: 62 6f 76 65 2e 20 50 65 72 73 69 73 74 65 6e 63  bove. Persistenc
24f0: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  e does not matte
2500: 72 0a 09 23 20 68 65 72 65 2c 20 6e 6f 6e 65 20  r..# here, none 
2510: 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  of the changeset
2520: 73 20 68 61 73 20 62 65 65 6e 20 73 61 76 65 64  s has been saved
2530: 20 74 6f 20 74 68 65 0a 09 23 20 70 65 72 73 69   to the..# persi
2540: 73 74 65 6e 74 20 73 74 61 74 65 20 79 65 74 2e  stent state yet.
2550: 0a 0a 09 73 65 74 20 6d 79 72 65 76 69 73 69 6f  ...set myrevisio
2560: 6e 73 20 5b 6c 72 61 6e 67 65 20 24 6d 79 72 65  ns [lrange $myre
2570: 76 69 73 69 6f 6e 73 20 30 20 24 66 69 72 73 74  visions 0 $first
2580: 65 5d 0a 09 66 6f 72 65 61 63 68 20 72 20 24 6d  e]..foreach r $m
2590: 79 72 65 76 69 73 69 6f 6e 73 20 7b 0a 09 20 20  yrevisions {..  
25a0: 20 20 73 65 74 20 6b 65 79 20 5b 6c 69 73 74 20    set key [list 
25b0: 24 6d 79 74 79 70 65 20 24 72 5d 0a 09 20 20 20  $mytype $r]..   
25c0: 20 73 65 74 20 6d 79 72 65 76 6d 61 70 28 24 6b   set myrevmap($k
25d0: 65 79 29 20 24 73 65 6c 66 0a 09 7d 0a 0a 09 72  ey) $self..}...r
25e0: 65 74 75 72 6e 20 31 0a 20 20 20 20 7d 0a 0a 20  eturn 1.    }.. 
25f0: 20 20 20 6d 65 74 68 6f 64 20 70 65 72 73 69 73     method persis
2600: 74 20 7b 7d 20 7b 0a 09 73 65 74 20 74 69 64 20  t {} {..set tid 
2610: 24 6d 79 63 73 74 79 70 65 28 24 6d 79 74 79 70  $mycstype($mytyp
2620: 65 29 0a 09 73 65 74 20 70 69 64 20 5b 24 6d 79  e)..set pid [$my
2630: 70 72 6f 6a 65 63 74 20 69 64 5d 0a 09 73 65 74  project id]..set
2640: 20 70 6f 73 20 30 0a 0a 09 73 74 61 74 65 20 74   pos 0...state t
2650: 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 09 20 20  ransaction {..  
2660: 20 20 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09    state run {...
2670: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 61 6e  INSERT INTO chan
2680: 67 65 73 65 74 20 28 63 69 64 2c 20 20 20 70 69  geset (cid,   pi
2690: 64 2c 20 20 74 79 70 65 2c 20 73 72 63 29 0a 09  d,  type, src)..
26a0: 09 56 41 4c 55 45 53 20 20 20 20 20 20 20 20 20  .VALUES         
26b0: 20 20 20 20 20 20 20 28 24 6d 79 69 64 2c 20 24         ($myid, $
26c0: 70 69 64 2c 20 24 74 69 64 2c 20 24 6d 79 73 72  pid, $tid, $mysr
26d0: 63 69 64 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  cid);..    }... 
26e0: 20 20 20 66 6f 72 65 61 63 68 20 72 69 64 20 24     foreach rid $
26f0: 6d 79 72 65 76 69 73 69 6f 6e 73 20 7b 0a 09 09  myrevisions {...
2700: 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 20 20  state run {...  
2710: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 73    INSERT INTO cs
2720: 72 65 76 69 73 69 6f 6e 20 28 63 69 64 2c 20 20  revision (cid,  
2730: 20 70 6f 73 2c 20 20 72 69 64 29 0a 09 09 20 20   pos,  rid)...  
2740: 20 20 56 41 4c 55 45 53 20 20 20 20 20 20 20 20    VALUES        
2750: 20 20 20 20 20 20 20 20 20 28 24 6d 79 69 64 2c           ($myid,
2760: 20 24 70 6f 73 2c 20 24 72 69 64 29 3b 0a 09 09   $pos, $rid);...
2770: 7d 0a 09 09 69 6e 63 72 20 70 6f 73 0a 09 20 20  }...incr pos..  
2780: 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20    }..}..return. 
2790: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64     }..    method
27a0: 20 74 69 6d 65 72 61 6e 67 65 20 7b 7d 20 7b 20   timerange {} { 
27b0: 72 65 74 75 72 6e 20 5b 24 6d 79 74 79 70 65 6f  return [$mytypeo
27c0: 62 6a 20 74 69 6d 65 72 61 6e 67 65 20 24 6d 79  bj timerange $my
27d0: 72 65 76 69 73 69 6f 6e 73 5d 20 7d 0a 0a 20 20  revisions] }..  
27e0: 20 20 6d 65 74 68 6f 64 20 64 72 6f 70 20 7b 7d    method drop {}
27f0: 20 7b 0a 09 73 74 61 74 65 20 74 72 61 6e 73 61   {..state transa
2800: 63 74 69 6f 6e 20 7b 0a 09 20 20 20 20 73 74 61  ction {..    sta
2810: 74 65 20 72 75 6e 20 7b 0a 09 09 44 45 4c 45 54  te run {...DELET
2820: 45 20 46 52 4f 4d 20 63 68 61 6e 67 65 73 65 74  E FROM changeset
2830: 20 20 57 48 45 52 45 20 63 69 64 20 3d 20 24 6d    WHERE cid = $m
2840: 79 69 64 3b 0a 09 09 44 45 4c 45 54 45 20 46 52  yid;...DELETE FR
2850: 4f 4d 20 63 73 72 65 76 69 73 69 6f 6e 20 57 48  OM csrevision WH
2860: 45 52 45 20 63 69 64 20 3d 20 24 6d 79 69 64 3b  ERE cid = $myid;
2870: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 66 6f 72 65  ..    }..}..fore
2880: 61 63 68 20 72 20 24 6d 79 72 65 76 69 73 69 6f  ach r $myrevisio
2890: 6e 73 20 7b 0a 09 20 20 20 20 73 65 74 20 6b 65  ns {..    set ke
28a0: 79 20 5b 6c 69 73 74 20 24 6d 79 74 79 70 65 20  y [list $mytype 
28b0: 24 72 5d 0a 09 20 20 20 20 75 6e 73 65 74 20 6d  $r]..    unset m
28c0: 79 72 65 76 6d 61 70 28 24 6b 65 79 29 0a 09 7d  yrevmap($key)..}
28d0: 0a 09 73 65 74 20 70 6f 73 20 20 20 20 20 20 20  ..set pos       
28e0: 20 20 20 5b 6c 73 65 61 72 63 68 20 2d 65 78 61     [lsearch -exa
28f0: 63 74 20 24 6d 79 63 68 61 6e 67 65 73 65 74 73  ct $mychangesets
2900: 20 24 73 65 6c 66 5d 0a 09 73 65 74 20 6d 79 63   $self]..set myc
2910: 68 61 6e 67 65 73 65 74 73 20 5b 6c 72 65 70 6c  hangesets [lrepl
2920: 61 63 65 20 24 6d 79 63 68 61 6e 67 65 73 65 74  ace $mychangeset
2930: 73 20 24 70 6f 73 20 24 70 6f 73 5d 0a 09 72 65  s $pos $pos]..re
2940: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
2950: 74 79 70 65 6d 65 74 68 6f 64 20 73 70 6c 69 74  typemethod split
2960: 20 7b 63 73 65 74 20 61 72 67 73 7d 20 7b 0a 09   {cset args} {..
2970: 23 20 41 73 20 70 61 72 74 20 6f 66 20 74 68 65  # As part of the
2980: 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65   creation of the
2990: 20 6e 65 77 20 63 68 61 6e 67 65 73 65 74 73 20   new changesets 
29a0: 73 70 65 63 69 66 69 65 64 20 69 6e 0a 09 23 20  specified in..# 
29b0: 41 52 47 53 20 61 73 20 73 65 74 73 20 6f 66 20  ARGS as sets of 
29c0: 72 65 76 69 73 69 6f 6e 73 2c 20 61 6c 6c 20 73  revisions, all s
29d0: 75 62 73 65 74 73 20 6f 66 20 43 53 45 54 27 73  ubsets of CSET's
29e0: 20 72 65 76 69 73 69 6f 6e 0a 09 23 20 73 65 74   revision..# set
29f0: 2c 20 43 53 45 54 20 77 69 6c 6c 20 62 65 20 64  , CSET will be d
2a00: 72 6f 70 70 65 64 20 66 72 6f 6d 20 61 6c 6c 20  ropped from all 
2a10: 64 61 74 61 62 61 73 65 73 2c 20 69 6e 20 61 6e  databases, in an
2a20: 64 20 6f 75 74 20 6f 66 0a 09 23 20 6d 65 6d 6f  d out of..# memo
2a30: 72 79 2c 20 61 6e 64 20 74 68 65 6e 20 64 65 73  ry, and then des
2a40: 74 72 6f 79 65 64 2e 0a 09 23 0a 09 23 20 4e 6f  troyed...#..# No
2a50: 74 65 3a 20 54 68 65 20 69 74 65 6d 20 6c 69 73  te: The item lis
2a60: 74 73 20 66 6f 75 6e 64 20 69 6e 20 61 72 67 73  ts found in args
2a70: 20 61 72 65 20 74 61 67 67 65 64 20 69 74 65 6d   are tagged item
2a80: 73 2e 20 54 68 65 79 0a 09 23 20 68 61 76 65 20  s. They..# have 
2a90: 74 6f 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  to have the same
2aa0: 20 74 79 70 65 20 61 73 20 74 68 65 20 63 68 61   type as the cha
2ab0: 6e 67 65 73 65 74 2c 20 62 65 69 6e 67 20 73 75  ngeset, being su
2ac0: 62 73 65 74 73 0a 09 23 20 6f 66 20 69 74 73 20  bsets..# of its 
2ad0: 69 74 65 6d 73 2e 20 54 68 69 73 20 69 73 20 63  items. This is c
2ae0: 68 65 63 6b 65 64 20 69 6e 20 55 6e 74 61 67 31  hecked in Untag1
2af0: 2e 0a 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74  ....struct::list
2b00: 20 61 73 73 69 67 6e 20 5b 24 63 73 65 74 20 64   assign [$cset d
2b10: 61 74 61 5d 20 70 72 6f 6a 65 63 74 20 63 73 74  ata] project cst
2b20: 79 70 65 20 63 73 73 72 63 0a 0a 09 24 63 73 65  ype cssrc...$cse
2b30: 74 20 64 72 6f 70 0a 09 24 63 73 65 74 20 64 65  t drop..$cset de
2b40: 73 74 72 6f 79 0a 0a 09 73 65 74 20 6e 65 77 63  stroy...set newc
2b50: 73 65 74 73 20 7b 7d 0a 09 66 6f 72 65 61 63 68  sets {}..foreach
2b60: 20 66 72 61 67 6d 65 6e 74 72 65 76 69 73 69 6f   fragmentrevisio
2b70: 6e 73 20 24 61 72 67 73 20 7b 0a 09 20 20 20 20  ns $args {..    
2b80: 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74  integrity assert
2b90: 20 7b 0a 09 09 5b 6c 6c 65 6e 67 74 68 20 24 66   {...[llength $f
2ba0: 72 61 67 6d 65 6e 74 72 65 76 69 73 69 6f 6e 73  ragmentrevisions
2bb0: 5d 0a 09 20 20 20 20 7d 20 7b 41 74 74 65 6d 70  ]..    } {Attemp
2bc0: 74 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 6e  ted to create an
2bd0: 20 65 6d 70 74 79 20 63 68 61 6e 67 65 73 65 74   empty changeset
2be0: 2c 20 69 2e 65 2e 20 77 69 74 68 6f 75 74 20 72  , i.e. without r
2bf0: 65 76 69 73 69 6f 6e 73 7d 0a 09 20 20 20 20 6c  evisions}..    l
2c00: 61 70 70 65 6e 64 20 6e 65 77 63 73 65 74 73 20  append newcsets 
2c10: 5b 24 74 79 70 65 20 25 41 55 54 4f 25 20 24 70  [$type %AUTO% $p
2c20: 72 6f 6a 65 63 74 20 24 63 73 74 79 70 65 20 24  roject $cstype $
2c30: 63 73 73 72 63 20 5c 0a 09 09 09 09 20 20 5b 55  cssrc \.....  [U
2c40: 6e 74 61 67 20 24 66 72 61 67 6d 65 6e 74 72 65  ntag $fragmentre
2c50: 76 69 73 69 6f 6e 73 20 24 63 73 74 79 70 65 5d  visions $cstype]
2c60: 5d 0a 09 7d 0a 0a 09 66 6f 72 65 61 63 68 20 63  ]..}...foreach c
2c70: 20 24 6e 65 77 63 73 65 74 73 20 7b 20 24 63 20   $newcsets { $c 
2c80: 70 65 72 73 69 73 74 20 7d 0a 09 72 65 74 75 72  persist }..retur
2c90: 6e 20 24 6e 65 77 63 73 65 74 73 0a 20 20 20 20  n $newcsets.    
2ca0: 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  }..    typemetho
2cb0: 64 20 73 74 72 6c 69 73 74 20 7b 63 68 61 6e 67  d strlist {chang
2cc0: 65 73 65 74 73 7d 20 7b 0a 09 72 65 74 75 72 6e  esets} {..return
2cd0: 20 5b 6a 6f 69 6e 20 5b 73 74 72 75 63 74 3a 3a   [join [struct::
2ce0: 6c 69 73 74 20 6d 61 70 20 24 63 68 61 6e 67 65  list map $change
2cf0: 73 65 74 73 20 5b 6d 79 70 72 6f 63 20 49 44 5d  sets [myproc ID]
2d00: 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72  ]].    }..    pr
2d10: 6f 63 20 49 44 20 7b 63 73 65 74 7d 20 7b 20 24  oc ID {cset} { $
2d20: 63 73 65 74 20 73 74 72 20 7d 0a 0a 20 20 20 20  cset str }..    
2d30: 70 72 6f 63 20 55 6e 74 61 67 20 7b 74 61 67 67  proc Untag {tagg
2d40: 65 64 69 74 65 6d 73 20 63 73 74 79 70 65 7d 20  editems cstype} 
2d50: 7b 0a 09 72 65 74 75 72 6e 20 5b 73 74 72 75 63  {..return [struc
2d60: 74 3a 3a 6c 69 73 74 20 6d 61 70 20 24 74 61 67  t::list map $tag
2d70: 67 65 64 69 74 65 6d 73 20 5b 6d 79 70 72 6f 63  geditems [myproc
2d80: 20 55 6e 74 61 67 31 20 24 63 73 74 79 70 65 5d   Untag1 $cstype]
2d90: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f  ].    }..    pro
2da0: 63 20 55 6e 74 61 67 31 20 7b 63 73 74 79 70 65  c Untag1 {cstype
2db0: 20 74 68 65 69 74 65 6d 7d 20 7b 0a 09 73 74 72   theitem} {..str
2dc0: 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e  uct::list assign
2dd0: 20 24 74 68 65 69 74 65 6d 20 74 20 69 0a 09 69   $theitem t i..i
2de0: 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20  ntegrity assert 
2df0: 7b 24 63 73 74 79 70 65 20 65 71 20 24 74 7d 20  {$cstype eq $t} 
2e00: 7b 49 74 65 6d 20 24 69 27 73 20 74 79 70 65 20  {Item $i's type 
2e10: 69 73 20 27 24 74 27 2c 20 65 78 70 65 63 74 65  is '$t', expecte
2e20: 64 20 27 24 63 73 74 79 70 65 27 7d 0a 09 72 65  d '$cstype'}..re
2e30: 74 75 72 6e 20 24 69 0a 20 20 20 20 7d 0a 0a 20  turn $i.    }.. 
2e40: 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23     # # ## ### ##
2e50: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23  ### ######## ###
2e60: 23 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 23  ##########.    #
2e70: 23 20 53 74 61 74 65 0a 0a 20 20 20 20 76 61 72  # State..    var
2e80: 69 61 62 6c 65 20 6d 79 69 64 20 20 20 20 20 20  iable myid      
2e90: 20 20 7b 7d 20 3b 20 23 20 49 64 20 6f 66 20 74    {} ; # Id of t
2ea0: 68 65 20 63 73 65 74 20 66 6f 72 20 74 68 65 20  he cset for the 
2eb0: 70 65 72 73 69 73 74 65 6e 74 0a 09 09 09 20 20  persistent....  
2ec0: 20 20 20 20 23 20 73 74 61 74 65 2e 0a 20 20 20      # state..   
2ed0: 20 76 61 72 69 61 62 6c 65 20 6d 79 70 72 6f 6a   variable myproj
2ee0: 65 63 74 20 20 20 7b 7d 20 3b 20 23 20 52 65 66  ect   {} ; # Ref
2ef0: 65 72 65 6e 63 65 20 6f 66 20 74 68 65 20 70 72  erence of the pr
2f00: 6f 6a 65 63 74 20 6f 62 6a 65 63 74 20 74 68 65  oject object the
2f10: 0a 09 09 09 20 20 20 20 20 20 23 20 63 68 61 6e  ....      # chan
2f20: 67 65 73 65 74 20 62 65 6c 6f 6e 67 73 20 74 6f  geset belongs to
2f30: 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d  ..    variable m
2f40: 79 74 79 70 65 20 20 20 20 20 20 7b 7d 20 3b 20  ytype      {} ; 
2f50: 23 20 57 68 61 74 20 74 68 65 20 63 68 61 6e 67  # What the chang
2f60: 65 73 65 74 20 69 73 20 62 61 73 65 64 20 6f 6e  eset is based on
2f70: 0a 09 09 09 20 20 20 20 20 20 23 20 28 72 65 76  ....      # (rev
2f80: 69 73 69 6f 6e 73 2c 20 74 61 67 73 2c 20 6f 72  isions, tags, or
2f90: 20 62 72 61 6e 63 68 65 73 29 2e 0a 09 09 09 20   branches)..... 
2fa0: 20 20 20 20 20 23 20 56 61 6c 75 65 73 3a 20 53       # Values: S
2fb0: 65 65 20 6d 79 63 73 74 79 70 65 2e 20 4e 6f 74  ee mycstype. Not
2fc0: 65 20 74 68 61 74 20 77 65 0a 09 09 09 20 20 20  e that we....   
2fd0: 20 20 20 23 20 68 61 76 65 20 74 6f 20 6b 65 65     # have to kee
2fe0: 70 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74  p the names of t
2ff0: 68 65 20 68 65 6c 70 65 72 0a 09 09 09 20 20 20  he helper....   
3000: 20 20 20 23 20 73 69 6e 67 6c 65 74 6f 6e 73 20     # singletons 
3010: 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65  in sync with the
3020: 20 63 6f 6e 74 65 6e 74 73 0a 09 09 09 20 20 20   contents....   
3030: 20 20 20 23 20 6f 66 20 73 74 61 74 65 20 74 61     # of state ta
3040: 62 6c 65 20 27 63 73 74 79 70 65 27 2c 20 61 6e  ble 'cstype', an
3050: 64 20 76 61 72 69 6f 75 73 0a 09 09 09 20 20 20  d various....   
3060: 20 20 20 23 20 6f 74 68 65 72 20 70 6c 61 63 65     # other place
3070: 73 20 75 73 69 6e 67 20 74 68 65 6d 20 68 61 72  s using them har
3080: 64 77 69 72 65 64 2e 0a 20 20 20 20 76 61 72 69  dwired..    vari
3090: 61 62 6c 65 20 6d 79 74 79 70 65 6f 62 6a 20 20  able mytypeobj  
30a0: 20 7b 7d 20 3b 20 23 20 52 65 66 65 72 65 6e 63   {} ; # Referenc
30b0: 65 20 74 6f 20 74 68 65 20 63 6f 6e 74 61 69 6e  e to the contain
30c0: 65 72 20 66 6f 72 20 74 68 65 0a 09 09 09 20 20  er for the....  
30d0: 20 20 20 20 23 20 74 79 70 65 20 64 65 70 65 6e      # type depen
30e0: 64 65 6e 74 20 63 6f 64 65 2e 20 44 65 72 69 76  dent code. Deriv
30f0: 65 64 20 66 72 6f 6d 0a 09 09 09 20 20 20 20 20  ed from....     
3100: 20 23 20 6d 79 74 79 70 65 2e 0a 20 20 20 20 76   # mytype..    v
3110: 61 72 69 61 62 6c 65 20 6d 79 73 72 63 69 64 20  ariable mysrcid 
3120: 20 20 20 20 7b 7d 20 3b 20 23 20 49 64 20 6f 66      {} ; # Id of
3130: 20 74 68 65 20 6d 65 74 61 64 61 74 61 20 6f 72   the metadata or
3140: 20 73 79 6d 62 6f 6c 20 74 68 65 20 63 73 65 74   symbol the cset
3150: 0a 09 09 09 20 20 20 20 20 20 23 20 69 73 20 62  ....      # is b
3160: 61 73 65 64 20 6f 6e 2e 0a 20 20 20 20 76 61 72  ased on..    var
3170: 69 61 62 6c 65 20 6d 79 72 65 76 69 73 69 6f 6e  iable myrevision
3180: 73 20 7b 7d 20 3b 20 23 20 4c 69 73 74 20 6f 66  s {} ; # List of
3190: 20 74 68 65 20 66 69 6c 65 20 6c 65 76 65 6c 20   the file level 
31a0: 72 65 76 69 73 69 6f 6e 73 2c 0a 09 09 09 20 20  revisions,....  
31b0: 20 20 20 20 23 20 74 61 67 73 2c 20 6f 72 20 62      # tags, or b
31c0: 72 61 6e 63 68 65 73 20 69 6e 20 74 68 65 20 63  ranches in the c
31d0: 73 65 74 2c 20 61 73 0a 09 09 09 20 20 20 20 20  set, as....     
31e0: 20 23 20 69 64 73 2e 20 4e 6f 74 20 74 61 67 67   # ids. Not tagg
31f0: 65 64 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65  ed..    variable
3200: 20 6d 79 74 69 74 65 6d 73 20 20 20 20 7b 7d 20   mytitems    {} 
3210: 3b 20 23 20 41 73 20 6d 79 72 65 76 69 73 69 6f  ; # As myrevisio
3220: 6e 73 2c 20 74 68 65 20 74 61 67 67 65 64 20 66  ns, the tagged f
3230: 6f 72 6d 2e 0a 20 20 20 20 76 61 72 69 61 62 6c  orm..    variabl
3240: 65 20 6d 79 70 72 65 6d 61 70 20 20 20 20 7b 7d  e mypremap    {}
3250: 20 3b 20 23 20 44 69 63 74 69 6f 6e 61 72 79 20   ; # Dictionary 
3260: 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65  mapping from the
3270: 20 69 74 65 6d 73 20 28 74 61 67 67 65 64 20 6e   items (tagged n
3280: 6f 77 29 0a 09 09 09 20 20 20 20 20 20 23 20 74  ow)....      # t
3290: 6f 20 74 68 65 69 72 20 70 72 65 64 65 63 65 73  o their predeces
32a0: 73 6f 72 73 2c 20 61 6c 73 6f 20 74 61 67 67 65  sors, also tagge
32b0: 64 2e 20 41 0a 09 09 09 20 20 20 20 20 20 23 20  d. A....      # 
32c0: 63 61 63 68 65 20 74 6f 20 61 76 6f 69 64 20 6c  cache to avoid l
32d0: 6f 61 64 69 6e 67 20 74 68 69 73 20 66 72 6f 6d  oading this from
32e0: 20 74 68 65 0a 09 09 09 20 20 20 20 20 20 23 20   the....      # 
32f0: 73 74 61 74 65 20 6d 6f 72 65 20 74 68 61 6e 20  state more than 
3300: 6f 6e 63 65 2e 0a 20 20 20 20 76 61 72 69 61 62  once..    variab
3310: 6c 65 20 6d 79 6e 65 78 74 6d 61 70 20 20 20 7b  le mynextmap   {
3320: 7d 20 3b 20 23 20 44 69 63 74 69 6f 6e 61 72 79  } ; # Dictionary
3330: 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68   mapping from th
3340: 65 20 69 74 65 6d 73 20 28 74 61 67 67 65 64 29  e items (tagged)
3350: 0a 09 09 09 20 20 20 20 20 20 23 20 74 6f 20 74  ....      # to t
3360: 68 65 69 72 20 73 75 63 63 65 73 73 6f 72 73 20  heir successors 
3370: 28 61 6c 73 6f 20 74 61 67 67 65 64 29 2e 20 41  (also tagged). A
3380: 0a 09 09 09 20 20 20 20 20 20 23 20 63 61 63 68  ....      # cach
3390: 65 20 74 6f 20 61 76 6f 69 64 20 6c 6f 61 64 69  e to avoid loadi
33a0: 6e 67 20 74 68 69 73 20 66 72 6f 6d 20 74 68 65  ng this from the
33b0: 0a 09 09 09 20 20 20 20 20 20 23 20 73 74 61 74  ....      # stat
33c0: 65 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  e more than once
33d0: 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d  ..    variable m
33e0: 79 70 6f 73 20 20 20 20 20 20 20 7b 7d 20 3b 20  ypos       {} ; 
33f0: 23 20 43 6f 6d 6d 69 74 20 70 6f 73 69 74 69 6f  # Commit positio
3400: 6e 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73  n of the changes
3410: 65 74 2c 20 69 66 0a 09 09 09 20 20 20 20 20 20  et, if....      
3420: 23 20 6b 6e 6f 77 6e 2e 0a 0a 20 20 20 20 23 20  # known...    # 
3430: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23  # ## ### ##### #
3440: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
3450: 23 23 23 23 23 0a 20 20 20 20 23 23 20 49 6e 74  #####.    ## Int
3460: 65 72 6e 61 6c 20 6d 65 74 68 6f 64 73 0a 0a 20  ernal methods.. 
3470: 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20     typevariable 
3480: 6d 79 63 6f 75 6e 74 65 72 20 20 20 20 20 20 20  mycounter       
3490: 20 30 20 3b 20 23 20 49 64 20 63 6f 75 6e 74 65   0 ; # Id counte
34a0: 72 20 66 6f 72 20 63 73 65 74 73 2e 20 4c 61 73  r for csets. Las
34b0: 74 20 69 64 0a 09 09 09 09 20 20 20 20 20 20 23  t id.....      #
34c0: 20 75 73 65 64 2e 0a 20 20 20 20 74 79 70 65 76   used..    typev
34d0: 61 72 69 61 62 6c 65 20 6d 79 63 73 74 79 70 65  ariable mycstype
34e0: 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d   -array {} ; # M
34f0: 61 70 20 63 73 74 79 70 65 73 20 28 6e 61 6d 65  ap cstypes (name
3500: 73 29 20 74 6f 20 70 65 72 73 69 73 74 65 6e 74  s) to persistent
3510: 0a 09 09 09 09 20 20 20 20 20 20 23 20 69 64 73  .....      # ids
3520: 2e 20 4e 6f 74 65 20 74 68 61 74 20 77 65 20 68  . Note that we h
3530: 61 76 65 20 74 6f 20 6b 65 65 70 0a 09 09 09 09  ave to keep.....
3540: 20 20 20 20 20 20 23 20 74 68 65 20 6e 61 6d 65        # the name
3550: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 27  s in the table '
3560: 63 73 74 79 70 65 27 0a 09 09 09 09 20 20 20 20  cstype'.....    
3570: 20 20 23 20 69 6e 20 73 79 6e 63 20 77 69 74 68    # in sync with
3580: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
3590: 65 0a 09 09 09 09 20 20 20 20 20 20 23 20 68 65  e.....      # he
35a0: 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 73 2e  lper singletons.
35b0: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ..    typemethod
35c0: 20 67 65 74 63 73 74 79 70 65 73 20 7b 7d 20 7b   getcstypes {} {
35d0: 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 6e  ..foreach {tid n
35e0: 61 6d 65 7d 20 5b 73 74 61 74 65 20 72 75 6e 20  ame} [state run 
35f0: 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 74 69  {..    SELECT ti
3600: 64 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 63 73 74  d, name FROM cst
3610: 79 70 65 3b 0a 09 7d 5d 20 7b 20 73 65 74 20 6d  ype;..}] { set m
3620: 79 63 73 74 79 70 65 28 24 6e 61 6d 65 29 20 24  ycstype($name) $
3630: 74 69 64 20 7d 0a 09 72 65 74 75 72 6e 0a 20 20  tid }..return.  
3640: 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74    }..    typemet
3650: 68 6f 64 20 6c 6f 61 64 63 6f 75 6e 74 65 72 20  hod loadcounter 
3660: 7b 7d 20 7b 0a 09 23 20 49 6e 69 74 69 61 6c 69  {} {..# Initiali
3670: 7a 65 20 74 68 65 20 63 6f 75 6e 74 65 72 20 66  ze the counter f
3680: 72 6f 6d 20 74 68 65 20 73 74 61 74 65 0a 09 73  rom the state..s
3690: 65 74 20 6d 79 63 6f 75 6e 74 65 72 20 5b 73 74  et mycounter [st
36a0: 61 74 65 20 6f 6e 65 20 7b 20 53 45 4c 45 43 54  ate one { SELECT
36b0: 20 4d 41 58 28 63 69 64 29 20 46 52 4f 4d 20 63   MAX(cid) FROM c
36c0: 68 61 6e 67 65 73 65 74 20 7d 5d 0a 09 72 65 74  hangeset }]..ret
36d0: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  urn.    }..    t
36e0: 79 70 65 6d 65 74 68 6f 64 20 6e 75 6d 20 7b 7d  ypemethod num {}
36f0: 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 63 6f 75   { return $mycou
3700: 6e 74 65 72 20 7d 0a 0a 20 20 20 20 70 72 6f 63  nter }..    proc
3710: 20 49 6e 69 74 69 61 6c 69 7a 65 42 72 65 61 6b   InitializeBreak
3720: 53 74 61 74 65 20 7b 72 65 76 69 73 69 6f 6e 73  State {revisions
3730: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 70 6f 73  } {..upvar 1 pos
3740: 20 70 6f 73 20 63 72 6f 73 73 20 63 72 6f 73 73   pos cross cross
3750: 20 72 61 6e 67 65 20 72 61 6e 67 65 20 64 65 70   range range dep
3760: 63 20 64 65 70 63 20 64 65 6c 74 61 20 64 65 6c  c depc delta del
3770: 74 61 20 5c 0a 09 20 20 20 20 64 65 70 65 6e 64  ta \..    depend
3780: 65 6e 63 69 65 73 20 64 65 70 65 6e 64 65 6e 63  encies dependenc
3790: 69 65 73 0a 0a 09 23 20 46 69 72 73 74 20 77 65  ies...# First we
37a0: 20 63 72 65 61 74 65 20 61 20 6d 61 70 20 6f 66   create a map of
37b0: 20 70 6f 73 69 74 69 6f 6e 73 20 74 6f 20 6d 61   positions to ma
37c0: 6b 65 20 69 74 20 65 61 73 69 65 72 20 74 6f 0a  ke it easier to.
37d0: 09 23 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  .# determine whe
37e0: 74 68 65 72 20 61 20 64 65 70 65 6e 64 65 6e 63  ther a dependenc
37f0: 79 20 63 72 6f 73 73 65 73 20 61 20 70 61 72 74  y crosses a part
3800: 69 63 75 6c 61 72 20 69 6e 64 65 78 2e 0a 0a 09  icular index....
3810: 61 72 72 61 79 20 73 65 74 20 70 6f 73 20 20 20  array set pos   
3820: 7b 7d 0a 09 61 72 72 61 79 20 73 65 74 20 63 72  {}..array set cr
3830: 6f 73 73 20 7b 7d 0a 09 61 72 72 61 79 20 73 65  oss {}..array se
3840: 74 20 64 65 70 63 20 20 7b 7d 0a 09 73 65 74 20  t depc  {}..set 
3850: 72 61 6e 67 65 20 20 20 20 20 20 20 7b 7d 0a 09  range       {}..
3860: 73 65 74 20 6e 20 30 0a 09 66 6f 72 65 61 63 68  set n 0..foreach
3870: 20 72 65 76 20 24 72 65 76 69 73 69 6f 6e 73 20   rev $revisions 
3880: 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 72  {..    lappend r
3890: 61 6e 67 65 20 24 6e 0a 09 20 20 20 20 73 65 74  ange $n..    set
38a0: 20 70 6f 73 28 24 72 65 76 29 20 24 6e 0a 09 20   pos($rev) $n.. 
38b0: 20 20 20 73 65 74 20 63 72 6f 73 73 28 24 6e 29     set cross($n)
38c0: 20 30 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09   0..    incr n..
38d0: 7d 0a 0a 09 23 20 53 65 63 6f 6e 64 6c 79 20 77  }...# Secondly w
38e0: 65 20 63 6f 75 6e 74 20 74 68 65 20 63 72 6f 73  e count the cros
38f0: 73 69 6e 67 73 20 70 65 72 20 70 6f 73 69 74 69  sings per positi
3900: 6f 6e 2c 20 62 79 20 69 74 65 72 61 74 69 6e 67  on, by iterating
3910: 0a 09 23 20 6f 76 65 72 20 74 68 65 20 72 65 63  ..# over the rec
3920: 6f 72 64 65 64 20 69 6e 74 65 72 6e 61 6c 20 64  orded internal d
3930: 65 70 65 6e 64 65 6e 63 69 65 73 2e 0a 0a 09 23  ependencies....#
3940: 20 4e 6f 74 65 3a 20 49 66 20 74 68 65 20 74 69   Note: If the ti
3950: 6d 65 73 74 61 6d 70 73 20 61 72 65 20 62 61 64  mestamps are bad
3960: 6c 79 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 20  ly out of order 
3970: 69 74 20 69 73 0a 09 23 20 20 20 20 20 20 20 70  it is..#       p
3980: 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20  ossible to have 
3990: 61 20 62 61 63 6b 77 61 72 64 20 73 75 63 63 65  a backward succe
39a0: 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 79 2c  ssor dependency,
39b0: 0a 09 23 20 20 20 20 20 20 20 69 2e 65 2e 20 77  ..#       i.e. w
39c0: 69 74 68 20 73 74 61 72 74 20 3e 20 65 6e 64 2e  ith start > end.
39d0: 20 57 65 20 6d 61 79 20 68 61 76 65 20 74 6f 20   We may have to 
39e0: 73 77 61 70 20 74 68 65 20 69 6e 64 69 63 65 73  swap the indices
39f0: 0a 09 23 20 20 20 20 20 20 20 74 6f 20 65 6e 73  ..#       to ens
3a00: 75 72 65 20 74 68 61 74 20 74 68 65 20 66 6f 6c  ure that the fol
3a10: 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73  lowing loop runs
3a20: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 09 23 0a 09   correctly...#..
3a30: 23 20 4e 6f 74 65 20 32 3a 20 73 74 61 72 74 20  # Note 2: start 
3a40: 3d 3d 20 65 6e 64 20 69 73 20 6e 6f 74 20 70 6f  == end is not po
3a50: 73 73 69 62 6c 65 2e 20 49 74 20 69 6e 64 69 63  ssible. It indic
3a60: 61 74 65 73 20 61 0a 09 23 20 20 20 20 20 20 20  ates a..#       
3a70: 20 20 73 65 6c 66 2d 64 65 70 65 6e 64 65 6e 63    self-dependenc
3a80: 79 20 64 75 65 20 74 6f 20 74 68 65 20 75 6e 69  y due to the uni
3a90: 71 75 65 6e 65 73 73 20 6f 66 20 70 6f 73 69 74  queness of posit
3aa0: 69 6f 6e 73 2c 0a 09 23 20 20 20 20 20 20 20 20  ions,..#        
3ab0: 20 61 6e 64 20 74 68 61 74 20 69 73 20 73 6f 6d   and that is som
3ac0: 65 74 68 69 6e 67 20 77 65 20 68 61 76 65 20 72  ething we have r
3ad0: 75 6c 65 64 20 6f 75 74 20 61 6c 72 65 61 64 79  uled out already
3ae0: 2c 20 73 65 65 0a 09 23 20 20 20 20 20 20 20 20  , see..#        
3af0: 20 27 72 65 76 20 69 6e 74 65 72 6e 61 6c 73 75   'rev internalsu
3b00: 63 63 65 73 73 6f 72 73 27 2e 0a 0a 09 66 6f 72  ccessors'....for
3b10: 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 72  each {rid childr
3b20: 65 6e 7d 20 5b 61 72 72 61 79 20 67 65 74 20 64  en} [array get d
3b30: 65 70 65 6e 64 65 6e 63 69 65 73 5d 20 7b 0a 09  ependencies] {..
3b40: 20 20 20 20 66 6f 72 65 61 63 68 20 63 68 69 6c      foreach chil
3b50: 64 20 24 63 68 69 6c 64 72 65 6e 20 7b 0a 09 09  d $children {...
3b60: 73 65 74 20 64 6b 65 79 20 20 20 20 5b 6c 69 73  set dkey    [lis
3b70: 74 20 24 72 69 64 20 24 63 68 69 6c 64 5d 0a 09  t $rid $child]..
3b80: 09 73 65 74 20 73 74 61 72 74 20 20 20 24 70 6f  .set start   $po
3b90: 73 28 24 72 69 64 29 0a 09 09 73 65 74 20 65 6e  s($rid)...set en
3ba0: 64 20 20 20 20 20 24 70 6f 73 28 24 63 68 69 6c  d     $pos($chil
3bb0: 64 29 0a 09 09 73 65 74 20 63 72 6f 73 73 65 73  d)...set crosses
3bc0: 20 7b 7d 0a 0a 09 09 69 66 20 7b 24 73 74 61 72   {}....if {$star
3bd0: 74 20 3e 20 24 65 6e 64 7d 20 7b 0a 09 09 20 20  t > $end} {...  
3be0: 20 20 77 68 69 6c 65 20 7b 24 65 6e 64 20 3c 20    while {$end < 
3bf0: 24 73 74 61 72 74 7d 20 7b 0a 09 09 09 6c 61 70  $start} {....lap
3c00: 70 65 6e 64 20 63 72 6f 73 73 65 73 20 24 65 6e  pend crosses $en
3c10: 64 0a 09 09 09 69 6e 63 72 20 63 72 6f 73 73 28  d....incr cross(
3c20: 24 65 6e 64 29 0a 09 09 09 69 6e 63 72 20 65 6e  $end)....incr en
3c30: 64 0a 09 09 20 20 20 20 7d 0a 09 09 7d 20 65 6c  d...    }...} el
3c40: 73 65 20 7b 0a 09 09 20 20 20 20 77 68 69 6c 65  se {...    while
3c50: 20 7b 24 73 74 61 72 74 20 3c 20 24 65 6e 64 7d   {$start < $end}
3c60: 20 7b 0a 09 09 09 6c 61 70 70 65 6e 64 20 63 72   {....lappend cr
3c70: 6f 73 73 65 73 20 24 73 74 61 72 74 0a 09 09 09  osses $start....
3c80: 69 6e 63 72 20 63 72 6f 73 73 28 24 73 74 61 72  incr cross($star
3c90: 74 29 0a 09 09 09 69 6e 63 72 20 73 74 61 72 74  t)....incr start
3ca0: 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 09 73  ...    }...}...s
3cb0: 65 74 20 64 65 70 63 28 24 64 6b 65 79 29 20 24  et depc($dkey) $
3cc0: 63 72 6f 73 73 65 73 0a 09 20 20 20 20 7d 0a 09  crosses..    }..
3cd0: 7d 0a 0a 09 49 6e 69 74 69 61 6c 69 7a 65 44 65  }...InitializeDe
3ce0: 6c 74 61 73 20 24 72 65 76 69 73 69 6f 6e 73 0a  ltas $revisions.
3cf0: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
3d00: 20 20 20 70 72 6f 63 20 49 6e 69 74 69 61 6c 69     proc Initiali
3d10: 7a 65 44 65 6c 74 61 73 20 7b 72 65 76 69 73 69  zeDeltas {revisi
3d20: 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20  ons} {..upvar 1 
3d30: 64 65 6c 74 61 20 64 65 6c 74 61 0a 0a 09 23 20  delta delta...# 
3d40: 50 75 6c 6c 20 74 68 65 20 74 69 6d 65 73 74 61  Pull the timesta
3d50: 6d 70 73 20 66 6f 72 20 61 6c 6c 20 72 65 76 69  mps for all revi
3d60: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 63 68 61  sions in the cha
3d70: 6e 67 65 73 65 74 73 20 61 6e 64 0a 09 23 20 63  ngesets and..# c
3d80: 6f 6d 70 75 74 65 20 74 68 65 69 72 20 64 65 6c  ompute their del
3d90: 74 61 73 20 66 6f 72 20 75 73 65 20 62 79 20 74  tas for use by t
3da0: 68 65 20 62 72 65 61 6b 20 66 69 6e 64 65 72 2e  he break finder.
3db0: 0a 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 6c  ...array set del
3dc0: 74 61 20 7b 7d 0a 09 61 72 72 61 79 20 73 65 74  ta {}..array set
3dd0: 20 73 74 61 6d 70 20 7b 7d 0a 0a 09 73 65 74 20   stamp {}...set 
3de0: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24  theset ('[join $
3df0: 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d  revisions {','}]
3e00: 27 29 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64  ')..foreach {rid
3e10: 20 74 69 6d 65 7d 20 5b 73 74 61 74 65 20 72 75   time} [state ru
3e20: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20  n "..    SELECT 
3e30: 52 2e 72 69 64 2c 20 52 2e 64 61 74 65 0a 09 20  R.rid, R.date.. 
3e40: 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e     FROM revision
3e50: 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e   R..    WHERE R.
3e60: 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09  rid IN $theset..
3e70: 22 5d 20 7b 0a 09 20 20 20 20 73 65 74 20 73 74  "] {..    set st
3e80: 61 6d 70 28 24 72 69 64 29 20 24 74 69 6d 65 0a  amp($rid) $time.
3e90: 09 7d 0a 0a 09 73 65 74 20 6e 20 30 0a 09 66 6f  .}...set n 0..fo
3ea0: 72 65 61 63 68 20 72 69 64 20 5b 6c 72 61 6e 67  reach rid [lrang
3eb0: 65 20 24 72 65 76 69 73 69 6f 6e 73 20 30 20 65  e $revisions 0 e
3ec0: 6e 64 2d 31 5d 20 72 6e 65 78 74 20 5b 6c 72 61  nd-1] rnext [lra
3ed0: 6e 67 65 20 24 72 65 76 69 73 69 6f 6e 73 20 31  nge $revisions 1
3ee0: 20 65 6e 64 5d 20 7b 0a 09 20 20 20 20 73 65 74   end] {..    set
3ef0: 20 64 65 6c 74 61 28 24 6e 29 20 5b 65 78 70 72   delta($n) [expr
3f00: 20 7b 24 73 74 61 6d 70 28 24 72 6e 65 78 74 29   {$stamp($rnext)
3f10: 20 2d 20 24 73 74 61 6d 70 28 24 72 69 64 29 7d   - $stamp($rid)}
3f20: 5d 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d  ]..    incr n..}
3f30: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
3f40: 20 20 20 20 70 72 6f 63 20 46 69 6e 64 42 65 73      proc FindBes
3f50: 74 42 72 65 61 6b 20 7b 72 61 6e 67 65 7d 20 7b  tBreak {range} {
3f60: 0a 09 75 70 76 61 72 20 31 20 63 72 6f 73 73 20  ..upvar 1 cross 
3f70: 63 72 6f 73 73 20 64 65 6c 74 61 20 64 65 6c 74  cross delta delt
3f80: 61 0a 0a 09 23 20 44 65 74 65 72 6d 69 6e 65 20  a...# Determine 
3f90: 74 68 65 20 62 65 73 74 20 62 72 65 61 6b 20 6c  the best break l
3fa0: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 67  ocation in the g
3fb0: 69 76 65 6e 20 72 61 6e 67 65 20 6f 66 0a 09 23  iven range of..#
3fc0: 20 70 6f 73 69 74 69 6f 6e 73 2e 20 46 69 72 73   positions. Firs
3fd0: 74 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 68  t we look for th
3fe0: 65 20 6c 6f 63 61 74 69 6f 6e 73 20 77 69 74 68  e locations with
3ff0: 20 74 68 65 20 6d 61 78 69 6d 61 6c 0a 09 23 20   the maximal..# 
4000: 6e 75 6d 62 65 72 20 6f 66 20 63 72 6f 73 73 69  number of crossi
4010: 6e 67 73 2e 20 49 66 20 74 68 65 72 65 20 61 72  ngs. If there ar
4020: 65 20 73 65 76 65 72 61 6c 20 77 65 20 6c 6f 6f  e several we loo
4030: 6b 20 66 6f 72 20 74 68 65 0a 09 23 20 73 68 6f  k for the..# sho
4040: 72 74 65 73 74 20 74 69 6d 65 20 69 6e 74 65 72  rtest time inter
4050: 76 61 6c 20 61 6d 6f 6e 67 20 74 68 65 6d 2e 20  val among them. 
4060: 49 66 20 77 65 20 73 74 69 6c 6c 20 68 61 76 65  If we still have
4070: 20 6d 75 6c 74 69 70 6c 65 0a 09 23 20 70 6f 73   multiple..# pos
4080: 73 69 62 69 6c 69 74 69 65 73 20 61 66 74 65 72  sibilities after
4090: 20 74 68 61 74 20 77 65 20 73 65 6c 65 63 74 20   that we select 
40a0: 74 68 65 20 65 61 72 6c 69 65 73 74 20 6c 6f 63  the earliest loc
40b0: 61 74 69 6f 6e 0a 09 23 20 61 6d 6f 6e 67 20 74  ation..# among t
40c0: 68 65 73 65 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20  hese....# Note: 
40d0: 49 66 20 74 68 65 20 6d 61 78 69 6d 61 6c 20 6e  If the maximal n
40e0: 75 6d 62 65 72 20 6f 66 20 63 72 6f 73 73 69 6e  umber of crossin
40f0: 67 73 20 69 73 20 30 20 74 68 65 6e 20 74 68 65  gs is 0 then the
4100: 20 72 61 6e 67 65 0a 09 23 20 20 20 20 20 20 20   range..#       
4110: 68 61 73 20 6e 6f 20 69 6e 74 65 72 6e 61 6c 20  has no internal 
4120: 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 6e  dependencies, an
4130: 64 20 6e 6f 20 62 72 65 61 6b 20 6c 6f 63 61 74  d no break locat
4140: 69 6f 6e 20 61 74 0a 09 23 20 20 20 20 20 20 20  ion at..#       
4150: 61 6c 6c 2e 20 54 68 69 73 20 70 6f 73 73 69 62  all. This possib
4160: 69 6c 69 74 79 20 69 73 20 73 69 67 6e 61 6c 65  ility is signale
4170: 64 20 76 69 61 20 72 65 73 75 6c 74 20 2d 31 2e  d via result -1.
4180: 0a 0a 09 23 20 4e 6f 74 65 3a 20 41 20 72 61 6e  ...# Note: A ran
4190: 67 65 20 6f 66 20 6c 65 6e 67 74 68 20 31 20 6f  ge of length 1 o
41a0: 72 20 6c 65 73 73 20 63 61 6e 6e 6f 74 20 68 61  r less cannot ha
41b0: 76 65 20 69 6e 74 65 72 6e 61 6c 0a 09 23 20 20  ve internal..#  
41c0: 20 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65       dependencie
41d0: 73 2c 20 61 73 20 74 68 61 74 20 6e 65 65 64 73  s, as that needs
41e0: 20 61 74 20 6c 65 61 73 74 20 74 77 6f 20 72 65   at least two re
41f0: 76 69 73 69 6f 6e 73 20 69 6e 0a 09 23 20 20 20  visions in..#   
4200: 20 20 20 20 74 68 65 20 72 61 6e 67 65 2e 0a 0a      the range...
4210: 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 72  .if {[llength $r
4220: 61 6e 67 65 5d 20 3c 20 32 7d 20 7b 20 72 65 74  ange] < 2} { ret
4230: 75 72 6e 20 2d 31 20 7d 0a 0a 09 73 65 74 20 6d  urn -1 }...set m
4240: 61 78 20 2d 31 0a 09 73 65 74 20 62 65 73 74 20  ax -1..set best 
4250: 7b 7d 0a 0a 09 66 6f 72 65 61 63 68 20 6c 6f 63  {}...foreach loc
4260: 61 74 69 6f 6e 20 24 72 61 6e 67 65 20 7b 0a 09  ation $range {..
4270: 20 20 20 20 73 65 74 20 63 72 6f 73 73 69 6e 67      set crossing
4280: 73 20 24 63 72 6f 73 73 28 24 6c 6f 63 61 74 69  s $cross($locati
4290: 6f 6e 29 0a 09 20 20 20 20 69 66 20 7b 24 63 72  on)..    if {$cr
42a0: 6f 73 73 69 6e 67 73 20 3e 20 24 6d 61 78 7d 20  ossings > $max} 
42b0: 7b 0a 09 09 73 65 74 20 6d 61 78 20 20 24 63 72  {...set max  $cr
42c0: 6f 73 73 69 6e 67 73 0a 09 09 73 65 74 20 62 65  ossings...set be
42d0: 73 74 20 5b 6c 69 73 74 20 24 6c 6f 63 61 74 69  st [list $locati
42e0: 6f 6e 5d 0a 09 09 63 6f 6e 74 69 6e 75 65 0a 09  on]...continue..
42f0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63      } elseif {$c
4300: 72 6f 73 73 69 6e 67 73 20 3d 3d 20 24 6d 61 78  rossings == $max
4310: 7d 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 62 65  } {...lappend be
4320: 73 74 20 24 6c 6f 63 61 74 69 6f 6e 0a 09 20 20  st $location..  
4330: 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b 24 6d 61    }..}...if {$ma
4340: 78 20 3d 3d 20 30 7d 20 20 20 20 20 20 20 20 20  x == 0}         
4350: 20 20 20 7b 20 72 65 74 75 72 6e 20 2d 31 20 7d     { return -1 }
4360: 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24  ..if {[llength $
4370: 62 65 73 74 5d 20 3d 3d 20 31 7d 20 7b 20 72 65  best] == 1} { re
4380: 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 62 65  turn [lindex $be
4390: 73 74 20 30 5d 20 7d 0a 0a 09 73 65 74 20 6c 6f  st 0] }...set lo
43a0: 63 61 74 69 6f 6e 73 20 24 62 65 73 74 0a 09 73  cations $best..s
43b0: 65 74 20 62 65 73 74 20 7b 7d 0a 09 73 65 74 20  et best {}..set 
43c0: 6d 69 6e 20 2d 31 0a 0a 09 66 6f 72 65 61 63 68  min -1...foreach
43d0: 20 6c 6f 63 61 74 69 6f 6e 20 24 6c 6f 63 61 74   location $locat
43e0: 69 6f 6e 73 20 7b 0a 09 20 20 20 20 73 65 74 20  ions {..    set 
43f0: 69 6e 74 65 72 76 61 6c 20 24 64 65 6c 74 61 28  interval $delta(
4400: 24 6c 6f 63 61 74 69 6f 6e 29 0a 09 20 20 20 20  $location)..    
4410: 69 66 20 7b 28 24 6d 69 6e 20 3c 20 30 29 20 7c  if {($min < 0) |
4420: 7c 20 28 24 69 6e 74 65 72 76 61 6c 20 3c 20 24  | ($interval < $
4430: 6d 69 6e 29 7d 20 7b 0a 09 09 73 65 74 20 6d 69  min)} {...set mi
4440: 6e 20 20 24 69 6e 74 65 72 76 61 6c 0a 09 09 73  n  $interval...s
4450: 65 74 20 62 65 73 74 20 5b 6c 69 73 74 20 24 6c  et best [list $l
4460: 6f 63 61 74 69 6f 6e 5d 0a 09 20 20 20 20 7d 20  ocation]..    } 
4470: 65 6c 73 65 69 66 20 7b 24 69 6e 74 65 72 76 61  elseif {$interva
4480: 6c 20 3d 3d 20 24 6d 69 6e 7d 20 7b 0a 09 09 6c  l == $min} {...l
4490: 61 70 70 65 6e 64 20 62 65 73 74 20 24 6c 6f 63  append best $loc
44a0: 61 74 69 6f 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a  ation..    }..}.
44b0: 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24  ..if {[llength $
44c0: 62 65 73 74 5d 20 3d 3d 20 31 7d 20 7b 20 72 65  best] == 1} { re
44d0: 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 62 65  turn [lindex $be
44e0: 73 74 20 30 5d 20 7d 0a 0a 09 72 65 74 75 72 6e  st 0] }...return
44f0: 20 5b 6c 69 6e 64 65 78 20 5b 6c 73 6f 72 74 20   [lindex [lsort 
4500: 2d 69 6e 74 65 67 65 72 20 2d 69 6e 63 72 65 61  -integer -increa
4510: 73 69 6e 67 20 24 62 65 73 74 5d 20 30 5d 0a 20  sing $best] 0]. 
4520: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 43     }..    proc C
4530: 75 74 41 74 20 7b 6c 6f 63 61 74 69 6f 6e 7d 20  utAt {location} 
4540: 7b 0a 09 75 70 76 61 72 20 31 20 63 72 6f 73 73  {..upvar 1 cross
4550: 20 63 72 6f 73 73 20 64 65 70 63 20 64 65 70 63   cross depc depc
4560: 0a 0a 09 23 20 49 74 20 77 61 73 20 64 65 63 69  ...# It was deci
4570: 64 65 64 20 74 6f 20 73 70 6c 69 74 20 74 68 65  ded to split the
4580: 20 63 68 61 6e 67 65 73 65 74 20 61 74 20 74 68   changeset at th
4590: 65 20 67 69 76 65 6e 0a 09 23 20 6c 6f 63 61 74  e given..# locat
45a0: 69 6f 6e 2e 20 54 68 69 73 20 63 75 74 73 20 61  ion. This cuts a
45b0: 20 6e 75 6d 62 65 72 20 6f 66 20 64 65 70 65 6e   number of depen
45c0: 64 65 6e 63 69 65 73 2e 20 48 65 72 65 20 77 65  dencies. Here we
45d0: 20 75 70 64 61 74 65 0a 09 23 20 74 68 65 20 63   update..# the c
45e0: 72 6f 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ross information
45f0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 62 72 65   so that the bre
4600: 61 6b 20 66 69 6e 64 65 72 20 68 61 73 20 61 63  ak finder has ac
4610: 63 75 72 61 74 65 0a 09 23 20 64 61 74 61 20 77  curate..# data w
4620: 68 65 6e 20 77 65 20 6c 6f 6f 6b 20 61 74 20 74  hen we look at t
4630: 68 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 61  he generated fra
4640: 67 6d 65 6e 74 73 2e 0a 0a 09 73 65 74 20 73 69  gments....set si
4650: 78 20 5b 6c 6f 67 20 76 69 73 69 62 6c 65 3f 20  x [log visible? 
4660: 36 5d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 64 65  6]...foreach {de
4670: 70 20 72 61 6e 67 65 7d 20 5b 61 72 72 61 79 20  p range} [array 
4680: 67 65 74 20 64 65 70 63 5d 20 7b 0a 09 20 20 20  get depc] {..   
4690: 20 23 20 43 68 65 63 6b 20 61 6c 6c 20 64 65 70   # Check all dep
46a0: 65 6e 64 65 6e 63 69 65 73 20 73 74 69 6c 6c 20  endencies still 
46b0: 6b 6e 6f 77 6e 2c 20 74 61 6b 65 20 74 68 65 69  known, take thei
46c0: 72 20 72 61 6e 67 65 20 61 6e 64 0a 09 20 20 20  r range and..   
46d0: 20 23 20 73 65 65 20 69 66 20 74 68 65 20 62 72   # see if the br
46e0: 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 66 61 6c  eak location fal
46f0: 6c 73 20 77 69 74 68 69 6e 2e 0a 0a 09 20 20 20  ls within....   
4700: 20 42 6f 72 64 65 72 20 24 72 61 6e 67 65 20 73   Border $range s
4710: 20 65 0a 09 20 20 20 20 69 66 20 7b 24 6c 6f 63   e..    if {$loc
4720: 61 74 69 6f 6e 20 3c 20 24 73 7d 20 63 6f 6e 74  ation < $s} cont
4730: 69 6e 75 65 20 3b 20 23 20 62 72 65 61 6b 20 62  inue ; # break b
4740: 65 66 6f 72 65 20 72 61 6e 67 65 2c 20 69 67 6e  efore range, ign
4750: 6f 72 65 0a 09 20 20 20 20 69 66 20 7b 24 6c 6f  ore..    if {$lo
4760: 63 61 74 69 6f 6e 20 3e 20 24 65 7d 20 63 6f 6e  cation > $e} con
4770: 74 69 6e 75 65 20 3b 20 23 20 62 72 65 61 6b 20  tinue ; # break 
4780: 61 66 74 65 72 20 72 61 6e 67 65 2c 20 69 67 6e  after range, ign
4790: 6f 72 65 2e 0a 0a 09 20 20 20 20 23 20 54 68 69  ore....    # Thi
47a0: 73 20 64 65 70 65 6e 64 65 6e 63 79 20 63 72 6f  s dependency cro
47b0: 73 73 65 73 20 74 68 65 20 62 72 65 61 6b 20 6c  sses the break l
47c0: 6f 63 61 74 69 6f 6e 2e 20 57 65 20 72 65 6d 6f  ocation. We remo
47d0: 76 65 20 69 74 0a 09 20 20 20 20 23 20 66 72 6f  ve it..    # fro
47e0: 6d 20 74 68 65 20 63 72 6f 73 73 69 6e 67 73 20  m the crossings 
47f0: 63 6f 75 6e 74 65 72 73 2c 20 61 6e 64 20 74 68  counters, and th
4800: 65 6e 20 61 6c 73 6f 20 66 72 6f 6d 20 74 68 65  en also from the
4810: 20 73 65 74 0a 09 20 20 20 20 23 20 6f 66 20 6b   set..    # of k
4820: 6e 6f 77 6e 20 64 65 70 65 6e 64 65 6e 63 69 65  nown dependencie
4830: 73 2c 20 61 73 20 77 65 20 61 72 65 20 64 6f 6e  s, as we are don
4840: 65 20 77 69 74 68 20 69 74 2e 0a 0a 09 20 20 20  e with it....   
4850: 20 66 6f 72 65 61 63 68 20 6c 6f 63 20 24 64 65   foreach loc $de
4860: 70 63 28 24 64 65 70 29 20 7b 20 69 6e 63 72 20  pc($dep) { incr 
4870: 63 72 6f 73 73 28 24 6c 6f 63 29 20 2d 31 20 7d  cross($loc) -1 }
4880: 0a 09 20 20 20 20 75 6e 73 65 74 20 64 65 70 63  ..    unset depc
4890: 28 24 64 65 70 29 0a 0a 09 20 20 20 20 69 66 20  ($dep)...    if 
48a0: 7b 21 24 73 69 78 7d 20 63 6f 6e 74 69 6e 75 65  {!$six} continue
48b0: 0a 0a 09 20 20 20 20 73 74 72 75 63 74 3a 3a 6c  ...    struct::l
48c0: 69 73 74 20 61 73 73 69 67 6e 20 24 64 65 70 20  ist assign $dep 
48d0: 70 61 72 65 6e 74 20 63 68 69 6c 64 0a 09 20 20  parent child..  
48e0: 20 20 6c 6f 67 20 77 72 69 74 65 20 35 20 63 73    log write 5 cs
48f0: 65 74 73 20 22 42 72 6f 6b 65 20 64 65 70 65 6e  ets "Broke depen
4900: 64 65 6e 63 79 20 5b 50 44 20 24 70 61 72 65 6e  dency [PD $paren
4910: 74 5d 20 2d 2d 3e 20 5b 50 44 20 24 63 68 69 6c  t] --> [PD $chil
4920: 64 5d 22 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 0a  d]"..}...return.
4930: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 50 72 69      }..    # Pri
4940: 6e 74 20 69 64 65 6e 74 69 66 79 69 6e 67 20 64  nt identifying d
4950: 61 74 61 20 66 6f 72 20 61 20 72 65 76 69 73 69  ata for a revisi
4960: 6f 6e 20 28 70 72 6f 6a 65 63 74 2c 20 66 69 6c  on (project, fil
4970: 65 2c 20 64 6f 74 74 65 64 20 72 65 76 0a 20 20  e, dotted rev.  
4980: 20 20 23 20 6e 75 6d 62 65 72 29 2c 20 66 6f 72    # number), for
4990: 20 68 69 67 68 20 76 65 72 62 6f 73 69 74 79 20   high verbosity 
49a0: 6c 6f 67 20 6f 75 74 70 75 74 2e 0a 0a 20 20 20  log output...   
49b0: 20 70 72 6f 63 20 50 44 20 7b 69 64 7d 20 7b 0a   proc PD {id} {.
49c0: 09 66 6f 72 65 61 63 68 20 7b 70 20 66 20 72 7d  .foreach {p f r}
49d0: 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09   [state run {...
49e0: 53 45 4c 45 43 54 20 50 2e 6e 61 6d 65 20 2c 20  SELECT P.name , 
49f0: 46 2e 6e 61 6d 65 2c 20 52 2e 72 65 76 0a 09 09  F.name, R.rev...
4a00: 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c  FROM revision R,
4a10: 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65 63 74   file F, project
4a20: 20 50 0a 09 09 57 48 45 52 45 20 52 2e 72 69 64   P...WHERE R.rid
4a30: 20 3d 20 24 69 64 0a 09 09 41 4e 44 20 20 20 52   = $id...AND   R
4a40: 2e 66 69 64 20 3d 20 46 2e 66 69 64 0a 09 09 41  .fid = F.fid...A
4a50: 4e 44 20 20 20 46 2e 70 69 64 20 3d 20 50 2e 70  ND   F.pid = P.p
4a60: 69 64 0a 09 7d 5d 20 62 72 65 61 6b 0a 09 72 65  id..}] break..re
4a70: 74 75 72 6e 20 22 27 24 70 20 3a 20 24 66 2f 24  turn "'$p : $f/$
4a80: 72 27 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  r'".    }..    #
4a90: 20 50 72 69 6e 74 69 6e 67 20 6f 6e 65 20 6f 72   Printing one or
4aa0: 20 6d 6f 72 65 20 72 61 6e 67 65 73 2c 20 66 6f   more ranges, fo
4ab0: 72 6d 61 74 74 65 64 2c 20 61 6e 64 20 6f 6e 6c  rmatted, and onl
4ac0: 79 20 74 68 65 69 72 20 62 6f 72 64 65 72 20 74  y their border t
4ad0: 6f 0a 20 20 20 20 23 20 6b 65 65 70 20 74 68 65  o.    # keep the
4ae0: 20 73 74 72 69 6e 67 73 20 73 68 6f 72 74 2e 0a   strings short..
4af0: 0a 20 20 20 20 70 72 6f 63 20 50 52 73 20 7b 72  .    proc PRs {r
4b00: 61 6e 67 65 73 7d 20 7b 0a 09 72 65 74 75 72 6e  anges} {..return
4b10: 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d   [struct::list m
4b20: 61 70 20 24 72 61 6e 67 65 73 20 5b 6d 79 70 72  ap $ranges [mypr
4b30: 6f 63 20 50 52 5d 5d 0a 20 20 20 20 7d 0a 0a 20  oc PR]].    }.. 
4b40: 20 20 20 70 72 6f 63 20 50 52 20 7b 72 61 6e 67     proc PR {rang
4b50: 65 7d 20 7b 0a 09 42 6f 72 64 65 72 20 24 72 61  e} {..Border $ra
4b60: 6e 67 65 20 73 20 65 0a 09 72 65 74 75 72 6e 20  nge s e..return 
4b70: 3c 24 7b 73 7d 2e 2e 2e 24 7b 65 7d 3e 0a 20 20  <${s}...${e}>.  
4b80: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 42 6f    }..    proc Bo
4b90: 72 64 65 72 20 7b 72 61 6e 67 65 20 73 76 20 65  rder {range sv e
4ba0: 76 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 73  v} {..upvar 1 $s
4bb0: 76 20 73 20 24 65 76 20 65 0a 09 73 65 74 20 73  v s $ev e..set s
4bc0: 20 5b 6c 69 6e 64 65 78 20 24 72 61 6e 67 65 20   [lindex $range 
4bd0: 30 5d 0a 09 73 65 74 20 65 20 5b 6c 69 6e 64 65  0]..set e [linde
4be0: 78 20 24 72 61 6e 67 65 20 65 6e 64 5d 0a 09 72  x $range end]..r
4bf0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
4c00: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23   # # ## ### ####
4c10: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
4c20: 23 23 23 23 23 23 23 23 0a 0a 20 20 20 20 74 79  ########..    ty
4c30: 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 68 61  pevariable mycha
4c40: 6e 67 65 73 65 74 73 20 20 20 20 7b 7d 20 3b 20  ngesets    {} ; 
4c50: 23 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 6b 6e  # List of all kn
4c60: 6f 77 6e 20 63 68 61 6e 67 65 73 65 74 73 2e 0a  own changesets..
4c70: 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65      typevariable
4c80: 20 6d 79 72 65 76 6d 61 70 20 2d 61 72 72 61 79   myrevmap -array
4c90: 20 7b 7d 20 3b 20 23 20 4d 61 70 20 66 72 6f 6d   {} ; # Map from
4ca0: 20 69 74 65 6d 73 20 28 74 61 67 67 65 64 29 20   items (tagged) 
4cb0: 74 6f 20 74 68 65 0a 09 09 09 09 20 20 20 20 20  to the.....     
4cc0: 20 23 20 6c 69 73 74 20 6f 66 20 63 68 61 6e 67   # list of chang
4cd0: 65 73 65 74 73 20 63 6f 6e 74 61 69 6e 69 6e 67  esets containing
4ce0: 0a 09 09 09 09 20 20 20 20 20 20 23 20 69 74 2e  .....      # it.
4cf0: 20 45 61 63 68 20 69 74 65 6d 20 63 61 6e 20 62   Each item can b
4d00: 65 20 75 73 65 64 20 62 79 0a 09 09 09 09 20 20  e used by.....  
4d10: 20 20 20 20 23 20 6f 6e 6c 79 20 6f 6e 65 20 63      # only one c
4d20: 68 61 6e 67 65 73 65 74 2e 0a 20 20 20 20 74 79  hangeset..    ty
4d30: 70 65 76 61 72 69 61 62 6c 65 20 6d 79 69 64 6d  pevariable myidm
4d40: 61 70 20 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20  ap  -array {} ; 
4d50: 23 20 4d 61 70 20 66 72 6f 6d 20 63 68 61 6e 67  # Map from chang
4d60: 65 73 65 74 20 69 64 20 74 6f 20 63 68 61 6e 67  eset id to chang
4d70: 65 73 65 74 2e 0a 0a 20 20 20 20 74 79 70 65 6d  eset...    typem
4d80: 65 74 68 6f 64 20 61 6c 6c 20 20 20 7b 7d 20 20  ethod all   {}  
4d90: 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 63 68 61   { return $mycha
4da0: 6e 67 65 73 65 74 73 20 7d 0a 20 20 20 20 74 79  ngesets }.    ty
4db0: 70 65 6d 65 74 68 6f 64 20 6f 66 20 20 20 20 7b  pemethod of    {
4dc0: 69 64 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79  id} { return $my
4dd0: 69 64 6d 61 70 28 24 69 64 29 20 7d 0a 20 20 20  idmap($id) }.   
4de0: 20 74 79 70 65 6d 65 74 68 6f 64 20 6f 66 72 65   typemethod ofre
4df0: 76 20 7b 69 64 7d 20 7b 20 72 65 74 75 72 6e 20  v {id} { return 
4e00: 24 6d 79 72 65 76 6d 61 70 28 24 69 64 29 20 7d  $myrevmap($id) }
4e10: 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23  ..    # # ## ###
4e20: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20   ##### ######## 
4e30: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 20  #############.  
4e40: 20 20 23 23 20 43 6f 6e 66 69 67 75 72 61 74 69    ## Configurati
4e50: 6f 6e 0a 0a 20 20 20 20 70 72 61 67 6d 61 20 2d  on..    pragma -
4e60: 68 61 73 74 79 70 65 69 6e 66 6f 20 20 20 20 6e  hastypeinfo    n
4e70: 6f 20 20 3b 20 23 20 6e 6f 20 74 79 70 65 20 69  o  ; # no type i
4e80: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20 20 20  ntrospection.   
4e90: 20 70 72 61 67 6d 61 20 2d 68 61 73 69 6e 66 6f   pragma -hasinfo
4ea0: 20 20 20 20 20 20 20 20 6e 6f 20 20 3b 20 23 20          no  ; # 
4eb0: 6e 6f 20 6f 62 6a 65 63 74 20 69 6e 74 72 6f 73  no object intros
4ec0: 70 65 63 74 69 6f 6e 0a 0a 20 20 20 20 23 20 23  pection..    # #
4ed0: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23   ## ### ##### ##
4ee0: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
4ef0: 23 23 23 23 0a 7d 0a 0a 23 20 23 20 23 23 20 23  ####.}..# # ## #
4f00: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
4f10: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20  # ############# 
4f20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4f30: 23 23 23 23 23 0a 23 23 20 48 65 6c 70 65 72 20  #####.## Helper 
4f40: 73 69 6e 67 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61  singleton. Comma
4f50: 6e 64 73 20 66 6f 72 20 72 65 76 69 73 69 6f 6e  nds for revision
4f60: 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e   changesets...sn
4f70: 69 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66  it::type ::vc::f
4f80: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63  ossil::import::c
4f90: 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76  vs::project::rev
4fa0: 3a 3a 72 65 76 20 7b 0a 20 20 20 20 74 79 70 65  ::rev {.    type
4fb0: 6d 65 74 68 6f 64 20 62 79 72 65 76 69 73 69 6f  method byrevisio
4fc0: 6e 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20  n {} { return 1 
4fd0: 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  }.    typemethod
4fe0: 20 62 79 73 79 6d 62 6f 6c 20 20 20 7b 7d 20 7b   bysymbol   {} {
4ff0: 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20   return 0 }.    
5000: 74 79 70 65 6d 65 74 68 6f 64 20 69 73 74 61 67  typemethod istag
5010: 20 20 20 20 20 20 7b 7d 20 7b 20 72 65 74 75 72        {} { retur
5020: 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65  n 0 }.    typeme
5030: 74 68 6f 64 20 69 73 62 72 61 6e 63 68 20 20 20  thod isbranch   
5040: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a  {} { return 0 }.
5050: 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20  .    # result = 
5060: 6c 69 73 74 20 28 6d 69 6e 74 69 6d 65 2c 20 6d  list (mintime, m
5070: 61 78 74 69 6d 65 29 0a 20 20 20 20 74 79 70 65  axtime).    type
5080: 6d 65 74 68 6f 64 20 74 69 6d 65 72 61 6e 67 65  method timerange
5090: 20 7b 69 74 65 6d 73 7d 20 7b 0a 09 73 65 74 20   {items} {..set 
50a0: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24  theset ('[join $
50b0: 69 74 65 6d 73 20 7b 27 2c 27 7d 5d 27 29 0a 09  items {','}]')..
50c0: 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75  return [state ru
50d0: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20  n "..    SELECT 
50e0: 4d 49 4e 28 52 2e 64 61 74 65 29 2c 20 4d 41 58  MIN(R.date), MAX
50f0: 28 52 2e 64 61 74 65 29 0a 09 20 20 20 20 46 52  (R.date)..    FR
5100: 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20  OM revision R.. 
5110: 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 49     WHERE R.rid I
5120: 4e 20 24 74 68 65 73 65 74 0a 09 22 5d 0a 20 20  N $theset.."].  
5130: 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64    }..    # var(d
5140: 76 29 20 3d 20 64 69 63 74 20 28 72 65 76 69 73  v) = dict (revis
5150: 69 6f 6e 20 2d 3e 20 6c 69 73 74 20 28 72 65 76  ion -> list (rev
5160: 69 73 69 6f 6e 29 29 0a 20 20 20 20 74 79 70 65  ision)).    type
5170: 6d 65 74 68 6f 64 20 69 6e 74 65 72 6e 61 6c 73  method internals
5180: 75 63 63 65 73 73 6f 72 73 20 7b 64 76 20 72 65  uccessors {dv re
5190: 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61  visions} {..upva
51a0: 72 20 31 20 24 64 76 20 64 65 70 65 6e 64 65 6e  r 1 $dv dependen
51b0: 63 69 65 73 0a 09 73 65 74 20 74 68 65 73 65 74  cies..set theset
51c0: 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69   ('[join $revisi
51d0: 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 23  ons {','}]')...#
51e0: 20 53 65 65 20 27 73 75 63 63 65 73 73 6f 72 73   See 'successors
51f0: 27 20 62 65 6c 6f 77 20 66 6f 72 20 74 68 65 20  ' below for the 
5200: 6d 61 69 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e  main explanation
5210: 20 6f 66 0a 09 23 20 74 68 65 20 76 61 72 69 6f   of..# the vario
5220: 75 73 20 63 61 73 65 73 2e 20 54 68 69 73 20 70  us cases. This p
5230: 69 65 63 65 20 69 73 20 73 70 65 63 69 61 6c 20  iece is special 
5240: 69 6e 20 74 68 61 74 20 69 74 0a 09 23 20 72 65  in that it..# re
5250: 73 74 72 69 63 74 73 20 74 68 65 20 73 75 63 63  stricts the succ
5260: 65 73 73 6f 72 73 20 77 65 20 6c 6f 6f 6b 20 66  essors we look f
5270: 6f 72 20 74 6f 20 74 68 65 20 73 61 6d 65 20 73  or to the same s
5280: 65 74 20 6f 66 0a 09 23 20 72 65 76 69 73 69 6f  et of..# revisio
5290: 6e 73 20 77 65 20 73 74 61 72 74 20 66 72 6f 6d  ns we start from
52a0: 2e 20 53 65 6e 73 69 62 6c 65 20 61 73 20 77 65  . Sensible as we
52b0: 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72   are looking for
52c0: 0a 09 23 20 63 68 61 6e 67 65 73 65 74 20 69 6e  ..# changeset in
52d0: 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63  ternal dependenc
52e0: 69 65 73 2e 0a 0a 09 61 72 72 61 79 20 73 65 74  ies....array set
52f0: 20 64 65 70 20 7b 7d 0a 0a 09 66 6f 72 65 61 63   dep {}...foreac
5300: 68 20 7b 72 69 64 20 63 68 69 6c 64 7d 20 5b 73  h {rid child} [s
5310: 74 61 74 65 20 72 75 6e 20 22 0a 20 20 20 2d 2d  tate run ".   --
5320: 20 28 31 29 20 50 72 69 6d 61 72 79 20 63 68 69   (1) Primary chi
5330: 6c 64 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52  ld..    SELECT R
5340: 2e 72 69 64 2c 20 52 2e 63 68 69 6c 64 0a 09 20  .rid, R.child.. 
5350: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69     FROM   revisi
5360: 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20  on R..    WHERE 
5370: 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65   R.rid   IN $the
5380: 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72  set     -- Restr
5390: 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73  ict to revisions
53a0: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20   of interest..  
53b0: 20 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64    AND    R.child
53c0: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
53d0: 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 63  -- Has primary c
53e0: 68 69 6c 64 0a 09 20 20 20 20 41 4e 44 20 20 20  hild..    AND   
53f0: 20 52 2e 63 68 69 6c 64 20 49 4e 20 24 74 68 65   R.child IN $the
5400: 73 65 74 20 20 20 20 20 2d 2d 20 57 68 69 63 68  set     -- Which
5410: 20 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e 74 65   is also of inte
5420: 72 65 73 74 0a 20 20 20 20 55 4e 49 4f 4e 0a 20  rest.    UNION. 
5430: 20 20 20 2d 2d 20 28 32 29 20 53 65 63 6f 6e 64     -- (2) Second
5440: 61 72 79 20 28 62 72 61 6e 63 68 29 20 63 68 69  ary (branch) chi
5450: 6c 64 72 65 6e 0a 09 20 20 20 20 53 45 4c 45 43  ldren..    SELEC
5460: 54 20 52 2e 72 69 64 2c 20 42 2e 62 72 69 64 0a  T R.rid, B.brid.
5470: 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69  .    FROM   revi
5480: 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e  sion R, revision
5490: 62 72 61 6e 63 68 63 68 69 6c 64 72 65 6e 20 42  branchchildren B
54a0: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72  ..    WHERE  R.r
54b0: 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20  id   IN $theset 
54c0: 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20      -- Restrict 
54d0: 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20  to revisions of 
54e0: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e  interest..    AN
54f0: 44 20 20 20 20 52 2e 72 69 64 20 3d 20 42 2e 72  D    R.rid = B.r
5500: 69 64 20 20 20 20 20 20 20 20 20 20 2d 2d 20 53  id          -- S
5510: 65 6c 65 63 74 20 73 75 62 73 65 74 20 6f 66 20  elect subset of 
5520: 62 72 61 6e 63 68 20 63 68 69 6c 64 72 65 6e 0a  branch children.
5530: 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 62 72  .    AND    B.br
5540: 69 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20  id IN $theset   
5550: 20 20 20 2d 2d 20 57 68 69 63 68 20 69 73 20 61     -- Which is a
5560: 6c 73 6f 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  lso of interest.
5570: 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d      UNION.    --
5580: 20 28 34 29 20 43 68 69 6c 64 20 6f 66 20 74 72   (4) Child of tr
5590: 75 6e 6b 20 72 6f 6f 74 20 73 75 63 63 65 73 73  unk root success
55a0: 6f 72 20 6f 66 20 6c 61 73 74 20 4e 54 44 42 20  or of last NTDB 
55b0: 6f 6e 20 74 72 75 6e 6b 2e 0a 09 20 20 20 20 53  on trunk...    S
55c0: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 41 2e  ELECT R.rid, RA.
55d0: 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20  child..    FROM 
55e0: 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69  revision R, revi
55f0: 73 69 6f 6e 20 52 41 0a 09 20 20 20 20 57 48 45  sion RA..    WHE
5600: 52 45 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74  RE R.rid   IN $t
5610: 68 65 73 65 74 20 20 20 20 20 20 2d 2d 20 52 65  heset      -- Re
5620: 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69  strict to revisi
5630: 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  ons of interest.
5640: 09 20 20 20 20 41 4e 44 20 20 20 52 2e 69 73 64  .    AND   R.isd
5650: 65 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20  efault          
5660: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74     -- Restrict t
5670: 6f 20 4e 54 44 42 0a 09 20 20 20 20 41 4e 44 20  o NTDB..    AND 
5680: 20 20 52 2e 64 62 63 68 69 6c 64 20 49 53 20 4e    R.dbchild IS N
5690: 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d 20 61 6e 64  OT NULL   -- and
56a0: 20 6c 61 73 74 20 4e 54 44 42 20 62 65 6c 6f 6e   last NTDB belon
56b0: 67 69 6e 67 20 74 6f 20 74 72 75 6e 6b 0a 09 20  ging to trunk.. 
56c0: 20 20 20 41 4e 44 20 20 20 52 41 2e 72 69 64 20     AND   RA.rid 
56d0: 3d 20 52 2e 64 62 63 68 69 6c 64 20 20 20 20 20  = R.dbchild     
56e0: 20 2d 2d 20 47 6f 20 64 69 72 65 63 74 6c 79 20   -- Go directly 
56f0: 74 6f 20 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20  to trunk root.. 
5700: 20 20 20 41 4e 44 20 20 20 52 41 2e 63 68 69 6c     AND   RA.chil
5710: 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  d IS NOT NULL   
5720: 20 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20   -- Has primary 
5730: 63 68 69 6c 64 2e 0a 20 20 20 20 20 20 20 20 20  child..         
5740: 20 20 20 41 4e 44 20 20 20 52 41 2e 63 68 69 6c     AND   RA.chil
5750: 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20  d IN $theset    
5760: 20 2d 2d 20 57 68 69 63 68 20 69 73 20 61 6c 73   -- Which is als
5770: 6f 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 22  o of interest.."
5780: 5d 20 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 69  ] {..    # Consi
5790: 64 65 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 20  der moving this 
57a0: 74 6f 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  to the integrity
57b0: 20 6d 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 6e   module...    in
57c0: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b  tegrity assert {
57d0: 24 72 69 64 20 21 3d 20 24 63 68 69 6c 64 7d 20  $rid != $child} 
57e0: 7b 52 65 76 69 73 69 6f 6e 20 24 72 69 64 20 64  {Revision $rid d
57f0: 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66  epends on itself
5800: 2e 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20  .}..    lappend 
5810: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 24 72 69  dependencies($ri
5820: 64 29 20 24 63 68 69 6c 64 0a 09 20 20 20 20 73  d) $child..    s
5830: 65 74 20 64 65 70 28 24 72 69 64 2c 24 63 68 69  et dep($rid,$chi
5840: 6c 64 29 20 2e 0a 09 7d 0a 0a 09 23 20 54 68 65  ld) ...}...# The
5850: 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 73 20   sql statements 
5860: 61 62 6f 76 65 20 6c 6f 6f 6b 73 20 6f 6e 6c 79  above looks only
5870: 20 66 6f 72 20 64 69 72 65 63 74 20 64 65 70 65   for direct depe
5880: 6e 64 65 6e 63 69 65 73 0a 09 23 20 62 65 74 77  ndencies..# betw
5890: 65 65 6e 20 72 65 76 69 73 69 6f 6e 20 69 6e 20  een revision in 
58a0: 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20 48  the changeset. H
58b0: 6f 77 65 76 65 72 20 64 75 65 20 74 6f 20 74 68  owever due to th
58c0: 65 0a 09 23 20 76 61 67 61 72 69 65 73 20 6f 66  e..# vagaries of
58d0: 20 6d 65 74 61 20 64 61 74 61 20 69 74 20 69 73   meta data it is
58e0: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 77   possible for tw
58f0: 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 0a 09  o revisions of..
5900: 23 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  # the same file 
5910: 74 6f 20 65 6e 64 20 75 70 20 69 6e 20 74 68 65  to end up in the
5920: 20 73 61 6d 65 20 63 68 61 6e 67 65 73 65 74 2c   same changeset,
5930: 20 77 69 74 68 6f 75 74 20 61 0a 09 23 20 64 69   without a..# di
5940: 72 65 63 74 20 64 65 70 65 6e 64 65 6e 63 79 20  rect dependency 
5950: 62 65 74 77 65 65 6e 20 74 68 65 6d 2e 20 48 6f  between them. Ho
5960: 77 65 76 65 72 20 77 65 20 6b 6e 6f 77 20 74 68  wever we know th
5970: 61 74 20 74 68 65 72 65 0a 09 23 20 68 61 73 20  at there..# has 
5980: 74 6f 20 62 65 20 61 20 61 6e 20 69 6e 64 69 72  to be a an indir
5990: 65 63 74 20 64 65 70 65 6e 64 65 6e 63 79 2c 20  ect dependency, 
59a0: 62 65 20 69 74 20 74 68 72 6f 75 67 68 20 70 72  be it through pr
59b0: 69 6d 61 72 79 0a 09 23 20 63 68 69 6c 64 72 65  imary..# childre
59c0: 6e 2c 20 62 72 61 6e 63 68 20 63 68 69 6c 64 72  n, branch childr
59d0: 65 6e 2c 20 6f 72 20 61 20 63 6f 6d 62 69 6e 61  en, or a combina
59e0: 74 69 6f 6e 20 74 68 65 72 65 6f 66 2e 0a 0a 09  tion thereof....
59f0: 23 20 57 65 20 6e 6f 77 20 66 69 6c 6c 20 69 6e  # We now fill in
5a00: 20 74 68 65 73 65 20 70 73 65 75 64 6f 2d 64 65   these pseudo-de
5a10: 70 65 6e 64 65 6e 63 69 65 73 2c 20 69 66 20 6e  pendencies, if n
5a20: 6f 20 73 75 63 68 0a 09 23 20 64 65 70 65 6e 64  o such..# depend
5a30: 65 6e 63 79 20 65 78 69 73 74 73 20 61 6c 72 65  ency exists alre
5a40: 61 64 79 2e 20 54 68 65 20 64 69 72 65 63 74 69  ady. The directi
5a50: 6f 6e 20 6f 66 20 74 68 65 20 64 65 70 65 6e 64  on of the depend
5a60: 65 6e 63 79 0a 09 23 20 69 73 20 61 63 74 75 61  ency..# is actua
5a70: 6c 6c 79 20 69 72 72 65 6c 65 76 61 6e 74 20 66  lly irrelevant f
5a80: 6f 72 20 74 68 69 73 2e 0a 0a 09 23 20 4e 4f 54  or this....# NOT
5a90: 45 3a 20 54 68 69 73 20 69 73 20 64 69 66 66 65  E: This is diffe
5aa0: 72 65 6e 74 20 66 72 6f 6d 20 63 76 73 32 73 76  rent from cvs2sv
5ab0: 6e 2e 20 4f 75 72 20 73 70 69 72 69 74 75 61 6c  n. Our spiritual
5ac0: 20 61 6e 63 65 73 74 6f 72 0a 09 23 20 64 6f 65   ancestor..# doe
5ad0: 73 20 6e 6f 74 20 75 73 65 20 73 75 63 68 20 70  s not use such p
5ae0: 73 65 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63 69  seudo-dependenci
5af0: 65 73 2c 20 68 6f 77 65 76 65 72 20 69 74 20 75  es, however it u
5b00: 73 65 73 20 61 0a 09 23 20 43 4f 4d 4d 49 54 5f  ses a..# COMMIT_
5b10: 54 48 52 45 53 48 4f 4c 44 2c 20 61 20 74 69 6d  THRESHOLD, a tim
5b20: 65 20 69 6e 74 65 72 76 61 6c 20 63 6f 6d 6d 69  e interval commi
5b30: 74 73 20 73 68 6f 75 6c 64 20 66 61 6c 6c 2e 20  ts should fall. 
5b40: 54 68 69 73 0a 09 23 20 77 69 6c 6c 20 67 72 65  This..# will gre
5b50: 61 74 6c 79 20 72 65 64 75 63 65 73 20 74 68 65  atly reduces the
5b60: 20 72 69 73 6b 20 6f 66 20 67 65 74 74 69 6e 67   risk of getting
5b70: 20 66 61 72 20 73 65 70 61 72 61 74 65 64 0a 09   far separated..
5b80: 23 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 74  # revisions of t
5b90: 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 6e 74  he same file int
5ba0: 6f 20 6f 6e 65 20 63 68 61 6e 67 65 73 65 74 2e  o one changeset.
5bb0: 0a 0a 09 23 20 57 65 20 61 6c 6c 6f 77 20 72 65  ...# We allow re
5bc0: 76 69 73 69 6f 6e 73 20 74 6f 20 62 65 20 66 61  visions to be fa
5bd0: 72 20 61 70 61 72 74 20 69 6e 20 74 69 6d 65 20  r apart in time 
5be0: 69 6e 20 74 68 65 20 73 61 6d 65 0a 09 23 20 63  in the same..# c
5bf0: 68 61 6e 67 65 73 65 74 2c 20 62 75 74 20 6e 65  hangeset, but ne
5c00: 65 64 20 74 68 65 20 70 73 65 75 64 6f 2d 64 65  ed the pseudo-de
5c10: 70 65 6e 64 65 6e 63 69 65 73 20 66 6f 72 20 74  pendencies for t
5c20: 68 69 73 2e 0a 0a 09 61 72 72 61 79 20 73 65 74  his....array set
5c30: 20 66 69 64 73 20 7b 7d 0a 09 66 6f 72 65 61 63   fids {}..foreac
5c40: 68 20 7b 72 69 64 20 66 69 64 7d 20 5b 73 74 61  h {rid fid} [sta
5c50: 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45  te run "..    SE
5c60: 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 66 69  LECT R.rid, R.fi
5c70: 64 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20  d FROM revision 
5c80: 52 20 57 48 45 52 45 20 52 2e 72 69 64 20 49 4e  R WHERE R.rid IN
5c90: 20 24 74 68 65 73 65 74 0a 09 22 5d 20 7b 20 6c   $theset.."] { l
5ca0: 61 70 70 65 6e 64 20 66 69 64 73 28 24 66 69 64  append fids($fid
5cb0: 29 20 24 72 69 64 20 7d 0a 0a 09 66 6f 72 65 61  ) $rid }...forea
5cc0: 63 68 20 7b 66 69 64 20 72 69 64 73 7d 20 5b 61  ch {fid rids} [a
5cd0: 72 72 61 79 20 67 65 74 20 66 69 64 73 5d 20 7b  rray get fids] {
5ce0: 0a 09 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67  ..    if {[lleng
5cf0: 74 68 20 24 72 69 64 73 5d 20 3c 20 32 7d 20 63  th $rids] < 2} c
5d00: 6f 6e 74 69 6e 75 65 0a 09 20 20 20 20 66 6f 72  ontinue..    for
5d10: 65 61 63 68 20 61 20 24 72 69 64 73 20 7b 0a 09  each a $rids {..
5d20: 09 66 6f 72 65 61 63 68 20 62 20 24 72 69 64 73  .foreach b $rids
5d30: 20 7b 0a 09 09 20 20 20 20 69 66 20 7b 24 61 20   {...    if {$a 
5d40: 3d 3d 20 24 62 7d 20 63 6f 6e 74 69 6e 75 65 0a  == $b} continue.
5d50: 09 09 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20  ..    if {[info 
5d60: 65 78 69 73 74 73 20 64 65 70 28 24 61 2c 24 62  exists dep($a,$b
5d70: 29 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 09 20  )]} continue... 
5d80: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
5d90: 73 74 73 20 64 65 70 28 24 62 2c 24 61 29 5d 7d  sts dep($b,$a)]}
5da0: 20 63 6f 6e 74 69 6e 75 65 0a 09 09 20 20 20 20   continue...    
5db0: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e  lappend dependen
5dc0: 63 69 65 73 28 24 61 29 20 24 62 0a 09 09 20 20  cies($a) $b...  
5dd0: 20 20 73 65 74 20 64 65 70 28 24 61 2c 24 62 29    set dep($a,$b)
5de0: 20 2e 0a 09 09 20 20 20 20 73 65 74 20 64 65 70   ....    set dep
5df0: 28 24 62 2c 24 61 29 20 2e 0a 09 09 7d 0a 09 20  ($b,$a) ....}.. 
5e00: 20 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a     }..}..return.
5e10: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72      }..    # var
5e20: 28 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 65  (dv) = dict (ite
5e30: 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29  m -> list (item)
5e40: 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20  ), item  = list 
5e50: 28 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 79  (type id).    ty
5e60: 70 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73  pemethod success
5e70: 6f 72 73 20 7b 64 76 20 72 65 76 69 73 69 6f 6e  ors {dv revision
5e80: 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64  s} {..upvar 1 $d
5e90: 76 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09  v dependencies..
5ea0: 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f  set theset ('[jo
5eb0: 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27  in $revisions {'
5ec0: 2c 27 7d 5d 27 29 0a 0a 09 23 20 54 68 65 20 66  ,'}]')...# The f
5ed0: 6f 6c 6c 6f 77 69 6e 67 20 63 61 73 65 73 20 73  ollowing cases s
5ee0: 70 65 63 69 66 79 20 77 68 65 6e 20 61 20 72 65  pecify when a re
5ef0: 76 69 73 69 6f 6e 20 53 20 69 73 20 61 20 73 75  vision S is a su
5f00: 63 63 65 73 73 6f 72 0a 09 23 20 6f 66 20 61 20  ccessor..# of a 
5f10: 72 65 76 69 73 69 6f 6e 20 52 2e 20 45 61 63 68  revision R. Each
5f20: 20 6f 66 20 74 68 65 20 63 61 73 65 73 20 74 72   of the cases tr
5f30: 61 6e 73 6c 61 74 65 73 20 69 6e 74 6f 20 6f 6e  anslates into on
5f40: 65 20 6f 66 0a 09 23 20 74 68 65 20 62 72 61 6e  e of..# the bran
5f50: 63 68 65 73 20 6f 66 20 74 68 65 20 53 51 4c 20  ches of the SQL 
5f60: 55 4e 49 4f 4e 20 63 6f 6d 69 6e 67 20 62 65 6c  UNION coming bel
5f70: 6f 77 2e 0a 09 23 0a 09 23 20 28 31 29 20 53 20  ow...#..# (1) S 
5f80: 63 61 6e 20 62 65 20 61 20 70 72 69 6d 61 72 79  can be a primary
5f90: 20 63 68 69 6c 64 20 6f 66 20 52 2c 20 69 2e 65   child of R, i.e
5fa0: 2e 20 69 6e 20 74 68 65 20 73 61 6d 65 20 4c 4f  . in the same LO
5fb0: 44 2e 20 52 0a 09 23 20 20 20 20 20 72 65 66 65  D. R..#     refe
5fc0: 72 65 6e 63 65 73 20 53 20 64 69 72 65 63 74 6c  rences S directl
5fd0: 79 2e 20 52 2e 63 68 69 6c 64 20 3d 20 53 28 2e  y. R.child = S(.
5fe0: 72 69 64 29 2c 20 69 66 20 69 74 20 65 78 69 73  rid), if it exis
5ff0: 74 73 2e 0a 09 23 0a 09 23 20 28 32 29 20 53 20  ts...#..# (2) S 
6000: 63 61 6e 20 62 65 20 61 20 73 65 63 6f 6e 64 61  can be a seconda
6010: 72 79 2c 20 69 2e 65 2e 20 62 72 61 6e 63 68 2c  ry, i.e. branch,
6020: 20 63 68 69 6c 64 20 6f 66 20 52 2e 20 48 65 72   child of R. Her
6030: 65 20 74 68 65 0a 09 23 20 20 20 20 20 6c 69 6e  e the..#     lin
6040: 6b 20 69 73 20 6d 61 64 65 20 74 68 72 6f 75 67  k is made throug
6050: 68 20 74 68 65 20 68 65 6c 70 65 72 20 74 61 62  h the helper tab
6060: 6c 65 0a 09 23 20 20 20 20 20 52 45 56 49 53 49  le..#     REVISI
6070: 4f 4e 42 52 41 4e 43 48 43 48 49 4c 44 52 45 4e  ONBRANCHCHILDREN
6080: 2e 20 52 2e 72 69 64 20 2d 3e 20 52 42 43 2e 72  . R.rid -> RBC.r
6090: 69 64 2c 20 52 42 43 2e 62 72 69 64 20 3d 0a 09  id, RBC.brid =..
60a0: 23 20 20 20 20 20 53 28 2e 72 69 64 29 0a 09 23  #     S(.rid)..#
60b0: 0a 09 23 20 28 33 29 20 4f 72 69 67 69 6e 61 6c  ..# (3) Original
60c0: 6c 79 20 74 68 69 73 20 75 73 65 20 63 61 73 65  ly this use case
60d0: 20 64 65 66 69 6e 65 64 20 74 68 65 20 72 6f 6f   defined the roo
60e0: 74 20 6f 66 20 61 20 64 65 74 61 63 68 65 64 0a  t of a detached.
60f0: 09 23 20 20 20 20 20 4e 54 44 42 20 61 73 20 74  .#     NTDB as t
6100: 68 65 20 73 75 63 63 65 73 73 6f 72 20 6f 66 20  he successor of 
6110: 74 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74 2e 20  the trunk root. 
6120: 54 68 69 73 20 6c 65 61 64 73 20 74 6f 20 61 0a  This leads to a.
6130: 09 23 20 20 20 20 20 62 61 64 20 74 61 6e 67 6c  .#     bad tangl
6140: 65 20 6c 61 74 65 72 20 6f 6e 2e 20 57 69 74 68  e later on. With
6150: 20 61 20 64 65 74 61 63 68 65 64 20 4e 54 44 42   a detached NTDB
6160: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 09 23   the original..#
6170: 20 20 20 20 20 74 72 75 6e 6b 20 72 6f 6f 74 20       trunk root 
6180: 72 65 76 69 73 69 6f 6e 20 77 61 73 20 72 65 6d  revision was rem
6190: 6f 76 65 64 20 61 73 20 69 72 72 65 6c 65 76 61  oved as irreleva
61a0: 6e 74 2c 20 61 6c 6c 6f 77 69 6e 67 0a 09 23 20  nt, allowing..# 
61b0: 20 20 20 20 74 68 65 20 6e 6f 6d 69 6e 61 6c 20      the nominal 
61c0: 72 6f 6f 74 20 74 6f 20 62 65 20 6c 61 74 65 72  root to be later
61d0: 20 69 6e 20 74 69 6d 65 20 74 68 61 6e 20 74 68   in time than th
61e0: 65 20 4e 54 44 42 0a 09 23 20 20 20 20 20 72 6f  e NTDB..#     ro
61f0: 6f 74 2e 20 4e 6f 77 20 73 65 74 74 69 6e 67 20  ot. Now setting 
6200: 74 68 69 73 20 64 65 70 65 6e 64 65 6e 63 79 20  this dependency 
6210: 77 69 6c 6c 20 62 65 20 62 61 63 6b 77 61 72 64  will be backward
6220: 20 69 6e 0a 09 23 20 20 20 20 20 74 69 6d 65 2e   in..#     time.
6230: 20 52 45 4d 4f 56 45 44 2e 0a 09 23 0a 09 23 20   REMOVED...#..# 
6240: 28 34 29 20 49 66 20 52 20 69 73 20 74 68 65 20  (4) If R is the 
6250: 6c 61 73 74 20 6f 66 20 74 68 65 20 4e 54 44 42  last of the NTDB
6260: 20 72 65 76 69 73 69 6f 6e 73 20 77 68 69 63 68   revisions which
6270: 20 62 65 6c 6f 6e 67 20 74 6f 0a 09 23 20 20 20   belong to..#   
6280: 20 20 74 68 65 20 74 72 75 6e 6b 2c 20 74 68 65    the trunk, the
6290: 6e 20 74 68 65 20 70 72 69 6d 61 72 79 20 63 68  n the primary ch
62a0: 69 6c 64 20 6f 66 20 74 68 65 20 74 72 75 6e 6b  ild of the trunk
62b0: 20 72 6f 6f 74 20 28 74 68 65 0a 09 23 20 20 20   root (the..#   
62c0: 20 20 27 31 2e 32 27 20 72 65 76 69 73 69 6f 6e    '1.2' revision
62d0: 29 20 69 73 20 61 20 73 75 63 63 65 73 73 6f 72  ) is a successor
62e0: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a  , if it exists..
62f0: 0a 09 23 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ..# Note that th
6300: 65 20 62 72 61 6e 63 68 65 73 20 73 70 61 77 6e  e branches spawn
6310: 65 64 20 66 72 6f 6d 20 74 68 65 20 72 65 76 69  ed from the revi
6320: 73 69 6f 6e 73 2c 20 61 6e 64 20 74 68 65 0a 09  sions, and the..
6330: 23 20 74 61 67 73 20 61 73 73 6f 63 69 61 74 65  # tags associate
6340: 64 20 77 69 74 68 20 74 68 65 6d 20 61 72 65 20  d with them are 
6350: 73 75 63 63 65 73 73 6f 72 73 20 61 73 20 77 65  successors as we
6360: 6c 6c 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72  ll....foreach {r
6370: 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65  id child} [state
6380: 20 72 75 6e 20 22 0a 20 20 20 2d 2d 20 28 31 29   run ".   -- (1)
6390: 20 50 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 09   Primary child..
63a0: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64      SELECT R.rid
63b0: 2c 20 52 2e 63 68 69 6c 64 0a 09 20 20 20 20 46  , R.child..    F
63c0: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52  ROM   revision R
63d0: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72  ..    WHERE  R.r
63e0: 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20  id   IN $theset 
63f0: 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20      -- Restrict 
6400: 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20  to revisions of 
6410: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e  interest..    AN
6420: 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49 53 20  D    R.child IS 
6430: 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48  NOT NULL    -- H
6440: 61 73 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64  as primary child
6450: 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d  .    UNION.    -
6460: 2d 20 28 32 29 20 53 65 63 6f 6e 64 61 72 79 20  - (2) Secondary 
6470: 28 62 72 61 6e 63 68 29 20 63 68 69 6c 64 72 65  (branch) childre
6480: 6e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e  n..    SELECT R.
6490: 72 69 64 2c 20 42 2e 62 72 69 64 0a 09 20 20 20  rid, B.brid..   
64a0: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
64b0: 20 52 2c 20 72 65 76 69 73 69 6f 6e 62 72 61 6e   R, revisionbran
64c0: 63 68 63 68 69 6c 64 72 65 6e 20 42 0a 09 20 20  chchildren B..  
64d0: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20    WHERE  R.rid  
64e0: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20   IN $theset     
64f0: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72  -- Restrict to r
6500: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65  evisions of inte
6510: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
6520: 20 52 2e 72 69 64 20 3d 20 42 2e 72 69 64 20 20   R.rid = B.rid  
6530: 20 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63          -- Selec
6540: 74 20 73 75 62 73 65 74 20 6f 66 20 62 72 61 6e  t subset of bran
6550: 63 68 20 63 68 69 6c 64 72 65 6e 0a 20 20 20 20  ch children.    
6560: 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 34 29  UNION.    -- (4)
6570: 20 43 68 69 6c 64 20 6f 66 20 74 72 75 6e 6b 20   Child of trunk 
6580: 72 6f 6f 74 20 73 75 63 63 65 73 73 6f 72 20 6f  root successor o
6590: 66 20 6c 61 73 74 20 4e 54 44 42 20 6f 6e 20 74  f last NTDB on t
65a0: 72 75 6e 6b 2e 0a 09 20 20 20 20 53 45 4c 45 43  runk...    SELEC
65b0: 54 20 52 2e 72 69 64 2c 20 52 41 2e 63 68 69 6c  T R.rid, RA.chil
65c0: 64 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69  d..    FROM revi
65d0: 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e  sion R, revision
65e0: 20 52 41 0a 09 20 20 20 20 57 48 45 52 45 20 52   RA..    WHERE R
65f0: 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65  .rid   IN $these
6600: 74 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69  t      -- Restri
6610: 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20  ct to revisions 
6620: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20  of interest..   
6630: 20 41 4e 44 20 20 20 52 2e 69 73 64 65 66 61 75   AND   R.isdefau
6640: 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  lt             -
6650: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 4e 54  - Restrict to NT
6660: 44 42 0a 09 20 20 20 20 41 4e 44 20 20 20 52 2e  DB..    AND   R.
6670: 64 62 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e  dbchild IS NOT N
6680: 55 4c 4c 20 20 20 2d 2d 20 61 6e 64 20 6c 61 73  ULL   -- and las
6690: 74 20 4e 54 44 42 20 62 65 6c 6f 6e 67 69 6e 67  t NTDB belonging
66a0: 20 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20 41   to trunk..    A
66b0: 4e 44 20 20 20 52 41 2e 72 69 64 20 3d 20 52 2e  ND   RA.rid = R.
66c0: 64 62 63 68 69 6c 64 20 20 20 20 20 20 2d 2d 20  dbchild      -- 
66d0: 47 6f 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  Go directly to t
66e0: 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 20 41  runk root..    A
66f0: 4e 44 20 20 20 52 41 2e 63 68 69 6c 64 20 49 53  ND   RA.child IS
6700: 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20   NOT NULL    -- 
6710: 48 61 73 20 70 72 69 6d 61 72 79 20 63 68 69 6c  Has primary chil
6720: 64 2e 0a 09 22 5d 20 7b 0a 09 20 20 20 20 23 20  d..."] {..    # 
6730: 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69 6e 67 20  Consider moving 
6740: 74 68 69 73 20 74 6f 20 74 68 65 20 69 6e 74 65  this to the inte
6750: 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e 0a 09 20  grity module... 
6760: 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 73     integrity ass
6770: 65 72 74 20 7b 24 72 69 64 20 21 3d 20 24 63 68  ert {$rid != $ch
6780: 69 6c 64 7d 20 7b 52 65 76 69 73 69 6f 6e 20 24  ild} {Revision $
6790: 72 69 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 69  rid depends on i
67a0: 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20 6c 61 70  tself.}..    lap
67b0: 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65  pend dependencie
67c0: 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64  s([list rev $rid
67d0: 5d 29 20 5b 6c 69 73 74 20 72 65 76 20 24 63 68  ]) [list rev $ch
67e0: 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 68  ild]..}..foreach
67f0: 20 7b 72 69 64 20 63 68 69 6c 64 7d 20 5b 73 74   {rid child} [st
6800: 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53  ate run "..    S
6810: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 54 2e 74  ELECT R.rid, T.t
6820: 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72  id..    FROM   r
6830: 65 76 69 73 69 6f 6e 20 52 2c 20 74 61 67 20 54  evision R, tag T
6840: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72  ..    WHERE  R.r
6850: 69 64 20 69 6e 20 24 74 68 65 73 65 74 0a 09 20  id in $theset.. 
6860: 20 20 20 41 4e 44 20 20 20 20 54 2e 72 65 76 20     AND    T.rev 
6870: 3d 20 52 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20  = R.rid.."] {.. 
6880: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e     lappend depen
6890: 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 65  dencies([list re
68a0: 76 20 24 72 69 64 5d 29 20 5b 6c 69 73 74 20 73  v $rid]) [list s
68b0: 79 6d 3a 3a 74 61 67 20 24 63 68 69 6c 64 5d 0a  ym::tag $child].
68c0: 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64  .}..foreach {rid
68d0: 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72   child} [state r
68e0: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54  un "..    SELECT
68f0: 20 52 2e 72 69 64 2c 20 42 2e 62 69 64 0a 09 20   R.rid, B.bid.. 
6900: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69     FROM   revisi
6910: 6f 6e 20 52 2c 20 62 72 61 6e 63 68 20 42 0a 09  on R, branch B..
6920: 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64      WHERE  R.rid
6930: 20 69 6e 20 24 74 68 65 73 65 74 0a 09 20 20 20   in $theset..   
6940: 20 41 4e 44 20 20 20 20 42 2e 72 6f 6f 74 20 3d   AND    B.root =
6950: 20 52 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20   R.rid.."] {..  
6960: 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64    lappend depend
6970: 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 65 76  encies([list rev
6980: 20 24 72 69 64 5d 29 20 5b 6c 69 73 74 20 73 79   $rid]) [list sy
6990: 6d 3a 3a 62 72 61 6e 63 68 20 24 63 68 69 6c 64  m::branch $child
69a0: 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20  ]..}..return.   
69b0: 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76   }..    # var(dv
69c0: 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d  ) = dict (item -
69d0: 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c 20  > list (item)), 
69e0: 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 79  item  = list (ty
69f0: 70 65 20 69 64 29 0a 20 20 20 20 74 79 70 65 6d  pe id).    typem
6a00: 65 74 68 6f 64 20 70 72 65 64 65 63 65 73 73 6f  ethod predecesso
6a10: 72 73 20 7b 64 76 20 72 65 76 69 73 69 6f 6e 73  rs {dv revisions
6a20: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76  } {..upvar 1 $dv
6a30: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 73   dependencies..s
6a40: 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69  et theset ('[joi
6a50: 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c  n $revisions {',
6a60: 27 7d 5d 27 29 0a 0a 09 23 20 54 68 65 20 66 6f  '}]')...# The fo
6a70: 6c 6c 6f 77 69 6e 67 20 63 61 73 65 73 20 73 70  llowing cases sp
6a80: 65 63 69 66 79 20 77 68 65 6e 20 61 20 72 65 76  ecify when a rev
6a90: 69 73 69 6f 6e 20 50 20 69 73 20 61 0a 09 23 20  ision P is a..# 
6aa0: 70 72 65 64 65 63 65 73 73 6f 72 20 6f 66 20 61  predecessor of a
6ab0: 20 72 65 76 69 73 69 6f 6e 20 52 2e 20 45 61 63   revision R. Eac
6ac0: 68 20 6f 66 20 74 68 65 20 63 61 73 65 73 20 74  h of the cases t
6ad0: 72 61 6e 73 6c 61 74 65 73 0a 09 23 20 69 6e 74  ranslates..# int
6ae0: 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 72 61  o one of the bra
6af0: 6e 63 68 65 73 20 6f 66 20 74 68 65 20 53 51 4c  nches of the SQL
6b00: 20 55 4e 49 4f 4e 20 63 6f 6d 69 6e 67 20 62 65   UNION coming be
6b10: 6c 6f 77 2e 0a 09 23 0a 09 23 20 28 31 29 20 54  low...#..# (1) T
6b20: 68 65 20 69 6d 6d 65 64 69 61 74 65 20 70 61 72  he immediate par
6b30: 65 6e 74 20 52 2e 70 61 72 65 6e 74 20 6f 66 20  ent R.parent of 
6b40: 52 20 69 73 20 61 20 70 72 65 64 65 63 65 73 73  R is a predecess
6b50: 6f 72 20 6f 66 0a 09 23 20 20 20 20 20 52 2e 20  or of..#     R. 
6b60: 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20 74 72  NOTE: This is tr
6b70: 75 65 20 66 6f 72 20 52 20 65 69 74 68 65 72 20  ue for R either 
6b80: 70 72 69 6d 61 72 79 20 6f 72 20 73 65 63 6f 6e  primary or secon
6b90: 64 61 72 79 0a 09 23 20 20 20 20 20 63 68 69 6c  dary..#     chil
6ba0: 64 20 6f 66 20 50 2e 20 49 74 20 6e 6f 74 20 6e  d of P. It not n
6bb0: 65 63 65 73 73 61 72 79 20 74 6f 20 64 69 73 74  ecessary to dist
6bc0: 69 6e 67 75 69 73 68 20 74 68 65 20 74 77 6f 0a  inguish the two.
6bd0: 09 23 20 20 20 20 20 63 61 73 65 73 2c 20 69 6e  .#     cases, in
6be0: 20 63 6f 6e 74 72 61 73 74 20 74 6f 20 74 68 65   contrast to the
6bf0: 20 63 6f 64 65 20 72 65 74 72 69 65 76 69 6e 67   code retrieving
6c00: 20 74 68 65 20 73 75 63 63 65 73 73 6f 72 0a 09   the successor..
6c10: 23 20 20 20 20 20 69 6e 66 6f 72 6d 61 74 69 6f  #     informatio
6c20: 6e 2e 0a 09 23 0a 09 23 20 28 32 29 20 54 68 65  n...#..# (2) The
6c30: 20 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 73   complement of s
6c40: 75 63 63 65 73 73 6f 72 20 63 61 73 65 20 28 33  uccessor case (3
6c50: 29 2e 20 54 68 65 20 74 72 75 6e 6b 20 72 6f 6f  ). The trunk roo
6c60: 74 20 69 73 0a 09 23 20 20 20 20 20 61 20 70 72  t is..#     a pr
6c70: 65 64 65 63 65 73 73 6f 72 20 6f 66 20 61 20 4e  edecessor of a N
6c80: 54 44 42 20 72 6f 6f 74 2e 20 52 45 4d 4f 56 45  TDB root. REMOVE
6c90: 44 2e 20 53 65 65 20 27 73 75 63 63 65 73 73 6f  D. See 'successo
6ca0: 72 73 27 0a 09 23 20 20 20 20 20 66 6f 72 20 74  rs'..#     for t
6cb0: 68 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a  he explanation..
6cc0: 09 23 0a 09 23 20 28 33 29 20 54 68 65 20 63 6f  .#..# (3) The co
6cd0: 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 73 75 63 63  mplement of succ
6ce0: 65 73 73 6f 72 20 63 61 73 65 20 28 34 29 2e 20  essor case (4). 
6cf0: 54 68 65 20 6c 61 73 74 20 4e 54 44 42 0a 09 23  The last NTDB..#
6d00: 20 20 20 20 20 72 65 76 69 73 69 6f 6e 20 62 65       revision be
6d10: 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 74  longing to the t
6d20: 72 75 6e 6b 20 69 73 20 61 20 70 72 65 64 65 63  runk is a predec
6d30: 65 73 73 6f 72 20 6f 66 20 74 68 65 0a 09 23 20  essor of the..# 
6d40: 20 20 20 20 70 72 69 6d 61 72 79 20 63 68 69 6c      primary chil
6d50: 64 20 6f 66 20 74 68 65 20 74 72 75 6e 6b 20 72  d of the trunk r
6d60: 6f 6f 74 20 28 54 68 65 20 27 31 2e 32 27 20 72  oot (The '1.2' r
6d70: 65 76 69 73 69 6f 6e 29 2e 0a 0a 09 66 6f 72 65  evision)....fore
6d80: 61 63 68 20 7b 72 69 64 20 70 61 72 65 6e 74 7d  ach {rid parent}
6d90: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 20 20   [state run ".  
6da0: 20 2d 2d 20 28 31 29 20 50 72 69 6d 61 72 79 20   -- (1) Primary 
6db0: 70 61 72 65 6e 74 2c 20 63 61 6e 20 62 65 20 69  parent, can be i
6dc0: 6e 20 64 69 66 66 65 72 65 6e 74 20 4c 4f 44 20  n different LOD 
6dd0: 66 6f 72 20 66 69 72 73 74 20 69 6e 20 61 20 62  for first in a b
6de0: 72 61 6e 63 68 0a 09 20 20 20 20 53 45 4c 45 43  ranch..    SELEC
6df0: 54 20 52 2e 72 69 64 2c 20 52 2e 70 61 72 65 6e  T R.rid, R.paren
6e00: 74 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65  t..    FROM   re
6e10: 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48  vision R..    WH
6e20: 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20  ERE  R.rid   IN 
6e30: 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52  $theset     -- R
6e40: 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73  estrict to revis
6e50: 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74  ions of interest
6e60: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 70  ..    AND    R.p
6e70: 61 72 65 6e 74 20 49 53 20 4e 4f 54 20 4e 55 4c  arent IS NOT NUL
6e80: 4c 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d 61  L   -- Has prima
6e90: 72 79 20 70 61 72 65 6e 74 0a 20 20 20 20 55 4e  ry parent.    UN
6ea0: 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 33 29 20 4c  ION.    -- (3) L
6eb0: 61 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e  ast NTDB on trun
6ec0: 6b 20 69 73 20 70 72 65 64 65 63 65 73 73 6f 72  k is predecessor
6ed0: 20 6f 66 20 63 68 69 6c 64 20 6f 66 20 74 72 75   of child of tru
6ee0: 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 20 53 45 4c  nk root..    SEL
6ef0: 45 43 54 20 52 2e 72 69 64 2c 20 52 41 2e 64 62  ECT R.rid, RA.db
6f00: 70 61 72 65 6e 74 0a 09 20 20 20 20 46 52 4f 4d  parent..    FROM
6f10: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72     revision R, r
6f20: 65 76 69 73 69 6f 6e 20 52 41 0a 09 20 20 20 20  evision RA..    
6f30: 57 48 45 52 45 20 20 52 2e 72 69 64 20 49 4e 20  WHERE  R.rid IN 
6f40: 24 74 68 65 73 65 74 20 20 20 20 20 20 20 20 20  $theset         
6f50: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72  -- Restrict to r
6f60: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65  evisions of inte
6f70: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
6f80: 20 4e 4f 54 20 52 2e 69 73 64 65 66 61 75 6c 74   NOT R.isdefault
6f90: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 6e 6f 74            -- not
6fa0: 20 6f 6e 20 4e 54 44 42 0a 09 20 20 20 20 41 4e   on NTDB..    AN
6fb0: 44 20 20 20 20 52 2e 70 61 72 65 6e 74 20 49 53  D    R.parent IS
6fc0: 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 20 2d 2d   NOT NULL     --
6fd0: 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 72   which are not r
6fe0: 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  oot..    AND    
6ff0: 52 41 2e 72 69 64 20 3d 20 52 2e 70 61 72 65 6e  RA.rid = R.paren
7000: 74 20 20 20 20 20 20 20 20 2d 2d 20 67 6f 20 74  t        -- go t
7010: 6f 20 74 68 65 69 72 20 70 61 72 65 6e 74 0a 09  o their parent..
7020: 20 20 20 20 41 4e 44 20 20 20 20 52 41 2e 64 62      AND    RA.db
7030: 70 61 72 65 6e 74 20 49 53 20 4e 4f 54 20 4e 55  parent IS NOT NU
7040: 4c 4c 20 20 2d 2d 20 77 68 69 63 68 20 68 61 73  LL  -- which has
7050: 20 74 6f 20 72 65 66 65 72 20 74 6f 20 4e 54 44   to refer to NTD
7060: 42 27 73 20 72 6f 6f 74 0a 09 22 5d 20 7b 0a 09  B's root.."] {..
7070: 20 20 20 20 23 20 43 6f 6e 73 69 64 65 72 20 6d      # Consider m
7080: 6f 76 69 6e 67 20 74 68 69 73 20 74 6f 20 74 68  oving this to th
7090: 65 20 69 6e 74 65 67 72 69 74 79 20 6d 6f 64 75  e integrity modu
70a0: 6c 65 2e 0a 09 20 20 20 20 69 6e 74 65 67 72 69  le...    integri
70b0: 74 79 20 61 73 73 65 72 74 20 7b 24 72 69 64 20  ty assert {$rid 
70c0: 21 3d 20 24 70 61 72 65 6e 74 7d 20 7b 52 65 76  != $parent} {Rev
70d0: 69 73 69 6f 6e 20 24 72 69 64 20 64 65 70 65 6e  ision $rid depen
70e0: 64 73 20 6f 6e 20 69 74 73 65 6c 66 2e 7d 0a 09  ds on itself.}..
70f0: 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65      lappend depe
7100: 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 72  ndencies([list r
7110: 65 76 20 24 72 69 64 5d 29 20 5b 6c 69 73 74 20  ev $rid]) [list 
7120: 72 65 76 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a  rev $parent]..}.
7130: 0a 09 23 20 54 68 65 20 72 65 76 69 73 69 6f 6e  ..# The revision
7140: 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65 20  s which are the 
7150: 66 69 72 73 74 20 6f 6e 20 61 20 62 72 61 6e 63  first on a branc
7160: 68 20 68 61 76 65 20 74 68 61 74 0a 09 23 20 62  h have that..# b
7170: 72 61 6e 63 68 20 61 73 20 74 68 65 69 72 20 70  ranch as their p
7180: 72 65 64 65 63 65 73 73 6f 72 2e 20 4e 6f 74 65  redecessor. Note
7190: 20 74 68 61 74 20 72 65 76 69 73 69 6f 6e 73 20   that revisions 
71a0: 63 61 6e 6e 6f 74 20 62 65 0a 09 23 20 6f 6e 20  cannot be..# on 
71b0: 74 61 67 73 20 69 6e 20 74 68 65 20 73 61 6d 65  tags in the same
71c0: 20 6d 61 6e 6e 65 72 2c 20 73 6f 20 74 61 67 73   manner, so tags
71d0: 20 63 61 6e 6e 6f 74 20 62 65 20 70 72 65 64 65   cannot be prede
71e0: 63 65 73 73 6f 72 73 0a 09 23 20 6f 66 20 72 65  cessors..# of re
71f0: 76 69 73 69 6f 6e 73 2e 20 54 68 69 73 20 63 6f  visions. This co
7200: 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 74  mplements that t
7210: 68 65 79 20 68 61 76 65 20 6e 6f 20 73 75 63 63  hey have no succ
7220: 65 73 73 6f 72 73 0a 09 23 20 28 53 65 65 20 73  essors..# (See s
7230: 79 6d 3a 3a 74 61 67 2f 73 75 63 63 65 73 73 6f  ym::tag/successo
7240: 72 73 29 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b  rs)....foreach {
7250: 72 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61  rid parent} [sta
7260: 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45  te run "..    SE
7270: 4c 45 43 54 20 52 2e 72 69 64 20 42 2e 62 69 64  LECT R.rid B.bid
7280: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76  ..    FROM   rev
7290: 69 73 69 6f 6e 20 52 2c 20 62 72 61 6e 63 68 20  ision R, branch 
72a0: 42 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e  B..    WHERE  R.
72b0: 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09  rid IN $theset..
72c0: 20 20 20 20 41 4e 44 20 20 20 20 42 2e 66 69 72      AND    B.fir
72d0: 73 74 20 3d 20 52 2e 72 69 64 0a 09 22 5d 20 7b  st = R.rid.."] {
72e0: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65  ..    lappend de
72f0: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74  pendencies([list
7300: 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c 69 73   rev $rid]) [lis
7310: 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 70  t sym::branch $p
7320: 61 72 65 6e 74 5d 0a 09 7d 0a 09 72 65 74 75 72  arent]..}..retur
7330: 6e 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23  n.    }.}..# # #
7340: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
7350: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
7360: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
7370: 23 23 23 23 23 23 23 23 0a 23 23 20 48 65 6c 70  ########.## Help
7380: 65 72 20 73 69 6e 67 6c 65 74 6f 6e 2e 20 43 6f  er singleton. Co
7390: 6d 6d 61 6e 64 73 20 66 6f 72 20 74 61 67 20 73  mmands for tag s
73a0: 79 6d 62 6f 6c 20 63 68 61 6e 67 65 73 65 74 73  ymbol changesets
73b0: 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20 3a 3a  ...snit::type ::
73c0: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f  vc::fossil::impo
73d0: 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74  rt::cvs::project
73e0: 3a 3a 72 65 76 3a 3a 73 79 6d 3a 3a 74 61 67 20  ::rev::sym::tag 
73f0: 7b 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  {.    typemethod
7400: 20 62 79 72 65 76 69 73 69 6f 6e 20 7b 7d 20 7b   byrevision {} {
7410: 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20   return 0 }.    
7420: 74 79 70 65 6d 65 74 68 6f 64 20 62 79 73 79 6d  typemethod bysym
7430: 62 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 74 75 72  bol   {} { retur
7440: 6e 20 31 20 7d 0a 20 20 20 20 74 79 70 65 6d 65  n 1 }.    typeme
7450: 74 68 6f 64 20 69 73 74 61 67 20 20 20 20 20 20  thod istag      
7460: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a  {} { return 1 }.
7470: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69      typemethod i
7480: 73 62 72 61 6e 63 68 20 20 20 7b 7d 20 7b 20 72  sbranch   {} { r
7490: 65 74 75 72 6e 20 30 20 7d 0a 0a 20 20 20 20 23  eturn 0 }..    #
74a0: 20 72 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 28   result = list (
74b0: 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74 69 6d 65  mintime, maxtime
74c0: 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ).    typemethod
74d0: 20 74 69 6d 65 72 61 6e 67 65 20 7b 74 61 67 73   timerange {tags
74e0: 7d 20 7b 0a 09 23 20 54 68 65 20 72 61 6e 67 65  } {..# The range
74f0: 20 69 73 20 64 65 66 69 6e 65 64 20 61 73 20 74   is defined as t
7500: 68 65 20 72 61 6e 67 65 20 6f 66 20 74 68 65 20  he range of the 
7510: 72 65 76 69 73 69 6f 6e 73 20 74 68 65 20 74 61  revisions the ta
7520: 67 73 0a 09 23 20 61 72 65 20 61 74 74 61 63 68  gs..# are attach
7530: 65 64 20 74 6f 2e 0a 0a 09 73 65 74 20 74 68 65  ed to....set the
7540: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 74 61 67  set ('[join $tag
7550: 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75  s {','}]')..retu
7560: 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a  rn [state run ".
7570: 09 20 20 20 20 53 45 4c 45 43 54 20 4d 49 4e 28  .    SELECT MIN(
7580: 52 2e 64 61 74 65 29 2c 20 4d 41 58 28 52 2e 64  R.date), MAX(R.d
7590: 61 74 65 29 0a 09 20 20 20 20 46 52 4f 4d 20 72  ate)..    FROM r
75a0: 65 76 69 73 69 6f 6e 20 52 2c 20 74 61 67 20 54  evision R, tag T
75b0: 0a 09 20 20 20 20 57 48 45 52 45 20 54 2e 74 69  ..    WHERE T.ti
75c0: 64 20 49 4e 20 24 74 68 65 73 65 74 0a 20 20 20  d IN $theset.   
75d0: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 52           AND   R
75e0: 2e 72 69 64 20 3d 20 54 2e 72 65 76 0a 09 22 5d  .rid = T.rev.."]
75f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61  .    }..    # va
7600: 72 28 64 76 29 20 3d 20 64 69 63 74 20 28 69 74  r(dv) = dict (it
7610: 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d  em -> list (item
7620: 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74  )), item  = list
7630: 20 28 74 79 70 65 20 69 64 29 0a 20 20 20 20 74   (type id).    t
7640: 79 70 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73  ypemethod succes
7650: 73 6f 72 73 20 7b 64 76 20 74 61 67 73 7d 20 7b  sors {dv tags} {
7660: 0a 09 23 20 54 61 67 73 20 68 61 76 65 20 6e 6f  ..# Tags have no
7670: 20 73 75 63 63 65 73 73 6f 72 73 2e 0a 09 72 65   successors...re
7680: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
7690: 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74  # var(dv) = dict
76a0: 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28   (item -> list (
76b0: 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20  item)), item  = 
76c0: 6c 69 73 74 20 28 74 79 70 65 20 69 64 29 0a 20  list (type id). 
76d0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 70 72     typemethod pr
76e0: 65 64 65 63 65 73 73 6f 72 73 20 7b 64 76 20 74  edecessors {dv t
76f0: 61 67 73 7d 20 7b 0a 09 23 20 54 68 65 20 70 72  ags} {..# The pr
7700: 65 64 65 63 65 73 73 6f 72 73 20 6f 66 20 61 20  edecessors of a 
7710: 74 61 67 20 61 72 65 20 61 6c 6c 20 74 68 65 20  tag are all the 
7720: 72 65 76 69 73 69 6f 6e 73 20 74 68 65 20 74 61  revisions the ta
7730: 67 73 20 61 72 65 0a 09 23 20 61 74 74 61 63 68  gs are..# attach
7740: 65 64 20 74 6f 2c 20 61 73 20 77 65 6c 6c 20 61  ed to, as well a
7750: 73 20 61 6c 6c 20 74 68 65 20 62 72 61 6e 63 68  s all the branch
7760: 65 73 20 6f 72 20 74 61 67 73 20 77 68 69 63 68  es or tags which
7770: 20 61 72 65 0a 09 23 20 74 68 65 69 72 20 70 72   are..# their pr
7780: 65 66 65 72 65 64 20 70 61 72 65 6e 74 73 2e 0a  efered parents..
7790: 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b  ..set theset ('[
77a0: 6a 6f 69 6e 20 24 74 61 67 73 20 7b 27 2c 27 7d  join $tags {','}
77b0: 5d 27 29 0a 09 66 6f 72 65 61 63 68 20 7b 74 69  ]')..foreach {ti
77c0: 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65  d parent} [state
77d0: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45   run "..    SELE
77e0: 43 54 20 54 2e 74 69 64 2c 20 52 2e 72 69 64 0a  CT T.tid, R.rid.
77f0: 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69  .    FROM   revi
7800: 73 69 6f 6e 20 52 2c 20 74 61 67 20 54 0a 09 20  sion R, tag T.. 
7810: 20 20 20 57 48 45 52 45 20 20 54 2e 74 69 64 20     WHERE  T.tid 
7820: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20  IN $theset..    
7830: 41 4e 44 20 20 20 20 54 2e 72 65 76 20 3d 20 52  AND    T.rev = R
7840: 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20  .rid.."] {..    
7850: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e  lappend dependen
7860: 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a  cies([list sym::
7870: 74 61 67 20 24 74 69 64 5d 29 20 5b 6c 69 73 74  tag $tid]) [list
7880: 20 72 65 76 20 24 70 61 72 65 6e 74 5d 0a 09 7d   rev $parent]..}
7890: 0a 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20  ...foreach {tid 
78a0: 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72  parent} [state r
78b0: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54  un "..    SELECT
78c0: 20 54 2e 74 69 64 2c 20 42 2e 62 69 64 0a 09 20   T.tid, B.bid.. 
78d0: 20 20 20 46 52 4f 4d 20 20 20 74 61 67 20 54 2c     FROM   tag T,
78e0: 20 62 72 61 6e 63 68 20 42 2c 20 70 72 65 66 65   branch B, prefe
78f0: 72 65 64 70 61 72 65 6e 74 20 50 0a 09 20 20 20  redparent P..   
7900: 20 57 48 45 52 45 20 20 54 2e 74 69 64 20 49 4e   WHERE  T.tid IN
7910: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e   $theset..    AN
7920: 44 20 20 20 20 54 2e 73 69 64 20 3d 20 50 2e 73  D    T.sid = P.s
7930: 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50  id..    AND    P
7940: 2e 70 69 64 20 3d 20 42 2e 73 69 64 0a 09 22 5d  .pid = B.sid.."]
7950: 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20   {..    lappend 
7960: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69  dependencies([li
7970: 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 74 69 64  st sym::tag $tid
7980: 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72  ]) [list sym::br
7990: 61 6e 63 68 20 24 70 61 72 65 6e 74 5d 0a 09 7d  anch $parent]..}
79a0: 0a 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20  ...foreach {tid 
79b0: 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72  parent} [state r
79c0: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54  un "..    SELECT
79d0: 20 54 2e 74 69 64 2c 20 54 58 2e 74 69 64 0a 09   T.tid, TX.tid..
79e0: 20 20 20 20 46 52 4f 4d 20 20 20 74 61 67 20 54      FROM   tag T
79f0: 2c 20 74 61 67 20 54 58 2c 20 70 72 65 66 65 72  , tag TX, prefer
7a00: 65 64 70 61 72 65 6e 74 20 50 0a 09 20 20 20 20  edparent P..    
7a10: 57 48 45 52 45 20 20 54 2e 74 69 64 20 49 4e 20  WHERE  T.tid IN 
7a20: 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44  $theset..    AND
7a30: 20 20 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 69      T.sid = P.si
7a40: 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e  d..    AND    P.
7a50: 70 69 64 20 3d 20 54 58 2e 73 69 64 0a 09 22 5d  pid = TX.sid.."]
7a60: 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20   {..    lappend 
7a70: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69  dependencies([li
7a80: 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 74 69 64  st sym::tag $tid
7a90: 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61  ]) [list sym::ta
7aa0: 67 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 72  g $parent]..}..r
7ab0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 7d 0a 0a 23  eturn.    }.}..#
7ac0: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20   # ## ### ##### 
7ad0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
7ae0: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
7af0: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20  ############.## 
7b00: 48 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e  Helper singleton
7b10: 2e 20 43 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 62  . Commands for b
7b20: 72 61 6e 63 68 20 73 79 6d 62 6f 6c 20 63 68 61  ranch symbol cha
7b30: 6e 67 65 73 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a  ngesets...snit::
7b40: 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69  type ::vc::fossi
7b50: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a  l::import::cvs::
7b60: 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 73 79  project::rev::sy
7b70: 6d 3a 3a 62 72 61 6e 63 68 20 7b 0a 20 20 20 20  m::branch {.    
7b80: 74 79 70 65 6d 65 74 68 6f 64 20 62 79 72 65 76  typemethod byrev
7b90: 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75 72  ision {} { retur
7ba0: 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65  n 0 }.    typeme
7bb0: 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 20  thod bysymbol   
7bc0: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a  {} { return 1 }.
7bd0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69      typemethod i
7be0: 73 74 61 67 20 20 20 20 20 20 7b 7d 20 7b 20 72  stag      {} { r
7bf0: 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79  eturn 0 }.    ty
7c00: 70 65 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63  pemethod isbranc
7c10: 68 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20  h   {} { return 
7c20: 31 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c  1 }..    # resul
7c30: 74 20 3d 20 6c 69 73 74 20 28 6d 69 6e 74 69 6d  t = list (mintim
7c40: 65 2c 20 6d 61 78 74 69 6d 65 29 0a 20 20 20 20  e, maxtime).    
7c50: 74 79 70 65 6d 65 74 68 6f 64 20 74 69 6d 65 72  typemethod timer
7c60: 61 6e 67 65 20 7b 62 72 61 6e 63 68 65 73 7d 20  ange {branches} 
7c70: 7b 0a 09 23 20 54 68 65 20 72 61 6e 67 65 20 6f  {..# The range o
7c80: 66 20 61 20 62 72 61 6e 63 68 20 69 73 20 64 65  f a branch is de
7c90: 66 69 6e 65 64 20 61 73 20 74 68 65 20 72 61 6e  fined as the ran
7ca0: 67 65 20 6f 66 20 74 68 65 0a 09 23 20 72 65 76  ge of the..# rev
7cb0: 69 73 69 6f 6e 73 20 74 68 65 20 62 72 61 6e 63  isions the branc
7cc0: 68 65 73 20 61 72 65 20 73 70 61 77 6e 65 64 20  hes are spawned 
7cd0: 62 79 2e 20 4e 4f 54 45 20 68 6f 77 65 76 65 72  by. NOTE however
7ce0: 20 74 68 61 74 20 74 68 65 0a 09 23 20 62 72 61   that the..# bra
7cf0: 6e 63 68 65 73 20 61 73 73 6f 63 69 61 74 65 64  nches associated
7d00: 20 77 69 74 68 20 61 20 64 65 74 61 63 68 65 64   with a detached
7d10: 20 4e 54 44 42 20 77 69 6c 6c 20 68 61 76 65 20   NTDB will have 
7d20: 6e 6f 20 72 6f 6f 74 0a 09 23 20 73 70 61 77 6e  no root..# spawn
7d30: 69 6e 67 20 74 68 65 6d 2c 20 68 65 6e 63 65 20  ing them, hence 
7d40: 74 68 65 79 20 68 61 76 65 20 6e 6f 20 72 65 61  they have no rea
7d50: 6c 20 74 69 6d 65 72 61 6e 67 65 20 61 6e 79 0a  l timerange any.
7d60: 09 23 20 6c 6f 6e 67 65 72 2e 20 42 79 20 75 73  .# longer. By us
7d70: 69 6e 67 20 30 20 77 65 20 70 75 74 20 74 68 65  ing 0 we put the
7d80: 6d 20 69 6e 20 66 72 6f 6e 74 20 6f 66 20 65 76  m in front of ev
7d90: 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2c 0a 09  erything else,..
7da0: 23 20 61 73 20 74 68 65 79 20 6c 6f 67 69 63 61  # as they logica
7db0: 6c 6c 79 20 61 72 65 2e 0a 0a 09 73 65 74 20 74  lly are....set t
7dc0: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62  heset ('[join $b
7dd0: 72 61 6e 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29  ranches {','}]')
7de0: 0a 09 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20  ..return [state 
7df0: 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43  run "..    SELEC
7e00: 54 20 49 46 4e 55 4c 4c 28 4d 49 4e 28 52 2e 64  T IFNULL(MIN(R.d
7e10: 61 74 65 29 2c 30 29 2c 20 49 46 4e 55 4c 4c 28  ate),0), IFNULL(
7e20: 4d 41 58 28 52 2e 64 61 74 65 29 2c 30 29 0a 09  MAX(R.date),0)..
7e30: 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f      FROM revisio
7e40: 6e 20 52 2c 20 62 72 61 6e 63 68 20 42 0a 09 20  n R, branch B.. 
7e50: 20 20 20 57 48 45 52 45 20 42 2e 62 69 64 20 49     WHERE B.bid I
7e60: 4e 20 24 74 68 65 73 65 74 0a 20 20 20 20 20 20  N $theset.      
7e70: 20 20 20 20 20 20 41 4e 44 20 20 20 52 2e 72 69        AND   R.ri
7e80: 64 20 3d 20 42 2e 72 6f 6f 74 0a 09 22 5d 0a 20  d = B.root.."]. 
7e90: 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28     }..    # var(
7ea0: 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d  dv) = dict (item
7eb0: 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29   -> list (item))
7ec0: 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28  , item  = list (
7ed0: 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 70  type id).    typ
7ee0: 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f  emethod successo
7ef0: 72 73 20 7b 64 76 20 62 72 61 6e 63 68 65 73 7d  rs {dv branches}
7f00: 20 7b 0a 09 23 20 54 68 65 20 66 69 72 73 74 20   {..# The first 
7f10: 72 65 76 69 73 69 6f 6e 20 63 6f 6d 6d 69 74 74  revision committ
7f20: 65 64 20 6f 6e 20 61 20 62 72 61 6e 63 68 2c 20  ed on a branch, 
7f30: 61 6e 64 20 61 6c 6c 20 62 72 61 6e 63 68 65 73  and all branches
7f40: 0a 09 23 20 61 6e 64 20 74 61 67 73 20 77 68 69  ..# and tags whi
7f50: 63 68 20 68 61 76 65 20 69 74 20 61 73 20 74 68  ch have it as th
7f60: 65 69 72 20 70 72 65 66 65 72 65 64 20 70 61 72  eir prefered par
7f70: 65 6e 74 20 61 72 65 20 74 68 65 0a 09 23 20 73  ent are the..# s
7f80: 75 63 63 65 73 73 6f 72 73 20 6f 66 20 61 20 62  uccessors of a b
7f90: 72 61 6e 63 68 2e 0a 0a 09 73 65 74 20 74 68 65  ranch....set the
7fa0: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61  set ('[join $bra
7fb0: 6e 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 09  nches {','}]')..
7fc0: 66 6f 72 65 61 63 68 20 7b 62 69 64 20 63 68 69  foreach {bid chi
7fd0: 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22  ld} [state run "
7fe0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62  ..    SELECT B.b
7ff0: 69 64 2c 20 52 2e 72 69 64 0a 09 20 20 20 20 46  id, R.rid..    F
8000: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52  ROM   revision R
8010: 2c 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20 20  , branch B..    
8020: 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20  WHERE  B.bid IN 
8030: 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44  $theset..    AND
8040: 20 20 20 20 42 2e 66 69 72 73 74 20 3d 20 52 2e      B.first = R.
8050: 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c  rid.."] {..    l
8060: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63  append dependenc
8070: 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 74  ies([list sym::t
8080: 61 67 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 20  ag $bid]) [list 
8090: 72 65 76 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09  rev $child]..}..
80a0: 66 6f 72 65 61 63 68 20 7b 62 69 64 20 63 68 69  foreach {bid chi
80b0: 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22  ld} [state run "
80c0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62  ..    SELECT B.b
80d0: 69 64 2c 20 42 58 2e 62 69 64 0a 09 20 20 20 20  id, BX.bid..    
80e0: 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c  FROM   branch B,
80f0: 20 62 72 61 6e 63 68 20 42 58 2c 20 70 72 65 66   branch BX, pref
8100: 65 72 65 64 70 61 72 65 6e 74 20 50 0a 09 20 20  eredparent P..  
8110: 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49    WHERE  B.bid I
8120: 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41  N $theset..    A
8130: 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50 2e  ND    B.sid = P.
8140: 70 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20  pid..    AND    
8150: 42 58 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a 09  BX.sid = P.sid..
8160: 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e  "] {..    lappen
8170: 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b  d dependencies([
8180: 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 62  list sym::tag $b
8190: 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a  id]) [list sym::
81a0: 62 72 61 6e 63 68 20 24 63 68 69 6c 64 5d 0a 09  branch $child]..
81b0: 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64 20  }..foreach {bid 
81c0: 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75  child} [state ru
81d0: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20  n "..    SELECT 
81e0: 42 2e 62 69 64 2c 20 54 2e 74 69 64 0a 09 20 20  B.bid, T.tid..  
81f0: 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20    FROM   branch 
8200: 42 2c 20 74 61 67 20 54 2c 20 70 72 65 66 65 72  B, tag T, prefer
8210: 65 64 70 61 72 65 6e 74 20 50 0a 09 20 20 20 20  edparent P..    
8220: 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20  WHERE  B.bid IN 
8230: 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44  $theset..    AND
8240: 20 20 20 20 42 2e 73 69 64 20 3d 20 50 2e 70 69      B.sid = P.pi
8250: 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 54 2e  d..    AND    T.
8260: 73 69 64 20 3d 20 50 2e 73 69 64 0a 09 22 5d 20  sid = P.sid.."] 
8270: 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64  {..    lappend d
8280: 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73  ependencies([lis
8290: 74 20 73 79 6d 3a 3a 74 61 67 20 24 62 69 64 5d  t sym::tag $bid]
82a0: 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67  ) [list sym::tag
82b0: 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 72 65 74   $child]..}..ret
82c0: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  urn.    }..    #
82d0: 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20   var(dv) = dict 
82e0: 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69  (item -> list (i
82f0: 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c  tem)), item  = l
8300: 69 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 20  ist (type id).  
8310: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 70 72 65    typemethod pre
8320: 64 65 63 65 73 73 6f 72 73 20 7b 64 76 20 62 72  decessors {dv br
8330: 61 6e 63 68 65 73 7d 20 7b 0a 09 23 20 54 68 65  anches} {..# The
8340: 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 6f 66   predecessors of
8350: 20 61 20 62 72 61 6e 63 68 20 61 72 65 20 61 6c   a branch are al
8360: 6c 20 74 68 65 20 72 65 76 69 73 69 6f 6e 73 20  l the revisions 
8370: 74 68 65 0a 09 23 20 62 72 61 6e 63 68 65 73 20  the..# branches 
8380: 61 72 65 20 73 70 61 77 6e 65 64 20 66 72 6f 6d  are spawned from
8390: 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 61 6c 6c  , as well as all
83a0: 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 6f 72   the branches or
83b0: 0a 09 23 20 74 61 67 73 20 77 68 69 63 68 20 61  ..# tags which a
83c0: 72 65 20 74 68 65 69 72 20 70 72 65 66 65 72 65  re their prefere
83d0: 64 20 70 61 72 65 6e 74 73 2e 0a 0a 09 73 65 74  d parents....set
83e0: 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20   theset ('[join 
83f0: 24 74 61 67 73 20 7b 27 2c 27 7d 5d 27 29 0a 09  $tags {','}]')..
8400: 66 6f 72 65 61 63 68 20 7b 62 69 64 20 70 61 72  foreach {bid par
8410: 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20  ent} [state run 
8420: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e  "..    SELECT B.
8430: 42 69 64 2c 20 52 2e 72 69 64 0a 09 20 20 20 20  Bid, R.rid..    
8440: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20  FROM   revision 
8450: 52 2c 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20  R, branch B..   
8460: 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e   WHERE  B.bid IN
8470: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e   $theset..    AN
8480: 44 20 20 20 20 42 2e 72 6f 6f 74 20 3d 20 52 2e  D    B.root = R.
8490: 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c  rid.."] {..    l
84a0: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63  append dependenc
84b0: 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62  ies([list sym::b
84c0: 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c 69  ranch $bid]) [li
84d0: 73 74 20 72 65 76 20 24 70 61 72 65 6e 74 5d 0a  st rev $parent].
84e0: 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64  .}..foreach {bid
84f0: 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20   parent} [state 
8500: 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43  run "..    SELEC
8510: 54 20 42 2e 62 69 64 2c 20 42 58 2e 62 69 64 0a  T B.bid, BX.bid.
8520: 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e  .    FROM   bran
8530: 63 68 20 42 2c 20 62 72 61 6e 63 68 20 42 58 2c  ch B, branch BX,
8540: 20 70 72 65 66 65 72 65 64 70 61 72 65 6e 74 20   preferedparent 
8550: 50 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e  P..    WHERE  B.
8560: 62 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09  bid IN $theset..
8570: 20 20 20 20 41 4e 44 20 20 20 20 42 2e 73 69 64      AND    B.sid
8580: 20 3d 20 50 2e 73 69 64 0a 09 20 20 20 20 41 4e   = P.sid..    AN
8590: 44 20 20 20 20 50 2e 70 69 64 20 3d 20 42 58 2e  D    P.pid = BX.
85a0: 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c  sid.."] {..    l
85b0: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63  append dependenc
85c0: 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62  ies([list sym::b
85d0: 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c 69  ranch $bid]) [li
85e0: 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24  st sym::branch $
85f0: 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 66 6f 72 65  parent]..}..fore
8600: 61 63 68 20 7b 62 69 64 20 70 61 72 65 6e 74 7d  ach {bid parent}
8610: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20   [state run ".. 
8620: 20 20 20 53 45 4c 45 43 54 20 42 2e 62 69 64 2c     SELECT B.bid,
8630: 20 54 2e 74 69 64 0a 09 20 20 20 20 46 52 4f 4d   T.tid..    FROM
8640: 20 20 20 62 72 61 6e 63 68 20 42 2c 20 74 61 67     branch B, tag
8650: 20 54 2c 20 70 72 65 66 65 72 65 64 70 61 72 65   T, preferedpare
8660: 6e 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 20  nt P..    WHERE 
8670: 20 42 2e 74 69 64 20 49 4e 20 24 74 68 65 73 65   B.tid IN $these
8680: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e  t..    AND    B.
8690: 73 69 64 20 3d 20 50 2e 73 69 64 0a 09 20 20 20  sid = P.sid..   
86a0: 20 41 4e 44 20 20 20 20 50 2e 70 69 64 20 3d 20   AND    P.pid = 
86b0: 54 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20  T.sid.."] {..   
86c0: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65   lappend depende
86d0: 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a  ncies([list sym:
86e0: 3a 62 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b  :branch $bid]) [
86f0: 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 70  list sym::tag $p
8700: 61 72 65 6e 74 5d 0a 09 7d 0a 09 72 65 74 75 72  arent]..}..retur
8710: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23  n.    }..    # #
8720: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23   ## ### ##### ##
8730: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
8740: 23 23 23 23 0a 20 20 20 20 23 23 20 43 6f 6e 66  ####.    ## Conf
8750: 69 67 75 72 61 74 69 6f 6e 0a 0a 20 20 20 20 70  iguration..    p
8760: 72 61 67 6d 61 20 2d 68 61 73 69 6e 73 74 61 6e  ragma -hasinstan
8770: 63 65 73 20 20 20 6e 6f 20 3b 20 23 20 73 69 6e  ces   no ; # sin
8780: 67 6c 65 74 6f 6e 0a 20 20 20 20 70 72 61 67 6d  gleton.    pragm
8790: 61 20 2d 68 61 73 74 79 70 65 69 6e 66 6f 20 20  a -hastypeinfo  
87a0: 20 20 6e 6f 20 3b 20 23 20 6e 6f 20 69 6e 74 72    no ; # no intr
87b0: 6f 73 70 65 63 74 69 6f 6e 0a 20 20 20 20 70 72  ospection.    pr
87c0: 61 67 6d 61 20 2d 68 61 73 74 79 70 65 64 65 73  agma -hastypedes
87d0: 74 72 6f 79 20 6e 6f 20 3b 20 23 20 69 6d 6d 6f  troy no ; # immo
87e0: 72 74 61 6c 0a 7d 0a 0a 23 20 23 20 23 23 20 23  rtal.}..# # ## #
87f0: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
8800: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20  # ############# 
8810: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8820: 23 23 23 23 23 0a 23 23 0a 0a 6e 61 6d 65 73 70  #####.##..namesp
8830: 61 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a 66  ace eval ::vc::f
8840: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63  ossil::import::c
8850: 76 73 3a 3a 70 72 6f 6a 65 63 74 20 7b 0a 20 20  vs::project {.  
8860: 20 20 6e 61 6d 65 73 70 61 63 65 20 65 78 70 6f    namespace expo
8870: 72 74 20 72 65 76 0a 20 20 20 20 6e 61 6d 65 73  rt rev.    names
8880: 70 61 63 65 20 65 76 61 6c 20 72 65 76 20 7b 0a  pace eval rev {.
8890: 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72  .namespace impor
88a0: 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a  t ::vc::fossil::
88b0: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61  import::cvs::sta
88c0: 74 65 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d  te..namespace im
88d0: 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69  port ::vc::fossi
88e0: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a  l::import::cvs::
88f0: 69 6e 74 65 67 72 69 74 79 0a 09 6e 61 6d 65 73  integrity..names
8900: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63  pace import ::vc
8910: 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69 73 63 3a 3a 2a  ::tools::misc::*
8920: 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f  ..namespace impo
8930: 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a  rt ::vc::tools::
8940: 74 72 6f 75 62 6c 65 0a 09 6e 61 6d 65 73 70 61  trouble..namespa
8950: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a  ce import ::vc::
8960: 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 6c 6f 67 20  tools::log..log 
8970: 72 65 67 69 73 74 65 72 20 63 73 65 74 73 0a 0a  register csets..
8980: 09 23 20 53 65 74 20 75 70 20 74 68 65 20 68 65  .# Set up the he
8990: 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 73 0a  lper singletons.
89a0: 09 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20  .namespace eval 
89b0: 72 65 76 20 7b 0a 09 20 20 20 20 6e 61 6d 65 73  rev {..    names
89c0: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63  pace import ::vc
89d0: 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74  ::fossil::import
89e0: 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09 20 20  ::cvs::state..  
89f0: 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f    namespace impo
8a00: 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a  rt ::vc::fossil:
8a10: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e  :import::cvs::in
8a20: 74 65 67 72 69 74 79 0a 09 7d 0a 09 6e 61 6d 65  tegrity..}..name
8a30: 73 70 61 63 65 20 65 76 61 6c 20 73 79 6d 3a 3a  space eval sym::
8a40: 74 61 67 20 7b 0a 09 20 20 20 20 6e 61 6d 65 73  tag {..    names
8a50: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63  pace import ::vc
8a60: 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74  ::fossil::import
8a70: 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09 20 20  ::cvs::state..  
8a80: 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f    namespace impo
8a90: 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a  rt ::vc::fossil:
8aa0: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e  :import::cvs::in
8ab0: 74 65 67 72 69 74 79 0a 09 7d 0a 09 6e 61 6d 65  tegrity..}..name
8ac0: 73 70 61 63 65 20 65 76 61 6c 20 73 79 6d 3a 3a  space eval sym::
8ad0: 62 72 61 6e 63 68 20 7b 0a 09 20 20 20 20 6e 61  branch {..    na
8ae0: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
8af0: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70  :vc::fossil::imp
8b00: 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a  ort::cvs::state.
8b10: 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69  .    namespace i
8b20: 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73  mport ::vc::foss
8b30: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a  il::import::cvs:
8b40: 3a 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a 20 20  :integrity..}.  
8b50: 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23    }.}..# # ## ##
8b60: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
8b70: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23   ############# #
8b80: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8b90: 23 23 23 23 0a 23 23 20 52 65 61 64 79 0a 0a 70  ####.## Ready..p
8ba0: 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20 76  ackage provide v
8bb0: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72  c::fossil::impor
8bc0: 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a  t::cvs::project:
8bd0: 3a 72 65 76 20 31 2e 30 0a 72 65 74 75 72 6e 0a  :rev 1.0.return.