Hex Artifact Content
Not logged in

Artifact 1c3ee2d5188aa2e6306886ff27eab1907d1d32a6:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [80b1e8936f] - Renamed state table 'csrevision' to 'csitem' to reflect the new internals of changesets. Updated all places where it is used. by aku on 2007-11-29 09:16:33.

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 69 74 65  cstype srcid ite
05c0: 6d 73 20 7b 74 68 65 69 64 20 7b 7d 7d 7d 20 7b  ms {theid {}}} {
05d0: 0a 09 69 66 20 7b 24 74 68 65 69 64 20 6e 65 20  ..if {$theid ne 
05e0: 22 22 7d 20 7b 0a 09 20 20 20 20 73 65 74 20 6d  ""} {..    set m
05f0: 79 69 64 20 24 74 68 65 69 64 0a 09 7d 20 65 6c  yid $theid..} el
0600: 73 65 20 7b 0a 09 20 20 20 20 73 65 74 20 6d 79  se {..    set my
0610: 69 64 20 5b 69 6e 63 72 20 6d 79 63 6f 75 6e 74  id [incr mycount
0620: 65 72 5d 0a 09 7d 0a 0a 09 69 6e 74 65 67 72 69  er]..}...integri
0630: 74 79 20 61 73 73 65 72 74 20 7b 5b 69 6e 66 6f  ty assert {[info
0640: 20 65 78 69 73 74 73 20 6d 79 63 73 74 79 70 65   exists mycstype
0650: 28 24 63 73 74 79 70 65 29 5d 7d 20 7b 42 61 64  ($cstype)]} {Bad
0660: 20 63 68 61 6e 67 65 73 65 74 20 74 79 70 65 20   changeset type 
0670: 27 24 63 73 74 79 70 65 27 2e 7d 0a 0a 09 73 65  '$cstype'.}...se
0680: 74 20 6d 79 70 72 6f 6a 65 63 74 20 20 20 24 70  t myproject   $p
0690: 72 6f 6a 65 63 74 0a 09 73 65 74 20 6d 79 74 79  roject..set myty
06a0: 70 65 20 20 20 20 20 20 24 63 73 74 79 70 65 0a  pe      $cstype.
06b0: 09 73 65 74 20 6d 79 74 79 70 65 6f 62 6a 20 20  .set mytypeobj  
06c0: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
06d0: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a  mport::cvs::proj
06e0: 65 63 74 3a 3a 72 65 76 3a 3a 24 7b 63 73 74 79  ect::rev::${csty
06f0: 70 65 7d 0a 09 73 65 74 20 6d 79 73 72 63 69 64  pe}..set mysrcid
0700: 09 24 73 72 63 69 64 0a 09 73 65 74 20 6d 79 69  .$srcid..set myi
0710: 74 65 6d 73 20 20 20 20 20 24 69 74 65 6d 73 0a  tems     $items.
0720: 09 73 65 74 20 6d 79 70 6f 73 20 20 20 20 20 20  .set mypos      
0730: 20 7b 7d 20 3b 20 23 20 43 6f 6d 6d 69 74 20 6c   {} ; # Commit l
0740: 6f 63 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20 6b  ocation is not k
0750: 6e 6f 77 6e 20 79 65 74 2e 0a 0a 09 23 20 4b 65  nown yet....# Ke
0760: 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ep track of the 
0770: 67 65 6e 65 72 61 74 65 64 20 63 68 61 6e 67 65  generated change
0780: 73 65 74 73 20 61 6e 64 20 6f 66 20 74 68 65 20  sets and of the 
0790: 69 6e 76 65 72 73 65 0a 09 23 20 6d 61 70 70 69  inverse..# mappi
07a0: 6e 67 20 66 72 6f 6d 20 69 74 65 6d 73 20 74 6f  ng from items to
07b0: 20 74 68 65 6d 2e 0a 09 6c 61 70 70 65 6e 64 20   them...lappend 
07c0: 6d 79 63 68 61 6e 67 65 73 65 74 73 20 20 20 24  mychangesets   $
07d0: 73 65 6c 66 0a 09 73 65 74 20 20 20 20 20 6d 79  self..set     my
07e0: 69 64 6d 61 70 28 24 6d 79 69 64 29 20 24 73 65  idmap($myid) $se
07f0: 6c 66 0a 09 66 6f 72 65 61 63 68 20 69 69 64 20  lf..foreach iid 
0800: 24 69 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65  $items {..    se
0810: 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 63 73 74  t key [list $cst
0820: 79 70 65 20 24 69 69 64 5d 0a 09 20 20 20 20 73  ype $iid]..    s
0830: 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24 6b 65  et myitemmap($ke
0840: 79 29 20 24 73 65 6c 66 0a 09 20 20 20 20 6c 61  y) $self..    la
0850: 70 70 65 6e 64 20 6d 79 74 69 74 65 6d 73 20 24  ppend mytitems $
0860: 6b 65 79 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20  key..}..return. 
0870: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64     }..    method
0880: 20 73 74 72 20 7b 7d 20 7b 0a 09 73 65 74 20 73   str {} {..set s
0890: 74 72 20 20 20 20 22 3c 22 0a 09 73 65 74 20 64  tr    "<"..set d
08a0: 65 74 61 69 6c 20 22 22 0a 09 69 66 20 7b 5b 24  etail ""..if {[$
08b0: 6d 79 74 79 70 65 6f 62 6a 20 62 79 73 79 6d 62  mytypeobj bysymb
08c0: 6f 6c 5d 7d 20 7b 0a 09 20 20 20 20 73 65 74 20  ol]} {..    set 
08d0: 64 65 74 61 69 6c 20 22 20 27 5b 73 74 61 74 65  detail " '[state
08e0: 20 6f 6e 65 20 7b 0a 09 09 53 45 4c 45 43 54 20   one {...SELECT 
08f0: 53 2e 6e 61 6d 65 0a 09 09 46 52 4f 4d 20 20 20  S.name...FROM   
0900: 73 79 6d 62 6f 6c 20 53 0a 09 09 57 48 45 52 45  symbol S...WHERE
0910: 20 20 53 2e 73 69 64 20 3d 20 24 6d 79 73 72 63    S.sid = $mysrc
0920: 69 64 0a 09 20 20 20 20 7d 5d 27 22 0a 09 7d 0a  id..    }]'"..}.
0930: 09 61 70 70 65 6e 64 20 73 74 72 20 22 24 6d 79  .append str "$my
0940: 74 79 70 65 20 24 7b 6d 79 69 64 7d 24 7b 64 65  type ${myid}${de
0950: 74 61 69 6c 7d 3e 22 0a 09 72 65 74 75 72 6e 20  tail}>"..return 
0960: 24 73 74 72 0a 20 20 20 20 7d 0a 0a 20 20 20 20  $str.    }..    
0970: 6d 65 74 68 6f 64 20 69 64 20 20 20 20 7b 7d 20  method id    {} 
0980: 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 64 20 7d  { return $myid }
0990: 0a 20 20 20 20 6d 65 74 68 6f 64 20 69 74 65 6d  .    method item
09a0: 73 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d  s {} { return $m
09b0: 79 74 69 74 65 6d 73 20 7d 0a 20 20 20 20 6d 65  ytitems }.    me
09c0: 74 68 6f 64 20 64 61 74 61 20 20 7b 7d 20 7b 20  thod data  {} { 
09d0: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 6d 79  return [list $my
09e0: 70 72 6f 6a 65 63 74 20 24 6d 79 74 79 70 65 20  project $mytype 
09f0: 24 6d 79 73 72 63 69 64 5d 20 7d 0a 0a 20 20 20  $mysrcid] }..   
0a00: 20 64 65 6c 65 67 61 74 65 20 6d 65 74 68 6f 64   delegate method
0a10: 20 62 79 73 79 6d 62 6f 6c 20 20 20 74 6f 20 6d   bysymbol   to m
0a20: 79 74 79 70 65 6f 62 6a 0a 20 20 20 20 64 65 6c  ytypeobj.    del
0a30: 65 67 61 74 65 20 6d 65 74 68 6f 64 20 62 79 72  egate method byr
0a40: 65 76 69 73 69 6f 6e 20 74 6f 20 6d 79 74 79 70  evision to mytyp
0a50: 65 6f 62 6a 0a 20 20 20 20 64 65 6c 65 67 61 74  eobj.    delegat
0a60: 65 20 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63  e method isbranc
0a70: 68 20 20 20 74 6f 20 6d 79 74 79 70 65 6f 62 6a  h   to mytypeobj
0a80: 0a 20 20 20 20 64 65 6c 65 67 61 74 65 20 6d 65  .    delegate me
0a90: 74 68 6f 64 20 69 73 74 61 67 20 20 20 20 20 20  thod istag      
0aa0: 74 6f 20 6d 79 74 79 70 65 6f 62 6a 0a 0a 20 20  to mytypeobj..  
0ab0: 20 20 6d 65 74 68 6f 64 20 73 65 74 70 6f 73 20    method setpos 
0ac0: 7b 70 7d 20 7b 20 73 65 74 20 6d 79 70 6f 73 20  {p} { set mypos 
0ad0: 24 70 20 3b 20 72 65 74 75 72 6e 20 7d 0a 20 20  $p ; return }.  
0ae0: 20 20 6d 65 74 68 6f 64 20 70 6f 73 20 20 20 20    method pos    
0af0: 7b 7d 20 20 7b 20 72 65 74 75 72 6e 20 24 6d 79  {}  { return $my
0b00: 70 6f 73 20 7d 0a 0a 20 20 20 20 23 20 72 65 73  pos }..    # res
0b10: 75 6c 74 20 3d 20 64 69 63 74 20 28 69 74 65 6d  ult = dict (item
0b20: 20 2d 3e 20 6c 69 73 74 20 28 63 68 61 6e 67 65   -> list (change
0b30: 73 65 74 29 29 0a 20 20 20 20 6d 65 74 68 6f 64  set)).    method
0b40: 20 73 75 63 63 65 73 73 6f 72 6d 61 70 20 7b 7d   successormap {}
0b50: 20 7b 0a 09 23 20 4e 4f 54 45 20 2f 20 46 55 54   {..# NOTE / FUT
0b60: 55 52 45 3a 20 50 6f 73 73 69 62 6c 65 20 62 6f  URE: Possible bo
0b70: 74 74 6c 65 6e 65 63 6b 2e 0a 09 61 72 72 61 79  ttleneck...array
0b80: 20 73 65 74 20 74 6d 70 20 7b 7d 0a 09 66 6f 72   set tmp {}..for
0b90: 65 61 63 68 20 7b 72 65 76 20 63 68 69 6c 64 72  each {rev childr
0ba0: 65 6e 7d 20 5b 24 73 65 6c 66 20 6e 65 78 74 6d  en} [$self nextm
0bb0: 61 70 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65 61  ap] {..    forea
0bc0: 63 68 20 63 68 69 6c 64 20 24 63 68 69 6c 64 72  ch child $childr
0bd0: 65 6e 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 74  en {...lappend t
0be0: 6d 70 28 24 72 65 76 29 20 24 6d 79 69 74 65 6d  mp($rev) $myitem
0bf0: 6d 61 70 28 24 63 68 69 6c 64 29 0a 09 20 20 20  map($child)..   
0c00: 20 7d 0a 09 20 20 20 20 73 65 74 20 74 6d 70 28   }..    set tmp(
0c10: 24 72 65 76 29 20 5b 6c 73 6f 72 74 20 2d 75 6e  $rev) [lsort -un
0c20: 69 71 75 65 20 24 74 6d 70 28 24 72 65 76 29 5d  ique $tmp($rev)]
0c30: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b 61 72 72  ..}..return [arr
0c40: 61 79 20 67 65 74 20 74 6d 70 5d 0a 20 20 20 20  ay get tmp].    
0c50: 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20  }..    # result 
0c60: 3d 20 6c 69 73 74 20 28 63 68 61 6e 67 65 73 65  = list (changese
0c70: 74 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 75  t).    method su
0c80: 63 63 65 73 73 6f 72 73 20 7b 7d 20 7b 0a 09 23  ccessors {} {..#
0c90: 20 4e 4f 54 45 20 2f 20 46 55 54 55 52 45 3a 20   NOTE / FUTURE: 
0ca0: 50 6f 73 73 69 62 6c 65 20 62 6f 74 74 6c 65 6e  Possible bottlen
0cb0: 65 63 6b 2e 0a 09 73 65 74 20 63 73 65 74 73 20  eck...set csets 
0cc0: 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 5f 20 63  {}..foreach {_ c
0cd0: 68 69 6c 64 72 65 6e 7d 20 5b 24 73 65 6c 66 20  hildren} [$self 
0ce0: 6e 65 78 74 6d 61 70 5d 20 7b 0a 09 20 20 20 20  nextmap] {..    
0cf0: 66 6f 72 65 61 63 68 20 63 68 69 6c 64 20 24 63  foreach child $c
0d00: 68 69 6c 64 72 65 6e 20 7b 0a 09 09 6c 61 70 70  hildren {...lapp
0d10: 65 6e 64 20 63 73 65 74 73 20 24 6d 79 69 74 65  end csets $myite
0d20: 6d 6d 61 70 28 24 63 68 69 6c 64 29 0a 09 20 20  mmap($child)..  
0d30: 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b    }..}..return [
0d40: 6c 73 6f 72 74 20 2d 75 6e 69 71 75 65 20 24 63  lsort -unique $c
0d50: 73 65 74 73 5d 0a 20 20 20 20 7d 0a 0a 20 20 20  sets].    }..   
0d60: 20 23 20 72 65 73 75 6c 74 20 3d 20 64 69 63 74   # result = dict
0d70: 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28   (item -> list (
0d80: 63 68 61 6e 67 65 73 65 74 29 29 0a 20 20 20 20  changeset)).    
0d90: 6d 65 74 68 6f 64 20 70 72 65 64 65 63 65 73 73  method predecess
0da0: 6f 72 6d 61 70 20 7b 7d 20 7b 0a 09 23 20 4e 4f  ormap {} {..# NO
0db0: 54 45 20 2f 20 46 55 54 55 52 45 3a 20 50 6f 73  TE / FUTURE: Pos
0dc0: 73 69 62 6c 65 20 62 6f 74 74 6c 65 6e 65 63 6b  sible bottleneck
0dd0: 2e 0a 09 61 72 72 61 79 20 73 65 74 20 74 6d 70  ...array set tmp
0de0: 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 65   {}..foreach {re
0df0: 76 20 63 68 69 6c 64 72 65 6e 7d 20 5b 24 73 65  v children} [$se
0e00: 6c 66 20 70 72 65 6d 61 70 5d 20 7b 0a 09 20 20  lf premap] {..  
0e10: 20 20 66 6f 72 65 61 63 68 20 63 68 69 6c 64 20    foreach child 
0e20: 24 63 68 69 6c 64 72 65 6e 20 7b 0a 09 09 6c 61  $children {...la
0e30: 70 70 65 6e 64 20 74 6d 70 28 24 72 65 76 29 20  ppend tmp($rev) 
0e40: 24 6d 79 69 74 65 6d 6d 61 70 28 24 63 68 69 6c  $myitemmap($chil
0e50: 64 29 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73  d)..    }..    s
0e60: 65 74 20 74 6d 70 28 24 72 65 76 29 20 5b 6c 73  et tmp($rev) [ls
0e70: 6f 72 74 20 2d 75 6e 69 71 75 65 20 24 74 6d 70  ort -unique $tmp
0e80: 28 24 72 65 76 29 5d 0a 09 7d 0a 09 72 65 74 75  ($rev)]..}..retu
0e90: 72 6e 20 5b 61 72 72 61 79 20 67 65 74 20 74 6d  rn [array get tm
0ea0: 70 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  p].    }..    # 
0eb0: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74  item -> list (it
0ec0: 65 6d 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 6e  em).    method n
0ed0: 65 78 74 6d 61 70 20 7b 7d 20 7b 0a 09 69 66 20  extmap {} {..if 
0ee0: 7b 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 6e 65 78  {[llength $mynex
0ef0: 74 6d 61 70 5d 7d 20 7b 20 72 65 74 75 72 6e 20  tmap]} { return 
0f00: 24 6d 79 6e 65 78 74 6d 61 70 20 7d 0a 09 24 6d  $mynextmap }..$m
0f10: 79 74 79 70 65 6f 62 6a 20 73 75 63 63 65 73 73  ytypeobj success
0f20: 6f 72 73 20 74 6d 70 20 24 6d 79 69 74 65 6d 73  ors tmp $myitems
0f30: 0a 09 73 65 74 20 6d 79 6e 65 78 74 6d 61 70 20  ..set mynextmap 
0f40: 5b 61 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a  [array get tmp].
0f50: 09 72 65 74 75 72 6e 20 24 6d 79 6e 65 78 74 6d  .return $mynextm
0f60: 61 70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  ap.    }..    # 
0f70: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74  item -> list (it
0f80: 65 6d 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 70  em).    method p
0f90: 72 65 6d 61 70 20 7b 7d 20 7b 0a 09 69 66 20 7b  remap {} {..if {
0fa0: 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 70 72 65 6d  [llength $myprem
0fb0: 61 70 5d 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d  ap]} { return $m
0fc0: 79 70 72 65 6d 61 70 20 7d 0a 09 24 6d 79 74 79  ypremap }..$myty
0fd0: 70 65 6f 62 6a 20 70 72 65 64 65 63 65 73 73 6f  peobj predecesso
0fe0: 72 73 20 74 6d 70 20 24 6d 79 69 74 65 6d 73 0a  rs tmp $myitems.
0ff0: 09 73 65 74 20 6d 79 70 72 65 6d 61 70 20 5b 61  .set mypremap [a
1000: 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 09 72  rray get tmp]..r
1010: 65 74 75 72 6e 20 24 6d 79 70 72 65 6d 61 70 0a  eturn $mypremap.
1020: 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f      }..    metho
1030: 64 20 62 72 65 61 6b 69 6e 74 65 72 6e 61 6c 64  d breakinternald
1040: 65 70 65 6e 64 65 6e 63 69 65 73 20 7b 7d 20 7b  ependencies {} {
1050: 0a 09 23 20 54 68 69 73 20 6d 65 74 68 6f 64 20  ..# This method 
1060: 69 6e 73 70 65 63 74 73 20 74 68 65 20 63 68 61  inspects the cha
1070: 6e 67 65 73 65 74 73 20 66 6f 72 20 69 6e 74 65  ngesets for inte
1080: 72 6e 61 6c 0a 09 23 20 64 65 70 65 6e 64 65 6e  rnal..# dependen
1090: 63 69 65 73 2e 20 4e 6f 74 68 69 6e 67 20 69 73  cies. Nothing is
10a0: 20 64 6f 6e 65 20 69 66 20 74 68 65 72 65 20 61   done if there a
10b0: 72 65 20 6e 6f 0a 09 23 20 73 75 63 68 2e 20 4f  re no..# such. O
10c0: 74 68 65 72 77 69 73 65 20 74 68 65 20 63 68 61  therwise the cha
10d0: 6e 67 65 73 65 74 20 69 73 20 73 70 6c 69 74 20  ngeset is split 
10e0: 69 6e 74 6f 20 61 20 73 65 74 20 6f 66 0a 09 23  into a set of..#
10f0: 20 66 72 61 67 6d 65 6e 74 73 20 77 69 74 68 6f   fragments witho
1100: 75 74 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65  ut internal depe
1110: 6e 64 65 6e 63 69 65 73 2c 20 74 72 61 6e 73 66  ndencies, transf
1120: 6f 72 6d 69 6e 67 20 74 68 65 0a 09 23 20 69 6e  orming the..# in
1130: 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63  ternal dependenc
1140: 69 65 73 20 69 6e 74 6f 20 65 78 74 65 72 6e 61  ies into externa
1150: 6c 20 6f 6e 65 73 2e 20 54 68 65 20 6e 65 77 20  l ones. The new 
1160: 63 68 61 6e 67 65 73 65 74 73 0a 09 23 20 61 72  changesets..# ar
1170: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c  e added to the l
1180: 69 73 74 20 6f 66 20 61 6c 6c 20 63 68 61 6e 67  ist of all chang
1190: 65 73 65 74 73 2e 0a 0a 09 23 20 57 65 20 70 65  esets....# We pe
11a0: 72 66 6f 72 6d 20 61 6c 6c 20 6e 65 63 65 73 73  rform all necess
11b0: 61 72 79 20 73 70 6c 69 74 73 20 69 6e 20 6f 6e  ary splits in on
11c0: 65 20 67 6f 2c 20 69 6e 73 74 65 61 64 20 6f 66  e go, instead of
11d0: 20 6f 6e 6c 79 0a 09 23 20 6f 6e 65 2e 20 54 68   only..# one. Th
11e0: 65 20 70 72 65 76 69 6f 75 73 20 61 6c 67 6f 72  e previous algor
11f0: 69 74 68 6d 2c 20 61 64 61 70 74 65 64 20 66 72  ithm, adapted fr
1200: 6f 6d 20 63 76 73 32 73 76 6e 2c 20 63 6f 6d 70  om cvs2svn, comp
1210: 75 74 65 64 0a 09 23 20 61 20 6c 6f 74 20 6f 66  uted..# a lot of
1220: 20 73 74 61 74 65 20 77 68 69 63 68 20 77 61 73   state which was
1230: 20 74 68 72 6f 77 6e 20 61 77 61 79 20 61 6e 64   thrown away and
1240: 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 64 20 61   then computed a
1250: 67 61 69 6e 0a 09 23 20 66 6f 72 20 65 61 63 68  gain..# for each
1260: 20 6f 66 20 74 68 65 20 66 72 61 67 6d 65 6e 74   of the fragment
1270: 73 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  s. It should be 
1280: 65 61 73 69 65 72 20 74 6f 20 75 70 64 61 74 65  easier to update
1290: 20 61 6e 64 0a 09 23 20 72 65 75 73 65 20 74 68   and..# reuse th
12a0: 61 74 20 73 74 61 74 65 2e 0a 0a 09 23 20 54 68  at state....# Th
12b0: 65 20 63 6f 64 65 20 63 68 65 63 6b 73 20 6f 6e  e code checks on
12c0: 6c 79 20 73 75 63 65 73 73 6f 72 20 64 65 70 65  ly sucessor depe
12d0: 6e 64 65 6e 63 69 65 73 2c 20 61 73 20 74 68 69  ndencies, as thi
12e0: 73 0a 09 23 20 61 75 74 6f 6d 61 74 69 63 61 6c  s..# automatical
12f0: 6c 79 20 63 6f 76 65 72 73 20 74 68 65 20 70 72  ly covers the pr
1300: 65 64 65 63 65 73 73 6f 72 20 64 65 70 65 6e 64  edecessor depend
1310: 65 6e 63 69 65 73 20 61 73 20 77 65 6c 6c 20 28  encies as well (
1320: 41 0a 09 23 20 73 75 63 63 65 73 73 6f 72 20 64  A..# successor d
1330: 65 70 65 6e 64 65 6e 63 79 20 61 20 2d 3e 20 62  ependency a -> b
1340: 20 69 73 20 61 6c 73 6f 20 61 20 70 72 65 64 65   is also a prede
1350: 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63  cessor dependenc
1360: 79 0a 09 23 20 62 20 2d 3e 20 61 29 2e 0a 0a 09  y..# b -> a)....
1370: 23 20 41 72 72 61 79 20 6f 66 20 64 65 70 65 6e  # Array of depen
1380: 64 65 6e 63 69 65 73 20 28 70 61 72 65 6e 74 20  dencies (parent 
1390: 2d 3e 20 63 68 69 6c 64 29 2e 20 54 68 69 73 20  -> child). This 
13a0: 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 0a 09  is pulled from..
13b0: 23 20 74 68 65 20 73 74 61 74 65 2c 20 61 6e 64  # the state, and
13c0: 20 6c 69 6d 69 74 65 64 20 74 6f 20 73 75 63 63   limited to succ
13d0: 65 73 73 6f 72 73 20 77 69 74 68 69 6e 20 74 68  essors within th
13e0: 65 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 61  e changeset....a
13f0: 72 72 61 79 20 73 65 74 20 64 65 70 65 6e 64 65  rray set depende
1400: 6e 63 69 65 73 20 7b 7d 0a 09 24 6d 79 74 79 70  ncies {}..$mytyp
1410: 65 6f 62 6a 20 69 6e 74 65 72 6e 61 6c 73 75 63  eobj internalsuc
1420: 63 65 73 73 6f 72 73 20 64 65 70 65 6e 64 65 6e  cessors dependen
1430: 63 69 65 73 20 24 6d 79 69 74 65 6d 73 0a 09 69  cies $myitems..i
1440: 66 20 7b 21 5b 61 72 72 61 79 20 73 69 7a 65 20  f {![array size 
1450: 64 65 70 65 6e 64 65 6e 63 69 65 73 5d 7d 20 7b  dependencies]} {
1460: 72 65 74 75 72 6e 20 30 7d 20 3b 20 23 20 4e 6f  return 0} ; # No
1470: 74 68 69 6e 67 20 74 6f 20 62 72 65 61 6b 2e 0a  thing to break..
1480: 0a 09 6c 6f 67 20 77 72 69 74 65 20 35 20 63 73  ..log write 5 cs
1490: 65 74 73 20 2e 2e 2e 5b 24 73 65 6c 66 20 73 74  ets ...[$self st
14a0: 72 5d 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  r]..............
14b0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
14c0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
14d0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 0a 0a 09 23 20 57 65  ............# We
14e0: 20 68 61 76 65 20 69 6e 74 65 72 6e 61 6c 20 64   have internal d
14f0: 65 70 65 6e 64 65 6e 63 69 65 73 20 74 6f 20 62  ependencies to b
1500: 72 65 61 6b 2e 20 57 65 20 6e 6f 77 20 69 74 65  reak. We now ite
1510: 72 61 74 65 20 6f 76 65 72 0a 09 23 20 61 6c 6c  rate over..# all
1520: 20 70 6f 73 69 74 69 6f 6e 73 20 69 6e 20 74 68   positions in th
1530: 65 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73  e list (which is
1540: 20 63 68 72 6f 6e 6f 6c 6f 67 69 63 61 6c 2c 20   chronological, 
1550: 61 74 20 6c 65 61 73 74 0a 09 23 20 61 73 20 66  at least..# as f
1560: 61 72 20 61 73 20 74 68 65 20 74 69 6d 65 73 74  ar as the timest
1570: 61 6d 70 73 20 61 72 65 20 63 6f 72 72 65 63 74  amps are correct
1580: 20 61 6e 64 20 75 6e 69 71 75 65 29 20 61 6e 64   and unique) and
1590: 0a 09 23 20 64 65 74 65 72 6d 69 6e 65 20 74 68  ..# determine th
15a0: 65 20 62 65 73 74 20 70 6f 73 69 74 69 6f 6e 20  e best position 
15b0: 66 6f 72 20 74 68 65 20 62 72 65 61 6b 2c 20 62  for the break, b
15c0: 79 20 74 72 79 69 6e 67 20 74 6f 0a 09 23 20 62  y trying to..# b
15d0: 72 65 61 6b 20 61 73 20 6d 61 6e 79 20 64 65 70  reak as many dep
15e0: 65 6e 64 65 6e 63 69 65 73 20 61 73 20 70 6f 73  endencies as pos
15f0: 73 69 62 6c 65 20 69 6e 20 6f 6e 65 20 67 6f 2e  sible in one go.
1600: 20 57 68 65 6e 20 61 0a 09 23 20 62 72 65 61 6b   When a..# break
1610: 20 77 61 73 20 66 6f 75 6e 64 20 74 68 69 73 20   was found this 
1620: 69 73 20 72 65 64 6f 6e 65 20 66 6f 72 20 74 68  is redone for th
1630: 65 20 66 72 61 67 6d 65 6e 74 73 20 63 6f 6d 69  e fragments comi
1640: 6e 67 20 61 6e 64 0a 09 23 20 61 66 74 65 72 2c  ng and..# after,
1650: 20 61 66 74 65 72 20 75 70 64 69 6e 67 20 74 68   after upding th
1660: 65 20 63 72 6f 73 73 69 6e 67 20 69 6e 66 6f 72  e crossing infor
1670: 6d 61 74 69 6f 6e 2e 0a 0a 09 23 20 44 61 74 61  mation....# Data
1680: 20 73 74 72 75 63 74 75 72 65 73 3a 0a 09 23 20   structures:..# 
1690: 4d 61 70 3a 20 20 50 4f 53 20 20 20 72 65 76 69  Map:  POS   revi
16a0: 73 69 6f 6e 20 69 64 20 20 20 20 20 20 2d 3e 20  sion id      -> 
16b0: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73 74  position in list
16c0: 2e 0a 09 23 20 20 20 20 20 20 20 43 52 4f 53 53  ...#       CROSS
16d0: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73   position in lis
16e0: 74 20 2d 3e 20 6e 75 6d 62 65 72 20 6f 66 20 64  t -> number of d
16f0: 65 70 65 6e 64 65 6e 63 69 65 73 20 63 72 6f 73  ependencies cros
1700: 73 69 6e 67 20 69 74 0a 09 23 20 20 20 20 20 20  sing it..#      
1710: 20 44 45 50 43 20 20 64 65 70 65 6e 64 65 6e 63   DEPC  dependenc
1720: 79 20 20 20 20 20 20 20 2d 3e 20 70 6f 73 69 74  y       -> posit
1730: 69 6f 6e 73 20 69 74 20 63 72 6f 73 73 65 73 0a  ions it crosses.
1740: 09 23 20 4c 69 73 74 3a 20 52 41 4e 47 45 20 4f  .# List: RANGE O
1750: 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  f the positions 
1760: 69 74 73 65 6c 66 2e 0a 09 23 20 41 20 64 65 70  itself...# A dep
1770: 65 6e 64 65 6e 63 79 20 69 73 20 61 20 73 69 6e  endency is a sin
1780: 67 6c 65 2d 65 6c 65 6d 65 6e 74 20 6d 61 70 20  gle-element map 
1790: 70 61 72 65 6e 74 20 2d 3e 20 63 68 69 6c 64 0a  parent -> child.
17a0: 0a 09 49 6e 69 74 69 61 6c 69 7a 65 42 72 65 61  ..InitializeBrea
17b0: 6b 53 74 61 74 65 20 24 6d 79 69 74 65 6d 73 0a  kState $myitems.
17c0: 0a 09 73 65 74 20 66 72 61 67 6d 65 6e 74 73 20  ..set fragments 
17d0: 7b 7d 0a 09 73 65 74 20 70 65 6e 64 69 6e 67 20  {}..set pending 
17e0: 20 20 5b 6c 69 73 74 20 24 72 61 6e 67 65 5d 0a    [list $range].
17f0: 09 73 65 74 20 61 74 20 20 20 20 20 20 20 20 30  .set at        0
1800: 0a 09 61 72 72 61 79 20 73 65 74 20 62 72 65 61  ..array set brea
1810: 6b 73 20 7b 7d 0a 0a 09 77 68 69 6c 65 20 7b 24  ks {}...while {$
1820: 61 74 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24 70  at < [llength $p
1830: 65 6e 64 69 6e 67 5d 7d 20 7b 0a 09 20 20 20 20  ending]} {..    
1840: 73 65 74 20 63 75 72 72 65 6e 74 20 5b 6c 69 6e  set current [lin
1850: 64 65 78 20 24 70 65 6e 64 69 6e 67 20 24 61 74  dex $pending $at
1860: 5d 0a 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74  ]...    log writ
1870: 65 20 36 20 63 73 65 74 73 20 7b 2e 20 2e 20 2e  e 6 csets {. . .
1880: 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e 2e 2e  . ... ..... ....
1890: 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  .... ...........
18a0: 2e 2e 7d 0a 09 20 20 20 20 6c 6f 67 20 77 72 69  ..}..    log wri
18b0: 74 65 20 36 20 63 73 65 74 73 20 7b 53 63 68 65  te 6 csets {Sche
18c0: 64 75 6c 65 64 20 20 20 5b 6a 6f 69 6e 20 5b 50  duled   [join [P
18d0: 52 73 20 5b 6c 72 61 6e 67 65 20 24 70 65 6e 64  Rs [lrange $pend
18e0: 69 6e 67 20 24 61 74 20 65 6e 64 5d 5d 20 7b 20  ing $at end]] { 
18f0: 7d 5d 7d 0a 09 20 20 20 20 6c 6f 67 20 77 72 69  }]}..    log wri
1900: 74 65 20 36 20 63 73 65 74 73 20 7b 43 6f 6e 73  te 6 csets {Cons
1910: 69 64 65 72 69 6e 67 20 5b 50 52 20 24 63 75 72  idering [PR $cur
1920: 72 65 6e 74 5d 20 5c 5b 24 61 74 2f 5b 6c 6c 65  rent] \[$at/[lle
1930: 6e 67 74 68 20 24 70 65 6e 64 69 6e 67 5d 5c 5d  ngth $pending]\]
1940: 7d 0a 0a 09 20 20 20 20 73 65 74 20 62 65 73 74  }...    set best
1950: 20 5b 46 69 6e 64 42 65 73 74 42 72 65 61 6b 20   [FindBestBreak 
1960: 24 63 75 72 72 65 6e 74 5d 0a 0a 09 20 20 20 20  $current]...    
1970: 69 66 20 7b 24 62 65 73 74 20 3c 20 30 7d 20 7b  if {$best < 0} {
1980: 0a 09 09 23 20 54 68 65 20 69 6e 73 70 65 63 74  ...# The inspect
1990: 65 64 20 72 61 6e 67 65 20 68 61 73 20 6e 6f 20  ed range has no 
19a0: 69 6e 74 65 72 6e 61 6c 0a 09 09 23 20 64 65 70  internal...# dep
19b0: 65 6e 64 65 6e 63 69 65 73 2e 20 54 68 69 73 20  endencies. This 
19c0: 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 66 72  is a complete fr
19d0: 61 67 6d 65 6e 74 2e 0a 09 09 6c 61 70 70 65 6e  agment....lappen
19e0: 64 20 66 72 61 67 6d 65 6e 74 73 20 24 63 75 72  d fragments $cur
19f0: 72 65 6e 74 0a 0a 09 09 6c 6f 67 20 77 72 69 74  rent....log writ
1a00: 65 20 36 20 63 73 65 74 73 20 22 4e 6f 20 62 72  e 6 csets "No br
1a10: 65 61 6b 73 2c 20 66 69 6e 61 6c 22 0a 09 20 20  eaks, final"..  
1a20: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 23 20 53    } else {...# S
1a30: 70 6c 69 74 20 74 68 65 20 72 61 6e 67 65 20 61  plit the range a
1a40: 6e 64 20 73 63 68 65 64 75 6c 65 20 74 68 65 20  nd schedule the 
1a50: 72 65 73 75 6c 74 69 6e 67 20 66 72 61 67 6d 65  resulting fragme
1a60: 6e 74 73 0a 09 09 23 20 66 6f 72 20 66 75 72 74  nts...# for furt
1a70: 68 65 72 20 69 6e 73 70 65 63 74 69 6f 6e 2e 20  her inspection. 
1a80: 52 65 6d 65 6d 62 65 72 20 74 68 65 20 6e 75 6d  Remember the num
1a90: 62 65 72 20 6f 66 0a 09 09 23 20 64 65 70 65 6e  ber of...# depen
1aa0: 64 65 6e 63 69 65 73 20 63 75 74 20 62 65 66 6f  dencies cut befo
1ab0: 72 65 20 77 65 20 72 65 6d 6f 76 65 20 74 68 65  re we remove the
1ac0: 6d 20 66 72 6f 6d 0a 09 09 23 20 63 6f 6e 73 69  m from...# consi
1ad0: 64 65 72 61 74 69 6f 6e 2c 20 66 6f 72 20 64 6f  deration, for do
1ae0: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 6c 61 74 65  cumentation late
1af0: 72 2e 0a 0a 09 09 73 65 74 20 62 72 65 61 6b 73  r.....set breaks
1b00: 28 24 62 65 73 74 29 20 24 63 72 6f 73 73 28 24  ($best) $cross($
1b10: 62 65 73 74 29 0a 0a 09 09 6c 6f 67 20 77 72 69  best)....log wri
1b20: 74 65 20 36 20 63 73 65 74 73 20 22 42 65 73 74  te 6 csets "Best
1b30: 20 62 72 65 61 6b 20 40 20 24 62 65 73 74 2c 20   break @ $best, 
1b40: 63 75 74 74 69 6e 67 20 5b 6e 73 70 20 24 63 72  cutting [nsp $cr
1b50: 6f 73 73 28 24 62 65 73 74 29 20 64 65 70 65 6e  oss($best) depen
1b60: 64 65 6e 63 79 20 64 65 70 65 6e 64 65 6e 63 69  dency dependenci
1b70: 65 73 5d 22 0a 0a 09 09 23 20 4e 6f 74 65 3a 20  es]"....# Note: 
1b80: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 62 65 73  The value of bes
1b90: 74 20 69 73 20 61 6e 20 61 62 6f 6c 75 74 65 20  t is an abolute 
1ba0: 6c 6f 63 61 74 69 6f 6e 20 69 6e 0a 09 09 23 20  location in...# 
1bb0: 6d 79 69 74 65 6d 73 2e 20 55 73 65 20 74 68 65  myitems. Use the
1bc0: 20 73 74 61 72 74 20 6f 66 20 63 75 72 72 65 6e   start of curren
1bd0: 74 20 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 0a  t to make it an.
1be0: 09 09 23 20 69 6e 64 65 78 20 61 62 73 6f 6c 75  ..# index absolu
1bf0: 74 65 20 74 6f 20 63 75 72 72 65 6e 74 2e 0a 0a  te to current...
1c00: 09 09 73 65 74 20 62 72 65 6c 20 5b 65 78 70 72  ..set brel [expr
1c10: 20 7b 24 62 65 73 74 20 2d 20 5b 6c 69 6e 64 65   {$best - [linde
1c20: 78 20 24 63 75 72 72 65 6e 74 20 30 5d 7d 5d 0a  x $current 0]}].
1c30: 09 09 73 65 74 20 62 6e 65 78 74 20 24 62 72 65  ..set bnext $bre
1c40: 6c 20 3b 20 69 6e 63 72 20 62 6e 65 78 74 0a 09  l ; incr bnext..
1c50: 09 73 65 74 20 66 72 61 67 62 65 66 6f 72 65 20  .set fragbefore 
1c60: 5b 6c 72 61 6e 67 65 20 24 63 75 72 72 65 6e 74  [lrange $current
1c70: 20 30 20 24 62 72 65 6c 5d 0a 09 09 73 65 74 20   0 $brel]...set 
1c80: 66 72 61 67 61 66 74 65 72 20 20 5b 6c 72 61 6e  fragafter  [lran
1c90: 67 65 20 24 63 75 72 72 65 6e 74 20 24 62 6e 65  ge $current $bne
1ca0: 78 74 20 65 6e 64 5d 0a 0a 09 09 6c 6f 67 20 77  xt end]....log w
1cb0: 72 69 74 65 20 36 20 63 73 65 74 73 20 22 4e 65  rite 6 csets "Ne
1cc0: 77 20 70 69 65 63 65 73 20 20 5b 50 52 20 24 66  w pieces  [PR $f
1cd0: 72 61 67 62 65 66 6f 72 65 5d 20 5b 50 52 20 24  ragbefore] [PR $
1ce0: 66 72 61 67 61 66 74 65 72 5d 22 0a 0a 09 09 69  fragafter]"....i
1cf0: 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20  ntegrity assert 
1d00: 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 72 61 67 62  {[llength $fragb
1d10: 65 66 6f 72 65 5d 7d 20 7b 46 6f 75 6e 64 20 7a  efore]} {Found z
1d20: 65 72 6f 2d 6c 65 6e 67 74 68 20 66 72 61 67 6d  ero-length fragm
1d30: 65 6e 74 20 61 74 20 74 68 65 20 62 65 67 69 6e  ent at the begin
1d40: 6e 69 6e 67 7d 0a 09 09 69 6e 74 65 67 72 69 74  ning}...integrit
1d50: 79 20 61 73 73 65 72 74 20 7b 5b 6c 6c 65 6e 67  y assert {[lleng
1d60: 74 68 20 24 66 72 61 67 61 66 74 65 72 5d 7d 20  th $fragafter]} 
1d70: 20 7b 46 6f 75 6e 64 20 7a 65 72 6f 2d 6c 65 6e   {Found zero-len
1d80: 67 74 68 20 66 72 61 67 6d 65 6e 74 20 61 74 20  gth fragment at 
1d90: 74 68 65 20 65 6e 64 7d 0a 0a 09 09 6c 61 70 70  the end}....lapp
1da0: 65 6e 64 20 70 65 6e 64 69 6e 67 20 24 66 72 61  end pending $fra
1db0: 67 62 65 66 6f 72 65 20 24 66 72 61 67 61 66 74  gbefore $fragaft
1dc0: 65 72 0a 09 09 43 75 74 41 74 20 24 62 65 73 74  er...CutAt $best
1dd0: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 6e  ..    }...    in
1de0: 63 72 20 61 74 0a 09 7d 0a 0a 09 6c 6f 67 20 77  cr at..}...log w
1df0: 72 69 74 65 20 36 20 63 73 65 74 73 20 22 2e 20  rite 6 csets ". 
1e00: 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e  . .. ... ..... .
1e10: 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e  ....... ........
1e20: 2e 2e 2e 2e 2e 22 0a 0a 09 23 20 28 2a 29 20 57  ....."...# (*) W
1e30: 65 20 63 6c 65 61 72 20 6f 75 74 20 74 68 65 20  e clear out the 
1e40: 61 73 73 6f 63 69 61 74 65 64 20 70 61 72 74 20  associated part 
1e50: 6f 66 20 74 68 65 20 6d 79 69 74 65 6d 6d 61 70  of the myitemmap
1e60: 0a 09 23 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6e  ..# in-memory in
1e70: 64 65 78 20 69 6e 20 70 72 65 70 61 72 61 74 69  dex in preparati
1e80: 6f 6e 20 66 6f 72 20 6e 65 77 20 64 61 74 61 2e  on for new data.
1e90: 20 41 20 73 69 6d 70 6c 65 20 75 6e 73 65 74 0a   A simple unset.
1ea0: 09 23 20 69 73 20 65 6e 6f 75 67 68 2c 20 77 65  .# is enough, we
1eb0: 20 68 61 76 65 20 6e 6f 20 73 79 6d 62 6f 6c 20   have no symbol 
1ec0: 63 68 61 6e 67 65 73 65 74 73 20 61 74 20 74 68  changesets at th
1ed0: 69 73 20 74 69 6d 65 2c 20 61 6e 64 0a 09 23 20  is time, and..# 
1ee0: 74 68 75 73 20 6e 65 76 65 72 20 6d 6f 72 65 20  thus never more 
1ef0: 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
1f00: 63 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ce in the list..
1f10: 0a 09 66 6f 72 65 61 63 68 20 69 69 64 20 24 6d  ..foreach iid $m
1f20: 79 69 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65  yitems {..    se
1f30: 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79 74  t key [list $myt
1f40: 79 70 65 20 24 69 69 64 5d 0a 09 20 20 20 20 75  ype $iid]..    u
1f50: 6e 73 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24  nset myitemmap($
1f60: 6b 65 79 29 0a 09 7d 0a 0a 09 23 20 43 72 65 61  key)..}...# Crea
1f70: 74 65 20 63 68 61 6e 67 65 73 65 74 73 20 66 6f  te changesets fo
1f80: 72 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 2c  r the fragments,
1f90: 20 72 65 75 73 69 6e 67 20 74 68 65 20 63 75 72   reusing the cur
1fa0: 72 65 6e 74 20 6f 6e 65 0a 09 23 20 66 6f 72 20  rent one..# for 
1fb0: 74 68 65 20 66 69 72 73 74 20 66 72 61 67 6d 65  the first fragme
1fc0: 6e 74 2e 20 57 65 20 73 6f 72 74 20 74 68 65 6d  nt. We sort them
1fd0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 6c 6c   in order to all
1fe0: 6f 77 0a 09 23 20 63 68 65 63 6b 69 6e 67 20 66  ow..# checking f
1ff0: 6f 72 20 67 61 70 73 20 61 6e 64 20 6e 69 63 65  or gaps and nice
2000: 20 6d 65 73 73 61 67 65 73 2e 0a 0a 09 73 65 74   messages....set
2010: 20 66 72 61 67 6d 65 6e 74 73 20 5b 6c 73 6f 72   fragments [lsor
2020: 74 20 2d 69 6e 64 65 78 20 30 20 2d 69 6e 74 65  t -index 0 -inte
2030: 67 65 72 20 24 66 72 61 67 6d 65 6e 74 73 5d 0a  ger $fragments].
2040: 0a 09 23 70 75 74 73 20 5c 74 2e 5b 6a 6f 69 6e  ..#puts \t.[join
2050: 20 5b 50 52 73 20 24 66 72 61 67 6d 65 6e 74 73   [PRs $fragments
2060: 5d 20 2e 5c 6e 5c 74 2e 5d 2e 0a 0a 09 42 6f 72  ] .\n\t.]....Bor
2070: 64 65 72 20 5b 6c 69 6e 64 65 78 20 24 66 72 61  der [lindex $fra
2080: 67 6d 65 6e 74 73 20 30 5d 20 66 69 72 73 74 73  gments 0] firsts
2090: 20 66 69 72 73 74 65 0a 0a 09 69 6e 74 65 67 72   firste...integr
20a0: 69 74 79 20 61 73 73 65 72 74 20 7b 24 66 69 72  ity assert {$fir
20b0: 73 74 73 20 3d 3d 20 30 7d 20 7b 42 61 64 20 66  sts == 0} {Bad f
20c0: 72 61 67 6d 65 6e 74 20 73 74 61 72 74 20 40 20  ragment start @ 
20d0: 24 66 69 72 73 74 73 2c 20 67 61 70 2c 20 6f 72  $firsts, gap, or
20e0: 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e   before beginnin
20f0: 67 20 6f 66 20 74 68 65 20 72 61 6e 67 65 7d 0a  g of the range}.
2100: 0a 09 73 65 74 20 6c 61 73 74 65 20 24 66 69 72  ..set laste $fir
2110: 73 74 65 0a 09 66 6f 72 65 61 63 68 20 66 72 61  ste..foreach fra
2120: 67 6d 65 6e 74 20 5b 6c 72 61 6e 67 65 20 24 66  gment [lrange $f
2130: 72 61 67 6d 65 6e 74 73 20 31 20 65 6e 64 5d 20  ragments 1 end] 
2140: 7b 0a 09 20 20 20 20 42 6f 72 64 65 72 20 24 66  {..    Border $f
2150: 72 61 67 6d 65 6e 74 20 73 20 65 0a 09 20 20 20  ragment s e..   
2160: 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72   integrity asser
2170: 74 20 7b 24 6c 61 73 74 65 20 3d 3d 20 28 24 73  t {$laste == ($s
2180: 20 2d 20 31 29 7d 20 7b 42 61 64 20 66 72 61 67   - 1)} {Bad frag
2190: 6d 65 6e 74 20 62 6f 72 64 65 72 20 3c 24 6c 61  ment border <$la
21a0: 73 74 65 20 7c 20 24 73 3e 2c 20 67 61 70 20 6f  ste | $s>, gap o
21b0: 72 20 6f 76 65 72 6c 61 70 7d 0a 0a 09 20 20 20  r overlap}...   
21c0: 20 73 65 74 20 6e 65 77 20 5b 24 74 79 70 65 20   set new [$type 
21d0: 25 41 55 54 4f 25 20 24 6d 79 70 72 6f 6a 65 63  %AUTO% $myprojec
21e0: 74 20 24 6d 79 74 79 70 65 20 24 6d 79 73 72 63  t $mytype $mysrc
21f0: 69 64 20 5b 6c 72 61 6e 67 65 20 24 6d 79 69 74  id [lrange $myit
2200: 65 6d 73 20 24 73 20 24 65 5d 5d 0a 0a 20 20 20  ems $s $e]]..   
2210: 20 20 20 20 20 20 20 20 20 6c 6f 67 20 77 72 69           log wri
2220: 74 65 20 34 20 63 73 65 74 73 20 22 42 72 65 61  te 4 csets "Brea
2230: 6b 69 6e 67 20 5b 24 73 65 6c 66 20 73 74 72 20  king [$self str 
2240: 5d 20 40 20 24 6c 61 73 74 65 2c 20 6e 65 77 20  ] @ $laste, new 
2250: 5b 24 6e 65 77 20 73 74 72 5d 2c 20 63 75 74 74  [$new str], cutt
2260: 69 6e 67 20 24 62 72 65 61 6b 73 28 24 6c 61 73  ing $breaks($las
2270: 74 65 29 22 0a 0a 09 20 20 20 20 73 65 74 20 6c  te)"...    set l
2280: 61 73 74 65 20 24 65 0a 09 7d 0a 0a 09 69 6e 74  aste $e..}...int
2290: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 0a  egrity assert {.
22a0: 09 20 20 20 20 24 6c 61 73 74 65 20 3d 3d 20 28  .    $laste == (
22b0: 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 69 74 65 6d  [llength $myitem
22c0: 73 5d 2d 31 29 0a 09 7d 20 7b 42 61 64 20 66 72  s]-1)..} {Bad fr
22d0: 61 67 6d 65 6e 74 20 65 6e 64 20 40 20 24 6c 61  agment end @ $la
22e0: 73 74 65 2c 20 67 61 70 2c 20 6f 72 20 62 65 79  ste, gap, or bey
22f0: 6f 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 72  ond end of the r
2300: 61 6e 67 65 7d 0a 0a 09 23 20 50 75 74 20 74 68  ange}...# Put th
2310: 65 20 66 69 72 73 74 20 66 72 61 67 6d 65 6e 74  e first fragment
2320: 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e   into the curren
2330: 74 20 63 68 61 6e 67 65 73 65 74 2c 20 61 6e 64  t changeset, and
2340: 0a 09 23 20 75 70 64 61 74 65 20 74 68 65 20 69  ..# update the i
2350: 6e 2d 6d 65 6d 6f 72 79 20 69 6e 64 65 78 2e 20  n-memory index. 
2360: 57 65 20 63 61 6e 20 73 69 6d 70 6c 79 20 28 72  We can simply (r
2370: 65 29 61 64 64 20 74 68 65 20 69 74 65 6d 73 0a  e)add the items.
2380: 09 23 20 62 65 63 61 75 73 65 20 77 65 20 63 6c  .# because we cl
2390: 65 61 72 65 64 20 74 68 65 20 70 72 65 76 69 6f  eared the previo
23a0: 75 73 6c 79 20 65 78 69 73 74 69 6e 67 20 69 6e  usly existing in
23b0: 66 6f 72 6d 61 74 69 6f 6e 2c 20 73 65 65 0a 09  formation, see..
23c0: 23 20 28 2a 29 20 61 62 6f 76 65 2e 20 50 65 72  # (*) above. Per
23d0: 73 69 73 74 65 6e 63 65 20 64 6f 65 73 20 6e 6f  sistence does no
23e0: 74 20 6d 61 74 74 65 72 20 68 65 72 65 2c 20 6e  t matter here, n
23f0: 6f 6e 65 20 6f 66 20 74 68 65 0a 09 23 20 63 68  one of the..# ch
2400: 61 6e 67 65 73 65 74 73 20 68 61 73 20 62 65 65  angesets has bee
2410: 6e 20 73 61 76 65 64 20 74 6f 20 74 68 65 20 70  n saved to the p
2420: 65 72 73 69 73 74 65 6e 74 20 73 74 61 74 65 20  ersistent state 
2430: 79 65 74 2e 0a 0a 09 73 65 74 20 6d 79 69 74 65  yet....set myite
2440: 6d 73 20 5b 6c 72 61 6e 67 65 20 24 6d 79 69 74  ms [lrange $myit
2450: 65 6d 73 20 30 20 24 66 69 72 73 74 65 5d 0a 09  ems 0 $firste]..
2460: 66 6f 72 65 61 63 68 20 69 69 64 20 24 6d 79 69  foreach iid $myi
2470: 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65 74 20  tems {..    set 
2480: 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79 74 79 70  key [list $mytyp
2490: 65 20 24 69 69 64 5d 0a 09 20 20 20 20 73 65 74  e $iid]..    set
24a0: 20 6d 79 69 74 65 6d 6d 61 70 28 24 6b 65 79 29   myitemmap($key)
24b0: 20 24 73 65 6c 66 0a 09 7d 0a 0a 09 72 65 74 75   $self..}...retu
24c0: 72 6e 20 31 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rn 1.    }..    
24d0: 6d 65 74 68 6f 64 20 70 65 72 73 69 73 74 20 7b  method persist {
24e0: 7d 20 7b 0a 09 73 65 74 20 74 69 64 20 24 6d 79  } {..set tid $my
24f0: 63 73 74 79 70 65 28 24 6d 79 74 79 70 65 29 0a  cstype($mytype).
2500: 09 73 65 74 20 70 69 64 20 5b 24 6d 79 70 72 6f  .set pid [$mypro
2510: 6a 65 63 74 20 69 64 5d 0a 09 73 65 74 20 70 6f  ject id]..set po
2520: 73 20 30 0a 0a 09 73 74 61 74 65 20 74 72 61 6e  s 0...state tran
2530: 73 61 63 74 69 6f 6e 20 7b 0a 09 20 20 20 20 73  saction {..    s
2540: 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 49 4e 53  tate run {...INS
2550: 45 52 54 20 49 4e 54 4f 20 63 68 61 6e 67 65 73  ERT INTO changes
2560: 65 74 20 28 63 69 64 2c 20 20 20 70 69 64 2c 20  et (cid,   pid, 
2570: 20 74 79 70 65 2c 20 73 72 63 29 0a 09 09 56 41   type, src)...VA
2580: 4c 55 45 53 20 20 20 20 20 20 20 20 20 20 20 20  LUES            
2590: 20 20 20 20 28 24 6d 79 69 64 2c 20 24 70 69 64      ($myid, $pid
25a0: 2c 20 24 74 69 64 2c 20 24 6d 79 73 72 63 69 64  , $tid, $mysrcid
25b0: 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  );..    }...    
25c0: 66 6f 72 65 61 63 68 20 69 69 64 20 24 6d 79 69  foreach iid $myi
25d0: 74 65 6d 73 20 7b 0a 09 09 73 74 61 74 65 20 72  tems {...state r
25e0: 75 6e 20 7b 0a 09 09 20 20 20 20 49 4e 53 45 52  un {...    INSER
25f0: 54 20 49 4e 54 4f 20 63 73 69 74 65 6d 20 28 63  T INTO csitem (c
2600: 69 64 2c 20 20 20 70 6f 73 2c 20 20 69 69 64 29  id,   pos,  iid)
2610: 0a 09 09 20 20 20 20 56 41 4c 55 45 53 20 20 20  ...    VALUES   
2620: 20 20 20 20 20 20 20 20 20 20 28 24 6d 79 69 64            ($myid
2630: 2c 20 24 70 6f 73 2c 20 24 69 69 64 29 3b 0a 09  , $pos, $iid);..
2640: 09 7d 0a 09 09 69 6e 63 72 20 70 6f 73 0a 09 20  .}...incr pos.. 
2650: 20 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a     }..}..return.
2660: 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f      }..    metho
2670: 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 7d 20 7b  d timerange {} {
2680: 20 72 65 74 75 72 6e 20 5b 24 6d 79 74 79 70 65   return [$mytype
2690: 6f 62 6a 20 74 69 6d 65 72 61 6e 67 65 20 24 6d  obj timerange $m
26a0: 79 69 74 65 6d 73 5d 20 7d 0a 0a 20 20 20 20 6d  yitems] }..    m
26b0: 65 74 68 6f 64 20 64 72 6f 70 20 7b 7d 20 7b 0a  ethod drop {} {.
26c0: 09 73 74 61 74 65 20 74 72 61 6e 73 61 63 74 69  .state transacti
26d0: 6f 6e 20 7b 0a 09 20 20 20 20 73 74 61 74 65 20  on {..    state 
26e0: 72 75 6e 20 7b 0a 09 09 44 45 4c 45 54 45 20 46  run {...DELETE F
26f0: 52 4f 4d 20 63 68 61 6e 67 65 73 65 74 20 57 48  ROM changeset WH
2700: 45 52 45 20 63 69 64 20 3d 20 24 6d 79 69 64 3b  ERE cid = $myid;
2710: 0a 09 09 44 45 4c 45 54 45 20 46 52 4f 4d 20 63  ...DELETE FROM c
2720: 73 69 74 65 6d 20 20 20 20 57 48 45 52 45 20 63  sitem    WHERE c
2730: 69 64 20 3d 20 24 6d 79 69 64 3b 0a 09 20 20 20  id = $myid;..   
2740: 20 7d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 69   }..}..foreach i
2750: 69 64 20 24 6d 79 69 74 65 6d 73 20 7b 0a 09 20  id $myitems {.. 
2760: 20 20 20 73 65 74 20 6b 65 79 20 5b 6c 69 73 74     set key [list
2770: 20 24 6d 79 74 79 70 65 20 24 69 69 64 5d 0a 09   $mytype $iid]..
2780: 20 20 20 20 75 6e 73 65 74 20 6d 79 69 74 65 6d      unset myitem
2790: 6d 61 70 28 24 6b 65 79 29 0a 09 7d 0a 09 73 65  map($key)..}..se
27a0: 74 20 70 6f 73 20 20 20 20 20 20 20 20 20 20 5b  t pos          [
27b0: 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 24  lsearch -exact $
27c0: 6d 79 63 68 61 6e 67 65 73 65 74 73 20 24 73 65  mychangesets $se
27d0: 6c 66 5d 0a 09 73 65 74 20 6d 79 63 68 61 6e 67  lf]..set mychang
27e0: 65 73 65 74 73 20 5b 6c 72 65 70 6c 61 63 65 20  esets [lreplace 
27f0: 24 6d 79 63 68 61 6e 67 65 73 65 74 73 20 24 70  $mychangesets $p
2800: 6f 73 20 24 70 6f 73 5d 0a 09 72 65 74 75 72 6e  os $pos]..return
2810: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65  .    }..    type
2820: 6d 65 74 68 6f 64 20 73 70 6c 69 74 20 7b 63 73  method split {cs
2830: 65 74 20 61 72 67 73 7d 20 7b 0a 09 23 20 41 73  et args} {..# As
2840: 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 72 65   part of the cre
2850: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77  ation of the new
2860: 20 63 68 61 6e 67 65 73 65 74 73 20 73 70 65 63   changesets spec
2870: 69 66 69 65 64 20 69 6e 0a 09 23 20 41 52 47 53  ified in..# ARGS
2880: 20 61 73 20 73 65 74 73 20 6f 66 20 69 74 65 6d   as sets of item
2890: 73 2c 20 61 6c 6c 20 73 75 62 73 65 74 73 20 6f  s, all subsets o
28a0: 66 20 43 53 45 54 27 73 20 69 74 65 6d 20 73 65  f CSET's item se
28b0: 74 2c 20 43 53 45 54 0a 09 23 20 77 69 6c 6c 20  t, CSET..# will 
28c0: 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20  be dropped from 
28d0: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 2c 20 69  all databases, i
28e0: 6e 20 61 6e 64 20 6f 75 74 20 6f 66 20 6d 65 6d  n and out of mem
28f0: 6f 72 79 2c 0a 09 23 20 61 6e 64 20 74 68 65 6e  ory,..# and then
2900: 20 64 65 73 74 72 6f 79 65 64 2e 0a 09 23 0a 09   destroyed...#..
2910: 23 20 4e 6f 74 65 3a 20 54 68 65 20 69 74 65 6d  # Note: The item
2920: 20 6c 69 73 74 73 20 66 6f 75 6e 64 20 69 6e 20   lists found in 
2930: 61 72 67 73 20 61 72 65 20 74 61 67 67 65 64 20  args are tagged 
2940: 69 74 65 6d 73 2e 20 54 68 65 79 0a 09 23 20 68  items. They..# h
2950: 61 76 65 20 74 6f 20 68 61 76 65 20 74 68 65 20  ave to have the 
2960: 73 61 6d 65 20 74 79 70 65 20 61 73 20 74 68 65  same type as the
2970: 20 63 68 61 6e 67 65 73 65 74 2c 20 62 65 69 6e   changeset, bein
2980: 67 20 73 75 62 73 65 74 73 0a 09 23 20 6f 66 20  g subsets..# of 
2990: 69 74 73 20 69 74 65 6d 73 2e 20 54 68 69 73 20  its items. This 
29a0: 69 73 20 63 68 65 63 6b 65 64 20 69 6e 20 55 6e  is checked in Un
29b0: 74 61 67 31 2e 0a 0a 09 73 74 72 75 63 74 3a 3a  tag1....struct::
29c0: 6c 69 73 74 20 61 73 73 69 67 6e 20 5b 24 63 73  list assign [$cs
29d0: 65 74 20 64 61 74 61 5d 20 70 72 6f 6a 65 63 74  et data] project
29e0: 20 63 73 74 79 70 65 20 63 73 73 72 63 0a 0a 09   cstype cssrc...
29f0: 24 63 73 65 74 20 64 72 6f 70 0a 09 24 63 73 65  $cset drop..$cse
2a00: 74 20 64 65 73 74 72 6f 79 0a 0a 09 73 65 74 20  t destroy...set 
2a10: 6e 65 77 63 73 65 74 73 20 7b 7d 0a 09 66 6f 72  newcsets {}..for
2a20: 65 61 63 68 20 66 72 61 67 6d 65 6e 74 69 74 65  each fragmentite
2a30: 6d 73 20 24 61 72 67 73 20 7b 0a 09 20 20 20 20  ms $args {..    
2a40: 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74  integrity assert
2a50: 20 7b 0a 09 09 5b 6c 6c 65 6e 67 74 68 20 24 66   {...[llength $f
2a60: 72 61 67 6d 65 6e 74 69 74 65 6d 73 5d 0a 09 20  ragmentitems].. 
2a70: 20 20 20 7d 20 7b 41 74 74 65 6d 70 74 65 64 20     } {Attempted 
2a80: 74 6f 20 63 72 65 61 74 65 20 61 6e 20 65 6d 70  to create an emp
2a90: 74 79 20 63 68 61 6e 67 65 73 65 74 2c 20 69 2e  ty changeset, i.
2aa0: 65 2e 20 77 69 74 68 6f 75 74 20 69 74 65 6d 73  e. without items
2ab0: 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 6e  }..    lappend n
2ac0: 65 77 63 73 65 74 73 20 5b 24 74 79 70 65 20 25  ewcsets [$type %
2ad0: 41 55 54 4f 25 20 24 70 72 6f 6a 65 63 74 20 24  AUTO% $project $
2ae0: 63 73 74 79 70 65 20 24 63 73 73 72 63 20 5c 0a  cstype $cssrc \.
2af0: 09 09 09 09 20 20 5b 55 6e 74 61 67 20 24 66 72  ....  [Untag $fr
2b00: 61 67 6d 65 6e 74 69 74 65 6d 73 20 24 63 73 74  agmentitems $cst
2b10: 79 70 65 5d 5d 0a 09 7d 0a 0a 09 66 6f 72 65 61  ype]]..}...forea
2b20: 63 68 20 63 20 24 6e 65 77 63 73 65 74 73 20 7b  ch c $newcsets {
2b30: 20 24 63 20 70 65 72 73 69 73 74 20 7d 0a 09 72   $c persist }..r
2b40: 65 74 75 72 6e 20 24 6e 65 77 63 73 65 74 73 0a  eturn $newcsets.
2b50: 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d      }..    typem
2b60: 65 74 68 6f 64 20 73 74 72 6c 69 73 74 20 7b 63  ethod strlist {c
2b70: 68 61 6e 67 65 73 65 74 73 7d 20 7b 0a 09 72 65  hangesets} {..re
2b80: 74 75 72 6e 20 5b 6a 6f 69 6e 20 5b 73 74 72 75  turn [join [stru
2b90: 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20 24 63 68  ct::list map $ch
2ba0: 61 6e 67 65 73 65 74 73 20 5b 6d 79 70 72 6f 63  angesets [myproc
2bb0: 20 49 44 5d 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20   ID]]].    }..  
2bc0: 20 20 70 72 6f 63 20 49 44 20 7b 63 73 65 74 7d    proc ID {cset}
2bd0: 20 7b 20 24 63 73 65 74 20 73 74 72 20 7d 0a 0a   { $cset str }..
2be0: 20 20 20 20 70 72 6f 63 20 55 6e 74 61 67 20 7b      proc Untag {
2bf0: 74 61 67 67 65 64 69 74 65 6d 73 20 63 73 74 79  taggeditems csty
2c00: 70 65 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b 73  pe} {..return [s
2c10: 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20  truct::list map 
2c20: 24 74 61 67 67 65 64 69 74 65 6d 73 20 5b 6d 79  $taggeditems [my
2c30: 70 72 6f 63 20 55 6e 74 61 67 31 20 24 63 73 74  proc Untag1 $cst
2c40: 79 70 65 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20  ype]].    }..   
2c50: 20 70 72 6f 63 20 55 6e 74 61 67 31 20 7b 63 73   proc Untag1 {cs
2c60: 74 79 70 65 20 74 68 65 69 74 65 6d 7d 20 7b 0a  type theitem} {.
2c70: 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73  .struct::list as
2c80: 73 69 67 6e 20 24 74 68 65 69 74 65 6d 20 74 20  sign $theitem t 
2c90: 69 0a 09 69 6e 74 65 67 72 69 74 79 20 61 73 73  i..integrity ass
2ca0: 65 72 74 20 7b 24 63 73 74 79 70 65 20 65 71 20  ert {$cstype eq 
2cb0: 24 74 7d 20 7b 49 74 65 6d 20 24 69 27 73 20 74  $t} {Item $i's t
2cc0: 79 70 65 20 69 73 20 27 24 74 27 2c 20 65 78 70  ype is '$t', exp
2cd0: 65 63 74 65 64 20 27 24 63 73 74 79 70 65 27 7d  ected '$cstype'}
2ce0: 0a 09 72 65 74 75 72 6e 20 24 69 0a 20 20 20 20  ..return $i.    
2cf0: 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23  }..    # # ## ##
2d00: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
2d10: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20   #############. 
2d20: 20 20 20 23 23 20 53 74 61 74 65 0a 0a 20 20 20     ## State..   
2d30: 20 76 61 72 69 61 62 6c 65 20 6d 79 69 64 20 20   variable myid  
2d40: 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 49 64 20        {} ; # Id 
2d50: 6f 66 20 74 68 65 20 63 73 65 74 20 66 6f 72 20  of the cset for 
2d60: 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 0a 09  the persistent..
2d70: 09 09 20 20 20 20 20 20 23 20 73 74 61 74 65 2e  ..      # state.
2d80: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79  .    variable my
2d90: 70 72 6f 6a 65 63 74 20 20 20 7b 7d 20 3b 20 23  project   {} ; #
2da0: 20 52 65 66 65 72 65 6e 63 65 20 6f 66 20 74 68   Reference of th
2db0: 65 20 70 72 6f 6a 65 63 74 20 6f 62 6a 65 63 74  e project object
2dc0: 20 74 68 65 0a 09 09 09 20 20 20 20 20 20 23 20   the....      # 
2dd0: 63 68 61 6e 67 65 73 65 74 20 62 65 6c 6f 6e 67  changeset belong
2de0: 73 20 74 6f 2e 0a 20 20 20 20 76 61 72 69 61 62  s to..    variab
2df0: 6c 65 20 6d 79 74 79 70 65 20 20 20 20 20 20 7b  le mytype      {
2e00: 7d 20 3b 20 23 20 57 68 61 74 20 74 68 65 20 63  } ; # What the c
2e10: 68 61 6e 67 65 73 65 74 20 69 73 20 62 61 73 65  hangeset is base
2e20: 64 20 6f 6e 0a 09 09 09 20 20 20 20 20 20 23 20  d on....      # 
2e30: 28 72 65 76 69 73 69 6f 6e 73 2c 20 74 61 67 73  (revisions, tags
2e40: 2c 20 6f 72 20 62 72 61 6e 63 68 65 73 29 2e 0a  , or branches)..
2e50: 09 09 09 20 20 20 20 20 20 23 20 56 61 6c 75 65  ...      # Value
2e60: 73 3a 20 53 65 65 20 6d 79 63 73 74 79 70 65 2e  s: See mycstype.
2e70: 20 4e 6f 74 65 20 74 68 61 74 20 77 65 0a 09 09   Note that we...
2e80: 09 20 20 20 20 20 20 23 20 68 61 76 65 20 74 6f  .      # have to
2e90: 20 6b 65 65 70 20 74 68 65 20 6e 61 6d 65 73 20   keep the names 
2ea0: 6f 66 20 74 68 65 20 68 65 6c 70 65 72 0a 09 09  of the helper...
2eb0: 09 20 20 20 20 20 20 23 20 73 69 6e 67 6c 65 74  .      # singlet
2ec0: 6f 6e 73 20 69 6e 20 73 79 6e 63 20 77 69 74 68  ons in sync with
2ed0: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 09 09   the contents...
2ee0: 09 20 20 20 20 20 20 23 20 6f 66 20 73 74 61 74  .      # of stat
2ef0: 65 20 74 61 62 6c 65 20 27 63 73 74 79 70 65 27  e table 'cstype'
2f00: 2c 20 61 6e 64 20 76 61 72 69 6f 75 73 0a 09 09  , and various...
2f10: 09 20 20 20 20 20 20 23 20 6f 74 68 65 72 20 70  .      # other p
2f20: 6c 61 63 65 73 20 75 73 69 6e 67 20 74 68 65 6d  laces using them
2f30: 20 68 61 72 64 77 69 72 65 64 2e 0a 20 20 20 20   hardwired..    
2f40: 76 61 72 69 61 62 6c 65 20 6d 79 74 79 70 65 6f  variable mytypeo
2f50: 62 6a 20 20 20 7b 7d 20 3b 20 23 20 52 65 66 65  bj   {} ; # Refe
2f60: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 6f 6e  rence to the con
2f70: 74 61 69 6e 65 72 20 66 6f 72 20 74 68 65 0a 09  tainer for the..
2f80: 09 09 20 20 20 20 20 20 23 20 74 79 70 65 20 64  ..      # type d
2f90: 65 70 65 6e 64 65 6e 74 20 63 6f 64 65 2e 20 44  ependent code. D
2fa0: 65 72 69 76 65 64 20 66 72 6f 6d 0a 09 09 09 20  erived from.... 
2fb0: 20 20 20 20 20 23 20 6d 79 74 79 70 65 2e 0a 20       # mytype.. 
2fc0: 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 73 72     variable mysr
2fd0: 63 69 64 20 20 20 20 20 7b 7d 20 3b 20 23 20 49  cid     {} ; # I
2fe0: 64 20 6f 66 20 74 68 65 20 6d 65 74 61 64 61 74  d of the metadat
2ff0: 61 20 6f 72 20 73 79 6d 62 6f 6c 20 74 68 65 20  a or symbol the 
3000: 63 73 65 74 0a 09 09 09 20 20 20 20 20 20 23 20  cset....      # 
3010: 69 73 20 62 61 73 65 64 20 6f 6e 2e 0a 20 20 20  is based on..   
3020: 20 76 61 72 69 61 62 6c 65 20 6d 79 69 74 65 6d   variable myitem
3030: 73 20 20 20 20 20 7b 7d 20 3b 20 23 20 4c 69 73  s     {} ; # Lis
3040: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 65  t of the file le
3050: 76 65 6c 20 72 65 76 69 73 69 6f 6e 73 2c 0a 09  vel revisions,..
3060: 09 09 20 20 20 20 20 20 23 20 74 61 67 73 2c 20  ..      # tags, 
3070: 6f 72 20 62 72 61 6e 63 68 65 73 20 69 6e 20 74  or branches in t
3080: 68 65 20 63 73 65 74 2c 20 61 73 0a 09 09 09 20  he cset, as.... 
3090: 20 20 20 20 20 23 20 69 64 73 2e 20 4e 6f 74 20       # ids. Not 
30a0: 74 61 67 67 65 64 2e 0a 20 20 20 20 76 61 72 69  tagged..    vari
30b0: 61 62 6c 65 20 6d 79 74 69 74 65 6d 73 20 20 20  able mytitems   
30c0: 20 7b 7d 20 3b 20 23 20 41 73 20 6d 79 69 74 65   {} ; # As myite
30d0: 6d 73 2c 20 74 68 65 20 74 61 67 67 65 64 20 66  ms, the tagged f
30e0: 6f 72 6d 2e 0a 20 20 20 20 76 61 72 69 61 62 6c  orm..    variabl
30f0: 65 20 6d 79 70 72 65 6d 61 70 20 20 20 20 7b 7d  e mypremap    {}
3100: 20 3b 20 23 20 44 69 63 74 69 6f 6e 61 72 79 20   ; # Dictionary 
3110: 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65  mapping from the
3120: 20 69 74 65 6d 73 20 28 74 61 67 67 65 64 20 6e   items (tagged n
3130: 6f 77 29 0a 09 09 09 20 20 20 20 20 20 23 20 74  ow)....      # t
3140: 6f 20 74 68 65 69 72 20 70 72 65 64 65 63 65 73  o their predeces
3150: 73 6f 72 73 2c 20 61 6c 73 6f 20 74 61 67 67 65  sors, also tagge
3160: 64 2e 20 41 0a 09 09 09 20 20 20 20 20 20 23 20  d. A....      # 
3170: 63 61 63 68 65 20 74 6f 20 61 76 6f 69 64 20 6c  cache to avoid l
3180: 6f 61 64 69 6e 67 20 74 68 69 73 20 66 72 6f 6d  oading this from
3190: 20 74 68 65 0a 09 09 09 20 20 20 20 20 20 23 20   the....      # 
31a0: 73 74 61 74 65 20 6d 6f 72 65 20 74 68 61 6e 20  state more than 
31b0: 6f 6e 63 65 2e 0a 20 20 20 20 76 61 72 69 61 62  once..    variab
31c0: 6c 65 20 6d 79 6e 65 78 74 6d 61 70 20 20 20 7b  le mynextmap   {
31d0: 7d 20 3b 20 23 20 44 69 63 74 69 6f 6e 61 72 79  } ; # Dictionary
31e0: 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68   mapping from th
31f0: 65 20 69 74 65 6d 73 20 28 74 61 67 67 65 64 29  e items (tagged)
3200: 0a 09 09 09 20 20 20 20 20 20 23 20 74 6f 20 74  ....      # to t
3210: 68 65 69 72 20 73 75 63 63 65 73 73 6f 72 73 20  heir successors 
3220: 28 61 6c 73 6f 20 74 61 67 67 65 64 29 2e 20 41  (also tagged). A
3230: 0a 09 09 09 20 20 20 20 20 20 23 20 63 61 63 68  ....      # cach
3240: 65 20 74 6f 20 61 76 6f 69 64 20 6c 6f 61 64 69  e to avoid loadi
3250: 6e 67 20 74 68 69 73 20 66 72 6f 6d 20 74 68 65  ng this from the
3260: 0a 09 09 09 20 20 20 20 20 20 23 20 73 74 61 74  ....      # stat
3270: 65 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  e more than once
3280: 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d  ..    variable m
3290: 79 70 6f 73 20 20 20 20 20 20 20 7b 7d 20 3b 20  ypos       {} ; 
32a0: 23 20 43 6f 6d 6d 69 74 20 70 6f 73 69 74 69 6f  # Commit positio
32b0: 6e 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73  n of the changes
32c0: 65 74 2c 20 69 66 0a 09 09 09 20 20 20 20 20 20  et, if....      
32d0: 23 20 6b 6e 6f 77 6e 2e 0a 0a 20 20 20 20 23 20  # known...    # 
32e0: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23  # ## ### ##### #
32f0: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
3300: 23 23 23 23 23 0a 20 20 20 20 23 23 20 49 6e 74  #####.    ## Int
3310: 65 72 6e 61 6c 20 6d 65 74 68 6f 64 73 0a 0a 20  ernal methods.. 
3320: 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20     typevariable 
3330: 6d 79 63 6f 75 6e 74 65 72 20 20 20 20 20 20 20  mycounter       
3340: 20 30 20 3b 20 23 20 49 64 20 63 6f 75 6e 74 65   0 ; # Id counte
3350: 72 20 66 6f 72 20 63 73 65 74 73 2e 20 4c 61 73  r for csets. Las
3360: 74 20 69 64 0a 09 09 09 09 20 20 20 20 20 20 23  t id.....      #
3370: 20 75 73 65 64 2e 0a 20 20 20 20 74 79 70 65 76   used..    typev
3380: 61 72 69 61 62 6c 65 20 6d 79 63 73 74 79 70 65  ariable mycstype
3390: 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d   -array {} ; # M
33a0: 61 70 20 63 73 74 79 70 65 73 20 28 6e 61 6d 65  ap cstypes (name
33b0: 73 29 20 74 6f 20 70 65 72 73 69 73 74 65 6e 74  s) to persistent
33c0: 0a 09 09 09 09 20 20 20 20 20 20 23 20 69 64 73  .....      # ids
33d0: 2e 20 4e 6f 74 65 20 74 68 61 74 20 77 65 20 68  . Note that we h
33e0: 61 76 65 20 74 6f 20 6b 65 65 70 0a 09 09 09 09  ave to keep.....
33f0: 20 20 20 20 20 20 23 20 74 68 65 20 6e 61 6d 65        # the name
3400: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 27  s in the table '
3410: 63 73 74 79 70 65 27 0a 09 09 09 09 20 20 20 20  cstype'.....    
3420: 20 20 23 20 69 6e 20 73 79 6e 63 20 77 69 74 68    # in sync with
3430: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
3440: 65 0a 09 09 09 09 20 20 20 20 20 20 23 20 68 65  e.....      # he
3450: 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 73 2e  lper singletons.
3460: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ..    typemethod
3470: 20 67 65 74 63 73 74 79 70 65 73 20 7b 7d 20 7b   getcstypes {} {
3480: 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 6e  ..foreach {tid n
3490: 61 6d 65 7d 20 5b 73 74 61 74 65 20 72 75 6e 20  ame} [state run 
34a0: 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 74 69  {..    SELECT ti
34b0: 64 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 63 73 74  d, name FROM cst
34c0: 79 70 65 3b 0a 09 7d 5d 20 7b 20 73 65 74 20 6d  ype;..}] { set m
34d0: 79 63 73 74 79 70 65 28 24 6e 61 6d 65 29 20 24  ycstype($name) $
34e0: 74 69 64 20 7d 0a 09 72 65 74 75 72 6e 0a 20 20  tid }..return.  
34f0: 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74    }..    typemet
3500: 68 6f 64 20 6c 6f 61 64 63 6f 75 6e 74 65 72 20  hod loadcounter 
3510: 7b 7d 20 7b 0a 09 23 20 49 6e 69 74 69 61 6c 69  {} {..# Initiali
3520: 7a 65 20 74 68 65 20 63 6f 75 6e 74 65 72 20 66  ze the counter f
3530: 72 6f 6d 20 74 68 65 20 73 74 61 74 65 0a 09 73  rom the state..s
3540: 65 74 20 6d 79 63 6f 75 6e 74 65 72 20 5b 73 74  et mycounter [st
3550: 61 74 65 20 6f 6e 65 20 7b 20 53 45 4c 45 43 54  ate one { SELECT
3560: 20 4d 41 58 28 63 69 64 29 20 46 52 4f 4d 20 63   MAX(cid) FROM c
3570: 68 61 6e 67 65 73 65 74 20 7d 5d 0a 09 72 65 74  hangeset }]..ret
3580: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  urn.    }..    t
3590: 79 70 65 6d 65 74 68 6f 64 20 6e 75 6d 20 7b 7d  ypemethod num {}
35a0: 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 63 6f 75   { return $mycou
35b0: 6e 74 65 72 20 7d 0a 0a 20 20 20 20 70 72 6f 63  nter }..    proc
35c0: 20 49 6e 69 74 69 61 6c 69 7a 65 42 72 65 61 6b   InitializeBreak
35d0: 53 74 61 74 65 20 7b 72 65 76 69 73 69 6f 6e 73  State {revisions
35e0: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 70 6f 73  } {..upvar 1 pos
35f0: 20 70 6f 73 20 63 72 6f 73 73 20 63 72 6f 73 73   pos cross cross
3600: 20 72 61 6e 67 65 20 72 61 6e 67 65 20 64 65 70   range range dep
3610: 63 20 64 65 70 63 20 64 65 6c 74 61 20 64 65 6c  c depc delta del
3620: 74 61 20 5c 0a 09 20 20 20 20 64 65 70 65 6e 64  ta \..    depend
3630: 65 6e 63 69 65 73 20 64 65 70 65 6e 64 65 6e 63  encies dependenc
3640: 69 65 73 0a 0a 09 23 20 46 69 72 73 74 20 77 65  ies...# First we
3650: 20 63 72 65 61 74 65 20 61 20 6d 61 70 20 6f 66   create a map of
3660: 20 70 6f 73 69 74 69 6f 6e 73 20 74 6f 20 6d 61   positions to ma
3670: 6b 65 20 69 74 20 65 61 73 69 65 72 20 74 6f 0a  ke it easier to.
3680: 09 23 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  .# determine whe
3690: 74 68 65 72 20 61 20 64 65 70 65 6e 64 65 6e 63  ther a dependenc
36a0: 79 20 63 72 6f 73 73 65 73 20 61 20 70 61 72 74  y crosses a part
36b0: 69 63 75 6c 61 72 20 69 6e 64 65 78 2e 0a 0a 09  icular index....
36c0: 61 72 72 61 79 20 73 65 74 20 70 6f 73 20 20 20  array set pos   
36d0: 7b 7d 0a 09 61 72 72 61 79 20 73 65 74 20 63 72  {}..array set cr
36e0: 6f 73 73 20 7b 7d 0a 09 61 72 72 61 79 20 73 65  oss {}..array se
36f0: 74 20 64 65 70 63 20 20 7b 7d 0a 09 73 65 74 20  t depc  {}..set 
3700: 72 61 6e 67 65 20 20 20 20 20 20 20 7b 7d 0a 09  range       {}..
3710: 73 65 74 20 6e 20 30 0a 09 66 6f 72 65 61 63 68  set n 0..foreach
3720: 20 72 65 76 20 24 72 65 76 69 73 69 6f 6e 73 20   rev $revisions 
3730: 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 72  {..    lappend r
3740: 61 6e 67 65 20 24 6e 0a 09 20 20 20 20 73 65 74  ange $n..    set
3750: 20 70 6f 73 28 24 72 65 76 29 20 24 6e 0a 09 20   pos($rev) $n.. 
3760: 20 20 20 73 65 74 20 63 72 6f 73 73 28 24 6e 29     set cross($n)
3770: 20 30 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09   0..    incr n..
3780: 7d 0a 0a 09 23 20 53 65 63 6f 6e 64 6c 79 20 77  }...# Secondly w
3790: 65 20 63 6f 75 6e 74 20 74 68 65 20 63 72 6f 73  e count the cros
37a0: 73 69 6e 67 73 20 70 65 72 20 70 6f 73 69 74 69  sings per positi
37b0: 6f 6e 2c 20 62 79 20 69 74 65 72 61 74 69 6e 67  on, by iterating
37c0: 0a 09 23 20 6f 76 65 72 20 74 68 65 20 72 65 63  ..# over the rec
37d0: 6f 72 64 65 64 20 69 6e 74 65 72 6e 61 6c 20 64  orded internal d
37e0: 65 70 65 6e 64 65 6e 63 69 65 73 2e 0a 0a 09 23  ependencies....#
37f0: 20 4e 6f 74 65 3a 20 49 66 20 74 68 65 20 74 69   Note: If the ti
3800: 6d 65 73 74 61 6d 70 73 20 61 72 65 20 62 61 64  mestamps are bad
3810: 6c 79 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 20  ly out of order 
3820: 69 74 20 69 73 0a 09 23 20 20 20 20 20 20 20 70  it is..#       p
3830: 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20  ossible to have 
3840: 61 20 62 61 63 6b 77 61 72 64 20 73 75 63 63 65  a backward succe
3850: 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 79 2c  ssor dependency,
3860: 0a 09 23 20 20 20 20 20 20 20 69 2e 65 2e 20 77  ..#       i.e. w
3870: 69 74 68 20 73 74 61 72 74 20 3e 20 65 6e 64 2e  ith start > end.
3880: 20 57 65 20 6d 61 79 20 68 61 76 65 20 74 6f 20   We may have to 
3890: 73 77 61 70 20 74 68 65 20 69 6e 64 69 63 65 73  swap the indices
38a0: 0a 09 23 20 20 20 20 20 20 20 74 6f 20 65 6e 73  ..#       to ens
38b0: 75 72 65 20 74 68 61 74 20 74 68 65 20 66 6f 6c  ure that the fol
38c0: 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73  lowing loop runs
38d0: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 09 23 0a 09   correctly...#..
38e0: 23 20 4e 6f 74 65 20 32 3a 20 73 74 61 72 74 20  # Note 2: start 
38f0: 3d 3d 20 65 6e 64 20 69 73 20 6e 6f 74 20 70 6f  == end is not po
3900: 73 73 69 62 6c 65 2e 20 49 74 20 69 6e 64 69 63  ssible. It indic
3910: 61 74 65 73 20 61 0a 09 23 20 20 20 20 20 20 20  ates a..#       
3920: 20 20 73 65 6c 66 2d 64 65 70 65 6e 64 65 6e 63    self-dependenc
3930: 79 20 64 75 65 20 74 6f 20 74 68 65 20 75 6e 69  y due to the uni
3940: 71 75 65 6e 65 73 73 20 6f 66 20 70 6f 73 69 74  queness of posit
3950: 69 6f 6e 73 2c 0a 09 23 20 20 20 20 20 20 20 20  ions,..#        
3960: 20 61 6e 64 20 74 68 61 74 20 69 73 20 73 6f 6d   and that is som
3970: 65 74 68 69 6e 67 20 77 65 20 68 61 76 65 20 72  ething we have r
3980: 75 6c 65 64 20 6f 75 74 20 61 6c 72 65 61 64 79  uled out already
3990: 2c 20 73 65 65 0a 09 23 20 20 20 20 20 20 20 20  , see..#        
39a0: 20 27 72 65 76 20 69 6e 74 65 72 6e 61 6c 73 75   'rev internalsu
39b0: 63 63 65 73 73 6f 72 73 27 2e 0a 0a 09 66 6f 72  ccessors'....for
39c0: 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 72  each {rid childr
39d0: 65 6e 7d 20 5b 61 72 72 61 79 20 67 65 74 20 64  en} [array get d
39e0: 65 70 65 6e 64 65 6e 63 69 65 73 5d 20 7b 0a 09  ependencies] {..
39f0: 20 20 20 20 66 6f 72 65 61 63 68 20 63 68 69 6c      foreach chil
3a00: 64 20 24 63 68 69 6c 64 72 65 6e 20 7b 0a 09 09  d $children {...
3a10: 73 65 74 20 64 6b 65 79 20 20 20 20 5b 6c 69 73  set dkey    [lis
3a20: 74 20 24 72 69 64 20 24 63 68 69 6c 64 5d 0a 09  t $rid $child]..
3a30: 09 73 65 74 20 73 74 61 72 74 20 20 20 24 70 6f  .set start   $po
3a40: 73 28 24 72 69 64 29 0a 09 09 73 65 74 20 65 6e  s($rid)...set en
3a50: 64 20 20 20 20 20 24 70 6f 73 28 24 63 68 69 6c  d     $pos($chil
3a60: 64 29 0a 09 09 73 65 74 20 63 72 6f 73 73 65 73  d)...set crosses
3a70: 20 7b 7d 0a 0a 09 09 69 66 20 7b 24 73 74 61 72   {}....if {$star
3a80: 74 20 3e 20 24 65 6e 64 7d 20 7b 0a 09 09 20 20  t > $end} {...  
3a90: 20 20 77 68 69 6c 65 20 7b 24 65 6e 64 20 3c 20    while {$end < 
3aa0: 24 73 74 61 72 74 7d 20 7b 0a 09 09 09 6c 61 70  $start} {....lap
3ab0: 70 65 6e 64 20 63 72 6f 73 73 65 73 20 24 65 6e  pend crosses $en
3ac0: 64 0a 09 09 09 69 6e 63 72 20 63 72 6f 73 73 28  d....incr cross(
3ad0: 24 65 6e 64 29 0a 09 09 09 69 6e 63 72 20 65 6e  $end)....incr en
3ae0: 64 0a 09 09 20 20 20 20 7d 0a 09 09 7d 20 65 6c  d...    }...} el
3af0: 73 65 20 7b 0a 09 09 20 20 20 20 77 68 69 6c 65  se {...    while
3b00: 20 7b 24 73 74 61 72 74 20 3c 20 24 65 6e 64 7d   {$start < $end}
3b10: 20 7b 0a 09 09 09 6c 61 70 70 65 6e 64 20 63 72   {....lappend cr
3b20: 6f 73 73 65 73 20 24 73 74 61 72 74 0a 09 09 09  osses $start....
3b30: 69 6e 63 72 20 63 72 6f 73 73 28 24 73 74 61 72  incr cross($star
3b40: 74 29 0a 09 09 09 69 6e 63 72 20 73 74 61 72 74  t)....incr start
3b50: 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 09 73  ...    }...}...s
3b60: 65 74 20 64 65 70 63 28 24 64 6b 65 79 29 20 24  et depc($dkey) $
3b70: 63 72 6f 73 73 65 73 0a 09 20 20 20 20 7d 0a 09  crosses..    }..
3b80: 7d 0a 0a 09 49 6e 69 74 69 61 6c 69 7a 65 44 65  }...InitializeDe
3b90: 6c 74 61 73 20 24 72 65 76 69 73 69 6f 6e 73 0a  ltas $revisions.
3ba0: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
3bb0: 20 20 20 70 72 6f 63 20 49 6e 69 74 69 61 6c 69     proc Initiali
3bc0: 7a 65 44 65 6c 74 61 73 20 7b 72 65 76 69 73 69  zeDeltas {revisi
3bd0: 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20  ons} {..upvar 1 
3be0: 64 65 6c 74 61 20 64 65 6c 74 61 0a 0a 09 23 20  delta delta...# 
3bf0: 50 75 6c 6c 20 74 68 65 20 74 69 6d 65 73 74 61  Pull the timesta
3c00: 6d 70 73 20 66 6f 72 20 61 6c 6c 20 72 65 76 69  mps for all revi
3c10: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 63 68 61  sions in the cha
3c20: 6e 67 65 73 65 74 73 20 61 6e 64 0a 09 23 20 63  ngesets and..# c
3c30: 6f 6d 70 75 74 65 20 74 68 65 69 72 20 64 65 6c  ompute their del
3c40: 74 61 73 20 66 6f 72 20 75 73 65 20 62 79 20 74  tas for use by t
3c50: 68 65 20 62 72 65 61 6b 20 66 69 6e 64 65 72 2e  he break finder.
3c60: 0a 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 6c  ...array set del
3c70: 74 61 20 7b 7d 0a 09 61 72 72 61 79 20 73 65 74  ta {}..array set
3c80: 20 73 74 61 6d 70 20 7b 7d 0a 0a 09 73 65 74 20   stamp {}...set 
3c90: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24  theset ('[join $
3ca0: 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d  revisions {','}]
3cb0: 27 29 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64  ')..foreach {rid
3cc0: 20 74 69 6d 65 7d 20 5b 73 74 61 74 65 20 72 75   time} [state ru
3cd0: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20  n "..    SELECT 
3ce0: 52 2e 72 69 64 2c 20 52 2e 64 61 74 65 0a 09 20  R.rid, R.date.. 
3cf0: 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e     FROM revision
3d00: 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e   R..    WHERE R.
3d10: 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09  rid IN $theset..
3d20: 22 5d 20 7b 0a 09 20 20 20 20 73 65 74 20 73 74  "] {..    set st
3d30: 61 6d 70 28 24 72 69 64 29 20 24 74 69 6d 65 0a  amp($rid) $time.
3d40: 09 7d 0a 0a 09 73 65 74 20 6e 20 30 0a 09 66 6f  .}...set n 0..fo
3d50: 72 65 61 63 68 20 72 69 64 20 5b 6c 72 61 6e 67  reach rid [lrang
3d60: 65 20 24 72 65 76 69 73 69 6f 6e 73 20 30 20 65  e $revisions 0 e
3d70: 6e 64 2d 31 5d 20 72 6e 65 78 74 20 5b 6c 72 61  nd-1] rnext [lra
3d80: 6e 67 65 20 24 72 65 76 69 73 69 6f 6e 73 20 31  nge $revisions 1
3d90: 20 65 6e 64 5d 20 7b 0a 09 20 20 20 20 73 65 74   end] {..    set
3da0: 20 64 65 6c 74 61 28 24 6e 29 20 5b 65 78 70 72   delta($n) [expr
3db0: 20 7b 24 73 74 61 6d 70 28 24 72 6e 65 78 74 29   {$stamp($rnext)
3dc0: 20 2d 20 24 73 74 61 6d 70 28 24 72 69 64 29 7d   - $stamp($rid)}
3dd0: 5d 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d  ]..    incr n..}
3de0: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
3df0: 20 20 20 20 70 72 6f 63 20 46 69 6e 64 42 65 73      proc FindBes
3e00: 74 42 72 65 61 6b 20 7b 72 61 6e 67 65 7d 20 7b  tBreak {range} {
3e10: 0a 09 75 70 76 61 72 20 31 20 63 72 6f 73 73 20  ..upvar 1 cross 
3e20: 63 72 6f 73 73 20 64 65 6c 74 61 20 64 65 6c 74  cross delta delt
3e30: 61 0a 0a 09 23 20 44 65 74 65 72 6d 69 6e 65 20  a...# Determine 
3e40: 74 68 65 20 62 65 73 74 20 62 72 65 61 6b 20 6c  the best break l
3e50: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 67  ocation in the g
3e60: 69 76 65 6e 20 72 61 6e 67 65 20 6f 66 0a 09 23  iven range of..#
3e70: 20 70 6f 73 69 74 69 6f 6e 73 2e 20 46 69 72 73   positions. Firs
3e80: 74 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 68  t we look for th
3e90: 65 20 6c 6f 63 61 74 69 6f 6e 73 20 77 69 74 68  e locations with
3ea0: 20 74 68 65 20 6d 61 78 69 6d 61 6c 0a 09 23 20   the maximal..# 
3eb0: 6e 75 6d 62 65 72 20 6f 66 20 63 72 6f 73 73 69  number of crossi
3ec0: 6e 67 73 2e 20 49 66 20 74 68 65 72 65 20 61 72  ngs. If there ar
3ed0: 65 20 73 65 76 65 72 61 6c 20 77 65 20 6c 6f 6f  e several we loo
3ee0: 6b 20 66 6f 72 20 74 68 65 0a 09 23 20 73 68 6f  k for the..# sho
3ef0: 72 74 65 73 74 20 74 69 6d 65 20 69 6e 74 65 72  rtest time inter
3f00: 76 61 6c 20 61 6d 6f 6e 67 20 74 68 65 6d 2e 20  val among them. 
3f10: 49 66 20 77 65 20 73 74 69 6c 6c 20 68 61 76 65  If we still have
3f20: 20 6d 75 6c 74 69 70 6c 65 0a 09 23 20 70 6f 73   multiple..# pos
3f30: 73 69 62 69 6c 69 74 69 65 73 20 61 66 74 65 72  sibilities after
3f40: 20 74 68 61 74 20 77 65 20 73 65 6c 65 63 74 20   that we select 
3f50: 74 68 65 20 65 61 72 6c 69 65 73 74 20 6c 6f 63  the earliest loc
3f60: 61 74 69 6f 6e 0a 09 23 20 61 6d 6f 6e 67 20 74  ation..# among t
3f70: 68 65 73 65 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20  hese....# Note: 
3f80: 49 66 20 74 68 65 20 6d 61 78 69 6d 61 6c 20 6e  If the maximal n
3f90: 75 6d 62 65 72 20 6f 66 20 63 72 6f 73 73 69 6e  umber of crossin
3fa0: 67 73 20 69 73 20 30 20 74 68 65 6e 20 74 68 65  gs is 0 then the
3fb0: 20 72 61 6e 67 65 0a 09 23 20 20 20 20 20 20 20   range..#       
3fc0: 68 61 73 20 6e 6f 20 69 6e 74 65 72 6e 61 6c 20  has no internal 
3fd0: 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 6e  dependencies, an
3fe0: 64 20 6e 6f 20 62 72 65 61 6b 20 6c 6f 63 61 74  d no break locat
3ff0: 69 6f 6e 20 61 74 0a 09 23 20 20 20 20 20 20 20  ion at..#       
4000: 61 6c 6c 2e 20 54 68 69 73 20 70 6f 73 73 69 62  all. This possib
4010: 69 6c 69 74 79 20 69 73 20 73 69 67 6e 61 6c 65  ility is signale
4020: 64 20 76 69 61 20 72 65 73 75 6c 74 20 2d 31 2e  d via result -1.
4030: 0a 0a 09 23 20 4e 6f 74 65 3a 20 41 20 72 61 6e  ...# Note: A ran
4040: 67 65 20 6f 66 20 6c 65 6e 67 74 68 20 31 20 6f  ge of length 1 o
4050: 72 20 6c 65 73 73 20 63 61 6e 6e 6f 74 20 68 61  r less cannot ha
4060: 76 65 20 69 6e 74 65 72 6e 61 6c 0a 09 23 20 20  ve internal..#  
4070: 20 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65       dependencie
4080: 73 2c 20 61 73 20 74 68 61 74 20 6e 65 65 64 73  s, as that needs
4090: 20 61 74 20 6c 65 61 73 74 20 74 77 6f 20 72 65   at least two re
40a0: 76 69 73 69 6f 6e 73 20 69 6e 0a 09 23 20 20 20  visions in..#   
40b0: 20 20 20 20 74 68 65 20 72 61 6e 67 65 2e 0a 0a      the range...
40c0: 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 72  .if {[llength $r
40d0: 61 6e 67 65 5d 20 3c 20 32 7d 20 7b 20 72 65 74  ange] < 2} { ret
40e0: 75 72 6e 20 2d 31 20 7d 0a 0a 09 73 65 74 20 6d  urn -1 }...set m
40f0: 61 78 20 2d 31 0a 09 73 65 74 20 62 65 73 74 20  ax -1..set best 
4100: 7b 7d 0a 0a 09 66 6f 72 65 61 63 68 20 6c 6f 63  {}...foreach loc
4110: 61 74 69 6f 6e 20 24 72 61 6e 67 65 20 7b 0a 09  ation $range {..
4120: 20 20 20 20 73 65 74 20 63 72 6f 73 73 69 6e 67      set crossing
4130: 73 20 24 63 72 6f 73 73 28 24 6c 6f 63 61 74 69  s $cross($locati
4140: 6f 6e 29 0a 09 20 20 20 20 69 66 20 7b 24 63 72  on)..    if {$cr
4150: 6f 73 73 69 6e 67 73 20 3e 20 24 6d 61 78 7d 20  ossings > $max} 
4160: 7b 0a 09 09 73 65 74 20 6d 61 78 20 20 24 63 72  {...set max  $cr
4170: 6f 73 73 69 6e 67 73 0a 09 09 73 65 74 20 62 65  ossings...set be
4180: 73 74 20 5b 6c 69 73 74 20 24 6c 6f 63 61 74 69  st [list $locati
4190: 6f 6e 5d 0a 09 09 63 6f 6e 74 69 6e 75 65 0a 09  on]...continue..
41a0: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63      } elseif {$c
41b0: 72 6f 73 73 69 6e 67 73 20 3d 3d 20 24 6d 61 78  rossings == $max
41c0: 7d 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 62 65  } {...lappend be
41d0: 73 74 20 24 6c 6f 63 61 74 69 6f 6e 0a 09 20 20  st $location..  
41e0: 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b 24 6d 61    }..}...if {$ma
41f0: 78 20 3d 3d 20 30 7d 20 20 20 20 20 20 20 20 20  x == 0}         
4200: 20 20 20 7b 20 72 65 74 75 72 6e 20 2d 31 20 7d     { return -1 }
4210: 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24  ..if {[llength $
4220: 62 65 73 74 5d 20 3d 3d 20 31 7d 20 7b 20 72 65  best] == 1} { re
4230: 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 62 65  turn [lindex $be
4240: 73 74 20 30 5d 20 7d 0a 0a 09 73 65 74 20 6c 6f  st 0] }...set lo
4250: 63 61 74 69 6f 6e 73 20 24 62 65 73 74 0a 09 73  cations $best..s
4260: 65 74 20 62 65 73 74 20 7b 7d 0a 09 73 65 74 20  et best {}..set 
4270: 6d 69 6e 20 2d 31 0a 0a 09 66 6f 72 65 61 63 68  min -1...foreach
4280: 20 6c 6f 63 61 74 69 6f 6e 20 24 6c 6f 63 61 74   location $locat
4290: 69 6f 6e 73 20 7b 0a 09 20 20 20 20 73 65 74 20  ions {..    set 
42a0: 69 6e 74 65 72 76 61 6c 20 24 64 65 6c 74 61 28  interval $delta(
42b0: 24 6c 6f 63 61 74 69 6f 6e 29 0a 09 20 20 20 20  $location)..    
42c0: 69 66 20 7b 28 24 6d 69 6e 20 3c 20 30 29 20 7c  if {($min < 0) |
42d0: 7c 20 28 24 69 6e 74 65 72 76 61 6c 20 3c 20 24  | ($interval < $
42e0: 6d 69 6e 29 7d 20 7b 0a 09 09 73 65 74 20 6d 69  min)} {...set mi
42f0: 6e 20 20 24 69 6e 74 65 72 76 61 6c 0a 09 09 73  n  $interval...s
4300: 65 74 20 62 65 73 74 20 5b 6c 69 73 74 20 24 6c  et best [list $l
4310: 6f 63 61 74 69 6f 6e 5d 0a 09 20 20 20 20 7d 20  ocation]..    } 
4320: 65 6c 73 65 69 66 20 7b 24 69 6e 74 65 72 76 61  elseif {$interva
4330: 6c 20 3d 3d 20 24 6d 69 6e 7d 20 7b 0a 09 09 6c  l == $min} {...l
4340: 61 70 70 65 6e 64 20 62 65 73 74 20 24 6c 6f 63  append best $loc
4350: 61 74 69 6f 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a  ation..    }..}.
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 72 65 74 75 72 6e  st 0] }...return
43a0: 20 5b 6c 69 6e 64 65 78 20 5b 6c 73 6f 72 74 20   [lindex [lsort 
43b0: 2d 69 6e 74 65 67 65 72 20 2d 69 6e 63 72 65 61  -integer -increa
43c0: 73 69 6e 67 20 24 62 65 73 74 5d 20 30 5d 0a 20  sing $best] 0]. 
43d0: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 43     }..    proc C
43e0: 75 74 41 74 20 7b 6c 6f 63 61 74 69 6f 6e 7d 20  utAt {location} 
43f0: 7b 0a 09 75 70 76 61 72 20 31 20 63 72 6f 73 73  {..upvar 1 cross
4400: 20 63 72 6f 73 73 20 64 65 70 63 20 64 65 70 63   cross depc depc
4410: 0a 0a 09 23 20 49 74 20 77 61 73 20 64 65 63 69  ...# It was deci
4420: 64 65 64 20 74 6f 20 73 70 6c 69 74 20 74 68 65  ded to split the
4430: 20 63 68 61 6e 67 65 73 65 74 20 61 74 20 74 68   changeset at th
4440: 65 20 67 69 76 65 6e 0a 09 23 20 6c 6f 63 61 74  e given..# locat
4450: 69 6f 6e 2e 20 54 68 69 73 20 63 75 74 73 20 61  ion. This cuts a
4460: 20 6e 75 6d 62 65 72 20 6f 66 20 64 65 70 65 6e   number of depen
4470: 64 65 6e 63 69 65 73 2e 20 48 65 72 65 20 77 65  dencies. Here we
4480: 20 75 70 64 61 74 65 0a 09 23 20 74 68 65 20 63   update..# the c
4490: 72 6f 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ross information
44a0: 20 73 6f 20 74 68 61 74 20 74 68 65 20 62 72 65   so that the bre
44b0: 61 6b 20 66 69 6e 64 65 72 20 68 61 73 20 61 63  ak finder has ac
44c0: 63 75 72 61 74 65 0a 09 23 20 64 61 74 61 20 77  curate..# data w
44d0: 68 65 6e 20 77 65 20 6c 6f 6f 6b 20 61 74 20 74  hen we look at t
44e0: 68 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 61  he generated fra
44f0: 67 6d 65 6e 74 73 2e 0a 0a 09 73 65 74 20 73 69  gments....set si
4500: 78 20 5b 6c 6f 67 20 76 69 73 69 62 6c 65 3f 20  x [log visible? 
4510: 36 5d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 64 65  6]...foreach {de
4520: 70 20 72 61 6e 67 65 7d 20 5b 61 72 72 61 79 20  p range} [array 
4530: 67 65 74 20 64 65 70 63 5d 20 7b 0a 09 20 20 20  get depc] {..   
4540: 20 23 20 43 68 65 63 6b 20 61 6c 6c 20 64 65 70   # Check all dep
4550: 65 6e 64 65 6e 63 69 65 73 20 73 74 69 6c 6c 20  endencies still 
4560: 6b 6e 6f 77 6e 2c 20 74 61 6b 65 20 74 68 65 69  known, take thei
4570: 72 20 72 61 6e 67 65 20 61 6e 64 0a 09 20 20 20  r range and..   
4580: 20 23 20 73 65 65 20 69 66 20 74 68 65 20 62 72   # see if the br
4590: 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 66 61 6c  eak location fal
45a0: 6c 73 20 77 69 74 68 69 6e 2e 0a 0a 09 20 20 20  ls within....   
45b0: 20 42 6f 72 64 65 72 20 24 72 61 6e 67 65 20 73   Border $range s
45c0: 20 65 0a 09 20 20 20 20 69 66 20 7b 24 6c 6f 63   e..    if {$loc
45d0: 61 74 69 6f 6e 20 3c 20 24 73 7d 20 63 6f 6e 74  ation < $s} cont
45e0: 69 6e 75 65 20 3b 20 23 20 62 72 65 61 6b 20 62  inue ; # break b
45f0: 65 66 6f 72 65 20 72 61 6e 67 65 2c 20 69 67 6e  efore range, ign
4600: 6f 72 65 0a 09 20 20 20 20 69 66 20 7b 24 6c 6f  ore..    if {$lo
4610: 63 61 74 69 6f 6e 20 3e 20 24 65 7d 20 63 6f 6e  cation > $e} con
4620: 74 69 6e 75 65 20 3b 20 23 20 62 72 65 61 6b 20  tinue ; # break 
4630: 61 66 74 65 72 20 72 61 6e 67 65 2c 20 69 67 6e  after range, ign
4640: 6f 72 65 2e 0a 0a 09 20 20 20 20 23 20 54 68 69  ore....    # Thi
4650: 73 20 64 65 70 65 6e 64 65 6e 63 79 20 63 72 6f  s dependency cro
4660: 73 73 65 73 20 74 68 65 20 62 72 65 61 6b 20 6c  sses the break l
4670: 6f 63 61 74 69 6f 6e 2e 20 57 65 20 72 65 6d 6f  ocation. We remo
4680: 76 65 20 69 74 0a 09 20 20 20 20 23 20 66 72 6f  ve it..    # fro
4690: 6d 20 74 68 65 20 63 72 6f 73 73 69 6e 67 73 20  m the crossings 
46a0: 63 6f 75 6e 74 65 72 73 2c 20 61 6e 64 20 74 68  counters, and th
46b0: 65 6e 20 61 6c 73 6f 20 66 72 6f 6d 20 74 68 65  en also from the
46c0: 20 73 65 74 0a 09 20 20 20 20 23 20 6f 66 20 6b   set..    # of k
46d0: 6e 6f 77 6e 20 64 65 70 65 6e 64 65 6e 63 69 65  nown dependencie
46e0: 73 2c 20 61 73 20 77 65 20 61 72 65 20 64 6f 6e  s, as we are don
46f0: 65 20 77 69 74 68 20 69 74 2e 0a 0a 09 20 20 20  e with it....   
4700: 20 66 6f 72 65 61 63 68 20 6c 6f 63 20 24 64 65   foreach loc $de
4710: 70 63 28 24 64 65 70 29 20 7b 20 69 6e 63 72 20  pc($dep) { incr 
4720: 63 72 6f 73 73 28 24 6c 6f 63 29 20 2d 31 20 7d  cross($loc) -1 }
4730: 0a 09 20 20 20 20 75 6e 73 65 74 20 64 65 70 63  ..    unset depc
4740: 28 24 64 65 70 29 0a 0a 09 20 20 20 20 69 66 20  ($dep)...    if 
4750: 7b 21 24 73 69 78 7d 20 63 6f 6e 74 69 6e 75 65  {!$six} continue
4760: 0a 0a 09 20 20 20 20 73 74 72 75 63 74 3a 3a 6c  ...    struct::l
4770: 69 73 74 20 61 73 73 69 67 6e 20 24 64 65 70 20  ist assign $dep 
4780: 70 61 72 65 6e 74 20 63 68 69 6c 64 0a 09 20 20  parent child..  
4790: 20 20 6c 6f 67 20 77 72 69 74 65 20 35 20 63 73    log write 5 cs
47a0: 65 74 73 20 22 42 72 6f 6b 65 20 64 65 70 65 6e  ets "Broke depen
47b0: 64 65 6e 63 79 20 5b 50 44 20 24 70 61 72 65 6e  dency [PD $paren
47c0: 74 5d 20 2d 2d 3e 20 5b 50 44 20 24 63 68 69 6c  t] --> [PD $chil
47d0: 64 5d 22 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 0a  d]"..}...return.
47e0: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 50 72 69      }..    # Pri
47f0: 6e 74 20 69 64 65 6e 74 69 66 79 69 6e 67 20 64  nt identifying d
4800: 61 74 61 20 66 6f 72 20 61 20 72 65 76 69 73 69  ata for a revisi
4810: 6f 6e 20 28 70 72 6f 6a 65 63 74 2c 20 66 69 6c  on (project, fil
4820: 65 2c 20 64 6f 74 74 65 64 20 72 65 76 0a 20 20  e, dotted rev.  
4830: 20 20 23 20 6e 75 6d 62 65 72 29 2c 20 66 6f 72    # number), for
4840: 20 68 69 67 68 20 76 65 72 62 6f 73 69 74 79 20   high verbosity 
4850: 6c 6f 67 20 6f 75 74 70 75 74 2e 0a 0a 20 20 20  log output...   
4860: 20 70 72 6f 63 20 50 44 20 7b 69 64 7d 20 7b 0a   proc PD {id} {.
4870: 09 66 6f 72 65 61 63 68 20 7b 70 20 66 20 72 7d  .foreach {p f r}
4880: 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09   [state run {...
4890: 53 45 4c 45 43 54 20 50 2e 6e 61 6d 65 20 2c 20  SELECT P.name , 
48a0: 46 2e 6e 61 6d 65 2c 20 52 2e 72 65 76 0a 09 09  F.name, R.rev...
48b0: 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c  FROM revision R,
48c0: 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65 63 74   file F, project
48d0: 20 50 0a 09 09 57 48 45 52 45 20 52 2e 72 69 64   P...WHERE R.rid
48e0: 20 3d 20 24 69 64 0a 09 09 41 4e 44 20 20 20 52   = $id...AND   R
48f0: 2e 66 69 64 20 3d 20 46 2e 66 69 64 0a 09 09 41  .fid = F.fid...A
4900: 4e 44 20 20 20 46 2e 70 69 64 20 3d 20 50 2e 70  ND   F.pid = P.p
4910: 69 64 0a 09 7d 5d 20 62 72 65 61 6b 0a 09 72 65  id..}] break..re
4920: 74 75 72 6e 20 22 27 24 70 20 3a 20 24 66 2f 24  turn "'$p : $f/$
4930: 72 27 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  r'".    }..    #
4940: 20 50 72 69 6e 74 69 6e 67 20 6f 6e 65 20 6f 72   Printing one or
4950: 20 6d 6f 72 65 20 72 61 6e 67 65 73 2c 20 66 6f   more ranges, fo
4960: 72 6d 61 74 74 65 64 2c 20 61 6e 64 20 6f 6e 6c  rmatted, and onl
4970: 79 20 74 68 65 69 72 20 62 6f 72 64 65 72 20 74  y their border t
4980: 6f 0a 20 20 20 20 23 20 6b 65 65 70 20 74 68 65  o.    # keep the
4990: 20 73 74 72 69 6e 67 73 20 73 68 6f 72 74 2e 0a   strings short..
49a0: 0a 20 20 20 20 70 72 6f 63 20 50 52 73 20 7b 72  .    proc PRs {r
49b0: 61 6e 67 65 73 7d 20 7b 0a 09 72 65 74 75 72 6e  anges} {..return
49c0: 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d   [struct::list m
49d0: 61 70 20 24 72 61 6e 67 65 73 20 5b 6d 79 70 72  ap $ranges [mypr
49e0: 6f 63 20 50 52 5d 5d 0a 20 20 20 20 7d 0a 0a 20  oc PR]].    }.. 
49f0: 20 20 20 70 72 6f 63 20 50 52 20 7b 72 61 6e 67     proc PR {rang
4a00: 65 7d 20 7b 0a 09 42 6f 72 64 65 72 20 24 72 61  e} {..Border $ra
4a10: 6e 67 65 20 73 20 65 0a 09 72 65 74 75 72 6e 20  nge s e..return 
4a20: 3c 24 7b 73 7d 2e 2e 2e 24 7b 65 7d 3e 0a 20 20  <${s}...${e}>.  
4a30: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 42 6f    }..    proc Bo
4a40: 72 64 65 72 20 7b 72 61 6e 67 65 20 73 76 20 65  rder {range sv e
4a50: 76 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 73  v} {..upvar 1 $s
4a60: 76 20 73 20 24 65 76 20 65 0a 09 73 65 74 20 73  v s $ev e..set s
4a70: 20 5b 6c 69 6e 64 65 78 20 24 72 61 6e 67 65 20   [lindex $range 
4a80: 30 5d 0a 09 73 65 74 20 65 20 5b 6c 69 6e 64 65  0]..set e [linde
4a90: 78 20 24 72 61 6e 67 65 20 65 6e 64 5d 0a 09 72  x $range end]..r
4aa0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
4ab0: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23   # # ## ### ####
4ac0: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
4ad0: 23 23 23 23 23 23 23 23 0a 0a 20 20 20 20 74 79  ########..    ty
4ae0: 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 68 61  pevariable mycha
4af0: 6e 67 65 73 65 74 73 20 20 20 20 20 7b 7d 20 3b  ngesets     {} ;
4b00: 20 23 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 6b   # List of all k
4b10: 6e 6f 77 6e 20 63 68 61 6e 67 65 73 65 74 73 2e  nown changesets.
4b20: 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c  .    typevariabl
4b30: 65 20 6d 79 69 74 65 6d 6d 61 70 20 2d 61 72 72  e myitemmap -arr
4b40: 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 66 72  ay {} ; # Map fr
4b50: 6f 6d 20 69 74 65 6d 73 20 28 74 61 67 67 65 64  om items (tagged
4b60: 29 20 74 6f 0a 09 09 09 09 20 20 20 20 20 20 20  ) to.....       
4b70: 23 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 68  # the list of ch
4b80: 61 6e 67 65 73 65 74 73 0a 09 09 09 09 20 20 20  angesets.....   
4b90: 20 20 20 20 23 20 63 6f 6e 74 61 69 6e 69 6e 67      # containing
4ba0: 20 69 74 2e 20 45 61 63 68 20 69 74 65 6d 20 63   it. Each item c
4bb0: 61 6e 0a 09 09 09 09 20 20 20 20 20 20 20 23 20  an.....       # 
4bc0: 62 65 20 75 73 65 64 20 62 79 20 6f 6e 6c 79 20  be used by only 
4bd0: 6f 6e 65 0a 09 09 09 09 20 20 20 20 20 20 20 23  one.....       #
4be0: 20 63 68 61 6e 67 65 73 65 74 2e 0a 20 20 20 20   changeset..    
4bf0: 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 69  typevariable myi
4c00: 64 6d 61 70 20 20 20 2d 61 72 72 61 79 20 7b 7d  dmap   -array {}
4c10: 20 3b 20 23 20 4d 61 70 20 66 72 6f 6d 20 63 68   ; # Map from ch
4c20: 61 6e 67 65 73 65 74 20 69 64 20 74 6f 0a 09 09  angeset id to...
4c30: 09 09 20 20 20 20 20 20 20 23 20 63 68 61 6e 67  ..       # chang
4c40: 65 73 65 74 2e 0a 0a 20 20 20 20 74 79 70 65 6d  eset...    typem
4c50: 65 74 68 6f 64 20 61 6c 6c 20 20 20 20 7b 7d 20  ethod all    {} 
4c60: 20 20 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 63     { return $myc
4c70: 68 61 6e 67 65 73 65 74 73 20 7d 0a 20 20 20 20  hangesets }.    
4c80: 74 79 70 65 6d 65 74 68 6f 64 20 6f 66 20 20 20  typemethod of   
4c90: 20 20 7b 63 69 64 7d 20 7b 20 72 65 74 75 72 6e    {cid} { return
4ca0: 20 24 6d 79 69 64 6d 61 70 28 24 63 69 64 29 20   $myidmap($cid) 
4cb0: 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  }.    typemethod
4cc0: 20 6f 66 69 74 65 6d 20 7b 69 69 64 7d 20 7b 20   ofitem {iid} { 
4cd0: 72 65 74 75 72 6e 20 24 6d 79 69 74 65 6d 6d 61  return $myitemma
4ce0: 70 28 24 69 69 64 29 20 7d 0a 0a 20 20 20 20 23  p($iid) }..    #
4cf0: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20   # ## ### ##### 
4d00: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
4d10: 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 43 6f  ######.    ## Co
4d20: 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a 20 20 20  nfiguration..   
4d30: 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65   pragma -hastype
4d40: 69 6e 66 6f 20 20 20 20 6e 6f 20 20 3b 20 23 20  info    no  ; # 
4d50: 6e 6f 20 74 79 70 65 20 69 6e 74 72 6f 73 70 65  no type introspe
4d60: 63 74 69 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61  ction.    pragma
4d70: 20 2d 68 61 73 69 6e 66 6f 20 20 20 20 20 20 20   -hasinfo       
4d80: 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 6f 62 6a 65   no  ; # no obje
4d90: 63 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e  ct introspection
4da0: 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23  ..    # # ## ###
4db0: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20   ##### ######## 
4dc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 7d 0a  #############.}.
4dd0: 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23  .# # ## ### ####
4de0: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
4df0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
4e00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23  ##############.#
4e10: 23 20 48 65 6c 70 65 72 20 73 69 6e 67 6c 65 74  # Helper singlet
4e20: 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20 66 6f 72  on. Commands for
4e30: 20 72 65 76 69 73 69 6f 6e 20 63 68 61 6e 67 65   revision change
4e40: 73 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70  sets...snit::typ
4e50: 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a  e ::vc::fossil::
4e60: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f  import::cvs::pro
4e70: 6a 65 63 74 3a 3a 72 65 76 3a 3a 72 65 76 20 7b  ject::rev::rev {
4e80: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
4e90: 62 79 72 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 20  byrevision {} { 
4ea0: 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74  return 1 }.    t
4eb0: 79 70 65 6d 65 74 68 6f 64 20 62 79 73 79 6d 62  ypemethod bysymb
4ec0: 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e  ol   {} { return
4ed0: 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74   0 }.    typemet
4ee0: 68 6f 64 20 69 73 74 61 67 20 20 20 20 20 20 7b  hod istag      {
4ef0: 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20  } { return 0 }. 
4f00: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73     typemethod is
4f10: 62 72 61 6e 63 68 20 20 20 7b 7d 20 7b 20 72 65  branch   {} { re
4f20: 74 75 72 6e 20 30 20 7d 0a 0a 20 20 20 20 23 20  turn 0 }..    # 
4f30: 72 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 6d  result = list (m
4f40: 69 6e 74 69 6d 65 2c 20 6d 61 78 74 69 6d 65 29  intime, maxtime)
4f50: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
4f60: 74 69 6d 65 72 61 6e 67 65 20 7b 69 74 65 6d 73  timerange {items
4f70: 7d 20 7b 0a 09 73 65 74 20 74 68 65 73 65 74 20  } {..set theset 
4f80: 28 27 5b 6a 6f 69 6e 20 24 69 74 65 6d 73 20 7b  ('[join $items {
4f90: 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20  ','}]')..return 
4fa0: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20  [state run "..  
4fb0: 20 20 53 45 4c 45 43 54 20 4d 49 4e 28 52 2e 64    SELECT MIN(R.d
4fc0: 61 74 65 29 2c 20 4d 41 58 28 52 2e 64 61 74 65  ate), MAX(R.date
4fd0: 29 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69  )..    FROM revi
4fe0: 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52  sion R..    WHER
4ff0: 45 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73  E R.rid IN $thes
5000: 65 74 0a 09 22 5d 0a 20 20 20 20 7d 0a 0a 20 20  et.."].    }..  
5010: 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 69    # var(dv) = di
5020: 63 74 20 28 72 65 76 69 73 69 6f 6e 20 2d 3e 20  ct (revision -> 
5030: 6c 69 73 74 20 28 72 65 76 69 73 69 6f 6e 29 29  list (revision))
5040: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
5050: 69 6e 74 65 72 6e 61 6c 73 75 63 63 65 73 73 6f  internalsuccesso
5060: 72 73 20 7b 64 76 20 72 65 76 69 73 69 6f 6e 73  rs {dv revisions
5070: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76  } {..upvar 1 $dv
5080: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 73   dependencies..s
5090: 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69  et theset ('[joi
50a0: 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c  n $revisions {',
50b0: 27 7d 5d 27 29 0a 0a 09 23 20 53 65 65 20 27 73  '}]')...# See 's
50c0: 75 63 63 65 73 73 6f 72 73 27 20 62 65 6c 6f 77  uccessors' below
50d0: 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 65 78   for the main ex
50e0: 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 0a 09 23 20  planation of..# 
50f0: 74 68 65 20 76 61 72 69 6f 75 73 20 63 61 73 65  the various case
5100: 73 2e 20 54 68 69 73 20 70 69 65 63 65 20 69 73  s. This piece is
5110: 20 73 70 65 63 69 61 6c 20 69 6e 20 74 68 61 74   special in that
5120: 20 69 74 0a 09 23 20 72 65 73 74 72 69 63 74 73   it..# restricts
5130: 20 74 68 65 20 73 75 63 63 65 73 73 6f 72 73 20   the successors 
5140: 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 6f 20 74  we look for to t
5150: 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66 0a 09  he same set of..
5160: 23 20 72 65 76 69 73 69 6f 6e 73 20 77 65 20 73  # revisions we s
5170: 74 61 72 74 20 66 72 6f 6d 2e 20 53 65 6e 73 69  tart from. Sensi
5180: 62 6c 65 20 61 73 20 77 65 20 61 72 65 20 6c 6f  ble as we are lo
5190: 6f 6b 69 6e 67 20 66 6f 72 0a 09 23 20 63 68 61  oking for..# cha
51a0: 6e 67 65 73 65 74 20 69 6e 74 65 72 6e 61 6c 20  ngeset internal 
51b0: 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 0a 0a 09  dependencies....
51c0: 61 72 72 61 79 20 73 65 74 20 64 65 70 20 7b 7d  array set dep {}
51d0: 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20  ...foreach {rid 
51e0: 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75  child} [state ru
51f0: 6e 20 22 0a 20 20 20 2d 2d 20 28 31 29 20 50 72  n ".   -- (1) Pr
5200: 69 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20  imary child..   
5210: 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52   SELECT R.rid, R
5220: 2e 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d  .child..    FROM
5230: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20     revision R.. 
5240: 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20     WHERE  R.rid 
5250: 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20    IN $theset    
5260: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
5270: 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74  revisions of int
5280: 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20  erest..    AND  
5290: 20 20 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54    R.child IS NOT
52a0: 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20   NULL    -- Has 
52b0: 70 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 09 20  primary child.. 
52c0: 20 20 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c     AND    R.chil
52d0: 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20  d IN $theset    
52e0: 20 2d 2d 20 57 68 69 63 68 20 69 73 20 61 6c 73   -- Which is als
52f0: 6f 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 20 20  o of interest.  
5300: 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28    UNION.    -- (
5310: 32 29 20 53 65 63 6f 6e 64 61 72 79 20 28 62 72  2) Secondary (br
5320: 61 6e 63 68 29 20 63 68 69 6c 64 72 65 6e 0a 09  anch) children..
5330: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64      SELECT R.rid
5340: 2c 20 42 2e 62 72 69 64 0a 09 20 20 20 20 46 52  , B.brid..    FR
5350: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c  OM   revision R,
5360: 20 72 65 76 69 73 69 6f 6e 62 72 61 6e 63 68 63   revisionbranchc
5370: 68 69 6c 64 72 65 6e 20 42 0a 09 20 20 20 20 57  hildren B..    W
5380: 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e  HERE  R.rid   IN
5390: 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20   $theset     -- 
53a0: 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69  Restrict to revi
53b0: 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73  sions of interes
53c0: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e  t..    AND    R.
53d0: 72 69 64 20 3d 20 42 2e 72 69 64 20 20 20 20 20  rid = B.rid     
53e0: 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 73       -- Select s
53f0: 75 62 73 65 74 20 6f 66 20 62 72 61 6e 63 68 20  ubset of branch 
5400: 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 41 4e  children..    AN
5410: 44 20 20 20 20 42 2e 62 72 69 64 20 49 4e 20 24  D    B.brid IN $
5420: 74 68 65 73 65 74 20 20 20 20 20 20 2d 2d 20 57  theset      -- W
5430: 68 69 63 68 20 69 73 20 61 6c 73 6f 20 6f 66 20  hich is also of 
5440: 69 6e 74 65 72 65 73 74 0a 20 20 20 20 55 4e 49  interest.    UNI
5450: 4f 4e 0a 20 20 20 20 2d 2d 20 28 34 29 20 43 68  ON.    -- (4) Ch
5460: 69 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f  ild of trunk roo
5470: 74 20 73 75 63 63 65 73 73 6f 72 20 6f 66 20 6c  t successor of l
5480: 61 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e  ast NTDB on trun
5490: 6b 2e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52  k...    SELECT R
54a0: 2e 72 69 64 2c 20 52 41 2e 63 68 69 6c 64 0a 09  .rid, RA.child..
54b0: 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f      FROM revisio
54c0: 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 52 41  n R, revision RA
54d0: 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e 72 69  ..    WHERE R.ri
54e0: 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20  d   IN $theset  
54f0: 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20      -- Restrict 
5500: 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20  to revisions of 
5510: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e  interest..    AN
5520: 44 20 20 20 52 2e 69 73 64 65 66 61 75 6c 74 20  D   R.isdefault 
5530: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 52              -- R
5540: 65 73 74 72 69 63 74 20 74 6f 20 4e 54 44 42 0a  estrict to NTDB.
5550: 09 20 20 20 20 41 4e 44 20 20 20 52 2e 64 62 63  .    AND   R.dbc
5560: 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  hild IS NOT NULL
5570: 20 20 20 2d 2d 20 61 6e 64 20 6c 61 73 74 20 4e     -- and last N
5580: 54 44 42 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  TDB belonging to
5590: 20 74 72 75 6e 6b 0a 09 20 20 20 20 41 4e 44 20   trunk..    AND 
55a0: 20 20 52 41 2e 72 69 64 20 3d 20 52 2e 64 62 63    RA.rid = R.dbc
55b0: 68 69 6c 64 20 20 20 20 20 20 2d 2d 20 47 6f 20  hild      -- Go 
55c0: 64 69 72 65 63 74 6c 79 20 74 6f 20 74 72 75 6e  directly to trun
55d0: 6b 20 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20  k root..    AND 
55e0: 20 20 52 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f    RA.child IS NO
55f0: 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73  T NULL    -- Has
5600: 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a   primary child..
5610: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
5620: 20 20 52 41 2e 63 68 69 6c 64 20 49 4e 20 24 74    RA.child IN $t
5630: 68 65 73 65 74 20 20 20 20 20 2d 2d 20 57 68 69  heset     -- Whi
5640: 63 68 20 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e  ch is also of in
5650: 74 65 72 65 73 74 0a 09 22 5d 20 7b 0a 09 20 20  terest.."] {..  
5660: 20 20 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76    # Consider mov
5670: 69 6e 67 20 74 68 69 73 20 74 6f 20 74 68 65 20  ing this to the 
5680: 69 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 6c 65  integrity module
5690: 2e 0a 09 20 20 20 20 69 6e 74 65 67 72 69 74 79  ...    integrity
56a0: 20 61 73 73 65 72 74 20 7b 24 72 69 64 20 21 3d   assert {$rid !=
56b0: 20 24 63 68 69 6c 64 7d 20 7b 52 65 76 69 73 69   $child} {Revisi
56c0: 6f 6e 20 24 72 69 64 20 64 65 70 65 6e 64 73 20  on $rid depends 
56d0: 6f 6e 20 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20  on itself.}..   
56e0: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65   lappend depende
56f0: 6e 63 69 65 73 28 24 72 69 64 29 20 24 63 68 69  ncies($rid) $chi
5700: 6c 64 0a 09 20 20 20 20 73 65 74 20 64 65 70 28  ld..    set dep(
5710: 24 72 69 64 2c 24 63 68 69 6c 64 29 20 2e 0a 09  $rid,$child) ...
5720: 7d 0a 0a 09 23 20 54 68 65 20 73 71 6c 20 73 74  }...# The sql st
5730: 61 74 65 6d 65 6e 74 73 20 61 62 6f 76 65 20 6c  atements above l
5740: 6f 6f 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 64 69  ooks only for di
5750: 72 65 63 74 20 64 65 70 65 6e 64 65 6e 63 69 65  rect dependencie
5760: 73 0a 09 23 20 62 65 74 77 65 65 6e 20 72 65 76  s..# between rev
5770: 69 73 69 6f 6e 20 69 6e 20 74 68 65 20 63 68 61  ision in the cha
5780: 6e 67 65 73 65 74 2e 20 48 6f 77 65 76 65 72 20  ngeset. However 
5790: 64 75 65 20 74 6f 20 74 68 65 0a 09 23 20 76 61  due to the..# va
57a0: 67 61 72 69 65 73 20 6f 66 20 6d 65 74 61 20 64  garies of meta d
57b0: 61 74 61 20 69 74 20 69 73 20 70 6f 73 73 69 62  ata it is possib
57c0: 6c 65 20 66 6f 72 20 74 77 6f 20 72 65 76 69 73  le for two revis
57d0: 69 6f 6e 73 20 6f 66 0a 09 23 20 74 68 65 20 73  ions of..# the s
57e0: 61 6d 65 20 66 69 6c 65 20 74 6f 20 65 6e 64 20  ame file to end 
57f0: 75 70 20 69 6e 20 74 68 65 20 73 61 6d 65 20 63  up in the same c
5800: 68 61 6e 67 65 73 65 74 2c 20 77 69 74 68 6f 75  hangeset, withou
5810: 74 20 61 0a 09 23 20 64 69 72 65 63 74 20 64 65  t a..# direct de
5820: 70 65 6e 64 65 6e 63 79 20 62 65 74 77 65 65 6e  pendency between
5830: 20 74 68 65 6d 2e 20 48 6f 77 65 76 65 72 20 77   them. However w
5840: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 72  e know that ther
5850: 65 0a 09 23 20 68 61 73 20 74 6f 20 62 65 20 61  e..# has to be a
5860: 20 61 6e 20 69 6e 64 69 72 65 63 74 20 64 65 70   an indirect dep
5870: 65 6e 64 65 6e 63 79 2c 20 62 65 20 69 74 20 74  endency, be it t
5880: 68 72 6f 75 67 68 20 70 72 69 6d 61 72 79 0a 09  hrough primary..
5890: 23 20 63 68 69 6c 64 72 65 6e 2c 20 62 72 61 6e  # children, bran
58a0: 63 68 20 63 68 69 6c 64 72 65 6e 2c 20 6f 72 20  ch children, or 
58b0: 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68  a combination th
58c0: 65 72 65 6f 66 2e 0a 0a 09 23 20 57 65 20 6e 6f  ereof....# We no
58d0: 77 20 66 69 6c 6c 20 69 6e 20 74 68 65 73 65 20  w fill in these 
58e0: 70 73 65 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63  pseudo-dependenc
58f0: 69 65 73 2c 20 69 66 20 6e 6f 20 73 75 63 68 0a  ies, if no such.
5900: 09 23 20 64 65 70 65 6e 64 65 6e 63 79 20 65 78  .# dependency ex
5910: 69 73 74 73 20 61 6c 72 65 61 64 79 2e 20 54 68  ists already. Th
5920: 65 20 64 69 72 65 63 74 69 6f 6e 20 6f 66 20 74  e direction of t
5930: 68 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 09 23  he dependency..#
5940: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 69 72 72   is actually irr
5950: 65 6c 65 76 61 6e 74 20 66 6f 72 20 74 68 69 73  elevant for this
5960: 2e 0a 0a 09 23 20 4e 4f 54 45 3a 20 54 68 69 73  ....# NOTE: This
5970: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
5980: 6f 6d 20 63 76 73 32 73 76 6e 2e 20 4f 75 72 20  om cvs2svn. Our 
5990: 73 70 69 72 69 74 75 61 6c 20 61 6e 63 65 73 74  spiritual ancest
59a0: 6f 72 0a 09 23 20 64 6f 65 73 20 6e 6f 74 20 75  or..# does not u
59b0: 73 65 20 73 75 63 68 20 70 73 65 75 64 6f 2d 64  se such pseudo-d
59c0: 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 68 6f 77  ependencies, how
59d0: 65 76 65 72 20 69 74 20 75 73 65 73 20 61 0a 09  ever it uses a..
59e0: 23 20 43 4f 4d 4d 49 54 5f 54 48 52 45 53 48 4f  # COMMIT_THRESHO
59f0: 4c 44 2c 20 61 20 74 69 6d 65 20 69 6e 74 65 72  LD, a time inter
5a00: 76 61 6c 20 63 6f 6d 6d 69 74 73 20 73 68 6f 75  val commits shou
5a10: 6c 64 20 66 61 6c 6c 2e 20 54 68 69 73 0a 09 23  ld fall. This..#
5a20: 20 77 69 6c 6c 20 67 72 65 61 74 6c 79 20 72 65   will greatly re
5a30: 64 75 63 65 73 20 74 68 65 20 72 69 73 6b 20 6f  duces the risk o
5a40: 66 20 67 65 74 74 69 6e 67 20 66 61 72 20 73 65  f getting far se
5a50: 70 61 72 61 74 65 64 0a 09 23 20 72 65 76 69 73  parated..# revis
5a60: 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 65  ions of the same
5a70: 20 66 69 6c 65 20 69 6e 74 6f 20 6f 6e 65 20 63   file into one c
5a80: 68 61 6e 67 65 73 65 74 2e 0a 0a 09 23 20 57 65  hangeset....# We
5a90: 20 61 6c 6c 6f 77 20 72 65 76 69 73 69 6f 6e 73   allow revisions
5aa0: 20 74 6f 20 62 65 20 66 61 72 20 61 70 61 72 74   to be far apart
5ab0: 20 69 6e 20 74 69 6d 65 20 69 6e 20 74 68 65 20   in time in the 
5ac0: 73 61 6d 65 0a 09 23 20 63 68 61 6e 67 65 73 65  same..# changese
5ad0: 74 2c 20 62 75 74 20 6e 65 65 64 20 74 68 65 20  t, but need the 
5ae0: 70 73 65 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63  pseudo-dependenc
5af0: 69 65 73 20 66 6f 72 20 74 68 69 73 2e 0a 0a 09  ies for this....
5b00: 61 72 72 61 79 20 73 65 74 20 66 69 64 73 20 7b  array set fids {
5b10: 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20  }..foreach {rid 
5b20: 66 69 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20  fid} [state run 
5b30: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e  "..    SELECT R.
5b40: 72 69 64 2c 20 52 2e 66 69 64 20 46 52 4f 4d 20  rid, R.fid FROM 
5b50: 72 65 76 69 73 69 6f 6e 20 52 20 57 48 45 52 45  revision R WHERE
5b60: 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65   R.rid IN $these
5b70: 74 0a 09 22 5d 20 7b 20 6c 61 70 70 65 6e 64 20  t.."] { lappend 
5b80: 66 69 64 73 28 24 66 69 64 29 20 24 72 69 64 20  fids($fid) $rid 
5b90: 7d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 66 69 64  }...foreach {fid
5ba0: 20 72 69 64 73 7d 20 5b 61 72 72 61 79 20 67 65   rids} [array ge
5bb0: 74 20 66 69 64 73 5d 20 7b 0a 09 20 20 20 20 69  t fids] {..    i
5bc0: 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 72 69 64  f {[llength $rid
5bd0: 73 5d 20 3c 20 32 7d 20 63 6f 6e 74 69 6e 75 65  s] < 2} continue
5be0: 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 61 20  ..    foreach a 
5bf0: 24 72 69 64 73 20 7b 0a 09 09 66 6f 72 65 61 63  $rids {...foreac
5c00: 68 20 62 20 24 72 69 64 73 20 7b 0a 09 09 20 20  h b $rids {...  
5c10: 20 20 69 66 20 7b 24 61 20 3d 3d 20 24 62 7d 20    if {$a == $b} 
5c20: 63 6f 6e 74 69 6e 75 65 0a 09 09 20 20 20 20 69  continue...    i
5c30: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
5c40: 64 65 70 28 24 61 2c 24 62 29 5d 7d 20 63 6f 6e  dep($a,$b)]} con
5c50: 74 69 6e 75 65 0a 09 09 20 20 20 20 69 66 20 7b  tinue...    if {
5c60: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64 65 70  [info exists dep
5c70: 28 24 62 2c 24 61 29 5d 7d 20 63 6f 6e 74 69 6e  ($b,$a)]} contin
5c80: 75 65 0a 09 09 20 20 20 20 6c 61 70 70 65 6e 64  ue...    lappend
5c90: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 24 61   dependencies($a
5ca0: 29 20 24 62 0a 09 09 20 20 20 20 73 65 74 20 64  ) $b...    set d
5cb0: 65 70 28 24 61 2c 24 62 29 20 2e 0a 09 09 20 20  ep($a,$b) ....  
5cc0: 20 20 73 65 74 20 64 65 70 28 24 62 2c 24 61 29    set dep($b,$a)
5cd0: 20 2e 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d   ....}..    }..}
5ce0: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
5cf0: 20 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20      # var(dv) = 
5d00: 64 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69  dict (item -> li
5d10: 73 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d  st (item)), item
5d20: 20 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69    = list (type i
5d30: 64 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  d).    typemetho
5d40: 64 20 73 75 63 63 65 73 73 6f 72 73 20 7b 64 76  d successors {dv
5d50: 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75   revisions} {..u
5d60: 70 76 61 72 20 31 20 24 64 76 20 64 65 70 65 6e  pvar 1 $dv depen
5d70: 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74 68 65  dencies..set the
5d80: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76  set ('[join $rev
5d90: 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a  isions {','}]').
5da0: 0a 09 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ..# The followin
5db0: 67 20 63 61 73 65 73 20 73 70 65 63 69 66 79 20  g cases specify 
5dc0: 77 68 65 6e 20 61 20 72 65 76 69 73 69 6f 6e 20  when a revision 
5dd0: 53 20 69 73 20 61 20 73 75 63 63 65 73 73 6f 72  S is a successor
5de0: 0a 09 23 20 6f 66 20 61 20 72 65 76 69 73 69 6f  ..# of a revisio
5df0: 6e 20 52 2e 20 45 61 63 68 20 6f 66 20 74 68 65  n R. Each of the
5e00: 20 63 61 73 65 73 20 74 72 61 6e 73 6c 61 74 65   cases translate
5e10: 73 20 69 6e 74 6f 20 6f 6e 65 20 6f 66 0a 09 23  s into one of..#
5e20: 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 6f 66   the branches of
5e30: 20 74 68 65 20 53 51 4c 20 55 4e 49 4f 4e 20 63   the SQL UNION c
5e40: 6f 6d 69 6e 67 20 62 65 6c 6f 77 2e 0a 09 23 0a  oming below...#.
5e50: 09 23 20 28 31 29 20 53 20 63 61 6e 20 62 65 20  .# (1) S can be 
5e60: 61 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 20  a primary child 
5e70: 6f 66 20 52 2c 20 69 2e 65 2e 20 69 6e 20 74 68  of R, i.e. in th
5e80: 65 20 73 61 6d 65 20 4c 4f 44 2e 20 52 0a 09 23  e same LOD. R..#
5e90: 20 20 20 20 20 72 65 66 65 72 65 6e 63 65 73 20       references 
5ea0: 53 20 64 69 72 65 63 74 6c 79 2e 20 52 2e 63 68  S directly. R.ch
5eb0: 69 6c 64 20 3d 20 53 28 2e 72 69 64 29 2c 20 69  ild = S(.rid), i
5ec0: 66 20 69 74 20 65 78 69 73 74 73 2e 0a 09 23 0a  f it exists...#.
5ed0: 09 23 20 28 32 29 20 53 20 63 61 6e 20 62 65 20  .# (2) S can be 
5ee0: 61 20 73 65 63 6f 6e 64 61 72 79 2c 20 69 2e 65  a secondary, i.e
5ef0: 2e 20 62 72 61 6e 63 68 2c 20 63 68 69 6c 64 20  . branch, child 
5f00: 6f 66 20 52 2e 20 48 65 72 65 20 74 68 65 0a 09  of R. Here the..
5f10: 23 20 20 20 20 20 6c 69 6e 6b 20 69 73 20 6d 61  #     link is ma
5f20: 64 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 68  de through the h
5f30: 65 6c 70 65 72 20 74 61 62 6c 65 0a 09 23 20 20  elper table..#  
5f40: 20 20 20 52 45 56 49 53 49 4f 4e 42 52 41 4e 43     REVISIONBRANC
5f50: 48 43 48 49 4c 44 52 45 4e 2e 20 52 2e 72 69 64  HCHILDREN. R.rid
5f60: 20 2d 3e 20 52 42 43 2e 72 69 64 2c 20 52 42 43   -> RBC.rid, RBC
5f70: 2e 62 72 69 64 20 3d 0a 09 23 20 20 20 20 20 53  .brid =..#     S
5f80: 28 2e 72 69 64 29 0a 09 23 0a 09 23 20 28 33 29  (.rid)..#..# (3)
5f90: 20 4f 72 69 67 69 6e 61 6c 6c 79 20 74 68 69 73   Originally this
5fa0: 20 75 73 65 20 63 61 73 65 20 64 65 66 69 6e 65   use case define
5fb0: 64 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 20  d the root of a 
5fc0: 64 65 74 61 63 68 65 64 0a 09 23 20 20 20 20 20  detached..#     
5fd0: 4e 54 44 42 20 61 73 20 74 68 65 20 73 75 63 63  NTDB as the succ
5fe0: 65 73 73 6f 72 20 6f 66 20 74 68 65 20 74 72 75  essor of the tru
5ff0: 6e 6b 20 72 6f 6f 74 2e 20 54 68 69 73 20 6c 65  nk root. This le
6000: 61 64 73 20 74 6f 20 61 0a 09 23 20 20 20 20 20  ads to a..#     
6010: 62 61 64 20 74 61 6e 67 6c 65 20 6c 61 74 65 72  bad tangle later
6020: 20 6f 6e 2e 20 57 69 74 68 20 61 20 64 65 74 61   on. With a deta
6030: 63 68 65 64 20 4e 54 44 42 20 74 68 65 20 6f 72  ched NTDB the or
6040: 69 67 69 6e 61 6c 0a 09 23 20 20 20 20 20 74 72  iginal..#     tr
6050: 75 6e 6b 20 72 6f 6f 74 20 72 65 76 69 73 69 6f  unk root revisio
6060: 6e 20 77 61 73 20 72 65 6d 6f 76 65 64 20 61 73  n was removed as
6070: 20 69 72 72 65 6c 65 76 61 6e 74 2c 20 61 6c 6c   irrelevant, all
6080: 6f 77 69 6e 67 0a 09 23 20 20 20 20 20 74 68 65  owing..#     the
6090: 20 6e 6f 6d 69 6e 61 6c 20 72 6f 6f 74 20 74 6f   nominal root to
60a0: 20 62 65 20 6c 61 74 65 72 20 69 6e 20 74 69 6d   be later in tim
60b0: 65 20 74 68 61 6e 20 74 68 65 20 4e 54 44 42 0a  e than the NTDB.
60c0: 09 23 20 20 20 20 20 72 6f 6f 74 2e 20 4e 6f 77  .#     root. Now
60d0: 20 73 65 74 74 69 6e 67 20 74 68 69 73 20 64 65   setting this de
60e0: 70 65 6e 64 65 6e 63 79 20 77 69 6c 6c 20 62 65  pendency will be
60f0: 20 62 61 63 6b 77 61 72 64 20 69 6e 0a 09 23 20   backward in..# 
6100: 20 20 20 20 74 69 6d 65 2e 20 52 45 4d 4f 56 45      time. REMOVE
6110: 44 2e 0a 09 23 0a 09 23 20 28 34 29 20 49 66 20  D...#..# (4) If 
6120: 52 20 69 73 20 74 68 65 20 6c 61 73 74 20 6f 66  R is the last of
6130: 20 74 68 65 20 4e 54 44 42 20 72 65 76 69 73 69   the NTDB revisi
6140: 6f 6e 73 20 77 68 69 63 68 20 62 65 6c 6f 6e 67  ons which belong
6150: 20 74 6f 0a 09 23 20 20 20 20 20 74 68 65 20 74   to..#     the t
6160: 72 75 6e 6b 2c 20 74 68 65 6e 20 74 68 65 20 70  runk, then the p
6170: 72 69 6d 61 72 79 20 63 68 69 6c 64 20 6f 66 20  rimary child of 
6180: 74 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74 20 28  the trunk root (
6190: 74 68 65 0a 09 23 20 20 20 20 20 27 31 2e 32 27  the..#     '1.2'
61a0: 20 72 65 76 69 73 69 6f 6e 29 20 69 73 20 61 20   revision) is a 
61b0: 73 75 63 63 65 73 73 6f 72 2c 20 69 66 20 69 74  successor, if it
61c0: 20 65 78 69 73 74 73 2e 0a 0a 09 23 20 4e 6f 74   exists....# Not
61d0: 65 20 74 68 61 74 20 74 68 65 20 62 72 61 6e 63  e that the branc
61e0: 68 65 73 20 73 70 61 77 6e 65 64 20 66 72 6f 6d  hes spawned from
61f0: 20 74 68 65 20 72 65 76 69 73 69 6f 6e 73 2c 20   the revisions, 
6200: 61 6e 64 20 74 68 65 0a 09 23 20 74 61 67 73 20  and the..# tags 
6210: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
6220: 74 68 65 6d 20 61 72 65 20 73 75 63 63 65 73 73  them are success
6230: 6f 72 73 20 61 73 20 77 65 6c 6c 2e 0a 0a 09 66  ors as well....f
6240: 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c  oreach {rid chil
6250: 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a  d} [state run ".
6260: 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d 61 72     -- (1) Primar
6270: 79 20 63 68 69 6c 64 0a 09 20 20 20 20 53 45 4c  y child..    SEL
6280: 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63 68 69  ECT R.rid, R.chi
6290: 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72  ld..    FROM   r
62a0: 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57  evision R..    W
62b0: 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e  HERE  R.rid   IN
62c0: 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20   $theset     -- 
62d0: 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69  Restrict to revi
62e0: 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73  sions of interes
62f0: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e  t..    AND    R.
6300: 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c  child IS NOT NUL
6310: 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d  L    -- Has prim
6320: 61 72 79 20 63 68 69 6c 64 0a 20 20 20 20 55 4e  ary child.    UN
6330: 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32 29 20 53  ION.    -- (2) S
6340: 65 63 6f 6e 64 61 72 79 20 28 62 72 61 6e 63 68  econdary (branch
6350: 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20  ) children..    
6360: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 42 2e  SELECT R.rid, B.
6370: 62 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  brid..    FROM  
6380: 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76   revision R, rev
6390: 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64  isionbranchchild
63a0: 72 65 6e 20 42 0a 09 20 20 20 20 57 48 45 52 45  ren B..    WHERE
63b0: 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68    R.rid   IN $th
63c0: 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74  eset     -- Rest
63d0: 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e  rict to revision
63e0: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20  s of interest.. 
63f0: 20 20 20 41 4e 44 20 20 20 20 52 2e 72 69 64 20     AND    R.rid 
6400: 3d 20 42 2e 72 69 64 20 20 20 20 20 20 20 20 20  = B.rid         
6410: 20 2d 2d 20 53 65 6c 65 63 74 20 73 75 62 73 65   -- Select subse
6420: 74 20 6f 66 20 62 72 61 6e 63 68 20 63 68 69 6c  t of branch chil
6430: 64 72 65 6e 0a 20 20 20 20 55 4e 49 4f 4e 0a 20  dren.    UNION. 
6440: 20 20 20 2d 2d 20 28 34 29 20 43 68 69 6c 64 20     -- (4) Child 
6450: 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 20 73 75  of trunk root su
6460: 63 63 65 73 73 6f 72 20 6f 66 20 6c 61 73 74 20  ccessor of last 
6470: 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b 2e 0a 09  NTDB on trunk...
6480: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64      SELECT R.rid
6490: 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20 20 20 20  , RA.child..    
64a0: 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c  FROM revision R,
64b0: 20 72 65 76 69 73 69 6f 6e 20 52 41 0a 09 20 20   revision RA..  
64c0: 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 20 20    WHERE R.rid   
64d0: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 20  IN $theset      
64e0: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72  -- Restrict to r
64f0: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65  evisions of inte
6500: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
6510: 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20 20  R.isdefault     
6520: 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72          -- Restr
6530: 69 63 74 20 74 6f 20 4e 54 44 42 0a 09 20 20 20  ict to NTDB..   
6540: 20 41 4e 44 20 20 20 52 2e 64 62 63 68 69 6c 64   AND   R.dbchild
6550: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d   IS NOT NULL   -
6560: 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 42 20  - and last NTDB 
6570: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72 75  belonging to tru
6580: 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 52 41  nk..    AND   RA
6590: 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69 6c 64  .rid = R.dbchild
65a0: 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 72 65        -- Go dire
65b0: 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 72 6f  ctly to trunk ro
65c0: 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 52 41  ot..    AND   RA
65d0: 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55  .child IS NOT NU
65e0: 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69  LL    -- Has pri
65f0: 6d 61 72 79 20 63 68 69 6c 64 2e 0a 09 22 5d 20  mary child..."] 
6600: 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 69 64 65  {..    # Conside
6610: 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 20 74 6f  r moving this to
6620: 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6d   the integrity m
6630: 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 6e 74 65  odule...    inte
6640: 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24 72  grity assert {$r
6650: 69 64 20 21 3d 20 24 63 68 69 6c 64 7d 20 7b 52  id != $child} {R
6660: 65 76 69 73 69 6f 6e 20 24 72 69 64 20 64 65 70  evision $rid dep
6670: 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 2e 7d  ends on itself.}
6680: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65  ..    lappend de
6690: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74  pendencies([list
66a0: 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c 69 73   rev $rid]) [lis
66b0: 74 20 72 65 76 20 24 63 68 69 6c 64 5d 0a 09 7d  t rev $child]..}
66c0: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63  ..foreach {rid c
66d0: 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e  hild} [state run
66e0: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52   "..    SELECT R
66f0: 2e 72 69 64 2c 20 54 2e 74 69 64 0a 09 20 20 20  .rid, T.tid..   
6700: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
6710: 20 52 2c 20 74 61 67 20 54 0a 09 20 20 20 20 57   R, tag T..    W
6720: 48 45 52 45 20 20 52 2e 72 69 64 20 69 6e 20 24  HERE  R.rid in $
6730: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20  theset..    AND 
6740: 20 20 20 54 2e 72 65 76 20 3d 20 52 2e 72 69 64     T.rev = R.rid
6750: 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70  .."] {..    lapp
6760: 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73  end dependencies
6770: 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64 5d  ([list rev $rid]
6780: 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67  ) [list sym::tag
6790: 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72   $child]..}..for
67a0: 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 7d  each {rid child}
67b0: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20   [state run ".. 
67c0: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c     SELECT R.rid,
67d0: 20 42 2e 62 69 64 0a 09 20 20 20 20 46 52 4f 4d   B.bid..    FROM
67e0: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 62     revision R, b
67f0: 72 61 6e 63 68 20 42 0a 09 20 20 20 20 57 48 45  ranch B..    WHE
6800: 52 45 20 20 52 2e 72 69 64 20 69 6e 20 24 74 68  RE  R.rid in $th
6810: 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20  eset..    AND   
6820: 20 42 2e 72 6f 6f 74 20 3d 20 52 2e 72 69 64 0a   B.root = R.rid.
6830: 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65  ."] {..    lappe
6840: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28  nd dependencies(
6850: 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64 5d 29  [list rev $rid])
6860: 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e   [list sym::bran
6870: 63 68 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 72  ch $child]..}..r
6880: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
6890: 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 63   # var(dv) = dic
68a0: 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20  t (item -> list 
68b0: 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d  (item)), item  =
68c0: 20 6c 69 73 74 20 28 74 79 70 65 20 69 64 29 0a   list (type id).
68d0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 70      typemethod p
68e0: 72 65 64 65 63 65 73 73 6f 72 73 20 7b 64 76 20  redecessors {dv 
68f0: 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70  revisions} {..up
6900: 76 61 72 20 31 20 24 64 76 20 64 65 70 65 6e 64  var 1 $dv depend
6910: 65 6e 63 69 65 73 0a 09 73 65 74 20 74 68 65 73  encies..set thes
6920: 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69  et ('[join $revi
6930: 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a  sions {','}]')..
6940: 09 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
6950: 20 63 61 73 65 73 20 73 70 65 63 69 66 79 20 77   cases specify w
6960: 68 65 6e 20 61 20 72 65 76 69 73 69 6f 6e 20 50  hen a revision P
6970: 20 69 73 20 61 0a 09 23 20 70 72 65 64 65 63 65   is a..# predece
6980: 73 73 6f 72 20 6f 66 20 61 20 72 65 76 69 73 69  ssor of a revisi
6990: 6f 6e 20 52 2e 20 45 61 63 68 20 6f 66 20 74 68  on R. Each of th
69a0: 65 20 63 61 73 65 73 20 74 72 61 6e 73 6c 61 74  e cases translat
69b0: 65 73 0a 09 23 20 69 6e 74 6f 20 6f 6e 65 20 6f  es..# into one o
69c0: 66 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 6f  f the branches o
69d0: 66 20 74 68 65 20 53 51 4c 20 55 4e 49 4f 4e 20  f the SQL UNION 
69e0: 63 6f 6d 69 6e 67 20 62 65 6c 6f 77 2e 0a 09 23  coming below...#
69f0: 0a 09 23 20 28 31 29 20 54 68 65 20 69 6d 6d 65  ..# (1) The imme
6a00: 64 69 61 74 65 20 70 61 72 65 6e 74 20 52 2e 70  diate parent R.p
6a10: 61 72 65 6e 74 20 6f 66 20 52 20 69 73 20 61 20  arent of R is a 
6a20: 70 72 65 64 65 63 65 73 73 6f 72 20 6f 66 0a 09  predecessor of..
6a30: 23 20 20 20 20 20 52 2e 20 4e 4f 54 45 3a 20 54  #     R. NOTE: T
6a40: 68 69 73 20 69 73 20 74 72 75 65 20 66 6f 72 20  his is true for 
6a50: 52 20 65 69 74 68 65 72 20 70 72 69 6d 61 72 79  R either primary
6a60: 20 6f 72 20 73 65 63 6f 6e 64 61 72 79 0a 09 23   or secondary..#
6a70: 20 20 20 20 20 63 68 69 6c 64 20 6f 66 20 50 2e       child of P.
6a80: 20 49 74 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   It not necessar
6a90: 79 20 74 6f 20 64 69 73 74 69 6e 67 75 69 73 68  y to distinguish
6aa0: 20 74 68 65 20 74 77 6f 0a 09 23 20 20 20 20 20   the two..#     
6ab0: 63 61 73 65 73 2c 20 69 6e 20 63 6f 6e 74 72 61  cases, in contra
6ac0: 73 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 72  st to the code r
6ad0: 65 74 72 69 65 76 69 6e 67 20 74 68 65 20 73 75  etrieving the su
6ae0: 63 63 65 73 73 6f 72 0a 09 23 20 20 20 20 20 69  ccessor..#     i
6af0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 09 23 0a 09  nformation...#..
6b00: 23 20 28 32 29 20 54 68 65 20 63 6f 6d 70 6c 65  # (2) The comple
6b10: 6d 65 6e 74 20 6f 66 20 73 75 63 63 65 73 73 6f  ment of successo
6b20: 72 20 63 61 73 65 20 28 33 29 2e 20 54 68 65 20  r case (3). The 
6b30: 74 72 75 6e 6b 20 72 6f 6f 74 20 69 73 0a 09 23  trunk root is..#
6b40: 20 20 20 20 20 61 20 70 72 65 64 65 63 65 73 73       a predecess
6b50: 6f 72 20 6f 66 20 61 20 4e 54 44 42 20 72 6f 6f  or of a NTDB roo
6b60: 74 2e 20 52 45 4d 4f 56 45 44 2e 20 53 65 65 20  t. REMOVED. See 
6b70: 27 73 75 63 63 65 73 73 6f 72 73 27 0a 09 23 20  'successors'..# 
6b80: 20 20 20 20 66 6f 72 20 74 68 65 20 65 78 70 6c      for the expl
6b90: 61 6e 61 74 69 6f 6e 2e 0a 09 23 0a 09 23 20 28  anation...#..# (
6ba0: 33 29 20 54 68 65 20 63 6f 6d 70 6c 65 6d 65 6e  3) The complemen
6bb0: 74 20 6f 66 20 73 75 63 63 65 73 73 6f 72 20 63  t of successor c
6bc0: 61 73 65 20 28 34 29 2e 20 54 68 65 20 6c 61 73  ase (4). The las
6bd0: 74 20 4e 54 44 42 0a 09 23 20 20 20 20 20 72 65  t NTDB..#     re
6be0: 76 69 73 69 6f 6e 20 62 65 6c 6f 6e 67 69 6e 67  vision belonging
6bf0: 20 74 6f 20 74 68 65 20 74 72 75 6e 6b 20 69 73   to the trunk is
6c00: 20 61 20 70 72 65 64 65 63 65 73 73 6f 72 20 6f   a predecessor o
6c10: 66 20 74 68 65 0a 09 23 20 20 20 20 20 70 72 69  f the..#     pri
6c20: 6d 61 72 79 20 63 68 69 6c 64 20 6f 66 20 74 68  mary child of th
6c30: 65 20 74 72 75 6e 6b 20 72 6f 6f 74 20 28 54 68  e trunk root (Th
6c40: 65 20 27 31 2e 32 27 20 72 65 76 69 73 69 6f 6e  e '1.2' revision
6c50: 29 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69  )....foreach {ri
6c60: 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65  d parent} [state
6c70: 20 72 75 6e 20 22 0a 20 20 20 2d 2d 20 28 31 29   run ".   -- (1)
6c80: 20 50 72 69 6d 61 72 79 20 70 61 72 65 6e 74 2c   Primary parent,
6c90: 20 63 61 6e 20 62 65 20 69 6e 20 64 69 66 66 65   can be in diffe
6ca0: 72 65 6e 74 20 4c 4f 44 20 66 6f 72 20 66 69 72  rent LOD for fir
6cb0: 73 74 20 69 6e 20 61 20 62 72 61 6e 63 68 0a 09  st in a branch..
6cc0: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64      SELECT R.rid
6cd0: 2c 20 52 2e 70 61 72 65 6e 74 0a 09 20 20 20 20  , R.parent..    
6ce0: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20  FROM   revision 
6cf0: 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e  R..    WHERE  R.
6d00: 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74  rid   IN $theset
6d10: 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74       -- Restrict
6d20: 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66   to revisions of
6d30: 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41   interest..    A
6d40: 4e 44 20 20 20 20 52 2e 70 61 72 65 6e 74 20 49  ND    R.parent I
6d50: 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d 20  S NOT NULL   -- 
6d60: 48 61 73 20 70 72 69 6d 61 72 79 20 70 61 72 65  Has primary pare
6d70: 6e 74 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20  nt.    UNION.   
6d80: 20 2d 2d 20 28 33 29 20 4c 61 73 74 20 4e 54 44   -- (3) Last NTD
6d90: 42 20 6f 6e 20 74 72 75 6e 6b 20 69 73 20 70 72  B on trunk is pr
6da0: 65 64 65 63 65 73 73 6f 72 20 6f 66 20 63 68 69  edecessor of chi
6db0: 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74  ld of trunk root
6dc0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
6dd0: 69 64 2c 20 52 41 2e 64 62 70 61 72 65 6e 74 0a  id, RA.dbparent.
6de0: 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69  .    FROM   revi
6df0: 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e  sion R, revision
6e00: 20 52 41 0a 09 20 20 20 20 57 48 45 52 45 20 20   RA..    WHERE  
6e10: 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 74  R.rid IN $theset
6e20: 20 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74           -- Rest
6e30: 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e  rict to revision
6e40: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20  s of interest.. 
6e50: 20 20 20 41 4e 44 20 20 20 20 4e 4f 54 20 52 2e     AND    NOT R.
6e60: 69 73 64 65 66 61 75 6c 74 20 20 20 20 20 20 20  isdefault       
6e70: 20 20 20 2d 2d 20 6e 6f 74 20 6f 6e 20 4e 54 44     -- not on NTD
6e80: 42 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e  B..    AND    R.
6e90: 70 61 72 65 6e 74 20 49 53 20 4e 4f 54 20 4e 55  parent IS NOT NU
6ea0: 4c 4c 20 20 20 20 20 2d 2d 20 77 68 69 63 68 20  LL     -- which 
6eb0: 61 72 65 20 6e 6f 74 20 72 6f 6f 74 0a 09 20 20  are not root..  
6ec0: 20 20 41 4e 44 20 20 20 20 52 41 2e 72 69 64 20    AND    RA.rid 
6ed0: 3d 20 52 2e 70 61 72 65 6e 74 20 20 20 20 20 20  = R.parent      
6ee0: 20 20 2d 2d 20 67 6f 20 74 6f 20 74 68 65 69 72    -- go to their
6ef0: 20 70 61 72 65 6e 74 0a 09 20 20 20 20 41 4e 44   parent..    AND
6f00: 20 20 20 20 52 41 2e 64 62 70 61 72 65 6e 74 20      RA.dbparent 
6f10: 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 2d 2d 20  IS NOT NULL  -- 
6f20: 77 68 69 63 68 20 68 61 73 20 74 6f 20 72 65 66  which has to ref
6f30: 65 72 20 74 6f 20 4e 54 44 42 27 73 20 72 6f 6f  er to NTDB's roo
6f40: 74 0a 09 22 5d 20 7b 0a 09 20 20 20 20 23 20 43  t.."] {..    # C
6f50: 6f 6e 73 69 64 65 72 20 6d 6f 76 69 6e 67 20 74  onsider moving t
6f60: 68 69 73 20 74 6f 20 74 68 65 20 69 6e 74 65 67  his to the integ
6f70: 72 69 74 79 20 6d 6f 64 75 6c 65 2e 0a 09 20 20  rity module...  
6f80: 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 65    integrity asse
6f90: 72 74 20 7b 24 72 69 64 20 21 3d 20 24 70 61 72  rt {$rid != $par
6fa0: 65 6e 74 7d 20 7b 52 65 76 69 73 69 6f 6e 20 24  ent} {Revision $
6fb0: 72 69 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 69  rid depends on i
6fc0: 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20 6c 61 70  tself.}..    lap
6fd0: 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65  pend dependencie
6fe0: 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64  s([list rev $rid
6ff0: 5d 29 20 5b 6c 69 73 74 20 72 65 76 20 24 70 61  ]) [list rev $pa
7000: 72 65 6e 74 5d 0a 09 7d 0a 0a 09 23 20 54 68 65  rent]..}...# The
7010: 20 72 65 76 69 73 69 6f 6e 73 20 77 68 69 63 68   revisions which
7020: 20 61 72 65 20 74 68 65 20 66 69 72 73 74 20 6f   are the first o
7030: 6e 20 61 20 62 72 61 6e 63 68 20 68 61 76 65 20  n a branch have 
7040: 74 68 61 74 0a 09 23 20 62 72 61 6e 63 68 20 61  that..# branch a
7050: 73 20 74 68 65 69 72 20 70 72 65 64 65 63 65 73  s their predeces
7060: 73 6f 72 2e 20 4e 6f 74 65 20 74 68 61 74 20 72  sor. Note that r
7070: 65 76 69 73 69 6f 6e 73 20 63 61 6e 6e 6f 74 20  evisions cannot 
7080: 62 65 0a 09 23 20 6f 6e 20 74 61 67 73 20 69 6e  be..# on tags in
7090: 20 74 68 65 20 73 61 6d 65 20 6d 61 6e 6e 65 72   the same manner
70a0: 2c 20 73 6f 20 74 61 67 73 20 63 61 6e 6e 6f 74  , so tags cannot
70b0: 20 62 65 20 70 72 65 64 65 63 65 73 73 6f 72 73   be predecessors
70c0: 0a 09 23 20 6f 66 20 72 65 76 69 73 69 6f 6e 73  ..# of revisions
70d0: 2e 20 54 68 69 73 20 63 6f 6d 70 6c 65 6d 65 6e  . This complemen
70e0: 74 73 20 74 68 61 74 20 74 68 65 79 20 68 61 76  ts that they hav
70f0: 65 20 6e 6f 20 73 75 63 63 65 73 73 6f 72 73 0a  e no successors.
7100: 09 23 20 28 53 65 65 20 73 79 6d 3a 3a 74 61 67  .# (See sym::tag
7110: 2f 73 75 63 63 65 73 73 6f 72 73 29 2e 0a 0a 09  /successors)....
7120: 66 6f 72 65 61 63 68 20 7b 72 69 64 20 70 61 72  foreach {rid par
7130: 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20  ent} [state run 
7140: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e  "..    SELECT R.
7150: 72 69 64 20 42 2e 62 69 64 0a 09 20 20 20 20 46  rid B.bid..    F
7160: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52  ROM   revision R
7170: 2c 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20 20  , branch B..    
7180: 57 48 45 52 45 20 20 52 2e 72 69 64 20 49 4e 20  WHERE  R.rid IN 
7190: 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44  $theset..    AND
71a0: 20 20 20 20 42 2e 66 69 72 73 74 20 3d 20 52 2e      B.first = R.
71b0: 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c  rid.."] {..    l
71c0: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63  append dependenc
71d0: 69 65 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72  ies([list rev $r
71e0: 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a  id]) [list sym::
71f0: 62 72 61 6e 63 68 20 24 70 61 72 65 6e 74 5d 0a  branch $parent].
7200: 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d  .}..return.    }
7210: 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23  .}..# # ## ### #
7220: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23  #### ######## ##
7230: 23 23 23 23 23 23 23 23 23 23 23 20 23 23 23 23  ########### ####
7240: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7250: 23 0a 23 23 20 48 65 6c 70 65 72 20 73 69 6e 67  #.## Helper sing
7260: 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20  leton. Commands 
7270: 66 6f 72 20 74 61 67 20 73 79 6d 62 6f 6c 20 63  for tag symbol c
7280: 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e 69 74  hangesets...snit
7290: 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f 73  ::type ::vc::fos
72a0: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73  sil::import::cvs
72b0: 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a  ::project::rev::
72c0: 73 79 6d 3a 3a 74 61 67 20 7b 0a 20 20 20 20 74  sym::tag {.    t
72d0: 79 70 65 6d 65 74 68 6f 64 20 62 79 72 65 76 69  ypemethod byrevi
72e0: 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75 72 6e  sion {} { return
72f0: 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74   0 }.    typemet
7300: 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 20 7b  hod bysymbol   {
7310: 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a 20  } { return 1 }. 
7320: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73     typemethod is
7330: 74 61 67 20 20 20 20 20 20 7b 7d 20 7b 20 72 65  tag      {} { re
7340: 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 79 70  turn 1 }.    typ
7350: 65 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63 68  emethod isbranch
7360: 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30     {} { return 0
7370: 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74   }..    # result
7380: 20 3d 20 6c 69 73 74 20 28 6d 69 6e 74 69 6d 65   = list (mintime
7390: 2c 20 6d 61 78 74 69 6d 65 29 0a 20 20 20 20 74  , maxtime).    t
73a0: 79 70 65 6d 65 74 68 6f 64 20 74 69 6d 65 72 61  ypemethod timera
73b0: 6e 67 65 20 7b 74 61 67 73 7d 20 7b 0a 09 23 20  nge {tags} {..# 
73c0: 54 68 65 20 72 61 6e 67 65 20 69 73 20 64 65 66  The range is def
73d0: 69 6e 65 64 20 61 73 20 74 68 65 20 72 61 6e 67  ined as the rang
73e0: 65 20 6f 66 20 74 68 65 20 72 65 76 69 73 69 6f  e of the revisio
73f0: 6e 73 20 74 68 65 20 74 61 67 73 0a 09 23 20 61  ns the tags..# a
7400: 72 65 20 61 74 74 61 63 68 65 64 20 74 6f 2e 0a  re attached to..
7410: 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b  ..set theset ('[
7420: 6a 6f 69 6e 20 24 74 61 67 73 20 7b 27 2c 27 7d  join $tags {','}
7430: 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61  ]')..return [sta
7440: 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45  te run "..    SE
7450: 4c 45 43 54 20 4d 49 4e 28 52 2e 64 61 74 65 29  LECT MIN(R.date)
7460: 2c 20 4d 41 58 28 52 2e 64 61 74 65 29 0a 09 20  , MAX(R.date).. 
7470: 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e     FROM revision
7480: 20 52 2c 20 74 61 67 20 54 0a 09 20 20 20 20 57   R, tag T..    W
7490: 48 45 52 45 20 54 2e 74 69 64 20 49 4e 20 24 74  HERE T.tid IN $t
74a0: 68 65 73 65 74 0a 20 20 20 20 20 20 20 20 20 20  heset.          
74b0: 20 20 41 4e 44 20 20 20 52 2e 72 69 64 20 3d 20    AND   R.rid = 
74c0: 54 2e 72 65 76 0a 09 22 5d 0a 20 20 20 20 7d 0a  T.rev.."].    }.
74d0: 0a 20 20 20 20 23 20 76 61 72 28 64 76 29 20 3d  .    # var(dv) =
74e0: 20 64 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c   dict (item -> l
74f0: 69 73 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65  ist (item)), ite
7500: 6d 20 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20  m  = list (type 
7510: 69 64 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68  id).    typemeth
7520: 6f 64 20 73 75 63 63 65 73 73 6f 72 73 20 7b 64  od successors {d
7530: 76 20 74 61 67 73 7d 20 7b 0a 09 23 20 54 61 67  v tags} {..# Tag
7540: 73 20 68 61 76 65 20 6e 6f 20 73 75 63 63 65 73  s have no succes
7550: 73 6f 72 73 2e 0a 09 72 65 74 75 72 6e 0a 20 20  sors...return.  
7560: 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64    }..    # var(d
7570: 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20  v) = dict (item 
7580: 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c  -> list (item)),
7590: 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74   item  = list (t
75a0: 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 70 65  ype id).    type
75b0: 6d 65 74 68 6f 64 20 70 72 65 64 65 63 65 73 73  method predecess
75c0: 6f 72 73 20 7b 64 76 20 74 61 67 73 7d 20 7b 0a  ors {dv tags} {.
75d0: 09 23 20 54 68 65 20 70 72 65 64 65 63 65 73 73  .# The predecess
75e0: 6f 72 73 20 6f 66 20 61 20 74 61 67 20 61 72 65  ors of a tag are
75f0: 20 61 6c 6c 20 74 68 65 20 72 65 76 69 73 69 6f   all the revisio
7600: 6e 73 20 74 68 65 20 74 61 67 73 20 61 72 65 0a  ns the tags are.
7610: 09 23 20 61 74 74 61 63 68 65 64 20 74 6f 2c 20  .# attached to, 
7620: 61 73 20 77 65 6c 6c 20 61 73 20 61 6c 6c 20 74  as well as all t
7630: 68 65 20 62 72 61 6e 63 68 65 73 20 6f 72 20 74  he branches or t
7640: 61 67 73 20 77 68 69 63 68 20 61 72 65 0a 09 23  ags which are..#
7650: 20 74 68 65 69 72 20 70 72 65 66 65 72 65 64 20   their prefered 
7660: 70 61 72 65 6e 74 73 2e 0a 0a 09 73 65 74 20 74  parents....set t
7670: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 74  heset ('[join $t
7680: 61 67 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66 6f  ags {','}]')..fo
7690: 72 65 61 63 68 20 7b 74 69 64 20 70 61 72 65 6e  reach {tid paren
76a0: 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a  t} [state run ".
76b0: 09 20 20 20 20 53 45 4c 45 43 54 20 54 2e 74 69  .    SELECT T.ti
76c0: 64 2c 20 52 2e 72 69 64 0a 09 20 20 20 20 46 52  d, R.rid..    FR
76d0: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c  OM   revision R,
76e0: 20 74 61 67 20 54 0a 09 20 20 20 20 57 48 45 52   tag T..    WHER
76f0: 45 20 20 54 2e 74 69 64 20 49 4e 20 24 74 68 65  E  T.tid IN $the
7700: 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  set..    AND    
7710: 54 2e 72 65 76 20 3d 20 52 2e 72 69 64 0a 09 22  T.rev = R.rid.."
7720: 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64  ] {..    lappend
7730: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c   dependencies([l
7740: 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 74 69  ist sym::tag $ti
7750: 64 5d 29 20 5b 6c 69 73 74 20 72 65 76 20 24 70  d]) [list rev $p
7760: 61 72 65 6e 74 5d 0a 09 7d 0a 0a 09 66 6f 72 65  arent]..}...fore
7770: 61 63 68 20 7b 74 69 64 20 70 61 72 65 6e 74 7d  ach {tid parent}
7780: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20   [state run ".. 
7790: 20 20 20 53 45 4c 45 43 54 20 54 2e 74 69 64 2c     SELECT T.tid,
77a0: 20 42 2e 62 69 64 0a 09 20 20 20 20 46 52 4f 4d   B.bid..    FROM
77b0: 20 20 20 74 61 67 20 54 2c 20 62 72 61 6e 63 68     tag T, branch
77c0: 20 42 2c 20 70 72 65 66 65 72 65 64 70 61 72 65   B, preferedpare
77d0: 6e 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 20  nt P..    WHERE 
77e0: 20 54 2e 74 69 64 20 49 4e 20 24 74 68 65 73 65   T.tid IN $these
77f0: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 54 2e  t..    AND    T.
7800: 73 69 64 20 3d 20 50 2e 73 69 64 0a 09 20 20 20  sid = P.sid..   
7810: 20 41 4e 44 20 20 20 20 50 2e 70 69 64 20 3d 20   AND    P.pid = 
7820: 42 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20  B.sid.."] {..   
7830: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65   lappend depende
7840: 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a  ncies([list sym:
7850: 3a 74 61 67 20 24 74 69 64 5d 29 20 5b 6c 69 73  :tag $tid]) [lis
7860: 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 70  t sym::branch $p
7870: 61 72 65 6e 74 5d 0a 09 7d 0a 0a 09 66 6f 72 65  arent]..}...fore
7880: 61 63 68 20 7b 74 69 64 20 70 61 72 65 6e 74 7d  ach {tid parent}
7890: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20   [state run ".. 
78a0: 20 20 20 53 45 4c 45 43 54 20 54 2e 74 69 64 2c     SELECT T.tid,
78b0: 20 54 58 2e 74 69 64 0a 09 20 20 20 20 46 52 4f   TX.tid..    FRO
78c0: 4d 20 20 20 74 61 67 20 54 2c 20 74 61 67 20 54  M   tag T, tag T
78d0: 58 2c 20 70 72 65 66 65 72 65 64 70 61 72 65 6e  X, preferedparen
78e0: 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 20 20  t P..    WHERE  
78f0: 54 2e 74 69 64 20 49 4e 20 24 74 68 65 73 65 74  T.tid IN $theset
7900: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 54 2e 73  ..    AND    T.s
7910: 69 64 20 3d 20 50 2e 73 69 64 0a 09 20 20 20 20  id = P.sid..    
7920: 41 4e 44 20 20 20 20 50 2e 70 69 64 20 3d 20 54  AND    P.pid = T
7930: 58 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20  X.sid.."] {..   
7940: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65   lappend depende
7950: 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a  ncies([list sym:
7960: 3a 74 61 67 20 24 74 69 64 5d 29 20 5b 6c 69 73  :tag $tid]) [lis
7970: 74 20 73 79 6d 3a 3a 74 61 67 20 24 70 61 72 65  t sym::tag $pare
7980: 6e 74 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20  nt]..}..return. 
7990: 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23     }.}..# # ## #
79a0: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
79b0: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20  # ############# 
79c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
79d0: 23 23 23 23 23 0a 23 23 20 48 65 6c 70 65 72 20  #####.## Helper 
79e0: 73 69 6e 67 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61  singleton. Comma
79f0: 6e 64 73 20 66 6f 72 20 62 72 61 6e 63 68 20 73  nds for branch s
7a00: 79 6d 62 6f 6c 20 63 68 61 6e 67 65 73 65 74 73  ymbol changesets
7a10: 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20 3a 3a  ...snit::type ::
7a20: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f  vc::fossil::impo
7a30: 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74  rt::cvs::project
7a40: 3a 3a 72 65 76 3a 3a 73 79 6d 3a 3a 62 72 61 6e  ::rev::sym::bran
7a50: 63 68 20 7b 0a 20 20 20 20 74 79 70 65 6d 65 74  ch {.    typemet
7a60: 68 6f 64 20 62 79 72 65 76 69 73 69 6f 6e 20 7b  hod byrevision {
7a70: 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20  } { return 0 }. 
7a80: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79     typemethod by
7a90: 73 79 6d 62 6f 6c 20 20 20 7b 7d 20 7b 20 72 65  symbol   {} { re
7aa0: 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 79 70  turn 1 }.    typ
7ab0: 65 6d 65 74 68 6f 64 20 69 73 74 61 67 20 20 20  emethod istag   
7ac0: 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30     {} { return 0
7ad0: 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f   }.    typemetho
7ae0: 64 20 69 73 62 72 61 6e 63 68 20 20 20 7b 7d 20  d isbranch   {} 
7af0: 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a 0a 20 20  { return 1 }..  
7b00: 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73    # result = lis
7b10: 74 20 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74  t (mintime, maxt
7b20: 69 6d 65 29 0a 20 20 20 20 74 79 70 65 6d 65 74  ime).    typemet
7b30: 68 6f 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 62  hod timerange {b
7b40: 72 61 6e 63 68 65 73 7d 20 7b 0a 09 23 20 54 68  ranches} {..# Th
7b50: 65 20 72 61 6e 67 65 20 6f 66 20 61 20 62 72 61  e range of a bra
7b60: 6e 63 68 20 69 73 20 64 65 66 69 6e 65 64 20 61  nch is defined a
7b70: 73 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 74  s the range of t
7b80: 68 65 0a 09 23 20 72 65 76 69 73 69 6f 6e 73 20  he..# revisions 
7b90: 74 68 65 20 62 72 61 6e 63 68 65 73 20 61 72 65  the branches are
7ba0: 20 73 70 61 77 6e 65 64 20 62 79 2e 20 4e 4f 54   spawned by. NOT
7bb0: 45 20 68 6f 77 65 76 65 72 20 74 68 61 74 20 74  E however that t
7bc0: 68 65 0a 09 23 20 62 72 61 6e 63 68 65 73 20 61  he..# branches a
7bd0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 61  ssociated with a
7be0: 20 64 65 74 61 63 68 65 64 20 4e 54 44 42 20 77   detached NTDB w
7bf0: 69 6c 6c 20 68 61 76 65 20 6e 6f 20 72 6f 6f 74  ill have no root
7c00: 0a 09 23 20 73 70 61 77 6e 69 6e 67 20 74 68 65  ..# spawning the
7c10: 6d 2c 20 68 65 6e 63 65 20 74 68 65 79 20 68 61  m, hence they ha
7c20: 76 65 20 6e 6f 20 72 65 61 6c 20 74 69 6d 65 72  ve no real timer
7c30: 61 6e 67 65 20 61 6e 79 0a 09 23 20 6c 6f 6e 67  ange any..# long
7c40: 65 72 2e 20 42 79 20 75 73 69 6e 67 20 30 20 77  er. By using 0 w
7c50: 65 20 70 75 74 20 74 68 65 6d 20 69 6e 20 66 72  e put them in fr
7c60: 6f 6e 74 20 6f 66 20 65 76 65 72 79 74 68 69 6e  ont of everythin
7c70: 67 20 65 6c 73 65 2c 0a 09 23 20 61 73 20 74 68  g else,..# as th
7c80: 65 79 20 6c 6f 67 69 63 61 6c 6c 79 20 61 72 65  ey logically are
7c90: 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20 28  ....set theset (
7ca0: 27 5b 6a 6f 69 6e 20 24 62 72 61 6e 63 68 65 73  '[join $branches
7cb0: 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72   {','}]')..retur
7cc0: 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09  n [state run "..
7cd0: 20 20 20 20 53 45 4c 45 43 54 20 49 46 4e 55 4c      SELECT IFNUL
7ce0: 4c 28 4d 49 4e 28 52 2e 64 61 74 65 29 2c 30 29  L(MIN(R.date),0)
7cf0: 2c 20 49 46 4e 55 4c 4c 28 4d 41 58 28 52 2e 64  , IFNULL(MAX(R.d
7d00: 61 74 65 29 2c 30 29 0a 09 20 20 20 20 46 52 4f  ate),0)..    FRO
7d10: 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 62 72  M revision R, br
7d20: 61 6e 63 68 20 42 0a 09 20 20 20 20 57 48 45 52  anch B..    WHER
7d30: 45 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73  E B.bid IN $thes
7d40: 65 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 41  et.            A
7d50: 4e 44 20 20 20 52 2e 72 69 64 20 3d 20 42 2e 72  ND   R.rid = B.r
7d60: 6f 6f 74 0a 09 22 5d 0a 20 20 20 20 7d 0a 0a 20  oot.."].    }.. 
7d70: 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 64     # var(dv) = d
7d80: 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73  ict (item -> lis
7d90: 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20  t (item)), item 
7da0: 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69 64   = list (type id
7db0: 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ).    typemethod
7dc0: 20 73 75 63 63 65 73 73 6f 72 73 20 7b 64 76 20   successors {dv 
7dd0: 62 72 61 6e 63 68 65 73 7d 20 7b 0a 09 23 20 54  branches} {..# T
7de0: 68 65 20 66 69 72 73 74 20 72 65 76 69 73 69 6f  he first revisio
7df0: 6e 20 63 6f 6d 6d 69 74 74 65 64 20 6f 6e 20 61  n committed on a
7e00: 20 62 72 61 6e 63 68 2c 20 61 6e 64 20 61 6c 6c   branch, and all
7e10: 20 62 72 61 6e 63 68 65 73 0a 09 23 20 61 6e 64   branches..# and
7e20: 20 74 61 67 73 20 77 68 69 63 68 20 68 61 76 65   tags which have
7e30: 20 69 74 20 61 73 20 74 68 65 69 72 20 70 72 65   it as their pre
7e40: 66 65 72 65 64 20 70 61 72 65 6e 74 20 61 72 65  fered parent are
7e50: 20 74 68 65 0a 09 23 20 73 75 63 63 65 73 73 6f   the..# successo
7e60: 72 73 20 6f 66 20 61 20 62 72 61 6e 63 68 2e 0a  rs of a branch..
7e70: 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b  ..set theset ('[
7e80: 6a 6f 69 6e 20 24 62 72 61 6e 63 68 65 73 20 7b  join $branches {
7e90: 27 2c 27 7d 5d 27 29 0a 09 66 6f 72 65 61 63 68  ','}]')..foreach
7ea0: 20 7b 62 69 64 20 63 68 69 6c 64 7d 20 5b 73 74   {bid child} [st
7eb0: 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53  ate run "..    S
7ec0: 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 52 2e 72  ELECT B.bid, R.r
7ed0: 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72  id..    FROM   r
7ee0: 65 76 69 73 69 6f 6e 20 52 2c 20 62 72 61 6e 63  evision R, branc
7ef0: 68 20 42 0a 09 20 20 20 20 57 48 45 52 45 20 20  h B..    WHERE  
7f00: 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65 74  B.bid IN $theset
7f10: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 66  ..    AND    B.f
7f20: 69 72 73 74 20 3d 20 52 2e 72 69 64 0a 09 22 5d  irst = R.rid.."]
7f30: 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20   {..    lappend 
7f40: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69  dependencies([li
7f50: 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 62 69 64  st sym::tag $bid
7f60: 5d 29 20 5b 6c 69 73 74 20 72 65 76 20 24 63 68  ]) [list rev $ch
7f70: 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 68  ild]..}..foreach
7f80: 20 7b 62 69 64 20 63 68 69 6c 64 7d 20 5b 73 74   {bid child} [st
7f90: 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53  ate run "..    S
7fa0: 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 42 58 2e  ELECT B.bid, BX.
7fb0: 62 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  bid..    FROM   
7fc0: 62 72 61 6e 63 68 20 42 2c 20 62 72 61 6e 63 68  branch B, branch
7fd0: 20 42 58 2c 20 70 72 65 66 65 72 65 64 70 61 72   BX, preferedpar
7fe0: 65 6e 74 20 50 0a 09 20 20 20 20 57 48 45 52 45  ent P..    WHERE
7ff0: 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73    B.bid IN $thes
8000: 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42  et..    AND    B
8010: 2e 73 69 64 20 3d 20 50 2e 70 69 64 0a 09 20 20  .sid = P.pid..  
8020: 20 20 41 4e 44 20 20 20 20 42 58 2e 73 69 64 20    AND    BX.sid 
8030: 3d 20 50 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 20  = P.sid.."] {.. 
8040: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e     lappend depen
8050: 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79  dencies([list sy
8060: 6d 3a 3a 74 61 67 20 24 62 69 64 5d 29 20 5b 6c  m::tag $bid]) [l
8070: 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20  ist sym::branch 
8080: 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65  $child]..}..fore
8090: 61 63 68 20 7b 62 69 64 20 63 68 69 6c 64 7d 20  ach {bid child} 
80a0: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20  [state run "..  
80b0: 20 20 53 45 4c 45 43 54 20 42 2e 62 69 64 2c 20    SELECT B.bid, 
80c0: 54 2e 74 69 64 0a 09 20 20 20 20 46 52 4f 4d 20  T.tid..    FROM 
80d0: 20 20 62 72 61 6e 63 68 20 42 2c 20 74 61 67 20    branch B, tag 
80e0: 54 2c 20 70 72 65 66 65 72 65 64 70 61 72 65 6e  T, preferedparen
80f0: 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 20 20  t P..    WHERE  
8100: 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65 74  B.bid IN $theset
8110: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 73  ..    AND    B.s
8120: 69 64 20 3d 20 50 2e 70 69 64 0a 09 20 20 20 20  id = P.pid..    
8130: 41 4e 44 20 20 20 20 54 2e 73 69 64 20 3d 20 50  AND    T.sid = P
8140: 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20  .sid.."] {..    
8150: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e  lappend dependen
8160: 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a  cies([list sym::
8170: 74 61 67 20 24 62 69 64 5d 29 20 5b 6c 69 73 74  tag $bid]) [list
8180: 20 73 79 6d 3a 3a 74 61 67 20 24 63 68 69 6c 64   sym::tag $child
8190: 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20  ]..}..return.   
81a0: 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76   }..    # var(dv
81b0: 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d  ) = dict (item -
81c0: 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c 20  > list (item)), 
81d0: 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 79  item  = list (ty
81e0: 70 65 20 69 64 29 0a 20 20 20 20 74 79 70 65 6d  pe id).    typem
81f0: 65 74 68 6f 64 20 70 72 65 64 65 63 65 73 73 6f  ethod predecesso
8200: 72 73 20 7b 64 76 20 62 72 61 6e 63 68 65 73 7d  rs {dv branches}
8210: 20 7b 0a 09 23 20 54 68 65 20 70 72 65 64 65 63   {..# The predec
8220: 65 73 73 6f 72 73 20 6f 66 20 61 20 62 72 61 6e  essors of a bran
8230: 63 68 20 61 72 65 20 61 6c 6c 20 74 68 65 20 72  ch are all the r
8240: 65 76 69 73 69 6f 6e 73 20 74 68 65 0a 09 23 20  evisions the..# 
8250: 62 72 61 6e 63 68 65 73 20 61 72 65 20 73 70 61  branches are spa
8260: 77 6e 65 64 20 66 72 6f 6d 2c 20 61 73 20 77 65  wned from, as we
8270: 6c 6c 20 61 73 20 61 6c 6c 20 74 68 65 20 62 72  ll as all the br
8280: 61 6e 63 68 65 73 20 6f 72 0a 09 23 20 74 61 67  anches or..# tag
8290: 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65 69  s which are thei
82a0: 72 20 70 72 65 66 65 72 65 64 20 70 61 72 65 6e  r prefered paren
82b0: 74 73 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74  ts....set theset
82c0: 20 28 27 5b 6a 6f 69 6e 20 24 74 61 67 73 20 7b   ('[join $tags {
82d0: 27 2c 27 7d 5d 27 29 0a 09 66 6f 72 65 61 63 68  ','}]')..foreach
82e0: 20 7b 62 69 64 20 70 61 72 65 6e 74 7d 20 5b 73   {bid parent} [s
82f0: 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20  tate run "..    
8300: 53 45 4c 45 43 54 20 42 2e 42 69 64 2c 20 52 2e  SELECT B.Bid, R.
8310: 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  rid..    FROM   
8320: 72 65 76 69 73 69 6f 6e 20 52 2c 20 62 72 61 6e  revision R, bran
8330: 63 68 20 42 0a 09 20 20 20 20 57 48 45 52 45 20  ch B..    WHERE 
8340: 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65   B.bid IN $these
8350: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e  t..    AND    B.
8360: 72 6f 6f 74 20 3d 20 52 2e 72 69 64 0a 09 22 5d  root = R.rid.."]
8370: 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20   {..    lappend 
8380: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69  dependencies([li
8390: 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24  st sym::branch $
83a0: 62 69 64 5d 29 20 5b 6c 69 73 74 20 72 65 76 20  bid]) [list rev 
83b0: 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 66 6f 72  $parent]..}..for
83c0: 65 61 63 68 20 7b 62 69 64 20 70 61 72 65 6e 74  each {bid parent
83d0: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09  } [state run "..
83e0: 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62 69 64      SELECT B.bid
83f0: 2c 20 42 58 2e 62 69 64 0a 09 20 20 20 20 46 52  , BX.bid..    FR
8400: 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20 62  OM   branch B, b
8410: 72 61 6e 63 68 20 42 58 2c 20 70 72 65 66 65 72  ranch BX, prefer
8420: 65 64 70 61 72 65 6e 74 20 50 0a 09 20 20 20 20  edparent P..    
8430: 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20  WHERE  B.bid IN 
8440: 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44  $theset..    AND
8450: 20 20 20 20 42 2e 73 69 64 20 3d 20 50 2e 73 69      B.sid = P.si
8460: 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e  d..    AND    P.
8470: 70 69 64 20 3d 20 42 58 2e 73 69 64 0a 09 22 5d  pid = BX.sid.."]
8480: 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20   {..    lappend 
8490: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69  dependencies([li
84a0: 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24  st sym::branch $
84b0: 62 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a  bid]) [list sym:
84c0: 3a 62 72 61 6e 63 68 20 24 70 61 72 65 6e 74 5d  :branch $parent]
84d0: 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62 69  ..}..foreach {bi
84e0: 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65  d parent} [state
84f0: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45   run "..    SELE
8500: 43 54 20 42 2e 62 69 64 2c 20 54 2e 74 69 64 0a  CT B.bid, T.tid.
8510: 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e  .    FROM   bran
8520: 63 68 20 42 2c 20 74 61 67 20 54 2c 20 70 72 65  ch B, tag T, pre
8530: 66 65 72 65 64 70 61 72 65 6e 74 20 50 0a 09 20  feredparent P.. 
8540: 20 20 20 57 48 45 52 45 20 20 42 2e 74 69 64 20     WHERE  B.tid 
8550: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20  IN $theset..    
8560: 41 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50  AND    B.sid = P
8570: 2e 73 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20  .sid..    AND   
8580: 20 50 2e 70 69 64 20 3d 20 54 2e 73 69 64 0a 09   P.pid = T.sid..
8590: 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e  "] {..    lappen
85a0: 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b  d dependencies([
85b0: 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68  list sym::branch
85c0: 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 20 73 79   $bid]) [list sy
85d0: 6d 3a 3a 74 61 67 20 24 70 61 72 65 6e 74 5d 0a  m::tag $parent].
85e0: 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d  .}..return.    }
85f0: 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23  ..    # # ## ###
8600: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20   ##### ######## 
8610: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 20  #############.  
8620: 20 20 23 23 20 43 6f 6e 66 69 67 75 72 61 74 69    ## Configurati
8630: 6f 6e 0a 0a 20 20 20 20 70 72 61 67 6d 61 20 2d  on..    pragma -
8640: 68 61 73 69 6e 73 74 61 6e 63 65 73 20 20 20 6e  hasinstances   n
8650: 6f 20 3b 20 23 20 73 69 6e 67 6c 65 74 6f 6e 0a  o ; # singleton.
8660: 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 74      pragma -hast
8670: 79 70 65 69 6e 66 6f 20 20 20 20 6e 6f 20 3b 20  ypeinfo    no ; 
8680: 23 20 6e 6f 20 69 6e 74 72 6f 73 70 65 63 74 69  # no introspecti
8690: 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68  on.    pragma -h
86a0: 61 73 74 79 70 65 64 65 73 74 72 6f 79 20 6e 6f  astypedestroy no
86b0: 20 3b 20 23 20 69 6d 6d 6f 72 74 61 6c 0a 7d 0a   ; # immortal.}.
86c0: 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23  .# # ## ### ####
86d0: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
86e0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
86f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23  ##############.#
8700: 23 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61  #..namespace eva
8710: 6c 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a  l ::vc::fossil::
8720: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f  import::cvs::pro
8730: 6a 65 63 74 20 7b 0a 20 20 20 20 6e 61 6d 65 73  ject {.    names
8740: 70 61 63 65 20 65 78 70 6f 72 74 20 72 65 76 0a  pace export rev.
8750: 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 65 76      namespace ev
8760: 61 6c 20 72 65 76 20 7b 0a 09 6e 61 6d 65 73 70  al rev {..namesp
8770: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a  ace import ::vc:
8780: 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a  :fossil::import:
8790: 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09 6e 61 6d  :cvs::state..nam
87a0: 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a  espace import ::
87b0: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f  vc::fossil::impo
87c0: 72 74 3a 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69  rt::cvs::integri
87d0: 74 79 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d  ty..namespace im
87e0: 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73  port ::vc::tools
87f0: 3a 3a 6d 69 73 63 3a 3a 2a 0a 09 6e 61 6d 65 73  ::misc::*..names
8800: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63  pace import ::vc
8810: 3a 3a 74 6f 6f 6c 73 3a 3a 74 72 6f 75 62 6c 65  ::tools::trouble
8820: 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f  ..namespace impo
8830: 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a  rt ::vc::tools::
8840: 6c 6f 67 0a 09 6c 6f 67 20 72 65 67 69 73 74 65  log..log registe
8850: 72 20 63 73 65 74 73 0a 0a 09 23 20 53 65 74 20  r csets...# Set 
8860: 75 70 20 74 68 65 20 68 65 6c 70 65 72 20 73 69  up the helper si
8870: 6e 67 6c 65 74 6f 6e 73 0a 09 6e 61 6d 65 73 70  ngletons..namesp
8880: 61 63 65 20 65 76 61 6c 20 72 65 76 20 7b 0a 09  ace eval rev {..
8890: 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d      namespace im
88a0: 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69  port ::vc::fossi
88b0: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a  l::import::cvs::
88c0: 73 74 61 74 65 0a 09 20 20 20 20 6e 61 6d 65 73  state..    names
88d0: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63  pace import ::vc
88e0: 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74  ::fossil::import
88f0: 3a 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79  ::cvs::integrity
8900: 0a 09 7d 0a 09 6e 61 6d 65 73 70 61 63 65 20 65  ..}..namespace e
8910: 76 61 6c 20 73 79 6d 3a 3a 74 61 67 20 7b 0a 09  val sym::tag {..
8920: 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d      namespace im
8930: 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69  port ::vc::fossi
8940: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a  l::import::cvs::
8950: 73 74 61 74 65 0a 09 20 20 20 20 6e 61 6d 65 73  state..    names
8960: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63  pace import ::vc
8970: 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74  ::fossil::import
8980: 3a 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79  ::cvs::integrity
8990: 0a 09 7d 0a 09 6e 61 6d 65 73 70 61 63 65 20 65  ..}..namespace e
89a0: 76 61 6c 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20  val sym::branch 
89b0: 7b 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65  {..    namespace
89c0: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f   import ::vc::fo
89d0: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
89e0: 73 3a 3a 73 74 61 74 65 0a 09 20 20 20 20 6e 61  s::state..    na
89f0: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
8a00: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70  :vc::fossil::imp
8a10: 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e 74 65 67 72  ort::cvs::integr
8a20: 69 74 79 0a 09 7d 0a 20 20 20 20 7d 0a 7d 0a 0a  ity..}.    }.}..
8a30: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
8a40: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
8a50: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
8a60: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23  #############.##
8a70: 20 52 65 61 64 79 0a 0a 70 61 63 6b 61 67 65 20   Ready..package 
8a80: 70 72 6f 76 69 64 65 20 76 63 3a 3a 66 6f 73 73  provide vc::foss
8a90: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a  il::import::cvs:
8aa0: 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 20 31 2e  :project::rev 1.
8ab0: 30 0a 72 65 74 75 72 6e 0a                       0.return.