Hex Artifact Content
Not logged in

Artifact e7ab6ef540e9e72bbf6a3e063cc39da15d9463ed:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [facb4a8721] - Fixed bug in new changeset code, tagged and untagged item lists went out of sync. by aku on 2007-11-30 04:27:05.

0000: 23 23 20 2d 2a 2d 20 74 63 6c 20 2d 2a 2d 0a 23  ## -*- tcl -*-.#
0010: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20   # ## ### ##### 
0020: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
0030: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
0040: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20  ############.## 
0050: 43 6f 70 79 72 69 67 68 74 20 28 63 29 20 32 30  Copyright (c) 20
0060: 30 37 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69  07 Andreas Kupri
0070: 65 73 2e 0a 23 0a 23 20 54 68 69 73 20 73 6f 66  es..#.# This sof
0080: 74 77 61 72 65 20 69 73 20 6c 69 63 65 6e 73 65  tware is license
0090: 64 20 61 73 20 64 65 73 63 72 69 62 65 64 20 69  d as described i
00a0: 6e 20 74 68 65 20 66 69 6c 65 20 4c 49 43 45 4e  n the file LICEN
00b0: 53 45 2c 20 77 68 69 63 68 0a 23 20 79 6f 75 20  SE, which.# you 
00c0: 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65 63 65  should have rece
00d0: 69 76 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ived as part of 
00e0: 74 68 69 73 20 64 69 73 74 72 69 62 75 74 69 6f  this distributio
00f0: 6e 2e 0a 23 0a 23 20 54 68 69 73 20 73 6f 66 74  n..#.# This soft
0100: 77 61 72 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  ware consists of
0110: 20 76 6f 6c 75 6e 74 61 72 79 20 63 6f 6e 74 72   voluntary contr
0120: 69 62 75 74 69 6f 6e 73 20 6d 61 64 65 20 62 79  ibutions made by
0130: 20 6d 61 6e 79 0a 23 20 69 6e 64 69 76 69 64 75   many.# individu
0140: 61 6c 73 2e 20 20 46 6f 72 20 65 78 61 63 74 20  als.  For exact 
0150: 63 6f 6e 74 72 69 62 75 74 69 6f 6e 20 68 69 73  contribution his
0160: 74 6f 72 79 2c 20 73 65 65 20 74 68 65 20 72 65  tory, see the re
0170: 76 69 73 69 6f 6e 0a 23 20 68 69 73 74 6f 72 79  vision.# history
0180: 20 61 6e 64 20 6c 6f 67 73 2c 20 61 76 61 69 6c   and logs, avail
0190: 61 62 6c 65 20 61 74 20 68 74 74 70 3a 2f 2f 66  able at http://f
01a0: 6f 73 73 69 6c 2d 73 63 6d 2e 68 77 61 63 69 2e  ossil-scm.hwaci.
01b0: 63 6f 6d 2f 66 6f 73 73 69 6c 0a 23 20 23 20 23  com/fossil.# # #
01c0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
01d0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
01e0: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
01f0: 23 23 23 23 23 23 23 23 0a 0a 23 23 20 52 65 76  ########..## Rev
0200: 69 73 69 6f 6e 73 20 70 65 72 20 70 72 6f 6a 65  isions per proje
0210: 63 74 2c 20 61 6b 61 20 43 68 61 6e 67 65 73 65  ct, aka Changese
0220: 74 73 2e 20 54 68 65 73 65 20 6f 62 6a 65 63 74  ts. These object
0230: 73 20 61 72 65 20 66 69 72 73 74 20 75 73 65 64  s are first used
0240: 0a 23 23 20 69 6e 20 70 61 73 73 20 35 2c 20 77  .## in pass 5, w
0250: 68 69 63 68 20 63 72 65 61 74 65 73 20 74 68 65  hich creates the
0260: 20 69 6e 69 74 69 61 6c 20 73 65 74 20 63 6f 76   initial set cov
0270: 65 72 69 6e 67 20 74 68 65 20 72 65 70 6f 73 69  ering the reposi
0280: 74 6f 72 79 2e 0a 0a 23 20 23 20 23 23 20 23 23  tory...# # ## ##
0290: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
02a0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23   ############# #
02b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02c0: 23 23 23 23 0a 23 23 20 52 65 71 75 69 72 65 6d  ####.## Requirem
02d0: 65 6e 74 73 0a 0a 70 61 63 6b 61 67 65 20 72 65  ents..package re
02e0: 71 75 69 72 65 20 54 63 6c 20 38 2e 34 20 20 20  quire Tcl 8.4   
02f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0300: 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23 20              ; # 
0310: 52 65 71 75 69 72 65 64 20 72 75 6e 74 69 6d 65  Required runtime
0320: 2e 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72  ..package requir
0330: 65 20 73 6e 69 74 20 20 20 20 20 20 20 20 20 20  e snit          
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0350: 20 20 20 20 20 20 20 20 3b 20 23 20 4f 4f 20 73          ; # OO s
0360: 79 73 74 65 6d 2e 0a 70 61 63 6b 61 67 65 20 72  ystem..package r
0370: 65 71 75 69 72 65 20 73 74 72 75 63 74 3a 3a 73  equire struct::s
0380: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23               ; #
03a0: 20 53 65 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e   Set operations.
03b0: 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65  .package require
03c0: 20 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69 73 63   vc::tools::misc
03d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03e0: 20 20 20 20 20 20 20 3b 20 23 20 54 65 78 74 20         ; # Text 
03f0: 66 6f 72 6d 61 74 74 69 6e 67 0a 70 61 63 6b 61  formatting.packa
0400: 67 65 20 72 65 71 75 69 72 65 20 76 63 3a 3a 74  ge require vc::t
0410: 6f 6f 6c 73 3a 3a 74 72 6f 75 62 6c 65 20 20 20  ools::trouble   
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0430: 20 3b 20 23 20 45 72 72 6f 72 20 72 65 70 6f 72   ; # Error repor
0440: 74 69 6e 67 2e 0a 70 61 63 6b 61 67 65 20 72 65  ting..package re
0450: 71 75 69 72 65 20 76 63 3a 3a 74 6f 6f 6c 73 3a  quire vc::tools:
0460: 3a 6c 6f 67 20 20 20 20 20 20 20 20 20 20 20 20  :log            
0470: 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23 20              ; # 
0480: 55 73 65 72 20 66 65 65 64 62 61 63 6b 2e 0a 70  User feedback..p
0490: 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 76  ackage require v
04a0: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72  c::fossil::impor
04b0: 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 20 20 20  t::cvs::state   
04c0: 20 20 20 20 20 3b 20 23 20 53 74 61 74 65 20 73       ; # State s
04d0: 74 6f 72 61 67 65 2e 0a 70 61 63 6b 61 67 65 20  torage..package 
04e0: 72 65 71 75 69 72 65 20 76 63 3a 3a 66 6f 73 73  require vc::foss
04f0: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a  il::import::cvs:
0500: 3a 69 6e 74 65 67 72 69 74 79 20 20 20 20 3b 20  :integrity    ; 
0510: 23 20 53 74 61 74 65 20 69 6e 74 65 67 72 69 74  # State integrit
0520: 79 20 63 68 65 63 6b 73 2e 0a 0a 23 20 23 20 23  y checks...# # #
0530: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
0540: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
0550: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
0560: 23 23 23 23 23 23 23 23 0a 23 23 0a 0a 73 6e 69  ########.##..sni
0570: 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f  t::type ::vc::fo
0580: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
0590: 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 20  s::project::rev 
05a0: 7b 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23  {.    # # ## ###
05b0: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20   ##### ######## 
05c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 20  #############.  
05d0: 20 20 23 23 20 50 75 62 6c 69 63 20 41 50 49 0a    ## Public API.
05e0: 0a 20 20 20 20 63 6f 6e 73 74 72 75 63 74 6f 72  .    constructor
05f0: 20 7b 70 72 6f 6a 65 63 74 20 63 73 74 79 70 65   {project cstype
0600: 20 73 72 63 69 64 20 69 74 65 6d 73 20 7b 74 68   srcid items {th
0610: 65 69 64 20 7b 7d 7d 7d 20 7b 0a 09 69 66 20 7b  eid {}}} {..if {
0620: 24 74 68 65 69 64 20 6e 65 20 22 22 7d 20 7b 0a  $theid ne ""} {.
0630: 09 20 20 20 20 73 65 74 20 6d 79 69 64 20 24 74  .    set myid $t
0640: 68 65 69 64 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  heid..} else {..
0650: 20 20 20 20 73 65 74 20 6d 79 69 64 20 5b 69 6e      set myid [in
0660: 63 72 20 6d 79 63 6f 75 6e 74 65 72 5d 0a 09 7d  cr mycounter]..}
0670: 0a 0a 09 69 6e 74 65 67 72 69 74 79 20 61 73 73  ...integrity ass
0680: 65 72 74 20 7b 0a 09 20 20 20 20 5b 69 6e 66 6f  ert {..    [info
0690: 20 65 78 69 73 74 73 20 6d 79 63 73 74 79 70 65   exists mycstype
06a0: 28 24 63 73 74 79 70 65 29 5d 0a 09 7d 20 7b 42  ($cstype)]..} {B
06b0: 61 64 20 63 68 61 6e 67 65 73 65 74 20 74 79 70  ad changeset typ
06c0: 65 20 27 24 63 73 74 79 70 65 27 2e 7d 0a 0a 09  e '$cstype'.}...
06d0: 73 65 74 20 6d 79 70 72 6f 6a 65 63 74 20 20 20  set myproject   
06e0: 24 70 72 6f 6a 65 63 74 0a 09 73 65 74 20 6d 79  $project..set my
06f0: 74 79 70 65 20 20 20 20 20 20 24 63 73 74 79 70  type      $cstyp
0700: 65 0a 09 73 65 74 20 6d 79 74 79 70 65 6f 62 6a  e..set mytypeobj
0710: 20 20 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a     ::vc::fossil:
0720: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72  :import::cvs::pr
0730: 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 24 7b 63 73  oject::rev::${cs
0740: 74 79 70 65 7d 0a 09 73 65 74 20 6d 79 73 72 63  type}..set mysrc
0750: 69 64 09 24 73 72 63 69 64 0a 09 73 65 74 20 6d  id.$srcid..set m
0760: 79 69 74 65 6d 73 20 20 20 20 20 24 69 74 65 6d  yitems     $item
0770: 73 0a 09 73 65 74 20 6d 79 70 6f 73 20 20 20 20  s..set mypos    
0780: 20 20 20 7b 7d 20 3b 20 23 20 43 6f 6d 6d 69 74     {} ; # Commit
0790: 20 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6e 6f 74   location is not
07a0: 20 6b 6e 6f 77 6e 20 79 65 74 2e 0a 0a 09 23 20   known yet....# 
07b0: 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
07c0: 65 20 67 65 6e 65 72 61 74 65 64 20 63 68 61 6e  e generated chan
07d0: 67 65 73 65 74 73 20 61 6e 64 20 6f 66 20 74 68  gesets and of th
07e0: 65 20 69 6e 76 65 72 73 65 0a 09 23 20 6d 61 70  e inverse..# map
07f0: 70 69 6e 67 20 66 72 6f 6d 20 69 74 65 6d 73 20  ping from items 
0800: 74 6f 20 74 68 65 6d 2e 0a 09 6c 61 70 70 65 6e  to them...lappen
0810: 64 20 6d 79 63 68 61 6e 67 65 73 65 74 73 20 20  d mychangesets  
0820: 20 24 73 65 6c 66 0a 09 73 65 74 20 20 20 20 20   $self..set     
0830: 6d 79 69 64 6d 61 70 28 24 6d 79 69 64 29 20 24  myidmap($myid) $
0840: 73 65 6c 66 0a 09 66 6f 72 65 61 63 68 20 69 69  self..foreach ii
0850: 64 20 24 69 74 65 6d 73 20 7b 0a 09 20 20 20 20  d $items {..    
0860: 73 65 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 63  set key [list $c
0870: 73 74 79 70 65 20 24 69 69 64 5d 0a 09 20 20 20  stype $iid]..   
0880: 20 73 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24   set myitemmap($
0890: 6b 65 79 29 20 24 73 65 6c 66 0a 09 20 20 20 20  key) $self..    
08a0: 6c 61 70 70 65 6e 64 20 6d 79 74 69 74 65 6d 73  lappend mytitems
08b0: 20 24 6b 65 79 0a 09 20 20 20 20 6c 6f 67 20 77   $key..    log w
08c0: 72 69 74 65 20 38 20 63 73 65 74 73 20 7b 4d 41  rite 8 csets {MA
08d0: 50 2b 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24  P+ item <$key> $
08e0: 73 65 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74  self = [$self st
08f0: 72 5d 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20  r]}..}..return. 
0900: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64     }..    method
0910: 20 73 74 72 20 7b 7d 20 7b 0a 09 73 65 74 20 73   str {} {..set s
0920: 74 72 20 20 20 20 22 3c 22 0a 09 73 65 74 20 64  tr    "<"..set d
0930: 65 74 61 69 6c 20 22 22 0a 09 69 66 20 7b 5b 24  etail ""..if {[$
0940: 6d 79 74 79 70 65 6f 62 6a 20 62 79 73 79 6d 62  mytypeobj bysymb
0950: 6f 6c 5d 7d 20 7b 0a 09 20 20 20 20 73 65 74 20  ol]} {..    set 
0960: 64 65 74 61 69 6c 20 22 20 27 5b 73 74 61 74 65  detail " '[state
0970: 20 6f 6e 65 20 7b 0a 09 09 53 45 4c 45 43 54 20   one {...SELECT 
0980: 53 2e 6e 61 6d 65 0a 09 09 46 52 4f 4d 20 20 20  S.name...FROM   
0990: 73 79 6d 62 6f 6c 20 53 0a 09 09 57 48 45 52 45  symbol S...WHERE
09a0: 20 20 53 2e 73 69 64 20 3d 20 24 6d 79 73 72 63    S.sid = $mysrc
09b0: 69 64 0a 09 20 20 20 20 7d 5d 27 22 0a 09 7d 0a  id..    }]'"..}.
09c0: 09 61 70 70 65 6e 64 20 73 74 72 20 22 24 6d 79  .append str "$my
09d0: 74 79 70 65 20 24 7b 6d 79 69 64 7d 24 7b 64 65  type ${myid}${de
09e0: 74 61 69 6c 7d 3e 22 0a 09 72 65 74 75 72 6e 20  tail}>"..return 
09f0: 24 73 74 72 0a 20 20 20 20 7d 0a 0a 20 20 20 20  $str.    }..    
0a00: 6d 65 74 68 6f 64 20 69 64 20 20 20 20 7b 7d 20  method id    {} 
0a10: 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 64 20 7d  { return $myid }
0a20: 0a 20 20 20 20 6d 65 74 68 6f 64 20 69 74 65 6d  .    method item
0a30: 73 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d  s {} { return $m
0a40: 79 74 69 74 65 6d 73 20 7d 0a 20 20 20 20 6d 65  ytitems }.    me
0a50: 74 68 6f 64 20 64 61 74 61 20 20 7b 7d 20 7b 20  thod data  {} { 
0a60: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 6d 79  return [list $my
0a70: 70 72 6f 6a 65 63 74 20 24 6d 79 74 79 70 65 20  project $mytype 
0a80: 24 6d 79 73 72 63 69 64 5d 20 7d 0a 0a 20 20 20  $mysrcid] }..   
0a90: 20 64 65 6c 65 67 61 74 65 20 6d 65 74 68 6f 64   delegate method
0aa0: 20 62 79 73 79 6d 62 6f 6c 20 20 20 74 6f 20 6d   bysymbol   to m
0ab0: 79 74 79 70 65 6f 62 6a 0a 20 20 20 20 64 65 6c  ytypeobj.    del
0ac0: 65 67 61 74 65 20 6d 65 74 68 6f 64 20 62 79 72  egate method byr
0ad0: 65 76 69 73 69 6f 6e 20 74 6f 20 6d 79 74 79 70  evision to mytyp
0ae0: 65 6f 62 6a 0a 20 20 20 20 64 65 6c 65 67 61 74  eobj.    delegat
0af0: 65 20 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63  e method isbranc
0b00: 68 20 20 20 74 6f 20 6d 79 74 79 70 65 6f 62 6a  h   to mytypeobj
0b10: 0a 20 20 20 20 64 65 6c 65 67 61 74 65 20 6d 65  .    delegate me
0b20: 74 68 6f 64 20 69 73 74 61 67 20 20 20 20 20 20  thod istag      
0b30: 74 6f 20 6d 79 74 79 70 65 6f 62 6a 0a 0a 20 20  to mytypeobj..  
0b40: 20 20 6d 65 74 68 6f 64 20 73 65 74 70 6f 73 20    method setpos 
0b50: 7b 70 7d 20 7b 20 73 65 74 20 6d 79 70 6f 73 20  {p} { set mypos 
0b60: 24 70 20 3b 20 72 65 74 75 72 6e 20 7d 0a 20 20  $p ; return }.  
0b70: 20 20 6d 65 74 68 6f 64 20 70 6f 73 20 20 20 20    method pos    
0b80: 7b 7d 20 20 7b 20 72 65 74 75 72 6e 20 24 6d 79  {}  { return $my
0b90: 70 6f 73 20 7d 0a 0a 20 20 20 20 23 20 72 65 73  pos }..    # res
0ba0: 75 6c 74 20 3d 20 64 69 63 74 20 28 69 74 65 6d  ult = dict (item
0bb0: 20 2d 3e 20 6c 69 73 74 20 28 63 68 61 6e 67 65   -> list (change
0bc0: 73 65 74 29 29 0a 20 20 20 20 6d 65 74 68 6f 64  set)).    method
0bd0: 20 73 75 63 63 65 73 73 6f 72 6d 61 70 20 7b 7d   successormap {}
0be0: 20 7b 0a 09 23 20 4e 4f 54 45 20 2f 20 46 55 54   {..# NOTE / FUT
0bf0: 55 52 45 3a 20 50 6f 73 73 69 62 6c 65 20 62 6f  URE: Possible bo
0c00: 74 74 6c 65 6e 65 63 6b 2e 0a 09 61 72 72 61 79  ttleneck...array
0c10: 20 73 65 74 20 74 6d 70 20 7b 7d 0a 09 66 6f 72   set tmp {}..for
0c20: 65 61 63 68 20 7b 72 65 76 20 63 68 69 6c 64 72  each {rev childr
0c30: 65 6e 7d 20 5b 24 73 65 6c 66 20 6e 65 78 74 6d  en} [$self nextm
0c40: 61 70 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65 61  ap] {..    forea
0c50: 63 68 20 63 68 69 6c 64 20 24 63 68 69 6c 64 72  ch child $childr
0c60: 65 6e 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 74  en {...lappend t
0c70: 6d 70 28 24 72 65 76 29 20 24 6d 79 69 74 65 6d  mp($rev) $myitem
0c80: 6d 61 70 28 24 63 68 69 6c 64 29 0a 09 20 20 20  map($child)..   
0c90: 20 7d 0a 09 20 20 20 20 73 65 74 20 74 6d 70 28   }..    set tmp(
0ca0: 24 72 65 76 29 20 5b 6c 73 6f 72 74 20 2d 75 6e  $rev) [lsort -un
0cb0: 69 71 75 65 20 24 74 6d 70 28 24 72 65 76 29 5d  ique $tmp($rev)]
0cc0: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b 61 72 72  ..}..return [arr
0cd0: 61 79 20 67 65 74 20 74 6d 70 5d 0a 20 20 20 20  ay get tmp].    
0ce0: 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20  }..    # result 
0cf0: 3d 20 6c 69 73 74 20 28 63 68 61 6e 67 65 73 65  = list (changese
0d00: 74 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 75  t).    method su
0d10: 63 63 65 73 73 6f 72 73 20 7b 7d 20 7b 0a 09 23  ccessors {} {..#
0d20: 20 4e 4f 54 45 20 2f 20 46 55 54 55 52 45 3a 20   NOTE / FUTURE: 
0d30: 50 6f 73 73 69 62 6c 65 20 62 6f 74 74 6c 65 6e  Possible bottlen
0d40: 65 63 6b 2e 0a 09 73 65 74 20 63 73 65 74 73 20  eck...set csets 
0d50: 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 5f 20 63  {}..foreach {_ c
0d60: 68 69 6c 64 72 65 6e 7d 20 5b 24 73 65 6c 66 20  hildren} [$self 
0d70: 6e 65 78 74 6d 61 70 5d 20 7b 0a 09 20 20 20 20  nextmap] {..    
0d80: 66 6f 72 65 61 63 68 20 63 68 69 6c 64 20 24 63  foreach child $c
0d90: 68 69 6c 64 72 65 6e 20 7b 0a 09 09 6c 61 70 70  hildren {...lapp
0da0: 65 6e 64 20 63 73 65 74 73 20 24 6d 79 69 74 65  end csets $myite
0db0: 6d 6d 61 70 28 24 63 68 69 6c 64 29 0a 09 20 20  mmap($child)..  
0dc0: 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b    }..}..return [
0dd0: 6c 73 6f 72 74 20 2d 75 6e 69 71 75 65 20 24 63  lsort -unique $c
0de0: 73 65 74 73 5d 0a 20 20 20 20 7d 0a 0a 20 20 20  sets].    }..   
0df0: 20 23 20 72 65 73 75 6c 74 20 3d 20 64 69 63 74   # result = dict
0e00: 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28   (item -> list (
0e10: 63 68 61 6e 67 65 73 65 74 29 29 0a 20 20 20 20  changeset)).    
0e20: 6d 65 74 68 6f 64 20 70 72 65 64 65 63 65 73 73  method predecess
0e30: 6f 72 6d 61 70 20 7b 7d 20 7b 0a 09 23 20 4e 4f  ormap {} {..# NO
0e40: 54 45 20 2f 20 46 55 54 55 52 45 3a 20 50 6f 73  TE / FUTURE: Pos
0e50: 73 69 62 6c 65 20 62 6f 74 74 6c 65 6e 65 63 6b  sible bottleneck
0e60: 2e 0a 09 61 72 72 61 79 20 73 65 74 20 74 6d 70  ...array set tmp
0e70: 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 65   {}..foreach {re
0e80: 76 20 63 68 69 6c 64 72 65 6e 7d 20 5b 24 73 65  v children} [$se
0e90: 6c 66 20 70 72 65 6d 61 70 5d 20 7b 0a 09 20 20  lf premap] {..  
0ea0: 20 20 66 6f 72 65 61 63 68 20 63 68 69 6c 64 20    foreach child 
0eb0: 24 63 68 69 6c 64 72 65 6e 20 7b 0a 09 09 6c 61  $children {...la
0ec0: 70 70 65 6e 64 20 74 6d 70 28 24 72 65 76 29 20  ppend tmp($rev) 
0ed0: 24 6d 79 69 74 65 6d 6d 61 70 28 24 63 68 69 6c  $myitemmap($chil
0ee0: 64 29 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73  d)..    }..    s
0ef0: 65 74 20 74 6d 70 28 24 72 65 76 29 20 5b 6c 73  et tmp($rev) [ls
0f00: 6f 72 74 20 2d 75 6e 69 71 75 65 20 24 74 6d 70  ort -unique $tmp
0f10: 28 24 72 65 76 29 5d 0a 09 7d 0a 09 72 65 74 75  ($rev)]..}..retu
0f20: 72 6e 20 5b 61 72 72 61 79 20 67 65 74 20 74 6d  rn [array get tm
0f30: 70 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  p].    }..    # 
0f40: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74  item -> list (it
0f50: 65 6d 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 6e  em).    method n
0f60: 65 78 74 6d 61 70 20 7b 7d 20 7b 0a 09 69 66 20  extmap {} {..if 
0f70: 7b 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 6e 65 78  {[llength $mynex
0f80: 74 6d 61 70 5d 7d 20 7b 20 72 65 74 75 72 6e 20  tmap]} { return 
0f90: 24 6d 79 6e 65 78 74 6d 61 70 20 7d 0a 09 24 6d  $mynextmap }..$m
0fa0: 79 74 79 70 65 6f 62 6a 20 73 75 63 63 65 73 73  ytypeobj success
0fb0: 6f 72 73 20 74 6d 70 20 24 6d 79 69 74 65 6d 73  ors tmp $myitems
0fc0: 0a 09 73 65 74 20 6d 79 6e 65 78 74 6d 61 70 20  ..set mynextmap 
0fd0: 5b 61 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a  [array get tmp].
0fe0: 09 72 65 74 75 72 6e 20 24 6d 79 6e 65 78 74 6d  .return $mynextm
0ff0: 61 70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  ap.    }..    # 
1000: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74  item -> list (it
1010: 65 6d 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 70  em).    method p
1020: 72 65 6d 61 70 20 7b 7d 20 7b 0a 09 69 66 20 7b  remap {} {..if {
1030: 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 70 72 65 6d  [llength $myprem
1040: 61 70 5d 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d  ap]} { return $m
1050: 79 70 72 65 6d 61 70 20 7d 0a 09 24 6d 79 74 79  ypremap }..$myty
1060: 70 65 6f 62 6a 20 70 72 65 64 65 63 65 73 73 6f  peobj predecesso
1070: 72 73 20 74 6d 70 20 24 6d 79 69 74 65 6d 73 0a  rs tmp $myitems.
1080: 09 73 65 74 20 6d 79 70 72 65 6d 61 70 20 5b 61  .set mypremap [a
1090: 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 09 72  rray get tmp]..r
10a0: 65 74 75 72 6e 20 24 6d 79 70 72 65 6d 61 70 0a  eturn $mypremap.
10b0: 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f      }..    metho
10c0: 64 20 62 72 65 61 6b 69 6e 74 65 72 6e 61 6c 64  d breakinternald
10d0: 65 70 65 6e 64 65 6e 63 69 65 73 20 7b 7d 20 7b  ependencies {} {
10e0: 0a 09 23 20 54 68 69 73 20 6d 65 74 68 6f 64 20  ..# This method 
10f0: 69 6e 73 70 65 63 74 73 20 74 68 65 20 63 68 61  inspects the cha
1100: 6e 67 65 73 65 74 73 20 66 6f 72 20 69 6e 74 65  ngesets for inte
1110: 72 6e 61 6c 0a 09 23 20 64 65 70 65 6e 64 65 6e  rnal..# dependen
1120: 63 69 65 73 2e 20 4e 6f 74 68 69 6e 67 20 69 73  cies. Nothing is
1130: 20 64 6f 6e 65 20 69 66 20 74 68 65 72 65 20 61   done if there a
1140: 72 65 20 6e 6f 0a 09 23 20 73 75 63 68 2e 20 4f  re no..# such. O
1150: 74 68 65 72 77 69 73 65 20 74 68 65 20 63 68 61  therwise the cha
1160: 6e 67 65 73 65 74 20 69 73 20 73 70 6c 69 74 20  ngeset is split 
1170: 69 6e 74 6f 20 61 20 73 65 74 20 6f 66 0a 09 23  into a set of..#
1180: 20 66 72 61 67 6d 65 6e 74 73 20 77 69 74 68 6f   fragments witho
1190: 75 74 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65  ut internal depe
11a0: 6e 64 65 6e 63 69 65 73 2c 20 74 72 61 6e 73 66  ndencies, transf
11b0: 6f 72 6d 69 6e 67 20 74 68 65 0a 09 23 20 69 6e  orming the..# in
11c0: 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63  ternal dependenc
11d0: 69 65 73 20 69 6e 74 6f 20 65 78 74 65 72 6e 61  ies into externa
11e0: 6c 20 6f 6e 65 73 2e 20 54 68 65 20 6e 65 77 20  l ones. The new 
11f0: 63 68 61 6e 67 65 73 65 74 73 0a 09 23 20 61 72  changesets..# ar
1200: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c  e added to the l
1210: 69 73 74 20 6f 66 20 61 6c 6c 20 63 68 61 6e 67  ist of all chang
1220: 65 73 65 74 73 2e 0a 0a 09 23 20 57 65 20 70 65  esets....# We pe
1230: 72 66 6f 72 6d 20 61 6c 6c 20 6e 65 63 65 73 73  rform all necess
1240: 61 72 79 20 73 70 6c 69 74 73 20 69 6e 20 6f 6e  ary splits in on
1250: 65 20 67 6f 2c 20 69 6e 73 74 65 61 64 20 6f 66  e go, instead of
1260: 20 6f 6e 6c 79 0a 09 23 20 6f 6e 65 2e 20 54 68   only..# one. Th
1270: 65 20 70 72 65 76 69 6f 75 73 20 61 6c 67 6f 72  e previous algor
1280: 69 74 68 6d 2c 20 61 64 61 70 74 65 64 20 66 72  ithm, adapted fr
1290: 6f 6d 20 63 76 73 32 73 76 6e 2c 20 63 6f 6d 70  om cvs2svn, comp
12a0: 75 74 65 64 0a 09 23 20 61 20 6c 6f 74 20 6f 66  uted..# a lot of
12b0: 20 73 74 61 74 65 20 77 68 69 63 68 20 77 61 73   state which was
12c0: 20 74 68 72 6f 77 6e 20 61 77 61 79 20 61 6e 64   thrown away and
12d0: 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 64 20 61   then computed a
12e0: 67 61 69 6e 0a 09 23 20 66 6f 72 20 65 61 63 68  gain..# for each
12f0: 20 6f 66 20 74 68 65 20 66 72 61 67 6d 65 6e 74   of the fragment
1300: 73 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20  s. It should be 
1310: 65 61 73 69 65 72 20 74 6f 20 75 70 64 61 74 65  easier to update
1320: 20 61 6e 64 0a 09 23 20 72 65 75 73 65 20 74 68   and..# reuse th
1330: 61 74 20 73 74 61 74 65 2e 0a 0a 09 23 20 54 68  at state....# Th
1340: 65 20 63 6f 64 65 20 63 68 65 63 6b 73 20 6f 6e  e code checks on
1350: 6c 79 20 73 75 63 65 73 73 6f 72 20 64 65 70 65  ly sucessor depe
1360: 6e 64 65 6e 63 69 65 73 2c 20 61 73 20 74 68 69  ndencies, as thi
1370: 73 0a 09 23 20 61 75 74 6f 6d 61 74 69 63 61 6c  s..# automatical
1380: 6c 79 20 63 6f 76 65 72 73 20 74 68 65 20 70 72  ly covers the pr
1390: 65 64 65 63 65 73 73 6f 72 20 64 65 70 65 6e 64  edecessor depend
13a0: 65 6e 63 69 65 73 20 61 73 20 77 65 6c 6c 20 28  encies as well (
13b0: 41 0a 09 23 20 73 75 63 63 65 73 73 6f 72 20 64  A..# successor d
13c0: 65 70 65 6e 64 65 6e 63 79 20 61 20 2d 3e 20 62  ependency a -> b
13d0: 20 69 73 20 61 6c 73 6f 20 61 20 70 72 65 64 65   is also a prede
13e0: 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63  cessor dependenc
13f0: 79 0a 09 23 20 62 20 2d 3e 20 61 29 2e 0a 0a 09  y..# b -> a)....
1400: 23 20 41 72 72 61 79 20 6f 66 20 64 65 70 65 6e  # Array of depen
1410: 64 65 6e 63 69 65 73 20 28 70 61 72 65 6e 74 20  dencies (parent 
1420: 2d 3e 20 63 68 69 6c 64 29 2e 20 54 68 69 73 20  -> child). This 
1430: 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 0a 09  is pulled from..
1440: 23 20 74 68 65 20 73 74 61 74 65 2c 20 61 6e 64  # the state, and
1450: 20 6c 69 6d 69 74 65 64 20 74 6f 20 73 75 63 63   limited to succ
1460: 65 73 73 6f 72 73 20 77 69 74 68 69 6e 20 74 68  essors within th
1470: 65 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 61  e changeset....a
1480: 72 72 61 79 20 73 65 74 20 64 65 70 65 6e 64 65  rray set depende
1490: 6e 63 69 65 73 20 7b 7d 0a 09 24 6d 79 74 79 70  ncies {}..$mytyp
14a0: 65 6f 62 6a 20 69 6e 74 65 72 6e 61 6c 73 75 63  eobj internalsuc
14b0: 63 65 73 73 6f 72 73 20 64 65 70 65 6e 64 65 6e  cessors dependen
14c0: 63 69 65 73 20 24 6d 79 69 74 65 6d 73 0a 09 69  cies $myitems..i
14d0: 66 20 7b 21 5b 61 72 72 61 79 20 73 69 7a 65 20  f {![array size 
14e0: 64 65 70 65 6e 64 65 6e 63 69 65 73 5d 7d 20 7b  dependencies]} {
14f0: 72 65 74 75 72 6e 20 30 7d 20 3b 20 23 20 4e 6f  return 0} ; # No
1500: 74 68 69 6e 67 20 74 6f 20 62 72 65 61 6b 2e 0a  thing to break..
1510: 0a 09 6c 6f 67 20 77 72 69 74 65 20 35 20 63 73  ..log write 5 cs
1520: 65 74 73 20 2e 2e 2e 5b 24 73 65 6c 66 20 73 74  ets ...[$self st
1530: 72 5d 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  r]..............
1540: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1550: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1560: 2e 2e 2e 2e 2e 2e 2e 2e 2e 0a 0a 09 23 20 57 65  ............# We
1570: 20 68 61 76 65 20 69 6e 74 65 72 6e 61 6c 20 64   have internal d
1580: 65 70 65 6e 64 65 6e 63 69 65 73 20 74 6f 20 62  ependencies to b
1590: 72 65 61 6b 2e 20 57 65 20 6e 6f 77 20 69 74 65  reak. We now ite
15a0: 72 61 74 65 20 6f 76 65 72 0a 09 23 20 61 6c 6c  rate over..# all
15b0: 20 70 6f 73 69 74 69 6f 6e 73 20 69 6e 20 74 68   positions in th
15c0: 65 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73  e list (which is
15d0: 20 63 68 72 6f 6e 6f 6c 6f 67 69 63 61 6c 2c 20   chronological, 
15e0: 61 74 20 6c 65 61 73 74 0a 09 23 20 61 73 20 66  at least..# as f
15f0: 61 72 20 61 73 20 74 68 65 20 74 69 6d 65 73 74  ar as the timest
1600: 61 6d 70 73 20 61 72 65 20 63 6f 72 72 65 63 74  amps are correct
1610: 20 61 6e 64 20 75 6e 69 71 75 65 29 20 61 6e 64   and unique) and
1620: 0a 09 23 20 64 65 74 65 72 6d 69 6e 65 20 74 68  ..# determine th
1630: 65 20 62 65 73 74 20 70 6f 73 69 74 69 6f 6e 20  e best position 
1640: 66 6f 72 20 74 68 65 20 62 72 65 61 6b 2c 20 62  for the break, b
1650: 79 20 74 72 79 69 6e 67 20 74 6f 0a 09 23 20 62  y trying to..# b
1660: 72 65 61 6b 20 61 73 20 6d 61 6e 79 20 64 65 70  reak as many dep
1670: 65 6e 64 65 6e 63 69 65 73 20 61 73 20 70 6f 73  endencies as pos
1680: 73 69 62 6c 65 20 69 6e 20 6f 6e 65 20 67 6f 2e  sible in one go.
1690: 20 57 68 65 6e 20 61 0a 09 23 20 62 72 65 61 6b   When a..# break
16a0: 20 77 61 73 20 66 6f 75 6e 64 20 74 68 69 73 20   was found this 
16b0: 69 73 20 72 65 64 6f 6e 65 20 66 6f 72 20 74 68  is redone for th
16c0: 65 20 66 72 61 67 6d 65 6e 74 73 20 63 6f 6d 69  e fragments comi
16d0: 6e 67 20 61 6e 64 0a 09 23 20 61 66 74 65 72 2c  ng and..# after,
16e0: 20 61 66 74 65 72 20 75 70 64 69 6e 67 20 74 68   after upding th
16f0: 65 20 63 72 6f 73 73 69 6e 67 20 69 6e 66 6f 72  e crossing infor
1700: 6d 61 74 69 6f 6e 2e 0a 0a 09 23 20 44 61 74 61  mation....# Data
1710: 20 73 74 72 75 63 74 75 72 65 73 3a 0a 09 23 20   structures:..# 
1720: 4d 61 70 3a 20 20 50 4f 53 20 20 20 72 65 76 69  Map:  POS   revi
1730: 73 69 6f 6e 20 69 64 20 20 20 20 20 20 2d 3e 20  sion id      -> 
1740: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73 74  position in list
1750: 2e 0a 09 23 20 20 20 20 20 20 20 43 52 4f 53 53  ...#       CROSS
1760: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73   position in lis
1770: 74 20 2d 3e 20 6e 75 6d 62 65 72 20 6f 66 20 64  t -> number of d
1780: 65 70 65 6e 64 65 6e 63 69 65 73 20 63 72 6f 73  ependencies cros
1790: 73 69 6e 67 20 69 74 0a 09 23 20 20 20 20 20 20  sing it..#      
17a0: 20 44 45 50 43 20 20 64 65 70 65 6e 64 65 6e 63   DEPC  dependenc
17b0: 79 20 20 20 20 20 20 20 2d 3e 20 70 6f 73 69 74  y       -> posit
17c0: 69 6f 6e 73 20 69 74 20 63 72 6f 73 73 65 73 0a  ions it crosses.
17d0: 09 23 20 4c 69 73 74 3a 20 52 41 4e 47 45 20 4f  .# List: RANGE O
17e0: 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  f the positions 
17f0: 69 74 73 65 6c 66 2e 0a 09 23 20 41 20 64 65 70  itself...# A dep
1800: 65 6e 64 65 6e 63 79 20 69 73 20 61 20 73 69 6e  endency is a sin
1810: 67 6c 65 2d 65 6c 65 6d 65 6e 74 20 6d 61 70 20  gle-element map 
1820: 70 61 72 65 6e 74 20 2d 3e 20 63 68 69 6c 64 0a  parent -> child.
1830: 0a 09 49 6e 69 74 69 61 6c 69 7a 65 42 72 65 61  ..InitializeBrea
1840: 6b 53 74 61 74 65 20 24 6d 79 69 74 65 6d 73 0a  kState $myitems.
1850: 0a 09 73 65 74 20 66 72 61 67 6d 65 6e 74 73 20  ..set fragments 
1860: 7b 7d 0a 09 73 65 74 20 70 65 6e 64 69 6e 67 20  {}..set pending 
1870: 20 20 5b 6c 69 73 74 20 24 72 61 6e 67 65 5d 0a    [list $range].
1880: 09 73 65 74 20 61 74 20 20 20 20 20 20 20 20 30  .set at        0
1890: 0a 09 61 72 72 61 79 20 73 65 74 20 62 72 65 61  ..array set brea
18a0: 6b 73 20 7b 7d 0a 0a 09 77 68 69 6c 65 20 7b 24  ks {}...while {$
18b0: 61 74 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24 70  at < [llength $p
18c0: 65 6e 64 69 6e 67 5d 7d 20 7b 0a 09 20 20 20 20  ending]} {..    
18d0: 73 65 74 20 63 75 72 72 65 6e 74 20 5b 6c 69 6e  set current [lin
18e0: 64 65 78 20 24 70 65 6e 64 69 6e 67 20 24 61 74  dex $pending $at
18f0: 5d 0a 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74  ]...    log writ
1900: 65 20 36 20 63 73 65 74 73 20 7b 2e 20 2e 20 2e  e 6 csets {. . .
1910: 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e 2e 2e  . ... ..... ....
1920: 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  .... ...........
1930: 2e 2e 7d 0a 09 20 20 20 20 6c 6f 67 20 77 72 69  ..}..    log wri
1940: 74 65 20 36 20 63 73 65 74 73 20 7b 53 63 68 65  te 6 csets {Sche
1950: 64 75 6c 65 64 20 20 20 5b 6a 6f 69 6e 20 5b 50  duled   [join [P
1960: 52 73 20 5b 6c 72 61 6e 67 65 20 24 70 65 6e 64  Rs [lrange $pend
1970: 69 6e 67 20 24 61 74 20 65 6e 64 5d 5d 20 7b 20  ing $at end]] { 
1980: 7d 5d 7d 0a 09 20 20 20 20 6c 6f 67 20 77 72 69  }]}..    log wri
1990: 74 65 20 36 20 63 73 65 74 73 20 7b 43 6f 6e 73  te 6 csets {Cons
19a0: 69 64 65 72 69 6e 67 20 5b 50 52 20 24 63 75 72  idering [PR $cur
19b0: 72 65 6e 74 5d 20 5c 5b 24 61 74 2f 5b 6c 6c 65  rent] \[$at/[lle
19c0: 6e 67 74 68 20 24 70 65 6e 64 69 6e 67 5d 5c 5d  ngth $pending]\]
19d0: 7d 0a 0a 09 20 20 20 20 73 65 74 20 62 65 73 74  }...    set best
19e0: 20 5b 46 69 6e 64 42 65 73 74 42 72 65 61 6b 20   [FindBestBreak 
19f0: 24 63 75 72 72 65 6e 74 5d 0a 0a 09 20 20 20 20  $current]...    
1a00: 69 66 20 7b 24 62 65 73 74 20 3c 20 30 7d 20 7b  if {$best < 0} {
1a10: 0a 09 09 23 20 54 68 65 20 69 6e 73 70 65 63 74  ...# The inspect
1a20: 65 64 20 72 61 6e 67 65 20 68 61 73 20 6e 6f 20  ed range has no 
1a30: 69 6e 74 65 72 6e 61 6c 0a 09 09 23 20 64 65 70  internal...# dep
1a40: 65 6e 64 65 6e 63 69 65 73 2e 20 54 68 69 73 20  endencies. This 
1a50: 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 66 72  is a complete fr
1a60: 61 67 6d 65 6e 74 2e 0a 09 09 6c 61 70 70 65 6e  agment....lappen
1a70: 64 20 66 72 61 67 6d 65 6e 74 73 20 24 63 75 72  d fragments $cur
1a80: 72 65 6e 74 0a 0a 09 09 6c 6f 67 20 77 72 69 74  rent....log writ
1a90: 65 20 36 20 63 73 65 74 73 20 22 4e 6f 20 62 72  e 6 csets "No br
1aa0: 65 61 6b 73 2c 20 66 69 6e 61 6c 22 0a 09 20 20  eaks, final"..  
1ab0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 23 20 53    } else {...# S
1ac0: 70 6c 69 74 20 74 68 65 20 72 61 6e 67 65 20 61  plit the range a
1ad0: 6e 64 20 73 63 68 65 64 75 6c 65 20 74 68 65 20  nd schedule the 
1ae0: 72 65 73 75 6c 74 69 6e 67 20 66 72 61 67 6d 65  resulting fragme
1af0: 6e 74 73 0a 09 09 23 20 66 6f 72 20 66 75 72 74  nts...# for furt
1b00: 68 65 72 20 69 6e 73 70 65 63 74 69 6f 6e 2e 20  her inspection. 
1b10: 52 65 6d 65 6d 62 65 72 20 74 68 65 20 6e 75 6d  Remember the num
1b20: 62 65 72 20 6f 66 0a 09 09 23 20 64 65 70 65 6e  ber of...# depen
1b30: 64 65 6e 63 69 65 73 20 63 75 74 20 62 65 66 6f  dencies cut befo
1b40: 72 65 20 77 65 20 72 65 6d 6f 76 65 20 74 68 65  re we remove the
1b50: 6d 20 66 72 6f 6d 0a 09 09 23 20 63 6f 6e 73 69  m from...# consi
1b60: 64 65 72 61 74 69 6f 6e 2c 20 66 6f 72 20 64 6f  deration, for do
1b70: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 6c 61 74 65  cumentation late
1b80: 72 2e 0a 0a 09 09 73 65 74 20 62 72 65 61 6b 73  r.....set breaks
1b90: 28 24 62 65 73 74 29 20 24 63 72 6f 73 73 28 24  ($best) $cross($
1ba0: 62 65 73 74 29 0a 0a 09 09 6c 6f 67 20 77 72 69  best)....log wri
1bb0: 74 65 20 36 20 63 73 65 74 73 20 22 42 65 73 74  te 6 csets "Best
1bc0: 20 62 72 65 61 6b 20 40 20 24 62 65 73 74 2c 20   break @ $best, 
1bd0: 63 75 74 74 69 6e 67 20 5b 6e 73 70 20 24 63 72  cutting [nsp $cr
1be0: 6f 73 73 28 24 62 65 73 74 29 20 64 65 70 65 6e  oss($best) depen
1bf0: 64 65 6e 63 79 20 64 65 70 65 6e 64 65 6e 63 69  dency dependenci
1c00: 65 73 5d 22 0a 0a 09 09 23 20 4e 6f 74 65 3a 20  es]"....# Note: 
1c10: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 62 65 73  The value of bes
1c20: 74 20 69 73 20 61 6e 20 61 62 6f 6c 75 74 65 20  t is an abolute 
1c30: 6c 6f 63 61 74 69 6f 6e 20 69 6e 0a 09 09 23 20  location in...# 
1c40: 6d 79 69 74 65 6d 73 2e 20 55 73 65 20 74 68 65  myitems. Use the
1c50: 20 73 74 61 72 74 20 6f 66 20 63 75 72 72 65 6e   start of curren
1c60: 74 20 74 6f 20 6d 61 6b 65 20 69 74 20 61 6e 0a  t to make it an.
1c70: 09 09 23 20 69 6e 64 65 78 20 61 62 73 6f 6c 75  ..# index absolu
1c80: 74 65 20 74 6f 20 63 75 72 72 65 6e 74 2e 0a 0a  te to current...
1c90: 09 09 73 65 74 20 62 72 65 6c 20 5b 65 78 70 72  ..set brel [expr
1ca0: 20 7b 24 62 65 73 74 20 2d 20 5b 6c 69 6e 64 65   {$best - [linde
1cb0: 78 20 24 63 75 72 72 65 6e 74 20 30 5d 7d 5d 0a  x $current 0]}].
1cc0: 09 09 73 65 74 20 62 6e 65 78 74 20 24 62 72 65  ..set bnext $bre
1cd0: 6c 20 3b 20 69 6e 63 72 20 62 6e 65 78 74 0a 09  l ; incr bnext..
1ce0: 09 73 65 74 20 66 72 61 67 62 65 66 6f 72 65 20  .set fragbefore 
1cf0: 5b 6c 72 61 6e 67 65 20 24 63 75 72 72 65 6e 74  [lrange $current
1d00: 20 30 20 24 62 72 65 6c 5d 0a 09 09 73 65 74 20   0 $brel]...set 
1d10: 66 72 61 67 61 66 74 65 72 20 20 5b 6c 72 61 6e  fragafter  [lran
1d20: 67 65 20 24 63 75 72 72 65 6e 74 20 24 62 6e 65  ge $current $bne
1d30: 78 74 20 65 6e 64 5d 0a 0a 09 09 6c 6f 67 20 77  xt end]....log w
1d40: 72 69 74 65 20 36 20 63 73 65 74 73 20 22 4e 65  rite 6 csets "Ne
1d50: 77 20 70 69 65 63 65 73 20 20 5b 50 52 20 24 66  w pieces  [PR $f
1d60: 72 61 67 62 65 66 6f 72 65 5d 20 5b 50 52 20 24  ragbefore] [PR $
1d70: 66 72 61 67 61 66 74 65 72 5d 22 0a 0a 09 09 69  fragafter]"....i
1d80: 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20  ntegrity assert 
1d90: 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 72 61 67 62  {[llength $fragb
1da0: 65 66 6f 72 65 5d 7d 20 7b 46 6f 75 6e 64 20 7a  efore]} {Found z
1db0: 65 72 6f 2d 6c 65 6e 67 74 68 20 66 72 61 67 6d  ero-length fragm
1dc0: 65 6e 74 20 61 74 20 74 68 65 20 62 65 67 69 6e  ent at the begin
1dd0: 6e 69 6e 67 7d 0a 09 09 69 6e 74 65 67 72 69 74  ning}...integrit
1de0: 79 20 61 73 73 65 72 74 20 7b 5b 6c 6c 65 6e 67  y assert {[lleng
1df0: 74 68 20 24 66 72 61 67 61 66 74 65 72 5d 7d 20  th $fragafter]} 
1e00: 20 7b 46 6f 75 6e 64 20 7a 65 72 6f 2d 6c 65 6e   {Found zero-len
1e10: 67 74 68 20 66 72 61 67 6d 65 6e 74 20 61 74 20  gth fragment at 
1e20: 74 68 65 20 65 6e 64 7d 0a 0a 09 09 6c 61 70 70  the end}....lapp
1e30: 65 6e 64 20 70 65 6e 64 69 6e 67 20 24 66 72 61  end pending $fra
1e40: 67 62 65 66 6f 72 65 20 24 66 72 61 67 61 66 74  gbefore $fragaft
1e50: 65 72 0a 09 09 43 75 74 41 74 20 24 62 65 73 74  er...CutAt $best
1e60: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 69 6e  ..    }...    in
1e70: 63 72 20 61 74 0a 09 7d 0a 0a 09 6c 6f 67 20 77  cr at..}...log w
1e80: 72 69 74 65 20 36 20 63 73 65 74 73 20 22 2e 20  rite 6 csets ". 
1e90: 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e  . .. ... ..... .
1ea0: 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e  ....... ........
1eb0: 2e 2e 2e 2e 2e 22 0a 0a 09 23 20 28 2a 29 20 57  ....."...# (*) W
1ec0: 65 20 63 6c 65 61 72 20 6f 75 74 20 74 68 65 20  e clear out the 
1ed0: 61 73 73 6f 63 69 61 74 65 64 20 70 61 72 74 20  associated part 
1ee0: 6f 66 20 74 68 65 20 6d 79 69 74 65 6d 6d 61 70  of the myitemmap
1ef0: 0a 09 23 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6e  ..# in-memory in
1f00: 64 65 78 20 69 6e 20 70 72 65 70 61 72 61 74 69  dex in preparati
1f10: 6f 6e 20 66 6f 72 20 6e 65 77 20 64 61 74 61 2e  on for new data.
1f20: 20 41 20 73 69 6d 70 6c 65 20 75 6e 73 65 74 0a   A simple unset.
1f30: 09 23 20 69 73 20 65 6e 6f 75 67 68 2c 20 77 65  .# is enough, we
1f40: 20 68 61 76 65 20 6e 6f 20 73 79 6d 62 6f 6c 20   have no symbol 
1f50: 63 68 61 6e 67 65 73 65 74 73 20 61 74 20 74 68  changesets at th
1f60: 69 73 20 74 69 6d 65 2c 20 61 6e 64 0a 09 23 20  is time, and..# 
1f70: 74 68 75 73 20 6e 65 76 65 72 20 6d 6f 72 65 20  thus never more 
1f80: 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
1f90: 63 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ce in the list..
1fa0: 0a 09 66 6f 72 65 61 63 68 20 69 69 64 20 24 6d  ..foreach iid $m
1fb0: 79 69 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65  yitems {..    se
1fc0: 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79 74  t key [list $myt
1fd0: 79 70 65 20 24 69 69 64 5d 0a 09 20 20 20 20 75  ype $iid]..    u
1fe0: 6e 73 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24  nset myitemmap($
1ff0: 6b 65 79 29 0a 09 20 20 20 20 6c 6f 67 20 77 72  key)..    log wr
2000: 69 74 65 20 38 20 63 73 65 74 73 20 7b 4d 41 50  ite 8 csets {MAP
2010: 2d 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73  - item <$key> $s
2020: 65 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74 72  elf = [$self str
2030: 5d 7d 0a 09 7d 0a 0a 09 23 20 43 72 65 61 74 65  ]}..}...# Create
2040: 20 63 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20   changesets for 
2050: 74 68 65 20 66 72 61 67 6d 65 6e 74 73 2c 20 72  the fragments, r
2060: 65 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65  eusing the curre
2070: 6e 74 20 6f 6e 65 0a 09 23 20 66 6f 72 20 74 68  nt one..# for th
2080: 65 20 66 69 72 73 74 20 66 72 61 67 6d 65 6e 74  e first fragment
2090: 2e 20 57 65 20 73 6f 72 74 20 74 68 65 6d 20 69  . We sort them i
20a0: 6e 20 6f 72 64 65 72 20 74 6f 20 61 6c 6c 6f 77  n order to allow
20b0: 0a 09 23 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  ..# checking for
20c0: 20 67 61 70 73 20 61 6e 64 20 6e 69 63 65 20 6d   gaps and nice m
20d0: 65 73 73 61 67 65 73 2e 0a 0a 09 73 65 74 20 66  essages....set f
20e0: 72 61 67 6d 65 6e 74 73 20 5b 6c 73 6f 72 74 20  ragments [lsort 
20f0: 2d 69 6e 64 65 78 20 30 20 2d 69 6e 74 65 67 65  -index 0 -intege
2100: 72 20 24 66 72 61 67 6d 65 6e 74 73 5d 0a 0a 09  r $fragments]...
2110: 23 70 75 74 73 20 5c 74 2e 5b 6a 6f 69 6e 20 5b  #puts \t.[join [
2120: 50 52 73 20 24 66 72 61 67 6d 65 6e 74 73 5d 20  PRs $fragments] 
2130: 2e 5c 6e 5c 74 2e 5d 2e 0a 0a 09 42 6f 72 64 65  .\n\t.]....Borde
2140: 72 20 5b 6c 69 6e 64 65 78 20 24 66 72 61 67 6d  r [lindex $fragm
2150: 65 6e 74 73 20 30 5d 20 66 69 72 73 74 73 20 66  ents 0] firsts f
2160: 69 72 73 74 65 0a 0a 09 69 6e 74 65 67 72 69 74  irste...integrit
2170: 79 20 61 73 73 65 72 74 20 7b 24 66 69 72 73 74  y assert {$first
2180: 73 20 3d 3d 20 30 7d 20 7b 42 61 64 20 66 72 61  s == 0} {Bad fra
2190: 67 6d 65 6e 74 20 73 74 61 72 74 20 40 20 24 66  gment start @ $f
21a0: 69 72 73 74 73 2c 20 67 61 70 2c 20 6f 72 20 62  irsts, gap, or b
21b0: 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 20  efore beginning 
21c0: 6f 66 20 74 68 65 20 72 61 6e 67 65 7d 0a 0a 09  of the range}...
21d0: 73 65 74 20 6c 61 73 74 65 20 24 66 69 72 73 74  set laste $first
21e0: 65 0a 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d  e..foreach fragm
21f0: 65 6e 74 20 5b 6c 72 61 6e 67 65 20 24 66 72 61  ent [lrange $fra
2200: 67 6d 65 6e 74 73 20 31 20 65 6e 64 5d 20 7b 0a  gments 1 end] {.
2210: 09 20 20 20 20 42 6f 72 64 65 72 20 24 66 72 61  .    Border $fra
2220: 67 6d 65 6e 74 20 73 20 65 0a 09 20 20 20 20 69  gment s e..    i
2230: 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20  ntegrity assert 
2240: 7b 24 6c 61 73 74 65 20 3d 3d 20 28 24 73 20 2d  {$laste == ($s -
2250: 20 31 29 7d 20 7b 42 61 64 20 66 72 61 67 6d 65   1)} {Bad fragme
2260: 6e 74 20 62 6f 72 64 65 72 20 3c 24 6c 61 73 74  nt border <$last
2270: 65 20 7c 20 24 73 3e 2c 20 67 61 70 20 6f 72 20  e | $s>, gap or 
2280: 6f 76 65 72 6c 61 70 7d 0a 0a 09 20 20 20 20 73  overlap}...    s
2290: 65 74 20 6e 65 77 20 5b 24 74 79 70 65 20 25 41  et new [$type %A
22a0: 55 54 4f 25 20 24 6d 79 70 72 6f 6a 65 63 74 20  UTO% $myproject 
22b0: 24 6d 79 74 79 70 65 20 24 6d 79 73 72 63 69 64  $mytype $mysrcid
22c0: 20 5b 6c 72 61 6e 67 65 20 24 6d 79 69 74 65 6d   [lrange $myitem
22d0: 73 20 24 73 20 24 65 5d 5d 0a 0a 20 20 20 20 20  s $s $e]]..     
22e0: 20 20 20 20 20 20 20 6c 6f 67 20 77 72 69 74 65         log write
22f0: 20 34 20 63 73 65 74 73 20 22 42 72 65 61 6b 69   4 csets "Breaki
2300: 6e 67 20 5b 24 73 65 6c 66 20 73 74 72 20 5d 20  ng [$self str ] 
2310: 40 20 24 6c 61 73 74 65 2c 20 6e 65 77 20 5b 24  @ $laste, new [$
2320: 6e 65 77 20 73 74 72 5d 2c 20 63 75 74 74 69 6e  new str], cuttin
2330: 67 20 24 62 72 65 61 6b 73 28 24 6c 61 73 74 65  g $breaks($laste
2340: 29 22 0a 0a 09 20 20 20 20 73 65 74 20 6c 61 73  )"...    set las
2350: 74 65 20 24 65 0a 09 7d 0a 0a 09 69 6e 74 65 67  te $e..}...integ
2360: 72 69 74 79 20 61 73 73 65 72 74 20 7b 0a 09 20  rity assert {.. 
2370: 20 20 20 24 6c 61 73 74 65 20 3d 3d 20 28 5b 6c     $laste == ([l
2380: 6c 65 6e 67 74 68 20 24 6d 79 69 74 65 6d 73 5d  length $myitems]
2390: 2d 31 29 0a 09 7d 20 7b 42 61 64 20 66 72 61 67  -1)..} {Bad frag
23a0: 6d 65 6e 74 20 65 6e 64 20 40 20 24 6c 61 73 74  ment end @ $last
23b0: 65 2c 20 67 61 70 2c 20 6f 72 20 62 65 79 6f 6e  e, gap, or beyon
23c0: 64 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  d end of the ran
23d0: 67 65 7d 0a 0a 09 23 20 50 75 74 20 74 68 65 20  ge}...# Put the 
23e0: 66 69 72 73 74 20 66 72 61 67 6d 65 6e 74 20 69  first fragment i
23f0: 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
2400: 63 68 61 6e 67 65 73 65 74 2c 20 61 6e 64 0a 09  changeset, and..
2410: 23 20 75 70 64 61 74 65 20 74 68 65 20 69 6e 2d  # update the in-
2420: 6d 65 6d 6f 72 79 20 69 6e 64 65 78 2e 20 57 65  memory index. We
2430: 20 63 61 6e 20 73 69 6d 70 6c 79 20 28 72 65 29   can simply (re)
2440: 61 64 64 20 74 68 65 20 69 74 65 6d 73 0a 09 23  add the items..#
2450: 20 62 65 63 61 75 73 65 20 77 65 20 63 6c 65 61   because we clea
2460: 72 65 64 20 74 68 65 20 70 72 65 76 69 6f 75 73  red the previous
2470: 6c 79 20 65 78 69 73 74 69 6e 67 20 69 6e 66 6f  ly existing info
2480: 72 6d 61 74 69 6f 6e 2c 20 73 65 65 0a 09 23 20  rmation, see..# 
2490: 28 2a 29 20 61 62 6f 76 65 2e 20 50 65 72 73 69  (*) above. Persi
24a0: 73 74 65 6e 63 65 20 64 6f 65 73 20 6e 6f 74 20  stence does not 
24b0: 6d 61 74 74 65 72 20 68 65 72 65 2c 20 6e 6f 6e  matter here, non
24c0: 65 20 6f 66 20 74 68 65 0a 09 23 20 63 68 61 6e  e of the..# chan
24d0: 67 65 73 65 74 73 20 68 61 73 20 62 65 65 6e 20  gesets has been 
24e0: 73 61 76 65 64 20 74 6f 20 74 68 65 20 70 65 72  saved to the per
24f0: 73 69 73 74 65 6e 74 20 73 74 61 74 65 20 79 65  sistent state ye
2500: 74 2e 0a 0a 09 73 65 74 20 6d 79 69 74 65 6d 73  t....set myitems
2510: 20 20 5b 6c 72 61 6e 67 65 20 24 6d 79 69 74 65    [lrange $myite
2520: 6d 73 20 20 30 20 24 66 69 72 73 74 65 5d 0a 09  ms  0 $firste]..
2530: 73 65 74 20 6d 79 74 69 74 65 6d 73 20 5b 6c 72  set mytitems [lr
2540: 61 6e 67 65 20 24 6d 79 74 69 74 65 6d 73 20 30  ange $mytitems 0
2550: 20 24 66 69 72 73 74 65 5d 0a 09 66 6f 72 65 61   $firste]..forea
2560: 63 68 20 69 69 64 20 24 6d 79 69 74 65 6d 73 20  ch iid $myitems 
2570: 7b 0a 09 20 20 20 20 73 65 74 20 6b 65 79 20 5b  {..    set key [
2580: 6c 69 73 74 20 24 6d 79 74 79 70 65 20 24 69 69  list $mytype $ii
2590: 64 5d 0a 09 20 20 20 20 73 65 74 20 6d 79 69 74  d]..    set myit
25a0: 65 6d 6d 61 70 28 24 6b 65 79 29 20 24 73 65 6c  emmap($key) $sel
25b0: 66 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65  f..    log write
25c0: 20 38 20 63 73 65 74 73 20 7b 4d 41 50 2b 20 69   8 csets {MAP+ i
25d0: 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73 65 6c 66  tem <$key> $self
25e0: 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d 7d 0a   = [$self str]}.
25f0: 09 7d 0a 0a 09 72 65 74 75 72 6e 20 31 0a 20 20  .}...return 1.  
2600: 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20    }..    method 
2610: 70 65 72 73 69 73 74 20 7b 7d 20 7b 0a 09 73 65  persist {} {..se
2620: 74 20 74 69 64 20 24 6d 79 63 73 74 79 70 65 28  t tid $mycstype(
2630: 24 6d 79 74 79 70 65 29 0a 09 73 65 74 20 70 69  $mytype)..set pi
2640: 64 20 5b 24 6d 79 70 72 6f 6a 65 63 74 20 69 64  d [$myproject id
2650: 5d 0a 09 73 65 74 20 70 6f 73 20 30 0a 0a 09 73  ]..set pos 0...s
2660: 74 61 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tate transaction
2670: 20 7b 0a 09 20 20 20 20 73 74 61 74 65 20 72 75   {..    state ru
2680: 6e 20 7b 0a 09 09 49 4e 53 45 52 54 20 49 4e 54  n {...INSERT INT
2690: 4f 20 63 68 61 6e 67 65 73 65 74 20 28 63 69 64  O changeset (cid
26a0: 2c 20 20 20 70 69 64 2c 20 20 74 79 70 65 2c 20  ,   pid,  type, 
26b0: 73 72 63 29 0a 09 09 56 41 4c 55 45 53 20 20 20  src)...VALUES   
26c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 24 6d               ($m
26d0: 79 69 64 2c 20 24 70 69 64 2c 20 24 74 69 64 2c  yid, $pid, $tid,
26e0: 20 24 6d 79 73 72 63 69 64 29 3b 0a 09 20 20 20   $mysrcid);..   
26f0: 20 7d 0a 0a 09 20 20 20 20 66 6f 72 65 61 63 68   }...    foreach
2700: 20 69 69 64 20 24 6d 79 69 74 65 6d 73 20 7b 0a   iid $myitems {.
2710: 09 09 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09  ..state run {...
2720: 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20      INSERT INTO 
2730: 63 73 69 74 65 6d 20 28 63 69 64 2c 20 20 20 70  csitem (cid,   p
2740: 6f 73 2c 20 20 69 69 64 29 0a 09 09 20 20 20 20  os,  iid)...    
2750: 56 41 4c 55 45 53 20 20 20 20 20 20 20 20 20 20  VALUES          
2760: 20 20 20 28 24 6d 79 69 64 2c 20 24 70 6f 73 2c     ($myid, $pos,
2770: 20 24 69 69 64 29 3b 0a 09 09 7d 0a 09 09 69 6e   $iid);...}...in
2780: 63 72 20 70 6f 73 0a 09 20 20 20 20 7d 0a 09 7d  cr pos..    }..}
2790: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
27a0: 20 20 20 20 6d 65 74 68 6f 64 20 74 69 6d 65 72      method timer
27b0: 61 6e 67 65 20 7b 7d 20 7b 20 72 65 74 75 72 6e  ange {} { return
27c0: 20 5b 24 6d 79 74 79 70 65 6f 62 6a 20 74 69 6d   [$mytypeobj tim
27d0: 65 72 61 6e 67 65 20 24 6d 79 69 74 65 6d 73 5d  erange $myitems]
27e0: 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 64   }..    method d
27f0: 72 6f 70 20 7b 7d 20 7b 0a 09 6c 6f 67 20 77 72  rop {} {..log wr
2800: 69 74 65 20 38 20 63 73 65 74 73 20 7b 44 72 6f  ite 8 csets {Dro
2810: 70 70 69 6e 67 20 24 73 65 6c 66 20 3d 20 5b 24  pping $self = [$
2820: 73 65 6c 66 20 73 74 72 5d 7d 0a 0a 09 73 74 61  self str]}...sta
2830: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b  te transaction {
2840: 0a 09 20 20 20 20 73 74 61 74 65 20 72 75 6e 20  ..    state run 
2850: 7b 0a 09 09 44 45 4c 45 54 45 20 46 52 4f 4d 20  {...DELETE FROM 
2860: 63 68 61 6e 67 65 73 65 74 20 57 48 45 52 45 20  changeset WHERE 
2870: 63 69 64 20 3d 20 24 6d 79 69 64 3b 0a 09 09 44  cid = $myid;...D
2880: 45 4c 45 54 45 20 46 52 4f 4d 20 63 73 69 74 65  ELETE FROM csite
2890: 6d 20 20 20 20 57 48 45 52 45 20 63 69 64 20 3d  m    WHERE cid =
28a0: 20 24 6d 79 69 64 3b 0a 09 20 20 20 20 7d 0a 09   $myid;..    }..
28b0: 7d 0a 09 66 6f 72 65 61 63 68 20 69 69 64 20 24  }..foreach iid $
28c0: 6d 79 69 74 65 6d 73 20 7b 0a 09 20 20 20 20 73  myitems {..    s
28d0: 65 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79  et key [list $my
28e0: 74 79 70 65 20 24 69 69 64 5d 0a 09 20 20 20 20  type $iid]..    
28f0: 75 6e 73 65 74 20 6d 79 69 74 65 6d 6d 61 70 28  unset myitemmap(
2900: 24 6b 65 79 29 0a 09 20 20 20 20 6c 6f 67 20 77  $key)..    log w
2910: 72 69 74 65 20 38 20 63 73 65 74 73 20 7b 4d 41  rite 8 csets {MA
2920: 50 2d 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24  P- item <$key> $
2930: 73 65 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74  self = [$self st
2940: 72 5d 7d 0a 09 7d 0a 09 73 65 74 20 70 6f 73 20  r]}..}..set pos 
2950: 20 20 20 20 20 20 20 20 20 5b 6c 73 65 61 72 63           [lsearc
2960: 68 20 2d 65 78 61 63 74 20 24 6d 79 63 68 61 6e  h -exact $mychan
2970: 67 65 73 65 74 73 20 24 73 65 6c 66 5d 0a 09 73  gesets $self]..s
2980: 65 74 20 6d 79 63 68 61 6e 67 65 73 65 74 73 20  et mychangesets 
2990: 5b 6c 72 65 70 6c 61 63 65 20 24 6d 79 63 68 61  [lreplace $mycha
29a0: 6e 67 65 73 65 74 73 20 24 70 6f 73 20 24 70 6f  ngesets $pos $po
29b0: 73 5d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d  s]..return.    }
29c0: 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 65 6c  ..    method sel
29d0: 66 72 65 66 65 72 65 6e 74 69 61 6c 20 7b 7d 20  freferential {} 
29e0: 7b 0a 09 6c 6f 67 20 77 72 69 74 65 20 39 20 63  {..log write 9 c
29f0: 73 65 74 73 20 7b 43 68 65 63 6b 69 6e 67 20 5b  sets {Checking [
2a00: 24 73 65 6c 66 20 73 74 72 5d 20 2f 5b 6c 6c 65  $self str] /[lle
2a10: 6e 67 74 68 20 24 6d 79 69 74 65 6d 73 5d 7d 0a  ngth $myitems]}.
2a20: 0a 09 69 66 20 7b 21 5b 73 74 72 75 63 74 3a 3a  ..if {![struct::
2a30: 73 65 74 20 63 6f 6e 74 61 69 6e 73 20 5b 24 73  set contains [$s
2a40: 65 6c 66 20 73 75 63 63 65 73 73 6f 72 73 5d 20  elf successors] 
2a50: 24 73 65 6c 66 5d 7d 20 7b 0a 09 20 20 20 20 72  $self]} {..    r
2a60: 65 74 75 72 6e 20 30 0a 09 7d 0a 09 69 66 20 7b  eturn 0..}..if {
2a70: 5b 6c 6f 67 20 76 65 72 62 6f 73 69 74 79 3f 5d  [log verbosity?]
2a80: 20 3c 20 38 7d 20 7b 20 72 65 74 75 72 6e 20 31   < 8} { return 1
2a90: 20 7d 0a 0a 09 23 20 50 72 69 6e 74 20 74 68 65   }...# Print the
2aa0: 20 64 65 74 61 69 6c 65 64 20 73 75 63 63 65 73   detailed succes
2ab0: 73 6f 72 20 73 74 72 75 63 74 75 72 65 20 6f 66  sor structure of
2ac0: 20 74 68 65 20 73 65 6c 66 2d 0a 09 23 20 72 65   the self-..# re
2ad0: 66 65 72 65 6e 74 69 61 6c 20 63 68 61 6e 67 65  ferential change
2ae0: 73 65 74 2c 20 69 66 20 74 68 65 20 76 65 72 62  set, if the verb
2af0: 6f 73 69 74 79 20 6f 66 20 74 68 65 20 6c 6f 67  osity of the log
2b00: 20 69 73 20 64 69 61 6c 65 64 0a 09 23 20 68 69   is dialed..# hi
2b10: 67 68 20 65 6e 6f 75 67 68 2e 0a 0a 09 6c 6f 67  gh enough....log
2b20: 20 77 72 69 74 65 20 38 20 63 73 65 74 73 20 5b   write 8 csets [
2b30: 73 65 74 20 68 64 72 20 7b 53 65 6c 66 2d 72 65  set hdr {Self-re
2b40: 66 65 72 65 6e 74 69 61 6c 20 63 68 61 6e 67 65  ferential change
2b50: 73 65 74 20 5b 24 73 65 6c 66 20 73 74 72 5d 20  set [$self str] 
2b60: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  ________________
2b70: 5f 5f 7d 5d 0a 09 61 72 72 61 79 20 73 65 74 20  __}]..array set 
2b80: 6e 6d 61 70 20 5b 24 73 65 6c 66 20 6e 65 78 74  nmap [$self next
2b90: 6d 61 70 5d 0a 09 66 6f 72 65 61 63 68 20 69 74  map]..foreach it
2ba0: 65 6d 20 5b 6c 73 6f 72 74 20 2d 64 69 63 74 20  em [lsort -dict 
2bb0: 5b 61 72 72 61 79 20 6e 61 6d 65 73 20 6e 6d 61  [array names nma
2bc0: 70 5d 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65 61  p]] {..    forea
2bd0: 63 68 20 73 75 63 63 69 74 65 6d 20 24 6e 6d 61  ch succitem $nma
2be0: 70 28 24 69 74 65 6d 29 20 7b 0a 09 09 73 65 74  p($item) {...set
2bf0: 20 73 75 63 63 63 73 20 24 6d 79 69 74 65 6d 6d   succcs $myitemm
2c00: 61 70 28 24 73 75 63 63 69 74 65 6d 29 0a 09 09  ap($succitem)...
2c10: 73 65 74 20 68 69 6e 74 20 5b 65 78 70 72 20 7b  set hint [expr {
2c20: 28 24 73 75 63 63 63 73 20 65 71 20 24 73 65 6c  ($succcs eq $sel
2c30: 66 29 0a 09 09 09 09 3f 20 22 4c 4f 4f 50 22 0a  f).....? "LOOP".
2c40: 09 09 09 09 3a 20 22 20 20 20 20 22 7d 5d 0a 09  ....: "    "}]..
2c50: 09 73 65 74 20 69 20 20 20 22 3c 24 69 74 65 6d  .set i   "<$item
2c60: 20 5b 24 74 79 70 65 20 69 74 65 6d 73 74 72 20   [$type itemstr 
2c70: 24 69 74 65 6d 5d 3e 22 0a 09 09 73 65 74 20 73  $item]>"...set s
2c80: 20 20 20 22 3c 24 73 75 63 63 69 74 65 6d 20 5b     "<$succitem [
2c90: 24 74 79 70 65 20 69 74 65 6d 73 74 72 20 24 73  $type itemstr $s
2ca0: 75 63 63 69 74 65 6d 5d 3e 22 0a 09 09 73 65 74  uccitem]>"...set
2cb0: 20 73 63 73 20 5b 24 73 75 63 63 63 73 20 73 74   scs [$succcs st
2cc0: 72 5d 0a 09 09 6c 6f 67 20 77 72 69 74 65 20 38  r]...log write 8
2cd0: 20 63 73 65 74 73 20 7b 24 68 69 6e 74 20 2a 20   csets {$hint * 
2ce0: 24 69 20 2d 2d 3e 20 24 73 20 2d 2d 3e 20 63 73  $i --> $s --> cs
2cf0: 20 24 73 63 73 7d 0a 09 20 20 20 20 7d 0a 09 7d   $scs}..    }..}
2d00: 0a 09 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73  ..log write 8 cs
2d10: 65 74 73 20 5b 72 65 67 73 75 62 20 2d 61 6c 6c  ets [regsub -all
2d20: 20 7b 5b 5e 20 09 5d 7d 20 24 68 64 72 20 7b 5f   {[^ .]} $hdr {_
2d30: 7d 5d 0a 09 72 65 74 75 72 6e 20 31 0a 20 20 20  }]..return 1.   
2d40: 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68   }..    typemeth
2d50: 6f 64 20 73 70 6c 69 74 20 7b 63 73 65 74 20 61  od split {cset a
2d60: 72 67 73 7d 20 7b 0a 09 23 20 41 73 20 70 61 72  rgs} {..# As par
2d70: 74 20 6f 66 20 74 68 65 20 63 72 65 61 74 69 6f  t of the creatio
2d80: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 61  n of the new cha
2d90: 6e 67 65 73 65 74 73 20 73 70 65 63 69 66 69 65  ngesets specifie
2da0: 64 20 69 6e 0a 09 23 20 41 52 47 53 20 61 73 20  d in..# ARGS as 
2db0: 73 65 74 73 20 6f 66 20 69 74 65 6d 73 2c 20 61  sets of items, a
2dc0: 6c 6c 20 73 75 62 73 65 74 73 20 6f 66 20 43 53  ll subsets of CS
2dd0: 45 54 27 73 20 69 74 65 6d 20 73 65 74 2c 20 43  ET's item set, C
2de0: 53 45 54 0a 09 23 20 77 69 6c 6c 20 62 65 20 64  SET..# will be d
2df0: 72 6f 70 70 65 64 20 66 72 6f 6d 20 61 6c 6c 20  ropped from all 
2e00: 64 61 74 61 62 61 73 65 73 2c 20 69 6e 20 61 6e  databases, in an
2e10: 64 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2c  d out of memory,
2e20: 0a 09 23 20 61 6e 64 20 74 68 65 6e 20 64 65 73  ..# and then des
2e30: 74 72 6f 79 65 64 2e 0a 09 23 0a 09 23 20 4e 6f  troyed...#..# No
2e40: 74 65 3a 20 54 68 65 20 69 74 65 6d 20 6c 69 73  te: The item lis
2e50: 74 73 20 66 6f 75 6e 64 20 69 6e 20 61 72 67 73  ts found in args
2e60: 20 61 72 65 20 74 61 67 67 65 64 20 69 74 65 6d   are tagged item
2e70: 73 2e 20 54 68 65 79 0a 09 23 20 68 61 76 65 20  s. They..# have 
2e80: 74 6f 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  to have the same
2e90: 20 74 79 70 65 20 61 73 20 74 68 65 20 63 68 61   type as the cha
2ea0: 6e 67 65 73 65 74 2c 20 62 65 69 6e 67 20 73 75  ngeset, being su
2eb0: 62 73 65 74 73 0a 09 23 20 6f 66 20 69 74 73 20  bsets..# of its 
2ec0: 69 74 65 6d 73 2e 20 54 68 69 73 20 69 73 20 63  items. This is c
2ed0: 68 65 63 6b 65 64 20 69 6e 20 55 6e 74 61 67 31  hecked in Untag1
2ee0: 2e 0a 0a 09 23 20 43 6f 6e 73 74 72 61 69 6e 74  ....# Constraint
2ef0: 73 3a 20 4e 6f 20 66 72 61 67 6d 65 6e 74 20 6d  s: No fragment m
2f00: 75 73 74 20 62 65 20 65 6d 70 74 79 2e 20 41 6c  ust be empty. Al
2f10: 6c 20 66 72 61 67 6d 65 6e 74 73 20 68 61 76 65  l fragments have
2f20: 0a 09 23 20 74 6f 20 62 65 20 73 75 62 73 65 74  ..# to be subset
2f30: 73 20 6f 66 20 74 68 65 20 63 73 65 74 2e 20 54  s of the cset. T
2f40: 68 65 20 75 6e 69 6f 6e 20 68 61 73 20 74 6f 20  he union has to 
2f50: 63 6f 76 65 72 20 74 68 65 0a 09 23 20 6f 72 69  cover the..# ori
2f60: 67 69 6e 61 6c 2e 20 41 6c 6c 20 70 61 69 72 77  ginal. All pairw
2f70: 69 73 65 20 69 6e 74 65 72 73 65 63 74 69 6f 6e  ise intersection
2f80: 73 20 68 61 76 65 20 74 6f 20 62 65 20 65 6d 70  s have to be emp
2f90: 74 79 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20  ty....log write 
2fa0: 38 20 63 73 65 74 73 20 7b 4f 4c 44 3a 20 5b 6c  8 csets {OLD: [l
2fb0: 73 6f 72 74 20 5b 24 63 73 65 74 20 69 74 65 6d  sort [$cset item
2fc0: 73 5d 5d 7d 0a 0a 09 73 65 74 20 63 6f 76 65 72  s]]}...set cover
2fd0: 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 66 72 61   {}..foreach fra
2fe0: 67 6d 65 6e 74 69 74 65 6d 73 20 24 61 72 67 73  gmentitems $args
2ff0: 20 7b 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74   {..    log writ
3000: 65 20 38 20 63 73 65 74 73 20 7b 4e 45 57 3a 20  e 8 csets {NEW: 
3010: 5b 6c 73 6f 72 74 20 24 66 72 61 67 6d 65 6e 74  [lsort $fragment
3020: 69 74 65 6d 73 5d 7d 0a 0a 09 20 20 20 20 69 6e  items]}...    in
3030: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b  tegrity assert {
3040: 0a 09 09 21 5b 73 74 72 75 63 74 3a 3a 73 65 74  ...![struct::set
3050: 20 65 6d 70 74 79 20 24 66 72 61 67 6d 65 6e 74   empty $fragment
3060: 69 74 65 6d 73 5d 0a 09 20 20 20 20 7d 20 7b 63  items]..    } {c
3070: 68 61 6e 67 65 73 65 74 20 66 72 61 67 6d 65 6e  hangeset fragmen
3080: 74 20 69 73 20 65 6d 70 74 79 7d 0a 09 20 20 20  t is empty}..   
3090: 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72   integrity asser
30a0: 74 20 7b 0a 09 09 5b 73 74 72 75 63 74 3a 3a 73  t {...[struct::s
30b0: 65 74 20 73 75 62 73 65 74 6f 66 20 24 66 72 61  et subsetof $fra
30c0: 67 6d 65 6e 74 69 74 65 6d 73 20 5b 24 63 73 65  gmentitems [$cse
30d0: 74 20 69 74 65 6d 73 5d 5d 0a 09 20 20 20 20 7d  t items]]..    }
30e0: 20 7b 63 68 61 6e 67 65 73 65 74 20 66 72 61 67   {changeset frag
30f0: 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 73 75  ment is not a su
3100: 62 73 65 74 7d 0a 09 20 20 20 20 73 74 72 75 63  bset}..    struc
3110: 74 3a 3a 73 65 74 20 61 64 64 20 63 6f 76 65 72  t::set add cover
3120: 20 24 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 0a   $fragmentitems.
3130: 09 7d 0a 09 69 6e 74 65 67 72 69 74 79 20 61 73  .}..integrity as
3140: 73 65 72 74 20 7b 0a 09 20 20 20 20 5b 73 74 72  sert {..    [str
3150: 75 63 74 3a 3a 73 65 74 20 65 71 75 61 6c 20 24  uct::set equal $
3160: 63 6f 76 65 72 20 5b 24 63 73 65 74 20 69 74 65  cover [$cset ite
3170: 6d 73 5d 5d 0a 09 20 7d 20 7b 54 68 65 20 66 72  ms]].. } {The fr
3180: 61 67 6d 65 6e 74 73 20 64 6f 20 6e 6f 74 20 63  agments do not c
3190: 6f 76 65 72 20 74 68 65 20 6f 72 69 67 69 6e 61  over the origina
31a0: 6c 20 63 68 61 6e 67 65 73 65 74 7d 0a 09 73 65  l changeset}..se
31b0: 74 20 69 20 31 0a 09 66 6f 72 65 61 63 68 20 66  t i 1..foreach f
31c0: 69 61 20 24 61 72 67 73 20 7b 0a 09 20 20 20 20  ia $args {..    
31d0: 66 6f 72 65 61 63 68 20 66 69 62 20 5b 6c 72 61  foreach fib [lra
31e0: 6e 67 65 20 24 61 72 67 73 20 24 69 20 65 6e 64  nge $args $i end
31f0: 5d 20 7b 0a 09 09 69 6e 74 65 67 72 69 74 79 20  ] {...integrity 
3200: 61 73 73 65 72 74 20 7b 0a 09 09 20 20 20 20 5b  assert {...    [
3210: 73 74 72 75 63 74 3a 3a 73 65 74 20 65 6d 70 74  struct::set empt
3220: 79 20 5b 73 74 72 75 63 74 3a 3a 73 65 74 20 69  y [struct::set i
3230: 6e 74 65 72 73 65 63 74 20 24 66 69 61 20 24 66  ntersect $fia $f
3240: 69 62 5d 5d 0a 09 09 7d 20 7b 54 68 65 20 66 72  ib]]...} {The fr
3250: 61 67 6d 65 6e 74 73 20 3c 24 66 69 61 3e 20 61  agments <$fia> a
3260: 6e 64 20 3c 24 66 69 62 3e 20 6f 76 65 72 6c 61  nd <$fib> overla
3270: 70 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 69  p}..    }..    i
3280: 6e 63 72 20 69 0a 09 7d 0a 0a 09 23 20 41 6c 6c  ncr i..}...# All
3290: 20 63 68 65 63 6b 73 20 70 61 73 73 2c 20 61 63   checks pass, ac
32a0: 74 75 61 6c 6c 79 20 70 65 72 66 6f 72 6d 20 74  tually perform t
32b0: 68 65 20 73 70 6c 69 74 2e 0a 0a 09 73 74 72 75  he split....stru
32c0: 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20  ct::list assign 
32d0: 5b 24 63 73 65 74 20 64 61 74 61 5d 20 70 72 6f  [$cset data] pro
32e0: 6a 65 63 74 20 63 73 74 79 70 65 20 63 73 73 72  ject cstype cssr
32f0: 63 0a 0a 09 24 63 73 65 74 20 64 72 6f 70 0a 09  c...$cset drop..
3300: 24 63 73 65 74 20 64 65 73 74 72 6f 79 0a 0a 09  $cset destroy...
3310: 73 65 74 20 6e 65 77 63 73 65 74 73 20 7b 7d 0a  set newcsets {}.
3320: 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65 6e  .foreach fragmen
3330: 74 69 74 65 6d 73 20 24 61 72 67 73 20 7b 0a 09  titems $args {..
3340: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 38 20      log write 8 
3350: 63 73 65 74 73 20 7b 4d 41 4b 45 3a 20 5b 6c 73  csets {MAKE: [ls
3360: 6f 72 74 20 24 66 72 61 67 6d 65 6e 74 69 74 65  ort $fragmentite
3370: 6d 73 5d 7d 0a 0a 09 20 20 20 20 73 65 74 20 66  ms]}...    set f
3380: 72 61 67 6d 65 6e 74 20 5b 24 74 79 70 65 20 25  ragment [$type %
3390: 41 55 54 4f 25 20 24 70 72 6f 6a 65 63 74 20 24  AUTO% $project $
33a0: 63 73 74 79 70 65 20 24 63 73 73 72 63 20 5c 0a  cstype $cssrc \.
33b0: 09 09 09 20 20 20 20 20 20 5b 55 6e 74 61 67 20  ...      [Untag 
33c0: 24 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 20 24  $fragmentitems $
33d0: 63 73 74 79 70 65 5d 5d 0a 09 20 20 20 20 6c 61  cstype]]..    la
33e0: 70 70 65 6e 64 20 6e 65 77 63 73 65 74 73 20 24  ppend newcsets $
33f0: 66 72 61 67 6d 65 6e 74 0a 09 20 20 20 20 24 66  fragment..    $f
3400: 72 61 67 6d 65 6e 74 20 70 65 72 73 69 73 74 0a  ragment persist.
3410: 0a 09 20 20 20 20 69 66 20 7b 5b 24 66 72 61 67  ..    if {[$frag
3420: 6d 65 6e 74 20 73 65 6c 66 72 65 66 65 72 65 6e  ment selfreferen
3430: 74 69 61 6c 5d 7d 20 7b 0a 09 09 74 72 6f 75 62  tial]} {...troub
3440: 6c 65 20 66 61 74 61 6c 20 22 5b 24 66 72 61 67  le fatal "[$frag
3450: 6d 65 6e 74 20 73 74 72 5d 20 64 65 70 65 6e 64  ment str] depend
3460: 73 20 6f 6e 20 69 74 73 65 6c 66 22 0a 09 20 20  s on itself"..  
3470: 20 20 7d 0a 09 7d 0a 0a 09 74 72 6f 75 62 6c 65    }..}...trouble
3480: 20 61 62 6f 72 74 3f 0a 09 72 65 74 75 72 6e 20   abort?..return 
3490: 24 6e 65 77 63 73 65 74 73 0a 20 20 20 20 7d 0a  $newcsets.    }.
34a0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
34b0: 73 74 72 6c 69 73 74 20 7b 63 68 61 6e 67 65 73  strlist {changes
34c0: 65 74 73 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b  ets} {..return [
34d0: 6a 6f 69 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69  join [struct::li
34e0: 73 74 20 6d 61 70 20 24 63 68 61 6e 67 65 73 65  st map $changese
34f0: 74 73 20 5b 6d 79 70 72 6f 63 20 49 44 5d 5d 5d  ts [myproc ID]]]
3500: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63  .    }..    proc
3510: 20 49 44 20 7b 63 73 65 74 7d 20 7b 20 24 63 73   ID {cset} { $cs
3520: 65 74 20 73 74 72 20 7d 0a 0a 20 20 20 20 70 72  et str }..    pr
3530: 6f 63 20 55 6e 74 61 67 20 7b 74 61 67 67 65 64  oc Untag {tagged
3540: 69 74 65 6d 73 20 63 73 74 79 70 65 7d 20 7b 0a  items cstype} {.
3550: 09 72 65 74 75 72 6e 20 5b 73 74 72 75 63 74 3a  .return [struct:
3560: 3a 6c 69 73 74 20 6d 61 70 20 24 74 61 67 67 65  :list map $tagge
3570: 64 69 74 65 6d 73 20 5b 6d 79 70 72 6f 63 20 55  ditems [myproc U
3580: 6e 74 61 67 31 20 24 63 73 74 79 70 65 5d 5d 0a  ntag1 $cstype]].
3590: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20      }..    proc 
35a0: 55 6e 74 61 67 31 20 7b 63 73 74 79 70 65 20 74  Untag1 {cstype t
35b0: 68 65 69 74 65 6d 7d 20 7b 0a 09 73 74 72 75 63  heitem} {..struc
35c0: 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 24  t::list assign $
35d0: 74 68 65 69 74 65 6d 20 74 20 69 0a 09 69 6e 74  theitem t i..int
35e0: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24  egrity assert {$
35f0: 63 73 74 79 70 65 20 65 71 20 24 74 7d 20 7b 49  cstype eq $t} {I
3600: 74 65 6d 20 24 69 27 73 20 74 79 70 65 20 69 73  tem $i's type is
3610: 20 27 24 74 27 2c 20 65 78 70 65 63 74 65 64 20   '$t', expected 
3620: 27 24 63 73 74 79 70 65 27 7d 0a 09 72 65 74 75  '$cstype'}..retu
3630: 72 6e 20 24 69 0a 20 20 20 20 7d 0a 0a 20 20 20  rn $i.    }..   
3640: 20 74 79 70 65 6d 65 74 68 6f 64 20 69 74 65 6d   typemethod item
3650: 73 74 72 20 7b 69 74 65 6d 7d 20 7b 0a 09 73 74  str {item} {..st
3660: 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67  ruct::list assig
3670: 6e 20 24 69 74 65 6d 20 69 74 79 70 65 20 69 69  n $item itype ii
3680: 64 0a 09 72 65 74 75 72 6e 20 5b 24 69 74 79 70  d..return [$ityp
3690: 65 20 73 74 72 20 24 69 69 64 5d 0a 20 20 20 20  e str $iid].    
36a0: 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23  }..    # # ## ##
36b0: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
36c0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20   #############. 
36d0: 20 20 20 23 23 20 53 74 61 74 65 0a 0a 20 20 20     ## State..   
36e0: 20 76 61 72 69 61 62 6c 65 20 6d 79 69 64 20 20   variable myid  
36f0: 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 49 64 20        {} ; # Id 
3700: 6f 66 20 74 68 65 20 63 73 65 74 20 66 6f 72 20  of the cset for 
3710: 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 0a 09  the persistent..
3720: 09 09 20 20 20 20 20 20 23 20 73 74 61 74 65 2e  ..      # state.
3730: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79  .    variable my
3740: 70 72 6f 6a 65 63 74 20 20 20 7b 7d 20 3b 20 23  project   {} ; #
3750: 20 52 65 66 65 72 65 6e 63 65 20 6f 66 20 74 68   Reference of th
3760: 65 20 70 72 6f 6a 65 63 74 20 6f 62 6a 65 63 74  e project object
3770: 20 74 68 65 0a 09 09 09 20 20 20 20 20 20 23 20   the....      # 
3780: 63 68 61 6e 67 65 73 65 74 20 62 65 6c 6f 6e 67  changeset belong
3790: 73 20 74 6f 2e 0a 20 20 20 20 76 61 72 69 61 62  s to..    variab
37a0: 6c 65 20 6d 79 74 79 70 65 20 20 20 20 20 20 7b  le mytype      {
37b0: 7d 20 3b 20 23 20 57 68 61 74 20 74 68 65 20 63  } ; # What the c
37c0: 68 61 6e 67 65 73 65 74 20 69 73 20 62 61 73 65  hangeset is base
37d0: 64 20 6f 6e 0a 09 09 09 20 20 20 20 20 20 23 20  d on....      # 
37e0: 28 72 65 76 69 73 69 6f 6e 73 2c 20 74 61 67 73  (revisions, tags
37f0: 2c 20 6f 72 20 62 72 61 6e 63 68 65 73 29 2e 0a  , or branches)..
3800: 09 09 09 20 20 20 20 20 20 23 20 56 61 6c 75 65  ...      # Value
3810: 73 3a 20 53 65 65 20 6d 79 63 73 74 79 70 65 2e  s: See mycstype.
3820: 20 4e 6f 74 65 20 74 68 61 74 20 77 65 0a 09 09   Note that we...
3830: 09 20 20 20 20 20 20 23 20 68 61 76 65 20 74 6f  .      # have to
3840: 20 6b 65 65 70 20 74 68 65 20 6e 61 6d 65 73 20   keep the names 
3850: 6f 66 20 74 68 65 20 68 65 6c 70 65 72 0a 09 09  of the helper...
3860: 09 20 20 20 20 20 20 23 20 73 69 6e 67 6c 65 74  .      # singlet
3870: 6f 6e 73 20 69 6e 20 73 79 6e 63 20 77 69 74 68  ons in sync with
3880: 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 09 09   the contents...
3890: 09 20 20 20 20 20 20 23 20 6f 66 20 73 74 61 74  .      # of stat
38a0: 65 20 74 61 62 6c 65 20 27 63 73 74 79 70 65 27  e table 'cstype'
38b0: 2c 20 61 6e 64 20 76 61 72 69 6f 75 73 0a 09 09  , and various...
38c0: 09 20 20 20 20 20 20 23 20 6f 74 68 65 72 20 70  .      # other p
38d0: 6c 61 63 65 73 20 75 73 69 6e 67 20 74 68 65 6d  laces using them
38e0: 20 68 61 72 64 77 69 72 65 64 2e 0a 20 20 20 20   hardwired..    
38f0: 76 61 72 69 61 62 6c 65 20 6d 79 74 79 70 65 6f  variable mytypeo
3900: 62 6a 20 20 20 7b 7d 20 3b 20 23 20 52 65 66 65  bj   {} ; # Refe
3910: 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 6f 6e  rence to the con
3920: 74 61 69 6e 65 72 20 66 6f 72 20 74 68 65 0a 09  tainer for the..
3930: 09 09 20 20 20 20 20 20 23 20 74 79 70 65 20 64  ..      # type d
3940: 65 70 65 6e 64 65 6e 74 20 63 6f 64 65 2e 20 44  ependent code. D
3950: 65 72 69 76 65 64 20 66 72 6f 6d 0a 09 09 09 20  erived from.... 
3960: 20 20 20 20 20 23 20 6d 79 74 79 70 65 2e 0a 20       # mytype.. 
3970: 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 73 72     variable mysr
3980: 63 69 64 20 20 20 20 20 7b 7d 20 3b 20 23 20 49  cid     {} ; # I
3990: 64 20 6f 66 20 74 68 65 20 6d 65 74 61 64 61 74  d of the metadat
39a0: 61 20 6f 72 20 73 79 6d 62 6f 6c 20 74 68 65 20  a or symbol the 
39b0: 63 73 65 74 0a 09 09 09 20 20 20 20 20 20 23 20  cset....      # 
39c0: 69 73 20 62 61 73 65 64 20 6f 6e 2e 0a 20 20 20  is based on..   
39d0: 20 76 61 72 69 61 62 6c 65 20 6d 79 69 74 65 6d   variable myitem
39e0: 73 20 20 20 20 20 7b 7d 20 3b 20 23 20 4c 69 73  s     {} ; # Lis
39f0: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 65  t of the file le
3a00: 76 65 6c 20 72 65 76 69 73 69 6f 6e 73 2c 0a 09  vel revisions,..
3a10: 09 09 20 20 20 20 20 20 23 20 74 61 67 73 2c 20  ..      # tags, 
3a20: 6f 72 20 62 72 61 6e 63 68 65 73 20 69 6e 20 74  or branches in t
3a30: 68 65 20 63 73 65 74 2c 20 61 73 0a 09 09 09 20  he cset, as.... 
3a40: 20 20 20 20 20 23 20 69 64 73 2e 20 4e 6f 74 20       # ids. Not 
3a50: 74 61 67 67 65 64 2e 0a 20 20 20 20 76 61 72 69  tagged..    vari
3a60: 61 62 6c 65 20 6d 79 74 69 74 65 6d 73 20 20 20  able mytitems   
3a70: 20 7b 7d 20 3b 20 23 20 41 73 20 6d 79 69 74 65   {} ; # As myite
3a80: 6d 73 2c 20 74 68 65 20 74 61 67 67 65 64 20 66  ms, the tagged f
3a90: 6f 72 6d 2e 0a 20 20 20 20 76 61 72 69 61 62 6c  orm..    variabl
3aa0: 65 20 6d 79 70 72 65 6d 61 70 20 20 20 20 7b 7d  e mypremap    {}
3ab0: 20 3b 20 23 20 44 69 63 74 69 6f 6e 61 72 79 20   ; # Dictionary 
3ac0: 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68 65  mapping from the
3ad0: 20 69 74 65 6d 73 20 28 74 61 67 67 65 64 20 6e   items (tagged n
3ae0: 6f 77 29 0a 09 09 09 20 20 20 20 20 20 23 20 74  ow)....      # t
3af0: 6f 20 74 68 65 69 72 20 70 72 65 64 65 63 65 73  o their predeces
3b00: 73 6f 72 73 2c 20 61 6c 73 6f 20 74 61 67 67 65  sors, also tagge
3b10: 64 2e 20 41 0a 09 09 09 20 20 20 20 20 20 23 20  d. A....      # 
3b20: 63 61 63 68 65 20 74 6f 20 61 76 6f 69 64 20 6c  cache to avoid l
3b30: 6f 61 64 69 6e 67 20 74 68 69 73 20 66 72 6f 6d  oading this from
3b40: 20 74 68 65 0a 09 09 09 20 20 20 20 20 20 23 20   the....      # 
3b50: 73 74 61 74 65 20 6d 6f 72 65 20 74 68 61 6e 20  state more than 
3b60: 6f 6e 63 65 2e 0a 20 20 20 20 76 61 72 69 61 62  once..    variab
3b70: 6c 65 20 6d 79 6e 65 78 74 6d 61 70 20 20 20 7b  le mynextmap   {
3b80: 7d 20 3b 20 23 20 44 69 63 74 69 6f 6e 61 72 79  } ; # Dictionary
3b90: 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 74 68   mapping from th
3ba0: 65 20 69 74 65 6d 73 20 28 74 61 67 67 65 64 29  e items (tagged)
3bb0: 0a 09 09 09 20 20 20 20 20 20 23 20 74 6f 20 74  ....      # to t
3bc0: 68 65 69 72 20 73 75 63 63 65 73 73 6f 72 73 20  heir successors 
3bd0: 28 61 6c 73 6f 20 74 61 67 67 65 64 29 2e 20 41  (also tagged). A
3be0: 0a 09 09 09 20 20 20 20 20 20 23 20 63 61 63 68  ....      # cach
3bf0: 65 20 74 6f 20 61 76 6f 69 64 20 6c 6f 61 64 69  e to avoid loadi
3c00: 6e 67 20 74 68 69 73 20 66 72 6f 6d 20 74 68 65  ng this from the
3c10: 0a 09 09 09 20 20 20 20 20 20 23 20 73 74 61 74  ....      # stat
3c20: 65 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65  e more than once
3c30: 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d  ..    variable m
3c40: 79 70 6f 73 20 20 20 20 20 20 20 7b 7d 20 3b 20  ypos       {} ; 
3c50: 23 20 43 6f 6d 6d 69 74 20 70 6f 73 69 74 69 6f  # Commit positio
3c60: 6e 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73  n of the changes
3c70: 65 74 2c 20 69 66 0a 09 09 09 20 20 20 20 20 20  et, if....      
3c80: 23 20 6b 6e 6f 77 6e 2e 0a 0a 20 20 20 20 23 20  # known...    # 
3c90: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23  # ## ### ##### #
3ca0: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
3cb0: 23 23 23 23 23 0a 20 20 20 20 23 23 20 49 6e 74  #####.    ## Int
3cc0: 65 72 6e 61 6c 20 6d 65 74 68 6f 64 73 0a 0a 20  ernal methods.. 
3cd0: 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20     typevariable 
3ce0: 6d 79 63 6f 75 6e 74 65 72 20 20 20 20 20 20 20  mycounter       
3cf0: 20 30 20 3b 20 23 20 49 64 20 63 6f 75 6e 74 65   0 ; # Id counte
3d00: 72 20 66 6f 72 20 63 73 65 74 73 2e 20 4c 61 73  r for csets. Las
3d10: 74 20 69 64 0a 09 09 09 09 20 20 20 20 20 20 23  t id.....      #
3d20: 20 75 73 65 64 2e 0a 20 20 20 20 74 79 70 65 76   used..    typev
3d30: 61 72 69 61 62 6c 65 20 6d 79 63 73 74 79 70 65  ariable mycstype
3d40: 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d   -array {} ; # M
3d50: 61 70 20 63 73 74 79 70 65 73 20 28 6e 61 6d 65  ap cstypes (name
3d60: 73 29 20 74 6f 20 70 65 72 73 69 73 74 65 6e 74  s) to persistent
3d70: 0a 09 09 09 09 20 20 20 20 20 20 23 20 69 64 73  .....      # ids
3d80: 2e 20 4e 6f 74 65 20 74 68 61 74 20 77 65 20 68  . Note that we h
3d90: 61 76 65 20 74 6f 20 6b 65 65 70 0a 09 09 09 09  ave to keep.....
3da0: 20 20 20 20 20 20 23 20 74 68 65 20 6e 61 6d 65        # the name
3db0: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 27  s in the table '
3dc0: 63 73 74 79 70 65 27 0a 09 09 09 09 20 20 20 20  cstype'.....    
3dd0: 20 20 23 20 69 6e 20 73 79 6e 63 20 77 69 74 68    # in sync with
3de0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
3df0: 65 0a 09 09 09 09 20 20 20 20 20 20 23 20 68 65  e.....      # he
3e00: 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 73 2e  lper singletons.
3e10: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ..    typemethod
3e20: 20 67 65 74 63 73 74 79 70 65 73 20 7b 7d 20 7b   getcstypes {} {
3e30: 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 6e  ..foreach {tid n
3e40: 61 6d 65 7d 20 5b 73 74 61 74 65 20 72 75 6e 20  ame} [state run 
3e50: 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 74 69  {..    SELECT ti
3e60: 64 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 63 73 74  d, name FROM cst
3e70: 79 70 65 3b 0a 09 7d 5d 20 7b 20 73 65 74 20 6d  ype;..}] { set m
3e80: 79 63 73 74 79 70 65 28 24 6e 61 6d 65 29 20 24  ycstype($name) $
3e90: 74 69 64 20 7d 0a 09 72 65 74 75 72 6e 0a 20 20  tid }..return.  
3ea0: 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74    }..    typemet
3eb0: 68 6f 64 20 6c 6f 61 64 63 6f 75 6e 74 65 72 20  hod loadcounter 
3ec0: 7b 7d 20 7b 0a 09 23 20 49 6e 69 74 69 61 6c 69  {} {..# Initiali
3ed0: 7a 65 20 74 68 65 20 63 6f 75 6e 74 65 72 20 66  ze the counter f
3ee0: 72 6f 6d 20 74 68 65 20 73 74 61 74 65 0a 09 73  rom the state..s
3ef0: 65 74 20 6d 79 63 6f 75 6e 74 65 72 20 5b 73 74  et mycounter [st
3f00: 61 74 65 20 6f 6e 65 20 7b 20 53 45 4c 45 43 54  ate one { SELECT
3f10: 20 4d 41 58 28 63 69 64 29 20 46 52 4f 4d 20 63   MAX(cid) FROM c
3f20: 68 61 6e 67 65 73 65 74 20 7d 5d 0a 09 72 65 74  hangeset }]..ret
3f30: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  urn.    }..    t
3f40: 79 70 65 6d 65 74 68 6f 64 20 6e 75 6d 20 7b 7d  ypemethod num {}
3f50: 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 63 6f 75   { return $mycou
3f60: 6e 74 65 72 20 7d 0a 0a 20 20 20 20 70 72 6f 63  nter }..    proc
3f70: 20 49 6e 69 74 69 61 6c 69 7a 65 42 72 65 61 6b   InitializeBreak
3f80: 53 74 61 74 65 20 7b 72 65 76 69 73 69 6f 6e 73  State {revisions
3f90: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 70 6f 73  } {..upvar 1 pos
3fa0: 20 70 6f 73 20 63 72 6f 73 73 20 63 72 6f 73 73   pos cross cross
3fb0: 20 72 61 6e 67 65 20 72 61 6e 67 65 20 64 65 70   range range dep
3fc0: 63 20 64 65 70 63 20 64 65 6c 74 61 20 64 65 6c  c depc delta del
3fd0: 74 61 20 5c 0a 09 20 20 20 20 64 65 70 65 6e 64  ta \..    depend
3fe0: 65 6e 63 69 65 73 20 64 65 70 65 6e 64 65 6e 63  encies dependenc
3ff0: 69 65 73 0a 0a 09 23 20 46 69 72 73 74 20 77 65  ies...# First we
4000: 20 63 72 65 61 74 65 20 61 20 6d 61 70 20 6f 66   create a map of
4010: 20 70 6f 73 69 74 69 6f 6e 73 20 74 6f 20 6d 61   positions to ma
4020: 6b 65 20 69 74 20 65 61 73 69 65 72 20 74 6f 0a  ke it easier to.
4030: 09 23 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  .# determine whe
4040: 74 68 65 72 20 61 20 64 65 70 65 6e 64 65 6e 63  ther a dependenc
4050: 79 20 63 72 6f 73 73 65 73 20 61 20 70 61 72 74  y crosses a part
4060: 69 63 75 6c 61 72 20 69 6e 64 65 78 2e 0a 0a 09  icular index....
4070: 61 72 72 61 79 20 73 65 74 20 70 6f 73 20 20 20  array set pos   
4080: 7b 7d 0a 09 61 72 72 61 79 20 73 65 74 20 63 72  {}..array set cr
4090: 6f 73 73 20 7b 7d 0a 09 61 72 72 61 79 20 73 65  oss {}..array se
40a0: 74 20 64 65 70 63 20 20 7b 7d 0a 09 73 65 74 20  t depc  {}..set 
40b0: 72 61 6e 67 65 20 20 20 20 20 20 20 7b 7d 0a 09  range       {}..
40c0: 73 65 74 20 6e 20 30 0a 09 66 6f 72 65 61 63 68  set n 0..foreach
40d0: 20 72 65 76 20 24 72 65 76 69 73 69 6f 6e 73 20   rev $revisions 
40e0: 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 72  {..    lappend r
40f0: 61 6e 67 65 20 24 6e 0a 09 20 20 20 20 73 65 74  ange $n..    set
4100: 20 70 6f 73 28 24 72 65 76 29 20 24 6e 0a 09 20   pos($rev) $n.. 
4110: 20 20 20 73 65 74 20 63 72 6f 73 73 28 24 6e 29     set cross($n)
4120: 20 30 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09   0..    incr n..
4130: 7d 0a 0a 09 23 20 53 65 63 6f 6e 64 6c 79 20 77  }...# Secondly w
4140: 65 20 63 6f 75 6e 74 20 74 68 65 20 63 72 6f 73  e count the cros
4150: 73 69 6e 67 73 20 70 65 72 20 70 6f 73 69 74 69  sings per positi
4160: 6f 6e 2c 20 62 79 20 69 74 65 72 61 74 69 6e 67  on, by iterating
4170: 0a 09 23 20 6f 76 65 72 20 74 68 65 20 72 65 63  ..# over the rec
4180: 6f 72 64 65 64 20 69 6e 74 65 72 6e 61 6c 20 64  orded internal d
4190: 65 70 65 6e 64 65 6e 63 69 65 73 2e 0a 0a 09 23  ependencies....#
41a0: 20 4e 6f 74 65 3a 20 49 66 20 74 68 65 20 74 69   Note: If the ti
41b0: 6d 65 73 74 61 6d 70 73 20 61 72 65 20 62 61 64  mestamps are bad
41c0: 6c 79 20 6f 75 74 20 6f 66 20 6f 72 64 65 72 20  ly out of order 
41d0: 69 74 20 69 73 0a 09 23 20 20 20 20 20 20 20 70  it is..#       p
41e0: 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76 65 20  ossible to have 
41f0: 61 20 62 61 63 6b 77 61 72 64 20 73 75 63 63 65  a backward succe
4200: 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 79 2c  ssor dependency,
4210: 0a 09 23 20 20 20 20 20 20 20 69 2e 65 2e 20 77  ..#       i.e. w
4220: 69 74 68 20 73 74 61 72 74 20 3e 20 65 6e 64 2e  ith start > end.
4230: 20 57 65 20 6d 61 79 20 68 61 76 65 20 74 6f 20   We may have to 
4240: 73 77 61 70 20 74 68 65 20 69 6e 64 69 63 65 73  swap the indices
4250: 0a 09 23 20 20 20 20 20 20 20 74 6f 20 65 6e 73  ..#       to ens
4260: 75 72 65 20 74 68 61 74 20 74 68 65 20 66 6f 6c  ure that the fol
4270: 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75 6e 73  lowing loop runs
4280: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 09 23 0a 09   correctly...#..
4290: 23 20 4e 6f 74 65 20 32 3a 20 73 74 61 72 74 20  # Note 2: start 
42a0: 3d 3d 20 65 6e 64 20 69 73 20 6e 6f 74 20 70 6f  == end is not po
42b0: 73 73 69 62 6c 65 2e 20 49 74 20 69 6e 64 69 63  ssible. It indic
42c0: 61 74 65 73 20 61 0a 09 23 20 20 20 20 20 20 20  ates a..#       
42d0: 20 20 73 65 6c 66 2d 64 65 70 65 6e 64 65 6e 63    self-dependenc
42e0: 79 20 64 75 65 20 74 6f 20 74 68 65 20 75 6e 69  y due to the uni
42f0: 71 75 65 6e 65 73 73 20 6f 66 20 70 6f 73 69 74  queness of posit
4300: 69 6f 6e 73 2c 0a 09 23 20 20 20 20 20 20 20 20  ions,..#        
4310: 20 61 6e 64 20 74 68 61 74 20 69 73 20 73 6f 6d   and that is som
4320: 65 74 68 69 6e 67 20 77 65 20 68 61 76 65 20 72  ething we have r
4330: 75 6c 65 64 20 6f 75 74 20 61 6c 72 65 61 64 79  uled out already
4340: 2c 20 73 65 65 0a 09 23 20 20 20 20 20 20 20 20  , see..#        
4350: 20 27 72 65 76 20 69 6e 74 65 72 6e 61 6c 73 75   'rev internalsu
4360: 63 63 65 73 73 6f 72 73 27 2e 0a 0a 09 66 6f 72  ccessors'....for
4370: 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 72  each {rid childr
4380: 65 6e 7d 20 5b 61 72 72 61 79 20 67 65 74 20 64  en} [array get d
4390: 65 70 65 6e 64 65 6e 63 69 65 73 5d 20 7b 0a 09  ependencies] {..
43a0: 20 20 20 20 66 6f 72 65 61 63 68 20 63 68 69 6c      foreach chil
43b0: 64 20 24 63 68 69 6c 64 72 65 6e 20 7b 0a 09 09  d $children {...
43c0: 73 65 74 20 64 6b 65 79 20 20 20 20 5b 6c 69 73  set dkey    [lis
43d0: 74 20 24 72 69 64 20 24 63 68 69 6c 64 5d 0a 09  t $rid $child]..
43e0: 09 73 65 74 20 73 74 61 72 74 20 20 20 24 70 6f  .set start   $po
43f0: 73 28 24 72 69 64 29 0a 09 09 73 65 74 20 65 6e  s($rid)...set en
4400: 64 20 20 20 20 20 24 70 6f 73 28 24 63 68 69 6c  d     $pos($chil
4410: 64 29 0a 09 09 73 65 74 20 63 72 6f 73 73 65 73  d)...set crosses
4420: 20 7b 7d 0a 0a 09 09 69 66 20 7b 24 73 74 61 72   {}....if {$star
4430: 74 20 3e 20 24 65 6e 64 7d 20 7b 0a 09 09 20 20  t > $end} {...  
4440: 20 20 77 68 69 6c 65 20 7b 24 65 6e 64 20 3c 20    while {$end < 
4450: 24 73 74 61 72 74 7d 20 7b 0a 09 09 09 6c 61 70  $start} {....lap
4460: 70 65 6e 64 20 63 72 6f 73 73 65 73 20 24 65 6e  pend crosses $en
4470: 64 0a 09 09 09 69 6e 63 72 20 63 72 6f 73 73 28  d....incr cross(
4480: 24 65 6e 64 29 0a 09 09 09 69 6e 63 72 20 65 6e  $end)....incr en
4490: 64 0a 09 09 20 20 20 20 7d 0a 09 09 7d 20 65 6c  d...    }...} el
44a0: 73 65 20 7b 0a 09 09 20 20 20 20 77 68 69 6c 65  se {...    while
44b0: 20 7b 24 73 74 61 72 74 20 3c 20 24 65 6e 64 7d   {$start < $end}
44c0: 20 7b 0a 09 09 09 6c 61 70 70 65 6e 64 20 63 72   {....lappend cr
44d0: 6f 73 73 65 73 20 24 73 74 61 72 74 0a 09 09 09  osses $start....
44e0: 69 6e 63 72 20 63 72 6f 73 73 28 24 73 74 61 72  incr cross($star
44f0: 74 29 0a 09 09 09 69 6e 63 72 20 73 74 61 72 74  t)....incr start
4500: 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 09 73  ...    }...}...s
4510: 65 74 20 64 65 70 63 28 24 64 6b 65 79 29 20 24  et depc($dkey) $
4520: 63 72 6f 73 73 65 73 0a 09 20 20 20 20 7d 0a 09  crosses..    }..
4530: 7d 0a 0a 09 49 6e 69 74 69 61 6c 69 7a 65 44 65  }...InitializeDe
4540: 6c 74 61 73 20 24 72 65 76 69 73 69 6f 6e 73 0a  ltas $revisions.
4550: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
4560: 20 20 20 70 72 6f 63 20 49 6e 69 74 69 61 6c 69     proc Initiali
4570: 7a 65 44 65 6c 74 61 73 20 7b 72 65 76 69 73 69  zeDeltas {revisi
4580: 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20  ons} {..upvar 1 
4590: 64 65 6c 74 61 20 64 65 6c 74 61 0a 0a 09 23 20  delta delta...# 
45a0: 50 75 6c 6c 20 74 68 65 20 74 69 6d 65 73 74 61  Pull the timesta
45b0: 6d 70 73 20 66 6f 72 20 61 6c 6c 20 72 65 76 69  mps for all revi
45c0: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 63 68 61  sions in the cha
45d0: 6e 67 65 73 65 74 73 20 61 6e 64 0a 09 23 20 63  ngesets and..# c
45e0: 6f 6d 70 75 74 65 20 74 68 65 69 72 20 64 65 6c  ompute their del
45f0: 74 61 73 20 66 6f 72 20 75 73 65 20 62 79 20 74  tas for use by t
4600: 68 65 20 62 72 65 61 6b 20 66 69 6e 64 65 72 2e  he break finder.
4610: 0a 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 6c  ...array set del
4620: 74 61 20 7b 7d 0a 09 61 72 72 61 79 20 73 65 74  ta {}..array set
4630: 20 73 74 61 6d 70 20 7b 7d 0a 0a 09 73 65 74 20   stamp {}...set 
4640: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24  theset ('[join $
4650: 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d  revisions {','}]
4660: 27 29 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64  ')..foreach {rid
4670: 20 74 69 6d 65 7d 20 5b 73 74 61 74 65 20 72 75   time} [state ru
4680: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20  n "..    SELECT 
4690: 52 2e 72 69 64 2c 20 52 2e 64 61 74 65 0a 09 20  R.rid, R.date.. 
46a0: 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e     FROM revision
46b0: 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e   R..    WHERE R.
46c0: 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09  rid IN $theset..
46d0: 22 5d 20 7b 0a 09 20 20 20 20 73 65 74 20 73 74  "] {..    set st
46e0: 61 6d 70 28 24 72 69 64 29 20 24 74 69 6d 65 0a  amp($rid) $time.
46f0: 09 7d 0a 0a 09 73 65 74 20 6e 20 30 0a 09 66 6f  .}...set n 0..fo
4700: 72 65 61 63 68 20 72 69 64 20 5b 6c 72 61 6e 67  reach rid [lrang
4710: 65 20 24 72 65 76 69 73 69 6f 6e 73 20 30 20 65  e $revisions 0 e
4720: 6e 64 2d 31 5d 20 72 6e 65 78 74 20 5b 6c 72 61  nd-1] rnext [lra
4730: 6e 67 65 20 24 72 65 76 69 73 69 6f 6e 73 20 31  nge $revisions 1
4740: 20 65 6e 64 5d 20 7b 0a 09 20 20 20 20 73 65 74   end] {..    set
4750: 20 64 65 6c 74 61 28 24 6e 29 20 5b 65 78 70 72   delta($n) [expr
4760: 20 7b 24 73 74 61 6d 70 28 24 72 6e 65 78 74 29   {$stamp($rnext)
4770: 20 2d 20 24 73 74 61 6d 70 28 24 72 69 64 29 7d   - $stamp($rid)}
4780: 5d 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d  ]..    incr n..}
4790: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
47a0: 20 20 20 20 70 72 6f 63 20 46 69 6e 64 42 65 73      proc FindBes
47b0: 74 42 72 65 61 6b 20 7b 72 61 6e 67 65 7d 20 7b  tBreak {range} {
47c0: 0a 09 75 70 76 61 72 20 31 20 63 72 6f 73 73 20  ..upvar 1 cross 
47d0: 63 72 6f 73 73 20 64 65 6c 74 61 20 64 65 6c 74  cross delta delt
47e0: 61 0a 0a 09 23 20 44 65 74 65 72 6d 69 6e 65 20  a...# Determine 
47f0: 74 68 65 20 62 65 73 74 20 62 72 65 61 6b 20 6c  the best break l
4800: 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 67  ocation in the g
4810: 69 76 65 6e 20 72 61 6e 67 65 20 6f 66 0a 09 23  iven range of..#
4820: 20 70 6f 73 69 74 69 6f 6e 73 2e 20 46 69 72 73   positions. Firs
4830: 74 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 68  t we look for th
4840: 65 20 6c 6f 63 61 74 69 6f 6e 73 20 77 69 74 68  e locations with
4850: 20 74 68 65 20 6d 61 78 69 6d 61 6c 0a 09 23 20   the maximal..# 
4860: 6e 75 6d 62 65 72 20 6f 66 20 63 72 6f 73 73 69  number of crossi
4870: 6e 67 73 2e 20 49 66 20 74 68 65 72 65 20 61 72  ngs. If there ar
4880: 65 20 73 65 76 65 72 61 6c 20 77 65 20 6c 6f 6f  e several we loo
4890: 6b 20 66 6f 72 20 74 68 65 0a 09 23 20 73 68 6f  k for the..# sho
48a0: 72 74 65 73 74 20 74 69 6d 65 20 69 6e 74 65 72  rtest time inter
48b0: 76 61 6c 20 61 6d 6f 6e 67 20 74 68 65 6d 2e 20  val among them. 
48c0: 49 66 20 77 65 20 73 74 69 6c 6c 20 68 61 76 65  If we still have
48d0: 20 6d 75 6c 74 69 70 6c 65 0a 09 23 20 70 6f 73   multiple..# pos
48e0: 73 69 62 69 6c 69 74 69 65 73 20 61 66 74 65 72  sibilities after
48f0: 20 74 68 61 74 20 77 65 20 73 65 6c 65 63 74 20   that we select 
4900: 74 68 65 20 65 61 72 6c 69 65 73 74 20 6c 6f 63  the earliest loc
4910: 61 74 69 6f 6e 0a 09 23 20 61 6d 6f 6e 67 20 74  ation..# among t
4920: 68 65 73 65 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20  hese....# Note: 
4930: 49 66 20 74 68 65 20 6d 61 78 69 6d 61 6c 20 6e  If the maximal n
4940: 75 6d 62 65 72 20 6f 66 20 63 72 6f 73 73 69 6e  umber of crossin
4950: 67 73 20 69 73 20 30 20 74 68 65 6e 20 74 68 65  gs is 0 then the
4960: 20 72 61 6e 67 65 0a 09 23 20 20 20 20 20 20 20   range..#       
4970: 68 61 73 20 6e 6f 20 69 6e 74 65 72 6e 61 6c 20  has no internal 
4980: 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 6e  dependencies, an
4990: 64 20 6e 6f 20 62 72 65 61 6b 20 6c 6f 63 61 74  d no break locat
49a0: 69 6f 6e 20 61 74 0a 09 23 20 20 20 20 20 20 20  ion at..#       
49b0: 61 6c 6c 2e 20 54 68 69 73 20 70 6f 73 73 69 62  all. This possib
49c0: 69 6c 69 74 79 20 69 73 20 73 69 67 6e 61 6c 65  ility is signale
49d0: 64 20 76 69 61 20 72 65 73 75 6c 74 20 2d 31 2e  d via result -1.
49e0: 0a 0a 09 23 20 4e 6f 74 65 3a 20 41 20 72 61 6e  ...# Note: A ran
49f0: 67 65 20 6f 66 20 6c 65 6e 67 74 68 20 31 20 6f  ge of length 1 o
4a00: 72 20 6c 65 73 73 20 63 61 6e 6e 6f 74 20 68 61  r less cannot ha
4a10: 76 65 20 69 6e 74 65 72 6e 61 6c 0a 09 23 20 20  ve internal..#  
4a20: 20 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65       dependencie
4a30: 73 2c 20 61 73 20 74 68 61 74 20 6e 65 65 64 73  s, as that needs
4a40: 20 61 74 20 6c 65 61 73 74 20 74 77 6f 20 72 65   at least two re
4a50: 76 69 73 69 6f 6e 73 20 69 6e 0a 09 23 20 20 20  visions in..#   
4a60: 20 20 20 20 74 68 65 20 72 61 6e 67 65 2e 0a 0a      the range...
4a70: 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 72  .if {[llength $r
4a80: 61 6e 67 65 5d 20 3c 20 32 7d 20 7b 20 72 65 74  ange] < 2} { ret
4a90: 75 72 6e 20 2d 31 20 7d 0a 0a 09 73 65 74 20 6d  urn -1 }...set m
4aa0: 61 78 20 2d 31 0a 09 73 65 74 20 62 65 73 74 20  ax -1..set best 
4ab0: 7b 7d 0a 0a 09 66 6f 72 65 61 63 68 20 6c 6f 63  {}...foreach loc
4ac0: 61 74 69 6f 6e 20 24 72 61 6e 67 65 20 7b 0a 09  ation $range {..
4ad0: 20 20 20 20 73 65 74 20 63 72 6f 73 73 69 6e 67      set crossing
4ae0: 73 20 24 63 72 6f 73 73 28 24 6c 6f 63 61 74 69  s $cross($locati
4af0: 6f 6e 29 0a 09 20 20 20 20 69 66 20 7b 24 63 72  on)..    if {$cr
4b00: 6f 73 73 69 6e 67 73 20 3e 20 24 6d 61 78 7d 20  ossings > $max} 
4b10: 7b 0a 09 09 73 65 74 20 6d 61 78 20 20 24 63 72  {...set max  $cr
4b20: 6f 73 73 69 6e 67 73 0a 09 09 73 65 74 20 62 65  ossings...set be
4b30: 73 74 20 5b 6c 69 73 74 20 24 6c 6f 63 61 74 69  st [list $locati
4b40: 6f 6e 5d 0a 09 09 63 6f 6e 74 69 6e 75 65 0a 09  on]...continue..
4b50: 20 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63      } elseif {$c
4b60: 72 6f 73 73 69 6e 67 73 20 3d 3d 20 24 6d 61 78  rossings == $max
4b70: 7d 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 62 65  } {...lappend be
4b80: 73 74 20 24 6c 6f 63 61 74 69 6f 6e 0a 09 20 20  st $location..  
4b90: 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b 24 6d 61    }..}...if {$ma
4ba0: 78 20 3d 3d 20 30 7d 20 20 20 20 20 20 20 20 20  x == 0}         
4bb0: 20 20 20 7b 20 72 65 74 75 72 6e 20 2d 31 20 7d     { return -1 }
4bc0: 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24  ..if {[llength $
4bd0: 62 65 73 74 5d 20 3d 3d 20 31 7d 20 7b 20 72 65  best] == 1} { re
4be0: 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 62 65  turn [lindex $be
4bf0: 73 74 20 30 5d 20 7d 0a 0a 09 73 65 74 20 6c 6f  st 0] }...set lo
4c00: 63 61 74 69 6f 6e 73 20 24 62 65 73 74 0a 09 73  cations $best..s
4c10: 65 74 20 62 65 73 74 20 7b 7d 0a 09 73 65 74 20  et best {}..set 
4c20: 6d 69 6e 20 2d 31 0a 0a 09 66 6f 72 65 61 63 68  min -1...foreach
4c30: 20 6c 6f 63 61 74 69 6f 6e 20 24 6c 6f 63 61 74   location $locat
4c40: 69 6f 6e 73 20 7b 0a 09 20 20 20 20 73 65 74 20  ions {..    set 
4c50: 69 6e 74 65 72 76 61 6c 20 24 64 65 6c 74 61 28  interval $delta(
4c60: 24 6c 6f 63 61 74 69 6f 6e 29 0a 09 20 20 20 20  $location)..    
4c70: 69 66 20 7b 28 24 6d 69 6e 20 3c 20 30 29 20 7c  if {($min < 0) |
4c80: 7c 20 28 24 69 6e 74 65 72 76 61 6c 20 3c 20 24  | ($interval < $
4c90: 6d 69 6e 29 7d 20 7b 0a 09 09 73 65 74 20 6d 69  min)} {...set mi
4ca0: 6e 20 20 24 69 6e 74 65 72 76 61 6c 0a 09 09 73  n  $interval...s
4cb0: 65 74 20 62 65 73 74 20 5b 6c 69 73 74 20 24 6c  et best [list $l
4cc0: 6f 63 61 74 69 6f 6e 5d 0a 09 20 20 20 20 7d 20  ocation]..    } 
4cd0: 65 6c 73 65 69 66 20 7b 24 69 6e 74 65 72 76 61  elseif {$interva
4ce0: 6c 20 3d 3d 20 24 6d 69 6e 7d 20 7b 0a 09 09 6c  l == $min} {...l
4cf0: 61 70 70 65 6e 64 20 62 65 73 74 20 24 6c 6f 63  append best $loc
4d00: 61 74 69 6f 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a  ation..    }..}.
4d10: 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24  ..if {[llength $
4d20: 62 65 73 74 5d 20 3d 3d 20 31 7d 20 7b 20 72 65  best] == 1} { re
4d30: 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 62 65  turn [lindex $be
4d40: 73 74 20 30 5d 20 7d 0a 0a 09 72 65 74 75 72 6e  st 0] }...return
4d50: 20 5b 6c 69 6e 64 65 78 20 5b 6c 73 6f 72 74 20   [lindex [lsort 
4d60: 2d 69 6e 74 65 67 65 72 20 2d 69 6e 63 72 65 61  -integer -increa
4d70: 73 69 6e 67 20 24 62 65 73 74 5d 20 30 5d 0a 20  sing $best] 0]. 
4d80: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 43     }..    proc C
4d90: 75 74 41 74 20 7b 6c 6f 63 61 74 69 6f 6e 7d 20  utAt {location} 
4da0: 7b 0a 09 75 70 76 61 72 20 31 20 63 72 6f 73 73  {..upvar 1 cross
4db0: 20 63 72 6f 73 73 20 64 65 70 63 20 64 65 70 63   cross depc depc
4dc0: 0a 0a 09 23 20 49 74 20 77 61 73 20 64 65 63 69  ...# It was deci
4dd0: 64 65 64 20 74 6f 20 73 70 6c 69 74 20 74 68 65  ded to split the
4de0: 20 63 68 61 6e 67 65 73 65 74 20 61 74 20 74 68   changeset at th
4df0: 65 20 67 69 76 65 6e 0a 09 23 20 6c 6f 63 61 74  e given..# locat
4e00: 69 6f 6e 2e 20 54 68 69 73 20 63 75 74 73 20 61  ion. This cuts a
4e10: 20 6e 75 6d 62 65 72 20 6f 66 20 64 65 70 65 6e   number of depen
4e20: 64 65 6e 63 69 65 73 2e 20 48 65 72 65 20 77 65  dencies. Here we
4e30: 20 75 70 64 61 74 65 0a 09 23 20 74 68 65 20 63   update..# the c
4e40: 72 6f 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ross information
4e50: 20 73 6f 20 74 68 61 74 20 74 68 65 20 62 72 65   so that the bre
4e60: 61 6b 20 66 69 6e 64 65 72 20 68 61 73 20 61 63  ak finder has ac
4e70: 63 75 72 61 74 65 0a 09 23 20 64 61 74 61 20 77  curate..# data w
4e80: 68 65 6e 20 77 65 20 6c 6f 6f 6b 20 61 74 20 74  hen we look at t
4e90: 68 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 61  he generated fra
4ea0: 67 6d 65 6e 74 73 2e 0a 0a 09 73 65 74 20 73 69  gments....set si
4eb0: 78 20 5b 6c 6f 67 20 76 69 73 69 62 6c 65 3f 20  x [log visible? 
4ec0: 36 5d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 64 65  6]...foreach {de
4ed0: 70 20 72 61 6e 67 65 7d 20 5b 61 72 72 61 79 20  p range} [array 
4ee0: 67 65 74 20 64 65 70 63 5d 20 7b 0a 09 20 20 20  get depc] {..   
4ef0: 20 23 20 43 68 65 63 6b 20 61 6c 6c 20 64 65 70   # Check all dep
4f00: 65 6e 64 65 6e 63 69 65 73 20 73 74 69 6c 6c 20  endencies still 
4f10: 6b 6e 6f 77 6e 2c 20 74 61 6b 65 20 74 68 65 69  known, take thei
4f20: 72 20 72 61 6e 67 65 20 61 6e 64 0a 09 20 20 20  r range and..   
4f30: 20 23 20 73 65 65 20 69 66 20 74 68 65 20 62 72   # see if the br
4f40: 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 66 61 6c  eak location fal
4f50: 6c 73 20 77 69 74 68 69 6e 2e 0a 0a 09 20 20 20  ls within....   
4f60: 20 42 6f 72 64 65 72 20 24 72 61 6e 67 65 20 73   Border $range s
4f70: 20 65 0a 09 20 20 20 20 69 66 20 7b 24 6c 6f 63   e..    if {$loc
4f80: 61 74 69 6f 6e 20 3c 20 24 73 7d 20 63 6f 6e 74  ation < $s} cont
4f90: 69 6e 75 65 20 3b 20 23 20 62 72 65 61 6b 20 62  inue ; # break b
4fa0: 65 66 6f 72 65 20 72 61 6e 67 65 2c 20 69 67 6e  efore range, ign
4fb0: 6f 72 65 0a 09 20 20 20 20 69 66 20 7b 24 6c 6f  ore..    if {$lo
4fc0: 63 61 74 69 6f 6e 20 3e 20 24 65 7d 20 63 6f 6e  cation > $e} con
4fd0: 74 69 6e 75 65 20 3b 20 23 20 62 72 65 61 6b 20  tinue ; # break 
4fe0: 61 66 74 65 72 20 72 61 6e 67 65 2c 20 69 67 6e  after range, ign
4ff0: 6f 72 65 2e 0a 0a 09 20 20 20 20 23 20 54 68 69  ore....    # Thi
5000: 73 20 64 65 70 65 6e 64 65 6e 63 79 20 63 72 6f  s dependency cro
5010: 73 73 65 73 20 74 68 65 20 62 72 65 61 6b 20 6c  sses the break l
5020: 6f 63 61 74 69 6f 6e 2e 20 57 65 20 72 65 6d 6f  ocation. We remo
5030: 76 65 20 69 74 0a 09 20 20 20 20 23 20 66 72 6f  ve it..    # fro
5040: 6d 20 74 68 65 20 63 72 6f 73 73 69 6e 67 73 20  m the crossings 
5050: 63 6f 75 6e 74 65 72 73 2c 20 61 6e 64 20 74 68  counters, and th
5060: 65 6e 20 61 6c 73 6f 20 66 72 6f 6d 20 74 68 65  en also from the
5070: 20 73 65 74 0a 09 20 20 20 20 23 20 6f 66 20 6b   set..    # of k
5080: 6e 6f 77 6e 20 64 65 70 65 6e 64 65 6e 63 69 65  nown dependencie
5090: 73 2c 20 61 73 20 77 65 20 61 72 65 20 64 6f 6e  s, as we are don
50a0: 65 20 77 69 74 68 20 69 74 2e 0a 0a 09 20 20 20  e with it....   
50b0: 20 66 6f 72 65 61 63 68 20 6c 6f 63 20 24 64 65   foreach loc $de
50c0: 70 63 28 24 64 65 70 29 20 7b 20 69 6e 63 72 20  pc($dep) { incr 
50d0: 63 72 6f 73 73 28 24 6c 6f 63 29 20 2d 31 20 7d  cross($loc) -1 }
50e0: 0a 09 20 20 20 20 75 6e 73 65 74 20 64 65 70 63  ..    unset depc
50f0: 28 24 64 65 70 29 0a 0a 09 20 20 20 20 69 66 20  ($dep)...    if 
5100: 7b 21 24 73 69 78 7d 20 63 6f 6e 74 69 6e 75 65  {!$six} continue
5110: 0a 0a 09 20 20 20 20 73 74 72 75 63 74 3a 3a 6c  ...    struct::l
5120: 69 73 74 20 61 73 73 69 67 6e 20 24 64 65 70 20  ist assign $dep 
5130: 70 61 72 65 6e 74 20 63 68 69 6c 64 0a 09 20 20  parent child..  
5140: 20 20 6c 6f 67 20 77 72 69 74 65 20 35 20 63 73    log write 5 cs
5150: 65 74 73 20 22 42 72 6f 6b 65 20 64 65 70 65 6e  ets "Broke depen
5160: 64 65 6e 63 79 20 5b 50 44 20 24 70 61 72 65 6e  dency [PD $paren
5170: 74 5d 20 2d 2d 3e 20 5b 50 44 20 24 63 68 69 6c  t] --> [PD $chil
5180: 64 5d 22 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 0a  d]"..}...return.
5190: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 50 72 69      }..    # Pri
51a0: 6e 74 20 69 64 65 6e 74 69 66 79 69 6e 67 20 64  nt identifying d
51b0: 61 74 61 20 66 6f 72 20 61 20 72 65 76 69 73 69  ata for a revisi
51c0: 6f 6e 20 28 70 72 6f 6a 65 63 74 2c 20 66 69 6c  on (project, fil
51d0: 65 2c 20 64 6f 74 74 65 64 20 72 65 76 0a 20 20  e, dotted rev.  
51e0: 20 20 23 20 6e 75 6d 62 65 72 29 2c 20 66 6f 72    # number), for
51f0: 20 68 69 67 68 20 76 65 72 62 6f 73 69 74 79 20   high verbosity 
5200: 6c 6f 67 20 6f 75 74 70 75 74 2e 0a 0a 20 20 20  log output...   
5210: 20 70 72 6f 63 20 50 44 20 7b 69 64 7d 20 7b 0a   proc PD {id} {.
5220: 09 66 6f 72 65 61 63 68 20 7b 70 20 66 20 72 7d  .foreach {p f r}
5230: 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09   [state run {...
5240: 53 45 4c 45 43 54 20 50 2e 6e 61 6d 65 20 2c 20  SELECT P.name , 
5250: 46 2e 6e 61 6d 65 2c 20 52 2e 72 65 76 0a 09 09  F.name, R.rev...
5260: 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c  FROM revision R,
5270: 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65 63 74   file F, project
5280: 20 50 0a 09 09 57 48 45 52 45 20 52 2e 72 69 64   P...WHERE R.rid
5290: 20 3d 20 24 69 64 0a 09 09 41 4e 44 20 20 20 52   = $id...AND   R
52a0: 2e 66 69 64 20 3d 20 46 2e 66 69 64 0a 09 09 41  .fid = F.fid...A
52b0: 4e 44 20 20 20 46 2e 70 69 64 20 3d 20 50 2e 70  ND   F.pid = P.p
52c0: 69 64 0a 09 7d 5d 20 62 72 65 61 6b 0a 09 72 65  id..}] break..re
52d0: 74 75 72 6e 20 22 27 24 70 20 3a 20 24 66 2f 24  turn "'$p : $f/$
52e0: 72 27 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  r'".    }..    #
52f0: 20 50 72 69 6e 74 69 6e 67 20 6f 6e 65 20 6f 72   Printing one or
5300: 20 6d 6f 72 65 20 72 61 6e 67 65 73 2c 20 66 6f   more ranges, fo
5310: 72 6d 61 74 74 65 64 2c 20 61 6e 64 20 6f 6e 6c  rmatted, and onl
5320: 79 20 74 68 65 69 72 20 62 6f 72 64 65 72 20 74  y their border t
5330: 6f 0a 20 20 20 20 23 20 6b 65 65 70 20 74 68 65  o.    # keep the
5340: 20 73 74 72 69 6e 67 73 20 73 68 6f 72 74 2e 0a   strings short..
5350: 0a 20 20 20 20 70 72 6f 63 20 50 52 73 20 7b 72  .    proc PRs {r
5360: 61 6e 67 65 73 7d 20 7b 0a 09 72 65 74 75 72 6e  anges} {..return
5370: 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d   [struct::list m
5380: 61 70 20 24 72 61 6e 67 65 73 20 5b 6d 79 70 72  ap $ranges [mypr
5390: 6f 63 20 50 52 5d 5d 0a 20 20 20 20 7d 0a 0a 20  oc PR]].    }.. 
53a0: 20 20 20 70 72 6f 63 20 50 52 20 7b 72 61 6e 67     proc PR {rang
53b0: 65 7d 20 7b 0a 09 42 6f 72 64 65 72 20 24 72 61  e} {..Border $ra
53c0: 6e 67 65 20 73 20 65 0a 09 72 65 74 75 72 6e 20  nge s e..return 
53d0: 3c 24 7b 73 7d 2e 2e 2e 24 7b 65 7d 3e 0a 20 20  <${s}...${e}>.  
53e0: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 42 6f    }..    proc Bo
53f0: 72 64 65 72 20 7b 72 61 6e 67 65 20 73 76 20 65  rder {range sv e
5400: 76 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 73  v} {..upvar 1 $s
5410: 76 20 73 20 24 65 76 20 65 0a 09 73 65 74 20 73  v s $ev e..set s
5420: 20 5b 6c 69 6e 64 65 78 20 24 72 61 6e 67 65 20   [lindex $range 
5430: 30 5d 0a 09 73 65 74 20 65 20 5b 6c 69 6e 64 65  0]..set e [linde
5440: 78 20 24 72 61 6e 67 65 20 65 6e 64 5d 0a 09 72  x $range end]..r
5450: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
5460: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23   # # ## ### ####
5470: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
5480: 23 23 23 23 23 23 23 23 0a 0a 20 20 20 20 74 79  ########..    ty
5490: 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 68 61  pevariable mycha
54a0: 6e 67 65 73 65 74 73 20 20 20 20 20 7b 7d 20 3b  ngesets     {} ;
54b0: 20 23 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 6b   # List of all k
54c0: 6e 6f 77 6e 20 63 68 61 6e 67 65 73 65 74 73 2e  nown changesets.
54d0: 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c  .    typevariabl
54e0: 65 20 6d 79 69 74 65 6d 6d 61 70 20 2d 61 72 72  e myitemmap -arr
54f0: 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 66 72  ay {} ; # Map fr
5500: 6f 6d 20 69 74 65 6d 73 20 28 74 61 67 67 65 64  om items (tagged
5510: 29 20 74 6f 0a 09 09 09 09 20 20 20 20 20 20 20  ) to.....       
5520: 23 20 74 68 65 20 6c 69 73 74 20 6f 66 20 63 68  # the list of ch
5530: 61 6e 67 65 73 65 74 73 0a 09 09 09 09 20 20 20  angesets.....   
5540: 20 20 20 20 23 20 63 6f 6e 74 61 69 6e 69 6e 67      # containing
5550: 20 69 74 2e 20 45 61 63 68 20 69 74 65 6d 20 63   it. Each item c
5560: 61 6e 0a 09 09 09 09 20 20 20 20 20 20 20 23 20  an.....       # 
5570: 62 65 20 75 73 65 64 20 62 79 20 6f 6e 6c 79 20  be used by only 
5580: 6f 6e 65 0a 09 09 09 09 20 20 20 20 20 20 20 23  one.....       #
5590: 20 63 68 61 6e 67 65 73 65 74 2e 0a 20 20 20 20   changeset..    
55a0: 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 69  typevariable myi
55b0: 64 6d 61 70 20 20 20 2d 61 72 72 61 79 20 7b 7d  dmap   -array {}
55c0: 20 3b 20 23 20 4d 61 70 20 66 72 6f 6d 20 63 68   ; # Map from ch
55d0: 61 6e 67 65 73 65 74 20 69 64 20 74 6f 0a 09 09  angeset id to...
55e0: 09 09 20 20 20 20 20 20 20 23 20 63 68 61 6e 67  ..       # chang
55f0: 65 73 65 74 2e 0a 0a 20 20 20 20 74 79 70 65 6d  eset...    typem
5600: 65 74 68 6f 64 20 61 6c 6c 20 20 20 20 7b 7d 20  ethod all    {} 
5610: 20 20 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 63     { return $myc
5620: 68 61 6e 67 65 73 65 74 73 20 7d 0a 20 20 20 20  hangesets }.    
5630: 74 79 70 65 6d 65 74 68 6f 64 20 6f 66 20 20 20  typemethod of   
5640: 20 20 7b 63 69 64 7d 20 7b 20 72 65 74 75 72 6e    {cid} { return
5650: 20 24 6d 79 69 64 6d 61 70 28 24 63 69 64 29 20   $myidmap($cid) 
5660: 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  }.    typemethod
5670: 20 6f 66 69 74 65 6d 20 7b 69 69 64 7d 20 7b 20   ofitem {iid} { 
5680: 72 65 74 75 72 6e 20 24 6d 79 69 74 65 6d 6d 61  return $myitemma
5690: 70 28 24 69 69 64 29 20 7d 0a 0a 20 20 20 20 23  p($iid) }..    #
56a0: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20   # ## ### ##### 
56b0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
56c0: 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 43 6f  ######.    ## Co
56d0: 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a 20 20 20  nfiguration..   
56e0: 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65   pragma -hastype
56f0: 69 6e 66 6f 20 20 20 20 6e 6f 20 20 3b 20 23 20  info    no  ; # 
5700: 6e 6f 20 74 79 70 65 20 69 6e 74 72 6f 73 70 65  no type introspe
5710: 63 74 69 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61  ction.    pragma
5720: 20 2d 68 61 73 69 6e 66 6f 20 20 20 20 20 20 20   -hasinfo       
5730: 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 6f 62 6a 65   no  ; # no obje
5740: 63 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e  ct introspection
5750: 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23  ..    # # ## ###
5760: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20   ##### ######## 
5770: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 7d 0a  #############.}.
5780: 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23  .# # ## ### ####
5790: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
57a0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
57b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23  ##############.#
57c0: 23 20 48 65 6c 70 65 72 20 73 69 6e 67 6c 65 74  # Helper singlet
57d0: 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20 66 6f 72  on. Commands for
57e0: 20 72 65 76 69 73 69 6f 6e 20 63 68 61 6e 67 65   revision change
57f0: 73 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70  sets...snit::typ
5800: 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a  e ::vc::fossil::
5810: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f  import::cvs::pro
5820: 6a 65 63 74 3a 3a 72 65 76 3a 3a 72 65 76 20 7b  ject::rev::rev {
5830: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
5840: 62 79 72 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 20  byrevision {} { 
5850: 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74  return 1 }.    t
5860: 79 70 65 6d 65 74 68 6f 64 20 62 79 73 79 6d 62  ypemethod bysymb
5870: 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e  ol   {} { return
5880: 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74   0 }.    typemet
5890: 68 6f 64 20 69 73 74 61 67 20 20 20 20 20 20 7b  hod istag      {
58a0: 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20  } { return 0 }. 
58b0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73     typemethod is
58c0: 62 72 61 6e 63 68 20 20 20 7b 7d 20 7b 20 72 65  branch   {} { re
58d0: 74 75 72 6e 20 30 20 7d 0a 0a 20 20 20 20 74 79  turn 0 }..    ty
58e0: 70 65 6d 65 74 68 6f 64 20 73 74 72 20 7b 72 65  pemethod str {re
58f0: 76 69 73 69 6f 6e 7d 20 7b 0a 09 73 74 72 75 63  vision} {..struc
5900: 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b  t::list assign [
5910: 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20  state run {..   
5920: 20 53 45 4c 45 43 54 20 52 2e 72 65 76 2c 20 46   SELECT R.rev, F
5930: 2e 6e 61 6d 65 2c 20 50 2e 6e 61 6d 65 0a 09 20  .name, P.name.. 
5940: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69     FROM   revisi
5950: 6f 6e 20 52 2c 20 66 69 6c 65 20 46 2c 20 70 72  on R, file F, pr
5960: 6f 6a 65 63 74 20 50 0a 09 20 20 20 20 57 48 45  oject P..    WHE
5970: 52 45 20 20 52 2e 72 69 64 20 3d 20 24 72 65 76  RE  R.rid = $rev
5980: 69 73 69 6f 6e 0a 09 20 20 20 20 41 4e 44 20 20  ision..    AND  
5990: 20 20 46 2e 66 69 64 20 3d 20 52 2e 66 69 64 0a    F.fid = R.fid.
59a0: 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69  .    AND    P.pi
59b0: 64 20 3d 20 46 2e 70 69 64 0a 09 7d 5d 20 72 65  d = F.pid..}] re
59c0: 76 6e 72 20 66 6e 61 6d 65 20 70 6e 61 6d 65 0a  vnr fname pname.
59d0: 09 72 65 74 75 72 6e 20 22 24 70 6e 61 6d 65 2f  .return "$pname/
59e0: 24 7b 72 65 76 6e 72 7d 3a 3a 24 66 6e 61 6d 65  ${revnr}::$fname
59f0: 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72  ".    }..    # r
5a00: 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69  esult = list (mi
5a10: 6e 74 69 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a  ntime, maxtime).
5a20: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 74      typemethod t
5a30: 69 6d 65 72 61 6e 67 65 20 7b 69 74 65 6d 73 7d  imerange {items}
5a40: 20 7b 0a 09 73 65 74 20 74 68 65 73 65 74 20 28   {..set theset (
5a50: 27 5b 6a 6f 69 6e 20 24 69 74 65 6d 73 20 7b 27  '[join $items {'
5a60: 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b  ,'}]')..return [
5a70: 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20  state run "..   
5a80: 20 53 45 4c 45 43 54 20 4d 49 4e 28 52 2e 64 61   SELECT MIN(R.da
5a90: 74 65 29 2c 20 4d 41 58 28 52 2e 64 61 74 65 29  te), MAX(R.date)
5aa0: 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73  ..    FROM revis
5ab0: 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45  ion R..    WHERE
5ac0: 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65   R.rid IN $these
5ad0: 74 0a 09 22 5d 0a 20 20 20 20 7d 0a 0a 20 20 20  t.."].    }..   
5ae0: 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 63   # var(dv) = dic
5af0: 74 20 28 72 65 76 69 73 69 6f 6e 20 2d 3e 20 6c  t (revision -> l
5b00: 69 73 74 20 28 72 65 76 69 73 69 6f 6e 29 29 0a  ist (revision)).
5b10: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69      typemethod i
5b20: 6e 74 65 72 6e 61 6c 73 75 63 63 65 73 73 6f 72  nternalsuccessor
5b30: 73 20 7b 64 76 20 72 65 76 69 73 69 6f 6e 73 7d  s {dv revisions}
5b40: 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76 20   {..upvar 1 $dv 
5b50: 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 73 65  dependencies..se
5b60: 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e  t theset ('[join
5b70: 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27   $revisions {','
5b80: 7d 5d 27 29 0a 0a 09 23 20 53 65 65 20 27 73 75  }]')...# See 'su
5b90: 63 63 65 73 73 6f 72 73 27 20 62 65 6c 6f 77 20  ccessors' below 
5ba0: 66 6f 72 20 74 68 65 20 6d 61 69 6e 20 65 78 70  for the main exp
5bb0: 6c 61 6e 61 74 69 6f 6e 20 6f 66 0a 09 23 20 74  lanation of..# t
5bc0: 68 65 20 76 61 72 69 6f 75 73 20 63 61 73 65 73  he various cases
5bd0: 2e 20 54 68 69 73 20 70 69 65 63 65 20 69 73 20  . This piece is 
5be0: 73 70 65 63 69 61 6c 20 69 6e 20 74 68 61 74 20  special in that 
5bf0: 69 74 0a 09 23 20 72 65 73 74 72 69 63 74 73 20  it..# restricts 
5c00: 74 68 65 20 73 75 63 63 65 73 73 6f 72 73 20 77  the successors w
5c10: 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 6f 20 74 68  e look for to th
5c20: 65 20 73 61 6d 65 20 73 65 74 20 6f 66 0a 09 23  e same set of..#
5c30: 20 72 65 76 69 73 69 6f 6e 73 20 77 65 20 73 74   revisions we st
5c40: 61 72 74 20 66 72 6f 6d 2e 20 53 65 6e 73 69 62  art from. Sensib
5c50: 6c 65 20 61 73 20 77 65 20 61 72 65 20 6c 6f 6f  le as we are loo
5c60: 6b 69 6e 67 20 66 6f 72 0a 09 23 20 63 68 61 6e  king for..# chan
5c70: 67 65 73 65 74 20 69 6e 74 65 72 6e 61 6c 20 64  geset internal d
5c80: 65 70 65 6e 64 65 6e 63 69 65 73 2e 0a 0a 09 61  ependencies....a
5c90: 72 72 61 79 20 73 65 74 20 64 65 70 20 7b 7d 0a  rray set dep {}.
5ca0: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63  ..foreach {rid c
5cb0: 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e  hild} [state run
5cc0: 20 22 0a 20 20 20 2d 2d 20 28 31 29 20 50 72 69   ".   -- (1) Pri
5cd0: 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20  mary child..    
5ce0: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e  SELECT R.rid, R.
5cf0: 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20  child..    FROM 
5d00: 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20    revision R..  
5d10: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20    WHERE  R.rid  
5d20: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20   IN $theset     
5d30: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72  -- Restrict to r
5d40: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65  evisions of inte
5d50: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
5d60: 20 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20   R.child IS NOT 
5d70: 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70  NULL    -- Has p
5d80: 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20  rimary child..  
5d90: 20 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64    AND    R.child
5da0: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20   IN $theset     
5db0: 2d 2d 20 57 68 69 63 68 20 69 73 20 61 6c 73 6f  -- Which is also
5dc0: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 20 20 20   of interest.   
5dd0: 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32   UNION.    -- (2
5de0: 29 20 53 65 63 6f 6e 64 61 72 79 20 28 62 72 61  ) Secondary (bra
5df0: 6e 63 68 29 20 63 68 69 6c 64 72 65 6e 0a 09 20  nch) children.. 
5e00: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c     SELECT R.rid,
5e10: 20 42 2e 62 72 69 64 0a 09 20 20 20 20 46 52 4f   B.brid..    FRO
5e20: 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20  M   revision R, 
5e30: 72 65 76 69 73 69 6f 6e 62 72 61 6e 63 68 63 68  revisionbranchch
5e40: 69 6c 64 72 65 6e 20 42 0a 09 20 20 20 20 57 48  ildren B..    WH
5e50: 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20  ERE  R.rid   IN 
5e60: 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52  $theset     -- R
5e70: 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73  estrict to revis
5e80: 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74  ions of interest
5e90: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72  ..    AND    R.r
5ea0: 69 64 20 3d 20 42 2e 72 69 64 20 20 20 20 20 20  id = B.rid      
5eb0: 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 73 75      -- Select su
5ec0: 62 73 65 74 20 6f 66 20 62 72 61 6e 63 68 20 63  bset of branch c
5ed0: 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 41 4e 44  hildren..    AND
5ee0: 20 20 20 20 42 2e 62 72 69 64 20 49 4e 20 24 74      B.brid IN $t
5ef0: 68 65 73 65 74 20 20 20 20 20 20 2d 2d 20 57 68  heset      -- Wh
5f00: 69 63 68 20 69 73 20 61 6c 73 6f 20 6f 66 20 69  ich is also of i
5f10: 6e 74 65 72 65 73 74 0a 20 20 20 20 55 4e 49 4f  nterest.    UNIO
5f20: 4e 0a 20 20 20 20 2d 2d 20 28 34 29 20 43 68 69  N.    -- (4) Chi
5f30: 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74  ld of trunk root
5f40: 20 73 75 63 63 65 73 73 6f 72 20 6f 66 20 6c 61   successor of la
5f50: 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b  st NTDB on trunk
5f60: 2e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e  ...    SELECT R.
5f70: 72 69 64 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20  rid, RA.child.. 
5f80: 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e     FROM revision
5f90: 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 0a   R, revision RA.
5fa0: 09 20 20 20 20 57 48 45 52 45 20 52 2e 72 69 64  .    WHERE R.rid
5fb0: 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20     IN $theset   
5fc0: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74     -- Restrict t
5fd0: 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69  o revisions of i
5fe0: 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44  nterest..    AND
5ff0: 20 20 20 52 2e 69 73 64 65 66 61 75 6c 74 20 20     R.isdefault  
6000: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 52 65             -- Re
6010: 73 74 72 69 63 74 20 74 6f 20 4e 54 44 42 0a 09  strict to NTDB..
6020: 20 20 20 20 41 4e 44 20 20 20 52 2e 64 62 63 68      AND   R.dbch
6030: 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  ild IS NOT NULL 
6040: 20 20 2d 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54    -- and last NT
6050: 44 42 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  DB belonging to 
6060: 74 72 75 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20  trunk..    AND  
6070: 20 52 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 68   RA.rid = R.dbch
6080: 69 6c 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 64  ild      -- Go d
6090: 69 72 65 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b  irectly to trunk
60a0: 20 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20   root..    AND  
60b0: 20 52 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54   RA.child IS NOT
60c0: 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20   NULL    -- Has 
60d0: 70 72 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 20  primary child.. 
60e0: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20             AND  
60f0: 20 52 41 2e 63 68 69 6c 64 20 49 4e 20 24 74 68   RA.child IN $th
6100: 65 73 65 74 20 20 20 20 20 2d 2d 20 57 68 69 63  eset     -- Whic
6110: 68 20 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e 74  h is also of int
6120: 65 72 65 73 74 0a 09 22 5d 20 7b 0a 09 20 20 20  erest.."] {..   
6130: 20 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69   # Consider movi
6140: 6e 67 20 74 68 69 73 20 74 6f 20 74 68 65 20 69  ng this to the i
6150: 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e  ntegrity module.
6160: 0a 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 20  ..    integrity 
6170: 61 73 73 65 72 74 20 7b 24 72 69 64 20 21 3d 20  assert {$rid != 
6180: 24 63 68 69 6c 64 7d 20 7b 52 65 76 69 73 69 6f  $child} {Revisio
6190: 6e 20 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f  n $rid depends o
61a0: 6e 20 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20  n itself.}..    
61b0: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e  lappend dependen
61c0: 63 69 65 73 28 24 72 69 64 29 20 24 63 68 69 6c  cies($rid) $chil
61d0: 64 0a 09 20 20 20 20 73 65 74 20 64 65 70 28 24  d..    set dep($
61e0: 72 69 64 2c 24 63 68 69 6c 64 29 20 2e 0a 09 7d  rid,$child) ...}
61f0: 0a 0a 09 23 20 54 68 65 20 73 71 6c 20 73 74 61  ...# The sql sta
6200: 74 65 6d 65 6e 74 73 20 61 62 6f 76 65 20 6c 6f  tements above lo
6210: 6f 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 64 69 72  oks only for dir
6220: 65 63 74 20 64 65 70 65 6e 64 65 6e 63 69 65 73  ect dependencies
6230: 0a 09 23 20 62 65 74 77 65 65 6e 20 72 65 76 69  ..# between revi
6240: 73 69 6f 6e 20 69 6e 20 74 68 65 20 63 68 61 6e  sion in the chan
6250: 67 65 73 65 74 2e 20 48 6f 77 65 76 65 72 20 64  geset. However d
6260: 75 65 20 74 6f 20 74 68 65 0a 09 23 20 76 61 67  ue to the..# vag
6270: 61 72 69 65 73 20 6f 66 20 6d 65 74 61 20 64 61  aries of meta da
6280: 74 61 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  ta it is possibl
6290: 65 20 66 6f 72 20 74 77 6f 20 72 65 76 69 73 69  e for two revisi
62a0: 6f 6e 73 20 6f 66 0a 09 23 20 74 68 65 20 73 61  ons of..# the sa
62b0: 6d 65 20 66 69 6c 65 20 74 6f 20 65 6e 64 20 75  me file to end u
62c0: 70 20 69 6e 20 74 68 65 20 73 61 6d 65 20 63 68  p in the same ch
62d0: 61 6e 67 65 73 65 74 2c 20 77 69 74 68 6f 75 74  angeset, without
62e0: 20 61 0a 09 23 20 64 69 72 65 63 74 20 64 65 70   a..# direct dep
62f0: 65 6e 64 65 6e 63 79 20 62 65 74 77 65 65 6e 20  endency between 
6300: 74 68 65 6d 2e 20 48 6f 77 65 76 65 72 20 77 65  them. However we
6310: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 72 65   know that there
6320: 0a 09 23 20 68 61 73 20 74 6f 20 62 65 20 61 20  ..# has to be a 
6330: 61 6e 20 69 6e 64 69 72 65 63 74 20 64 65 70 65  an indirect depe
6340: 6e 64 65 6e 63 79 2c 20 62 65 20 69 74 20 74 68  ndency, be it th
6350: 72 6f 75 67 68 20 70 72 69 6d 61 72 79 0a 09 23  rough primary..#
6360: 20 63 68 69 6c 64 72 65 6e 2c 20 62 72 61 6e 63   children, branc
6370: 68 20 63 68 69 6c 64 72 65 6e 2c 20 6f 72 20 61  h children, or a
6380: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68 65   combination the
6390: 72 65 6f 66 2e 0a 0a 09 23 20 57 65 20 6e 6f 77  reof....# We now
63a0: 20 66 69 6c 6c 20 69 6e 20 74 68 65 73 65 20 70   fill in these p
63b0: 73 65 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63 69  seudo-dependenci
63c0: 65 73 2c 20 69 66 20 6e 6f 20 73 75 63 68 0a 09  es, if no such..
63d0: 23 20 64 65 70 65 6e 64 65 6e 63 79 20 65 78 69  # dependency exi
63e0: 73 74 73 20 61 6c 72 65 61 64 79 2e 20 54 68 65  sts already. The
63f0: 20 64 69 72 65 63 74 69 6f 6e 20 6f 66 20 74 68   direction of th
6400: 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 09 23 20  e dependency..# 
6410: 69 73 20 61 63 74 75 61 6c 6c 79 20 69 72 72 65  is actually irre
6420: 6c 65 76 61 6e 74 20 66 6f 72 20 74 68 69 73 2e  levant for this.
6430: 0a 0a 09 23 20 4e 4f 54 45 3a 20 54 68 69 73 20  ...# NOTE: This 
6440: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
6450: 6d 20 63 76 73 32 73 76 6e 2e 20 4f 75 72 20 73  m cvs2svn. Our s
6460: 70 69 72 69 74 75 61 6c 20 61 6e 63 65 73 74 6f  piritual ancesto
6470: 72 0a 09 23 20 64 6f 65 73 20 6e 6f 74 20 75 73  r..# does not us
6480: 65 20 73 75 63 68 20 70 73 65 75 64 6f 2d 64 65  e such pseudo-de
6490: 70 65 6e 64 65 6e 63 69 65 73 2c 20 68 6f 77 65  pendencies, howe
64a0: 76 65 72 20 69 74 20 75 73 65 73 20 61 0a 09 23  ver it uses a..#
64b0: 20 43 4f 4d 4d 49 54 5f 54 48 52 45 53 48 4f 4c   COMMIT_THRESHOL
64c0: 44 2c 20 61 20 74 69 6d 65 20 69 6e 74 65 72 76  D, a time interv
64d0: 61 6c 20 63 6f 6d 6d 69 74 73 20 73 68 6f 75 6c  al commits shoul
64e0: 64 20 66 61 6c 6c 2e 20 54 68 69 73 0a 09 23 20  d fall. This..# 
64f0: 77 69 6c 6c 20 67 72 65 61 74 6c 79 20 72 65 64  will greatly red
6500: 75 63 65 73 20 74 68 65 20 72 69 73 6b 20 6f 66  uces the risk of
6510: 20 67 65 74 74 69 6e 67 20 66 61 72 20 73 65 70   getting far sep
6520: 61 72 61 74 65 64 0a 09 23 20 72 65 76 69 73 69  arated..# revisi
6530: 6f 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ons of the same 
6540: 66 69 6c 65 20 69 6e 74 6f 20 6f 6e 65 20 63 68  file into one ch
6550: 61 6e 67 65 73 65 74 2e 0a 0a 09 23 20 57 65 20  angeset....# We 
6560: 61 6c 6c 6f 77 20 72 65 76 69 73 69 6f 6e 73 20  allow revisions 
6570: 74 6f 20 62 65 20 66 61 72 20 61 70 61 72 74 20  to be far apart 
6580: 69 6e 20 74 69 6d 65 20 69 6e 20 74 68 65 20 73  in time in the s
6590: 61 6d 65 0a 09 23 20 63 68 61 6e 67 65 73 65 74  ame..# changeset
65a0: 2c 20 62 75 74 20 6e 65 65 64 20 74 68 65 20 70  , but need the p
65b0: 73 65 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63 69  seudo-dependenci
65c0: 65 73 20 66 6f 72 20 74 68 69 73 2e 0a 0a 09 61  es for this....a
65d0: 72 72 61 79 20 73 65 74 20 66 69 64 73 20 7b 7d  rray set fids {}
65e0: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 66  ..foreach {rid f
65f0: 69 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22  id} [state run "
6600: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
6610: 69 64 2c 20 52 2e 66 69 64 20 46 52 4f 4d 20 72  id, R.fid FROM r
6620: 65 76 69 73 69 6f 6e 20 52 20 57 48 45 52 45 20  evision R WHERE 
6630: 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 74  R.rid IN $theset
6640: 0a 09 22 5d 20 7b 20 6c 61 70 70 65 6e 64 20 66  .."] { lappend f
6650: 69 64 73 28 24 66 69 64 29 20 24 72 69 64 20 7d  ids($fid) $rid }
6660: 0a 0a 09 66 6f 72 65 61 63 68 20 7b 66 69 64 20  ...foreach {fid 
6670: 72 69 64 73 7d 20 5b 61 72 72 61 79 20 67 65 74  rids} [array get
6680: 20 66 69 64 73 5d 20 7b 0a 09 20 20 20 20 69 66   fids] {..    if
6690: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 72 69 64 73   {[llength $rids
66a0: 5d 20 3c 20 32 7d 20 63 6f 6e 74 69 6e 75 65 0a  ] < 2} continue.
66b0: 09 20 20 20 20 66 6f 72 65 61 63 68 20 61 20 24  .    foreach a $
66c0: 72 69 64 73 20 7b 0a 09 09 66 6f 72 65 61 63 68  rids {...foreach
66d0: 20 62 20 24 72 69 64 73 20 7b 0a 09 09 20 20 20   b $rids {...   
66e0: 20 69 66 20 7b 24 61 20 3d 3d 20 24 62 7d 20 63   if {$a == $b} c
66f0: 6f 6e 74 69 6e 75 65 0a 09 09 20 20 20 20 69 66  ontinue...    if
6700: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64   {[info exists d
6710: 65 70 28 24 61 2c 24 62 29 5d 7d 20 63 6f 6e 74  ep($a,$b)]} cont
6720: 69 6e 75 65 0a 09 09 20 20 20 20 69 66 20 7b 5b  inue...    if {[
6730: 69 6e 66 6f 20 65 78 69 73 74 73 20 64 65 70 28  info exists dep(
6740: 24 62 2c 24 61 29 5d 7d 20 63 6f 6e 74 69 6e 75  $b,$a)]} continu
6750: 65 0a 09 09 20 20 20 20 6c 61 70 70 65 6e 64 20  e...    lappend 
6760: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 24 61 29  dependencies($a)
6770: 20 24 62 0a 09 09 20 20 20 20 73 65 74 20 64 65   $b...    set de
6780: 70 28 24 61 2c 24 62 29 20 2e 0a 09 09 20 20 20  p($a,$b) ....   
6790: 20 73 65 74 20 64 65 70 28 24 62 2c 24 61 29 20   set dep($b,$a) 
67a0: 2e 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a  ....}..    }..}.
67b0: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
67c0: 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 64     # var(dv) = d
67d0: 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73  ict (item -> lis
67e0: 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20  t (item)), item 
67f0: 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69 64   = list (type id
6800: 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ).    typemethod
6810: 20 73 75 63 63 65 73 73 6f 72 73 20 7b 64 76 20   successors {dv 
6820: 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70  revisions} {..up
6830: 76 61 72 20 31 20 24 64 76 20 64 65 70 65 6e 64  var 1 $dv depend
6840: 65 6e 63 69 65 73 0a 09 73 65 74 20 74 68 65 73  encies..set thes
6850: 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69  et ('[join $revi
6860: 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a  sions {','}]')..
6870: 09 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
6880: 20 63 61 73 65 73 20 73 70 65 63 69 66 79 20 77   cases specify w
6890: 68 65 6e 20 61 20 72 65 76 69 73 69 6f 6e 20 53  hen a revision S
68a0: 20 69 73 20 61 20 73 75 63 63 65 73 73 6f 72 0a   is a successor.
68b0: 09 23 20 6f 66 20 61 20 72 65 76 69 73 69 6f 6e  .# of a revision
68c0: 20 52 2e 20 45 61 63 68 20 6f 66 20 74 68 65 20   R. Each of the 
68d0: 63 61 73 65 73 20 74 72 61 6e 73 6c 61 74 65 73  cases translates
68e0: 20 69 6e 74 6f 20 6f 6e 65 20 6f 66 0a 09 23 20   into one of..# 
68f0: 74 68 65 20 62 72 61 6e 63 68 65 73 20 6f 66 20  the branches of 
6900: 74 68 65 20 53 51 4c 20 55 4e 49 4f 4e 20 63 6f  the SQL UNION co
6910: 6d 69 6e 67 20 62 65 6c 6f 77 2e 0a 09 23 0a 09  ming below...#..
6920: 23 20 28 31 29 20 53 20 63 61 6e 20 62 65 20 61  # (1) S can be a
6930: 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 20 6f   primary child o
6940: 66 20 52 2c 20 69 2e 65 2e 20 69 6e 20 74 68 65  f R, i.e. in the
6950: 20 73 61 6d 65 20 4c 4f 44 2e 20 52 0a 09 23 20   same LOD. R..# 
6960: 20 20 20 20 72 65 66 65 72 65 6e 63 65 73 20 53      references S
6970: 20 64 69 72 65 63 74 6c 79 2e 20 52 2e 63 68 69   directly. R.chi
6980: 6c 64 20 3d 20 53 28 2e 72 69 64 29 2c 20 69 66  ld = S(.rid), if
6990: 20 69 74 20 65 78 69 73 74 73 2e 0a 09 23 0a 09   it exists...#..
69a0: 23 20 28 32 29 20 53 20 63 61 6e 20 62 65 20 61  # (2) S can be a
69b0: 20 73 65 63 6f 6e 64 61 72 79 2c 20 69 2e 65 2e   secondary, i.e.
69c0: 20 62 72 61 6e 63 68 2c 20 63 68 69 6c 64 20 6f   branch, child o
69d0: 66 20 52 2e 20 48 65 72 65 20 74 68 65 0a 09 23  f R. Here the..#
69e0: 20 20 20 20 20 6c 69 6e 6b 20 69 73 20 6d 61 64       link is mad
69f0: 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 68 65  e through the he
6a00: 6c 70 65 72 20 74 61 62 6c 65 0a 09 23 20 20 20  lper table..#   
6a10: 20 20 52 45 56 49 53 49 4f 4e 42 52 41 4e 43 48    REVISIONBRANCH
6a20: 43 48 49 4c 44 52 45 4e 2e 20 52 2e 72 69 64 20  CHILDREN. R.rid 
6a30: 2d 3e 20 52 42 43 2e 72 69 64 2c 20 52 42 43 2e  -> RBC.rid, RBC.
6a40: 62 72 69 64 20 3d 0a 09 23 20 20 20 20 20 53 28  brid =..#     S(
6a50: 2e 72 69 64 29 0a 09 23 0a 09 23 20 28 33 29 20  .rid)..#..# (3) 
6a60: 4f 72 69 67 69 6e 61 6c 6c 79 20 74 68 69 73 20  Originally this 
6a70: 75 73 65 20 63 61 73 65 20 64 65 66 69 6e 65 64  use case defined
6a80: 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 20 64   the root of a d
6a90: 65 74 61 63 68 65 64 0a 09 23 20 20 20 20 20 4e  etached..#     N
6aa0: 54 44 42 20 61 73 20 74 68 65 20 73 75 63 63 65  TDB as the succe
6ab0: 73 73 6f 72 20 6f 66 20 74 68 65 20 74 72 75 6e  ssor of the trun
6ac0: 6b 20 72 6f 6f 74 2e 20 54 68 69 73 20 6c 65 61  k root. This lea
6ad0: 64 73 20 74 6f 20 61 0a 09 23 20 20 20 20 20 62  ds to a..#     b
6ae0: 61 64 20 74 61 6e 67 6c 65 20 6c 61 74 65 72 20  ad tangle later 
6af0: 6f 6e 2e 20 57 69 74 68 20 61 20 64 65 74 61 63  on. With a detac
6b00: 68 65 64 20 4e 54 44 42 20 74 68 65 20 6f 72 69  hed NTDB the ori
6b10: 67 69 6e 61 6c 0a 09 23 20 20 20 20 20 74 72 75  ginal..#     tru
6b20: 6e 6b 20 72 6f 6f 74 20 72 65 76 69 73 69 6f 6e  nk root revision
6b30: 20 77 61 73 20 72 65 6d 6f 76 65 64 20 61 73 20   was removed as 
6b40: 69 72 72 65 6c 65 76 61 6e 74 2c 20 61 6c 6c 6f  irrelevant, allo
6b50: 77 69 6e 67 0a 09 23 20 20 20 20 20 74 68 65 20  wing..#     the 
6b60: 6e 6f 6d 69 6e 61 6c 20 72 6f 6f 74 20 74 6f 20  nominal root to 
6b70: 62 65 20 6c 61 74 65 72 20 69 6e 20 74 69 6d 65  be later in time
6b80: 20 74 68 61 6e 20 74 68 65 20 4e 54 44 42 0a 09   than the NTDB..
6b90: 23 20 20 20 20 20 72 6f 6f 74 2e 20 4e 6f 77 20  #     root. Now 
6ba0: 73 65 74 74 69 6e 67 20 74 68 69 73 20 64 65 70  setting this dep
6bb0: 65 6e 64 65 6e 63 79 20 77 69 6c 6c 20 62 65 20  endency will be 
6bc0: 62 61 63 6b 77 61 72 64 20 69 6e 0a 09 23 20 20  backward in..#  
6bd0: 20 20 20 74 69 6d 65 2e 20 52 45 4d 4f 56 45 44     time. REMOVED
6be0: 2e 0a 09 23 0a 09 23 20 28 34 29 20 49 66 20 52  ...#..# (4) If R
6bf0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 6f 66 20   is the last of 
6c00: 74 68 65 20 4e 54 44 42 20 72 65 76 69 73 69 6f  the NTDB revisio
6c10: 6e 73 20 77 68 69 63 68 20 62 65 6c 6f 6e 67 20  ns which belong 
6c20: 74 6f 0a 09 23 20 20 20 20 20 74 68 65 20 74 72  to..#     the tr
6c30: 75 6e 6b 2c 20 74 68 65 6e 20 74 68 65 20 70 72  unk, then the pr
6c40: 69 6d 61 72 79 20 63 68 69 6c 64 20 6f 66 20 74  imary child of t
6c50: 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74 20 28 74  he trunk root (t
6c60: 68 65 0a 09 23 20 20 20 20 20 27 31 2e 32 27 20  he..#     '1.2' 
6c70: 72 65 76 69 73 69 6f 6e 29 20 69 73 20 61 20 73  revision) is a s
6c80: 75 63 63 65 73 73 6f 72 2c 20 69 66 20 69 74 20  uccessor, if it 
6c90: 65 78 69 73 74 73 2e 0a 0a 09 23 20 4e 6f 74 65  exists....# Note
6ca0: 20 74 68 61 74 20 74 68 65 20 62 72 61 6e 63 68   that the branch
6cb0: 65 73 20 73 70 61 77 6e 65 64 20 66 72 6f 6d 20  es spawned from 
6cc0: 74 68 65 20 72 65 76 69 73 69 6f 6e 73 2c 20 61  the revisions, a
6cd0: 6e 64 20 74 68 65 0a 09 23 20 74 61 67 73 20 61  nd the..# tags a
6ce0: 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74  ssociated with t
6cf0: 68 65 6d 20 61 72 65 20 73 75 63 63 65 73 73 6f  hem are successo
6d00: 72 73 20 61 73 20 77 65 6c 6c 2e 0a 0a 09 66 6f  rs as well....fo
6d10: 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64  reach {rid child
6d20: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 20  } [state run ". 
6d30: 20 20 2d 2d 20 28 31 29 20 50 72 69 6d 61 72 79    -- (1) Primary
6d40: 20 63 68 69 6c 64 0a 09 20 20 20 20 53 45 4c 45   child..    SELE
6d50: 43 54 20 52 2e 72 69 64 2c 20 52 2e 63 68 69 6c  CT R.rid, R.chil
6d60: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65  d..    FROM   re
6d70: 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48  vision R..    WH
6d80: 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20  ERE  R.rid   IN 
6d90: 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52  $theset     -- R
6da0: 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73  estrict to revis
6db0: 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74  ions of interest
6dc0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 63  ..    AND    R.c
6dd0: 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  hild IS NOT NULL
6de0: 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d 61      -- Has prima
6df0: 72 79 20 63 68 69 6c 64 0a 20 20 20 20 55 4e 49  ry child.    UNI
6e00: 4f 4e 0a 20 20 20 20 2d 2d 20 28 32 29 20 53 65  ON.    -- (2) Se
6e10: 63 6f 6e 64 61 72 79 20 28 62 72 61 6e 63 68 29  condary (branch)
6e20: 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 53   children..    S
6e30: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 42 2e 62  ELECT R.rid, B.b
6e40: 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  rid..    FROM   
6e50: 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69  revision R, revi
6e60: 73 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64 72  sionbranchchildr
6e70: 65 6e 20 42 0a 09 20 20 20 20 57 48 45 52 45 20  en B..    WHERE 
6e80: 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65   R.rid   IN $the
6e90: 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72  set     -- Restr
6ea0: 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73  ict to revisions
6eb0: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20   of interest..  
6ec0: 20 20 41 4e 44 20 20 20 20 52 2e 72 69 64 20 3d    AND    R.rid =
6ed0: 20 42 2e 72 69 64 20 20 20 20 20 20 20 20 20 20   B.rid          
6ee0: 2d 2d 20 53 65 6c 65 63 74 20 73 75 62 73 65 74  -- Select subset
6ef0: 20 6f 66 20 62 72 61 6e 63 68 20 63 68 69 6c 64   of branch child
6f00: 72 65 6e 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20  ren.    UNION.  
6f10: 20 20 2d 2d 20 28 34 29 20 43 68 69 6c 64 20 6f    -- (4) Child o
6f20: 66 20 74 72 75 6e 6b 20 72 6f 6f 74 20 73 75 63  f trunk root suc
6f30: 63 65 73 73 6f 72 20 6f 66 20 6c 61 73 74 20 4e  cessor of last N
6f40: 54 44 42 20 6f 6e 20 74 72 75 6e 6b 2e 0a 09 20  TDB on trunk... 
6f50: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c     SELECT R.rid,
6f60: 20 52 41 2e 63 68 69 6c 64 0a 09 20 20 20 20 46   RA.child..    F
6f70: 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c 20  ROM revision R, 
6f80: 72 65 76 69 73 69 6f 6e 20 52 41 0a 09 20 20 20  revision RA..   
6f90: 20 57 48 45 52 45 20 52 2e 72 69 64 20 20 20 49   WHERE R.rid   I
6fa0: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 20 2d  N $theset      -
6fb0: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65  - Restrict to re
6fc0: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72  visions of inter
6fd0: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 52  est..    AND   R
6fe0: 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20 20 20  .isdefault      
6ff0: 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69         -- Restri
7000: 63 74 20 74 6f 20 4e 54 44 42 0a 09 20 20 20 20  ct to NTDB..    
7010: 41 4e 44 20 20 20 52 2e 64 62 63 68 69 6c 64 20  AND   R.dbchild 
7020: 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d  IS NOT NULL   --
7030: 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 42 20 62   and last NTDB b
7040: 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72 75 6e  elonging to trun
7050: 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 52 41 2e  k..    AND   RA.
7060: 72 69 64 20 3d 20 52 2e 64 62 63 68 69 6c 64 20  rid = R.dbchild 
7070: 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 72 65 63       -- Go direc
7080: 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 72 6f 6f  tly to trunk roo
7090: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 52 41 2e  t..    AND   RA.
70a0: 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c  child IS NOT NUL
70b0: 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d  L    -- Has prim
70c0: 61 72 79 20 63 68 69 6c 64 2e 0a 09 22 5d 20 7b  ary child..."] {
70d0: 0a 09 20 20 20 20 23 20 43 6f 6e 73 69 64 65 72  ..    # Consider
70e0: 20 6d 6f 76 69 6e 67 20 74 68 69 73 20 74 6f 20   moving this to 
70f0: 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6d 6f  the integrity mo
7100: 64 75 6c 65 2e 0a 09 20 20 20 20 69 6e 74 65 67  dule...    integ
7110: 72 69 74 79 20 61 73 73 65 72 74 20 7b 24 72 69  rity assert {$ri
7120: 64 20 21 3d 20 24 63 68 69 6c 64 7d 20 7b 52 65  d != $child} {Re
7130: 76 69 73 69 6f 6e 20 24 72 69 64 20 64 65 70 65  vision $rid depe
7140: 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 2e 7d 0a  nds on itself.}.
7150: 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70  .    lappend dep
7160: 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20  endencies([list 
7170: 72 65 76 20 24 72 69 64 5d 29 20 5b 6c 69 73 74  rev $rid]) [list
7180: 20 72 65 76 20 24 63 68 69 6c 64 5d 0a 09 7d 0a   rev $child]..}.
7190: 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68  .foreach {rid ch
71a0: 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20  ild} [state run 
71b0: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e  "..    SELECT R.
71c0: 72 69 64 2c 20 54 2e 74 69 64 0a 09 20 20 20 20  rid, T.tid..    
71d0: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20  FROM   revision 
71e0: 52 2c 20 74 61 67 20 54 0a 09 20 20 20 20 57 48  R, tag T..    WH
71f0: 45 52 45 20 20 52 2e 72 69 64 20 69 6e 20 24 74  ERE  R.rid in $t
7200: 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20  heset..    AND  
7210: 20 20 54 2e 72 65 76 20 3d 20 52 2e 72 69 64 0a    T.rev = R.rid.
7220: 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65  ."] {..    lappe
7230: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28  nd dependencies(
7240: 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64 5d 29  [list rev $rid])
7250: 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20   [list sym::tag 
7260: 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65  $child]..}..fore
7270: 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 7d 20  ach {rid child} 
7280: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20  [state run "..  
7290: 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20    SELECT R.rid, 
72a0: 42 2e 62 69 64 0a 09 20 20 20 20 46 52 4f 4d 20  B.bid..    FROM 
72b0: 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 62 72    revision R, br
72c0: 61 6e 63 68 20 42 0a 09 20 20 20 20 57 48 45 52  anch B..    WHER
72d0: 45 20 20 52 2e 72 69 64 20 69 6e 20 24 74 68 65  E  R.rid in $the
72e0: 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  set..    AND    
72f0: 42 2e 72 6f 6f 74 20 3d 20 52 2e 72 69 64 0a 09  B.root = R.rid..
7300: 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e  "] {..    lappen
7310: 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b  d dependencies([
7320: 6c 69 73 74 20 72 65 76 20 24 72 69 64 5d 29 20  list rev $rid]) 
7330: 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63  [list sym::branc
7340: 68 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 72 65  h $child]..}..re
7350: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
7360: 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74  # var(dv) = dict
7370: 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28   (item -> list (
7380: 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20  item)), item  = 
7390: 6c 69 73 74 20 28 74 79 70 65 20 69 64 29 0a 20  list (type id). 
73a0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 70 72     typemethod pr
73b0: 65 64 65 63 65 73 73 6f 72 73 20 7b 64 76 20 72  edecessors {dv r
73c0: 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76  evisions} {..upv
73d0: 61 72 20 31 20 24 64 76 20 64 65 70 65 6e 64 65  ar 1 $dv depende
73e0: 6e 63 69 65 73 0a 09 73 65 74 20 74 68 65 73 65  ncies..set these
73f0: 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73  t ('[join $revis
7400: 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09  ions {','}]')...
7410: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
7420: 63 61 73 65 73 20 73 70 65 63 69 66 79 20 77 68  cases specify wh
7430: 65 6e 20 61 20 72 65 76 69 73 69 6f 6e 20 50 20  en a revision P 
7440: 69 73 20 61 0a 09 23 20 70 72 65 64 65 63 65 73  is a..# predeces
7450: 73 6f 72 20 6f 66 20 61 20 72 65 76 69 73 69 6f  sor of a revisio
7460: 6e 20 52 2e 20 45 61 63 68 20 6f 66 20 74 68 65  n R. Each of the
7470: 20 63 61 73 65 73 20 74 72 61 6e 73 6c 61 74 65   cases translate
7480: 73 0a 09 23 20 69 6e 74 6f 20 6f 6e 65 20 6f 66  s..# into one of
7490: 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 6f 66   the branches of
74a0: 20 74 68 65 20 53 51 4c 20 55 4e 49 4f 4e 20 63   the SQL UNION c
74b0: 6f 6d 69 6e 67 20 62 65 6c 6f 77 2e 0a 09 23 0a  oming below...#.
74c0: 09 23 20 28 31 29 20 54 68 65 20 69 6d 6d 65 64  .# (1) The immed
74d0: 69 61 74 65 20 70 61 72 65 6e 74 20 52 2e 70 61  iate parent R.pa
74e0: 72 65 6e 74 20 6f 66 20 52 20 69 73 20 61 20 70  rent of R is a p
74f0: 72 65 64 65 63 65 73 73 6f 72 20 6f 66 0a 09 23  redecessor of..#
7500: 20 20 20 20 20 52 2e 20 4e 4f 54 45 3a 20 54 68       R. NOTE: Th
7510: 69 73 20 69 73 20 74 72 75 65 20 66 6f 72 20 52  is is true for R
7520: 20 65 69 74 68 65 72 20 70 72 69 6d 61 72 79 20   either primary 
7530: 6f 72 20 73 65 63 6f 6e 64 61 72 79 0a 09 23 20  or secondary..# 
7540: 20 20 20 20 63 68 69 6c 64 20 6f 66 20 50 2e 20      child of P. 
7550: 49 74 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79  It not necessary
7560: 20 74 6f 20 64 69 73 74 69 6e 67 75 69 73 68 20   to distinguish 
7570: 74 68 65 20 74 77 6f 0a 09 23 20 20 20 20 20 63  the two..#     c
7580: 61 73 65 73 2c 20 69 6e 20 63 6f 6e 74 72 61 73  ases, in contras
7590: 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 72 65  t to the code re
75a0: 74 72 69 65 76 69 6e 67 20 74 68 65 20 73 75 63  trieving the suc
75b0: 63 65 73 73 6f 72 0a 09 23 20 20 20 20 20 69 6e  cessor..#     in
75c0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 09 23 0a 09 23  formation...#..#
75d0: 20 28 32 29 20 54 68 65 20 63 6f 6d 70 6c 65 6d   (2) The complem
75e0: 65 6e 74 20 6f 66 20 73 75 63 63 65 73 73 6f 72  ent of successor
75f0: 20 63 61 73 65 20 28 33 29 2e 20 54 68 65 20 74   case (3). The t
7600: 72 75 6e 6b 20 72 6f 6f 74 20 69 73 0a 09 23 20  runk root is..# 
7610: 20 20 20 20 61 20 70 72 65 64 65 63 65 73 73 6f      a predecesso
7620: 72 20 6f 66 20 61 20 4e 54 44 42 20 72 6f 6f 74  r of a NTDB root
7630: 2e 20 52 45 4d 4f 56 45 44 2e 20 53 65 65 20 27  . REMOVED. See '
7640: 73 75 63 63 65 73 73 6f 72 73 27 0a 09 23 20 20  successors'..#  
7650: 20 20 20 66 6f 72 20 74 68 65 20 65 78 70 6c 61     for the expla
7660: 6e 61 74 69 6f 6e 2e 0a 09 23 0a 09 23 20 28 33  nation...#..# (3
7670: 29 20 54 68 65 20 63 6f 6d 70 6c 65 6d 65 6e 74  ) The complement
7680: 20 6f 66 20 73 75 63 63 65 73 73 6f 72 20 63 61   of successor ca
7690: 73 65 20 28 34 29 2e 20 54 68 65 20 6c 61 73 74  se (4). The last
76a0: 20 4e 54 44 42 0a 09 23 20 20 20 20 20 72 65 76   NTDB..#     rev
76b0: 69 73 69 6f 6e 20 62 65 6c 6f 6e 67 69 6e 67 20  ision belonging 
76c0: 74 6f 20 74 68 65 20 74 72 75 6e 6b 20 69 73 20  to the trunk is 
76d0: 61 20 70 72 65 64 65 63 65 73 73 6f 72 20 6f 66  a predecessor of
76e0: 20 74 68 65 0a 09 23 20 20 20 20 20 70 72 69 6d   the..#     prim
76f0: 61 72 79 20 63 68 69 6c 64 20 6f 66 20 74 68 65  ary child of the
7700: 20 74 72 75 6e 6b 20 72 6f 6f 74 20 28 54 68 65   trunk root (The
7710: 20 27 31 2e 32 27 20 72 65 76 69 73 69 6f 6e 29   '1.2' revision)
7720: 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64  ....foreach {rid
7730: 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20   parent} [state 
7740: 72 75 6e 20 22 0a 20 20 20 2d 2d 20 28 31 29 20  run ".   -- (1) 
7750: 50 72 69 6d 61 72 79 20 70 61 72 65 6e 74 2c 20  Primary parent, 
7760: 63 61 6e 20 62 65 20 69 6e 20 64 69 66 66 65 72  can be in differ
7770: 65 6e 74 20 4c 4f 44 20 66 6f 72 20 66 69 72 73  ent LOD for firs
7780: 74 20 69 6e 20 61 20 62 72 61 6e 63 68 0a 09 20  t in a branch.. 
7790: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c     SELECT R.rid,
77a0: 20 52 2e 70 61 72 65 6e 74 0a 09 20 20 20 20 46   R.parent..    F
77b0: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52  ROM   revision R
77c0: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72  ..    WHERE  R.r
77d0: 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20  id   IN $theset 
77e0: 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20      -- Restrict 
77f0: 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20  to revisions of 
7800: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e  interest..    AN
7810: 44 20 20 20 20 52 2e 70 61 72 65 6e 74 20 49 53  D    R.parent IS
7820: 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d 20 48   NOT NULL   -- H
7830: 61 73 20 70 72 69 6d 61 72 79 20 70 61 72 65 6e  as primary paren
7840: 74 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20  t.    UNION.    
7850: 2d 2d 20 28 33 29 20 4c 61 73 74 20 4e 54 44 42  -- (3) Last NTDB
7860: 20 6f 6e 20 74 72 75 6e 6b 20 69 73 20 70 72 65   on trunk is pre
7870: 64 65 63 65 73 73 6f 72 20 6f 66 20 63 68 69 6c  decessor of chil
7880: 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 0a  d of trunk root.
7890: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69  .    SELECT R.ri
78a0: 64 2c 20 52 41 2e 64 62 70 61 72 65 6e 74 0a 09  d, RA.dbparent..
78b0: 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73      FROM   revis
78c0: 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 20  ion R, revision 
78d0: 52 41 0a 09 20 20 20 20 57 48 45 52 45 20 20 52  RA..    WHERE  R
78e0: 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 20  .rid IN $theset 
78f0: 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72          -- Restr
7900: 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73  ict to revisions
7910: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20   of interest..  
7920: 20 20 41 4e 44 20 20 20 20 4e 4f 54 20 52 2e 69    AND    NOT R.i
7930: 73 64 65 66 61 75 6c 74 20 20 20 20 20 20 20 20  sdefault        
7940: 20 20 2d 2d 20 6e 6f 74 20 6f 6e 20 4e 54 44 42    -- not on NTDB
7950: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 70  ..    AND    R.p
7960: 61 72 65 6e 74 20 49 53 20 4e 4f 54 20 4e 55 4c  arent IS NOT NUL
7970: 4c 20 20 20 20 20 2d 2d 20 77 68 69 63 68 20 61  L     -- which a
7980: 72 65 20 6e 6f 74 20 72 6f 6f 74 0a 09 20 20 20  re not root..   
7990: 20 41 4e 44 20 20 20 20 52 41 2e 72 69 64 20 3d   AND    RA.rid =
79a0: 20 52 2e 70 61 72 65 6e 74 20 20 20 20 20 20 20   R.parent       
79b0: 20 2d 2d 20 67 6f 20 74 6f 20 74 68 65 69 72 20   -- go to their 
79c0: 70 61 72 65 6e 74 0a 09 20 20 20 20 41 4e 44 20  parent..    AND 
79d0: 20 20 20 52 41 2e 64 62 70 61 72 65 6e 74 20 49     RA.dbparent I
79e0: 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 2d 2d 20 77  S NOT NULL  -- w
79f0: 68 69 63 68 20 68 61 73 20 74 6f 20 72 65 66 65  hich has to refe
7a00: 72 20 74 6f 20 4e 54 44 42 27 73 20 72 6f 6f 74  r to NTDB's root
7a10: 0a 09 22 5d 20 7b 0a 09 20 20 20 20 23 20 43 6f  .."] {..    # Co
7a20: 6e 73 69 64 65 72 20 6d 6f 76 69 6e 67 20 74 68  nsider moving th
7a30: 69 73 20 74 6f 20 74 68 65 20 69 6e 74 65 67 72  is to the integr
7a40: 69 74 79 20 6d 6f 64 75 6c 65 2e 0a 09 20 20 20  ity module...   
7a50: 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72   integrity asser
7a60: 74 20 7b 24 72 69 64 20 21 3d 20 24 70 61 72 65  t {$rid != $pare
7a70: 6e 74 7d 20 7b 52 65 76 69 73 69 6f 6e 20 24 72  nt} {Revision $r
7a80: 69 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 74  id depends on it
7a90: 73 65 6c 66 2e 7d 0a 09 20 20 20 20 6c 61 70 70  self.}..    lapp
7aa0: 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73  end dependencies
7ab0: 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64 5d  ([list rev $rid]
7ac0: 29 20 5b 6c 69 73 74 20 72 65 76 20 24 70 61 72  ) [list rev $par
7ad0: 65 6e 74 5d 0a 09 7d 0a 0a 09 23 20 54 68 65 20  ent]..}...# The 
7ae0: 72 65 76 69 73 69 6f 6e 73 20 77 68 69 63 68 20  revisions which 
7af0: 61 72 65 20 74 68 65 20 66 69 72 73 74 20 6f 6e  are the first on
7b00: 20 61 20 62 72 61 6e 63 68 20 68 61 76 65 20 74   a branch have t
7b10: 68 61 74 0a 09 23 20 62 72 61 6e 63 68 20 61 73  hat..# branch as
7b20: 20 74 68 65 69 72 20 70 72 65 64 65 63 65 73 73   their predecess
7b30: 6f 72 2e 20 4e 6f 74 65 20 74 68 61 74 20 72 65  or. Note that re
7b40: 76 69 73 69 6f 6e 73 20 63 61 6e 6e 6f 74 20 62  visions cannot b
7b50: 65 0a 09 23 20 6f 6e 20 74 61 67 73 20 69 6e 20  e..# on tags in 
7b60: 74 68 65 20 73 61 6d 65 20 6d 61 6e 6e 65 72 2c  the same manner,
7b70: 20 73 6f 20 74 61 67 73 20 63 61 6e 6e 6f 74 20   so tags cannot 
7b80: 62 65 20 70 72 65 64 65 63 65 73 73 6f 72 73 0a  be predecessors.
7b90: 09 23 20 6f 66 20 72 65 76 69 73 69 6f 6e 73 2e  .# of revisions.
7ba0: 20 54 68 69 73 20 63 6f 6d 70 6c 65 6d 65 6e 74   This complement
7bb0: 73 20 74 68 61 74 20 74 68 65 79 20 68 61 76 65  s that they have
7bc0: 20 6e 6f 20 73 75 63 63 65 73 73 6f 72 73 0a 09   no successors..
7bd0: 23 20 28 53 65 65 20 73 79 6d 3a 3a 74 61 67 2f  # (See sym::tag/
7be0: 73 75 63 63 65 73 73 6f 72 73 29 2e 0a 0a 09 66  successors)....f
7bf0: 6f 72 65 61 63 68 20 7b 72 69 64 20 70 61 72 65  oreach {rid pare
7c00: 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22  nt} [state run "
7c10: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
7c20: 69 64 20 42 2e 62 69 64 0a 09 20 20 20 20 46 52  id B.bid..    FR
7c30: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c  OM   revision R,
7c40: 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20 20 57   branch B..    W
7c50: 48 45 52 45 20 20 52 2e 72 69 64 20 49 4e 20 24  HERE  R.rid IN $
7c60: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20  theset..    AND 
7c70: 20 20 20 42 2e 66 69 72 73 74 20 3d 20 52 2e 72     B.first = R.r
7c80: 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61  id.."] {..    la
7c90: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69  ppend dependenci
7ca0: 65 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69  es([list rev $ri
7cb0: 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62  d]) [list sym::b
7cc0: 72 61 6e 63 68 20 24 70 61 72 65 6e 74 5d 0a 09  ranch $parent]..
7cd0: 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  }..return.    }.
7ce0: 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23 23  }..# # ## ### ##
7cf0: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23  ### ######## ###
7d00: 23 23 23 23 23 23 23 23 23 23 20 23 23 23 23 23  ########## #####
7d10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7d20: 0a 23 23 20 48 65 6c 70 65 72 20 73 69 6e 67 6c  .## Helper singl
7d30: 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20 66  eton. Commands f
7d40: 6f 72 20 74 61 67 20 73 79 6d 62 6f 6c 20 63 68  or tag symbol ch
7d50: 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e 69 74 3a  angesets...snit:
7d60: 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f 73 73  :type ::vc::foss
7d70: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a  il::import::cvs:
7d80: 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 73  :project::rev::s
7d90: 79 6d 3a 3a 74 61 67 20 7b 0a 20 20 20 20 74 79  ym::tag {.    ty
7da0: 70 65 6d 65 74 68 6f 64 20 62 79 72 65 76 69 73  pemethod byrevis
7db0: 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20  ion {} { return 
7dc0: 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68  0 }.    typemeth
7dd0: 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 20 7b 7d  od bysymbol   {}
7de0: 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a 20 20   { return 1 }.  
7df0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73 74    typemethod ist
7e00: 61 67 20 20 20 20 20 20 7b 7d 20 7b 20 72 65 74  ag      {} { ret
7e10: 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 79 70 65  urn 1 }.    type
7e20: 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63 68 20  method isbranch 
7e30: 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20    {} { return 0 
7e40: 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  }..    typemetho
7e50: 64 20 73 74 72 20 7b 74 61 67 7d 20 7b 0a 09 73  d str {tag} {..s
7e60: 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69  truct::list assi
7e70: 67 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a  gn [state run {.
7e80: 09 20 20 20 20 53 45 4c 45 43 54 20 53 2e 6e 61  .    SELECT S.na
7e90: 6d 65 2c 20 46 2e 6e 61 6d 65 2c 20 50 2e 6e 61  me, F.name, P.na
7ea0: 6d 65 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 74  me..    FROM   t
7eb0: 61 67 20 54 2c 20 73 79 6d 62 6f 6c 20 53 2c 20  ag T, symbol S, 
7ec0: 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65 63 74 20  file F, project 
7ed0: 50 0a 09 20 20 20 20 57 48 45 52 45 20 20 54 2e  P..    WHERE  T.
7ee0: 74 69 64 20 3d 20 24 74 61 67 0a 09 20 20 20 20  tid = $tag..    
7ef0: 41 4e 44 20 20 20 20 46 2e 66 69 64 20 3d 20 54  AND    F.fid = T
7f00: 2e 66 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20  .fid..    AND   
7f10: 20 50 2e 70 69 64 20 3d 20 46 2e 70 69 64 0a 09   P.pid = F.pid..
7f20: 20 20 20 20 41 4e 44 20 20 20 20 53 2e 73 69 64      AND    S.sid
7f30: 20 3d 20 54 2e 73 69 64 0a 09 7d 5d 20 73 6e 61   = T.sid..}] sna
7f40: 6d 65 20 66 6e 61 6d 65 20 70 6e 61 6d 65 0a 09  me fname pname..
7f50: 72 65 74 75 72 6e 20 22 24 70 6e 61 6d 65 2f 54  return "$pname/T
7f60: 27 24 7b 73 6e 61 6d 65 7d 27 3a 3a 24 66 6e 61  '${sname}'::$fna
7f70: 6d 65 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  me".    }..    #
7f80: 20 72 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 28   result = list (
7f90: 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74 69 6d 65  mintime, maxtime
7fa0: 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ).    typemethod
7fb0: 20 74 69 6d 65 72 61 6e 67 65 20 7b 74 61 67 73   timerange {tags
7fc0: 7d 20 7b 0a 09 23 20 54 68 65 20 72 61 6e 67 65  } {..# The range
7fd0: 20 69 73 20 64 65 66 69 6e 65 64 20 61 73 20 74   is defined as t
7fe0: 68 65 20 72 61 6e 67 65 20 6f 66 20 74 68 65 20  he range of the 
7ff0: 72 65 76 69 73 69 6f 6e 73 20 74 68 65 20 74 61  revisions the ta
8000: 67 73 0a 09 23 20 61 72 65 20 61 74 74 61 63 68  gs..# are attach
8010: 65 64 20 74 6f 2e 0a 0a 09 73 65 74 20 74 68 65  ed to....set the
8020: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 74 61 67  set ('[join $tag
8030: 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75  s {','}]')..retu
8040: 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a  rn [state run ".
8050: 09 20 20 20 20 53 45 4c 45 43 54 20 4d 49 4e 28  .    SELECT MIN(
8060: 52 2e 64 61 74 65 29 2c 20 4d 41 58 28 52 2e 64  R.date), MAX(R.d
8070: 61 74 65 29 0a 09 20 20 20 20 46 52 4f 4d 20 72  ate)..    FROM r
8080: 65 76 69 73 69 6f 6e 20 52 2c 20 74 61 67 20 54  evision R, tag T
8090: 0a 09 20 20 20 20 57 48 45 52 45 20 54 2e 74 69  ..    WHERE T.ti
80a0: 64 20 49 4e 20 24 74 68 65 73 65 74 0a 20 20 20  d IN $theset.   
80b0: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 52           AND   R
80c0: 2e 72 69 64 20 3d 20 54 2e 72 65 76 0a 09 22 5d  .rid = T.rev.."]
80d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61  .    }..    # va
80e0: 72 28 64 76 29 20 3d 20 64 69 63 74 20 28 69 74  r(dv) = dict (it
80f0: 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d  em -> list (item
8100: 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74  )), item  = list
8110: 20 28 74 79 70 65 20 69 64 29 0a 20 20 20 20 74   (type id).    t
8120: 79 70 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73  ypemethod succes
8130: 73 6f 72 73 20 7b 64 76 20 74 61 67 73 7d 20 7b  sors {dv tags} {
8140: 0a 09 23 20 54 61 67 73 20 68 61 76 65 20 6e 6f  ..# Tags have no
8150: 20 73 75 63 63 65 73 73 6f 72 73 2e 0a 09 72 65   successors...re
8160: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
8170: 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74  # var(dv) = dict
8180: 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28   (item -> list (
8190: 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20  item)), item  = 
81a0: 6c 69 73 74 20 28 74 79 70 65 20 69 64 29 0a 20  list (type id). 
81b0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 70 72     typemethod pr
81c0: 65 64 65 63 65 73 73 6f 72 73 20 7b 64 76 20 74  edecessors {dv t
81d0: 61 67 73 7d 20 7b 0a 09 23 20 54 68 65 20 70 72  ags} {..# The pr
81e0: 65 64 65 63 65 73 73 6f 72 73 20 6f 66 20 61 20  edecessors of a 
81f0: 74 61 67 20 61 72 65 20 61 6c 6c 20 74 68 65 20  tag are all the 
8200: 72 65 76 69 73 69 6f 6e 73 20 74 68 65 20 74 61  revisions the ta
8210: 67 73 20 61 72 65 0a 09 23 20 61 74 74 61 63 68  gs are..# attach
8220: 65 64 20 74 6f 2c 20 61 73 20 77 65 6c 6c 20 61  ed to, as well a
8230: 73 20 61 6c 6c 20 74 68 65 20 62 72 61 6e 63 68  s all the branch
8240: 65 73 20 6f 72 20 74 61 67 73 20 77 68 69 63 68  es or tags which
8250: 20 61 72 65 0a 09 23 20 74 68 65 69 72 20 70 72   are..# their pr
8260: 65 66 65 72 65 64 20 70 61 72 65 6e 74 73 2e 0a  efered parents..
8270: 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b  ..set theset ('[
8280: 6a 6f 69 6e 20 24 74 61 67 73 20 7b 27 2c 27 7d  join $tags {','}
8290: 5d 27 29 0a 09 66 6f 72 65 61 63 68 20 7b 74 69  ]')..foreach {ti
82a0: 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65  d parent} [state
82b0: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45   run "..    SELE
82c0: 43 54 20 54 2e 74 69 64 2c 20 52 2e 72 69 64 0a  CT T.tid, R.rid.
82d0: 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69  .    FROM   revi
82e0: 73 69 6f 6e 20 52 2c 20 74 61 67 20 54 0a 09 20  sion R, tag T.. 
82f0: 20 20 20 57 48 45 52 45 20 20 54 2e 74 69 64 20     WHERE  T.tid 
8300: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20  IN $theset..    
8310: 41 4e 44 20 20 20 20 54 2e 72 65 76 20 3d 20 52  AND    T.rev = R
8320: 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20  .rid.."] {..    
8330: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e  lappend dependen
8340: 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a  cies([list sym::
8350: 74 61 67 20 24 74 69 64 5d 29 20 5b 6c 69 73 74  tag $tid]) [list
8360: 20 72 65 76 20 24 70 61 72 65 6e 74 5d 0a 09 7d   rev $parent]..}
8370: 0a 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20  ...foreach {tid 
8380: 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72  parent} [state r
8390: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54  un "..    SELECT
83a0: 20 54 2e 74 69 64 2c 20 42 2e 62 69 64 0a 09 20   T.tid, B.bid.. 
83b0: 20 20 20 46 52 4f 4d 20 20 20 74 61 67 20 54 2c     FROM   tag T,
83c0: 20 62 72 61 6e 63 68 20 42 2c 20 70 72 65 66 65   branch B, prefe
83d0: 72 65 64 70 61 72 65 6e 74 20 50 0a 09 20 20 20  redparent P..   
83e0: 20 57 48 45 52 45 20 20 54 2e 74 69 64 20 49 4e   WHERE  T.tid IN
83f0: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e   $theset..    AN
8400: 44 20 20 20 20 54 2e 73 69 64 20 3d 20 50 2e 73  D    T.sid = P.s
8410: 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50  id..    AND    P
8420: 2e 70 69 64 20 3d 20 42 2e 73 69 64 0a 09 22 5d  .pid = B.sid.."]
8430: 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20   {..    lappend 
8440: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69  dependencies([li
8450: 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 74 69 64  st sym::tag $tid
8460: 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72  ]) [list sym::br
8470: 61 6e 63 68 20 24 70 61 72 65 6e 74 5d 0a 09 7d  anch $parent]..}
8480: 0a 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20  ...foreach {tid 
8490: 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72  parent} [state r
84a0: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54  un "..    SELECT
84b0: 20 54 2e 74 69 64 2c 20 54 58 2e 74 69 64 0a 09   T.tid, TX.tid..
84c0: 20 20 20 20 46 52 4f 4d 20 20 20 74 61 67 20 54      FROM   tag T
84d0: 2c 20 74 61 67 20 54 58 2c 20 70 72 65 66 65 72  , tag TX, prefer
84e0: 65 64 70 61 72 65 6e 74 20 50 0a 09 20 20 20 20  edparent P..    
84f0: 57 48 45 52 45 20 20 54 2e 74 69 64 20 49 4e 20  WHERE  T.tid IN 
8500: 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44  $theset..    AND
8510: 20 20 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 69      T.sid = P.si
8520: 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e  d..    AND    P.
8530: 70 69 64 20 3d 20 54 58 2e 73 69 64 0a 09 22 5d  pid = TX.sid.."]
8540: 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20   {..    lappend 
8550: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69  dependencies([li
8560: 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 74 69 64  st sym::tag $tid
8570: 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61  ]) [list sym::ta
8580: 67 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 72  g $parent]..}..r
8590: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 7d 0a 0a 23  eturn.    }.}..#
85a0: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20   # ## ### ##### 
85b0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
85c0: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
85d0: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20  ############.## 
85e0: 48 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e  Helper singleton
85f0: 2e 20 43 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 62  . Commands for b
8600: 72 61 6e 63 68 20 73 79 6d 62 6f 6c 20 63 68 61  ranch symbol cha
8610: 6e 67 65 73 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a  ngesets...snit::
8620: 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69  type ::vc::fossi
8630: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a  l::import::cvs::
8640: 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 73 79  project::rev::sy
8650: 6d 3a 3a 62 72 61 6e 63 68 20 7b 0a 20 20 20 20  m::branch {.    
8660: 74 79 70 65 6d 65 74 68 6f 64 20 62 79 72 65 76  typemethod byrev
8670: 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75 72  ision {} { retur
8680: 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65  n 0 }.    typeme
8690: 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 20  thod bysymbol   
86a0: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a  {} { return 1 }.
86b0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69      typemethod i
86c0: 73 74 61 67 20 20 20 20 20 20 7b 7d 20 7b 20 72  stag      {} { r
86d0: 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79  eturn 0 }.    ty
86e0: 70 65 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63  pemethod isbranc
86f0: 68 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20  h   {} { return 
8700: 31 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74  1 }..    typemet
8710: 68 6f 64 20 73 74 72 20 7b 62 72 61 6e 63 68 7d  hod str {branch}
8720: 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74   {..struct::list
8730: 20 61 73 73 69 67 6e 20 5b 73 74 61 74 65 20 72   assign [state r
8740: 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54  un {..    SELECT
8750: 20 53 2e 6e 61 6d 65 2c 20 46 2e 6e 61 6d 65 2c   S.name, F.name,
8760: 20 50 2e 6e 61 6d 65 0a 09 20 20 20 20 46 52 4f   P.name..    FRO
8770: 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20 73 79  M   branch B, sy
8780: 6d 62 6f 6c 20 53 2c 20 66 69 6c 65 20 46 2c 20  mbol S, file F, 
8790: 70 72 6f 6a 65 63 74 20 50 0a 09 20 20 20 20 57  project P..    W
87a0: 48 45 52 45 20 20 42 2e 62 69 64 20 3d 20 24 62  HERE  B.bid = $b
87b0: 72 61 6e 63 68 0a 09 20 20 20 20 41 4e 44 20 20  ranch..    AND  
87c0: 20 20 46 2e 66 69 64 20 3d 20 42 2e 66 69 64 0a    F.fid = B.fid.
87d0: 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69  .    AND    P.pi
87e0: 64 20 3d 20 46 2e 70 69 64 0a 09 20 20 20 20 41  d = F.pid..    A
87f0: 4e 44 20 20 20 20 53 2e 73 69 64 20 3d 20 42 2e  ND    S.sid = B.
8800: 73 69 64 0a 09 7d 5d 20 73 6e 61 6d 65 20 66 6e  sid..}] sname fn
8810: 61 6d 65 20 70 6e 61 6d 65 0a 09 72 65 74 75 72  ame pname..retur
8820: 6e 20 22 24 70 6e 61 6d 65 2f 42 27 24 7b 73 6e  n "$pname/B'${sn
8830: 61 6d 65 7d 27 3a 3a 24 66 6e 61 6d 65 22 0a 20  ame}'::$fname". 
8840: 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75     }..    # resu
8850: 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69 6e 74 69  lt = list (minti
8860: 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a 20 20 20  me, maxtime).   
8870: 20 74 79 70 65 6d 65 74 68 6f 64 20 74 69 6d 65   typemethod time
8880: 72 61 6e 67 65 20 7b 62 72 61 6e 63 68 65 73 7d  range {branches}
8890: 20 7b 0a 09 23 20 54 68 65 20 72 61 6e 67 65 20   {..# The range 
88a0: 6f 66 20 61 20 62 72 61 6e 63 68 20 69 73 20 64  of a branch is d
88b0: 65 66 69 6e 65 64 20 61 73 20 74 68 65 20 72 61  efined as the ra
88c0: 6e 67 65 20 6f 66 20 74 68 65 0a 09 23 20 72 65  nge of the..# re
88d0: 76 69 73 69 6f 6e 73 20 74 68 65 20 62 72 61 6e  visions the bran
88e0: 63 68 65 73 20 61 72 65 20 73 70 61 77 6e 65 64  ches are spawned
88f0: 20 62 79 2e 20 4e 4f 54 45 20 68 6f 77 65 76 65   by. NOTE howeve
8900: 72 20 74 68 61 74 20 74 68 65 0a 09 23 20 62 72  r that the..# br
8910: 61 6e 63 68 65 73 20 61 73 73 6f 63 69 61 74 65  anches associate
8920: 64 20 77 69 74 68 20 61 20 64 65 74 61 63 68 65  d with a detache
8930: 64 20 4e 54 44 42 20 77 69 6c 6c 20 68 61 76 65  d NTDB will have
8940: 20 6e 6f 20 72 6f 6f 74 0a 09 23 20 73 70 61 77   no root..# spaw
8950: 6e 69 6e 67 20 74 68 65 6d 2c 20 68 65 6e 63 65  ning them, hence
8960: 20 74 68 65 79 20 68 61 76 65 20 6e 6f 20 72 65   they have no re
8970: 61 6c 20 74 69 6d 65 72 61 6e 67 65 20 61 6e 79  al timerange any
8980: 0a 09 23 20 6c 6f 6e 67 65 72 2e 20 42 79 20 75  ..# longer. By u
8990: 73 69 6e 67 20 30 20 77 65 20 70 75 74 20 74 68  sing 0 we put th
89a0: 65 6d 20 69 6e 20 66 72 6f 6e 74 20 6f 66 20 65  em in front of e
89b0: 76 65 72 79 74 68 69 6e 67 20 65 6c 73 65 2c 0a  verything else,.
89c0: 09 23 20 61 73 20 74 68 65 79 20 6c 6f 67 69 63  .# as they logic
89d0: 61 6c 6c 79 20 61 72 65 2e 0a 0a 09 73 65 74 20  ally are....set 
89e0: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24  theset ('[join $
89f0: 62 72 61 6e 63 68 65 73 20 7b 27 2c 27 7d 5d 27  branches {','}]'
8a00: 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61 74 65  )..return [state
8a10: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45   run "..    SELE
8a20: 43 54 20 49 46 4e 55 4c 4c 28 4d 49 4e 28 52 2e  CT IFNULL(MIN(R.
8a30: 64 61 74 65 29 2c 30 29 2c 20 49 46 4e 55 4c 4c  date),0), IFNULL
8a40: 28 4d 41 58 28 52 2e 64 61 74 65 29 2c 30 29 0a  (MAX(R.date),0).
8a50: 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69  .    FROM revisi
8a60: 6f 6e 20 52 2c 20 62 72 61 6e 63 68 20 42 0a 09  on R, branch B..
8a70: 20 20 20 20 57 48 45 52 45 20 42 2e 62 69 64 20      WHERE B.bid 
8a80: 49 4e 20 24 74 68 65 73 65 74 0a 20 20 20 20 20  IN $theset.     
8a90: 20 20 20 20 20 20 20 41 4e 44 20 20 20 52 2e 72         AND   R.r
8aa0: 69 64 20 3d 20 42 2e 72 6f 6f 74 0a 09 22 5d 0a  id = B.root.."].
8ab0: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72      }..    # var
8ac0: 28 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 65  (dv) = dict (ite
8ad0: 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29  m -> list (item)
8ae0: 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20  ), item  = list 
8af0: 28 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 79  (type id).    ty
8b00: 70 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73  pemethod success
8b10: 6f 72 73 20 7b 64 76 20 62 72 61 6e 63 68 65 73  ors {dv branches
8b20: 7d 20 7b 0a 09 23 20 54 68 65 20 66 69 72 73 74  } {..# The first
8b30: 20 72 65 76 69 73 69 6f 6e 20 63 6f 6d 6d 69 74   revision commit
8b40: 74 65 64 20 6f 6e 20 61 20 62 72 61 6e 63 68 2c  ted on a branch,
8b50: 20 61 6e 64 20 61 6c 6c 20 62 72 61 6e 63 68 65   and all branche
8b60: 73 0a 09 23 20 61 6e 64 20 74 61 67 73 20 77 68  s..# and tags wh
8b70: 69 63 68 20 68 61 76 65 20 69 74 20 61 73 20 74  ich have it as t
8b80: 68 65 69 72 20 70 72 65 66 65 72 65 64 20 70 61  heir prefered pa
8b90: 72 65 6e 74 20 61 72 65 20 74 68 65 0a 09 23 20  rent are the..# 
8ba0: 73 75 63 63 65 73 73 6f 72 73 20 6f 66 20 61 20  successors of a 
8bb0: 62 72 61 6e 63 68 2e 0a 0a 09 73 65 74 20 74 68  branch....set th
8bc0: 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72  eset ('[join $br
8bd0: 61 6e 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a  anches {','}]').
8be0: 09 66 6f 72 65 61 63 68 20 7b 62 69 64 20 63 68  .foreach {bid ch
8bf0: 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20  ild} [state run 
8c00: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e  "..    SELECT B.
8c10: 62 69 64 2c 20 52 2e 72 69 64 0a 09 20 20 20 20  bid, R.rid..    
8c20: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20  FROM   revision 
8c30: 52 2c 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20  R, branch B..   
8c40: 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e   WHERE  B.bid IN
8c50: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e   $theset..    AN
8c60: 44 20 20 20 20 42 2e 66 69 72 73 74 20 3d 20 52  D    B.first = R
8c70: 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20  .rid.."] {..    
8c80: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e  lappend dependen
8c90: 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a  cies([list sym::
8ca0: 74 61 67 20 24 62 69 64 5d 29 20 5b 6c 69 73 74  tag $bid]) [list
8cb0: 20 72 65 76 20 24 63 68 69 6c 64 5d 0a 09 7d 0a   rev $child]..}.
8cc0: 09 66 6f 72 65 61 63 68 20 7b 62 69 64 20 63 68  .foreach {bid ch
8cd0: 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20  ild} [state run 
8ce0: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e  "..    SELECT B.
8cf0: 62 69 64 2c 20 42 58 2e 62 69 64 0a 09 20 20 20  bid, BX.bid..   
8d00: 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42   FROM   branch B
8d10: 2c 20 62 72 61 6e 63 68 20 42 58 2c 20 70 72 65  , branch BX, pre
8d20: 66 65 72 65 64 70 61 72 65 6e 74 20 50 0a 09 20  feredparent P.. 
8d30: 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20     WHERE  B.bid 
8d40: 49 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20  IN $theset..    
8d50: 41 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50  AND    B.sid = P
8d60: 2e 70 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20  .pid..    AND   
8d70: 20 42 58 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a   BX.sid = P.sid.
8d80: 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65  ."] {..    lappe
8d90: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28  nd dependencies(
8da0: 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24  [list sym::tag $
8db0: 62 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a  bid]) [list sym:
8dc0: 3a 62 72 61 6e 63 68 20 24 63 68 69 6c 64 5d 0a  :branch $child].
8dd0: 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64  .}..foreach {bid
8de0: 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72   child} [state r
8df0: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54  un "..    SELECT
8e00: 20 42 2e 62 69 64 2c 20 54 2e 74 69 64 0a 09 20   B.bid, T.tid.. 
8e10: 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68     FROM   branch
8e20: 20 42 2c 20 74 61 67 20 54 2c 20 70 72 65 66 65   B, tag T, prefe
8e30: 72 65 64 70 61 72 65 6e 74 20 50 0a 09 20 20 20  redparent P..   
8e40: 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e   WHERE  B.bid IN
8e50: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e   $theset..    AN
8e60: 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50 2e 70  D    B.sid = P.p
8e70: 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 54  id..    AND    T
8e80: 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a 09 22 5d  .sid = P.sid.."]
8e90: 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20   {..    lappend 
8ea0: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69  dependencies([li
8eb0: 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 62 69 64  st sym::tag $bid
8ec0: 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61  ]) [list sym::ta
8ed0: 67 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 72 65  g $child]..}..re
8ee0: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
8ef0: 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74  # var(dv) = dict
8f00: 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28   (item -> list (
8f10: 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20  item)), item  = 
8f20: 6c 69 73 74 20 28 74 79 70 65 20 69 64 29 0a 20  list (type id). 
8f30: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 70 72     typemethod pr
8f40: 65 64 65 63 65 73 73 6f 72 73 20 7b 64 76 20 62  edecessors {dv b
8f50: 72 61 6e 63 68 65 73 7d 20 7b 0a 09 23 20 54 68  ranches} {..# Th
8f60: 65 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 6f  e predecessors o
8f70: 66 20 61 20 62 72 61 6e 63 68 20 61 72 65 20 61  f a branch are a
8f80: 6c 6c 20 74 68 65 20 72 65 76 69 73 69 6f 6e 73  ll the revisions
8f90: 20 74 68 65 0a 09 23 20 62 72 61 6e 63 68 65 73   the..# branches
8fa0: 20 61 72 65 20 73 70 61 77 6e 65 64 20 66 72 6f   are spawned fro
8fb0: 6d 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 61 6c  m, as well as al
8fc0: 6c 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 6f  l the branches o
8fd0: 72 0a 09 23 20 74 61 67 73 20 77 68 69 63 68 20  r..# tags which 
8fe0: 61 72 65 20 74 68 65 69 72 20 70 72 65 66 65 72  are their prefer
8ff0: 65 64 20 70 61 72 65 6e 74 73 2e 0a 0a 09 73 65  ed parents....se
9000: 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e  t theset ('[join
9010: 20 24 74 61 67 73 20 7b 27 2c 27 7d 5d 27 29 0a   $tags {','}]').
9020: 09 66 6f 72 65 61 63 68 20 7b 62 69 64 20 70 61  .foreach {bid pa
9030: 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e  rent} [state run
9040: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42   "..    SELECT B
9050: 2e 42 69 64 2c 20 52 2e 72 69 64 0a 09 20 20 20  .Bid, R.rid..   
9060: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
9070: 20 52 2c 20 62 72 61 6e 63 68 20 42 0a 09 20 20   R, branch B..  
9080: 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49    WHERE  B.bid I
9090: 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41  N $theset..    A
90a0: 4e 44 20 20 20 20 42 2e 72 6f 6f 74 20 3d 20 52  ND    B.root = R
90b0: 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20  .rid.."] {..    
90c0: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e  lappend dependen
90d0: 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a  cies([list sym::
90e0: 62 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c  branch $bid]) [l
90f0: 69 73 74 20 72 65 76 20 24 70 61 72 65 6e 74 5d  ist rev $parent]
9100: 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62 69  ..}..foreach {bi
9110: 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65  d parent} [state
9120: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45   run "..    SELE
9130: 43 54 20 42 2e 62 69 64 2c 20 42 58 2e 62 69 64  CT B.bid, BX.bid
9140: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61  ..    FROM   bra
9150: 6e 63 68 20 42 2c 20 62 72 61 6e 63 68 20 42 58  nch B, branch BX
9160: 2c 20 70 72 65 66 65 72 65 64 70 61 72 65 6e 74  , preferedparent
9170: 20 50 0a 09 20 20 20 20 57 48 45 52 45 20 20 42   P..    WHERE  B
9180: 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a  .bid IN $theset.
9190: 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 73 69  .    AND    B.si
91a0: 64 20 3d 20 50 2e 73 69 64 0a 09 20 20 20 20 41  d = P.sid..    A
91b0: 4e 44 20 20 20 20 50 2e 70 69 64 20 3d 20 42 58  ND    P.pid = BX
91c0: 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20  .sid.."] {..    
91d0: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e  lappend dependen
91e0: 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a  cies([list sym::
91f0: 62 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c  branch $bid]) [l
9200: 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20  ist sym::branch 
9210: 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 66 6f 72  $parent]..}..for
9220: 65 61 63 68 20 7b 62 69 64 20 70 61 72 65 6e 74  each {bid parent
9230: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09  } [state run "..
9240: 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62 69 64      SELECT B.bid
9250: 2c 20 54 2e 74 69 64 0a 09 20 20 20 20 46 52 4f  , T.tid..    FRO
9260: 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20 74 61  M   branch B, ta
9270: 67 20 54 2c 20 70 72 65 66 65 72 65 64 70 61 72  g T, preferedpar
9280: 65 6e 74 20 50 0a 09 20 20 20 20 57 48 45 52 45  ent P..    WHERE
9290: 20 20 42 2e 74 69 64 20 49 4e 20 24 74 68 65 73    B.tid IN $thes
92a0: 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42  et..    AND    B
92b0: 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a 09 20 20  .sid = P.sid..  
92c0: 20 20 41 4e 44 20 20 20 20 50 2e 70 69 64 20 3d    AND    P.pid =
92d0: 20 54 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20   T.sid.."] {..  
92e0: 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64    lappend depend
92f0: 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d  encies([list sym
9300: 3a 3a 62 72 61 6e 63 68 20 24 62 69 64 5d 29 20  ::branch $bid]) 
9310: 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24  [list sym::tag $
9320: 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 72 65 74 75  parent]..}..retu
9330: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  rn.    }..    # 
9340: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23  # ## ### ##### #
9350: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
9360: 23 23 23 23 23 0a 20 20 20 20 23 23 20 43 6f 6e  #####.    ## Con
9370: 66 69 67 75 72 61 74 69 6f 6e 0a 0a 20 20 20 20  figuration..    
9380: 70 72 61 67 6d 61 20 2d 68 61 73 69 6e 73 74 61  pragma -hasinsta
9390: 6e 63 65 73 20 20 20 6e 6f 20 3b 20 23 20 73 69  nces   no ; # si
93a0: 6e 67 6c 65 74 6f 6e 0a 20 20 20 20 70 72 61 67  ngleton.    prag
93b0: 6d 61 20 2d 68 61 73 74 79 70 65 69 6e 66 6f 20  ma -hastypeinfo 
93c0: 20 20 20 6e 6f 20 3b 20 23 20 6e 6f 20 69 6e 74     no ; # no int
93d0: 72 6f 73 70 65 63 74 69 6f 6e 0a 20 20 20 20 70  rospection.    p
93e0: 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65 64 65  ragma -hastypede
93f0: 73 74 72 6f 79 20 6e 6f 20 3b 20 23 20 69 6d 6d  stroy no ; # imm
9400: 6f 72 74 61 6c 0a 7d 0a 0a 23 20 23 20 23 23 20  ortal.}..# # ## 
9410: 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23  ### ##### ######
9420: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
9430: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
9440: 23 23 23 23 23 23 0a 23 23 0a 0a 6e 61 6d 65 73  ######.##..names
9450: 70 61 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a  pace eval ::vc::
9460: 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a  fossil::import::
9470: 63 76 73 3a 3a 70 72 6f 6a 65 63 74 20 7b 0a 20  cvs::project {. 
9480: 20 20 20 6e 61 6d 65 73 70 61 63 65 20 65 78 70     namespace exp
9490: 6f 72 74 20 72 65 76 0a 20 20 20 20 6e 61 6d 65  ort rev.    name
94a0: 73 70 61 63 65 20 65 76 61 6c 20 72 65 76 20 7b  space eval rev {
94b0: 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f  ..namespace impo
94c0: 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a  rt ::vc::fossil:
94d0: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74  :import::cvs::st
94e0: 61 74 65 0a 09 6e 61 6d 65 73 70 61 63 65 20 69  ate..namespace i
94f0: 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73  mport ::vc::foss
9500: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a  il::import::cvs:
9510: 3a 69 6e 74 65 67 72 69 74 79 0a 09 6e 61 6d 65  :integrity..name
9520: 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76  space import ::v
9530: 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69 73 63 3a 3a  c::tools::misc::
9540: 2a 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70  *..namespace imp
9550: 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a  ort ::vc::tools:
9560: 3a 74 72 6f 75 62 6c 65 0a 09 6e 61 6d 65 73 70  :trouble..namesp
9570: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a  ace import ::vc:
9580: 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 6c 6f 67  :tools::log..log
9590: 20 72 65 67 69 73 74 65 72 20 63 73 65 74 73 0a   register csets.
95a0: 0a 09 23 20 53 65 74 20 75 70 20 74 68 65 20 68  ..# Set up the h
95b0: 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 73  elper singletons
95c0: 0a 09 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c  ..namespace eval
95d0: 20 72 65 76 20 7b 0a 09 20 20 20 20 6e 61 6d 65   rev {..    name
95e0: 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76  space import ::v
95f0: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72  c::fossil::impor
9600: 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09 20  t::cvs::state.. 
9610: 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70     namespace imp
9620: 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c  ort ::vc::fossil
9630: 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 69  ::import::cvs::i
9640: 6e 74 65 67 72 69 74 79 0a 09 7d 0a 09 6e 61 6d  ntegrity..}..nam
9650: 65 73 70 61 63 65 20 65 76 61 6c 20 73 79 6d 3a  espace eval sym:
9660: 3a 74 61 67 20 7b 0a 09 20 20 20 20 6e 61 6d 65  :tag {..    name
9670: 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76  space import ::v
9680: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72  c::fossil::impor
9690: 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09 20  t::cvs::state.. 
96a0: 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70     namespace imp
96b0: 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c  ort ::vc::fossil
96c0: 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 69  ::import::cvs::i
96d0: 6e 74 65 67 72 69 74 79 0a 09 7d 0a 09 6e 61 6d  ntegrity..}..nam
96e0: 65 73 70 61 63 65 20 65 76 61 6c 20 73 79 6d 3a  espace eval sym:
96f0: 3a 62 72 61 6e 63 68 20 7b 0a 09 20 20 20 20 6e  :branch {..    n
9700: 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20  amespace import 
9710: 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d  ::vc::fossil::im
9720: 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65  port::cvs::state
9730: 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20  ..    namespace 
9740: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73  import ::vc::fos
9750: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73  sil::import::cvs
9760: 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a 20  ::integrity..}. 
9770: 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23     }.}..# # ## #
9780: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
9790: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20  # ############# 
97a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
97b0: 23 23 23 23 23 0a 23 23 20 52 65 61 64 79 0a 0a  #####.## Ready..
97c0: 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20  package provide 
97d0: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f  vc::fossil::impo
97e0: 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74  rt::cvs::project
97f0: 3a 3a 72 65 76 20 31 2e 30 0a 72 65 74 75 72 6e  ::rev 1.0.return
9800: 0a                                               .