Hex Artifact Content
Not logged in

Artifact cc210d25784b5fbf8841cb2d9cc811f3d314d5d2:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [f46458d5bd] - Reworked the basic structure of pass InitCSets to keep memory consumption down. Now incremental creates, breaks, saves, and releases changesets, instead of piling them on before saving all at the end. Memory tracking confirms that this changes the accumulating mountain into a near-constant usage, with the expected spikes from the breaking. by aku on 2008-02-17 02:06:19.

0000: 23 23 20 2d 2a 2d 20 74 63 6c 20 2d 2a 2d 0a 23  ## -*- tcl -*-.#
0010: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20   # ## ### ##### 
0020: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
0030: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
0040: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20  ############.## 
0050: 43 6f 70 79 72 69 67 68 74 20 28 63 29 20 32 30  Copyright (c) 20
0060: 30 37 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 30 0a 09 7d 20 3b 20 23 20 4e  eturn 0..} ; # N
1840: 6f 74 68 69 6e 67 20 74 6f 20 62 72 65 61 6b 2e  othing to break.
1850: 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 35 20 63  ...log write 5 c
1860: 73 65 74 73 20 2e 2e 2e 5b 24 73 65 6c 66 20 73  sets ...[$self s
1870: 74 72 5d 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  tr].............
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 0a 09 76 63 3a 3a  ............vc::
18b0: 74 6f 6f 6c 73 3a 3a 6d 65 6d 3a 3a 6d 61 72 6b  tools::mem::mark
18c0: 0a 0a 09 23 20 57 65 20 68 61 76 65 20 69 6e 74  ...# We have int
18d0: 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69  ernal dependenci
18e0: 65 73 20 74 6f 20 62 72 65 61 6b 2e 20 57 65 20  es to break. We 
18f0: 6e 6f 77 20 69 74 65 72 61 74 65 20 6f 76 65 72  now iterate over
1900: 0a 09 23 20 61 6c 6c 20 70 6f 73 69 74 69 6f 6e  ..# all position
1910: 73 20 69 6e 20 74 68 65 20 6c 69 73 74 20 28 77  s in the list (w
1920: 68 69 63 68 20 69 73 20 63 68 72 6f 6e 6f 6c 6f  hich is chronolo
1930: 67 69 63 61 6c 2c 20 61 74 20 6c 65 61 73 74 0a  gical, at least.
1940: 09 23 20 61 73 20 66 61 72 20 61 73 20 74 68 65  .# as far as the
1950: 20 74 69 6d 65 73 74 61 6d 70 73 20 61 72 65 20   timestamps are 
1960: 63 6f 72 72 65 63 74 20 61 6e 64 20 75 6e 69 71  correct and uniq
1970: 75 65 29 20 61 6e 64 0a 09 23 20 64 65 74 65 72  ue) and..# deter
1980: 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 70 6f  mine the best po
1990: 73 69 74 69 6f 6e 20 66 6f 72 20 74 68 65 20 62  sition for the b
19a0: 72 65 61 6b 2c 20 62 79 20 74 72 79 69 6e 67 20  reak, by trying 
19b0: 74 6f 0a 09 23 20 62 72 65 61 6b 20 61 73 20 6d  to..# break as m
19c0: 61 6e 79 20 64 65 70 65 6e 64 65 6e 63 69 65 73  any dependencies
19d0: 20 61 73 20 70 6f 73 73 69 62 6c 65 20 69 6e 20   as possible in 
19e0: 6f 6e 65 20 67 6f 2e 20 57 68 65 6e 20 61 0a 09  one go. When a..
19f0: 23 20 62 72 65 61 6b 20 77 61 73 20 66 6f 75 6e  # break was foun
1a00: 64 20 74 68 69 73 20 69 73 20 72 65 64 6f 6e 65  d this is redone
1a10: 20 66 6f 72 20 74 68 65 20 66 72 61 67 6d 65 6e   for the fragmen
1a20: 74 73 20 63 6f 6d 69 6e 67 20 61 6e 64 0a 09 23  ts coming and..#
1a30: 20 61 66 74 65 72 2c 20 61 66 74 65 72 20 75 70   after, after up
1a40: 64 69 6e 67 20 74 68 65 20 63 72 6f 73 73 69 6e  ding the crossin
1a50: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 0a  g information...
1a60: 09 23 20 44 61 74 61 20 73 74 72 75 63 74 75 72  .# Data structur
1a70: 65 73 3a 0a 09 23 20 4d 61 70 3a 20 20 50 4f 53  es:..# Map:  POS
1a80: 20 20 20 72 65 76 69 73 69 6f 6e 20 69 64 20 20     revision id  
1a90: 20 20 20 20 2d 3e 20 70 6f 73 69 74 69 6f 6e 20      -> position 
1aa0: 69 6e 20 6c 69 73 74 2e 0a 09 23 20 20 20 20 20  in list...#     
1ab0: 20 20 43 52 4f 53 53 20 70 6f 73 69 74 69 6f 6e    CROSS position
1ac0: 20 69 6e 20 6c 69 73 74 20 2d 3e 20 6e 75 6d 62   in list -> numb
1ad0: 65 72 20 6f 66 20 64 65 70 65 6e 64 65 6e 63 69  er of dependenci
1ae0: 65 73 20 63 72 6f 73 73 69 6e 67 20 69 74 0a 09  es crossing it..
1af0: 23 20 20 20 20 20 20 20 44 45 50 43 20 20 64 65  #       DEPC  de
1b00: 70 65 6e 64 65 6e 63 79 20 20 20 20 20 20 20 2d  pendency       -
1b10: 3e 20 70 6f 73 69 74 69 6f 6e 73 20 69 74 20 63  > positions it c
1b20: 72 6f 73 73 65 73 0a 09 23 20 4c 69 73 74 3a 20  rosses..# List: 
1b30: 52 41 4e 47 45 20 4f 66 20 74 68 65 20 70 6f 73  RANGE Of the pos
1b40: 69 74 69 6f 6e 73 20 69 74 73 65 6c 66 2e 0a 09  itions itself...
1b50: 23 20 41 20 64 65 70 65 6e 64 65 6e 63 79 20 69  # A dependency i
1b60: 73 20 61 20 73 69 6e 67 6c 65 2d 65 6c 65 6d 65  s a single-eleme
1b70: 6e 74 20 6d 61 70 20 70 61 72 65 6e 74 20 2d 3e  nt map parent ->
1b80: 20 63 68 69 6c 64 0a 0a 09 49 6e 69 74 69 61 6c   child...Initial
1b90: 69 7a 65 42 72 65 61 6b 53 74 61 74 65 20 24 6d  izeBreakState $m
1ba0: 79 69 74 65 6d 73 0a 0a 09 73 65 74 20 66 72 61  yitems...set fra
1bb0: 67 6d 65 6e 74 73 20 7b 7d 0a 09 73 65 74 20 6e  gments {}..set n
1bc0: 65 77 20 20 20 20 20 20 20 5b 6c 69 73 74 20 24  ew       [list $
1bd0: 72 61 6e 67 65 5d 0a 09 61 72 72 61 79 20 73 65  range]..array se
1be0: 74 20 62 72 65 61 6b 73 20 7b 7d 0a 0a 09 23 20  t breaks {}...# 
1bf0: 49 6e 73 74 65 61 64 20 6f 66 20 6f 6e 65 20 6c  Instead of one l
1c00: 69 73 74 20 68 6f 6c 64 69 6e 67 20 62 6f 74 68  ist holding both
1c10: 20 70 72 6f 63 65 73 73 65 64 20 61 6e 64 20 70   processed and p
1c20: 65 6e 64 69 6e 67 0a 09 23 20 66 72 61 67 6d 65  ending..# fragme
1c30: 6e 74 73 20 77 65 20 75 73 65 20 74 77 6f 2c 20  nts we use two, 
1c40: 6f 6e 65 20 66 6f 72 20 74 68 65 20 66 72 61 6d  one for the fram
1c50: 65 6e 74 73 20 74 6f 20 70 72 6f 63 65 73 73 2c  ents to process,
1c60: 20 6f 6e 65 0a 09 23 20 74 6f 20 68 6f 6c 64 20   one..# to hold 
1c70: 74 68 65 20 6e 65 77 20 66 72 61 67 6d 65 6e 74  the new fragment
1c80: 73 2c 20 61 6e 64 20 74 68 65 20 6c 61 74 74 65  s, and the latte
1c90: 72 20 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74  r is copied to t
1ca0: 68 65 0a 09 23 20 66 6f 72 6d 65 72 20 77 68 65  he..# former whe
1cb0: 6e 20 74 68 65 79 20 72 75 6e 20 6f 75 74 2e 20  n they run out. 
1cc0: 54 68 69 73 20 6b 65 65 70 73 20 74 68 65 20 6c  This keeps the l
1cd0: 69 73 74 20 6f 66 20 70 65 6e 64 69 6e 67 0a 09  ist of pending..
1ce0: 23 20 66 72 61 67 6d 65 6e 74 73 20 73 68 6f 72  # fragments shor
1cf0: 74 20 77 69 74 68 6f 75 74 20 73 61 63 72 69 66  t without sacrif
1d00: 69 63 69 6e 67 20 73 70 65 65 64 20 62 79 20 73  icing speed by s
1d10: 68 69 66 74 69 6e 67 20 73 74 75 66 66 0a 09 23  hifting stuff..#
1d20: 20 64 6f 77 6e 2e 20 57 65 20 65 73 70 65 63 69   down. We especi
1d30: 61 6c 6c 79 20 64 72 6f 70 20 74 68 65 20 6d 65  ally drop the me
1d40: 6d 6f 72 79 20 6f 66 20 66 72 61 67 6d 65 6e 74  mory of fragment
1d50: 73 20 62 72 6f 6b 65 6e 0a 09 23 20 64 75 72 69  s broken..# duri
1d60: 6e 67 20 70 72 6f 63 65 73 73 69 6e 67 20 61 66  ng processing af
1d70: 74 65 72 20 61 20 73 68 6f 72 74 20 74 69 6d 65  ter a short time
1d80: 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74  , instead of let
1d90: 74 69 6e 67 20 69 74 0a 09 23 20 63 6f 6e 73 75  ting it..# consu
1da0: 6d 65 20 6d 65 6d 6f 72 79 2e 0a 0a 09 77 68 69  me memory....whi
1db0: 6c 65 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6e 65  le {[llength $ne
1dc0: 77 5d 7d 20 7b 0a 0a 09 20 20 20 20 73 65 74 20  w]} {...    set 
1dd0: 70 65 6e 64 69 6e 67 20 24 6e 65 77 0a 09 20 20  pending $new..  
1de0: 20 20 73 65 74 20 6e 65 77 20 20 20 20 20 7b 7d    set new     {}
1df0: 0a 09 20 20 20 20 73 65 74 20 61 74 20 20 20 20  ..    set at    
1e00: 20 20 30 0a 0a 09 20 20 20 20 77 68 69 6c 65 20    0...    while 
1e10: 7b 24 61 74 20 3c 20 5b 6c 6c 65 6e 67 74 68 20  {$at < [llength 
1e20: 24 70 65 6e 64 69 6e 67 5d 7d 20 7b 0a 09 09 73  $pending]} {...s
1e30: 65 74 20 63 75 72 72 65 6e 74 20 5b 6c 69 6e 64  et current [lind
1e40: 65 78 20 24 70 65 6e 64 69 6e 67 20 24 61 74 5d  ex $pending $at]
1e50: 0a 0a 09 09 6c 6f 67 20 77 72 69 74 65 20 36 20  ....log write 6 
1e60: 63 73 65 74 73 20 7b 2e 20 2e 20 2e 2e 20 2e 2e  csets {. . .. ..
1e70: 2e 20 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e  . ..... ........
1e80: 20 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 7d 0a   .............}.
1e90: 09 09 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73  ..log write 6 cs
1ea0: 65 74 73 20 7b 53 63 68 65 64 75 6c 65 64 20 20  ets {Scheduled  
1eb0: 20 5b 6a 6f 69 6e 20 5b 50 52 73 20 5b 6c 72 61   [join [PRs [lra
1ec0: 6e 67 65 20 24 70 65 6e 64 69 6e 67 20 24 61 74  nge $pending $at
1ed0: 20 65 6e 64 5d 5d 20 7b 20 7d 5d 7d 0a 09 09 6c   end]] { }]}...l
1ee0: 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73  og write 6 csets
1ef0: 20 7b 43 6f 6e 73 69 64 65 72 69 6e 67 20 5b 50   {Considering [P
1f00: 52 20 24 63 75 72 72 65 6e 74 5d 20 5c 5b 24 61  R $current] \[$a
1f10: 74 2f 5b 6c 6c 65 6e 67 74 68 20 24 70 65 6e 64  t/[llength $pend
1f20: 69 6e 67 5d 5c 5d 7d 0a 0a 09 09 73 65 74 20 62  ing]\]}....set b
1f30: 65 73 74 20 5b 46 69 6e 64 42 65 73 74 42 72 65  est [FindBestBre
1f40: 61 6b 20 24 63 75 72 72 65 6e 74 5d 0a 0a 09 09  ak $current]....
1f50: 69 66 20 7b 24 62 65 73 74 20 3c 20 30 7d 20 7b  if {$best < 0} {
1f60: 0a 09 09 20 20 20 20 23 20 54 68 65 20 69 6e 73  ...    # The ins
1f70: 70 65 63 74 65 64 20 72 61 6e 67 65 20 68 61 73  pected range has
1f80: 20 6e 6f 20 69 6e 74 65 72 6e 61 6c 0a 09 09 20   no internal... 
1f90: 20 20 20 23 20 64 65 70 65 6e 64 65 6e 63 69 65     # dependencie
1fa0: 73 2e 20 54 68 69 73 20 69 73 20 61 20 63 6f 6d  s. This is a com
1fb0: 70 6c 65 74 65 20 66 72 61 67 6d 65 6e 74 2e 0a  plete fragment..
1fc0: 09 09 20 20 20 20 6c 61 70 70 65 6e 64 20 66 72  ..    lappend fr
1fd0: 61 67 6d 65 6e 74 73 20 24 63 75 72 72 65 6e 74  agments $current
1fe0: 0a 0a 09 09 20 20 20 20 6c 6f 67 20 77 72 69 74  ....    log writ
1ff0: 65 20 36 20 63 73 65 74 73 20 22 4e 6f 20 62 72  e 6 csets "No br
2000: 65 61 6b 73 2c 20 66 69 6e 61 6c 22 0a 09 09 7d  eaks, final"...}
2010: 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 23 20   else {...    # 
2020: 53 70 6c 69 74 20 74 68 65 20 72 61 6e 67 65 20  Split the range 
2030: 61 6e 64 20 73 63 68 65 64 75 6c 65 20 74 68 65  and schedule the
2040: 20 72 65 73 75 6c 74 69 6e 67 0a 09 09 20 20 20   resulting...   
2050: 20 23 20 66 72 61 67 6d 65 6e 74 73 20 66 6f 72   # fragments for
2060: 20 66 75 72 74 68 65 72 20 69 6e 73 70 65 63 74   further inspect
2070: 69 6f 6e 2e 20 52 65 6d 65 6d 62 65 72 20 74 68  ion. Remember th
2080: 65 0a 09 09 20 20 20 20 23 20 6e 75 6d 62 65 72  e...    # number
2090: 20 6f 66 20 64 65 70 65 6e 64 65 6e 63 69 65 73   of dependencies
20a0: 20 63 75 74 20 62 65 66 6f 72 65 20 77 65 20 72   cut before we r
20b0: 65 6d 6f 76 65 20 74 68 65 6d 0a 09 09 20 20 20  emove them...   
20c0: 20 23 20 66 72 6f 6d 20 63 6f 6e 73 69 64 65 72   # from consider
20d0: 61 74 69 6f 6e 2c 20 66 6f 72 20 64 6f 63 75 6d  ation, for docum
20e0: 65 6e 74 61 74 69 6f 6e 20 6c 61 74 65 72 2e 0a  entation later..
20f0: 0a 09 09 20 20 20 20 73 65 74 20 62 72 65 61 6b  ...    set break
2100: 73 28 24 62 65 73 74 29 20 24 63 72 6f 73 73 28  s($best) $cross(
2110: 24 62 65 73 74 29 0a 0a 09 09 20 20 20 20 6c 6f  $best)....    lo
2120: 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20  g write 6 csets 
2130: 22 42 65 73 74 20 62 72 65 61 6b 20 40 20 24 62  "Best break @ $b
2140: 65 73 74 2c 20 63 75 74 74 69 6e 67 20 5b 6e 73  est, cutting [ns
2150: 70 20 24 63 72 6f 73 73 28 24 62 65 73 74 29 20  p $cross($best) 
2160: 64 65 70 65 6e 64 65 6e 63 79 20 64 65 70 65 6e  dependency depen
2170: 64 65 6e 63 69 65 73 5d 22 0a 0a 09 09 20 20 20  dencies]"....   
2180: 20 23 20 4e 6f 74 65 3a 20 54 68 65 20 76 61 6c   # Note: The val
2190: 75 65 20 6f 66 20 62 65 73 74 20 69 73 20 61 6e  ue of best is an
21a0: 20 61 62 6f 6c 75 74 65 20 6c 6f 63 61 74 69 6f   abolute locatio
21b0: 6e 0a 09 09 20 20 20 20 23 20 69 6e 20 6d 79 69  n...    # in myi
21c0: 74 65 6d 73 2e 20 55 73 65 20 74 68 65 20 73 74  tems. Use the st
21d0: 61 72 74 20 6f 66 20 63 75 72 72 65 6e 74 20 74  art of current t
21e0: 6f 20 6d 61 6b 65 20 69 74 0a 09 09 20 20 20 20  o make it...    
21f0: 23 20 61 6e 20 69 6e 64 65 78 20 61 62 73 6f 6c  # an index absol
2200: 75 74 65 20 74 6f 20 63 75 72 72 65 6e 74 2e 0a  ute to current..
2210: 0a 09 09 20 20 20 20 73 65 74 20 62 72 65 6c 20  ...    set brel 
2220: 5b 65 78 70 72 20 7b 24 62 65 73 74 20 2d 20 5b  [expr {$best - [
2230: 6c 69 6e 64 65 78 20 24 63 75 72 72 65 6e 74 20  lindex $current 
2240: 30 5d 7d 5d 0a 09 09 20 20 20 20 73 65 74 20 62  0]}]...    set b
2250: 6e 65 78 74 20 24 62 72 65 6c 20 3b 20 69 6e 63  next $brel ; inc
2260: 72 20 62 6e 65 78 74 0a 09 09 20 20 20 20 73 65  r bnext...    se
2270: 74 20 66 72 61 67 62 65 66 6f 72 65 20 5b 6c 72  t fragbefore [lr
2280: 61 6e 67 65 20 24 63 75 72 72 65 6e 74 20 30 20  ange $current 0 
2290: 24 62 72 65 6c 5d 0a 09 09 20 20 20 20 73 65 74  $brel]...    set
22a0: 20 66 72 61 67 61 66 74 65 72 20 20 5b 6c 72 61   fragafter  [lra
22b0: 6e 67 65 20 24 63 75 72 72 65 6e 74 20 24 62 6e  nge $current $bn
22c0: 65 78 74 20 65 6e 64 5d 0a 0a 09 09 20 20 20 20  ext end]....    
22d0: 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74  log write 6 cset
22e0: 73 20 22 4e 65 77 20 70 69 65 63 65 73 20 20 5b  s "New pieces  [
22f0: 50 52 20 24 66 72 61 67 62 65 66 6f 72 65 5d 20  PR $fragbefore] 
2300: 5b 50 52 20 24 66 72 61 67 61 66 74 65 72 5d 22  [PR $fragafter]"
2310: 0a 0a 09 09 20 20 20 20 69 6e 74 65 67 72 69 74  ....    integrit
2320: 79 20 61 73 73 65 72 74 20 7b 5b 6c 6c 65 6e 67  y assert {[lleng
2330: 74 68 20 24 66 72 61 67 62 65 66 6f 72 65 5d 7d  th $fragbefore]}
2340: 20 7b 46 6f 75 6e 64 20 7a 65 72 6f 2d 6c 65 6e   {Found zero-len
2350: 67 74 68 20 66 72 61 67 6d 65 6e 74 20 61 74 20  gth fragment at 
2360: 74 68 65 20 62 65 67 69 6e 6e 69 6e 67 7d 0a 09  the beginning}..
2370: 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61  .    integrity a
2380: 73 73 65 72 74 20 7b 5b 6c 6c 65 6e 67 74 68 20  ssert {[llength 
2390: 24 66 72 61 67 61 66 74 65 72 5d 7d 20 20 7b 46  $fragafter]}  {F
23a0: 6f 75 6e 64 20 7a 65 72 6f 2d 6c 65 6e 67 74 68  ound zero-length
23b0: 20 66 72 61 67 6d 65 6e 74 20 61 74 20 74 68 65   fragment at the
23c0: 20 65 6e 64 7d 0a 0a 09 09 20 20 20 20 6c 61 70   end}....    lap
23d0: 70 65 6e 64 20 6e 65 77 20 24 66 72 61 67 62 65  pend new $fragbe
23e0: 66 6f 72 65 20 24 66 72 61 67 61 66 74 65 72 0a  fore $fragafter.
23f0: 09 09 20 20 20 20 43 75 74 41 74 20 24 62 65 73  ..    CutAt $bes
2400: 74 0a 09 09 7d 0a 0a 09 09 69 6e 63 72 20 61 74  t...}....incr at
2410: 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 6c 6f 67  ..    }..}...log
2420: 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22   write 6 csets "
2430: 2e 20 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e  . . .. ... .....
2440: 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e   ........ ......
2450: 2e 2e 2e 2e 2e 2e 2e 22 0a 0a 09 23 20 28 2a 29  ......."...# (*)
2460: 20 57 65 20 63 6c 65 61 72 20 6f 75 74 20 74 68   We clear out th
2470: 65 20 61 73 73 6f 63 69 61 74 65 64 20 70 61 72  e associated par
2480: 74 20 6f 66 20 74 68 65 20 6d 79 69 74 65 6d 6d  t of the myitemm
2490: 61 70 0a 09 23 20 69 6e 2d 6d 65 6d 6f 72 79 20  ap..# in-memory 
24a0: 69 6e 64 65 78 20 69 6e 20 70 72 65 70 61 72 61  index in prepara
24b0: 74 69 6f 6e 20 66 6f 72 20 6e 65 77 20 64 61 74  tion for new dat
24c0: 61 2e 20 41 20 73 69 6d 70 6c 65 20 75 6e 73 65  a. A simple unse
24d0: 74 0a 09 23 20 69 73 20 65 6e 6f 75 67 68 2c 20  t..# is enough, 
24e0: 77 65 20 68 61 76 65 20 6e 6f 20 73 79 6d 62 6f  we have no symbo
24f0: 6c 20 63 68 61 6e 67 65 73 65 74 73 20 61 74 20  l changesets at 
2500: 74 68 69 73 20 74 69 6d 65 2c 20 61 6e 64 0a 09  this time, and..
2510: 23 20 74 68 75 73 20 6e 65 76 65 72 20 6d 6f 72  # thus never mor
2520: 65 20 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72  e than one refer
2530: 65 6e 63 65 20 69 6e 20 74 68 65 20 6c 69 73 74  ence in the list
2540: 2e 0a 0a 09 66 6f 72 65 61 63 68 20 69 69 64 20  ....foreach iid 
2550: 24 6d 79 69 74 65 6d 73 20 7b 0a 09 20 20 20 20  $myitems {..    
2560: 73 65 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 6d  set key [list $m
2570: 79 74 79 70 65 20 24 69 69 64 5d 0a 09 20 20 20  ytype $iid]..   
2580: 20 75 6e 73 65 74 20 6d 79 69 74 65 6d 6d 61 70   unset myitemmap
2590: 28 24 6b 65 79 29 0a 09 20 20 20 20 6c 6f 67 20  ($key)..    log 
25a0: 77 72 69 74 65 20 38 20 63 73 65 74 73 20 7b 4d  write 8 csets {M
25b0: 41 50 2d 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20  AP- item <$key> 
25c0: 24 73 65 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73  $self = [$self s
25d0: 74 72 5d 7d 0a 09 7d 0a 0a 09 23 20 43 72 65 61  tr]}..}...# Crea
25e0: 74 65 20 63 68 61 6e 67 65 73 65 74 73 20 66 6f  te changesets fo
25f0: 72 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 2c  r the fragments,
2600: 20 72 65 75 73 69 6e 67 20 74 68 65 20 63 75 72   reusing the cur
2610: 72 65 6e 74 20 6f 6e 65 0a 09 23 20 66 6f 72 20  rent one..# for 
2620: 74 68 65 20 66 69 72 73 74 20 66 72 61 67 6d 65  the first fragme
2630: 6e 74 2e 20 57 65 20 73 6f 72 74 20 74 68 65 6d  nt. We sort them
2640: 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 6c 6c   in order to all
2650: 6f 77 0a 09 23 20 63 68 65 63 6b 69 6e 67 20 66  ow..# checking f
2660: 6f 72 20 67 61 70 73 20 61 6e 64 20 6e 69 63 65  or gaps and nice
2670: 20 6d 65 73 73 61 67 65 73 2e 0a 0a 09 73 65 74   messages....set
2680: 20 66 72 61 67 6d 65 6e 74 73 20 5b 6c 73 6f 72   fragments [lsor
2690: 74 20 2d 69 6e 64 65 78 20 30 20 2d 69 6e 74 65  t -index 0 -inte
26a0: 67 65 72 20 24 66 72 61 67 6d 65 6e 74 73 5d 0a  ger $fragments].
26b0: 0a 09 23 70 75 74 73 20 5c 74 2e 5b 6a 6f 69 6e  ..#puts \t.[join
26c0: 20 5b 50 52 73 20 24 66 72 61 67 6d 65 6e 74 73   [PRs $fragments
26d0: 5d 20 2e 5c 6e 5c 74 2e 5d 2e 0a 0a 09 42 6f 72  ] .\n\t.]....Bor
26e0: 64 65 72 20 5b 6c 69 6e 64 65 78 20 24 66 72 61  der [lindex $fra
26f0: 67 6d 65 6e 74 73 20 30 5d 20 66 69 72 73 74 73  gments 0] firsts
2700: 20 66 69 72 73 74 65 0a 0a 09 69 6e 74 65 67 72   firste...integr
2710: 69 74 79 20 61 73 73 65 72 74 20 7b 24 66 69 72  ity assert {$fir
2720: 73 74 73 20 3d 3d 20 30 7d 20 7b 42 61 64 20 66  sts == 0} {Bad f
2730: 72 61 67 6d 65 6e 74 20 73 74 61 72 74 20 40 20  ragment start @ 
2740: 24 66 69 72 73 74 73 2c 20 67 61 70 2c 20 6f 72  $firsts, gap, or
2750: 20 62 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e   before beginnin
2760: 67 20 6f 66 20 74 68 65 20 72 61 6e 67 65 7d 0a  g of the range}.
2770: 0a 09 73 65 74 20 6c 61 73 74 65 20 24 66 69 72  ..set laste $fir
2780: 73 74 65 0a 09 66 6f 72 65 61 63 68 20 66 72 61  ste..foreach fra
2790: 67 6d 65 6e 74 20 5b 6c 72 61 6e 67 65 20 24 66  gment [lrange $f
27a0: 72 61 67 6d 65 6e 74 73 20 31 20 65 6e 64 5d 20  ragments 1 end] 
27b0: 7b 0a 09 20 20 20 20 42 6f 72 64 65 72 20 24 66  {..    Border $f
27c0: 72 61 67 6d 65 6e 74 20 73 20 65 0a 09 20 20 20  ragment s e..   
27d0: 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72   integrity asser
27e0: 74 20 7b 24 6c 61 73 74 65 20 3d 3d 20 28 24 73  t {$laste == ($s
27f0: 20 2d 20 31 29 7d 20 7b 42 61 64 20 66 72 61 67   - 1)} {Bad frag
2800: 6d 65 6e 74 20 62 6f 72 64 65 72 20 3c 24 6c 61  ment border <$la
2810: 73 74 65 20 7c 20 24 73 3e 2c 20 67 61 70 20 6f  ste | $s>, gap o
2820: 72 20 6f 76 65 72 6c 61 70 7d 0a 0a 09 20 20 20  r overlap}...   
2830: 20 73 65 74 20 6e 65 77 20 5b 24 74 79 70 65 20   set new [$type 
2840: 25 41 55 54 4f 25 20 24 6d 79 70 72 6f 6a 65 63  %AUTO% $myprojec
2850: 74 20 24 6d 79 74 79 70 65 20 24 6d 79 73 72 63  t $mytype $mysrc
2860: 69 64 20 5b 6c 72 61 6e 67 65 20 24 6d 79 69 74  id [lrange $myit
2870: 65 6d 73 20 24 73 20 24 65 5d 5d 0a 09 20 20 20  ems $s $e]]..   
2880: 20 69 6e 63 72 20 63 6f 75 6e 74 65 72 0a 0a 20   incr counter.. 
2890: 20 20 20 20 20 20 20 20 20 20 20 6c 6f 67 20 77             log w
28a0: 72 69 74 65 20 34 20 63 73 65 74 73 20 22 42 72  rite 4 csets "Br
28b0: 65 61 6b 69 6e 67 20 5b 24 73 65 6c 66 20 73 74  eaking [$self st
28c0: 72 20 5d 20 40 20 24 6c 61 73 74 65 2c 20 6e 65  r ] @ $laste, ne
28d0: 77 20 5b 24 6e 65 77 20 73 74 72 5d 2c 20 63 75  w [$new str], cu
28e0: 74 74 69 6e 67 20 24 62 72 65 61 6b 73 28 24 6c  tting $breaks($l
28f0: 61 73 74 65 29 22 0a 0a 09 20 20 20 20 73 65 74  aste)"...    set
2900: 20 6c 61 73 74 65 20 24 65 0a 09 7d 0a 0a 09 69   laste $e..}...i
2910: 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20  ntegrity assert 
2920: 7b 0a 09 20 20 20 20 24 6c 61 73 74 65 20 3d 3d  {..    $laste ==
2930: 20 28 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 69 74   ([llength $myit
2940: 65 6d 73 5d 2d 31 29 0a 09 7d 20 7b 42 61 64 20  ems]-1)..} {Bad 
2950: 66 72 61 67 6d 65 6e 74 20 65 6e 64 20 40 20 24  fragment end @ $
2960: 6c 61 73 74 65 2c 20 67 61 70 2c 20 6f 72 20 62  laste, gap, or b
2970: 65 79 6f 6e 64 20 65 6e 64 20 6f 66 20 74 68 65  eyond end of the
2980: 20 72 61 6e 67 65 7d 0a 0a 09 23 20 50 75 74 20   range}...# Put 
2990: 74 68 65 20 66 69 72 73 74 20 66 72 61 67 6d 65  the first fragme
29a0: 6e 74 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72  nt into the curr
29b0: 65 6e 74 20 63 68 61 6e 67 65 73 65 74 2c 20 61  ent changeset, a
29c0: 6e 64 0a 09 23 20 75 70 64 61 74 65 20 74 68 65  nd..# update the
29d0: 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6e 64 65 78   in-memory index
29e0: 2e 20 57 65 20 63 61 6e 20 73 69 6d 70 6c 79 20  . We can simply 
29f0: 28 72 65 29 61 64 64 20 74 68 65 20 69 74 65 6d  (re)add the item
2a00: 73 0a 09 23 20 62 65 63 61 75 73 65 20 77 65 20  s..# because we 
2a10: 63 6c 65 61 72 65 64 20 74 68 65 20 70 72 65 76  cleared the prev
2a20: 69 6f 75 73 6c 79 20 65 78 69 73 74 69 6e 67 20  iously existing 
2a30: 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20 73 65 65  information, see
2a40: 0a 09 23 20 28 2a 29 20 61 62 6f 76 65 2e 20 50  ..# (*) above. P
2a50: 65 72 73 69 73 74 65 6e 63 65 20 64 6f 65 73 20  ersistence does 
2a60: 6e 6f 74 20 6d 61 74 74 65 72 20 68 65 72 65 2c  not matter here,
2a70: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 0a 09 23 20   none of the..# 
2a80: 63 68 61 6e 67 65 73 65 74 73 20 68 61 73 20 62  changesets has b
2a90: 65 65 6e 20 73 61 76 65 64 20 74 6f 20 74 68 65  een saved to the
2aa0: 20 70 65 72 73 69 73 74 65 6e 74 20 73 74 61 74   persistent stat
2ab0: 65 20 79 65 74 2e 0a 0a 09 73 65 74 20 6d 79 69  e yet....set myi
2ac0: 74 65 6d 73 20 20 5b 6c 72 61 6e 67 65 20 24 6d  tems  [lrange $m
2ad0: 79 69 74 65 6d 73 20 20 30 20 24 66 69 72 73 74  yitems  0 $first
2ae0: 65 5d 0a 09 73 65 74 20 6d 79 74 69 74 65 6d 73  e]..set mytitems
2af0: 20 5b 6c 72 61 6e 67 65 20 24 6d 79 74 69 74 65   [lrange $mytite
2b00: 6d 73 20 30 20 24 66 69 72 73 74 65 5d 0a 09 66  ms 0 $firste]..f
2b10: 6f 72 65 61 63 68 20 69 69 64 20 24 6d 79 69 74  oreach iid $myit
2b20: 65 6d 73 20 7b 0a 09 20 20 20 20 73 65 74 20 6b  ems {..    set k
2b30: 65 79 20 5b 6c 69 73 74 20 24 6d 79 74 79 70 65  ey [list $mytype
2b40: 20 24 69 69 64 5d 0a 09 20 20 20 20 73 65 74 20   $iid]..    set 
2b50: 6d 79 69 74 65 6d 6d 61 70 28 24 6b 65 79 29 20  myitemmap($key) 
2b60: 24 73 65 6c 66 0a 09 20 20 20 20 6c 6f 67 20 77  $self..    log w
2b70: 72 69 74 65 20 38 20 63 73 65 74 73 20 7b 4d 41  rite 8 csets {MA
2b80: 50 2b 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24  P+ item <$key> $
2b90: 73 65 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74  self = [$self st
2ba0: 72 5d 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 20  r]}..}...return 
2bb0: 31 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74  1.    }..    met
2bc0: 68 6f 64 20 70 65 72 73 69 73 74 20 7b 7d 20 7b  hod persist {} {
2bd0: 0a 09 73 65 74 20 74 69 64 20 24 6d 79 63 73 74  ..set tid $mycst
2be0: 79 70 65 28 24 6d 79 74 79 70 65 29 0a 09 73 65  ype($mytype)..se
2bf0: 74 20 70 69 64 20 5b 24 6d 79 70 72 6f 6a 65 63  t pid [$myprojec
2c00: 74 20 69 64 5d 0a 09 73 65 74 20 70 6f 73 20 30  t id]..set pos 0
2c10: 0a 0a 09 73 74 61 74 65 20 74 72 61 6e 73 61 63  ...state transac
2c20: 74 69 6f 6e 20 7b 0a 09 20 20 20 20 73 74 61 74  tion {..    stat
2c30: 65 20 72 75 6e 20 7b 0a 09 09 49 4e 53 45 52 54  e run {...INSERT
2c40: 20 49 4e 54 4f 20 63 68 61 6e 67 65 73 65 74 20   INTO changeset 
2c50: 28 63 69 64 2c 20 20 20 70 69 64 2c 20 20 74 79  (cid,   pid,  ty
2c60: 70 65 2c 20 73 72 63 29 0a 09 09 56 41 4c 55 45  pe, src)...VALUE
2c70: 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  S               
2c80: 20 28 24 6d 79 69 64 2c 20 24 70 69 64 2c 20 24   ($myid, $pid, $
2c90: 74 69 64 2c 20 24 6d 79 73 72 63 69 64 29 3b 0a  tid, $mysrcid);.
2ca0: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 66 6f 72  .    }...    for
2cb0: 65 61 63 68 20 69 69 64 20 24 6d 79 69 74 65 6d  each iid $myitem
2cc0: 73 20 7b 0a 09 09 73 74 61 74 65 20 72 75 6e 20  s {...state run 
2cd0: 7b 0a 09 09 20 20 20 20 49 4e 53 45 52 54 20 49  {...    INSERT I
2ce0: 4e 54 4f 20 63 73 69 74 65 6d 20 28 63 69 64 2c  NTO csitem (cid,
2cf0: 20 20 20 70 6f 73 2c 20 20 69 69 64 29 0a 09 09     pos,  iid)...
2d00: 20 20 20 20 56 41 4c 55 45 53 20 20 20 20 20 20      VALUES      
2d10: 20 20 20 20 20 20 20 28 24 6d 79 69 64 2c 20 24         ($myid, $
2d20: 70 6f 73 2c 20 24 69 69 64 29 3b 0a 09 09 7d 0a  pos, $iid);...}.
2d30: 09 09 69 6e 63 72 20 70 6f 73 0a 09 20 20 20 20  ..incr pos..    
2d40: 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20  }..}..return.   
2d50: 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 74   }..    method t
2d60: 69 6d 65 72 61 6e 67 65 20 7b 7d 20 7b 20 72 65  imerange {} { re
2d70: 74 75 72 6e 20 5b 24 6d 79 74 79 70 65 6f 62 6a  turn [$mytypeobj
2d80: 20 74 69 6d 65 72 61 6e 67 65 20 24 6d 79 69 74   timerange $myit
2d90: 65 6d 73 5d 20 7d 0a 0a 20 20 20 20 6d 65 74 68  ems] }..    meth
2da0: 6f 64 20 6c 69 6d 69 74 73 20 7b 7d 20 7b 0a 09  od limits {} {..
2db0: 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73  struct::list ass
2dc0: 69 67 6e 20 5b 24 6d 79 74 79 70 65 6f 62 6a 20  ign [$mytypeobj 
2dd0: 6c 69 6d 69 74 73 20 24 6d 79 69 74 65 6d 73 5d  limits $myitems]
2de0: 20 6d 61 78 70 20 6d 69 6e 73 0a 09 72 65 74 75   maxp mins..retu
2df0: 72 6e 20 5b 6c 69 73 74 20 5b 54 61 67 49 74 65  rn [list [TagIte
2e00: 6d 44 69 63 74 20 24 6d 61 78 70 20 24 6d 79 74  mDict $maxp $myt
2e10: 79 70 65 5d 20 5b 54 61 67 49 74 65 6d 44 69 63  ype] [TagItemDic
2e20: 74 20 24 6d 69 6e 73 20 24 6d 79 74 79 70 65 5d  t $mins $mytype]
2e30: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74  ].    }..    met
2e40: 68 6f 64 20 64 72 6f 70 20 7b 7d 20 7b 0a 09 6c  hod drop {} {..l
2e50: 6f 67 20 77 72 69 74 65 20 38 20 63 73 65 74 73  og write 8 csets
2e60: 20 7b 44 72 6f 70 70 69 6e 67 20 24 73 65 6c 66   {Dropping $self
2e70: 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d 7d 0a   = [$self str]}.
2e80: 0a 09 73 74 61 74 65 20 74 72 61 6e 73 61 63 74  ..state transact
2e90: 69 6f 6e 20 7b 0a 09 20 20 20 20 73 74 61 74 65  ion {..    state
2ea0: 20 72 75 6e 20 7b 0a 09 09 44 45 4c 45 54 45 20   run {...DELETE 
2eb0: 46 52 4f 4d 20 63 68 61 6e 67 65 73 65 74 20 20  FROM changeset  
2ec0: 20 57 48 45 52 45 20 63 69 64 20 3d 20 24 6d 79   WHERE cid = $my
2ed0: 69 64 3b 0a 09 09 44 45 4c 45 54 45 20 46 52 4f  id;...DELETE FRO
2ee0: 4d 20 63 73 69 74 65 6d 20 20 20 20 20 20 57 48  M csitem      WH
2ef0: 45 52 45 20 63 69 64 20 3d 20 24 6d 79 69 64 3b  ERE cid = $myid;
2f00: 0a 09 09 44 45 4c 45 54 45 20 46 52 4f 4d 20 63  ...DELETE FROM c
2f10: 73 73 75 63 63 65 73 73 6f 72 20 57 48 45 52 45  ssuccessor WHERE
2f20: 20 63 69 64 20 3d 20 24 6d 79 69 64 3b 0a 09 20   cid = $myid;.. 
2f30: 20 20 20 7d 0a 09 7d 0a 09 66 6f 72 65 61 63 68     }..}..foreach
2f40: 20 69 69 64 20 24 6d 79 69 74 65 6d 73 20 7b 0a   iid $myitems {.
2f50: 09 20 20 20 20 73 65 74 20 6b 65 79 20 5b 6c 69  .    set key [li
2f60: 73 74 20 24 6d 79 74 79 70 65 20 24 69 69 64 5d  st $mytype $iid]
2f70: 0a 09 20 20 20 20 75 6e 73 65 74 20 6d 79 69 74  ..    unset myit
2f80: 65 6d 6d 61 70 28 24 6b 65 79 29 0a 09 20 20 20  emmap($key)..   
2f90: 20 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73 65   log write 8 cse
2fa0: 74 73 20 7b 4d 41 50 2d 20 69 74 65 6d 20 3c 24  ts {MAP- item <$
2fb0: 6b 65 79 3e 20 24 73 65 6c 66 20 3d 20 5b 24 73  key> $self = [$s
2fc0: 65 6c 66 20 73 74 72 5d 7d 0a 09 7d 0a 09 73 65  elf str]}..}..se
2fd0: 74 20 70 6f 73 20 20 20 20 20 20 20 20 20 20 5b  t pos          [
2fe0: 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74 20 24  lsearch -exact $
2ff0: 6d 79 63 68 61 6e 67 65 73 65 74 73 20 24 73 65  mychangesets $se
3000: 6c 66 5d 0a 09 73 65 74 20 6d 79 63 68 61 6e 67  lf]..set mychang
3010: 65 73 65 74 73 20 5b 6c 72 65 70 6c 61 63 65 20  esets [lreplace 
3020: 24 6d 79 63 68 61 6e 67 65 73 65 74 73 20 24 70  $mychangesets $p
3030: 6f 73 20 24 70 6f 73 5d 0a 09 73 65 74 20 70 6f  os $pos]..set po
3040: 73 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  s               
3050: 20 20 20 20 20 5b 6c 73 65 61 72 63 68 20 2d 65       [lsearch -e
3060: 78 61 63 74 20 24 6d 79 74 63 68 61 6e 67 65 73  xact $mytchanges
3070: 65 74 73 28 24 6d 79 74 79 70 65 29 20 24 73 65  ets($mytype) $se
3080: 6c 66 5d 0a 09 73 65 74 20 6d 79 74 63 68 61 6e  lf]..set mytchan
3090: 67 65 73 65 74 73 28 24 6d 79 74 79 70 65 29 20  gesets($mytype) 
30a0: 5b 6c 72 65 70 6c 61 63 65 20 24 6d 79 74 63 68  [lreplace $mytch
30b0: 61 6e 67 65 73 65 74 73 28 24 6d 79 74 79 70 65  angesets($mytype
30c0: 29 20 24 70 6f 73 20 24 70 6f 73 5d 0a 0a 09 23  ) $pos $pos]...#
30d0: 20 52 65 74 75 72 6e 20 74 68 65 20 6c 69 73 74   Return the list
30e0: 20 6f 66 20 70 72 65 64 65 63 65 73 73 6f 72 73   of predecessors
30f0: 20 73 6f 20 74 68 61 74 20 74 68 65 79 20 63 61   so that they ca
3100: 6e 20 62 65 20 61 64 6a 75 73 74 65 64 2e 0a 09  n be adjusted...
3110: 72 65 74 75 72 6e 20 5b 73 74 72 75 63 74 3a 3a  return [struct::
3120: 6c 69 73 74 20 6d 61 70 20 5b 73 74 61 74 65 20  list map [state 
3130: 72 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c 45 43  run {..    SELEC
3140: 54 20 63 69 64 0a 09 20 20 20 20 46 52 4f 4d 20  T cid..    FROM 
3150: 20 20 63 73 73 75 63 63 65 73 73 6f 72 0a 09 20    cssuccessor.. 
3160: 20 20 20 57 48 45 52 45 20 20 6e 69 64 20 3d 20     WHERE  nid = 
3170: 24 6d 79 69 64 0a 09 7d 5d 20 5b 6d 79 74 79 70  $myid..}] [mytyp
3180: 65 6d 65 74 68 6f 64 20 6f 66 5d 5d 0a 20 20 20  emethod of]].   
3190: 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 72   }..    method r
31a0: 65 70 6f 72 74 6c 6f 6f 70 20 7b 7b 6b 69 6c 6c  eportloop {{kill
31b0: 20 31 7d 7d 20 7b 0a 09 23 20 57 65 20 70 72 69   1}} {..# We pri
31c0: 6e 74 20 74 68 65 20 69 74 65 6d 73 20 77 68 69  nt the items whi
31d0: 63 68 20 61 72 65 20 70 72 6f 64 75 63 69 6e 67  ch are producing
31e0: 20 74 68 65 20 6c 6f 6f 70 2c 20 61 6e 64 20 68   the loop, and h
31f0: 6f 77 2e 0a 0a 09 73 65 74 20 68 64 72 20 22 53  ow....set hdr "S
3200: 65 6c 66 2d 72 65 66 65 72 65 6e 74 69 61 6c 20  elf-referential 
3210: 63 68 61 6e 67 65 73 65 74 20 5b 24 73 65 6c 66  changeset [$self
3220: 20 73 74 72 5d 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f   str] __________
3230: 5f 5f 5f 5f 5f 5f 5f 5f 22 0a 09 73 65 74 20 66  ________"..set f
3240: 74 72 20 5b 72 65 67 73 75 62 20 2d 61 6c 6c 20  tr [regsub -all 
3250: 7b 5b 5e 20 09 5d 7d 20 24 68 64 72 20 7b 5f 7d  {[^ .]} $hdr {_}
3260: 5d 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 30 20  ]...log write 0 
3270: 63 73 65 74 73 20 24 68 64 72 0a 09 66 6f 72 65  csets $hdr..fore
3280: 61 63 68 20 7b 69 74 65 6d 20 6e 65 78 74 69 74  ach {item nextit
3290: 65 6d 7d 20 5b 24 6d 79 74 79 70 65 6f 62 6a 20  em} [$mytypeobj 
32a0: 6c 6f 6f 70 73 20 24 6d 79 69 74 65 6d 73 5d 20  loops $myitems] 
32b0: 7b 0a 09 20 20 20 20 23 20 43 72 65 61 74 65 20  {..    # Create 
32c0: 74 61 67 67 65 64 20 69 74 65 6d 73 20 66 72 6f  tagged items fro
32d0: 6d 20 74 68 65 20 69 64 20 61 6e 64 20 6f 75 72  m the id and our
32e0: 20 74 79 70 65 2e 0a 09 20 20 20 20 73 65 74 20   type...    set 
32f0: 69 74 65 6d 20 20 20 20 20 5b 6c 69 73 74 20 24  item     [list $
3300: 6d 79 74 79 70 65 20 20 24 69 74 65 6d 5d 0a 09  mytype  $item]..
3310: 20 20 20 20 73 65 74 20 6e 65 78 74 69 74 65 6d      set nextitem
3320: 20 5b 6c 69 73 74 20 24 6d 79 74 79 70 65 20 24   [list $mytype $
3330: 6e 65 78 74 69 74 65 6d 5d 0a 09 20 20 20 20 23  nextitem]..    #
3340: 20 50 72 69 6e 74 61 62 6c 65 20 6c 61 62 65 6c   Printable label
3350: 73 2e 0a 09 20 20 20 20 73 65 74 20 69 20 20 22  s...    set i  "
3360: 3c 5b 24 74 79 70 65 20 69 74 65 6d 73 74 72 20  <[$type itemstr 
3370: 24 69 74 65 6d 5d 3e 22 0a 09 20 20 20 20 73 65  $item]>"..    se
3380: 74 20 6e 20 20 22 3c 5b 24 74 79 70 65 20 69 74  t n  "<[$type it
3390: 65 6d 73 74 72 20 24 6e 65 78 74 69 74 65 6d 5d  emstr $nextitem]
33a0: 3e 22 0a 09 20 20 20 20 73 65 74 20 6e 63 73 20  >"..    set ncs 
33b0: 24 6d 79 69 74 65 6d 6d 61 70 28 24 6e 65 78 74  $myitemmap($next
33c0: 69 74 65 6d 29 0a 09 20 20 20 20 23 20 50 72 69  item)..    # Pri
33d0: 6e 74 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74  nt..    log writ
33e0: 65 20 30 20 63 73 65 74 73 20 7b 2a 20 24 69 20  e 0 csets {* $i 
33f0: 2d 2d 3e 20 24 6e 20 2d 2d 3e 20 63 73 20 5b 24  --> $n --> cs [$
3400: 6e 63 73 20 73 74 72 5d 7d 0a 09 7d 0a 09 6c 6f  ncs str]}..}..lo
3410: 67 20 77 72 69 74 65 20 30 20 63 73 65 74 73 20  g write 0 csets 
3420: 24 66 74 72 0a 0a 09 69 66 20 7b 21 24 6b 69 6c  $ftr...if {!$kil
3430: 6c 7d 20 72 65 74 75 72 6e 0a 09 74 72 6f 75 62  l} return..troub
3440: 6c 65 20 69 6e 74 65 72 6e 61 6c 20 22 5b 24 73  le internal "[$s
3450: 65 6c 66 20 73 74 72 5d 20 64 65 70 65 6e 64 73  elf str] depends
3460: 20 6f 6e 20 69 74 73 65 6c 66 22 0a 09 72 65 74   on itself"..ret
3470: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d  urn.    }..    m
3480: 65 74 68 6f 64 20 70 75 73 68 74 6f 20 7b 72 65  ethod pushto {re
3490: 70 6f 73 69 74 6f 72 79 20 64 61 74 65 20 72 73  pository date rs
34a0: 74 61 74 65 7d 20 7b 0a 09 23 20 47 65 6e 65 72  tate} {..# Gener
34b0: 61 74 65 20 61 6e 64 20 69 6d 70 6f 72 74 20 74  ate and import t
34c0: 68 65 20 6d 61 6e 69 66 65 73 74 20 66 6f 72 20  he manifest for 
34d0: 74 68 69 73 20 63 68 61 6e 67 65 73 65 74 2e 0a  this changeset..
34e0: 09 23 0a 09 23 20 44 61 74 61 20 6e 65 65 64 65  .#..# Data neede
34f0: 64 3a 0a 09 23 20 2d 20 43 6f 6d 6d 69 74 20 6d  d:..# - Commit m
3500: 65 73 73 61 67 65 20 20 20 20 20 20 20 20 20 20  essage          
3510: 20 20 20 20 20 28 2d 2d 20 6d 79 73 72 63 69 64       (-- mysrcid
3520: 20 2d 3e 20 72 65 70 6f 73 69 74 6f 72 79 20 6d   -> repository m
3530: 65 74 61 29 0a 09 23 20 2d 20 55 73 65 72 20 64  eta)..# - User d
3540: 6f 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20  oing the commit 
3550: 20 20 20 20 20 20 20 28 73 2e 61 2e 29 0a 09 23         (s.a.)..#
3560: 0a 09 23 20 2d 20 54 69 6d 65 73 74 61 6d 70 20  ..# - Timestamp 
3570: 6f 66 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 65  of when committe
3580: 64 20 20 28 63 6f 6d 6d 61 6e 64 20 61 72 67 75  d  (command argu
3590: 6d 65 6e 74 29 0a 09 23 0a 09 23 20 2d 20 54 68  ment)..#..# - Th
35a0: 65 20 70 61 72 65 6e 74 20 63 68 61 6e 67 65 73  e parent changes
35b0: 65 74 2c 20 69 66 20 61 6e 79 2e 20 49 66 20 74  et, if any. If t
35c0: 68 65 72 65 20 69 73 20 6e 6f 20 70 61 72 65 6e  here is no paren
35d0: 74 20 66 6f 73 73 69 6c 0a 09 23 20 20 20 77 69  t fossil..#   wi
35e0: 6c 6c 20 75 73 65 20 74 68 65 20 65 6d 70 74 79  ll use the empty
35f0: 20 62 61 73 65 20 72 65 76 69 73 69 6f 6e 20 61   base revision a
3600: 73 20 70 61 72 65 6e 74 2e 0a 09 23 0a 09 23 20  s parent...#..# 
3610: 2d 20 4c 69 73 74 20 6f 66 20 74 68 65 20 66 69  - List of the fi
3620: 6c 65 20 72 65 76 69 73 69 6f 6e 73 20 69 6e 20  le revisions in 
3630: 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a  the changeset...
3640: 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73  .struct::list as
3650: 73 69 67 6e 20 5b 24 6d 79 70 72 6f 6a 65 63 74  sign [$myproject
3660: 20 67 65 74 6d 65 74 61 20 24 6d 79 73 72 63 69   getmeta $mysrci
3670: 64 5d 20 5f 5f 20 5f 5f 20 75 73 65 72 20 6d 65  d] __ __ user me
3680: 73 73 61 67 65 0a 0a 09 23 20 57 65 20 64 65 72  ssage...# We der
3690: 69 76 65 20 74 68 65 20 6c 6f 64 20 69 6e 66 6f  ive the lod info
36a0: 72 6d 61 74 69 6f 6e 20 64 69 72 65 63 74 6c 79  rmation directly
36b0: 20 66 72 6f 6d 20 74 68 65 20 72 65 76 69 73 69   from the revisi
36c0: 6f 6e 73 20 6f 66 0a 09 23 20 74 68 65 20 63 68  ons of..# the ch
36d0: 61 6e 67 65 73 65 74 2c 20 61 73 20 74 68 65 20  angeset, as the 
36e0: 62 72 61 6e 63 68 20 70 61 72 74 20 6f 66 20 74  branch part of t
36f0: 68 65 20 6d 65 74 61 20 64 61 74 61 20 28 73 2e  he meta data (s.
3700: 61 2e 29 20 69 73 0a 09 23 20 6f 75 74 64 61 74  a.) is..# outdat
3710: 65 64 20 73 69 6e 63 65 20 70 61 73 73 20 46 69  ed since pass Fi
3720: 6c 74 65 72 53 79 6d 62 6f 6c 73 2e 0a 0a 09 73  lterSymbols....s
3730: 65 74 20 6c 6f 64 6e 61 6d 65 20 5b 24 73 65 6c  et lodname [$sel
3740: 66 20 6c 6f 64 5d 0a 0a 09 6c 6f 67 20 77 72 69  f lod]...log wri
3750: 74 65 20 32 20 63 73 65 74 73 20 7b 49 6d 70 6f  te 2 csets {Impo
3760: 72 74 69 6e 67 20 72 65 76 69 73 69 6f 6e 20 5b  rting revision [
3770: 24 73 65 6c 66 20 73 74 72 5d 20 6f 6e 20 24 6c  $self str] on $l
3780: 6f 64 6e 61 6d 65 7d 0a 0a 09 23 20 50 65 72 66  odname}...# Perf
3790: 6f 72 6d 20 74 68 65 20 69 6d 70 6f 72 74 2e 20  orm the import. 
37a0: 41 73 20 70 61 72 74 20 6f 66 20 74 68 61 74 20  As part of that 
37b0: 77 65 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65  we determine the
37c0: 20 70 61 72 65 6e 74 0a 09 23 20 77 65 20 6e 65   parent..# we ne
37d0: 65 64 2c 20 61 6e 64 20 63 6f 6e 76 65 72 74 20  ed, and convert 
37e0: 74 68 65 20 6c 69 73 74 20 6f 66 20 69 74 65 6d  the list of item
37f0: 73 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73  s in the changes
3800: 65 74 20 69 6e 74 6f 0a 09 23 20 75 75 69 64 73  et into..# uuids
3810: 20 61 6e 64 20 70 72 69 6e 74 61 62 6c 65 20 64   and printable d
3820: 61 74 61 2e 0a 0a 09 73 74 72 75 63 74 3a 3a 6c  ata....struct::l
3830: 69 73 74 20 61 73 73 69 67 6e 20 5b 47 65 74 69  ist assign [Geti
3840: 73 64 65 66 61 75 6c 74 20 24 6d 79 69 74 65 6d  sdefault $myitem
3850: 73 5d 20 69 73 64 65 66 61 75 6c 74 20 6c 61 73  s] isdefault las
3860: 74 64 65 66 61 75 6c 74 6f 6e 74 72 75 6e 6b 0a  tdefaultontrunk.
3870: 0a 09 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73  ..log write 8 cs
3880: 65 74 73 20 7b 4c 4f 44 20 20 20 20 27 24 6c 6f  ets {LOD    '$lo
3890: 64 6e 61 6d 65 27 7d 0a 09 6c 6f 67 20 77 72 69  dname'}..log wri
38a0: 74 65 20 38 20 63 73 65 74 73 20 7b 20 64 65 66  te 8 csets { def
38b0: 3f 20 20 24 69 73 64 65 66 61 75 6c 74 7d 0a 09  ?  $isdefault}..
38c0: 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73 65 74  log write 8 cset
38d0: 73 20 7b 20 6c 61 73 74 3f 20 24 6c 61 73 74 64  s { last? $lastd
38e0: 65 66 61 75 6c 74 6f 6e 74 72 75 6e 6b 7d 0a 0a  efaultontrunk}..
38f0: 09 73 65 74 20 6c 77 73 20 20 5b 47 65 74 77 6f  .set lws  [Getwo
3900: 72 6b 73 70 61 63 65 20 20 20 20 24 72 73 74 61  rkspace    $rsta
3910: 74 65 20 24 6c 6f 64 6e 61 6d 65 20 24 6d 79 70  te $lodname $myp
3920: 72 6f 6a 65 63 74 20 24 69 73 64 65 66 61 75 6c  roject $isdefaul
3930: 74 5d 0a 09 24 6c 77 73 20 61 64 64 20 5b 47 65  t]..$lws add [Ge
3940: 74 72 65 76 69 73 69 6f 6e 69 6e 66 6f 20 24 6d  trevisioninfo $m
3950: 79 69 74 65 6d 73 5d 0a 0a 09 73 65 74 20 75 75  yitems]...set uu
3960: 69 64 20 5b 24 72 65 70 6f 73 69 74 6f 72 79 20  id [$repository 
3970: 69 6d 70 6f 72 74 72 65 76 69 73 69 6f 6e 20 5b  importrevision [
3980: 24 73 65 6c 66 20 73 74 72 5d 20 5c 0a 09 09 20  $self str] \... 
3990: 20 20 20 20 20 24 75 73 65 72 20 24 6d 65 73 73       $user $mess
39a0: 61 67 65 20 24 64 61 74 65 20 5c 0a 09 09 20 20  age $date \...  
39b0: 20 20 20 20 5b 24 6c 77 73 20 67 65 74 69 64 5d      [$lws getid]
39c0: 20 5b 24 6c 77 73 20 67 65 74 5d 5d 0a 0a 09 23   [$lws get]]...#
39d0: 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 69 6d   Remember the im
39e0: 70 6f 72 74 65 64 20 63 68 61 6e 67 65 73 65 74  ported changeset
39f0: 20 69 6e 20 74 68 65 20 73 74 61 74 65 2c 20 75   in the state, u
3a00: 6e 64 65 72 20 6f 75 72 0a 09 23 20 4c 4f 44 2e  nder our..# LOD.
3a10: 20 41 6e 64 20 69 66 20 69 74 20 69 73 20 74 68   And if it is th
3a20: 65 20 6c 61 73 74 20 74 72 75 6e 6b 20 63 68 61  e last trunk cha
3a30: 6e 67 65 73 65 74 20 6f 6e 20 74 68 65 20 76 65  ngeset on the ve
3a40: 6e 64 6f 72 0a 09 23 20 62 72 61 6e 63 68 20 74  ndor..# branch t
3a50: 68 65 6e 20 74 68 65 20 72 65 76 69 73 69 6f 6e  hen the revision
3a60: 20 69 73 20 61 6c 73 6f 20 74 68 65 20 61 63 74   is also the act
3a70: 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 0a  ual root of the.
3a80: 09 23 20 3a 74 72 75 6e 6b 3a 2c 20 73 6f 20 77  .# :trunk:, so w
3a90: 65 20 72 65 6d 65 6d 62 65 72 20 69 74 20 61 73  e remember it as
3aa0: 20 73 75 63 68 20 69 6e 20 74 68 65 20 73 74 61   such in the sta
3ab0: 74 65 2e 20 48 6f 77 65 76 65 72 20 69 66 0a 09  te. However if..
3ac0: 23 20 74 68 65 20 74 72 75 6e 6b 20 61 6c 72 65  # the trunk alre
3ad0: 61 64 79 20 65 78 69 73 74 73 20 74 68 65 6e 20  ady exists then 
3ae0: 74 68 65 20 63 68 61 6e 67 65 73 65 74 20 63 61  the changeset ca
3af0: 6e 6e 6f 74 20 62 65 20 6f 6e 20 69 74 0a 09 23  nnot be on it..#
3b00: 20 61 6e 79 20 6d 6f 72 65 2e 20 54 68 69 73 20   any more. This 
3b10: 69 6e 64 69 63 61 74 65 73 20 77 65 69 72 64 6e  indicates weirdn
3b20: 65 73 73 20 69 6e 20 74 68 65 20 73 65 74 75 70  ess in the setup
3b30: 20 6f 66 20 74 68 65 0a 09 23 20 76 65 6e 64 6f   of the..# vendo
3b40: 72 20 62 72 61 6e 63 68 2c 20 62 75 74 20 6f 6e  r branch, but on
3b50: 65 20 77 65 20 63 61 6e 20 77 6f 72 6b 20 61 72  e we can work ar
3b60: 6f 75 6e 64 2e 0a 0a 09 24 6c 77 73 20 64 65 66  ound....$lws def
3b70: 69 64 20 24 75 75 69 64 0a 09 69 66 20 7b 24 6c  id $uuid..if {$l
3b80: 61 73 74 64 65 66 61 75 6c 74 6f 6e 74 72 75 6e  astdefaultontrun
3b90: 6b 7d 20 7b 0a 09 20 20 20 20 69 66 20 7b 5b 24  k} {..    if {[$
3ba0: 72 73 74 61 74 65 20 68 61 73 20 3a 74 72 75 6e  rstate has :trun
3bb0: 6b 3a 5d 7d 20 7b 0a 09 09 6c 6f 67 20 77 72 69  k:]} {...log wri
3bc0: 74 65 20 32 20 63 73 65 74 73 20 7b 4d 75 6c 74  te 2 csets {Mult
3bd0: 69 70 6c 65 20 63 68 61 6e 67 65 73 65 74 73 20  iple changesets 
3be0: 64 65 63 6c 61 72 65 64 20 74 6f 20 62 65 20 74  declared to be t
3bf0: 68 65 20 6c 61 73 74 20 74 72 75 6e 6b 20 63 68  he last trunk ch
3c00: 61 6e 67 65 73 65 74 20 6f 6e 20 74 68 65 20 76  angeset on the v
3c10: 65 6e 64 6f 72 2d 62 72 61 6e 63 68 7d 0a 09 20  endor-branch}.. 
3c20: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 24 72     } else {...$r
3c30: 73 74 61 74 65 20 6e 65 77 20 3a 74 72 75 6e 6b  state new :trunk
3c40: 3a 20 5b 24 6c 77 73 20 6e 61 6d 65 5d 0a 09 20  : [$lws name].. 
3c50: 20 20 20 7d 0a 09 7d 0a 0a 09 23 20 52 65 6d 65     }..}...# Reme
3c60: 6d 62 65 72 20 74 68 65 20 77 68 6f 6c 65 20 63  mber the whole c
3c70: 68 61 6e 67 65 73 65 74 20 2f 20 75 75 69 64 20  hangeset / uuid 
3c80: 6d 61 70 70 69 6e 67 2c 20 66 6f 72 20 74 68 65  mapping, for the
3c90: 20 74 61 67 73 2e 0a 0a 09 73 74 61 74 65 20 72   tags....state r
3ca0: 75 6e 20 7b 0a 09 20 20 20 20 49 4e 53 45 52 54  un {..    INSERT
3cb0: 20 49 4e 54 4f 20 63 73 75 75 69 64 20 28 63 69   INTO csuuid (ci
3cc0: 64 2c 20 20 20 75 75 69 64 29 0a 09 20 20 20 20  d,   uuid)..    
3cd0: 56 41 4c 55 45 53 20 20 20 20 20 20 20 20 20 20  VALUES          
3ce0: 20 20 20 28 24 6d 79 69 64 2c 20 24 75 75 69 64     ($myid, $uuid
3cf0: 29 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20  )..}..return.   
3d00: 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 47 65 74   }..    proc Get
3d10: 72 65 76 69 73 69 6f 6e 69 6e 66 6f 20 7b 72 65  revisioninfo {re
3d20: 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 73 65 74 20  visions} {..set 
3d30: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24  theset ('[join $
3d40: 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d  revisions {','}]
3d50: 27 29 0a 09 73 65 74 20 72 65 76 69 73 69 6f 6e  ')..set revision
3d60: 73 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 66  s {}..foreach {f
3d70: 72 69 64 20 70 61 74 68 20 66 6e 61 6d 65 20 72  rid path fname r
3d80: 65 76 6e 72 20 72 6f 70 7d 20 5b 73 74 61 74 65  evnr rop} [state
3d90: 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63   run [subst -noc
3da0: 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73  ommands -nobacks
3db0: 6c 61 73 68 65 73 20 7b 0a 09 20 20 20 20 53 45  lashes {..    SE
3dc0: 4c 45 43 54 20 55 2e 75 75 69 64 2c 20 46 2e 76  LECT U.uuid, F.v
3dd0: 69 73 69 62 6c 65 2c 20 46 2e 6e 61 6d 65 2c 20  isible, F.name, 
3de0: 52 2e 72 65 76 2c 20 52 2e 6f 70 0a 09 20 20 20  R.rev, R.op..   
3df0: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
3e00: 20 52 2c 20 72 65 76 75 75 69 64 20 55 2c 20 66   R, revuuid U, f
3e10: 69 6c 65 20 46 0a 09 20 20 20 20 57 48 45 52 45  ile F..    WHERE
3e20: 20 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73    R.rid IN $thes
3e30: 65 74 20 20 2d 2d 20 41 6c 6c 20 73 70 65 63 69  et  -- All speci
3e40: 66 69 65 64 20 72 65 76 69 73 69 6f 6e 73 0a 09  fied revisions..
3e50: 20 20 20 20 41 4e 44 20 20 20 20 55 2e 72 69 64      AND    U.rid
3e60: 20 3d 20 52 2e 72 69 64 20 20 20 20 20 2d 2d 20   = R.rid     -- 
3e70: 67 65 74 20 66 6f 73 73 69 6c 20 75 75 69 64 20  get fossil uuid 
3e80: 6f 66 20 72 65 76 69 73 69 6f 6e 0a 09 20 20 20  of revision..   
3e90: 20 41 4e 44 20 20 20 20 46 2e 66 69 64 20 3d 20   AND    F.fid = 
3ea0: 52 2e 66 69 64 20 20 20 20 20 2d 2d 20 67 65 74  R.fid     -- get
3eb0: 20 66 69 6c 65 20 6f 66 20 72 65 76 69 73 69 6f   file of revisio
3ec0: 6e 0a 09 7d 5d 5d 20 7b 0a 09 20 20 20 20 6c 61  n..}]] {..    la
3ed0: 70 70 65 6e 64 20 72 65 76 69 73 69 6f 6e 73 20  ppend revisions 
3ee0: 24 66 72 69 64 20 24 70 61 74 68 20 24 66 6e 61  $frid $path $fna
3ef0: 6d 65 2f 24 72 65 76 6e 72 20 24 72 6f 70 0a 09  me/$revnr $rop..
3f00: 7d 0a 09 72 65 74 75 72 6e 20 24 72 65 76 69 73  }..return $revis
3f10: 69 6f 6e 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ions.    }..    
3f20: 70 72 6f 63 20 47 65 74 77 6f 72 6b 73 70 61 63  proc Getworkspac
3f30: 65 20 7b 72 73 74 61 74 65 20 6c 6f 64 6e 61 6d  e {rstate lodnam
3f40: 65 20 70 72 6f 6a 65 63 74 20 69 73 64 65 66 61  e project isdefa
3f50: 75 6c 74 7d 20 7b 0a 0a 09 23 20 54 68 65 20 73  ult} {...# The s
3f60: 74 61 74 65 20 6f 62 6a 65 63 74 20 68 6f 6c 64  tate object hold
3f70: 73 20 74 68 65 20 77 6f 72 6b 73 70 61 63 65 20  s the workspace 
3f80: 73 74 61 74 65 20 6f 66 20 65 61 63 68 20 6b 6e  state of each kn
3f90: 6f 77 6e 0a 09 23 20 6c 69 6e 65 2d 6f 66 2d 64  own..# line-of-d
3fa0: 65 76 65 6c 6f 70 6d 65 6e 74 20 28 4c 4f 44 29  evelopment (LOD)
3fb0: 2c 20 75 70 20 74 6f 20 74 68 65 20 6c 61 73 74  , up to the last
3fc0: 20 63 6f 6d 6d 69 74 74 65 64 0a 09 23 20 63 68   committed..# ch
3fd0: 61 6e 67 65 73 65 74 20 62 65 6c 6f 6e 67 69 6e  angeset belongin
3fe0: 67 20 74 6f 20 74 68 61 74 20 4c 4f 44 2e 0a 0a  g to that LOD...
3ff0: 09 23 20 28 2a 29 20 53 74 61 6e 64 61 72 64 20  .# (*) Standard 
4000: 68 61 6e 64 6c 69 6e 67 20 69 66 20 69 6e 2d 4c  handling if in-L
4010: 4f 44 20 63 68 61 6e 67 65 73 65 74 73 2e 20 49  OD changesets. I
4020: 66 20 74 68 65 20 4c 4f 44 20 6f 66 0a 09 23 20  f the LOD of..# 
4030: 20 20 20 20 74 68 65 20 63 75 72 72 65 6e 74 20      the current 
4040: 63 68 61 6e 67 65 73 65 74 20 65 78 69 73 74 73  changeset exists
4050: 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 28 3d   in the state (=
4060: 20 68 61 73 20 62 65 65 6e 0a 09 23 20 20 20 20   has been..#    
4070: 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 29 20 74   committed to) t
4080: 68 65 6e 20 74 68 69 73 20 69 74 20 68 61 73 20  hen this it has 
4090: 74 68 65 20 77 6f 72 6b 73 70 61 63 65 20 77 65  the workspace we
40a0: 20 61 72 65 0a 09 23 20 20 20 20 20 6c 6f 6f 6b   are..#     look
40b0: 69 6e 67 20 66 6f 72 2e 0a 0a 09 69 66 20 7b 5b  ing for....if {[
40c0: 24 72 73 74 61 74 65 20 68 61 73 20 24 6c 6f 64  $rstate has $lod
40d0: 6e 61 6d 65 5d 7d 20 7b 0a 09 20 20 20 20 72 65  name]} {..    re
40e0: 74 75 72 6e 20 5b 24 72 73 74 61 74 65 20 67 65  turn [$rstate ge
40f0: 74 20 24 6c 6f 64 6e 61 6d 65 5d 0a 09 7d 0a 0a  t $lodname]..}..
4100: 09 23 20 49 66 20 74 68 65 20 4c 4f 44 20 69 73  .# If the LOD is
4110: 20 68 6f 77 65 76 65 72 20 6e 6f 74 20 79 65 74   however not yet
4120: 20 6b 6e 6f 77 6e 2c 20 74 68 65 6e 20 74 68 65   known, then the
4130: 20 63 75 72 72 65 6e 74 0a 09 23 20 63 68 61 6e   current..# chan
4140: 67 65 73 65 74 20 63 61 6e 20 62 65 20 65 69 74  geset can be eit
4150: 68 65 72 20 6f 66 0a 09 23 20 28 61 29 20 72 6f  her of..# (a) ro
4160: 6f 74 20 6f 66 20 61 20 76 65 6e 64 6f 72 20 62  ot of a vendor b
4170: 72 61 6e 63 68 2c 0a 09 23 20 28 62 29 20 72 6f  ranch,..# (b) ro
4180: 6f 74 20 6f 66 20 74 68 65 20 74 72 75 6e 6b 20  ot of the trunk 
4190: 4c 4f 44 2c 20 6f 72 0a 09 23 20 28 63 29 20 74  LOD, or..# (c) t
41a0: 68 65 20 66 69 72 73 74 20 63 68 61 6e 67 65 73  he first changes
41b0: 65 74 20 69 6e 20 61 20 6e 65 77 20 4c 4f 44 20  et in a new LOD 
41c0: 77 68 69 63 68 20 77 61 73 20 73 70 61 77 6e 65  which was spawne
41d0: 64 20 66 72 6f 6d 0a 09 23 20 20 20 20 20 61 6e  d from..#     an
41e0: 20 65 78 69 73 74 69 6e 67 20 4c 4f 44 2e 0a 0a   existing LOD...
41f0: 09 23 20 46 6f 72 20 62 6f 74 68 20 28 61 29 20  .# For both (a) 
4200: 61 6e 64 20 28 62 29 20 77 65 20 68 61 76 65 20  and (b) we have 
4210: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
4220: 77 6f 72 6b 73 70 61 63 65 20 66 6f 72 0a 09 23  workspace for..#
4230: 20 74 68 65 20 6c 6f 64 2c 20 61 6e 64 20 69 74   the lod, and it
4240: 20 64 6f 65 73 6e 27 74 20 69 6e 68 65 72 69 74   doesn't inherit
4250: 20 66 72 6f 6d 20 61 6e 79 74 68 69 6e 67 2e 0a   from anything..
4260: 0a 09 23 20 4f 6e 65 20 65 78 63 65 70 74 69 6f  ..# One exceptio
4270: 6e 20 66 6f 72 20 28 61 29 2e 20 49 66 20 77 65  n for (a). If we
4280: 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
4290: 3a 76 65 6e 64 6f 72 3a 20 62 72 61 6e 63 68 0a  :vendor: branch.
42a0: 09 23 20 74 68 65 6e 20 6d 75 6c 74 69 70 6c 65  .# then multiple
42b0: 20 73 79 6d 62 6f 6c 73 20 77 65 72 65 20 75 73   symbols were us
42c0: 65 64 20 66 6f 72 20 74 68 65 20 76 65 6e 64 6f  ed for the vendo
42d0: 72 20 62 72 61 6e 63 68 20 62 79 0a 09 23 20 64  r branch by..# d
42e0: 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73 2e 20  ifferent files. 
42f0: 49 6e 20 74 68 61 74 20 63 61 73 65 20 74 68 65  In that case the
4300: 20 27 6e 65 77 27 20 62 72 61 6e 63 68 20 69 73   'new' branch is
4310: 20 6d 61 64 65 20 61 6e 0a 09 23 20 61 6c 69 61   made an..# alia
4320: 73 20 6f 66 20 74 68 65 20 3a 76 65 6e 64 6f 72  s of the :vendor
4330: 3a 2c 20 65 66 66 65 63 74 69 76 65 6c 79 20 6d  :, effectively m
4340: 65 72 67 69 6e 67 20 74 68 65 20 73 79 6d 62 6f  erging the symbo
4350: 6c 73 0a 09 23 20 74 6f 67 65 74 68 65 72 2e 0a  ls..# together..
4360: 0a 09 23 20 4e 6f 74 65 20 74 68 61 74 20 63 61  ..# Note that ca
4370: 73 65 20 28 62 29 20 6d 61 79 20 6e 65 76 65 72  se (b) may never
4380: 20 6f 63 63 75 72 2e 20 53 65 65 20 74 68 65 20   occur. See the 
4390: 76 61 72 69 61 62 6c 65 0a 09 23 20 27 6c 61 73  variable..# 'las
43a0: 74 64 65 66 61 75 6c 74 6f 6e 74 72 75 6e 6b 27  tdefaultontrunk'
43b0: 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 28   in the caller (
43c0: 6d 65 74 68 6f 64 20 70 75 73 68 74 6f 29 2e 20  method pushto). 
43d0: 54 68 69 73 0a 09 23 20 66 6c 61 67 20 63 61 6e  This..# flag can
43e0: 20 74 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20   the generation 
43f0: 6f 66 20 74 68 65 20 77 6f 72 6b 73 70 61 63 65  of the workspace
4400: 20 66 6f 72 20 74 68 65 20 3a 74 72 75 6e 6b 3a   for the :trunk:
4410: 20 4c 4f 44 0a 09 23 20 61 73 20 77 65 6c 6c 2c   LOD..# as well,
4420: 20 6d 61 6b 69 6e 67 20 69 74 20 69 6e 68 65 72   making it inher
4430: 69 74 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  it the state of 
4440: 74 68 65 20 6c 61 73 74 0a 09 23 20 74 72 75 6e  the last..# trun
4450: 6b 2d 63 68 61 6e 67 65 73 65 74 20 6f 6e 20 74  k-changeset on t
4460: 68 65 20 76 65 6e 64 6f 72 2d 62 72 61 6e 63 68  he vendor-branch
4470: 2e 0a 0a 09 69 66 20 7b 24 69 73 64 65 66 61 75  ....if {$isdefau
4480: 6c 74 7d 20 7b 0a 09 20 20 20 20 69 66 20 7b 21  lt} {..    if {!
4490: 5b 24 72 73 74 61 74 65 20 68 61 73 20 22 3a 76  [$rstate has ":v
44a0: 65 6e 64 6f 72 3a 22 5d 7d 20 7b 0a 09 09 23 20  endor:"]} {...# 
44b0: 43 72 65 61 74 65 20 74 68 65 20 76 65 6e 64 6f  Create the vendo
44c0: 72 20 62 72 61 6e 63 68 20 69 66 20 6e 6f 74 20  r branch if not 
44d0: 70 72 65 73 65 6e 74 20 61 6c 72 65 61 64 79 2e  present already.
44e0: 0a 09 09 24 72 73 74 61 74 65 20 6e 65 77 20 3a  ...$rstate new :
44f0: 76 65 6e 64 6f 72 3a 0a 09 20 20 20 20 7d 0a 09  vendor:..    }..
4500: 20 20 20 20 23 20 4d 65 72 67 65 20 74 68 65 20      # Merge the 
4510: 6e 65 77 20 73 79 6d 62 6f 6c 20 74 6f 20 74 68  new symbol to th
4520: 65 20 76 65 6e 64 6f 72 20 62 72 61 6e 63 68 0a  e vendor branch.
4530: 09 20 20 20 20 24 72 73 74 61 74 65 20 64 75 70  .    $rstate dup
4540: 20 24 6c 6f 64 6e 61 6d 65 20 3c 2d 2d 20 3a 76   $lodname <-- :v
4550: 65 6e 64 6f 72 3a 0a 09 20 20 20 20 72 65 74 75  endor:..    retu
4560: 72 6e 20 5b 24 72 73 74 61 74 65 20 67 65 74 20  rn [$rstate get 
4570: 24 6c 6f 64 6e 61 6d 65 5d 0a 09 7d 0a 0a 09 69  $lodname]..}...i
4580: 66 20 7b 24 6c 6f 64 6e 61 6d 65 20 65 71 20 22  f {$lodname eq "
4590: 3a 74 72 75 6e 6b 3a 22 7d 20 7b 0a 09 20 20 20  :trunk:"} {..   
45a0: 20 72 65 74 75 72 6e 20 5b 24 72 73 74 61 74 65   return [$rstate
45b0: 20 6e 65 77 20 24 6c 6f 64 6e 61 6d 65 5d 0a 09   new $lodname]..
45c0: 7d 0a 0a 09 23 20 43 61 73 65 20 28 63 29 2e 20  }...# Case (c). 
45d0: 57 65 20 66 69 6e 64 20 74 68 65 20 70 61 72 65  We find the pare
45e0: 6e 74 20 4c 4f 44 20 6f 66 20 6f 75 72 20 4c 4f  nt LOD of our LO
45f0: 44 20 61 6e 64 20 6c 65 74 20 74 68 65 20 6e 65  D and let the ne
4600: 77 0a 09 23 20 77 6f 72 6b 73 70 61 63 65 20 69  w..# workspace i
4610: 6e 68 65 72 69 74 20 66 72 6f 6d 20 74 68 65 20  nherit from the 
4620: 70 61 72 65 6e 74 27 73 20 77 6f 72 6b 73 70 61  parent's workspa
4630: 63 65 2e 0a 0a 09 73 65 74 20 70 6c 6f 64 6e 61  ce....set plodna
4640: 6d 65 20 5b 5b 5b 24 70 72 6f 6a 65 63 74 20 67  me [[[$project g
4650: 65 74 73 79 6d 62 6f 6c 20 24 6c 6f 64 6e 61 6d  etsymbol $lodnam
4660: 65 5d 20 70 61 72 65 6e 74 5d 20 6e 61 6d 65 5d  e] parent] name]
4670: 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 38 20 63  ...log write 8 c
4680: 73 65 74 73 20 7b 70 4c 4f 44 20 20 20 27 24 70  sets {pLOD   '$p
4690: 6c 6f 64 6e 61 6d 65 27 7d 0a 0a 09 69 66 20 7b  lodname'}...if {
46a0: 5b 24 72 73 74 61 74 65 20 68 61 73 20 24 70 6c  [$rstate has $pl
46b0: 6f 64 6e 61 6d 65 5d 7d 20 7b 0a 09 20 20 20 20  odname]} {..    
46c0: 72 65 74 75 72 6e 20 5b 24 72 73 74 61 74 65 20  return [$rstate 
46d0: 6e 65 77 20 24 6c 6f 64 6e 61 6d 65 20 24 70 6c  new $lodname $pl
46e0: 6f 64 6e 61 6d 65 5d 0a 09 7d 0a 0a 09 66 6f 72  odname]..}...for
46f0: 65 61 63 68 20 6b 20 5b 6c 73 6f 72 74 20 5b 24  each k [lsort [$
4700: 72 73 74 61 74 65 20 6e 61 6d 65 73 5d 5d 20 7b  rstate names]] {
4710: 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20  ..    log write 
4720: 38 20 63 73 65 74 73 20 7b 20 20 20 20 24 6b 20  8 csets {    $k 
4730: 3d 20 5b 5b 24 72 73 74 61 74 65 20 67 65 74 20  = [[$rstate get 
4740: 24 6b 5d 20 67 65 74 69 64 5d 7d 0a 09 7d 0a 0a  $k] getid]}..}..
4750: 09 74 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61  .trouble interna
4760: 6c 20 7b 55 6e 61 62 6c 65 20 74 6f 20 64 65 74  l {Unable to det
4770: 65 72 6d 69 6e 65 20 63 68 61 6e 67 65 73 65 74  ermine changeset
4780: 20 70 61 72 65 6e 74 7d 0a 09 72 65 74 75 72 6e   parent}..return
4790: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63  .    }..    proc
47a0: 20 47 65 74 69 73 64 65 66 61 75 6c 74 20 7b 72   Getisdefault {r
47b0: 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 73 65 74  evisions} {..set
47c0: 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20   theset ('[join 
47d0: 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d  $revisions {','}
47e0: 5d 27 29 0a 0a 09 73 74 72 75 63 74 3a 3a 6c 69  ]')...struct::li
47f0: 73 74 20 61 73 73 69 67 6e 20 5b 73 74 61 74 65  st assign [state
4800: 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63   run [subst -noc
4810: 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73  ommands -nobacks
4820: 6c 61 73 68 65 73 20 7b 0a 09 20 20 20 20 53 45  lashes {..    SE
4830: 4c 45 43 54 20 52 2e 69 73 64 65 66 61 75 6c 74  LECT R.isdefault
4840: 2c 20 52 2e 64 62 63 68 69 6c 64 0a 09 20 20 20  , R.dbchild..   
4850: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
4860: 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 52   R..    WHERE  R
4870: 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 20  .rid IN $theset 
4880: 20 2d 2d 20 41 6c 6c 20 73 70 65 63 69 66 69 65   -- All specifie
4890: 64 20 72 65 76 69 73 69 6f 6e 73 0a 09 20 20 20  d revisions..   
48a0: 20 4c 49 4d 49 54 20 31 0a 09 7d 5d 5d 20 64 65   LIMIT 1..}]] de
48b0: 66 20 6c 61 73 74 0a 0a 09 23 20 54 4f 44 4f 2f  f last...# TODO/
48c0: 43 48 45 43 4b 3a 20 6c 6f 6f 6b 20 66 6f 72 20  CHECK: look for 
48d0: 63 68 61 6e 67 65 73 65 74 73 20 77 68 65 72 65  changesets where
48e0: 20 69 73 64 65 66 61 75 6c 74 2f 64 62 63 68 69   isdefault/dbchi
48f0: 6c 64 20 69 73 0a 09 23 20 61 6d 62 69 67 6f 75  ld is..# ambigou
4900: 73 2e 0a 0a 09 72 65 74 75 72 6e 20 5b 6c 69 73  s....return [lis
4910: 74 20 24 64 65 66 20 5b 65 78 70 72 20 7b 24 6c  t $def [expr {$l
4920: 61 73 74 20 6e 65 20 22 22 7d 5d 5d 0a 20 20 20  ast ne ""}]].   
4930: 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68   }..    typemeth
4940: 6f 64 20 73 70 6c 69 74 20 7b 63 73 65 74 20 61  od split {cset a
4950: 72 67 73 7d 20 7b 0a 09 23 20 41 73 20 70 61 72  rgs} {..# As par
4960: 74 20 6f 66 20 74 68 65 20 63 72 65 61 74 69 6f  t of the creatio
4970: 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 63 68 61  n of the new cha
4980: 6e 67 65 73 65 74 73 20 73 70 65 63 69 66 69 65  ngesets specifie
4990: 64 20 69 6e 0a 09 23 20 41 52 47 53 20 61 73 20  d in..# ARGS as 
49a0: 73 65 74 73 20 6f 66 20 69 74 65 6d 73 2c 20 61  sets of items, a
49b0: 6c 6c 20 73 75 62 73 65 74 73 20 6f 66 20 43 53  ll subsets of CS
49c0: 45 54 27 73 20 69 74 65 6d 20 73 65 74 2c 20 43  ET's item set, C
49d0: 53 45 54 0a 09 23 20 77 69 6c 6c 20 62 65 20 64  SET..# will be d
49e0: 72 6f 70 70 65 64 20 66 72 6f 6d 20 61 6c 6c 20  ropped from all 
49f0: 64 61 74 61 62 61 73 65 73 2c 20 69 6e 20 61 6e  databases, in an
4a00: 64 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2c  d out of memory,
4a10: 0a 09 23 20 61 6e 64 20 74 68 65 6e 20 64 65 73  ..# and then des
4a20: 74 72 6f 79 65 64 2e 0a 09 23 0a 09 23 20 4e 6f  troyed...#..# No
4a30: 74 65 3a 20 54 68 65 20 69 74 65 6d 20 6c 69 73  te: The item lis
4a40: 74 73 20 66 6f 75 6e 64 20 69 6e 20 61 72 67 73  ts found in args
4a50: 20 61 72 65 20 74 61 67 67 65 64 20 69 74 65 6d   are tagged item
4a60: 73 2e 20 54 68 65 79 0a 09 23 20 68 61 76 65 20  s. They..# have 
4a70: 74 6f 20 68 61 76 65 20 74 68 65 20 73 61 6d 65  to have the same
4a80: 20 74 79 70 65 20 61 73 20 74 68 65 20 63 68 61   type as the cha
4a90: 6e 67 65 73 65 74 2c 20 62 65 69 6e 67 20 73 75  ngeset, being su
4aa0: 62 73 65 74 73 0a 09 23 20 6f 66 20 69 74 73 20  bsets..# of its 
4ab0: 69 74 65 6d 73 2e 20 54 68 69 73 20 69 73 20 63  items. This is c
4ac0: 68 65 63 6b 65 64 20 69 6e 20 55 6e 74 61 67 31  hecked in Untag1
4ad0: 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 38 20  ....log write 8 
4ae0: 63 73 65 74 73 20 7b 4f 4c 44 3a 20 5b 6c 73 6f  csets {OLD: [lso
4af0: 72 74 20 5b 24 63 73 65 74 20 69 74 65 6d 73 5d  rt [$cset items]
4b00: 5d 7d 0a 09 56 61 6c 69 64 61 74 65 46 72 61 67  ]}..ValidateFrag
4b10: 6d 65 6e 74 73 20 24 63 73 65 74 20 24 61 72 67  ments $cset $arg
4b20: 73 0a 0a 09 23 20 41 6c 6c 20 63 68 65 63 6b 73  s...# All checks
4b30: 20 70 61 73 73 2c 20 61 63 74 75 61 6c 6c 79 20   pass, actually 
4b40: 70 65 72 66 6f 72 6d 20 74 68 65 20 73 70 6c 69  perform the spli
4b50: 74 2e 0a 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73  t....struct::lis
4b60: 74 20 61 73 73 69 67 6e 20 5b 24 63 73 65 74 20  t assign [$cset 
4b70: 64 61 74 61 5d 20 70 72 6f 6a 65 63 74 20 63 73  data] project cs
4b80: 74 79 70 65 20 63 73 73 72 63 0a 0a 09 73 65 74  type cssrc...set
4b90: 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 5b 24   predecessors [$
4ba0: 63 73 65 74 20 64 72 6f 70 5d 0a 09 24 63 73 65  cset drop]..$cse
4bb0: 74 20 64 65 73 74 72 6f 79 0a 0a 09 73 65 74 20  t destroy...set 
4bc0: 6e 65 77 63 73 65 74 73 20 7b 7d 0a 09 66 6f 72  newcsets {}..for
4bd0: 65 61 63 68 20 66 72 61 67 6d 65 6e 74 69 74 65  each fragmentite
4be0: 6d 73 20 24 61 72 67 73 20 7b 0a 09 20 20 20 20  ms $args {..    
4bf0: 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73 65 74  log write 8 cset
4c00: 73 20 7b 4d 41 4b 45 3a 20 5b 6c 73 6f 72 74 20  s {MAKE: [lsort 
4c10: 24 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 5d 7d  $fragmentitems]}
4c20: 0a 0a 09 20 20 20 20 73 65 74 20 66 72 61 67 6d  ...    set fragm
4c30: 65 6e 74 20 5b 24 74 79 70 65 20 25 41 55 54 4f  ent [$type %AUTO
4c40: 25 20 24 70 72 6f 6a 65 63 74 20 24 63 73 74 79  % $project $csty
4c50: 70 65 20 24 63 73 73 72 63 20 5c 0a 09 09 09 20  pe $cssrc \.... 
4c60: 20 20 20 20 20 5b 55 6e 74 61 67 20 24 66 72 61       [Untag $fra
4c70: 67 6d 65 6e 74 69 74 65 6d 73 20 24 63 73 74 79  gmentitems $csty
4c80: 70 65 5d 5d 0a 09 20 20 20 20 6c 61 70 70 65 6e  pe]]..    lappen
4c90: 64 20 6e 65 77 63 73 65 74 73 20 24 66 72 61 67  d newcsets $frag
4ca0: 6d 65 6e 74 0a 0a 09 20 20 20 20 24 66 72 61 67  ment...    $frag
4cb0: 6d 65 6e 74 20 70 65 72 73 69 73 74 0a 09 20 20  ment persist..  
4cc0: 20 20 24 66 72 61 67 6d 65 6e 74 20 64 65 74 65    $fragment dete
4cd0: 72 6d 69 6e 65 73 75 63 63 65 73 73 6f 72 73 0a  rminesuccessors.
4ce0: 09 7d 0a 0a 09 23 20 54 68 65 20 70 72 65 64 65  .}...# The prede
4cf0: 63 65 73 73 6f 72 73 20 68 61 76 65 20 74 6f 20  cessors have to 
4d00: 72 65 63 6f 6d 70 75 74 65 20 74 68 65 69 72 20  recompute their 
4d10: 73 75 63 63 65 73 73 6f 72 73 2c 20 69 2e 65 2e  successors, i.e.
4d20: 0a 09 23 20 72 65 6d 6f 76 65 20 74 68 65 20 64  ..# remove the d
4d30: 72 6f 70 70 65 64 20 63 68 61 6e 67 65 73 65 74  ropped changeset
4d40: 20 61 6e 64 20 70 75 74 20 6f 6e 65 20 6f 66 20   and put one of 
4d50: 74 68 65 20 66 72 61 67 6d 65 6e 74 73 0a 09 23  the fragments..#
4d60: 20 69 6e 74 6f 20 69 74 73 20 70 6c 61 63 65 2e   into its place.
4d70: 0a 09 66 6f 72 65 61 63 68 20 70 20 24 70 72 65  ..foreach p $pre
4d80: 64 65 63 65 73 73 6f 72 73 20 7b 0a 09 20 20 20  decessors {..   
4d90: 20 24 70 20 64 65 74 65 72 6d 69 6e 65 73 75 63   $p determinesuc
4da0: 63 65 73 73 6f 72 73 0a 09 7d 0a 0a 09 72 65 74  cessors..}...ret
4db0: 75 72 6e 20 24 6e 65 77 63 73 65 74 73 0a 20 20  urn $newcsets.  
4dc0: 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74    }..    typemet
4dd0: 68 6f 64 20 69 74 65 6d 73 74 72 20 7b 69 74 65  hod itemstr {ite
4de0: 6d 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c 69  m} {..struct::li
4df0: 73 74 20 61 73 73 69 67 6e 20 24 69 74 65 6d 20  st assign $item 
4e00: 69 74 79 70 65 20 69 69 64 0a 09 72 65 74 75 72  itype iid..retur
4e10: 6e 20 5b 24 69 74 79 70 65 20 73 74 72 20 24 69  n [$itype str $i
4e20: 69 64 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  id].    }..    t
4e30: 79 70 65 6d 65 74 68 6f 64 20 73 74 72 6c 69 73  ypemethod strlis
4e40: 74 20 7b 63 68 61 6e 67 65 73 65 74 73 7d 20 7b  t {changesets} {
4e50: 0a 09 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 20 5b  ..return [join [
4e60: 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61 70  struct::list map
4e70: 20 24 63 68 61 6e 67 65 73 65 74 73 20 5b 6d 79   $changesets [my
4e80: 70 72 6f 63 20 49 44 5d 5d 5d 0a 20 20 20 20 7d  proc ID]]].    }
4e90: 0a 0a 20 20 20 20 70 72 6f 63 20 49 44 20 7b 63  ..    proc ID {c
4ea0: 73 65 74 7d 20 7b 20 24 63 73 65 74 20 73 74 72  set} { $cset str
4eb0: 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 55 6e 74   }..    proc Unt
4ec0: 61 67 20 7b 74 61 67 67 65 64 69 74 65 6d 73 20  ag {taggeditems 
4ed0: 63 73 74 79 70 65 7d 20 7b 0a 09 72 65 74 75 72  cstype} {..retur
4ee0: 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20  n [struct::list 
4ef0: 6d 61 70 20 24 74 61 67 67 65 64 69 74 65 6d 73  map $taggeditems
4f00: 20 5b 6d 79 70 72 6f 63 20 55 6e 74 61 67 31 20   [myproc Untag1 
4f10: 24 63 73 74 79 70 65 5d 5d 0a 20 20 20 20 7d 0a  $cstype]].    }.
4f20: 0a 20 20 20 20 70 72 6f 63 20 55 6e 74 61 67 31  .    proc Untag1
4f30: 20 7b 63 73 74 79 70 65 20 74 68 65 69 74 65 6d   {cstype theitem
4f40: 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73  } {..struct::lis
4f50: 74 20 61 73 73 69 67 6e 20 24 74 68 65 69 74 65  t assign $theite
4f60: 6d 20 74 20 69 0a 09 69 6e 74 65 67 72 69 74 79  m t i..integrity
4f70: 20 61 73 73 65 72 74 20 7b 24 63 73 74 79 70 65   assert {$cstype
4f80: 20 65 71 20 24 74 7d 20 7b 49 74 65 6d 20 24 69   eq $t} {Item $i
4f90: 27 73 20 74 79 70 65 20 69 73 20 27 24 74 27 2c  's type is '$t',
4fa0: 20 65 78 70 65 63 74 65 64 20 27 24 63 73 74 79   expected '$csty
4fb0: 70 65 27 7d 0a 09 72 65 74 75 72 6e 20 24 69 0a  pe'}..return $i.
4fc0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20      }..    proc 
4fd0: 54 61 67 49 74 65 6d 44 69 63 74 20 7b 69 74 65  TagItemDict {ite
4fe0: 6d 64 69 63 74 20 63 73 74 79 70 65 7d 20 7b 0a  mdict cstype} {.
4ff0: 09 73 65 74 20 72 65 73 20 7b 7d 0a 09 66 6f 72  .set res {}..for
5000: 65 61 63 68 20 7b 69 20 76 7d 20 24 69 74 65 6d  each {i v} $item
5010: 64 69 63 74 20 7b 20 6c 61 70 70 65 6e 64 20 72  dict { lappend r
5020: 65 73 20 5b 6c 69 73 74 20 24 63 73 74 79 70 65  es [list $cstype
5030: 20 24 69 5d 20 24 76 20 7d 0a 09 72 65 74 75 72   $i] $v }..retur
5040: 6e 20 24 72 65 73 0a 20 20 20 20 7d 0a 0a 20 20  n $res.    }..  
5050: 20 20 70 72 6f 63 20 56 61 6c 69 64 61 74 65 46    proc ValidateF
5060: 72 61 67 6d 65 6e 74 73 20 7b 63 73 65 74 20 66  ragments {cset f
5070: 72 61 67 6d 65 6e 74 73 7d 20 7b 0a 09 23 20 43  ragments} {..# C
5080: 68 65 63 6b 20 74 68 65 20 76 61 72 69 6f 75 73  heck the various
5090: 20 69 6e 74 65 67 72 69 74 79 20 63 6f 6e 73 74   integrity const
50a0: 72 61 69 6e 74 73 20 66 6f 72 20 74 68 65 20 66  raints for the f
50b0: 72 61 67 6d 65 6e 74 73 0a 09 23 20 73 70 65 63  ragments..# spec
50c0: 69 66 79 69 6e 67 20 68 6f 77 20 74 6f 20 73 70  ifying how to sp
50d0: 6c 69 74 20 74 68 65 20 63 68 61 6e 67 65 73 65  lit the changese
50e0: 74 3a 0a 09 23 0a 09 23 20 2a 20 57 65 20 6d 75  t:..#..# * We mu
50f0: 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d  st have two or m
5100: 6f 72 65 20 66 72 61 67 6d 65 6e 74 73 2c 20 61  ore fragments, a
5110: 73 20 73 70 6c 69 74 74 69 6e 67 20 61 0a 09 23  s splitting a..#
5120: 20 20 20 63 68 61 6e 67 65 73 65 74 20 69 6e 74     changeset int
5130: 6f 20 6f 6e 65 20 6d 61 6b 65 73 20 6e 6f 20 73  o one makes no s
5140: 65 6e 73 65 2e 0a 09 23 20 2a 20 4e 6f 20 66 72  ense...# * No fr
5150: 61 67 6d 65 6e 74 20 6d 61 79 20 62 65 20 65 6d  agment may be em
5160: 70 74 79 2e 0a 09 23 20 2a 20 41 6c 6c 20 66 72  pty...# * All fr
5170: 61 67 6d 65 6e 74 73 20 68 61 76 65 20 74 6f 20  agments have to 
5180: 62 65 20 74 72 75 65 20 73 75 62 73 65 74 73 20  be true subsets 
5190: 6f 66 20 74 68 65 20 69 74 65 6d 73 20 69 6e 20  of the items in 
51a0: 74 68 65 0a 09 23 20 20 20 63 68 61 6e 67 65 73  the..#   changes
51b0: 65 74 20 74 6f 20 73 70 6c 69 74 2e 20 54 68 65  et to split. The
51c0: 20 27 74 72 75 65 27 20 69 73 20 69 6d 70 6c 69   'true' is impli
51d0: 65 64 20 62 65 63 61 75 73 65 20 6e 6f 6e 65 20  ed because none 
51e0: 61 72 65 0a 09 23 20 20 20 61 6c 6c 6f 77 65 64  are..#   allowed
51f0: 20 74 6f 20 62 65 20 65 6d 70 74 79 2c 20 73 6f   to be empty, so
5200: 20 65 61 63 68 20 68 61 73 20 74 6f 20 62 65 20   each has to be 
5210: 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65  smaller than the
5220: 0a 09 23 20 20 20 74 6f 74 61 6c 2e 0a 09 23 20  ..#   total...# 
5230: 2a 20 54 68 65 20 75 6e 69 6f 6e 20 6f 66 20 74  * The union of t
5240: 68 65 20 66 72 61 67 6d 65 6e 74 73 20 68 61 73  he fragments has
5250: 20 74 6f 20 62 65 20 74 68 65 20 69 74 65 6d 20   to be the item 
5260: 73 65 74 20 6f 66 20 74 68 65 0a 09 23 20 20 20  set of the..#   
5270: 63 68 61 6e 67 65 73 65 74 2e 0a 09 23 20 2a 20  changeset...# * 
5280: 54 68 65 20 66 72 61 67 6d 65 6e 74 20 6d 75 73  The fragment mus
5290: 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 2c 20 69  t not overlap, i
52a0: 2e 65 2e 20 74 68 65 69 72 20 70 61 69 72 77 69  .e. their pairwi
52b0: 73 65 0a 09 23 20 20 20 69 6e 74 65 72 73 65 63  se..#   intersec
52c0: 74 69 6f 6e 73 20 68 61 76 65 20 74 6f 20 62 65  tions have to be
52d0: 20 65 6d 70 74 79 2e 0a 0a 09 73 65 74 20 63 6f   empty....set co
52e0: 76 65 72 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20  ver {}..foreach 
52f0: 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 20 24 66  fragmentitems $f
5300: 72 61 67 6d 65 6e 74 73 20 7b 0a 09 20 20 20 20  ragments {..    
5310: 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73 65 74  log write 8 cset
5320: 73 20 7b 4e 45 57 3a 20 5b 6c 73 6f 72 74 20 24  s {NEW: [lsort $
5330: 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 5d 7d 0a  fragmentitems]}.
5340: 0a 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 20  ..    integrity 
5350: 61 73 73 65 72 74 20 7b 0a 09 09 21 5b 73 74 72  assert {...![str
5360: 75 63 74 3a 3a 73 65 74 20 65 6d 70 74 79 20 24  uct::set empty $
5370: 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 5d 0a 09  fragmentitems]..
5380: 20 20 20 20 7d 20 7b 63 68 61 6e 67 65 73 65 74      } {changeset
5390: 20 66 72 61 67 6d 65 6e 74 20 69 73 20 65 6d 70   fragment is emp
53a0: 74 79 7d 0a 0a 09 20 20 20 20 69 6e 74 65 67 72  ty}...    integr
53b0: 69 74 79 20 61 73 73 65 72 74 20 7b 0a 09 09 5b  ity assert {...[
53c0: 73 74 72 75 63 74 3a 3a 73 65 74 20 73 75 62 73  struct::set subs
53d0: 65 74 6f 66 20 24 66 72 61 67 6d 65 6e 74 69 74  etof $fragmentit
53e0: 65 6d 73 20 5b 24 63 73 65 74 20 69 74 65 6d 73  ems [$cset items
53f0: 5d 5d 0a 09 20 20 20 20 7d 20 7b 63 68 61 6e 67  ]]..    } {chang
5400: 65 73 65 74 20 66 72 61 67 6d 65 6e 74 20 69 73  eset fragment is
5410: 20 6e 6f 74 20 61 20 73 75 62 73 65 74 7d 0a 09   not a subset}..
5420: 20 20 20 20 73 74 72 75 63 74 3a 3a 73 65 74 20      struct::set 
5430: 61 64 64 20 63 6f 76 65 72 20 24 66 72 61 67 6d  add cover $fragm
5440: 65 6e 74 69 74 65 6d 73 0a 09 7d 0a 0a 09 69 6e  entitems..}...in
5450: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b  tegrity assert {
5460: 0a 09 20 20 20 20 5b 73 74 72 75 63 74 3a 3a 73  ..    [struct::s
5470: 65 74 20 65 71 75 61 6c 20 24 63 6f 76 65 72 20  et equal $cover 
5480: 5b 24 63 73 65 74 20 69 74 65 6d 73 5d 5d 0a 09  [$cset items]]..
5490: 20 7d 20 7b 54 68 65 20 66 72 61 67 6d 65 6e 74   } {The fragment
54a0: 73 20 64 6f 20 6e 6f 74 20 63 6f 76 65 72 20 74  s do not cover t
54b0: 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 68 61 6e  he original chan
54c0: 67 65 73 65 74 7d 0a 0a 09 73 65 74 20 69 20 31  geset}...set i 1
54d0: 0a 09 66 6f 72 65 61 63 68 20 66 69 61 20 24 66  ..foreach fia $f
54e0: 72 61 67 6d 65 6e 74 73 20 7b 0a 09 20 20 20 20  ragments {..    
54f0: 66 6f 72 65 61 63 68 20 66 69 62 20 5b 6c 72 61  foreach fib [lra
5500: 6e 67 65 20 24 66 72 61 67 6d 65 6e 74 73 20 24  nge $fragments $
5510: 69 20 65 6e 64 5d 20 7b 0a 09 09 69 6e 74 65 67  i end] {...integ
5520: 72 69 74 79 20 61 73 73 65 72 74 20 7b 0a 09 09  rity assert {...
5530: 20 20 20 20 5b 73 74 72 75 63 74 3a 3a 73 65 74      [struct::set
5540: 20 65 6d 70 74 79 20 5b 73 74 72 75 63 74 3a 3a   empty [struct::
5550: 73 65 74 20 69 6e 74 65 72 73 65 63 74 20 24 66  set intersect $f
5560: 69 61 20 24 66 69 62 5d 5d 0a 09 09 7d 20 7b 54  ia $fib]]...} {T
5570: 68 65 20 66 72 61 67 6d 65 6e 74 73 20 3c 24 66  he fragments <$f
5580: 69 61 3e 20 61 6e 64 20 3c 24 66 69 62 3e 20 6f  ia> and <$fib> o
5590: 76 65 72 6c 61 70 7d 0a 09 20 20 20 20 7d 0a 09  verlap}..    }..
55a0: 20 20 20 20 69 6e 63 72 20 69 0a 09 7d 0a 0a 09      incr i..}...
55b0: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20  return.    }..  
55c0: 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23    # # ## ### ###
55d0: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23  ## ######## ####
55e0: 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23  #########.    ##
55f0: 20 53 74 61 74 65 0a 0a 20 20 20 20 76 61 72 69   State..    vari
5600: 61 62 6c 65 20 6d 79 69 64 20 20 20 20 20 20 20  able myid       
5610: 20 7b 7d 20 3b 20 23 20 49 64 20 6f 66 20 74 68   {} ; # Id of th
5620: 65 20 63 73 65 74 20 66 6f 72 20 74 68 65 20 70  e cset for the p
5630: 65 72 73 69 73 74 65 6e 74 0a 09 09 09 20 20 20  ersistent....   
5640: 20 20 20 23 20 73 74 61 74 65 2e 0a 20 20 20 20     # state..    
5650: 76 61 72 69 61 62 6c 65 20 6d 79 70 72 6f 6a 65  variable myproje
5660: 63 74 20 20 20 7b 7d 20 3b 20 23 20 52 65 66 65  ct   {} ; # Refe
5670: 72 65 6e 63 65 20 6f 66 20 74 68 65 20 70 72 6f  rence of the pro
5680: 6a 65 63 74 20 6f 62 6a 65 63 74 20 74 68 65 0a  ject object the.
5690: 09 09 09 20 20 20 20 20 20 23 20 63 68 61 6e 67  ...      # chang
56a0: 65 73 65 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2e  eset belongs to.
56b0: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79  .    variable my
56c0: 74 79 70 65 20 20 20 20 20 20 7b 7d 20 3b 20 23  type      {} ; #
56d0: 20 57 68 61 74 20 74 68 65 20 63 68 61 6e 67 65   What the change
56e0: 73 65 74 20 69 73 20 62 61 73 65 64 20 6f 6e 0a  set is based on.
56f0: 09 09 09 20 20 20 20 20 20 23 20 28 72 65 76 69  ...      # (revi
5700: 73 69 6f 6e 73 2c 20 74 61 67 73 2c 20 6f 72 20  sions, tags, or 
5710: 62 72 61 6e 63 68 65 73 29 2e 0a 09 09 09 20 20  branches).....  
5720: 20 20 20 20 23 20 56 61 6c 75 65 73 3a 20 53 65      # Values: Se
5730: 65 20 6d 79 63 73 74 79 70 65 2e 20 4e 6f 74 65  e mycstype. Note
5740: 20 74 68 61 74 20 77 65 0a 09 09 09 20 20 20 20   that we....    
5750: 20 20 23 20 68 61 76 65 20 74 6f 20 6b 65 65 70    # have to keep
5760: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
5770: 65 20 68 65 6c 70 65 72 0a 09 09 09 20 20 20 20  e helper....    
5780: 20 20 23 20 73 69 6e 67 6c 65 74 6f 6e 73 20 69    # singletons i
5790: 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65 20  n sync with the 
57a0: 63 6f 6e 74 65 6e 74 73 0a 09 09 09 20 20 20 20  contents....    
57b0: 20 20 23 20 6f 66 20 73 74 61 74 65 20 74 61 62    # of state tab
57c0: 6c 65 20 27 63 73 74 79 70 65 27 2c 20 61 6e 64  le 'cstype', and
57d0: 20 76 61 72 69 6f 75 73 0a 09 09 09 20 20 20 20   various....    
57e0: 20 20 23 20 6f 74 68 65 72 20 70 6c 61 63 65 73    # other places
57f0: 20 75 73 69 6e 67 20 74 68 65 6d 20 68 61 72 64   using them hard
5800: 77 69 72 65 64 2e 0a 20 20 20 20 76 61 72 69 61  wired..    varia
5810: 62 6c 65 20 6d 79 74 79 70 65 6f 62 6a 20 20 20  ble mytypeobj   
5820: 7b 7d 20 3b 20 23 20 52 65 66 65 72 65 6e 63 65  {} ; # Reference
5830: 20 74 6f 20 74 68 65 20 63 6f 6e 74 61 69 6e 65   to the containe
5840: 72 20 66 6f 72 20 74 68 65 0a 09 09 09 20 20 20  r for the....   
5850: 20 20 20 23 20 74 79 70 65 20 64 65 70 65 6e 64     # type depend
5860: 65 6e 74 20 63 6f 64 65 2e 20 44 65 72 69 76 65  ent code. Derive
5870: 64 20 66 72 6f 6d 0a 09 09 09 20 20 20 20 20 20  d from....      
5880: 23 20 6d 79 74 79 70 65 2e 0a 20 20 20 20 76 61  # mytype..    va
5890: 72 69 61 62 6c 65 20 6d 79 73 72 63 69 64 20 20  riable mysrcid  
58a0: 20 20 20 7b 7d 20 3b 20 23 20 49 64 20 6f 66 20     {} ; # Id of 
58b0: 74 68 65 20 6d 65 74 61 64 61 74 61 20 6f 72 20  the metadata or 
58c0: 73 79 6d 62 6f 6c 20 74 68 65 20 63 73 65 74 0a  symbol the cset.
58d0: 09 09 09 20 20 20 20 20 20 23 20 69 73 20 62 61  ...      # is ba
58e0: 73 65 64 20 6f 6e 2e 0a 20 20 20 20 76 61 72 69  sed on..    vari
58f0: 61 62 6c 65 20 6d 79 69 74 65 6d 73 20 20 20 20  able myitems    
5900: 20 7b 7d 20 3b 20 23 20 4c 69 73 74 20 6f 66 20   {} ; # List of 
5910: 74 68 65 20 66 69 6c 65 20 6c 65 76 65 6c 20 72  the file level r
5920: 65 76 69 73 69 6f 6e 73 2c 0a 09 09 09 20 20 20  evisions,....   
5930: 20 20 20 23 20 74 61 67 73 2c 20 6f 72 20 62 72     # tags, or br
5940: 61 6e 63 68 65 73 20 69 6e 20 74 68 65 20 63 73  anches in the cs
5950: 65 74 2c 20 61 73 0a 09 09 09 20 20 20 20 20 20  et, as....      
5960: 23 20 69 64 73 2e 20 4e 6f 74 20 74 61 67 67 65  # ids. Not tagge
5970: 64 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20  d..    variable 
5980: 6d 79 74 69 74 65 6d 73 20 20 20 20 7b 7d 20 3b  mytitems    {} ;
5990: 20 23 20 41 73 20 6d 79 69 74 65 6d 73 2c 20 74   # As myitems, t
59a0: 68 65 20 74 61 67 67 65 64 20 66 6f 72 6d 2e 0a  he tagged form..
59b0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 70      variable myp
59c0: 6f 73 20 20 20 20 20 20 20 7b 7d 20 3b 20 23 20  os       {} ; # 
59d0: 43 6f 6d 6d 69 74 20 70 6f 73 69 74 69 6f 6e 20  Commit position 
59e0: 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  of the changeset
59f0: 2c 20 69 66 0a 09 09 09 20 20 20 20 20 20 23 20  , if....      # 
5a00: 6b 6e 6f 77 6e 2e 0a 0a 20 20 20 20 23 20 23 20  known...    # # 
5a10: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
5a20: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
5a30: 23 23 23 0a 20 20 20 20 23 23 20 49 6e 74 65 72  ###.    ## Inter
5a40: 6e 61 6c 20 6d 65 74 68 6f 64 73 0a 0a 20 20 20  nal methods..   
5a50: 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79   typevariable my
5a60: 63 6f 75 6e 74 65 72 20 20 20 20 20 20 20 20 30  counter        0
5a70: 20 3b 20 23 20 49 64 20 63 6f 75 6e 74 65 72 20   ; # Id counter 
5a80: 66 6f 72 20 63 73 65 74 73 2e 20 4c 61 73 74 20  for csets. Last 
5a90: 69 64 0a 09 09 09 09 20 20 20 20 20 20 23 20 75  id.....      # u
5aa0: 73 65 64 2e 0a 20 20 20 20 74 79 70 65 76 61 72  sed..    typevar
5ab0: 69 61 62 6c 65 20 6d 79 63 73 74 79 70 65 20 2d  iable mycstype -
5ac0: 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70  array {} ; # Map
5ad0: 20 63 73 74 79 70 65 73 20 28 6e 61 6d 65 73 29   cstypes (names)
5ae0: 20 74 6f 20 70 65 72 73 69 73 74 65 6e 74 0a 09   to persistent..
5af0: 09 09 09 20 20 20 20 20 20 23 20 69 64 73 2e 20  ...      # ids. 
5b00: 4e 6f 74 65 20 74 68 61 74 20 77 65 20 68 61 76  Note that we hav
5b10: 65 20 74 6f 20 6b 65 65 70 0a 09 09 09 09 20 20  e to keep.....  
5b20: 20 20 20 20 23 20 74 68 65 20 6e 61 6d 65 73 20      # the names 
5b30: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 27 63 73  in the table 'cs
5b40: 74 79 70 65 27 0a 09 09 09 09 20 20 20 20 20 20  type'.....      
5b50: 23 20 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74  # in sync with t
5b60: 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 0a  he names of the.
5b70: 09 09 09 09 20 20 20 20 20 20 23 20 68 65 6c 70  ....      # help
5b80: 65 72 20 73 69 6e 67 6c 65 74 6f 6e 73 2e 0a 0a  er singletons...
5b90: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69      typemethod i
5ba0: 6e 6f 72 64 65 72 20 7b 70 72 6f 6a 65 63 74 69  norder {projecti
5bb0: 64 7d 20 7b 0a 09 23 20 52 65 74 75 72 6e 20 61  d} {..# Return a
5bc0: 6c 6c 20 72 65 76 69 73 69 6f 6e 20 63 68 61 6e  ll revision chan
5bd0: 67 65 73 65 74 73 20 66 6f 72 20 74 68 65 20 73  gesets for the s
5be0: 70 65 63 69 66 69 65 64 20 70 72 6f 6a 65 63 74  pecified project
5bf0: 2c 20 69 6e 0a 09 23 20 74 68 65 20 6f 72 64 65  , in..# the orde
5c00: 72 20 67 69 76 65 6e 20 74 6f 20 74 68 65 6d 20  r given to them 
5c10: 62 79 20 74 68 65 20 73 6f 72 74 20 70 61 73 73  by the sort pass
5c20: 65 73 2e 20 42 6f 74 68 20 74 68 65 0a 09 23 20  es. Both the..# 
5c30: 66 69 6c 74 65 72 69 6e 67 20 62 79 20 70 72 6f  filtering by pro
5c40: 6a 65 63 74 20 61 6e 64 20 73 6f 72 74 69 6e 67  ject and sorting
5c50: 20 6d 61 6b 65 20 75 73 65 20 6f 66 20 27 70 72   make use of 'pr
5c60: 6f 6a 65 63 74 3a 3a 72 65 76 0a 09 23 20 72 65  oject::rev..# re
5c70: 76 27 20 69 6d 70 6f 73 73 69 62 6c 65 2e 0a 0a  v' impossible...
5c80: 09 73 65 74 20 72 65 73 20 7b 7d 0a 09 66 6f 72  .set res {}..for
5c90: 65 61 63 68 20 7b 63 69 64 20 63 64 61 74 65 7d  each {cid cdate}
5ca0: 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20   [state run {.. 
5cb0: 20 20 20 53 45 4c 45 43 54 20 43 2e 63 69 64 2c     SELECT C.cid,
5cc0: 20 54 2e 64 61 74 65 0a 09 20 20 20 20 46 52 4f   T.date..    FRO
5cd0: 4d 20 20 20 63 68 61 6e 67 65 73 65 74 20 43 2c  M   changeset C,
5ce0: 20 63 73 74 69 6d 65 73 74 61 6d 70 20 54 0a 09   cstimestamp T..
5cf0: 20 20 20 20 57 48 45 52 45 20 20 43 2e 74 79 70      WHERE  C.typ
5d00: 65 20 3d 20 30 20 20 20 20 20 20 20 20 20 20 2d  e = 0          -
5d10: 2d 20 6c 69 6d 69 74 20 74 6f 20 72 65 76 69 73  - limit to revis
5d20: 69 6f 6e 20 63 68 61 6e 67 65 73 65 74 73 0a 09  ion changesets..
5d30: 20 20 20 20 41 4e 44 20 20 20 20 43 2e 70 69 64      AND    C.pid
5d40: 20 20 3d 20 24 70 72 6f 6a 65 63 74 69 64 20 2d    = $projectid -
5d50: 2d 20 6c 69 6d 69 74 20 74 6f 20 63 68 61 6e 67  - limit to chang
5d60: 65 73 65 74 73 20 69 6e 20 70 72 6f 6a 65 63 74  esets in project
5d70: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 54 2e 63  ..    AND    T.c
5d80: 69 64 20 20 3d 20 43 2e 63 69 64 20 20 20 20 20  id  = C.cid     
5d90: 20 2d 2d 20 67 65 74 20 6f 72 64 65 72 69 6e 67   -- get ordering
5da0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 09 20 20   information..  
5db0: 20 20 4f 52 44 45 52 20 42 59 20 54 2e 64 61 74    ORDER BY T.dat
5dc0: 65 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20  e            -- 
5dd0: 73 6f 72 74 20 69 6e 74 6f 20 63 6f 6d 6d 69 74  sort into commit
5de0: 20 6f 72 64 65 72 0a 09 7d 5d 20 7b 0a 09 20 20   order..}] {..  
5df0: 20 20 6c 61 70 70 65 6e 64 20 72 65 73 20 24 6d    lappend res $m
5e00: 79 69 64 6d 61 70 28 24 63 69 64 29 20 24 63 64  yidmap($cid) $cd
5e10: 61 74 65 0a 09 7d 0a 09 72 65 74 75 72 6e 20 24  ate..}..return $
5e20: 72 65 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  res.    }..    t
5e30: 79 70 65 6d 65 74 68 6f 64 20 67 65 74 63 73 74  ypemethod getcst
5e40: 79 70 65 73 20 7b 7d 20 7b 0a 09 66 6f 72 65 61  ypes {} {..forea
5e50: 63 68 20 7b 74 69 64 20 6e 61 6d 65 7d 20 5b 73  ch {tid name} [s
5e60: 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20  tate run {..    
5e70: 53 45 4c 45 43 54 20 74 69 64 2c 20 6e 61 6d 65  SELECT tid, name
5e80: 20 46 52 4f 4d 20 63 73 74 79 70 65 3b 0a 09 7d   FROM cstype;..}
5e90: 5d 20 7b 20 73 65 74 20 6d 79 63 73 74 79 70 65  ] { set mycstype
5ea0: 28 24 6e 61 6d 65 29 20 24 74 69 64 20 7d 0a 09  ($name) $tid }..
5eb0: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20  return.    }..  
5ec0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c 6f 61    typemethod loa
5ed0: 64 20 7b 72 65 70 6f 73 69 74 6f 72 79 7d 20 7b  d {repository} {
5ee0: 0a 09 73 65 74 20 6e 20 30 0a 09 6c 6f 67 20 77  ..set n 0..log w
5ef0: 72 69 74 65 20 32 20 63 73 65 74 73 20 7b 4c 6f  rite 2 csets {Lo
5f00: 61 64 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65  ading the change
5f10: 73 65 74 73 7d 0a 09 66 6f 72 65 61 63 68 20 7b  sets}..foreach {
5f20: 69 64 20 70 69 64 20 63 73 74 79 70 65 20 73 72  id pid cstype sr
5f30: 63 69 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20  cid} [state run 
5f40: 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 43 2e  {..    SELECT C.
5f50: 63 69 64 2c 20 43 2e 70 69 64 2c 20 43 53 2e 6e  cid, C.pid, CS.n
5f60: 61 6d 65 2c 20 43 2e 73 72 63 0a 09 20 20 20 20  ame, C.src..    
5f70: 46 52 4f 4d 20 20 20 63 68 61 6e 67 65 73 65 74  FROM   changeset
5f80: 20 43 2c 20 63 73 74 79 70 65 20 43 53 0a 09 20   C, cstype CS.. 
5f90: 20 20 20 57 48 45 52 45 20 20 43 2e 74 79 70 65     WHERE  C.type
5fa0: 20 3d 20 43 53 2e 74 69 64 0a 09 20 20 20 20 4f   = CS.tid..    O
5fb0: 52 44 45 52 20 42 59 20 43 2e 63 69 64 0a 09 7d  RDER BY C.cid..}
5fc0: 5d 20 7b 0a 09 20 20 20 20 6c 6f 67 20 70 72 6f  ] {..    log pro
5fd0: 67 72 65 73 73 20 32 20 63 73 65 74 73 20 24 6e  gress 2 csets $n
5fe0: 20 7b 7d 0a 09 20 20 20 20 73 65 74 20 72 20 5b   {}..    set r [
5ff0: 24 74 79 70 65 20 25 41 55 54 4f 25 20 5b 24 72  $type %AUTO% [$r
6000: 65 70 6f 73 69 74 6f 72 79 20 70 72 6f 6a 65 63  epository projec
6010: 74 6f 66 20 24 70 69 64 5d 20 24 63 73 74 79 70  tof $pid] $cstyp
6020: 65 20 24 73 72 63 69 64 20 5b 73 74 61 74 65 20  e $srcid [state 
6030: 72 75 6e 20 7b 0a 09 09 53 45 4c 45 43 54 20 43  run {...SELECT C
6040: 2e 69 69 64 0a 09 09 46 52 4f 4d 20 20 20 63 73  .iid...FROM   cs
6050: 69 74 65 6d 20 43 0a 09 09 57 48 45 52 45 20 20  item C...WHERE  
6060: 43 2e 63 69 64 20 3d 20 24 69 64 0a 09 09 4f 52  C.cid = $id...OR
6070: 44 45 52 20 42 59 20 43 2e 70 6f 73 0a 09 20 20  DER BY C.pos..  
6080: 20 20 7d 5d 20 24 69 64 5d 0a 09 20 20 20 20 69    }] $id]..    i
6090: 6e 63 72 20 6e 0a 09 7d 0a 09 72 65 74 75 72 6e  ncr n..}..return
60a0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65  .    }..    type
60b0: 6d 65 74 68 6f 64 20 6c 6f 61 64 63 6f 75 6e 74  method loadcount
60c0: 65 72 20 7b 7d 20 7b 0a 09 23 20 49 6e 69 74 69  er {} {..# Initi
60d0: 61 6c 69 7a 65 20 74 68 65 20 63 6f 75 6e 74 65  alize the counte
60e0: 72 20 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65  r from the state
60f0: 0a 09 6c 6f 67 20 77 72 69 74 65 20 32 20 63 73  ..log write 2 cs
6100: 65 74 73 20 7b 4c 6f 61 64 69 6e 67 20 63 68 61  ets {Loading cha
6110: 6e 67 65 73 65 74 20 63 6f 75 6e 74 65 72 7d 0a  ngeset counter}.
6120: 09 73 65 74 20 6d 79 63 6f 75 6e 74 65 72 20 5b  .set mycounter [
6130: 73 74 61 74 65 20 6f 6e 65 20 7b 20 53 45 4c 45  state one { SELE
6140: 43 54 20 4d 41 58 28 63 69 64 29 20 46 52 4f 4d  CT MAX(cid) FROM
6150: 20 63 68 61 6e 67 65 73 65 74 20 7d 5d 0a 09 72   changeset }]..r
6160: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
6170: 20 74 79 70 65 6d 65 74 68 6f 64 20 6e 75 6d 20   typemethod num 
6180: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 63  {} { return $myc
6190: 6f 75 6e 74 65 72 20 7d 0a 0a 20 20 20 20 70 72  ounter }..    pr
61a0: 6f 63 20 49 6e 69 74 69 61 6c 69 7a 65 42 72 65  oc InitializeBre
61b0: 61 6b 53 74 61 74 65 20 7b 72 65 76 69 73 69 6f  akState {revisio
61c0: 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 70  ns} {..upvar 1 p
61d0: 6f 73 20 70 6f 73 20 63 72 6f 73 73 20 63 72 6f  os pos cross cro
61e0: 73 73 20 72 61 6e 67 65 20 72 61 6e 67 65 20 64  ss range range d
61f0: 65 70 63 20 64 65 70 63 20 64 65 6c 74 61 20 64  epc depc delta d
6200: 65 6c 74 61 20 5c 0a 09 20 20 20 20 64 65 70 65  elta \..    depe
6210: 6e 64 65 6e 63 69 65 73 20 64 65 70 65 6e 64 65  ndencies depende
6220: 6e 63 69 65 73 0a 0a 09 23 20 46 69 72 73 74 20  ncies...# First 
6230: 77 65 20 63 72 65 61 74 65 20 61 20 6d 61 70 20  we create a map 
6240: 6f 66 20 70 6f 73 69 74 69 6f 6e 73 20 74 6f 20  of positions to 
6250: 6d 61 6b 65 20 69 74 20 65 61 73 69 65 72 20 74  make it easier t
6260: 6f 0a 09 23 20 64 65 74 65 72 6d 69 6e 65 20 77  o..# determine w
6270: 68 65 74 68 65 72 20 61 20 64 65 70 65 6e 64 65  hether a depende
6280: 6e 63 79 20 63 72 6f 73 73 65 73 20 61 20 70 61  ncy crosses a pa
6290: 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 2e 0a  rticular index..
62a0: 0a 09 61 72 72 61 79 20 73 65 74 20 70 6f 73 20  ..array set pos 
62b0: 20 20 7b 7d 0a 09 61 72 72 61 79 20 73 65 74 20    {}..array set 
62c0: 63 72 6f 73 73 20 7b 7d 0a 09 61 72 72 61 79 20  cross {}..array 
62d0: 73 65 74 20 64 65 70 63 20 20 7b 7d 0a 09 73 65  set depc  {}..se
62e0: 74 20 72 61 6e 67 65 20 20 20 20 20 20 20 7b 7d  t range       {}
62f0: 0a 09 73 65 74 20 6e 20 30 0a 09 66 6f 72 65 61  ..set n 0..forea
6300: 63 68 20 72 65 76 20 24 72 65 76 69 73 69 6f 6e  ch rev $revision
6310: 73 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64  s {..    lappend
6320: 20 72 61 6e 67 65 20 24 6e 0a 09 20 20 20 20 73   range $n..    s
6330: 65 74 20 70 6f 73 28 24 72 65 76 29 20 24 6e 0a  et pos($rev) $n.
6340: 09 20 20 20 20 73 65 74 20 63 72 6f 73 73 28 24  .    set cross($
6350: 6e 29 20 30 0a 09 20 20 20 20 69 6e 63 72 20 6e  n) 0..    incr n
6360: 0a 09 7d 0a 0a 09 23 20 53 65 63 6f 6e 64 6c 79  ..}...# Secondly
6370: 20 77 65 20 63 6f 75 6e 74 20 74 68 65 20 63 72   we count the cr
6380: 6f 73 73 69 6e 67 73 20 70 65 72 20 70 6f 73 69  ossings per posi
6390: 74 69 6f 6e 2c 20 62 79 20 69 74 65 72 61 74 69  tion, by iterati
63a0: 6e 67 0a 09 23 20 6f 76 65 72 20 74 68 65 20 72  ng..# over the r
63b0: 65 63 6f 72 64 65 64 20 69 6e 74 65 72 6e 61 6c  ecorded internal
63c0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 0a 0a   dependencies...
63d0: 09 23 20 4e 6f 74 65 3a 20 49 66 20 74 68 65 20  .# Note: If the 
63e0: 74 69 6d 65 73 74 61 6d 70 73 20 61 72 65 20 62  timestamps are b
63f0: 61 64 6c 79 20 6f 75 74 20 6f 66 20 6f 72 64 65  adly out of orde
6400: 72 20 69 74 20 69 73 0a 09 23 20 20 20 20 20 20  r it is..#      
6410: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76   possible to hav
6420: 65 20 61 20 62 61 63 6b 77 61 72 64 20 73 75 63  e a backward suc
6430: 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63  cessor dependenc
6440: 79 2c 0a 09 23 20 20 20 20 20 20 20 69 2e 65 2e  y,..#       i.e.
6450: 20 77 69 74 68 20 73 74 61 72 74 20 3e 20 65 6e   with start > en
6460: 64 2e 20 57 65 20 6d 61 79 20 68 61 76 65 20 74  d. We may have t
6470: 6f 20 73 77 61 70 20 74 68 65 20 69 6e 64 69 63  o swap the indic
6480: 65 73 0a 09 23 20 20 20 20 20 20 20 74 6f 20 65  es..#       to e
6490: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 66  nsure that the f
64a0: 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75  ollowing loop ru
64b0: 6e 73 20 63 6f 72 72 65 63 74 6c 79 2e 0a 09 23  ns correctly...#
64c0: 0a 09 23 20 4e 6f 74 65 20 32 3a 20 73 74 61 72  ..# Note 2: star
64d0: 74 20 3d 3d 20 65 6e 64 20 69 73 20 6e 6f 74 20  t == end is not 
64e0: 70 6f 73 73 69 62 6c 65 2e 20 49 74 20 69 6e 64  possible. It ind
64f0: 69 63 61 74 65 73 20 61 0a 09 23 20 20 20 20 20  icates a..#     
6500: 20 20 20 20 73 65 6c 66 2d 64 65 70 65 6e 64 65      self-depende
6510: 6e 63 79 20 64 75 65 20 74 6f 20 74 68 65 20 75  ncy due to the u
6520: 6e 69 71 75 65 6e 65 73 73 20 6f 66 20 70 6f 73  niqueness of pos
6530: 69 74 69 6f 6e 73 2c 0a 09 23 20 20 20 20 20 20  itions,..#      
6540: 20 20 20 61 6e 64 20 74 68 61 74 20 69 73 20 73     and that is s
6550: 6f 6d 65 74 68 69 6e 67 20 77 65 20 68 61 76 65  omething we have
6560: 20 72 75 6c 65 64 20 6f 75 74 20 61 6c 72 65 61   ruled out alrea
6570: 64 79 2c 20 73 65 65 0a 09 23 20 20 20 20 20 20  dy, see..#      
6580: 20 20 20 27 72 65 76 20 69 6e 74 65 72 6e 61 6c     'rev internal
6590: 73 75 63 63 65 73 73 6f 72 73 27 2e 0a 0a 09 66  successors'....f
65a0: 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c  oreach {rid chil
65b0: 64 72 65 6e 7d 20 5b 61 72 72 61 79 20 67 65 74  dren} [array get
65c0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 5d 20 7b   dependencies] {
65d0: 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 63 68  ..    foreach ch
65e0: 69 6c 64 20 24 63 68 69 6c 64 72 65 6e 20 7b 0a  ild $children {.
65f0: 09 09 73 65 74 20 64 6b 65 79 20 20 20 20 5b 6c  ..set dkey    [l
6600: 69 73 74 20 24 72 69 64 20 24 63 68 69 6c 64 5d  ist $rid $child]
6610: 0a 09 09 73 65 74 20 73 74 61 72 74 20 20 20 24  ...set start   $
6620: 70 6f 73 28 24 72 69 64 29 0a 09 09 73 65 74 20  pos($rid)...set 
6630: 65 6e 64 20 20 20 20 20 24 70 6f 73 28 24 63 68  end     $pos($ch
6640: 69 6c 64 29 0a 09 09 73 65 74 20 63 72 6f 73 73  ild)...set cross
6650: 65 73 20 7b 7d 0a 0a 09 09 69 66 20 7b 24 73 74  es {}....if {$st
6660: 61 72 74 20 3e 20 24 65 6e 64 7d 20 7b 0a 09 09  art > $end} {...
6670: 20 20 20 20 77 68 69 6c 65 20 7b 24 65 6e 64 20      while {$end 
6680: 3c 20 24 73 74 61 72 74 7d 20 7b 0a 09 09 09 6c  < $start} {....l
6690: 61 70 70 65 6e 64 20 63 72 6f 73 73 65 73 20 24  append crosses $
66a0: 65 6e 64 0a 09 09 09 69 6e 63 72 20 63 72 6f 73  end....incr cros
66b0: 73 28 24 65 6e 64 29 0a 09 09 09 69 6e 63 72 20  s($end)....incr 
66c0: 65 6e 64 0a 09 09 20 20 20 20 7d 0a 09 09 7d 20  end...    }...} 
66d0: 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 77 68 69  else {...    whi
66e0: 6c 65 20 7b 24 73 74 61 72 74 20 3c 20 24 65 6e  le {$start < $en
66f0: 64 7d 20 7b 0a 09 09 09 6c 61 70 70 65 6e 64 20  d} {....lappend 
6700: 63 72 6f 73 73 65 73 20 24 73 74 61 72 74 0a 09  crosses $start..
6710: 09 09 69 6e 63 72 20 63 72 6f 73 73 28 24 73 74  ..incr cross($st
6720: 61 72 74 29 0a 09 09 09 69 6e 63 72 20 73 74 61  art)....incr sta
6730: 72 74 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09  rt...    }...}..
6740: 09 73 65 74 20 64 65 70 63 28 24 64 6b 65 79 29  .set depc($dkey)
6750: 20 24 63 72 6f 73 73 65 73 0a 09 20 20 20 20 7d   $crosses..    }
6760: 0a 09 7d 0a 0a 09 49 6e 69 74 69 61 6c 69 7a 65  ..}...Initialize
6770: 44 65 6c 74 61 73 20 24 72 65 76 69 73 69 6f 6e  Deltas $revision
6780: 73 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  s..return.    }.
6790: 0a 20 20 20 20 70 72 6f 63 20 49 6e 69 74 69 61  .    proc Initia
67a0: 6c 69 7a 65 44 65 6c 74 61 73 20 7b 72 65 76 69  lizeDeltas {revi
67b0: 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20  sions} {..upvar 
67c0: 31 20 64 65 6c 74 61 20 64 65 6c 74 61 0a 0a 09  1 delta delta...
67d0: 23 20 50 75 6c 6c 20 74 68 65 20 74 69 6d 65 73  # Pull the times
67e0: 74 61 6d 70 73 20 66 6f 72 20 61 6c 6c 20 72 65  tamps for all re
67f0: 76 69 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 63  visions in the c
6800: 68 61 6e 67 65 73 65 74 73 20 61 6e 64 0a 09 23  hangesets and..#
6810: 20 63 6f 6d 70 75 74 65 20 74 68 65 69 72 20 64   compute their d
6820: 65 6c 74 61 73 20 66 6f 72 20 75 73 65 20 62 79  eltas for use by
6830: 20 74 68 65 20 62 72 65 61 6b 20 66 69 6e 64 65   the break finde
6840: 72 2e 0a 0a 09 61 72 72 61 79 20 73 65 74 20 64  r....array set d
6850: 65 6c 74 61 20 7b 7d 0a 09 61 72 72 61 79 20 73  elta {}..array s
6860: 65 74 20 73 74 61 6d 70 20 7b 7d 0a 0a 09 73 65  et stamp {}...se
6870: 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e  t theset ('[join
6880: 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27   $revisions {','
6890: 7d 5d 27 29 0a 09 66 6f 72 65 61 63 68 20 7b 72  }]')..foreach {r
68a0: 69 64 20 74 69 6d 65 7d 20 5b 73 74 61 74 65 20  id time} [state 
68b0: 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f  run [subst -noco
68c0: 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c  mmands -nobacksl
68d0: 61 73 68 65 73 20 7b 0a 09 20 20 20 20 53 45 4c  ashes {..    SEL
68e0: 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 64 61 74  ECT R.rid, R.dat
68f0: 65 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69  e..    FROM revi
6900: 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52  sion R..    WHER
6910: 45 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73  E R.rid IN $thes
6920: 65 74 0a 09 7d 5d 5d 20 7b 0a 09 20 20 20 20 73  et..}]] {..    s
6930: 65 74 20 73 74 61 6d 70 28 24 72 69 64 29 20 24  et stamp($rid) $
6940: 74 69 6d 65 0a 09 7d 0a 0a 09 73 65 74 20 6e 20  time..}...set n 
6950: 30 0a 09 66 6f 72 65 61 63 68 20 72 69 64 20 5b  0..foreach rid [
6960: 6c 72 61 6e 67 65 20 24 72 65 76 69 73 69 6f 6e  lrange $revision
6970: 73 20 30 20 65 6e 64 2d 31 5d 20 72 6e 65 78 74  s 0 end-1] rnext
6980: 20 5b 6c 72 61 6e 67 65 20 24 72 65 76 69 73 69   [lrange $revisi
6990: 6f 6e 73 20 31 20 65 6e 64 5d 20 7b 0a 09 20 20  ons 1 end] {..  
69a0: 20 20 73 65 74 20 64 65 6c 74 61 28 24 6e 29 20    set delta($n) 
69b0: 5b 65 78 70 72 20 7b 24 73 74 61 6d 70 28 24 72  [expr {$stamp($r
69c0: 6e 65 78 74 29 20 2d 20 24 73 74 61 6d 70 28 24  next) - $stamp($
69d0: 72 69 64 29 7d 5d 0a 09 20 20 20 20 69 6e 63 72  rid)}]..    incr
69e0: 20 6e 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20   n..}..return.  
69f0: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 46 69    }..    proc Fi
6a00: 6e 64 42 65 73 74 42 72 65 61 6b 20 7b 72 61 6e  ndBestBreak {ran
6a10: 67 65 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 63  ge} {..upvar 1 c
6a20: 72 6f 73 73 20 63 72 6f 73 73 20 64 65 6c 74 61  ross cross delta
6a30: 20 64 65 6c 74 61 0a 0a 09 23 20 44 65 74 65 72   delta...# Deter
6a40: 6d 69 6e 65 20 74 68 65 20 62 65 73 74 20 62 72  mine the best br
6a50: 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 69 6e 20  eak location in 
6a60: 74 68 65 20 67 69 76 65 6e 20 72 61 6e 67 65 20  the given range 
6a70: 6f 66 0a 09 23 20 70 6f 73 69 74 69 6f 6e 73 2e  of..# positions.
6a80: 20 46 69 72 73 74 20 77 65 20 6c 6f 6f 6b 20 66   First we look f
6a90: 6f 72 20 74 68 65 20 6c 6f 63 61 74 69 6f 6e 73  or the locations
6aa0: 20 77 69 74 68 20 74 68 65 20 6d 61 78 69 6d 61   with the maxima
6ab0: 6c 0a 09 23 20 6e 75 6d 62 65 72 20 6f 66 20 63  l..# number of c
6ac0: 72 6f 73 73 69 6e 67 73 2e 20 49 66 20 74 68 65  rossings. If the
6ad0: 72 65 20 61 72 65 20 73 65 76 65 72 61 6c 20 77  re are several w
6ae0: 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 68 65 0a 09  e look for the..
6af0: 23 20 73 68 6f 72 74 65 73 74 20 74 69 6d 65 20  # shortest time 
6b00: 69 6e 74 65 72 76 61 6c 20 61 6d 6f 6e 67 20 74  interval among t
6b10: 68 65 6d 2e 20 49 66 20 77 65 20 73 74 69 6c 6c  hem. If we still
6b20: 20 68 61 76 65 20 6d 75 6c 74 69 70 6c 65 0a 09   have multiple..
6b30: 23 20 70 6f 73 73 69 62 69 6c 69 74 69 65 73 20  # possibilities 
6b40: 61 66 74 65 72 20 74 68 61 74 20 77 65 20 73 65  after that we se
6b50: 6c 65 63 74 20 74 68 65 20 65 61 72 6c 69 65 73  lect the earlies
6b60: 74 20 6c 6f 63 61 74 69 6f 6e 0a 09 23 20 61 6d  t location..# am
6b70: 6f 6e 67 20 74 68 65 73 65 2e 0a 0a 09 23 20 4e  ong these....# N
6b80: 6f 74 65 3a 20 49 66 20 74 68 65 20 6d 61 78 69  ote: If the maxi
6b90: 6d 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 63 72  mal number of cr
6ba0: 6f 73 73 69 6e 67 73 20 69 73 20 30 20 74 68 65  ossings is 0 the
6bb0: 6e 20 74 68 65 20 72 61 6e 67 65 0a 09 23 20 20  n the range..#  
6bc0: 20 20 20 20 20 68 61 73 20 6e 6f 20 69 6e 74 65       has no inte
6bd0: 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65  rnal dependencie
6be0: 73 2c 20 61 6e 64 20 6e 6f 20 62 72 65 61 6b 20  s, and no break 
6bf0: 6c 6f 63 61 74 69 6f 6e 20 61 74 0a 09 23 20 20  location at..#  
6c00: 20 20 20 20 20 61 6c 6c 2e 20 54 68 69 73 20 70       all. This p
6c10: 6f 73 73 69 62 69 6c 69 74 79 20 69 73 20 73 69  ossibility is si
6c20: 67 6e 61 6c 65 64 20 76 69 61 20 72 65 73 75 6c  gnaled via resul
6c30: 74 20 2d 31 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20  t -1....# Note: 
6c40: 41 20 72 61 6e 67 65 20 6f 66 20 6c 65 6e 67 74  A range of lengt
6c50: 68 20 31 20 6f 72 20 6c 65 73 73 20 63 61 6e 6e  h 1 or less cann
6c60: 6f 74 20 68 61 76 65 20 69 6e 74 65 72 6e 61 6c  ot have internal
6c70: 0a 09 23 20 20 20 20 20 20 20 64 65 70 65 6e 64  ..#       depend
6c80: 65 6e 63 69 65 73 2c 20 61 73 20 74 68 61 74 20  encies, as that 
6c90: 6e 65 65 64 73 20 61 74 20 6c 65 61 73 74 20 74  needs at least t
6ca0: 77 6f 20 72 65 76 69 73 69 6f 6e 73 20 69 6e 0a  wo revisions in.
6cb0: 09 23 20 20 20 20 20 20 20 74 68 65 20 72 61 6e  .#       the ran
6cc0: 67 65 2e 0a 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67  ge....if {[lleng
6cd0: 74 68 20 24 72 61 6e 67 65 5d 20 3c 20 32 7d 20  th $range] < 2} 
6ce0: 7b 20 72 65 74 75 72 6e 20 2d 31 20 7d 0a 0a 09  { return -1 }...
6cf0: 73 65 74 20 6d 61 78 20 2d 31 0a 09 73 65 74 20  set max -1..set 
6d00: 62 65 73 74 20 7b 7d 0a 0a 09 66 6f 72 65 61 63  best {}...foreac
6d10: 68 20 6c 6f 63 61 74 69 6f 6e 20 24 72 61 6e 67  h location $rang
6d20: 65 20 7b 0a 09 20 20 20 20 73 65 74 20 63 72 6f  e {..    set cro
6d30: 73 73 69 6e 67 73 20 24 63 72 6f 73 73 28 24 6c  ssings $cross($l
6d40: 6f 63 61 74 69 6f 6e 29 0a 09 20 20 20 20 69 66  ocation)..    if
6d50: 20 7b 24 63 72 6f 73 73 69 6e 67 73 20 3e 20 24   {$crossings > $
6d60: 6d 61 78 7d 20 7b 0a 09 09 73 65 74 20 6d 61 78  max} {...set max
6d70: 20 20 24 63 72 6f 73 73 69 6e 67 73 0a 09 09 73    $crossings...s
6d80: 65 74 20 62 65 73 74 20 5b 6c 69 73 74 20 24 6c  et best [list $l
6d90: 6f 63 61 74 69 6f 6e 5d 0a 09 09 63 6f 6e 74 69  ocation]...conti
6da0: 6e 75 65 0a 09 20 20 20 20 7d 20 65 6c 73 65 69  nue..    } elsei
6db0: 66 20 7b 24 63 72 6f 73 73 69 6e 67 73 20 3d 3d  f {$crossings ==
6dc0: 20 24 6d 61 78 7d 20 7b 0a 09 09 6c 61 70 70 65   $max} {...lappe
6dd0: 6e 64 20 62 65 73 74 20 24 6c 6f 63 61 74 69 6f  nd best $locatio
6de0: 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66  n..    }..}...if
6df0: 20 7b 24 6d 61 78 20 3d 3d 20 30 7d 20 20 20 20   {$max == 0}    
6e00: 20 20 20 20 20 20 20 20 7b 20 72 65 74 75 72 6e          { return
6e10: 20 2d 31 20 7d 0a 09 69 66 20 7b 5b 6c 6c 65 6e   -1 }..if {[llen
6e20: 67 74 68 20 24 62 65 73 74 5d 20 3d 3d 20 31 7d  gth $best] == 1}
6e30: 20 7b 20 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65   { return [linde
6e40: 78 20 24 62 65 73 74 20 30 5d 20 7d 0a 0a 09 73  x $best 0] }...s
6e50: 65 74 20 6c 6f 63 61 74 69 6f 6e 73 20 24 62 65  et locations $be
6e60: 73 74 0a 09 73 65 74 20 62 65 73 74 20 7b 7d 0a  st..set best {}.
6e70: 09 73 65 74 20 6d 69 6e 20 2d 31 0a 0a 09 66 6f  .set min -1...fo
6e80: 72 65 61 63 68 20 6c 6f 63 61 74 69 6f 6e 20 24  reach location $
6e90: 6c 6f 63 61 74 69 6f 6e 73 20 7b 0a 09 20 20 20  locations {..   
6ea0: 20 73 65 74 20 69 6e 74 65 72 76 61 6c 20 24 64   set interval $d
6eb0: 65 6c 74 61 28 24 6c 6f 63 61 74 69 6f 6e 29 0a  elta($location).
6ec0: 09 20 20 20 20 69 66 20 7b 28 24 6d 69 6e 20 3c  .    if {($min <
6ed0: 20 30 29 20 7c 7c 20 28 24 69 6e 74 65 72 76 61   0) || ($interva
6ee0: 6c 20 3c 20 24 6d 69 6e 29 7d 20 7b 0a 09 09 73  l < $min)} {...s
6ef0: 65 74 20 6d 69 6e 20 20 24 69 6e 74 65 72 76 61  et min  $interva
6f00: 6c 0a 09 09 73 65 74 20 62 65 73 74 20 5b 6c 69  l...set best [li
6f10: 73 74 20 24 6c 6f 63 61 74 69 6f 6e 5d 0a 09 20  st $location].. 
6f20: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 69 6e     } elseif {$in
6f30: 74 65 72 76 61 6c 20 3d 3d 20 24 6d 69 6e 7d 20  terval == $min} 
6f40: 7b 0a 09 09 6c 61 70 70 65 6e 64 20 62 65 73 74  {...lappend best
6f50: 20 24 6c 6f 63 61 74 69 6f 6e 0a 09 20 20 20 20   $location..    
6f60: 7d 0a 09 7d 0a 0a 09 69 66 20 7b 5b 6c 6c 65 6e  }..}...if {[llen
6f70: 67 74 68 20 24 62 65 73 74 5d 20 3d 3d 20 31 7d  gth $best] == 1}
6f80: 20 7b 20 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65   { return [linde
6f90: 78 20 24 62 65 73 74 20 30 5d 20 7d 0a 0a 09 72  x $best 0] }...r
6fa0: 65 74 75 72 6e 20 5b 6c 69 6e 64 65 78 20 5b 6c  eturn [lindex [l
6fb0: 73 6f 72 74 20 2d 69 6e 74 65 67 65 72 20 2d 69  sort -integer -i
6fc0: 6e 63 72 65 61 73 69 6e 67 20 24 62 65 73 74 5d  ncreasing $best]
6fd0: 20 30 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70   0].    }..    p
6fe0: 72 6f 63 20 43 75 74 41 74 20 7b 6c 6f 63 61 74  roc CutAt {locat
6ff0: 69 6f 6e 7d 20 7b 0a 09 75 70 76 61 72 20 31 20  ion} {..upvar 1 
7000: 63 72 6f 73 73 20 63 72 6f 73 73 20 64 65 70 63  cross cross depc
7010: 20 64 65 70 63 0a 0a 09 23 20 49 74 20 77 61 73   depc...# It was
7020: 20 64 65 63 69 64 65 64 20 74 6f 20 73 70 6c 69   decided to spli
7030: 74 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20  t the changeset 
7040: 61 74 20 74 68 65 20 67 69 76 65 6e 0a 09 23 20  at the given..# 
7050: 6c 6f 63 61 74 69 6f 6e 2e 20 54 68 69 73 20 63  location. This c
7060: 75 74 73 20 61 20 6e 75 6d 62 65 72 20 6f 66 20  uts a number of 
7070: 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 48 65  dependencies. He
7080: 72 65 20 77 65 20 75 70 64 61 74 65 0a 09 23 20  re we update..# 
7090: 74 68 65 20 63 72 6f 73 73 20 69 6e 66 6f 72 6d  the cross inform
70a0: 61 74 69 6f 6e 20 73 6f 20 74 68 61 74 20 74 68  ation so that th
70b0: 65 20 62 72 65 61 6b 20 66 69 6e 64 65 72 20 68  e break finder h
70c0: 61 73 20 61 63 63 75 72 61 74 65 0a 09 23 20 64  as accurate..# d
70d0: 61 74 61 20 77 68 65 6e 20 77 65 20 6c 6f 6f 6b  ata when we look
70e0: 20 61 74 20 74 68 65 20 67 65 6e 65 72 61 74 65   at the generate
70f0: 64 20 66 72 61 67 6d 65 6e 74 73 2e 0a 0a 09 73  d fragments....s
7100: 65 74 20 73 69 78 20 5b 6c 6f 67 20 76 69 73 69  et six [log visi
7110: 62 6c 65 3f 20 36 5d 0a 0a 09 66 6f 72 65 61 63  ble? 6]...foreac
7120: 68 20 7b 64 65 70 20 72 61 6e 67 65 7d 20 5b 61  h {dep range} [a
7130: 72 72 61 79 20 67 65 74 20 64 65 70 63 5d 20 7b  rray get depc] {
7140: 0a 09 20 20 20 20 23 20 43 68 65 63 6b 20 61 6c  ..    # Check al
7150: 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 73  l dependencies s
7160: 74 69 6c 6c 20 6b 6e 6f 77 6e 2c 20 74 61 6b 65  till known, take
7170: 20 74 68 65 69 72 20 72 61 6e 67 65 20 61 6e 64   their range and
7180: 0a 09 20 20 20 20 23 20 73 65 65 20 69 66 20 74  ..    # see if t
7190: 68 65 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f  he break locatio
71a0: 6e 20 66 61 6c 6c 73 20 77 69 74 68 69 6e 2e 0a  n falls within..
71b0: 0a 09 20 20 20 20 42 6f 72 64 65 72 20 24 72 61  ..    Border $ra
71c0: 6e 67 65 20 73 20 65 0a 09 20 20 20 20 69 66 20  nge s e..    if 
71d0: 7b 24 6c 6f 63 61 74 69 6f 6e 20 3c 20 24 73 7d  {$location < $s}
71e0: 20 63 6f 6e 74 69 6e 75 65 20 3b 20 23 20 62 72   continue ; # br
71f0: 65 61 6b 20 62 65 66 6f 72 65 20 72 61 6e 67 65  eak before range
7200: 2c 20 69 67 6e 6f 72 65 0a 09 20 20 20 20 69 66  , ignore..    if
7210: 20 7b 24 6c 6f 63 61 74 69 6f 6e 20 3e 20 24 65   {$location > $e
7220: 7d 20 63 6f 6e 74 69 6e 75 65 20 3b 20 23 20 62  } continue ; # b
7230: 72 65 61 6b 20 61 66 74 65 72 20 72 61 6e 67 65  reak after range
7240: 2c 20 69 67 6e 6f 72 65 2e 0a 0a 09 20 20 20 20  , ignore....    
7250: 23 20 54 68 69 73 20 64 65 70 65 6e 64 65 6e 63  # This dependenc
7260: 79 20 63 72 6f 73 73 65 73 20 74 68 65 20 62 72  y crosses the br
7270: 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 2e 20 57 65  eak location. We
7280: 20 72 65 6d 6f 76 65 20 69 74 0a 09 20 20 20 20   remove it..    
7290: 23 20 66 72 6f 6d 20 74 68 65 20 63 72 6f 73 73  # from the cross
72a0: 69 6e 67 73 20 63 6f 75 6e 74 65 72 73 2c 20 61  ings counters, a
72b0: 6e 64 20 74 68 65 6e 20 61 6c 73 6f 20 66 72 6f  nd then also fro
72c0: 6d 20 74 68 65 20 73 65 74 0a 09 20 20 20 20 23  m the set..    #
72d0: 20 6f 66 20 6b 6e 6f 77 6e 20 64 65 70 65 6e 64   of known depend
72e0: 65 6e 63 69 65 73 2c 20 61 73 20 77 65 20 61 72  encies, as we ar
72f0: 65 20 64 6f 6e 65 20 77 69 74 68 20 69 74 2e 0a  e done with it..
7300: 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 6c 6f  ..    foreach lo
7310: 63 20 24 64 65 70 63 28 24 64 65 70 29 20 7b 20  c $depc($dep) { 
7320: 69 6e 63 72 20 63 72 6f 73 73 28 24 6c 6f 63 29  incr cross($loc)
7330: 20 2d 31 20 7d 0a 09 20 20 20 20 75 6e 73 65 74   -1 }..    unset
7340: 20 64 65 70 63 28 24 64 65 70 29 0a 0a 09 20 20   depc($dep)...  
7350: 20 20 69 66 20 7b 21 24 73 69 78 7d 20 63 6f 6e    if {!$six} con
7360: 74 69 6e 75 65 0a 0a 09 20 20 20 20 73 74 72 75  tinue...    stru
7370: 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20  ct::list assign 
7380: 24 64 65 70 20 70 61 72 65 6e 74 20 63 68 69 6c  $dep parent chil
7390: 64 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65  d..    log write
73a0: 20 35 20 63 73 65 74 73 20 22 42 72 6f 6b 65 20   5 csets "Broke 
73b0: 64 65 70 65 6e 64 65 6e 63 79 20 5b 50 44 20 24  dependency [PD $
73c0: 70 61 72 65 6e 74 5d 20 2d 2d 3e 20 5b 50 44 20  parent] --> [PD 
73d0: 24 63 68 69 6c 64 5d 22 0a 09 7d 0a 0a 09 72 65  $child]"..}...re
73e0: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
73f0: 23 20 50 72 69 6e 74 20 69 64 65 6e 74 69 66 79  # Print identify
7400: 69 6e 67 20 64 61 74 61 20 66 6f 72 20 61 20 72  ing data for a r
7410: 65 76 69 73 69 6f 6e 20 28 70 72 6f 6a 65 63 74  evision (project
7420: 2c 20 66 69 6c 65 2c 20 64 6f 74 74 65 64 20 72  , file, dotted r
7430: 65 76 0a 20 20 20 20 23 20 6e 75 6d 62 65 72 29  ev.    # number)
7440: 2c 20 66 6f 72 20 68 69 67 68 20 76 65 72 62 6f  , for high verbo
7450: 73 69 74 79 20 6c 6f 67 20 6f 75 74 70 75 74 2e  sity log output.
7460: 0a 20 20 20 20 23 20 54 4f 44 4f 3a 20 52 65 70  .    # TODO: Rep
7470: 6c 61 63 65 20 77 69 74 68 20 63 61 6c 6c 20 74  lace with call t
7480: 6f 20 69 74 65 6d 73 74 72 20 28 6c 69 73 74 20  o itemstr (list 
7490: 72 65 76 20 24 69 64 29 0a 0a 20 20 20 20 70 72  rev $id)..    pr
74a0: 6f 63 20 50 44 20 7b 69 64 7d 20 7b 0a 09 66 6f  oc PD {id} {..fo
74b0: 72 65 61 63 68 20 7b 70 20 66 20 72 7d 20 5b 73  reach {p f r} [s
74c0: 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 53 45 4c  tate run {...SEL
74d0: 45 43 54 20 50 2e 6e 61 6d 65 20 2c 20 46 2e 6e  ECT P.name , F.n
74e0: 61 6d 65 2c 20 52 2e 72 65 76 0a 09 09 46 52 4f  ame, R.rev...FRO
74f0: 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 66 69  M revision R, fi
7500: 6c 65 20 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a  le F, project P.
7510: 09 09 57 48 45 52 45 20 52 2e 72 69 64 20 3d 20  ..WHERE R.rid = 
7520: 24 69 64 20 20 20 20 2d 2d 20 46 69 6e 64 20 73  $id    -- Find s
7530: 70 65 63 69 66 69 65 64 20 66 69 6c 65 20 72 65  pecified file re
7540: 76 69 73 69 6f 6e 0a 09 09 41 4e 44 20 20 20 46  vision...AND   F
7550: 2e 66 69 64 20 3d 20 52 2e 66 69 64 20 20 2d 2d  .fid = R.fid  --
7560: 20 47 65 74 20 66 69 6c 65 20 6f 66 20 74 68 65   Get file of the
7570: 20 72 65 76 69 73 69 6f 6e 0a 09 09 41 4e 44 20   revision...AND 
7580: 20 20 50 2e 70 69 64 20 3d 20 46 2e 70 69 64 20    P.pid = F.pid 
7590: 20 2d 2d 20 47 65 74 20 70 72 6f 6a 65 63 74 20   -- Get project 
75a0: 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 09 7d 5d  of the file...}]
75b0: 20 62 72 65 61 6b 0a 09 72 65 74 75 72 6e 20 22   break..return "
75c0: 27 24 70 20 3a 20 24 66 2f 24 72 27 22 0a 20 20  '$p : $f/$r'".  
75d0: 20 20 7d 0a 0a 20 20 20 20 23 20 50 72 69 6e 74    }..    # Print
75e0: 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ing one or more 
75f0: 72 61 6e 67 65 73 2c 20 66 6f 72 6d 61 74 74 65  ranges, formatte
7600: 64 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68 65 69  d, and only thei
7610: 72 20 62 6f 72 64 65 72 20 74 6f 0a 20 20 20 20  r border to.    
7620: 23 20 6b 65 65 70 20 74 68 65 20 73 74 72 69 6e  # keep the strin
7630: 67 73 20 73 68 6f 72 74 2e 0a 0a 20 20 20 20 70  gs short...    p
7640: 72 6f 63 20 50 52 73 20 7b 72 61 6e 67 65 73 7d  roc PRs {ranges}
7650: 20 7b 0a 09 72 65 74 75 72 6e 20 5b 73 74 72 75   {..return [stru
7660: 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20 24 72 61  ct::list map $ra
7670: 6e 67 65 73 20 5b 6d 79 70 72 6f 63 20 50 52 5d  nges [myproc PR]
7680: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f  ].    }..    pro
7690: 63 20 50 52 20 7b 72 61 6e 67 65 7d 20 7b 0a 09  c PR {range} {..
76a0: 42 6f 72 64 65 72 20 24 72 61 6e 67 65 20 73 20  Border $range s 
76b0: 65 0a 09 72 65 74 75 72 6e 20 3c 24 7b 73 7d 2e  e..return <${s}.
76c0: 2e 2e 24 7b 65 7d 3e 0a 20 20 20 20 7d 0a 0a 20  ..${e}>.    }.. 
76d0: 20 20 20 70 72 6f 63 20 42 6f 72 64 65 72 20 7b     proc Border {
76e0: 72 61 6e 67 65 20 73 76 20 65 76 7d 20 7b 0a 09  range sv ev} {..
76f0: 75 70 76 61 72 20 31 20 24 73 76 20 73 20 24 65  upvar 1 $sv s $e
7700: 76 20 65 0a 09 73 65 74 20 73 20 5b 6c 69 6e 64  v e..set s [lind
7710: 65 78 20 24 72 61 6e 67 65 20 30 5d 0a 09 73 65  ex $range 0]..se
7720: 74 20 65 20 5b 6c 69 6e 64 65 78 20 24 72 61 6e  t e [lindex $ran
7730: 67 65 20 65 6e 64 5d 0a 09 72 65 74 75 72 6e 0a  ge end]..return.
7740: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23      }..    # # #
7750: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
7760: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
7770: 23 23 0a 0a 20 20 20 20 74 79 70 65 76 61 72 69  ##..    typevari
7780: 61 62 6c 65 20 6d 79 63 68 61 6e 67 65 73 65 74  able mychangeset
7790: 73 20 20 20 20 20 20 20 20 20 7b 7d 20 3b 20 23  s         {} ; #
77a0: 20 4c 69 73 74 20 6f 66 20 61 6c 6c 20 6b 6e 6f   List of all kno
77b0: 77 6e 0a 09 09 09 09 09 20 20 20 23 20 63 68 61  wn......   # cha
77c0: 6e 67 65 73 65 74 73 2e 0a 0a 20 20 20 20 23 20  ngesets...    # 
77d0: 4c 69 73 74 20 6f 66 20 61 6c 6c 20 6b 6e 6f 77  List of all know
77e0: 6e 20 63 68 61 6e 67 65 73 65 74 73 20 6f 66 20  n changesets of 
77f0: 61 20 74 79 70 65 2e 0a 20 20 20 20 74 79 70 65  a type..    type
7800: 76 61 72 69 61 62 6c 65 20 6d 79 74 63 68 61 6e  variable mytchan
7810: 67 65 73 65 74 73 20 2d 61 72 72 61 79 20 7b 0a  gesets -array {.
7820: 09 73 79 6d 3a 3a 62 72 61 6e 63 68 20 7b 7d 0a  .sym::branch {}.
7830: 09 73 79 6d 3a 3a 74 61 67 20 20 20 20 7b 7d 0a  .sym::tag    {}.
7840: 09 72 65 76 20 20 20 20 20 20 20 20 20 7b 7d 0a  .rev         {}.
7850: 20 20 20 20 7d 0a 09 09 09 09 09 0a 20 20 20 20      }.......    
7860: 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 69  typevariable myi
7870: 74 65 6d 6d 61 70 20 20 20 20 20 2d 61 72 72 61  temmap     -arra
7880: 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 66 72 6f  y {} ; # Map fro
7890: 6d 20 69 74 65 6d 73 20 28 74 61 67 67 65 64 29  m items (tagged)
78a0: 0a 09 09 09 09 09 20 20 20 23 20 74 6f 20 74 68  ......   # to th
78b0: 65 20 6c 69 73 74 20 6f 66 20 63 68 61 6e 67 65  e list of change
78c0: 73 65 74 73 0a 09 09 09 09 09 20 20 20 23 20 63  sets......   # c
78d0: 6f 6e 74 61 69 6e 69 6e 67 20 69 74 2e 20 45 61  ontaining it. Ea
78e0: 63 68 20 69 74 65 6d 0a 09 09 09 09 09 20 20 20  ch item......   
78f0: 23 20 63 61 6e 20 62 65 20 75 73 65 64 20 62 79  # can be used by
7900: 20 6f 6e 6c 79 20 6f 6e 65 0a 09 09 09 09 09 20   only one...... 
7910: 20 20 23 20 63 68 61 6e 67 65 73 65 74 2e 0a 20    # changeset.. 
7920: 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20     typevariable 
7930: 6d 79 69 64 6d 61 70 20 20 20 2d 61 72 72 61 79  myidmap   -array
7940: 20 7b 7d 20 3b 20 23 20 4d 61 70 20 66 72 6f 6d   {} ; # Map from
7950: 20 63 68 61 6e 67 65 73 65 74 20 69 64 20 74 6f   changeset id to
7960: 0a 09 09 09 09 20 20 20 20 20 20 20 23 20 63 68  .....       # ch
7970: 61 6e 67 65 73 65 74 2e 0a 0a 20 20 20 20 74 79  angeset...    ty
7980: 70 65 6d 65 74 68 6f 64 20 61 6c 6c 20 20 20 20  pemethod all    
7990: 7b 7d 20 20 20 20 7b 20 72 65 74 75 72 6e 20 24  {}    { return $
79a0: 6d 79 63 68 61 6e 67 65 73 65 74 73 20 7d 0a 20  mychangesets }. 
79b0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6f 66     typemethod of
79c0: 20 20 20 20 20 7b 63 69 64 7d 20 7b 20 72 65 74       {cid} { ret
79d0: 75 72 6e 20 24 6d 79 69 64 6d 61 70 28 24 63 69  urn $myidmap($ci
79e0: 64 29 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74  d) }.    typemet
79f0: 68 6f 64 20 6f 66 69 74 65 6d 20 7b 69 69 64 7d  hod ofitem {iid}
7a00: 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 74 65   { return $myite
7a10: 6d 6d 61 70 28 24 69 69 64 29 20 7d 0a 0a 20 20  mmap($iid) }..  
7a20: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 72 65 76    typemethod rev
7a30: 20 20 20 20 7b 7d 20 20 20 20 7b 20 72 65 74 75      {}    { retu
7a40: 72 6e 20 24 6d 79 74 63 68 61 6e 67 65 73 65 74  rn $mytchangeset
7a50: 73 28 72 65 76 29 20 7d 0a 20 20 20 20 74 79 70  s(rev) }.    typ
7a60: 65 6d 65 74 68 6f 64 20 73 79 6d 20 20 20 20 7b  emethod sym    {
7a70: 7d 20 20 20 20 7b 20 72 65 74 75 72 6e 20 5b 63  }    { return [c
7a80: 6f 6e 63 61 74 20 5c 0a 09 09 09 09 09 20 20 24  oncat \......  $
7a90: 7b 6d 79 74 63 68 61 6e 67 65 73 65 74 73 28 73  {mytchangesets(s
7aa0: 79 6d 3a 3a 62 72 61 6e 63 68 29 7d 20 5c 0a 09  ym::branch)} \..
7ab0: 09 09 09 09 20 20 24 7b 6d 79 74 63 68 61 6e 67  ....  ${mytchang
7ac0: 65 73 65 74 73 28 73 79 6d 3a 3a 74 61 67 29 7d  esets(sym::tag)}
7ad0: 5d 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20  ] }..    # # ## 
7ae0: 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23  ### ##### ######
7af0: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
7b00: 0a 20 20 20 20 23 23 20 43 6f 6e 66 69 67 75 72  .    ## Configur
7b10: 61 74 69 6f 6e 0a 0a 20 20 20 20 70 72 61 67 6d  ation..    pragm
7b20: 61 20 2d 68 61 73 74 79 70 65 69 6e 66 6f 20 20  a -hastypeinfo  
7b30: 20 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 74 79 70    no  ; # no typ
7b40: 65 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a  e introspection.
7b50: 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 69      pragma -hasi
7b60: 6e 66 6f 20 20 20 20 20 20 20 20 6e 6f 20 20 3b  nfo        no  ;
7b70: 20 23 20 6e 6f 20 6f 62 6a 65 63 74 20 69 6e 74   # no object int
7b80: 72 6f 73 70 65 63 74 69 6f 6e 0a 0a 20 20 20 20  rospection..    
7b90: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
7ba0: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
7bb0: 23 23 23 23 23 23 23 0a 7d 0a 0a 23 23 0a 23 23  #######.}..##.##
7bc0: 20 4e 4f 54 45 3a 20 54 68 65 20 73 75 63 63 65   NOTE: The succe
7bd0: 73 73 6f 72 20 61 6e 64 20 70 72 65 64 65 63 65  ssor and predece
7be0: 73 73 6f 72 20 6d 65 74 68 6f 64 73 20 64 65 66  ssor methods def
7bf0: 69 6e 65 64 20 62 79 20 74 68 65 20 63 6c 61 73  ined by the clas
7c00: 73 65 73 0a 23 23 20 20 20 20 20 20 20 62 65 6c  ses.##       bel
7c10: 6f 77 20 61 72 65 20 2d 2d 20 62 6f 74 74 6c 65  ow are -- bottle
7c20: 20 6e 65 63 6b 73 20 2d 2d 2e 20 4c 6f 6f 6b 20   necks --. Look 
7c30: 66 6f 72 20 77 61 79 73 20 74 6f 20 6d 61 6b 65  for ways to make
7c40: 20 74 68 65 20 53 51 4c 0a 23 23 20 20 20 20 20   the SQL.##     
7c50: 20 20 66 61 73 74 65 72 2e 0a 23 23 0a 0a 23 20    faster..##..# 
7c60: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23  # ## ### ##### #
7c70: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
7c80: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
7c90: 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 48  ###########.## H
7ca0: 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 2e  elper singleton.
7cb0: 20 43 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 72 65   Commands for re
7cc0: 76 69 73 69 6f 6e 20 63 68 61 6e 67 65 73 65 74  vision changeset
7cd0: 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20 3a  s...snit::type :
7ce0: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70  :vc::fossil::imp
7cf0: 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63  ort::cvs::projec
7d00: 74 3a 3a 72 65 76 3a 3a 72 65 76 20 7b 0a 20 20  t::rev::rev {.  
7d10: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 72    typemethod byr
7d20: 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74  evision {} { ret
7d30: 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 79 70 65  urn 1 }.    type
7d40: 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20  method bysymbol 
7d50: 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20    {} { return 0 
7d60: 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  }.    typemethod
7d70: 20 69 73 74 61 67 20 20 20 20 20 20 7b 7d 20 7b   istag      {} {
7d80: 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20   return 0 }.    
7d90: 74 79 70 65 6d 65 74 68 6f 64 20 69 73 62 72 61  typemethod isbra
7da0: 6e 63 68 20 20 20 7b 7d 20 7b 20 72 65 74 75 72  nch   {} { retur
7db0: 6e 20 30 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d  n 0 }..    typem
7dc0: 65 74 68 6f 64 20 73 74 72 20 7b 72 65 76 69 73  ethod str {revis
7dd0: 69 6f 6e 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a  ion} {..struct::
7de0: 6c 69 73 74 20 61 73 73 69 67 6e 20 5b 73 74 61  list assign [sta
7df0: 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 53 45  te run {..    SE
7e00: 4c 45 43 54 20 52 2e 72 65 76 2c 20 46 2e 6e 61  LECT R.rev, F.na
7e10: 6d 65 2c 20 50 2e 6e 61 6d 65 0a 09 20 20 20 20  me, P.name..    
7e20: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20  FROM   revision 
7e30: 52 2c 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65  R, file F, proje
7e40: 63 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 20  ct P..    WHERE 
7e50: 20 52 2e 72 69 64 20 3d 20 24 72 65 76 69 73 69   R.rid = $revisi
7e60: 6f 6e 20 2d 2d 20 46 69 6e 64 20 73 70 65 63 69  on -- Find speci
7e70: 66 69 65 64 20 66 69 6c 65 20 72 65 76 69 73 69  fied file revisi
7e80: 6f 6e 0a 09 20 20 20 20 41 4e 44 20 20 20 20 46  on..    AND    F
7e90: 2e 66 69 64 20 3d 20 52 2e 66 69 64 20 20 20 20  .fid = R.fid    
7ea0: 20 2d 2d 20 47 65 74 20 66 69 6c 65 20 6f 66 20   -- Get file of 
7eb0: 74 68 65 20 72 65 76 69 73 69 6f 6e 0a 09 20 20  the revision..  
7ec0: 20 20 41 4e 44 20 20 20 20 50 2e 70 69 64 20 3d    AND    P.pid =
7ed0: 20 46 2e 70 69 64 20 20 20 20 20 2d 2d 20 47 65   F.pid     -- Ge
7ee0: 74 20 70 72 6f 6a 65 63 74 20 6f 66 20 74 68 65  t project of the
7ef0: 20 66 69 6c 65 2e 0a 09 7d 5d 20 72 65 76 6e 72   file...}] revnr
7f00: 20 66 6e 61 6d 65 20 70 6e 61 6d 65 0a 09 72 65   fname pname..re
7f10: 74 75 72 6e 20 22 24 70 6e 61 6d 65 2f 24 7b 72  turn "$pname/${r
7f20: 65 76 6e 72 7d 3a 3a 24 66 6e 61 6d 65 22 0a 20  evnr}::$fname". 
7f30: 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75     }..    # resu
7f40: 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69 6e 74 69  lt = list (minti
7f50: 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a 20 20 20  me, maxtime).   
7f60: 20 74 79 70 65 6d 65 74 68 6f 64 20 74 69 6d 65   typemethod time
7f70: 72 61 6e 67 65 20 7b 69 74 65 6d 73 7d 20 7b 0a  range {items} {.
7f80: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a  .set theset ('[j
7f90: 6f 69 6e 20 24 69 74 65 6d 73 20 7b 27 2c 27 7d  oin $items {','}
7fa0: 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61  ]')..return [sta
7fb0: 74 65 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e  te run [subst -n
7fc0: 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63  ocommands -nobac
7fd0: 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20 20 20  kslashes {..    
7fe0: 53 45 4c 45 43 54 20 4d 49 4e 28 52 2e 64 61 74  SELECT MIN(R.dat
7ff0: 65 29 2c 20 4d 41 58 28 52 2e 64 61 74 65 29 0a  e), MAX(R.date).
8000: 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69  .    FROM revisi
8010: 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20  on R..    WHERE 
8020: 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 74  R.rid IN $theset
8030: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
8040: 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74  revisions of int
8050: 65 72 65 73 74 0a 09 7d 5d 5d 0a 20 20 20 20 7d  erest..}]].    }
8060: 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76 29 20  ..    # var(dv) 
8070: 3d 20 64 69 63 74 20 28 72 65 76 69 73 69 6f 6e  = dict (revision
8080: 20 2d 3e 20 6c 69 73 74 20 28 72 65 76 69 73 69   -> list (revisi
8090: 6f 6e 29 29 0a 20 20 20 20 74 79 70 65 6d 65 74  on)).    typemet
80a0: 68 6f 64 20 69 6e 74 65 72 6e 61 6c 73 75 63 63  hod internalsucc
80b0: 65 73 73 6f 72 73 20 7b 64 76 20 72 65 76 69 73  essors {dv revis
80c0: 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31  ions} {..upvar 1
80d0: 20 24 64 76 20 64 65 70 65 6e 64 65 6e 63 69 65   $dv dependencie
80e0: 73 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27  s..set theset ('
80f0: 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73  [join $revisions
8100: 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 6c 6f 67 20   {','}]')...log 
8110: 77 72 69 74 65 20 31 34 20 63 73 65 74 20 69 6e  write 14 cset in
8120: 74 65 72 6e 61 6c 73 75 63 63 65 73 73 6f 72 73  ternalsuccessors
8130: 0a 0a 09 23 20 53 65 65 20 27 73 75 63 63 65 73  ...# See 'succes
8140: 73 6f 72 73 27 20 62 65 6c 6f 77 20 66 6f 72 20  sors' below for 
8150: 74 68 65 20 6d 61 69 6e 20 65 78 70 6c 61 6e 61  the main explana
8160: 74 69 6f 6e 20 6f 66 0a 09 23 20 74 68 65 20 76  tion of..# the v
8170: 61 72 69 6f 75 73 20 63 61 73 65 73 2e 20 54 68  arious cases. Th
8180: 69 73 20 70 69 65 63 65 20 69 73 20 73 70 65 63  is piece is spec
8190: 69 61 6c 20 69 6e 20 74 68 61 74 20 69 74 0a 09  ial in that it..
81a0: 23 20 72 65 73 74 72 69 63 74 73 20 74 68 65 20  # restricts the 
81b0: 73 75 63 63 65 73 73 6f 72 73 20 77 65 20 6c 6f  successors we lo
81c0: 6f 6b 20 66 6f 72 20 74 6f 20 74 68 65 20 73 61  ok for to the sa
81d0: 6d 65 20 73 65 74 20 6f 66 0a 09 23 20 72 65 76  me set of..# rev
81e0: 69 73 69 6f 6e 73 20 77 65 20 73 74 61 72 74 20  isions we start 
81f0: 66 72 6f 6d 2e 20 53 65 6e 73 69 62 6c 65 20 61  from. Sensible a
8200: 73 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67  s we are looking
8210: 20 66 6f 72 0a 09 23 20 63 68 61 6e 67 65 73 65   for..# changese
8220: 74 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e  t internal depen
8230: 64 65 6e 63 69 65 73 2e 0a 0a 09 61 72 72 61 79  dencies....array
8240: 20 73 65 74 20 64 65 70 20 7b 7d 0a 0a 09 66 6f   set dep {}...fo
8250: 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64  reach {rid child
8260: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75  } [state run [su
8270: 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20  bst -nocommands 
8280: 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b  -nobackslashes {
8290: 0a 20 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d  .    -- (1) Prim
82a0: 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20 53  ary child..    S
82b0: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63  ELECT R.rid, R.c
82c0: 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  hild..    FROM  
82d0: 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20   revision R..   
82e0: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20   WHERE  R.rid   
82f0: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d  IN $theset     -
8300: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65  - Restrict to re
8310: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72  visions of inter
8320: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  est..    AND    
8330: 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e  R.child IS NOT N
8340: 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72  ULL    -- Has pr
8350: 69 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20  imary child..   
8360: 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20   AND    R.child 
8370: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d  IN $theset     -
8380: 2d 20 57 68 69 63 68 20 69 73 20 61 6c 73 6f 20  - Which is also 
8390: 6f 66 20 69 6e 74 65 72 65 73 74 0a 20 20 20 20  of interest.    
83a0: 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32 29  UNION.    -- (2)
83b0: 20 53 65 63 6f 6e 64 61 72 79 20 28 62 72 61 6e   Secondary (bran
83c0: 63 68 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 20  ch) children..  
83d0: 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20    SELECT R.rid, 
83e0: 42 2e 62 72 69 64 0a 09 20 20 20 20 46 52 4f 4d  B.brid..    FROM
83f0: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72     revision R, r
8400: 65 76 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 69  evisionbranchchi
8410: 6c 64 72 65 6e 20 42 0a 09 20 20 20 20 57 48 45  ldren B..    WHE
8420: 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24  RE  R.rid   IN $
8430: 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65  theset     -- Re
8440: 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69  strict to revisi
8450: 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  ons of interest.
8460: 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72 69  .    AND    R.ri
8470: 64 20 3d 20 42 2e 72 69 64 20 20 20 20 20 20 20  d = B.rid       
8480: 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 73 75 62     -- Select sub
8490: 73 65 74 20 6f 66 20 62 72 61 6e 63 68 20 63 68  set of branch ch
84a0: 69 6c 64 72 65 6e 0a 09 20 20 20 20 41 4e 44 20  ildren..    AND 
84b0: 20 20 20 42 2e 62 72 69 64 20 49 4e 20 24 74 68     B.brid IN $th
84c0: 65 73 65 74 20 20 20 20 20 20 2d 2d 20 57 68 69  eset      -- Whi
84d0: 63 68 20 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e  ch is also of in
84e0: 74 65 72 65 73 74 0a 20 20 20 20 55 4e 49 4f 4e  terest.    UNION
84f0: 0a 20 20 20 20 2d 2d 20 28 34 29 20 43 68 69 6c  .    -- (4) Chil
8500: 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 20  d of trunk root 
8510: 73 75 63 63 65 73 73 6f 72 20 6f 66 20 6c 61 73  successor of las
8520: 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b 2e  t NTDB on trunk.
8530: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
8540: 69 64 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20 20  id, RA.child..  
8550: 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20    FROM revision 
8560: 52 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 0a 09  R, revision RA..
8570: 20 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 20      WHERE R.rid 
8580: 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20    IN $theset    
8590: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f    -- Restrict to
85a0: 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e   revisions of in
85b0: 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20  terest..    AND 
85c0: 20 20 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20    R.isdefault   
85d0: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73            -- Res
85e0: 74 72 69 63 74 20 74 6f 20 4e 54 44 42 0a 09 20  trict to NTDB.. 
85f0: 20 20 20 41 4e 44 20 20 20 52 2e 64 62 63 68 69     AND   R.dbchi
8600: 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20  ld IS NOT NULL  
8610: 20 2d 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 44   -- and last NTD
8620: 42 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74  B belonging to t
8630: 72 75 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 20  runk..    AND   
8640: 52 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69  RA.rid = R.dbchi
8650: 6c 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69  ld      -- Go di
8660: 72 65 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20  rectly to trunk 
8670: 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20  root..    AND   
8680: 52 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20  RA.child IS NOT 
8690: 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70  NULL    -- Has p
86a0: 72 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 20 20  rimary child..  
86b0: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20            AND   
86c0: 52 41 2e 63 68 69 6c 64 20 49 4e 20 24 74 68 65  RA.child IN $the
86d0: 73 65 74 20 20 20 20 20 2d 2d 20 57 68 69 63 68  set     -- Which
86e0: 20 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e 74 65   is also of inte
86f0: 72 65 73 74 0a 09 7d 5d 5d 20 7b 0a 09 20 20 20  rest..}]] {..   
8700: 20 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69   # Consider movi
8710: 6e 67 20 74 68 69 73 20 74 6f 20 74 68 65 20 69  ng this to the i
8720: 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e  ntegrity module.
8730: 0a 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 20  ..    integrity 
8740: 61 73 73 65 72 74 20 7b 24 72 69 64 20 21 3d 20  assert {$rid != 
8750: 24 63 68 69 6c 64 7d 20 7b 52 65 76 69 73 69 6f  $child} {Revisio
8760: 6e 20 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f  n $rid depends o
8770: 6e 20 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20  n itself.}..    
8780: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e  lappend dependen
8790: 63 69 65 73 28 24 72 69 64 29 20 24 63 68 69 6c  cies($rid) $chil
87a0: 64 0a 09 20 20 20 20 73 65 74 20 64 65 70 28 24  d..    set dep($
87b0: 72 69 64 2c 24 63 68 69 6c 64 29 20 2e 0a 09 7d  rid,$child) ...}
87c0: 0a 0a 09 23 20 54 68 65 20 73 71 6c 20 73 74 61  ...# The sql sta
87d0: 74 65 6d 65 6e 74 73 20 61 62 6f 76 65 20 6c 6f  tements above lo
87e0: 6f 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 64 69 72  oks only for dir
87f0: 65 63 74 20 64 65 70 65 6e 64 65 6e 63 69 65 73  ect dependencies
8800: 0a 09 23 20 62 65 74 77 65 65 6e 20 72 65 76 69  ..# between revi
8810: 73 69 6f 6e 20 69 6e 20 74 68 65 20 63 68 61 6e  sion in the chan
8820: 67 65 73 65 74 2e 20 48 6f 77 65 76 65 72 20 64  geset. However d
8830: 75 65 20 74 6f 20 74 68 65 0a 09 23 20 76 61 67  ue to the..# vag
8840: 61 72 69 65 73 20 6f 66 20 6d 65 74 61 20 64 61  aries of meta da
8850: 74 61 20 69 74 20 69 73 20 70 6f 73 73 69 62 6c  ta it is possibl
8860: 65 20 66 6f 72 20 74 77 6f 20 72 65 76 69 73 69  e for two revisi
8870: 6f 6e 73 20 6f 66 0a 09 23 20 74 68 65 20 73 61  ons of..# the sa
8880: 6d 65 20 66 69 6c 65 20 74 6f 20 65 6e 64 20 75  me file to end u
8890: 70 20 69 6e 20 74 68 65 20 73 61 6d 65 20 63 68  p in the same ch
88a0: 61 6e 67 65 73 65 74 2c 20 77 69 74 68 6f 75 74  angeset, without
88b0: 20 61 0a 09 23 20 64 69 72 65 63 74 20 64 65 70   a..# direct dep
88c0: 65 6e 64 65 6e 63 79 20 62 65 74 77 65 65 6e 20  endency between 
88d0: 74 68 65 6d 2e 20 48 6f 77 65 76 65 72 20 77 65  them. However we
88e0: 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 72 65   know that there
88f0: 0a 09 23 20 68 61 73 20 74 6f 20 62 65 20 61 20  ..# has to be a 
8900: 61 6e 20 69 6e 64 69 72 65 63 74 20 64 65 70 65  an indirect depe
8910: 6e 64 65 6e 63 79 2c 20 62 65 20 69 74 20 74 68  ndency, be it th
8920: 72 6f 75 67 68 20 70 72 69 6d 61 72 79 0a 09 23  rough primary..#
8930: 20 63 68 69 6c 64 72 65 6e 2c 20 62 72 61 6e 63   children, branc
8940: 68 20 63 68 69 6c 64 72 65 6e 2c 20 6f 72 20 61  h children, or a
8950: 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68 65   combination the
8960: 72 65 6f 66 2e 0a 0a 09 23 20 57 65 20 6e 6f 77  reof....# We now
8970: 20 66 69 6c 6c 20 69 6e 20 74 68 65 73 65 20 70   fill in these p
8980: 73 65 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63 69  seudo-dependenci
8990: 65 73 2c 20 69 66 20 6e 6f 20 73 75 63 68 0a 09  es, if no such..
89a0: 23 20 64 65 70 65 6e 64 65 6e 63 79 20 65 78 69  # dependency exi
89b0: 73 74 73 20 61 6c 72 65 61 64 79 2e 20 54 68 65  sts already. The
89c0: 20 64 69 72 65 63 74 69 6f 6e 20 6f 66 20 74 68   direction of th
89d0: 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 09 23 20  e dependency..# 
89e0: 69 73 20 61 63 74 75 61 6c 6c 79 20 69 72 72 65  is actually irre
89f0: 6c 65 76 61 6e 74 20 66 6f 72 20 74 68 69 73 2e  levant for this.
8a00: 0a 0a 09 23 20 4e 4f 54 45 3a 20 54 68 69 73 20  ...# NOTE: This 
8a10: 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72 6f  is different fro
8a20: 6d 20 63 76 73 32 73 76 6e 2e 20 4f 75 72 20 73  m cvs2svn. Our s
8a30: 70 69 72 69 74 75 61 6c 20 61 6e 63 65 73 74 6f  piritual ancesto
8a40: 72 0a 09 23 20 64 6f 65 73 20 6e 6f 74 20 75 73  r..# does not us
8a50: 65 20 73 75 63 68 20 70 73 65 75 64 6f 2d 64 65  e such pseudo-de
8a60: 70 65 6e 64 65 6e 63 69 65 73 2c 20 68 6f 77 65  pendencies, howe
8a70: 76 65 72 20 69 74 20 75 73 65 73 20 61 0a 09 23  ver it uses a..#
8a80: 20 43 4f 4d 4d 49 54 5f 54 48 52 45 53 48 4f 4c   COMMIT_THRESHOL
8a90: 44 2c 20 61 20 74 69 6d 65 20 69 6e 74 65 72 76  D, a time interv
8aa0: 61 6c 20 63 6f 6d 6d 69 74 73 20 73 68 6f 75 6c  al commits shoul
8ab0: 64 20 66 61 6c 6c 2e 20 54 68 69 73 0a 09 23 20  d fall. This..# 
8ac0: 77 69 6c 6c 20 67 72 65 61 74 6c 79 20 72 65 64  will greatly red
8ad0: 75 63 65 73 20 74 68 65 20 72 69 73 6b 20 6f 66  uces the risk of
8ae0: 20 67 65 74 74 69 6e 67 20 66 61 72 20 73 65 70   getting far sep
8af0: 61 72 61 74 65 64 0a 09 23 20 72 65 76 69 73 69  arated..# revisi
8b00: 6f 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 65 20  ons of the same 
8b10: 66 69 6c 65 20 69 6e 74 6f 20 6f 6e 65 20 63 68  file into one ch
8b20: 61 6e 67 65 73 65 74 2e 0a 0a 09 23 20 57 65 20  angeset....# We 
8b30: 61 6c 6c 6f 77 20 72 65 76 69 73 69 6f 6e 73 20  allow revisions 
8b40: 74 6f 20 62 65 20 66 61 72 20 61 70 61 72 74 20  to be far apart 
8b50: 69 6e 20 74 69 6d 65 20 69 6e 20 74 68 65 20 73  in time in the s
8b60: 61 6d 65 0a 09 23 20 63 68 61 6e 67 65 73 65 74  ame..# changeset
8b70: 2c 20 62 75 74 20 69 6e 20 74 75 72 6e 20 6e 65  , but in turn ne
8b80: 65 64 20 74 68 65 20 70 73 65 75 64 6f 2d 64 65  ed the pseudo-de
8b90: 70 65 6e 64 65 6e 63 69 65 73 20 74 6f 0a 09 23  pendencies to..#
8ba0: 20 68 61 6e 64 6c 65 20 74 68 69 73 2e 0a 0a 09   handle this....
8bb0: 6c 6f 67 20 77 72 69 74 65 20 31 34 20 63 73 65  log write 14 cse
8bc0: 74 20 70 73 65 75 64 6f 2d 69 6e 74 65 72 6e 61  t pseudo-interna
8bd0: 6c 73 75 63 63 65 73 73 6f 72 73 0a 0a 09 61 72  lsuccessors...ar
8be0: 72 61 79 20 73 65 74 20 66 69 64 73 20 7b 7d 0a  ray set fids {}.
8bf0: 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 66 69  .foreach {rid fi
8c00: 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73  d} [state run [s
8c10: 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73  ubst -nocommands
8c20: 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20   -nobackslashes 
8c30: 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e  {..    SELECT R.
8c40: 72 69 64 2c 20 52 2e 66 69 64 0a 20 20 20 20 20  rid, R.fid.     
8c50: 20 20 20 20 20 20 20 46 52 4f 4d 20 20 20 72 65         FROM   re
8c60: 76 69 73 69 6f 6e 20 52 0a 20 20 20 20 20 20 20  vision R.       
8c70: 20 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69       WHERE  R.ri
8c80: 64 20 49 4e 20 24 74 68 65 73 65 74 0a 09 7d 5d  d IN $theset..}]
8c90: 5d 20 7b 20 6c 61 70 70 65 6e 64 20 66 69 64 73  ] { lappend fids
8ca0: 28 24 66 69 64 29 20 24 72 69 64 20 7d 0a 0a 09  ($fid) $rid }...
8cb0: 66 6f 72 65 61 63 68 20 7b 66 69 64 20 72 69 64  foreach {fid rid
8cc0: 73 7d 20 5b 61 72 72 61 79 20 67 65 74 20 66 69  s} [array get fi
8cd0: 64 73 5d 20 7b 0a 09 20 20 20 20 69 66 20 7b 5b  ds] {..    if {[
8ce0: 6c 6c 65 6e 67 74 68 20 24 72 69 64 73 5d 20 3c  llength $rids] <
8cf0: 20 32 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 20 20   2} continue..  
8d00: 20 20 66 6f 72 65 61 63 68 20 61 20 24 72 69 64    foreach a $rid
8d10: 73 20 7b 0a 09 09 66 6f 72 65 61 63 68 20 62 20  s {...foreach b 
8d20: 24 72 69 64 73 20 7b 0a 09 09 20 20 20 20 69 66  $rids {...    if
8d30: 20 7b 24 61 20 3d 3d 20 24 62 7d 20 63 6f 6e 74   {$a == $b} cont
8d40: 69 6e 75 65 0a 09 09 20 20 20 20 69 66 20 7b 5b  inue...    if {[
8d50: 69 6e 66 6f 20 65 78 69 73 74 73 20 64 65 70 28  info exists dep(
8d60: 24 61 2c 24 62 29 5d 7d 20 63 6f 6e 74 69 6e 75  $a,$b)]} continu
8d70: 65 0a 09 09 20 20 20 20 69 66 20 7b 5b 69 6e 66  e...    if {[inf
8d80: 6f 20 65 78 69 73 74 73 20 64 65 70 28 24 62 2c  o exists dep($b,
8d90: 24 61 29 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a 09  $a)]} continue..
8da0: 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70  .    lappend dep
8db0: 65 6e 64 65 6e 63 69 65 73 28 24 61 29 20 24 62  endencies($a) $b
8dc0: 0a 09 09 20 20 20 20 73 65 74 20 64 65 70 28 24  ...    set dep($
8dd0: 61 2c 24 62 29 20 2e 0a 09 09 20 20 20 20 73 65  a,$b) ....    se
8de0: 74 20 64 65 70 28 24 62 2c 24 61 29 20 2e 0a 09  t dep($b,$a) ...
8df0: 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 6c  .}..    }..}...l
8e00: 6f 67 20 77 72 69 74 65 20 31 34 20 63 73 65 74  og write 14 cset
8e10: 20 63 6f 6d 70 6c 65 74 65 0a 09 72 65 74 75 72   complete..retur
8e20: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72  n.    }..    # r
8e30: 65 73 75 6c 74 20 3d 20 34 2d 6c 69 73 74 20 28  esult = 4-list (
8e40: 69 74 65 6d 74 79 70 65 20 69 74 65 6d 69 64 20  itemtype itemid 
8e50: 6e 65 78 74 69 74 65 6d 74 79 70 65 20 6e 65 78  nextitemtype nex
8e60: 74 69 74 65 6d 69 64 20 2e 2e 2e 29 0a 20 20 20  titemid ...).   
8e70: 20 74 79 70 65 6d 65 74 68 6f 64 20 6c 6f 6f 70   typemethod loop
8e80: 73 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a  s {revisions} {.
8e90: 09 23 20 4e 6f 74 65 3a 20 54 61 67 73 20 61 6e  .# Note: Tags an
8ea0: 64 20 62 72 61 6e 63 68 65 73 20 63 61 6e 6e 6f  d branches canno
8eb0: 74 20 63 61 75 73 65 20 74 68 65 20 6c 6f 6f 70  t cause the loop
8ec0: 2e 20 54 68 65 69 72 20 69 64 27 73 2c 0a 09 23  . Their id's,..#
8ed0: 20 62 65 69 6e 67 20 6f 66 20 61 20 66 75 6e 64   being of a fund
8ee0: 61 6d 65 6e 74 61 6c 6c 79 20 64 69 66 66 65 72  amentally differ
8ef0: 65 6e 74 20 74 79 70 65 20 74 68 61 6e 20 74 68  ent type than th
8f00: 65 20 72 65 76 69 73 69 6f 6e 73 0a 09 23 20 63  e revisions..# c
8f10: 6f 6d 69 6e 67 20 69 6e 20 63 61 6e 6e 6f 74 20  oming in cannot 
8f20: 62 65 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 0a  be in the set...
8f30: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a  .set theset ('[j
8f40: 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b  oin $revisions {
8f50: 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20  ','}]')..return 
8f60: 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73  [state run [subs
8f70: 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e  t -nocommands -n
8f80: 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09  obackslashes {..
8f90: 20 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d 61      -- (1) Prima
8fa0: 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20 53 45  ry child..    SE
8fb0: 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63 68  LECT R.rid, R.ch
8fc0: 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  ild..    FROM   
8fd0: 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20  revision R..    
8fe0: 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49  WHERE  R.rid   I
8ff0: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d  N $theset     --
9000: 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76   Restrict to rev
9010: 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65  isions of intere
9020: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  st..    AND    R
9030: 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55  .child IS NOT NU
9040: 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69  LL    -- Has pri
9050: 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20  mary child..    
9060: 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49  AND    R.child I
9070: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d  N $theset     --
9080: 20 4c 6f 6f 70 0a 09 20 20 20 20 2d 2d 0a 09 20   Loop..    --.. 
9090: 20 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 2d 2d     UNION..    --
90a0: 20 28 32 29 20 53 65 63 6f 6e 64 61 72 79 20 28   (2) Secondary (
90b0: 62 72 61 6e 63 68 29 20 63 68 69 6c 64 72 65 6e  branch) children
90c0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
90d0: 69 64 2c 20 42 2e 62 72 69 64 0a 09 20 20 20 20  id, B.brid..    
90e0: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20  FROM   revision 
90f0: 52 2c 20 72 65 76 69 73 69 6f 6e 62 72 61 6e 63  R, revisionbranc
9100: 68 63 68 69 6c 64 72 65 6e 20 42 0a 09 20 20 20  hchildren B..   
9110: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20   WHERE  R.rid   
9120: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d  IN $theset     -
9130: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65  - Restrict to re
9140: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72  visions of inter
9150: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  est..    AND    
9160: 52 2e 72 69 64 20 3d 20 42 2e 72 69 64 20 20 20  R.rid = B.rid   
9170: 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74         -- Select
9180: 20 73 75 62 73 65 74 20 6f 66 20 62 72 61 6e 63   subset of branc
9190: 68 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20  h children..    
91a0: 41 4e 44 20 20 20 20 42 2e 72 69 64 20 20 20 49  AND    B.rid   I
91b0: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d  N $theset     --
91c0: 20 4c 6f 6f 70 0a 09 20 20 20 20 2d 2d 0a 09 20   Loop..    --.. 
91d0: 20 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 2d 2d     UNION..    --
91e0: 20 28 34 29 20 43 68 69 6c 64 20 6f 66 20 74 72   (4) Child of tr
91f0: 75 6e 6b 20 72 6f 6f 74 20 73 75 63 63 65 73 73  unk root success
9200: 6f 72 20 6f 66 20 6c 61 73 74 20 4e 54 44 42 20  or of last NTDB 
9210: 6f 6e 20 74 72 75 6e 6b 2e 0a 09 20 20 20 20 53  on trunk...    S
9220: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 41 2e  ELECT R.rid, RA.
9230: 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20  child..    FROM 
9240: 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65    revision R, re
9250: 76 69 73 69 6f 6e 20 52 41 0a 09 20 20 20 20 57  vision RA..    W
9260: 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 20 49  HERE  R.rid    I
9270: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d  N $theset     --
9280: 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76   Restrict to rev
9290: 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65  isions of intere
92a0: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  st..    AND    R
92b0: 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20 20 20  .isdefault      
92c0: 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69         -- Restri
92d0: 63 74 20 74 6f 20 4e 54 44 42 0a 09 20 20 20 20  ct to NTDB..    
92e0: 41 4e 44 20 20 20 20 52 2e 64 62 63 68 69 6c 64  AND    R.dbchild
92f0: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d   IS NOT NULL   -
9300: 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 42 20  - and last NTDB 
9310: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72 75  belonging to tru
9320: 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  nk..    AND    R
9330: 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69 6c  A.rid = R.dbchil
9340: 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 72  d      -- Go dir
9350: 65 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 72  ectly to trunk r
9360: 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  oot..    AND    
9370: 52 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20  RA.child IS NOT 
9380: 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70  NULL    -- Has p
9390: 72 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 09 20  rimary child... 
93a0: 20 20 20 41 4e 44 20 20 20 20 52 41 2e 63 68 69     AND    RA.chi
93b0: 6c 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20  ld IN $theset   
93c0: 20 20 2d 2d 20 4c 6f 6f 70 0a 09 7d 5d 5d 0a 20    -- Loop..}]]. 
93d0: 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28     }..    # var(
93e0: 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d  dv) = dict (item
93f0: 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29   -> list (item))
9400: 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28  , item  = list (
9410: 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 70  type id).    typ
9420: 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f  emethod successo
9430: 72 73 20 7b 64 76 20 72 65 76 69 73 69 6f 6e 73  rs {dv revisions
9440: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76  } {..upvar 1 $dv
9450: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 73   dependencies..s
9460: 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69  et theset ('[joi
9470: 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c  n $revisions {',
9480: 27 7d 5d 27 29 0a 0a 09 23 20 54 68 65 20 66 6f  '}]')...# The fo
9490: 6c 6c 6f 77 69 6e 67 20 63 61 73 65 73 20 73 70  llowing cases sp
94a0: 65 63 69 66 79 20 77 68 65 6e 20 61 20 72 65 76  ecify when a rev
94b0: 69 73 69 6f 6e 20 53 20 69 73 20 61 20 73 75 63  ision S is a suc
94c0: 63 65 73 73 6f 72 0a 09 23 20 6f 66 20 61 20 72  cessor..# of a r
94d0: 65 76 69 73 69 6f 6e 20 52 2e 20 45 61 63 68 20  evision R. Each 
94e0: 6f 66 20 74 68 65 20 63 61 73 65 73 20 74 72 61  of the cases tra
94f0: 6e 73 6c 61 74 65 73 20 69 6e 74 6f 20 6f 6e 65  nslates into one
9500: 20 6f 66 0a 09 23 20 74 68 65 20 62 72 61 6e 63   of..# the branc
9510: 68 65 73 20 6f 66 20 74 68 65 20 53 51 4c 20 55  hes of the SQL U
9520: 4e 49 4f 4e 20 63 6f 6d 69 6e 67 20 62 65 6c 6f  NION coming belo
9530: 77 2e 0a 09 23 0a 09 23 20 28 31 29 20 53 20 63  w...#..# (1) S c
9540: 61 6e 20 62 65 20 61 20 70 72 69 6d 61 72 79 20  an be a primary 
9550: 63 68 69 6c 64 20 6f 66 20 52 2c 20 69 2e 65 2e  child of R, i.e.
9560: 20 69 6e 20 74 68 65 20 73 61 6d 65 20 4c 4f 44   in the same LOD
9570: 2e 20 52 0a 09 23 20 20 20 20 20 72 65 66 65 72  . R..#     refer
9580: 65 6e 63 65 73 20 53 20 64 69 72 65 63 74 6c 79  ences S directly
9590: 2e 20 52 2e 63 68 69 6c 64 20 3d 20 53 28 2e 72  . R.child = S(.r
95a0: 69 64 29 2c 20 69 66 20 69 74 20 65 78 69 73 74  id), if it exist
95b0: 73 2e 0a 09 23 0a 09 23 20 28 32 29 20 53 20 63  s...#..# (2) S c
95c0: 61 6e 20 62 65 20 61 20 73 65 63 6f 6e 64 61 72  an be a secondar
95d0: 79 2c 20 69 2e 65 2e 20 62 72 61 6e 63 68 2c 20  y, i.e. branch, 
95e0: 63 68 69 6c 64 20 6f 66 20 52 2e 20 48 65 72 65  child of R. Here
95f0: 20 74 68 65 0a 09 23 20 20 20 20 20 6c 69 6e 6b   the..#     link
9600: 20 69 73 20 6d 61 64 65 20 74 68 72 6f 75 67 68   is made through
9610: 20 74 68 65 20 68 65 6c 70 65 72 20 74 61 62 6c   the helper tabl
9620: 65 0a 09 23 20 20 20 20 20 52 45 56 49 53 49 4f  e..#     REVISIO
9630: 4e 42 52 41 4e 43 48 43 48 49 4c 44 52 45 4e 2e  NBRANCHCHILDREN.
9640: 20 52 2e 72 69 64 20 2d 3e 20 52 42 43 2e 72 69   R.rid -> RBC.ri
9650: 64 2c 20 52 42 43 2e 62 72 69 64 20 3d 0a 09 23  d, RBC.brid =..#
9660: 20 20 20 20 20 53 28 2e 72 69 64 29 0a 09 23 0a       S(.rid)..#.
9670: 09 23 20 28 33 29 20 4f 72 69 67 69 6e 61 6c 6c  .# (3) Originall
9680: 79 20 74 68 69 73 20 75 73 65 20 63 61 73 65 20  y this use case 
9690: 64 65 66 69 6e 65 64 20 74 68 65 20 72 6f 6f 74  defined the root
96a0: 20 6f 66 20 61 20 64 65 74 61 63 68 65 64 0a 09   of a detached..
96b0: 23 20 20 20 20 20 4e 54 44 42 20 61 73 20 74 68  #     NTDB as th
96c0: 65 20 73 75 63 63 65 73 73 6f 72 20 6f 66 20 74  e successor of t
96d0: 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74 2e 20 54  he trunk root. T
96e0: 68 69 73 20 6c 65 61 64 73 20 74 6f 20 61 0a 09  his leads to a..
96f0: 23 20 20 20 20 20 62 61 64 20 74 61 6e 67 6c 65  #     bad tangle
9700: 20 6c 61 74 65 72 20 6f 6e 2e 20 57 69 74 68 20   later on. With 
9710: 61 20 64 65 74 61 63 68 65 64 20 4e 54 44 42 20  a detached NTDB 
9720: 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 09 23 20  the original..# 
9730: 20 20 20 20 74 72 75 6e 6b 20 72 6f 6f 74 20 72      trunk root r
9740: 65 76 69 73 69 6f 6e 20 77 61 73 20 72 65 6d 6f  evision was remo
9750: 76 65 64 20 61 73 20 69 72 72 65 6c 65 76 61 6e  ved as irrelevan
9760: 74 2c 20 61 6c 6c 6f 77 69 6e 67 0a 09 23 20 20  t, allowing..#  
9770: 20 20 20 74 68 65 20 6e 6f 6d 69 6e 61 6c 20 72     the nominal r
9780: 6f 6f 74 20 74 6f 20 62 65 20 6c 61 74 65 72 20  oot to be later 
9790: 69 6e 20 74 69 6d 65 20 74 68 61 6e 20 74 68 65  in time than the
97a0: 20 4e 54 44 42 0a 09 23 20 20 20 20 20 72 6f 6f   NTDB..#     roo
97b0: 74 2e 20 4e 6f 77 20 73 65 74 74 69 6e 67 20 74  t. Now setting t
97c0: 68 69 73 20 64 65 70 65 6e 64 65 6e 63 79 20 77  his dependency w
97d0: 69 6c 6c 20 62 65 20 62 61 63 6b 77 61 72 64 20  ill be backward 
97e0: 69 6e 0a 09 23 20 20 20 20 20 74 69 6d 65 2e 20  in..#     time. 
97f0: 52 45 4d 4f 56 45 44 2e 0a 09 23 0a 09 23 20 28  REMOVED...#..# (
9800: 34 29 20 49 66 20 52 20 69 73 20 74 68 65 20 6c  4) If R is the l
9810: 61 73 74 20 6f 66 20 74 68 65 20 4e 54 44 42 20  ast of the NTDB 
9820: 72 65 76 69 73 69 6f 6e 73 20 77 68 69 63 68 20  revisions which 
9830: 62 65 6c 6f 6e 67 20 74 6f 0a 09 23 20 20 20 20  belong to..#    
9840: 20 74 68 65 20 74 72 75 6e 6b 2c 20 74 68 65 6e   the trunk, then
9850: 20 74 68 65 20 70 72 69 6d 61 72 79 20 63 68 69   the primary chi
9860: 6c 64 20 6f 66 20 74 68 65 20 74 72 75 6e 6b 20  ld of the trunk 
9870: 72 6f 6f 74 20 28 74 68 65 0a 09 23 20 20 20 20  root (the..#    
9880: 20 27 31 2e 32 27 20 72 65 76 69 73 69 6f 6e 29   '1.2' revision)
9890: 20 69 73 20 61 20 73 75 63 63 65 73 73 6f 72 2c   is a successor,
98a0: 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a 0a   if it exists...
98b0: 09 23 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  .# Note that the
98c0: 20 62 72 61 6e 63 68 65 73 20 73 70 61 77 6e 65   branches spawne
98d0: 64 20 66 72 6f 6d 20 74 68 65 20 72 65 76 69 73  d from the revis
98e0: 69 6f 6e 73 2c 20 61 6e 64 20 74 68 65 0a 09 23  ions, and the..#
98f0: 20 74 61 67 73 20 61 73 73 6f 63 69 61 74 65 64   tags associated
9900: 20 77 69 74 68 20 74 68 65 6d 20 61 72 65 20 73   with them are s
9910: 75 63 63 65 73 73 6f 72 73 20 61 73 20 77 65 6c  uccessors as wel
9920: 6c 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69  l....foreach {ri
9930: 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20  d child} [state 
9940: 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f  run [subst -noco
9950: 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c  mmands -nobacksl
9960: 61 73 68 65 73 20 7b 0a 20 20 20 20 2d 2d 20 28  ashes {.    -- (
9970: 31 29 20 50 72 69 6d 61 72 79 20 63 68 69 6c 64  1) Primary child
9980: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
9990: 69 64 2c 20 52 2e 63 68 69 6c 64 0a 09 20 20 20  id, R.child..   
99a0: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
99b0: 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 52   R..    WHERE  R
99c0: 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65  .rid   IN $these
99d0: 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63  t     -- Restric
99e0: 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f  t to revisions o
99f0: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20  f interest..    
9a00: 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49  AND    R.child I
9a10: 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d  S NOT NULL    --
9a20: 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 68 69   Has primary chi
9a30: 6c 64 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20  ld.    UNION.   
9a40: 20 2d 2d 20 28 32 29 20 53 65 63 6f 6e 64 61 72   -- (2) Secondar
9a50: 79 20 28 62 72 61 6e 63 68 29 20 63 68 69 6c 64  y (branch) child
9a60: 72 65 6e 0a 09 20 20 20 20 53 45 4c 45 43 54 20  ren..    SELECT 
9a70: 52 2e 72 69 64 2c 20 42 2e 62 72 69 64 0a 09 20  R.rid, B.brid.. 
9a80: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69     FROM   revisi
9a90: 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 62 72  on R, revisionbr
9aa0: 61 6e 63 68 63 68 69 6c 64 72 65 6e 20 42 0a 09  anchchildren B..
9ab0: 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64      WHERE  R.rid
9ac0: 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20     IN $theset   
9ad0: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f    -- Restrict to
9ae0: 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e   revisions of in
9af0: 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20  terest..    AND 
9b00: 20 20 20 52 2e 72 69 64 20 3d 20 42 2e 72 69 64     R.rid = B.rid
9b10: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 53 65 6c            -- Sel
9b20: 65 63 74 20 73 75 62 73 65 74 20 6f 66 20 62 72  ect subset of br
9b30: 61 6e 63 68 20 63 68 69 6c 64 72 65 6e 0a 20 20  anch children.  
9b40: 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28    UNION.    -- (
9b50: 34 29 20 43 68 69 6c 64 20 6f 66 20 74 72 75 6e  4) Child of trun
9b60: 6b 20 72 6f 6f 74 20 73 75 63 63 65 73 73 6f 72  k root successor
9b70: 20 6f 66 20 6c 61 73 74 20 4e 54 44 42 20 6f 6e   of last NTDB on
9b80: 20 74 72 75 6e 6b 2e 0a 09 20 20 20 20 53 45 4c   trunk...    SEL
9b90: 45 43 54 20 52 2e 72 69 64 2c 20 52 41 2e 63 68  ECT R.rid, RA.ch
9ba0: 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 72 65  ild..    FROM re
9bb0: 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69  vision R, revisi
9bc0: 6f 6e 20 52 41 0a 09 20 20 20 20 57 48 45 52 45  on RA..    WHERE
9bd0: 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65   R.rid   IN $the
9be0: 73 65 74 20 20 20 20 20 20 2d 2d 20 52 65 73 74  set      -- Rest
9bf0: 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e  rict to revision
9c00: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20  s of interest.. 
9c10: 20 20 20 41 4e 44 20 20 20 52 2e 69 73 64 65 66     AND   R.isdef
9c20: 61 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  ault            
9c30: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
9c40: 4e 54 44 42 0a 09 20 20 20 20 41 4e 44 20 20 20  NTDB..    AND   
9c50: 52 2e 64 62 63 68 69 6c 64 20 49 53 20 4e 4f 54  R.dbchild IS NOT
9c60: 20 4e 55 4c 4c 20 20 20 2d 2d 20 61 6e 64 20 6c   NULL   -- and l
9c70: 61 73 74 20 4e 54 44 42 20 62 65 6c 6f 6e 67 69  ast NTDB belongi
9c80: 6e 67 20 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20  ng to trunk..   
9c90: 20 41 4e 44 20 20 20 52 41 2e 72 69 64 20 3d 20   AND   RA.rid = 
9ca0: 52 2e 64 62 63 68 69 6c 64 20 20 20 20 20 20 2d  R.dbchild      -
9cb0: 2d 20 47 6f 20 64 69 72 65 63 74 6c 79 20 74 6f  - Go directly to
9cc0: 20 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20   trunk root..   
9cd0: 20 41 4e 44 20 20 20 52 41 2e 63 68 69 6c 64 20   AND   RA.child 
9ce0: 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d  IS NOT NULL    -
9cf0: 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 68  - Has primary ch
9d00: 69 6c 64 2e 0a 09 7d 5d 5d 20 7b 0a 09 20 20 20  ild...}]] {..   
9d10: 20 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69   # Consider movi
9d20: 6e 67 20 74 68 69 73 20 74 6f 20 74 68 65 20 69  ng this to the i
9d30: 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e  ntegrity module.
9d40: 0a 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 20  ..    integrity 
9d50: 61 73 73 65 72 74 20 7b 24 72 69 64 20 21 3d 20  assert {$rid != 
9d60: 24 63 68 69 6c 64 7d 20 7b 52 65 76 69 73 69 6f  $child} {Revisio
9d70: 6e 20 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f  n $rid depends o
9d80: 6e 20 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20  n itself.}..    
9d90: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e  lappend dependen
9da0: 63 69 65 73 28 5b 6c 69 73 74 20 72 65 76 20 24  cies([list rev $
9db0: 72 69 64 5d 29 20 5b 6c 69 73 74 20 72 65 76 20  rid]) [list rev 
9dc0: 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65  $child]..}..fore
9dd0: 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 7d 20  ach {rid child} 
9de0: 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73  [state run [subs
9df0: 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e  t -nocommands -n
9e00: 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09  obackslashes {..
9e10: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64      SELECT R.rid
9e20: 2c 20 54 2e 74 69 64 0a 09 20 20 20 20 46 52 4f  , T.tid..    FRO
9e30: 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20  M   revision R, 
9e40: 74 61 67 20 54 0a 09 20 20 20 20 57 48 45 52 45  tag T..    WHERE
9e50: 20 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73    R.rid IN $thes
9e60: 65 74 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74  et       -- Rest
9e70: 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e  rict to revision
9e80: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20  s of interest.. 
9e90: 20 20 20 41 4e 44 20 20 20 20 54 2e 72 65 76 20     AND    T.rev 
9ea0: 3d 20 52 2e 72 69 64 20 20 20 20 20 20 20 20 20  = R.rid         
9eb0: 20 2d 2d 20 53 65 6c 65 63 74 20 74 61 67 73 20   -- Select tags 
9ec0: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 6d  attached to them
9ed0: 0a 09 7d 5d 5d 20 7b 0a 09 20 20 20 20 6c 61 70  ..}]] {..    lap
9ee0: 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65  pend dependencie
9ef0: 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64  s([list rev $rid
9f00: 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61  ]) [list sym::ta
9f10: 67 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f  g $child]..}..fo
9f20: 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64  reach {rid child
9f30: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75  } [state run [su
9f40: 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20  bst -nocommands 
9f50: 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b  -nobackslashes {
9f60: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
9f70: 69 64 2c 20 42 2e 62 69 64 0a 09 20 20 20 20 46  id, B.bid..    F
9f80: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52  ROM   revision R
9f90: 2c 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20 20  , branch B..    
9fa0: 57 48 45 52 45 20 20 52 2e 72 69 64 20 49 4e 20  WHERE  R.rid IN 
9fb0: 24 74 68 65 73 65 74 20 20 20 20 20 20 20 2d 2d  $theset       --
9fc0: 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76   Restrict to rev
9fd0: 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65  isions of intere
9fe0: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42  st..    AND    B
9ff0: 2e 72 6f 6f 74 20 3d 20 52 2e 72 69 64 20 20 20  .root = R.rid   
a000: 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20        -- Select 
a010: 62 72 61 6e 63 68 65 73 20 61 74 74 61 63 68 65  branches attache
a020: 64 20 74 6f 20 74 68 65 6d 0a 09 7d 5d 5d 20 7b  d to them..}]] {
a030: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65  ..    lappend de
a040: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74  pendencies([list
a050: 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c 69 73   rev $rid]) [lis
a060: 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 63  t sym::branch $c
a070: 68 69 6c 64 5d 0a 09 7d 0a 09 72 65 74 75 72 6e  hild]..}..return
a080: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65  .    }..    # re
a090: 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 63 68 61  sult = list (cha
a0a0: 6e 67 65 73 65 74 2d 69 64 29 0a 20 20 20 20 74  ngeset-id).    t
a0b0: 79 70 65 6d 65 74 68 6f 64 20 63 73 5f 73 75 63  ypemethod cs_suc
a0c0: 63 65 73 73 6f 72 73 20 7b 72 65 76 69 73 69 6f  cessors {revisio
a0d0: 6e 73 7d 20 7b 0a 20 20 20 20 20 20 20 20 23 20  ns} {.        # 
a0e0: 54 68 69 73 20 69 73 20 61 20 76 61 72 69 61 6e  This is a varian
a0f0: 74 20 6f 66 20 27 73 75 63 63 65 73 73 6f 72 73  t of 'successors
a100: 27 20 77 68 69 63 68 20 6d 61 70 73 20 74 68 65  ' which maps the
a110: 20 6c 6f 77 2d 6c 65 76 65 6c 0a 20 20 20 20 20   low-level.     
a120: 20 20 20 23 20 64 61 74 61 20 64 69 72 65 63 74     # data direct
a130: 6c 79 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69  ly to the associ
a140: 61 74 65 64 20 63 68 61 6e 67 65 73 65 74 73 2e  ated changesets.
a150: 20 49 2e 65 2e 20 69 6e 73 74 65 61 64 0a 20 20   I.e. instead.  
a160: 20 20 20 20 20 20 23 20 6d 69 6c 6c 69 6f 6e 73        # millions
a170: 20 6f 66 20 64 65 70 65 6e 64 65 6e 63 79 20 70   of dependency p
a180: 61 69 72 73 20 28 69 6e 20 65 78 74 72 65 6d 65  airs (in extreme
a190: 20 63 61 73 65 73 20 28 45 78 61 6d 70 6c 65 3a   cases (Example:
a1a0: 20 54 63 6c 0a 20 20 20 20 20 20 20 20 23 20 43   Tcl.        # C
a1b0: 56 53 29 29 20 77 65 20 72 65 74 75 72 6e 20 61  VS)) we return a
a1c0: 20 76 65 72 79 20 73 68 6f 72 74 20 61 6e 64 20   very short and 
a1d0: 6d 75 63 68 20 6d 6f 72 65 20 6d 61 6e 61 67 65  much more manage
a1e0: 61 62 6c 65 20 6c 69 73 74 0a 20 20 20 20 20 20  able list.      
a1f0: 20 20 23 20 6f 66 20 63 68 61 6e 67 65 73 65 74    # of changeset
a200: 73 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20  s....set theset 
a210: 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f  ('[join $revisio
a220: 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74  ns {','}]')..ret
a230: 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 5b  urn [state run [
a240: 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64  subst -nocommand
a250: 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73  s -nobackslashes
a260: 20 7b 0a 20 20 20 20 2d 2d 20 28 31 29 20 50 72   {.    -- (1) Pr
a270: 69 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20  imary child..   
a280: 20 53 45 4c 45 43 54 20 43 2e 63 69 64 0a 09 20   SELECT C.cid.. 
a290: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69     FROM   revisi
a2a0: 6f 6e 20 52 2c 20 63 73 69 74 65 6d 20 43 49 2c  on R, csitem CI,
a2b0: 20 63 68 61 6e 67 65 73 65 74 20 43 0a 09 20 20   changeset C..  
a2c0: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20    WHERE  R.rid  
a2d0: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20   IN $theset     
a2e0: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72  -- Restrict to r
a2f0: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65  evisions of inte
a300: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
a310: 20 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20   R.child IS NOT 
a320: 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70  NULL    -- Has p
a330: 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 20 20 20  rimary child.   
a340: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20           AND    
a350: 43 49 2e 69 69 64 20 3d 20 52 2e 63 68 69 6c 64  CI.iid = R.child
a360: 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74         -- Select
a370: 20 61 6c 6c 20 63 68 61 6e 67 65 73 65 74 73 0a   all changesets.
a380: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
a390: 20 20 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69     C.cid = CI.ci
a3a0: 64 20 20 20 20 20 20 20 20 20 2d 2d 20 63 6f 6e  d         -- con
a3b0: 74 61 69 6e 69 6e 67 20 74 68 65 20 70 72 69 6d  taining the prim
a3c0: 61 72 79 20 63 68 69 6c 64 0a 20 20 20 20 20 20  ary child.      
a3d0: 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e 74        AND    C.t
a3e0: 79 70 65 20 3d 20 30 20 20 20 20 20 20 20 20 20  ype = 0         
a3f0: 20 20 20 20 2d 2d 20 77 68 69 63 68 20 61 72 65      -- which are
a400: 20 72 65 76 69 73 69 6f 6e 20 63 68 61 6e 67 65   revision change
a410: 73 65 74 73 0a 20 20 20 20 55 4e 49 4f 4e 0a 20  sets.    UNION. 
a420: 20 20 20 2d 2d 20 28 32 29 20 53 65 63 6f 6e 64     -- (2) Second
a430: 61 72 79 20 28 62 72 61 6e 63 68 29 20 63 68 69  ary (branch) chi
a440: 6c 64 72 65 6e 0a 09 20 20 20 20 53 45 4c 45 43  ldren..    SELEC
a450: 54 20 43 2e 63 69 64 0a 09 20 20 20 20 46 52 4f  T C.cid..    FRO
a460: 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20  M   revision R, 
a470: 72 65 76 69 73 69 6f 6e 62 72 61 6e 63 68 63 68  revisionbranchch
a480: 69 6c 64 72 65 6e 20 42 2c 20 63 73 69 74 65 6d  ildren B, csitem
a490: 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43   CI, changeset C
a4a0: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72  ..    WHERE  R.r
a4b0: 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20  id   IN $theset 
a4c0: 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20      -- Restrict 
a4d0: 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20  to revisions of 
a4e0: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e  interest..    AN
a4f0: 44 20 20 20 20 52 2e 72 69 64 20 3d 20 42 2e 72  D    R.rid = B.r
a500: 69 64 20 20 20 20 20 20 20 20 20 20 2d 2d 20 53  id          -- S
a510: 65 6c 65 63 74 20 73 75 62 73 65 74 20 6f 66 20  elect subset of 
a520: 62 72 61 6e 63 68 20 63 68 69 6c 64 72 65 6e 0a  branch children.
a530: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
a540: 20 20 20 43 49 2e 69 69 64 20 3d 20 42 2e 62 72     CI.iid = B.br
a550: 69 64 20 20 20 20 20 20 20 20 2d 2d 20 53 65 6c  id        -- Sel
a560: 65 63 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 65  ect all changese
a570: 74 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 41  ts.            A
a580: 4e 44 20 20 20 20 43 2e 63 69 64 20 3d 20 43 49  ND    C.cid = CI
a590: 2e 63 69 64 09 20 20 2d 2d 20 63 6f 6e 74 61 69  .cid.  -- contai
a5a0: 6e 69 6e 67 20 74 68 65 20 62 72 61 6e 63 68 0a  ning the branch.
a5b0: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
a5c0: 20 20 20 43 2e 74 79 70 65 20 3d 20 30 09 09 20     C.type = 0.. 
a5d0: 20 2d 2d 20 77 68 69 63 68 20 61 72 65 20 72 65   -- which are re
a5e0: 76 69 73 69 6f 6e 20 63 68 61 6e 67 65 73 65 74  vision changeset
a5f0: 73 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20  s.    UNION.    
a600: 2d 2d 20 28 34 29 20 43 68 69 6c 64 20 6f 66 20  -- (4) Child of 
a610: 74 72 75 6e 6b 20 72 6f 6f 74 20 73 75 63 63 65  trunk root succe
a620: 73 73 6f 72 20 6f 66 20 6c 61 73 74 20 4e 54 44  ssor of last NTD
a630: 42 20 6f 6e 20 74 72 75 6e 6b 2e 0a 09 20 20 20  B on trunk...   
a640: 20 53 45 4c 45 43 54 20 43 2e 63 69 64 0a 09 20   SELECT C.cid.. 
a650: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69     FROM   revisi
a660: 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 52  on R, revision R
a670: 41 2c 20 63 73 69 74 65 6d 20 43 49 2c 20 63 68  A, csitem CI, ch
a680: 61 6e 67 65 73 65 74 20 43 0a 09 20 20 20 20 57  angeset C..    W
a690: 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e  HERE  R.rid   IN
a6a0: 20 24 74 68 65 73 65 74 20 20 20 20 20 20 2d 2d   $theset      --
a6b0: 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76   Restrict to rev
a6c0: 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65  isions of intere
a6d0: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  st..    AND    R
a6e0: 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20 20 20  .isdefault      
a6f0: 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69         -- Restri
a700: 63 74 20 74 6f 20 4e 54 44 42 0a 09 20 20 20 20  ct to NTDB..    
a710: 41 4e 44 20 20 20 20 52 2e 64 62 63 68 69 6c 64  AND    R.dbchild
a720: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d   IS NOT NULL   -
a730: 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 42 20  - and last NTDB 
a740: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72 75  belonging to tru
a750: 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  nk..    AND    R
a760: 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69 6c  A.rid = R.dbchil
a770: 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 72  d      -- Go dir
a780: 65 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 72  ectly to trunk r
a790: 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  oot..    AND    
a7a0: 52 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20  RA.child IS NOT 
a7b0: 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70  NULL    -- Has p
a7c0: 72 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 20 20  rimary child..  
a7d0: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20            AND   
a7e0: 20 43 49 2e 69 69 64 20 3d 20 52 41 2e 63 68 69   CI.iid = RA.chi
a7f0: 6c 64 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65  ld       -- Sele
a800: 63 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 65 74  ct all changeset
a810: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e  s.            AN
a820: 44 20 20 20 20 43 2e 63 69 64 20 3d 20 43 49 2e  D    C.cid = CI.
a830: 63 69 64 09 20 20 20 2d 2d 20 63 6f 6e 74 61 69  cid.   -- contai
a840: 6e 69 6e 67 20 74 68 65 20 70 72 69 6d 61 72 79  ning the primary
a850: 20 63 68 69 6c 64 0a 20 20 20 20 20 20 20 20 20   child.         
a860: 20 20 20 41 4e 44 20 20 20 20 43 2e 74 79 70 65     AND    C.type
a870: 20 3d 20 30 09 09 20 20 20 2d 2d 20 77 68 69 63   = 0..   -- whic
a880: 68 20 61 72 65 20 72 65 76 69 73 69 6f 6e 20 63  h are revision c
a890: 68 61 6e 67 65 73 65 74 73 0a 20 20 20 20 55 4e  hangesets.    UN
a8a0: 49 4f 4e 0a 09 20 20 20 20 53 45 4c 45 43 54 20  ION..    SELECT 
a8b0: 43 2e 63 69 64 0a 09 20 20 20 20 46 52 4f 4d 20  C.cid..    FROM 
a8c0: 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 74 61    revision R, ta
a8d0: 67 20 54 2c 20 63 73 69 74 65 6d 20 43 49 2c 20  g T, csitem CI, 
a8e0: 63 68 61 6e 67 65 73 65 74 20 43 0a 09 20 20 20  changeset C..   
a8f0: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 69 6e   WHERE  R.rid in
a900: 20 24 74 68 65 73 65 74 20 20 20 20 20 20 20 20   $theset        
a910: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72  -- Restrict to r
a920: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65  evisions of inte
a930: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
a940: 20 54 2e 72 65 76 20 3d 20 52 2e 72 69 64 09 20   T.rev = R.rid. 
a950: 20 20 2d 2d 20 53 65 6c 65 63 74 20 74 61 67 73    -- Select tags
a960: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
a970: 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e  m.            AN
a980: 44 20 20 20 20 43 49 2e 69 69 64 20 3d 20 54 2e  D    CI.iid = T.
a990: 74 69 64 20 20 20 20 20 20 20 20 20 20 2d 2d 20  tid          -- 
a9a0: 53 65 6c 65 63 74 20 61 6c 6c 20 63 68 61 6e 67  Select all chang
a9b0: 65 73 65 74 73 0a 20 20 20 20 20 20 20 20 20 20  esets.          
a9c0: 20 20 41 4e 44 20 20 20 20 43 2e 63 69 64 20 3d    AND    C.cid =
a9d0: 20 43 49 2e 63 69 64 09 20 20 20 2d 2d 20 63 6f   CI.cid.   -- co
a9e0: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 67  ntaining the tag
a9f0: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e  s.            AN
aa00: 44 20 20 20 20 43 2e 74 79 70 65 20 3d 20 31 09  D    C.type = 1.
aa10: 09 20 20 20 2d 2d 20 77 68 69 63 68 20 61 72 65  .   -- which are
aa20: 20 74 61 67 20 63 68 61 6e 67 65 73 65 74 73 0a   tag changesets.
aa30: 20 20 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 53      UNION..    S
aa40: 45 4c 45 43 54 20 43 2e 63 69 64 0a 09 20 20 20  ELECT C.cid..   
aa50: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
aa60: 20 52 2c 20 62 72 61 6e 63 68 20 42 2c 20 63 73   R, branch B, cs
aa70: 69 74 65 6d 20 43 49 2c 20 63 68 61 6e 67 65 73  item CI, changes
aa80: 65 74 20 43 0a 09 20 20 20 20 57 48 45 52 45 20  et C..    WHERE 
aa90: 20 52 2e 72 69 64 20 69 6e 20 24 74 68 65 73 65   R.rid in $these
aaa0: 74 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74  t        -- Rest
aab0: 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e  rict to revision
aac0: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20  s of interest.. 
aad0: 20 20 20 41 4e 44 20 20 20 20 42 2e 72 6f 6f 74     AND    B.root
aae0: 20 3d 20 52 2e 72 69 64 09 20 20 20 2d 2d 20 53   = R.rid.   -- S
aaf0: 65 6c 65 63 74 20 62 72 61 6e 63 68 65 73 20 61  elect branches a
ab00: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 6d 0a  ttached to them.
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
ab20: 20 20 20 43 49 2e 69 69 64 20 3d 20 42 2e 62 69     CI.iid = B.bi
ab30: 64 20 20 20 20 20 20 20 20 20 20 2d 2d 20 53 65  d          -- Se
ab40: 6c 65 63 74 20 61 6c 6c 20 63 68 61 6e 67 65 73  lect all changes
ab50: 65 74 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  ets.            
ab60: 41 4e 44 20 20 20 20 43 2e 63 69 64 20 3d 20 43  AND    C.cid = C
ab70: 49 2e 63 69 64 09 20 20 20 2d 2d 20 63 6f 6e 74  I.cid.   -- cont
ab80: 61 69 6e 69 6e 67 20 74 68 65 20 62 72 61 6e 63  aining the branc
ab90: 68 65 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  hes.            
aba0: 41 4e 44 20 20 20 20 43 2e 74 79 70 65 20 3d 20  AND    C.type = 
abb0: 32 09 09 20 20 20 2d 2d 20 77 68 69 63 68 20 61  2..   -- which a
abc0: 72 65 20 62 72 61 6e 63 68 20 63 68 61 6e 67 65  re branch change
abd0: 73 65 74 73 0a 09 7d 5d 5d 0a 20 20 20 20 7d 0a  sets..}]].    }.
abe0: 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20  .    # result = 
abf0: 73 79 6d 62 6f 6c 20 6e 61 6d 65 0a 20 20 20 20  symbol name.    
ac00: 74 79 70 65 6d 65 74 68 6f 64 20 63 73 5f 6c 6f  typemethod cs_lo
ac10: 64 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a  d {revisions} {.
ac20: 09 23 20 44 65 74 65 72 6d 69 6e 65 73 20 74 68  .# Determines th
ac30: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79  e name of the sy
ac40: 6d 62 6f 6c 20 77 68 69 63 68 20 69 73 20 74 68  mbol which is th
ac50: 65 20 6c 69 6e 65 20 6f 66 0a 09 23 20 64 65 76  e line of..# dev
ac60: 65 6c 6f 70 6d 65 6e 74 20 66 6f 72 20 74 68 65  elopment for the
ac70: 20 72 65 76 69 73 69 6f 6e 73 20 69 6e 20 61 20   revisions in a 
ac80: 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 73 65 74  changeset....set
ac90: 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20   theset ('[join 
aca0: 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d  $revisions {','}
acb0: 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61  ]')..return [sta
acc0: 74 65 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e  te run [subst -n
acd0: 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63  ocommands -nobac
ace0: 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20 20 20  kslashes {..    
acf0: 53 45 4c 45 43 54 0a 09 20 20 20 20 44 49 53 54  SELECT..    DIST
ad00: 49 4e 43 54 20 4c 2e 6e 61 6d 65 0a 09 20 20 20  INCT L.name..   
ad10: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
ad20: 20 52 2c 20 73 79 6d 62 6f 6c 20 4c 0a 09 20 20   R, symbol L..  
ad30: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 69    WHERE  R.rid i
ad40: 6e 20 24 74 68 65 73 65 74 20 20 20 20 20 20 20  n $theset       
ad50: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
ad60: 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74  revisions of int
ad70: 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20  erest..    AND  
ad80: 20 20 4c 2e 73 69 64 20 3d 20 52 2e 6c 6f 64 20    L.sid = R.lod 
ad90: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 47 65 74            -- Get
ada0: 20 6c 6f 64 20 73 79 6d 62 6f 6c 20 6f 66 20 72   lod symbol of r
adb0: 65 76 69 73 69 6f 6e 0a 09 7d 5d 5d 0a 20 20 20  evision..}]].   
adc0: 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 23   }.}..# # ## ###
add0: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20   ##### ######## 
ade0: 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23  ############# ##
adf0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
ae00: 23 23 23 0a 23 23 20 48 65 6c 70 65 72 20 73 69  ###.## Helper si
ae10: 6e 67 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64  ngleton. Command
ae20: 73 20 66 6f 72 20 74 61 67 20 73 79 6d 62 6f 6c  s for tag symbol
ae30: 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e   changesets...sn
ae40: 69 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66  it::type ::vc::f
ae50: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63  ossil::import::c
ae60: 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76  vs::project::rev
ae70: 3a 3a 73 79 6d 3a 3a 74 61 67 20 7b 0a 20 20 20  ::sym::tag {.   
ae80: 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 72 65   typemethod byre
ae90: 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75  vision {} { retu
aea0: 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d  rn 0 }.    typem
aeb0: 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20  ethod bysymbol  
aec0: 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d   {} { return 1 }
aed0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
aee0: 69 73 74 61 67 20 20 20 20 20 20 7b 7d 20 7b 20  istag      {} { 
aef0: 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74  return 1 }.    t
af00: 79 70 65 6d 65 74 68 6f 64 20 69 73 62 72 61 6e  ypemethod isbran
af10: 63 68 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e  ch   {} { return
af20: 20 30 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65   0 }..    typeme
af30: 74 68 6f 64 20 73 74 72 20 7b 74 61 67 7d 20 7b  thod str {tag} {
af40: 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61  ..struct::list a
af50: 73 73 69 67 6e 20 5b 73 74 61 74 65 20 72 75 6e  ssign [state run
af60: 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 53   {..    SELECT S
af70: 2e 6e 61 6d 65 2c 20 46 2e 6e 61 6d 65 2c 20 50  .name, F.name, P
af80: 2e 6e 61 6d 65 0a 09 20 20 20 20 46 52 4f 4d 20  .name..    FROM 
af90: 20 20 74 61 67 20 54 2c 20 73 79 6d 62 6f 6c 20    tag T, symbol 
afa0: 53 2c 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65  S, file F, proje
afb0: 63 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 20  ct P..    WHERE 
afc0: 20 54 2e 74 69 64 20 3d 20 24 74 61 67 20 20 20   T.tid = $tag   
afd0: 2d 2d 20 46 69 6e 64 20 73 70 65 63 69 66 69 65  -- Find specifie
afe0: 64 20 74 61 67 0a 09 20 20 20 20 41 4e 44 20 20  d tag..    AND  
aff0: 20 20 46 2e 66 69 64 20 3d 20 54 2e 66 69 64 20    F.fid = T.fid 
b000: 20 2d 2d 20 47 65 74 20 66 69 6c 65 20 6f 66 20   -- Get file of 
b010: 74 61 67 0a 09 20 20 20 20 41 4e 44 20 20 20 20  tag..    AND    
b020: 50 2e 70 69 64 20 3d 20 46 2e 70 69 64 20 20 2d  P.pid = F.pid  -
b030: 2d 20 47 65 74 20 70 72 6f 6a 65 63 74 20 6f 66  - Get project of
b040: 20 66 69 6c 65 0a 09 20 20 20 20 41 4e 44 20 20   file..    AND  
b050: 20 20 53 2e 73 69 64 20 3d 20 54 2e 73 69 64 20    S.sid = T.sid 
b060: 20 2d 2d 20 47 65 74 20 73 79 6d 62 6f 6c 20 6f   -- Get symbol o
b070: 66 20 74 61 67 0a 09 7d 5d 20 73 6e 61 6d 65 20  f tag..}] sname 
b080: 66 6e 61 6d 65 20 70 6e 61 6d 65 0a 09 72 65 74  fname pname..ret
b090: 75 72 6e 20 22 24 70 6e 61 6d 65 2f 54 27 24 7b  urn "$pname/T'${
b0a0: 73 6e 61 6d 65 7d 27 3a 3a 24 66 6e 61 6d 65 22  sname}'::$fname"
b0b0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65  .    }..    # re
b0c0: 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69 6e  sult = list (min
b0d0: 74 69 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a 20  time, maxtime). 
b0e0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 74 69     typemethod ti
b0f0: 6d 65 72 61 6e 67 65 20 7b 74 61 67 73 7d 20 7b  merange {tags} {
b100: 0a 09 23 20 54 68 65 20 72 61 6e 67 65 20 69 73  ..# The range is
b110: 20 64 65 66 69 6e 65 64 20 61 73 20 74 68 65 20   defined as the 
b120: 72 61 6e 67 65 20 6f 66 20 74 68 65 20 72 65 76  range of the rev
b130: 69 73 69 6f 6e 73 20 74 68 65 20 74 61 67 73 0a  isions the tags.
b140: 09 23 20 61 72 65 20 61 74 74 61 63 68 65 64 20  .# are attached 
b150: 74 6f 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74  to....set theset
b160: 20 28 27 5b 6a 6f 69 6e 20 24 74 61 67 73 20 7b   ('[join $tags {
b170: 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20  ','}]')..return 
b180: 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73  [state run [subs
b190: 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e  t -nocommands -n
b1a0: 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09  obackslashes {..
b1b0: 20 20 20 20 53 45 4c 45 43 54 20 4d 49 4e 28 52      SELECT MIN(R
b1c0: 2e 64 61 74 65 29 2c 20 4d 41 58 28 52 2e 64 61  .date), MAX(R.da
b1d0: 74 65 29 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  te)..    FROM   
b1e0: 74 61 67 20 54 2c 20 72 65 76 69 73 69 6f 6e 20  tag T, revision 
b1f0: 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 54 2e  R..    WHERE  T.
b200: 74 69 64 20 49 4e 20 24 74 68 65 73 65 74 20 20  tid IN $theset  
b210: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 74  -- Restrict to t
b220: 61 67 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  ags of interest.
b230: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
b240: 20 20 20 52 2e 72 69 64 20 3d 20 54 2e 72 65 76     R.rid = T.rev
b250: 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 74       -- Select t
b260: 61 67 20 70 61 72 65 6e 74 20 72 65 76 69 73 69  ag parent revisi
b270: 6f 6e 73 0a 09 7d 5d 5d 0a 20 20 20 20 7d 0a 0a  ons..}]].    }..
b280: 20 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20      # var(dv) = 
b290: 64 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69  dict (item -> li
b2a0: 73 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d  st (item)), item
b2b0: 20 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69    = list (type i
b2c0: 64 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  d).    typemetho
b2d0: 64 20 73 75 63 63 65 73 73 6f 72 73 20 7b 64 76  d successors {dv
b2e0: 20 74 61 67 73 7d 20 7b 0a 09 23 20 54 61 67 73   tags} {..# Tags
b2f0: 20 68 61 76 65 20 6e 6f 20 73 75 63 63 65 73 73   have no success
b300: 6f 72 73 2e 0a 09 72 65 74 75 72 6e 0a 20 20 20  ors...return.   
b310: 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74   }..    # result
b320: 20 3d 20 34 2d 6c 69 73 74 20 28 69 74 65 6d 74   = 4-list (itemt
b330: 79 70 65 20 69 74 65 6d 69 64 20 6e 65 78 74 69  ype itemid nexti
b340: 74 65 6d 74 79 70 65 20 6e 65 78 74 69 74 65 6d  temtype nextitem
b350: 69 64 20 2e 2e 2e 29 0a 20 20 20 20 74 79 70 65  id ...).    type
b360: 6d 65 74 68 6f 64 20 6c 6f 6f 70 73 20 7b 74 61  method loops {ta
b370: 67 73 7d 20 7b 0a 09 23 20 54 61 67 73 20 68 61  gs} {..# Tags ha
b380: 76 65 20 6e 6f 20 73 75 63 63 65 73 73 6f 72 73  ve no successors
b390: 2c 20 74 68 65 72 65 66 6f 72 65 20 63 61 6e 6e  , therefore cann
b3a0: 6f 74 20 63 61 75 73 65 20 6c 6f 6f 70 73 0a 09  ot cause loops..
b3b0: 72 65 74 75 72 6e 20 7b 7d 0a 20 20 20 20 7d 0a  return {}.    }.
b3c0: 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20  .    # result = 
b3d0: 6c 69 73 74 20 28 63 68 61 6e 67 65 73 65 74 2d  list (changeset-
b3e0: 69 64 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68  id).    typemeth
b3f0: 6f 64 20 63 73 5f 73 75 63 63 65 73 73 6f 72 73  od cs_successors
b400: 20 7b 74 61 67 73 7d 20 7b 0a 09 23 20 54 61 67   {tags} {..# Tag
b410: 73 20 68 61 76 65 20 6e 6f 20 73 75 63 63 65 73  s have no succes
b420: 73 6f 72 73 2e 0a 09 72 65 74 75 72 6e 0a 20 20  sors...return.  
b430: 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c    }..    # resul
b440: 74 20 3d 20 73 79 6d 62 6f 6c 20 6e 61 6d 65 0a  t = symbol name.
b450: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 63      typemethod c
b460: 73 5f 6c 6f 64 20 7b 74 61 67 73 7d 20 7b 0a 09  s_lod {tags} {..
b470: 23 20 44 65 74 65 72 6d 69 6e 65 73 20 74 68 65  # Determines the
b480: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 6d   name of the sym
b490: 62 6f 6c 20 77 68 69 63 68 20 69 73 20 74 68 65  bol which is the
b4a0: 20 6c 69 6e 65 20 6f 66 0a 09 23 20 64 65 76 65   line of..# deve
b4b0: 6c 6f 70 6d 65 6e 74 20 66 6f 72 20 74 68 65 20  lopment for the 
b4c0: 74 61 67 73 20 69 6e 20 61 20 63 68 61 6e 67 65  tags in a change
b4d0: 73 65 74 2e 0a 0a 09 73 65 74 20 74 68 65 73 65  set....set these
b4e0: 74 20 28 27 5b 6a 6f 69 6e 20 24 74 61 67 73 20  t ('[join $tags 
b4f0: 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e  {','}]')..return
b500: 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62   [state run [sub
b510: 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d  st -nocommands -
b520: 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a  nobackslashes {.
b530: 09 20 20 20 20 53 45 4c 45 43 54 0a 09 20 20 20  .    SELECT..   
b540: 20 44 49 53 54 49 4e 43 54 20 4c 2e 6e 61 6d 65   DISTINCT L.name
b550: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 74 61 67  ..    FROM   tag
b560: 20 54 2c 20 73 79 6d 62 6f 6c 20 4c 0a 09 20 20   T, symbol L..  
b570: 20 20 57 48 45 52 45 20 20 54 2e 74 69 64 20 69    WHERE  T.tid i
b580: 6e 20 24 74 68 65 73 65 74 20 20 20 20 20 20 20  n $theset       
b590: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
b5a0: 74 61 67 73 20 6f 66 20 69 6e 74 65 72 65 73 74  tags of interest
b5b0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 4c 2e 73  ..    AND    L.s
b5c0: 69 64 20 3d 20 54 2e 6c 6f 64 20 20 20 20 20 20  id = T.lod      
b5d0: 20 20 20 20 20 2d 2d 20 47 65 74 20 6c 6f 64 20       -- Get lod 
b5e0: 73 79 6d 62 6f 6c 20 6f 66 20 74 61 67 0a 09 7d  symbol of tag..}
b5f0: 5d 5d 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 20  ]].    }.}..# # 
b600: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
b610: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
b620: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
b630: 23 23 23 23 23 23 23 23 23 0a 23 23 20 48 65 6c  #########.## Hel
b640: 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 2e 20 43  per singleton. C
b650: 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 62 72 61 6e  ommands for bran
b660: 63 68 20 73 79 6d 62 6f 6c 20 63 68 61 6e 67 65  ch symbol change
b670: 73 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70  sets...snit::typ
b680: 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a  e ::vc::fossil::
b690: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f  import::cvs::pro
b6a0: 6a 65 63 74 3a 3a 72 65 76 3a 3a 73 79 6d 3a 3a  ject::rev::sym::
b6b0: 62 72 61 6e 63 68 20 7b 0a 20 20 20 20 74 79 70  branch {.    typ
b6c0: 65 6d 65 74 68 6f 64 20 62 79 72 65 76 69 73 69  emethod byrevisi
b6d0: 6f 6e 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30  on {} { return 0
b6e0: 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f   }.    typemetho
b6f0: 64 20 62 79 73 79 6d 62 6f 6c 20 20 20 7b 7d 20  d bysymbol   {} 
b700: 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20  { return 1 }.   
b710: 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73 74 61   typemethod ista
b720: 67 20 20 20 20 20 20 7b 7d 20 7b 20 72 65 74 75  g      {} { retu
b730: 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d  rn 0 }.    typem
b740: 65 74 68 6f 64 20 69 73 62 72 61 6e 63 68 20 20  ethod isbranch  
b750: 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d   {} { return 1 }
b760: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ..    typemethod
b770: 20 73 74 72 20 7b 62 72 61 6e 63 68 7d 20 7b 0a   str {branch} {.
b780: 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73  .struct::list as
b790: 73 69 67 6e 20 5b 73 74 61 74 65 20 72 75 6e 20  sign [state run 
b7a0: 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 53 2e  {..    SELECT S.
b7b0: 6e 61 6d 65 2c 20 46 2e 6e 61 6d 65 2c 20 50 2e  name, F.name, P.
b7c0: 6e 61 6d 65 0a 09 20 20 20 20 46 52 4f 4d 20 20  name..    FROM  
b7d0: 20 62 72 61 6e 63 68 20 42 2c 20 73 79 6d 62 6f   branch B, symbo
b7e0: 6c 20 53 2c 20 66 69 6c 65 20 46 2c 20 70 72 6f  l S, file F, pro
b7f0: 6a 65 63 74 20 50 0a 09 20 20 20 20 57 48 45 52  ject P..    WHER
b800: 45 20 20 42 2e 62 69 64 20 3d 20 24 62 72 61 6e  E  B.bid = $bran
b810: 63 68 20 20 2d 2d 20 46 69 6e 64 20 73 70 65 63  ch  -- Find spec
b820: 69 66 69 65 64 20 62 72 61 6e 63 68 0a 09 20 20  ified branch..  
b830: 20 20 41 4e 44 20 20 20 20 46 2e 66 69 64 20 3d    AND    F.fid =
b840: 20 42 2e 66 69 64 20 20 20 20 2d 2d 20 47 65 74   B.fid    -- Get
b850: 20 66 69 6c 65 20 6f 66 20 62 72 61 6e 63 68 0a   file of branch.
b860: 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69  .    AND    P.pi
b870: 64 20 3d 20 46 2e 70 69 64 20 20 20 20 2d 2d 20  d = F.pid    -- 
b880: 47 65 74 20 70 72 6f 6a 65 63 74 20 6f 66 20 66  Get project of f
b890: 69 6c 65 0a 09 20 20 20 20 41 4e 44 20 20 20 20  ile..    AND    
b8a0: 53 2e 73 69 64 20 3d 20 42 2e 73 69 64 20 20 20  S.sid = B.sid   
b8b0: 20 2d 2d 20 47 65 74 20 73 79 6d 62 6f 6c 20 6f   -- Get symbol o
b8c0: 66 20 62 72 61 6e 63 68 0a 09 7d 5d 20 73 6e 61  f branch..}] sna
b8d0: 6d 65 20 66 6e 61 6d 65 20 70 6e 61 6d 65 0a 09  me fname pname..
b8e0: 72 65 74 75 72 6e 20 22 24 70 6e 61 6d 65 2f 42  return "$pname/B
b8f0: 27 24 7b 73 6e 61 6d 65 7d 27 3a 3a 24 66 6e 61  '${sname}'::$fna
b900: 6d 65 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  me".    }..    #
b910: 20 72 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 28   result = list (
b920: 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74 69 6d 65  mintime, maxtime
b930: 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ).    typemethod
b940: 20 74 69 6d 65 72 61 6e 67 65 20 7b 62 72 61 6e   timerange {bran
b950: 63 68 65 73 7d 20 7b 0a 09 23 20 54 68 65 20 72  ches} {..# The r
b960: 61 6e 67 65 20 6f 66 20 61 20 62 72 61 6e 63 68  ange of a branch
b970: 20 69 73 20 64 65 66 69 6e 65 64 20 61 73 20 74   is defined as t
b980: 68 65 20 72 61 6e 67 65 20 6f 66 20 74 68 65 0a  he range of the.
b990: 09 23 20 72 65 76 69 73 69 6f 6e 73 20 74 68 65  .# revisions the
b9a0: 20 62 72 61 6e 63 68 65 73 20 61 72 65 20 73 70   branches are sp
b9b0: 61 77 6e 65 64 20 62 79 2e 20 4e 4f 54 45 20 68  awned by. NOTE h
b9c0: 6f 77 65 76 65 72 20 74 68 61 74 20 74 68 65 0a  owever that the.
b9d0: 09 23 20 62 72 61 6e 63 68 65 73 20 61 73 73 6f  .# branches asso
b9e0: 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64 65  ciated with a de
b9f0: 74 61 63 68 65 64 20 4e 54 44 42 20 77 69 6c 6c  tached NTDB will
ba00: 20 68 61 76 65 20 6e 6f 20 72 6f 6f 74 0a 09 23   have no root..#
ba10: 20 73 70 61 77 6e 69 6e 67 20 74 68 65 6d 2c 20   spawning them, 
ba20: 68 65 6e 63 65 20 74 68 65 79 20 68 61 76 65 20  hence they have 
ba30: 6e 6f 20 72 65 61 6c 20 74 69 6d 65 72 61 6e 67  no real timerang
ba40: 65 20 61 6e 79 0a 09 23 20 6c 6f 6e 67 65 72 2e  e any..# longer.
ba50: 20 42 79 20 75 73 69 6e 67 20 30 20 77 65 20 70   By using 0 we p
ba60: 75 74 20 74 68 65 6d 20 69 6e 20 66 72 6f 6e 74  ut them in front
ba70: 20 6f 66 20 65 76 65 72 79 74 68 69 6e 67 20 65   of everything e
ba80: 6c 73 65 2c 0a 09 23 20 61 73 20 74 68 65 79 20  lse,..# as they 
ba90: 6c 6f 67 69 63 61 6c 6c 79 20 61 72 65 2e 0a 0a  logically are...
baa0: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a  .set theset ('[j
bab0: 6f 69 6e 20 24 62 72 61 6e 63 68 65 73 20 7b 27  oin $branches {'
bac0: 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b  ,'}]')..return [
bad0: 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73 74  state run [subst
bae0: 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f   -nocommands -no
baf0: 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20  backslashes {.. 
bb00: 20 20 20 53 45 4c 45 43 54 20 49 46 4e 55 4c 4c     SELECT IFNULL
bb10: 28 4d 49 4e 28 52 2e 64 61 74 65 29 2c 30 29 2c  (MIN(R.date),0),
bb20: 20 49 46 4e 55 4c 4c 28 4d 41 58 28 52 2e 64 61   IFNULL(MAX(R.da
bb30: 74 65 29 2c 30 29 0a 09 20 20 20 20 46 52 4f 4d  te),0)..    FROM
bb40: 20 20 62 72 61 6e 63 68 20 42 2c 20 72 65 76 69    branch B, revi
bb50: 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52  sion R..    WHER
bb60: 45 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73  E B.bid IN $thes
bb70: 65 74 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74  et   -- Restrict
bb80: 20 74 6f 20 62 72 61 6e 63 68 65 73 20 6f 66 20   to branches of 
bb90: 69 6e 74 65 72 65 73 74 0a 20 20 20 20 20 20 20  interest.       
bba0: 20 20 20 20 20 41 4e 44 20 20 20 52 2e 72 69 64       AND   R.rid
bbb0: 20 3d 20 42 2e 72 6f 6f 74 20 20 20 20 20 2d 2d   = B.root     --
bbc0: 20 53 65 6c 65 63 74 20 62 72 61 6e 63 68 20 70   Select branch p
bbd0: 61 72 65 6e 74 20 72 65 76 69 73 69 6f 6e 73 0a  arent revisions.
bbe0: 09 7d 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  .}]].    }..    
bbf0: 23 20 72 65 73 75 6c 74 20 3d 20 34 2d 6c 69 73  # result = 4-lis
bc00: 74 20 28 69 74 65 6d 74 79 70 65 20 69 74 65 6d  t (itemtype item
bc10: 69 64 20 6e 65 78 74 69 74 65 6d 74 79 70 65 20  id nextitemtype 
bc20: 6e 65 78 74 69 74 65 6d 69 64 20 2e 2e 2e 29 0a  nextitemid ...).
bc30: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c      typemethod l
bc40: 6f 6f 70 73 20 7b 62 72 61 6e 63 68 65 73 7d 20  oops {branches} 
bc50: 7b 0a 09 23 20 4e 6f 74 65 3a 20 52 65 76 69 73  {..# Note: Revis
bc60: 69 6f 6e 73 20 61 6e 64 20 74 61 67 73 20 63 61  ions and tags ca
bc70: 6e 6e 6f 74 20 63 61 75 73 65 20 74 68 65 20 6c  nnot cause the l
bc80: 6f 6f 70 2e 20 42 65 69 6e 67 20 6f 66 20 61 0a  oop. Being of a.
bc90: 09 23 20 66 75 6e 64 61 6d 65 6e 74 61 6c 6c 79  .# fundamentally
bca0: 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65 20   different type 
bcb0: 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 69  they cannot be i
bcc0: 6e 20 74 68 65 20 69 6e 63 6f 6d 69 6e 67 0a 09  n the incoming..
bcd0: 23 20 73 65 74 20 6f 66 20 69 64 73 2e 0a 0a 09  # set of ids....
bce0: 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f  set theset ('[jo
bcf0: 69 6e 20 24 62 72 61 6e 63 68 65 73 20 7b 27 2c  in $branches {',
bd00: 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73  '}]')..return [s
bd10: 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73 74 20  tate run [subst 
bd20: 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62  -nocommands -nob
bd30: 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20  ackslashes {..  
bd40: 20 20 53 45 4c 45 43 54 20 42 2e 62 69 64 2c 20    SELECT B.bid, 
bd50: 42 58 2e 62 69 64 0a 09 20 20 20 20 46 52 4f 4d  BX.bid..    FROM
bd60: 20 20 20 62 72 61 6e 63 68 20 42 2c 20 70 72 65     branch B, pre
bd70: 66 65 72 65 64 70 61 72 65 6e 74 20 50 2c 20 62  feredparent P, b
bd80: 72 61 6e 63 68 20 42 58 0a 09 20 20 20 20 57 48  ranch BX..    WH
bd90: 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74  ERE  B.bid IN $t
bda0: 68 65 73 65 74 20 20 20 2d 2d 20 52 65 73 74 72  heset   -- Restr
bdb0: 69 63 74 20 74 6f 20 62 72 61 6e 63 68 65 73 20  ict to branches 
bdc0: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20  of interest..   
bdd0: 20 41 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20   AND    B.sid = 
bde0: 50 2e 70 69 64 20 20 20 20 20 20 2d 2d 20 47 65  P.pid      -- Ge
bdf0: 74 20 74 68 65 20 70 72 65 66 65 72 65 64 20 62  t the prefered b
be00: 72 61 6e 63 68 65 73 20 76 69 61 0a 09 20 20 20  ranches via..   
be10: 20 41 4e 44 20 20 20 20 42 58 2e 73 69 64 20 3d   AND    BX.sid =
be20: 20 50 2e 73 69 64 20 20 20 20 20 2d 2d 20 74 68   P.sid     -- th
be30: 65 20 62 72 61 6e 63 68 20 73 79 6d 62 6f 6c 73  e branch symbols
be40: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 58 2e  ..    AND    BX.
be50: 62 69 64 20 49 4e 20 24 74 68 65 73 65 74 20 20  bid IN $theset  
be60: 2d 2d 20 4c 6f 6f 70 0a 09 7d 5d 5d 0a 20 20 20  -- Loop..}]].   
be70: 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76   }..    # var(dv
be80: 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d  ) = dict (item -
be90: 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c 20  > list (item)), 
bea0: 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 79  item  = list (ty
beb0: 70 65 20 69 64 29 0a 20 20 20 20 74 79 70 65 6d  pe id).    typem
bec0: 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f 72 73  ethod successors
bed0: 20 7b 64 76 20 62 72 61 6e 63 68 65 73 7d 20 7b   {dv branches} {
bee0: 0a 09 75 70 76 61 72 20 31 20 24 64 76 20 64 65  ..upvar 1 $dv de
bef0: 70 65 6e 64 65 6e 63 69 65 73 0a 09 23 20 54 68  pendencies..# Th
bf00: 65 20 66 69 72 73 74 20 72 65 76 69 73 69 6f 6e  e first revision
bf10: 20 63 6f 6d 6d 69 74 74 65 64 20 6f 6e 20 61 20   committed on a 
bf20: 62 72 61 6e 63 68 2c 20 61 6e 64 20 61 6c 6c 20  branch, and all 
bf30: 62 72 61 6e 63 68 65 73 0a 09 23 20 61 6e 64 20  branches..# and 
bf40: 74 61 67 73 20 77 68 69 63 68 20 68 61 76 65 20  tags which have 
bf50: 69 74 20 61 73 20 74 68 65 69 72 20 70 72 65 66  it as their pref
bf60: 65 72 65 64 20 70 61 72 65 6e 74 20 61 72 65 20  ered parent are 
bf70: 74 68 65 0a 09 23 20 73 75 63 63 65 73 73 6f 72  the..# successor
bf80: 73 20 6f 66 20 61 20 62 72 61 6e 63 68 2e 0a 0a  s of a branch...
bf90: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a  .set theset ('[j
bfa0: 6f 69 6e 20 24 62 72 61 6e 63 68 65 73 20 7b 27  oin $branches {'
bfb0: 2c 27 7d 5d 27 29 0a 09 66 6f 72 65 61 63 68 20  ,'}]')..foreach 
bfc0: 7b 62 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61  {bid child} [sta
bfd0: 74 65 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e  te run [subst -n
bfe0: 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63  ocommands -nobac
bff0: 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20 20 20  kslashes {..    
c000: 53 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 52 2e  SELECT B.bid, R.
c010: 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  rid..    FROM   
c020: 62 72 61 6e 63 68 20 42 2c 20 72 65 76 69 73 69  branch B, revisi
c030: 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20  on R..    WHERE 
c040: 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65   B.bid IN $these
c050: 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63  t     -- Restric
c060: 74 20 74 6f 20 62 72 61 6e 63 68 65 73 20 6f 66  t to branches of
c070: 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41   interest..    A
c080: 4e 44 20 20 20 20 42 2e 66 69 72 73 74 20 3d 20  ND    B.first = 
c090: 52 2e 72 69 64 20 20 20 20 20 20 2d 2d 20 47 65  R.rid      -- Ge
c0a0: 74 20 66 69 72 73 74 20 72 65 76 69 73 69 6f 6e  t first revision
c0b0: 20 6f 6e 20 74 68 65 20 62 72 61 6e 63 68 0a 09   on the branch..
c0c0: 7d 5d 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65  }]] {..    lappe
c0d0: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28  nd dependencies(
c0e0: 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63  [list sym::branc
c0f0: 68 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 20 72  h $bid]) [list r
c100: 65 76 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66  ev $child]..}..f
c110: 6f 72 65 61 63 68 20 7b 62 69 64 20 63 68 69 6c  oreach {bid chil
c120: 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73  d} [state run [s
c130: 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73  ubst -nocommands
c140: 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20   -nobackslashes 
c150: 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e  {..    SELECT B.
c160: 62 69 64 2c 20 42 58 2e 62 69 64 0a 09 20 20 20  bid, BX.bid..   
c170: 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42   FROM   branch B
c180: 2c 20 70 72 65 66 65 72 65 64 70 61 72 65 6e 74  , preferedparent
c190: 20 50 2c 20 62 72 61 6e 63 68 20 42 58 0a 09 20   P, branch BX.. 
c1a0: 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20     WHERE  B.bid 
c1b0: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d  IN $theset     -
c1c0: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 62 72  - Restrict to br
c1d0: 61 6e 63 68 65 73 20 6f 66 20 69 6e 74 65 72 65  anches of intere
c1e0: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42  st..    AND    B
c1f0: 2e 73 69 64 20 3d 20 50 2e 70 69 64 20 20 20 20  .sid = P.pid    
c200: 20 20 20 20 2d 2d 20 47 65 74 20 73 75 62 6f 72      -- Get subor
c210: 64 69 6e 61 74 65 20 62 72 61 6e 63 68 65 73 20  dinate branches 
c220: 76 69 61 20 74 68 65 0a 09 20 20 20 20 41 4e 44  via the..    AND
c230: 20 20 20 20 42 58 2e 73 69 64 20 3d 20 50 2e 73      BX.sid = P.s
c240: 69 64 20 20 20 20 20 20 20 2d 2d 20 70 72 65 66  id       -- pref
c250: 65 72 65 64 20 70 61 72 65 6e 74 73 20 6f 66 20  ered parents of 
c260: 74 68 65 69 72 20 73 79 6d 62 6f 6c 73 0a 09 7d  their symbols..}
c270: 5d 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e  ]] {..    lappen
c280: 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b  d dependencies([
c290: 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68  list sym::branch
c2a0: 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 20 73 79   $bid]) [list sy
c2b0: 6d 3a 3a 62 72 61 6e 63 68 20 24 63 68 69 6c 64  m::branch $child
c2c0: 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62  ]..}..foreach {b
c2d0: 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65  id child} [state
c2e0: 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63   run [subst -noc
c2f0: 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73  ommands -nobacks
c300: 6c 61 73 68 65 73 20 7b 0a 09 20 20 20 20 53 45  lashes {..    SE
c310: 4c 45 43 54 20 42 2e 62 69 64 2c 20 54 2e 74 69  LECT B.bid, T.ti
c320: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72  d..    FROM   br
c330: 61 6e 63 68 20 42 2c 20 70 72 65 66 65 72 65 64  anch B, prefered
c340: 70 61 72 65 6e 74 20 50 2c 20 74 61 67 20 54 0a  parent P, tag T.
c350: 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69  .    WHERE  B.bi
c360: 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20  d IN $theset    
c370: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
c380: 62 72 61 6e 63 68 65 73 20 6f 66 20 69 6e 74 65  branches of inte
c390: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
c3a0: 20 42 2e 73 69 64 20 3d 20 50 2e 70 69 64 20 20   B.sid = P.pid  
c3b0: 20 20 20 20 20 20 2d 2d 20 47 65 74 20 73 75 62        -- Get sub
c3c0: 6f 72 64 69 6e 61 74 65 20 74 61 67 73 20 76 69  ordinate tags vi
c3d0: 61 20 74 68 65 0a 09 20 20 20 20 41 4e 44 20 20  a the..    AND  
c3e0: 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 69 64 20    T.sid = P.sid 
c3f0: 20 20 20 20 20 20 20 2d 2d 20 70 72 65 66 65 72         -- prefer
c400: 65 64 20 70 61 72 65 6e 74 73 20 6f 66 20 74 68  ed parents of th
c410: 65 69 72 20 73 79 6d 62 6f 6c 73 0a 09 7d 5d 5d  eir symbols..}]]
c420: 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20   {..    lappend 
c430: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69  dependencies([li
c440: 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24  st sym::branch $
c450: 62 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a  bid]) [list sym:
c460: 3a 74 61 67 20 24 63 68 69 6c 64 5d 0a 09 7d 0a  :tag $child]..}.
c470: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
c480: 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69     # result = li
c490: 73 74 20 28 63 68 61 6e 67 65 73 65 74 2d 69 64  st (changeset-id
c4a0: 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ).    typemethod
c4b0: 20 63 73 5f 73 75 63 63 65 73 73 6f 72 73 20 7b   cs_successors {
c4c0: 62 72 61 6e 63 68 65 73 7d 20 7b 0a 20 20 20 20  branches} {.    
c4d0: 20 20 20 20 23 20 54 68 69 73 20 69 73 20 61 20      # This is a 
c4e0: 76 61 72 69 61 6e 74 20 6f 66 20 27 73 75 63 63  variant of 'succ
c4f0: 65 73 73 6f 72 73 27 20 77 68 69 63 68 20 6d 61  essors' which ma
c500: 70 73 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c  ps the low-level
c510: 0a 20 20 20 20 20 20 20 20 23 20 64 61 74 61 20  .        # data 
c520: 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
c530: 61 73 73 6f 63 69 61 74 65 64 20 63 68 61 6e 67  associated chang
c540: 65 73 65 74 73 2e 20 49 2e 65 2e 20 69 6e 73 74  esets. I.e. inst
c550: 65 61 64 0a 20 20 20 20 20 20 20 20 23 20 6d 69  ead.        # mi
c560: 6c 6c 69 6f 6e 73 20 6f 66 20 64 65 70 65 6e 64  llions of depend
c570: 65 6e 63 79 20 70 61 69 72 73 20 28 69 6e 20 65  ency pairs (in e
c580: 78 74 72 65 6d 65 20 63 61 73 65 73 20 28 45 78  xtreme cases (Ex
c590: 61 6d 70 6c 65 3a 20 54 63 6c 0a 20 20 20 20 20  ample: Tcl.     
c5a0: 20 20 20 23 20 43 56 53 29 29 20 77 65 20 72 65     # CVS)) we re
c5b0: 74 75 72 6e 20 61 20 76 65 72 79 20 73 68 6f 72  turn a very shor
c5c0: 74 20 61 6e 64 20 6d 75 63 68 20 6d 6f 72 65 20  t and much more 
c5d0: 6d 61 6e 61 67 65 61 62 6c 65 20 6c 69 73 74 0a  manageable list.
c5e0: 20 20 20 20 20 20 20 20 23 20 6f 66 20 63 68 61          # of cha
c5f0: 6e 67 65 73 65 74 73 2e 0a 0a 09 73 65 74 20 74  ngesets....set t
c600: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62  heset ('[join $b
c610: 72 61 6e 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29  ranches {','}]')
c620: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
c630: 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73  [state run [subs
c640: 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e  t -nocommands -n
c650: 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09  obackslashes {..
c660: 20 20 20 20 53 45 4c 45 43 54 20 43 2e 63 69 64      SELECT C.cid
c670: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61  ..    FROM   bra
c680: 6e 63 68 20 42 2c 20 72 65 76 69 73 69 6f 6e 20  nch B, revision 
c690: 52 2c 20 63 73 69 74 65 6d 20 43 49 2c 20 63 68  R, csitem CI, ch
c6a0: 61 6e 67 65 73 65 74 20 43 0a 09 20 20 20 20 57  angeset C..    W
c6b0: 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24  HERE  B.bid IN $
c6c0: 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65  theset     -- Re
c6d0: 73 74 72 69 63 74 20 74 6f 20 62 72 61 6e 63 68  strict to branch
c6e0: 65 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09  es of interest..
c6f0: 20 20 20 20 41 4e 44 20 20 20 20 42 2e 66 69 72      AND    B.fir
c700: 73 74 20 3d 20 52 2e 72 69 64 09 2d 2d 20 47 65  st = R.rid.-- Ge
c710: 74 20 66 69 72 73 74 20 72 65 76 69 73 69 6f 6e  t first revision
c720: 20 6f 6e 20 74 68 65 20 62 72 61 6e 63 68 0a 20   on the branch. 
c730: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20             AND  
c740: 20 20 43 49 2e 69 69 64 20 3d 20 52 2e 72 69 64    CI.iid = R.rid
c750: 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74         -- Select
c760: 20 61 6c 6c 20 63 68 61 6e 67 65 73 65 74 73 0a   all changesets.
c770: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
c780: 20 20 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69     C.cid = CI.ci
c790: 64 09 2d 2d 20 63 6f 6e 74 61 69 6e 69 6e 67 20  d.-- containing 
c7a0: 74 68 69 73 20 72 65 76 69 73 69 6f 6e 0a 20 20  this revision.  
c7b0: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20            AND   
c7c0: 20 43 2e 74 79 70 65 20 3d 20 30 09 09 2d 2d 20   C.type = 0..-- 
c7d0: 77 68 69 63 68 20 61 72 65 20 72 65 76 69 73 69  which are revisi
c7e0: 6f 6e 20 63 68 61 6e 67 65 73 65 74 73 0a 20 20  on changesets.  
c7f0: 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 53 45 4c    UNION..    SEL
c800: 45 43 54 20 43 2e 63 69 64 0a 09 20 20 20 20 46  ECT C.cid..    F
c810: 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20  ROM   branch B, 
c820: 70 72 65 66 65 72 65 64 70 61 72 65 6e 74 20 50  preferedparent P
c830: 2c 20 62 72 61 6e 63 68 20 42 58 2c 20 63 73 69  , branch BX, csi
c840: 74 65 6d 20 43 49 2c 20 63 68 61 6e 67 65 73 65  tem CI, changese
c850: 74 20 43 0a 09 20 20 20 20 57 48 45 52 45 20 20  t C..    WHERE  
c860: 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65 74  B.bid IN $theset
c870: 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74       -- Restrict
c880: 20 74 6f 20 62 72 61 6e 63 68 65 73 20 6f 66 20   to branches of 
c890: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e  interest..    AN
c8a0: 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50 2e 70  D    B.sid = P.p
c8b0: 69 64 09 2d 2d 20 47 65 74 20 73 75 62 6f 72 64  id.-- Get subord
c8c0: 69 6e 61 74 65 20 62 72 61 6e 63 68 65 73 20 76  inate branches v
c8d0: 69 61 20 74 68 65 0a 09 20 20 20 20 41 4e 44 20  ia the..    AND 
c8e0: 20 20 20 42 58 2e 73 69 64 20 3d 20 50 2e 73 69     BX.sid = P.si
c8f0: 64 09 2d 2d 20 70 72 65 66 65 72 65 64 20 70 61  d.-- prefered pa
c900: 72 65 6e 74 73 20 6f 66 20 74 68 65 69 72 20 73  rents of their s
c910: 79 6d 62 6f 6c 73 0a 20 20 20 20 20 20 20 20 20  ymbols.         
c920: 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69 64     AND    CI.iid
c930: 20 3d 20 42 58 2e 62 69 64 20 20 20 20 20 20 2d   = BX.bid      -
c940: 2d 20 53 65 6c 65 63 74 20 61 6c 6c 20 63 68 61  - Select all cha
c950: 6e 67 65 73 65 74 73 0a 20 20 20 20 20 20 20 20  ngesets.        
c960: 20 20 20 20 41 4e 44 20 20 20 20 43 2e 63 69 64      AND    C.cid
c970: 20 3d 20 43 49 2e 63 69 64 09 2d 2d 20 63 6f 6e   = CI.cid.-- con
c980: 74 61 69 6e 69 6e 67 20 74 68 65 20 73 75 62 6f  taining the subo
c990: 72 64 69 6e 61 74 65 20 62 72 61 6e 63 68 65 73  rdinate branches
c9a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44  .            AND
c9b0: 20 20 20 20 43 2e 74 79 70 65 20 3d 20 32 09 09      C.type = 2..
c9c0: 2d 2d 20 77 68 69 63 68 20 61 72 65 20 62 72 61  -- which are bra
c9d0: 6e 63 68 20 63 68 61 6e 67 65 73 65 74 73 0a 20  nch changesets. 
c9e0: 20 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 53 45     UNION..    SE
c9f0: 4c 45 43 54 20 43 2e 63 69 64 0a 09 20 20 20 20  LECT C.cid..    
ca00: 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c  FROM   branch B,
ca10: 20 70 72 65 66 65 72 65 64 70 61 72 65 6e 74 20   preferedparent 
ca20: 50 2c 20 74 61 67 20 54 2c 20 63 73 69 74 65 6d  P, tag T, csitem
ca30: 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43   CI, changeset C
ca40: 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62  ..    WHERE  B.b
ca50: 69 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20  id IN $theset   
ca60: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f    -- Restrict to
ca70: 20 62 72 61 6e 63 68 65 73 20 6f 66 20 69 6e 74   branches of int
ca80: 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20  erest..    AND  
ca90: 20 20 42 2e 73 69 64 20 3d 20 50 2e 70 69 64 09    B.sid = P.pid.
caa0: 2d 2d 20 47 65 74 20 73 75 62 6f 72 64 69 6e 61  -- Get subordina
cab0: 74 65 20 74 61 67 73 20 76 69 61 20 74 68 65 0a  te tags via the.
cac0: 09 20 20 20 20 41 4e 44 20 20 20 20 54 2e 73 69  .    AND    T.si
cad0: 64 20 3d 20 50 2e 73 69 64 09 2d 2d 20 70 72 65  d = P.sid.-- pre
cae0: 66 65 72 65 64 20 70 61 72 65 6e 74 73 20 6f 66  fered parents of
caf0: 20 74 68 65 69 72 20 73 79 6d 62 6f 6c 73 0a 20   their symbols. 
cb00: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20             AND  
cb10: 20 20 43 49 2e 69 69 64 20 3d 20 54 2e 74 69 64    CI.iid = T.tid
cb20: 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74         -- Select
cb30: 20 61 6c 6c 20 63 68 61 6e 67 65 73 65 74 73 0a   all changesets.
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
cb50: 20 20 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69     C.cid = CI.ci
cb60: 64 09 2d 2d 20 63 6f 6e 74 61 69 6e 69 6e 67 20  d.-- containing 
cb70: 74 68 65 20 73 75 62 6f 72 64 69 6e 61 74 65 20  the subordinate 
cb80: 74 61 67 73 0a 20 20 20 20 20 20 20 20 20 20 20  tags.           
cb90: 20 41 4e 44 20 20 20 20 43 2e 74 79 70 65 20 3d   AND    C.type =
cba0: 20 31 09 09 2d 2d 20 77 68 69 63 68 20 61 72 65   1..-- which are
cbb0: 20 74 61 67 20 63 68 61 6e 67 65 73 65 74 73 0a   tag changesets.
cbc0: 09 7d 5d 5d 0a 09 72 65 74 75 72 6e 0a 20 20 20  .}]]..return.   
cbd0: 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74   }..    # result
cbe0: 20 3d 20 73 79 6d 62 6f 6c 20 6e 61 6d 65 0a 20   = symbol name. 
cbf0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 63 73     typemethod cs
cc00: 5f 6c 6f 64 20 7b 62 72 61 6e 63 68 65 73 7d 20  _lod {branches} 
cc10: 7b 0a 09 23 20 44 65 74 65 72 6d 69 6e 65 73 20  {..# Determines 
cc20: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
cc30: 73 79 6d 62 6f 6c 20 77 68 69 63 68 20 69 73 20  symbol which is 
cc40: 74 68 65 20 6c 69 6e 65 20 6f 66 0a 09 23 20 64  the line of..# d
cc50: 65 76 65 6c 6f 70 6d 65 6e 74 20 66 6f 72 20 74  evelopment for t
cc60: 68 65 20 62 72 61 6e 63 68 65 73 20 69 6e 20 61  he branches in a
cc70: 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 73 65   changeset....se
cc80: 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e  t theset ('[join
cc90: 20 24 62 72 61 6e 63 68 65 73 20 7b 27 2c 27 7d   $branches {','}
cca0: 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61  ]')..return [sta
ccb0: 74 65 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e  te run [subst -n
ccc0: 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63  ocommands -nobac
ccd0: 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20 20 20  kslashes {..    
cce0: 53 45 4c 45 43 54 0a 09 20 20 20 20 44 49 53 54  SELECT..    DIST
ccf0: 49 4e 43 54 20 4c 2e 6e 61 6d 65 0a 09 20 20 20  INCT L.name..   
cd00: 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42   FROM   branch B
cd10: 2c 20 73 79 6d 62 6f 6c 20 4c 0a 09 20 20 20 20  , symbol L..    
cd20: 57 48 45 52 45 20 20 42 2e 62 69 64 20 69 6e 20  WHERE  B.bid in 
cd30: 24 74 68 65 73 65 74 20 20 20 20 20 20 20 20 2d  $theset        -
cd40: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 62 72  - Restrict to br
cd50: 61 6e 63 68 65 73 20 6f 66 20 69 6e 74 65 72 65  anches of intere
cd60: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 4c  st..    AND    L
cd70: 2e 73 69 64 20 3d 20 42 2e 6c 6f 64 20 20 20 20  .sid = B.lod    
cd80: 20 20 20 20 20 20 20 2d 2d 20 47 65 74 20 6c 6f         -- Get lo
cd90: 64 20 73 79 6d 62 6f 6c 20 6f 66 20 62 72 61 6e  d symbol of bran
cda0: 63 68 0a 09 7d 5d 5d 0a 20 20 20 20 7d 0a 0a 20  ch..}]].    }.. 
cdb0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c 69     typemethod li
cdc0: 6d 69 74 73 20 7b 62 72 61 6e 63 68 65 73 7d 20  mits {branches} 
cdd0: 7b 0a 09 23 20 4e 6f 74 65 73 2e 20 54 68 69 73  {..# Notes. This
cde0: 20 6d 65 74 68 6f 64 20 65 78 69 73 74 73 20 6f   method exists o
cdf0: 6e 6c 79 20 66 6f 72 20 62 72 61 6e 63 68 65 73  nly for branches
ce00: 2e 20 49 74 20 69 73 20 6e 65 65 64 65 64 20 74  . It is needed t
ce10: 6f 0a 09 23 20 67 65 74 20 64 65 74 61 69 6c 65  o..# get detaile
ce20: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  d information ab
ce30: 6f 75 74 20 61 20 62 61 63 6b 77 61 72 64 20 62  out a backward b
ce40: 72 61 6e 63 68 2e 20 49 74 20 64 6f 65 73 0a 09  ranch. It does..
ce50: 23 20 6e 6f 74 20 61 70 70 6c 79 20 74 6f 20 74  # not apply to t
ce60: 61 67 73 2c 20 6e 6f 72 20 72 65 76 69 73 69 6f  ags, nor revisio
ce70: 6e 73 2e 20 54 68 65 20 71 75 65 72 69 65 73 20  ns. The queries 
ce80: 63 61 6e 20 61 6c 73 6f 0a 09 23 20 72 65 73 74  can also..# rest
ce90: 72 69 63 74 20 74 68 65 6d 73 65 6c 76 65 73 20  rict themselves 
cea0: 74 6f 20 74 68 65 20 72 65 76 69 73 69 6f 6e 20  to the revision 
ceb0: 73 75 63 65 73 73 6f 72 73 2f 70 72 65 64 65 63  sucessors/predec
cec0: 65 73 73 6f 72 73 0a 09 23 20 6f 66 20 62 72 61  essors..# of bra
ced0: 6e 63 68 65 73 2c 20 61 73 20 6f 6e 6c 79 20 74  nches, as only t
cee0: 68 65 79 20 68 61 76 65 20 6f 72 64 65 72 69 6e  hey have orderin
cef0: 67 20 64 61 74 61 20 61 6e 64 20 74 68 75 73 20  g data and thus 
cf00: 63 61 6e 0a 09 23 20 63 61 75 73 65 20 74 68 65  can..# cause the
cf10: 20 62 61 63 6b 77 61 72 64 6e 65 73 73 2e 0a 0a   backwardness...
cf20: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a  .set theset ('[j
cf30: 6f 69 6e 20 24 62 72 61 6e 63 68 65 73 20 7b 27  oin $branches {'
cf40: 2c 27 7d 5d 27 29 0a 0a 09 73 65 74 20 6d 61 78  ,'}]')...set max
cf50: 70 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75  p [state run [su
cf60: 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20  bst -nocommands 
cf70: 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b  -nobackslashes {
cf80: 0a 09 20 20 20 20 2d 2d 20 6d 61 78 69 6d 61 6c  ..    -- maximal
cf90: 20 70 72 65 64 65 63 65 73 73 6f 72 20 70 6f 73   predecessor pos
cfa0: 69 74 69 6f 6e 20 70 65 72 20 62 72 61 6e 63 68  ition per branch
cfb0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62  ..    SELECT B.b
cfc0: 69 64 2c 20 4d 41 58 20 28 43 4f 2e 70 6f 73 29  id, MAX (CO.pos)
cfd0: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61  ..    FROM   bra
cfe0: 6e 63 68 20 42 2c 20 72 65 76 69 73 69 6f 6e 20  nch B, revision 
cff0: 52 2c 20 63 73 69 74 65 6d 20 43 49 2c 20 63 68  R, csitem CI, ch
d000: 61 6e 67 65 73 65 74 20 43 2c 20 63 73 6f 72 64  angeset C, csord
d010: 65 72 20 43 4f 0a 09 20 20 20 20 57 48 45 52 45  er CO..    WHERE
d020: 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73    B.bid IN $thes
d030: 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69  et     -- Restri
d040: 63 74 20 74 6f 20 62 72 61 6e 63 68 65 73 20 6f  ct to branches o
d050: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20  f interest..    
d060: 41 4e 44 20 20 20 20 42 2e 72 6f 6f 74 20 3d 20  AND    B.root = 
d070: 52 2e 72 69 64 20 20 20 20 20 20 20 2d 2d 20 47  R.rid       -- G
d080: 65 74 20 62 72 61 6e 63 68 20 72 6f 6f 74 20 72  et branch root r
d090: 65 76 69 73 69 6f 6e 73 0a 09 20 20 20 20 41 4e  evisions..    AN
d0a0: 44 20 20 20 20 43 49 2e 69 69 64 20 3d 20 52 2e  D    CI.iid = R.
d0b0: 72 69 64 20 20 20 20 20 20 20 2d 2d 20 47 65 74  rid       -- Get
d0c0: 20 63 68 61 6e 67 65 73 65 74 73 20 63 6f 6e 74   changesets cont
d0d0: 61 69 6e 69 6e 67 20 74 68 65 0a 09 20 20 20 20  aining the..    
d0e0: 41 4e 44 20 20 20 20 43 2e 63 69 64 20 3d 20 43  AND    C.cid = C
d0f0: 49 2e 63 69 64 20 20 20 20 20 20 20 2d 2d 20 72  I.cid       -- r
d100: 6f 6f 74 20 72 65 76 69 73 69 6f 6e 73 2c 20 77  oot revisions, w
d110: 68 69 63 68 20 61 72 65 0a 09 20 20 20 20 41 4e  hich are..    AN
d120: 44 20 20 20 20 43 2e 74 79 70 65 20 3d 20 30 20  D    C.type = 0 
d130: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 72 65 76            -- rev
d140: 69 73 69 6f 6e 20 63 68 61 6e 67 65 73 65 74 73  ision changesets
d150: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 43 4f 2e  ..    AND    CO.
d160: 63 69 64 20 3d 20 43 2e 63 69 64 20 20 20 20 20  cid = C.cid     
d170: 20 20 2d 2d 20 47 65 74 20 74 68 65 69 72 20 74    -- Get their t
d180: 6f 70 6f 6c 6f 67 69 63 61 6c 20 6f 72 64 65 72  opological order
d190: 69 6e 67 0a 09 20 20 20 20 47 52 4f 55 50 20 42  ing..    GROUP B
d1a0: 59 20 42 2e 62 69 64 0a 09 7d 5d 5d 0a 0a 09 73  Y B.bid..}]]...s
d1b0: 65 74 20 6d 69 6e 73 20 5b 73 74 61 74 65 20 72  et mins [state r
d1c0: 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d  un [subst -nocom
d1d0: 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61  mands -nobacksla
d1e0: 73 68 65 73 20 7b 0a 09 20 20 20 20 2d 2d 20 6d  shes {..    -- m
d1f0: 69 6e 69 6d 61 6c 20 73 75 63 63 65 73 73 6f 72  inimal successor
d200: 20 70 6f 73 69 74 69 6f 6e 20 70 65 72 20 62 72   position per br
d210: 61 6e 63 68 0a 09 20 20 20 20 53 45 4c 45 43 54  anch..    SELECT
d220: 20 42 2e 62 69 64 2c 20 4d 49 4e 20 28 43 4f 2e   B.bid, MIN (CO.
d230: 70 6f 73 29 0a 09 20 20 20 20 46 52 4f 4d 20 20  pos)..    FROM  
d240: 20 62 72 61 6e 63 68 20 42 2c 20 72 65 76 69 73   branch B, revis
d250: 69 6f 6e 20 52 2c 20 63 73 69 74 65 6d 20 43 49  ion R, csitem CI
d260: 2c 20 63 68 61 6e 67 65 73 65 74 20 43 2c 20 63  , changeset C, c
d270: 73 6f 72 64 65 72 20 43 4f 0a 09 20 20 20 20 57  sorder CO..    W
d280: 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24  HERE  B.bid IN $
d290: 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65  theset     -- Re
d2a0: 73 74 72 69 63 74 20 74 6f 20 62 72 61 6e 63 68  strict to branch
d2b0: 65 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09  es of interest..
d2c0: 20 20 20 20 41 4e 44 20 20 20 20 42 2e 66 69 72      AND    B.fir
d2d0: 73 74 20 3d 20 52 2e 72 69 64 20 20 20 20 20 20  st = R.rid      
d2e0: 2d 2d 20 47 65 74 20 74 68 65 20 66 69 72 73 74  -- Get the first
d2f0: 20 72 65 76 69 73 69 6f 6e 73 20 6f 6e 20 74 68   revisions on th
d300: 65 20 62 72 61 6e 63 68 65 73 0a 09 20 20 20 20  e branches..    
d310: 41 4e 44 20 20 20 20 43 49 2e 69 69 64 20 3d 20  AND    CI.iid = 
d320: 52 2e 72 69 64 20 20 20 20 20 20 20 2d 2d 20 47  R.rid       -- G
d330: 65 74 20 63 68 61 6e 67 65 73 65 74 73 20 63 6f  et changesets co
d340: 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 09 20 20  ntaining the..  
d350: 20 20 41 4e 44 20 20 20 20 43 2e 63 69 64 20 3d    AND    C.cid =
d360: 20 43 49 2e 63 69 64 09 2d 2d 20 66 69 72 73 74   CI.cid.-- first
d370: 20 72 65 76 69 73 69 6f 6e 73 2c 20 77 68 69 63   revisions, whic
d380: 68 20 61 72 65 0a 09 20 20 20 20 41 4e 44 20 20  h are..    AND  
d390: 20 20 43 2e 74 79 70 65 20 3d 20 30 09 09 2d 2d    C.type = 0..--
d3a0: 20 72 65 76 69 73 69 6f 6e 20 63 68 61 6e 67 65   revision change
d3b0: 73 65 74 73 0a 09 20 20 20 20 41 4e 44 20 20 20  sets..    AND   
d3c0: 20 43 4f 2e 63 69 64 20 3d 20 43 2e 63 69 64 09   CO.cid = C.cid.
d3d0: 2d 2d 20 47 65 74 20 74 68 65 69 72 20 74 6f 70  -- Get their top
d3e0: 6f 6c 6f 67 69 63 61 6c 20 6f 72 64 65 72 69 6e  ological orderin
d3f0: 67 0a 09 20 20 20 20 47 52 4f 55 50 20 42 59 20  g..    GROUP BY 
d400: 42 2e 62 69 64 0a 09 7d 5d 5d 0a 0a 20 20 20 20  B.bid..}]]..    
d410: 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74      return [list
d420: 20 24 6d 61 78 70 20 24 6d 69 6e 73 5d 0a 20 20   $maxp $mins].  
d430: 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20    }..    # # ## 
d440: 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23  ### ##### ######
d450: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
d460: 0a 20 20 20 20 23 23 20 43 6f 6e 66 69 67 75 72  .    ## Configur
d470: 61 74 69 6f 6e 0a 0a 20 20 20 20 70 72 61 67 6d  ation..    pragm
d480: 61 20 2d 68 61 73 69 6e 73 74 61 6e 63 65 73 20  a -hasinstances 
d490: 20 20 6e 6f 20 3b 20 23 20 73 69 6e 67 6c 65 74    no ; # singlet
d4a0: 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68  on.    pragma -h
d4b0: 61 73 74 79 70 65 69 6e 66 6f 20 20 20 20 6e 6f  astypeinfo    no
d4c0: 20 3b 20 23 20 6e 6f 20 69 6e 74 72 6f 73 70 65   ; # no introspe
d4d0: 63 74 69 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61  ction.    pragma
d4e0: 20 2d 68 61 73 74 79 70 65 64 65 73 74 72 6f 79   -hastypedestroy
d4f0: 20 6e 6f 20 3b 20 23 20 69 6d 6d 6f 72 74 61 6c   no ; # immortal
d500: 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23  .}..# # ## ### #
d510: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23  #### ######## ##
d520: 23 23 23 23 23 23 23 23 23 23 23 20 23 23 23 23  ########### ####
d530: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d540: 23 0a 23 23 0a 0a 6e 61 6d 65 73 70 61 63 65 20  #.##..namespace 
d550: 65 76 61 6c 20 3a 3a 76 63 3a 3a 66 6f 73 73 69  eval ::vc::fossi
d560: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a  l::import::cvs::
d570: 70 72 6f 6a 65 63 74 20 7b 0a 20 20 20 20 6e 61  project {.    na
d580: 6d 65 73 70 61 63 65 20 65 78 70 6f 72 74 20 72  mespace export r
d590: 65 76 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65  ev.    namespace
d5a0: 20 65 76 61 6c 20 72 65 76 20 7b 0a 09 6e 61 6d   eval rev {..nam
d5b0: 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a  espace import ::
d5c0: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f  vc::fossil::impo
d5d0: 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09  rt::cvs::state..
d5e0: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74  namespace import
d5f0: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
d600: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e 74 65  mport::cvs::inte
d610: 67 72 69 74 79 0a 09 6e 61 6d 65 73 70 61 63 65  grity..namespace
d620: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f   import ::vc::to
d630: 6f 6c 73 3a 3a 6d 69 73 63 3a 3a 2a 0a 09 6e 61  ols::misc::*..na
d640: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
d650: 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 74 72 6f 75  :vc::tools::trou
d660: 62 6c 65 0a 09 6e 61 6d 65 73 70 61 63 65 20 69  ble..namespace i
d670: 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c  mport ::vc::tool
d680: 73 3a 3a 6c 6f 67 0a 09 6c 6f 67 20 72 65 67 69  s::log..log regi
d690: 73 74 65 72 20 63 73 65 74 73 0a 0a 09 23 20 53  ster csets...# S
d6a0: 65 74 20 75 70 20 74 68 65 20 68 65 6c 70 65 72  et up the helper
d6b0: 20 73 69 6e 67 6c 65 74 6f 6e 73 0a 09 6e 61 6d   singletons..nam
d6c0: 65 73 70 61 63 65 20 65 76 61 6c 20 72 65 76 20  espace eval rev 
d6d0: 7b 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65  {..    namespace
d6e0: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f   import ::vc::fo
d6f0: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
d700: 73 3a 3a 73 74 61 74 65 0a 09 20 20 20 20 6e 61  s::state..    na
d710: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
d720: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70  :vc::fossil::imp
d730: 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e 74 65 67 72  ort::cvs::integr
d740: 69 74 79 0a 09 20 20 20 20 6e 61 6d 65 73 70 61  ity..    namespa
d750: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a  ce import ::vc::
d760: 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 7d 0a 09 6e  tools::log..}..n
d770: 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 73 79  amespace eval sy
d780: 6d 3a 3a 74 61 67 20 7b 0a 09 20 20 20 20 6e 61  m::tag {..    na
d790: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
d7a0: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70  :vc::fossil::imp
d7b0: 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a  ort::cvs::state.
d7c0: 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69  .    namespace i
d7d0: 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73  mport ::vc::foss
d7e0: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a  il::import::cvs:
d7f0: 3a 69 6e 74 65 67 72 69 74 79 0a 09 20 20 20 20  :integrity..    
d800: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74  namespace import
d810: 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f   ::vc::tools::lo
d820: 67 0a 09 7d 0a 09 6e 61 6d 65 73 70 61 63 65 20  g..}..namespace 
d830: 65 76 61 6c 20 73 79 6d 3a 3a 62 72 61 6e 63 68  eval sym::branch
d840: 20 7b 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63   {..    namespac
d850: 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66  e import ::vc::f
d860: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63  ossil::import::c
d870: 76 73 3a 3a 73 74 61 74 65 0a 09 20 20 20 20 6e  vs::state..    n
d880: 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20  amespace import 
d890: 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d  ::vc::fossil::im
d8a0: 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e 74 65 67  port::cvs::integ
d8b0: 72 69 74 79 0a 09 20 20 20 20 6e 61 6d 65 73 70  rity..    namesp
d8c0: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a  ace import ::vc:
d8d0: 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 7d 0a 20  :tools::log..}. 
d8e0: 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23     }.}..# # ## #
d8f0: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
d900: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20  # ############# 
d910: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d920: 23 23 23 23 23 0a 23 23 20 52 65 61 64 79 0a 0a  #####.## Ready..
d930: 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20  package provide 
d940: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f  vc::fossil::impo
d950: 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74  rt::cvs::project
d960: 3a 3a 72 65 76 20 31 2e 30 0a 72 65 74 75 72 6e  ::rev 1.0.return
d970: 0a                                               .