Hex Artifact Content
Not logged in

Artifact ee1979daea3118a2ae26e6375e117a5774b28c5a:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [39e19c0cf3] - Simplified some code dealing with the item -> changeset map, using the changed semantics (1:n -> 1:1). by aku on 2007-11-29 07:41:48.

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 20 20 20  method id       
0980: 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79   {} { return $my
0990: 69 64 20 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20  id }.    method 
09a0: 72 65 76 69 73 69 6f 6e 73 20 7b 7d 20 7b 20 72  revisions {} { r
09b0: 65 74 75 72 6e 20 24 6d 79 74 69 74 65 6d 73 20  eturn $mytitems 
09c0: 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20 64 61 74  }.    method dat
09d0: 61 20 20 20 20 20 20 7b 7d 20 7b 20 72 65 74 75  a      {} { retu
09e0: 72 6e 20 5b 6c 69 73 74 20 24 6d 79 70 72 6f 6a  rn [list $myproj
09f0: 65 63 74 20 24 6d 79 74 79 70 65 20 24 6d 79 73  ect $mytype $mys
0a00: 72 63 69 64 5d 20 7d 0a 0a 20 20 20 20 64 65 6c  rcid] }..    del
0a10: 65 67 61 74 65 20 6d 65 74 68 6f 64 20 62 79 73  egate method bys
0a20: 79 6d 62 6f 6c 20 20 20 74 6f 20 6d 79 74 79 70  ymbol   to mytyp
0a30: 65 6f 62 6a 0a 20 20 20 20 64 65 6c 65 67 61 74  eobj.    delegat
0a40: 65 20 6d 65 74 68 6f 64 20 62 79 72 65 76 69 73  e method byrevis
0a50: 69 6f 6e 20 74 6f 20 6d 79 74 79 70 65 6f 62 6a  ion to mytypeobj
0a60: 0a 20 20 20 20 64 65 6c 65 67 61 74 65 20 6d 65  .    delegate me
0a70: 74 68 6f 64 20 69 73 62 72 61 6e 63 68 20 20 20  thod isbranch   
0a80: 74 6f 20 6d 79 74 79 70 65 6f 62 6a 0a 20 20 20  to mytypeobj.   
0a90: 20 64 65 6c 65 67 61 74 65 20 6d 65 74 68 6f 64   delegate method
0aa0: 20 69 73 74 61 67 20 20 20 20 20 20 74 6f 20 6d   istag      to m
0ab0: 79 74 79 70 65 6f 62 6a 0a 0a 20 20 20 20 6d 65  ytypeobj..    me
0ac0: 74 68 6f 64 20 73 65 74 70 6f 73 20 7b 70 7d 20  thod setpos {p} 
0ad0: 7b 20 73 65 74 20 6d 79 70 6f 73 20 24 70 20 3b  { set mypos $p ;
0ae0: 20 72 65 74 75 72 6e 20 7d 0a 20 20 20 20 6d 65   return }.    me
0af0: 74 68 6f 64 20 70 6f 73 20 20 20 20 7b 7d 20 20  thod pos    {}  
0b00: 7b 20 72 65 74 75 72 6e 20 24 6d 79 70 6f 73 20  { return $mypos 
0b10: 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20  }..    # result 
0b20: 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d 3e 20  = dict (item -> 
0b30: 6c 69 73 74 20 28 63 68 61 6e 67 65 73 65 74 29  list (changeset)
0b40: 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 75 63  ).    method suc
0b50: 63 65 73 73 6f 72 6d 61 70 20 7b 7d 20 7b 0a 09  cessormap {} {..
0b60: 23 20 4e 4f 54 45 20 2f 20 46 55 54 55 52 45 3a  # NOTE / FUTURE:
0b70: 20 50 6f 73 73 69 62 6c 65 20 62 6f 74 74 6c 65   Possible bottle
0b80: 6e 65 63 6b 2e 0a 09 61 72 72 61 79 20 73 65 74  neck...array set
0b90: 20 74 6d 70 20 7b 7d 0a 09 66 6f 72 65 61 63 68   tmp {}..foreach
0ba0: 20 7b 72 65 76 20 63 68 69 6c 64 72 65 6e 7d 20   {rev children} 
0bb0: 5b 24 73 65 6c 66 20 6e 65 78 74 6d 61 70 5d 20  [$self nextmap] 
0bc0: 7b 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 63  {..    foreach c
0bd0: 68 69 6c 64 20 24 63 68 69 6c 64 72 65 6e 20 7b  hild $children {
0be0: 0a 09 09 6c 61 70 70 65 6e 64 20 74 6d 70 28 24  ...lappend tmp($
0bf0: 72 65 76 29 20 24 6d 79 69 74 65 6d 6d 61 70 28  rev) $myitemmap(
0c00: 24 63 68 69 6c 64 29 0a 09 20 20 20 20 7d 0a 09  $child)..    }..
0c10: 20 20 20 20 73 65 74 20 74 6d 70 28 24 72 65 76      set tmp($rev
0c20: 29 20 5b 6c 73 6f 72 74 20 2d 75 6e 69 71 75 65  ) [lsort -unique
0c30: 20 24 74 6d 70 28 24 72 65 76 29 5d 0a 09 7d 0a   $tmp($rev)]..}.
0c40: 09 72 65 74 75 72 6e 20 5b 61 72 72 61 79 20 67  .return [array g
0c50: 65 74 20 74 6d 70 5d 0a 20 20 20 20 7d 0a 0a 20  et tmp].    }.. 
0c60: 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69     # result = li
0c70: 73 74 20 28 63 68 61 6e 67 65 73 65 74 29 0a 20  st (changeset). 
0c80: 20 20 20 6d 65 74 68 6f 64 20 73 75 63 63 65 73     method succes
0c90: 73 6f 72 73 20 7b 7d 20 7b 0a 09 23 20 4e 4f 54  sors {} {..# NOT
0ca0: 45 20 2f 20 46 55 54 55 52 45 3a 20 50 6f 73 73  E / FUTURE: Poss
0cb0: 69 62 6c 65 20 62 6f 74 74 6c 65 6e 65 63 6b 2e  ible bottleneck.
0cc0: 0a 09 73 65 74 20 63 73 65 74 73 20 7b 7d 0a 09  ..set csets {}..
0cd0: 66 6f 72 65 61 63 68 20 7b 5f 20 63 68 69 6c 64  foreach {_ child
0ce0: 72 65 6e 7d 20 5b 24 73 65 6c 66 20 6e 65 78 74  ren} [$self next
0cf0: 6d 61 70 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65  map] {..    fore
0d00: 61 63 68 20 63 68 69 6c 64 20 24 63 68 69 6c 64  ach child $child
0d10: 72 65 6e 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20  ren {...lappend 
0d20: 63 73 65 74 73 20 24 6d 79 69 74 65 6d 6d 61 70  csets $myitemmap
0d30: 28 24 63 68 69 6c 64 29 0a 09 20 20 20 20 7d 0a  ($child)..    }.
0d40: 09 7d 0a 09 72 65 74 75 72 6e 20 5b 6c 73 6f 72  .}..return [lsor
0d50: 74 20 2d 75 6e 69 71 75 65 20 24 63 73 65 74 73  t -unique $csets
0d60: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72  ].    }..    # r
0d70: 65 73 75 6c 74 20 3d 20 64 69 63 74 20 28 69 74  esult = dict (it
0d80: 65 6d 20 2d 3e 20 6c 69 73 74 20 28 63 68 61 6e  em -> list (chan
0d90: 67 65 73 65 74 29 29 0a 20 20 20 20 6d 65 74 68  geset)).    meth
0da0: 6f 64 20 70 72 65 64 65 63 65 73 73 6f 72 6d 61  od predecessorma
0db0: 70 20 7b 7d 20 7b 0a 09 23 20 4e 4f 54 45 20 2f  p {} {..# NOTE /
0dc0: 20 46 55 54 55 52 45 3a 20 50 6f 73 73 69 62 6c   FUTURE: Possibl
0dd0: 65 20 62 6f 74 74 6c 65 6e 65 63 6b 2e 0a 09 61  e bottleneck...a
0de0: 72 72 61 79 20 73 65 74 20 74 6d 70 20 7b 7d 0a  rray set tmp {}.
0df0: 09 66 6f 72 65 61 63 68 20 7b 72 65 76 20 63 68  .foreach {rev ch
0e00: 69 6c 64 72 65 6e 7d 20 5b 24 73 65 6c 66 20 70  ildren} [$self p
0e10: 72 65 6d 61 70 5d 20 7b 0a 09 20 20 20 20 66 6f  remap] {..    fo
0e20: 72 65 61 63 68 20 63 68 69 6c 64 20 24 63 68 69  reach child $chi
0e30: 6c 64 72 65 6e 20 7b 0a 09 09 6c 61 70 70 65 6e  ldren {...lappen
0e40: 64 20 74 6d 70 28 24 72 65 76 29 20 24 6d 79 69  d tmp($rev) $myi
0e50: 74 65 6d 6d 61 70 28 24 63 68 69 6c 64 29 0a 09  temmap($child)..
0e60: 20 20 20 20 7d 0a 09 20 20 20 20 73 65 74 20 74      }..    set t
0e70: 6d 70 28 24 72 65 76 29 20 5b 6c 73 6f 72 74 20  mp($rev) [lsort 
0e80: 2d 75 6e 69 71 75 65 20 24 74 6d 70 28 24 72 65  -unique $tmp($re
0e90: 76 29 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b  v)]..}..return [
0ea0: 61 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 20  array get tmp]. 
0eb0: 20 20 20 7d 0a 0a 20 20 20 20 23 20 69 74 65 6d     }..    # item
0ec0: 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 0a   -> list (item).
0ed0: 20 20 20 20 6d 65 74 68 6f 64 20 6e 65 78 74 6d      method nextm
0ee0: 61 70 20 7b 7d 20 7b 0a 09 69 66 20 7b 5b 6c 6c  ap {} {..if {[ll
0ef0: 65 6e 67 74 68 20 24 6d 79 6e 65 78 74 6d 61 70  ength $mynextmap
0f00: 5d 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 6e  ]} { return $myn
0f10: 65 78 74 6d 61 70 20 7d 0a 09 24 6d 79 74 79 70  extmap }..$mytyp
0f20: 65 6f 62 6a 20 73 75 63 63 65 73 73 6f 72 73 20  eobj successors 
0f30: 74 6d 70 20 24 6d 79 69 74 65 6d 73 0a 09 73 65  tmp $myitems..se
0f40: 74 20 6d 79 6e 65 78 74 6d 61 70 20 5b 61 72 72  t mynextmap [arr
0f50: 61 79 20 67 65 74 20 74 6d 70 5d 0a 09 72 65 74  ay get tmp]..ret
0f60: 75 72 6e 20 24 6d 79 6e 65 78 74 6d 61 70 0a 20  urn $mynextmap. 
0f70: 20 20 20 7d 0a 0a 20 20 20 20 23 20 69 74 65 6d     }..    # item
0f80: 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 0a   -> list (item).
0f90: 20 20 20 20 6d 65 74 68 6f 64 20 70 72 65 6d 61      method prema
0fa0: 70 20 7b 7d 20 7b 0a 09 69 66 20 7b 5b 6c 6c 65  p {} {..if {[lle
0fb0: 6e 67 74 68 20 24 6d 79 70 72 65 6d 61 70 5d 7d  ngth $mypremap]}
0fc0: 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 70 72 65   { return $mypre
0fd0: 6d 61 70 20 7d 0a 09 24 6d 79 74 79 70 65 6f 62  map }..$mytypeob
0fe0: 6a 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 74  j predecessors t
0ff0: 6d 70 20 24 6d 79 69 74 65 6d 73 0a 09 73 65 74  mp $myitems..set
1000: 20 6d 79 70 72 65 6d 61 70 20 5b 61 72 72 61 79   mypremap [array
1010: 20 67 65 74 20 74 6d 70 5d 0a 09 72 65 74 75 72   get tmp]..retur
1020: 6e 20 24 6d 79 70 72 65 6d 61 70 0a 20 20 20 20  n $mypremap.    
1030: 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 62 72  }..    method br
1040: 65 61 6b 69 6e 74 65 72 6e 61 6c 64 65 70 65 6e  eakinternaldepen
1050: 64 65 6e 63 69 65 73 20 7b 7d 20 7b 0a 09 23 20  dencies {} {..# 
1060: 54 68 69 73 20 6d 65 74 68 6f 64 20 69 6e 73 70  This method insp
1070: 65 63 74 73 20 74 68 65 20 63 68 61 6e 67 65 73  ects the changes
1080: 65 74 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ets for internal
1090: 0a 09 23 20 64 65 70 65 6e 64 65 6e 63 69 65 73  ..# dependencies
10a0: 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 64 6f 6e  . Nothing is don
10b0: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  e if there are n
10c0: 6f 0a 09 23 20 73 75 63 68 2e 20 4f 74 68 65 72  o..# such. Other
10d0: 77 69 73 65 20 74 68 65 20 63 68 61 6e 67 65 73  wise the changes
10e0: 65 74 20 69 73 20 73 70 6c 69 74 20 69 6e 74 6f  et is split into
10f0: 20 61 20 73 65 74 20 6f 66 0a 09 23 20 66 72 61   a set of..# fra
1100: 67 6d 65 6e 74 73 20 77 69 74 68 6f 75 74 20 69  gments without i
1110: 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e  nternal dependen
1120: 63 69 65 73 2c 20 74 72 61 6e 73 66 6f 72 6d 69  cies, transformi
1130: 6e 67 20 74 68 65 0a 09 23 20 69 6e 74 65 72 6e  ng the..# intern
1140: 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  al dependencies 
1150: 69 6e 74 6f 20 65 78 74 65 72 6e 61 6c 20 6f 6e  into external on
1160: 65 73 2e 20 54 68 65 20 6e 65 77 20 63 68 61 6e  es. The new chan
1170: 67 65 73 65 74 73 0a 09 23 20 61 72 65 20 61 64  gesets..# are ad
1180: 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73 74 20  ded to the list 
1190: 6f 66 20 61 6c 6c 20 63 68 61 6e 67 65 73 65 74  of all changeset
11a0: 73 2e 0a 0a 09 23 20 57 65 20 70 65 72 66 6f 72  s....# We perfor
11b0: 6d 20 61 6c 6c 20 6e 65 63 65 73 73 61 72 79 20  m all necessary 
11c0: 73 70 6c 69 74 73 20 69 6e 20 6f 6e 65 20 67 6f  splits in one go
11d0: 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 6c  , instead of onl
11e0: 79 0a 09 23 20 6f 6e 65 2e 20 54 68 65 20 70 72  y..# one. The pr
11f0: 65 76 69 6f 75 73 20 61 6c 67 6f 72 69 74 68 6d  evious algorithm
1200: 2c 20 61 64 61 70 74 65 64 20 66 72 6f 6d 20 63  , adapted from c
1210: 76 73 32 73 76 6e 2c 20 63 6f 6d 70 75 74 65 64  vs2svn, computed
1220: 0a 09 23 20 61 20 6c 6f 74 20 6f 66 20 73 74 61  ..# a lot of sta
1230: 74 65 20 77 68 69 63 68 20 77 61 73 20 74 68 72  te which was thr
1240: 6f 77 6e 20 61 77 61 79 20 61 6e 64 20 74 68 65  own away and the
1250: 6e 20 63 6f 6d 70 75 74 65 64 20 61 67 61 69 6e  n computed again
1260: 0a 09 23 20 66 6f 72 20 65 61 63 68 20 6f 66 20  ..# for each of 
1270: 74 68 65 20 66 72 61 67 6d 65 6e 74 73 2e 20 49  the fragments. I
1280: 74 20 73 68 6f 75 6c 64 20 62 65 20 65 61 73 69  t should be easi
1290: 65 72 20 74 6f 20 75 70 64 61 74 65 20 61 6e 64  er to update and
12a0: 0a 09 23 20 72 65 75 73 65 20 74 68 61 74 20 73  ..# reuse that s
12b0: 74 61 74 65 2e 0a 0a 09 23 20 54 68 65 20 63 6f  tate....# The co
12c0: 64 65 20 63 68 65 63 6b 73 20 6f 6e 6c 79 20 73  de checks only s
12d0: 75 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e  ucessor dependen
12e0: 63 69 65 73 2c 20 61 73 20 74 68 69 73 0a 09 23  cies, as this..#
12f0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63   automatically c
1300: 6f 76 65 72 73 20 74 68 65 20 70 72 65 64 65 63  overs the predec
1310: 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 69  essor dependenci
1320: 65 73 20 61 73 20 77 65 6c 6c 20 28 41 0a 09 23  es as well (A..#
1330: 20 73 75 63 63 65 73 73 6f 72 20 64 65 70 65 6e   successor depen
1340: 64 65 6e 63 79 20 61 20 2d 3e 20 62 20 69 73 20  dency a -> b is 
1350: 61 6c 73 6f 20 61 20 70 72 65 64 65 63 65 73 73  also a predecess
1360: 6f 72 20 64 65 70 65 6e 64 65 6e 63 79 0a 09 23  or dependency..#
1370: 20 62 20 2d 3e 20 61 29 2e 0a 0a 09 23 20 41 72   b -> a)....# Ar
1380: 72 61 79 20 6f 66 20 64 65 70 65 6e 64 65 6e 63  ray of dependenc
1390: 69 65 73 20 28 70 61 72 65 6e 74 20 2d 3e 20 63  ies (parent -> c
13a0: 68 69 6c 64 29 2e 20 54 68 69 73 20 69 73 20 70  hild). This is p
13b0: 75 6c 6c 65 64 20 66 72 6f 6d 0a 09 23 20 74 68  ulled from..# th
13c0: 65 20 73 74 61 74 65 2c 20 61 6e 64 20 6c 69 6d  e state, and lim
13d0: 69 74 65 64 20 74 6f 20 73 75 63 63 65 73 73 6f  ited to successo
13e0: 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 63 68  rs within the ch
13f0: 61 6e 67 65 73 65 74 2e 0a 0a 09 61 72 72 61 79  angeset....array
1400: 20 73 65 74 20 64 65 70 65 6e 64 65 6e 63 69 65   set dependencie
1410: 73 20 7b 7d 0a 09 24 6d 79 74 79 70 65 6f 62 6a  s {}..$mytypeobj
1420: 20 69 6e 74 65 72 6e 61 6c 73 75 63 63 65 73 73   internalsuccess
1430: 6f 72 73 20 64 65 70 65 6e 64 65 6e 63 69 65 73  ors dependencies
1440: 20 24 6d 79 69 74 65 6d 73 0a 09 69 66 20 7b 21   $myitems..if {!
1450: 5b 61 72 72 61 79 20 73 69 7a 65 20 64 65 70 65  [array size depe
1460: 6e 64 65 6e 63 69 65 73 5d 7d 20 7b 72 65 74 75  ndencies]} {retu
1470: 72 6e 20 30 7d 20 3b 20 23 20 4e 6f 74 68 69 6e  rn 0} ; # Nothin
1480: 67 20 74 6f 20 62 72 65 61 6b 2e 0a 0a 09 6c 6f  g to break....lo
1490: 67 20 77 72 69 74 65 20 35 20 63 73 65 74 73 20  g write 5 csets 
14a0: 2e 2e 2e 5b 24 73 65 6c 66 20 73 74 72 5d 2e 2e  ...[$self str]..
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 2e 2e 2e 2e 2e 2e 2e  ................
14e0: 2e 2e 2e 2e 2e 0a 0a 09 23 20 57 65 20 68 61 76  ........# We hav
14f0: 65 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e  e internal depen
1500: 64 65 6e 63 69 65 73 20 74 6f 20 62 72 65 61 6b  dencies to break
1510: 2e 20 57 65 20 6e 6f 77 20 69 74 65 72 61 74 65  . We now iterate
1520: 20 6f 76 65 72 0a 09 23 20 61 6c 6c 20 70 6f 73   over..# all pos
1530: 69 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69  itions in the li
1540: 73 74 20 28 77 68 69 63 68 20 69 73 20 63 68 72  st (which is chr
1550: 6f 6e 6f 6c 6f 67 69 63 61 6c 2c 20 61 74 20 6c  onological, at l
1560: 65 61 73 74 0a 09 23 20 61 73 20 66 61 72 20 61  east..# as far a
1570: 73 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 73  s the timestamps
1580: 20 61 72 65 20 63 6f 72 72 65 63 74 20 61 6e 64   are correct and
1590: 20 75 6e 69 71 75 65 29 20 61 6e 64 0a 09 23 20   unique) and..# 
15a0: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65  determine the be
15b0: 73 74 20 70 6f 73 69 74 69 6f 6e 20 66 6f 72 20  st position for 
15c0: 74 68 65 20 62 72 65 61 6b 2c 20 62 79 20 74 72  the break, by tr
15d0: 79 69 6e 67 20 74 6f 0a 09 23 20 62 72 65 61 6b  ying to..# break
15e0: 20 61 73 20 6d 61 6e 79 20 64 65 70 65 6e 64 65   as many depende
15f0: 6e 63 69 65 73 20 61 73 20 70 6f 73 73 69 62 6c  ncies as possibl
1600: 65 20 69 6e 20 6f 6e 65 20 67 6f 2e 20 57 68 65  e in one go. Whe
1610: 6e 20 61 0a 09 23 20 62 72 65 61 6b 20 77 61 73  n a..# break was
1620: 20 66 6f 75 6e 64 20 74 68 69 73 20 69 73 20 72   found this is r
1630: 65 64 6f 6e 65 20 66 6f 72 20 74 68 65 20 66 72  edone for the fr
1640: 61 67 6d 65 6e 74 73 20 63 6f 6d 69 6e 67 20 61  agments coming a
1650: 6e 64 0a 09 23 20 61 66 74 65 72 2c 20 61 66 74  nd..# after, aft
1660: 65 72 20 75 70 64 69 6e 67 20 74 68 65 20 63 72  er upding the cr
1670: 6f 73 73 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  ossing informati
1680: 6f 6e 2e 0a 0a 09 23 20 44 61 74 61 20 73 74 72  on....# Data str
1690: 75 63 74 75 72 65 73 3a 0a 09 23 20 4d 61 70 3a  uctures:..# Map:
16a0: 20 20 50 4f 53 20 20 20 72 65 76 69 73 69 6f 6e    POS   revision
16b0: 20 69 64 20 20 20 20 20 20 2d 3e 20 70 6f 73 69   id      -> posi
16c0: 74 69 6f 6e 20 69 6e 20 6c 69 73 74 2e 0a 09 23  tion in list...#
16d0: 20 20 20 20 20 20 20 43 52 4f 53 53 20 70 6f 73         CROSS pos
16e0: 69 74 69 6f 6e 20 69 6e 20 6c 69 73 74 20 2d 3e  ition in list ->
16f0: 20 6e 75 6d 62 65 72 20 6f 66 20 64 65 70 65 6e   number of depen
1700: 64 65 6e 63 69 65 73 20 63 72 6f 73 73 69 6e 67  dencies crossing
1710: 20 69 74 0a 09 23 20 20 20 20 20 20 20 44 45 50   it..#       DEP
1720: 43 20 20 64 65 70 65 6e 64 65 6e 63 79 20 20 20  C  dependency   
1730: 20 20 20 20 2d 3e 20 70 6f 73 69 74 69 6f 6e 73      -> positions
1740: 20 69 74 20 63 72 6f 73 73 65 73 0a 09 23 20 4c   it crosses..# L
1750: 69 73 74 3a 20 52 41 4e 47 45 20 4f 66 20 74 68  ist: RANGE Of th
1760: 65 20 70 6f 73 69 74 69 6f 6e 73 20 69 74 73 65  e positions itse
1770: 6c 66 2e 0a 09 23 20 41 20 64 65 70 65 6e 64 65  lf...# A depende
1780: 6e 63 79 20 69 73 20 61 20 73 69 6e 67 6c 65 2d  ncy is a single-
1790: 65 6c 65 6d 65 6e 74 20 6d 61 70 20 70 61 72 65  element map pare
17a0: 6e 74 20 2d 3e 20 63 68 69 6c 64 0a 0a 09 49 6e  nt -> child...In
17b0: 69 74 69 61 6c 69 7a 65 42 72 65 61 6b 53 74 61  itializeBreakSta
17c0: 74 65 20 24 6d 79 69 74 65 6d 73 0a 0a 09 73 65  te $myitems...se
17d0: 74 20 66 72 61 67 6d 65 6e 74 73 20 7b 7d 0a 09  t fragments {}..
17e0: 73 65 74 20 70 65 6e 64 69 6e 67 20 20 20 5b 6c  set pending   [l
17f0: 69 73 74 20 24 72 61 6e 67 65 5d 0a 09 73 65 74  ist $range]..set
1800: 20 61 74 20 20 20 20 20 20 20 20 30 0a 09 61 72   at        0..ar
1810: 72 61 79 20 73 65 74 20 62 72 65 61 6b 73 20 7b  ray set breaks {
1820: 7d 0a 0a 09 77 68 69 6c 65 20 7b 24 61 74 20 3c  }...while {$at <
1830: 20 5b 6c 6c 65 6e 67 74 68 20 24 70 65 6e 64 69   [llength $pendi
1840: 6e 67 5d 7d 20 7b 0a 09 20 20 20 20 73 65 74 20  ng]} {..    set 
1850: 63 75 72 72 65 6e 74 20 5b 6c 69 6e 64 65 78 20  current [lindex 
1860: 24 70 65 6e 64 69 6e 67 20 24 61 74 5d 0a 0a 09  $pending $at]...
1870: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 36 20      log write 6 
1880: 63 73 65 74 73 20 7b 2e 20 2e 20 2e 2e 20 2e 2e  csets {. . .. ..
1890: 2e 20 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e  . ..... ........
18a0: 20 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 7d 0a   .............}.
18b0: 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 36  .    log write 6
18c0: 20 63 73 65 74 73 20 7b 53 63 68 65 64 75 6c 65   csets {Schedule
18d0: 64 20 20 20 5b 6a 6f 69 6e 20 5b 50 52 73 20 5b  d   [join [PRs [
18e0: 6c 72 61 6e 67 65 20 24 70 65 6e 64 69 6e 67 20  lrange $pending 
18f0: 24 61 74 20 65 6e 64 5d 5d 20 7b 20 7d 5d 7d 0a  $at end]] { }]}.
1900: 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 36  .    log write 6
1910: 20 63 73 65 74 73 20 7b 43 6f 6e 73 69 64 65 72   csets {Consider
1920: 69 6e 67 20 5b 50 52 20 24 63 75 72 72 65 6e 74  ing [PR $current
1930: 5d 20 5c 5b 24 61 74 2f 5b 6c 6c 65 6e 67 74 68  ] \[$at/[llength
1940: 20 24 70 65 6e 64 69 6e 67 5d 5c 5d 7d 0a 0a 09   $pending]\]}...
1950: 20 20 20 20 73 65 74 20 62 65 73 74 20 5b 46 69      set best [Fi
1960: 6e 64 42 65 73 74 42 72 65 61 6b 20 24 63 75 72  ndBestBreak $cur
1970: 72 65 6e 74 5d 0a 0a 09 20 20 20 20 69 66 20 7b  rent]...    if {
1980: 24 62 65 73 74 20 3c 20 30 7d 20 7b 0a 09 09 23  $best < 0} {...#
1990: 20 54 68 65 20 69 6e 73 70 65 63 74 65 64 20 72   The inspected r
19a0: 61 6e 67 65 20 68 61 73 20 6e 6f 20 69 6e 74 65  ange has no inte
19b0: 72 6e 61 6c 0a 09 09 23 20 64 65 70 65 6e 64 65  rnal...# depende
19c0: 6e 63 69 65 73 2e 20 54 68 69 73 20 69 73 20 61  ncies. This is a
19d0: 20 63 6f 6d 70 6c 65 74 65 20 66 72 61 67 6d 65   complete fragme
19e0: 6e 74 2e 0a 09 09 6c 61 70 70 65 6e 64 20 66 72  nt....lappend fr
19f0: 61 67 6d 65 6e 74 73 20 24 63 75 72 72 65 6e 74  agments $current
1a00: 0a 0a 09 09 6c 6f 67 20 77 72 69 74 65 20 36 20  ....log write 6 
1a10: 63 73 65 74 73 20 22 4e 6f 20 62 72 65 61 6b 73  csets "No breaks
1a20: 2c 20 66 69 6e 61 6c 22 0a 09 20 20 20 20 7d 20  , final"..    } 
1a30: 65 6c 73 65 20 7b 0a 09 09 23 20 53 70 6c 69 74  else {...# Split
1a40: 20 74 68 65 20 72 61 6e 67 65 20 61 6e 64 20 73   the range and s
1a50: 63 68 65 64 75 6c 65 20 74 68 65 20 72 65 73 75  chedule the resu
1a60: 6c 74 69 6e 67 20 66 72 61 67 6d 65 6e 74 73 0a  lting fragments.
1a70: 09 09 23 20 66 6f 72 20 66 75 72 74 68 65 72 20  ..# for further 
1a80: 69 6e 73 70 65 63 74 69 6f 6e 2e 20 52 65 6d 65  inspection. Reme
1a90: 6d 62 65 72 20 74 68 65 20 6e 75 6d 62 65 72 20  mber the number 
1aa0: 6f 66 0a 09 09 23 20 64 65 70 65 6e 64 65 6e 63  of...# dependenc
1ab0: 69 65 73 20 63 75 74 20 62 65 66 6f 72 65 20 77  ies cut before w
1ac0: 65 20 72 65 6d 6f 76 65 20 74 68 65 6d 20 66 72  e remove them fr
1ad0: 6f 6d 0a 09 09 23 20 63 6f 6e 73 69 64 65 72 61  om...# considera
1ae0: 74 69 6f 6e 2c 20 66 6f 72 20 64 6f 63 75 6d 65  tion, for docume
1af0: 6e 74 61 74 69 6f 6e 20 6c 61 74 65 72 2e 0a 0a  ntation later...
1b00: 09 09 73 65 74 20 62 72 65 61 6b 73 28 24 62 65  ..set breaks($be
1b10: 73 74 29 20 24 63 72 6f 73 73 28 24 62 65 73 74  st) $cross($best
1b20: 29 0a 0a 09 09 6c 6f 67 20 77 72 69 74 65 20 36  )....log write 6
1b30: 20 63 73 65 74 73 20 22 42 65 73 74 20 62 72 65   csets "Best bre
1b40: 61 6b 20 40 20 24 62 65 73 74 2c 20 63 75 74 74  ak @ $best, cutt
1b50: 69 6e 67 20 5b 6e 73 70 20 24 63 72 6f 73 73 28  ing [nsp $cross(
1b60: 24 62 65 73 74 29 20 64 65 70 65 6e 64 65 6e 63  $best) dependenc
1b70: 79 20 64 65 70 65 6e 64 65 6e 63 69 65 73 5d 22  y dependencies]"
1b80: 0a 0a 09 09 23 20 4e 6f 74 65 3a 20 54 68 65 20  ....# Note: The 
1b90: 76 61 6c 75 65 20 6f 66 20 62 65 73 74 20 69 73  value of best is
1ba0: 20 61 6e 20 61 62 6f 6c 75 74 65 20 6c 6f 63 61   an abolute loca
1bb0: 74 69 6f 6e 20 69 6e 0a 09 09 23 20 6d 79 69 74  tion in...# myit
1bc0: 65 6d 73 2e 20 55 73 65 20 74 68 65 20 73 74 61  ems. Use the sta
1bd0: 72 74 20 6f 66 20 63 75 72 72 65 6e 74 20 74 6f  rt of current to
1be0: 20 6d 61 6b 65 20 69 74 20 61 6e 0a 09 09 23 20   make it an...# 
1bf0: 69 6e 64 65 78 20 61 62 73 6f 6c 75 74 65 20 74  index absolute t
1c00: 6f 20 63 75 72 72 65 6e 74 2e 0a 0a 09 09 73 65  o current.....se
1c10: 74 20 62 72 65 6c 20 5b 65 78 70 72 20 7b 24 62  t brel [expr {$b
1c20: 65 73 74 20 2d 20 5b 6c 69 6e 64 65 78 20 24 63  est - [lindex $c
1c30: 75 72 72 65 6e 74 20 30 5d 7d 5d 0a 09 09 73 65  urrent 0]}]...se
1c40: 74 20 62 6e 65 78 74 20 24 62 72 65 6c 20 3b 20  t bnext $brel ; 
1c50: 69 6e 63 72 20 62 6e 65 78 74 0a 09 09 73 65 74  incr bnext...set
1c60: 20 66 72 61 67 62 65 66 6f 72 65 20 5b 6c 72 61   fragbefore [lra
1c70: 6e 67 65 20 24 63 75 72 72 65 6e 74 20 30 20 24  nge $current 0 $
1c80: 62 72 65 6c 5d 0a 09 09 73 65 74 20 66 72 61 67  brel]...set frag
1c90: 61 66 74 65 72 20 20 5b 6c 72 61 6e 67 65 20 24  after  [lrange $
1ca0: 63 75 72 72 65 6e 74 20 24 62 6e 65 78 74 20 65  current $bnext e
1cb0: 6e 64 5d 0a 0a 09 09 6c 6f 67 20 77 72 69 74 65  nd]....log write
1cc0: 20 36 20 63 73 65 74 73 20 22 4e 65 77 20 70 69   6 csets "New pi
1cd0: 65 63 65 73 20 20 5b 50 52 20 24 66 72 61 67 62  eces  [PR $fragb
1ce0: 65 66 6f 72 65 5d 20 5b 50 52 20 24 66 72 61 67  efore] [PR $frag
1cf0: 61 66 74 65 72 5d 22 0a 0a 09 09 69 6e 74 65 67  after]"....integ
1d00: 72 69 74 79 20 61 73 73 65 72 74 20 7b 5b 6c 6c  rity assert {[ll
1d10: 65 6e 67 74 68 20 24 66 72 61 67 62 65 66 6f 72  ength $fragbefor
1d20: 65 5d 7d 20 7b 46 6f 75 6e 64 20 7a 65 72 6f 2d  e]} {Found zero-
1d30: 6c 65 6e 67 74 68 20 66 72 61 67 6d 65 6e 74 20  length fragment 
1d40: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
1d50: 7d 0a 09 09 69 6e 74 65 67 72 69 74 79 20 61 73  }...integrity as
1d60: 73 65 72 74 20 7b 5b 6c 6c 65 6e 67 74 68 20 24  sert {[llength $
1d70: 66 72 61 67 61 66 74 65 72 5d 7d 20 20 7b 46 6f  fragafter]}  {Fo
1d80: 75 6e 64 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20  und zero-length 
1d90: 66 72 61 67 6d 65 6e 74 20 61 74 20 74 68 65 20  fragment at the 
1da0: 65 6e 64 7d 0a 0a 09 09 6c 61 70 70 65 6e 64 20  end}....lappend 
1db0: 70 65 6e 64 69 6e 67 20 24 66 72 61 67 62 65 66  pending $fragbef
1dc0: 6f 72 65 20 24 66 72 61 67 61 66 74 65 72 0a 09  ore $fragafter..
1dd0: 09 43 75 74 41 74 20 24 62 65 73 74 0a 09 20 20  .CutAt $best..  
1de0: 20 20 7d 0a 0a 09 20 20 20 20 69 6e 63 72 20 61    }...    incr a
1df0: 74 0a 09 7d 0a 0a 09 6c 6f 67 20 77 72 69 74 65  t..}...log write
1e00: 20 36 20 63 73 65 74 73 20 22 2e 20 2e 20 2e 2e   6 csets ". . ..
1e10: 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e   ... ..... .....
1e20: 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ... ............
1e30: 2e 22 0a 0a 09 23 20 28 2a 29 20 57 65 20 63 6c  ."...# (*) We cl
1e40: 65 61 72 20 6f 75 74 20 74 68 65 20 61 73 73 6f  ear out the asso
1e50: 63 69 61 74 65 64 20 70 61 72 74 20 6f 66 20 74  ciated part of t
1e60: 68 65 20 6d 79 69 74 65 6d 6d 61 70 0a 09 23 20  he myitemmap..# 
1e70: 69 6e 2d 6d 65 6d 6f 72 79 20 69 6e 64 65 78 20  in-memory index 
1e80: 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66  in preparation f
1e90: 6f 72 20 6e 65 77 20 64 61 74 61 2e 20 41 20 73  or new data. A s
1ea0: 69 6d 70 6c 65 20 75 6e 73 65 74 0a 09 23 20 69  imple unset..# i
1eb0: 73 20 65 6e 6f 75 67 68 2c 20 77 65 20 68 61 76  s enough, we hav
1ec0: 65 20 6e 6f 20 73 79 6d 62 6f 6c 20 63 68 61 6e  e no symbol chan
1ed0: 67 65 73 65 74 73 20 61 74 20 74 68 69 73 20 74  gesets at this t
1ee0: 69 6d 65 2c 20 61 6e 64 0a 09 23 20 74 68 75 73  ime, and..# thus
1ef0: 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e   never more than
1f00: 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 69   one reference i
1f10: 6e 20 74 68 65 20 6c 69 73 74 2e 0a 0a 09 66 6f  n the list....fo
1f20: 72 65 61 63 68 20 69 69 64 20 24 6d 79 69 74 65  reach iid $myite
1f30: 6d 73 20 7b 0a 09 20 20 20 20 73 65 74 20 6b 65  ms {..    set ke
1f40: 79 20 5b 6c 69 73 74 20 24 6d 79 74 79 70 65 20  y [list $mytype 
1f50: 24 69 69 64 5d 0a 09 20 20 20 20 75 6e 73 65 74  $iid]..    unset
1f60: 20 6d 79 69 74 65 6d 6d 61 70 28 24 6b 65 79 29   myitemmap($key)
1f70: 0a 09 7d 0a 0a 09 23 20 43 72 65 61 74 65 20 63  ..}...# Create c
1f80: 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20 74 68  hangesets for th
1f90: 65 20 66 72 61 67 6d 65 6e 74 73 2c 20 72 65 75  e fragments, reu
1fa0: 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  sing the current
1fb0: 20 6f 6e 65 0a 09 23 20 66 6f 72 20 74 68 65 20   one..# for the 
1fc0: 66 69 72 73 74 20 66 72 61 67 6d 65 6e 74 2e 20  first fragment. 
1fd0: 57 65 20 73 6f 72 74 20 74 68 65 6d 20 69 6e 20  We sort them in 
1fe0: 6f 72 64 65 72 20 74 6f 20 61 6c 6c 6f 77 0a 09  order to allow..
1ff0: 23 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 67  # checking for g
2000: 61 70 73 20 61 6e 64 20 6e 69 63 65 20 6d 65 73  aps and nice mes
2010: 73 61 67 65 73 2e 0a 0a 09 73 65 74 20 66 72 61  sages....set fra
2020: 67 6d 65 6e 74 73 20 5b 6c 73 6f 72 74 20 2d 69  gments [lsort -i
2030: 6e 64 65 78 20 30 20 2d 69 6e 74 65 67 65 72 20  ndex 0 -integer 
2040: 24 66 72 61 67 6d 65 6e 74 73 5d 0a 0a 09 23 70  $fragments]...#p
2050: 75 74 73 20 5c 74 2e 5b 6a 6f 69 6e 20 5b 50 52  uts \t.[join [PR
2060: 73 20 24 66 72 61 67 6d 65 6e 74 73 5d 20 2e 5c  s $fragments] .\
2070: 6e 5c 74 2e 5d 2e 0a 0a 09 42 6f 72 64 65 72 20  n\t.]....Border 
2080: 5b 6c 69 6e 64 65 78 20 24 66 72 61 67 6d 65 6e  [lindex $fragmen
2090: 74 73 20 30 5d 20 66 69 72 73 74 73 20 66 69 72  ts 0] firsts fir
20a0: 73 74 65 0a 0a 09 69 6e 74 65 67 72 69 74 79 20  ste...integrity 
20b0: 61 73 73 65 72 74 20 7b 24 66 69 72 73 74 73 20  assert {$firsts 
20c0: 3d 3d 20 30 7d 20 7b 42 61 64 20 66 72 61 67 6d  == 0} {Bad fragm
20d0: 65 6e 74 20 73 74 61 72 74 20 40 20 24 66 69 72  ent start @ $fir
20e0: 73 74 73 2c 20 67 61 70 2c 20 6f 72 20 62 65 66  sts, gap, or bef
20f0: 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  ore beginning of
2100: 20 74 68 65 20 72 61 6e 67 65 7d 0a 0a 09 73 65   the range}...se
2110: 74 20 6c 61 73 74 65 20 24 66 69 72 73 74 65 0a  t laste $firste.
2120: 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65 6e  .foreach fragmen
2130: 74 20 5b 6c 72 61 6e 67 65 20 24 66 72 61 67 6d  t [lrange $fragm
2140: 65 6e 74 73 20 31 20 65 6e 64 5d 20 7b 0a 09 20  ents 1 end] {.. 
2150: 20 20 20 42 6f 72 64 65 72 20 24 66 72 61 67 6d     Border $fragm
2160: 65 6e 74 20 73 20 65 0a 09 20 20 20 20 69 6e 74  ent s e..    int
2170: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24  egrity assert {$
2180: 6c 61 73 74 65 20 3d 3d 20 28 24 73 20 2d 20 31  laste == ($s - 1
2190: 29 7d 20 7b 42 61 64 20 66 72 61 67 6d 65 6e 74  )} {Bad fragment
21a0: 20 62 6f 72 64 65 72 20 3c 24 6c 61 73 74 65 20   border <$laste 
21b0: 7c 20 24 73 3e 2c 20 67 61 70 20 6f 72 20 6f 76  | $s>, gap or ov
21c0: 65 72 6c 61 70 7d 0a 0a 09 20 20 20 20 73 65 74  erlap}...    set
21d0: 20 6e 65 77 20 5b 24 74 79 70 65 20 25 41 55 54   new [$type %AUT
21e0: 4f 25 20 24 6d 79 70 72 6f 6a 65 63 74 20 24 6d  O% $myproject $m
21f0: 79 74 79 70 65 20 24 6d 79 73 72 63 69 64 20 5b  ytype $mysrcid [
2200: 6c 72 61 6e 67 65 20 24 6d 79 69 74 65 6d 73 20  lrange $myitems 
2210: 24 73 20 24 65 5d 5d 0a 0a 20 20 20 20 20 20 20  $s $e]]..       
2220: 20 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 34       log write 4
2230: 20 63 73 65 74 73 20 22 42 72 65 61 6b 69 6e 67   csets "Breaking
2240: 20 5b 24 73 65 6c 66 20 73 74 72 20 5d 20 40 20   [$self str ] @ 
2250: 24 6c 61 73 74 65 2c 20 6e 65 77 20 5b 24 6e 65  $laste, new [$ne
2260: 77 20 73 74 72 5d 2c 20 63 75 74 74 69 6e 67 20  w str], cutting 
2270: 24 62 72 65 61 6b 73 28 24 6c 61 73 74 65 29 22  $breaks($laste)"
2280: 0a 0a 09 20 20 20 20 73 65 74 20 6c 61 73 74 65  ...    set laste
2290: 20 24 65 0a 09 7d 0a 0a 09 69 6e 74 65 67 72 69   $e..}...integri
22a0: 74 79 20 61 73 73 65 72 74 20 7b 0a 09 20 20 20  ty assert {..   
22b0: 20 24 6c 61 73 74 65 20 3d 3d 20 28 5b 6c 6c 65   $laste == ([lle
22c0: 6e 67 74 68 20 24 6d 79 69 74 65 6d 73 5d 2d 31  ngth $myitems]-1
22d0: 29 0a 09 7d 20 7b 42 61 64 20 66 72 61 67 6d 65  )..} {Bad fragme
22e0: 6e 74 20 65 6e 64 20 40 20 24 6c 61 73 74 65 2c  nt end @ $laste,
22f0: 20 67 61 70 2c 20 6f 72 20 62 65 79 6f 6e 64 20   gap, or beyond 
2300: 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65  end of the range
2310: 7d 0a 0a 09 23 20 50 75 74 20 74 68 65 20 66 69  }...# Put the fi
2320: 72 73 74 20 66 72 61 67 6d 65 6e 74 20 69 6e 74  rst fragment int
2330: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68  o the current ch
2340: 61 6e 67 65 73 65 74 2c 20 61 6e 64 0a 09 23 20  angeset, and..# 
2350: 75 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  update the in-me
2360: 6d 6f 72 79 20 69 6e 64 65 78 2e 20 57 65 20 63  mory index. We c
2370: 61 6e 20 73 69 6d 70 6c 79 20 28 72 65 29 61 64  an simply (re)ad
2380: 64 20 74 68 65 20 69 74 65 6d 73 0a 09 23 20 62  d the items..# b
2390: 65 63 61 75 73 65 20 77 65 20 63 6c 65 61 72 65  ecause we cleare
23a0: 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  d the previously
23b0: 20 65 78 69 73 74 69 6e 67 20 69 6e 66 6f 72 6d   existing inform
23c0: 61 74 69 6f 6e 2c 20 73 65 65 0a 09 23 20 28 2a  ation, see..# (*
23d0: 29 20 61 62 6f 76 65 2e 20 50 65 72 73 69 73 74  ) above. Persist
23e0: 65 6e 63 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ence does not ma
23f0: 74 74 65 72 20 68 65 72 65 2c 20 6e 6f 6e 65 20  tter here, none 
2400: 6f 66 20 74 68 65 0a 09 23 20 63 68 61 6e 67 65  of the..# change
2410: 73 65 74 73 20 68 61 73 20 62 65 65 6e 20 73 61  sets has been sa
2420: 76 65 64 20 74 6f 20 74 68 65 20 70 65 72 73 69  ved to the persi
2430: 73 74 65 6e 74 20 73 74 61 74 65 20 79 65 74 2e  stent state yet.
2440: 0a 0a 09 73 65 74 20 6d 79 69 74 65 6d 73 20 5b  ...set myitems [
2450: 6c 72 61 6e 67 65 20 24 6d 79 69 74 65 6d 73 20  lrange $myitems 
2460: 30 20 24 66 69 72 73 74 65 5d 0a 09 66 6f 72 65  0 $firste]..fore
2470: 61 63 68 20 69 69 64 20 24 6d 79 69 74 65 6d 73  ach iid $myitems
2480: 20 7b 0a 09 20 20 20 20 73 65 74 20 6b 65 79 20   {..    set key 
2490: 5b 6c 69 73 74 20 24 6d 79 74 79 70 65 20 24 69  [list $mytype $i
24a0: 69 64 5d 0a 09 20 20 20 20 73 65 74 20 6d 79 69  id]..    set myi
24b0: 74 65 6d 6d 61 70 28 24 6b 65 79 29 20 24 73 65  temmap($key) $se
24c0: 6c 66 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 20 31  lf..}...return 1
24d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68  .    }..    meth
24e0: 6f 64 20 70 65 72 73 69 73 74 20 7b 7d 20 7b 0a  od persist {} {.
24f0: 09 73 65 74 20 74 69 64 20 24 6d 79 63 73 74 79  .set tid $mycsty
2500: 70 65 28 24 6d 79 74 79 70 65 29 0a 09 73 65 74  pe($mytype)..set
2510: 20 70 69 64 20 5b 24 6d 79 70 72 6f 6a 65 63 74   pid [$myproject
2520: 20 69 64 5d 0a 09 73 65 74 20 70 6f 73 20 30 0a   id]..set pos 0.
2530: 0a 09 73 74 61 74 65 20 74 72 61 6e 73 61 63 74  ..state transact
2540: 69 6f 6e 20 7b 0a 09 20 20 20 20 73 74 61 74 65  ion {..    state
2550: 20 72 75 6e 20 7b 0a 09 09 49 4e 53 45 52 54 20   run {...INSERT 
2560: 49 4e 54 4f 20 63 68 61 6e 67 65 73 65 74 20 28  INTO changeset (
2570: 63 69 64 2c 20 20 20 70 69 64 2c 20 20 74 79 70  cid,   pid,  typ
2580: 65 2c 20 73 72 63 29 0a 09 09 56 41 4c 55 45 53  e, src)...VALUES
2590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
25a0: 28 24 6d 79 69 64 2c 20 24 70 69 64 2c 20 24 74  ($myid, $pid, $t
25b0: 69 64 2c 20 24 6d 79 73 72 63 69 64 29 3b 0a 09  id, $mysrcid);..
25c0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 66 6f 72 65      }...    fore
25d0: 61 63 68 20 69 69 64 20 24 6d 79 69 74 65 6d 73  ach iid $myitems
25e0: 20 7b 0a 09 09 73 74 61 74 65 20 72 75 6e 20 7b   {...state run {
25f0: 0a 09 09 20 20 20 20 49 4e 53 45 52 54 20 49 4e  ...    INSERT IN
2600: 54 4f 20 63 73 72 65 76 69 73 69 6f 6e 20 28 63  TO csrevision (c
2610: 69 64 2c 20 20 20 70 6f 73 2c 20 20 72 69 64 29  id,   pos,  rid)
2620: 0a 09 09 20 20 20 20 56 41 4c 55 45 53 20 20 20  ...    VALUES   
2630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 24                ($
2640: 6d 79 69 64 2c 20 24 70 6f 73 2c 20 24 69 69 64  myid, $pos, $iid
2650: 29 3b 0a 09 09 7d 0a 09 09 69 6e 63 72 20 70 6f  );...}...incr po
2660: 73 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72 65 74  s..    }..}..ret
2670: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d  urn.    }..    m
2680: 65 74 68 6f 64 20 74 69 6d 65 72 61 6e 67 65 20  ethod timerange 
2690: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 5b 24 6d 79  {} { return [$my
26a0: 74 79 70 65 6f 62 6a 20 74 69 6d 65 72 61 6e 67  typeobj timerang
26b0: 65 20 24 6d 79 69 74 65 6d 73 5d 20 7d 0a 0a 20  e $myitems] }.. 
26c0: 20 20 20 6d 65 74 68 6f 64 20 64 72 6f 70 20 7b     method drop {
26d0: 7d 20 7b 0a 09 73 74 61 74 65 20 74 72 61 6e 73  } {..state trans
26e0: 61 63 74 69 6f 6e 20 7b 0a 09 20 20 20 20 73 74  action {..    st
26f0: 61 74 65 20 72 75 6e 20 7b 0a 09 09 44 45 4c 45  ate run {...DELE
2700: 54 45 20 46 52 4f 4d 20 63 68 61 6e 67 65 73 65  TE FROM changese
2710: 74 20 20 57 48 45 52 45 20 63 69 64 20 3d 20 24  t  WHERE cid = $
2720: 6d 79 69 64 3b 0a 09 09 44 45 4c 45 54 45 20 46  myid;...DELETE F
2730: 52 4f 4d 20 63 73 72 65 76 69 73 69 6f 6e 20 57  ROM csrevision W
2740: 48 45 52 45 20 63 69 64 20 3d 20 24 6d 79 69 64  HERE cid = $myid
2750: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 66 6f 72  ;..    }..}..for
2760: 65 61 63 68 20 69 69 64 20 24 6d 79 69 74 65 6d  each iid $myitem
2770: 73 20 7b 0a 09 20 20 20 20 73 65 74 20 6b 65 79  s {..    set key
2780: 20 5b 6c 69 73 74 20 24 6d 79 74 79 70 65 20 24   [list $mytype $
2790: 69 69 64 5d 0a 09 20 20 20 20 75 6e 73 65 74 20  iid]..    unset 
27a0: 6d 79 69 74 65 6d 6d 61 70 28 24 6b 65 79 29 0a  myitemmap($key).
27b0: 09 7d 0a 09 73 65 74 20 70 6f 73 20 20 20 20 20  .}..set pos     
27c0: 20 20 20 20 20 5b 6c 73 65 61 72 63 68 20 2d 65       [lsearch -e
27d0: 78 61 63 74 20 24 6d 79 63 68 61 6e 67 65 73 65  xact $mychangese
27e0: 74 73 20 24 73 65 6c 66 5d 0a 09 73 65 74 20 6d  ts $self]..set m
27f0: 79 63 68 61 6e 67 65 73 65 74 73 20 5b 6c 72 65  ychangesets [lre
2800: 70 6c 61 63 65 20 24 6d 79 63 68 61 6e 67 65 73  place $mychanges
2810: 65 74 73 20 24 70 6f 73 20 24 70 6f 73 5d 0a 09  ets $pos $pos]..
2820: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20  return.    }..  
2830: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 73 70 6c    typemethod spl
2840: 69 74 20 7b 63 73 65 74 20 61 72 67 73 7d 20 7b  it {cset args} {
2850: 0a 09 23 20 41 73 20 70 61 72 74 20 6f 66 20 74  ..# As part of t
2860: 68 65 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74  he creation of t
2870: 68 65 20 6e 65 77 20 63 68 61 6e 67 65 73 65 74  he new changeset
2880: 73 20 73 70 65 63 69 66 69 65 64 20 69 6e 0a 09  s specified in..
2890: 23 20 41 52 47 53 20 61 73 20 73 65 74 73 20 6f  # ARGS as sets o
28a0: 66 20 69 74 65 6d 73 2c 20 61 6c 6c 20 73 75 62  f items, all sub
28b0: 73 65 74 73 20 6f 66 20 43 53 45 54 27 73 20 69  sets of CSET's i
28c0: 74 65 6d 20 73 65 74 2c 20 43 53 45 54 0a 09 23  tem set, CSET..#
28d0: 20 77 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64   will be dropped
28e0: 20 66 72 6f 6d 20 61 6c 6c 20 64 61 74 61 62 61   from all databa
28f0: 73 65 73 2c 20 69 6e 20 61 6e 64 20 6f 75 74 20  ses, in and out 
2900: 6f 66 20 6d 65 6d 6f 72 79 2c 0a 09 23 20 61 6e  of memory,..# an
2910: 64 20 74 68 65 6e 20 64 65 73 74 72 6f 79 65 64  d then destroyed
2920: 2e 0a 09 23 0a 09 23 20 4e 6f 74 65 3a 20 54 68  ...#..# Note: Th
2930: 65 20 69 74 65 6d 20 6c 69 73 74 73 20 66 6f 75  e item lists fou
2940: 6e 64 20 69 6e 20 61 72 67 73 20 61 72 65 20 74  nd in args are t
2950: 61 67 67 65 64 20 69 74 65 6d 73 2e 20 54 68 65  agged items. The
2960: 79 0a 09 23 20 68 61 76 65 20 74 6f 20 68 61 76  y..# have to hav
2970: 65 20 74 68 65 20 73 61 6d 65 20 74 79 70 65 20  e the same type 
2980: 61 73 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  as the changeset
2990: 2c 20 62 65 69 6e 67 20 73 75 62 73 65 74 73 0a  , being subsets.
29a0: 09 23 20 6f 66 20 69 74 73 20 69 74 65 6d 73 2e  .# of its items.
29b0: 20 54 68 69 73 20 69 73 20 63 68 65 63 6b 65 64   This is checked
29c0: 20 69 6e 20 55 6e 74 61 67 31 2e 0a 0a 09 73 74   in Untag1....st
29d0: 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67  ruct::list assig
29e0: 6e 20 5b 24 63 73 65 74 20 64 61 74 61 5d 20 70  n [$cset data] p
29f0: 72 6f 6a 65 63 74 20 63 73 74 79 70 65 20 63 73  roject cstype cs
2a00: 73 72 63 0a 0a 09 24 63 73 65 74 20 64 72 6f 70  src...$cset drop
2a10: 0a 09 24 63 73 65 74 20 64 65 73 74 72 6f 79 0a  ..$cset destroy.
2a20: 0a 09 73 65 74 20 6e 65 77 63 73 65 74 73 20 7b  ..set newcsets {
2a30: 7d 0a 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d  }..foreach fragm
2a40: 65 6e 74 69 74 65 6d 73 20 24 61 72 67 73 20 7b  entitems $args {
2a50: 0a 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 20  ..    integrity 
2a60: 61 73 73 65 72 74 20 7b 0a 09 09 5b 6c 6c 65 6e  assert {...[llen
2a70: 67 74 68 20 24 66 72 61 67 6d 65 6e 74 69 74 65  gth $fragmentite
2a80: 6d 73 5d 0a 09 20 20 20 20 7d 20 7b 41 74 74 65  ms]..    } {Atte
2a90: 6d 70 74 65 64 20 74 6f 20 63 72 65 61 74 65 20  mpted to create 
2aa0: 61 6e 20 65 6d 70 74 79 20 63 68 61 6e 67 65 73  an empty changes
2ab0: 65 74 2c 20 69 2e 65 2e 20 77 69 74 68 6f 75 74  et, i.e. without
2ac0: 20 69 74 65 6d 73 7d 0a 09 20 20 20 20 6c 61 70   items}..    lap
2ad0: 70 65 6e 64 20 6e 65 77 63 73 65 74 73 20 5b 24  pend newcsets [$
2ae0: 74 79 70 65 20 25 41 55 54 4f 25 20 24 70 72 6f  type %AUTO% $pro
2af0: 6a 65 63 74 20 24 63 73 74 79 70 65 20 24 63 73  ject $cstype $cs
2b00: 73 72 63 20 5c 0a 09 09 09 09 20 20 5b 55 6e 74  src \.....  [Unt
2b10: 61 67 20 24 66 72 61 67 6d 65 6e 74 69 74 65 6d  ag $fragmentitem
2b20: 73 20 24 63 73 74 79 70 65 5d 5d 0a 09 7d 0a 0a  s $cstype]]..}..
2b30: 09 66 6f 72 65 61 63 68 20 63 20 24 6e 65 77 63  .foreach c $newc
2b40: 73 65 74 73 20 7b 20 24 63 20 70 65 72 73 69 73  sets { $c persis
2b50: 74 20 7d 0a 09 72 65 74 75 72 6e 20 24 6e 65 77  t }..return $new
2b60: 63 73 65 74 73 0a 20 20 20 20 7d 0a 0a 20 20 20  csets.    }..   
2b70: 20 74 79 70 65 6d 65 74 68 6f 64 20 73 74 72 6c   typemethod strl
2b80: 69 73 74 20 7b 63 68 61 6e 67 65 73 65 74 73 7d  ist {changesets}
2b90: 20 7b 0a 09 72 65 74 75 72 6e 20 5b 6a 6f 69 6e   {..return [join
2ba0: 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d   [struct::list m
2bb0: 61 70 20 24 63 68 61 6e 67 65 73 65 74 73 20 5b  ap $changesets [
2bc0: 6d 79 70 72 6f 63 20 49 44 5d 5d 5d 0a 20 20 20  myproc ID]]].   
2bd0: 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 49 44 20   }..    proc ID 
2be0: 7b 63 73 65 74 7d 20 7b 20 24 63 73 65 74 20 73  {cset} { $cset s
2bf0: 74 72 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 55  tr }..    proc U
2c00: 6e 74 61 67 20 7b 74 61 67 67 65 64 69 74 65 6d  ntag {taggeditem
2c10: 73 20 63 73 74 79 70 65 7d 20 7b 0a 09 72 65 74  s cstype} {..ret
2c20: 75 72 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73  urn [struct::lis
2c30: 74 20 6d 61 70 20 24 74 61 67 67 65 64 69 74 65  t map $taggedite
2c40: 6d 73 20 5b 6d 79 70 72 6f 63 20 55 6e 74 61 67  ms [myproc Untag
2c50: 31 20 24 63 73 74 79 70 65 5d 5d 0a 20 20 20 20  1 $cstype]].    
2c60: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 55 6e 74 61  }..    proc Unta
2c70: 67 31 20 7b 63 73 74 79 70 65 20 74 68 65 69 74  g1 {cstype theit
2c80: 65 6d 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c  em} {..struct::l
2c90: 69 73 74 20 61 73 73 69 67 6e 20 24 74 68 65 69  ist assign $thei
2ca0: 74 65 6d 20 74 20 69 0a 09 69 6e 74 65 67 72 69  tem t i..integri
2cb0: 74 79 20 61 73 73 65 72 74 20 7b 24 63 73 74 79  ty assert {$csty
2cc0: 70 65 20 65 71 20 24 74 7d 20 7b 49 74 65 6d 20  pe eq $t} {Item 
2cd0: 24 69 27 73 20 74 79 70 65 20 69 73 20 27 24 74  $i's type is '$t
2ce0: 27 2c 20 65 78 70 65 63 74 65 64 20 27 24 63 73  ', expected '$cs
2cf0: 74 79 70 65 27 7d 0a 09 72 65 74 75 72 6e 20 24  type'}..return $
2d00: 69 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23  i.    }..    # #
2d10: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23   ## ### ##### ##
2d20: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
2d30: 23 23 23 23 0a 20 20 20 20 23 23 20 53 74 61 74  ####.    ## Stat
2d40: 65 0a 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20  e..    variable 
2d50: 6d 79 69 64 20 20 20 20 20 20 20 20 7b 7d 20 3b  myid        {} ;
2d60: 20 23 20 49 64 20 6f 66 20 74 68 65 20 63 73 65   # Id of the cse
2d70: 74 20 66 6f 72 20 74 68 65 20 70 65 72 73 69 73  t for the persis
2d80: 74 65 6e 74 0a 09 09 09 20 20 20 20 20 20 23 20  tent....      # 
2d90: 73 74 61 74 65 2e 0a 20 20 20 20 76 61 72 69 61  state..    varia
2da0: 62 6c 65 20 6d 79 70 72 6f 6a 65 63 74 20 20 20  ble myproject   
2db0: 7b 7d 20 3b 20 23 20 52 65 66 65 72 65 6e 63 65  {} ; # Reference
2dc0: 20 6f 66 20 74 68 65 20 70 72 6f 6a 65 63 74 20   of the project 
2dd0: 6f 62 6a 65 63 74 20 74 68 65 0a 09 09 09 20 20  object the....  
2de0: 20 20 20 20 23 20 63 68 61 6e 67 65 73 65 74 20      # changeset 
2df0: 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 20 20 20 20  belongs to..    
2e00: 76 61 72 69 61 62 6c 65 20 6d 79 74 79 70 65 20  variable mytype 
2e10: 20 20 20 20 20 7b 7d 20 3b 20 23 20 57 68 61 74       {} ; # What
2e20: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 69   the changeset i
2e30: 73 20 62 61 73 65 64 20 6f 6e 0a 09 09 09 20 20  s based on....  
2e40: 20 20 20 20 23 20 28 72 65 76 69 73 69 6f 6e 73      # (revisions
2e50: 2c 20 74 61 67 73 2c 20 6f 72 20 62 72 61 6e 63  , tags, or branc
2e60: 68 65 73 29 2e 0a 09 09 09 20 20 20 20 20 20 23  hes).....      #
2e70: 20 56 61 6c 75 65 73 3a 20 53 65 65 20 6d 79 63   Values: See myc
2e80: 73 74 79 70 65 2e 20 4e 6f 74 65 20 74 68 61 74  stype. Note that
2e90: 20 77 65 0a 09 09 09 20 20 20 20 20 20 23 20 68   we....      # h
2ea0: 61 76 65 20 74 6f 20 6b 65 65 70 20 74 68 65 20  ave to keep the 
2eb0: 6e 61 6d 65 73 20 6f 66 20 74 68 65 20 68 65 6c  names of the hel
2ec0: 70 65 72 0a 09 09 09 20 20 20 20 20 20 23 20 73  per....      # s
2ed0: 69 6e 67 6c 65 74 6f 6e 73 20 69 6e 20 73 79 6e  ingletons in syn
2ee0: 63 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65  c with the conte
2ef0: 6e 74 73 0a 09 09 09 20 20 20 20 20 20 23 20 6f  nts....      # o
2f00: 66 20 73 74 61 74 65 20 74 61 62 6c 65 20 27 63  f state table 'c
2f10: 73 74 79 70 65 27 2c 20 61 6e 64 20 76 61 72 69  stype', and vari
2f20: 6f 75 73 0a 09 09 09 20 20 20 20 20 20 23 20 6f  ous....      # o
2f30: 74 68 65 72 20 70 6c 61 63 65 73 20 75 73 69 6e  ther places usin
2f40: 67 20 74 68 65 6d 20 68 61 72 64 77 69 72 65 64  g them hardwired
2f50: 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d  ..    variable m
2f60: 79 74 79 70 65 6f 62 6a 20 20 20 7b 7d 20 3b 20  ytypeobj   {} ; 
2f70: 23 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 74  # Reference to t
2f80: 68 65 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72  he container for
2f90: 20 74 68 65 0a 09 09 09 20 20 20 20 20 20 23 20   the....      # 
2fa0: 74 79 70 65 20 64 65 70 65 6e 64 65 6e 74 20 63  type dependent c
2fb0: 6f 64 65 2e 20 44 65 72 69 76 65 64 20 66 72 6f  ode. Derived fro
2fc0: 6d 0a 09 09 09 20 20 20 20 20 20 23 20 6d 79 74  m....      # myt
2fd0: 79 70 65 2e 0a 20 20 20 20 76 61 72 69 61 62 6c  ype..    variabl
2fe0: 65 20 6d 79 73 72 63 69 64 20 20 20 20 20 7b 7d  e mysrcid     {}
2ff0: 20 3b 20 23 20 49 64 20 6f 66 20 74 68 65 20 6d   ; # Id of the m
3000: 65 74 61 64 61 74 61 20 6f 72 20 73 79 6d 62 6f  etadata or symbo
3010: 6c 20 74 68 65 20 63 73 65 74 0a 09 09 09 20 20  l the cset....  
3020: 20 20 20 20 23 20 69 73 20 62 61 73 65 64 20 6f      # is based o
3030: 6e 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20  n..    variable 
3040: 6d 79 69 74 65 6d 73 20 20 20 20 20 7b 7d 20 3b  myitems     {} ;
3050: 20 23 20 4c 69 73 74 20 6f 66 20 74 68 65 20 66   # List of the f
3060: 69 6c 65 20 6c 65 76 65 6c 20 72 65 76 69 73 69  ile level revisi
3070: 6f 6e 73 2c 0a 09 09 09 20 20 20 20 20 20 23 20  ons,....      # 
3080: 74 61 67 73 2c 20 6f 72 20 62 72 61 6e 63 68 65  tags, or branche
3090: 73 20 69 6e 20 74 68 65 20 63 73 65 74 2c 20 61  s in the cset, a
30a0: 73 0a 09 09 09 20 20 20 20 20 20 23 20 69 64 73  s....      # ids
30b0: 2e 20 4e 6f 74 20 74 61 67 67 65 64 2e 0a 20 20  . Not tagged..  
30c0: 20 20 76 61 72 69 61 62 6c 65 20 6d 79 74 69 74    variable mytit
30d0: 65 6d 73 20 20 20 20 7b 7d 20 3b 20 23 20 41 73  ems    {} ; # As
30e0: 20 6d 79 69 74 65 6d 73 2c 20 74 68 65 20 74 61   myitems, the ta
30f0: 67 67 65 64 20 66 6f 72 6d 2e 0a 20 20 20 20 76  gged form..    v
3100: 61 72 69 61 62 6c 65 20 6d 79 70 72 65 6d 61 70  ariable mypremap
3110: 20 20 20 20 7b 7d 20 3b 20 23 20 44 69 63 74 69      {} ; # Dicti
3120: 6f 6e 61 72 79 20 6d 61 70 70 69 6e 67 20 66 72  onary mapping fr
3130: 6f 6d 20 74 68 65 20 69 74 65 6d 73 20 28 74 61  om the items (ta
3140: 67 67 65 64 20 6e 6f 77 29 0a 09 09 09 20 20 20  gged now)....   
3150: 20 20 20 23 20 74 6f 20 74 68 65 69 72 20 70 72     # to their pr
3160: 65 64 65 63 65 73 73 6f 72 73 2c 20 61 6c 73 6f  edecessors, also
3170: 20 74 61 67 67 65 64 2e 20 41 0a 09 09 09 20 20   tagged. A....  
3180: 20 20 20 20 23 20 63 61 63 68 65 20 74 6f 20 61      # cache to a
3190: 76 6f 69 64 20 6c 6f 61 64 69 6e 67 20 74 68 69  void loading thi
31a0: 73 20 66 72 6f 6d 20 74 68 65 0a 09 09 09 20 20  s from the....  
31b0: 20 20 20 20 23 20 73 74 61 74 65 20 6d 6f 72 65      # state more
31c0: 20 74 68 61 6e 20 6f 6e 63 65 2e 0a 20 20 20 20   than once..    
31d0: 76 61 72 69 61 62 6c 65 20 6d 79 6e 65 78 74 6d  variable mynextm
31e0: 61 70 20 20 20 7b 7d 20 3b 20 23 20 44 69 63 74  ap   {} ; # Dict
31f0: 69 6f 6e 61 72 79 20 6d 61 70 70 69 6e 67 20 66  ionary mapping f
3200: 72 6f 6d 20 74 68 65 20 69 74 65 6d 73 20 28 74  rom the items (t
3210: 61 67 67 65 64 29 0a 09 09 09 20 20 20 20 20 20  agged)....      
3220: 23 20 74 6f 20 74 68 65 69 72 20 73 75 63 63 65  # to their succe
3230: 73 73 6f 72 73 20 28 61 6c 73 6f 20 74 61 67 67  ssors (also tagg
3240: 65 64 29 2e 20 41 0a 09 09 09 20 20 20 20 20 20  ed). A....      
3250: 23 20 63 61 63 68 65 20 74 6f 20 61 76 6f 69 64  # cache to avoid
3260: 20 6c 6f 61 64 69 6e 67 20 74 68 69 73 20 66 72   loading this fr
3270: 6f 6d 20 74 68 65 0a 09 09 09 20 20 20 20 20 20  om the....      
3280: 23 20 73 74 61 74 65 20 6d 6f 72 65 20 74 68 61  # state more tha
3290: 6e 20 6f 6e 63 65 2e 0a 20 20 20 20 76 61 72 69  n once..    vari
32a0: 61 62 6c 65 20 6d 79 70 6f 73 20 20 20 20 20 20  able mypos      
32b0: 20 7b 7d 20 3b 20 23 20 43 6f 6d 6d 69 74 20 70   {} ; # Commit p
32c0: 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  osition of the c
32d0: 68 61 6e 67 65 73 65 74 2c 20 69 66 0a 09 09 09  hangeset, if....
32e0: 20 20 20 20 20 20 23 20 6b 6e 6f 77 6e 2e 0a 0a        # known...
32f0: 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23      # # ## ### #
3300: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23  #### ######## ##
3310: 23 23 23 23 23 23 23 23 23 23 23 0a 20 20 20 20  ###########.    
3320: 23 23 20 49 6e 74 65 72 6e 61 6c 20 6d 65 74 68  ## Internal meth
3330: 6f 64 73 0a 0a 20 20 20 20 74 79 70 65 76 61 72  ods..    typevar
3340: 69 61 62 6c 65 20 6d 79 63 6f 75 6e 74 65 72 20  iable mycounter 
3350: 20 20 20 20 20 20 20 30 20 3b 20 23 20 49 64 20         0 ; # Id 
3360: 63 6f 75 6e 74 65 72 20 66 6f 72 20 63 73 65 74  counter for cset
3370: 73 2e 20 4c 61 73 74 20 69 64 0a 09 09 09 09 20  s. Last id..... 
3380: 20 20 20 20 20 23 20 75 73 65 64 2e 0a 20 20 20       # used..   
3390: 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79   typevariable my
33a0: 63 73 74 79 70 65 20 2d 61 72 72 61 79 20 7b 7d  cstype -array {}
33b0: 20 3b 20 23 20 4d 61 70 20 63 73 74 79 70 65 73   ; # Map cstypes
33c0: 20 28 6e 61 6d 65 73 29 20 74 6f 20 70 65 72 73   (names) to pers
33d0: 69 73 74 65 6e 74 0a 09 09 09 09 20 20 20 20 20  istent.....     
33e0: 20 23 20 69 64 73 2e 20 4e 6f 74 65 20 74 68 61   # ids. Note tha
33f0: 74 20 77 65 20 68 61 76 65 20 74 6f 20 6b 65 65  t we have to kee
3400: 70 0a 09 09 09 09 20 20 20 20 20 20 23 20 74 68  p.....      # th
3410: 65 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 74  e names in the t
3420: 61 62 6c 65 20 27 63 73 74 79 70 65 27 0a 09 09  able 'cstype'...
3430: 09 09 20 20 20 20 20 20 23 20 69 6e 20 73 79 6e  ..      # in syn
3440: 63 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73  c with the names
3450: 20 6f 66 20 74 68 65 0a 09 09 09 09 20 20 20 20   of the.....    
3460: 20 20 23 20 68 65 6c 70 65 72 20 73 69 6e 67 6c    # helper singl
3470: 65 74 6f 6e 73 2e 0a 0a 20 20 20 20 74 79 70 65  etons...    type
3480: 6d 65 74 68 6f 64 20 67 65 74 63 73 74 79 70 65  method getcstype
3490: 73 20 7b 7d 20 7b 0a 09 66 6f 72 65 61 63 68 20  s {} {..foreach 
34a0: 7b 74 69 64 20 6e 61 6d 65 7d 20 5b 73 74 61 74  {tid name} [stat
34b0: 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c  e run {..    SEL
34c0: 45 43 54 20 74 69 64 2c 20 6e 61 6d 65 20 46 52  ECT tid, name FR
34d0: 4f 4d 20 63 73 74 79 70 65 3b 0a 09 7d 5d 20 7b  OM cstype;..}] {
34e0: 20 73 65 74 20 6d 79 63 73 74 79 70 65 28 24 6e   set mycstype($n
34f0: 61 6d 65 29 20 24 74 69 64 20 7d 0a 09 72 65 74  ame) $tid }..ret
3500: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  urn.    }..    t
3510: 79 70 65 6d 65 74 68 6f 64 20 6c 6f 61 64 63 6f  ypemethod loadco
3520: 75 6e 74 65 72 20 7b 7d 20 7b 0a 09 23 20 49 6e  unter {} {..# In
3530: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 75  itialize the cou
3540: 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 74  nter from the st
3550: 61 74 65 0a 09 73 65 74 20 6d 79 63 6f 75 6e 74  ate..set mycount
3560: 65 72 20 5b 73 74 61 74 65 20 6f 6e 65 20 7b 20  er [state one { 
3570: 53 45 4c 45 43 54 20 4d 41 58 28 63 69 64 29 20  SELECT MAX(cid) 
3580: 46 52 4f 4d 20 63 68 61 6e 67 65 73 65 74 20 7d  FROM changeset }
3590: 5d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  ]..return.    }.
35a0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
35b0: 6e 75 6d 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20  num {} { return 
35c0: 24 6d 79 63 6f 75 6e 74 65 72 20 7d 0a 0a 20 20  $mycounter }..  
35d0: 20 20 70 72 6f 63 20 49 6e 69 74 69 61 6c 69 7a    proc Initializ
35e0: 65 42 72 65 61 6b 53 74 61 74 65 20 7b 72 65 76  eBreakState {rev
35f0: 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72  isions} {..upvar
3600: 20 31 20 70 6f 73 20 70 6f 73 20 63 72 6f 73 73   1 pos pos cross
3610: 20 63 72 6f 73 73 20 72 61 6e 67 65 20 72 61 6e   cross range ran
3620: 67 65 20 64 65 70 63 20 64 65 70 63 20 64 65 6c  ge depc depc del
3630: 74 61 20 64 65 6c 74 61 20 5c 0a 09 20 20 20 20  ta delta \..    
3640: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 64 65 70  dependencies dep
3650: 65 6e 64 65 6e 63 69 65 73 0a 0a 09 23 20 46 69  endencies...# Fi
3660: 72 73 74 20 77 65 20 63 72 65 61 74 65 20 61 20  rst we create a 
3670: 6d 61 70 20 6f 66 20 70 6f 73 69 74 69 6f 6e 73  map of positions
3680: 20 74 6f 20 6d 61 6b 65 20 69 74 20 65 61 73 69   to make it easi
3690: 65 72 20 74 6f 0a 09 23 20 64 65 74 65 72 6d 69  er to..# determi
36a0: 6e 65 20 77 68 65 74 68 65 72 20 61 20 64 65 70  ne whether a dep
36b0: 65 6e 64 65 6e 63 79 20 63 72 6f 73 73 65 73 20  endency crosses 
36c0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
36d0: 65 78 2e 0a 0a 09 61 72 72 61 79 20 73 65 74 20  ex....array set 
36e0: 70 6f 73 20 20 20 7b 7d 0a 09 61 72 72 61 79 20  pos   {}..array 
36f0: 73 65 74 20 63 72 6f 73 73 20 7b 7d 0a 09 61 72  set cross {}..ar
3700: 72 61 79 20 73 65 74 20 64 65 70 63 20 20 7b 7d  ray set depc  {}
3710: 0a 09 73 65 74 20 72 61 6e 67 65 20 20 20 20 20  ..set range     
3720: 20 20 7b 7d 0a 09 73 65 74 20 6e 20 30 0a 09 66    {}..set n 0..f
3730: 6f 72 65 61 63 68 20 72 65 76 20 24 72 65 76 69  oreach rev $revi
3740: 73 69 6f 6e 73 20 7b 0a 09 20 20 20 20 6c 61 70  sions {..    lap
3750: 70 65 6e 64 20 72 61 6e 67 65 20 24 6e 0a 09 20  pend range $n.. 
3760: 20 20 20 73 65 74 20 70 6f 73 28 24 72 65 76 29     set pos($rev)
3770: 20 24 6e 0a 09 20 20 20 20 73 65 74 20 63 72 6f   $n..    set cro
3780: 73 73 28 24 6e 29 20 30 0a 09 20 20 20 20 69 6e  ss($n) 0..    in
3790: 63 72 20 6e 0a 09 7d 0a 0a 09 23 20 53 65 63 6f  cr n..}...# Seco
37a0: 6e 64 6c 79 20 77 65 20 63 6f 75 6e 74 20 74 68  ndly we count th
37b0: 65 20 63 72 6f 73 73 69 6e 67 73 20 70 65 72 20  e crossings per 
37c0: 70 6f 73 69 74 69 6f 6e 2c 20 62 79 20 69 74 65  position, by ite
37d0: 72 61 74 69 6e 67 0a 09 23 20 6f 76 65 72 20 74  rating..# over t
37e0: 68 65 20 72 65 63 6f 72 64 65 64 20 69 6e 74 65  he recorded inte
37f0: 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65  rnal dependencie
3800: 73 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 49 66 20  s....# Note: If 
3810: 74 68 65 20 74 69 6d 65 73 74 61 6d 70 73 20 61  the timestamps a
3820: 72 65 20 62 61 64 6c 79 20 6f 75 74 20 6f 66 20  re badly out of 
3830: 6f 72 64 65 72 20 69 74 20 69 73 0a 09 23 20 20  order it is..#  
3840: 20 20 20 20 20 70 6f 73 73 69 62 6c 65 20 74 6f       possible to
3850: 20 68 61 76 65 20 61 20 62 61 63 6b 77 61 72 64   have a backward
3860: 20 73 75 63 63 65 73 73 6f 72 20 64 65 70 65 6e   successor depen
3870: 64 65 6e 63 79 2c 0a 09 23 20 20 20 20 20 20 20  dency,..#       
3880: 69 2e 65 2e 20 77 69 74 68 20 73 74 61 72 74 20  i.e. with start 
3890: 3e 20 65 6e 64 2e 20 57 65 20 6d 61 79 20 68 61  > end. We may ha
38a0: 76 65 20 74 6f 20 73 77 61 70 20 74 68 65 20 69  ve to swap the i
38b0: 6e 64 69 63 65 73 0a 09 23 20 20 20 20 20 20 20  ndices..#       
38c0: 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74  to ensure that t
38d0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f  he following loo
38e0: 70 20 72 75 6e 73 20 63 6f 72 72 65 63 74 6c 79  p runs correctly
38f0: 2e 0a 09 23 0a 09 23 20 4e 6f 74 65 20 32 3a 20  ...#..# Note 2: 
3900: 73 74 61 72 74 20 3d 3d 20 65 6e 64 20 69 73 20  start == end is 
3910: 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 49 74  not possible. It
3920: 20 69 6e 64 69 63 61 74 65 73 20 61 0a 09 23 20   indicates a..# 
3930: 20 20 20 20 20 20 20 20 73 65 6c 66 2d 64 65 70          self-dep
3940: 65 6e 64 65 6e 63 79 20 64 75 65 20 74 6f 20 74  endency due to t
3950: 68 65 20 75 6e 69 71 75 65 6e 65 73 73 20 6f 66  he uniqueness of
3960: 20 70 6f 73 69 74 69 6f 6e 73 2c 0a 09 23 20 20   positions,..#  
3970: 20 20 20 20 20 20 20 61 6e 64 20 74 68 61 74 20         and that 
3980: 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 20  is something we 
3990: 68 61 76 65 20 72 75 6c 65 64 20 6f 75 74 20 61  have ruled out a
39a0: 6c 72 65 61 64 79 2c 20 73 65 65 0a 09 23 20 20  lready, see..#  
39b0: 20 20 20 20 20 20 20 27 72 65 76 20 69 6e 74 65         'rev inte
39c0: 72 6e 61 6c 73 75 63 63 65 73 73 6f 72 73 27 2e  rnalsuccessors'.
39d0: 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20  ...foreach {rid 
39e0: 63 68 69 6c 64 72 65 6e 7d 20 5b 61 72 72 61 79  children} [array
39f0: 20 67 65 74 20 64 65 70 65 6e 64 65 6e 63 69 65   get dependencie
3a00: 73 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 63  s] {..    foreac
3a10: 68 20 63 68 69 6c 64 20 24 63 68 69 6c 64 72 65  h child $childre
3a20: 6e 20 7b 0a 09 09 73 65 74 20 64 6b 65 79 20 20  n {...set dkey  
3a30: 20 20 5b 6c 69 73 74 20 24 72 69 64 20 24 63 68    [list $rid $ch
3a40: 69 6c 64 5d 0a 09 09 73 65 74 20 73 74 61 72 74  ild]...set start
3a50: 20 20 20 24 70 6f 73 28 24 72 69 64 29 0a 09 09     $pos($rid)...
3a60: 73 65 74 20 65 6e 64 20 20 20 20 20 24 70 6f 73  set end     $pos
3a70: 28 24 63 68 69 6c 64 29 0a 09 09 73 65 74 20 63  ($child)...set c
3a80: 72 6f 73 73 65 73 20 7b 7d 0a 0a 09 09 69 66 20  rosses {}....if 
3a90: 7b 24 73 74 61 72 74 20 3e 20 24 65 6e 64 7d 20  {$start > $end} 
3aa0: 7b 0a 09 09 20 20 20 20 77 68 69 6c 65 20 7b 24  {...    while {$
3ab0: 65 6e 64 20 3c 20 24 73 74 61 72 74 7d 20 7b 0a  end < $start} {.
3ac0: 09 09 09 6c 61 70 70 65 6e 64 20 63 72 6f 73 73  ...lappend cross
3ad0: 65 73 20 24 65 6e 64 0a 09 09 09 69 6e 63 72 20  es $end....incr 
3ae0: 63 72 6f 73 73 28 24 65 6e 64 29 0a 09 09 09 69  cross($end)....i
3af0: 6e 63 72 20 65 6e 64 0a 09 09 20 20 20 20 7d 0a  ncr end...    }.
3b00: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20  ..} else {...   
3b10: 20 77 68 69 6c 65 20 7b 24 73 74 61 72 74 20 3c   while {$start <
3b20: 20 24 65 6e 64 7d 20 7b 0a 09 09 09 6c 61 70 70   $end} {....lapp
3b30: 65 6e 64 20 63 72 6f 73 73 65 73 20 24 73 74 61  end crosses $sta
3b40: 72 74 0a 09 09 09 69 6e 63 72 20 63 72 6f 73 73  rt....incr cross
3b50: 28 24 73 74 61 72 74 29 0a 09 09 09 69 6e 63 72  ($start)....incr
3b60: 20 73 74 61 72 74 0a 09 09 20 20 20 20 7d 0a 09   start...    }..
3b70: 09 7d 0a 09 09 73 65 74 20 64 65 70 63 28 24 64  .}...set depc($d
3b80: 6b 65 79 29 20 24 63 72 6f 73 73 65 73 0a 09 20  key) $crosses.. 
3b90: 20 20 20 7d 0a 09 7d 0a 0a 09 49 6e 69 74 69 61     }..}...Initia
3ba0: 6c 69 7a 65 44 65 6c 74 61 73 20 24 72 65 76 69  lizeDeltas $revi
3bb0: 73 69 6f 6e 73 0a 09 72 65 74 75 72 6e 0a 20 20  sions..return.  
3bc0: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 49 6e    }..    proc In
3bd0: 69 74 69 61 6c 69 7a 65 44 65 6c 74 61 73 20 7b  itializeDeltas {
3be0: 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70  revisions} {..up
3bf0: 76 61 72 20 31 20 64 65 6c 74 61 20 64 65 6c 74  var 1 delta delt
3c00: 61 0a 0a 09 23 20 50 75 6c 6c 20 74 68 65 20 74  a...# Pull the t
3c10: 69 6d 65 73 74 61 6d 70 73 20 66 6f 72 20 61 6c  imestamps for al
3c20: 6c 20 72 65 76 69 73 69 6f 6e 73 20 69 6e 20 74  l revisions in t
3c30: 68 65 20 63 68 61 6e 67 65 73 65 74 73 20 61 6e  he changesets an
3c40: 64 0a 09 23 20 63 6f 6d 70 75 74 65 20 74 68 65  d..# compute the
3c50: 69 72 20 64 65 6c 74 61 73 20 66 6f 72 20 75 73  ir deltas for us
3c60: 65 20 62 79 20 74 68 65 20 62 72 65 61 6b 20 66  e by the break f
3c70: 69 6e 64 65 72 2e 0a 0a 09 61 72 72 61 79 20 73  inder....array s
3c80: 65 74 20 64 65 6c 74 61 20 7b 7d 0a 09 61 72 72  et delta {}..arr
3c90: 61 79 20 73 65 74 20 73 74 61 6d 70 20 7b 7d 0a  ay set stamp {}.
3ca0: 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b  ..set theset ('[
3cb0: 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20  join $revisions 
3cc0: 7b 27 2c 27 7d 5d 27 29 0a 09 66 6f 72 65 61 63  {','}]')..foreac
3cd0: 68 20 7b 72 69 64 20 74 69 6d 65 7d 20 5b 73 74  h {rid time} [st
3ce0: 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53  ate run "..    S
3cf0: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 64  ELECT R.rid, R.d
3d00: 61 74 65 0a 09 20 20 20 20 46 52 4f 4d 20 72 65  ate..    FROM re
3d10: 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48  vision R..    WH
3d20: 45 52 45 20 52 2e 72 69 64 20 49 4e 20 24 74 68  ERE R.rid IN $th
3d30: 65 73 65 74 0a 09 22 5d 20 7b 0a 09 20 20 20 20  eset.."] {..    
3d40: 73 65 74 20 73 74 61 6d 70 28 24 72 69 64 29 20  set stamp($rid) 
3d50: 24 74 69 6d 65 0a 09 7d 0a 0a 09 73 65 74 20 6e  $time..}...set n
3d60: 20 30 0a 09 66 6f 72 65 61 63 68 20 72 69 64 20   0..foreach rid 
3d70: 5b 6c 72 61 6e 67 65 20 24 72 65 76 69 73 69 6f  [lrange $revisio
3d80: 6e 73 20 30 20 65 6e 64 2d 31 5d 20 72 6e 65 78  ns 0 end-1] rnex
3d90: 74 20 5b 6c 72 61 6e 67 65 20 24 72 65 76 69 73  t [lrange $revis
3da0: 69 6f 6e 73 20 31 20 65 6e 64 5d 20 7b 0a 09 20  ions 1 end] {.. 
3db0: 20 20 20 73 65 74 20 64 65 6c 74 61 28 24 6e 29     set delta($n)
3dc0: 20 5b 65 78 70 72 20 7b 24 73 74 61 6d 70 28 24   [expr {$stamp($
3dd0: 72 6e 65 78 74 29 20 2d 20 24 73 74 61 6d 70 28  rnext) - $stamp(
3de0: 24 72 69 64 29 7d 5d 0a 09 20 20 20 20 69 6e 63  $rid)}]..    inc
3df0: 72 20 6e 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20  r n..}..return. 
3e00: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 46     }..    proc F
3e10: 69 6e 64 42 65 73 74 42 72 65 61 6b 20 7b 72 61  indBestBreak {ra
3e20: 6e 67 65 7d 20 7b 0a 09 75 70 76 61 72 20 31 20  nge} {..upvar 1 
3e30: 63 72 6f 73 73 20 63 72 6f 73 73 20 64 65 6c 74  cross cross delt
3e40: 61 20 64 65 6c 74 61 0a 0a 09 23 20 44 65 74 65  a delta...# Dete
3e50: 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 62  rmine the best b
3e60: 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 69 6e  reak location in
3e70: 20 74 68 65 20 67 69 76 65 6e 20 72 61 6e 67 65   the given range
3e80: 20 6f 66 0a 09 23 20 70 6f 73 69 74 69 6f 6e 73   of..# positions
3e90: 2e 20 46 69 72 73 74 20 77 65 20 6c 6f 6f 6b 20  . First we look 
3ea0: 66 6f 72 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e  for the location
3eb0: 73 20 77 69 74 68 20 74 68 65 20 6d 61 78 69 6d  s with the maxim
3ec0: 61 6c 0a 09 23 20 6e 75 6d 62 65 72 20 6f 66 20  al..# number of 
3ed0: 63 72 6f 73 73 69 6e 67 73 2e 20 49 66 20 74 68  crossings. If th
3ee0: 65 72 65 20 61 72 65 20 73 65 76 65 72 61 6c 20  ere are several 
3ef0: 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 68 65 0a  we look for the.
3f00: 09 23 20 73 68 6f 72 74 65 73 74 20 74 69 6d 65  .# shortest time
3f10: 20 69 6e 74 65 72 76 61 6c 20 61 6d 6f 6e 67 20   interval among 
3f20: 74 68 65 6d 2e 20 49 66 20 77 65 20 73 74 69 6c  them. If we stil
3f30: 6c 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 0a  l have multiple.
3f40: 09 23 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73  .# possibilities
3f50: 20 61 66 74 65 72 20 74 68 61 74 20 77 65 20 73   after that we s
3f60: 65 6c 65 63 74 20 74 68 65 20 65 61 72 6c 69 65  elect the earlie
3f70: 73 74 20 6c 6f 63 61 74 69 6f 6e 0a 09 23 20 61  st location..# a
3f80: 6d 6f 6e 67 20 74 68 65 73 65 2e 0a 0a 09 23 20  mong these....# 
3f90: 4e 6f 74 65 3a 20 49 66 20 74 68 65 20 6d 61 78  Note: If the max
3fa0: 69 6d 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63  imal number of c
3fb0: 72 6f 73 73 69 6e 67 73 20 69 73 20 30 20 74 68  rossings is 0 th
3fc0: 65 6e 20 74 68 65 20 72 61 6e 67 65 0a 09 23 20  en the range..# 
3fd0: 20 20 20 20 20 20 68 61 73 20 6e 6f 20 69 6e 74        has no int
3fe0: 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69  ernal dependenci
3ff0: 65 73 2c 20 61 6e 64 20 6e 6f 20 62 72 65 61 6b  es, and no break
4000: 20 6c 6f 63 61 74 69 6f 6e 20 61 74 0a 09 23 20   location at..# 
4010: 20 20 20 20 20 20 61 6c 6c 2e 20 54 68 69 73 20        all. This 
4020: 70 6f 73 73 69 62 69 6c 69 74 79 20 69 73 20 73  possibility is s
4030: 69 67 6e 61 6c 65 64 20 76 69 61 20 72 65 73 75  ignaled via resu
4040: 6c 74 20 2d 31 2e 0a 0a 09 23 20 4e 6f 74 65 3a  lt -1....# Note:
4050: 20 41 20 72 61 6e 67 65 20 6f 66 20 6c 65 6e 67   A range of leng
4060: 74 68 20 31 20 6f 72 20 6c 65 73 73 20 63 61 6e  th 1 or less can
4070: 6e 6f 74 20 68 61 76 65 20 69 6e 74 65 72 6e 61  not have interna
4080: 6c 0a 09 23 20 20 20 20 20 20 20 64 65 70 65 6e  l..#       depen
4090: 64 65 6e 63 69 65 73 2c 20 61 73 20 74 68 61 74  dencies, as that
40a0: 20 6e 65 65 64 73 20 61 74 20 6c 65 61 73 74 20   needs at least 
40b0: 74 77 6f 20 72 65 76 69 73 69 6f 6e 73 20 69 6e  two revisions in
40c0: 0a 09 23 20 20 20 20 20 20 20 74 68 65 20 72 61  ..#       the ra
40d0: 6e 67 65 2e 0a 0a 09 69 66 20 7b 5b 6c 6c 65 6e  nge....if {[llen
40e0: 67 74 68 20 24 72 61 6e 67 65 5d 20 3c 20 32 7d  gth $range] < 2}
40f0: 20 7b 20 72 65 74 75 72 6e 20 2d 31 20 7d 0a 0a   { return -1 }..
4100: 09 73 65 74 20 6d 61 78 20 2d 31 0a 09 73 65 74  .set max -1..set
4110: 20 62 65 73 74 20 7b 7d 0a 0a 09 66 6f 72 65 61   best {}...forea
4120: 63 68 20 6c 6f 63 61 74 69 6f 6e 20 24 72 61 6e  ch location $ran
4130: 67 65 20 7b 0a 09 20 20 20 20 73 65 74 20 63 72  ge {..    set cr
4140: 6f 73 73 69 6e 67 73 20 24 63 72 6f 73 73 28 24  ossings $cross($
4150: 6c 6f 63 61 74 69 6f 6e 29 0a 09 20 20 20 20 69  location)..    i
4160: 66 20 7b 24 63 72 6f 73 73 69 6e 67 73 20 3e 20  f {$crossings > 
4170: 24 6d 61 78 7d 20 7b 0a 09 09 73 65 74 20 6d 61  $max} {...set ma
4180: 78 20 20 24 63 72 6f 73 73 69 6e 67 73 0a 09 09  x  $crossings...
4190: 73 65 74 20 62 65 73 74 20 5b 6c 69 73 74 20 24  set best [list $
41a0: 6c 6f 63 61 74 69 6f 6e 5d 0a 09 09 63 6f 6e 74  location]...cont
41b0: 69 6e 75 65 0a 09 20 20 20 20 7d 20 65 6c 73 65  inue..    } else
41c0: 69 66 20 7b 24 63 72 6f 73 73 69 6e 67 73 20 3d  if {$crossings =
41d0: 3d 20 24 6d 61 78 7d 20 7b 0a 09 09 6c 61 70 70  = $max} {...lapp
41e0: 65 6e 64 20 62 65 73 74 20 24 6c 6f 63 61 74 69  end best $locati
41f0: 6f 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69  on..    }..}...i
4200: 66 20 7b 24 6d 61 78 20 3d 3d 20 30 7d 20 20 20  f {$max == 0}   
4210: 20 20 20 20 20 20 20 20 20 7b 20 72 65 74 75 72           { retur
4220: 6e 20 2d 31 20 7d 0a 09 69 66 20 7b 5b 6c 6c 65  n -1 }..if {[lle
4230: 6e 67 74 68 20 24 62 65 73 74 5d 20 3d 3d 20 31  ngth $best] == 1
4240: 7d 20 7b 20 72 65 74 75 72 6e 20 5b 6c 69 6e 64  } { return [lind
4250: 65 78 20 24 62 65 73 74 20 30 5d 20 7d 0a 0a 09  ex $best 0] }...
4260: 73 65 74 20 6c 6f 63 61 74 69 6f 6e 73 20 24 62  set locations $b
4270: 65 73 74 0a 09 73 65 74 20 62 65 73 74 20 7b 7d  est..set best {}
4280: 0a 09 73 65 74 20 6d 69 6e 20 2d 31 0a 0a 09 66  ..set min -1...f
4290: 6f 72 65 61 63 68 20 6c 6f 63 61 74 69 6f 6e 20  oreach location 
42a0: 24 6c 6f 63 61 74 69 6f 6e 73 20 7b 0a 09 20 20  $locations {..  
42b0: 20 20 73 65 74 20 69 6e 74 65 72 76 61 6c 20 24    set interval $
42c0: 64 65 6c 74 61 28 24 6c 6f 63 61 74 69 6f 6e 29  delta($location)
42d0: 0a 09 20 20 20 20 69 66 20 7b 28 24 6d 69 6e 20  ..    if {($min 
42e0: 3c 20 30 29 20 7c 7c 20 28 24 69 6e 74 65 72 76  < 0) || ($interv
42f0: 61 6c 20 3c 20 24 6d 69 6e 29 7d 20 7b 0a 09 09  al < $min)} {...
4300: 73 65 74 20 6d 69 6e 20 20 24 69 6e 74 65 72 76  set min  $interv
4310: 61 6c 0a 09 09 73 65 74 20 62 65 73 74 20 5b 6c  al...set best [l
4320: 69 73 74 20 24 6c 6f 63 61 74 69 6f 6e 5d 0a 09  ist $location]..
4330: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 69      } elseif {$i
4340: 6e 74 65 72 76 61 6c 20 3d 3d 20 24 6d 69 6e 7d  nterval == $min}
4350: 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 62 65 73   {...lappend bes
4360: 74 20 24 6c 6f 63 61 74 69 6f 6e 0a 09 20 20 20  t $location..   
4370: 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b 5b 6c 6c 65   }..}...if {[lle
4380: 6e 67 74 68 20 24 62 65 73 74 5d 20 3d 3d 20 31  ngth $best] == 1
4390: 7d 20 7b 20 72 65 74 75 72 6e 20 5b 6c 69 6e 64  } { return [lind
43a0: 65 78 20 24 62 65 73 74 20 30 5d 20 7d 0a 0a 09  ex $best 0] }...
43b0: 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 5b  return [lindex [
43c0: 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65 72 20 2d  lsort -integer -
43d0: 69 6e 63 72 65 61 73 69 6e 67 20 24 62 65 73 74  increasing $best
43e0: 5d 20 30 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ] 0].    }..    
43f0: 70 72 6f 63 20 43 75 74 41 74 20 7b 6c 6f 63 61  proc CutAt {loca
4400: 74 69 6f 6e 7d 20 7b 0a 09 75 70 76 61 72 20 31  tion} {..upvar 1
4410: 20 63 72 6f 73 73 20 63 72 6f 73 73 20 64 65 70   cross cross dep
4420: 63 20 64 65 70 63 0a 0a 09 23 20 49 74 20 77 61  c depc...# It wa
4430: 73 20 64 65 63 69 64 65 64 20 74 6f 20 73 70 6c  s decided to spl
4440: 69 74 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  it the changeset
4450: 20 61 74 20 74 68 65 20 67 69 76 65 6e 0a 09 23   at the given..#
4460: 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 69 73 20   location. This 
4470: 63 75 74 73 20 61 20 6e 75 6d 62 65 72 20 6f 66  cuts a number of
4480: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 48   dependencies. H
4490: 65 72 65 20 77 65 20 75 70 64 61 74 65 0a 09 23  ere we update..#
44a0: 20 74 68 65 20 63 72 6f 73 73 20 69 6e 66 6f 72   the cross infor
44b0: 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 74  mation so that t
44c0: 68 65 20 62 72 65 61 6b 20 66 69 6e 64 65 72 20  he break finder 
44d0: 68 61 73 20 61 63 63 75 72 61 74 65 0a 09 23 20  has accurate..# 
44e0: 64 61 74 61 20 77 68 65 6e 20 77 65 20 6c 6f 6f  data when we loo
44f0: 6b 20 61 74 20 74 68 65 20 67 65 6e 65 72 61 74  k at the generat
4500: 65 64 20 66 72 61 67 6d 65 6e 74 73 2e 0a 0a 09  ed fragments....
4510: 73 65 74 20 73 69 78 20 5b 6c 6f 67 20 76 69 73  set six [log vis
4520: 69 62 6c 65 3f 20 36 5d 0a 0a 09 66 6f 72 65 61  ible? 6]...forea
4530: 63 68 20 7b 64 65 70 20 72 61 6e 67 65 7d 20 5b  ch {dep range} [
4540: 61 72 72 61 79 20 67 65 74 20 64 65 70 63 5d 20  array get depc] 
4550: 7b 0a 09 20 20 20 20 23 20 43 68 65 63 6b 20 61  {..    # Check a
4560: 6c 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  ll dependencies 
4570: 73 74 69 6c 6c 20 6b 6e 6f 77 6e 2c 20 74 61 6b  still known, tak
4580: 65 20 74 68 65 69 72 20 72 61 6e 67 65 20 61 6e  e their range an
4590: 64 0a 09 20 20 20 20 23 20 73 65 65 20 69 66 20  d..    # see if 
45a0: 74 68 65 20 62 72 65 61 6b 20 6c 6f 63 61 74 69  the break locati
45b0: 6f 6e 20 66 61 6c 6c 73 20 77 69 74 68 69 6e 2e  on falls within.
45c0: 0a 0a 09 20 20 20 20 42 6f 72 64 65 72 20 24 72  ...    Border $r
45d0: 61 6e 67 65 20 73 20 65 0a 09 20 20 20 20 69 66  ange s e..    if
45e0: 20 7b 24 6c 6f 63 61 74 69 6f 6e 20 3c 20 24 73   {$location < $s
45f0: 7d 20 63 6f 6e 74 69 6e 75 65 20 3b 20 23 20 62  } continue ; # b
4600: 72 65 61 6b 20 62 65 66 6f 72 65 20 72 61 6e 67  reak before rang
4610: 65 2c 20 69 67 6e 6f 72 65 0a 09 20 20 20 20 69  e, ignore..    i
4620: 66 20 7b 24 6c 6f 63 61 74 69 6f 6e 20 3e 20 24  f {$location > $
4630: 65 7d 20 63 6f 6e 74 69 6e 75 65 20 3b 20 23 20  e} continue ; # 
4640: 62 72 65 61 6b 20 61 66 74 65 72 20 72 61 6e 67  break after rang
4650: 65 2c 20 69 67 6e 6f 72 65 2e 0a 0a 09 20 20 20  e, ignore....   
4660: 20 23 20 54 68 69 73 20 64 65 70 65 6e 64 65 6e   # This dependen
4670: 63 79 20 63 72 6f 73 73 65 73 20 74 68 65 20 62  cy crosses the b
4680: 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 2e 20 57  reak location. W
4690: 65 20 72 65 6d 6f 76 65 20 69 74 0a 09 20 20 20  e remove it..   
46a0: 20 23 20 66 72 6f 6d 20 74 68 65 20 63 72 6f 73   # from the cros
46b0: 73 69 6e 67 73 20 63 6f 75 6e 74 65 72 73 2c 20  sings counters, 
46c0: 61 6e 64 20 74 68 65 6e 20 61 6c 73 6f 20 66 72  and then also fr
46d0: 6f 6d 20 74 68 65 20 73 65 74 0a 09 20 20 20 20  om the set..    
46e0: 23 20 6f 66 20 6b 6e 6f 77 6e 20 64 65 70 65 6e  # of known depen
46f0: 64 65 6e 63 69 65 73 2c 20 61 73 20 77 65 20 61  dencies, as we a
4700: 72 65 20 64 6f 6e 65 20 77 69 74 68 20 69 74 2e  re done with it.
4710: 0a 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 6c  ...    foreach l
4720: 6f 63 20 24 64 65 70 63 28 24 64 65 70 29 20 7b  oc $depc($dep) {
4730: 20 69 6e 63 72 20 63 72 6f 73 73 28 24 6c 6f 63   incr cross($loc
4740: 29 20 2d 31 20 7d 0a 09 20 20 20 20 75 6e 73 65  ) -1 }..    unse
4750: 74 20 64 65 70 63 28 24 64 65 70 29 0a 0a 09 20  t depc($dep)... 
4760: 20 20 20 69 66 20 7b 21 24 73 69 78 7d 20 63 6f     if {!$six} co
4770: 6e 74 69 6e 75 65 0a 0a 09 20 20 20 20 73 74 72  ntinue...    str
4780: 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e  uct::list assign
4790: 20 24 64 65 70 20 70 61 72 65 6e 74 20 63 68 69   $dep parent chi
47a0: 6c 64 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74  ld..    log writ
47b0: 65 20 35 20 63 73 65 74 73 20 22 42 72 6f 6b 65  e 5 csets "Broke
47c0: 20 64 65 70 65 6e 64 65 6e 63 79 20 5b 50 44 20   dependency [PD 
47d0: 24 70 61 72 65 6e 74 5d 20 2d 2d 3e 20 5b 50 44  $parent] --> [PD
47e0: 20 24 63 68 69 6c 64 5d 22 0a 09 7d 0a 0a 09 72   $child]"..}...r
47f0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
4800: 20 23 20 50 72 69 6e 74 20 69 64 65 6e 74 69 66   # Print identif
4810: 79 69 6e 67 20 64 61 74 61 20 66 6f 72 20 61 20  ying data for a 
4820: 72 65 76 69 73 69 6f 6e 20 28 70 72 6f 6a 65 63  revision (projec
4830: 74 2c 20 66 69 6c 65 2c 20 64 6f 74 74 65 64 20  t, file, dotted 
4840: 72 65 76 0a 20 20 20 20 23 20 6e 75 6d 62 65 72  rev.    # number
4850: 29 2c 20 66 6f 72 20 68 69 67 68 20 76 65 72 62  ), for high verb
4860: 6f 73 69 74 79 20 6c 6f 67 20 6f 75 74 70 75 74  osity log output
4870: 2e 0a 0a 20 20 20 20 70 72 6f 63 20 50 44 20 7b  ...    proc PD {
4880: 69 64 7d 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b  id} {..foreach {
4890: 70 20 66 20 72 7d 20 5b 73 74 61 74 65 20 72 75  p f r} [state ru
48a0: 6e 20 7b 0a 09 09 53 45 4c 45 43 54 20 50 2e 6e  n {...SELECT P.n
48b0: 61 6d 65 20 2c 20 46 2e 6e 61 6d 65 2c 20 52 2e  ame , F.name, R.
48c0: 72 65 76 0a 09 09 46 52 4f 4d 20 72 65 76 69 73  rev...FROM revis
48d0: 69 6f 6e 20 52 2c 20 66 69 6c 65 20 46 2c 20 70  ion R, file F, p
48e0: 72 6f 6a 65 63 74 20 50 0a 09 09 57 48 45 52 45  roject P...WHERE
48f0: 20 52 2e 72 69 64 20 3d 20 24 69 64 0a 09 09 41   R.rid = $id...A
4900: 4e 44 20 20 20 52 2e 66 69 64 20 3d 20 46 2e 66  ND   R.fid = F.f
4910: 69 64 0a 09 09 41 4e 44 20 20 20 46 2e 70 69 64  id...AND   F.pid
4920: 20 3d 20 50 2e 70 69 64 0a 09 7d 5d 20 62 72 65   = P.pid..}] bre
4930: 61 6b 0a 09 72 65 74 75 72 6e 20 22 27 24 70 20  ak..return "'$p 
4940: 3a 20 24 66 2f 24 72 27 22 0a 20 20 20 20 7d 0a  : $f/$r'".    }.
4950: 0a 20 20 20 20 23 20 50 72 69 6e 74 69 6e 67 20  .    # Printing 
4960: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 72 61 6e 67  one or more rang
4970: 65 73 2c 20 66 6f 72 6d 61 74 74 65 64 2c 20 61  es, formatted, a
4980: 6e 64 20 6f 6e 6c 79 20 74 68 65 69 72 20 62 6f  nd only their bo
4990: 72 64 65 72 20 74 6f 0a 20 20 20 20 23 20 6b 65  rder to.    # ke
49a0: 65 70 20 74 68 65 20 73 74 72 69 6e 67 73 20 73  ep the strings s
49b0: 68 6f 72 74 2e 0a 0a 20 20 20 20 70 72 6f 63 20  hort...    proc 
49c0: 50 52 73 20 7b 72 61 6e 67 65 73 7d 20 7b 0a 09  PRs {ranges} {..
49d0: 72 65 74 75 72 6e 20 5b 73 74 72 75 63 74 3a 3a  return [struct::
49e0: 6c 69 73 74 20 6d 61 70 20 24 72 61 6e 67 65 73  list map $ranges
49f0: 20 5b 6d 79 70 72 6f 63 20 50 52 5d 5d 0a 20 20   [myproc PR]].  
4a00: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 50 52    }..    proc PR
4a10: 20 7b 72 61 6e 67 65 7d 20 7b 0a 09 42 6f 72 64   {range} {..Bord
4a20: 65 72 20 24 72 61 6e 67 65 20 73 20 65 0a 09 72  er $range s e..r
4a30: 65 74 75 72 6e 20 3c 24 7b 73 7d 2e 2e 2e 24 7b  eturn <${s}...${
4a40: 65 7d 3e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  e}>.    }..    p
4a50: 72 6f 63 20 42 6f 72 64 65 72 20 7b 72 61 6e 67  roc Border {rang
4a60: 65 20 73 76 20 65 76 7d 20 7b 0a 09 75 70 76 61  e sv ev} {..upva
4a70: 72 20 31 20 24 73 76 20 73 20 24 65 76 20 65 0a  r 1 $sv s $ev e.
4a80: 09 73 65 74 20 73 20 5b 6c 69 6e 64 65 78 20 24  .set s [lindex $
4a90: 72 61 6e 67 65 20 30 5d 0a 09 73 65 74 20 65 20  range 0]..set e 
4aa0: 5b 6c 69 6e 64 65 78 20 24 72 61 6e 67 65 20 65  [lindex $range e
4ab0: 6e 64 5d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  nd]..return.    
4ac0: 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23  }..    # # ## ##
4ad0: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
4ae0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a   #############..
4af0: 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65      typevariable
4b00: 20 6d 79 63 68 61 6e 67 65 73 65 74 73 20 20 20   mychangesets   
4b10: 20 20 7b 7d 20 3b 20 23 20 4c 69 73 74 20 6f 66    {} ; # List of
4b20: 20 61 6c 6c 20 6b 6e 6f 77 6e 20 63 68 61 6e 67   all known chang
4b30: 65 73 65 74 73 2e 0a 20 20 20 20 74 79 70 65 76  esets..    typev
4b40: 61 72 69 61 62 6c 65 20 6d 79 69 74 65 6d 6d 61  ariable myitemma
4b50: 70 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20  p -array {} ; # 
4b60: 4d 61 70 20 66 72 6f 6d 20 69 74 65 6d 73 20 28  Map from items (
4b70: 74 61 67 67 65 64 29 20 74 6f 0a 09 09 09 09 20  tagged) to..... 
4b80: 20 20 20 20 20 20 23 20 74 68 65 20 6c 69 73 74        # the list
4b90: 20 6f 66 20 63 68 61 6e 67 65 73 65 74 73 0a 09   of changesets..
4ba0: 09 09 09 20 20 20 20 20 20 20 23 20 63 6f 6e 74  ...       # cont
4bb0: 61 69 6e 69 6e 67 20 69 74 2e 20 45 61 63 68 20  aining it. Each 
4bc0: 69 74 65 6d 20 63 61 6e 0a 09 09 09 09 20 20 20  item can.....   
4bd0: 20 20 20 20 23 20 62 65 20 75 73 65 64 20 62 79      # be used by
4be0: 20 6f 6e 6c 79 20 6f 6e 65 0a 09 09 09 09 20 20   only one.....  
4bf0: 20 20 20 20 20 23 20 63 68 61 6e 67 65 73 65 74       # changeset
4c00: 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62  ..    typevariab
4c10: 6c 65 20 6d 79 69 64 6d 61 70 20 20 20 2d 61 72  le myidmap   -ar
4c20: 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 66  ray {} ; # Map f
4c30: 72 6f 6d 20 63 68 61 6e 67 65 73 65 74 20 69 64  rom changeset id
4c40: 20 74 6f 0a 09 09 09 09 20 20 20 20 20 20 20 23   to.....       #
4c50: 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 20 20 20   changeset...   
4c60: 20 74 79 70 65 6d 65 74 68 6f 64 20 61 6c 6c 20   typemethod all 
4c70: 20 20 7b 7d 20 20 20 20 7b 20 72 65 74 75 72 6e    {}    { return
4c80: 20 24 6d 79 63 68 61 6e 67 65 73 65 74 73 20 7d   $mychangesets }
4c90: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
4ca0: 6f 66 20 20 20 20 7b 63 69 64 7d 20 7b 20 72 65  of    {cid} { re
4cb0: 74 75 72 6e 20 24 6d 79 69 64 6d 61 70 28 24 63  turn $myidmap($c
4cc0: 69 64 29 20 7d 0a 20 20 20 20 74 79 70 65 6d 65  id) }.    typeme
4cd0: 74 68 6f 64 20 6f 66 72 65 76 20 7b 69 69 64 7d  thod ofrev {iid}
4ce0: 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 74 65   { return $myite
4cf0: 6d 6d 61 70 28 24 69 69 64 29 20 7d 0a 0a 20 20  mmap($iid) }..  
4d00: 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23    # # ## ### ###
4d10: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23  ## ######## ####
4d20: 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23  #########.    ##
4d30: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a   Configuration..
4d40: 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 74      pragma -hast
4d50: 79 70 65 69 6e 66 6f 20 20 20 20 6e 6f 20 20 3b  ypeinfo    no  ;
4d60: 20 23 20 6e 6f 20 74 79 70 65 20 69 6e 74 72 6f   # no type intro
4d70: 73 70 65 63 74 69 6f 6e 0a 20 20 20 20 70 72 61  spection.    pra
4d80: 67 6d 61 20 2d 68 61 73 69 6e 66 6f 20 20 20 20  gma -hasinfo    
4d90: 20 20 20 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 6f      no  ; # no o
4da0: 62 6a 65 63 74 20 69 6e 74 72 6f 73 70 65 63 74  bject introspect
4db0: 69 6f 6e 0a 0a 20 20 20 20 23 20 23 20 23 23 20  ion..    # # ## 
4dc0: 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23  ### ##### ######
4dd0: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
4de0: 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23  .}..# # ## ### #
4df0: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23  #### ######## ##
4e00: 23 23 23 23 23 23 23 23 23 23 23 20 23 23 23 23  ########### ####
4e10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
4e20: 23 0a 23 23 20 48 65 6c 70 65 72 20 73 69 6e 67  #.## Helper sing
4e30: 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20  leton. Commands 
4e40: 66 6f 72 20 72 65 76 69 73 69 6f 6e 20 63 68 61  for revision cha
4e50: 6e 67 65 73 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a  ngesets...snit::
4e60: 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69  type ::vc::fossi
4e70: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a  l::import::cvs::
4e80: 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 72 65  project::rev::re
4e90: 76 20 7b 0a 20 20 20 20 74 79 70 65 6d 65 74 68  v {.    typemeth
4ea0: 6f 64 20 62 79 72 65 76 69 73 69 6f 6e 20 7b 7d  od byrevision {}
4eb0: 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a 20 20   { return 1 }.  
4ec0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 73    typemethod bys
4ed0: 79 6d 62 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 74  ymbol   {} { ret
4ee0: 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65  urn 0 }.    type
4ef0: 6d 65 74 68 6f 64 20 69 73 74 61 67 20 20 20 20  method istag    
4f00: 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20    {} { return 0 
4f10: 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  }.    typemethod
4f20: 20 69 73 62 72 61 6e 63 68 20 20 20 7b 7d 20 7b   isbranch   {} {
4f30: 20 72 65 74 75 72 6e 20 30 20 7d 0a 0a 20 20 20   return 0 }..   
4f40: 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73 74   # result = list
4f50: 20 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74 69   (mintime, maxti
4f60: 6d 65 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68  me).    typemeth
4f70: 6f 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 69 74  od timerange {it
4f80: 65 6d 73 7d 20 7b 0a 09 73 65 74 20 74 68 65 73  ems} {..set thes
4f90: 65 74 20 28 27 5b 6a 6f 69 6e 20 24 69 74 65 6d  et ('[join $item
4fa0: 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75  s {','}]')..retu
4fb0: 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a  rn [state run ".
4fc0: 09 20 20 20 20 53 45 4c 45 43 54 20 4d 49 4e 28  .    SELECT MIN(
4fd0: 52 2e 64 61 74 65 29 2c 20 4d 41 58 28 52 2e 64  R.date), MAX(R.d
4fe0: 61 74 65 29 0a 09 20 20 20 20 46 52 4f 4d 20 72  ate)..    FROM r
4ff0: 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57  evision R..    W
5000: 48 45 52 45 20 52 2e 72 69 64 20 49 4e 20 24 74  HERE R.rid IN $t
5010: 68 65 73 65 74 0a 09 22 5d 0a 20 20 20 20 7d 0a  heset.."].    }.
5020: 0a 20 20 20 20 23 20 76 61 72 28 64 76 29 20 3d  .    # var(dv) =
5030: 20 64 69 63 74 20 28 72 65 76 69 73 69 6f 6e 20   dict (revision 
5040: 2d 3e 20 6c 69 73 74 20 28 72 65 76 69 73 69 6f  -> list (revisio
5050: 6e 29 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68  n)).    typemeth
5060: 6f 64 20 69 6e 74 65 72 6e 61 6c 73 75 63 63 65  od internalsucce
5070: 73 73 6f 72 73 20 7b 64 76 20 72 65 76 69 73 69  ssors {dv revisi
5080: 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20  ons} {..upvar 1 
5090: 24 64 76 20 64 65 70 65 6e 64 65 6e 63 69 65 73  $dv dependencies
50a0: 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b  ..set theset ('[
50b0: 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20  join $revisions 
50c0: 7b 27 2c 27 7d 5d 27 29 0a 0a 09 23 20 53 65 65  {','}]')...# See
50d0: 20 27 73 75 63 63 65 73 73 6f 72 73 27 20 62 65   'successors' be
50e0: 6c 6f 77 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  low for the main
50f0: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 0a   explanation of.
5100: 09 23 20 74 68 65 20 76 61 72 69 6f 75 73 20 63  .# the various c
5110: 61 73 65 73 2e 20 54 68 69 73 20 70 69 65 63 65  ases. This piece
5120: 20 69 73 20 73 70 65 63 69 61 6c 20 69 6e 20 74   is special in t
5130: 68 61 74 20 69 74 0a 09 23 20 72 65 73 74 72 69  hat it..# restri
5140: 63 74 73 20 74 68 65 20 73 75 63 63 65 73 73 6f  cts the successo
5150: 72 73 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74  rs we look for t
5160: 6f 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f  o the same set o
5170: 66 0a 09 23 20 72 65 76 69 73 69 6f 6e 73 20 77  f..# revisions w
5180: 65 20 73 74 61 72 74 20 66 72 6f 6d 2e 20 53 65  e start from. Se
5190: 6e 73 69 62 6c 65 20 61 73 20 77 65 20 61 72 65  nsible as we are
51a0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 0a 09 23 20   looking for..# 
51b0: 63 68 61 6e 67 65 73 65 74 20 69 6e 74 65 72 6e  changeset intern
51c0: 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e  al dependencies.
51d0: 0a 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 70  ...array set dep
51e0: 20 7b 7d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72   {}...foreach {r
51f0: 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65  id child} [state
5200: 20 72 75 6e 20 22 0a 20 20 20 2d 2d 20 28 31 29   run ".   -- (1)
5210: 20 50 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 09   Primary child..
5220: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64      SELECT R.rid
5230: 2c 20 52 2e 63 68 69 6c 64 0a 09 20 20 20 20 46  , R.child..    F
5240: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52  ROM   revision R
5250: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72  ..    WHERE  R.r
5260: 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20  id   IN $theset 
5270: 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20      -- Restrict 
5280: 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20  to revisions of 
5290: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e  interest..    AN
52a0: 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49 53 20  D    R.child IS 
52b0: 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48  NOT NULL    -- H
52c0: 61 73 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64  as primary child
52d0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 63  ..    AND    R.c
52e0: 68 69 6c 64 20 49 4e 20 24 74 68 65 73 65 74 20  hild IN $theset 
52f0: 20 20 20 20 2d 2d 20 57 68 69 63 68 20 69 73 20      -- Which is 
5300: 61 6c 73 6f 20 6f 66 20 69 6e 74 65 72 65 73 74  also of interest
5310: 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d  .    UNION.    -
5320: 2d 20 28 32 29 20 53 65 63 6f 6e 64 61 72 79 20  - (2) Secondary 
5330: 28 62 72 61 6e 63 68 29 20 63 68 69 6c 64 72 65  (branch) childre
5340: 6e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e  n..    SELECT R.
5350: 72 69 64 2c 20 42 2e 62 72 69 64 0a 09 20 20 20  rid, B.brid..   
5360: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
5370: 20 52 2c 20 72 65 76 69 73 69 6f 6e 62 72 61 6e   R, revisionbran
5380: 63 68 63 68 69 6c 64 72 65 6e 20 42 0a 09 20 20  chchildren B..  
5390: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20    WHERE  R.rid  
53a0: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20   IN $theset     
53b0: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72  -- Restrict to r
53c0: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65  evisions of inte
53d0: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
53e0: 20 52 2e 72 69 64 20 3d 20 42 2e 72 69 64 20 20   R.rid = B.rid  
53f0: 20 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63          -- Selec
5400: 74 20 73 75 62 73 65 74 20 6f 66 20 62 72 61 6e  t subset of bran
5410: 63 68 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20  ch children..   
5420: 20 41 4e 44 20 20 20 20 42 2e 62 72 69 64 20 49   AND    B.brid I
5430: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 20 2d  N $theset      -
5440: 2d 20 57 68 69 63 68 20 69 73 20 61 6c 73 6f 20  - Which is also 
5450: 6f 66 20 69 6e 74 65 72 65 73 74 0a 20 20 20 20  of interest.    
5460: 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 34 29  UNION.    -- (4)
5470: 20 43 68 69 6c 64 20 6f 66 20 74 72 75 6e 6b 20   Child of trunk 
5480: 72 6f 6f 74 20 73 75 63 63 65 73 73 6f 72 20 6f  root successor o
5490: 66 20 6c 61 73 74 20 4e 54 44 42 20 6f 6e 20 74  f last NTDB on t
54a0: 72 75 6e 6b 2e 0a 09 20 20 20 20 53 45 4c 45 43  runk...    SELEC
54b0: 54 20 52 2e 72 69 64 2c 20 52 41 2e 63 68 69 6c  T R.rid, RA.chil
54c0: 64 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69  d..    FROM revi
54d0: 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e  sion R, revision
54e0: 20 52 41 0a 09 20 20 20 20 57 48 45 52 45 20 52   RA..    WHERE R
54f0: 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65  .rid   IN $these
5500: 74 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69  t      -- Restri
5510: 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20  ct to revisions 
5520: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20  of interest..   
5530: 20 41 4e 44 20 20 20 52 2e 69 73 64 65 66 61 75   AND   R.isdefau
5540: 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  lt             -
5550: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 4e 54  - Restrict to NT
5560: 44 42 0a 09 20 20 20 20 41 4e 44 20 20 20 52 2e  DB..    AND   R.
5570: 64 62 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e  dbchild IS NOT N
5580: 55 4c 4c 20 20 20 2d 2d 20 61 6e 64 20 6c 61 73  ULL   -- and las
5590: 74 20 4e 54 44 42 20 62 65 6c 6f 6e 67 69 6e 67  t NTDB belonging
55a0: 20 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20 41   to trunk..    A
55b0: 4e 44 20 20 20 52 41 2e 72 69 64 20 3d 20 52 2e  ND   RA.rid = R.
55c0: 64 62 63 68 69 6c 64 20 20 20 20 20 20 2d 2d 20  dbchild      -- 
55d0: 47 6f 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  Go directly to t
55e0: 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 20 41  runk root..    A
55f0: 4e 44 20 20 20 52 41 2e 63 68 69 6c 64 20 49 53  ND   RA.child IS
5600: 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20   NOT NULL    -- 
5610: 48 61 73 20 70 72 69 6d 61 72 79 20 63 68 69 6c  Has primary chil
5620: 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 41  d..            A
5630: 4e 44 20 20 20 52 41 2e 63 68 69 6c 64 20 49 4e  ND   RA.child IN
5640: 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20   $theset     -- 
5650: 57 68 69 63 68 20 69 73 20 61 6c 73 6f 20 6f 66  Which is also of
5660: 20 69 6e 74 65 72 65 73 74 0a 09 22 5d 20 7b 0a   interest.."] {.
5670: 09 20 20 20 20 23 20 43 6f 6e 73 69 64 65 72 20  .    # Consider 
5680: 6d 6f 76 69 6e 67 20 74 68 69 73 20 74 6f 20 74  moving this to t
5690: 68 65 20 69 6e 74 65 67 72 69 74 79 20 6d 6f 64  he integrity mod
56a0: 75 6c 65 2e 0a 09 20 20 20 20 69 6e 74 65 67 72  ule...    integr
56b0: 69 74 79 20 61 73 73 65 72 74 20 7b 24 72 69 64  ity assert {$rid
56c0: 20 21 3d 20 24 63 68 69 6c 64 7d 20 7b 52 65 76   != $child} {Rev
56d0: 69 73 69 6f 6e 20 24 72 69 64 20 64 65 70 65 6e  ision $rid depen
56e0: 64 73 20 6f 6e 20 69 74 73 65 6c 66 2e 7d 0a 09  ds on itself.}..
56f0: 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65      lappend depe
5700: 6e 64 65 6e 63 69 65 73 28 24 72 69 64 29 20 24  ndencies($rid) $
5710: 63 68 69 6c 64 0a 09 20 20 20 20 73 65 74 20 64  child..    set d
5720: 65 70 28 24 72 69 64 2c 24 63 68 69 6c 64 29 20  ep($rid,$child) 
5730: 2e 0a 09 7d 0a 0a 09 23 20 54 68 65 20 73 71 6c  ...}...# The sql
5740: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 62 6f 76   statements abov
5750: 65 20 6c 6f 6f 6b 73 20 6f 6e 6c 79 20 66 6f 72  e looks only for
5760: 20 64 69 72 65 63 74 20 64 65 70 65 6e 64 65 6e   direct dependen
5770: 63 69 65 73 0a 09 23 20 62 65 74 77 65 65 6e 20  cies..# between 
5780: 72 65 76 69 73 69 6f 6e 20 69 6e 20 74 68 65 20  revision in the 
5790: 63 68 61 6e 67 65 73 65 74 2e 20 48 6f 77 65 76  changeset. Howev
57a0: 65 72 20 64 75 65 20 74 6f 20 74 68 65 0a 09 23  er due to the..#
57b0: 20 76 61 67 61 72 69 65 73 20 6f 66 20 6d 65 74   vagaries of met
57c0: 61 20 64 61 74 61 20 69 74 20 69 73 20 70 6f 73  a data it is pos
57d0: 73 69 62 6c 65 20 66 6f 72 20 74 77 6f 20 72 65  sible for two re
57e0: 76 69 73 69 6f 6e 73 20 6f 66 0a 09 23 20 74 68  visions of..# th
57f0: 65 20 73 61 6d 65 20 66 69 6c 65 20 74 6f 20 65  e same file to e
5800: 6e 64 20 75 70 20 69 6e 20 74 68 65 20 73 61 6d  nd up in the sam
5810: 65 20 63 68 61 6e 67 65 73 65 74 2c 20 77 69 74  e changeset, wit
5820: 68 6f 75 74 20 61 0a 09 23 20 64 69 72 65 63 74  hout a..# direct
5830: 20 64 65 70 65 6e 64 65 6e 63 79 20 62 65 74 77   dependency betw
5840: 65 65 6e 20 74 68 65 6d 2e 20 48 6f 77 65 76 65  een them. Howeve
5850: 72 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20 74  r we know that t
5860: 68 65 72 65 0a 09 23 20 68 61 73 20 74 6f 20 62  here..# has to b
5870: 65 20 61 20 61 6e 20 69 6e 64 69 72 65 63 74 20  e a an indirect 
5880: 64 65 70 65 6e 64 65 6e 63 79 2c 20 62 65 20 69  dependency, be i
5890: 74 20 74 68 72 6f 75 67 68 20 70 72 69 6d 61 72  t through primar
58a0: 79 0a 09 23 20 63 68 69 6c 64 72 65 6e 2c 20 62  y..# children, b
58b0: 72 61 6e 63 68 20 63 68 69 6c 64 72 65 6e 2c 20  ranch children, 
58c0: 6f 72 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e  or a combination
58d0: 20 74 68 65 72 65 6f 66 2e 0a 0a 09 23 20 57 65   thereof....# We
58e0: 20 6e 6f 77 20 66 69 6c 6c 20 69 6e 20 74 68 65   now fill in the
58f0: 73 65 20 70 73 65 75 64 6f 2d 64 65 70 65 6e 64  se pseudo-depend
5900: 65 6e 63 69 65 73 2c 20 69 66 20 6e 6f 20 73 75  encies, if no su
5910: 63 68 0a 09 23 20 64 65 70 65 6e 64 65 6e 63 79  ch..# dependency
5920: 20 65 78 69 73 74 73 20 61 6c 72 65 61 64 79 2e   exists already.
5930: 20 54 68 65 20 64 69 72 65 63 74 69 6f 6e 20 6f   The direction o
5940: 66 20 74 68 65 20 64 65 70 65 6e 64 65 6e 63 79  f the dependency
5950: 0a 09 23 20 69 73 20 61 63 74 75 61 6c 6c 79 20  ..# is actually 
5960: 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20 74  irrelevant for t
5970: 68 69 73 2e 0a 0a 09 23 20 4e 4f 54 45 3a 20 54  his....# NOTE: T
5980: 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e 74  his is different
5990: 20 66 72 6f 6d 20 63 76 73 32 73 76 6e 2e 20 4f   from cvs2svn. O
59a0: 75 72 20 73 70 69 72 69 74 75 61 6c 20 61 6e 63  ur spiritual anc
59b0: 65 73 74 6f 72 0a 09 23 20 64 6f 65 73 20 6e 6f  estor..# does no
59c0: 74 20 75 73 65 20 73 75 63 68 20 70 73 65 75 64  t use such pseud
59d0: 6f 2d 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20  o-dependencies, 
59e0: 68 6f 77 65 76 65 72 20 69 74 20 75 73 65 73 20  however it uses 
59f0: 61 0a 09 23 20 43 4f 4d 4d 49 54 5f 54 48 52 45  a..# COMMIT_THRE
5a00: 53 48 4f 4c 44 2c 20 61 20 74 69 6d 65 20 69 6e  SHOLD, a time in
5a10: 74 65 72 76 61 6c 20 63 6f 6d 6d 69 74 73 20 73  terval commits s
5a20: 68 6f 75 6c 64 20 66 61 6c 6c 2e 20 54 68 69 73  hould fall. This
5a30: 0a 09 23 20 77 69 6c 6c 20 67 72 65 61 74 6c 79  ..# will greatly
5a40: 20 72 65 64 75 63 65 73 20 74 68 65 20 72 69 73   reduces the ris
5a50: 6b 20 6f 66 20 67 65 74 74 69 6e 67 20 66 61 72  k of getting far
5a60: 20 73 65 70 61 72 61 74 65 64 0a 09 23 20 72 65   separated..# re
5a70: 76 69 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 73  visions of the s
5a80: 61 6d 65 20 66 69 6c 65 20 69 6e 74 6f 20 6f 6e  ame file into on
5a90: 65 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 23  e changeset....#
5aa0: 20 57 65 20 61 6c 6c 6f 77 20 72 65 76 69 73 69   We allow revisi
5ab0: 6f 6e 73 20 74 6f 20 62 65 20 66 61 72 20 61 70  ons to be far ap
5ac0: 61 72 74 20 69 6e 20 74 69 6d 65 20 69 6e 20 74  art in time in t
5ad0: 68 65 20 73 61 6d 65 0a 09 23 20 63 68 61 6e 67  he same..# chang
5ae0: 65 73 65 74 2c 20 62 75 74 20 6e 65 65 64 20 74  eset, but need t
5af0: 68 65 20 70 73 65 75 64 6f 2d 64 65 70 65 6e 64  he pseudo-depend
5b00: 65 6e 63 69 65 73 20 66 6f 72 20 74 68 69 73 2e  encies for this.
5b10: 0a 0a 09 61 72 72 61 79 20 73 65 74 20 66 69 64  ...array set fid
5b20: 73 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72  s {}..foreach {r
5b30: 69 64 20 66 69 64 7d 20 5b 73 74 61 74 65 20 72  id fid} [state r
5b40: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54  un "..    SELECT
5b50: 20 52 2e 72 69 64 2c 20 52 2e 66 69 64 20 46 52   R.rid, R.fid FR
5b60: 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 20 57 48  OM revision R WH
5b70: 45 52 45 20 52 2e 72 69 64 20 49 4e 20 24 74 68  ERE R.rid IN $th
5b80: 65 73 65 74 0a 09 22 5d 20 7b 20 6c 61 70 70 65  eset.."] { lappe
5b90: 6e 64 20 66 69 64 73 28 24 66 69 64 29 20 24 72  nd fids($fid) $r
5ba0: 69 64 20 7d 0a 0a 09 66 6f 72 65 61 63 68 20 7b  id }...foreach {
5bb0: 66 69 64 20 72 69 64 73 7d 20 5b 61 72 72 61 79  fid rids} [array
5bc0: 20 67 65 74 20 66 69 64 73 5d 20 7b 0a 09 20 20   get fids] {..  
5bd0: 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24    if {[llength $
5be0: 72 69 64 73 5d 20 3c 20 32 7d 20 63 6f 6e 74 69  rids] < 2} conti
5bf0: 6e 75 65 0a 09 20 20 20 20 66 6f 72 65 61 63 68  nue..    foreach
5c00: 20 61 20 24 72 69 64 73 20 7b 0a 09 09 66 6f 72   a $rids {...for
5c10: 65 61 63 68 20 62 20 24 72 69 64 73 20 7b 0a 09  each b $rids {..
5c20: 09 20 20 20 20 69 66 20 7b 24 61 20 3d 3d 20 24  .    if {$a == $
5c30: 62 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 09 20 20  b} continue...  
5c40: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
5c50: 74 73 20 64 65 70 28 24 61 2c 24 62 29 5d 7d 20  ts dep($a,$b)]} 
5c60: 63 6f 6e 74 69 6e 75 65 0a 09 09 20 20 20 20 69  continue...    i
5c70: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
5c80: 64 65 70 28 24 62 2c 24 61 29 5d 7d 20 63 6f 6e  dep($b,$a)]} con
5c90: 74 69 6e 75 65 0a 09 09 20 20 20 20 6c 61 70 70  tinue...    lapp
5ca0: 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73  end dependencies
5cb0: 28 24 61 29 20 24 62 0a 09 09 20 20 20 20 73 65  ($a) $b...    se
5cc0: 74 20 64 65 70 28 24 61 2c 24 62 29 20 2e 0a 09  t dep($a,$b) ...
5cd0: 09 20 20 20 20 73 65 74 20 64 65 70 28 24 62 2c  .    set dep($b,
5ce0: 24 61 29 20 2e 0a 09 09 7d 0a 09 20 20 20 20 7d  $a) ....}..    }
5cf0: 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  ..}..return.    
5d00: 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76 29  }..    # var(dv)
5d10: 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d 3e   = dict (item ->
5d20: 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c 20 69   list (item)), i
5d30: 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 79 70  tem  = list (typ
5d40: 65 20 69 64 29 0a 20 20 20 20 74 79 70 65 6d 65  e id).    typeme
5d50: 74 68 6f 64 20 73 75 63 63 65 73 73 6f 72 73 20  thod successors 
5d60: 7b 64 76 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b  {dv revisions} {
5d70: 0a 09 75 70 76 61 72 20 31 20 24 64 76 20 64 65  ..upvar 1 $dv de
5d80: 70 65 6e 64 65 6e 63 69 65 73 0a 09 73 65 74 20  pendencies..set 
5d90: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24  theset ('[join $
5da0: 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d  revisions {','}]
5db0: 27 29 0a 0a 09 23 20 54 68 65 20 66 6f 6c 6c 6f  ')...# The follo
5dc0: 77 69 6e 67 20 63 61 73 65 73 20 73 70 65 63 69  wing cases speci
5dd0: 66 79 20 77 68 65 6e 20 61 20 72 65 76 69 73 69  fy when a revisi
5de0: 6f 6e 20 53 20 69 73 20 61 20 73 75 63 63 65 73  on S is a succes
5df0: 73 6f 72 0a 09 23 20 6f 66 20 61 20 72 65 76 69  sor..# of a revi
5e00: 73 69 6f 6e 20 52 2e 20 45 61 63 68 20 6f 66 20  sion R. Each of 
5e10: 74 68 65 20 63 61 73 65 73 20 74 72 61 6e 73 6c  the cases transl
5e20: 61 74 65 73 20 69 6e 74 6f 20 6f 6e 65 20 6f 66  ates into one of
5e30: 0a 09 23 20 74 68 65 20 62 72 61 6e 63 68 65 73  ..# the branches
5e40: 20 6f 66 20 74 68 65 20 53 51 4c 20 55 4e 49 4f   of the SQL UNIO
5e50: 4e 20 63 6f 6d 69 6e 67 20 62 65 6c 6f 77 2e 0a  N coming below..
5e60: 09 23 0a 09 23 20 28 31 29 20 53 20 63 61 6e 20  .#..# (1) S can 
5e70: 62 65 20 61 20 70 72 69 6d 61 72 79 20 63 68 69  be a primary chi
5e80: 6c 64 20 6f 66 20 52 2c 20 69 2e 65 2e 20 69 6e  ld of R, i.e. in
5e90: 20 74 68 65 20 73 61 6d 65 20 4c 4f 44 2e 20 52   the same LOD. R
5ea0: 0a 09 23 20 20 20 20 20 72 65 66 65 72 65 6e 63  ..#     referenc
5eb0: 65 73 20 53 20 64 69 72 65 63 74 6c 79 2e 20 52  es S directly. R
5ec0: 2e 63 68 69 6c 64 20 3d 20 53 28 2e 72 69 64 29  .child = S(.rid)
5ed0: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a  , if it exists..
5ee0: 09 23 0a 09 23 20 28 32 29 20 53 20 63 61 6e 20  .#..# (2) S can 
5ef0: 62 65 20 61 20 73 65 63 6f 6e 64 61 72 79 2c 20  be a secondary, 
5f00: 69 2e 65 2e 20 62 72 61 6e 63 68 2c 20 63 68 69  i.e. branch, chi
5f10: 6c 64 20 6f 66 20 52 2e 20 48 65 72 65 20 74 68  ld of R. Here th
5f20: 65 0a 09 23 20 20 20 20 20 6c 69 6e 6b 20 69 73  e..#     link is
5f30: 20 6d 61 64 65 20 74 68 72 6f 75 67 68 20 74 68   made through th
5f40: 65 20 68 65 6c 70 65 72 20 74 61 62 6c 65 0a 09  e helper table..
5f50: 23 20 20 20 20 20 52 45 56 49 53 49 4f 4e 42 52  #     REVISIONBR
5f60: 41 4e 43 48 43 48 49 4c 44 52 45 4e 2e 20 52 2e  ANCHCHILDREN. R.
5f70: 72 69 64 20 2d 3e 20 52 42 43 2e 72 69 64 2c 20  rid -> RBC.rid, 
5f80: 52 42 43 2e 62 72 69 64 20 3d 0a 09 23 20 20 20  RBC.brid =..#   
5f90: 20 20 53 28 2e 72 69 64 29 0a 09 23 0a 09 23 20    S(.rid)..#..# 
5fa0: 28 33 29 20 4f 72 69 67 69 6e 61 6c 6c 79 20 74  (3) Originally t
5fb0: 68 69 73 20 75 73 65 20 63 61 73 65 20 64 65 66  his use case def
5fc0: 69 6e 65 64 20 74 68 65 20 72 6f 6f 74 20 6f 66  ined the root of
5fd0: 20 61 20 64 65 74 61 63 68 65 64 0a 09 23 20 20   a detached..#  
5fe0: 20 20 20 4e 54 44 42 20 61 73 20 74 68 65 20 73     NTDB as the s
5ff0: 75 63 63 65 73 73 6f 72 20 6f 66 20 74 68 65 20  uccessor of the 
6000: 74 72 75 6e 6b 20 72 6f 6f 74 2e 20 54 68 69 73  trunk root. This
6010: 20 6c 65 61 64 73 20 74 6f 20 61 0a 09 23 20 20   leads to a..#  
6020: 20 20 20 62 61 64 20 74 61 6e 67 6c 65 20 6c 61     bad tangle la
6030: 74 65 72 20 6f 6e 2e 20 57 69 74 68 20 61 20 64  ter on. With a d
6040: 65 74 61 63 68 65 64 20 4e 54 44 42 20 74 68 65  etached NTDB the
6050: 20 6f 72 69 67 69 6e 61 6c 0a 09 23 20 20 20 20   original..#    
6060: 20 74 72 75 6e 6b 20 72 6f 6f 74 20 72 65 76 69   trunk root revi
6070: 73 69 6f 6e 20 77 61 73 20 72 65 6d 6f 76 65 64  sion was removed
6080: 20 61 73 20 69 72 72 65 6c 65 76 61 6e 74 2c 20   as irrelevant, 
6090: 61 6c 6c 6f 77 69 6e 67 0a 09 23 20 20 20 20 20  allowing..#     
60a0: 74 68 65 20 6e 6f 6d 69 6e 61 6c 20 72 6f 6f 74  the nominal root
60b0: 20 74 6f 20 62 65 20 6c 61 74 65 72 20 69 6e 20   to be later in 
60c0: 74 69 6d 65 20 74 68 61 6e 20 74 68 65 20 4e 54  time than the NT
60d0: 44 42 0a 09 23 20 20 20 20 20 72 6f 6f 74 2e 20  DB..#     root. 
60e0: 4e 6f 77 20 73 65 74 74 69 6e 67 20 74 68 69 73  Now setting this
60f0: 20 64 65 70 65 6e 64 65 6e 63 79 20 77 69 6c 6c   dependency will
6100: 20 62 65 20 62 61 63 6b 77 61 72 64 20 69 6e 0a   be backward in.
6110: 09 23 20 20 20 20 20 74 69 6d 65 2e 20 52 45 4d  .#     time. REM
6120: 4f 56 45 44 2e 0a 09 23 0a 09 23 20 28 34 29 20  OVED...#..# (4) 
6130: 49 66 20 52 20 69 73 20 74 68 65 20 6c 61 73 74  If R is the last
6140: 20 6f 66 20 74 68 65 20 4e 54 44 42 20 72 65 76   of the NTDB rev
6150: 69 73 69 6f 6e 73 20 77 68 69 63 68 20 62 65 6c  isions which bel
6160: 6f 6e 67 20 74 6f 0a 09 23 20 20 20 20 20 74 68  ong to..#     th
6170: 65 20 74 72 75 6e 6b 2c 20 74 68 65 6e 20 74 68  e trunk, then th
6180: 65 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 20  e primary child 
6190: 6f 66 20 74 68 65 20 74 72 75 6e 6b 20 72 6f 6f  of the trunk roo
61a0: 74 20 28 74 68 65 0a 09 23 20 20 20 20 20 27 31  t (the..#     '1
61b0: 2e 32 27 20 72 65 76 69 73 69 6f 6e 29 20 69 73  .2' revision) is
61c0: 20 61 20 73 75 63 63 65 73 73 6f 72 2c 20 69 66   a successor, if
61d0: 20 69 74 20 65 78 69 73 74 73 2e 0a 0a 09 23 20   it exists....# 
61e0: 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 62 72  Note that the br
61f0: 61 6e 63 68 65 73 20 73 70 61 77 6e 65 64 20 66  anches spawned f
6200: 72 6f 6d 20 74 68 65 20 72 65 76 69 73 69 6f 6e  rom the revision
6210: 73 2c 20 61 6e 64 20 74 68 65 0a 09 23 20 74 61  s, and the..# ta
6220: 67 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  gs associated wi
6230: 74 68 20 74 68 65 6d 20 61 72 65 20 73 75 63 63  th them are succ
6240: 65 73 73 6f 72 73 20 61 73 20 77 65 6c 6c 2e 0a  essors as well..
6250: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63  ..foreach {rid c
6260: 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e  hild} [state run
6270: 20 22 0a 20 20 20 2d 2d 20 28 31 29 20 50 72 69   ".   -- (1) Pri
6280: 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20  mary child..    
6290: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e  SELECT R.rid, R.
62a0: 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20  child..    FROM 
62b0: 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20    revision R..  
62c0: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20    WHERE  R.rid  
62d0: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20   IN $theset     
62e0: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72  -- Restrict to r
62f0: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65  evisions of inte
6300: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
6310: 20 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20   R.child IS NOT 
6320: 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70  NULL    -- Has p
6330: 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 20 20 20  rimary child.   
6340: 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32   UNION.    -- (2
6350: 29 20 53 65 63 6f 6e 64 61 72 79 20 28 62 72 61  ) Secondary (bra
6360: 6e 63 68 29 20 63 68 69 6c 64 72 65 6e 0a 09 20  nch) children.. 
6370: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c     SELECT R.rid,
6380: 20 42 2e 62 72 69 64 0a 09 20 20 20 20 46 52 4f   B.brid..    FRO
6390: 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20  M   revision R, 
63a0: 72 65 76 69 73 69 6f 6e 62 72 61 6e 63 68 63 68  revisionbranchch
63b0: 69 6c 64 72 65 6e 20 42 0a 09 20 20 20 20 57 48  ildren B..    WH
63c0: 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20  ERE  R.rid   IN 
63d0: 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52  $theset     -- R
63e0: 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73  estrict to revis
63f0: 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74  ions of interest
6400: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72  ..    AND    R.r
6410: 69 64 20 3d 20 42 2e 72 69 64 20 20 20 20 20 20  id = B.rid      
6420: 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 73 75      -- Select su
6430: 62 73 65 74 20 6f 66 20 62 72 61 6e 63 68 20 63  bset of branch c
6440: 68 69 6c 64 72 65 6e 0a 20 20 20 20 55 4e 49 4f  hildren.    UNIO
6450: 4e 0a 20 20 20 20 2d 2d 20 28 34 29 20 43 68 69  N.    -- (4) Chi
6460: 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74  ld of trunk root
6470: 20 73 75 63 63 65 73 73 6f 72 20 6f 66 20 6c 61   successor of la
6480: 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b  st NTDB on trunk
6490: 2e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e  ...    SELECT R.
64a0: 72 69 64 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20  rid, RA.child.. 
64b0: 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e     FROM revision
64c0: 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 0a   R, revision RA.
64d0: 09 20 20 20 20 57 48 45 52 45 20 52 2e 72 69 64  .    WHERE R.rid
64e0: 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20     IN $theset   
64f0: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74     -- Restrict t
6500: 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69  o revisions of i
6510: 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44  nterest..    AND
6520: 20 20 20 52 2e 69 73 64 65 66 61 75 6c 74 20 20     R.isdefault  
6530: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 52 65             -- Re
6540: 73 74 72 69 63 74 20 74 6f 20 4e 54 44 42 0a 09  strict to NTDB..
6550: 20 20 20 20 41 4e 44 20 20 20 52 2e 64 62 63 68      AND   R.dbch
6560: 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  ild IS NOT NULL 
6570: 20 20 2d 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54    -- and last NT
6580: 44 42 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  DB belonging to 
6590: 74 72 75 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20  trunk..    AND  
65a0: 20 52 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 68   RA.rid = R.dbch
65b0: 69 6c 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 64  ild      -- Go d
65c0: 69 72 65 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b  irectly to trunk
65d0: 20 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20   root..    AND  
65e0: 20 52 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54   RA.child IS NOT
65f0: 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20   NULL    -- Has 
6600: 70 72 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 09  primary child...
6610: 22 5d 20 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73  "] {..    # Cons
6620: 69 64 65 72 20 6d 6f 76 69 6e 67 20 74 68 69 73  ider moving this
6630: 20 74 6f 20 74 68 65 20 69 6e 74 65 67 72 69 74   to the integrit
6640: 79 20 6d 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69  y module...    i
6650: 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20  ntegrity assert 
6660: 7b 24 72 69 64 20 21 3d 20 24 63 68 69 6c 64 7d  {$rid != $child}
6670: 20 7b 52 65 76 69 73 69 6f 6e 20 24 72 69 64 20   {Revision $rid 
6680: 64 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c  depends on itsel
6690: 66 2e 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64  f.}..    lappend
66a0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c   dependencies([l
66b0: 69 73 74 20 72 65 76 20 24 72 69 64 5d 29 20 5b  ist rev $rid]) [
66c0: 6c 69 73 74 20 72 65 76 20 24 63 68 69 6c 64 5d  list rev $child]
66d0: 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 69  ..}..foreach {ri
66e0: 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20  d child} [state 
66f0: 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43  run "..    SELEC
6700: 54 20 52 2e 72 69 64 2c 20 54 2e 74 69 64 0a 09  T R.rid, T.tid..
6710: 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73      FROM   revis
6720: 69 6f 6e 20 52 2c 20 74 61 67 20 54 0a 09 20 20  ion R, tag T..  
6730: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 69    WHERE  R.rid i
6740: 6e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41  n $theset..    A
6750: 4e 44 20 20 20 20 54 2e 72 65 76 20 3d 20 52 2e  ND    T.rev = R.
6760: 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c  rid.."] {..    l
6770: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63  append dependenc
6780: 69 65 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72  ies([list rev $r
6790: 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a  id]) [list sym::
67a0: 74 61 67 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09  tag $child]..}..
67b0: 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68 69  foreach {rid chi
67c0: 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22  ld} [state run "
67d0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
67e0: 69 64 2c 20 42 2e 62 69 64 0a 09 20 20 20 20 46  id, B.bid..    F
67f0: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52  ROM   revision R
6800: 2c 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20 20  , branch B..    
6810: 57 48 45 52 45 20 20 52 2e 72 69 64 20 69 6e 20  WHERE  R.rid in 
6820: 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44  $theset..    AND
6830: 20 20 20 20 42 2e 72 6f 6f 74 20 3d 20 52 2e 72      B.root = R.r
6840: 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61  id.."] {..    la
6850: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69  ppend dependenci
6860: 65 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69  es([list rev $ri
6870: 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62  d]) [list sym::b
6880: 72 61 6e 63 68 20 24 63 68 69 6c 64 5d 0a 09 7d  ranch $child]..}
6890: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
68a0: 20 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20      # var(dv) = 
68b0: 64 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69  dict (item -> li
68c0: 73 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d  st (item)), item
68d0: 20 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69    = list (type i
68e0: 64 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  d).    typemetho
68f0: 64 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 7b  d predecessors {
6900: 64 76 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a  dv revisions} {.
6910: 09 75 70 76 61 72 20 31 20 24 64 76 20 64 65 70  .upvar 1 $dv dep
6920: 65 6e 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74  endencies..set t
6930: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72  heset ('[join $r
6940: 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27  evisions {','}]'
6950: 29 0a 0a 09 23 20 54 68 65 20 66 6f 6c 6c 6f 77  )...# The follow
6960: 69 6e 67 20 63 61 73 65 73 20 73 70 65 63 69 66  ing cases specif
6970: 79 20 77 68 65 6e 20 61 20 72 65 76 69 73 69 6f  y when a revisio
6980: 6e 20 50 20 69 73 20 61 0a 09 23 20 70 72 65 64  n P is a..# pred
6990: 65 63 65 73 73 6f 72 20 6f 66 20 61 20 72 65 76  ecessor of a rev
69a0: 69 73 69 6f 6e 20 52 2e 20 45 61 63 68 20 6f 66  ision R. Each of
69b0: 20 74 68 65 20 63 61 73 65 73 20 74 72 61 6e 73   the cases trans
69c0: 6c 61 74 65 73 0a 09 23 20 69 6e 74 6f 20 6f 6e  lates..# into on
69d0: 65 20 6f 66 20 74 68 65 20 62 72 61 6e 63 68 65  e of the branche
69e0: 73 20 6f 66 20 74 68 65 20 53 51 4c 20 55 4e 49  s of the SQL UNI
69f0: 4f 4e 20 63 6f 6d 69 6e 67 20 62 65 6c 6f 77 2e  ON coming below.
6a00: 0a 09 23 0a 09 23 20 28 31 29 20 54 68 65 20 69  ..#..# (1) The i
6a10: 6d 6d 65 64 69 61 74 65 20 70 61 72 65 6e 74 20  mmediate parent 
6a20: 52 2e 70 61 72 65 6e 74 20 6f 66 20 52 20 69 73  R.parent of R is
6a30: 20 61 20 70 72 65 64 65 63 65 73 73 6f 72 20 6f   a predecessor o
6a40: 66 0a 09 23 20 20 20 20 20 52 2e 20 4e 4f 54 45  f..#     R. NOTE
6a50: 3a 20 54 68 69 73 20 69 73 20 74 72 75 65 20 66  : This is true f
6a60: 6f 72 20 52 20 65 69 74 68 65 72 20 70 72 69 6d  or R either prim
6a70: 61 72 79 20 6f 72 20 73 65 63 6f 6e 64 61 72 79  ary or secondary
6a80: 0a 09 23 20 20 20 20 20 63 68 69 6c 64 20 6f 66  ..#     child of
6a90: 20 50 2e 20 49 74 20 6e 6f 74 20 6e 65 63 65 73   P. It not neces
6aa0: 73 61 72 79 20 74 6f 20 64 69 73 74 69 6e 67 75  sary to distingu
6ab0: 69 73 68 20 74 68 65 20 74 77 6f 0a 09 23 20 20  ish the two..#  
6ac0: 20 20 20 63 61 73 65 73 2c 20 69 6e 20 63 6f 6e     cases, in con
6ad0: 74 72 61 73 74 20 74 6f 20 74 68 65 20 63 6f 64  trast to the cod
6ae0: 65 20 72 65 74 72 69 65 76 69 6e 67 20 74 68 65  e retrieving the
6af0: 20 73 75 63 63 65 73 73 6f 72 0a 09 23 20 20 20   successor..#   
6b00: 20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 09    information...
6b10: 23 0a 09 23 20 28 32 29 20 54 68 65 20 63 6f 6d  #..# (2) The com
6b20: 70 6c 65 6d 65 6e 74 20 6f 66 20 73 75 63 63 65  plement of succe
6b30: 73 73 6f 72 20 63 61 73 65 20 28 33 29 2e 20 54  ssor case (3). T
6b40: 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74 20 69 73  he trunk root is
6b50: 0a 09 23 20 20 20 20 20 61 20 70 72 65 64 65 63  ..#     a predec
6b60: 65 73 73 6f 72 20 6f 66 20 61 20 4e 54 44 42 20  essor of a NTDB 
6b70: 72 6f 6f 74 2e 20 52 45 4d 4f 56 45 44 2e 20 53  root. REMOVED. S
6b80: 65 65 20 27 73 75 63 63 65 73 73 6f 72 73 27 0a  ee 'successors'.
6b90: 09 23 20 20 20 20 20 66 6f 72 20 74 68 65 20 65  .#     for the e
6ba0: 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a 09 23 0a 09  xplanation...#..
6bb0: 23 20 28 33 29 20 54 68 65 20 63 6f 6d 70 6c 65  # (3) The comple
6bc0: 6d 65 6e 74 20 6f 66 20 73 75 63 63 65 73 73 6f  ment of successo
6bd0: 72 20 63 61 73 65 20 28 34 29 2e 20 54 68 65 20  r case (4). The 
6be0: 6c 61 73 74 20 4e 54 44 42 0a 09 23 20 20 20 20  last NTDB..#    
6bf0: 20 72 65 76 69 73 69 6f 6e 20 62 65 6c 6f 6e 67   revision belong
6c00: 69 6e 67 20 74 6f 20 74 68 65 20 74 72 75 6e 6b  ing to the trunk
6c10: 20 69 73 20 61 20 70 72 65 64 65 63 65 73 73 6f   is a predecesso
6c20: 72 20 6f 66 20 74 68 65 0a 09 23 20 20 20 20 20  r of the..#     
6c30: 70 72 69 6d 61 72 79 20 63 68 69 6c 64 20 6f 66  primary child of
6c40: 20 74 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74 20   the trunk root 
6c50: 28 54 68 65 20 27 31 2e 32 27 20 72 65 76 69 73  (The '1.2' revis
6c60: 69 6f 6e 29 2e 0a 0a 09 66 6f 72 65 61 63 68 20  ion)....foreach 
6c70: 7b 72 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 74  {rid parent} [st
6c80: 61 74 65 20 72 75 6e 20 22 0a 20 20 20 2d 2d 20  ate run ".   -- 
6c90: 28 31 29 20 50 72 69 6d 61 72 79 20 70 61 72 65  (1) Primary pare
6ca0: 6e 74 2c 20 63 61 6e 20 62 65 20 69 6e 20 64 69  nt, can be in di
6cb0: 66 66 65 72 65 6e 74 20 4c 4f 44 20 66 6f 72 20  fferent LOD for 
6cc0: 66 69 72 73 74 20 69 6e 20 61 20 62 72 61 6e 63  first in a branc
6cd0: 68 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e  h..    SELECT R.
6ce0: 72 69 64 2c 20 52 2e 70 61 72 65 6e 74 0a 09 20  rid, R.parent.. 
6cf0: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69     FROM   revisi
6d00: 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20  on R..    WHERE 
6d10: 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65   R.rid   IN $the
6d20: 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72  set     -- Restr
6d30: 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73  ict to revisions
6d40: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20   of interest..  
6d50: 20 20 41 4e 44 20 20 20 20 52 2e 70 61 72 65 6e    AND    R.paren
6d60: 74 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  t IS NOT NULL   
6d70: 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 70  -- Has primary p
6d80: 61 72 65 6e 74 0a 20 20 20 20 55 4e 49 4f 4e 0a  arent.    UNION.
6d90: 20 20 20 20 2d 2d 20 28 33 29 20 4c 61 73 74 20      -- (3) Last 
6da0: 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b 20 69 73  NTDB on trunk is
6db0: 20 70 72 65 64 65 63 65 73 73 6f 72 20 6f 66 20   predecessor of 
6dc0: 63 68 69 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72  child of trunk r
6dd0: 6f 6f 74 0a 09 20 20 20 20 53 45 4c 45 43 54 20  oot..    SELECT 
6de0: 52 2e 72 69 64 2c 20 52 41 2e 64 62 70 61 72 65  R.rid, RA.dbpare
6df0: 6e 74 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72  nt..    FROM   r
6e00: 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73  evision R, revis
6e10: 69 6f 6e 20 52 41 0a 09 20 20 20 20 57 48 45 52  ion RA..    WHER
6e20: 45 20 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65  E  R.rid IN $the
6e30: 73 65 74 20 20 20 20 20 20 20 20 20 2d 2d 20 52  set         -- R
6e40: 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73  estrict to revis
6e50: 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74  ions of interest
6e60: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 4e 4f 54  ..    AND    NOT
6e70: 20 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20   R.isdefault    
6e80: 20 20 20 20 20 20 2d 2d 20 6e 6f 74 20 6f 6e 20        -- not on 
6e90: 4e 54 44 42 0a 09 20 20 20 20 41 4e 44 20 20 20  NTDB..    AND   
6ea0: 20 52 2e 70 61 72 65 6e 74 20 49 53 20 4e 4f 54   R.parent IS NOT
6eb0: 20 4e 55 4c 4c 20 20 20 20 20 2d 2d 20 77 68 69   NULL     -- whi
6ec0: 63 68 20 61 72 65 20 6e 6f 74 20 72 6f 6f 74 0a  ch are not root.
6ed0: 09 20 20 20 20 41 4e 44 20 20 20 20 52 41 2e 72  .    AND    RA.r
6ee0: 69 64 20 3d 20 52 2e 70 61 72 65 6e 74 20 20 20  id = R.parent   
6ef0: 20 20 20 20 20 2d 2d 20 67 6f 20 74 6f 20 74 68       -- go to th
6f00: 65 69 72 20 70 61 72 65 6e 74 0a 09 20 20 20 20  eir parent..    
6f10: 41 4e 44 20 20 20 20 52 41 2e 64 62 70 61 72 65  AND    RA.dbpare
6f20: 6e 74 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20  nt IS NOT NULL  
6f30: 2d 2d 20 77 68 69 63 68 20 68 61 73 20 74 6f 20  -- which has to 
6f40: 72 65 66 65 72 20 74 6f 20 4e 54 44 42 27 73 20  refer to NTDB's 
6f50: 72 6f 6f 74 0a 09 22 5d 20 7b 0a 09 20 20 20 20  root.."] {..    
6f60: 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69 6e  # Consider movin
6f70: 67 20 74 68 69 73 20 74 6f 20 74 68 65 20 69 6e  g this to the in
6f80: 74 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e 0a  tegrity module..
6f90: 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61  .    integrity a
6fa0: 73 73 65 72 74 20 7b 24 72 69 64 20 21 3d 20 24  ssert {$rid != $
6fb0: 70 61 72 65 6e 74 7d 20 7b 52 65 76 69 73 69 6f  parent} {Revisio
6fc0: 6e 20 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f  n $rid depends o
6fd0: 6e 20 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20  n itself.}..    
6fe0: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e  lappend dependen
6ff0: 63 69 65 73 28 5b 6c 69 73 74 20 72 65 76 20 24  cies([list rev $
7000: 72 69 64 5d 29 20 5b 6c 69 73 74 20 72 65 76 20  rid]) [list rev 
7010: 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 0a 09 23 20  $parent]..}...# 
7020: 54 68 65 20 72 65 76 69 73 69 6f 6e 73 20 77 68  The revisions wh
7030: 69 63 68 20 61 72 65 20 74 68 65 20 66 69 72 73  ich are the firs
7040: 74 20 6f 6e 20 61 20 62 72 61 6e 63 68 20 68 61  t on a branch ha
7050: 76 65 20 74 68 61 74 0a 09 23 20 62 72 61 6e 63  ve that..# branc
7060: 68 20 61 73 20 74 68 65 69 72 20 70 72 65 64 65  h as their prede
7070: 63 65 73 73 6f 72 2e 20 4e 6f 74 65 20 74 68 61  cessor. Note tha
7080: 74 20 72 65 76 69 73 69 6f 6e 73 20 63 61 6e 6e  t revisions cann
7090: 6f 74 20 62 65 0a 09 23 20 6f 6e 20 74 61 67 73  ot be..# on tags
70a0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 6d 61 6e   in the same man
70b0: 6e 65 72 2c 20 73 6f 20 74 61 67 73 20 63 61 6e  ner, so tags can
70c0: 6e 6f 74 20 62 65 20 70 72 65 64 65 63 65 73 73  not be predecess
70d0: 6f 72 73 0a 09 23 20 6f 66 20 72 65 76 69 73 69  ors..# of revisi
70e0: 6f 6e 73 2e 20 54 68 69 73 20 63 6f 6d 70 6c 65  ons. This comple
70f0: 6d 65 6e 74 73 20 74 68 61 74 20 74 68 65 79 20  ments that they 
7100: 68 61 76 65 20 6e 6f 20 73 75 63 63 65 73 73 6f  have no successo
7110: 72 73 0a 09 23 20 28 53 65 65 20 73 79 6d 3a 3a  rs..# (See sym::
7120: 74 61 67 2f 73 75 63 63 65 73 73 6f 72 73 29 2e  tag/successors).
7130: 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20  ...foreach {rid 
7140: 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72  parent} [state r
7150: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54  un "..    SELECT
7160: 20 52 2e 72 69 64 20 42 2e 62 69 64 0a 09 20 20   R.rid B.bid..  
7170: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f    FROM   revisio
7180: 6e 20 52 2c 20 62 72 61 6e 63 68 20 42 0a 09 20  n R, branch B.. 
7190: 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20     WHERE  R.rid 
71a0: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20  IN $theset..    
71b0: 41 4e 44 20 20 20 20 42 2e 66 69 72 73 74 20 3d  AND    B.first =
71c0: 20 52 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20   R.rid.."] {..  
71d0: 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64    lappend depend
71e0: 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 65 76  encies([list rev
71f0: 20 24 72 69 64 5d 29 20 5b 6c 69 73 74 20 73 79   $rid]) [list sy
7200: 6d 3a 3a 62 72 61 6e 63 68 20 24 70 61 72 65 6e  m::branch $paren
7210: 74 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20  t]..}..return.  
7220: 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23    }.}..# # ## ##
7230: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
7240: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23   ############# #
7250: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7260: 23 23 23 23 0a 23 23 20 48 65 6c 70 65 72 20 73  ####.## Helper s
7270: 69 6e 67 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e  ingleton. Comman
7280: 64 73 20 66 6f 72 20 74 61 67 20 73 79 6d 62 6f  ds for tag symbo
7290: 6c 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73  l changesets...s
72a0: 6e 69 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a  nit::type ::vc::
72b0: 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a  fossil::import::
72c0: 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65  cvs::project::re
72d0: 76 3a 3a 73 79 6d 3a 3a 74 61 67 20 7b 0a 20 20  v::sym::tag {.  
72e0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 72    typemethod byr
72f0: 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74  evision {} { ret
7300: 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65  urn 0 }.    type
7310: 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20  method bysymbol 
7320: 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20    {} { return 1 
7330: 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  }.    typemethod
7340: 20 69 73 74 61 67 20 20 20 20 20 20 7b 7d 20 7b   istag      {} {
7350: 20 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20   return 1 }.    
7360: 74 79 70 65 6d 65 74 68 6f 64 20 69 73 62 72 61  typemethod isbra
7370: 6e 63 68 20 20 20 7b 7d 20 7b 20 72 65 74 75 72  nch   {} { retur
7380: 6e 20 30 20 7d 0a 0a 20 20 20 20 23 20 72 65 73  n 0 }..    # res
7390: 75 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69 6e 74  ult = list (mint
73a0: 69 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a 20 20  ime, maxtime).  
73b0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 74 69 6d    typemethod tim
73c0: 65 72 61 6e 67 65 20 7b 74 61 67 73 7d 20 7b 0a  erange {tags} {.
73d0: 09 23 20 54 68 65 20 72 61 6e 67 65 20 69 73 20  .# The range is 
73e0: 64 65 66 69 6e 65 64 20 61 73 20 74 68 65 20 72  defined as the r
73f0: 61 6e 67 65 20 6f 66 20 74 68 65 20 72 65 76 69  ange of the revi
7400: 73 69 6f 6e 73 20 74 68 65 20 74 61 67 73 0a 09  sions the tags..
7410: 23 20 61 72 65 20 61 74 74 61 63 68 65 64 20 74  # are attached t
7420: 6f 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20  o....set theset 
7430: 28 27 5b 6a 6f 69 6e 20 24 74 61 67 73 20 7b 27  ('[join $tags {'
7440: 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b  ,'}]')..return [
7450: 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20  state run "..   
7460: 20 53 45 4c 45 43 54 20 4d 49 4e 28 52 2e 64 61   SELECT MIN(R.da
7470: 74 65 29 2c 20 4d 41 58 28 52 2e 64 61 74 65 29  te), MAX(R.date)
7480: 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73  ..    FROM revis
7490: 69 6f 6e 20 52 2c 20 74 61 67 20 54 0a 09 20 20  ion R, tag T..  
74a0: 20 20 57 48 45 52 45 20 54 2e 74 69 64 20 49 4e    WHERE T.tid IN
74b0: 20 24 74 68 65 73 65 74 0a 20 20 20 20 20 20 20   $theset.       
74c0: 20 20 20 20 20 41 4e 44 20 20 20 52 2e 72 69 64       AND   R.rid
74d0: 20 3d 20 54 2e 72 65 76 0a 09 22 5d 0a 20 20 20   = T.rev.."].   
74e0: 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76   }..    # var(dv
74f0: 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d  ) = dict (item -
7500: 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c 20  > list (item)), 
7510: 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 79  item  = list (ty
7520: 70 65 20 69 64 29 0a 20 20 20 20 74 79 70 65 6d  pe id).    typem
7530: 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f 72 73  ethod successors
7540: 20 7b 64 76 20 74 61 67 73 7d 20 7b 0a 09 23 20   {dv tags} {..# 
7550: 54 61 67 73 20 68 61 76 65 20 6e 6f 20 73 75 63  Tags have no suc
7560: 63 65 73 73 6f 72 73 2e 0a 09 72 65 74 75 72 6e  cessors...return
7570: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61  .    }..    # va
7580: 72 28 64 76 29 20 3d 20 64 69 63 74 20 28 69 74  r(dv) = dict (it
7590: 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d  em -> list (item
75a0: 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74  )), item  = list
75b0: 20 28 74 79 70 65 20 69 64 29 0a 20 20 20 20 74   (type id).    t
75c0: 79 70 65 6d 65 74 68 6f 64 20 70 72 65 64 65 63  ypemethod predec
75d0: 65 73 73 6f 72 73 20 7b 64 76 20 74 61 67 73 7d  essors {dv tags}
75e0: 20 7b 0a 09 23 20 54 68 65 20 70 72 65 64 65 63   {..# The predec
75f0: 65 73 73 6f 72 73 20 6f 66 20 61 20 74 61 67 20  essors of a tag 
7600: 61 72 65 20 61 6c 6c 20 74 68 65 20 72 65 76 69  are all the revi
7610: 73 69 6f 6e 73 20 74 68 65 20 74 61 67 73 20 61  sions the tags a
7620: 72 65 0a 09 23 20 61 74 74 61 63 68 65 64 20 74  re..# attached t
7630: 6f 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 61 6c  o, as well as al
7640: 6c 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 6f  l the branches o
7650: 72 20 74 61 67 73 20 77 68 69 63 68 20 61 72 65  r tags which are
7660: 0a 09 23 20 74 68 65 69 72 20 70 72 65 66 65 72  ..# their prefer
7670: 65 64 20 70 61 72 65 6e 74 73 2e 0a 0a 09 73 65  ed parents....se
7680: 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e  t theset ('[join
7690: 20 24 74 61 67 73 20 7b 27 2c 27 7d 5d 27 29 0a   $tags {','}]').
76a0: 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 70 61  .foreach {tid pa
76b0: 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e  rent} [state run
76c0: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 54   "..    SELECT T
76d0: 2e 74 69 64 2c 20 52 2e 72 69 64 0a 09 20 20 20  .tid, R.rid..   
76e0: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
76f0: 20 52 2c 20 74 61 67 20 54 0a 09 20 20 20 20 57   R, tag T..    W
7700: 48 45 52 45 20 20 54 2e 74 69 64 20 49 4e 20 24  HERE  T.tid IN $
7710: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20  theset..    AND 
7720: 20 20 20 54 2e 72 65 76 20 3d 20 52 2e 72 69 64     T.rev = R.rid
7730: 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70  .."] {..    lapp
7740: 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73  end dependencies
7750: 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20  ([list sym::tag 
7760: 24 74 69 64 5d 29 20 5b 6c 69 73 74 20 72 65 76  $tid]) [list rev
7770: 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 0a 09 66   $parent]..}...f
7780: 6f 72 65 61 63 68 20 7b 74 69 64 20 70 61 72 65  oreach {tid pare
7790: 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22  nt} [state run "
77a0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 54 2e 74  ..    SELECT T.t
77b0: 69 64 2c 20 42 2e 62 69 64 0a 09 20 20 20 20 46  id, B.bid..    F
77c0: 52 4f 4d 20 20 20 74 61 67 20 54 2c 20 62 72 61  ROM   tag T, bra
77d0: 6e 63 68 20 42 2c 20 70 72 65 66 65 72 65 64 70  nch B, preferedp
77e0: 61 72 65 6e 74 20 50 0a 09 20 20 20 20 57 48 45  arent P..    WHE
77f0: 52 45 20 20 54 2e 74 69 64 20 49 4e 20 24 74 68  RE  T.tid IN $th
7800: 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20  eset..    AND   
7810: 20 54 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a 09   T.sid = P.sid..
7820: 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69 64      AND    P.pid
7830: 20 3d 20 42 2e 73 69 64 0a 09 22 5d 20 7b 0a 09   = B.sid.."] {..
7840: 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65      lappend depe
7850: 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73  ndencies([list s
7860: 79 6d 3a 3a 74 61 67 20 24 74 69 64 5d 29 20 5b  ym::tag $tid]) [
7870: 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68  list sym::branch
7880: 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 0a 09 66   $parent]..}...f
7890: 6f 72 65 61 63 68 20 7b 74 69 64 20 70 61 72 65  oreach {tid pare
78a0: 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22  nt} [state run "
78b0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 54 2e 74  ..    SELECT T.t
78c0: 69 64 2c 20 54 58 2e 74 69 64 0a 09 20 20 20 20  id, TX.tid..    
78d0: 46 52 4f 4d 20 20 20 74 61 67 20 54 2c 20 74 61  FROM   tag T, ta
78e0: 67 20 54 58 2c 20 70 72 65 66 65 72 65 64 70 61  g TX, preferedpa
78f0: 72 65 6e 74 20 50 0a 09 20 20 20 20 57 48 45 52  rent P..    WHER
7900: 45 20 20 54 2e 74 69 64 20 49 4e 20 24 74 68 65  E  T.tid IN $the
7910: 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  set..    AND    
7920: 54 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a 09 20  T.sid = P.sid.. 
7930: 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69 64 20     AND    P.pid 
7940: 3d 20 54 58 2e 73 69 64 0a 09 22 5d 20 7b 0a 09  = TX.sid.."] {..
7950: 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65      lappend depe
7960: 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73  ndencies([list s
7970: 79 6d 3a 3a 74 61 67 20 24 74 69 64 5d 29 20 5b  ym::tag $tid]) [
7980: 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 70  list sym::tag $p
7990: 61 72 65 6e 74 5d 0a 09 7d 0a 09 72 65 74 75 72  arent]..}..retur
79a0: 6e 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23  n.    }.}..# # #
79b0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
79c0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
79d0: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
79e0: 23 23 23 23 23 23 23 23 0a 23 23 20 48 65 6c 70  ########.## Help
79f0: 65 72 20 73 69 6e 67 6c 65 74 6f 6e 2e 20 43 6f  er singleton. Co
7a00: 6d 6d 61 6e 64 73 20 66 6f 72 20 62 72 61 6e 63  mmands for branc
7a10: 68 20 73 79 6d 62 6f 6c 20 63 68 61 6e 67 65 73  h symbol changes
7a20: 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 65  ets...snit::type
7a30: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
7a40: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a  mport::cvs::proj
7a50: 65 63 74 3a 3a 72 65 76 3a 3a 73 79 6d 3a 3a 62  ect::rev::sym::b
7a60: 72 61 6e 63 68 20 7b 0a 20 20 20 20 74 79 70 65  ranch {.    type
7a70: 6d 65 74 68 6f 64 20 62 79 72 65 76 69 73 69 6f  method byrevisio
7a80: 6e 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20  n {} { return 0 
7a90: 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  }.    typemethod
7aa0: 20 62 79 73 79 6d 62 6f 6c 20 20 20 7b 7d 20 7b   bysymbol   {} {
7ab0: 20 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20   return 1 }.    
7ac0: 74 79 70 65 6d 65 74 68 6f 64 20 69 73 74 61 67  typemethod istag
7ad0: 20 20 20 20 20 20 7b 7d 20 7b 20 72 65 74 75 72        {} { retur
7ae0: 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65  n 0 }.    typeme
7af0: 74 68 6f 64 20 69 73 62 72 61 6e 63 68 20 20 20  thod isbranch   
7b00: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a  {} { return 1 }.
7b10: 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20  .    # result = 
7b20: 6c 69 73 74 20 28 6d 69 6e 74 69 6d 65 2c 20 6d  list (mintime, m
7b30: 61 78 74 69 6d 65 29 0a 20 20 20 20 74 79 70 65  axtime).    type
7b40: 6d 65 74 68 6f 64 20 74 69 6d 65 72 61 6e 67 65  method timerange
7b50: 20 7b 62 72 61 6e 63 68 65 73 7d 20 7b 0a 09 23   {branches} {..#
7b60: 20 54 68 65 20 72 61 6e 67 65 20 6f 66 20 61 20   The range of a 
7b70: 62 72 61 6e 63 68 20 69 73 20 64 65 66 69 6e 65  branch is define
7b80: 64 20 61 73 20 74 68 65 20 72 61 6e 67 65 20 6f  d as the range o
7b90: 66 20 74 68 65 0a 09 23 20 72 65 76 69 73 69 6f  f the..# revisio
7ba0: 6e 73 20 74 68 65 20 62 72 61 6e 63 68 65 73 20  ns the branches 
7bb0: 61 72 65 20 73 70 61 77 6e 65 64 20 62 79 2e 20  are spawned by. 
7bc0: 4e 4f 54 45 20 68 6f 77 65 76 65 72 20 74 68 61  NOTE however tha
7bd0: 74 20 74 68 65 0a 09 23 20 62 72 61 6e 63 68 65  t the..# branche
7be0: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
7bf0: 68 20 61 20 64 65 74 61 63 68 65 64 20 4e 54 44  h a detached NTD
7c00: 42 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 72  B will have no r
7c10: 6f 6f 74 0a 09 23 20 73 70 61 77 6e 69 6e 67 20  oot..# spawning 
7c20: 74 68 65 6d 2c 20 68 65 6e 63 65 20 74 68 65 79  them, hence they
7c30: 20 68 61 76 65 20 6e 6f 20 72 65 61 6c 20 74 69   have no real ti
7c40: 6d 65 72 61 6e 67 65 20 61 6e 79 0a 09 23 20 6c  merange any..# l
7c50: 6f 6e 67 65 72 2e 20 42 79 20 75 73 69 6e 67 20  onger. By using 
7c60: 30 20 77 65 20 70 75 74 20 74 68 65 6d 20 69 6e  0 we put them in
7c70: 20 66 72 6f 6e 74 20 6f 66 20 65 76 65 72 79 74   front of everyt
7c80: 68 69 6e 67 20 65 6c 73 65 2c 0a 09 23 20 61 73  hing else,..# as
7c90: 20 74 68 65 79 20 6c 6f 67 69 63 61 6c 6c 79 20   they logically 
7ca0: 61 72 65 2e 0a 0a 09 73 65 74 20 74 68 65 73 65  are....set these
7cb0: 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61 6e 63  t ('[join $branc
7cc0: 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65  hes {','}]')..re
7cd0: 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20  turn [state run 
7ce0: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 49 46  "..    SELECT IF
7cf0: 4e 55 4c 4c 28 4d 49 4e 28 52 2e 64 61 74 65 29  NULL(MIN(R.date)
7d00: 2c 30 29 2c 20 49 46 4e 55 4c 4c 28 4d 41 58 28  ,0), IFNULL(MAX(
7d10: 52 2e 64 61 74 65 29 2c 30 29 0a 09 20 20 20 20  R.date),0)..    
7d20: 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c  FROM revision R,
7d30: 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20 20 57   branch B..    W
7d40: 48 45 52 45 20 42 2e 62 69 64 20 49 4e 20 24 74  HERE B.bid IN $t
7d50: 68 65 73 65 74 0a 20 20 20 20 20 20 20 20 20 20  heset.          
7d60: 20 20 41 4e 44 20 20 20 52 2e 72 69 64 20 3d 20    AND   R.rid = 
7d70: 42 2e 72 6f 6f 74 0a 09 22 5d 0a 20 20 20 20 7d  B.root.."].    }
7d80: 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76 29 20  ..    # var(dv) 
7d90: 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d 3e 20  = dict (item -> 
7da0: 6c 69 73 74 20 28 69 74 65 6d 29 29 2c 20 69 74  list (item)), it
7db0: 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 79 70 65  em  = list (type
7dc0: 20 69 64 29 0a 20 20 20 20 74 79 70 65 6d 65 74   id).    typemet
7dd0: 68 6f 64 20 73 75 63 63 65 73 73 6f 72 73 20 7b  hod successors {
7de0: 64 76 20 62 72 61 6e 63 68 65 73 7d 20 7b 0a 09  dv branches} {..
7df0: 23 20 54 68 65 20 66 69 72 73 74 20 72 65 76 69  # The first revi
7e00: 73 69 6f 6e 20 63 6f 6d 6d 69 74 74 65 64 20 6f  sion committed o
7e10: 6e 20 61 20 62 72 61 6e 63 68 2c 20 61 6e 64 20  n a branch, and 
7e20: 61 6c 6c 20 62 72 61 6e 63 68 65 73 0a 09 23 20  all branches..# 
7e30: 61 6e 64 20 74 61 67 73 20 77 68 69 63 68 20 68  and tags which h
7e40: 61 76 65 20 69 74 20 61 73 20 74 68 65 69 72 20  ave it as their 
7e50: 70 72 65 66 65 72 65 64 20 70 61 72 65 6e 74 20  prefered parent 
7e60: 61 72 65 20 74 68 65 0a 09 23 20 73 75 63 63 65  are the..# succe
7e70: 73 73 6f 72 73 20 6f 66 20 61 20 62 72 61 6e 63  ssors of a branc
7e80: 68 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20  h....set theset 
7e90: 28 27 5b 6a 6f 69 6e 20 24 62 72 61 6e 63 68 65  ('[join $branche
7ea0: 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66 6f 72 65  s {','}]')..fore
7eb0: 61 63 68 20 7b 62 69 64 20 63 68 69 6c 64 7d 20  ach {bid child} 
7ec0: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20  [state run "..  
7ed0: 20 20 53 45 4c 45 43 54 20 42 2e 62 69 64 2c 20    SELECT B.bid, 
7ee0: 52 2e 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20  R.rid..    FROM 
7ef0: 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 62 72    revision R, br
7f00: 61 6e 63 68 20 42 0a 09 20 20 20 20 57 48 45 52  anch B..    WHER
7f10: 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65  E  B.bid IN $the
7f20: 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  set..    AND    
7f30: 42 2e 66 69 72 73 74 20 3d 20 52 2e 72 69 64 0a  B.first = R.rid.
7f40: 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65  ."] {..    lappe
7f50: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28  nd dependencies(
7f60: 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24  [list sym::tag $
7f70: 62 69 64 5d 29 20 5b 6c 69 73 74 20 72 65 76 20  bid]) [list rev 
7f80: 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65  $child]..}..fore
7f90: 61 63 68 20 7b 62 69 64 20 63 68 69 6c 64 7d 20  ach {bid child} 
7fa0: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20  [state run "..  
7fb0: 20 20 53 45 4c 45 43 54 20 42 2e 62 69 64 2c 20    SELECT B.bid, 
7fc0: 42 58 2e 62 69 64 0a 09 20 20 20 20 46 52 4f 4d  BX.bid..    FROM
7fd0: 20 20 20 62 72 61 6e 63 68 20 42 2c 20 62 72 61     branch B, bra
7fe0: 6e 63 68 20 42 58 2c 20 70 72 65 66 65 72 65 64  nch BX, prefered
7ff0: 70 61 72 65 6e 74 20 50 0a 09 20 20 20 20 57 48  parent P..    WH
8000: 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74  ERE  B.bid IN $t
8010: 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20  heset..    AND  
8020: 20 20 42 2e 73 69 64 20 3d 20 50 2e 70 69 64 0a    B.sid = P.pid.
8030: 09 20 20 20 20 41 4e 44 20 20 20 20 42 58 2e 73  .    AND    BX.s
8040: 69 64 20 3d 20 50 2e 73 69 64 0a 09 22 5d 20 7b  id = P.sid.."] {
8050: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65  ..    lappend de
8060: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74  pendencies([list
8070: 20 73 79 6d 3a 3a 74 61 67 20 24 62 69 64 5d 29   sym::tag $bid])
8080: 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e   [list sym::bran
8090: 63 68 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66  ch $child]..}..f
80a0: 6f 72 65 61 63 68 20 7b 62 69 64 20 63 68 69 6c  oreach {bid chil
80b0: 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a  d} [state run ".
80c0: 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62 69  .    SELECT B.bi
80d0: 64 2c 20 54 2e 74 69 64 0a 09 20 20 20 20 46 52  d, T.tid..    FR
80e0: 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20 74  OM   branch B, t
80f0: 61 67 20 54 2c 20 70 72 65 66 65 72 65 64 70 61  ag T, preferedpa
8100: 72 65 6e 74 20 50 0a 09 20 20 20 20 57 48 45 52  rent P..    WHER
8110: 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65  E  B.bid IN $the
8120: 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  set..    AND    
8130: 42 2e 73 69 64 20 3d 20 50 2e 70 69 64 0a 09 20  B.sid = P.pid.. 
8140: 20 20 20 41 4e 44 20 20 20 20 54 2e 73 69 64 20     AND    T.sid 
8150: 3d 20 50 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 20  = P.sid.."] {.. 
8160: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e     lappend depen
8170: 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79  dencies([list sy
8180: 6d 3a 3a 74 61 67 20 24 62 69 64 5d 29 20 5b 6c  m::tag $bid]) [l
8190: 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 63 68  ist sym::tag $ch
81a0: 69 6c 64 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a  ild]..}..return.
81b0: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72      }..    # var
81c0: 28 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 65  (dv) = dict (ite
81d0: 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29  m -> list (item)
81e0: 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20  ), item  = list 
81f0: 28 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 79  (type id).    ty
8200: 70 65 6d 65 74 68 6f 64 20 70 72 65 64 65 63 65  pemethod predece
8210: 73 73 6f 72 73 20 7b 64 76 20 62 72 61 6e 63 68  ssors {dv branch
8220: 65 73 7d 20 7b 0a 09 23 20 54 68 65 20 70 72 65  es} {..# The pre
8230: 64 65 63 65 73 73 6f 72 73 20 6f 66 20 61 20 62  decessors of a b
8240: 72 61 6e 63 68 20 61 72 65 20 61 6c 6c 20 74 68  ranch are all th
8250: 65 20 72 65 76 69 73 69 6f 6e 73 20 74 68 65 0a  e revisions the.
8260: 09 23 20 62 72 61 6e 63 68 65 73 20 61 72 65 20  .# branches are 
8270: 73 70 61 77 6e 65 64 20 66 72 6f 6d 2c 20 61 73  spawned from, as
8280: 20 77 65 6c 6c 20 61 73 20 61 6c 6c 20 74 68 65   well as all the
8290: 20 62 72 61 6e 63 68 65 73 20 6f 72 0a 09 23 20   branches or..# 
82a0: 74 61 67 73 20 77 68 69 63 68 20 61 72 65 20 74  tags which are t
82b0: 68 65 69 72 20 70 72 65 66 65 72 65 64 20 70 61  heir prefered pa
82c0: 72 65 6e 74 73 2e 0a 0a 09 73 65 74 20 74 68 65  rents....set the
82d0: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 74 61 67  set ('[join $tag
82e0: 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66 6f 72 65  s {','}]')..fore
82f0: 61 63 68 20 7b 62 69 64 20 70 61 72 65 6e 74 7d  ach {bid parent}
8300: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20   [state run ".. 
8310: 20 20 20 53 45 4c 45 43 54 20 42 2e 42 69 64 2c     SELECT B.Bid,
8320: 20 52 2e 72 69 64 0a 09 20 20 20 20 46 52 4f 4d   R.rid..    FROM
8330: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 62     revision R, b
8340: 72 61 6e 63 68 20 42 0a 09 20 20 20 20 57 48 45  ranch B..    WHE
8350: 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68  RE  B.bid IN $th
8360: 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20  eset..    AND   
8370: 20 42 2e 72 6f 6f 74 20 3d 20 52 2e 72 69 64 0a   B.root = R.rid.
8380: 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65  ."] {..    lappe
8390: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28  nd dependencies(
83a0: 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63  [list sym::branc
83b0: 68 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 20 72  h $bid]) [list r
83c0: 65 76 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 09  ev $parent]..}..
83d0: 66 6f 72 65 61 63 68 20 7b 62 69 64 20 70 61 72  foreach {bid par
83e0: 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20  ent} [state run 
83f0: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e  "..    SELECT B.
8400: 62 69 64 2c 20 42 58 2e 62 69 64 0a 09 20 20 20  bid, BX.bid..   
8410: 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42   FROM   branch B
8420: 2c 20 62 72 61 6e 63 68 20 42 58 2c 20 70 72 65  , branch BX, pre
8430: 66 65 72 65 64 70 61 72 65 6e 74 20 50 0a 09 20  feredparent P.. 
8440: 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20     WHERE  B.bid 
8450: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20  IN $theset..    
8460: 41 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50  AND    B.sid = P
8470: 2e 73 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20  .sid..    AND   
8480: 20 50 2e 70 69 64 20 3d 20 42 58 2e 73 69 64 0a   P.pid = BX.sid.
8490: 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65  ."] {..    lappe
84a0: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28  nd dependencies(
84b0: 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63  [list sym::branc
84c0: 68 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 20 73  h $bid]) [list s
84d0: 79 6d 3a 3a 62 72 61 6e 63 68 20 24 70 61 72 65  ym::branch $pare
84e0: 6e 74 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20  nt]..}..foreach 
84f0: 7b 62 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 74  {bid parent} [st
8500: 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53  ate run "..    S
8510: 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 54 2e 74  ELECT B.bid, T.t
8520: 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62  id..    FROM   b
8530: 72 61 6e 63 68 20 42 2c 20 74 61 67 20 54 2c 20  ranch B, tag T, 
8540: 70 72 65 66 65 72 65 64 70 61 72 65 6e 74 20 50  preferedparent P
8550: 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 74  ..    WHERE  B.t
8560: 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20  id IN $theset.. 
8570: 20 20 20 41 4e 44 20 20 20 20 42 2e 73 69 64 20     AND    B.sid 
8580: 3d 20 50 2e 73 69 64 0a 09 20 20 20 20 41 4e 44  = P.sid..    AND
8590: 20 20 20 20 50 2e 70 69 64 20 3d 20 54 2e 73 69      P.pid = T.si
85a0: 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70  d.."] {..    lap
85b0: 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65  pend dependencie
85c0: 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61  s([list sym::bra
85d0: 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c 69 73 74  nch $bid]) [list
85e0: 20 73 79 6d 3a 3a 74 61 67 20 24 70 61 72 65 6e   sym::tag $paren
85f0: 74 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20  t]..}..return.  
8600: 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20    }..    # # ## 
8610: 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23  ### ##### ######
8620: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
8630: 0a 20 20 20 20 23 23 20 43 6f 6e 66 69 67 75 72  .    ## Configur
8640: 61 74 69 6f 6e 0a 0a 20 20 20 20 70 72 61 67 6d  ation..    pragm
8650: 61 20 2d 68 61 73 69 6e 73 74 61 6e 63 65 73 20  a -hasinstances 
8660: 20 20 6e 6f 20 3b 20 23 20 73 69 6e 67 6c 65 74    no ; # singlet
8670: 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68  on.    pragma -h
8680: 61 73 74 79 70 65 69 6e 66 6f 20 20 20 20 6e 6f  astypeinfo    no
8690: 20 3b 20 23 20 6e 6f 20 69 6e 74 72 6f 73 70 65   ; # no introspe
86a0: 63 74 69 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61  ction.    pragma
86b0: 20 2d 68 61 73 74 79 70 65 64 65 73 74 72 6f 79   -hastypedestroy
86c0: 20 6e 6f 20 3b 20 23 20 69 6d 6d 6f 72 74 61 6c   no ; # immortal
86d0: 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23  .}..# # ## ### #
86e0: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23  #### ######## ##
86f0: 23 23 23 23 23 23 23 23 23 23 23 20 23 23 23 23  ########### ####
8700: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8710: 23 0a 23 23 0a 0a 6e 61 6d 65 73 70 61 63 65 20  #.##..namespace 
8720: 65 76 61 6c 20 3a 3a 76 63 3a 3a 66 6f 73 73 69  eval ::vc::fossi
8730: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a  l::import::cvs::
8740: 70 72 6f 6a 65 63 74 20 7b 0a 20 20 20 20 6e 61  project {.    na
8750: 6d 65 73 70 61 63 65 20 65 78 70 6f 72 74 20 72  mespace export r
8760: 65 76 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65  ev.    namespace
8770: 20 65 76 61 6c 20 72 65 76 20 7b 0a 09 6e 61 6d   eval rev {..nam
8780: 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a  espace import ::
8790: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f  vc::fossil::impo
87a0: 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09  rt::cvs::state..
87b0: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74  namespace import
87c0: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
87d0: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e 74 65  mport::cvs::inte
87e0: 67 72 69 74 79 0a 09 6e 61 6d 65 73 70 61 63 65  grity..namespace
87f0: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f   import ::vc::to
8800: 6f 6c 73 3a 3a 6d 69 73 63 3a 3a 2a 0a 09 6e 61  ols::misc::*..na
8810: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
8820: 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 74 72 6f 75  :vc::tools::trou
8830: 62 6c 65 0a 09 6e 61 6d 65 73 70 61 63 65 20 69  ble..namespace i
8840: 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c  mport ::vc::tool
8850: 73 3a 3a 6c 6f 67 0a 09 6c 6f 67 20 72 65 67 69  s::log..log regi
8860: 73 74 65 72 20 63 73 65 74 73 0a 0a 09 23 20 53  ster csets...# S
8870: 65 74 20 75 70 20 74 68 65 20 68 65 6c 70 65 72  et up the helper
8880: 20 73 69 6e 67 6c 65 74 6f 6e 73 0a 09 6e 61 6d   singletons..nam
8890: 65 73 70 61 63 65 20 65 76 61 6c 20 72 65 76 20  espace eval rev 
88a0: 7b 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65  {..    namespace
88b0: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f   import ::vc::fo
88c0: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
88d0: 73 3a 3a 73 74 61 74 65 0a 09 20 20 20 20 6e 61  s::state..    na
88e0: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
88f0: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70  :vc::fossil::imp
8900: 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e 74 65 67 72  ort::cvs::integr
8910: 69 74 79 0a 09 7d 0a 09 6e 61 6d 65 73 70 61 63  ity..}..namespac
8920: 65 20 65 76 61 6c 20 73 79 6d 3a 3a 74 61 67 20  e eval sym::tag 
8930: 7b 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65  {..    namespace
8940: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f   import ::vc::fo
8950: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
8960: 73 3a 3a 73 74 61 74 65 0a 09 20 20 20 20 6e 61  s::state..    na
8970: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
8980: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70  :vc::fossil::imp
8990: 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e 74 65 67 72  ort::cvs::integr
89a0: 69 74 79 0a 09 7d 0a 09 6e 61 6d 65 73 70 61 63  ity..}..namespac
89b0: 65 20 65 76 61 6c 20 73 79 6d 3a 3a 62 72 61 6e  e eval sym::bran
89c0: 63 68 20 7b 0a 09 20 20 20 20 6e 61 6d 65 73 70  ch {..    namesp
89d0: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a  ace import ::vc:
89e0: 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a  :fossil::import:
89f0: 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09 20 20 20  :cvs::state..   
8a00: 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72   namespace impor
8a10: 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a  t ::vc::fossil::
8a20: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e 74  import::cvs::int
8a30: 65 67 72 69 74 79 0a 09 7d 0a 20 20 20 20 7d 0a  egrity..}.    }.
8a40: 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23 23  }..# # ## ### ##
8a50: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23  ### ######## ###
8a60: 23 23 23 23 23 23 23 23 23 23 20 23 23 23 23 23  ########## #####
8a70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8a80: 0a 23 23 20 52 65 61 64 79 0a 0a 70 61 63 6b 61  .## Ready..packa
8a90: 67 65 20 70 72 6f 76 69 64 65 20 76 63 3a 3a 66  ge provide vc::f
8aa0: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63  ossil::import::c
8ab0: 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76  vs::project::rev
8ac0: 20 31 2e 30 0a 72 65 74 75 72 6e 0a               1.0.return.