Hex Artifact Content
Not logged in

Artifact bf483d028a0f07379f4eb34cc68a40d3e395f607:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [00bf8c198e] - The performance was still not satisfying, even with faster recomputing of successors. Doing it multiple times (Building the graph in each breaker and sort passes) eats time. Caching in memory blows the memory. Chosen solution: Cache this information in the database.

Created a new pass 'CsetDeps' which is run between 'InitCsets' and 'BreakRevCsetCycles' (i.e. changeset creation and first breaker pass). It computes the changeset dependencies from the file-level dependencies once and saves the result in the state, in the new table 'cssuccessor'. Now the breaker and sort passes can get the information quickly, with virtually no effort. The dependencies are recomputed incrementally when a changeset is split by one of the breaker passes, for its fragments and its predecessors.

The loop check is now trivial, and integrated into the successor computation, with the heavy lifting for the detailed analysis and reporting moved down into the type-dependent SQL queries. The relevant new method is 'loops'. Now that the loop check is incremental the pass based checks have been removed from the integrity module, and the option '--loopcheck' has been eliminated. For paranoia the graph setup and modification code got its loop check reinstated as an assert, redusing the changeset report code.

Renumbered the breaker and sort passes. A number of places, like graph setup and traversal, loading of changesets, etc. got feedback indicators to show their progress.

The selection of revision and symbol changesets for the associated breaker passes was a bit on the slow side. We now keep changeset lists sorted by type (during loading or general construction) and access them directly.

by aku on 2007-12-02 20:04:40.

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 6c 61 70 70 65 6e 64 20   $self..lappend 
0830: 6d 79 74 63 68 61 6e 67 65 73 65 74 73 28 24 63  mytchangesets($c
0840: 73 74 79 70 65 29 20 24 73 65 6c 66 0a 09 73 65  stype) $self..se
0850: 74 20 20 20 20 20 6d 79 69 64 6d 61 70 28 24 6d  t     myidmap($m
0860: 79 69 64 29 20 24 73 65 6c 66 0a 09 66 6f 72 65  yid) $self..fore
0870: 61 63 68 20 69 69 64 20 24 69 74 65 6d 73 20 7b  ach iid $items {
0880: 0a 09 20 20 20 20 73 65 74 20 6b 65 79 20 5b 6c  ..    set key [l
0890: 69 73 74 20 24 63 73 74 79 70 65 20 24 69 69 64  ist $cstype $iid
08a0: 5d 0a 09 20 20 20 20 73 65 74 20 6d 79 69 74 65  ]..    set myite
08b0: 6d 6d 61 70 28 24 6b 65 79 29 20 24 73 65 6c 66  mmap($key) $self
08c0: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 6d 79  ..    lappend my
08d0: 74 69 74 65 6d 73 20 24 6b 65 79 0a 09 20 20 20  titems $key..   
08e0: 20 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73 65   log write 8 cse
08f0: 74 73 20 7b 4d 41 50 2b 20 69 74 65 6d 20 3c 24  ts {MAP+ item <$
0900: 6b 65 79 3e 20 24 73 65 6c 66 20 3d 20 5b 24 73  key> $self = [$s
0910: 65 6c 66 20 73 74 72 5d 7d 0a 09 7d 0a 09 72 65  elf str]}..}..re
0920: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
0930: 6d 65 74 68 6f 64 20 73 74 72 20 7b 7d 20 7b 0a  method str {} {.
0940: 09 73 65 74 20 73 74 72 20 20 20 20 22 3c 22 0a  .set str    "<".
0950: 09 73 65 74 20 64 65 74 61 69 6c 20 22 22 0a 09  .set detail ""..
0960: 69 66 20 7b 5b 24 6d 79 74 79 70 65 6f 62 6a 20  if {[$mytypeobj 
0970: 62 79 73 79 6d 62 6f 6c 5d 7d 20 7b 0a 09 20 20  bysymbol]} {..  
0980: 20 20 73 65 74 20 64 65 74 61 69 6c 20 22 20 27    set detail " '
0990: 5b 73 74 61 74 65 20 6f 6e 65 20 7b 0a 09 09 53  [state one {...S
09a0: 45 4c 45 43 54 20 53 2e 6e 61 6d 65 0a 09 09 46  ELECT S.name...F
09b0: 52 4f 4d 20 20 20 73 79 6d 62 6f 6c 20 53 0a 09  ROM   symbol S..
09c0: 09 57 48 45 52 45 20 20 53 2e 73 69 64 20 3d 20  .WHERE  S.sid = 
09d0: 24 6d 79 73 72 63 69 64 0a 09 20 20 20 20 7d 5d  $mysrcid..    }]
09e0: 27 22 0a 09 7d 0a 09 61 70 70 65 6e 64 20 73 74  '"..}..append st
09f0: 72 20 22 24 6d 79 74 79 70 65 20 24 7b 6d 79 69  r "$mytype ${myi
0a00: 64 7d 24 7b 64 65 74 61 69 6c 7d 3e 22 0a 09 72  d}${detail}>"..r
0a10: 65 74 75 72 6e 20 24 73 74 72 0a 20 20 20 20 7d  eturn $str.    }
0a20: 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 69 64 20  ..    method id 
0a30: 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 24     {} { return $
0a40: 6d 79 69 64 20 7d 0a 20 20 20 20 6d 65 74 68 6f  myid }.    metho
0a50: 64 20 69 74 65 6d 73 20 7b 7d 20 7b 20 72 65 74  d items {} { ret
0a60: 75 72 6e 20 24 6d 79 74 69 74 65 6d 73 20 7d 0a  urn $mytitems }.
0a70: 20 20 20 20 6d 65 74 68 6f 64 20 64 61 74 61 20      method data 
0a80: 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 5b 6c 69   {} { return [li
0a90: 73 74 20 24 6d 79 70 72 6f 6a 65 63 74 20 24 6d  st $myproject $m
0aa0: 79 74 79 70 65 20 24 6d 79 73 72 63 69 64 5d 20  ytype $mysrcid] 
0ab0: 7d 0a 0a 20 20 20 20 64 65 6c 65 67 61 74 65 20  }..    delegate 
0ac0: 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20  method bysymbol 
0ad0: 20 20 74 6f 20 6d 79 74 79 70 65 6f 62 6a 0a 20    to mytypeobj. 
0ae0: 20 20 20 64 65 6c 65 67 61 74 65 20 6d 65 74 68     delegate meth
0af0: 6f 64 20 62 79 72 65 76 69 73 69 6f 6e 20 74 6f  od byrevision to
0b00: 20 6d 79 74 79 70 65 6f 62 6a 0a 20 20 20 20 64   mytypeobj.    d
0b10: 65 6c 65 67 61 74 65 20 6d 65 74 68 6f 64 20 69  elegate method i
0b20: 73 62 72 61 6e 63 68 20 20 20 74 6f 20 6d 79 74  sbranch   to myt
0b30: 79 70 65 6f 62 6a 0a 20 20 20 20 64 65 6c 65 67  ypeobj.    deleg
0b40: 61 74 65 20 6d 65 74 68 6f 64 20 69 73 74 61 67  ate method istag
0b50: 20 20 20 20 20 20 74 6f 20 6d 79 74 79 70 65 6f        to mytypeo
0b60: 62 6a 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 73  bj..    method s
0b70: 65 74 70 6f 73 20 7b 70 7d 20 7b 20 73 65 74 20  etpos {p} { set 
0b80: 6d 79 70 6f 73 20 24 70 20 3b 20 72 65 74 75 72  mypos $p ; retur
0b90: 6e 20 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20 70  n }.    method p
0ba0: 6f 73 20 20 20 20 7b 7d 20 20 7b 20 72 65 74 75  os    {}  { retu
0bb0: 72 6e 20 24 6d 79 70 6f 73 20 7d 0a 0a 20 20 20  rn $mypos }..   
0bc0: 20 6d 65 74 68 6f 64 20 64 65 74 65 72 6d 69 6e   method determin
0bd0: 65 73 75 63 63 65 73 73 6f 72 73 20 7b 7d 20 7b  esuccessors {} {
0be0: 0a 09 23 20 50 61 73 73 20 36 20 6f 70 65 72 61  ..# Pass 6 opera
0bf0: 74 69 6f 6e 2e 20 43 6f 6d 70 75 74 65 20 70 72  tion. Compute pr
0c00: 6f 6a 65 63 74 2d 6c 65 76 65 6c 20 64 65 70 65  oject-level depe
0c10: 6e 64 65 6e 63 69 65 73 20 66 72 6f 6d 0a 09 23  ndencies from..#
0c20: 20 74 68 65 20 66 69 6c 65 2d 6c 65 76 65 6c 20   the file-level 
0c30: 64 61 74 61 20 61 6e 64 20 73 61 76 65 20 69 74  data and save it
0c40: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 74 61   back to the sta
0c50: 74 65 2e 20 54 68 69 73 20 6d 61 79 0a 09 23 20  te. This may..# 
0c60: 62 65 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67  be called during
0c70: 20 74 68 65 20 63 79 63 6c 65 20 62 72 65 61 6b   the cycle break
0c80: 65 72 20 70 61 73 73 65 73 20 61 73 20 77 65 6c  er passes as wel
0c90: 6c 2c 20 74 6f 20 61 64 6a 75 73 74 0a 09 23 20  l, to adjust..# 
0ca0: 74 68 65 20 73 75 63 63 65 73 73 6f 72 20 69 6e  the successor in
0cb0: 66 6f 72 6d 61 74 69 6f 6e 20 6f 66 20 63 68 61  formation of cha
0cc0: 6e 67 65 73 65 74 73 20 77 68 69 63 68 20 61 72  ngesets which ar
0cd0: 65 20 74 68 65 0a 09 23 20 70 72 65 64 65 63 65  e the..# predece
0ce0: 73 73 6f 72 73 20 6f 66 20 64 72 6f 70 70 65 64  ssors of dropped
0cf0: 20 63 68 61 6e 67 65 73 65 74 73 2e 20 46 6f 72   changesets. For
0d00: 20 74 68 65 6d 20 77 65 20 68 61 76 65 20 74 6f   them we have to
0d10: 0a 09 23 20 72 65 6d 6f 76 65 20 74 68 65 69 72  ..# remove their
0d20: 20 65 78 69 73 74 69 6e 67 20 69 6e 66 6f 72 6d   existing inform
0d30: 61 74 69 6f 6e 20 66 69 72 73 74 20 62 65 66 6f  ation first befo
0d40: 72 65 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65  re inserting the
0d50: 0a 09 23 20 6e 65 77 20 64 61 74 61 2e 0a 09 73  ..# new data...s
0d60: 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20  tate run {..    
0d70: 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 73 73 75  DELETE FROM cssu
0d80: 63 63 65 73 73 6f 72 20 57 48 45 52 45 20 63 69  ccessor WHERE ci
0d90: 64 20 3d 20 24 6d 79 69 64 3b 0a 09 7d 0a 09 73  d = $myid;..}..s
0da0: 65 74 20 6c 6f 6f 70 20 30 0a 09 66 6f 72 65 61  et loop 0..forea
0db0: 63 68 20 6e 69 64 20 5b 24 6d 79 74 79 70 65 6f  ch nid [$mytypeo
0dc0: 62 6a 20 63 73 5f 73 75 63 63 65 73 73 6f 72 73  bj cs_successors
0dd0: 20 24 6d 79 69 74 65 6d 73 5d 20 7b 0a 09 20 20   $myitems] {..  
0de0: 20 20 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09    state run {...
0df0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 73 73 75  INSERT INTO cssu
0e00: 63 63 65 73 73 6f 72 20 28 63 69 64 2c 20 20 6e  ccessor (cid,  n
0e10: 69 64 29 0a 09 09 56 41 4c 55 45 53 20 20 20 20  id)...VALUES    
0e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 24                ($
0e30: 6d 79 69 64 2c 24 6e 69 64 29 0a 09 20 20 20 20  myid,$nid)..    
0e40: 7d 0a 09 20 20 20 20 69 66 20 7b 24 6e 69 64 20  }..    if {$nid 
0e50: 3d 3d 20 24 6d 79 69 64 7d 20 7b 20 73 65 74 20  == $myid} { set 
0e60: 6c 6f 6f 70 20 31 20 7d 0a 09 7d 0a 09 23 20 52  loop 1 }..}..# R
0e70: 65 70 6f 72 74 20 61 66 74 65 72 20 74 68 65 20  eport after the 
0e80: 63 6f 6d 70 6c 65 74 65 20 73 74 72 75 63 74 75  complete structu
0e90: 72 65 20 68 61 73 20 62 65 65 6e 20 73 61 76 65  re has been save
0ea0: 64 2e 0a 09 69 66 20 7b 24 6c 6f 6f 70 7d 20 7b  d...if {$loop} {
0eb0: 20 24 73 65 6c 66 20 72 65 70 6f 72 74 6c 6f 6f   $self reportloo
0ec0: 70 20 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  p }..return.    
0ed0: 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20  }..    # result 
0ee0: 3d 20 6c 69 73 74 20 28 63 68 61 6e 67 65 73 65  = list (changese
0ef0: 74 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 75  t).    method su
0f00: 63 63 65 73 73 6f 72 73 20 7b 7d 20 7b 0a 09 23  ccessors {} {..#
0f10: 20 55 73 65 20 74 68 65 20 64 61 74 61 20 73 61   Use the data sa
0f20: 76 65 64 20 62 79 20 70 61 73 73 20 36 2e 0a 09  ved by pass 6...
0f30: 72 65 74 75 72 6e 20 5b 73 74 72 75 63 74 3a 3a  return [struct::
0f40: 6c 69 73 74 20 6d 61 70 20 5b 73 74 61 74 65 20  list map [state 
0f50: 72 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c 45 43  run {..    SELEC
0f60: 54 20 53 2e 6e 69 64 0a 09 20 20 20 20 46 52 4f  T S.nid..    FRO
0f70: 4d 20 20 20 63 73 73 75 63 63 65 73 73 6f 72 20  M   cssuccessor 
0f80: 53 0a 09 20 20 20 20 57 48 45 52 45 20 20 53 2e  S..    WHERE  S.
0f90: 63 69 64 20 3d 20 24 6d 79 69 64 0a 09 7d 5d 20  cid = $myid..}] 
0fa0: 5b 6d 79 74 79 70 65 6d 65 74 68 6f 64 20 6f 66  [mytypemethod of
0fb0: 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  ]].    }..    # 
0fc0: 72 65 73 75 6c 74 20 3d 20 64 69 63 74 20 28 69  result = dict (i
0fd0: 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 63 68 61  tem -> list (cha
0fe0: 6e 67 65 73 65 74 29 29 0a 20 20 20 20 6d 65 74  ngeset)).    met
0ff0: 68 6f 64 20 73 75 63 63 65 73 73 6f 72 6d 61 70  hod successormap
1000: 20 7b 7d 20 7b 0a 09 23 20 4e 4f 54 45 20 2f 20   {} {..# NOTE / 
1010: 46 55 54 55 52 45 3a 20 44 65 66 69 6e 69 74 69  FUTURE: Definiti
1020: 76 65 20 62 6f 74 74 6c 65 6e 65 63 6b 20 28 63  ve bottleneck (c
1030: 61 6e 20 62 65 20 6d 69 6c 6c 69 6f 6e 73 20 6f  an be millions o
1040: 66 20 70 61 69 72 73 29 2e 0a 09 23 0a 09 23 20  f pairs)...#..# 
1050: 4f 6e 6c 79 20 75 73 65 72 20 69 73 20 70 61 73  Only user is pas
1060: 73 20 39 2c 20 63 6f 6d 70 75 74 69 6e 67 20 74  s 9, computing t
1070: 68 65 20 6c 69 6d 69 74 73 20 6f 66 20 62 61 63  he limits of bac
1080: 6b 77 61 72 64 0a 09 23 20 62 72 61 6e 63 68 65  kward..# branche
1090: 73 20 70 65 72 20 62 72 61 6e 63 68 20 69 6e 20  s per branch in 
10a0: 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20 54  the changeset. T
10b0: 4f 44 4f 3a 20 46 6f 6c 64 20 74 68 61 74 20 69  ODO: Fold that i
10c0: 6e 74 6f 0a 09 23 20 74 68 65 20 53 51 4c 20 71  nto..# the SQL q
10d0: 75 65 72 79 2c 20 69 2e 65 2e 20 6d 6f 76 65 20  uery, i.e. move 
10e0: 74 68 65 20 63 72 75 6e 63 68 69 6e 67 20 66 72  the crunching fr
10f0: 6f 6d 20 54 63 6c 20 74 6f 20 43 2e 0a 0a 09 61  om Tcl to C....a
1100: 72 72 61 79 20 73 65 74 20 74 6d 70 20 7b 7d 0a  rray set tmp {}.
1110: 09 66 6f 72 65 61 63 68 20 7b 72 65 76 20 63 68  .foreach {rev ch
1120: 69 6c 64 72 65 6e 7d 20 5b 24 73 65 6c 66 20 6e  ildren} [$self n
1130: 65 78 74 6d 61 70 5d 20 7b 0a 09 20 20 20 20 66  extmap] {..    f
1140: 6f 72 65 61 63 68 20 63 68 69 6c 64 20 24 63 68  oreach child $ch
1150: 69 6c 64 72 65 6e 20 7b 0a 09 09 6c 61 70 70 65  ildren {...lappe
1160: 6e 64 20 74 6d 70 28 24 72 65 76 29 20 24 6d 79  nd tmp($rev) $my
1170: 69 74 65 6d 6d 61 70 28 24 63 68 69 6c 64 29 0a  itemmap($child).
1180: 09 20 20 20 20 7d 0a 09 20 20 20 20 73 65 74 20  .    }..    set 
1190: 74 6d 70 28 24 72 65 76 29 20 5b 6c 73 6f 72 74  tmp($rev) [lsort
11a0: 20 2d 75 6e 69 71 75 65 20 24 74 6d 70 28 24 72   -unique $tmp($r
11b0: 65 76 29 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 20  ev)]..}..return 
11c0: 5b 61 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a  [array get tmp].
11d0: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73      }..    # res
11e0: 75 6c 74 20 3d 20 64 69 63 74 20 28 69 74 65 6d  ult = dict (item
11f0: 20 2d 3e 20 6c 69 73 74 20 28 63 68 61 6e 67 65   -> list (change
1200: 73 65 74 29 29 0a 20 20 20 20 6d 65 74 68 6f 64  set)).    method
1210: 20 70 72 65 64 65 63 65 73 73 6f 72 6d 61 70 20   predecessormap 
1220: 7b 7d 20 7b 0a 09 23 20 4e 4f 54 45 20 2f 20 46  {} {..# NOTE / F
1230: 55 54 55 52 45 3a 20 44 65 66 69 6e 69 74 69 76  UTURE: Definitiv
1240: 65 20 62 6f 74 74 6c 65 6e 65 63 6b 20 28 63 61  e bottleneck (ca
1250: 6e 20 62 65 20 6d 69 6c 6c 69 6f 6e 73 20 6f 66  n be millions of
1260: 20 70 61 69 72 73 29 2e 0a 09 23 0a 09 23 20 4f   pairs)...#..# O
1270: 6e 6c 79 20 75 73 65 72 20 69 73 20 70 61 73 73  nly user is pass
1280: 20 39 2c 20 63 6f 6d 70 75 74 69 6e 67 20 74 68   9, computing th
1290: 65 20 6c 69 6d 69 74 73 20 6f 66 20 62 61 63 6b  e limits of back
12a0: 77 61 72 64 0a 09 23 20 62 72 61 6e 63 68 65 73  ward..# branches
12b0: 20 70 65 72 20 62 72 61 6e 63 68 20 69 6e 20 74   per branch in t
12c0: 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20 54 4f  he changeset. TO
12d0: 44 4f 3a 20 46 6f 6c 64 20 74 68 61 74 20 69 6e  DO: Fold that in
12e0: 74 6f 0a 09 23 20 74 68 65 20 53 51 4c 20 71 75  to..# the SQL qu
12f0: 65 72 79 2c 20 69 2e 65 2e 20 6d 6f 76 65 20 74  ery, i.e. move t
1300: 68 65 20 63 72 75 6e 63 68 69 6e 67 20 66 72 6f  he crunching fro
1310: 6d 20 54 63 6c 20 74 6f 20 43 2e 0a 0a 09 61 72  m Tcl to C....ar
1320: 72 61 79 20 73 65 74 20 74 6d 70 20 7b 7d 0a 09  ray set tmp {}..
1330: 66 6f 72 65 61 63 68 20 7b 72 65 76 20 63 68 69  foreach {rev chi
1340: 6c 64 72 65 6e 7d 20 5b 24 73 65 6c 66 20 70 72  ldren} [$self pr
1350: 65 6d 61 70 5d 20 7b 0a 09 20 20 20 20 66 6f 72  emap] {..    for
1360: 65 61 63 68 20 63 68 69 6c 64 20 24 63 68 69 6c  each child $chil
1370: 64 72 65 6e 20 7b 0a 09 09 6c 61 70 70 65 6e 64  dren {...lappend
1380: 20 74 6d 70 28 24 72 65 76 29 20 24 6d 79 69 74   tmp($rev) $myit
1390: 65 6d 6d 61 70 28 24 63 68 69 6c 64 29 0a 09 20  emmap($child).. 
13a0: 20 20 20 7d 0a 09 20 20 20 20 73 65 74 20 74 6d     }..    set tm
13b0: 70 28 24 72 65 76 29 20 5b 6c 73 6f 72 74 20 2d  p($rev) [lsort -
13c0: 75 6e 69 71 75 65 20 24 74 6d 70 28 24 72 65 76  unique $tmp($rev
13d0: 29 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b 61  )]..}..return [a
13e0: 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 20 20  rray get tmp].  
13f0: 20 20 7d 0a 0a 20 20 20 20 23 20 69 74 65 6d 20    }..    # item 
1400: 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 0a 20  -> list (item). 
1410: 20 20 20 6d 65 74 68 6f 64 20 6e 65 78 74 6d 61     method nextma
1420: 70 20 7b 7d 20 7b 0a 09 23 69 66 20 7b 5b 6c 6c  p {} {..#if {[ll
1430: 65 6e 67 74 68 20 24 6d 79 6e 65 78 74 6d 61 70  ength $mynextmap
1440: 5d 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 6e  ]} { return $myn
1450: 65 78 74 6d 61 70 20 7d 0a 09 24 6d 79 74 79 70  extmap }..$mytyp
1460: 65 6f 62 6a 20 73 75 63 63 65 73 73 6f 72 73 20  eobj successors 
1470: 74 6d 70 20 24 6d 79 69 74 65 6d 73 0a 09 72 65  tmp $myitems..re
1480: 74 75 72 6e 20 5b 61 72 72 61 79 20 67 65 74 20  turn [array get 
1490: 74 6d 70 5d 0a 09 23 73 65 74 20 6d 79 6e 65 78  tmp]..#set mynex
14a0: 74 6d 61 70 20 5b 61 72 72 61 79 20 67 65 74 20  tmap [array get 
14b0: 74 6d 70 5d 0a 09 23 72 65 74 75 72 6e 20 24 6d  tmp]..#return $m
14c0: 79 6e 65 78 74 6d 61 70 0a 20 20 20 20 7d 0a 0a  ynextmap.    }..
14d0: 20 20 20 20 23 20 69 74 65 6d 20 2d 3e 20 6c 69      # item -> li
14e0: 73 74 20 28 69 74 65 6d 29 0a 20 20 20 20 6d 65  st (item).    me
14f0: 74 68 6f 64 20 70 72 65 6d 61 70 20 7b 7d 20 7b  thod premap {} {
1500: 0a 09 23 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20  ..#if {[llength 
1510: 24 6d 79 70 72 65 6d 61 70 5d 7d 20 7b 20 72 65  $mypremap]} { re
1520: 74 75 72 6e 20 24 6d 79 70 72 65 6d 61 70 20 7d  turn $mypremap }
1530: 0a 09 24 6d 79 74 79 70 65 6f 62 6a 20 70 72 65  ..$mytypeobj pre
1540: 64 65 63 65 73 73 6f 72 73 20 74 6d 70 20 24 6d  decessors tmp $m
1550: 79 69 74 65 6d 73 0a 09 72 65 74 75 72 6e 20 5b  yitems..return [
1560: 61 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 09  array get tmp]..
1570: 23 73 65 74 20 6d 79 70 72 65 6d 61 70 20 5b 61  #set mypremap [a
1580: 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 09 23  rray get tmp]..#
1590: 72 65 74 75 72 6e 20 24 6d 79 70 72 65 6d 61 70  return $mypremap
15a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68  .    }..    meth
15b0: 6f 64 20 62 72 65 61 6b 69 6e 74 65 72 6e 61 6c  od breakinternal
15c0: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 7b 7d 20  dependencies {} 
15d0: 7b 0a 0a 09 23 23 0a 09 23 23 20 4e 4f 54 45 3a  {...##..## NOTE:
15e0: 20 54 68 69 73 20 6d 65 74 68 6f 64 2c 20 6d 61   This method, ma
15f0: 79 62 65 20 69 6e 20 63 6f 6e 6a 75 6e 63 74 69  ybe in conjuncti
1600: 6f 6e 20 77 69 74 68 20 69 74 73 20 63 61 6c 6c  on with its call
1610: 65 72 0a 09 23 23 20 20 20 20 20 20 20 73 65 65  er..##       see
1620: 6d 73 20 74 6f 20 62 65 20 61 20 6d 65 6d 6f 72  ms to be a memor
1630: 79 20 68 6f 67 2c 20 65 73 70 65 63 69 61 6c 6c  y hog, especiall
1640: 79 20 66 6f 72 20 6c 61 72 67 65 0a 09 23 23 20  y for large..## 
1650: 20 20 20 20 20 20 63 68 61 6e 67 65 73 65 74 73        changesets
1660: 2c 20 77 69 74 68 20 27 6c 61 72 67 65 27 20 6d  , with 'large' m
1670: 65 61 6e 69 6e 67 20 74 6f 20 68 61 76 65 20 61  eaning to have a
1680: 20 27 6c 6f 6e 67 20 6c 69 73 74 0a 09 23 23 20   'long list..## 
1690: 20 20 20 20 20 20 6f 66 20 69 74 65 6d 73 2c 20        of items, 
16a0: 73 65 76 65 72 61 6c 20 74 68 6f 75 73 61 6e 64  several thousand
16b0: 27 2e 20 49 6e 76 65 73 74 69 67 61 74 65 20 77  '. Investigate w
16c0: 68 65 72 65 20 74 68 65 0a 09 23 23 20 20 20 20  here the..##    
16d0: 20 20 20 6d 65 6d 6f 72 79 20 69 73 20 73 70 65     memory is spe
16e0: 6e 74 20 61 6e 64 20 74 68 65 6e 20 6c 6f 6f 6b  nt and then look
16f0: 20 66 6f 72 20 77 61 79 73 20 6f 66 20 72 65 63   for ways of rec
1700: 74 69 66 79 69 6e 67 0a 09 23 23 20 20 20 20 20  tifying..##     
1710: 20 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 09    the problem...
1720: 23 23 0a 0a 09 23 20 54 68 69 73 20 6d 65 74 68  ##...# This meth
1730: 6f 64 20 69 6e 73 70 65 63 74 73 20 74 68 65 20  od inspects the 
1740: 63 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20 69  changesets for i
1750: 6e 74 65 72 6e 61 6c 0a 09 23 20 64 65 70 65 6e  nternal..# depen
1760: 64 65 6e 63 69 65 73 2e 20 4e 6f 74 68 69 6e 67  dencies. Nothing
1770: 20 69 73 20 64 6f 6e 65 20 69 66 20 74 68 65 72   is done if ther
1780: 65 20 61 72 65 20 6e 6f 0a 09 23 20 73 75 63 68  e are no..# such
1790: 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20  . Otherwise the 
17a0: 63 68 61 6e 67 65 73 65 74 20 69 73 20 73 70 6c  changeset is spl
17b0: 69 74 20 69 6e 74 6f 20 61 20 73 65 74 20 6f 66  it into a set of
17c0: 0a 09 23 20 66 72 61 67 6d 65 6e 74 73 20 77 69  ..# fragments wi
17d0: 74 68 6f 75 74 20 69 6e 74 65 72 6e 61 6c 20 64  thout internal d
17e0: 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 74 72 61  ependencies, tra
17f0: 6e 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 09 23  nsforming the..#
1800: 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64   internal depend
1810: 65 6e 63 69 65 73 20 69 6e 74 6f 20 65 78 74 65  encies into exte
1820: 72 6e 61 6c 20 6f 6e 65 73 2e 20 54 68 65 20 6e  rnal ones. The n
1830: 65 77 20 63 68 61 6e 67 65 73 65 74 73 0a 09 23  ew changesets..#
1840: 20 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68   are added to th
1850: 65 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 68  e list of all ch
1860: 61 6e 67 65 73 65 74 73 2e 0a 0a 09 23 20 57 65  angesets....# We
1870: 20 70 65 72 66 6f 72 6d 20 61 6c 6c 20 6e 65 63   perform all nec
1880: 65 73 73 61 72 79 20 73 70 6c 69 74 73 20 69 6e  essary splits in
1890: 20 6f 6e 65 20 67 6f 2c 20 69 6e 73 74 65 61 64   one go, instead
18a0: 20 6f 66 20 6f 6e 6c 79 0a 09 23 20 6f 6e 65 2e   of only..# one.
18b0: 20 54 68 65 20 70 72 65 76 69 6f 75 73 20 61 6c   The previous al
18c0: 67 6f 72 69 74 68 6d 2c 20 61 64 61 70 74 65 64  gorithm, adapted
18d0: 20 66 72 6f 6d 20 63 76 73 32 73 76 6e 2c 20 63   from cvs2svn, c
18e0: 6f 6d 70 75 74 65 64 0a 09 23 20 61 20 6c 6f 74  omputed..# a lot
18f0: 20 6f 66 20 73 74 61 74 65 20 77 68 69 63 68 20   of state which 
1900: 77 61 73 20 74 68 72 6f 77 6e 20 61 77 61 79 20  was thrown away 
1910: 61 6e 64 20 74 68 65 6e 20 63 6f 6d 70 75 74 65  and then compute
1920: 64 20 61 67 61 69 6e 0a 09 23 20 66 6f 72 20 65  d again..# for e
1930: 61 63 68 20 6f 66 20 74 68 65 20 66 72 61 67 6d  ach of the fragm
1940: 65 6e 74 73 2e 20 49 74 20 73 68 6f 75 6c 64 20  ents. It should 
1950: 62 65 20 65 61 73 69 65 72 20 74 6f 20 75 70 64  be easier to upd
1960: 61 74 65 20 61 6e 64 0a 09 23 20 72 65 75 73 65  ate and..# reuse
1970: 20 74 68 61 74 20 73 74 61 74 65 2e 0a 0a 09 23   that state....#
1980: 20 54 68 65 20 63 6f 64 65 20 63 68 65 63 6b 73   The code checks
1990: 20 6f 6e 6c 79 20 73 75 63 63 65 73 73 6f 72 20   only successor 
19a0: 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73  dependencies, as
19b0: 20 74 68 69 73 0a 09 23 20 61 75 74 6f 6d 61 74   this..# automat
19c0: 69 63 61 6c 6c 79 20 63 6f 76 65 72 73 20 74 68  ically covers th
19d0: 65 20 70 72 65 64 65 63 65 73 73 6f 72 20 64 65  e predecessor de
19e0: 70 65 6e 64 65 6e 63 69 65 73 20 61 73 20 77 65  pendencies as we
19f0: 6c 6c 20 28 41 0a 09 23 20 73 75 63 63 65 73 73  ll (A..# success
1a00: 6f 72 20 64 65 70 65 6e 64 65 6e 63 79 20 61 20  or dependency a 
1a10: 2d 3e 20 62 20 69 73 20 61 6c 73 6f 20 61 20 70  -> b is also a p
1a20: 72 65 64 65 63 65 73 73 6f 72 20 64 65 70 65 6e  redecessor depen
1a30: 64 65 6e 63 79 0a 09 23 20 62 20 2d 3e 20 61 29  dency..# b -> a)
1a40: 2e 0a 0a 09 23 20 41 72 72 61 79 20 6f 66 20 64  ....# Array of d
1a50: 65 70 65 6e 64 65 6e 63 69 65 73 20 28 70 61 72  ependencies (par
1a60: 65 6e 74 20 2d 3e 20 63 68 69 6c 64 29 2e 20 54  ent -> child). T
1a70: 68 69 73 20 69 73 20 70 75 6c 6c 65 64 20 66 72  his is pulled fr
1a80: 6f 6d 0a 09 23 20 74 68 65 20 73 74 61 74 65 2c  om..# the state,
1a90: 20 61 6e 64 20 6c 69 6d 69 74 65 64 20 74 6f 20   and limited to 
1aa0: 73 75 63 63 65 73 73 6f 72 73 20 77 69 74 68 69  successors withi
1ab0: 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e  n the changeset.
1ac0: 0a 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 70  ...array set dep
1ad0: 65 6e 64 65 6e 63 69 65 73 20 7b 7d 0a 09 24 6d  endencies {}..$m
1ae0: 79 74 79 70 65 6f 62 6a 20 69 6e 74 65 72 6e 61  ytypeobj interna
1af0: 6c 73 75 63 63 65 73 73 6f 72 73 20 64 65 70 65  lsuccessors depe
1b00: 6e 64 65 6e 63 69 65 73 20 24 6d 79 69 74 65 6d  ndencies $myitem
1b10: 73 0a 09 69 66 20 7b 21 5b 61 72 72 61 79 20 73  s..if {![array s
1b20: 69 7a 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73  ize dependencies
1b30: 5d 7d 20 7b 72 65 74 75 72 6e 20 30 7d 20 3b 20  ]} {return 0} ; 
1b40: 23 20 4e 6f 74 68 69 6e 67 20 74 6f 20 62 72 65  # Nothing to bre
1b50: 61 6b 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20  ak....log write 
1b60: 35 20 63 73 65 74 73 20 2e 2e 2e 5b 24 73 65 6c  5 csets ...[$sel
1b70: 66 20 73 74 72 5d 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  f str]..........
1b80: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1b90: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1ba0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 0a 0a 09  ................
1bb0: 23 20 57 65 20 68 61 76 65 20 69 6e 74 65 72 6e  # We have intern
1bc0: 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  al dependencies 
1bd0: 74 6f 20 62 72 65 61 6b 2e 20 57 65 20 6e 6f 77  to break. We now
1be0: 20 69 74 65 72 61 74 65 20 6f 76 65 72 0a 09 23   iterate over..#
1bf0: 20 61 6c 6c 20 70 6f 73 69 74 69 6f 6e 73 20 69   all positions i
1c00: 6e 20 74 68 65 20 6c 69 73 74 20 28 77 68 69 63  n the list (whic
1c10: 68 20 69 73 20 63 68 72 6f 6e 6f 6c 6f 67 69 63  h is chronologic
1c20: 61 6c 2c 20 61 74 20 6c 65 61 73 74 0a 09 23 20  al, at least..# 
1c30: 61 73 20 66 61 72 20 61 73 20 74 68 65 20 74 69  as far as the ti
1c40: 6d 65 73 74 61 6d 70 73 20 61 72 65 20 63 6f 72  mestamps are cor
1c50: 72 65 63 74 20 61 6e 64 20 75 6e 69 71 75 65 29  rect and unique)
1c60: 20 61 6e 64 0a 09 23 20 64 65 74 65 72 6d 69 6e   and..# determin
1c70: 65 20 74 68 65 20 62 65 73 74 20 70 6f 73 69 74  e the best posit
1c80: 69 6f 6e 20 66 6f 72 20 74 68 65 20 62 72 65 61  ion for the brea
1c90: 6b 2c 20 62 79 20 74 72 79 69 6e 67 20 74 6f 0a  k, by trying to.
1ca0: 09 23 20 62 72 65 61 6b 20 61 73 20 6d 61 6e 79  .# break as many
1cb0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 61 73   dependencies as
1cc0: 20 70 6f 73 73 69 62 6c 65 20 69 6e 20 6f 6e 65   possible in one
1cd0: 20 67 6f 2e 20 57 68 65 6e 20 61 0a 09 23 20 62   go. When a..# b
1ce0: 72 65 61 6b 20 77 61 73 20 66 6f 75 6e 64 20 74  reak was found t
1cf0: 68 69 73 20 69 73 20 72 65 64 6f 6e 65 20 66 6f  his is redone fo
1d00: 72 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 20  r the fragments 
1d10: 63 6f 6d 69 6e 67 20 61 6e 64 0a 09 23 20 61 66  coming and..# af
1d20: 74 65 72 2c 20 61 66 74 65 72 20 75 70 64 69 6e  ter, after updin
1d30: 67 20 74 68 65 20 63 72 6f 73 73 69 6e 67 20 69  g the crossing i
1d40: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 0a 09 23 20  nformation....# 
1d50: 44 61 74 61 20 73 74 72 75 63 74 75 72 65 73 3a  Data structures:
1d60: 0a 09 23 20 4d 61 70 3a 20 20 50 4f 53 20 20 20  ..# Map:  POS   
1d70: 72 65 76 69 73 69 6f 6e 20 69 64 20 20 20 20 20  revision id     
1d80: 20 2d 3e 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20   -> position in 
1d90: 6c 69 73 74 2e 0a 09 23 20 20 20 20 20 20 20 43  list...#       C
1da0: 52 4f 53 53 20 70 6f 73 69 74 69 6f 6e 20 69 6e  ROSS position in
1db0: 20 6c 69 73 74 20 2d 3e 20 6e 75 6d 62 65 72 20   list -> number 
1dc0: 6f 66 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  of dependencies 
1dd0: 63 72 6f 73 73 69 6e 67 20 69 74 0a 09 23 20 20  crossing it..#  
1de0: 20 20 20 20 20 44 45 50 43 20 20 64 65 70 65 6e       DEPC  depen
1df0: 64 65 6e 63 79 20 20 20 20 20 20 20 2d 3e 20 70  dency       -> p
1e00: 6f 73 69 74 69 6f 6e 73 20 69 74 20 63 72 6f 73  ositions it cros
1e10: 73 65 73 0a 09 23 20 4c 69 73 74 3a 20 52 41 4e  ses..# List: RAN
1e20: 47 45 20 4f 66 20 74 68 65 20 70 6f 73 69 74 69  GE Of the positi
1e30: 6f 6e 73 20 69 74 73 65 6c 66 2e 0a 09 23 20 41  ons itself...# A
1e40: 20 64 65 70 65 6e 64 65 6e 63 79 20 69 73 20 61   dependency is a
1e50: 20 73 69 6e 67 6c 65 2d 65 6c 65 6d 65 6e 74 20   single-element 
1e60: 6d 61 70 20 70 61 72 65 6e 74 20 2d 3e 20 63 68  map parent -> ch
1e70: 69 6c 64 0a 0a 09 49 6e 69 74 69 61 6c 69 7a 65  ild...Initialize
1e80: 42 72 65 61 6b 53 74 61 74 65 20 24 6d 79 69 74  BreakState $myit
1e90: 65 6d 73 0a 0a 09 73 65 74 20 66 72 61 67 6d 65  ems...set fragme
1ea0: 6e 74 73 20 7b 7d 0a 09 73 65 74 20 6e 65 77 20  nts {}..set new 
1eb0: 20 20 20 20 20 20 5b 6c 69 73 74 20 24 72 61 6e        [list $ran
1ec0: 67 65 5d 0a 09 61 72 72 61 79 20 73 65 74 20 62  ge]..array set b
1ed0: 72 65 61 6b 73 20 7b 7d 0a 0a 09 23 20 49 6e 73  reaks {}...# Ins
1ee0: 74 65 61 64 20 6f 66 20 6f 6e 65 20 6c 69 73 74  tead of one list
1ef0: 20 68 6f 6c 64 69 6e 67 20 62 6f 74 68 20 70 72   holding both pr
1f00: 6f 63 65 73 73 65 64 20 61 6e 64 20 70 65 6e 64  ocessed and pend
1f10: 69 6e 67 0a 09 23 20 66 72 61 67 6d 65 6e 74 73  ing..# fragments
1f20: 20 77 65 20 75 73 65 20 74 77 6f 2c 20 6f 6e 65   we use two, one
1f30: 20 66 6f 72 20 74 68 65 20 66 72 61 6d 65 6e 74   for the frament
1f40: 73 20 74 6f 20 70 72 6f 63 65 73 73 2c 20 6f 6e  s to process, on
1f50: 65 0a 09 23 20 74 6f 20 68 6f 6c 64 20 74 68 65  e..# to hold the
1f60: 20 6e 65 77 20 66 72 61 67 6d 65 6e 74 73 2c 20   new fragments, 
1f70: 61 6e 64 20 74 68 65 20 6c 61 74 74 65 72 20 69  and the latter i
1f80: 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65 0a  s copied to the.
1f90: 09 23 20 66 6f 72 6d 65 72 20 77 68 65 6e 20 74  .# former when t
1fa0: 68 65 79 20 72 75 6e 20 6f 75 74 2e 20 54 68 69  hey run out. Thi
1fb0: 73 20 6b 65 65 70 73 20 74 68 65 20 6c 69 73 74  s keeps the list
1fc0: 20 6f 66 20 70 65 6e 64 69 6e 67 0a 09 23 20 66   of pending..# f
1fd0: 72 61 67 6d 65 6e 74 73 20 73 68 6f 72 74 20 77  ragments short w
1fe0: 69 74 68 6f 75 74 20 73 61 63 72 69 66 69 63 69  ithout sacrifici
1ff0: 6e 67 20 73 70 65 65 64 20 62 79 20 73 68 69 66  ng speed by shif
2000: 74 69 6e 67 20 73 74 75 66 66 0a 09 23 20 64 6f  ting stuff..# do
2010: 77 6e 2e 20 57 65 20 65 73 70 65 63 69 61 6c 6c  wn. We especiall
2020: 79 20 64 72 6f 70 20 74 68 65 20 6d 65 6d 6f 72  y drop the memor
2030: 79 20 6f 66 20 66 72 61 67 6d 65 6e 74 73 20 62  y of fragments b
2040: 72 6f 6b 65 6e 0a 09 23 20 64 75 72 69 6e 67 20  roken..# during 
2050: 70 72 6f 63 65 73 73 69 6e 67 20 61 66 74 65 72  processing after
2060: 20 61 20 73 68 6f 72 74 20 74 69 6d 65 2c 20 69   a short time, i
2070: 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e  nstead of lettin
2080: 67 20 69 74 0a 09 23 20 63 6f 6e 73 75 6d 65 20  g it..# consume 
2090: 6d 65 6d 6f 72 79 2e 0a 0a 09 77 68 69 6c 65 20  memory....while 
20a0: 7b 5b 6c 6c 65 6e 67 74 68 20 24 6e 65 77 5d 7d  {[llength $new]}
20b0: 20 7b 0a 0a 09 20 20 20 20 73 65 74 20 70 65 6e   {...    set pen
20c0: 64 69 6e 67 20 24 6e 65 77 0a 09 20 20 20 20 73  ding $new..    s
20d0: 65 74 20 6e 65 77 20 20 20 20 20 7b 7d 0a 09 20  et new     {}.. 
20e0: 20 20 20 73 65 74 20 61 74 20 20 20 20 20 20 30     set at      0
20f0: 0a 0a 09 20 20 20 20 77 68 69 6c 65 20 7b 24 61  ...    while {$a
2100: 74 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24 70 65  t < [llength $pe
2110: 6e 64 69 6e 67 5d 7d 20 7b 0a 09 09 73 65 74 20  nding]} {...set 
2120: 63 75 72 72 65 6e 74 20 5b 6c 69 6e 64 65 78 20  current [lindex 
2130: 24 70 65 6e 64 69 6e 67 20 24 61 74 5d 0a 0a 09  $pending $at]...
2140: 09 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65  .log write 6 cse
2150: 74 73 20 7b 2e 20 2e 20 2e 2e 20 2e 2e 2e 20 2e  ts {. . .. ... .
2160: 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e  .... ........ ..
2170: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 7d 0a 09 09 6c  ...........}...l
2180: 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73  og write 6 csets
2190: 20 7b 53 63 68 65 64 75 6c 65 64 20 20 20 5b 6a   {Scheduled   [j
21a0: 6f 69 6e 20 5b 50 52 73 20 5b 6c 72 61 6e 67 65  oin [PRs [lrange
21b0: 20 24 70 65 6e 64 69 6e 67 20 24 61 74 20 65 6e   $pending $at en
21c0: 64 5d 5d 20 7b 20 7d 5d 7d 0a 09 09 6c 6f 67 20  d]] { }]}...log 
21d0: 77 72 69 74 65 20 36 20 63 73 65 74 73 20 7b 43  write 6 csets {C
21e0: 6f 6e 73 69 64 65 72 69 6e 67 20 5b 50 52 20 24  onsidering [PR $
21f0: 63 75 72 72 65 6e 74 5d 20 5c 5b 24 61 74 2f 5b  current] \[$at/[
2200: 6c 6c 65 6e 67 74 68 20 24 70 65 6e 64 69 6e 67  llength $pending
2210: 5d 5c 5d 7d 0a 0a 09 09 73 65 74 20 62 65 73 74  ]\]}....set best
2220: 20 5b 46 69 6e 64 42 65 73 74 42 72 65 61 6b 20   [FindBestBreak 
2230: 24 63 75 72 72 65 6e 74 5d 0a 0a 09 09 69 66 20  $current]....if 
2240: 7b 24 62 65 73 74 20 3c 20 30 7d 20 7b 0a 09 09  {$best < 0} {...
2250: 20 20 20 20 23 20 54 68 65 20 69 6e 73 70 65 63      # The inspec
2260: 74 65 64 20 72 61 6e 67 65 20 68 61 73 20 6e 6f  ted range has no
2270: 20 69 6e 74 65 72 6e 61 6c 0a 09 09 20 20 20 20   internal...    
2280: 23 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20  # dependencies. 
2290: 54 68 69 73 20 69 73 20 61 20 63 6f 6d 70 6c 65  This is a comple
22a0: 74 65 20 66 72 61 67 6d 65 6e 74 2e 0a 09 09 20  te fragment.... 
22b0: 20 20 20 6c 61 70 70 65 6e 64 20 66 72 61 67 6d     lappend fragm
22c0: 65 6e 74 73 20 24 63 75 72 72 65 6e 74 0a 0a 09  ents $current...
22d0: 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 36  .    log write 6
22e0: 20 63 73 65 74 73 20 22 4e 6f 20 62 72 65 61 6b   csets "No break
22f0: 73 2c 20 66 69 6e 61 6c 22 0a 09 09 7d 20 65 6c  s, final"...} el
2300: 73 65 20 7b 0a 09 09 20 20 20 20 23 20 53 70 6c  se {...    # Spl
2310: 69 74 20 74 68 65 20 72 61 6e 67 65 20 61 6e 64  it the range and
2320: 20 73 63 68 65 64 75 6c 65 20 74 68 65 20 72 65   schedule the re
2330: 73 75 6c 74 69 6e 67 0a 09 09 20 20 20 20 23 20  sulting...    # 
2340: 66 72 61 67 6d 65 6e 74 73 20 66 6f 72 20 66 75  fragments for fu
2350: 72 74 68 65 72 20 69 6e 73 70 65 63 74 69 6f 6e  rther inspection
2360: 2e 20 52 65 6d 65 6d 62 65 72 20 74 68 65 0a 09  . Remember the..
2370: 09 20 20 20 20 23 20 6e 75 6d 62 65 72 20 6f 66  .    # number of
2380: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 63 75   dependencies cu
2390: 74 20 62 65 66 6f 72 65 20 77 65 20 72 65 6d 6f  t before we remo
23a0: 76 65 20 74 68 65 6d 0a 09 09 20 20 20 20 23 20  ve them...    # 
23b0: 66 72 6f 6d 20 63 6f 6e 73 69 64 65 72 61 74 69  from considerati
23c0: 6f 6e 2c 20 66 6f 72 20 64 6f 63 75 6d 65 6e 74  on, for document
23d0: 61 74 69 6f 6e 20 6c 61 74 65 72 2e 0a 0a 09 09  ation later.....
23e0: 20 20 20 20 73 65 74 20 62 72 65 61 6b 73 28 24      set breaks($
23f0: 62 65 73 74 29 20 24 63 72 6f 73 73 28 24 62 65  best) $cross($be
2400: 73 74 29 0a 0a 09 09 20 20 20 20 6c 6f 67 20 77  st)....    log w
2410: 72 69 74 65 20 36 20 63 73 65 74 73 20 22 42 65  rite 6 csets "Be
2420: 73 74 20 62 72 65 61 6b 20 40 20 24 62 65 73 74  st break @ $best
2430: 2c 20 63 75 74 74 69 6e 67 20 5b 6e 73 70 20 24  , cutting [nsp $
2440: 63 72 6f 73 73 28 24 62 65 73 74 29 20 64 65 70  cross($best) dep
2450: 65 6e 64 65 6e 63 79 20 64 65 70 65 6e 64 65 6e  endency dependen
2460: 63 69 65 73 5d 22 0a 0a 09 09 20 20 20 20 23 20  cies]"....    # 
2470: 4e 6f 74 65 3a 20 54 68 65 20 76 61 6c 75 65 20  Note: The value 
2480: 6f 66 20 62 65 73 74 20 69 73 20 61 6e 20 61 62  of best is an ab
2490: 6f 6c 75 74 65 20 6c 6f 63 61 74 69 6f 6e 0a 09  olute location..
24a0: 09 20 20 20 20 23 20 69 6e 20 6d 79 69 74 65 6d  .    # in myitem
24b0: 73 2e 20 55 73 65 20 74 68 65 20 73 74 61 72 74  s. Use the start
24c0: 20 6f 66 20 63 75 72 72 65 6e 74 20 74 6f 20 6d   of current to m
24d0: 61 6b 65 20 69 74 0a 09 09 20 20 20 20 23 20 61  ake it...    # a
24e0: 6e 20 69 6e 64 65 78 20 61 62 73 6f 6c 75 74 65  n index absolute
24f0: 20 74 6f 20 63 75 72 72 65 6e 74 2e 0a 0a 09 09   to current.....
2500: 20 20 20 20 73 65 74 20 62 72 65 6c 20 5b 65 78      set brel [ex
2510: 70 72 20 7b 24 62 65 73 74 20 2d 20 5b 6c 69 6e  pr {$best - [lin
2520: 64 65 78 20 24 63 75 72 72 65 6e 74 20 30 5d 7d  dex $current 0]}
2530: 5d 0a 09 09 20 20 20 20 73 65 74 20 62 6e 65 78  ]...    set bnex
2540: 74 20 24 62 72 65 6c 20 3b 20 69 6e 63 72 20 62  t $brel ; incr b
2550: 6e 65 78 74 0a 09 09 20 20 20 20 73 65 74 20 66  next...    set f
2560: 72 61 67 62 65 66 6f 72 65 20 5b 6c 72 61 6e 67  ragbefore [lrang
2570: 65 20 24 63 75 72 72 65 6e 74 20 30 20 24 62 72  e $current 0 $br
2580: 65 6c 5d 0a 09 09 20 20 20 20 73 65 74 20 66 72  el]...    set fr
2590: 61 67 61 66 74 65 72 20 20 5b 6c 72 61 6e 67 65  agafter  [lrange
25a0: 20 24 63 75 72 72 65 6e 74 20 24 62 6e 65 78 74   $current $bnext
25b0: 20 65 6e 64 5d 0a 0a 09 09 20 20 20 20 6c 6f 67   end]....    log
25c0: 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22   write 6 csets "
25d0: 4e 65 77 20 70 69 65 63 65 73 20 20 5b 50 52 20  New pieces  [PR 
25e0: 24 66 72 61 67 62 65 66 6f 72 65 5d 20 5b 50 52  $fragbefore] [PR
25f0: 20 24 66 72 61 67 61 66 74 65 72 5d 22 0a 0a 09   $fragafter]"...
2600: 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61  .    integrity a
2610: 73 73 65 72 74 20 7b 5b 6c 6c 65 6e 67 74 68 20  ssert {[llength 
2620: 24 66 72 61 67 62 65 66 6f 72 65 5d 7d 20 7b 46  $fragbefore]} {F
2630: 6f 75 6e 64 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  ound zero-length
2640: 20 66 72 61 67 6d 65 6e 74 20 61 74 20 74 68 65   fragment at the
2650: 20 62 65 67 69 6e 6e 69 6e 67 7d 0a 09 09 20 20   beginning}...  
2660: 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 65    integrity asse
2670: 72 74 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 72  rt {[llength $fr
2680: 61 67 61 66 74 65 72 5d 7d 20 20 7b 46 6f 75 6e  agafter]}  {Foun
2690: 64 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 72  d zero-length fr
26a0: 61 67 6d 65 6e 74 20 61 74 20 74 68 65 20 65 6e  agment at the en
26b0: 64 7d 0a 0a 09 09 20 20 20 20 6c 61 70 70 65 6e  d}....    lappen
26c0: 64 20 6e 65 77 20 24 66 72 61 67 62 65 66 6f 72  d new $fragbefor
26d0: 65 20 24 66 72 61 67 61 66 74 65 72 0a 09 09 20  e $fragafter... 
26e0: 20 20 20 43 75 74 41 74 20 24 62 65 73 74 0a 09     CutAt $best..
26f0: 09 7d 0a 0a 09 09 69 6e 63 72 20 61 74 0a 09 20  .}....incr at.. 
2700: 20 20 20 7d 0a 09 7d 0a 0a 09 6c 6f 67 20 77 72     }..}...log wr
2710: 69 74 65 20 36 20 63 73 65 74 73 20 22 2e 20 2e  ite 6 csets ". .
2720: 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e   .. ... ..... ..
2730: 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e  ...... .........
2740: 2e 2e 2e 2e 22 0a 0a 09 23 20 28 2a 29 20 57 65  ...."...# (*) We
2750: 20 63 6c 65 61 72 20 6f 75 74 20 74 68 65 20 61   clear out the a
2760: 73 73 6f 63 69 61 74 65 64 20 70 61 72 74 20 6f  ssociated part o
2770: 66 20 74 68 65 20 6d 79 69 74 65 6d 6d 61 70 0a  f the myitemmap.
2780: 09 23 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6e 64  .# in-memory ind
2790: 65 78 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f  ex in preparatio
27a0: 6e 20 66 6f 72 20 6e 65 77 20 64 61 74 61 2e 20  n for new data. 
27b0: 41 20 73 69 6d 70 6c 65 20 75 6e 73 65 74 0a 09  A simple unset..
27c0: 23 20 69 73 20 65 6e 6f 75 67 68 2c 20 77 65 20  # is enough, we 
27d0: 68 61 76 65 20 6e 6f 20 73 79 6d 62 6f 6c 20 63  have no symbol c
27e0: 68 61 6e 67 65 73 65 74 73 20 61 74 20 74 68 69  hangesets at thi
27f0: 73 20 74 69 6d 65 2c 20 61 6e 64 0a 09 23 20 74  s time, and..# t
2800: 68 75 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74  hus never more t
2810: 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63  han one referenc
2820: 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 0a  e in the list...
2830: 09 66 6f 72 65 61 63 68 20 69 69 64 20 24 6d 79  .foreach iid $my
2840: 69 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65 74  items {..    set
2850: 20 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79 74 79   key [list $myty
2860: 70 65 20 24 69 69 64 5d 0a 09 20 20 20 20 75 6e  pe $iid]..    un
2870: 73 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24 6b  set myitemmap($k
2880: 65 79 29 0a 09 20 20 20 20 6c 6f 67 20 77 72 69  ey)..    log wri
2890: 74 65 20 38 20 63 73 65 74 73 20 7b 4d 41 50 2d  te 8 csets {MAP-
28a0: 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73 65   item <$key> $se
28b0: 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d  lf = [$self str]
28c0: 7d 0a 09 7d 0a 0a 09 23 20 43 72 65 61 74 65 20  }..}...# Create 
28d0: 63 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20 74  changesets for t
28e0: 68 65 20 66 72 61 67 6d 65 6e 74 73 2c 20 72 65  he fragments, re
28f0: 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e  using the curren
2900: 74 20 6f 6e 65 0a 09 23 20 66 6f 72 20 74 68 65  t one..# for the
2910: 20 66 69 72 73 74 20 66 72 61 67 6d 65 6e 74 2e   first fragment.
2920: 20 57 65 20 73 6f 72 74 20 74 68 65 6d 20 69 6e   We sort them in
2930: 20 6f 72 64 65 72 20 74 6f 20 61 6c 6c 6f 77 0a   order to allow.
2940: 09 23 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20  .# checking for 
2950: 67 61 70 73 20 61 6e 64 20 6e 69 63 65 20 6d 65  gaps and nice me
2960: 73 73 61 67 65 73 2e 0a 0a 09 73 65 74 20 66 72  ssages....set fr
2970: 61 67 6d 65 6e 74 73 20 5b 6c 73 6f 72 74 20 2d  agments [lsort -
2980: 69 6e 64 65 78 20 30 20 2d 69 6e 74 65 67 65 72  index 0 -integer
2990: 20 24 66 72 61 67 6d 65 6e 74 73 5d 0a 0a 09 23   $fragments]...#
29a0: 70 75 74 73 20 5c 74 2e 5b 6a 6f 69 6e 20 5b 50  puts \t.[join [P
29b0: 52 73 20 24 66 72 61 67 6d 65 6e 74 73 5d 20 2e  Rs $fragments] .
29c0: 5c 6e 5c 74 2e 5d 2e 0a 0a 09 42 6f 72 64 65 72  \n\t.]....Border
29d0: 20 5b 6c 69 6e 64 65 78 20 24 66 72 61 67 6d 65   [lindex $fragme
29e0: 6e 74 73 20 30 5d 20 66 69 72 73 74 73 20 66 69  nts 0] firsts fi
29f0: 72 73 74 65 0a 0a 09 69 6e 74 65 67 72 69 74 79  rste...integrity
2a00: 20 61 73 73 65 72 74 20 7b 24 66 69 72 73 74 73   assert {$firsts
2a10: 20 3d 3d 20 30 7d 20 7b 42 61 64 20 66 72 61 67   == 0} {Bad frag
2a20: 6d 65 6e 74 20 73 74 61 72 74 20 40 20 24 66 69  ment start @ $fi
2a30: 72 73 74 73 2c 20 67 61 70 2c 20 6f 72 20 62 65  rsts, gap, or be
2a40: 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f  fore beginning o
2a50: 66 20 74 68 65 20 72 61 6e 67 65 7d 0a 0a 09 73  f the range}...s
2a60: 65 74 20 6c 61 73 74 65 20 24 66 69 72 73 74 65  et laste $firste
2a70: 0a 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65  ..foreach fragme
2a80: 6e 74 20 5b 6c 72 61 6e 67 65 20 24 66 72 61 67  nt [lrange $frag
2a90: 6d 65 6e 74 73 20 31 20 65 6e 64 5d 20 7b 0a 09  ments 1 end] {..
2aa0: 20 20 20 20 42 6f 72 64 65 72 20 24 66 72 61 67      Border $frag
2ab0: 6d 65 6e 74 20 73 20 65 0a 09 20 20 20 20 69 6e  ment s e..    in
2ac0: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b  tegrity assert {
2ad0: 24 6c 61 73 74 65 20 3d 3d 20 28 24 73 20 2d 20  $laste == ($s - 
2ae0: 31 29 7d 20 7b 42 61 64 20 66 72 61 67 6d 65 6e  1)} {Bad fragmen
2af0: 74 20 62 6f 72 64 65 72 20 3c 24 6c 61 73 74 65  t border <$laste
2b00: 20 7c 20 24 73 3e 2c 20 67 61 70 20 6f 72 20 6f   | $s>, gap or o
2b10: 76 65 72 6c 61 70 7d 0a 0a 09 20 20 20 20 73 65  verlap}...    se
2b20: 74 20 6e 65 77 20 5b 24 74 79 70 65 20 25 41 55  t new [$type %AU
2b30: 54 4f 25 20 24 6d 79 70 72 6f 6a 65 63 74 20 24  TO% $myproject $
2b40: 6d 79 74 79 70 65 20 24 6d 79 73 72 63 69 64 20  mytype $mysrcid 
2b50: 5b 6c 72 61 6e 67 65 20 24 6d 79 69 74 65 6d 73  [lrange $myitems
2b60: 20 24 73 20 24 65 5d 5d 0a 0a 20 20 20 20 20 20   $s $e]]..      
2b70: 20 20 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20        log write 
2b80: 34 20 63 73 65 74 73 20 22 42 72 65 61 6b 69 6e  4 csets "Breakin
2b90: 67 20 5b 24 73 65 6c 66 20 73 74 72 20 5d 20 40  g [$self str ] @
2ba0: 20 24 6c 61 73 74 65 2c 20 6e 65 77 20 5b 24 6e   $laste, new [$n
2bb0: 65 77 20 73 74 72 5d 2c 20 63 75 74 74 69 6e 67  ew str], cutting
2bc0: 20 24 62 72 65 61 6b 73 28 24 6c 61 73 74 65 29   $breaks($laste)
2bd0: 22 0a 0a 09 20 20 20 20 73 65 74 20 6c 61 73 74  "...    set last
2be0: 65 20 24 65 0a 09 7d 0a 0a 09 69 6e 74 65 67 72  e $e..}...integr
2bf0: 69 74 79 20 61 73 73 65 72 74 20 7b 0a 09 20 20  ity assert {..  
2c00: 20 20 24 6c 61 73 74 65 20 3d 3d 20 28 5b 6c 6c    $laste == ([ll
2c10: 65 6e 67 74 68 20 24 6d 79 69 74 65 6d 73 5d 2d  ength $myitems]-
2c20: 31 29 0a 09 7d 20 7b 42 61 64 20 66 72 61 67 6d  1)..} {Bad fragm
2c30: 65 6e 74 20 65 6e 64 20 40 20 24 6c 61 73 74 65  ent end @ $laste
2c40: 2c 20 67 61 70 2c 20 6f 72 20 62 65 79 6f 6e 64  , gap, or beyond
2c50: 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67   end of the rang
2c60: 65 7d 0a 0a 09 23 20 50 75 74 20 74 68 65 20 66  e}...# Put the f
2c70: 69 72 73 74 20 66 72 61 67 6d 65 6e 74 20 69 6e  irst fragment in
2c80: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 63  to the current c
2c90: 68 61 6e 67 65 73 65 74 2c 20 61 6e 64 0a 09 23  hangeset, and..#
2ca0: 20 75 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d   update the in-m
2cb0: 65 6d 6f 72 79 20 69 6e 64 65 78 2e 20 57 65 20  emory index. We 
2cc0: 63 61 6e 20 73 69 6d 70 6c 79 20 28 72 65 29 61  can simply (re)a
2cd0: 64 64 20 74 68 65 20 69 74 65 6d 73 0a 09 23 20  dd the items..# 
2ce0: 62 65 63 61 75 73 65 20 77 65 20 63 6c 65 61 72  because we clear
2cf0: 65 64 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c  ed the previousl
2d00: 79 20 65 78 69 73 74 69 6e 67 20 69 6e 66 6f 72  y existing infor
2d10: 6d 61 74 69 6f 6e 2c 20 73 65 65 0a 09 23 20 28  mation, see..# (
2d20: 2a 29 20 61 62 6f 76 65 2e 20 50 65 72 73 69 73  *) above. Persis
2d30: 74 65 6e 63 65 20 64 6f 65 73 20 6e 6f 74 20 6d  tence does not m
2d40: 61 74 74 65 72 20 68 65 72 65 2c 20 6e 6f 6e 65  atter here, none
2d50: 20 6f 66 20 74 68 65 0a 09 23 20 63 68 61 6e 67   of the..# chang
2d60: 65 73 65 74 73 20 68 61 73 20 62 65 65 6e 20 73  esets has been s
2d70: 61 76 65 64 20 74 6f 20 74 68 65 20 70 65 72 73  aved to the pers
2d80: 69 73 74 65 6e 74 20 73 74 61 74 65 20 79 65 74  istent state yet
2d90: 2e 0a 0a 09 73 65 74 20 6d 79 69 74 65 6d 73 20  ....set myitems 
2da0: 20 5b 6c 72 61 6e 67 65 20 24 6d 79 69 74 65 6d   [lrange $myitem
2db0: 73 20 20 30 20 24 66 69 72 73 74 65 5d 0a 09 73  s  0 $firste]..s
2dc0: 65 74 20 6d 79 74 69 74 65 6d 73 20 5b 6c 72 61  et mytitems [lra
2dd0: 6e 67 65 20 24 6d 79 74 69 74 65 6d 73 20 30 20  nge $mytitems 0 
2de0: 24 66 69 72 73 74 65 5d 0a 09 66 6f 72 65 61 63  $firste]..foreac
2df0: 68 20 69 69 64 20 24 6d 79 69 74 65 6d 73 20 7b  h iid $myitems {
2e00: 0a 09 20 20 20 20 73 65 74 20 6b 65 79 20 5b 6c  ..    set key [l
2e10: 69 73 74 20 24 6d 79 74 79 70 65 20 24 69 69 64  ist $mytype $iid
2e20: 5d 0a 09 20 20 20 20 73 65 74 20 6d 79 69 74 65  ]..    set myite
2e30: 6d 6d 61 70 28 24 6b 65 79 29 20 24 73 65 6c 66  mmap($key) $self
2e40: 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20  ..    log write 
2e50: 38 20 63 73 65 74 73 20 7b 4d 41 50 2b 20 69 74  8 csets {MAP+ it
2e60: 65 6d 20 3c 24 6b 65 79 3e 20 24 73 65 6c 66 20  em <$key> $self 
2e70: 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d 7d 0a 09  = [$self str]}..
2e80: 7d 0a 0a 09 72 65 74 75 72 6e 20 31 0a 20 20 20  }...return 1.   
2e90: 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 70   }..    method p
2ea0: 65 72 73 69 73 74 20 7b 7d 20 7b 0a 09 73 65 74  ersist {} {..set
2eb0: 20 74 69 64 20 24 6d 79 63 73 74 79 70 65 28 24   tid $mycstype($
2ec0: 6d 79 74 79 70 65 29 0a 09 73 65 74 20 70 69 64  mytype)..set pid
2ed0: 20 5b 24 6d 79 70 72 6f 6a 65 63 74 20 69 64 5d   [$myproject id]
2ee0: 0a 09 73 65 74 20 70 6f 73 20 30 0a 0a 09 73 74  ..set pos 0...st
2ef0: 61 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ate transaction 
2f00: 7b 0a 09 20 20 20 20 73 74 61 74 65 20 72 75 6e  {..    state run
2f10: 20 7b 0a 09 09 49 4e 53 45 52 54 20 49 4e 54 4f   {...INSERT INTO
2f20: 20 63 68 61 6e 67 65 73 65 74 20 28 63 69 64 2c   changeset (cid,
2f30: 20 20 20 70 69 64 2c 20 20 74 79 70 65 2c 20 73     pid,  type, s
2f40: 72 63 29 0a 09 09 56 41 4c 55 45 53 20 20 20 20  rc)...VALUES    
2f50: 20 20 20 20 20 20 20 20 20 20 20 20 28 24 6d 79              ($my
2f60: 69 64 2c 20 24 70 69 64 2c 20 24 74 69 64 2c 20  id, $pid, $tid, 
2f70: 24 6d 79 73 72 63 69 64 29 3b 0a 09 20 20 20 20  $mysrcid);..    
2f80: 7d 0a 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20  }...    foreach 
2f90: 69 69 64 20 24 6d 79 69 74 65 6d 73 20 7b 0a 09  iid $myitems {..
2fa0: 09 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 20  .state run {... 
2fb0: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
2fc0: 73 69 74 65 6d 20 28 63 69 64 2c 20 20 20 70 6f  sitem (cid,   po
2fd0: 73 2c 20 20 69 69 64 29 0a 09 09 20 20 20 20 56  s,  iid)...    V
2fe0: 41 4c 55 45 53 20 20 20 20 20 20 20 20 20 20 20  ALUES           
2ff0: 20 20 28 24 6d 79 69 64 2c 20 24 70 6f 73 2c 20    ($myid, $pos, 
3000: 24 69 69 64 29 3b 0a 09 09 7d 0a 09 09 69 6e 63  $iid);...}...inc
3010: 72 20 70 6f 73 0a 09 20 20 20 20 7d 0a 09 7d 0a  r pos..    }..}.
3020: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
3030: 20 20 20 6d 65 74 68 6f 64 20 74 69 6d 65 72 61     method timera
3040: 6e 67 65 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20  nge {} { return 
3050: 5b 24 6d 79 74 79 70 65 6f 62 6a 20 74 69 6d 65  [$mytypeobj time
3060: 72 61 6e 67 65 20 24 6d 79 69 74 65 6d 73 5d 20  range $myitems] 
3070: 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 64 72  }..    method dr
3080: 6f 70 20 7b 7d 20 7b 0a 09 6c 6f 67 20 77 72 69  op {} {..log wri
3090: 74 65 20 38 20 63 73 65 74 73 20 7b 44 72 6f 70  te 8 csets {Drop
30a0: 70 69 6e 67 20 24 73 65 6c 66 20 3d 20 5b 24 73  ping $self = [$s
30b0: 65 6c 66 20 73 74 72 5d 7d 0a 0a 09 73 74 61 74  elf str]}...stat
30c0: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a  e transaction {.
30d0: 09 20 20 20 20 73 74 61 74 65 20 72 75 6e 20 7b  .    state run {
30e0: 0a 09 09 44 45 4c 45 54 45 20 46 52 4f 4d 20 63  ...DELETE FROM c
30f0: 68 61 6e 67 65 73 65 74 20 20 20 57 48 45 52 45  hangeset   WHERE
3100: 20 63 69 64 20 3d 20 24 6d 79 69 64 3b 0a 09 09   cid = $myid;...
3110: 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 73 69 74  DELETE FROM csit
3120: 65 6d 20 20 20 20 20 20 57 48 45 52 45 20 63 69  em      WHERE ci
3130: 64 20 3d 20 24 6d 79 69 64 3b 0a 09 09 44 45 4c  d = $myid;...DEL
3140: 45 54 45 20 46 52 4f 4d 20 63 73 73 75 63 63 65  ETE FROM cssucce
3150: 73 73 6f 72 20 57 48 45 52 45 20 63 69 64 20 3d  ssor WHERE cid =
3160: 20 24 6d 79 69 64 3b 0a 09 20 20 20 20 7d 0a 09   $myid;..    }..
3170: 7d 0a 09 66 6f 72 65 61 63 68 20 69 69 64 20 24  }..foreach iid $
3180: 6d 79 69 74 65 6d 73 20 7b 0a 09 20 20 20 20 73  myitems {..    s
3190: 65 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79  et key [list $my
31a0: 74 79 70 65 20 24 69 69 64 5d 0a 09 20 20 20 20  type $iid]..    
31b0: 75 6e 73 65 74 20 6d 79 69 74 65 6d 6d 61 70 28  unset myitemmap(
31c0: 24 6b 65 79 29 0a 09 20 20 20 20 6c 6f 67 20 77  $key)..    log w
31d0: 72 69 74 65 20 38 20 63 73 65 74 73 20 7b 4d 41  rite 8 csets {MA
31e0: 50 2d 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24  P- item <$key> $
31f0: 73 65 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74  self = [$self st
3200: 72 5d 7d 0a 09 7d 0a 09 73 65 74 20 70 6f 73 20  r]}..}..set pos 
3210: 20 20 20 20 20 20 20 20 20 5b 6c 73 65 61 72 63           [lsearc
3220: 68 20 2d 65 78 61 63 74 20 24 6d 79 63 68 61 6e  h -exact $mychan
3230: 67 65 73 65 74 73 20 24 73 65 6c 66 5d 0a 09 73  gesets $self]..s
3240: 65 74 20 6d 79 63 68 61 6e 67 65 73 65 74 73 20  et mychangesets 
3250: 5b 6c 72 65 70 6c 61 63 65 20 24 6d 79 63 68 61  [lreplace $mycha
3260: 6e 67 65 73 65 74 73 20 24 70 6f 73 20 24 70 6f  ngesets $pos $po
3270: 73 5d 0a 09 73 65 74 20 70 6f 73 20 20 20 20 20  s]..set pos     
3280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 5b                 [
3290: 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 24  lsearch -exact $
32a0: 6d 79 74 63 68 61 6e 67 65 73 65 74 73 28 24 6d  mytchangesets($m
32b0: 79 74 79 70 65 29 20 24 73 65 6c 66 5d 0a 09 73  ytype) $self]..s
32c0: 65 74 20 6d 79 74 63 68 61 6e 67 65 73 65 74 73  et mytchangesets
32d0: 28 24 6d 79 74 79 70 65 29 20 5b 6c 72 65 70 6c  ($mytype) [lrepl
32e0: 61 63 65 20 24 6d 79 74 63 68 61 6e 67 65 73 65  ace $mytchangese
32f0: 74 73 28 24 6d 79 74 79 70 65 29 20 24 70 6f 73  ts($mytype) $pos
3300: 20 24 70 6f 73 5d 0a 0a 09 23 20 52 65 74 75 72   $pos]...# Retur
3310: 6e 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 72  n the list of pr
3320: 65 64 65 63 65 73 73 6f 72 73 20 73 6f 20 74 68  edecessors so th
3330: 61 74 20 74 68 65 79 20 63 61 6e 20 62 65 20 61  at they can be a
3340: 64 6a 75 73 74 65 64 2e 0a 09 72 65 74 75 72 6e  djusted...return
3350: 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d   [struct::list m
3360: 61 70 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a  ap [state run {.
3370: 09 20 20 20 20 53 45 4c 45 43 54 20 63 69 64 0a  .    SELECT cid.
3380: 09 20 20 20 20 46 52 4f 4d 20 20 20 63 73 73 75  .    FROM   cssu
3390: 63 63 65 73 73 6f 72 0a 09 20 20 20 20 57 48 45  ccessor..    WHE
33a0: 52 45 20 20 6e 69 64 20 3d 20 24 6d 79 69 64 0a  RE  nid = $myid.
33b0: 09 7d 5d 20 5b 6d 79 74 79 70 65 6d 65 74 68 6f  .}] [mytypemetho
33c0: 64 20 6f 66 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20  d of]].    }..  
33d0: 20 20 6d 65 74 68 6f 64 20 72 65 70 6f 72 74 6c    method reportl
33e0: 6f 6f 70 20 7b 7b 6b 69 6c 6c 20 31 7d 7d 20 7b  oop {{kill 1}} {
33f0: 0a 09 23 20 57 65 20 70 72 69 6e 74 20 74 68 65  ..# We print the
3400: 20 69 74 65 6d 73 20 77 68 69 63 68 20 61 72 65   items which are
3410: 20 70 72 6f 64 75 63 69 6e 67 20 74 68 65 20 6c   producing the l
3420: 6f 6f 70 2c 20 61 6e 64 20 68 6f 77 2e 0a 0a 09  oop, and how....
3430: 73 65 74 20 68 64 72 20 22 53 65 6c 66 2d 72 65  set hdr "Self-re
3440: 66 65 72 65 6e 74 69 61 6c 20 63 68 61 6e 67 65  ferential change
3450: 73 65 74 20 5b 24 73 65 6c 66 20 73 74 72 5d 20  set [$self str] 
3460: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
3470: 5f 5f 22 0a 09 73 65 74 20 66 74 72 20 5b 72 65  __"..set ftr [re
3480: 67 73 75 62 20 2d 61 6c 6c 20 7b 5b 5e 20 09 5d  gsub -all {[^ .]
3490: 7d 20 24 68 64 72 20 7b 5f 7d 5d 0a 0a 09 6c 6f  } $hdr {_}]...lo
34a0: 67 20 77 72 69 74 65 20 30 20 63 73 65 74 73 20  g write 0 csets 
34b0: 24 68 64 72 0a 09 66 6f 72 65 61 63 68 20 7b 69  $hdr..foreach {i
34c0: 74 65 6d 20 6e 65 78 74 69 74 65 6d 7d 20 5b 24  tem nextitem} [$
34d0: 6d 79 74 79 70 65 6f 62 6a 20 6c 6f 6f 70 73 20  mytypeobj loops 
34e0: 24 6d 79 69 74 65 6d 73 5d 20 7b 0a 09 20 20 20  $myitems] {..   
34f0: 20 23 20 43 72 65 61 74 65 20 74 61 67 67 65 64   # Create tagged
3500: 20 69 74 65 6d 73 20 66 72 6f 6d 20 74 68 65 20   items from the 
3510: 69 64 20 61 6e 64 20 6f 75 72 20 74 79 70 65 2e  id and our type.
3520: 0a 09 20 20 20 20 73 65 74 20 69 74 65 6d 20 20  ..    set item  
3530: 20 20 20 5b 6c 69 73 74 20 24 6d 79 74 79 70 65     [list $mytype
3540: 20 20 24 69 74 65 6d 5d 0a 09 20 20 20 20 73 65    $item]..    se
3550: 74 20 6e 65 78 74 69 74 65 6d 20 5b 6c 69 73 74  t nextitem [list
3560: 20 24 6d 79 74 79 70 65 20 24 6e 65 78 74 69 74   $mytype $nextit
3570: 65 6d 5d 0a 09 20 20 20 20 23 20 50 72 69 6e 74  em]..    # Print
3580: 61 62 6c 65 20 6c 61 62 65 6c 73 2e 0a 09 20 20  able labels...  
3590: 20 20 73 65 74 20 69 20 20 22 3c 5b 24 74 79 70    set i  "<[$typ
35a0: 65 20 69 74 65 6d 73 74 72 20 24 69 74 65 6d 5d  e itemstr $item]
35b0: 3e 22 0a 09 20 20 20 20 73 65 74 20 6e 20 20 22  >"..    set n  "
35c0: 3c 5b 24 74 79 70 65 20 69 74 65 6d 73 74 72 20  <[$type itemstr 
35d0: 24 6e 65 78 74 69 74 65 6d 5d 3e 22 0a 09 20 20  $nextitem]>"..  
35e0: 20 20 73 65 74 20 6e 63 73 20 24 6d 79 69 74 65    set ncs $myite
35f0: 6d 6d 61 70 28 24 6e 65 78 74 69 74 65 6d 29 0a  mmap($nextitem).
3600: 09 20 20 20 20 23 20 50 72 69 6e 74 0a 09 20 20  .    # Print..  
3610: 20 20 6c 6f 67 20 77 72 69 74 65 20 30 20 63 73    log write 0 cs
3620: 65 74 73 20 7b 2a 20 24 69 20 2d 2d 3e 20 24 6e  ets {* $i --> $n
3630: 20 2d 2d 3e 20 63 73 20 5b 24 6e 63 73 20 73 74   --> cs [$ncs st
3640: 72 5d 7d 0a 09 7d 0a 09 6c 6f 67 20 77 72 69 74  r]}..}..log writ
3650: 65 20 30 20 63 73 65 74 73 20 24 66 74 72 0a 0a  e 0 csets $ftr..
3660: 09 69 66 20 7b 21 24 6b 69 6c 6c 7d 20 72 65 74  .if {!$kill} ret
3670: 75 72 6e 0a 09 74 72 6f 75 62 6c 65 20 69 6e 74  urn..trouble int
3680: 65 72 6e 61 6c 20 22 5b 24 73 65 6c 66 20 73 74  ernal "[$self st
3690: 72 5d 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 74  r] depends on it
36a0: 73 65 6c 66 22 0a 09 72 65 74 75 72 6e 0a 20 20  self"..return.  
36b0: 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74    }..    typemet
36c0: 68 6f 64 20 73 70 6c 69 74 20 7b 63 73 65 74 20  hod split {cset 
36d0: 61 72 67 73 7d 20 7b 0a 09 23 20 41 73 20 70 61  args} {..# As pa
36e0: 72 74 20 6f 66 20 74 68 65 20 63 72 65 61 74 69  rt of the creati
36f0: 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68  on of the new ch
3700: 61 6e 67 65 73 65 74 73 20 73 70 65 63 69 66 69  angesets specifi
3710: 65 64 20 69 6e 0a 09 23 20 41 52 47 53 20 61 73  ed in..# ARGS as
3720: 20 73 65 74 73 20 6f 66 20 69 74 65 6d 73 2c 20   sets of items, 
3730: 61 6c 6c 20 73 75 62 73 65 74 73 20 6f 66 20 43  all subsets of C
3740: 53 45 54 27 73 20 69 74 65 6d 20 73 65 74 2c 20  SET's item set, 
3750: 43 53 45 54 0a 09 23 20 77 69 6c 6c 20 62 65 20  CSET..# will be 
3760: 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 61 6c 6c  dropped from all
3770: 20 64 61 74 61 62 61 73 65 73 2c 20 69 6e 20 61   databases, in a
3780: 6e 64 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79  nd out of memory
3790: 2c 0a 09 23 20 61 6e 64 20 74 68 65 6e 20 64 65  ,..# and then de
37a0: 73 74 72 6f 79 65 64 2e 0a 09 23 0a 09 23 20 4e  stroyed...#..# N
37b0: 6f 74 65 3a 20 54 68 65 20 69 74 65 6d 20 6c 69  ote: The item li
37c0: 73 74 73 20 66 6f 75 6e 64 20 69 6e 20 61 72 67  sts found in arg
37d0: 73 20 61 72 65 20 74 61 67 67 65 64 20 69 74 65  s are tagged ite
37e0: 6d 73 2e 20 54 68 65 79 0a 09 23 20 68 61 76 65  ms. They..# have
37f0: 20 74 6f 20 68 61 76 65 20 74 68 65 20 73 61 6d   to have the sam
3800: 65 20 74 79 70 65 20 61 73 20 74 68 65 20 63 68  e type as the ch
3810: 61 6e 67 65 73 65 74 2c 20 62 65 69 6e 67 20 73  angeset, being s
3820: 75 62 73 65 74 73 0a 09 23 20 6f 66 20 69 74 73  ubsets..# of its
3830: 20 69 74 65 6d 73 2e 20 54 68 69 73 20 69 73 20   items. This is 
3840: 63 68 65 63 6b 65 64 20 69 6e 20 55 6e 74 61 67  checked in Untag
3850: 31 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 38  1....log write 8
3860: 20 63 73 65 74 73 20 7b 4f 4c 44 3a 20 5b 6c 73   csets {OLD: [ls
3870: 6f 72 74 20 5b 24 63 73 65 74 20 69 74 65 6d 73  ort [$cset items
3880: 5d 5d 7d 0a 09 56 61 6c 69 64 61 74 65 46 72 61  ]]}..ValidateFra
3890: 67 6d 65 6e 74 73 20 24 63 73 65 74 20 24 61 72  gments $cset $ar
38a0: 67 73 0a 0a 09 23 20 41 6c 6c 20 63 68 65 63 6b  gs...# All check
38b0: 73 20 70 61 73 73 2c 20 61 63 74 75 61 6c 6c 79  s pass, actually
38c0: 20 70 65 72 66 6f 72 6d 20 74 68 65 20 73 70 6c   perform the spl
38d0: 69 74 2e 0a 0a 09 73 74 72 75 63 74 3a 3a 6c 69  it....struct::li
38e0: 73 74 20 61 73 73 69 67 6e 20 5b 24 63 73 65 74  st assign [$cset
38f0: 20 64 61 74 61 5d 20 70 72 6f 6a 65 63 74 20 63   data] project c
3900: 73 74 79 70 65 20 63 73 73 72 63 0a 0a 09 73 65  stype cssrc...se
3910: 74 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 5b  t predecessors [
3920: 24 63 73 65 74 20 64 72 6f 70 5d 0a 09 24 63 73  $cset drop]..$cs
3930: 65 74 20 64 65 73 74 72 6f 79 0a 0a 09 73 65 74  et destroy...set
3940: 20 6e 65 77 63 73 65 74 73 20 7b 7d 0a 09 66 6f   newcsets {}..fo
3950: 72 65 61 63 68 20 66 72 61 67 6d 65 6e 74 69 74  reach fragmentit
3960: 65 6d 73 20 24 61 72 67 73 20 7b 0a 09 20 20 20  ems $args {..   
3970: 20 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73 65   log write 8 cse
3980: 74 73 20 7b 4d 41 4b 45 3a 20 5b 6c 73 6f 72 74  ts {MAKE: [lsort
3990: 20 24 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 5d   $fragmentitems]
39a0: 7d 0a 0a 09 20 20 20 20 73 65 74 20 66 72 61 67  }...    set frag
39b0: 6d 65 6e 74 20 5b 24 74 79 70 65 20 25 41 55 54  ment [$type %AUT
39c0: 4f 25 20 24 70 72 6f 6a 65 63 74 20 24 63 73 74  O% $project $cst
39d0: 79 70 65 20 24 63 73 73 72 63 20 5c 0a 09 09 09  ype $cssrc \....
39e0: 20 20 20 20 20 20 5b 55 6e 74 61 67 20 24 66 72        [Untag $fr
39f0: 61 67 6d 65 6e 74 69 74 65 6d 73 20 24 63 73 74  agmentitems $cst
3a00: 79 70 65 5d 5d 0a 09 20 20 20 20 6c 61 70 70 65  ype]]..    lappe
3a10: 6e 64 20 6e 65 77 63 73 65 74 73 20 24 66 72 61  nd newcsets $fra
3a20: 67 6d 65 6e 74 0a 0a 09 20 20 20 20 24 66 72 61  gment...    $fra
3a30: 67 6d 65 6e 74 20 70 65 72 73 69 73 74 0a 09 20  gment persist.. 
3a40: 20 20 20 24 66 72 61 67 6d 65 6e 74 20 64 65 74     $fragment det
3a50: 65 72 6d 69 6e 65 73 75 63 63 65 73 73 6f 72 73  erminesuccessors
3a60: 0a 09 7d 0a 0a 09 23 20 54 68 65 20 70 72 65 64  ..}...# The pred
3a70: 65 63 65 73 73 6f 72 73 20 68 61 76 65 20 74 6f  ecessors have to
3a80: 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 69 72   recompute their
3a90: 20 73 75 63 63 65 73 73 6f 72 73 2c 20 69 2e 65   successors, i.e
3aa0: 2e 0a 09 23 20 72 65 6d 6f 76 65 20 74 68 65 20  ...# remove the 
3ab0: 64 72 6f 70 70 65 64 20 63 68 61 6e 67 65 73 65  dropped changese
3ac0: 74 20 61 6e 64 20 70 75 74 20 6f 6e 65 20 6f 66  t and put one of
3ad0: 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 0a 09   the fragments..
3ae0: 23 20 69 6e 74 6f 20 69 74 73 20 70 6c 61 63 65  # into its place
3af0: 2e 0a 09 66 6f 72 65 61 63 68 20 70 20 24 70 72  ...foreach p $pr
3b00: 65 64 65 63 65 73 73 6f 72 73 20 7b 0a 09 20 20  edecessors {..  
3b10: 20 20 24 70 20 64 65 74 65 72 6d 69 6e 65 73 75    $p determinesu
3b20: 63 63 65 73 73 6f 72 73 0a 09 7d 0a 0a 09 72 65  ccessors..}...re
3b30: 74 75 72 6e 20 24 6e 65 77 63 73 65 74 73 0a 20  turn $newcsets. 
3b40: 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65     }..    typeme
3b50: 74 68 6f 64 20 69 74 65 6d 73 74 72 20 7b 69 74  thod itemstr {it
3b60: 65 6d 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c  em} {..struct::l
3b70: 69 73 74 20 61 73 73 69 67 6e 20 24 69 74 65 6d  ist assign $item
3b80: 20 69 74 79 70 65 20 69 69 64 0a 09 72 65 74 75   itype iid..retu
3b90: 72 6e 20 5b 24 69 74 79 70 65 20 73 74 72 20 24  rn [$itype str $
3ba0: 69 69 64 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  iid].    }..    
3bb0: 74 79 70 65 6d 65 74 68 6f 64 20 73 74 72 6c 69  typemethod strli
3bc0: 73 74 20 7b 63 68 61 6e 67 65 73 65 74 73 7d 20  st {changesets} 
3bd0: 7b 0a 09 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 20  {..return [join 
3be0: 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61  [struct::list ma
3bf0: 70 20 24 63 68 61 6e 67 65 73 65 74 73 20 5b 6d  p $changesets [m
3c00: 79 70 72 6f 63 20 49 44 5d 5d 5d 0a 20 20 20 20  yproc ID]]].    
3c10: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 49 44 20 7b  }..    proc ID {
3c20: 63 73 65 74 7d 20 7b 20 24 63 73 65 74 20 73 74  cset} { $cset st
3c30: 72 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 55 6e  r }..    proc Un
3c40: 74 61 67 20 7b 74 61 67 67 65 64 69 74 65 6d 73  tag {taggeditems
3c50: 20 63 73 74 79 70 65 7d 20 7b 0a 09 72 65 74 75   cstype} {..retu
3c60: 72 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74  rn [struct::list
3c70: 20 6d 61 70 20 24 74 61 67 67 65 64 69 74 65 6d   map $taggeditem
3c80: 73 20 5b 6d 79 70 72 6f 63 20 55 6e 74 61 67 31  s [myproc Untag1
3c90: 20 24 63 73 74 79 70 65 5d 5d 0a 20 20 20 20 7d   $cstype]].    }
3ca0: 0a 0a 20 20 20 20 70 72 6f 63 20 55 6e 74 61 67  ..    proc Untag
3cb0: 31 20 7b 63 73 74 79 70 65 20 74 68 65 69 74 65  1 {cstype theite
3cc0: 6d 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c 69  m} {..struct::li
3cd0: 73 74 20 61 73 73 69 67 6e 20 24 74 68 65 69 74  st assign $theit
3ce0: 65 6d 20 74 20 69 0a 09 69 6e 74 65 67 72 69 74  em t i..integrit
3cf0: 79 20 61 73 73 65 72 74 20 7b 24 63 73 74 79 70  y assert {$cstyp
3d00: 65 20 65 71 20 24 74 7d 20 7b 49 74 65 6d 20 24  e eq $t} {Item $
3d10: 69 27 73 20 74 79 70 65 20 69 73 20 27 24 74 27  i's type is '$t'
3d20: 2c 20 65 78 70 65 63 74 65 64 20 27 24 63 73 74  , expected '$cst
3d30: 79 70 65 27 7d 0a 09 72 65 74 75 72 6e 20 24 69  ype'}..return $i
3d40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63  .    }..    proc
3d50: 20 56 61 6c 69 64 61 74 65 46 72 61 67 6d 65 6e   ValidateFragmen
3d60: 74 73 20 7b 63 73 65 74 20 66 72 61 67 6d 65 6e  ts {cset fragmen
3d70: 74 73 7d 20 7b 0a 09 23 20 43 68 65 63 6b 20 74  ts} {..# Check t
3d80: 68 65 20 76 61 72 69 6f 75 73 20 69 6e 74 65 67  he various integ
3d90: 72 69 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73  rity constraints
3da0: 20 66 6f 72 20 74 68 65 20 66 72 61 67 6d 65 6e   for the fragmen
3db0: 74 73 0a 09 23 20 73 70 65 63 69 66 79 69 6e 67  ts..# specifying
3dc0: 20 68 6f 77 20 74 6f 20 73 70 6c 69 74 20 74 68   how to split th
3dd0: 65 20 63 68 61 6e 67 65 73 65 74 3a 0a 09 23 0a  e changeset:..#.
3de0: 09 23 20 2a 20 57 65 20 6d 75 73 74 20 68 61 76  .# * We must hav
3df0: 65 20 74 77 6f 20 6f 72 20 6d 6f 72 65 20 66 72  e two or more fr
3e00: 61 67 6d 65 6e 74 73 2c 20 61 73 20 73 70 6c 69  agments, as spli
3e10: 74 74 69 6e 67 20 61 0a 09 23 20 20 20 63 68 61  tting a..#   cha
3e20: 6e 67 65 73 65 74 20 69 6e 74 6f 20 6f 6e 65 20  ngeset into one 
3e30: 6d 61 6b 65 73 20 6e 6f 20 73 65 6e 73 65 2e 0a  makes no sense..
3e40: 09 23 20 2a 20 4e 6f 20 66 72 61 67 6d 65 6e 74  .# * No fragment
3e50: 20 6d 61 79 20 62 65 20 65 6d 70 74 79 2e 0a 09   may be empty...
3e60: 23 20 2a 20 41 6c 6c 20 66 72 61 67 6d 65 6e 74  # * All fragment
3e70: 73 20 68 61 76 65 20 74 6f 20 62 65 20 74 72 75  s have to be tru
3e80: 65 20 73 75 62 73 65 74 73 20 6f 66 20 74 68 65  e subsets of the
3e90: 20 69 74 65 6d 73 20 69 6e 20 74 68 65 0a 09 23   items in the..#
3ea0: 20 20 20 63 68 61 6e 67 65 73 65 74 20 74 6f 20     changeset to 
3eb0: 73 70 6c 69 74 2e 20 54 68 65 20 27 74 72 75 65  split. The 'true
3ec0: 27 20 69 73 20 69 6d 70 6c 69 65 64 20 62 65 63  ' is implied bec
3ed0: 61 75 73 65 20 6e 6f 6e 65 20 61 72 65 0a 09 23  ause none are..#
3ee0: 20 20 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65     allowed to be
3ef0: 20 65 6d 70 74 79 2c 20 73 6f 20 65 61 63 68 20   empty, so each 
3f00: 68 61 73 20 74 6f 20 62 65 20 73 6d 61 6c 6c 65  has to be smalle
3f10: 72 20 74 68 61 6e 20 74 68 65 0a 09 23 20 20 20  r than the..#   
3f20: 74 6f 74 61 6c 2e 0a 09 23 20 2a 20 54 68 65 20  total...# * The 
3f30: 75 6e 69 6f 6e 20 6f 66 20 74 68 65 20 66 72 61  union of the fra
3f40: 67 6d 65 6e 74 73 20 68 61 73 20 74 6f 20 62 65  gments has to be
3f50: 20 74 68 65 20 69 74 65 6d 20 73 65 74 20 6f 66   the item set of
3f60: 20 74 68 65 0a 09 23 20 20 20 63 68 61 6e 67 65   the..#   change
3f70: 73 65 74 2e 0a 09 23 20 2a 20 54 68 65 20 66 72  set...# * The fr
3f80: 61 67 6d 65 6e 74 20 6d 75 73 74 20 6e 6f 74 20  agment must not 
3f90: 6f 76 65 72 6c 61 70 2c 20 69 2e 65 2e 20 74 68  overlap, i.e. th
3fa0: 65 69 72 20 70 61 69 72 77 69 73 65 0a 09 23 20  eir pairwise..# 
3fb0: 20 20 69 6e 74 65 72 73 65 63 74 69 6f 6e 73 20    intersections 
3fc0: 68 61 76 65 20 74 6f 20 62 65 20 65 6d 70 74 79  have to be empty
3fd0: 2e 0a 0a 09 73 65 74 20 63 6f 76 65 72 20 7b 7d  ....set cover {}
3fe0: 0a 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65  ..foreach fragme
3ff0: 6e 74 69 74 65 6d 73 20 24 66 72 61 67 6d 65 6e  ntitems $fragmen
4000: 74 73 20 7b 0a 09 20 20 20 20 6c 6f 67 20 77 72  ts {..    log wr
4010: 69 74 65 20 38 20 63 73 65 74 73 20 7b 4e 45 57  ite 8 csets {NEW
4020: 3a 20 5b 6c 73 6f 72 74 20 24 66 72 61 67 6d 65  : [lsort $fragme
4030: 6e 74 69 74 65 6d 73 5d 7d 0a 0a 09 20 20 20 20  ntitems]}...    
4040: 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74  integrity assert
4050: 20 7b 0a 09 09 21 5b 73 74 72 75 63 74 3a 3a 73   {...![struct::s
4060: 65 74 20 65 6d 70 74 79 20 24 66 72 61 67 6d 65  et empty $fragme
4070: 6e 74 69 74 65 6d 73 5d 0a 09 20 20 20 20 7d 20  ntitems]..    } 
4080: 7b 63 68 61 6e 67 65 73 65 74 20 66 72 61 67 6d  {changeset fragm
4090: 65 6e 74 20 69 73 20 65 6d 70 74 79 7d 0a 0a 09  ent is empty}...
40a0: 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73      integrity as
40b0: 73 65 72 74 20 7b 0a 09 09 5b 73 74 72 75 63 74  sert {...[struct
40c0: 3a 3a 73 65 74 20 73 75 62 73 65 74 6f 66 20 24  ::set subsetof $
40d0: 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 20 5b 24  fragmentitems [$
40e0: 63 73 65 74 20 69 74 65 6d 73 5d 5d 0a 09 20 20  cset items]]..  
40f0: 20 20 7d 20 7b 63 68 61 6e 67 65 73 65 74 20 66    } {changeset f
4100: 72 61 67 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61  ragment is not a
4110: 20 73 75 62 73 65 74 7d 0a 09 20 20 20 20 73 74   subset}..    st
4120: 72 75 63 74 3a 3a 73 65 74 20 61 64 64 20 63 6f  ruct::set add co
4130: 76 65 72 20 24 66 72 61 67 6d 65 6e 74 69 74 65  ver $fragmentite
4140: 6d 73 0a 09 7d 0a 0a 09 69 6e 74 65 67 72 69 74  ms..}...integrit
4150: 79 20 61 73 73 65 72 74 20 7b 0a 09 20 20 20 20  y assert {..    
4160: 5b 73 74 72 75 63 74 3a 3a 73 65 74 20 65 71 75  [struct::set equ
4170: 61 6c 20 24 63 6f 76 65 72 20 5b 24 63 73 65 74  al $cover [$cset
4180: 20 69 74 65 6d 73 5d 5d 0a 09 20 7d 20 7b 54 68   items]].. } {Th
4190: 65 20 66 72 61 67 6d 65 6e 74 73 20 64 6f 20 6e  e fragments do n
41a0: 6f 74 20 63 6f 76 65 72 20 74 68 65 20 6f 72 69  ot cover the ori
41b0: 67 69 6e 61 6c 20 63 68 61 6e 67 65 73 65 74 7d  ginal changeset}
41c0: 0a 0a 09 73 65 74 20 69 20 31 0a 09 66 6f 72 65  ...set i 1..fore
41d0: 61 63 68 20 66 69 61 20 24 66 72 61 67 6d 65 6e  ach fia $fragmen
41e0: 74 73 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 63  ts {..    foreac
41f0: 68 20 66 69 62 20 5b 6c 72 61 6e 67 65 20 24 66  h fib [lrange $f
4200: 72 61 67 6d 65 6e 74 73 20 24 69 20 65 6e 64 5d  ragments $i end]
4210: 20 7b 0a 09 09 69 6e 74 65 67 72 69 74 79 20 61   {...integrity a
4220: 73 73 65 72 74 20 7b 0a 09 09 20 20 20 20 5b 73  ssert {...    [s
4230: 74 72 75 63 74 3a 3a 73 65 74 20 65 6d 70 74 79  truct::set empty
4240: 20 5b 73 74 72 75 63 74 3a 3a 73 65 74 20 69 6e   [struct::set in
4250: 74 65 72 73 65 63 74 20 24 66 69 61 20 24 66 69  tersect $fia $fi
4260: 62 5d 5d 0a 09 09 7d 20 7b 54 68 65 20 66 72 61  b]]...} {The fra
4270: 67 6d 65 6e 74 73 20 3c 24 66 69 61 3e 20 61 6e  gments <$fia> an
4280: 64 20 3c 24 66 69 62 3e 20 6f 76 65 72 6c 61 70  d <$fib> overlap
4290: 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69 6e  }..    }..    in
42a0: 63 72 20 69 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  cr i..}...return
42b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20  .    }..    # # 
42c0: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
42d0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
42e0: 23 23 23 0a 20 20 20 20 23 23 20 53 74 61 74 65  ###.    ## State
42f0: 0a 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d  ..    variable m
4300: 79 69 64 20 20 20 20 20 20 20 20 7b 7d 20 3b 20  yid        {} ; 
4310: 23 20 49 64 20 6f 66 20 74 68 65 20 63 73 65 74  # Id of the cset
4320: 20 66 6f 72 20 74 68 65 20 70 65 72 73 69 73 74   for the persist
4330: 65 6e 74 0a 09 09 09 20 20 20 20 20 20 23 20 73  ent....      # s
4340: 74 61 74 65 2e 0a 20 20 20 20 76 61 72 69 61 62  tate..    variab
4350: 6c 65 20 6d 79 70 72 6f 6a 65 63 74 20 20 20 7b  le myproject   {
4360: 7d 20 3b 20 23 20 52 65 66 65 72 65 6e 63 65 20  } ; # Reference 
4370: 6f 66 20 74 68 65 20 70 72 6f 6a 65 63 74 20 6f  of the project o
4380: 62 6a 65 63 74 20 74 68 65 0a 09 09 09 20 20 20  bject the....   
4390: 20 20 20 23 20 63 68 61 6e 67 65 73 65 74 20 62     # changeset b
43a0: 65 6c 6f 6e 67 73 20 74 6f 2e 0a 20 20 20 20 76  elongs to..    v
43b0: 61 72 69 61 62 6c 65 20 6d 79 74 79 70 65 20 20  ariable mytype  
43c0: 20 20 20 20 7b 7d 20 3b 20 23 20 57 68 61 74 20      {} ; # What 
43d0: 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 69 73  the changeset is
43e0: 20 62 61 73 65 64 20 6f 6e 0a 09 09 09 20 20 20   based on....   
43f0: 20 20 20 23 20 28 72 65 76 69 73 69 6f 6e 73 2c     # (revisions,
4400: 20 74 61 67 73 2c 20 6f 72 20 62 72 61 6e 63 68   tags, or branch
4410: 65 73 29 2e 0a 09 09 09 20 20 20 20 20 20 23 20  es).....      # 
4420: 56 61 6c 75 65 73 3a 20 53 65 65 20 6d 79 63 73  Values: See mycs
4430: 74 79 70 65 2e 20 4e 6f 74 65 20 74 68 61 74 20  type. Note that 
4440: 77 65 0a 09 09 09 20 20 20 20 20 20 23 20 68 61  we....      # ha
4450: 76 65 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6e  ve to keep the n
4460: 61 6d 65 73 20 6f 66 20 74 68 65 20 68 65 6c 70  ames of the help
4470: 65 72 0a 09 09 09 20 20 20 20 20 20 23 20 73 69  er....      # si
4480: 6e 67 6c 65 74 6f 6e 73 20 69 6e 20 73 79 6e 63  ngletons in sync
4490: 20 77 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e   with the conten
44a0: 74 73 0a 09 09 09 20 20 20 20 20 20 23 20 6f 66  ts....      # of
44b0: 20 73 74 61 74 65 20 74 61 62 6c 65 20 27 63 73   state table 'cs
44c0: 74 79 70 65 27 2c 20 61 6e 64 20 76 61 72 69 6f  type', and vario
44d0: 75 73 0a 09 09 09 20 20 20 20 20 20 23 20 6f 74  us....      # ot
44e0: 68 65 72 20 70 6c 61 63 65 73 20 75 73 69 6e 67  her places using
44f0: 20 74 68 65 6d 20 68 61 72 64 77 69 72 65 64 2e   them hardwired.
4500: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79  .    variable my
4510: 74 79 70 65 6f 62 6a 20 20 20 7b 7d 20 3b 20 23  typeobj   {} ; #
4520: 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68   Reference to th
4530: 65 20 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20  e container for 
4540: 74 68 65 0a 09 09 09 20 20 20 20 20 20 23 20 74  the....      # t
4550: 79 70 65 20 64 65 70 65 6e 64 65 6e 74 20 63 6f  ype dependent co
4560: 64 65 2e 20 44 65 72 69 76 65 64 20 66 72 6f 6d  de. Derived from
4570: 0a 09 09 09 20 20 20 20 20 20 23 20 6d 79 74 79  ....      # myty
4580: 70 65 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65  pe..    variable
4590: 20 6d 79 73 72 63 69 64 20 20 20 20 20 7b 7d 20   mysrcid     {} 
45a0: 3b 20 23 20 49 64 20 6f 66 20 74 68 65 20 6d 65  ; # Id of the me
45b0: 74 61 64 61 74 61 20 6f 72 20 73 79 6d 62 6f 6c  tadata or symbol
45c0: 20 74 68 65 20 63 73 65 74 0a 09 09 09 20 20 20   the cset....   
45d0: 20 20 20 23 20 69 73 20 62 61 73 65 64 20 6f 6e     # is based on
45e0: 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d  ..    variable m
45f0: 79 69 74 65 6d 73 20 20 20 20 20 7b 7d 20 3b 20  yitems     {} ; 
4600: 23 20 4c 69 73 74 20 6f 66 20 74 68 65 20 66 69  # List of the fi
4610: 6c 65 20 6c 65 76 65 6c 20 72 65 76 69 73 69 6f  le level revisio
4620: 6e 73 2c 0a 09 09 09 20 20 20 20 20 20 23 20 74  ns,....      # t
4630: 61 67 73 2c 20 6f 72 20 62 72 61 6e 63 68 65 73  ags, or branches
4640: 20 69 6e 20 74 68 65 20 63 73 65 74 2c 20 61 73   in the cset, as
4650: 0a 09 09 09 20 20 20 20 20 20 23 20 69 64 73 2e  ....      # ids.
4660: 20 4e 6f 74 20 74 61 67 67 65 64 2e 0a 20 20 20   Not tagged..   
4670: 20 76 61 72 69 61 62 6c 65 20 6d 79 74 69 74 65   variable mytite
4680: 6d 73 20 20 20 20 7b 7d 20 3b 20 23 20 41 73 20  ms    {} ; # As 
4690: 6d 79 69 74 65 6d 73 2c 20 74 68 65 20 74 61 67  myitems, the tag
46a0: 67 65 64 20 66 6f 72 6d 2e 0a 20 20 20 20 76 61  ged form..    va
46b0: 72 69 61 62 6c 65 20 6d 79 70 72 65 6d 61 70 20  riable mypremap 
46c0: 20 20 20 7b 7d 20 3b 20 23 20 44 69 63 74 69 6f     {} ; # Dictio
46d0: 6e 61 72 79 20 6d 61 70 70 69 6e 67 20 66 72 6f  nary mapping fro
46e0: 6d 20 74 68 65 20 69 74 65 6d 73 20 28 74 61 67  m the items (tag
46f0: 67 65 64 20 6e 6f 77 29 0a 09 09 09 20 20 20 20  ged now)....    
4700: 20 20 23 20 74 6f 20 74 68 65 69 72 20 70 72 65    # to their pre
4710: 64 65 63 65 73 73 6f 72 73 2c 20 61 6c 73 6f 20  decessors, also 
4720: 74 61 67 67 65 64 2e 20 41 0a 09 09 09 20 20 20  tagged. A....   
4730: 20 20 20 23 20 63 61 63 68 65 20 74 6f 20 61 76     # cache to av
4740: 6f 69 64 20 6c 6f 61 64 69 6e 67 20 74 68 69 73  oid loading this
4750: 20 66 72 6f 6d 20 74 68 65 0a 09 09 09 20 20 20   from the....   
4760: 20 20 20 23 20 73 74 61 74 65 20 6d 6f 72 65 20     # state more 
4770: 74 68 61 6e 20 6f 6e 63 65 2e 0a 20 20 20 20 76  than once..    v
4780: 61 72 69 61 62 6c 65 20 6d 79 6e 65 78 74 6d 61  ariable mynextma
4790: 70 20 20 20 7b 7d 20 3b 20 23 20 44 69 63 74 69  p   {} ; # Dicti
47a0: 6f 6e 61 72 79 20 6d 61 70 70 69 6e 67 20 66 72  onary mapping fr
47b0: 6f 6d 20 74 68 65 20 69 74 65 6d 73 20 28 74 61  om the items (ta
47c0: 67 67 65 64 29 0a 09 09 09 20 20 20 20 20 20 23  gged)....      #
47d0: 20 74 6f 20 74 68 65 69 72 20 73 75 63 63 65 73   to their succes
47e0: 73 6f 72 73 20 28 61 6c 73 6f 20 74 61 67 67 65  sors (also tagge
47f0: 64 29 2e 20 41 0a 09 09 09 20 20 20 20 20 20 23  d). A....      #
4800: 20 63 61 63 68 65 20 74 6f 20 61 76 6f 69 64 20   cache to avoid 
4810: 6c 6f 61 64 69 6e 67 20 74 68 69 73 20 66 72 6f  loading this fro
4820: 6d 20 74 68 65 0a 09 09 09 20 20 20 20 20 20 23  m the....      #
4830: 20 73 74 61 74 65 20 6d 6f 72 65 20 74 68 61 6e   state more than
4840: 20 6f 6e 63 65 2e 0a 20 20 20 20 76 61 72 69 61   once..    varia
4850: 62 6c 65 20 6d 79 70 6f 73 20 20 20 20 20 20 20  ble mypos       
4860: 7b 7d 20 3b 20 23 20 43 6f 6d 6d 69 74 20 70 6f  {} ; # Commit po
4870: 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 68  sition of the ch
4880: 61 6e 67 65 73 65 74 2c 20 69 66 0a 09 09 09 20  angeset, if.... 
4890: 20 20 20 20 20 23 20 6b 6e 6f 77 6e 2e 0a 0a 20       # known... 
48a0: 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23     # # ## ### ##
48b0: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23  ### ######## ###
48c0: 23 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 23  ##########.    #
48d0: 23 20 49 6e 74 65 72 6e 61 6c 20 6d 65 74 68 6f  # Internal metho
48e0: 64 73 0a 0a 20 20 20 20 74 79 70 65 76 61 72 69  ds..    typevari
48f0: 61 62 6c 65 20 6d 79 63 6f 75 6e 74 65 72 20 20  able mycounter  
4900: 20 20 20 20 20 20 30 20 3b 20 23 20 49 64 20 63        0 ; # Id c
4910: 6f 75 6e 74 65 72 20 66 6f 72 20 63 73 65 74 73  ounter for csets
4920: 2e 20 4c 61 73 74 20 69 64 0a 09 09 09 09 20 20  . Last id.....  
4930: 20 20 20 20 23 20 75 73 65 64 2e 0a 20 20 20 20      # used..    
4940: 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63  typevariable myc
4950: 73 74 79 70 65 20 2d 61 72 72 61 79 20 7b 7d 20  stype -array {} 
4960: 3b 20 23 20 4d 61 70 20 63 73 74 79 70 65 73 20  ; # Map cstypes 
4970: 28 6e 61 6d 65 73 29 20 74 6f 20 70 65 72 73 69  (names) to persi
4980: 73 74 65 6e 74 0a 09 09 09 09 20 20 20 20 20 20  stent.....      
4990: 23 20 69 64 73 2e 20 4e 6f 74 65 20 74 68 61 74  # ids. Note that
49a0: 20 77 65 20 68 61 76 65 20 74 6f 20 6b 65 65 70   we have to keep
49b0: 0a 09 09 09 09 20 20 20 20 20 20 23 20 74 68 65  .....      # the
49c0: 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 74 61   names in the ta
49d0: 62 6c 65 20 27 63 73 74 79 70 65 27 0a 09 09 09  ble 'cstype'....
49e0: 09 20 20 20 20 20 20 23 20 69 6e 20 73 79 6e 63  .      # in sync
49f0: 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20   with the names 
4a00: 6f 66 20 74 68 65 0a 09 09 09 09 20 20 20 20 20  of the.....     
4a10: 20 23 20 68 65 6c 70 65 72 20 73 69 6e 67 6c 65   # helper single
4a20: 74 6f 6e 73 2e 0a 0a 20 20 20 20 74 79 70 65 6d  tons...    typem
4a30: 65 74 68 6f 64 20 67 65 74 63 73 74 79 70 65 73  ethod getcstypes
4a40: 20 7b 7d 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b   {} {..foreach {
4a50: 74 69 64 20 6e 61 6d 65 7d 20 5b 73 74 61 74 65  tid name} [state
4a60: 20 72 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c 45   run {..    SELE
4a70: 43 54 20 74 69 64 2c 20 6e 61 6d 65 20 46 52 4f  CT tid, name FRO
4a80: 4d 20 63 73 74 79 70 65 3b 0a 09 7d 5d 20 7b 20  M cstype;..}] { 
4a90: 73 65 74 20 6d 79 63 73 74 79 70 65 28 24 6e 61  set mycstype($na
4aa0: 6d 65 29 20 24 74 69 64 20 7d 0a 09 72 65 74 75  me) $tid }..retu
4ab0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79  rn.    }..    ty
4ac0: 70 65 6d 65 74 68 6f 64 20 6c 6f 61 64 63 6f 75  pemethod loadcou
4ad0: 6e 74 65 72 20 7b 7d 20 7b 0a 09 23 20 49 6e 69  nter {} {..# Ini
4ae0: 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 75 6e  tialize the coun
4af0: 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ter from the sta
4b00: 74 65 0a 09 6c 6f 67 20 77 72 69 74 65 20 32 20  te..log write 2 
4b10: 69 6e 69 74 63 73 65 74 73 20 7b 4c 6f 61 64 69  initcsets {Loadi
4b20: 6e 67 20 63 68 61 6e 67 65 73 65 74 20 63 6f 75  ng changeset cou
4b30: 6e 74 65 72 7d 0a 09 73 65 74 20 6d 79 63 6f 75  nter}..set mycou
4b40: 6e 74 65 72 20 5b 73 74 61 74 65 20 6f 6e 65 20  nter [state one 
4b50: 7b 20 53 45 4c 45 43 54 20 4d 41 58 28 63 69 64  { SELECT MAX(cid
4b60: 29 20 46 52 4f 4d 20 63 68 61 6e 67 65 73 65 74  ) FROM changeset
4b70: 20 7d 5d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20   }]..return.    
4b80: 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  }..    typemetho
4b90: 64 20 6e 75 6d 20 7b 7d 20 7b 20 72 65 74 75 72  d num {} { retur
4ba0: 6e 20 24 6d 79 63 6f 75 6e 74 65 72 20 7d 0a 0a  n $mycounter }..
4bb0: 20 20 20 20 70 72 6f 63 20 49 6e 69 74 69 61 6c      proc Initial
4bc0: 69 7a 65 42 72 65 61 6b 53 74 61 74 65 20 7b 72  izeBreakState {r
4bd0: 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76  evisions} {..upv
4be0: 61 72 20 31 20 70 6f 73 20 70 6f 73 20 63 72 6f  ar 1 pos pos cro
4bf0: 73 73 20 63 72 6f 73 73 20 72 61 6e 67 65 20 72  ss cross range r
4c00: 61 6e 67 65 20 64 65 70 63 20 64 65 70 63 20 64  ange depc depc d
4c10: 65 6c 74 61 20 64 65 6c 74 61 20 5c 0a 09 20 20  elta delta \..  
4c20: 20 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 64    dependencies d
4c30: 65 70 65 6e 64 65 6e 63 69 65 73 0a 0a 09 23 20  ependencies...# 
4c40: 46 69 72 73 74 20 77 65 20 63 72 65 61 74 65 20  First we create 
4c50: 61 20 6d 61 70 20 6f 66 20 70 6f 73 69 74 69 6f  a map of positio
4c60: 6e 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 65 61  ns to make it ea
4c70: 73 69 65 72 20 74 6f 0a 09 23 20 64 65 74 65 72  sier to..# deter
4c80: 6d 69 6e 65 20 77 68 65 74 68 65 72 20 61 20 64  mine whether a d
4c90: 65 70 65 6e 64 65 6e 63 79 20 63 72 6f 73 73 65  ependency crosse
4ca0: 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20 69  s a particular i
4cb0: 6e 64 65 78 2e 0a 0a 09 61 72 72 61 79 20 73 65  ndex....array se
4cc0: 74 20 70 6f 73 20 20 20 7b 7d 0a 09 61 72 72 61  t pos   {}..arra
4cd0: 79 20 73 65 74 20 63 72 6f 73 73 20 7b 7d 0a 09  y set cross {}..
4ce0: 61 72 72 61 79 20 73 65 74 20 64 65 70 63 20 20  array set depc  
4cf0: 7b 7d 0a 09 73 65 74 20 72 61 6e 67 65 20 20 20  {}..set range   
4d00: 20 20 20 20 7b 7d 0a 09 73 65 74 20 6e 20 30 0a      {}..set n 0.
4d10: 09 66 6f 72 65 61 63 68 20 72 65 76 20 24 72 65  .foreach rev $re
4d20: 76 69 73 69 6f 6e 73 20 7b 0a 09 20 20 20 20 6c  visions {..    l
4d30: 61 70 70 65 6e 64 20 72 61 6e 67 65 20 24 6e 0a  append range $n.
4d40: 09 20 20 20 20 73 65 74 20 70 6f 73 28 24 72 65  .    set pos($re
4d50: 76 29 20 24 6e 0a 09 20 20 20 20 73 65 74 20 63  v) $n..    set c
4d60: 72 6f 73 73 28 24 6e 29 20 30 0a 09 20 20 20 20  ross($n) 0..    
4d70: 69 6e 63 72 20 6e 0a 09 7d 0a 0a 09 23 20 53 65  incr n..}...# Se
4d80: 63 6f 6e 64 6c 79 20 77 65 20 63 6f 75 6e 74 20  condly we count 
4d90: 74 68 65 20 63 72 6f 73 73 69 6e 67 73 20 70 65  the crossings pe
4da0: 72 20 70 6f 73 69 74 69 6f 6e 2c 20 62 79 20 69  r position, by i
4db0: 74 65 72 61 74 69 6e 67 0a 09 23 20 6f 76 65 72  terating..# over
4dc0: 20 74 68 65 20 72 65 63 6f 72 64 65 64 20 69 6e   the recorded in
4dd0: 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63  ternal dependenc
4de0: 69 65 73 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 49  ies....# Note: I
4df0: 66 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 73  f the timestamps
4e00: 20 61 72 65 20 62 61 64 6c 79 20 6f 75 74 20 6f   are badly out o
4e10: 66 20 6f 72 64 65 72 20 69 74 20 69 73 0a 09 23  f order it is..#
4e20: 20 20 20 20 20 20 20 70 6f 73 73 69 62 6c 65 20         possible 
4e30: 74 6f 20 68 61 76 65 20 61 20 62 61 63 6b 77 61  to have a backwa
4e40: 72 64 20 73 75 63 63 65 73 73 6f 72 20 64 65 70  rd successor dep
4e50: 65 6e 64 65 6e 63 79 2c 0a 09 23 20 20 20 20 20  endency,..#     
4e60: 20 20 69 2e 65 2e 20 77 69 74 68 20 73 74 61 72    i.e. with star
4e70: 74 20 3e 20 65 6e 64 2e 20 57 65 20 6d 61 79 20  t > end. We may 
4e80: 68 61 76 65 20 74 6f 20 73 77 61 70 20 74 68 65  have to swap the
4e90: 20 69 6e 64 69 63 65 73 0a 09 23 20 20 20 20 20   indices..#     
4ea0: 20 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61 74    to ensure that
4eb0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c   the following l
4ec0: 6f 6f 70 20 72 75 6e 73 20 63 6f 72 72 65 63 74  oop runs correct
4ed0: 6c 79 2e 0a 09 23 0a 09 23 20 4e 6f 74 65 20 32  ly...#..# Note 2
4ee0: 3a 20 73 74 61 72 74 20 3d 3d 20 65 6e 64 20 69  : start == end i
4ef0: 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20  s not possible. 
4f00: 49 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a 09  It indicates a..
4f10: 23 20 20 20 20 20 20 20 20 20 73 65 6c 66 2d 64  #         self-d
4f20: 65 70 65 6e 64 65 6e 63 79 20 64 75 65 20 74 6f  ependency due to
4f30: 20 74 68 65 20 75 6e 69 71 75 65 6e 65 73 73 20   the uniqueness 
4f40: 6f 66 20 70 6f 73 69 74 69 6f 6e 73 2c 0a 09 23  of positions,..#
4f50: 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68 61           and tha
4f60: 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 77  t is something w
4f70: 65 20 68 61 76 65 20 72 75 6c 65 64 20 6f 75 74  e have ruled out
4f80: 20 61 6c 72 65 61 64 79 2c 20 73 65 65 0a 09 23   already, see..#
4f90: 20 20 20 20 20 20 20 20 20 27 72 65 76 20 69 6e           'rev in
4fa0: 74 65 72 6e 61 6c 73 75 63 63 65 73 73 6f 72 73  ternalsuccessors
4fb0: 27 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69  '....foreach {ri
4fc0: 64 20 63 68 69 6c 64 72 65 6e 7d 20 5b 61 72 72  d children} [arr
4fd0: 61 79 20 67 65 74 20 64 65 70 65 6e 64 65 6e 63  ay get dependenc
4fe0: 69 65 73 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65  ies] {..    fore
4ff0: 61 63 68 20 63 68 69 6c 64 20 24 63 68 69 6c 64  ach child $child
5000: 72 65 6e 20 7b 0a 09 09 73 65 74 20 64 6b 65 79  ren {...set dkey
5010: 20 20 20 20 5b 6c 69 73 74 20 24 72 69 64 20 24      [list $rid $
5020: 63 68 69 6c 64 5d 0a 09 09 73 65 74 20 73 74 61  child]...set sta
5030: 72 74 20 20 20 24 70 6f 73 28 24 72 69 64 29 0a  rt   $pos($rid).
5040: 09 09 73 65 74 20 65 6e 64 20 20 20 20 20 24 70  ..set end     $p
5050: 6f 73 28 24 63 68 69 6c 64 29 0a 09 09 73 65 74  os($child)...set
5060: 20 63 72 6f 73 73 65 73 20 7b 7d 0a 0a 09 09 69   crosses {}....i
5070: 66 20 7b 24 73 74 61 72 74 20 3e 20 24 65 6e 64  f {$start > $end
5080: 7d 20 7b 0a 09 09 20 20 20 20 77 68 69 6c 65 20  } {...    while 
5090: 7b 24 65 6e 64 20 3c 20 24 73 74 61 72 74 7d 20  {$end < $start} 
50a0: 7b 0a 09 09 09 6c 61 70 70 65 6e 64 20 63 72 6f  {....lappend cro
50b0: 73 73 65 73 20 24 65 6e 64 0a 09 09 09 69 6e 63  sses $end....inc
50c0: 72 20 63 72 6f 73 73 28 24 65 6e 64 29 0a 09 09  r cross($end)...
50d0: 09 69 6e 63 72 20 65 6e 64 0a 09 09 20 20 20 20  .incr end...    
50e0: 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20  }...} else {... 
50f0: 20 20 20 77 68 69 6c 65 20 7b 24 73 74 61 72 74     while {$start
5100: 20 3c 20 24 65 6e 64 7d 20 7b 0a 09 09 09 6c 61   < $end} {....la
5110: 70 70 65 6e 64 20 63 72 6f 73 73 65 73 20 24 73  ppend crosses $s
5120: 74 61 72 74 0a 09 09 09 69 6e 63 72 20 63 72 6f  tart....incr cro
5130: 73 73 28 24 73 74 61 72 74 29 0a 09 09 09 69 6e  ss($start)....in
5140: 63 72 20 73 74 61 72 74 0a 09 09 20 20 20 20 7d  cr start...    }
5150: 0a 09 09 7d 0a 09 09 73 65 74 20 64 65 70 63 28  ...}...set depc(
5160: 24 64 6b 65 79 29 20 24 63 72 6f 73 73 65 73 0a  $dkey) $crosses.
5170: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 49 6e 69 74  .    }..}...Init
5180: 69 61 6c 69 7a 65 44 65 6c 74 61 73 20 24 72 65  ializeDeltas $re
5190: 76 69 73 69 6f 6e 73 0a 09 72 65 74 75 72 6e 0a  visions..return.
51a0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20      }..    proc 
51b0: 49 6e 69 74 69 61 6c 69 7a 65 44 65 6c 74 61 73  InitializeDeltas
51c0: 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09   {revisions} {..
51d0: 75 70 76 61 72 20 31 20 64 65 6c 74 61 20 64 65  upvar 1 delta de
51e0: 6c 74 61 0a 0a 09 23 20 50 75 6c 6c 20 74 68 65  lta...# Pull the
51f0: 20 74 69 6d 65 73 74 61 6d 70 73 20 66 6f 72 20   timestamps for 
5200: 61 6c 6c 20 72 65 76 69 73 69 6f 6e 73 20 69 6e  all revisions in
5210: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 73 20   the changesets 
5220: 61 6e 64 0a 09 23 20 63 6f 6d 70 75 74 65 20 74  and..# compute t
5230: 68 65 69 72 20 64 65 6c 74 61 73 20 66 6f 72 20  heir deltas for 
5240: 75 73 65 20 62 79 20 74 68 65 20 62 72 65 61 6b  use by the break
5250: 20 66 69 6e 64 65 72 2e 0a 0a 09 61 72 72 61 79   finder....array
5260: 20 73 65 74 20 64 65 6c 74 61 20 7b 7d 0a 09 61   set delta {}..a
5270: 72 72 61 79 20 73 65 74 20 73 74 61 6d 70 20 7b  rray set stamp {
5280: 7d 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20 28  }...set theset (
5290: 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e  '[join $revision
52a0: 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66 6f 72 65  s {','}]')..fore
52b0: 61 63 68 20 7b 72 69 64 20 74 69 6d 65 7d 20 5b  ach {rid time} [
52c0: 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20  state run "..   
52d0: 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52   SELECT R.rid, R
52e0: 2e 64 61 74 65 0a 09 20 20 20 20 46 52 4f 4d 20  .date..    FROM 
52f0: 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20  revision R..    
5300: 57 48 45 52 45 20 52 2e 72 69 64 20 49 4e 20 24  WHERE R.rid IN $
5310: 74 68 65 73 65 74 0a 09 22 5d 20 7b 0a 09 20 20  theset.."] {..  
5320: 20 20 73 65 74 20 73 74 61 6d 70 28 24 72 69 64    set stamp($rid
5330: 29 20 24 74 69 6d 65 0a 09 7d 0a 0a 09 73 65 74  ) $time..}...set
5340: 20 6e 20 30 0a 09 66 6f 72 65 61 63 68 20 72 69   n 0..foreach ri
5350: 64 20 5b 6c 72 61 6e 67 65 20 24 72 65 76 69 73  d [lrange $revis
5360: 69 6f 6e 73 20 30 20 65 6e 64 2d 31 5d 20 72 6e  ions 0 end-1] rn
5370: 65 78 74 20 5b 6c 72 61 6e 67 65 20 24 72 65 76  ext [lrange $rev
5380: 69 73 69 6f 6e 73 20 31 20 65 6e 64 5d 20 7b 0a  isions 1 end] {.
5390: 09 20 20 20 20 73 65 74 20 64 65 6c 74 61 28 24  .    set delta($
53a0: 6e 29 20 5b 65 78 70 72 20 7b 24 73 74 61 6d 70  n) [expr {$stamp
53b0: 28 24 72 6e 65 78 74 29 20 2d 20 24 73 74 61 6d  ($rnext) - $stam
53c0: 70 28 24 72 69 64 29 7d 5d 0a 09 20 20 20 20 69  p($rid)}]..    i
53d0: 6e 63 72 20 6e 0a 09 7d 0a 09 72 65 74 75 72 6e  ncr n..}..return
53e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63  .    }..    proc
53f0: 20 46 69 6e 64 42 65 73 74 42 72 65 61 6b 20 7b   FindBestBreak {
5400: 72 61 6e 67 65 7d 20 7b 0a 09 75 70 76 61 72 20  range} {..upvar 
5410: 31 20 63 72 6f 73 73 20 63 72 6f 73 73 20 64 65  1 cross cross de
5420: 6c 74 61 20 64 65 6c 74 61 0a 0a 09 23 20 44 65  lta delta...# De
5430: 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74  termine the best
5440: 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20   break location 
5450: 69 6e 20 74 68 65 20 67 69 76 65 6e 20 72 61 6e  in the given ran
5460: 67 65 20 6f 66 0a 09 23 20 70 6f 73 69 74 69 6f  ge of..# positio
5470: 6e 73 2e 20 46 69 72 73 74 20 77 65 20 6c 6f 6f  ns. First we loo
5480: 6b 20 66 6f 72 20 74 68 65 20 6c 6f 63 61 74 69  k for the locati
5490: 6f 6e 73 20 77 69 74 68 20 74 68 65 20 6d 61 78  ons with the max
54a0: 69 6d 61 6c 0a 09 23 20 6e 75 6d 62 65 72 20 6f  imal..# number o
54b0: 66 20 63 72 6f 73 73 69 6e 67 73 2e 20 49 66 20  f crossings. If 
54c0: 74 68 65 72 65 20 61 72 65 20 73 65 76 65 72 61  there are severa
54d0: 6c 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 68  l we look for th
54e0: 65 0a 09 23 20 73 68 6f 72 74 65 73 74 20 74 69  e..# shortest ti
54f0: 6d 65 20 69 6e 74 65 72 76 61 6c 20 61 6d 6f 6e  me interval amon
5500: 67 20 74 68 65 6d 2e 20 49 66 20 77 65 20 73 74  g them. If we st
5510: 69 6c 6c 20 68 61 76 65 20 6d 75 6c 74 69 70 6c  ill have multipl
5520: 65 0a 09 23 20 70 6f 73 73 69 62 69 6c 69 74 69  e..# possibiliti
5530: 65 73 20 61 66 74 65 72 20 74 68 61 74 20 77 65  es after that we
5540: 20 73 65 6c 65 63 74 20 74 68 65 20 65 61 72 6c   select the earl
5550: 69 65 73 74 20 6c 6f 63 61 74 69 6f 6e 0a 09 23  iest location..#
5560: 20 61 6d 6f 6e 67 20 74 68 65 73 65 2e 0a 0a 09   among these....
5570: 23 20 4e 6f 74 65 3a 20 49 66 20 74 68 65 20 6d  # Note: If the m
5580: 61 78 69 6d 61 6c 20 6e 75 6d 62 65 72 20 6f 66  aximal number of
5590: 20 63 72 6f 73 73 69 6e 67 73 20 69 73 20 30 20   crossings is 0 
55a0: 74 68 65 6e 20 74 68 65 20 72 61 6e 67 65 0a 09  then the range..
55b0: 23 20 20 20 20 20 20 20 68 61 73 20 6e 6f 20 69  #       has no i
55c0: 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e  nternal dependen
55d0: 63 69 65 73 2c 20 61 6e 64 20 6e 6f 20 62 72 65  cies, and no bre
55e0: 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 61 74 0a 09  ak location at..
55f0: 23 20 20 20 20 20 20 20 61 6c 6c 2e 20 54 68 69  #       all. Thi
5600: 73 20 70 6f 73 73 69 62 69 6c 69 74 79 20 69 73  s possibility is
5610: 20 73 69 67 6e 61 6c 65 64 20 76 69 61 20 72 65   signaled via re
5620: 73 75 6c 74 20 2d 31 2e 0a 0a 09 23 20 4e 6f 74  sult -1....# Not
5630: 65 3a 20 41 20 72 61 6e 67 65 20 6f 66 20 6c 65  e: A range of le
5640: 6e 67 74 68 20 31 20 6f 72 20 6c 65 73 73 20 63  ngth 1 or less c
5650: 61 6e 6e 6f 74 20 68 61 76 65 20 69 6e 74 65 72  annot have inter
5660: 6e 61 6c 0a 09 23 20 20 20 20 20 20 20 64 65 70  nal..#       dep
5670: 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 20 74 68  endencies, as th
5680: 61 74 20 6e 65 65 64 73 20 61 74 20 6c 65 61 73  at needs at leas
5690: 74 20 74 77 6f 20 72 65 76 69 73 69 6f 6e 73 20  t two revisions 
56a0: 69 6e 0a 09 23 20 20 20 20 20 20 20 74 68 65 20  in..#       the 
56b0: 72 61 6e 67 65 2e 0a 0a 09 69 66 20 7b 5b 6c 6c  range....if {[ll
56c0: 65 6e 67 74 68 20 24 72 61 6e 67 65 5d 20 3c 20  ength $range] < 
56d0: 32 7d 20 7b 20 72 65 74 75 72 6e 20 2d 31 20 7d  2} { return -1 }
56e0: 0a 0a 09 73 65 74 20 6d 61 78 20 2d 31 0a 09 73  ...set max -1..s
56f0: 65 74 20 62 65 73 74 20 7b 7d 0a 0a 09 66 6f 72  et best {}...for
5700: 65 61 63 68 20 6c 6f 63 61 74 69 6f 6e 20 24 72  each location $r
5710: 61 6e 67 65 20 7b 0a 09 20 20 20 20 73 65 74 20  ange {..    set 
5720: 63 72 6f 73 73 69 6e 67 73 20 24 63 72 6f 73 73  crossings $cross
5730: 28 24 6c 6f 63 61 74 69 6f 6e 29 0a 09 20 20 20  ($location)..   
5740: 20 69 66 20 7b 24 63 72 6f 73 73 69 6e 67 73 20   if {$crossings 
5750: 3e 20 24 6d 61 78 7d 20 7b 0a 09 09 73 65 74 20  > $max} {...set 
5760: 6d 61 78 20 20 24 63 72 6f 73 73 69 6e 67 73 0a  max  $crossings.
5770: 09 09 73 65 74 20 62 65 73 74 20 5b 6c 69 73 74  ..set best [list
5780: 20 24 6c 6f 63 61 74 69 6f 6e 5d 0a 09 09 63 6f   $location]...co
5790: 6e 74 69 6e 75 65 0a 09 20 20 20 20 7d 20 65 6c  ntinue..    } el
57a0: 73 65 69 66 20 7b 24 63 72 6f 73 73 69 6e 67 73  seif {$crossings
57b0: 20 3d 3d 20 24 6d 61 78 7d 20 7b 0a 09 09 6c 61   == $max} {...la
57c0: 70 70 65 6e 64 20 62 65 73 74 20 24 6c 6f 63 61  ppend best $loca
57d0: 74 69 6f 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a  tion..    }..}..
57e0: 09 69 66 20 7b 24 6d 61 78 20 3d 3d 20 30 7d 20  .if {$max == 0} 
57f0: 20 20 20 20 20 20 20 20 20 20 20 7b 20 72 65 74             { ret
5800: 75 72 6e 20 2d 31 20 7d 0a 09 69 66 20 7b 5b 6c  urn -1 }..if {[l
5810: 6c 65 6e 67 74 68 20 24 62 65 73 74 5d 20 3d 3d  length $best] ==
5820: 20 31 7d 20 7b 20 72 65 74 75 72 6e 20 5b 6c 69   1} { return [li
5830: 6e 64 65 78 20 24 62 65 73 74 20 30 5d 20 7d 0a  ndex $best 0] }.
5840: 0a 09 73 65 74 20 6c 6f 63 61 74 69 6f 6e 73 20  ..set locations 
5850: 24 62 65 73 74 0a 09 73 65 74 20 62 65 73 74 20  $best..set best 
5860: 7b 7d 0a 09 73 65 74 20 6d 69 6e 20 2d 31 0a 0a  {}..set min -1..
5870: 09 66 6f 72 65 61 63 68 20 6c 6f 63 61 74 69 6f  .foreach locatio
5880: 6e 20 24 6c 6f 63 61 74 69 6f 6e 73 20 7b 0a 09  n $locations {..
5890: 20 20 20 20 73 65 74 20 69 6e 74 65 72 76 61 6c      set interval
58a0: 20 24 64 65 6c 74 61 28 24 6c 6f 63 61 74 69 6f   $delta($locatio
58b0: 6e 29 0a 09 20 20 20 20 69 66 20 7b 28 24 6d 69  n)..    if {($mi
58c0: 6e 20 3c 20 30 29 20 7c 7c 20 28 24 69 6e 74 65  n < 0) || ($inte
58d0: 72 76 61 6c 20 3c 20 24 6d 69 6e 29 7d 20 7b 0a  rval < $min)} {.
58e0: 09 09 73 65 74 20 6d 69 6e 20 20 24 69 6e 74 65  ..set min  $inte
58f0: 72 76 61 6c 0a 09 09 73 65 74 20 62 65 73 74 20  rval...set best 
5900: 5b 6c 69 73 74 20 24 6c 6f 63 61 74 69 6f 6e 5d  [list $location]
5910: 0a 09 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b  ..    } elseif {
5920: 24 69 6e 74 65 72 76 61 6c 20 3d 3d 20 24 6d 69  $interval == $mi
5930: 6e 7d 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 62  n} {...lappend b
5940: 65 73 74 20 24 6c 6f 63 61 74 69 6f 6e 0a 09 20  est $location.. 
5950: 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b 5b 6c     }..}...if {[l
5960: 6c 65 6e 67 74 68 20 24 62 65 73 74 5d 20 3d 3d  length $best] ==
5970: 20 31 7d 20 7b 20 72 65 74 75 72 6e 20 5b 6c 69   1} { return [li
5980: 6e 64 65 78 20 24 62 65 73 74 20 30 5d 20 7d 0a  ndex $best 0] }.
5990: 0a 09 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78  ..return [lindex
59a0: 20 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65 72   [lsort -integer
59b0: 20 2d 69 6e 63 72 65 61 73 69 6e 67 20 24 62 65   -increasing $be
59c0: 73 74 5d 20 30 5d 0a 20 20 20 20 7d 0a 0a 20 20  st] 0].    }..  
59d0: 20 20 70 72 6f 63 20 43 75 74 41 74 20 7b 6c 6f    proc CutAt {lo
59e0: 63 61 74 69 6f 6e 7d 20 7b 0a 09 75 70 76 61 72  cation} {..upvar
59f0: 20 31 20 63 72 6f 73 73 20 63 72 6f 73 73 20 64   1 cross cross d
5a00: 65 70 63 20 64 65 70 63 0a 0a 09 23 20 49 74 20  epc depc...# It 
5a10: 77 61 73 20 64 65 63 69 64 65 64 20 74 6f 20 73  was decided to s
5a20: 70 6c 69 74 20 74 68 65 20 63 68 61 6e 67 65 73  plit the changes
5a30: 65 74 20 61 74 20 74 68 65 20 67 69 76 65 6e 0a  et at the given.
5a40: 09 23 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 69  .# location. Thi
5a50: 73 20 63 75 74 73 20 61 20 6e 75 6d 62 65 72 20  s cuts a number 
5a60: 6f 66 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e  of dependencies.
5a70: 20 48 65 72 65 20 77 65 20 75 70 64 61 74 65 0a   Here we update.
5a80: 09 23 20 74 68 65 20 63 72 6f 73 73 20 69 6e 66  .# the cross inf
5a90: 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61 74  ormation so that
5aa0: 20 74 68 65 20 62 72 65 61 6b 20 66 69 6e 64 65   the break finde
5ab0: 72 20 68 61 73 20 61 63 63 75 72 61 74 65 0a 09  r has accurate..
5ac0: 23 20 64 61 74 61 20 77 68 65 6e 20 77 65 20 6c  # data when we l
5ad0: 6f 6f 6b 20 61 74 20 74 68 65 20 67 65 6e 65 72  ook at the gener
5ae0: 61 74 65 64 20 66 72 61 67 6d 65 6e 74 73 2e 0a  ated fragments..
5af0: 0a 09 73 65 74 20 73 69 78 20 5b 6c 6f 67 20 76  ..set six [log v
5b00: 69 73 69 62 6c 65 3f 20 36 5d 0a 0a 09 66 6f 72  isible? 6]...for
5b10: 65 61 63 68 20 7b 64 65 70 20 72 61 6e 67 65 7d  each {dep range}
5b20: 20 5b 61 72 72 61 79 20 67 65 74 20 64 65 70 63   [array get depc
5b30: 5d 20 7b 0a 09 20 20 20 20 23 20 43 68 65 63 6b  ] {..    # Check
5b40: 20 61 6c 6c 20 64 65 70 65 6e 64 65 6e 63 69 65   all dependencie
5b50: 73 20 73 74 69 6c 6c 20 6b 6e 6f 77 6e 2c 20 74  s still known, t
5b60: 61 6b 65 20 74 68 65 69 72 20 72 61 6e 67 65 20  ake their range 
5b70: 61 6e 64 0a 09 20 20 20 20 23 20 73 65 65 20 69  and..    # see i
5b80: 66 20 74 68 65 20 62 72 65 61 6b 20 6c 6f 63 61  f the break loca
5b90: 74 69 6f 6e 20 66 61 6c 6c 73 20 77 69 74 68 69  tion falls withi
5ba0: 6e 2e 0a 0a 09 20 20 20 20 42 6f 72 64 65 72 20  n....    Border 
5bb0: 24 72 61 6e 67 65 20 73 20 65 0a 09 20 20 20 20  $range s e..    
5bc0: 69 66 20 7b 24 6c 6f 63 61 74 69 6f 6e 20 3c 20  if {$location < 
5bd0: 24 73 7d 20 63 6f 6e 74 69 6e 75 65 20 3b 20 23  $s} continue ; #
5be0: 20 62 72 65 61 6b 20 62 65 66 6f 72 65 20 72 61   break before ra
5bf0: 6e 67 65 2c 20 69 67 6e 6f 72 65 0a 09 20 20 20  nge, ignore..   
5c00: 20 69 66 20 7b 24 6c 6f 63 61 74 69 6f 6e 20 3e   if {$location >
5c10: 20 24 65 7d 20 63 6f 6e 74 69 6e 75 65 20 3b 20   $e} continue ; 
5c20: 23 20 62 72 65 61 6b 20 61 66 74 65 72 20 72 61  # break after ra
5c30: 6e 67 65 2c 20 69 67 6e 6f 72 65 2e 0a 0a 09 20  nge, ignore.... 
5c40: 20 20 20 23 20 54 68 69 73 20 64 65 70 65 6e 64     # This depend
5c50: 65 6e 63 79 20 63 72 6f 73 73 65 73 20 74 68 65  ency crosses the
5c60: 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 2e   break location.
5c70: 20 57 65 20 72 65 6d 6f 76 65 20 69 74 0a 09 20   We remove it.. 
5c80: 20 20 20 23 20 66 72 6f 6d 20 74 68 65 20 63 72     # from the cr
5c90: 6f 73 73 69 6e 67 73 20 63 6f 75 6e 74 65 72 73  ossings counters
5ca0: 2c 20 61 6e 64 20 74 68 65 6e 20 61 6c 73 6f 20  , and then also 
5cb0: 66 72 6f 6d 20 74 68 65 20 73 65 74 0a 09 20 20  from the set..  
5cc0: 20 20 23 20 6f 66 20 6b 6e 6f 77 6e 20 64 65 70    # of known dep
5cd0: 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 20 77 65  endencies, as we
5ce0: 20 61 72 65 20 64 6f 6e 65 20 77 69 74 68 20 69   are done with i
5cf0: 74 2e 0a 0a 09 20 20 20 20 66 6f 72 65 61 63 68  t....    foreach
5d00: 20 6c 6f 63 20 24 64 65 70 63 28 24 64 65 70 29   loc $depc($dep)
5d10: 20 7b 20 69 6e 63 72 20 63 72 6f 73 73 28 24 6c   { incr cross($l
5d20: 6f 63 29 20 2d 31 20 7d 0a 09 20 20 20 20 75 6e  oc) -1 }..    un
5d30: 73 65 74 20 64 65 70 63 28 24 64 65 70 29 0a 0a  set depc($dep)..
5d40: 09 20 20 20 20 69 66 20 7b 21 24 73 69 78 7d 20  .    if {!$six} 
5d50: 63 6f 6e 74 69 6e 75 65 0a 0a 09 20 20 20 20 73  continue...    s
5d60: 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69  truct::list assi
5d70: 67 6e 20 24 64 65 70 20 70 61 72 65 6e 74 20 63  gn $dep parent c
5d80: 68 69 6c 64 0a 09 20 20 20 20 6c 6f 67 20 77 72  hild..    log wr
5d90: 69 74 65 20 35 20 63 73 65 74 73 20 22 42 72 6f  ite 5 csets "Bro
5da0: 6b 65 20 64 65 70 65 6e 64 65 6e 63 79 20 5b 50  ke dependency [P
5db0: 44 20 24 70 61 72 65 6e 74 5d 20 2d 2d 3e 20 5b  D $parent] --> [
5dc0: 50 44 20 24 63 68 69 6c 64 5d 22 0a 09 7d 0a 0a  PD $child]"..}..
5dd0: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
5de0: 20 20 20 23 20 50 72 69 6e 74 20 69 64 65 6e 74     # Print ident
5df0: 69 66 79 69 6e 67 20 64 61 74 61 20 66 6f 72 20  ifying data for 
5e00: 61 20 72 65 76 69 73 69 6f 6e 20 28 70 72 6f 6a  a revision (proj
5e10: 65 63 74 2c 20 66 69 6c 65 2c 20 64 6f 74 74 65  ect, file, dotte
5e20: 64 20 72 65 76 0a 20 20 20 20 23 20 6e 75 6d 62  d rev.    # numb
5e30: 65 72 29 2c 20 66 6f 72 20 68 69 67 68 20 76 65  er), for high ve
5e40: 72 62 6f 73 69 74 79 20 6c 6f 67 20 6f 75 74 70  rbosity log outp
5e50: 75 74 2e 0a 20 20 20 20 23 20 54 4f 44 4f 3a 20  ut..    # TODO: 
5e60: 52 65 70 6c 61 63 65 20 77 69 74 68 20 63 61 6c  Replace with cal
5e70: 6c 20 74 6f 20 69 74 65 6d 73 74 72 20 28 6c 69  l to itemstr (li
5e80: 73 74 20 72 65 76 20 24 69 64 29 0a 0a 20 20 20  st rev $id)..   
5e90: 20 70 72 6f 63 20 50 44 20 7b 69 64 7d 20 7b 0a   proc PD {id} {.
5ea0: 09 66 6f 72 65 61 63 68 20 7b 70 20 66 20 72 7d  .foreach {p f r}
5eb0: 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09   [state run {...
5ec0: 53 45 4c 45 43 54 20 50 2e 6e 61 6d 65 20 2c 20  SELECT P.name , 
5ed0: 46 2e 6e 61 6d 65 2c 20 52 2e 72 65 76 0a 09 09  F.name, R.rev...
5ee0: 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c  FROM revision R,
5ef0: 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65 63 74   file F, project
5f00: 20 50 0a 09 09 57 48 45 52 45 20 52 2e 72 69 64   P...WHERE R.rid
5f10: 20 3d 20 24 69 64 0a 09 09 41 4e 44 20 20 20 46   = $id...AND   F
5f20: 2e 66 69 64 20 3d 20 52 2e 66 69 64 0a 09 09 41  .fid = R.fid...A
5f30: 4e 44 20 20 20 50 2e 70 69 64 20 3d 20 46 2e 70  ND   P.pid = F.p
5f40: 69 64 0a 09 7d 5d 20 62 72 65 61 6b 0a 09 72 65  id..}] break..re
5f50: 74 75 72 6e 20 22 27 24 70 20 3a 20 24 66 2f 24  turn "'$p : $f/$
5f60: 72 27 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  r'".    }..    #
5f70: 20 50 72 69 6e 74 69 6e 67 20 6f 6e 65 20 6f 72   Printing one or
5f80: 20 6d 6f 72 65 20 72 61 6e 67 65 73 2c 20 66 6f   more ranges, fo
5f90: 72 6d 61 74 74 65 64 2c 20 61 6e 64 20 6f 6e 6c  rmatted, and onl
5fa0: 79 20 74 68 65 69 72 20 62 6f 72 64 65 72 20 74  y their border t
5fb0: 6f 0a 20 20 20 20 23 20 6b 65 65 70 20 74 68 65  o.    # keep the
5fc0: 20 73 74 72 69 6e 67 73 20 73 68 6f 72 74 2e 0a   strings short..
5fd0: 0a 20 20 20 20 70 72 6f 63 20 50 52 73 20 7b 72  .    proc PRs {r
5fe0: 61 6e 67 65 73 7d 20 7b 0a 09 72 65 74 75 72 6e  anges} {..return
5ff0: 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d   [struct::list m
6000: 61 70 20 24 72 61 6e 67 65 73 20 5b 6d 79 70 72  ap $ranges [mypr
6010: 6f 63 20 50 52 5d 5d 0a 20 20 20 20 7d 0a 0a 20  oc PR]].    }.. 
6020: 20 20 20 70 72 6f 63 20 50 52 20 7b 72 61 6e 67     proc PR {rang
6030: 65 7d 20 7b 0a 09 42 6f 72 64 65 72 20 24 72 61  e} {..Border $ra
6040: 6e 67 65 20 73 20 65 0a 09 72 65 74 75 72 6e 20  nge s e..return 
6050: 3c 24 7b 73 7d 2e 2e 2e 24 7b 65 7d 3e 0a 20 20  <${s}...${e}>.  
6060: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 42 6f    }..    proc Bo
6070: 72 64 65 72 20 7b 72 61 6e 67 65 20 73 76 20 65  rder {range sv e
6080: 76 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 73  v} {..upvar 1 $s
6090: 76 20 73 20 24 65 76 20 65 0a 09 73 65 74 20 73  v s $ev e..set s
60a0: 20 5b 6c 69 6e 64 65 78 20 24 72 61 6e 67 65 20   [lindex $range 
60b0: 30 5d 0a 09 73 65 74 20 65 20 5b 6c 69 6e 64 65  0]..set e [linde
60c0: 78 20 24 72 61 6e 67 65 20 65 6e 64 5d 0a 09 72  x $range end]..r
60d0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
60e0: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23   # # ## ### ####
60f0: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
6100: 23 23 23 23 23 23 23 23 0a 0a 20 20 20 20 74 79  ########..    ty
6110: 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 68 61  pevariable mycha
6120: 6e 67 65 73 65 74 73 20 20 20 20 20 20 20 20 20  ngesets         
6130: 7b 7d 20 3b 20 23 20 4c 69 73 74 20 6f 66 20 61  {} ; # List of a
6140: 6c 6c 20 6b 6e 6f 77 6e 0a 09 09 09 09 09 20 20  ll known......  
6150: 20 23 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 20   # changesets.. 
6160: 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20     typevariable 
6170: 6d 79 74 63 68 61 6e 67 65 73 65 74 73 20 2d 61  mytchangesets -a
6180: 72 72 61 79 20 7b 7d 20 3b 20 23 20 4c 69 73 74  rray {} ; # List
6190: 20 6f 66 20 61 6c 6c 20 6b 6e 6f 77 6e 0a 09 09   of all known...
61a0: 09 09 09 20 20 20 23 20 63 68 61 6e 67 65 73 65  ...   # changese
61b0: 74 73 20 6f 66 20 61 20 74 79 70 65 2e 0a 20 20  ts of a type..  
61c0: 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d    typevariable m
61d0: 79 69 74 65 6d 6d 61 70 20 20 20 20 20 2d 61 72  yitemmap     -ar
61e0: 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 66  ray {} ; # Map f
61f0: 72 6f 6d 20 69 74 65 6d 73 20 28 74 61 67 67 65  rom items (tagge
6200: 64 29 0a 09 09 09 09 09 20 20 20 23 20 74 6f 20  d)......   # to 
6210: 74 68 65 20 6c 69 73 74 20 6f 66 20 63 68 61 6e  the list of chan
6220: 67 65 73 65 74 73 0a 09 09 09 09 09 20 20 20 23  gesets......   #
6230: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 69 74 2e 20   containing it. 
6240: 45 61 63 68 20 69 74 65 6d 0a 09 09 09 09 09 20  Each item...... 
6250: 20 20 23 20 63 61 6e 20 62 65 20 75 73 65 64 20    # can be used 
6260: 62 79 20 6f 6e 6c 79 20 6f 6e 65 0a 09 09 09 09  by only one.....
6270: 09 20 20 20 23 20 63 68 61 6e 67 65 73 65 74 2e  .   # changeset.
6280: 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c  .    typevariabl
6290: 65 20 6d 79 69 64 6d 61 70 20 20 20 2d 61 72 72  e myidmap   -arr
62a0: 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 66 72  ay {} ; # Map fr
62b0: 6f 6d 20 63 68 61 6e 67 65 73 65 74 20 69 64 20  om changeset id 
62c0: 74 6f 0a 09 09 09 09 20 20 20 20 20 20 20 23 20  to.....       # 
62d0: 63 68 61 6e 67 65 73 65 74 2e 0a 0a 20 20 20 20  changeset...    
62e0: 74 79 70 65 6d 65 74 68 6f 64 20 61 6c 6c 20 20  typemethod all  
62f0: 20 20 7b 7d 20 20 20 20 7b 20 72 65 74 75 72 6e    {}    { return
6300: 20 24 6d 79 63 68 61 6e 67 65 73 65 74 73 20 7d   $mychangesets }
6310: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
6320: 6f 66 20 20 20 20 20 7b 63 69 64 7d 20 7b 20 72  of     {cid} { r
6330: 65 74 75 72 6e 20 24 6d 79 69 64 6d 61 70 28 24  eturn $myidmap($
6340: 63 69 64 29 20 7d 0a 20 20 20 20 74 79 70 65 6d  cid) }.    typem
6350: 65 74 68 6f 64 20 6f 66 69 74 65 6d 20 7b 69 69  ethod ofitem {ii
6360: 64 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69  d} { return $myi
6370: 74 65 6d 6d 61 70 28 24 69 69 64 29 20 7d 0a 0a  temmap($iid) }..
6380: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 72      typemethod r
6390: 65 76 20 20 20 20 7b 7d 20 20 20 20 7b 20 72 65  ev    {}    { re
63a0: 74 75 72 6e 20 24 6d 79 74 63 68 61 6e 67 65 73  turn $mytchanges
63b0: 65 74 73 28 72 65 76 29 20 7d 0a 20 20 20 20 74  ets(rev) }.    t
63c0: 79 70 65 6d 65 74 68 6f 64 20 73 79 6d 20 20 20  ypemethod sym   
63d0: 20 7b 7d 20 20 20 20 7b 20 72 65 74 75 72 6e 20   {}    { return 
63e0: 5b 63 6f 6e 63 61 74 20 5c 0a 09 09 09 09 09 20  [concat \...... 
63f0: 20 24 7b 6d 79 74 63 68 61 6e 67 65 73 65 74 73   ${mytchangesets
6400: 28 73 79 6d 3a 3a 62 72 61 6e 63 68 29 7d 20 5c  (sym::branch)} \
6410: 0a 09 09 09 09 09 20 20 24 7b 6d 79 74 63 68 61  ......  ${mytcha
6420: 6e 67 65 73 65 74 73 28 73 79 6d 3a 3a 74 61 67  ngesets(sym::tag
6430: 29 7d 5d 20 7d 0a 0a 20 20 20 20 23 20 23 20 23  )}] }..    # # #
6440: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
6450: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
6460: 23 23 0a 20 20 20 20 23 23 20 43 6f 6e 66 69 67  ##.    ## Config
6470: 75 72 61 74 69 6f 6e 0a 0a 20 20 20 20 70 72 61  uration..    pra
6480: 67 6d 61 20 2d 68 61 73 74 79 70 65 69 6e 66 6f  gma -hastypeinfo
6490: 20 20 20 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 74      no  ; # no t
64a0: 79 70 65 20 69 6e 74 72 6f 73 70 65 63 74 69 6f  ype introspectio
64b0: 6e 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61  n.    pragma -ha
64c0: 73 69 6e 66 6f 20 20 20 20 20 20 20 20 6e 6f 20  sinfo        no 
64d0: 20 3b 20 23 20 6e 6f 20 6f 62 6a 65 63 74 20 69   ; # no object i
64e0: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 0a 20 20  ntrospection..  
64f0: 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23    # # ## ### ###
6500: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23  ## ######## ####
6510: 23 23 23 23 23 23 23 23 23 0a 7d 0a 0a 23 23 0a  #########.}..##.
6520: 23 23 20 4e 4f 54 45 3a 20 54 68 65 20 73 75 63  ## NOTE: The suc
6530: 63 65 73 73 6f 72 20 61 6e 64 20 70 72 65 64 65  cessor and prede
6540: 63 65 73 73 6f 72 20 6d 65 74 68 6f 64 73 20 64  cessor methods d
6550: 65 66 69 6e 65 64 20 62 79 20 74 68 65 20 63 6c  efined by the cl
6560: 61 73 73 65 73 0a 23 23 20 20 20 20 20 20 20 62  asses.##       b
6570: 65 6c 6f 77 20 61 72 65 20 2d 2d 20 62 6f 74 74  elow are -- bott
6580: 6c 65 20 6e 65 63 6b 73 20 2d 2d 2e 20 4c 6f 6f  le necks --. Loo
6590: 6b 20 66 6f 72 20 77 61 79 73 20 74 6f 20 6d 61  k for ways to ma
65a0: 6b 65 20 74 68 65 20 53 51 4c 0a 23 23 20 20 20  ke the SQL.##   
65b0: 20 20 20 20 66 61 73 74 65 72 2e 0a 23 23 0a 0a      faster..##..
65c0: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
65d0: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
65e0: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
65f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23  #############.##
6600: 20 48 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f   Helper singleto
6610: 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20 66 6f 72 20  n. Commands for 
6620: 72 65 76 69 73 69 6f 6e 20 63 68 61 6e 67 65 73  revision changes
6630: 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 65  ets...snit::type
6640: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
6650: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a  mport::cvs::proj
6660: 65 63 74 3a 3a 72 65 76 3a 3a 72 65 76 20 7b 0a  ect::rev::rev {.
6670: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62      typemethod b
6680: 79 72 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 72  yrevision {} { r
6690: 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 79  eturn 1 }.    ty
66a0: 70 65 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 6f  pemethod bysymbo
66b0: 6c 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20  l   {} { return 
66c0: 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68  0 }.    typemeth
66d0: 6f 64 20 69 73 74 61 67 20 20 20 20 20 20 7b 7d  od istag      {}
66e0: 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20   { return 0 }.  
66f0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73 62    typemethod isb
6700: 72 61 6e 63 68 20 20 20 7b 7d 20 7b 20 72 65 74  ranch   {} { ret
6710: 75 72 6e 20 30 20 7d 0a 0a 20 20 20 20 74 79 70  urn 0 }..    typ
6720: 65 6d 65 74 68 6f 64 20 73 74 72 20 7b 72 65 76  emethod str {rev
6730: 69 73 69 6f 6e 7d 20 7b 0a 09 73 74 72 75 63 74  ision} {..struct
6740: 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b 73  ::list assign [s
6750: 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20  tate run {..    
6760: 53 45 4c 45 43 54 20 52 2e 72 65 76 2c 20 46 2e  SELECT R.rev, F.
6770: 6e 61 6d 65 2c 20 50 2e 6e 61 6d 65 0a 09 20 20  name, P.name..  
6780: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f    FROM   revisio
6790: 6e 20 52 2c 20 66 69 6c 65 20 46 2c 20 70 72 6f  n R, file F, pro
67a0: 6a 65 63 74 20 50 0a 09 20 20 20 20 57 48 45 52  ject P..    WHER
67b0: 45 20 20 52 2e 72 69 64 20 3d 20 24 72 65 76 69  E  R.rid = $revi
67c0: 73 69 6f 6e 0a 09 20 20 20 20 41 4e 44 20 20 20  sion..    AND   
67d0: 20 46 2e 66 69 64 20 3d 20 52 2e 66 69 64 0a 09   F.fid = R.fid..
67e0: 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69 64      AND    P.pid
67f0: 20 3d 20 46 2e 70 69 64 0a 09 7d 5d 20 72 65 76   = F.pid..}] rev
6800: 6e 72 20 66 6e 61 6d 65 20 70 6e 61 6d 65 0a 09  nr fname pname..
6810: 72 65 74 75 72 6e 20 22 24 70 6e 61 6d 65 2f 24  return "$pname/$
6820: 7b 72 65 76 6e 72 7d 3a 3a 24 66 6e 61 6d 65 22  {revnr}::$fname"
6830: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65  .    }..    # re
6840: 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69 6e  sult = list (min
6850: 74 69 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a 20  time, maxtime). 
6860: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 74 69     typemethod ti
6870: 6d 65 72 61 6e 67 65 20 7b 69 74 65 6d 73 7d 20  merange {items} 
6880: 7b 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27  {..set theset ('
6890: 5b 6a 6f 69 6e 20 24 69 74 65 6d 73 20 7b 27 2c  [join $items {',
68a0: 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73  '}]')..return [s
68b0: 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20  tate run "..    
68c0: 53 45 4c 45 43 54 20 4d 49 4e 28 52 2e 64 61 74  SELECT MIN(R.dat
68d0: 65 29 2c 20 4d 41 58 28 52 2e 64 61 74 65 29 0a  e), MAX(R.date).
68e0: 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69  .    FROM revisi
68f0: 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20  on R..    WHERE 
6900: 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 74  R.rid IN $theset
6910: 0a 09 22 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  .."].    }..    
6920: 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74  # var(dv) = dict
6930: 20 28 72 65 76 69 73 69 6f 6e 20 2d 3e 20 6c 69   (revision -> li
6940: 73 74 20 28 72 65 76 69 73 69 6f 6e 29 29 0a 20  st (revision)). 
6950: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 6e     typemethod in
6960: 74 65 72 6e 61 6c 73 75 63 63 65 73 73 6f 72 73  ternalsuccessors
6970: 20 7b 64 76 20 72 65 76 69 73 69 6f 6e 73 7d 20   {dv revisions} 
6980: 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76 20 64  {..upvar 1 $dv d
6990: 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 73 65 74  ependencies..set
69a0: 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20   theset ('[join 
69b0: 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d  $revisions {','}
69c0: 5d 27 29 0a 0a 09 23 20 53 65 65 20 27 73 75 63  ]')...# See 'suc
69d0: 63 65 73 73 6f 72 73 27 20 62 65 6c 6f 77 20 66  cessors' below f
69e0: 6f 72 20 74 68 65 20 6d 61 69 6e 20 65 78 70 6c  or the main expl
69f0: 61 6e 61 74 69 6f 6e 20 6f 66 0a 09 23 20 74 68  anation of..# th
6a00: 65 20 76 61 72 69 6f 75 73 20 63 61 73 65 73 2e  e various cases.
6a10: 20 54 68 69 73 20 70 69 65 63 65 20 69 73 20 73   This piece is s
6a20: 70 65 63 69 61 6c 20 69 6e 20 74 68 61 74 20 69  pecial in that i
6a30: 74 0a 09 23 20 72 65 73 74 72 69 63 74 73 20 74  t..# restricts t
6a40: 68 65 20 73 75 63 63 65 73 73 6f 72 73 20 77 65  he successors we
6a50: 20 6c 6f 6f 6b 20 66 6f 72 20 74 6f 20 74 68 65   look for to the
6a60: 20 73 61 6d 65 20 73 65 74 20 6f 66 0a 09 23 20   same set of..# 
6a70: 72 65 76 69 73 69 6f 6e 73 20 77 65 20 73 74 61  revisions we sta
6a80: 72 74 20 66 72 6f 6d 2e 20 53 65 6e 73 69 62 6c  rt from. Sensibl
6a90: 65 20 61 73 20 77 65 20 61 72 65 20 6c 6f 6f 6b  e as we are look
6aa0: 69 6e 67 20 66 6f 72 0a 09 23 20 63 68 61 6e 67  ing for..# chang
6ab0: 65 73 65 74 20 69 6e 74 65 72 6e 61 6c 20 64 65  eset internal de
6ac0: 70 65 6e 64 65 6e 63 69 65 73 2e 0a 0a 09 61 72  pendencies....ar
6ad0: 72 61 79 20 73 65 74 20 64 65 70 20 7b 7d 0a 0a  ray set dep {}..
6ae0: 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68  .foreach {rid ch
6af0: 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20  ild} [state run 
6b00: 22 0a 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d  ".   -- (1) Prim
6b10: 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20 53  ary child..    S
6b20: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63  ELECT R.rid, R.c
6b30: 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  hild..    FROM  
6b40: 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20   revision R..   
6b50: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20   WHERE  R.rid   
6b60: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d  IN $theset     -
6b70: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65  - Restrict to re
6b80: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72  visions of inter
6b90: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  est..    AND    
6ba0: 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e  R.child IS NOT N
6bb0: 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72  ULL    -- Has pr
6bc0: 69 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20  imary child..   
6bd0: 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20   AND    R.child 
6be0: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d  IN $theset     -
6bf0: 2d 20 57 68 69 63 68 20 69 73 20 61 6c 73 6f 20  - Which is also 
6c00: 6f 66 20 69 6e 74 65 72 65 73 74 0a 20 20 20 20  of interest.    
6c10: 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32 29  UNION.    -- (2)
6c20: 20 53 65 63 6f 6e 64 61 72 79 20 28 62 72 61 6e   Secondary (bran
6c30: 63 68 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 20  ch) children..  
6c40: 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20    SELECT R.rid, 
6c50: 42 2e 62 72 69 64 0a 09 20 20 20 20 46 52 4f 4d  B.brid..    FROM
6c60: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72     revision R, r
6c70: 65 76 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 69  evisionbranchchi
6c80: 6c 64 72 65 6e 20 42 0a 09 20 20 20 20 57 48 45  ldren B..    WHE
6c90: 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24  RE  R.rid   IN $
6ca0: 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65  theset     -- Re
6cb0: 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69  strict to revisi
6cc0: 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  ons of interest.
6cd0: 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72 69  .    AND    R.ri
6ce0: 64 20 3d 20 42 2e 72 69 64 20 20 20 20 20 20 20  d = B.rid       
6cf0: 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 73 75 62     -- Select sub
6d00: 73 65 74 20 6f 66 20 62 72 61 6e 63 68 20 63 68  set of branch ch
6d10: 69 6c 64 72 65 6e 0a 09 20 20 20 20 41 4e 44 20  ildren..    AND 
6d20: 20 20 20 42 2e 62 72 69 64 20 49 4e 20 24 74 68     B.brid IN $th
6d30: 65 73 65 74 20 20 20 20 20 20 2d 2d 20 57 68 69  eset      -- Whi
6d40: 63 68 20 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e  ch is also of in
6d50: 74 65 72 65 73 74 0a 20 20 20 20 55 4e 49 4f 4e  terest.    UNION
6d60: 0a 20 20 20 20 2d 2d 20 28 34 29 20 43 68 69 6c  .    -- (4) Chil
6d70: 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 20  d of trunk root 
6d80: 73 75 63 63 65 73 73 6f 72 20 6f 66 20 6c 61 73  successor of las
6d90: 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b 2e  t NTDB on trunk.
6da0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
6db0: 69 64 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20 20  id, RA.child..  
6dc0: 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20    FROM revision 
6dd0: 52 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 0a 09  R, revision RA..
6de0: 20 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 20      WHERE R.rid 
6df0: 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20    IN $theset    
6e00: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f    -- Restrict to
6e10: 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e   revisions of in
6e20: 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20  terest..    AND 
6e30: 20 20 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20    R.isdefault   
6e40: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73            -- Res
6e50: 74 72 69 63 74 20 74 6f 20 4e 54 44 42 0a 09 20  trict to NTDB.. 
6e60: 20 20 20 41 4e 44 20 20 20 52 2e 64 62 63 68 69     AND   R.dbchi
6e70: 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20  ld IS NOT NULL  
6e80: 20 2d 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 44   -- and last NTD
6e90: 42 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  B belonging to t
6ea0: 72 75 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 20  runk..    AND   
6eb0: 52 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69  RA.rid = R.dbchi
6ec0: 6c 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69  ld      -- Go di
6ed0: 72 65 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20  rectly to trunk 
6ee0: 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20  root..    AND   
6ef0: 52 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20  RA.child IS NOT 
6f00: 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70  NULL    -- Has p
6f10: 72 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 20 20  rimary child..  
6f20: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20            AND   
6f30: 52 41 2e 63 68 69 6c 64 20 49 4e 20 24 74 68 65  RA.child IN $the
6f40: 73 65 74 20 20 20 20 20 2d 2d 20 57 68 69 63 68  set     -- Which
6f50: 20 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e 74 65   is also of inte
6f60: 72 65 73 74 0a 09 22 5d 20 7b 0a 09 20 20 20 20  rest.."] {..    
6f70: 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69 6e  # Consider movin
6f80: 67 20 74 68 69 73 20 74 6f 20 74 68 65 20 69 6e  g this to the in
6f90: 74 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e 0a  tegrity module..
6fa0: 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61  .    integrity a
6fb0: 73 73 65 72 74 20 7b 24 72 69 64 20 21 3d 20 24  ssert {$rid != $
6fc0: 63 68 69 6c 64 7d 20 7b 52 65 76 69 73 69 6f 6e  child} {Revision
6fd0: 20 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f 6e   $rid depends on
6fe0: 20 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20 6c   itself.}..    l
6ff0: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63  append dependenc
7000: 69 65 73 28 24 72 69 64 29 20 24 63 68 69 6c 64  ies($rid) $child
7010: 0a 09 20 20 20 20 73 65 74 20 64 65 70 28 24 72  ..    set dep($r
7020: 69 64 2c 24 63 68 69 6c 64 29 20 2e 0a 09 7d 0a  id,$child) ...}.
7030: 0a 09 23 20 54 68 65 20 73 71 6c 20 73 74 61 74  ..# The sql stat
7040: 65 6d 65 6e 74 73 20 61 62 6f 76 65 20 6c 6f 6f  ements above loo
7050: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 64 69 72 65  ks only for dire
7060: 63 74 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a  ct dependencies.
7070: 09 23 20 62 65 74 77 65 65 6e 20 72 65 76 69 73  .# between revis
7080: 69 6f 6e 20 69 6e 20 74 68 65 20 63 68 61 6e 67  ion in the chang
7090: 65 73 65 74 2e 20 48 6f 77 65 76 65 72 20 64 75  eset. However du
70a0: 65 20 74 6f 20 74 68 65 0a 09 23 20 76 61 67 61  e to the..# vaga
70b0: 72 69 65 73 20 6f 66 20 6d 65 74 61 20 64 61 74  ries of meta dat
70c0: 61 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  a it is possible
70d0: 20 66 6f 72 20 74 77 6f 20 72 65 76 69 73 69 6f   for two revisio
70e0: 6e 73 20 6f 66 0a 09 23 20 74 68 65 20 73 61 6d  ns of..# the sam
70f0: 65 20 66 69 6c 65 20 74 6f 20 65 6e 64 20 75 70  e file to end up
7100: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 63 68 61   in the same cha
7110: 6e 67 65 73 65 74 2c 20 77 69 74 68 6f 75 74 20  ngeset, without 
7120: 61 0a 09 23 20 64 69 72 65 63 74 20 64 65 70 65  a..# direct depe
7130: 6e 64 65 6e 63 79 20 62 65 74 77 65 65 6e 20 74  ndency between t
7140: 68 65 6d 2e 20 48 6f 77 65 76 65 72 20 77 65 20  hem. However we 
7150: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 72 65 0a  know that there.
7160: 09 23 20 68 61 73 20 74 6f 20 62 65 20 61 20 61  .# has to be a a
7170: 6e 20 69 6e 64 69 72 65 63 74 20 64 65 70 65 6e  n indirect depen
7180: 64 65 6e 63 79 2c 20 62 65 20 69 74 20 74 68 72  dency, be it thr
7190: 6f 75 67 68 20 70 72 69 6d 61 72 79 0a 09 23 20  ough primary..# 
71a0: 63 68 69 6c 64 72 65 6e 2c 20 62 72 61 6e 63 68  children, branch
71b0: 20 63 68 69 6c 64 72 65 6e 2c 20 6f 72 20 61 20   children, or a 
71c0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68 65 72  combination ther
71d0: 65 6f 66 2e 0a 0a 09 23 20 57 65 20 6e 6f 77 20  eof....# We now 
71e0: 66 69 6c 6c 20 69 6e 20 74 68 65 73 65 20 70 73  fill in these ps
71f0: 65 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63 69 65  eudo-dependencie
7200: 73 2c 20 69 66 20 6e 6f 20 73 75 63 68 0a 09 23  s, if no such..#
7210: 20 64 65 70 65 6e 64 65 6e 63 79 20 65 78 69 73   dependency exis
7220: 74 73 20 61 6c 72 65 61 64 79 2e 20 54 68 65 20  ts already. The 
7230: 64 69 72 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  direction of the
7240: 20 64 65 70 65 6e 64 65 6e 63 79 0a 09 23 20 69   dependency..# i
7250: 73 20 61 63 74 75 61 6c 6c 79 20 69 72 72 65 6c  s actually irrel
7260: 65 76 61 6e 74 20 66 6f 72 20 74 68 69 73 2e 0a  evant for this..
7270: 0a 09 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 69  ..# NOTE: This i
7280: 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
7290: 20 63 76 73 32 73 76 6e 2e 20 4f 75 72 20 73 70   cvs2svn. Our sp
72a0: 69 72 69 74 75 61 6c 20 61 6e 63 65 73 74 6f 72  iritual ancestor
72b0: 0a 09 23 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ..# does not use
72c0: 20 73 75 63 68 20 70 73 65 75 64 6f 2d 64 65 70   such pseudo-dep
72d0: 65 6e 64 65 6e 63 69 65 73 2c 20 68 6f 77 65 76  endencies, howev
72e0: 65 72 20 69 74 20 75 73 65 73 20 61 0a 09 23 20  er it uses a..# 
72f0: 43 4f 4d 4d 49 54 5f 54 48 52 45 53 48 4f 4c 44  COMMIT_THRESHOLD
7300: 2c 20 61 20 74 69 6d 65 20 69 6e 74 65 72 76 61  , a time interva
7310: 6c 20 63 6f 6d 6d 69 74 73 20 73 68 6f 75 6c 64  l commits should
7320: 20 66 61 6c 6c 2e 20 54 68 69 73 0a 09 23 20 77   fall. This..# w
7330: 69 6c 6c 20 67 72 65 61 74 6c 79 20 72 65 64 75  ill greatly redu
7340: 63 65 73 20 74 68 65 20 72 69 73 6b 20 6f 66 20  ces the risk of 
7350: 67 65 74 74 69 6e 67 20 66 61 72 20 73 65 70 61  getting far sepa
7360: 72 61 74 65 64 0a 09 23 20 72 65 76 69 73 69 6f  rated..# revisio
7370: 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 66  ns of the same f
7380: 69 6c 65 20 69 6e 74 6f 20 6f 6e 65 20 63 68 61  ile into one cha
7390: 6e 67 65 73 65 74 2e 0a 0a 09 23 20 57 65 20 61  ngeset....# We a
73a0: 6c 6c 6f 77 20 72 65 76 69 73 69 6f 6e 73 20 74  llow revisions t
73b0: 6f 20 62 65 20 66 61 72 20 61 70 61 72 74 20 69  o be far apart i
73c0: 6e 20 74 69 6d 65 20 69 6e 20 74 68 65 20 73 61  n time in the sa
73d0: 6d 65 0a 09 23 20 63 68 61 6e 67 65 73 65 74 2c  me..# changeset,
73e0: 20 62 75 74 20 69 6e 20 74 75 72 6e 20 6e 65 65   but in turn nee
73f0: 64 20 74 68 65 20 70 73 65 75 64 6f 2d 64 65 70  d the pseudo-dep
7400: 65 6e 64 65 6e 63 69 65 73 20 74 6f 0a 09 23 20  endencies to..# 
7410: 68 61 6e 64 6c 65 20 74 68 69 73 2e 0a 0a 09 61  handle this....a
7420: 72 72 61 79 20 73 65 74 20 66 69 64 73 20 7b 7d  rray set fids {}
7430: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 66  ..foreach {rid f
7440: 69 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22  id} [state run "
7450: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
7460: 69 64 2c 20 52 2e 66 69 64 0a 20 20 20 20 20 20  id, R.fid.      
7470: 20 20 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76        FROM   rev
7480: 69 73 69 6f 6e 20 52 0a 20 20 20 20 20 20 20 20  ision R.        
7490: 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64      WHERE  R.rid
74a0: 20 49 4e 20 24 74 68 65 73 65 74 0a 09 22 5d 20   IN $theset.."] 
74b0: 7b 20 6c 61 70 70 65 6e 64 20 66 69 64 73 28 24  { lappend fids($
74c0: 66 69 64 29 20 24 72 69 64 20 7d 0a 0a 09 66 6f  fid) $rid }...fo
74d0: 72 65 61 63 68 20 7b 66 69 64 20 72 69 64 73 7d  reach {fid rids}
74e0: 20 5b 61 72 72 61 79 20 67 65 74 20 66 69 64 73   [array get fids
74f0: 5d 20 7b 0a 09 20 20 20 20 69 66 20 7b 5b 6c 6c  ] {..    if {[ll
7500: 65 6e 67 74 68 20 24 72 69 64 73 5d 20 3c 20 32  ength $rids] < 2
7510: 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 20 20 20 20  } continue..    
7520: 66 6f 72 65 61 63 68 20 61 20 24 72 69 64 73 20  foreach a $rids 
7530: 7b 0a 09 09 66 6f 72 65 61 63 68 20 62 20 24 72  {...foreach b $r
7540: 69 64 73 20 7b 0a 09 09 20 20 20 20 69 66 20 7b  ids {...    if {
7550: 24 61 20 3d 3d 20 24 62 7d 20 63 6f 6e 74 69 6e  $a == $b} contin
7560: 75 65 0a 09 09 20 20 20 20 69 66 20 7b 5b 69 6e  ue...    if {[in
7570: 66 6f 20 65 78 69 73 74 73 20 64 65 70 28 24 61  fo exists dep($a
7580: 2c 24 62 29 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a  ,$b)]} continue.
7590: 09 09 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20  ..    if {[info 
75a0: 65 78 69 73 74 73 20 64 65 70 28 24 62 2c 24 61  exists dep($b,$a
75b0: 29 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 09 20  )]} continue... 
75c0: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e     lappend depen
75d0: 64 65 6e 63 69 65 73 28 24 61 29 20 24 62 0a 09  dencies($a) $b..
75e0: 09 20 20 20 20 73 65 74 20 64 65 70 28 24 61 2c  .    set dep($a,
75f0: 24 62 29 20 2e 0a 09 09 20 20 20 20 73 65 74 20  $b) ....    set 
7600: 64 65 70 28 24 62 2c 24 61 29 20 2e 0a 09 09 7d  dep($b,$a) ....}
7610: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72 65 74 75  ..    }..}..retu
7620: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  rn.    }..    # 
7630: 72 65 73 75 6c 74 20 3d 20 34 2d 6c 69 73 74 20  result = 4-list 
7640: 28 69 74 65 6d 74 79 70 65 20 69 74 65 6d 69 64  (itemtype itemid
7650: 20 6e 65 78 74 69 74 65 6d 74 79 70 65 20 6e 65   nextitemtype ne
7660: 78 74 69 74 65 6d 69 64 20 2e 2e 2e 29 0a 20 20  xtitemid ...).  
7670: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c 6f 6f    typemethod loo
7680: 70 73 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b  ps {revisions} {
7690: 0a 09 23 20 4e 6f 74 65 3a 20 54 61 67 73 20 61  ..# Note: Tags a
76a0: 6e 64 20 62 72 61 6e 63 68 65 73 20 63 61 6e 6e  nd branches cann
76b0: 6f 74 20 63 61 75 73 65 20 74 68 65 20 6c 6f 6f  ot cause the loo
76c0: 70 2e 20 54 68 65 69 72 20 69 64 27 73 2c 0a 09  p. Their id's,..
76d0: 23 20 62 65 69 6e 20 6f 66 20 61 20 66 75 6e 64  # bein of a fund
76e0: 61 6d 65 6e 74 61 6c 6c 79 20 64 69 66 66 65 72  amentally differ
76f0: 65 6e 74 20 74 79 70 65 20 74 68 61 6e 20 74 68  ent type than th
7700: 65 20 72 65 76 69 73 69 6f 6e 73 0a 09 23 20 63  e revisions..# c
7710: 6f 6d 69 6e 67 20 69 6e 20 63 61 6e 6e 6f 74 20  oming in cannot 
7720: 62 65 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 0a  be in the set...
7730: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a  .set theset ('[j
7740: 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b  oin $revisions {
7750: 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20  ','}]')..return 
7760: 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73  [state run [subs
7770: 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e  t -nocommands -n
7780: 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09  obackslashes {..
7790: 20 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d 61      -- (1) Prima
77a0: 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20 53 45  ry child..    SE
77b0: 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63 68  LECT R.rid, R.ch
77c0: 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  ild..    FROM   
77d0: 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20  revision R..    
77e0: 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49  WHERE  R.rid   I
77f0: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d  N $theset     --
7800: 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76   Restrict to rev
7810: 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65  isions of intere
7820: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  st..    AND    R
7830: 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55  .child IS NOT NU
7840: 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69  LL    -- Has pri
7850: 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20  mary child..    
7860: 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49  AND    R.child I
7870: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d  N $theset     --
7880: 20 4c 6f 6f 70 0a 09 20 20 20 20 2d 2d 0a 09 20   Loop..    --.. 
7890: 20 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 2d 2d     UNION..    --
78a0: 20 28 32 29 20 53 65 63 6f 6e 64 61 72 79 20 28   (2) Secondary (
78b0: 62 72 61 6e 63 68 29 20 63 68 69 6c 64 72 65 6e  branch) children
78c0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
78d0: 69 64 2c 20 42 2e 62 72 69 64 0a 09 20 20 20 20  id, B.brid..    
78e0: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20  FROM   revision 
78f0: 52 2c 20 72 65 76 69 73 69 6f 6e 62 72 61 6e 63  R, revisionbranc
7900: 68 63 68 69 6c 64 72 65 6e 20 42 0a 09 20 20 20  hchildren B..   
7910: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20   WHERE  R.rid   
7920: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d  IN $theset     -
7930: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65  - Restrict to re
7940: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72  visions of inter
7950: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  est..    AND    
7960: 52 2e 72 69 64 20 3d 20 42 2e 72 69 64 20 20 20  R.rid = B.rid   
7970: 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74         -- Select
7980: 20 73 75 62 73 65 74 20 6f 66 20 62 72 61 6e 63   subset of branc
7990: 68 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20  h children..    
79a0: 41 4e 44 20 20 20 20 42 2e 72 69 64 20 20 20 49  AND    B.rid   I
79b0: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d  N $theset     --
79c0: 20 4c 6f 6f 70 0a 09 20 20 20 20 2d 2d 0a 09 20   Loop..    --.. 
79d0: 20 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 2d 2d     UNION..    --
79e0: 20 28 34 29 20 43 68 69 6c 64 20 6f 66 20 74 72   (4) Child of tr
79f0: 75 6e 6b 20 72 6f 6f 74 20 73 75 63 63 65 73 73  unk root success
7a00: 6f 72 20 6f 66 20 6c 61 73 74 20 4e 54 44 42 20  or of last NTDB 
7a10: 6f 6e 20 74 72 75 6e 6b 2e 0a 09 20 20 20 20 53  on trunk...    S
7a20: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 41 2e  ELECT R.rid, RA.
7a30: 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20  child..    FROM 
7a40: 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65    revision R, re
7a50: 76 69 73 69 6f 6e 20 52 41 0a 09 20 20 20 20 57  vision RA..    W
7a60: 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 20 49  HERE  R.rid    I
7a70: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d  N $theset     --
7a80: 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76   Restrict to rev
7a90: 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65  isions of intere
7aa0: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  st..    AND    R
7ab0: 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20 20 20  .isdefault      
7ac0: 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69         -- Restri
7ad0: 63 74 20 74 6f 20 4e 54 44 42 0a 09 20 20 20 20  ct to NTDB..    
7ae0: 41 4e 44 20 20 20 20 52 2e 64 62 63 68 69 6c 64  AND    R.dbchild
7af0: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d   IS NOT NULL   -
7b00: 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 42 20  - and last NTDB 
7b10: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72 75  belonging to tru
7b20: 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  nk..    AND    R
7b30: 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69 6c  A.rid = R.dbchil
7b40: 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 72  d      -- Go dir
7b50: 65 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 72  ectly to trunk r
7b60: 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  oot..    AND    
7b70: 52 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20  RA.child IS NOT 
7b80: 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70  NULL    -- Has p
7b90: 72 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 09 20  rimary child... 
7ba0: 20 20 20 41 4e 44 20 20 20 20 52 41 2e 63 68 69     AND    RA.chi
7bb0: 6c 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20  ld IN $theset   
7bc0: 20 20 2d 2d 20 4c 6f 6f 70 0a 09 7d 5d 5d 0a 20    -- Loop..}]]. 
7bd0: 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28     }..    # var(
7be0: 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d  dv) = dict (item
7bf0: 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29   -> list (item))
7c00: 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28  , item  = list (
7c10: 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 70  type id).    typ
7c20: 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f  emethod successo
7c30: 72 73 20 7b 64 76 20 72 65 76 69 73 69 6f 6e 73  rs {dv revisions
7c40: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76  } {..upvar 1 $dv
7c50: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 73   dependencies..s
7c60: 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69  et theset ('[joi
7c70: 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c  n $revisions {',
7c80: 27 7d 5d 27 29 0a 0a 09 23 20 54 68 65 20 66 6f  '}]')...# The fo
7c90: 6c 6c 6f 77 69 6e 67 20 63 61 73 65 73 20 73 70  llowing cases sp
7ca0: 65 63 69 66 79 20 77 68 65 6e 20 61 20 72 65 76  ecify when a rev
7cb0: 69 73 69 6f 6e 20 53 20 69 73 20 61 20 73 75 63  ision S is a suc
7cc0: 63 65 73 73 6f 72 0a 09 23 20 6f 66 20 61 20 72  cessor..# of a r
7cd0: 65 76 69 73 69 6f 6e 20 52 2e 20 45 61 63 68 20  evision R. Each 
7ce0: 6f 66 20 74 68 65 20 63 61 73 65 73 20 74 72 61  of the cases tra
7cf0: 6e 73 6c 61 74 65 73 20 69 6e 74 6f 20 6f 6e 65  nslates into one
7d00: 20 6f 66 0a 09 23 20 74 68 65 20 62 72 61 6e 63   of..# the branc
7d10: 68 65 73 20 6f 66 20 74 68 65 20 53 51 4c 20 55  hes of the SQL U
7d20: 4e 49 4f 4e 20 63 6f 6d 69 6e 67 20 62 65 6c 6f  NION coming belo
7d30: 77 2e 0a 09 23 0a 09 23 20 28 31 29 20 53 20 63  w...#..# (1) S c
7d40: 61 6e 20 62 65 20 61 20 70 72 69 6d 61 72 79 20  an be a primary 
7d50: 63 68 69 6c 64 20 6f 66 20 52 2c 20 69 2e 65 2e  child of R, i.e.
7d60: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 4c 4f 44   in the same LOD
7d70: 2e 20 52 0a 09 23 20 20 20 20 20 72 65 66 65 72  . R..#     refer
7d80: 65 6e 63 65 73 20 53 20 64 69 72 65 63 74 6c 79  ences S directly
7d90: 2e 20 52 2e 63 68 69 6c 64 20 3d 20 53 28 2e 72  . R.child = S(.r
7da0: 69 64 29 2c 20 69 66 20 69 74 20 65 78 69 73 74  id), if it exist
7db0: 73 2e 0a 09 23 0a 09 23 20 28 32 29 20 53 20 63  s...#..# (2) S c
7dc0: 61 6e 20 62 65 20 61 20 73 65 63 6f 6e 64 61 72  an be a secondar
7dd0: 79 2c 20 69 2e 65 2e 20 62 72 61 6e 63 68 2c 20  y, i.e. branch, 
7de0: 63 68 69 6c 64 20 6f 66 20 52 2e 20 48 65 72 65  child of R. Here
7df0: 20 74 68 65 0a 09 23 20 20 20 20 20 6c 69 6e 6b   the..#     link
7e00: 20 69 73 20 6d 61 64 65 20 74 68 72 6f 75 67 68   is made through
7e10: 20 74 68 65 20 68 65 6c 70 65 72 20 74 61 62 6c   the helper tabl
7e20: 65 0a 09 23 20 20 20 20 20 52 45 56 49 53 49 4f  e..#     REVISIO
7e30: 4e 42 52 41 4e 43 48 43 48 49 4c 44 52 45 4e 2e  NBRANCHCHILDREN.
7e40: 20 52 2e 72 69 64 20 2d 3e 20 52 42 43 2e 72 69   R.rid -> RBC.ri
7e50: 64 2c 20 52 42 43 2e 62 72 69 64 20 3d 0a 09 23  d, RBC.brid =..#
7e60: 20 20 20 20 20 53 28 2e 72 69 64 29 0a 09 23 0a       S(.rid)..#.
7e70: 09 23 20 28 33 29 20 4f 72 69 67 69 6e 61 6c 6c  .# (3) Originall
7e80: 79 20 74 68 69 73 20 75 73 65 20 63 61 73 65 20  y this use case 
7e90: 64 65 66 69 6e 65 64 20 74 68 65 20 72 6f 6f 74  defined the root
7ea0: 20 6f 66 20 61 20 64 65 74 61 63 68 65 64 0a 09   of a detached..
7eb0: 23 20 20 20 20 20 4e 54 44 42 20 61 73 20 74 68  #     NTDB as th
7ec0: 65 20 73 75 63 63 65 73 73 6f 72 20 6f 66 20 74  e successor of t
7ed0: 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74 2e 20 54  he trunk root. T
7ee0: 68 69 73 20 6c 65 61 64 73 20 74 6f 20 61 0a 09  his leads to a..
7ef0: 23 20 20 20 20 20 62 61 64 20 74 61 6e 67 6c 65  #     bad tangle
7f00: 20 6c 61 74 65 72 20 6f 6e 2e 20 57 69 74 68 20   later on. With 
7f10: 61 20 64 65 74 61 63 68 65 64 20 4e 54 44 42 20  a detached NTDB 
7f20: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 09 23 20  the original..# 
7f30: 20 20 20 20 74 72 75 6e 6b 20 72 6f 6f 74 20 72      trunk root r
7f40: 65 76 69 73 69 6f 6e 20 77 61 73 20 72 65 6d 6f  evision was remo
7f50: 76 65 64 20 61 73 20 69 72 72 65 6c 65 76 61 6e  ved as irrelevan
7f60: 74 2c 20 61 6c 6c 6f 77 69 6e 67 0a 09 23 20 20  t, allowing..#  
7f70: 20 20 20 74 68 65 20 6e 6f 6d 69 6e 61 6c 20 72     the nominal r
7f80: 6f 6f 74 20 74 6f 20 62 65 20 6c 61 74 65 72 20  oot to be later 
7f90: 69 6e 20 74 69 6d 65 20 74 68 61 6e 20 74 68 65  in time than the
7fa0: 20 4e 54 44 42 0a 09 23 20 20 20 20 20 72 6f 6f   NTDB..#     roo
7fb0: 74 2e 20 4e 6f 77 20 73 65 74 74 69 6e 67 20 74  t. Now setting t
7fc0: 68 69 73 20 64 65 70 65 6e 64 65 6e 63 79 20 77  his dependency w
7fd0: 69 6c 6c 20 62 65 20 62 61 63 6b 77 61 72 64 20  ill be backward 
7fe0: 69 6e 0a 09 23 20 20 20 20 20 74 69 6d 65 2e 20  in..#     time. 
7ff0: 52 45 4d 4f 56 45 44 2e 0a 09 23 0a 09 23 20 28  REMOVED...#..# (
8000: 34 29 20 49 66 20 52 20 69 73 20 74 68 65 20 6c  4) If R is the l
8010: 61 73 74 20 6f 66 20 74 68 65 20 4e 54 44 42 20  ast of the NTDB 
8020: 72 65 76 69 73 69 6f 6e 73 20 77 68 69 63 68 20  revisions which 
8030: 62 65 6c 6f 6e 67 20 74 6f 0a 09 23 20 20 20 20  belong to..#    
8040: 20 74 68 65 20 74 72 75 6e 6b 2c 20 74 68 65 6e   the trunk, then
8050: 20 74 68 65 20 70 72 69 6d 61 72 79 20 63 68 69   the primary chi
8060: 6c 64 20 6f 66 20 74 68 65 20 74 72 75 6e 6b 20  ld of the trunk 
8070: 72 6f 6f 74 20 28 74 68 65 0a 09 23 20 20 20 20  root (the..#    
8080: 20 27 31 2e 32 27 20 72 65 76 69 73 69 6f 6e 29   '1.2' revision)
8090: 20 69 73 20 61 20 73 75 63 63 65 73 73 6f 72 2c   is a successor,
80a0: 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a 0a   if it exists...
80b0: 09 23 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .# Note that the
80c0: 20 62 72 61 6e 63 68 65 73 20 73 70 61 77 6e 65   branches spawne
80d0: 64 20 66 72 6f 6d 20 74 68 65 20 72 65 76 69 73  d from the revis
80e0: 69 6f 6e 73 2c 20 61 6e 64 20 74 68 65 0a 09 23  ions, and the..#
80f0: 20 74 61 67 73 20 61 73 73 6f 63 69 61 74 65 64   tags associated
8100: 20 77 69 74 68 20 74 68 65 6d 20 61 72 65 20 73   with them are s
8110: 75 63 63 65 73 73 6f 72 73 20 61 73 20 77 65 6c  uccessors as wel
8120: 6c 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69  l....foreach {ri
8130: 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20  d child} [state 
8140: 72 75 6e 20 22 0a 20 20 20 2d 2d 20 28 31 29 20  run ".   -- (1) 
8150: 50 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 09 20  Primary child.. 
8160: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c     SELECT R.rid,
8170: 20 52 2e 63 68 69 6c 64 0a 09 20 20 20 20 46 52   R.child..    FR
8180: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 0a  OM   revision R.
8190: 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69  .    WHERE  R.ri
81a0: 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20  d   IN $theset  
81b0: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74     -- Restrict t
81c0: 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69  o revisions of i
81d0: 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44  nterest..    AND
81e0: 20 20 20 20 52 2e 63 68 69 6c 64 20 49 53 20 4e      R.child IS N
81f0: 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61  OT NULL    -- Ha
8200: 73 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 0a  s primary child.
8210: 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d      UNION.    --
8220: 20 28 32 29 20 53 65 63 6f 6e 64 61 72 79 20 28   (2) Secondary (
8230: 62 72 61 6e 63 68 29 20 63 68 69 6c 64 72 65 6e  branch) children
8240: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
8250: 69 64 2c 20 42 2e 62 72 69 64 0a 09 20 20 20 20  id, B.brid..    
8260: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20  FROM   revision 
8270: 52 2c 20 72 65 76 69 73 69 6f 6e 62 72 61 6e 63  R, revisionbranc
8280: 68 63 68 69 6c 64 72 65 6e 20 42 0a 09 20 20 20  hchildren B..   
8290: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20   WHERE  R.rid   
82a0: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d  IN $theset     -
82b0: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65  - Restrict to re
82c0: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72  visions of inter
82d0: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  est..    AND    
82e0: 52 2e 72 69 64 20 3d 20 42 2e 72 69 64 20 20 20  R.rid = B.rid   
82f0: 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74         -- Select
8300: 20 73 75 62 73 65 74 20 6f 66 20 62 72 61 6e 63   subset of branc
8310: 68 20 63 68 69 6c 64 72 65 6e 0a 20 20 20 20 55  h children.    U
8320: 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 34 29 20  NION.    -- (4) 
8330: 43 68 69 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72  Child of trunk r
8340: 6f 6f 74 20 73 75 63 63 65 73 73 6f 72 20 6f 66  oot successor of
8350: 20 6c 61 73 74 20 4e 54 44 42 20 6f 6e 20 74 72   last NTDB on tr
8360: 75 6e 6b 2e 0a 09 20 20 20 20 53 45 4c 45 43 54  unk...    SELECT
8370: 20 52 2e 72 69 64 2c 20 52 41 2e 63 68 69 6c 64   R.rid, RA.child
8380: 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73  ..    FROM revis
8390: 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 20  ion R, revision 
83a0: 52 41 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e  RA..    WHERE R.
83b0: 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74  rid   IN $theset
83c0: 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63        -- Restric
83d0: 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f  t to revisions o
83e0: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20  f interest..    
83f0: 41 4e 44 20 20 20 52 2e 69 73 64 65 66 61 75 6c  AND   R.isdefaul
8400: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d  t             --
8410: 20 52 65 73 74 72 69 63 74 20 74 6f 20 4e 54 44   Restrict to NTD
8420: 42 0a 09 20 20 20 20 41 4e 44 20 20 20 52 2e 64  B..    AND   R.d
8430: 62 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55  bchild IS NOT NU
8440: 4c 4c 20 20 20 2d 2d 20 61 6e 64 20 6c 61 73 74  LL   -- and last
8450: 20 4e 54 44 42 20 62 65 6c 6f 6e 67 69 6e 67 20   NTDB belonging 
8460: 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20 41 4e  to trunk..    AN
8470: 44 20 20 20 52 41 2e 72 69 64 20 3d 20 52 2e 64  D   RA.rid = R.d
8480: 62 63 68 69 6c 64 20 20 20 20 20 20 2d 2d 20 47  bchild      -- G
8490: 6f 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 72  o directly to tr
84a0: 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 20 41 4e  unk root..    AN
84b0: 44 20 20 20 52 41 2e 63 68 69 6c 64 20 49 53 20  D   RA.child IS 
84c0: 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48  NOT NULL    -- H
84d0: 61 73 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64  as primary child
84e0: 2e 0a 09 22 5d 20 7b 0a 09 20 20 20 20 23 20 43  ..."] {..    # C
84f0: 6f 6e 73 69 64 65 72 20 6d 6f 76 69 6e 67 20 74  onsider moving t
8500: 68 69 73 20 74 6f 20 74 68 65 20 69 6e 74 65 67  his to the integ
8510: 72 69 74 79 20 6d 6f 64 75 6c 65 2e 0a 09 20 20  rity module...  
8520: 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 65    integrity asse
8530: 72 74 20 7b 24 72 69 64 20 21 3d 20 24 63 68 69  rt {$rid != $chi
8540: 6c 64 7d 20 7b 52 65 76 69 73 69 6f 6e 20 24 72  ld} {Revision $r
8550: 69 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 74  id depends on it
8560: 73 65 6c 66 2e 7d 0a 09 20 20 20 20 6c 61 70 70  self.}..    lapp
8570: 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73  end dependencies
8580: 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64 5d  ([list rev $rid]
8590: 29 20 5b 6c 69 73 74 20 72 65 76 20 24 63 68 69  ) [list rev $chi
85a0: 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20  ld]..}..foreach 
85b0: 7b 72 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61  {rid child} [sta
85c0: 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45  te run "..    SE
85d0: 4c 45 43 54 20 52 2e 72 69 64 2c 20 54 2e 74 69  LECT R.rid, T.ti
85e0: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65  d..    FROM   re
85f0: 76 69 73 69 6f 6e 20 52 2c 20 74 61 67 20 54 0a  vision R, tag T.
8600: 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69  .    WHERE  R.ri
8610: 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20  d IN $theset..  
8620: 20 20 41 4e 44 20 20 20 20 54 2e 72 65 76 20 3d    AND    T.rev =
8630: 20 52 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20   R.rid.."] {..  
8640: 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64    lappend depend
8650: 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 65 76  encies([list rev
8660: 20 24 72 69 64 5d 29 20 5b 6c 69 73 74 20 73 79   $rid]) [list sy
8670: 6d 3a 3a 74 61 67 20 24 63 68 69 6c 64 5d 0a 09  m::tag $child]..
8680: 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20  }..foreach {rid 
8690: 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75  child} [state ru
86a0: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20  n "..    SELECT 
86b0: 52 2e 72 69 64 2c 20 42 2e 62 69 64 0a 09 20 20  R.rid, B.bid..  
86c0: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f    FROM   revisio
86d0: 6e 20 52 2c 20 62 72 61 6e 63 68 20 42 0a 09 20  n R, branch B.. 
86e0: 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20     WHERE  R.rid 
86f0: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20  IN $theset..    
8700: 41 4e 44 20 20 20 20 42 2e 72 6f 6f 74 20 3d 20  AND    B.root = 
8710: 52 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20  R.rid.."] {..   
8720: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65   lappend depende
8730: 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 65 76 20  ncies([list rev 
8740: 24 72 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d  $rid]) [list sym
8750: 3a 3a 62 72 61 6e 63 68 20 24 63 68 69 6c 64 5d  ::branch $child]
8760: 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  ..}..return.    
8770: 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76 29  }..    # var(dv)
8780: 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d 3e   = dict (item ->
8790: 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c 20 69   list (item)), i
87a0: 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 79 70  tem  = list (typ
87b0: 65 20 69 64 29 0a 20 20 20 20 74 79 70 65 6d 65  e id).    typeme
87c0: 74 68 6f 64 20 70 72 65 64 65 63 65 73 73 6f 72  thod predecessor
87d0: 73 20 7b 64 76 20 72 65 76 69 73 69 6f 6e 73 7d  s {dv revisions}
87e0: 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76 20   {..upvar 1 $dv 
87f0: 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 73 65  dependencies..se
8800: 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e  t theset ('[join
8810: 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27   $revisions {','
8820: 7d 5d 27 29 0a 0a 09 23 20 54 68 65 20 66 6f 6c  }]')...# The fol
8830: 6c 6f 77 69 6e 67 20 63 61 73 65 73 20 73 70 65  lowing cases spe
8840: 63 69 66 79 20 77 68 65 6e 20 61 20 72 65 76 69  cify when a revi
8850: 73 69 6f 6e 20 50 20 69 73 20 61 0a 09 23 20 70  sion P is a..# p
8860: 72 65 64 65 63 65 73 73 6f 72 20 6f 66 20 61 20  redecessor of a 
8870: 72 65 76 69 73 69 6f 6e 20 52 2e 20 45 61 63 68  revision R. Each
8880: 20 6f 66 20 74 68 65 20 63 61 73 65 73 20 74 72   of the cases tr
8890: 61 6e 73 6c 61 74 65 73 0a 09 23 20 69 6e 74 6f  anslates..# into
88a0: 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 72 61 6e   one of the bran
88b0: 63 68 65 73 20 6f 66 20 74 68 65 20 53 51 4c 20  ches of the SQL 
88c0: 55 4e 49 4f 4e 20 63 6f 6d 69 6e 67 20 62 65 6c  UNION coming bel
88d0: 6f 77 2e 0a 09 23 0a 09 23 20 28 31 29 20 54 68  ow...#..# (1) Th
88e0: 65 20 69 6d 6d 65 64 69 61 74 65 20 70 61 72 65  e immediate pare
88f0: 6e 74 20 52 2e 70 61 72 65 6e 74 20 6f 66 20 52  nt R.parent of R
8900: 20 69 73 20 61 20 70 72 65 64 65 63 65 73 73 6f   is a predecesso
8910: 72 20 6f 66 0a 09 23 20 20 20 20 20 52 2e 20 4e  r of..#     R. N
8920: 4f 54 45 3a 20 54 68 69 73 20 69 73 20 74 72 75  OTE: This is tru
8930: 65 20 66 6f 72 20 52 20 65 69 74 68 65 72 20 70  e for R either p
8940: 72 69 6d 61 72 79 20 6f 72 20 73 65 63 6f 6e 64  rimary or second
8950: 61 72 79 0a 09 23 20 20 20 20 20 63 68 69 6c 64  ary..#     child
8960: 20 6f 66 20 50 2e 20 49 74 20 6e 6f 74 20 6e 65   of P. It not ne
8970: 63 65 73 73 61 72 79 20 74 6f 20 64 69 73 74 69  cessary to disti
8980: 6e 67 75 69 73 68 20 74 68 65 20 74 77 6f 0a 09  nguish the two..
8990: 23 20 20 20 20 20 63 61 73 65 73 2c 20 69 6e 20  #     cases, in 
89a0: 63 6f 6e 74 72 61 73 74 20 74 6f 20 74 68 65 20  contrast to the 
89b0: 63 6f 64 65 20 72 65 74 72 69 65 76 69 6e 67 20  code retrieving 
89c0: 74 68 65 20 73 75 63 63 65 73 73 6f 72 0a 09 23  the successor..#
89d0: 20 20 20 20 20 69 6e 66 6f 72 6d 61 74 69 6f 6e       information
89e0: 2e 0a 09 23 0a 09 23 20 28 32 29 20 54 68 65 20  ...#..# (2) The 
89f0: 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 73 75  complement of su
8a00: 63 63 65 73 73 6f 72 20 63 61 73 65 20 28 33 29  ccessor case (3)
8a10: 2e 20 54 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74  . The trunk root
8a20: 20 69 73 0a 09 23 20 20 20 20 20 61 20 70 72 65   is..#     a pre
8a30: 64 65 63 65 73 73 6f 72 20 6f 66 20 61 20 4e 54  decessor of a NT
8a40: 44 42 20 72 6f 6f 74 2e 20 52 45 4d 4f 56 45 44  DB root. REMOVED
8a50: 2e 20 53 65 65 20 27 73 75 63 63 65 73 73 6f 72  . See 'successor
8a60: 73 27 0a 09 23 20 20 20 20 20 66 6f 72 20 74 68  s'..#     for th
8a70: 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 2e 0a 09  e explanation...
8a80: 23 0a 09 23 20 28 33 29 20 54 68 65 20 63 6f 6d  #..# (3) The com
8a90: 70 6c 65 6d 65 6e 74 20 6f 66 20 73 75 63 63 65  plement of succe
8aa0: 73 73 6f 72 20 63 61 73 65 20 28 34 29 2e 20 54  ssor case (4). T
8ab0: 68 65 20 6c 61 73 74 20 4e 54 44 42 0a 09 23 20  he last NTDB..# 
8ac0: 20 20 20 20 72 65 76 69 73 69 6f 6e 20 62 65 6c      revision bel
8ad0: 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20 74 72  onging to the tr
8ae0: 75 6e 6b 20 69 73 20 61 20 70 72 65 64 65 63 65  unk is a predece
8af0: 73 73 6f 72 20 6f 66 20 74 68 65 0a 09 23 20 20  ssor of the..#  
8b00: 20 20 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64     primary child
8b10: 20 6f 66 20 74 68 65 20 74 72 75 6e 6b 20 72 6f   of the trunk ro
8b20: 6f 74 20 28 54 68 65 20 27 31 2e 32 27 20 72 65  ot (The '1.2' re
8b30: 76 69 73 69 6f 6e 29 2e 0a 0a 09 66 6f 72 65 61  vision)....forea
8b40: 63 68 20 7b 72 69 64 20 70 61 72 65 6e 74 7d 20  ch {rid parent} 
8b50: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 20 20 20  [state run ".   
8b60: 2d 2d 20 28 31 29 20 50 72 69 6d 61 72 79 20 70  -- (1) Primary p
8b70: 61 72 65 6e 74 2c 20 63 61 6e 20 62 65 20 69 6e  arent, can be in
8b80: 20 64 69 66 66 65 72 65 6e 74 20 4c 4f 44 20 66   different LOD f
8b90: 6f 72 20 66 69 72 73 74 20 69 6e 20 61 20 62 72  or first in a br
8ba0: 61 6e 63 68 0a 09 20 20 20 20 53 45 4c 45 43 54  anch..    SELECT
8bb0: 20 52 2e 72 69 64 2c 20 52 2e 70 61 72 65 6e 74   R.rid, R.parent
8bc0: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76  ..    FROM   rev
8bd0: 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45  ision R..    WHE
8be0: 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24  RE  R.rid   IN $
8bf0: 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65  theset     -- Re
8c00: 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69  strict to revisi
8c10: 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  ons of interest.
8c20: 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 70 61  .    AND    R.pa
8c30: 72 65 6e 74 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  rent IS NOT NULL
8c40: 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d 61 72     -- Has primar
8c50: 79 20 70 61 72 65 6e 74 0a 20 20 20 20 55 4e 49  y parent.    UNI
8c60: 4f 4e 0a 20 20 20 20 2d 2d 20 28 33 29 20 4c 61  ON.    -- (3) La
8c70: 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b  st NTDB on trunk
8c80: 20 69 73 20 70 72 65 64 65 63 65 73 73 6f 72 20   is predecessor 
8c90: 6f 66 20 63 68 69 6c 64 20 6f 66 20 74 72 75 6e  of child of trun
8ca0: 6b 20 72 6f 6f 74 0a 09 20 20 20 20 53 45 4c 45  k root..    SELE
8cb0: 43 54 20 52 2e 72 69 64 2c 20 52 41 2e 64 62 70  CT R.rid, RA.dbp
8cc0: 61 72 65 6e 74 0a 09 20 20 20 20 46 52 4f 4d 20  arent..    FROM 
8cd0: 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65    revision R, re
8ce0: 76 69 73 69 6f 6e 20 52 41 0a 09 20 20 20 20 57  vision RA..    W
8cf0: 48 45 52 45 20 20 52 2e 72 69 64 20 49 4e 20 24  HERE  R.rid IN $
8d00: 74 68 65 73 65 74 20 20 20 20 20 20 20 20 20 2d  theset         -
8d10: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65  - Restrict to re
8d20: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72  visions of inter
8d30: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  est..    AND    
8d40: 4e 4f 54 20 52 2e 69 73 64 65 66 61 75 6c 74 20  NOT R.isdefault 
8d50: 20 20 20 20 20 20 20 20 20 2d 2d 20 6e 6f 74 20           -- not 
8d60: 6f 6e 20 4e 54 44 42 0a 09 20 20 20 20 41 4e 44  on NTDB..    AND
8d70: 20 20 20 20 52 2e 70 61 72 65 6e 74 20 49 53 20      R.parent IS 
8d80: 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 20 2d 2d 20  NOT NULL     -- 
8d90: 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20 72 6f  which are not ro
8da0: 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  ot..    AND    R
8db0: 41 2e 72 69 64 20 3d 20 52 2e 70 61 72 65 6e 74  A.rid = R.parent
8dc0: 20 20 20 20 20 20 20 20 2d 2d 20 67 6f 20 74 6f          -- go to
8dd0: 20 74 68 65 69 72 20 70 61 72 65 6e 74 0a 09 20   their parent.. 
8de0: 20 20 20 41 4e 44 20 20 20 20 52 41 2e 64 62 70     AND    RA.dbp
8df0: 61 72 65 6e 74 20 49 53 20 4e 4f 54 20 4e 55 4c  arent IS NOT NUL
8e00: 4c 20 20 2d 2d 20 77 68 69 63 68 20 68 61 73 20  L  -- which has 
8e10: 74 6f 20 72 65 66 65 72 20 74 6f 20 4e 54 44 42  to refer to NTDB
8e20: 27 73 20 72 6f 6f 74 0a 09 22 5d 20 7b 0a 09 20  's root.."] {.. 
8e30: 20 20 20 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f     # Consider mo
8e40: 76 69 6e 67 20 74 68 69 73 20 74 6f 20 74 68 65  ving this to the
8e50: 20 69 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 6c   integrity modul
8e60: 65 2e 0a 09 20 20 20 20 69 6e 74 65 67 72 69 74  e...    integrit
8e70: 79 20 61 73 73 65 72 74 20 7b 24 72 69 64 20 21  y assert {$rid !
8e80: 3d 20 24 70 61 72 65 6e 74 7d 20 7b 52 65 76 69  = $parent} {Revi
8e90: 73 69 6f 6e 20 24 72 69 64 20 64 65 70 65 6e 64  sion $rid depend
8ea0: 73 20 6f 6e 20 69 74 73 65 6c 66 2e 7d 0a 09 20  s on itself.}.. 
8eb0: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e     lappend depen
8ec0: 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 65  dencies([list re
8ed0: 76 20 24 72 69 64 5d 29 20 5b 6c 69 73 74 20 72  v $rid]) [list r
8ee0: 65 76 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 0a  ev $parent]..}..
8ef0: 09 23 20 54 68 65 20 72 65 76 69 73 69 6f 6e 73  .# The revisions
8f00: 20 77 68 69 63 68 20 61 72 65 20 74 68 65 20 66   which are the f
8f10: 69 72 73 74 20 6f 6e 20 61 20 62 72 61 6e 63 68  irst on a branch
8f20: 20 68 61 76 65 20 74 68 61 74 0a 09 23 20 62 72   have that..# br
8f30: 61 6e 63 68 20 61 73 20 74 68 65 69 72 20 70 72  anch as their pr
8f40: 65 64 65 63 65 73 73 6f 72 2e 20 4e 6f 74 65 20  edecessor. Note 
8f50: 74 68 61 74 20 72 65 76 69 73 69 6f 6e 73 20 63  that revisions c
8f60: 61 6e 6e 6f 74 20 62 65 0a 09 23 20 6f 6e 20 74  annot be..# on t
8f70: 61 67 73 20 69 6e 20 74 68 65 20 73 61 6d 65 20  ags in the same 
8f80: 6d 61 6e 6e 65 72 2c 20 73 6f 20 74 61 67 73 20  manner, so tags 
8f90: 63 61 6e 6e 6f 74 20 62 65 20 70 72 65 64 65 63  cannot be predec
8fa0: 65 73 73 6f 72 73 0a 09 23 20 6f 66 20 72 65 76  essors..# of rev
8fb0: 69 73 69 6f 6e 73 2e 20 54 68 69 73 20 63 6f 6d  isions. This com
8fc0: 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20 74 68  plements that th
8fd0: 65 79 20 68 61 76 65 20 6e 6f 20 73 75 63 63 65  ey have no succe
8fe0: 73 73 6f 72 73 0a 09 23 20 28 53 65 65 20 73 79  ssors..# (See sy
8ff0: 6d 3a 3a 74 61 67 2f 73 75 63 63 65 73 73 6f 72  m::tag/successor
9000: 73 29 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72  s)....foreach {r
9010: 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74  id parent} [stat
9020: 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c  e run "..    SEL
9030: 45 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 69 64  ECT R.rid, B.bid
9040: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76  ..    FROM   rev
9050: 69 73 69 6f 6e 20 52 2c 20 62 72 61 6e 63 68 20  ision R, branch 
9060: 42 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e  B..    WHERE  R.
9070: 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09  rid IN $theset..
9080: 20 20 20 20 41 4e 44 20 20 20 20 42 2e 66 69 72      AND    B.fir
9090: 73 74 20 3d 20 52 2e 72 69 64 0a 09 22 5d 20 7b  st = R.rid.."] {
90a0: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65  ..    lappend de
90b0: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74  pendencies([list
90c0: 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c 69 73   rev $rid]) [lis
90d0: 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 70  t sym::branch $p
90e0: 61 72 65 6e 74 5d 0a 09 7d 0a 09 72 65 74 75 72  arent]..}..retur
90f0: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72  n.    }..    # r
9100: 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 63 68  esult = list (ch
9110: 61 6e 67 65 73 65 74 2d 69 64 29 0a 20 20 20 20  angeset-id).    
9120: 74 79 70 65 6d 65 74 68 6f 64 20 63 73 5f 73 75  typemethod cs_su
9130: 63 63 65 73 73 6f 72 73 20 7b 72 65 76 69 73 69  ccessors {revisi
9140: 6f 6e 73 7d 20 7b 0a 20 20 20 20 20 20 20 20 23  ons} {.        #
9150: 20 54 68 69 73 20 69 73 20 61 20 76 61 72 69 61   This is a varia
9160: 6e 74 20 6f 66 20 27 73 75 63 63 65 73 73 6f 72  nt of 'successor
9170: 73 27 20 77 68 69 63 68 20 6d 61 70 73 20 74 68  s' which maps th
9180: 65 20 6c 6f 77 2d 6c 65 76 65 6c 0a 20 20 20 20  e low-level.    
9190: 20 20 20 20 23 20 64 61 74 61 20 64 69 72 65 63      # data direc
91a0: 74 6c 79 20 74 6f 20 74 68 65 20 61 73 73 6f 63  tly to the assoc
91b0: 69 61 74 65 64 20 63 68 61 6e 67 65 73 65 74 73  iated changesets
91c0: 2e 20 49 2e 65 2e 20 69 6e 73 74 65 61 64 0a 20  . I.e. instead. 
91d0: 20 20 20 20 20 20 20 23 20 6d 69 6c 6c 69 6f 6e         # million
91e0: 73 20 6f 66 20 64 65 70 65 6e 64 65 6e 63 79 20  s of dependency 
91f0: 70 61 69 72 73 20 28 69 6e 20 65 78 74 72 65 6d  pairs (in extrem
9200: 65 20 63 61 73 65 73 20 28 45 78 61 6d 70 6c 65  e cases (Example
9210: 3a 20 54 63 6c 0a 20 20 20 20 20 20 20 20 23 20  : Tcl.        # 
9220: 43 56 53 29 29 20 77 65 20 72 65 74 75 72 6e 20  CVS)) we return 
9230: 61 20 76 65 72 79 20 73 68 6f 72 74 20 61 6e 64  a very short and
9240: 20 6d 75 63 68 20 6d 6f 72 65 20 6d 61 6e 61 67   much more manag
9250: 65 61 62 6c 65 20 6c 69 73 74 0a 20 20 20 20 20  eable list.     
9260: 20 20 20 23 20 6f 66 20 63 68 61 6e 67 65 73 65     # of changese
9270: 74 73 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74  ts....set theset
9280: 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69   ('[join $revisi
9290: 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65  ons {','}]')..re
92a0: 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20  turn [state run 
92b0: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 43 2e  "..    SELECT C.
92c0: 63 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  cid..    FROM   
92d0: 72 65 76 69 73 69 6f 6e 20 52 2c 20 63 73 69 74  revision R, csit
92e0: 65 6d 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74  em CI, changeset
92f0: 20 43 0a 09 20 20 20 20 57 48 45 52 45 20 20 52   C..    WHERE  R
9300: 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65  .rid   IN $these
9310: 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63  t     -- Restric
9320: 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f  t to revisions o
9330: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20  f interest..    
9340: 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49  AND    R.child I
9350: 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d  S NOT NULL    --
9360: 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 68 69   Has primary chi
9370: 6c 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 41  ld.            A
9380: 4e 44 20 20 20 20 43 49 2e 69 69 64 20 3d 20 52  ND    CI.iid = R
9390: 2e 63 68 69 6c 64 0a 20 20 20 20 20 20 20 20 20  .child.         
93a0: 20 20 20 41 4e 44 20 20 20 20 43 2e 63 69 64 20     AND    C.cid 
93b0: 3d 20 43 49 2e 63 69 64 0a 20 20 20 20 20 20 20  = CI.cid.       
93c0: 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e 74 79       AND    C.ty
93d0: 70 65 20 3d 20 30 0a 20 20 20 20 55 4e 49 4f 4e  pe = 0.    UNION
93e0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 43 2e 63  ..    SELECT C.c
93f0: 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72  id..    FROM   r
9400: 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73  evision R, revis
9410: 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64 72 65  ionbranchchildre
9420: 6e 20 42 2c 20 63 73 69 74 65 6d 20 43 49 2c 20  n B, csitem CI, 
9430: 63 68 61 6e 67 65 73 65 74 20 43 0a 09 20 20 20  changeset C..   
9440: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20   WHERE  R.rid   
9450: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d  IN $theset     -
9460: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65  - Restrict to re
9470: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72  visions of inter
9480: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  est..    AND    
9490: 52 2e 72 69 64 20 3d 20 42 2e 72 69 64 20 20 20  R.rid = B.rid   
94a0: 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74         -- Select
94b0: 20 73 75 62 73 65 74 20 6f 66 20 62 72 61 6e 63   subset of branc
94c0: 68 20 63 68 69 6c 64 72 65 6e 0a 20 20 20 20 20  h children.     
94d0: 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 49         AND    CI
94e0: 2e 69 69 64 20 3d 20 42 2e 62 72 69 64 0a 20 20  .iid = B.brid.  
94f0: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20            AND   
9500: 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69 64 0a   C.cid = CI.cid.
9510: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
9520: 20 20 20 43 2e 74 79 70 65 20 3d 20 30 0a 20 20     C.type = 0.  
9530: 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 53 45 4c    UNION..    SEL
9540: 45 43 54 20 43 2e 63 69 64 0a 09 20 20 20 20 46  ECT C.cid..    F
9550: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52  ROM   revision R
9560: 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 2c 20 63  , revision RA, c
9570: 73 69 74 65 6d 20 43 49 2c 20 63 68 61 6e 67 65  sitem CI, change
9580: 73 65 74 20 43 0a 09 20 20 20 20 57 48 45 52 45  set C..    WHERE
9590: 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68    R.rid   IN $th
95a0: 65 73 65 74 20 20 20 20 20 20 2d 2d 20 52 65 73  eset      -- Res
95b0: 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f  trict to revisio
95c0: 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09  ns of interest..
95d0: 20 20 20 20 41 4e 44 20 20 20 20 52 2e 69 73 64      AND    R.isd
95e0: 65 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20  efault          
95f0: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74     -- Restrict t
9600: 6f 20 4e 54 44 42 0a 09 20 20 20 20 41 4e 44 20  o NTDB..    AND 
9610: 20 20 20 52 2e 64 62 63 68 69 6c 64 20 49 53 20     R.dbchild IS 
9620: 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d 20 61 6e  NOT NULL   -- an
9630: 64 20 6c 61 73 74 20 4e 54 44 42 20 62 65 6c 6f  d last NTDB belo
9640: 6e 67 69 6e 67 20 74 6f 20 74 72 75 6e 6b 0a 09  nging to trunk..
9650: 20 20 20 20 41 4e 44 20 20 20 20 52 41 2e 72 69      AND    RA.ri
9660: 64 20 3d 20 52 2e 64 62 63 68 69 6c 64 20 20 20  d = R.dbchild   
9670: 20 20 20 2d 2d 20 47 6f 20 64 69 72 65 63 74 6c     -- Go directl
9680: 79 20 74 6f 20 74 72 75 6e 6b 20 72 6f 6f 74 0a  y to trunk root.
9690: 09 20 20 20 20 41 4e 44 20 20 20 20 52 41 2e 63  .    AND    RA.c
96a0: 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  hild IS NOT NULL
96b0: 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d 61      -- Has prima
96c0: 72 79 20 63 68 69 6c 64 2e 0a 20 20 20 20 20 20  ry child..      
96d0: 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 49 2e        AND    CI.
96e0: 69 69 64 20 3d 20 52 41 2e 63 68 69 6c 64 0a 20  iid = RA.child. 
96f0: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20             AND  
9700: 20 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69 64    C.cid = CI.cid
9710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44  .            AND
9720: 20 20 20 20 43 2e 74 79 70 65 20 3d 20 30 0a 20      C.type = 0. 
9730: 20 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 53 45     UNION..    SE
9740: 4c 45 43 54 20 43 2e 63 69 64 0a 09 20 20 20 20  LECT C.cid..    
9750: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20  FROM   revision 
9760: 52 2c 20 74 61 67 20 54 2c 20 63 73 69 74 65 6d  R, tag T, csitem
9770: 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43   CI, changeset C
9780: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72  ..    WHERE  R.r
9790: 69 64 20 69 6e 20 24 74 68 65 73 65 74 0a 09 20  id in $theset.. 
97a0: 20 20 20 41 4e 44 20 20 20 20 54 2e 72 65 76 20     AND    T.rev 
97b0: 3d 20 52 2e 72 69 64 0a 20 20 20 20 20 20 20 20  = R.rid.        
97c0: 20 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69      AND    CI.ii
97d0: 64 20 3d 20 54 2e 74 69 64 0a 20 20 20 20 20 20  d = T.tid.      
97e0: 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e 63        AND    C.c
97f0: 69 64 20 3d 20 43 49 2e 63 69 64 0a 20 20 20 20  id = CI.cid.    
9800: 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43          AND    C
9810: 2e 74 79 70 65 20 3d 20 31 0a 20 20 20 20 55 4e  .type = 1.    UN
9820: 49 4f 4e 0a 09 20 20 20 20 53 45 4c 45 43 54 20  ION..    SELECT 
9830: 43 2e 63 69 64 0a 09 20 20 20 20 46 52 4f 4d 20  C.cid..    FROM 
9840: 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 62 72    revision R, br
9850: 61 6e 63 68 20 42 2c 20 63 73 69 74 65 6d 20 43  anch B, csitem C
9860: 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43 0a 09  I, changeset C..
9870: 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64      WHERE  R.rid
9880: 20 69 6e 20 24 74 68 65 73 65 74 0a 09 20 20 20   in $theset..   
9890: 20 41 4e 44 20 20 20 20 42 2e 72 6f 6f 74 20 3d   AND    B.root =
98a0: 20 52 2e 72 69 64 0a 20 20 20 20 20 20 20 20 20   R.rid.         
98b0: 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69 64     AND    CI.iid
98c0: 20 3d 20 42 2e 62 69 64 0a 20 20 20 20 20 20 20   = B.bid.       
98d0: 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e 63 69       AND    C.ci
98e0: 64 20 3d 20 43 49 2e 63 69 64 0a 20 20 20 20 20  d = CI.cid.     
98f0: 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e         AND    C.
9900: 74 79 70 65 20 3d 20 32 0a 09 22 5d 0a 20 20 20  type = 2.."].   
9910: 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 23   }.}..# # ## ###
9920: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20   ##### ######## 
9930: 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23  ############# ##
9940: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9950: 23 23 23 0a 23 23 20 48 65 6c 70 65 72 20 73 69  ###.## Helper si
9960: 6e 67 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64  ngleton. Command
9970: 73 20 66 6f 72 20 74 61 67 20 73 79 6d 62 6f 6c  s for tag symbol
9980: 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e   changesets...sn
9990: 69 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66  it::type ::vc::f
99a0: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63  ossil::import::c
99b0: 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76  vs::project::rev
99c0: 3a 3a 73 79 6d 3a 3a 74 61 67 20 7b 0a 20 20 20  ::sym::tag {.   
99d0: 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 72 65   typemethod byre
99e0: 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75  vision {} { retu
99f0: 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d  rn 0 }.    typem
9a00: 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20  ethod bysymbol  
9a10: 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d   {} { return 1 }
9a20: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
9a30: 69 73 74 61 67 20 20 20 20 20 20 7b 7d 20 7b 20  istag      {} { 
9a40: 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74  return 1 }.    t
9a50: 79 70 65 6d 65 74 68 6f 64 20 69 73 62 72 61 6e  ypemethod isbran
9a60: 63 68 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e  ch   {} { return
9a70: 20 30 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65   0 }..    typeme
9a80: 74 68 6f 64 20 73 74 72 20 7b 74 61 67 7d 20 7b  thod str {tag} {
9a90: 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61  ..struct::list a
9aa0: 73 73 69 67 6e 20 5b 73 74 61 74 65 20 72 75 6e  ssign [state run
9ab0: 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 53   {..    SELECT S
9ac0: 2e 6e 61 6d 65 2c 20 46 2e 6e 61 6d 65 2c 20 50  .name, F.name, P
9ad0: 2e 6e 61 6d 65 0a 09 20 20 20 20 46 52 4f 4d 20  .name..    FROM 
9ae0: 20 20 74 61 67 20 54 2c 20 73 79 6d 62 6f 6c 20    tag T, symbol 
9af0: 53 2c 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65  S, file F, proje
9b00: 63 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 20  ct P..    WHERE 
9b10: 20 54 2e 74 69 64 20 3d 20 24 74 61 67 0a 09 20   T.tid = $tag.. 
9b20: 20 20 20 41 4e 44 20 20 20 20 46 2e 66 69 64 20     AND    F.fid 
9b30: 3d 20 54 2e 66 69 64 0a 09 20 20 20 20 41 4e 44  = T.fid..    AND
9b40: 20 20 20 20 50 2e 70 69 64 20 3d 20 46 2e 70 69      P.pid = F.pi
9b50: 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 53 2e  d..    AND    S.
9b60: 73 69 64 20 3d 20 54 2e 73 69 64 0a 09 7d 5d 20  sid = T.sid..}] 
9b70: 73 6e 61 6d 65 20 66 6e 61 6d 65 20 70 6e 61 6d  sname fname pnam
9b80: 65 0a 09 72 65 74 75 72 6e 20 22 24 70 6e 61 6d  e..return "$pnam
9b90: 65 2f 54 27 24 7b 73 6e 61 6d 65 7d 27 3a 3a 24  e/T'${sname}'::$
9ba0: 66 6e 61 6d 65 22 0a 20 20 20 20 7d 0a 0a 20 20  fname".    }..  
9bb0: 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73    # result = lis
9bc0: 74 20 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74  t (mintime, maxt
9bd0: 69 6d 65 29 0a 20 20 20 20 74 79 70 65 6d 65 74  ime).    typemet
9be0: 68 6f 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 74  hod timerange {t
9bf0: 61 67 73 7d 20 7b 0a 09 23 20 54 68 65 20 72 61  ags} {..# The ra
9c00: 6e 67 65 20 69 73 20 64 65 66 69 6e 65 64 20 61  nge is defined a
9c10: 73 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 74  s the range of t
9c20: 68 65 20 72 65 76 69 73 69 6f 6e 73 20 74 68 65  he revisions the
9c30: 20 74 61 67 73 0a 09 23 20 61 72 65 20 61 74 74   tags..# are att
9c40: 61 63 68 65 64 20 74 6f 2e 0a 0a 09 73 65 74 20  ached to....set 
9c50: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24  theset ('[join $
9c60: 74 61 67 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72  tags {','}]')..r
9c70: 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e  eturn [state run
9c80: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 4d   "..    SELECT M
9c90: 49 4e 28 52 2e 64 61 74 65 29 2c 20 4d 41 58 28  IN(R.date), MAX(
9ca0: 52 2e 64 61 74 65 29 0a 09 20 20 20 20 46 52 4f  R.date)..    FRO
9cb0: 4d 20 20 20 74 61 67 20 54 2c 20 72 65 76 69 73  M   tag T, revis
9cc0: 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45  ion R..    WHERE
9cd0: 20 20 54 2e 74 69 64 20 49 4e 20 24 74 68 65 73    T.tid IN $thes
9ce0: 65 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 41  et.            A
9cf0: 4e 44 20 20 20 20 52 2e 72 69 64 20 3d 20 54 2e  ND    R.rid = T.
9d00: 72 65 76 0a 09 22 5d 0a 20 20 20 20 7d 0a 0a 20  rev.."].    }.. 
9d10: 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 64     # var(dv) = d
9d20: 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73  ict (item -> lis
9d30: 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20  t (item)), item 
9d40: 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69 64   = list (type id
9d50: 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ).    typemethod
9d60: 20 73 75 63 63 65 73 73 6f 72 73 20 7b 64 76 20   successors {dv 
9d70: 74 61 67 73 7d 20 7b 0a 09 23 20 54 61 67 73 20  tags} {..# Tags 
9d80: 68 61 76 65 20 6e 6f 20 73 75 63 63 65 73 73 6f  have no successo
9d90: 72 73 2e 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  rs...return.    
9da0: 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20  }..    # result 
9db0: 3d 20 34 2d 6c 69 73 74 20 28 69 74 65 6d 74 79  = 4-list (itemty
9dc0: 70 65 20 69 74 65 6d 69 64 20 6e 65 78 74 69 74  pe itemid nextit
9dd0: 65 6d 74 79 70 65 20 6e 65 78 74 69 74 65 6d 69  emtype nextitemi
9de0: 64 20 2e 2e 2e 29 0a 20 20 20 20 74 79 70 65 6d  d ...).    typem
9df0: 65 74 68 6f 64 20 6c 6f 6f 70 73 20 7b 74 61 67  ethod loops {tag
9e00: 73 7d 20 7b 0a 09 23 20 54 61 67 73 20 68 61 76  s} {..# Tags hav
9e10: 65 20 6e 6f 20 73 75 63 63 65 73 73 6f 72 73 2c  e no successors,
9e20: 20 74 68 65 72 65 66 6f 72 65 20 63 61 6e 6e 6f   therefore canno
9e30: 74 20 63 61 75 73 65 20 6c 6f 6f 70 73 0a 09 72  t cause loops..r
9e40: 65 74 75 72 6e 20 7b 7d 0a 20 20 20 20 7d 0a 0a  eturn {}.    }..
9e50: 20 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20      # var(dv) = 
9e60: 64 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69  dict (item -> li
9e70: 73 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d  st (item)), item
9e80: 20 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69    = list (type i
9e90: 64 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  d).    typemetho
9ea0: 64 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 7b  d predecessors {
9eb0: 64 76 20 74 61 67 73 7d 20 7b 0a 09 75 70 76 61  dv tags} {..upva
9ec0: 72 20 31 20 24 64 76 20 64 65 70 65 6e 64 65 6e  r 1 $dv dependen
9ed0: 63 69 65 73 0a 09 23 20 54 68 65 20 70 72 65 64  cies..# The pred
9ee0: 65 63 65 73 73 6f 72 73 20 6f 66 20 61 20 74 61  ecessors of a ta
9ef0: 67 20 61 72 65 20 61 6c 6c 20 74 68 65 20 72 65  g are all the re
9f00: 76 69 73 69 6f 6e 73 20 74 68 65 20 74 61 67 73  visions the tags
9f10: 20 61 72 65 0a 09 23 20 61 74 74 61 63 68 65 64   are..# attached
9f20: 20 74 6f 2c 20 61 73 20 77 65 6c 6c 20 61 73 20   to, as well as 
9f30: 61 6c 6c 20 74 68 65 20 62 72 61 6e 63 68 65 73  all the branches
9f40: 20 6f 72 20 74 61 67 73 20 77 68 69 63 68 20 61   or tags which a
9f50: 72 65 0a 09 23 20 74 68 65 69 72 20 70 72 65 66  re..# their pref
9f60: 65 72 65 64 20 70 61 72 65 6e 74 73 2e 0a 0a 09  ered parents....
9f70: 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f  set theset ('[jo
9f80: 69 6e 20 24 74 61 67 73 20 7b 27 2c 27 7d 5d 27  in $tags {','}]'
9f90: 29 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20  )..foreach {tid 
9fa0: 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72  parent} [state r
9fb0: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54  un "..    SELECT
9fc0: 20 54 2e 74 69 64 2c 20 52 2e 72 69 64 0a 09 20   T.tid, R.rid.. 
9fd0: 20 20 20 46 52 4f 4d 20 20 20 74 61 67 20 54 2c     FROM   tag T,
9fe0: 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20   revision R..   
9ff0: 20 57 48 45 52 45 20 20 54 2e 74 69 64 20 49 4e   WHERE  T.tid IN
a000: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e   $theset..    AN
a010: 44 20 20 20 20 54 2e 72 65 76 20 3d 20 52 2e 72  D    T.rev = R.r
a020: 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61  id.."] {..    la
a030: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69  ppend dependenci
a040: 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61  es([list sym::ta
a050: 67 20 24 74 69 64 5d 29 20 5b 6c 69 73 74 20 72  g $tid]) [list r
a060: 65 76 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 0a  ev $parent]..}..
a070: 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 70 61  .foreach {tid pa
a080: 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e  rent} [state run
a090: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 54   "..    SELECT T
a0a0: 2e 74 69 64 2c 20 42 2e 62 69 64 0a 09 20 20 20  .tid, B.bid..   
a0b0: 20 46 52 4f 4d 20 20 20 74 61 67 20 54 2c 20 70   FROM   tag T, p
a0c0: 72 65 66 65 72 65 64 70 61 72 65 6e 74 20 50 2c  referedparent P,
a0d0: 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20 20 57   branch B..    W
a0e0: 48 45 52 45 20 20 54 2e 74 69 64 20 49 4e 20 24  HERE  T.tid IN $
a0f0: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20  theset..    AND 
a100: 20 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 69 64     T.sid = P.sid
a110: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70  ..    AND    P.p
a120: 69 64 20 3d 20 42 2e 73 69 64 0a 09 22 5d 20 7b  id = B.sid.."] {
a130: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65  ..    lappend de
a140: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74  pendencies([list
a150: 20 73 79 6d 3a 3a 74 61 67 20 24 74 69 64 5d 29   sym::tag $tid])
a160: 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e   [list sym::bran
a170: 63 68 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 0a  ch $parent]..}..
a180: 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 70 61  .foreach {tid pa
a190: 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e  rent} [state run
a1a0: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 54   "..    SELECT T
a1b0: 2e 74 69 64 2c 20 54 58 2e 74 69 64 0a 09 20 20  .tid, TX.tid..  
a1c0: 20 20 46 52 4f 4d 20 20 20 74 61 67 20 54 2c 20    FROM   tag T, 
a1d0: 70 72 65 66 65 72 65 64 70 61 72 65 6e 74 20 50  preferedparent P
a1e0: 2c 20 74 61 67 20 54 58 0a 09 20 20 20 20 57 48  , tag TX..    WH
a1f0: 45 52 45 20 20 54 2e 74 69 64 20 49 4e 20 24 74  ERE  T.tid IN $t
a200: 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20  heset..    AND  
a210: 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a    T.sid = P.sid.
a220: 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69  .    AND    P.pi
a230: 64 20 3d 20 54 58 2e 73 69 64 0a 09 22 5d 20 7b  d = TX.sid.."] {
a240: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65  ..    lappend de
a250: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74  pendencies([list
a260: 20 73 79 6d 3a 3a 74 61 67 20 24 74 69 64 5d 29   sym::tag $tid])
a270: 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20   [list sym::tag 
a280: 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 72 65 74  $parent]..}..ret
a290: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  urn.    }..    #
a2a0: 20 72 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 28   result = list (
a2b0: 63 68 61 6e 67 65 73 65 74 2d 69 64 29 0a 20 20  changeset-id).  
a2c0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 63 73 5f    typemethod cs_
a2d0: 73 75 63 63 65 73 73 6f 72 73 20 7b 74 61 67 73  successors {tags
a2e0: 7d 20 7b 0a 09 23 20 54 61 67 73 20 68 61 76 65  } {..# Tags have
a2f0: 20 6e 6f 20 73 75 63 63 65 73 73 6f 72 73 2e 0a   no successors..
a300: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 7d 0a  .return.    }.}.
a310: 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23  .# # ## ### ####
a320: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
a330: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
a340: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23  ##############.#
a350: 23 20 48 65 6c 70 65 72 20 73 69 6e 67 6c 65 74  # Helper singlet
a360: 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20 66 6f 72  on. Commands for
a370: 20 62 72 61 6e 63 68 20 73 79 6d 62 6f 6c 20 63   branch symbol c
a380: 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e 69 74  hangesets...snit
a390: 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f 73  ::type ::vc::fos
a3a0: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73  sil::import::cvs
a3b0: 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a  ::project::rev::
a3c0: 73 79 6d 3a 3a 62 72 61 6e 63 68 20 7b 0a 20 20  sym::branch {.  
a3d0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 72    typemethod byr
a3e0: 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74  evision {} { ret
a3f0: 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65  urn 0 }.    type
a400: 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20  method bysymbol 
a410: 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20    {} { return 1 
a420: 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  }.    typemethod
a430: 20 69 73 74 61 67 20 20 20 20 20 20 7b 7d 20 7b   istag      {} {
a440: 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20   return 0 }.    
a450: 74 79 70 65 6d 65 74 68 6f 64 20 69 73 62 72 61  typemethod isbra
a460: 6e 63 68 20 20 20 7b 7d 20 7b 20 72 65 74 75 72  nch   {} { retur
a470: 6e 20 31 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d  n 1 }..    typem
a480: 65 74 68 6f 64 20 73 74 72 20 7b 62 72 61 6e 63  ethod str {branc
a490: 68 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c 69  h} {..struct::li
a4a0: 73 74 20 61 73 73 69 67 6e 20 5b 73 74 61 74 65  st assign [state
a4b0: 20 72 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c 45   run {..    SELE
a4c0: 43 54 20 53 2e 6e 61 6d 65 2c 20 46 2e 6e 61 6d  CT S.name, F.nam
a4d0: 65 2c 20 50 2e 6e 61 6d 65 0a 09 20 20 20 20 46  e, P.name..    F
a4e0: 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20  ROM   branch B, 
a4f0: 73 79 6d 62 6f 6c 20 53 2c 20 66 69 6c 65 20 46  symbol S, file F
a500: 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09 20 20 20  , project P..   
a510: 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 3d 20   WHERE  B.bid = 
a520: 24 62 72 61 6e 63 68 0a 09 20 20 20 20 41 4e 44  $branch..    AND
a530: 20 20 20 20 46 2e 66 69 64 20 3d 20 42 2e 66 69      F.fid = B.fi
a540: 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e  d..    AND    P.
a550: 70 69 64 20 3d 20 46 2e 70 69 64 0a 09 20 20 20  pid = F.pid..   
a560: 20 41 4e 44 20 20 20 20 53 2e 73 69 64 20 3d 20   AND    S.sid = 
a570: 42 2e 73 69 64 0a 09 7d 5d 20 73 6e 61 6d 65 20  B.sid..}] sname 
a580: 66 6e 61 6d 65 20 70 6e 61 6d 65 0a 09 72 65 74  fname pname..ret
a590: 75 72 6e 20 22 24 70 6e 61 6d 65 2f 42 27 24 7b  urn "$pname/B'${
a5a0: 73 6e 61 6d 65 7d 27 3a 3a 24 66 6e 61 6d 65 22  sname}'::$fname"
a5b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65  .    }..    # re
a5c0: 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69 6e  sult = list (min
a5d0: 74 69 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a 20  time, maxtime). 
a5e0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 74 69     typemethod ti
a5f0: 6d 65 72 61 6e 67 65 20 7b 62 72 61 6e 63 68 65  merange {branche
a600: 73 7d 20 7b 0a 09 23 20 54 68 65 20 72 61 6e 67  s} {..# The rang
a610: 65 20 6f 66 20 61 20 62 72 61 6e 63 68 20 69 73  e of a branch is
a620: 20 64 65 66 69 6e 65 64 20 61 73 20 74 68 65 20   defined as the 
a630: 72 61 6e 67 65 20 6f 66 20 74 68 65 0a 09 23 20  range of the..# 
a640: 72 65 76 69 73 69 6f 6e 73 20 74 68 65 20 62 72  revisions the br
a650: 61 6e 63 68 65 73 20 61 72 65 20 73 70 61 77 6e  anches are spawn
a660: 65 64 20 62 79 2e 20 4e 4f 54 45 20 68 6f 77 65  ed by. NOTE howe
a670: 76 65 72 20 74 68 61 74 20 74 68 65 0a 09 23 20  ver that the..# 
a680: 62 72 61 6e 63 68 65 73 20 61 73 73 6f 63 69 61  branches associa
a690: 74 65 64 20 77 69 74 68 20 61 20 64 65 74 61 63  ted with a detac
a6a0: 68 65 64 20 4e 54 44 42 20 77 69 6c 6c 20 68 61  hed NTDB will ha
a6b0: 76 65 20 6e 6f 20 72 6f 6f 74 0a 09 23 20 73 70  ve no root..# sp
a6c0: 61 77 6e 69 6e 67 20 74 68 65 6d 2c 20 68 65 6e  awning them, hen
a6d0: 63 65 20 74 68 65 79 20 68 61 76 65 20 6e 6f 20  ce they have no 
a6e0: 72 65 61 6c 20 74 69 6d 65 72 61 6e 67 65 20 61  real timerange a
a6f0: 6e 79 0a 09 23 20 6c 6f 6e 67 65 72 2e 20 42 79  ny..# longer. By
a700: 20 75 73 69 6e 67 20 30 20 77 65 20 70 75 74 20   using 0 we put 
a710: 74 68 65 6d 20 69 6e 20 66 72 6f 6e 74 20 6f 66  them in front of
a720: 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65   everything else
a730: 2c 0a 09 23 20 61 73 20 74 68 65 79 20 6c 6f 67  ,..# as they log
a740: 69 63 61 6c 6c 79 20 61 72 65 2e 0a 0a 09 73 65  ically are....se
a750: 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e  t theset ('[join
a760: 20 24 62 72 61 6e 63 68 65 73 20 7b 27 2c 27 7d   $branches {','}
a770: 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61  ]')..return [sta
a780: 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45  te run "..    SE
a790: 4c 45 43 54 20 49 46 4e 55 4c 4c 28 4d 49 4e 28  LECT IFNULL(MIN(
a7a0: 52 2e 64 61 74 65 29 2c 30 29 2c 20 49 46 4e 55  R.date),0), IFNU
a7b0: 4c 4c 28 4d 41 58 28 52 2e 64 61 74 65 29 2c 30  LL(MAX(R.date),0
a7c0: 29 0a 09 20 20 20 20 46 52 4f 4d 20 20 62 72 61  )..    FROM  bra
a7d0: 6e 63 68 20 42 2c 20 72 65 76 69 73 69 6f 6e 20  nch B, revision 
a7e0: 52 0a 09 20 20 20 20 57 48 45 52 45 20 42 2e 62  R..    WHERE B.b
a7f0: 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 20 20  id IN $theset.  
a800: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20            AND   
a810: 52 2e 72 69 64 20 3d 20 42 2e 72 6f 6f 74 0a 09  R.rid = B.root..
a820: 22 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  "].    }..    # 
a830: 72 65 73 75 6c 74 20 3d 20 34 2d 6c 69 73 74 20  result = 4-list 
a840: 28 69 74 65 6d 74 79 70 65 20 69 74 65 6d 69 64  (itemtype itemid
a850: 20 6e 65 78 74 69 74 65 6d 74 79 70 65 20 6e 65   nextitemtype ne
a860: 78 74 69 74 65 6d 69 64 20 2e 2e 2e 29 0a 20 20  xtitemid ...).  
a870: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c 6f 6f    typemethod loo
a880: 70 73 20 7b 62 72 61 6e 63 68 65 73 7d 20 7b 0a  ps {branches} {.
a890: 09 23 20 4e 6f 74 65 3a 20 52 65 76 69 73 69 6f  .# Note: Revisio
a8a0: 6e 73 20 61 6e 64 20 74 61 67 73 20 63 61 6e 6e  ns and tags cann
a8b0: 6f 74 20 63 61 75 73 65 20 74 68 65 20 6c 6f 6f  ot cause the loo
a8c0: 70 2e 20 42 65 69 6e 67 20 6f 66 20 61 0a 09 23  p. Being of a..#
a8d0: 20 66 75 6e 64 61 6d 65 6e 74 61 6c 6c 79 20 64   fundamentally d
a8e0: 69 66 66 65 72 65 6e 74 20 74 79 70 65 20 74 68  ifferent type th
a8f0: 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 69 6e 20  ey cannot be in 
a900: 74 68 65 20 69 6e 63 6f 6d 69 6e 67 0a 09 23 20  the incoming..# 
a910: 73 65 74 20 6f 66 20 69 64 73 2e 0a 0a 09 73 65  set of ids....se
a920: 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e  t theset ('[join
a930: 20 24 62 72 61 6e 63 68 65 73 20 7b 27 2c 27 7d   $branches {','}
a940: 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61  ]')..return [sta
a950: 74 65 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e  te run [subst -n
a960: 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63  ocommands -nobac
a970: 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20 20 20  kslashes {..    
a980: 53 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 42 58  SELECT B.bid, BX
a990: 2e 62 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  .bid..    FROM  
a9a0: 20 62 72 61 6e 63 68 20 42 2c 20 70 72 65 66 65   branch B, prefe
a9b0: 72 65 64 70 61 72 65 6e 74 20 50 2c 20 62 72 61  redparent P, bra
a9c0: 6e 63 68 20 42 58 0a 09 20 20 20 20 57 48 45 52  nch BX..    WHER
a9d0: 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65  E  B.bid IN $the
a9e0: 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  set..    AND    
a9f0: 42 2e 73 69 64 20 3d 20 50 2e 70 69 64 0a 09 20  B.sid = P.pid.. 
aa00: 20 20 20 41 4e 44 20 20 20 20 42 58 2e 73 69 64     AND    BX.sid
aa10: 20 3d 20 50 2e 73 69 64 0a 09 20 20 20 20 41 4e   = P.sid..    AN
aa20: 44 20 20 20 20 42 58 2e 62 69 64 20 49 4e 20 24  D    BX.bid IN $
aa30: 74 68 65 73 65 74 0a 09 7d 5d 5d 0a 20 20 20 20  theset..}]].    
aa40: 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76 29  }..    # var(dv)
aa50: 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d 3e   = dict (item ->
aa60: 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c 20 69   list (item)), i
aa70: 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 79 70  tem  = list (typ
aa80: 65 20 69 64 29 0a 20 20 20 20 74 79 70 65 6d 65  e id).    typeme
aa90: 74 68 6f 64 20 73 75 63 63 65 73 73 6f 72 73 20  thod successors 
aaa0: 7b 64 76 20 62 72 61 6e 63 68 65 73 7d 20 7b 0a  {dv branches} {.
aab0: 09 75 70 76 61 72 20 31 20 24 64 76 20 64 65 70  .upvar 1 $dv dep
aac0: 65 6e 64 65 6e 63 69 65 73 0a 09 23 20 54 68 65  endencies..# The
aad0: 20 66 69 72 73 74 20 72 65 76 69 73 69 6f 6e 20   first revision 
aae0: 63 6f 6d 6d 69 74 74 65 64 20 6f 6e 20 61 20 62  committed on a b
aaf0: 72 61 6e 63 68 2c 20 61 6e 64 20 61 6c 6c 20 62  ranch, and all b
ab00: 72 61 6e 63 68 65 73 0a 09 23 20 61 6e 64 20 74  ranches..# and t
ab10: 61 67 73 20 77 68 69 63 68 20 68 61 76 65 20 69  ags which have i
ab20: 74 20 61 73 20 74 68 65 69 72 20 70 72 65 66 65  t as their prefe
ab30: 72 65 64 20 70 61 72 65 6e 74 20 61 72 65 20 74  red parent are t
ab40: 68 65 0a 09 23 20 73 75 63 63 65 73 73 6f 72 73  he..# successors
ab50: 20 6f 66 20 61 20 62 72 61 6e 63 68 2e 0a 0a 09   of a branch....
ab60: 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f  set theset ('[jo
ab70: 69 6e 20 24 62 72 61 6e 63 68 65 73 20 7b 27 2c  in $branches {',
ab80: 27 7d 5d 27 29 0a 09 66 6f 72 65 61 63 68 20 7b  '}]')..foreach {
ab90: 62 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74  bid child} [stat
aba0: 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c  e run "..    SEL
abb0: 45 43 54 20 42 2e 62 69 64 2c 20 52 2e 72 69 64  ECT B.bid, R.rid
abc0: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61  ..    FROM   bra
abd0: 6e 63 68 20 42 2c 20 72 65 76 69 73 69 6f 6e 20  nch B, revision 
abe0: 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e  R..    WHERE  B.
abf0: 62 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09  bid IN $theset..
ac00: 20 20 20 20 41 4e 44 20 20 20 20 42 2e 66 69 72      AND    B.fir
ac10: 73 74 20 3d 20 52 2e 72 69 64 0a 09 22 5d 20 7b  st = R.rid.."] {
ac20: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65  ..    lappend de
ac30: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74  pendencies([list
ac40: 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 62 69   sym::branch $bi
ac50: 64 5d 29 20 5b 6c 69 73 74 20 72 65 76 20 24 63  d]) [list rev $c
ac60: 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65 61 63  hild]..}..foreac
ac70: 68 20 7b 62 69 64 20 63 68 69 6c 64 7d 20 5b 73  h {bid child} [s
ac80: 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20  tate run "..    
ac90: 53 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 42 58  SELECT B.bid, BX
aca0: 2e 62 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  .bid..    FROM  
acb0: 20 62 72 61 6e 63 68 20 42 2c 20 70 72 65 66 65   branch B, prefe
acc0: 72 65 64 70 61 72 65 6e 74 20 50 2c 20 62 72 61  redparent P, bra
acd0: 6e 63 68 20 42 58 0a 09 20 20 20 20 57 48 45 52  nch BX..    WHER
ace0: 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65  E  B.bid IN $the
acf0: 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  set..    AND    
ad00: 42 2e 73 69 64 20 3d 20 50 2e 70 69 64 0a 09 20  B.sid = P.pid.. 
ad10: 20 20 20 41 4e 44 20 20 20 20 42 58 2e 73 69 64     AND    BX.sid
ad20: 20 3d 20 50 2e 73 69 64 0a 09 22 5d 20 7b 0a 09   = P.sid.."] {..
ad30: 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65      lappend depe
ad40: 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73  ndencies([list s
ad50: 79 6d 3a 3a 62 72 61 6e 63 68 20 24 62 69 64 5d  ym::branch $bid]
ad60: 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61  ) [list sym::bra
ad70: 6e 63 68 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09  nch $child]..}..
ad80: 66 6f 72 65 61 63 68 20 7b 62 69 64 20 63 68 69  foreach {bid chi
ad90: 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22  ld} [state run "
ada0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62  ..    SELECT B.b
adb0: 69 64 2c 20 54 2e 74 69 64 0a 09 20 20 20 20 46  id, T.tid..    F
adc0: 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20  ROM   branch B, 
add0: 70 72 65 66 65 72 65 64 70 61 72 65 6e 74 20 50  preferedparent P
ade0: 2c 20 74 61 67 20 54 0a 09 20 20 20 20 57 48 45  , tag T..    WHE
adf0: 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68  RE  B.bid IN $th
ae00: 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20  eset..    AND   
ae10: 20 42 2e 73 69 64 20 3d 20 50 2e 70 69 64 0a 09   B.sid = P.pid..
ae20: 20 20 20 20 41 4e 44 20 20 20 20 54 2e 73 69 64      AND    T.sid
ae30: 20 3d 20 50 2e 73 69 64 0a 09 22 5d 20 7b 0a 09   = P.sid.."] {..
ae40: 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65      lappend depe
ae50: 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73  ndencies([list s
ae60: 79 6d 3a 3a 62 72 61 6e 63 68 20 24 62 69 64 5d  ym::branch $bid]
ae70: 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67  ) [list sym::tag
ae80: 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 72 65 74   $child]..}..ret
ae90: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  urn.    }..    #
aea0: 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20   var(dv) = dict 
aeb0: 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69  (item -> list (i
aec0: 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c  tem)), item  = l
aed0: 69 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 20  ist (type id).  
aee0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 70 72 65    typemethod pre
aef0: 64 65 63 65 73 73 6f 72 73 20 7b 64 76 20 62 72  decessors {dv br
af00: 61 6e 63 68 65 73 7d 20 7b 0a 09 75 70 76 61 72  anches} {..upvar
af10: 20 31 20 24 64 76 20 64 65 70 65 6e 64 65 6e 63   1 $dv dependenc
af20: 69 65 73 0a 09 23 20 54 68 65 20 70 72 65 64 65  ies..# The prede
af30: 63 65 73 73 6f 72 73 20 6f 66 20 61 20 62 72 61  cessors of a bra
af40: 6e 63 68 20 61 72 65 20 61 6c 6c 20 74 68 65 20  nch are all the 
af50: 72 65 76 69 73 69 6f 6e 73 20 74 68 65 0a 09 23  revisions the..#
af60: 20 62 72 61 6e 63 68 65 73 20 61 72 65 20 73 70   branches are sp
af70: 61 77 6e 65 64 20 66 72 6f 6d 2c 20 61 73 20 77  awned from, as w
af80: 65 6c 6c 20 61 73 20 61 6c 6c 20 74 68 65 20 62  ell as all the b
af90: 72 61 6e 63 68 65 73 20 6f 72 0a 09 23 20 74 61  ranches or..# ta
afa0: 67 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65  gs which are the
afb0: 69 72 20 70 72 65 66 65 72 65 64 20 70 61 72 65  ir prefered pare
afc0: 6e 74 73 2e 0a 0a 09 73 65 74 20 74 68 65 73 65  nts....set these
afd0: 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61 6e 63  t ('[join $branc
afe0: 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66 6f  hes {','}]')..fo
aff0: 72 65 61 63 68 20 7b 62 69 64 20 70 61 72 65 6e  reach {bid paren
b000: 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a  t} [state run ".
b010: 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 42 69  .    SELECT B.Bi
b020: 64 2c 20 52 2e 72 69 64 0a 09 20 20 20 20 46 52  d, R.rid..    FR
b030: 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20 72  OM   branch B, r
b040: 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57  evision R..    W
b050: 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24  HERE  B.bid IN $
b060: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20  theset..    AND 
b070: 20 20 20 42 2e 72 6f 6f 74 20 3d 20 52 2e 72 69     B.root = R.ri
b080: 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70  d.."] {..    lap
b090: 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65  pend dependencie
b0a0: 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61  s([list sym::bra
b0b0: 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c 69 73 74  nch $bid]) [list
b0c0: 20 72 65 76 20 24 70 61 72 65 6e 74 5d 0a 09 7d   rev $parent]..}
b0d0: 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64 20 70  ..foreach {bid p
b0e0: 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75  arent} [state ru
b0f0: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20  n "..    SELECT 
b100: 42 2e 62 69 64 2c 20 42 58 2e 62 69 64 0a 09 20  B.bid, BX.bid.. 
b110: 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68     FROM   branch
b120: 20 42 2c 20 70 72 65 66 65 72 65 64 70 61 72 65   B, preferedpare
b130: 6e 74 20 50 2c 20 62 72 61 6e 63 68 20 42 58 0a  nt P, branch BX.
b140: 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69  .    WHERE  B.bi
b150: 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20  d IN $theset..  
b160: 20 20 41 4e 44 20 20 20 20 42 2e 73 69 64 20 3d    AND    B.sid =
b170: 20 50 2e 73 69 64 0a 09 20 20 20 20 41 4e 44 20   P.sid..    AND 
b180: 20 20 20 50 2e 70 69 64 20 3d 20 42 58 2e 73 69     P.pid = BX.si
b190: 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70  d.."] {..    lap
b1a0: 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65  pend dependencie
b1b0: 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61  s([list sym::bra
b1c0: 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c 69 73 74  nch $bid]) [list
b1d0: 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 70 61   sym::branch $pa
b1e0: 72 65 6e 74 5d 0a 09 7d 0a 09 66 6f 72 65 61 63  rent]..}..foreac
b1f0: 68 20 7b 62 69 64 20 70 61 72 65 6e 74 7d 20 5b  h {bid parent} [
b200: 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20  state run "..   
b210: 20 53 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 54   SELECT B.bid, T
b220: 2e 74 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  .tid..    FROM  
b230: 20 62 72 61 6e 63 68 20 42 2c 20 70 72 65 66 65   branch B, prefe
b240: 72 65 64 70 61 72 65 6e 74 20 50 2c 20 74 61 67  redparent P, tag
b250: 20 54 0a 09 20 20 20 20 57 48 45 52 45 20 20 42   T..    WHERE  B
b260: 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a  .bid IN $theset.
b270: 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 73 69  .    AND    B.si
b280: 64 20 3d 20 50 2e 73 69 64 0a 09 20 20 20 20 41  d = P.sid..    A
b290: 4e 44 20 20 20 20 50 2e 70 69 64 20 3d 20 54 2e  ND    P.pid = T.
b2a0: 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c  sid.."] {..    l
b2b0: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63  append dependenc
b2c0: 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62  ies([list sym::b
b2d0: 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c 69  ranch $bid]) [li
b2e0: 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 70 61 72  st sym::tag $par
b2f0: 65 6e 74 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a  ent]..}..return.
b300: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73      }..    # res
b310: 75 6c 74 20 3d 20 6c 69 73 74 20 28 63 68 61 6e  ult = list (chan
b320: 67 65 73 65 74 2d 69 64 29 0a 20 20 20 20 74 79  geset-id).    ty
b330: 70 65 6d 65 74 68 6f 64 20 63 73 5f 73 75 63 63  pemethod cs_succ
b340: 65 73 73 6f 72 73 20 7b 62 72 61 6e 63 68 65 73  essors {branches
b350: 7d 20 7b 0a 20 20 20 20 20 20 20 20 23 20 54 68  } {.        # Th
b360: 69 73 20 69 73 20 61 20 76 61 72 69 61 6e 74 20  is is a variant 
b370: 6f 66 20 27 73 75 63 63 65 73 73 6f 72 73 27 20  of 'successors' 
b380: 77 68 69 63 68 20 6d 61 70 73 20 74 68 65 20 6c  which maps the l
b390: 6f 77 2d 6c 65 76 65 6c 0a 20 20 20 20 20 20 20  ow-level.       
b3a0: 20 23 20 64 61 74 61 20 64 69 72 65 63 74 6c 79   # data directly
b3b0: 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74   to the associat
b3c0: 65 64 20 63 68 61 6e 67 65 73 65 74 73 2e 20 49  ed changesets. I
b3d0: 2e 65 2e 20 69 6e 73 74 65 61 64 0a 20 20 20 20  .e. instead.    
b3e0: 20 20 20 20 23 20 6d 69 6c 6c 69 6f 6e 73 20 6f      # millions o
b3f0: 66 20 64 65 70 65 6e 64 65 6e 63 79 20 70 61 69  f dependency pai
b400: 72 73 20 28 69 6e 20 65 78 74 72 65 6d 65 20 63  rs (in extreme c
b410: 61 73 65 73 20 28 45 78 61 6d 70 6c 65 3a 20 54  ases (Example: T
b420: 63 6c 0a 20 20 20 20 20 20 20 20 23 20 43 56 53  cl.        # CVS
b430: 29 29 20 77 65 20 72 65 74 75 72 6e 20 61 20 76  )) we return a v
b440: 65 72 79 20 73 68 6f 72 74 20 61 6e 64 20 6d 75  ery short and mu
b450: 63 68 20 6d 6f 72 65 20 6d 61 6e 61 67 65 61 62  ch more manageab
b460: 6c 65 20 6c 69 73 74 0a 20 20 20 20 20 20 20 20  le list.        
b470: 23 20 6f 66 20 63 68 61 6e 67 65 73 65 74 73 2e  # of changesets.
b480: 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27  ...set theset ('
b490: 5b 6a 6f 69 6e 20 24 62 72 61 6e 63 68 65 73 20  [join $branches 
b4a0: 7b 27 2c 27 7d 5d 27 29 0a 20 20 20 20 20 20 20  {','}]').       
b4b0: 20 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72   return [state r
b4c0: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54  un "..    SELECT
b4d0: 20 43 2e 63 69 64 0a 09 20 20 20 20 46 52 4f 4d   C.cid..    FROM
b4e0: 20 20 20 62 72 61 6e 63 68 20 42 2c 20 72 65 76     branch B, rev
b4f0: 69 73 69 6f 6e 20 52 2c 20 63 73 69 74 65 6d 20  ision R, csitem 
b500: 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43 0a  CI, changeset C.
b510: 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69  .    WHERE  B.bi
b520: 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20  d IN $theset..  
b530: 20 20 41 4e 44 20 20 20 20 42 2e 66 69 72 73 74    AND    B.first
b540: 20 3d 20 52 2e 72 69 64 0a 20 20 20 20 20 20 20   = R.rid.       
b550: 20 20 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69       AND    CI.i
b560: 69 64 20 3d 20 52 2e 72 69 64 0a 20 20 20 20 20  id = R.rid.     
b570: 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e         AND    C.
b580: 63 69 64 20 3d 20 43 49 2e 63 69 64 0a 20 20 20  cid = CI.cid.   
b590: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20           AND    
b5a0: 43 2e 74 79 70 65 20 3d 20 30 0a 20 20 20 20 55  C.type = 0.    U
b5b0: 4e 49 4f 4e 0a 09 20 20 20 20 53 45 4c 45 43 54  NION..    SELECT
b5c0: 20 43 2e 63 69 64 0a 09 20 20 20 20 46 52 4f 4d   C.cid..    FROM
b5d0: 20 20 20 62 72 61 6e 63 68 20 42 2c 20 70 72 65     branch B, pre
b5e0: 66 65 72 65 64 70 61 72 65 6e 74 20 50 2c 20 62  feredparent P, b
b5f0: 72 61 6e 63 68 20 42 58 2c 20 63 73 69 74 65 6d  ranch BX, csitem
b600: 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43   CI, changeset C
b610: 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62  ..    WHERE  B.b
b620: 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20  id IN $theset.. 
b630: 20 20 20 41 4e 44 20 20 20 20 42 2e 73 69 64 20     AND    B.sid 
b640: 3d 20 50 2e 70 69 64 0a 09 20 20 20 20 41 4e 44  = P.pid..    AND
b650: 20 20 20 20 42 58 2e 73 69 64 20 3d 20 50 2e 73      BX.sid = P.s
b660: 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 41  id.            A
b670: 4e 44 20 20 20 20 43 49 2e 69 69 64 20 3d 20 42  ND    CI.iid = B
b680: 58 2e 62 69 64 0a 20 20 20 20 20 20 20 20 20 20  X.bid.          
b690: 20 20 41 4e 44 20 20 20 20 43 2e 63 69 64 20 3d    AND    C.cid =
b6a0: 20 43 49 2e 63 69 64 0a 20 20 20 20 20 20 20 20   CI.cid.        
b6b0: 20 20 20 20 41 4e 44 20 20 20 20 43 2e 74 79 70      AND    C.typ
b6c0: 65 20 3d 20 32 0a 20 20 20 20 55 4e 49 4f 4e 0a  e = 2.    UNION.
b6d0: 09 20 20 20 20 53 45 4c 45 43 54 20 43 2e 63 69  .    SELECT C.ci
b6e0: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72  d..    FROM   br
b6f0: 61 6e 63 68 20 42 2c 20 70 72 65 66 65 72 65 64  anch B, prefered
b700: 70 61 72 65 6e 74 20 50 2c 20 74 61 67 20 54 2c  parent P, tag T,
b710: 20 63 73 69 74 65 6d 20 43 49 2c 20 63 68 61 6e   csitem CI, chan
b720: 67 65 73 65 74 20 43 0a 09 20 20 20 20 57 48 45  geset C..    WHE
b730: 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68  RE  B.bid IN $th
b740: 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20  eset..    AND   
b750: 20 42 2e 73 69 64 20 3d 20 50 2e 70 69 64 0a 09   B.sid = P.pid..
b760: 20 20 20 20 41 4e 44 20 20 20 20 54 2e 73 69 64      AND    T.sid
b770: 20 3d 20 50 2e 73 69 64 0a 20 20 20 20 20 20 20   = P.sid.       
b780: 20 20 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69       AND    CI.i
b790: 69 64 20 3d 20 54 2e 74 69 64 0a 20 20 20 20 20  id = T.tid.     
b7a0: 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e         AND    C.
b7b0: 63 69 64 20 3d 20 43 49 2e 63 69 64 0a 20 20 20  cid = CI.cid.   
b7c0: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20           AND    
b7d0: 43 2e 74 79 70 65 20 3d 20 31 0a 09 22 5d 0a 09  C.type = 1.."]..
b7e0: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20  return.    }..  
b7f0: 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23    # # ## ### ###
b800: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23  ## ######## ####
b810: 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23  #########.    ##
b820: 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a   Configuration..
b830: 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 69      pragma -hasi
b840: 6e 73 74 61 6e 63 65 73 20 20 20 6e 6f 20 3b 20  nstances   no ; 
b850: 23 20 73 69 6e 67 6c 65 74 6f 6e 0a 20 20 20 20  # singleton.    
b860: 70 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65 69  pragma -hastypei
b870: 6e 66 6f 20 20 20 20 6e 6f 20 3b 20 23 20 6e 6f  nfo    no ; # no
b880: 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20   introspection. 
b890: 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79     pragma -hasty
b8a0: 70 65 64 65 73 74 72 6f 79 20 6e 6f 20 3b 20 23  pedestroy no ; #
b8b0: 20 69 6d 6d 6f 72 74 61 6c 0a 7d 0a 0a 23 20 23   immortal.}..# #
b8c0: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23   ## ### ##### ##
b8d0: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
b8e0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
b8f0: 23 23 23 23 23 23 23 23 23 23 0a 23 23 0a 0a 6e  ##########.##..n
b900: 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a  amespace eval ::
b910: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f  vc::fossil::impo
b920: 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74  rt::cvs::project
b930: 20 7b 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65   {.    namespace
b940: 20 65 78 70 6f 72 74 20 72 65 76 0a 20 20 20 20   export rev.    
b950: 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 72  namespace eval r
b960: 65 76 20 7b 0a 09 6e 61 6d 65 73 70 61 63 65 20  ev {..namespace 
b970: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73  import ::vc::fos
b980: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73  sil::import::cvs
b990: 3a 3a 73 74 61 74 65 0a 09 6e 61 6d 65 73 70 61  ::state..namespa
b9a0: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a  ce import ::vc::
b9b0: 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a  fossil::import::
b9c0: 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09  cvs::integrity..
b9d0: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74  namespace import
b9e0: 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69   ::vc::tools::mi
b9f0: 73 63 3a 3a 2a 0a 09 6e 61 6d 65 73 70 61 63 65  sc::*..namespace
ba00: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f   import ::vc::to
ba10: 6f 6c 73 3a 3a 74 72 6f 75 62 6c 65 0a 09 6e 61  ols::trouble..na
ba20: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
ba30: 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a  :vc::tools::log.
ba40: 09 6c 6f 67 20 72 65 67 69 73 74 65 72 20 63 73  .log register cs
ba50: 65 74 73 0a 0a 09 23 20 53 65 74 20 75 70 20 74  ets...# Set up t
ba60: 68 65 20 68 65 6c 70 65 72 20 73 69 6e 67 6c 65  he helper single
ba70: 74 6f 6e 73 0a 09 6e 61 6d 65 73 70 61 63 65 20  tons..namespace 
ba80: 65 76 61 6c 20 72 65 76 20 7b 0a 09 20 20 20 20  eval rev {..    
ba90: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74  namespace import
baa0: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
bab0: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74  mport::cvs::stat
bac0: 65 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65  e..    namespace
bad0: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f   import ::vc::fo
bae0: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
baf0: 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a  s::integrity..}.
bb00: 09 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20  .namespace eval 
bb10: 73 79 6d 3a 3a 74 61 67 20 7b 0a 09 20 20 20 20  sym::tag {..    
bb20: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74  namespace import
bb30: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
bb40: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74  mport::cvs::stat
bb50: 65 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65  e..    namespace
bb60: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f   import ::vc::fo
bb70: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
bb80: 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a  s::integrity..}.
bb90: 09 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20  .namespace eval 
bba0: 73 79 6d 3a 3a 62 72 61 6e 63 68 20 7b 0a 09 20  sym::branch {.. 
bbb0: 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70     namespace imp
bbc0: 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c  ort ::vc::fossil
bbd0: 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73  ::import::cvs::s
bbe0: 74 61 74 65 0a 09 20 20 20 20 6e 61 6d 65 73 70  tate..    namesp
bbf0: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a  ace import ::vc:
bc00: 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a  :fossil::import:
bc10: 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a  :cvs::integrity.
bc20: 09 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 20  .}.    }.}..# # 
bc30: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
bc40: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
bc50: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
bc60: 23 23 23 23 23 23 23 23 23 0a 23 23 20 52 65 61  #########.## Rea
bc70: 64 79 0a 0a 70 61 63 6b 61 67 65 20 70 72 6f 76  dy..package prov
bc80: 69 64 65 20 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a  ide vc::fossil::
bc90: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f  import::cvs::pro
bca0: 6a 65 63 74 3a 3a 72 65 76 20 31 2e 30 0a 72 65  ject::rev 1.0.re
bcb0: 74 75 72 6e 0a                                   turn.