Hex Artifact Content
Not logged in

Artifact a4cf35790a1fcb4e822bf5c9330ad2bd31091228:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [9c57055025] - Performance bugfix. nextmap/premap can still be performance killers and memory hogs. Moved the computation of sucessor changesets down to the type-dependent code (new methods) and the SQL database, i.e. the C level. In the current setup it was possible that the DB would deliver us millions of file-level dependency pairs which the Tcl level would then reduce to tens of actual changeset dependencies. Tcl did not cope well with that amount of data. Now the reduction happens in the query itself. A concrete example was a branch in the Tcl CVS generating nearly 9 million pairs, which reduced to roughly 200 changeset dependencies. This blew the memory out of the water and the converter ground to a halt, busily swapping. Ok, causes behind us, also added another index on 'csitem(iid)' to speed the search for changesets from the revisions, tags, and branches. by aku on 2007-12-02 05:49:00.

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 73 74 72 75 63 74 3a 3a 73  equire struct::s
0380: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23               ; #
03a0: 20 53 65 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e   Set operations.
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 6d 69 73 63   vc::tools::misc
03d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03e0: 20 20 20 20 20 20 20 3b 20 23 20 54 65 78 74 20         ; # Text 
03f0: 66 6f 72 6d 61 74 74 69 6e 67 0a 70 61 63 6b 61  formatting.packa
0400: 67 65 20 72 65 71 75 69 72 65 20 76 63 3a 3a 74  ge require vc::t
0410: 6f 6f 6c 73 3a 3a 74 72 6f 75 62 6c 65 20 20 20  ools::trouble   
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0430: 20 3b 20 23 20 45 72 72 6f 72 20 72 65 70 6f 72   ; # Error repor
0440: 74 69 6e 67 2e 0a 70 61 63 6b 61 67 65 20 72 65  ting..package re
0450: 71 75 69 72 65 20 76 63 3a 3a 74 6f 6f 6c 73 3a  quire vc::tools:
0460: 3a 6c 6f 67 20 20 20 20 20 20 20 20 20 20 20 20  :log            
0470: 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23 20              ; # 
0480: 55 73 65 72 20 66 65 65 64 62 61 63 6b 2e 0a 70  User feedback..p
0490: 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 76  ackage require v
04a0: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72  c::fossil::impor
04b0: 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 20 20 20  t::cvs::state   
04c0: 20 20 20 20 20 3b 20 23 20 53 74 61 74 65 20 73       ; # State s
04d0: 74 6f 72 61 67 65 2e 0a 70 61 63 6b 61 67 65 20  torage..package 
04e0: 72 65 71 75 69 72 65 20 76 63 3a 3a 66 6f 73 73  require vc::foss
04f0: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a  il::import::cvs:
0500: 3a 69 6e 74 65 67 72 69 74 79 20 20 20 20 3b 20  :integrity    ; 
0510: 23 20 53 74 61 74 65 20 69 6e 74 65 67 72 69 74  # State integrit
0520: 79 20 63 68 65 63 6b 73 2e 0a 0a 23 20 23 20 23  y checks...# # #
0530: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
0540: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
0550: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
0560: 23 23 23 23 23 23 23 23 0a 23 23 0a 0a 73 6e 69  ########.##..sni
0570: 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f  t::type ::vc::fo
0580: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
0590: 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 20  s::project::rev 
05a0: 7b 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23  {.    # # ## ###
05b0: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20   ##### ######## 
05c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 20  #############.  
05d0: 20 20 23 23 20 50 75 62 6c 69 63 20 41 50 49 0a    ## Public API.
05e0: 0a 20 20 20 20 63 6f 6e 73 74 72 75 63 74 6f 72  .    constructor
05f0: 20 7b 70 72 6f 6a 65 63 74 20 63 73 74 79 70 65   {project cstype
0600: 20 73 72 63 69 64 20 69 74 65 6d 73 20 7b 74 68   srcid items {th
0610: 65 69 64 20 7b 7d 7d 7d 20 7b 0a 09 69 66 20 7b  eid {}}} {..if {
0620: 24 74 68 65 69 64 20 6e 65 20 22 22 7d 20 7b 0a  $theid ne ""} {.
0630: 09 20 20 20 20 73 65 74 20 6d 79 69 64 20 24 74  .    set myid $t
0640: 68 65 69 64 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  heid..} else {..
0650: 20 20 20 20 73 65 74 20 6d 79 69 64 20 5b 69 6e      set myid [in
0660: 63 72 20 6d 79 63 6f 75 6e 74 65 72 5d 0a 09 7d  cr mycounter]..}
0670: 0a 0a 09 69 6e 74 65 67 72 69 74 79 20 61 73 73  ...integrity ass
0680: 65 72 74 20 7b 0a 09 20 20 20 20 5b 69 6e 66 6f  ert {..    [info
0690: 20 65 78 69 73 74 73 20 6d 79 63 73 74 79 70 65   exists mycstype
06a0: 28 24 63 73 74 79 70 65 29 5d 0a 09 7d 20 7b 42  ($cstype)]..} {B
06b0: 61 64 20 63 68 61 6e 67 65 73 65 74 20 74 79 70  ad changeset typ
06c0: 65 20 27 24 63 73 74 79 70 65 27 2e 7d 0a 0a 09  e '$cstype'.}...
06d0: 73 65 74 20 6d 79 70 72 6f 6a 65 63 74 20 20 20  set myproject   
06e0: 24 70 72 6f 6a 65 63 74 0a 09 73 65 74 20 6d 79  $project..set my
06f0: 74 79 70 65 20 20 20 20 20 20 24 63 73 74 79 70  type      $cstyp
0700: 65 0a 09 73 65 74 20 6d 79 74 79 70 65 6f 62 6a  e..set mytypeobj
0710: 20 20 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a     ::vc::fossil:
0720: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72  :import::cvs::pr
0730: 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 24 7b 63 73  oject::rev::${cs
0740: 74 79 70 65 7d 0a 09 73 65 74 20 6d 79 73 72 63  type}..set mysrc
0750: 69 64 09 24 73 72 63 69 64 0a 09 73 65 74 20 6d  id.$srcid..set m
0760: 79 69 74 65 6d 73 20 20 20 20 20 24 69 74 65 6d  yitems     $item
0770: 73 0a 09 73 65 74 20 6d 79 70 6f 73 20 20 20 20  s..set mypos    
0780: 20 20 20 7b 7d 20 3b 20 23 20 43 6f 6d 6d 69 74     {} ; # Commit
0790: 20 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6e 6f 74   location is not
07a0: 20 6b 6e 6f 77 6e 20 79 65 74 2e 0a 0a 09 23 20   known yet....# 
07b0: 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
07c0: 65 20 67 65 6e 65 72 61 74 65 64 20 63 68 61 6e  e generated chan
07d0: 67 65 73 65 74 73 20 61 6e 64 20 6f 66 20 74 68  gesets and of th
07e0: 65 20 69 6e 76 65 72 73 65 0a 09 23 20 6d 61 70  e inverse..# map
07f0: 70 69 6e 67 20 66 72 6f 6d 20 69 74 65 6d 73 20  ping from items 
0800: 74 6f 20 74 68 65 6d 2e 0a 09 6c 61 70 70 65 6e  to them...lappen
0810: 64 20 6d 79 63 68 61 6e 67 65 73 65 74 73 20 20  d mychangesets  
0820: 20 24 73 65 6c 66 0a 09 73 65 74 20 20 20 20 20   $self..set     
0830: 6d 79 69 64 6d 61 70 28 24 6d 79 69 64 29 20 24  myidmap($myid) $
0840: 73 65 6c 66 0a 09 66 6f 72 65 61 63 68 20 69 69  self..foreach ii
0850: 64 20 24 69 74 65 6d 73 20 7b 0a 09 20 20 20 20  d $items {..    
0860: 73 65 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 63  set key [list $c
0870: 73 74 79 70 65 20 24 69 69 64 5d 0a 09 20 20 20  stype $iid]..   
0880: 20 73 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24   set myitemmap($
0890: 6b 65 79 29 20 24 73 65 6c 66 0a 09 20 20 20 20  key) $self..    
08a0: 6c 61 70 70 65 6e 64 20 6d 79 74 69 74 65 6d 73  lappend mytitems
08b0: 20 24 6b 65 79 0a 09 20 20 20 20 6c 6f 67 20 77   $key..    log w
08c0: 72 69 74 65 20 38 20 63 73 65 74 73 20 7b 4d 41  rite 8 csets {MA
08d0: 50 2b 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24  P+ item <$key> $
08e0: 73 65 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74  self = [$self st
08f0: 72 5d 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20  r]}..}..return. 
0900: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64     }..    method
0910: 20 73 74 72 20 7b 7d 20 7b 0a 09 73 65 74 20 73   str {} {..set s
0920: 74 72 20 20 20 20 22 3c 22 0a 09 73 65 74 20 64  tr    "<"..set d
0930: 65 74 61 69 6c 20 22 22 0a 09 69 66 20 7b 5b 24  etail ""..if {[$
0940: 6d 79 74 79 70 65 6f 62 6a 20 62 79 73 79 6d 62  mytypeobj bysymb
0950: 6f 6c 5d 7d 20 7b 0a 09 20 20 20 20 73 65 74 20  ol]} {..    set 
0960: 64 65 74 61 69 6c 20 22 20 27 5b 73 74 61 74 65  detail " '[state
0970: 20 6f 6e 65 20 7b 0a 09 09 53 45 4c 45 43 54 20   one {...SELECT 
0980: 53 2e 6e 61 6d 65 0a 09 09 46 52 4f 4d 20 20 20  S.name...FROM   
0990: 73 79 6d 62 6f 6c 20 53 0a 09 09 57 48 45 52 45  symbol S...WHERE
09a0: 20 20 53 2e 73 69 64 20 3d 20 24 6d 79 73 72 63    S.sid = $mysrc
09b0: 69 64 0a 09 20 20 20 20 7d 5d 27 22 0a 09 7d 0a  id..    }]'"..}.
09c0: 09 61 70 70 65 6e 64 20 73 74 72 20 22 24 6d 79  .append str "$my
09d0: 74 79 70 65 20 24 7b 6d 79 69 64 7d 24 7b 64 65  type ${myid}${de
09e0: 74 61 69 6c 7d 3e 22 0a 09 72 65 74 75 72 6e 20  tail}>"..return 
09f0: 24 73 74 72 0a 20 20 20 20 7d 0a 0a 20 20 20 20  $str.    }..    
0a00: 6d 65 74 68 6f 64 20 69 64 20 20 20 20 7b 7d 20  method id    {} 
0a10: 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 64 20 7d  { return $myid }
0a20: 0a 20 20 20 20 6d 65 74 68 6f 64 20 69 74 65 6d  .    method item
0a30: 73 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d  s {} { return $m
0a40: 79 74 69 74 65 6d 73 20 7d 0a 20 20 20 20 6d 65  ytitems }.    me
0a50: 74 68 6f 64 20 64 61 74 61 20 20 7b 7d 20 7b 20  thod data  {} { 
0a60: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 6d 79  return [list $my
0a70: 70 72 6f 6a 65 63 74 20 24 6d 79 74 79 70 65 20  project $mytype 
0a80: 24 6d 79 73 72 63 69 64 5d 20 7d 0a 0a 20 20 20  $mysrcid] }..   
0a90: 20 64 65 6c 65 67 61 74 65 20 6d 65 74 68 6f 64   delegate method
0aa0: 20 62 79 73 79 6d 62 6f 6c 20 20 20 74 6f 20 6d   bysymbol   to m
0ab0: 79 74 79 70 65 6f 62 6a 0a 20 20 20 20 64 65 6c  ytypeobj.    del
0ac0: 65 67 61 74 65 20 6d 65 74 68 6f 64 20 62 79 72  egate method byr
0ad0: 65 76 69 73 69 6f 6e 20 74 6f 20 6d 79 74 79 70  evision to mytyp
0ae0: 65 6f 62 6a 0a 20 20 20 20 64 65 6c 65 67 61 74  eobj.    delegat
0af0: 65 20 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63  e method isbranc
0b00: 68 20 20 20 74 6f 20 6d 79 74 79 70 65 6f 62 6a  h   to mytypeobj
0b10: 0a 20 20 20 20 64 65 6c 65 67 61 74 65 20 6d 65  .    delegate me
0b20: 74 68 6f 64 20 69 73 74 61 67 20 20 20 20 20 20  thod istag      
0b30: 74 6f 20 6d 79 74 79 70 65 6f 62 6a 0a 0a 20 20  to mytypeobj..  
0b40: 20 20 6d 65 74 68 6f 64 20 73 65 74 70 6f 73 20    method setpos 
0b50: 7b 70 7d 20 7b 20 73 65 74 20 6d 79 70 6f 73 20  {p} { set mypos 
0b60: 24 70 20 3b 20 72 65 74 75 72 6e 20 7d 0a 20 20  $p ; return }.  
0b70: 20 20 6d 65 74 68 6f 64 20 70 6f 73 20 20 20 20    method pos    
0b80: 7b 7d 20 20 7b 20 72 65 74 75 72 6e 20 24 6d 79  {}  { return $my
0b90: 70 6f 73 20 7d 0a 0a 20 20 20 20 23 20 72 65 73  pos }..    # res
0ba0: 75 6c 74 20 3d 20 6c 69 73 74 20 28 63 68 61 6e  ult = list (chan
0bb0: 67 65 73 65 74 29 0a 20 20 20 20 6d 65 74 68 6f  geset).    metho
0bc0: 64 20 73 75 63 63 65 73 73 6f 72 73 20 7b 7d 20  d successors {} 
0bd0: 7b 0a 09 72 65 74 75 72 6e 20 5b 73 74 72 75 63  {..return [struc
0be0: 74 3a 3a 6c 69 73 74 20 6d 61 70 20 5c 0a 09 09  t::list map \...
0bf0: 20 20 20 20 5b 24 6d 79 74 79 70 65 6f 62 6a 20      [$mytypeobj 
0c00: 63 73 5f 73 75 63 63 65 73 73 6f 72 73 20 24 6d  cs_successors $m
0c10: 79 69 74 65 6d 73 5d 20 5c 0a 09 09 20 20 20 20  yitems] \...    
0c20: 5b 6d 79 74 79 70 65 6d 65 74 68 6f 64 20 6f 66  [mytypemethod of
0c30: 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  ]].    }..    # 
0c40: 72 65 73 75 6c 74 20 3d 20 64 69 63 74 20 28 69  result = dict (i
0c50: 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 63 68 61  tem -> list (cha
0c60: 6e 67 65 73 65 74 29 29 0a 20 20 20 20 6d 65 74  ngeset)).    met
0c70: 68 6f 64 20 73 75 63 63 65 73 73 6f 72 6d 61 70  hod successormap
0c80: 20 7b 7d 20 7b 0a 09 23 20 4e 4f 54 45 20 2f 20   {} {..# NOTE / 
0c90: 46 55 54 55 52 45 3a 20 44 65 66 69 6e 69 74 69  FUTURE: Definiti
0ca0: 76 65 20 62 6f 74 74 6c 65 6e 65 63 6b 20 28 63  ve bottleneck (c
0cb0: 61 6e 20 62 65 20 6d 69 6c 6c 69 6f 6e 73 20 6f  an be millions o
0cc0: 66 20 70 61 69 72 73 29 2e 0a 09 23 0a 09 23 20  f pairs)...#..# 
0cd0: 4f 6e 6c 79 20 75 73 65 72 20 69 73 20 70 61 73  Only user is pas
0ce0: 73 20 39 2c 20 63 6f 6d 70 75 74 69 6e 67 20 74  s 9, computing t
0cf0: 68 65 20 6c 69 6d 69 74 73 20 6f 66 20 62 61 63  he limits of bac
0d00: 6b 77 61 72 64 0a 09 23 20 62 72 61 6e 63 68 65  kward..# branche
0d10: 73 20 70 65 72 20 62 72 61 6e 63 68 20 69 6e 20  s per branch in 
0d20: 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20 54  the changeset. T
0d30: 4f 44 4f 3a 20 46 6f 6c 64 20 74 68 61 74 20 69  ODO: Fold that i
0d40: 6e 74 6f 0a 09 23 20 74 68 65 20 53 51 4c 20 71  nto..# the SQL q
0d50: 75 65 72 79 2c 20 69 2e 65 2e 20 6d 6f 76 65 20  uery, i.e. move 
0d60: 74 68 65 20 63 72 75 6e 63 68 69 6e 67 20 66 72  the crunching fr
0d70: 6f 6d 20 54 63 6c 20 74 6f 20 43 2e 0a 0a 09 61  om Tcl to C....a
0d80: 72 72 61 79 20 73 65 74 20 74 6d 70 20 7b 7d 0a  rray set tmp {}.
0d90: 09 66 6f 72 65 61 63 68 20 7b 72 65 76 20 63 68  .foreach {rev ch
0da0: 69 6c 64 72 65 6e 7d 20 5b 24 73 65 6c 66 20 6e  ildren} [$self n
0db0: 65 78 74 6d 61 70 5d 20 7b 0a 09 20 20 20 20 66  extmap] {..    f
0dc0: 6f 72 65 61 63 68 20 63 68 69 6c 64 20 24 63 68  oreach child $ch
0dd0: 69 6c 64 72 65 6e 20 7b 0a 09 09 6c 61 70 70 65  ildren {...lappe
0de0: 6e 64 20 74 6d 70 28 24 72 65 76 29 20 24 6d 79  nd tmp($rev) $my
0df0: 69 74 65 6d 6d 61 70 28 24 63 68 69 6c 64 29 0a  itemmap($child).
0e00: 09 20 20 20 20 7d 0a 09 20 20 20 20 73 65 74 20  .    }..    set 
0e10: 74 6d 70 28 24 72 65 76 29 20 5b 6c 73 6f 72 74  tmp($rev) [lsort
0e20: 20 2d 75 6e 69 71 75 65 20 24 74 6d 70 28 24 72   -unique $tmp($r
0e30: 65 76 29 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 20  ev)]..}..return 
0e40: 5b 61 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a  [array get tmp].
0e50: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73      }..    # res
0e60: 75 6c 74 20 3d 20 64 69 63 74 20 28 69 74 65 6d  ult = dict (item
0e70: 20 2d 3e 20 6c 69 73 74 20 28 63 68 61 6e 67 65   -> list (change
0e80: 73 65 74 29 29 0a 20 20 20 20 6d 65 74 68 6f 64  set)).    method
0e90: 20 70 72 65 64 65 63 65 73 73 6f 72 6d 61 70 20   predecessormap 
0ea0: 7b 7d 20 7b 0a 09 23 20 4e 4f 54 45 20 2f 20 46  {} {..# NOTE / F
0eb0: 55 54 55 52 45 3a 20 44 65 66 69 6e 69 74 69 76  UTURE: Definitiv
0ec0: 65 20 62 6f 74 74 6c 65 6e 65 63 6b 20 28 63 61  e bottleneck (ca
0ed0: 6e 20 62 65 20 6d 69 6c 6c 69 6f 6e 73 20 6f 66  n be millions of
0ee0: 20 70 61 69 72 73 29 2e 0a 09 23 0a 09 23 20 4f   pairs)...#..# O
0ef0: 6e 6c 79 20 75 73 65 72 20 69 73 20 70 61 73 73  nly user is pass
0f00: 20 39 2c 20 63 6f 6d 70 75 74 69 6e 67 20 74 68   9, computing th
0f10: 65 20 6c 69 6d 69 74 73 20 6f 66 20 62 61 63 6b  e limits of back
0f20: 77 61 72 64 0a 09 23 20 62 72 61 6e 63 68 65 73  ward..# branches
0f30: 20 70 65 72 20 62 72 61 6e 63 68 20 69 6e 20 74   per branch in t
0f40: 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20 54 4f  he changeset. TO
0f50: 44 4f 3a 20 46 6f 6c 64 20 74 68 61 74 20 69 6e  DO: Fold that in
0f60: 74 6f 0a 09 23 20 74 68 65 20 53 51 4c 20 71 75  to..# the SQL qu
0f70: 65 72 79 2c 20 69 2e 65 2e 20 6d 6f 76 65 20 74  ery, i.e. move t
0f80: 68 65 20 63 72 75 6e 63 68 69 6e 67 20 66 72 6f  he crunching fro
0f90: 6d 20 54 63 6c 20 74 6f 20 43 2e 0a 0a 09 61 72  m Tcl to C....ar
0fa0: 72 61 79 20 73 65 74 20 74 6d 70 20 7b 7d 0a 09  ray set tmp {}..
0fb0: 66 6f 72 65 61 63 68 20 7b 72 65 76 20 63 68 69  foreach {rev chi
0fc0: 6c 64 72 65 6e 7d 20 5b 24 73 65 6c 66 20 70 72  ldren} [$self pr
0fd0: 65 6d 61 70 5d 20 7b 0a 09 20 20 20 20 66 6f 72  emap] {..    for
0fe0: 65 61 63 68 20 63 68 69 6c 64 20 24 63 68 69 6c  each child $chil
0ff0: 64 72 65 6e 20 7b 0a 09 09 6c 61 70 70 65 6e 64  dren {...lappend
1000: 20 74 6d 70 28 24 72 65 76 29 20 24 6d 79 69 74   tmp($rev) $myit
1010: 65 6d 6d 61 70 28 24 63 68 69 6c 64 29 0a 09 20  emmap($child).. 
1020: 20 20 20 7d 0a 09 20 20 20 20 73 65 74 20 74 6d     }..    set tm
1030: 70 28 24 72 65 76 29 20 5b 6c 73 6f 72 74 20 2d  p($rev) [lsort -
1040: 75 6e 69 71 75 65 20 24 74 6d 70 28 24 72 65 76  unique $tmp($rev
1050: 29 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b 61  )]..}..return [a
1060: 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 20 20  rray get tmp].  
1070: 20 20 7d 0a 0a 20 20 20 20 23 20 69 74 65 6d 20    }..    # item 
1080: 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 0a 20  -> list (item). 
1090: 20 20 20 6d 65 74 68 6f 64 20 6e 65 78 74 6d 61     method nextma
10a0: 70 20 7b 7d 20 7b 0a 09 23 69 66 20 7b 5b 6c 6c  p {} {..#if {[ll
10b0: 65 6e 67 74 68 20 24 6d 79 6e 65 78 74 6d 61 70  ength $mynextmap
10c0: 5d 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 6e  ]} { return $myn
10d0: 65 78 74 6d 61 70 20 7d 0a 09 24 6d 79 74 79 70  extmap }..$mytyp
10e0: 65 6f 62 6a 20 73 75 63 63 65 73 73 6f 72 73 20  eobj successors 
10f0: 74 6d 70 20 24 6d 79 69 74 65 6d 73 0a 09 72 65  tmp $myitems..re
1100: 74 75 72 6e 20 5b 61 72 72 61 79 20 67 65 74 20  turn [array get 
1110: 74 6d 70 5d 0a 09 23 73 65 74 20 6d 79 6e 65 78  tmp]..#set mynex
1120: 74 6d 61 70 20 5b 61 72 72 61 79 20 67 65 74 20  tmap [array get 
1130: 74 6d 70 5d 0a 09 23 72 65 74 75 72 6e 20 24 6d  tmp]..#return $m
1140: 79 6e 65 78 74 6d 61 70 0a 20 20 20 20 7d 0a 0a  ynextmap.    }..
1150: 20 20 20 20 23 20 69 74 65 6d 20 2d 3e 20 6c 69      # item -> li
1160: 73 74 20 28 69 74 65 6d 29 0a 20 20 20 20 6d 65  st (item).    me
1170: 74 68 6f 64 20 70 72 65 6d 61 70 20 7b 7d 20 7b  thod premap {} {
1180: 0a 09 23 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20  ..#if {[llength 
1190: 24 6d 79 70 72 65 6d 61 70 5d 7d 20 7b 20 72 65  $mypremap]} { re
11a0: 74 75 72 6e 20 24 6d 79 70 72 65 6d 61 70 20 7d  turn $mypremap }
11b0: 0a 09 24 6d 79 74 79 70 65 6f 62 6a 20 70 72 65  ..$mytypeobj pre
11c0: 64 65 63 65 73 73 6f 72 73 20 74 6d 70 20 24 6d  decessors tmp $m
11d0: 79 69 74 65 6d 73 0a 09 72 65 74 75 72 6e 20 5b  yitems..return [
11e0: 61 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 09  array get tmp]..
11f0: 23 73 65 74 20 6d 79 70 72 65 6d 61 70 20 5b 61  #set mypremap [a
1200: 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 09 23  rray get tmp]..#
1210: 72 65 74 75 72 6e 20 24 6d 79 70 72 65 6d 61 70  return $mypremap
1220: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68  .    }..    meth
1230: 6f 64 20 62 72 65 61 6b 69 6e 74 65 72 6e 61 6c  od breakinternal
1240: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 7b 7d 20  dependencies {} 
1250: 7b 0a 0a 09 23 23 0a 09 23 23 20 4e 4f 54 45 3a  {...##..## NOTE:
1260: 20 54 68 69 73 20 6d 65 74 68 6f 64 2c 20 6d 61   This method, ma
1270: 79 62 65 20 69 6e 20 63 6f 6e 6a 75 6e 63 74 69  ybe in conjuncti
1280: 6f 6e 20 77 69 74 68 20 69 74 73 20 63 61 6c 6c  on with its call
1290: 65 72 0a 09 23 23 20 20 20 20 20 20 20 73 65 65  er..##       see
12a0: 6d 73 20 74 6f 20 62 65 20 61 20 6d 65 6d 6f 72  ms to be a memor
12b0: 79 20 68 6f 67 2c 20 65 73 70 65 63 69 61 6c 6c  y hog, especiall
12c0: 79 20 66 6f 72 20 6c 61 72 67 65 0a 09 23 23 20  y for large..## 
12d0: 20 20 20 20 20 20 63 68 61 6e 67 65 73 65 74 73        changesets
12e0: 2c 20 77 69 74 68 20 27 6c 61 72 67 65 27 20 6d  , with 'large' m
12f0: 65 61 6e 69 6e 67 20 74 6f 20 68 61 76 65 20 61  eaning to have a
1300: 20 27 6c 6f 6e 67 20 6c 69 73 74 0a 09 23 23 20   'long list..## 
1310: 20 20 20 20 20 20 6f 66 20 69 74 65 6d 73 2c 20        of items, 
1320: 73 65 76 65 72 61 6c 20 74 68 6f 75 73 61 6e 64  several thousand
1330: 27 2e 20 49 6e 76 65 73 74 69 67 61 74 65 20 77  '. Investigate w
1340: 68 65 72 65 20 74 68 65 0a 09 23 23 20 20 20 20  here the..##    
1350: 20 20 20 6d 65 6d 6f 72 79 20 69 73 20 73 70 65     memory is spe
1360: 6e 74 20 61 6e 64 20 74 68 65 6e 20 6c 6f 6f 6b  nt and then look
1370: 20 66 6f 72 20 77 61 79 73 20 6f 66 20 72 65 63   for ways of rec
1380: 74 69 66 79 69 6e 67 0a 09 23 23 20 20 20 20 20  tifying..##     
1390: 20 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 09    the problem...
13a0: 23 23 0a 0a 09 23 20 54 68 69 73 20 6d 65 74 68  ##...# This meth
13b0: 6f 64 20 69 6e 73 70 65 63 74 73 20 74 68 65 20  od inspects the 
13c0: 63 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20 69  changesets for i
13d0: 6e 74 65 72 6e 61 6c 0a 09 23 20 64 65 70 65 6e  nternal..# depen
13e0: 64 65 6e 63 69 65 73 2e 20 4e 6f 74 68 69 6e 67  dencies. Nothing
13f0: 20 69 73 20 64 6f 6e 65 20 69 66 20 74 68 65 72   is done if ther
1400: 65 20 61 72 65 20 6e 6f 0a 09 23 20 73 75 63 68  e are no..# such
1410: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
1420: 63 68 61 6e 67 65 73 65 74 20 69 73 20 73 70 6c  changeset is spl
1430: 69 74 20 69 6e 74 6f 20 61 20 73 65 74 20 6f 66  it into a set of
1440: 0a 09 23 20 66 72 61 67 6d 65 6e 74 73 20 77 69  ..# fragments wi
1450: 74 68 6f 75 74 20 69 6e 74 65 72 6e 61 6c 20 64  thout internal d
1460: 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 74 72 61  ependencies, tra
1470: 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 09 23  nsforming the..#
1480: 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64   internal depend
1490: 65 6e 63 69 65 73 20 69 6e 74 6f 20 65 78 74 65  encies into exte
14a0: 72 6e 61 6c 20 6f 6e 65 73 2e 20 54 68 65 20 6e  rnal ones. The n
14b0: 65 77 20 63 68 61 6e 67 65 73 65 74 73 0a 09 23  ew changesets..#
14c0: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
14d0: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 68  e list of all ch
14e0: 61 6e 67 65 73 65 74 73 2e 0a 0a 09 23 20 57 65  angesets....# We
14f0: 20 70 65 72 66 6f 72 6d 20 61 6c 6c 20 6e 65 63   perform all nec
1500: 65 73 73 61 72 79 20 73 70 6c 69 74 73 20 69 6e  essary splits in
1510: 20 6f 6e 65 20 67 6f 2c 20 69 6e 73 74 65 61 64   one go, instead
1520: 20 6f 66 20 6f 6e 6c 79 0a 09 23 20 6f 6e 65 2e   of only..# one.
1530: 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 61 6c   The previous al
1540: 67 6f 72 69 74 68 6d 2c 20 61 64 61 70 74 65 64  gorithm, adapted
1550: 20 66 72 6f 6d 20 63 76 73 32 73 76 6e 2c 20 63   from cvs2svn, c
1560: 6f 6d 70 75 74 65 64 0a 09 23 20 61 20 6c 6f 74  omputed..# a lot
1570: 20 6f 66 20 73 74 61 74 65 20 77 68 69 63 68 20   of state which 
1580: 77 61 73 20 74 68 72 6f 77 6e 20 61 77 61 79 20  was thrown away 
1590: 61 6e 64 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  and then compute
15a0: 64 20 61 67 61 69 6e 0a 09 23 20 66 6f 72 20 65  d again..# for e
15b0: 61 63 68 20 6f 66 20 74 68 65 20 66 72 61 67 6d  ach of the fragm
15c0: 65 6e 74 73 2e 20 49 74 20 73 68 6f 75 6c 64 20  ents. It should 
15d0: 62 65 20 65 61 73 69 65 72 20 74 6f 20 75 70 64  be easier to upd
15e0: 61 74 65 20 61 6e 64 0a 09 23 20 72 65 75 73 65  ate and..# reuse
15f0: 20 74 68 61 74 20 73 74 61 74 65 2e 0a 0a 09 23   that state....#
1600: 20 54 68 65 20 63 6f 64 65 20 63 68 65 63 6b 73   The code checks
1610: 20 6f 6e 6c 79 20 73 75 63 65 73 73 6f 72 20 64   only sucessor d
1620: 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 20  ependencies, as 
1630: 74 68 69 73 0a 09 23 20 61 75 74 6f 6d 61 74 69  this..# automati
1640: 63 61 6c 6c 79 20 63 6f 76 65 72 73 20 74 68 65  cally covers the
1650: 20 70 72 65 64 65 63 65 73 73 6f 72 20 64 65 70   predecessor dep
1660: 65 6e 64 65 6e 63 69 65 73 20 61 73 20 77 65 6c  endencies as wel
1670: 6c 20 28 41 0a 09 23 20 73 75 63 63 65 73 73 6f  l (A..# successo
1680: 72 20 64 65 70 65 6e 64 65 6e 63 79 20 61 20 2d  r dependency a -
1690: 3e 20 62 20 69 73 20 61 6c 73 6f 20 61 20 70 72  > b is also a pr
16a0: 65 64 65 63 65 73 73 6f 72 20 64 65 70 65 6e 64  edecessor depend
16b0: 65 6e 63 79 0a 09 23 20 62 20 2d 3e 20 61 29 2e  ency..# b -> a).
16c0: 0a 0a 09 23 20 41 72 72 61 79 20 6f 66 20 64 65  ...# Array of de
16d0: 70 65 6e 64 65 6e 63 69 65 73 20 28 70 61 72 65  pendencies (pare
16e0: 6e 74 20 2d 3e 20 63 68 69 6c 64 29 2e 20 54 68  nt -> child). Th
16f0: 69 73 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f  is is pulled fro
1700: 6d 0a 09 23 20 74 68 65 20 73 74 61 74 65 2c 20  m..# the state, 
1710: 61 6e 64 20 6c 69 6d 69 74 65 64 20 74 6f 20 73  and limited to s
1720: 75 63 63 65 73 73 6f 72 73 20 77 69 74 68 69 6e  uccessors within
1730: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 0a   the changeset..
1740: 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 70 65  ..array set depe
1750: 6e 64 65 6e 63 69 65 73 20 7b 7d 0a 09 24 6d 79  ndencies {}..$my
1760: 74 79 70 65 6f 62 6a 20 69 6e 74 65 72 6e 61 6c  typeobj internal
1770: 73 75 63 63 65 73 73 6f 72 73 20 64 65 70 65 6e  successors depen
1780: 64 65 6e 63 69 65 73 20 24 6d 79 69 74 65 6d 73  dencies $myitems
1790: 0a 09 69 66 20 7b 21 5b 61 72 72 61 79 20 73 69  ..if {![array si
17a0: 7a 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73 5d  ze dependencies]
17b0: 7d 20 7b 72 65 74 75 72 6e 20 30 7d 20 3b 20 23  } {return 0} ; #
17c0: 20 4e 6f 74 68 69 6e 67 20 74 6f 20 62 72 65 61   Nothing to brea
17d0: 6b 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 35  k....log write 5
17e0: 20 63 73 65 74 73 20 2e 2e 2e 5b 24 73 65 6c 66   csets ...[$self
17f0: 20 73 74 72 5d 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e   str]...........
1800: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1810: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1820: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 0a 0a 09 23  ...............#
1830: 20 57 65 20 68 61 76 65 20 69 6e 74 65 72 6e 61   We have interna
1840: 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74  l dependencies t
1850: 6f 20 62 72 65 61 6b 2e 20 57 65 20 6e 6f 77 20  o break. We now 
1860: 69 74 65 72 61 74 65 20 6f 76 65 72 0a 09 23 20  iterate over..# 
1870: 61 6c 6c 20 70 6f 73 69 74 69 6f 6e 73 20 69 6e  all positions in
1880: 20 74 68 65 20 6c 69 73 74 20 28 77 68 69 63 68   the list (which
1890: 20 69 73 20 63 68 72 6f 6e 6f 6c 6f 67 69 63 61   is chronologica
18a0: 6c 2c 20 61 74 20 6c 65 61 73 74 0a 09 23 20 61  l, at least..# a
18b0: 73 20 66 61 72 20 61 73 20 74 68 65 20 74 69 6d  s far as the tim
18c0: 65 73 74 61 6d 70 73 20 61 72 65 20 63 6f 72 72  estamps are corr
18d0: 65 63 74 20 61 6e 64 20 75 6e 69 71 75 65 29 20  ect and unique) 
18e0: 61 6e 64 0a 09 23 20 64 65 74 65 72 6d 69 6e 65  and..# determine
18f0: 20 74 68 65 20 62 65 73 74 20 70 6f 73 69 74 69   the best positi
1900: 6f 6e 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b  on for the break
1910: 2c 20 62 79 20 74 72 79 69 6e 67 20 74 6f 0a 09  , by trying to..
1920: 23 20 62 72 65 61 6b 20 61 73 20 6d 61 6e 79 20  # break as many 
1930: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 61 73 20  dependencies as 
1940: 70 6f 73 73 69 62 6c 65 20 69 6e 20 6f 6e 65 20  possible in one 
1950: 67 6f 2e 20 57 68 65 6e 20 61 0a 09 23 20 62 72  go. When a..# br
1960: 65 61 6b 20 77 61 73 20 66 6f 75 6e 64 20 74 68  eak was found th
1970: 69 73 20 69 73 20 72 65 64 6f 6e 65 20 66 6f 72  is is redone for
1980: 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 20 63   the fragments c
1990: 6f 6d 69 6e 67 20 61 6e 64 0a 09 23 20 61 66 74  oming and..# aft
19a0: 65 72 2c 20 61 66 74 65 72 20 75 70 64 69 6e 67  er, after upding
19b0: 20 74 68 65 20 63 72 6f 73 73 69 6e 67 20 69 6e   the crossing in
19c0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 0a 09 23 20 44  formation....# D
19d0: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 3a 0a  ata structures:.
19e0: 09 23 20 4d 61 70 3a 20 20 50 4f 53 20 20 20 72  .# Map:  POS   r
19f0: 65 76 69 73 69 6f 6e 20 69 64 20 20 20 20 20 20  evision id      
1a00: 2d 3e 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c  -> position in l
1a10: 69 73 74 2e 0a 09 23 20 20 20 20 20 20 20 43 52  ist...#       CR
1a20: 4f 53 53 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20  OSS position in 
1a30: 6c 69 73 74 20 2d 3e 20 6e 75 6d 62 65 72 20 6f  list -> number o
1a40: 66 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 63  f dependencies c
1a50: 72 6f 73 73 69 6e 67 20 69 74 0a 09 23 20 20 20  rossing it..#   
1a60: 20 20 20 20 44 45 50 43 20 20 64 65 70 65 6e 64      DEPC  depend
1a70: 65 6e 63 79 20 20 20 20 20 20 20 2d 3e 20 70 6f  ency       -> po
1a80: 73 69 74 69 6f 6e 73 20 69 74 20 63 72 6f 73 73  sitions it cross
1a90: 65 73 0a 09 23 20 4c 69 73 74 3a 20 52 41 4e 47  es..# List: RANG
1aa0: 45 20 4f 66 20 74 68 65 20 70 6f 73 69 74 69 6f  E Of the positio
1ab0: 6e 73 20 69 74 73 65 6c 66 2e 0a 09 23 20 41 20  ns itself...# A 
1ac0: 64 65 70 65 6e 64 65 6e 63 79 20 69 73 20 61 20  dependency is a 
1ad0: 73 69 6e 67 6c 65 2d 65 6c 65 6d 65 6e 74 20 6d  single-element m
1ae0: 61 70 20 70 61 72 65 6e 74 20 2d 3e 20 63 68 69  ap parent -> chi
1af0: 6c 64 0a 0a 09 49 6e 69 74 69 61 6c 69 7a 65 42  ld...InitializeB
1b00: 72 65 61 6b 53 74 61 74 65 20 24 6d 79 69 74 65  reakState $myite
1b10: 6d 73 0a 0a 09 73 65 74 20 66 72 61 67 6d 65 6e  ms...set fragmen
1b20: 74 73 20 7b 7d 0a 09 73 65 74 20 6e 65 77 20 20  ts {}..set new  
1b30: 20 20 20 20 20 5b 6c 69 73 74 20 24 72 61 6e 67       [list $rang
1b40: 65 5d 0a 09 61 72 72 61 79 20 73 65 74 20 62 72  e]..array set br
1b50: 65 61 6b 73 20 7b 7d 0a 0a 09 23 20 49 6e 73 74  eaks {}...# Inst
1b60: 65 61 64 20 6f 66 20 6f 6e 65 20 6c 69 73 74 20  ead of one list 
1b70: 68 6f 6c 64 69 6e 67 20 62 6f 74 68 20 70 72 6f  holding both pro
1b80: 63 65 73 73 65 64 20 61 6e 64 20 70 65 6e 64 69  cessed and pendi
1b90: 6e 67 0a 09 23 20 66 72 61 67 6d 65 6e 74 73 20  ng..# fragments 
1ba0: 77 65 20 75 73 65 20 74 77 6f 2c 20 6f 6e 65 20  we use two, one 
1bb0: 66 6f 72 20 74 68 65 20 66 72 61 6d 65 6e 74 73  for the framents
1bc0: 20 74 6f 20 70 72 6f 63 65 73 73 2c 20 6f 6e 65   to process, one
1bd0: 0a 09 23 20 74 6f 20 68 6f 6c 64 20 74 68 65 20  ..# to hold the 
1be0: 6e 65 77 20 66 72 61 67 6d 65 6e 74 73 2c 20 61  new fragments, a
1bf0: 6e 64 20 74 68 65 20 6c 61 74 74 65 72 20 69 73  nd the latter is
1c00: 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 0a 09   copied to the..
1c10: 23 20 66 6f 72 6d 65 72 20 77 68 65 6e 20 74 68  # former when th
1c20: 65 79 20 72 75 6e 20 6f 75 74 2e 20 54 68 69 73  ey run out. This
1c30: 20 6b 65 65 70 73 20 74 68 65 20 6c 69 73 74 20   keeps the list 
1c40: 6f 66 20 70 65 6e 64 69 6e 67 0a 09 23 20 66 72  of pending..# fr
1c50: 61 67 6d 65 6e 74 73 20 73 68 6f 72 74 20 77 69  agments short wi
1c60: 74 68 6f 75 74 20 73 61 63 72 69 66 69 63 69 6e  thout sacrificin
1c70: 67 20 73 70 65 65 64 20 62 79 20 73 68 69 66 74  g speed by shift
1c80: 69 6e 67 20 73 74 75 66 66 0a 09 23 20 64 6f 77  ing stuff..# dow
1c90: 6e 2e 20 57 65 20 65 73 70 65 63 69 61 6c 6c 79  n. We especially
1ca0: 20 64 72 6f 70 20 74 68 65 20 6d 65 6d 6f 72 79   drop the memory
1cb0: 20 6f 66 20 66 72 61 67 6d 65 6e 74 73 20 62 72   of fragments br
1cc0: 6f 6b 65 6e 0a 09 23 20 64 75 72 69 6e 67 20 70  oken..# during p
1cd0: 72 6f 63 65 73 73 69 6e 67 20 61 66 74 65 72 20  rocessing after 
1ce0: 61 20 73 68 6f 72 74 20 74 69 6d 65 2c 20 69 6e  a short time, in
1cf0: 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67  stead of letting
1d00: 20 69 74 0a 09 23 20 63 6f 6e 73 75 6d 65 20 6d   it..# consume m
1d10: 65 6d 6f 72 79 2e 0a 0a 09 77 68 69 6c 65 20 7b  emory....while {
1d20: 5b 6c 6c 65 6e 67 74 68 20 24 6e 65 77 5d 7d 20  [llength $new]} 
1d30: 7b 0a 0a 09 20 20 20 20 73 65 74 20 70 65 6e 64  {...    set pend
1d40: 69 6e 67 20 24 6e 65 77 0a 09 20 20 20 20 73 65  ing $new..    se
1d50: 74 20 6e 65 77 20 20 20 20 20 7b 7d 0a 09 20 20  t new     {}..  
1d60: 20 20 73 65 74 20 61 74 20 20 20 20 20 20 30 0a    set at      0.
1d70: 0a 09 20 20 20 20 77 68 69 6c 65 20 7b 24 61 74  ..    while {$at
1d80: 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24 70 65 6e   < [llength $pen
1d90: 64 69 6e 67 5d 7d 20 7b 0a 09 09 73 65 74 20 63  ding]} {...set c
1da0: 75 72 72 65 6e 74 20 5b 6c 69 6e 64 65 78 20 24  urrent [lindex $
1db0: 70 65 6e 64 69 6e 67 20 24 61 74 5d 0a 0a 09 09  pending $at]....
1dc0: 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74  log write 6 cset
1dd0: 73 20 7b 2e 20 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e  s {. . .. ... ..
1de0: 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e  ... ........ ...
1df0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 7d 0a 09 09 6c 6f  ..........}...lo
1e00: 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20  g write 6 csets 
1e10: 7b 53 63 68 65 64 75 6c 65 64 20 20 20 5b 6a 6f  {Scheduled   [jo
1e20: 69 6e 20 5b 50 52 73 20 5b 6c 72 61 6e 67 65 20  in [PRs [lrange 
1e30: 24 70 65 6e 64 69 6e 67 20 24 61 74 20 65 6e 64  $pending $at end
1e40: 5d 5d 20 7b 20 7d 5d 7d 0a 09 09 6c 6f 67 20 77  ]] { }]}...log w
1e50: 72 69 74 65 20 36 20 63 73 65 74 73 20 7b 43 6f  rite 6 csets {Co
1e60: 6e 73 69 64 65 72 69 6e 67 20 5b 50 52 20 24 63  nsidering [PR $c
1e70: 75 72 72 65 6e 74 5d 20 5c 5b 24 61 74 2f 5b 6c  urrent] \[$at/[l
1e80: 6c 65 6e 67 74 68 20 24 70 65 6e 64 69 6e 67 5d  length $pending]
1e90: 5c 5d 7d 0a 0a 09 09 73 65 74 20 62 65 73 74 20  \]}....set best 
1ea0: 5b 46 69 6e 64 42 65 73 74 42 72 65 61 6b 20 24  [FindBestBreak $
1eb0: 63 75 72 72 65 6e 74 5d 0a 0a 09 09 69 66 20 7b  current]....if {
1ec0: 24 62 65 73 74 20 3c 20 30 7d 20 7b 0a 09 09 20  $best < 0} {... 
1ed0: 20 20 20 23 20 54 68 65 20 69 6e 73 70 65 63 74     # The inspect
1ee0: 65 64 20 72 61 6e 67 65 20 68 61 73 20 6e 6f 20  ed range has no 
1ef0: 69 6e 74 65 72 6e 61 6c 0a 09 09 20 20 20 20 23  internal...    #
1f00: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 54   dependencies. T
1f10: 68 69 73 20 69 73 20 61 20 63 6f 6d 70 6c 65 74  his is a complet
1f20: 65 20 66 72 61 67 6d 65 6e 74 2e 0a 09 09 20 20  e fragment....  
1f30: 20 20 6c 61 70 70 65 6e 64 20 66 72 61 67 6d 65    lappend fragme
1f40: 6e 74 73 20 24 63 75 72 72 65 6e 74 0a 0a 09 09  nts $current....
1f50: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 36 20      log write 6 
1f60: 63 73 65 74 73 20 22 4e 6f 20 62 72 65 61 6b 73  csets "No breaks
1f70: 2c 20 66 69 6e 61 6c 22 0a 09 09 7d 20 65 6c 73  , final"...} els
1f80: 65 20 7b 0a 09 09 20 20 20 20 23 20 53 70 6c 69  e {...    # Spli
1f90: 74 20 74 68 65 20 72 61 6e 67 65 20 61 6e 64 20  t the range and 
1fa0: 73 63 68 65 64 75 6c 65 20 74 68 65 20 72 65 73  schedule the res
1fb0: 75 6c 74 69 6e 67 0a 09 09 20 20 20 20 23 20 66  ulting...    # f
1fc0: 72 61 67 6d 65 6e 74 73 20 66 6f 72 20 66 75 72  ragments for fur
1fd0: 74 68 65 72 20 69 6e 73 70 65 63 74 69 6f 6e 2e  ther inspection.
1fe0: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 0a 09 09   Remember the...
1ff0: 20 20 20 20 23 20 6e 75 6d 62 65 72 20 6f 66 20      # number of 
2000: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 63 75 74  dependencies cut
2010: 20 62 65 66 6f 72 65 20 77 65 20 72 65 6d 6f 76   before we remov
2020: 65 20 74 68 65 6d 0a 09 09 20 20 20 20 23 20 66  e them...    # f
2030: 72 6f 6d 20 63 6f 6e 73 69 64 65 72 61 74 69 6f  rom consideratio
2040: 6e 2c 20 66 6f 72 20 64 6f 63 75 6d 65 6e 74 61  n, for documenta
2050: 74 69 6f 6e 20 6c 61 74 65 72 2e 0a 0a 09 09 20  tion later..... 
2060: 20 20 20 73 65 74 20 62 72 65 61 6b 73 28 24 62     set breaks($b
2070: 65 73 74 29 20 24 63 72 6f 73 73 28 24 62 65 73  est) $cross($bes
2080: 74 29 0a 0a 09 09 20 20 20 20 6c 6f 67 20 77 72  t)....    log wr
2090: 69 74 65 20 36 20 63 73 65 74 73 20 22 42 65 73  ite 6 csets "Bes
20a0: 74 20 62 72 65 61 6b 20 40 20 24 62 65 73 74 2c  t break @ $best,
20b0: 20 63 75 74 74 69 6e 67 20 5b 6e 73 70 20 24 63   cutting [nsp $c
20c0: 72 6f 73 73 28 24 62 65 73 74 29 20 64 65 70 65  ross($best) depe
20d0: 6e 64 65 6e 63 79 20 64 65 70 65 6e 64 65 6e 63  ndency dependenc
20e0: 69 65 73 5d 22 0a 0a 09 09 20 20 20 20 23 20 4e  ies]"....    # N
20f0: 6f 74 65 3a 20 54 68 65 20 76 61 6c 75 65 20 6f  ote: The value o
2100: 66 20 62 65 73 74 20 69 73 20 61 6e 20 61 62 6f  f best is an abo
2110: 6c 75 74 65 20 6c 6f 63 61 74 69 6f 6e 0a 09 09  lute location...
2120: 20 20 20 20 23 20 69 6e 20 6d 79 69 74 65 6d 73      # in myitems
2130: 2e 20 55 73 65 20 74 68 65 20 73 74 61 72 74 20  . Use the start 
2140: 6f 66 20 63 75 72 72 65 6e 74 20 74 6f 20 6d 61  of current to ma
2150: 6b 65 20 69 74 0a 09 09 20 20 20 20 23 20 61 6e  ke it...    # an
2160: 20 69 6e 64 65 78 20 61 62 73 6f 6c 75 74 65 20   index absolute 
2170: 74 6f 20 63 75 72 72 65 6e 74 2e 0a 0a 09 09 20  to current..... 
2180: 20 20 20 73 65 74 20 62 72 65 6c 20 5b 65 78 70     set brel [exp
2190: 72 20 7b 24 62 65 73 74 20 2d 20 5b 6c 69 6e 64  r {$best - [lind
21a0: 65 78 20 24 63 75 72 72 65 6e 74 20 30 5d 7d 5d  ex $current 0]}]
21b0: 0a 09 09 20 20 20 20 73 65 74 20 62 6e 65 78 74  ...    set bnext
21c0: 20 24 62 72 65 6c 20 3b 20 69 6e 63 72 20 62 6e   $brel ; incr bn
21d0: 65 78 74 0a 09 09 20 20 20 20 73 65 74 20 66 72  ext...    set fr
21e0: 61 67 62 65 66 6f 72 65 20 5b 6c 72 61 6e 67 65  agbefore [lrange
21f0: 20 24 63 75 72 72 65 6e 74 20 30 20 24 62 72 65   $current 0 $bre
2200: 6c 5d 0a 09 09 20 20 20 20 73 65 74 20 66 72 61  l]...    set fra
2210: 67 61 66 74 65 72 20 20 5b 6c 72 61 6e 67 65 20  gafter  [lrange 
2220: 24 63 75 72 72 65 6e 74 20 24 62 6e 65 78 74 20  $current $bnext 
2230: 65 6e 64 5d 0a 0a 09 09 20 20 20 20 6c 6f 67 20  end]....    log 
2240: 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22 4e  write 6 csets "N
2250: 65 77 20 70 69 65 63 65 73 20 20 5b 50 52 20 24  ew pieces  [PR $
2260: 66 72 61 67 62 65 66 6f 72 65 5d 20 5b 50 52 20  fragbefore] [PR 
2270: 24 66 72 61 67 61 66 74 65 72 5d 22 0a 0a 09 09  $fragafter]"....
2280: 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73      integrity as
2290: 73 65 72 74 20 7b 5b 6c 6c 65 6e 67 74 68 20 24  sert {[llength $
22a0: 66 72 61 67 62 65 66 6f 72 65 5d 7d 20 7b 46 6f  fragbefore]} {Fo
22b0: 75 6e 64 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20  und zero-length 
22c0: 66 72 61 67 6d 65 6e 74 20 61 74 20 74 68 65 20  fragment at the 
22d0: 62 65 67 69 6e 6e 69 6e 67 7d 0a 09 09 20 20 20  beginning}...   
22e0: 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72   integrity asser
22f0: 74 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 72 61  t {[llength $fra
2300: 67 61 66 74 65 72 5d 7d 20 20 7b 46 6f 75 6e 64  gafter]}  {Found
2310: 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 72 61   zero-length fra
2320: 67 6d 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64  gment at the end
2330: 7d 0a 0a 09 09 20 20 20 20 6c 61 70 70 65 6e 64  }....    lappend
2340: 20 6e 65 77 20 24 66 72 61 67 62 65 66 6f 72 65   new $fragbefore
2350: 20 24 66 72 61 67 61 66 74 65 72 0a 09 09 20 20   $fragafter...  
2360: 20 20 43 75 74 41 74 20 24 62 65 73 74 0a 09 09    CutAt $best...
2370: 7d 0a 0a 09 09 69 6e 63 72 20 61 74 0a 09 20 20  }....incr at..  
2380: 20 20 7d 0a 09 7d 0a 0a 09 6c 6f 67 20 77 72 69    }..}...log wri
2390: 74 65 20 36 20 63 73 65 74 73 20 22 2e 20 2e 20  te 6 csets ". . 
23a0: 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e 2e  .. ... ..... ...
23b0: 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ..... ..........
23c0: 2e 2e 2e 22 0a 0a 09 23 20 28 2a 29 20 57 65 20  ..."...# (*) We 
23d0: 63 6c 65 61 72 20 6f 75 74 20 74 68 65 20 61 73  clear out the as
23e0: 73 6f 63 69 61 74 65 64 20 70 61 72 74 20 6f 66  sociated part of
23f0: 20 74 68 65 20 6d 79 69 74 65 6d 6d 61 70 0a 09   the myitemmap..
2400: 23 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6e 64 65  # in-memory inde
2410: 78 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e  x in preparation
2420: 20 66 6f 72 20 6e 65 77 20 64 61 74 61 2e 20 41   for new data. A
2430: 20 73 69 6d 70 6c 65 20 75 6e 73 65 74 0a 09 23   simple unset..#
2440: 20 69 73 20 65 6e 6f 75 67 68 2c 20 77 65 20 68   is enough, we h
2450: 61 76 65 20 6e 6f 20 73 79 6d 62 6f 6c 20 63 68  ave no symbol ch
2460: 61 6e 67 65 73 65 74 73 20 61 74 20 74 68 69 73  angesets at this
2470: 20 74 69 6d 65 2c 20 61 6e 64 0a 09 23 20 74 68   time, and..# th
2480: 75 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68  us never more th
2490: 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65  an one reference
24a0: 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 0a 09   in the list....
24b0: 66 6f 72 65 61 63 68 20 69 69 64 20 24 6d 79 69  foreach iid $myi
24c0: 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65 74 20  tems {..    set 
24d0: 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79 74 79 70  key [list $mytyp
24e0: 65 20 24 69 69 64 5d 0a 09 20 20 20 20 75 6e 73  e $iid]..    uns
24f0: 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24 6b 65  et myitemmap($ke
2500: 79 29 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74  y)..    log writ
2510: 65 20 38 20 63 73 65 74 73 20 7b 4d 41 50 2d 20  e 8 csets {MAP- 
2520: 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73 65 6c  item <$key> $sel
2530: 66 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d 7d  f = [$self str]}
2540: 0a 09 7d 0a 0a 09 23 20 43 72 65 61 74 65 20 63  ..}...# Create c
2550: 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20 74 68  hangesets for th
2560: 65 20 66 72 61 67 6d 65 6e 74 73 2c 20 72 65 75  e fragments, reu
2570: 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74  sing the current
2580: 20 6f 6e 65 0a 09 23 20 66 6f 72 20 74 68 65 20   one..# for the 
2590: 66 69 72 73 74 20 66 72 61 67 6d 65 6e 74 2e 20  first fragment. 
25a0: 57 65 20 73 6f 72 74 20 74 68 65 6d 20 69 6e 20  We sort them in 
25b0: 6f 72 64 65 72 20 74 6f 20 61 6c 6c 6f 77 0a 09  order to allow..
25c0: 23 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 67  # checking for g
25d0: 61 70 73 20 61 6e 64 20 6e 69 63 65 20 6d 65 73  aps and nice mes
25e0: 73 61 67 65 73 2e 0a 0a 09 73 65 74 20 66 72 61  sages....set fra
25f0: 67 6d 65 6e 74 73 20 5b 6c 73 6f 72 74 20 2d 69  gments [lsort -i
2600: 6e 64 65 78 20 30 20 2d 69 6e 74 65 67 65 72 20  ndex 0 -integer 
2610: 24 66 72 61 67 6d 65 6e 74 73 5d 0a 0a 09 23 70  $fragments]...#p
2620: 75 74 73 20 5c 74 2e 5b 6a 6f 69 6e 20 5b 50 52  uts \t.[join [PR
2630: 73 20 24 66 72 61 67 6d 65 6e 74 73 5d 20 2e 5c  s $fragments] .\
2640: 6e 5c 74 2e 5d 2e 0a 0a 09 42 6f 72 64 65 72 20  n\t.]....Border 
2650: 5b 6c 69 6e 64 65 78 20 24 66 72 61 67 6d 65 6e  [lindex $fragmen
2660: 74 73 20 30 5d 20 66 69 72 73 74 73 20 66 69 72  ts 0] firsts fir
2670: 73 74 65 0a 0a 09 69 6e 74 65 67 72 69 74 79 20  ste...integrity 
2680: 61 73 73 65 72 74 20 7b 24 66 69 72 73 74 73 20  assert {$firsts 
2690: 3d 3d 20 30 7d 20 7b 42 61 64 20 66 72 61 67 6d  == 0} {Bad fragm
26a0: 65 6e 74 20 73 74 61 72 74 20 40 20 24 66 69 72  ent start @ $fir
26b0: 73 74 73 2c 20 67 61 70 2c 20 6f 72 20 62 65 66  sts, gap, or bef
26c0: 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66  ore beginning of
26d0: 20 74 68 65 20 72 61 6e 67 65 7d 0a 0a 09 73 65   the range}...se
26e0: 74 20 6c 61 73 74 65 20 24 66 69 72 73 74 65 0a  t laste $firste.
26f0: 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65 6e  .foreach fragmen
2700: 74 20 5b 6c 72 61 6e 67 65 20 24 66 72 61 67 6d  t [lrange $fragm
2710: 65 6e 74 73 20 31 20 65 6e 64 5d 20 7b 0a 09 20  ents 1 end] {.. 
2720: 20 20 20 42 6f 72 64 65 72 20 24 66 72 61 67 6d     Border $fragm
2730: 65 6e 74 20 73 20 65 0a 09 20 20 20 20 69 6e 74  ent s e..    int
2740: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24  egrity assert {$
2750: 6c 61 73 74 65 20 3d 3d 20 28 24 73 20 2d 20 31  laste == ($s - 1
2760: 29 7d 20 7b 42 61 64 20 66 72 61 67 6d 65 6e 74  )} {Bad fragment
2770: 20 62 6f 72 64 65 72 20 3c 24 6c 61 73 74 65 20   border <$laste 
2780: 7c 20 24 73 3e 2c 20 67 61 70 20 6f 72 20 6f 76  | $s>, gap or ov
2790: 65 72 6c 61 70 7d 0a 0a 09 20 20 20 20 73 65 74  erlap}...    set
27a0: 20 6e 65 77 20 5b 24 74 79 70 65 20 25 41 55 54   new [$type %AUT
27b0: 4f 25 20 24 6d 79 70 72 6f 6a 65 63 74 20 24 6d  O% $myproject $m
27c0: 79 74 79 70 65 20 24 6d 79 73 72 63 69 64 20 5b  ytype $mysrcid [
27d0: 6c 72 61 6e 67 65 20 24 6d 79 69 74 65 6d 73 20  lrange $myitems 
27e0: 24 73 20 24 65 5d 5d 0a 0a 20 20 20 20 20 20 20  $s $e]]..       
27f0: 20 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 34       log write 4
2800: 20 63 73 65 74 73 20 22 42 72 65 61 6b 69 6e 67   csets "Breaking
2810: 20 5b 24 73 65 6c 66 20 73 74 72 20 5d 20 40 20   [$self str ] @ 
2820: 24 6c 61 73 74 65 2c 20 6e 65 77 20 5b 24 6e 65  $laste, new [$ne
2830: 77 20 73 74 72 5d 2c 20 63 75 74 74 69 6e 67 20  w str], cutting 
2840: 24 62 72 65 61 6b 73 28 24 6c 61 73 74 65 29 22  $breaks($laste)"
2850: 0a 0a 09 20 20 20 20 73 65 74 20 6c 61 73 74 65  ...    set laste
2860: 20 24 65 0a 09 7d 0a 0a 09 69 6e 74 65 67 72 69   $e..}...integri
2870: 74 79 20 61 73 73 65 72 74 20 7b 0a 09 20 20 20  ty assert {..   
2880: 20 24 6c 61 73 74 65 20 3d 3d 20 28 5b 6c 6c 65   $laste == ([lle
2890: 6e 67 74 68 20 24 6d 79 69 74 65 6d 73 5d 2d 31  ngth $myitems]-1
28a0: 29 0a 09 7d 20 7b 42 61 64 20 66 72 61 67 6d 65  )..} {Bad fragme
28b0: 6e 74 20 65 6e 64 20 40 20 24 6c 61 73 74 65 2c  nt end @ $laste,
28c0: 20 67 61 70 2c 20 6f 72 20 62 65 79 6f 6e 64 20   gap, or beyond 
28d0: 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65  end of the range
28e0: 7d 0a 0a 09 23 20 50 75 74 20 74 68 65 20 66 69  }...# Put the fi
28f0: 72 73 74 20 66 72 61 67 6d 65 6e 74 20 69 6e 74  rst fragment int
2900: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68  o the current ch
2910: 61 6e 67 65 73 65 74 2c 20 61 6e 64 0a 09 23 20  angeset, and..# 
2920: 75 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65  update the in-me
2930: 6d 6f 72 79 20 69 6e 64 65 78 2e 20 57 65 20 63  mory index. We c
2940: 61 6e 20 73 69 6d 70 6c 79 20 28 72 65 29 61 64  an simply (re)ad
2950: 64 20 74 68 65 20 69 74 65 6d 73 0a 09 23 20 62  d the items..# b
2960: 65 63 61 75 73 65 20 77 65 20 63 6c 65 61 72 65  ecause we cleare
2970: 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79  d the previously
2980: 20 65 78 69 73 74 69 6e 67 20 69 6e 66 6f 72 6d   existing inform
2990: 61 74 69 6f 6e 2c 20 73 65 65 0a 09 23 20 28 2a  ation, see..# (*
29a0: 29 20 61 62 6f 76 65 2e 20 50 65 72 73 69 73 74  ) above. Persist
29b0: 65 6e 63 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61  ence does not ma
29c0: 74 74 65 72 20 68 65 72 65 2c 20 6e 6f 6e 65 20  tter here, none 
29d0: 6f 66 20 74 68 65 0a 09 23 20 63 68 61 6e 67 65  of the..# change
29e0: 73 65 74 73 20 68 61 73 20 62 65 65 6e 20 73 61  sets has been sa
29f0: 76 65 64 20 74 6f 20 74 68 65 20 70 65 72 73 69  ved to the persi
2a00: 73 74 65 6e 74 20 73 74 61 74 65 20 79 65 74 2e  stent state yet.
2a10: 0a 0a 09 73 65 74 20 6d 79 69 74 65 6d 73 20 20  ...set myitems  
2a20: 5b 6c 72 61 6e 67 65 20 24 6d 79 69 74 65 6d 73  [lrange $myitems
2a30: 20 20 30 20 24 66 69 72 73 74 65 5d 0a 09 73 65    0 $firste]..se
2a40: 74 20 6d 79 74 69 74 65 6d 73 20 5b 6c 72 61 6e  t mytitems [lran
2a50: 67 65 20 24 6d 79 74 69 74 65 6d 73 20 30 20 24  ge $mytitems 0 $
2a60: 66 69 72 73 74 65 5d 0a 09 66 6f 72 65 61 63 68  firste]..foreach
2a70: 20 69 69 64 20 24 6d 79 69 74 65 6d 73 20 7b 0a   iid $myitems {.
2a80: 09 20 20 20 20 73 65 74 20 6b 65 79 20 5b 6c 69  .    set key [li
2a90: 73 74 20 24 6d 79 74 79 70 65 20 24 69 69 64 5d  st $mytype $iid]
2aa0: 0a 09 20 20 20 20 73 65 74 20 6d 79 69 74 65 6d  ..    set myitem
2ab0: 6d 61 70 28 24 6b 65 79 29 20 24 73 65 6c 66 0a  map($key) $self.
2ac0: 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 38  .    log write 8
2ad0: 20 63 73 65 74 73 20 7b 4d 41 50 2b 20 69 74 65   csets {MAP+ ite
2ae0: 6d 20 3c 24 6b 65 79 3e 20 24 73 65 6c 66 20 3d  m <$key> $self =
2af0: 20 5b 24 73 65 6c 66 20 73 74 72 5d 7d 0a 09 7d   [$self str]}..}
2b00: 0a 0a 09 72 65 74 75 72 6e 20 31 0a 20 20 20 20  ...return 1.    
2b10: 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 70 65  }..    method pe
2b20: 72 73 69 73 74 20 7b 7d 20 7b 0a 09 73 65 74 20  rsist {} {..set 
2b30: 74 69 64 20 24 6d 79 63 73 74 79 70 65 28 24 6d  tid $mycstype($m
2b40: 79 74 79 70 65 29 0a 09 73 65 74 20 70 69 64 20  ytype)..set pid 
2b50: 5b 24 6d 79 70 72 6f 6a 65 63 74 20 69 64 5d 0a  [$myproject id].
2b60: 09 73 65 74 20 70 6f 73 20 30 0a 0a 09 73 74 61  .set pos 0...sta
2b70: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b  te transaction {
2b80: 0a 09 20 20 20 20 73 74 61 74 65 20 72 75 6e 20  ..    state run 
2b90: 7b 0a 09 09 49 4e 53 45 52 54 20 49 4e 54 4f 20  {...INSERT INTO 
2ba0: 63 68 61 6e 67 65 73 65 74 20 28 63 69 64 2c 20  changeset (cid, 
2bb0: 20 20 70 69 64 2c 20 20 74 79 70 65 2c 20 73 72    pid,  type, sr
2bc0: 63 29 0a 09 09 56 41 4c 55 45 53 20 20 20 20 20  c)...VALUES     
2bd0: 20 20 20 20 20 20 20 20 20 20 20 28 24 6d 79 69             ($myi
2be0: 64 2c 20 24 70 69 64 2c 20 24 74 69 64 2c 20 24  d, $pid, $tid, $
2bf0: 6d 79 73 72 63 69 64 29 3b 0a 09 20 20 20 20 7d  mysrcid);..    }
2c00: 0a 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 69  ...    foreach i
2c10: 69 64 20 24 6d 79 69 74 65 6d 73 20 7b 0a 09 09  id $myitems {...
2c20: 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 20 20  state run {...  
2c30: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 73    INSERT INTO cs
2c40: 69 74 65 6d 20 28 63 69 64 2c 20 20 20 70 6f 73  item (cid,   pos
2c50: 2c 20 20 69 69 64 29 0a 09 09 20 20 20 20 56 41  ,  iid)...    VA
2c60: 4c 55 45 53 20 20 20 20 20 20 20 20 20 20 20 20  LUES            
2c70: 20 28 24 6d 79 69 64 2c 20 24 70 6f 73 2c 20 24   ($myid, $pos, $
2c80: 69 69 64 29 3b 0a 09 09 7d 0a 09 09 69 6e 63 72  iid);...}...incr
2c90: 20 70 6f 73 0a 09 20 20 20 20 7d 0a 09 7d 0a 09   pos..    }..}..
2ca0: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20  return.    }..  
2cb0: 20 20 6d 65 74 68 6f 64 20 74 69 6d 65 72 61 6e    method timeran
2cc0: 67 65 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 5b  ge {} { return [
2cd0: 24 6d 79 74 79 70 65 6f 62 6a 20 74 69 6d 65 72  $mytypeobj timer
2ce0: 61 6e 67 65 20 24 6d 79 69 74 65 6d 73 5d 20 7d  ange $myitems] }
2cf0: 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 64 72 6f  ..    method dro
2d00: 70 20 7b 7d 20 7b 0a 09 6c 6f 67 20 77 72 69 74  p {} {..log writ
2d10: 65 20 38 20 63 73 65 74 73 20 7b 44 72 6f 70 70  e 8 csets {Dropp
2d20: 69 6e 67 20 24 73 65 6c 66 20 3d 20 5b 24 73 65  ing $self = [$se
2d30: 6c 66 20 73 74 72 5d 7d 0a 0a 09 73 74 61 74 65  lf str]}...state
2d40: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 09   transaction {..
2d50: 20 20 20 20 73 74 61 74 65 20 72 75 6e 20 7b 0a      state run {.
2d60: 09 09 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 68  ..DELETE FROM ch
2d70: 61 6e 67 65 73 65 74 20 57 48 45 52 45 20 63 69  angeset WHERE ci
2d80: 64 20 3d 20 24 6d 79 69 64 3b 0a 09 09 44 45 4c  d = $myid;...DEL
2d90: 45 54 45 20 46 52 4f 4d 20 63 73 69 74 65 6d 20  ETE FROM csitem 
2da0: 20 20 20 57 48 45 52 45 20 63 69 64 20 3d 20 24     WHERE cid = $
2db0: 6d 79 69 64 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a  myid;..    }..}.
2dc0: 09 66 6f 72 65 61 63 68 20 69 69 64 20 24 6d 79  .foreach iid $my
2dd0: 69 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65 74  items {..    set
2de0: 20 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79 74 79   key [list $myty
2df0: 70 65 20 24 69 69 64 5d 0a 09 20 20 20 20 75 6e  pe $iid]..    un
2e00: 73 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24 6b  set myitemmap($k
2e10: 65 79 29 0a 09 20 20 20 20 6c 6f 67 20 77 72 69  ey)..    log wri
2e20: 74 65 20 38 20 63 73 65 74 73 20 7b 4d 41 50 2d  te 8 csets {MAP-
2e30: 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73 65   item <$key> $se
2e40: 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d  lf = [$self str]
2e50: 7d 0a 09 7d 0a 09 73 65 74 20 70 6f 73 20 20 20  }..}..set pos   
2e60: 20 20 20 20 20 20 20 5b 6c 73 65 61 72 63 68 20         [lsearch 
2e70: 2d 65 78 61 63 74 20 24 6d 79 63 68 61 6e 67 65  -exact $mychange
2e80: 73 65 74 73 20 24 73 65 6c 66 5d 0a 09 73 65 74  sets $self]..set
2e90: 20 6d 79 63 68 61 6e 67 65 73 65 74 73 20 5b 6c   mychangesets [l
2ea0: 72 65 70 6c 61 63 65 20 24 6d 79 63 68 61 6e 67  replace $mychang
2eb0: 65 73 65 74 73 20 24 70 6f 73 20 24 70 6f 73 5d  esets $pos $pos]
2ec0: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
2ed0: 20 20 20 20 6d 65 74 68 6f 64 20 6c 6f 6f 70 63      method loopc
2ee0: 68 65 63 6b 20 7b 7d 20 7b 0a 09 6c 6f 67 20 77  heck {} {..log w
2ef0: 72 69 74 65 20 37 20 63 73 65 74 73 20 7b 43 68  rite 7 csets {Ch
2f00: 65 63 6b 69 6e 67 20 5b 24 73 65 6c 66 20 73 74  ecking [$self st
2f10: 72 5d 20 66 6f 72 20 6c 6f 6f 70 73 20 2f 5b 6c  r] for loops /[l
2f20: 6c 65 6e 67 74 68 20 24 6d 79 69 74 65 6d 73 5d  length $myitems]
2f30: 7d 0a 0a 09 69 66 20 7b 21 5b 73 74 72 75 63 74  }...if {![struct
2f40: 3a 3a 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 5b  ::set contains [
2f50: 24 73 65 6c 66 20 73 75 63 63 65 73 73 6f 72 73  $self successors
2f60: 5d 20 24 73 65 6c 66 5d 7d 20 7b 0a 09 20 20 20  ] $self]} {..   
2f70: 20 72 65 74 75 72 6e 20 30 0a 09 7d 0a 09 69 66   return 0..}..if
2f80: 20 7b 5b 6c 6f 67 20 76 65 72 62 6f 73 69 74 79   {[log verbosity
2f90: 3f 5d 20 3c 20 38 7d 20 7b 20 72 65 74 75 72 6e  ?] < 8} { return
2fa0: 20 31 20 7d 0a 0a 09 23 20 50 72 69 6e 74 20 74   1 }...# Print t
2fb0: 68 65 20 64 65 74 61 69 6c 65 64 20 73 75 63 63  he detailed succ
2fc0: 65 73 73 6f 72 20 73 74 72 75 63 74 75 72 65 20  essor structure 
2fd0: 6f 66 20 74 68 65 20 73 65 6c 66 2d 0a 09 23 20  of the self-..# 
2fe0: 72 65 66 65 72 65 6e 74 69 61 6c 20 63 68 61 6e  referential chan
2ff0: 67 65 73 65 74 2c 20 69 66 20 74 68 65 20 76 65  geset, if the ve
3000: 72 62 6f 73 69 74 79 20 6f 66 20 74 68 65 20 6c  rbosity of the l
3010: 6f 67 20 69 73 20 64 69 61 6c 65 64 0a 09 23 20  og is dialed..# 
3020: 68 69 67 68 20 65 6e 6f 75 67 68 2e 0a 0a 09 6c  high enough....l
3030: 6f 67 20 77 72 69 74 65 20 38 20 63 73 65 74 73  og write 8 csets
3040: 20 5b 73 65 74 20 68 64 72 20 7b 53 65 6c 66 2d   [set hdr {Self-
3050: 72 65 66 65 72 65 6e 74 69 61 6c 20 63 68 61 6e  referential chan
3060: 67 65 73 65 74 20 5b 24 73 65 6c 66 20 73 74 72  geset [$self str
3070: 5d 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ] ______________
3080: 5f 5f 5f 5f 7d 5d 0a 09 61 72 72 61 79 20 73 65  ____}]..array se
3090: 74 20 6e 6d 61 70 20 5b 24 73 65 6c 66 20 6e 65  t nmap [$self ne
30a0: 78 74 6d 61 70 5d 0a 09 66 6f 72 65 61 63 68 20  xtmap]..foreach 
30b0: 69 74 65 6d 20 5b 6c 73 6f 72 74 20 2d 64 69 63  item [lsort -dic
30c0: 74 20 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 6e  t [array names n
30d0: 6d 61 70 5d 5d 20 7b 0a 09 20 20 20 20 66 6f 72  map]] {..    for
30e0: 65 61 63 68 20 73 75 63 63 69 74 65 6d 20 24 6e  each succitem $n
30f0: 6d 61 70 28 24 69 74 65 6d 29 20 7b 0a 09 09 73  map($item) {...s
3100: 65 74 20 73 75 63 63 63 73 20 24 6d 79 69 74 65  et succcs $myite
3110: 6d 6d 61 70 28 24 73 75 63 63 69 74 65 6d 29 0a  mmap($succitem).
3120: 09 09 73 65 74 20 68 69 6e 74 20 5b 65 78 70 72  ..set hint [expr
3130: 20 7b 28 24 73 75 63 63 63 73 20 65 71 20 24 73   {($succcs eq $s
3140: 65 6c 66 29 0a 09 09 09 09 3f 20 22 4c 4f 4f 50  elf).....? "LOOP
3150: 22 0a 09 09 09 09 3a 20 22 20 20 20 20 22 7d 5d  ".....: "    "}]
3160: 0a 09 09 73 65 74 20 69 20 20 20 22 3c 24 69 74  ...set i   "<$it
3170: 65 6d 20 5b 24 74 79 70 65 20 69 74 65 6d 73 74  em [$type itemst
3180: 72 20 24 69 74 65 6d 5d 3e 22 0a 09 09 73 65 74  r $item]>"...set
3190: 20 73 20 20 20 22 3c 24 73 75 63 63 69 74 65 6d   s   "<$succitem
31a0: 20 5b 24 74 79 70 65 20 69 74 65 6d 73 74 72 20   [$type itemstr 
31b0: 24 73 75 63 63 69 74 65 6d 5d 3e 22 0a 09 09 73  $succitem]>"...s
31c0: 65 74 20 73 63 73 20 5b 24 73 75 63 63 63 73 20  et scs [$succcs 
31d0: 73 74 72 5d 0a 09 09 6c 6f 67 20 77 72 69 74 65  str]...log write
31e0: 20 38 20 63 73 65 74 73 20 7b 24 68 69 6e 74 20   8 csets {$hint 
31f0: 2a 20 24 69 20 2d 2d 3e 20 24 73 20 2d 2d 3e 20  * $i --> $s --> 
3200: 63 73 20 24 73 63 73 7d 0a 09 20 20 20 20 7d 0a  cs $scs}..    }.
3210: 09 7d 0a 09 6c 6f 67 20 77 72 69 74 65 20 38 20  .}..log write 8 
3220: 63 73 65 74 73 20 5b 72 65 67 73 75 62 20 2d 61  csets [regsub -a
3230: 6c 6c 20 7b 5b 5e 20 09 5d 7d 20 24 68 64 72 20  ll {[^ .]} $hdr 
3240: 7b 5f 7d 5d 0a 09 72 65 74 75 72 6e 20 31 0a 20  {_}]..return 1. 
3250: 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65     }..    typeme
3260: 74 68 6f 64 20 73 70 6c 69 74 20 7b 63 73 65 74  thod split {cset
3270: 20 61 72 67 73 7d 20 7b 0a 09 23 20 41 73 20 70   args} {..# As p
3280: 61 72 74 20 6f 66 20 74 68 65 20 63 72 65 61 74  art of the creat
3290: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ion of the new c
32a0: 68 61 6e 67 65 73 65 74 73 20 73 70 65 63 69 66  hangesets specif
32b0: 69 65 64 20 69 6e 0a 09 23 20 41 52 47 53 20 61  ied in..# ARGS a
32c0: 73 20 73 65 74 73 20 6f 66 20 69 74 65 6d 73 2c  s sets of items,
32d0: 20 61 6c 6c 20 73 75 62 73 65 74 73 20 6f 66 20   all subsets of 
32e0: 43 53 45 54 27 73 20 69 74 65 6d 20 73 65 74 2c  CSET's item set,
32f0: 20 43 53 45 54 0a 09 23 20 77 69 6c 6c 20 62 65   CSET..# will be
3300: 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 61 6c   dropped from al
3310: 6c 20 64 61 74 61 62 61 73 65 73 2c 20 69 6e 20  l databases, in 
3320: 61 6e 64 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  and out of memor
3330: 79 2c 0a 09 23 20 61 6e 64 20 74 68 65 6e 20 64  y,..# and then d
3340: 65 73 74 72 6f 79 65 64 2e 0a 09 23 0a 09 23 20  estroyed...#..# 
3350: 4e 6f 74 65 3a 20 54 68 65 20 69 74 65 6d 20 6c  Note: The item l
3360: 69 73 74 73 20 66 6f 75 6e 64 20 69 6e 20 61 72  ists found in ar
3370: 67 73 20 61 72 65 20 74 61 67 67 65 64 20 69 74  gs are tagged it
3380: 65 6d 73 2e 20 54 68 65 79 0a 09 23 20 68 61 76  ems. They..# hav
3390: 65 20 74 6f 20 68 61 76 65 20 74 68 65 20 73 61  e to have the sa
33a0: 6d 65 20 74 79 70 65 20 61 73 20 74 68 65 20 63  me type as the c
33b0: 68 61 6e 67 65 73 65 74 2c 20 62 65 69 6e 67 20  hangeset, being 
33c0: 73 75 62 73 65 74 73 0a 09 23 20 6f 66 20 69 74  subsets..# of it
33d0: 73 20 69 74 65 6d 73 2e 20 54 68 69 73 20 69 73  s items. This is
33e0: 20 63 68 65 63 6b 65 64 20 69 6e 20 55 6e 74 61   checked in Unta
33f0: 67 31 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20  g1....log write 
3400: 38 20 63 73 65 74 73 20 7b 4f 4c 44 3a 20 5b 6c  8 csets {OLD: [l
3410: 73 6f 72 74 20 5b 24 63 73 65 74 20 69 74 65 6d  sort [$cset item
3420: 73 5d 5d 7d 0a 09 56 61 6c 69 64 61 74 65 46 72  s]]}..ValidateFr
3430: 61 67 6d 65 6e 74 73 20 24 63 73 65 74 20 24 61  agments $cset $a
3440: 72 67 73 0a 0a 09 23 20 41 6c 6c 20 63 68 65 63  rgs...# All chec
3450: 6b 73 20 70 61 73 73 2c 20 61 63 74 75 61 6c 6c  ks pass, actuall
3460: 79 20 70 65 72 66 6f 72 6d 20 74 68 65 20 73 70  y perform the sp
3470: 6c 69 74 2e 0a 0a 09 73 74 72 75 63 74 3a 3a 6c  lit....struct::l
3480: 69 73 74 20 61 73 73 69 67 6e 20 5b 24 63 73 65  ist assign [$cse
3490: 74 20 64 61 74 61 5d 20 70 72 6f 6a 65 63 74 20  t data] project 
34a0: 63 73 74 79 70 65 20 63 73 73 72 63 0a 0a 09 24  cstype cssrc...$
34b0: 63 73 65 74 20 64 72 6f 70 0a 09 24 63 73 65 74  cset drop..$cset
34c0: 20 64 65 73 74 72 6f 79 0a 0a 09 73 65 74 20 6e   destroy...set n
34d0: 65 77 63 73 65 74 73 20 7b 7d 0a 09 66 6f 72 65  ewcsets {}..fore
34e0: 61 63 68 20 66 72 61 67 6d 65 6e 74 69 74 65 6d  ach fragmentitem
34f0: 73 20 24 61 72 67 73 20 7b 0a 09 20 20 20 20 6c  s $args {..    l
3500: 6f 67 20 77 72 69 74 65 20 38 20 63 73 65 74 73  og write 8 csets
3510: 20 7b 4d 41 4b 45 3a 20 5b 6c 73 6f 72 74 20 24   {MAKE: [lsort $
3520: 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 5d 7d 0a  fragmentitems]}.
3530: 0a 09 20 20 20 20 73 65 74 20 66 72 61 67 6d 65  ..    set fragme
3540: 6e 74 20 5b 24 74 79 70 65 20 25 41 55 54 4f 25  nt [$type %AUTO%
3550: 20 24 70 72 6f 6a 65 63 74 20 24 63 73 74 79 70   $project $cstyp
3560: 65 20 24 63 73 73 72 63 20 5c 0a 09 09 09 20 20  e $cssrc \....  
3570: 20 20 20 20 5b 55 6e 74 61 67 20 24 66 72 61 67      [Untag $frag
3580: 6d 65 6e 74 69 74 65 6d 73 20 24 63 73 74 79 70  mentitems $cstyp
3590: 65 5d 5d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64  e]]..    lappend
35a0: 20 6e 65 77 63 73 65 74 73 20 24 66 72 61 67 6d   newcsets $fragm
35b0: 65 6e 74 0a 09 20 20 20 20 24 66 72 61 67 6d 65  ent..    $fragme
35c0: 6e 74 20 70 65 72 73 69 73 74 0a 0a 09 20 20 20  nt persist...   
35d0: 20 69 66 20 7b 5b 24 66 72 61 67 6d 65 6e 74 20   if {[$fragment 
35e0: 6c 6f 6f 70 63 68 65 63 6b 5d 7d 20 7b 0a 09 09  loopcheck]} {...
35f0: 74 72 6f 75 62 6c 65 20 66 61 74 61 6c 20 22 5b  trouble fatal "[
3600: 24 66 72 61 67 6d 65 6e 74 20 73 74 72 5d 20 64  $fragment str] d
3610: 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66  epends on itself
3620: 22 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 74 72  "..    }..}...tr
3630: 6f 75 62 6c 65 20 61 62 6f 72 74 3f 0a 09 72 65  ouble abort?..re
3640: 74 75 72 6e 20 24 6e 65 77 63 73 65 74 73 0a 20  turn $newcsets. 
3650: 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65     }..    typeme
3660: 74 68 6f 64 20 69 74 65 6d 73 74 72 20 7b 69 74  thod itemstr {it
3670: 65 6d 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c  em} {..struct::l
3680: 69 73 74 20 61 73 73 69 67 6e 20 24 69 74 65 6d  ist assign $item
3690: 20 69 74 79 70 65 20 69 69 64 0a 09 72 65 74 75   itype iid..retu
36a0: 72 6e 20 5b 24 69 74 79 70 65 20 73 74 72 20 24  rn [$itype str $
36b0: 69 69 64 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  iid].    }..    
36c0: 74 79 70 65 6d 65 74 68 6f 64 20 73 74 72 6c 69  typemethod strli
36d0: 73 74 20 7b 63 68 61 6e 67 65 73 65 74 73 7d 20  st {changesets} 
36e0: 7b 0a 09 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 20  {..return [join 
36f0: 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61  [struct::list ma
3700: 70 20 24 63 68 61 6e 67 65 73 65 74 73 20 5b 6d  p $changesets [m
3710: 79 70 72 6f 63 20 49 44 5d 5d 5d 0a 20 20 20 20  yproc ID]]].    
3720: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 49 44 20 7b  }..    proc ID {
3730: 63 73 65 74 7d 20 7b 20 24 63 73 65 74 20 73 74  cset} { $cset st
3740: 72 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 55 6e  r }..    proc Un
3750: 74 61 67 20 7b 74 61 67 67 65 64 69 74 65 6d 73  tag {taggeditems
3760: 20 63 73 74 79 70 65 7d 20 7b 0a 09 72 65 74 75   cstype} {..retu
3770: 72 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74  rn [struct::list
3780: 20 6d 61 70 20 24 74 61 67 67 65 64 69 74 65 6d   map $taggeditem
3790: 73 20 5b 6d 79 70 72 6f 63 20 55 6e 74 61 67 31  s [myproc Untag1
37a0: 20 24 63 73 74 79 70 65 5d 5d 0a 20 20 20 20 7d   $cstype]].    }
37b0: 0a 0a 20 20 20 20 70 72 6f 63 20 55 6e 74 61 67  ..    proc Untag
37c0: 31 20 7b 63 73 74 79 70 65 20 74 68 65 69 74 65  1 {cstype theite
37d0: 6d 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c 69  m} {..struct::li
37e0: 73 74 20 61 73 73 69 67 6e 20 24 74 68 65 69 74  st assign $theit
37f0: 65 6d 20 74 20 69 0a 09 69 6e 74 65 67 72 69 74  em t i..integrit
3800: 79 20 61 73 73 65 72 74 20 7b 24 63 73 74 79 70  y assert {$cstyp
3810: 65 20 65 71 20 24 74 7d 20 7b 49 74 65 6d 20 24  e eq $t} {Item $
3820: 69 27 73 20 74 79 70 65 20 69 73 20 27 24 74 27  i's type is '$t'
3830: 2c 20 65 78 70 65 63 74 65 64 20 27 24 63 73 74  , expected '$cst
3840: 79 70 65 27 7d 0a 09 72 65 74 75 72 6e 20 24 69  ype'}..return $i
3850: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63  .    }..    proc
3860: 20 56 61 6c 69 64 61 74 65 46 72 61 67 6d 65 6e   ValidateFragmen
3870: 74 73 20 7b 63 73 65 74 20 66 72 61 67 6d 65 6e  ts {cset fragmen
3880: 74 73 7d 20 7b 0a 09 23 20 43 68 65 63 6b 20 74  ts} {..# Check t
3890: 68 65 20 76 61 72 69 6f 75 73 20 69 6e 74 65 67  he various integ
38a0: 72 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  rity constraints
38b0: 20 66 6f 72 20 74 68 65 20 66 72 61 67 6d 65 6e   for the fragmen
38c0: 74 73 0a 09 23 20 73 70 65 63 69 66 79 69 6e 67  ts..# specifying
38d0: 20 68 6f 77 20 74 6f 20 73 70 6c 69 74 20 74 68   how to split th
38e0: 65 20 63 68 61 6e 67 65 73 65 74 3a 0a 09 23 0a  e changeset:..#.
38f0: 09 23 20 2a 20 57 65 20 6d 75 73 74 20 68 61 76  .# * We must hav
3900: 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 66 72  e two or more fr
3910: 61 67 6d 65 6e 74 73 2c 20 61 73 20 73 70 6c 69  agments, as spli
3920: 74 74 69 6e 67 20 61 0a 09 23 20 20 20 63 68 61  tting a..#   cha
3930: 6e 67 65 73 65 74 20 69 6e 74 6f 20 6f 6e 65 20  ngeset into one 
3940: 6d 61 6b 65 73 20 6e 6f 20 73 65 6e 73 65 2e 0a  makes no sense..
3950: 09 23 20 2a 20 4e 6f 20 66 72 61 67 6d 65 6e 74  .# * No fragment
3960: 20 6d 61 79 20 62 65 20 65 6d 70 74 79 2e 0a 09   may be empty...
3970: 23 20 2a 20 41 6c 6c 20 66 72 61 67 6d 65 6e 74  # * All fragment
3980: 73 20 68 61 76 65 20 74 6f 20 62 65 20 74 72 75  s have to be tru
3990: 65 20 73 75 62 73 65 74 73 20 6f 66 20 74 68 65  e subsets of the
39a0: 20 69 74 65 6d 73 20 69 6e 20 74 68 65 0a 09 23   items in the..#
39b0: 20 20 20 63 68 61 6e 67 65 73 65 74 20 74 6f 20     changeset to 
39c0: 73 70 6c 69 74 2e 20 54 68 65 20 27 74 72 75 65  split. The 'true
39d0: 27 20 69 73 20 69 6d 70 6c 69 65 64 20 62 65 63  ' is implied bec
39e0: 61 75 73 65 20 6e 6f 6e 65 20 61 72 65 0a 09 23  ause none are..#
39f0: 20 20 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65     allowed to be
3a00: 20 65 6d 70 74 79 2c 20 73 6f 20 65 61 63 68 20   empty, so each 
3a10: 68 61 73 20 74 6f 20 62 65 20 73 6d 61 6c 6c 65  has to be smalle
3a20: 72 20 74 68 61 6e 20 74 68 65 0a 09 23 20 20 20  r than the..#   
3a30: 74 6f 74 61 6c 2e 0a 09 23 20 2a 20 54 68 65 20  total...# * The 
3a40: 75 6e 69 6f 6e 20 6f 66 20 74 68 65 20 66 72 61  union of the fra
3a50: 67 6d 65 6e 74 73 20 68 61 73 20 74 6f 20 62 65  gments has to be
3a60: 20 74 68 65 20 69 74 65 6d 20 73 65 74 20 6f 66   the item set of
3a70: 20 74 68 65 0a 09 23 20 20 20 63 68 61 6e 67 65   the..#   change
3a80: 73 65 74 2e 0a 09 23 20 2a 20 54 68 65 20 66 72  set...# * The fr
3a90: 61 67 6d 65 6e 74 20 6d 75 73 74 20 6e 6f 74 20  agment must not 
3aa0: 6f 76 65 72 6c 61 70 2c 20 69 2e 65 2e 20 74 68  overlap, i.e. th
3ab0: 65 69 72 20 70 61 69 72 77 69 73 65 0a 09 23 20  eir pairwise..# 
3ac0: 20 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 73 20    intersections 
3ad0: 68 61 76 65 20 74 6f 20 62 65 20 65 6d 70 74 79  have to be empty
3ae0: 2e 0a 0a 09 73 65 74 20 63 6f 76 65 72 20 7b 7d  ....set cover {}
3af0: 0a 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65  ..foreach fragme
3b00: 6e 74 69 74 65 6d 73 20 24 66 72 61 67 6d 65 6e  ntitems $fragmen
3b10: 74 73 20 7b 0a 09 20 20 20 20 6c 6f 67 20 77 72  ts {..    log wr
3b20: 69 74 65 20 38 20 63 73 65 74 73 20 7b 4e 45 57  ite 8 csets {NEW
3b30: 3a 20 5b 6c 73 6f 72 74 20 24 66 72 61 67 6d 65  : [lsort $fragme
3b40: 6e 74 69 74 65 6d 73 5d 7d 0a 0a 09 20 20 20 20  ntitems]}...    
3b50: 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74  integrity assert
3b60: 20 7b 0a 09 09 21 5b 73 74 72 75 63 74 3a 3a 73   {...![struct::s
3b70: 65 74 20 65 6d 70 74 79 20 24 66 72 61 67 6d 65  et empty $fragme
3b80: 6e 74 69 74 65 6d 73 5d 0a 09 20 20 20 20 7d 20  ntitems]..    } 
3b90: 7b 63 68 61 6e 67 65 73 65 74 20 66 72 61 67 6d  {changeset fragm
3ba0: 65 6e 74 20 69 73 20 65 6d 70 74 79 7d 0a 0a 09  ent is empty}...
3bb0: 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73      integrity as
3bc0: 73 65 72 74 20 7b 0a 09 09 5b 73 74 72 75 63 74  sert {...[struct
3bd0: 3a 3a 73 65 74 20 73 75 62 73 65 74 6f 66 20 24  ::set subsetof $
3be0: 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 20 5b 24  fragmentitems [$
3bf0: 63 73 65 74 20 69 74 65 6d 73 5d 5d 0a 09 20 20  cset items]]..  
3c00: 20 20 7d 20 7b 63 68 61 6e 67 65 73 65 74 20 66    } {changeset f
3c10: 72 61 67 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61  ragment is not a
3c20: 20 73 75 62 73 65 74 7d 0a 09 20 20 20 20 73 74   subset}..    st
3c30: 72 75 63 74 3a 3a 73 65 74 20 61 64 64 20 63 6f  ruct::set add co
3c40: 76 65 72 20 24 66 72 61 67 6d 65 6e 74 69 74 65  ver $fragmentite
3c50: 6d 73 0a 09 7d 0a 0a 09 69 6e 74 65 67 72 69 74  ms..}...integrit
3c60: 79 20 61 73 73 65 72 74 20 7b 0a 09 20 20 20 20  y assert {..    
3c70: 5b 73 74 72 75 63 74 3a 3a 73 65 74 20 65 71 75  [struct::set equ
3c80: 61 6c 20 24 63 6f 76 65 72 20 5b 24 63 73 65 74  al $cover [$cset
3c90: 20 69 74 65 6d 73 5d 5d 0a 09 20 7d 20 7b 54 68   items]].. } {Th
3ca0: 65 20 66 72 61 67 6d 65 6e 74 73 20 64 6f 20 6e  e fragments do n
3cb0: 6f 74 20 63 6f 76 65 72 20 74 68 65 20 6f 72 69  ot cover the ori
3cc0: 67 69 6e 61 6c 20 63 68 61 6e 67 65 73 65 74 7d  ginal changeset}
3cd0: 0a 0a 09 73 65 74 20 69 20 31 0a 09 66 6f 72 65  ...set i 1..fore
3ce0: 61 63 68 20 66 69 61 20 24 66 72 61 67 6d 65 6e  ach fia $fragmen
3cf0: 74 73 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 63  ts {..    foreac
3d00: 68 20 66 69 62 20 5b 6c 72 61 6e 67 65 20 24 66  h fib [lrange $f
3d10: 72 61 67 6d 65 6e 74 73 20 24 69 20 65 6e 64 5d  ragments $i end]
3d20: 20 7b 0a 09 09 69 6e 74 65 67 72 69 74 79 20 61   {...integrity a
3d30: 73 73 65 72 74 20 7b 0a 09 09 20 20 20 20 5b 73  ssert {...    [s
3d40: 74 72 75 63 74 3a 3a 73 65 74 20 65 6d 70 74 79  truct::set empty
3d50: 20 5b 73 74 72 75 63 74 3a 3a 73 65 74 20 69 6e   [struct::set in
3d60: 74 65 72 73 65 63 74 20 24 66 69 61 20 24 66 69  tersect $fia $fi
3d70: 62 5d 5d 0a 09 09 7d 20 7b 54 68 65 20 66 72 61  b]]...} {The fra
3d80: 67 6d 65 6e 74 73 20 3c 24 66 69 61 3e 20 61 6e  gments <$fia> an
3d90: 64 20 3c 24 66 69 62 3e 20 6f 76 65 72 6c 61 70  d <$fib> overlap
3da0: 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 6e  }..    }..    in
3db0: 63 72 20 69 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  cr i..}...return
3dc0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20  .    }..    # # 
3dd0: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
3de0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
3df0: 23 23 23 0a 20 20 20 20 23 23 20 53 74 61 74 65  ###.    ## State
3e00: 0a 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d  ..    variable m
3e10: 79 69 64 20 20 20 20 20 20 20 20 7b 7d 20 3b 20  yid        {} ; 
3e20: 23 20 49 64 20 6f 66 20 74 68 65 20 63 73 65 74  # Id of the cset
3e30: 20 66 6f 72 20 74 68 65 20 70 65 72 73 69 73 74   for the persist
3e40: 65 6e 74 0a 09 09 09 20 20 20 20 20 20 23 20 73  ent....      # s
3e50: 74 61 74 65 2e 0a 20 20 20 20 76 61 72 69 61 62  tate..    variab
3e60: 6c 65 20 6d 79 70 72 6f 6a 65 63 74 20 20 20 7b  le myproject   {
3e70: 7d 20 3b 20 23 20 52 65 66 65 72 65 6e 63 65 20  } ; # Reference 
3e80: 6f 66 20 74 68 65 20 70 72 6f 6a 65 63 74 20 6f  of the project o
3e90: 62 6a 65 63 74 20 74 68 65 0a 09 09 09 20 20 20  bject the....   
3ea0: 20 20 20 23 20 63 68 61 6e 67 65 73 65 74 20 62     # changeset b
3eb0: 65 6c 6f 6e 67 73 20 74 6f 2e 0a 20 20 20 20 76  elongs to..    v
3ec0: 61 72 69 61 62 6c 65 20 6d 79 74 79 70 65 20 20  ariable mytype  
3ed0: 20 20 20 20 7b 7d 20 3b 20 23 20 57 68 61 74 20      {} ; # What 
3ee0: 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 69 73  the changeset is
3ef0: 20 62 61 73 65 64 20 6f 6e 0a 09 09 09 20 20 20   based on....   
3f00: 20 20 20 23 20 28 72 65 76 69 73 69 6f 6e 73 2c     # (revisions,
3f10: 20 74 61 67 73 2c 20 6f 72 20 62 72 61 6e 63 68   tags, or branch
3f20: 65 73 29 2e 0a 09 09 09 20 20 20 20 20 20 23 20  es).....      # 
3f30: 56 61 6c 75 65 73 3a 20 53 65 65 20 6d 79 63 73  Values: See mycs
3f40: 74 79 70 65 2e 20 4e 6f 74 65 20 74 68 61 74 20  type. Note that 
3f50: 77 65 0a 09 09 09 20 20 20 20 20 20 23 20 68 61  we....      # ha
3f60: 76 65 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6e  ve to keep the n
3f70: 61 6d 65 73 20 6f 66 20 74 68 65 20 68 65 6c 70  ames of the help
3f80: 65 72 0a 09 09 09 20 20 20 20 20 20 23 20 73 69  er....      # si
3f90: 6e 67 6c 65 74 6f 6e 73 20 69 6e 20 73 79 6e 63  ngletons in sync
3fa0: 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e   with the conten
3fb0: 74 73 0a 09 09 09 20 20 20 20 20 20 23 20 6f 66  ts....      # of
3fc0: 20 73 74 61 74 65 20 74 61 62 6c 65 20 27 63 73   state table 'cs
3fd0: 74 79 70 65 27 2c 20 61 6e 64 20 76 61 72 69 6f  type', and vario
3fe0: 75 73 0a 09 09 09 20 20 20 20 20 20 23 20 6f 74  us....      # ot
3ff0: 68 65 72 20 70 6c 61 63 65 73 20 75 73 69 6e 67  her places using
4000: 20 74 68 65 6d 20 68 61 72 64 77 69 72 65 64 2e   them hardwired.
4010: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79  .    variable my
4020: 74 79 70 65 6f 62 6a 20 20 20 7b 7d 20 3b 20 23  typeobj   {} ; #
4030: 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   Reference to th
4040: 65 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20  e container for 
4050: 74 68 65 0a 09 09 09 20 20 20 20 20 20 23 20 74  the....      # t
4060: 79 70 65 20 64 65 70 65 6e 64 65 6e 74 20 63 6f  ype dependent co
4070: 64 65 2e 20 44 65 72 69 76 65 64 20 66 72 6f 6d  de. Derived from
4080: 0a 09 09 09 20 20 20 20 20 20 23 20 6d 79 74 79  ....      # myty
4090: 70 65 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65  pe..    variable
40a0: 20 6d 79 73 72 63 69 64 20 20 20 20 20 7b 7d 20   mysrcid     {} 
40b0: 3b 20 23 20 49 64 20 6f 66 20 74 68 65 20 6d 65  ; # Id of the me
40c0: 74 61 64 61 74 61 20 6f 72 20 73 79 6d 62 6f 6c  tadata or symbol
40d0: 20 74 68 65 20 63 73 65 74 0a 09 09 09 20 20 20   the cset....   
40e0: 20 20 20 23 20 69 73 20 62 61 73 65 64 20 6f 6e     # is based on
40f0: 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d  ..    variable m
4100: 79 69 74 65 6d 73 20 20 20 20 20 7b 7d 20 3b 20  yitems     {} ; 
4110: 23 20 4c 69 73 74 20 6f 66 20 74 68 65 20 66 69  # List of the fi
4120: 6c 65 20 6c 65 76 65 6c 20 72 65 76 69 73 69 6f  le level revisio
4130: 6e 73 2c 0a 09 09 09 20 20 20 20 20 20 23 20 74  ns,....      # t
4140: 61 67 73 2c 20 6f 72 20 62 72 61 6e 63 68 65 73  ags, or branches
4150: 20 69 6e 20 74 68 65 20 63 73 65 74 2c 20 61 73   in the cset, as
4160: 0a 09 09 09 20 20 20 20 20 20 23 20 69 64 73 2e  ....      # ids.
4170: 20 4e 6f 74 20 74 61 67 67 65 64 2e 0a 20 20 20   Not tagged..   
4180: 20 76 61 72 69 61 62 6c 65 20 6d 79 74 69 74 65   variable mytite
4190: 6d 73 20 20 20 20 7b 7d 20 3b 20 23 20 41 73 20  ms    {} ; # As 
41a0: 6d 79 69 74 65 6d 73 2c 20 74 68 65 20 74 61 67  myitems, the tag
41b0: 67 65 64 20 66 6f 72 6d 2e 0a 20 20 20 20 76 61  ged form..    va
41c0: 72 69 61 62 6c 65 20 6d 79 70 72 65 6d 61 70 20  riable mypremap 
41d0: 20 20 20 7b 7d 20 3b 20 23 20 44 69 63 74 69 6f     {} ; # Dictio
41e0: 6e 61 72 79 20 6d 61 70 70 69 6e 67 20 66 72 6f  nary mapping fro
41f0: 6d 20 74 68 65 20 69 74 65 6d 73 20 28 74 61 67  m the items (tag
4200: 67 65 64 20 6e 6f 77 29 0a 09 09 09 20 20 20 20  ged now)....    
4210: 20 20 23 20 74 6f 20 74 68 65 69 72 20 70 72 65    # to their pre
4220: 64 65 63 65 73 73 6f 72 73 2c 20 61 6c 73 6f 20  decessors, also 
4230: 74 61 67 67 65 64 2e 20 41 0a 09 09 09 20 20 20  tagged. A....   
4240: 20 20 20 23 20 63 61 63 68 65 20 74 6f 20 61 76     # cache to av
4250: 6f 69 64 20 6c 6f 61 64 69 6e 67 20 74 68 69 73  oid loading this
4260: 20 66 72 6f 6d 20 74 68 65 0a 09 09 09 20 20 20   from the....   
4270: 20 20 20 23 20 73 74 61 74 65 20 6d 6f 72 65 20     # state more 
4280: 74 68 61 6e 20 6f 6e 63 65 2e 0a 20 20 20 20 76  than once..    v
4290: 61 72 69 61 62 6c 65 20 6d 79 6e 65 78 74 6d 61  ariable mynextma
42a0: 70 20 20 20 7b 7d 20 3b 20 23 20 44 69 63 74 69  p   {} ; # Dicti
42b0: 6f 6e 61 72 79 20 6d 61 70 70 69 6e 67 20 66 72  onary mapping fr
42c0: 6f 6d 20 74 68 65 20 69 74 65 6d 73 20 28 74 61  om the items (ta
42d0: 67 67 65 64 29 0a 09 09 09 20 20 20 20 20 20 23  gged)....      #
42e0: 20 74 6f 20 74 68 65 69 72 20 73 75 63 63 65 73   to their succes
42f0: 73 6f 72 73 20 28 61 6c 73 6f 20 74 61 67 67 65  sors (also tagge
4300: 64 29 2e 20 41 0a 09 09 09 20 20 20 20 20 20 23  d). A....      #
4310: 20 63 61 63 68 65 20 74 6f 20 61 76 6f 69 64 20   cache to avoid 
4320: 6c 6f 61 64 69 6e 67 20 74 68 69 73 20 66 72 6f  loading this fro
4330: 6d 20 74 68 65 0a 09 09 09 20 20 20 20 20 20 23  m the....      #
4340: 20 73 74 61 74 65 20 6d 6f 72 65 20 74 68 61 6e   state more than
4350: 20 6f 6e 63 65 2e 0a 20 20 20 20 76 61 72 69 61   once..    varia
4360: 62 6c 65 20 6d 79 70 6f 73 20 20 20 20 20 20 20  ble mypos       
4370: 7b 7d 20 3b 20 23 20 43 6f 6d 6d 69 74 20 70 6f  {} ; # Commit po
4380: 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 68  sition of the ch
4390: 61 6e 67 65 73 65 74 2c 20 69 66 0a 09 09 09 20  angeset, if.... 
43a0: 20 20 20 20 20 23 20 6b 6e 6f 77 6e 2e 0a 0a 20       # known... 
43b0: 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23     # # ## ### ##
43c0: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23  ### ######## ###
43d0: 23 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 23  ##########.    #
43e0: 23 20 49 6e 74 65 72 6e 61 6c 20 6d 65 74 68 6f  # Internal metho
43f0: 64 73 0a 0a 20 20 20 20 74 79 70 65 76 61 72 69  ds..    typevari
4400: 61 62 6c 65 20 6d 79 63 6f 75 6e 74 65 72 20 20  able mycounter  
4410: 20 20 20 20 20 20 30 20 3b 20 23 20 49 64 20 63        0 ; # Id c
4420: 6f 75 6e 74 65 72 20 66 6f 72 20 63 73 65 74 73  ounter for csets
4430: 2e 20 4c 61 73 74 20 69 64 0a 09 09 09 09 20 20  . Last id.....  
4440: 20 20 20 20 23 20 75 73 65 64 2e 0a 20 20 20 20      # used..    
4450: 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63  typevariable myc
4460: 73 74 79 70 65 20 2d 61 72 72 61 79 20 7b 7d 20  stype -array {} 
4470: 3b 20 23 20 4d 61 70 20 63 73 74 79 70 65 73 20  ; # Map cstypes 
4480: 28 6e 61 6d 65 73 29 20 74 6f 20 70 65 72 73 69  (names) to persi
4490: 73 74 65 6e 74 0a 09 09 09 09 20 20 20 20 20 20  stent.....      
44a0: 23 20 69 64 73 2e 20 4e 6f 74 65 20 74 68 61 74  # ids. Note that
44b0: 20 77 65 20 68 61 76 65 20 74 6f 20 6b 65 65 70   we have to keep
44c0: 0a 09 09 09 09 20 20 20 20 20 20 23 20 74 68 65  .....      # the
44d0: 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 74 61   names in the ta
44e0: 62 6c 65 20 27 63 73 74 79 70 65 27 0a 09 09 09  ble 'cstype'....
44f0: 09 20 20 20 20 20 20 23 20 69 6e 20 73 79 6e 63  .      # in sync
4500: 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20   with the names 
4510: 6f 66 20 74 68 65 0a 09 09 09 09 20 20 20 20 20  of the.....     
4520: 20 23 20 68 65 6c 70 65 72 20 73 69 6e 67 6c 65   # helper single
4530: 74 6f 6e 73 2e 0a 0a 20 20 20 20 74 79 70 65 6d  tons...    typem
4540: 65 74 68 6f 64 20 67 65 74 63 73 74 79 70 65 73  ethod getcstypes
4550: 20 7b 7d 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b   {} {..foreach {
4560: 74 69 64 20 6e 61 6d 65 7d 20 5b 73 74 61 74 65  tid name} [state
4570: 20 72 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c 45   run {..    SELE
4580: 43 54 20 74 69 64 2c 20 6e 61 6d 65 20 46 52 4f  CT tid, name FRO
4590: 4d 20 63 73 74 79 70 65 3b 0a 09 7d 5d 20 7b 20  M cstype;..}] { 
45a0: 73 65 74 20 6d 79 63 73 74 79 70 65 28 24 6e 61  set mycstype($na
45b0: 6d 65 29 20 24 74 69 64 20 7d 0a 09 72 65 74 75  me) $tid }..retu
45c0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79  rn.    }..    ty
45d0: 70 65 6d 65 74 68 6f 64 20 6c 6f 61 64 63 6f 75  pemethod loadcou
45e0: 6e 74 65 72 20 7b 7d 20 7b 0a 09 23 20 49 6e 69  nter {} {..# Ini
45f0: 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 75 6e  tialize the coun
4600: 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ter from the sta
4610: 74 65 0a 09 73 65 74 20 6d 79 63 6f 75 6e 74 65  te..set mycounte
4620: 72 20 5b 73 74 61 74 65 20 6f 6e 65 20 7b 20 53  r [state one { S
4630: 45 4c 45 43 54 20 4d 41 58 28 63 69 64 29 20 46  ELECT MAX(cid) F
4640: 52 4f 4d 20 63 68 61 6e 67 65 73 65 74 20 7d 5d  ROM changeset }]
4650: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
4660: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6e      typemethod n
4670: 75 6d 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 24  um {} { return $
4680: 6d 79 63 6f 75 6e 74 65 72 20 7d 0a 0a 20 20 20  mycounter }..   
4690: 20 70 72 6f 63 20 49 6e 69 74 69 61 6c 69 7a 65   proc Initialize
46a0: 42 72 65 61 6b 53 74 61 74 65 20 7b 72 65 76 69  BreakState {revi
46b0: 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20  sions} {..upvar 
46c0: 31 20 70 6f 73 20 70 6f 73 20 63 72 6f 73 73 20  1 pos pos cross 
46d0: 63 72 6f 73 73 20 72 61 6e 67 65 20 72 61 6e 67  cross range rang
46e0: 65 20 64 65 70 63 20 64 65 70 63 20 64 65 6c 74  e depc depc delt
46f0: 61 20 64 65 6c 74 61 20 5c 0a 09 20 20 20 20 64  a delta \..    d
4700: 65 70 65 6e 64 65 6e 63 69 65 73 20 64 65 70 65  ependencies depe
4710: 6e 64 65 6e 63 69 65 73 0a 0a 09 23 20 46 69 72  ndencies...# Fir
4720: 73 74 20 77 65 20 63 72 65 61 74 65 20 61 20 6d  st we create a m
4730: 61 70 20 6f 66 20 70 6f 73 69 74 69 6f 6e 73 20  ap of positions 
4740: 74 6f 20 6d 61 6b 65 20 69 74 20 65 61 73 69 65  to make it easie
4750: 72 20 74 6f 0a 09 23 20 64 65 74 65 72 6d 69 6e  r to..# determin
4760: 65 20 77 68 65 74 68 65 72 20 61 20 64 65 70 65  e whether a depe
4770: 6e 64 65 6e 63 79 20 63 72 6f 73 73 65 73 20 61  ndency crosses a
4780: 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64 65   particular inde
4790: 78 2e 0a 0a 09 61 72 72 61 79 20 73 65 74 20 70  x....array set p
47a0: 6f 73 20 20 20 7b 7d 0a 09 61 72 72 61 79 20 73  os   {}..array s
47b0: 65 74 20 63 72 6f 73 73 20 7b 7d 0a 09 61 72 72  et cross {}..arr
47c0: 61 79 20 73 65 74 20 64 65 70 63 20 20 7b 7d 0a  ay set depc  {}.
47d0: 09 73 65 74 20 72 61 6e 67 65 20 20 20 20 20 20  .set range      
47e0: 20 7b 7d 0a 09 73 65 74 20 6e 20 30 0a 09 66 6f   {}..set n 0..fo
47f0: 72 65 61 63 68 20 72 65 76 20 24 72 65 76 69 73  reach rev $revis
4800: 69 6f 6e 73 20 7b 0a 09 20 20 20 20 6c 61 70 70  ions {..    lapp
4810: 65 6e 64 20 72 61 6e 67 65 20 24 6e 0a 09 20 20  end range $n..  
4820: 20 20 73 65 74 20 70 6f 73 28 24 72 65 76 29 20    set pos($rev) 
4830: 24 6e 0a 09 20 20 20 20 73 65 74 20 63 72 6f 73  $n..    set cros
4840: 73 28 24 6e 29 20 30 0a 09 20 20 20 20 69 6e 63  s($n) 0..    inc
4850: 72 20 6e 0a 09 7d 0a 0a 09 23 20 53 65 63 6f 6e  r n..}...# Secon
4860: 64 6c 79 20 77 65 20 63 6f 75 6e 74 20 74 68 65  dly we count the
4870: 20 63 72 6f 73 73 69 6e 67 73 20 70 65 72 20 70   crossings per p
4880: 6f 73 69 74 69 6f 6e 2c 20 62 79 20 69 74 65 72  osition, by iter
4890: 61 74 69 6e 67 0a 09 23 20 6f 76 65 72 20 74 68  ating..# over th
48a0: 65 20 72 65 63 6f 72 64 65 64 20 69 6e 74 65 72  e recorded inter
48b0: 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73  nal dependencies
48c0: 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 49 66 20 74  ....# Note: If t
48d0: 68 65 20 74 69 6d 65 73 74 61 6d 70 73 20 61 72  he timestamps ar
48e0: 65 20 62 61 64 6c 79 20 6f 75 74 20 6f 66 20 6f  e badly out of o
48f0: 72 64 65 72 20 69 74 20 69 73 0a 09 23 20 20 20  rder it is..#   
4900: 20 20 20 20 70 6f 73 73 69 62 6c 65 20 74 6f 20      possible to 
4910: 68 61 76 65 20 61 20 62 61 63 6b 77 61 72 64 20  have a backward 
4920: 73 75 63 63 65 73 73 6f 72 20 64 65 70 65 6e 64  successor depend
4930: 65 6e 63 79 2c 0a 09 23 20 20 20 20 20 20 20 69  ency,..#       i
4940: 2e 65 2e 20 77 69 74 68 20 73 74 61 72 74 20 3e  .e. with start >
4950: 20 65 6e 64 2e 20 57 65 20 6d 61 79 20 68 61 76   end. We may hav
4960: 65 20 74 6f 20 73 77 61 70 20 74 68 65 20 69 6e  e to swap the in
4970: 64 69 63 65 73 0a 09 23 20 20 20 20 20 20 20 74  dices..#       t
4980: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
4990: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70  e following loop
49a0: 20 72 75 6e 73 20 63 6f 72 72 65 63 74 6c 79 2e   runs correctly.
49b0: 0a 09 23 0a 09 23 20 4e 6f 74 65 20 32 3a 20 73  ..#..# Note 2: s
49c0: 74 61 72 74 20 3d 3d 20 65 6e 64 20 69 73 20 6e  tart == end is n
49d0: 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 49 74 20  ot possible. It 
49e0: 69 6e 64 69 63 61 74 65 73 20 61 0a 09 23 20 20  indicates a..#  
49f0: 20 20 20 20 20 20 20 73 65 6c 66 2d 64 65 70 65         self-depe
4a00: 6e 64 65 6e 63 79 20 64 75 65 20 74 6f 20 74 68  ndency due to th
4a10: 65 20 75 6e 69 71 75 65 6e 65 73 73 20 6f 66 20  e uniqueness of 
4a20: 70 6f 73 69 74 69 6f 6e 73 2c 0a 09 23 20 20 20  positions,..#   
4a30: 20 20 20 20 20 20 61 6e 64 20 74 68 61 74 20 69        and that i
4a40: 73 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 20 68  s something we h
4a50: 61 76 65 20 72 75 6c 65 64 20 6f 75 74 20 61 6c  ave ruled out al
4a60: 72 65 61 64 79 2c 20 73 65 65 0a 09 23 20 20 20  ready, see..#   
4a70: 20 20 20 20 20 20 27 72 65 76 20 69 6e 74 65 72        'rev inter
4a80: 6e 61 6c 73 75 63 63 65 73 73 6f 72 73 27 2e 0a  nalsuccessors'..
4a90: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63  ..foreach {rid c
4aa0: 68 69 6c 64 72 65 6e 7d 20 5b 61 72 72 61 79 20  hildren} [array 
4ab0: 67 65 74 20 64 65 70 65 6e 64 65 6e 63 69 65 73  get dependencies
4ac0: 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 63 68  ] {..    foreach
4ad0: 20 63 68 69 6c 64 20 24 63 68 69 6c 64 72 65 6e   child $children
4ae0: 20 7b 0a 09 09 73 65 74 20 64 6b 65 79 20 20 20   {...set dkey   
4af0: 20 5b 6c 69 73 74 20 24 72 69 64 20 24 63 68 69   [list $rid $chi
4b00: 6c 64 5d 0a 09 09 73 65 74 20 73 74 61 72 74 20  ld]...set start 
4b10: 20 20 24 70 6f 73 28 24 72 69 64 29 0a 09 09 73    $pos($rid)...s
4b20: 65 74 20 65 6e 64 20 20 20 20 20 24 70 6f 73 28  et end     $pos(
4b30: 24 63 68 69 6c 64 29 0a 09 09 73 65 74 20 63 72  $child)...set cr
4b40: 6f 73 73 65 73 20 7b 7d 0a 0a 09 09 69 66 20 7b  osses {}....if {
4b50: 24 73 74 61 72 74 20 3e 20 24 65 6e 64 7d 20 7b  $start > $end} {
4b60: 0a 09 09 20 20 20 20 77 68 69 6c 65 20 7b 24 65  ...    while {$e
4b70: 6e 64 20 3c 20 24 73 74 61 72 74 7d 20 7b 0a 09  nd < $start} {..
4b80: 09 09 6c 61 70 70 65 6e 64 20 63 72 6f 73 73 65  ..lappend crosse
4b90: 73 20 24 65 6e 64 0a 09 09 09 69 6e 63 72 20 63  s $end....incr c
4ba0: 72 6f 73 73 28 24 65 6e 64 29 0a 09 09 09 69 6e  ross($end)....in
4bb0: 63 72 20 65 6e 64 0a 09 09 20 20 20 20 7d 0a 09  cr end...    }..
4bc0: 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20  .} else {...    
4bd0: 77 68 69 6c 65 20 7b 24 73 74 61 72 74 20 3c 20  while {$start < 
4be0: 24 65 6e 64 7d 20 7b 0a 09 09 09 6c 61 70 70 65  $end} {....lappe
4bf0: 6e 64 20 63 72 6f 73 73 65 73 20 24 73 74 61 72  nd crosses $star
4c00: 74 0a 09 09 09 69 6e 63 72 20 63 72 6f 73 73 28  t....incr cross(
4c10: 24 73 74 61 72 74 29 0a 09 09 09 69 6e 63 72 20  $start)....incr 
4c20: 73 74 61 72 74 0a 09 09 20 20 20 20 7d 0a 09 09  start...    }...
4c30: 7d 0a 09 09 73 65 74 20 64 65 70 63 28 24 64 6b  }...set depc($dk
4c40: 65 79 29 20 24 63 72 6f 73 73 65 73 0a 09 20 20  ey) $crosses..  
4c50: 20 20 7d 0a 09 7d 0a 0a 09 49 6e 69 74 69 61 6c    }..}...Initial
4c60: 69 7a 65 44 65 6c 74 61 73 20 24 72 65 76 69 73  izeDeltas $revis
4c70: 69 6f 6e 73 0a 09 72 65 74 75 72 6e 0a 20 20 20  ions..return.   
4c80: 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 49 6e 69   }..    proc Ini
4c90: 74 69 61 6c 69 7a 65 44 65 6c 74 61 73 20 7b 72  tializeDeltas {r
4ca0: 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76  evisions} {..upv
4cb0: 61 72 20 31 20 64 65 6c 74 61 20 64 65 6c 74 61  ar 1 delta delta
4cc0: 0a 0a 09 23 20 50 75 6c 6c 20 74 68 65 20 74 69  ...# Pull the ti
4cd0: 6d 65 73 74 61 6d 70 73 20 66 6f 72 20 61 6c 6c  mestamps for all
4ce0: 20 72 65 76 69 73 69 6f 6e 73 20 69 6e 20 74 68   revisions in th
4cf0: 65 20 63 68 61 6e 67 65 73 65 74 73 20 61 6e 64  e changesets and
4d00: 0a 09 23 20 63 6f 6d 70 75 74 65 20 74 68 65 69  ..# compute thei
4d10: 72 20 64 65 6c 74 61 73 20 66 6f 72 20 75 73 65  r deltas for use
4d20: 20 62 79 20 74 68 65 20 62 72 65 61 6b 20 66 69   by the break fi
4d30: 6e 64 65 72 2e 0a 0a 09 61 72 72 61 79 20 73 65  nder....array se
4d40: 74 20 64 65 6c 74 61 20 7b 7d 0a 09 61 72 72 61  t delta {}..arra
4d50: 79 20 73 65 74 20 73 74 61 6d 70 20 7b 7d 0a 0a  y set stamp {}..
4d60: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a  .set theset ('[j
4d70: 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b  oin $revisions {
4d80: 27 2c 27 7d 5d 27 29 0a 09 66 6f 72 65 61 63 68  ','}]')..foreach
4d90: 20 7b 72 69 64 20 74 69 6d 65 7d 20 5b 73 74 61   {rid time} [sta
4da0: 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45  te run "..    SE
4db0: 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 64 61  LECT R.rid, R.da
4dc0: 74 65 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76  te..    FROM rev
4dd0: 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45  ision R..    WHE
4de0: 52 45 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65  RE R.rid IN $the
4df0: 73 65 74 0a 09 22 5d 20 7b 0a 09 20 20 20 20 73  set.."] {..    s
4e00: 65 74 20 73 74 61 6d 70 28 24 72 69 64 29 20 24  et stamp($rid) $
4e10: 74 69 6d 65 0a 09 7d 0a 0a 09 73 65 74 20 6e 20  time..}...set n 
4e20: 30 0a 09 66 6f 72 65 61 63 68 20 72 69 64 20 5b  0..foreach rid [
4e30: 6c 72 61 6e 67 65 20 24 72 65 76 69 73 69 6f 6e  lrange $revision
4e40: 73 20 30 20 65 6e 64 2d 31 5d 20 72 6e 65 78 74  s 0 end-1] rnext
4e50: 20 5b 6c 72 61 6e 67 65 20 24 72 65 76 69 73 69   [lrange $revisi
4e60: 6f 6e 73 20 31 20 65 6e 64 5d 20 7b 0a 09 20 20  ons 1 end] {..  
4e70: 20 20 73 65 74 20 64 65 6c 74 61 28 24 6e 29 20    set delta($n) 
4e80: 5b 65 78 70 72 20 7b 24 73 74 61 6d 70 28 24 72  [expr {$stamp($r
4e90: 6e 65 78 74 29 20 2d 20 24 73 74 61 6d 70 28 24  next) - $stamp($
4ea0: 72 69 64 29 7d 5d 0a 09 20 20 20 20 69 6e 63 72  rid)}]..    incr
4eb0: 20 6e 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20   n..}..return.  
4ec0: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 46 69    }..    proc Fi
4ed0: 6e 64 42 65 73 74 42 72 65 61 6b 20 7b 72 61 6e  ndBestBreak {ran
4ee0: 67 65 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 63  ge} {..upvar 1 c
4ef0: 72 6f 73 73 20 63 72 6f 73 73 20 64 65 6c 74 61  ross cross delta
4f00: 20 64 65 6c 74 61 0a 0a 09 23 20 44 65 74 65 72   delta...# Deter
4f10: 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 62 72  mine the best br
4f20: 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  eak location in 
4f30: 74 68 65 20 67 69 76 65 6e 20 72 61 6e 67 65 20  the given range 
4f40: 6f 66 0a 09 23 20 70 6f 73 69 74 69 6f 6e 73 2e  of..# positions.
4f50: 20 46 69 72 73 74 20 77 65 20 6c 6f 6f 6b 20 66   First we look f
4f60: 6f 72 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 73  or the locations
4f70: 20 77 69 74 68 20 74 68 65 20 6d 61 78 69 6d 61   with the maxima
4f80: 6c 0a 09 23 20 6e 75 6d 62 65 72 20 6f 66 20 63  l..# number of c
4f90: 72 6f 73 73 69 6e 67 73 2e 20 49 66 20 74 68 65  rossings. If the
4fa0: 72 65 20 61 72 65 20 73 65 76 65 72 61 6c 20 77  re are several w
4fb0: 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 68 65 0a 09  e look for the..
4fc0: 23 20 73 68 6f 72 74 65 73 74 20 74 69 6d 65 20  # shortest time 
4fd0: 69 6e 74 65 72 76 61 6c 20 61 6d 6f 6e 67 20 74  interval among t
4fe0: 68 65 6d 2e 20 49 66 20 77 65 20 73 74 69 6c 6c  hem. If we still
4ff0: 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 0a 09   have multiple..
5000: 23 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 20  # possibilities 
5010: 61 66 74 65 72 20 74 68 61 74 20 77 65 20 73 65  after that we se
5020: 6c 65 63 74 20 74 68 65 20 65 61 72 6c 69 65 73  lect the earlies
5030: 74 20 6c 6f 63 61 74 69 6f 6e 0a 09 23 20 61 6d  t location..# am
5040: 6f 6e 67 20 74 68 65 73 65 2e 0a 0a 09 23 20 4e  ong these....# N
5050: 6f 74 65 3a 20 49 66 20 74 68 65 20 6d 61 78 69  ote: If the maxi
5060: 6d 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 72  mal number of cr
5070: 6f 73 73 69 6e 67 73 20 69 73 20 30 20 74 68 65  ossings is 0 the
5080: 6e 20 74 68 65 20 72 61 6e 67 65 0a 09 23 20 20  n the range..#  
5090: 20 20 20 20 20 68 61 73 20 6e 6f 20 69 6e 74 65       has no inte
50a0: 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65  rnal dependencie
50b0: 73 2c 20 61 6e 64 20 6e 6f 20 62 72 65 61 6b 20  s, and no break 
50c0: 6c 6f 63 61 74 69 6f 6e 20 61 74 0a 09 23 20 20  location at..#  
50d0: 20 20 20 20 20 61 6c 6c 2e 20 54 68 69 73 20 70       all. This p
50e0: 6f 73 73 69 62 69 6c 69 74 79 20 69 73 20 73 69  ossibility is si
50f0: 67 6e 61 6c 65 64 20 76 69 61 20 72 65 73 75 6c  gnaled via resul
5100: 74 20 2d 31 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20  t -1....# Note: 
5110: 41 20 72 61 6e 67 65 20 6f 66 20 6c 65 6e 67 74  A range of lengt
5120: 68 20 31 20 6f 72 20 6c 65 73 73 20 63 61 6e 6e  h 1 or less cann
5130: 6f 74 20 68 61 76 65 20 69 6e 74 65 72 6e 61 6c  ot have internal
5140: 0a 09 23 20 20 20 20 20 20 20 64 65 70 65 6e 64  ..#       depend
5150: 65 6e 63 69 65 73 2c 20 61 73 20 74 68 61 74 20  encies, as that 
5160: 6e 65 65 64 73 20 61 74 20 6c 65 61 73 74 20 74  needs at least t
5170: 77 6f 20 72 65 76 69 73 69 6f 6e 73 20 69 6e 0a  wo revisions in.
5180: 09 23 20 20 20 20 20 20 20 74 68 65 20 72 61 6e  .#       the ran
5190: 67 65 2e 0a 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67  ge....if {[lleng
51a0: 74 68 20 24 72 61 6e 67 65 5d 20 3c 20 32 7d 20  th $range] < 2} 
51b0: 7b 20 72 65 74 75 72 6e 20 2d 31 20 7d 0a 0a 09  { return -1 }...
51c0: 73 65 74 20 6d 61 78 20 2d 31 0a 09 73 65 74 20  set max -1..set 
51d0: 62 65 73 74 20 7b 7d 0a 0a 09 66 6f 72 65 61 63  best {}...foreac
51e0: 68 20 6c 6f 63 61 74 69 6f 6e 20 24 72 61 6e 67  h location $rang
51f0: 65 20 7b 0a 09 20 20 20 20 73 65 74 20 63 72 6f  e {..    set cro
5200: 73 73 69 6e 67 73 20 24 63 72 6f 73 73 28 24 6c  ssings $cross($l
5210: 6f 63 61 74 69 6f 6e 29 0a 09 20 20 20 20 69 66  ocation)..    if
5220: 20 7b 24 63 72 6f 73 73 69 6e 67 73 20 3e 20 24   {$crossings > $
5230: 6d 61 78 7d 20 7b 0a 09 09 73 65 74 20 6d 61 78  max} {...set max
5240: 20 20 24 63 72 6f 73 73 69 6e 67 73 0a 09 09 73    $crossings...s
5250: 65 74 20 62 65 73 74 20 5b 6c 69 73 74 20 24 6c  et best [list $l
5260: 6f 63 61 74 69 6f 6e 5d 0a 09 09 63 6f 6e 74 69  ocation]...conti
5270: 6e 75 65 0a 09 20 20 20 20 7d 20 65 6c 73 65 69  nue..    } elsei
5280: 66 20 7b 24 63 72 6f 73 73 69 6e 67 73 20 3d 3d  f {$crossings ==
5290: 20 24 6d 61 78 7d 20 7b 0a 09 09 6c 61 70 70 65   $max} {...lappe
52a0: 6e 64 20 62 65 73 74 20 24 6c 6f 63 61 74 69 6f  nd best $locatio
52b0: 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66  n..    }..}...if
52c0: 20 7b 24 6d 61 78 20 3d 3d 20 30 7d 20 20 20 20   {$max == 0}    
52d0: 20 20 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e          { return
52e0: 20 2d 31 20 7d 0a 09 69 66 20 7b 5b 6c 6c 65 6e   -1 }..if {[llen
52f0: 67 74 68 20 24 62 65 73 74 5d 20 3d 3d 20 31 7d  gth $best] == 1}
5300: 20 7b 20 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65   { return [linde
5310: 78 20 24 62 65 73 74 20 30 5d 20 7d 0a 0a 09 73  x $best 0] }...s
5320: 65 74 20 6c 6f 63 61 74 69 6f 6e 73 20 24 62 65  et locations $be
5330: 73 74 0a 09 73 65 74 20 62 65 73 74 20 7b 7d 0a  st..set best {}.
5340: 09 73 65 74 20 6d 69 6e 20 2d 31 0a 0a 09 66 6f  .set min -1...fo
5350: 72 65 61 63 68 20 6c 6f 63 61 74 69 6f 6e 20 24  reach location $
5360: 6c 6f 63 61 74 69 6f 6e 73 20 7b 0a 09 20 20 20  locations {..   
5370: 20 73 65 74 20 69 6e 74 65 72 76 61 6c 20 24 64   set interval $d
5380: 65 6c 74 61 28 24 6c 6f 63 61 74 69 6f 6e 29 0a  elta($location).
5390: 09 20 20 20 20 69 66 20 7b 28 24 6d 69 6e 20 3c  .    if {($min <
53a0: 20 30 29 20 7c 7c 20 28 24 69 6e 74 65 72 76 61   0) || ($interva
53b0: 6c 20 3c 20 24 6d 69 6e 29 7d 20 7b 0a 09 09 73  l < $min)} {...s
53c0: 65 74 20 6d 69 6e 20 20 24 69 6e 74 65 72 76 61  et min  $interva
53d0: 6c 0a 09 09 73 65 74 20 62 65 73 74 20 5b 6c 69  l...set best [li
53e0: 73 74 20 24 6c 6f 63 61 74 69 6f 6e 5d 0a 09 20  st $location].. 
53f0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 69 6e     } elseif {$in
5400: 74 65 72 76 61 6c 20 3d 3d 20 24 6d 69 6e 7d 20  terval == $min} 
5410: 7b 0a 09 09 6c 61 70 70 65 6e 64 20 62 65 73 74  {...lappend best
5420: 20 24 6c 6f 63 61 74 69 6f 6e 0a 09 20 20 20 20   $location..    
5430: 7d 0a 09 7d 0a 0a 09 69 66 20 7b 5b 6c 6c 65 6e  }..}...if {[llen
5440: 67 74 68 20 24 62 65 73 74 5d 20 3d 3d 20 31 7d  gth $best] == 1}
5450: 20 7b 20 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65   { return [linde
5460: 78 20 24 62 65 73 74 20 30 5d 20 7d 0a 0a 09 72  x $best 0] }...r
5470: 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 5b 6c  eturn [lindex [l
5480: 73 6f 72 74 20 2d 69 6e 74 65 67 65 72 20 2d 69  sort -integer -i
5490: 6e 63 72 65 61 73 69 6e 67 20 24 62 65 73 74 5d  ncreasing $best]
54a0: 20 30 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70   0].    }..    p
54b0: 72 6f 63 20 43 75 74 41 74 20 7b 6c 6f 63 61 74  roc CutAt {locat
54c0: 69 6f 6e 7d 20 7b 0a 09 75 70 76 61 72 20 31 20  ion} {..upvar 1 
54d0: 63 72 6f 73 73 20 63 72 6f 73 73 20 64 65 70 63  cross cross depc
54e0: 20 64 65 70 63 0a 0a 09 23 20 49 74 20 77 61 73   depc...# It was
54f0: 20 64 65 63 69 64 65 64 20 74 6f 20 73 70 6c 69   decided to spli
5500: 74 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20  t the changeset 
5510: 61 74 20 74 68 65 20 67 69 76 65 6e 0a 09 23 20  at the given..# 
5520: 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 69 73 20 63  location. This c
5530: 75 74 73 20 61 20 6e 75 6d 62 65 72 20 6f 66 20  uts a number of 
5540: 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 48 65  dependencies. He
5550: 72 65 20 77 65 20 75 70 64 61 74 65 0a 09 23 20  re we update..# 
5560: 74 68 65 20 63 72 6f 73 73 20 69 6e 66 6f 72 6d  the cross inform
5570: 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68  ation so that th
5580: 65 20 62 72 65 61 6b 20 66 69 6e 64 65 72 20 68  e break finder h
5590: 61 73 20 61 63 63 75 72 61 74 65 0a 09 23 20 64  as accurate..# d
55a0: 61 74 61 20 77 68 65 6e 20 77 65 20 6c 6f 6f 6b  ata when we look
55b0: 20 61 74 20 74 68 65 20 67 65 6e 65 72 61 74 65   at the generate
55c0: 64 20 66 72 61 67 6d 65 6e 74 73 2e 0a 0a 09 73  d fragments....s
55d0: 65 74 20 73 69 78 20 5b 6c 6f 67 20 76 69 73 69  et six [log visi
55e0: 62 6c 65 3f 20 36 5d 0a 0a 09 66 6f 72 65 61 63  ble? 6]...foreac
55f0: 68 20 7b 64 65 70 20 72 61 6e 67 65 7d 20 5b 61  h {dep range} [a
5600: 72 72 61 79 20 67 65 74 20 64 65 70 63 5d 20 7b  rray get depc] {
5610: 0a 09 20 20 20 20 23 20 43 68 65 63 6b 20 61 6c  ..    # Check al
5620: 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 73  l dependencies s
5630: 74 69 6c 6c 20 6b 6e 6f 77 6e 2c 20 74 61 6b 65  till known, take
5640: 20 74 68 65 69 72 20 72 61 6e 67 65 20 61 6e 64   their range and
5650: 0a 09 20 20 20 20 23 20 73 65 65 20 69 66 20 74  ..    # see if t
5660: 68 65 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f  he break locatio
5670: 6e 20 66 61 6c 6c 73 20 77 69 74 68 69 6e 2e 0a  n falls within..
5680: 0a 09 20 20 20 20 42 6f 72 64 65 72 20 24 72 61  ..    Border $ra
5690: 6e 67 65 20 73 20 65 0a 09 20 20 20 20 69 66 20  nge s e..    if 
56a0: 7b 24 6c 6f 63 61 74 69 6f 6e 20 3c 20 24 73 7d  {$location < $s}
56b0: 20 63 6f 6e 74 69 6e 75 65 20 3b 20 23 20 62 72   continue ; # br
56c0: 65 61 6b 20 62 65 66 6f 72 65 20 72 61 6e 67 65  eak before range
56d0: 2c 20 69 67 6e 6f 72 65 0a 09 20 20 20 20 69 66  , ignore..    if
56e0: 20 7b 24 6c 6f 63 61 74 69 6f 6e 20 3e 20 24 65   {$location > $e
56f0: 7d 20 63 6f 6e 74 69 6e 75 65 20 3b 20 23 20 62  } continue ; # b
5700: 72 65 61 6b 20 61 66 74 65 72 20 72 61 6e 67 65  reak after range
5710: 2c 20 69 67 6e 6f 72 65 2e 0a 0a 09 20 20 20 20  , ignore....    
5720: 23 20 54 68 69 73 20 64 65 70 65 6e 64 65 6e 63  # This dependenc
5730: 79 20 63 72 6f 73 73 65 73 20 74 68 65 20 62 72  y crosses the br
5740: 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 2e 20 57 65  eak location. We
5750: 20 72 65 6d 6f 76 65 20 69 74 0a 09 20 20 20 20   remove it..    
5760: 23 20 66 72 6f 6d 20 74 68 65 20 63 72 6f 73 73  # from the cross
5770: 69 6e 67 73 20 63 6f 75 6e 74 65 72 73 2c 20 61  ings counters, a
5780: 6e 64 20 74 68 65 6e 20 61 6c 73 6f 20 66 72 6f  nd then also fro
5790: 6d 20 74 68 65 20 73 65 74 0a 09 20 20 20 20 23  m the set..    #
57a0: 20 6f 66 20 6b 6e 6f 77 6e 20 64 65 70 65 6e 64   of known depend
57b0: 65 6e 63 69 65 73 2c 20 61 73 20 77 65 20 61 72  encies, as we ar
57c0: 65 20 64 6f 6e 65 20 77 69 74 68 20 69 74 2e 0a  e done with it..
57d0: 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 6c 6f  ..    foreach lo
57e0: 63 20 24 64 65 70 63 28 24 64 65 70 29 20 7b 20  c $depc($dep) { 
57f0: 69 6e 63 72 20 63 72 6f 73 73 28 24 6c 6f 63 29  incr cross($loc)
5800: 20 2d 31 20 7d 0a 09 20 20 20 20 75 6e 73 65 74   -1 }..    unset
5810: 20 64 65 70 63 28 24 64 65 70 29 0a 0a 09 20 20   depc($dep)...  
5820: 20 20 69 66 20 7b 21 24 73 69 78 7d 20 63 6f 6e    if {!$six} con
5830: 74 69 6e 75 65 0a 0a 09 20 20 20 20 73 74 72 75  tinue...    stru
5840: 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20  ct::list assign 
5850: 24 64 65 70 20 70 61 72 65 6e 74 20 63 68 69 6c  $dep parent chil
5860: 64 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65  d..    log write
5870: 20 35 20 63 73 65 74 73 20 22 42 72 6f 6b 65 20   5 csets "Broke 
5880: 64 65 70 65 6e 64 65 6e 63 79 20 5b 50 44 20 24  dependency [PD $
5890: 70 61 72 65 6e 74 5d 20 2d 2d 3e 20 5b 50 44 20  parent] --> [PD 
58a0: 24 63 68 69 6c 64 5d 22 0a 09 7d 0a 0a 09 72 65  $child]"..}...re
58b0: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
58c0: 23 20 50 72 69 6e 74 20 69 64 65 6e 74 69 66 79  # Print identify
58d0: 69 6e 67 20 64 61 74 61 20 66 6f 72 20 61 20 72  ing data for a r
58e0: 65 76 69 73 69 6f 6e 20 28 70 72 6f 6a 65 63 74  evision (project
58f0: 2c 20 66 69 6c 65 2c 20 64 6f 74 74 65 64 20 72  , file, dotted r
5900: 65 76 0a 20 20 20 20 23 20 6e 75 6d 62 65 72 29  ev.    # number)
5910: 2c 20 66 6f 72 20 68 69 67 68 20 76 65 72 62 6f  , for high verbo
5920: 73 69 74 79 20 6c 6f 67 20 6f 75 74 70 75 74 2e  sity log output.
5930: 0a 20 20 20 20 23 20 54 4f 44 4f 3a 20 52 65 70  .    # TODO: Rep
5940: 6c 61 63 65 20 77 69 74 68 20 63 61 6c 6c 20 74  lace with call t
5950: 6f 20 69 74 65 6d 73 74 72 20 28 6c 69 73 74 20  o itemstr (list 
5960: 72 65 76 20 24 69 64 29 0a 0a 20 20 20 20 70 72  rev $id)..    pr
5970: 6f 63 20 50 44 20 7b 69 64 7d 20 7b 0a 09 66 6f  oc PD {id} {..fo
5980: 72 65 61 63 68 20 7b 70 20 66 20 72 7d 20 5b 73  reach {p f r} [s
5990: 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 53 45 4c  tate run {...SEL
59a0: 45 43 54 20 50 2e 6e 61 6d 65 20 2c 20 46 2e 6e  ECT P.name , F.n
59b0: 61 6d 65 2c 20 52 2e 72 65 76 0a 09 09 46 52 4f  ame, R.rev...FRO
59c0: 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 66 69  M revision R, fi
59d0: 6c 65 20 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a  le F, project P.
59e0: 09 09 57 48 45 52 45 20 52 2e 72 69 64 20 3d 20  ..WHERE R.rid = 
59f0: 24 69 64 0a 09 09 41 4e 44 20 20 20 46 2e 66 69  $id...AND   F.fi
5a00: 64 20 3d 20 52 2e 66 69 64 0a 09 09 41 4e 44 20  d = R.fid...AND 
5a10: 20 20 50 2e 70 69 64 20 3d 20 46 2e 70 69 64 0a    P.pid = F.pid.
5a20: 09 7d 5d 20 62 72 65 61 6b 0a 09 72 65 74 75 72  .}] break..retur
5a30: 6e 20 22 27 24 70 20 3a 20 24 66 2f 24 72 27 22  n "'$p : $f/$r'"
5a40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 50 72  .    }..    # Pr
5a50: 69 6e 74 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f  inting one or mo
5a60: 72 65 20 72 61 6e 67 65 73 2c 20 66 6f 72 6d 61  re ranges, forma
5a70: 74 74 65 64 2c 20 61 6e 64 20 6f 6e 6c 79 20 74  tted, and only t
5a80: 68 65 69 72 20 62 6f 72 64 65 72 20 74 6f 0a 20  heir border to. 
5a90: 20 20 20 23 20 6b 65 65 70 20 74 68 65 20 73 74     # keep the st
5aa0: 72 69 6e 67 73 20 73 68 6f 72 74 2e 0a 0a 20 20  rings short...  
5ab0: 20 20 70 72 6f 63 20 50 52 73 20 7b 72 61 6e 67    proc PRs {rang
5ac0: 65 73 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b 73  es} {..return [s
5ad0: 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20  truct::list map 
5ae0: 24 72 61 6e 67 65 73 20 5b 6d 79 70 72 6f 63 20  $ranges [myproc 
5af0: 50 52 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  PR]].    }..    
5b00: 70 72 6f 63 20 50 52 20 7b 72 61 6e 67 65 7d 20  proc PR {range} 
5b10: 7b 0a 09 42 6f 72 64 65 72 20 24 72 61 6e 67 65  {..Border $range
5b20: 20 73 20 65 0a 09 72 65 74 75 72 6e 20 3c 24 7b   s e..return <${
5b30: 73 7d 2e 2e 2e 24 7b 65 7d 3e 0a 20 20 20 20 7d  s}...${e}>.    }
5b40: 0a 0a 20 20 20 20 70 72 6f 63 20 42 6f 72 64 65  ..    proc Borde
5b50: 72 20 7b 72 61 6e 67 65 20 73 76 20 65 76 7d 20  r {range sv ev} 
5b60: 7b 0a 09 75 70 76 61 72 20 31 20 24 73 76 20 73  {..upvar 1 $sv s
5b70: 20 24 65 76 20 65 0a 09 73 65 74 20 73 20 5b 6c   $ev e..set s [l
5b80: 69 6e 64 65 78 20 24 72 61 6e 67 65 20 30 5d 0a  index $range 0].
5b90: 09 73 65 74 20 65 20 5b 6c 69 6e 64 65 78 20 24  .set e [lindex $
5ba0: 72 61 6e 67 65 20 65 6e 64 5d 0a 09 72 65 74 75  range end]..retu
5bb0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  rn.    }..    # 
5bc0: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23  # ## ### ##### #
5bd0: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
5be0: 23 23 23 23 23 0a 0a 20 20 20 20 74 79 70 65 76  #####..    typev
5bf0: 61 72 69 61 62 6c 65 20 6d 79 63 68 61 6e 67 65  ariable mychange
5c00: 73 65 74 73 20 20 20 20 20 7b 7d 20 3b 20 23 20  sets     {} ; # 
5c10: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 6b 6e 6f 77  List of all know
5c20: 6e 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 20 20  n changesets..  
5c30: 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d    typevariable m
5c40: 79 69 74 65 6d 6d 61 70 20 2d 61 72 72 61 79 20  yitemmap -array 
5c50: 7b 7d 20 3b 20 23 20 4d 61 70 20 66 72 6f 6d 20  {} ; # Map from 
5c60: 69 74 65 6d 73 20 28 74 61 67 67 65 64 29 20 74  items (tagged) t
5c70: 6f 0a 09 09 09 09 20 20 20 20 20 20 20 23 20 74  o.....       # t
5c80: 68 65 20 6c 69 73 74 20 6f 66 20 63 68 61 6e 67  he list of chang
5c90: 65 73 65 74 73 0a 09 09 09 09 20 20 20 20 20 20  esets.....      
5ca0: 20 23 20 63 6f 6e 74 61 69 6e 69 6e 67 20 69 74   # containing it
5cb0: 2e 20 45 61 63 68 20 69 74 65 6d 20 63 61 6e 0a  . Each item can.
5cc0: 09 09 09 09 20 20 20 20 20 20 20 23 20 62 65 20  ....       # be 
5cd0: 75 73 65 64 20 62 79 20 6f 6e 6c 79 20 6f 6e 65  used by only one
5ce0: 0a 09 09 09 09 20 20 20 20 20 20 20 23 20 63 68  .....       # ch
5cf0: 61 6e 67 65 73 65 74 2e 0a 20 20 20 20 74 79 70  angeset..    typ
5d00: 65 76 61 72 69 61 62 6c 65 20 6d 79 69 64 6d 61  evariable myidma
5d10: 70 20 20 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20  p   -array {} ; 
5d20: 23 20 4d 61 70 20 66 72 6f 6d 20 63 68 61 6e 67  # Map from chang
5d30: 65 73 65 74 20 69 64 20 74 6f 0a 09 09 09 09 20  eset id to..... 
5d40: 20 20 20 20 20 20 23 20 63 68 61 6e 67 65 73 65        # changese
5d50: 74 2e 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68  t...    typemeth
5d60: 6f 64 20 61 6c 6c 20 20 20 20 7b 7d 20 20 20 20  od all    {}    
5d70: 7b 20 72 65 74 75 72 6e 20 24 6d 79 63 68 61 6e  { return $mychan
5d80: 67 65 73 65 74 73 20 7d 0a 20 20 20 20 74 79 70  gesets }.    typ
5d90: 65 6d 65 74 68 6f 64 20 6f 66 20 20 20 20 20 7b  emethod of     {
5da0: 63 69 64 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d  cid} { return $m
5db0: 79 69 64 6d 61 70 28 24 63 69 64 29 20 7d 0a 20  yidmap($cid) }. 
5dc0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6f 66     typemethod of
5dd0: 69 74 65 6d 20 7b 69 69 64 7d 20 7b 20 72 65 74  item {iid} { ret
5de0: 75 72 6e 20 24 6d 79 69 74 65 6d 6d 61 70 28 24  urn $myitemmap($
5df0: 69 69 64 29 20 7d 0a 0a 20 20 20 20 23 20 23 20  iid) }..    # # 
5e00: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
5e10: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
5e20: 23 23 23 0a 20 20 20 20 23 23 20 43 6f 6e 66 69  ###.    ## Confi
5e30: 67 75 72 61 74 69 6f 6e 0a 0a 20 20 20 20 70 72  guration..    pr
5e40: 61 67 6d 61 20 2d 68 61 73 74 79 70 65 69 6e 66  agma -hastypeinf
5e50: 6f 20 20 20 20 6e 6f 20 20 3b 20 23 20 6e 6f 20  o    no  ; # no 
5e60: 74 79 70 65 20 69 6e 74 72 6f 73 70 65 63 74 69  type introspecti
5e70: 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68  on.    pragma -h
5e80: 61 73 69 6e 66 6f 20 20 20 20 20 20 20 20 6e 6f  asinfo        no
5e90: 20 20 3b 20 23 20 6e 6f 20 6f 62 6a 65 63 74 20    ; # no object 
5ea0: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 0a 20  introspection.. 
5eb0: 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23     # # ## ### ##
5ec0: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23  ### ######## ###
5ed0: 23 23 23 23 23 23 23 23 23 23 0a 7d 0a 0a 23 23  ##########.}..##
5ee0: 0a 23 23 20 4e 4f 54 45 3a 20 54 68 65 20 73 75  .## NOTE: The su
5ef0: 63 63 65 73 73 6f 72 20 61 6e 64 20 70 72 65 64  ccessor and pred
5f00: 65 63 65 73 73 6f 72 20 6d 65 74 68 6f 64 73 20  ecessor methods 
5f10: 64 65 66 69 6e 65 64 20 62 79 20 74 68 65 20 63  defined by the c
5f20: 6c 61 73 73 65 73 0a 23 23 20 20 20 20 20 20 20  lasses.##       
5f30: 62 65 6c 6f 77 20 61 72 65 20 2d 2d 20 62 6f 74  below are -- bot
5f40: 74 6c 65 20 6e 65 63 6b 73 20 2d 2d 2e 20 4c 6f  tle necks --. Lo
5f50: 6f 6b 20 66 6f 72 20 77 61 79 73 20 74 6f 20 6d  ok for ways to m
5f60: 61 6b 65 20 74 68 65 20 53 51 4c 0a 23 23 20 20  ake the SQL.##  
5f70: 20 20 20 20 20 66 61 73 74 65 72 2e 0a 23 23 0a       faster..##.
5f80: 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23  .# # ## ### ####
5f90: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
5fa0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
5fb0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23  ##############.#
5fc0: 23 20 48 65 6c 70 65 72 20 73 69 6e 67 6c 65 74  # Helper singlet
5fd0: 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20 66 6f 72  on. Commands for
5fe0: 20 72 65 76 69 73 69 6f 6e 20 63 68 61 6e 67 65   revision change
5ff0: 73 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70  sets...snit::typ
6000: 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a  e ::vc::fossil::
6010: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f  import::cvs::pro
6020: 6a 65 63 74 3a 3a 72 65 76 3a 3a 72 65 76 20 7b  ject::rev::rev {
6030: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
6040: 62 79 72 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 20  byrevision {} { 
6050: 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74  return 1 }.    t
6060: 79 70 65 6d 65 74 68 6f 64 20 62 79 73 79 6d 62  ypemethod bysymb
6070: 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e  ol   {} { return
6080: 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74   0 }.    typemet
6090: 68 6f 64 20 69 73 74 61 67 20 20 20 20 20 20 7b  hod istag      {
60a0: 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20  } { return 0 }. 
60b0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73     typemethod is
60c0: 62 72 61 6e 63 68 20 20 20 7b 7d 20 7b 20 72 65  branch   {} { re
60d0: 74 75 72 6e 20 30 20 7d 0a 0a 20 20 20 20 74 79  turn 0 }..    ty
60e0: 70 65 6d 65 74 68 6f 64 20 73 74 72 20 7b 72 65  pemethod str {re
60f0: 76 69 73 69 6f 6e 7d 20 7b 0a 09 73 74 72 75 63  vision} {..struc
6100: 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b  t::list assign [
6110: 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20  state run {..   
6120: 20 53 45 4c 45 43 54 20 52 2e 72 65 76 2c 20 46   SELECT R.rev, F
6130: 2e 6e 61 6d 65 2c 20 50 2e 6e 61 6d 65 0a 09 20  .name, P.name.. 
6140: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69     FROM   revisi
6150: 6f 6e 20 52 2c 20 66 69 6c 65 20 46 2c 20 70 72  on R, file F, pr
6160: 6f 6a 65 63 74 20 50 0a 09 20 20 20 20 57 48 45  oject P..    WHE
6170: 52 45 20 20 52 2e 72 69 64 20 3d 20 24 72 65 76  RE  R.rid = $rev
6180: 69 73 69 6f 6e 0a 09 20 20 20 20 41 4e 44 20 20  ision..    AND  
6190: 20 20 46 2e 66 69 64 20 3d 20 52 2e 66 69 64 0a    F.fid = R.fid.
61a0: 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69  .    AND    P.pi
61b0: 64 20 3d 20 46 2e 70 69 64 0a 09 7d 5d 20 72 65  d = F.pid..}] re
61c0: 76 6e 72 20 66 6e 61 6d 65 20 70 6e 61 6d 65 0a  vnr fname pname.
61d0: 09 72 65 74 75 72 6e 20 22 24 70 6e 61 6d 65 2f  .return "$pname/
61e0: 24 7b 72 65 76 6e 72 7d 3a 3a 24 66 6e 61 6d 65  ${revnr}::$fname
61f0: 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72  ".    }..    # r
6200: 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69  esult = list (mi
6210: 6e 74 69 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a  ntime, maxtime).
6220: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 74      typemethod t
6230: 69 6d 65 72 61 6e 67 65 20 7b 69 74 65 6d 73 7d  imerange {items}
6240: 20 7b 0a 09 73 65 74 20 74 68 65 73 65 74 20 28   {..set theset (
6250: 27 5b 6a 6f 69 6e 20 24 69 74 65 6d 73 20 7b 27  '[join $items {'
6260: 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b  ,'}]')..return [
6270: 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20  state run "..   
6280: 20 53 45 4c 45 43 54 20 4d 49 4e 28 52 2e 64 61   SELECT MIN(R.da
6290: 74 65 29 2c 20 4d 41 58 28 52 2e 64 61 74 65 29  te), MAX(R.date)
62a0: 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73  ..    FROM revis
62b0: 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45  ion R..    WHERE
62c0: 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65   R.rid IN $these
62d0: 74 0a 09 22 5d 0a 20 20 20 20 7d 0a 0a 20 20 20  t.."].    }..   
62e0: 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 63   # var(dv) = dic
62f0: 74 20 28 72 65 76 69 73 69 6f 6e 20 2d 3e 20 6c  t (revision -> l
6300: 69 73 74 20 28 72 65 76 69 73 69 6f 6e 29 29 0a  ist (revision)).
6310: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69      typemethod i
6320: 6e 74 65 72 6e 61 6c 73 75 63 63 65 73 73 6f 72  nternalsuccessor
6330: 73 20 7b 64 76 20 72 65 76 69 73 69 6f 6e 73 7d  s {dv revisions}
6340: 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76 20   {..upvar 1 $dv 
6350: 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 73 65  dependencies..se
6360: 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e  t theset ('[join
6370: 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27   $revisions {','
6380: 7d 5d 27 29 0a 0a 09 23 20 53 65 65 20 27 73 75  }]')...# See 'su
6390: 63 63 65 73 73 6f 72 73 27 20 62 65 6c 6f 77 20  ccessors' below 
63a0: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 65 78 70  for the main exp
63b0: 6c 61 6e 61 74 69 6f 6e 20 6f 66 0a 09 23 20 74  lanation of..# t
63c0: 68 65 20 76 61 72 69 6f 75 73 20 63 61 73 65 73  he various cases
63d0: 2e 20 54 68 69 73 20 70 69 65 63 65 20 69 73 20  . This piece is 
63e0: 73 70 65 63 69 61 6c 20 69 6e 20 74 68 61 74 20  special in that 
63f0: 69 74 0a 09 23 20 72 65 73 74 72 69 63 74 73 20  it..# restricts 
6400: 74 68 65 20 73 75 63 63 65 73 73 6f 72 73 20 77  the successors w
6410: 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 6f 20 74 68  e look for to th
6420: 65 20 73 61 6d 65 20 73 65 74 20 6f 66 0a 09 23  e same set of..#
6430: 20 72 65 76 69 73 69 6f 6e 73 20 77 65 20 73 74   revisions we st
6440: 61 72 74 20 66 72 6f 6d 2e 20 53 65 6e 73 69 62  art from. Sensib
6450: 6c 65 20 61 73 20 77 65 20 61 72 65 20 6c 6f 6f  le as we are loo
6460: 6b 69 6e 67 20 66 6f 72 0a 09 23 20 63 68 61 6e  king for..# chan
6470: 67 65 73 65 74 20 69 6e 74 65 72 6e 61 6c 20 64  geset internal d
6480: 65 70 65 6e 64 65 6e 63 69 65 73 2e 0a 0a 09 61  ependencies....a
6490: 72 72 61 79 20 73 65 74 20 64 65 70 20 7b 7d 0a  rray set dep {}.
64a0: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63  ..foreach {rid c
64b0: 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e  hild} [state run
64c0: 20 22 0a 20 20 20 2d 2d 20 28 31 29 20 50 72 69   ".   -- (1) Pri
64d0: 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20  mary child..    
64e0: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e  SELECT R.rid, R.
64f0: 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20  child..    FROM 
6500: 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20    revision R..  
6510: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20    WHERE  R.rid  
6520: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20   IN $theset     
6530: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72  -- Restrict to r
6540: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65  evisions of inte
6550: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
6560: 20 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20   R.child IS NOT 
6570: 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70  NULL    -- Has p
6580: 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20  rimary child..  
6590: 20 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64    AND    R.child
65a0: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20   IN $theset     
65b0: 2d 2d 20 57 68 69 63 68 20 69 73 20 61 6c 73 6f  -- Which is also
65c0: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 20 20 20   of interest.   
65d0: 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32   UNION.    -- (2
65e0: 29 20 53 65 63 6f 6e 64 61 72 79 20 28 62 72 61  ) Secondary (bra
65f0: 6e 63 68 29 20 63 68 69 6c 64 72 65 6e 0a 09 20  nch) children.. 
6600: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c     SELECT R.rid,
6610: 20 42 2e 62 72 69 64 0a 09 20 20 20 20 46 52 4f   B.brid..    FRO
6620: 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20  M   revision R, 
6630: 72 65 76 69 73 69 6f 6e 62 72 61 6e 63 68 63 68  revisionbranchch
6640: 69 6c 64 72 65 6e 20 42 0a 09 20 20 20 20 57 48  ildren B..    WH
6650: 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20  ERE  R.rid   IN 
6660: 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52  $theset     -- R
6670: 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73  estrict to revis
6680: 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74  ions of interest
6690: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72  ..    AND    R.r
66a0: 69 64 20 3d 20 42 2e 72 69 64 20 20 20 20 20 20  id = B.rid      
66b0: 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 73 75      -- Select su
66c0: 62 73 65 74 20 6f 66 20 62 72 61 6e 63 68 20 63  bset of branch c
66d0: 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 41 4e 44  hildren..    AND
66e0: 20 20 20 20 42 2e 62 72 69 64 20 49 4e 20 24 74      B.brid IN $t
66f0: 68 65 73 65 74 20 20 20 20 20 20 2d 2d 20 57 68  heset      -- Wh
6700: 69 63 68 20 69 73 20 61 6c 73 6f 20 6f 66 20 69  ich is also of i
6710: 6e 74 65 72 65 73 74 0a 20 20 20 20 55 4e 49 4f  nterest.    UNIO
6720: 4e 0a 20 20 20 20 2d 2d 20 28 34 29 20 43 68 69  N.    -- (4) Chi
6730: 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74  ld of trunk root
6740: 20 73 75 63 63 65 73 73 6f 72 20 6f 66 20 6c 61   successor of la
6750: 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b  st NTDB on trunk
6760: 2e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e  ...    SELECT R.
6770: 72 69 64 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20  rid, RA.child.. 
6780: 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e     FROM revision
6790: 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 0a   R, revision RA.
67a0: 09 20 20 20 20 57 48 45 52 45 20 52 2e 72 69 64  .    WHERE R.rid
67b0: 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20     IN $theset   
67c0: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74     -- Restrict t
67d0: 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69  o revisions of i
67e0: 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44  nterest..    AND
67f0: 20 20 20 52 2e 69 73 64 65 66 61 75 6c 74 20 20     R.isdefault  
6800: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 52 65             -- Re
6810: 73 74 72 69 63 74 20 74 6f 20 4e 54 44 42 0a 09  strict to NTDB..
6820: 20 20 20 20 41 4e 44 20 20 20 52 2e 64 62 63 68      AND   R.dbch
6830: 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  ild IS NOT NULL 
6840: 20 20 2d 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54    -- and last NT
6850: 44 42 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  DB belonging to 
6860: 74 72 75 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20  trunk..    AND  
6870: 20 52 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 68   RA.rid = R.dbch
6880: 69 6c 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 64  ild      -- Go d
6890: 69 72 65 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b  irectly to trunk
68a0: 20 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20   root..    AND  
68b0: 20 52 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54   RA.child IS NOT
68c0: 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20   NULL    -- Has 
68d0: 70 72 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 20  primary child.. 
68e0: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20             AND  
68f0: 20 52 41 2e 63 68 69 6c 64 20 49 4e 20 24 74 68   RA.child IN $th
6900: 65 73 65 74 20 20 20 20 20 2d 2d 20 57 68 69 63  eset     -- Whic
6910: 68 20 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e 74  h is also of int
6920: 65 72 65 73 74 0a 09 22 5d 20 7b 0a 09 20 20 20  erest.."] {..   
6930: 20 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69   # Consider movi
6940: 6e 67 20 74 68 69 73 20 74 6f 20 74 68 65 20 69  ng this to the i
6950: 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e  ntegrity module.
6960: 0a 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 20  ..    integrity 
6970: 61 73 73 65 72 74 20 7b 24 72 69 64 20 21 3d 20  assert {$rid != 
6980: 24 63 68 69 6c 64 7d 20 7b 52 65 76 69 73 69 6f  $child} {Revisio
6990: 6e 20 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f  n $rid depends o
69a0: 6e 20 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20  n itself.}..    
69b0: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e  lappend dependen
69c0: 63 69 65 73 28 24 72 69 64 29 20 24 63 68 69 6c  cies($rid) $chil
69d0: 64 0a 09 20 20 20 20 73 65 74 20 64 65 70 28 24  d..    set dep($
69e0: 72 69 64 2c 24 63 68 69 6c 64 29 20 2e 0a 09 7d  rid,$child) ...}
69f0: 0a 0a 09 23 20 54 68 65 20 73 71 6c 20 73 74 61  ...# The sql sta
6a00: 74 65 6d 65 6e 74 73 20 61 62 6f 76 65 20 6c 6f  tements above lo
6a10: 6f 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 64 69 72  oks only for dir
6a20: 65 63 74 20 64 65 70 65 6e 64 65 6e 63 69 65 73  ect dependencies
6a30: 0a 09 23 20 62 65 74 77 65 65 6e 20 72 65 76 69  ..# between revi
6a40: 73 69 6f 6e 20 69 6e 20 74 68 65 20 63 68 61 6e  sion in the chan
6a50: 67 65 73 65 74 2e 20 48 6f 77 65 76 65 72 20 64  geset. However d
6a60: 75 65 20 74 6f 20 74 68 65 0a 09 23 20 76 61 67  ue to the..# vag
6a70: 61 72 69 65 73 20 6f 66 20 6d 65 74 61 20 64 61  aries of meta da
6a80: 74 61 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  ta it is possibl
6a90: 65 20 66 6f 72 20 74 77 6f 20 72 65 76 69 73 69  e for two revisi
6aa0: 6f 6e 73 20 6f 66 0a 09 23 20 74 68 65 20 73 61  ons of..# the sa
6ab0: 6d 65 20 66 69 6c 65 20 74 6f 20 65 6e 64 20 75  me file to end u
6ac0: 70 20 69 6e 20 74 68 65 20 73 61 6d 65 20 63 68  p in the same ch
6ad0: 61 6e 67 65 73 65 74 2c 20 77 69 74 68 6f 75 74  angeset, without
6ae0: 20 61 0a 09 23 20 64 69 72 65 63 74 20 64 65 70   a..# direct dep
6af0: 65 6e 64 65 6e 63 79 20 62 65 74 77 65 65 6e 20  endency between 
6b00: 74 68 65 6d 2e 20 48 6f 77 65 76 65 72 20 77 65  them. However we
6b10: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 72 65   know that there
6b20: 0a 09 23 20 68 61 73 20 74 6f 20 62 65 20 61 20  ..# has to be a 
6b30: 61 6e 20 69 6e 64 69 72 65 63 74 20 64 65 70 65  an indirect depe
6b40: 6e 64 65 6e 63 79 2c 20 62 65 20 69 74 20 74 68  ndency, be it th
6b50: 72 6f 75 67 68 20 70 72 69 6d 61 72 79 0a 09 23  rough primary..#
6b60: 20 63 68 69 6c 64 72 65 6e 2c 20 62 72 61 6e 63   children, branc
6b70: 68 20 63 68 69 6c 64 72 65 6e 2c 20 6f 72 20 61  h children, or a
6b80: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68 65   combination the
6b90: 72 65 6f 66 2e 0a 0a 09 23 20 57 65 20 6e 6f 77  reof....# We now
6ba0: 20 66 69 6c 6c 20 69 6e 20 74 68 65 73 65 20 70   fill in these p
6bb0: 73 65 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63 69  seudo-dependenci
6bc0: 65 73 2c 20 69 66 20 6e 6f 20 73 75 63 68 0a 09  es, if no such..
6bd0: 23 20 64 65 70 65 6e 64 65 6e 63 79 20 65 78 69  # dependency exi
6be0: 73 74 73 20 61 6c 72 65 61 64 79 2e 20 54 68 65  sts already. The
6bf0: 20 64 69 72 65 63 74 69 6f 6e 20 6f 66 20 74 68   direction of th
6c00: 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 09 23 20  e dependency..# 
6c10: 69 73 20 61 63 74 75 61 6c 6c 79 20 69 72 72 65  is actually irre
6c20: 6c 65 76 61 6e 74 20 66 6f 72 20 74 68 69 73 2e  levant for this.
6c30: 0a 0a 09 23 20 4e 4f 54 45 3a 20 54 68 69 73 20  ...# NOTE: This 
6c40: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
6c50: 6d 20 63 76 73 32 73 76 6e 2e 20 4f 75 72 20 73  m cvs2svn. Our s
6c60: 70 69 72 69 74 75 61 6c 20 61 6e 63 65 73 74 6f  piritual ancesto
6c70: 72 0a 09 23 20 64 6f 65 73 20 6e 6f 74 20 75 73  r..# does not us
6c80: 65 20 73 75 63 68 20 70 73 65 75 64 6f 2d 64 65  e such pseudo-de
6c90: 70 65 6e 64 65 6e 63 69 65 73 2c 20 68 6f 77 65  pendencies, howe
6ca0: 76 65 72 20 69 74 20 75 73 65 73 20 61 0a 09 23  ver it uses a..#
6cb0: 20 43 4f 4d 4d 49 54 5f 54 48 52 45 53 48 4f 4c   COMMIT_THRESHOL
6cc0: 44 2c 20 61 20 74 69 6d 65 20 69 6e 74 65 72 76  D, a time interv
6cd0: 61 6c 20 63 6f 6d 6d 69 74 73 20 73 68 6f 75 6c  al commits shoul
6ce0: 64 20 66 61 6c 6c 2e 20 54 68 69 73 0a 09 23 20  d fall. This..# 
6cf0: 77 69 6c 6c 20 67 72 65 61 74 6c 79 20 72 65 64  will greatly red
6d00: 75 63 65 73 20 74 68 65 20 72 69 73 6b 20 6f 66  uces the risk of
6d10: 20 67 65 74 74 69 6e 67 20 66 61 72 20 73 65 70   getting far sep
6d20: 61 72 61 74 65 64 0a 09 23 20 72 65 76 69 73 69  arated..# revisi
6d30: 6f 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ons of the same 
6d40: 66 69 6c 65 20 69 6e 74 6f 20 6f 6e 65 20 63 68  file into one ch
6d50: 61 6e 67 65 73 65 74 2e 0a 0a 09 23 20 57 65 20  angeset....# We 
6d60: 61 6c 6c 6f 77 20 72 65 76 69 73 69 6f 6e 73 20  allow revisions 
6d70: 74 6f 20 62 65 20 66 61 72 20 61 70 61 72 74 20  to be far apart 
6d80: 69 6e 20 74 69 6d 65 20 69 6e 20 74 68 65 20 73  in time in the s
6d90: 61 6d 65 0a 09 23 20 63 68 61 6e 67 65 73 65 74  ame..# changeset
6da0: 2c 20 62 75 74 20 69 6e 20 74 75 72 6e 20 6e 65  , but in turn ne
6db0: 65 64 20 74 68 65 20 70 73 65 75 64 6f 2d 64 65  ed the pseudo-de
6dc0: 70 65 6e 64 65 6e 63 69 65 73 20 74 6f 0a 09 23  pendencies to..#
6dd0: 20 68 61 6e 64 6c 65 20 74 68 69 73 2e 0a 0a 09   handle this....
6de0: 61 72 72 61 79 20 73 65 74 20 66 69 64 73 20 7b  array set fids {
6df0: 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20  }..foreach {rid 
6e00: 66 69 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20  fid} [state run 
6e10: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e  "..    SELECT R.
6e20: 72 69 64 2c 20 52 2e 66 69 64 0a 20 20 20 20 20  rid, R.fid.     
6e30: 20 20 20 20 20 20 20 46 52 4f 4d 20 20 20 72 65         FROM   re
6e40: 76 69 73 69 6f 6e 20 52 0a 20 20 20 20 20 20 20  vision R.       
6e50: 20 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69       WHERE  R.ri
6e60: 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 22 5d  d IN $theset.."]
6e70: 20 7b 20 6c 61 70 70 65 6e 64 20 66 69 64 73 28   { lappend fids(
6e80: 24 66 69 64 29 20 24 72 69 64 20 7d 0a 0a 09 66  $fid) $rid }...f
6e90: 6f 72 65 61 63 68 20 7b 66 69 64 20 72 69 64 73  oreach {fid rids
6ea0: 7d 20 5b 61 72 72 61 79 20 67 65 74 20 66 69 64  } [array get fid
6eb0: 73 5d 20 7b 0a 09 20 20 20 20 69 66 20 7b 5b 6c  s] {..    if {[l
6ec0: 6c 65 6e 67 74 68 20 24 72 69 64 73 5d 20 3c 20  length $rids] < 
6ed0: 32 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 20 20 20  2} continue..   
6ee0: 20 66 6f 72 65 61 63 68 20 61 20 24 72 69 64 73   foreach a $rids
6ef0: 20 7b 0a 09 09 66 6f 72 65 61 63 68 20 62 20 24   {...foreach b $
6f00: 72 69 64 73 20 7b 0a 09 09 20 20 20 20 69 66 20  rids {...    if 
6f10: 7b 24 61 20 3d 3d 20 24 62 7d 20 63 6f 6e 74 69  {$a == $b} conti
6f20: 6e 75 65 0a 09 09 20 20 20 20 69 66 20 7b 5b 69  nue...    if {[i
6f30: 6e 66 6f 20 65 78 69 73 74 73 20 64 65 70 28 24  nfo exists dep($
6f40: 61 2c 24 62 29 5d 7d 20 63 6f 6e 74 69 6e 75 65  a,$b)]} continue
6f50: 0a 09 09 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  ...    if {[info
6f60: 20 65 78 69 73 74 73 20 64 65 70 28 24 62 2c 24   exists dep($b,$
6f70: 61 29 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 09  a)]} continue...
6f80: 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65      lappend depe
6f90: 6e 64 65 6e 63 69 65 73 28 24 61 29 20 24 62 0a  ndencies($a) $b.
6fa0: 09 09 20 20 20 20 73 65 74 20 64 65 70 28 24 61  ..    set dep($a
6fb0: 2c 24 62 29 20 2e 0a 09 09 20 20 20 20 73 65 74  ,$b) ....    set
6fc0: 20 64 65 70 28 24 62 2c 24 61 29 20 2e 0a 09 09   dep($b,$a) ....
6fd0: 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72 65 74  }..    }..}..ret
6fe0: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  urn.    }..    #
6ff0: 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20   var(dv) = dict 
7000: 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69  (item -> list (i
7010: 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c  tem)), item  = l
7020: 69 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 20  ist (type id).  
7030: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 73 75 63    typemethod suc
7040: 63 65 73 73 6f 72 73 20 7b 64 76 20 72 65 76 69  cessors {dv revi
7050: 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20  sions} {..upvar 
7060: 31 20 24 64 76 20 64 65 70 65 6e 64 65 6e 63 69  1 $dv dependenci
7070: 65 73 0a 09 73 65 74 20 74 68 65 73 65 74 20 28  es..set theset (
7080: 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e  '[join $revision
7090: 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 23 20 54  s {','}]')...# T
70a0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 73  he following cas
70b0: 65 73 20 73 70 65 63 69 66 79 20 77 68 65 6e 20  es specify when 
70c0: 61 20 72 65 76 69 73 69 6f 6e 20 53 20 69 73 20  a revision S is 
70d0: 61 20 73 75 63 63 65 73 73 6f 72 0a 09 23 20 6f  a successor..# o
70e0: 66 20 61 20 72 65 76 69 73 69 6f 6e 20 52 2e 20  f a revision R. 
70f0: 45 61 63 68 20 6f 66 20 74 68 65 20 63 61 73 65  Each of the case
7100: 73 20 74 72 61 6e 73 6c 61 74 65 73 20 69 6e 74  s translates int
7110: 6f 20 6f 6e 65 20 6f 66 0a 09 23 20 74 68 65 20  o one of..# the 
7120: 62 72 61 6e 63 68 65 73 20 6f 66 20 74 68 65 20  branches of the 
7130: 53 51 4c 20 55 4e 49 4f 4e 20 63 6f 6d 69 6e 67  SQL UNION coming
7140: 20 62 65 6c 6f 77 2e 0a 09 23 0a 09 23 20 28 31   below...#..# (1
7150: 29 20 53 20 63 61 6e 20 62 65 20 61 20 70 72 69  ) S can be a pri
7160: 6d 61 72 79 20 63 68 69 6c 64 20 6f 66 20 52 2c  mary child of R,
7170: 20 69 2e 65 2e 20 69 6e 20 74 68 65 20 73 61 6d   i.e. in the sam
7180: 65 20 4c 4f 44 2e 20 52 0a 09 23 20 20 20 20 20  e LOD. R..#     
7190: 72 65 66 65 72 65 6e 63 65 73 20 53 20 64 69 72  references S dir
71a0: 65 63 74 6c 79 2e 20 52 2e 63 68 69 6c 64 20 3d  ectly. R.child =
71b0: 20 53 28 2e 72 69 64 29 2c 20 69 66 20 69 74 20   S(.rid), if it 
71c0: 65 78 69 73 74 73 2e 0a 09 23 0a 09 23 20 28 32  exists...#..# (2
71d0: 29 20 53 20 63 61 6e 20 62 65 20 61 20 73 65 63  ) S can be a sec
71e0: 6f 6e 64 61 72 79 2c 20 69 2e 65 2e 20 62 72 61  ondary, i.e. bra
71f0: 6e 63 68 2c 20 63 68 69 6c 64 20 6f 66 20 52 2e  nch, child of R.
7200: 20 48 65 72 65 20 74 68 65 0a 09 23 20 20 20 20   Here the..#    
7210: 20 6c 69 6e 6b 20 69 73 20 6d 61 64 65 20 74 68   link is made th
7220: 72 6f 75 67 68 20 74 68 65 20 68 65 6c 70 65 72  rough the helper
7230: 20 74 61 62 6c 65 0a 09 23 20 20 20 20 20 52 45   table..#     RE
7240: 56 49 53 49 4f 4e 42 52 41 4e 43 48 43 48 49 4c  VISIONBRANCHCHIL
7250: 44 52 45 4e 2e 20 52 2e 72 69 64 20 2d 3e 20 52  DREN. R.rid -> R
7260: 42 43 2e 72 69 64 2c 20 52 42 43 2e 62 72 69 64  BC.rid, RBC.brid
7270: 20 3d 0a 09 23 20 20 20 20 20 53 28 2e 72 69 64   =..#     S(.rid
7280: 29 0a 09 23 0a 09 23 20 28 33 29 20 4f 72 69 67  )..#..# (3) Orig
7290: 69 6e 61 6c 6c 79 20 74 68 69 73 20 75 73 65 20  inally this use 
72a0: 63 61 73 65 20 64 65 66 69 6e 65 64 20 74 68 65  case defined the
72b0: 20 72 6f 6f 74 20 6f 66 20 61 20 64 65 74 61 63   root of a detac
72c0: 68 65 64 0a 09 23 20 20 20 20 20 4e 54 44 42 20  hed..#     NTDB 
72d0: 61 73 20 74 68 65 20 73 75 63 63 65 73 73 6f 72  as the successor
72e0: 20 6f 66 20 74 68 65 20 74 72 75 6e 6b 20 72 6f   of the trunk ro
72f0: 6f 74 2e 20 54 68 69 73 20 6c 65 61 64 73 20 74  ot. This leads t
7300: 6f 20 61 0a 09 23 20 20 20 20 20 62 61 64 20 74  o a..#     bad t
7310: 61 6e 67 6c 65 20 6c 61 74 65 72 20 6f 6e 2e 20  angle later on. 
7320: 57 69 74 68 20 61 20 64 65 74 61 63 68 65 64 20  With a detached 
7330: 4e 54 44 42 20 74 68 65 20 6f 72 69 67 69 6e 61  NTDB the origina
7340: 6c 0a 09 23 20 20 20 20 20 74 72 75 6e 6b 20 72  l..#     trunk r
7350: 6f 6f 74 20 72 65 76 69 73 69 6f 6e 20 77 61 73  oot revision was
7360: 20 72 65 6d 6f 76 65 64 20 61 73 20 69 72 72 65   removed as irre
7370: 6c 65 76 61 6e 74 2c 20 61 6c 6c 6f 77 69 6e 67  levant, allowing
7380: 0a 09 23 20 20 20 20 20 74 68 65 20 6e 6f 6d 69  ..#     the nomi
7390: 6e 61 6c 20 72 6f 6f 74 20 74 6f 20 62 65 20 6c  nal root to be l
73a0: 61 74 65 72 20 69 6e 20 74 69 6d 65 20 74 68 61  ater in time tha
73b0: 6e 20 74 68 65 20 4e 54 44 42 0a 09 23 20 20 20  n the NTDB..#   
73c0: 20 20 72 6f 6f 74 2e 20 4e 6f 77 20 73 65 74 74    root. Now sett
73d0: 69 6e 67 20 74 68 69 73 20 64 65 70 65 6e 64 65  ing this depende
73e0: 6e 63 79 20 77 69 6c 6c 20 62 65 20 62 61 63 6b  ncy will be back
73f0: 77 61 72 64 20 69 6e 0a 09 23 20 20 20 20 20 74  ward in..#     t
7400: 69 6d 65 2e 20 52 45 4d 4f 56 45 44 2e 0a 09 23  ime. REMOVED...#
7410: 0a 09 23 20 28 34 29 20 49 66 20 52 20 69 73 20  ..# (4) If R is 
7420: 74 68 65 20 6c 61 73 74 20 6f 66 20 74 68 65 20  the last of the 
7430: 4e 54 44 42 20 72 65 76 69 73 69 6f 6e 73 20 77  NTDB revisions w
7440: 68 69 63 68 20 62 65 6c 6f 6e 67 20 74 6f 0a 09  hich belong to..
7450: 23 20 20 20 20 20 74 68 65 20 74 72 75 6e 6b 2c  #     the trunk,
7460: 20 74 68 65 6e 20 74 68 65 20 70 72 69 6d 61 72   then the primar
7470: 79 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 74  y child of the t
7480: 72 75 6e 6b 20 72 6f 6f 74 20 28 74 68 65 0a 09  runk root (the..
7490: 23 20 20 20 20 20 27 31 2e 32 27 20 72 65 76 69  #     '1.2' revi
74a0: 73 69 6f 6e 29 20 69 73 20 61 20 73 75 63 63 65  sion) is a succe
74b0: 73 73 6f 72 2c 20 69 66 20 69 74 20 65 78 69 73  ssor, if it exis
74c0: 74 73 2e 0a 0a 09 23 20 4e 6f 74 65 20 74 68 61  ts....# Note tha
74d0: 74 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 73  t the branches s
74e0: 70 61 77 6e 65 64 20 66 72 6f 6d 20 74 68 65 20  pawned from the 
74f0: 72 65 76 69 73 69 6f 6e 73 2c 20 61 6e 64 20 74  revisions, and t
7500: 68 65 0a 09 23 20 74 61 67 73 20 61 73 73 6f 63  he..# tags assoc
7510: 69 61 74 65 64 20 77 69 74 68 20 74 68 65 6d 20  iated with them 
7520: 61 72 65 20 73 75 63 63 65 73 73 6f 72 73 20 61  are successors a
7530: 73 20 77 65 6c 6c 2e 0a 0a 09 66 6f 72 65 61 63  s well....foreac
7540: 68 20 7b 72 69 64 20 63 68 69 6c 64 7d 20 5b 73  h {rid child} [s
7550: 74 61 74 65 20 72 75 6e 20 22 0a 20 20 20 2d 2d  tate run ".   --
7560: 20 28 31 29 20 50 72 69 6d 61 72 79 20 63 68 69   (1) Primary chi
7570: 6c 64 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52  ld..    SELECT R
7580: 2e 72 69 64 2c 20 52 2e 63 68 69 6c 64 0a 09 20  .rid, R.child.. 
7590: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69     FROM   revisi
75a0: 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20  on R..    WHERE 
75b0: 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65   R.rid   IN $the
75c0: 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72  set     -- Restr
75d0: 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73  ict to revisions
75e0: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20   of interest..  
75f0: 20 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64    AND    R.child
7600: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
7610: 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 63  -- Has primary c
7620: 68 69 6c 64 0a 20 20 20 20 55 4e 49 4f 4e 0a 20  hild.    UNION. 
7630: 20 20 20 2d 2d 20 28 32 29 20 53 65 63 6f 6e 64     -- (2) Second
7640: 61 72 79 20 28 62 72 61 6e 63 68 29 20 63 68 69  ary (branch) chi
7650: 6c 64 72 65 6e 0a 09 20 20 20 20 53 45 4c 45 43  ldren..    SELEC
7660: 54 20 52 2e 72 69 64 2c 20 42 2e 62 72 69 64 0a  T R.rid, B.brid.
7670: 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69  .    FROM   revi
7680: 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e  sion R, revision
7690: 62 72 61 6e 63 68 63 68 69 6c 64 72 65 6e 20 42  branchchildren B
76a0: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72  ..    WHERE  R.r
76b0: 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20  id   IN $theset 
76c0: 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20      -- Restrict 
76d0: 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20  to revisions of 
76e0: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e  interest..    AN
76f0: 44 20 20 20 20 52 2e 72 69 64 20 3d 20 42 2e 72  D    R.rid = B.r
7700: 69 64 20 20 20 20 20 20 20 20 20 20 2d 2d 20 53  id          -- S
7710: 65 6c 65 63 74 20 73 75 62 73 65 74 20 6f 66 20  elect subset of 
7720: 62 72 61 6e 63 68 20 63 68 69 6c 64 72 65 6e 0a  branch children.
7730: 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d      UNION.    --
7740: 20 28 34 29 20 43 68 69 6c 64 20 6f 66 20 74 72   (4) Child of tr
7750: 75 6e 6b 20 72 6f 6f 74 20 73 75 63 63 65 73 73  unk root success
7760: 6f 72 20 6f 66 20 6c 61 73 74 20 4e 54 44 42 20  or of last NTDB 
7770: 6f 6e 20 74 72 75 6e 6b 2e 0a 09 20 20 20 20 53  on trunk...    S
7780: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 41 2e  ELECT R.rid, RA.
7790: 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20  child..    FROM 
77a0: 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69  revision R, revi
77b0: 73 69 6f 6e 20 52 41 0a 09 20 20 20 20 57 48 45  sion RA..    WHE
77c0: 52 45 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74  RE R.rid   IN $t
77d0: 68 65 73 65 74 20 20 20 20 20 20 2d 2d 20 52 65  heset      -- Re
77e0: 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69  strict to revisi
77f0: 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  ons of interest.
7800: 09 20 20 20 20 41 4e 44 20 20 20 52 2e 69 73 64  .    AND   R.isd
7810: 65 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20  efault          
7820: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74     -- Restrict t
7830: 6f 20 4e 54 44 42 0a 09 20 20 20 20 41 4e 44 20  o NTDB..    AND 
7840: 20 20 52 2e 64 62 63 68 69 6c 64 20 49 53 20 4e    R.dbchild IS N
7850: 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d 20 61 6e 64  OT NULL   -- and
7860: 20 6c 61 73 74 20 4e 54 44 42 20 62 65 6c 6f 6e   last NTDB belon
7870: 67 69 6e 67 20 74 6f 20 74 72 75 6e 6b 0a 09 20  ging to trunk.. 
7880: 20 20 20 41 4e 44 20 20 20 52 41 2e 72 69 64 20     AND   RA.rid 
7890: 3d 20 52 2e 64 62 63 68 69 6c 64 20 20 20 20 20  = R.dbchild     
78a0: 20 2d 2d 20 47 6f 20 64 69 72 65 63 74 6c 79 20   -- Go directly 
78b0: 74 6f 20 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20  to trunk root.. 
78c0: 20 20 20 41 4e 44 20 20 20 52 41 2e 63 68 69 6c     AND   RA.chil
78d0: 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  d IS NOT NULL   
78e0: 20 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20   -- Has primary 
78f0: 63 68 69 6c 64 2e 0a 09 22 5d 20 7b 0a 09 20 20  child..."] {..  
7900: 20 20 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76    # Consider mov
7910: 69 6e 67 20 74 68 69 73 20 74 6f 20 74 68 65 20  ing this to the 
7920: 69 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 6c 65  integrity module
7930: 2e 0a 09 20 20 20 20 69 6e 74 65 67 72 69 74 79  ...    integrity
7940: 20 61 73 73 65 72 74 20 7b 24 72 69 64 20 21 3d   assert {$rid !=
7950: 20 24 63 68 69 6c 64 7d 20 7b 52 65 76 69 73 69   $child} {Revisi
7960: 6f 6e 20 24 72 69 64 20 64 65 70 65 6e 64 73 20  on $rid depends 
7970: 6f 6e 20 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20  on itself.}..   
7980: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65   lappend depende
7990: 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 65 76 20  ncies([list rev 
79a0: 24 72 69 64 5d 29 20 5b 6c 69 73 74 20 72 65 76  $rid]) [list rev
79b0: 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72   $child]..}..for
79c0: 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 7d  each {rid child}
79d0: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20   [state run ".. 
79e0: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c     SELECT R.rid,
79f0: 20 54 2e 74 69 64 0a 09 20 20 20 20 46 52 4f 4d   T.tid..    FROM
7a00: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 74     revision R, t
7a10: 61 67 20 54 0a 09 20 20 20 20 57 48 45 52 45 20  ag T..    WHERE 
7a20: 20 52 2e 72 69 64 20 69 6e 20 24 74 68 65 73 65   R.rid in $these
7a30: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 54 2e  t..    AND    T.
7a40: 72 65 76 20 3d 20 52 2e 72 69 64 0a 09 22 5d 20  rev = R.rid.."] 
7a50: 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64  {..    lappend d
7a60: 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73  ependencies([lis
7a70: 74 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c 69  t rev $rid]) [li
7a80: 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 63 68 69  st sym::tag $chi
7a90: 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20  ld]..}..foreach 
7aa0: 7b 72 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61  {rid child} [sta
7ab0: 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45  te run "..    SE
7ac0: 4c 45 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 69  LECT R.rid, B.bi
7ad0: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65  d..    FROM   re
7ae0: 76 69 73 69 6f 6e 20 52 2c 20 62 72 61 6e 63 68  vision R, branch
7af0: 20 42 0a 09 20 20 20 20 57 48 45 52 45 20 20 52   B..    WHERE  R
7b00: 2e 72 69 64 20 69 6e 20 24 74 68 65 73 65 74 0a  .rid in $theset.
7b10: 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 72 6f  .    AND    B.ro
7b20: 6f 74 20 3d 20 52 2e 72 69 64 0a 09 22 5d 20 7b  ot = R.rid.."] {
7b30: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65  ..    lappend de
7b40: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74  pendencies([list
7b50: 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c 69 73   rev $rid]) [lis
7b60: 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 63  t sym::branch $c
7b70: 68 69 6c 64 5d 0a 09 7d 0a 09 72 65 74 75 72 6e  hild]..}..return
7b80: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61  .    }..    # va
7b90: 72 28 64 76 29 20 3d 20 64 69 63 74 20 28 69 74  r(dv) = dict (it
7ba0: 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d  em -> list (item
7bb0: 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74  )), item  = list
7bc0: 20 28 74 79 70 65 20 69 64 29 0a 20 20 20 20 74   (type id).    t
7bd0: 79 70 65 6d 65 74 68 6f 64 20 70 72 65 64 65 63  ypemethod predec
7be0: 65 73 73 6f 72 73 20 7b 64 76 20 72 65 76 69 73  essors {dv revis
7bf0: 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31  ions} {..upvar 1
7c00: 20 24 64 76 20 64 65 70 65 6e 64 65 6e 63 69 65   $dv dependencie
7c10: 73 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27  s..set theset ('
7c20: 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73  [join $revisions
7c30: 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 23 20 54 68   {','}]')...# Th
7c40: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 73 65  e following case
7c50: 73 20 73 70 65 63 69 66 79 20 77 68 65 6e 20 61  s specify when a
7c60: 20 72 65 76 69 73 69 6f 6e 20 50 20 69 73 20 61   revision P is a
7c70: 0a 09 23 20 70 72 65 64 65 63 65 73 73 6f 72 20  ..# predecessor 
7c80: 6f 66 20 61 20 72 65 76 69 73 69 6f 6e 20 52 2e  of a revision R.
7c90: 20 45 61 63 68 20 6f 66 20 74 68 65 20 63 61 73   Each of the cas
7ca0: 65 73 20 74 72 61 6e 73 6c 61 74 65 73 0a 09 23  es translates..#
7cb0: 20 69 6e 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65   into one of the
7cc0: 20 62 72 61 6e 63 68 65 73 20 6f 66 20 74 68 65   branches of the
7cd0: 20 53 51 4c 20 55 4e 49 4f 4e 20 63 6f 6d 69 6e   SQL UNION comin
7ce0: 67 20 62 65 6c 6f 77 2e 0a 09 23 0a 09 23 20 28  g below...#..# (
7cf0: 31 29 20 54 68 65 20 69 6d 6d 65 64 69 61 74 65  1) The immediate
7d00: 20 70 61 72 65 6e 74 20 52 2e 70 61 72 65 6e 74   parent R.parent
7d10: 20 6f 66 20 52 20 69 73 20 61 20 70 72 65 64 65   of R is a prede
7d20: 63 65 73 73 6f 72 20 6f 66 0a 09 23 20 20 20 20  cessor of..#    
7d30: 20 52 2e 20 4e 4f 54 45 3a 20 54 68 69 73 20 69   R. NOTE: This i
7d40: 73 20 74 72 75 65 20 66 6f 72 20 52 20 65 69 74  s true for R eit
7d50: 68 65 72 20 70 72 69 6d 61 72 79 20 6f 72 20 73  her primary or s
7d60: 65 63 6f 6e 64 61 72 79 0a 09 23 20 20 20 20 20  econdary..#     
7d70: 63 68 69 6c 64 20 6f 66 20 50 2e 20 49 74 20 6e  child of P. It n
7d80: 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74 6f 20  ot necessary to 
7d90: 64 69 73 74 69 6e 67 75 69 73 68 20 74 68 65 20  distinguish the 
7da0: 74 77 6f 0a 09 23 20 20 20 20 20 63 61 73 65 73  two..#     cases
7db0: 2c 20 69 6e 20 63 6f 6e 74 72 61 73 74 20 74 6f  , in contrast to
7dc0: 20 74 68 65 20 63 6f 64 65 20 72 65 74 72 69 65   the code retrie
7dd0: 76 69 6e 67 20 74 68 65 20 73 75 63 63 65 73 73  ving the success
7de0: 6f 72 0a 09 23 20 20 20 20 20 69 6e 66 6f 72 6d  or..#     inform
7df0: 61 74 69 6f 6e 2e 0a 09 23 0a 09 23 20 28 32 29  ation...#..# (2)
7e00: 20 54 68 65 20 63 6f 6d 70 6c 65 6d 65 6e 74 20   The complement 
7e10: 6f 66 20 73 75 63 63 65 73 73 6f 72 20 63 61 73  of successor cas
7e20: 65 20 28 33 29 2e 20 54 68 65 20 74 72 75 6e 6b  e (3). The trunk
7e30: 20 72 6f 6f 74 20 69 73 0a 09 23 20 20 20 20 20   root is..#     
7e40: 61 20 70 72 65 64 65 63 65 73 73 6f 72 20 6f 66  a predecessor of
7e50: 20 61 20 4e 54 44 42 20 72 6f 6f 74 2e 20 52 45   a NTDB root. RE
7e60: 4d 4f 56 45 44 2e 20 53 65 65 20 27 73 75 63 63  MOVED. See 'succ
7e70: 65 73 73 6f 72 73 27 0a 09 23 20 20 20 20 20 66  essors'..#     f
7e80: 6f 72 20 74 68 65 20 65 78 70 6c 61 6e 61 74 69  or the explanati
7e90: 6f 6e 2e 0a 09 23 0a 09 23 20 28 33 29 20 54 68  on...#..# (3) Th
7ea0: 65 20 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66 20  e complement of 
7eb0: 73 75 63 63 65 73 73 6f 72 20 63 61 73 65 20 28  successor case (
7ec0: 34 29 2e 20 54 68 65 20 6c 61 73 74 20 4e 54 44  4). The last NTD
7ed0: 42 0a 09 23 20 20 20 20 20 72 65 76 69 73 69 6f  B..#     revisio
7ee0: 6e 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  n belonging to t
7ef0: 68 65 20 74 72 75 6e 6b 20 69 73 20 61 20 70 72  he trunk is a pr
7f00: 65 64 65 63 65 73 73 6f 72 20 6f 66 20 74 68 65  edecessor of the
7f10: 0a 09 23 20 20 20 20 20 70 72 69 6d 61 72 79 20  ..#     primary 
7f20: 63 68 69 6c 64 20 6f 66 20 74 68 65 20 74 72 75  child of the tru
7f30: 6e 6b 20 72 6f 6f 74 20 28 54 68 65 20 27 31 2e  nk root (The '1.
7f40: 32 27 20 72 65 76 69 73 69 6f 6e 29 2e 0a 0a 09  2' revision)....
7f50: 66 6f 72 65 61 63 68 20 7b 72 69 64 20 70 61 72  foreach {rid par
7f60: 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20  ent} [state run 
7f70: 22 0a 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d  ".   -- (1) Prim
7f80: 61 72 79 20 70 61 72 65 6e 74 2c 20 63 61 6e 20  ary parent, can 
7f90: 62 65 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20  be in different 
7fa0: 4c 4f 44 20 66 6f 72 20 66 69 72 73 74 20 69 6e  LOD for first in
7fb0: 20 61 20 62 72 61 6e 63 68 0a 09 20 20 20 20 53   a branch..    S
7fc0: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 70  ELECT R.rid, R.p
7fd0: 61 72 65 6e 74 0a 09 20 20 20 20 46 52 4f 4d 20  arent..    FROM 
7fe0: 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20    revision R..  
7ff0: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20    WHERE  R.rid  
8000: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20   IN $theset     
8010: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72  -- Restrict to r
8020: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65  evisions of inte
8030: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
8040: 20 52 2e 70 61 72 65 6e 74 20 49 53 20 4e 4f 54   R.parent IS NOT
8050: 20 4e 55 4c 4c 20 20 20 2d 2d 20 48 61 73 20 70   NULL   -- Has p
8060: 72 69 6d 61 72 79 20 70 61 72 65 6e 74 0a 20 20  rimary parent.  
8070: 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28    UNION.    -- (
8080: 33 29 20 4c 61 73 74 20 4e 54 44 42 20 6f 6e 20  3) Last NTDB on 
8090: 74 72 75 6e 6b 20 69 73 20 70 72 65 64 65 63 65  trunk is predece
80a0: 73 73 6f 72 20 6f 66 20 63 68 69 6c 64 20 6f 66  ssor of child of
80b0: 20 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20   trunk root..   
80c0: 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52   SELECT R.rid, R
80d0: 41 2e 64 62 70 61 72 65 6e 74 0a 09 20 20 20 20  A.dbparent..    
80e0: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20  FROM   revision 
80f0: 52 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 0a 09  R, revision RA..
8100: 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64      WHERE  R.rid
8110: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20   IN $theset     
8120: 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20      -- Restrict 
8130: 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20  to revisions of 
8140: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e  interest..    AN
8150: 44 20 20 20 20 4e 4f 54 20 52 2e 69 73 64 65 66  D    NOT R.isdef
8160: 61 75 6c 74 20 20 20 20 20 20 20 20 20 20 2d 2d  ault          --
8170: 20 6e 6f 74 20 6f 6e 20 4e 54 44 42 0a 09 20 20   not on NTDB..  
8180: 20 20 41 4e 44 20 20 20 20 52 2e 70 61 72 65 6e    AND    R.paren
8190: 74 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  t IS NOT NULL   
81a0: 20 20 2d 2d 20 77 68 69 63 68 20 61 72 65 20 6e    -- which are n
81b0: 6f 74 20 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44  ot root..    AND
81c0: 20 20 20 20 52 41 2e 72 69 64 20 3d 20 52 2e 70      RA.rid = R.p
81d0: 61 72 65 6e 74 20 20 20 20 20 20 20 20 2d 2d 20  arent        -- 
81e0: 67 6f 20 74 6f 20 74 68 65 69 72 20 70 61 72 65  go to their pare
81f0: 6e 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  nt..    AND    R
8200: 41 2e 64 62 70 61 72 65 6e 74 20 49 53 20 4e 4f  A.dbparent IS NO
8210: 54 20 4e 55 4c 4c 20 20 2d 2d 20 77 68 69 63 68  T NULL  -- which
8220: 20 68 61 73 20 74 6f 20 72 65 66 65 72 20 74 6f   has to refer to
8230: 20 4e 54 44 42 27 73 20 72 6f 6f 74 0a 09 22 5d   NTDB's root.."]
8240: 20 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 69 64   {..    # Consid
8250: 65 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 20 74  er moving this t
8260: 6f 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  o the integrity 
8270: 6d 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 6e 74  module...    int
8280: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24  egrity assert {$
8290: 72 69 64 20 21 3d 20 24 70 61 72 65 6e 74 7d 20  rid != $parent} 
82a0: 7b 52 65 76 69 73 69 6f 6e 20 24 72 69 64 20 64  {Revision $rid d
82b0: 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66  epends on itself
82c0: 2e 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20  .}..    lappend 
82d0: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69  dependencies([li
82e0: 73 74 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c  st rev $rid]) [l
82f0: 69 73 74 20 72 65 76 20 24 70 61 72 65 6e 74 5d  ist rev $parent]
8300: 0a 09 7d 0a 0a 09 23 20 54 68 65 20 72 65 76 69  ..}...# The revi
8310: 73 69 6f 6e 73 20 77 68 69 63 68 20 61 72 65 20  sions which are 
8320: 74 68 65 20 66 69 72 73 74 20 6f 6e 20 61 20 62  the first on a b
8330: 72 61 6e 63 68 20 68 61 76 65 20 74 68 61 74 0a  ranch have that.
8340: 09 23 20 62 72 61 6e 63 68 20 61 73 20 74 68 65  .# branch as the
8350: 69 72 20 70 72 65 64 65 63 65 73 73 6f 72 2e 20  ir predecessor. 
8360: 4e 6f 74 65 20 74 68 61 74 20 72 65 76 69 73 69  Note that revisi
8370: 6f 6e 73 20 63 61 6e 6e 6f 74 20 62 65 0a 09 23  ons cannot be..#
8380: 20 6f 6e 20 74 61 67 73 20 69 6e 20 74 68 65 20   on tags in the 
8390: 73 61 6d 65 20 6d 61 6e 6e 65 72 2c 20 73 6f 20  same manner, so 
83a0: 74 61 67 73 20 63 61 6e 6e 6f 74 20 62 65 20 70  tags cannot be p
83b0: 72 65 64 65 63 65 73 73 6f 72 73 0a 09 23 20 6f  redecessors..# o
83c0: 66 20 72 65 76 69 73 69 6f 6e 73 2e 20 54 68 69  f revisions. Thi
83d0: 73 20 63 6f 6d 70 6c 65 6d 65 6e 74 73 20 74 68  s complements th
83e0: 61 74 20 74 68 65 79 20 68 61 76 65 20 6e 6f 20  at they have no 
83f0: 73 75 63 63 65 73 73 6f 72 73 0a 09 23 20 28 53  successors..# (S
8400: 65 65 20 73 79 6d 3a 3a 74 61 67 2f 73 75 63 63  ee sym::tag/succ
8410: 65 73 73 6f 72 73 29 2e 0a 0a 09 66 6f 72 65 61  essors)....forea
8420: 63 68 20 7b 72 69 64 20 70 61 72 65 6e 74 7d 20  ch {rid parent} 
8430: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20  [state run "..  
8440: 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20    SELECT R.rid, 
8450: 42 2e 62 69 64 0a 09 20 20 20 20 46 52 4f 4d 20  B.bid..    FROM 
8460: 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 62 72    revision R, br
8470: 61 6e 63 68 20 42 0a 09 20 20 20 20 57 48 45 52  anch B..    WHER
8480: 45 20 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65  E  R.rid IN $the
8490: 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  set..    AND    
84a0: 42 2e 66 69 72 73 74 20 3d 20 52 2e 72 69 64 0a  B.first = R.rid.
84b0: 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65  ."] {..    lappe
84c0: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28  nd dependencies(
84d0: 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64 5d 29  [list rev $rid])
84e0: 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e   [list sym::bran
84f0: 63 68 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 09  ch $parent]..}..
8500: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20  return.    }..  
8510: 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73    # result = lis
8520: 74 20 28 63 68 61 6e 67 65 73 65 74 2d 69 64 29  t (changeset-id)
8530: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
8540: 63 73 5f 73 75 63 63 65 73 73 6f 72 73 20 7b 72  cs_successors {r
8550: 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 20 20 20 20  evisions} {.    
8560: 20 20 20 20 23 20 54 68 69 73 20 69 73 20 61 20      # This is a 
8570: 76 61 72 69 61 6e 74 20 6f 66 20 27 73 75 63 63  variant of 'succ
8580: 65 73 73 6f 72 73 27 20 77 68 69 63 68 20 6d 61  essors' which ma
8590: 70 73 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c  ps the low-level
85a0: 0a 20 20 20 20 20 20 20 20 23 20 64 61 74 61 20  .        # data 
85b0: 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
85c0: 61 73 73 6f 63 69 61 74 65 64 20 63 68 61 6e 67  associated chang
85d0: 65 73 65 74 73 2e 20 49 2e 65 2e 20 69 6e 73 74  esets. I.e. inst
85e0: 65 61 64 0a 20 20 20 20 20 20 20 20 23 20 6d 69  ead.        # mi
85f0: 6c 6c 69 6f 6e 73 20 6f 66 20 64 65 70 65 6e 64  llions of depend
8600: 65 6e 63 79 20 70 61 69 72 73 20 28 69 6e 20 65  ency pairs (in e
8610: 78 74 72 65 6d 65 20 63 61 73 65 73 20 28 45 78  xtreme cases (Ex
8620: 61 6d 70 6c 65 3a 20 54 63 6c 0a 20 20 20 20 20  ample: Tcl.     
8630: 20 20 20 23 20 43 56 53 29 29 20 77 65 20 72 65     # CVS)) we re
8640: 74 75 72 6e 20 61 20 76 65 72 79 20 73 68 6f 72  turn a very shor
8650: 74 20 61 6e 64 20 6d 75 63 68 20 6d 6f 72 65 20  t and much more 
8660: 6d 61 6e 61 67 65 61 62 6c 65 20 6c 69 73 74 0a  manageable list.
8670: 20 20 20 20 20 20 20 20 23 20 6f 66 20 63 68 61          # of cha
8680: 6e 67 65 73 65 74 73 2e 0a 0a 09 73 65 74 20 74  ngesets....set t
8690: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72  heset ('[join $r
86a0: 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27  evisions {','}]'
86b0: 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61 74 65  )..return [state
86c0: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45   run "..    SELE
86d0: 43 54 20 43 2e 63 69 64 0a 09 20 20 20 20 46 52  CT C.cid..    FR
86e0: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c  OM   revision R,
86f0: 20 63 73 69 74 65 6d 20 43 49 2c 20 63 68 61 6e   csitem CI, chan
8700: 67 65 73 65 74 20 43 0a 09 20 20 20 20 57 48 45  geset C..    WHE
8710: 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24  RE  R.rid   IN $
8720: 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65  theset     -- Re
8730: 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69  strict to revisi
8740: 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  ons of interest.
8750: 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 63 68  .    AND    R.ch
8760: 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  ild IS NOT NULL 
8770: 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d 61 72     -- Has primar
8780: 79 20 63 68 69 6c 64 0a 20 20 20 20 20 20 20 20  y child.        
8790: 20 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69      AND    CI.ii
87a0: 64 20 3d 20 52 2e 72 69 64 0a 20 20 20 20 20 20  d = R.rid.      
87b0: 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e 63        AND    C.c
87c0: 69 64 20 3d 20 43 49 2e 63 69 64 0a 20 20 20 20  id = CI.cid.    
87d0: 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43          AND    C
87e0: 2e 74 79 70 65 20 3d 20 30 0a 20 20 20 20 55 4e  .type = 0.    UN
87f0: 49 4f 4e 0a 09 20 20 20 20 53 45 4c 45 43 54 20  ION..    SELECT 
8800: 43 2e 63 69 64 0a 09 20 20 20 20 46 52 4f 4d 20  C.cid..    FROM 
8810: 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65    revision R, re
8820: 76 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c  visionbranchchil
8830: 64 72 65 6e 20 42 2c 20 63 73 69 74 65 6d 20 43  dren B, csitem C
8840: 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43 0a 09  I, changeset C..
8850: 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64      WHERE  R.rid
8860: 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20     IN $theset   
8870: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f    -- Restrict to
8880: 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e   revisions of in
8890: 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20  terest..    AND 
88a0: 20 20 20 52 2e 72 69 64 20 3d 20 42 2e 72 69 64     R.rid = B.rid
88b0: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 53 65 6c            -- Sel
88c0: 65 63 74 20 73 75 62 73 65 74 20 6f 66 20 62 72  ect subset of br
88d0: 61 6e 63 68 20 63 68 69 6c 64 72 65 6e 0a 20 20  anch children.  
88e0: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20            AND   
88f0: 20 43 49 2e 69 69 64 20 3d 20 52 2e 72 69 64 0a   CI.iid = R.rid.
8900: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
8910: 20 20 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69     C.cid = CI.ci
8920: 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e  d.            AN
8930: 44 20 20 20 20 43 2e 74 79 70 65 20 3d 20 30 0a  D    C.type = 0.
8940: 20 20 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 53      UNION..    S
8950: 45 4c 45 43 54 20 43 2e 63 69 64 0a 09 20 20 20  ELECT C.cid..   
8960: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
8970: 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 2c   R, revision RA,
8980: 20 63 73 69 74 65 6d 20 43 49 2c 20 63 68 61 6e   csitem CI, chan
8990: 67 65 73 65 74 20 43 0a 09 20 20 20 20 57 48 45  geset C..    WHE
89a0: 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24  RE  R.rid   IN $
89b0: 74 68 65 73 65 74 20 20 20 20 20 20 2d 2d 20 52  theset      -- R
89c0: 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73  estrict to revis
89d0: 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74  ions of interest
89e0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 69  ..    AND    R.i
89f0: 73 64 65 66 61 75 6c 74 20 20 20 20 20 20 20 20  sdefault        
8a00: 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74       -- Restrict
8a10: 20 74 6f 20 4e 54 44 42 0a 09 20 20 20 20 41 4e   to NTDB..    AN
8a20: 44 20 20 20 20 52 2e 64 62 63 68 69 6c 64 20 49  D    R.dbchild I
8a30: 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d 20  S NOT NULL   -- 
8a40: 61 6e 64 20 6c 61 73 74 20 4e 54 44 42 20 62 65  and last NTDB be
8a50: 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72 75 6e 6b  longing to trunk
8a60: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 41 2e  ..    AND    RA.
8a70: 72 69 64 20 3d 20 52 2e 64 62 63 68 69 6c 64 20  rid = R.dbchild 
8a80: 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 72 65 63       -- Go direc
8a90: 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 72 6f 6f  tly to trunk roo
8aa0: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 41  t..    AND    RA
8ab0: 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55  .child IS NOT NU
8ac0: 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69  LL    -- Has pri
8ad0: 6d 61 72 79 20 63 68 69 6c 64 2e 0a 20 20 20 20  mary child..    
8ae0: 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43          AND    C
8af0: 49 2e 69 69 64 20 3d 20 52 2e 72 69 64 0a 20 20  I.iid = R.rid.  
8b00: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20            AND   
8b10: 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69 64 0a   C.cid = CI.cid.
8b20: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
8b30: 20 20 20 43 2e 74 79 70 65 20 3d 20 30 0a 20 20     C.type = 0.  
8b40: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20            AND   
8b50: 20 43 49 2e 69 69 64 20 3d 20 52 2e 72 69 64 0a   CI.iid = R.rid.
8b60: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
8b70: 20 20 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69     C.cid = CI.ci
8b80: 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e  d.            AN
8b90: 44 20 20 20 20 43 2e 74 79 70 65 20 3d 20 30 0a  D    C.type = 0.
8ba0: 20 20 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 53      UNION..    S
8bb0: 45 4c 45 43 54 20 43 2e 63 69 64 0a 09 20 20 20  ELECT C.cid..   
8bc0: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
8bd0: 20 52 2c 20 74 61 67 20 54 2c 20 63 73 69 74 65   R, tag T, csite
8be0: 6d 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20  m CI, changeset 
8bf0: 43 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e  C..    WHERE  R.
8c00: 72 69 64 20 69 6e 20 24 74 68 65 73 65 74 0a 09  rid in $theset..
8c10: 20 20 20 20 41 4e 44 20 20 20 20 54 2e 72 65 76      AND    T.rev
8c20: 20 3d 20 52 2e 72 69 64 0a 20 20 20 20 20 20 20   = R.rid.       
8c30: 20 20 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69       AND    CI.i
8c40: 69 64 20 3d 20 54 2e 74 69 64 0a 20 20 20 20 20  id = T.tid.     
8c50: 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e         AND    C.
8c60: 63 69 64 20 3d 20 43 49 2e 63 69 64 0a 20 20 20  cid = CI.cid.   
8c70: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20           AND    
8c80: 43 2e 74 79 70 65 20 3d 20 31 0a 20 20 20 20 55  C.type = 1.    U
8c90: 4e 49 4f 4e 0a 09 20 20 20 20 53 45 4c 45 43 54  NION..    SELECT
8ca0: 20 43 2e 63 69 64 0a 09 20 20 20 20 46 52 4f 4d   C.cid..    FROM
8cb0: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 62     revision R, b
8cc0: 72 61 6e 63 68 20 42 2c 20 63 73 69 74 65 6d 20  ranch B, csitem 
8cd0: 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43 0a  CI, changeset C.
8ce0: 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69  .    WHERE  R.ri
8cf0: 64 20 69 6e 20 24 74 68 65 73 65 74 0a 09 20 20  d in $theset..  
8d00: 20 20 41 4e 44 20 20 20 20 42 2e 72 6f 6f 74 20    AND    B.root 
8d10: 3d 20 52 2e 72 69 64 0a 20 20 20 20 20 20 20 20  = R.rid.        
8d20: 20 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69      AND    CI.ii
8d30: 64 20 3d 20 42 2e 62 69 64 0a 20 20 20 20 20 20  d = B.bid.      
8d40: 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e 63        AND    C.c
8d50: 69 64 20 3d 20 43 49 2e 63 69 64 0a 20 20 20 20  id = CI.cid.    
8d60: 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43          AND    C
8d70: 2e 74 79 70 65 20 3d 20 32 0a 09 22 5d 0a 20 20  .type = 2.."].  
8d80: 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23    }.}..# # ## ##
8d90: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
8da0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23   ############# #
8db0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8dc0: 23 23 23 23 0a 23 23 20 48 65 6c 70 65 72 20 73  ####.## Helper s
8dd0: 69 6e 67 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e  ingleton. Comman
8de0: 64 73 20 66 6f 72 20 74 61 67 20 73 79 6d 62 6f  ds for tag symbo
8df0: 6c 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73  l changesets...s
8e00: 6e 69 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a  nit::type ::vc::
8e10: 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a  fossil::import::
8e20: 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65  cvs::project::re
8e30: 76 3a 3a 73 79 6d 3a 3a 74 61 67 20 7b 0a 20 20  v::sym::tag {.  
8e40: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 72    typemethod byr
8e50: 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74  evision {} { ret
8e60: 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65  urn 0 }.    type
8e70: 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20  method bysymbol 
8e80: 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20    {} { return 1 
8e90: 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  }.    typemethod
8ea0: 20 69 73 74 61 67 20 20 20 20 20 20 7b 7d 20 7b   istag      {} {
8eb0: 20 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20   return 1 }.    
8ec0: 74 79 70 65 6d 65 74 68 6f 64 20 69 73 62 72 61  typemethod isbra
8ed0: 6e 63 68 20 20 20 7b 7d 20 7b 20 72 65 74 75 72  nch   {} { retur
8ee0: 6e 20 30 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d  n 0 }..    typem
8ef0: 65 74 68 6f 64 20 73 74 72 20 7b 74 61 67 7d 20  ethod str {tag} 
8f00: 7b 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20  {..struct::list 
8f10: 61 73 73 69 67 6e 20 5b 73 74 61 74 65 20 72 75  assign [state ru
8f20: 6e 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20  n {..    SELECT 
8f30: 53 2e 6e 61 6d 65 2c 20 46 2e 6e 61 6d 65 2c 20  S.name, F.name, 
8f40: 50 2e 6e 61 6d 65 0a 09 20 20 20 20 46 52 4f 4d  P.name..    FROM
8f50: 20 20 20 74 61 67 20 54 2c 20 73 79 6d 62 6f 6c     tag T, symbol
8f60: 20 53 2c 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a   S, file F, proj
8f70: 65 63 74 20 50 0a 09 20 20 20 20 57 48 45 52 45  ect P..    WHERE
8f80: 20 20 54 2e 74 69 64 20 3d 20 24 74 61 67 0a 09    T.tid = $tag..
8f90: 20 20 20 20 41 4e 44 20 20 20 20 46 2e 66 69 64      AND    F.fid
8fa0: 20 3d 20 54 2e 66 69 64 0a 09 20 20 20 20 41 4e   = T.fid..    AN
8fb0: 44 20 20 20 20 50 2e 70 69 64 20 3d 20 46 2e 70  D    P.pid = F.p
8fc0: 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 53  id..    AND    S
8fd0: 2e 73 69 64 20 3d 20 54 2e 73 69 64 0a 09 7d 5d  .sid = T.sid..}]
8fe0: 20 73 6e 61 6d 65 20 66 6e 61 6d 65 20 70 6e 61   sname fname pna
8ff0: 6d 65 0a 09 72 65 74 75 72 6e 20 22 24 70 6e 61  me..return "$pna
9000: 6d 65 2f 54 27 24 7b 73 6e 61 6d 65 7d 27 3a 3a  me/T'${sname}'::
9010: 24 66 6e 61 6d 65 22 0a 20 20 20 20 7d 0a 0a 20  $fname".    }.. 
9020: 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69     # result = li
9030: 73 74 20 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 78  st (mintime, max
9040: 74 69 6d 65 29 0a 20 20 20 20 74 79 70 65 6d 65  time).    typeme
9050: 74 68 6f 64 20 74 69 6d 65 72 61 6e 67 65 20 7b  thod timerange {
9060: 74 61 67 73 7d 20 7b 0a 09 23 20 54 68 65 20 72  tags} {..# The r
9070: 61 6e 67 65 20 69 73 20 64 65 66 69 6e 65 64 20  ange is defined 
9080: 61 73 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20  as the range of 
9090: 74 68 65 20 72 65 76 69 73 69 6f 6e 73 20 74 68  the revisions th
90a0: 65 20 74 61 67 73 0a 09 23 20 61 72 65 20 61 74  e tags..# are at
90b0: 74 61 63 68 65 64 20 74 6f 2e 0a 0a 09 73 65 74  tached to....set
90c0: 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20   theset ('[join 
90d0: 24 74 61 67 73 20 7b 27 2c 27 7d 5d 27 29 0a 09  $tags {','}]')..
90e0: 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75  return [state ru
90f0: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20  n "..    SELECT 
9100: 4d 49 4e 28 52 2e 64 61 74 65 29 2c 20 4d 41 58  MIN(R.date), MAX
9110: 28 52 2e 64 61 74 65 29 0a 09 20 20 20 20 46 52  (R.date)..    FR
9120: 4f 4d 20 20 20 74 61 67 20 54 2c 20 72 65 76 69  OM   tag T, revi
9130: 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52  sion R..    WHER
9140: 45 20 20 54 2e 74 69 64 20 49 4e 20 24 74 68 65  E  T.tid IN $the
9150: 73 65 74 0a 20 20 20 20 20 20 20 20 20 20 20 20  set.            
9160: 41 4e 44 20 20 20 20 52 2e 72 69 64 20 3d 20 54  AND    R.rid = T
9170: 2e 72 65 76 0a 09 22 5d 0a 20 20 20 20 7d 0a 0a  .rev.."].    }..
9180: 20 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20      # var(dv) = 
9190: 64 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69  dict (item -> li
91a0: 73 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d  st (item)), item
91b0: 20 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69    = list (type i
91c0: 64 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  d).    typemetho
91d0: 64 20 73 75 63 63 65 73 73 6f 72 73 20 7b 64 76  d successors {dv
91e0: 20 74 61 67 73 7d 20 7b 0a 09 23 20 54 61 67 73   tags} {..# Tags
91f0: 20 68 61 76 65 20 6e 6f 20 73 75 63 63 65 73 73   have no success
9200: 6f 72 73 2e 0a 09 72 65 74 75 72 6e 0a 20 20 20  ors...return.   
9210: 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76   }..    # var(dv
9220: 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d  ) = dict (item -
9230: 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c 20  > list (item)), 
9240: 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 79  item  = list (ty
9250: 70 65 20 69 64 29 0a 20 20 20 20 74 79 70 65 6d  pe id).    typem
9260: 65 74 68 6f 64 20 70 72 65 64 65 63 65 73 73 6f  ethod predecesso
9270: 72 73 20 7b 64 76 20 74 61 67 73 7d 20 7b 0a 09  rs {dv tags} {..
9280: 75 70 76 61 72 20 31 20 24 64 76 20 64 65 70 65  upvar 1 $dv depe
9290: 6e 64 65 6e 63 69 65 73 0a 09 23 20 54 68 65 20  ndencies..# The 
92a0: 70 72 65 64 65 63 65 73 73 6f 72 73 20 6f 66 20  predecessors of 
92b0: 61 20 74 61 67 20 61 72 65 20 61 6c 6c 20 74 68  a tag are all th
92c0: 65 20 72 65 76 69 73 69 6f 6e 73 20 74 68 65 20  e revisions the 
92d0: 74 61 67 73 20 61 72 65 0a 09 23 20 61 74 74 61  tags are..# atta
92e0: 63 68 65 64 20 74 6f 2c 20 61 73 20 77 65 6c 6c  ched to, as well
92f0: 20 61 73 20 61 6c 6c 20 74 68 65 20 62 72 61 6e   as all the bran
9300: 63 68 65 73 20 6f 72 20 74 61 67 73 20 77 68 69  ches or tags whi
9310: 63 68 20 61 72 65 0a 09 23 20 74 68 65 69 72 20  ch are..# their 
9320: 70 72 65 66 65 72 65 64 20 70 61 72 65 6e 74 73  prefered parents
9330: 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20 28  ....set theset (
9340: 27 5b 6a 6f 69 6e 20 24 74 61 67 73 20 7b 27 2c  '[join $tags {',
9350: 27 7d 5d 27 29 0a 09 66 6f 72 65 61 63 68 20 7b  '}]')..foreach {
9360: 74 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61  tid parent} [sta
9370: 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45  te run "..    SE
9380: 4c 45 43 54 20 54 2e 74 69 64 2c 20 52 2e 72 69  LECT T.tid, R.ri
9390: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 74 61  d..    FROM   ta
93a0: 67 20 54 2c 20 72 65 76 69 73 69 6f 6e 20 52 0a  g T, revision R.
93b0: 09 20 20 20 20 57 48 45 52 45 20 20 54 2e 74 69  .    WHERE  T.ti
93c0: 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20  d IN $theset..  
93d0: 20 20 41 4e 44 20 20 20 20 54 2e 72 65 76 20 3d    AND    T.rev =
93e0: 20 52 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20   R.rid.."] {..  
93f0: 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64    lappend depend
9400: 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d  encies([list sym
9410: 3a 3a 74 61 67 20 24 74 69 64 5d 29 20 5b 6c 69  ::tag $tid]) [li
9420: 73 74 20 72 65 76 20 24 70 61 72 65 6e 74 5d 0a  st rev $parent].
9430: 09 7d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 74 69  .}...foreach {ti
9440: 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65  d parent} [state
9450: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45   run "..    SELE
9460: 43 54 20 54 2e 74 69 64 2c 20 42 2e 62 69 64 0a  CT T.tid, B.bid.
9470: 09 20 20 20 20 46 52 4f 4d 20 20 20 74 61 67 20  .    FROM   tag 
9480: 54 2c 20 70 72 65 66 65 72 65 64 70 61 72 65 6e  T, preferedparen
9490: 74 20 50 2c 20 62 72 61 6e 63 68 20 42 0a 09 20  t P, branch B.. 
94a0: 20 20 20 57 48 45 52 45 20 20 54 2e 74 69 64 20     WHERE  T.tid 
94b0: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20  IN $theset..    
94c0: 41 4e 44 20 20 20 20 54 2e 73 69 64 20 3d 20 50  AND    T.sid = P
94d0: 2e 73 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20  .sid..    AND   
94e0: 20 50 2e 70 69 64 20 3d 20 42 2e 73 69 64 0a 09   P.pid = B.sid..
94f0: 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e  "] {..    lappen
9500: 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b  d dependencies([
9510: 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 74  list sym::tag $t
9520: 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a  id]) [list sym::
9530: 62 72 61 6e 63 68 20 24 70 61 72 65 6e 74 5d 0a  branch $parent].
9540: 09 7d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 74 69  .}...foreach {ti
9550: 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65  d parent} [state
9560: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45   run "..    SELE
9570: 43 54 20 54 2e 74 69 64 2c 20 54 58 2e 74 69 64  CT T.tid, TX.tid
9580: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 74 61 67  ..    FROM   tag
9590: 20 54 2c 20 70 72 65 66 65 72 65 64 70 61 72 65   T, preferedpare
95a0: 6e 74 20 50 2c 20 74 61 67 20 54 58 0a 09 20 20  nt P, tag TX..  
95b0: 20 20 57 48 45 52 45 20 20 54 2e 74 69 64 20 49    WHERE  T.tid I
95c0: 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41  N $theset..    A
95d0: 4e 44 20 20 20 20 54 2e 73 69 64 20 3d 20 50 2e  ND    T.sid = P.
95e0: 73 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20  sid..    AND    
95f0: 50 2e 70 69 64 20 3d 20 54 58 2e 73 69 64 0a 09  P.pid = TX.sid..
9600: 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e  "] {..    lappen
9610: 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b  d dependencies([
9620: 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 74  list sym::tag $t
9630: 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a  id]) [list sym::
9640: 74 61 67 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a  tag $parent]..}.
9650: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
9660: 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69     # result = li
9670: 73 74 20 28 63 68 61 6e 67 65 73 65 74 2d 69 64  st (changeset-id
9680: 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ).    typemethod
9690: 20 63 73 5f 73 75 63 63 65 73 73 6f 72 73 20 7b   cs_successors {
96a0: 74 61 67 73 7d 20 7b 0a 09 23 20 54 61 67 73 20  tags} {..# Tags 
96b0: 68 61 76 65 20 6e 6f 20 73 75 63 63 65 73 73 6f  have no successo
96c0: 72 73 2e 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  rs...return.    
96d0: 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20  }.}..# # ## ### 
96e0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23  ##### ######## #
96f0: 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23 23  ############ ###
9700: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9710: 23 23 0a 23 23 20 48 65 6c 70 65 72 20 73 69 6e  ##.## Helper sin
9720: 67 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73  gleton. Commands
9730: 20 66 6f 72 20 62 72 61 6e 63 68 20 73 79 6d 62   for branch symb
9740: 6f 6c 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a  ol changesets...
9750: 73 6e 69 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a  snit::type ::vc:
9760: 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a  :fossil::import:
9770: 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72  :cvs::project::r
9780: 65 76 3a 3a 73 79 6d 3a 3a 62 72 61 6e 63 68 20  ev::sym::branch 
9790: 7b 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  {.    typemethod
97a0: 20 62 79 72 65 76 69 73 69 6f 6e 20 7b 7d 20 7b   byrevision {} {
97b0: 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20   return 0 }.    
97c0: 74 79 70 65 6d 65 74 68 6f 64 20 62 79 73 79 6d  typemethod bysym
97d0: 62 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 74 75 72  bol   {} { retur
97e0: 6e 20 31 20 7d 0a 20 20 20 20 74 79 70 65 6d 65  n 1 }.    typeme
97f0: 74 68 6f 64 20 69 73 74 61 67 20 20 20 20 20 20  thod istag      
9800: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a  {} { return 0 }.
9810: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69      typemethod i
9820: 73 62 72 61 6e 63 68 20 20 20 7b 7d 20 7b 20 72  sbranch   {} { r
9830: 65 74 75 72 6e 20 31 20 7d 0a 0a 20 20 20 20 74  eturn 1 }..    t
9840: 79 70 65 6d 65 74 68 6f 64 20 73 74 72 20 7b 62  ypemethod str {b
9850: 72 61 6e 63 68 7d 20 7b 0a 09 73 74 72 75 63 74  ranch} {..struct
9860: 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b 73  ::list assign [s
9870: 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20  tate run {..    
9880: 53 45 4c 45 43 54 20 53 2e 6e 61 6d 65 2c 20 46  SELECT S.name, F
9890: 2e 6e 61 6d 65 2c 20 50 2e 6e 61 6d 65 0a 09 20  .name, P.name.. 
98a0: 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68     FROM   branch
98b0: 20 42 2c 20 73 79 6d 62 6f 6c 20 53 2c 20 66 69   B, symbol S, fi
98c0: 6c 65 20 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a  le F, project P.
98d0: 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69  .    WHERE  B.bi
98e0: 64 20 3d 20 24 62 72 61 6e 63 68 0a 09 20 20 20  d = $branch..   
98f0: 20 41 4e 44 20 20 20 20 46 2e 66 69 64 20 3d 20   AND    F.fid = 
9900: 42 2e 66 69 64 0a 09 20 20 20 20 41 4e 44 20 20  B.fid..    AND  
9910: 20 20 50 2e 70 69 64 20 3d 20 46 2e 70 69 64 0a    P.pid = F.pid.
9920: 09 20 20 20 20 41 4e 44 20 20 20 20 53 2e 73 69  .    AND    S.si
9930: 64 20 3d 20 42 2e 73 69 64 0a 09 7d 5d 20 73 6e  d = B.sid..}] sn
9940: 61 6d 65 20 66 6e 61 6d 65 20 70 6e 61 6d 65 0a  ame fname pname.
9950: 09 72 65 74 75 72 6e 20 22 24 70 6e 61 6d 65 2f  .return "$pname/
9960: 42 27 24 7b 73 6e 61 6d 65 7d 27 3a 3a 24 66 6e  B'${sname}'::$fn
9970: 61 6d 65 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ame".    }..    
9980: 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73 74 20  # result = list 
9990: 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74 69 6d  (mintime, maxtim
99a0: 65 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  e).    typemetho
99b0: 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 62 72 61  d timerange {bra
99c0: 6e 63 68 65 73 7d 20 7b 0a 09 23 20 54 68 65 20  nches} {..# The 
99d0: 72 61 6e 67 65 20 6f 66 20 61 20 62 72 61 6e 63  range of a branc
99e0: 68 20 69 73 20 64 65 66 69 6e 65 64 20 61 73 20  h is defined as 
99f0: 74 68 65 20 72 61 6e 67 65 20 6f 66 20 74 68 65  the range of the
9a00: 0a 09 23 20 72 65 76 69 73 69 6f 6e 73 20 74 68  ..# revisions th
9a10: 65 20 62 72 61 6e 63 68 65 73 20 61 72 65 20 73  e branches are s
9a20: 70 61 77 6e 65 64 20 62 79 2e 20 4e 4f 54 45 20  pawned by. NOTE 
9a30: 68 6f 77 65 76 65 72 20 74 68 61 74 20 74 68 65  however that the
9a40: 0a 09 23 20 62 72 61 6e 63 68 65 73 20 61 73 73  ..# branches ass
9a50: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
9a60: 65 74 61 63 68 65 64 20 4e 54 44 42 20 77 69 6c  etached NTDB wil
9a70: 6c 20 68 61 76 65 20 6e 6f 20 72 6f 6f 74 0a 09  l have no root..
9a80: 23 20 73 70 61 77 6e 69 6e 67 20 74 68 65 6d 2c  # spawning them,
9a90: 20 68 65 6e 63 65 20 74 68 65 79 20 68 61 76 65   hence they have
9aa0: 20 6e 6f 20 72 65 61 6c 20 74 69 6d 65 72 61 6e   no real timeran
9ab0: 67 65 20 61 6e 79 0a 09 23 20 6c 6f 6e 67 65 72  ge any..# longer
9ac0: 2e 20 42 79 20 75 73 69 6e 67 20 30 20 77 65 20  . By using 0 we 
9ad0: 70 75 74 20 74 68 65 6d 20 69 6e 20 66 72 6f 6e  put them in fron
9ae0: 74 20 6f 66 20 65 76 65 72 79 74 68 69 6e 67 20  t of everything 
9af0: 65 6c 73 65 2c 0a 09 23 20 61 73 20 74 68 65 79  else,..# as they
9b00: 20 6c 6f 67 69 63 61 6c 6c 79 20 61 72 65 2e 0a   logically are..
9b10: 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b  ..set theset ('[
9b20: 6a 6f 69 6e 20 24 62 72 61 6e 63 68 65 73 20 7b  join $branches {
9b30: 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20  ','}]')..return 
9b40: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20  [state run "..  
9b50: 20 20 53 45 4c 45 43 54 20 49 46 4e 55 4c 4c 28    SELECT IFNULL(
9b60: 4d 49 4e 28 52 2e 64 61 74 65 29 2c 30 29 2c 20  MIN(R.date),0), 
9b70: 49 46 4e 55 4c 4c 28 4d 41 58 28 52 2e 64 61 74  IFNULL(MAX(R.dat
9b80: 65 29 2c 30 29 0a 09 20 20 20 20 46 52 4f 4d 20  e),0)..    FROM 
9b90: 20 62 72 61 6e 63 68 20 42 2c 20 72 65 76 69 73   branch B, revis
9ba0: 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45  ion R..    WHERE
9bb0: 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65   B.bid IN $these
9bc0: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e  t.            AN
9bd0: 44 20 20 20 52 2e 72 69 64 20 3d 20 42 2e 72 6f  D   R.rid = B.ro
9be0: 6f 74 0a 09 22 5d 0a 20 20 20 20 7d 0a 0a 20 20  ot.."].    }..  
9bf0: 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 69    # var(dv) = di
9c00: 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74  ct (item -> list
9c10: 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 20   (item)), item  
9c20: 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69 64 29  = list (type id)
9c30: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
9c40: 73 75 63 63 65 73 73 6f 72 73 20 7b 64 76 20 62  successors {dv b
9c50: 72 61 6e 63 68 65 73 7d 20 7b 0a 09 75 70 76 61  ranches} {..upva
9c60: 72 20 31 20 24 64 76 20 64 65 70 65 6e 64 65 6e  r 1 $dv dependen
9c70: 63 69 65 73 0a 09 23 20 54 68 65 20 66 69 72 73  cies..# The firs
9c80: 74 20 72 65 76 69 73 69 6f 6e 20 63 6f 6d 6d 69  t revision commi
9c90: 74 74 65 64 20 6f 6e 20 61 20 62 72 61 6e 63 68  tted on a branch
9ca0: 2c 20 61 6e 64 20 61 6c 6c 20 62 72 61 6e 63 68  , and all branch
9cb0: 65 73 0a 09 23 20 61 6e 64 20 74 61 67 73 20 77  es..# and tags w
9cc0: 68 69 63 68 20 68 61 76 65 20 69 74 20 61 73 20  hich have it as 
9cd0: 74 68 65 69 72 20 70 72 65 66 65 72 65 64 20 70  their prefered p
9ce0: 61 72 65 6e 74 20 61 72 65 20 74 68 65 0a 09 23  arent are the..#
9cf0: 20 73 75 63 63 65 73 73 6f 72 73 20 6f 66 20 61   successors of a
9d00: 20 62 72 61 6e 63 68 2e 0a 0a 09 73 65 74 20 74   branch....set t
9d10: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62  heset ('[join $b
9d20: 72 61 6e 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29  ranches {','}]')
9d30: 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64 20 63  ..foreach {bid c
9d40: 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e  hild} [state run
9d50: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42   "..    SELECT B
9d60: 2e 62 69 64 2c 20 52 2e 72 69 64 0a 09 20 20 20  .bid, R.rid..   
9d70: 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42   FROM   branch B
9d80: 2c 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20  , revision R..  
9d90: 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49    WHERE  B.bid I
9da0: 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41  N $theset..    A
9db0: 4e 44 20 20 20 20 42 2e 66 69 72 73 74 20 3d 20  ND    B.first = 
9dc0: 52 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20  R.rid.."] {..   
9dd0: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65   lappend depende
9de0: 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a  ncies([list sym:
9df0: 3a 74 61 67 20 24 62 69 64 5d 29 20 5b 6c 69 73  :tag $bid]) [lis
9e00: 74 20 72 65 76 20 24 63 68 69 6c 64 5d 0a 09 7d  t rev $child]..}
9e10: 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64 20 63  ..foreach {bid c
9e20: 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e  hild} [state run
9e30: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42   "..    SELECT B
9e40: 2e 62 69 64 2c 20 42 58 2e 62 69 64 0a 09 20 20  .bid, BX.bid..  
9e50: 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20    FROM   branch 
9e60: 42 2c 20 70 72 65 66 65 72 65 64 70 61 72 65 6e  B, preferedparen
9e70: 74 20 50 2c 20 62 72 61 6e 63 68 20 42 58 0a 09  t P, branch BX..
9e80: 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 64      WHERE  B.bid
9e90: 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20   IN $theset..   
9ea0: 20 41 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20   AND    B.sid = 
9eb0: 50 2e 70 69 64 0a 09 20 20 20 20 41 4e 44 20 20  P.pid..    AND  
9ec0: 20 20 42 58 2e 73 69 64 20 3d 20 50 2e 73 69 64    BX.sid = P.sid
9ed0: 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70  .."] {..    lapp
9ee0: 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73  end dependencies
9ef0: 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20  ([list sym::tag 
9f00: 24 62 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d  $bid]) [list sym
9f10: 3a 3a 62 72 61 6e 63 68 20 24 63 68 69 6c 64 5d  ::branch $child]
9f20: 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62 69  ..}..foreach {bi
9f30: 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20  d child} [state 
9f40: 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43  run "..    SELEC
9f50: 54 20 42 2e 62 69 64 2c 20 54 2e 74 69 64 0a 09  T B.bid, T.tid..
9f60: 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63      FROM   branc
9f70: 68 20 42 2c 20 70 72 65 66 65 72 65 64 70 61 72  h B, preferedpar
9f80: 65 6e 74 20 50 2c 20 74 61 67 20 54 0a 09 20 20  ent P, tag T..  
9f90: 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49    WHERE  B.bid I
9fa0: 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41  N $theset..    A
9fb0: 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50 2e  ND    B.sid = P.
9fc0: 70 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20  pid..    AND    
9fd0: 54 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a 09 22  T.sid = P.sid.."
9fe0: 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64  ] {..    lappend
9ff0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c   dependencies([l
a000: 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 62 69  ist sym::tag $bi
a010: 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74  d]) [list sym::t
a020: 61 67 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 72  ag $child]..}..r
a030: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
a040: 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 63   # var(dv) = dic
a050: 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20  t (item -> list 
a060: 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d  (item)), item  =
a070: 20 6c 69 73 74 20 28 74 79 70 65 20 69 64 29 0a   list (type id).
a080: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 70      typemethod p
a090: 72 65 64 65 63 65 73 73 6f 72 73 20 7b 64 76 20  redecessors {dv 
a0a0: 62 72 61 6e 63 68 65 73 7d 20 7b 0a 09 75 70 76  branches} {..upv
a0b0: 61 72 20 31 20 24 64 76 20 64 65 70 65 6e 64 65  ar 1 $dv depende
a0c0: 6e 63 69 65 73 0a 09 23 20 54 68 65 20 70 72 65  ncies..# The pre
a0d0: 64 65 63 65 73 73 6f 72 73 20 6f 66 20 61 20 62  decessors of a b
a0e0: 72 61 6e 63 68 20 61 72 65 20 61 6c 6c 20 74 68  ranch are all th
a0f0: 65 20 72 65 76 69 73 69 6f 6e 73 20 74 68 65 0a  e revisions the.
a100: 09 23 20 62 72 61 6e 63 68 65 73 20 61 72 65 20  .# branches are 
a110: 73 70 61 77 6e 65 64 20 66 72 6f 6d 2c 20 61 73  spawned from, as
a120: 20 77 65 6c 6c 20 61 73 20 61 6c 6c 20 74 68 65   well as all the
a130: 20 62 72 61 6e 63 68 65 73 20 6f 72 0a 09 23 20   branches or..# 
a140: 74 61 67 73 20 77 68 69 63 68 20 61 72 65 20 74  tags which are t
a150: 68 65 69 72 20 70 72 65 66 65 72 65 64 20 70 61  heir prefered pa
a160: 72 65 6e 74 73 2e 0a 0a 09 73 65 74 20 74 68 65  rents....set the
a170: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 74 61 67  set ('[join $tag
a180: 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66 6f 72 65  s {','}]')..fore
a190: 61 63 68 20 7b 62 69 64 20 70 61 72 65 6e 74 7d  ach {bid parent}
a1a0: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20   [state run ".. 
a1b0: 20 20 20 53 45 4c 45 43 54 20 42 2e 42 69 64 2c     SELECT B.Bid,
a1c0: 20 52 2e 72 69 64 0a 09 20 20 20 20 46 52 4f 4d   R.rid..    FROM
a1d0: 20 20 20 62 72 61 6e 63 68 20 42 2c 20 72 65 76     branch B, rev
a1e0: 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45  ision R..    WHE
a1f0: 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68  RE  B.bid IN $th
a200: 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20  eset..    AND   
a210: 20 42 2e 72 6f 6f 74 20 3d 20 52 2e 72 69 64 0a   B.root = R.rid.
a220: 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65  ."] {..    lappe
a230: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28  nd dependencies(
a240: 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63  [list sym::branc
a250: 68 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 20 72  h $bid]) [list r
a260: 65 76 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 09  ev $parent]..}..
a270: 66 6f 72 65 61 63 68 20 7b 62 69 64 20 70 61 72  foreach {bid par
a280: 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20  ent} [state run 
a290: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e  "..    SELECT B.
a2a0: 62 69 64 2c 20 42 58 2e 62 69 64 0a 09 20 20 20  bid, BX.bid..   
a2b0: 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42   FROM   branch B
a2c0: 2c 20 70 72 65 66 65 72 65 64 70 61 72 65 6e 74  , preferedparent
a2d0: 20 50 2c 20 62 72 61 6e 63 68 20 42 58 0a 09 20   P, branch BX.. 
a2e0: 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20     WHERE  B.bid 
a2f0: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20  IN $theset..    
a300: 41 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50  AND    B.sid = P
a310: 2e 73 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20  .sid..    AND   
a320: 20 50 2e 70 69 64 20 3d 20 42 58 2e 73 69 64 0a   P.pid = BX.sid.
a330: 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65  ."] {..    lappe
a340: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28  nd dependencies(
a350: 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63  [list sym::branc
a360: 68 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 20 73  h $bid]) [list s
a370: 79 6d 3a 3a 62 72 61 6e 63 68 20 24 70 61 72 65  ym::branch $pare
a380: 6e 74 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20  nt]..}..foreach 
a390: 7b 62 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 74  {bid parent} [st
a3a0: 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53  ate run "..    S
a3b0: 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 54 2e 74  ELECT B.bid, T.t
a3c0: 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62  id..    FROM   b
a3d0: 72 61 6e 63 68 20 42 2c 20 70 72 65 66 65 72 65  ranch B, prefere
a3e0: 64 70 61 72 65 6e 74 20 50 2c 20 74 61 67 20 54  dparent P, tag T
a3f0: 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62  ..    WHERE  B.b
a400: 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20  id IN $theset.. 
a410: 20 20 20 41 4e 44 20 20 20 20 42 2e 73 69 64 20     AND    B.sid 
a420: 3d 20 50 2e 73 69 64 0a 09 20 20 20 20 41 4e 44  = P.sid..    AND
a430: 20 20 20 20 50 2e 70 69 64 20 3d 20 54 2e 73 69      P.pid = T.si
a440: 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70  d.."] {..    lap
a450: 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65  pend dependencie
a460: 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61  s([list sym::bra
a470: 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c 69 73 74  nch $bid]) [list
a480: 20 73 79 6d 3a 3a 74 61 67 20 24 70 61 72 65 6e   sym::tag $paren
a490: 74 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20  t]..}..return.  
a4a0: 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c    }..    # resul
a4b0: 74 20 3d 20 6c 69 73 74 20 28 63 68 61 6e 67 65  t = list (change
a4c0: 73 65 74 2d 69 64 29 0a 20 20 20 20 74 79 70 65  set-id).    type
a4d0: 6d 65 74 68 6f 64 20 63 73 5f 73 75 63 63 65 73  method cs_succes
a4e0: 73 6f 72 73 20 7b 62 72 61 6e 63 68 65 73 7d 20  sors {branches} 
a4f0: 7b 0a 20 20 20 20 20 20 20 20 23 20 54 68 69 73  {.        # This
a500: 20 69 73 20 61 20 76 61 72 69 61 6e 74 20 6f 66   is a variant of
a510: 20 27 73 75 63 63 65 73 73 6f 72 73 27 20 77 68   'successors' wh
a520: 69 63 68 20 6d 61 70 73 20 74 68 65 20 6c 6f 77  ich maps the low
a530: 2d 6c 65 76 65 6c 0a 20 20 20 20 20 20 20 20 23  -level.        #
a540: 20 64 61 74 61 20 64 69 72 65 63 74 6c 79 20 74   data directly t
a550: 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  o the associated
a560: 20 63 68 61 6e 67 65 73 65 74 73 2e 20 49 2e 65   changesets. I.e
a570: 2e 20 69 6e 73 74 65 61 64 0a 20 20 20 20 20 20  . instead.      
a580: 20 20 23 20 6d 69 6c 6c 69 6f 6e 73 20 6f 66 20    # millions of 
a590: 64 65 70 65 6e 64 65 6e 63 79 20 70 61 69 72 73  dependency pairs
a5a0: 20 28 69 6e 20 65 78 74 72 65 6d 65 20 63 61 73   (in extreme cas
a5b0: 65 73 20 28 45 78 61 6d 70 6c 65 3a 20 54 63 6c  es (Example: Tcl
a5c0: 0a 20 20 20 20 20 20 20 20 23 20 43 56 53 29 29  .        # CVS))
a5d0: 20 77 65 20 72 65 74 75 72 6e 20 61 20 76 65 72   we return a ver
a5e0: 79 20 73 68 6f 72 74 20 61 6e 64 20 6d 75 63 68  y short and much
a5f0: 20 6d 6f 72 65 20 6d 61 6e 61 67 65 61 62 6c 65   more manageable
a600: 20 6c 69 73 74 0a 20 20 20 20 20 20 20 20 23 20   list.        # 
a610: 6f 66 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a  of changesets...
a620: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a  .set theset ('[j
a630: 6f 69 6e 20 24 62 72 61 6e 63 68 65 73 20 7b 27  oin $branches {'
a640: 2c 27 7d 5d 27 29 0a 20 20 20 20 20 20 20 20 72  ,'}]').        r
a650: 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e  eturn [state run
a660: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 43   "..    SELECT C
a670: 2e 63 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  .cid..    FROM  
a680: 20 62 72 61 6e 63 68 20 42 2c 20 72 65 76 69 73   branch B, revis
a690: 69 6f 6e 20 52 2c 20 63 73 69 74 65 6d 20 43 49  ion R, csitem CI
a6a0: 2c 20 63 68 61 6e 67 65 73 65 74 20 43 0a 09 20  , changeset C.. 
a6b0: 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20     WHERE  B.bid 
a6c0: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20  IN $theset..    
a6d0: 41 4e 44 20 20 20 20 42 2e 66 69 72 73 74 20 3d  AND    B.first =
a6e0: 20 52 2e 72 69 64 0a 20 20 20 20 20 20 20 20 20   R.rid.         
a6f0: 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69 64     AND    CI.iid
a700: 20 3d 20 52 2e 72 69 64 0a 20 20 20 20 20 20 20   = R.rid.       
a710: 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e 63 69       AND    C.ci
a720: 64 20 3d 20 43 49 2e 63 69 64 0a 20 20 20 20 20  d = CI.cid.     
a730: 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e         AND    C.
a740: 74 79 70 65 20 3d 20 30 0a 20 20 20 20 55 4e 49  type = 0.    UNI
a750: 4f 4e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 43  ON..    SELECT C
a760: 2e 63 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  .cid..    FROM  
a770: 20 62 72 61 6e 63 68 20 42 2c 20 70 72 65 66 65   branch B, prefe
a780: 72 65 64 70 61 72 65 6e 74 20 50 2c 20 62 72 61  redparent P, bra
a790: 6e 63 68 20 42 58 2c 20 63 73 69 74 65 6d 20 43  nch BX, csitem C
a7a0: 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43 0a 09  I, changeset C..
a7b0: 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 64      WHERE  B.bid
a7c0: 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20   IN $theset..   
a7d0: 20 41 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20   AND    B.sid = 
a7e0: 50 2e 70 69 64 0a 09 20 20 20 20 41 4e 44 20 20  P.pid..    AND  
a7f0: 20 20 42 58 2e 73 69 64 20 3d 20 50 2e 73 69 64    BX.sid = P.sid
a800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44  .            AND
a810: 20 20 20 20 43 49 2e 69 69 64 20 3d 20 42 58 2e      CI.iid = BX.
a820: 62 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  bid.            
a830: 41 4e 44 20 20 20 20 43 2e 63 69 64 20 3d 20 43  AND    C.cid = C
a840: 49 2e 63 69 64 0a 20 20 20 20 20 20 20 20 20 20  I.cid.          
a850: 20 20 41 4e 44 20 20 20 20 43 2e 74 79 70 65 20    AND    C.type 
a860: 3d 20 32 0a 20 20 20 20 55 4e 49 4f 4e 0a 09 20  = 2.    UNION.. 
a870: 20 20 20 53 45 4c 45 43 54 20 43 2e 63 69 64 0a     SELECT C.cid.
a880: 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e  .    FROM   bran
a890: 63 68 20 42 2c 20 70 72 65 66 65 72 65 64 70 61  ch B, preferedpa
a8a0: 72 65 6e 74 20 50 2c 20 74 61 67 20 54 2c 20 63  rent P, tag T, c
a8b0: 73 69 74 65 6d 20 43 49 2c 20 63 68 61 6e 67 65  sitem CI, change
a8c0: 73 65 74 20 43 0a 09 20 20 20 20 57 48 45 52 45  set C..    WHERE
a8d0: 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73    B.bid IN $thes
a8e0: 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42  et..    AND    B
a8f0: 2e 73 69 64 20 3d 20 50 2e 70 69 64 0a 09 20 20  .sid = P.pid..  
a900: 20 20 41 4e 44 20 20 20 20 54 2e 73 69 64 20 3d    AND    T.sid =
a910: 20 50 2e 73 69 64 0a 20 20 20 20 20 20 20 20 20   P.sid.         
a920: 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69 64     AND    CI.iid
a930: 20 3d 20 54 2e 74 69 64 0a 20 20 20 20 20 20 20   = T.tid.       
a940: 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e 63 69       AND    C.ci
a950: 64 20 3d 20 43 49 2e 63 69 64 0a 20 20 20 20 20  d = CI.cid.     
a960: 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e         AND    C.
a970: 74 79 70 65 20 3d 20 31 0a 09 22 5d 0a 09 72 65  type = 1.."]..re
a980: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
a990: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
a9a0: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
a9b0: 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 43  #######.    ## C
a9c0: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a 20 20  onfiguration..  
a9d0: 20 20 70 72 61 67 6d 61 20 2d 68 61 73 69 6e 73    pragma -hasins
a9e0: 74 61 6e 63 65 73 20 20 20 6e 6f 20 3b 20 23 20  tances   no ; # 
a9f0: 73 69 6e 67 6c 65 74 6f 6e 0a 20 20 20 20 70 72  singleton.    pr
aa00: 61 67 6d 61 20 2d 68 61 73 74 79 70 65 69 6e 66  agma -hastypeinf
aa10: 6f 20 20 20 20 6e 6f 20 3b 20 23 20 6e 6f 20 69  o    no ; # no i
aa20: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20 20 20  ntrospection.   
aa30: 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65   pragma -hastype
aa40: 64 65 73 74 72 6f 79 20 6e 6f 20 3b 20 23 20 69  destroy no ; # i
aa50: 6d 6d 6f 72 74 61 6c 0a 7d 0a 0a 23 20 23 20 23  mmortal.}..# # #
aa60: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
aa70: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
aa80: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
aa90: 23 23 23 23 23 23 23 23 0a 23 23 0a 0a 6e 61 6d  ########.##..nam
aaa0: 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 76 63  espace eval ::vc
aab0: 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74  ::fossil::import
aac0: 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 20 7b  ::cvs::project {
aad0: 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 65  .    namespace e
aae0: 78 70 6f 72 74 20 72 65 76 0a 20 20 20 20 6e 61  xport rev.    na
aaf0: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 72 65 76  mespace eval rev
ab00: 20 7b 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d   {..namespace im
ab10: 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69  port ::vc::fossi
ab20: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a  l::import::cvs::
ab30: 73 74 61 74 65 0a 09 6e 61 6d 65 73 70 61 63 65  state..namespace
ab40: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f   import ::vc::fo
ab50: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
ab60: 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 6e 61  s::integrity..na
ab70: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
ab80: 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69 73 63  :vc::tools::misc
ab90: 3a 3a 2a 0a 09 6e 61 6d 65 73 70 61 63 65 20 69  ::*..namespace i
aba0: 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c  mport ::vc::tool
abb0: 73 3a 3a 74 72 6f 75 62 6c 65 0a 09 6e 61 6d 65  s::trouble..name
abc0: 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76  space import ::v
abd0: 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 6c  c::tools::log..l
abe0: 6f 67 20 72 65 67 69 73 74 65 72 20 63 73 65 74  og register cset
abf0: 73 0a 0a 09 23 20 53 65 74 20 75 70 20 74 68 65  s...# Set up the
ac00: 20 68 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f   helper singleto
ac10: 6e 73 0a 09 6e 61 6d 65 73 70 61 63 65 20 65 76  ns..namespace ev
ac20: 61 6c 20 72 65 76 20 7b 0a 09 20 20 20 20 6e 61  al rev {..    na
ac30: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
ac40: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70  :vc::fossil::imp
ac50: 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a  ort::cvs::state.
ac60: 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69  .    namespace i
ac70: 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73  mport ::vc::foss
ac80: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a  il::import::cvs:
ac90: 3a 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a 09 6e  :integrity..}..n
aca0: 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 73 79  amespace eval sy
acb0: 6d 3a 3a 74 61 67 20 7b 0a 09 20 20 20 20 6e 61  m::tag {..    na
acc0: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
acd0: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70  :vc::fossil::imp
ace0: 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a  ort::cvs::state.
acf0: 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69  .    namespace i
ad00: 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73  mport ::vc::foss
ad10: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a  il::import::cvs:
ad20: 3a 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a 09 6e  :integrity..}..n
ad30: 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 73 79  amespace eval sy
ad40: 6d 3a 3a 62 72 61 6e 63 68 20 7b 0a 09 20 20 20  m::branch {..   
ad50: 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72   namespace impor
ad60: 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a  t ::vc::fossil::
ad70: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61  import::cvs::sta
ad80: 74 65 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63  te..    namespac
ad90: 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66  e import ::vc::f
ada0: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63  ossil::import::c
adb0: 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 7d  vs::integrity..}
adc0: 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23  .    }.}..# # ##
add0: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23   ### ##### #####
ade0: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
adf0: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23  # ##############
ae00: 23 23 23 23 23 23 23 0a 23 23 20 52 65 61 64 79  #######.## Ready
ae10: 0a 0a 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64  ..package provid
ae20: 65 20 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d  e vc::fossil::im
ae30: 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65  port::cvs::proje
ae40: 63 74 3a 3a 72 65 76 20 31 2e 30 0a 72 65 74 75  ct::rev 1.0.retu
ae50: 72 6e 0a                                         rn.