Hex Artifact Content
Not logged in

Artifact 0103dd59f00e4283a08f62a66e4f6297fd18c578:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [fbfb531868] - Bugfix in ValidateFragments, tweaked comment a bit, bugfix in SQL, reordered tables in the successor/predecessor queries a bit to show the actual progression of their use. by aku on 2007-12-02 03:46:33.

0000: 23 23 20 2d 2a 2d 20 74 63 6c 20 2d 2a 2d 0a 23  ## -*- tcl -*-.#
0010: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20   # ## ### ##### 
0020: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
0030: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
0040: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20  ############.## 
0050: 43 6f 70 79 72 69 67 68 74 20 28 63 29 20 32 30  Copyright (c) 20
0060: 30 37 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69  07 Andreas Kupri
0070: 65 73 2e 0a 23 0a 23 20 54 68 69 73 20 73 6f 66  es..#.# This sof
0080: 74 77 61 72 65 20 69 73 20 6c 69 63 65 6e 73 65  tware is license
0090: 64 20 61 73 20 64 65 73 63 72 69 62 65 64 20 69  d as described i
00a0: 6e 20 74 68 65 20 66 69 6c 65 20 4c 49 43 45 4e  n the file LICEN
00b0: 53 45 2c 20 77 68 69 63 68 0a 23 20 79 6f 75 20  SE, which.# you 
00c0: 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65 63 65  should have rece
00d0: 69 76 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ived as part of 
00e0: 74 68 69 73 20 64 69 73 74 72 69 62 75 74 69 6f  this distributio
00f0: 6e 2e 0a 23 0a 23 20 54 68 69 73 20 73 6f 66 74  n..#.# This soft
0100: 77 61 72 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  ware consists of
0110: 20 76 6f 6c 75 6e 74 61 72 79 20 63 6f 6e 74 72   voluntary contr
0120: 69 62 75 74 69 6f 6e 73 20 6d 61 64 65 20 62 79  ibutions made by
0130: 20 6d 61 6e 79 0a 23 20 69 6e 64 69 76 69 64 75   many.# individu
0140: 61 6c 73 2e 20 20 46 6f 72 20 65 78 61 63 74 20  als.  For exact 
0150: 63 6f 6e 74 72 69 62 75 74 69 6f 6e 20 68 69 73  contribution his
0160: 74 6f 72 79 2c 20 73 65 65 20 74 68 65 20 72 65  tory, see the re
0170: 76 69 73 69 6f 6e 0a 23 20 68 69 73 74 6f 72 79  vision.# history
0180: 20 61 6e 64 20 6c 6f 67 73 2c 20 61 76 61 69 6c   and logs, avail
0190: 61 62 6c 65 20 61 74 20 68 74 74 70 3a 2f 2f 66  able at http://f
01a0: 6f 73 73 69 6c 2d 73 63 6d 2e 68 77 61 63 69 2e  ossil-scm.hwaci.
01b0: 63 6f 6d 2f 66 6f 73 73 69 6c 0a 23 20 23 20 23  com/fossil.# # #
01c0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
01d0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
01e0: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
01f0: 23 23 23 23 23 23 23 23 0a 0a 23 23 20 52 65 76  ########..## Rev
0200: 69 73 69 6f 6e 73 20 70 65 72 20 70 72 6f 6a 65  isions per proje
0210: 63 74 2c 20 61 6b 61 20 43 68 61 6e 67 65 73 65  ct, aka Changese
0220: 74 73 2e 20 54 68 65 73 65 20 6f 62 6a 65 63 74  ts. These object
0230: 73 20 61 72 65 20 66 69 72 73 74 20 75 73 65 64  s are first used
0240: 0a 23 23 20 69 6e 20 70 61 73 73 20 35 2c 20 77  .## in pass 5, w
0250: 68 69 63 68 20 63 72 65 61 74 65 73 20 74 68 65  hich creates the
0260: 20 69 6e 69 74 69 61 6c 20 73 65 74 20 63 6f 76   initial set cov
0270: 65 72 69 6e 67 20 74 68 65 20 72 65 70 6f 73 69  ering the reposi
0280: 74 6f 72 79 2e 0a 0a 23 20 23 20 23 23 20 23 23  tory...# # ## ##
0290: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
02a0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23   ############# #
02b0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
02c0: 23 23 23 23 0a 23 23 20 52 65 71 75 69 72 65 6d  ####.## Requirem
02d0: 65 6e 74 73 0a 0a 70 61 63 6b 61 67 65 20 72 65  ents..package re
02e0: 71 75 69 72 65 20 54 63 6c 20 38 2e 34 20 20 20  quire Tcl 8.4   
02f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0300: 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23 20              ; # 
0310: 52 65 71 75 69 72 65 64 20 72 75 6e 74 69 6d 65  Required runtime
0320: 2e 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72  ..package requir
0330: 65 20 73 6e 69 74 20 20 20 20 20 20 20 20 20 20  e snit          
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0350: 20 20 20 20 20 20 20 20 3b 20 23 20 4f 4f 20 73          ; # OO s
0360: 79 73 74 65 6d 2e 0a 70 61 63 6b 61 67 65 20 72  ystem..package r
0370: 65 71 75 69 72 65 20 73 74 72 75 63 74 3a 3a 73  equire struct::s
0380: 65 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  et              
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23               ; #
03a0: 20 53 65 74 20 6f 70 65 72 61 74 69 6f 6e 73 2e   Set operations.
03b0: 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65  .package require
03c0: 20 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69 73 63   vc::tools::misc
03d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03e0: 20 20 20 20 20 20 20 3b 20 23 20 54 65 78 74 20         ; # Text 
03f0: 66 6f 72 6d 61 74 74 69 6e 67 0a 70 61 63 6b 61  formatting.packa
0400: 67 65 20 72 65 71 75 69 72 65 20 76 63 3a 3a 74  ge require vc::t
0410: 6f 6f 6c 73 3a 3a 74 72 6f 75 62 6c 65 20 20 20  ools::trouble   
0420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0430: 20 3b 20 23 20 45 72 72 6f 72 20 72 65 70 6f 72   ; # Error repor
0440: 74 69 6e 67 2e 0a 70 61 63 6b 61 67 65 20 72 65  ting..package re
0450: 71 75 69 72 65 20 76 63 3a 3a 74 6f 6f 6c 73 3a  quire vc::tools:
0460: 3a 6c 6f 67 20 20 20 20 20 20 20 20 20 20 20 20  :log            
0470: 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23 20              ; # 
0480: 55 73 65 72 20 66 65 65 64 62 61 63 6b 2e 0a 70  User feedback..p
0490: 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 76  ackage require v
04a0: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72  c::fossil::impor
04b0: 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 20 20 20  t::cvs::state   
04c0: 20 20 20 20 20 3b 20 23 20 53 74 61 74 65 20 73       ; # State s
04d0: 74 6f 72 61 67 65 2e 0a 70 61 63 6b 61 67 65 20  torage..package 
04e0: 72 65 71 75 69 72 65 20 76 63 3a 3a 66 6f 73 73  require vc::foss
04f0: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a  il::import::cvs:
0500: 3a 69 6e 74 65 67 72 69 74 79 20 20 20 20 3b 20  :integrity    ; 
0510: 23 20 53 74 61 74 65 20 69 6e 74 65 67 72 69 74  # State integrit
0520: 79 20 63 68 65 63 6b 73 2e 0a 0a 23 20 23 20 23  y checks...# # #
0530: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
0540: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
0550: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
0560: 23 23 23 23 23 23 23 23 0a 23 23 0a 0a 73 6e 69  ########.##..sni
0570: 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f  t::type ::vc::fo
0580: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
0590: 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 20  s::project::rev 
05a0: 7b 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23  {.    # # ## ###
05b0: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20   ##### ######## 
05c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 20  #############.  
05d0: 20 20 23 23 20 50 75 62 6c 69 63 20 41 50 49 0a    ## Public API.
05e0: 0a 20 20 20 20 63 6f 6e 73 74 72 75 63 74 6f 72  .    constructor
05f0: 20 7b 70 72 6f 6a 65 63 74 20 63 73 74 79 70 65   {project cstype
0600: 20 73 72 63 69 64 20 69 74 65 6d 73 20 7b 74 68   srcid items {th
0610: 65 69 64 20 7b 7d 7d 7d 20 7b 0a 09 69 66 20 7b  eid {}}} {..if {
0620: 24 74 68 65 69 64 20 6e 65 20 22 22 7d 20 7b 0a  $theid ne ""} {.
0630: 09 20 20 20 20 73 65 74 20 6d 79 69 64 20 24 74  .    set myid $t
0640: 68 65 69 64 0a 09 7d 20 65 6c 73 65 20 7b 0a 09  heid..} else {..
0650: 20 20 20 20 73 65 74 20 6d 79 69 64 20 5b 69 6e      set myid [in
0660: 63 72 20 6d 79 63 6f 75 6e 74 65 72 5d 0a 09 7d  cr mycounter]..}
0670: 0a 0a 09 69 6e 74 65 67 72 69 74 79 20 61 73 73  ...integrity ass
0680: 65 72 74 20 7b 0a 09 20 20 20 20 5b 69 6e 66 6f  ert {..    [info
0690: 20 65 78 69 73 74 73 20 6d 79 63 73 74 79 70 65   exists mycstype
06a0: 28 24 63 73 74 79 70 65 29 5d 0a 09 7d 20 7b 42  ($cstype)]..} {B
06b0: 61 64 20 63 68 61 6e 67 65 73 65 74 20 74 79 70  ad changeset typ
06c0: 65 20 27 24 63 73 74 79 70 65 27 2e 7d 0a 0a 09  e '$cstype'.}...
06d0: 73 65 74 20 6d 79 70 72 6f 6a 65 63 74 20 20 20  set myproject   
06e0: 24 70 72 6f 6a 65 63 74 0a 09 73 65 74 20 6d 79  $project..set my
06f0: 74 79 70 65 20 20 20 20 20 20 24 63 73 74 79 70  type      $cstyp
0700: 65 0a 09 73 65 74 20 6d 79 74 79 70 65 6f 62 6a  e..set mytypeobj
0710: 20 20 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a     ::vc::fossil:
0720: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72  :import::cvs::pr
0730: 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 24 7b 63 73  oject::rev::${cs
0740: 74 79 70 65 7d 0a 09 73 65 74 20 6d 79 73 72 63  type}..set mysrc
0750: 69 64 09 24 73 72 63 69 64 0a 09 73 65 74 20 6d  id.$srcid..set m
0760: 79 69 74 65 6d 73 20 20 20 20 20 24 69 74 65 6d  yitems     $item
0770: 73 0a 09 73 65 74 20 6d 79 70 6f 73 20 20 20 20  s..set mypos    
0780: 20 20 20 7b 7d 20 3b 20 23 20 43 6f 6d 6d 69 74     {} ; # Commit
0790: 20 6c 6f 63 61 74 69 6f 6e 20 69 73 20 6e 6f 74   location is not
07a0: 20 6b 6e 6f 77 6e 20 79 65 74 2e 0a 0a 09 23 20   known yet....# 
07b0: 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
07c0: 65 20 67 65 6e 65 72 61 74 65 64 20 63 68 61 6e  e generated chan
07d0: 67 65 73 65 74 73 20 61 6e 64 20 6f 66 20 74 68  gesets and of th
07e0: 65 20 69 6e 76 65 72 73 65 0a 09 23 20 6d 61 70  e inverse..# map
07f0: 70 69 6e 67 20 66 72 6f 6d 20 69 74 65 6d 73 20  ping from items 
0800: 74 6f 20 74 68 65 6d 2e 0a 09 6c 61 70 70 65 6e  to them...lappen
0810: 64 20 6d 79 63 68 61 6e 67 65 73 65 74 73 20 20  d mychangesets  
0820: 20 24 73 65 6c 66 0a 09 73 65 74 20 20 20 20 20   $self..set     
0830: 6d 79 69 64 6d 61 70 28 24 6d 79 69 64 29 20 24  myidmap($myid) $
0840: 73 65 6c 66 0a 09 66 6f 72 65 61 63 68 20 69 69  self..foreach ii
0850: 64 20 24 69 74 65 6d 73 20 7b 0a 09 20 20 20 20  d $items {..    
0860: 73 65 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 63  set key [list $c
0870: 73 74 79 70 65 20 24 69 69 64 5d 0a 09 20 20 20  stype $iid]..   
0880: 20 73 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24   set myitemmap($
0890: 6b 65 79 29 20 24 73 65 6c 66 0a 09 20 20 20 20  key) $self..    
08a0: 6c 61 70 70 65 6e 64 20 6d 79 74 69 74 65 6d 73  lappend mytitems
08b0: 20 24 6b 65 79 0a 09 20 20 20 20 6c 6f 67 20 77   $key..    log w
08c0: 72 69 74 65 20 38 20 63 73 65 74 73 20 7b 4d 41  rite 8 csets {MA
08d0: 50 2b 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24  P+ item <$key> $
08e0: 73 65 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74  self = [$self st
08f0: 72 5d 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20  r]}..}..return. 
0900: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64     }..    method
0910: 20 73 74 72 20 7b 7d 20 7b 0a 09 73 65 74 20 73   str {} {..set s
0920: 74 72 20 20 20 20 22 3c 22 0a 09 73 65 74 20 64  tr    "<"..set d
0930: 65 74 61 69 6c 20 22 22 0a 09 69 66 20 7b 5b 24  etail ""..if {[$
0940: 6d 79 74 79 70 65 6f 62 6a 20 62 79 73 79 6d 62  mytypeobj bysymb
0950: 6f 6c 5d 7d 20 7b 0a 09 20 20 20 20 73 65 74 20  ol]} {..    set 
0960: 64 65 74 61 69 6c 20 22 20 27 5b 73 74 61 74 65  detail " '[state
0970: 20 6f 6e 65 20 7b 0a 09 09 53 45 4c 45 43 54 20   one {...SELECT 
0980: 53 2e 6e 61 6d 65 0a 09 09 46 52 4f 4d 20 20 20  S.name...FROM   
0990: 73 79 6d 62 6f 6c 20 53 0a 09 09 57 48 45 52 45  symbol S...WHERE
09a0: 20 20 53 2e 73 69 64 20 3d 20 24 6d 79 73 72 63    S.sid = $mysrc
09b0: 69 64 0a 09 20 20 20 20 7d 5d 27 22 0a 09 7d 0a  id..    }]'"..}.
09c0: 09 61 70 70 65 6e 64 20 73 74 72 20 22 24 6d 79  .append str "$my
09d0: 74 79 70 65 20 24 7b 6d 79 69 64 7d 24 7b 64 65  type ${myid}${de
09e0: 74 61 69 6c 7d 3e 22 0a 09 72 65 74 75 72 6e 20  tail}>"..return 
09f0: 24 73 74 72 0a 20 20 20 20 7d 0a 0a 20 20 20 20  $str.    }..    
0a00: 6d 65 74 68 6f 64 20 69 64 20 20 20 20 7b 7d 20  method id    {} 
0a10: 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 64 20 7d  { return $myid }
0a20: 0a 20 20 20 20 6d 65 74 68 6f 64 20 69 74 65 6d  .    method item
0a30: 73 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d  s {} { return $m
0a40: 79 74 69 74 65 6d 73 20 7d 0a 20 20 20 20 6d 65  ytitems }.    me
0a50: 74 68 6f 64 20 64 61 74 61 20 20 7b 7d 20 7b 20  thod data  {} { 
0a60: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 6d 79  return [list $my
0a70: 70 72 6f 6a 65 63 74 20 24 6d 79 74 79 70 65 20  project $mytype 
0a80: 24 6d 79 73 72 63 69 64 5d 20 7d 0a 0a 20 20 20  $mysrcid] }..   
0a90: 20 64 65 6c 65 67 61 74 65 20 6d 65 74 68 6f 64   delegate method
0aa0: 20 62 79 73 79 6d 62 6f 6c 20 20 20 74 6f 20 6d   bysymbol   to m
0ab0: 79 74 79 70 65 6f 62 6a 0a 20 20 20 20 64 65 6c  ytypeobj.    del
0ac0: 65 67 61 74 65 20 6d 65 74 68 6f 64 20 62 79 72  egate method byr
0ad0: 65 76 69 73 69 6f 6e 20 74 6f 20 6d 79 74 79 70  evision to mytyp
0ae0: 65 6f 62 6a 0a 20 20 20 20 64 65 6c 65 67 61 74  eobj.    delegat
0af0: 65 20 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63  e method isbranc
0b00: 68 20 20 20 74 6f 20 6d 79 74 79 70 65 6f 62 6a  h   to mytypeobj
0b10: 0a 20 20 20 20 64 65 6c 65 67 61 74 65 20 6d 65  .    delegate me
0b20: 74 68 6f 64 20 69 73 74 61 67 20 20 20 20 20 20  thod istag      
0b30: 74 6f 20 6d 79 74 79 70 65 6f 62 6a 0a 0a 20 20  to mytypeobj..  
0b40: 20 20 6d 65 74 68 6f 64 20 73 65 74 70 6f 73 20    method setpos 
0b50: 7b 70 7d 20 7b 20 73 65 74 20 6d 79 70 6f 73 20  {p} { set mypos 
0b60: 24 70 20 3b 20 72 65 74 75 72 6e 20 7d 0a 20 20  $p ; return }.  
0b70: 20 20 6d 65 74 68 6f 64 20 70 6f 73 20 20 20 20    method pos    
0b80: 7b 7d 20 20 7b 20 72 65 74 75 72 6e 20 24 6d 79  {}  { return $my
0b90: 70 6f 73 20 7d 0a 0a 20 20 20 20 23 20 72 65 73  pos }..    # res
0ba0: 75 6c 74 20 3d 20 64 69 63 74 20 28 69 74 65 6d  ult = dict (item
0bb0: 20 2d 3e 20 6c 69 73 74 20 28 63 68 61 6e 67 65   -> list (change
0bc0: 73 65 74 29 29 0a 20 20 20 20 6d 65 74 68 6f 64  set)).    method
0bd0: 20 73 75 63 63 65 73 73 6f 72 6d 61 70 20 7b 7d   successormap {}
0be0: 20 7b 0a 09 23 20 4e 4f 54 45 20 2f 20 46 55 54   {..# NOTE / FUT
0bf0: 55 52 45 3a 20 50 6f 73 73 69 62 6c 65 20 62 6f  URE: Possible bo
0c00: 74 74 6c 65 6e 65 63 6b 2e 0a 09 61 72 72 61 79  ttleneck...array
0c10: 20 73 65 74 20 74 6d 70 20 7b 7d 0a 09 66 6f 72   set tmp {}..for
0c20: 65 61 63 68 20 7b 72 65 76 20 63 68 69 6c 64 72  each {rev childr
0c30: 65 6e 7d 20 5b 24 73 65 6c 66 20 6e 65 78 74 6d  en} [$self nextm
0c40: 61 70 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65 61  ap] {..    forea
0c50: 63 68 20 63 68 69 6c 64 20 24 63 68 69 6c 64 72  ch child $childr
0c60: 65 6e 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 74  en {...lappend t
0c70: 6d 70 28 24 72 65 76 29 20 24 6d 79 69 74 65 6d  mp($rev) $myitem
0c80: 6d 61 70 28 24 63 68 69 6c 64 29 0a 09 20 20 20  map($child)..   
0c90: 20 7d 0a 09 20 20 20 20 73 65 74 20 74 6d 70 28   }..    set tmp(
0ca0: 24 72 65 76 29 20 5b 6c 73 6f 72 74 20 2d 75 6e  $rev) [lsort -un
0cb0: 69 71 75 65 20 24 74 6d 70 28 24 72 65 76 29 5d  ique $tmp($rev)]
0cc0: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b 61 72 72  ..}..return [arr
0cd0: 61 79 20 67 65 74 20 74 6d 70 5d 0a 20 20 20 20  ay get tmp].    
0ce0: 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20  }..    # result 
0cf0: 3d 20 6c 69 73 74 20 28 63 68 61 6e 67 65 73 65  = list (changese
0d00: 74 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 75  t).    method su
0d10: 63 63 65 73 73 6f 72 73 20 7b 7d 20 7b 0a 09 23  ccessors {} {..#
0d20: 20 4e 4f 54 45 20 2f 20 46 55 54 55 52 45 3a 20   NOTE / FUTURE: 
0d30: 50 6f 73 73 69 62 6c 65 20 62 6f 74 74 6c 65 6e  Possible bottlen
0d40: 65 63 6b 2e 0a 09 73 65 74 20 63 73 65 74 73 20  eck...set csets 
0d50: 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 5f 20 63  {}..foreach {_ c
0d60: 68 69 6c 64 72 65 6e 7d 20 5b 24 73 65 6c 66 20  hildren} [$self 
0d70: 6e 65 78 74 6d 61 70 5d 20 7b 0a 09 20 20 20 20  nextmap] {..    
0d80: 66 6f 72 65 61 63 68 20 63 68 69 6c 64 20 24 63  foreach child $c
0d90: 68 69 6c 64 72 65 6e 20 7b 0a 09 09 6c 61 70 70  hildren {...lapp
0da0: 65 6e 64 20 63 73 65 74 73 20 24 6d 79 69 74 65  end csets $myite
0db0: 6d 6d 61 70 28 24 63 68 69 6c 64 29 0a 09 20 20  mmap($child)..  
0dc0: 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 20 5b    }..}..return [
0dd0: 6c 73 6f 72 74 20 2d 75 6e 69 71 75 65 20 24 63  lsort -unique $c
0de0: 73 65 74 73 5d 0a 20 20 20 20 7d 0a 0a 20 20 20  sets].    }..   
0df0: 20 23 20 72 65 73 75 6c 74 20 3d 20 64 69 63 74   # result = dict
0e00: 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28   (item -> list (
0e10: 63 68 61 6e 67 65 73 65 74 29 29 0a 20 20 20 20  changeset)).    
0e20: 6d 65 74 68 6f 64 20 70 72 65 64 65 63 65 73 73  method predecess
0e30: 6f 72 6d 61 70 20 7b 7d 20 7b 0a 09 23 20 4e 4f  ormap {} {..# NO
0e40: 54 45 20 2f 20 46 55 54 55 52 45 3a 20 50 6f 73  TE / FUTURE: Pos
0e50: 73 69 62 6c 65 20 62 6f 74 74 6c 65 6e 65 63 6b  sible bottleneck
0e60: 2e 0a 09 61 72 72 61 79 20 73 65 74 20 74 6d 70  ...array set tmp
0e70: 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 65   {}..foreach {re
0e80: 76 20 63 68 69 6c 64 72 65 6e 7d 20 5b 24 73 65  v children} [$se
0e90: 6c 66 20 70 72 65 6d 61 70 5d 20 7b 0a 09 20 20  lf premap] {..  
0ea0: 20 20 66 6f 72 65 61 63 68 20 63 68 69 6c 64 20    foreach child 
0eb0: 24 63 68 69 6c 64 72 65 6e 20 7b 0a 09 09 6c 61  $children {...la
0ec0: 70 70 65 6e 64 20 74 6d 70 28 24 72 65 76 29 20  ppend tmp($rev) 
0ed0: 24 6d 79 69 74 65 6d 6d 61 70 28 24 63 68 69 6c  $myitemmap($chil
0ee0: 64 29 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 73  d)..    }..    s
0ef0: 65 74 20 74 6d 70 28 24 72 65 76 29 20 5b 6c 73  et tmp($rev) [ls
0f00: 6f 72 74 20 2d 75 6e 69 71 75 65 20 24 74 6d 70  ort -unique $tmp
0f10: 28 24 72 65 76 29 5d 0a 09 7d 0a 09 72 65 74 75  ($rev)]..}..retu
0f20: 72 6e 20 5b 61 72 72 61 79 20 67 65 74 20 74 6d  rn [array get tm
0f30: 70 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  p].    }..    # 
0f40: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74  item -> list (it
0f50: 65 6d 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 6e  em).    method n
0f60: 65 78 74 6d 61 70 20 7b 7d 20 7b 0a 09 69 66 20  extmap {} {..if 
0f70: 7b 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 6e 65 78  {[llength $mynex
0f80: 74 6d 61 70 5d 7d 20 7b 20 72 65 74 75 72 6e 20  tmap]} { return 
0f90: 24 6d 79 6e 65 78 74 6d 61 70 20 7d 0a 09 24 6d  $mynextmap }..$m
0fa0: 79 74 79 70 65 6f 62 6a 20 73 75 63 63 65 73 73  ytypeobj success
0fb0: 6f 72 73 20 74 6d 70 20 24 6d 79 69 74 65 6d 73  ors tmp $myitems
0fc0: 0a 09 73 65 74 20 6d 79 6e 65 78 74 6d 61 70 20  ..set mynextmap 
0fd0: 5b 61 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a  [array get tmp].
0fe0: 09 72 65 74 75 72 6e 20 24 6d 79 6e 65 78 74 6d  .return $mynextm
0ff0: 61 70 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  ap.    }..    # 
1000: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74  item -> list (it
1010: 65 6d 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 70  em).    method p
1020: 72 65 6d 61 70 20 7b 7d 20 7b 0a 09 69 66 20 7b  remap {} {..if {
1030: 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 70 72 65 6d  [llength $myprem
1040: 61 70 5d 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d  ap]} { return $m
1050: 79 70 72 65 6d 61 70 20 7d 0a 09 24 6d 79 74 79  ypremap }..$myty
1060: 70 65 6f 62 6a 20 70 72 65 64 65 63 65 73 73 6f  peobj predecesso
1070: 72 73 20 74 6d 70 20 24 6d 79 69 74 65 6d 73 0a  rs tmp $myitems.
1080: 09 73 65 74 20 6d 79 70 72 65 6d 61 70 20 5b 61  .set mypremap [a
1090: 72 72 61 79 20 67 65 74 20 74 6d 70 5d 0a 09 72  rray get tmp]..r
10a0: 65 74 75 72 6e 20 24 6d 79 70 72 65 6d 61 70 0a  eturn $mypremap.
10b0: 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f      }..    metho
10c0: 64 20 62 72 65 61 6b 69 6e 74 65 72 6e 61 6c 64  d breakinternald
10d0: 65 70 65 6e 64 65 6e 63 69 65 73 20 7b 7d 20 7b  ependencies {} {
10e0: 0a 0a 09 23 23 0a 09 23 23 20 4e 4f 54 45 3a 20  ...##..## NOTE: 
10f0: 54 68 69 73 20 6d 65 74 68 6f 64 2c 20 6d 61 79  This method, may
1100: 62 65 20 69 6e 20 63 6f 6e 6a 75 6e 63 74 69 6f  be in conjunctio
1110: 6e 20 77 69 74 68 20 69 74 73 20 63 61 6c 6c 65  n with its calle
1120: 72 0a 09 23 23 20 20 20 20 20 20 20 73 65 65 6d  r..##       seem
1130: 73 20 74 6f 20 62 65 20 61 20 6d 65 6d 6f 72 79  s to be a memory
1140: 20 68 6f 67 2c 20 65 73 70 65 63 69 61 6c 6c 79   hog, especially
1150: 20 66 6f 72 20 6c 61 72 67 65 0a 09 23 23 20 20   for large..##  
1160: 20 20 20 20 20 63 68 61 6e 67 65 73 65 74 73 2c       changesets,
1170: 20 77 69 74 68 20 27 6c 61 72 67 65 27 20 6d 65   with 'large' me
1180: 61 6e 69 6e 67 20 74 6f 20 68 61 76 65 20 61 20  aning to have a 
1190: 27 6c 6f 6e 67 20 6c 69 73 74 0a 09 23 23 20 20  'long list..##  
11a0: 20 20 20 20 20 6f 66 20 69 74 65 6d 73 2c 20 73       of items, s
11b0: 65 76 65 72 61 6c 20 74 68 6f 75 73 61 6e 64 27  everal thousand'
11c0: 2e 20 49 6e 76 65 73 74 69 67 61 74 65 20 77 68  . Investigate wh
11d0: 65 72 65 20 74 68 65 0a 09 23 23 20 20 20 20 20  ere the..##     
11e0: 20 20 6d 65 6d 6f 72 79 20 69 73 20 73 70 65 6e    memory is spen
11f0: 74 20 61 6e 64 20 74 68 65 6e 20 6c 6f 6f 6b 20  t and then look 
1200: 66 6f 72 20 77 61 79 73 20 6f 66 20 72 65 63 74  for ways of rect
1210: 69 66 79 69 6e 67 0a 09 23 23 20 20 20 20 20 20  ifying..##      
1220: 20 74 68 65 20 70 72 6f 62 6c 65 6d 2e 0a 09 23   the problem...#
1230: 23 0a 0a 09 23 20 54 68 69 73 20 6d 65 74 68 6f  #...# This metho
1240: 64 20 69 6e 73 70 65 63 74 73 20 74 68 65 20 63  d inspects the c
1250: 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20 69 6e  hangesets for in
1260: 74 65 72 6e 61 6c 0a 09 23 20 64 65 70 65 6e 64  ternal..# depend
1270: 65 6e 63 69 65 73 2e 20 4e 6f 74 68 69 6e 67 20  encies. Nothing 
1280: 69 73 20 64 6f 6e 65 20 69 66 20 74 68 65 72 65  is done if there
1290: 20 61 72 65 20 6e 6f 0a 09 23 20 73 75 63 68 2e   are no..# such.
12a0: 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63   Otherwise the c
12b0: 68 61 6e 67 65 73 65 74 20 69 73 20 73 70 6c 69  hangeset is spli
12c0: 74 20 69 6e 74 6f 20 61 20 73 65 74 20 6f 66 0a  t into a set of.
12d0: 09 23 20 66 72 61 67 6d 65 6e 74 73 20 77 69 74  .# fragments wit
12e0: 68 6f 75 74 20 69 6e 74 65 72 6e 61 6c 20 64 65  hout internal de
12f0: 70 65 6e 64 65 6e 63 69 65 73 2c 20 74 72 61 6e  pendencies, tran
1300: 73 66 6f 72 6d 69 6e 67 20 74 68 65 0a 09 23 20  sforming the..# 
1310: 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65  internal depende
1320: 6e 63 69 65 73 20 69 6e 74 6f 20 65 78 74 65 72  ncies into exter
1330: 6e 61 6c 20 6f 6e 65 73 2e 20 54 68 65 20 6e 65  nal ones. The ne
1340: 77 20 63 68 61 6e 67 65 73 65 74 73 0a 09 23 20  w changesets..# 
1350: 61 72 65 20 61 64 64 65 64 20 74 6f 20 74 68 65  are added to the
1360: 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 68 61   list of all cha
1370: 6e 67 65 73 65 74 73 2e 0a 0a 09 23 20 57 65 20  ngesets....# We 
1380: 70 65 72 66 6f 72 6d 20 61 6c 6c 20 6e 65 63 65  perform all nece
1390: 73 73 61 72 79 20 73 70 6c 69 74 73 20 69 6e 20  ssary splits in 
13a0: 6f 6e 65 20 67 6f 2c 20 69 6e 73 74 65 61 64 20  one go, instead 
13b0: 6f 66 20 6f 6e 6c 79 0a 09 23 20 6f 6e 65 2e 20  of only..# one. 
13c0: 54 68 65 20 70 72 65 76 69 6f 75 73 20 61 6c 67  The previous alg
13d0: 6f 72 69 74 68 6d 2c 20 61 64 61 70 74 65 64 20  orithm, adapted 
13e0: 66 72 6f 6d 20 63 76 73 32 73 76 6e 2c 20 63 6f  from cvs2svn, co
13f0: 6d 70 75 74 65 64 0a 09 23 20 61 20 6c 6f 74 20  mputed..# a lot 
1400: 6f 66 20 73 74 61 74 65 20 77 68 69 63 68 20 77  of state which w
1410: 61 73 20 74 68 72 6f 77 6e 20 61 77 61 79 20 61  as thrown away a
1420: 6e 64 20 74 68 65 6e 20 63 6f 6d 70 75 74 65 64  nd then computed
1430: 20 61 67 61 69 6e 0a 09 23 20 66 6f 72 20 65 61   again..# for ea
1440: 63 68 20 6f 66 20 74 68 65 20 66 72 61 67 6d 65  ch of the fragme
1450: 6e 74 73 2e 20 49 74 20 73 68 6f 75 6c 64 20 62  nts. It should b
1460: 65 20 65 61 73 69 65 72 20 74 6f 20 75 70 64 61  e easier to upda
1470: 74 65 20 61 6e 64 0a 09 23 20 72 65 75 73 65 20  te and..# reuse 
1480: 74 68 61 74 20 73 74 61 74 65 2e 0a 0a 09 23 20  that state....# 
1490: 54 68 65 20 63 6f 64 65 20 63 68 65 63 6b 73 20  The code checks 
14a0: 6f 6e 6c 79 20 73 75 63 65 73 73 6f 72 20 64 65  only sucessor de
14b0: 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 20 74  pendencies, as t
14c0: 68 69 73 0a 09 23 20 61 75 74 6f 6d 61 74 69 63  his..# automatic
14d0: 61 6c 6c 79 20 63 6f 76 65 72 73 20 74 68 65 20  ally covers the 
14e0: 70 72 65 64 65 63 65 73 73 6f 72 20 64 65 70 65  predecessor depe
14f0: 6e 64 65 6e 63 69 65 73 20 61 73 20 77 65 6c 6c  ndencies as well
1500: 20 28 41 0a 09 23 20 73 75 63 63 65 73 73 6f 72   (A..# successor
1510: 20 64 65 70 65 6e 64 65 6e 63 79 20 61 20 2d 3e   dependency a ->
1520: 20 62 20 69 73 20 61 6c 73 6f 20 61 20 70 72 65   b is also a pre
1530: 64 65 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65  decessor depende
1540: 6e 63 79 0a 09 23 20 62 20 2d 3e 20 61 29 2e 0a  ncy..# b -> a)..
1550: 0a 09 23 20 41 72 72 61 79 20 6f 66 20 64 65 70  ..# Array of dep
1560: 65 6e 64 65 6e 63 69 65 73 20 28 70 61 72 65 6e  endencies (paren
1570: 74 20 2d 3e 20 63 68 69 6c 64 29 2e 20 54 68 69  t -> child). Thi
1580: 73 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d  s is pulled from
1590: 0a 09 23 20 74 68 65 20 73 74 61 74 65 2c 20 61  ..# the state, a
15a0: 6e 64 20 6c 69 6d 69 74 65 64 20 74 6f 20 73 75  nd limited to su
15b0: 63 63 65 73 73 6f 72 73 20 77 69 74 68 69 6e 20  ccessors within 
15c0: 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a  the changeset...
15d0: 09 61 72 72 61 79 20 73 65 74 20 64 65 70 65 6e  .array set depen
15e0: 64 65 6e 63 69 65 73 20 7b 7d 0a 09 24 6d 79 74  dencies {}..$myt
15f0: 79 70 65 6f 62 6a 20 69 6e 74 65 72 6e 61 6c 73  ypeobj internals
1600: 75 63 63 65 73 73 6f 72 73 20 64 65 70 65 6e 64  uccessors depend
1610: 65 6e 63 69 65 73 20 24 6d 79 69 74 65 6d 73 0a  encies $myitems.
1620: 09 69 66 20 7b 21 5b 61 72 72 61 79 20 73 69 7a  .if {![array siz
1630: 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73 5d 7d  e dependencies]}
1640: 20 7b 72 65 74 75 72 6e 20 30 7d 20 3b 20 23 20   {return 0} ; # 
1650: 4e 6f 74 68 69 6e 67 20 74 6f 20 62 72 65 61 6b  Nothing to break
1660: 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 35 20  ....log write 5 
1670: 63 73 65 74 73 20 2e 2e 2e 5b 24 73 65 6c 66 20  csets ...[$self 
1680: 73 74 72 5d 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  str]............
1690: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
16a0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
16b0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 0a 0a 09 23 20  ..............# 
16c0: 57 65 20 68 61 76 65 20 69 6e 74 65 72 6e 61 6c  We have internal
16d0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74 6f   dependencies to
16e0: 20 62 72 65 61 6b 2e 20 57 65 20 6e 6f 77 20 69   break. We now i
16f0: 74 65 72 61 74 65 20 6f 76 65 72 0a 09 23 20 61  terate over..# a
1700: 6c 6c 20 70 6f 73 69 74 69 6f 6e 73 20 69 6e 20  ll positions in 
1710: 74 68 65 20 6c 69 73 74 20 28 77 68 69 63 68 20  the list (which 
1720: 69 73 20 63 68 72 6f 6e 6f 6c 6f 67 69 63 61 6c  is chronological
1730: 2c 20 61 74 20 6c 65 61 73 74 0a 09 23 20 61 73  , at least..# as
1740: 20 66 61 72 20 61 73 20 74 68 65 20 74 69 6d 65   far as the time
1750: 73 74 61 6d 70 73 20 61 72 65 20 63 6f 72 72 65  stamps are corre
1760: 63 74 20 61 6e 64 20 75 6e 69 71 75 65 29 20 61  ct and unique) a
1770: 6e 64 0a 09 23 20 64 65 74 65 72 6d 69 6e 65 20  nd..# determine 
1780: 74 68 65 20 62 65 73 74 20 70 6f 73 69 74 69 6f  the best positio
1790: 6e 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b 2c  n for the break,
17a0: 20 62 79 20 74 72 79 69 6e 67 20 74 6f 0a 09 23   by trying to..#
17b0: 20 62 72 65 61 6b 20 61 73 20 6d 61 6e 79 20 64   break as many d
17c0: 65 70 65 6e 64 65 6e 63 69 65 73 20 61 73 20 70  ependencies as p
17d0: 6f 73 73 69 62 6c 65 20 69 6e 20 6f 6e 65 20 67  ossible in one g
17e0: 6f 2e 20 57 68 65 6e 20 61 0a 09 23 20 62 72 65  o. When a..# bre
17f0: 61 6b 20 77 61 73 20 66 6f 75 6e 64 20 74 68 69  ak was found thi
1800: 73 20 69 73 20 72 65 64 6f 6e 65 20 66 6f 72 20  s is redone for 
1810: 74 68 65 20 66 72 61 67 6d 65 6e 74 73 20 63 6f  the fragments co
1820: 6d 69 6e 67 20 61 6e 64 0a 09 23 20 61 66 74 65  ming and..# afte
1830: 72 2c 20 61 66 74 65 72 20 75 70 64 69 6e 67 20  r, after upding 
1840: 74 68 65 20 63 72 6f 73 73 69 6e 67 20 69 6e 66  the crossing inf
1850: 6f 72 6d 61 74 69 6f 6e 2e 0a 0a 09 23 20 44 61  ormation....# Da
1860: 74 61 20 73 74 72 75 63 74 75 72 65 73 3a 0a 09  ta structures:..
1870: 23 20 4d 61 70 3a 20 20 50 4f 53 20 20 20 72 65  # Map:  POS   re
1880: 76 69 73 69 6f 6e 20 69 64 20 20 20 20 20 20 2d  vision id      -
1890: 3e 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69  > position in li
18a0: 73 74 2e 0a 09 23 20 20 20 20 20 20 20 43 52 4f  st...#       CRO
18b0: 53 53 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c  SS position in l
18c0: 69 73 74 20 2d 3e 20 6e 75 6d 62 65 72 20 6f 66  ist -> number of
18d0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 63 72   dependencies cr
18e0: 6f 73 73 69 6e 67 20 69 74 0a 09 23 20 20 20 20  ossing it..#    
18f0: 20 20 20 44 45 50 43 20 20 64 65 70 65 6e 64 65     DEPC  depende
1900: 6e 63 79 20 20 20 20 20 20 20 2d 3e 20 70 6f 73  ncy       -> pos
1910: 69 74 69 6f 6e 73 20 69 74 20 63 72 6f 73 73 65  itions it crosse
1920: 73 0a 09 23 20 4c 69 73 74 3a 20 52 41 4e 47 45  s..# List: RANGE
1930: 20 4f 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e   Of the position
1940: 73 20 69 74 73 65 6c 66 2e 0a 09 23 20 41 20 64  s itself...# A d
1950: 65 70 65 6e 64 65 6e 63 79 20 69 73 20 61 20 73  ependency is a s
1960: 69 6e 67 6c 65 2d 65 6c 65 6d 65 6e 74 20 6d 61  ingle-element ma
1970: 70 20 70 61 72 65 6e 74 20 2d 3e 20 63 68 69 6c  p parent -> chil
1980: 64 0a 0a 09 49 6e 69 74 69 61 6c 69 7a 65 42 72  d...InitializeBr
1990: 65 61 6b 53 74 61 74 65 20 24 6d 79 69 74 65 6d  eakState $myitem
19a0: 73 0a 0a 09 73 65 74 20 66 72 61 67 6d 65 6e 74  s...set fragment
19b0: 73 20 7b 7d 0a 09 73 65 74 20 6e 65 77 20 20 20  s {}..set new   
19c0: 20 20 20 20 5b 6c 69 73 74 20 24 72 61 6e 67 65      [list $range
19d0: 5d 0a 09 61 72 72 61 79 20 73 65 74 20 62 72 65  ]..array set bre
19e0: 61 6b 73 20 7b 7d 0a 0a 09 23 20 49 6e 73 74 65  aks {}...# Inste
19f0: 61 64 20 6f 66 20 6f 6e 65 20 6c 69 73 74 20 68  ad of one list h
1a00: 6f 6c 64 69 6e 67 20 62 6f 74 68 20 70 72 6f 63  olding both proc
1a10: 65 73 73 65 64 20 61 6e 64 20 70 65 6e 64 69 6e  essed and pendin
1a20: 67 0a 09 23 20 66 72 61 67 6d 65 6e 74 73 20 77  g..# fragments w
1a30: 65 20 75 73 65 20 74 77 6f 2c 20 6f 6e 65 20 66  e use two, one f
1a40: 6f 72 20 74 68 65 20 66 72 61 6d 65 6e 74 73 20  or the framents 
1a50: 74 6f 20 70 72 6f 63 65 73 73 2c 20 6f 6e 65 0a  to process, one.
1a60: 09 23 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e  .# to hold the n
1a70: 65 77 20 66 72 61 67 6d 65 6e 74 73 2c 20 61 6e  ew fragments, an
1a80: 64 20 74 68 65 20 6c 61 74 74 65 72 20 69 73 20  d the latter is 
1a90: 63 6f 70 69 65 64 20 74 6f 20 74 68 65 0a 09 23  copied to the..#
1aa0: 20 66 6f 72 6d 65 72 20 77 68 65 6e 20 74 68 65   former when the
1ab0: 79 20 72 75 6e 20 6f 75 74 2e 20 54 68 69 73 20  y run out. This 
1ac0: 6b 65 65 70 73 20 74 68 65 20 6c 69 73 74 20 6f  keeps the list o
1ad0: 66 20 70 65 6e 64 69 6e 67 0a 09 23 20 66 72 61  f pending..# fra
1ae0: 67 6d 65 6e 74 73 20 73 68 6f 72 74 20 77 69 74  gments short wit
1af0: 68 6f 75 74 20 73 61 63 72 69 66 69 63 69 6e 67  hout sacrificing
1b00: 20 73 70 65 65 64 20 62 79 20 73 68 69 66 74 69   speed by shifti
1b10: 6e 67 20 73 74 75 66 66 0a 09 23 20 64 6f 77 6e  ng stuff..# down
1b20: 2e 20 57 65 20 65 73 70 65 63 69 61 6c 6c 79 20  . We especially 
1b30: 64 72 6f 70 20 74 68 65 20 6d 65 6d 6f 72 79 20  drop the memory 
1b40: 6f 66 20 66 72 61 67 6d 65 6e 74 73 20 62 72 6f  of fragments bro
1b50: 6b 65 6e 0a 09 23 20 64 75 72 69 6e 67 20 70 72  ken..# during pr
1b60: 6f 63 65 73 73 69 6e 67 20 61 66 74 65 72 20 61  ocessing after a
1b70: 20 73 68 6f 72 74 20 74 69 6d 65 2c 20 69 6e 73   short time, ins
1b80: 74 65 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20  tead of letting 
1b90: 69 74 0a 09 23 20 63 6f 6e 73 75 6d 65 20 6d 65  it..# consume me
1ba0: 6d 6f 72 79 2e 0a 0a 09 77 68 69 6c 65 20 7b 5b  mory....while {[
1bb0: 6c 6c 65 6e 67 74 68 20 24 6e 65 77 5d 7d 20 7b  llength $new]} {
1bc0: 0a 0a 09 20 20 20 20 73 65 74 20 70 65 6e 64 69  ...    set pendi
1bd0: 6e 67 20 24 6e 65 77 0a 09 20 20 20 20 73 65 74  ng $new..    set
1be0: 20 6e 65 77 20 20 20 20 20 7b 7d 0a 09 20 20 20   new     {}..   
1bf0: 20 73 65 74 20 61 74 20 20 20 20 20 20 30 0a 0a   set at      0..
1c00: 09 20 20 20 20 77 68 69 6c 65 20 7b 24 61 74 20  .    while {$at 
1c10: 3c 20 5b 6c 6c 65 6e 67 74 68 20 24 70 65 6e 64  < [llength $pend
1c20: 69 6e 67 5d 7d 20 7b 0a 09 09 73 65 74 20 63 75  ing]} {...set cu
1c30: 72 72 65 6e 74 20 5b 6c 69 6e 64 65 78 20 24 70  rrent [lindex $p
1c40: 65 6e 64 69 6e 67 20 24 61 74 5d 0a 0a 09 09 6c  ending $at]....l
1c50: 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73  og write 6 csets
1c60: 20 7b 2e 20 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e   {. . .. ... ...
1c70: 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e  .. ........ ....
1c80: 2e 2e 2e 2e 2e 2e 2e 2e 2e 7d 0a 09 09 6c 6f 67  .........}...log
1c90: 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 7b   write 6 csets {
1ca0: 53 63 68 65 64 75 6c 65 64 20 20 20 5b 6a 6f 69  Scheduled   [joi
1cb0: 6e 20 5b 50 52 73 20 5b 6c 72 61 6e 67 65 20 24  n [PRs [lrange $
1cc0: 70 65 6e 64 69 6e 67 20 24 61 74 20 65 6e 64 5d  pending $at end]
1cd0: 5d 20 7b 20 7d 5d 7d 0a 09 09 6c 6f 67 20 77 72  ] { }]}...log wr
1ce0: 69 74 65 20 36 20 63 73 65 74 73 20 7b 43 6f 6e  ite 6 csets {Con
1cf0: 73 69 64 65 72 69 6e 67 20 5b 50 52 20 24 63 75  sidering [PR $cu
1d00: 72 72 65 6e 74 5d 20 5c 5b 24 61 74 2f 5b 6c 6c  rrent] \[$at/[ll
1d10: 65 6e 67 74 68 20 24 70 65 6e 64 69 6e 67 5d 5c  ength $pending]\
1d20: 5d 7d 0a 0a 09 09 73 65 74 20 62 65 73 74 20 5b  ]}....set best [
1d30: 46 69 6e 64 42 65 73 74 42 72 65 61 6b 20 24 63  FindBestBreak $c
1d40: 75 72 72 65 6e 74 5d 0a 0a 09 09 69 66 20 7b 24  urrent]....if {$
1d50: 62 65 73 74 20 3c 20 30 7d 20 7b 0a 09 09 20 20  best < 0} {...  
1d60: 20 20 23 20 54 68 65 20 69 6e 73 70 65 63 74 65    # The inspecte
1d70: 64 20 72 61 6e 67 65 20 68 61 73 20 6e 6f 20 69  d range has no i
1d80: 6e 74 65 72 6e 61 6c 0a 09 09 20 20 20 20 23 20  nternal...    # 
1d90: 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 54 68  dependencies. Th
1da0: 69 73 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65  is is a complete
1db0: 20 66 72 61 67 6d 65 6e 74 2e 0a 09 09 20 20 20   fragment....   
1dc0: 20 6c 61 70 70 65 6e 64 20 66 72 61 67 6d 65 6e   lappend fragmen
1dd0: 74 73 20 24 63 75 72 72 65 6e 74 0a 0a 09 09 20  ts $current.... 
1de0: 20 20 20 6c 6f 67 20 77 72 69 74 65 20 36 20 63     log write 6 c
1df0: 73 65 74 73 20 22 4e 6f 20 62 72 65 61 6b 73 2c  sets "No breaks,
1e00: 20 66 69 6e 61 6c 22 0a 09 09 7d 20 65 6c 73 65   final"...} else
1e10: 20 7b 0a 09 09 20 20 20 20 23 20 53 70 6c 69 74   {...    # Split
1e20: 20 74 68 65 20 72 61 6e 67 65 20 61 6e 64 20 73   the range and s
1e30: 63 68 65 64 75 6c 65 20 74 68 65 20 72 65 73 75  chedule the resu
1e40: 6c 74 69 6e 67 0a 09 09 20 20 20 20 23 20 66 72  lting...    # fr
1e50: 61 67 6d 65 6e 74 73 20 66 6f 72 20 66 75 72 74  agments for furt
1e60: 68 65 72 20 69 6e 73 70 65 63 74 69 6f 6e 2e 20  her inspection. 
1e70: 52 65 6d 65 6d 62 65 72 20 74 68 65 0a 09 09 20  Remember the... 
1e80: 20 20 20 23 20 6e 75 6d 62 65 72 20 6f 66 20 64     # number of d
1e90: 65 70 65 6e 64 65 6e 63 69 65 73 20 63 75 74 20  ependencies cut 
1ea0: 62 65 66 6f 72 65 20 77 65 20 72 65 6d 6f 76 65  before we remove
1eb0: 20 74 68 65 6d 0a 09 09 20 20 20 20 23 20 66 72   them...    # fr
1ec0: 6f 6d 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e  om consideration
1ed0: 2c 20 66 6f 72 20 64 6f 63 75 6d 65 6e 74 61 74  , for documentat
1ee0: 69 6f 6e 20 6c 61 74 65 72 2e 0a 0a 09 09 20 20  ion later.....  
1ef0: 20 20 73 65 74 20 62 72 65 61 6b 73 28 24 62 65    set breaks($be
1f00: 73 74 29 20 24 63 72 6f 73 73 28 24 62 65 73 74  st) $cross($best
1f10: 29 0a 0a 09 09 20 20 20 20 6c 6f 67 20 77 72 69  )....    log wri
1f20: 74 65 20 36 20 63 73 65 74 73 20 22 42 65 73 74  te 6 csets "Best
1f30: 20 62 72 65 61 6b 20 40 20 24 62 65 73 74 2c 20   break @ $best, 
1f40: 63 75 74 74 69 6e 67 20 5b 6e 73 70 20 24 63 72  cutting [nsp $cr
1f50: 6f 73 73 28 24 62 65 73 74 29 20 64 65 70 65 6e  oss($best) depen
1f60: 64 65 6e 63 79 20 64 65 70 65 6e 64 65 6e 63 69  dency dependenci
1f70: 65 73 5d 22 0a 0a 09 09 20 20 20 20 23 20 4e 6f  es]"....    # No
1f80: 74 65 3a 20 54 68 65 20 76 61 6c 75 65 20 6f 66  te: The value of
1f90: 20 62 65 73 74 20 69 73 20 61 6e 20 61 62 6f 6c   best is an abol
1fa0: 75 74 65 20 6c 6f 63 61 74 69 6f 6e 0a 09 09 20  ute location... 
1fb0: 20 20 20 23 20 69 6e 20 6d 79 69 74 65 6d 73 2e     # in myitems.
1fc0: 20 55 73 65 20 74 68 65 20 73 74 61 72 74 20 6f   Use the start o
1fd0: 66 20 63 75 72 72 65 6e 74 20 74 6f 20 6d 61 6b  f current to mak
1fe0: 65 20 69 74 0a 09 09 20 20 20 20 23 20 61 6e 20  e it...    # an 
1ff0: 69 6e 64 65 78 20 61 62 73 6f 6c 75 74 65 20 74  index absolute t
2000: 6f 20 63 75 72 72 65 6e 74 2e 0a 0a 09 09 20 20  o current.....  
2010: 20 20 73 65 74 20 62 72 65 6c 20 5b 65 78 70 72    set brel [expr
2020: 20 7b 24 62 65 73 74 20 2d 20 5b 6c 69 6e 64 65   {$best - [linde
2030: 78 20 24 63 75 72 72 65 6e 74 20 30 5d 7d 5d 0a  x $current 0]}].
2040: 09 09 20 20 20 20 73 65 74 20 62 6e 65 78 74 20  ..    set bnext 
2050: 24 62 72 65 6c 20 3b 20 69 6e 63 72 20 62 6e 65  $brel ; incr bne
2060: 78 74 0a 09 09 20 20 20 20 73 65 74 20 66 72 61  xt...    set fra
2070: 67 62 65 66 6f 72 65 20 5b 6c 72 61 6e 67 65 20  gbefore [lrange 
2080: 24 63 75 72 72 65 6e 74 20 30 20 24 62 72 65 6c  $current 0 $brel
2090: 5d 0a 09 09 20 20 20 20 73 65 74 20 66 72 61 67  ]...    set frag
20a0: 61 66 74 65 72 20 20 5b 6c 72 61 6e 67 65 20 24  after  [lrange $
20b0: 63 75 72 72 65 6e 74 20 24 62 6e 65 78 74 20 65  current $bnext e
20c0: 6e 64 5d 0a 0a 09 09 20 20 20 20 6c 6f 67 20 77  nd]....    log w
20d0: 72 69 74 65 20 36 20 63 73 65 74 73 20 22 4e 65  rite 6 csets "Ne
20e0: 77 20 70 69 65 63 65 73 20 20 5b 50 52 20 24 66  w pieces  [PR $f
20f0: 72 61 67 62 65 66 6f 72 65 5d 20 5b 50 52 20 24  ragbefore] [PR $
2100: 66 72 61 67 61 66 74 65 72 5d 22 0a 0a 09 09 20  fragafter]".... 
2110: 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 73     integrity ass
2120: 65 72 74 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66  ert {[llength $f
2130: 72 61 67 62 65 66 6f 72 65 5d 7d 20 7b 46 6f 75  ragbefore]} {Fou
2140: 6e 64 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66  nd zero-length f
2150: 72 61 67 6d 65 6e 74 20 61 74 20 74 68 65 20 62  ragment at the b
2160: 65 67 69 6e 6e 69 6e 67 7d 0a 09 09 20 20 20 20  eginning}...    
2170: 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74  integrity assert
2180: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 72 61 67   {[llength $frag
2190: 61 66 74 65 72 5d 7d 20 20 7b 46 6f 75 6e 64 20  after]}  {Found 
21a0: 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 72 61 67  zero-length frag
21b0: 6d 65 6e 74 20 61 74 20 74 68 65 20 65 6e 64 7d  ment at the end}
21c0: 0a 0a 09 09 20 20 20 20 6c 61 70 70 65 6e 64 20  ....    lappend 
21d0: 6e 65 77 20 24 66 72 61 67 62 65 66 6f 72 65 20  new $fragbefore 
21e0: 24 66 72 61 67 61 66 74 65 72 0a 09 09 20 20 20  $fragafter...   
21f0: 20 43 75 74 41 74 20 24 62 65 73 74 0a 09 09 7d   CutAt $best...}
2200: 0a 0a 09 09 69 6e 63 72 20 61 74 0a 09 20 20 20  ....incr at..   
2210: 20 7d 0a 09 7d 0a 0a 09 6c 6f 67 20 77 72 69 74   }..}...log writ
2220: 65 20 36 20 63 73 65 74 73 20 22 2e 20 2e 20 2e  e 6 csets ". . .
2230: 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e 2e 2e  . ... ..... ....
2240: 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  .... ...........
2250: 2e 2e 22 0a 0a 09 23 20 28 2a 29 20 57 65 20 63  .."...# (*) We c
2260: 6c 65 61 72 20 6f 75 74 20 74 68 65 20 61 73 73  lear out the ass
2270: 6f 63 69 61 74 65 64 20 70 61 72 74 20 6f 66 20  ociated part of 
2280: 74 68 65 20 6d 79 69 74 65 6d 6d 61 70 0a 09 23  the myitemmap..#
2290: 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6e 64 65 78   in-memory index
22a0: 20 69 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20   in preparation 
22b0: 66 6f 72 20 6e 65 77 20 64 61 74 61 2e 20 41 20  for new data. A 
22c0: 73 69 6d 70 6c 65 20 75 6e 73 65 74 0a 09 23 20  simple unset..# 
22d0: 69 73 20 65 6e 6f 75 67 68 2c 20 77 65 20 68 61  is enough, we ha
22e0: 76 65 20 6e 6f 20 73 79 6d 62 6f 6c 20 63 68 61  ve no symbol cha
22f0: 6e 67 65 73 65 74 73 20 61 74 20 74 68 69 73 20  ngesets at this 
2300: 74 69 6d 65 2c 20 61 6e 64 0a 09 23 20 74 68 75  time, and..# thu
2310: 73 20 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61  s never more tha
2320: 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20  n one reference 
2330: 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a 0a 09 66  in the list....f
2340: 6f 72 65 61 63 68 20 69 69 64 20 24 6d 79 69 74  oreach iid $myit
2350: 65 6d 73 20 7b 0a 09 20 20 20 20 73 65 74 20 6b  ems {..    set k
2360: 65 79 20 5b 6c 69 73 74 20 24 6d 79 74 79 70 65  ey [list $mytype
2370: 20 24 69 69 64 5d 0a 09 20 20 20 20 75 6e 73 65   $iid]..    unse
2380: 74 20 6d 79 69 74 65 6d 6d 61 70 28 24 6b 65 79  t myitemmap($key
2390: 29 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65  )..    log write
23a0: 20 38 20 63 73 65 74 73 20 7b 4d 41 50 2d 20 69   8 csets {MAP- i
23b0: 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73 65 6c 66  tem <$key> $self
23c0: 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d 7d 0a   = [$self str]}.
23d0: 09 7d 0a 0a 09 23 20 43 72 65 61 74 65 20 63 68  .}...# Create ch
23e0: 61 6e 67 65 73 65 74 73 20 66 6f 72 20 74 68 65  angesets for the
23f0: 20 66 72 61 67 6d 65 6e 74 73 2c 20 72 65 75 73   fragments, reus
2400: 69 6e 67 20 74 68 65 20 63 75 72 72 65 6e 74 20  ing the current 
2410: 6f 6e 65 0a 09 23 20 66 6f 72 20 74 68 65 20 66  one..# for the f
2420: 69 72 73 74 20 66 72 61 67 6d 65 6e 74 2e 20 57  irst fragment. W
2430: 65 20 73 6f 72 74 20 74 68 65 6d 20 69 6e 20 6f  e sort them in o
2440: 72 64 65 72 20 74 6f 20 61 6c 6c 6f 77 0a 09 23  rder to allow..#
2450: 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 20 67 61   checking for ga
2460: 70 73 20 61 6e 64 20 6e 69 63 65 20 6d 65 73 73  ps and nice mess
2470: 61 67 65 73 2e 0a 0a 09 73 65 74 20 66 72 61 67  ages....set frag
2480: 6d 65 6e 74 73 20 5b 6c 73 6f 72 74 20 2d 69 6e  ments [lsort -in
2490: 64 65 78 20 30 20 2d 69 6e 74 65 67 65 72 20 24  dex 0 -integer $
24a0: 66 72 61 67 6d 65 6e 74 73 5d 0a 0a 09 23 70 75  fragments]...#pu
24b0: 74 73 20 5c 74 2e 5b 6a 6f 69 6e 20 5b 50 52 73  ts \t.[join [PRs
24c0: 20 24 66 72 61 67 6d 65 6e 74 73 5d 20 2e 5c 6e   $fragments] .\n
24d0: 5c 74 2e 5d 2e 0a 0a 09 42 6f 72 64 65 72 20 5b  \t.]....Border [
24e0: 6c 69 6e 64 65 78 20 24 66 72 61 67 6d 65 6e 74  lindex $fragment
24f0: 73 20 30 5d 20 66 69 72 73 74 73 20 66 69 72 73  s 0] firsts firs
2500: 74 65 0a 0a 09 69 6e 74 65 67 72 69 74 79 20 61  te...integrity a
2510: 73 73 65 72 74 20 7b 24 66 69 72 73 74 73 20 3d  ssert {$firsts =
2520: 3d 20 30 7d 20 7b 42 61 64 20 66 72 61 67 6d 65  = 0} {Bad fragme
2530: 6e 74 20 73 74 61 72 74 20 40 20 24 66 69 72 73  nt start @ $firs
2540: 74 73 2c 20 67 61 70 2c 20 6f 72 20 62 65 66 6f  ts, gap, or befo
2550: 72 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  re beginning of 
2560: 74 68 65 20 72 61 6e 67 65 7d 0a 0a 09 73 65 74  the range}...set
2570: 20 6c 61 73 74 65 20 24 66 69 72 73 74 65 0a 09   laste $firste..
2580: 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65 6e 74  foreach fragment
2590: 20 5b 6c 72 61 6e 67 65 20 24 66 72 61 67 6d 65   [lrange $fragme
25a0: 6e 74 73 20 31 20 65 6e 64 5d 20 7b 0a 09 20 20  nts 1 end] {..  
25b0: 20 20 42 6f 72 64 65 72 20 24 66 72 61 67 6d 65    Border $fragme
25c0: 6e 74 20 73 20 65 0a 09 20 20 20 20 69 6e 74 65  nt s e..    inte
25d0: 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24 6c  grity assert {$l
25e0: 61 73 74 65 20 3d 3d 20 28 24 73 20 2d 20 31 29  aste == ($s - 1)
25f0: 7d 20 7b 42 61 64 20 66 72 61 67 6d 65 6e 74 20  } {Bad fragment 
2600: 62 6f 72 64 65 72 20 3c 24 6c 61 73 74 65 20 7c  border <$laste |
2610: 20 24 73 3e 2c 20 67 61 70 20 6f 72 20 6f 76 65   $s>, gap or ove
2620: 72 6c 61 70 7d 0a 0a 09 20 20 20 20 73 65 74 20  rlap}...    set 
2630: 6e 65 77 20 5b 24 74 79 70 65 20 25 41 55 54 4f  new [$type %AUTO
2640: 25 20 24 6d 79 70 72 6f 6a 65 63 74 20 24 6d 79  % $myproject $my
2650: 74 79 70 65 20 24 6d 79 73 72 63 69 64 20 5b 6c  type $mysrcid [l
2660: 72 61 6e 67 65 20 24 6d 79 69 74 65 6d 73 20 24  range $myitems $
2670: 73 20 24 65 5d 5d 0a 0a 20 20 20 20 20 20 20 20  s $e]]..        
2680: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 34 20      log write 4 
2690: 63 73 65 74 73 20 22 42 72 65 61 6b 69 6e 67 20  csets "Breaking 
26a0: 5b 24 73 65 6c 66 20 73 74 72 20 5d 20 40 20 24  [$self str ] @ $
26b0: 6c 61 73 74 65 2c 20 6e 65 77 20 5b 24 6e 65 77  laste, new [$new
26c0: 20 73 74 72 5d 2c 20 63 75 74 74 69 6e 67 20 24   str], cutting $
26d0: 62 72 65 61 6b 73 28 24 6c 61 73 74 65 29 22 0a  breaks($laste)".
26e0: 0a 09 20 20 20 20 73 65 74 20 6c 61 73 74 65 20  ..    set laste 
26f0: 24 65 0a 09 7d 0a 0a 09 69 6e 74 65 67 72 69 74  $e..}...integrit
2700: 79 20 61 73 73 65 72 74 20 7b 0a 09 20 20 20 20  y assert {..    
2710: 24 6c 61 73 74 65 20 3d 3d 20 28 5b 6c 6c 65 6e  $laste == ([llen
2720: 67 74 68 20 24 6d 79 69 74 65 6d 73 5d 2d 31 29  gth $myitems]-1)
2730: 0a 09 7d 20 7b 42 61 64 20 66 72 61 67 6d 65 6e  ..} {Bad fragmen
2740: 74 20 65 6e 64 20 40 20 24 6c 61 73 74 65 2c 20  t end @ $laste, 
2750: 67 61 70 2c 20 6f 72 20 62 65 79 6f 6e 64 20 65  gap, or beyond e
2760: 6e 64 20 6f 66 20 74 68 65 20 72 61 6e 67 65 7d  nd of the range}
2770: 0a 0a 09 23 20 50 75 74 20 74 68 65 20 66 69 72  ...# Put the fir
2780: 73 74 20 66 72 61 67 6d 65 6e 74 20 69 6e 74 6f  st fragment into
2790: 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68 61   the current cha
27a0: 6e 67 65 73 65 74 2c 20 61 6e 64 0a 09 23 20 75  ngeset, and..# u
27b0: 70 64 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d  pdate the in-mem
27c0: 6f 72 79 20 69 6e 64 65 78 2e 20 57 65 20 63 61  ory index. We ca
27d0: 6e 20 73 69 6d 70 6c 79 20 28 72 65 29 61 64 64  n simply (re)add
27e0: 20 74 68 65 20 69 74 65 6d 73 0a 09 23 20 62 65   the items..# be
27f0: 63 61 75 73 65 20 77 65 20 63 6c 65 61 72 65 64  cause we cleared
2800: 20 74 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20   the previously 
2810: 65 78 69 73 74 69 6e 67 20 69 6e 66 6f 72 6d 61  existing informa
2820: 74 69 6f 6e 2c 20 73 65 65 0a 09 23 20 28 2a 29  tion, see..# (*)
2830: 20 61 62 6f 76 65 2e 20 50 65 72 73 69 73 74 65   above. Persiste
2840: 6e 63 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74  nce does not mat
2850: 74 65 72 20 68 65 72 65 2c 20 6e 6f 6e 65 20 6f  ter here, none o
2860: 66 20 74 68 65 0a 09 23 20 63 68 61 6e 67 65 73  f the..# changes
2870: 65 74 73 20 68 61 73 20 62 65 65 6e 20 73 61 76  ets has been sav
2880: 65 64 20 74 6f 20 74 68 65 20 70 65 72 73 69 73  ed to the persis
2890: 74 65 6e 74 20 73 74 61 74 65 20 79 65 74 2e 0a  tent state yet..
28a0: 0a 09 73 65 74 20 6d 79 69 74 65 6d 73 20 20 5b  ..set myitems  [
28b0: 6c 72 61 6e 67 65 20 24 6d 79 69 74 65 6d 73 20  lrange $myitems 
28c0: 20 30 20 24 66 69 72 73 74 65 5d 0a 09 73 65 74   0 $firste]..set
28d0: 20 6d 79 74 69 74 65 6d 73 20 5b 6c 72 61 6e 67   mytitems [lrang
28e0: 65 20 24 6d 79 74 69 74 65 6d 73 20 30 20 24 66  e $mytitems 0 $f
28f0: 69 72 73 74 65 5d 0a 09 66 6f 72 65 61 63 68 20  irste]..foreach 
2900: 69 69 64 20 24 6d 79 69 74 65 6d 73 20 7b 0a 09  iid $myitems {..
2910: 20 20 20 20 73 65 74 20 6b 65 79 20 5b 6c 69 73      set key [lis
2920: 74 20 24 6d 79 74 79 70 65 20 24 69 69 64 5d 0a  t $mytype $iid].
2930: 09 20 20 20 20 73 65 74 20 6d 79 69 74 65 6d 6d  .    set myitemm
2940: 61 70 28 24 6b 65 79 29 20 24 73 65 6c 66 0a 09  ap($key) $self..
2950: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 38 20      log write 8 
2960: 63 73 65 74 73 20 7b 4d 41 50 2b 20 69 74 65 6d  csets {MAP+ item
2970: 20 3c 24 6b 65 79 3e 20 24 73 65 6c 66 20 3d 20   <$key> $self = 
2980: 5b 24 73 65 6c 66 20 73 74 72 5d 7d 0a 09 7d 0a  [$self str]}..}.
2990: 0a 09 72 65 74 75 72 6e 20 31 0a 20 20 20 20 7d  ..return 1.    }
29a0: 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 70 65 72  ..    method per
29b0: 73 69 73 74 20 7b 7d 20 7b 0a 09 73 65 74 20 74  sist {} {..set t
29c0: 69 64 20 24 6d 79 63 73 74 79 70 65 28 24 6d 79  id $mycstype($my
29d0: 74 79 70 65 29 0a 09 73 65 74 20 70 69 64 20 5b  type)..set pid [
29e0: 24 6d 79 70 72 6f 6a 65 63 74 20 69 64 5d 0a 09  $myproject id]..
29f0: 73 65 74 20 70 6f 73 20 30 0a 0a 09 73 74 61 74  set pos 0...stat
2a00: 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a  e transaction {.
2a10: 09 20 20 20 20 73 74 61 74 65 20 72 75 6e 20 7b  .    state run {
2a20: 0a 09 09 49 4e 53 45 52 54 20 49 4e 54 4f 20 63  ...INSERT INTO c
2a30: 68 61 6e 67 65 73 65 74 20 28 63 69 64 2c 20 20  hangeset (cid,  
2a40: 20 70 69 64 2c 20 20 74 79 70 65 2c 20 73 72 63   pid,  type, src
2a50: 29 0a 09 09 56 41 4c 55 45 53 20 20 20 20 20 20  )...VALUES      
2a60: 20 20 20 20 20 20 20 20 20 20 28 24 6d 79 69 64            ($myid
2a70: 2c 20 24 70 69 64 2c 20 24 74 69 64 2c 20 24 6d  , $pid, $tid, $m
2a80: 79 73 72 63 69 64 29 3b 0a 09 20 20 20 20 7d 0a  ysrcid);..    }.
2a90: 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 69 69  ..    foreach ii
2aa0: 64 20 24 6d 79 69 74 65 6d 73 20 7b 0a 09 09 73  d $myitems {...s
2ab0: 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 20 20 20  tate run {...   
2ac0: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 73 69   INSERT INTO csi
2ad0: 74 65 6d 20 28 63 69 64 2c 20 20 20 70 6f 73 2c  tem (cid,   pos,
2ae0: 20 20 69 69 64 29 0a 09 09 20 20 20 20 56 41 4c    iid)...    VAL
2af0: 55 45 53 20 20 20 20 20 20 20 20 20 20 20 20 20  UES             
2b00: 28 24 6d 79 69 64 2c 20 24 70 6f 73 2c 20 24 69  ($myid, $pos, $i
2b10: 69 64 29 3b 0a 09 09 7d 0a 09 09 69 6e 63 72 20  id);...}...incr 
2b20: 70 6f 73 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72  pos..    }..}..r
2b30: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
2b40: 20 6d 65 74 68 6f 64 20 74 69 6d 65 72 61 6e 67   method timerang
2b50: 65 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 5b 24  e {} { return [$
2b60: 6d 79 74 79 70 65 6f 62 6a 20 74 69 6d 65 72 61  mytypeobj timera
2b70: 6e 67 65 20 24 6d 79 69 74 65 6d 73 5d 20 7d 0a  nge $myitems] }.
2b80: 0a 20 20 20 20 6d 65 74 68 6f 64 20 64 72 6f 70  .    method drop
2b90: 20 7b 7d 20 7b 0a 09 6c 6f 67 20 77 72 69 74 65   {} {..log write
2ba0: 20 38 20 63 73 65 74 73 20 7b 44 72 6f 70 70 69   8 csets {Droppi
2bb0: 6e 67 20 24 73 65 6c 66 20 3d 20 5b 24 73 65 6c  ng $self = [$sel
2bc0: 66 20 73 74 72 5d 7d 0a 0a 09 73 74 61 74 65 20  f str]}...state 
2bd0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 09 20  transaction {.. 
2be0: 20 20 20 73 74 61 74 65 20 72 75 6e 20 7b 0a 09     state run {..
2bf0: 09 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 68 61  .DELETE FROM cha
2c00: 6e 67 65 73 65 74 20 57 48 45 52 45 20 63 69 64  ngeset WHERE cid
2c10: 20 3d 20 24 6d 79 69 64 3b 0a 09 09 44 45 4c 45   = $myid;...DELE
2c20: 54 45 20 46 52 4f 4d 20 63 73 69 74 65 6d 20 20  TE FROM csitem  
2c30: 20 20 57 48 45 52 45 20 63 69 64 20 3d 20 24 6d    WHERE cid = $m
2c40: 79 69 64 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  yid;..    }..}..
2c50: 66 6f 72 65 61 63 68 20 69 69 64 20 24 6d 79 69  foreach iid $myi
2c60: 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65 74 20  tems {..    set 
2c70: 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79 74 79 70  key [list $mytyp
2c80: 65 20 24 69 69 64 5d 0a 09 20 20 20 20 75 6e 73  e $iid]..    uns
2c90: 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24 6b 65  et myitemmap($ke
2ca0: 79 29 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74  y)..    log writ
2cb0: 65 20 38 20 63 73 65 74 73 20 7b 4d 41 50 2d 20  e 8 csets {MAP- 
2cc0: 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73 65 6c  item <$key> $sel
2cd0: 66 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d 7d  f = [$self str]}
2ce0: 0a 09 7d 0a 09 73 65 74 20 70 6f 73 20 20 20 20  ..}..set pos    
2cf0: 20 20 20 20 20 20 5b 6c 73 65 61 72 63 68 20 2d        [lsearch -
2d00: 65 78 61 63 74 20 24 6d 79 63 68 61 6e 67 65 73  exact $mychanges
2d10: 65 74 73 20 24 73 65 6c 66 5d 0a 09 73 65 74 20  ets $self]..set 
2d20: 6d 79 63 68 61 6e 67 65 73 65 74 73 20 5b 6c 72  mychangesets [lr
2d30: 65 70 6c 61 63 65 20 24 6d 79 63 68 61 6e 67 65  eplace $mychange
2d40: 73 65 74 73 20 24 70 6f 73 20 24 70 6f 73 5d 0a  sets $pos $pos].
2d50: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
2d60: 20 20 20 6d 65 74 68 6f 64 20 6c 6f 6f 70 63 68     method loopch
2d70: 65 63 6b 20 7b 7d 20 7b 0a 09 6c 6f 67 20 77 72  eck {} {..log wr
2d80: 69 74 65 20 37 20 63 73 65 74 73 20 7b 43 68 65  ite 7 csets {Che
2d90: 63 6b 69 6e 67 20 5b 24 73 65 6c 66 20 73 74 72  cking [$self str
2da0: 5d 20 2f 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 69  ] /[llength $myi
2db0: 74 65 6d 73 5d 7d 0a 0a 09 69 66 20 7b 21 5b 73  tems]}...if {![s
2dc0: 74 72 75 63 74 3a 3a 73 65 74 20 63 6f 6e 74 61  truct::set conta
2dd0: 69 6e 73 20 5b 24 73 65 6c 66 20 73 75 63 63 65  ins [$self succe
2de0: 73 73 6f 72 73 5d 20 24 73 65 6c 66 5d 7d 20 7b  ssors] $self]} {
2df0: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 30 0a 09  ..    return 0..
2e00: 7d 0a 09 69 66 20 7b 5b 6c 6f 67 20 76 65 72 62  }..if {[log verb
2e10: 6f 73 69 74 79 3f 5d 20 3c 20 38 7d 20 7b 20 72  osity?] < 8} { r
2e20: 65 74 75 72 6e 20 31 20 7d 0a 0a 09 23 20 50 72  eturn 1 }...# Pr
2e30: 69 6e 74 20 74 68 65 20 64 65 74 61 69 6c 65 64  int the detailed
2e40: 20 73 75 63 63 65 73 73 6f 72 20 73 74 72 75 63   successor struc
2e50: 74 75 72 65 20 6f 66 20 74 68 65 20 73 65 6c 66  ture of the self
2e60: 2d 0a 09 23 20 72 65 66 65 72 65 6e 74 69 61 6c  -..# referential
2e70: 20 63 68 61 6e 67 65 73 65 74 2c 20 69 66 20 74   changeset, if t
2e80: 68 65 20 76 65 72 62 6f 73 69 74 79 20 6f 66 20  he verbosity of 
2e90: 74 68 65 20 6c 6f 67 20 69 73 20 64 69 61 6c 65  the log is diale
2ea0: 64 0a 09 23 20 68 69 67 68 20 65 6e 6f 75 67 68  d..# high enough
2eb0: 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 38 20  ....log write 8 
2ec0: 63 73 65 74 73 20 5b 73 65 74 20 68 64 72 20 7b  csets [set hdr {
2ed0: 53 65 6c 66 2d 72 65 66 65 72 65 6e 74 69 61 6c  Self-referential
2ee0: 20 63 68 61 6e 67 65 73 65 74 20 5b 24 73 65 6c   changeset [$sel
2ef0: 66 20 73 74 72 5d 20 5f 5f 5f 5f 5f 5f 5f 5f 5f  f str] _________
2f00: 5f 5f 5f 5f 5f 5f 5f 5f 5f 7d 5d 0a 09 61 72 72  _________}]..arr
2f10: 61 79 20 73 65 74 20 6e 6d 61 70 20 5b 24 73 65  ay set nmap [$se
2f20: 6c 66 20 6e 65 78 74 6d 61 70 5d 0a 09 66 6f 72  lf nextmap]..for
2f30: 65 61 63 68 20 69 74 65 6d 20 5b 6c 73 6f 72 74  each item [lsort
2f40: 20 2d 64 69 63 74 20 5b 61 72 72 61 79 20 6e 61   -dict [array na
2f50: 6d 65 73 20 6e 6d 61 70 5d 5d 20 7b 0a 09 20 20  mes nmap]] {..  
2f60: 20 20 66 6f 72 65 61 63 68 20 73 75 63 63 69 74    foreach succit
2f70: 65 6d 20 24 6e 6d 61 70 28 24 69 74 65 6d 29 20  em $nmap($item) 
2f80: 7b 0a 09 09 73 65 74 20 73 75 63 63 63 73 20 24  {...set succcs $
2f90: 6d 79 69 74 65 6d 6d 61 70 28 24 73 75 63 63 69  myitemmap($succi
2fa0: 74 65 6d 29 0a 09 09 73 65 74 20 68 69 6e 74 20  tem)...set hint 
2fb0: 5b 65 78 70 72 20 7b 28 24 73 75 63 63 63 73 20  [expr {($succcs 
2fc0: 65 71 20 24 73 65 6c 66 29 0a 09 09 09 09 3f 20  eq $self).....? 
2fd0: 22 4c 4f 4f 50 22 0a 09 09 09 09 3a 20 22 20 20  "LOOP".....: "  
2fe0: 20 20 22 7d 5d 0a 09 09 73 65 74 20 69 20 20 20    "}]...set i   
2ff0: 22 3c 24 69 74 65 6d 20 5b 24 74 79 70 65 20 69  "<$item [$type i
3000: 74 65 6d 73 74 72 20 24 69 74 65 6d 5d 3e 22 0a  temstr $item]>".
3010: 09 09 73 65 74 20 73 20 20 20 22 3c 24 73 75 63  ..set s   "<$suc
3020: 63 69 74 65 6d 20 5b 24 74 79 70 65 20 69 74 65  citem [$type ite
3030: 6d 73 74 72 20 24 73 75 63 63 69 74 65 6d 5d 3e  mstr $succitem]>
3040: 22 0a 09 09 73 65 74 20 73 63 73 20 5b 24 73 75  "...set scs [$su
3050: 63 63 63 73 20 73 74 72 5d 0a 09 09 6c 6f 67 20  cccs str]...log 
3060: 77 72 69 74 65 20 38 20 63 73 65 74 73 20 7b 24  write 8 csets {$
3070: 68 69 6e 74 20 2a 20 24 69 20 2d 2d 3e 20 24 73  hint * $i --> $s
3080: 20 2d 2d 3e 20 63 73 20 24 73 63 73 7d 0a 09 20   --> cs $scs}.. 
3090: 20 20 20 7d 0a 09 7d 0a 09 6c 6f 67 20 77 72 69     }..}..log wri
30a0: 74 65 20 38 20 63 73 65 74 73 20 5b 72 65 67 73  te 8 csets [regs
30b0: 75 62 20 2d 61 6c 6c 20 7b 5b 5e 20 09 5d 7d 20  ub -all {[^ .]} 
30c0: 24 68 64 72 20 7b 5f 7d 5d 0a 09 72 65 74 75 72  $hdr {_}]..retur
30d0: 6e 20 31 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  n 1.    }..    t
30e0: 79 70 65 6d 65 74 68 6f 64 20 73 70 6c 69 74 20  ypemethod split 
30f0: 7b 63 73 65 74 20 61 72 67 73 7d 20 7b 0a 09 23  {cset args} {..#
3100: 20 41 73 20 70 61 72 74 20 6f 66 20 74 68 65 20   As part of the 
3110: 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  creation of the 
3120: 6e 65 77 20 63 68 61 6e 67 65 73 65 74 73 20 73  new changesets s
3130: 70 65 63 69 66 69 65 64 20 69 6e 0a 09 23 20 41  pecified in..# A
3140: 52 47 53 20 61 73 20 73 65 74 73 20 6f 66 20 69  RGS as sets of i
3150: 74 65 6d 73 2c 20 61 6c 6c 20 73 75 62 73 65 74  tems, all subset
3160: 73 20 6f 66 20 43 53 45 54 27 73 20 69 74 65 6d  s of CSET's item
3170: 20 73 65 74 2c 20 43 53 45 54 0a 09 23 20 77 69   set, CSET..# wi
3180: 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72  ll be dropped fr
3190: 6f 6d 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73  om all databases
31a0: 2c 20 69 6e 20 61 6e 64 20 6f 75 74 20 6f 66 20  , in and out of 
31b0: 6d 65 6d 6f 72 79 2c 0a 09 23 20 61 6e 64 20 74  memory,..# and t
31c0: 68 65 6e 20 64 65 73 74 72 6f 79 65 64 2e 0a 09  hen destroyed...
31d0: 23 0a 09 23 20 4e 6f 74 65 3a 20 54 68 65 20 69  #..# Note: The i
31e0: 74 65 6d 20 6c 69 73 74 73 20 66 6f 75 6e 64 20  tem lists found 
31f0: 69 6e 20 61 72 67 73 20 61 72 65 20 74 61 67 67  in args are tagg
3200: 65 64 20 69 74 65 6d 73 2e 20 54 68 65 79 0a 09  ed items. They..
3210: 23 20 68 61 76 65 20 74 6f 20 68 61 76 65 20 74  # have to have t
3220: 68 65 20 73 61 6d 65 20 74 79 70 65 20 61 73 20  he same type as 
3230: 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20 62  the changeset, b
3240: 65 69 6e 67 20 73 75 62 73 65 74 73 0a 09 23 20  eing subsets..# 
3250: 6f 66 20 69 74 73 20 69 74 65 6d 73 2e 20 54 68  of its items. Th
3260: 69 73 20 69 73 20 63 68 65 63 6b 65 64 20 69 6e  is is checked in
3270: 20 55 6e 74 61 67 31 2e 0a 0a 09 6c 6f 67 20 77   Untag1....log w
3280: 72 69 74 65 20 38 20 63 73 65 74 73 20 7b 4f 4c  rite 8 csets {OL
3290: 44 3a 20 5b 6c 73 6f 72 74 20 5b 24 63 73 65 74  D: [lsort [$cset
32a0: 20 69 74 65 6d 73 5d 5d 7d 0a 09 56 61 6c 69 64   items]]}..Valid
32b0: 61 74 65 46 72 61 67 6d 65 6e 74 73 20 24 63 73  ateFragments $cs
32c0: 65 74 20 24 61 72 67 73 0a 0a 09 23 20 41 6c 6c  et $args...# All
32d0: 20 63 68 65 63 6b 73 20 70 61 73 73 2c 20 61 63   checks pass, ac
32e0: 74 75 61 6c 6c 79 20 70 65 72 66 6f 72 6d 20 74  tually perform t
32f0: 68 65 20 73 70 6c 69 74 2e 0a 0a 09 73 74 72 75  he split....stru
3300: 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20  ct::list assign 
3310: 5b 24 63 73 65 74 20 64 61 74 61 5d 20 70 72 6f  [$cset data] pro
3320: 6a 65 63 74 20 63 73 74 79 70 65 20 63 73 73 72  ject cstype cssr
3330: 63 0a 0a 09 24 63 73 65 74 20 64 72 6f 70 0a 09  c...$cset drop..
3340: 24 63 73 65 74 20 64 65 73 74 72 6f 79 0a 0a 09  $cset destroy...
3350: 73 65 74 20 6e 65 77 63 73 65 74 73 20 7b 7d 0a  set newcsets {}.
3360: 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65 6e  .foreach fragmen
3370: 74 69 74 65 6d 73 20 24 61 72 67 73 20 7b 0a 09  titems $args {..
3380: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 38 20      log write 8 
3390: 63 73 65 74 73 20 7b 4d 41 4b 45 3a 20 5b 6c 73  csets {MAKE: [ls
33a0: 6f 72 74 20 24 66 72 61 67 6d 65 6e 74 69 74 65  ort $fragmentite
33b0: 6d 73 5d 7d 0a 0a 09 20 20 20 20 73 65 74 20 66  ms]}...    set f
33c0: 72 61 67 6d 65 6e 74 20 5b 24 74 79 70 65 20 25  ragment [$type %
33d0: 41 55 54 4f 25 20 24 70 72 6f 6a 65 63 74 20 24  AUTO% $project $
33e0: 63 73 74 79 70 65 20 24 63 73 73 72 63 20 5c 0a  cstype $cssrc \.
33f0: 09 09 09 20 20 20 20 20 20 5b 55 6e 74 61 67 20  ...      [Untag 
3400: 24 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 20 24  $fragmentitems $
3410: 63 73 74 79 70 65 5d 5d 0a 09 20 20 20 20 6c 61  cstype]]..    la
3420: 70 70 65 6e 64 20 6e 65 77 63 73 65 74 73 20 24  ppend newcsets $
3430: 66 72 61 67 6d 65 6e 74 0a 09 20 20 20 20 24 66  fragment..    $f
3440: 72 61 67 6d 65 6e 74 20 70 65 72 73 69 73 74 0a  ragment persist.
3450: 0a 09 20 20 20 20 69 66 20 7b 5b 24 66 72 61 67  ..    if {[$frag
3460: 6d 65 6e 74 20 6c 6f 6f 70 63 68 65 63 6b 5d 7d  ment loopcheck]}
3470: 20 7b 0a 09 09 74 72 6f 75 62 6c 65 20 66 61 74   {...trouble fat
3480: 61 6c 20 22 5b 24 66 72 61 67 6d 65 6e 74 20 73  al "[$fragment s
3490: 74 72 5d 20 64 65 70 65 6e 64 73 20 6f 6e 20 69  tr] depends on i
34a0: 74 73 65 6c 66 22 0a 09 20 20 20 20 7d 0a 09 7d  tself"..    }..}
34b0: 0a 0a 09 74 72 6f 75 62 6c 65 20 61 62 6f 72 74  ...trouble abort
34c0: 3f 0a 09 72 65 74 75 72 6e 20 24 6e 65 77 63 73  ?..return $newcs
34d0: 65 74 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  ets.    }..    t
34e0: 79 70 65 6d 65 74 68 6f 64 20 69 74 65 6d 73 74  ypemethod itemst
34f0: 72 20 7b 69 74 65 6d 7d 20 7b 0a 09 73 74 72 75  r {item} {..stru
3500: 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20  ct::list assign 
3510: 24 69 74 65 6d 20 69 74 79 70 65 20 69 69 64 0a  $item itype iid.
3520: 09 72 65 74 75 72 6e 20 5b 24 69 74 79 70 65 20  .return [$itype 
3530: 73 74 72 20 24 69 69 64 5d 0a 20 20 20 20 7d 0a  str $iid].    }.
3540: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
3550: 73 74 72 6c 69 73 74 20 7b 63 68 61 6e 67 65 73  strlist {changes
3560: 65 74 73 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b  ets} {..return [
3570: 6a 6f 69 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69  join [struct::li
3580: 73 74 20 6d 61 70 20 24 63 68 61 6e 67 65 73 65  st map $changese
3590: 74 73 20 5b 6d 79 70 72 6f 63 20 49 44 5d 5d 5d  ts [myproc ID]]]
35a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63  .    }..    proc
35b0: 20 49 44 20 7b 63 73 65 74 7d 20 7b 20 24 63 73   ID {cset} { $cs
35c0: 65 74 20 73 74 72 20 7d 0a 0a 20 20 20 20 70 72  et str }..    pr
35d0: 6f 63 20 55 6e 74 61 67 20 7b 74 61 67 67 65 64  oc Untag {tagged
35e0: 69 74 65 6d 73 20 63 73 74 79 70 65 7d 20 7b 0a  items cstype} {.
35f0: 09 72 65 74 75 72 6e 20 5b 73 74 72 75 63 74 3a  .return [struct:
3600: 3a 6c 69 73 74 20 6d 61 70 20 24 74 61 67 67 65  :list map $tagge
3610: 64 69 74 65 6d 73 20 5b 6d 79 70 72 6f 63 20 55  ditems [myproc U
3620: 6e 74 61 67 31 20 24 63 73 74 79 70 65 5d 5d 0a  ntag1 $cstype]].
3630: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20      }..    proc 
3640: 55 6e 74 61 67 31 20 7b 63 73 74 79 70 65 20 74  Untag1 {cstype t
3650: 68 65 69 74 65 6d 7d 20 7b 0a 09 73 74 72 75 63  heitem} {..struc
3660: 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 24  t::list assign $
3670: 74 68 65 69 74 65 6d 20 74 20 69 0a 09 69 6e 74  theitem t i..int
3680: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24  egrity assert {$
3690: 63 73 74 79 70 65 20 65 71 20 24 74 7d 20 7b 49  cstype eq $t} {I
36a0: 74 65 6d 20 24 69 27 73 20 74 79 70 65 20 69 73  tem $i's type is
36b0: 20 27 24 74 27 2c 20 65 78 70 65 63 74 65 64 20   '$t', expected 
36c0: 27 24 63 73 74 79 70 65 27 7d 0a 09 72 65 74 75  '$cstype'}..retu
36d0: 72 6e 20 24 69 0a 20 20 20 20 7d 0a 0a 20 20 20  rn $i.    }..   
36e0: 20 70 72 6f 63 20 56 61 6c 69 64 61 74 65 46 72   proc ValidateFr
36f0: 61 67 6d 65 6e 74 73 20 7b 63 73 65 74 20 66 72  agments {cset fr
3700: 61 67 6d 65 6e 74 73 7d 20 7b 0a 09 23 20 43 68  agments} {..# Ch
3710: 65 63 6b 20 74 68 65 20 76 61 72 69 6f 75 73 20  eck the various 
3720: 69 6e 74 65 67 72 69 74 79 20 63 6f 6e 73 74 72  integrity constr
3730: 61 69 6e 74 73 20 66 6f 72 20 74 68 65 20 66 72  aints for the fr
3740: 61 67 6d 65 6e 74 73 0a 09 23 20 73 70 65 63 69  agments..# speci
3750: 66 79 69 6e 67 20 68 6f 77 20 74 6f 20 73 70 6c  fying how to spl
3760: 69 74 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  it the changeset
3770: 3a 0a 09 23 0a 09 23 20 2a 20 57 65 20 6d 75 73  :..#..# * We mus
3780: 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f  t have two or mo
3790: 72 65 20 66 72 61 67 6d 65 6e 74 73 2c 20 61 73  re fragments, as
37a0: 20 73 70 6c 69 74 74 69 6e 67 20 61 0a 09 23 20   splitting a..# 
37b0: 20 20 63 68 61 6e 67 65 73 65 74 20 69 6e 74 6f    changeset into
37c0: 20 6f 6e 65 20 6d 61 6b 65 73 20 6e 6f 20 73 65   one makes no se
37d0: 6e 73 65 2e 0a 09 23 20 2a 20 4e 6f 20 66 72 61  nse...# * No fra
37e0: 67 6d 65 6e 74 20 6d 61 79 20 62 65 20 65 6d 70  gment may be emp
37f0: 74 79 2e 0a 09 23 20 2a 20 41 6c 6c 20 66 72 61  ty...# * All fra
3800: 67 6d 65 6e 74 73 20 68 61 76 65 20 74 6f 20 62  gments have to b
3810: 65 20 74 72 75 65 20 73 75 62 73 65 74 73 20 6f  e true subsets o
3820: 66 20 74 68 65 20 69 74 65 6d 73 20 69 6e 20 74  f the items in t
3830: 68 65 0a 09 23 20 20 20 63 68 61 6e 67 65 73 65  he..#   changese
3840: 74 20 74 6f 20 73 70 6c 69 74 2e 20 54 68 65 20  t to split. The 
3850: 27 74 72 75 65 27 20 69 73 20 69 6d 70 6c 69 65  'true' is implie
3860: 64 20 62 65 63 61 75 73 65 20 6e 6f 6e 65 20 61  d because none a
3870: 72 65 0a 09 23 20 20 20 61 6c 6c 6f 77 65 64 20  re..#   allowed 
3880: 74 6f 20 62 65 20 65 6d 70 74 79 2c 20 73 6f 20  to be empty, so 
3890: 65 61 63 68 20 68 61 73 20 74 6f 20 62 65 20 73  each has to be s
38a0: 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 0a  maller than the.
38b0: 09 23 20 20 20 74 6f 74 61 6c 2e 0a 09 23 20 2a  .#   total...# *
38c0: 20 54 68 65 20 75 6e 69 6f 6e 20 6f 66 20 74 68   The union of th
38d0: 65 20 66 72 61 67 6d 65 6e 74 73 20 68 61 73 20  e fragments has 
38e0: 74 6f 20 62 65 20 74 68 65 20 69 74 65 6d 20 73  to be the item s
38f0: 65 74 20 6f 66 20 74 68 65 0a 09 23 20 20 20 63  et of the..#   c
3900: 68 61 6e 67 65 73 65 74 2e 0a 09 23 20 2a 20 54  hangeset...# * T
3910: 68 65 20 66 72 61 67 6d 65 6e 74 20 6d 75 73 74  he fragment must
3920: 20 6e 6f 74 20 6f 76 65 72 6c 61 70 2c 20 69 2e   not overlap, i.
3930: 65 2e 20 74 68 65 69 72 20 70 61 69 72 77 69 73  e. their pairwis
3940: 65 0a 09 23 20 20 20 69 6e 74 65 72 73 65 63 74  e..#   intersect
3950: 69 6f 6e 73 20 68 61 76 65 20 74 6f 20 62 65 20  ions have to be 
3960: 65 6d 70 74 79 2e 0a 0a 09 73 65 74 20 63 6f 76  empty....set cov
3970: 65 72 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 66  er {}..foreach f
3980: 72 61 67 6d 65 6e 74 69 74 65 6d 73 20 24 66 72  ragmentitems $fr
3990: 61 67 6d 65 6e 74 73 20 7b 0a 09 20 20 20 20 6c  agments {..    l
39a0: 6f 67 20 77 72 69 74 65 20 38 20 63 73 65 74 73  og write 8 csets
39b0: 20 7b 4e 45 57 3a 20 5b 6c 73 6f 72 74 20 24 66   {NEW: [lsort $f
39c0: 72 61 67 6d 65 6e 74 69 74 65 6d 73 5d 7d 0a 0a  ragmentitems]}..
39d0: 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61  .    integrity a
39e0: 73 73 65 72 74 20 7b 0a 09 09 21 5b 73 74 72 75  ssert {...![stru
39f0: 63 74 3a 3a 73 65 74 20 65 6d 70 74 79 20 24 66  ct::set empty $f
3a00: 72 61 67 6d 65 6e 74 69 74 65 6d 73 5d 0a 09 20  ragmentitems].. 
3a10: 20 20 20 7d 20 7b 63 68 61 6e 67 65 73 65 74 20     } {changeset 
3a20: 66 72 61 67 6d 65 6e 74 20 69 73 20 65 6d 70 74  fragment is empt
3a30: 79 7d 0a 0a 09 20 20 20 20 69 6e 74 65 67 72 69  y}...    integri
3a40: 74 79 20 61 73 73 65 72 74 20 7b 0a 09 09 5b 73  ty assert {...[s
3a50: 74 72 75 63 74 3a 3a 73 65 74 20 73 75 62 73 65  truct::set subse
3a60: 74 6f 66 20 24 66 72 61 67 6d 65 6e 74 69 74 65  tof $fragmentite
3a70: 6d 73 20 5b 24 63 73 65 74 20 69 74 65 6d 73 5d  ms [$cset items]
3a80: 5d 0a 09 20 20 20 20 7d 20 7b 63 68 61 6e 67 65  ]..    } {change
3a90: 73 65 74 20 66 72 61 67 6d 65 6e 74 20 69 73 20  set fragment is 
3aa0: 6e 6f 74 20 61 20 73 75 62 73 65 74 7d 0a 09 20  not a subset}.. 
3ab0: 20 20 20 73 74 72 75 63 74 3a 3a 73 65 74 20 61     struct::set a
3ac0: 64 64 20 63 6f 76 65 72 20 24 66 72 61 67 6d 65  dd cover $fragme
3ad0: 6e 74 69 74 65 6d 73 0a 09 7d 0a 0a 09 69 6e 74  ntitems..}...int
3ae0: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 0a  egrity assert {.
3af0: 09 20 20 20 20 5b 73 74 72 75 63 74 3a 3a 73 65  .    [struct::se
3b00: 74 20 65 71 75 61 6c 20 24 63 6f 76 65 72 20 5b  t equal $cover [
3b10: 24 63 73 65 74 20 69 74 65 6d 73 5d 5d 0a 09 20  $cset items]].. 
3b20: 7d 20 7b 54 68 65 20 66 72 61 67 6d 65 6e 74 73  } {The fragments
3b30: 20 64 6f 20 6e 6f 74 20 63 6f 76 65 72 20 74 68   do not cover th
3b40: 65 20 6f 72 69 67 69 6e 61 6c 20 63 68 61 6e 67  e original chang
3b50: 65 73 65 74 7d 0a 0a 09 73 65 74 20 69 20 31 0a  eset}...set i 1.
3b60: 09 66 6f 72 65 61 63 68 20 66 69 61 20 24 66 72  .foreach fia $fr
3b70: 61 67 6d 65 6e 74 73 20 7b 0a 09 20 20 20 20 66  agments {..    f
3b80: 6f 72 65 61 63 68 20 66 69 62 20 5b 6c 72 61 6e  oreach fib [lran
3b90: 67 65 20 24 66 72 61 67 6d 65 6e 74 73 20 24 69  ge $fragments $i
3ba0: 20 65 6e 64 5d 20 7b 0a 09 09 69 6e 74 65 67 72   end] {...integr
3bb0: 69 74 79 20 61 73 73 65 72 74 20 7b 0a 09 09 20  ity assert {... 
3bc0: 20 20 20 5b 73 74 72 75 63 74 3a 3a 73 65 74 20     [struct::set 
3bd0: 65 6d 70 74 79 20 5b 73 74 72 75 63 74 3a 3a 73  empty [struct::s
3be0: 65 74 20 69 6e 74 65 72 73 65 63 74 20 24 66 69  et intersect $fi
3bf0: 61 20 24 66 69 62 5d 5d 0a 09 09 7d 20 7b 54 68  a $fib]]...} {Th
3c00: 65 20 66 72 61 67 6d 65 6e 74 73 20 3c 24 66 69  e fragments <$fi
3c10: 61 3e 20 61 6e 64 20 3c 24 66 69 62 3e 20 6f 76  a> and <$fib> ov
3c20: 65 72 6c 61 70 7d 0a 09 20 20 20 20 7d 0a 09 20  erlap}..    }.. 
3c30: 20 20 20 69 6e 63 72 20 69 0a 09 7d 0a 0a 09 72     incr i..}...r
3c40: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
3c50: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23   # # ## ### ####
3c60: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
3c70: 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20  ########.    ## 
3c80: 53 74 61 74 65 0a 0a 20 20 20 20 76 61 72 69 61  State..    varia
3c90: 62 6c 65 20 6d 79 69 64 20 20 20 20 20 20 20 20  ble myid        
3ca0: 7b 7d 20 3b 20 23 20 49 64 20 6f 66 20 74 68 65  {} ; # Id of the
3cb0: 20 63 73 65 74 20 66 6f 72 20 74 68 65 20 70 65   cset for the pe
3cc0: 72 73 69 73 74 65 6e 74 0a 09 09 09 20 20 20 20  rsistent....    
3cd0: 20 20 23 20 73 74 61 74 65 2e 0a 20 20 20 20 76    # state..    v
3ce0: 61 72 69 61 62 6c 65 20 6d 79 70 72 6f 6a 65 63  ariable myprojec
3cf0: 74 20 20 20 7b 7d 20 3b 20 23 20 52 65 66 65 72  t   {} ; # Refer
3d00: 65 6e 63 65 20 6f 66 20 74 68 65 20 70 72 6f 6a  ence of the proj
3d10: 65 63 74 20 6f 62 6a 65 63 74 20 74 68 65 0a 09  ect object the..
3d20: 09 09 20 20 20 20 20 20 23 20 63 68 61 6e 67 65  ..      # change
3d30: 73 65 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a  set belongs to..
3d40: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 74      variable myt
3d50: 79 70 65 20 20 20 20 20 20 7b 7d 20 3b 20 23 20  ype      {} ; # 
3d60: 57 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 73  What the changes
3d70: 65 74 20 69 73 20 62 61 73 65 64 20 6f 6e 0a 09  et is based on..
3d80: 09 09 20 20 20 20 20 20 23 20 28 72 65 76 69 73  ..      # (revis
3d90: 69 6f 6e 73 2c 20 74 61 67 73 2c 20 6f 72 20 62  ions, tags, or b
3da0: 72 61 6e 63 68 65 73 29 2e 0a 09 09 09 20 20 20  ranches).....   
3db0: 20 20 20 23 20 56 61 6c 75 65 73 3a 20 53 65 65     # Values: See
3dc0: 20 6d 79 63 73 74 79 70 65 2e 20 4e 6f 74 65 20   mycstype. Note 
3dd0: 74 68 61 74 20 77 65 0a 09 09 09 20 20 20 20 20  that we....     
3de0: 20 23 20 68 61 76 65 20 74 6f 20 6b 65 65 70 20   # have to keep 
3df0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65  the names of the
3e00: 20 68 65 6c 70 65 72 0a 09 09 09 20 20 20 20 20   helper....     
3e10: 20 23 20 73 69 6e 67 6c 65 74 6f 6e 73 20 69 6e   # singletons in
3e20: 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 63   sync with the c
3e30: 6f 6e 74 65 6e 74 73 0a 09 09 09 20 20 20 20 20  ontents....     
3e40: 20 23 20 6f 66 20 73 74 61 74 65 20 74 61 62 6c   # of state tabl
3e50: 65 20 27 63 73 74 79 70 65 27 2c 20 61 6e 64 20  e 'cstype', and 
3e60: 76 61 72 69 6f 75 73 0a 09 09 09 20 20 20 20 20  various....     
3e70: 20 23 20 6f 74 68 65 72 20 70 6c 61 63 65 73 20   # other places 
3e80: 75 73 69 6e 67 20 74 68 65 6d 20 68 61 72 64 77  using them hardw
3e90: 69 72 65 64 2e 0a 20 20 20 20 76 61 72 69 61 62  ired..    variab
3ea0: 6c 65 20 6d 79 74 79 70 65 6f 62 6a 20 20 20 7b  le mytypeobj   {
3eb0: 7d 20 3b 20 23 20 52 65 66 65 72 65 6e 63 65 20  } ; # Reference 
3ec0: 74 6f 20 74 68 65 20 63 6f 6e 74 61 69 6e 65 72  to the container
3ed0: 20 66 6f 72 20 74 68 65 0a 09 09 09 20 20 20 20   for the....    
3ee0: 20 20 23 20 74 79 70 65 20 64 65 70 65 6e 64 65    # type depende
3ef0: 6e 74 20 63 6f 64 65 2e 20 44 65 72 69 76 65 64  nt code. Derived
3f00: 20 66 72 6f 6d 0a 09 09 09 20 20 20 20 20 20 23   from....      #
3f10: 20 6d 79 74 79 70 65 2e 0a 20 20 20 20 76 61 72   mytype..    var
3f20: 69 61 62 6c 65 20 6d 79 73 72 63 69 64 20 20 20  iable mysrcid   
3f30: 20 20 7b 7d 20 3b 20 23 20 49 64 20 6f 66 20 74    {} ; # Id of t
3f40: 68 65 20 6d 65 74 61 64 61 74 61 20 6f 72 20 73  he metadata or s
3f50: 79 6d 62 6f 6c 20 74 68 65 20 63 73 65 74 0a 09  ymbol the cset..
3f60: 09 09 20 20 20 20 20 20 23 20 69 73 20 62 61 73  ..      # is bas
3f70: 65 64 20 6f 6e 2e 0a 20 20 20 20 76 61 72 69 61  ed on..    varia
3f80: 62 6c 65 20 6d 79 69 74 65 6d 73 20 20 20 20 20  ble myitems     
3f90: 7b 7d 20 3b 20 23 20 4c 69 73 74 20 6f 66 20 74  {} ; # List of t
3fa0: 68 65 20 66 69 6c 65 20 6c 65 76 65 6c 20 72 65  he file level re
3fb0: 76 69 73 69 6f 6e 73 2c 0a 09 09 09 20 20 20 20  visions,....    
3fc0: 20 20 23 20 74 61 67 73 2c 20 6f 72 20 62 72 61    # tags, or bra
3fd0: 6e 63 68 65 73 20 69 6e 20 74 68 65 20 63 73 65  nches in the cse
3fe0: 74 2c 20 61 73 0a 09 09 09 20 20 20 20 20 20 23  t, as....      #
3ff0: 20 69 64 73 2e 20 4e 6f 74 20 74 61 67 67 65 64   ids. Not tagged
4000: 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d  ..    variable m
4010: 79 74 69 74 65 6d 73 20 20 20 20 7b 7d 20 3b 20  ytitems    {} ; 
4020: 23 20 41 73 20 6d 79 69 74 65 6d 73 2c 20 74 68  # As myitems, th
4030: 65 20 74 61 67 67 65 64 20 66 6f 72 6d 2e 0a 20  e tagged form.. 
4040: 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 70 72     variable mypr
4050: 65 6d 61 70 20 20 20 20 7b 7d 20 3b 20 23 20 44  emap    {} ; # D
4060: 69 63 74 69 6f 6e 61 72 79 20 6d 61 70 70 69 6e  ictionary mappin
4070: 67 20 66 72 6f 6d 20 74 68 65 20 69 74 65 6d 73  g from the items
4080: 20 28 74 61 67 67 65 64 20 6e 6f 77 29 0a 09 09   (tagged now)...
4090: 09 20 20 20 20 20 20 23 20 74 6f 20 74 68 65 69  .      # to thei
40a0: 72 20 70 72 65 64 65 63 65 73 73 6f 72 73 2c 20  r predecessors, 
40b0: 61 6c 73 6f 20 74 61 67 67 65 64 2e 20 41 0a 09  also tagged. A..
40c0: 09 09 20 20 20 20 20 20 23 20 63 61 63 68 65 20  ..      # cache 
40d0: 74 6f 20 61 76 6f 69 64 20 6c 6f 61 64 69 6e 67  to avoid loading
40e0: 20 74 68 69 73 20 66 72 6f 6d 20 74 68 65 0a 09   this from the..
40f0: 09 09 20 20 20 20 20 20 23 20 73 74 61 74 65 20  ..      # state 
4100: 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 2e 0a  more than once..
4110: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 6e      variable myn
4120: 65 78 74 6d 61 70 20 20 20 7b 7d 20 3b 20 23 20  extmap   {} ; # 
4130: 44 69 63 74 69 6f 6e 61 72 79 20 6d 61 70 70 69  Dictionary mappi
4140: 6e 67 20 66 72 6f 6d 20 74 68 65 20 69 74 65 6d  ng from the item
4150: 73 20 28 74 61 67 67 65 64 29 0a 09 09 09 20 20  s (tagged)....  
4160: 20 20 20 20 23 20 74 6f 20 74 68 65 69 72 20 73      # to their s
4170: 75 63 63 65 73 73 6f 72 73 20 28 61 6c 73 6f 20  uccessors (also 
4180: 74 61 67 67 65 64 29 2e 20 41 0a 09 09 09 20 20  tagged). A....  
4190: 20 20 20 20 23 20 63 61 63 68 65 20 74 6f 20 61      # cache to a
41a0: 76 6f 69 64 20 6c 6f 61 64 69 6e 67 20 74 68 69  void loading thi
41b0: 73 20 66 72 6f 6d 20 74 68 65 0a 09 09 09 20 20  s from the....  
41c0: 20 20 20 20 23 20 73 74 61 74 65 20 6d 6f 72 65      # state more
41d0: 20 74 68 61 6e 20 6f 6e 63 65 2e 0a 20 20 20 20   than once..    
41e0: 76 61 72 69 61 62 6c 65 20 6d 79 70 6f 73 20 20  variable mypos  
41f0: 20 20 20 20 20 7b 7d 20 3b 20 23 20 43 6f 6d 6d       {} ; # Comm
4200: 69 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20 74  it position of t
4210: 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20 69 66  he changeset, if
4220: 0a 09 09 09 20 20 20 20 20 20 23 20 6b 6e 6f 77  ....      # know
4230: 6e 2e 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23  n...    # # ## #
4240: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
4250: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  # #############.
4260: 20 20 20 20 23 23 20 49 6e 74 65 72 6e 61 6c 20      ## Internal 
4270: 6d 65 74 68 6f 64 73 0a 0a 20 20 20 20 74 79 70  methods..    typ
4280: 65 76 61 72 69 61 62 6c 65 20 6d 79 63 6f 75 6e  evariable mycoun
4290: 74 65 72 20 20 20 20 20 20 20 20 30 20 3b 20 23  ter        0 ; #
42a0: 20 49 64 20 63 6f 75 6e 74 65 72 20 66 6f 72 20   Id counter for 
42b0: 63 73 65 74 73 2e 20 4c 61 73 74 20 69 64 0a 09  csets. Last id..
42c0: 09 09 09 20 20 20 20 20 20 23 20 75 73 65 64 2e  ...      # used.
42d0: 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c  .    typevariabl
42e0: 65 20 6d 79 63 73 74 79 70 65 20 2d 61 72 72 61  e mycstype -arra
42f0: 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 63 73 74  y {} ; # Map cst
4300: 79 70 65 73 20 28 6e 61 6d 65 73 29 20 74 6f 20  ypes (names) to 
4310: 70 65 72 73 69 73 74 65 6e 74 0a 09 09 09 09 20  persistent..... 
4320: 20 20 20 20 20 23 20 69 64 73 2e 20 4e 6f 74 65       # ids. Note
4330: 20 74 68 61 74 20 77 65 20 68 61 76 65 20 74 6f   that we have to
4340: 20 6b 65 65 70 0a 09 09 09 09 20 20 20 20 20 20   keep.....      
4350: 23 20 74 68 65 20 6e 61 6d 65 73 20 69 6e 20 74  # the names in t
4360: 68 65 20 74 61 62 6c 65 20 27 63 73 74 79 70 65  he table 'cstype
4370: 27 0a 09 09 09 09 20 20 20 20 20 20 23 20 69 6e  '.....      # in
4380: 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 6e   sync with the n
4390: 61 6d 65 73 20 6f 66 20 74 68 65 0a 09 09 09 09  ames of the.....
43a0: 20 20 20 20 20 20 23 20 68 65 6c 70 65 72 20 73        # helper s
43b0: 69 6e 67 6c 65 74 6f 6e 73 2e 0a 0a 20 20 20 20  ingletons...    
43c0: 74 79 70 65 6d 65 74 68 6f 64 20 67 65 74 63 73  typemethod getcs
43d0: 74 79 70 65 73 20 7b 7d 20 7b 0a 09 66 6f 72 65  types {} {..fore
43e0: 61 63 68 20 7b 74 69 64 20 6e 61 6d 65 7d 20 5b  ach {tid name} [
43f0: 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20  state run {..   
4400: 20 53 45 4c 45 43 54 20 74 69 64 2c 20 6e 61 6d   SELECT tid, nam
4410: 65 20 46 52 4f 4d 20 63 73 74 79 70 65 3b 0a 09  e FROM cstype;..
4420: 7d 5d 20 7b 20 73 65 74 20 6d 79 63 73 74 79 70  }] { set mycstyp
4430: 65 28 24 6e 61 6d 65 29 20 24 74 69 64 20 7d 0a  e($name) $tid }.
4440: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
4450: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c 6f     typemethod lo
4460: 61 64 63 6f 75 6e 74 65 72 20 7b 7d 20 7b 0a 09  adcounter {} {..
4470: 23 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  # Initialize the
4480: 20 63 6f 75 6e 74 65 72 20 66 72 6f 6d 20 74 68   counter from th
4490: 65 20 73 74 61 74 65 0a 09 73 65 74 20 6d 79 63  e state..set myc
44a0: 6f 75 6e 74 65 72 20 5b 73 74 61 74 65 20 6f 6e  ounter [state on
44b0: 65 20 7b 20 53 45 4c 45 43 54 20 4d 41 58 28 63  e { SELECT MAX(c
44c0: 69 64 29 20 46 52 4f 4d 20 63 68 61 6e 67 65 73  id) FROM changes
44d0: 65 74 20 7d 5d 0a 09 72 65 74 75 72 6e 0a 20 20  et }]..return.  
44e0: 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74    }..    typemet
44f0: 68 6f 64 20 6e 75 6d 20 7b 7d 20 7b 20 72 65 74  hod num {} { ret
4500: 75 72 6e 20 24 6d 79 63 6f 75 6e 74 65 72 20 7d  urn $mycounter }
4510: 0a 0a 20 20 20 20 70 72 6f 63 20 49 6e 69 74 69  ..    proc Initi
4520: 61 6c 69 7a 65 42 72 65 61 6b 53 74 61 74 65 20  alizeBreakState 
4530: 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75  {revisions} {..u
4540: 70 76 61 72 20 31 20 70 6f 73 20 70 6f 73 20 63  pvar 1 pos pos c
4550: 72 6f 73 73 20 63 72 6f 73 73 20 72 61 6e 67 65  ross cross range
4560: 20 72 61 6e 67 65 20 64 65 70 63 20 64 65 70 63   range depc depc
4570: 20 64 65 6c 74 61 20 64 65 6c 74 61 20 5c 0a 09   delta delta \..
4580: 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65 73      dependencies
4590: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 0a 09   dependencies...
45a0: 23 20 46 69 72 73 74 20 77 65 20 63 72 65 61 74  # First we creat
45b0: 65 20 61 20 6d 61 70 20 6f 66 20 70 6f 73 69 74  e a map of posit
45c0: 69 6f 6e 73 20 74 6f 20 6d 61 6b 65 20 69 74 20  ions to make it 
45d0: 65 61 73 69 65 72 20 74 6f 0a 09 23 20 64 65 74  easier to..# det
45e0: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 61  ermine whether a
45f0: 20 64 65 70 65 6e 64 65 6e 63 79 20 63 72 6f 73   dependency cros
4600: 73 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  ses a particular
4610: 20 69 6e 64 65 78 2e 0a 0a 09 61 72 72 61 79 20   index....array 
4620: 73 65 74 20 70 6f 73 20 20 20 7b 7d 0a 09 61 72  set pos   {}..ar
4630: 72 61 79 20 73 65 74 20 63 72 6f 73 73 20 7b 7d  ray set cross {}
4640: 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 70 63  ..array set depc
4650: 20 20 7b 7d 0a 09 73 65 74 20 72 61 6e 67 65 20    {}..set range 
4660: 20 20 20 20 20 20 7b 7d 0a 09 73 65 74 20 6e 20        {}..set n 
4670: 30 0a 09 66 6f 72 65 61 63 68 20 72 65 76 20 24  0..foreach rev $
4680: 72 65 76 69 73 69 6f 6e 73 20 7b 0a 09 20 20 20  revisions {..   
4690: 20 6c 61 70 70 65 6e 64 20 72 61 6e 67 65 20 24   lappend range $
46a0: 6e 0a 09 20 20 20 20 73 65 74 20 70 6f 73 28 24  n..    set pos($
46b0: 72 65 76 29 20 24 6e 0a 09 20 20 20 20 73 65 74  rev) $n..    set
46c0: 20 63 72 6f 73 73 28 24 6e 29 20 30 0a 09 20 20   cross($n) 0..  
46d0: 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 0a 09 23 20    incr n..}...# 
46e0: 53 65 63 6f 6e 64 6c 79 20 77 65 20 63 6f 75 6e  Secondly we coun
46f0: 74 20 74 68 65 20 63 72 6f 73 73 69 6e 67 73 20  t the crossings 
4700: 70 65 72 20 70 6f 73 69 74 69 6f 6e 2c 20 62 79  per position, by
4710: 20 69 74 65 72 61 74 69 6e 67 0a 09 23 20 6f 76   iterating..# ov
4720: 65 72 20 74 68 65 20 72 65 63 6f 72 64 65 64 20  er the recorded 
4730: 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65  internal depende
4740: 6e 63 69 65 73 2e 0a 0a 09 23 20 4e 6f 74 65 3a  ncies....# Note:
4750: 20 49 66 20 74 68 65 20 74 69 6d 65 73 74 61 6d   If the timestam
4760: 70 73 20 61 72 65 20 62 61 64 6c 79 20 6f 75 74  ps are badly out
4770: 20 6f 66 20 6f 72 64 65 72 20 69 74 20 69 73 0a   of order it is.
4780: 09 23 20 20 20 20 20 20 20 70 6f 73 73 69 62 6c  .#       possibl
4790: 65 20 74 6f 20 68 61 76 65 20 61 20 62 61 63 6b  e to have a back
47a0: 77 61 72 64 20 73 75 63 63 65 73 73 6f 72 20 64  ward successor d
47b0: 65 70 65 6e 64 65 6e 63 79 2c 0a 09 23 20 20 20  ependency,..#   
47c0: 20 20 20 20 69 2e 65 2e 20 77 69 74 68 20 73 74      i.e. with st
47d0: 61 72 74 20 3e 20 65 6e 64 2e 20 57 65 20 6d 61  art > end. We ma
47e0: 79 20 68 61 76 65 20 74 6f 20 73 77 61 70 20 74  y have to swap t
47f0: 68 65 20 69 6e 64 69 63 65 73 0a 09 23 20 20 20  he indices..#   
4800: 20 20 20 20 74 6f 20 65 6e 73 75 72 65 20 74 68      to ensure th
4810: 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  at the following
4820: 20 6c 6f 6f 70 20 72 75 6e 73 20 63 6f 72 72 65   loop runs corre
4830: 63 74 6c 79 2e 0a 09 23 0a 09 23 20 4e 6f 74 65  ctly...#..# Note
4840: 20 32 3a 20 73 74 61 72 74 20 3d 3d 20 65 6e 64   2: start == end
4850: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
4860: 2e 20 49 74 20 69 6e 64 69 63 61 74 65 73 20 61  . It indicates a
4870: 0a 09 23 20 20 20 20 20 20 20 20 20 73 65 6c 66  ..#         self
4880: 2d 64 65 70 65 6e 64 65 6e 63 79 20 64 75 65 20  -dependency due 
4890: 74 6f 20 74 68 65 20 75 6e 69 71 75 65 6e 65 73  to the uniquenes
48a0: 73 20 6f 66 20 70 6f 73 69 74 69 6f 6e 73 2c 0a  s of positions,.
48b0: 09 23 20 20 20 20 20 20 20 20 20 61 6e 64 20 74  .#         and t
48c0: 68 61 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  hat is something
48d0: 20 77 65 20 68 61 76 65 20 72 75 6c 65 64 20 6f   we have ruled o
48e0: 75 74 20 61 6c 72 65 61 64 79 2c 20 73 65 65 0a  ut already, see.
48f0: 09 23 20 20 20 20 20 20 20 20 20 27 72 65 76 20  .#         'rev 
4900: 69 6e 74 65 72 6e 61 6c 73 75 63 63 65 73 73 6f  internalsuccesso
4910: 72 73 27 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b  rs'....foreach {
4920: 72 69 64 20 63 68 69 6c 64 72 65 6e 7d 20 5b 61  rid children} [a
4930: 72 72 61 79 20 67 65 74 20 64 65 70 65 6e 64 65  rray get depende
4940: 6e 63 69 65 73 5d 20 7b 0a 09 20 20 20 20 66 6f  ncies] {..    fo
4950: 72 65 61 63 68 20 63 68 69 6c 64 20 24 63 68 69  reach child $chi
4960: 6c 64 72 65 6e 20 7b 0a 09 09 73 65 74 20 64 6b  ldren {...set dk
4970: 65 79 20 20 20 20 5b 6c 69 73 74 20 24 72 69 64  ey    [list $rid
4980: 20 24 63 68 69 6c 64 5d 0a 09 09 73 65 74 20 73   $child]...set s
4990: 74 61 72 74 20 20 20 24 70 6f 73 28 24 72 69 64  tart   $pos($rid
49a0: 29 0a 09 09 73 65 74 20 65 6e 64 20 20 20 20 20  )...set end     
49b0: 24 70 6f 73 28 24 63 68 69 6c 64 29 0a 09 09 73  $pos($child)...s
49c0: 65 74 20 63 72 6f 73 73 65 73 20 7b 7d 0a 0a 09  et crosses {}...
49d0: 09 69 66 20 7b 24 73 74 61 72 74 20 3e 20 24 65  .if {$start > $e
49e0: 6e 64 7d 20 7b 0a 09 09 20 20 20 20 77 68 69 6c  nd} {...    whil
49f0: 65 20 7b 24 65 6e 64 20 3c 20 24 73 74 61 72 74  e {$end < $start
4a00: 7d 20 7b 0a 09 09 09 6c 61 70 70 65 6e 64 20 63  } {....lappend c
4a10: 72 6f 73 73 65 73 20 24 65 6e 64 0a 09 09 09 69  rosses $end....i
4a20: 6e 63 72 20 63 72 6f 73 73 28 24 65 6e 64 29 0a  ncr cross($end).
4a30: 09 09 09 69 6e 63 72 20 65 6e 64 0a 09 09 20 20  ...incr end...  
4a40: 20 20 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09    }...} else {..
4a50: 09 20 20 20 20 77 68 69 6c 65 20 7b 24 73 74 61  .    while {$sta
4a60: 72 74 20 3c 20 24 65 6e 64 7d 20 7b 0a 09 09 09  rt < $end} {....
4a70: 6c 61 70 70 65 6e 64 20 63 72 6f 73 73 65 73 20  lappend crosses 
4a80: 24 73 74 61 72 74 0a 09 09 09 69 6e 63 72 20 63  $start....incr c
4a90: 72 6f 73 73 28 24 73 74 61 72 74 29 0a 09 09 09  ross($start)....
4aa0: 69 6e 63 72 20 73 74 61 72 74 0a 09 09 20 20 20  incr start...   
4ab0: 20 7d 0a 09 09 7d 0a 09 09 73 65 74 20 64 65 70   }...}...set dep
4ac0: 63 28 24 64 6b 65 79 29 20 24 63 72 6f 73 73 65  c($dkey) $crosse
4ad0: 73 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 49 6e  s..    }..}...In
4ae0: 69 74 69 61 6c 69 7a 65 44 65 6c 74 61 73 20 24  itializeDeltas $
4af0: 72 65 76 69 73 69 6f 6e 73 0a 09 72 65 74 75 72  revisions..retur
4b00: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f  n.    }..    pro
4b10: 63 20 49 6e 69 74 69 61 6c 69 7a 65 44 65 6c 74  c InitializeDelt
4b20: 61 73 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b  as {revisions} {
4b30: 0a 09 75 70 76 61 72 20 31 20 64 65 6c 74 61 20  ..upvar 1 delta 
4b40: 64 65 6c 74 61 0a 0a 09 23 20 50 75 6c 6c 20 74  delta...# Pull t
4b50: 68 65 20 74 69 6d 65 73 74 61 6d 70 73 20 66 6f  he timestamps fo
4b60: 72 20 61 6c 6c 20 72 65 76 69 73 69 6f 6e 73 20  r all revisions 
4b70: 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  in the changeset
4b80: 73 20 61 6e 64 0a 09 23 20 63 6f 6d 70 75 74 65  s and..# compute
4b90: 20 74 68 65 69 72 20 64 65 6c 74 61 73 20 66 6f   their deltas fo
4ba0: 72 20 75 73 65 20 62 79 20 74 68 65 20 62 72 65  r use by the bre
4bb0: 61 6b 20 66 69 6e 64 65 72 2e 0a 0a 09 61 72 72  ak finder....arr
4bc0: 61 79 20 73 65 74 20 64 65 6c 74 61 20 7b 7d 0a  ay set delta {}.
4bd0: 09 61 72 72 61 79 20 73 65 74 20 73 74 61 6d 70  .array set stamp
4be0: 20 7b 7d 0a 0a 09 73 65 74 20 74 68 65 73 65 74   {}...set theset
4bf0: 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69   ('[join $revisi
4c00: 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66 6f  ons {','}]')..fo
4c10: 72 65 61 63 68 20 7b 72 69 64 20 74 69 6d 65 7d  reach {rid time}
4c20: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20   [state run ".. 
4c30: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c     SELECT R.rid,
4c40: 20 52 2e 64 61 74 65 0a 09 20 20 20 20 46 52 4f   R.date..    FRO
4c50: 4d 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20  M revision R..  
4c60: 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 49 4e    WHERE R.rid IN
4c70: 20 24 74 68 65 73 65 74 0a 09 22 5d 20 7b 0a 09   $theset.."] {..
4c80: 20 20 20 20 73 65 74 20 73 74 61 6d 70 28 24 72      set stamp($r
4c90: 69 64 29 20 24 74 69 6d 65 0a 09 7d 0a 0a 09 73  id) $time..}...s
4ca0: 65 74 20 6e 20 30 0a 09 66 6f 72 65 61 63 68 20  et n 0..foreach 
4cb0: 72 69 64 20 5b 6c 72 61 6e 67 65 20 24 72 65 76  rid [lrange $rev
4cc0: 69 73 69 6f 6e 73 20 30 20 65 6e 64 2d 31 5d 20  isions 0 end-1] 
4cd0: 72 6e 65 78 74 20 5b 6c 72 61 6e 67 65 20 24 72  rnext [lrange $r
4ce0: 65 76 69 73 69 6f 6e 73 20 31 20 65 6e 64 5d 20  evisions 1 end] 
4cf0: 7b 0a 09 20 20 20 20 73 65 74 20 64 65 6c 74 61  {..    set delta
4d00: 28 24 6e 29 20 5b 65 78 70 72 20 7b 24 73 74 61  ($n) [expr {$sta
4d10: 6d 70 28 24 72 6e 65 78 74 29 20 2d 20 24 73 74  mp($rnext) - $st
4d20: 61 6d 70 28 24 72 69 64 29 7d 5d 0a 09 20 20 20  amp($rid)}]..   
4d30: 20 69 6e 63 72 20 6e 0a 09 7d 0a 09 72 65 74 75   incr n..}..retu
4d40: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72  rn.    }..    pr
4d50: 6f 63 20 46 69 6e 64 42 65 73 74 42 72 65 61 6b  oc FindBestBreak
4d60: 20 7b 72 61 6e 67 65 7d 20 7b 0a 09 75 70 76 61   {range} {..upva
4d70: 72 20 31 20 63 72 6f 73 73 20 63 72 6f 73 73 20  r 1 cross cross 
4d80: 64 65 6c 74 61 20 64 65 6c 74 61 0a 0a 09 23 20  delta delta...# 
4d90: 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65  Determine the be
4da0: 73 74 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f  st break locatio
4db0: 6e 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 72  n in the given r
4dc0: 61 6e 67 65 20 6f 66 0a 09 23 20 70 6f 73 69 74  ange of..# posit
4dd0: 69 6f 6e 73 2e 20 46 69 72 73 74 20 77 65 20 6c  ions. First we l
4de0: 6f 6f 6b 20 66 6f 72 20 74 68 65 20 6c 6f 63 61  ook for the loca
4df0: 74 69 6f 6e 73 20 77 69 74 68 20 74 68 65 20 6d  tions with the m
4e00: 61 78 69 6d 61 6c 0a 09 23 20 6e 75 6d 62 65 72  aximal..# number
4e10: 20 6f 66 20 63 72 6f 73 73 69 6e 67 73 2e 20 49   of crossings. I
4e20: 66 20 74 68 65 72 65 20 61 72 65 20 73 65 76 65  f there are seve
4e30: 72 61 6c 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20  ral we look for 
4e40: 74 68 65 0a 09 23 20 73 68 6f 72 74 65 73 74 20  the..# shortest 
4e50: 74 69 6d 65 20 69 6e 74 65 72 76 61 6c 20 61 6d  time interval am
4e60: 6f 6e 67 20 74 68 65 6d 2e 20 49 66 20 77 65 20  ong them. If we 
4e70: 73 74 69 6c 6c 20 68 61 76 65 20 6d 75 6c 74 69  still have multi
4e80: 70 6c 65 0a 09 23 20 70 6f 73 73 69 62 69 6c 69  ple..# possibili
4e90: 74 69 65 73 20 61 66 74 65 72 20 74 68 61 74 20  ties after that 
4ea0: 77 65 20 73 65 6c 65 63 74 20 74 68 65 20 65 61  we select the ea
4eb0: 72 6c 69 65 73 74 20 6c 6f 63 61 74 69 6f 6e 0a  rliest location.
4ec0: 09 23 20 61 6d 6f 6e 67 20 74 68 65 73 65 2e 0a  .# among these..
4ed0: 0a 09 23 20 4e 6f 74 65 3a 20 49 66 20 74 68 65  ..# Note: If the
4ee0: 20 6d 61 78 69 6d 61 6c 20 6e 75 6d 62 65 72 20   maximal number 
4ef0: 6f 66 20 63 72 6f 73 73 69 6e 67 73 20 69 73 20  of crossings is 
4f00: 30 20 74 68 65 6e 20 74 68 65 20 72 61 6e 67 65  0 then the range
4f10: 0a 09 23 20 20 20 20 20 20 20 68 61 73 20 6e 6f  ..#       has no
4f20: 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64   internal depend
4f30: 65 6e 63 69 65 73 2c 20 61 6e 64 20 6e 6f 20 62  encies, and no b
4f40: 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 61 74  reak location at
4f50: 0a 09 23 20 20 20 20 20 20 20 61 6c 6c 2e 20 54  ..#       all. T
4f60: 68 69 73 20 70 6f 73 73 69 62 69 6c 69 74 79 20  his possibility 
4f70: 69 73 20 73 69 67 6e 61 6c 65 64 20 76 69 61 20  is signaled via 
4f80: 72 65 73 75 6c 74 20 2d 31 2e 0a 0a 09 23 20 4e  result -1....# N
4f90: 6f 74 65 3a 20 41 20 72 61 6e 67 65 20 6f 66 20  ote: A range of 
4fa0: 6c 65 6e 67 74 68 20 31 20 6f 72 20 6c 65 73 73  length 1 or less
4fb0: 20 63 61 6e 6e 6f 74 20 68 61 76 65 20 69 6e 74   cannot have int
4fc0: 65 72 6e 61 6c 0a 09 23 20 20 20 20 20 20 20 64  ernal..#       d
4fd0: 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 20  ependencies, as 
4fe0: 74 68 61 74 20 6e 65 65 64 73 20 61 74 20 6c 65  that needs at le
4ff0: 61 73 74 20 74 77 6f 20 72 65 76 69 73 69 6f 6e  ast two revision
5000: 73 20 69 6e 0a 09 23 20 20 20 20 20 20 20 74 68  s in..#       th
5010: 65 20 72 61 6e 67 65 2e 0a 0a 09 69 66 20 7b 5b  e range....if {[
5020: 6c 6c 65 6e 67 74 68 20 24 72 61 6e 67 65 5d 20  llength $range] 
5030: 3c 20 32 7d 20 7b 20 72 65 74 75 72 6e 20 2d 31  < 2} { return -1
5040: 20 7d 0a 0a 09 73 65 74 20 6d 61 78 20 2d 31 0a   }...set max -1.
5050: 09 73 65 74 20 62 65 73 74 20 7b 7d 0a 0a 09 66  .set best {}...f
5060: 6f 72 65 61 63 68 20 6c 6f 63 61 74 69 6f 6e 20  oreach location 
5070: 24 72 61 6e 67 65 20 7b 0a 09 20 20 20 20 73 65  $range {..    se
5080: 74 20 63 72 6f 73 73 69 6e 67 73 20 24 63 72 6f  t crossings $cro
5090: 73 73 28 24 6c 6f 63 61 74 69 6f 6e 29 0a 09 20  ss($location).. 
50a0: 20 20 20 69 66 20 7b 24 63 72 6f 73 73 69 6e 67     if {$crossing
50b0: 73 20 3e 20 24 6d 61 78 7d 20 7b 0a 09 09 73 65  s > $max} {...se
50c0: 74 20 6d 61 78 20 20 24 63 72 6f 73 73 69 6e 67  t max  $crossing
50d0: 73 0a 09 09 73 65 74 20 62 65 73 74 20 5b 6c 69  s...set best [li
50e0: 73 74 20 24 6c 6f 63 61 74 69 6f 6e 5d 0a 09 09  st $location]...
50f0: 63 6f 6e 74 69 6e 75 65 0a 09 20 20 20 20 7d 20  continue..    } 
5100: 65 6c 73 65 69 66 20 7b 24 63 72 6f 73 73 69 6e  elseif {$crossin
5110: 67 73 20 3d 3d 20 24 6d 61 78 7d 20 7b 0a 09 09  gs == $max} {...
5120: 6c 61 70 70 65 6e 64 20 62 65 73 74 20 24 6c 6f  lappend best $lo
5130: 63 61 74 69 6f 6e 0a 09 20 20 20 20 7d 0a 09 7d  cation..    }..}
5140: 0a 0a 09 69 66 20 7b 24 6d 61 78 20 3d 3d 20 30  ...if {$max == 0
5150: 7d 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 72  }            { r
5160: 65 74 75 72 6e 20 2d 31 20 7d 0a 09 69 66 20 7b  eturn -1 }..if {
5170: 5b 6c 6c 65 6e 67 74 68 20 24 62 65 73 74 5d 20  [llength $best] 
5180: 3d 3d 20 31 7d 20 7b 20 72 65 74 75 72 6e 20 5b  == 1} { return [
5190: 6c 69 6e 64 65 78 20 24 62 65 73 74 20 30 5d 20  lindex $best 0] 
51a0: 7d 0a 0a 09 73 65 74 20 6c 6f 63 61 74 69 6f 6e  }...set location
51b0: 73 20 24 62 65 73 74 0a 09 73 65 74 20 62 65 73  s $best..set bes
51c0: 74 20 7b 7d 0a 09 73 65 74 20 6d 69 6e 20 2d 31  t {}..set min -1
51d0: 0a 0a 09 66 6f 72 65 61 63 68 20 6c 6f 63 61 74  ...foreach locat
51e0: 69 6f 6e 20 24 6c 6f 63 61 74 69 6f 6e 73 20 7b  ion $locations {
51f0: 0a 09 20 20 20 20 73 65 74 20 69 6e 74 65 72 76  ..    set interv
5200: 61 6c 20 24 64 65 6c 74 61 28 24 6c 6f 63 61 74  al $delta($locat
5210: 69 6f 6e 29 0a 09 20 20 20 20 69 66 20 7b 28 24  ion)..    if {($
5220: 6d 69 6e 20 3c 20 30 29 20 7c 7c 20 28 24 69 6e  min < 0) || ($in
5230: 74 65 72 76 61 6c 20 3c 20 24 6d 69 6e 29 7d 20  terval < $min)} 
5240: 7b 0a 09 09 73 65 74 20 6d 69 6e 20 20 24 69 6e  {...set min  $in
5250: 74 65 72 76 61 6c 0a 09 09 73 65 74 20 62 65 73  terval...set bes
5260: 74 20 5b 6c 69 73 74 20 24 6c 6f 63 61 74 69 6f  t [list $locatio
5270: 6e 5d 0a 09 20 20 20 20 7d 20 65 6c 73 65 69 66  n]..    } elseif
5280: 20 7b 24 69 6e 74 65 72 76 61 6c 20 3d 3d 20 24   {$interval == $
5290: 6d 69 6e 7d 20 7b 0a 09 09 6c 61 70 70 65 6e 64  min} {...lappend
52a0: 20 62 65 73 74 20 24 6c 6f 63 61 74 69 6f 6e 0a   best $location.
52b0: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b  .    }..}...if {
52c0: 5b 6c 6c 65 6e 67 74 68 20 24 62 65 73 74 5d 20  [llength $best] 
52d0: 3d 3d 20 31 7d 20 7b 20 72 65 74 75 72 6e 20 5b  == 1} { return [
52e0: 6c 69 6e 64 65 78 20 24 62 65 73 74 20 30 5d 20  lindex $best 0] 
52f0: 7d 0a 0a 09 72 65 74 75 72 6e 20 5b 6c 69 6e 64  }...return [lind
5300: 65 78 20 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 67  ex [lsort -integ
5310: 65 72 20 2d 69 6e 63 72 65 61 73 69 6e 67 20 24  er -increasing $
5320: 62 65 73 74 5d 20 30 5d 0a 20 20 20 20 7d 0a 0a  best] 0].    }..
5330: 20 20 20 20 70 72 6f 63 20 43 75 74 41 74 20 7b      proc CutAt {
5340: 6c 6f 63 61 74 69 6f 6e 7d 20 7b 0a 09 75 70 76  location} {..upv
5350: 61 72 20 31 20 63 72 6f 73 73 20 63 72 6f 73 73  ar 1 cross cross
5360: 20 64 65 70 63 20 64 65 70 63 0a 0a 09 23 20 49   depc depc...# I
5370: 74 20 77 61 73 20 64 65 63 69 64 65 64 20 74 6f  t was decided to
5380: 20 73 70 6c 69 74 20 74 68 65 20 63 68 61 6e 67   split the chang
5390: 65 73 65 74 20 61 74 20 74 68 65 20 67 69 76 65  eset at the give
53a0: 6e 0a 09 23 20 6c 6f 63 61 74 69 6f 6e 2e 20 54  n..# location. T
53b0: 68 69 73 20 63 75 74 73 20 61 20 6e 75 6d 62 65  his cuts a numbe
53c0: 72 20 6f 66 20 64 65 70 65 6e 64 65 6e 63 69 65  r of dependencie
53d0: 73 2e 20 48 65 72 65 20 77 65 20 75 70 64 61 74  s. Here we updat
53e0: 65 0a 09 23 20 74 68 65 20 63 72 6f 73 73 20 69  e..# the cross i
53f0: 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68  nformation so th
5400: 61 74 20 74 68 65 20 62 72 65 61 6b 20 66 69 6e  at the break fin
5410: 64 65 72 20 68 61 73 20 61 63 63 75 72 61 74 65  der has accurate
5420: 0a 09 23 20 64 61 74 61 20 77 68 65 6e 20 77 65  ..# data when we
5430: 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20 67 65 6e   look at the gen
5440: 65 72 61 74 65 64 20 66 72 61 67 6d 65 6e 74 73  erated fragments
5450: 2e 0a 0a 09 73 65 74 20 73 69 78 20 5b 6c 6f 67  ....set six [log
5460: 20 76 69 73 69 62 6c 65 3f 20 36 5d 0a 0a 09 66   visible? 6]...f
5470: 6f 72 65 61 63 68 20 7b 64 65 70 20 72 61 6e 67  oreach {dep rang
5480: 65 7d 20 5b 61 72 72 61 79 20 67 65 74 20 64 65  e} [array get de
5490: 70 63 5d 20 7b 0a 09 20 20 20 20 23 20 43 68 65  pc] {..    # Che
54a0: 63 6b 20 61 6c 6c 20 64 65 70 65 6e 64 65 6e 63  ck all dependenc
54b0: 69 65 73 20 73 74 69 6c 6c 20 6b 6e 6f 77 6e 2c  ies still known,
54c0: 20 74 61 6b 65 20 74 68 65 69 72 20 72 61 6e 67   take their rang
54d0: 65 20 61 6e 64 0a 09 20 20 20 20 23 20 73 65 65  e and..    # see
54e0: 20 69 66 20 74 68 65 20 62 72 65 61 6b 20 6c 6f   if the break lo
54f0: 63 61 74 69 6f 6e 20 66 61 6c 6c 73 20 77 69 74  cation falls wit
5500: 68 69 6e 2e 0a 0a 09 20 20 20 20 42 6f 72 64 65  hin....    Borde
5510: 72 20 24 72 61 6e 67 65 20 73 20 65 0a 09 20 20  r $range s e..  
5520: 20 20 69 66 20 7b 24 6c 6f 63 61 74 69 6f 6e 20    if {$location 
5530: 3c 20 24 73 7d 20 63 6f 6e 74 69 6e 75 65 20 3b  < $s} continue ;
5540: 20 23 20 62 72 65 61 6b 20 62 65 66 6f 72 65 20   # break before 
5550: 72 61 6e 67 65 2c 20 69 67 6e 6f 72 65 0a 09 20  range, ignore.. 
5560: 20 20 20 69 66 20 7b 24 6c 6f 63 61 74 69 6f 6e     if {$location
5570: 20 3e 20 24 65 7d 20 63 6f 6e 74 69 6e 75 65 20   > $e} continue 
5580: 3b 20 23 20 62 72 65 61 6b 20 61 66 74 65 72 20  ; # break after 
5590: 72 61 6e 67 65 2c 20 69 67 6e 6f 72 65 2e 0a 0a  range, ignore...
55a0: 09 20 20 20 20 23 20 54 68 69 73 20 64 65 70 65  .    # This depe
55b0: 6e 64 65 6e 63 79 20 63 72 6f 73 73 65 73 20 74  ndency crosses t
55c0: 68 65 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f  he break locatio
55d0: 6e 2e 20 57 65 20 72 65 6d 6f 76 65 20 69 74 0a  n. We remove it.
55e0: 09 20 20 20 20 23 20 66 72 6f 6d 20 74 68 65 20  .    # from the 
55f0: 63 72 6f 73 73 69 6e 67 73 20 63 6f 75 6e 74 65  crossings counte
5600: 72 73 2c 20 61 6e 64 20 74 68 65 6e 20 61 6c 73  rs, and then als
5610: 6f 20 66 72 6f 6d 20 74 68 65 20 73 65 74 0a 09  o from the set..
5620: 20 20 20 20 23 20 6f 66 20 6b 6e 6f 77 6e 20 64      # of known d
5630: 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 20  ependencies, as 
5640: 77 65 20 61 72 65 20 64 6f 6e 65 20 77 69 74 68  we are done with
5650: 20 69 74 2e 0a 0a 09 20 20 20 20 66 6f 72 65 61   it....    forea
5660: 63 68 20 6c 6f 63 20 24 64 65 70 63 28 24 64 65  ch loc $depc($de
5670: 70 29 20 7b 20 69 6e 63 72 20 63 72 6f 73 73 28  p) { incr cross(
5680: 24 6c 6f 63 29 20 2d 31 20 7d 0a 09 20 20 20 20  $loc) -1 }..    
5690: 75 6e 73 65 74 20 64 65 70 63 28 24 64 65 70 29  unset depc($dep)
56a0: 0a 0a 09 20 20 20 20 69 66 20 7b 21 24 73 69 78  ...    if {!$six
56b0: 7d 20 63 6f 6e 74 69 6e 75 65 0a 0a 09 20 20 20  } continue...   
56c0: 20 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73   struct::list as
56d0: 73 69 67 6e 20 24 64 65 70 20 70 61 72 65 6e 74  sign $dep parent
56e0: 20 63 68 69 6c 64 0a 09 20 20 20 20 6c 6f 67 20   child..    log 
56f0: 77 72 69 74 65 20 35 20 63 73 65 74 73 20 22 42  write 5 csets "B
5700: 72 6f 6b 65 20 64 65 70 65 6e 64 65 6e 63 79 20  roke dependency 
5710: 5b 50 44 20 24 70 61 72 65 6e 74 5d 20 2d 2d 3e  [PD $parent] -->
5720: 20 5b 50 44 20 24 63 68 69 6c 64 5d 22 0a 09 7d   [PD $child]"..}
5730: 0a 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  ...return.    }.
5740: 0a 20 20 20 20 23 20 50 72 69 6e 74 20 69 64 65  .    # Print ide
5750: 6e 74 69 66 79 69 6e 67 20 64 61 74 61 20 66 6f  ntifying data fo
5760: 72 20 61 20 72 65 76 69 73 69 6f 6e 20 28 70 72  r a revision (pr
5770: 6f 6a 65 63 74 2c 20 66 69 6c 65 2c 20 64 6f 74  oject, file, dot
5780: 74 65 64 20 72 65 76 0a 20 20 20 20 23 20 6e 75  ted rev.    # nu
5790: 6d 62 65 72 29 2c 20 66 6f 72 20 68 69 67 68 20  mber), for high 
57a0: 76 65 72 62 6f 73 69 74 79 20 6c 6f 67 20 6f 75  verbosity log ou
57b0: 74 70 75 74 2e 0a 0a 20 20 20 20 70 72 6f 63 20  tput...    proc 
57c0: 50 44 20 7b 69 64 7d 20 7b 0a 09 66 6f 72 65 61  PD {id} {..forea
57d0: 63 68 20 7b 70 20 66 20 72 7d 20 5b 73 74 61 74  ch {p f r} [stat
57e0: 65 20 72 75 6e 20 7b 0a 09 09 53 45 4c 45 43 54  e run {...SELECT
57f0: 20 50 2e 6e 61 6d 65 20 2c 20 46 2e 6e 61 6d 65   P.name , F.name
5800: 2c 20 52 2e 72 65 76 0a 09 09 46 52 4f 4d 20 72  , R.rev...FROM r
5810: 65 76 69 73 69 6f 6e 20 52 2c 20 66 69 6c 65 20  evision R, file 
5820: 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09 09 57  F, project P...W
5830: 48 45 52 45 20 52 2e 72 69 64 20 3d 20 24 69 64  HERE R.rid = $id
5840: 0a 09 09 41 4e 44 20 20 20 52 2e 66 69 64 20 3d  ...AND   R.fid =
5850: 20 46 2e 66 69 64 0a 09 09 41 4e 44 20 20 20 46   F.fid...AND   F
5860: 2e 70 69 64 20 3d 20 50 2e 70 69 64 0a 09 7d 5d  .pid = P.pid..}]
5870: 20 62 72 65 61 6b 0a 09 72 65 74 75 72 6e 20 22   break..return "
5880: 27 24 70 20 3a 20 24 66 2f 24 72 27 22 0a 20 20  '$p : $f/$r'".  
5890: 20 20 7d 0a 0a 20 20 20 20 23 20 50 72 69 6e 74    }..    # Print
58a0: 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ing one or more 
58b0: 72 61 6e 67 65 73 2c 20 66 6f 72 6d 61 74 74 65  ranges, formatte
58c0: 64 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 69  d, and only thei
58d0: 72 20 62 6f 72 64 65 72 20 74 6f 0a 20 20 20 20  r border to.    
58e0: 23 20 6b 65 65 70 20 74 68 65 20 73 74 72 69 6e  # keep the strin
58f0: 67 73 20 73 68 6f 72 74 2e 0a 0a 20 20 20 20 70  gs short...    p
5900: 72 6f 63 20 50 52 73 20 7b 72 61 6e 67 65 73 7d  roc PRs {ranges}
5910: 20 7b 0a 09 72 65 74 75 72 6e 20 5b 73 74 72 75   {..return [stru
5920: 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20 24 72 61  ct::list map $ra
5930: 6e 67 65 73 20 5b 6d 79 70 72 6f 63 20 50 52 5d  nges [myproc PR]
5940: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f  ].    }..    pro
5950: 63 20 50 52 20 7b 72 61 6e 67 65 7d 20 7b 0a 09  c PR {range} {..
5960: 42 6f 72 64 65 72 20 24 72 61 6e 67 65 20 73 20  Border $range s 
5970: 65 0a 09 72 65 74 75 72 6e 20 3c 24 7b 73 7d 2e  e..return <${s}.
5980: 2e 2e 24 7b 65 7d 3e 0a 20 20 20 20 7d 0a 0a 20  ..${e}>.    }.. 
5990: 20 20 20 70 72 6f 63 20 42 6f 72 64 65 72 20 7b     proc Border {
59a0: 72 61 6e 67 65 20 73 76 20 65 76 7d 20 7b 0a 09  range sv ev} {..
59b0: 75 70 76 61 72 20 31 20 24 73 76 20 73 20 24 65  upvar 1 $sv s $e
59c0: 76 20 65 0a 09 73 65 74 20 73 20 5b 6c 69 6e 64  v e..set s [lind
59d0: 65 78 20 24 72 61 6e 67 65 20 30 5d 0a 09 73 65  ex $range 0]..se
59e0: 74 20 65 20 5b 6c 69 6e 64 65 78 20 24 72 61 6e  t e [lindex $ran
59f0: 67 65 20 65 6e 64 5d 0a 09 72 65 74 75 72 6e 0a  ge end]..return.
5a00: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23      }..    # # #
5a10: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
5a20: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
5a30: 23 23 0a 0a 20 20 20 20 74 79 70 65 76 61 72 69  ##..    typevari
5a40: 61 62 6c 65 20 6d 79 63 68 61 6e 67 65 73 65 74  able mychangeset
5a50: 73 20 20 20 20 20 7b 7d 20 3b 20 23 20 4c 69 73  s     {} ; # Lis
5a60: 74 20 6f 66 20 61 6c 6c 20 6b 6e 6f 77 6e 20 63  t of all known c
5a70: 68 61 6e 67 65 73 65 74 73 2e 0a 20 20 20 20 74  hangesets..    t
5a80: 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 69 74  ypevariable myit
5a90: 65 6d 6d 61 70 20 2d 61 72 72 61 79 20 7b 7d 20  emmap -array {} 
5aa0: 3b 20 23 20 4d 61 70 20 66 72 6f 6d 20 69 74 65  ; # Map from ite
5ab0: 6d 73 20 28 74 61 67 67 65 64 29 20 74 6f 0a 09  ms (tagged) to..
5ac0: 09 09 09 20 20 20 20 20 20 20 23 20 74 68 65 20  ...       # the 
5ad0: 6c 69 73 74 20 6f 66 20 63 68 61 6e 67 65 73 65  list of changese
5ae0: 74 73 0a 09 09 09 09 20 20 20 20 20 20 20 23 20  ts.....       # 
5af0: 63 6f 6e 74 61 69 6e 69 6e 67 20 69 74 2e 20 45  containing it. E
5b00: 61 63 68 20 69 74 65 6d 20 63 61 6e 0a 09 09 09  ach item can....
5b10: 09 20 20 20 20 20 20 20 23 20 62 65 20 75 73 65  .       # be use
5b20: 64 20 62 79 20 6f 6e 6c 79 20 6f 6e 65 0a 09 09  d by only one...
5b30: 09 09 20 20 20 20 20 20 20 23 20 63 68 61 6e 67  ..       # chang
5b40: 65 73 65 74 2e 0a 20 20 20 20 74 79 70 65 76 61  eset..    typeva
5b50: 72 69 61 62 6c 65 20 6d 79 69 64 6d 61 70 20 20  riable myidmap  
5b60: 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d   -array {} ; # M
5b70: 61 70 20 66 72 6f 6d 20 63 68 61 6e 67 65 73 65  ap from changese
5b80: 74 20 69 64 20 74 6f 0a 09 09 09 09 20 20 20 20  t id to.....    
5b90: 20 20 20 23 20 63 68 61 6e 67 65 73 65 74 2e 0a     # changeset..
5ba0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
5bb0: 61 6c 6c 20 20 20 20 7b 7d 20 20 20 20 7b 20 72  all    {}    { r
5bc0: 65 74 75 72 6e 20 24 6d 79 63 68 61 6e 67 65 73  eturn $mychanges
5bd0: 65 74 73 20 7d 0a 20 20 20 20 74 79 70 65 6d 65  ets }.    typeme
5be0: 74 68 6f 64 20 6f 66 20 20 20 20 20 7b 63 69 64  thod of     {cid
5bf0: 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 64  } { return $myid
5c00: 6d 61 70 28 24 63 69 64 29 20 7d 0a 20 20 20 20  map($cid) }.    
5c10: 74 79 70 65 6d 65 74 68 6f 64 20 6f 66 69 74 65  typemethod ofite
5c20: 6d 20 7b 69 69 64 7d 20 7b 20 72 65 74 75 72 6e  m {iid} { return
5c30: 20 24 6d 79 69 74 65 6d 6d 61 70 28 24 69 69 64   $myitemmap($iid
5c40: 29 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20  ) }..    # # ## 
5c50: 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23  ### ##### ######
5c60: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
5c70: 0a 20 20 20 20 23 23 20 43 6f 6e 66 69 67 75 72  .    ## Configur
5c80: 61 74 69 6f 6e 0a 0a 20 20 20 20 70 72 61 67 6d  ation..    pragm
5c90: 61 20 2d 68 61 73 74 79 70 65 69 6e 66 6f 20 20  a -hastypeinfo  
5ca0: 20 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 74 79 70    no  ; # no typ
5cb0: 65 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a  e introspection.
5cc0: 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 69      pragma -hasi
5cd0: 6e 66 6f 20 20 20 20 20 20 20 20 6e 6f 20 20 3b  nfo        no  ;
5ce0: 20 23 20 6e 6f 20 6f 62 6a 65 63 74 20 69 6e 74   # no object int
5cf0: 72 6f 73 70 65 63 74 69 6f 6e 0a 0a 20 20 20 20  rospection..    
5d00: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
5d10: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
5d20: 23 23 23 23 23 23 23 0a 7d 0a 0a 23 23 0a 23 23  #######.}..##.##
5d30: 20 4e 4f 54 45 3a 20 54 68 65 20 73 75 63 63 65   NOTE: The succe
5d40: 73 73 6f 72 20 61 6e 64 20 70 72 65 64 65 63 65  ssor and predece
5d50: 73 73 6f 72 20 6d 65 74 68 6f 64 73 20 64 65 66  ssor methods def
5d60: 69 6e 65 64 20 62 79 20 74 68 65 20 63 6c 61 73  ined by the clas
5d70: 73 65 73 0a 23 23 20 20 20 20 20 20 20 62 65 6c  ses.##       bel
5d80: 6f 77 20 61 72 65 20 2d 2d 20 62 6f 74 74 6c 65  ow are -- bottle
5d90: 20 6e 65 63 6b 73 20 2d 2d 2e 20 4c 6f 6f 6b 20   necks --. Look 
5da0: 66 6f 72 20 77 61 79 73 20 74 6f 20 6d 61 6b 65  for ways to make
5db0: 20 74 68 65 20 53 51 4c 0a 23 23 20 20 20 20 20   the SQL.##     
5dc0: 20 20 66 61 73 74 65 72 2e 0a 23 23 0a 0a 23 20    faster..##..# 
5dd0: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23  # ## ### ##### #
5de0: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
5df0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
5e00: 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 48  ###########.## H
5e10: 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 2e  elper singleton.
5e20: 20 43 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 72 65   Commands for re
5e30: 76 69 73 69 6f 6e 20 63 68 61 6e 67 65 73 65 74  vision changeset
5e40: 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20 3a  s...snit::type :
5e50: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70  :vc::fossil::imp
5e60: 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63  ort::cvs::projec
5e70: 74 3a 3a 72 65 76 3a 3a 72 65 76 20 7b 0a 20 20  t::rev::rev {.  
5e80: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 72    typemethod byr
5e90: 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74  evision {} { ret
5ea0: 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 79 70 65  urn 1 }.    type
5eb0: 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20  method bysymbol 
5ec0: 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20    {} { return 0 
5ed0: 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  }.    typemethod
5ee0: 20 69 73 74 61 67 20 20 20 20 20 20 7b 7d 20 7b   istag      {} {
5ef0: 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20   return 0 }.    
5f00: 74 79 70 65 6d 65 74 68 6f 64 20 69 73 62 72 61  typemethod isbra
5f10: 6e 63 68 20 20 20 7b 7d 20 7b 20 72 65 74 75 72  nch   {} { retur
5f20: 6e 20 30 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d  n 0 }..    typem
5f30: 65 74 68 6f 64 20 73 74 72 20 7b 72 65 76 69 73  ethod str {revis
5f40: 69 6f 6e 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a  ion} {..struct::
5f50: 6c 69 73 74 20 61 73 73 69 67 6e 20 5b 73 74 61  list assign [sta
5f60: 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 53 45  te run {..    SE
5f70: 4c 45 43 54 20 52 2e 72 65 76 2c 20 46 2e 6e 61  LECT R.rev, F.na
5f80: 6d 65 2c 20 50 2e 6e 61 6d 65 0a 09 20 20 20 20  me, P.name..    
5f90: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20  FROM   revision 
5fa0: 52 2c 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65  R, file F, proje
5fb0: 63 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 20  ct P..    WHERE 
5fc0: 20 52 2e 72 69 64 20 3d 20 24 72 65 76 69 73 69   R.rid = $revisi
5fd0: 6f 6e 0a 09 20 20 20 20 41 4e 44 20 20 20 20 46  on..    AND    F
5fe0: 2e 66 69 64 20 3d 20 52 2e 66 69 64 0a 09 20 20  .fid = R.fid..  
5ff0: 20 20 41 4e 44 20 20 20 20 50 2e 70 69 64 20 3d    AND    P.pid =
6000: 20 46 2e 70 69 64 0a 09 7d 5d 20 72 65 76 6e 72   F.pid..}] revnr
6010: 20 66 6e 61 6d 65 20 70 6e 61 6d 65 0a 09 72 65   fname pname..re
6020: 74 75 72 6e 20 22 24 70 6e 61 6d 65 2f 24 7b 72  turn "$pname/${r
6030: 65 76 6e 72 7d 3a 3a 24 66 6e 61 6d 65 22 0a 20  evnr}::$fname". 
6040: 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75     }..    # resu
6050: 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69 6e 74 69  lt = list (minti
6060: 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a 20 20 20  me, maxtime).   
6070: 20 74 79 70 65 6d 65 74 68 6f 64 20 74 69 6d 65   typemethod time
6080: 72 61 6e 67 65 20 7b 69 74 65 6d 73 7d 20 7b 0a  range {items} {.
6090: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a  .set theset ('[j
60a0: 6f 69 6e 20 24 69 74 65 6d 73 20 7b 27 2c 27 7d  oin $items {','}
60b0: 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61  ]')..return [sta
60c0: 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53 45  te run "..    SE
60d0: 4c 45 43 54 20 4d 49 4e 28 52 2e 64 61 74 65 29  LECT MIN(R.date)
60e0: 2c 20 4d 41 58 28 52 2e 64 61 74 65 29 0a 09 20  , MAX(R.date).. 
60f0: 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e     FROM revision
6100: 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e   R..    WHERE R.
6110: 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09  rid IN $theset..
6120: 22 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  "].    }..    # 
6130: 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20 28  var(dv) = dict (
6140: 72 65 76 69 73 69 6f 6e 20 2d 3e 20 6c 69 73 74  revision -> list
6150: 20 28 72 65 76 69 73 69 6f 6e 29 29 0a 20 20 20   (revision)).   
6160: 20 74 79 70 65 6d 65 74 68 6f 64 20 69 6e 74 65   typemethod inte
6170: 72 6e 61 6c 73 75 63 63 65 73 73 6f 72 73 20 7b  rnalsuccessors {
6180: 64 76 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a  dv revisions} {.
6190: 09 75 70 76 61 72 20 31 20 24 64 76 20 64 65 70  .upvar 1 $dv dep
61a0: 65 6e 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74  endencies..set t
61b0: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72  heset ('[join $r
61c0: 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27  evisions {','}]'
61d0: 29 0a 0a 09 23 20 53 65 65 20 27 73 75 63 63 65  )...# See 'succe
61e0: 73 73 6f 72 73 27 20 62 65 6c 6f 77 20 66 6f 72  ssors' below for
61f0: 20 74 68 65 20 6d 61 69 6e 20 65 78 70 6c 61 6e   the main explan
6200: 61 74 69 6f 6e 20 6f 66 0a 09 23 20 74 68 65 20  ation of..# the 
6210: 76 61 72 69 6f 75 73 20 63 61 73 65 73 2e 20 54  various cases. T
6220: 68 69 73 20 70 69 65 63 65 20 69 73 20 73 70 65  his piece is spe
6230: 63 69 61 6c 20 69 6e 20 74 68 61 74 20 69 74 0a  cial in that it.
6240: 09 23 20 72 65 73 74 72 69 63 74 73 20 74 68 65  .# restricts the
6250: 20 73 75 63 63 65 73 73 6f 72 73 20 77 65 20 6c   successors we l
6260: 6f 6f 6b 20 66 6f 72 20 74 6f 20 74 68 65 20 73  ook for to the s
6270: 61 6d 65 20 73 65 74 20 6f 66 0a 09 23 20 72 65  ame set of..# re
6280: 76 69 73 69 6f 6e 73 20 77 65 20 73 74 61 72 74  visions we start
6290: 20 66 72 6f 6d 2e 20 53 65 6e 73 69 62 6c 65 20   from. Sensible 
62a0: 61 73 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  as we are lookin
62b0: 67 20 66 6f 72 0a 09 23 20 63 68 61 6e 67 65 73  g for..# changes
62c0: 65 74 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65  et internal depe
62d0: 6e 64 65 6e 63 69 65 73 2e 0a 0a 09 61 72 72 61  ndencies....arra
62e0: 79 20 73 65 74 20 64 65 70 20 7b 7d 0a 0a 09 66  y set dep {}...f
62f0: 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c  oreach {rid chil
6300: 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a  d} [state run ".
6310: 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d 61 72     -- (1) Primar
6320: 79 20 63 68 69 6c 64 0a 09 20 20 20 20 53 45 4c  y child..    SEL
6330: 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63 68 69  ECT R.rid, R.chi
6340: 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72  ld..    FROM   r
6350: 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57  evision R..    W
6360: 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e  HERE  R.rid   IN
6370: 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20   $theset     -- 
6380: 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69  Restrict to revi
6390: 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73  sions of interes
63a0: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e  t..    AND    R.
63b0: 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c  child IS NOT NUL
63c0: 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d  L    -- Has prim
63d0: 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20 41  ary child..    A
63e0: 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49 4e  ND    R.child IN
63f0: 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20   $theset     -- 
6400: 57 68 69 63 68 20 69 73 20 61 6c 73 6f 20 6f 66  Which is also of
6410: 20 69 6e 74 65 72 65 73 74 0a 20 20 20 20 55 4e   interest.    UN
6420: 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32 29 20 53  ION.    -- (2) S
6430: 65 63 6f 6e 64 61 72 79 20 28 62 72 61 6e 63 68  econdary (branch
6440: 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20  ) children..    
6450: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 42 2e  SELECT R.rid, B.
6460: 62 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  brid..    FROM  
6470: 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76   revision R, rev
6480: 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64  isionbranchchild
6490: 72 65 6e 20 42 0a 09 20 20 20 20 57 48 45 52 45  ren B..    WHERE
64a0: 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68    R.rid   IN $th
64b0: 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74  eset     -- Rest
64c0: 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e  rict to revision
64d0: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20  s of interest.. 
64e0: 20 20 20 41 4e 44 20 20 20 20 52 2e 72 69 64 20     AND    R.rid 
64f0: 3d 20 42 2e 72 69 64 20 20 20 20 20 20 20 20 20  = B.rid         
6500: 20 2d 2d 20 53 65 6c 65 63 74 20 73 75 62 73 65   -- Select subse
6510: 74 20 6f 66 20 62 72 61 6e 63 68 20 63 68 69 6c  t of branch chil
6520: 64 72 65 6e 0a 09 20 20 20 20 41 4e 44 20 20 20  dren..    AND   
6530: 20 42 2e 62 72 69 64 20 49 4e 20 24 74 68 65 73   B.brid IN $thes
6540: 65 74 20 20 20 20 20 20 2d 2d 20 57 68 69 63 68  et      -- Which
6550: 20 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e 74 65   is also of inte
6560: 72 65 73 74 0a 20 20 20 20 55 4e 49 4f 4e 0a 20  rest.    UNION. 
6570: 20 20 20 2d 2d 20 28 34 29 20 43 68 69 6c 64 20     -- (4) Child 
6580: 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 20 73 75  of trunk root su
6590: 63 63 65 73 73 6f 72 20 6f 66 20 6c 61 73 74 20  ccessor of last 
65a0: 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b 2e 0a 09  NTDB on trunk...
65b0: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64      SELECT R.rid
65c0: 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20 20 20 20  , RA.child..    
65d0: 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c  FROM revision R,
65e0: 20 72 65 76 69 73 69 6f 6e 20 52 41 0a 09 20 20   revision RA..  
65f0: 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 20 20    WHERE R.rid   
6600: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 20  IN $theset      
6610: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72  -- Restrict to r
6620: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65  evisions of inte
6630: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
6640: 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20 20  R.isdefault     
6650: 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72          -- Restr
6660: 69 63 74 20 74 6f 20 4e 54 44 42 0a 09 20 20 20  ict to NTDB..   
6670: 20 41 4e 44 20 20 20 52 2e 64 62 63 68 69 6c 64   AND   R.dbchild
6680: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d   IS NOT NULL   -
6690: 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 42 20  - and last NTDB 
66a0: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72 75  belonging to tru
66b0: 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 52 41  nk..    AND   RA
66c0: 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69 6c 64  .rid = R.dbchild
66d0: 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 72 65        -- Go dire
66e0: 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 72 6f  ctly to trunk ro
66f0: 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 52 41  ot..    AND   RA
6700: 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55  .child IS NOT NU
6710: 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69  LL    -- Has pri
6720: 6d 61 72 79 20 63 68 69 6c 64 2e 0a 20 20 20 20  mary child..    
6730: 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 52 41          AND   RA
6740: 2e 63 68 69 6c 64 20 49 4e 20 24 74 68 65 73 65  .child IN $these
6750: 74 20 20 20 20 20 2d 2d 20 57 68 69 63 68 20 69  t     -- Which i
6760: 73 20 61 6c 73 6f 20 6f 66 20 69 6e 74 65 72 65  s also of intere
6770: 73 74 0a 09 22 5d 20 7b 0a 09 20 20 20 20 23 20  st.."] {..    # 
6780: 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69 6e 67 20  Consider moving 
6790: 74 68 69 73 20 74 6f 20 74 68 65 20 69 6e 74 65  this to the inte
67a0: 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e 0a 09 20  grity module... 
67b0: 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 73     integrity ass
67c0: 65 72 74 20 7b 24 72 69 64 20 21 3d 20 24 63 68  ert {$rid != $ch
67d0: 69 6c 64 7d 20 7b 52 65 76 69 73 69 6f 6e 20 24  ild} {Revision $
67e0: 72 69 64 20 64 65 70 65 6e 64 73 20 6f 6e 20 69  rid depends on i
67f0: 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20 6c 61 70  tself.}..    lap
6800: 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65  pend dependencie
6810: 73 28 24 72 69 64 29 20 24 63 68 69 6c 64 0a 09  s($rid) $child..
6820: 20 20 20 20 73 65 74 20 64 65 70 28 24 72 69 64      set dep($rid
6830: 2c 24 63 68 69 6c 64 29 20 2e 0a 09 7d 0a 0a 09  ,$child) ...}...
6840: 23 20 54 68 65 20 73 71 6c 20 73 74 61 74 65 6d  # The sql statem
6850: 65 6e 74 73 20 61 62 6f 76 65 20 6c 6f 6f 6b 73  ents above looks
6860: 20 6f 6e 6c 79 20 66 6f 72 20 64 69 72 65 63 74   only for direct
6870: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 23   dependencies..#
6880: 20 62 65 74 77 65 65 6e 20 72 65 76 69 73 69 6f   between revisio
6890: 6e 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73  n in the changes
68a0: 65 74 2e 20 48 6f 77 65 76 65 72 20 64 75 65 20  et. However due 
68b0: 74 6f 20 74 68 65 0a 09 23 20 76 61 67 61 72 69  to the..# vagari
68c0: 65 73 20 6f 66 20 6d 65 74 61 20 64 61 74 61 20  es of meta data 
68d0: 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66  it is possible f
68e0: 6f 72 20 74 77 6f 20 72 65 76 69 73 69 6f 6e 73  or two revisions
68f0: 20 6f 66 0a 09 23 20 74 68 65 20 73 61 6d 65 20   of..# the same 
6900: 66 69 6c 65 20 74 6f 20 65 6e 64 20 75 70 20 69  file to end up i
6910: 6e 20 74 68 65 20 73 61 6d 65 20 63 68 61 6e 67  n the same chang
6920: 65 73 65 74 2c 20 77 69 74 68 6f 75 74 20 61 0a  eset, without a.
6930: 09 23 20 64 69 72 65 63 74 20 64 65 70 65 6e 64  .# direct depend
6940: 65 6e 63 79 20 62 65 74 77 65 65 6e 20 74 68 65  ency between the
6950: 6d 2e 20 48 6f 77 65 76 65 72 20 77 65 20 6b 6e  m. However we kn
6960: 6f 77 20 74 68 61 74 20 74 68 65 72 65 0a 09 23  ow that there..#
6970: 20 68 61 73 20 74 6f 20 62 65 20 61 20 61 6e 20   has to be a an 
6980: 69 6e 64 69 72 65 63 74 20 64 65 70 65 6e 64 65  indirect depende
6990: 6e 63 79 2c 20 62 65 20 69 74 20 74 68 72 6f 75  ncy, be it throu
69a0: 67 68 20 70 72 69 6d 61 72 79 0a 09 23 20 63 68  gh primary..# ch
69b0: 69 6c 64 72 65 6e 2c 20 62 72 61 6e 63 68 20 63  ildren, branch c
69c0: 68 69 6c 64 72 65 6e 2c 20 6f 72 20 61 20 63 6f  hildren, or a co
69d0: 6d 62 69 6e 61 74 69 6f 6e 20 74 68 65 72 65 6f  mbination thereo
69e0: 66 2e 0a 0a 09 23 20 57 65 20 6e 6f 77 20 66 69  f....# We now fi
69f0: 6c 6c 20 69 6e 20 74 68 65 73 65 20 70 73 65 75  ll in these pseu
6a00: 64 6f 2d 64 65 70 65 6e 64 65 6e 63 69 65 73 2c  do-dependencies,
6a10: 20 69 66 20 6e 6f 20 73 75 63 68 0a 09 23 20 64   if no such..# d
6a20: 65 70 65 6e 64 65 6e 63 79 20 65 78 69 73 74 73  ependency exists
6a30: 20 61 6c 72 65 61 64 79 2e 20 54 68 65 20 64 69   already. The di
6a40: 72 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 64  rection of the d
6a50: 65 70 65 6e 64 65 6e 63 79 0a 09 23 20 69 73 20  ependency..# is 
6a60: 61 63 74 75 61 6c 6c 79 20 69 72 72 65 6c 65 76  actually irrelev
6a70: 61 6e 74 20 66 6f 72 20 74 68 69 73 2e 0a 0a 09  ant for this....
6a80: 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20  # NOTE: This is 
6a90: 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 63  different from c
6aa0: 76 73 32 73 76 6e 2e 20 4f 75 72 20 73 70 69 72  vs2svn. Our spir
6ab0: 69 74 75 61 6c 20 61 6e 63 65 73 74 6f 72 0a 09  itual ancestor..
6ac0: 23 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73  # does not use s
6ad0: 75 63 68 20 70 73 65 75 64 6f 2d 64 65 70 65 6e  uch pseudo-depen
6ae0: 64 65 6e 63 69 65 73 2c 20 68 6f 77 65 76 65 72  dencies, however
6af0: 20 69 74 20 75 73 65 73 20 61 0a 09 23 20 43 4f   it uses a..# CO
6b00: 4d 4d 49 54 5f 54 48 52 45 53 48 4f 4c 44 2c 20  MMIT_THRESHOLD, 
6b10: 61 20 74 69 6d 65 20 69 6e 74 65 72 76 61 6c 20  a time interval 
6b20: 63 6f 6d 6d 69 74 73 20 73 68 6f 75 6c 64 20 66  commits should f
6b30: 61 6c 6c 2e 20 54 68 69 73 0a 09 23 20 77 69 6c  all. This..# wil
6b40: 6c 20 67 72 65 61 74 6c 79 20 72 65 64 75 63 65  l greatly reduce
6b50: 73 20 74 68 65 20 72 69 73 6b 20 6f 66 20 67 65  s the risk of ge
6b60: 74 74 69 6e 67 20 66 61 72 20 73 65 70 61 72 61  tting far separa
6b70: 74 65 64 0a 09 23 20 72 65 76 69 73 69 6f 6e 73  ted..# revisions
6b80: 20 6f 66 20 74 68 65 20 73 61 6d 65 20 66 69 6c   of the same fil
6b90: 65 20 69 6e 74 6f 20 6f 6e 65 20 63 68 61 6e 67  e into one chang
6ba0: 65 73 65 74 2e 0a 0a 09 23 20 57 65 20 61 6c 6c  eset....# We all
6bb0: 6f 77 20 72 65 76 69 73 69 6f 6e 73 20 74 6f 20  ow revisions to 
6bc0: 62 65 20 66 61 72 20 61 70 61 72 74 20 69 6e 20  be far apart in 
6bd0: 74 69 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65  time in the same
6be0: 0a 09 23 20 63 68 61 6e 67 65 73 65 74 2c 20 62  ..# changeset, b
6bf0: 75 74 20 69 6e 20 74 75 72 6e 20 6e 65 65 64 20  ut in turn need 
6c00: 74 68 65 20 70 73 65 75 64 6f 2d 64 65 70 65 6e  the pseudo-depen
6c10: 64 65 6e 63 69 65 73 20 74 6f 0a 09 23 20 68 61  dencies to..# ha
6c20: 6e 64 6c 65 20 74 68 69 73 2e 0a 0a 09 61 72 72  ndle this....arr
6c30: 61 79 20 73 65 74 20 66 69 64 73 20 7b 7d 0a 09  ay set fids {}..
6c40: 66 6f 72 65 61 63 68 20 7b 72 69 64 20 66 69 64  foreach {rid fid
6c50: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09  } [state run "..
6c60: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64      SELECT R.rid
6c70: 2c 20 52 2e 66 69 64 0a 20 20 20 20 20 20 20 20  , R.fid.        
6c80: 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73      FROM   revis
6c90: 69 6f 6e 20 52 0a 20 20 20 20 20 20 20 20 20 20  ion R.          
6ca0: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 49    WHERE  R.rid I
6cb0: 4e 20 24 74 68 65 73 65 74 0a 09 22 5d 20 7b 20  N $theset.."] { 
6cc0: 6c 61 70 70 65 6e 64 20 66 69 64 73 28 24 66 69  lappend fids($fi
6cd0: 64 29 20 24 72 69 64 20 7d 0a 0a 09 66 6f 72 65  d) $rid }...fore
6ce0: 61 63 68 20 7b 66 69 64 20 72 69 64 73 7d 20 5b  ach {fid rids} [
6cf0: 61 72 72 61 79 20 67 65 74 20 66 69 64 73 5d 20  array get fids] 
6d00: 7b 0a 09 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e  {..    if {[llen
6d10: 67 74 68 20 24 72 69 64 73 5d 20 3c 20 32 7d 20  gth $rids] < 2} 
6d20: 63 6f 6e 74 69 6e 75 65 0a 09 20 20 20 20 66 6f  continue..    fo
6d30: 72 65 61 63 68 20 61 20 24 72 69 64 73 20 7b 0a  reach a $rids {.
6d40: 09 09 66 6f 72 65 61 63 68 20 62 20 24 72 69 64  ..foreach b $rid
6d50: 73 20 7b 0a 09 09 20 20 20 20 69 66 20 7b 24 61  s {...    if {$a
6d60: 20 3d 3d 20 24 62 7d 20 63 6f 6e 74 69 6e 75 65   == $b} continue
6d70: 0a 09 09 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f  ...    if {[info
6d80: 20 65 78 69 73 74 73 20 64 65 70 28 24 61 2c 24   exists dep($a,$
6d90: 62 29 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 09  b)]} continue...
6da0: 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78      if {[info ex
6db0: 69 73 74 73 20 64 65 70 28 24 62 2c 24 61 29 5d  ists dep($b,$a)]
6dc0: 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 09 20 20 20  } continue...   
6dd0: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65   lappend depende
6de0: 6e 63 69 65 73 28 24 61 29 20 24 62 0a 09 09 20  ncies($a) $b... 
6df0: 20 20 20 73 65 74 20 64 65 70 28 24 61 2c 24 62     set dep($a,$b
6e00: 29 20 2e 0a 09 09 20 20 20 20 73 65 74 20 64 65  ) ....    set de
6e10: 70 28 24 62 2c 24 61 29 20 2e 0a 09 09 7d 0a 09  p($b,$a) ....}..
6e20: 20 20 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e      }..}..return
6e30: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61  .    }..    # va
6e40: 72 28 64 76 29 20 3d 20 64 69 63 74 20 28 69 74  r(dv) = dict (it
6e50: 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d  em -> list (item
6e60: 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74  )), item  = list
6e70: 20 28 74 79 70 65 20 69 64 29 0a 20 20 20 20 74   (type id).    t
6e80: 79 70 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73  ypemethod succes
6e90: 73 6f 72 73 20 7b 64 76 20 72 65 76 69 73 69 6f  sors {dv revisio
6ea0: 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24  ns} {..upvar 1 $
6eb0: 64 76 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a  dv dependencies.
6ec0: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a  .set theset ('[j
6ed0: 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b  oin $revisions {
6ee0: 27 2c 27 7d 5d 27 29 0a 0a 09 23 20 54 68 65 20  ','}]')...# The 
6ef0: 66 6f 6c 6c 6f 77 69 6e 67 20 63 61 73 65 73 20  following cases 
6f00: 73 70 65 63 69 66 79 20 77 68 65 6e 20 61 20 72  specify when a r
6f10: 65 76 69 73 69 6f 6e 20 53 20 69 73 20 61 20 73  evision S is a s
6f20: 75 63 63 65 73 73 6f 72 0a 09 23 20 6f 66 20 61  uccessor..# of a
6f30: 20 72 65 76 69 73 69 6f 6e 20 52 2e 20 45 61 63   revision R. Eac
6f40: 68 20 6f 66 20 74 68 65 20 63 61 73 65 73 20 74  h of the cases t
6f50: 72 61 6e 73 6c 61 74 65 73 20 69 6e 74 6f 20 6f  ranslates into o
6f60: 6e 65 20 6f 66 0a 09 23 20 74 68 65 20 62 72 61  ne of..# the bra
6f70: 6e 63 68 65 73 20 6f 66 20 74 68 65 20 53 51 4c  nches of the SQL
6f80: 20 55 4e 49 4f 4e 20 63 6f 6d 69 6e 67 20 62 65   UNION coming be
6f90: 6c 6f 77 2e 0a 09 23 0a 09 23 20 28 31 29 20 53  low...#..# (1) S
6fa0: 20 63 61 6e 20 62 65 20 61 20 70 72 69 6d 61 72   can be a primar
6fb0: 79 20 63 68 69 6c 64 20 6f 66 20 52 2c 20 69 2e  y child of R, i.
6fc0: 65 2e 20 69 6e 20 74 68 65 20 73 61 6d 65 20 4c  e. in the same L
6fd0: 4f 44 2e 20 52 0a 09 23 20 20 20 20 20 72 65 66  OD. R..#     ref
6fe0: 65 72 65 6e 63 65 73 20 53 20 64 69 72 65 63 74  erences S direct
6ff0: 6c 79 2e 20 52 2e 63 68 69 6c 64 20 3d 20 53 28  ly. R.child = S(
7000: 2e 72 69 64 29 2c 20 69 66 20 69 74 20 65 78 69  .rid), if it exi
7010: 73 74 73 2e 0a 09 23 0a 09 23 20 28 32 29 20 53  sts...#..# (2) S
7020: 20 63 61 6e 20 62 65 20 61 20 73 65 63 6f 6e 64   can be a second
7030: 61 72 79 2c 20 69 2e 65 2e 20 62 72 61 6e 63 68  ary, i.e. branch
7040: 2c 20 63 68 69 6c 64 20 6f 66 20 52 2e 20 48 65  , child of R. He
7050: 72 65 20 74 68 65 0a 09 23 20 20 20 20 20 6c 69  re the..#     li
7060: 6e 6b 20 69 73 20 6d 61 64 65 20 74 68 72 6f 75  nk is made throu
7070: 67 68 20 74 68 65 20 68 65 6c 70 65 72 20 74 61  gh the helper ta
7080: 62 6c 65 0a 09 23 20 20 20 20 20 52 45 56 49 53  ble..#     REVIS
7090: 49 4f 4e 42 52 41 4e 43 48 43 48 49 4c 44 52 45  IONBRANCHCHILDRE
70a0: 4e 2e 20 52 2e 72 69 64 20 2d 3e 20 52 42 43 2e  N. R.rid -> RBC.
70b0: 72 69 64 2c 20 52 42 43 2e 62 72 69 64 20 3d 0a  rid, RBC.brid =.
70c0: 09 23 20 20 20 20 20 53 28 2e 72 69 64 29 0a 09  .#     S(.rid)..
70d0: 23 0a 09 23 20 28 33 29 20 4f 72 69 67 69 6e 61  #..# (3) Origina
70e0: 6c 6c 79 20 74 68 69 73 20 75 73 65 20 63 61 73  lly this use cas
70f0: 65 20 64 65 66 69 6e 65 64 20 74 68 65 20 72 6f  e defined the ro
7100: 6f 74 20 6f 66 20 61 20 64 65 74 61 63 68 65 64  ot of a detached
7110: 0a 09 23 20 20 20 20 20 4e 54 44 42 20 61 73 20  ..#     NTDB as 
7120: 74 68 65 20 73 75 63 63 65 73 73 6f 72 20 6f 66  the successor of
7130: 20 74 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74 2e   the trunk root.
7140: 20 54 68 69 73 20 6c 65 61 64 73 20 74 6f 20 61   This leads to a
7150: 0a 09 23 20 20 20 20 20 62 61 64 20 74 61 6e 67  ..#     bad tang
7160: 6c 65 20 6c 61 74 65 72 20 6f 6e 2e 20 57 69 74  le later on. Wit
7170: 68 20 61 20 64 65 74 61 63 68 65 64 20 4e 54 44  h a detached NTD
7180: 42 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 09  B the original..
7190: 23 20 20 20 20 20 74 72 75 6e 6b 20 72 6f 6f 74  #     trunk root
71a0: 20 72 65 76 69 73 69 6f 6e 20 77 61 73 20 72 65   revision was re
71b0: 6d 6f 76 65 64 20 61 73 20 69 72 72 65 6c 65 76  moved as irrelev
71c0: 61 6e 74 2c 20 61 6c 6c 6f 77 69 6e 67 0a 09 23  ant, allowing..#
71d0: 20 20 20 20 20 74 68 65 20 6e 6f 6d 69 6e 61 6c       the nominal
71e0: 20 72 6f 6f 74 20 74 6f 20 62 65 20 6c 61 74 65   root to be late
71f0: 72 20 69 6e 20 74 69 6d 65 20 74 68 61 6e 20 74  r in time than t
7200: 68 65 20 4e 54 44 42 0a 09 23 20 20 20 20 20 72  he NTDB..#     r
7210: 6f 6f 74 2e 20 4e 6f 77 20 73 65 74 74 69 6e 67  oot. Now setting
7220: 20 74 68 69 73 20 64 65 70 65 6e 64 65 6e 63 79   this dependency
7230: 20 77 69 6c 6c 20 62 65 20 62 61 63 6b 77 61 72   will be backwar
7240: 64 20 69 6e 0a 09 23 20 20 20 20 20 74 69 6d 65  d in..#     time
7250: 2e 20 52 45 4d 4f 56 45 44 2e 0a 09 23 0a 09 23  . REMOVED...#..#
7260: 20 28 34 29 20 49 66 20 52 20 69 73 20 74 68 65   (4) If R is the
7270: 20 6c 61 73 74 20 6f 66 20 74 68 65 20 4e 54 44   last of the NTD
7280: 42 20 72 65 76 69 73 69 6f 6e 73 20 77 68 69 63  B revisions whic
7290: 68 20 62 65 6c 6f 6e 67 20 74 6f 0a 09 23 20 20  h belong to..#  
72a0: 20 20 20 74 68 65 20 74 72 75 6e 6b 2c 20 74 68     the trunk, th
72b0: 65 6e 20 74 68 65 20 70 72 69 6d 61 72 79 20 63  en the primary c
72c0: 68 69 6c 64 20 6f 66 20 74 68 65 20 74 72 75 6e  hild of the trun
72d0: 6b 20 72 6f 6f 74 20 28 74 68 65 0a 09 23 20 20  k root (the..#  
72e0: 20 20 20 27 31 2e 32 27 20 72 65 76 69 73 69 6f     '1.2' revisio
72f0: 6e 29 20 69 73 20 61 20 73 75 63 63 65 73 73 6f  n) is a successo
7300: 72 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e  r, if it exists.
7310: 0a 0a 09 23 20 4e 6f 74 65 20 74 68 61 74 20 74  ...# Note that t
7320: 68 65 20 62 72 61 6e 63 68 65 73 20 73 70 61 77  he branches spaw
7330: 6e 65 64 20 66 72 6f 6d 20 74 68 65 20 72 65 76  ned from the rev
7340: 69 73 69 6f 6e 73 2c 20 61 6e 64 20 74 68 65 0a  isions, and the.
7350: 09 23 20 74 61 67 73 20 61 73 73 6f 63 69 61 74  .# tags associat
7360: 65 64 20 77 69 74 68 20 74 68 65 6d 20 61 72 65  ed with them are
7370: 20 73 75 63 63 65 73 73 6f 72 73 20 61 73 20 77   successors as w
7380: 65 6c 6c 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b  ell....foreach {
7390: 72 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74  rid child} [stat
73a0: 65 20 72 75 6e 20 22 0a 20 20 20 2d 2d 20 28 31  e run ".   -- (1
73b0: 29 20 50 72 69 6d 61 72 79 20 63 68 69 6c 64 0a  ) Primary child.
73c0: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69  .    SELECT R.ri
73d0: 64 2c 20 52 2e 63 68 69 6c 64 0a 09 20 20 20 20  d, R.child..    
73e0: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20  FROM   revision 
73f0: 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e  R..    WHERE  R.
7400: 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74  rid   IN $theset
7410: 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74       -- Restrict
7420: 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66   to revisions of
7430: 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41   interest..    A
7440: 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49 53  ND    R.child IS
7450: 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20   NOT NULL    -- 
7460: 48 61 73 20 70 72 69 6d 61 72 79 20 63 68 69 6c  Has primary chil
7470: 64 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20  d.    UNION.    
7480: 2d 2d 20 28 32 29 20 53 65 63 6f 6e 64 61 72 79  -- (2) Secondary
7490: 20 28 62 72 61 6e 63 68 29 20 63 68 69 6c 64 72   (branch) childr
74a0: 65 6e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52  en..    SELECT R
74b0: 2e 72 69 64 2c 20 42 2e 62 72 69 64 0a 09 20 20  .rid, B.brid..  
74c0: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f    FROM   revisio
74d0: 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 62 72 61  n R, revisionbra
74e0: 6e 63 68 63 68 69 6c 64 72 65 6e 20 42 0a 09 20  nchchildren B.. 
74f0: 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20     WHERE  R.rid 
7500: 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20    IN $theset    
7510: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
7520: 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74  revisions of int
7530: 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20  erest..    AND  
7540: 20 20 52 2e 72 69 64 20 3d 20 42 2e 72 69 64 20    R.rid = B.rid 
7550: 20 20 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65           -- Sele
7560: 63 74 20 73 75 62 73 65 74 20 6f 66 20 62 72 61  ct subset of bra
7570: 6e 63 68 20 63 68 69 6c 64 72 65 6e 0a 20 20 20  nch children.   
7580: 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 34   UNION.    -- (4
7590: 29 20 43 68 69 6c 64 20 6f 66 20 74 72 75 6e 6b  ) Child of trunk
75a0: 20 72 6f 6f 74 20 73 75 63 63 65 73 73 6f 72 20   root successor 
75b0: 6f 66 20 6c 61 73 74 20 4e 54 44 42 20 6f 6e 20  of last NTDB on 
75c0: 74 72 75 6e 6b 2e 0a 09 20 20 20 20 53 45 4c 45  trunk...    SELE
75d0: 43 54 20 52 2e 72 69 64 2c 20 52 41 2e 63 68 69  CT R.rid, RA.chi
75e0: 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76  ld..    FROM rev
75f0: 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f  ision R, revisio
7600: 6e 20 52 41 0a 09 20 20 20 20 57 48 45 52 45 20  n RA..    WHERE 
7610: 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73  R.rid   IN $thes
7620: 65 74 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72  et      -- Restr
7630: 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73  ict to revisions
7640: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20   of interest..  
7650: 20 20 41 4e 44 20 20 20 52 2e 69 73 64 65 66 61    AND   R.isdefa
7660: 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
7670: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 4e  -- Restrict to N
7680: 54 44 42 0a 09 20 20 20 20 41 4e 44 20 20 20 52  TDB..    AND   R
7690: 2e 64 62 63 68 69 6c 64 20 49 53 20 4e 4f 54 20  .dbchild IS NOT 
76a0: 4e 55 4c 4c 20 20 20 2d 2d 20 61 6e 64 20 6c 61  NULL   -- and la
76b0: 73 74 20 4e 54 44 42 20 62 65 6c 6f 6e 67 69 6e  st NTDB belongin
76c0: 67 20 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20  g to trunk..    
76d0: 41 4e 44 20 20 20 52 41 2e 72 69 64 20 3d 20 52  AND   RA.rid = R
76e0: 2e 64 62 63 68 69 6c 64 20 20 20 20 20 20 2d 2d  .dbchild      --
76f0: 20 47 6f 20 64 69 72 65 63 74 6c 79 20 74 6f 20   Go directly to 
7700: 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 20  trunk root..    
7710: 41 4e 44 20 20 20 52 41 2e 63 68 69 6c 64 20 49  AND   RA.child I
7720: 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d  S NOT NULL    --
7730: 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 68 69   Has primary chi
7740: 6c 64 2e 0a 09 22 5d 20 7b 0a 09 20 20 20 20 23  ld..."] {..    #
7750: 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69 6e 67   Consider moving
7760: 20 74 68 69 73 20 74 6f 20 74 68 65 20 69 6e 74   this to the int
7770: 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e 0a 09  egrity module...
7780: 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73      integrity as
7790: 73 65 72 74 20 7b 24 72 69 64 20 21 3d 20 24 63  sert {$rid != $c
77a0: 68 69 6c 64 7d 20 7b 52 65 76 69 73 69 6f 6e 20  hild} {Revision 
77b0: 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f 6e 20  $rid depends on 
77c0: 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20 6c 61  itself.}..    la
77d0: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69  ppend dependenci
77e0: 65 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69  es([list rev $ri
77f0: 64 5d 29 20 5b 6c 69 73 74 20 72 65 76 20 24 63  d]) [list rev $c
7800: 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65 61 63  hild]..}..foreac
7810: 68 20 7b 72 69 64 20 63 68 69 6c 64 7d 20 5b 73  h {rid child} [s
7820: 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20  tate run "..    
7830: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 54 2e  SELECT R.rid, T.
7840: 74 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  tid..    FROM   
7850: 72 65 76 69 73 69 6f 6e 20 52 2c 20 74 61 67 20  revision R, tag 
7860: 54 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e  T..    WHERE  R.
7870: 72 69 64 20 69 6e 20 24 74 68 65 73 65 74 0a 09  rid in $theset..
7880: 20 20 20 20 41 4e 44 20 20 20 20 54 2e 72 65 76      AND    T.rev
7890: 20 3d 20 52 2e 72 69 64 0a 09 22 5d 20 7b 0a 09   = R.rid.."] {..
78a0: 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65      lappend depe
78b0: 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 72  ndencies([list r
78c0: 65 76 20 24 72 69 64 5d 29 20 5b 6c 69 73 74 20  ev $rid]) [list 
78d0: 73 79 6d 3a 3a 74 61 67 20 24 63 68 69 6c 64 5d  sym::tag $child]
78e0: 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 69  ..}..foreach {ri
78f0: 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20  d child} [state 
7900: 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43  run "..    SELEC
7910: 54 20 52 2e 72 69 64 2c 20 42 2e 62 69 64 0a 09  T R.rid, B.bid..
7920: 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73      FROM   revis
7930: 69 6f 6e 20 52 2c 20 62 72 61 6e 63 68 20 42 0a  ion R, branch B.
7940: 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69  .    WHERE  R.ri
7950: 64 20 69 6e 20 24 74 68 65 73 65 74 0a 09 20 20  d in $theset..  
7960: 20 20 41 4e 44 20 20 20 20 42 2e 72 6f 6f 74 20    AND    B.root 
7970: 3d 20 52 2e 72 69 64 0a 09 22 5d 20 7b 0a 09 20  = R.rid.."] {.. 
7980: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e     lappend depen
7990: 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 65  dencies([list re
79a0: 76 20 24 72 69 64 5d 29 20 5b 6c 69 73 74 20 73  v $rid]) [list s
79b0: 79 6d 3a 3a 62 72 61 6e 63 68 20 24 63 68 69 6c  ym::branch $chil
79c0: 64 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20  d]..}..return.  
79d0: 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64    }..    # var(d
79e0: 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20  v) = dict (item 
79f0: 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c  -> list (item)),
7a00: 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74   item  = list (t
7a10: 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 70 65  ype id).    type
7a20: 6d 65 74 68 6f 64 20 70 72 65 64 65 63 65 73 73  method predecess
7a30: 6f 72 73 20 7b 64 76 20 72 65 76 69 73 69 6f 6e  ors {dv revision
7a40: 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64  s} {..upvar 1 $d
7a50: 76 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09  v dependencies..
7a60: 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f  set theset ('[jo
7a70: 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27  in $revisions {'
7a80: 2c 27 7d 5d 27 29 0a 0a 09 23 20 54 68 65 20 66  ,'}]')...# The f
7a90: 6f 6c 6c 6f 77 69 6e 67 20 63 61 73 65 73 20 73  ollowing cases s
7aa0: 70 65 63 69 66 79 20 77 68 65 6e 20 61 20 72 65  pecify when a re
7ab0: 76 69 73 69 6f 6e 20 50 20 69 73 20 61 0a 09 23  vision P is a..#
7ac0: 20 70 72 65 64 65 63 65 73 73 6f 72 20 6f 66 20   predecessor of 
7ad0: 61 20 72 65 76 69 73 69 6f 6e 20 52 2e 20 45 61  a revision R. Ea
7ae0: 63 68 20 6f 66 20 74 68 65 20 63 61 73 65 73 20  ch of the cases 
7af0: 74 72 61 6e 73 6c 61 74 65 73 0a 09 23 20 69 6e  translates..# in
7b00: 74 6f 20 6f 6e 65 20 6f 66 20 74 68 65 20 62 72  to one of the br
7b10: 61 6e 63 68 65 73 20 6f 66 20 74 68 65 20 53 51  anches of the SQ
7b20: 4c 20 55 4e 49 4f 4e 20 63 6f 6d 69 6e 67 20 62  L UNION coming b
7b30: 65 6c 6f 77 2e 0a 09 23 0a 09 23 20 28 31 29 20  elow...#..# (1) 
7b40: 54 68 65 20 69 6d 6d 65 64 69 61 74 65 20 70 61  The immediate pa
7b50: 72 65 6e 74 20 52 2e 70 61 72 65 6e 74 20 6f 66  rent R.parent of
7b60: 20 52 20 69 73 20 61 20 70 72 65 64 65 63 65 73   R is a predeces
7b70: 73 6f 72 20 6f 66 0a 09 23 20 20 20 20 20 52 2e  sor of..#     R.
7b80: 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20 74   NOTE: This is t
7b90: 72 75 65 20 66 6f 72 20 52 20 65 69 74 68 65 72  rue for R either
7ba0: 20 70 72 69 6d 61 72 79 20 6f 72 20 73 65 63 6f   primary or seco
7bb0: 6e 64 61 72 79 0a 09 23 20 20 20 20 20 63 68 69  ndary..#     chi
7bc0: 6c 64 20 6f 66 20 50 2e 20 49 74 20 6e 6f 74 20  ld of P. It not 
7bd0: 6e 65 63 65 73 73 61 72 79 20 74 6f 20 64 69 73  necessary to dis
7be0: 74 69 6e 67 75 69 73 68 20 74 68 65 20 74 77 6f  tinguish the two
7bf0: 0a 09 23 20 20 20 20 20 63 61 73 65 73 2c 20 69  ..#     cases, i
7c00: 6e 20 63 6f 6e 74 72 61 73 74 20 74 6f 20 74 68  n contrast to th
7c10: 65 20 63 6f 64 65 20 72 65 74 72 69 65 76 69 6e  e code retrievin
7c20: 67 20 74 68 65 20 73 75 63 63 65 73 73 6f 72 0a  g the successor.
7c30: 09 23 20 20 20 20 20 69 6e 66 6f 72 6d 61 74 69  .#     informati
7c40: 6f 6e 2e 0a 09 23 0a 09 23 20 28 32 29 20 54 68  on...#..# (2) Th
7c50: 65 20 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66 20  e complement of 
7c60: 73 75 63 63 65 73 73 6f 72 20 63 61 73 65 20 28  successor case (
7c70: 33 29 2e 20 54 68 65 20 74 72 75 6e 6b 20 72 6f  3). The trunk ro
7c80: 6f 74 20 69 73 0a 09 23 20 20 20 20 20 61 20 70  ot is..#     a p
7c90: 72 65 64 65 63 65 73 73 6f 72 20 6f 66 20 61 20  redecessor of a 
7ca0: 4e 54 44 42 20 72 6f 6f 74 2e 20 52 45 4d 4f 56  NTDB root. REMOV
7cb0: 45 44 2e 20 53 65 65 20 27 73 75 63 63 65 73 73  ED. See 'success
7cc0: 6f 72 73 27 0a 09 23 20 20 20 20 20 66 6f 72 20  ors'..#     for 
7cd0: 74 68 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e 2e  the explanation.
7ce0: 0a 09 23 0a 09 23 20 28 33 29 20 54 68 65 20 63  ..#..# (3) The c
7cf0: 6f 6d 70 6c 65 6d 65 6e 74 20 6f 66 20 73 75 63  omplement of suc
7d00: 63 65 73 73 6f 72 20 63 61 73 65 20 28 34 29 2e  cessor case (4).
7d10: 20 54 68 65 20 6c 61 73 74 20 4e 54 44 42 0a 09   The last NTDB..
7d20: 23 20 20 20 20 20 72 65 76 69 73 69 6f 6e 20 62  #     revision b
7d30: 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65 20  elonging to the 
7d40: 74 72 75 6e 6b 20 69 73 20 61 20 70 72 65 64 65  trunk is a prede
7d50: 63 65 73 73 6f 72 20 6f 66 20 74 68 65 0a 09 23  cessor of the..#
7d60: 20 20 20 20 20 70 72 69 6d 61 72 79 20 63 68 69       primary chi
7d70: 6c 64 20 6f 66 20 74 68 65 20 74 72 75 6e 6b 20  ld of the trunk 
7d80: 72 6f 6f 74 20 28 54 68 65 20 27 31 2e 32 27 20  root (The '1.2' 
7d90: 72 65 76 69 73 69 6f 6e 29 2e 0a 0a 09 66 6f 72  revision)....for
7da0: 65 61 63 68 20 7b 72 69 64 20 70 61 72 65 6e 74  each {rid parent
7db0: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 20  } [state run ". 
7dc0: 20 20 2d 2d 20 28 31 29 20 50 72 69 6d 61 72 79    -- (1) Primary
7dd0: 20 70 61 72 65 6e 74 2c 20 63 61 6e 20 62 65 20   parent, can be 
7de0: 69 6e 20 64 69 66 66 65 72 65 6e 74 20 4c 4f 44  in different LOD
7df0: 20 66 6f 72 20 66 69 72 73 74 20 69 6e 20 61 20   for first in a 
7e00: 62 72 61 6e 63 68 0a 09 20 20 20 20 53 45 4c 45  branch..    SELE
7e10: 43 54 20 52 2e 72 69 64 2c 20 52 2e 70 61 72 65  CT R.rid, R.pare
7e20: 6e 74 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72  nt..    FROM   r
7e30: 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57  evision R..    W
7e40: 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e  HERE  R.rid   IN
7e50: 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20   $theset     -- 
7e60: 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69  Restrict to revi
7e70: 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73  sions of interes
7e80: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e  t..    AND    R.
7e90: 70 61 72 65 6e 74 20 49 53 20 4e 4f 54 20 4e 55  parent IS NOT NU
7ea0: 4c 4c 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d  LL   -- Has prim
7eb0: 61 72 79 20 70 61 72 65 6e 74 0a 20 20 20 20 55  ary parent.    U
7ec0: 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 33 29 20  NION.    -- (3) 
7ed0: 4c 61 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 75  Last NTDB on tru
7ee0: 6e 6b 20 69 73 20 70 72 65 64 65 63 65 73 73 6f  nk is predecesso
7ef0: 72 20 6f 66 20 63 68 69 6c 64 20 6f 66 20 74 72  r of child of tr
7f00: 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 20 53 45  unk root..    SE
7f10: 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 41 2e 64  LECT R.rid, RA.d
7f20: 62 70 61 72 65 6e 74 0a 09 20 20 20 20 46 52 4f  bparent..    FRO
7f30: 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20  M   revision R, 
7f40: 72 65 76 69 73 69 6f 6e 20 52 41 0a 09 20 20 20  revision RA..   
7f50: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 49 4e   WHERE  R.rid IN
7f60: 20 24 74 68 65 73 65 74 20 20 20 20 20 20 20 20   $theset        
7f70: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
7f80: 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74  revisions of int
7f90: 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20  erest..    AND  
7fa0: 20 20 4e 4f 54 20 52 2e 69 73 64 65 66 61 75 6c    NOT R.isdefaul
7fb0: 74 20 20 20 20 20 20 20 20 20 20 2d 2d 20 6e 6f  t          -- no
7fc0: 74 20 6f 6e 20 4e 54 44 42 0a 09 20 20 20 20 41  t on NTDB..    A
7fd0: 4e 44 20 20 20 20 52 2e 70 61 72 65 6e 74 20 49  ND    R.parent I
7fe0: 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 20 2d  S NOT NULL     -
7ff0: 2d 20 77 68 69 63 68 20 61 72 65 20 6e 6f 74 20  - which are not 
8000: 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20  root..    AND   
8010: 20 52 41 2e 72 69 64 20 3d 20 52 2e 70 61 72 65   RA.rid = R.pare
8020: 6e 74 20 20 20 20 20 20 20 20 2d 2d 20 67 6f 20  nt        -- go 
8030: 74 6f 20 74 68 65 69 72 20 70 61 72 65 6e 74 0a  to their parent.
8040: 09 20 20 20 20 41 4e 44 20 20 20 20 52 41 2e 64  .    AND    RA.d
8050: 62 70 61 72 65 6e 74 20 49 53 20 4e 4f 54 20 4e  bparent IS NOT N
8060: 55 4c 4c 20 20 2d 2d 20 77 68 69 63 68 20 68 61  ULL  -- which ha
8070: 73 20 74 6f 20 72 65 66 65 72 20 74 6f 20 4e 54  s to refer to NT
8080: 44 42 27 73 20 72 6f 6f 74 0a 09 22 5d 20 7b 0a  DB's root.."] {.
8090: 09 20 20 20 20 23 20 43 6f 6e 73 69 64 65 72 20  .    # Consider 
80a0: 6d 6f 76 69 6e 67 20 74 68 69 73 20 74 6f 20 74  moving this to t
80b0: 68 65 20 69 6e 74 65 67 72 69 74 79 20 6d 6f 64  he integrity mod
80c0: 75 6c 65 2e 0a 09 20 20 20 20 69 6e 74 65 67 72  ule...    integr
80d0: 69 74 79 20 61 73 73 65 72 74 20 7b 24 72 69 64  ity assert {$rid
80e0: 20 21 3d 20 24 70 61 72 65 6e 74 7d 20 7b 52 65   != $parent} {Re
80f0: 76 69 73 69 6f 6e 20 24 72 69 64 20 64 65 70 65  vision $rid depe
8100: 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 2e 7d 0a  nds on itself.}.
8110: 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70  .    lappend dep
8120: 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20  endencies([list 
8130: 72 65 76 20 24 72 69 64 5d 29 20 5b 6c 69 73 74  rev $rid]) [list
8140: 20 72 65 76 20 24 70 61 72 65 6e 74 5d 0a 09 7d   rev $parent]..}
8150: 0a 0a 09 23 20 54 68 65 20 72 65 76 69 73 69 6f  ...# The revisio
8160: 6e 73 20 77 68 69 63 68 20 61 72 65 20 74 68 65  ns which are the
8170: 20 66 69 72 73 74 20 6f 6e 20 61 20 62 72 61 6e   first on a bran
8180: 63 68 20 68 61 76 65 20 74 68 61 74 0a 09 23 20  ch have that..# 
8190: 62 72 61 6e 63 68 20 61 73 20 74 68 65 69 72 20  branch as their 
81a0: 70 72 65 64 65 63 65 73 73 6f 72 2e 20 4e 6f 74  predecessor. Not
81b0: 65 20 74 68 61 74 20 72 65 76 69 73 69 6f 6e 73  e that revisions
81c0: 20 63 61 6e 6e 6f 74 20 62 65 0a 09 23 20 6f 6e   cannot be..# on
81d0: 20 74 61 67 73 20 69 6e 20 74 68 65 20 73 61 6d   tags in the sam
81e0: 65 20 6d 61 6e 6e 65 72 2c 20 73 6f 20 74 61 67  e manner, so tag
81f0: 73 20 63 61 6e 6e 6f 74 20 62 65 20 70 72 65 64  s cannot be pred
8200: 65 63 65 73 73 6f 72 73 0a 09 23 20 6f 66 20 72  ecessors..# of r
8210: 65 76 69 73 69 6f 6e 73 2e 20 54 68 69 73 20 63  evisions. This c
8220: 6f 6d 70 6c 65 6d 65 6e 74 73 20 74 68 61 74 20  omplements that 
8230: 74 68 65 79 20 68 61 76 65 20 6e 6f 20 73 75 63  they have no suc
8240: 63 65 73 73 6f 72 73 0a 09 23 20 28 53 65 65 20  cessors..# (See 
8250: 73 79 6d 3a 3a 74 61 67 2f 73 75 63 63 65 73 73  sym::tag/success
8260: 6f 72 73 29 2e 0a 0a 09 66 6f 72 65 61 63 68 20  ors)....foreach 
8270: 7b 72 69 64 20 70 61 72 65 6e 74 7d 20 5b 73 74  {rid parent} [st
8280: 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53  ate run "..    S
8290: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 42 2e 62  ELECT R.rid, B.b
82a0: 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72  id..    FROM   r
82b0: 65 76 69 73 69 6f 6e 20 52 2c 20 62 72 61 6e 63  evision R, branc
82c0: 68 20 42 0a 09 20 20 20 20 57 48 45 52 45 20 20  h B..    WHERE  
82d0: 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 74  R.rid IN $theset
82e0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 66  ..    AND    B.f
82f0: 69 72 73 74 20 3d 20 52 2e 72 69 64 0a 09 22 5d  irst = R.rid.."]
8300: 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20   {..    lappend 
8310: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69  dependencies([li
8320: 73 74 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c  st rev $rid]) [l
8330: 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20  ist sym::branch 
8340: 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 72 65 74  $parent]..}..ret
8350: 75 72 6e 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23  urn.    }.}..# #
8360: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23   ## ### ##### ##
8370: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
8380: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
8390: 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 48 65  ##########.## He
83a0: 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 2e 20  lper singleton. 
83b0: 43 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 74 61 67  Commands for tag
83c0: 20 73 79 6d 62 6f 6c 20 63 68 61 6e 67 65 73 65   symbol changese
83d0: 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20  ts...snit::type 
83e0: 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d  ::vc::fossil::im
83f0: 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65  port::cvs::proje
8400: 63 74 3a 3a 72 65 76 3a 3a 73 79 6d 3a 3a 74 61  ct::rev::sym::ta
8410: 67 20 7b 0a 20 20 20 20 74 79 70 65 6d 65 74 68  g {.    typemeth
8420: 6f 64 20 62 79 72 65 76 69 73 69 6f 6e 20 7b 7d  od byrevision {}
8430: 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20   { return 0 }.  
8440: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 73    typemethod bys
8450: 79 6d 62 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 74  ymbol   {} { ret
8460: 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 79 70 65  urn 1 }.    type
8470: 6d 65 74 68 6f 64 20 69 73 74 61 67 20 20 20 20  method istag    
8480: 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20    {} { return 1 
8490: 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  }.    typemethod
84a0: 20 69 73 62 72 61 6e 63 68 20 20 20 7b 7d 20 7b   isbranch   {} {
84b0: 20 72 65 74 75 72 6e 20 30 20 7d 0a 0a 20 20 20   return 0 }..   
84c0: 20 74 79 70 65 6d 65 74 68 6f 64 20 73 74 72 20   typemethod str 
84d0: 7b 74 61 67 7d 20 7b 0a 09 73 74 72 75 63 74 3a  {tag} {..struct:
84e0: 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b 73 74  :list assign [st
84f0: 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 53  ate run {..    S
8500: 45 4c 45 43 54 20 53 2e 6e 61 6d 65 2c 20 46 2e  ELECT S.name, F.
8510: 6e 61 6d 65 2c 20 50 2e 6e 61 6d 65 0a 09 20 20  name, P.name..  
8520: 20 20 46 52 4f 4d 20 20 20 74 61 67 20 54 2c 20    FROM   tag T, 
8530: 73 79 6d 62 6f 6c 20 53 2c 20 66 69 6c 65 20 46  symbol S, file F
8540: 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09 20 20 20  , project P..   
8550: 20 57 48 45 52 45 20 20 54 2e 74 69 64 20 3d 20   WHERE  T.tid = 
8560: 24 74 61 67 0a 09 20 20 20 20 41 4e 44 20 20 20  $tag..    AND   
8570: 20 46 2e 66 69 64 20 3d 20 54 2e 66 69 64 0a 09   F.fid = T.fid..
8580: 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69 64      AND    P.pid
8590: 20 3d 20 46 2e 70 69 64 0a 09 20 20 20 20 41 4e   = F.pid..    AN
85a0: 44 20 20 20 20 53 2e 73 69 64 20 3d 20 54 2e 73  D    S.sid = T.s
85b0: 69 64 0a 09 7d 5d 20 73 6e 61 6d 65 20 66 6e 61  id..}] sname fna
85c0: 6d 65 20 70 6e 61 6d 65 0a 09 72 65 74 75 72 6e  me pname..return
85d0: 20 22 24 70 6e 61 6d 65 2f 54 27 24 7b 73 6e 61   "$pname/T'${sna
85e0: 6d 65 7d 27 3a 3a 24 66 6e 61 6d 65 22 0a 20 20  me}'::$fname".  
85f0: 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c    }..    # resul
8600: 74 20 3d 20 6c 69 73 74 20 28 6d 69 6e 74 69 6d  t = list (mintim
8610: 65 2c 20 6d 61 78 74 69 6d 65 29 0a 20 20 20 20  e, maxtime).    
8620: 74 79 70 65 6d 65 74 68 6f 64 20 74 69 6d 65 72  typemethod timer
8630: 61 6e 67 65 20 7b 74 61 67 73 7d 20 7b 0a 09 23  ange {tags} {..#
8640: 20 54 68 65 20 72 61 6e 67 65 20 69 73 20 64 65   The range is de
8650: 66 69 6e 65 64 20 61 73 20 74 68 65 20 72 61 6e  fined as the ran
8660: 67 65 20 6f 66 20 74 68 65 20 72 65 76 69 73 69  ge of the revisi
8670: 6f 6e 73 20 74 68 65 20 74 61 67 73 0a 09 23 20  ons the tags..# 
8680: 61 72 65 20 61 74 74 61 63 68 65 64 20 74 6f 2e  are attached to.
8690: 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27  ...set theset ('
86a0: 5b 6a 6f 69 6e 20 24 74 61 67 73 20 7b 27 2c 27  [join $tags {','
86b0: 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74  }]')..return [st
86c0: 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53  ate run "..    S
86d0: 45 4c 45 43 54 20 4d 49 4e 28 52 2e 64 61 74 65  ELECT MIN(R.date
86e0: 29 2c 20 4d 41 58 28 52 2e 64 61 74 65 29 0a 09  ), MAX(R.date)..
86f0: 20 20 20 20 46 52 4f 4d 20 20 20 74 61 67 20 54      FROM   tag T
8700: 2c 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20  , revision R..  
8710: 20 20 57 48 45 52 45 20 20 54 2e 74 69 64 20 49    WHERE  T.tid I
8720: 4e 20 24 74 68 65 73 65 74 0a 20 20 20 20 20 20  N $theset.      
8730: 20 20 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72        AND    R.r
8740: 69 64 20 3d 20 54 2e 72 65 76 0a 09 22 5d 0a 20  id = T.rev.."]. 
8750: 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28     }..    # var(
8760: 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d  dv) = dict (item
8770: 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29   -> list (item))
8780: 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28  , item  = list (
8790: 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 70  type id).    typ
87a0: 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f  emethod successo
87b0: 72 73 20 7b 64 76 20 74 61 67 73 7d 20 7b 0a 09  rs {dv tags} {..
87c0: 23 20 54 61 67 73 20 68 61 76 65 20 6e 6f 20 73  # Tags have no s
87d0: 75 63 63 65 73 73 6f 72 73 2e 0a 09 72 65 74 75  uccessors...retu
87e0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  rn.    }..    # 
87f0: 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20 28  var(dv) = dict (
8800: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74  item -> list (it
8810: 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69  em)), item  = li
8820: 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 20 20  st (type id).   
8830: 20 74 79 70 65 6d 65 74 68 6f 64 20 70 72 65 64   typemethod pred
8840: 65 63 65 73 73 6f 72 73 20 7b 64 76 20 74 61 67  ecessors {dv tag
8850: 73 7d 20 7b 0a 09 23 20 54 68 65 20 70 72 65 64  s} {..# The pred
8860: 65 63 65 73 73 6f 72 73 20 6f 66 20 61 20 74 61  ecessors of a ta
8870: 67 20 61 72 65 20 61 6c 6c 20 74 68 65 20 72 65  g are all the re
8880: 76 69 73 69 6f 6e 73 20 74 68 65 20 74 61 67 73  visions the tags
8890: 20 61 72 65 0a 09 23 20 61 74 74 61 63 68 65 64   are..# attached
88a0: 20 74 6f 2c 20 61 73 20 77 65 6c 6c 20 61 73 20   to, as well as 
88b0: 61 6c 6c 20 74 68 65 20 62 72 61 6e 63 68 65 73  all the branches
88c0: 20 6f 72 20 74 61 67 73 20 77 68 69 63 68 20 61   or tags which a
88d0: 72 65 0a 09 23 20 74 68 65 69 72 20 70 72 65 66  re..# their pref
88e0: 65 72 65 64 20 70 61 72 65 6e 74 73 2e 0a 0a 09  ered parents....
88f0: 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f  set theset ('[jo
8900: 69 6e 20 24 74 61 67 73 20 7b 27 2c 27 7d 5d 27  in $tags {','}]'
8910: 29 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20  )..foreach {tid 
8920: 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72  parent} [state r
8930: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54  un "..    SELECT
8940: 20 54 2e 74 69 64 2c 20 52 2e 72 69 64 0a 09 20   T.tid, R.rid.. 
8950: 20 20 20 46 52 4f 4d 20 20 20 74 61 67 20 54 2c     FROM   tag T,
8960: 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20   revision R..   
8970: 20 57 48 45 52 45 20 20 54 2e 74 69 64 20 49 4e   WHERE  T.tid IN
8980: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e   $theset..    AN
8990: 44 20 20 20 20 54 2e 72 65 76 20 3d 20 52 2e 72  D    T.rev = R.r
89a0: 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61  id.."] {..    la
89b0: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69  ppend dependenci
89c0: 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61  es([list sym::ta
89d0: 67 20 24 74 69 64 5d 29 20 5b 6c 69 73 74 20 72  g $tid]) [list r
89e0: 65 76 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 0a  ev $parent]..}..
89f0: 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 70 61  .foreach {tid pa
8a00: 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e  rent} [state run
8a10: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 54   "..    SELECT T
8a20: 2e 74 69 64 2c 20 42 2e 62 69 64 0a 09 20 20 20  .tid, B.bid..   
8a30: 20 46 52 4f 4d 20 20 20 74 61 67 20 54 2c 20 70   FROM   tag T, p
8a40: 72 65 66 65 72 65 64 70 61 72 65 6e 74 20 50 2c  referedparent P,
8a50: 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20 20 57   branch B..    W
8a60: 48 45 52 45 20 20 54 2e 74 69 64 20 49 4e 20 24  HERE  T.tid IN $
8a70: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20  theset..    AND 
8a80: 20 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 69 64     T.sid = P.sid
8a90: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70  ..    AND    P.p
8aa0: 69 64 20 3d 20 42 2e 73 69 64 0a 09 22 5d 20 7b  id = B.sid.."] {
8ab0: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65  ..    lappend de
8ac0: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74  pendencies([list
8ad0: 20 73 79 6d 3a 3a 74 61 67 20 24 74 69 64 5d 29   sym::tag $tid])
8ae0: 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e   [list sym::bran
8af0: 63 68 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 0a  ch $parent]..}..
8b00: 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 70 61  .foreach {tid pa
8b10: 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e  rent} [state run
8b20: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 54   "..    SELECT T
8b30: 2e 74 69 64 2c 20 54 58 2e 74 69 64 0a 09 20 20  .tid, TX.tid..  
8b40: 20 20 46 52 4f 4d 20 20 20 74 61 67 20 54 2c 20    FROM   tag T, 
8b50: 70 72 65 66 65 72 65 64 70 61 72 65 6e 74 20 50  preferedparent P
8b60: 2c 20 74 61 67 20 54 58 0a 09 20 20 20 20 57 48  , tag TX..    WH
8b70: 45 52 45 20 20 54 2e 74 69 64 20 49 4e 20 24 74  ERE  T.tid IN $t
8b80: 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20  heset..    AND  
8b90: 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a    T.sid = P.sid.
8ba0: 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69  .    AND    P.pi
8bb0: 64 20 3d 20 54 58 2e 73 69 64 0a 09 22 5d 20 7b  d = TX.sid.."] {
8bc0: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65  ..    lappend de
8bd0: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74  pendencies([list
8be0: 20 73 79 6d 3a 3a 74 61 67 20 24 74 69 64 5d 29   sym::tag $tid])
8bf0: 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20   [list sym::tag 
8c00: 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 72 65 74  $parent]..}..ret
8c10: 75 72 6e 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23  urn.    }.}..# #
8c20: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23   ## ### ##### ##
8c30: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
8c40: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
8c50: 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 48 65  ##########.## He
8c60: 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 2e 20  lper singleton. 
8c70: 43 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 62 72 61  Commands for bra
8c80: 6e 63 68 20 73 79 6d 62 6f 6c 20 63 68 61 6e 67  nch symbol chang
8c90: 65 73 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79  esets...snit::ty
8ca0: 70 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a  pe ::vc::fossil:
8cb0: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72  :import::cvs::pr
8cc0: 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 73 79 6d 3a  oject::rev::sym:
8cd0: 3a 62 72 61 6e 63 68 20 7b 0a 20 20 20 20 74 79  :branch {.    ty
8ce0: 70 65 6d 65 74 68 6f 64 20 62 79 72 65 76 69 73  pemethod byrevis
8cf0: 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20  ion {} { return 
8d00: 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68  0 }.    typemeth
8d10: 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 20 7b 7d  od bysymbol   {}
8d20: 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a 20 20   { return 1 }.  
8d30: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73 74    typemethod ist
8d40: 61 67 20 20 20 20 20 20 7b 7d 20 7b 20 72 65 74  ag      {} { ret
8d50: 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65  urn 0 }.    type
8d60: 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63 68 20  method isbranch 
8d70: 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20    {} { return 1 
8d80: 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  }..    typemetho
8d90: 64 20 73 74 72 20 7b 62 72 61 6e 63 68 7d 20 7b  d str {branch} {
8da0: 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61  ..struct::list a
8db0: 73 73 69 67 6e 20 5b 73 74 61 74 65 20 72 75 6e  ssign [state run
8dc0: 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 53   {..    SELECT S
8dd0: 2e 6e 61 6d 65 2c 20 46 2e 6e 61 6d 65 2c 20 50  .name, F.name, P
8de0: 2e 6e 61 6d 65 0a 09 20 20 20 20 46 52 4f 4d 20  .name..    FROM 
8df0: 20 20 62 72 61 6e 63 68 20 42 2c 20 73 79 6d 62    branch B, symb
8e00: 6f 6c 20 53 2c 20 66 69 6c 65 20 46 2c 20 70 72  ol S, file F, pr
8e10: 6f 6a 65 63 74 20 50 0a 09 20 20 20 20 57 48 45  oject P..    WHE
8e20: 52 45 20 20 42 2e 62 69 64 20 3d 20 24 62 72 61  RE  B.bid = $bra
8e30: 6e 63 68 0a 09 20 20 20 20 41 4e 44 20 20 20 20  nch..    AND    
8e40: 46 2e 66 69 64 20 3d 20 42 2e 66 69 64 0a 09 20  F.fid = B.fid.. 
8e50: 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69 64 20     AND    P.pid 
8e60: 3d 20 46 2e 70 69 64 0a 09 20 20 20 20 41 4e 44  = F.pid..    AND
8e70: 20 20 20 20 53 2e 73 69 64 20 3d 20 42 2e 73 69      S.sid = B.si
8e80: 64 0a 09 7d 5d 20 73 6e 61 6d 65 20 66 6e 61 6d  d..}] sname fnam
8e90: 65 20 70 6e 61 6d 65 0a 09 72 65 74 75 72 6e 20  e pname..return 
8ea0: 22 24 70 6e 61 6d 65 2f 42 27 24 7b 73 6e 61 6d  "$pname/B'${snam
8eb0: 65 7d 27 3a 3a 24 66 6e 61 6d 65 22 0a 20 20 20  e}'::$fname".   
8ec0: 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74   }..    # result
8ed0: 20 3d 20 6c 69 73 74 20 28 6d 69 6e 74 69 6d 65   = list (mintime
8ee0: 2c 20 6d 61 78 74 69 6d 65 29 0a 20 20 20 20 74  , maxtime).    t
8ef0: 79 70 65 6d 65 74 68 6f 64 20 74 69 6d 65 72 61  ypemethod timera
8f00: 6e 67 65 20 7b 62 72 61 6e 63 68 65 73 7d 20 7b  nge {branches} {
8f10: 0a 09 23 20 54 68 65 20 72 61 6e 67 65 20 6f 66  ..# The range of
8f20: 20 61 20 62 72 61 6e 63 68 20 69 73 20 64 65 66   a branch is def
8f30: 69 6e 65 64 20 61 73 20 74 68 65 20 72 61 6e 67  ined as the rang
8f40: 65 20 6f 66 20 74 68 65 0a 09 23 20 72 65 76 69  e of the..# revi
8f50: 73 69 6f 6e 73 20 74 68 65 20 62 72 61 6e 63 68  sions the branch
8f60: 65 73 20 61 72 65 20 73 70 61 77 6e 65 64 20 62  es are spawned b
8f70: 79 2e 20 4e 4f 54 45 20 68 6f 77 65 76 65 72 20  y. NOTE however 
8f80: 74 68 61 74 20 74 68 65 0a 09 23 20 62 72 61 6e  that the..# bran
8f90: 63 68 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ches associated 
8fa0: 77 69 74 68 20 61 20 64 65 74 61 63 68 65 64 20  with a detached 
8fb0: 4e 54 44 42 20 77 69 6c 6c 20 68 61 76 65 20 6e  NTDB will have n
8fc0: 6f 20 72 6f 6f 74 0a 09 23 20 73 70 61 77 6e 69  o root..# spawni
8fd0: 6e 67 20 74 68 65 6d 2c 20 68 65 6e 63 65 20 74  ng them, hence t
8fe0: 68 65 79 20 68 61 76 65 20 6e 6f 20 72 65 61 6c  hey have no real
8ff0: 20 74 69 6d 65 72 61 6e 67 65 20 61 6e 79 0a 09   timerange any..
9000: 23 20 6c 6f 6e 67 65 72 2e 20 42 79 20 75 73 69  # longer. By usi
9010: 6e 67 20 30 20 77 65 20 70 75 74 20 74 68 65 6d  ng 0 we put them
9020: 20 69 6e 20 66 72 6f 6e 74 20 6f 66 20 65 76 65   in front of eve
9030: 72 79 74 68 69 6e 67 20 65 6c 73 65 2c 0a 09 23  rything else,..#
9040: 20 61 73 20 74 68 65 79 20 6c 6f 67 69 63 61 6c   as they logical
9050: 6c 79 20 61 72 65 2e 0a 0a 09 73 65 74 20 74 68  ly are....set th
9060: 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72  eset ('[join $br
9070: 61 6e 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a  anches {','}]').
9080: 09 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72  .return [state r
9090: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54  un "..    SELECT
90a0: 20 49 46 4e 55 4c 4c 28 4d 49 4e 28 52 2e 64 61   IFNULL(MIN(R.da
90b0: 74 65 29 2c 30 29 2c 20 49 46 4e 55 4c 4c 28 4d  te),0), IFNULL(M
90c0: 41 58 28 52 2e 64 61 74 65 29 2c 30 29 0a 09 20  AX(R.date),0).. 
90d0: 20 20 20 46 52 4f 4d 20 20 62 72 61 6e 63 68 20     FROM  branch 
90e0: 42 2c 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20  B, revision R.. 
90f0: 20 20 20 57 48 45 52 45 20 42 2e 62 69 64 20 49     WHERE B.bid I
9100: 4e 20 24 74 68 65 73 65 74 0a 20 20 20 20 20 20  N $theset.      
9110: 20 20 20 20 20 20 41 4e 44 20 20 20 52 2e 72 69        AND   R.ri
9120: 64 20 3d 20 42 2e 72 6f 6f 74 0a 09 22 5d 0a 20  d = B.root.."]. 
9130: 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28     }..    # var(
9140: 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d  dv) = dict (item
9150: 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29   -> list (item))
9160: 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28  , item  = list (
9170: 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 70  type id).    typ
9180: 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f  emethod successo
9190: 72 73 20 7b 64 76 20 62 72 61 6e 63 68 65 73 7d  rs {dv branches}
91a0: 20 7b 0a 09 23 20 54 68 65 20 66 69 72 73 74 20   {..# The first 
91b0: 72 65 76 69 73 69 6f 6e 20 63 6f 6d 6d 69 74 74  revision committ
91c0: 65 64 20 6f 6e 20 61 20 62 72 61 6e 63 68 2c 20  ed on a branch, 
91d0: 61 6e 64 20 61 6c 6c 20 62 72 61 6e 63 68 65 73  and all branches
91e0: 0a 09 23 20 61 6e 64 20 74 61 67 73 20 77 68 69  ..# and tags whi
91f0: 63 68 20 68 61 76 65 20 69 74 20 61 73 20 74 68  ch have it as th
9200: 65 69 72 20 70 72 65 66 65 72 65 64 20 70 61 72  eir prefered par
9210: 65 6e 74 20 61 72 65 20 74 68 65 0a 09 23 20 73  ent are the..# s
9220: 75 63 63 65 73 73 6f 72 73 20 6f 66 20 61 20 62  uccessors of a b
9230: 72 61 6e 63 68 2e 0a 0a 09 73 65 74 20 74 68 65  ranch....set the
9240: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61  set ('[join $bra
9250: 6e 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 09  nches {','}]')..
9260: 66 6f 72 65 61 63 68 20 7b 62 69 64 20 63 68 69  foreach {bid chi
9270: 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22  ld} [state run "
9280: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62  ..    SELECT B.b
9290: 69 64 2c 20 52 2e 72 69 64 0a 09 20 20 20 20 46  id, R.rid..    F
92a0: 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20  ROM   branch B, 
92b0: 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20  revision R..    
92c0: 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20  WHERE  B.bid IN 
92d0: 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44  $theset..    AND
92e0: 20 20 20 20 42 2e 66 69 72 73 74 20 3d 20 52 2e      B.first = R.
92f0: 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c  rid.."] {..    l
9300: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63  append dependenc
9310: 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 74  ies([list sym::t
9320: 61 67 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 20  ag $bid]) [list 
9330: 72 65 76 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09  rev $child]..}..
9340: 66 6f 72 65 61 63 68 20 7b 62 69 64 20 63 68 69  foreach {bid chi
9350: 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22  ld} [state run "
9360: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62  ..    SELECT B.b
9370: 69 64 2c 20 42 58 2e 62 69 64 0a 09 20 20 20 20  id, BX.bid..    
9380: 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c  FROM   branch B,
9390: 20 70 72 65 66 65 72 65 64 70 61 72 65 6e 74 20   preferedparent 
93a0: 50 2c 20 62 72 61 6e 63 68 20 42 58 0a 09 20 20  P, branch BX..  
93b0: 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49    WHERE  B.bid I
93c0: 4e 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41  N $theset..    A
93d0: 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50 2e  ND    B.sid = P.
93e0: 70 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20  pid..    AND    
93f0: 42 58 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a 09  BX.sid = P.sid..
9400: 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e  "] {..    lappen
9410: 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b  d dependencies([
9420: 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 62  list sym::tag $b
9430: 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a  id]) [list sym::
9440: 62 72 61 6e 63 68 20 24 63 68 69 6c 64 5d 0a 09  branch $child]..
9450: 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64 20  }..foreach {bid 
9460: 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75  child} [state ru
9470: 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20  n "..    SELECT 
9480: 42 2e 62 69 64 2c 20 54 2e 74 69 64 0a 09 20 20  B.bid, T.tid..  
9490: 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20    FROM   branch 
94a0: 42 2c 20 70 72 65 66 65 72 65 64 70 61 72 65 6e  B, preferedparen
94b0: 74 20 50 2c 20 74 61 67 20 54 0a 09 20 20 20 20  t P, tag T..    
94c0: 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20  WHERE  B.bid IN 
94d0: 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44  $theset..    AND
94e0: 20 20 20 20 42 2e 73 69 64 20 3d 20 50 2e 70 69      B.sid = P.pi
94f0: 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 54 2e  d..    AND    T.
9500: 73 69 64 20 3d 20 50 2e 73 69 64 0a 09 22 5d 20  sid = P.sid.."] 
9510: 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64  {..    lappend d
9520: 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73  ependencies([lis
9530: 74 20 73 79 6d 3a 3a 74 61 67 20 24 62 69 64 5d  t sym::tag $bid]
9540: 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67  ) [list sym::tag
9550: 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 72 65 74   $child]..}..ret
9560: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  urn.    }..    #
9570: 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20   var(dv) = dict 
9580: 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69  (item -> list (i
9590: 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c  tem)), item  = l
95a0: 69 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 20  ist (type id).  
95b0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 70 72 65    typemethod pre
95c0: 64 65 63 65 73 73 6f 72 73 20 7b 64 76 20 62 72  decessors {dv br
95d0: 61 6e 63 68 65 73 7d 20 7b 0a 09 23 20 54 68 65  anches} {..# The
95e0: 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 6f 66   predecessors of
95f0: 20 61 20 62 72 61 6e 63 68 20 61 72 65 20 61 6c   a branch are al
9600: 6c 20 74 68 65 20 72 65 76 69 73 69 6f 6e 73 20  l the revisions 
9610: 74 68 65 0a 09 23 20 62 72 61 6e 63 68 65 73 20  the..# branches 
9620: 61 72 65 20 73 70 61 77 6e 65 64 20 66 72 6f 6d  are spawned from
9630: 2c 20 61 73 20 77 65 6c 6c 20 61 73 20 61 6c 6c  , as well as all
9640: 20 74 68 65 20 62 72 61 6e 63 68 65 73 20 6f 72   the branches or
9650: 0a 09 23 20 74 61 67 73 20 77 68 69 63 68 20 61  ..# tags which a
9660: 72 65 20 74 68 65 69 72 20 70 72 65 66 65 72 65  re their prefere
9670: 64 20 70 61 72 65 6e 74 73 2e 0a 0a 09 73 65 74  d parents....set
9680: 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20   theset ('[join 
9690: 24 74 61 67 73 20 7b 27 2c 27 7d 5d 27 29 0a 09  $tags {','}]')..
96a0: 66 6f 72 65 61 63 68 20 7b 62 69 64 20 70 61 72  foreach {bid par
96b0: 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20  ent} [state run 
96c0: 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e  "..    SELECT B.
96d0: 42 69 64 2c 20 52 2e 72 69 64 0a 09 20 20 20 20  Bid, R.rid..    
96e0: 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c  FROM   branch B,
96f0: 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20   revision R..   
9700: 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e   WHERE  B.bid IN
9710: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e   $theset..    AN
9720: 44 20 20 20 20 42 2e 72 6f 6f 74 20 3d 20 52 2e  D    B.root = R.
9730: 72 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c  rid.."] {..    l
9740: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63  append dependenc
9750: 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62  ies([list sym::b
9760: 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c 69  ranch $bid]) [li
9770: 73 74 20 72 65 76 20 24 70 61 72 65 6e 74 5d 0a  st rev $parent].
9780: 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64  .}..foreach {bid
9790: 20 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20   parent} [state 
97a0: 72 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43  run "..    SELEC
97b0: 54 20 42 2e 62 69 64 2c 20 42 58 2e 62 69 64 0a  T B.bid, BX.bid.
97c0: 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e  .    FROM   bran
97d0: 63 68 20 42 2c 20 70 72 65 66 65 72 65 64 70 61  ch B, preferedpa
97e0: 72 65 6e 74 20 50 2c 20 62 72 61 6e 63 68 20 42  rent P, branch B
97f0: 58 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e  X..    WHERE  B.
9800: 62 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09  bid IN $theset..
9810: 20 20 20 20 41 4e 44 20 20 20 20 42 2e 73 69 64      AND    B.sid
9820: 20 3d 20 50 2e 73 69 64 0a 09 20 20 20 20 41 4e   = P.sid..    AN
9830: 44 20 20 20 20 50 2e 70 69 64 20 3d 20 42 58 2e  D    P.pid = BX.
9840: 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c  sid.."] {..    l
9850: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63  append dependenc
9860: 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62  ies([list sym::b
9870: 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c 69  ranch $bid]) [li
9880: 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24  st sym::branch $
9890: 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 66 6f 72 65  parent]..}..fore
98a0: 61 63 68 20 7b 62 69 64 20 70 61 72 65 6e 74 7d  ach {bid parent}
98b0: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20   [state run ".. 
98c0: 20 20 20 53 45 4c 45 43 54 20 42 2e 62 69 64 2c     SELECT B.bid,
98d0: 20 54 2e 74 69 64 0a 09 20 20 20 20 46 52 4f 4d   T.tid..    FROM
98e0: 20 20 20 62 72 61 6e 63 68 20 42 2c 20 70 72 65     branch B, pre
98f0: 66 65 72 65 64 70 61 72 65 6e 74 20 50 2c 20 74  feredparent P, t
9900: 61 67 20 54 0a 09 20 20 20 20 57 48 45 52 45 20  ag T..    WHERE 
9910: 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65   B.bid IN $these
9920: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e  t..    AND    B.
9930: 73 69 64 20 3d 20 50 2e 73 69 64 0a 09 20 20 20  sid = P.sid..   
9940: 20 41 4e 44 20 20 20 20 50 2e 70 69 64 20 3d 20   AND    P.pid = 
9950: 54 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20  T.sid.."] {..   
9960: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65   lappend depende
9970: 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a  ncies([list sym:
9980: 3a 62 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b  :branch $bid]) [
9990: 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 70  list sym::tag $p
99a0: 61 72 65 6e 74 5d 0a 09 7d 0a 09 72 65 74 75 72  arent]..}..retur
99b0: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23  n.    }..    # #
99c0: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23   ## ### ##### ##
99d0: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
99e0: 23 23 23 23 0a 20 20 20 20 23 23 20 43 6f 6e 66  ####.    ## Conf
99f0: 69 67 75 72 61 74 69 6f 6e 0a 0a 20 20 20 20 70  iguration..    p
9a00: 72 61 67 6d 61 20 2d 68 61 73 69 6e 73 74 61 6e  ragma -hasinstan
9a10: 63 65 73 20 20 20 6e 6f 20 3b 20 23 20 73 69 6e  ces   no ; # sin
9a20: 67 6c 65 74 6f 6e 0a 20 20 20 20 70 72 61 67 6d  gleton.    pragm
9a30: 61 20 2d 68 61 73 74 79 70 65 69 6e 66 6f 20 20  a -hastypeinfo  
9a40: 20 20 6e 6f 20 3b 20 23 20 6e 6f 20 69 6e 74 72    no ; # no intr
9a50: 6f 73 70 65 63 74 69 6f 6e 0a 20 20 20 20 70 72  ospection.    pr
9a60: 61 67 6d 61 20 2d 68 61 73 74 79 70 65 64 65 73  agma -hastypedes
9a70: 74 72 6f 79 20 6e 6f 20 3b 20 23 20 69 6d 6d 6f  troy no ; # immo
9a80: 72 74 61 6c 0a 7d 0a 0a 23 20 23 20 23 23 20 23  rtal.}..# # ## #
9a90: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
9aa0: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20  # ############# 
9ab0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9ac0: 23 23 23 23 23 0a 23 23 0a 0a 6e 61 6d 65 73 70  #####.##..namesp
9ad0: 61 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a 66  ace eval ::vc::f
9ae0: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63  ossil::import::c
9af0: 76 73 3a 3a 70 72 6f 6a 65 63 74 20 7b 0a 20 20  vs::project {.  
9b00: 20 20 6e 61 6d 65 73 70 61 63 65 20 65 78 70 6f    namespace expo
9b10: 72 74 20 72 65 76 0a 20 20 20 20 6e 61 6d 65 73  rt rev.    names
9b20: 70 61 63 65 20 65 76 61 6c 20 72 65 76 20 7b 0a  pace eval rev {.
9b30: 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72  .namespace impor
9b40: 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a  t ::vc::fossil::
9b50: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61  import::cvs::sta
9b60: 74 65 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d  te..namespace im
9b70: 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69  port ::vc::fossi
9b80: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a  l::import::cvs::
9b90: 69 6e 74 65 67 72 69 74 79 0a 09 6e 61 6d 65 73  integrity..names
9ba0: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63  pace import ::vc
9bb0: 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69 73 63 3a 3a 2a  ::tools::misc::*
9bc0: 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f  ..namespace impo
9bd0: 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a  rt ::vc::tools::
9be0: 74 72 6f 75 62 6c 65 0a 09 6e 61 6d 65 73 70 61  trouble..namespa
9bf0: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a  ce import ::vc::
9c00: 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 6c 6f 67 20  tools::log..log 
9c10: 72 65 67 69 73 74 65 72 20 63 73 65 74 73 0a 0a  register csets..
9c20: 09 23 20 53 65 74 20 75 70 20 74 68 65 20 68 65  .# Set up the he
9c30: 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 73 0a  lper singletons.
9c40: 09 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20  .namespace eval 
9c50: 72 65 76 20 7b 0a 09 20 20 20 20 6e 61 6d 65 73  rev {..    names
9c60: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63  pace import ::vc
9c70: 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74  ::fossil::import
9c80: 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09 20 20  ::cvs::state..  
9c90: 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f    namespace impo
9ca0: 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a  rt ::vc::fossil:
9cb0: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e  :import::cvs::in
9cc0: 74 65 67 72 69 74 79 0a 09 7d 0a 09 6e 61 6d 65  tegrity..}..name
9cd0: 73 70 61 63 65 20 65 76 61 6c 20 73 79 6d 3a 3a  space eval sym::
9ce0: 74 61 67 20 7b 0a 09 20 20 20 20 6e 61 6d 65 73  tag {..    names
9cf0: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63  pace import ::vc
9d00: 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74  ::fossil::import
9d10: 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09 20 20  ::cvs::state..  
9d20: 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f    namespace impo
9d30: 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a  rt ::vc::fossil:
9d40: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e  :import::cvs::in
9d50: 74 65 67 72 69 74 79 0a 09 7d 0a 09 6e 61 6d 65  tegrity..}..name
9d60: 73 70 61 63 65 20 65 76 61 6c 20 73 79 6d 3a 3a  space eval sym::
9d70: 62 72 61 6e 63 68 20 7b 0a 09 20 20 20 20 6e 61  branch {..    na
9d80: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
9d90: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70  :vc::fossil::imp
9da0: 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a  ort::cvs::state.
9db0: 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69  .    namespace i
9dc0: 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73  mport ::vc::foss
9dd0: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a  il::import::cvs:
9de0: 3a 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a 20 20  :integrity..}.  
9df0: 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23    }.}..# # ## ##
9e00: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
9e10: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23   ############# #
9e20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9e30: 23 23 23 23 0a 23 23 20 52 65 61 64 79 0a 0a 70  ####.## Ready..p
9e40: 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20 76  ackage provide v
9e50: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72  c::fossil::impor
9e60: 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a  t::cvs::project:
9e70: 3a 72 65 76 20 31 2e 30 0a 72 65 74 75 72 6e 0a  :rev 1.0.return.