Hex Artifact Content
Not logged in

Artifact e87b9beadd0b0108f0a23b0b3ba84c38a30f1e0a:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [efec424a19] - Merged bugfix b3d61d7829 into the main branch for optimization of memory usage. by aku on 2008-02-23 06:40:48.

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 2d 32 30 30 38 20 41 6e 64 72 65 61 73 20  07-2008 Andreas 
0070: 4b 75 70 72 69 65 73 2e 0a 23 0a 23 20 54 68 69  Kupries..#.# Thi
0080: 73 20 73 6f 66 74 77 61 72 65 20 69 73 20 6c 69  s software is li
0090: 63 65 6e 73 65 64 20 61 73 20 64 65 73 63 72 69  censed as descri
00a0: 62 65 64 20 69 6e 20 74 68 65 20 66 69 6c 65 20  bed in the file 
00b0: 4c 49 43 45 4e 53 45 2c 20 77 68 69 63 68 0a 23  LICENSE, which.#
00c0: 20 79 6f 75 20 73 68 6f 75 6c 64 20 68 61 76 65   you should have
00d0: 20 72 65 63 65 69 76 65 64 20 61 73 20 70 61 72   received as par
00e0: 74 20 6f 66 20 74 68 69 73 20 64 69 73 74 72 69  t of this distri
00f0: 62 75 74 69 6f 6e 2e 0a 23 0a 23 20 54 68 69 73  bution..#.# This
0100: 20 73 6f 66 74 77 61 72 65 20 63 6f 6e 73 69 73   software consis
0110: 74 73 20 6f 66 20 76 6f 6c 75 6e 74 61 72 79 20  ts of voluntary 
0120: 63 6f 6e 74 72 69 62 75 74 69 6f 6e 73 20 6d 61  contributions ma
0130: 64 65 20 62 79 20 6d 61 6e 79 0a 23 20 69 6e 64  de by many.# ind
0140: 69 76 69 64 75 61 6c 73 2e 20 20 46 6f 72 20 65  ividuals.  For e
0150: 78 61 63 74 20 63 6f 6e 74 72 69 62 75 74 69 6f  xact contributio
0160: 6e 20 68 69 73 74 6f 72 79 2c 20 73 65 65 20 74  n history, see t
0170: 68 65 20 72 65 76 69 73 69 6f 6e 0a 23 20 68 69  he revision.# hi
0180: 73 74 6f 72 79 20 61 6e 64 20 6c 6f 67 73 2c 20  story and logs, 
0190: 61 76 61 69 6c 61 62 6c 65 20 61 74 20 68 74 74  available at htt
01a0: 70 3a 2f 2f 66 6f 73 73 69 6c 2d 73 63 6d 2e 68  p://fossil-scm.h
01b0: 77 61 63 69 2e 63 6f 6d 2f 66 6f 73 73 69 6c 0a  waci.com/fossil.
01c0: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
01d0: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
01e0: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
01f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23  #############..#
0200: 23 20 52 65 76 69 73 69 6f 6e 73 20 70 65 72 20  # Revisions per 
0210: 70 72 6f 6a 65 63 74 2c 20 61 6b 61 20 43 68 61  project, aka Cha
0220: 6e 67 65 73 65 74 73 2e 20 54 68 65 73 65 20 6f  ngesets. These o
0230: 62 6a 65 63 74 73 20 61 72 65 20 66 69 72 73 74  bjects are first
0240: 20 75 73 65 64 0a 23 23 20 69 6e 20 70 61 73 73   used.## in pass
0250: 20 35 2c 20 77 68 69 63 68 20 63 72 65 61 74 65   5, which create
0260: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 73 65  s the initial se
0270: 74 20 63 6f 76 65 72 69 6e 67 20 74 68 65 20 72  t covering the r
0280: 65 70 6f 73 69 74 6f 72 79 2e 0a 0a 23 20 23 20  epository...# # 
0290: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
02a0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
02b0: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
02c0: 23 23 23 23 23 23 23 23 23 0a 23 23 20 52 65 71  #########.## Req
02d0: 75 69 72 65 6d 65 6e 74 73 0a 0a 70 61 63 6b 61  uirements..packa
02e0: 67 65 20 72 65 71 75 69 72 65 20 54 63 6c 20 38  ge require Tcl 8
02f0: 2e 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .4              
0300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0310: 20 3b 20 23 20 52 65 71 75 69 72 65 64 20 72 75   ; # Required ru
0320: 6e 74 69 6d 65 2e 0a 70 61 63 6b 61 67 65 20 72  ntime..package r
0330: 65 71 75 69 72 65 20 73 6e 69 74 20 20 20 20 20  equire 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 20 20 20 20 20 3b 20 23               ; #
0360: 20 4f 4f 20 73 79 73 74 65 6d 2e 0a 70 61 63 6b   OO system..pack
0370: 61 67 65 20 72 65 71 75 69 72 65 20 73 74 72 75  age require stru
0380: 63 74 3a 3a 73 65 74 20 20 20 20 20 20 20 20 20  ct::set         
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03a0: 20 20 3b 20 23 20 53 65 74 20 6f 70 65 72 61 74    ; # Set operat
03b0: 69 6f 6e 73 2e 0a 70 61 63 6b 61 67 65 20 72 65  ions..package re
03c0: 71 75 69 72 65 20 76 63 3a 3a 74 6f 6f 6c 73 3a  quire vc::tools:
03d0: 3a 6d 69 73 63 20 20 20 20 20 20 20 20 20 20 20  :misc           
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23 20              ; # 
03f0: 54 65 78 74 20 66 6f 72 6d 61 74 74 69 6e 67 0a  Text formatting.
0400: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
0410: 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 74 72 6f 75 62  vc::tools::troub
0420: 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  le              
0430: 20 20 20 20 20 20 3b 20 23 20 45 72 72 6f 72 20        ; # Error 
0440: 72 65 70 6f 72 74 69 6e 67 2e 0a 70 61 63 6b 61  reporting..packa
0450: 67 65 20 72 65 71 75 69 72 65 20 76 63 3a 3a 74  ge require vc::t
0460: 6f 6f 6c 73 3a 3a 6c 6f 67 20 20 20 20 20 20 20  ools::log       
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0480: 20 3b 20 23 20 55 73 65 72 20 66 65 65 64 62 61   ; # User feedba
0490: 63 6b 2e 0a 70 61 63 6b 61 67 65 20 72 65 71 75  ck..package requ
04a0: 69 72 65 20 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a  ire vc::fossil::
04b0: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61  import::cvs::sta
04c0: 74 65 20 20 20 20 20 20 20 20 3b 20 23 20 53 74  te        ; # St
04d0: 61 74 65 20 73 74 6f 72 61 67 65 2e 0a 70 61 63  ate storage..pac
04e0: 6b 61 67 65 20 72 65 71 75 69 72 65 20 76 63 3a  kage require vc:
04f0: 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a  :fossil::import:
0500: 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 20  :cvs::integrity 
0510: 20 20 20 3b 20 23 20 53 74 61 74 65 20 69 6e 74     ; # State int
0520: 65 67 72 69 74 79 20 63 68 65 63 6b 73 2e 0a 0a  egrity checks...
0530: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
0540: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
0550: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
0560: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23  #############.##
0570: 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20 3a 3a 76  ..snit::type ::v
0580: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72  c::fossil::impor
0590: 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a  t::cvs::project:
05a0: 3a 72 65 76 20 7b 0a 20 20 20 20 23 20 23 20 23  :rev {.    # # #
05b0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
05c0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
05d0: 23 23 0a 20 20 20 20 23 23 20 50 75 62 6c 69 63  ##.    ## Public
05e0: 20 41 50 49 0a 0a 20 20 20 20 63 6f 6e 73 74 72   API..    constr
05f0: 75 63 74 6f 72 20 7b 70 72 6f 6a 65 63 74 20 63  uctor {project c
0600: 73 74 79 70 65 20 73 72 63 69 64 20 69 74 65 6d  stype srcid item
0610: 73 20 7b 74 68 65 69 64 20 7b 7d 7d 7d 20 7b 0a  s {theid {}}} {.
0620: 09 69 66 20 7b 24 74 68 65 69 64 20 6e 65 20 22  .if {$theid ne "
0630: 22 7d 20 7b 0a 09 20 20 20 20 73 65 74 20 6d 79  "} {..    set my
0640: 69 64 20 24 74 68 65 69 64 0a 09 7d 20 65 6c 73  id $theid..} els
0650: 65 20 7b 0a 09 20 20 20 20 73 65 74 20 6d 79 69  e {..    set myi
0660: 64 20 5b 69 6e 63 72 20 6d 79 63 6f 75 6e 74 65  d [incr mycounte
0670: 72 5d 0a 09 7d 0a 0a 09 69 6e 74 65 67 72 69 74  r]..}...integrit
0680: 79 20 61 73 73 65 72 74 20 7b 0a 09 20 20 20 20  y assert {..    
0690: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 6d 79 63  [info exists myc
06a0: 73 74 79 70 65 28 24 63 73 74 79 70 65 29 5d 0a  stype($cstype)].
06b0: 09 7d 20 7b 42 61 64 20 63 68 61 6e 67 65 73 65  .} {Bad changese
06c0: 74 20 74 79 70 65 20 27 24 63 73 74 79 70 65 27  t type '$cstype'
06d0: 2e 7d 0a 0a 09 73 65 74 20 6d 79 70 72 6f 6a 65  .}...set myproje
06e0: 63 74 20 20 20 24 70 72 6f 6a 65 63 74 0a 09 73  ct   $project..s
06f0: 65 74 20 6d 79 74 79 70 65 20 20 20 20 20 20 24  et mytype      $
0700: 63 73 74 79 70 65 0a 09 73 65 74 20 6d 79 74 79  cstype..set myty
0710: 70 65 6f 62 6a 20 20 20 3a 3a 76 63 3a 3a 66 6f  peobj   ::vc::fo
0720: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
0730: 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a  s::project::rev:
0740: 3a 24 7b 63 73 74 79 70 65 7d 0a 09 73 65 74 20  :${cstype}..set 
0750: 6d 79 73 72 63 69 64 09 24 73 72 63 69 64 0a 09  mysrcid.$srcid..
0760: 73 65 74 20 6d 79 69 74 65 6d 73 20 20 20 20 20  set myitems     
0770: 24 69 74 65 6d 73 0a 09 73 65 74 20 6d 79 70 6f  $items..set mypo
0780: 73 20 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 43  s       {} ; # C
0790: 6f 6d 6d 69 74 20 6c 6f 63 61 74 69 6f 6e 20 69  ommit location i
07a0: 73 20 6e 6f 74 20 6b 6e 6f 77 6e 20 79 65 74 2e  s not known yet.
07b0: 0a 0a 09 23 20 4b 65 65 70 20 74 72 61 63 6b 20  ...# Keep track 
07c0: 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
07d0: 20 63 68 61 6e 67 65 73 65 74 73 20 61 6e 64 20   changesets and 
07e0: 6f 66 20 74 68 65 20 69 6e 76 65 72 73 65 0a 09  of the inverse..
07f0: 23 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 69  # mapping from i
0800: 74 65 6d 73 20 74 6f 20 74 68 65 6d 2e 0a 09 6c  tems to them...l
0810: 61 70 70 65 6e 64 20 6d 79 63 68 61 6e 67 65 73  append mychanges
0820: 65 74 73 20 20 20 24 73 65 6c 66 0a 09 6c 61 70  ets   $self..lap
0830: 70 65 6e 64 20 6d 79 74 63 68 61 6e 67 65 73 65  pend mytchangese
0840: 74 73 28 24 63 73 74 79 70 65 29 20 24 73 65 6c  ts($cstype) $sel
0850: 66 0a 09 73 65 74 20 20 20 20 20 6d 79 69 64 6d  f..set     myidm
0860: 61 70 28 24 6d 79 69 64 29 20 24 73 65 6c 66 0a  ap($myid) $self.
0870: 09 66 6f 72 65 61 63 68 20 69 69 64 20 24 69 74  .foreach iid $it
0880: 65 6d 73 20 7b 0a 09 20 20 20 20 73 65 74 20 6b  ems {..    set k
0890: 65 79 20 5b 6c 69 73 74 20 24 63 73 74 79 70 65  ey [list $cstype
08a0: 20 24 69 69 64 5d 0a 09 20 20 20 20 73 65 74 20   $iid]..    set 
08b0: 6d 79 69 74 65 6d 6d 61 70 28 24 6b 65 79 29 20  myitemmap($key) 
08c0: 24 73 65 6c 66 0a 09 20 20 20 20 6c 61 70 70 65  $self..    lappe
08d0: 6e 64 20 6d 79 74 69 74 65 6d 73 20 24 6b 65 79  nd mytitems $key
08e0: 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20  ..    log write 
08f0: 38 20 63 73 65 74 73 20 7b 4d 41 50 2b 20 69 74  8 csets {MAP+ it
0900: 65 6d 20 3c 24 6b 65 79 3e 20 24 73 65 6c 66 20  em <$key> $self 
0910: 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d 7d 0a 09  = [$self str]}..
0920: 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  }..return.    }.
0930: 0a 20 20 20 20 64 65 73 74 72 75 63 74 6f 72 20  .    destructor 
0940: 7b 0a 09 23 20 54 68 65 20 6d 61 69 6e 20 74 68  {..# The main th
0950: 69 6e 67 20 69 73 20 74 6f 20 6b 65 65 70 20 74  ing is to keep t
0960: 72 61 63 6b 20 6f 66 20 74 68 65 20 69 74 65 6d  rack of the item
0970: 6d 61 70 20 61 6e 64 20 72 65 6d 6f 76 65 0a 09  map and remove..
0980: 23 20 74 68 65 20 6f 62 6a 65 63 74 20 66 72 6f  # the object fro
0990: 6d 20 69 74 2e 20 54 68 65 20 6c 69 73 74 73 20  m it. The lists 
09a0: 6f 66 20 63 68 61 6e 67 65 73 65 74 73 20 28 6d  of changesets (m
09b0: 79 63 68 61 6e 67 65 73 65 74 73 2c 0a 09 23 20  ychangesets,..# 
09c0: 6d 79 74 63 68 61 6e 67 65 73 65 74 73 29 20 61  mytchangesets) a
09d0: 72 65 20 6e 6f 74 20 6d 61 69 6e 74 61 69 6e 65  re not maintaine
09e0: 64 20 28 3d 20 72 65 64 75 63 65 64 29 2c 20 66  d (= reduced), f
09f0: 6f 72 20 74 68 65 0a 09 23 20 6d 6f 6d 65 6e 74  or the..# moment
0a00: 2e 20 57 65 20 6d 61 79 20 62 65 20 61 62 6c 65  . We may be able
0a10: 20 74 6f 20 67 65 74 20 72 69 64 20 6f 66 20 74   to get rid of t
0a20: 68 69 73 20 65 6e 74 69 72 65 6c 79 2c 20 61 74  his entirely, at
0a30: 20 6c 65 61 73 74 0a 09 23 20 66 6f 72 20 28 64   least..# for (d
0a40: 65 29 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 61  e)construction a
0a50: 6e 64 20 70 61 73 73 20 49 6e 69 74 43 53 65 74  nd pass InitCSet
0a60: 73 2e 0a 0a 09 66 6f 72 65 61 63 68 20 69 69 64  s....foreach iid
0a70: 20 24 6d 79 69 74 65 6d 73 20 7b 0a 09 20 20 20   $myitems {..   
0a80: 20 73 65 74 20 6b 65 79 20 5b 6c 69 73 74 20 24   set key [list $
0a90: 6d 79 74 79 70 65 20 24 69 69 64 5d 0a 09 20 20  mytype $iid]..  
0aa0: 20 20 75 6e 73 65 74 20 6d 79 69 74 65 6d 6d 61    unset myitemma
0ab0: 70 28 24 6b 65 79 29 0a 09 20 20 20 20 6c 6f 67  p($key)..    log
0ac0: 20 77 72 69 74 65 20 38 20 63 73 65 74 73 20 7b   write 8 csets {
0ad0: 4d 41 50 2d 20 69 74 65 6d 20 3c 24 6b 65 79 3e  MAP- item <$key>
0ae0: 20 24 73 65 6c 66 20 3d 20 5b 24 73 65 6c 66 20   $self = [$self 
0af0: 73 74 72 5d 7d 0a 09 7d 0a 09 72 65 74 75 72 6e  str]}..}..return
0b00: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68  .    }..    meth
0b10: 6f 64 20 73 74 72 20 7b 7d 20 7b 0a 09 73 65 74  od str {} {..set
0b20: 20 73 74 72 20 20 20 20 22 3c 22 0a 09 73 65 74   str    "<"..set
0b30: 20 64 65 74 61 69 6c 20 22 22 0a 09 69 66 20 7b   detail ""..if {
0b40: 5b 24 6d 79 74 79 70 65 6f 62 6a 20 62 79 73 79  [$mytypeobj bysy
0b50: 6d 62 6f 6c 5d 7d 20 7b 0a 09 20 20 20 20 73 65  mbol]} {..    se
0b60: 74 20 64 65 74 61 69 6c 20 22 20 27 5b 73 74 61  t detail " '[sta
0b70: 74 65 20 6f 6e 65 20 7b 0a 09 09 53 45 4c 45 43  te one {...SELEC
0b80: 54 20 53 2e 6e 61 6d 65 0a 09 09 46 52 4f 4d 20  T S.name...FROM 
0b90: 20 20 73 79 6d 62 6f 6c 20 53 0a 09 09 57 48 45    symbol S...WHE
0ba0: 52 45 20 20 53 2e 73 69 64 20 3d 20 24 6d 79 73  RE  S.sid = $mys
0bb0: 72 63 69 64 0a 09 20 20 20 20 7d 5d 27 22 0a 09  rcid..    }]'"..
0bc0: 7d 0a 09 61 70 70 65 6e 64 20 73 74 72 20 22 24  }..append str "$
0bd0: 6d 79 74 79 70 65 20 24 7b 6d 79 69 64 7d 24 7b  mytype ${myid}${
0be0: 64 65 74 61 69 6c 7d 3e 22 0a 09 72 65 74 75 72  detail}>"..retur
0bf0: 6e 20 24 73 74 72 0a 20 20 20 20 7d 0a 0a 20 20  n $str.    }..  
0c00: 20 20 6d 65 74 68 6f 64 20 6c 6f 64 20 7b 7d 20    method lod {} 
0c10: 7b 0a 09 72 65 74 75 72 6e 20 5b 24 6d 79 74 79  {..return [$myty
0c20: 70 65 6f 62 6a 20 63 73 5f 6c 6f 64 20 24 6d 79  peobj cs_lod $my
0c30: 69 74 65 6d 73 5d 0a 20 20 20 20 7d 0a 0a 20 20  items].    }..  
0c40: 20 20 6d 65 74 68 6f 64 20 69 64 20 20 20 20 7b    method id    {
0c50: 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 64  } { return $myid
0c60: 20 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20 69 74   }.    method it
0c70: 65 6d 73 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20  ems {} { return 
0c80: 24 6d 79 74 69 74 65 6d 73 20 7d 0a 20 20 20 20  $mytitems }.    
0c90: 6d 65 74 68 6f 64 20 64 61 74 61 20 20 7b 7d 20  method data  {} 
0ca0: 7b 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24  { return [list $
0cb0: 6d 79 70 72 6f 6a 65 63 74 20 24 6d 79 74 79 70  myproject $mytyp
0cc0: 65 20 24 6d 79 73 72 63 69 64 5d 20 7d 0a 0a 20  e $mysrcid] }.. 
0cd0: 20 20 20 64 65 6c 65 67 61 74 65 20 6d 65 74 68     delegate meth
0ce0: 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 20 74 6f  od bysymbol   to
0cf0: 20 6d 79 74 79 70 65 6f 62 6a 0a 20 20 20 20 64   mytypeobj.    d
0d00: 65 6c 65 67 61 74 65 20 6d 65 74 68 6f 64 20 62  elegate method b
0d10: 79 72 65 76 69 73 69 6f 6e 20 74 6f 20 6d 79 74  yrevision to myt
0d20: 79 70 65 6f 62 6a 0a 20 20 20 20 64 65 6c 65 67  ypeobj.    deleg
0d30: 61 74 65 20 6d 65 74 68 6f 64 20 69 73 62 72 61  ate method isbra
0d40: 6e 63 68 20 20 20 74 6f 20 6d 79 74 79 70 65 6f  nch   to mytypeo
0d50: 62 6a 0a 20 20 20 20 64 65 6c 65 67 61 74 65 20  bj.    delegate 
0d60: 6d 65 74 68 6f 64 20 69 73 74 61 67 20 20 20 20  method istag    
0d70: 20 20 74 6f 20 6d 79 74 79 70 65 6f 62 6a 0a 0a    to mytypeobj..
0d80: 20 20 20 20 6d 65 74 68 6f 64 20 73 65 74 70 6f      method setpo
0d90: 73 20 7b 70 7d 20 7b 20 73 65 74 20 6d 79 70 6f  s {p} { set mypo
0da0: 73 20 24 70 20 3b 20 72 65 74 75 72 6e 20 7d 0a  s $p ; return }.
0db0: 20 20 20 20 6d 65 74 68 6f 64 20 70 6f 73 20 20      method pos  
0dc0: 20 20 7b 7d 20 20 7b 20 72 65 74 75 72 6e 20 24    {}  { return $
0dd0: 6d 79 70 6f 73 20 7d 0a 0a 20 20 20 20 6d 65 74  mypos }..    met
0de0: 68 6f 64 20 64 65 74 65 72 6d 69 6e 65 73 75 63  hod determinesuc
0df0: 63 65 73 73 6f 72 73 20 7b 7d 20 7b 0a 09 23 20  cessors {} {..# 
0e00: 50 61 73 73 20 36 20 6f 70 65 72 61 74 69 6f 6e  Pass 6 operation
0e10: 2e 20 43 6f 6d 70 75 74 65 20 70 72 6f 6a 65 63  . Compute projec
0e20: 74 2d 6c 65 76 65 6c 20 64 65 70 65 6e 64 65 6e  t-level dependen
0e30: 63 69 65 73 20 66 72 6f 6d 0a 09 23 20 74 68 65  cies from..# the
0e40: 20 66 69 6c 65 2d 6c 65 76 65 6c 20 64 61 74 61   file-level data
0e50: 20 61 6e 64 20 73 61 76 65 20 69 74 20 62 61 63   and save it bac
0e60: 6b 20 74 6f 20 74 68 65 20 73 74 61 74 65 2e 20  k to the state. 
0e70: 54 68 69 73 20 6d 61 79 0a 09 23 20 62 65 20 63  This may..# be c
0e80: 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 74 68 65  alled during the
0e90: 20 63 79 63 6c 65 20 62 72 65 61 6b 65 72 20 70   cycle breaker p
0ea0: 61 73 73 65 73 20 61 73 20 77 65 6c 6c 2c 20 74  asses as well, t
0eb0: 6f 20 61 64 6a 75 73 74 0a 09 23 20 74 68 65 20  o adjust..# the 
0ec0: 73 75 63 63 65 73 73 6f 72 20 69 6e 66 6f 72 6d  successor inform
0ed0: 61 74 69 6f 6e 20 6f 66 20 63 68 61 6e 67 65 73  ation of changes
0ee0: 65 74 73 20 77 68 69 63 68 20 61 72 65 20 74 68  ets which are th
0ef0: 65 0a 09 23 20 70 72 65 64 65 63 65 73 73 6f 72  e..# predecessor
0f00: 73 20 6f 66 20 64 72 6f 70 70 65 64 20 63 68 61  s of dropped cha
0f10: 6e 67 65 73 65 74 73 2e 20 46 6f 72 20 74 68 65  ngesets. For the
0f20: 6d 20 77 65 20 68 61 76 65 20 74 6f 0a 09 23 20  m we have to..# 
0f30: 72 65 6d 6f 76 65 20 74 68 65 69 72 20 65 78 69  remove their exi
0f40: 73 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  sting informatio
0f50: 6e 20 66 69 72 73 74 20 62 65 66 6f 72 65 20 69  n first before i
0f60: 6e 73 65 72 74 69 6e 67 20 74 68 65 0a 09 23 20  nserting the..# 
0f70: 6e 65 77 20 64 61 74 61 2e 0a 09 73 74 61 74 65  new data...state
0f80: 20 72 75 6e 20 7b 0a 09 20 20 20 20 44 45 4c 45   run {..    DELE
0f90: 54 45 20 46 52 4f 4d 20 63 73 73 75 63 63 65 73  TE FROM cssucces
0fa0: 73 6f 72 20 57 48 45 52 45 20 63 69 64 20 3d 20  sor WHERE cid = 
0fb0: 24 6d 79 69 64 3b 0a 09 7d 0a 09 73 65 74 20 6c  $myid;..}..set l
0fc0: 6f 6f 70 20 30 0a 09 66 6f 72 65 61 63 68 20 6e  oop 0..foreach n
0fd0: 69 64 20 5b 24 6d 79 74 79 70 65 6f 62 6a 20 63  id [$mytypeobj c
0fe0: 73 5f 73 75 63 63 65 73 73 6f 72 73 20 24 6d 79  s_successors $my
0ff0: 69 74 65 6d 73 5d 20 7b 0a 09 20 20 20 20 73 74  items] {..    st
1000: 61 74 65 20 72 75 6e 20 7b 0a 09 09 49 4e 53 45  ate run {...INSE
1010: 52 54 20 49 4e 54 4f 20 63 73 73 75 63 63 65 73  RT INTO cssucces
1020: 73 6f 72 20 28 63 69 64 2c 20 20 6e 69 64 29 0a  sor (cid,  nid).
1030: 09 09 56 41 4c 55 45 53 20 20 20 20 20 20 20 20  ..VALUES        
1040: 20 20 20 20 20 20 20 20 20 20 28 24 6d 79 69 64            ($myid
1050: 2c 24 6e 69 64 29 0a 09 20 20 20 20 7d 0a 09 20  ,$nid)..    }.. 
1060: 20 20 20 69 66 20 7b 24 6e 69 64 20 3d 3d 20 24     if {$nid == $
1070: 6d 79 69 64 7d 20 7b 20 73 65 74 20 6c 6f 6f 70  myid} { set loop
1080: 20 31 20 7d 0a 09 7d 0a 09 23 20 52 65 70 6f 72   1 }..}..# Repor
1090: 74 20 61 66 74 65 72 20 74 68 65 20 63 6f 6d 70  t after the comp
10a0: 6c 65 74 65 20 73 74 72 75 63 74 75 72 65 20 68  lete structure h
10b0: 61 73 20 62 65 65 6e 20 73 61 76 65 64 2e 0a 09  as been saved...
10c0: 69 66 20 7b 24 6c 6f 6f 70 7d 20 7b 20 24 73 65  if {$loop} { $se
10d0: 6c 66 20 72 65 70 6f 72 74 6c 6f 6f 70 20 7d 0a  lf reportloop }.
10e0: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
10f0: 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69     # result = li
1100: 73 74 20 28 63 68 61 6e 67 65 73 65 74 29 0a 20  st (changeset). 
1110: 20 20 20 6d 65 74 68 6f 64 20 73 75 63 63 65 73     method succes
1120: 73 6f 72 73 20 7b 7d 20 7b 0a 09 23 20 55 73 65  sors {} {..# Use
1130: 20 74 68 65 20 64 61 74 61 20 73 61 76 65 64 20   the data saved 
1140: 62 79 20 70 61 73 73 20 36 2e 0a 09 72 65 74 75  by pass 6...retu
1150: 72 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74  rn [struct::list
1160: 20 6d 61 70 20 5b 73 74 61 74 65 20 72 75 6e 20   map [state run 
1170: 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 53 2e  {..    SELECT S.
1180: 6e 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  nid..    FROM   
1190: 63 73 73 75 63 63 65 73 73 6f 72 20 53 0a 09 20  cssuccessor S.. 
11a0: 20 20 20 57 48 45 52 45 20 20 53 2e 63 69 64 20     WHERE  S.cid 
11b0: 3d 20 24 6d 79 69 64 0a 09 7d 5d 20 5b 6d 79 74  = $myid..}] [myt
11c0: 79 70 65 6d 65 74 68 6f 64 20 6f 66 5d 5d 0a 20  ypemethod of]]. 
11d0: 20 20 20 7d 0a 0a 20 20 20 20 23 20 69 74 65 6d     }..    # item
11e0: 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 0a   -> list (item).
11f0: 20 20 20 20 6d 65 74 68 6f 64 20 6e 65 78 74 6d      method nextm
1200: 61 70 20 7b 7d 20 7b 0a 09 24 6d 79 74 79 70 65  ap {} {..$mytype
1210: 6f 62 6a 20 73 75 63 63 65 73 73 6f 72 73 20 74  obj successors t
1220: 6d 70 20 24 6d 79 69 74 65 6d 73 0a 09 72 65 74  mp $myitems..ret
1230: 75 72 6e 20 5b 61 72 72 61 79 20 67 65 74 20 74  urn [array get t
1240: 6d 70 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d  mp].    }..    m
1250: 65 74 68 6f 64 20 62 72 65 61 6b 69 6e 74 65 72  ethod breakinter
1260: 6e 61 6c 64 65 70 65 6e 64 65 6e 63 69 65 73 20  naldependencies 
1270: 7b 63 76 7d 20 7b 0a 09 75 70 76 61 72 20 31 20  {cv} {..upvar 1 
1280: 24 63 76 20 63 6f 75 6e 74 65 72 0a 09 6c 6f 67  $cv counter..log
1290: 20 77 72 69 74 65 20 31 34 20 63 73 65 74 73 20   write 14 csets 
12a0: 7b 5b 24 73 65 6c 66 20 73 74 72 5d 20 42 49 44  {[$self str] BID
12b0: 7d 0a 09 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d 65  }..vc::tools::me
12c0: 6d 3a 3a 6d 61 72 6b 0a 09 23 23 0a 09 23 23 20  m::mark..##..## 
12d0: 4e 4f 54 45 3a 20 54 68 69 73 20 6d 65 74 68 6f  NOTE: This metho
12e0: 64 2c 20 6d 61 79 62 65 20 69 6e 20 63 6f 6e 6a  d, maybe in conj
12f0: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 69 74 73  unction with its
1300: 20 63 61 6c 6c 65 72 0a 09 23 23 20 20 20 20 20   caller..##     
1310: 20 20 73 65 65 6d 73 20 74 6f 20 62 65 20 61 20    seems to be a 
1320: 6d 65 6d 6f 72 79 20 68 6f 67 2c 20 65 73 70 65  memory hog, espe
1330: 63 69 61 6c 6c 79 20 66 6f 72 20 6c 61 72 67 65  cially for large
1340: 0a 09 23 23 20 20 20 20 20 20 20 63 68 61 6e 67  ..##       chang
1350: 65 73 65 74 73 2c 20 77 69 74 68 20 27 6c 61 72  esets, with 'lar
1360: 67 65 27 20 6d 65 61 6e 69 6e 67 20 74 6f 20 68  ge' meaning to h
1370: 61 76 65 20 61 20 27 6c 6f 6e 67 20 6c 69 73 74  ave a 'long list
1380: 0a 09 23 23 20 20 20 20 20 20 20 6f 66 20 69 74  ..##       of it
1390: 65 6d 73 2c 20 73 65 76 65 72 61 6c 20 74 68 6f  ems, several tho
13a0: 75 73 61 6e 64 27 2e 20 49 6e 76 65 73 74 69 67  usand'. Investig
13b0: 61 74 65 20 77 68 65 72 65 20 74 68 65 0a 09 23  ate where the..#
13c0: 23 20 20 20 20 20 20 20 6d 65 6d 6f 72 79 20 69  #       memory i
13d0: 73 20 73 70 65 6e 74 20 61 6e 64 20 74 68 65 6e  s spent and then
13e0: 20 6c 6f 6f 6b 20 66 6f 72 20 77 61 79 73 20 6f   look for ways o
13f0: 66 20 72 65 63 74 69 66 79 69 6e 67 0a 09 23 23  f rectifying..##
1400: 20 20 20 20 20 20 20 74 68 65 20 70 72 6f 62 6c         the probl
1410: 65 6d 2e 0a 09 23 23 0a 0a 09 23 20 54 68 69 73  em...##...# This
1420: 20 6d 65 74 68 6f 64 20 69 6e 73 70 65 63 74 73   method inspects
1430: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 73 20   the changesets 
1440: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 09 23 20  for internal..# 
1450: 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 4e 6f  dependencies. No
1460: 74 68 69 6e 67 20 69 73 20 64 6f 6e 65 20 69 66  thing is done if
1470: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 0a 09 23   there are no..#
1480: 20 73 75 63 68 2e 20 4f 74 68 65 72 77 69 73 65   such. Otherwise
1490: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 69   the changeset i
14a0: 73 20 73 70 6c 69 74 20 69 6e 74 6f 20 61 20 73  s split into a s
14b0: 65 74 20 6f 66 0a 09 23 20 66 72 61 67 6d 65 6e  et of..# fragmen
14c0: 74 73 20 77 69 74 68 6f 75 74 20 69 6e 74 65 72  ts without inter
14d0: 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73  nal dependencies
14e0: 2c 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74  , transforming t
14f0: 68 65 0a 09 23 20 69 6e 74 65 72 6e 61 6c 20 64  he..# internal d
1500: 65 70 65 6e 64 65 6e 63 69 65 73 20 69 6e 74 6f  ependencies into
1510: 20 65 78 74 65 72 6e 61 6c 20 6f 6e 65 73 2e 20   external ones. 
1520: 54 68 65 20 6e 65 77 20 63 68 61 6e 67 65 73 65  The new changese
1530: 74 73 0a 09 23 20 61 72 65 20 61 64 64 65 64 20  ts..# are added 
1540: 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20 61  to the list of a
1550: 6c 6c 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a  ll changesets...
1560: 09 23 20 57 65 20 70 65 72 66 6f 72 6d 20 61 6c  .# We perform al
1570: 6c 20 6e 65 63 65 73 73 61 72 79 20 73 70 6c 69  l necessary spli
1580: 74 73 20 69 6e 20 6f 6e 65 20 67 6f 2c 20 69 6e  ts in one go, in
1590: 73 74 65 61 64 20 6f 66 20 6f 6e 6c 79 0a 09 23  stead of only..#
15a0: 20 6f 6e 65 2e 20 54 68 65 20 70 72 65 76 69 6f   one. The previo
15b0: 75 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20 61 64  us algorithm, ad
15c0: 61 70 74 65 64 20 66 72 6f 6d 20 63 76 73 32 73  apted from cvs2s
15d0: 76 6e 2c 20 63 6f 6d 70 75 74 65 64 0a 09 23 20  vn, computed..# 
15e0: 61 20 6c 6f 74 20 6f 66 20 73 74 61 74 65 20 77  a lot of state w
15f0: 68 69 63 68 20 77 61 73 20 74 68 72 6f 77 6e 20  hich was thrown 
1600: 61 77 61 79 20 61 6e 64 20 74 68 65 6e 20 63 6f  away and then co
1610: 6d 70 75 74 65 64 20 61 67 61 69 6e 0a 09 23 20  mputed again..# 
1620: 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68 65 20  for each of the 
1630: 66 72 61 67 6d 65 6e 74 73 2e 20 49 74 20 73 68  fragments. It sh
1640: 6f 75 6c 64 20 62 65 20 65 61 73 69 65 72 20 74  ould be easier t
1650: 6f 20 75 70 64 61 74 65 20 61 6e 64 0a 09 23 20  o update and..# 
1660: 72 65 75 73 65 20 74 68 61 74 20 73 74 61 74 65  reuse that state
1670: 2e 0a 0a 09 23 20 54 68 65 20 63 6f 64 65 20 63  ....# The code c
1680: 68 65 63 6b 73 20 6f 6e 6c 79 20 73 75 63 63 65  hecks only succe
1690: 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 69 65  ssor dependencie
16a0: 73 2c 20 61 73 20 74 68 69 73 0a 09 23 20 61 75  s, as this..# au
16b0: 74 6f 6d 61 74 69 63 61 6c 6c 79 20 63 6f 76 65  tomatically cove
16c0: 72 73 20 74 68 65 20 70 72 65 64 65 63 65 73 73  rs the predecess
16d0: 6f 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  or dependencies 
16e0: 61 73 20 77 65 6c 6c 20 28 41 0a 09 23 20 73 75  as well (A..# su
16f0: 63 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e  ccessor dependen
1700: 63 79 20 61 20 2d 3e 20 62 20 69 73 20 61 6c 73  cy a -> b is als
1710: 6f 20 61 20 70 72 65 64 65 63 65 73 73 6f 72 20  o a predecessor 
1720: 64 65 70 65 6e 64 65 6e 63 79 0a 09 23 20 62 20  dependency..# b 
1730: 2d 3e 20 61 29 2e 0a 0a 09 23 20 41 72 72 61 79  -> a)....# Array
1740: 20 6f 66 20 64 65 70 65 6e 64 65 6e 63 69 65 73   of dependencies
1750: 20 28 70 61 72 65 6e 74 20 2d 3e 20 63 68 69 6c   (parent -> chil
1760: 64 29 2e 20 54 68 69 73 20 69 73 20 70 75 6c 6c  d). This is pull
1770: 65 64 20 66 72 6f 6d 0a 09 23 20 74 68 65 20 73  ed from..# the s
1780: 74 61 74 65 2c 20 61 6e 64 20 6c 69 6d 69 74 65  tate, and limite
1790: 64 20 74 6f 20 73 75 63 63 65 73 73 6f 72 73 20  d to successors 
17a0: 77 69 74 68 69 6e 20 74 68 65 20 63 68 61 6e 67  within the chang
17b0: 65 73 65 74 2e 0a 0a 09 61 72 72 61 79 20 73 65  eset....array se
17c0: 74 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 7b  t dependencies {
17d0: 7d 0a 09 24 6d 79 74 79 70 65 6f 62 6a 20 69 6e  }..$mytypeobj in
17e0: 74 65 72 6e 61 6c 73 75 63 63 65 73 73 6f 72 73  ternalsuccessors
17f0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 24 6d   dependencies $m
1800: 79 69 74 65 6d 73 0a 09 69 66 20 7b 21 5b 61 72  yitems..if {![ar
1810: 72 61 79 20 73 69 7a 65 20 64 65 70 65 6e 64 65  ray size depende
1820: 6e 63 69 65 73 5d 7d 20 7b 0a 09 20 20 20 20 72  ncies]} {..    r
1830: 65 74 75 72 6e 20 7b 7d 0a 09 7d 20 3b 20 23 20  eturn {}..} ; # 
1840: 4e 6f 74 68 69 6e 67 20 74 6f 20 62 72 65 61 6b  Nothing to break
1850: 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 35 20  ....log write 5 
1860: 63 73 65 74 73 20 2e 2e 2e 5b 24 73 65 6c 66 20  csets ...[$self 
1870: 73 74 72 5d 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  str]............
1880: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1890: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
18a0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 0a 09 76 63 3a  .............vc:
18b0: 3a 74 6f 6f 6c 73 3a 3a 6d 65 6d 3a 3a 6d 61 72  :tools::mem::mar
18c0: 6b 0a 0a 09 23 20 57 65 20 68 61 76 65 20 69 6e  k...# We have in
18d0: 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63  ternal dependenc
18e0: 69 65 73 20 74 6f 20 62 72 65 61 6b 2e 20 57 65  ies to break. We
18f0: 20 6e 6f 77 20 69 74 65 72 61 74 65 20 6f 76 65   now iterate ove
1900: 72 0a 09 23 20 61 6c 6c 20 70 6f 73 69 74 69 6f  r..# all positio
1910: 6e 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 28  ns in the list (
1920: 77 68 69 63 68 20 69 73 20 63 68 72 6f 6e 6f 6c  which is chronol
1930: 6f 67 69 63 61 6c 2c 20 61 74 20 6c 65 61 73 74  ogical, at least
1940: 0a 09 23 20 61 73 20 66 61 72 20 61 73 20 74 68  ..# as far as th
1950: 65 20 74 69 6d 65 73 74 61 6d 70 73 20 61 72 65  e timestamps are
1960: 20 63 6f 72 72 65 63 74 20 61 6e 64 20 75 6e 69   correct and uni
1970: 71 75 65 29 20 61 6e 64 0a 09 23 20 64 65 74 65  que) and..# dete
1980: 72 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 70  rmine the best p
1990: 6f 73 69 74 69 6f 6e 20 66 6f 72 20 74 68 65 20  osition for the 
19a0: 62 72 65 61 6b 2c 20 62 79 20 74 72 79 69 6e 67  break, by trying
19b0: 20 74 6f 0a 09 23 20 62 72 65 61 6b 20 61 73 20   to..# break as 
19c0: 6d 61 6e 79 20 64 65 70 65 6e 64 65 6e 63 69 65  many dependencie
19d0: 73 20 61 73 20 70 6f 73 73 69 62 6c 65 20 69 6e  s as possible in
19e0: 20 6f 6e 65 20 67 6f 2e 20 57 68 65 6e 20 61 0a   one go. When a.
19f0: 09 23 20 62 72 65 61 6b 20 77 61 73 20 66 6f 75  .# break was fou
1a00: 6e 64 20 74 68 69 73 20 69 73 20 72 65 64 6f 6e  nd this is redon
1a10: 65 20 66 6f 72 20 74 68 65 20 66 72 61 67 6d 65  e for the fragme
1a20: 6e 74 73 20 63 6f 6d 69 6e 67 20 61 6e 64 0a 09  nts coming and..
1a30: 23 20 61 66 74 65 72 2c 20 61 66 74 65 72 20 75  # after, after u
1a40: 70 64 69 6e 67 20 74 68 65 20 63 72 6f 73 73 69  pding the crossi
1a50: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  ng information..
1a60: 0a 09 23 20 44 61 74 61 20 73 74 72 75 63 74 75  ..# Data structu
1a70: 72 65 73 3a 0a 09 23 20 4d 61 70 3a 20 20 50 4f  res:..# Map:  PO
1a80: 53 20 20 20 72 65 76 69 73 69 6f 6e 20 69 64 20  S   revision id 
1a90: 20 20 20 20 20 2d 3e 20 70 6f 73 69 74 69 6f 6e       -> position
1aa0: 20 69 6e 20 6c 69 73 74 2e 0a 09 23 20 20 20 20   in list...#    
1ab0: 20 20 20 43 52 4f 53 53 20 70 6f 73 69 74 69 6f     CROSS positio
1ac0: 6e 20 69 6e 20 6c 69 73 74 20 2d 3e 20 6e 75 6d  n in list -> num
1ad0: 62 65 72 20 6f 66 20 64 65 70 65 6e 64 65 6e 63  ber of dependenc
1ae0: 69 65 73 20 63 72 6f 73 73 69 6e 67 20 69 74 0a  ies crossing it.
1af0: 09 23 20 20 20 20 20 20 20 44 45 50 43 20 20 64  .#       DEPC  d
1b00: 65 70 65 6e 64 65 6e 63 79 20 20 20 20 20 20 20  ependency       
1b10: 2d 3e 20 70 6f 73 69 74 69 6f 6e 73 20 69 74 20  -> positions it 
1b20: 63 72 6f 73 73 65 73 0a 09 23 20 4c 69 73 74 3a  crosses..# List:
1b30: 20 52 41 4e 47 45 20 4f 66 20 74 68 65 20 70 6f   RANGE Of the po
1b40: 73 69 74 69 6f 6e 73 20 69 74 73 65 6c 66 2e 0a  sitions itself..
1b50: 09 23 20 4d 61 70 3a 20 20 44 45 4c 54 41 20 70  .# Map:  DELTA p
1b60: 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73 74 20  osition in list 
1b70: 2d 3e 20 74 69 6d 65 20 64 65 6c 74 61 20 62 65  -> time delta be
1b80: 74 77 65 65 6e 20 69 74 73 20 72 65 76 69 73 69  tween its revisi
1b90: 6f 6e 0a 09 23 20 20 20 20 20 20 20 20 20 20 20  on..#           
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb0: 20 20 20 20 20 20 61 6e 64 20 74 68 65 20 6e 65        and the ne
1bc0: 78 74 2c 20 69 66 20 61 6e 79 2e 0a 09 23 20 41  xt, if any...# A
1bd0: 20 64 65 70 65 6e 64 65 6e 63 79 20 69 73 20 61   dependency is a
1be0: 20 73 69 6e 67 6c 65 2d 65 6c 65 6d 65 6e 74 20   single-element 
1bf0: 6d 61 70 20 70 61 72 65 6e 74 20 2d 3e 20 63 68  map parent -> ch
1c00: 69 6c 64 0a 0a 09 23 20 49 6e 69 74 69 61 6c 69  ild...# Initiali
1c10: 7a 65 42 72 65 61 6b 53 74 61 74 65 20 69 6e 69  zeBreakState ini
1c20: 74 69 61 6c 69 7a 65 73 20 74 68 65 69 72 20 63  tializes their c
1c30: 6f 6e 74 65 6e 74 73 20 61 66 74 65 72 0a 09 23  ontents after..#
1c40: 20 75 70 76 61 72 27 69 6e 67 20 74 68 65 6d 20   upvar'ing them 
1c50: 66 72 6f 6d 20 74 68 69 73 20 73 63 6f 70 65 2e  from this scope.
1c60: 20 49 74 20 75 73 65 73 20 74 68 65 20 69 6e 66   It uses the inf
1c70: 6f 72 6d 61 74 69 6f 6e 20 69 6e 0a 09 23 20 44  ormation in..# D
1c80: 45 50 45 4e 44 45 4e 43 49 45 53 20 74 6f 20 64  EPENDENCIES to d
1c90: 6f 20 73 6f 2e 0a 0a 09 49 6e 69 74 69 61 6c 69  o so....Initiali
1ca0: 7a 65 42 72 65 61 6b 53 74 61 74 65 20 24 6d 79  zeBreakState $my
1cb0: 69 74 65 6d 73 0a 0a 09 73 65 74 20 66 72 61 67  items...set frag
1cc0: 6d 65 6e 74 73 20 7b 7d 0a 09 73 65 74 20 6e 65  ments {}..set ne
1cd0: 77 20 20 20 20 20 20 20 5b 6c 69 73 74 20 24 72  w       [list $r
1ce0: 61 6e 67 65 5d 0a 09 61 72 72 61 79 20 73 65 74  ange]..array set
1cf0: 20 62 72 65 61 6b 73 20 7b 7d 0a 0a 09 23 20 49   breaks {}...# I
1d00: 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 20 6c 69  nstead of one li
1d10: 73 74 20 68 6f 6c 64 69 6e 67 20 62 6f 74 68 20  st holding both 
1d20: 70 72 6f 63 65 73 73 65 64 20 61 6e 64 20 70 65  processed and pe
1d30: 6e 64 69 6e 67 0a 09 23 20 66 72 61 67 6d 65 6e  nding..# fragmen
1d40: 74 73 20 77 65 20 75 73 65 20 74 77 6f 2c 20 6f  ts we use two, o
1d50: 6e 65 20 66 6f 72 20 74 68 65 20 66 72 61 6d 65  ne for the frame
1d60: 6e 74 73 20 74 6f 20 70 72 6f 63 65 73 73 2c 20  nts to process, 
1d70: 6f 6e 65 0a 09 23 20 74 6f 20 68 6f 6c 64 20 74  one..# to hold t
1d80: 68 65 20 6e 65 77 20 66 72 61 67 6d 65 6e 74 73  he new fragments
1d90: 2c 20 61 6e 64 20 74 68 65 20 6c 61 74 74 65 72  , and the latter
1da0: 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68   is copied to th
1db0: 65 0a 09 23 20 66 6f 72 6d 65 72 20 77 68 65 6e  e..# former when
1dc0: 20 74 68 65 79 20 72 75 6e 20 6f 75 74 2e 20 54   they run out. T
1dd0: 68 69 73 20 6b 65 65 70 73 20 74 68 65 20 6c 69  his keeps the li
1de0: 73 74 20 6f 66 20 70 65 6e 64 69 6e 67 0a 09 23  st of pending..#
1df0: 20 66 72 61 67 6d 65 6e 74 73 20 73 68 6f 72 74   fragments short
1e00: 20 77 69 74 68 6f 75 74 20 73 61 63 72 69 66 69   without sacrifi
1e10: 63 69 6e 67 20 73 70 65 65 64 20 62 79 20 73 68  cing speed by sh
1e20: 69 66 74 69 6e 67 20 73 74 75 66 66 0a 09 23 20  ifting stuff..# 
1e30: 64 6f 77 6e 2e 20 57 65 20 65 73 70 65 63 69 61  down. We especia
1e40: 6c 6c 79 20 64 72 6f 70 20 74 68 65 20 6d 65 6d  lly drop the mem
1e50: 6f 72 79 20 6f 66 20 66 72 61 67 6d 65 6e 74 73  ory of fragments
1e60: 20 62 72 6f 6b 65 6e 0a 09 23 20 64 75 72 69 6e   broken..# durin
1e70: 67 20 70 72 6f 63 65 73 73 69 6e 67 20 61 66 74  g processing aft
1e80: 65 72 20 61 20 73 68 6f 72 74 20 74 69 6d 65 2c  er a short time,
1e90: 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74   instead of lett
1ea0: 69 6e 67 20 69 74 0a 09 23 20 63 6f 6e 73 75 6d  ing it..# consum
1eb0: 65 20 6d 65 6d 6f 72 79 2e 0a 0a 09 77 68 69 6c  e memory....whil
1ec0: 65 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6e 65 77  e {[llength $new
1ed0: 5d 7d 20 7b 0a 0a 09 20 20 20 20 73 65 74 20 70  ]} {...    set p
1ee0: 65 6e 64 69 6e 67 20 24 6e 65 77 0a 09 20 20 20  ending $new..   
1ef0: 20 73 65 74 20 6e 65 77 20 20 20 20 20 7b 7d 0a   set new     {}.
1f00: 09 20 20 20 20 73 65 74 20 61 74 20 20 20 20 20  .    set at     
1f10: 20 30 0a 0a 09 20 20 20 20 77 68 69 6c 65 20 7b   0...    while {
1f20: 24 61 74 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24  $at < [llength $
1f30: 70 65 6e 64 69 6e 67 5d 7d 20 7b 0a 09 09 73 65  pending]} {...se
1f40: 74 20 63 75 72 72 65 6e 74 20 5b 6c 69 6e 64 65  t current [linde
1f50: 78 20 24 70 65 6e 64 69 6e 67 20 24 61 74 5d 0a  x $pending $at].
1f60: 0a 09 09 6c 6f 67 20 77 72 69 74 65 20 36 20 63  ...log write 6 c
1f70: 73 65 74 73 20 7b 2e 20 2e 20 2e 2e 20 2e 2e 2e  sets {. . .. ...
1f80: 20 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 20   ..... ........ 
1f90: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 7d 0a 09  .............}..
1fa0: 09 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65  .log write 6 cse
1fb0: 74 73 20 7b 53 63 68 65 64 75 6c 65 64 20 20 20  ts {Scheduled   
1fc0: 5b 6a 6f 69 6e 20 5b 50 52 73 20 5b 6c 72 61 6e  [join [PRs [lran
1fd0: 67 65 20 24 70 65 6e 64 69 6e 67 20 24 61 74 20  ge $pending $at 
1fe0: 65 6e 64 5d 5d 20 7b 20 7d 5d 7d 0a 09 09 6c 6f  end]] { }]}...lo
1ff0: 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20  g write 6 csets 
2000: 7b 43 6f 6e 73 69 64 65 72 69 6e 67 20 5b 50 52  {Considering [PR
2010: 20 24 63 75 72 72 65 6e 74 5d 20 5c 5b 24 61 74   $current] \[$at
2020: 2f 5b 6c 6c 65 6e 67 74 68 20 24 70 65 6e 64 69  /[llength $pendi
2030: 6e 67 5d 5c 5d 7d 0a 0a 09 09 73 65 74 20 62 65  ng]\]}....set be
2040: 73 74 20 5b 46 69 6e 64 42 65 73 74 42 72 65 61  st [FindBestBrea
2050: 6b 20 24 63 75 72 72 65 6e 74 5d 0a 0a 09 09 69  k $current]....i
2060: 66 20 7b 24 62 65 73 74 20 3c 20 30 7d 20 7b 0a  f {$best < 0} {.
2070: 09 09 20 20 20 20 23 20 54 68 65 20 69 6e 73 70  ..    # The insp
2080: 65 63 74 65 64 20 72 61 6e 67 65 20 68 61 73 20  ected range has 
2090: 6e 6f 20 69 6e 74 65 72 6e 61 6c 0a 09 09 20 20  no internal...  
20a0: 20 20 23 20 64 65 70 65 6e 64 65 6e 63 69 65 73    # dependencies
20b0: 2e 20 54 68 69 73 20 69 73 20 61 20 63 6f 6d 70  . This is a comp
20c0: 6c 65 74 65 20 66 72 61 67 6d 65 6e 74 2e 0a 09  lete fragment...
20d0: 09 20 20 20 20 6c 61 70 70 65 6e 64 20 66 72 61  .    lappend fra
20e0: 67 6d 65 6e 74 73 20 24 63 75 72 72 65 6e 74 0a  gments $current.
20f0: 0a 09 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65  ...    log write
2100: 20 36 20 63 73 65 74 73 20 22 4e 6f 20 62 72 65   6 csets "No bre
2110: 61 6b 73 2c 20 66 69 6e 61 6c 22 0a 09 09 7d 20  aks, final"...} 
2120: 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 23 20 53  else {...    # S
2130: 70 6c 69 74 20 74 68 65 20 72 61 6e 67 65 20 61  plit the range a
2140: 6e 64 20 73 63 68 65 64 75 6c 65 20 74 68 65 20  nd schedule the 
2150: 72 65 73 75 6c 74 69 6e 67 0a 09 09 20 20 20 20  resulting...    
2160: 23 20 66 72 61 67 6d 65 6e 74 73 20 66 6f 72 20  # fragments for 
2170: 66 75 72 74 68 65 72 20 69 6e 73 70 65 63 74 69  further inspecti
2180: 6f 6e 2e 20 52 65 6d 65 6d 62 65 72 20 74 68 65  on. Remember the
2190: 0a 09 09 20 20 20 20 23 20 6e 75 6d 62 65 72 20  ...    # number 
21a0: 6f 66 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  of dependencies 
21b0: 63 75 74 20 62 65 66 6f 72 65 20 77 65 20 72 65  cut before we re
21c0: 6d 6f 76 65 20 74 68 65 6d 0a 09 09 20 20 20 20  move them...    
21d0: 23 20 66 72 6f 6d 20 63 6f 6e 73 69 64 65 72 61  # from considera
21e0: 74 69 6f 6e 2c 20 66 6f 72 20 64 6f 63 75 6d 65  tion, for docume
21f0: 6e 74 61 74 69 6f 6e 20 6c 61 74 65 72 2e 0a 0a  ntation later...
2200: 09 09 20 20 20 20 73 65 74 20 62 72 65 61 6b 73  ..    set breaks
2210: 28 24 62 65 73 74 29 20 24 63 72 6f 73 73 28 24  ($best) $cross($
2220: 62 65 73 74 29 0a 0a 09 09 20 20 20 20 6c 6f 67  best)....    log
2230: 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22   write 6 csets "
2240: 42 65 73 74 20 62 72 65 61 6b 20 40 20 24 62 65  Best break @ $be
2250: 73 74 2c 20 63 75 74 74 69 6e 67 20 5b 6e 73 70  st, cutting [nsp
2260: 20 24 63 72 6f 73 73 28 24 62 65 73 74 29 20 64   $cross($best) d
2270: 65 70 65 6e 64 65 6e 63 79 20 64 65 70 65 6e 64  ependency depend
2280: 65 6e 63 69 65 73 5d 22 0a 0a 09 09 20 20 20 20  encies]"....    
2290: 23 20 4e 6f 74 65 3a 20 54 68 65 20 76 61 6c 75  # Note: The valu
22a0: 65 20 6f 66 20 62 65 73 74 20 69 73 20 61 6e 20  e of best is an 
22b0: 61 62 6f 6c 75 74 65 20 6c 6f 63 61 74 69 6f 6e  abolute location
22c0: 0a 09 09 20 20 20 20 23 20 69 6e 20 6d 79 69 74  ...    # in myit
22d0: 65 6d 73 2e 20 55 73 65 20 74 68 65 20 73 74 61  ems. Use the sta
22e0: 72 74 20 6f 66 20 63 75 72 72 65 6e 74 20 74 6f  rt of current to
22f0: 20 6d 61 6b 65 20 69 74 0a 09 09 20 20 20 20 23   make it...    #
2300: 20 61 6e 20 69 6e 64 65 78 20 61 62 73 6f 6c 75   an index absolu
2310: 74 65 20 74 6f 20 63 75 72 72 65 6e 74 2e 0a 0a  te to current...
2320: 09 09 20 20 20 20 73 65 74 20 62 72 65 6c 20 5b  ..    set brel [
2330: 65 78 70 72 20 7b 24 62 65 73 74 20 2d 20 5b 6c  expr {$best - [l
2340: 69 6e 64 65 78 20 24 63 75 72 72 65 6e 74 20 30  index $current 0
2350: 5d 7d 5d 0a 09 09 20 20 20 20 73 65 74 20 62 6e  ]}]...    set bn
2360: 65 78 74 20 24 62 72 65 6c 20 3b 20 69 6e 63 72  ext $brel ; incr
2370: 20 62 6e 65 78 74 0a 09 09 20 20 20 20 73 65 74   bnext...    set
2380: 20 66 72 61 67 62 65 66 6f 72 65 20 5b 6c 72 61   fragbefore [lra
2390: 6e 67 65 20 24 63 75 72 72 65 6e 74 20 30 20 24  nge $current 0 $
23a0: 62 72 65 6c 5d 0a 09 09 20 20 20 20 73 65 74 20  brel]...    set 
23b0: 66 72 61 67 61 66 74 65 72 20 20 5b 6c 72 61 6e  fragafter  [lran
23c0: 67 65 20 24 63 75 72 72 65 6e 74 20 24 62 6e 65  ge $current $bne
23d0: 78 74 20 65 6e 64 5d 0a 0a 09 09 20 20 20 20 6c  xt end]....    l
23e0: 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73  og write 6 csets
23f0: 20 22 4e 65 77 20 70 69 65 63 65 73 20 20 5b 50   "New pieces  [P
2400: 52 20 24 66 72 61 67 62 65 66 6f 72 65 5d 20 5b  R $fragbefore] [
2410: 50 52 20 24 66 72 61 67 61 66 74 65 72 5d 22 0a  PR $fragafter]".
2420: 0a 09 09 20 20 20 20 69 6e 74 65 67 72 69 74 79  ...    integrity
2430: 20 61 73 73 65 72 74 20 7b 5b 6c 6c 65 6e 67 74   assert {[llengt
2440: 68 20 24 66 72 61 67 62 65 66 6f 72 65 5d 7d 20  h $fragbefore]} 
2450: 7b 46 6f 75 6e 64 20 7a 65 72 6f 2d 6c 65 6e 67  {Found zero-leng
2460: 74 68 20 66 72 61 67 6d 65 6e 74 20 61 74 20 74  th fragment at t
2470: 68 65 20 62 65 67 69 6e 6e 69 6e 67 7d 0a 09 09  he beginning}...
2480: 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73      integrity as
2490: 73 65 72 74 20 7b 5b 6c 6c 65 6e 67 74 68 20 24  sert {[llength $
24a0: 66 72 61 67 61 66 74 65 72 5d 7d 20 20 7b 46 6f  fragafter]}  {Fo
24b0: 75 6e 64 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20  und zero-length 
24c0: 66 72 61 67 6d 65 6e 74 20 61 74 20 74 68 65 20  fragment at the 
24d0: 65 6e 64 7d 0a 0a 09 09 20 20 20 20 6c 61 70 70  end}....    lapp
24e0: 65 6e 64 20 6e 65 77 20 24 66 72 61 67 62 65 66  end new $fragbef
24f0: 6f 72 65 20 24 66 72 61 67 61 66 74 65 72 0a 09  ore $fragafter..
2500: 09 20 20 20 20 43 75 74 41 74 20 24 62 65 73 74  .    CutAt $best
2510: 0a 09 09 7d 0a 0a 09 09 69 6e 63 72 20 61 74 0a  ...}....incr at.
2520: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 6c 6f 67 20  .    }..}...log 
2530: 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22 2e  write 6 csets ".
2540: 20 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20   . .. ... ..... 
2550: 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e  ........ .......
2560: 2e 2e 2e 2e 2e 2e 22 0a 0a 09 23 20 28 2a 29 20  ......"...# (*) 
2570: 57 65 20 63 6c 65 61 72 20 6f 75 74 20 74 68 65  We clear out the
2580: 20 61 73 73 6f 63 69 61 74 65 64 20 70 61 72 74   associated part
2590: 20 6f 66 20 74 68 65 20 6d 79 69 74 65 6d 6d 61   of the myitemma
25a0: 70 0a 09 23 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  p..# in-memory i
25b0: 6e 64 65 78 20 69 6e 20 70 72 65 70 61 72 61 74  ndex in preparat
25c0: 69 6f 6e 20 66 6f 72 20 6e 65 77 20 64 61 74 61  ion for new data
25d0: 2e 20 41 20 73 69 6d 70 6c 65 20 75 6e 73 65 74  . A simple unset
25e0: 0a 09 23 20 69 73 20 65 6e 6f 75 67 68 2c 20 77  ..# is enough, w
25f0: 65 20 68 61 76 65 20 6e 6f 20 73 79 6d 62 6f 6c  e have no symbol
2600: 20 63 68 61 6e 67 65 73 65 74 73 20 61 74 20 74   changesets at t
2610: 68 69 73 20 74 69 6d 65 2c 20 61 6e 64 0a 09 23  his time, and..#
2620: 20 74 68 75 73 20 6e 65 76 65 72 20 6d 6f 72 65   thus never more
2630: 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65   than one refere
2640: 6e 63 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e  nce in the list.
2650: 0a 0a 09 66 6f 72 65 61 63 68 20 69 69 64 20 24  ...foreach iid $
2660: 6d 79 69 74 65 6d 73 20 7b 0a 09 20 20 20 20 73  myitems {..    s
2670: 65 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79  et key [list $my
2680: 74 79 70 65 20 24 69 69 64 5d 0a 09 20 20 20 20  type $iid]..    
2690: 75 6e 73 65 74 20 6d 79 69 74 65 6d 6d 61 70 28  unset myitemmap(
26a0: 24 6b 65 79 29 0a 09 20 20 20 20 6c 6f 67 20 77  $key)..    log w
26b0: 72 69 74 65 20 38 20 63 73 65 74 73 20 7b 4d 41  rite 8 csets {MA
26c0: 50 2d 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24  P- item <$key> $
26d0: 73 65 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74  self = [$self st
26e0: 72 5d 7d 0a 09 7d 0a 0a 09 23 20 43 72 65 61 74  r]}..}...# Creat
26f0: 65 20 63 68 61 6e 67 65 73 65 74 73 20 66 6f 72  e changesets for
2700: 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 2c 20   the fragments, 
2710: 72 65 75 73 69 6e 67 20 74 68 65 20 63 75 72 72  reusing the curr
2720: 65 6e 74 20 6f 6e 65 0a 09 23 20 66 6f 72 20 74  ent one..# for t
2730: 68 65 20 66 69 72 73 74 20 66 72 61 67 6d 65 6e  he first fragmen
2740: 74 2e 20 57 65 20 73 6f 72 74 20 74 68 65 6d 20  t. We sort them 
2750: 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 6c 6c 6f  in order to allo
2760: 77 0a 09 23 20 63 68 65 63 6b 69 6e 67 20 66 6f  w..# checking fo
2770: 72 20 67 61 70 73 20 61 6e 64 20 6e 69 63 65 20  r gaps and nice 
2780: 6d 65 73 73 61 67 65 73 2e 0a 0a 09 73 65 74 20  messages....set 
2790: 6e 65 77 63 73 65 74 73 20 20 7b 7d 0a 09 73 65  newcsets  {}..se
27a0: 74 20 66 72 61 67 6d 65 6e 74 73 20 5b 6c 73 6f  t fragments [lso
27b0: 72 74 20 2d 69 6e 64 65 78 20 30 20 2d 69 6e 74  rt -index 0 -int
27c0: 65 67 65 72 20 24 66 72 61 67 6d 65 6e 74 73 5d  eger $fragments]
27d0: 0a 0a 09 23 70 75 74 73 20 5c 74 2e 5b 6a 6f 69  ...#puts \t.[joi
27e0: 6e 20 5b 50 52 73 20 24 66 72 61 67 6d 65 6e 74  n [PRs $fragment
27f0: 73 5d 20 2e 5c 6e 5c 74 2e 5d 2e 0a 0a 09 42 6f  s] .\n\t.]....Bo
2800: 72 64 65 72 20 5b 6c 69 6e 64 65 78 20 24 66 72  rder [lindex $fr
2810: 61 67 6d 65 6e 74 73 20 30 5d 20 66 69 72 73 74  agments 0] first
2820: 73 20 66 69 72 73 74 65 0a 0a 09 69 6e 74 65 67  s firste...integ
2830: 72 69 74 79 20 61 73 73 65 72 74 20 7b 24 66 69  rity assert {$fi
2840: 72 73 74 73 20 3d 3d 20 30 7d 20 7b 42 61 64 20  rsts == 0} {Bad 
2850: 66 72 61 67 6d 65 6e 74 20 73 74 61 72 74 20 40  fragment start @
2860: 20 24 66 69 72 73 74 73 2c 20 67 61 70 2c 20 6f   $firsts, gap, o
2870: 72 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69  r before beginni
2880: 6e 67 20 6f 66 20 74 68 65 20 72 61 6e 67 65 7d  ng of the range}
2890: 0a 0a 09 73 65 74 20 6c 61 73 74 65 20 24 66 69  ...set laste $fi
28a0: 72 73 74 65 0a 09 66 6f 72 65 61 63 68 20 66 72  rste..foreach fr
28b0: 61 67 6d 65 6e 74 20 5b 6c 72 61 6e 67 65 20 24  agment [lrange $
28c0: 66 72 61 67 6d 65 6e 74 73 20 31 20 65 6e 64 5d  fragments 1 end]
28d0: 20 7b 0a 09 20 20 20 20 42 6f 72 64 65 72 20 24   {..    Border $
28e0: 66 72 61 67 6d 65 6e 74 20 73 20 65 0a 09 20 20  fragment s e..  
28f0: 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 65    integrity asse
2900: 72 74 20 7b 24 6c 61 73 74 65 20 3d 3d 20 28 24  rt {$laste == ($
2910: 73 20 2d 20 31 29 7d 20 7b 42 61 64 20 66 72 61  s - 1)} {Bad fra
2920: 67 6d 65 6e 74 20 62 6f 72 64 65 72 20 3c 24 6c  gment border <$l
2930: 61 73 74 65 20 7c 20 24 73 3e 2c 20 67 61 70 20  aste | $s>, gap 
2940: 6f 72 20 6f 76 65 72 6c 61 70 7d 0a 0a 09 20 20  or overlap}...  
2950: 20 20 73 65 74 20 6e 65 77 20 5b 24 74 79 70 65    set new [$type
2960: 20 25 41 55 54 4f 25 20 24 6d 79 70 72 6f 6a 65   %AUTO% $myproje
2970: 63 74 20 24 6d 79 74 79 70 65 20 24 6d 79 73 72  ct $mytype $mysr
2980: 63 69 64 20 5b 6c 72 61 6e 67 65 20 24 6d 79 69  cid [lrange $myi
2990: 74 65 6d 73 20 24 73 20 24 65 5d 5d 0a 09 20 20  tems $s $e]]..  
29a0: 20 20 6c 61 70 70 65 6e 64 20 6e 65 77 63 73 65    lappend newcse
29b0: 74 73 20 24 6e 65 77 0a 09 20 20 20 20 69 6e 63  ts $new..    inc
29c0: 72 20 63 6f 75 6e 74 65 72 0a 0a 20 20 20 20 20  r counter..     
29d0: 20 20 20 20 20 20 20 6c 6f 67 20 77 72 69 74 65         log write
29e0: 20 34 20 63 73 65 74 73 20 22 42 72 65 61 6b 69   4 csets "Breaki
29f0: 6e 67 20 5b 24 73 65 6c 66 20 73 74 72 20 5d 20  ng [$self str ] 
2a00: 40 20 24 6c 61 73 74 65 2c 20 6e 65 77 20 5b 24  @ $laste, new [$
2a10: 6e 65 77 20 73 74 72 5d 2c 20 63 75 74 74 69 6e  new str], cuttin
2a20: 67 20 24 62 72 65 61 6b 73 28 24 6c 61 73 74 65  g $breaks($laste
2a30: 29 22 0a 0a 09 20 20 20 20 73 65 74 20 6c 61 73  )"...    set las
2a40: 74 65 20 24 65 0a 09 7d 0a 0a 09 69 6e 74 65 67  te $e..}...integ
2a50: 72 69 74 79 20 61 73 73 65 72 74 20 7b 0a 09 20  rity assert {.. 
2a60: 20 20 20 24 6c 61 73 74 65 20 3d 3d 20 28 5b 6c     $laste == ([l
2a70: 6c 65 6e 67 74 68 20 24 6d 79 69 74 65 6d 73 5d  length $myitems]
2a80: 2d 31 29 0a 09 7d 20 7b 42 61 64 20 66 72 61 67  -1)..} {Bad frag
2a90: 6d 65 6e 74 20 65 6e 64 20 40 20 24 6c 61 73 74  ment end @ $last
2aa0: 65 2c 20 67 61 70 2c 20 6f 72 20 62 65 79 6f 6e  e, gap, or beyon
2ab0: 64 20 65 6e 64 20 6f 66 20 74 68 65 20 72 61 6e  d end of the ran
2ac0: 67 65 7d 0a 0a 09 23 20 50 75 74 20 74 68 65 20  ge}...# Put the 
2ad0: 66 69 72 73 74 20 66 72 61 67 6d 65 6e 74 20 69  first fragment i
2ae0: 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
2af0: 63 68 61 6e 67 65 73 65 74 2c 20 61 6e 64 0a 09  changeset, and..
2b00: 23 20 75 70 64 61 74 65 20 74 68 65 20 69 6e 2d  # update the in-
2b10: 6d 65 6d 6f 72 79 20 69 6e 64 65 78 2e 20 57 65  memory index. We
2b20: 20 63 61 6e 20 73 69 6d 70 6c 79 20 28 72 65 29   can simply (re)
2b30: 61 64 64 20 74 68 65 20 69 74 65 6d 73 0a 09 23  add the items..#
2b40: 20 62 65 63 61 75 73 65 20 77 65 20 63 6c 65 61   because we clea
2b50: 72 65 64 20 74 68 65 20 70 72 65 76 69 6f 75 73  red the previous
2b60: 6c 79 20 65 78 69 73 74 69 6e 67 20 69 6e 66 6f  ly existing info
2b70: 72 6d 61 74 69 6f 6e 2c 20 73 65 65 0a 09 23 20  rmation, see..# 
2b80: 28 2a 29 20 61 62 6f 76 65 2e 20 50 65 72 73 69  (*) above. Persi
2b90: 73 74 65 6e 63 65 20 64 6f 65 73 20 6e 6f 74 20  stence does not 
2ba0: 6d 61 74 74 65 72 20 68 65 72 65 2c 20 6e 6f 6e  matter here, non
2bb0: 65 20 6f 66 20 74 68 65 0a 09 23 20 63 68 61 6e  e of the..# chan
2bc0: 67 65 73 65 74 73 20 68 61 73 20 62 65 65 6e 20  gesets has been 
2bd0: 73 61 76 65 64 20 74 6f 20 74 68 65 20 70 65 72  saved to the per
2be0: 73 69 73 74 65 6e 74 20 73 74 61 74 65 20 79 65  sistent state ye
2bf0: 74 2e 0a 0a 09 73 65 74 20 6d 79 69 74 65 6d 73  t....set myitems
2c00: 20 20 5b 6c 72 61 6e 67 65 20 24 6d 79 69 74 65    [lrange $myite
2c10: 6d 73 20 20 30 20 24 66 69 72 73 74 65 5d 0a 09  ms  0 $firste]..
2c20: 73 65 74 20 6d 79 74 69 74 65 6d 73 20 5b 6c 72  set mytitems [lr
2c30: 61 6e 67 65 20 24 6d 79 74 69 74 65 6d 73 20 30  ange $mytitems 0
2c40: 20 24 66 69 72 73 74 65 5d 0a 09 66 6f 72 65 61   $firste]..forea
2c50: 63 68 20 69 69 64 20 24 6d 79 69 74 65 6d 73 20  ch iid $myitems 
2c60: 7b 0a 09 20 20 20 20 73 65 74 20 6b 65 79 20 5b  {..    set key [
2c70: 6c 69 73 74 20 24 6d 79 74 79 70 65 20 24 69 69  list $mytype $ii
2c80: 64 5d 0a 09 20 20 20 20 73 65 74 20 6d 79 69 74  d]..    set myit
2c90: 65 6d 6d 61 70 28 24 6b 65 79 29 20 24 73 65 6c  emmap($key) $sel
2ca0: 66 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65  f..    log write
2cb0: 20 38 20 63 73 65 74 73 20 7b 4d 41 50 2b 20 69   8 csets {MAP+ i
2cc0: 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73 65 6c 66  tem <$key> $self
2cd0: 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d 7d 0a   = [$self str]}.
2ce0: 09 7d 0a 0a 09 72 65 74 75 72 6e 20 24 6e 65 77  .}...return $new
2cf0: 63 73 65 74 73 0a 20 20 20 20 7d 0a 0a 20 20 20  csets.    }..   
2d00: 20 6d 65 74 68 6f 64 20 70 65 72 73 69 73 74 20   method persist 
2d10: 7b 7d 20 7b 0a 09 73 65 74 20 74 69 64 20 24 6d  {} {..set tid $m
2d20: 79 63 73 74 79 70 65 28 24 6d 79 74 79 70 65 29  ycstype($mytype)
2d30: 0a 09 73 65 74 20 70 69 64 20 5b 24 6d 79 70 72  ..set pid [$mypr
2d40: 6f 6a 65 63 74 20 69 64 5d 0a 09 73 65 74 20 70  oject id]..set p
2d50: 6f 73 20 30 0a 0a 09 73 74 61 74 65 20 74 72 61  os 0...state tra
2d60: 6e 73 61 63 74 69 6f 6e 20 7b 0a 09 20 20 20 20  nsaction {..    
2d70: 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 49 4e  state run {...IN
2d80: 53 45 52 54 20 49 4e 54 4f 20 63 68 61 6e 67 65  SERT INTO change
2d90: 73 65 74 20 28 63 69 64 2c 20 20 20 70 69 64 2c  set (cid,   pid,
2da0: 20 20 74 79 70 65 2c 20 73 72 63 29 0a 09 09 56    type, src)...V
2db0: 41 4c 55 45 53 20 20 20 20 20 20 20 20 20 20 20  ALUES           
2dc0: 20 20 20 20 20 28 24 6d 79 69 64 2c 20 24 70 69       ($myid, $pi
2dd0: 64 2c 20 24 74 69 64 2c 20 24 6d 79 73 72 63 69  d, $tid, $mysrci
2de0: 64 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20  d);..    }...   
2df0: 20 66 6f 72 65 61 63 68 20 69 69 64 20 24 6d 79   foreach iid $my
2e00: 69 74 65 6d 73 20 7b 0a 09 09 73 74 61 74 65 20  items {...state 
2e10: 72 75 6e 20 7b 0a 09 09 20 20 20 20 49 4e 53 45  run {...    INSE
2e20: 52 54 20 49 4e 54 4f 20 63 73 69 74 65 6d 20 28  RT INTO csitem (
2e30: 63 69 64 2c 20 20 20 70 6f 73 2c 20 20 69 69 64  cid,   pos,  iid
2e40: 29 0a 09 09 20 20 20 20 56 41 4c 55 45 53 20 20  )...    VALUES  
2e50: 20 20 20 20 20 20 20 20 20 20 20 28 24 6d 79 69             ($myi
2e60: 64 2c 20 24 70 6f 73 2c 20 24 69 69 64 29 3b 0a  d, $pos, $iid);.
2e70: 09 09 7d 0a 09 09 69 6e 63 72 20 70 6f 73 0a 09  ..}...incr pos..
2e80: 20 20 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e      }..}..return
2e90: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68  .    }..    meth
2ea0: 6f 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 7d 20  od timerange {} 
2eb0: 7b 20 72 65 74 75 72 6e 20 5b 24 6d 79 74 79 70  { return [$mytyp
2ec0: 65 6f 62 6a 20 74 69 6d 65 72 61 6e 67 65 20 24  eobj timerange $
2ed0: 6d 79 69 74 65 6d 73 5d 20 7d 0a 0a 20 20 20 20  myitems] }..    
2ee0: 6d 65 74 68 6f 64 20 6c 69 6d 69 74 73 20 7b 7d  method limits {}
2ef0: 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74   {..struct::list
2f00: 20 61 73 73 69 67 6e 20 5b 24 6d 79 74 79 70 65   assign [$mytype
2f10: 6f 62 6a 20 6c 69 6d 69 74 73 20 24 6d 79 69 74  obj limits $myit
2f20: 65 6d 73 5d 20 6d 61 78 70 20 6d 69 6e 73 0a 09  ems] maxp mins..
2f30: 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 5b 54 61  return [list [Ta
2f40: 67 49 74 65 6d 44 69 63 74 20 24 6d 61 78 70 20  gItemDict $maxp 
2f50: 24 6d 79 74 79 70 65 5d 20 5b 54 61 67 49 74 65  $mytype] [TagIte
2f60: 6d 44 69 63 74 20 24 6d 69 6e 73 20 24 6d 79 74  mDict $mins $myt
2f70: 79 70 65 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20  ype]].    }..   
2f80: 20 6d 65 74 68 6f 64 20 64 72 6f 70 20 7b 7d 20   method drop {} 
2f90: 7b 0a 09 6c 6f 67 20 77 72 69 74 65 20 38 20 63  {..log write 8 c
2fa0: 73 65 74 73 20 7b 44 72 6f 70 70 69 6e 67 20 24  sets {Dropping $
2fb0: 73 65 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74  self = [$self st
2fc0: 72 5d 7d 0a 0a 09 73 74 61 74 65 20 74 72 61 6e  r]}...state tran
2fd0: 73 61 63 74 69 6f 6e 20 7b 0a 09 20 20 20 20 73  saction {..    s
2fe0: 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 44 45 4c  tate run {...DEL
2ff0: 45 54 45 20 46 52 4f 4d 20 63 68 61 6e 67 65 73  ETE FROM changes
3000: 65 74 20 20 20 57 48 45 52 45 20 63 69 64 20 3d  et   WHERE cid =
3010: 20 24 6d 79 69 64 3b 0a 09 09 44 45 4c 45 54 45   $myid;...DELETE
3020: 20 46 52 4f 4d 20 63 73 69 74 65 6d 20 20 20 20   FROM csitem    
3030: 20 20 57 48 45 52 45 20 63 69 64 20 3d 20 24 6d    WHERE cid = $m
3040: 79 69 64 3b 0a 09 09 44 45 4c 45 54 45 20 46 52  yid;...DELETE FR
3050: 4f 4d 20 63 73 73 75 63 63 65 73 73 6f 72 20 57  OM cssuccessor W
3060: 48 45 52 45 20 63 69 64 20 3d 20 24 6d 79 69 64  HERE cid = $myid
3070: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 66 6f 72  ;..    }..}..for
3080: 65 61 63 68 20 69 69 64 20 24 6d 79 69 74 65 6d  each iid $myitem
3090: 73 20 7b 0a 09 20 20 20 20 73 65 74 20 6b 65 79  s {..    set key
30a0: 20 5b 6c 69 73 74 20 24 6d 79 74 79 70 65 20 24   [list $mytype $
30b0: 69 69 64 5d 0a 09 20 20 20 20 75 6e 73 65 74 20  iid]..    unset 
30c0: 6d 79 69 74 65 6d 6d 61 70 28 24 6b 65 79 29 0a  myitemmap($key).
30d0: 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 38  .    log write 8
30e0: 20 63 73 65 74 73 20 7b 4d 41 50 2d 20 69 74 65   csets {MAP- ite
30f0: 6d 20 3c 24 6b 65 79 3e 20 24 73 65 6c 66 20 3d  m <$key> $self =
3100: 20 5b 24 73 65 6c 66 20 73 74 72 5d 7d 0a 09 7d   [$self str]}..}
3110: 0a 09 73 65 74 20 70 6f 73 20 20 20 20 20 20 20  ..set pos       
3120: 20 20 20 5b 6c 73 65 61 72 63 68 20 2d 65 78 61     [lsearch -exa
3130: 63 74 20 24 6d 79 63 68 61 6e 67 65 73 65 74 73  ct $mychangesets
3140: 20 24 73 65 6c 66 5d 0a 09 73 65 74 20 6d 79 63   $self]..set myc
3150: 68 61 6e 67 65 73 65 74 73 20 5b 6c 72 65 70 6c  hangesets [lrepl
3160: 61 63 65 20 24 6d 79 63 68 61 6e 67 65 73 65 74  ace $mychangeset
3170: 73 20 24 70 6f 73 20 24 70 6f 73 5d 0a 09 73 65  s $pos $pos]..se
3180: 74 20 70 6f 73 20 20 20 20 20 20 20 20 20 20 20  t pos           
3190: 20 20 20 20 20 20 20 20 20 5b 6c 73 65 61 72 63           [lsearc
31a0: 68 20 2d 65 78 61 63 74 20 24 6d 79 74 63 68 61  h -exact $mytcha
31b0: 6e 67 65 73 65 74 73 28 24 6d 79 74 79 70 65 29  ngesets($mytype)
31c0: 20 24 73 65 6c 66 5d 0a 09 73 65 74 20 6d 79 74   $self]..set myt
31d0: 63 68 61 6e 67 65 73 65 74 73 28 24 6d 79 74 79  changesets($myty
31e0: 70 65 29 20 5b 6c 72 65 70 6c 61 63 65 20 24 6d  pe) [lreplace $m
31f0: 79 74 63 68 61 6e 67 65 73 65 74 73 28 24 6d 79  ytchangesets($my
3200: 74 79 70 65 29 20 24 70 6f 73 20 24 70 6f 73 5d  type) $pos $pos]
3210: 0a 0a 09 23 20 52 65 74 75 72 6e 20 74 68 65 20  ...# Return the 
3220: 6c 69 73 74 20 6f 66 20 70 72 65 64 65 63 65 73  list of predeces
3230: 73 6f 72 73 20 73 6f 20 74 68 61 74 20 74 68 65  sors so that the
3240: 79 20 63 61 6e 20 62 65 20 61 64 6a 75 73 74 65  y can be adjuste
3250: 64 2e 0a 09 72 65 74 75 72 6e 20 5b 73 74 72 75  d...return [stru
3260: 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20 5b 73 74  ct::list map [st
3270: 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 53  ate run {..    S
3280: 45 4c 45 43 54 20 63 69 64 0a 09 20 20 20 20 46  ELECT cid..    F
3290: 52 4f 4d 20 20 20 63 73 73 75 63 63 65 73 73 6f  ROM   cssuccesso
32a0: 72 0a 09 20 20 20 20 57 48 45 52 45 20 20 6e 69  r..    WHERE  ni
32b0: 64 20 3d 20 24 6d 79 69 64 0a 09 7d 5d 20 5b 6d  d = $myid..}] [m
32c0: 79 74 79 70 65 6d 65 74 68 6f 64 20 6f 66 5d 5d  ytypemethod of]]
32d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68  .    }..    meth
32e0: 6f 64 20 72 65 70 6f 72 74 6c 6f 6f 70 20 7b 7b  od reportloop {{
32f0: 6b 69 6c 6c 20 31 7d 7d 20 7b 0a 09 23 20 57 65  kill 1}} {..# We
3300: 20 70 72 69 6e 74 20 74 68 65 20 69 74 65 6d 73   print the items
3310: 20 77 68 69 63 68 20 61 72 65 20 70 72 6f 64 75   which are produ
3320: 63 69 6e 67 20 74 68 65 20 6c 6f 6f 70 2c 20 61  cing the loop, a
3330: 6e 64 20 68 6f 77 2e 0a 0a 09 73 65 74 20 68 64  nd how....set hd
3340: 72 20 22 53 65 6c 66 2d 72 65 66 65 72 65 6e 74  r "Self-referent
3350: 69 61 6c 20 63 68 61 6e 67 65 73 65 74 20 5b 24  ial changeset [$
3360: 73 65 6c 66 20 73 74 72 5d 20 5f 5f 5f 5f 5f 5f  self str] ______
3370: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 22 0a 09 73  ____________"..s
3380: 65 74 20 66 74 72 20 5b 72 65 67 73 75 62 20 2d  et ftr [regsub -
3390: 61 6c 6c 20 7b 5b 5e 20 09 5d 7d 20 24 68 64 72  all {[^ .]} $hdr
33a0: 20 7b 5f 7d 5d 0a 0a 09 6c 6f 67 20 77 72 69 74   {_}]...log writ
33b0: 65 20 30 20 63 73 65 74 73 20 24 68 64 72 0a 09  e 0 csets $hdr..
33c0: 66 6f 72 65 61 63 68 20 7b 69 74 65 6d 20 6e 65  foreach {item ne
33d0: 78 74 69 74 65 6d 7d 20 5b 24 6d 79 74 79 70 65  xtitem} [$mytype
33e0: 6f 62 6a 20 6c 6f 6f 70 73 20 24 6d 79 69 74 65  obj loops $myite
33f0: 6d 73 5d 20 7b 0a 09 20 20 20 20 23 20 43 72 65  ms] {..    # Cre
3400: 61 74 65 20 74 61 67 67 65 64 20 69 74 65 6d 73  ate tagged items
3410: 20 66 72 6f 6d 20 74 68 65 20 69 64 20 61 6e 64   from the id and
3420: 20 6f 75 72 20 74 79 70 65 2e 0a 09 20 20 20 20   our type...    
3430: 73 65 74 20 69 74 65 6d 20 20 20 20 20 5b 6c 69  set item     [li
3440: 73 74 20 24 6d 79 74 79 70 65 20 20 24 69 74 65  st $mytype  $ite
3450: 6d 5d 0a 09 20 20 20 20 73 65 74 20 6e 65 78 74  m]..    set next
3460: 69 74 65 6d 20 5b 6c 69 73 74 20 24 6d 79 74 79  item [list $myty
3470: 70 65 20 24 6e 65 78 74 69 74 65 6d 5d 0a 09 20  pe $nextitem].. 
3480: 20 20 20 23 20 50 72 69 6e 74 61 62 6c 65 20 6c     # Printable l
3490: 61 62 65 6c 73 2e 0a 09 20 20 20 20 73 65 74 20  abels...    set 
34a0: 69 20 20 22 3c 5b 24 74 79 70 65 20 69 74 65 6d  i  "<[$type item
34b0: 73 74 72 20 24 69 74 65 6d 5d 3e 22 0a 09 20 20  str $item]>"..  
34c0: 20 20 73 65 74 20 6e 20 20 22 3c 5b 24 74 79 70    set n  "<[$typ
34d0: 65 20 69 74 65 6d 73 74 72 20 24 6e 65 78 74 69  e itemstr $nexti
34e0: 74 65 6d 5d 3e 22 0a 09 20 20 20 20 73 65 74 20  tem]>"..    set 
34f0: 6e 63 73 20 24 6d 79 69 74 65 6d 6d 61 70 28 24  ncs $myitemmap($
3500: 6e 65 78 74 69 74 65 6d 29 0a 09 20 20 20 20 23  nextitem)..    #
3510: 20 50 72 69 6e 74 0a 09 20 20 20 20 6c 6f 67 20   Print..    log 
3520: 77 72 69 74 65 20 30 20 63 73 65 74 73 20 7b 2a  write 0 csets {*
3530: 20 24 69 20 2d 2d 3e 20 24 6e 20 2d 2d 3e 20 63   $i --> $n --> c
3540: 73 20 5b 24 6e 63 73 20 73 74 72 5d 7d 0a 09 7d  s [$ncs str]}..}
3550: 0a 09 6c 6f 67 20 77 72 69 74 65 20 30 20 63 73  ..log write 0 cs
3560: 65 74 73 20 24 66 74 72 0a 0a 09 69 66 20 7b 21  ets $ftr...if {!
3570: 24 6b 69 6c 6c 7d 20 72 65 74 75 72 6e 0a 09 74  $kill} return..t
3580: 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20  rouble internal 
3590: 22 5b 24 73 65 6c 66 20 73 74 72 5d 20 64 65 70  "[$self str] dep
35a0: 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 22 0a  ends on itself".
35b0: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
35c0: 20 20 20 6d 65 74 68 6f 64 20 70 75 73 68 74 6f     method pushto
35d0: 20 7b 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74   {repository dat
35e0: 65 20 72 73 74 61 74 65 7d 20 7b 0a 09 23 20 47  e rstate} {..# G
35f0: 65 6e 65 72 61 74 65 20 61 6e 64 20 69 6d 70 6f  enerate and impo
3600: 72 74 20 74 68 65 20 6d 61 6e 69 66 65 73 74 20  rt the manifest 
3610: 66 6f 72 20 74 68 69 73 20 63 68 61 6e 67 65 73  for this changes
3620: 65 74 2e 0a 09 23 0a 09 23 20 44 61 74 61 20 6e  et...#..# Data n
3630: 65 65 64 65 64 3a 0a 09 23 20 2d 20 43 6f 6d 6d  eeded:..# - Comm
3640: 69 74 20 6d 65 73 73 61 67 65 20 20 20 20 20 20  it message      
3650: 20 20 20 20 20 20 20 20 20 28 2d 2d 20 6d 79 73           (-- mys
3660: 72 63 69 64 20 2d 3e 20 72 65 70 6f 73 69 74 6f  rcid -> reposito
3670: 72 79 20 6d 65 74 61 29 0a 09 23 20 2d 20 55 73  ry meta)..# - Us
3680: 65 72 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d  er doing the com
3690: 6d 69 74 20 20 20 20 20 20 20 20 28 73 2e 61 2e  mit        (s.a.
36a0: 29 0a 09 23 0a 09 23 20 2d 20 54 69 6d 65 73 74  )..#..# - Timest
36b0: 61 6d 70 20 6f 66 20 77 68 65 6e 20 63 6f 6d 6d  amp of when comm
36c0: 69 74 74 65 64 20 20 28 63 6f 6d 6d 61 6e 64 20  itted  (command 
36d0: 61 72 67 75 6d 65 6e 74 29 0a 09 23 0a 09 23 20  argument)..#..# 
36e0: 2d 20 54 68 65 20 70 61 72 65 6e 74 20 63 68 61  - The parent cha
36f0: 6e 67 65 73 65 74 2c 20 69 66 20 61 6e 79 2e 20  ngeset, if any. 
3700: 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70  If there is no p
3710: 61 72 65 6e 74 20 66 6f 73 73 69 6c 0a 09 23 20  arent fossil..# 
3720: 20 20 77 69 6c 6c 20 75 73 65 20 74 68 65 20 65    will use the e
3730: 6d 70 74 79 20 62 61 73 65 20 72 65 76 69 73 69  mpty base revisi
3740: 6f 6e 20 61 73 20 70 61 72 65 6e 74 2e 0a 09 23  on as parent...#
3750: 0a 09 23 20 2d 20 4c 69 73 74 20 6f 66 20 74 68  ..# - List of th
3760: 65 20 66 69 6c 65 20 72 65 76 69 73 69 6f 6e 73  e file revisions
3770: 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65   in the changese
3780: 74 2e 0a 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73  t....struct::lis
3790: 74 20 61 73 73 69 67 6e 20 5b 24 6d 79 70 72 6f  t assign [$mypro
37a0: 6a 65 63 74 20 67 65 74 6d 65 74 61 20 24 6d 79  ject getmeta $my
37b0: 73 72 63 69 64 5d 20 5f 5f 20 5f 5f 20 75 73 65  srcid] __ __ use
37c0: 72 20 6d 65 73 73 61 67 65 0a 0a 09 23 20 57 65  r message...# We
37d0: 20 64 65 72 69 76 65 20 74 68 65 20 6c 6f 64 20   derive the lod 
37e0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 64 69 72 65  information dire
37f0: 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20 72 65  ctly from the re
3800: 76 69 73 69 6f 6e 73 20 6f 66 0a 09 23 20 74 68  visions of..# th
3810: 65 20 63 68 61 6e 67 65 73 65 74 2c 20 61 73 20  e changeset, as 
3820: 74 68 65 20 62 72 61 6e 63 68 20 70 61 72 74 20  the branch part 
3830: 6f 66 20 74 68 65 20 6d 65 74 61 20 64 61 74 61  of the meta data
3840: 20 28 73 2e 61 2e 29 20 69 73 0a 09 23 20 6f 75   (s.a.) is..# ou
3850: 74 64 61 74 65 64 20 73 69 6e 63 65 20 70 61 73  tdated since pas
3860: 73 20 46 69 6c 74 65 72 53 79 6d 62 6f 6c 73 2e  s FilterSymbols.
3870: 0a 0a 09 73 65 74 20 6c 6f 64 6e 61 6d 65 20 5b  ...set lodname [
3880: 24 73 65 6c 66 20 6c 6f 64 5d 0a 0a 09 6c 6f 67  $self lod]...log
3890: 20 77 72 69 74 65 20 32 20 63 73 65 74 73 20 7b   write 2 csets {
38a0: 49 6d 70 6f 72 74 69 6e 67 20 72 65 76 69 73 69  Importing revisi
38b0: 6f 6e 20 5b 24 73 65 6c 66 20 73 74 72 5d 20 6f  on [$self str] o
38c0: 6e 20 24 6c 6f 64 6e 61 6d 65 7d 0a 0a 09 23 20  n $lodname}...# 
38d0: 50 65 72 66 6f 72 6d 20 74 68 65 20 69 6d 70 6f  Perform the impo
38e0: 72 74 2e 20 41 73 20 70 61 72 74 20 6f 66 20 74  rt. As part of t
38f0: 68 61 74 20 77 65 20 64 65 74 65 72 6d 69 6e 65  hat we determine
3900: 20 74 68 65 20 70 61 72 65 6e 74 0a 09 23 20 77   the parent..# w
3910: 65 20 6e 65 65 64 2c 20 61 6e 64 20 63 6f 6e 76  e need, and conv
3920: 65 72 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20  ert the list of 
3930: 69 74 65 6d 73 20 69 6e 20 74 68 65 20 63 68 61  items in the cha
3940: 6e 67 65 73 65 74 20 69 6e 74 6f 0a 09 23 20 75  ngeset into..# u
3950: 75 69 64 73 20 61 6e 64 20 70 72 69 6e 74 61 62  uids and printab
3960: 6c 65 20 64 61 74 61 2e 0a 0a 09 73 74 72 75 63  le data....struc
3970: 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b  t::list assign [
3980: 47 65 74 69 73 64 65 66 61 75 6c 74 20 24 6d 79  Getisdefault $my
3990: 69 74 65 6d 73 5d 20 69 73 64 65 66 61 75 6c 74  items] isdefault
39a0: 20 6c 61 73 74 64 65 66 61 75 6c 74 6f 6e 74 72   lastdefaultontr
39b0: 75 6e 6b 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20  unk...log write 
39c0: 38 20 63 73 65 74 73 20 7b 4c 4f 44 20 20 20 20  8 csets {LOD    
39d0: 27 24 6c 6f 64 6e 61 6d 65 27 7d 0a 09 6c 6f 67  '$lodname'}..log
39e0: 20 77 72 69 74 65 20 38 20 63 73 65 74 73 20 7b   write 8 csets {
39f0: 20 64 65 66 3f 20 20 24 69 73 64 65 66 61 75 6c   def?  $isdefaul
3a00: 74 7d 0a 09 6c 6f 67 20 77 72 69 74 65 20 38 20  t}..log write 8 
3a10: 63 73 65 74 73 20 7b 20 6c 61 73 74 3f 20 24 6c  csets { last? $l
3a20: 61 73 74 64 65 66 61 75 6c 74 6f 6e 74 72 75 6e  astdefaultontrun
3a30: 6b 7d 0a 0a 09 73 65 74 20 6c 77 73 20 20 5b 47  k}...set lws  [G
3a40: 65 74 77 6f 72 6b 73 70 61 63 65 20 20 20 20 24  etworkspace    $
3a50: 72 73 74 61 74 65 20 24 6c 6f 64 6e 61 6d 65 20  rstate $lodname 
3a60: 24 6d 79 70 72 6f 6a 65 63 74 20 24 69 73 64 65  $myproject $isde
3a70: 66 61 75 6c 74 5d 0a 09 24 6c 77 73 20 61 64 64  fault]..$lws add
3a80: 20 5b 47 65 74 72 65 76 69 73 69 6f 6e 69 6e 66   [Getrevisioninf
3a90: 6f 20 24 6d 79 69 74 65 6d 73 5d 0a 0a 09 73 65  o $myitems]...se
3aa0: 74 20 75 75 69 64 20 5b 24 72 65 70 6f 73 69 74  t uuid [$reposit
3ab0: 6f 72 79 20 69 6d 70 6f 72 74 72 65 76 69 73 69  ory importrevisi
3ac0: 6f 6e 20 5b 24 73 65 6c 66 20 73 74 72 5d 20 5c  on [$self str] \
3ad0: 0a 09 09 20 20 20 20 20 20 24 75 73 65 72 20 24  ...      $user $
3ae0: 6d 65 73 73 61 67 65 20 24 64 61 74 65 20 5c 0a  message $date \.
3af0: 09 09 20 20 20 20 20 20 5b 24 6c 77 73 20 67 65  ..      [$lws ge
3b00: 74 69 64 5d 20 5b 24 6c 77 73 20 67 65 74 5d 5d  tid] [$lws get]]
3b10: 0a 0a 09 23 20 52 65 6d 65 6d 62 65 72 20 74 68  ...# Remember th
3b20: 65 20 69 6d 70 6f 72 74 65 64 20 63 68 61 6e 67  e imported chang
3b30: 65 73 65 74 20 69 6e 20 74 68 65 20 73 74 61 74  eset in the stat
3b40: 65 2c 20 75 6e 64 65 72 20 6f 75 72 0a 09 23 20  e, under our..# 
3b50: 4c 4f 44 2e 20 41 6e 64 20 69 66 20 69 74 20 69  LOD. And if it i
3b60: 73 20 74 68 65 20 6c 61 73 74 20 74 72 75 6e 6b  s the last trunk
3b70: 20 63 68 61 6e 67 65 73 65 74 20 6f 6e 20 74 68   changeset on th
3b80: 65 20 76 65 6e 64 6f 72 0a 09 23 20 62 72 61 6e  e vendor..# bran
3b90: 63 68 20 74 68 65 6e 20 74 68 65 20 72 65 76 69  ch then the revi
3ba0: 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20 74 68 65  sion is also the
3bb0: 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20   actual root of 
3bc0: 74 68 65 0a 09 23 20 3a 74 72 75 6e 6b 3a 2c 20  the..# :trunk:, 
3bd0: 73 6f 20 77 65 20 72 65 6d 65 6d 62 65 72 20 69  so we remember i
3be0: 74 20 61 73 20 73 75 63 68 20 69 6e 20 74 68 65  t as such in the
3bf0: 20 73 74 61 74 65 2e 20 48 6f 77 65 76 65 72 20   state. However 
3c00: 69 66 0a 09 23 20 74 68 65 20 74 72 75 6e 6b 20  if..# the trunk 
3c10: 61 6c 72 65 61 64 79 20 65 78 69 73 74 73 20 74  already exists t
3c20: 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65  hen the changese
3c30: 74 20 63 61 6e 6e 6f 74 20 62 65 20 6f 6e 20 69  t cannot be on i
3c40: 74 0a 09 23 20 61 6e 79 20 6d 6f 72 65 2e 20 54  t..# any more. T
3c50: 68 69 73 20 69 6e 64 69 63 61 74 65 73 20 77 65  his indicates we
3c60: 69 72 64 6e 65 73 73 20 69 6e 20 74 68 65 20 73  irdness in the s
3c70: 65 74 75 70 20 6f 66 20 74 68 65 0a 09 23 20 76  etup of the..# v
3c80: 65 6e 64 6f 72 20 62 72 61 6e 63 68 2c 20 62 75  endor branch, bu
3c90: 74 20 6f 6e 65 20 77 65 20 63 61 6e 20 77 6f 72  t one we can wor
3ca0: 6b 20 61 72 6f 75 6e 64 2e 0a 0a 09 24 6c 77 73  k around....$lws
3cb0: 20 64 65 66 69 64 20 24 75 75 69 64 0a 09 69 66   defid $uuid..if
3cc0: 20 7b 24 6c 61 73 74 64 65 66 61 75 6c 74 6f 6e   {$lastdefaulton
3cd0: 74 72 75 6e 6b 7d 20 7b 0a 09 20 20 20 20 69 66  trunk} {..    if
3ce0: 20 7b 5b 24 72 73 74 61 74 65 20 68 61 73 20 3a   {[$rstate has :
3cf0: 74 72 75 6e 6b 3a 5d 7d 20 7b 0a 09 09 6c 6f 67  trunk:]} {...log
3d00: 20 77 72 69 74 65 20 32 20 63 73 65 74 73 20 7b   write 2 csets {
3d10: 4d 75 6c 74 69 70 6c 65 20 63 68 61 6e 67 65 73  Multiple changes
3d20: 65 74 73 20 64 65 63 6c 61 72 65 64 20 74 6f 20  ets declared to 
3d30: 62 65 20 74 68 65 20 6c 61 73 74 20 74 72 75 6e  be the last trun
3d40: 6b 20 63 68 61 6e 67 65 73 65 74 20 6f 6e 20 74  k changeset on t
3d50: 68 65 20 76 65 6e 64 6f 72 2d 62 72 61 6e 63 68  he vendor-branch
3d60: 7d 0a 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  }..    } else {.
3d70: 09 09 24 72 73 74 61 74 65 20 6e 65 77 20 3a 74  ..$rstate new :t
3d80: 72 75 6e 6b 3a 20 5b 24 6c 77 73 20 6e 61 6d 65  runk: [$lws name
3d90: 5d 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 23 20  ]..    }..}...# 
3da0: 52 65 6d 65 6d 62 65 72 20 74 68 65 20 77 68 6f  Remember the who
3db0: 6c 65 20 63 68 61 6e 67 65 73 65 74 20 2f 20 75  le changeset / u
3dc0: 75 69 64 20 6d 61 70 70 69 6e 67 2c 20 66 6f 72  uid mapping, for
3dd0: 20 74 68 65 20 74 61 67 73 2e 0a 0a 09 73 74 61   the tags....sta
3de0: 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 49 4e  te run {..    IN
3df0: 53 45 52 54 20 49 4e 54 4f 20 63 73 75 75 69 64  SERT INTO csuuid
3e00: 20 28 63 69 64 2c 20 20 20 75 75 69 64 29 0a 09   (cid,   uuid)..
3e10: 20 20 20 20 56 41 4c 55 45 53 20 20 20 20 20 20      VALUES      
3e20: 20 20 20 20 20 20 20 28 24 6d 79 69 64 2c 20 24         ($myid, $
3e30: 75 75 69 64 29 0a 09 7d 0a 09 72 65 74 75 72 6e  uuid)..}..return
3e40: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63  .    }..    proc
3e50: 20 47 65 74 72 65 76 69 73 69 6f 6e 69 6e 66 6f   Getrevisioninfo
3e60: 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09   {revisions} {..
3e70: 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f  set theset ('[jo
3e80: 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27  in $revisions {'
3e90: 2c 27 7d 5d 27 29 0a 09 73 65 74 20 72 65 76 69  ,'}]')..set revi
3ea0: 73 69 6f 6e 73 20 7b 7d 0a 09 66 6f 72 65 61 63  sions {}..foreac
3eb0: 68 20 7b 66 72 69 64 20 70 61 74 68 20 66 6e 61  h {frid path fna
3ec0: 6d 65 20 72 65 76 6e 72 20 72 6f 70 7d 20 5b 73  me revnr rop} [s
3ed0: 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73 74 20  tate run [subst 
3ee0: 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62  -nocommands -nob
3ef0: 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20  ackslashes {..  
3f00: 20 20 53 45 4c 45 43 54 20 55 2e 75 75 69 64 2c    SELECT U.uuid,
3f10: 20 46 2e 76 69 73 69 62 6c 65 2c 20 46 2e 6e 61   F.visible, F.na
3f20: 6d 65 2c 20 52 2e 72 65 76 2c 20 52 2e 6f 70 0a  me, R.rev, R.op.
3f30: 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69  .    FROM   revi
3f40: 73 69 6f 6e 20 52 2c 20 72 65 76 75 75 69 64 20  sion R, revuuid 
3f50: 55 2c 20 66 69 6c 65 20 46 0a 09 20 20 20 20 57  U, file F..    W
3f60: 48 45 52 45 20 20 52 2e 72 69 64 20 49 4e 20 24  HERE  R.rid IN $
3f70: 74 68 65 73 65 74 20 20 2d 2d 20 41 6c 6c 20 73  theset  -- All s
3f80: 70 65 63 69 66 69 65 64 20 72 65 76 69 73 69 6f  pecified revisio
3f90: 6e 73 0a 09 20 20 20 20 41 4e 44 20 20 20 20 55  ns..    AND    U
3fa0: 2e 72 69 64 20 3d 20 52 2e 72 69 64 20 20 20 20  .rid = R.rid    
3fb0: 20 2d 2d 20 67 65 74 20 66 6f 73 73 69 6c 20 75   -- get fossil u
3fc0: 75 69 64 20 6f 66 20 72 65 76 69 73 69 6f 6e 0a  uid of revision.
3fd0: 09 20 20 20 20 41 4e 44 20 20 20 20 46 2e 66 69  .    AND    F.fi
3fe0: 64 20 3d 20 52 2e 66 69 64 20 20 20 20 20 2d 2d  d = R.fid     --
3ff0: 20 67 65 74 20 66 69 6c 65 20 6f 66 20 72 65 76   get file of rev
4000: 69 73 69 6f 6e 0a 09 7d 5d 5d 20 7b 0a 09 20 20  ision..}]] {..  
4010: 20 20 6c 61 70 70 65 6e 64 20 72 65 76 69 73 69    lappend revisi
4020: 6f 6e 73 20 24 66 72 69 64 20 24 70 61 74 68 20  ons $frid $path 
4030: 24 66 6e 61 6d 65 2f 24 72 65 76 6e 72 20 24 72  $fname/$revnr $r
4040: 6f 70 0a 09 7d 0a 09 72 65 74 75 72 6e 20 24 72  op..}..return $r
4050: 65 76 69 73 69 6f 6e 73 0a 20 20 20 20 7d 0a 0a  evisions.    }..
4060: 20 20 20 20 70 72 6f 63 20 47 65 74 77 6f 72 6b      proc Getwork
4070: 73 70 61 63 65 20 7b 72 73 74 61 74 65 20 6c 6f  space {rstate lo
4080: 64 6e 61 6d 65 20 70 72 6f 6a 65 63 74 20 69 73  dname project is
4090: 64 65 66 61 75 6c 74 7d 20 7b 0a 0a 09 23 20 54  default} {...# T
40a0: 68 65 20 73 74 61 74 65 20 6f 62 6a 65 63 74 20  he state object 
40b0: 68 6f 6c 64 73 20 74 68 65 20 77 6f 72 6b 73 70  holds the worksp
40c0: 61 63 65 20 73 74 61 74 65 20 6f 66 20 65 61 63  ace state of eac
40d0: 68 20 6b 6e 6f 77 6e 0a 09 23 20 6c 69 6e 65 2d  h known..# line-
40e0: 6f 66 2d 64 65 76 65 6c 6f 70 6d 65 6e 74 20 28  of-development (
40f0: 4c 4f 44 29 2c 20 75 70 20 74 6f 20 74 68 65 20  LOD), up to the 
4100: 6c 61 73 74 20 63 6f 6d 6d 69 74 74 65 64 0a 09  last committed..
4110: 23 20 63 68 61 6e 67 65 73 65 74 20 62 65 6c 6f  # changeset belo
4120: 6e 67 69 6e 67 20 74 6f 20 74 68 61 74 20 4c 4f  nging to that LO
4130: 44 2e 0a 0a 09 23 20 28 2a 29 20 53 74 61 6e 64  D....# (*) Stand
4140: 61 72 64 20 68 61 6e 64 6c 69 6e 67 20 69 66 20  ard handling if 
4150: 69 6e 2d 4c 4f 44 20 63 68 61 6e 67 65 73 65 74  in-LOD changeset
4160: 73 2e 20 49 66 20 74 68 65 20 4c 4f 44 20 6f 66  s. If the LOD of
4170: 0a 09 23 20 20 20 20 20 74 68 65 20 63 75 72 72  ..#     the curr
4180: 65 6e 74 20 63 68 61 6e 67 65 73 65 74 20 65 78  ent changeset ex
4190: 69 73 74 73 20 69 6e 20 74 68 65 20 73 74 61 74  ists in the stat
41a0: 65 20 28 3d 20 68 61 73 20 62 65 65 6e 0a 09 23  e (= has been..#
41b0: 20 20 20 20 20 63 6f 6d 6d 69 74 74 65 64 20 74       committed t
41c0: 6f 29 20 74 68 65 6e 20 74 68 69 73 20 69 74 20  o) then this it 
41d0: 68 61 73 20 74 68 65 20 77 6f 72 6b 73 70 61 63  has the workspac
41e0: 65 20 77 65 20 61 72 65 0a 09 23 20 20 20 20 20  e we are..#     
41f0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 2e 0a 0a 09 69  looking for....i
4200: 66 20 7b 5b 24 72 73 74 61 74 65 20 68 61 73 20  f {[$rstate has 
4210: 24 6c 6f 64 6e 61 6d 65 5d 7d 20 7b 0a 09 20 20  $lodname]} {..  
4220: 20 20 72 65 74 75 72 6e 20 5b 24 72 73 74 61 74    return [$rstat
4230: 65 20 67 65 74 20 24 6c 6f 64 6e 61 6d 65 5d 0a  e get $lodname].
4240: 09 7d 0a 0a 09 23 20 49 66 20 74 68 65 20 4c 4f  .}...# If the LO
4250: 44 20 69 73 20 68 6f 77 65 76 65 72 20 6e 6f 74  D is however not
4260: 20 79 65 74 20 6b 6e 6f 77 6e 2c 20 74 68 65 6e   yet known, then
4270: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 09 23 20   the current..# 
4280: 63 68 61 6e 67 65 73 65 74 20 63 61 6e 20 62 65  changeset can be
4290: 20 65 69 74 68 65 72 20 6f 66 0a 09 23 20 28 61   either of..# (a
42a0: 29 20 72 6f 6f 74 20 6f 66 20 61 20 76 65 6e 64  ) root of a vend
42b0: 6f 72 20 62 72 61 6e 63 68 2c 0a 09 23 20 28 62  or branch,..# (b
42c0: 29 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72  ) root of the tr
42d0: 75 6e 6b 20 4c 4f 44 2c 20 6f 72 0a 09 23 20 28  unk LOD, or..# (
42e0: 63 29 20 74 68 65 20 66 69 72 73 74 20 63 68 61  c) the first cha
42f0: 6e 67 65 73 65 74 20 69 6e 20 61 20 6e 65 77 20  ngeset in a new 
4300: 4c 4f 44 20 77 68 69 63 68 20 77 61 73 20 73 70  LOD which was sp
4310: 61 77 6e 65 64 20 66 72 6f 6d 0a 09 23 20 20 20  awned from..#   
4320: 20 20 61 6e 20 65 78 69 73 74 69 6e 67 20 4c 4f    an existing LO
4330: 44 2e 0a 0a 09 23 20 46 6f 72 20 62 6f 74 68 20  D....# For both 
4340: 28 61 29 20 61 6e 64 20 28 62 29 20 77 65 20 68  (a) and (b) we h
4350: 61 76 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ave to create a 
4360: 6e 65 77 20 77 6f 72 6b 73 70 61 63 65 20 66 6f  new workspace fo
4370: 72 0a 09 23 20 74 68 65 20 6c 6f 64 2c 20 61 6e  r..# the lod, an
4380: 64 20 69 74 20 64 6f 65 73 6e 27 74 20 69 6e 68  d it doesn't inh
4390: 65 72 69 74 20 66 72 6f 6d 20 61 6e 79 74 68 69  erit from anythi
43a0: 6e 67 2e 0a 0a 09 23 20 4f 6e 65 20 65 78 63 65  ng....# One exce
43b0: 70 74 69 6f 6e 20 66 6f 72 20 28 61 29 2e 20 49  ption for (a). I
43c0: 66 20 77 65 20 61 6c 72 65 61 64 79 20 68 61 76  f we already hav
43d0: 65 20 61 20 3a 76 65 6e 64 6f 72 3a 20 62 72 61  e a :vendor: bra
43e0: 6e 63 68 0a 09 23 20 74 68 65 6e 20 6d 75 6c 74  nch..# then mult
43f0: 69 70 6c 65 20 73 79 6d 62 6f 6c 73 20 77 65 72  iple symbols wer
4400: 65 20 75 73 65 64 20 66 6f 72 20 74 68 65 20 76  e used for the v
4410: 65 6e 64 6f 72 20 62 72 61 6e 63 68 20 62 79 0a  endor branch by.
4420: 09 23 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c  .# different fil
4430: 65 73 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65  es. In that case
4440: 20 74 68 65 20 27 6e 65 77 27 20 62 72 61 6e 63   the 'new' branc
4450: 68 20 69 73 20 6d 61 64 65 20 61 6e 0a 09 23 20  h is made an..# 
4460: 61 6c 69 61 73 20 6f 66 20 74 68 65 20 3a 76 65  alias of the :ve
4470: 6e 64 6f 72 3a 2c 20 65 66 66 65 63 74 69 76 65  ndor:, effective
4480: 6c 79 20 6d 65 72 67 69 6e 67 20 74 68 65 20 73  ly merging the s
4490: 79 6d 62 6f 6c 73 0a 09 23 20 74 6f 67 65 74 68  ymbols..# togeth
44a0: 65 72 2e 0a 0a 09 23 20 4e 6f 74 65 20 74 68 61  er....# Note tha
44b0: 74 20 63 61 73 65 20 28 62 29 20 6d 61 79 20 6e  t case (b) may n
44c0: 65 76 65 72 20 6f 63 63 75 72 2e 20 53 65 65 20  ever occur. See 
44d0: 74 68 65 20 76 61 72 69 61 62 6c 65 0a 09 23 20  the variable..# 
44e0: 27 6c 61 73 74 64 65 66 61 75 6c 74 6f 6e 74 72  'lastdefaultontr
44f0: 75 6e 6b 27 20 69 6e 20 74 68 65 20 63 61 6c 6c  unk' in the call
4500: 65 72 20 28 6d 65 74 68 6f 64 20 70 75 73 68 74  er (method pusht
4510: 6f 29 2e 20 54 68 69 73 0a 09 23 20 66 6c 61 67  o). This..# flag
4520: 20 63 61 6e 20 74 68 65 20 67 65 6e 65 72 61 74   can the generat
4530: 69 6f 6e 20 6f 66 20 74 68 65 20 77 6f 72 6b 73  ion of the works
4540: 70 61 63 65 20 66 6f 72 20 74 68 65 20 3a 74 72  pace for the :tr
4550: 75 6e 6b 3a 20 4c 4f 44 0a 09 23 20 61 73 20 77  unk: LOD..# as w
4560: 65 6c 6c 2c 20 6d 61 6b 69 6e 67 20 69 74 20 69  ell, making it i
4570: 6e 68 65 72 69 74 20 74 68 65 20 73 74 61 74 65  nherit the state
4580: 20 6f 66 20 74 68 65 20 6c 61 73 74 0a 09 23 20   of the last..# 
4590: 74 72 75 6e 6b 2d 63 68 61 6e 67 65 73 65 74 20  trunk-changeset 
45a0: 6f 6e 20 74 68 65 20 76 65 6e 64 6f 72 2d 62 72  on the vendor-br
45b0: 61 6e 63 68 2e 0a 0a 09 69 66 20 7b 24 69 73 64  anch....if {$isd
45c0: 65 66 61 75 6c 74 7d 20 7b 0a 09 20 20 20 20 69  efault} {..    i
45d0: 66 20 7b 21 5b 24 72 73 74 61 74 65 20 68 61 73  f {![$rstate has
45e0: 20 22 3a 76 65 6e 64 6f 72 3a 22 5d 7d 20 7b 0a   ":vendor:"]} {.
45f0: 09 09 23 20 43 72 65 61 74 65 20 74 68 65 20 76  ..# Create the v
4600: 65 6e 64 6f 72 20 62 72 61 6e 63 68 20 69 66 20  endor branch if 
4610: 6e 6f 74 20 70 72 65 73 65 6e 74 20 61 6c 72 65  not present alre
4620: 61 64 79 2e 0a 09 09 24 72 73 74 61 74 65 20 6e  ady....$rstate n
4630: 65 77 20 3a 76 65 6e 64 6f 72 3a 0a 09 20 20 20  ew :vendor:..   
4640: 20 7d 0a 09 20 20 20 20 23 20 4d 65 72 67 65 20   }..    # Merge 
4650: 74 68 65 20 6e 65 77 20 73 79 6d 62 6f 6c 20 74  the new symbol t
4660: 6f 20 74 68 65 20 76 65 6e 64 6f 72 20 62 72 61  o the vendor bra
4670: 6e 63 68 0a 09 20 20 20 20 24 72 73 74 61 74 65  nch..    $rstate
4680: 20 64 75 70 20 24 6c 6f 64 6e 61 6d 65 20 3c 2d   dup $lodname <-
4690: 2d 20 3a 76 65 6e 64 6f 72 3a 0a 09 20 20 20 20  - :vendor:..    
46a0: 72 65 74 75 72 6e 20 5b 24 72 73 74 61 74 65 20  return [$rstate 
46b0: 67 65 74 20 24 6c 6f 64 6e 61 6d 65 5d 0a 09 7d  get $lodname]..}
46c0: 0a 0a 09 69 66 20 7b 24 6c 6f 64 6e 61 6d 65 20  ...if {$lodname 
46d0: 65 71 20 22 3a 74 72 75 6e 6b 3a 22 7d 20 7b 0a  eq ":trunk:"} {.
46e0: 09 20 20 20 20 72 65 74 75 72 6e 20 5b 24 72 73  .    return [$rs
46f0: 74 61 74 65 20 6e 65 77 20 24 6c 6f 64 6e 61 6d  tate new $lodnam
4700: 65 5d 0a 09 7d 0a 0a 09 23 20 43 61 73 65 20 28  e]..}...# Case (
4710: 63 29 2e 20 57 65 20 66 69 6e 64 20 74 68 65 20  c). We find the 
4720: 70 61 72 65 6e 74 20 4c 4f 44 20 6f 66 20 6f 75  parent LOD of ou
4730: 72 20 4c 4f 44 20 61 6e 64 20 6c 65 74 20 74 68  r LOD and let th
4740: 65 20 6e 65 77 0a 09 23 20 77 6f 72 6b 73 70 61  e new..# workspa
4750: 63 65 20 69 6e 68 65 72 69 74 20 66 72 6f 6d 20  ce inherit from 
4760: 74 68 65 20 70 61 72 65 6e 74 27 73 20 77 6f 72  the parent's wor
4770: 6b 73 70 61 63 65 2e 0a 0a 09 73 65 74 20 70 6c  kspace....set pl
4780: 6f 64 6e 61 6d 65 20 5b 5b 5b 24 70 72 6f 6a 65  odname [[[$proje
4790: 63 74 20 67 65 74 73 79 6d 62 6f 6c 20 24 6c 6f  ct getsymbol $lo
47a0: 64 6e 61 6d 65 5d 20 70 61 72 65 6e 74 5d 20 6e  dname] parent] n
47b0: 61 6d 65 5d 0a 0a 09 6c 6f 67 20 77 72 69 74 65  ame]...log write
47c0: 20 38 20 63 73 65 74 73 20 7b 70 4c 4f 44 20 20   8 csets {pLOD  
47d0: 20 27 24 70 6c 6f 64 6e 61 6d 65 27 7d 0a 0a 09   '$plodname'}...
47e0: 69 66 20 7b 5b 24 72 73 74 61 74 65 20 68 61 73  if {[$rstate has
47f0: 20 24 70 6c 6f 64 6e 61 6d 65 5d 7d 20 7b 0a 09   $plodname]} {..
4800: 20 20 20 20 72 65 74 75 72 6e 20 5b 24 72 73 74      return [$rst
4810: 61 74 65 20 6e 65 77 20 24 6c 6f 64 6e 61 6d 65  ate new $lodname
4820: 20 24 70 6c 6f 64 6e 61 6d 65 5d 0a 09 7d 0a 0a   $plodname]..}..
4830: 09 66 6f 72 65 61 63 68 20 6b 20 5b 6c 73 6f 72  .foreach k [lsor
4840: 74 20 5b 24 72 73 74 61 74 65 20 6e 61 6d 65 73  t [$rstate names
4850: 5d 5d 20 7b 0a 09 20 20 20 20 6c 6f 67 20 77 72  ]] {..    log wr
4860: 69 74 65 20 38 20 63 73 65 74 73 20 7b 20 20 20  ite 8 csets {   
4870: 20 24 6b 20 3d 20 5b 5b 24 72 73 74 61 74 65 20   $k = [[$rstate 
4880: 67 65 74 20 24 6b 5d 20 67 65 74 69 64 5d 7d 0a  get $k] getid]}.
4890: 09 7d 0a 0a 09 74 72 6f 75 62 6c 65 20 69 6e 74  .}...trouble int
48a0: 65 72 6e 61 6c 20 7b 55 6e 61 62 6c 65 20 74 6f  ernal {Unable to
48b0: 20 64 65 74 65 72 6d 69 6e 65 20 63 68 61 6e 67   determine chang
48c0: 65 73 65 74 20 70 61 72 65 6e 74 7d 0a 09 72 65  eset parent}..re
48d0: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
48e0: 70 72 6f 63 20 47 65 74 69 73 64 65 66 61 75 6c  proc Getisdefaul
48f0: 74 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a  t {revisions} {.
4900: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a  .set theset ('[j
4910: 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b  oin $revisions {
4920: 27 2c 27 7d 5d 27 29 0a 0a 09 73 74 72 75 63 74  ','}]')...struct
4930: 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b 73  ::list assign [s
4940: 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73 74 20  tate run [subst 
4950: 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62  -nocommands -nob
4960: 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20  ackslashes {..  
4970: 20 20 53 45 4c 45 43 54 20 52 2e 69 73 64 65 66    SELECT R.isdef
4980: 61 75 6c 74 2c 20 52 2e 64 62 63 68 69 6c 64 0a  ault, R.dbchild.
4990: 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69  .    FROM   revi
49a0: 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52  sion R..    WHER
49b0: 45 20 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65  E  R.rid IN $the
49c0: 73 65 74 20 20 2d 2d 20 41 6c 6c 20 73 70 65 63  set  -- All spec
49d0: 69 66 69 65 64 20 72 65 76 69 73 69 6f 6e 73 0a  ified revisions.
49e0: 09 20 20 20 20 4c 49 4d 49 54 20 31 0a 09 7d 5d  .    LIMIT 1..}]
49f0: 5d 20 64 65 66 20 6c 61 73 74 0a 0a 09 23 20 54  ] def last...# T
4a00: 4f 44 4f 2f 43 48 45 43 4b 3a 20 6c 6f 6f 6b 20  ODO/CHECK: look 
4a10: 66 6f 72 20 63 68 61 6e 67 65 73 65 74 73 20 77  for changesets w
4a20: 68 65 72 65 20 69 73 64 65 66 61 75 6c 74 2f 64  here isdefault/d
4a30: 62 63 68 69 6c 64 20 69 73 0a 09 23 20 61 6d 62  bchild is..# amb
4a40: 69 67 6f 75 73 2e 0a 0a 09 72 65 74 75 72 6e 20  igous....return 
4a50: 5b 6c 69 73 74 20 24 64 65 66 20 5b 65 78 70 72  [list $def [expr
4a60: 20 7b 24 6c 61 73 74 20 6e 65 20 22 22 7d 5d 5d   {$last ne ""}]]
4a70: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65  .    }..    type
4a80: 6d 65 74 68 6f 64 20 73 70 6c 69 74 20 7b 63 73  method split {cs
4a90: 65 74 20 61 72 67 73 7d 20 7b 0a 09 23 20 41 73  et args} {..# As
4aa0: 20 70 61 72 74 20 6f 66 20 74 68 65 20 63 72 65   part of the cre
4ab0: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77  ation of the new
4ac0: 20 63 68 61 6e 67 65 73 65 74 73 20 73 70 65 63   changesets spec
4ad0: 69 66 69 65 64 20 69 6e 0a 09 23 20 41 52 47 53  ified in..# ARGS
4ae0: 20 61 73 20 73 65 74 73 20 6f 66 20 69 74 65 6d   as sets of item
4af0: 73 2c 20 61 6c 6c 20 73 75 62 73 65 74 73 20 6f  s, all subsets o
4b00: 66 20 43 53 45 54 27 73 20 69 74 65 6d 20 73 65  f CSET's item se
4b10: 74 2c 20 43 53 45 54 0a 09 23 20 77 69 6c 6c 20  t, CSET..# will 
4b20: 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20  be dropped from 
4b30: 61 6c 6c 20 64 61 74 61 62 61 73 65 73 2c 20 69  all databases, i
4b40: 6e 20 61 6e 64 20 6f 75 74 20 6f 66 20 6d 65 6d  n and out of mem
4b50: 6f 72 79 2c 0a 09 23 20 61 6e 64 20 74 68 65 6e  ory,..# and then
4b60: 20 64 65 73 74 72 6f 79 65 64 2e 0a 09 23 0a 09   destroyed...#..
4b70: 23 20 4e 6f 74 65 3a 20 54 68 65 20 69 74 65 6d  # Note: The item
4b80: 20 6c 69 73 74 73 20 66 6f 75 6e 64 20 69 6e 20   lists found in 
4b90: 61 72 67 73 20 61 72 65 20 74 61 67 67 65 64 20  args are tagged 
4ba0: 69 74 65 6d 73 2e 20 54 68 65 79 0a 09 23 20 68  items. They..# h
4bb0: 61 76 65 20 74 6f 20 68 61 76 65 20 74 68 65 20  ave to have the 
4bc0: 73 61 6d 65 20 74 79 70 65 20 61 73 20 74 68 65  same type as the
4bd0: 20 63 68 61 6e 67 65 73 65 74 2c 20 62 65 69 6e   changeset, bein
4be0: 67 20 73 75 62 73 65 74 73 0a 09 23 20 6f 66 20  g subsets..# of 
4bf0: 69 74 73 20 69 74 65 6d 73 2e 20 54 68 69 73 20  its items. This 
4c00: 69 73 20 63 68 65 63 6b 65 64 20 69 6e 20 55 6e  is checked in Un
4c10: 74 61 67 31 2e 0a 0a 09 6c 6f 67 20 77 72 69 74  tag1....log writ
4c20: 65 20 38 20 63 73 65 74 73 20 7b 4f 4c 44 3a 20  e 8 csets {OLD: 
4c30: 5b 6c 73 6f 72 74 20 5b 24 63 73 65 74 20 69 74  [lsort [$cset it
4c40: 65 6d 73 5d 5d 7d 0a 09 56 61 6c 69 64 61 74 65  ems]]}..Validate
4c50: 46 72 61 67 6d 65 6e 74 73 20 24 63 73 65 74 20  Fragments $cset 
4c60: 24 61 72 67 73 0a 0a 09 23 20 41 6c 6c 20 63 68  $args...# All ch
4c70: 65 63 6b 73 20 70 61 73 73 2c 20 61 63 74 75 61  ecks pass, actua
4c80: 6c 6c 79 20 70 65 72 66 6f 72 6d 20 74 68 65 20  lly perform the 
4c90: 73 70 6c 69 74 2e 0a 0a 09 73 74 72 75 63 74 3a  split....struct:
4ca0: 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b 24 63  :list assign [$c
4cb0: 73 65 74 20 64 61 74 61 5d 20 70 72 6f 6a 65 63  set data] projec
4cc0: 74 20 63 73 74 79 70 65 20 63 73 73 72 63 0a 0a  t cstype cssrc..
4cd0: 09 73 65 74 20 70 72 65 64 65 63 65 73 73 6f 72  .set predecessor
4ce0: 73 20 5b 24 63 73 65 74 20 64 72 6f 70 5d 0a 09  s [$cset drop]..
4cf0: 24 63 73 65 74 20 64 65 73 74 72 6f 79 0a 0a 09  $cset destroy...
4d00: 73 65 74 20 6e 65 77 63 73 65 74 73 20 7b 7d 0a  set newcsets {}.
4d10: 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65 6e  .foreach fragmen
4d20: 74 69 74 65 6d 73 20 24 61 72 67 73 20 7b 0a 09  titems $args {..
4d30: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 38 20      log write 8 
4d40: 63 73 65 74 73 20 7b 4d 41 4b 45 3a 20 5b 6c 73  csets {MAKE: [ls
4d50: 6f 72 74 20 24 66 72 61 67 6d 65 6e 74 69 74 65  ort $fragmentite
4d60: 6d 73 5d 7d 0a 0a 09 20 20 20 20 73 65 74 20 66  ms]}...    set f
4d70: 72 61 67 6d 65 6e 74 20 5b 24 74 79 70 65 20 25  ragment [$type %
4d80: 41 55 54 4f 25 20 24 70 72 6f 6a 65 63 74 20 24  AUTO% $project $
4d90: 63 73 74 79 70 65 20 24 63 73 73 72 63 20 5c 0a  cstype $cssrc \.
4da0: 09 09 09 20 20 20 20 20 20 5b 55 6e 74 61 67 20  ...      [Untag 
4db0: 24 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 20 24  $fragmentitems $
4dc0: 63 73 74 79 70 65 5d 5d 0a 09 20 20 20 20 6c 61  cstype]]..    la
4dd0: 70 70 65 6e 64 20 6e 65 77 63 73 65 74 73 20 24  ppend newcsets $
4de0: 66 72 61 67 6d 65 6e 74 0a 0a 09 20 20 20 20 24  fragment...    $
4df0: 66 72 61 67 6d 65 6e 74 20 70 65 72 73 69 73 74  fragment persist
4e00: 0a 09 20 20 20 20 24 66 72 61 67 6d 65 6e 74 20  ..    $fragment 
4e10: 64 65 74 65 72 6d 69 6e 65 73 75 63 63 65 73 73  determinesuccess
4e20: 6f 72 73 0a 09 7d 0a 0a 09 23 20 54 68 65 20 70  ors..}...# The p
4e30: 72 65 64 65 63 65 73 73 6f 72 73 20 68 61 76 65  redecessors have
4e40: 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68   to recompute th
4e50: 65 69 72 20 73 75 63 63 65 73 73 6f 72 73 2c 20  eir successors, 
4e60: 69 2e 65 2e 0a 09 23 20 72 65 6d 6f 76 65 20 74  i.e...# remove t
4e70: 68 65 20 64 72 6f 70 70 65 64 20 63 68 61 6e 67  he dropped chang
4e80: 65 73 65 74 20 61 6e 64 20 70 75 74 20 6f 6e 65  eset and put one
4e90: 20 6f 66 20 74 68 65 20 66 72 61 67 6d 65 6e 74   of the fragment
4ea0: 73 0a 09 23 20 69 6e 74 6f 20 69 74 73 20 70 6c  s..# into its pl
4eb0: 61 63 65 2e 0a 09 66 6f 72 65 61 63 68 20 70 20  ace...foreach p 
4ec0: 24 70 72 65 64 65 63 65 73 73 6f 72 73 20 7b 0a  $predecessors {.
4ed0: 09 20 20 20 20 24 70 20 64 65 74 65 72 6d 69 6e  .    $p determin
4ee0: 65 73 75 63 63 65 73 73 6f 72 73 0a 09 7d 0a 0a  esuccessors..}..
4ef0: 09 72 65 74 75 72 6e 20 24 6e 65 77 63 73 65 74  .return $newcset
4f00: 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70  s.    }..    typ
4f10: 65 6d 65 74 68 6f 64 20 69 74 65 6d 73 74 72 20  emethod itemstr 
4f20: 7b 69 74 65 6d 7d 20 7b 0a 09 73 74 72 75 63 74  {item} {..struct
4f30: 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 24 69  ::list assign $i
4f40: 74 65 6d 20 69 74 79 70 65 20 69 69 64 0a 09 72  tem itype iid..r
4f50: 65 74 75 72 6e 20 5b 24 69 74 79 70 65 20 73 74  eturn [$itype st
4f60: 72 20 24 69 69 64 5d 0a 20 20 20 20 7d 0a 0a 20  r $iid].    }.. 
4f70: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 73 74     typemethod st
4f80: 72 6c 69 73 74 20 7b 63 68 61 6e 67 65 73 65 74  rlist {changeset
4f90: 73 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b 6a 6f  s} {..return [jo
4fa0: 69 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74  in [struct::list
4fb0: 20 6d 61 70 20 24 63 68 61 6e 67 65 73 65 74 73   map $changesets
4fc0: 20 5b 6d 79 70 72 6f 63 20 49 44 5d 5d 5d 0a 20   [myproc ID]]]. 
4fd0: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 49     }..    proc I
4fe0: 44 20 7b 63 73 65 74 7d 20 7b 20 24 63 73 65 74  D {cset} { $cset
4ff0: 20 73 74 72 20 7d 0a 0a 20 20 20 20 70 72 6f 63   str }..    proc
5000: 20 55 6e 74 61 67 20 7b 74 61 67 67 65 64 69 74   Untag {taggedit
5010: 65 6d 73 20 63 73 74 79 70 65 7d 20 7b 0a 09 72  ems cstype} {..r
5020: 65 74 75 72 6e 20 5b 73 74 72 75 63 74 3a 3a 6c  eturn [struct::l
5030: 69 73 74 20 6d 61 70 20 24 74 61 67 67 65 64 69  ist map $taggedi
5040: 74 65 6d 73 20 5b 6d 79 70 72 6f 63 20 55 6e 74  tems [myproc Unt
5050: 61 67 31 20 24 63 73 74 79 70 65 5d 5d 0a 20 20  ag1 $cstype]].  
5060: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 55 6e    }..    proc Un
5070: 74 61 67 31 20 7b 63 73 74 79 70 65 20 74 68 65  tag1 {cstype the
5080: 69 74 65 6d 7d 20 7b 0a 09 73 74 72 75 63 74 3a  item} {..struct:
5090: 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 24 74 68  :list assign $th
50a0: 65 69 74 65 6d 20 74 20 69 0a 09 69 6e 74 65 67  eitem t i..integ
50b0: 72 69 74 79 20 61 73 73 65 72 74 20 7b 24 63 73  rity assert {$cs
50c0: 74 79 70 65 20 65 71 20 24 74 7d 20 7b 49 74 65  type eq $t} {Ite
50d0: 6d 20 24 69 27 73 20 74 79 70 65 20 69 73 20 27  m $i's type is '
50e0: 24 74 27 2c 20 65 78 70 65 63 74 65 64 20 27 24  $t', expected '$
50f0: 63 73 74 79 70 65 27 7d 0a 09 72 65 74 75 72 6e  cstype'}..return
5100: 20 24 69 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70   $i.    }..    p
5110: 72 6f 63 20 54 61 67 49 74 65 6d 44 69 63 74 20  roc TagItemDict 
5120: 7b 69 74 65 6d 64 69 63 74 20 63 73 74 79 70 65  {itemdict cstype
5130: 7d 20 7b 0a 09 73 65 74 20 72 65 73 20 7b 7d 0a  } {..set res {}.
5140: 09 66 6f 72 65 61 63 68 20 7b 69 20 76 7d 20 24  .foreach {i v} $
5150: 69 74 65 6d 64 69 63 74 20 7b 20 6c 61 70 70 65  itemdict { lappe
5160: 6e 64 20 72 65 73 20 5b 6c 69 73 74 20 24 63 73  nd res [list $cs
5170: 74 79 70 65 20 24 69 5d 20 24 76 20 7d 0a 09 72  type $i] $v }..r
5180: 65 74 75 72 6e 20 24 72 65 73 0a 20 20 20 20 7d  eturn $res.    }
5190: 0a 0a 20 20 20 20 70 72 6f 63 20 56 61 6c 69 64  ..    proc Valid
51a0: 61 74 65 46 72 61 67 6d 65 6e 74 73 20 7b 63 73  ateFragments {cs
51b0: 65 74 20 66 72 61 67 6d 65 6e 74 73 7d 20 7b 0a  et fragments} {.
51c0: 09 23 20 43 68 65 63 6b 20 74 68 65 20 76 61 72  .# Check the var
51d0: 69 6f 75 73 20 69 6e 74 65 67 72 69 74 79 20 63  ious integrity c
51e0: 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72 20 74  onstraints for t
51f0: 68 65 20 66 72 61 67 6d 65 6e 74 73 0a 09 23 20  he fragments..# 
5200: 73 70 65 63 69 66 79 69 6e 67 20 68 6f 77 20 74  specifying how t
5210: 6f 20 73 70 6c 69 74 20 74 68 65 20 63 68 61 6e  o split the chan
5220: 67 65 73 65 74 3a 0a 09 23 0a 09 23 20 2a 20 57  geset:..#..# * W
5230: 65 20 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20  e must have two 
5240: 6f 72 20 6d 6f 72 65 20 66 72 61 67 6d 65 6e 74  or more fragment
5250: 73 2c 20 61 73 20 73 70 6c 69 74 74 69 6e 67 20  s, as splitting 
5260: 61 0a 09 23 20 20 20 63 68 61 6e 67 65 73 65 74  a..#   changeset
5270: 20 69 6e 74 6f 20 6f 6e 65 20 6d 61 6b 65 73 20   into one makes 
5280: 6e 6f 20 73 65 6e 73 65 2e 0a 09 23 20 2a 20 4e  no sense...# * N
5290: 6f 20 66 72 61 67 6d 65 6e 74 20 6d 61 79 20 62  o fragment may b
52a0: 65 20 65 6d 70 74 79 2e 0a 09 23 20 2a 20 41 6c  e empty...# * Al
52b0: 6c 20 66 72 61 67 6d 65 6e 74 73 20 68 61 76 65  l fragments have
52c0: 20 74 6f 20 62 65 20 74 72 75 65 20 73 75 62 73   to be true subs
52d0: 65 74 73 20 6f 66 20 74 68 65 20 69 74 65 6d 73  ets of the items
52e0: 20 69 6e 20 74 68 65 0a 09 23 20 20 20 63 68 61   in the..#   cha
52f0: 6e 67 65 73 65 74 20 74 6f 20 73 70 6c 69 74 2e  ngeset to split.
5300: 20 54 68 65 20 27 74 72 75 65 27 20 69 73 20 69   The 'true' is i
5310: 6d 70 6c 69 65 64 20 62 65 63 61 75 73 65 20 6e  mplied because n
5320: 6f 6e 65 20 61 72 65 0a 09 23 20 20 20 61 6c 6c  one are..#   all
5330: 6f 77 65 64 20 74 6f 20 62 65 20 65 6d 70 74 79  owed to be empty
5340: 2c 20 73 6f 20 65 61 63 68 20 68 61 73 20 74 6f  , so each has to
5350: 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e   be smaller than
5360: 20 74 68 65 0a 09 23 20 20 20 74 6f 74 61 6c 2e   the..#   total.
5370: 0a 09 23 20 2a 20 54 68 65 20 75 6e 69 6f 6e 20  ..# * The union 
5380: 6f 66 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73  of the fragments
5390: 20 68 61 73 20 74 6f 20 62 65 20 74 68 65 20 69   has to be the i
53a0: 74 65 6d 20 73 65 74 20 6f 66 20 74 68 65 0a 09  tem set of the..
53b0: 23 20 20 20 63 68 61 6e 67 65 73 65 74 2e 0a 09  #   changeset...
53c0: 23 20 2a 20 54 68 65 20 66 72 61 67 6d 65 6e 74  # * The fragment
53d0: 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61   must not overla
53e0: 70 2c 20 69 2e 65 2e 20 74 68 65 69 72 20 70 61  p, i.e. their pa
53f0: 69 72 77 69 73 65 0a 09 23 20 20 20 69 6e 74 65  irwise..#   inte
5400: 72 73 65 63 74 69 6f 6e 73 20 68 61 76 65 20 74  rsections have t
5410: 6f 20 62 65 20 65 6d 70 74 79 2e 0a 0a 09 73 65  o be empty....se
5420: 74 20 63 6f 76 65 72 20 7b 7d 0a 09 66 6f 72 65  t cover {}..fore
5430: 61 63 68 20 66 72 61 67 6d 65 6e 74 69 74 65 6d  ach fragmentitem
5440: 73 20 24 66 72 61 67 6d 65 6e 74 73 20 7b 0a 09  s $fragments {..
5450: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 38 20      log write 8 
5460: 63 73 65 74 73 20 7b 4e 45 57 3a 20 5b 6c 73 6f  csets {NEW: [lso
5470: 72 74 20 24 66 72 61 67 6d 65 6e 74 69 74 65 6d  rt $fragmentitem
5480: 73 5d 7d 0a 0a 09 20 20 20 20 69 6e 74 65 67 72  s]}...    integr
5490: 69 74 79 20 61 73 73 65 72 74 20 7b 0a 09 09 21  ity assert {...!
54a0: 5b 73 74 72 75 63 74 3a 3a 73 65 74 20 65 6d 70  [struct::set emp
54b0: 74 79 20 24 66 72 61 67 6d 65 6e 74 69 74 65 6d  ty $fragmentitem
54c0: 73 5d 0a 09 20 20 20 20 7d 20 7b 63 68 61 6e 67  s]..    } {chang
54d0: 65 73 65 74 20 66 72 61 67 6d 65 6e 74 20 69 73  eset fragment is
54e0: 20 65 6d 70 74 79 7d 0a 0a 09 20 20 20 20 69 6e   empty}...    in
54f0: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b  tegrity assert {
5500: 0a 09 09 5b 73 74 72 75 63 74 3a 3a 73 65 74 20  ...[struct::set 
5510: 73 75 62 73 65 74 6f 66 20 24 66 72 61 67 6d 65  subsetof $fragme
5520: 6e 74 69 74 65 6d 73 20 5b 24 63 73 65 74 20 69  ntitems [$cset i
5530: 74 65 6d 73 5d 5d 0a 09 20 20 20 20 7d 20 7b 63  tems]]..    } {c
5540: 68 61 6e 67 65 73 65 74 20 66 72 61 67 6d 65 6e  hangeset fragmen
5550: 74 20 69 73 20 6e 6f 74 20 61 20 73 75 62 73 65  t is not a subse
5560: 74 7d 0a 09 20 20 20 20 73 74 72 75 63 74 3a 3a  t}..    struct::
5570: 73 65 74 20 61 64 64 20 63 6f 76 65 72 20 24 66  set add cover $f
5580: 72 61 67 6d 65 6e 74 69 74 65 6d 73 0a 09 7d 0a  ragmentitems..}.
5590: 0a 09 69 6e 74 65 67 72 69 74 79 20 61 73 73 65  ..integrity asse
55a0: 72 74 20 7b 0a 09 20 20 20 20 5b 73 74 72 75 63  rt {..    [struc
55b0: 74 3a 3a 73 65 74 20 65 71 75 61 6c 20 24 63 6f  t::set equal $co
55c0: 76 65 72 20 5b 24 63 73 65 74 20 69 74 65 6d 73  ver [$cset items
55d0: 5d 5d 0a 09 20 7d 20 7b 54 68 65 20 66 72 61 67  ]].. } {The frag
55e0: 6d 65 6e 74 73 20 64 6f 20 6e 6f 74 20 63 6f 76  ments do not cov
55f0: 65 72 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  er the original 
5600: 63 68 61 6e 67 65 73 65 74 7d 0a 0a 09 73 65 74  changeset}...set
5610: 20 69 20 31 0a 09 66 6f 72 65 61 63 68 20 66 69   i 1..foreach fi
5620: 61 20 24 66 72 61 67 6d 65 6e 74 73 20 7b 0a 09  a $fragments {..
5630: 20 20 20 20 66 6f 72 65 61 63 68 20 66 69 62 20      foreach fib 
5640: 5b 6c 72 61 6e 67 65 20 24 66 72 61 67 6d 65 6e  [lrange $fragmen
5650: 74 73 20 24 69 20 65 6e 64 5d 20 7b 0a 09 09 69  ts $i end] {...i
5660: 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20  ntegrity assert 
5670: 7b 0a 09 09 20 20 20 20 5b 73 74 72 75 63 74 3a  {...    [struct:
5680: 3a 73 65 74 20 65 6d 70 74 79 20 5b 73 74 72 75  :set empty [stru
5690: 63 74 3a 3a 73 65 74 20 69 6e 74 65 72 73 65 63  ct::set intersec
56a0: 74 20 24 66 69 61 20 24 66 69 62 5d 5d 0a 09 09  t $fia $fib]]...
56b0: 7d 20 7b 54 68 65 20 66 72 61 67 6d 65 6e 74 73  } {The fragments
56c0: 20 3c 24 66 69 61 3e 20 61 6e 64 20 3c 24 66 69   <$fia> and <$fi
56d0: 62 3e 20 6f 76 65 72 6c 61 70 7d 0a 09 20 20 20  b> overlap}..   
56e0: 20 7d 0a 09 20 20 20 20 69 6e 63 72 20 69 0a 09   }..    incr i..
56f0: 7d 0a 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d  }...return.    }
5700: 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23  ..    # # ## ###
5710: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20   ##### ######## 
5720: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 20  #############.  
5730: 20 20 23 23 20 53 74 61 74 65 0a 0a 20 20 20 20    ## State..    
5740: 76 61 72 69 61 62 6c 65 20 6d 79 69 64 20 20 20  variable myid   
5750: 20 20 20 20 20 7b 7d 20 3b 20 23 20 49 64 20 6f       {} ; # Id o
5760: 66 20 74 68 65 20 63 73 65 74 20 66 6f 72 20 74  f the cset for t
5770: 68 65 20 70 65 72 73 69 73 74 65 6e 74 0a 09 09  he persistent...
5780: 09 20 20 20 20 20 20 23 20 73 74 61 74 65 2e 0a  .      # state..
5790: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 70      variable myp
57a0: 72 6f 6a 65 63 74 20 20 20 7b 7d 20 3b 20 23 20  roject   {} ; # 
57b0: 52 65 66 65 72 65 6e 63 65 20 6f 66 20 74 68 65  Reference of the
57c0: 20 70 72 6f 6a 65 63 74 20 6f 62 6a 65 63 74 20   project object 
57d0: 74 68 65 0a 09 09 09 20 20 20 20 20 20 23 20 63  the....      # c
57e0: 68 61 6e 67 65 73 65 74 20 62 65 6c 6f 6e 67 73  hangeset belongs
57f0: 20 74 6f 2e 0a 20 20 20 20 76 61 72 69 61 62 6c   to..    variabl
5800: 65 20 6d 79 74 79 70 65 20 20 20 20 20 20 7b 7d  e mytype      {}
5810: 20 3b 20 23 20 57 68 61 74 20 74 68 65 20 63 68   ; # What the ch
5820: 61 6e 67 65 73 65 74 20 69 73 20 62 61 73 65 64  angeset is based
5830: 20 6f 6e 0a 09 09 09 20 20 20 20 20 20 23 20 28   on....      # (
5840: 72 65 76 69 73 69 6f 6e 73 2c 20 74 61 67 73 2c  revisions, tags,
5850: 20 6f 72 20 62 72 61 6e 63 68 65 73 29 2e 0a 09   or branches)...
5860: 09 09 20 20 20 20 20 20 23 20 56 61 6c 75 65 73  ..      # Values
5870: 3a 20 53 65 65 20 6d 79 63 73 74 79 70 65 2e 20  : See mycstype. 
5880: 4e 6f 74 65 20 74 68 61 74 20 77 65 0a 09 09 09  Note that we....
5890: 20 20 20 20 20 20 23 20 68 61 76 65 20 74 6f 20        # have to 
58a0: 6b 65 65 70 20 74 68 65 20 6e 61 6d 65 73 20 6f  keep the names o
58b0: 66 20 74 68 65 20 68 65 6c 70 65 72 0a 09 09 09  f the helper....
58c0: 20 20 20 20 20 20 23 20 73 69 6e 67 6c 65 74 6f        # singleto
58d0: 6e 73 20 69 6e 20 73 79 6e 63 20 77 69 74 68 20  ns in sync with 
58e0: 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 09 09 09  the contents....
58f0: 20 20 20 20 20 20 23 20 6f 66 20 73 74 61 74 65        # of state
5900: 20 74 61 62 6c 65 20 27 63 73 74 79 70 65 27 2c   table 'cstype',
5910: 20 61 6e 64 20 76 61 72 69 6f 75 73 0a 09 09 09   and various....
5920: 20 20 20 20 20 20 23 20 6f 74 68 65 72 20 70 6c        # other pl
5930: 61 63 65 73 20 75 73 69 6e 67 20 74 68 65 6d 20  aces using them 
5940: 68 61 72 64 77 69 72 65 64 2e 0a 20 20 20 20 76  hardwired..    v
5950: 61 72 69 61 62 6c 65 20 6d 79 74 79 70 65 6f 62  ariable mytypeob
5960: 6a 20 20 20 7b 7d 20 3b 20 23 20 52 65 66 65 72  j   {} ; # Refer
5970: 65 6e 63 65 20 74 6f 20 74 68 65 20 63 6f 6e 74  ence to the cont
5980: 61 69 6e 65 72 20 66 6f 72 20 74 68 65 0a 09 09  ainer for the...
5990: 09 20 20 20 20 20 20 23 20 74 79 70 65 20 64 65  .      # type de
59a0: 70 65 6e 64 65 6e 74 20 63 6f 64 65 2e 20 44 65  pendent code. De
59b0: 72 69 76 65 64 20 66 72 6f 6d 0a 09 09 09 20 20  rived from....  
59c0: 20 20 20 20 23 20 6d 79 74 79 70 65 2e 0a 20 20      # mytype..  
59d0: 20 20 76 61 72 69 61 62 6c 65 20 6d 79 73 72 63    variable mysrc
59e0: 69 64 20 20 20 20 20 7b 7d 20 3b 20 23 20 49 64  id     {} ; # Id
59f0: 20 6f 66 20 74 68 65 20 6d 65 74 61 64 61 74 61   of the metadata
5a00: 20 6f 72 20 73 79 6d 62 6f 6c 20 74 68 65 20 63   or symbol the c
5a10: 73 65 74 0a 09 09 09 20 20 20 20 20 20 23 20 69  set....      # i
5a20: 73 20 62 61 73 65 64 20 6f 6e 2e 0a 20 20 20 20  s based on..    
5a30: 76 61 72 69 61 62 6c 65 20 6d 79 69 74 65 6d 73  variable myitems
5a40: 20 20 20 20 20 7b 7d 20 3b 20 23 20 4c 69 73 74       {} ; # List
5a50: 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c 65 76   of the file lev
5a60: 65 6c 20 72 65 76 69 73 69 6f 6e 73 2c 0a 09 09  el revisions,...
5a70: 09 20 20 20 20 20 20 23 20 74 61 67 73 2c 20 6f  .      # tags, o
5a80: 72 20 62 72 61 6e 63 68 65 73 20 69 6e 20 74 68  r branches in th
5a90: 65 20 63 73 65 74 2c 20 61 73 0a 09 09 09 20 20  e cset, as....  
5aa0: 20 20 20 20 23 20 69 64 73 2e 20 4e 6f 74 20 74      # ids. Not t
5ab0: 61 67 67 65 64 2e 0a 20 20 20 20 76 61 72 69 61  agged..    varia
5ac0: 62 6c 65 20 6d 79 74 69 74 65 6d 73 20 20 20 20  ble mytitems    
5ad0: 7b 7d 20 3b 20 23 20 41 73 20 6d 79 69 74 65 6d  {} ; # As myitem
5ae0: 73 2c 20 74 68 65 20 74 61 67 67 65 64 20 66 6f  s, the tagged fo
5af0: 72 6d 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65  rm..    variable
5b00: 20 6d 79 70 6f 73 20 20 20 20 20 20 20 7b 7d 20   mypos       {} 
5b10: 3b 20 23 20 43 6f 6d 6d 69 74 20 70 6f 73 69 74  ; # Commit posit
5b20: 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 61 6e 67  ion of the chang
5b30: 65 73 65 74 2c 20 69 66 0a 09 09 09 20 20 20 20  eset, if....    
5b40: 20 20 23 20 6b 6e 6f 77 6e 2e 0a 0a 20 20 20 20    # known...    
5b50: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
5b60: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
5b70: 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 49  #######.    ## I
5b80: 6e 74 65 72 6e 61 6c 20 6d 65 74 68 6f 64 73 0a  nternal methods.
5b90: 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c  .    typevariabl
5ba0: 65 20 6d 79 63 6f 75 6e 74 65 72 20 20 20 20 20  e mycounter     
5bb0: 20 20 20 30 20 3b 20 23 20 49 64 20 63 6f 75 6e     0 ; # Id coun
5bc0: 74 65 72 20 66 6f 72 20 63 73 65 74 73 2e 20 4c  ter for csets. L
5bd0: 61 73 74 20 69 64 0a 09 09 09 09 20 20 20 20 20  ast id.....     
5be0: 20 23 20 75 73 65 64 2e 0a 20 20 20 20 74 79 70   # used..    typ
5bf0: 65 76 61 72 69 61 62 6c 65 20 6d 79 63 73 74 79  evariable mycsty
5c00: 70 65 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23  pe -array {} ; #
5c10: 20 4d 61 70 20 63 73 74 79 70 65 73 20 28 6e 61   Map cstypes (na
5c20: 6d 65 73 29 20 74 6f 20 70 65 72 73 69 73 74 65  mes) to persiste
5c30: 6e 74 0a 09 09 09 09 20 20 20 20 20 20 23 20 69  nt.....      # i
5c40: 64 73 2e 20 4e 6f 74 65 20 74 68 61 74 20 77 65  ds. Note that we
5c50: 20 68 61 76 65 20 74 6f 20 6b 65 65 70 0a 09 09   have to keep...
5c60: 09 09 20 20 20 20 20 20 23 20 74 68 65 20 6e 61  ..      # the na
5c70: 6d 65 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65  mes in the table
5c80: 20 27 63 73 74 79 70 65 27 0a 09 09 09 09 20 20   'cstype'.....  
5c90: 20 20 20 20 23 20 69 6e 20 73 79 6e 63 20 77 69      # in sync wi
5ca0: 74 68 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  th the names of 
5cb0: 74 68 65 0a 09 09 09 09 20 20 20 20 20 20 23 20  the.....      # 
5cc0: 68 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e  helper singleton
5cd0: 73 2e 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68  s...    typemeth
5ce0: 6f 64 20 69 6e 6f 72 64 65 72 20 7b 70 72 6f 6a  od inorder {proj
5cf0: 65 63 74 69 64 7d 20 7b 0a 09 23 20 52 65 74 75  ectid} {..# Retu
5d00: 72 6e 20 61 6c 6c 20 72 65 76 69 73 69 6f 6e 20  rn all revision 
5d10: 63 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20 74  changesets for t
5d20: 68 65 20 73 70 65 63 69 66 69 65 64 20 70 72 6f  he specified pro
5d30: 6a 65 63 74 2c 20 69 6e 0a 09 23 20 74 68 65 20  ject, in..# the 
5d40: 6f 72 64 65 72 20 67 69 76 65 6e 20 74 6f 20 74  order given to t
5d50: 68 65 6d 20 62 79 20 74 68 65 20 73 6f 72 74 20  hem by the sort 
5d60: 70 61 73 73 65 73 2e 20 42 6f 74 68 20 74 68 65  passes. Both the
5d70: 0a 09 23 20 66 69 6c 74 65 72 69 6e 67 20 62 79  ..# filtering by
5d80: 20 70 72 6f 6a 65 63 74 20 61 6e 64 20 73 6f 72   project and sor
5d90: 74 69 6e 67 20 6d 61 6b 65 20 75 73 65 20 6f 66  ting make use of
5da0: 20 27 70 72 6f 6a 65 63 74 3a 3a 72 65 76 0a 09   'project::rev..
5db0: 23 20 72 65 76 27 20 69 6d 70 6f 73 73 69 62 6c  # rev' impossibl
5dc0: 65 2e 0a 0a 09 73 65 74 20 72 65 73 20 7b 7d 0a  e....set res {}.
5dd0: 09 66 6f 72 65 61 63 68 20 7b 63 69 64 20 63 64  .foreach {cid cd
5de0: 61 74 65 7d 20 5b 73 74 61 74 65 20 72 75 6e 20  ate} [state run 
5df0: 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 43 2e  {..    SELECT C.
5e00: 63 69 64 2c 20 54 2e 64 61 74 65 0a 09 20 20 20  cid, T.date..   
5e10: 20 46 52 4f 4d 20 20 20 63 68 61 6e 67 65 73 65   FROM   changese
5e20: 74 20 43 2c 20 63 73 74 69 6d 65 73 74 61 6d 70  t C, cstimestamp
5e30: 20 54 0a 09 20 20 20 20 57 48 45 52 45 20 20 43   T..    WHERE  C
5e40: 2e 74 79 70 65 20 3d 20 30 20 20 20 20 20 20 20  .type = 0       
5e50: 20 20 20 2d 2d 20 6c 69 6d 69 74 20 74 6f 20 72     -- limit to r
5e60: 65 76 69 73 69 6f 6e 20 63 68 61 6e 67 65 73 65  evision changese
5e70: 74 73 0a 09 20 20 20 20 41 4e 44 20 20 20 20 43  ts..    AND    C
5e80: 2e 70 69 64 20 20 3d 20 24 70 72 6f 6a 65 63 74  .pid  = $project
5e90: 69 64 20 2d 2d 20 6c 69 6d 69 74 20 74 6f 20 63  id -- limit to c
5ea0: 68 61 6e 67 65 73 65 74 73 20 69 6e 20 70 72 6f  hangesets in pro
5eb0: 6a 65 63 74 0a 09 20 20 20 20 41 4e 44 20 20 20  ject..    AND   
5ec0: 20 54 2e 63 69 64 20 20 3d 20 43 2e 63 69 64 20   T.cid  = C.cid 
5ed0: 20 20 20 20 20 2d 2d 20 67 65 74 20 6f 72 64 65       -- get orde
5ee0: 72 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ring information
5ef0: 0a 09 20 20 20 20 4f 52 44 45 52 20 42 59 20 54  ..    ORDER BY T
5f00: 2e 64 61 74 65 20 20 20 20 20 20 20 20 20 20 20  .date           
5f10: 20 2d 2d 20 73 6f 72 74 20 69 6e 74 6f 20 63 6f   -- sort into co
5f20: 6d 6d 69 74 20 6f 72 64 65 72 0a 09 7d 5d 20 7b  mmit order..}] {
5f30: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65  ..    lappend re
5f40: 73 20 24 6d 79 69 64 6d 61 70 28 24 63 69 64 29  s $myidmap($cid)
5f50: 20 24 63 64 61 74 65 0a 09 7d 0a 09 72 65 74 75   $cdate..}..retu
5f60: 72 6e 20 24 72 65 73 0a 20 20 20 20 7d 0a 0a 20  rn $res.    }.. 
5f70: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 67 65     typemethod ge
5f80: 74 63 73 74 79 70 65 73 20 7b 7d 20 7b 0a 09 66  tcstypes {} {..f
5f90: 6f 72 65 61 63 68 20 7b 74 69 64 20 6e 61 6d 65  oreach {tid name
5fa0: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09  } [state run {..
5fb0: 20 20 20 20 53 45 4c 45 43 54 20 74 69 64 2c 20      SELECT tid, 
5fc0: 6e 61 6d 65 20 46 52 4f 4d 20 63 73 74 79 70 65  name FROM cstype
5fd0: 3b 0a 09 7d 5d 20 7b 20 73 65 74 20 6d 79 63 73  ;..}] { set mycs
5fe0: 74 79 70 65 28 24 6e 61 6d 65 29 20 24 74 69 64  type($name) $tid
5ff0: 20 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d   }..return.    }
6000: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ..    typemethod
6010: 20 6c 6f 61 64 20 7b 72 65 70 6f 73 69 74 6f 72   load {repositor
6020: 79 7d 20 7b 0a 09 73 65 74 20 6e 20 30 0a 09 6c  y} {..set n 0..l
6030: 6f 67 20 77 72 69 74 65 20 32 20 63 73 65 74 73  og write 2 csets
6040: 20 7b 4c 6f 61 64 69 6e 67 20 74 68 65 20 63 68   {Loading the ch
6050: 61 6e 67 65 73 65 74 73 7d 0a 09 66 6f 72 65 61  angesets}..forea
6060: 63 68 20 7b 69 64 20 70 69 64 20 63 73 74 79 70  ch {id pid cstyp
6070: 65 20 73 72 63 69 64 7d 20 5b 73 74 61 74 65 20  e srcid} [state 
6080: 72 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c 45 43  run {..    SELEC
6090: 54 20 43 2e 63 69 64 2c 20 43 2e 70 69 64 2c 20  T C.cid, C.pid, 
60a0: 43 53 2e 6e 61 6d 65 2c 20 43 2e 73 72 63 0a 09  CS.name, C.src..
60b0: 20 20 20 20 46 52 4f 4d 20 20 20 63 68 61 6e 67      FROM   chang
60c0: 65 73 65 74 20 43 2c 20 63 73 74 79 70 65 20 43  eset C, cstype C
60d0: 53 0a 09 20 20 20 20 57 48 45 52 45 20 20 43 2e  S..    WHERE  C.
60e0: 74 79 70 65 20 3d 20 43 53 2e 74 69 64 0a 09 20  type = CS.tid.. 
60f0: 20 20 20 4f 52 44 45 52 20 42 59 20 43 2e 63 69     ORDER BY C.ci
6100: 64 0a 09 7d 5d 20 7b 0a 09 20 20 20 20 6c 6f 67  d..}] {..    log
6110: 20 70 72 6f 67 72 65 73 73 20 32 20 63 73 65 74   progress 2 cset
6120: 73 20 24 6e 20 7b 7d 0a 09 20 20 20 20 73 65 74  s $n {}..    set
6130: 20 72 20 5b 24 74 79 70 65 20 25 41 55 54 4f 25   r [$type %AUTO%
6140: 20 5b 24 72 65 70 6f 73 69 74 6f 72 79 20 70 72   [$repository pr
6150: 6f 6a 65 63 74 6f 66 20 24 70 69 64 5d 20 24 63  ojectof $pid] $c
6160: 73 74 79 70 65 20 24 73 72 63 69 64 20 5b 73 74  stype $srcid [st
6170: 61 74 65 20 72 75 6e 20 7b 0a 09 09 53 45 4c 45  ate run {...SELE
6180: 43 54 20 43 2e 69 69 64 0a 09 09 46 52 4f 4d 20  CT C.iid...FROM 
6190: 20 20 63 73 69 74 65 6d 20 43 0a 09 09 57 48 45    csitem C...WHE
61a0: 52 45 20 20 43 2e 63 69 64 20 3d 20 24 69 64 0a  RE  C.cid = $id.
61b0: 09 09 4f 52 44 45 52 20 42 59 20 43 2e 70 6f 73  ..ORDER BY C.pos
61c0: 0a 09 20 20 20 20 7d 5d 20 24 69 64 5d 0a 09 20  ..    }] $id].. 
61d0: 20 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 09 72 65     incr n..}..re
61e0: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
61f0: 74 79 70 65 6d 65 74 68 6f 64 20 6c 6f 61 64 63  typemethod loadc
6200: 6f 75 6e 74 65 72 20 7b 7d 20 7b 0a 09 23 20 49  ounter {} {..# I
6210: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f  nitialize the co
6220: 75 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73  unter from the s
6230: 74 61 74 65 0a 09 6c 6f 67 20 77 72 69 74 65 20  tate..log write 
6240: 32 20 63 73 65 74 73 20 7b 4c 6f 61 64 69 6e 67  2 csets {Loading
6250: 20 63 68 61 6e 67 65 73 65 74 20 63 6f 75 6e 74   changeset count
6260: 65 72 7d 0a 09 73 65 74 20 6d 79 63 6f 75 6e 74  er}..set mycount
6270: 65 72 20 5b 73 74 61 74 65 20 6f 6e 65 20 7b 20  er [state one { 
6280: 53 45 4c 45 43 54 20 4d 41 58 28 63 69 64 29 20  SELECT MAX(cid) 
6290: 46 52 4f 4d 20 63 68 61 6e 67 65 73 65 74 20 7d  FROM changeset }
62a0: 5d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  ]..return.    }.
62b0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
62c0: 6e 75 6d 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20  num {} { return 
62d0: 24 6d 79 63 6f 75 6e 74 65 72 20 7d 0a 0a 20 20  $mycounter }..  
62e0: 20 20 70 72 6f 63 20 49 6e 69 74 69 61 6c 69 7a    proc Initializ
62f0: 65 42 72 65 61 6b 53 74 61 74 65 20 7b 72 65 76  eBreakState {rev
6300: 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72  isions} {..upvar
6310: 20 31 20 70 6f 73 20 70 6f 73 20 63 72 6f 73 73   1 pos pos cross
6320: 20 63 72 6f 73 73 20 72 61 6e 67 65 20 72 61 6e   cross range ran
6330: 67 65 20 64 65 70 63 20 64 65 70 63 20 64 65 6c  ge depc depc del
6340: 74 61 20 64 65 6c 74 61 20 5c 0a 09 20 20 20 20  ta delta \..    
6350: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 64 65 70  dependencies dep
6360: 65 6e 64 65 6e 63 69 65 73 0a 0a 09 23 20 46 69  endencies...# Fi
6370: 72 73 74 20 77 65 20 63 72 65 61 74 65 20 61 20  rst we create a 
6380: 6d 61 70 20 6f 66 20 70 6f 73 69 74 69 6f 6e 73  map of positions
6390: 20 74 6f 20 6d 61 6b 65 20 69 74 20 65 61 73 69   to make it easi
63a0: 65 72 20 74 6f 0a 09 23 20 64 65 74 65 72 6d 69  er to..# determi
63b0: 6e 65 20 77 68 65 74 68 65 72 20 61 20 64 65 70  ne whether a dep
63c0: 65 6e 64 65 6e 63 79 20 63 72 6f 73 73 65 73 20  endency crosses 
63d0: 61 20 70 61 72 74 69 63 75 6c 61 72 20 69 6e 64  a particular ind
63e0: 65 78 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20  ex....log write 
63f0: 31 34 20 63 73 65 74 73 20 7b 49 42 53 3a 20 23  14 csets {IBS: #
6400: 72 65 76 20 5b 6c 6c 65 6e 67 74 68 20 24 72 65  rev [llength $re
6410: 76 69 73 69 6f 6e 73 5d 7d 0a 09 6c 6f 67 20 77  visions]}..log w
6420: 72 69 74 65 20 31 34 20 63 73 65 74 73 20 7b 49  rite 14 csets {I
6430: 42 53 3a 20 70 6f 73 20 6d 61 70 2c 20 63 72 6f  BS: pos map, cro
6440: 73 73 20 63 6f 75 6e 74 65 72 7d 0a 0a 09 61 72  ss counter}...ar
6450: 72 61 79 20 73 65 74 20 70 6f 73 20 20 20 7b 7d  ray set pos   {}
6460: 0a 09 61 72 72 61 79 20 73 65 74 20 63 72 6f 73  ..array set cros
6470: 73 20 7b 7d 0a 09 61 72 72 61 79 20 73 65 74 20  s {}..array set 
6480: 64 65 70 63 20 20 7b 7d 0a 09 73 65 74 20 72 61  depc  {}..set ra
6490: 6e 67 65 20 20 20 20 20 20 20 7b 7d 0a 09 73 65  nge       {}..se
64a0: 74 20 6e 20 30 0a 09 66 6f 72 65 61 63 68 20 72  t n 0..foreach r
64b0: 65 76 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 0a  ev $revisions {.
64c0: 09 20 20 20 20 6c 61 70 70 65 6e 64 20 72 61 6e  .    lappend ran
64d0: 67 65 20 24 6e 0a 09 20 20 20 20 73 65 74 20 70  ge $n..    set p
64e0: 6f 73 28 24 72 65 76 29 20 24 6e 0a 09 20 20 20  os($rev) $n..   
64f0: 20 73 65 74 20 63 72 6f 73 73 28 24 6e 29 20 30   set cross($n) 0
6500: 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d 0a  ..    incr n..}.
6510: 0a 09 6c 6f 67 20 77 72 69 74 65 20 31 34 20 63  ..log write 14 c
6520: 73 65 74 73 20 7b 49 42 53 3a 20 70 6f 73 2f 5b  sets {IBS: pos/[
6530: 61 72 72 61 79 20 73 69 7a 65 20 70 6f 73 5d 2c  array size pos],
6540: 20 63 72 6f 73 73 2f 5b 61 72 72 61 79 20 73 69   cross/[array si
6550: 7a 65 20 63 72 6f 73 73 5d 7d 0a 0a 09 23 20 53  ze cross]}...# S
6560: 65 63 6f 6e 64 6c 79 20 77 65 20 63 6f 75 6e 74  econdly we count
6570: 20 74 68 65 20 63 72 6f 73 73 69 6e 67 73 20 70   the crossings p
6580: 65 72 20 70 6f 73 69 74 69 6f 6e 2c 20 62 79 20  er position, by 
6590: 69 74 65 72 61 74 69 6e 67 0a 09 23 20 6f 76 65  iterating..# ove
65a0: 72 20 74 68 65 20 72 65 63 6f 72 64 65 64 20 69  r the recorded i
65b0: 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e  nternal dependen
65c0: 63 69 65 73 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20  cies....# Note: 
65d0: 49 66 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70  If the timestamp
65e0: 73 20 61 72 65 20 62 61 64 6c 79 20 6f 75 74 20  s are badly out 
65f0: 6f 66 20 6f 72 64 65 72 20 69 74 20 69 73 0a 09  of order it is..
6600: 23 20 20 20 20 20 20 20 70 6f 73 73 69 62 6c 65  #       possible
6610: 20 74 6f 20 68 61 76 65 20 61 20 62 61 63 6b 77   to have a backw
6620: 61 72 64 20 73 75 63 63 65 73 73 6f 72 20 64 65  ard successor de
6630: 70 65 6e 64 65 6e 63 79 2c 0a 09 23 20 20 20 20  pendency,..#    
6640: 20 20 20 69 2e 65 2e 20 77 69 74 68 20 73 74 61     i.e. with sta
6650: 72 74 20 3e 20 65 6e 64 2e 20 57 65 20 6d 61 79  rt > end. We may
6660: 20 68 61 76 65 20 74 6f 20 73 77 61 70 20 74 68   have to swap th
6670: 65 20 69 6e 64 69 63 65 73 0a 09 23 20 20 20 20  e indices..#    
6680: 20 20 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61     to ensure tha
6690: 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  t the following 
66a0: 6c 6f 6f 70 20 72 75 6e 73 20 63 6f 72 72 65 63  loop runs correc
66b0: 74 6c 79 2e 0a 09 23 0a 09 23 20 4e 6f 74 65 20  tly...#..# Note 
66c0: 32 3a 20 73 74 61 72 74 20 3d 3d 20 65 6e 64 20  2: start == end 
66d0: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e  is not possible.
66e0: 20 49 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   It indicates a.
66f0: 09 23 20 20 20 20 20 20 20 20 20 73 65 6c 66 2d  .#         self-
6700: 64 65 70 65 6e 64 65 6e 63 79 20 64 75 65 20 74  dependency due t
6710: 6f 20 74 68 65 20 75 6e 69 71 75 65 6e 65 73 73  o the uniqueness
6720: 20 6f 66 20 70 6f 73 69 74 69 6f 6e 73 2c 0a 09   of positions,..
6730: 23 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68  #         and th
6740: 61 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  at is something 
6750: 77 65 20 68 61 76 65 20 72 75 6c 65 64 20 6f 75  we have ruled ou
6760: 74 20 61 6c 72 65 61 64 79 2c 20 73 65 65 0a 09  t already, see..
6770: 23 20 20 20 20 20 20 20 20 20 27 72 65 76 20 69  #         'rev i
6780: 6e 74 65 72 6e 61 6c 73 75 63 63 65 73 73 6f 72  nternalsuccessor
6790: 73 27 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20  s'....log write 
67a0: 31 34 20 63 73 65 74 73 20 7b 49 42 53 3a 20 63  14 csets {IBS: c
67b0: 72 6f 73 73 20 63 6f 75 6e 74 65 72 20 66 69 6c  ross counter fil
67c0: 6c 69 6e 67 2c 20 70 6f 73 2f 63 72 6f 73 73 20  ling, pos/cross 
67d0: 6d 61 70 7d 0a 0a 09 66 6f 72 65 61 63 68 20 7b  map}...foreach {
67e0: 72 69 64 20 63 68 69 6c 64 72 65 6e 7d 20 5b 61  rid children} [a
67f0: 72 72 61 79 20 67 65 74 20 64 65 70 65 6e 64 65  rray get depende
6800: 6e 63 69 65 73 5d 20 7b 0a 09 20 20 20 20 66 6f  ncies] {..    fo
6810: 72 65 61 63 68 20 63 68 69 6c 64 20 24 63 68 69  reach child $chi
6820: 6c 64 72 65 6e 20 7b 0a 09 09 73 65 74 20 64 6b  ldren {...set dk
6830: 65 79 20 20 20 20 5b 6c 69 73 74 20 24 72 69 64  ey    [list $rid
6840: 20 24 63 68 69 6c 64 5d 0a 09 09 73 65 74 20 73   $child]...set s
6850: 74 61 72 74 20 20 20 24 70 6f 73 28 24 72 69 64  tart   $pos($rid
6860: 29 0a 09 09 73 65 74 20 65 6e 64 20 20 20 20 20  )...set end     
6870: 24 70 6f 73 28 24 63 68 69 6c 64 29 0a 09 09 73  $pos($child)...s
6880: 65 74 20 63 72 6f 73 73 65 73 20 7b 7d 0a 0a 09  et crosses {}...
6890: 09 69 66 20 7b 24 73 74 61 72 74 20 3e 20 24 65  .if {$start > $e
68a0: 6e 64 7d 20 7b 0a 09 09 20 20 20 20 77 68 69 6c  nd} {...    whil
68b0: 65 20 7b 24 65 6e 64 20 3c 20 24 73 74 61 72 74  e {$end < $start
68c0: 7d 20 7b 0a 09 09 09 6c 61 70 70 65 6e 64 20 63  } {....lappend c
68d0: 72 6f 73 73 65 73 20 24 65 6e 64 0a 09 09 09 69  rosses $end....i
68e0: 6e 63 72 20 63 72 6f 73 73 28 24 65 6e 64 29 0a  ncr cross($end).
68f0: 09 09 09 69 6e 63 72 20 65 6e 64 0a 09 09 20 20  ...incr end...  
6900: 20 20 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09    }...} else {..
6910: 09 20 20 20 20 77 68 69 6c 65 20 7b 24 73 74 61  .    while {$sta
6920: 72 74 20 3c 20 24 65 6e 64 7d 20 7b 0a 09 09 09  rt < $end} {....
6930: 6c 61 70 70 65 6e 64 20 63 72 6f 73 73 65 73 20  lappend crosses 
6940: 24 73 74 61 72 74 0a 09 09 09 69 6e 63 72 20 63  $start....incr c
6950: 72 6f 73 73 28 24 73 74 61 72 74 29 0a 09 09 09  ross($start)....
6960: 69 6e 63 72 20 73 74 61 72 74 0a 09 09 20 20 20  incr start...   
6970: 20 7d 0a 09 09 7d 0a 09 09 73 65 74 20 64 65 70   }...}...set dep
6980: 63 28 24 64 6b 65 79 29 20 24 63 72 6f 73 73 65  c($dkey) $crosse
6990: 73 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 6c 6f  s..    }..}...lo
69a0: 67 20 77 72 69 74 65 20 31 34 20 63 73 65 74 73  g write 14 csets
69b0: 20 7b 49 42 53 3a 20 70 6f 73 2f 5b 61 72 72 61   {IBS: pos/[arra
69c0: 79 20 73 69 7a 65 20 70 6f 73 5d 2c 20 63 72 6f  y size pos], cro
69d0: 73 73 2f 5b 61 72 72 61 79 20 73 69 7a 65 20 63  ss/[array size c
69e0: 72 6f 73 73 5d 2c 20 64 65 70 63 2f 5b 61 72 72  ross], depc/[arr
69f0: 61 79 20 73 69 7a 65 20 64 65 70 63 5d 20 28 66  ay size depc] (f
6a00: 6f 72 20 5b 6c 6c 65 6e 67 74 68 20 24 72 65 76  or [llength $rev
6a10: 69 73 69 6f 6e 73 5d 29 7d 0a 09 6c 6f 67 20 77  isions])}..log w
6a20: 72 69 74 65 20 31 34 20 63 73 65 74 73 20 7b 49  rite 14 csets {I
6a30: 42 53 3a 20 74 69 6d 65 73 74 61 6d 70 73 2c 20  BS: timestamps, 
6a40: 64 65 6c 74 61 73 7d 0a 0a 09 49 6e 69 74 69 61  deltas}...Initia
6a50: 6c 69 7a 65 44 65 6c 74 61 73 20 24 72 65 76 69  lizeDeltas $revi
6a60: 73 69 6f 6e 73 0a 0a 09 6c 6f 67 20 77 72 69 74  sions...log writ
6a70: 65 20 31 34 20 63 73 65 74 73 20 7b 49 42 53 3a  e 14 csets {IBS:
6a80: 20 64 65 6c 74 61 20 5b 61 72 72 61 79 20 73 69   delta [array si
6a90: 7a 65 20 64 65 6c 74 61 5d 7d 0a 09 72 65 74 75  ze delta]}..retu
6aa0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72  rn.    }..    pr
6ab0: 6f 63 20 49 6e 69 74 69 61 6c 69 7a 65 44 65 6c  oc InitializeDel
6ac0: 74 61 73 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20  tas {revisions} 
6ad0: 7b 0a 09 75 70 76 61 72 20 31 20 64 65 6c 74 61  {..upvar 1 delta
6ae0: 20 64 65 6c 74 61 0a 0a 09 23 20 50 75 6c 6c 20   delta...# Pull 
6af0: 74 68 65 20 74 69 6d 65 73 74 61 6d 70 73 20 66  the timestamps f
6b00: 6f 72 20 61 6c 6c 20 72 65 76 69 73 69 6f 6e 73  or all revisions
6b10: 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65   in the changese
6b20: 74 73 20 61 6e 64 0a 09 23 20 63 6f 6d 70 75 74  ts and..# comput
6b30: 65 20 74 68 65 69 72 20 64 65 6c 74 61 73 20 66  e their deltas f
6b40: 6f 72 20 75 73 65 20 62 79 20 74 68 65 20 62 72  or use by the br
6b50: 65 61 6b 20 66 69 6e 64 65 72 2e 0a 0a 09 61 72  eak finder....ar
6b60: 72 61 79 20 73 65 74 20 64 65 6c 74 61 20 7b 7d  ray set delta {}
6b70: 0a 09 61 72 72 61 79 20 73 65 74 20 73 74 61 6d  ..array set stam
6b80: 70 20 7b 7d 0a 0a 09 73 65 74 20 74 68 65 73 65  p {}...set these
6b90: 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73  t ('[join $revis
6ba0: 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66  ions {','}]')..f
6bb0: 6f 72 65 61 63 68 20 7b 72 69 64 20 74 69 6d 65  oreach {rid time
6bc0: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75  } [state run [su
6bd0: 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20  bst -nocommands 
6be0: 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b  -nobackslashes {
6bf0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
6c00: 69 64 2c 20 52 2e 64 61 74 65 0a 09 20 20 20 20  id, R.date..    
6c10: 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 0a  FROM revision R.
6c20: 09 20 20 20 20 57 48 45 52 45 20 52 2e 72 69 64  .    WHERE R.rid
6c30: 20 49 4e 20 24 74 68 65 73 65 74 0a 09 7d 5d 5d   IN $theset..}]]
6c40: 20 7b 0a 09 20 20 20 20 73 65 74 20 73 74 61 6d   {..    set stam
6c50: 70 28 24 72 69 64 29 20 24 74 69 6d 65 0a 09 7d  p($rid) $time..}
6c60: 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 31 34 20  ...log write 14 
6c70: 63 73 65 74 73 20 7b 49 42 53 3a 20 73 74 61 6d  csets {IBS: stam
6c80: 70 20 5b 61 72 72 61 79 20 73 69 7a 65 20 73 74  p [array size st
6c90: 61 6d 70 5d 7d 0a 0a 09 73 65 74 20 6e 20 30 0a  amp]}...set n 0.
6ca0: 09 66 6f 72 65 61 63 68 20 72 69 64 20 5b 6c 72  .foreach rid [lr
6cb0: 61 6e 67 65 20 24 72 65 76 69 73 69 6f 6e 73 20  ange $revisions 
6cc0: 30 20 65 6e 64 2d 31 5d 20 72 6e 65 78 74 20 5b  0 end-1] rnext [
6cd0: 6c 72 61 6e 67 65 20 24 72 65 76 69 73 69 6f 6e  lrange $revision
6ce0: 73 20 31 20 65 6e 64 5d 20 7b 0a 09 20 20 20 20  s 1 end] {..    
6cf0: 73 65 74 20 64 65 6c 74 61 28 24 6e 29 20 5b 65  set delta($n) [e
6d00: 78 70 72 20 7b 24 73 74 61 6d 70 28 24 72 6e 65  xpr {$stamp($rne
6d10: 78 74 29 20 2d 20 24 73 74 61 6d 70 28 24 72 69  xt) - $stamp($ri
6d20: 64 29 7d 5d 0a 09 20 20 20 20 69 6e 63 72 20 6e  d)}]..    incr n
6d30: 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  ..}..return.    
6d40: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 46 69 6e 64  }..    proc Find
6d50: 42 65 73 74 42 72 65 61 6b 20 7b 72 61 6e 67 65  BestBreak {range
6d60: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 63 72 6f  } {..upvar 1 cro
6d70: 73 73 20 63 72 6f 73 73 20 64 65 6c 74 61 20 64  ss cross delta d
6d80: 65 6c 74 61 0a 0a 09 23 20 44 65 74 65 72 6d 69  elta...# Determi
6d90: 6e 65 20 74 68 65 20 62 65 73 74 20 62 72 65 61  ne the best brea
6da0: 6b 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 74 68  k location in th
6db0: 65 20 67 69 76 65 6e 20 72 61 6e 67 65 20 6f 66  e given range of
6dc0: 0a 09 23 20 70 6f 73 69 74 69 6f 6e 73 2e 20 46  ..# positions. F
6dd0: 69 72 73 74 20 77 65 20 6c 6f 6f 6b 20 66 6f 72  irst we look for
6de0: 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 73 20 77   the locations w
6df0: 69 74 68 20 74 68 65 20 6d 61 78 69 6d 61 6c 0a  ith the maximal.
6e00: 09 23 20 6e 75 6d 62 65 72 20 6f 66 20 63 72 6f  .# number of cro
6e10: 73 73 69 6e 67 73 2e 20 49 66 20 74 68 65 72 65  ssings. If there
6e20: 20 61 72 65 20 73 65 76 65 72 61 6c 20 77 65 20   are several we 
6e30: 6c 6f 6f 6b 20 66 6f 72 20 74 68 65 0a 09 23 20  look for the..# 
6e40: 73 68 6f 72 74 65 73 74 20 74 69 6d 65 20 69 6e  shortest time in
6e50: 74 65 72 76 61 6c 20 61 6d 6f 6e 67 20 74 68 65  terval among the
6e60: 6d 2e 20 49 66 20 77 65 20 73 74 69 6c 6c 20 68  m. If we still h
6e70: 61 76 65 20 6d 75 6c 74 69 70 6c 65 0a 09 23 20  ave multiple..# 
6e80: 70 6f 73 73 69 62 69 6c 69 74 69 65 73 20 61 66  possibilities af
6e90: 74 65 72 20 74 68 61 74 20 77 65 20 73 65 6c 65  ter that we sele
6ea0: 63 74 20 74 68 65 20 65 61 72 6c 69 65 73 74 20  ct the earliest 
6eb0: 6c 6f 63 61 74 69 6f 6e 0a 09 23 20 61 6d 6f 6e  location..# amon
6ec0: 67 20 74 68 65 73 65 2e 0a 0a 09 23 20 4e 6f 74  g these....# Not
6ed0: 65 3a 20 49 66 20 74 68 65 20 6d 61 78 69 6d 61  e: If the maxima
6ee0: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 72 6f 73  l number of cros
6ef0: 73 69 6e 67 73 20 69 73 20 30 20 74 68 65 6e 20  sings is 0 then 
6f00: 74 68 65 20 72 61 6e 67 65 0a 09 23 20 20 20 20  the range..#    
6f10: 20 20 20 68 61 73 20 6e 6f 20 69 6e 74 65 72 6e     has no intern
6f20: 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2c  al dependencies,
6f30: 20 61 6e 64 20 6e 6f 20 62 72 65 61 6b 20 6c 6f   and no break lo
6f40: 63 61 74 69 6f 6e 20 61 74 0a 09 23 20 20 20 20  cation at..#    
6f50: 20 20 20 61 6c 6c 2e 20 54 68 69 73 20 70 6f 73     all. This pos
6f60: 73 69 62 69 6c 69 74 79 20 69 73 20 73 69 67 6e  sibility is sign
6f70: 61 6c 65 64 20 76 69 61 20 72 65 73 75 6c 74 20  aled via result 
6f80: 2d 31 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 41 20  -1....# Note: A 
6f90: 72 61 6e 67 65 20 6f 66 20 6c 65 6e 67 74 68 20  range of length 
6fa0: 31 20 6f 72 20 6c 65 73 73 20 63 61 6e 6e 6f 74  1 or less cannot
6fb0: 20 68 61 76 65 20 69 6e 74 65 72 6e 61 6c 0a 09   have internal..
6fc0: 23 20 20 20 20 20 20 20 64 65 70 65 6e 64 65 6e  #       dependen
6fd0: 63 69 65 73 2c 20 61 73 20 74 68 61 74 20 6e 65  cies, as that ne
6fe0: 65 64 73 20 61 74 20 6c 65 61 73 74 20 74 77 6f  eds at least two
6ff0: 20 72 65 76 69 73 69 6f 6e 73 20 69 6e 0a 09 23   revisions in..#
7000: 20 20 20 20 20 20 20 74 68 65 20 72 61 6e 67 65         the range
7010: 2e 0a 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68  ....if {[llength
7020: 20 24 72 61 6e 67 65 5d 20 3c 20 32 7d 20 7b 20   $range] < 2} { 
7030: 72 65 74 75 72 6e 20 2d 31 20 7d 0a 0a 09 73 65  return -1 }...se
7040: 74 20 6d 61 78 20 2d 31 0a 09 73 65 74 20 62 65  t max -1..set be
7050: 73 74 20 7b 7d 0a 0a 09 66 6f 72 65 61 63 68 20  st {}...foreach 
7060: 6c 6f 63 61 74 69 6f 6e 20 24 72 61 6e 67 65 20  location $range 
7070: 7b 0a 09 20 20 20 20 73 65 74 20 63 72 6f 73 73  {..    set cross
7080: 69 6e 67 73 20 24 63 72 6f 73 73 28 24 6c 6f 63  ings $cross($loc
7090: 61 74 69 6f 6e 29 0a 09 20 20 20 20 69 66 20 7b  ation)..    if {
70a0: 24 63 72 6f 73 73 69 6e 67 73 20 3e 20 24 6d 61  $crossings > $ma
70b0: 78 7d 20 7b 0a 09 09 73 65 74 20 6d 61 78 20 20  x} {...set max  
70c0: 24 63 72 6f 73 73 69 6e 67 73 0a 09 09 73 65 74  $crossings...set
70d0: 20 62 65 73 74 20 5b 6c 69 73 74 20 24 6c 6f 63   best [list $loc
70e0: 61 74 69 6f 6e 5d 0a 09 09 63 6f 6e 74 69 6e 75  ation]...continu
70f0: 65 0a 09 20 20 20 20 7d 20 65 6c 73 65 69 66 20  e..    } elseif 
7100: 7b 24 63 72 6f 73 73 69 6e 67 73 20 3d 3d 20 24  {$crossings == $
7110: 6d 61 78 7d 20 7b 0a 09 09 6c 61 70 70 65 6e 64  max} {...lappend
7120: 20 62 65 73 74 20 24 6c 6f 63 61 74 69 6f 6e 0a   best $location.
7130: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b  .    }..}...if {
7140: 24 6d 61 78 20 3d 3d 20 30 7d 20 20 20 20 20 20  $max == 0}      
7150: 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e 20 2d        { return -
7160: 31 20 7d 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74  1 }..if {[llengt
7170: 68 20 24 62 65 73 74 5d 20 3d 3d 20 31 7d 20 7b  h $best] == 1} {
7180: 20 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20   return [lindex 
7190: 24 62 65 73 74 20 30 5d 20 7d 0a 0a 09 73 65 74  $best 0] }...set
71a0: 20 6c 6f 63 61 74 69 6f 6e 73 20 24 62 65 73 74   locations $best
71b0: 0a 09 73 65 74 20 62 65 73 74 20 7b 7d 0a 09 73  ..set best {}..s
71c0: 65 74 20 6d 69 6e 20 2d 31 0a 0a 09 66 6f 72 65  et min -1...fore
71d0: 61 63 68 20 6c 6f 63 61 74 69 6f 6e 20 24 6c 6f  ach location $lo
71e0: 63 61 74 69 6f 6e 73 20 7b 0a 09 20 20 20 20 73  cations {..    s
71f0: 65 74 20 69 6e 74 65 72 76 61 6c 20 24 64 65 6c  et interval $del
7200: 74 61 28 24 6c 6f 63 61 74 69 6f 6e 29 0a 09 20  ta($location).. 
7210: 20 20 20 69 66 20 7b 28 24 6d 69 6e 20 3c 20 30     if {($min < 0
7220: 29 20 7c 7c 20 28 24 69 6e 74 65 72 76 61 6c 20  ) || ($interval 
7230: 3c 20 24 6d 69 6e 29 7d 20 7b 0a 09 09 73 65 74  < $min)} {...set
7240: 20 6d 69 6e 20 20 24 69 6e 74 65 72 76 61 6c 0a   min  $interval.
7250: 09 09 73 65 74 20 62 65 73 74 20 5b 6c 69 73 74  ..set best [list
7260: 20 24 6c 6f 63 61 74 69 6f 6e 5d 0a 09 20 20 20   $location]..   
7270: 20 7d 20 65 6c 73 65 69 66 20 7b 24 69 6e 74 65   } elseif {$inte
7280: 72 76 61 6c 20 3d 3d 20 24 6d 69 6e 7d 20 7b 0a  rval == $min} {.
7290: 09 09 6c 61 70 70 65 6e 64 20 62 65 73 74 20 24  ..lappend best $
72a0: 6c 6f 63 61 74 69 6f 6e 0a 09 20 20 20 20 7d 0a  location..    }.
72b0: 09 7d 0a 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74  .}...if {[llengt
72c0: 68 20 24 62 65 73 74 5d 20 3d 3d 20 31 7d 20 7b  h $best] == 1} {
72d0: 20 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20   return [lindex 
72e0: 24 62 65 73 74 20 30 5d 20 7d 0a 0a 09 72 65 74  $best 0] }...ret
72f0: 75 72 6e 20 5b 6c 69 6e 64 65 78 20 5b 6c 73 6f  urn [lindex [lso
7300: 72 74 20 2d 69 6e 74 65 67 65 72 20 2d 69 6e 63  rt -integer -inc
7310: 72 65 61 73 69 6e 67 20 24 62 65 73 74 5d 20 30  reasing $best] 0
7320: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f  ].    }..    pro
7330: 63 20 43 75 74 41 74 20 7b 6c 6f 63 61 74 69 6f  c CutAt {locatio
7340: 6e 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 63 72  n} {..upvar 1 cr
7350: 6f 73 73 20 63 72 6f 73 73 20 64 65 70 63 20 64  oss cross depc d
7360: 65 70 63 0a 0a 09 23 20 49 74 20 77 61 73 20 64  epc...# It was d
7370: 65 63 69 64 65 64 20 74 6f 20 73 70 6c 69 74 20  ecided to split 
7380: 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 61 74  the changeset at
7390: 20 74 68 65 20 67 69 76 65 6e 0a 09 23 20 6c 6f   the given..# lo
73a0: 63 61 74 69 6f 6e 2e 20 54 68 69 73 20 63 75 74  cation. This cut
73b0: 73 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 64 65  s a number of de
73c0: 70 65 6e 64 65 6e 63 69 65 73 2e 20 48 65 72 65  pendencies. Here
73d0: 20 77 65 20 75 70 64 61 74 65 0a 09 23 20 74 68   we update..# th
73e0: 65 20 63 72 6f 73 73 20 69 6e 66 6f 72 6d 61 74  e cross informat
73f0: 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68 65 20  ion so that the 
7400: 62 72 65 61 6b 20 66 69 6e 64 65 72 20 68 61 73  break finder has
7410: 20 61 63 63 75 72 61 74 65 0a 09 23 20 64 61 74   accurate..# dat
7420: 61 20 77 68 65 6e 20 77 65 20 6c 6f 6f 6b 20 61  a when we look a
7430: 74 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20  t the generated 
7440: 66 72 61 67 6d 65 6e 74 73 2e 0a 0a 09 73 65 74  fragments....set
7450: 20 73 69 78 20 5b 6c 6f 67 20 76 69 73 69 62 6c   six [log visibl
7460: 65 3f 20 36 5d 0a 0a 09 66 6f 72 65 61 63 68 20  e? 6]...foreach 
7470: 7b 64 65 70 20 72 61 6e 67 65 7d 20 5b 61 72 72  {dep range} [arr
7480: 61 79 20 67 65 74 20 64 65 70 63 5d 20 7b 0a 09  ay get depc] {..
7490: 20 20 20 20 23 20 43 68 65 63 6b 20 61 6c 6c 20      # Check all 
74a0: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 73 74 69  dependencies sti
74b0: 6c 6c 20 6b 6e 6f 77 6e 2c 20 74 61 6b 65 20 74  ll known, take t
74c0: 68 65 69 72 20 72 61 6e 67 65 20 61 6e 64 0a 09  heir range and..
74d0: 20 20 20 20 23 20 73 65 65 20 69 66 20 74 68 65      # see if the
74e0: 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20   break location 
74f0: 66 61 6c 6c 73 20 77 69 74 68 69 6e 2e 0a 0a 09  falls within....
7500: 20 20 20 20 42 6f 72 64 65 72 20 24 72 61 6e 67      Border $rang
7510: 65 20 73 20 65 0a 09 20 20 20 20 69 66 20 7b 24  e s e..    if {$
7520: 6c 6f 63 61 74 69 6f 6e 20 3c 20 24 73 7d 20 63  location < $s} c
7530: 6f 6e 74 69 6e 75 65 20 3b 20 23 20 62 72 65 61  ontinue ; # brea
7540: 6b 20 62 65 66 6f 72 65 20 72 61 6e 67 65 2c 20  k before range, 
7550: 69 67 6e 6f 72 65 0a 09 20 20 20 20 69 66 20 7b  ignore..    if {
7560: 24 6c 6f 63 61 74 69 6f 6e 20 3e 20 24 65 7d 20  $location > $e} 
7570: 63 6f 6e 74 69 6e 75 65 20 3b 20 23 20 62 72 65  continue ; # bre
7580: 61 6b 20 61 66 74 65 72 20 72 61 6e 67 65 2c 20  ak after range, 
7590: 69 67 6e 6f 72 65 2e 0a 0a 09 20 20 20 20 23 20  ignore....    # 
75a0: 54 68 69 73 20 64 65 70 65 6e 64 65 6e 63 79 20  This dependency 
75b0: 63 72 6f 73 73 65 73 20 74 68 65 20 62 72 65 61  crosses the brea
75c0: 6b 20 6c 6f 63 61 74 69 6f 6e 2e 20 57 65 20 72  k location. We r
75d0: 65 6d 6f 76 65 20 69 74 0a 09 20 20 20 20 23 20  emove it..    # 
75e0: 66 72 6f 6d 20 74 68 65 20 63 72 6f 73 73 69 6e  from the crossin
75f0: 67 73 20 63 6f 75 6e 74 65 72 73 2c 20 61 6e 64  gs counters, and
7600: 20 74 68 65 6e 20 61 6c 73 6f 20 66 72 6f 6d 20   then also from 
7610: 74 68 65 20 73 65 74 0a 09 20 20 20 20 23 20 6f  the set..    # o
7620: 66 20 6b 6e 6f 77 6e 20 64 65 70 65 6e 64 65 6e  f known dependen
7630: 63 69 65 73 2c 20 61 73 20 77 65 20 61 72 65 20  cies, as we are 
7640: 64 6f 6e 65 20 77 69 74 68 20 69 74 2e 0a 0a 09  done with it....
7650: 20 20 20 20 66 6f 72 65 61 63 68 20 6c 6f 63 20      foreach loc 
7660: 24 64 65 70 63 28 24 64 65 70 29 20 7b 20 69 6e  $depc($dep) { in
7670: 63 72 20 63 72 6f 73 73 28 24 6c 6f 63 29 20 2d  cr cross($loc) -
7680: 31 20 7d 0a 09 20 20 20 20 75 6e 73 65 74 20 64  1 }..    unset d
7690: 65 70 63 28 24 64 65 70 29 0a 0a 09 20 20 20 20  epc($dep)...    
76a0: 69 66 20 7b 21 24 73 69 78 7d 20 63 6f 6e 74 69  if {!$six} conti
76b0: 6e 75 65 0a 0a 09 20 20 20 20 73 74 72 75 63 74  nue...    struct
76c0: 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 24 64  ::list assign $d
76d0: 65 70 20 70 61 72 65 6e 74 20 63 68 69 6c 64 0a  ep parent child.
76e0: 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 35  .    log write 5
76f0: 20 63 73 65 74 73 20 22 42 72 6f 6b 65 20 64 65   csets "Broke de
7700: 70 65 6e 64 65 6e 63 79 20 5b 50 44 20 24 70 61  pendency [PD $pa
7710: 72 65 6e 74 5d 20 2d 2d 3e 20 5b 50 44 20 24 63  rent] --> [PD $c
7720: 68 69 6c 64 5d 22 0a 09 7d 0a 0a 09 72 65 74 75  hild]"..}...retu
7730: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  rn.    }..    # 
7740: 50 72 69 6e 74 20 69 64 65 6e 74 69 66 79 69 6e  Print identifyin
7750: 67 20 64 61 74 61 20 66 6f 72 20 61 20 72 65 76  g data for a rev
7760: 69 73 69 6f 6e 20 28 70 72 6f 6a 65 63 74 2c 20  ision (project, 
7770: 66 69 6c 65 2c 20 64 6f 74 74 65 64 20 72 65 76  file, dotted rev
7780: 0a 20 20 20 20 23 20 6e 75 6d 62 65 72 29 2c 20  .    # number), 
7790: 66 6f 72 20 68 69 67 68 20 76 65 72 62 6f 73 69  for high verbosi
77a0: 74 79 20 6c 6f 67 20 6f 75 74 70 75 74 2e 0a 20  ty log output.. 
77b0: 20 20 20 23 20 54 4f 44 4f 3a 20 52 65 70 6c 61     # TODO: Repla
77c0: 63 65 20 77 69 74 68 20 63 61 6c 6c 20 74 6f 20  ce with call to 
77d0: 69 74 65 6d 73 74 72 20 28 6c 69 73 74 20 72 65  itemstr (list re
77e0: 76 20 24 69 64 29 0a 0a 20 20 20 20 70 72 6f 63  v $id)..    proc
77f0: 20 50 44 20 7b 69 64 7d 20 7b 0a 09 66 6f 72 65   PD {id} {..fore
7800: 61 63 68 20 7b 70 20 66 20 72 7d 20 5b 73 74 61  ach {p f r} [sta
7810: 74 65 20 72 75 6e 20 7b 0a 09 09 53 45 4c 45 43  te run {...SELEC
7820: 54 20 50 2e 6e 61 6d 65 20 2c 20 46 2e 6e 61 6d  T P.name , F.nam
7830: 65 2c 20 52 2e 72 65 76 0a 09 09 46 52 4f 4d 20  e, R.rev...FROM 
7840: 72 65 76 69 73 69 6f 6e 20 52 2c 20 66 69 6c 65  revision R, file
7850: 20 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09 09   F, project P...
7860: 57 48 45 52 45 20 52 2e 72 69 64 20 3d 20 24 69  WHERE R.rid = $i
7870: 64 20 20 20 20 2d 2d 20 46 69 6e 64 20 73 70 65  d    -- Find spe
7880: 63 69 66 69 65 64 20 66 69 6c 65 20 72 65 76 69  cified file revi
7890: 73 69 6f 6e 0a 09 09 41 4e 44 20 20 20 46 2e 66  sion...AND   F.f
78a0: 69 64 20 3d 20 52 2e 66 69 64 20 20 2d 2d 20 47  id = R.fid  -- G
78b0: 65 74 20 66 69 6c 65 20 6f 66 20 74 68 65 20 72  et file of the r
78c0: 65 76 69 73 69 6f 6e 0a 09 09 41 4e 44 20 20 20  evision...AND   
78d0: 50 2e 70 69 64 20 3d 20 46 2e 70 69 64 20 20 2d  P.pid = F.pid  -
78e0: 2d 20 47 65 74 20 70 72 6f 6a 65 63 74 20 6f 66  - Get project of
78f0: 20 74 68 65 20 66 69 6c 65 2e 0a 09 7d 5d 20 62   the file...}] b
7900: 72 65 61 6b 0a 09 72 65 74 75 72 6e 20 22 27 24  reak..return "'$
7910: 70 20 3a 20 24 66 2f 24 72 27 22 0a 20 20 20 20  p : $f/$r'".    
7920: 7d 0a 0a 20 20 20 20 23 20 50 72 69 6e 74 69 6e  }..    # Printin
7930: 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 72 61  g one or more ra
7940: 6e 67 65 73 2c 20 66 6f 72 6d 61 74 74 65 64 2c  nges, formatted,
7950: 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 69 72 20   and only their 
7960: 62 6f 72 64 65 72 20 74 6f 0a 20 20 20 20 23 20  border to.    # 
7970: 6b 65 65 70 20 74 68 65 20 73 74 72 69 6e 67 73  keep the strings
7980: 20 73 68 6f 72 74 2e 0a 0a 20 20 20 20 70 72 6f   short...    pro
7990: 63 20 50 52 73 20 7b 72 61 6e 67 65 73 7d 20 7b  c PRs {ranges} {
79a0: 0a 09 72 65 74 75 72 6e 20 5b 73 74 72 75 63 74  ..return [struct
79b0: 3a 3a 6c 69 73 74 20 6d 61 70 20 24 72 61 6e 67  ::list map $rang
79c0: 65 73 20 5b 6d 79 70 72 6f 63 20 50 52 5d 5d 0a  es [myproc PR]].
79d0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20      }..    proc 
79e0: 50 52 20 7b 72 61 6e 67 65 7d 20 7b 0a 09 42 6f  PR {range} {..Bo
79f0: 72 64 65 72 20 24 72 61 6e 67 65 20 73 20 65 0a  rder $range s e.
7a00: 09 72 65 74 75 72 6e 20 3c 24 7b 73 7d 2e 2e 2e  .return <${s}...
7a10: 24 7b 65 7d 3e 0a 20 20 20 20 7d 0a 0a 20 20 20  ${e}>.    }..   
7a20: 20 70 72 6f 63 20 42 6f 72 64 65 72 20 7b 72 61   proc Border {ra
7a30: 6e 67 65 20 73 76 20 65 76 7d 20 7b 0a 09 75 70  nge sv ev} {..up
7a40: 76 61 72 20 31 20 24 73 76 20 73 20 24 65 76 20  var 1 $sv s $ev 
7a50: 65 0a 09 73 65 74 20 73 20 5b 6c 69 6e 64 65 78  e..set s [lindex
7a60: 20 24 72 61 6e 67 65 20 30 5d 0a 09 73 65 74 20   $range 0]..set 
7a70: 65 20 5b 6c 69 6e 64 65 78 20 24 72 61 6e 67 65  e [lindex $range
7a80: 20 65 6e 64 5d 0a 09 72 65 74 75 72 6e 0a 20 20   end]..return.  
7a90: 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20    }..    # # ## 
7aa0: 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23  ### ##### ######
7ab0: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
7ac0: 0a 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62  ..    typevariab
7ad0: 6c 65 20 6d 79 63 68 61 6e 67 65 73 65 74 73 20  le mychangesets 
7ae0: 20 20 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 4c          {} ; # L
7af0: 69 73 74 20 6f 66 20 61 6c 6c 20 6b 6e 6f 77 6e  ist of all known
7b00: 0a 09 09 09 09 09 20 20 20 23 20 63 68 61 6e 67  ......   # chang
7b10: 65 73 65 74 73 2e 0a 0a 20 20 20 20 23 20 4c 69  esets...    # Li
7b20: 73 74 20 6f 66 20 61 6c 6c 20 6b 6e 6f 77 6e 20  st of all known 
7b30: 63 68 61 6e 67 65 73 65 74 73 20 6f 66 20 61 20  changesets of a 
7b40: 74 79 70 65 2e 0a 20 20 20 20 74 79 70 65 76 61  type..    typeva
7b50: 72 69 61 62 6c 65 20 6d 79 74 63 68 61 6e 67 65  riable mytchange
7b60: 73 65 74 73 20 2d 61 72 72 61 79 20 7b 0a 09 73  sets -array {..s
7b70: 79 6d 3a 3a 62 72 61 6e 63 68 20 7b 7d 0a 09 73  ym::branch {}..s
7b80: 79 6d 3a 3a 74 61 67 20 20 20 20 7b 7d 0a 09 72  ym::tag    {}..r
7b90: 65 76 20 20 20 20 20 20 20 20 20 7b 7d 0a 20 20  ev         {}.  
7ba0: 20 20 7d 0a 09 09 09 09 09 0a 20 20 20 20 74 79    }.......    ty
7bb0: 70 65 76 61 72 69 61 62 6c 65 20 6d 79 69 74 65  pevariable myite
7bc0: 6d 6d 61 70 20 20 20 20 20 2d 61 72 72 61 79 20  mmap     -array 
7bd0: 7b 7d 20 3b 20 23 20 4d 61 70 20 66 72 6f 6d 20  {} ; # Map from 
7be0: 69 74 65 6d 73 20 28 74 61 67 67 65 64 29 0a 09  items (tagged)..
7bf0: 09 09 09 09 20 20 20 23 20 74 6f 20 74 68 65 20  ....   # to the 
7c00: 6c 69 73 74 20 6f 66 20 63 68 61 6e 67 65 73 65  list of changese
7c10: 74 73 0a 09 09 09 09 09 20 20 20 23 20 63 6f 6e  ts......   # con
7c20: 74 61 69 6e 69 6e 67 20 69 74 2e 20 45 61 63 68  taining it. Each
7c30: 20 69 74 65 6d 0a 09 09 09 09 09 20 20 20 23 20   item......   # 
7c40: 63 61 6e 20 62 65 20 75 73 65 64 20 62 79 20 6f  can be used by o
7c50: 6e 6c 79 20 6f 6e 65 0a 09 09 09 09 09 20 20 20  nly one......   
7c60: 23 20 63 68 61 6e 67 65 73 65 74 2e 0a 20 20 20  # changeset..   
7c70: 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79   typevariable my
7c80: 69 64 6d 61 70 20 20 20 2d 61 72 72 61 79 20 7b  idmap   -array {
7c90: 7d 20 3b 20 23 20 4d 61 70 20 66 72 6f 6d 20 63  } ; # Map from c
7ca0: 68 61 6e 67 65 73 65 74 20 69 64 20 74 6f 0a 09  hangeset id to..
7cb0: 09 09 09 20 20 20 20 20 20 20 23 20 63 68 61 6e  ...       # chan
7cc0: 67 65 73 65 74 2e 0a 0a 20 20 20 20 74 79 70 65  geset...    type
7cd0: 6d 65 74 68 6f 64 20 61 6c 6c 20 20 20 20 7b 7d  method all    {}
7ce0: 20 20 20 20 7b 20 72 65 74 75 72 6e 20 24 6d 79      { return $my
7cf0: 63 68 61 6e 67 65 73 65 74 73 20 7d 0a 20 20 20  changesets }.   
7d00: 20 74 79 70 65 6d 65 74 68 6f 64 20 6f 66 20 20   typemethod of  
7d10: 20 20 20 7b 63 69 64 7d 20 7b 20 72 65 74 75 72     {cid} { retur
7d20: 6e 20 24 6d 79 69 64 6d 61 70 28 24 63 69 64 29  n $myidmap($cid)
7d30: 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f   }.    typemetho
7d40: 64 20 6f 66 69 74 65 6d 20 7b 69 69 64 7d 20 7b  d ofitem {iid} {
7d50: 20 72 65 74 75 72 6e 20 24 6d 79 69 74 65 6d 6d   return $myitemm
7d60: 61 70 28 24 69 69 64 29 20 7d 0a 0a 20 20 20 20  ap($iid) }..    
7d70: 74 79 70 65 6d 65 74 68 6f 64 20 72 65 76 20 20  typemethod rev  
7d80: 20 20 7b 7d 20 20 20 20 7b 20 72 65 74 75 72 6e    {}    { return
7d90: 20 24 6d 79 74 63 68 61 6e 67 65 73 65 74 73 28   $mytchangesets(
7da0: 72 65 76 29 20 7d 0a 20 20 20 20 74 79 70 65 6d  rev) }.    typem
7db0: 65 74 68 6f 64 20 73 79 6d 20 20 20 20 7b 7d 20  ethod sym    {} 
7dc0: 20 20 20 7b 20 72 65 74 75 72 6e 20 5b 63 6f 6e     { return [con
7dd0: 63 61 74 20 5c 0a 09 09 09 09 09 20 20 24 7b 6d  cat \......  ${m
7de0: 79 74 63 68 61 6e 67 65 73 65 74 73 28 73 79 6d  ytchangesets(sym
7df0: 3a 3a 62 72 61 6e 63 68 29 7d 20 5c 0a 09 09 09  ::branch)} \....
7e00: 09 09 20 20 24 7b 6d 79 74 63 68 61 6e 67 65 73  ..  ${mytchanges
7e10: 65 74 73 28 73 79 6d 3a 3a 74 61 67 29 7d 5d 20  ets(sym::tag)}] 
7e20: 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23  }..    # # ## ##
7e30: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
7e40: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20   #############. 
7e50: 20 20 20 23 23 20 43 6f 6e 66 69 67 75 72 61 74     ## Configurat
7e60: 69 6f 6e 0a 0a 20 20 20 20 70 72 61 67 6d 61 20  ion..    pragma 
7e70: 2d 68 61 73 74 79 70 65 69 6e 66 6f 20 20 20 20  -hastypeinfo    
7e80: 6e 6f 20 20 3b 20 23 20 6e 6f 20 74 79 70 65 20  no  ; # no type 
7e90: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20 20  introspection.  
7ea0: 20 20 70 72 61 67 6d 61 20 2d 68 61 73 69 6e 66    pragma -hasinf
7eb0: 6f 20 20 20 20 20 20 20 20 6e 6f 20 20 3b 20 23  o        no  ; #
7ec0: 20 6e 6f 20 6f 62 6a 65 63 74 20 69 6e 74 72 6f   no object intro
7ed0: 73 70 65 63 74 69 6f 6e 0a 0a 20 20 20 20 23 20  spection..    # 
7ee0: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23  # ## ### ##### #
7ef0: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
7f00: 23 23 23 23 23 0a 7d 0a 0a 23 23 0a 23 23 20 4e  #####.}..##.## N
7f10: 4f 54 45 3a 20 54 68 65 20 73 75 63 63 65 73 73  OTE: The success
7f20: 6f 72 20 61 6e 64 20 70 72 65 64 65 63 65 73 73  or and predecess
7f30: 6f 72 20 6d 65 74 68 6f 64 73 20 64 65 66 69 6e  or methods defin
7f40: 65 64 20 62 79 20 74 68 65 20 63 6c 61 73 73 65  ed by the classe
7f50: 73 0a 23 23 20 20 20 20 20 20 20 62 65 6c 6f 77  s.##       below
7f60: 20 61 72 65 20 2d 2d 20 62 6f 74 74 6c 65 20 6e   are -- bottle n
7f70: 65 63 6b 73 20 2d 2d 2e 20 4c 6f 6f 6b 20 66 6f  ecks --. Look fo
7f80: 72 20 77 61 79 73 20 74 6f 20 6d 61 6b 65 20 74  r ways to make t
7f90: 68 65 20 53 51 4c 0a 23 23 20 20 20 20 20 20 20  he SQL.##       
7fa0: 66 61 73 74 65 72 2e 0a 23 23 0a 0a 23 20 23 20  faster..##..# # 
7fb0: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
7fc0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
7fd0: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
7fe0: 23 23 23 23 23 23 23 23 23 0a 23 23 20 48 65 6c  #########.## Hel
7ff0: 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 2e 20 43  per singleton. C
8000: 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 72 65 76 69  ommands for revi
8010: 73 69 6f 6e 20 63 68 61 6e 67 65 73 65 74 73 2e  sion changesets.
8020: 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20 3a 3a 76  ..snit::type ::v
8030: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72  c::fossil::impor
8040: 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a  t::cvs::project:
8050: 3a 72 65 76 3a 3a 72 65 76 20 7b 0a 20 20 20 20  :rev::rev {.    
8060: 74 79 70 65 6d 65 74 68 6f 64 20 62 79 72 65 76  typemethod byrev
8070: 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75 72  ision {} { retur
8080: 6e 20 31 20 7d 0a 20 20 20 20 74 79 70 65 6d 65  n 1 }.    typeme
8090: 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 20  thod bysymbol   
80a0: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a  {} { return 0 }.
80b0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69      typemethod i
80c0: 73 74 61 67 20 20 20 20 20 20 7b 7d 20 7b 20 72  stag      {} { r
80d0: 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79  eturn 0 }.    ty
80e0: 70 65 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63  pemethod isbranc
80f0: 68 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20  h   {} { return 
8100: 30 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74  0 }..    typemet
8110: 68 6f 64 20 73 74 72 20 7b 72 65 76 69 73 69 6f  hod str {revisio
8120: 6e 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c 69  n} {..struct::li
8130: 73 74 20 61 73 73 69 67 6e 20 5b 73 74 61 74 65  st assign [state
8140: 20 72 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c 45   run {..    SELE
8150: 43 54 20 52 2e 72 65 76 2c 20 46 2e 6e 61 6d 65  CT R.rev, F.name
8160: 2c 20 50 2e 6e 61 6d 65 0a 09 20 20 20 20 46 52  , P.name..    FR
8170: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c  OM   revision R,
8180: 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65 63 74   file F, project
8190: 20 50 0a 09 20 20 20 20 57 48 45 52 45 20 20 52   P..    WHERE  R
81a0: 2e 72 69 64 20 3d 20 24 72 65 76 69 73 69 6f 6e  .rid = $revision
81b0: 20 2d 2d 20 46 69 6e 64 20 73 70 65 63 69 66 69   -- Find specifi
81c0: 65 64 20 66 69 6c 65 20 72 65 76 69 73 69 6f 6e  ed file revision
81d0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 46 2e 66  ..    AND    F.f
81e0: 69 64 20 3d 20 52 2e 66 69 64 20 20 20 20 20 2d  id = R.fid     -
81f0: 2d 20 47 65 74 20 66 69 6c 65 20 6f 66 20 74 68  - Get file of th
8200: 65 20 72 65 76 69 73 69 6f 6e 0a 09 20 20 20 20  e revision..    
8210: 41 4e 44 20 20 20 20 50 2e 70 69 64 20 3d 20 46  AND    P.pid = F
8220: 2e 70 69 64 20 20 20 20 20 2d 2d 20 47 65 74 20  .pid     -- Get 
8230: 70 72 6f 6a 65 63 74 20 6f 66 20 74 68 65 20 66  project of the f
8240: 69 6c 65 2e 0a 09 7d 5d 20 72 65 76 6e 72 20 66  ile...}] revnr f
8250: 6e 61 6d 65 20 70 6e 61 6d 65 0a 09 72 65 74 75  name pname..retu
8260: 72 6e 20 22 24 70 6e 61 6d 65 2f 24 7b 72 65 76  rn "$pname/${rev
8270: 6e 72 7d 3a 3a 24 66 6e 61 6d 65 22 0a 20 20 20  nr}::$fname".   
8280: 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74   }..    # result
8290: 20 3d 20 6c 69 73 74 20 28 6d 69 6e 74 69 6d 65   = list (mintime
82a0: 2c 20 6d 61 78 74 69 6d 65 29 0a 20 20 20 20 74  , maxtime).    t
82b0: 79 70 65 6d 65 74 68 6f 64 20 74 69 6d 65 72 61  ypemethod timera
82c0: 6e 67 65 20 7b 69 74 65 6d 73 7d 20 7b 0a 09 73  nge {items} {..s
82d0: 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69  et theset ('[joi
82e0: 6e 20 24 69 74 65 6d 73 20 7b 27 2c 27 7d 5d 27  n $items {','}]'
82f0: 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61 74 65  )..return [state
8300: 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63   run [subst -noc
8310: 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73  ommands -nobacks
8320: 6c 61 73 68 65 73 20 7b 0a 09 20 20 20 20 53 45  lashes {..    SE
8330: 4c 45 43 54 20 4d 49 4e 28 52 2e 64 61 74 65 29  LECT MIN(R.date)
8340: 2c 20 4d 41 58 28 52 2e 64 61 74 65 29 0a 09 20  , MAX(R.date).. 
8350: 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e     FROM revision
8360: 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e   R..    WHERE R.
8370: 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 20 2d  rid IN $theset -
8380: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65  - Restrict to re
8390: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72  visions of inter
83a0: 65 73 74 0a 09 7d 5d 5d 0a 20 20 20 20 7d 0a 0a  est..}]].    }..
83b0: 20 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20      # var(dv) = 
83c0: 64 69 63 74 20 28 72 65 76 69 73 69 6f 6e 20 2d  dict (revision -
83d0: 3e 20 6c 69 73 74 20 28 72 65 76 69 73 69 6f 6e  > list (revision
83e0: 29 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  )).    typemetho
83f0: 64 20 69 6e 74 65 72 6e 61 6c 73 75 63 63 65 73  d internalsucces
8400: 73 6f 72 73 20 7b 64 76 20 72 65 76 69 73 69 6f  sors {dv revisio
8410: 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24  ns} {..upvar 1 $
8420: 64 76 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a  dv dependencies.
8430: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a  .set theset ('[j
8440: 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b  oin $revisions {
8450: 27 2c 27 7d 5d 27 29 0a 0a 09 6c 6f 67 20 77 72  ','}]')...log wr
8460: 69 74 65 20 31 34 20 63 73 65 74 73 20 69 6e 74  ite 14 csets int
8470: 65 72 6e 61 6c 73 75 63 63 65 73 73 6f 72 73 0a  ernalsuccessors.
8480: 0a 09 23 20 53 65 65 20 27 73 75 63 63 65 73 73  ..# See 'success
8490: 6f 72 73 27 20 62 65 6c 6f 77 20 66 6f 72 20 74  ors' below for t
84a0: 68 65 20 6d 61 69 6e 20 65 78 70 6c 61 6e 61 74  he main explanat
84b0: 69 6f 6e 20 6f 66 0a 09 23 20 74 68 65 20 76 61  ion of..# the va
84c0: 72 69 6f 75 73 20 63 61 73 65 73 2e 20 54 68 69  rious cases. Thi
84d0: 73 20 70 69 65 63 65 20 69 73 20 73 70 65 63 69  s piece is speci
84e0: 61 6c 20 69 6e 20 74 68 61 74 20 69 74 0a 09 23  al in that it..#
84f0: 20 72 65 73 74 72 69 63 74 73 20 74 68 65 20 73   restricts the s
8500: 75 63 63 65 73 73 6f 72 73 20 77 65 20 6c 6f 6f  uccessors we loo
8510: 6b 20 66 6f 72 20 74 6f 20 74 68 65 20 73 61 6d  k for to the sam
8520: 65 20 73 65 74 20 6f 66 0a 09 23 20 72 65 76 69  e set of..# revi
8530: 73 69 6f 6e 73 20 77 65 20 73 74 61 72 74 20 66  sions we start f
8540: 72 6f 6d 2e 20 53 65 6e 73 69 62 6c 65 20 61 73  rom. Sensible as
8550: 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20   we are looking 
8560: 66 6f 72 0a 09 23 20 63 68 61 6e 67 65 73 65 74  for..# changeset
8570: 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64   internal depend
8580: 65 6e 63 69 65 73 2e 0a 0a 09 61 72 72 61 79 20  encies....array 
8590: 73 65 74 20 64 65 70 20 7b 7d 0a 0a 09 66 6f 72  set dep {}...for
85a0: 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 7d  each {rid child}
85b0: 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62   [state run [sub
85c0: 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d  st -nocommands -
85d0: 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a  nobackslashes {.
85e0: 20 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d 61      -- (1) Prima
85f0: 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20 53 45  ry child..    SE
8600: 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63 68  LECT R.rid, R.ch
8610: 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  ild..    FROM   
8620: 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20  revision R..    
8630: 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49  WHERE  R.rid   I
8640: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d  N $theset     --
8650: 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76   Restrict to rev
8660: 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65  isions of intere
8670: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  st..    AND    R
8680: 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55  .child IS NOT NU
8690: 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69  LL    -- Has pri
86a0: 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20  mary child..    
86b0: 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49  AND    R.child I
86c0: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d  N $theset     --
86d0: 20 57 68 69 63 68 20 69 73 20 61 6c 73 6f 20 6f   Which is also o
86e0: 66 20 69 6e 74 65 72 65 73 74 0a 20 20 20 20 55  f interest.    U
86f0: 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32 29 20  NION.    -- (2) 
8700: 53 65 63 6f 6e 64 61 72 79 20 28 62 72 61 6e 63  Secondary (branc
8710: 68 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20  h) children..   
8720: 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 42   SELECT R.rid, B
8730: 2e 62 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20  .brid..    FROM 
8740: 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65    revision R, re
8750: 76 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c  visionbranchchil
8760: 64 72 65 6e 20 42 0a 09 20 20 20 20 57 48 45 52  dren B..    WHER
8770: 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74  E  R.rid   IN $t
8780: 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73  heset     -- Res
8790: 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f  trict to revisio
87a0: 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09  ns of interest..
87b0: 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72 69 64      AND    R.rid
87c0: 20 3d 20 42 2e 72 69 64 20 20 20 20 20 20 20 20   = B.rid        
87d0: 20 20 2d 2d 20 53 65 6c 65 63 74 20 73 75 62 73    -- Select subs
87e0: 65 74 20 6f 66 20 62 72 61 6e 63 68 20 63 68 69  et of branch chi
87f0: 6c 64 72 65 6e 0a 09 20 20 20 20 41 4e 44 20 20  ldren..    AND  
8800: 20 20 42 2e 62 72 69 64 20 49 4e 20 24 74 68 65    B.brid IN $the
8810: 73 65 74 20 20 20 20 20 20 2d 2d 20 57 68 69 63  set      -- Whic
8820: 68 20 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e 74  h is also of int
8830: 65 72 65 73 74 0a 20 20 20 20 55 4e 49 4f 4e 0a  erest.    UNION.
8840: 20 20 20 20 2d 2d 20 28 34 29 20 43 68 69 6c 64      -- (4) Child
8850: 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 20 73   of trunk root s
8860: 75 63 63 65 73 73 6f 72 20 6f 66 20 6c 61 73 74  uccessor of last
8870: 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b 2e 0a   NTDB on trunk..
8880: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69  .    SELECT R.ri
8890: 64 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20 20 20  d, RA.child..   
88a0: 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52   FROM revision R
88b0: 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 0a 09 20  , revision RA.. 
88c0: 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 20     WHERE R.rid  
88d0: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20   IN $theset     
88e0: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
88f0: 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74  revisions of int
8900: 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20  erest..    AND  
8910: 20 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20   R.isdefault    
8920: 20 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74           -- Rest
8930: 72 69 63 74 20 74 6f 20 4e 54 44 42 0a 09 20 20  rict to NTDB..  
8940: 20 20 41 4e 44 20 20 20 52 2e 64 62 63 68 69 6c    AND   R.dbchil
8950: 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  d IS NOT NULL   
8960: 2d 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 42  -- and last NTDB
8970: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72   belonging to tr
8980: 75 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 52  unk..    AND   R
8990: 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69 6c  A.rid = R.dbchil
89a0: 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 72  d      -- Go dir
89b0: 65 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 72  ectly to trunk r
89c0: 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 52  oot..    AND   R
89d0: 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e  A.child IS NOT N
89e0: 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72  ULL    -- Has pr
89f0: 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 20 20 20  imary child..   
8a00: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 52           AND   R
8a10: 41 2e 63 68 69 6c 64 20 49 4e 20 24 74 68 65 73  A.child IN $thes
8a20: 65 74 20 20 20 20 20 2d 2d 20 57 68 69 63 68 20  et     -- Which 
8a30: 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e 74 65 72  is also of inter
8a40: 65 73 74 0a 09 7d 5d 5d 20 7b 0a 09 20 20 20 20  est..}]] {..    
8a50: 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69 6e  # Consider movin
8a60: 67 20 74 68 69 73 20 74 6f 20 74 68 65 20 69 6e  g this to the in
8a70: 74 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e 0a  tegrity module..
8a80: 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61  .    integrity a
8a90: 73 73 65 72 74 20 7b 24 72 69 64 20 21 3d 20 24  ssert {$rid != $
8aa0: 63 68 69 6c 64 7d 20 7b 52 65 76 69 73 69 6f 6e  child} {Revision
8ab0: 20 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f 6e   $rid depends on
8ac0: 20 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20 6c   itself.}..    l
8ad0: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63  append dependenc
8ae0: 69 65 73 28 24 72 69 64 29 20 24 63 68 69 6c 64  ies($rid) $child
8af0: 0a 09 20 20 20 20 73 65 74 20 64 65 70 28 24 72  ..    set dep($r
8b00: 69 64 2c 24 63 68 69 6c 64 29 20 2e 0a 09 7d 0a  id,$child) ...}.
8b10: 0a 09 23 20 54 68 65 20 73 71 6c 20 73 74 61 74  ..# The sql stat
8b20: 65 6d 65 6e 74 73 20 61 62 6f 76 65 20 6c 6f 6f  ements above loo
8b30: 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 64 69 72 65  ks only for dire
8b40: 63 74 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a  ct dependencies.
8b50: 09 23 20 62 65 74 77 65 65 6e 20 72 65 76 69 73  .# between revis
8b60: 69 6f 6e 20 69 6e 20 74 68 65 20 63 68 61 6e 67  ion in the chang
8b70: 65 73 65 74 2e 20 48 6f 77 65 76 65 72 20 64 75  eset. However du
8b80: 65 20 74 6f 20 74 68 65 0a 09 23 20 76 61 67 61  e to the..# vaga
8b90: 72 69 65 73 20 6f 66 20 6d 65 74 61 20 64 61 74  ries of meta dat
8ba0: 61 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c 65  a it is possible
8bb0: 20 66 6f 72 20 74 77 6f 20 72 65 76 69 73 69 6f   for two revisio
8bc0: 6e 73 20 6f 66 0a 09 23 20 74 68 65 20 73 61 6d  ns of..# the sam
8bd0: 65 20 66 69 6c 65 20 74 6f 20 65 6e 64 20 75 70  e file to end up
8be0: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 63 68 61   in the same cha
8bf0: 6e 67 65 73 65 74 2c 20 77 69 74 68 6f 75 74 20  ngeset, without 
8c00: 61 0a 09 23 20 64 69 72 65 63 74 20 64 65 70 65  a..# direct depe
8c10: 6e 64 65 6e 63 79 20 62 65 74 77 65 65 6e 20 74  ndency between t
8c20: 68 65 6d 2e 20 48 6f 77 65 76 65 72 20 77 65 20  hem. However we 
8c30: 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 72 65 0a  know that there.
8c40: 09 23 20 68 61 73 20 74 6f 20 62 65 20 61 20 61  .# has to be a a
8c50: 6e 20 69 6e 64 69 72 65 63 74 20 64 65 70 65 6e  n indirect depen
8c60: 64 65 6e 63 79 2c 20 62 65 20 69 74 20 74 68 72  dency, be it thr
8c70: 6f 75 67 68 20 70 72 69 6d 61 72 79 0a 09 23 20  ough primary..# 
8c80: 63 68 69 6c 64 72 65 6e 2c 20 62 72 61 6e 63 68  children, branch
8c90: 20 63 68 69 6c 64 72 65 6e 2c 20 6f 72 20 61 20   children, or a 
8ca0: 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68 65 72  combination ther
8cb0: 65 6f 66 2e 0a 0a 09 23 20 57 65 20 6e 6f 77 20  eof....# We now 
8cc0: 66 69 6c 6c 20 69 6e 20 74 68 65 73 65 20 70 73  fill in these ps
8cd0: 65 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63 69 65  eudo-dependencie
8ce0: 73 2c 20 69 66 20 6e 6f 20 73 75 63 68 0a 09 23  s, if no such..#
8cf0: 20 64 65 70 65 6e 64 65 6e 63 79 20 65 78 69 73   dependency exis
8d00: 74 73 20 61 6c 72 65 61 64 79 2e 20 54 68 65 20  ts already. The 
8d10: 64 69 72 65 63 74 69 6f 6e 20 6f 66 20 74 68 65  direction of the
8d20: 20 64 65 70 65 6e 64 65 6e 63 79 0a 09 23 20 69   dependency..# i
8d30: 73 20 61 63 74 75 61 6c 6c 79 20 69 72 72 65 6c  s actually irrel
8d40: 65 76 61 6e 74 20 66 6f 72 20 74 68 69 73 2e 0a  evant for this..
8d50: 0a 09 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 69  ..# NOTE: This i
8d60: 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f 6d  s different from
8d70: 20 63 76 73 32 73 76 6e 2e 20 4f 75 72 20 73 70   cvs2svn. Our sp
8d80: 69 72 69 74 75 61 6c 20 61 6e 63 65 73 74 6f 72  iritual ancestor
8d90: 0a 09 23 20 64 6f 65 73 20 6e 6f 74 20 75 73 65  ..# does not use
8da0: 20 73 75 63 68 20 70 73 65 75 64 6f 2d 64 65 70   such pseudo-dep
8db0: 65 6e 64 65 6e 63 69 65 73 2c 20 68 6f 77 65 76  endencies, howev
8dc0: 65 72 20 69 74 20 75 73 65 73 20 61 0a 09 23 20  er it uses a..# 
8dd0: 43 4f 4d 4d 49 54 5f 54 48 52 45 53 48 4f 4c 44  COMMIT_THRESHOLD
8de0: 2c 20 61 20 74 69 6d 65 20 69 6e 74 65 72 76 61  , a time interva
8df0: 6c 20 63 6f 6d 6d 69 74 73 20 73 68 6f 75 6c 64  l commits should
8e00: 20 66 61 6c 6c 2e 20 54 68 69 73 0a 09 23 20 77   fall. This..# w
8e10: 69 6c 6c 20 67 72 65 61 74 6c 79 20 72 65 64 75  ill greatly redu
8e20: 63 65 73 20 74 68 65 20 72 69 73 6b 20 6f 66 20  ces the risk of 
8e30: 67 65 74 74 69 6e 67 20 66 61 72 20 73 65 70 61  getting far sepa
8e40: 72 61 74 65 64 0a 09 23 20 72 65 76 69 73 69 6f  rated..# revisio
8e50: 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20 66  ns of the same f
8e60: 69 6c 65 20 69 6e 74 6f 20 6f 6e 65 20 63 68 61  ile into one cha
8e70: 6e 67 65 73 65 74 2e 0a 0a 09 23 20 57 65 20 61  ngeset....# We a
8e80: 6c 6c 6f 77 20 72 65 76 69 73 69 6f 6e 73 20 74  llow revisions t
8e90: 6f 20 62 65 20 66 61 72 20 61 70 61 72 74 20 69  o be far apart i
8ea0: 6e 20 74 69 6d 65 20 69 6e 20 74 68 65 20 73 61  n time in the sa
8eb0: 6d 65 0a 09 23 20 63 68 61 6e 67 65 73 65 74 2c  me..# changeset,
8ec0: 20 62 75 74 20 69 6e 20 74 75 72 6e 20 6e 65 65   but in turn nee
8ed0: 64 20 74 68 65 20 70 73 65 75 64 6f 2d 64 65 70  d the pseudo-dep
8ee0: 65 6e 64 65 6e 63 69 65 73 20 74 6f 0a 09 23 20  endencies to..# 
8ef0: 68 61 6e 64 6c 65 20 74 68 69 73 2e 0a 0a 09 6c  handle this....l
8f00: 6f 67 20 77 72 69 74 65 20 31 34 20 63 73 65 74  og write 14 cset
8f10: 73 20 7b 69 6e 74 65 72 6e 61 6c 20 20 5b 61 72  s {internal  [ar
8f20: 72 61 79 20 73 69 7a 65 20 64 65 70 5d 7d 0a 09  ray size dep]}..
8f30: 6c 6f 67 20 77 72 69 74 65 20 31 34 20 63 73 65  log write 14 cse
8f40: 74 73 20 7b 63 6f 6c 6c 65 63 74 65 64 20 5b 61  ts {collected [a
8f50: 72 72 61 79 20 73 69 7a 65 20 64 65 70 65 6e 64  rray size depend
8f60: 65 6e 63 69 65 73 5d 7d 0a 09 6c 6f 67 20 77 72  encies]}..log wr
8f70: 69 74 65 20 31 34 20 63 73 65 74 73 20 70 73 65  ite 14 csets pse
8f80: 75 64 6f 2d 69 6e 74 65 72 6e 61 6c 73 75 63 63  udo-internalsucc
8f90: 65 73 73 6f 72 73 0a 0a 09 61 72 72 61 79 20 73  essors...array s
8fa0: 65 74 20 66 69 64 73 20 7b 7d 0a 09 66 6f 72 65  et fids {}..fore
8fb0: 61 63 68 20 7b 72 69 64 20 66 69 64 7d 20 5b 73  ach {rid fid} [s
8fc0: 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73 74 20  tate run [subst 
8fd0: 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62  -nocommands -nob
8fe0: 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20  ackslashes {..  
8ff0: 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20    SELECT R.rid, 
9000: 52 2e 66 69 64 0a 20 20 20 20 20 20 20 20 20 20  R.fid.          
9010: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f    FROM   revisio
9020: 6e 20 52 0a 20 20 20 20 20 20 20 20 20 20 20 20  n R.            
9030: 57 48 45 52 45 20 20 52 2e 72 69 64 20 49 4e 20  WHERE  R.rid IN 
9040: 24 74 68 65 73 65 74 0a 09 7d 5d 5d 20 7b 20 6c  $theset..}]] { l
9050: 61 70 70 65 6e 64 20 66 69 64 73 28 24 66 69 64  append fids($fid
9060: 29 20 24 72 69 64 20 7d 0a 0a 09 73 65 74 20 67  ) $rid }...set g
9070: 72 6f 75 70 73 20 7b 7d 0a 09 66 6f 72 65 61 63  roups {}..foreac
9080: 68 20 7b 66 69 64 20 72 69 64 73 7d 20 5b 61 72  h {fid rids} [ar
9090: 72 61 79 20 67 65 74 20 66 69 64 73 5d 20 7b 0a  ray get fids] {.
90a0: 09 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74  .    if {[llengt
90b0: 68 20 24 72 69 64 73 5d 20 3c 20 32 7d 20 63 6f  h $rids] < 2} co
90c0: 6e 74 69 6e 75 65 0a 09 20 20 20 20 66 6f 72 65  ntinue..    fore
90d0: 61 63 68 20 61 20 24 72 69 64 73 20 7b 0a 09 09  ach a $rids {...
90e0: 66 6f 72 65 61 63 68 20 62 20 24 72 69 64 73 20  foreach b $rids 
90f0: 7b 0a 09 09 20 20 20 20 69 66 20 7b 24 61 20 3d  {...    if {$a =
9100: 3d 20 24 62 7d 20 63 6f 6e 74 69 6e 75 65 0a 09  = $b} continue..
9110: 09 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65  .    if {[info e
9120: 78 69 73 74 73 20 64 65 70 28 24 61 2c 24 62 29  xists dep($a,$b)
9130: 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 09 20 20  ]} continue...  
9140: 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73    if {[info exis
9150: 74 73 20 64 65 70 28 24 62 2c 24 61 29 5d 7d 20  ts dep($b,$a)]} 
9160: 63 6f 6e 74 69 6e 75 65 0a 09 09 20 20 20 20 6c  continue...    l
9170: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63  append dependenc
9180: 69 65 73 28 24 61 29 20 24 62 0a 09 09 20 20 20  ies($a) $b...   
9190: 20 73 65 74 20 64 65 70 28 24 61 2c 24 62 29 20   set dep($a,$b) 
91a0: 2e 0a 09 09 20 20 20 20 73 65 74 20 64 65 70 28  ....    set dep(
91b0: 24 62 2c 24 61 29 20 2e 0a 09 09 7d 0a 09 20 20  $b,$a) ....}..  
91c0: 20 20 7d 0a 09 20 20 20 20 73 65 74 20 6e 20 5b    }..    set n [
91d0: 6c 6c 65 6e 67 74 68 20 24 72 69 64 73 5d 0a 09  llength $rids]..
91e0: 20 20 20 20 6c 61 70 70 65 6e 64 20 67 72 6f 75      lappend grou
91f0: 70 73 20 5b 6c 69 73 74 20 24 6e 20 5b 65 78 70  ps [list $n [exp
9200: 72 20 7b 28 24 6e 2a 24 6e 2d 24 6e 29 2f 32 7d  r {($n*$n-$n)/2}
9210: 5d 5d 0a 09 7d 0a 0a 09 6c 6f 67 20 77 72 69 74  ]]..}...log writ
9220: 65 20 31 34 20 63 73 65 74 73 20 7b 70 73 65 75  e 14 csets {pseu
9230: 64 6f 20 20 20 20 5b 61 72 72 61 79 20 73 69 7a  do    [array siz
9240: 65 20 66 69 64 73 5d 20 28 5b 6c 73 6f 72 74 20  e fids] ([lsort 
9250: 2d 69 6e 64 65 78 20 30 20 2d 64 65 63 72 65 61  -index 0 -decrea
9260: 73 69 6e 67 20 2d 69 6e 74 65 67 65 72 20 24 67  sing -integer $g
9270: 72 6f 75 70 73 5d 29 7d 0a 09 6c 6f 67 20 77 72  roups])}..log wr
9280: 69 74 65 20 31 34 20 63 73 65 74 73 20 7b 69 6e  ite 14 csets {in
9290: 74 65 72 6e 61 6c 20 20 5b 61 72 72 61 79 20 73  ternal  [array s
92a0: 69 7a 65 20 64 65 70 5d 7d 0a 09 6c 6f 67 20 77  ize dep]}..log w
92b0: 72 69 74 65 20 31 34 20 63 73 65 74 73 20 7b 63  rite 14 csets {c
92c0: 6f 6c 6c 65 63 74 65 64 20 5b 61 72 72 61 79 20  ollected [array 
92d0: 73 69 7a 65 20 64 65 70 65 6e 64 65 6e 63 69 65  size dependencie
92e0: 73 5d 7d 0a 09 6c 6f 67 20 77 72 69 74 65 20 31  s]}..log write 1
92f0: 34 20 63 73 65 74 73 20 63 6f 6d 70 6c 65 74 65  4 csets complete
9300: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
9310: 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20 34      # result = 4
9320: 2d 6c 69 73 74 20 28 69 74 65 6d 74 79 70 65 20  -list (itemtype 
9330: 69 74 65 6d 69 64 20 6e 65 78 74 69 74 65 6d 74  itemid nextitemt
9340: 79 70 65 20 6e 65 78 74 69 74 65 6d 69 64 20 2e  ype nextitemid .
9350: 2e 2e 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68  ..).    typemeth
9360: 6f 64 20 6c 6f 6f 70 73 20 7b 72 65 76 69 73 69  od loops {revisi
9370: 6f 6e 73 7d 20 7b 0a 09 23 20 4e 6f 74 65 3a 20  ons} {..# Note: 
9380: 54 61 67 73 20 61 6e 64 20 62 72 61 6e 63 68 65  Tags and branche
9390: 73 20 63 61 6e 6e 6f 74 20 63 61 75 73 65 20 74  s cannot cause t
93a0: 68 65 20 6c 6f 6f 70 2e 20 54 68 65 69 72 20 69  he loop. Their i
93b0: 64 27 73 2c 0a 09 23 20 62 65 69 6e 67 20 6f 66  d's,..# being of
93c0: 20 61 20 66 75 6e 64 61 6d 65 6e 74 61 6c 6c 79   a fundamentally
93d0: 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65 20   different type 
93e0: 74 68 61 6e 20 74 68 65 20 72 65 76 69 73 69 6f  than the revisio
93f0: 6e 73 0a 09 23 20 63 6f 6d 69 6e 67 20 69 6e 20  ns..# coming in 
9400: 63 61 6e 6e 6f 74 20 62 65 20 69 6e 20 74 68 65  cannot be in the
9410: 20 73 65 74 2e 0a 0a 09 73 65 74 20 74 68 65 73   set....set thes
9420: 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69  et ('[join $revi
9430: 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 09  sions {','}]')..
9440: 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75  return [state ru
9450: 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d  n [subst -nocomm
9460: 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73  ands -nobackslas
9470: 68 65 73 20 7b 0a 09 20 20 20 20 2d 2d 20 28 31  hes {..    -- (1
9480: 29 20 50 72 69 6d 61 72 79 20 63 68 69 6c 64 0a  ) Primary child.
9490: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69  .    SELECT R.ri
94a0: 64 2c 20 52 2e 63 68 69 6c 64 0a 09 20 20 20 20  d, R.child..    
94b0: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20  FROM   revision 
94c0: 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e  R..    WHERE  R.
94d0: 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74  rid   IN $theset
94e0: 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74       -- Restrict
94f0: 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66   to revisions of
9500: 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41   interest..    A
9510: 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49 53  ND    R.child IS
9520: 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20   NOT NULL    -- 
9530: 48 61 73 20 70 72 69 6d 61 72 79 20 63 68 69 6c  Has primary chil
9540: 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e  d..    AND    R.
9550: 63 68 69 6c 64 20 49 4e 20 24 74 68 65 73 65 74  child IN $theset
9560: 20 20 20 20 20 2d 2d 20 4c 6f 6f 70 0a 09 20 20       -- Loop..  
9570: 20 20 2d 2d 0a 09 20 20 20 20 55 4e 49 4f 4e 0a    --..    UNION.
9580: 09 20 20 20 20 2d 2d 20 28 32 29 20 53 65 63 6f  .    -- (2) Seco
9590: 6e 64 61 72 79 20 28 62 72 61 6e 63 68 29 20 63  ndary (branch) c
95a0: 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 53 45 4c  hildren..    SEL
95b0: 45 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 72 69  ECT R.rid, B.bri
95c0: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65  d..    FROM   re
95d0: 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69  vision R, revisi
95e0: 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64 72 65 6e  onbranchchildren
95f0: 20 42 0a 09 20 20 20 20 57 48 45 52 45 20 20 52   B..    WHERE  R
9600: 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65  .rid   IN $these
9610: 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63  t     -- Restric
9620: 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f  t to revisions o
9630: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20  f interest..    
9640: 41 4e 44 20 20 20 20 52 2e 72 69 64 20 3d 20 42  AND    R.rid = B
9650: 2e 72 69 64 20 20 20 20 20 20 20 20 20 20 2d 2d  .rid          --
9660: 20 53 65 6c 65 63 74 20 73 75 62 73 65 74 20 6f   Select subset o
9670: 66 20 62 72 61 6e 63 68 20 63 68 69 6c 64 72 65  f branch childre
9680: 6e 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e  n..    AND    B.
9690: 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74  rid   IN $theset
96a0: 20 20 20 20 20 2d 2d 20 4c 6f 6f 70 0a 09 20 20       -- Loop..  
96b0: 20 20 2d 2d 0a 09 20 20 20 20 55 4e 49 4f 4e 0a    --..    UNION.
96c0: 09 20 20 20 20 2d 2d 20 28 34 29 20 43 68 69 6c  .    -- (4) Chil
96d0: 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 20  d of trunk root 
96e0: 73 75 63 63 65 73 73 6f 72 20 6f 66 20 6c 61 73  successor of las
96f0: 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b 2e  t NTDB on trunk.
9700: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
9710: 69 64 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20 20  id, RA.child..  
9720: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f    FROM   revisio
9730: 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 52 41  n R, revision RA
9740: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72  ..    WHERE  R.r
9750: 69 64 20 20 20 20 49 4e 20 24 74 68 65 73 65 74  id    IN $theset
9760: 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74       -- Restrict
9770: 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66   to revisions of
9780: 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41   interest..    A
9790: 4e 44 20 20 20 20 52 2e 69 73 64 65 66 61 75 6c  ND    R.isdefaul
97a0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d  t             --
97b0: 20 52 65 73 74 72 69 63 74 20 74 6f 20 4e 54 44   Restrict to NTD
97c0: 42 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e  B..    AND    R.
97d0: 64 62 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e  dbchild IS NOT N
97e0: 55 4c 4c 20 20 20 2d 2d 20 61 6e 64 20 6c 61 73  ULL   -- and las
97f0: 74 20 4e 54 44 42 20 62 65 6c 6f 6e 67 69 6e 67  t NTDB belonging
9800: 20 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20 41   to trunk..    A
9810: 4e 44 20 20 20 20 52 41 2e 72 69 64 20 3d 20 52  ND    RA.rid = R
9820: 2e 64 62 63 68 69 6c 64 20 20 20 20 20 20 2d 2d  .dbchild      --
9830: 20 47 6f 20 64 69 72 65 63 74 6c 79 20 74 6f 20   Go directly to 
9840: 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 20  trunk root..    
9850: 41 4e 44 20 20 20 20 52 41 2e 63 68 69 6c 64 20  AND    RA.child 
9860: 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d  IS NOT NULL    -
9870: 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 68  - Has primary ch
9880: 69 6c 64 2e 0a 09 20 20 20 20 41 4e 44 20 20 20  ild...    AND   
9890: 20 52 41 2e 63 68 69 6c 64 20 49 4e 20 24 74 68   RA.child IN $th
98a0: 65 73 65 74 20 20 20 20 20 2d 2d 20 4c 6f 6f 70  eset     -- Loop
98b0: 0a 09 7d 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20  ..}]].    }..   
98c0: 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 63   # var(dv) = dic
98d0: 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20  t (item -> list 
98e0: 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d  (item)), item  =
98f0: 20 6c 69 73 74 20 28 74 79 70 65 20 69 64 29 0a   list (type id).
9900: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 73      typemethod s
9910: 75 63 63 65 73 73 6f 72 73 20 7b 64 76 20 72 65  uccessors {dv re
9920: 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61  visions} {..upva
9930: 72 20 31 20 24 64 76 20 64 65 70 65 6e 64 65 6e  r 1 $dv dependen
9940: 63 69 65 73 0a 09 73 65 74 20 74 68 65 73 65 74  cies..set theset
9950: 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69   ('[join $revisi
9960: 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 23  ons {','}]')...#
9970: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
9980: 61 73 65 73 20 73 70 65 63 69 66 79 20 77 68 65  ases specify whe
9990: 6e 20 61 20 72 65 76 69 73 69 6f 6e 20 53 20 69  n a revision S i
99a0: 73 20 61 20 73 75 63 63 65 73 73 6f 72 0a 09 23  s a successor..#
99b0: 20 6f 66 20 61 20 72 65 76 69 73 69 6f 6e 20 52   of a revision R
99c0: 2e 20 45 61 63 68 20 6f 66 20 74 68 65 20 63 61  . Each of the ca
99d0: 73 65 73 20 74 72 61 6e 73 6c 61 74 65 73 20 69  ses translates i
99e0: 6e 74 6f 20 6f 6e 65 20 6f 66 0a 09 23 20 74 68  nto one of..# th
99f0: 65 20 62 72 61 6e 63 68 65 73 20 6f 66 20 74 68  e branches of th
9a00: 65 20 53 51 4c 20 55 4e 49 4f 4e 20 63 6f 6d 69  e SQL UNION comi
9a10: 6e 67 20 62 65 6c 6f 77 2e 0a 09 23 0a 09 23 20  ng below...#..# 
9a20: 28 31 29 20 53 20 63 61 6e 20 62 65 20 61 20 70  (1) S can be a p
9a30: 72 69 6d 61 72 79 20 63 68 69 6c 64 20 6f 66 20  rimary child of 
9a40: 52 2c 20 69 2e 65 2e 20 69 6e 20 74 68 65 20 73  R, i.e. in the s
9a50: 61 6d 65 20 4c 4f 44 2e 20 52 0a 09 23 20 20 20  ame LOD. R..#   
9a60: 20 20 72 65 66 65 72 65 6e 63 65 73 20 53 20 64    references S d
9a70: 69 72 65 63 74 6c 79 2e 20 52 2e 63 68 69 6c 64  irectly. R.child
9a80: 20 3d 20 53 28 2e 72 69 64 29 2c 20 69 66 20 69   = S(.rid), if i
9a90: 74 20 65 78 69 73 74 73 2e 0a 09 23 0a 09 23 20  t exists...#..# 
9aa0: 28 32 29 20 53 20 63 61 6e 20 62 65 20 61 20 73  (2) S can be a s
9ab0: 65 63 6f 6e 64 61 72 79 2c 20 69 2e 65 2e 20 62  econdary, i.e. b
9ac0: 72 61 6e 63 68 2c 20 63 68 69 6c 64 20 6f 66 20  ranch, child of 
9ad0: 52 2e 20 48 65 72 65 20 74 68 65 0a 09 23 20 20  R. Here the..#  
9ae0: 20 20 20 6c 69 6e 6b 20 69 73 20 6d 61 64 65 20     link is made 
9af0: 74 68 72 6f 75 67 68 20 74 68 65 20 68 65 6c 70  through the help
9b00: 65 72 20 74 61 62 6c 65 0a 09 23 20 20 20 20 20  er table..#     
9b10: 52 45 56 49 53 49 4f 4e 42 52 41 4e 43 48 43 48  REVISIONBRANCHCH
9b20: 49 4c 44 52 45 4e 2e 20 52 2e 72 69 64 20 2d 3e  ILDREN. R.rid ->
9b30: 20 52 42 43 2e 72 69 64 2c 20 52 42 43 2e 62 72   RBC.rid, RBC.br
9b40: 69 64 20 3d 0a 09 23 20 20 20 20 20 53 28 2e 72  id =..#     S(.r
9b50: 69 64 29 0a 09 23 0a 09 23 20 28 33 29 20 4f 72  id)..#..# (3) Or
9b60: 69 67 69 6e 61 6c 6c 79 20 74 68 69 73 20 75 73  iginally this us
9b70: 65 20 63 61 73 65 20 64 65 66 69 6e 65 64 20 74  e case defined t
9b80: 68 65 20 72 6f 6f 74 20 6f 66 20 61 20 64 65 74  he root of a det
9b90: 61 63 68 65 64 0a 09 23 20 20 20 20 20 4e 54 44  ached..#     NTD
9ba0: 42 20 61 73 20 74 68 65 20 73 75 63 63 65 73 73  B as the success
9bb0: 6f 72 20 6f 66 20 74 68 65 20 74 72 75 6e 6b 20  or of the trunk 
9bc0: 72 6f 6f 74 2e 20 54 68 69 73 20 6c 65 61 64 73  root. This leads
9bd0: 20 74 6f 20 61 0a 09 23 20 20 20 20 20 62 61 64   to a..#     bad
9be0: 20 74 61 6e 67 6c 65 20 6c 61 74 65 72 20 6f 6e   tangle later on
9bf0: 2e 20 57 69 74 68 20 61 20 64 65 74 61 63 68 65  . With a detache
9c00: 64 20 4e 54 44 42 20 74 68 65 20 6f 72 69 67 69  d NTDB the origi
9c10: 6e 61 6c 0a 09 23 20 20 20 20 20 74 72 75 6e 6b  nal..#     trunk
9c20: 20 72 6f 6f 74 20 72 65 76 69 73 69 6f 6e 20 77   root revision w
9c30: 61 73 20 72 65 6d 6f 76 65 64 20 61 73 20 69 72  as removed as ir
9c40: 72 65 6c 65 76 61 6e 74 2c 20 61 6c 6c 6f 77 69  relevant, allowi
9c50: 6e 67 0a 09 23 20 20 20 20 20 74 68 65 20 6e 6f  ng..#     the no
9c60: 6d 69 6e 61 6c 20 72 6f 6f 74 20 74 6f 20 62 65  minal root to be
9c70: 20 6c 61 74 65 72 20 69 6e 20 74 69 6d 65 20 74   later in time t
9c80: 68 61 6e 20 74 68 65 20 4e 54 44 42 0a 09 23 20  han the NTDB..# 
9c90: 20 20 20 20 72 6f 6f 74 2e 20 4e 6f 77 20 73 65      root. Now se
9ca0: 74 74 69 6e 67 20 74 68 69 73 20 64 65 70 65 6e  tting this depen
9cb0: 64 65 6e 63 79 20 77 69 6c 6c 20 62 65 20 62 61  dency will be ba
9cc0: 63 6b 77 61 72 64 20 69 6e 0a 09 23 20 20 20 20  ckward in..#    
9cd0: 20 74 69 6d 65 2e 20 52 45 4d 4f 56 45 44 2e 0a   time. REMOVED..
9ce0: 09 23 0a 09 23 20 28 34 29 20 49 66 20 52 20 69  .#..# (4) If R i
9cf0: 73 20 74 68 65 20 6c 61 73 74 20 6f 66 20 74 68  s the last of th
9d00: 65 20 4e 54 44 42 20 72 65 76 69 73 69 6f 6e 73  e NTDB revisions
9d10: 20 77 68 69 63 68 20 62 65 6c 6f 6e 67 20 74 6f   which belong to
9d20: 0a 09 23 20 20 20 20 20 74 68 65 20 74 72 75 6e  ..#     the trun
9d30: 6b 2c 20 74 68 65 6e 20 74 68 65 20 70 72 69 6d  k, then the prim
9d40: 61 72 79 20 63 68 69 6c 64 20 6f 66 20 74 68 65  ary child of the
9d50: 20 74 72 75 6e 6b 20 72 6f 6f 74 20 28 74 68 65   trunk root (the
9d60: 0a 09 23 20 20 20 20 20 27 31 2e 32 27 20 72 65  ..#     '1.2' re
9d70: 76 69 73 69 6f 6e 29 20 69 73 20 61 20 73 75 63  vision) is a suc
9d80: 63 65 73 73 6f 72 2c 20 69 66 20 69 74 20 65 78  cessor, if it ex
9d90: 69 73 74 73 2e 0a 0a 09 23 20 4e 6f 74 65 20 74  ists....# Note t
9da0: 68 61 74 20 74 68 65 20 62 72 61 6e 63 68 65 73  hat the branches
9db0: 20 73 70 61 77 6e 65 64 20 66 72 6f 6d 20 74 68   spawned from th
9dc0: 65 20 72 65 76 69 73 69 6f 6e 73 2c 20 61 6e 64  e revisions, and
9dd0: 20 74 68 65 0a 09 23 20 74 61 67 73 20 61 73 73   the..# tags ass
9de0: 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65  ociated with the
9df0: 6d 20 61 72 65 20 73 75 63 63 65 73 73 6f 72 73  m are successors
9e00: 20 61 73 20 77 65 6c 6c 2e 0a 0a 09 66 6f 72 65   as well....fore
9e10: 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 7d 20  ach {rid child} 
9e20: 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73  [state run [subs
9e30: 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e  t -nocommands -n
9e40: 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 20  obackslashes {. 
9e50: 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d 61 72     -- (1) Primar
9e60: 79 20 63 68 69 6c 64 0a 09 20 20 20 20 53 45 4c  y child..    SEL
9e70: 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63 68 69  ECT R.rid, R.chi
9e80: 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72  ld..    FROM   r
9e90: 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57  evision R..    W
9ea0: 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e  HERE  R.rid   IN
9eb0: 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20   $theset     -- 
9ec0: 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69  Restrict to revi
9ed0: 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73  sions of interes
9ee0: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e  t..    AND    R.
9ef0: 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c  child IS NOT NUL
9f00: 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d  L    -- Has prim
9f10: 61 72 79 20 63 68 69 6c 64 0a 20 20 20 20 55 4e  ary child.    UN
9f20: 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32 29 20 53  ION.    -- (2) S
9f30: 65 63 6f 6e 64 61 72 79 20 28 62 72 61 6e 63 68  econdary (branch
9f40: 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20  ) children..    
9f50: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 42 2e  SELECT R.rid, B.
9f60: 62 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  brid..    FROM  
9f70: 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76   revision R, rev
9f80: 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64  isionbranchchild
9f90: 72 65 6e 20 42 0a 09 20 20 20 20 57 48 45 52 45  ren B..    WHERE
9fa0: 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68    R.rid   IN $th
9fb0: 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74  eset     -- Rest
9fc0: 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e  rict to revision
9fd0: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20  s of interest.. 
9fe0: 20 20 20 41 4e 44 20 20 20 20 52 2e 72 69 64 20     AND    R.rid 
9ff0: 3d 20 42 2e 72 69 64 20 20 20 20 20 20 20 20 20  = B.rid         
a000: 20 2d 2d 20 53 65 6c 65 63 74 20 73 75 62 73 65   -- Select subse
a010: 74 20 6f 66 20 62 72 61 6e 63 68 20 63 68 69 6c  t of branch chil
a020: 64 72 65 6e 0a 20 20 20 20 55 4e 49 4f 4e 0a 20  dren.    UNION. 
a030: 20 20 20 2d 2d 20 28 34 29 20 43 68 69 6c 64 20     -- (4) Child 
a040: 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 20 73 75  of trunk root su
a050: 63 63 65 73 73 6f 72 20 6f 66 20 6c 61 73 74 20  ccessor of last 
a060: 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b 2e 0a 09  NTDB on trunk...
a070: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64      SELECT R.rid
a080: 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20 20 20 20  , RA.child..    
a090: 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c  FROM revision R,
a0a0: 20 72 65 76 69 73 69 6f 6e 20 52 41 0a 09 20 20   revision RA..  
a0b0: 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 20 20    WHERE R.rid   
a0c0: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 20  IN $theset      
a0d0: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72  -- Restrict to r
a0e0: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65  evisions of inte
a0f0: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
a100: 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20 20  R.isdefault     
a110: 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72          -- Restr
a120: 69 63 74 20 74 6f 20 4e 54 44 42 0a 09 20 20 20  ict to NTDB..   
a130: 20 41 4e 44 20 20 20 52 2e 64 62 63 68 69 6c 64   AND   R.dbchild
a140: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d   IS NOT NULL   -
a150: 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 42 20  - and last NTDB 
a160: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72 75  belonging to tru
a170: 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 52 41  nk..    AND   RA
a180: 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69 6c 64  .rid = R.dbchild
a190: 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 72 65        -- Go dire
a1a0: 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 72 6f  ctly to trunk ro
a1b0: 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 52 41  ot..    AND   RA
a1c0: 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55  .child IS NOT NU
a1d0: 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69  LL    -- Has pri
a1e0: 6d 61 72 79 20 63 68 69 6c 64 2e 0a 09 7d 5d 5d  mary child...}]]
a1f0: 20 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 69 64   {..    # Consid
a200: 65 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 20 74  er moving this t
a210: 6f 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  o the integrity 
a220: 6d 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 6e 74  module...    int
a230: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24  egrity assert {$
a240: 72 69 64 20 21 3d 20 24 63 68 69 6c 64 7d 20 7b  rid != $child} {
a250: 52 65 76 69 73 69 6f 6e 20 24 72 69 64 20 64 65  Revision $rid de
a260: 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 2e  pends on itself.
a270: 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64  }..    lappend d
a280: 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73  ependencies([lis
a290: 74 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c 69  t rev $rid]) [li
a2a0: 73 74 20 72 65 76 20 24 63 68 69 6c 64 5d 0a 09  st rev $child]..
a2b0: 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20  }..foreach {rid 
a2c0: 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75  child} [state ru
a2d0: 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d  n [subst -nocomm
a2e0: 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73  ands -nobackslas
a2f0: 68 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45 43  hes {..    SELEC
a300: 54 20 52 2e 72 69 64 2c 20 54 2e 74 69 64 0a 09  T R.rid, T.tid..
a310: 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73      FROM   revis
a320: 69 6f 6e 20 52 2c 20 74 61 67 20 54 0a 09 20 20  ion R, tag T..  
a330: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 49    WHERE  R.rid I
a340: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 20 20  N $theset       
a350: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72  -- Restrict to r
a360: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65  evisions of inte
a370: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
a380: 20 54 2e 72 65 76 20 3d 20 52 2e 72 69 64 20 20   T.rev = R.rid  
a390: 20 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63          -- Selec
a3a0: 74 20 74 61 67 73 20 61 74 74 61 63 68 65 64 20  t tags attached 
a3b0: 74 6f 20 74 68 65 6d 0a 09 7d 5d 5d 20 7b 0a 09  to them..}]] {..
a3c0: 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65      lappend depe
a3d0: 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 72  ndencies([list r
a3e0: 65 76 20 24 72 69 64 5d 29 20 5b 6c 69 73 74 20  ev $rid]) [list 
a3f0: 73 79 6d 3a 3a 74 61 67 20 24 63 68 69 6c 64 5d  sym::tag $child]
a400: 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 69  ..}..foreach {ri
a410: 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20  d child} [state 
a420: 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f  run [subst -noco
a430: 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c  mmands -nobacksl
a440: 61 73 68 65 73 20 7b 0a 09 20 20 20 20 53 45 4c  ashes {..    SEL
a450: 45 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 69 64  ECT R.rid, B.bid
a460: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76  ..    FROM   rev
a470: 69 73 69 6f 6e 20 52 2c 20 62 72 61 6e 63 68 20  ision R, branch 
a480: 42 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e  B..    WHERE  R.
a490: 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 20 20  rid IN $theset  
a4a0: 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74       -- Restrict
a4b0: 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66   to revisions of
a4c0: 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41   interest..    A
a4d0: 4e 44 20 20 20 20 42 2e 72 6f 6f 74 20 3d 20 52  ND    B.root = R
a4e0: 2e 72 69 64 20 20 20 20 20 20 20 20 20 2d 2d 20  .rid         -- 
a4f0: 53 65 6c 65 63 74 20 62 72 61 6e 63 68 65 73 20  Select branches 
a500: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 6d  attached to them
a510: 0a 09 7d 5d 5d 20 7b 0a 09 20 20 20 20 6c 61 70  ..}]] {..    lap
a520: 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65  pend dependencie
a530: 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64  s([list rev $rid
a540: 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72  ]) [list sym::br
a550: 61 6e 63 68 20 24 63 68 69 6c 64 5d 0a 09 7d 0a  anch $child]..}.
a560: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
a570: 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69     # result = li
a580: 73 74 20 28 63 68 61 6e 67 65 73 65 74 2d 69 64  st (changeset-id
a590: 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ).    typemethod
a5a0: 20 63 73 5f 73 75 63 63 65 73 73 6f 72 73 20 7b   cs_successors {
a5b0: 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 20 20 20  revisions} {.   
a5c0: 20 20 20 20 20 23 20 54 68 69 73 20 69 73 20 61       # This is a
a5d0: 20 76 61 72 69 61 6e 74 20 6f 66 20 27 73 75 63   variant of 'suc
a5e0: 63 65 73 73 6f 72 73 27 20 77 68 69 63 68 20 6d  cessors' which m
a5f0: 61 70 73 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65  aps the low-leve
a600: 6c 0a 20 20 20 20 20 20 20 20 23 20 64 61 74 61  l.        # data
a610: 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
a620: 20 61 73 73 6f 63 69 61 74 65 64 20 63 68 61 6e   associated chan
a630: 67 65 73 65 74 73 2e 20 49 2e 65 2e 20 69 6e 73  gesets. I.e. ins
a640: 74 65 61 64 0a 20 20 20 20 20 20 20 20 23 20 6d  tead.        # m
a650: 69 6c 6c 69 6f 6e 73 20 6f 66 20 64 65 70 65 6e  illions of depen
a660: 64 65 6e 63 79 20 70 61 69 72 73 20 28 69 6e 20  dency pairs (in 
a670: 65 78 74 72 65 6d 65 20 63 61 73 65 73 20 28 45  extreme cases (E
a680: 78 61 6d 70 6c 65 3a 20 54 63 6c 0a 20 20 20 20  xample: Tcl.    
a690: 20 20 20 20 23 20 43 56 53 29 29 20 77 65 20 72      # CVS)) we r
a6a0: 65 74 75 72 6e 20 61 20 76 65 72 79 20 73 68 6f  eturn a very sho
a6b0: 72 74 20 61 6e 64 20 6d 75 63 68 20 6d 6f 72 65  rt and much more
a6c0: 20 6d 61 6e 61 67 65 61 62 6c 65 20 6c 69 73 74   manageable list
a6d0: 0a 20 20 20 20 20 20 20 20 23 20 6f 66 20 63 68  .        # of ch
a6e0: 61 6e 67 65 73 65 74 73 2e 0a 0a 09 73 65 74 20  angesets....set 
a6f0: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24  theset ('[join $
a700: 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d  revisions {','}]
a710: 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61 74  ')..return [stat
a720: 65 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f  e run [subst -no
a730: 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b  commands -noback
a740: 73 6c 61 73 68 65 73 20 7b 0a 20 20 20 20 2d 2d  slashes {.    --
a750: 20 28 31 29 20 50 72 69 6d 61 72 79 20 63 68 69   (1) Primary chi
a760: 6c 64 0a 09 20 20 20 20 53 45 4c 45 43 54 20 43  ld..    SELECT C
a770: 2e 63 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  .cid..    FROM  
a780: 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 63 73 69   revision R, csi
a790: 74 65 6d 20 43 49 2c 20 63 68 61 6e 67 65 73 65  tem CI, changese
a7a0: 74 20 43 0a 09 20 20 20 20 57 48 45 52 45 20 20  t C..    WHERE  
a7b0: 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73  R.rid   IN $thes
a7c0: 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69  et     -- Restri
a7d0: 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20  ct to revisions 
a7e0: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20  of interest..   
a7f0: 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20   AND    R.child 
a800: 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d  IS NOT NULL    -
a810: 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 68  - Has primary ch
a820: 69 6c 64 0a 20 20 20 20 20 20 20 20 20 20 20 20  ild.            
a830: 41 4e 44 20 20 20 20 43 49 2e 69 69 64 20 3d 20  AND    CI.iid = 
a840: 52 2e 63 68 69 6c 64 20 20 20 20 20 20 20 2d 2d  R.child       --
a850: 20 53 65 6c 65 63 74 20 61 6c 6c 20 63 68 61 6e   Select all chan
a860: 67 65 73 65 74 73 0a 20 20 20 20 20 20 20 20 20  gesets.         
a870: 20 20 20 41 4e 44 20 20 20 20 43 2e 63 69 64 20     AND    C.cid 
a880: 3d 20 43 49 2e 63 69 64 20 20 20 20 20 20 20 20  = CI.cid        
a890: 20 2d 2d 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   -- containing t
a8a0: 68 65 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64  he primary child
a8b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44  .            AND
a8c0: 20 20 20 20 43 2e 74 79 70 65 20 3d 20 30 20 20      C.type = 0  
a8d0: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 77 68             -- wh
a8e0: 69 63 68 20 61 72 65 20 72 65 76 69 73 69 6f 6e  ich are revision
a8f0: 20 63 68 61 6e 67 65 73 65 74 73 0a 20 20 20 20   changesets.    
a900: 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32 29  UNION.    -- (2)
a910: 20 53 65 63 6f 6e 64 61 72 79 20 28 62 72 61 6e   Secondary (bran
a920: 63 68 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 20  ch) children..  
a930: 20 20 53 45 4c 45 43 54 20 43 2e 63 69 64 0a 09    SELECT C.cid..
a940: 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73      FROM   revis
a950: 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 62  ion R, revisionb
a960: 72 61 6e 63 68 63 68 69 6c 64 72 65 6e 20 42 2c  ranchchildren B,
a970: 20 63 73 69 74 65 6d 20 43 49 2c 20 63 68 61 6e   csitem CI, chan
a980: 67 65 73 65 74 20 43 0a 09 20 20 20 20 57 48 45  geset C..    WHE
a990: 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24  RE  R.rid   IN $
a9a0: 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65  theset     -- Re
a9b0: 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69  strict to revisi
a9c0: 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  ons of interest.
a9d0: 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72 69  .    AND    R.ri
a9e0: 64 20 3d 20 42 2e 72 69 64 20 20 20 20 20 20 20  d = B.rid       
a9f0: 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 73 75 62     -- Select sub
aa00: 73 65 74 20 6f 66 20 62 72 61 6e 63 68 20 63 68  set of branch ch
aa10: 69 6c 64 72 65 6e 0a 20 20 20 20 20 20 20 20 20  ildren.         
aa20: 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69 64     AND    CI.iid
aa30: 20 3d 20 42 2e 62 72 69 64 20 20 20 20 20 20 20   = B.brid       
aa40: 20 2d 2d 20 53 65 6c 65 63 74 20 61 6c 6c 20 63   -- Select all c
aa50: 68 61 6e 67 65 73 65 74 73 0a 20 20 20 20 20 20  hangesets.      
aa60: 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e 63        AND    C.c
aa70: 69 64 20 3d 20 43 49 2e 63 69 64 09 20 20 2d 2d  id = CI.cid.  --
aa80: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
aa90: 62 72 61 6e 63 68 0a 20 20 20 20 20 20 20 20 20  branch.         
aaa0: 20 20 20 41 4e 44 20 20 20 20 43 2e 74 79 70 65     AND    C.type
aab0: 20 3d 20 30 09 09 20 20 2d 2d 20 77 68 69 63 68   = 0..  -- which
aac0: 20 61 72 65 20 72 65 76 69 73 69 6f 6e 20 63 68   are revision ch
aad0: 61 6e 67 65 73 65 74 73 0a 20 20 20 20 55 4e 49  angesets.    UNI
aae0: 4f 4e 0a 20 20 20 20 2d 2d 20 28 34 29 20 43 68  ON.    -- (4) Ch
aaf0: 69 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f  ild of trunk roo
ab00: 74 20 73 75 63 63 65 73 73 6f 72 20 6f 66 20 6c  t successor of l
ab10: 61 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e  ast NTDB on trun
ab20: 6b 2e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 43  k...    SELECT C
ab30: 2e 63 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  .cid..    FROM  
ab40: 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76   revision R, rev
ab50: 69 73 69 6f 6e 20 52 41 2c 20 63 73 69 74 65 6d  ision RA, csitem
ab60: 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43   CI, changeset C
ab70: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72  ..    WHERE  R.r
ab80: 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20  id   IN $theset 
ab90: 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74       -- Restrict
aba0: 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66   to revisions of
abb0: 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41   interest..    A
abc0: 4e 44 20 20 20 20 52 2e 69 73 64 65 66 61 75 6c  ND    R.isdefaul
abd0: 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d  t             --
abe0: 20 52 65 73 74 72 69 63 74 20 74 6f 20 4e 54 44   Restrict to NTD
abf0: 42 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e  B..    AND    R.
ac00: 64 62 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e  dbchild IS NOT N
ac10: 55 4c 4c 20 20 20 2d 2d 20 61 6e 64 20 6c 61 73  ULL   -- and las
ac20: 74 20 4e 54 44 42 20 62 65 6c 6f 6e 67 69 6e 67  t NTDB belonging
ac30: 20 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20 41   to trunk..    A
ac40: 4e 44 20 20 20 20 52 41 2e 72 69 64 20 3d 20 52  ND    RA.rid = R
ac50: 2e 64 62 63 68 69 6c 64 20 20 20 20 20 20 2d 2d  .dbchild      --
ac60: 20 47 6f 20 64 69 72 65 63 74 6c 79 20 74 6f 20   Go directly to 
ac70: 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 20  trunk root..    
ac80: 41 4e 44 20 20 20 20 52 41 2e 63 68 69 6c 64 20  AND    RA.child 
ac90: 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d  IS NOT NULL    -
aca0: 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 68  - Has primary ch
acb0: 69 6c 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ild..           
acc0: 20 41 4e 44 20 20 20 20 43 49 2e 69 69 64 20 3d   AND    CI.iid =
acd0: 20 52 41 2e 63 68 69 6c 64 20 20 20 20 20 20 20   RA.child       
ace0: 2d 2d 20 53 65 6c 65 63 74 20 61 6c 6c 20 63 68  -- Select all ch
acf0: 61 6e 67 65 73 65 74 73 0a 20 20 20 20 20 20 20  angesets.       
ad00: 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e 63 69       AND    C.ci
ad10: 64 20 3d 20 43 49 2e 63 69 64 09 20 20 20 2d 2d  d = CI.cid.   --
ad20: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20   containing the 
ad30: 70 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 20 20  primary child.  
ad40: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20            AND   
ad50: 20 43 2e 74 79 70 65 20 3d 20 30 09 09 20 20 20   C.type = 0..   
ad60: 2d 2d 20 77 68 69 63 68 20 61 72 65 20 72 65 76  -- which are rev
ad70: 69 73 69 6f 6e 20 63 68 61 6e 67 65 73 65 74 73  ision changesets
ad80: 0a 20 20 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20  .    UNION..    
ad90: 53 45 4c 45 43 54 20 43 2e 63 69 64 0a 09 20 20  SELECT C.cid..  
ada0: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f    FROM   revisio
adb0: 6e 20 52 2c 20 74 61 67 20 54 2c 20 63 73 69 74  n R, tag T, csit
adc0: 65 6d 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74  em CI, changeset
add0: 20 43 0a 09 20 20 20 20 57 48 45 52 45 20 20 52   C..    WHERE  R
ade0: 2e 72 69 64 20 69 6e 20 24 74 68 65 73 65 74 20  .rid in $theset 
adf0: 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69         -- Restri
ae00: 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20  ct to revisions 
ae10: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20  of interest..   
ae20: 20 41 4e 44 20 20 20 20 54 2e 72 65 76 20 3d 20   AND    T.rev = 
ae30: 52 2e 72 69 64 09 20 20 20 2d 2d 20 53 65 6c 65  R.rid.   -- Sele
ae40: 63 74 20 74 61 67 73 20 61 74 74 61 63 68 65 64  ct tags attached
ae50: 20 74 6f 20 74 68 65 6d 0a 20 20 20 20 20 20 20   to them.       
ae60: 20 20 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69       AND    CI.i
ae70: 69 64 20 3d 20 54 2e 74 69 64 20 20 20 20 20 20  id = T.tid      
ae80: 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 61 6c      -- Select al
ae90: 6c 20 63 68 61 6e 67 65 73 65 74 73 0a 20 20 20  l changesets.   
aea0: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20           AND    
aeb0: 43 2e 63 69 64 20 3d 20 43 49 2e 63 69 64 09 20  C.cid = CI.cid. 
aec0: 20 20 2d 2d 20 63 6f 6e 74 61 69 6e 69 6e 67 20    -- containing 
aed0: 74 68 65 20 74 61 67 73 0a 20 20 20 20 20 20 20  the tags.       
aee0: 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e 74 79       AND    C.ty
aef0: 70 65 20 3d 20 31 09 09 20 20 20 2d 2d 20 77 68  pe = 1..   -- wh
af00: 69 63 68 20 61 72 65 20 74 61 67 20 63 68 61 6e  ich are tag chan
af10: 67 65 73 65 74 73 0a 20 20 20 20 55 4e 49 4f 4e  gesets.    UNION
af20: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 43 2e 63  ..    SELECT C.c
af30: 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72  id..    FROM   r
af40: 65 76 69 73 69 6f 6e 20 52 2c 20 62 72 61 6e 63  evision R, branc
af50: 68 20 42 2c 20 63 73 69 74 65 6d 20 43 49 2c 20  h B, csitem CI, 
af60: 63 68 61 6e 67 65 73 65 74 20 43 0a 09 20 20 20  changeset C..   
af70: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 69 6e   WHERE  R.rid in
af80: 20 24 74 68 65 73 65 74 20 20 20 20 20 20 20 20   $theset        
af90: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72  -- Restrict to r
afa0: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65  evisions of inte
afb0: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
afc0: 20 42 2e 72 6f 6f 74 20 3d 20 52 2e 72 69 64 09   B.root = R.rid.
afd0: 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 62 72 61     -- Select bra
afe0: 6e 63 68 65 73 20 61 74 74 61 63 68 65 64 20 74  nches attached t
aff0: 6f 20 74 68 65 6d 0a 20 20 20 20 20 20 20 20 20  o them.         
b000: 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69 64     AND    CI.iid
b010: 20 3d 20 42 2e 62 69 64 20 20 20 20 20 20 20 20   = B.bid        
b020: 20 20 2d 2d 20 53 65 6c 65 63 74 20 61 6c 6c 20    -- Select all 
b030: 63 68 61 6e 67 65 73 65 74 73 0a 20 20 20 20 20  changesets.     
b040: 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e         AND    C.
b050: 63 69 64 20 3d 20 43 49 2e 63 69 64 09 20 20 20  cid = CI.cid.   
b060: 2d 2d 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  -- containing th
b070: 65 20 62 72 61 6e 63 68 65 73 0a 20 20 20 20 20  e branches.     
b080: 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e         AND    C.
b090: 74 79 70 65 20 3d 20 32 09 09 20 20 20 2d 2d 20  type = 2..   -- 
b0a0: 77 68 69 63 68 20 61 72 65 20 62 72 61 6e 63 68  which are branch
b0b0: 20 63 68 61 6e 67 65 73 65 74 73 0a 09 7d 5d 5d   changesets..}]]
b0c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65  .    }..    # re
b0d0: 73 75 6c 74 20 3d 20 73 79 6d 62 6f 6c 20 6e 61  sult = symbol na
b0e0: 6d 65 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  me.    typemetho
b0f0: 64 20 63 73 5f 6c 6f 64 20 7b 72 65 76 69 73 69  d cs_lod {revisi
b100: 6f 6e 73 7d 20 7b 0a 09 23 20 44 65 74 65 72 6d  ons} {..# Determ
b110: 69 6e 65 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  ines the name of
b120: 20 74 68 65 20 73 79 6d 62 6f 6c 20 77 68 69 63   the symbol whic
b130: 68 20 69 73 20 74 68 65 20 6c 69 6e 65 20 6f 66  h is the line of
b140: 0a 09 23 20 64 65 76 65 6c 6f 70 6d 65 6e 74 20  ..# development 
b150: 66 6f 72 20 74 68 65 20 72 65 76 69 73 69 6f 6e  for the revision
b160: 73 20 69 6e 20 61 20 63 68 61 6e 67 65 73 65 74  s in a changeset
b170: 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20 28  ....set theset (
b180: 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e  '[join $revision
b190: 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75  s {','}]')..retu
b1a0: 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73  rn [state run [s
b1b0: 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73  ubst -nocommands
b1c0: 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20   -nobackslashes 
b1d0: 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 0a 09 20  {..    SELECT.. 
b1e0: 20 20 20 44 49 53 54 49 4e 43 54 20 4c 2e 6e 61     DISTINCT L.na
b1f0: 6d 65 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72  me..    FROM   r
b200: 65 76 69 73 69 6f 6e 20 52 2c 20 73 79 6d 62 6f  evision R, symbo
b210: 6c 20 4c 0a 09 20 20 20 20 57 48 45 52 45 20 20  l L..    WHERE  
b220: 52 2e 72 69 64 20 69 6e 20 24 74 68 65 73 65 74  R.rid in $theset
b230: 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72          -- Restr
b240: 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73  ict to revisions
b250: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20   of interest..  
b260: 20 20 41 4e 44 20 20 20 20 4c 2e 73 69 64 20 3d    AND    L.sid =
b270: 20 52 2e 6c 6f 64 20 20 20 20 20 20 20 20 20 20   R.lod          
b280: 20 2d 2d 20 47 65 74 20 6c 6f 64 20 73 79 6d 62   -- Get lod symb
b290: 6f 6c 20 6f 66 20 72 65 76 69 73 69 6f 6e 0a 09  ol of revision..
b2a0: 7d 5d 5d 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23  }]].    }.}..# #
b2b0: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23   ## ### ##### ##
b2c0: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
b2d0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
b2e0: 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 48 65  ##########.## He
b2f0: 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 2e 20  lper singleton. 
b300: 43 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 74 61 67  Commands for tag
b310: 20 73 79 6d 62 6f 6c 20 63 68 61 6e 67 65 73 65   symbol changese
b320: 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20  ts...snit::type 
b330: 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d  ::vc::fossil::im
b340: 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65  port::cvs::proje
b350: 63 74 3a 3a 72 65 76 3a 3a 73 79 6d 3a 3a 74 61  ct::rev::sym::ta
b360: 67 20 7b 0a 20 20 20 20 74 79 70 65 6d 65 74 68  g {.    typemeth
b370: 6f 64 20 62 79 72 65 76 69 73 69 6f 6e 20 7b 7d  od byrevision {}
b380: 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20   { return 0 }.  
b390: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 73    typemethod bys
b3a0: 79 6d 62 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 74  ymbol   {} { ret
b3b0: 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 79 70 65  urn 1 }.    type
b3c0: 6d 65 74 68 6f 64 20 69 73 74 61 67 20 20 20 20  method istag    
b3d0: 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20    {} { return 1 
b3e0: 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  }.    typemethod
b3f0: 20 69 73 62 72 61 6e 63 68 20 20 20 7b 7d 20 7b   isbranch   {} {
b400: 20 72 65 74 75 72 6e 20 30 20 7d 0a 0a 20 20 20   return 0 }..   
b410: 20 74 79 70 65 6d 65 74 68 6f 64 20 73 74 72 20   typemethod str 
b420: 7b 74 61 67 7d 20 7b 0a 09 73 74 72 75 63 74 3a  {tag} {..struct:
b430: 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b 73 74  :list assign [st
b440: 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 53  ate run {..    S
b450: 45 4c 45 43 54 20 53 2e 6e 61 6d 65 2c 20 46 2e  ELECT S.name, F.
b460: 6e 61 6d 65 2c 20 50 2e 6e 61 6d 65 0a 09 20 20  name, P.name..  
b470: 20 20 46 52 4f 4d 20 20 20 74 61 67 20 54 2c 20    FROM   tag T, 
b480: 73 79 6d 62 6f 6c 20 53 2c 20 66 69 6c 65 20 46  symbol S, file F
b490: 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09 20 20 20  , project P..   
b4a0: 20 57 48 45 52 45 20 20 54 2e 74 69 64 20 3d 20   WHERE  T.tid = 
b4b0: 24 74 61 67 20 20 20 2d 2d 20 46 69 6e 64 20 73  $tag   -- Find s
b4c0: 70 65 63 69 66 69 65 64 20 74 61 67 0a 09 20 20  pecified tag..  
b4d0: 20 20 41 4e 44 20 20 20 20 46 2e 66 69 64 20 3d    AND    F.fid =
b4e0: 20 54 2e 66 69 64 20 20 2d 2d 20 47 65 74 20 66   T.fid  -- Get f
b4f0: 69 6c 65 20 6f 66 20 74 61 67 0a 09 20 20 20 20  ile of tag..    
b500: 41 4e 44 20 20 20 20 50 2e 70 69 64 20 3d 20 46  AND    P.pid = F
b510: 2e 70 69 64 20 20 2d 2d 20 47 65 74 20 70 72 6f  .pid  -- Get pro
b520: 6a 65 63 74 20 6f 66 20 66 69 6c 65 0a 09 20 20  ject of file..  
b530: 20 20 41 4e 44 20 20 20 20 53 2e 73 69 64 20 3d    AND    S.sid =
b540: 20 54 2e 73 69 64 20 20 2d 2d 20 47 65 74 20 73   T.sid  -- Get s
b550: 79 6d 62 6f 6c 20 6f 66 20 74 61 67 0a 09 7d 5d  ymbol of tag..}]
b560: 20 73 6e 61 6d 65 20 66 6e 61 6d 65 20 70 6e 61   sname fname pna
b570: 6d 65 0a 09 72 65 74 75 72 6e 20 22 24 70 6e 61  me..return "$pna
b580: 6d 65 2f 54 27 24 7b 73 6e 61 6d 65 7d 27 3a 3a  me/T'${sname}'::
b590: 24 66 6e 61 6d 65 22 0a 20 20 20 20 7d 0a 0a 20  $fname".    }.. 
b5a0: 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69     # result = li
b5b0: 73 74 20 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 78  st (mintime, max
b5c0: 74 69 6d 65 29 0a 20 20 20 20 74 79 70 65 6d 65  time).    typeme
b5d0: 74 68 6f 64 20 74 69 6d 65 72 61 6e 67 65 20 7b  thod timerange {
b5e0: 74 61 67 73 7d 20 7b 0a 09 23 20 54 68 65 20 72  tags} {..# The r
b5f0: 61 6e 67 65 20 69 73 20 64 65 66 69 6e 65 64 20  ange is defined 
b600: 61 73 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20  as the range of 
b610: 74 68 65 20 72 65 76 69 73 69 6f 6e 73 20 74 68  the revisions th
b620: 65 20 74 61 67 73 0a 09 23 20 61 72 65 20 61 74  e tags..# are at
b630: 74 61 63 68 65 64 20 74 6f 2e 0a 0a 09 73 65 74  tached to....set
b640: 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20   theset ('[join 
b650: 24 74 61 67 73 20 7b 27 2c 27 7d 5d 27 29 0a 09  $tags {','}]')..
b660: 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75  return [state ru
b670: 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d  n [subst -nocomm
b680: 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73  ands -nobackslas
b690: 68 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45 43  hes {..    SELEC
b6a0: 54 20 4d 49 4e 28 52 2e 64 61 74 65 29 2c 20 4d  T MIN(R.date), M
b6b0: 41 58 28 52 2e 64 61 74 65 29 0a 09 20 20 20 20  AX(R.date)..    
b6c0: 46 52 4f 4d 20 20 20 74 61 67 20 54 2c 20 72 65  FROM   tag T, re
b6d0: 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48  vision R..    WH
b6e0: 45 52 45 20 20 54 2e 74 69 64 20 49 4e 20 24 74  ERE  T.tid IN $t
b6f0: 68 65 73 65 74 20 20 2d 2d 20 52 65 73 74 72 69  heset  -- Restri
b700: 63 74 20 74 6f 20 74 61 67 73 20 6f 66 20 69 6e  ct to tags of in
b710: 74 65 72 65 73 74 0a 20 20 20 20 20 20 20 20 20  terest.         
b720: 20 20 20 41 4e 44 20 20 20 20 52 2e 72 69 64 20     AND    R.rid 
b730: 3d 20 54 2e 72 65 76 20 20 20 20 20 2d 2d 20 53  = T.rev     -- S
b740: 65 6c 65 63 74 20 74 61 67 20 70 61 72 65 6e 74  elect tag parent
b750: 20 72 65 76 69 73 69 6f 6e 73 0a 09 7d 5d 5d 0a   revisions..}]].
b760: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72      }..    # var
b770: 28 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 65  (dv) = dict (ite
b780: 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29  m -> list (item)
b790: 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20  ), item  = list 
b7a0: 28 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 79  (type id).    ty
b7b0: 70 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73  pemethod success
b7c0: 6f 72 73 20 7b 64 76 20 74 61 67 73 7d 20 7b 0a  ors {dv tags} {.
b7d0: 09 23 20 54 61 67 73 20 68 61 76 65 20 6e 6f 20  .# Tags have no 
b7e0: 73 75 63 63 65 73 73 6f 72 73 2e 0a 09 72 65 74  successors...ret
b7f0: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  urn.    }..    #
b800: 20 72 65 73 75 6c 74 20 3d 20 34 2d 6c 69 73 74   result = 4-list
b810: 20 28 69 74 65 6d 74 79 70 65 20 69 74 65 6d 69   (itemtype itemi
b820: 64 20 6e 65 78 74 69 74 65 6d 74 79 70 65 20 6e  d nextitemtype n
b830: 65 78 74 69 74 65 6d 69 64 20 2e 2e 2e 29 0a 20  extitemid ...). 
b840: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c 6f     typemethod lo
b850: 6f 70 73 20 7b 74 61 67 73 7d 20 7b 0a 09 23 20  ops {tags} {..# 
b860: 54 61 67 73 20 68 61 76 65 20 6e 6f 20 73 75 63  Tags have no suc
b870: 63 65 73 73 6f 72 73 2c 20 74 68 65 72 65 66 6f  cessors, therefo
b880: 72 65 20 63 61 6e 6e 6f 74 20 63 61 75 73 65 20  re cannot cause 
b890: 6c 6f 6f 70 73 0a 09 72 65 74 75 72 6e 20 7b 7d  loops..return {}
b8a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65  .    }..    # re
b8b0: 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 63 68 61  sult = list (cha
b8c0: 6e 67 65 73 65 74 2d 69 64 29 0a 20 20 20 20 74  ngeset-id).    t
b8d0: 79 70 65 6d 65 74 68 6f 64 20 63 73 5f 73 75 63  ypemethod cs_suc
b8e0: 63 65 73 73 6f 72 73 20 7b 74 61 67 73 7d 20 7b  cessors {tags} {
b8f0: 0a 09 23 20 54 61 67 73 20 68 61 76 65 20 6e 6f  ..# Tags have no
b900: 20 73 75 63 63 65 73 73 6f 72 73 2e 0a 09 72 65   successors...re
b910: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
b920: 23 20 72 65 73 75 6c 74 20 3d 20 73 79 6d 62 6f  # result = symbo
b930: 6c 20 6e 61 6d 65 0a 20 20 20 20 74 79 70 65 6d  l name.    typem
b940: 65 74 68 6f 64 20 63 73 5f 6c 6f 64 20 7b 74 61  ethod cs_lod {ta
b950: 67 73 7d 20 7b 0a 09 23 20 44 65 74 65 72 6d 69  gs} {..# Determi
b960: 6e 65 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  nes the name of 
b970: 74 68 65 20 73 79 6d 62 6f 6c 20 77 68 69 63 68  the symbol which
b980: 20 69 73 20 74 68 65 20 6c 69 6e 65 20 6f 66 0a   is the line of.
b990: 09 23 20 64 65 76 65 6c 6f 70 6d 65 6e 74 20 66  .# development f
b9a0: 6f 72 20 74 68 65 20 74 61 67 73 20 69 6e 20 61  or the tags in a
b9b0: 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 73 65   changeset....se
b9c0: 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e  t theset ('[join
b9d0: 20 24 74 61 67 73 20 7b 27 2c 27 7d 5d 27 29 0a   $tags {','}]').
b9e0: 09 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72  .return [state r
b9f0: 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d  un [subst -nocom
ba00: 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61  mands -nobacksla
ba10: 73 68 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45  shes {..    SELE
ba20: 43 54 0a 09 20 20 20 20 44 49 53 54 49 4e 43 54  CT..    DISTINCT
ba30: 20 4c 2e 6e 61 6d 65 0a 09 20 20 20 20 46 52 4f   L.name..    FRO
ba40: 4d 20 20 20 74 61 67 20 54 2c 20 73 79 6d 62 6f  M   tag T, symbo
ba50: 6c 20 4c 0a 09 20 20 20 20 57 48 45 52 45 20 20  l L..    WHERE  
ba60: 54 2e 74 69 64 20 69 6e 20 24 74 68 65 73 65 74  T.tid in $theset
ba70: 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72          -- Restr
ba80: 69 63 74 20 74 6f 20 74 61 67 73 20 6f 66 20 69  ict to tags of i
ba90: 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44  nterest..    AND
baa0: 20 20 20 20 4c 2e 73 69 64 20 3d 20 54 2e 6c 6f      L.sid = T.lo
bab0: 64 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 47  d           -- G
bac0: 65 74 20 6c 6f 64 20 73 79 6d 62 6f 6c 20 6f 66  et lod symbol of
bad0: 20 74 61 67 0a 09 7d 5d 5d 0a 20 20 20 20 7d 0a   tag..}]].    }.
bae0: 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23 23  }..# # ## ### ##
baf0: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23  ### ######## ###
bb00: 23 23 23 23 23 23 23 23 23 23 20 23 23 23 23 23  ########## #####
bb10: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
bb20: 0a 23 23 20 48 65 6c 70 65 72 20 73 69 6e 67 6c  .## Helper singl
bb30: 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20 66  eton. Commands f
bb40: 6f 72 20 62 72 61 6e 63 68 20 73 79 6d 62 6f 6c  or branch symbol
bb50: 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e   changesets...sn
bb60: 69 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66  it::type ::vc::f
bb70: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63  ossil::import::c
bb80: 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76  vs::project::rev
bb90: 3a 3a 73 79 6d 3a 3a 62 72 61 6e 63 68 20 7b 0a  ::sym::branch {.
bba0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62      typemethod b
bbb0: 79 72 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 72  yrevision {} { r
bbc0: 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79  eturn 0 }.    ty
bbd0: 70 65 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 6f  pemethod bysymbo
bbe0: 6c 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20  l   {} { return 
bbf0: 31 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68  1 }.    typemeth
bc00: 6f 64 20 69 73 74 61 67 20 20 20 20 20 20 7b 7d  od istag      {}
bc10: 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20   { return 0 }.  
bc20: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73 62    typemethod isb
bc30: 72 61 6e 63 68 20 20 20 7b 7d 20 7b 20 72 65 74  ranch   {} { ret
bc40: 75 72 6e 20 31 20 7d 0a 0a 20 20 20 20 74 79 70  urn 1 }..    typ
bc50: 65 6d 65 74 68 6f 64 20 73 74 72 20 7b 62 72 61  emethod str {bra
bc60: 6e 63 68 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a  nch} {..struct::
bc70: 6c 69 73 74 20 61 73 73 69 67 6e 20 5b 73 74 61  list assign [sta
bc80: 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 53 45  te run {..    SE
bc90: 4c 45 43 54 20 53 2e 6e 61 6d 65 2c 20 46 2e 6e  LECT S.name, F.n
bca0: 61 6d 65 2c 20 50 2e 6e 61 6d 65 0a 09 20 20 20  ame, P.name..   
bcb0: 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42   FROM   branch B
bcc0: 2c 20 73 79 6d 62 6f 6c 20 53 2c 20 66 69 6c 65  , symbol S, file
bcd0: 20 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09 20   F, project P.. 
bce0: 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20     WHERE  B.bid 
bcf0: 3d 20 24 62 72 61 6e 63 68 20 20 2d 2d 20 46 69  = $branch  -- Fi
bd00: 6e 64 20 73 70 65 63 69 66 69 65 64 20 62 72 61  nd specified bra
bd10: 6e 63 68 0a 09 20 20 20 20 41 4e 44 20 20 20 20  nch..    AND    
bd20: 46 2e 66 69 64 20 3d 20 42 2e 66 69 64 20 20 20  F.fid = B.fid   
bd30: 20 2d 2d 20 47 65 74 20 66 69 6c 65 20 6f 66 20   -- Get file of 
bd40: 62 72 61 6e 63 68 0a 09 20 20 20 20 41 4e 44 20  branch..    AND 
bd50: 20 20 20 50 2e 70 69 64 20 3d 20 46 2e 70 69 64     P.pid = F.pid
bd60: 20 20 20 20 2d 2d 20 47 65 74 20 70 72 6f 6a 65      -- Get proje
bd70: 63 74 20 6f 66 20 66 69 6c 65 0a 09 20 20 20 20  ct of file..    
bd80: 41 4e 44 20 20 20 20 53 2e 73 69 64 20 3d 20 42  AND    S.sid = B
bd90: 2e 73 69 64 20 20 20 20 2d 2d 20 47 65 74 20 73  .sid    -- Get s
bda0: 79 6d 62 6f 6c 20 6f 66 20 62 72 61 6e 63 68 0a  ymbol of branch.
bdb0: 09 7d 5d 20 73 6e 61 6d 65 20 66 6e 61 6d 65 20  .}] sname fname 
bdc0: 70 6e 61 6d 65 0a 09 72 65 74 75 72 6e 20 22 24  pname..return "$
bdd0: 70 6e 61 6d 65 2f 42 27 24 7b 73 6e 61 6d 65 7d  pname/B'${sname}
bde0: 27 3a 3a 24 66 6e 61 6d 65 22 0a 20 20 20 20 7d  '::$fname".    }
bdf0: 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d  ..    # result =
be00: 20 6c 69 73 74 20 28 6d 69 6e 74 69 6d 65 2c 20   list (mintime, 
be10: 6d 61 78 74 69 6d 65 29 0a 20 20 20 20 74 79 70  maxtime).    typ
be20: 65 6d 65 74 68 6f 64 20 74 69 6d 65 72 61 6e 67  emethod timerang
be30: 65 20 7b 62 72 61 6e 63 68 65 73 7d 20 7b 0a 09  e {branches} {..
be40: 23 20 54 68 65 20 72 61 6e 67 65 20 6f 66 20 61  # The range of a
be50: 20 62 72 61 6e 63 68 20 69 73 20 64 65 66 69 6e   branch is defin
be60: 65 64 20 61 73 20 74 68 65 20 72 61 6e 67 65 20  ed as the range 
be70: 6f 66 20 74 68 65 0a 09 23 20 72 65 76 69 73 69  of the..# revisi
be80: 6f 6e 73 20 74 68 65 20 62 72 61 6e 63 68 65 73  ons the branches
be90: 20 61 72 65 20 73 70 61 77 6e 65 64 20 62 79 2e   are spawned by.
bea0: 20 4e 4f 54 45 20 68 6f 77 65 76 65 72 20 74 68   NOTE however th
beb0: 61 74 20 74 68 65 0a 09 23 20 62 72 61 6e 63 68  at the..# branch
bec0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
bed0: 74 68 20 61 20 64 65 74 61 63 68 65 64 20 4e 54  th a detached NT
bee0: 44 42 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20  DB will have no 
bef0: 72 6f 6f 74 0a 09 23 20 73 70 61 77 6e 69 6e 67  root..# spawning
bf00: 20 74 68 65 6d 2c 20 68 65 6e 63 65 20 74 68 65   them, hence the
bf10: 79 20 68 61 76 65 20 6e 6f 20 72 65 61 6c 20 74  y have no real t
bf20: 69 6d 65 72 61 6e 67 65 20 61 6e 79 0a 09 23 20  imerange any..# 
bf30: 6c 6f 6e 67 65 72 2e 20 42 79 20 75 73 69 6e 67  longer. By using
bf40: 20 30 20 77 65 20 70 75 74 20 74 68 65 6d 20 69   0 we put them i
bf50: 6e 20 66 72 6f 6e 74 20 6f 66 20 65 76 65 72 79  n front of every
bf60: 74 68 69 6e 67 20 65 6c 73 65 2c 0a 09 23 20 61  thing else,..# a
bf70: 73 20 74 68 65 79 20 6c 6f 67 69 63 61 6c 6c 79  s they logically
bf80: 20 61 72 65 2e 0a 0a 09 73 65 74 20 74 68 65 73   are....set thes
bf90: 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61 6e  et ('[join $bran
bfa0: 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72  ches {','}]')..r
bfb0: 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e  eturn [state run
bfc0: 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61   [subst -nocomma
bfd0: 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68  nds -nobackslash
bfe0: 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54  es {..    SELECT
bff0: 20 49 46 4e 55 4c 4c 28 4d 49 4e 28 52 2e 64 61   IFNULL(MIN(R.da
c000: 74 65 29 2c 30 29 2c 20 49 46 4e 55 4c 4c 28 4d  te),0), IFNULL(M
c010: 41 58 28 52 2e 64 61 74 65 29 2c 30 29 0a 09 20  AX(R.date),0).. 
c020: 20 20 20 46 52 4f 4d 20 20 62 72 61 6e 63 68 20     FROM  branch 
c030: 42 2c 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20  B, revision R.. 
c040: 20 20 20 57 48 45 52 45 20 42 2e 62 69 64 20 49     WHERE B.bid I
c050: 4e 20 24 74 68 65 73 65 74 20 20 20 2d 2d 20 52  N $theset   -- R
c060: 65 73 74 72 69 63 74 20 74 6f 20 62 72 61 6e 63  estrict to branc
c070: 68 65 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  hes of interest.
c080: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
c090: 20 20 52 2e 72 69 64 20 3d 20 42 2e 72 6f 6f 74    R.rid = B.root
c0a0: 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 62       -- Select b
c0b0: 72 61 6e 63 68 20 70 61 72 65 6e 74 20 72 65 76  ranch parent rev
c0c0: 69 73 69 6f 6e 73 0a 09 7d 5d 5d 0a 20 20 20 20  isions..}]].    
c0d0: 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20  }..    # result 
c0e0: 3d 20 34 2d 6c 69 73 74 20 28 69 74 65 6d 74 79  = 4-list (itemty
c0f0: 70 65 20 69 74 65 6d 69 64 20 6e 65 78 74 69 74  pe itemid nextit
c100: 65 6d 74 79 70 65 20 6e 65 78 74 69 74 65 6d 69  emtype nextitemi
c110: 64 20 2e 2e 2e 29 0a 20 20 20 20 74 79 70 65 6d  d ...).    typem
c120: 65 74 68 6f 64 20 6c 6f 6f 70 73 20 7b 62 72 61  ethod loops {bra
c130: 6e 63 68 65 73 7d 20 7b 0a 09 23 20 4e 6f 74 65  nches} {..# Note
c140: 3a 20 52 65 76 69 73 69 6f 6e 73 20 61 6e 64 20  : Revisions and 
c150: 74 61 67 73 20 63 61 6e 6e 6f 74 20 63 61 75 73  tags cannot caus
c160: 65 20 74 68 65 20 6c 6f 6f 70 2e 20 42 65 69 6e  e the loop. Bein
c170: 67 20 6f 66 20 61 0a 09 23 20 66 75 6e 64 61 6d  g of a..# fundam
c180: 65 6e 74 61 6c 6c 79 20 64 69 66 66 65 72 65 6e  entally differen
c190: 74 20 74 79 70 65 20 74 68 65 79 20 63 61 6e 6e  t type they cann
c1a0: 6f 74 20 62 65 20 69 6e 20 74 68 65 20 69 6e 63  ot be in the inc
c1b0: 6f 6d 69 6e 67 0a 09 23 20 73 65 74 20 6f 66 20  oming..# set of 
c1c0: 69 64 73 2e 0a 0a 09 73 65 74 20 74 68 65 73 65  ids....set these
c1d0: 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61 6e 63  t ('[join $branc
c1e0: 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65  hes {','}]')..re
c1f0: 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20  turn [state run 
c200: 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e  [subst -nocomman
c210: 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65  ds -nobackslashe
c220: 73 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20  s {..    SELECT 
c230: 42 2e 62 69 64 2c 20 42 58 2e 62 69 64 0a 09 20  B.bid, BX.bid.. 
c240: 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68     FROM   branch
c250: 20 42 2c 20 70 72 65 66 65 72 65 64 70 61 72 65   B, preferedpare
c260: 6e 74 20 50 2c 20 62 72 61 6e 63 68 20 42 58 0a  nt P, branch BX.
c270: 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69  .    WHERE  B.bi
c280: 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 2d  d IN $theset   -
c290: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 62 72  - Restrict to br
c2a0: 61 6e 63 68 65 73 20 6f 66 20 69 6e 74 65 72 65  anches of intere
c2b0: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42  st..    AND    B
c2c0: 2e 73 69 64 20 3d 20 50 2e 70 69 64 20 20 20 20  .sid = P.pid    
c2d0: 20 20 2d 2d 20 47 65 74 20 74 68 65 20 70 72 65    -- Get the pre
c2e0: 66 65 72 65 64 20 62 72 61 6e 63 68 65 73 20 76  fered branches v
c2f0: 69 61 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42  ia..    AND    B
c300: 58 2e 73 69 64 20 3d 20 50 2e 73 69 64 20 20 20  X.sid = P.sid   
c310: 20 20 2d 2d 20 74 68 65 20 62 72 61 6e 63 68 20    -- the branch 
c320: 73 79 6d 62 6f 6c 73 0a 09 20 20 20 20 41 4e 44  symbols..    AND
c330: 20 20 20 20 42 58 2e 62 69 64 20 49 4e 20 24 74      BX.bid IN $t
c340: 68 65 73 65 74 20 20 2d 2d 20 4c 6f 6f 70 0a 09  heset  -- Loop..
c350: 7d 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  }]].    }..    #
c360: 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20   var(dv) = dict 
c370: 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69  (item -> list (i
c380: 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c  tem)), item  = l
c390: 69 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 20  ist (type id).  
c3a0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 73 75 63    typemethod suc
c3b0: 63 65 73 73 6f 72 73 20 7b 64 76 20 62 72 61 6e  cessors {dv bran
c3c0: 63 68 65 73 7d 20 7b 0a 09 75 70 76 61 72 20 31  ches} {..upvar 1
c3d0: 20 24 64 76 20 64 65 70 65 6e 64 65 6e 63 69 65   $dv dependencie
c3e0: 73 0a 09 23 20 54 68 65 20 66 69 72 73 74 20 72  s..# The first r
c3f0: 65 76 69 73 69 6f 6e 20 63 6f 6d 6d 69 74 74 65  evision committe
c400: 64 20 6f 6e 20 61 20 62 72 61 6e 63 68 2c 20 61  d on a branch, a
c410: 6e 64 20 61 6c 6c 20 62 72 61 6e 63 68 65 73 0a  nd all branches.
c420: 09 23 20 61 6e 64 20 74 61 67 73 20 77 68 69 63  .# and tags whic
c430: 68 20 68 61 76 65 20 69 74 20 61 73 20 74 68 65  h have it as the
c440: 69 72 20 70 72 65 66 65 72 65 64 20 70 61 72 65  ir prefered pare
c450: 6e 74 20 61 72 65 20 74 68 65 0a 09 23 20 73 75  nt are the..# su
c460: 63 63 65 73 73 6f 72 73 20 6f 66 20 61 20 62 72  ccessors of a br
c470: 61 6e 63 68 2e 0a 0a 09 73 65 74 20 74 68 65 73  anch....set thes
c480: 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61 6e  et ('[join $bran
c490: 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66  ches {','}]')..f
c4a0: 6f 72 65 61 63 68 20 7b 62 69 64 20 63 68 69 6c  oreach {bid chil
c4b0: 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73  d} [state run [s
c4c0: 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73  ubst -nocommands
c4d0: 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20   -nobackslashes 
c4e0: 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e  {..    SELECT B.
c4f0: 62 69 64 2c 20 52 2e 72 69 64 0a 09 20 20 20 20  bid, R.rid..    
c500: 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c  FROM   branch B,
c510: 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20   revision R..   
c520: 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e   WHERE  B.bid IN
c530: 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20   $theset     -- 
c540: 52 65 73 74 72 69 63 74 20 74 6f 20 62 72 61 6e  Restrict to bran
c550: 63 68 65 73 20 6f 66 20 69 6e 74 65 72 65 73 74  ches of interest
c560: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 66  ..    AND    B.f
c570: 69 72 73 74 20 3d 20 52 2e 72 69 64 20 20 20 20  irst = R.rid    
c580: 20 20 2d 2d 20 47 65 74 20 66 69 72 73 74 20 72    -- Get first r
c590: 65 76 69 73 69 6f 6e 20 6f 6e 20 74 68 65 20 62  evision on the b
c5a0: 72 61 6e 63 68 0a 09 7d 5d 5d 20 7b 0a 09 20 20  ranch..}]] {..  
c5b0: 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64    lappend depend
c5c0: 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d  encies([list sym
c5d0: 3a 3a 62 72 61 6e 63 68 20 24 62 69 64 5d 29 20  ::branch $bid]) 
c5e0: 5b 6c 69 73 74 20 72 65 76 20 24 63 68 69 6c 64  [list rev $child
c5f0: 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62  ]..}..foreach {b
c600: 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65  id child} [state
c610: 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63   run [subst -noc
c620: 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73  ommands -nobacks
c630: 6c 61 73 68 65 73 20 7b 0a 09 20 20 20 20 53 45  lashes {..    SE
c640: 4c 45 43 54 20 42 2e 62 69 64 2c 20 42 58 2e 62  LECT B.bid, BX.b
c650: 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62  id..    FROM   b
c660: 72 61 6e 63 68 20 42 2c 20 70 72 65 66 65 72 65  ranch B, prefere
c670: 64 70 61 72 65 6e 74 20 50 2c 20 62 72 61 6e 63  dparent P, branc
c680: 68 20 42 58 0a 09 20 20 20 20 57 48 45 52 45 20  h BX..    WHERE 
c690: 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65   B.bid IN $these
c6a0: 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63  t     -- Restric
c6b0: 74 20 74 6f 20 62 72 61 6e 63 68 65 73 20 6f 66  t to branches of
c6c0: 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41   interest..    A
c6d0: 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50 2e  ND    B.sid = P.
c6e0: 70 69 64 20 20 20 20 20 20 20 20 2d 2d 20 47 65  pid        -- Ge
c6f0: 74 20 73 75 62 6f 72 64 69 6e 61 74 65 20 62 72  t subordinate br
c700: 61 6e 63 68 65 73 20 76 69 61 20 74 68 65 0a 09  anches via the..
c710: 20 20 20 20 41 4e 44 20 20 20 20 42 58 2e 73 69      AND    BX.si
c720: 64 20 3d 20 50 2e 73 69 64 20 20 20 20 20 20 20  d = P.sid       
c730: 2d 2d 20 70 72 65 66 65 72 65 64 20 70 61 72 65  -- prefered pare
c740: 6e 74 73 20 6f 66 20 74 68 65 69 72 20 73 79 6d  nts of their sym
c750: 62 6f 6c 73 0a 09 7d 5d 5d 20 7b 0a 09 20 20 20  bols..}]] {..   
c760: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65   lappend depende
c770: 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a  ncies([list sym:
c780: 3a 62 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b  :branch $bid]) [
c790: 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68  list sym::branch
c7a0: 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72   $child]..}..for
c7b0: 65 61 63 68 20 7b 62 69 64 20 63 68 69 6c 64 7d  each {bid child}
c7c0: 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62   [state run [sub
c7d0: 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d  st -nocommands -
c7e0: 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a  nobackslashes {.
c7f0: 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62 69  .    SELECT B.bi
c800: 64 2c 20 54 2e 74 69 64 0a 09 20 20 20 20 46 52  d, T.tid..    FR
c810: 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20 70  OM   branch B, p
c820: 72 65 66 65 72 65 64 70 61 72 65 6e 74 20 50 2c  referedparent P,
c830: 20 74 61 67 20 54 0a 09 20 20 20 20 57 48 45 52   tag T..    WHER
c840: 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65  E  B.bid IN $the
c850: 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72  set     -- Restr
c860: 69 63 74 20 74 6f 20 62 72 61 6e 63 68 65 73 20  ict to branches 
c870: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20  of interest..   
c880: 20 41 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20   AND    B.sid = 
c890: 50 2e 70 69 64 20 20 20 20 20 20 20 20 2d 2d 20  P.pid        -- 
c8a0: 47 65 74 20 73 75 62 6f 72 64 69 6e 61 74 65 20  Get subordinate 
c8b0: 74 61 67 73 20 76 69 61 20 74 68 65 0a 09 20 20  tags via the..  
c8c0: 20 20 41 4e 44 20 20 20 20 54 2e 73 69 64 20 3d    AND    T.sid =
c8d0: 20 50 2e 73 69 64 20 20 20 20 20 20 20 20 2d 2d   P.sid        --
c8e0: 20 70 72 65 66 65 72 65 64 20 70 61 72 65 6e 74   prefered parent
c8f0: 73 20 6f 66 20 74 68 65 69 72 20 73 79 6d 62 6f  s of their symbo
c900: 6c 73 0a 09 7d 5d 5d 20 7b 0a 09 20 20 20 20 6c  ls..}]] {..    l
c910: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63  append dependenc
c920: 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62  ies([list sym::b
c930: 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c 69  ranch $bid]) [li
c940: 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 63 68 69  st sym::tag $chi
c950: 6c 64 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20  ld]..}..return. 
c960: 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75     }..    # resu
c970: 6c 74 20 3d 20 6c 69 73 74 20 28 63 68 61 6e 67  lt = list (chang
c980: 65 73 65 74 2d 69 64 29 0a 20 20 20 20 74 79 70  eset-id).    typ
c990: 65 6d 65 74 68 6f 64 20 63 73 5f 73 75 63 63 65  emethod cs_succe
c9a0: 73 73 6f 72 73 20 7b 62 72 61 6e 63 68 65 73 7d  ssors {branches}
c9b0: 20 7b 0a 20 20 20 20 20 20 20 20 23 20 54 68 69   {.        # Thi
c9c0: 73 20 69 73 20 61 20 76 61 72 69 61 6e 74 20 6f  s is a variant o
c9d0: 66 20 27 73 75 63 63 65 73 73 6f 72 73 27 20 77  f 'successors' w
c9e0: 68 69 63 68 20 6d 61 70 73 20 74 68 65 20 6c 6f  hich maps the lo
c9f0: 77 2d 6c 65 76 65 6c 0a 20 20 20 20 20 20 20 20  w-level.        
ca00: 23 20 64 61 74 61 20 64 69 72 65 63 74 6c 79 20  # data directly 
ca10: 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  to the associate
ca20: 64 20 63 68 61 6e 67 65 73 65 74 73 2e 20 49 2e  d changesets. I.
ca30: 65 2e 20 69 6e 73 74 65 61 64 0a 20 20 20 20 20  e. instead.     
ca40: 20 20 20 23 20 6d 69 6c 6c 69 6f 6e 73 20 6f 66     # millions of
ca50: 20 64 65 70 65 6e 64 65 6e 63 79 20 70 61 69 72   dependency pair
ca60: 73 20 28 69 6e 20 65 78 74 72 65 6d 65 20 63 61  s (in extreme ca
ca70: 73 65 73 20 28 45 78 61 6d 70 6c 65 3a 20 54 63  ses (Example: Tc
ca80: 6c 0a 20 20 20 20 20 20 20 20 23 20 43 56 53 29  l.        # CVS)
ca90: 29 20 77 65 20 72 65 74 75 72 6e 20 61 20 76 65  ) we return a ve
caa0: 72 79 20 73 68 6f 72 74 20 61 6e 64 20 6d 75 63  ry short and muc
cab0: 68 20 6d 6f 72 65 20 6d 61 6e 61 67 65 61 62 6c  h more manageabl
cac0: 65 20 6c 69 73 74 0a 20 20 20 20 20 20 20 20 23  e list.        #
cad0: 20 6f 66 20 63 68 61 6e 67 65 73 65 74 73 2e 0a   of changesets..
cae0: 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b  ..set theset ('[
caf0: 6a 6f 69 6e 20 24 62 72 61 6e 63 68 65 73 20 7b  join $branches {
cb00: 27 2c 27 7d 5d 27 29 0a 20 20 20 20 20 20 20 20  ','}]').        
cb10: 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75  return [state ru
cb20: 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d  n [subst -nocomm
cb30: 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73  ands -nobackslas
cb40: 68 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45 43  hes {..    SELEC
cb50: 54 20 43 2e 63 69 64 0a 09 20 20 20 20 46 52 4f  T C.cid..    FRO
cb60: 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20 72 65  M   branch B, re
cb70: 76 69 73 69 6f 6e 20 52 2c 20 63 73 69 74 65 6d  vision R, csitem
cb80: 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43   CI, changeset C
cb90: 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62  ..    WHERE  B.b
cba0: 69 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20  id IN $theset   
cbb0: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f    -- Restrict to
cbc0: 20 62 72 61 6e 63 68 65 73 20 6f 66 20 69 6e 74   branches of int
cbd0: 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20  erest..    AND  
cbe0: 20 20 42 2e 66 69 72 73 74 20 3d 20 52 2e 72 69    B.first = R.ri
cbf0: 64 09 2d 2d 20 47 65 74 20 66 69 72 73 74 20 72  d.-- Get first r
cc00: 65 76 69 73 69 6f 6e 20 6f 6e 20 74 68 65 20 62  evision on the b
cc10: 72 61 6e 63 68 0a 20 20 20 20 20 20 20 20 20 20  ranch.          
cc20: 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69 64 20    AND    CI.iid 
cc30: 3d 20 52 2e 72 69 64 20 20 20 20 20 20 20 2d 2d  = R.rid       --
cc40: 20 53 65 6c 65 63 74 20 61 6c 6c 20 63 68 61 6e   Select all chan
cc50: 67 65 73 65 74 73 0a 20 20 20 20 20 20 20 20 20  gesets.         
cc60: 20 20 20 41 4e 44 20 20 20 20 43 2e 63 69 64 20     AND    C.cid 
cc70: 3d 20 43 49 2e 63 69 64 09 2d 2d 20 63 6f 6e 74  = CI.cid.-- cont
cc80: 61 69 6e 69 6e 67 20 74 68 69 73 20 72 65 76 69  aining this revi
cc90: 73 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20  sion.           
cca0: 20 41 4e 44 20 20 20 20 43 2e 74 79 70 65 20 3d   AND    C.type =
ccb0: 20 30 09 09 2d 2d 20 77 68 69 63 68 20 61 72 65   0..-- which are
ccc0: 20 72 65 76 69 73 69 6f 6e 20 63 68 61 6e 67 65   revision change
ccd0: 73 65 74 73 0a 20 20 20 20 55 4e 49 4f 4e 0a 09  sets.    UNION..
cce0: 20 20 20 20 53 45 4c 45 43 54 20 43 2e 63 69 64      SELECT C.cid
ccf0: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61  ..    FROM   bra
cd00: 6e 63 68 20 42 2c 20 70 72 65 66 65 72 65 64 70  nch B, preferedp
cd10: 61 72 65 6e 74 20 50 2c 20 62 72 61 6e 63 68 20  arent P, branch 
cd20: 42 58 2c 20 63 73 69 74 65 6d 20 43 49 2c 20 63  BX, csitem CI, c
cd30: 68 61 6e 67 65 73 65 74 20 43 0a 09 20 20 20 20  hangeset C..    
cd40: 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20  WHERE  B.bid IN 
cd50: 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52  $theset     -- R
cd60: 65 73 74 72 69 63 74 20 74 6f 20 62 72 61 6e 63  estrict to branc
cd70: 68 65 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  hes of interest.
cd80: 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 73 69  .    AND    B.si
cd90: 64 20 3d 20 50 2e 70 69 64 09 2d 2d 20 47 65 74  d = P.pid.-- Get
cda0: 20 73 75 62 6f 72 64 69 6e 61 74 65 20 62 72 61   subordinate bra
cdb0: 6e 63 68 65 73 20 76 69 61 20 74 68 65 0a 09 20  nches via the.. 
cdc0: 20 20 20 41 4e 44 20 20 20 20 42 58 2e 73 69 64     AND    BX.sid
cdd0: 20 3d 20 50 2e 73 69 64 09 2d 2d 20 70 72 65 66   = P.sid.-- pref
cde0: 65 72 65 64 20 70 61 72 65 6e 74 73 20 6f 66 20  ered parents of 
cdf0: 74 68 65 69 72 20 73 79 6d 62 6f 6c 73 0a 20 20  their symbols.  
ce00: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20            AND   
ce10: 20 43 49 2e 69 69 64 20 3d 20 42 58 2e 62 69 64   CI.iid = BX.bid
ce20: 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20        -- Select 
ce30: 61 6c 6c 20 63 68 61 6e 67 65 73 65 74 73 0a 20  all changesets. 
ce40: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20             AND  
ce50: 20 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69 64    C.cid = CI.cid
ce60: 09 2d 2d 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  .-- containing t
ce70: 68 65 20 73 75 62 6f 72 64 69 6e 61 74 65 20 62  he subordinate b
ce80: 72 61 6e 63 68 65 73 0a 20 20 20 20 20 20 20 20  ranches.        
ce90: 20 20 20 20 41 4e 44 20 20 20 20 43 2e 74 79 70      AND    C.typ
cea0: 65 20 3d 20 32 09 09 2d 2d 20 77 68 69 63 68 20  e = 2..-- which 
ceb0: 61 72 65 20 62 72 61 6e 63 68 20 63 68 61 6e 67  are branch chang
cec0: 65 73 65 74 73 0a 20 20 20 20 55 4e 49 4f 4e 0a  esets.    UNION.
ced0: 09 20 20 20 20 53 45 4c 45 43 54 20 43 2e 63 69  .    SELECT C.ci
cee0: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72  d..    FROM   br
cef0: 61 6e 63 68 20 42 2c 20 70 72 65 66 65 72 65 64  anch B, prefered
cf00: 70 61 72 65 6e 74 20 50 2c 20 74 61 67 20 54 2c  parent P, tag T,
cf10: 20 63 73 69 74 65 6d 20 43 49 2c 20 63 68 61 6e   csitem CI, chan
cf20: 67 65 73 65 74 20 43 0a 09 20 20 20 20 57 48 45  geset C..    WHE
cf30: 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68  RE  B.bid IN $th
cf40: 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74  eset     -- Rest
cf50: 72 69 63 74 20 74 6f 20 62 72 61 6e 63 68 65 73  rict to branches
cf60: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20   of interest..  
cf70: 20 20 41 4e 44 20 20 20 20 42 2e 73 69 64 20 3d    AND    B.sid =
cf80: 20 50 2e 70 69 64 09 2d 2d 20 47 65 74 20 73 75   P.pid.-- Get su
cf90: 62 6f 72 64 69 6e 61 74 65 20 74 61 67 73 20 76  bordinate tags v
cfa0: 69 61 20 74 68 65 0a 09 20 20 20 20 41 4e 44 20  ia the..    AND 
cfb0: 20 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 69 64     T.sid = P.sid
cfc0: 09 2d 2d 20 70 72 65 66 65 72 65 64 20 70 61 72  .-- prefered par
cfd0: 65 6e 74 73 20 6f 66 20 74 68 65 69 72 20 73 79  ents of their sy
cfe0: 6d 62 6f 6c 73 0a 20 20 20 20 20 20 20 20 20 20  mbols.          
cff0: 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69 64 20    AND    CI.iid 
d000: 3d 20 54 2e 74 69 64 20 20 20 20 20 20 20 2d 2d  = T.tid       --
d010: 20 53 65 6c 65 63 74 20 61 6c 6c 20 63 68 61 6e   Select all chan
d020: 67 65 73 65 74 73 0a 20 20 20 20 20 20 20 20 20  gesets.         
d030: 20 20 20 41 4e 44 20 20 20 20 43 2e 63 69 64 20     AND    C.cid 
d040: 3d 20 43 49 2e 63 69 64 09 2d 2d 20 63 6f 6e 74  = CI.cid.-- cont
d050: 61 69 6e 69 6e 67 20 74 68 65 20 73 75 62 6f 72  aining the subor
d060: 64 69 6e 61 74 65 20 74 61 67 73 0a 20 20 20 20  dinate tags.    
d070: 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43          AND    C
d080: 2e 74 79 70 65 20 3d 20 31 09 09 2d 2d 20 77 68  .type = 1..-- wh
d090: 69 63 68 20 61 72 65 20 74 61 67 20 63 68 61 6e  ich are tag chan
d0a0: 67 65 73 65 74 73 0a 09 7d 5d 5d 0a 09 72 65 74  gesets..}]]..ret
d0b0: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  urn.    }..    #
d0c0: 20 72 65 73 75 6c 74 20 3d 20 73 79 6d 62 6f 6c   result = symbol
d0d0: 20 6e 61 6d 65 0a 20 20 20 20 74 79 70 65 6d 65   name.    typeme
d0e0: 74 68 6f 64 20 63 73 5f 6c 6f 64 20 7b 62 72 61  thod cs_lod {bra
d0f0: 6e 63 68 65 73 7d 20 7b 0a 09 23 20 44 65 74 65  nches} {..# Dete
d100: 72 6d 69 6e 65 73 20 74 68 65 20 6e 61 6d 65 20  rmines the name 
d110: 6f 66 20 74 68 65 20 73 79 6d 62 6f 6c 20 77 68  of the symbol wh
d120: 69 63 68 20 69 73 20 74 68 65 20 6c 69 6e 65 20  ich is the line 
d130: 6f 66 0a 09 23 20 64 65 76 65 6c 6f 70 6d 65 6e  of..# developmen
d140: 74 20 66 6f 72 20 74 68 65 20 62 72 61 6e 63 68  t for the branch
d150: 65 73 20 69 6e 20 61 20 63 68 61 6e 67 65 73 65  es in a changese
d160: 74 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20  t....set theset 
d170: 28 27 5b 6a 6f 69 6e 20 24 62 72 61 6e 63 68 65  ('[join $branche
d180: 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75  s {','}]')..retu
d190: 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73  rn [state run [s
d1a0: 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73  ubst -nocommands
d1b0: 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20   -nobackslashes 
d1c0: 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 0a 09 20  {..    SELECT.. 
d1d0: 20 20 20 44 49 53 54 49 4e 43 54 20 4c 2e 6e 61     DISTINCT L.na
d1e0: 6d 65 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62  me..    FROM   b
d1f0: 72 61 6e 63 68 20 42 2c 20 73 79 6d 62 6f 6c 20  ranch B, symbol 
d200: 4c 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e  L..    WHERE  B.
d210: 62 69 64 20 69 6e 20 24 74 68 65 73 65 74 20 20  bid in $theset  
d220: 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63        -- Restric
d230: 74 20 74 6f 20 62 72 61 6e 63 68 65 73 20 6f 66  t to branches of
d240: 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41   interest..    A
d250: 4e 44 20 20 20 20 4c 2e 73 69 64 20 3d 20 42 2e  ND    L.sid = B.
d260: 6c 6f 64 20 20 20 20 20 20 20 20 20 20 20 2d 2d  lod           --
d270: 20 47 65 74 20 6c 6f 64 20 73 79 6d 62 6f 6c 20   Get lod symbol 
d280: 6f 66 20 62 72 61 6e 63 68 0a 09 7d 5d 5d 0a 20  of branch..}]]. 
d290: 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65     }..    typeme
d2a0: 74 68 6f 64 20 6c 69 6d 69 74 73 20 7b 62 72 61  thod limits {bra
d2b0: 6e 63 68 65 73 7d 20 7b 0a 09 23 20 4e 6f 74 65  nches} {..# Note
d2c0: 73 2e 20 54 68 69 73 20 6d 65 74 68 6f 64 20 65  s. This method e
d2d0: 78 69 73 74 73 20 6f 6e 6c 79 20 66 6f 72 20 62  xists only for b
d2e0: 72 61 6e 63 68 65 73 2e 20 49 74 20 69 73 20 6e  ranches. It is n
d2f0: 65 65 64 65 64 20 74 6f 0a 09 23 20 67 65 74 20  eeded to..# get 
d300: 64 65 74 61 69 6c 65 64 20 69 6e 66 6f 72 6d 61  detailed informa
d310: 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 62 61 63  tion about a bac
d320: 6b 77 61 72 64 20 62 72 61 6e 63 68 2e 20 49 74  kward branch. It
d330: 20 64 6f 65 73 0a 09 23 20 6e 6f 74 20 61 70 70   does..# not app
d340: 6c 79 20 74 6f 20 74 61 67 73 2c 20 6e 6f 72 20  ly to tags, nor 
d350: 72 65 76 69 73 69 6f 6e 73 2e 20 54 68 65 20 71  revisions. The q
d360: 75 65 72 69 65 73 20 63 61 6e 20 61 6c 73 6f 0a  ueries can also.
d370: 09 23 20 72 65 73 74 72 69 63 74 20 74 68 65 6d  .# restrict them
d380: 73 65 6c 76 65 73 20 74 6f 20 74 68 65 20 72 65  selves to the re
d390: 76 69 73 69 6f 6e 20 73 75 63 65 73 73 6f 72 73  vision sucessors
d3a0: 2f 70 72 65 64 65 63 65 73 73 6f 72 73 0a 09 23  /predecessors..#
d3b0: 20 6f 66 20 62 72 61 6e 63 68 65 73 2c 20 61 73   of branches, as
d3c0: 20 6f 6e 6c 79 20 74 68 65 79 20 68 61 76 65 20   only they have 
d3d0: 6f 72 64 65 72 69 6e 67 20 64 61 74 61 20 61 6e  ordering data an
d3e0: 64 20 74 68 75 73 20 63 61 6e 0a 09 23 20 63 61  d thus can..# ca
d3f0: 75 73 65 20 74 68 65 20 62 61 63 6b 77 61 72 64  use the backward
d400: 6e 65 73 73 2e 0a 0a 09 73 65 74 20 74 68 65 73  ness....set thes
d410: 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61 6e  et ('[join $bran
d420: 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09  ches {','}]')...
d430: 73 65 74 20 6d 61 78 70 20 5b 73 74 61 74 65 20  set maxp [state 
d440: 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f  run [subst -noco
d450: 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c  mmands -nobacksl
d460: 61 73 68 65 73 20 7b 0a 09 20 20 20 20 2d 2d 20  ashes {..    -- 
d470: 6d 61 78 69 6d 61 6c 20 70 72 65 64 65 63 65 73  maximal predeces
d480: 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 70 65 72  sor position per
d490: 20 62 72 61 6e 63 68 0a 09 20 20 20 20 53 45 4c   branch..    SEL
d4a0: 45 43 54 20 42 2e 62 69 64 2c 20 4d 41 58 20 28  ECT B.bid, MAX (
d4b0: 43 4f 2e 70 6f 73 29 0a 09 20 20 20 20 46 52 4f  CO.pos)..    FRO
d4c0: 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20 72 65  M   branch B, re
d4d0: 76 69 73 69 6f 6e 20 52 2c 20 63 73 69 74 65 6d  vision R, csitem
d4e0: 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43   CI, changeset C
d4f0: 2c 20 63 73 6f 72 64 65 72 20 43 4f 0a 09 20 20  , csorder CO..  
d500: 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49    WHERE  B.bid I
d510: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d  N $theset     --
d520: 20 52 65 73 74 72 69 63 74 20 74 6f 20 62 72 61   Restrict to bra
d530: 6e 63 68 65 73 20 6f 66 20 69 6e 74 65 72 65 73  nches of interes
d540: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e  t..    AND    B.
d550: 72 6f 6f 74 20 3d 20 52 2e 72 69 64 20 20 20 20  root = R.rid    
d560: 20 20 20 2d 2d 20 47 65 74 20 62 72 61 6e 63 68     -- Get branch
d570: 20 72 6f 6f 74 20 72 65 76 69 73 69 6f 6e 73 0a   root revisions.
d580: 09 20 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69  .    AND    CI.i
d590: 69 64 20 3d 20 52 2e 72 69 64 20 20 20 20 20 20  id = R.rid      
d5a0: 20 2d 2d 20 47 65 74 20 63 68 61 6e 67 65 73 65   -- Get changese
d5b0: 74 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  ts containing th
d5c0: 65 0a 09 20 20 20 20 41 4e 44 20 20 20 20 43 2e  e..    AND    C.
d5d0: 63 69 64 20 3d 20 43 49 2e 63 69 64 20 20 20 20  cid = CI.cid    
d5e0: 20 20 20 2d 2d 20 72 6f 6f 74 20 72 65 76 69 73     -- root revis
d5f0: 69 6f 6e 73 2c 20 77 68 69 63 68 20 61 72 65 0a  ions, which are.
d600: 09 20 20 20 20 41 4e 44 20 20 20 20 43 2e 74 79  .    AND    C.ty
d610: 70 65 20 3d 20 30 20 20 20 20 20 20 20 20 20 20  pe = 0          
d620: 20 2d 2d 20 72 65 76 69 73 69 6f 6e 20 63 68 61   -- revision cha
d630: 6e 67 65 73 65 74 73 0a 09 20 20 20 20 41 4e 44  ngesets..    AND
d640: 20 20 20 20 43 4f 2e 63 69 64 20 3d 20 43 2e 63      CO.cid = C.c
d650: 69 64 20 20 20 20 20 20 20 2d 2d 20 47 65 74 20  id       -- Get 
d660: 74 68 65 69 72 20 74 6f 70 6f 6c 6f 67 69 63 61  their topologica
d670: 6c 20 6f 72 64 65 72 69 6e 67 0a 09 20 20 20 20  l ordering..    
d680: 47 52 4f 55 50 20 42 59 20 42 2e 62 69 64 0a 09  GROUP BY B.bid..
d690: 7d 5d 5d 0a 0a 09 73 65 74 20 6d 69 6e 73 20 5b  }]]...set mins [
d6a0: 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73 74  state run [subst
d6b0: 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f   -nocommands -no
d6c0: 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20  backslashes {.. 
d6d0: 20 20 20 2d 2d 20 6d 69 6e 69 6d 61 6c 20 73 75     -- minimal su
d6e0: 63 63 65 73 73 6f 72 20 70 6f 73 69 74 69 6f 6e  ccessor position
d6f0: 20 70 65 72 20 62 72 61 6e 63 68 0a 09 20 20 20   per branch..   
d700: 20 53 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 4d   SELECT B.bid, M
d710: 49 4e 20 28 43 4f 2e 70 6f 73 29 0a 09 20 20 20  IN (CO.pos)..   
d720: 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42   FROM   branch B
d730: 2c 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 63 73  , revision R, cs
d740: 69 74 65 6d 20 43 49 2c 20 63 68 61 6e 67 65 73  item CI, changes
d750: 65 74 20 43 2c 20 63 73 6f 72 64 65 72 20 43 4f  et C, csorder CO
d760: 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62  ..    WHERE  B.b
d770: 69 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20  id IN $theset   
d780: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f    -- Restrict to
d790: 20 62 72 61 6e 63 68 65 73 20 6f 66 20 69 6e 74   branches of int
d7a0: 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20  erest..    AND  
d7b0: 20 20 42 2e 66 69 72 73 74 20 3d 20 52 2e 72 69    B.first = R.ri
d7c0: 64 20 20 20 20 20 20 2d 2d 20 47 65 74 20 74 68  d      -- Get th
d7d0: 65 20 66 69 72 73 74 20 72 65 76 69 73 69 6f 6e  e first revision
d7e0: 73 20 6f 6e 20 74 68 65 20 62 72 61 6e 63 68 65  s on the branche
d7f0: 73 0a 09 20 20 20 20 41 4e 44 20 20 20 20 43 49  s..    AND    CI
d800: 2e 69 69 64 20 3d 20 52 2e 72 69 64 20 20 20 20  .iid = R.rid    
d810: 20 20 20 2d 2d 20 47 65 74 20 63 68 61 6e 67 65     -- Get change
d820: 73 65 74 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20  sets containing 
d830: 74 68 65 0a 09 20 20 20 20 41 4e 44 20 20 20 20  the..    AND    
d840: 43 2e 63 69 64 20 3d 20 43 49 2e 63 69 64 09 2d  C.cid = CI.cid.-
d850: 2d 20 66 69 72 73 74 20 72 65 76 69 73 69 6f 6e  - first revision
d860: 73 2c 20 77 68 69 63 68 20 61 72 65 0a 09 20 20  s, which are..  
d870: 20 20 41 4e 44 20 20 20 20 43 2e 74 79 70 65 20    AND    C.type 
d880: 3d 20 30 09 09 2d 2d 20 72 65 76 69 73 69 6f 6e  = 0..-- revision
d890: 20 63 68 61 6e 67 65 73 65 74 73 0a 09 20 20 20   changesets..   
d8a0: 20 41 4e 44 20 20 20 20 43 4f 2e 63 69 64 20 3d   AND    CO.cid =
d8b0: 20 43 2e 63 69 64 09 2d 2d 20 47 65 74 20 74 68   C.cid.-- Get th
d8c0: 65 69 72 20 74 6f 70 6f 6c 6f 67 69 63 61 6c 20  eir topological 
d8d0: 6f 72 64 65 72 69 6e 67 0a 09 20 20 20 20 47 52  ordering..    GR
d8e0: 4f 55 50 20 42 59 20 42 2e 62 69 64 0a 09 7d 5d  OUP BY B.bid..}]
d8f0: 5d 0a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ]..        retur
d900: 6e 20 5b 6c 69 73 74 20 24 6d 61 78 70 20 24 6d  n [list $maxp $m
d910: 69 6e 73 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ins].    }..    
d920: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
d930: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
d940: 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 43  #######.    ## C
d950: 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a 20 20  onfiguration..  
d960: 20 20 70 72 61 67 6d 61 20 2d 68 61 73 69 6e 73    pragma -hasins
d970: 74 61 6e 63 65 73 20 20 20 6e 6f 20 3b 20 23 20  tances   no ; # 
d980: 73 69 6e 67 6c 65 74 6f 6e 0a 20 20 20 20 70 72  singleton.    pr
d990: 61 67 6d 61 20 2d 68 61 73 74 79 70 65 69 6e 66  agma -hastypeinf
d9a0: 6f 20 20 20 20 6e 6f 20 3b 20 23 20 6e 6f 20 69  o    no ; # no i
d9b0: 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20 20 20  ntrospection.   
d9c0: 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65   pragma -hastype
d9d0: 64 65 73 74 72 6f 79 20 6e 6f 20 3b 20 23 20 69  destroy no ; # i
d9e0: 6d 6d 6f 72 74 61 6c 0a 7d 0a 0a 23 20 23 20 23  mmortal.}..# # #
d9f0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
da00: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
da10: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
da20: 23 23 23 23 23 23 23 23 0a 23 23 0a 0a 6e 61 6d  ########.##..nam
da30: 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 76 63  espace eval ::vc
da40: 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74  ::fossil::import
da50: 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 20 7b  ::cvs::project {
da60: 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 65  .    namespace e
da70: 78 70 6f 72 74 20 72 65 76 0a 20 20 20 20 6e 61  xport rev.    na
da80: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 72 65 76  mespace eval rev
da90: 20 7b 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d   {..namespace im
daa0: 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69  port ::vc::fossi
dab0: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a  l::import::cvs::
dac0: 73 74 61 74 65 0a 09 6e 61 6d 65 73 70 61 63 65  state..namespace
dad0: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f   import ::vc::fo
dae0: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
daf0: 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 6e 61  s::integrity..na
db00: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
db10: 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69 73 63  :vc::tools::misc
db20: 3a 3a 2a 0a 09 6e 61 6d 65 73 70 61 63 65 20 69  ::*..namespace i
db30: 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c  mport ::vc::tool
db40: 73 3a 3a 74 72 6f 75 62 6c 65 0a 09 6e 61 6d 65  s::trouble..name
db50: 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76  space import ::v
db60: 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 6c  c::tools::log..l
db70: 6f 67 20 72 65 67 69 73 74 65 72 20 63 73 65 74  og register cset
db80: 73 0a 0a 09 23 20 53 65 74 20 75 70 20 74 68 65  s...# Set up the
db90: 20 68 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f   helper singleto
dba0: 6e 73 0a 09 6e 61 6d 65 73 70 61 63 65 20 65 76  ns..namespace ev
dbb0: 61 6c 20 72 65 76 20 7b 0a 09 20 20 20 20 6e 61  al rev {..    na
dbc0: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
dbd0: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70  :vc::fossil::imp
dbe0: 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a  ort::cvs::state.
dbf0: 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69  .    namespace i
dc00: 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73  mport ::vc::foss
dc10: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a  il::import::cvs:
dc20: 3a 69 6e 74 65 67 72 69 74 79 0a 09 20 20 20 20  :integrity..    
dc30: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74  namespace import
dc40: 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f   ::vc::tools::lo
dc50: 67 0a 09 7d 0a 09 6e 61 6d 65 73 70 61 63 65 20  g..}..namespace 
dc60: 65 76 61 6c 20 73 79 6d 3a 3a 74 61 67 20 7b 0a  eval sym::tag {.
dc70: 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69  .    namespace i
dc80: 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73  mport ::vc::foss
dc90: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a  il::import::cvs:
dca0: 3a 73 74 61 74 65 0a 09 20 20 20 20 6e 61 6d 65  :state..    name
dcb0: 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76  space import ::v
dcc0: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72  c::fossil::impor
dcd0: 74 3a 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69 74  t::cvs::integrit
dce0: 79 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65  y..    namespace
dcf0: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f   import ::vc::to
dd00: 6f 6c 73 3a 3a 6c 6f 67 0a 09 7d 0a 09 6e 61 6d  ols::log..}..nam
dd10: 65 73 70 61 63 65 20 65 76 61 6c 20 73 79 6d 3a  espace eval sym:
dd20: 3a 62 72 61 6e 63 68 20 7b 0a 09 20 20 20 20 6e  :branch {..    n
dd30: 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20  amespace import 
dd40: 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d  ::vc::fossil::im
dd50: 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65  port::cvs::state
dd60: 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20  ..    namespace 
dd70: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73  import ::vc::fos
dd80: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73  sil::import::cvs
dd90: 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 20 20 20  ::integrity..   
dda0: 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72   namespace impor
ddb0: 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c  t ::vc::tools::l
ddc0: 6f 67 0a 09 7d 0a 20 20 20 20 7d 0a 7d 0a 0a 23  og..}.    }.}..#
ddd0: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20   # ## ### ##### 
dde0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
ddf0: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
de00: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20  ############.## 
de10: 52 65 61 64 79 0a 0a 70 61 63 6b 61 67 65 20 70  Ready..package p
de20: 72 6f 76 69 64 65 20 76 63 3a 3a 66 6f 73 73 69  rovide vc::fossi
de30: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a  l::import::cvs::
de40: 70 72 6f 6a 65 63 74 3a 3a 72 65 76 20 31 2e 30  project::rev 1.0
de50: 0a 72 65 74 75 72 6e 0a                          .return.