Hex Artifact Content
Not logged in

Artifact 6a7202a9dce689d6e91d8daa2e9ddd708842bb2b:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [0af7a3c8ac] - Easier name for self-referential changesets, loopcheck. Made conditional on option --loopcheck, default off, and avoided if the general checks on changesets report trouble. Reinstated the loop check in the cycle breaker core in simpler form, reusing the new command in the changeset class. by aku on 2007-11-30 06:57:19.

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 61 72  ragmentitems $ar
3990: 67 73 20 7b 0a 09 20 20 20 20 6c 6f 67 20 77 72  gs {..    log wr
39a0: 69 74 65 20 38 20 63 73 65 74 73 20 7b 4e 45 57  ite 8 csets {NEW
39b0: 3a 20 5b 6c 73 6f 72 74 20 24 66 72 61 67 6d 65  : [lsort $fragme
39c0: 6e 74 69 74 65 6d 73 5d 7d 0a 0a 09 20 20 20 20  ntitems]}...    
39d0: 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74  integrity assert
39e0: 20 7b 0a 09 09 21 5b 73 74 72 75 63 74 3a 3a 73   {...![struct::s
39f0: 65 74 20 65 6d 70 74 79 20 24 66 72 61 67 6d 65  et empty $fragme
3a00: 6e 74 69 74 65 6d 73 5d 0a 09 20 20 20 20 7d 20  ntitems]..    } 
3a10: 7b 63 68 61 6e 67 65 73 65 74 20 66 72 61 67 6d  {changeset fragm
3a20: 65 6e 74 20 69 73 20 65 6d 70 74 79 7d 0a 0a 09  ent is empty}...
3a30: 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73      integrity as
3a40: 73 65 72 74 20 7b 0a 09 09 5b 73 74 72 75 63 74  sert {...[struct
3a50: 3a 3a 73 65 74 20 73 75 62 73 65 74 6f 66 20 24  ::set subsetof $
3a60: 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 20 5b 24  fragmentitems [$
3a70: 63 73 65 74 20 69 74 65 6d 73 5d 5d 0a 09 20 20  cset items]]..  
3a80: 20 20 7d 20 7b 63 68 61 6e 67 65 73 65 74 20 66    } {changeset f
3a90: 72 61 67 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61  ragment is not a
3aa0: 20 73 75 62 73 65 74 7d 0a 09 20 20 20 20 73 74   subset}..    st
3ab0: 72 75 63 74 3a 3a 73 65 74 20 61 64 64 20 63 6f  ruct::set add co
3ac0: 76 65 72 20 24 66 72 61 67 6d 65 6e 74 69 74 65  ver $fragmentite
3ad0: 6d 73 0a 09 7d 0a 0a 09 69 6e 74 65 67 72 69 74  ms..}...integrit
3ae0: 79 20 61 73 73 65 72 74 20 7b 0a 09 20 20 20 20  y assert {..    
3af0: 5b 73 74 72 75 63 74 3a 3a 73 65 74 20 65 71 75  [struct::set equ
3b00: 61 6c 20 24 63 6f 76 65 72 20 5b 24 63 73 65 74  al $cover [$cset
3b10: 20 69 74 65 6d 73 5d 5d 0a 09 20 7d 20 7b 54 68   items]].. } {Th
3b20: 65 20 66 72 61 67 6d 65 6e 74 73 20 64 6f 20 6e  e fragments do n
3b30: 6f 74 20 63 6f 76 65 72 20 74 68 65 20 6f 72 69  ot cover the ori
3b40: 67 69 6e 61 6c 20 63 68 61 6e 67 65 73 65 74 7d  ginal changeset}
3b50: 0a 0a 09 73 65 74 20 69 20 31 0a 09 66 6f 72 65  ...set i 1..fore
3b60: 61 63 68 20 66 69 61 20 24 61 72 67 73 20 7b 0a  ach fia $args {.
3b70: 09 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 62  .    foreach fib
3b80: 20 5b 6c 72 61 6e 67 65 20 24 61 72 67 73 20 24   [lrange $args $
3b90: 69 20 65 6e 64 5d 20 7b 0a 09 09 69 6e 74 65 67  i end] {...integ
3ba0: 72 69 74 79 20 61 73 73 65 72 74 20 7b 0a 09 09  rity assert {...
3bb0: 20 20 20 20 5b 73 74 72 75 63 74 3a 3a 73 65 74      [struct::set
3bc0: 20 65 6d 70 74 79 20 5b 73 74 72 75 63 74 3a 3a   empty [struct::
3bd0: 73 65 74 20 69 6e 74 65 72 73 65 63 74 20 24 66  set intersect $f
3be0: 69 61 20 24 66 69 62 5d 5d 0a 09 09 7d 20 7b 54  ia $fib]]...} {T
3bf0: 68 65 20 66 72 61 67 6d 65 6e 74 73 20 3c 24 66  he fragments <$f
3c00: 69 61 3e 20 61 6e 64 20 3c 24 66 69 62 3e 20 6f  ia> and <$fib> o
3c10: 76 65 72 6c 61 70 7d 0a 09 20 20 20 20 7d 0a 09  verlap}..    }..
3c20: 20 20 20 20 69 6e 63 72 20 69 0a 09 7d 0a 0a 09      incr i..}...
3c30: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20  return.    }..  
3c40: 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23    # # ## ### ###
3c50: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23  ## ######## ####
3c60: 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23  #########.    ##
3c70: 20 53 74 61 74 65 0a 0a 20 20 20 20 76 61 72 69   State..    vari
3c80: 61 62 6c 65 20 6d 79 69 64 20 20 20 20 20 20 20  able myid       
3c90: 20 7b 7d 20 3b 20 23 20 49 64 20 6f 66 20 74 68   {} ; # Id of th
3ca0: 65 20 63 73 65 74 20 66 6f 72 20 74 68 65 20 70  e cset for the p
3cb0: 65 72 73 69 73 74 65 6e 74 0a 09 09 09 20 20 20  ersistent....   
3cc0: 20 20 20 23 20 73 74 61 74 65 2e 0a 20 20 20 20     # state..    
3cd0: 76 61 72 69 61 62 6c 65 20 6d 79 70 72 6f 6a 65  variable myproje
3ce0: 63 74 20 20 20 7b 7d 20 3b 20 23 20 52 65 66 65  ct   {} ; # Refe
3cf0: 72 65 6e 63 65 20 6f 66 20 74 68 65 20 70 72 6f  rence of the pro
3d00: 6a 65 63 74 20 6f 62 6a 65 63 74 20 74 68 65 0a  ject object the.
3d10: 09 09 09 20 20 20 20 20 20 23 20 63 68 61 6e 67  ...      # chang
3d20: 65 73 65 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2e  eset belongs to.
3d30: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79  .    variable my
3d40: 74 79 70 65 20 20 20 20 20 20 7b 7d 20 3b 20 23  type      {} ; #
3d50: 20 57 68 61 74 20 74 68 65 20 63 68 61 6e 67 65   What the change
3d60: 73 65 74 20 69 73 20 62 61 73 65 64 20 6f 6e 0a  set is based on.
3d70: 09 09 09 20 20 20 20 20 20 23 20 28 72 65 76 69  ...      # (revi
3d80: 73 69 6f 6e 73 2c 20 74 61 67 73 2c 20 6f 72 20  sions, tags, or 
3d90: 62 72 61 6e 63 68 65 73 29 2e 0a 09 09 09 20 20  branches).....  
3da0: 20 20 20 20 23 20 56 61 6c 75 65 73 3a 20 53 65      # Values: Se
3db0: 65 20 6d 79 63 73 74 79 70 65 2e 20 4e 6f 74 65  e mycstype. Note
3dc0: 20 74 68 61 74 20 77 65 0a 09 09 09 20 20 20 20   that we....    
3dd0: 20 20 23 20 68 61 76 65 20 74 6f 20 6b 65 65 70    # have to keep
3de0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
3df0: 65 20 68 65 6c 70 65 72 0a 09 09 09 20 20 20 20  e helper....    
3e00: 20 20 23 20 73 69 6e 67 6c 65 74 6f 6e 73 20 69    # singletons i
3e10: 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20  n sync with the 
3e20: 63 6f 6e 74 65 6e 74 73 0a 09 09 09 20 20 20 20  contents....    
3e30: 20 20 23 20 6f 66 20 73 74 61 74 65 20 74 61 62    # of state tab
3e40: 6c 65 20 27 63 73 74 79 70 65 27 2c 20 61 6e 64  le 'cstype', and
3e50: 20 76 61 72 69 6f 75 73 0a 09 09 09 20 20 20 20   various....    
3e60: 20 20 23 20 6f 74 68 65 72 20 70 6c 61 63 65 73    # other places
3e70: 20 75 73 69 6e 67 20 74 68 65 6d 20 68 61 72 64   using them hard
3e80: 77 69 72 65 64 2e 0a 20 20 20 20 76 61 72 69 61  wired..    varia
3e90: 62 6c 65 20 6d 79 74 79 70 65 6f 62 6a 20 20 20  ble mytypeobj   
3ea0: 7b 7d 20 3b 20 23 20 52 65 66 65 72 65 6e 63 65  {} ; # Reference
3eb0: 20 74 6f 20 74 68 65 20 63 6f 6e 74 61 69 6e 65   to the containe
3ec0: 72 20 66 6f 72 20 74 68 65 0a 09 09 09 20 20 20  r for the....   
3ed0: 20 20 20 23 20 74 79 70 65 20 64 65 70 65 6e 64     # type depend
3ee0: 65 6e 74 20 63 6f 64 65 2e 20 44 65 72 69 76 65  ent code. Derive
3ef0: 64 20 66 72 6f 6d 0a 09 09 09 20 20 20 20 20 20  d from....      
3f00: 23 20 6d 79 74 79 70 65 2e 0a 20 20 20 20 76 61  # mytype..    va
3f10: 72 69 61 62 6c 65 20 6d 79 73 72 63 69 64 20 20  riable mysrcid  
3f20: 20 20 20 7b 7d 20 3b 20 23 20 49 64 20 6f 66 20     {} ; # Id of 
3f30: 74 68 65 20 6d 65 74 61 64 61 74 61 20 6f 72 20  the metadata or 
3f40: 73 79 6d 62 6f 6c 20 74 68 65 20 63 73 65 74 0a  symbol the cset.
3f50: 09 09 09 20 20 20 20 20 20 23 20 69 73 20 62 61  ...      # is ba
3f60: 73 65 64 20 6f 6e 2e 0a 20 20 20 20 76 61 72 69  sed on..    vari
3f70: 61 62 6c 65 20 6d 79 69 74 65 6d 73 20 20 20 20  able myitems    
3f80: 20 7b 7d 20 3b 20 23 20 4c 69 73 74 20 6f 66 20   {} ; # List of 
3f90: 74 68 65 20 66 69 6c 65 20 6c 65 76 65 6c 20 72  the file level r
3fa0: 65 76 69 73 69 6f 6e 73 2c 0a 09 09 09 20 20 20  evisions,....   
3fb0: 20 20 20 23 20 74 61 67 73 2c 20 6f 72 20 62 72     # tags, or br
3fc0: 61 6e 63 68 65 73 20 69 6e 20 74 68 65 20 63 73  anches in the cs
3fd0: 65 74 2c 20 61 73 0a 09 09 09 20 20 20 20 20 20  et, as....      
3fe0: 23 20 69 64 73 2e 20 4e 6f 74 20 74 61 67 67 65  # ids. Not tagge
3ff0: 64 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20  d..    variable 
4000: 6d 79 74 69 74 65 6d 73 20 20 20 20 7b 7d 20 3b  mytitems    {} ;
4010: 20 23 20 41 73 20 6d 79 69 74 65 6d 73 2c 20 74   # As myitems, t
4020: 68 65 20 74 61 67 67 65 64 20 66 6f 72 6d 2e 0a  he tagged form..
4030: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 70      variable myp
4040: 72 65 6d 61 70 20 20 20 20 7b 7d 20 3b 20 23 20  remap    {} ; # 
4050: 44 69 63 74 69 6f 6e 61 72 79 20 6d 61 70 70 69  Dictionary mappi
4060: 6e 67 20 66 72 6f 6d 20 74 68 65 20 69 74 65 6d  ng from the item
4070: 73 20 28 74 61 67 67 65 64 20 6e 6f 77 29 0a 09  s (tagged now)..
4080: 09 09 20 20 20 20 20 20 23 20 74 6f 20 74 68 65  ..      # to the
4090: 69 72 20 70 72 65 64 65 63 65 73 73 6f 72 73 2c  ir predecessors,
40a0: 20 61 6c 73 6f 20 74 61 67 67 65 64 2e 20 41 0a   also tagged. A.
40b0: 09 09 09 20 20 20 20 20 20 23 20 63 61 63 68 65  ...      # cache
40c0: 20 74 6f 20 61 76 6f 69 64 20 6c 6f 61 64 69 6e   to avoid loadin
40d0: 67 20 74 68 69 73 20 66 72 6f 6d 20 74 68 65 0a  g this from the.
40e0: 09 09 09 20 20 20 20 20 20 23 20 73 74 61 74 65  ...      # state
40f0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 63 65 2e   more than once.
4100: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79  .    variable my
4110: 6e 65 78 74 6d 61 70 20 20 20 7b 7d 20 3b 20 23  nextmap   {} ; #
4120: 20 44 69 63 74 69 6f 6e 61 72 79 20 6d 61 70 70   Dictionary mapp
4130: 69 6e 67 20 66 72 6f 6d 20 74 68 65 20 69 74 65  ing from the ite
4140: 6d 73 20 28 74 61 67 67 65 64 29 0a 09 09 09 20  ms (tagged).... 
4150: 20 20 20 20 20 23 20 74 6f 20 74 68 65 69 72 20       # to their 
4160: 73 75 63 63 65 73 73 6f 72 73 20 28 61 6c 73 6f  successors (also
4170: 20 74 61 67 67 65 64 29 2e 20 41 0a 09 09 09 20   tagged). A.... 
4180: 20 20 20 20 20 23 20 63 61 63 68 65 20 74 6f 20       # cache to 
4190: 61 76 6f 69 64 20 6c 6f 61 64 69 6e 67 20 74 68  avoid loading th
41a0: 69 73 20 66 72 6f 6d 20 74 68 65 0a 09 09 09 20  is from the.... 
41b0: 20 20 20 20 20 23 20 73 74 61 74 65 20 6d 6f 72       # state mor
41c0: 65 20 74 68 61 6e 20 6f 6e 63 65 2e 0a 20 20 20  e than once..   
41d0: 20 76 61 72 69 61 62 6c 65 20 6d 79 70 6f 73 20   variable mypos 
41e0: 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 43 6f 6d        {} ; # Com
41f0: 6d 69 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66 20  mit position of 
4200: 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20 69  the changeset, i
4210: 66 0a 09 09 09 20 20 20 20 20 20 23 20 6b 6e 6f  f....      # kno
4220: 77 6e 2e 0a 0a 20 20 20 20 23 20 23 20 23 23 20  wn...    # # ## 
4230: 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23  ### ##### ######
4240: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
4250: 0a 20 20 20 20 23 23 20 49 6e 74 65 72 6e 61 6c  .    ## Internal
4260: 20 6d 65 74 68 6f 64 73 0a 0a 20 20 20 20 74 79   methods..    ty
4270: 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 6f 75  pevariable mycou
4280: 6e 74 65 72 20 20 20 20 20 20 20 20 30 20 3b 20  nter        0 ; 
4290: 23 20 49 64 20 63 6f 75 6e 74 65 72 20 66 6f 72  # Id counter for
42a0: 20 63 73 65 74 73 2e 20 4c 61 73 74 20 69 64 0a   csets. Last id.
42b0: 09 09 09 09 20 20 20 20 20 20 23 20 75 73 65 64  ....      # used
42c0: 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62  ..    typevariab
42d0: 6c 65 20 6d 79 63 73 74 79 70 65 20 2d 61 72 72  le mycstype -arr
42e0: 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 63 73  ay {} ; # Map cs
42f0: 74 79 70 65 73 20 28 6e 61 6d 65 73 29 20 74 6f  types (names) to
4300: 20 70 65 72 73 69 73 74 65 6e 74 0a 09 09 09 09   persistent.....
4310: 20 20 20 20 20 20 23 20 69 64 73 2e 20 4e 6f 74        # ids. Not
4320: 65 20 74 68 61 74 20 77 65 20 68 61 76 65 20 74  e that we have t
4330: 6f 20 6b 65 65 70 0a 09 09 09 09 20 20 20 20 20  o keep.....     
4340: 20 23 20 74 68 65 20 6e 61 6d 65 73 20 69 6e 20   # the names in 
4350: 74 68 65 20 74 61 62 6c 65 20 27 63 73 74 79 70  the table 'cstyp
4360: 65 27 0a 09 09 09 09 20 20 20 20 20 20 23 20 69  e'.....      # i
4370: 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20  n sync with the 
4380: 6e 61 6d 65 73 20 6f 66 20 74 68 65 0a 09 09 09  names of the....
4390: 09 20 20 20 20 20 20 23 20 68 65 6c 70 65 72 20  .      # helper 
43a0: 73 69 6e 67 6c 65 74 6f 6e 73 2e 0a 0a 20 20 20  singletons...   
43b0: 20 74 79 70 65 6d 65 74 68 6f 64 20 67 65 74 63   typemethod getc
43c0: 73 74 79 70 65 73 20 7b 7d 20 7b 0a 09 66 6f 72  stypes {} {..for
43d0: 65 61 63 68 20 7b 74 69 64 20 6e 61 6d 65 7d 20  each {tid name} 
43e0: 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20  [state run {..  
43f0: 20 20 53 45 4c 45 43 54 20 74 69 64 2c 20 6e 61    SELECT tid, na
4400: 6d 65 20 46 52 4f 4d 20 63 73 74 79 70 65 3b 0a  me FROM cstype;.
4410: 09 7d 5d 20 7b 20 73 65 74 20 6d 79 63 73 74 79  .}] { set mycsty
4420: 70 65 28 24 6e 61 6d 65 29 20 24 74 69 64 20 7d  pe($name) $tid }
4430: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
4440: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c      typemethod l
4450: 6f 61 64 63 6f 75 6e 74 65 72 20 7b 7d 20 7b 0a  oadcounter {} {.
4460: 09 23 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  .# Initialize th
4470: 65 20 63 6f 75 6e 74 65 72 20 66 72 6f 6d 20 74  e counter from t
4480: 68 65 20 73 74 61 74 65 0a 09 73 65 74 20 6d 79  he state..set my
4490: 63 6f 75 6e 74 65 72 20 5b 73 74 61 74 65 20 6f  counter [state o
44a0: 6e 65 20 7b 20 53 45 4c 45 43 54 20 4d 41 58 28  ne { SELECT MAX(
44b0: 63 69 64 29 20 46 52 4f 4d 20 63 68 61 6e 67 65  cid) FROM change
44c0: 73 65 74 20 7d 5d 0a 09 72 65 74 75 72 6e 0a 20  set }]..return. 
44d0: 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65     }..    typeme
44e0: 74 68 6f 64 20 6e 75 6d 20 7b 7d 20 7b 20 72 65  thod num {} { re
44f0: 74 75 72 6e 20 24 6d 79 63 6f 75 6e 74 65 72 20  turn $mycounter 
4500: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 49 6e 69 74  }..    proc Init
4510: 69 61 6c 69 7a 65 42 72 65 61 6b 53 74 61 74 65  ializeBreakState
4520: 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09   {revisions} {..
4530: 75 70 76 61 72 20 31 20 70 6f 73 20 70 6f 73 20  upvar 1 pos pos 
4540: 63 72 6f 73 73 20 63 72 6f 73 73 20 72 61 6e 67  cross cross rang
4550: 65 20 72 61 6e 67 65 20 64 65 70 63 20 64 65 70  e range depc dep
4560: 63 20 64 65 6c 74 61 20 64 65 6c 74 61 20 5c 0a  c delta delta \.
4570: 09 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65  .    dependencie
4580: 73 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 0a  s dependencies..
4590: 09 23 20 46 69 72 73 74 20 77 65 20 63 72 65 61  .# First we crea
45a0: 74 65 20 61 20 6d 61 70 20 6f 66 20 70 6f 73 69  te a map of posi
45b0: 74 69 6f 6e 73 20 74 6f 20 6d 61 6b 65 20 69 74  tions to make it
45c0: 20 65 61 73 69 65 72 20 74 6f 0a 09 23 20 64 65   easier to..# de
45d0: 74 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20  termine whether 
45e0: 61 20 64 65 70 65 6e 64 65 6e 63 79 20 63 72 6f  a dependency cro
45f0: 73 73 65 73 20 61 20 70 61 72 74 69 63 75 6c 61  sses a particula
4600: 72 20 69 6e 64 65 78 2e 0a 0a 09 61 72 72 61 79  r index....array
4610: 20 73 65 74 20 70 6f 73 20 20 20 7b 7d 0a 09 61   set pos   {}..a
4620: 72 72 61 79 20 73 65 74 20 63 72 6f 73 73 20 7b  rray set cross {
4630: 7d 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 70  }..array set dep
4640: 63 20 20 7b 7d 0a 09 73 65 74 20 72 61 6e 67 65  c  {}..set range
4650: 20 20 20 20 20 20 20 7b 7d 0a 09 73 65 74 20 6e         {}..set n
4660: 20 30 0a 09 66 6f 72 65 61 63 68 20 72 65 76 20   0..foreach rev 
4670: 24 72 65 76 69 73 69 6f 6e 73 20 7b 0a 09 20 20  $revisions {..  
4680: 20 20 6c 61 70 70 65 6e 64 20 72 61 6e 67 65 20    lappend range 
4690: 24 6e 0a 09 20 20 20 20 73 65 74 20 70 6f 73 28  $n..    set pos(
46a0: 24 72 65 76 29 20 24 6e 0a 09 20 20 20 20 73 65  $rev) $n..    se
46b0: 74 20 63 72 6f 73 73 28 24 6e 29 20 30 0a 09 20  t cross($n) 0.. 
46c0: 20 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 0a 09 23     incr n..}...#
46d0: 20 53 65 63 6f 6e 64 6c 79 20 77 65 20 63 6f 75   Secondly we cou
46e0: 6e 74 20 74 68 65 20 63 72 6f 73 73 69 6e 67 73  nt the crossings
46f0: 20 70 65 72 20 70 6f 73 69 74 69 6f 6e 2c 20 62   per position, b
4700: 79 20 69 74 65 72 61 74 69 6e 67 0a 09 23 20 6f  y iterating..# o
4710: 76 65 72 20 74 68 65 20 72 65 63 6f 72 64 65 64  ver the recorded
4720: 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64   internal depend
4730: 65 6e 63 69 65 73 2e 0a 0a 09 23 20 4e 6f 74 65  encies....# Note
4740: 3a 20 49 66 20 74 68 65 20 74 69 6d 65 73 74 61  : If the timesta
4750: 6d 70 73 20 61 72 65 20 62 61 64 6c 79 20 6f 75  mps are badly ou
4760: 74 20 6f 66 20 6f 72 64 65 72 20 69 74 20 69 73  t of order it is
4770: 0a 09 23 20 20 20 20 20 20 20 70 6f 73 73 69 62  ..#       possib
4780: 6c 65 20 74 6f 20 68 61 76 65 20 61 20 62 61 63  le to have a bac
4790: 6b 77 61 72 64 20 73 75 63 63 65 73 73 6f 72 20  kward successor 
47a0: 64 65 70 65 6e 64 65 6e 63 79 2c 0a 09 23 20 20  dependency,..#  
47b0: 20 20 20 20 20 69 2e 65 2e 20 77 69 74 68 20 73       i.e. with s
47c0: 74 61 72 74 20 3e 20 65 6e 64 2e 20 57 65 20 6d  tart > end. We m
47d0: 61 79 20 68 61 76 65 20 74 6f 20 73 77 61 70 20  ay have to swap 
47e0: 74 68 65 20 69 6e 64 69 63 65 73 0a 09 23 20 20  the indices..#  
47f0: 20 20 20 20 20 74 6f 20 65 6e 73 75 72 65 20 74       to ensure t
4800: 68 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e  hat the followin
4810: 67 20 6c 6f 6f 70 20 72 75 6e 73 20 63 6f 72 72  g loop runs corr
4820: 65 63 74 6c 79 2e 0a 09 23 0a 09 23 20 4e 6f 74  ectly...#..# Not
4830: 65 20 32 3a 20 73 74 61 72 74 20 3d 3d 20 65 6e  e 2: start == en
4840: 64 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c  d is not possibl
4850: 65 2e 20 49 74 20 69 6e 64 69 63 61 74 65 73 20  e. It indicates 
4860: 61 0a 09 23 20 20 20 20 20 20 20 20 20 73 65 6c  a..#         sel
4870: 66 2d 64 65 70 65 6e 64 65 6e 63 79 20 64 75 65  f-dependency due
4880: 20 74 6f 20 74 68 65 20 75 6e 69 71 75 65 6e 65   to the uniquene
4890: 73 73 20 6f 66 20 70 6f 73 69 74 69 6f 6e 73 2c  ss of positions,
48a0: 0a 09 23 20 20 20 20 20 20 20 20 20 61 6e 64 20  ..#         and 
48b0: 74 68 61 74 20 69 73 20 73 6f 6d 65 74 68 69 6e  that is somethin
48c0: 67 20 77 65 20 68 61 76 65 20 72 75 6c 65 64 20  g we have ruled 
48d0: 6f 75 74 20 61 6c 72 65 61 64 79 2c 20 73 65 65  out already, see
48e0: 0a 09 23 20 20 20 20 20 20 20 20 20 27 72 65 76  ..#         'rev
48f0: 20 69 6e 74 65 72 6e 61 6c 73 75 63 63 65 73 73   internalsuccess
4900: 6f 72 73 27 2e 0a 0a 09 66 6f 72 65 61 63 68 20  ors'....foreach 
4910: 7b 72 69 64 20 63 68 69 6c 64 72 65 6e 7d 20 5b  {rid children} [
4920: 61 72 72 61 79 20 67 65 74 20 64 65 70 65 6e 64  array get depend
4930: 65 6e 63 69 65 73 5d 20 7b 0a 09 20 20 20 20 66  encies] {..    f
4940: 6f 72 65 61 63 68 20 63 68 69 6c 64 20 24 63 68  oreach child $ch
4950: 69 6c 64 72 65 6e 20 7b 0a 09 09 73 65 74 20 64  ildren {...set d
4960: 6b 65 79 20 20 20 20 5b 6c 69 73 74 20 24 72 69  key    [list $ri
4970: 64 20 24 63 68 69 6c 64 5d 0a 09 09 73 65 74 20  d $child]...set 
4980: 73 74 61 72 74 20 20 20 24 70 6f 73 28 24 72 69  start   $pos($ri
4990: 64 29 0a 09 09 73 65 74 20 65 6e 64 20 20 20 20  d)...set end    
49a0: 20 24 70 6f 73 28 24 63 68 69 6c 64 29 0a 09 09   $pos($child)...
49b0: 73 65 74 20 63 72 6f 73 73 65 73 20 7b 7d 0a 0a  set crosses {}..
49c0: 09 09 69 66 20 7b 24 73 74 61 72 74 20 3e 20 24  ..if {$start > $
49d0: 65 6e 64 7d 20 7b 0a 09 09 20 20 20 20 77 68 69  end} {...    whi
49e0: 6c 65 20 7b 24 65 6e 64 20 3c 20 24 73 74 61 72  le {$end < $star
49f0: 74 7d 20 7b 0a 09 09 09 6c 61 70 70 65 6e 64 20  t} {....lappend 
4a00: 63 72 6f 73 73 65 73 20 24 65 6e 64 0a 09 09 09  crosses $end....
4a10: 69 6e 63 72 20 63 72 6f 73 73 28 24 65 6e 64 29  incr cross($end)
4a20: 0a 09 09 09 69 6e 63 72 20 65 6e 64 0a 09 09 20  ....incr end... 
4a30: 20 20 20 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a     }...} else {.
4a40: 09 09 20 20 20 20 77 68 69 6c 65 20 7b 24 73 74  ..    while {$st
4a50: 61 72 74 20 3c 20 24 65 6e 64 7d 20 7b 0a 09 09  art < $end} {...
4a60: 09 6c 61 70 70 65 6e 64 20 63 72 6f 73 73 65 73  .lappend crosses
4a70: 20 24 73 74 61 72 74 0a 09 09 09 69 6e 63 72 20   $start....incr 
4a80: 63 72 6f 73 73 28 24 73 74 61 72 74 29 0a 09 09  cross($start)...
4a90: 09 69 6e 63 72 20 73 74 61 72 74 0a 09 09 20 20  .incr start...  
4aa0: 20 20 7d 0a 09 09 7d 0a 09 09 73 65 74 20 64 65    }...}...set de
4ab0: 70 63 28 24 64 6b 65 79 29 20 24 63 72 6f 73 73  pc($dkey) $cross
4ac0: 65 73 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 49  es..    }..}...I
4ad0: 6e 69 74 69 61 6c 69 7a 65 44 65 6c 74 61 73 20  nitializeDeltas 
4ae0: 24 72 65 76 69 73 69 6f 6e 73 0a 09 72 65 74 75  $revisions..retu
4af0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72  rn.    }..    pr
4b00: 6f 63 20 49 6e 69 74 69 61 6c 69 7a 65 44 65 6c  oc InitializeDel
4b10: 74 61 73 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20  tas {revisions} 
4b20: 7b 0a 09 75 70 76 61 72 20 31 20 64 65 6c 74 61  {..upvar 1 delta
4b30: 20 64 65 6c 74 61 0a 0a 09 23 20 50 75 6c 6c 20   delta...# Pull 
4b40: 74 68 65 20 74 69 6d 65 73 74 61 6d 70 73 20 66  the timestamps f
4b50: 6f 72 20 61 6c 6c 20 72 65 76 69 73 69 6f 6e 73  or all revisions
4b60: 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65   in the changese
4b70: 74 73 20 61 6e 64 0a 09 23 20 63 6f 6d 70 75 74  ts and..# comput
4b80: 65 20 74 68 65 69 72 20 64 65 6c 74 61 73 20 66  e their deltas f
4b90: 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 62 72  or use by the br
4ba0: 65 61 6b 20 66 69 6e 64 65 72 2e 0a 0a 09 61 72  eak finder....ar
4bb0: 72 61 79 20 73 65 74 20 64 65 6c 74 61 20 7b 7d  ray set delta {}
4bc0: 0a 09 61 72 72 61 79 20 73 65 74 20 73 74 61 6d  ..array set stam
4bd0: 70 20 7b 7d 0a 0a 09 73 65 74 20 74 68 65 73 65  p {}...set these
4be0: 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73  t ('[join $revis
4bf0: 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66  ions {','}]')..f
4c00: 6f 72 65 61 63 68 20 7b 72 69 64 20 74 69 6d 65  oreach {rid time
4c10: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09  } [state run "..
4c20: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64      SELECT R.rid
4c30: 2c 20 52 2e 64 61 74 65 0a 09 20 20 20 20 46 52  , R.date..    FR
4c40: 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20  OM revision R.. 
4c50: 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 49     WHERE R.rid I
4c60: 4e 20 24 74 68 65 73 65 74 0a 09 22 5d 20 7b 0a  N $theset.."] {.
4c70: 09 20 20 20 20 73 65 74 20 73 74 61 6d 70 28 24  .    set stamp($
4c80: 72 69 64 29 20 24 74 69 6d 65 0a 09 7d 0a 0a 09  rid) $time..}...
4c90: 73 65 74 20 6e 20 30 0a 09 66 6f 72 65 61 63 68  set n 0..foreach
4ca0: 20 72 69 64 20 5b 6c 72 61 6e 67 65 20 24 72 65   rid [lrange $re
4cb0: 76 69 73 69 6f 6e 73 20 30 20 65 6e 64 2d 31 5d  visions 0 end-1]
4cc0: 20 72 6e 65 78 74 20 5b 6c 72 61 6e 67 65 20 24   rnext [lrange $
4cd0: 72 65 76 69 73 69 6f 6e 73 20 31 20 65 6e 64 5d  revisions 1 end]
4ce0: 20 7b 0a 09 20 20 20 20 73 65 74 20 64 65 6c 74   {..    set delt
4cf0: 61 28 24 6e 29 20 5b 65 78 70 72 20 7b 24 73 74  a($n) [expr {$st
4d00: 61 6d 70 28 24 72 6e 65 78 74 29 20 2d 20 24 73  amp($rnext) - $s
4d10: 74 61 6d 70 28 24 72 69 64 29 7d 5d 0a 09 20 20  tamp($rid)}]..  
4d20: 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 09 72 65 74    incr n..}..ret
4d30: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  urn.    }..    p
4d40: 72 6f 63 20 46 69 6e 64 42 65 73 74 42 72 65 61  roc FindBestBrea
4d50: 6b 20 7b 72 61 6e 67 65 7d 20 7b 0a 09 75 70 76  k {range} {..upv
4d60: 61 72 20 31 20 63 72 6f 73 73 20 63 72 6f 73 73  ar 1 cross cross
4d70: 20 64 65 6c 74 61 20 64 65 6c 74 61 0a 0a 09 23   delta delta...#
4d80: 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62   Determine the b
4d90: 65 73 74 20 62 72 65 61 6b 20 6c 6f 63 61 74 69  est break locati
4da0: 6f 6e 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20  on in the given 
4db0: 72 61 6e 67 65 20 6f 66 0a 09 23 20 70 6f 73 69  range of..# posi
4dc0: 74 69 6f 6e 73 2e 20 46 69 72 73 74 20 77 65 20  tions. First we 
4dd0: 6c 6f 6f 6b 20 66 6f 72 20 74 68 65 20 6c 6f 63  look for the loc
4de0: 61 74 69 6f 6e 73 20 77 69 74 68 20 74 68 65 20  ations with the 
4df0: 6d 61 78 69 6d 61 6c 0a 09 23 20 6e 75 6d 62 65  maximal..# numbe
4e00: 72 20 6f 66 20 63 72 6f 73 73 69 6e 67 73 2e 20  r of crossings. 
4e10: 49 66 20 74 68 65 72 65 20 61 72 65 20 73 65 76  If there are sev
4e20: 65 72 61 6c 20 77 65 20 6c 6f 6f 6b 20 66 6f 72  eral we look for
4e30: 20 74 68 65 0a 09 23 20 73 68 6f 72 74 65 73 74   the..# shortest
4e40: 20 74 69 6d 65 20 69 6e 74 65 72 76 61 6c 20 61   time interval a
4e50: 6d 6f 6e 67 20 74 68 65 6d 2e 20 49 66 20 77 65  mong them. If we
4e60: 20 73 74 69 6c 6c 20 68 61 76 65 20 6d 75 6c 74   still have mult
4e70: 69 70 6c 65 0a 09 23 20 70 6f 73 73 69 62 69 6c  iple..# possibil
4e80: 69 74 69 65 73 20 61 66 74 65 72 20 74 68 61 74  ities after that
4e90: 20 77 65 20 73 65 6c 65 63 74 20 74 68 65 20 65   we select the e
4ea0: 61 72 6c 69 65 73 74 20 6c 6f 63 61 74 69 6f 6e  arliest location
4eb0: 0a 09 23 20 61 6d 6f 6e 67 20 74 68 65 73 65 2e  ..# among these.
4ec0: 0a 0a 09 23 20 4e 6f 74 65 3a 20 49 66 20 74 68  ...# Note: If th
4ed0: 65 20 6d 61 78 69 6d 61 6c 20 6e 75 6d 62 65 72  e maximal number
4ee0: 20 6f 66 20 63 72 6f 73 73 69 6e 67 73 20 69 73   of crossings is
4ef0: 20 30 20 74 68 65 6e 20 74 68 65 20 72 61 6e 67   0 then the rang
4f00: 65 0a 09 23 20 20 20 20 20 20 20 68 61 73 20 6e  e..#       has n
4f10: 6f 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e  o internal depen
4f20: 64 65 6e 63 69 65 73 2c 20 61 6e 64 20 6e 6f 20  dencies, and no 
4f30: 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 61  break location a
4f40: 74 0a 09 23 20 20 20 20 20 20 20 61 6c 6c 2e 20  t..#       all. 
4f50: 54 68 69 73 20 70 6f 73 73 69 62 69 6c 69 74 79  This possibility
4f60: 20 69 73 20 73 69 67 6e 61 6c 65 64 20 76 69 61   is signaled via
4f70: 20 72 65 73 75 6c 74 20 2d 31 2e 0a 0a 09 23 20   result -1....# 
4f80: 4e 6f 74 65 3a 20 41 20 72 61 6e 67 65 20 6f 66  Note: A range of
4f90: 20 6c 65 6e 67 74 68 20 31 20 6f 72 20 6c 65 73   length 1 or les
4fa0: 73 20 63 61 6e 6e 6f 74 20 68 61 76 65 20 69 6e  s cannot have in
4fb0: 74 65 72 6e 61 6c 0a 09 23 20 20 20 20 20 20 20  ternal..#       
4fc0: 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73  dependencies, as
4fd0: 20 74 68 61 74 20 6e 65 65 64 73 20 61 74 20 6c   that needs at l
4fe0: 65 61 73 74 20 74 77 6f 20 72 65 76 69 73 69 6f  east two revisio
4ff0: 6e 73 20 69 6e 0a 09 23 20 20 20 20 20 20 20 74  ns in..#       t
5000: 68 65 20 72 61 6e 67 65 2e 0a 0a 09 69 66 20 7b  he range....if {
5010: 5b 6c 6c 65 6e 67 74 68 20 24 72 61 6e 67 65 5d  [llength $range]
5020: 20 3c 20 32 7d 20 7b 20 72 65 74 75 72 6e 20 2d   < 2} { return -
5030: 31 20 7d 0a 0a 09 73 65 74 20 6d 61 78 20 2d 31  1 }...set max -1
5040: 0a 09 73 65 74 20 62 65 73 74 20 7b 7d 0a 0a 09  ..set best {}...
5050: 66 6f 72 65 61 63 68 20 6c 6f 63 61 74 69 6f 6e  foreach location
5060: 20 24 72 61 6e 67 65 20 7b 0a 09 20 20 20 20 73   $range {..    s
5070: 65 74 20 63 72 6f 73 73 69 6e 67 73 20 24 63 72  et crossings $cr
5080: 6f 73 73 28 24 6c 6f 63 61 74 69 6f 6e 29 0a 09  oss($location)..
5090: 20 20 20 20 69 66 20 7b 24 63 72 6f 73 73 69 6e      if {$crossin
50a0: 67 73 20 3e 20 24 6d 61 78 7d 20 7b 0a 09 09 73  gs > $max} {...s
50b0: 65 74 20 6d 61 78 20 20 24 63 72 6f 73 73 69 6e  et max  $crossin
50c0: 67 73 0a 09 09 73 65 74 20 62 65 73 74 20 5b 6c  gs...set best [l
50d0: 69 73 74 20 24 6c 6f 63 61 74 69 6f 6e 5d 0a 09  ist $location]..
50e0: 09 63 6f 6e 74 69 6e 75 65 0a 09 20 20 20 20 7d  .continue..    }
50f0: 20 65 6c 73 65 69 66 20 7b 24 63 72 6f 73 73 69   elseif {$crossi
5100: 6e 67 73 20 3d 3d 20 24 6d 61 78 7d 20 7b 0a 09  ngs == $max} {..
5110: 09 6c 61 70 70 65 6e 64 20 62 65 73 74 20 24 6c  .lappend best $l
5120: 6f 63 61 74 69 6f 6e 0a 09 20 20 20 20 7d 0a 09  ocation..    }..
5130: 7d 0a 0a 09 69 66 20 7b 24 6d 61 78 20 3d 3d 20  }...if {$max == 
5140: 30 7d 20 20 20 20 20 20 20 20 20 20 20 20 7b 20  0}            { 
5150: 72 65 74 75 72 6e 20 2d 31 20 7d 0a 09 69 66 20  return -1 }..if 
5160: 7b 5b 6c 6c 65 6e 67 74 68 20 24 62 65 73 74 5d  {[llength $best]
5170: 20 3d 3d 20 31 7d 20 7b 20 72 65 74 75 72 6e 20   == 1} { return 
5180: 5b 6c 69 6e 64 65 78 20 24 62 65 73 74 20 30 5d  [lindex $best 0]
5190: 20 7d 0a 0a 09 73 65 74 20 6c 6f 63 61 74 69 6f   }...set locatio
51a0: 6e 73 20 24 62 65 73 74 0a 09 73 65 74 20 62 65  ns $best..set be
51b0: 73 74 20 7b 7d 0a 09 73 65 74 20 6d 69 6e 20 2d  st {}..set min -
51c0: 31 0a 0a 09 66 6f 72 65 61 63 68 20 6c 6f 63 61  1...foreach loca
51d0: 74 69 6f 6e 20 24 6c 6f 63 61 74 69 6f 6e 73 20  tion $locations 
51e0: 7b 0a 09 20 20 20 20 73 65 74 20 69 6e 74 65 72  {..    set inter
51f0: 76 61 6c 20 24 64 65 6c 74 61 28 24 6c 6f 63 61  val $delta($loca
5200: 74 69 6f 6e 29 0a 09 20 20 20 20 69 66 20 7b 28  tion)..    if {(
5210: 24 6d 69 6e 20 3c 20 30 29 20 7c 7c 20 28 24 69  $min < 0) || ($i
5220: 6e 74 65 72 76 61 6c 20 3c 20 24 6d 69 6e 29 7d  nterval < $min)}
5230: 20 7b 0a 09 09 73 65 74 20 6d 69 6e 20 20 24 69   {...set min  $i
5240: 6e 74 65 72 76 61 6c 0a 09 09 73 65 74 20 62 65  nterval...set be
5250: 73 74 20 5b 6c 69 73 74 20 24 6c 6f 63 61 74 69  st [list $locati
5260: 6f 6e 5d 0a 09 20 20 20 20 7d 20 65 6c 73 65 69  on]..    } elsei
5270: 66 20 7b 24 69 6e 74 65 72 76 61 6c 20 3d 3d 20  f {$interval == 
5280: 24 6d 69 6e 7d 20 7b 0a 09 09 6c 61 70 70 65 6e  $min} {...lappen
5290: 64 20 62 65 73 74 20 24 6c 6f 63 61 74 69 6f 6e  d best $location
52a0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 20  ..    }..}...if 
52b0: 7b 5b 6c 6c 65 6e 67 74 68 20 24 62 65 73 74 5d  {[llength $best]
52c0: 20 3d 3d 20 31 7d 20 7b 20 72 65 74 75 72 6e 20   == 1} { return 
52d0: 5b 6c 69 6e 64 65 78 20 24 62 65 73 74 20 30 5d  [lindex $best 0]
52e0: 20 7d 0a 0a 09 72 65 74 75 72 6e 20 5b 6c 69 6e   }...return [lin
52f0: 64 65 78 20 5b 6c 73 6f 72 74 20 2d 69 6e 74 65  dex [lsort -inte
5300: 67 65 72 20 2d 69 6e 63 72 65 61 73 69 6e 67 20  ger -increasing 
5310: 24 62 65 73 74 5d 20 30 5d 0a 20 20 20 20 7d 0a  $best] 0].    }.
5320: 0a 20 20 20 20 70 72 6f 63 20 43 75 74 41 74 20  .    proc CutAt 
5330: 7b 6c 6f 63 61 74 69 6f 6e 7d 20 7b 0a 09 75 70  {location} {..up
5340: 76 61 72 20 31 20 63 72 6f 73 73 20 63 72 6f 73  var 1 cross cros
5350: 73 20 64 65 70 63 20 64 65 70 63 0a 0a 09 23 20  s depc depc...# 
5360: 49 74 20 77 61 73 20 64 65 63 69 64 65 64 20 74  It was decided t
5370: 6f 20 73 70 6c 69 74 20 74 68 65 20 63 68 61 6e  o split the chan
5380: 67 65 73 65 74 20 61 74 20 74 68 65 20 67 69 76  geset at the giv
5390: 65 6e 0a 09 23 20 6c 6f 63 61 74 69 6f 6e 2e 20  en..# location. 
53a0: 54 68 69 73 20 63 75 74 73 20 61 20 6e 75 6d 62  This cuts a numb
53b0: 65 72 20 6f 66 20 64 65 70 65 6e 64 65 6e 63 69  er of dependenci
53c0: 65 73 2e 20 48 65 72 65 20 77 65 20 75 70 64 61  es. Here we upda
53d0: 74 65 0a 09 23 20 74 68 65 20 63 72 6f 73 73 20  te..# the cross 
53e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74  information so t
53f0: 68 61 74 20 74 68 65 20 62 72 65 61 6b 20 66 69  hat the break fi
5400: 6e 64 65 72 20 68 61 73 20 61 63 63 75 72 61 74  nder has accurat
5410: 65 0a 09 23 20 64 61 74 61 20 77 68 65 6e 20 77  e..# data when w
5420: 65 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20 67 65  e look at the ge
5430: 6e 65 72 61 74 65 64 20 66 72 61 67 6d 65 6e 74  nerated fragment
5440: 73 2e 0a 0a 09 73 65 74 20 73 69 78 20 5b 6c 6f  s....set six [lo
5450: 67 20 76 69 73 69 62 6c 65 3f 20 36 5d 0a 0a 09  g visible? 6]...
5460: 66 6f 72 65 61 63 68 20 7b 64 65 70 20 72 61 6e  foreach {dep ran
5470: 67 65 7d 20 5b 61 72 72 61 79 20 67 65 74 20 64  ge} [array get d
5480: 65 70 63 5d 20 7b 0a 09 20 20 20 20 23 20 43 68  epc] {..    # Ch
5490: 65 63 6b 20 61 6c 6c 20 64 65 70 65 6e 64 65 6e  eck all dependen
54a0: 63 69 65 73 20 73 74 69 6c 6c 20 6b 6e 6f 77 6e  cies still known
54b0: 2c 20 74 61 6b 65 20 74 68 65 69 72 20 72 61 6e  , take their ran
54c0: 67 65 20 61 6e 64 0a 09 20 20 20 20 23 20 73 65  ge and..    # se
54d0: 65 20 69 66 20 74 68 65 20 62 72 65 61 6b 20 6c  e if the break l
54e0: 6f 63 61 74 69 6f 6e 20 66 61 6c 6c 73 20 77 69  ocation falls wi
54f0: 74 68 69 6e 2e 0a 0a 09 20 20 20 20 42 6f 72 64  thin....    Bord
5500: 65 72 20 24 72 61 6e 67 65 20 73 20 65 0a 09 20  er $range s e.. 
5510: 20 20 20 69 66 20 7b 24 6c 6f 63 61 74 69 6f 6e     if {$location
5520: 20 3c 20 24 73 7d 20 63 6f 6e 74 69 6e 75 65 20   < $s} continue 
5530: 3b 20 23 20 62 72 65 61 6b 20 62 65 66 6f 72 65  ; # break before
5540: 20 72 61 6e 67 65 2c 20 69 67 6e 6f 72 65 0a 09   range, ignore..
5550: 20 20 20 20 69 66 20 7b 24 6c 6f 63 61 74 69 6f      if {$locatio
5560: 6e 20 3e 20 24 65 7d 20 63 6f 6e 74 69 6e 75 65  n > $e} continue
5570: 20 3b 20 23 20 62 72 65 61 6b 20 61 66 74 65 72   ; # break after
5580: 20 72 61 6e 67 65 2c 20 69 67 6e 6f 72 65 2e 0a   range, ignore..
5590: 0a 09 20 20 20 20 23 20 54 68 69 73 20 64 65 70  ..    # This dep
55a0: 65 6e 64 65 6e 63 79 20 63 72 6f 73 73 65 73 20  endency crosses 
55b0: 74 68 65 20 62 72 65 61 6b 20 6c 6f 63 61 74 69  the break locati
55c0: 6f 6e 2e 20 57 65 20 72 65 6d 6f 76 65 20 69 74  on. We remove it
55d0: 0a 09 20 20 20 20 23 20 66 72 6f 6d 20 74 68 65  ..    # from the
55e0: 20 63 72 6f 73 73 69 6e 67 73 20 63 6f 75 6e 74   crossings count
55f0: 65 72 73 2c 20 61 6e 64 20 74 68 65 6e 20 61 6c  ers, and then al
5600: 73 6f 20 66 72 6f 6d 20 74 68 65 20 73 65 74 0a  so from the set.
5610: 09 20 20 20 20 23 20 6f 66 20 6b 6e 6f 77 6e 20  .    # of known 
5620: 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73  dependencies, as
5630: 20 77 65 20 61 72 65 20 64 6f 6e 65 20 77 69 74   we are done wit
5640: 68 20 69 74 2e 0a 0a 09 20 20 20 20 66 6f 72 65  h it....    fore
5650: 61 63 68 20 6c 6f 63 20 24 64 65 70 63 28 24 64  ach loc $depc($d
5660: 65 70 29 20 7b 20 69 6e 63 72 20 63 72 6f 73 73  ep) { incr cross
5670: 28 24 6c 6f 63 29 20 2d 31 20 7d 0a 09 20 20 20  ($loc) -1 }..   
5680: 20 75 6e 73 65 74 20 64 65 70 63 28 24 64 65 70   unset depc($dep
5690: 29 0a 0a 09 20 20 20 20 69 66 20 7b 21 24 73 69  )...    if {!$si
56a0: 78 7d 20 63 6f 6e 74 69 6e 75 65 0a 0a 09 20 20  x} continue...  
56b0: 20 20 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61    struct::list a
56c0: 73 73 69 67 6e 20 24 64 65 70 20 70 61 72 65 6e  ssign $dep paren
56d0: 74 20 63 68 69 6c 64 0a 09 20 20 20 20 6c 6f 67  t child..    log
56e0: 20 77 72 69 74 65 20 35 20 63 73 65 74 73 20 22   write 5 csets "
56f0: 42 72 6f 6b 65 20 64 65 70 65 6e 64 65 6e 63 79  Broke dependency
5700: 20 5b 50 44 20 24 70 61 72 65 6e 74 5d 20 2d 2d   [PD $parent] --
5710: 3e 20 5b 50 44 20 24 63 68 69 6c 64 5d 22 0a 09  > [PD $child]"..
5720: 7d 0a 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d  }...return.    }
5730: 0a 0a 20 20 20 20 23 20 50 72 69 6e 74 20 69 64  ..    # Print id
5740: 65 6e 74 69 66 79 69 6e 67 20 64 61 74 61 20 66  entifying data f
5750: 6f 72 20 61 20 72 65 76 69 73 69 6f 6e 20 28 70  or a revision (p
5760: 72 6f 6a 65 63 74 2c 20 66 69 6c 65 2c 20 64 6f  roject, file, do
5770: 74 74 65 64 20 72 65 76 0a 20 20 20 20 23 20 6e  tted rev.    # n
5780: 75 6d 62 65 72 29 2c 20 66 6f 72 20 68 69 67 68  umber), for high
5790: 20 76 65 72 62 6f 73 69 74 79 20 6c 6f 67 20 6f   verbosity log o
57a0: 75 74 70 75 74 2e 0a 0a 20 20 20 20 70 72 6f 63  utput...    proc
57b0: 20 50 44 20 7b 69 64 7d 20 7b 0a 09 66 6f 72 65   PD {id} {..fore
57c0: 61 63 68 20 7b 70 20 66 20 72 7d 20 5b 73 74 61  ach {p f r} [sta
57d0: 74 65 20 72 75 6e 20 7b 0a 09 09 53 45 4c 45 43  te run {...SELEC
57e0: 54 20 50 2e 6e 61 6d 65 20 2c 20 46 2e 6e 61 6d  T P.name , F.nam
57f0: 65 2c 20 52 2e 72 65 76 0a 09 09 46 52 4f 4d 20  e, R.rev...FROM 
5800: 72 65 76 69 73 69 6f 6e 20 52 2c 20 66 69 6c 65  revision R, file
5810: 20 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09 09   F, project P...
5820: 57 48 45 52 45 20 52 2e 72 69 64 20 3d 20 24 69  WHERE R.rid = $i
5830: 64 0a 09 09 41 4e 44 20 20 20 52 2e 66 69 64 20  d...AND   R.fid 
5840: 3d 20 46 2e 66 69 64 0a 09 09 41 4e 44 20 20 20  = F.fid...AND   
5850: 46 2e 70 69 64 20 3d 20 50 2e 70 69 64 0a 09 7d  F.pid = P.pid..}
5860: 5d 20 62 72 65 61 6b 0a 09 72 65 74 75 72 6e 20  ] break..return 
5870: 22 27 24 70 20 3a 20 24 66 2f 24 72 27 22 0a 20  "'$p : $f/$r'". 
5880: 20 20 20 7d 0a 0a 20 20 20 20 23 20 50 72 69 6e     }..    # Prin
5890: 74 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 65  ting one or more
58a0: 20 72 61 6e 67 65 73 2c 20 66 6f 72 6d 61 74 74   ranges, formatt
58b0: 65 64 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65  ed, and only the
58c0: 69 72 20 62 6f 72 64 65 72 20 74 6f 0a 20 20 20  ir border to.   
58d0: 20 23 20 6b 65 65 70 20 74 68 65 20 73 74 72 69   # keep the stri
58e0: 6e 67 73 20 73 68 6f 72 74 2e 0a 0a 20 20 20 20  ngs short...    
58f0: 70 72 6f 63 20 50 52 73 20 7b 72 61 6e 67 65 73  proc PRs {ranges
5900: 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b 73 74 72  } {..return [str
5910: 75 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20 24 72  uct::list map $r
5920: 61 6e 67 65 73 20 5b 6d 79 70 72 6f 63 20 50 52  anges [myproc PR
5930: 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72  ]].    }..    pr
5940: 6f 63 20 50 52 20 7b 72 61 6e 67 65 7d 20 7b 0a  oc PR {range} {.
5950: 09 42 6f 72 64 65 72 20 24 72 61 6e 67 65 20 73  .Border $range s
5960: 20 65 0a 09 72 65 74 75 72 6e 20 3c 24 7b 73 7d   e..return <${s}
5970: 2e 2e 2e 24 7b 65 7d 3e 0a 20 20 20 20 7d 0a 0a  ...${e}>.    }..
5980: 20 20 20 20 70 72 6f 63 20 42 6f 72 64 65 72 20      proc Border 
5990: 7b 72 61 6e 67 65 20 73 76 20 65 76 7d 20 7b 0a  {range sv ev} {.
59a0: 09 75 70 76 61 72 20 31 20 24 73 76 20 73 20 24  .upvar 1 $sv s $
59b0: 65 76 20 65 0a 09 73 65 74 20 73 20 5b 6c 69 6e  ev e..set s [lin
59c0: 64 65 78 20 24 72 61 6e 67 65 20 30 5d 0a 09 73  dex $range 0]..s
59d0: 65 74 20 65 20 5b 6c 69 6e 64 65 78 20 24 72 61  et e [lindex $ra
59e0: 6e 67 65 20 65 6e 64 5d 0a 09 72 65 74 75 72 6e  nge end]..return
59f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20  .    }..    # # 
5a00: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
5a10: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
5a20: 23 23 23 0a 0a 20 20 20 20 74 79 70 65 76 61 72  ###..    typevar
5a30: 69 61 62 6c 65 20 6d 79 63 68 61 6e 67 65 73 65  iable mychangese
5a40: 74 73 20 20 20 20 20 7b 7d 20 3b 20 23 20 4c 69  ts     {} ; # Li
5a50: 73 74 20 6f 66 20 61 6c 6c 20 6b 6e 6f 77 6e 20  st of all known 
5a60: 63 68 61 6e 67 65 73 65 74 73 2e 0a 20 20 20 20  changesets..    
5a70: 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 69  typevariable myi
5a80: 74 65 6d 6d 61 70 20 2d 61 72 72 61 79 20 7b 7d  temmap -array {}
5a90: 20 3b 20 23 20 4d 61 70 20 66 72 6f 6d 20 69 74   ; # Map from it
5aa0: 65 6d 73 20 28 74 61 67 67 65 64 29 20 74 6f 0a  ems (tagged) to.
5ab0: 09 09 09 09 20 20 20 20 20 20 20 23 20 74 68 65  ....       # the
5ac0: 20 6c 69 73 74 20 6f 66 20 63 68 61 6e 67 65 73   list of changes
5ad0: 65 74 73 0a 09 09 09 09 20 20 20 20 20 20 20 23  ets.....       #
5ae0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 69 74 2e 20   containing it. 
5af0: 45 61 63 68 20 69 74 65 6d 20 63 61 6e 0a 09 09  Each item can...
5b00: 09 09 20 20 20 20 20 20 20 23 20 62 65 20 75 73  ..       # be us
5b10: 65 64 20 62 79 20 6f 6e 6c 79 20 6f 6e 65 0a 09  ed by only one..
5b20: 09 09 09 20 20 20 20 20 20 20 23 20 63 68 61 6e  ...       # chan
5b30: 67 65 73 65 74 2e 0a 20 20 20 20 74 79 70 65 76  geset..    typev
5b40: 61 72 69 61 62 6c 65 20 6d 79 69 64 6d 61 70 20  ariable myidmap 
5b50: 20 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20    -array {} ; # 
5b60: 4d 61 70 20 66 72 6f 6d 20 63 68 61 6e 67 65 73  Map from changes
5b70: 65 74 20 69 64 20 74 6f 0a 09 09 09 09 20 20 20  et id to.....   
5b80: 20 20 20 20 23 20 63 68 61 6e 67 65 73 65 74 2e      # changeset.
5b90: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ..    typemethod
5ba0: 20 61 6c 6c 20 20 20 20 7b 7d 20 20 20 20 7b 20   all    {}    { 
5bb0: 72 65 74 75 72 6e 20 24 6d 79 63 68 61 6e 67 65  return $mychange
5bc0: 73 65 74 73 20 7d 0a 20 20 20 20 74 79 70 65 6d  sets }.    typem
5bd0: 65 74 68 6f 64 20 6f 66 20 20 20 20 20 7b 63 69  ethod of     {ci
5be0: 64 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69  d} { return $myi
5bf0: 64 6d 61 70 28 24 63 69 64 29 20 7d 0a 20 20 20  dmap($cid) }.   
5c00: 20 74 79 70 65 6d 65 74 68 6f 64 20 6f 66 69 74   typemethod ofit
5c10: 65 6d 20 7b 69 69 64 7d 20 7b 20 72 65 74 75 72  em {iid} { retur
5c20: 6e 20 24 6d 79 69 74 65 6d 6d 61 70 28 24 69 69  n $myitemmap($ii
5c30: 64 29 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23  d) }..    # # ##
5c40: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23   ### ##### #####
5c50: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
5c60: 23 0a 20 20 20 20 23 23 20 43 6f 6e 66 69 67 75  #.    ## Configu
5c70: 72 61 74 69 6f 6e 0a 0a 20 20 20 20 70 72 61 67  ration..    prag
5c80: 6d 61 20 2d 68 61 73 74 79 70 65 69 6e 66 6f 20  ma -hastypeinfo 
5c90: 20 20 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 74 79     no  ; # no ty
5ca0: 70 65 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e  pe introspection
5cb0: 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73  .    pragma -has
5cc0: 69 6e 66 6f 20 20 20 20 20 20 20 20 6e 6f 20 20  info        no  
5cd0: 3b 20 23 20 6e 6f 20 6f 62 6a 65 63 74 20 69 6e  ; # no object in
5ce0: 74 72 6f 73 70 65 63 74 69 6f 6e 0a 0a 20 20 20  trospection..   
5cf0: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23   # # ## ### ####
5d00: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
5d10: 23 23 23 23 23 23 23 23 0a 7d 0a 0a 23 23 0a 23  ########.}..##.#
5d20: 23 20 4e 4f 54 45 3a 20 54 68 65 20 73 75 63 63  # NOTE: The succ
5d30: 65 73 73 6f 72 20 61 6e 64 20 70 72 65 64 65 63  essor and predec
5d40: 65 73 73 6f 72 20 6d 65 74 68 6f 64 73 20 64 65  essor methods de
5d50: 66 69 6e 65 64 20 62 79 20 74 68 65 20 63 6c 61  fined by the cla
5d60: 73 73 65 73 0a 23 23 20 20 20 20 20 20 20 62 65  sses.##       be
5d70: 6c 6f 77 20 61 72 65 20 2d 2d 20 62 6f 74 74 6c  low are -- bottl
5d80: 65 20 6e 65 63 6b 73 20 2d 2d 2e 20 4c 6f 6f 6b  e necks --. Look
5d90: 20 66 6f 72 20 77 61 79 73 20 74 6f 20 6d 61 6b   for ways to mak
5da0: 65 20 74 68 65 20 53 51 4c 0a 23 23 20 20 20 20  e the SQL.##    
5db0: 20 20 20 66 61 73 74 65 72 2e 0a 23 23 0a 0a 23     faster..##..#
5dc0: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20   # ## ### ##### 
5dd0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
5de0: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
5df0: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20  ############.## 
5e00: 48 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e  Helper singleton
5e10: 2e 20 43 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 72  . Commands for r
5e20: 65 76 69 73 69 6f 6e 20 63 68 61 6e 67 65 73 65  evision changese
5e30: 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20  ts...snit::type 
5e40: 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d  ::vc::fossil::im
5e50: 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65  port::cvs::proje
5e60: 63 74 3a 3a 72 65 76 3a 3a 72 65 76 20 7b 0a 20  ct::rev::rev {. 
5e70: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79     typemethod by
5e80: 72 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65  revision {} { re
5e90: 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 79 70  turn 1 }.    typ
5ea0: 65 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c  emethod bysymbol
5eb0: 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30     {} { return 0
5ec0: 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f   }.    typemetho
5ed0: 64 20 69 73 74 61 67 20 20 20 20 20 20 7b 7d 20  d istag      {} 
5ee0: 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20 20  { return 0 }.   
5ef0: 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73 62 72   typemethod isbr
5f00: 61 6e 63 68 20 20 20 7b 7d 20 7b 20 72 65 74 75  anch   {} { retu
5f10: 72 6e 20 30 20 7d 0a 0a 20 20 20 20 74 79 70 65  rn 0 }..    type
5f20: 6d 65 74 68 6f 64 20 73 74 72 20 7b 72 65 76 69  method str {revi
5f30: 73 69 6f 6e 7d 20 7b 0a 09 73 74 72 75 63 74 3a  sion} {..struct:
5f40: 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b 73 74  :list assign [st
5f50: 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 53  ate run {..    S
5f60: 45 4c 45 43 54 20 52 2e 72 65 76 2c 20 46 2e 6e  ELECT R.rev, F.n
5f70: 61 6d 65 2c 20 50 2e 6e 61 6d 65 0a 09 20 20 20  ame, P.name..   
5f80: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
5f90: 20 52 2c 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a   R, file F, proj
5fa0: 65 63 74 20 50 0a 09 20 20 20 20 57 48 45 52 45  ect P..    WHERE
5fb0: 20 20 52 2e 72 69 64 20 3d 20 24 72 65 76 69 73    R.rid = $revis
5fc0: 69 6f 6e 0a 09 20 20 20 20 41 4e 44 20 20 20 20  ion..    AND    
5fd0: 46 2e 66 69 64 20 3d 20 52 2e 66 69 64 0a 09 20  F.fid = R.fid.. 
5fe0: 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69 64 20     AND    P.pid 
5ff0: 3d 20 46 2e 70 69 64 0a 09 7d 5d 20 72 65 76 6e  = F.pid..}] revn
6000: 72 20 66 6e 61 6d 65 20 70 6e 61 6d 65 0a 09 72  r fname pname..r
6010: 65 74 75 72 6e 20 22 24 70 6e 61 6d 65 2f 24 7b  eturn "$pname/${
6020: 72 65 76 6e 72 7d 3a 3a 24 66 6e 61 6d 65 22 0a  revnr}::$fname".
6030: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73      }..    # res
6040: 75 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69 6e 74  ult = list (mint
6050: 69 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a 20 20  ime, maxtime).  
6060: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 74 69 6d    typemethod tim
6070: 65 72 61 6e 67 65 20 7b 69 74 65 6d 73 7d 20 7b  erange {items} {
6080: 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b  ..set theset ('[
6090: 6a 6f 69 6e 20 24 69 74 65 6d 73 20 7b 27 2c 27  join $items {','
60a0: 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74  }]')..return [st
60b0: 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20 53  ate run "..    S
60c0: 45 4c 45 43 54 20 4d 49 4e 28 52 2e 64 61 74 65  ELECT MIN(R.date
60d0: 29 2c 20 4d 41 58 28 52 2e 64 61 74 65 29 0a 09  ), MAX(R.date)..
60e0: 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f      FROM revisio
60f0: 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 52  n R..    WHERE R
6100: 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a  .rid IN $theset.
6110: 09 22 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  ."].    }..    #
6120: 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20   var(dv) = dict 
6130: 28 72 65 76 69 73 69 6f 6e 20 2d 3e 20 6c 69 73  (revision -> lis
6140: 74 20 28 72 65 76 69 73 69 6f 6e 29 29 0a 20 20  t (revision)).  
6150: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 6e 74    typemethod int
6160: 65 72 6e 61 6c 73 75 63 63 65 73 73 6f 72 73 20  ernalsuccessors 
6170: 7b 64 76 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b  {dv revisions} {
6180: 0a 09 75 70 76 61 72 20 31 20 24 64 76 20 64 65  ..upvar 1 $dv de
6190: 70 65 6e 64 65 6e 63 69 65 73 0a 09 73 65 74 20  pendencies..set 
61a0: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24  theset ('[join $
61b0: 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d  revisions {','}]
61c0: 27 29 0a 0a 09 23 20 53 65 65 20 27 73 75 63 63  ')...# See 'succ
61d0: 65 73 73 6f 72 73 27 20 62 65 6c 6f 77 20 66 6f  essors' below fo
61e0: 72 20 74 68 65 20 6d 61 69 6e 20 65 78 70 6c 61  r the main expla
61f0: 6e 61 74 69 6f 6e 20 6f 66 0a 09 23 20 74 68 65  nation of..# the
6200: 20 76 61 72 69 6f 75 73 20 63 61 73 65 73 2e 20   various cases. 
6210: 54 68 69 73 20 70 69 65 63 65 20 69 73 20 73 70  This piece is sp
6220: 65 63 69 61 6c 20 69 6e 20 74 68 61 74 20 69 74  ecial in that it
6230: 0a 09 23 20 72 65 73 74 72 69 63 74 73 20 74 68  ..# restricts th
6240: 65 20 73 75 63 63 65 73 73 6f 72 73 20 77 65 20  e successors we 
6250: 6c 6f 6f 6b 20 66 6f 72 20 74 6f 20 74 68 65 20  look for to the 
6260: 73 61 6d 65 20 73 65 74 20 6f 66 0a 09 23 20 72  same set of..# r
6270: 65 76 69 73 69 6f 6e 73 20 77 65 20 73 74 61 72  evisions we star
6280: 74 20 66 72 6f 6d 2e 20 53 65 6e 73 69 62 6c 65  t from. Sensible
6290: 20 61 73 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69   as we are looki
62a0: 6e 67 20 66 6f 72 0a 09 23 20 63 68 61 6e 67 65  ng for..# change
62b0: 73 65 74 20 69 6e 74 65 72 6e 61 6c 20 64 65 70  set internal dep
62c0: 65 6e 64 65 6e 63 69 65 73 2e 0a 0a 09 61 72 72  endencies....arr
62d0: 61 79 20 73 65 74 20 64 65 70 20 7b 7d 0a 0a 09  ay set dep {}...
62e0: 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68 69  foreach {rid chi
62f0: 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22  ld} [state run "
6300: 0a 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d 61  .   -- (1) Prima
6310: 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20 53 45  ry child..    SE
6320: 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63 68  LECT R.rid, R.ch
6330: 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  ild..    FROM   
6340: 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20  revision R..    
6350: 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49  WHERE  R.rid   I
6360: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d  N $theset     --
6370: 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76   Restrict to rev
6380: 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65  isions of intere
6390: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  st..    AND    R
63a0: 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55  .child IS NOT NU
63b0: 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69  LL    -- Has pri
63c0: 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20  mary child..    
63d0: 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49  AND    R.child I
63e0: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d  N $theset     --
63f0: 20 57 68 69 63 68 20 69 73 20 61 6c 73 6f 20 6f   Which is also o
6400: 66 20 69 6e 74 65 72 65 73 74 0a 20 20 20 20 55  f interest.    U
6410: 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32 29 20  NION.    -- (2) 
6420: 53 65 63 6f 6e 64 61 72 79 20 28 62 72 61 6e 63  Secondary (branc
6430: 68 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20  h) children..   
6440: 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 42   SELECT R.rid, B
6450: 2e 62 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20  .brid..    FROM 
6460: 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65    revision R, re
6470: 76 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c  visionbranchchil
6480: 64 72 65 6e 20 42 0a 09 20 20 20 20 57 48 45 52  dren B..    WHER
6490: 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74  E  R.rid   IN $t
64a0: 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73  heset     -- Res
64b0: 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f  trict to revisio
64c0: 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09  ns of interest..
64d0: 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72 69 64      AND    R.rid
64e0: 20 3d 20 42 2e 72 69 64 20 20 20 20 20 20 20 20   = B.rid        
64f0: 20 20 2d 2d 20 53 65 6c 65 63 74 20 73 75 62 73    -- Select subs
6500: 65 74 20 6f 66 20 62 72 61 6e 63 68 20 63 68 69  et of branch chi
6510: 6c 64 72 65 6e 0a 09 20 20 20 20 41 4e 44 20 20  ldren..    AND  
6520: 20 20 42 2e 62 72 69 64 20 49 4e 20 24 74 68 65    B.brid IN $the
6530: 73 65 74 20 20 20 20 20 20 2d 2d 20 57 68 69 63  set      -- Whic
6540: 68 20 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e 74  h is also of int
6550: 65 72 65 73 74 0a 20 20 20 20 55 4e 49 4f 4e 0a  erest.    UNION.
6560: 20 20 20 20 2d 2d 20 28 34 29 20 43 68 69 6c 64      -- (4) Child
6570: 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 20 73   of trunk root s
6580: 75 63 63 65 73 73 6f 72 20 6f 66 20 6c 61 73 74  uccessor of last
6590: 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b 2e 0a   NTDB on trunk..
65a0: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69  .    SELECT R.ri
65b0: 64 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20 20 20  d, RA.child..   
65c0: 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52   FROM revision R
65d0: 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 0a 09 20  , revision RA.. 
65e0: 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 20     WHERE R.rid  
65f0: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20   IN $theset     
6600: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
6610: 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74  revisions of int
6620: 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20  erest..    AND  
6630: 20 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20   R.isdefault    
6640: 20 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74           -- Rest
6650: 72 69 63 74 20 74 6f 20 4e 54 44 42 0a 09 20 20  rict to NTDB..  
6660: 20 20 41 4e 44 20 20 20 52 2e 64 62 63 68 69 6c    AND   R.dbchil
6670: 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  d IS NOT NULL   
6680: 2d 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 42  -- and last NTDB
6690: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72   belonging to tr
66a0: 75 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 52  unk..    AND   R
66b0: 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69 6c  A.rid = R.dbchil
66c0: 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 72  d      -- Go dir
66d0: 65 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 72  ectly to trunk r
66e0: 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 52  oot..    AND   R
66f0: 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e  A.child IS NOT N
6700: 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72  ULL    -- Has pr
6710: 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 20 20 20  imary child..   
6720: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 52           AND   R
6730: 41 2e 63 68 69 6c 64 20 49 4e 20 24 74 68 65 73  A.child IN $thes
6740: 65 74 20 20 20 20 20 2d 2d 20 57 68 69 63 68 20  et     -- Which 
6750: 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e 74 65 72  is also of inter
6760: 65 73 74 0a 09 22 5d 20 7b 0a 09 20 20 20 20 23  est.."] {..    #
6770: 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69 6e 67   Consider moving
6780: 20 74 68 69 73 20 74 6f 20 74 68 65 20 69 6e 74   this to the int
6790: 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e 0a 09  egrity module...
67a0: 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73      integrity as
67b0: 73 65 72 74 20 7b 24 72 69 64 20 21 3d 20 24 63  sert {$rid != $c
67c0: 68 69 6c 64 7d 20 7b 52 65 76 69 73 69 6f 6e 20  hild} {Revision 
67d0: 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f 6e 20  $rid depends on 
67e0: 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20 6c 61  itself.}..    la
67f0: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69  ppend dependenci
6800: 65 73 28 24 72 69 64 29 20 24 63 68 69 6c 64 0a  es($rid) $child.
6810: 09 20 20 20 20 73 65 74 20 64 65 70 28 24 72 69  .    set dep($ri
6820: 64 2c 24 63 68 69 6c 64 29 20 2e 0a 09 7d 0a 0a  d,$child) ...}..
6830: 09 23 20 54 68 65 20 73 71 6c 20 73 74 61 74 65  .# The sql state
6840: 6d 65 6e 74 73 20 61 62 6f 76 65 20 6c 6f 6f 6b  ments above look
6850: 73 20 6f 6e 6c 79 20 66 6f 72 20 64 69 72 65 63  s only for direc
6860: 74 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09  t dependencies..
6870: 23 20 62 65 74 77 65 65 6e 20 72 65 76 69 73 69  # between revisi
6880: 6f 6e 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65  on in the change
6890: 73 65 74 2e 20 48 6f 77 65 76 65 72 20 64 75 65  set. However due
68a0: 20 74 6f 20 74 68 65 0a 09 23 20 76 61 67 61 72   to the..# vagar
68b0: 69 65 73 20 6f 66 20 6d 65 74 61 20 64 61 74 61  ies of meta data
68c0: 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65 20   it is possible 
68d0: 66 6f 72 20 74 77 6f 20 72 65 76 69 73 69 6f 6e  for two revision
68e0: 73 20 6f 66 0a 09 23 20 74 68 65 20 73 61 6d 65  s of..# the same
68f0: 20 66 69 6c 65 20 74 6f 20 65 6e 64 20 75 70 20   file to end up 
6900: 69 6e 20 74 68 65 20 73 61 6d 65 20 63 68 61 6e  in the same chan
6910: 67 65 73 65 74 2c 20 77 69 74 68 6f 75 74 20 61  geset, without a
6920: 0a 09 23 20 64 69 72 65 63 74 20 64 65 70 65 6e  ..# direct depen
6930: 64 65 6e 63 79 20 62 65 74 77 65 65 6e 20 74 68  dency between th
6940: 65 6d 2e 20 48 6f 77 65 76 65 72 20 77 65 20 6b  em. However we k
6950: 6e 6f 77 20 74 68 61 74 20 74 68 65 72 65 0a 09  now that there..
6960: 23 20 68 61 73 20 74 6f 20 62 65 20 61 20 61 6e  # has to be a an
6970: 20 69 6e 64 69 72 65 63 74 20 64 65 70 65 6e 64   indirect depend
6980: 65 6e 63 79 2c 20 62 65 20 69 74 20 74 68 72 6f  ency, be it thro
6990: 75 67 68 20 70 72 69 6d 61 72 79 0a 09 23 20 63  ugh primary..# c
69a0: 68 69 6c 64 72 65 6e 2c 20 62 72 61 6e 63 68 20  hildren, branch 
69b0: 63 68 69 6c 64 72 65 6e 2c 20 6f 72 20 61 20 63  children, or a c
69c0: 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68 65 72 65  ombination there
69d0: 6f 66 2e 0a 0a 09 23 20 57 65 20 6e 6f 77 20 66  of....# We now f
69e0: 69 6c 6c 20 69 6e 20 74 68 65 73 65 20 70 73 65  ill in these pse
69f0: 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63 69 65 73  udo-dependencies
6a00: 2c 20 69 66 20 6e 6f 20 73 75 63 68 0a 09 23 20  , if no such..# 
6a10: 64 65 70 65 6e 64 65 6e 63 79 20 65 78 69 73 74  dependency exist
6a20: 73 20 61 6c 72 65 61 64 79 2e 20 54 68 65 20 64  s already. The d
6a30: 69 72 65 63 74 69 6f 6e 20 6f 66 20 74 68 65 20  irection of the 
6a40: 64 65 70 65 6e 64 65 6e 63 79 0a 09 23 20 69 73  dependency..# is
6a50: 20 61 63 74 75 61 6c 6c 79 20 69 72 72 65 6c 65   actually irrele
6a60: 76 61 6e 74 20 66 6f 72 20 74 68 69 73 2e 0a 0a  vant for this...
6a70: 09 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 69 73  .# NOTE: This is
6a80: 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d 20   different from 
6a90: 63 76 73 32 73 76 6e 2e 20 4f 75 72 20 73 70 69  cvs2svn. Our spi
6aa0: 72 69 74 75 61 6c 20 61 6e 63 65 73 74 6f 72 0a  ritual ancestor.
6ab0: 09 23 20 64 6f 65 73 20 6e 6f 74 20 75 73 65 20  .# does not use 
6ac0: 73 75 63 68 20 70 73 65 75 64 6f 2d 64 65 70 65  such pseudo-depe
6ad0: 6e 64 65 6e 63 69 65 73 2c 20 68 6f 77 65 76 65  ndencies, howeve
6ae0: 72 20 69 74 20 75 73 65 73 20 61 0a 09 23 20 43  r it uses a..# C
6af0: 4f 4d 4d 49 54 5f 54 48 52 45 53 48 4f 4c 44 2c  OMMIT_THRESHOLD,
6b00: 20 61 20 74 69 6d 65 20 69 6e 74 65 72 76 61 6c   a time interval
6b10: 20 63 6f 6d 6d 69 74 73 20 73 68 6f 75 6c 64 20   commits should 
6b20: 66 61 6c 6c 2e 20 54 68 69 73 0a 09 23 20 77 69  fall. This..# wi
6b30: 6c 6c 20 67 72 65 61 74 6c 79 20 72 65 64 75 63  ll greatly reduc
6b40: 65 73 20 74 68 65 20 72 69 73 6b 20 6f 66 20 67  es the risk of g
6b50: 65 74 74 69 6e 67 20 66 61 72 20 73 65 70 61 72  etting far separ
6b60: 61 74 65 64 0a 09 23 20 72 65 76 69 73 69 6f 6e  ated..# revision
6b70: 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 66 69  s of the same fi
6b80: 6c 65 20 69 6e 74 6f 20 6f 6e 65 20 63 68 61 6e  le into one chan
6b90: 67 65 73 65 74 2e 0a 0a 09 23 20 57 65 20 61 6c  geset....# We al
6ba0: 6c 6f 77 20 72 65 76 69 73 69 6f 6e 73 20 74 6f  low revisions to
6bb0: 20 62 65 20 66 61 72 20 61 70 61 72 74 20 69 6e   be far apart in
6bc0: 20 74 69 6d 65 20 69 6e 20 74 68 65 20 73 61 6d   time in the sam
6bd0: 65 0a 09 23 20 63 68 61 6e 67 65 73 65 74 2c 20  e..# changeset, 
6be0: 62 75 74 20 6e 65 65 64 20 74 68 65 20 70 73 65  but need the pse
6bf0: 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63 69 65 73  udo-dependencies
6c00: 20 66 6f 72 20 74 68 69 73 2e 0a 0a 09 61 72 72   for this....arr
6c10: 61 79 20 73 65 74 20 66 69 64 73 20 7b 7d 0a 09  ay set fids {}..
6c20: 66 6f 72 65 61 63 68 20 7b 72 69 64 20 66 69 64  foreach {rid fid
6c30: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09  } [state run "..
6c40: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64      SELECT R.rid
6c50: 2c 20 52 2e 66 69 64 20 46 52 4f 4d 20 72 65 76  , R.fid FROM rev
6c60: 69 73 69 6f 6e 20 52 20 57 48 45 52 45 20 52 2e  ision R WHERE R.
6c70: 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09  rid IN $theset..
6c80: 22 5d 20 7b 20 6c 61 70 70 65 6e 64 20 66 69 64  "] { lappend fid
6c90: 73 28 24 66 69 64 29 20 24 72 69 64 20 7d 0a 0a  s($fid) $rid }..
6ca0: 09 66 6f 72 65 61 63 68 20 7b 66 69 64 20 72 69  .foreach {fid ri
6cb0: 64 73 7d 20 5b 61 72 72 61 79 20 67 65 74 20 66  ds} [array get f
6cc0: 69 64 73 5d 20 7b 0a 09 20 20 20 20 69 66 20 7b  ids] {..    if {
6cd0: 5b 6c 6c 65 6e 67 74 68 20 24 72 69 64 73 5d 20  [llength $rids] 
6ce0: 3c 20 32 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 20  < 2} continue.. 
6cf0: 20 20 20 66 6f 72 65 61 63 68 20 61 20 24 72 69     foreach a $ri
6d00: 64 73 20 7b 0a 09 09 66 6f 72 65 61 63 68 20 62  ds {...foreach b
6d10: 20 24 72 69 64 73 20 7b 0a 09 09 20 20 20 20 69   $rids {...    i
6d20: 66 20 7b 24 61 20 3d 3d 20 24 62 7d 20 63 6f 6e  f {$a == $b} con
6d30: 74 69 6e 75 65 0a 09 09 20 20 20 20 69 66 20 7b  tinue...    if {
6d40: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64 65 70  [info exists dep
6d50: 28 24 61 2c 24 62 29 5d 7d 20 63 6f 6e 74 69 6e  ($a,$b)]} contin
6d60: 75 65 0a 09 09 20 20 20 20 69 66 20 7b 5b 69 6e  ue...    if {[in
6d70: 66 6f 20 65 78 69 73 74 73 20 64 65 70 28 24 62  fo exists dep($b
6d80: 2c 24 61 29 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a  ,$a)]} continue.
6d90: 09 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65  ..    lappend de
6da0: 70 65 6e 64 65 6e 63 69 65 73 28 24 61 29 20 24  pendencies($a) $
6db0: 62 0a 09 09 20 20 20 20 73 65 74 20 64 65 70 28  b...    set dep(
6dc0: 24 61 2c 24 62 29 20 2e 0a 09 09 20 20 20 20 73  $a,$b) ....    s
6dd0: 65 74 20 64 65 70 28 24 62 2c 24 61 29 20 2e 0a  et dep($b,$a) ..
6de0: 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72  ..}..    }..}..r
6df0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
6e00: 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 63   # var(dv) = dic
6e10: 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20  t (item -> list 
6e20: 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d  (item)), item  =
6e30: 20 6c 69 73 74 20 28 74 79 70 65 20 69 64 29 0a   list (type id).
6e40: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 73      typemethod s
6e50: 75 63 63 65 73 73 6f 72 73 20 7b 64 76 20 72 65  uccessors {dv re
6e60: 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61  visions} {..upva
6e70: 72 20 31 20 24 64 76 20 64 65 70 65 6e 64 65 6e  r 1 $dv dependen
6e80: 63 69 65 73 0a 09 73 65 74 20 74 68 65 73 65 74  cies..set theset
6e90: 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69   ('[join $revisi
6ea0: 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 23  ons {','}]')...#
6eb0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
6ec0: 61 73 65 73 20 73 70 65 63 69 66 79 20 77 68 65  ases specify whe
6ed0: 6e 20 61 20 72 65 76 69 73 69 6f 6e 20 53 20 69  n a revision S i
6ee0: 73 20 61 20 73 75 63 63 65 73 73 6f 72 0a 09 23  s a successor..#
6ef0: 20 6f 66 20 61 20 72 65 76 69 73 69 6f 6e 20 52   of a revision R
6f00: 2e 20 45 61 63 68 20 6f 66 20 74 68 65 20 63 61  . Each of the ca
6f10: 73 65 73 20 74 72 61 6e 73 6c 61 74 65 73 20 69  ses translates i
6f20: 6e 74 6f 20 6f 6e 65 20 6f 66 0a 09 23 20 74 68  nto one of..# th
6f30: 65 20 62 72 61 6e 63 68 65 73 20 6f 66 20 74 68  e branches of th
6f40: 65 20 53 51 4c 20 55 4e 49 4f 4e 20 63 6f 6d 69  e SQL UNION comi
6f50: 6e 67 20 62 65 6c 6f 77 2e 0a 09 23 0a 09 23 20  ng below...#..# 
6f60: 28 31 29 20 53 20 63 61 6e 20 62 65 20 61 20 70  (1) S can be a p
6f70: 72 69 6d 61 72 79 20 63 68 69 6c 64 20 6f 66 20  rimary child of 
6f80: 52 2c 20 69 2e 65 2e 20 69 6e 20 74 68 65 20 73  R, i.e. in the s
6f90: 61 6d 65 20 4c 4f 44 2e 20 52 0a 09 23 20 20 20  ame LOD. R..#   
6fa0: 20 20 72 65 66 65 72 65 6e 63 65 73 20 53 20 64    references S d
6fb0: 69 72 65 63 74 6c 79 2e 20 52 2e 63 68 69 6c 64  irectly. R.child
6fc0: 20 3d 20 53 28 2e 72 69 64 29 2c 20 69 66 20 69   = S(.rid), if i
6fd0: 74 20 65 78 69 73 74 73 2e 0a 09 23 0a 09 23 20  t exists...#..# 
6fe0: 28 32 29 20 53 20 63 61 6e 20 62 65 20 61 20 73  (2) S can be a s
6ff0: 65 63 6f 6e 64 61 72 79 2c 20 69 2e 65 2e 20 62  econdary, i.e. b
7000: 72 61 6e 63 68 2c 20 63 68 69 6c 64 20 6f 66 20  ranch, child of 
7010: 52 2e 20 48 65 72 65 20 74 68 65 0a 09 23 20 20  R. Here the..#  
7020: 20 20 20 6c 69 6e 6b 20 69 73 20 6d 61 64 65 20     link is made 
7030: 74 68 72 6f 75 67 68 20 74 68 65 20 68 65 6c 70  through the help
7040: 65 72 20 74 61 62 6c 65 0a 09 23 20 20 20 20 20  er table..#     
7050: 52 45 56 49 53 49 4f 4e 42 52 41 4e 43 48 43 48  REVISIONBRANCHCH
7060: 49 4c 44 52 45 4e 2e 20 52 2e 72 69 64 20 2d 3e  ILDREN. R.rid ->
7070: 20 52 42 43 2e 72 69 64 2c 20 52 42 43 2e 62 72   RBC.rid, RBC.br
7080: 69 64 20 3d 0a 09 23 20 20 20 20 20 53 28 2e 72  id =..#     S(.r
7090: 69 64 29 0a 09 23 0a 09 23 20 28 33 29 20 4f 72  id)..#..# (3) Or
70a0: 69 67 69 6e 61 6c 6c 79 20 74 68 69 73 20 75 73  iginally this us
70b0: 65 20 63 61 73 65 20 64 65 66 69 6e 65 64 20 74  e case defined t
70c0: 68 65 20 72 6f 6f 74 20 6f 66 20 61 20 64 65 74  he root of a det
70d0: 61 63 68 65 64 0a 09 23 20 20 20 20 20 4e 54 44  ached..#     NTD
70e0: 42 20 61 73 20 74 68 65 20 73 75 63 63 65 73 73  B as the success
70f0: 6f 72 20 6f 66 20 74 68 65 20 74 72 75 6e 6b 20  or of the trunk 
7100: 72 6f 6f 74 2e 20 54 68 69 73 20 6c 65 61 64 73  root. This leads
7110: 20 74 6f 20 61 0a 09 23 20 20 20 20 20 62 61 64   to a..#     bad
7120: 20 74 61 6e 67 6c 65 20 6c 61 74 65 72 20 6f 6e   tangle later on
7130: 2e 20 57 69 74 68 20 61 20 64 65 74 61 63 68 65  . With a detache
7140: 64 20 4e 54 44 42 20 74 68 65 20 6f 72 69 67 69  d NTDB the origi
7150: 6e 61 6c 0a 09 23 20 20 20 20 20 74 72 75 6e 6b  nal..#     trunk
7160: 20 72 6f 6f 74 20 72 65 76 69 73 69 6f 6e 20 77   root revision w
7170: 61 73 20 72 65 6d 6f 76 65 64 20 61 73 20 69 72  as removed as ir
7180: 72 65 6c 65 76 61 6e 74 2c 20 61 6c 6c 6f 77 69  relevant, allowi
7190: 6e 67 0a 09 23 20 20 20 20 20 74 68 65 20 6e 6f  ng..#     the no
71a0: 6d 69 6e 61 6c 20 72 6f 6f 74 20 74 6f 20 62 65  minal root to be
71b0: 20 6c 61 74 65 72 20 69 6e 20 74 69 6d 65 20 74   later in time t
71c0: 68 61 6e 20 74 68 65 20 4e 54 44 42 0a 09 23 20  han the NTDB..# 
71d0: 20 20 20 20 72 6f 6f 74 2e 20 4e 6f 77 20 73 65      root. Now se
71e0: 74 74 69 6e 67 20 74 68 69 73 20 64 65 70 65 6e  tting this depen
71f0: 64 65 6e 63 79 20 77 69 6c 6c 20 62 65 20 62 61  dency will be ba
7200: 63 6b 77 61 72 64 20 69 6e 0a 09 23 20 20 20 20  ckward in..#    
7210: 20 74 69 6d 65 2e 20 52 45 4d 4f 56 45 44 2e 0a   time. REMOVED..
7220: 09 23 0a 09 23 20 28 34 29 20 49 66 20 52 20 69  .#..# (4) If R i
7230: 73 20 74 68 65 20 6c 61 73 74 20 6f 66 20 74 68  s the last of th
7240: 65 20 4e 54 44 42 20 72 65 76 69 73 69 6f 6e 73  e NTDB revisions
7250: 20 77 68 69 63 68 20 62 65 6c 6f 6e 67 20 74 6f   which belong to
7260: 0a 09 23 20 20 20 20 20 74 68 65 20 74 72 75 6e  ..#     the trun
7270: 6b 2c 20 74 68 65 6e 20 74 68 65 20 70 72 69 6d  k, then the prim
7280: 61 72 79 20 63 68 69 6c 64 20 6f 66 20 74 68 65  ary child of the
7290: 20 74 72 75 6e 6b 20 72 6f 6f 74 20 28 74 68 65   trunk root (the
72a0: 0a 09 23 20 20 20 20 20 27 31 2e 32 27 20 72 65  ..#     '1.2' re
72b0: 76 69 73 69 6f 6e 29 20 69 73 20 61 20 73 75 63  vision) is a suc
72c0: 63 65 73 73 6f 72 2c 20 69 66 20 69 74 20 65 78  cessor, if it ex
72d0: 69 73 74 73 2e 0a 0a 09 23 20 4e 6f 74 65 20 74  ists....# Note t
72e0: 68 61 74 20 74 68 65 20 62 72 61 6e 63 68 65 73  hat the branches
72f0: 20 73 70 61 77 6e 65 64 20 66 72 6f 6d 20 74 68   spawned from th
7300: 65 20 72 65 76 69 73 69 6f 6e 73 2c 20 61 6e 64  e revisions, and
7310: 20 74 68 65 0a 09 23 20 74 61 67 73 20 61 73 73   the..# tags ass
7320: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
7330: 6d 20 61 72 65 20 73 75 63 63 65 73 73 6f 72 73  m are successors
7340: 20 61 73 20 77 65 6c 6c 2e 0a 0a 09 66 6f 72 65   as well....fore
7350: 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 7d 20  ach {rid child} 
7360: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 20 20 20  [state run ".   
7370: 2d 2d 20 28 31 29 20 50 72 69 6d 61 72 79 20 63  -- (1) Primary c
7380: 68 69 6c 64 0a 09 20 20 20 20 53 45 4c 45 43 54  hild..    SELECT
7390: 20 52 2e 72 69 64 2c 20 52 2e 63 68 69 6c 64 0a   R.rid, R.child.
73a0: 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69  .    FROM   revi
73b0: 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52  sion R..    WHER
73c0: 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74  E  R.rid   IN $t
73d0: 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73  heset     -- Res
73e0: 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f  trict to revisio
73f0: 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09  ns of interest..
7400: 20 20 20 20 41 4e 44 20 20 20 20 52 2e 63 68 69      AND    R.chi
7410: 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20  ld IS NOT NULL  
7420: 20 20 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 79    -- Has primary
7430: 20 63 68 69 6c 64 0a 20 20 20 20 55 4e 49 4f 4e   child.    UNION
7440: 0a 20 20 20 20 2d 2d 20 28 32 29 20 53 65 63 6f  .    -- (2) Seco
7450: 6e 64 61 72 79 20 28 62 72 61 6e 63 68 29 20 63  ndary (branch) c
7460: 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 53 45 4c  hildren..    SEL
7470: 45 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 72 69  ECT R.rid, B.bri
7480: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65  d..    FROM   re
7490: 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69  vision R, revisi
74a0: 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64 72 65 6e  onbranchchildren
74b0: 20 42 0a 09 20 20 20 20 57 48 45 52 45 20 20 52   B..    WHERE  R
74c0: 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65  .rid   IN $these
74d0: 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63  t     -- Restric
74e0: 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f  t to revisions o
74f0: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20  f interest..    
7500: 41 4e 44 20 20 20 20 52 2e 72 69 64 20 3d 20 42  AND    R.rid = B
7510: 2e 72 69 64 20 20 20 20 20 20 20 20 20 20 2d 2d  .rid          --
7520: 20 53 65 6c 65 63 74 20 73 75 62 73 65 74 20 6f   Select subset o
7530: 66 20 62 72 61 6e 63 68 20 63 68 69 6c 64 72 65  f branch childre
7540: 6e 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20  n.    UNION.    
7550: 2d 2d 20 28 34 29 20 43 68 69 6c 64 20 6f 66 20  -- (4) Child of 
7560: 74 72 75 6e 6b 20 72 6f 6f 74 20 73 75 63 63 65  trunk root succe
7570: 73 73 6f 72 20 6f 66 20 6c 61 73 74 20 4e 54 44  ssor of last NTD
7580: 42 20 6f 6e 20 74 72 75 6e 6b 2e 0a 09 20 20 20  B on trunk...   
7590: 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52   SELECT R.rid, R
75a0: 41 2e 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f  A.child..    FRO
75b0: 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65  M revision R, re
75c0: 76 69 73 69 6f 6e 20 52 41 0a 09 20 20 20 20 57  vision RA..    W
75d0: 48 45 52 45 20 52 2e 72 69 64 20 20 20 49 4e 20  HERE R.rid   IN 
75e0: 24 74 68 65 73 65 74 20 20 20 20 20 20 2d 2d 20  $theset      -- 
75f0: 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69  Restrict to revi
7600: 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73  sions of interes
7610: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 52 2e 69  t..    AND   R.i
7620: 73 64 65 66 61 75 6c 74 20 20 20 20 20 20 20 20  sdefault        
7630: 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74       -- Restrict
7640: 20 74 6f 20 4e 54 44 42 0a 09 20 20 20 20 41 4e   to NTDB..    AN
7650: 44 20 20 20 52 2e 64 62 63 68 69 6c 64 20 49 53  D   R.dbchild IS
7660: 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d 20 61   NOT NULL   -- a
7670: 6e 64 20 6c 61 73 74 20 4e 54 44 42 20 62 65 6c  nd last NTDB bel
7680: 6f 6e 67 69 6e 67 20 74 6f 20 74 72 75 6e 6b 0a  onging to trunk.
7690: 09 20 20 20 20 41 4e 44 20 20 20 52 41 2e 72 69  .    AND   RA.ri
76a0: 64 20 3d 20 52 2e 64 62 63 68 69 6c 64 20 20 20  d = R.dbchild   
76b0: 20 20 20 2d 2d 20 47 6f 20 64 69 72 65 63 74 6c     -- Go directl
76c0: 79 20 74 6f 20 74 72 75 6e 6b 20 72 6f 6f 74 0a  y to trunk root.
76d0: 09 20 20 20 20 41 4e 44 20 20 20 52 41 2e 63 68  .    AND   RA.ch
76e0: 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  ild IS NOT NULL 
76f0: 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d 61 72     -- Has primar
7700: 79 20 63 68 69 6c 64 2e 0a 09 22 5d 20 7b 0a 09  y child..."] {..
7710: 20 20 20 20 23 20 43 6f 6e 73 69 64 65 72 20 6d      # Consider m
7720: 6f 76 69 6e 67 20 74 68 69 73 20 74 6f 20 74 68  oving this to th
7730: 65 20 69 6e 74 65 67 72 69 74 79 20 6d 6f 64 75  e integrity modu
7740: 6c 65 2e 0a 09 20 20 20 20 69 6e 74 65 67 72 69  le...    integri
7750: 74 79 20 61 73 73 65 72 74 20 7b 24 72 69 64 20  ty assert {$rid 
7760: 21 3d 20 24 63 68 69 6c 64 7d 20 7b 52 65 76 69  != $child} {Revi
7770: 73 69 6f 6e 20 24 72 69 64 20 64 65 70 65 6e 64  sion $rid depend
7780: 73 20 6f 6e 20 69 74 73 65 6c 66 2e 7d 0a 09 20  s on itself.}.. 
7790: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e     lappend depen
77a0: 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 65  dencies([list re
77b0: 76 20 24 72 69 64 5d 29 20 5b 6c 69 73 74 20 72  v $rid]) [list r
77c0: 65 76 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66  ev $child]..}..f
77d0: 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c  oreach {rid chil
77e0: 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a  d} [state run ".
77f0: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69  .    SELECT R.ri
7800: 64 2c 20 54 2e 74 69 64 0a 09 20 20 20 20 46 52  d, T.tid..    FR
7810: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c  OM   revision R,
7820: 20 74 61 67 20 54 0a 09 20 20 20 20 57 48 45 52   tag T..    WHER
7830: 45 20 20 52 2e 72 69 64 20 69 6e 20 24 74 68 65  E  R.rid in $the
7840: 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  set..    AND    
7850: 54 2e 72 65 76 20 3d 20 52 2e 72 69 64 0a 09 22  T.rev = R.rid.."
7860: 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64  ] {..    lappend
7870: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c   dependencies([l
7880: 69 73 74 20 72 65 76 20 24 72 69 64 5d 29 20 5b  ist rev $rid]) [
7890: 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 63  list sym::tag $c
78a0: 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65 61 63  hild]..}..foreac
78b0: 68 20 7b 72 69 64 20 63 68 69 6c 64 7d 20 5b 73  h {rid child} [s
78c0: 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20 20 20  tate run "..    
78d0: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 42 2e  SELECT R.rid, B.
78e0: 62 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  bid..    FROM   
78f0: 72 65 76 69 73 69 6f 6e 20 52 2c 20 62 72 61 6e  revision R, bran
7900: 63 68 20 42 0a 09 20 20 20 20 57 48 45 52 45 20  ch B..    WHERE 
7910: 20 52 2e 72 69 64 20 69 6e 20 24 74 68 65 73 65   R.rid in $these
7920: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e  t..    AND    B.
7930: 72 6f 6f 74 20 3d 20 52 2e 72 69 64 0a 09 22 5d  root = R.rid.."]
7940: 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20   {..    lappend 
7950: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69  dependencies([li
7960: 73 74 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c  st rev $rid]) [l
7970: 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20  ist sym::branch 
7980: 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 72 65 74 75  $child]..}..retu
7990: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  rn.    }..    # 
79a0: 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20 28  var(dv) = dict (
79b0: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74  item -> list (it
79c0: 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69  em)), item  = li
79d0: 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 20 20  st (type id).   
79e0: 20 74 79 70 65 6d 65 74 68 6f 64 20 70 72 65 64   typemethod pred
79f0: 65 63 65 73 73 6f 72 73 20 7b 64 76 20 72 65 76  ecessors {dv rev
7a00: 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72  isions} {..upvar
7a10: 20 31 20 24 64 76 20 64 65 70 65 6e 64 65 6e 63   1 $dv dependenc
7a20: 69 65 73 0a 09 73 65 74 20 74 68 65 73 65 74 20  ies..set theset 
7a30: 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f  ('[join $revisio
7a40: 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 23 20  ns {','}]')...# 
7a50: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  The following ca
7a60: 73 65 73 20 73 70 65 63 69 66 79 20 77 68 65 6e  ses specify when
7a70: 20 61 20 72 65 76 69 73 69 6f 6e 20 50 20 69 73   a revision P is
7a80: 20 61 0a 09 23 20 70 72 65 64 65 63 65 73 73 6f   a..# predecesso
7a90: 72 20 6f 66 20 61 20 72 65 76 69 73 69 6f 6e 20  r of a revision 
7aa0: 52 2e 20 45 61 63 68 20 6f 66 20 74 68 65 20 63  R. Each of the c
7ab0: 61 73 65 73 20 74 72 61 6e 73 6c 61 74 65 73 0a  ases translates.
7ac0: 09 23 20 69 6e 74 6f 20 6f 6e 65 20 6f 66 20 74  .# into one of t
7ad0: 68 65 20 62 72 61 6e 63 68 65 73 20 6f 66 20 74  he branches of t
7ae0: 68 65 20 53 51 4c 20 55 4e 49 4f 4e 20 63 6f 6d  he SQL UNION com
7af0: 69 6e 67 20 62 65 6c 6f 77 2e 0a 09 23 0a 09 23  ing below...#..#
7b00: 20 28 31 29 20 54 68 65 20 69 6d 6d 65 64 69 61   (1) The immedia
7b10: 74 65 20 70 61 72 65 6e 74 20 52 2e 70 61 72 65  te parent R.pare
7b20: 6e 74 20 6f 66 20 52 20 69 73 20 61 20 70 72 65  nt of R is a pre
7b30: 64 65 63 65 73 73 6f 72 20 6f 66 0a 09 23 20 20  decessor of..#  
7b40: 20 20 20 52 2e 20 4e 4f 54 45 3a 20 54 68 69 73     R. NOTE: This
7b50: 20 69 73 20 74 72 75 65 20 66 6f 72 20 52 20 65   is true for R e
7b60: 69 74 68 65 72 20 70 72 69 6d 61 72 79 20 6f 72  ither primary or
7b70: 20 73 65 63 6f 6e 64 61 72 79 0a 09 23 20 20 20   secondary..#   
7b80: 20 20 63 68 69 6c 64 20 6f 66 20 50 2e 20 49 74    child of P. It
7b90: 20 6e 6f 74 20 6e 65 63 65 73 73 61 72 79 20 74   not necessary t
7ba0: 6f 20 64 69 73 74 69 6e 67 75 69 73 68 20 74 68  o distinguish th
7bb0: 65 20 74 77 6f 0a 09 23 20 20 20 20 20 63 61 73  e two..#     cas
7bc0: 65 73 2c 20 69 6e 20 63 6f 6e 74 72 61 73 74 20  es, in contrast 
7bd0: 74 6f 20 74 68 65 20 63 6f 64 65 20 72 65 74 72  to the code retr
7be0: 69 65 76 69 6e 67 20 74 68 65 20 73 75 63 63 65  ieving the succe
7bf0: 73 73 6f 72 0a 09 23 20 20 20 20 20 69 6e 66 6f  ssor..#     info
7c00: 72 6d 61 74 69 6f 6e 2e 0a 09 23 0a 09 23 20 28  rmation...#..# (
7c10: 32 29 20 54 68 65 20 63 6f 6d 70 6c 65 6d 65 6e  2) The complemen
7c20: 74 20 6f 66 20 73 75 63 63 65 73 73 6f 72 20 63  t of successor c
7c30: 61 73 65 20 28 33 29 2e 20 54 68 65 20 74 72 75  ase (3). The tru
7c40: 6e 6b 20 72 6f 6f 74 20 69 73 0a 09 23 20 20 20  nk root is..#   
7c50: 20 20 61 20 70 72 65 64 65 63 65 73 73 6f 72 20    a predecessor 
7c60: 6f 66 20 61 20 4e 54 44 42 20 72 6f 6f 74 2e 20  of a NTDB root. 
7c70: 52 45 4d 4f 56 45 44 2e 20 53 65 65 20 27 73 75  REMOVED. See 'su
7c80: 63 63 65 73 73 6f 72 73 27 0a 09 23 20 20 20 20  ccessors'..#    
7c90: 20 66 6f 72 20 74 68 65 20 65 78 70 6c 61 6e 61   for the explana
7ca0: 74 69 6f 6e 2e 0a 09 23 0a 09 23 20 28 33 29 20  tion...#..# (3) 
7cb0: 54 68 65 20 63 6f 6d 70 6c 65 6d 65 6e 74 20 6f  The complement o
7cc0: 66 20 73 75 63 63 65 73 73 6f 72 20 63 61 73 65  f successor case
7cd0: 20 28 34 29 2e 20 54 68 65 20 6c 61 73 74 20 4e   (4). The last N
7ce0: 54 44 42 0a 09 23 20 20 20 20 20 72 65 76 69 73  TDB..#     revis
7cf0: 69 6f 6e 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f  ion belonging to
7d00: 20 74 68 65 20 74 72 75 6e 6b 20 69 73 20 61 20   the trunk is a 
7d10: 70 72 65 64 65 63 65 73 73 6f 72 20 6f 66 20 74  predecessor of t
7d20: 68 65 0a 09 23 20 20 20 20 20 70 72 69 6d 61 72  he..#     primar
7d30: 79 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20 74  y child of the t
7d40: 72 75 6e 6b 20 72 6f 6f 74 20 28 54 68 65 20 27  runk root (The '
7d50: 31 2e 32 27 20 72 65 76 69 73 69 6f 6e 29 2e 0a  1.2' revision)..
7d60: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 70  ..foreach {rid p
7d70: 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75  arent} [state ru
7d80: 6e 20 22 0a 20 20 20 2d 2d 20 28 31 29 20 50 72  n ".   -- (1) Pr
7d90: 69 6d 61 72 79 20 70 61 72 65 6e 74 2c 20 63 61  imary parent, ca
7da0: 6e 20 62 65 20 69 6e 20 64 69 66 66 65 72 65 6e  n be in differen
7db0: 74 20 4c 4f 44 20 66 6f 72 20 66 69 72 73 74 20  t LOD for first 
7dc0: 69 6e 20 61 20 62 72 61 6e 63 68 0a 09 20 20 20  in a branch..   
7dd0: 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52   SELECT R.rid, R
7de0: 2e 70 61 72 65 6e 74 0a 09 20 20 20 20 46 52 4f  .parent..    FRO
7df0: 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 09  M   revision R..
7e00: 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64      WHERE  R.rid
7e10: 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20     IN $theset   
7e20: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f    -- Restrict to
7e30: 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e   revisions of in
7e40: 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20  terest..    AND 
7e50: 20 20 20 52 2e 70 61 72 65 6e 74 20 49 53 20 4e     R.parent IS N
7e60: 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d 20 48 61 73  OT NULL   -- Has
7e70: 20 70 72 69 6d 61 72 79 20 70 61 72 65 6e 74 0a   primary parent.
7e80: 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d      UNION.    --
7e90: 20 28 33 29 20 4c 61 73 74 20 4e 54 44 42 20 6f   (3) Last NTDB o
7ea0: 6e 20 74 72 75 6e 6b 20 69 73 20 70 72 65 64 65  n trunk is prede
7eb0: 63 65 73 73 6f 72 20 6f 66 20 63 68 69 6c 64 20  cessor of child 
7ec0: 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20  of trunk root.. 
7ed0: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c     SELECT R.rid,
7ee0: 20 52 41 2e 64 62 70 61 72 65 6e 74 0a 09 20 20   RA.dbparent..  
7ef0: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f    FROM   revisio
7f00: 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 52 41  n R, revision RA
7f10: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72  ..    WHERE  R.r
7f20: 69 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20  id IN $theset   
7f30: 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63        -- Restric
7f40: 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f  t to revisions o
7f50: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20  f interest..    
7f60: 41 4e 44 20 20 20 20 4e 4f 54 20 52 2e 69 73 64  AND    NOT R.isd
7f70: 65 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20  efault          
7f80: 2d 2d 20 6e 6f 74 20 6f 6e 20 4e 54 44 42 0a 09  -- not on NTDB..
7f90: 20 20 20 20 41 4e 44 20 20 20 20 52 2e 70 61 72      AND    R.par
7fa0: 65 6e 74 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  ent IS NOT NULL 
7fb0: 20 20 20 20 2d 2d 20 77 68 69 63 68 20 61 72 65      -- which are
7fc0: 20 6e 6f 74 20 72 6f 6f 74 0a 09 20 20 20 20 41   not root..    A
7fd0: 4e 44 20 20 20 20 52 41 2e 72 69 64 20 3d 20 52  ND    RA.rid = R
7fe0: 2e 70 61 72 65 6e 74 20 20 20 20 20 20 20 20 2d  .parent        -
7ff0: 2d 20 67 6f 20 74 6f 20 74 68 65 69 72 20 70 61  - go to their pa
8000: 72 65 6e 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rent..    AND   
8010: 20 52 41 2e 64 62 70 61 72 65 6e 74 20 49 53 20   RA.dbparent IS 
8020: 4e 4f 54 20 4e 55 4c 4c 20 20 2d 2d 20 77 68 69  NOT NULL  -- whi
8030: 63 68 20 68 61 73 20 74 6f 20 72 65 66 65 72 20  ch has to refer 
8040: 74 6f 20 4e 54 44 42 27 73 20 72 6f 6f 74 0a 09  to NTDB's root..
8050: 22 5d 20 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73  "] {..    # Cons
8060: 69 64 65 72 20 6d 6f 76 69 6e 67 20 74 68 69 73  ider moving this
8070: 20 74 6f 20 74 68 65 20 69 6e 74 65 67 72 69 74   to the integrit
8080: 79 20 6d 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69  y module...    i
8090: 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20  ntegrity assert 
80a0: 7b 24 72 69 64 20 21 3d 20 24 70 61 72 65 6e 74  {$rid != $parent
80b0: 7d 20 7b 52 65 76 69 73 69 6f 6e 20 24 72 69 64  } {Revision $rid
80c0: 20 64 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 65   depends on itse
80d0: 6c 66 2e 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e  lf.}..    lappen
80e0: 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b  d dependencies([
80f0: 6c 69 73 74 20 72 65 76 20 24 72 69 64 5d 29 20  list rev $rid]) 
8100: 5b 6c 69 73 74 20 72 65 76 20 24 70 61 72 65 6e  [list rev $paren
8110: 74 5d 0a 09 7d 0a 0a 09 23 20 54 68 65 20 72 65  t]..}...# The re
8120: 76 69 73 69 6f 6e 73 20 77 68 69 63 68 20 61 72  visions which ar
8130: 65 20 74 68 65 20 66 69 72 73 74 20 6f 6e 20 61  e the first on a
8140: 20 62 72 61 6e 63 68 20 68 61 76 65 20 74 68 61   branch have tha
8150: 74 0a 09 23 20 62 72 61 6e 63 68 20 61 73 20 74  t..# branch as t
8160: 68 65 69 72 20 70 72 65 64 65 63 65 73 73 6f 72  heir predecessor
8170: 2e 20 4e 6f 74 65 20 74 68 61 74 20 72 65 76 69  . Note that revi
8180: 73 69 6f 6e 73 20 63 61 6e 6e 6f 74 20 62 65 0a  sions cannot be.
8190: 09 23 20 6f 6e 20 74 61 67 73 20 69 6e 20 74 68  .# on tags in th
81a0: 65 20 73 61 6d 65 20 6d 61 6e 6e 65 72 2c 20 73  e same manner, s
81b0: 6f 20 74 61 67 73 20 63 61 6e 6e 6f 74 20 62 65  o tags cannot be
81c0: 20 70 72 65 64 65 63 65 73 73 6f 72 73 0a 09 23   predecessors..#
81d0: 20 6f 66 20 72 65 76 69 73 69 6f 6e 73 2e 20 54   of revisions. T
81e0: 68 69 73 20 63 6f 6d 70 6c 65 6d 65 6e 74 73 20  his complements 
81f0: 74 68 61 74 20 74 68 65 79 20 68 61 76 65 20 6e  that they have n
8200: 6f 20 73 75 63 63 65 73 73 6f 72 73 0a 09 23 20  o successors..# 
8210: 28 53 65 65 20 73 79 6d 3a 3a 74 61 67 2f 73 75  (See sym::tag/su
8220: 63 63 65 73 73 6f 72 73 29 2e 0a 0a 09 66 6f 72  ccessors)....for
8230: 65 61 63 68 20 7b 72 69 64 20 70 61 72 65 6e 74  each {rid parent
8240: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09  } [state run "..
8250: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64      SELECT R.rid
8260: 20 42 2e 62 69 64 0a 09 20 20 20 20 46 52 4f 4d   B.bid..    FROM
8270: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 62     revision R, b
8280: 72 61 6e 63 68 20 42 0a 09 20 20 20 20 57 48 45  ranch B..    WHE
8290: 52 45 20 20 52 2e 72 69 64 20 49 4e 20 24 74 68  RE  R.rid IN $th
82a0: 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20 20  eset..    AND   
82b0: 20 42 2e 66 69 72 73 74 20 3d 20 52 2e 72 69 64   B.first = R.rid
82c0: 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70  .."] {..    lapp
82d0: 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73  end dependencies
82e0: 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64 5d  ([list rev $rid]
82f0: 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61  ) [list sym::bra
8300: 6e 63 68 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a  nch $parent]..}.
8310: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 7d 0a  .return.    }.}.
8320: 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23  .# # ## ### ####
8330: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
8340: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
8350: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23  ##############.#
8360: 23 20 48 65 6c 70 65 72 20 73 69 6e 67 6c 65 74  # Helper singlet
8370: 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20 66 6f 72  on. Commands for
8380: 20 74 61 67 20 73 79 6d 62 6f 6c 20 63 68 61 6e   tag symbol chan
8390: 67 65 73 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74  gesets...snit::t
83a0: 79 70 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c  ype ::vc::fossil
83b0: 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70  ::import::cvs::p
83c0: 72 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 73 79 6d  roject::rev::sym
83d0: 3a 3a 74 61 67 20 7b 0a 20 20 20 20 74 79 70 65  ::tag {.    type
83e0: 6d 65 74 68 6f 64 20 62 79 72 65 76 69 73 69 6f  method byrevisio
83f0: 6e 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20  n {} { return 0 
8400: 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  }.    typemethod
8410: 20 62 79 73 79 6d 62 6f 6c 20 20 20 7b 7d 20 7b   bysymbol   {} {
8420: 20 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20   return 1 }.    
8430: 74 79 70 65 6d 65 74 68 6f 64 20 69 73 74 61 67  typemethod istag
8440: 20 20 20 20 20 20 7b 7d 20 7b 20 72 65 74 75 72        {} { retur
8450: 6e 20 31 20 7d 0a 20 20 20 20 74 79 70 65 6d 65  n 1 }.    typeme
8460: 74 68 6f 64 20 69 73 62 72 61 6e 63 68 20 20 20  thod isbranch   
8470: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a  {} { return 0 }.
8480: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
8490: 73 74 72 20 7b 74 61 67 7d 20 7b 0a 09 73 74 72  str {tag} {..str
84a0: 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e  uct::list assign
84b0: 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20   [state run {.. 
84c0: 20 20 20 53 45 4c 45 43 54 20 53 2e 6e 61 6d 65     SELECT S.name
84d0: 2c 20 46 2e 6e 61 6d 65 2c 20 50 2e 6e 61 6d 65  , F.name, P.name
84e0: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 74 61 67  ..    FROM   tag
84f0: 20 54 2c 20 73 79 6d 62 6f 6c 20 53 2c 20 66 69   T, symbol S, fi
8500: 6c 65 20 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a  le F, project P.
8510: 09 20 20 20 20 57 48 45 52 45 20 20 54 2e 74 69  .    WHERE  T.ti
8520: 64 20 3d 20 24 74 61 67 0a 09 20 20 20 20 41 4e  d = $tag..    AN
8530: 44 20 20 20 20 46 2e 66 69 64 20 3d 20 54 2e 66  D    F.fid = T.f
8540: 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50  id..    AND    P
8550: 2e 70 69 64 20 3d 20 46 2e 70 69 64 0a 09 20 20  .pid = F.pid..  
8560: 20 20 41 4e 44 20 20 20 20 53 2e 73 69 64 20 3d    AND    S.sid =
8570: 20 54 2e 73 69 64 0a 09 7d 5d 20 73 6e 61 6d 65   T.sid..}] sname
8580: 20 66 6e 61 6d 65 20 70 6e 61 6d 65 0a 09 72 65   fname pname..re
8590: 74 75 72 6e 20 22 24 70 6e 61 6d 65 2f 54 27 24  turn "$pname/T'$
85a0: 7b 73 6e 61 6d 65 7d 27 3a 3a 24 66 6e 61 6d 65  {sname}'::$fname
85b0: 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72  ".    }..    # r
85c0: 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69  esult = list (mi
85d0: 6e 74 69 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a  ntime, maxtime).
85e0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 74      typemethod t
85f0: 69 6d 65 72 61 6e 67 65 20 7b 74 61 67 73 7d 20  imerange {tags} 
8600: 7b 0a 09 23 20 54 68 65 20 72 61 6e 67 65 20 69  {..# The range i
8610: 73 20 64 65 66 69 6e 65 64 20 61 73 20 74 68 65  s defined as the
8620: 20 72 61 6e 67 65 20 6f 66 20 74 68 65 20 72 65   range of the re
8630: 76 69 73 69 6f 6e 73 20 74 68 65 20 74 61 67 73  visions the tags
8640: 0a 09 23 20 61 72 65 20 61 74 74 61 63 68 65 64  ..# are attached
8650: 20 74 6f 2e 0a 0a 09 73 65 74 20 74 68 65 73 65   to....set these
8660: 74 20 28 27 5b 6a 6f 69 6e 20 24 74 61 67 73 20  t ('[join $tags 
8670: 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e  {','}]')..return
8680: 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20   [state run ".. 
8690: 20 20 20 53 45 4c 45 43 54 20 4d 49 4e 28 52 2e     SELECT MIN(R.
86a0: 64 61 74 65 29 2c 20 4d 41 58 28 52 2e 64 61 74  date), MAX(R.dat
86b0: 65 29 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76  e)..    FROM rev
86c0: 69 73 69 6f 6e 20 52 2c 20 74 61 67 20 54 0a 09  ision R, tag T..
86d0: 20 20 20 20 57 48 45 52 45 20 54 2e 74 69 64 20      WHERE T.tid 
86e0: 49 4e 20 24 74 68 65 73 65 74 0a 20 20 20 20 20  IN $theset.     
86f0: 20 20 20 20 20 20 20 41 4e 44 20 20 20 52 2e 72         AND   R.r
8700: 69 64 20 3d 20 54 2e 72 65 76 0a 09 22 5d 0a 20  id = T.rev.."]. 
8710: 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28     }..    # var(
8720: 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d  dv) = dict (item
8730: 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29   -> list (item))
8740: 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28  , item  = list (
8750: 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 70  type id).    typ
8760: 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f  emethod successo
8770: 72 73 20 7b 64 76 20 74 61 67 73 7d 20 7b 0a 09  rs {dv tags} {..
8780: 23 20 54 61 67 73 20 68 61 76 65 20 6e 6f 20 73  # Tags have no s
8790: 75 63 63 65 73 73 6f 72 73 2e 0a 09 72 65 74 75  uccessors...retu
87a0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  rn.    }..    # 
87b0: 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20 28  var(dv) = dict (
87c0: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74  item -> list (it
87d0: 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69  em)), item  = li
87e0: 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 20 20  st (type id).   
87f0: 20 74 79 70 65 6d 65 74 68 6f 64 20 70 72 65 64   typemethod pred
8800: 65 63 65 73 73 6f 72 73 20 7b 64 76 20 74 61 67  ecessors {dv tag
8810: 73 7d 20 7b 0a 09 23 20 54 68 65 20 70 72 65 64  s} {..# The pred
8820: 65 63 65 73 73 6f 72 73 20 6f 66 20 61 20 74 61  ecessors of a ta
8830: 67 20 61 72 65 20 61 6c 6c 20 74 68 65 20 72 65  g are all the re
8840: 76 69 73 69 6f 6e 73 20 74 68 65 20 74 61 67 73  visions the tags
8850: 20 61 72 65 0a 09 23 20 61 74 74 61 63 68 65 64   are..# attached
8860: 20 74 6f 2c 20 61 73 20 77 65 6c 6c 20 61 73 20   to, as well as 
8870: 61 6c 6c 20 74 68 65 20 62 72 61 6e 63 68 65 73  all the branches
8880: 20 6f 72 20 74 61 67 73 20 77 68 69 63 68 20 61   or tags which a
8890: 72 65 0a 09 23 20 74 68 65 69 72 20 70 72 65 66  re..# their pref
88a0: 65 72 65 64 20 70 61 72 65 6e 74 73 2e 0a 0a 09  ered parents....
88b0: 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f  set theset ('[jo
88c0: 69 6e 20 24 74 61 67 73 20 7b 27 2c 27 7d 5d 27  in $tags {','}]'
88d0: 29 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20  )..foreach {tid 
88e0: 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72  parent} [state r
88f0: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54  un "..    SELECT
8900: 20 54 2e 74 69 64 2c 20 52 2e 72 69 64 0a 09 20   T.tid, R.rid.. 
8910: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69     FROM   revisi
8920: 6f 6e 20 52 2c 20 74 61 67 20 54 0a 09 20 20 20  on R, tag T..   
8930: 20 57 48 45 52 45 20 20 54 2e 74 69 64 20 49 4e   WHERE  T.tid IN
8940: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e   $theset..    AN
8950: 44 20 20 20 20 54 2e 72 65 76 20 3d 20 52 2e 72  D    T.rev = R.r
8960: 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61  id.."] {..    la
8970: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69  ppend dependenci
8980: 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61  es([list sym::ta
8990: 67 20 24 74 69 64 5d 29 20 5b 6c 69 73 74 20 72  g $tid]) [list r
89a0: 65 76 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 0a  ev $parent]..}..
89b0: 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 70 61  .foreach {tid pa
89c0: 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e  rent} [state run
89d0: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 54   "..    SELECT T
89e0: 2e 74 69 64 2c 20 42 2e 62 69 64 0a 09 20 20 20  .tid, B.bid..   
89f0: 20 46 52 4f 4d 20 20 20 74 61 67 20 54 2c 20 62   FROM   tag T, b
8a00: 72 61 6e 63 68 20 42 2c 20 70 72 65 66 65 72 65  ranch B, prefere
8a10: 64 70 61 72 65 6e 74 20 50 0a 09 20 20 20 20 57  dparent P..    W
8a20: 48 45 52 45 20 20 54 2e 74 69 64 20 49 4e 20 24  HERE  T.tid IN $
8a30: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20  theset..    AND 
8a40: 20 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 69 64     T.sid = P.sid
8a50: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70  ..    AND    P.p
8a60: 69 64 20 3d 20 42 2e 73 69 64 0a 09 22 5d 20 7b  id = B.sid.."] {
8a70: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65  ..    lappend de
8a80: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74  pendencies([list
8a90: 20 73 79 6d 3a 3a 74 61 67 20 24 74 69 64 5d 29   sym::tag $tid])
8aa0: 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e   [list sym::bran
8ab0: 63 68 20 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 0a  ch $parent]..}..
8ac0: 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 70 61  .foreach {tid pa
8ad0: 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e  rent} [state run
8ae0: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 54   "..    SELECT T
8af0: 2e 74 69 64 2c 20 54 58 2e 74 69 64 0a 09 20 20  .tid, TX.tid..  
8b00: 20 20 46 52 4f 4d 20 20 20 74 61 67 20 54 2c 20    FROM   tag T, 
8b10: 74 61 67 20 54 58 2c 20 70 72 65 66 65 72 65 64  tag TX, prefered
8b20: 70 61 72 65 6e 74 20 50 0a 09 20 20 20 20 57 48  parent P..    WH
8b30: 45 52 45 20 20 54 2e 74 69 64 20 49 4e 20 24 74  ERE  T.tid IN $t
8b40: 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20 20  heset..    AND  
8b50: 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a    T.sid = P.sid.
8b60: 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69  .    AND    P.pi
8b70: 64 20 3d 20 54 58 2e 73 69 64 0a 09 22 5d 20 7b  d = TX.sid.."] {
8b80: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65  ..    lappend de
8b90: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74  pendencies([list
8ba0: 20 73 79 6d 3a 3a 74 61 67 20 24 74 69 64 5d 29   sym::tag $tid])
8bb0: 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20   [list sym::tag 
8bc0: 24 70 61 72 65 6e 74 5d 0a 09 7d 0a 09 72 65 74  $parent]..}..ret
8bd0: 75 72 6e 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23  urn.    }.}..# #
8be0: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23   ## ### ##### ##
8bf0: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
8c00: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
8c10: 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 48 65  ##########.## He
8c20: 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 2e 20  lper singleton. 
8c30: 43 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 62 72 61  Commands for bra
8c40: 6e 63 68 20 73 79 6d 62 6f 6c 20 63 68 61 6e 67  nch symbol chang
8c50: 65 73 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79  esets...snit::ty
8c60: 70 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a  pe ::vc::fossil:
8c70: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72  :import::cvs::pr
8c80: 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 73 79 6d 3a  oject::rev::sym:
8c90: 3a 62 72 61 6e 63 68 20 7b 0a 20 20 20 20 74 79  :branch {.    ty
8ca0: 70 65 6d 65 74 68 6f 64 20 62 79 72 65 76 69 73  pemethod byrevis
8cb0: 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20  ion {} { return 
8cc0: 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68  0 }.    typemeth
8cd0: 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 20 7b 7d  od bysymbol   {}
8ce0: 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a 20 20   { return 1 }.  
8cf0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73 74    typemethod ist
8d00: 61 67 20 20 20 20 20 20 7b 7d 20 7b 20 72 65 74  ag      {} { ret
8d10: 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65  urn 0 }.    type
8d20: 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63 68 20  method isbranch 
8d30: 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20    {} { return 1 
8d40: 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  }..    typemetho
8d50: 64 20 73 74 72 20 7b 62 72 61 6e 63 68 7d 20 7b  d str {branch} {
8d60: 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61  ..struct::list a
8d70: 73 73 69 67 6e 20 5b 73 74 61 74 65 20 72 75 6e  ssign [state run
8d80: 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 53   {..    SELECT S
8d90: 2e 6e 61 6d 65 2c 20 46 2e 6e 61 6d 65 2c 20 50  .name, F.name, P
8da0: 2e 6e 61 6d 65 0a 09 20 20 20 20 46 52 4f 4d 20  .name..    FROM 
8db0: 20 20 62 72 61 6e 63 68 20 42 2c 20 73 79 6d 62    branch B, symb
8dc0: 6f 6c 20 53 2c 20 66 69 6c 65 20 46 2c 20 70 72  ol S, file F, pr
8dd0: 6f 6a 65 63 74 20 50 0a 09 20 20 20 20 57 48 45  oject P..    WHE
8de0: 52 45 20 20 42 2e 62 69 64 20 3d 20 24 62 72 61  RE  B.bid = $bra
8df0: 6e 63 68 0a 09 20 20 20 20 41 4e 44 20 20 20 20  nch..    AND    
8e00: 46 2e 66 69 64 20 3d 20 42 2e 66 69 64 0a 09 20  F.fid = B.fid.. 
8e10: 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69 64 20     AND    P.pid 
8e20: 3d 20 46 2e 70 69 64 0a 09 20 20 20 20 41 4e 44  = F.pid..    AND
8e30: 20 20 20 20 53 2e 73 69 64 20 3d 20 42 2e 73 69      S.sid = B.si
8e40: 64 0a 09 7d 5d 20 73 6e 61 6d 65 20 66 6e 61 6d  d..}] sname fnam
8e50: 65 20 70 6e 61 6d 65 0a 09 72 65 74 75 72 6e 20  e pname..return 
8e60: 22 24 70 6e 61 6d 65 2f 42 27 24 7b 73 6e 61 6d  "$pname/B'${snam
8e70: 65 7d 27 3a 3a 24 66 6e 61 6d 65 22 0a 20 20 20  e}'::$fname".   
8e80: 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74   }..    # result
8e90: 20 3d 20 6c 69 73 74 20 28 6d 69 6e 74 69 6d 65   = list (mintime
8ea0: 2c 20 6d 61 78 74 69 6d 65 29 0a 20 20 20 20 74  , maxtime).    t
8eb0: 79 70 65 6d 65 74 68 6f 64 20 74 69 6d 65 72 61  ypemethod timera
8ec0: 6e 67 65 20 7b 62 72 61 6e 63 68 65 73 7d 20 7b  nge {branches} {
8ed0: 0a 09 23 20 54 68 65 20 72 61 6e 67 65 20 6f 66  ..# The range of
8ee0: 20 61 20 62 72 61 6e 63 68 20 69 73 20 64 65 66   a branch is def
8ef0: 69 6e 65 64 20 61 73 20 74 68 65 20 72 61 6e 67  ined as the rang
8f00: 65 20 6f 66 20 74 68 65 0a 09 23 20 72 65 76 69  e of the..# revi
8f10: 73 69 6f 6e 73 20 74 68 65 20 62 72 61 6e 63 68  sions the branch
8f20: 65 73 20 61 72 65 20 73 70 61 77 6e 65 64 20 62  es are spawned b
8f30: 79 2e 20 4e 4f 54 45 20 68 6f 77 65 76 65 72 20  y. NOTE however 
8f40: 74 68 61 74 20 74 68 65 0a 09 23 20 62 72 61 6e  that the..# bran
8f50: 63 68 65 73 20 61 73 73 6f 63 69 61 74 65 64 20  ches associated 
8f60: 77 69 74 68 20 61 20 64 65 74 61 63 68 65 64 20  with a detached 
8f70: 4e 54 44 42 20 77 69 6c 6c 20 68 61 76 65 20 6e  NTDB will have n
8f80: 6f 20 72 6f 6f 74 0a 09 23 20 73 70 61 77 6e 69  o root..# spawni
8f90: 6e 67 20 74 68 65 6d 2c 20 68 65 6e 63 65 20 74  ng them, hence t
8fa0: 68 65 79 20 68 61 76 65 20 6e 6f 20 72 65 61 6c  hey have no real
8fb0: 20 74 69 6d 65 72 61 6e 67 65 20 61 6e 79 0a 09   timerange any..
8fc0: 23 20 6c 6f 6e 67 65 72 2e 20 42 79 20 75 73 69  # longer. By usi
8fd0: 6e 67 20 30 20 77 65 20 70 75 74 20 74 68 65 6d  ng 0 we put them
8fe0: 20 69 6e 20 66 72 6f 6e 74 20 6f 66 20 65 76 65   in front of eve
8ff0: 72 79 74 68 69 6e 67 20 65 6c 73 65 2c 0a 09 23  rything else,..#
9000: 20 61 73 20 74 68 65 79 20 6c 6f 67 69 63 61 6c   as they logical
9010: 6c 79 20 61 72 65 2e 0a 0a 09 73 65 74 20 74 68  ly are....set th
9020: 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72  eset ('[join $br
9030: 61 6e 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a  anches {','}]').
9040: 09 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72  .return [state r
9050: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54  un "..    SELECT
9060: 20 49 46 4e 55 4c 4c 28 4d 49 4e 28 52 2e 64 61   IFNULL(MIN(R.da
9070: 74 65 29 2c 30 29 2c 20 49 46 4e 55 4c 4c 28 4d  te),0), IFNULL(M
9080: 41 58 28 52 2e 64 61 74 65 29 2c 30 29 0a 09 20  AX(R.date),0).. 
9090: 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e     FROM revision
90a0: 20 52 2c 20 62 72 61 6e 63 68 20 42 0a 09 20 20   R, branch B..  
90b0: 20 20 57 48 45 52 45 20 42 2e 62 69 64 20 49 4e    WHERE B.bid IN
90c0: 20 24 74 68 65 73 65 74 0a 20 20 20 20 20 20 20   $theset.       
90d0: 20 20 20 20 20 41 4e 44 20 20 20 52 2e 72 69 64       AND   R.rid
90e0: 20 3d 20 42 2e 72 6f 6f 74 0a 09 22 5d 0a 20 20   = B.root.."].  
90f0: 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64    }..    # var(d
9100: 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20  v) = dict (item 
9110: 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c  -> list (item)),
9120: 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74   item  = list (t
9130: 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 70 65  ype id).    type
9140: 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f 72  method successor
9150: 73 20 7b 64 76 20 62 72 61 6e 63 68 65 73 7d 20  s {dv branches} 
9160: 7b 0a 09 23 20 54 68 65 20 66 69 72 73 74 20 72  {..# The first r
9170: 65 76 69 73 69 6f 6e 20 63 6f 6d 6d 69 74 74 65  evision committe
9180: 64 20 6f 6e 20 61 20 62 72 61 6e 63 68 2c 20 61  d on a branch, a
9190: 6e 64 20 61 6c 6c 20 62 72 61 6e 63 68 65 73 0a  nd all branches.
91a0: 09 23 20 61 6e 64 20 74 61 67 73 20 77 68 69 63  .# and tags whic
91b0: 68 20 68 61 76 65 20 69 74 20 61 73 20 74 68 65  h have it as the
91c0: 69 72 20 70 72 65 66 65 72 65 64 20 70 61 72 65  ir prefered pare
91d0: 6e 74 20 61 72 65 20 74 68 65 0a 09 23 20 73 75  nt are the..# su
91e0: 63 63 65 73 73 6f 72 73 20 6f 66 20 61 20 62 72  ccessors of a br
91f0: 61 6e 63 68 2e 0a 0a 09 73 65 74 20 74 68 65 73  anch....set thes
9200: 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61 6e  et ('[join $bran
9210: 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66  ches {','}]')..f
9220: 6f 72 65 61 63 68 20 7b 62 69 64 20 63 68 69 6c  oreach {bid chil
9230: 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a  d} [state run ".
9240: 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62 69  .    SELECT B.bi
9250: 64 2c 20 52 2e 72 69 64 0a 09 20 20 20 20 46 52  d, R.rid..    FR
9260: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c  OM   revision R,
9270: 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20 20 57   branch B..    W
9280: 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24  HERE  B.bid IN $
9290: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20  theset..    AND 
92a0: 20 20 20 42 2e 66 69 72 73 74 20 3d 20 52 2e 72     B.first = R.r
92b0: 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61  id.."] {..    la
92c0: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69  ppend dependenci
92d0: 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61  es([list sym::ta
92e0: 67 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 20 72  g $bid]) [list r
92f0: 65 76 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66  ev $child]..}..f
9300: 6f 72 65 61 63 68 20 7b 62 69 64 20 63 68 69 6c  oreach {bid chil
9310: 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22 0a  d} [state run ".
9320: 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62 69  .    SELECT B.bi
9330: 64 2c 20 42 58 2e 62 69 64 0a 09 20 20 20 20 46  d, BX.bid..    F
9340: 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20  ROM   branch B, 
9350: 62 72 61 6e 63 68 20 42 58 2c 20 70 72 65 66 65  branch BX, prefe
9360: 72 65 64 70 61 72 65 6e 74 20 50 0a 09 20 20 20  redparent P..   
9370: 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e   WHERE  B.bid IN
9380: 20 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e   $theset..    AN
9390: 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50 2e 70  D    B.sid = P.p
93a0: 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42  id..    AND    B
93b0: 58 2e 73 69 64 20 3d 20 50 2e 73 69 64 0a 09 22  X.sid = P.sid.."
93c0: 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64  ] {..    lappend
93d0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c   dependencies([l
93e0: 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 62 69  ist sym::tag $bi
93f0: 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62  d]) [list sym::b
9400: 72 61 6e 63 68 20 24 63 68 69 6c 64 5d 0a 09 7d  ranch $child]..}
9410: 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64 20 63  ..foreach {bid c
9420: 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e  hild} [state run
9430: 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42   "..    SELECT B
9440: 2e 62 69 64 2c 20 54 2e 74 69 64 0a 09 20 20 20  .bid, T.tid..   
9450: 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42   FROM   branch B
9460: 2c 20 74 61 67 20 54 2c 20 70 72 65 66 65 72 65  , tag T, prefere
9470: 64 70 61 72 65 6e 74 20 50 0a 09 20 20 20 20 57  dparent P..    W
9480: 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24  HERE  B.bid IN $
9490: 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44 20  theset..    AND 
94a0: 20 20 20 42 2e 73 69 64 20 3d 20 50 2e 70 69 64     B.sid = P.pid
94b0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 54 2e 73  ..    AND    T.s
94c0: 69 64 20 3d 20 50 2e 73 69 64 0a 09 22 5d 20 7b  id = P.sid.."] {
94d0: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65  ..    lappend de
94e0: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74  pendencies([list
94f0: 20 73 79 6d 3a 3a 74 61 67 20 24 62 69 64 5d 29   sym::tag $bid])
9500: 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67 20   [list sym::tag 
9510: 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 72 65 74 75  $child]..}..retu
9520: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  rn.    }..    # 
9530: 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20 28  var(dv) = dict (
9540: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74  item -> list (it
9550: 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69  em)), item  = li
9560: 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 20 20  st (type id).   
9570: 20 74 79 70 65 6d 65 74 68 6f 64 20 70 72 65 64   typemethod pred
9580: 65 63 65 73 73 6f 72 73 20 7b 64 76 20 62 72 61  ecessors {dv bra
9590: 6e 63 68 65 73 7d 20 7b 0a 09 23 20 54 68 65 20  nches} {..# The 
95a0: 70 72 65 64 65 63 65 73 73 6f 72 73 20 6f 66 20  predecessors of 
95b0: 61 20 62 72 61 6e 63 68 20 61 72 65 20 61 6c 6c  a branch are all
95c0: 20 74 68 65 20 72 65 76 69 73 69 6f 6e 73 20 74   the revisions t
95d0: 68 65 0a 09 23 20 62 72 61 6e 63 68 65 73 20 61  he..# branches a
95e0: 72 65 20 73 70 61 77 6e 65 64 20 66 72 6f 6d 2c  re spawned from,
95f0: 20 61 73 20 77 65 6c 6c 20 61 73 20 61 6c 6c 20   as well as all 
9600: 74 68 65 20 62 72 61 6e 63 68 65 73 20 6f 72 0a  the branches or.
9610: 09 23 20 74 61 67 73 20 77 68 69 63 68 20 61 72  .# tags which ar
9620: 65 20 74 68 65 69 72 20 70 72 65 66 65 72 65 64  e their prefered
9630: 20 70 61 72 65 6e 74 73 2e 0a 0a 09 73 65 74 20   parents....set 
9640: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24  theset ('[join $
9650: 74 61 67 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66  tags {','}]')..f
9660: 6f 72 65 61 63 68 20 7b 62 69 64 20 70 61 72 65  oreach {bid pare
9670: 6e 74 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 22  nt} [state run "
9680: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 42  ..    SELECT B.B
9690: 69 64 2c 20 52 2e 72 69 64 0a 09 20 20 20 20 46  id, R.rid..    F
96a0: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52  ROM   revision R
96b0: 2c 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20 20  , branch B..    
96c0: 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20  WHERE  B.bid IN 
96d0: 24 74 68 65 73 65 74 0a 09 20 20 20 20 41 4e 44  $theset..    AND
96e0: 20 20 20 20 42 2e 72 6f 6f 74 20 3d 20 52 2e 72      B.root = R.r
96f0: 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61  id.."] {..    la
9700: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69  ppend dependenci
9710: 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72  es([list sym::br
9720: 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c 69 73  anch $bid]) [lis
9730: 74 20 72 65 76 20 24 70 61 72 65 6e 74 5d 0a 09  t rev $parent]..
9740: 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62 69 64 20  }..foreach {bid 
9750: 70 61 72 65 6e 74 7d 20 5b 73 74 61 74 65 20 72  parent} [state r
9760: 75 6e 20 22 0a 09 20 20 20 20 53 45 4c 45 43 54  un "..    SELECT
9770: 20 42 2e 62 69 64 2c 20 42 58 2e 62 69 64 0a 09   B.bid, BX.bid..
9780: 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63      FROM   branc
9790: 68 20 42 2c 20 62 72 61 6e 63 68 20 42 58 2c 20  h B, branch BX, 
97a0: 70 72 65 66 65 72 65 64 70 61 72 65 6e 74 20 50  preferedparent P
97b0: 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62  ..    WHERE  B.b
97c0: 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 20  id IN $theset.. 
97d0: 20 20 20 41 4e 44 20 20 20 20 42 2e 73 69 64 20     AND    B.sid 
97e0: 3d 20 50 2e 73 69 64 0a 09 20 20 20 20 41 4e 44  = P.sid..    AND
97f0: 20 20 20 20 50 2e 70 69 64 20 3d 20 42 58 2e 73      P.pid = BX.s
9800: 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20 6c 61  id.."] {..    la
9810: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69  ppend dependenci
9820: 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72  es([list sym::br
9830: 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c 69 73  anch $bid]) [lis
9840: 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 70  t sym::branch $p
9850: 61 72 65 6e 74 5d 0a 09 7d 0a 09 66 6f 72 65 61  arent]..}..forea
9860: 63 68 20 7b 62 69 64 20 70 61 72 65 6e 74 7d 20  ch {bid parent} 
9870: 5b 73 74 61 74 65 20 72 75 6e 20 22 0a 09 20 20  [state run "..  
9880: 20 20 53 45 4c 45 43 54 20 42 2e 62 69 64 2c 20    SELECT B.bid, 
9890: 54 2e 74 69 64 0a 09 20 20 20 20 46 52 4f 4d 20  T.tid..    FROM 
98a0: 20 20 62 72 61 6e 63 68 20 42 2c 20 74 61 67 20    branch B, tag 
98b0: 54 2c 20 70 72 65 66 65 72 65 64 70 61 72 65 6e  T, preferedparen
98c0: 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 20 20  t P..    WHERE  
98d0: 42 2e 74 69 64 20 49 4e 20 24 74 68 65 73 65 74  B.tid IN $theset
98e0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 73  ..    AND    B.s
98f0: 69 64 20 3d 20 50 2e 73 69 64 0a 09 20 20 20 20  id = P.sid..    
9900: 41 4e 44 20 20 20 20 50 2e 70 69 64 20 3d 20 54  AND    P.pid = T
9910: 2e 73 69 64 0a 09 22 5d 20 7b 0a 09 20 20 20 20  .sid.."] {..    
9920: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e  lappend dependen
9930: 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a  cies([list sym::
9940: 62 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c  branch $bid]) [l
9950: 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 70 61  ist sym::tag $pa
9960: 72 65 6e 74 5d 0a 09 7d 0a 09 72 65 74 75 72 6e  rent]..}..return
9970: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20  .    }..    # # 
9980: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
9990: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
99a0: 23 23 23 0a 20 20 20 20 23 23 20 43 6f 6e 66 69  ###.    ## Confi
99b0: 67 75 72 61 74 69 6f 6e 0a 0a 20 20 20 20 70 72  guration..    pr
99c0: 61 67 6d 61 20 2d 68 61 73 69 6e 73 74 61 6e 63  agma -hasinstanc
99d0: 65 73 20 20 20 6e 6f 20 3b 20 23 20 73 69 6e 67  es   no ; # sing
99e0: 6c 65 74 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61  leton.    pragma
99f0: 20 2d 68 61 73 74 79 70 65 69 6e 66 6f 20 20 20   -hastypeinfo   
9a00: 20 6e 6f 20 3b 20 23 20 6e 6f 20 69 6e 74 72 6f   no ; # no intro
9a10: 73 70 65 63 74 69 6f 6e 0a 20 20 20 20 70 72 61  spection.    pra
9a20: 67 6d 61 20 2d 68 61 73 74 79 70 65 64 65 73 74  gma -hastypedest
9a30: 72 6f 79 20 6e 6f 20 3b 20 23 20 69 6d 6d 6f 72  roy no ; # immor
9a40: 74 61 6c 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23  tal.}..# # ## ##
9a50: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
9a60: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23   ############# #
9a70: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9a80: 23 23 23 23 0a 23 23 0a 0a 6e 61 6d 65 73 70 61  ####.##..namespa
9a90: 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a 66 6f  ce eval ::vc::fo
9aa0: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
9ab0: 73 3a 3a 70 72 6f 6a 65 63 74 20 7b 0a 20 20 20  s::project {.   
9ac0: 20 6e 61 6d 65 73 70 61 63 65 20 65 78 70 6f 72   namespace expor
9ad0: 74 20 72 65 76 0a 20 20 20 20 6e 61 6d 65 73 70  t rev.    namesp
9ae0: 61 63 65 20 65 76 61 6c 20 72 65 76 20 7b 0a 09  ace eval rev {..
9af0: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74  namespace import
9b00: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
9b10: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74  mport::cvs::stat
9b20: 65 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70  e..namespace imp
9b30: 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c  ort ::vc::fossil
9b40: 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 69  ::import::cvs::i
9b50: 6e 74 65 67 72 69 74 79 0a 09 6e 61 6d 65 73 70  ntegrity..namesp
9b60: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a  ace import ::vc:
9b70: 3a 74 6f 6f 6c 73 3a 3a 6d 69 73 63 3a 3a 2a 0a  :tools::misc::*.
9b80: 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72  .namespace impor
9b90: 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 74  t ::vc::tools::t
9ba0: 72 6f 75 62 6c 65 0a 09 6e 61 6d 65 73 70 61 63  rouble..namespac
9bb0: 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74  e import ::vc::t
9bc0: 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 6c 6f 67 20 72  ools::log..log r
9bd0: 65 67 69 73 74 65 72 20 63 73 65 74 73 0a 0a 09  egister csets...
9be0: 23 20 53 65 74 20 75 70 20 74 68 65 20 68 65 6c  # Set up the hel
9bf0: 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 73 0a 09  per singletons..
9c00: 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 72  namespace eval r
9c10: 65 76 20 7b 0a 09 20 20 20 20 6e 61 6d 65 73 70  ev {..    namesp
9c20: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a  ace import ::vc:
9c30: 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a  :fossil::import:
9c40: 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09 20 20 20  :cvs::state..   
9c50: 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72   namespace impor
9c60: 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a  t ::vc::fossil::
9c70: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e 74  import::cvs::int
9c80: 65 67 72 69 74 79 0a 09 7d 0a 09 6e 61 6d 65 73  egrity..}..names
9c90: 70 61 63 65 20 65 76 61 6c 20 73 79 6d 3a 3a 74  pace eval sym::t
9ca0: 61 67 20 7b 0a 09 20 20 20 20 6e 61 6d 65 73 70  ag {..    namesp
9cb0: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a  ace import ::vc:
9cc0: 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a  :fossil::import:
9cd0: 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09 20 20 20  :cvs::state..   
9ce0: 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72   namespace impor
9cf0: 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a  t ::vc::fossil::
9d00: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e 74  import::cvs::int
9d10: 65 67 72 69 74 79 0a 09 7d 0a 09 6e 61 6d 65 73  egrity..}..names
9d20: 70 61 63 65 20 65 76 61 6c 20 73 79 6d 3a 3a 62  pace eval sym::b
9d30: 72 61 6e 63 68 20 7b 0a 09 20 20 20 20 6e 61 6d  ranch {..    nam
9d40: 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a  espace import ::
9d50: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f  vc::fossil::impo
9d60: 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09  rt::cvs::state..
9d70: 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d      namespace im
9d80: 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69  port ::vc::fossi
9d90: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a  l::import::cvs::
9da0: 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a 20 20 20  integrity..}.   
9db0: 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 23   }.}..# # ## ###
9dc0: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20   ##### ######## 
9dd0: 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23  ############# ##
9de0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
9df0: 23 23 23 0a 23 23 20 52 65 61 64 79 0a 0a 70 61  ###.## Ready..pa
9e00: 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20 76 63  ckage provide vc
9e10: 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74  ::fossil::import
9e20: 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a  ::cvs::project::
9e30: 72 65 76 20 31 2e 30 0a 72 65 74 75 72 6e 0a     rev 1.0.return.