Hex Artifact Content
Not logged in

Artifact f84e4346da96f68ff6ad4b4181a0d5ceb2ac711e:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [61829b076b] - Renamed changeset method to describe modified results, and updated the one invoker by aku on 2007-11-29 07:58:14.

0000: 23 23 20 2d 2a 2d 20 74 63 6c 20 2d 2a 2d 0a 23  ## -*- tcl -*-.#
0010: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20   # ## ### ##### 
0020: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
0030: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
0040: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20  ############.## 
0050: 43 6f 70 79 72 69 67 68 74 20 28 63 29 20 32 30  Copyright (c) 20
0060: 30 37 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69  07 Andreas Kupri
0070: 65 73 2e 0a 23 0a 23 20 54 68 69 73 20 73 6f 66  es..#.# This sof
0080: 74 77 61 72 65 20 69 73 20 6c 69 63 65 6e 73 65  tware is license
0090: 64 20 61 73 20 64 65 73 63 72 69 62 65 64 20 69  d as described i
00a0: 6e 20 74 68 65 20 66 69 6c 65 20 4c 49 43 45 4e  n the file LICEN
00b0: 53 45 2c 20 77 68 69 63 68 0a 23 20 79 6f 75 20  SE, which.# you 
00c0: 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65 63 65  should have rece
00d0: 69 76 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ived as part of 
00e0: 74 68 69 73 20 64 69 73 74 72 69 62 75 74 69 6f  this distributio
00f0: 6e 2e 0a 23 0a 23 20 54 68 69 73 20 73 6f 66 74  n..#.# This soft
0100: 77 61 72 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  ware consists of
0110: 20 76 6f 6c 75 6e 74 61 72 79 20 63 6f 6e 74 72   voluntary contr
0120: 69 62 75 74 69 6f 6e 73 20 6d 61 64 65 20 62 79  ibutions made by
0130: 20 6d 61 6e 79 0a 23 20 69 6e 64 69 76 69 64 75   many.# individu
0140: 61 6c 73 2e 20 20 46 6f 72 20 65 78 61 63 74 20  als.  For exact 
0150: 63 6f 6e 74 72 69 62 75 74 69 6f 6e 20 68 69 73  contribution his
0160: 74 6f 72 79 2c 20 73 65 65 20 74 68 65 20 72 65  tory, see the re
0170: 76 69 73 69 6f 6e 0a 23 20 68 69 73 74 6f 72 79  vision.# history
0180: 20 61 6e 64 20 6c 6f 67 73 2c 20 61 76 61 69 6c   and logs, avail
0190: 61 62 6c 65 20 61 74 20 68 74 74 70 3a 2f 2f 66  able at http://f
01a0: 6f 73 73 69 6c 2d 73 63 6d 2e 68 77 61 63 69 2e  ossil-scm.hwaci.
01b0: 63 6f 6d 2f 66 6f 73 73 69 6c 0a 23 20 23 20 23  com/fossil.# # #
01c0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
01d0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
01e0: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
01f0: 23 23 23 23 23 23 23 23 0a 0a 23 23 20 52 65 76  ########..## Rev
0200: 69 73 69 6f 6e 73 20 70 65 72 20 70 72 6f 6a 65  isions per proje
0210: 63 74 2c 20 61 6b 61 20 43 68 61 6e 67 65 73 65  ct, aka Changese
0220: 74 73 2e 20 54 68 65 73 65 20 6f 62 6a 65 63 74  ts. These object
0230: 73 20 61 72 65 20 66 69 72 73 74 20 75 73 65 64  s are first used
0240: 0a 23 23 20 69 6e 20 70 61 73 73 20 35 2c 20 77  .## in pass 5, w
0250: 68 69 63 68 20 63 72 65 61 74 65 73 20 74 68 65  hich creates the
0260: 20 69 6e 69 74 69 61 6c 20 73 65 74 20 63 6f 76   initial set cov
0270: 65 72 69 6e 67 20 74 68 65 20 72 65 70 6f 73 69  ering the reposi
0280: 74 6f 72 79 2e 0a 0a 23 20 23 20 23 23 20 23 23  tory...# # ## ##
0290: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
02a0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23   ############# #
02b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02c0: 23 23 23 23 0a 23 23 20 52 65 71 75 69 72 65 6d  ####.## Requirem
02d0: 65 6e 74 73 0a 0a 70 61 63 6b 61 67 65 20 72 65  ents..package re
02e0: 71 75 69 72 65 20 54 63 6c 20 38 2e 34 20 20 20  quire Tcl 8.4   
02f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0300: 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23 20              ; # 
0310: 52 65 71 75 69 72 65 64 20 72 75 6e 74 69 6d 65  Required runtime
0320: 2e 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72  ..package requir
0330: 65 20 73 6e 69 74 20 20 20 20 20 20 20 20 20 20  e snit          
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0350: 20 20 20 20 20 20 20 20 3b 20 23 20 4f 4f 20 73          ; # OO s
0360: 79 73 74 65 6d 2e 0a 70 61 63 6b 61 67 65 20 72  ystem..package r
0370: 65 71 75 69 72 65 20 76 63 3a 3a 74 6f 6f 6c 73  equire vc::tools
0380: 3a 3a 6d 69 73 63 20 20 20 20 20 20 20 20 20 20  ::misc          
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23               ; #
03a0: 20 54 65 78 74 20 66 6f 72 6d 61 74 74 69 6e 67   Text formatting
03b0: 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65  .package require
03c0: 20 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 74 72 6f 75   vc::tools::trou
03d0: 62 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 20  ble             
03e0: 20 20 20 20 20 20 20 3b 20 23 20 45 72 72 6f 72         ; # Error
03f0: 20 72 65 70 6f 72 74 69 6e 67 2e 0a 70 61 63 6b   reporting..pack
0400: 61 67 65 20 72 65 71 75 69 72 65 20 76 63 3a 3a  age require vc::
0410: 74 6f 6f 6c 73 3a 3a 6c 6f 67 20 20 20 20 20 20  tools::log      
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0430: 20 20 3b 20 23 20 55 73 65 72 20 66 65 65 64 62    ; # User feedb
0440: 61 63 6b 2e 0a 70 61 63 6b 61 67 65 20 72 65 71  ack..package req
0450: 75 69 72 65 20 76 63 3a 3a 66 6f 73 73 69 6c 3a  uire vc::fossil:
0460: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74  :import::cvs::st
0470: 61 74 65 20 20 20 20 20 20 20 20 3b 20 23 20 53  ate        ; # S
0480: 74 61 74 65 20 73 74 6f 72 61 67 65 2e 0a 70 61  tate storage..pa
0490: 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 76 63  ckage require vc
04a0: 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74  ::fossil::import
04b0: 3a 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79  ::cvs::integrity
04c0: 20 20 20 20 3b 20 23 20 53 74 61 74 65 20 69 6e      ; # State in
04d0: 74 65 67 72 69 74 79 20 63 68 65 63 6b 73 2e 0a  tegrity checks..
04e0: 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23  .# # ## ### ####
04f0: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
0500: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
0510: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23  ##############.#
0520: 23 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20 3a 3a  #..snit::type ::
0530: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f  vc::fossil::impo
0540: 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74  rt::cvs::project
0550: 3a 3a 72 65 76 20 7b 0a 20 20 20 20 23 20 23 20  ::rev {.    # # 
0560: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
0570: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
0580: 23 23 23 0a 20 20 20 20 23 23 20 50 75 62 6c 69  ###.    ## Publi
0590: 63 20 41 50 49 0a 0a 20 20 20 20 63 6f 6e 73 74  c API..    const
05a0: 72 75 63 74 6f 72 20 7b 70 72 6f 6a 65 63 74 20  ructor {project 
05b0: 63 73 74 79 70 65 20 73 72 63 69 64 20 69 74 65  cstype srcid ite
05c0: 6d 73 20 7b 74 68 65 69 64 20 7b 7d 7d 7d 20 7b  ms {theid {}}} {
05d0: 0a 09 69 66 20 7b 24 74 68 65 69 64 20 6e 65 20  ..if {$theid ne 
05e0: 22 22 7d 20 7b 0a 09 20 20 20 20 73 65 74 20 6d  ""} {..    set m
05f0: 79 69 64 20 24 74 68 65 69 64 0a 09 7d 20 65 6c  yid $theid..} el
0600: 73 65 20 7b 0a 09 20 20 20 20 73 65 74 20 6d 79  se {..    set my
0610: 69 64 20 5b 69 6e 63 72 20 6d 79 63 6f 75 6e 74  id [incr mycount
0620: 65 72 5d 0a 09 7d 0a 0a 09 69 6e 74 65 67 72 69  er]..}...integri
0630: 74 79 20 61 73 73 65 72 74 20 7b 5b 69 6e 66 6f  ty assert {[info
0640: 20 65 78 69 73 74 73 20 6d 79 63 73 74 79 70 65   exists mycstype
0650: 28 24 63 73 74 79 70 65 29 5d 7d 20 7b 42 61 64  ($cstype)]} {Bad
0660: 20 63 68 61 6e 67 65 73 65 74 20 74 79 70 65 20   changeset type 
0670: 27 24 63 73 74 79 70 65 27 2e 7d 0a 0a 09 73 65  '$cstype'.}...se
0680: 74 20 6d 79 70 72 6f 6a 65 63 74 20 20 20 24 70  t myproject   $p
0690: 72 6f 6a 65 63 74 0a 09 73 65 74 20 6d 79 74 79  roject..set myty
06a0: 70 65 20 20 20 20 20 20 24 63 73 74 79 70 65 0a  pe      $cstype.
06b0: 09 73 65 74 20 6d 79 74 79 70 65 6f 62 6a 20 20  .set mytypeobj  
06c0: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
06d0: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a  mport::cvs::proj
06e0: 65 63 74 3a 3a 72 65 76 3a 3a 24 7b 63 73 74 79  ect::rev::${csty
06f0: 70 65 7d 0a 09 73 65 74 20 6d 79 73 72 63 69 64  pe}..set mysrcid
0700: 09 24 73 72 63 69 64 0a 09 73 65 74 20 6d 79 69  .$srcid..set myi
0710: 74 65 6d 73 20 20 20 20 20 24 69 74 65 6d 73 0a  tems     $items.
0720: 09 73 65 74 20 6d 79 70 6f 73 20 20 20 20 20 20  .set mypos      
0730: 20 7b 7d 20 3b 20 23 20 43 6f 6d 6d 69 74 20 6c   {} ; # Commit l
0740: 6f 63 61 74 69 6f 6e 20 69 73 20 6e 6f 74 20 6b  ocation is not k
0750: 6e 6f 77 6e 20 79 65 74 2e 0a 0a 09 23 20 4b 65  nown yet....# Ke
0760: 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20  ep track of the 
0770: 67 65 6e 65 72 61 74 65 64 20 63 68 61 6e 67 65  generated change
0780: 73 65 74 73 20 61 6e 64 20 6f 66 20 74 68 65 20  sets and of the 
0790: 69 6e 76 65 72 73 65 0a 09 23 20 6d 61 70 70 69  inverse..# mappi
07a0: 6e 67 20 66 72 6f 6d 20 69 74 65 6d 73 20 74 6f  ng from items to
07b0: 20 74 68 65 6d 2e 0a 09 6c 61 70 70 65 6e 64 20   them...lappend 
07c0: 6d 79 63 68 61 6e 67 65 73 65 74 73 20 20 20 24  mychangesets   $
07d0: 73 65 6c 66 0a 09 73 65 74 20 20 20 20 20 6d 79  self..set     my
07e0: 69 64 6d 61 70 28 24 6d 79 69 64 29 20 24 73 65  idmap($myid) $se
07f0: 6c 66 0a 09 66 6f 72 65 61 63 68 20 69 69 64 20  lf..foreach iid 
0800: 24 69 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65  $items {..    se
0810: 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 63 73 74  t key [list $cst
0820: 79 70 65 20 24 69 69 64 5d 0a 09 20 20 20 20 73  ype $iid]..    s
0830: 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24 6b 65  et myitemmap($ke
0840: 79 29 20 24 73 65 6c 66 0a 09 20 20 20 20 6c 61  y) $self..    la
0850: 70 70 65 6e 64 20 6d 79 74 69 74 65 6d 73 20 24  ppend mytitems $
0860: 6b 65 79 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20  key..}..return. 
0870: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64     }..    method
0880: 20 73 74 72 20 7b 7d 20 7b 0a 09 73 65 74 20 73   str {} {..set s
0890: 74 72 20 20 20 20 22 3c 22 0a 09 73 65 74 20 64  tr    "<"..set d
08a0: 65 74 61 69 6c 20 22 22 0a 09 69 66 20 7b 5b 24  etail ""..if {[$
08b0: 6d 79 74 79 70 65 6f 62 6a 20 62 79 73 79 6d 62  mytypeobj bysymb
08c0: 6f 6c 5d 7d 20 7b 0a 09 20 20 20 20 73 65 74 20  ol]} {..    set 
08d0: 64 65 74 61 69 6c 20 22 20 27 5b 73 74 61 74 65  detail " '[state
08e0: 20 6f 6e 65 20 7b 0a 09 09 53 45 4c 45 43 54 20   one {...SELECT 
08f0: 53 2e 6e 61 6d 65 0a 09 09 46 52 4f 4d 20 20 20  S.name...FROM   
0900: 73 79 6d 62 6f 6c 20 53 0a 09 09 57 48 45 52 45  symbol S...WHERE
0910: 20 20 53 2e 73 69 64 20 3d 20 24 6d 79 73 72 63    S.sid = $mysrc
0920: 69 64 0a 09 20 20 20 20 7d 5d 27 22 0a 09 7d 0a  id..    }]'"..}.
0930: 09 61 70 70 65 6e 64 20 73 74 72 20 22 24 6d 79  .append str "$my
0940: 74 79 70 65 20 24 7b 6d 79 69 64 7d 24 7b 64 65  type ${myid}${de
0950: 74 61 69 6c 7d 3e 22 0a 09 72 65 74 75 72 6e 20  tail}>"..return 
0960: 24 73 74 72 0a 20 20 20 20 7d 0a 0a 20 20 20 20  $str.    }..    
0970: 6d 65 74 68 6f 64 20 69 64 20 20 20 20 7b 7d 20  method id    {} 
0980: 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 64 20 7d  { return $myid }
0990: 0a 20 20 20 20 6d 65 74 68 6f 64 20 69 74 65 6d  .    method item
09a0: 73 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d  s {} { return $m
09b0: 79 74 69 74 65 6d 73 20 7d 0a 20 20 20 20 6d 65  ytitems }.    me
09c0: 74 68 6f 64 20 64 61 74 61 20 20 7b 7d 20 7b 20  thod data  {} { 
09d0: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 6d 79  return [list $my
09e0: 70 72 6f 6a 65 63 74 20 24 6d 79 74 79 70 65 20  project $mytype 
09f0: 24 6d 79 73 72 63 69 64 5d 20 7d 0a 0a 20 20 20  $mysrcid] }..   
0a00: 20 64 65 6c 65 67 61 74 65 20 6d 65 74 68 6f 64   delegate method
0a10: 20 62 79 73 79 6d 62 6f 6c 20 20 20 74 6f 20 6d   bysymbol   to m
0a20: 79 74 79 70 65 6f 62 6a 0a 20 20 20 20 64 65 6c  ytypeobj.    del
0a30: 65 67 61 74 65 20 6d 65 74 68 6f 64 20 62 79 72  egate method byr
0a40: 65 76 69 73 69 6f 6e 20 74 6f 20 6d 79 74 79 70  evision to mytyp
0a50: 65 6f 62 6a 0a 20 20 20 20 64 65 6c 65 67 61 74  eobj.    delegat
0a60: 65 20 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63  e method isbranc
0a70: 68 20 20 20 74 6f 20 6d 79 74 79 70 65 6f 62 6a  h   to mytypeobj
0a80: 0a 20 20 20 20 64 65 6c 65 67 61 74 65 20 6d 65  .    delegate me
0a90: 74 68 6f 64 20 69 73 74 61 67 20 20 20 20 20 20  thod istag      
0aa0: 74 6f 20 6d 79 74 79 70 65 6f 62 6a 0a 0a 20 20  to mytypeobj..  
0ab0: 20 20 6d 65 74 68 6f 64 20 73 65 74 70 6f 73 20    method setpos 
0ac0: 7b 70 7d 20 7b 20 73 65 74 20 6d 79 70 6f 73 20  {p} { set mypos 
0ad0: 24 70 20 3b 20 72 65 74 75 72 6e 20 7d 0a 20 20  $p ; return }.  
0ae0: 20 20 6d 65 74 68 6f 64 20 70 6f 73 20 20 20 20    method pos    
0af0: 7b 7d 20 20 7b 20 72 65 74 75 72 6e 20 24 6d 79  {}  { return $my
0b00: 70 6f 73 20 7d 0a 0a 20 20 20 20 23 20 72 65 73  pos }..    # res
0b10: 75 6c 74 20 3d 20 64 69 63 74 20 28 69 74 65 6d  ult = dict (item
0b20: 20 2d 3e 20 6c 69 73 74 20 28 63 68 61 6e 67 65   -> list (change
0b30: 73 65 74 29 29 0a 20 20 20 20 6d 65 74 68 6f 64  set)).    method
0b40: 20 73 75 63 63 65 73 73 6f 72 6d 61 70 20 7b 7d   successormap {}
0b50: 20 7b 0a 09 23 20 4e 4f 54 45 20 2f 20 46 55 54   {..# NOTE / FUT
0b60: 55 52 45 3a 20 50 6f 73 73 69 62 6c 65 20 62 6f  URE: Possible bo
0b70: 74 74 6c 65 6e 65 63 6b 2e 0a 09 61 72 72 61 79  ttleneck...array
0b80: 20 73 65 74 20 74 6d 70 20 7b 7d 0a 09 66 6f 72   set tmp {}..for
0b90: 65 61 63 68 20 7b 72 65 76 20 63 68 69 6c 64 72  each {rev childr
0ba0: 65 6e 7d 20 5b 24 73 65 6c 66 20 6e 65 78 74 6d  en} [$self nextm
0bb0: 61 70 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65 61  ap] {..    forea
0bc0: 63 68 20 63 68 69 6c 64 20 24 63 68 69 6c 64 72  ch child $childr
0bd0: 65 6e 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 74  en {...lappend t
0be0: 6d 70 28 24 72 65 76 29 20 24 6d 79 69 74 65 6d  mp($rev) $myitem
0bf0: 6d 61 70 28 24 63 68 69 6c 64 29 0a 09 20 20 20  map($child)..   
0c00: 20 7d 0a 09 20 20 20 20 73 65 74 20 74 6d 70 28   }..    set tmp(
0c10: 24 72 65 76 29 20 5b 6c 73 6f 72 74 20 2d 75 6e  $rev) [lsort -un
0c20: 69 71 75 65 20 24 74 6d 70 28 24 72 65 76 29 5d  ique $tmp($rev)]
0c30: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b 61 72 72  ..}..return [arr
0c40: 61 79 20 67 65 74 20 74 6d 70 5d 0a 20 20 20 20  ay get tmp].    
0c50: 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20  }..    # result 
0c60: 3d 20 6c 69 73 74 20 28 63 68 61 6e 67 65 73 65  = list (changese
0c70: 74 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 75  t).    method su
0c80: 63 63 65 73 73 6f 72 73 20 7b 7d 20 7b 0a 09 23  ccessors {} {..#
0c90: 20 4e 4f 54 45 20 2f 20 46 55 54 55 52 45 3a 20   NOTE / FUTURE: 
0ca0: 50 6f 73 73 69 62 6c 65 20 62 6f 74 74 6c 65 6e  Possible bottlen
0cb0: 65 63 6b 2e 0a 09 73 65 74 20 63 73 65 74 73 20  eck...set csets 
0cc0: 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 5f 20 63  {}..foreach {_ c
0cd0: 68 69 6c 64 72 65 6e 7d 20 5b 24 73 65 6c 66 20  hildren} [$self 
0ce0: 6e 65 78 74 6d 61 70 5d 20 7b 0a 09 20 20 20 20  nextmap] {..    
0cf0: 66 6f 72 65 61 63 68 20 63 68 69 6c 64 20 24 63  foreach child $c
0d00: 68 69 6c 64 72 65 6e 20 7b 0a 09 09 6c 61 70 70  hildren {...lapp
0d10: 65 6e 64 20 63 73 65 74 73 20 24 6d 79 69 74 65  end csets $myite
0d20: 6d 6d 61 70 28 24 63 68 69 6c 64 29 0a 09 20 20  mmap($child)..  
0d30: 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b    }..}..return [
0d40: 6c 73 6f 72 74 20 2d 75 6e 69 71 75 65 20 24 63  lsort -unique $c
0d50: 73 65 74 73 5d 0a 20 20 20 20 7d 0a 0a 20 20 20  sets].    }..   
0d60: 20 23 20 72 65 73 75 6c 74 20 3d 20 64 69 63 74   # result = dict
0d70: 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28   (item -> list (
0d80: 63 68 61 6e 67 65 73 65 74 29 29 0a 20 20 20 20  changeset)).    
0d90: 6d 65 74 68 6f 64 20 70 72 65 64 65 63 65 73 73  method predecess
0da0: 6f 72 6d 61 70 20 7b 7d 20 7b 0a 09 23 20 4e 4f  ormap {} {..# NO
0db0: 54 45 20 2f 20 46 55 54 55 52 45 3a 20 50 6f 73  TE / FUTURE: Pos
0dc0: 73 69 62 6c 65 20 62 6f 74 74 6c 65 6e 65 63 6b  sible bottleneck
0dd0: 2e 0a 09 61 72 72 61 79 20 73 65 74 20 74 6d 70  ...array set tmp
0de0: 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 65   {}..foreach {re
0df0: 76 20 63 68 69 6c 64 72 65 6e 7d 20 5b 24 73 65  v children} [$se
0e00: 6c 66 20 70 72 65 6d 61 70 5d 20 7b 0a 09 20 20  lf premap] {..  
0e10: 20 20 66 6f 72 65 61 63 68 20 63 68 69 6c 64 20    foreach child 
0e20: 24 63 68 69 6c 64 72 65 6e 20 7b 0a 09 09 6c 61  $children {...la
0e30: 70 70 65 6e 64 20 74 6d 70 28 24 72 65 76 29 20  ppend tmp($rev) 
0e40: 24 6d 79 69 74 65 6d 6d 61 70 28 24 63 68 69 6c  $myitemmap($chil
0e50: 64 29 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73  d)..    }..    s
0e60: 65 74 20 74 6d 70 28 24 72 65 76 29 20 5b 6c 73  et tmp($rev) [ls
0e70: 6f 72 74 20 2d 75 6e 69 71 75 65 20 24 74 6d 70  ort -unique $tmp
0e80: 28 24 72 65 76 29 5d 0a 09 7d 0a 09 72 65 74 75  ($rev)]..}..retu
0e90: 72 6e 20 5b 61 72 72 61 79 20 67 65 74 20 74 6d  rn [array get tm
0ea0: 70 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  p].    }..    # 
0eb0: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74  item -> list (it
0ec0: 65 6d 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 6e  em).    method n
0ed0: 65 78 74 6d 61 70 20 7b 7d 20 7b 0a 09 69 66 20  extmap {} {..if 
0ee0: 7b 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 6e 65 78  {[llength $mynex
0ef0: 74 6d 61 70 5d 7d 20 7b 20 72 65 74 75 72 6e 20  tmap]} { return 
0f00: 24 6d 79 6e 65 78 74 6d 61 70 20 7d 0a 09 24 6d  $mynextmap }..$m
0f10: 79 74 79 70 65 6f 62 6a 20 73 75 63 63 65 73 73  ytypeobj success
0f20: 6f 72 73 20 74 6d 70 20 24 6d 79 69 74 65 6d 73  ors tmp $myitems
0f30: 0a 09 73 65 74 20 6d 79 6e 65 78 74 6d 61 70 20  ..set mynextmap 
0f40: 5b 61 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a  [array get tmp].
0f50: 09 72 65 74 75 72 6e 20 24 6d 79 6e 65 78 74 6d  .return $mynextm
0f60: 61 70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  ap.    }..    # 
0f70: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74  item -> list (it
0f80: 65 6d 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 70  em).    method p
0f90: 72 65 6d 61 70 20 7b 7d 20 7b 0a 09 69 66 20 7b  remap {} {..if {
0fa0: 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 70 72 65 6d  [llength $myprem
0fb0: 61 70 5d 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d  ap]} { return $m
0fc0: 79 70 72 65 6d 61 70 20 7d 0a 09 24 6d 79 74 79  ypremap }..$myty
0fd0: 70 65 6f 62 6a 20 70 72 65 64 65 63 65 73 73 6f  peobj predecesso
0fe0: 72 73 20 74 6d 70 20 24 6d 79 69 74 65 6d 73 0a  rs tmp $myitems.
0ff0: 09 73 65 74 20 6d 79 70 72 65 6d 61 70 20 5b 61  .set mypremap [a
1000: 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 09 72  rray get tmp]..r
1010: 65 74 75 72 6e 20 24 6d 79 70 72 65 6d 61 70 0a  eturn $mypremap.
1020: 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f      }..    metho
1030: 64 20 62 72 65 61 6b 69 6e 74 65 72 6e 61 6c 64  d breakinternald
1040: 65 70 65 6e 64 65 6e 63 69 65 73 20 7b 7d 20 7b  ependencies {} {
1050: 0a 09 23 20 54 68 69 73 20 6d 65 74 68 6f 64 20  ..# This method 
1060: 69 6e 73 70 65 63 74 73 20 74 68 65 20 63 68 61  inspects the cha
1070: 6e 67 65 73 65 74 73 20 66 6f 72 20 69 6e 74 65  ngesets for inte
1080: 72 6e 61 6c 0a 09 23 20 64 65 70 65 6e 64 65 6e  rnal..# dependen
1090: 63 69 65 73 2e 20 4e 6f 74 68 69 6e 67 20 69 73  cies. Nothing is
10a0: 20 64 6f 6e 65 20 69 66 20 74 68 65 72 65 20 61   done if there a
10b0: 72 65 20 6e 6f 0a 09 23 20 73 75 63 68 2e 20 4f  re no..# such. O
10c0: 74 68 65 72 77 69 73 65 20 74 68 65 20 63 68 61  therwise the cha
10d0: 6e 67 65 73 65 74 20 69 73 20 73 70 6c 69 74 20  ngeset is split 
10e0: 69 6e 74 6f 20 61 20 73 65 74 20 6f 66 0a 09 23  into a set of..#
10f0: 20 66 72 61 67 6d 65 6e 74 73 20 77 69 74 68 6f   fragments witho
1100: 75 74 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65  ut internal depe
1110: 6e 64 65 6e 63 69 65 73 2c 20 74 72 61 6e 73 66  ndencies, transf
1120: 6f 72 6d 69 6e 67 20 74 68 65 0a 09 23 20 69 6e  orming the..# in
1130: 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63  ternal dependenc
1140: 69 65 73 20 69 6e 74 6f 20 65 78 74 65 72 6e 61  ies into externa
1150: 6c 20 6f 6e 65 73 2e 20 54 68 65 20 6e 65 77 20  l ones. The new 
1160: 63 68 61 6e 67 65 73 65 74 73 0a 09 23 20 61 72  changesets..# ar
1170: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c  e added to the l
1180: 69 73 74 20 6f 66 20 61 6c 6c 20 63 68 61 6e 67  ist of all chang
1190: 65 73 65 74 73 2e 0a 0a 09 23 20 57 65 20 70 65  esets....# We pe
11a0: 72 66 6f 72 6d 20 61 6c 6c 20 6e 65 63 65 73 73  rform all necess
11b0: 61 72 79 20 73 70 6c 69 74 73 20 69 6e 20 6f 6e  ary splits in on
11c0: 65 20 67 6f 2c 20 69 6e 73 74 65 61 64 20 6f 66  e go, instead of
11d0: 20 6f 6e 6c 79 0a 09 23 20 6f 6e 65 2e 20 54 68   only..# one. Th
11e0: 65 20 70 72 65 76 69 6f 75 73 20 61 6c 67 6f 72  e previous algor
11f0: 69 74 68 6d 2c 20 61 64 61 70 74 65 64 20 66 72  ithm, adapted fr
1200: 6f 6d 20 63 76 73 32 73 76 6e 2c 20 63 6f 6d 70  om cvs2svn, comp
1210: 75 74 65 64 0a 09 23 20 61 20 6c 6f 74 20 6f 66  uted..# a lot of
1220: 20 73 74 61 74 65 20 77 68 69 63 68 20 77 61 73   state which was
1230: 20 74 68 72 6f 77 6e 20 61 77 61 79 20 61 6e 64   thrown away and
1240: 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 64 20 61   then computed a
1250: 67 61 69 6e 0a 09 23 20 66 6f 72 20 65 61 63 68  gain..# for each
1260: 20 6f 66 20 74 68 65 20 66 72 61 67 6d 65 6e 74   of the fragment
1270: 73 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  s. It should be 
1280: 65 61 73 69 65 72 20 74 6f 20 75 70 64 61 74 65  easier to update
1290: 20 61 6e 64 0a 09 23 20 72 65 75 73 65 20 74 68   and..# reuse th
12a0: 61 74 20 73 74 61 74 65 2e 0a 0a 09 23 20 54 68  at state....# Th
12b0: 65 20 63 6f 64 65 20 63 68 65 63 6b 73 20 6f 6e  e code checks on
12c0: 6c 79 20 73 75 63 65 73 73 6f 72 20 64 65 70 65  ly sucessor depe
12d0: 6e 64 65 6e 63 69 65 73 2c 20 61 73 20 74 68 69  ndencies, as thi
12e0: 73 0a 09 23 20 61 75 74 6f 6d 61 74 69 63 61 6c  s..# automatical
12f0: 6c 79 20 63 6f 76 65 72 73 20 74 68 65 20 70 72  ly covers the pr
1300: 65 64 65 63 65 73 73 6f 72 20 64 65 70 65 6e 64  edecessor depend
1310: 65 6e 63 69 65 73 20 61 73 20 77 65 6c 6c 20 28  encies as well (
1320: 41 0a 09 23 20 73 75 63 63 65 73 73 6f 72 20 64  A..# successor d
1330: 65 70 65 6e 64 65 6e 63 79 20 61 20 2d 3e 20 62  ependency a -> b
1340: 20 69 73 20 61 6c 73 6f 20 61 20 70 72 65 64 65   is also a prede
1350: 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63  cessor dependenc
1360: 79 0a 09 23 20 62 20 2d 3e 20 61 29 2e 0a 0a 09  y..# b -> a)....
1370: 23 20 41 72 72 61 79 20 6f 66 20 64 65 70 65 6e  # Array of depen
1380: 64 65 6e 63 69 65 73 20 28 70 61 72 65 6e 74 20  dencies (parent 
1390: 2d 3e 20 63 68 69 6c 64 29 2e 20 54 68 69 73 20  -> child). This 
13a0: 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 0a 09  is pulled from..
13b0: 23 20 74 68 65 20 73 74 61 74 65 2c 20 61 6e 64  # the state, and
13c0: 20 6c 69 6d 69 74 65 64 20 74 6f 20 73 75 63 63   limited to succ
13d0: 65 73 73 6f 72 73 20 77 69 74 68 69 6e 20 74 68  essors within th
13e0: 65 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 61  e changeset....a
13f0: 72 72 61 79 20 73 65 74 20 64 65 70 65 6e 64 65  rray set depende
1400: 6e 63 69 65 73 20 7b 7d 0a 09 24 6d 79 74 79 70  ncies {}..$mytyp
1410: 65 6f 62 6a 20 69 6e 74 65 72 6e 61 6c 73 75 63  eobj internalsuc
1420: 63 65 73 73 6f 72 73 20 64 65 70 65 6e 64 65 6e  cessors dependen
1430: 63 69 65 73 20 24 6d 79 69 74 65 6d 73 0a 09 69  cies $myitems..i
1440: 66 20 7b 21 5b 61 72 72 61 79 20 73 69 7a 65 20  f {![array size 
1450: 64 65 70 65 6e 64 65 6e 63 69 65 73 5d 7d 20 7b  dependencies]} {
1460: 72 65 74 75 72 6e 20 30 7d 20 3b 20 23 20 4e 6f  return 0} ; # No
1470: 74 68 69 6e 67 20 74 6f 20 62 72 65 61 6b 2e 0a  thing to break..
1480: 0a 09 6c 6f 67 20 77 72 69 74 65 20 35 20 63 73  ..log write 5 cs
1490: 65 74 73 20 2e 2e 2e 5b 24 73 65 6c 66 20 73 74  ets ...[$self st
14a0: 72 5d 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  r]..............
14b0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
14c0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
14d0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 0a 0a 09 23 20 57 65  ............# We
14e0: 20 68 61 76 65 20 69 6e 74 65 72 6e 61 6c 20 64   have internal d
14f0: 65 70 65 6e 64 65 6e 63 69 65 73 20 74 6f 20 62  ependencies to b
1500: 72 65 61 6b 2e 20 57 65 20 6e 6f 77 20 69 74 65  reak. We now ite
1510: 72 61 74 65 20 6f 76 65 72 0a 09 23 20 61 6c 6c  rate over..# all
1520: 20 70 6f 73 69 74 69 6f 6e 73 20 69 6e 20 74 68   positions in th
1530: 65 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73  e list (which is
1540: 20 63 68 72 6f 6e 6f 6c 6f 67 69 63 61 6c 2c 20   chronological, 
1550: 61 74 20 6c 65 61 73 74 0a 09 23 20 61 73 20 66  at least..# as f
1560: 61 72 20 61 73 20 74 68 65 20 74 69 6d 65 73 74  ar as the timest
1570: 61 6d 70 73 20 61 72 65 20 63 6f 72 72 65 63 74  amps are correct
1580: 20 61 6e 64 20 75 6e 69 71 75 65 29 20 61 6e 64   and unique) and
1590: 0a 09 23 20 64 65 74 65 72 6d 69 6e 65 20 74 68  ..# determine th
15a0: 65 20 62 65 73 74 20 70 6f 73 69 74 69 6f 6e 20  e best position 
15b0: 66 6f 72 20 74 68 65 20 62 72 65 61 6b 2c 20 62  for the break, b
15c0: 79 20 74 72 79 69 6e 67 20 74 6f 0a 09 23 20 62  y trying to..# b
15d0: 72 65 61 6b 20 61 73 20 6d 61 6e 79 20 64 65 70  reak as many dep
15e0: 65 6e 64 65 6e 63 69 65 73 20 61 73 20 70 6f 73  endencies as pos
15f0: 73 69 62 6c 65 20 69 6e 20 6f 6e 65 20 67 6f 2e  sible in one go.
1600: 20 57 68 65 6e 20 61 0a 09 23 20 62 72 65 61 6b   When a..# break
1610: 20 77 61 73 20 66 6f 75 6e 64 20 74 68 69 73 20   was found this 
1620: 69 73 20 72 65 64 6f 6e 65 20 66 6f 72 20 74 68  is redone for th
1630: 65 20 66 72 61 67 6d 65 6e 74 73 20 63 6f 6d 69  e fragments comi
1640: 6e 67 20 61 6e 64 0a 09 23 20 61 66 74 65 72 2c  ng and..# after,
1650: 20 61 66 74 65 72 20 75 70 64 69 6e 67 20 74 68   after upding th
1660: 65 20 63 72 6f 73 73 69 6e 67 20 69 6e 66 6f 72  e crossing infor
1670: 6d 61 74 69 6f 6e 2e 0a 0a 09 23 20 44 61 74 61  mation....# Data
1680: 20 73 74 72 75 63 74 75 72 65 73 3a 0a 09 23 20   structures:..# 
1690: 4d 61 70 3a 20 20 50 4f 53 20 20 20 72 65 76 69  Map:  POS   revi
16a0: 73 69 6f 6e 20 69 64 20 20 20 20 20 20 2d 3e 20  sion id      -> 
16b0: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73 74  position in list
16c0: 2e 0a 09 23 20 20 20 20 20 20 20 43 52 4f 53 53  ...#       CROSS
16d0: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73   position in lis
16e0: 74 20 2d 3e 20 6e 75 6d 62 65 72 20 6f 66 20 64  t -> number of d
16f0: 65 70 65 6e 64 65 6e 63 69 65 73 20 63 72 6f 73  ependencies cros
1700: 73 69 6e 67 20 69 74 0a 09 23 20 20 20 20 20 20  sing it..#      
1710: 20 44 45 50 43 20 20 64 65 70 65 6e 64 65 6e 63   DEPC  dependenc
1720: 79 20 20 20 20 20 20 20 2d 3e 20 70 6f 73 69 74  y       -> posit
1730: 69 6f 6e 73 20 69 74 20 63 72 6f 73 73 65 73 0a  ions it crosses.
1740: 09 23 20 4c 69 73 74 3a 20 52 41 4e 47 45 20 4f  .# List: RANGE O
1750: 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  f the positions 
1760: 69 74 73 65 6c 66 2e 0a 09 23 20 41 20 64 65 70  itself...# A dep
1770: 65 6e 64 65 6e 63 79 20 69 73 20 61 20 73 69 6e  endency is a sin
1780: 67 6c 65 2d 65 6c 65 6d 65 6e 74 20 6d 61 70 20  gle-element map 
1790: 70 61 72 65 6e 74 20 2d 3e 20 63 68 69 6c 64 0a  parent -> child.
17a0: 0a 09 49 6e 69 74 69 61 6c 69 7a 65 42 72 65 61  ..InitializeBrea
17b0: 6b 53 74 61 74 65 20 24 6d 79 69 74 65 6d 73 0a  kState $myitems.
17c0: 0a 09 73 65 74 20 66 72 61 67 6d 65 6e 74 73 20  ..set fragments 
17d0: 7b 7d 0a 09 73 65 74 20 70 65 6e 64 69 6e 67 20  {}..set pending 
17e0: 20 20 5b 6c 69 73 74 20 24 72 61 6e 67 65 5d 0a    [list $range].
17f0: 09 73 65 74 20 61 74 20 20 20 20 20 20 20 20 30  .set at        0
1800: 0a 09 61 72 72 61 79 20 73 65 74 20 62 72 65 61  ..array set brea
1810: 6b 73 20 7b 7d 0a 0a 09 77 68 69 6c 65 20 7b 24  ks {}...while {$
1820: 61 74 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24 70  at < [llength $p
1830: 65 6e 64 69 6e 67 5d 7d 20 7b 0a 09 20 20 20 20  ending]} {..    
1840: 73 65 74 20 63 75 72 72 65 6e 74 20 5b 6c 69 6e  set current [lin
1850: 64 65 78 20 24 70 65 6e 64 69 6e 67 20 24 61 74  dex $pending $at
1860: 5d 0a 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74  ]...    log writ
1870: 65 20 36 20 63 73 65 74 73 20 7b 2e 20 2e 20 2e  e 6 csets {. . .
1880: 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e 2e 2e  . ... ..... ....
1890: 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  .... ...........
18a0: 2e 2e 7d 0a 09 20 20 20 20 6c 6f 67 20 77 72 69  ..}..    log wri
18b0: 74 65 20 36 20 63 73 65 74 73 20 7b 53 63 68 65  te 6 csets {Sche
18c0: 64 75 6c 65 64 20 20 20 5b 6a 6f 69 6e 20 5b 50  duled   [join [P
18d0: 52 73 20 5b 6c 72 61 6e 67 65 20 24 70 65 6e 64  Rs [lrange $pend
18e0: 69 6e 67 20 24 61 74 20 65 6e 64 5d 5d 20 7b 20  ing $at end]] { 
18f0: 7d 5d 7d 0a 09 20 20 20 20 6c 6f 67 20 77 72 69  }]}..    log wri
1900: 74 65 20 36 20 63 73 65 74 73 20 7b 43 6f 6e 73  te 6 csets {Cons
1910: 69 64 65 72 69 6e 67 20 5b 50 52 20 24 63 75 72  idering [PR $cur
1920: 72 65 6e 74 5d 20 5c 5b 24 61 74 2f 5b 6c 6c 65  rent] \[$at/[lle
1930: 6e 67 74 68 20 24 70 65 6e 64 69 6e 67 5d 5c 5d  ngth $pending]\]
1940: 7d 0a 0a 09 20 20 20 20 73 65 74 20 62 65 73 74  }...    set best
1950: 20 5b 46 69 6e 64 42 65 73 74 42 72 65 61 6b 20   [FindBestBreak 
1960: 24 63 75 72 72 65 6e 74 5d 0a 0a 09 20 20 20 20  $current]...    
1970: 69 66 20 7b 24 62 65 73 74 20 3c 20 30 7d 20 7b  if {$best < 0} {
1980: 0a 09 09 23 20 54 68 65 20 69 6e 73 70 65 63 74  ...# The inspect
1990: 65 64 20 72 61 6e 67 65 20 68 61 73 20 6e 6f 20  ed range has no 
19a0: 69 6e 74 65 72 6e 61 6c 0a 09 09 23 20 64 65 70  internal...# dep
19b0: 65 6e 64 65 6e 63 69 65 73 2e 20 54 68 69 73 20  endencies. This 
19c0: 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 66 72  is a complete fr
19d0: 61 67 6d 65 6e 74 2e 0a 09 09 6c 61 70 70 65 6e  agment....lappen
19e0: 64 20 66 72 61 67 6d 65 6e 74 73 20 24 63 75 72  d fragments $cur
19f0: 72 65 6e 74 0a 0a 09 09 6c 6f 67 20 77 72 69 74  rent....log writ
1a00: 65 20 36 20 63 73 65 74 73 20 22 4e 6f 20 62 72  e 6 csets "No br
1a10: 65 61 6b 73 2c 20 66 69 6e 61 6c 22 0a 09 20 20  eaks, final"..  
1a20: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 23 20 53    } else {...# S
1a30: 70 6c 69 74 20 74 68 65 20 72 61 6e 67 65 20 61  plit the range a
1a40: 6e 64 20 73 63 68 65 64 75 6c 65 20 74 68 65 20  nd schedule the 
1a50: 72 65 73 75 6c 74 69 6e 67 20 66 72 61 67 6d 65  resulting fragme
1a60: 6e 74 73 0a 09 09 23 20 66 6f 72 20 66 75 72 74  nts...# for furt
1a70: 68 65 72 20 69 6e 73 70 65 63 74 69 6f 6e 2e 20  her inspection. 
1a80: 52 65 6d 65 6d 62 65 72 20 74 68 65 20 6e 75 6d  Remember the num
1a90: 62 65 72 20 6f 66 0a 09 09 23 20 64 65 70 65 6e  ber of...# depen
1aa0: 64 65 6e 63 69 65 73 20 63 75 74 20 62 65 66 6f  dencies cut befo
1ab0: 72 65 20 77 65 20 72 65 6d 6f 76 65 20 74 68 65  re we remove the
1ac0: 6d 20 66 72 6f 6d 0a 09 09 23 20 63 6f 6e 73 69  m from...# consi
1ad0: 64 65 72 61 74 69 6f 6e 2c 20 66 6f 72 20 64 6f  deration, for do
1ae0: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 6c 61 74 65  cumentation late
1af0: 72 2e 0a 0a 09 09 73 65 74 20 62 72 65 61 6b 73  r.....set breaks
1b00: 28 24 62 65 73 74 29 20 24 63 72 6f 73 73 28 24  ($best) $cross($
1b10: 62 65 73 74 29 0a 0a 09 09 6c 6f 67 20 77 72 69  best)....log wri
1b20: 74 65 20 36 20 63 73 65 74 73 20 22 42 65 73 74  te 6 csets "Best
1b30: 20 62 72 65 61 6b 20 40 20 24 62 65 73 74 2c 20   break @ $best, 
1b40: 63 75 74 74 69 6e 67 20 5b 6e 73 70 20 24 63 72  cutting [nsp $cr
1b50: 6f 73 73 28 24 62 65 73 74 29 20 64 65 70 65 6e  oss($best) depen
1b60: 64 65 6e 63 79 20 64 65 70 65 6e 64 65 6e 63 69  dency dependenci
1b70: 65 73 5d 22 0a 0a 09 09 23 20 4e 6f 74 65 3a 20  es]"....# Note: 
1b80: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 62 65 73  The value of bes
1b90: 74 20 69 73 20 61 6e 20 61 62 6f 6c 75 74 65 20  t is an abolute 
1ba0: 6c 6f 63 61 74 69 6f 6e 20 69 6e 0a 09 09 23 20  location in...# 
1bb0: 6d 79 69 74 65 6d 73 2e 20 55 73 65 20 74 68 65  myitems. Use the
1bc0: 20 73 74 61 72 74 20 6f 66 20 63 75 72 72 65 6e   start of curren
1bd0: 74 20 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 0a  t to make it an.
1be0: 09 09 23 20 69 6e 64 65 78 20 61 62 73 6f 6c 75  ..# index absolu
1bf0: 74 65 20 74 6f 20 63 75 72 72 65 6e 74 2e 0a 0a  te to current...
1c00: 09 09 73 65 74 20 62 72 65 6c 20 5b 65 78 70 72  ..set brel [expr
1c10: 20 7b 24 62 65 73 74 20 2d 20 5b 6c 69 6e 64 65   {$best - [linde
1c20: 78 20 24 63 75 72 72 65 6e 74 20 30 5d 7d 5d 0a  x $current 0]}].
1c30: 09 09 73 65 74 20 62 6e 65 78 74 20 24 62 72 65  ..set bnext $bre
1c40: 6c 20 3b 20 69 6e 63 72 20 62 6e 65 78 74 0a 09  l ; incr bnext..
1c50: 09 73 65 74 20 66 72 61 67 62 65 66 6f 72 65 20  .set fragbefore 
1c60: 5b 6c 72 61 6e 67 65 20 24 63 75 72 72 65 6e 74  [lrange $current
1c70: 20 30 20 24 62 72 65 6c 5d 0a 09 09 73 65 74 20   0 $brel]...set 
1c80: 66 72 61 67 61 66 74 65 72 20 20 5b 6c 72 61 6e  fragafter  [lran
1c90: 67 65 20 24 63 75 72 72 65 6e 74 20 24 62 6e 65  ge $current $bne
1ca0: 78 74 20 65 6e 64 5d 0a 0a 09 09 6c 6f 67 20 77  xt end]....log w
1cb0: 72 69 74 65 20 36 20 63 73 65 74 73 20 22 4e 65  rite 6 csets "Ne
1cc0: 77 20 70 69 65 63 65 73 20 20 5b 50 52 20 24 66  w pieces  [PR $f
1cd0: 72 61 67 62 65 66 6f 72 65 5d 20 5b 50 52 20 24  ragbefore] [PR $
1ce0: 66 72 61 67 61 66 74 65 72 5d 22 0a 0a 09 09 69  fragafter]"....i
1cf0: 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20  ntegrity assert 
1d00: 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 72 61 67 62  {[llength $fragb
1d10: 65 66 6f 72 65 5d 7d 20 7b 46 6f 75 6e 64 20 7a  efore]} {Found z
1d20: 65 72 6f 2d 6c 65 6e 67 74 68 20 66 72 61 67 6d  ero-length fragm
1d30: 65 6e 74 20 61 74 20 74 68 65 20 62 65 67 69 6e  ent at the begin
1d40: 6e 69 6e 67 7d 0a 09 09 69 6e 74 65 67 72 69 74  ning}...integrit
1d50: 79 20 61 73 73 65 72 74 20 7b 5b 6c 6c 65 6e 67  y assert {[lleng
1d60: 74 68 20 24 66 72 61 67 61 66 74 65 72 5d 7d 20  th $fragafter]} 
1d70: 20 7b 46 6f 75 6e 64 20 7a 65 72 6f 2d 6c 65 6e   {Found zero-len
1d80: 67 74 68 20 66 72 61 67 6d 65 6e 74 20 61 74 20  gth fragment at 
1d90: 74 68 65 20 65 6e 64 7d 0a 0a 09 09 6c 61 70 70  the end}....lapp
1da0: 65 6e 64 20 70 65 6e 64 69 6e 67 20 24 66 72 61  end pending $fra
1db0: 67 62 65 66 6f 72 65 20 24 66 72 61 67 61 66 74  gbefore $fragaft
1dc0: 65 72 0a 09 09 43 75 74 41 74 20 24 62 65 73 74  er...CutAt $best
1dd0: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 6e  ..    }...    in
1de0: 63 72 20 61 74 0a 09 7d 0a 0a 09 6c 6f 67 20 77  cr at..}...log w
1df0: 72 69 74 65 20 36 20 63 73 65 74 73 20 22 2e 20  rite 6 csets ". 
1e00: 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e  . .. ... ..... .
1e10: 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e  ....... ........
1e20: 2e 2e 2e 2e 2e 22 0a 0a 09 23 20 28 2a 29 20 57  ....."...# (*) W
1e30: 65 20 63 6c 65 61 72 20 6f 75 74 20 74 68 65 20  e clear out the 
1e40: 61 73 73 6f 63 69 61 74 65 64 20 70 61 72 74 20  associated part 
1e50: 6f 66 20 74 68 65 20 6d 79 69 74 65 6d 6d 61 70  of the myitemmap
1e60: 0a 09 23 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6e  ..# in-memory in
1e70: 64 65 78 20 69 6e 20 70 72 65 70 61 72 61 74 69  dex in preparati
1e80: 6f 6e 20 66 6f 72 20 6e 65 77 20 64 61 74 61 2e  on for new data.
1e90: 20 41 20 73 69 6d 70 6c 65 20 75 6e 73 65 74 0a   A simple unset.
1ea0: 09 23 20 69 73 20 65 6e 6f 75 67 68 2c 20 77 65  .# is enough, we
1eb0: 20 68 61 76 65 20 6e 6f 20 73 79 6d 62 6f 6c 20   have no symbol 
1ec0: 63 68 61 6e 67 65 73 65 74 73 20 61 74 20 74 68  changesets at th
1ed0: 69 73 20 74 69 6d 65 2c 20 61 6e 64 0a 09 23 20  is time, and..# 
1ee0: 74 68 75 73 20 6e 65 76 65 72 20 6d 6f 72 65 20  thus never more 
1ef0: 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
1f00: 63 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ce in the list..
1f10: 0a 09 66 6f 72 65 61 63 68 20 69 69 64 20 24 6d  ..foreach iid $m
1f20: 79 69 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65  yitems {..    se
1f30: 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79 74  t key [list $myt
1f40: 79 70 65 20 24 69 69 64 5d 0a 09 20 20 20 20 75  ype $iid]..    u
1f50: 6e 73 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24  nset myitemmap($
1f60: 6b 65 79 29 0a 09 7d 0a 0a 09 23 20 43 72 65 61  key)..}...# Crea
1f70: 74 65 20 63 68 61 6e 67 65 73 65 74 73 20 66 6f  te changesets fo
1f80: 72 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 2c  r the fragments,
1f90: 20 72 65 75 73 69 6e 67 20 74 68 65 20 63 75 72   reusing the cur
1fa0: 72 65 6e 74 20 6f 6e 65 0a 09 23 20 66 6f 72 20  rent one..# for 
1fb0: 74 68 65 20 66 69 72 73 74 20 66 72 61 67 6d 65  the first fragme
1fc0: 6e 74 2e 20 57 65 20 73 6f 72 74 20 74 68 65 6d  nt. We sort them
1fd0: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 6c 6c   in order to all
1fe0: 6f 77 0a 09 23 20 63 68 65 63 6b 69 6e 67 20 66  ow..# checking f
1ff0: 6f 72 20 67 61 70 73 20 61 6e 64 20 6e 69 63 65  or gaps and nice
2000: 20 6d 65 73 73 61 67 65 73 2e 0a 0a 09 73 65 74   messages....set
2010: 20 66 72 61 67 6d 65 6e 74 73 20 5b 6c 73 6f 72   fragments [lsor
2020: 74 20 2d 69 6e 64 65 78 20 30 20 2d 69 6e 74 65  t -index 0 -inte
2030: 67 65 72 20 24 66 72 61 67 6d 65 6e 74 73 5d 0a  ger $fragments].
2040: 0a 09 23 70 75 74 73 20 5c 74 2e 5b 6a 6f 69 6e  ..#puts \t.[join
2050: 20 5b 50 52 73 20 24 66 72 61 67 6d 65 6e 74 73   [PRs $fragments
2060: 5d 20 2e 5c 6e 5c 74 2e 5d 2e 0a 0a 09 42 6f 72  ] .\n\t.]....Bor
2070: 64 65 72 20 5b 6c 69 6e 64 65 78 20 24 66 72 61  der [lindex $fra
2080: 67 6d 65 6e 74 73 20 30 5d 20 66 69 72 73 74 73  gments 0] firsts
2090: 20 66 69 72 73 74 65 0a 0a 09 69 6e 74 65 67 72   firste...integr
20a0: 69 74 79 20 61 73 73 65 72 74 20 7b 24 66 69 72  ity assert {$fir
20b0: 73 74 73 20 3d 3d 20 30 7d 20 7b 42 61 64 20 66  sts == 0} {Bad f
20c0: 72 61 67 6d 65 6e 74 20 73 74 61 72 74 20 40 20  ragment start @ 
20d0: 24 66 69 72 73 74 73 2c 20 67 61 70 2c 20 6f 72  $firsts, gap, or
20e0: 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e   before beginnin
20f0: 67 20 6f 66 20 74 68 65 20 72 61 6e 67 65 7d 0a  g of the range}.
2100: 0a 09 73 65 74 20 6c 61 73 74 65 20 24 66 69 72  ..set laste $fir
2110: 73 74 65 0a 09 66 6f 72 65 61 63 68 20 66 72 61  ste..foreach fra
2120: 67 6d 65 6e 74 20 5b 6c 72 61 6e 67 65 20 24 66  gment [lrange $f
2130: 72 61 67 6d 65 6e 74 73 20 31 20 65 6e 64 5d 20  ragments 1 end] 
2140: 7b 0a 09 20 20 20 20 42 6f 72 64 65 72 20 24 66  {..    Border $f
2150: 72 61 67 6d 65 6e 74 20 73 20 65 0a 09 20 20 20  ragment s e..   
2160: 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72   integrity asser
2170: 74 20 7b 24 6c 61 73 74 65 20 3d 3d 20 28 24 73  t {$laste == ($s
2180: 20 2d 20 31 29 7d 20 7b 42 61 64 20 66 72 61 67   - 1)} {Bad frag
2190: 6d 65 6e 74 20 62 6f 72 64 65 72 20 3c 24 6c 61  ment border <$la
21a0: 73 74 65 20 7c 20 24 73 3e 2c 20 67 61 70 20 6f  ste | $s>, gap o
21b0: 72 20 6f 76 65 72 6c 61 70 7d 0a 0a 09 20 20 20  r overlap}...   
21c0: 20 73 65 74 20 6e 65 77 20 5b 24 74 79 70 65 20   set new [$type 
21d0: 25 41 55 54 4f 25 20 24 6d 79 70 72 6f 6a 65 63  %AUTO% $myprojec
21e0: 74 20 24 6d 79 74 79 70 65 20 24 6d 79 73 72 63  t $mytype $mysrc
21f0: 69 64 20 5b 6c 72 61 6e 67 65 20 24 6d 79 69 74  id [lrange $myit
2200: 65 6d 73 20 24 73 20 24 65 5d 5d 0a 0a 20 20 20  ems $s $e]]..   
2210: 20 20 20 20 20 20 20 20 20 6c 6f 67 20 77 72 69           log wri
2220: 74 65 20 34 20 63 73 65 74 73 20 22 42 72 65 61  te 4 csets "Brea
2230: 6b 69 6e 67 20 5b 24 73 65 6c 66 20 73 74 72 20  king [$self str 
2240: 5d 20 40 20 24 6c 61 73 74 65 2c 20 6e 65 77 20  ] @ $laste, new 
2250: 5b 24 6e 65 77 20 73 74 72 5d 2c 20 63 75 74 74  [$new str], cutt
2260: 69 6e 67 20 24 62 72 65 61 6b 73 28 24 6c 61 73  ing $breaks($las
2270: 74 65 29 22 0a 0a 09 20 20 20 20 73 65 74 20 6c  te)"...    set l
2280: 61 73 74 65 20 24 65 0a 09 7d 0a 0a 09 69 6e 74  aste $e..}...int
2290: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 0a  egrity assert {.
22a0: 09 20 20 20 20 24 6c 61 73 74 65 20 3d 3d 20 28  .    $laste == (
22b0: 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 69 74 65 6d  [llength $myitem
22c0: 73 5d 2d 31 29 0a 09 7d 20 7b 42 61 64 20 66 72  s]-1)..} {Bad fr
22d0: 61 67 6d 65 6e 74 20 65 6e 64 20 40 20 24 6c 61  agment end @ $la
22e0: 73 74 65 2c 20 67 61 70 2c 20 6f 72 20 62 65 79  ste, gap, or bey
22f0: 6f 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 72  ond end of the r
2300: 61 6e 67 65 7d 0a 0a 09 23 20 50 75 74 20 74 68  ange}...# Put th
2310: 65 20 66 69 72 73 74 20 66 72 61 67 6d 65 6e 74  e first fragment
2320: 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e   into the curren
2330: 74 20 63 68 61 6e 67 65 73 65 74 2c 20 61 6e 64  t changeset, and
2340: 0a 09 23 20 75 70 64 61 74 65 20 74 68 65 20 69  ..# update the i
2350: 6e 2d 6d 65 6d 6f 72 79 20 69 6e 64 65 78 2e 20  n-memory index. 
2360: 57 65 20 63 61 6e 20 73 69 6d 70 6c 79 20 28 72  We can simply (r
2370: 65 29 61 64 64 20 74 68 65 20 69 74 65 6d 73 0a  e)add the items.
2380: 09 23 20 62 65 63 61 75 73 65 20 77 65 20 63 6c  .# because we cl
2390: 65 61 72 65 64 20 74 68 65 20 70 72 65 76 69 6f  eared the previo
23a0: 75 73 6c 79 20 65 78 69 73 74 69 6e 67 20 69 6e  usly existing in
23b0: 66 6f 72 6d 61 74 69 6f 6e 2c 20 73 65 65 0a 09  formation, see..
23c0: 23 20 28 2a 29 20 61 62 6f 76 65 2e 20 50 65 72  # (*) above. Per
23d0: 73 69 73 74 65 6e 63 65 20 64 6f 65 73 20 6e 6f  sistence does no
23e0: 74 20 6d 61 74 74 65 72 20 68 65 72 65 2c 20 6e  t matter here, n
23f0: 6f 6e 65 20 6f 66 20 74 68 65 0a 09 23 20 63 68  one of the..# ch
2400: 61 6e 67 65 73 65 74 73 20 68 61 73 20 62 65 65  angesets has bee
2410: 6e 20 73 61 76 65 64 20 74 6f 20 74 68 65 20 70  n saved to the p
2420: 65 72 73 69 73 74 65 6e 74 20 73 74 61 74 65 20  ersistent state 
2430: 79 65 74 2e 0a 0a 09 73 65 74 20 6d 79 69 74 65  yet....set myite
2440: 6d 73 20 5b 6c 72 61 6e 67 65 20 24 6d 79 69 74  ms [lrange $myit
2450: 65 6d 73 20 30 20 24 66 69 72 73 74 65 5d 0a 09  ems 0 $firste]..
2460: 66 6f 72 65 61 63 68 20 69 69 64 20 24 6d 79 69  foreach iid $myi
2470: 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65 74 20  tems {..    set 
2480: 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79 74 79 70  key [list $mytyp
2490: 65 20 24 69 69 64 5d 0a 09 20 20 20 20 73 65 74  e $iid]..    set
24a0: 20 6d 79 69 74 65 6d 6d 61 70 28 24 6b 65 79 29   myitemmap($key)
24b0: 20 24 73 65 6c 66 0a 09 7d 0a 0a 09 72 65 74 75   $self..}...retu
24c0: 72 6e 20 31 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rn 1.    }..    
24d0: 6d 65 74 68 6f 64 20 70 65 72 73 69 73 74 20 7b  method persist {
24e0: 7d 20 7b 0a 09 73 65 74 20 74 69 64 20 24 6d 79  } {..set tid $my
24f0: 63 73 74 79 70 65 28 24 6d 79 74 79 70 65 29 0a  cstype($mytype).
2500: 09 73 65 74 20 70 69 64 20 5b 24 6d 79 70 72 6f  .set pid [$mypro
2510: 6a 65 63 74 20 69 64 5d 0a 09 73 65 74 20 70 6f  ject id]..set po
2520: 73 20 30 0a 0a 09 73 74 61 74 65 20 74 72 61 6e  s 0...state tran
2530: 73 61 63 74 69 6f 6e 20 7b 0a 09 20 20 20 20 73  saction {..    s
2540: 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 49 4e 53  tate run {...INS
2550: 45 52 54 20 49 4e 54 4f 20 63 68 61 6e 67 65 73  ERT INTO changes
2560: 65 74 20 28 63 69 64 2c 20 20 20 70 69 64 2c 20  et (cid,   pid, 
2570: 20 74 79 70 65 2c 20 73 72 63 29 0a 09 09 56 41   type, src)...VA
2580: 4c 55 45 53 20 20 20 20 20 20 20 20 20 20 20 20  LUES            
2590: 20 20 20 20 28 24 6d 79 69 64 2c 20 24 70 69 64      ($myid, $pid
25a0: 2c 20 24 74 69 64 2c 20 24 6d 79 73 72 63 69 64  , $tid, $mysrcid
25b0: 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  );..    }...    
25c0: 66 6f 72 65 61 63 68 20 69 69 64 20 24 6d 79 69  foreach iid $myi
25d0: 74 65 6d 73 20 7b 0a 09 09 73 74 61 74 65 20 72  tems {...state r
25e0: 75 6e 20 7b 0a 09 09 20 20 20 20 49 4e 53 45 52  un {...    INSER
25f0: 54 20 49 4e 54 4f 20 63 73 72 65 76 69 73 69 6f  T INTO csrevisio
2600: 6e 20 28 63 69 64 2c 20 20 20 70 6f 73 2c 20 20  n (cid,   pos,  
2610: 72 69 64 29 0a 09 09 20 20 20 20 56 41 4c 55 45  rid)...    VALUE
2620: 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S               
2630: 20 20 28 24 6d 79 69 64 2c 20 24 70 6f 73 2c 20    ($myid, $pos, 
2640: 24 69 69 64 29 3b 0a 09 09 7d 0a 09 09 69 6e 63  $iid);...}...inc
2650: 72 20 70 6f 73 0a 09 20 20 20 20 7d 0a 09 7d 0a  r pos..    }..}.
2660: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
2670: 20 20 20 6d 65 74 68 6f 64 20 74 69 6d 65 72 61     method timera
2680: 6e 67 65 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20  nge {} { return 
2690: 5b 24 6d 79 74 79 70 65 6f 62 6a 20 74 69 6d 65  [$mytypeobj time
26a0: 72 61 6e 67 65 20 24 6d 79 69 74 65 6d 73 5d 20  range $myitems] 
26b0: 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 64 72  }..    method dr
26c0: 6f 70 20 7b 7d 20 7b 0a 09 73 74 61 74 65 20 74  op {} {..state t
26d0: 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 09 20 20  ransaction {..  
26e0: 20 20 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09    state run {...
26f0: 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 68 61 6e  DELETE FROM chan
2700: 67 65 73 65 74 20 20 57 48 45 52 45 20 63 69 64  geset  WHERE cid
2710: 20 3d 20 24 6d 79 69 64 3b 0a 09 09 44 45 4c 45   = $myid;...DELE
2720: 54 45 20 46 52 4f 4d 20 63 73 72 65 76 69 73 69  TE FROM csrevisi
2730: 6f 6e 20 57 48 45 52 45 20 63 69 64 20 3d 20 24  on WHERE cid = $
2740: 6d 79 69 64 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  myid;..    }..}.
2750: 09 66 6f 72 65 61 63 68 20 69 69 64 20 24 6d 79  .foreach iid $my
2760: 69 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65 74  items {..    set
2770: 20 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79 74 79   key [list $myty
2780: 70 65 20 24 69 69 64 5d 0a 09 20 20 20 20 75 6e  pe $iid]..    un
2790: 73 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24 6b  set myitemmap($k
27a0: 65 79 29 0a 09 7d 0a 09 73 65 74 20 70 6f 73 20  ey)..}..set pos 
27b0: 20 20 20 20 20 20 20 20 20 5b 6c 73 65 61 72 63           [lsearc
27c0: 68 20 2d 65 78 61 63 74 20 24 6d 79 63 68 61 6e  h -exact $mychan
27d0: 67 65 73 65 74 73 20 24 73 65 6c 66 5d 0a 09 73  gesets $self]..s
27e0: 65 74 20 6d 79 63 68 61 6e 67 65 73 65 74 73 20  et mychangesets 
27f0: 5b 6c 72 65 70 6c 61 63 65 20 24 6d 79 63 68 61  [lreplace $mycha
2800: 6e 67 65 73 65 74 73 20 24 70 6f 73 20 24 70 6f  ngesets $pos $po
2810: 73 5d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d  s]..return.    }
2820: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ..    typemethod
2830: 20 73 70 6c 69 74 20 7b 63 73 65 74 20 61 72 67   split {cset arg
2840: 73 7d 20 7b 0a 09 23 20 41 73 20 70 61 72 74 20  s} {..# As part 
2850: 6f 66 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20  of the creation 
2860: 6f 66 20 74 68 65 20 6e 65 77 20 63 68 61 6e 67  of the new chang
2870: 65 73 65 74 73 20 73 70 65 63 69 66 69 65 64 20  esets specified 
2880: 69 6e 0a 09 23 20 41 52 47 53 20 61 73 20 73 65  in..# ARGS as se
2890: 74 73 20 6f 66 20 69 74 65 6d 73 2c 20 61 6c 6c  ts of items, all
28a0: 20 73 75 62 73 65 74 73 20 6f 66 20 43 53 45 54   subsets of CSET
28b0: 27 73 20 69 74 65 6d 20 73 65 74 2c 20 43 53 45  's item set, CSE
28c0: 54 0a 09 23 20 77 69 6c 6c 20 62 65 20 64 72 6f  T..# will be dro
28d0: 70 70 65 64 20 66 72 6f 6d 20 61 6c 6c 20 64 61  pped from all da
28e0: 74 61 62 61 73 65 73 2c 20 69 6e 20 61 6e 64 20  tabases, in and 
28f0: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2c 0a 09  out of memory,..
2900: 23 20 61 6e 64 20 74 68 65 6e 20 64 65 73 74 72  # and then destr
2910: 6f 79 65 64 2e 0a 09 23 0a 09 23 20 4e 6f 74 65  oyed...#..# Note
2920: 3a 20 54 68 65 20 69 74 65 6d 20 6c 69 73 74 73  : The item lists
2930: 20 66 6f 75 6e 64 20 69 6e 20 61 72 67 73 20 61   found in args a
2940: 72 65 20 74 61 67 67 65 64 20 69 74 65 6d 73 2e  re tagged items.
2950: 20 54 68 65 79 0a 09 23 20 68 61 76 65 20 74 6f   They..# have to
2960: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 74   have the same t
2970: 79 70 65 20 61 73 20 74 68 65 20 63 68 61 6e 67  ype as the chang
2980: 65 73 65 74 2c 20 62 65 69 6e 67 20 73 75 62 73  eset, being subs
2990: 65 74 73 0a 09 23 20 6f 66 20 69 74 73 20 69 74  ets..# of its it
29a0: 65 6d 73 2e 20 54 68 69 73 20 69 73 20 63 68 65  ems. This is che
29b0: 63 6b 65 64 20 69 6e 20 55 6e 74 61 67 31 2e 0a  cked in Untag1..
29c0: 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61  ..struct::list a
29d0: 73 73 69 67 6e 20 5b 24 63 73 65 74 20 64 61 74  ssign [$cset dat
29e0: 61 5d 20 70 72 6f 6a 65 63 74 20 63 73 74 79 70  a] project cstyp
29f0: 65 20 63 73 73 72 63 0a 0a 09 24 63 73 65 74 20  e cssrc...$cset 
2a00: 64 72 6f 70 0a 09 24 63 73 65 74 20 64 65 73 74  drop..$cset dest
2a10: 72 6f 79 0a 0a 09 73 65 74 20 6e 65 77 63 73 65  roy...set newcse
2a20: 74 73 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 66  ts {}..foreach f
2a30: 72 61 67 6d 65 6e 74 69 74 65 6d 73 20 24 61 72  ragmentitems $ar
2a40: 67 73 20 7b 0a 09 20 20 20 20 69 6e 74 65 67 72  gs {..    integr
2a50: 69 74 79 20 61 73 73 65 72 74 20 7b 0a 09 09 5b  ity assert {...[
2a60: 6c 6c 65 6e 67 74 68 20 24 66 72 61 67 6d 65 6e  llength $fragmen
2a70: 74 69 74 65 6d 73 5d 0a 09 20 20 20 20 7d 20 7b  titems]..    } {
2a80: 41 74 74 65 6d 70 74 65 64 20 74 6f 20 63 72 65  Attempted to cre
2a90: 61 74 65 20 61 6e 20 65 6d 70 74 79 20 63 68 61  ate an empty cha
2aa0: 6e 67 65 73 65 74 2c 20 69 2e 65 2e 20 77 69 74  ngeset, i.e. wit
2ab0: 68 6f 75 74 20 69 74 65 6d 73 7d 0a 09 20 20 20  hout items}..   
2ac0: 20 6c 61 70 70 65 6e 64 20 6e 65 77 63 73 65 74   lappend newcset
2ad0: 73 20 5b 24 74 79 70 65 20 25 41 55 54 4f 25 20  s [$type %AUTO% 
2ae0: 24 70 72 6f 6a 65 63 74 20 24 63 73 74 79 70 65  $project $cstype
2af0: 20 24 63 73 73 72 63 20 5c 0a 09 09 09 09 20 20   $cssrc \.....  
2b00: 5b 55 6e 74 61 67 20 24 66 72 61 67 6d 65 6e 74  [Untag $fragment
2b10: 69 74 65 6d 73 20 24 63 73 74 79 70 65 5d 5d 0a  items $cstype]].
2b20: 09 7d 0a 0a 09 66 6f 72 65 61 63 68 20 63 20 24  .}...foreach c $
2b30: 6e 65 77 63 73 65 74 73 20 7b 20 24 63 20 70 65  newcsets { $c pe
2b40: 72 73 69 73 74 20 7d 0a 09 72 65 74 75 72 6e 20  rsist }..return 
2b50: 24 6e 65 77 63 73 65 74 73 0a 20 20 20 20 7d 0a  $newcsets.    }.
2b60: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
2b70: 73 74 72 6c 69 73 74 20 7b 63 68 61 6e 67 65 73  strlist {changes
2b80: 65 74 73 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b  ets} {..return [
2b90: 6a 6f 69 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69  join [struct::li
2ba0: 73 74 20 6d 61 70 20 24 63 68 61 6e 67 65 73 65  st map $changese
2bb0: 74 73 20 5b 6d 79 70 72 6f 63 20 49 44 5d 5d 5d  ts [myproc ID]]]
2bc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63  .    }..    proc
2bd0: 20 49 44 20 7b 63 73 65 74 7d 20 7b 20 24 63 73   ID {cset} { $cs
2be0: 65 74 20 73 74 72 20 7d 0a 0a 20 20 20 20 70 72  et str }..    pr
2bf0: 6f 63 20 55 6e 74 61 67 20 7b 74 61 67 67 65 64  oc Untag {tagged
2c00: 69 74 65 6d 73 20 63 73 74 79 70 65 7d 20 7b 0a  items cstype} {.
2c10: 09 72 65 74 75 72 6e 20 5b 73 74 72 75 63 74 3a  .return [struct:
2c20: 3a 6c 69 73 74 20 6d 61 70 20 24 74 61 67 67 65  :list map $tagge
2c30: 64 69 74 65 6d 73 20 5b 6d 79 70 72 6f 63 20 55  ditems [myproc U
2c40: 6e 74 61 67 31 20 24 63 73 74 79 70 65 5d 5d 0a  ntag1 $cstype]].
2c50: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20      }..    proc 
2c60: 55 6e 74 61 67 31 20 7b 63 73 74 79 70 65 20 74  Untag1 {cstype t
2c70: 68 65 69 74 65 6d 7d 20 7b 0a 09 73 74 72 75 63  heitem} {..struc
2c80: 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 24  t::list assign $
2c90: 74 68 65 69 74 65 6d 20 74 20 69 0a 09 69 6e 74  theitem t i..int
2ca0: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24  egrity assert {$
2cb0: 63 73 74 79 70 65 20 65 71 20 24 74 7d 20 7b 49  cstype eq $t} {I
2cc0: 74 65 6d 20 24 69 27 73 20 74 79 70 65 20 69 73  tem $i's type is
2cd0: 20 27 24 74 27 2c 20 65 78 70 65 63 74 65 64 20   '$t', expected 
2ce0: 27 24 63 73 74 79 70 65 27 7d 0a 09 72 65 74 75  '$cstype'}..retu
2cf0: 72 6e 20 24 69 0a 20 20 20 20 7d 0a 0a 20 20 20  rn $i.    }..   
2d00: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23   # # ## ### ####
2d10: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
2d20: 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20  ########.    ## 
2d30: 53 74 61 74 65 0a 0a 20 20 20 20 76 61 72 69 61  State..    varia
2d40: 62 6c 65 20 6d 79 69 64 20 20 20 20 20 20 20 20  ble myid        
2d50: 7b 7d 20 3b 20 23 20 49 64 20 6f 66 20 74 68 65  {} ; # Id of the
2d60: 20 63 73 65 74 20 66 6f 72 20 74 68 65 20 70 65   cset for the pe
2d70: 72 73 69 73 74 65 6e 74 0a 09 09 09 20 20 20 20  rsistent....    
2d80: 20 20 23 20 73 74 61 74 65 2e 0a 20 20 20 20 76    # state..    v
2d90: 61 72 69 61 62 6c 65 20 6d 79 70 72 6f 6a 65 63  ariable myprojec
2da0: 74 20 20 20 7b 7d 20 3b 20 23 20 52 65 66 65 72  t   {} ; # Refer
2db0: 65 6e 63 65 20 6f 66 20 74 68 65 20 70 72 6f 6a  ence of the proj
2dc0: 65 63 74 20 6f 62 6a 65 63 74 20 74 68 65 0a 09  ect object the..
2dd0: 09 09 20 20 20 20 20 20 23 20 63 68 61 6e 67 65  ..      # change
2de0: 73 65 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a  set belongs to..
2df0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 74      variable myt
2e00: 79 70 65 20 20 20 20 20 20 7b 7d 20 3b 20 23 20  ype      {} ; # 
2e10: 57 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 73  What the changes
2e20: 65 74 20 69 73 20 62 61 73 65 64 20 6f 6e 0a 09  et is based on..
2e30: 09 09 20 20 20 20 20 20 23 20 28 72 65 76 69 73  ..      # (revis
2e40: 69 6f 6e 73 2c 20 74 61 67 73 2c 20 6f 72 20 62  ions, tags, or b
2e50: 72 61 6e 63 68 65 73 29 2e 0a 09 09 09 20 20 20  ranches).....   
2e60: 20 20 20 23 20 56 61 6c 75 65 73 3a 20 53 65 65     # Values: See
2e70: 20 6d 79 63 73 74 79 70 65 2e 20 4e 6f 74 65 20   mycstype. Note 
2e80: 74 68 61 74 20 77 65 0a 09 09 09 20 20 20 20 20  that we....     
2e90: 20 23 20 68 61 76 65 20 74 6f 20 6b 65 65 70 20   # have to keep 
2ea0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  the names of the
2eb0: 20 68 65 6c 70 65 72 0a 09 09 09 20 20 20 20 20   helper....     
2ec0: 20 23 20 73 69 6e 67 6c 65 74 6f 6e 73 20 69 6e   # singletons in
2ed0: 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 63   sync with the c
2ee0: 6f 6e 74 65 6e 74 73 0a 09 09 09 20 20 20 20 20  ontents....     
2ef0: 20 23 20 6f 66 20 73 74 61 74 65 20 74 61 62 6c   # of state tabl
2f00: 65 20 27 63 73 74 79 70 65 27 2c 20 61 6e 64 20  e 'cstype', and 
2f10: 76 61 72 69 6f 75 73 0a 09 09 09 20 20 20 20 20  various....     
2f20: 20 23 20 6f 74 68 65 72 20 70 6c 61 63 65 73 20   # other places 
2f30: 75 73 69 6e 67 20 74 68 65 6d 20 68 61 72 64 77  using them hardw
2f40: 69 72 65 64 2e 0a 20 20 20 20 76 61 72 69 61 62  ired..    variab
2f50: 6c 65 20 6d 79 74 79 70 65 6f 62 6a 20 20 20 7b  le mytypeobj   {
2f60: 7d 20 3b 20 23 20 52 65 66 65 72 65 6e 63 65 20  } ; # Reference 
2f70: 74 6f 20 74 68 65 20 63 6f 6e 74 61 69 6e 65 72  to the container
2f80: 20 66 6f 72 20 74 68 65 0a 09 09 09 20 20 20 20   for the....    
2f90: 20 20 23 20 74 79 70 65 20 64 65 70 65 6e 64 65    # type depende
2fa0: 6e 74 20 63 6f 64 65 2e 20 44 65 72 69 76 65 64  nt code. Derived
2fb0: 20 66 72 6f 6d 0a 09 09 09 20 20 20 20 20 20 23   from....      #
2fc0: 20 6d 79 74 79 70 65 2e 0a 20 20 20 20 76 61 72   mytype..    var
2fd0: 69 61 62 6c 65 20 6d 79 73 72 63 69 64 20 20 20  iable mysrcid   
2fe0: 20 20 7b 7d 20 3b 20 23 20 49 64 20 6f 66 20 74    {} ; # Id of t
2ff0: 68 65 20 6d 65 74 61 64 61 74 61 20 6f 72 20 73  he metadata or s
3000: 79 6d 62 6f 6c 20 74 68 65 20 63 73 65 74 0a 09  ymbol the cset..
3010: 09 09 20 20 20 20 20 20 23 20 69 73 20 62 61 73  ..      # is bas
3020: 65 64 20 6f 6e 2e 0a 20 20 20 20 76 61 72 69 61  ed on..    varia
3030: 62 6c 65 20 6d 79 69 74 65 6d 73 20 20 20 20 20  ble myitems     
3040: 7b 7d 20 3b 20 23 20 4c 69 73 74 20 6f 66 20 74  {} ; # List of t
3050: 68 65 20 66 69 6c 65 20 6c 65 76 65 6c 20 72 65  he file level re
3060: 76 69 73 69 6f 6e 73 2c 0a 09 09 09 20 20 20 20  visions,....    
3070: 20 20 23 20 74 61 67 73 2c 20 6f 72 20 62 72 61    # tags, or bra
3080: 6e 63 68 65 73 20 69 6e 20 74 68 65 20 63 73 65  nches in the cse
3090: 74 2c 20 61 73 0a 09 09 09 20 20 20 20 20 20 23  t, as....      #
30a0: 20 69 64 73 2e 20 4e 6f 74 20 74 61 67 67 65 64   ids. Not tagged
30b0: 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d  ..    variable m
30c0: 79 74 69 74 65 6d 73 20 20 20 20 7b 7d 20 3b 20  ytitems    {} ; 
30d0: 23 20 41 73 20 6d 79 69 74 65 6d 73 2c 20 74 68  # As myitems, th
30e0: 65 20 74 61 67 67 65 64 20 66 6f 72 6d 2e 0a 20  e tagged form.. 
30f0: 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 70 72     variable mypr
3100: 65 6d 61 70 20 20 20 20 7b 7d 20 3b 20 23 20 44  emap    {} ; # D
3110: 69 63 74 69 6f 6e 61 72 79 20 6d 61 70 70 69 6e  ictionary mappin
3120: 67 20 66 72 6f 6d 20 74 68 65 20 69 74 65 6d 73  g from the items
3130: 20 28 74 61 67 67 65 64 20 6e 6f 77 29 0a 09 09   (tagged now)...
3140: 09 20 20 20 20 20 20 23 20 74 6f 20 74 68 65 69  .      # to thei
3150: 72 20 70 72 65 64 65 63 65 73 73 6f 72 73 2c 20  r predecessors, 
3160: 61 6c 73 6f 20 74 61 67 67 65 64 2e 20 41 0a 09  also tagged. A..
3170: 09 09 20 20 20 20 20 20 23 20 63 61 63 68 65 20  ..      # cache 
3180: 74 6f 20 61 76 6f 69 64 20 6c 6f 61 64 69 6e 67  to avoid loading
3190: 20 74 68 69 73 20 66 72 6f 6d 20 74 68 65 0a 09   this from the..
31a0: 09 09 20 20 20 20 20 20 23 20 73 74 61 74 65 20  ..      # state 
31b0: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 2e 0a  more than once..
31c0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 6e      variable myn
31d0: 65 78 74 6d 61 70 20 20 20 7b 7d 20 3b 20 23 20  extmap   {} ; # 
31e0: 44 69 63 74 69 6f 6e 61 72 79 20 6d 61 70 70 69  Dictionary mappi
31f0: 6e 67 20 66 72 6f 6d 20 74 68 65 20 69 74 65 6d  ng from the item
3200: 73 20 28 74 61 67 67 65 64 29 0a 09 09 09 20 20  s (tagged)....  
3210: 20 20 20 20 23 20 74 6f 20 74 68 65 69 72 20 73      # to their s
3220: 75 63 63 65 73 73 6f 72 73 20 28 61 6c 73 6f 20  uccessors (also 
3230: 74 61 67 67 65 64 29 2e 20 41 0a 09 09 09 20 20  tagged). A....  
3240: 20 20 20 20 23 20 63 61 63 68 65 20 74 6f 20 61      # cache to a
3250: 76 6f 69 64 20 6c 6f 61 64 69 6e 67 20 74 68 69  void loading thi
3260: 73 20 66 72 6f 6d 20 74 68 65 0a 09 09 09 20 20  s from the....  
3270: 20 20 20 20 23 20 73 74 61 74 65 20 6d 6f 72 65      # state more
3280: 20 74 68 61 6e 20 6f 6e 63 65 2e 0a 20 20 20 20   than once..    
3290: 76 61 72 69 61 62 6c 65 20 6d 79 70 6f 73 20 20  variable mypos  
32a0: 20 20 20 20 20 7b 7d 20 3b 20 23 20 43 6f 6d 6d       {} ; # Comm
32b0: 69 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  it position of t
32c0: 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20 69 66  he changeset, if
32d0: 0a 09 09 09 20 20 20 20 20 20 23 20 6b 6e 6f 77  ....      # know
32e0: 6e 2e 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23  n...    # # ## #
32f0: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
3300: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  # #############.
3310: 20 20 20 20 23 23 20 49 6e 74 65 72 6e 61 6c 20      ## Internal 
3320: 6d 65 74 68 6f 64 73 0a 0a 20 20 20 20 74 79 70  methods..    typ
3330: 65 76 61 72 69 61 62 6c 65 20 6d 79 63 6f 75 6e  evariable mycoun
3340: 74 65 72 20 20 20 20 20 20 20 20 30 20 3b 20 23  ter        0 ; #
3350: 20 49 64 20 63 6f 75 6e 74 65 72 20 66 6f 72 20   Id counter for 
3360: 63 73 65 74 73 2e 20 4c 61 73 74 20 69 64 0a 09  csets. Last id..
3370: 09 09 09 20 20 20 20 20 20 23 20 75 73 65 64 2e  ...      # used.
3380: 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c  .    typevariabl
3390: 65 20 6d 79 63 73 74 79 70 65 20 2d 61 72 72 61  e mycstype -arra
33a0: 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 63 73 74  y {} ; # Map cst
33b0: 79 70 65 73 20 28 6e 61 6d 65 73 29 20 74 6f 20  ypes (names) to 
33c0: 70 65 72 73 69 73 74 65 6e 74 0a 09 09 09 09 20  persistent..... 
33d0: 20 20 20 20 20 23 20 69 64 73 2e 20 4e 6f 74 65       # ids. Note
33e0: 20 74 68 61 74 20 77 65 20 68 61 76 65 20 74 6f   that we have to
33f0: 20 6b 65 65 70 0a 09 09 09 09 20 20 20 20 20 20   keep.....      
3400: 23 20 74 68 65 20 6e 61 6d 65 73 20 69 6e 20 74  # the names in t
3410: 68 65 20 74 61 62 6c 65 20 27 63 73 74 79 70 65  he table 'cstype
3420: 27 0a 09 09 09 09 20 20 20 20 20 20 23 20 69 6e  '.....      # in
3430: 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 6e   sync with the n
3440: 61 6d 65 73 20 6f 66 20 74 68 65 0a 09 09 09 09  ames of the.....
3450: 20 20 20 20 20 20 23 20 68 65 6c 70 65 72 20 73        # helper s
3460: 69 6e 67 6c 65 74 6f 6e 73 2e 0a 0a 20 20 20 20  ingletons...    
3470: 74 79 70 65 6d 65 74 68 6f 64 20 67 65 74 63 73  typemethod getcs
3480: 74 79 70 65 73 20 7b 7d 20 7b 0a 09 66 6f 72 65  types {} {..fore
3490: 61 63 68 20 7b 74 69 64 20 6e 61 6d 65 7d 20 5b  ach {tid name} [
34a0: 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20  state run {..   
34b0: 20 53 45 4c 45 43 54 20 74 69 64 2c 20 6e 61 6d   SELECT tid, nam
34c0: 65 20 46 52 4f 4d 20 63 73 74 79 70 65 3b 0a 09  e FROM cstype;..
34d0: 7d 5d 20 7b 20 73 65 74 20 6d 79 63 73 74 79 70  }] { set mycstyp
34e0: 65 28 24 6e 61 6d 65 29 20 24 74 69 64 20 7d 0a  e($name) $tid }.
34f0: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
3500: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c 6f     typemethod lo
3510: 61 64 63 6f 75 6e 74 65 72 20 7b 7d 20 7b 0a 09  adcounter {} {..
3520: 23 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  # Initialize the
3530: 20 63 6f 75 6e 74 65 72 20 66 72 6f 6d 20 74 68   counter from th
3540: 65 20 73 74 61 74 65 0a 09 73 65 74 20 6d 79 63  e state..set myc
3550: 6f 75 6e 74 65 72 20 5b 73 74 61 74 65 20 6f 6e  ounter [state on
3560: 65 20 7b 20 53 45 4c 45 43 54 20 4d 41 58 28 63  e { SELECT MAX(c
3570: 69 64 29 20 46 52 4f 4d 20 63 68 61 6e 67 65 73  id) FROM changes
3580: 65 74 20 7d 5d 0a 09 72 65 74 75 72 6e 0a 20 20  et }]..return.  
3590: 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74    }..    typemet
35a0: 68 6f 64 20 6e 75 6d 20 7b 7d 20 7b 20 72 65 74  hod num {} { ret
35b0: 75 72 6e 20 24 6d 79 63 6f 75 6e 74 65 72 20 7d  urn $mycounter }
35c0: 0a 0a 20 20 20 20 70 72 6f 63 20 49 6e 69 74 69  ..    proc Initi
35d0: 61 6c 69 7a 65 42 72 65 61 6b 53 74 61 74 65 20  alizeBreakState 
35e0: 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75  {revisions} {..u
35f0: 70 76 61 72 20 31 20 70 6f 73 20 70 6f 73 20 63  pvar 1 pos pos c
3600: 72 6f 73 73 20 63 72 6f 73 73 20 72 61 6e 67 65  ross cross range
3610: 20 72 61 6e 67 65 20 64 65 70 63 20 64 65 70 63   range depc depc
3620: 20 64 65 6c 74 61 20 64 65 6c 74 61 20 5c 0a 09   delta delta \..
3630: 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65 73      dependencies
3640: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 0a 09   dependencies...
3650: 23 20 46 69 72 73 74 20 77 65 20 63 72 65 61 74  # First we creat
3660: 65 20 61 20 6d 61 70 20 6f 66 20 70 6f 73 69 74  e a map of posit
3670: 69 6f 6e 73 20 74 6f 20 6d 61 6b 65 20 69 74 20  ions to make it 
3680: 65 61 73 69 65 72 20 74 6f 0a 09 23 20 64 65 74  easier to..# det
3690: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 61  ermine whether a
36a0: 20 64 65 70 65 6e 64 65 6e 63 79 20 63 72 6f 73   dependency cros
36b0: 73 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  ses a particular
36c0: 20 69 6e 64 65 78 2e 0a 0a 09 61 72 72 61 79 20   index....array 
36d0: 73 65 74 20 70 6f 73 20 20 20 7b 7d 0a 09 61 72  set pos   {}..ar
36e0: 72 61 79 20 73 65 74 20 63 72 6f 73 73 20 7b 7d  ray set cross {}
36f0: 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 70 63  ..array set depc
3700: 20 20 7b 7d 0a 09 73 65 74 20 72 61 6e 67 65 20    {}..set range 
3710: 20 20 20 20 20 20 7b 7d 0a 09 73 65 74 20 6e 20        {}..set n 
3720: 30 0a 09 66 6f 72 65 61 63 68 20 72 65 76 20 24  0..foreach rev $
3730: 72 65 76 69 73 69 6f 6e 73 20 7b 0a 09 20 20 20  revisions {..   
3740: 20 6c 61 70 70 65 6e 64 20 72 61 6e 67 65 20 24   lappend range $
3750: 6e 0a 09 20 20 20 20 73 65 74 20 70 6f 73 28 24  n..    set pos($
3760: 72 65 76 29 20 24 6e 0a 09 20 20 20 20 73 65 74  rev) $n..    set
3770: 20 63 72 6f 73 73 28 24 6e 29 20 30 0a 09 20 20   cross($n) 0..  
3780: 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 0a 09 23 20    incr n..}...# 
3790: 53 65 63 6f 6e 64 6c 79 20 77 65 20 63 6f 75 6e  Secondly we coun
37a0: 74 20 74 68 65 20 63 72 6f 73 73 69 6e 67 73 20  t the crossings 
37b0: 70 65 72 20 70 6f 73 69 74 69 6f 6e 2c 20 62 79  per position, by
37c0: 20 69 74 65 72 61 74 69 6e 67 0a 09 23 20 6f 76   iterating..# ov
37d0: 65 72 20 74 68 65 20 72 65 63 6f 72 64 65 64 20  er the recorded 
37e0: 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65  internal depende
37f0: 6e 63 69 65 73 2e 0a 0a 09 23 20 4e 6f 74 65 3a  ncies....# Note:
3800: 20 49 66 20 74 68 65 20 74 69 6d 65 73 74 61 6d   If the timestam
3810: 70 73 20 61 72 65 20 62 61 64 6c 79 20 6f 75 74  ps are badly out
3820: 20 6f 66 20 6f 72 64 65 72 20 69 74 20 69 73 0a   of order it is.
3830: 09 23 20 20 20 20 20 20 20 70 6f 73 73 69 62 6c  .#       possibl
3840: 65 20 74 6f 20 68 61 76 65 20 61 20 62 61 63 6b  e to have a back
3850: 77 61 72 64 20 73 75 63 63 65 73 73 6f 72 20 64  ward successor d
3860: 65 70 65 6e 64 65 6e 63 79 2c 0a 09 23 20 20 20  ependency,..#   
3870: 20 20 20 20 69 2e 65 2e 20 77 69 74 68 20 73 74      i.e. with st
3880: 61 72 74 20 3e 20 65 6e 64 2e 20 57 65 20 6d 61  art > end. We ma
3890: 79 20 68 61 76 65 20 74 6f 20 73 77 61 70 20 74  y have to swap t
38a0: 68 65 20 69 6e 64 69 63 65 73 0a 09 23 20 20 20  he indices..#   
38b0: 20 20 20 20 74 6f 20 65 6e 73 75 72 65 20 74 68      to ensure th
38c0: 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  at the following
38d0: 20 6c 6f 6f 70 20 72 75 6e 73 20 63 6f 72 72 65   loop runs corre
38e0: 63 74 6c 79 2e 0a 09 23 0a 09 23 20 4e 6f 74 65  ctly...#..# Note
38f0: 20 32 3a 20 73 74 61 72 74 20 3d 3d 20 65 6e 64   2: start == end
3900: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
3910: 2e 20 49 74 20 69 6e 64 69 63 61 74 65 73 20 61  . It indicates a
3920: 0a 09 23 20 20 20 20 20 20 20 20 20 73 65 6c 66  ..#         self
3930: 2d 64 65 70 65 6e 64 65 6e 63 79 20 64 75 65 20  -dependency due 
3940: 74 6f 20 74 68 65 20 75 6e 69 71 75 65 6e 65 73  to the uniquenes
3950: 73 20 6f 66 20 70 6f 73 69 74 69 6f 6e 73 2c 0a  s of positions,.
3960: 09 23 20 20 20 20 20 20 20 20 20 61 6e 64 20 74  .#         and t
3970: 68 61 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  hat is something
3980: 20 77 65 20 68 61 76 65 20 72 75 6c 65 64 20 6f   we have ruled o
3990: 75 74 20 61 6c 72 65 61 64 79 2c 20 73 65 65 0a  ut already, see.
39a0: 09 23 20 20 20 20 20 20 20 20 20 27 72 65 76 20  .#         'rev 
39b0: 69 6e 74 65 72 6e 61 6c 73 75 63 63 65 73 73 6f  internalsuccesso
39c0: 72 73 27 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b  rs'....foreach {
39d0: 72 69 64 20 63 68 69 6c 64 72 65 6e 7d 20 5b 61  rid children} [a
39e0: 72 72 61 79 20 67 65 74 20 64 65 70 65 6e 64 65  rray get depende
39f0: 6e 63 69 65 73 5d 20 7b 0a 09 20 20 20 20 66 6f  ncies] {..    fo
3a00: 72 65 61 63 68 20 63 68 69 6c 64 20 24 63 68 69  reach child $chi
3a10: 6c 64 72 65 6e 20 7b 0a 09 09 73 65 74 20 64 6b  ldren {...set dk
3a20: 65 79 20 20 20 20 5b 6c 69 73 74 20 24 72 69 64  ey    [list $rid
3a30: 20 24 63 68 69 6c 64 5d 0a 09 09 73 65 74 20 73   $child]...set s
3a40: 74 61 72 74 20 20 20 24 70 6f 73 28 24 72 69 64  tart   $pos($rid
3a50: 29 0a 09 09 73 65 74 20 65 6e 64 20 20 20 20 20  )...set end     
3a60: 24 70 6f 73 28 24 63 68 69 6c 64 29 0a 09 09 73  $pos($child)...s
3a70: 65 74 20 63 72 6f 73 73 65 73 20 7b 7d 0a 0a 09  et crosses {}...
3a80: 09 69 66 20 7b 24 73 74 61 72 74 20 3e 20 24 65  .if {$start > $e
3a90: 6e 64 7d 20 7b 0a 09 09 20 20 20 20 77 68 69 6c  nd} {...    whil
3aa0: 65 20 7b 24 65 6e 64 20 3c 20 24 73 74 61 72 74  e {$end < $start
3ab0: 7d 20 7b 0a 09 09 09 6c 61 70 70 65 6e 64 20 63  } {....lappend c
3ac0: 72 6f 73 73 65 73 20 24 65 6e 64 0a 09 09 09 69  rosses $end....i
3ad0: 6e 63 72 20 63 72 6f 73 73 28 24 65 6e 64 29 0a  ncr cross($end).
3ae0: 09 09 09 69 6e 63 72 20 65 6e 64 0a 09 09 20 20  ...incr end...  
3af0: 20 20 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09    }...} else {..
3b00: 09 20 20 20 20 77 68 69 6c 65 20 7b 24 73 74 61  .    while {$sta
3b10: 72 74 20 3c 20 24 65 6e 64 7d 20 7b 0a 09 09 09  rt < $end} {....
3b20: 6c 61 70 70 65 6e 64 20 63 72 6f 73 73 65 73 20  lappend crosses 
3b30: 24 73 74 61 72 74 0a 09 09 09 69 6e 63 72 20 63  $start....incr c
3b40: 72 6f 73 73 28 24 73 74 61 72 74 29 0a 09 09 09  ross($start)....
3b50: 69 6e 63 72 20 73 74 61 72 74 0a 09 09 20 20 20  incr start...   
3b60: 20 7d 0a 09 09 7d 0a 09 09 73 65 74 20 64 65 70   }...}...set dep
3b70: 63 28 24 64 6b 65 79 29 20 24 63 72 6f 73 73 65  c($dkey) $crosse
3b80: 73 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 49 6e  s..    }..}...In
3b90: 69 74 69 61 6c 69 7a 65 44 65 6c 74 61 73 20 24  itializeDeltas $
3ba0: 72 65 76 69 73 69 6f 6e 73 0a 09 72 65 74 75 72  revisions..retur
3bb0: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f  n.    }..    pro
3bc0: 63 20 49 6e 69 74 69 61 6c 69 7a 65 44 65 6c 74  c InitializeDelt
3bd0: 61 73 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b  as {revisions} {
3be0: 0a 09 75 70 76 61 72 20 31 20 64 65 6c 74 61 20  ..upvar 1 delta 
3bf0: 64 65 6c 74 61 0a 0a 09 23 20 50 75 6c 6c 20 74  delta...# Pull t
3c00: 68 65 20 74 69 6d 65 73 74 61 6d 70 73 20 66 6f  he timestamps fo
3c10: 72 20 61 6c 6c 20 72 65 76 69 73 69 6f 6e 73 20  r all revisions 
3c20: 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  in the changeset
3c30: 73 20 61 6e 64 0a 09 23 20 63 6f 6d 70 75 74 65  s and..# compute
3c40: 20 74 68 65 69 72 20 64 65 6c 74 61 73 20 66 6f   their deltas fo
3c50: 72 20 75 73 65 20 62 79 20 74 68 65 20 62 72 65  r use by the bre
3c60: 61 6b 20 66 69 6e 64 65 72 2e 0a 0a 09 61 72 72  ak finder....arr
3c70: 61 79 20 73 65 74 20 64 65 6c 74 61 20 7b 7d 0a  ay set delta {}.
3c80: 09 61 72 72 61 79 20 73 65 74 20 73 74 61 6d 70  .array set stamp
3c90: 20 7b 7d 0a 0a 09 73 65 74 20 74 68 65 73 65 74   {}...set theset
3ca0: 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69   ('[join $revisi
3cb0: 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66 6f  ons {','}]')..fo
3cc0: 72 65 61 63 68 20 7b 72 69 64 20 74 69 6d 65 7d  reach {rid time}
3cd0: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20   [state run ".. 
3ce0: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c     SELECT R.rid,
3cf0: 20 52 2e 64 61 74 65 0a 09 20 20 20 20 46 52 4f   R.date..    FRO
3d00: 4d 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20  M revision R..  
3d10: 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 49 4e    WHERE R.rid IN
3d20: 20 24 74 68 65 73 65 74 0a 09 22 5d 20 7b 0a 09   $theset.."] {..
3d30: 20 20 20 20 73 65 74 20 73 74 61 6d 70 28 24 72      set stamp($r
3d40: 69 64 29 20 24 74 69 6d 65 0a 09 7d 0a 0a 09 73  id) $time..}...s
3d50: 65 74 20 6e 20 30 0a 09 66 6f 72 65 61 63 68 20  et n 0..foreach 
3d60: 72 69 64 20 5b 6c 72 61 6e 67 65 20 24 72 65 76  rid [lrange $rev
3d70: 69 73 69 6f 6e 73 20 30 20 65 6e 64 2d 31 5d 20  isions 0 end-1] 
3d80: 72 6e 65 78 74 20 5b 6c 72 61 6e 67 65 20 24 72  rnext [lrange $r
3d90: 65 76 69 73 69 6f 6e 73 20 31 20 65 6e 64 5d 20  evisions 1 end] 
3da0: 7b 0a 09 20 20 20 20 73 65 74 20 64 65 6c 74 61  {..    set delta
3db0: 28 24 6e 29 20 5b 65 78 70 72 20 7b 24 73 74 61  ($n) [expr {$sta
3dc0: 6d 70 28 24 72 6e 65 78 74 29 20 2d 20 24 73 74  mp($rnext) - $st
3dd0: 61 6d 70 28 24 72 69 64 29 7d 5d 0a 09 20 20 20  amp($rid)}]..   
3de0: 20 69 6e 63 72 20 6e 0a 09 7d 0a 09 72 65 74 75   incr n..}..retu
3df0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72  rn.    }..    pr
3e00: 6f 63 20 46 69 6e 64 42 65 73 74 42 72 65 61 6b  oc FindBestBreak
3e10: 20 7b 72 61 6e 67 65 7d 20 7b 0a 09 75 70 76 61   {range} {..upva
3e20: 72 20 31 20 63 72 6f 73 73 20 63 72 6f 73 73 20  r 1 cross cross 
3e30: 64 65 6c 74 61 20 64 65 6c 74 61 0a 0a 09 23 20  delta delta...# 
3e40: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65  Determine the be
3e50: 73 74 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f  st break locatio
3e60: 6e 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 72  n in the given r
3e70: 61 6e 67 65 20 6f 66 0a 09 23 20 70 6f 73 69 74  ange of..# posit
3e80: 69 6f 6e 73 2e 20 46 69 72 73 74 20 77 65 20 6c  ions. First we l
3e90: 6f 6f 6b 20 66 6f 72 20 74 68 65 20 6c 6f 63 61  ook for the loca
3ea0: 74 69 6f 6e 73 20 77 69 74 68 20 74 68 65 20 6d  tions with the m
3eb0: 61 78 69 6d 61 6c 0a 09 23 20 6e 75 6d 62 65 72  aximal..# number
3ec0: 20 6f 66 20 63 72 6f 73 73 69 6e 67 73 2e 20 49   of crossings. I
3ed0: 66 20 74 68 65 72 65 20 61 72 65 20 73 65 76 65  f there are seve
3ee0: 72 61 6c 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20  ral we look for 
3ef0: 74 68 65 0a 09 23 20 73 68 6f 72 74 65 73 74 20  the..# shortest 
3f00: 74 69 6d 65 20 69 6e 74 65 72 76 61 6c 20 61 6d  time interval am
3f10: 6f 6e 67 20 74 68 65 6d 2e 20 49 66 20 77 65 20  ong them. If we 
3f20: 73 74 69 6c 6c 20 68 61 76 65 20 6d 75 6c 74 69  still have multi
3f30: 70 6c 65 0a 09 23 20 70 6f 73 73 69 62 69 6c 69  ple..# possibili
3f40: 74 69 65 73 20 61 66 74 65 72 20 74 68 61 74 20  ties after that 
3f50: 77 65 20 73 65 6c 65 63 74 20 74 68 65 20 65 61  we select the ea
3f60: 72 6c 69 65 73 74 20 6c 6f 63 61 74 69 6f 6e 0a  rliest location.
3f70: 09 23 20 61 6d 6f 6e 67 20 74 68 65 73 65 2e 0a  .# among these..
3f80: 0a 09 23 20 4e 6f 74 65 3a 20 49 66 20 74 68 65  ..# Note: If the
3f90: 20 6d 61 78 69 6d 61 6c 20 6e 75 6d 62 65 72 20   maximal number 
3fa0: 6f 66 20 63 72 6f 73 73 69 6e 67 73 20 69 73 20  of crossings is 
3fb0: 30 20 74 68 65 6e 20 74 68 65 20 72 61 6e 67 65  0 then the range
3fc0: 0a 09 23 20 20 20 20 20 20 20 68 61 73 20 6e 6f  ..#       has no
3fd0: 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64   internal depend
3fe0: 65 6e 63 69 65 73 2c 20 61 6e 64 20 6e 6f 20 62  encies, and no b
3ff0: 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 61 74  reak location at
4000: 0a 09 23 20 20 20 20 20 20 20 61 6c 6c 2e 20 54  ..#       all. T
4010: 68 69 73 20 70 6f 73 73 69 62 69 6c 69 74 79 20  his possibility 
4020: 69 73 20 73 69 67 6e 61 6c 65 64 20 76 69 61 20  is signaled via 
4030: 72 65 73 75 6c 74 20 2d 31 2e 0a 0a 09 23 20 4e  result -1....# N
4040: 6f 74 65 3a 20 41 20 72 61 6e 67 65 20 6f 66 20  ote: A range of 
4050: 6c 65 6e 67 74 68 20 31 20 6f 72 20 6c 65 73 73  length 1 or less
4060: 20 63 61 6e 6e 6f 74 20 68 61 76 65 20 69 6e 74   cannot have int
4070: 65 72 6e 61 6c 0a 09 23 20 20 20 20 20 20 20 64  ernal..#       d
4080: 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 20  ependencies, as 
4090: 74 68 61 74 20 6e 65 65 64 73 20 61 74 20 6c 65  that needs at le
40a0: 61 73 74 20 74 77 6f 20 72 65 76 69 73 69 6f 6e  ast two revision
40b0: 73 20 69 6e 0a 09 23 20 20 20 20 20 20 20 74 68  s in..#       th
40c0: 65 20 72 61 6e 67 65 2e 0a 0a 09 69 66 20 7b 5b  e range....if {[
40d0: 6c 6c 65 6e 67 74 68 20 24 72 61 6e 67 65 5d 20  llength $range] 
40e0: 3c 20 32 7d 20 7b 20 72 65 74 75 72 6e 20 2d 31  < 2} { return -1
40f0: 20 7d 0a 0a 09 73 65 74 20 6d 61 78 20 2d 31 0a   }...set max -1.
4100: 09 73 65 74 20 62 65 73 74 20 7b 7d 0a 0a 09 66  .set best {}...f
4110: 6f 72 65 61 63 68 20 6c 6f 63 61 74 69 6f 6e 20  oreach location 
4120: 24 72 61 6e 67 65 20 7b 0a 09 20 20 20 20 73 65  $range {..    se
4130: 74 20 63 72 6f 73 73 69 6e 67 73 20 24 63 72 6f  t crossings $cro
4140: 73 73 28 24 6c 6f 63 61 74 69 6f 6e 29 0a 09 20  ss($location).. 
4150: 20 20 20 69 66 20 7b 24 63 72 6f 73 73 69 6e 67     if {$crossing
4160: 73 20 3e 20 24 6d 61 78 7d 20 7b 0a 09 09 73 65  s > $max} {...se
4170: 74 20 6d 61 78 20 20 24 63 72 6f 73 73 69 6e 67  t max  $crossing
4180: 73 0a 09 09 73 65 74 20 62 65 73 74 20 5b 6c 69  s...set best [li
4190: 73 74 20 24 6c 6f 63 61 74 69 6f 6e 5d 0a 09 09  st $location]...
41a0: 63 6f 6e 74 69 6e 75 65 0a 09 20 20 20 20 7d 20  continue..    } 
41b0: 65 6c 73 65 69 66 20 7b 24 63 72 6f 73 73 69 6e  elseif {$crossin
41c0: 67 73 20 3d 3d 20 24 6d 61 78 7d 20 7b 0a 09 09  gs == $max} {...
41d0: 6c 61 70 70 65 6e 64 20 62 65 73 74 20 24 6c 6f  lappend best $lo
41e0: 63 61 74 69 6f 6e 0a 09 20 20 20 20 7d 0a 09 7d  cation..    }..}
41f0: 0a 0a 09 69 66 20 7b 24 6d 61 78 20 3d 3d 20 30  ...if {$max == 0
4200: 7d 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 72  }            { r
4210: 65 74 75 72 6e 20 2d 31 20 7d 0a 09 69 66 20 7b  eturn -1 }..if {
4220: 5b 6c 6c 65 6e 67 74 68 20 24 62 65 73 74 5d 20  [llength $best] 
4230: 3d 3d 20 31 7d 20 7b 20 72 65 74 75 72 6e 20 5b  == 1} { return [
4240: 6c 69 6e 64 65 78 20 24 62 65 73 74 20 30 5d 20  lindex $best 0] 
4250: 7d 0a 0a 09 73 65 74 20 6c 6f 63 61 74 69 6f 6e  }...set location
4260: 73 20 24 62 65 73 74 0a 09 73 65 74 20 62 65 73  s $best..set bes
4270: 74 20 7b 7d 0a 09 73 65 74 20 6d 69 6e 20 2d 31  t {}..set min -1
4280: 0a 0a 09 66 6f 72 65 61 63 68 20 6c 6f 63 61 74  ...foreach locat
4290: 69 6f 6e 20 24 6c 6f 63 61 74 69 6f 6e 73 20 7b  ion $locations {
42a0: 0a 09 20 20 20 20 73 65 74 20 69 6e 74 65 72 76  ..    set interv
42b0: 61 6c 20 24 64 65 6c 74 61 28 24 6c 6f 63 61 74  al $delta($locat
42c0: 69 6f 6e 29 0a 09 20 20 20 20 69 66 20 7b 28 24  ion)..    if {($
42d0: 6d 69 6e 20 3c 20 30 29 20 7c 7c 20 28 24 69 6e  min < 0) || ($in
42e0: 74 65 72 76 61 6c 20 3c 20 24 6d 69 6e 29 7d 20  terval < $min)} 
42f0: 7b 0a 09 09 73 65 74 20 6d 69 6e 20 20 24 69 6e  {...set min  $in
4300: 74 65 72 76 61 6c 0a 09 09 73 65 74 20 62 65 73  terval...set bes
4310: 74 20 5b 6c 69 73 74 20 24 6c 6f 63 61 74 69 6f  t [list $locatio
4320: 6e 5d 0a 09 20 20 20 20 7d 20 65 6c 73 65 69 66  n]..    } elseif
4330: 20 7b 24 69 6e 74 65 72 76 61 6c 20 3d 3d 20 24   {$interval == $
4340: 6d 69 6e 7d 20 7b 0a 09 09 6c 61 70 70 65 6e 64  min} {...lappend
4350: 20 62 65 73 74 20 24 6c 6f 63 61 74 69 6f 6e 0a   best $location.
4360: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b  .    }..}...if {
4370: 5b 6c 6c 65 6e 67 74 68 20 24 62 65 73 74 5d 20  [llength $best] 
4380: 3d 3d 20 31 7d 20 7b 20 72 65 74 75 72 6e 20 5b  == 1} { return [
4390: 6c 69 6e 64 65 78 20 24 62 65 73 74 20 30 5d 20  lindex $best 0] 
43a0: 7d 0a 0a 09 72 65 74 75 72 6e 20 5b 6c 69 6e 64  }...return [lind
43b0: 65 78 20 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 67  ex [lsort -integ
43c0: 65 72 20 2d 69 6e 63 72 65 61 73 69 6e 67 20 24  er -increasing $
43d0: 62 65 73 74 5d 20 30 5d 0a 20 20 20 20 7d 0a 0a  best] 0].    }..
43e0: 20 20 20 20 70 72 6f 63 20 43 75 74 41 74 20 7b      proc CutAt {
43f0: 6c 6f 63 61 74 69 6f 6e 7d 20 7b 0a 09 75 70 76  location} {..upv
4400: 61 72 20 31 20 63 72 6f 73 73 20 63 72 6f 73 73  ar 1 cross cross
4410: 20 64 65 70 63 20 64 65 70 63 0a 0a 09 23 20 49   depc depc...# I
4420: 74 20 77 61 73 20 64 65 63 69 64 65 64 20 74 6f  t was decided to
4430: 20 73 70 6c 69 74 20 74 68 65 20 63 68 61 6e 67   split the chang
4440: 65 73 65 74 20 61 74 20 74 68 65 20 67 69 76 65  eset at the give
4450: 6e 0a 09 23 20 6c 6f 63 61 74 69 6f 6e 2e 20 54  n..# location. T
4460: 68 69 73 20 63 75 74 73 20 61 20 6e 75 6d 62 65  his cuts a numbe
4470: 72 20 6f 66 20 64 65 70 65 6e 64 65 6e 63 69 65  r of dependencie
4480: 73 2e 20 48 65 72 65 20 77 65 20 75 70 64 61 74  s. Here we updat
4490: 65 0a 09 23 20 74 68 65 20 63 72 6f 73 73 20 69  e..# the cross i
44a0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
44b0: 61 74 20 74 68 65 20 62 72 65 61 6b 20 66 69 6e  at the break fin
44c0: 64 65 72 20 68 61 73 20 61 63 63 75 72 61 74 65  der has accurate
44d0: 0a 09 23 20 64 61 74 61 20 77 68 65 6e 20 77 65  ..# data when we
44e0: 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20 67 65 6e   look at the gen
44f0: 65 72 61 74 65 64 20 66 72 61 67 6d 65 6e 74 73  erated fragments
4500: 2e 0a 0a 09 73 65 74 20 73 69 78 20 5b 6c 6f 67  ....set six [log
4510: 20 76 69 73 69 62 6c 65 3f 20 36 5d 0a 0a 09 66   visible? 6]...f
4520: 6f 72 65 61 63 68 20 7b 64 65 70 20 72 61 6e 67  oreach {dep rang
4530: 65 7d 20 5b 61 72 72 61 79 20 67 65 74 20 64 65  e} [array get de
4540: 70 63 5d 20 7b 0a 09 20 20 20 20 23 20 43 68 65  pc] {..    # Che
4550: 63 6b 20 61 6c 6c 20 64 65 70 65 6e 64 65 6e 63  ck all dependenc
4560: 69 65 73 20 73 74 69 6c 6c 20 6b 6e 6f 77 6e 2c  ies still known,
4570: 20 74 61 6b 65 20 74 68 65 69 72 20 72 61 6e 67   take their rang
4580: 65 20 61 6e 64 0a 09 20 20 20 20 23 20 73 65 65  e and..    # see
4590: 20 69 66 20 74 68 65 20 62 72 65 61 6b 20 6c 6f   if the break lo
45a0: 63 61 74 69 6f 6e 20 66 61 6c 6c 73 20 77 69 74  cation falls wit
45b0: 68 69 6e 2e 0a 0a 09 20 20 20 20 42 6f 72 64 65  hin....    Borde
45c0: 72 20 24 72 61 6e 67 65 20 73 20 65 0a 09 20 20  r $range s e..  
45d0: 20 20 69 66 20 7b 24 6c 6f 63 61 74 69 6f 6e 20    if {$location 
45e0: 3c 20 24 73 7d 20 63 6f 6e 74 69 6e 75 65 20 3b  < $s} continue ;
45f0: 20 23 20 62 72 65 61 6b 20 62 65 66 6f 72 65 20   # break before 
4600: 72 61 6e 67 65 2c 20 69 67 6e 6f 72 65 0a 09 20  range, ignore.. 
4610: 20 20 20 69 66 20 7b 24 6c 6f 63 61 74 69 6f 6e     if {$location
4620: 20 3e 20 24 65 7d 20 63 6f 6e 74 69 6e 75 65 20   > $e} continue 
4630: 3b 20 23 20 62 72 65 61 6b 20 61 66 74 65 72 20  ; # break after 
4640: 72 61 6e 67 65 2c 20 69 67 6e 6f 72 65 2e 0a 0a  range, ignore...
4650: 09 20 20 20 20 23 20 54 68 69 73 20 64 65 70 65  .    # This depe
4660: 6e 64 65 6e 63 79 20 63 72 6f 73 73 65 73 20 74  ndency crosses t
4670: 68 65 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f  he break locatio
4680: 6e 2e 20 57 65 20 72 65 6d 6f 76 65 20 69 74 0a  n. We remove it.
4690: 09 20 20 20 20 23 20 66 72 6f 6d 20 74 68 65 20  .    # from the 
46a0: 63 72 6f 73 73 69 6e 67 73 20 63 6f 75 6e 74 65  crossings counte
46b0: 72 73 2c 20 61 6e 64 20 74 68 65 6e 20 61 6c 73  rs, and then als
46c0: 6f 20 66 72 6f 6d 20 74 68 65 20 73 65 74 0a 09  o from the set..
46d0: 20 20 20 20 23 20 6f 66 20 6b 6e 6f 77 6e 20 64      # of known d
46e0: 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 20  ependencies, as 
46f0: 77 65 20 61 72 65 20 64 6f 6e 65 20 77 69 74 68  we are done with
4700: 20 69 74 2e 0a 0a 09 20 20 20 20 66 6f 72 65 61   it....    forea
4710: 63 68 20 6c 6f 63 20 24 64 65 70 63 28 24 64 65  ch loc $depc($de
4720: 70 29 20 7b 20 69 6e 63 72 20 63 72 6f 73 73 28  p) { incr cross(
4730: 24 6c 6f 63 29 20 2d 31 20 7d 0a 09 20 20 20 20  $loc) -1 }..    
4740: 75 6e 73 65 74 20 64 65 70 63 28 24 64 65 70 29  unset depc($dep)
4750: 0a 0a 09 20 20 20 20 69 66 20 7b 21 24 73 69 78  ...    if {!$six
4760: 7d 20 63 6f 6e 74 69 6e 75 65 0a 0a 09 20 20 20  } continue...   
4770: 20 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73   struct::list as
4780: 73 69 67 6e 20 24 64 65 70 20 70 61 72 65 6e 74  sign $dep parent
4790: 20 63 68 69 6c 64 0a 09 20 20 20 20 6c 6f 67 20   child..    log 
47a0: 77 72 69 74 65 20 35 20 63 73 65 74 73 20 22 42  write 5 csets "B
47b0: 72 6f 6b 65 20 64 65 70 65 6e 64 65 6e 63 79 20  roke dependency 
47c0: 5b 50 44 20 24 70 61 72 65 6e 74 5d 20 2d 2d 3e  [PD $parent] -->
47d0: 20 5b 50 44 20 24 63 68 69 6c 64 5d 22 0a 09 7d   [PD $child]"..}
47e0: 0a 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  ...return.    }.
47f0: 0a 20 20 20 20 23 20 50 72 69 6e 74 20 69 64 65  .    # Print ide
4800: 6e 74 69 66 79 69 6e 67 20 64 61 74 61 20 66 6f  ntifying data fo
4810: 72 20 61 20 72 65 76 69 73 69 6f 6e 20 28 70 72  r a revision (pr
4820: 6f 6a 65 63 74 2c 20 66 69 6c 65 2c 20 64 6f 74  oject, file, dot
4830: 74 65 64 20 72 65 76 0a 20 20 20 20 23 20 6e 75  ted rev.    # nu
4840: 6d 62 65 72 29 2c 20 66 6f 72 20 68 69 67 68 20  mber), for high 
4850: 76 65 72 62 6f 73 69 74 79 20 6c 6f 67 20 6f 75  verbosity log ou
4860: 74 70 75 74 2e 0a 0a 20 20 20 20 70 72 6f 63 20  tput...    proc 
4870: 50 44 20 7b 69 64 7d 20 7b 0a 09 66 6f 72 65 61  PD {id} {..forea
4880: 63 68 20 7b 70 20 66 20 72 7d 20 5b 73 74 61 74  ch {p f r} [stat
4890: 65 20 72 75 6e 20 7b 0a 09 09 53 45 4c 45 43 54  e run {...SELECT
48a0: 20 50 2e 6e 61 6d 65 20 2c 20 46 2e 6e 61 6d 65   P.name , F.name
48b0: 2c 20 52 2e 72 65 76 0a 09 09 46 52 4f 4d 20 72  , R.rev...FROM r
48c0: 65 76 69 73 69 6f 6e 20 52 2c 20 66 69 6c 65 20  evision R, file 
48d0: 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09 09 57  F, project P...W
48e0: 48 45 52 45 20 52 2e 72 69 64 20 3d 20 24 69 64  HERE R.rid = $id
48f0: 0a 09 09 41 4e 44 20 20 20 52 2e 66 69 64 20 3d  ...AND   R.fid =
4900: 20 46 2e 66 69 64 0a 09 09 41 4e 44 20 20 20 46   F.fid...AND   F
4910: 2e 70 69 64 20 3d 20 50 2e 70 69 64 0a 09 7d 5d  .pid = P.pid..}]
4920: 20 62 72 65 61 6b 0a 09 72 65 74 75 72 6e 20 22   break..return "
4930: 27 24 70 20 3a 20 24 66 2f 24 72 27 22 0a 20 20  '$p : $f/$r'".  
4940: 20 20 7d 0a 0a 20 20 20 20 23 20 50 72 69 6e 74    }..    # Print
4950: 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ing one or more 
4960: 72 61 6e 67 65 73 2c 20 66 6f 72 6d 61 74 74 65  ranges, formatte
4970: 64 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 69  d, and only thei
4980: 72 20 62 6f 72 64 65 72 20 74 6f 0a 20 20 20 20  r border to.    
4990: 23 20 6b 65 65 70 20 74 68 65 20 73 74 72 69 6e  # keep the strin
49a0: 67 73 20 73 68 6f 72 74 2e 0a 0a 20 20 20 20 70  gs short...    p
49b0: 72 6f 63 20 50 52 73 20 7b 72 61 6e 67 65 73 7d  roc PRs {ranges}
49c0: 20 7b 0a 09 72 65 74 75 72 6e 20 5b 73 74 72 75   {..return [stru
49d0: 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20 24 72 61  ct::list map $ra
49e0: 6e 67 65 73 20 5b 6d 79 70 72 6f 63 20 50 52 5d  nges [myproc PR]
49f0: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f  ].    }..    pro
4a00: 63 20 50 52 20 7b 72 61 6e 67 65 7d 20 7b 0a 09  c PR {range} {..
4a10: 42 6f 72 64 65 72 20 24 72 61 6e 67 65 20 73 20  Border $range s 
4a20: 65 0a 09 72 65 74 75 72 6e 20 3c 24 7b 73 7d 2e  e..return <${s}.
4a30: 2e 2e 24 7b 65 7d 3e 0a 20 20 20 20 7d 0a 0a 20  ..${e}>.    }.. 
4a40: 20 20 20 70 72 6f 63 20 42 6f 72 64 65 72 20 7b     proc Border {
4a50: 72 61 6e 67 65 20 73 76 20 65 76 7d 20 7b 0a 09  range sv ev} {..
4a60: 75 70 76 61 72 20 31 20 24 73 76 20 73 20 24 65  upvar 1 $sv s $e
4a70: 76 20 65 0a 09 73 65 74 20 73 20 5b 6c 69 6e 64  v e..set s [lind
4a80: 65 78 20 24 72 61 6e 67 65 20 30 5d 0a 09 73 65  ex $range 0]..se
4a90: 74 20 65 20 5b 6c 69 6e 64 65 78 20 24 72 61 6e  t e [lindex $ran
4aa0: 67 65 20 65 6e 64 5d 0a 09 72 65 74 75 72 6e 0a  ge end]..return.
4ab0: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23      }..    # # #
4ac0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
4ad0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
4ae0: 23 23 0a 0a 20 20 20 20 74 79 70 65 76 61 72 69  ##..    typevari
4af0: 61 62 6c 65 20 6d 79 63 68 61 6e 67 65 73 65 74  able mychangeset
4b00: 73 20 20 20 20 20 7b 7d 20 3b 20 23 20 4c 69 73  s     {} ; # Lis
4b10: 74 20 6f 66 20 61 6c 6c 20 6b 6e 6f 77 6e 20 63  t of all known c
4b20: 68 61 6e 67 65 73 65 74 73 2e 0a 20 20 20 20 74  hangesets..    t
4b30: 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 69 74  ypevariable myit
4b40: 65 6d 6d 61 70 20 2d 61 72 72 61 79 20 7b 7d 20  emmap -array {} 
4b50: 3b 20 23 20 4d 61 70 20 66 72 6f 6d 20 69 74 65  ; # Map from ite
4b60: 6d 73 20 28 74 61 67 67 65 64 29 20 74 6f 0a 09  ms (tagged) to..
4b70: 09 09 09 20 20 20 20 20 20 20 23 20 74 68 65 20  ...       # the 
4b80: 6c 69 73 74 20 6f 66 20 63 68 61 6e 67 65 73 65  list of changese
4b90: 74 73 0a 09 09 09 09 20 20 20 20 20 20 20 23 20  ts.....       # 
4ba0: 63 6f 6e 74 61 69 6e 69 6e 67 20 69 74 2e 20 45  containing it. E
4bb0: 61 63 68 20 69 74 65 6d 20 63 61 6e 0a 09 09 09  ach item can....
4bc0: 09 20 20 20 20 20 20 20 23 20 62 65 20 75 73 65  .       # be use
4bd0: 64 20 62 79 20 6f 6e 6c 79 20 6f 6e 65 0a 09 09  d by only one...
4be0: 09 09 20 20 20 20 20 20 20 23 20 63 68 61 6e 67  ..       # chang
4bf0: 65 73 65 74 2e 0a 20 20 20 20 74 79 70 65 76 61  eset..    typeva
4c00: 72 69 61 62 6c 65 20 6d 79 69 64 6d 61 70 20 20  riable myidmap  
4c10: 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d   -array {} ; # M
4c20: 61 70 20 66 72 6f 6d 20 63 68 61 6e 67 65 73 65  ap from changese
4c30: 74 20 69 64 20 74 6f 0a 09 09 09 09 20 20 20 20  t id to.....    
4c40: 20 20 20 23 20 63 68 61 6e 67 65 73 65 74 2e 0a     # changeset..
4c50: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
4c60: 61 6c 6c 20 20 20 20 7b 7d 20 20 20 20 7b 20 72  all    {}    { r
4c70: 65 74 75 72 6e 20 24 6d 79 63 68 61 6e 67 65 73  eturn $mychanges
4c80: 65 74 73 20 7d 0a 20 20 20 20 74 79 70 65 6d 65  ets }.    typeme
4c90: 74 68 6f 64 20 6f 66 20 20 20 20 20 7b 63 69 64  thod of     {cid
4ca0: 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 64  } { return $myid
4cb0: 6d 61 70 28 24 63 69 64 29 20 7d 0a 20 20 20 20  map($cid) }.    
4cc0: 74 79 70 65 6d 65 74 68 6f 64 20 6f 66 69 74 65  typemethod ofite
4cd0: 6d 20 7b 69 69 64 7d 20 7b 20 72 65 74 75 72 6e  m {iid} { return
4ce0: 20 24 6d 79 69 74 65 6d 6d 61 70 28 24 69 69 64   $myitemmap($iid
4cf0: 29 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20  ) }..    # # ## 
4d00: 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23  ### ##### ######
4d10: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
4d20: 0a 20 20 20 20 23 23 20 43 6f 6e 66 69 67 75 72  .    ## Configur
4d30: 61 74 69 6f 6e 0a 0a 20 20 20 20 70 72 61 67 6d  ation..    pragm
4d40: 61 20 2d 68 61 73 74 79 70 65 69 6e 66 6f 20 20  a -hastypeinfo  
4d50: 20 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 74 79 70    no  ; # no typ
4d60: 65 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a  e introspection.
4d70: 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 69      pragma -hasi
4d80: 6e 66 6f 20 20 20 20 20 20 20 20 6e 6f 20 20 3b  nfo        no  ;
4d90: 20 23 20 6e 6f 20 6f 62 6a 65 63 74 20 69 6e 74   # no object int
4da0: 72 6f 73 70 65 63 74 69 6f 6e 0a 0a 20 20 20 20  rospection..    
4db0: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
4dc0: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
4dd0: 23 23 23 23 23 23 23 0a 7d 0a 0a 23 20 23 20 23  #######.}..# # #
4de0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
4df0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
4e00: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
4e10: 23 23 23 23 23 23 23 23 0a 23 23 20 48 65 6c 70  ########.## Help
4e20: 65 72 20 73 69 6e 67 6c 65 74 6f 6e 2e 20 43 6f  er singleton. Co
4e30: 6d 6d 61 6e 64 73 20 66 6f 72 20 72 65 76 69 73  mmands for revis
4e40: 69 6f 6e 20 63 68 61 6e 67 65 73 65 74 73 2e 0a  ion changesets..
4e50: 0a 73 6e 69 74 3a 3a 74 79 70 65 20 3a 3a 76 63  .snit::type ::vc
4e60: 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74  ::fossil::import
4e70: 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a  ::cvs::project::
4e80: 72 65 76 3a 3a 72 65 76 20 7b 0a 20 20 20 20 74  rev::rev {.    t
4e90: 79 70 65 6d 65 74 68 6f 64 20 62 79 72 65 76 69  ypemethod byrevi
4ea0: 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75 72 6e  sion {} { return
4eb0: 20 31 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74   1 }.    typemet
4ec0: 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 20 7b  hod bysymbol   {
4ed0: 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20  } { return 0 }. 
4ee0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73     typemethod is
4ef0: 74 61 67 20 20 20 20 20 20 7b 7d 20 7b 20 72 65  tag      {} { re
4f00: 74 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70  turn 0 }.    typ
4f10: 65 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63 68  emethod isbranch
4f20: 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30     {} { return 0
4f30: 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74   }..    # result
4f40: 20 3d 20 6c 69 73 74 20 28 6d 69 6e 74 69 6d 65   = list (mintime
4f50: 2c 20 6d 61 78 74 69 6d 65 29 0a 20 20 20 20 74  , maxtime).    t
4f60: 79 70 65 6d 65 74 68 6f 64 20 74 69 6d 65 72 61  ypemethod timera
4f70: 6e 67 65 20 7b 69 74 65 6d 73 7d 20 7b 0a 09 73  nge {items} {..s
4f80: 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69  et theset ('[joi
4f90: 6e 20 24 69 74 65 6d 73 20 7b 27 2c 27 7d 5d 27  n $items {','}]'
4fa0: 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61 74 65  )..return [state
4fb0: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45   run "..    SELE
4fc0: 43 54 20 4d 49 4e 28 52 2e 64 61 74 65 29 2c 20  CT MIN(R.date), 
4fd0: 4d 41 58 28 52 2e 64 61 74 65 29 0a 09 20 20 20  MAX(R.date)..   
4fe0: 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52   FROM revision R
4ff0: 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e 72 69  ..    WHERE R.ri
5000: 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 22 5d  d IN $theset.."]
5010: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61  .    }..    # va
5020: 72 28 64 76 29 20 3d 20 64 69 63 74 20 28 72 65  r(dv) = dict (re
5030: 76 69 73 69 6f 6e 20 2d 3e 20 6c 69 73 74 20 28  vision -> list (
5040: 72 65 76 69 73 69 6f 6e 29 29 0a 20 20 20 20 74  revision)).    t
5050: 79 70 65 6d 65 74 68 6f 64 20 69 6e 74 65 72 6e  ypemethod intern
5060: 61 6c 73 75 63 63 65 73 73 6f 72 73 20 7b 64 76  alsuccessors {dv
5070: 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75   revisions} {..u
5080: 70 76 61 72 20 31 20 24 64 76 20 64 65 70 65 6e  pvar 1 $dv depen
5090: 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74 68 65  dencies..set the
50a0: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76  set ('[join $rev
50b0: 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a  isions {','}]').
50c0: 0a 09 23 20 53 65 65 20 27 73 75 63 63 65 73 73  ..# See 'success
50d0: 6f 72 73 27 20 62 65 6c 6f 77 20 66 6f 72 20 74  ors' below for t
50e0: 68 65 20 6d 61 69 6e 20 65 78 70 6c 61 6e 61 74  he main explanat
50f0: 69 6f 6e 20 6f 66 0a 09 23 20 74 68 65 20 76 61  ion of..# the va
5100: 72 69 6f 75 73 20 63 61 73 65 73 2e 20 54 68 69  rious cases. Thi
5110: 73 20 70 69 65 63 65 20 69 73 20 73 70 65 63 69  s piece is speci
5120: 61 6c 20 69 6e 20 74 68 61 74 20 69 74 0a 09 23  al in that it..#
5130: 20 72 65 73 74 72 69 63 74 73 20 74 68 65 20 73   restricts the s
5140: 75 63 63 65 73 73 6f 72 73 20 77 65 20 6c 6f 6f  uccessors we loo
5150: 6b 20 66 6f 72 20 74 6f 20 74 68 65 20 73 61 6d  k for to the sam
5160: 65 20 73 65 74 20 6f 66 0a 09 23 20 72 65 76 69  e set of..# revi
5170: 73 69 6f 6e 73 20 77 65 20 73 74 61 72 74 20 66  sions we start f
5180: 72 6f 6d 2e 20 53 65 6e 73 69 62 6c 65 20 61 73  rom. Sensible as
5190: 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20   we are looking 
51a0: 66 6f 72 0a 09 23 20 63 68 61 6e 67 65 73 65 74  for..# changeset
51b0: 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64   internal depend
51c0: 65 6e 63 69 65 73 2e 0a 0a 09 61 72 72 61 79 20  encies....array 
51d0: 73 65 74 20 64 65 70 20 7b 7d 0a 0a 09 66 6f 72  set dep {}...for
51e0: 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 7d  each {rid child}
51f0: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 20 20   [state run ".  
5200: 20 2d 2d 20 28 31 29 20 50 72 69 6d 61 72 79 20   -- (1) Primary 
5210: 63 68 69 6c 64 0a 09 20 20 20 20 53 45 4c 45 43  child..    SELEC
5220: 54 20 52 2e 72 69 64 2c 20 52 2e 63 68 69 6c 64  T R.rid, R.child
5230: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76  ..    FROM   rev
5240: 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45  ision R..    WHE
5250: 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24  RE  R.rid   IN $
5260: 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65  theset     -- Re
5270: 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69  strict to revisi
5280: 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  ons of interest.
5290: 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 63 68  .    AND    R.ch
52a0: 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  ild IS NOT NULL 
52b0: 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d 61 72     -- Has primar
52c0: 79 20 63 68 69 6c 64 0a 09 20 20 20 20 41 4e 44  y child..    AND
52d0: 20 20 20 20 52 2e 63 68 69 6c 64 20 49 4e 20 24      R.child IN $
52e0: 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 57 68  theset     -- Wh
52f0: 69 63 68 20 69 73 20 61 6c 73 6f 20 6f 66 20 69  ich is also of i
5300: 6e 74 65 72 65 73 74 0a 20 20 20 20 55 4e 49 4f  nterest.    UNIO
5310: 4e 0a 20 20 20 20 2d 2d 20 28 32 29 20 53 65 63  N.    -- (2) Sec
5320: 6f 6e 64 61 72 79 20 28 62 72 61 6e 63 68 29 20  ondary (branch) 
5330: 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 53 45  children..    SE
5340: 4c 45 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 72  LECT R.rid, B.br
5350: 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72  id..    FROM   r
5360: 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73  evision R, revis
5370: 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64 72 65  ionbranchchildre
5380: 6e 20 42 0a 09 20 20 20 20 57 48 45 52 45 20 20  n B..    WHERE  
5390: 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73  R.rid   IN $thes
53a0: 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69  et     -- Restri
53b0: 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20  ct to revisions 
53c0: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20  of interest..   
53d0: 20 41 4e 44 20 20 20 20 52 2e 72 69 64 20 3d 20   AND    R.rid = 
53e0: 42 2e 72 69 64 20 20 20 20 20 20 20 20 20 20 2d  B.rid          -
53f0: 2d 20 53 65 6c 65 63 74 20 73 75 62 73 65 74 20  - Select subset 
5400: 6f 66 20 62 72 61 6e 63 68 20 63 68 69 6c 64 72  of branch childr
5410: 65 6e 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42  en..    AND    B
5420: 2e 62 72 69 64 20 49 4e 20 24 74 68 65 73 65 74  .brid IN $theset
5430: 20 20 20 20 20 20 2d 2d 20 57 68 69 63 68 20 69        -- Which i
5440: 73 20 61 6c 73 6f 20 6f 66 20 69 6e 74 65 72 65  s also of intere
5450: 73 74 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20  st.    UNION.   
5460: 20 2d 2d 20 28 34 29 20 43 68 69 6c 64 20 6f 66   -- (4) Child of
5470: 20 74 72 75 6e 6b 20 72 6f 6f 74 20 73 75 63 63   trunk root succ
5480: 65 73 73 6f 72 20 6f 66 20 6c 61 73 74 20 4e 54  essor of last NT
5490: 44 42 20 6f 6e 20 74 72 75 6e 6b 2e 0a 09 20 20  DB on trunk...  
54a0: 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20    SELECT R.rid, 
54b0: 52 41 2e 63 68 69 6c 64 0a 09 20 20 20 20 46 52  RA.child..    FR
54c0: 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72  OM revision R, r
54d0: 65 76 69 73 69 6f 6e 20 52 41 0a 09 20 20 20 20  evision RA..    
54e0: 57 48 45 52 45 20 52 2e 72 69 64 20 20 20 49 4e  WHERE R.rid   IN
54f0: 20 24 74 68 65 73 65 74 20 20 20 20 20 20 2d 2d   $theset      --
5500: 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76   Restrict to rev
5510: 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65  isions of intere
5520: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 52 2e  st..    AND   R.
5530: 69 73 64 65 66 61 75 6c 74 20 20 20 20 20 20 20  isdefault       
5540: 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63        -- Restric
5550: 74 20 74 6f 20 4e 54 44 42 0a 09 20 20 20 20 41  t to NTDB..    A
5560: 4e 44 20 20 20 52 2e 64 62 63 68 69 6c 64 20 49  ND   R.dbchild I
5570: 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d 20  S NOT NULL   -- 
5580: 61 6e 64 20 6c 61 73 74 20 4e 54 44 42 20 62 65  and last NTDB be
5590: 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72 75 6e 6b  longing to trunk
55a0: 0a 09 20 20 20 20 41 4e 44 20 20 20 52 41 2e 72  ..    AND   RA.r
55b0: 69 64 20 3d 20 52 2e 64 62 63 68 69 6c 64 20 20  id = R.dbchild  
55c0: 20 20 20 20 2d 2d 20 47 6f 20 64 69 72 65 63 74      -- Go direct
55d0: 6c 79 20 74 6f 20 74 72 75 6e 6b 20 72 6f 6f 74  ly to trunk root
55e0: 0a 09 20 20 20 20 41 4e 44 20 20 20 52 41 2e 63  ..    AND   RA.c
55f0: 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  hild IS NOT NULL
5600: 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d 61      -- Has prima
5610: 72 79 20 63 68 69 6c 64 2e 0a 20 20 20 20 20 20  ry child..      
5620: 20 20 20 20 20 20 41 4e 44 20 20 20 52 41 2e 63        AND   RA.c
5630: 68 69 6c 64 20 49 4e 20 24 74 68 65 73 65 74 20  hild IN $theset 
5640: 20 20 20 20 2d 2d 20 57 68 69 63 68 20 69 73 20      -- Which is 
5650: 61 6c 73 6f 20 6f 66 20 69 6e 74 65 72 65 73 74  also of interest
5660: 0a 09 22 5d 20 7b 0a 09 20 20 20 20 23 20 43 6f  .."] {..    # Co
5670: 6e 73 69 64 65 72 20 6d 6f 76 69 6e 67 20 74 68  nsider moving th
5680: 69 73 20 74 6f 20 74 68 65 20 69 6e 74 65 67 72  is to the integr
5690: 69 74 79 20 6d 6f 64 75 6c 65 2e 0a 09 20 20 20  ity module...   
56a0: 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72   integrity asser
56b0: 74 20 7b 24 72 69 64 20 21 3d 20 24 63 68 69 6c  t {$rid != $chil
56c0: 64 7d 20 7b 52 65 76 69 73 69 6f 6e 20 24 72 69  d} {Revision $ri
56d0: 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 74 73  d depends on its
56e0: 65 6c 66 2e 7d 0a 09 20 20 20 20 6c 61 70 70 65  elf.}..    lappe
56f0: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28  nd dependencies(
5700: 24 72 69 64 29 20 24 63 68 69 6c 64 0a 09 20 20  $rid) $child..  
5710: 20 20 73 65 74 20 64 65 70 28 24 72 69 64 2c 24    set dep($rid,$
5720: 63 68 69 6c 64 29 20 2e 0a 09 7d 0a 0a 09 23 20  child) ...}...# 
5730: 54 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e  The sql statemen
5740: 74 73 20 61 62 6f 76 65 20 6c 6f 6f 6b 73 20 6f  ts above looks o
5750: 6e 6c 79 20 66 6f 72 20 64 69 72 65 63 74 20 64  nly for direct d
5760: 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 23 20 62  ependencies..# b
5770: 65 74 77 65 65 6e 20 72 65 76 69 73 69 6f 6e 20  etween revision 
5780: 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  in the changeset
5790: 2e 20 48 6f 77 65 76 65 72 20 64 75 65 20 74 6f  . However due to
57a0: 20 74 68 65 0a 09 23 20 76 61 67 61 72 69 65 73   the..# vagaries
57b0: 20 6f 66 20 6d 65 74 61 20 64 61 74 61 20 69 74   of meta data it
57c0: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
57d0: 20 74 77 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f   two revisions o
57e0: 66 0a 09 23 20 74 68 65 20 73 61 6d 65 20 66 69  f..# the same fi
57f0: 6c 65 20 74 6f 20 65 6e 64 20 75 70 20 69 6e 20  le to end up in 
5800: 74 68 65 20 73 61 6d 65 20 63 68 61 6e 67 65 73  the same changes
5810: 65 74 2c 20 77 69 74 68 6f 75 74 20 61 0a 09 23  et, without a..#
5820: 20 64 69 72 65 63 74 20 64 65 70 65 6e 64 65 6e   direct dependen
5830: 63 79 20 62 65 74 77 65 65 6e 20 74 68 65 6d 2e  cy between them.
5840: 20 48 6f 77 65 76 65 72 20 77 65 20 6b 6e 6f 77   However we know
5850: 20 74 68 61 74 20 74 68 65 72 65 0a 09 23 20 68   that there..# h
5860: 61 73 20 74 6f 20 62 65 20 61 20 61 6e 20 69 6e  as to be a an in
5870: 64 69 72 65 63 74 20 64 65 70 65 6e 64 65 6e 63  direct dependenc
5880: 79 2c 20 62 65 20 69 74 20 74 68 72 6f 75 67 68  y, be it through
5890: 20 70 72 69 6d 61 72 79 0a 09 23 20 63 68 69 6c   primary..# chil
58a0: 64 72 65 6e 2c 20 62 72 61 6e 63 68 20 63 68 69  dren, branch chi
58b0: 6c 64 72 65 6e 2c 20 6f 72 20 61 20 63 6f 6d 62  ldren, or a comb
58c0: 69 6e 61 74 69 6f 6e 20 74 68 65 72 65 6f 66 2e  ination thereof.
58d0: 0a 0a 09 23 20 57 65 20 6e 6f 77 20 66 69 6c 6c  ...# We now fill
58e0: 20 69 6e 20 74 68 65 73 65 20 70 73 65 75 64 6f   in these pseudo
58f0: 2d 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 69  -dependencies, i
5900: 66 20 6e 6f 20 73 75 63 68 0a 09 23 20 64 65 70  f no such..# dep
5910: 65 6e 64 65 6e 63 79 20 65 78 69 73 74 73 20 61  endency exists a
5920: 6c 72 65 61 64 79 2e 20 54 68 65 20 64 69 72 65  lready. The dire
5930: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 65 70  ction of the dep
5940: 65 6e 64 65 6e 63 79 0a 09 23 20 69 73 20 61 63  endency..# is ac
5950: 74 75 61 6c 6c 79 20 69 72 72 65 6c 65 76 61 6e  tually irrelevan
5960: 74 20 66 6f 72 20 74 68 69 73 2e 0a 0a 09 23 20  t for this....# 
5970: 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20 64 69  NOTE: This is di
5980: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 63 76 73  fferent from cvs
5990: 32 73 76 6e 2e 20 4f 75 72 20 73 70 69 72 69 74  2svn. Our spirit
59a0: 75 61 6c 20 61 6e 63 65 73 74 6f 72 0a 09 23 20  ual ancestor..# 
59b0: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 75 63  does not use suc
59c0: 68 20 70 73 65 75 64 6f 2d 64 65 70 65 6e 64 65  h pseudo-depende
59d0: 6e 63 69 65 73 2c 20 68 6f 77 65 76 65 72 20 69  ncies, however i
59e0: 74 20 75 73 65 73 20 61 0a 09 23 20 43 4f 4d 4d  t uses a..# COMM
59f0: 49 54 5f 54 48 52 45 53 48 4f 4c 44 2c 20 61 20  IT_THRESHOLD, a 
5a00: 74 69 6d 65 20 69 6e 74 65 72 76 61 6c 20 63 6f  time interval co
5a10: 6d 6d 69 74 73 20 73 68 6f 75 6c 64 20 66 61 6c  mmits should fal
5a20: 6c 2e 20 54 68 69 73 0a 09 23 20 77 69 6c 6c 20  l. This..# will 
5a30: 67 72 65 61 74 6c 79 20 72 65 64 75 63 65 73 20  greatly reduces 
5a40: 74 68 65 20 72 69 73 6b 20 6f 66 20 67 65 74 74  the risk of gett
5a50: 69 6e 67 20 66 61 72 20 73 65 70 61 72 61 74 65  ing far separate
5a60: 64 0a 09 23 20 72 65 76 69 73 69 6f 6e 73 20 6f  d..# revisions o
5a70: 66 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  f the same file 
5a80: 69 6e 74 6f 20 6f 6e 65 20 63 68 61 6e 67 65 73  into one changes
5a90: 65 74 2e 0a 0a 09 23 20 57 65 20 61 6c 6c 6f 77  et....# We allow
5aa0: 20 72 65 76 69 73 69 6f 6e 73 20 74 6f 20 62 65   revisions to be
5ab0: 20 66 61 72 20 61 70 61 72 74 20 69 6e 20 74 69   far apart in ti
5ac0: 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 0a 09  me in the same..
5ad0: 23 20 63 68 61 6e 67 65 73 65 74 2c 20 62 75 74  # changeset, but
5ae0: 20 6e 65 65 64 20 74 68 65 20 70 73 65 75 64 6f   need the pseudo
5af0: 2d 64 65 70 65 6e 64 65 6e 63 69 65 73 20 66 6f  -dependencies fo
5b00: 72 20 74 68 69 73 2e 0a 0a 09 61 72 72 61 79 20  r this....array 
5b10: 73 65 74 20 66 69 64 73 20 7b 7d 0a 09 66 6f 72  set fids {}..for
5b20: 65 61 63 68 20 7b 72 69 64 20 66 69 64 7d 20 5b  each {rid fid} [
5b30: 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20  state run "..   
5b40: 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52   SELECT R.rid, R
5b50: 2e 66 69 64 20 46 52 4f 4d 20 72 65 76 69 73 69  .fid FROM revisi
5b60: 6f 6e 20 52 20 57 48 45 52 45 20 52 2e 72 69 64  on R WHERE R.rid
5b70: 20 49 4e 20 24 74 68 65 73 65 74 0a 09 22 5d 20   IN $theset.."] 
5b80: 7b 20 6c 61 70 70 65 6e 64 20 66 69 64 73 28 24  { lappend fids($
5b90: 66 69 64 29 20 24 72 69 64 20 7d 0a 0a 09 66 6f  fid) $rid }...fo
5ba0: 72 65 61 63 68 20 7b 66 69 64 20 72 69 64 73 7d  reach {fid rids}
5bb0: 20 5b 61 72 72 61 79 20 67 65 74 20 66 69 64 73   [array get fids
5bc0: 5d 20 7b 0a 09 20 20 20 20 69 66 20 7b 5b 6c 6c  ] {..    if {[ll
5bd0: 65 6e 67 74 68 20 24 72 69 64 73 5d 20 3c 20 32  ength $rids] < 2
5be0: 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 20 20 20 20  } continue..    
5bf0: 66 6f 72 65 61 63 68 20 61 20 24 72 69 64 73 20  foreach a $rids 
5c00: 7b 0a 09 09 66 6f 72 65 61 63 68 20 62 20 24 72  {...foreach b $r
5c10: 69 64 73 20 7b 0a 09 09 20 20 20 20 69 66 20 7b  ids {...    if {
5c20: 24 61 20 3d 3d 20 24 62 7d 20 63 6f 6e 74 69 6e  $a == $b} contin
5c30: 75 65 0a 09 09 20 20 20 20 69 66 20 7b 5b 69 6e  ue...    if {[in
5c40: 66 6f 20 65 78 69 73 74 73 20 64 65 70 28 24 61  fo exists dep($a
5c50: 2c 24 62 29 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a  ,$b)]} continue.
5c60: 09 09 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20  ..    if {[info 
5c70: 65 78 69 73 74 73 20 64 65 70 28 24 62 2c 24 61  exists dep($b,$a
5c80: 29 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 09 20  )]} continue... 
5c90: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e     lappend depen
5ca0: 64 65 6e 63 69 65 73 28 24 61 29 20 24 62 0a 09  dencies($a) $b..
5cb0: 09 20 20 20 20 73 65 74 20 64 65 70 28 24 61 2c  .    set dep($a,
5cc0: 24 62 29 20 2e 0a 09 09 20 20 20 20 73 65 74 20  $b) ....    set 
5cd0: 64 65 70 28 24 62 2c 24 61 29 20 2e 0a 09 09 7d  dep($b,$a) ....}
5ce0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72 65 74 75  ..    }..}..retu
5cf0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  rn.    }..    # 
5d00: 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20 28  var(dv) = dict (
5d10: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74  item -> list (it
5d20: 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69  em)), item  = li
5d30: 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 20 20  st (type id).   
5d40: 20 74 79 70 65 6d 65 74 68 6f 64 20 73 75 63 63   typemethod succ
5d50: 65 73 73 6f 72 73 20 7b 64 76 20 72 65 76 69 73  essors {dv revis
5d60: 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31  ions} {..upvar 1
5d70: 20 24 64 76 20 64 65 70 65 6e 64 65 6e 63 69 65   $dv dependencie
5d80: 73 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27  s..set theset ('
5d90: 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73  [join $revisions
5da0: 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 23 20 54 68   {','}]')...# Th
5db0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 73 65  e following case
5dc0: 73 20 73 70 65 63 69 66 79 20 77 68 65 6e 20 61  s specify when a
5dd0: 20 72 65 76 69 73 69 6f 6e 20 53 20 69 73 20 61   revision S is a
5de0: 20 73 75 63 63 65 73 73 6f 72 0a 09 23 20 6f 66   successor..# of
5df0: 20 61 20 72 65 76 69 73 69 6f 6e 20 52 2e 20 45   a revision R. E
5e00: 61 63 68 20 6f 66 20 74 68 65 20 63 61 73 65 73  ach of the cases
5e10: 20 74 72 61 6e 73 6c 61 74 65 73 20 69 6e 74 6f   translates into
5e20: 20 6f 6e 65 20 6f 66 0a 09 23 20 74 68 65 20 62   one of..# the b
5e30: 72 61 6e 63 68 65 73 20 6f 66 20 74 68 65 20 53  ranches of the S
5e40: 51 4c 20 55 4e 49 4f 4e 20 63 6f 6d 69 6e 67 20  QL UNION coming 
5e50: 62 65 6c 6f 77 2e 0a 09 23 0a 09 23 20 28 31 29  below...#..# (1)
5e60: 20 53 20 63 61 6e 20 62 65 20 61 20 70 72 69 6d   S can be a prim
5e70: 61 72 79 20 63 68 69 6c 64 20 6f 66 20 52 2c 20  ary child of R, 
5e80: 69 2e 65 2e 20 69 6e 20 74 68 65 20 73 61 6d 65  i.e. in the same
5e90: 20 4c 4f 44 2e 20 52 0a 09 23 20 20 20 20 20 72   LOD. R..#     r
5ea0: 65 66 65 72 65 6e 63 65 73 20 53 20 64 69 72 65  eferences S dire
5eb0: 63 74 6c 79 2e 20 52 2e 63 68 69 6c 64 20 3d 20  ctly. R.child = 
5ec0: 53 28 2e 72 69 64 29 2c 20 69 66 20 69 74 20 65  S(.rid), if it e
5ed0: 78 69 73 74 73 2e 0a 09 23 0a 09 23 20 28 32 29  xists...#..# (2)
5ee0: 20 53 20 63 61 6e 20 62 65 20 61 20 73 65 63 6f   S can be a seco
5ef0: 6e 64 61 72 79 2c 20 69 2e 65 2e 20 62 72 61 6e  ndary, i.e. bran
5f00: 63 68 2c 20 63 68 69 6c 64 20 6f 66 20 52 2e 20  ch, child of R. 
5f10: 48 65 72 65 20 74 68 65 0a 09 23 20 20 20 20 20  Here the..#     
5f20: 6c 69 6e 6b 20 69 73 20 6d 61 64 65 20 74 68 72  link is made thr
5f30: 6f 75 67 68 20 74 68 65 20 68 65 6c 70 65 72 20  ough the helper 
5f40: 74 61 62 6c 65 0a 09 23 20 20 20 20 20 52 45 56  table..#     REV
5f50: 49 53 49 4f 4e 42 52 41 4e 43 48 43 48 49 4c 44  ISIONBRANCHCHILD
5f60: 52 45 4e 2e 20 52 2e 72 69 64 20 2d 3e 20 52 42  REN. R.rid -> RB
5f70: 43 2e 72 69 64 2c 20 52 42 43 2e 62 72 69 64 20  C.rid, RBC.brid 
5f80: 3d 0a 09 23 20 20 20 20 20 53 28 2e 72 69 64 29  =..#     S(.rid)
5f90: 0a 09 23 0a 09 23 20 28 33 29 20 4f 72 69 67 69  ..#..# (3) Origi
5fa0: 6e 61 6c 6c 79 20 74 68 69 73 20 75 73 65 20 63  nally this use c
5fb0: 61 73 65 20 64 65 66 69 6e 65 64 20 74 68 65 20  ase defined the 
5fc0: 72 6f 6f 74 20 6f 66 20 61 20 64 65 74 61 63 68  root of a detach
5fd0: 65 64 0a 09 23 20 20 20 20 20 4e 54 44 42 20 61  ed..#     NTDB a
5fe0: 73 20 74 68 65 20 73 75 63 63 65 73 73 6f 72 20  s the successor 
5ff0: 6f 66 20 74 68 65 20 74 72 75 6e 6b 20 72 6f 6f  of the trunk roo
6000: 74 2e 20 54 68 69 73 20 6c 65 61 64 73 20 74 6f  t. This leads to
6010: 20 61 0a 09 23 20 20 20 20 20 62 61 64 20 74 61   a..#     bad ta
6020: 6e 67 6c 65 20 6c 61 74 65 72 20 6f 6e 2e 20 57  ngle later on. W
6030: 69 74 68 20 61 20 64 65 74 61 63 68 65 64 20 4e  ith a detached N
6040: 54 44 42 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  TDB the original
6050: 0a 09 23 20 20 20 20 20 74 72 75 6e 6b 20 72 6f  ..#     trunk ro
6060: 6f 74 20 72 65 76 69 73 69 6f 6e 20 77 61 73 20  ot revision was 
6070: 72 65 6d 6f 76 65 64 20 61 73 20 69 72 72 65 6c  removed as irrel
6080: 65 76 61 6e 74 2c 20 61 6c 6c 6f 77 69 6e 67 0a  evant, allowing.
6090: 09 23 20 20 20 20 20 74 68 65 20 6e 6f 6d 69 6e  .#     the nomin
60a0: 61 6c 20 72 6f 6f 74 20 74 6f 20 62 65 20 6c 61  al root to be la
60b0: 74 65 72 20 69 6e 20 74 69 6d 65 20 74 68 61 6e  ter in time than
60c0: 20 74 68 65 20 4e 54 44 42 0a 09 23 20 20 20 20   the NTDB..#    
60d0: 20 72 6f 6f 74 2e 20 4e 6f 77 20 73 65 74 74 69   root. Now setti
60e0: 6e 67 20 74 68 69 73 20 64 65 70 65 6e 64 65 6e  ng this dependen
60f0: 63 79 20 77 69 6c 6c 20 62 65 20 62 61 63 6b 77  cy will be backw
6100: 61 72 64 20 69 6e 0a 09 23 20 20 20 20 20 74 69  ard in..#     ti
6110: 6d 65 2e 20 52 45 4d 4f 56 45 44 2e 0a 09 23 0a  me. REMOVED...#.
6120: 09 23 20 28 34 29 20 49 66 20 52 20 69 73 20 74  .# (4) If R is t
6130: 68 65 20 6c 61 73 74 20 6f 66 20 74 68 65 20 4e  he last of the N
6140: 54 44 42 20 72 65 76 69 73 69 6f 6e 73 20 77 68  TDB revisions wh
6150: 69 63 68 20 62 65 6c 6f 6e 67 20 74 6f 0a 09 23  ich belong to..#
6160: 20 20 20 20 20 74 68 65 20 74 72 75 6e 6b 2c 20       the trunk, 
6170: 74 68 65 6e 20 74 68 65 20 70 72 69 6d 61 72 79  then the primary
6180: 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 74 72   child of the tr
6190: 75 6e 6b 20 72 6f 6f 74 20 28 74 68 65 0a 09 23  unk root (the..#
61a0: 20 20 20 20 20 27 31 2e 32 27 20 72 65 76 69 73       '1.2' revis
61b0: 69 6f 6e 29 20 69 73 20 61 20 73 75 63 63 65 73  ion) is a succes
61c0: 73 6f 72 2c 20 69 66 20 69 74 20 65 78 69 73 74  sor, if it exist
61d0: 73 2e 0a 0a 09 23 20 4e 6f 74 65 20 74 68 61 74  s....# Note that
61e0: 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 73 70   the branches sp
61f0: 61 77 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 72  awned from the r
6200: 65 76 69 73 69 6f 6e 73 2c 20 61 6e 64 20 74 68  evisions, and th
6210: 65 0a 09 23 20 74 61 67 73 20 61 73 73 6f 63 69  e..# tags associ
6220: 61 74 65 64 20 77 69 74 68 20 74 68 65 6d 20 61  ated with them a
6230: 72 65 20 73 75 63 63 65 73 73 6f 72 73 20 61 73  re successors as
6240: 20 77 65 6c 6c 2e 0a 0a 09 66 6f 72 65 61 63 68   well....foreach
6250: 20 7b 72 69 64 20 63 68 69 6c 64 7d 20 5b 73 74   {rid child} [st
6260: 61 74 65 20 72 75 6e 20 22 0a 20 20 20 2d 2d 20  ate run ".   -- 
6270: 28 31 29 20 50 72 69 6d 61 72 79 20 63 68 69 6c  (1) Primary chil
6280: 64 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e  d..    SELECT R.
6290: 72 69 64 2c 20 52 2e 63 68 69 6c 64 0a 09 20 20  rid, R.child..  
62a0: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f    FROM   revisio
62b0: 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 20  n R..    WHERE  
62c0: 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73  R.rid   IN $thes
62d0: 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69  et     -- Restri
62e0: 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20  ct to revisions 
62f0: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20  of interest..   
6300: 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20   AND    R.child 
6310: 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d  IS NOT NULL    -
6320: 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 68  - Has primary ch
6330: 69 6c 64 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20  ild.    UNION.  
6340: 20 20 2d 2d 20 28 32 29 20 53 65 63 6f 6e 64 61    -- (2) Seconda
6350: 72 79 20 28 62 72 61 6e 63 68 29 20 63 68 69 6c  ry (branch) chil
6360: 64 72 65 6e 0a 09 20 20 20 20 53 45 4c 45 43 54  dren..    SELECT
6370: 20 52 2e 72 69 64 2c 20 42 2e 62 72 69 64 0a 09   R.rid, B.brid..
6380: 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73      FROM   revis
6390: 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 62  ion R, revisionb
63a0: 72 61 6e 63 68 63 68 69 6c 64 72 65 6e 20 42 0a  ranchchildren B.
63b0: 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69  .    WHERE  R.ri
63c0: 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20  d   IN $theset  
63d0: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74     -- Restrict t
63e0: 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69  o revisions of i
63f0: 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44  nterest..    AND
6400: 20 20 20 20 52 2e 72 69 64 20 3d 20 42 2e 72 69      R.rid = B.ri
6410: 64 20 20 20 20 20 20 20 20 20 20 2d 2d 20 53 65  d          -- Se
6420: 6c 65 63 74 20 73 75 62 73 65 74 20 6f 66 20 62  lect subset of b
6430: 72 61 6e 63 68 20 63 68 69 6c 64 72 65 6e 0a 20  ranch children. 
6440: 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20     UNION.    -- 
6450: 28 34 29 20 43 68 69 6c 64 20 6f 66 20 74 72 75  (4) Child of tru
6460: 6e 6b 20 72 6f 6f 74 20 73 75 63 63 65 73 73 6f  nk root successo
6470: 72 20 6f 66 20 6c 61 73 74 20 4e 54 44 42 20 6f  r of last NTDB o
6480: 6e 20 74 72 75 6e 6b 2e 0a 09 20 20 20 20 53 45  n trunk...    SE
6490: 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 41 2e 63  LECT R.rid, RA.c
64a0: 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 72  hild..    FROM r
64b0: 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73  evision R, revis
64c0: 69 6f 6e 20 52 41 0a 09 20 20 20 20 57 48 45 52  ion RA..    WHER
64d0: 45 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68  E R.rid   IN $th
64e0: 65 73 65 74 20 20 20 20 20 20 2d 2d 20 52 65 73  eset      -- Res
64f0: 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f  trict to revisio
6500: 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09  ns of interest..
6510: 20 20 20 20 41 4e 44 20 20 20 52 2e 69 73 64 65      AND   R.isde
6520: 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  fault           
6530: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f    -- Restrict to
6540: 20 4e 54 44 42 0a 09 20 20 20 20 41 4e 44 20 20   NTDB..    AND  
6550: 20 52 2e 64 62 63 68 69 6c 64 20 49 53 20 4e 4f   R.dbchild IS NO
6560: 54 20 4e 55 4c 4c 20 20 20 2d 2d 20 61 6e 64 20  T NULL   -- and 
6570: 6c 61 73 74 20 4e 54 44 42 20 62 65 6c 6f 6e 67  last NTDB belong
6580: 69 6e 67 20 74 6f 20 74 72 75 6e 6b 0a 09 20 20  ing to trunk..  
6590: 20 20 41 4e 44 20 20 20 52 41 2e 72 69 64 20 3d    AND   RA.rid =
65a0: 20 52 2e 64 62 63 68 69 6c 64 20 20 20 20 20 20   R.dbchild      
65b0: 2d 2d 20 47 6f 20 64 69 72 65 63 74 6c 79 20 74  -- Go directly t
65c0: 6f 20 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20  o trunk root..  
65d0: 20 20 41 4e 44 20 20 20 52 41 2e 63 68 69 6c 64    AND   RA.child
65e0: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
65f0: 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 63  -- Has primary c
6600: 68 69 6c 64 2e 0a 09 22 5d 20 7b 0a 09 20 20 20  hild..."] {..   
6610: 20 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69   # Consider movi
6620: 6e 67 20 74 68 69 73 20 74 6f 20 74 68 65 20 69  ng this to the i
6630: 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e  ntegrity module.
6640: 0a 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 20  ..    integrity 
6650: 61 73 73 65 72 74 20 7b 24 72 69 64 20 21 3d 20  assert {$rid != 
6660: 24 63 68 69 6c 64 7d 20 7b 52 65 76 69 73 69 6f  $child} {Revisio
6670: 6e 20 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f  n $rid depends o
6680: 6e 20 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20  n itself.}..    
6690: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e  lappend dependen
66a0: 63 69 65 73 28 5b 6c 69 73 74 20 72 65 76 20 24  cies([list rev $
66b0: 72 69 64 5d 29 20 5b 6c 69 73 74 20 72 65 76 20  rid]) [list rev 
66c0: 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65  $child]..}..fore
66d0: 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 7d 20  ach {rid child} 
66e0: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20  [state run "..  
66f0: 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20    SELECT R.rid, 
6700: 54 2e 74 69 64 0a 09 20 20 20 20 46 52 4f 4d 20  T.tid..    FROM 
6710: 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 74 61    revision R, ta
6720: 67 20 54 0a 09 20 20 20 20 57 48 45 52 45 20 20  g T..    WHERE  
6730: 52 2e 72 69 64 20 69 6e 20 24 74 68 65 73 65 74  R.rid in $theset
6740: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 54 2e 72  ..    AND    T.r
6750: 65 76 20 3d 20 52 2e 72 69 64 0a 09 22 5d 20 7b  ev = R.rid.."] {
6760: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65  ..    lappend de
6770: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74  pendencies([list
6780: 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c 69 73   rev $rid]) [lis
6790: 74 20 73 79 6d 3a 3a 74 61 67 20 24 63 68 69 6c  t sym::tag $chil
67a0: 64 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b  d]..}..foreach {
67b0: 72 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74  rid child} [stat
67c0: 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c  e run "..    SEL
67d0: 45 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 69 64  ECT R.rid, B.bid
67e0: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76  ..    FROM   rev
67f0: 69 73 69 6f 6e 20 52 2c 20 62 72 61 6e 63 68 20  ision R, branch 
6800: 42 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e  B..    WHERE  R.
6810: 72 69 64 20 69 6e 20 24 74 68 65 73 65 74 0a 09  rid in $theset..
6820: 20 20 20 20 41 4e 44 20 20 20 20 42 2e 72 6f 6f      AND    B.roo
6830: 74 20 3d 20 52 2e 72 69 64 0a 09 22 5d 20 7b 0a  t = R.rid.."] {.
6840: 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70  .    lappend dep
6850: 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20  endencies([list 
6860: 72 65 76 20 24 72 69 64 5d 29 20 5b 6c 69 73 74  rev $rid]) [list
6870: 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 63 68   sym::branch $ch
6880: 69 6c 64 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a  ild]..}..return.
6890: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72      }..    # var
68a0: 28 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 65  (dv) = dict (ite
68b0: 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29  m -> list (item)
68c0: 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20  ), item  = list 
68d0: 28 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 79  (type id).    ty
68e0: 70 65 6d 65 74 68 6f 64 20 70 72 65 64 65 63 65  pemethod predece
68f0: 73 73 6f 72 73 20 7b 64 76 20 72 65 76 69 73 69  ssors {dv revisi
6900: 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20  ons} {..upvar 1 
6910: 24 64 76 20 64 65 70 65 6e 64 65 6e 63 69 65 73  $dv dependencies
6920: 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b  ..set theset ('[
6930: 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20  join $revisions 
6940: 7b 27 2c 27 7d 5d 27 29 0a 0a 09 23 20 54 68 65  {','}]')...# The
6950: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 73 65 73   following cases
6960: 20 73 70 65 63 69 66 79 20 77 68 65 6e 20 61 20   specify when a 
6970: 72 65 76 69 73 69 6f 6e 20 50 20 69 73 20 61 0a  revision P is a.
6980: 09 23 20 70 72 65 64 65 63 65 73 73 6f 72 20 6f  .# predecessor o
6990: 66 20 61 20 72 65 76 69 73 69 6f 6e 20 52 2e 20  f a revision R. 
69a0: 45 61 63 68 20 6f 66 20 74 68 65 20 63 61 73 65  Each of the case
69b0: 73 20 74 72 61 6e 73 6c 61 74 65 73 0a 09 23 20  s translates..# 
69c0: 69 6e 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20  into one of the 
69d0: 62 72 61 6e 63 68 65 73 20 6f 66 20 74 68 65 20  branches of the 
69e0: 53 51 4c 20 55 4e 49 4f 4e 20 63 6f 6d 69 6e 67  SQL UNION coming
69f0: 20 62 65 6c 6f 77 2e 0a 09 23 0a 09 23 20 28 31   below...#..# (1
6a00: 29 20 54 68 65 20 69 6d 6d 65 64 69 61 74 65 20  ) The immediate 
6a10: 70 61 72 65 6e 74 20 52 2e 70 61 72 65 6e 74 20  parent R.parent 
6a20: 6f 66 20 52 20 69 73 20 61 20 70 72 65 64 65 63  of R is a predec
6a30: 65 73 73 6f 72 20 6f 66 0a 09 23 20 20 20 20 20  essor of..#     
6a40: 52 2e 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73  R. NOTE: This is
6a50: 20 74 72 75 65 20 66 6f 72 20 52 20 65 69 74 68   true for R eith
6a60: 65 72 20 70 72 69 6d 61 72 79 20 6f 72 20 73 65  er primary or se
6a70: 63 6f 6e 64 61 72 79 0a 09 23 20 20 20 20 20 63  condary..#     c
6a80: 68 69 6c 64 20 6f 66 20 50 2e 20 49 74 20 6e 6f  hild of P. It no
6a90: 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64  t necessary to d
6aa0: 69 73 74 69 6e 67 75 69 73 68 20 74 68 65 20 74  istinguish the t
6ab0: 77 6f 0a 09 23 20 20 20 20 20 63 61 73 65 73 2c  wo..#     cases,
6ac0: 20 69 6e 20 63 6f 6e 74 72 61 73 74 20 74 6f 20   in contrast to 
6ad0: 74 68 65 20 63 6f 64 65 20 72 65 74 72 69 65 76  the code retriev
6ae0: 69 6e 67 20 74 68 65 20 73 75 63 63 65 73 73 6f  ing the successo
6af0: 72 0a 09 23 20 20 20 20 20 69 6e 66 6f 72 6d 61  r..#     informa
6b00: 74 69 6f 6e 2e 0a 09 23 0a 09 23 20 28 32 29 20  tion...#..# (2) 
6b10: 54 68 65 20 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f  The complement o
6b20: 66 20 73 75 63 63 65 73 73 6f 72 20 63 61 73 65  f successor case
6b30: 20 28 33 29 2e 20 54 68 65 20 74 72 75 6e 6b 20   (3). The trunk 
6b40: 72 6f 6f 74 20 69 73 0a 09 23 20 20 20 20 20 61  root is..#     a
6b50: 20 70 72 65 64 65 63 65 73 73 6f 72 20 6f 66 20   predecessor of 
6b60: 61 20 4e 54 44 42 20 72 6f 6f 74 2e 20 52 45 4d  a NTDB root. REM
6b70: 4f 56 45 44 2e 20 53 65 65 20 27 73 75 63 63 65  OVED. See 'succe
6b80: 73 73 6f 72 73 27 0a 09 23 20 20 20 20 20 66 6f  ssors'..#     fo
6b90: 72 20 74 68 65 20 65 78 70 6c 61 6e 61 74 69 6f  r the explanatio
6ba0: 6e 2e 0a 09 23 0a 09 23 20 28 33 29 20 54 68 65  n...#..# (3) The
6bb0: 20 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 73   complement of s
6bc0: 75 63 63 65 73 73 6f 72 20 63 61 73 65 20 28 34  uccessor case (4
6bd0: 29 2e 20 54 68 65 20 6c 61 73 74 20 4e 54 44 42  ). The last NTDB
6be0: 0a 09 23 20 20 20 20 20 72 65 76 69 73 69 6f 6e  ..#     revision
6bf0: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68   belonging to th
6c00: 65 20 74 72 75 6e 6b 20 69 73 20 61 20 70 72 65  e trunk is a pre
6c10: 64 65 63 65 73 73 6f 72 20 6f 66 20 74 68 65 0a  decessor of the.
6c20: 09 23 20 20 20 20 20 70 72 69 6d 61 72 79 20 63  .#     primary c
6c30: 68 69 6c 64 20 6f 66 20 74 68 65 20 74 72 75 6e  hild of the trun
6c40: 6b 20 72 6f 6f 74 20 28 54 68 65 20 27 31 2e 32  k root (The '1.2
6c50: 27 20 72 65 76 69 73 69 6f 6e 29 2e 0a 0a 09 66  ' revision)....f
6c60: 6f 72 65 61 63 68 20 7b 72 69 64 20 70 61 72 65  oreach {rid pare
6c70: 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22  nt} [state run "
6c80: 0a 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d 61  .   -- (1) Prima
6c90: 72 79 20 70 61 72 65 6e 74 2c 20 63 61 6e 20 62  ry parent, can b
6ca0: 65 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 4c  e in different L
6cb0: 4f 44 20 66 6f 72 20 66 69 72 73 74 20 69 6e 20  OD for first in 
6cc0: 61 20 62 72 61 6e 63 68 0a 09 20 20 20 20 53 45  a branch..    SE
6cd0: 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 70 61  LECT R.rid, R.pa
6ce0: 72 65 6e 74 0a 09 20 20 20 20 46 52 4f 4d 20 20  rent..    FROM  
6cf0: 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20   revision R..   
6d00: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20   WHERE  R.rid   
6d10: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d  IN $theset     -
6d20: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65  - Restrict to re
6d30: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72  visions of inter
6d40: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  est..    AND    
6d50: 52 2e 70 61 72 65 6e 74 20 49 53 20 4e 4f 54 20  R.parent IS NOT 
6d60: 4e 55 4c 4c 20 20 20 2d 2d 20 48 61 73 20 70 72  NULL   -- Has pr
6d70: 69 6d 61 72 79 20 70 61 72 65 6e 74 0a 20 20 20  imary parent.   
6d80: 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 33   UNION.    -- (3
6d90: 29 20 4c 61 73 74 20 4e 54 44 42 20 6f 6e 20 74  ) Last NTDB on t
6da0: 72 75 6e 6b 20 69 73 20 70 72 65 64 65 63 65 73  runk is predeces
6db0: 73 6f 72 20 6f 66 20 63 68 69 6c 64 20 6f 66 20  sor of child of 
6dc0: 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 20  trunk root..    
6dd0: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 41  SELECT R.rid, RA
6de0: 2e 64 62 70 61 72 65 6e 74 0a 09 20 20 20 20 46  .dbparent..    F
6df0: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52  ROM   revision R
6e00: 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 0a 09 20  , revision RA.. 
6e10: 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20     WHERE  R.rid 
6e20: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 20  IN $theset      
6e30: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74     -- Restrict t
6e40: 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69  o revisions of i
6e50: 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44  nterest..    AND
6e60: 20 20 20 20 4e 4f 54 20 52 2e 69 73 64 65 66 61      NOT R.isdefa
6e70: 75 6c 74 20 20 20 20 20 20 20 20 20 20 2d 2d 20  ult          -- 
6e80: 6e 6f 74 20 6f 6e 20 4e 54 44 42 0a 09 20 20 20  not on NTDB..   
6e90: 20 41 4e 44 20 20 20 20 52 2e 70 61 72 65 6e 74   AND    R.parent
6ea0: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
6eb0: 20 2d 2d 20 77 68 69 63 68 20 61 72 65 20 6e 6f   -- which are no
6ec0: 74 20 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20  t root..    AND 
6ed0: 20 20 20 52 41 2e 72 69 64 20 3d 20 52 2e 70 61     RA.rid = R.pa
6ee0: 72 65 6e 74 20 20 20 20 20 20 20 20 2d 2d 20 67  rent        -- g
6ef0: 6f 20 74 6f 20 74 68 65 69 72 20 70 61 72 65 6e  o to their paren
6f00: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 41  t..    AND    RA
6f10: 2e 64 62 70 61 72 65 6e 74 20 49 53 20 4e 4f 54  .dbparent IS NOT
6f20: 20 4e 55 4c 4c 20 20 2d 2d 20 77 68 69 63 68 20   NULL  -- which 
6f30: 68 61 73 20 74 6f 20 72 65 66 65 72 20 74 6f 20  has to refer to 
6f40: 4e 54 44 42 27 73 20 72 6f 6f 74 0a 09 22 5d 20  NTDB's root.."] 
6f50: 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 69 64 65  {..    # Conside
6f60: 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 20 74 6f  r moving this to
6f70: 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6d   the integrity m
6f80: 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 6e 74 65  odule...    inte
6f90: 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24 72  grity assert {$r
6fa0: 69 64 20 21 3d 20 24 70 61 72 65 6e 74 7d 20 7b  id != $parent} {
6fb0: 52 65 76 69 73 69 6f 6e 20 24 72 69 64 20 64 65  Revision $rid de
6fc0: 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 2e  pends on itself.
6fd0: 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64  }..    lappend d
6fe0: 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73  ependencies([lis
6ff0: 74 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c 69  t rev $rid]) [li
7000: 73 74 20 72 65 76 20 24 70 61 72 65 6e 74 5d 0a  st rev $parent].
7010: 09 7d 0a 0a 09 23 20 54 68 65 20 72 65 76 69 73  .}...# The revis
7020: 69 6f 6e 73 20 77 68 69 63 68 20 61 72 65 20 74  ions which are t
7030: 68 65 20 66 69 72 73 74 20 6f 6e 20 61 20 62 72  he first on a br
7040: 61 6e 63 68 20 68 61 76 65 20 74 68 61 74 0a 09  anch have that..
7050: 23 20 62 72 61 6e 63 68 20 61 73 20 74 68 65 69  # branch as thei
7060: 72 20 70 72 65 64 65 63 65 73 73 6f 72 2e 20 4e  r predecessor. N
7070: 6f 74 65 20 74 68 61 74 20 72 65 76 69 73 69 6f  ote that revisio
7080: 6e 73 20 63 61 6e 6e 6f 74 20 62 65 0a 09 23 20  ns cannot be..# 
7090: 6f 6e 20 74 61 67 73 20 69 6e 20 74 68 65 20 73  on tags in the s
70a0: 61 6d 65 20 6d 61 6e 6e 65 72 2c 20 73 6f 20 74  ame manner, so t
70b0: 61 67 73 20 63 61 6e 6e 6f 74 20 62 65 20 70 72  ags cannot be pr
70c0: 65 64 65 63 65 73 73 6f 72 73 0a 09 23 20 6f 66  edecessors..# of
70d0: 20 72 65 76 69 73 69 6f 6e 73 2e 20 54 68 69 73   revisions. This
70e0: 20 63 6f 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61   complements tha
70f0: 74 20 74 68 65 79 20 68 61 76 65 20 6e 6f 20 73  t they have no s
7100: 75 63 63 65 73 73 6f 72 73 0a 09 23 20 28 53 65  uccessors..# (Se
7110: 65 20 73 79 6d 3a 3a 74 61 67 2f 73 75 63 63 65  e sym::tag/succe
7120: 73 73 6f 72 73 29 2e 0a 0a 09 66 6f 72 65 61 63  ssors)....foreac
7130: 68 20 7b 72 69 64 20 70 61 72 65 6e 74 7d 20 5b  h {rid parent} [
7140: 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20  state run "..   
7150: 20 53 45 4c 45 43 54 20 52 2e 72 69 64 20 42 2e   SELECT R.rid B.
7160: 62 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  bid..    FROM   
7170: 72 65 76 69 73 69 6f 6e 20 52 2c 20 62 72 61 6e  revision R, bran
7180: 63 68 20 42 0a 09 20 20 20 20 57 48 45 52 45 20  ch B..    WHERE 
7190: 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65   R.rid IN $these
71a0: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e  t..    AND    B.
71b0: 66 69 72 73 74 20 3d 20 52 2e 72 69 64 0a 09 22  first = R.rid.."
71c0: 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64  ] {..    lappend
71d0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c   dependencies([l
71e0: 69 73 74 20 72 65 76 20 24 72 69 64 5d 29 20 5b  ist rev $rid]) [
71f0: 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68  list sym::branch
7200: 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 72 65   $parent]..}..re
7210: 74 75 72 6e 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20  turn.    }.}..# 
7220: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23  # ## ### ##### #
7230: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
7240: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
7250: 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 48  ###########.## H
7260: 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 2e  elper singleton.
7270: 20 43 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 74 61   Commands for ta
7280: 67 20 73 79 6d 62 6f 6c 20 63 68 61 6e 67 65 73  g symbol changes
7290: 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 65  ets...snit::type
72a0: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
72b0: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a  mport::cvs::proj
72c0: 65 63 74 3a 3a 72 65 76 3a 3a 73 79 6d 3a 3a 74  ect::rev::sym::t
72d0: 61 67 20 7b 0a 20 20 20 20 74 79 70 65 6d 65 74  ag {.    typemet
72e0: 68 6f 64 20 62 79 72 65 76 69 73 69 6f 6e 20 7b  hod byrevision {
72f0: 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20  } { return 0 }. 
7300: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79     typemethod by
7310: 73 79 6d 62 6f 6c 20 20 20 7b 7d 20 7b 20 72 65  symbol   {} { re
7320: 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 79 70  turn 1 }.    typ
7330: 65 6d 65 74 68 6f 64 20 69 73 74 61 67 20 20 20  emethod istag   
7340: 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31     {} { return 1
7350: 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f   }.    typemetho
7360: 64 20 69 73 62 72 61 6e 63 68 20 20 20 7b 7d 20  d isbranch   {} 
7370: 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 0a 20 20  { return 0 }..  
7380: 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73    # result = lis
7390: 74 20 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74  t (mintime, maxt
73a0: 69 6d 65 29 0a 20 20 20 20 74 79 70 65 6d 65 74  ime).    typemet
73b0: 68 6f 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 74  hod timerange {t
73c0: 61 67 73 7d 20 7b 0a 09 23 20 54 68 65 20 72 61  ags} {..# The ra
73d0: 6e 67 65 20 69 73 20 64 65 66 69 6e 65 64 20 61  nge is defined a
73e0: 73 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 74  s the range of t
73f0: 68 65 20 72 65 76 69 73 69 6f 6e 73 20 74 68 65  he revisions the
7400: 20 74 61 67 73 0a 09 23 20 61 72 65 20 61 74 74   tags..# are att
7410: 61 63 68 65 64 20 74 6f 2e 0a 0a 09 73 65 74 20  ached to....set 
7420: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24  theset ('[join $
7430: 74 61 67 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72  tags {','}]')..r
7440: 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e  eturn [state run
7450: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 4d   "..    SELECT M
7460: 49 4e 28 52 2e 64 61 74 65 29 2c 20 4d 41 58 28  IN(R.date), MAX(
7470: 52 2e 64 61 74 65 29 0a 09 20 20 20 20 46 52 4f  R.date)..    FRO
7480: 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 74 61  M revision R, ta
7490: 67 20 54 0a 09 20 20 20 20 57 48 45 52 45 20 54  g T..    WHERE T
74a0: 2e 74 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a  .tid IN $theset.
74b0: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
74c0: 20 20 52 2e 72 69 64 20 3d 20 54 2e 72 65 76 0a    R.rid = T.rev.
74d0: 09 22 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  ."].    }..    #
74e0: 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20   var(dv) = dict 
74f0: 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69  (item -> list (i
7500: 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c  tem)), item  = l
7510: 69 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 20  ist (type id).  
7520: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 73 75 63    typemethod suc
7530: 63 65 73 73 6f 72 73 20 7b 64 76 20 74 61 67 73  cessors {dv tags
7540: 7d 20 7b 0a 09 23 20 54 61 67 73 20 68 61 76 65  } {..# Tags have
7550: 20 6e 6f 20 73 75 63 63 65 73 73 6f 72 73 2e 0a   no successors..
7560: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
7570: 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 64     # var(dv) = d
7580: 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73  ict (item -> lis
7590: 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20  t (item)), item 
75a0: 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69 64   = list (type id
75b0: 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ).    typemethod
75c0: 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 7b 64   predecessors {d
75d0: 76 20 74 61 67 73 7d 20 7b 0a 09 23 20 54 68 65  v tags} {..# The
75e0: 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 6f 66   predecessors of
75f0: 20 61 20 74 61 67 20 61 72 65 20 61 6c 6c 20 74   a tag are all t
7600: 68 65 20 72 65 76 69 73 69 6f 6e 73 20 74 68 65  he revisions the
7610: 20 74 61 67 73 20 61 72 65 0a 09 23 20 61 74 74   tags are..# att
7620: 61 63 68 65 64 20 74 6f 2c 20 61 73 20 77 65 6c  ached to, as wel
7630: 6c 20 61 73 20 61 6c 6c 20 74 68 65 20 62 72 61  l as all the bra
7640: 6e 63 68 65 73 20 6f 72 20 74 61 67 73 20 77 68  nches or tags wh
7650: 69 63 68 20 61 72 65 0a 09 23 20 74 68 65 69 72  ich are..# their
7660: 20 70 72 65 66 65 72 65 64 20 70 61 72 65 6e 74   prefered parent
7670: 73 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20  s....set theset 
7680: 28 27 5b 6a 6f 69 6e 20 24 74 61 67 73 20 7b 27  ('[join $tags {'
7690: 2c 27 7d 5d 27 29 0a 09 66 6f 72 65 61 63 68 20  ,'}]')..foreach 
76a0: 7b 74 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 74  {tid parent} [st
76b0: 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53  ate run "..    S
76c0: 45 4c 45 43 54 20 54 2e 74 69 64 2c 20 52 2e 72  ELECT T.tid, R.r
76d0: 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72  id..    FROM   r
76e0: 65 76 69 73 69 6f 6e 20 52 2c 20 74 61 67 20 54  evision R, tag T
76f0: 0a 09 20 20 20 20 57 48 45 52 45 20 20 54 2e 74  ..    WHERE  T.t
7700: 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20  id IN $theset.. 
7710: 20 20 20 41 4e 44 20 20 20 20 54 2e 72 65 76 20     AND    T.rev 
7720: 3d 20 52 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20  = R.rid.."] {.. 
7730: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e     lappend depen
7740: 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79  dencies([list sy
7750: 6d 3a 3a 74 61 67 20 24 74 69 64 5d 29 20 5b 6c  m::tag $tid]) [l
7760: 69 73 74 20 72 65 76 20 24 70 61 72 65 6e 74 5d  ist rev $parent]
7770: 0a 09 7d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 74  ..}...foreach {t
7780: 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74  id parent} [stat
7790: 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c  e run "..    SEL
77a0: 45 43 54 20 54 2e 74 69 64 2c 20 42 2e 62 69 64  ECT T.tid, B.bid
77b0: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 74 61 67  ..    FROM   tag
77c0: 20 54 2c 20 62 72 61 6e 63 68 20 42 2c 20 70 72   T, branch B, pr
77d0: 65 66 65 72 65 64 70 61 72 65 6e 74 20 50 0a 09  eferedparent P..
77e0: 20 20 20 20 57 48 45 52 45 20 20 54 2e 74 69 64      WHERE  T.tid
77f0: 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20   IN $theset..   
7800: 20 41 4e 44 20 20 20 20 54 2e 73 69 64 20 3d 20   AND    T.sid = 
7810: 50 2e 73 69 64 0a 09 20 20 20 20 41 4e 44 20 20  P.sid..    AND  
7820: 20 20 50 2e 70 69 64 20 3d 20 42 2e 73 69 64 0a    P.pid = B.sid.
7830: 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65  ."] {..    lappe
7840: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28  nd dependencies(
7850: 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24  [list sym::tag $
7860: 74 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a  tid]) [list sym:
7870: 3a 62 72 61 6e 63 68 20 24 70 61 72 65 6e 74 5d  :branch $parent]
7880: 0a 09 7d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 74  ..}...foreach {t
7890: 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74  id parent} [stat
78a0: 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c  e run "..    SEL
78b0: 45 43 54 20 54 2e 74 69 64 2c 20 54 58 2e 74 69  ECT T.tid, TX.ti
78c0: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 74 61  d..    FROM   ta
78d0: 67 20 54 2c 20 74 61 67 20 54 58 2c 20 70 72 65  g T, tag TX, pre
78e0: 66 65 72 65 64 70 61 72 65 6e 74 20 50 0a 09 20  feredparent P.. 
78f0: 20 20 20 57 48 45 52 45 20 20 54 2e 74 69 64 20     WHERE  T.tid 
7900: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20  IN $theset..    
7910: 41 4e 44 20 20 20 20 54 2e 73 69 64 20 3d 20 50  AND    T.sid = P
7920: 2e 73 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20  .sid..    AND   
7930: 20 50 2e 70 69 64 20 3d 20 54 58 2e 73 69 64 0a   P.pid = TX.sid.
7940: 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65  ."] {..    lappe
7950: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28  nd dependencies(
7960: 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24  [list sym::tag $
7970: 74 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a  tid]) [list sym:
7980: 3a 74 61 67 20 24 70 61 72 65 6e 74 5d 0a 09 7d  :tag $parent]..}
7990: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 7d  ..return.    }.}
79a0: 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23  ..# # ## ### ###
79b0: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23  ## ######## ####
79c0: 23 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23  ######### ######
79d0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  ###############.
79e0: 23 23 20 48 65 6c 70 65 72 20 73 69 6e 67 6c 65  ## Helper single
79f0: 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20 66 6f  ton. Commands fo
7a00: 72 20 62 72 61 6e 63 68 20 73 79 6d 62 6f 6c 20  r branch symbol 
7a10: 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e 69  changesets...sni
7a20: 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f  t::type ::vc::fo
7a30: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
7a40: 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a  s::project::rev:
7a50: 3a 73 79 6d 3a 3a 62 72 61 6e 63 68 20 7b 0a 20  :sym::branch {. 
7a60: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79     typemethod by
7a70: 72 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65  revision {} { re
7a80: 74 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70  turn 0 }.    typ
7a90: 65 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c  emethod bysymbol
7aa0: 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31     {} { return 1
7ab0: 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f   }.    typemetho
7ac0: 64 20 69 73 74 61 67 20 20 20 20 20 20 7b 7d 20  d istag      {} 
7ad0: 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20 20  { return 0 }.   
7ae0: 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73 62 72   typemethod isbr
7af0: 61 6e 63 68 20 20 20 7b 7d 20 7b 20 72 65 74 75  anch   {} { retu
7b00: 72 6e 20 31 20 7d 0a 0a 20 20 20 20 23 20 72 65  rn 1 }..    # re
7b10: 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69 6e  sult = list (min
7b20: 74 69 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a 20  time, maxtime). 
7b30: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 74 69     typemethod ti
7b40: 6d 65 72 61 6e 67 65 20 7b 62 72 61 6e 63 68 65  merange {branche
7b50: 73 7d 20 7b 0a 09 23 20 54 68 65 20 72 61 6e 67  s} {..# The rang
7b60: 65 20 6f 66 20 61 20 62 72 61 6e 63 68 20 69 73  e of a branch is
7b70: 20 64 65 66 69 6e 65 64 20 61 73 20 74 68 65 20   defined as the 
7b80: 72 61 6e 67 65 20 6f 66 20 74 68 65 0a 09 23 20  range of the..# 
7b90: 72 65 76 69 73 69 6f 6e 73 20 74 68 65 20 62 72  revisions the br
7ba0: 61 6e 63 68 65 73 20 61 72 65 20 73 70 61 77 6e  anches are spawn
7bb0: 65 64 20 62 79 2e 20 4e 4f 54 45 20 68 6f 77 65  ed by. NOTE howe
7bc0: 76 65 72 20 74 68 61 74 20 74 68 65 0a 09 23 20  ver that the..# 
7bd0: 62 72 61 6e 63 68 65 73 20 61 73 73 6f 63 69 61  branches associa
7be0: 74 65 64 20 77 69 74 68 20 61 20 64 65 74 61 63  ted with a detac
7bf0: 68 65 64 20 4e 54 44 42 20 77 69 6c 6c 20 68 61  hed NTDB will ha
7c00: 76 65 20 6e 6f 20 72 6f 6f 74 0a 09 23 20 73 70  ve no root..# sp
7c10: 61 77 6e 69 6e 67 20 74 68 65 6d 2c 20 68 65 6e  awning them, hen
7c20: 63 65 20 74 68 65 79 20 68 61 76 65 20 6e 6f 20  ce they have no 
7c30: 72 65 61 6c 20 74 69 6d 65 72 61 6e 67 65 20 61  real timerange a
7c40: 6e 79 0a 09 23 20 6c 6f 6e 67 65 72 2e 20 42 79  ny..# longer. By
7c50: 20 75 73 69 6e 67 20 30 20 77 65 20 70 75 74 20   using 0 we put 
7c60: 74 68 65 6d 20 69 6e 20 66 72 6f 6e 74 20 6f 66  them in front of
7c70: 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65   everything else
7c80: 2c 0a 09 23 20 61 73 20 74 68 65 79 20 6c 6f 67  ,..# as they log
7c90: 69 63 61 6c 6c 79 20 61 72 65 2e 0a 0a 09 73 65  ically are....se
7ca0: 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e  t theset ('[join
7cb0: 20 24 62 72 61 6e 63 68 65 73 20 7b 27 2c 27 7d   $branches {','}
7cc0: 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61  ]')..return [sta
7cd0: 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45  te run "..    SE
7ce0: 4c 45 43 54 20 49 46 4e 55 4c 4c 28 4d 49 4e 28  LECT IFNULL(MIN(
7cf0: 52 2e 64 61 74 65 29 2c 30 29 2c 20 49 46 4e 55  R.date),0), IFNU
7d00: 4c 4c 28 4d 41 58 28 52 2e 64 61 74 65 29 2c 30  LL(MAX(R.date),0
7d10: 29 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69  )..    FROM revi
7d20: 73 69 6f 6e 20 52 2c 20 62 72 61 6e 63 68 20 42  sion R, branch B
7d30: 0a 09 20 20 20 20 57 48 45 52 45 20 42 2e 62 69  ..    WHERE B.bi
7d40: 64 20 49 4e 20 24 74 68 65 73 65 74 0a 20 20 20  d IN $theset.   
7d50: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 52           AND   R
7d60: 2e 72 69 64 20 3d 20 42 2e 72 6f 6f 74 0a 09 22  .rid = B.root.."
7d70: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 76  ].    }..    # v
7d80: 61 72 28 64 76 29 20 3d 20 64 69 63 74 20 28 69  ar(dv) = dict (i
7d90: 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65  tem -> list (ite
7da0: 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73  m)), item  = lis
7db0: 74 20 28 74 79 70 65 20 69 64 29 0a 20 20 20 20  t (type id).    
7dc0: 74 79 70 65 6d 65 74 68 6f 64 20 73 75 63 63 65  typemethod succe
7dd0: 73 73 6f 72 73 20 7b 64 76 20 62 72 61 6e 63 68  ssors {dv branch
7de0: 65 73 7d 20 7b 0a 09 23 20 54 68 65 20 66 69 72  es} {..# The fir
7df0: 73 74 20 72 65 76 69 73 69 6f 6e 20 63 6f 6d 6d  st revision comm
7e00: 69 74 74 65 64 20 6f 6e 20 61 20 62 72 61 6e 63  itted on a branc
7e10: 68 2c 20 61 6e 64 20 61 6c 6c 20 62 72 61 6e 63  h, and all branc
7e20: 68 65 73 0a 09 23 20 61 6e 64 20 74 61 67 73 20  hes..# and tags 
7e30: 77 68 69 63 68 20 68 61 76 65 20 69 74 20 61 73  which have it as
7e40: 20 74 68 65 69 72 20 70 72 65 66 65 72 65 64 20   their prefered 
7e50: 70 61 72 65 6e 74 20 61 72 65 20 74 68 65 0a 09  parent are the..
7e60: 23 20 73 75 63 63 65 73 73 6f 72 73 20 6f 66 20  # successors of 
7e70: 61 20 62 72 61 6e 63 68 2e 0a 0a 09 73 65 74 20  a branch....set 
7e80: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24  theset ('[join $
7e90: 62 72 61 6e 63 68 65 73 20 7b 27 2c 27 7d 5d 27  branches {','}]'
7ea0: 29 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64 20  )..foreach {bid 
7eb0: 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75  child} [state ru
7ec0: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20  n "..    SELECT 
7ed0: 42 2e 62 69 64 2c 20 52 2e 72 69 64 0a 09 20 20  B.bid, R.rid..  
7ee0: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f    FROM   revisio
7ef0: 6e 20 52 2c 20 62 72 61 6e 63 68 20 42 0a 09 20  n R, branch B.. 
7f00: 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20     WHERE  B.bid 
7f10: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20  IN $theset..    
7f20: 41 4e 44 20 20 20 20 42 2e 66 69 72 73 74 20 3d  AND    B.first =
7f30: 20 52 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20   R.rid.."] {..  
7f40: 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64    lappend depend
7f50: 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d  encies([list sym
7f60: 3a 3a 74 61 67 20 24 62 69 64 5d 29 20 5b 6c 69  ::tag $bid]) [li
7f70: 73 74 20 72 65 76 20 24 63 68 69 6c 64 5d 0a 09  st rev $child]..
7f80: 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64 20  }..foreach {bid 
7f90: 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75  child} [state ru
7fa0: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20  n "..    SELECT 
7fb0: 42 2e 62 69 64 2c 20 42 58 2e 62 69 64 0a 09 20  B.bid, BX.bid.. 
7fc0: 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68     FROM   branch
7fd0: 20 42 2c 20 62 72 61 6e 63 68 20 42 58 2c 20 70   B, branch BX, p
7fe0: 72 65 66 65 72 65 64 70 61 72 65 6e 74 20 50 0a  referedparent P.
7ff0: 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69  .    WHERE  B.bi
8000: 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20  d IN $theset..  
8010: 20 20 41 4e 44 20 20 20 20 42 2e 73 69 64 20 3d    AND    B.sid =
8020: 20 50 2e 70 69 64 0a 09 20 20 20 20 41 4e 44 20   P.pid..    AND 
8030: 20 20 20 42 58 2e 73 69 64 20 3d 20 50 2e 73 69     BX.sid = P.si
8040: 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70  d.."] {..    lap
8050: 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65  pend dependencie
8060: 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67  s([list sym::tag
8070: 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 20 73 79   $bid]) [list sy
8080: 6d 3a 3a 62 72 61 6e 63 68 20 24 63 68 69 6c 64  m::branch $child
8090: 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62  ]..}..foreach {b
80a0: 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65  id child} [state
80b0: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45   run "..    SELE
80c0: 43 54 20 42 2e 62 69 64 2c 20 54 2e 74 69 64 0a  CT B.bid, T.tid.
80d0: 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e  .    FROM   bran
80e0: 63 68 20 42 2c 20 74 61 67 20 54 2c 20 70 72 65  ch B, tag T, pre
80f0: 66 65 72 65 64 70 61 72 65 6e 74 20 50 0a 09 20  feredparent P.. 
8100: 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20     WHERE  B.bid 
8110: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20  IN $theset..    
8120: 41 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50  AND    B.sid = P
8130: 2e 70 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20  .pid..    AND   
8140: 20 54 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a 09   T.sid = P.sid..
8150: 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e  "] {..    lappen
8160: 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b  d dependencies([
8170: 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 62  list sym::tag $b
8180: 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a  id]) [list sym::
8190: 74 61 67 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09  tag $child]..}..
81a0: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20  return.    }..  
81b0: 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 69    # var(dv) = di
81c0: 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74  ct (item -> list
81d0: 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 20   (item)), item  
81e0: 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69 64 29  = list (type id)
81f0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
8200: 70 72 65 64 65 63 65 73 73 6f 72 73 20 7b 64 76  predecessors {dv
8210: 20 62 72 61 6e 63 68 65 73 7d 20 7b 0a 09 23 20   branches} {..# 
8220: 54 68 65 20 70 72 65 64 65 63 65 73 73 6f 72 73  The predecessors
8230: 20 6f 66 20 61 20 62 72 61 6e 63 68 20 61 72 65   of a branch are
8240: 20 61 6c 6c 20 74 68 65 20 72 65 76 69 73 69 6f   all the revisio
8250: 6e 73 20 74 68 65 0a 09 23 20 62 72 61 6e 63 68  ns the..# branch
8260: 65 73 20 61 72 65 20 73 70 61 77 6e 65 64 20 66  es are spawned f
8270: 72 6f 6d 2c 20 61 73 20 77 65 6c 6c 20 61 73 20  rom, as well as 
8280: 61 6c 6c 20 74 68 65 20 62 72 61 6e 63 68 65 73  all the branches
8290: 20 6f 72 0a 09 23 20 74 61 67 73 20 77 68 69 63   or..# tags whic
82a0: 68 20 61 72 65 20 74 68 65 69 72 20 70 72 65 66  h are their pref
82b0: 65 72 65 64 20 70 61 72 65 6e 74 73 2e 0a 0a 09  ered parents....
82c0: 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f  set theset ('[jo
82d0: 69 6e 20 24 74 61 67 73 20 7b 27 2c 27 7d 5d 27  in $tags {','}]'
82e0: 29 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64 20  )..foreach {bid 
82f0: 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72  parent} [state r
8300: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54  un "..    SELECT
8310: 20 42 2e 42 69 64 2c 20 52 2e 72 69 64 0a 09 20   B.Bid, R.rid.. 
8320: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69     FROM   revisi
8330: 6f 6e 20 52 2c 20 62 72 61 6e 63 68 20 42 0a 09  on R, branch B..
8340: 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 64      WHERE  B.bid
8350: 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20   IN $theset..   
8360: 20 41 4e 44 20 20 20 20 42 2e 72 6f 6f 74 20 3d   AND    B.root =
8370: 20 52 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20   R.rid.."] {..  
8380: 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64    lappend depend
8390: 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d  encies([list sym
83a0: 3a 3a 62 72 61 6e 63 68 20 24 62 69 64 5d 29 20  ::branch $bid]) 
83b0: 5b 6c 69 73 74 20 72 65 76 20 24 70 61 72 65 6e  [list rev $paren
83c0: 74 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b  t]..}..foreach {
83d0: 62 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61  bid parent} [sta
83e0: 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45  te run "..    SE
83f0: 4c 45 43 54 20 42 2e 62 69 64 2c 20 42 58 2e 62  LECT B.bid, BX.b
8400: 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62  id..    FROM   b
8410: 72 61 6e 63 68 20 42 2c 20 62 72 61 6e 63 68 20  ranch B, branch 
8420: 42 58 2c 20 70 72 65 66 65 72 65 64 70 61 72 65  BX, preferedpare
8430: 6e 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 20  nt P..    WHERE 
8440: 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65   B.bid IN $these
8450: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e  t..    AND    B.
8460: 73 69 64 20 3d 20 50 2e 73 69 64 0a 09 20 20 20  sid = P.sid..   
8470: 20 41 4e 44 20 20 20 20 50 2e 70 69 64 20 3d 20   AND    P.pid = 
8480: 42 58 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20  BX.sid.."] {..  
8490: 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64    lappend depend
84a0: 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d  encies([list sym
84b0: 3a 3a 62 72 61 6e 63 68 20 24 62 69 64 5d 29 20  ::branch $bid]) 
84c0: 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63  [list sym::branc
84d0: 68 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 66  h $parent]..}..f
84e0: 6f 72 65 61 63 68 20 7b 62 69 64 20 70 61 72 65  oreach {bid pare
84f0: 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22  nt} [state run "
8500: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62  ..    SELECT B.b
8510: 69 64 2c 20 54 2e 74 69 64 0a 09 20 20 20 20 46  id, T.tid..    F
8520: 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20  ROM   branch B, 
8530: 74 61 67 20 54 2c 20 70 72 65 66 65 72 65 64 70  tag T, preferedp
8540: 61 72 65 6e 74 20 50 0a 09 20 20 20 20 57 48 45  arent P..    WHE
8550: 52 45 20 20 42 2e 74 69 64 20 49 4e 20 24 74 68  RE  B.tid IN $th
8560: 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20  eset..    AND   
8570: 20 42 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a 09   B.sid = P.sid..
8580: 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69 64      AND    P.pid
8590: 20 3d 20 54 2e 73 69 64 0a 09 22 5d 20 7b 0a 09   = T.sid.."] {..
85a0: 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65      lappend depe
85b0: 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73  ndencies([list s
85c0: 79 6d 3a 3a 62 72 61 6e 63 68 20 24 62 69 64 5d  ym::branch $bid]
85d0: 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67  ) [list sym::tag
85e0: 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 72 65   $parent]..}..re
85f0: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
8600: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
8610: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
8620: 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 43  #######.    ## C
8630: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a 20 20  onfiguration..  
8640: 20 20 70 72 61 67 6d 61 20 2d 68 61 73 69 6e 73    pragma -hasins
8650: 74 61 6e 63 65 73 20 20 20 6e 6f 20 3b 20 23 20  tances   no ; # 
8660: 73 69 6e 67 6c 65 74 6f 6e 0a 20 20 20 20 70 72  singleton.    pr
8670: 61 67 6d 61 20 2d 68 61 73 74 79 70 65 69 6e 66  agma -hastypeinf
8680: 6f 20 20 20 20 6e 6f 20 3b 20 23 20 6e 6f 20 69  o    no ; # no i
8690: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20 20 20  ntrospection.   
86a0: 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65   pragma -hastype
86b0: 64 65 73 74 72 6f 79 20 6e 6f 20 3b 20 23 20 69  destroy no ; # i
86c0: 6d 6d 6f 72 74 61 6c 0a 7d 0a 0a 23 20 23 20 23  mmortal.}..# # #
86d0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
86e0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
86f0: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
8700: 23 23 23 23 23 23 23 23 0a 23 23 0a 0a 6e 61 6d  ########.##..nam
8710: 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 76 63  espace eval ::vc
8720: 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74  ::fossil::import
8730: 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 20 7b  ::cvs::project {
8740: 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 65  .    namespace e
8750: 78 70 6f 72 74 20 72 65 76 0a 20 20 20 20 6e 61  xport rev.    na
8760: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 72 65 76  mespace eval rev
8770: 20 7b 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d   {..namespace im
8780: 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69  port ::vc::fossi
8790: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a  l::import::cvs::
87a0: 73 74 61 74 65 0a 09 6e 61 6d 65 73 70 61 63 65  state..namespace
87b0: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f   import ::vc::fo
87c0: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
87d0: 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 6e 61  s::integrity..na
87e0: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
87f0: 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69 73 63  :vc::tools::misc
8800: 3a 3a 2a 0a 09 6e 61 6d 65 73 70 61 63 65 20 69  ::*..namespace i
8810: 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c  mport ::vc::tool
8820: 73 3a 3a 74 72 6f 75 62 6c 65 0a 09 6e 61 6d 65  s::trouble..name
8830: 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76  space import ::v
8840: 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 6c  c::tools::log..l
8850: 6f 67 20 72 65 67 69 73 74 65 72 20 63 73 65 74  og register cset
8860: 73 0a 0a 09 23 20 53 65 74 20 75 70 20 74 68 65  s...# Set up the
8870: 20 68 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f   helper singleto
8880: 6e 73 0a 09 6e 61 6d 65 73 70 61 63 65 20 65 76  ns..namespace ev
8890: 61 6c 20 72 65 76 20 7b 0a 09 20 20 20 20 6e 61  al rev {..    na
88a0: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
88b0: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70  :vc::fossil::imp
88c0: 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a  ort::cvs::state.
88d0: 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69  .    namespace i
88e0: 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73  mport ::vc::foss
88f0: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a  il::import::cvs:
8900: 3a 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a 09 6e  :integrity..}..n
8910: 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 73 79  amespace eval sy
8920: 6d 3a 3a 74 61 67 20 7b 0a 09 20 20 20 20 6e 61  m::tag {..    na
8930: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
8940: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70  :vc::fossil::imp
8950: 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a  ort::cvs::state.
8960: 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69  .    namespace i
8970: 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73  mport ::vc::foss
8980: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a  il::import::cvs:
8990: 3a 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a 09 6e  :integrity..}..n
89a0: 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 73 79  amespace eval sy
89b0: 6d 3a 3a 62 72 61 6e 63 68 20 7b 0a 09 20 20 20  m::branch {..   
89c0: 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72   namespace impor
89d0: 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a  t ::vc::fossil::
89e0: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61  import::cvs::sta
89f0: 74 65 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63  te..    namespac
8a00: 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66  e import ::vc::f
8a10: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63  ossil::import::c
8a20: 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 7d  vs::integrity..}
8a30: 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23  .    }.}..# # ##
8a40: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23   ### ##### #####
8a50: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
8a60: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23  # ##############
8a70: 23 23 23 23 23 23 23 0a 23 23 20 52 65 61 64 79  #######.## Ready
8a80: 0a 0a 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64  ..package provid
8a90: 65 20 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d  e vc::fossil::im
8aa0: 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65  port::cvs::proje
8ab0: 63 74 3a 3a 72 65 76 20 31 2e 30 0a 72 65 74 75  ct::rev 1.0.retu
8ac0: 72 6e 0a                                         rn.