Hex Artifact Content
Not logged in

Artifact 9054f71640dbf3ad74ee29773810919a5379435b:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [ac02614803] - Deactivated caching of the nextmap/premap data, with the indices the retrieval seems to be fast enough to allow us to reduce mem consumption. Tweaked log output, and sql formatting. by aku on 2007-12-02 03:49:11.

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 23 69 66  extmap {} {..#if
0f70: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 6e 65   {[llength $myne
0f80: 78 74 6d 61 70 5d 7d 20 7b 20 72 65 74 75 72 6e  xtmap]} { return
0f90: 20 24 6d 79 6e 65 78 74 6d 61 70 20 7d 0a 09 24   $mynextmap }..$
0fa0: 6d 79 74 79 70 65 6f 62 6a 20 73 75 63 63 65 73  mytypeobj succes
0fb0: 73 6f 72 73 20 74 6d 70 20 24 6d 79 69 74 65 6d  sors tmp $myitem
0fc0: 73 0a 09 72 65 74 75 72 6e 20 5b 61 72 72 61 79  s..return [array
0fd0: 20 67 65 74 20 74 6d 70 5d 0a 09 23 73 65 74 20   get tmp]..#set 
0fe0: 6d 79 6e 65 78 74 6d 61 70 20 5b 61 72 72 61 79  mynextmap [array
0ff0: 20 67 65 74 20 74 6d 70 5d 0a 09 23 72 65 74 75   get tmp]..#retu
1000: 72 6e 20 24 6d 79 6e 65 78 74 6d 61 70 0a 20 20  rn $mynextmap.  
1010: 20 20 7d 0a 0a 20 20 20 20 23 20 69 74 65 6d 20    }..    # item 
1020: 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 0a 20  -> list (item). 
1030: 20 20 20 6d 65 74 68 6f 64 20 70 72 65 6d 61 70     method premap
1040: 20 7b 7d 20 7b 0a 09 23 69 66 20 7b 5b 6c 6c 65   {} {..#if {[lle
1050: 6e 67 74 68 20 24 6d 79 70 72 65 6d 61 70 5d 7d  ngth $mypremap]}
1060: 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 70 72 65   { return $mypre
1070: 6d 61 70 20 7d 0a 09 24 6d 79 74 79 70 65 6f 62  map }..$mytypeob
1080: 6a 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 74  j predecessors t
1090: 6d 70 20 24 6d 79 69 74 65 6d 73 0a 09 72 65 74  mp $myitems..ret
10a0: 75 72 6e 20 5b 61 72 72 61 79 20 67 65 74 20 74  urn [array get t
10b0: 6d 70 5d 0a 09 23 73 65 74 20 6d 79 70 72 65 6d  mp]..#set myprem
10c0: 61 70 20 5b 61 72 72 61 79 20 67 65 74 20 74 6d  ap [array get tm
10d0: 70 5d 0a 09 23 72 65 74 75 72 6e 20 24 6d 79 70  p]..#return $myp
10e0: 72 65 6d 61 70 0a 20 20 20 20 7d 0a 0a 20 20 20  remap.    }..   
10f0: 20 6d 65 74 68 6f 64 20 62 72 65 61 6b 69 6e 74   method breakint
1100: 65 72 6e 61 6c 64 65 70 65 6e 64 65 6e 63 69 65  ernaldependencie
1110: 73 20 7b 7d 20 7b 0a 0a 09 23 23 0a 09 23 23 20  s {} {...##..## 
1120: 4e 4f 54 45 3a 20 54 68 69 73 20 6d 65 74 68 6f  NOTE: This metho
1130: 64 2c 20 6d 61 79 62 65 20 69 6e 20 63 6f 6e 6a  d, maybe in conj
1140: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 69 74 73  unction with its
1150: 20 63 61 6c 6c 65 72 0a 09 23 23 20 20 20 20 20   caller..##     
1160: 20 20 73 65 65 6d 73 20 74 6f 20 62 65 20 61 20    seems to be a 
1170: 6d 65 6d 6f 72 79 20 68 6f 67 2c 20 65 73 70 65  memory hog, espe
1180: 63 69 61 6c 6c 79 20 66 6f 72 20 6c 61 72 67 65  cially for large
1190: 0a 09 23 23 20 20 20 20 20 20 20 63 68 61 6e 67  ..##       chang
11a0: 65 73 65 74 73 2c 20 77 69 74 68 20 27 6c 61 72  esets, with 'lar
11b0: 67 65 27 20 6d 65 61 6e 69 6e 67 20 74 6f 20 68  ge' meaning to h
11c0: 61 76 65 20 61 20 27 6c 6f 6e 67 20 6c 69 73 74  ave a 'long list
11d0: 0a 09 23 23 20 20 20 20 20 20 20 6f 66 20 69 74  ..##       of it
11e0: 65 6d 73 2c 20 73 65 76 65 72 61 6c 20 74 68 6f  ems, several tho
11f0: 75 73 61 6e 64 27 2e 20 49 6e 76 65 73 74 69 67  usand'. Investig
1200: 61 74 65 20 77 68 65 72 65 20 74 68 65 0a 09 23  ate where the..#
1210: 23 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 69  #       memory i
1220: 73 20 73 70 65 6e 74 20 61 6e 64 20 74 68 65 6e  s spent and then
1230: 20 6c 6f 6f 6b 20 66 6f 72 20 77 61 79 73 20 6f   look for ways o
1240: 66 20 72 65 63 74 69 66 79 69 6e 67 0a 09 23 23  f rectifying..##
1250: 20 20 20 20 20 20 20 74 68 65 20 70 72 6f 62 6c         the probl
1260: 65 6d 2e 0a 09 23 23 0a 0a 09 23 20 54 68 69 73  em...##...# This
1270: 20 6d 65 74 68 6f 64 20 69 6e 73 70 65 63 74 73   method inspects
1280: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 73 20   the changesets 
1290: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 09 23 20  for internal..# 
12a0: 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 4e 6f  dependencies. No
12b0: 74 68 69 6e 67 20 69 73 20 64 6f 6e 65 20 69 66  thing is done if
12c0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 09 23   there are no..#
12d0: 20 73 75 63 68 2e 20 4f 74 68 65 72 77 69 73 65   such. Otherwise
12e0: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 69   the changeset i
12f0: 73 20 73 70 6c 69 74 20 69 6e 74 6f 20 61 20 73  s split into a s
1300: 65 74 20 6f 66 0a 09 23 20 66 72 61 67 6d 65 6e  et of..# fragmen
1310: 74 73 20 77 69 74 68 6f 75 74 20 69 6e 74 65 72  ts without inter
1320: 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73  nal dependencies
1330: 2c 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74  , transforming t
1340: 68 65 0a 09 23 20 69 6e 74 65 72 6e 61 6c 20 64  he..# internal d
1350: 65 70 65 6e 64 65 6e 63 69 65 73 20 69 6e 74 6f  ependencies into
1360: 20 65 78 74 65 72 6e 61 6c 20 6f 6e 65 73 2e 20   external ones. 
1370: 54 68 65 20 6e 65 77 20 63 68 61 6e 67 65 73 65  The new changese
1380: 74 73 0a 09 23 20 61 72 65 20 61 64 64 65 64 20  ts..# are added 
1390: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
13a0: 6c 6c 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a  ll changesets...
13b0: 09 23 20 57 65 20 70 65 72 66 6f 72 6d 20 61 6c  .# We perform al
13c0: 6c 20 6e 65 63 65 73 73 61 72 79 20 73 70 6c 69  l necessary spli
13d0: 74 73 20 69 6e 20 6f 6e 65 20 67 6f 2c 20 69 6e  ts in one go, in
13e0: 73 74 65 61 64 20 6f 66 20 6f 6e 6c 79 0a 09 23  stead of only..#
13f0: 20 6f 6e 65 2e 20 54 68 65 20 70 72 65 76 69 6f   one. The previo
1400: 75 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 61 64  us algorithm, ad
1410: 61 70 74 65 64 20 66 72 6f 6d 20 63 76 73 32 73  apted from cvs2s
1420: 76 6e 2c 20 63 6f 6d 70 75 74 65 64 0a 09 23 20  vn, computed..# 
1430: 61 20 6c 6f 74 20 6f 66 20 73 74 61 74 65 20 77  a lot of state w
1440: 68 69 63 68 20 77 61 73 20 74 68 72 6f 77 6e 20  hich was thrown 
1450: 61 77 61 79 20 61 6e 64 20 74 68 65 6e 20 63 6f  away and then co
1460: 6d 70 75 74 65 64 20 61 67 61 69 6e 0a 09 23 20  mputed again..# 
1470: 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 20  for each of the 
1480: 66 72 61 67 6d 65 6e 74 73 2e 20 49 74 20 73 68  fragments. It sh
1490: 6f 75 6c 64 20 62 65 20 65 61 73 69 65 72 20 74  ould be easier t
14a0: 6f 20 75 70 64 61 74 65 20 61 6e 64 0a 09 23 20  o update and..# 
14b0: 72 65 75 73 65 20 74 68 61 74 20 73 74 61 74 65  reuse that state
14c0: 2e 0a 0a 09 23 20 54 68 65 20 63 6f 64 65 20 63  ....# The code c
14d0: 68 65 63 6b 73 20 6f 6e 6c 79 20 73 75 63 65 73  hecks only suces
14e0: 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  sor dependencies
14f0: 2c 20 61 73 20 74 68 69 73 0a 09 23 20 61 75 74  , as this..# aut
1500: 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 76 65 72  omatically cover
1510: 73 20 74 68 65 20 70 72 65 64 65 63 65 73 73 6f  s the predecesso
1520: 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 61  r dependencies a
1530: 73 20 77 65 6c 6c 20 28 41 0a 09 23 20 73 75 63  s well (A..# suc
1540: 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63  cessor dependenc
1550: 79 20 61 20 2d 3e 20 62 20 69 73 20 61 6c 73 6f  y a -> b is also
1560: 20 61 20 70 72 65 64 65 63 65 73 73 6f 72 20 64   a predecessor d
1570: 65 70 65 6e 64 65 6e 63 79 0a 09 23 20 62 20 2d  ependency..# b -
1580: 3e 20 61 29 2e 0a 0a 09 23 20 41 72 72 61 79 20  > a)....# Array 
1590: 6f 66 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  of dependencies 
15a0: 28 70 61 72 65 6e 74 20 2d 3e 20 63 68 69 6c 64  (parent -> child
15b0: 29 2e 20 54 68 69 73 20 69 73 20 70 75 6c 6c 65  ). This is pulle
15c0: 64 20 66 72 6f 6d 0a 09 23 20 74 68 65 20 73 74  d from..# the st
15d0: 61 74 65 2c 20 61 6e 64 20 6c 69 6d 69 74 65 64  ate, and limited
15e0: 20 74 6f 20 73 75 63 63 65 73 73 6f 72 73 20 77   to successors w
15f0: 69 74 68 69 6e 20 74 68 65 20 63 68 61 6e 67 65  ithin the change
1600: 73 65 74 2e 0a 0a 09 61 72 72 61 79 20 73 65 74  set....array set
1610: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 7b 7d   dependencies {}
1620: 0a 09 24 6d 79 74 79 70 65 6f 62 6a 20 69 6e 74  ..$mytypeobj int
1630: 65 72 6e 61 6c 73 75 63 63 65 73 73 6f 72 73 20  ernalsuccessors 
1640: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 24 6d 79  dependencies $my
1650: 69 74 65 6d 73 0a 09 69 66 20 7b 21 5b 61 72 72  items..if {![arr
1660: 61 79 20 73 69 7a 65 20 64 65 70 65 6e 64 65 6e  ay size dependen
1670: 63 69 65 73 5d 7d 20 7b 72 65 74 75 72 6e 20 30  cies]} {return 0
1680: 7d 20 3b 20 23 20 4e 6f 74 68 69 6e 67 20 74 6f  } ; # Nothing to
1690: 20 62 72 65 61 6b 2e 0a 0a 09 6c 6f 67 20 77 72   break....log wr
16a0: 69 74 65 20 35 20 63 73 65 74 73 20 2e 2e 2e 5b  ite 5 csets ...[
16b0: 24 73 65 6c 66 20 73 74 72 5d 2e 2e 2e 2e 2e 2e  $self str]......
16c0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
16d0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
16e0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
16f0: 2e 0a 0a 09 23 20 57 65 20 68 61 76 65 20 69 6e  ....# We have in
1700: 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63  ternal dependenc
1710: 69 65 73 20 74 6f 20 62 72 65 61 6b 2e 20 57 65  ies to break. We
1720: 20 6e 6f 77 20 69 74 65 72 61 74 65 20 6f 76 65   now iterate ove
1730: 72 0a 09 23 20 61 6c 6c 20 70 6f 73 69 74 69 6f  r..# all positio
1740: 6e 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 28  ns in the list (
1750: 77 68 69 63 68 20 69 73 20 63 68 72 6f 6e 6f 6c  which is chronol
1760: 6f 67 69 63 61 6c 2c 20 61 74 20 6c 65 61 73 74  ogical, at least
1770: 0a 09 23 20 61 73 20 66 61 72 20 61 73 20 74 68  ..# as far as th
1780: 65 20 74 69 6d 65 73 74 61 6d 70 73 20 61 72 65  e timestamps are
1790: 20 63 6f 72 72 65 63 74 20 61 6e 64 20 75 6e 69   correct and uni
17a0: 71 75 65 29 20 61 6e 64 0a 09 23 20 64 65 74 65  que) and..# dete
17b0: 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 70  rmine the best p
17c0: 6f 73 69 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  osition for the 
17d0: 62 72 65 61 6b 2c 20 62 79 20 74 72 79 69 6e 67  break, by trying
17e0: 20 74 6f 0a 09 23 20 62 72 65 61 6b 20 61 73 20   to..# break as 
17f0: 6d 61 6e 79 20 64 65 70 65 6e 64 65 6e 63 69 65  many dependencie
1800: 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 69 6e  s as possible in
1810: 20 6f 6e 65 20 67 6f 2e 20 57 68 65 6e 20 61 0a   one go. When a.
1820: 09 23 20 62 72 65 61 6b 20 77 61 73 20 66 6f 75  .# break was fou
1830: 6e 64 20 74 68 69 73 20 69 73 20 72 65 64 6f 6e  nd this is redon
1840: 65 20 66 6f 72 20 74 68 65 20 66 72 61 67 6d 65  e for the fragme
1850: 6e 74 73 20 63 6f 6d 69 6e 67 20 61 6e 64 0a 09  nts coming and..
1860: 23 20 61 66 74 65 72 2c 20 61 66 74 65 72 20 75  # after, after u
1870: 70 64 69 6e 67 20 74 68 65 20 63 72 6f 73 73 69  pding the crossi
1880: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  ng information..
1890: 0a 09 23 20 44 61 74 61 20 73 74 72 75 63 74 75  ..# Data structu
18a0: 72 65 73 3a 0a 09 23 20 4d 61 70 3a 20 20 50 4f  res:..# Map:  PO
18b0: 53 20 20 20 72 65 76 69 73 69 6f 6e 20 69 64 20  S   revision id 
18c0: 20 20 20 20 20 2d 3e 20 70 6f 73 69 74 69 6f 6e       -> position
18d0: 20 69 6e 20 6c 69 73 74 2e 0a 09 23 20 20 20 20   in list...#    
18e0: 20 20 20 43 52 4f 53 53 20 70 6f 73 69 74 69 6f     CROSS positio
18f0: 6e 20 69 6e 20 6c 69 73 74 20 2d 3e 20 6e 75 6d  n in list -> num
1900: 62 65 72 20 6f 66 20 64 65 70 65 6e 64 65 6e 63  ber of dependenc
1910: 69 65 73 20 63 72 6f 73 73 69 6e 67 20 69 74 0a  ies crossing it.
1920: 09 23 20 20 20 20 20 20 20 44 45 50 43 20 20 64  .#       DEPC  d
1930: 65 70 65 6e 64 65 6e 63 79 20 20 20 20 20 20 20  ependency       
1940: 2d 3e 20 70 6f 73 69 74 69 6f 6e 73 20 69 74 20  -> positions it 
1950: 63 72 6f 73 73 65 73 0a 09 23 20 4c 69 73 74 3a  crosses..# List:
1960: 20 52 41 4e 47 45 20 4f 66 20 74 68 65 20 70 6f   RANGE Of the po
1970: 73 69 74 69 6f 6e 73 20 69 74 73 65 6c 66 2e 0a  sitions itself..
1980: 09 23 20 41 20 64 65 70 65 6e 64 65 6e 63 79 20  .# A dependency 
1990: 69 73 20 61 20 73 69 6e 67 6c 65 2d 65 6c 65 6d  is a single-elem
19a0: 65 6e 74 20 6d 61 70 20 70 61 72 65 6e 74 20 2d  ent map parent -
19b0: 3e 20 63 68 69 6c 64 0a 0a 09 49 6e 69 74 69 61  > child...Initia
19c0: 6c 69 7a 65 42 72 65 61 6b 53 74 61 74 65 20 24  lizeBreakState $
19d0: 6d 79 69 74 65 6d 73 0a 0a 09 73 65 74 20 66 72  myitems...set fr
19e0: 61 67 6d 65 6e 74 73 20 7b 7d 0a 09 73 65 74 20  agments {}..set 
19f0: 6e 65 77 20 20 20 20 20 20 20 5b 6c 69 73 74 20  new       [list 
1a00: 24 72 61 6e 67 65 5d 0a 09 61 72 72 61 79 20 73  $range]..array s
1a10: 65 74 20 62 72 65 61 6b 73 20 7b 7d 0a 0a 09 23  et breaks {}...#
1a20: 20 49 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 20   Instead of one 
1a30: 6c 69 73 74 20 68 6f 6c 64 69 6e 67 20 62 6f 74  list holding bot
1a40: 68 20 70 72 6f 63 65 73 73 65 64 20 61 6e 64 20  h processed and 
1a50: 70 65 6e 64 69 6e 67 0a 09 23 20 66 72 61 67 6d  pending..# fragm
1a60: 65 6e 74 73 20 77 65 20 75 73 65 20 74 77 6f 2c  ents we use two,
1a70: 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 66 72 61   one for the fra
1a80: 6d 65 6e 74 73 20 74 6f 20 70 72 6f 63 65 73 73  ments to process
1a90: 2c 20 6f 6e 65 0a 09 23 20 74 6f 20 68 6f 6c 64  , one..# to hold
1aa0: 20 74 68 65 20 6e 65 77 20 66 72 61 67 6d 65 6e   the new fragmen
1ab0: 74 73 2c 20 61 6e 64 20 74 68 65 20 6c 61 74 74  ts, and the latt
1ac0: 65 72 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20  er is copied to 
1ad0: 74 68 65 0a 09 23 20 66 6f 72 6d 65 72 20 77 68  the..# former wh
1ae0: 65 6e 20 74 68 65 79 20 72 75 6e 20 6f 75 74 2e  en they run out.
1af0: 20 54 68 69 73 20 6b 65 65 70 73 20 74 68 65 20   This keeps the 
1b00: 6c 69 73 74 20 6f 66 20 70 65 6e 64 69 6e 67 0a  list of pending.
1b10: 09 23 20 66 72 61 67 6d 65 6e 74 73 20 73 68 6f  .# fragments sho
1b20: 72 74 20 77 69 74 68 6f 75 74 20 73 61 63 72 69  rt without sacri
1b30: 66 69 63 69 6e 67 20 73 70 65 65 64 20 62 79 20  ficing speed by 
1b40: 73 68 69 66 74 69 6e 67 20 73 74 75 66 66 0a 09  shifting stuff..
1b50: 23 20 64 6f 77 6e 2e 20 57 65 20 65 73 70 65 63  # down. We espec
1b60: 69 61 6c 6c 79 20 64 72 6f 70 20 74 68 65 20 6d  ially drop the m
1b70: 65 6d 6f 72 79 20 6f 66 20 66 72 61 67 6d 65 6e  emory of fragmen
1b80: 74 73 20 62 72 6f 6b 65 6e 0a 09 23 20 64 75 72  ts broken..# dur
1b90: 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 61  ing processing a
1ba0: 66 74 65 72 20 61 20 73 68 6f 72 74 20 74 69 6d  fter a short tim
1bb0: 65 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65  e, instead of le
1bc0: 74 74 69 6e 67 20 69 74 0a 09 23 20 63 6f 6e 73  tting it..# cons
1bd0: 75 6d 65 20 6d 65 6d 6f 72 79 2e 0a 0a 09 77 68  ume memory....wh
1be0: 69 6c 65 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6e  ile {[llength $n
1bf0: 65 77 5d 7d 20 7b 0a 0a 09 20 20 20 20 73 65 74  ew]} {...    set
1c00: 20 70 65 6e 64 69 6e 67 20 24 6e 65 77 0a 09 20   pending $new.. 
1c10: 20 20 20 73 65 74 20 6e 65 77 20 20 20 20 20 7b     set new     {
1c20: 7d 0a 09 20 20 20 20 73 65 74 20 61 74 20 20 20  }..    set at   
1c30: 20 20 20 30 0a 0a 09 20 20 20 20 77 68 69 6c 65     0...    while
1c40: 20 7b 24 61 74 20 3c 20 5b 6c 6c 65 6e 67 74 68   {$at < [llength
1c50: 20 24 70 65 6e 64 69 6e 67 5d 7d 20 7b 0a 09 09   $pending]} {...
1c60: 73 65 74 20 63 75 72 72 65 6e 74 20 5b 6c 69 6e  set current [lin
1c70: 64 65 78 20 24 70 65 6e 64 69 6e 67 20 24 61 74  dex $pending $at
1c80: 5d 0a 0a 09 09 6c 6f 67 20 77 72 69 74 65 20 36  ]....log write 6
1c90: 20 63 73 65 74 73 20 7b 2e 20 2e 20 2e 2e 20 2e   csets {. . .. .
1ca0: 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e  .. ..... .......
1cb0: 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 7d  . .............}
1cc0: 0a 09 09 6c 6f 67 20 77 72 69 74 65 20 36 20 63  ...log write 6 c
1cd0: 73 65 74 73 20 7b 53 63 68 65 64 75 6c 65 64 20  sets {Scheduled 
1ce0: 20 20 5b 6a 6f 69 6e 20 5b 50 52 73 20 5b 6c 72    [join [PRs [lr
1cf0: 61 6e 67 65 20 24 70 65 6e 64 69 6e 67 20 24 61  ange $pending $a
1d00: 74 20 65 6e 64 5d 5d 20 7b 20 7d 5d 7d 0a 09 09  t end]] { }]}...
1d10: 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74  log write 6 cset
1d20: 73 20 7b 43 6f 6e 73 69 64 65 72 69 6e 67 20 5b  s {Considering [
1d30: 50 52 20 24 63 75 72 72 65 6e 74 5d 20 5c 5b 24  PR $current] \[$
1d40: 61 74 2f 5b 6c 6c 65 6e 67 74 68 20 24 70 65 6e  at/[llength $pen
1d50: 64 69 6e 67 5d 5c 5d 7d 0a 0a 09 09 73 65 74 20  ding]\]}....set 
1d60: 62 65 73 74 20 5b 46 69 6e 64 42 65 73 74 42 72  best [FindBestBr
1d70: 65 61 6b 20 24 63 75 72 72 65 6e 74 5d 0a 0a 09  eak $current]...
1d80: 09 69 66 20 7b 24 62 65 73 74 20 3c 20 30 7d 20  .if {$best < 0} 
1d90: 7b 0a 09 09 20 20 20 20 23 20 54 68 65 20 69 6e  {...    # The in
1da0: 73 70 65 63 74 65 64 20 72 61 6e 67 65 20 68 61  spected range ha
1db0: 73 20 6e 6f 20 69 6e 74 65 72 6e 61 6c 0a 09 09  s no internal...
1dc0: 20 20 20 20 23 20 64 65 70 65 6e 64 65 6e 63 69      # dependenci
1dd0: 65 73 2e 20 54 68 69 73 20 69 73 20 61 20 63 6f  es. This is a co
1de0: 6d 70 6c 65 74 65 20 66 72 61 67 6d 65 6e 74 2e  mplete fragment.
1df0: 0a 09 09 20 20 20 20 6c 61 70 70 65 6e 64 20 66  ...    lappend f
1e00: 72 61 67 6d 65 6e 74 73 20 24 63 75 72 72 65 6e  ragments $curren
1e10: 74 0a 0a 09 09 20 20 20 20 6c 6f 67 20 77 72 69  t....    log wri
1e20: 74 65 20 36 20 63 73 65 74 73 20 22 4e 6f 20 62  te 6 csets "No b
1e30: 72 65 61 6b 73 2c 20 66 69 6e 61 6c 22 0a 09 09  reaks, final"...
1e40: 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 23  } else {...    #
1e50: 20 53 70 6c 69 74 20 74 68 65 20 72 61 6e 67 65   Split the range
1e60: 20 61 6e 64 20 73 63 68 65 64 75 6c 65 20 74 68   and schedule th
1e70: 65 20 72 65 73 75 6c 74 69 6e 67 0a 09 09 20 20  e resulting...  
1e80: 20 20 23 20 66 72 61 67 6d 65 6e 74 73 20 66 6f    # fragments fo
1e90: 72 20 66 75 72 74 68 65 72 20 69 6e 73 70 65 63  r further inspec
1ea0: 74 69 6f 6e 2e 20 52 65 6d 65 6d 62 65 72 20 74  tion. Remember t
1eb0: 68 65 0a 09 09 20 20 20 20 23 20 6e 75 6d 62 65  he...    # numbe
1ec0: 72 20 6f 66 20 64 65 70 65 6e 64 65 6e 63 69 65  r of dependencie
1ed0: 73 20 63 75 74 20 62 65 66 6f 72 65 20 77 65 20  s cut before we 
1ee0: 72 65 6d 6f 76 65 20 74 68 65 6d 0a 09 09 20 20  remove them...  
1ef0: 20 20 23 20 66 72 6f 6d 20 63 6f 6e 73 69 64 65    # from conside
1f00: 72 61 74 69 6f 6e 2c 20 66 6f 72 20 64 6f 63 75  ration, for docu
1f10: 6d 65 6e 74 61 74 69 6f 6e 20 6c 61 74 65 72 2e  mentation later.
1f20: 0a 0a 09 09 20 20 20 20 73 65 74 20 62 72 65 61  ....    set brea
1f30: 6b 73 28 24 62 65 73 74 29 20 24 63 72 6f 73 73  ks($best) $cross
1f40: 28 24 62 65 73 74 29 0a 0a 09 09 20 20 20 20 6c  ($best)....    l
1f50: 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73  og write 6 csets
1f60: 20 22 42 65 73 74 20 62 72 65 61 6b 20 40 20 24   "Best break @ $
1f70: 62 65 73 74 2c 20 63 75 74 74 69 6e 67 20 5b 6e  best, cutting [n
1f80: 73 70 20 24 63 72 6f 73 73 28 24 62 65 73 74 29  sp $cross($best)
1f90: 20 64 65 70 65 6e 64 65 6e 63 79 20 64 65 70 65   dependency depe
1fa0: 6e 64 65 6e 63 69 65 73 5d 22 0a 0a 09 09 20 20  ndencies]"....  
1fb0: 20 20 23 20 4e 6f 74 65 3a 20 54 68 65 20 76 61    # Note: The va
1fc0: 6c 75 65 20 6f 66 20 62 65 73 74 20 69 73 20 61  lue of best is a
1fd0: 6e 20 61 62 6f 6c 75 74 65 20 6c 6f 63 61 74 69  n abolute locati
1fe0: 6f 6e 0a 09 09 20 20 20 20 23 20 69 6e 20 6d 79  on...    # in my
1ff0: 69 74 65 6d 73 2e 20 55 73 65 20 74 68 65 20 73  items. Use the s
2000: 74 61 72 74 20 6f 66 20 63 75 72 72 65 6e 74 20  tart of current 
2010: 74 6f 20 6d 61 6b 65 20 69 74 0a 09 09 20 20 20  to make it...   
2020: 20 23 20 61 6e 20 69 6e 64 65 78 20 61 62 73 6f   # an index abso
2030: 6c 75 74 65 20 74 6f 20 63 75 72 72 65 6e 74 2e  lute to current.
2040: 0a 0a 09 09 20 20 20 20 73 65 74 20 62 72 65 6c  ....    set brel
2050: 20 5b 65 78 70 72 20 7b 24 62 65 73 74 20 2d 20   [expr {$best - 
2060: 5b 6c 69 6e 64 65 78 20 24 63 75 72 72 65 6e 74  [lindex $current
2070: 20 30 5d 7d 5d 0a 09 09 20 20 20 20 73 65 74 20   0]}]...    set 
2080: 62 6e 65 78 74 20 24 62 72 65 6c 20 3b 20 69 6e  bnext $brel ; in
2090: 63 72 20 62 6e 65 78 74 0a 09 09 20 20 20 20 73  cr bnext...    s
20a0: 65 74 20 66 72 61 67 62 65 66 6f 72 65 20 5b 6c  et fragbefore [l
20b0: 72 61 6e 67 65 20 24 63 75 72 72 65 6e 74 20 30  range $current 0
20c0: 20 24 62 72 65 6c 5d 0a 09 09 20 20 20 20 73 65   $brel]...    se
20d0: 74 20 66 72 61 67 61 66 74 65 72 20 20 5b 6c 72  t fragafter  [lr
20e0: 61 6e 67 65 20 24 63 75 72 72 65 6e 74 20 24 62  ange $current $b
20f0: 6e 65 78 74 20 65 6e 64 5d 0a 0a 09 09 20 20 20  next end]....   
2100: 20 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65   log write 6 cse
2110: 74 73 20 22 4e 65 77 20 70 69 65 63 65 73 20 20  ts "New pieces  
2120: 5b 50 52 20 24 66 72 61 67 62 65 66 6f 72 65 5d  [PR $fragbefore]
2130: 20 5b 50 52 20 24 66 72 61 67 61 66 74 65 72 5d   [PR $fragafter]
2140: 22 0a 0a 09 09 20 20 20 20 69 6e 74 65 67 72 69  "....    integri
2150: 74 79 20 61 73 73 65 72 74 20 7b 5b 6c 6c 65 6e  ty assert {[llen
2160: 67 74 68 20 24 66 72 61 67 62 65 66 6f 72 65 5d  gth $fragbefore]
2170: 7d 20 7b 46 6f 75 6e 64 20 7a 65 72 6f 2d 6c 65  } {Found zero-le
2180: 6e 67 74 68 20 66 72 61 67 6d 65 6e 74 20 61 74  ngth fragment at
2190: 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 7d 0a   the beginning}.
21a0: 09 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 20  ..    integrity 
21b0: 61 73 73 65 72 74 20 7b 5b 6c 6c 65 6e 67 74 68  assert {[llength
21c0: 20 24 66 72 61 67 61 66 74 65 72 5d 7d 20 20 7b   $fragafter]}  {
21d0: 46 6f 75 6e 64 20 7a 65 72 6f 2d 6c 65 6e 67 74  Found zero-lengt
21e0: 68 20 66 72 61 67 6d 65 6e 74 20 61 74 20 74 68  h fragment at th
21f0: 65 20 65 6e 64 7d 0a 0a 09 09 20 20 20 20 6c 61  e end}....    la
2200: 70 70 65 6e 64 20 6e 65 77 20 24 66 72 61 67 62  ppend new $fragb
2210: 65 66 6f 72 65 20 24 66 72 61 67 61 66 74 65 72  efore $fragafter
2220: 0a 09 09 20 20 20 20 43 75 74 41 74 20 24 62 65  ...    CutAt $be
2230: 73 74 0a 09 09 7d 0a 0a 09 09 69 6e 63 72 20 61  st...}....incr a
2240: 74 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 6c 6f  t..    }..}...lo
2250: 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20  g write 6 csets 
2260: 22 2e 20 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e  ". . .. ... ....
2270: 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e  . ........ .....
2280: 2e 2e 2e 2e 2e 2e 2e 2e 22 0a 0a 09 23 20 28 2a  ........"...# (*
2290: 29 20 57 65 20 63 6c 65 61 72 20 6f 75 74 20 74  ) We clear out t
22a0: 68 65 20 61 73 73 6f 63 69 61 74 65 64 20 70 61  he associated pa
22b0: 72 74 20 6f 66 20 74 68 65 20 6d 79 69 74 65 6d  rt of the myitem
22c0: 6d 61 70 0a 09 23 20 69 6e 2d 6d 65 6d 6f 72 79  map..# in-memory
22d0: 20 69 6e 64 65 78 20 69 6e 20 70 72 65 70 61 72   index in prepar
22e0: 61 74 69 6f 6e 20 66 6f 72 20 6e 65 77 20 64 61  ation for new da
22f0: 74 61 2e 20 41 20 73 69 6d 70 6c 65 20 75 6e 73  ta. A simple uns
2300: 65 74 0a 09 23 20 69 73 20 65 6e 6f 75 67 68 2c  et..# is enough,
2310: 20 77 65 20 68 61 76 65 20 6e 6f 20 73 79 6d 62   we have no symb
2320: 6f 6c 20 63 68 61 6e 67 65 73 65 74 73 20 61 74  ol changesets at
2330: 20 74 68 69 73 20 74 69 6d 65 2c 20 61 6e 64 0a   this time, and.
2340: 09 23 20 74 68 75 73 20 6e 65 76 65 72 20 6d 6f  .# thus never mo
2350: 72 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65  re than one refe
2360: 72 65 6e 63 65 20 69 6e 20 74 68 65 20 6c 69 73  rence in the lis
2370: 74 2e 0a 0a 09 66 6f 72 65 61 63 68 20 69 69 64  t....foreach iid
2380: 20 24 6d 79 69 74 65 6d 73 20 7b 0a 09 20 20 20   $myitems {..   
2390: 20 73 65 74 20 6b 65 79 20 5b 6c 69 73 74 20 24   set key [list $
23a0: 6d 79 74 79 70 65 20 24 69 69 64 5d 0a 09 20 20  mytype $iid]..  
23b0: 20 20 75 6e 73 65 74 20 6d 79 69 74 65 6d 6d 61    unset myitemma
23c0: 70 28 24 6b 65 79 29 0a 09 20 20 20 20 6c 6f 67  p($key)..    log
23d0: 20 77 72 69 74 65 20 38 20 63 73 65 74 73 20 7b   write 8 csets {
23e0: 4d 41 50 2d 20 69 74 65 6d 20 3c 24 6b 65 79 3e  MAP- item <$key>
23f0: 20 24 73 65 6c 66 20 3d 20 5b 24 73 65 6c 66 20   $self = [$self 
2400: 73 74 72 5d 7d 0a 09 7d 0a 0a 09 23 20 43 72 65  str]}..}...# Cre
2410: 61 74 65 20 63 68 61 6e 67 65 73 65 74 73 20 66  ate changesets f
2420: 6f 72 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73  or the fragments
2430: 2c 20 72 65 75 73 69 6e 67 20 74 68 65 20 63 75  , reusing the cu
2440: 72 72 65 6e 74 20 6f 6e 65 0a 09 23 20 66 6f 72  rrent one..# for
2450: 20 74 68 65 20 66 69 72 73 74 20 66 72 61 67 6d   the first fragm
2460: 65 6e 74 2e 20 57 65 20 73 6f 72 74 20 74 68 65  ent. We sort the
2470: 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 6c  m in order to al
2480: 6c 6f 77 0a 09 23 20 63 68 65 63 6b 69 6e 67 20  low..# checking 
2490: 66 6f 72 20 67 61 70 73 20 61 6e 64 20 6e 69 63  for gaps and nic
24a0: 65 20 6d 65 73 73 61 67 65 73 2e 0a 0a 09 73 65  e messages....se
24b0: 74 20 66 72 61 67 6d 65 6e 74 73 20 5b 6c 73 6f  t fragments [lso
24c0: 72 74 20 2d 69 6e 64 65 78 20 30 20 2d 69 6e 74  rt -index 0 -int
24d0: 65 67 65 72 20 24 66 72 61 67 6d 65 6e 74 73 5d  eger $fragments]
24e0: 0a 0a 09 23 70 75 74 73 20 5c 74 2e 5b 6a 6f 69  ...#puts \t.[joi
24f0: 6e 20 5b 50 52 73 20 24 66 72 61 67 6d 65 6e 74  n [PRs $fragment
2500: 73 5d 20 2e 5c 6e 5c 74 2e 5d 2e 0a 0a 09 42 6f  s] .\n\t.]....Bo
2510: 72 64 65 72 20 5b 6c 69 6e 64 65 78 20 24 66 72  rder [lindex $fr
2520: 61 67 6d 65 6e 74 73 20 30 5d 20 66 69 72 73 74  agments 0] first
2530: 73 20 66 69 72 73 74 65 0a 0a 09 69 6e 74 65 67  s firste...integ
2540: 72 69 74 79 20 61 73 73 65 72 74 20 7b 24 66 69  rity assert {$fi
2550: 72 73 74 73 20 3d 3d 20 30 7d 20 7b 42 61 64 20  rsts == 0} {Bad 
2560: 66 72 61 67 6d 65 6e 74 20 73 74 61 72 74 20 40  fragment start @
2570: 20 24 66 69 72 73 74 73 2c 20 67 61 70 2c 20 6f   $firsts, gap, o
2580: 72 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69  r before beginni
2590: 6e 67 20 6f 66 20 74 68 65 20 72 61 6e 67 65 7d  ng of the range}
25a0: 0a 0a 09 73 65 74 20 6c 61 73 74 65 20 24 66 69  ...set laste $fi
25b0: 72 73 74 65 0a 09 66 6f 72 65 61 63 68 20 66 72  rste..foreach fr
25c0: 61 67 6d 65 6e 74 20 5b 6c 72 61 6e 67 65 20 24  agment [lrange $
25d0: 66 72 61 67 6d 65 6e 74 73 20 31 20 65 6e 64 5d  fragments 1 end]
25e0: 20 7b 0a 09 20 20 20 20 42 6f 72 64 65 72 20 24   {..    Border $
25f0: 66 72 61 67 6d 65 6e 74 20 73 20 65 0a 09 20 20  fragment s e..  
2600: 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 65    integrity asse
2610: 72 74 20 7b 24 6c 61 73 74 65 20 3d 3d 20 28 24  rt {$laste == ($
2620: 73 20 2d 20 31 29 7d 20 7b 42 61 64 20 66 72 61  s - 1)} {Bad fra
2630: 67 6d 65 6e 74 20 62 6f 72 64 65 72 20 3c 24 6c  gment border <$l
2640: 61 73 74 65 20 7c 20 24 73 3e 2c 20 67 61 70 20  aste | $s>, gap 
2650: 6f 72 20 6f 76 65 72 6c 61 70 7d 0a 0a 09 20 20  or overlap}...  
2660: 20 20 73 65 74 20 6e 65 77 20 5b 24 74 79 70 65    set new [$type
2670: 20 25 41 55 54 4f 25 20 24 6d 79 70 72 6f 6a 65   %AUTO% $myproje
2680: 63 74 20 24 6d 79 74 79 70 65 20 24 6d 79 73 72  ct $mytype $mysr
2690: 63 69 64 20 5b 6c 72 61 6e 67 65 20 24 6d 79 69  cid [lrange $myi
26a0: 74 65 6d 73 20 24 73 20 24 65 5d 5d 0a 0a 20 20  tems $s $e]]..  
26b0: 20 20 20 20 20 20 20 20 20 20 6c 6f 67 20 77 72            log wr
26c0: 69 74 65 20 34 20 63 73 65 74 73 20 22 42 72 65  ite 4 csets "Bre
26d0: 61 6b 69 6e 67 20 5b 24 73 65 6c 66 20 73 74 72  aking [$self str
26e0: 20 5d 20 40 20 24 6c 61 73 74 65 2c 20 6e 65 77   ] @ $laste, new
26f0: 20 5b 24 6e 65 77 20 73 74 72 5d 2c 20 63 75 74   [$new str], cut
2700: 74 69 6e 67 20 24 62 72 65 61 6b 73 28 24 6c 61  ting $breaks($la
2710: 73 74 65 29 22 0a 0a 09 20 20 20 20 73 65 74 20  ste)"...    set 
2720: 6c 61 73 74 65 20 24 65 0a 09 7d 0a 0a 09 69 6e  laste $e..}...in
2730: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b  tegrity assert {
2740: 0a 09 20 20 20 20 24 6c 61 73 74 65 20 3d 3d 20  ..    $laste == 
2750: 28 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 69 74 65  ([llength $myite
2760: 6d 73 5d 2d 31 29 0a 09 7d 20 7b 42 61 64 20 66  ms]-1)..} {Bad f
2770: 72 61 67 6d 65 6e 74 20 65 6e 64 20 40 20 24 6c  ragment end @ $l
2780: 61 73 74 65 2c 20 67 61 70 2c 20 6f 72 20 62 65  aste, gap, or be
2790: 79 6f 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20  yond end of the 
27a0: 72 61 6e 67 65 7d 0a 0a 09 23 20 50 75 74 20 74  range}...# Put t
27b0: 68 65 20 66 69 72 73 74 20 66 72 61 67 6d 65 6e  he first fragmen
27c0: 74 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65  t into the curre
27d0: 6e 74 20 63 68 61 6e 67 65 73 65 74 2c 20 61 6e  nt changeset, an
27e0: 64 0a 09 23 20 75 70 64 61 74 65 20 74 68 65 20  d..# update the 
27f0: 69 6e 2d 6d 65 6d 6f 72 79 20 69 6e 64 65 78 2e  in-memory index.
2800: 20 57 65 20 63 61 6e 20 73 69 6d 70 6c 79 20 28   We can simply (
2810: 72 65 29 61 64 64 20 74 68 65 20 69 74 65 6d 73  re)add the items
2820: 0a 09 23 20 62 65 63 61 75 73 65 20 77 65 20 63  ..# because we c
2830: 6c 65 61 72 65 64 20 74 68 65 20 70 72 65 76 69  leared the previ
2840: 6f 75 73 6c 79 20 65 78 69 73 74 69 6e 67 20 69  ously existing i
2850: 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20 73 65 65 0a  nformation, see.
2860: 09 23 20 28 2a 29 20 61 62 6f 76 65 2e 20 50 65  .# (*) above. Pe
2870: 72 73 69 73 74 65 6e 63 65 20 64 6f 65 73 20 6e  rsistence does n
2880: 6f 74 20 6d 61 74 74 65 72 20 68 65 72 65 2c 20  ot matter here, 
2890: 6e 6f 6e 65 20 6f 66 20 74 68 65 0a 09 23 20 63  none of the..# c
28a0: 68 61 6e 67 65 73 65 74 73 20 68 61 73 20 62 65  hangesets has be
28b0: 65 6e 20 73 61 76 65 64 20 74 6f 20 74 68 65 20  en saved to the 
28c0: 70 65 72 73 69 73 74 65 6e 74 20 73 74 61 74 65  persistent state
28d0: 20 79 65 74 2e 0a 0a 09 73 65 74 20 6d 79 69 74   yet....set myit
28e0: 65 6d 73 20 20 5b 6c 72 61 6e 67 65 20 24 6d 79  ems  [lrange $my
28f0: 69 74 65 6d 73 20 20 30 20 24 66 69 72 73 74 65  items  0 $firste
2900: 5d 0a 09 73 65 74 20 6d 79 74 69 74 65 6d 73 20  ]..set mytitems 
2910: 5b 6c 72 61 6e 67 65 20 24 6d 79 74 69 74 65 6d  [lrange $mytitem
2920: 73 20 30 20 24 66 69 72 73 74 65 5d 0a 09 66 6f  s 0 $firste]..fo
2930: 72 65 61 63 68 20 69 69 64 20 24 6d 79 69 74 65  reach iid $myite
2940: 6d 73 20 7b 0a 09 20 20 20 20 73 65 74 20 6b 65  ms {..    set ke
2950: 79 20 5b 6c 69 73 74 20 24 6d 79 74 79 70 65 20  y [list $mytype 
2960: 24 69 69 64 5d 0a 09 20 20 20 20 73 65 74 20 6d  $iid]..    set m
2970: 79 69 74 65 6d 6d 61 70 28 24 6b 65 79 29 20 24  yitemmap($key) $
2980: 73 65 6c 66 0a 09 20 20 20 20 6c 6f 67 20 77 72  self..    log wr
2990: 69 74 65 20 38 20 63 73 65 74 73 20 7b 4d 41 50  ite 8 csets {MAP
29a0: 2b 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73  + item <$key> $s
29b0: 65 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74 72  elf = [$self str
29c0: 5d 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 20 31  ]}..}...return 1
29d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68  .    }..    meth
29e0: 6f 64 20 70 65 72 73 69 73 74 20 7b 7d 20 7b 0a  od persist {} {.
29f0: 09 73 65 74 20 74 69 64 20 24 6d 79 63 73 74 79  .set tid $mycsty
2a00: 70 65 28 24 6d 79 74 79 70 65 29 0a 09 73 65 74  pe($mytype)..set
2a10: 20 70 69 64 20 5b 24 6d 79 70 72 6f 6a 65 63 74   pid [$myproject
2a20: 20 69 64 5d 0a 09 73 65 74 20 70 6f 73 20 30 0a   id]..set pos 0.
2a30: 0a 09 73 74 61 74 65 20 74 72 61 6e 73 61 63 74  ..state transact
2a40: 69 6f 6e 20 7b 0a 09 20 20 20 20 73 74 61 74 65  ion {..    state
2a50: 20 72 75 6e 20 7b 0a 09 09 49 4e 53 45 52 54 20   run {...INSERT 
2a60: 49 4e 54 4f 20 63 68 61 6e 67 65 73 65 74 20 28  INTO changeset (
2a70: 63 69 64 2c 20 20 20 70 69 64 2c 20 20 74 79 70  cid,   pid,  typ
2a80: 65 2c 20 73 72 63 29 0a 09 09 56 41 4c 55 45 53  e, src)...VALUES
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 28 24 6d 79 69 64 2c 20 24 70 69 64 2c 20 24 74  ($myid, $pid, $t
2ab0: 69 64 2c 20 24 6d 79 73 72 63 69 64 29 3b 0a 09  id, $mysrcid);..
2ac0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 66 6f 72 65      }...    fore
2ad0: 61 63 68 20 69 69 64 20 24 6d 79 69 74 65 6d 73  ach iid $myitems
2ae0: 20 7b 0a 09 09 73 74 61 74 65 20 72 75 6e 20 7b   {...state run {
2af0: 0a 09 09 20 20 20 20 49 4e 53 45 52 54 20 49 4e  ...    INSERT IN
2b00: 54 4f 20 63 73 69 74 65 6d 20 28 63 69 64 2c 20  TO csitem (cid, 
2b10: 20 20 70 6f 73 2c 20 20 69 69 64 29 0a 09 09 20    pos,  iid)... 
2b20: 20 20 20 56 41 4c 55 45 53 20 20 20 20 20 20 20     VALUES       
2b30: 20 20 20 20 20 20 28 24 6d 79 69 64 2c 20 24 70        ($myid, $p
2b40: 6f 73 2c 20 24 69 69 64 29 3b 0a 09 09 7d 0a 09  os, $iid);...}..
2b50: 09 69 6e 63 72 20 70 6f 73 0a 09 20 20 20 20 7d  .incr pos..    }
2b60: 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  ..}..return.    
2b70: 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 74 69  }..    method ti
2b80: 6d 65 72 61 6e 67 65 20 7b 7d 20 7b 20 72 65 74  merange {} { ret
2b90: 75 72 6e 20 5b 24 6d 79 74 79 70 65 6f 62 6a 20  urn [$mytypeobj 
2ba0: 74 69 6d 65 72 61 6e 67 65 20 24 6d 79 69 74 65  timerange $myite
2bb0: 6d 73 5d 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f  ms] }..    metho
2bc0: 64 20 64 72 6f 70 20 7b 7d 20 7b 0a 09 6c 6f 67  d drop {} {..log
2bd0: 20 77 72 69 74 65 20 38 20 63 73 65 74 73 20 7b   write 8 csets {
2be0: 44 72 6f 70 70 69 6e 67 20 24 73 65 6c 66 20 3d  Dropping $self =
2bf0: 20 5b 24 73 65 6c 66 20 73 74 72 5d 7d 0a 0a 09   [$self str]}...
2c00: 73 74 61 74 65 20 74 72 61 6e 73 61 63 74 69 6f  state transactio
2c10: 6e 20 7b 0a 09 20 20 20 20 73 74 61 74 65 20 72  n {..    state r
2c20: 75 6e 20 7b 0a 09 09 44 45 4c 45 54 45 20 46 52  un {...DELETE FR
2c30: 4f 4d 20 63 68 61 6e 67 65 73 65 74 20 57 48 45  OM changeset WHE
2c40: 52 45 20 63 69 64 20 3d 20 24 6d 79 69 64 3b 0a  RE cid = $myid;.
2c50: 09 09 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 73  ..DELETE FROM cs
2c60: 69 74 65 6d 20 20 20 20 57 48 45 52 45 20 63 69  item    WHERE ci
2c70: 64 20 3d 20 24 6d 79 69 64 3b 0a 09 20 20 20 20  d = $myid;..    
2c80: 7d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 69 69  }..}..foreach ii
2c90: 64 20 24 6d 79 69 74 65 6d 73 20 7b 0a 09 20 20  d $myitems {..  
2ca0: 20 20 73 65 74 20 6b 65 79 20 5b 6c 69 73 74 20    set key [list 
2cb0: 24 6d 79 74 79 70 65 20 24 69 69 64 5d 0a 09 20  $mytype $iid].. 
2cc0: 20 20 20 75 6e 73 65 74 20 6d 79 69 74 65 6d 6d     unset myitemm
2cd0: 61 70 28 24 6b 65 79 29 0a 09 20 20 20 20 6c 6f  ap($key)..    lo
2ce0: 67 20 77 72 69 74 65 20 38 20 63 73 65 74 73 20  g write 8 csets 
2cf0: 7b 4d 41 50 2d 20 69 74 65 6d 20 3c 24 6b 65 79  {MAP- item <$key
2d00: 3e 20 24 73 65 6c 66 20 3d 20 5b 24 73 65 6c 66  > $self = [$self
2d10: 20 73 74 72 5d 7d 0a 09 7d 0a 09 73 65 74 20 70   str]}..}..set p
2d20: 6f 73 20 20 20 20 20 20 20 20 20 20 5b 6c 73 65  os          [lse
2d30: 61 72 63 68 20 2d 65 78 61 63 74 20 24 6d 79 63  arch -exact $myc
2d40: 68 61 6e 67 65 73 65 74 73 20 24 73 65 6c 66 5d  hangesets $self]
2d50: 0a 09 73 65 74 20 6d 79 63 68 61 6e 67 65 73 65  ..set mychangese
2d60: 74 73 20 5b 6c 72 65 70 6c 61 63 65 20 24 6d 79  ts [lreplace $my
2d70: 63 68 61 6e 67 65 73 65 74 73 20 24 70 6f 73 20  changesets $pos 
2d80: 24 70 6f 73 5d 0a 09 72 65 74 75 72 6e 0a 20 20  $pos]..return.  
2d90: 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20    }..    method 
2da0: 6c 6f 6f 70 63 68 65 63 6b 20 7b 7d 20 7b 0a 09  loopcheck {} {..
2db0: 6c 6f 67 20 77 72 69 74 65 20 37 20 63 73 65 74  log write 7 cset
2dc0: 73 20 7b 43 68 65 63 6b 69 6e 67 20 5b 24 73 65  s {Checking [$se
2dd0: 6c 66 20 73 74 72 5d 20 66 6f 72 20 6c 6f 6f 70  lf str] for loop
2de0: 73 20 2f 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 69  s /[llength $myi
2df0: 74 65 6d 73 5d 7d 0a 0a 09 69 66 20 7b 21 5b 73  tems]}...if {![s
2e00: 74 72 75 63 74 3a 3a 73 65 74 20 63 6f 6e 74 61  truct::set conta
2e10: 69 6e 73 20 5b 24 73 65 6c 66 20 73 75 63 63 65  ins [$self succe
2e20: 73 73 6f 72 73 5d 20 24 73 65 6c 66 5d 7d 20 7b  ssors] $self]} {
2e30: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 30 0a 09  ..    return 0..
2e40: 7d 0a 09 69 66 20 7b 5b 6c 6f 67 20 76 65 72 62  }..if {[log verb
2e50: 6f 73 69 74 79 3f 5d 20 3c 20 38 7d 20 7b 20 72  osity?] < 8} { r
2e60: 65 74 75 72 6e 20 31 20 7d 0a 0a 09 23 20 50 72  eturn 1 }...# Pr
2e70: 69 6e 74 20 74 68 65 20 64 65 74 61 69 6c 65 64  int the detailed
2e80: 20 73 75 63 63 65 73 73 6f 72 20 73 74 72 75 63   successor struc
2e90: 74 75 72 65 20 6f 66 20 74 68 65 20 73 65 6c 66  ture of the self
2ea0: 2d 0a 09 23 20 72 65 66 65 72 65 6e 74 69 61 6c  -..# referential
2eb0: 20 63 68 61 6e 67 65 73 65 74 2c 20 69 66 20 74   changeset, if t
2ec0: 68 65 20 76 65 72 62 6f 73 69 74 79 20 6f 66 20  he verbosity of 
2ed0: 74 68 65 20 6c 6f 67 20 69 73 20 64 69 61 6c 65  the log is diale
2ee0: 64 0a 09 23 20 68 69 67 68 20 65 6e 6f 75 67 68  d..# high enough
2ef0: 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 38 20  ....log write 8 
2f00: 63 73 65 74 73 20 5b 73 65 74 20 68 64 72 20 7b  csets [set hdr {
2f10: 53 65 6c 66 2d 72 65 66 65 72 65 6e 74 69 61 6c  Self-referential
2f20: 20 63 68 61 6e 67 65 73 65 74 20 5b 24 73 65 6c   changeset [$sel
2f30: 66 20 73 74 72 5d 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  f str] _________
2f40: 5f 5f 5f 5f 5f 5f 5f 5f 5f 7d 5d 0a 09 61 72 72  _________}]..arr
2f50: 61 79 20 73 65 74 20 6e 6d 61 70 20 5b 24 73 65  ay set nmap [$se
2f60: 6c 66 20 6e 65 78 74 6d 61 70 5d 0a 09 66 6f 72  lf nextmap]..for
2f70: 65 61 63 68 20 69 74 65 6d 20 5b 6c 73 6f 72 74  each item [lsort
2f80: 20 2d 64 69 63 74 20 5b 61 72 72 61 79 20 6e 61   -dict [array na
2f90: 6d 65 73 20 6e 6d 61 70 5d 5d 20 7b 0a 09 20 20  mes nmap]] {..  
2fa0: 20 20 66 6f 72 65 61 63 68 20 73 75 63 63 69 74    foreach succit
2fb0: 65 6d 20 24 6e 6d 61 70 28 24 69 74 65 6d 29 20  em $nmap($item) 
2fc0: 7b 0a 09 09 73 65 74 20 73 75 63 63 63 73 20 24  {...set succcs $
2fd0: 6d 79 69 74 65 6d 6d 61 70 28 24 73 75 63 63 69  myitemmap($succi
2fe0: 74 65 6d 29 0a 09 09 73 65 74 20 68 69 6e 74 20  tem)...set hint 
2ff0: 5b 65 78 70 72 20 7b 28 24 73 75 63 63 63 73 20  [expr {($succcs 
3000: 65 71 20 24 73 65 6c 66 29 0a 09 09 09 09 3f 20  eq $self).....? 
3010: 22 4c 4f 4f 50 22 0a 09 09 09 09 3a 20 22 20 20  "LOOP".....: "  
3020: 20 20 22 7d 5d 0a 09 09 73 65 74 20 69 20 20 20    "}]...set i   
3030: 22 3c 24 69 74 65 6d 20 5b 24 74 79 70 65 20 69  "<$item [$type i
3040: 74 65 6d 73 74 72 20 24 69 74 65 6d 5d 3e 22 0a  temstr $item]>".
3050: 09 09 73 65 74 20 73 20 20 20 22 3c 24 73 75 63  ..set s   "<$suc
3060: 63 69 74 65 6d 20 5b 24 74 79 70 65 20 69 74 65  citem [$type ite
3070: 6d 73 74 72 20 24 73 75 63 63 69 74 65 6d 5d 3e  mstr $succitem]>
3080: 22 0a 09 09 73 65 74 20 73 63 73 20 5b 24 73 75  "...set scs [$su
3090: 63 63 63 73 20 73 74 72 5d 0a 09 09 6c 6f 67 20  cccs str]...log 
30a0: 77 72 69 74 65 20 38 20 63 73 65 74 73 20 7b 24  write 8 csets {$
30b0: 68 69 6e 74 20 2a 20 24 69 20 2d 2d 3e 20 24 73  hint * $i --> $s
30c0: 20 2d 2d 3e 20 63 73 20 24 73 63 73 7d 0a 09 20   --> cs $scs}.. 
30d0: 20 20 20 7d 0a 09 7d 0a 09 6c 6f 67 20 77 72 69     }..}..log wri
30e0: 74 65 20 38 20 63 73 65 74 73 20 5b 72 65 67 73  te 8 csets [regs
30f0: 75 62 20 2d 61 6c 6c 20 7b 5b 5e 20 09 5d 7d 20  ub -all {[^ .]} 
3100: 24 68 64 72 20 7b 5f 7d 5d 0a 09 72 65 74 75 72  $hdr {_}]..retur
3110: 6e 20 31 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  n 1.    }..    t
3120: 79 70 65 6d 65 74 68 6f 64 20 73 70 6c 69 74 20  ypemethod split 
3130: 7b 63 73 65 74 20 61 72 67 73 7d 20 7b 0a 09 23  {cset args} {..#
3140: 20 41 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   As part of the 
3150: 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  creation of the 
3160: 6e 65 77 20 63 68 61 6e 67 65 73 65 74 73 20 73  new changesets s
3170: 70 65 63 69 66 69 65 64 20 69 6e 0a 09 23 20 41  pecified in..# A
3180: 52 47 53 20 61 73 20 73 65 74 73 20 6f 66 20 69  RGS as sets of i
3190: 74 65 6d 73 2c 20 61 6c 6c 20 73 75 62 73 65 74  tems, all subset
31a0: 73 20 6f 66 20 43 53 45 54 27 73 20 69 74 65 6d  s of CSET's item
31b0: 20 73 65 74 2c 20 43 53 45 54 0a 09 23 20 77 69   set, CSET..# wi
31c0: 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72  ll be dropped fr
31d0: 6f 6d 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  om all databases
31e0: 2c 20 69 6e 20 61 6e 64 20 6f 75 74 20 6f 66 20  , in and out of 
31f0: 6d 65 6d 6f 72 79 2c 0a 09 23 20 61 6e 64 20 74  memory,..# and t
3200: 68 65 6e 20 64 65 73 74 72 6f 79 65 64 2e 0a 09  hen destroyed...
3210: 23 0a 09 23 20 4e 6f 74 65 3a 20 54 68 65 20 69  #..# Note: The i
3220: 74 65 6d 20 6c 69 73 74 73 20 66 6f 75 6e 64 20  tem lists found 
3230: 69 6e 20 61 72 67 73 20 61 72 65 20 74 61 67 67  in args are tagg
3240: 65 64 20 69 74 65 6d 73 2e 20 54 68 65 79 0a 09  ed items. They..
3250: 23 20 68 61 76 65 20 74 6f 20 68 61 76 65 20 74  # have to have t
3260: 68 65 20 73 61 6d 65 20 74 79 70 65 20 61 73 20  he same type as 
3270: 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20 62  the changeset, b
3280: 65 69 6e 67 20 73 75 62 73 65 74 73 0a 09 23 20  eing subsets..# 
3290: 6f 66 20 69 74 73 20 69 74 65 6d 73 2e 20 54 68  of its items. Th
32a0: 69 73 20 69 73 20 63 68 65 63 6b 65 64 20 69 6e  is is checked in
32b0: 20 55 6e 74 61 67 31 2e 0a 0a 09 6c 6f 67 20 77   Untag1....log w
32c0: 72 69 74 65 20 38 20 63 73 65 74 73 20 7b 4f 4c  rite 8 csets {OL
32d0: 44 3a 20 5b 6c 73 6f 72 74 20 5b 24 63 73 65 74  D: [lsort [$cset
32e0: 20 69 74 65 6d 73 5d 5d 7d 0a 09 56 61 6c 69 64   items]]}..Valid
32f0: 61 74 65 46 72 61 67 6d 65 6e 74 73 20 24 63 73  ateFragments $cs
3300: 65 74 20 24 61 72 67 73 0a 0a 09 23 20 41 6c 6c  et $args...# All
3310: 20 63 68 65 63 6b 73 20 70 61 73 73 2c 20 61 63   checks pass, ac
3320: 74 75 61 6c 6c 79 20 70 65 72 66 6f 72 6d 20 74  tually perform t
3330: 68 65 20 73 70 6c 69 74 2e 0a 0a 09 73 74 72 75  he split....stru
3340: 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20  ct::list assign 
3350: 5b 24 63 73 65 74 20 64 61 74 61 5d 20 70 72 6f  [$cset data] pro
3360: 6a 65 63 74 20 63 73 74 79 70 65 20 63 73 73 72  ject cstype cssr
3370: 63 0a 0a 09 24 63 73 65 74 20 64 72 6f 70 0a 09  c...$cset drop..
3380: 24 63 73 65 74 20 64 65 73 74 72 6f 79 0a 0a 09  $cset destroy...
3390: 73 65 74 20 6e 65 77 63 73 65 74 73 20 7b 7d 0a  set newcsets {}.
33a0: 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65 6e  .foreach fragmen
33b0: 74 69 74 65 6d 73 20 24 61 72 67 73 20 7b 0a 09  titems $args {..
33c0: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 38 20      log write 8 
33d0: 63 73 65 74 73 20 7b 4d 41 4b 45 3a 20 5b 6c 73  csets {MAKE: [ls
33e0: 6f 72 74 20 24 66 72 61 67 6d 65 6e 74 69 74 65  ort $fragmentite
33f0: 6d 73 5d 7d 0a 0a 09 20 20 20 20 73 65 74 20 66  ms]}...    set f
3400: 72 61 67 6d 65 6e 74 20 5b 24 74 79 70 65 20 25  ragment [$type %
3410: 41 55 54 4f 25 20 24 70 72 6f 6a 65 63 74 20 24  AUTO% $project $
3420: 63 73 74 79 70 65 20 24 63 73 73 72 63 20 5c 0a  cstype $cssrc \.
3430: 09 09 09 20 20 20 20 20 20 5b 55 6e 74 61 67 20  ...      [Untag 
3440: 24 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 20 24  $fragmentitems $
3450: 63 73 74 79 70 65 5d 5d 0a 09 20 20 20 20 6c 61  cstype]]..    la
3460: 70 70 65 6e 64 20 6e 65 77 63 73 65 74 73 20 24  ppend newcsets $
3470: 66 72 61 67 6d 65 6e 74 0a 09 20 20 20 20 24 66  fragment..    $f
3480: 72 61 67 6d 65 6e 74 20 70 65 72 73 69 73 74 0a  ragment persist.
3490: 0a 09 20 20 20 20 69 66 20 7b 5b 24 66 72 61 67  ..    if {[$frag
34a0: 6d 65 6e 74 20 6c 6f 6f 70 63 68 65 63 6b 5d 7d  ment loopcheck]}
34b0: 20 7b 0a 09 09 74 72 6f 75 62 6c 65 20 66 61 74   {...trouble fat
34c0: 61 6c 20 22 5b 24 66 72 61 67 6d 65 6e 74 20 73  al "[$fragment s
34d0: 74 72 5d 20 64 65 70 65 6e 64 73 20 6f 6e 20 69  tr] depends on i
34e0: 74 73 65 6c 66 22 0a 09 20 20 20 20 7d 0a 09 7d  tself"..    }..}
34f0: 0a 0a 09 74 72 6f 75 62 6c 65 20 61 62 6f 72 74  ...trouble abort
3500: 3f 0a 09 72 65 74 75 72 6e 20 24 6e 65 77 63 73  ?..return $newcs
3510: 65 74 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  ets.    }..    t
3520: 79 70 65 6d 65 74 68 6f 64 20 69 74 65 6d 73 74  ypemethod itemst
3530: 72 20 7b 69 74 65 6d 7d 20 7b 0a 09 73 74 72 75  r {item} {..stru
3540: 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20  ct::list assign 
3550: 24 69 74 65 6d 20 69 74 79 70 65 20 69 69 64 0a  $item itype iid.
3560: 09 72 65 74 75 72 6e 20 5b 24 69 74 79 70 65 20  .return [$itype 
3570: 73 74 72 20 24 69 69 64 5d 0a 20 20 20 20 7d 0a  str $iid].    }.
3580: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
3590: 73 74 72 6c 69 73 74 20 7b 63 68 61 6e 67 65 73  strlist {changes
35a0: 65 74 73 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b  ets} {..return [
35b0: 6a 6f 69 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69  join [struct::li
35c0: 73 74 20 6d 61 70 20 24 63 68 61 6e 67 65 73 65  st map $changese
35d0: 74 73 20 5b 6d 79 70 72 6f 63 20 49 44 5d 5d 5d  ts [myproc ID]]]
35e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63  .    }..    proc
35f0: 20 49 44 20 7b 63 73 65 74 7d 20 7b 20 24 63 73   ID {cset} { $cs
3600: 65 74 20 73 74 72 20 7d 0a 0a 20 20 20 20 70 72  et str }..    pr
3610: 6f 63 20 55 6e 74 61 67 20 7b 74 61 67 67 65 64  oc Untag {tagged
3620: 69 74 65 6d 73 20 63 73 74 79 70 65 7d 20 7b 0a  items cstype} {.
3630: 09 72 65 74 75 72 6e 20 5b 73 74 72 75 63 74 3a  .return [struct:
3640: 3a 6c 69 73 74 20 6d 61 70 20 24 74 61 67 67 65  :list map $tagge
3650: 64 69 74 65 6d 73 20 5b 6d 79 70 72 6f 63 20 55  ditems [myproc U
3660: 6e 74 61 67 31 20 24 63 73 74 79 70 65 5d 5d 0a  ntag1 $cstype]].
3670: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20      }..    proc 
3680: 55 6e 74 61 67 31 20 7b 63 73 74 79 70 65 20 74  Untag1 {cstype t
3690: 68 65 69 74 65 6d 7d 20 7b 0a 09 73 74 72 75 63  heitem} {..struc
36a0: 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 24  t::list assign $
36b0: 74 68 65 69 74 65 6d 20 74 20 69 0a 09 69 6e 74  theitem t i..int
36c0: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24  egrity assert {$
36d0: 63 73 74 79 70 65 20 65 71 20 24 74 7d 20 7b 49  cstype eq $t} {I
36e0: 74 65 6d 20 24 69 27 73 20 74 79 70 65 20 69 73  tem $i's type is
36f0: 20 27 24 74 27 2c 20 65 78 70 65 63 74 65 64 20   '$t', expected 
3700: 27 24 63 73 74 79 70 65 27 7d 0a 09 72 65 74 75  '$cstype'}..retu
3710: 72 6e 20 24 69 0a 20 20 20 20 7d 0a 0a 20 20 20  rn $i.    }..   
3720: 20 70 72 6f 63 20 56 61 6c 69 64 61 74 65 46 72   proc ValidateFr
3730: 61 67 6d 65 6e 74 73 20 7b 63 73 65 74 20 66 72  agments {cset fr
3740: 61 67 6d 65 6e 74 73 7d 20 7b 0a 09 23 20 43 68  agments} {..# Ch
3750: 65 63 6b 20 74 68 65 20 76 61 72 69 6f 75 73 20  eck the various 
3760: 69 6e 74 65 67 72 69 74 79 20 63 6f 6e 73 74 72  integrity constr
3770: 61 69 6e 74 73 20 66 6f 72 20 74 68 65 20 66 72  aints for the fr
3780: 61 67 6d 65 6e 74 73 0a 09 23 20 73 70 65 63 69  agments..# speci
3790: 66 79 69 6e 67 20 68 6f 77 20 74 6f 20 73 70 6c  fying how to spl
37a0: 69 74 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  it the changeset
37b0: 3a 0a 09 23 0a 09 23 20 2a 20 57 65 20 6d 75 73  :..#..# * We mus
37c0: 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f  t have two or mo
37d0: 72 65 20 66 72 61 67 6d 65 6e 74 73 2c 20 61 73  re fragments, as
37e0: 20 73 70 6c 69 74 74 69 6e 67 20 61 0a 09 23 20   splitting a..# 
37f0: 20 20 63 68 61 6e 67 65 73 65 74 20 69 6e 74 6f    changeset into
3800: 20 6f 6e 65 20 6d 61 6b 65 73 20 6e 6f 20 73 65   one makes no se
3810: 6e 73 65 2e 0a 09 23 20 2a 20 4e 6f 20 66 72 61  nse...# * No fra
3820: 67 6d 65 6e 74 20 6d 61 79 20 62 65 20 65 6d 70  gment may be emp
3830: 74 79 2e 0a 09 23 20 2a 20 41 6c 6c 20 66 72 61  ty...# * All fra
3840: 67 6d 65 6e 74 73 20 68 61 76 65 20 74 6f 20 62  gments have to b
3850: 65 20 74 72 75 65 20 73 75 62 73 65 74 73 20 6f  e true subsets o
3860: 66 20 74 68 65 20 69 74 65 6d 73 20 69 6e 20 74  f the items in t
3870: 68 65 0a 09 23 20 20 20 63 68 61 6e 67 65 73 65  he..#   changese
3880: 74 20 74 6f 20 73 70 6c 69 74 2e 20 54 68 65 20  t to split. The 
3890: 27 74 72 75 65 27 20 69 73 20 69 6d 70 6c 69 65  'true' is implie
38a0: 64 20 62 65 63 61 75 73 65 20 6e 6f 6e 65 20 61  d because none a
38b0: 72 65 0a 09 23 20 20 20 61 6c 6c 6f 77 65 64 20  re..#   allowed 
38c0: 74 6f 20 62 65 20 65 6d 70 74 79 2c 20 73 6f 20  to be empty, so 
38d0: 65 61 63 68 20 68 61 73 20 74 6f 20 62 65 20 73  each has to be s
38e0: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 0a  maller than the.
38f0: 09 23 20 20 20 74 6f 74 61 6c 2e 0a 09 23 20 2a  .#   total...# *
3900: 20 54 68 65 20 75 6e 69 6f 6e 20 6f 66 20 74 68   The union of th
3910: 65 20 66 72 61 67 6d 65 6e 74 73 20 68 61 73 20  e fragments has 
3920: 74 6f 20 62 65 20 74 68 65 20 69 74 65 6d 20 73  to be the item s
3930: 65 74 20 6f 66 20 74 68 65 0a 09 23 20 20 20 63  et of the..#   c
3940: 68 61 6e 67 65 73 65 74 2e 0a 09 23 20 2a 20 54  hangeset...# * T
3950: 68 65 20 66 72 61 67 6d 65 6e 74 20 6d 75 73 74  he fragment must
3960: 20 6e 6f 74 20 6f 76 65 72 6c 61 70 2c 20 69 2e   not overlap, i.
3970: 65 2e 20 74 68 65 69 72 20 70 61 69 72 77 69 73  e. their pairwis
3980: 65 0a 09 23 20 20 20 69 6e 74 65 72 73 65 63 74  e..#   intersect
3990: 69 6f 6e 73 20 68 61 76 65 20 74 6f 20 62 65 20  ions have to be 
39a0: 65 6d 70 74 79 2e 0a 0a 09 73 65 74 20 63 6f 76  empty....set cov
39b0: 65 72 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 66  er {}..foreach f
39c0: 72 61 67 6d 65 6e 74 69 74 65 6d 73 20 24 66 72  ragmentitems $fr
39d0: 61 67 6d 65 6e 74 73 20 7b 0a 09 20 20 20 20 6c  agments {..    l
39e0: 6f 67 20 77 72 69 74 65 20 38 20 63 73 65 74 73  og write 8 csets
39f0: 20 7b 4e 45 57 3a 20 5b 6c 73 6f 72 74 20 24 66   {NEW: [lsort $f
3a00: 72 61 67 6d 65 6e 74 69 74 65 6d 73 5d 7d 0a 0a  ragmentitems]}..
3a10: 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61  .    integrity a
3a20: 73 73 65 72 74 20 7b 0a 09 09 21 5b 73 74 72 75  ssert {...![stru
3a30: 63 74 3a 3a 73 65 74 20 65 6d 70 74 79 20 24 66  ct::set empty $f
3a40: 72 61 67 6d 65 6e 74 69 74 65 6d 73 5d 0a 09 20  ragmentitems].. 
3a50: 20 20 20 7d 20 7b 63 68 61 6e 67 65 73 65 74 20     } {changeset 
3a60: 66 72 61 67 6d 65 6e 74 20 69 73 20 65 6d 70 74  fragment is empt
3a70: 79 7d 0a 0a 09 20 20 20 20 69 6e 74 65 67 72 69  y}...    integri
3a80: 74 79 20 61 73 73 65 72 74 20 7b 0a 09 09 5b 73  ty assert {...[s
3a90: 74 72 75 63 74 3a 3a 73 65 74 20 73 75 62 73 65  truct::set subse
3aa0: 74 6f 66 20 24 66 72 61 67 6d 65 6e 74 69 74 65  tof $fragmentite
3ab0: 6d 73 20 5b 24 63 73 65 74 20 69 74 65 6d 73 5d  ms [$cset items]
3ac0: 5d 0a 09 20 20 20 20 7d 20 7b 63 68 61 6e 67 65  ]..    } {change
3ad0: 73 65 74 20 66 72 61 67 6d 65 6e 74 20 69 73 20  set fragment is 
3ae0: 6e 6f 74 20 61 20 73 75 62 73 65 74 7d 0a 09 20  not a subset}.. 
3af0: 20 20 20 73 74 72 75 63 74 3a 3a 73 65 74 20 61     struct::set a
3b00: 64 64 20 63 6f 76 65 72 20 24 66 72 61 67 6d 65  dd cover $fragme
3b10: 6e 74 69 74 65 6d 73 0a 09 7d 0a 0a 09 69 6e 74  ntitems..}...int
3b20: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 0a  egrity assert {.
3b30: 09 20 20 20 20 5b 73 74 72 75 63 74 3a 3a 73 65  .    [struct::se
3b40: 74 20 65 71 75 61 6c 20 24 63 6f 76 65 72 20 5b  t equal $cover [
3b50: 24 63 73 65 74 20 69 74 65 6d 73 5d 5d 0a 09 20  $cset items]].. 
3b60: 7d 20 7b 54 68 65 20 66 72 61 67 6d 65 6e 74 73  } {The fragments
3b70: 20 64 6f 20 6e 6f 74 20 63 6f 76 65 72 20 74 68   do not cover th
3b80: 65 20 6f 72 69 67 69 6e 61 6c 20 63 68 61 6e 67  e original chang
3b90: 65 73 65 74 7d 0a 0a 09 73 65 74 20 69 20 31 0a  eset}...set i 1.
3ba0: 09 66 6f 72 65 61 63 68 20 66 69 61 20 24 66 72  .foreach fia $fr
3bb0: 61 67 6d 65 6e 74 73 20 7b 0a 09 20 20 20 20 66  agments {..    f
3bc0: 6f 72 65 61 63 68 20 66 69 62 20 5b 6c 72 61 6e  oreach fib [lran
3bd0: 67 65 20 24 66 72 61 67 6d 65 6e 74 73 20 24 69  ge $fragments $i
3be0: 20 65 6e 64 5d 20 7b 0a 09 09 69 6e 74 65 67 72   end] {...integr
3bf0: 69 74 79 20 61 73 73 65 72 74 20 7b 0a 09 09 20  ity assert {... 
3c00: 20 20 20 5b 73 74 72 75 63 74 3a 3a 73 65 74 20     [struct::set 
3c10: 65 6d 70 74 79 20 5b 73 74 72 75 63 74 3a 3a 73  empty [struct::s
3c20: 65 74 20 69 6e 74 65 72 73 65 63 74 20 24 66 69  et intersect $fi
3c30: 61 20 24 66 69 62 5d 5d 0a 09 09 7d 20 7b 54 68  a $fib]]...} {Th
3c40: 65 20 66 72 61 67 6d 65 6e 74 73 20 3c 24 66 69  e fragments <$fi
3c50: 61 3e 20 61 6e 64 20 3c 24 66 69 62 3e 20 6f 76  a> and <$fib> ov
3c60: 65 72 6c 61 70 7d 0a 09 20 20 20 20 7d 0a 09 20  erlap}..    }.. 
3c70: 20 20 20 69 6e 63 72 20 69 0a 09 7d 0a 0a 09 72     incr i..}...r
3c80: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
3c90: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23   # # ## ### ####
3ca0: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
3cb0: 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20  ########.    ## 
3cc0: 53 74 61 74 65 0a 0a 20 20 20 20 76 61 72 69 61  State..    varia
3cd0: 62 6c 65 20 6d 79 69 64 20 20 20 20 20 20 20 20  ble myid        
3ce0: 7b 7d 20 3b 20 23 20 49 64 20 6f 66 20 74 68 65  {} ; # Id of the
3cf0: 20 63 73 65 74 20 66 6f 72 20 74 68 65 20 70 65   cset for the pe
3d00: 72 73 69 73 74 65 6e 74 0a 09 09 09 20 20 20 20  rsistent....    
3d10: 20 20 23 20 73 74 61 74 65 2e 0a 20 20 20 20 76    # state..    v
3d20: 61 72 69 61 62 6c 65 20 6d 79 70 72 6f 6a 65 63  ariable myprojec
3d30: 74 20 20 20 7b 7d 20 3b 20 23 20 52 65 66 65 72  t   {} ; # Refer
3d40: 65 6e 63 65 20 6f 66 20 74 68 65 20 70 72 6f 6a  ence of the proj
3d50: 65 63 74 20 6f 62 6a 65 63 74 20 74 68 65 0a 09  ect object the..
3d60: 09 09 20 20 20 20 20 20 23 20 63 68 61 6e 67 65  ..      # change
3d70: 73 65 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a  set belongs to..
3d80: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 74      variable myt
3d90: 79 70 65 20 20 20 20 20 20 7b 7d 20 3b 20 23 20  ype      {} ; # 
3da0: 57 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 73  What the changes
3db0: 65 74 20 69 73 20 62 61 73 65 64 20 6f 6e 0a 09  et is based on..
3dc0: 09 09 20 20 20 20 20 20 23 20 28 72 65 76 69 73  ..      # (revis
3dd0: 69 6f 6e 73 2c 20 74 61 67 73 2c 20 6f 72 20 62  ions, tags, or b
3de0: 72 61 6e 63 68 65 73 29 2e 0a 09 09 09 20 20 20  ranches).....   
3df0: 20 20 20 23 20 56 61 6c 75 65 73 3a 20 53 65 65     # Values: See
3e00: 20 6d 79 63 73 74 79 70 65 2e 20 4e 6f 74 65 20   mycstype. Note 
3e10: 74 68 61 74 20 77 65 0a 09 09 09 20 20 20 20 20  that we....     
3e20: 20 23 20 68 61 76 65 20 74 6f 20 6b 65 65 70 20   # have to keep 
3e30: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  the names of the
3e40: 20 68 65 6c 70 65 72 0a 09 09 09 20 20 20 20 20   helper....     
3e50: 20 23 20 73 69 6e 67 6c 65 74 6f 6e 73 20 69 6e   # singletons in
3e60: 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 63   sync with the c
3e70: 6f 6e 74 65 6e 74 73 0a 09 09 09 20 20 20 20 20  ontents....     
3e80: 20 23 20 6f 66 20 73 74 61 74 65 20 74 61 62 6c   # of state tabl
3e90: 65 20 27 63 73 74 79 70 65 27 2c 20 61 6e 64 20  e 'cstype', and 
3ea0: 76 61 72 69 6f 75 73 0a 09 09 09 20 20 20 20 20  various....     
3eb0: 20 23 20 6f 74 68 65 72 20 70 6c 61 63 65 73 20   # other places 
3ec0: 75 73 69 6e 67 20 74 68 65 6d 20 68 61 72 64 77  using them hardw
3ed0: 69 72 65 64 2e 0a 20 20 20 20 76 61 72 69 61 62  ired..    variab
3ee0: 6c 65 20 6d 79 74 79 70 65 6f 62 6a 20 20 20 7b  le mytypeobj   {
3ef0: 7d 20 3b 20 23 20 52 65 66 65 72 65 6e 63 65 20  } ; # Reference 
3f00: 74 6f 20 74 68 65 20 63 6f 6e 74 61 69 6e 65 72  to the container
3f10: 20 66 6f 72 20 74 68 65 0a 09 09 09 20 20 20 20   for the....    
3f20: 20 20 23 20 74 79 70 65 20 64 65 70 65 6e 64 65    # type depende
3f30: 6e 74 20 63 6f 64 65 2e 20 44 65 72 69 76 65 64  nt code. Derived
3f40: 20 66 72 6f 6d 0a 09 09 09 20 20 20 20 20 20 23   from....      #
3f50: 20 6d 79 74 79 70 65 2e 0a 20 20 20 20 76 61 72   mytype..    var
3f60: 69 61 62 6c 65 20 6d 79 73 72 63 69 64 20 20 20  iable mysrcid   
3f70: 20 20 7b 7d 20 3b 20 23 20 49 64 20 6f 66 20 74    {} ; # Id of t
3f80: 68 65 20 6d 65 74 61 64 61 74 61 20 6f 72 20 73  he metadata or s
3f90: 79 6d 62 6f 6c 20 74 68 65 20 63 73 65 74 0a 09  ymbol the cset..
3fa0: 09 09 20 20 20 20 20 20 23 20 69 73 20 62 61 73  ..      # is bas
3fb0: 65 64 20 6f 6e 2e 0a 20 20 20 20 76 61 72 69 61  ed on..    varia
3fc0: 62 6c 65 20 6d 79 69 74 65 6d 73 20 20 20 20 20  ble myitems     
3fd0: 7b 7d 20 3b 20 23 20 4c 69 73 74 20 6f 66 20 74  {} ; # List of t
3fe0: 68 65 20 66 69 6c 65 20 6c 65 76 65 6c 20 72 65  he file level re
3ff0: 76 69 73 69 6f 6e 73 2c 0a 09 09 09 20 20 20 20  visions,....    
4000: 20 20 23 20 74 61 67 73 2c 20 6f 72 20 62 72 61    # tags, or bra
4010: 6e 63 68 65 73 20 69 6e 20 74 68 65 20 63 73 65  nches in the cse
4020: 74 2c 20 61 73 0a 09 09 09 20 20 20 20 20 20 23  t, as....      #
4030: 20 69 64 73 2e 20 4e 6f 74 20 74 61 67 67 65 64   ids. Not tagged
4040: 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d  ..    variable m
4050: 79 74 69 74 65 6d 73 20 20 20 20 7b 7d 20 3b 20  ytitems    {} ; 
4060: 23 20 41 73 20 6d 79 69 74 65 6d 73 2c 20 74 68  # As myitems, th
4070: 65 20 74 61 67 67 65 64 20 66 6f 72 6d 2e 0a 20  e tagged form.. 
4080: 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 70 72     variable mypr
4090: 65 6d 61 70 20 20 20 20 7b 7d 20 3b 20 23 20 44  emap    {} ; # D
40a0: 69 63 74 69 6f 6e 61 72 79 20 6d 61 70 70 69 6e  ictionary mappin
40b0: 67 20 66 72 6f 6d 20 74 68 65 20 69 74 65 6d 73  g from the items
40c0: 20 28 74 61 67 67 65 64 20 6e 6f 77 29 0a 09 09   (tagged now)...
40d0: 09 20 20 20 20 20 20 23 20 74 6f 20 74 68 65 69  .      # to thei
40e0: 72 20 70 72 65 64 65 63 65 73 73 6f 72 73 2c 20  r predecessors, 
40f0: 61 6c 73 6f 20 74 61 67 67 65 64 2e 20 41 0a 09  also tagged. A..
4100: 09 09 20 20 20 20 20 20 23 20 63 61 63 68 65 20  ..      # cache 
4110: 74 6f 20 61 76 6f 69 64 20 6c 6f 61 64 69 6e 67  to avoid loading
4120: 20 74 68 69 73 20 66 72 6f 6d 20 74 68 65 0a 09   this from the..
4130: 09 09 20 20 20 20 20 20 23 20 73 74 61 74 65 20  ..      # state 
4140: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 2e 0a  more than once..
4150: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 6e      variable myn
4160: 65 78 74 6d 61 70 20 20 20 7b 7d 20 3b 20 23 20  extmap   {} ; # 
4170: 44 69 63 74 69 6f 6e 61 72 79 20 6d 61 70 70 69  Dictionary mappi
4180: 6e 67 20 66 72 6f 6d 20 74 68 65 20 69 74 65 6d  ng from the item
4190: 73 20 28 74 61 67 67 65 64 29 0a 09 09 09 20 20  s (tagged)....  
41a0: 20 20 20 20 23 20 74 6f 20 74 68 65 69 72 20 73      # to their s
41b0: 75 63 63 65 73 73 6f 72 73 20 28 61 6c 73 6f 20  uccessors (also 
41c0: 74 61 67 67 65 64 29 2e 20 41 0a 09 09 09 20 20  tagged). A....  
41d0: 20 20 20 20 23 20 63 61 63 68 65 20 74 6f 20 61      # cache to a
41e0: 76 6f 69 64 20 6c 6f 61 64 69 6e 67 20 74 68 69  void loading thi
41f0: 73 20 66 72 6f 6d 20 74 68 65 0a 09 09 09 20 20  s from the....  
4200: 20 20 20 20 23 20 73 74 61 74 65 20 6d 6f 72 65      # state more
4210: 20 74 68 61 6e 20 6f 6e 63 65 2e 0a 20 20 20 20   than once..    
4220: 76 61 72 69 61 62 6c 65 20 6d 79 70 6f 73 20 20  variable mypos  
4230: 20 20 20 20 20 7b 7d 20 3b 20 23 20 43 6f 6d 6d       {} ; # Comm
4240: 69 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  it position of t
4250: 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20 69 66  he changeset, if
4260: 0a 09 09 09 20 20 20 20 20 20 23 20 6b 6e 6f 77  ....      # know
4270: 6e 2e 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23  n...    # # ## #
4280: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
4290: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  # #############.
42a0: 20 20 20 20 23 23 20 49 6e 74 65 72 6e 61 6c 20      ## Internal 
42b0: 6d 65 74 68 6f 64 73 0a 0a 20 20 20 20 74 79 70  methods..    typ
42c0: 65 76 61 72 69 61 62 6c 65 20 6d 79 63 6f 75 6e  evariable mycoun
42d0: 74 65 72 20 20 20 20 20 20 20 20 30 20 3b 20 23  ter        0 ; #
42e0: 20 49 64 20 63 6f 75 6e 74 65 72 20 66 6f 72 20   Id counter for 
42f0: 63 73 65 74 73 2e 20 4c 61 73 74 20 69 64 0a 09  csets. Last id..
4300: 09 09 09 20 20 20 20 20 20 23 20 75 73 65 64 2e  ...      # used.
4310: 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c  .    typevariabl
4320: 65 20 6d 79 63 73 74 79 70 65 20 2d 61 72 72 61  e mycstype -arra
4330: 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 63 73 74  y {} ; # Map cst
4340: 79 70 65 73 20 28 6e 61 6d 65 73 29 20 74 6f 20  ypes (names) to 
4350: 70 65 72 73 69 73 74 65 6e 74 0a 09 09 09 09 20  persistent..... 
4360: 20 20 20 20 20 23 20 69 64 73 2e 20 4e 6f 74 65       # ids. Note
4370: 20 74 68 61 74 20 77 65 20 68 61 76 65 20 74 6f   that we have to
4380: 20 6b 65 65 70 0a 09 09 09 09 20 20 20 20 20 20   keep.....      
4390: 23 20 74 68 65 20 6e 61 6d 65 73 20 69 6e 20 74  # the names in t
43a0: 68 65 20 74 61 62 6c 65 20 27 63 73 74 79 70 65  he table 'cstype
43b0: 27 0a 09 09 09 09 20 20 20 20 20 20 23 20 69 6e  '.....      # in
43c0: 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 6e   sync with the n
43d0: 61 6d 65 73 20 6f 66 20 74 68 65 0a 09 09 09 09  ames of the.....
43e0: 20 20 20 20 20 20 23 20 68 65 6c 70 65 72 20 73        # helper s
43f0: 69 6e 67 6c 65 74 6f 6e 73 2e 0a 0a 20 20 20 20  ingletons...    
4400: 74 79 70 65 6d 65 74 68 6f 64 20 67 65 74 63 73  typemethod getcs
4410: 74 79 70 65 73 20 7b 7d 20 7b 0a 09 66 6f 72 65  types {} {..fore
4420: 61 63 68 20 7b 74 69 64 20 6e 61 6d 65 7d 20 5b  ach {tid name} [
4430: 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20  state run {..   
4440: 20 53 45 4c 45 43 54 20 74 69 64 2c 20 6e 61 6d   SELECT tid, nam
4450: 65 20 46 52 4f 4d 20 63 73 74 79 70 65 3b 0a 09  e FROM cstype;..
4460: 7d 5d 20 7b 20 73 65 74 20 6d 79 63 73 74 79 70  }] { set mycstyp
4470: 65 28 24 6e 61 6d 65 29 20 24 74 69 64 20 7d 0a  e($name) $tid }.
4480: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
4490: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c 6f     typemethod lo
44a0: 61 64 63 6f 75 6e 74 65 72 20 7b 7d 20 7b 0a 09  adcounter {} {..
44b0: 23 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  # Initialize the
44c0: 20 63 6f 75 6e 74 65 72 20 66 72 6f 6d 20 74 68   counter from th
44d0: 65 20 73 74 61 74 65 0a 09 73 65 74 20 6d 79 63  e state..set myc
44e0: 6f 75 6e 74 65 72 20 5b 73 74 61 74 65 20 6f 6e  ounter [state on
44f0: 65 20 7b 20 53 45 4c 45 43 54 20 4d 41 58 28 63  e { SELECT MAX(c
4500: 69 64 29 20 46 52 4f 4d 20 63 68 61 6e 67 65 73  id) FROM changes
4510: 65 74 20 7d 5d 0a 09 72 65 74 75 72 6e 0a 20 20  et }]..return.  
4520: 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74    }..    typemet
4530: 68 6f 64 20 6e 75 6d 20 7b 7d 20 7b 20 72 65 74  hod num {} { ret
4540: 75 72 6e 20 24 6d 79 63 6f 75 6e 74 65 72 20 7d  urn $mycounter }
4550: 0a 0a 20 20 20 20 70 72 6f 63 20 49 6e 69 74 69  ..    proc Initi
4560: 61 6c 69 7a 65 42 72 65 61 6b 53 74 61 74 65 20  alizeBreakState 
4570: 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75  {revisions} {..u
4580: 70 76 61 72 20 31 20 70 6f 73 20 70 6f 73 20 63  pvar 1 pos pos c
4590: 72 6f 73 73 20 63 72 6f 73 73 20 72 61 6e 67 65  ross cross range
45a0: 20 72 61 6e 67 65 20 64 65 70 63 20 64 65 70 63   range depc depc
45b0: 20 64 65 6c 74 61 20 64 65 6c 74 61 20 5c 0a 09   delta delta \..
45c0: 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65 73      dependencies
45d0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 0a 09   dependencies...
45e0: 23 20 46 69 72 73 74 20 77 65 20 63 72 65 61 74  # First we creat
45f0: 65 20 61 20 6d 61 70 20 6f 66 20 70 6f 73 69 74  e a map of posit
4600: 69 6f 6e 73 20 74 6f 20 6d 61 6b 65 20 69 74 20  ions to make it 
4610: 65 61 73 69 65 72 20 74 6f 0a 09 23 20 64 65 74  easier to..# det
4620: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 61  ermine whether a
4630: 20 64 65 70 65 6e 64 65 6e 63 79 20 63 72 6f 73   dependency cros
4640: 73 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  ses a particular
4650: 20 69 6e 64 65 78 2e 0a 0a 09 61 72 72 61 79 20   index....array 
4660: 73 65 74 20 70 6f 73 20 20 20 7b 7d 0a 09 61 72  set pos   {}..ar
4670: 72 61 79 20 73 65 74 20 63 72 6f 73 73 20 7b 7d  ray set cross {}
4680: 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 70 63  ..array set depc
4690: 20 20 7b 7d 0a 09 73 65 74 20 72 61 6e 67 65 20    {}..set range 
46a0: 20 20 20 20 20 20 7b 7d 0a 09 73 65 74 20 6e 20        {}..set n 
46b0: 30 0a 09 66 6f 72 65 61 63 68 20 72 65 76 20 24  0..foreach rev $
46c0: 72 65 76 69 73 69 6f 6e 73 20 7b 0a 09 20 20 20  revisions {..   
46d0: 20 6c 61 70 70 65 6e 64 20 72 61 6e 67 65 20 24   lappend range $
46e0: 6e 0a 09 20 20 20 20 73 65 74 20 70 6f 73 28 24  n..    set pos($
46f0: 72 65 76 29 20 24 6e 0a 09 20 20 20 20 73 65 74  rev) $n..    set
4700: 20 63 72 6f 73 73 28 24 6e 29 20 30 0a 09 20 20   cross($n) 0..  
4710: 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 0a 09 23 20    incr n..}...# 
4720: 53 65 63 6f 6e 64 6c 79 20 77 65 20 63 6f 75 6e  Secondly we coun
4730: 74 20 74 68 65 20 63 72 6f 73 73 69 6e 67 73 20  t the crossings 
4740: 70 65 72 20 70 6f 73 69 74 69 6f 6e 2c 20 62 79  per position, by
4750: 20 69 74 65 72 61 74 69 6e 67 0a 09 23 20 6f 76   iterating..# ov
4760: 65 72 20 74 68 65 20 72 65 63 6f 72 64 65 64 20  er the recorded 
4770: 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65  internal depende
4780: 6e 63 69 65 73 2e 0a 0a 09 23 20 4e 6f 74 65 3a  ncies....# Note:
4790: 20 49 66 20 74 68 65 20 74 69 6d 65 73 74 61 6d   If the timestam
47a0: 70 73 20 61 72 65 20 62 61 64 6c 79 20 6f 75 74  ps are badly out
47b0: 20 6f 66 20 6f 72 64 65 72 20 69 74 20 69 73 0a   of order it is.
47c0: 09 23 20 20 20 20 20 20 20 70 6f 73 73 69 62 6c  .#       possibl
47d0: 65 20 74 6f 20 68 61 76 65 20 61 20 62 61 63 6b  e to have a back
47e0: 77 61 72 64 20 73 75 63 63 65 73 73 6f 72 20 64  ward successor d
47f0: 65 70 65 6e 64 65 6e 63 79 2c 0a 09 23 20 20 20  ependency,..#   
4800: 20 20 20 20 69 2e 65 2e 20 77 69 74 68 20 73 74      i.e. with st
4810: 61 72 74 20 3e 20 65 6e 64 2e 20 57 65 20 6d 61  art > end. We ma
4820: 79 20 68 61 76 65 20 74 6f 20 73 77 61 70 20 74  y have to swap t
4830: 68 65 20 69 6e 64 69 63 65 73 0a 09 23 20 20 20  he indices..#   
4840: 20 20 20 20 74 6f 20 65 6e 73 75 72 65 20 74 68      to ensure th
4850: 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  at the following
4860: 20 6c 6f 6f 70 20 72 75 6e 73 20 63 6f 72 72 65   loop runs corre
4870: 63 74 6c 79 2e 0a 09 23 0a 09 23 20 4e 6f 74 65  ctly...#..# Note
4880: 20 32 3a 20 73 74 61 72 74 20 3d 3d 20 65 6e 64   2: start == end
4890: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
48a0: 2e 20 49 74 20 69 6e 64 69 63 61 74 65 73 20 61  . It indicates a
48b0: 0a 09 23 20 20 20 20 20 20 20 20 20 73 65 6c 66  ..#         self
48c0: 2d 64 65 70 65 6e 64 65 6e 63 79 20 64 75 65 20  -dependency due 
48d0: 74 6f 20 74 68 65 20 75 6e 69 71 75 65 6e 65 73  to the uniquenes
48e0: 73 20 6f 66 20 70 6f 73 69 74 69 6f 6e 73 2c 0a  s of positions,.
48f0: 09 23 20 20 20 20 20 20 20 20 20 61 6e 64 20 74  .#         and t
4900: 68 61 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  hat is something
4910: 20 77 65 20 68 61 76 65 20 72 75 6c 65 64 20 6f   we have ruled o
4920: 75 74 20 61 6c 72 65 61 64 79 2c 20 73 65 65 0a  ut already, see.
4930: 09 23 20 20 20 20 20 20 20 20 20 27 72 65 76 20  .#         'rev 
4940: 69 6e 74 65 72 6e 61 6c 73 75 63 63 65 73 73 6f  internalsuccesso
4950: 72 73 27 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b  rs'....foreach {
4960: 72 69 64 20 63 68 69 6c 64 72 65 6e 7d 20 5b 61  rid children} [a
4970: 72 72 61 79 20 67 65 74 20 64 65 70 65 6e 64 65  rray get depende
4980: 6e 63 69 65 73 5d 20 7b 0a 09 20 20 20 20 66 6f  ncies] {..    fo
4990: 72 65 61 63 68 20 63 68 69 6c 64 20 24 63 68 69  reach child $chi
49a0: 6c 64 72 65 6e 20 7b 0a 09 09 73 65 74 20 64 6b  ldren {...set dk
49b0: 65 79 20 20 20 20 5b 6c 69 73 74 20 24 72 69 64  ey    [list $rid
49c0: 20 24 63 68 69 6c 64 5d 0a 09 09 73 65 74 20 73   $child]...set s
49d0: 74 61 72 74 20 20 20 24 70 6f 73 28 24 72 69 64  tart   $pos($rid
49e0: 29 0a 09 09 73 65 74 20 65 6e 64 20 20 20 20 20  )...set end     
49f0: 24 70 6f 73 28 24 63 68 69 6c 64 29 0a 09 09 73  $pos($child)...s
4a00: 65 74 20 63 72 6f 73 73 65 73 20 7b 7d 0a 0a 09  et crosses {}...
4a10: 09 69 66 20 7b 24 73 74 61 72 74 20 3e 20 24 65  .if {$start > $e
4a20: 6e 64 7d 20 7b 0a 09 09 20 20 20 20 77 68 69 6c  nd} {...    whil
4a30: 65 20 7b 24 65 6e 64 20 3c 20 24 73 74 61 72 74  e {$end < $start
4a40: 7d 20 7b 0a 09 09 09 6c 61 70 70 65 6e 64 20 63  } {....lappend c
4a50: 72 6f 73 73 65 73 20 24 65 6e 64 0a 09 09 09 69  rosses $end....i
4a60: 6e 63 72 20 63 72 6f 73 73 28 24 65 6e 64 29 0a  ncr cross($end).
4a70: 09 09 09 69 6e 63 72 20 65 6e 64 0a 09 09 20 20  ...incr end...  
4a80: 20 20 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09    }...} else {..
4a90: 09 20 20 20 20 77 68 69 6c 65 20 7b 24 73 74 61  .    while {$sta
4aa0: 72 74 20 3c 20 24 65 6e 64 7d 20 7b 0a 09 09 09  rt < $end} {....
4ab0: 6c 61 70 70 65 6e 64 20 63 72 6f 73 73 65 73 20  lappend crosses 
4ac0: 24 73 74 61 72 74 0a 09 09 09 69 6e 63 72 20 63  $start....incr c
4ad0: 72 6f 73 73 28 24 73 74 61 72 74 29 0a 09 09 09  ross($start)....
4ae0: 69 6e 63 72 20 73 74 61 72 74 0a 09 09 20 20 20  incr start...   
4af0: 20 7d 0a 09 09 7d 0a 09 09 73 65 74 20 64 65 70   }...}...set dep
4b00: 63 28 24 64 6b 65 79 29 20 24 63 72 6f 73 73 65  c($dkey) $crosse
4b10: 73 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 49 6e  s..    }..}...In
4b20: 69 74 69 61 6c 69 7a 65 44 65 6c 74 61 73 20 24  itializeDeltas $
4b30: 72 65 76 69 73 69 6f 6e 73 0a 09 72 65 74 75 72  revisions..retur
4b40: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f  n.    }..    pro
4b50: 63 20 49 6e 69 74 69 61 6c 69 7a 65 44 65 6c 74  c InitializeDelt
4b60: 61 73 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b  as {revisions} {
4b70: 0a 09 75 70 76 61 72 20 31 20 64 65 6c 74 61 20  ..upvar 1 delta 
4b80: 64 65 6c 74 61 0a 0a 09 23 20 50 75 6c 6c 20 74  delta...# Pull t
4b90: 68 65 20 74 69 6d 65 73 74 61 6d 70 73 20 66 6f  he timestamps fo
4ba0: 72 20 61 6c 6c 20 72 65 76 69 73 69 6f 6e 73 20  r all revisions 
4bb0: 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  in the changeset
4bc0: 73 20 61 6e 64 0a 09 23 20 63 6f 6d 70 75 74 65  s and..# compute
4bd0: 20 74 68 65 69 72 20 64 65 6c 74 61 73 20 66 6f   their deltas fo
4be0: 72 20 75 73 65 20 62 79 20 74 68 65 20 62 72 65  r use by the bre
4bf0: 61 6b 20 66 69 6e 64 65 72 2e 0a 0a 09 61 72 72  ak finder....arr
4c00: 61 79 20 73 65 74 20 64 65 6c 74 61 20 7b 7d 0a  ay set delta {}.
4c10: 09 61 72 72 61 79 20 73 65 74 20 73 74 61 6d 70  .array set stamp
4c20: 20 7b 7d 0a 0a 09 73 65 74 20 74 68 65 73 65 74   {}...set theset
4c30: 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69   ('[join $revisi
4c40: 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66 6f  ons {','}]')..fo
4c50: 72 65 61 63 68 20 7b 72 69 64 20 74 69 6d 65 7d  reach {rid time}
4c60: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20   [state run ".. 
4c70: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c     SELECT R.rid,
4c80: 20 52 2e 64 61 74 65 0a 09 20 20 20 20 46 52 4f   R.date..    FRO
4c90: 4d 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20  M revision R..  
4ca0: 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 49 4e    WHERE R.rid IN
4cb0: 20 24 74 68 65 73 65 74 0a 09 22 5d 20 7b 0a 09   $theset.."] {..
4cc0: 20 20 20 20 73 65 74 20 73 74 61 6d 70 28 24 72      set stamp($r
4cd0: 69 64 29 20 24 74 69 6d 65 0a 09 7d 0a 0a 09 73  id) $time..}...s
4ce0: 65 74 20 6e 20 30 0a 09 66 6f 72 65 61 63 68 20  et n 0..foreach 
4cf0: 72 69 64 20 5b 6c 72 61 6e 67 65 20 24 72 65 76  rid [lrange $rev
4d00: 69 73 69 6f 6e 73 20 30 20 65 6e 64 2d 31 5d 20  isions 0 end-1] 
4d10: 72 6e 65 78 74 20 5b 6c 72 61 6e 67 65 20 24 72  rnext [lrange $r
4d20: 65 76 69 73 69 6f 6e 73 20 31 20 65 6e 64 5d 20  evisions 1 end] 
4d30: 7b 0a 09 20 20 20 20 73 65 74 20 64 65 6c 74 61  {..    set delta
4d40: 28 24 6e 29 20 5b 65 78 70 72 20 7b 24 73 74 61  ($n) [expr {$sta
4d50: 6d 70 28 24 72 6e 65 78 74 29 20 2d 20 24 73 74  mp($rnext) - $st
4d60: 61 6d 70 28 24 72 69 64 29 7d 5d 0a 09 20 20 20  amp($rid)}]..   
4d70: 20 69 6e 63 72 20 6e 0a 09 7d 0a 09 72 65 74 75   incr n..}..retu
4d80: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72  rn.    }..    pr
4d90: 6f 63 20 46 69 6e 64 42 65 73 74 42 72 65 61 6b  oc FindBestBreak
4da0: 20 7b 72 61 6e 67 65 7d 20 7b 0a 09 75 70 76 61   {range} {..upva
4db0: 72 20 31 20 63 72 6f 73 73 20 63 72 6f 73 73 20  r 1 cross cross 
4dc0: 64 65 6c 74 61 20 64 65 6c 74 61 0a 0a 09 23 20  delta delta...# 
4dd0: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65  Determine the be
4de0: 73 74 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f  st break locatio
4df0: 6e 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 72  n in the given r
4e00: 61 6e 67 65 20 6f 66 0a 09 23 20 70 6f 73 69 74  ange of..# posit
4e10: 69 6f 6e 73 2e 20 46 69 72 73 74 20 77 65 20 6c  ions. First we l
4e20: 6f 6f 6b 20 66 6f 72 20 74 68 65 20 6c 6f 63 61  ook for the loca
4e30: 74 69 6f 6e 73 20 77 69 74 68 20 74 68 65 20 6d  tions with the m
4e40: 61 78 69 6d 61 6c 0a 09 23 20 6e 75 6d 62 65 72  aximal..# number
4e50: 20 6f 66 20 63 72 6f 73 73 69 6e 67 73 2e 20 49   of crossings. I
4e60: 66 20 74 68 65 72 65 20 61 72 65 20 73 65 76 65  f there are seve
4e70: 72 61 6c 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20  ral we look for 
4e80: 74 68 65 0a 09 23 20 73 68 6f 72 74 65 73 74 20  the..# shortest 
4e90: 74 69 6d 65 20 69 6e 74 65 72 76 61 6c 20 61 6d  time interval am
4ea0: 6f 6e 67 20 74 68 65 6d 2e 20 49 66 20 77 65 20  ong them. If we 
4eb0: 73 74 69 6c 6c 20 68 61 76 65 20 6d 75 6c 74 69  still have multi
4ec0: 70 6c 65 0a 09 23 20 70 6f 73 73 69 62 69 6c 69  ple..# possibili
4ed0: 74 69 65 73 20 61 66 74 65 72 20 74 68 61 74 20  ties after that 
4ee0: 77 65 20 73 65 6c 65 63 74 20 74 68 65 20 65 61  we select the ea
4ef0: 72 6c 69 65 73 74 20 6c 6f 63 61 74 69 6f 6e 0a  rliest location.
4f00: 09 23 20 61 6d 6f 6e 67 20 74 68 65 73 65 2e 0a  .# among these..
4f10: 0a 09 23 20 4e 6f 74 65 3a 20 49 66 20 74 68 65  ..# Note: If the
4f20: 20 6d 61 78 69 6d 61 6c 20 6e 75 6d 62 65 72 20   maximal number 
4f30: 6f 66 20 63 72 6f 73 73 69 6e 67 73 20 69 73 20  of crossings is 
4f40: 30 20 74 68 65 6e 20 74 68 65 20 72 61 6e 67 65  0 then the range
4f50: 0a 09 23 20 20 20 20 20 20 20 68 61 73 20 6e 6f  ..#       has no
4f60: 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64   internal depend
4f70: 65 6e 63 69 65 73 2c 20 61 6e 64 20 6e 6f 20 62  encies, and no b
4f80: 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 61 74  reak location at
4f90: 0a 09 23 20 20 20 20 20 20 20 61 6c 6c 2e 20 54  ..#       all. T
4fa0: 68 69 73 20 70 6f 73 73 69 62 69 6c 69 74 79 20  his possibility 
4fb0: 69 73 20 73 69 67 6e 61 6c 65 64 20 76 69 61 20  is signaled via 
4fc0: 72 65 73 75 6c 74 20 2d 31 2e 0a 0a 09 23 20 4e  result -1....# N
4fd0: 6f 74 65 3a 20 41 20 72 61 6e 67 65 20 6f 66 20  ote: A range of 
4fe0: 6c 65 6e 67 74 68 20 31 20 6f 72 20 6c 65 73 73  length 1 or less
4ff0: 20 63 61 6e 6e 6f 74 20 68 61 76 65 20 69 6e 74   cannot have int
5000: 65 72 6e 61 6c 0a 09 23 20 20 20 20 20 20 20 64  ernal..#       d
5010: 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 20  ependencies, as 
5020: 74 68 61 74 20 6e 65 65 64 73 20 61 74 20 6c 65  that needs at le
5030: 61 73 74 20 74 77 6f 20 72 65 76 69 73 69 6f 6e  ast two revision
5040: 73 20 69 6e 0a 09 23 20 20 20 20 20 20 20 74 68  s in..#       th
5050: 65 20 72 61 6e 67 65 2e 0a 0a 09 69 66 20 7b 5b  e range....if {[
5060: 6c 6c 65 6e 67 74 68 20 24 72 61 6e 67 65 5d 20  llength $range] 
5070: 3c 20 32 7d 20 7b 20 72 65 74 75 72 6e 20 2d 31  < 2} { return -1
5080: 20 7d 0a 0a 09 73 65 74 20 6d 61 78 20 2d 31 0a   }...set max -1.
5090: 09 73 65 74 20 62 65 73 74 20 7b 7d 0a 0a 09 66  .set best {}...f
50a0: 6f 72 65 61 63 68 20 6c 6f 63 61 74 69 6f 6e 20  oreach location 
50b0: 24 72 61 6e 67 65 20 7b 0a 09 20 20 20 20 73 65  $range {..    se
50c0: 74 20 63 72 6f 73 73 69 6e 67 73 20 24 63 72 6f  t crossings $cro
50d0: 73 73 28 24 6c 6f 63 61 74 69 6f 6e 29 0a 09 20  ss($location).. 
50e0: 20 20 20 69 66 20 7b 24 63 72 6f 73 73 69 6e 67     if {$crossing
50f0: 73 20 3e 20 24 6d 61 78 7d 20 7b 0a 09 09 73 65  s > $max} {...se
5100: 74 20 6d 61 78 20 20 24 63 72 6f 73 73 69 6e 67  t max  $crossing
5110: 73 0a 09 09 73 65 74 20 62 65 73 74 20 5b 6c 69  s...set best [li
5120: 73 74 20 24 6c 6f 63 61 74 69 6f 6e 5d 0a 09 09  st $location]...
5130: 63 6f 6e 74 69 6e 75 65 0a 09 20 20 20 20 7d 20  continue..    } 
5140: 65 6c 73 65 69 66 20 7b 24 63 72 6f 73 73 69 6e  elseif {$crossin
5150: 67 73 20 3d 3d 20 24 6d 61 78 7d 20 7b 0a 09 09  gs == $max} {...
5160: 6c 61 70 70 65 6e 64 20 62 65 73 74 20 24 6c 6f  lappend best $lo
5170: 63 61 74 69 6f 6e 0a 09 20 20 20 20 7d 0a 09 7d  cation..    }..}
5180: 0a 0a 09 69 66 20 7b 24 6d 61 78 20 3d 3d 20 30  ...if {$max == 0
5190: 7d 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 72  }            { r
51a0: 65 74 75 72 6e 20 2d 31 20 7d 0a 09 69 66 20 7b  eturn -1 }..if {
51b0: 5b 6c 6c 65 6e 67 74 68 20 24 62 65 73 74 5d 20  [llength $best] 
51c0: 3d 3d 20 31 7d 20 7b 20 72 65 74 75 72 6e 20 5b  == 1} { return [
51d0: 6c 69 6e 64 65 78 20 24 62 65 73 74 20 30 5d 20  lindex $best 0] 
51e0: 7d 0a 0a 09 73 65 74 20 6c 6f 63 61 74 69 6f 6e  }...set location
51f0: 73 20 24 62 65 73 74 0a 09 73 65 74 20 62 65 73  s $best..set bes
5200: 74 20 7b 7d 0a 09 73 65 74 20 6d 69 6e 20 2d 31  t {}..set min -1
5210: 0a 0a 09 66 6f 72 65 61 63 68 20 6c 6f 63 61 74  ...foreach locat
5220: 69 6f 6e 20 24 6c 6f 63 61 74 69 6f 6e 73 20 7b  ion $locations {
5230: 0a 09 20 20 20 20 73 65 74 20 69 6e 74 65 72 76  ..    set interv
5240: 61 6c 20 24 64 65 6c 74 61 28 24 6c 6f 63 61 74  al $delta($locat
5250: 69 6f 6e 29 0a 09 20 20 20 20 69 66 20 7b 28 24  ion)..    if {($
5260: 6d 69 6e 20 3c 20 30 29 20 7c 7c 20 28 24 69 6e  min < 0) || ($in
5270: 74 65 72 76 61 6c 20 3c 20 24 6d 69 6e 29 7d 20  terval < $min)} 
5280: 7b 0a 09 09 73 65 74 20 6d 69 6e 20 20 24 69 6e  {...set min  $in
5290: 74 65 72 76 61 6c 0a 09 09 73 65 74 20 62 65 73  terval...set bes
52a0: 74 20 5b 6c 69 73 74 20 24 6c 6f 63 61 74 69 6f  t [list $locatio
52b0: 6e 5d 0a 09 20 20 20 20 7d 20 65 6c 73 65 69 66  n]..    } elseif
52c0: 20 7b 24 69 6e 74 65 72 76 61 6c 20 3d 3d 20 24   {$interval == $
52d0: 6d 69 6e 7d 20 7b 0a 09 09 6c 61 70 70 65 6e 64  min} {...lappend
52e0: 20 62 65 73 74 20 24 6c 6f 63 61 74 69 6f 6e 0a   best $location.
52f0: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b  .    }..}...if {
5300: 5b 6c 6c 65 6e 67 74 68 20 24 62 65 73 74 5d 20  [llength $best] 
5310: 3d 3d 20 31 7d 20 7b 20 72 65 74 75 72 6e 20 5b  == 1} { return [
5320: 6c 69 6e 64 65 78 20 24 62 65 73 74 20 30 5d 20  lindex $best 0] 
5330: 7d 0a 0a 09 72 65 74 75 72 6e 20 5b 6c 69 6e 64  }...return [lind
5340: 65 78 20 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 67  ex [lsort -integ
5350: 65 72 20 2d 69 6e 63 72 65 61 73 69 6e 67 20 24  er -increasing $
5360: 62 65 73 74 5d 20 30 5d 0a 20 20 20 20 7d 0a 0a  best] 0].    }..
5370: 20 20 20 20 70 72 6f 63 20 43 75 74 41 74 20 7b      proc CutAt {
5380: 6c 6f 63 61 74 69 6f 6e 7d 20 7b 0a 09 75 70 76  location} {..upv
5390: 61 72 20 31 20 63 72 6f 73 73 20 63 72 6f 73 73  ar 1 cross cross
53a0: 20 64 65 70 63 20 64 65 70 63 0a 0a 09 23 20 49   depc depc...# I
53b0: 74 20 77 61 73 20 64 65 63 69 64 65 64 20 74 6f  t was decided to
53c0: 20 73 70 6c 69 74 20 74 68 65 20 63 68 61 6e 67   split the chang
53d0: 65 73 65 74 20 61 74 20 74 68 65 20 67 69 76 65  eset at the give
53e0: 6e 0a 09 23 20 6c 6f 63 61 74 69 6f 6e 2e 20 54  n..# location. T
53f0: 68 69 73 20 63 75 74 73 20 61 20 6e 75 6d 62 65  his cuts a numbe
5400: 72 20 6f 66 20 64 65 70 65 6e 64 65 6e 63 69 65  r of dependencie
5410: 73 2e 20 48 65 72 65 20 77 65 20 75 70 64 61 74  s. Here we updat
5420: 65 0a 09 23 20 74 68 65 20 63 72 6f 73 73 20 69  e..# the cross i
5430: 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
5440: 61 74 20 74 68 65 20 62 72 65 61 6b 20 66 69 6e  at the break fin
5450: 64 65 72 20 68 61 73 20 61 63 63 75 72 61 74 65  der has accurate
5460: 0a 09 23 20 64 61 74 61 20 77 68 65 6e 20 77 65  ..# data when we
5470: 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20 67 65 6e   look at the gen
5480: 65 72 61 74 65 64 20 66 72 61 67 6d 65 6e 74 73  erated fragments
5490: 2e 0a 0a 09 73 65 74 20 73 69 78 20 5b 6c 6f 67  ....set six [log
54a0: 20 76 69 73 69 62 6c 65 3f 20 36 5d 0a 0a 09 66   visible? 6]...f
54b0: 6f 72 65 61 63 68 20 7b 64 65 70 20 72 61 6e 67  oreach {dep rang
54c0: 65 7d 20 5b 61 72 72 61 79 20 67 65 74 20 64 65  e} [array get de
54d0: 70 63 5d 20 7b 0a 09 20 20 20 20 23 20 43 68 65  pc] {..    # Che
54e0: 63 6b 20 61 6c 6c 20 64 65 70 65 6e 64 65 6e 63  ck all dependenc
54f0: 69 65 73 20 73 74 69 6c 6c 20 6b 6e 6f 77 6e 2c  ies still known,
5500: 20 74 61 6b 65 20 74 68 65 69 72 20 72 61 6e 67   take their rang
5510: 65 20 61 6e 64 0a 09 20 20 20 20 23 20 73 65 65  e and..    # see
5520: 20 69 66 20 74 68 65 20 62 72 65 61 6b 20 6c 6f   if the break lo
5530: 63 61 74 69 6f 6e 20 66 61 6c 6c 73 20 77 69 74  cation falls wit
5540: 68 69 6e 2e 0a 0a 09 20 20 20 20 42 6f 72 64 65  hin....    Borde
5550: 72 20 24 72 61 6e 67 65 20 73 20 65 0a 09 20 20  r $range s e..  
5560: 20 20 69 66 20 7b 24 6c 6f 63 61 74 69 6f 6e 20    if {$location 
5570: 3c 20 24 73 7d 20 63 6f 6e 74 69 6e 75 65 20 3b  < $s} continue ;
5580: 20 23 20 62 72 65 61 6b 20 62 65 66 6f 72 65 20   # break before 
5590: 72 61 6e 67 65 2c 20 69 67 6e 6f 72 65 0a 09 20  range, ignore.. 
55a0: 20 20 20 69 66 20 7b 24 6c 6f 63 61 74 69 6f 6e     if {$location
55b0: 20 3e 20 24 65 7d 20 63 6f 6e 74 69 6e 75 65 20   > $e} continue 
55c0: 3b 20 23 20 62 72 65 61 6b 20 61 66 74 65 72 20  ; # break after 
55d0: 72 61 6e 67 65 2c 20 69 67 6e 6f 72 65 2e 0a 0a  range, ignore...
55e0: 09 20 20 20 20 23 20 54 68 69 73 20 64 65 70 65  .    # This depe
55f0: 6e 64 65 6e 63 79 20 63 72 6f 73 73 65 73 20 74  ndency crosses t
5600: 68 65 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f  he break locatio
5610: 6e 2e 20 57 65 20 72 65 6d 6f 76 65 20 69 74 0a  n. We remove it.
5620: 09 20 20 20 20 23 20 66 72 6f 6d 20 74 68 65 20  .    # from the 
5630: 63 72 6f 73 73 69 6e 67 73 20 63 6f 75 6e 74 65  crossings counte
5640: 72 73 2c 20 61 6e 64 20 74 68 65 6e 20 61 6c 73  rs, and then als
5650: 6f 20 66 72 6f 6d 20 74 68 65 20 73 65 74 0a 09  o from the set..
5660: 20 20 20 20 23 20 6f 66 20 6b 6e 6f 77 6e 20 64      # of known d
5670: 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 20  ependencies, as 
5680: 77 65 20 61 72 65 20 64 6f 6e 65 20 77 69 74 68  we are done with
5690: 20 69 74 2e 0a 0a 09 20 20 20 20 66 6f 72 65 61   it....    forea
56a0: 63 68 20 6c 6f 63 20 24 64 65 70 63 28 24 64 65  ch loc $depc($de
56b0: 70 29 20 7b 20 69 6e 63 72 20 63 72 6f 73 73 28  p) { incr cross(
56c0: 24 6c 6f 63 29 20 2d 31 20 7d 0a 09 20 20 20 20  $loc) -1 }..    
56d0: 75 6e 73 65 74 20 64 65 70 63 28 24 64 65 70 29  unset depc($dep)
56e0: 0a 0a 09 20 20 20 20 69 66 20 7b 21 24 73 69 78  ...    if {!$six
56f0: 7d 20 63 6f 6e 74 69 6e 75 65 0a 0a 09 20 20 20  } continue...   
5700: 20 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73   struct::list as
5710: 73 69 67 6e 20 24 64 65 70 20 70 61 72 65 6e 74  sign $dep parent
5720: 20 63 68 69 6c 64 0a 09 20 20 20 20 6c 6f 67 20   child..    log 
5730: 77 72 69 74 65 20 35 20 63 73 65 74 73 20 22 42  write 5 csets "B
5740: 72 6f 6b 65 20 64 65 70 65 6e 64 65 6e 63 79 20  roke dependency 
5750: 5b 50 44 20 24 70 61 72 65 6e 74 5d 20 2d 2d 3e  [PD $parent] -->
5760: 20 5b 50 44 20 24 63 68 69 6c 64 5d 22 0a 09 7d   [PD $child]"..}
5770: 0a 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  ...return.    }.
5780: 0a 20 20 20 20 23 20 50 72 69 6e 74 20 69 64 65  .    # Print ide
5790: 6e 74 69 66 79 69 6e 67 20 64 61 74 61 20 66 6f  ntifying data fo
57a0: 72 20 61 20 72 65 76 69 73 69 6f 6e 20 28 70 72  r a revision (pr
57b0: 6f 6a 65 63 74 2c 20 66 69 6c 65 2c 20 64 6f 74  oject, file, dot
57c0: 74 65 64 20 72 65 76 0a 20 20 20 20 23 20 6e 75  ted rev.    # nu
57d0: 6d 62 65 72 29 2c 20 66 6f 72 20 68 69 67 68 20  mber), for high 
57e0: 76 65 72 62 6f 73 69 74 79 20 6c 6f 67 20 6f 75  verbosity log ou
57f0: 74 70 75 74 2e 0a 20 20 20 20 23 20 54 4f 44 4f  tput..    # TODO
5800: 3a 20 52 65 70 6c 61 63 65 20 77 69 74 68 20 63  : Replace with c
5810: 61 6c 6c 20 74 6f 20 69 74 65 6d 73 74 72 20 28  all to itemstr (
5820: 6c 69 73 74 20 72 65 76 20 24 69 64 29 0a 0a 20  list rev $id).. 
5830: 20 20 20 70 72 6f 63 20 50 44 20 7b 69 64 7d 20     proc PD {id} 
5840: 7b 0a 09 66 6f 72 65 61 63 68 20 7b 70 20 66 20  {..foreach {p f 
5850: 72 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a  r} [state run {.
5860: 09 09 53 45 4c 45 43 54 20 50 2e 6e 61 6d 65 20  ..SELECT P.name 
5870: 2c 20 46 2e 6e 61 6d 65 2c 20 52 2e 72 65 76 0a  , F.name, R.rev.
5880: 09 09 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20  ..FROM revision 
5890: 52 2c 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65  R, file F, proje
58a0: 63 74 20 50 0a 09 09 57 48 45 52 45 20 52 2e 72  ct P...WHERE R.r
58b0: 69 64 20 3d 20 24 69 64 0a 09 09 41 4e 44 20 20  id = $id...AND  
58c0: 20 46 2e 66 69 64 20 3d 20 52 2e 66 69 64 0a 09   F.fid = R.fid..
58d0: 09 41 4e 44 20 20 20 50 2e 70 69 64 20 3d 20 46  .AND   P.pid = F
58e0: 2e 70 69 64 0a 09 7d 5d 20 62 72 65 61 6b 0a 09  .pid..}] break..
58f0: 72 65 74 75 72 6e 20 22 27 24 70 20 3a 20 24 66  return "'$p : $f
5900: 2f 24 72 27 22 0a 20 20 20 20 7d 0a 0a 20 20 20  /$r'".    }..   
5910: 20 23 20 50 72 69 6e 74 69 6e 67 20 6f 6e 65 20   # Printing one 
5920: 6f 72 20 6d 6f 72 65 20 72 61 6e 67 65 73 2c 20  or more ranges, 
5930: 66 6f 72 6d 61 74 74 65 64 2c 20 61 6e 64 20 6f  formatted, and o
5940: 6e 6c 79 20 74 68 65 69 72 20 62 6f 72 64 65 72  nly their border
5950: 20 74 6f 0a 20 20 20 20 23 20 6b 65 65 70 20 74   to.    # keep t
5960: 68 65 20 73 74 72 69 6e 67 73 20 73 68 6f 72 74  he strings short
5970: 2e 0a 0a 20 20 20 20 70 72 6f 63 20 50 52 73 20  ...    proc PRs 
5980: 7b 72 61 6e 67 65 73 7d 20 7b 0a 09 72 65 74 75  {ranges} {..retu
5990: 72 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74  rn [struct::list
59a0: 20 6d 61 70 20 24 72 61 6e 67 65 73 20 5b 6d 79   map $ranges [my
59b0: 70 72 6f 63 20 50 52 5d 5d 0a 20 20 20 20 7d 0a  proc PR]].    }.
59c0: 0a 20 20 20 20 70 72 6f 63 20 50 52 20 7b 72 61  .    proc PR {ra
59d0: 6e 67 65 7d 20 7b 0a 09 42 6f 72 64 65 72 20 24  nge} {..Border $
59e0: 72 61 6e 67 65 20 73 20 65 0a 09 72 65 74 75 72  range s e..retur
59f0: 6e 20 3c 24 7b 73 7d 2e 2e 2e 24 7b 65 7d 3e 0a  n <${s}...${e}>.
5a00: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20      }..    proc 
5a10: 42 6f 72 64 65 72 20 7b 72 61 6e 67 65 20 73 76  Border {range sv
5a20: 20 65 76 7d 20 7b 0a 09 75 70 76 61 72 20 31 20   ev} {..upvar 1 
5a30: 24 73 76 20 73 20 24 65 76 20 65 0a 09 73 65 74  $sv s $ev e..set
5a40: 20 73 20 5b 6c 69 6e 64 65 78 20 24 72 61 6e 67   s [lindex $rang
5a50: 65 20 30 5d 0a 09 73 65 74 20 65 20 5b 6c 69 6e  e 0]..set e [lin
5a60: 64 65 78 20 24 72 61 6e 67 65 20 65 6e 64 5d 0a  dex $range end].
5a70: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
5a80: 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23     # # ## ### ##
5a90: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23  ### ######## ###
5aa0: 23 23 23 23 23 23 23 23 23 23 0a 0a 20 20 20 20  ##########..    
5ab0: 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63  typevariable myc
5ac0: 68 61 6e 67 65 73 65 74 73 20 20 20 20 20 7b 7d  hangesets     {}
5ad0: 20 3b 20 23 20 4c 69 73 74 20 6f 66 20 61 6c 6c   ; # List of all
5ae0: 20 6b 6e 6f 77 6e 20 63 68 61 6e 67 65 73 65 74   known changeset
5af0: 73 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69 61  s..    typevaria
5b00: 62 6c 65 20 6d 79 69 74 65 6d 6d 61 70 20 2d 61  ble myitemmap -a
5b10: 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20  rray {} ; # Map 
5b20: 66 72 6f 6d 20 69 74 65 6d 73 20 28 74 61 67 67  from items (tagg
5b30: 65 64 29 20 74 6f 0a 09 09 09 09 20 20 20 20 20  ed) to.....     
5b40: 20 20 23 20 74 68 65 20 6c 69 73 74 20 6f 66 20    # the list of 
5b50: 63 68 61 6e 67 65 73 65 74 73 0a 09 09 09 09 20  changesets..... 
5b60: 20 20 20 20 20 20 23 20 63 6f 6e 74 61 69 6e 69        # containi
5b70: 6e 67 20 69 74 2e 20 45 61 63 68 20 69 74 65 6d  ng it. Each item
5b80: 20 63 61 6e 0a 09 09 09 09 20 20 20 20 20 20 20   can.....       
5b90: 23 20 62 65 20 75 73 65 64 20 62 79 20 6f 6e 6c  # be used by onl
5ba0: 79 20 6f 6e 65 0a 09 09 09 09 20 20 20 20 20 20  y one.....      
5bb0: 20 23 20 63 68 61 6e 67 65 73 65 74 2e 0a 20 20   # changeset..  
5bc0: 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d    typevariable m
5bd0: 79 69 64 6d 61 70 20 20 20 2d 61 72 72 61 79 20  yidmap   -array 
5be0: 7b 7d 20 3b 20 23 20 4d 61 70 20 66 72 6f 6d 20  {} ; # Map from 
5bf0: 63 68 61 6e 67 65 73 65 74 20 69 64 20 74 6f 0a  changeset id to.
5c00: 09 09 09 09 20 20 20 20 20 20 20 23 20 63 68 61  ....       # cha
5c10: 6e 67 65 73 65 74 2e 0a 0a 20 20 20 20 74 79 70  ngeset...    typ
5c20: 65 6d 65 74 68 6f 64 20 61 6c 6c 20 20 20 20 7b  emethod all    {
5c30: 7d 20 20 20 20 7b 20 72 65 74 75 72 6e 20 24 6d  }    { return $m
5c40: 79 63 68 61 6e 67 65 73 65 74 73 20 7d 0a 20 20  ychangesets }.  
5c50: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6f 66 20    typemethod of 
5c60: 20 20 20 20 7b 63 69 64 7d 20 7b 20 72 65 74 75      {cid} { retu
5c70: 72 6e 20 24 6d 79 69 64 6d 61 70 28 24 63 69 64  rn $myidmap($cid
5c80: 29 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68  ) }.    typemeth
5c90: 6f 64 20 6f 66 69 74 65 6d 20 7b 69 69 64 7d 20  od ofitem {iid} 
5ca0: 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 74 65 6d  { return $myitem
5cb0: 6d 61 70 28 24 69 69 64 29 20 7d 0a 0a 20 20 20  map($iid) }..   
5cc0: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23   # # ## ### ####
5cd0: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
5ce0: 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20  ########.    ## 
5cf0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a 20  Configuration.. 
5d00: 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79     pragma -hasty
5d10: 70 65 69 6e 66 6f 20 20 20 20 6e 6f 20 20 3b 20  peinfo    no  ; 
5d20: 23 20 6e 6f 20 74 79 70 65 20 69 6e 74 72 6f 73  # no type intros
5d30: 70 65 63 74 69 6f 6e 0a 20 20 20 20 70 72 61 67  pection.    prag
5d40: 6d 61 20 2d 68 61 73 69 6e 66 6f 20 20 20 20 20  ma -hasinfo     
5d50: 20 20 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 6f 62     no  ; # no ob
5d60: 6a 65 63 74 20 69 6e 74 72 6f 73 70 65 63 74 69  ject introspecti
5d70: 6f 6e 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23  on..    # # ## #
5d80: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
5d90: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  # #############.
5da0: 7d 0a 0a 23 23 0a 23 23 20 4e 4f 54 45 3a 20 54  }..##.## NOTE: T
5db0: 68 65 20 73 75 63 63 65 73 73 6f 72 20 61 6e 64  he successor and
5dc0: 20 70 72 65 64 65 63 65 73 73 6f 72 20 6d 65 74   predecessor met
5dd0: 68 6f 64 73 20 64 65 66 69 6e 65 64 20 62 79 20  hods defined by 
5de0: 74 68 65 20 63 6c 61 73 73 65 73 0a 23 23 20 20  the classes.##  
5df0: 20 20 20 20 20 62 65 6c 6f 77 20 61 72 65 20 2d       below are -
5e00: 2d 20 62 6f 74 74 6c 65 20 6e 65 63 6b 73 20 2d  - bottle necks -
5e10: 2d 2e 20 4c 6f 6f 6b 20 66 6f 72 20 77 61 79 73  -. Look for ways
5e20: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 53 51 4c   to make the SQL
5e30: 0a 23 23 20 20 20 20 20 20 20 66 61 73 74 65 72  .##       faster
5e40: 2e 0a 23 23 0a 0a 23 20 23 20 23 23 20 23 23 23  ..##..# # ## ###
5e50: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20   ##### ######## 
5e60: 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23  ############# ##
5e70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
5e80: 23 23 23 0a 23 23 20 48 65 6c 70 65 72 20 73 69  ###.## Helper si
5e90: 6e 67 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64  ngleton. Command
5ea0: 73 20 66 6f 72 20 72 65 76 69 73 69 6f 6e 20 63  s for revision c
5eb0: 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e 69 74  hangesets...snit
5ec0: 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f 73  ::type ::vc::fos
5ed0: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73  sil::import::cvs
5ee0: 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a  ::project::rev::
5ef0: 72 65 76 20 7b 0a 20 20 20 20 74 79 70 65 6d 65  rev {.    typeme
5f00: 74 68 6f 64 20 62 79 72 65 76 69 73 69 6f 6e 20  thod byrevision 
5f10: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a  {} { return 1 }.
5f20: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62      typemethod b
5f30: 79 73 79 6d 62 6f 6c 20 20 20 7b 7d 20 7b 20 72  ysymbol   {} { r
5f40: 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79  eturn 0 }.    ty
5f50: 70 65 6d 65 74 68 6f 64 20 69 73 74 61 67 20 20  pemethod istag  
5f60: 20 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20      {} { return 
5f70: 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68  0 }.    typemeth
5f80: 6f 64 20 69 73 62 72 61 6e 63 68 20 20 20 7b 7d  od isbranch   {}
5f90: 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 0a 20   { return 0 }.. 
5fa0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 73 74     typemethod st
5fb0: 72 20 7b 72 65 76 69 73 69 6f 6e 7d 20 7b 0a 09  r {revision} {..
5fc0: 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73  struct::list ass
5fd0: 69 67 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 7b  ign [state run {
5fe0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
5ff0: 65 76 2c 20 46 2e 6e 61 6d 65 2c 20 50 2e 6e 61  ev, F.name, P.na
6000: 6d 65 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72  me..    FROM   r
6010: 65 76 69 73 69 6f 6e 20 52 2c 20 66 69 6c 65 20  evision R, file 
6020: 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09 20 20  F, project P..  
6030: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 3d    WHERE  R.rid =
6040: 20 24 72 65 76 69 73 69 6f 6e 0a 09 20 20 20 20   $revision..    
6050: 41 4e 44 20 20 20 20 46 2e 66 69 64 20 3d 20 52  AND    F.fid = R
6060: 2e 66 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20  .fid..    AND   
6070: 20 50 2e 70 69 64 20 3d 20 46 2e 70 69 64 0a 09   P.pid = F.pid..
6080: 7d 5d 20 72 65 76 6e 72 20 66 6e 61 6d 65 20 70  }] revnr fname p
6090: 6e 61 6d 65 0a 09 72 65 74 75 72 6e 20 22 24 70  name..return "$p
60a0: 6e 61 6d 65 2f 24 7b 72 65 76 6e 72 7d 3a 3a 24  name/${revnr}::$
60b0: 66 6e 61 6d 65 22 0a 20 20 20 20 7d 0a 0a 20 20  fname".    }..  
60c0: 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73    # result = lis
60d0: 74 20 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74  t (mintime, maxt
60e0: 69 6d 65 29 0a 20 20 20 20 74 79 70 65 6d 65 74  ime).    typemet
60f0: 68 6f 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 69  hod timerange {i
6100: 74 65 6d 73 7d 20 7b 0a 09 73 65 74 20 74 68 65  tems} {..set the
6110: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 69 74 65  set ('[join $ite
6120: 6d 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74  ms {','}]')..ret
6130: 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 22  urn [state run "
6140: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 4d 49 4e  ..    SELECT MIN
6150: 28 52 2e 64 61 74 65 29 2c 20 4d 41 58 28 52 2e  (R.date), MAX(R.
6160: 64 61 74 65 29 0a 09 20 20 20 20 46 52 4f 4d 20  date)..    FROM 
6170: 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20  revision R..    
6180: 57 48 45 52 45 20 52 2e 72 69 64 20 49 4e 20 24  WHERE R.rid IN $
6190: 74 68 65 73 65 74 0a 09 22 5d 0a 20 20 20 20 7d  theset.."].    }
61a0: 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76 29 20  ..    # var(dv) 
61b0: 3d 20 64 69 63 74 20 28 72 65 76 69 73 69 6f 6e  = dict (revision
61c0: 20 2d 3e 20 6c 69 73 74 20 28 72 65 76 69 73 69   -> list (revisi
61d0: 6f 6e 29 29 0a 20 20 20 20 74 79 70 65 6d 65 74  on)).    typemet
61e0: 68 6f 64 20 69 6e 74 65 72 6e 61 6c 73 75 63 63  hod internalsucc
61f0: 65 73 73 6f 72 73 20 7b 64 76 20 72 65 76 69 73  essors {dv revis
6200: 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31  ions} {..upvar 1
6210: 20 24 64 76 20 64 65 70 65 6e 64 65 6e 63 69 65   $dv dependencie
6220: 73 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27  s..set theset ('
6230: 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73  [join $revisions
6240: 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 23 20 53 65   {','}]')...# Se
6250: 65 20 27 73 75 63 63 65 73 73 6f 72 73 27 20 62  e 'successors' b
6260: 65 6c 6f 77 20 66 6f 72 20 74 68 65 20 6d 61 69  elow for the mai
6270: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
6280: 0a 09 23 20 74 68 65 20 76 61 72 69 6f 75 73 20  ..# the various 
6290: 63 61 73 65 73 2e 20 54 68 69 73 20 70 69 65 63  cases. This piec
62a0: 65 20 69 73 20 73 70 65 63 69 61 6c 20 69 6e 20  e is special in 
62b0: 74 68 61 74 20 69 74 0a 09 23 20 72 65 73 74 72  that it..# restr
62c0: 69 63 74 73 20 74 68 65 20 73 75 63 63 65 73 73  icts the success
62d0: 6f 72 73 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20  ors we look for 
62e0: 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 74 20  to the same set 
62f0: 6f 66 0a 09 23 20 72 65 76 69 73 69 6f 6e 73 20  of..# revisions 
6300: 77 65 20 73 74 61 72 74 20 66 72 6f 6d 2e 20 53  we start from. S
6310: 65 6e 73 69 62 6c 65 20 61 73 20 77 65 20 61 72  ensible as we ar
6320: 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 0a 09 23  e looking for..#
6330: 20 63 68 61 6e 67 65 73 65 74 20 69 6e 74 65 72   changeset inter
6340: 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73  nal dependencies
6350: 2e 0a 0a 09 61 72 72 61 79 20 73 65 74 20 64 65  ....array set de
6360: 70 20 7b 7d 0a 0a 09 66 6f 72 65 61 63 68 20 7b  p {}...foreach {
6370: 72 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74  rid child} [stat
6380: 65 20 72 75 6e 20 22 0a 20 20 20 2d 2d 20 28 31  e run ".   -- (1
6390: 29 20 50 72 69 6d 61 72 79 20 63 68 69 6c 64 0a  ) Primary child.
63a0: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69  .    SELECT R.ri
63b0: 64 2c 20 52 2e 63 68 69 6c 64 0a 09 20 20 20 20  d, R.child..    
63c0: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20  FROM   revision 
63d0: 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e  R..    WHERE  R.
63e0: 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74  rid   IN $theset
63f0: 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74       -- Restrict
6400: 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66   to revisions of
6410: 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41   interest..    A
6420: 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49 53  ND    R.child IS
6430: 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20   NOT NULL    -- 
6440: 48 61 73 20 70 72 69 6d 61 72 79 20 63 68 69 6c  Has primary chil
6450: 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e  d..    AND    R.
6460: 63 68 69 6c 64 20 49 4e 20 24 74 68 65 73 65 74  child IN $theset
6470: 20 20 20 20 20 2d 2d 20 57 68 69 63 68 20 69 73       -- Which is
6480: 20 61 6c 73 6f 20 6f 66 20 69 6e 74 65 72 65 73   also of interes
6490: 74 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20  t.    UNION.    
64a0: 2d 2d 20 28 32 29 20 53 65 63 6f 6e 64 61 72 79  -- (2) Secondary
64b0: 20 28 62 72 61 6e 63 68 29 20 63 68 69 6c 64 72   (branch) childr
64c0: 65 6e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52  en..    SELECT R
64d0: 2e 72 69 64 2c 20 42 2e 62 72 69 64 0a 09 20 20  .rid, B.brid..  
64e0: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f    FROM   revisio
64f0: 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 62 72 61  n R, revisionbra
6500: 6e 63 68 63 68 69 6c 64 72 65 6e 20 42 0a 09 20  nchchildren B.. 
6510: 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20     WHERE  R.rid 
6520: 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20    IN $theset    
6530: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
6540: 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74  revisions of int
6550: 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20  erest..    AND  
6560: 20 20 52 2e 72 69 64 20 3d 20 42 2e 72 69 64 20    R.rid = B.rid 
6570: 20 20 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65           -- Sele
6580: 63 74 20 73 75 62 73 65 74 20 6f 66 20 62 72 61  ct subset of bra
6590: 6e 63 68 20 63 68 69 6c 64 72 65 6e 0a 09 20 20  nch children..  
65a0: 20 20 41 4e 44 20 20 20 20 42 2e 62 72 69 64 20    AND    B.brid 
65b0: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 20  IN $theset      
65c0: 2d 2d 20 57 68 69 63 68 20 69 73 20 61 6c 73 6f  -- Which is also
65d0: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 20 20 20   of interest.   
65e0: 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 34   UNION.    -- (4
65f0: 29 20 43 68 69 6c 64 20 6f 66 20 74 72 75 6e 6b  ) Child of trunk
6600: 20 72 6f 6f 74 20 73 75 63 63 65 73 73 6f 72 20   root successor 
6610: 6f 66 20 6c 61 73 74 20 4e 54 44 42 20 6f 6e 20  of last NTDB on 
6620: 74 72 75 6e 6b 2e 0a 09 20 20 20 20 53 45 4c 45  trunk...    SELE
6630: 43 54 20 52 2e 72 69 64 2c 20 52 41 2e 63 68 69  CT R.rid, RA.chi
6640: 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76  ld..    FROM rev
6650: 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f  ision R, revisio
6660: 6e 20 52 41 0a 09 20 20 20 20 57 48 45 52 45 20  n RA..    WHERE 
6670: 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73  R.rid   IN $thes
6680: 65 74 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72  et      -- Restr
6690: 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73  ict to revisions
66a0: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20   of interest..  
66b0: 20 20 41 4e 44 20 20 20 52 2e 69 73 64 65 66 61    AND   R.isdefa
66c0: 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
66d0: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 4e  -- Restrict to N
66e0: 54 44 42 0a 09 20 20 20 20 41 4e 44 20 20 20 52  TDB..    AND   R
66f0: 2e 64 62 63 68 69 6c 64 20 49 53 20 4e 4f 54 20  .dbchild IS NOT 
6700: 4e 55 4c 4c 20 20 20 2d 2d 20 61 6e 64 20 6c 61  NULL   -- and la
6710: 73 74 20 4e 54 44 42 20 62 65 6c 6f 6e 67 69 6e  st NTDB belongin
6720: 67 20 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20  g to trunk..    
6730: 41 4e 44 20 20 20 52 41 2e 72 69 64 20 3d 20 52  AND   RA.rid = R
6740: 2e 64 62 63 68 69 6c 64 20 20 20 20 20 20 2d 2d  .dbchild      --
6750: 20 47 6f 20 64 69 72 65 63 74 6c 79 20 74 6f 20   Go directly to 
6760: 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 20  trunk root..    
6770: 41 4e 44 20 20 20 52 41 2e 63 68 69 6c 64 20 49  AND   RA.child I
6780: 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d  S NOT NULL    --
6790: 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 68 69   Has primary chi
67a0: 6c 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ld..            
67b0: 41 4e 44 20 20 20 52 41 2e 63 68 69 6c 64 20 49  AND   RA.child I
67c0: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d  N $theset     --
67d0: 20 57 68 69 63 68 20 69 73 20 61 6c 73 6f 20 6f   Which is also o
67e0: 66 20 69 6e 74 65 72 65 73 74 0a 09 22 5d 20 7b  f interest.."] {
67f0: 0a 09 20 20 20 20 23 20 43 6f 6e 73 69 64 65 72  ..    # Consider
6800: 20 6d 6f 76 69 6e 67 20 74 68 69 73 20 74 6f 20   moving this to 
6810: 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6d 6f  the integrity mo
6820: 64 75 6c 65 2e 0a 09 20 20 20 20 69 6e 74 65 67  dule...    integ
6830: 72 69 74 79 20 61 73 73 65 72 74 20 7b 24 72 69  rity assert {$ri
6840: 64 20 21 3d 20 24 63 68 69 6c 64 7d 20 7b 52 65  d != $child} {Re
6850: 76 69 73 69 6f 6e 20 24 72 69 64 20 64 65 70 65  vision $rid depe
6860: 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 2e 7d 0a  nds on itself.}.
6870: 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70  .    lappend dep
6880: 65 6e 64 65 6e 63 69 65 73 28 24 72 69 64 29 20  endencies($rid) 
6890: 24 63 68 69 6c 64 0a 09 20 20 20 20 73 65 74 20  $child..    set 
68a0: 64 65 70 28 24 72 69 64 2c 24 63 68 69 6c 64 29  dep($rid,$child)
68b0: 20 2e 0a 09 7d 0a 0a 09 23 20 54 68 65 20 73 71   ...}...# The sq
68c0: 6c 20 73 74 61 74 65 6d 65 6e 74 73 20 61 62 6f  l statements abo
68d0: 76 65 20 6c 6f 6f 6b 73 20 6f 6e 6c 79 20 66 6f  ve looks only fo
68e0: 72 20 64 69 72 65 63 74 20 64 65 70 65 6e 64 65  r direct depende
68f0: 6e 63 69 65 73 0a 09 23 20 62 65 74 77 65 65 6e  ncies..# between
6900: 20 72 65 76 69 73 69 6f 6e 20 69 6e 20 74 68 65   revision in the
6910: 20 63 68 61 6e 67 65 73 65 74 2e 20 48 6f 77 65   changeset. Howe
6920: 76 65 72 20 64 75 65 20 74 6f 20 74 68 65 0a 09  ver due to the..
6930: 23 20 76 61 67 61 72 69 65 73 20 6f 66 20 6d 65  # vagaries of me
6940: 74 61 20 64 61 74 61 20 69 74 20 69 73 20 70 6f  ta data it is po
6950: 73 73 69 62 6c 65 20 66 6f 72 20 74 77 6f 20 72  ssible for two r
6960: 65 76 69 73 69 6f 6e 73 20 6f 66 0a 09 23 20 74  evisions of..# t
6970: 68 65 20 73 61 6d 65 20 66 69 6c 65 20 74 6f 20  he same file to 
6980: 65 6e 64 20 75 70 20 69 6e 20 74 68 65 20 73 61  end up in the sa
6990: 6d 65 20 63 68 61 6e 67 65 73 65 74 2c 20 77 69  me changeset, wi
69a0: 74 68 6f 75 74 20 61 0a 09 23 20 64 69 72 65 63  thout a..# direc
69b0: 74 20 64 65 70 65 6e 64 65 6e 63 79 20 62 65 74  t dependency bet
69c0: 77 65 65 6e 20 74 68 65 6d 2e 20 48 6f 77 65 76  ween them. Howev
69d0: 65 72 20 77 65 20 6b 6e 6f 77 20 74 68 61 74 20  er we know that 
69e0: 74 68 65 72 65 0a 09 23 20 68 61 73 20 74 6f 20  there..# has to 
69f0: 62 65 20 61 20 61 6e 20 69 6e 64 69 72 65 63 74  be a an indirect
6a00: 20 64 65 70 65 6e 64 65 6e 63 79 2c 20 62 65 20   dependency, be 
6a10: 69 74 20 74 68 72 6f 75 67 68 20 70 72 69 6d 61  it through prima
6a20: 72 79 0a 09 23 20 63 68 69 6c 64 72 65 6e 2c 20  ry..# children, 
6a30: 62 72 61 6e 63 68 20 63 68 69 6c 64 72 65 6e 2c  branch children,
6a40: 20 6f 72 20 61 20 63 6f 6d 62 69 6e 61 74 69 6f   or a combinatio
6a50: 6e 20 74 68 65 72 65 6f 66 2e 0a 0a 09 23 20 57  n thereof....# W
6a60: 65 20 6e 6f 77 20 66 69 6c 6c 20 69 6e 20 74 68  e now fill in th
6a70: 65 73 65 20 70 73 65 75 64 6f 2d 64 65 70 65 6e  ese pseudo-depen
6a80: 64 65 6e 63 69 65 73 2c 20 69 66 20 6e 6f 20 73  dencies, if no s
6a90: 75 63 68 0a 09 23 20 64 65 70 65 6e 64 65 6e 63  uch..# dependenc
6aa0: 79 20 65 78 69 73 74 73 20 61 6c 72 65 61 64 79  y exists already
6ab0: 2e 20 54 68 65 20 64 69 72 65 63 74 69 6f 6e 20  . The direction 
6ac0: 6f 66 20 74 68 65 20 64 65 70 65 6e 64 65 6e 63  of the dependenc
6ad0: 79 0a 09 23 20 69 73 20 61 63 74 75 61 6c 6c 79  y..# is actually
6ae0: 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f 72 20   irrelevant for 
6af0: 74 68 69 73 2e 0a 0a 09 23 20 4e 4f 54 45 3a 20  this....# NOTE: 
6b00: 54 68 69 73 20 69 73 20 64 69 66 66 65 72 65 6e  This is differen
6b10: 74 20 66 72 6f 6d 20 63 76 73 32 73 76 6e 2e 20  t from cvs2svn. 
6b20: 4f 75 72 20 73 70 69 72 69 74 75 61 6c 20 61 6e  Our spiritual an
6b30: 63 65 73 74 6f 72 0a 09 23 20 64 6f 65 73 20 6e  cestor..# does n
6b40: 6f 74 20 75 73 65 20 73 75 63 68 20 70 73 65 75  ot use such pseu
6b50: 64 6f 2d 64 65 70 65 6e 64 65 6e 63 69 65 73 2c  do-dependencies,
6b60: 20 68 6f 77 65 76 65 72 20 69 74 20 75 73 65 73   however it uses
6b70: 20 61 0a 09 23 20 43 4f 4d 4d 49 54 5f 54 48 52   a..# COMMIT_THR
6b80: 45 53 48 4f 4c 44 2c 20 61 20 74 69 6d 65 20 69  ESHOLD, a time i
6b90: 6e 74 65 72 76 61 6c 20 63 6f 6d 6d 69 74 73 20  nterval commits 
6ba0: 73 68 6f 75 6c 64 20 66 61 6c 6c 2e 20 54 68 69  should fall. Thi
6bb0: 73 0a 09 23 20 77 69 6c 6c 20 67 72 65 61 74 6c  s..# will greatl
6bc0: 79 20 72 65 64 75 63 65 73 20 74 68 65 20 72 69  y reduces the ri
6bd0: 73 6b 20 6f 66 20 67 65 74 74 69 6e 67 20 66 61  sk of getting fa
6be0: 72 20 73 65 70 61 72 61 74 65 64 0a 09 23 20 72  r separated..# r
6bf0: 65 76 69 73 69 6f 6e 73 20 6f 66 20 74 68 65 20  evisions of the 
6c00: 73 61 6d 65 20 66 69 6c 65 20 69 6e 74 6f 20 6f  same file into o
6c10: 6e 65 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09  ne changeset....
6c20: 23 20 57 65 20 61 6c 6c 6f 77 20 72 65 76 69 73  # We allow revis
6c30: 69 6f 6e 73 20 74 6f 20 62 65 20 66 61 72 20 61  ions to be far a
6c40: 70 61 72 74 20 69 6e 20 74 69 6d 65 20 69 6e 20  part in time in 
6c50: 74 68 65 20 73 61 6d 65 0a 09 23 20 63 68 61 6e  the same..# chan
6c60: 67 65 73 65 74 2c 20 62 75 74 20 69 6e 20 74 75  geset, but in tu
6c70: 72 6e 20 6e 65 65 64 20 74 68 65 20 70 73 65 75  rn need the pseu
6c80: 64 6f 2d 64 65 70 65 6e 64 65 6e 63 69 65 73 20  do-dependencies 
6c90: 74 6f 0a 09 23 20 68 61 6e 64 6c 65 20 74 68 69  to..# handle thi
6ca0: 73 2e 0a 0a 09 61 72 72 61 79 20 73 65 74 20 66  s....array set f
6cb0: 69 64 73 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20  ids {}..foreach 
6cc0: 7b 72 69 64 20 66 69 64 7d 20 5b 73 74 61 74 65  {rid fid} [state
6cd0: 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45   run "..    SELE
6ce0: 43 54 20 52 2e 72 69 64 2c 20 52 2e 66 69 64 0a  CT R.rid, R.fid.
6cf0: 20 20 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d              FROM
6d00: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 20 20     revision R.  
6d10: 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 20            WHERE 
6d20: 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65   R.rid IN $these
6d30: 74 0a 09 22 5d 20 7b 20 6c 61 70 70 65 6e 64 20  t.."] { lappend 
6d40: 66 69 64 73 28 24 66 69 64 29 20 24 72 69 64 20  fids($fid) $rid 
6d50: 7d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 66 69 64  }...foreach {fid
6d60: 20 72 69 64 73 7d 20 5b 61 72 72 61 79 20 67 65   rids} [array ge
6d70: 74 20 66 69 64 73 5d 20 7b 0a 09 20 20 20 20 69  t fids] {..    i
6d80: 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 72 69 64  f {[llength $rid
6d90: 73 5d 20 3c 20 32 7d 20 63 6f 6e 74 69 6e 75 65  s] < 2} continue
6da0: 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 61 20  ..    foreach a 
6db0: 24 72 69 64 73 20 7b 0a 09 09 66 6f 72 65 61 63  $rids {...foreac
6dc0: 68 20 62 20 24 72 69 64 73 20 7b 0a 09 09 20 20  h b $rids {...  
6dd0: 20 20 69 66 20 7b 24 61 20 3d 3d 20 24 62 7d 20    if {$a == $b} 
6de0: 63 6f 6e 74 69 6e 75 65 0a 09 09 20 20 20 20 69  continue...    i
6df0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
6e00: 64 65 70 28 24 61 2c 24 62 29 5d 7d 20 63 6f 6e  dep($a,$b)]} con
6e10: 74 69 6e 75 65 0a 09 09 20 20 20 20 69 66 20 7b  tinue...    if {
6e20: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64 65 70  [info exists dep
6e30: 28 24 62 2c 24 61 29 5d 7d 20 63 6f 6e 74 69 6e  ($b,$a)]} contin
6e40: 75 65 0a 09 09 20 20 20 20 6c 61 70 70 65 6e 64  ue...    lappend
6e50: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 24 61   dependencies($a
6e60: 29 20 24 62 0a 09 09 20 20 20 20 73 65 74 20 64  ) $b...    set d
6e70: 65 70 28 24 61 2c 24 62 29 20 2e 0a 09 09 20 20  ep($a,$b) ....  
6e80: 20 20 73 65 74 20 64 65 70 28 24 62 2c 24 61 29    set dep($b,$a)
6e90: 20 2e 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d   ....}..    }..}
6ea0: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
6eb0: 20 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20      # var(dv) = 
6ec0: 64 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69  dict (item -> li
6ed0: 73 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d  st (item)), item
6ee0: 20 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69    = list (type i
6ef0: 64 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  d).    typemetho
6f00: 64 20 73 75 63 63 65 73 73 6f 72 73 20 7b 64 76  d successors {dv
6f10: 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75   revisions} {..u
6f20: 70 76 61 72 20 31 20 24 64 76 20 64 65 70 65 6e  pvar 1 $dv depen
6f30: 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74 68 65  dencies..set the
6f40: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76  set ('[join $rev
6f50: 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a  isions {','}]').
6f60: 0a 09 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  ..# The followin
6f70: 67 20 63 61 73 65 73 20 73 70 65 63 69 66 79 20  g cases specify 
6f80: 77 68 65 6e 20 61 20 72 65 76 69 73 69 6f 6e 20  when a revision 
6f90: 53 20 69 73 20 61 20 73 75 63 63 65 73 73 6f 72  S is a successor
6fa0: 0a 09 23 20 6f 66 20 61 20 72 65 76 69 73 69 6f  ..# of a revisio
6fb0: 6e 20 52 2e 20 45 61 63 68 20 6f 66 20 74 68 65  n R. Each of the
6fc0: 20 63 61 73 65 73 20 74 72 61 6e 73 6c 61 74 65   cases translate
6fd0: 73 20 69 6e 74 6f 20 6f 6e 65 20 6f 66 0a 09 23  s into one of..#
6fe0: 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 6f 66   the branches of
6ff0: 20 74 68 65 20 53 51 4c 20 55 4e 49 4f 4e 20 63   the SQL UNION c
7000: 6f 6d 69 6e 67 20 62 65 6c 6f 77 2e 0a 09 23 0a  oming below...#.
7010: 09 23 20 28 31 29 20 53 20 63 61 6e 20 62 65 20  .# (1) S can be 
7020: 61 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 20  a primary child 
7030: 6f 66 20 52 2c 20 69 2e 65 2e 20 69 6e 20 74 68  of R, i.e. in th
7040: 65 20 73 61 6d 65 20 4c 4f 44 2e 20 52 0a 09 23  e same LOD. R..#
7050: 20 20 20 20 20 72 65 66 65 72 65 6e 63 65 73 20       references 
7060: 53 20 64 69 72 65 63 74 6c 79 2e 20 52 2e 63 68  S directly. R.ch
7070: 69 6c 64 20 3d 20 53 28 2e 72 69 64 29 2c 20 69  ild = S(.rid), i
7080: 66 20 69 74 20 65 78 69 73 74 73 2e 0a 09 23 0a  f it exists...#.
7090: 09 23 20 28 32 29 20 53 20 63 61 6e 20 62 65 20  .# (2) S can be 
70a0: 61 20 73 65 63 6f 6e 64 61 72 79 2c 20 69 2e 65  a secondary, i.e
70b0: 2e 20 62 72 61 6e 63 68 2c 20 63 68 69 6c 64 20  . branch, child 
70c0: 6f 66 20 52 2e 20 48 65 72 65 20 74 68 65 0a 09  of R. Here the..
70d0: 23 20 20 20 20 20 6c 69 6e 6b 20 69 73 20 6d 61  #     link is ma
70e0: 64 65 20 74 68 72 6f 75 67 68 20 74 68 65 20 68  de through the h
70f0: 65 6c 70 65 72 20 74 61 62 6c 65 0a 09 23 20 20  elper table..#  
7100: 20 20 20 52 45 56 49 53 49 4f 4e 42 52 41 4e 43     REVISIONBRANC
7110: 48 43 48 49 4c 44 52 45 4e 2e 20 52 2e 72 69 64  HCHILDREN. R.rid
7120: 20 2d 3e 20 52 42 43 2e 72 69 64 2c 20 52 42 43   -> RBC.rid, RBC
7130: 2e 62 72 69 64 20 3d 0a 09 23 20 20 20 20 20 53  .brid =..#     S
7140: 28 2e 72 69 64 29 0a 09 23 0a 09 23 20 28 33 29  (.rid)..#..# (3)
7150: 20 4f 72 69 67 69 6e 61 6c 6c 79 20 74 68 69 73   Originally this
7160: 20 75 73 65 20 63 61 73 65 20 64 65 66 69 6e 65   use case define
7170: 64 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 20  d the root of a 
7180: 64 65 74 61 63 68 65 64 0a 09 23 20 20 20 20 20  detached..#     
7190: 4e 54 44 42 20 61 73 20 74 68 65 20 73 75 63 63  NTDB as the succ
71a0: 65 73 73 6f 72 20 6f 66 20 74 68 65 20 74 72 75  essor of the tru
71b0: 6e 6b 20 72 6f 6f 74 2e 20 54 68 69 73 20 6c 65  nk root. This le
71c0: 61 64 73 20 74 6f 20 61 0a 09 23 20 20 20 20 20  ads to a..#     
71d0: 62 61 64 20 74 61 6e 67 6c 65 20 6c 61 74 65 72  bad tangle later
71e0: 20 6f 6e 2e 20 57 69 74 68 20 61 20 64 65 74 61   on. With a deta
71f0: 63 68 65 64 20 4e 54 44 42 20 74 68 65 20 6f 72  ched NTDB the or
7200: 69 67 69 6e 61 6c 0a 09 23 20 20 20 20 20 74 72  iginal..#     tr
7210: 75 6e 6b 20 72 6f 6f 74 20 72 65 76 69 73 69 6f  unk root revisio
7220: 6e 20 77 61 73 20 72 65 6d 6f 76 65 64 20 61 73  n was removed as
7230: 20 69 72 72 65 6c 65 76 61 6e 74 2c 20 61 6c 6c   irrelevant, all
7240: 6f 77 69 6e 67 0a 09 23 20 20 20 20 20 74 68 65  owing..#     the
7250: 20 6e 6f 6d 69 6e 61 6c 20 72 6f 6f 74 20 74 6f   nominal root to
7260: 20 62 65 20 6c 61 74 65 72 20 69 6e 20 74 69 6d   be later in tim
7270: 65 20 74 68 61 6e 20 74 68 65 20 4e 54 44 42 0a  e than the NTDB.
7280: 09 23 20 20 20 20 20 72 6f 6f 74 2e 20 4e 6f 77  .#     root. Now
7290: 20 73 65 74 74 69 6e 67 20 74 68 69 73 20 64 65   setting this de
72a0: 70 65 6e 64 65 6e 63 79 20 77 69 6c 6c 20 62 65  pendency will be
72b0: 20 62 61 63 6b 77 61 72 64 20 69 6e 0a 09 23 20   backward in..# 
72c0: 20 20 20 20 74 69 6d 65 2e 20 52 45 4d 4f 56 45      time. REMOVE
72d0: 44 2e 0a 09 23 0a 09 23 20 28 34 29 20 49 66 20  D...#..# (4) If 
72e0: 52 20 69 73 20 74 68 65 20 6c 61 73 74 20 6f 66  R is the last of
72f0: 20 74 68 65 20 4e 54 44 42 20 72 65 76 69 73 69   the NTDB revisi
7300: 6f 6e 73 20 77 68 69 63 68 20 62 65 6c 6f 6e 67  ons which belong
7310: 20 74 6f 0a 09 23 20 20 20 20 20 74 68 65 20 74   to..#     the t
7320: 72 75 6e 6b 2c 20 74 68 65 6e 20 74 68 65 20 70  runk, then the p
7330: 72 69 6d 61 72 79 20 63 68 69 6c 64 20 6f 66 20  rimary child of 
7340: 74 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74 20 28  the trunk root (
7350: 74 68 65 0a 09 23 20 20 20 20 20 27 31 2e 32 27  the..#     '1.2'
7360: 20 72 65 76 69 73 69 6f 6e 29 20 69 73 20 61 20   revision) is a 
7370: 73 75 63 63 65 73 73 6f 72 2c 20 69 66 20 69 74  successor, if it
7380: 20 65 78 69 73 74 73 2e 0a 0a 09 23 20 4e 6f 74   exists....# Not
7390: 65 20 74 68 61 74 20 74 68 65 20 62 72 61 6e 63  e that the branc
73a0: 68 65 73 20 73 70 61 77 6e 65 64 20 66 72 6f 6d  hes spawned from
73b0: 20 74 68 65 20 72 65 76 69 73 69 6f 6e 73 2c 20   the revisions, 
73c0: 61 6e 64 20 74 68 65 0a 09 23 20 74 61 67 73 20  and the..# tags 
73d0: 61 73 73 6f 63 69 61 74 65 64 20 77 69 74 68 20  associated with 
73e0: 74 68 65 6d 20 61 72 65 20 73 75 63 63 65 73 73  them are success
73f0: 6f 72 73 20 61 73 20 77 65 6c 6c 2e 0a 0a 09 66  ors as well....f
7400: 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c  oreach {rid chil
7410: 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a  d} [state run ".
7420: 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d 61 72     -- (1) Primar
7430: 79 20 63 68 69 6c 64 0a 09 20 20 20 20 53 45 4c  y child..    SEL
7440: 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63 68 69  ECT R.rid, R.chi
7450: 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72  ld..    FROM   r
7460: 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57  evision R..    W
7470: 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e  HERE  R.rid   IN
7480: 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20   $theset     -- 
7490: 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69  Restrict to revi
74a0: 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73  sions of interes
74b0: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e  t..    AND    R.
74c0: 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c  child IS NOT NUL
74d0: 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d  L    -- Has prim
74e0: 61 72 79 20 63 68 69 6c 64 0a 20 20 20 20 55 4e  ary child.    UN
74f0: 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32 29 20 53  ION.    -- (2) S
7500: 65 63 6f 6e 64 61 72 79 20 28 62 72 61 6e 63 68  econdary (branch
7510: 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20  ) children..    
7520: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 42 2e  SELECT R.rid, B.
7530: 62 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  brid..    FROM  
7540: 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76   revision R, rev
7550: 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64  isionbranchchild
7560: 72 65 6e 20 42 0a 09 20 20 20 20 57 48 45 52 45  ren B..    WHERE
7570: 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68    R.rid   IN $th
7580: 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74  eset     -- Rest
7590: 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e  rict to revision
75a0: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20  s of interest.. 
75b0: 20 20 20 41 4e 44 20 20 20 20 52 2e 72 69 64 20     AND    R.rid 
75c0: 3d 20 42 2e 72 69 64 20 20 20 20 20 20 20 20 20  = B.rid         
75d0: 20 2d 2d 20 53 65 6c 65 63 74 20 73 75 62 73 65   -- Select subse
75e0: 74 20 6f 66 20 62 72 61 6e 63 68 20 63 68 69 6c  t of branch chil
75f0: 64 72 65 6e 0a 20 20 20 20 55 4e 49 4f 4e 0a 20  dren.    UNION. 
7600: 20 20 20 2d 2d 20 28 34 29 20 43 68 69 6c 64 20     -- (4) Child 
7610: 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 20 73 75  of trunk root su
7620: 63 63 65 73 73 6f 72 20 6f 66 20 6c 61 73 74 20  ccessor of last 
7630: 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b 2e 0a 09  NTDB on trunk...
7640: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64      SELECT R.rid
7650: 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20 20 20 20  , RA.child..    
7660: 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c  FROM revision R,
7670: 20 72 65 76 69 73 69 6f 6e 20 52 41 0a 09 20 20   revision RA..  
7680: 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 20 20    WHERE R.rid   
7690: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 20  IN $theset      
76a0: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72  -- Restrict to r
76b0: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65  evisions of inte
76c0: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
76d0: 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20 20  R.isdefault     
76e0: 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72          -- Restr
76f0: 69 63 74 20 74 6f 20 4e 54 44 42 0a 09 20 20 20  ict to NTDB..   
7700: 20 41 4e 44 20 20 20 52 2e 64 62 63 68 69 6c 64   AND   R.dbchild
7710: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d   IS NOT NULL   -
7720: 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 42 20  - and last NTDB 
7730: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72 75  belonging to tru
7740: 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 52 41  nk..    AND   RA
7750: 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69 6c 64  .rid = R.dbchild
7760: 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 72 65        -- Go dire
7770: 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 72 6f  ctly to trunk ro
7780: 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 52 41  ot..    AND   RA
7790: 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55  .child IS NOT NU
77a0: 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69  LL    -- Has pri
77b0: 6d 61 72 79 20 63 68 69 6c 64 2e 0a 09 22 5d 20  mary child..."] 
77c0: 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 69 64 65  {..    # Conside
77d0: 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 20 74 6f  r moving this to
77e0: 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6d   the integrity m
77f0: 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 6e 74 65  odule...    inte
7800: 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24 72  grity assert {$r
7810: 69 64 20 21 3d 20 24 63 68 69 6c 64 7d 20 7b 52  id != $child} {R
7820: 65 76 69 73 69 6f 6e 20 24 72 69 64 20 64 65 70  evision $rid dep
7830: 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 2e 7d  ends on itself.}
7840: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65  ..    lappend de
7850: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74  pendencies([list
7860: 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c 69 73   rev $rid]) [lis
7870: 74 20 72 65 76 20 24 63 68 69 6c 64 5d 0a 09 7d  t rev $child]..}
7880: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63  ..foreach {rid c
7890: 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e  hild} [state run
78a0: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52   "..    SELECT R
78b0: 2e 72 69 64 2c 20 54 2e 74 69 64 0a 09 20 20 20  .rid, T.tid..   
78c0: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
78d0: 20 52 2c 20 74 61 67 20 54 0a 09 20 20 20 20 57   R, tag T..    W
78e0: 48 45 52 45 20 20 52 2e 72 69 64 20 69 6e 20 24  HERE  R.rid in $
78f0: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20  theset..    AND 
7900: 20 20 20 54 2e 72 65 76 20 3d 20 52 2e 72 69 64     T.rev = R.rid
7910: 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70  .."] {..    lapp
7920: 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73  end dependencies
7930: 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64 5d  ([list rev $rid]
7940: 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67  ) [list sym::tag
7950: 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72   $child]..}..for
7960: 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 7d  each {rid child}
7970: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20   [state run ".. 
7980: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c     SELECT R.rid,
7990: 20 42 2e 62 69 64 0a 09 20 20 20 20 46 52 4f 4d   B.bid..    FROM
79a0: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 62     revision R, b
79b0: 72 61 6e 63 68 20 42 0a 09 20 20 20 20 57 48 45  ranch B..    WHE
79c0: 52 45 20 20 52 2e 72 69 64 20 69 6e 20 24 74 68  RE  R.rid in $th
79d0: 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20  eset..    AND   
79e0: 20 42 2e 72 6f 6f 74 20 3d 20 52 2e 72 69 64 0a   B.root = R.rid.
79f0: 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65  ."] {..    lappe
7a00: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28  nd dependencies(
7a10: 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64 5d 29  [list rev $rid])
7a20: 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e   [list sym::bran
7a30: 63 68 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 72  ch $child]..}..r
7a40: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
7a50: 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 63   # var(dv) = dic
7a60: 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20  t (item -> list 
7a70: 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d  (item)), item  =
7a80: 20 6c 69 73 74 20 28 74 79 70 65 20 69 64 29 0a   list (type id).
7a90: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 70      typemethod p
7aa0: 72 65 64 65 63 65 73 73 6f 72 73 20 7b 64 76 20  redecessors {dv 
7ab0: 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70  revisions} {..up
7ac0: 76 61 72 20 31 20 24 64 76 20 64 65 70 65 6e 64  var 1 $dv depend
7ad0: 65 6e 63 69 65 73 0a 09 73 65 74 20 74 68 65 73  encies..set thes
7ae0: 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69  et ('[join $revi
7af0: 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a  sions {','}]')..
7b00: 09 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  .# The following
7b10: 20 63 61 73 65 73 20 73 70 65 63 69 66 79 20 77   cases specify w
7b20: 68 65 6e 20 61 20 72 65 76 69 73 69 6f 6e 20 50  hen a revision P
7b30: 20 69 73 20 61 0a 09 23 20 70 72 65 64 65 63 65   is a..# predece
7b40: 73 73 6f 72 20 6f 66 20 61 20 72 65 76 69 73 69  ssor of a revisi
7b50: 6f 6e 20 52 2e 20 45 61 63 68 20 6f 66 20 74 68  on R. Each of th
7b60: 65 20 63 61 73 65 73 20 74 72 61 6e 73 6c 61 74  e cases translat
7b70: 65 73 0a 09 23 20 69 6e 74 6f 20 6f 6e 65 20 6f  es..# into one o
7b80: 66 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 6f  f the branches o
7b90: 66 20 74 68 65 20 53 51 4c 20 55 4e 49 4f 4e 20  f the SQL UNION 
7ba0: 63 6f 6d 69 6e 67 20 62 65 6c 6f 77 2e 0a 09 23  coming below...#
7bb0: 0a 09 23 20 28 31 29 20 54 68 65 20 69 6d 6d 65  ..# (1) The imme
7bc0: 64 69 61 74 65 20 70 61 72 65 6e 74 20 52 2e 70  diate parent R.p
7bd0: 61 72 65 6e 74 20 6f 66 20 52 20 69 73 20 61 20  arent of R is a 
7be0: 70 72 65 64 65 63 65 73 73 6f 72 20 6f 66 0a 09  predecessor of..
7bf0: 23 20 20 20 20 20 52 2e 20 4e 4f 54 45 3a 20 54  #     R. NOTE: T
7c00: 68 69 73 20 69 73 20 74 72 75 65 20 66 6f 72 20  his is true for 
7c10: 52 20 65 69 74 68 65 72 20 70 72 69 6d 61 72 79  R either primary
7c20: 20 6f 72 20 73 65 63 6f 6e 64 61 72 79 0a 09 23   or secondary..#
7c30: 20 20 20 20 20 63 68 69 6c 64 20 6f 66 20 50 2e       child of P.
7c40: 20 49 74 20 6e 6f 74 20 6e 65 63 65 73 73 61 72   It not necessar
7c50: 79 20 74 6f 20 64 69 73 74 69 6e 67 75 69 73 68  y to distinguish
7c60: 20 74 68 65 20 74 77 6f 0a 09 23 20 20 20 20 20   the two..#     
7c70: 63 61 73 65 73 2c 20 69 6e 20 63 6f 6e 74 72 61  cases, in contra
7c80: 73 74 20 74 6f 20 74 68 65 20 63 6f 64 65 20 72  st to the code r
7c90: 65 74 72 69 65 76 69 6e 67 20 74 68 65 20 73 75  etrieving the su
7ca0: 63 63 65 73 73 6f 72 0a 09 23 20 20 20 20 20 69  ccessor..#     i
7cb0: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 09 23 0a 09  nformation...#..
7cc0: 23 20 28 32 29 20 54 68 65 20 63 6f 6d 70 6c 65  # (2) The comple
7cd0: 6d 65 6e 74 20 6f 66 20 73 75 63 63 65 73 73 6f  ment of successo
7ce0: 72 20 63 61 73 65 20 28 33 29 2e 20 54 68 65 20  r case (3). The 
7cf0: 74 72 75 6e 6b 20 72 6f 6f 74 20 69 73 0a 09 23  trunk root is..#
7d00: 20 20 20 20 20 61 20 70 72 65 64 65 63 65 73 73       a predecess
7d10: 6f 72 20 6f 66 20 61 20 4e 54 44 42 20 72 6f 6f  or of a NTDB roo
7d20: 74 2e 20 52 45 4d 4f 56 45 44 2e 20 53 65 65 20  t. REMOVED. See 
7d30: 27 73 75 63 63 65 73 73 6f 72 73 27 0a 09 23 20  'successors'..# 
7d40: 20 20 20 20 66 6f 72 20 74 68 65 20 65 78 70 6c      for the expl
7d50: 61 6e 61 74 69 6f 6e 2e 0a 09 23 0a 09 23 20 28  anation...#..# (
7d60: 33 29 20 54 68 65 20 63 6f 6d 70 6c 65 6d 65 6e  3) The complemen
7d70: 74 20 6f 66 20 73 75 63 63 65 73 73 6f 72 20 63  t of successor c
7d80: 61 73 65 20 28 34 29 2e 20 54 68 65 20 6c 61 73  ase (4). The las
7d90: 74 20 4e 54 44 42 0a 09 23 20 20 20 20 20 72 65  t NTDB..#     re
7da0: 76 69 73 69 6f 6e 20 62 65 6c 6f 6e 67 69 6e 67  vision belonging
7db0: 20 74 6f 20 74 68 65 20 74 72 75 6e 6b 20 69 73   to the trunk is
7dc0: 20 61 20 70 72 65 64 65 63 65 73 73 6f 72 20 6f   a predecessor o
7dd0: 66 20 74 68 65 0a 09 23 20 20 20 20 20 70 72 69  f the..#     pri
7de0: 6d 61 72 79 20 63 68 69 6c 64 20 6f 66 20 74 68  mary child of th
7df0: 65 20 74 72 75 6e 6b 20 72 6f 6f 74 20 28 54 68  e trunk root (Th
7e00: 65 20 27 31 2e 32 27 20 72 65 76 69 73 69 6f 6e  e '1.2' revision
7e10: 29 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69  )....foreach {ri
7e20: 64 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65  d parent} [state
7e30: 20 72 75 6e 20 22 0a 20 20 20 2d 2d 20 28 31 29   run ".   -- (1)
7e40: 20 50 72 69 6d 61 72 79 20 70 61 72 65 6e 74 2c   Primary parent,
7e50: 20 63 61 6e 20 62 65 20 69 6e 20 64 69 66 66 65   can be in diffe
7e60: 72 65 6e 74 20 4c 4f 44 20 66 6f 72 20 66 69 72  rent LOD for fir
7e70: 73 74 20 69 6e 20 61 20 62 72 61 6e 63 68 0a 09  st in a branch..
7e80: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64      SELECT R.rid
7e90: 2c 20 52 2e 70 61 72 65 6e 74 0a 09 20 20 20 20  , R.parent..    
7ea0: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20  FROM   revision 
7eb0: 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e  R..    WHERE  R.
7ec0: 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74  rid   IN $theset
7ed0: 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74       -- Restrict
7ee0: 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66   to revisions of
7ef0: 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41   interest..    A
7f00: 4e 44 20 20 20 20 52 2e 70 61 72 65 6e 74 20 49  ND    R.parent I
7f10: 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d 20  S NOT NULL   -- 
7f20: 48 61 73 20 70 72 69 6d 61 72 79 20 70 61 72 65  Has primary pare
7f30: 6e 74 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20  nt.    UNION.   
7f40: 20 2d 2d 20 28 33 29 20 4c 61 73 74 20 4e 54 44   -- (3) Last NTD
7f50: 42 20 6f 6e 20 74 72 75 6e 6b 20 69 73 20 70 72  B on trunk is pr
7f60: 65 64 65 63 65 73 73 6f 72 20 6f 66 20 63 68 69  edecessor of chi
7f70: 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74  ld of trunk root
7f80: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
7f90: 69 64 2c 20 52 41 2e 64 62 70 61 72 65 6e 74 0a  id, RA.dbparent.
7fa0: 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69  .    FROM   revi
7fb0: 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e  sion R, revision
7fc0: 20 52 41 0a 09 20 20 20 20 57 48 45 52 45 20 20   RA..    WHERE  
7fd0: 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 74  R.rid IN $theset
7fe0: 20 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74           -- Rest
7ff0: 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e  rict to revision
8000: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20  s of interest.. 
8010: 20 20 20 41 4e 44 20 20 20 20 4e 4f 54 20 52 2e     AND    NOT R.
8020: 69 73 64 65 66 61 75 6c 74 20 20 20 20 20 20 20  isdefault       
8030: 20 20 20 2d 2d 20 6e 6f 74 20 6f 6e 20 4e 54 44     -- not on NTD
8040: 42 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e  B..    AND    R.
8050: 70 61 72 65 6e 74 20 49 53 20 4e 4f 54 20 4e 55  parent IS NOT NU
8060: 4c 4c 20 20 20 20 20 2d 2d 20 77 68 69 63 68 20  LL     -- which 
8070: 61 72 65 20 6e 6f 74 20 72 6f 6f 74 0a 09 20 20  are not root..  
8080: 20 20 41 4e 44 20 20 20 20 52 41 2e 72 69 64 20    AND    RA.rid 
8090: 3d 20 52 2e 70 61 72 65 6e 74 20 20 20 20 20 20  = R.parent      
80a0: 20 20 2d 2d 20 67 6f 20 74 6f 20 74 68 65 69 72    -- go to their
80b0: 20 70 61 72 65 6e 74 0a 09 20 20 20 20 41 4e 44   parent..    AND
80c0: 20 20 20 20 52 41 2e 64 62 70 61 72 65 6e 74 20      RA.dbparent 
80d0: 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 2d 2d 20  IS NOT NULL  -- 
80e0: 77 68 69 63 68 20 68 61 73 20 74 6f 20 72 65 66  which has to ref
80f0: 65 72 20 74 6f 20 4e 54 44 42 27 73 20 72 6f 6f  er to NTDB's roo
8100: 74 0a 09 22 5d 20 7b 0a 09 20 20 20 20 23 20 43  t.."] {..    # C
8110: 6f 6e 73 69 64 65 72 20 6d 6f 76 69 6e 67 20 74  onsider moving t
8120: 68 69 73 20 74 6f 20 74 68 65 20 69 6e 74 65 67  his to the integ
8130: 72 69 74 79 20 6d 6f 64 75 6c 65 2e 0a 09 20 20  rity module...  
8140: 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 65    integrity asse
8150: 72 74 20 7b 24 72 69 64 20 21 3d 20 24 70 61 72  rt {$rid != $par
8160: 65 6e 74 7d 20 7b 52 65 76 69 73 69 6f 6e 20 24  ent} {Revision $
8170: 72 69 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 69  rid depends on i
8180: 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20 6c 61 70  tself.}..    lap
8190: 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65  pend dependencie
81a0: 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64  s([list rev $rid
81b0: 5d 29 20 5b 6c 69 73 74 20 72 65 76 20 24 70 61  ]) [list rev $pa
81c0: 72 65 6e 74 5d 0a 09 7d 0a 0a 09 23 20 54 68 65  rent]..}...# The
81d0: 20 72 65 76 69 73 69 6f 6e 73 20 77 68 69 63 68   revisions which
81e0: 20 61 72 65 20 74 68 65 20 66 69 72 73 74 20 6f   are the first o
81f0: 6e 20 61 20 62 72 61 6e 63 68 20 68 61 76 65 20  n a branch have 
8200: 74 68 61 74 0a 09 23 20 62 72 61 6e 63 68 20 61  that..# branch a
8210: 73 20 74 68 65 69 72 20 70 72 65 64 65 63 65 73  s their predeces
8220: 73 6f 72 2e 20 4e 6f 74 65 20 74 68 61 74 20 72  sor. Note that r
8230: 65 76 69 73 69 6f 6e 73 20 63 61 6e 6e 6f 74 20  evisions cannot 
8240: 62 65 0a 09 23 20 6f 6e 20 74 61 67 73 20 69 6e  be..# on tags in
8250: 20 74 68 65 20 73 61 6d 65 20 6d 61 6e 6e 65 72   the same manner
8260: 2c 20 73 6f 20 74 61 67 73 20 63 61 6e 6e 6f 74  , so tags cannot
8270: 20 62 65 20 70 72 65 64 65 63 65 73 73 6f 72 73   be predecessors
8280: 0a 09 23 20 6f 66 20 72 65 76 69 73 69 6f 6e 73  ..# of revisions
8290: 2e 20 54 68 69 73 20 63 6f 6d 70 6c 65 6d 65 6e  . This complemen
82a0: 74 73 20 74 68 61 74 20 74 68 65 79 20 68 61 76  ts that they hav
82b0: 65 20 6e 6f 20 73 75 63 63 65 73 73 6f 72 73 0a  e no successors.
82c0: 09 23 20 28 53 65 65 20 73 79 6d 3a 3a 74 61 67  .# (See sym::tag
82d0: 2f 73 75 63 63 65 73 73 6f 72 73 29 2e 0a 0a 09  /successors)....
82e0: 66 6f 72 65 61 63 68 20 7b 72 69 64 20 70 61 72  foreach {rid par
82f0: 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20  ent} [state run 
8300: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e  "..    SELECT R.
8310: 72 69 64 2c 20 42 2e 62 69 64 0a 09 20 20 20 20  rid, B.bid..    
8320: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20  FROM   revision 
8330: 52 2c 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20  R, branch B..   
8340: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 49 4e   WHERE  R.rid IN
8350: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e   $theset..    AN
8360: 44 20 20 20 20 42 2e 66 69 72 73 74 20 3d 20 52  D    B.first = R
8370: 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20  .rid.."] {..    
8380: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e  lappend dependen
8390: 63 69 65 73 28 5b 6c 69 73 74 20 72 65 76 20 24  cies([list rev $
83a0: 72 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a  rid]) [list sym:
83b0: 3a 62 72 61 6e 63 68 20 24 70 61 72 65 6e 74 5d  :branch $parent]
83c0: 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  ..}..return.    
83d0: 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20  }.}..# # ## ### 
83e0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23  ##### ######## #
83f0: 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23 23  ############ ###
8400: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8410: 23 23 0a 23 23 20 48 65 6c 70 65 72 20 73 69 6e  ##.## Helper sin
8420: 67 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73  gleton. Commands
8430: 20 66 6f 72 20 74 61 67 20 73 79 6d 62 6f 6c 20   for tag symbol 
8440: 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e 69  changesets...sni
8450: 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f  t::type ::vc::fo
8460: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
8470: 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a  s::project::rev:
8480: 3a 73 79 6d 3a 3a 74 61 67 20 7b 0a 20 20 20 20  :sym::tag {.    
8490: 74 79 70 65 6d 65 74 68 6f 64 20 62 79 72 65 76  typemethod byrev
84a0: 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75 72  ision {} { retur
84b0: 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65  n 0 }.    typeme
84c0: 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 20  thod bysymbol   
84d0: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a  {} { return 1 }.
84e0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69      typemethod i
84f0: 73 74 61 67 20 20 20 20 20 20 7b 7d 20 7b 20 72  stag      {} { r
8500: 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 79  eturn 1 }.    ty
8510: 70 65 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63  pemethod isbranc
8520: 68 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20  h   {} { return 
8530: 30 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74  0 }..    typemet
8540: 68 6f 64 20 73 74 72 20 7b 74 61 67 7d 20 7b 0a  hod str {tag} {.
8550: 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73  .struct::list as
8560: 73 69 67 6e 20 5b 73 74 61 74 65 20 72 75 6e 20  sign [state run 
8570: 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 53 2e  {..    SELECT S.
8580: 6e 61 6d 65 2c 20 46 2e 6e 61 6d 65 2c 20 50 2e  name, F.name, P.
8590: 6e 61 6d 65 0a 09 20 20 20 20 46 52 4f 4d 20 20  name..    FROM  
85a0: 20 74 61 67 20 54 2c 20 73 79 6d 62 6f 6c 20 53   tag T, symbol S
85b0: 2c 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65 63  , file F, projec
85c0: 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 20 20  t P..    WHERE  
85d0: 54 2e 74 69 64 20 3d 20 24 74 61 67 0a 09 20 20  T.tid = $tag..  
85e0: 20 20 41 4e 44 20 20 20 20 46 2e 66 69 64 20 3d    AND    F.fid =
85f0: 20 54 2e 66 69 64 0a 09 20 20 20 20 41 4e 44 20   T.fid..    AND 
8600: 20 20 20 50 2e 70 69 64 20 3d 20 46 2e 70 69 64     P.pid = F.pid
8610: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 53 2e 73  ..    AND    S.s
8620: 69 64 20 3d 20 54 2e 73 69 64 0a 09 7d 5d 20 73  id = T.sid..}] s
8630: 6e 61 6d 65 20 66 6e 61 6d 65 20 70 6e 61 6d 65  name fname pname
8640: 0a 09 72 65 74 75 72 6e 20 22 24 70 6e 61 6d 65  ..return "$pname
8650: 2f 54 27 24 7b 73 6e 61 6d 65 7d 27 3a 3a 24 66  /T'${sname}'::$f
8660: 6e 61 6d 65 22 0a 20 20 20 20 7d 0a 0a 20 20 20  name".    }..   
8670: 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73 74   # result = list
8680: 20 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74 69   (mintime, maxti
8690: 6d 65 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68  me).    typemeth
86a0: 6f 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 74 61  od timerange {ta
86b0: 67 73 7d 20 7b 0a 09 23 20 54 68 65 20 72 61 6e  gs} {..# The ran
86c0: 67 65 20 69 73 20 64 65 66 69 6e 65 64 20 61 73  ge is defined as
86d0: 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 74 68   the range of th
86e0: 65 20 72 65 76 69 73 69 6f 6e 73 20 74 68 65 20  e revisions the 
86f0: 74 61 67 73 0a 09 23 20 61 72 65 20 61 74 74 61  tags..# are atta
8700: 63 68 65 64 20 74 6f 2e 0a 0a 09 73 65 74 20 74  ched to....set t
8710: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 74  heset ('[join $t
8720: 61 67 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65  ags {','}]')..re
8730: 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20  turn [state run 
8740: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 4d 49  "..    SELECT MI
8750: 4e 28 52 2e 64 61 74 65 29 2c 20 4d 41 58 28 52  N(R.date), MAX(R
8760: 2e 64 61 74 65 29 0a 09 20 20 20 20 46 52 4f 4d  .date)..    FROM
8770: 20 20 20 74 61 67 20 54 2c 20 72 65 76 69 73 69     tag T, revisi
8780: 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20  on R..    WHERE 
8790: 20 54 2e 74 69 64 20 49 4e 20 24 74 68 65 73 65   T.tid IN $these
87a0: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e  t.            AN
87b0: 44 20 20 20 20 52 2e 72 69 64 20 3d 20 54 2e 72  D    R.rid = T.r
87c0: 65 76 0a 09 22 5d 0a 20 20 20 20 7d 0a 0a 20 20  ev.."].    }..  
87d0: 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 69    # var(dv) = di
87e0: 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74  ct (item -> list
87f0: 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 20   (item)), item  
8800: 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69 64 29  = list (type id)
8810: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
8820: 73 75 63 63 65 73 73 6f 72 73 20 7b 64 76 20 74  successors {dv t
8830: 61 67 73 7d 20 7b 0a 09 23 20 54 61 67 73 20 68  ags} {..# Tags h
8840: 61 76 65 20 6e 6f 20 73 75 63 63 65 73 73 6f 72  ave no successor
8850: 73 2e 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d  s...return.    }
8860: 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76 29 20  ..    # var(dv) 
8870: 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d 3e 20  = dict (item -> 
8880: 6c 69 73 74 20 28 69 74 65 6d 29 29 2c 20 69 74  list (item)), it
8890: 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 79 70 65  em  = list (type
88a0: 20 69 64 29 0a 20 20 20 20 74 79 70 65 6d 65 74   id).    typemet
88b0: 68 6f 64 20 70 72 65 64 65 63 65 73 73 6f 72 73  hod predecessors
88c0: 20 7b 64 76 20 74 61 67 73 7d 20 7b 0a 09 23 20   {dv tags} {..# 
88d0: 54 68 65 20 70 72 65 64 65 63 65 73 73 6f 72 73  The predecessors
88e0: 20 6f 66 20 61 20 74 61 67 20 61 72 65 20 61 6c   of a tag are al
88f0: 6c 20 74 68 65 20 72 65 76 69 73 69 6f 6e 73 20  l the revisions 
8900: 74 68 65 20 74 61 67 73 20 61 72 65 0a 09 23 20  the tags are..# 
8910: 61 74 74 61 63 68 65 64 20 74 6f 2c 20 61 73 20  attached to, as 
8920: 77 65 6c 6c 20 61 73 20 61 6c 6c 20 74 68 65 20  well as all the 
8930: 62 72 61 6e 63 68 65 73 20 6f 72 20 74 61 67 73  branches or tags
8940: 20 77 68 69 63 68 20 61 72 65 0a 09 23 20 74 68   which are..# th
8950: 65 69 72 20 70 72 65 66 65 72 65 64 20 70 61 72  eir prefered par
8960: 65 6e 74 73 2e 0a 0a 09 73 65 74 20 74 68 65 73  ents....set thes
8970: 65 74 20 28 27 5b 6a 6f 69 6e 20 24 74 61 67 73  et ('[join $tags
8980: 20 7b 27 2c 27 7d 5d 27 29 0a 09 66 6f 72 65 61   {','}]')..forea
8990: 63 68 20 7b 74 69 64 20 70 61 72 65 6e 74 7d 20  ch {tid parent} 
89a0: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20  [state run "..  
89b0: 20 20 53 45 4c 45 43 54 20 54 2e 74 69 64 2c 20    SELECT T.tid, 
89c0: 52 2e 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20  R.rid..    FROM 
89d0: 20 20 74 61 67 20 54 2c 20 72 65 76 69 73 69 6f    tag T, revisio
89e0: 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 20  n R..    WHERE  
89f0: 54 2e 74 69 64 20 49 4e 20 24 74 68 65 73 65 74  T.tid IN $theset
8a00: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 54 2e 72  ..    AND    T.r
8a10: 65 76 20 3d 20 52 2e 72 69 64 0a 09 22 5d 20 7b  ev = R.rid.."] {
8a20: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65  ..    lappend de
8a30: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74  pendencies([list
8a40: 20 73 79 6d 3a 3a 74 61 67 20 24 74 69 64 5d 29   sym::tag $tid])
8a50: 20 5b 6c 69 73 74 20 72 65 76 20 24 70 61 72 65   [list rev $pare
8a60: 6e 74 5d 0a 09 7d 0a 0a 09 66 6f 72 65 61 63 68  nt]..}...foreach
8a70: 20 7b 74 69 64 20 70 61 72 65 6e 74 7d 20 5b 73   {tid parent} [s
8a80: 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20  tate run "..    
8a90: 53 45 4c 45 43 54 20 54 2e 74 69 64 2c 20 42 2e  SELECT T.tid, B.
8aa0: 62 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  bid..    FROM   
8ab0: 74 61 67 20 54 2c 20 70 72 65 66 65 72 65 64 70  tag T, preferedp
8ac0: 61 72 65 6e 74 20 50 2c 20 62 72 61 6e 63 68 20  arent P, branch 
8ad0: 42 0a 09 20 20 20 20 57 48 45 52 45 20 20 54 2e  B..    WHERE  T.
8ae0: 74 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09  tid IN $theset..
8af0: 20 20 20 20 41 4e 44 20 20 20 20 54 2e 73 69 64      AND    T.sid
8b00: 20 3d 20 50 2e 73 69 64 0a 09 20 20 20 20 41 4e   = P.sid..    AN
8b10: 44 20 20 20 20 50 2e 70 69 64 20 3d 20 42 2e 73  D    P.pid = B.s
8b20: 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61  id.."] {..    la
8b30: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69  ppend dependenci
8b40: 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61  es([list sym::ta
8b50: 67 20 24 74 69 64 5d 29 20 5b 6c 69 73 74 20 73  g $tid]) [list s
8b60: 79 6d 3a 3a 62 72 61 6e 63 68 20 24 70 61 72 65  ym::branch $pare
8b70: 6e 74 5d 0a 09 7d 0a 0a 09 66 6f 72 65 61 63 68  nt]..}...foreach
8b80: 20 7b 74 69 64 20 70 61 72 65 6e 74 7d 20 5b 73   {tid parent} [s
8b90: 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20  tate run "..    
8ba0: 53 45 4c 45 43 54 20 54 2e 74 69 64 2c 20 54 58  SELECT T.tid, TX
8bb0: 2e 74 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  .tid..    FROM  
8bc0: 20 74 61 67 20 54 2c 20 70 72 65 66 65 72 65 64   tag T, prefered
8bd0: 70 61 72 65 6e 74 20 50 2c 20 74 61 67 20 54 58  parent P, tag TX
8be0: 0a 09 20 20 20 20 57 48 45 52 45 20 20 54 2e 74  ..    WHERE  T.t
8bf0: 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20  id IN $theset.. 
8c00: 20 20 20 41 4e 44 20 20 20 20 54 2e 73 69 64 20     AND    T.sid 
8c10: 3d 20 50 2e 73 69 64 0a 09 20 20 20 20 41 4e 44  = P.sid..    AND
8c20: 20 20 20 20 50 2e 70 69 64 20 3d 20 54 58 2e 73      P.pid = TX.s
8c30: 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61  id.."] {..    la
8c40: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69  ppend dependenci
8c50: 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61  es([list sym::ta
8c60: 67 20 24 74 69 64 5d 29 20 5b 6c 69 73 74 20 73  g $tid]) [list s
8c70: 79 6d 3a 3a 74 61 67 20 24 70 61 72 65 6e 74 5d  ym::tag $parent]
8c80: 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  ..}..return.    
8c90: 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20  }.}..# # ## ### 
8ca0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23  ##### ######## #
8cb0: 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23 23  ############ ###
8cc0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8cd0: 23 23 0a 23 23 20 48 65 6c 70 65 72 20 73 69 6e  ##.## Helper sin
8ce0: 67 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73  gleton. Commands
8cf0: 20 66 6f 72 20 62 72 61 6e 63 68 20 73 79 6d 62   for branch symb
8d00: 6f 6c 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a  ol changesets...
8d10: 73 6e 69 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a  snit::type ::vc:
8d20: 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a  :fossil::import:
8d30: 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72  :cvs::project::r
8d40: 65 76 3a 3a 73 79 6d 3a 3a 62 72 61 6e 63 68 20  ev::sym::branch 
8d50: 7b 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  {.    typemethod
8d60: 20 62 79 72 65 76 69 73 69 6f 6e 20 7b 7d 20 7b   byrevision {} {
8d70: 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20   return 0 }.    
8d80: 74 79 70 65 6d 65 74 68 6f 64 20 62 79 73 79 6d  typemethod bysym
8d90: 62 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 74 75 72  bol   {} { retur
8da0: 6e 20 31 20 7d 0a 20 20 20 20 74 79 70 65 6d 65  n 1 }.    typeme
8db0: 74 68 6f 64 20 69 73 74 61 67 20 20 20 20 20 20  thod istag      
8dc0: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a  {} { return 0 }.
8dd0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69      typemethod i
8de0: 73 62 72 61 6e 63 68 20 20 20 7b 7d 20 7b 20 72  sbranch   {} { r
8df0: 65 74 75 72 6e 20 31 20 7d 0a 0a 20 20 20 20 74  eturn 1 }..    t
8e00: 79 70 65 6d 65 74 68 6f 64 20 73 74 72 20 7b 62  ypemethod str {b
8e10: 72 61 6e 63 68 7d 20 7b 0a 09 73 74 72 75 63 74  ranch} {..struct
8e20: 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b 73  ::list assign [s
8e30: 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20  tate run {..    
8e40: 53 45 4c 45 43 54 20 53 2e 6e 61 6d 65 2c 20 46  SELECT S.name, F
8e50: 2e 6e 61 6d 65 2c 20 50 2e 6e 61 6d 65 0a 09 20  .name, P.name.. 
8e60: 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68     FROM   branch
8e70: 20 42 2c 20 73 79 6d 62 6f 6c 20 53 2c 20 66 69   B, symbol S, fi
8e80: 6c 65 20 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a  le F, project P.
8e90: 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69  .    WHERE  B.bi
8ea0: 64 20 3d 20 24 62 72 61 6e 63 68 0a 09 20 20 20  d = $branch..   
8eb0: 20 41 4e 44 20 20 20 20 46 2e 66 69 64 20 3d 20   AND    F.fid = 
8ec0: 42 2e 66 69 64 0a 09 20 20 20 20 41 4e 44 20 20  B.fid..    AND  
8ed0: 20 20 50 2e 70 69 64 20 3d 20 46 2e 70 69 64 0a    P.pid = F.pid.
8ee0: 09 20 20 20 20 41 4e 44 20 20 20 20 53 2e 73 69  .    AND    S.si
8ef0: 64 20 3d 20 42 2e 73 69 64 0a 09 7d 5d 20 73 6e  d = B.sid..}] sn
8f00: 61 6d 65 20 66 6e 61 6d 65 20 70 6e 61 6d 65 0a  ame fname pname.
8f10: 09 72 65 74 75 72 6e 20 22 24 70 6e 61 6d 65 2f  .return "$pname/
8f20: 42 27 24 7b 73 6e 61 6d 65 7d 27 3a 3a 24 66 6e  B'${sname}'::$fn
8f30: 61 6d 65 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ame".    }..    
8f40: 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73 74 20  # result = list 
8f50: 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74 69 6d  (mintime, maxtim
8f60: 65 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  e).    typemetho
8f70: 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 62 72 61  d timerange {bra
8f80: 6e 63 68 65 73 7d 20 7b 0a 09 23 20 54 68 65 20  nches} {..# The 
8f90: 72 61 6e 67 65 20 6f 66 20 61 20 62 72 61 6e 63  range of a branc
8fa0: 68 20 69 73 20 64 65 66 69 6e 65 64 20 61 73 20  h is defined as 
8fb0: 74 68 65 20 72 61 6e 67 65 20 6f 66 20 74 68 65  the range of the
8fc0: 0a 09 23 20 72 65 76 69 73 69 6f 6e 73 20 74 68  ..# revisions th
8fd0: 65 20 62 72 61 6e 63 68 65 73 20 61 72 65 20 73  e branches are s
8fe0: 70 61 77 6e 65 64 20 62 79 2e 20 4e 4f 54 45 20  pawned by. NOTE 
8ff0: 68 6f 77 65 76 65 72 20 74 68 61 74 20 74 68 65  however that the
9000: 0a 09 23 20 62 72 61 6e 63 68 65 73 20 61 73 73  ..# branches ass
9010: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
9020: 65 74 61 63 68 65 64 20 4e 54 44 42 20 77 69 6c  etached NTDB wil
9030: 6c 20 68 61 76 65 20 6e 6f 20 72 6f 6f 74 0a 09  l have no root..
9040: 23 20 73 70 61 77 6e 69 6e 67 20 74 68 65 6d 2c  # spawning them,
9050: 20 68 65 6e 63 65 20 74 68 65 79 20 68 61 76 65   hence they have
9060: 20 6e 6f 20 72 65 61 6c 20 74 69 6d 65 72 61 6e   no real timeran
9070: 67 65 20 61 6e 79 0a 09 23 20 6c 6f 6e 67 65 72  ge any..# longer
9080: 2e 20 42 79 20 75 73 69 6e 67 20 30 20 77 65 20  . By using 0 we 
9090: 70 75 74 20 74 68 65 6d 20 69 6e 20 66 72 6f 6e  put them in fron
90a0: 74 20 6f 66 20 65 76 65 72 79 74 68 69 6e 67 20  t of everything 
90b0: 65 6c 73 65 2c 0a 09 23 20 61 73 20 74 68 65 79  else,..# as they
90c0: 20 6c 6f 67 69 63 61 6c 6c 79 20 61 72 65 2e 0a   logically are..
90d0: 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b  ..set theset ('[
90e0: 6a 6f 69 6e 20 24 62 72 61 6e 63 68 65 73 20 7b  join $branches {
90f0: 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20  ','}]')..return 
9100: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20  [state run "..  
9110: 20 20 53 45 4c 45 43 54 20 49 46 4e 55 4c 4c 28    SELECT IFNULL(
9120: 4d 49 4e 28 52 2e 64 61 74 65 29 2c 30 29 2c 20  MIN(R.date),0), 
9130: 49 46 4e 55 4c 4c 28 4d 41 58 28 52 2e 64 61 74  IFNULL(MAX(R.dat
9140: 65 29 2c 30 29 0a 09 20 20 20 20 46 52 4f 4d 20  e),0)..    FROM 
9150: 20 62 72 61 6e 63 68 20 42 2c 20 72 65 76 69 73   branch B, revis
9160: 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45  ion R..    WHERE
9170: 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65   B.bid IN $these
9180: 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e  t.            AN
9190: 44 20 20 20 52 2e 72 69 64 20 3d 20 42 2e 72 6f  D   R.rid = B.ro
91a0: 6f 74 0a 09 22 5d 0a 20 20 20 20 7d 0a 0a 20 20  ot.."].    }..  
91b0: 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 69    # var(dv) = di
91c0: 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74  ct (item -> list
91d0: 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 20   (item)), item  
91e0: 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69 64 29  = list (type id)
91f0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
9200: 73 75 63 63 65 73 73 6f 72 73 20 7b 64 76 20 62  successors {dv b
9210: 72 61 6e 63 68 65 73 7d 20 7b 0a 09 23 20 54 68  ranches} {..# Th
9220: 65 20 66 69 72 73 74 20 72 65 76 69 73 69 6f 6e  e first revision
9230: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 6e 20 61 20   committed on a 
9240: 62 72 61 6e 63 68 2c 20 61 6e 64 20 61 6c 6c 20  branch, and all 
9250: 62 72 61 6e 63 68 65 73 0a 09 23 20 61 6e 64 20  branches..# and 
9260: 74 61 67 73 20 77 68 69 63 68 20 68 61 76 65 20  tags which have 
9270: 69 74 20 61 73 20 74 68 65 69 72 20 70 72 65 66  it as their pref
9280: 65 72 65 64 20 70 61 72 65 6e 74 20 61 72 65 20  ered parent are 
9290: 74 68 65 0a 09 23 20 73 75 63 63 65 73 73 6f 72  the..# successor
92a0: 73 20 6f 66 20 61 20 62 72 61 6e 63 68 2e 0a 0a  s of a branch...
92b0: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a  .set theset ('[j
92c0: 6f 69 6e 20 24 62 72 61 6e 63 68 65 73 20 7b 27  oin $branches {'
92d0: 2c 27 7d 5d 27 29 0a 09 66 6f 72 65 61 63 68 20  ,'}]')..foreach 
92e0: 7b 62 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61  {bid child} [sta
92f0: 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45  te run "..    SE
9300: 4c 45 43 54 20 42 2e 62 69 64 2c 20 52 2e 72 69  LECT B.bid, R.ri
9310: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72  d..    FROM   br
9320: 61 6e 63 68 20 42 2c 20 72 65 76 69 73 69 6f 6e  anch B, revision
9330: 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 42   R..    WHERE  B
9340: 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a  .bid IN $theset.
9350: 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 66 69  .    AND    B.fi
9360: 72 73 74 20 3d 20 52 2e 72 69 64 0a 09 22 5d 20  rst = R.rid.."] 
9370: 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64  {..    lappend d
9380: 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73  ependencies([lis
9390: 74 20 73 79 6d 3a 3a 74 61 67 20 24 62 69 64 5d  t sym::tag $bid]
93a0: 29 20 5b 6c 69 73 74 20 72 65 76 20 24 63 68 69  ) [list rev $chi
93b0: 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20  ld]..}..foreach 
93c0: 7b 62 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61  {bid child} [sta
93d0: 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45  te run "..    SE
93e0: 4c 45 43 54 20 42 2e 62 69 64 2c 20 42 58 2e 62  LECT B.bid, BX.b
93f0: 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62  id..    FROM   b
9400: 72 61 6e 63 68 20 42 2c 20 70 72 65 66 65 72 65  ranch B, prefere
9410: 64 70 61 72 65 6e 74 20 50 2c 20 62 72 61 6e 63  dparent P, branc
9420: 68 20 42 58 0a 09 20 20 20 20 57 48 45 52 45 20  h BX..    WHERE 
9430: 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65   B.bid IN $these
9440: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e  t..    AND    B.
9450: 73 69 64 20 3d 20 50 2e 70 69 64 0a 09 20 20 20  sid = P.pid..   
9460: 20 41 4e 44 20 20 20 20 42 58 2e 73 69 64 20 3d   AND    BX.sid =
9470: 20 50 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20   P.sid.."] {..  
9480: 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64    lappend depend
9490: 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d  encies([list sym
94a0: 3a 3a 74 61 67 20 24 62 69 64 5d 29 20 5b 6c 69  ::tag $bid]) [li
94b0: 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24  st sym::branch $
94c0: 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65 61  child]..}..forea
94d0: 63 68 20 7b 62 69 64 20 63 68 69 6c 64 7d 20 5b  ch {bid child} [
94e0: 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20  state run "..   
94f0: 20 53 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 54   SELECT B.bid, T
9500: 2e 74 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  .tid..    FROM  
9510: 20 62 72 61 6e 63 68 20 42 2c 20 70 72 65 66 65   branch B, prefe
9520: 72 65 64 70 61 72 65 6e 74 20 50 2c 20 74 61 67  redparent P, tag
9530: 20 54 0a 09 20 20 20 20 57 48 45 52 45 20 20 42   T..    WHERE  B
9540: 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a  .bid IN $theset.
9550: 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 73 69  .    AND    B.si
9560: 64 20 3d 20 50 2e 70 69 64 0a 09 20 20 20 20 41  d = P.pid..    A
9570: 4e 44 20 20 20 20 54 2e 73 69 64 20 3d 20 50 2e  ND    T.sid = P.
9580: 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c  sid.."] {..    l
9590: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63  append dependenc
95a0: 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 74  ies([list sym::t
95b0: 61 67 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 20  ag $bid]) [list 
95c0: 73 79 6d 3a 3a 74 61 67 20 24 63 68 69 6c 64 5d  sym::tag $child]
95d0: 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  ..}..return.    
95e0: 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76 29  }..    # var(dv)
95f0: 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d 3e   = dict (item ->
9600: 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c 20 69   list (item)), i
9610: 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 79 70  tem  = list (typ
9620: 65 20 69 64 29 0a 20 20 20 20 74 79 70 65 6d 65  e id).    typeme
9630: 74 68 6f 64 20 70 72 65 64 65 63 65 73 73 6f 72  thod predecessor
9640: 73 20 7b 64 76 20 62 72 61 6e 63 68 65 73 7d 20  s {dv branches} 
9650: 7b 0a 09 23 20 54 68 65 20 70 72 65 64 65 63 65  {..# The predece
9660: 73 73 6f 72 73 20 6f 66 20 61 20 62 72 61 6e 63  ssors of a branc
9670: 68 20 61 72 65 20 61 6c 6c 20 74 68 65 20 72 65  h are all the re
9680: 76 69 73 69 6f 6e 73 20 74 68 65 0a 09 23 20 62  visions the..# b
9690: 72 61 6e 63 68 65 73 20 61 72 65 20 73 70 61 77  ranches are spaw
96a0: 6e 65 64 20 66 72 6f 6d 2c 20 61 73 20 77 65 6c  ned from, as wel
96b0: 6c 20 61 73 20 61 6c 6c 20 74 68 65 20 62 72 61  l as all the bra
96c0: 6e 63 68 65 73 20 6f 72 0a 09 23 20 74 61 67 73  nches or..# tags
96d0: 20 77 68 69 63 68 20 61 72 65 20 74 68 65 69 72   which are their
96e0: 20 70 72 65 66 65 72 65 64 20 70 61 72 65 6e 74   prefered parent
96f0: 73 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20  s....set theset 
9700: 28 27 5b 6a 6f 69 6e 20 24 74 61 67 73 20 7b 27  ('[join $tags {'
9710: 2c 27 7d 5d 27 29 0a 09 66 6f 72 65 61 63 68 20  ,'}]')..foreach 
9720: 7b 62 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 74  {bid parent} [st
9730: 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53  ate run "..    S
9740: 45 4c 45 43 54 20 42 2e 42 69 64 2c 20 52 2e 72  ELECT B.Bid, R.r
9750: 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62  id..    FROM   b
9760: 72 61 6e 63 68 20 42 2c 20 72 65 76 69 73 69 6f  ranch B, revisio
9770: 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 20  n R..    WHERE  
9780: 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65 74  B.bid IN $theset
9790: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 72  ..    AND    B.r
97a0: 6f 6f 74 20 3d 20 52 2e 72 69 64 0a 09 22 5d 20  oot = R.rid.."] 
97b0: 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64  {..    lappend d
97c0: 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73  ependencies([lis
97d0: 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 62  t sym::branch $b
97e0: 69 64 5d 29 20 5b 6c 69 73 74 20 72 65 76 20 24  id]) [list rev $
97f0: 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 66 6f 72 65  parent]..}..fore
9800: 61 63 68 20 7b 62 69 64 20 70 61 72 65 6e 74 7d  ach {bid parent}
9810: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20   [state run ".. 
9820: 20 20 20 53 45 4c 45 43 54 20 42 2e 62 69 64 2c     SELECT B.bid,
9830: 20 42 58 2e 62 69 64 0a 09 20 20 20 20 46 52 4f   BX.bid..    FRO
9840: 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20 70 72  M   branch B, pr
9850: 65 66 65 72 65 64 70 61 72 65 6e 74 20 50 2c 20  eferedparent P, 
9860: 62 72 61 6e 63 68 20 42 58 0a 09 20 20 20 20 57  branch BX..    W
9870: 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24  HERE  B.bid IN $
9880: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20  theset..    AND 
9890: 20 20 20 42 2e 73 69 64 20 3d 20 50 2e 73 69 64     B.sid = P.sid
98a0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70  ..    AND    P.p
98b0: 69 64 20 3d 20 42 58 2e 73 69 64 0a 09 22 5d 20  id = BX.sid.."] 
98c0: 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64  {..    lappend d
98d0: 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73  ependencies([lis
98e0: 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 62  t sym::branch $b
98f0: 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a  id]) [list sym::
9900: 62 72 61 6e 63 68 20 24 70 61 72 65 6e 74 5d 0a  branch $parent].
9910: 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64  .}..foreach {bid
9920: 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20   parent} [state 
9930: 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43  run "..    SELEC
9940: 54 20 42 2e 62 69 64 2c 20 54 2e 74 69 64 0a 09  T B.bid, T.tid..
9950: 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63      FROM   branc
9960: 68 20 42 2c 20 70 72 65 66 65 72 65 64 70 61 72  h B, preferedpar
9970: 65 6e 74 20 50 2c 20 74 61 67 20 54 0a 09 20 20  ent P, tag T..  
9980: 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49    WHERE  B.bid I
9990: 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41  N $theset..    A
99a0: 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50 2e  ND    B.sid = P.
99b0: 73 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20  sid..    AND    
99c0: 50 2e 70 69 64 20 3d 20 54 2e 73 69 64 0a 09 22  P.pid = T.sid.."
99d0: 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64  ] {..    lappend
99e0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c   dependencies([l
99f0: 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20  ist sym::branch 
9a00: 24 62 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d  $bid]) [list sym
9a10: 3a 3a 74 61 67 20 24 70 61 72 65 6e 74 5d 0a 09  ::tag $parent]..
9a20: 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  }..return.    }.
9a30: 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20  .    # # ## ### 
9a40: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23  ##### ######## #
9a50: 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 20 20  ############.   
9a60: 20 23 23 20 43 6f 6e 66 69 67 75 72 61 74 69 6f   ## Configuratio
9a70: 6e 0a 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68  n..    pragma -h
9a80: 61 73 69 6e 73 74 61 6e 63 65 73 20 20 20 6e 6f  asinstances   no
9a90: 20 3b 20 23 20 73 69 6e 67 6c 65 74 6f 6e 0a 20   ; # singleton. 
9aa0: 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79     pragma -hasty
9ab0: 70 65 69 6e 66 6f 20 20 20 20 6e 6f 20 3b 20 23  peinfo    no ; #
9ac0: 20 6e 6f 20 69 6e 74 72 6f 73 70 65 63 74 69 6f   no introspectio
9ad0: 6e 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61  n.    pragma -ha
9ae0: 73 74 79 70 65 64 65 73 74 72 6f 79 20 6e 6f 20  stypedestroy no 
9af0: 3b 20 23 20 69 6d 6d 6f 72 74 61 6c 0a 7d 0a 0a  ; # immortal.}..
9b00: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
9b10: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
9b20: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
9b30: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23  #############.##
9b40: 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c  ..namespace eval
9b50: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
9b60: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a  mport::cvs::proj
9b70: 65 63 74 20 7b 0a 20 20 20 20 6e 61 6d 65 73 70  ect {.    namesp
9b80: 61 63 65 20 65 78 70 6f 72 74 20 72 65 76 0a 20  ace export rev. 
9b90: 20 20 20 6e 61 6d 65 73 70 61 63 65 20 65 76 61     namespace eva
9ba0: 6c 20 72 65 76 20 7b 0a 09 6e 61 6d 65 73 70 61  l rev {..namespa
9bb0: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a  ce import ::vc::
9bc0: 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a  fossil::import::
9bd0: 63 76 73 3a 3a 73 74 61 74 65 0a 09 6e 61 6d 65  cvs::state..name
9be0: 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76  space import ::v
9bf0: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72  c::fossil::impor
9c00: 74 3a 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69 74  t::cvs::integrit
9c10: 79 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70  y..namespace imp
9c20: 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a  ort ::vc::tools:
9c30: 3a 6d 69 73 63 3a 3a 2a 0a 09 6e 61 6d 65 73 70  :misc::*..namesp
9c40: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a  ace import ::vc:
9c50: 3a 74 6f 6f 6c 73 3a 3a 74 72 6f 75 62 6c 65 0a  :tools::trouble.
9c60: 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72  .namespace impor
9c70: 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c  t ::vc::tools::l
9c80: 6f 67 0a 09 6c 6f 67 20 72 65 67 69 73 74 65 72  og..log register
9c90: 20 63 73 65 74 73 0a 0a 09 23 20 53 65 74 20 75   csets...# Set u
9ca0: 70 20 74 68 65 20 68 65 6c 70 65 72 20 73 69 6e  p the helper sin
9cb0: 67 6c 65 74 6f 6e 73 0a 09 6e 61 6d 65 73 70 61  gletons..namespa
9cc0: 63 65 20 65 76 61 6c 20 72 65 76 20 7b 0a 09 20  ce eval rev {.. 
9cd0: 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70     namespace imp
9ce0: 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c  ort ::vc::fossil
9cf0: 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73  ::import::cvs::s
9d00: 74 61 74 65 0a 09 20 20 20 20 6e 61 6d 65 73 70  tate..    namesp
9d10: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a  ace import ::vc:
9d20: 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a  :fossil::import:
9d30: 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a  :cvs::integrity.
9d40: 09 7d 0a 09 6e 61 6d 65 73 70 61 63 65 20 65 76  .}..namespace ev
9d50: 61 6c 20 73 79 6d 3a 3a 74 61 67 20 7b 0a 09 20  al sym::tag {.. 
9d60: 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70     namespace imp
9d70: 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c  ort ::vc::fossil
9d80: 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73  ::import::cvs::s
9d90: 74 61 74 65 0a 09 20 20 20 20 6e 61 6d 65 73 70  tate..    namesp
9da0: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a  ace import ::vc:
9db0: 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a  :fossil::import:
9dc0: 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a  :cvs::integrity.
9dd0: 09 7d 0a 09 6e 61 6d 65 73 70 61 63 65 20 65 76  .}..namespace ev
9de0: 61 6c 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 7b  al sym::branch {
9df0: 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20  ..    namespace 
9e00: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73  import ::vc::fos
9e10: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73  sil::import::cvs
9e20: 3a 3a 73 74 61 74 65 0a 09 20 20 20 20 6e 61 6d  ::state..    nam
9e30: 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a  espace import ::
9e40: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f  vc::fossil::impo
9e50: 72 74 3a 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69  rt::cvs::integri
9e60: 74 79 0a 09 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 23  ty..}.    }.}..#
9e70: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20   # ## ### ##### 
9e80: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
9e90: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
9ea0: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20  ############.## 
9eb0: 52 65 61 64 79 0a 0a 70 61 63 6b 61 67 65 20 70  Ready..package p
9ec0: 72 6f 76 69 64 65 20 76 63 3a 3a 66 6f 73 73 69  rovide vc::fossi
9ed0: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a  l::import::cvs::
9ee0: 70 72 6f 6a 65 63 74 3a 3a 72 65 76 20 31 2e 30  project::rev 1.0
9ef0: 0a 72 65 74 75 72 6e 0a                          .return.