Hex Artifact Content
Not logged in

Artifact c3cfc3bb4a1e59b68387d56b9630b00fdd19797b:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [c2ad73ed92] - Added high-level logging for memory tracing to the code breaking the preliminary changesets. First runs indicate that the DEPC array becomes so very large, caused by a high amount of indirect dependencies (several hundred). by aku on 2008-02-21 05:13:14.

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 4d 61 70 3a 20 20 44 45 4c 54 41 20 70 6f  # Map:  DELTA po
1b60: 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73 74 20 2d  sition in list -
1b70: 3e 20 74 69 6d 65 20 64 65 6c 74 61 20 62 65 74  > time delta bet
1b80: 77 65 65 6e 20 69 74 73 20 72 65 76 69 73 69 6f  ween its revisio
1b90: 6e 0a 09 23 20 20 20 20 20 20 20 20 20 20 20 20  n..#            
1ba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb0: 20 20 20 20 20 61 6e 64 20 74 68 65 20 6e 65 78       and the nex
1bc0: 74 2c 20 69 66 20 61 6e 79 2e 0a 09 23 20 41 20  t, if any...# A 
1bd0: 64 65 70 65 6e 64 65 6e 63 79 20 69 73 20 61 20  dependency is a 
1be0: 73 69 6e 67 6c 65 2d 65 6c 65 6d 65 6e 74 20 6d  single-element m
1bf0: 61 70 20 70 61 72 65 6e 74 20 2d 3e 20 63 68 69  ap parent -> chi
1c00: 6c 64 0a 0a 09 23 20 49 6e 69 74 69 61 6c 69 7a  ld...# Initializ
1c10: 65 42 72 65 61 6b 53 74 61 74 65 20 69 6e 69 74  eBreakState init
1c20: 69 61 6c 69 7a 65 73 20 74 68 65 69 72 20 63 6f  ializes their co
1c30: 6e 74 65 6e 74 73 20 61 66 74 65 72 0a 09 23 20  ntents after..# 
1c40: 75 70 76 61 72 27 69 6e 67 20 74 68 65 6d 20 66  upvar'ing them f
1c50: 72 6f 6d 20 74 68 69 73 20 73 63 6f 70 65 2e 20  rom this scope. 
1c60: 49 74 20 75 73 65 73 20 74 68 65 20 69 6e 66 6f  It uses the info
1c70: 72 6d 61 74 69 6f 6e 20 69 6e 0a 09 23 20 44 45  rmation in..# DE
1c80: 50 45 4e 44 45 4e 43 49 45 53 20 74 6f 20 64 6f  PENDENCIES to do
1c90: 20 73 6f 2e 0a 0a 09 49 6e 69 74 69 61 6c 69 7a   so....Initializ
1ca0: 65 42 72 65 61 6b 53 74 61 74 65 20 24 6d 79 69  eBreakState $myi
1cb0: 74 65 6d 73 0a 0a 09 73 65 74 20 66 72 61 67 6d  tems...set fragm
1cc0: 65 6e 74 73 20 7b 7d 0a 09 73 65 74 20 6e 65 77  ents {}..set new
1cd0: 20 20 20 20 20 20 20 5b 6c 69 73 74 20 24 72 61         [list $ra
1ce0: 6e 67 65 5d 0a 09 61 72 72 61 79 20 73 65 74 20  nge]..array set 
1cf0: 62 72 65 61 6b 73 20 7b 7d 0a 0a 09 23 20 49 6e  breaks {}...# In
1d00: 73 74 65 61 64 20 6f 66 20 6f 6e 65 20 6c 69 73  stead of one lis
1d10: 74 20 68 6f 6c 64 69 6e 67 20 62 6f 74 68 20 70  t holding both p
1d20: 72 6f 63 65 73 73 65 64 20 61 6e 64 20 70 65 6e  rocessed and pen
1d30: 64 69 6e 67 0a 09 23 20 66 72 61 67 6d 65 6e 74  ding..# fragment
1d40: 73 20 77 65 20 75 73 65 20 74 77 6f 2c 20 6f 6e  s we use two, on
1d50: 65 20 66 6f 72 20 74 68 65 20 66 72 61 6d 65 6e  e for the framen
1d60: 74 73 20 74 6f 20 70 72 6f 63 65 73 73 2c 20 6f  ts to process, o
1d70: 6e 65 0a 09 23 20 74 6f 20 68 6f 6c 64 20 74 68  ne..# to hold th
1d80: 65 20 6e 65 77 20 66 72 61 67 6d 65 6e 74 73 2c  e new fragments,
1d90: 20 61 6e 64 20 74 68 65 20 6c 61 74 74 65 72 20   and the latter 
1da0: 69 73 20 63 6f 70 69 65 64 20 74 6f 20 74 68 65  is copied to the
1db0: 0a 09 23 20 66 6f 72 6d 65 72 20 77 68 65 6e 20  ..# former when 
1dc0: 74 68 65 79 20 72 75 6e 20 6f 75 74 2e 20 54 68  they run out. Th
1dd0: 69 73 20 6b 65 65 70 73 20 74 68 65 20 6c 69 73  is keeps the lis
1de0: 74 20 6f 66 20 70 65 6e 64 69 6e 67 0a 09 23 20  t of pending..# 
1df0: 66 72 61 67 6d 65 6e 74 73 20 73 68 6f 72 74 20  fragments short 
1e00: 77 69 74 68 6f 75 74 20 73 61 63 72 69 66 69 63  without sacrific
1e10: 69 6e 67 20 73 70 65 65 64 20 62 79 20 73 68 69  ing speed by shi
1e20: 66 74 69 6e 67 20 73 74 75 66 66 0a 09 23 20 64  fting stuff..# d
1e30: 6f 77 6e 2e 20 57 65 20 65 73 70 65 63 69 61 6c  own. We especial
1e40: 6c 79 20 64 72 6f 70 20 74 68 65 20 6d 65 6d 6f  ly drop the memo
1e50: 72 79 20 6f 66 20 66 72 61 67 6d 65 6e 74 73 20  ry of fragments 
1e60: 62 72 6f 6b 65 6e 0a 09 23 20 64 75 72 69 6e 67  broken..# during
1e70: 20 70 72 6f 63 65 73 73 69 6e 67 20 61 66 74 65   processing afte
1e80: 72 20 61 20 73 68 6f 72 74 20 74 69 6d 65 2c 20  r a short time, 
1e90: 69 6e 73 74 65 61 64 20 6f 66 20 6c 65 74 74 69  instead of letti
1ea0: 6e 67 20 69 74 0a 09 23 20 63 6f 6e 73 75 6d 65  ng it..# consume
1eb0: 20 6d 65 6d 6f 72 79 2e 0a 0a 09 77 68 69 6c 65   memory....while
1ec0: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 6e 65 77 5d   {[llength $new]
1ed0: 7d 20 7b 0a 0a 09 20 20 20 20 73 65 74 20 70 65  } {...    set pe
1ee0: 6e 64 69 6e 67 20 24 6e 65 77 0a 09 20 20 20 20  nding $new..    
1ef0: 73 65 74 20 6e 65 77 20 20 20 20 20 7b 7d 0a 09  set new     {}..
1f00: 20 20 20 20 73 65 74 20 61 74 20 20 20 20 20 20      set at      
1f10: 30 0a 0a 09 20 20 20 20 77 68 69 6c 65 20 7b 24  0...    while {$
1f20: 61 74 20 3c 20 5b 6c 6c 65 6e 67 74 68 20 24 70  at < [llength $p
1f30: 65 6e 64 69 6e 67 5d 7d 20 7b 0a 09 09 73 65 74  ending]} {...set
1f40: 20 63 75 72 72 65 6e 74 20 5b 6c 69 6e 64 65 78   current [lindex
1f50: 20 24 70 65 6e 64 69 6e 67 20 24 61 74 5d 0a 0a   $pending $at]..
1f60: 09 09 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73  ..log write 6 cs
1f70: 65 74 73 20 7b 2e 20 2e 20 2e 2e 20 2e 2e 2e 20  ets {. . .. ... 
1f80: 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e  ..... ........ .
1f90: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 7d 0a 09 09  ............}...
1fa0: 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74  log write 6 cset
1fb0: 73 20 7b 53 63 68 65 64 75 6c 65 64 20 20 20 5b  s {Scheduled   [
1fc0: 6a 6f 69 6e 20 5b 50 52 73 20 5b 6c 72 61 6e 67  join [PRs [lrang
1fd0: 65 20 24 70 65 6e 64 69 6e 67 20 24 61 74 20 65  e $pending $at e
1fe0: 6e 64 5d 5d 20 7b 20 7d 5d 7d 0a 09 09 6c 6f 67  nd]] { }]}...log
1ff0: 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 7b   write 6 csets {
2000: 43 6f 6e 73 69 64 65 72 69 6e 67 20 5b 50 52 20  Considering [PR 
2010: 24 63 75 72 72 65 6e 74 5d 20 5c 5b 24 61 74 2f  $current] \[$at/
2020: 5b 6c 6c 65 6e 67 74 68 20 24 70 65 6e 64 69 6e  [llength $pendin
2030: 67 5d 5c 5d 7d 0a 0a 09 09 73 65 74 20 62 65 73  g]\]}....set bes
2040: 74 20 5b 46 69 6e 64 42 65 73 74 42 72 65 61 6b  t [FindBestBreak
2050: 20 24 63 75 72 72 65 6e 74 5d 0a 0a 09 09 69 66   $current]....if
2060: 20 7b 24 62 65 73 74 20 3c 20 30 7d 20 7b 0a 09   {$best < 0} {..
2070: 09 20 20 20 20 23 20 54 68 65 20 69 6e 73 70 65  .    # The inspe
2080: 63 74 65 64 20 72 61 6e 67 65 20 68 61 73 20 6e  cted range has n
2090: 6f 20 69 6e 74 65 72 6e 61 6c 0a 09 09 20 20 20  o internal...   
20a0: 20 23 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e   # dependencies.
20b0: 20 54 68 69 73 20 69 73 20 61 20 63 6f 6d 70 6c   This is a compl
20c0: 65 74 65 20 66 72 61 67 6d 65 6e 74 2e 0a 09 09  ete fragment....
20d0: 20 20 20 20 6c 61 70 70 65 6e 64 20 66 72 61 67      lappend frag
20e0: 6d 65 6e 74 73 20 24 63 75 72 72 65 6e 74 0a 0a  ments $current..
20f0: 09 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20  ..    log write 
2100: 36 20 63 73 65 74 73 20 22 4e 6f 20 62 72 65 61  6 csets "No brea
2110: 6b 73 2c 20 66 69 6e 61 6c 22 0a 09 09 7d 20 65  ks, final"...} e
2120: 6c 73 65 20 7b 0a 09 09 20 20 20 20 23 20 53 70  lse {...    # Sp
2130: 6c 69 74 20 74 68 65 20 72 61 6e 67 65 20 61 6e  lit the range an
2140: 64 20 73 63 68 65 64 75 6c 65 20 74 68 65 20 72  d schedule the r
2150: 65 73 75 6c 74 69 6e 67 0a 09 09 20 20 20 20 23  esulting...    #
2160: 20 66 72 61 67 6d 65 6e 74 73 20 66 6f 72 20 66   fragments for f
2170: 75 72 74 68 65 72 20 69 6e 73 70 65 63 74 69 6f  urther inspectio
2180: 6e 2e 20 52 65 6d 65 6d 62 65 72 20 74 68 65 0a  n. Remember the.
2190: 09 09 20 20 20 20 23 20 6e 75 6d 62 65 72 20 6f  ..    # number o
21a0: 66 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 63  f dependencies c
21b0: 75 74 20 62 65 66 6f 72 65 20 77 65 20 72 65 6d  ut before we rem
21c0: 6f 76 65 20 74 68 65 6d 0a 09 09 20 20 20 20 23  ove them...    #
21d0: 20 66 72 6f 6d 20 63 6f 6e 73 69 64 65 72 61 74   from considerat
21e0: 69 6f 6e 2c 20 66 6f 72 20 64 6f 63 75 6d 65 6e  ion, for documen
21f0: 74 61 74 69 6f 6e 20 6c 61 74 65 72 2e 0a 0a 09  tation later....
2200: 09 20 20 20 20 73 65 74 20 62 72 65 61 6b 73 28  .    set breaks(
2210: 24 62 65 73 74 29 20 24 63 72 6f 73 73 28 24 62  $best) $cross($b
2220: 65 73 74 29 0a 0a 09 09 20 20 20 20 6c 6f 67 20  est)....    log 
2230: 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22 42  write 6 csets "B
2240: 65 73 74 20 62 72 65 61 6b 20 40 20 24 62 65 73  est break @ $bes
2250: 74 2c 20 63 75 74 74 69 6e 67 20 5b 6e 73 70 20  t, cutting [nsp 
2260: 24 63 72 6f 73 73 28 24 62 65 73 74 29 20 64 65  $cross($best) de
2270: 70 65 6e 64 65 6e 63 79 20 64 65 70 65 6e 64 65  pendency depende
2280: 6e 63 69 65 73 5d 22 0a 0a 09 09 20 20 20 20 23  ncies]"....    #
2290: 20 4e 6f 74 65 3a 20 54 68 65 20 76 61 6c 75 65   Note: The value
22a0: 20 6f 66 20 62 65 73 74 20 69 73 20 61 6e 20 61   of best is an a
22b0: 62 6f 6c 75 74 65 20 6c 6f 63 61 74 69 6f 6e 0a  bolute location.
22c0: 09 09 20 20 20 20 23 20 69 6e 20 6d 79 69 74 65  ..    # in myite
22d0: 6d 73 2e 20 55 73 65 20 74 68 65 20 73 74 61 72  ms. Use the star
22e0: 74 20 6f 66 20 63 75 72 72 65 6e 74 20 74 6f 20  t of current to 
22f0: 6d 61 6b 65 20 69 74 0a 09 09 20 20 20 20 23 20  make it...    # 
2300: 61 6e 20 69 6e 64 65 78 20 61 62 73 6f 6c 75 74  an index absolut
2310: 65 20 74 6f 20 63 75 72 72 65 6e 74 2e 0a 0a 09  e to current....
2320: 09 20 20 20 20 73 65 74 20 62 72 65 6c 20 5b 65  .    set brel [e
2330: 78 70 72 20 7b 24 62 65 73 74 20 2d 20 5b 6c 69  xpr {$best - [li
2340: 6e 64 65 78 20 24 63 75 72 72 65 6e 74 20 30 5d  ndex $current 0]
2350: 7d 5d 0a 09 09 20 20 20 20 73 65 74 20 62 6e 65  }]...    set bne
2360: 78 74 20 24 62 72 65 6c 20 3b 20 69 6e 63 72 20  xt $brel ; incr 
2370: 62 6e 65 78 74 0a 09 09 20 20 20 20 73 65 74 20  bnext...    set 
2380: 66 72 61 67 62 65 66 6f 72 65 20 5b 6c 72 61 6e  fragbefore [lran
2390: 67 65 20 24 63 75 72 72 65 6e 74 20 30 20 24 62  ge $current 0 $b
23a0: 72 65 6c 5d 0a 09 09 20 20 20 20 73 65 74 20 66  rel]...    set f
23b0: 72 61 67 61 66 74 65 72 20 20 5b 6c 72 61 6e 67  ragafter  [lrang
23c0: 65 20 24 63 75 72 72 65 6e 74 20 24 62 6e 65 78  e $current $bnex
23d0: 74 20 65 6e 64 5d 0a 0a 09 09 20 20 20 20 6c 6f  t end]....    lo
23e0: 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20  g write 6 csets 
23f0: 22 4e 65 77 20 70 69 65 63 65 73 20 20 5b 50 52  "New pieces  [PR
2400: 20 24 66 72 61 67 62 65 66 6f 72 65 5d 20 5b 50   $fragbefore] [P
2410: 52 20 24 66 72 61 67 61 66 74 65 72 5d 22 0a 0a  R $fragafter]"..
2420: 09 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 20  ..    integrity 
2430: 61 73 73 65 72 74 20 7b 5b 6c 6c 65 6e 67 74 68  assert {[llength
2440: 20 24 66 72 61 67 62 65 66 6f 72 65 5d 7d 20 7b   $fragbefore]} {
2450: 46 6f 75 6e 64 20 7a 65 72 6f 2d 6c 65 6e 67 74  Found zero-lengt
2460: 68 20 66 72 61 67 6d 65 6e 74 20 61 74 20 74 68  h fragment at th
2470: 65 20 62 65 67 69 6e 6e 69 6e 67 7d 0a 09 09 20  e beginning}... 
2480: 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 73     integrity ass
2490: 65 72 74 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66  ert {[llength $f
24a0: 72 61 67 61 66 74 65 72 5d 7d 20 20 7b 46 6f 75  ragafter]}  {Fou
24b0: 6e 64 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66  nd zero-length f
24c0: 72 61 67 6d 65 6e 74 20 61 74 20 74 68 65 20 65  ragment at the e
24d0: 6e 64 7d 0a 0a 09 09 20 20 20 20 6c 61 70 70 65  nd}....    lappe
24e0: 6e 64 20 6e 65 77 20 24 66 72 61 67 62 65 66 6f  nd new $fragbefo
24f0: 72 65 20 24 66 72 61 67 61 66 74 65 72 0a 09 09  re $fragafter...
2500: 20 20 20 20 43 75 74 41 74 20 24 62 65 73 74 0a      CutAt $best.
2510: 09 09 7d 0a 0a 09 09 69 6e 63 72 20 61 74 0a 09  ..}....incr at..
2520: 20 20 20 20 7d 0a 09 7d 0a 0a 09 6c 6f 67 20 77      }..}...log w
2530: 72 69 74 65 20 36 20 63 73 65 74 73 20 22 2e 20  rite 6 csets ". 
2540: 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e  . .. ... ..... .
2550: 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e  ....... ........
2560: 2e 2e 2e 2e 2e 22 0a 0a 09 23 20 28 2a 29 20 57  ....."...# (*) W
2570: 65 20 63 6c 65 61 72 20 6f 75 74 20 74 68 65 20  e clear out the 
2580: 61 73 73 6f 63 69 61 74 65 64 20 70 61 72 74 20  associated part 
2590: 6f 66 20 74 68 65 20 6d 79 69 74 65 6d 6d 61 70  of the myitemmap
25a0: 0a 09 23 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6e  ..# in-memory in
25b0: 64 65 78 20 69 6e 20 70 72 65 70 61 72 61 74 69  dex in preparati
25c0: 6f 6e 20 66 6f 72 20 6e 65 77 20 64 61 74 61 2e  on for new data.
25d0: 20 41 20 73 69 6d 70 6c 65 20 75 6e 73 65 74 0a   A simple unset.
25e0: 09 23 20 69 73 20 65 6e 6f 75 67 68 2c 20 77 65  .# is enough, we
25f0: 20 68 61 76 65 20 6e 6f 20 73 79 6d 62 6f 6c 20   have no symbol 
2600: 63 68 61 6e 67 65 73 65 74 73 20 61 74 20 74 68  changesets at th
2610: 69 73 20 74 69 6d 65 2c 20 61 6e 64 0a 09 23 20  is time, and..# 
2620: 74 68 75 73 20 6e 65 76 65 72 20 6d 6f 72 65 20  thus never more 
2630: 74 68 61 6e 20 6f 6e 65 20 72 65 66 65 72 65 6e  than one referen
2640: 63 65 20 69 6e 20 74 68 65 20 6c 69 73 74 2e 0a  ce in the list..
2650: 0a 09 66 6f 72 65 61 63 68 20 69 69 64 20 24 6d  ..foreach iid $m
2660: 79 69 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65  yitems {..    se
2670: 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79 74  t key [list $myt
2680: 79 70 65 20 24 69 69 64 5d 0a 09 20 20 20 20 75  ype $iid]..    u
2690: 6e 73 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24  nset myitemmap($
26a0: 6b 65 79 29 0a 09 20 20 20 20 6c 6f 67 20 77 72  key)..    log wr
26b0: 69 74 65 20 38 20 63 73 65 74 73 20 7b 4d 41 50  ite 8 csets {MAP
26c0: 2d 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73  - item <$key> $s
26d0: 65 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74 72  elf = [$self str
26e0: 5d 7d 0a 09 7d 0a 0a 09 23 20 43 72 65 61 74 65  ]}..}...# Create
26f0: 20 63 68 61 6e 67 65 73 65 74 73 20 66 6f 72 20   changesets for 
2700: 74 68 65 20 66 72 61 67 6d 65 6e 74 73 2c 20 72  the fragments, r
2710: 65 75 73 69 6e 67 20 74 68 65 20 63 75 72 72 65  eusing the curre
2720: 6e 74 20 6f 6e 65 0a 09 23 20 66 6f 72 20 74 68  nt one..# for th
2730: 65 20 66 69 72 73 74 20 66 72 61 67 6d 65 6e 74  e first fragment
2740: 2e 20 57 65 20 73 6f 72 74 20 74 68 65 6d 20 69  . We sort them i
2750: 6e 20 6f 72 64 65 72 20 74 6f 20 61 6c 6c 6f 77  n order to allow
2760: 0a 09 23 20 63 68 65 63 6b 69 6e 67 20 66 6f 72  ..# checking for
2770: 20 67 61 70 73 20 61 6e 64 20 6e 69 63 65 20 6d   gaps and nice m
2780: 65 73 73 61 67 65 73 2e 0a 0a 09 73 65 74 20 66  essages....set f
2790: 72 61 67 6d 65 6e 74 73 20 5b 6c 73 6f 72 74 20  ragments [lsort 
27a0: 2d 69 6e 64 65 78 20 30 20 2d 69 6e 74 65 67 65  -index 0 -intege
27b0: 72 20 24 66 72 61 67 6d 65 6e 74 73 5d 0a 0a 09  r $fragments]...
27c0: 23 70 75 74 73 20 5c 74 2e 5b 6a 6f 69 6e 20 5b  #puts \t.[join [
27d0: 50 52 73 20 24 66 72 61 67 6d 65 6e 74 73 5d 20  PRs $fragments] 
27e0: 2e 5c 6e 5c 74 2e 5d 2e 0a 0a 09 42 6f 72 64 65  .\n\t.]....Borde
27f0: 72 20 5b 6c 69 6e 64 65 78 20 24 66 72 61 67 6d  r [lindex $fragm
2800: 65 6e 74 73 20 30 5d 20 66 69 72 73 74 73 20 66  ents 0] firsts f
2810: 69 72 73 74 65 0a 0a 09 69 6e 74 65 67 72 69 74  irste...integrit
2820: 79 20 61 73 73 65 72 74 20 7b 24 66 69 72 73 74  y assert {$first
2830: 73 20 3d 3d 20 30 7d 20 7b 42 61 64 20 66 72 61  s == 0} {Bad fra
2840: 67 6d 65 6e 74 20 73 74 61 72 74 20 40 20 24 66  gment start @ $f
2850: 69 72 73 74 73 2c 20 67 61 70 2c 20 6f 72 20 62  irsts, gap, or b
2860: 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 20  efore beginning 
2870: 6f 66 20 74 68 65 20 72 61 6e 67 65 7d 0a 0a 09  of the range}...
2880: 73 65 74 20 6c 61 73 74 65 20 24 66 69 72 73 74  set laste $first
2890: 65 0a 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d  e..foreach fragm
28a0: 65 6e 74 20 5b 6c 72 61 6e 67 65 20 24 66 72 61  ent [lrange $fra
28b0: 67 6d 65 6e 74 73 20 31 20 65 6e 64 5d 20 7b 0a  gments 1 end] {.
28c0: 09 20 20 20 20 42 6f 72 64 65 72 20 24 66 72 61  .    Border $fra
28d0: 67 6d 65 6e 74 20 73 20 65 0a 09 20 20 20 20 69  gment s e..    i
28e0: 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20  ntegrity assert 
28f0: 7b 24 6c 61 73 74 65 20 3d 3d 20 28 24 73 20 2d  {$laste == ($s -
2900: 20 31 29 7d 20 7b 42 61 64 20 66 72 61 67 6d 65   1)} {Bad fragme
2910: 6e 74 20 62 6f 72 64 65 72 20 3c 24 6c 61 73 74  nt border <$last
2920: 65 20 7c 20 24 73 3e 2c 20 67 61 70 20 6f 72 20  e | $s>, gap or 
2930: 6f 76 65 72 6c 61 70 7d 0a 0a 09 20 20 20 20 73  overlap}...    s
2940: 65 74 20 6e 65 77 20 5b 24 74 79 70 65 20 25 41  et new [$type %A
2950: 55 54 4f 25 20 24 6d 79 70 72 6f 6a 65 63 74 20  UTO% $myproject 
2960: 24 6d 79 74 79 70 65 20 24 6d 79 73 72 63 69 64  $mytype $mysrcid
2970: 20 5b 6c 72 61 6e 67 65 20 24 6d 79 69 74 65 6d   [lrange $myitem
2980: 73 20 24 73 20 24 65 5d 5d 0a 09 20 20 20 20 69  s $s $e]]..    i
2990: 6e 63 72 20 63 6f 75 6e 74 65 72 0a 0a 20 20 20  ncr counter..   
29a0: 20 20 20 20 20 20 20 20 20 6c 6f 67 20 77 72 69           log wri
29b0: 74 65 20 34 20 63 73 65 74 73 20 22 42 72 65 61  te 4 csets "Brea
29c0: 6b 69 6e 67 20 5b 24 73 65 6c 66 20 73 74 72 20  king [$self str 
29d0: 5d 20 40 20 24 6c 61 73 74 65 2c 20 6e 65 77 20  ] @ $laste, new 
29e0: 5b 24 6e 65 77 20 73 74 72 5d 2c 20 63 75 74 74  [$new str], cutt
29f0: 69 6e 67 20 24 62 72 65 61 6b 73 28 24 6c 61 73  ing $breaks($las
2a00: 74 65 29 22 0a 0a 09 20 20 20 20 73 65 74 20 6c  te)"...    set l
2a10: 61 73 74 65 20 24 65 0a 09 7d 0a 0a 09 69 6e 74  aste $e..}...int
2a20: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 0a  egrity assert {.
2a30: 09 20 20 20 20 24 6c 61 73 74 65 20 3d 3d 20 28  .    $laste == (
2a40: 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 69 74 65 6d  [llength $myitem
2a50: 73 5d 2d 31 29 0a 09 7d 20 7b 42 61 64 20 66 72  s]-1)..} {Bad fr
2a60: 61 67 6d 65 6e 74 20 65 6e 64 20 40 20 24 6c 61  agment end @ $la
2a70: 73 74 65 2c 20 67 61 70 2c 20 6f 72 20 62 65 79  ste, gap, or bey
2a80: 6f 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20 72  ond end of the r
2a90: 61 6e 67 65 7d 0a 0a 09 23 20 50 75 74 20 74 68  ange}...# Put th
2aa0: 65 20 66 69 72 73 74 20 66 72 61 67 6d 65 6e 74  e first fragment
2ab0: 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e   into the curren
2ac0: 74 20 63 68 61 6e 67 65 73 65 74 2c 20 61 6e 64  t changeset, and
2ad0: 0a 09 23 20 75 70 64 61 74 65 20 74 68 65 20 69  ..# update the i
2ae0: 6e 2d 6d 65 6d 6f 72 79 20 69 6e 64 65 78 2e 20  n-memory index. 
2af0: 57 65 20 63 61 6e 20 73 69 6d 70 6c 79 20 28 72  We can simply (r
2b00: 65 29 61 64 64 20 74 68 65 20 69 74 65 6d 73 0a  e)add the items.
2b10: 09 23 20 62 65 63 61 75 73 65 20 77 65 20 63 6c  .# because we cl
2b20: 65 61 72 65 64 20 74 68 65 20 70 72 65 76 69 6f  eared the previo
2b30: 75 73 6c 79 20 65 78 69 73 74 69 6e 67 20 69 6e  usly existing in
2b40: 66 6f 72 6d 61 74 69 6f 6e 2c 20 73 65 65 0a 09  formation, see..
2b50: 23 20 28 2a 29 20 61 62 6f 76 65 2e 20 50 65 72  # (*) above. Per
2b60: 73 69 73 74 65 6e 63 65 20 64 6f 65 73 20 6e 6f  sistence does no
2b70: 74 20 6d 61 74 74 65 72 20 68 65 72 65 2c 20 6e  t matter here, n
2b80: 6f 6e 65 20 6f 66 20 74 68 65 0a 09 23 20 63 68  one of the..# ch
2b90: 61 6e 67 65 73 65 74 73 20 68 61 73 20 62 65 65  angesets has bee
2ba0: 6e 20 73 61 76 65 64 20 74 6f 20 74 68 65 20 70  n saved to the p
2bb0: 65 72 73 69 73 74 65 6e 74 20 73 74 61 74 65 20  ersistent state 
2bc0: 79 65 74 2e 0a 0a 09 73 65 74 20 6d 79 69 74 65  yet....set myite
2bd0: 6d 73 20 20 5b 6c 72 61 6e 67 65 20 24 6d 79 69  ms  [lrange $myi
2be0: 74 65 6d 73 20 20 30 20 24 66 69 72 73 74 65 5d  tems  0 $firste]
2bf0: 0a 09 73 65 74 20 6d 79 74 69 74 65 6d 73 20 5b  ..set mytitems [
2c00: 6c 72 61 6e 67 65 20 24 6d 79 74 69 74 65 6d 73  lrange $mytitems
2c10: 20 30 20 24 66 69 72 73 74 65 5d 0a 09 66 6f 72   0 $firste]..for
2c20: 65 61 63 68 20 69 69 64 20 24 6d 79 69 74 65 6d  each iid $myitem
2c30: 73 20 7b 0a 09 20 20 20 20 73 65 74 20 6b 65 79  s {..    set key
2c40: 20 5b 6c 69 73 74 20 24 6d 79 74 79 70 65 20 24   [list $mytype $
2c50: 69 69 64 5d 0a 09 20 20 20 20 73 65 74 20 6d 79  iid]..    set my
2c60: 69 74 65 6d 6d 61 70 28 24 6b 65 79 29 20 24 73  itemmap($key) $s
2c70: 65 6c 66 0a 09 20 20 20 20 6c 6f 67 20 77 72 69  elf..    log wri
2c80: 74 65 20 38 20 63 73 65 74 73 20 7b 4d 41 50 2b  te 8 csets {MAP+
2c90: 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73 65   item <$key> $se
2ca0: 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d  lf = [$self str]
2cb0: 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 20 31 0a  }..}...return 1.
2cc0: 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f      }..    metho
2cd0: 64 20 70 65 72 73 69 73 74 20 7b 7d 20 7b 0a 09  d persist {} {..
2ce0: 73 65 74 20 74 69 64 20 24 6d 79 63 73 74 79 70  set tid $mycstyp
2cf0: 65 28 24 6d 79 74 79 70 65 29 0a 09 73 65 74 20  e($mytype)..set 
2d00: 70 69 64 20 5b 24 6d 79 70 72 6f 6a 65 63 74 20  pid [$myproject 
2d10: 69 64 5d 0a 09 73 65 74 20 70 6f 73 20 30 0a 0a  id]..set pos 0..
2d20: 09 73 74 61 74 65 20 74 72 61 6e 73 61 63 74 69  .state transacti
2d30: 6f 6e 20 7b 0a 09 20 20 20 20 73 74 61 74 65 20  on {..    state 
2d40: 72 75 6e 20 7b 0a 09 09 49 4e 53 45 52 54 20 49  run {...INSERT I
2d50: 4e 54 4f 20 63 68 61 6e 67 65 73 65 74 20 28 63  NTO changeset (c
2d60: 69 64 2c 20 20 20 70 69 64 2c 20 20 74 79 70 65  id,   pid,  type
2d70: 2c 20 73 72 63 29 0a 09 09 56 41 4c 55 45 53 20  , src)...VALUES 
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
2d90: 24 6d 79 69 64 2c 20 24 70 69 64 2c 20 24 74 69  $myid, $pid, $ti
2da0: 64 2c 20 24 6d 79 73 72 63 69 64 29 3b 0a 09 20  d, $mysrcid);.. 
2db0: 20 20 20 7d 0a 0a 09 20 20 20 20 66 6f 72 65 61     }...    forea
2dc0: 63 68 20 69 69 64 20 24 6d 79 69 74 65 6d 73 20  ch iid $myitems 
2dd0: 7b 0a 09 09 73 74 61 74 65 20 72 75 6e 20 7b 0a  {...state run {.
2de0: 09 09 20 20 20 20 49 4e 53 45 52 54 20 49 4e 54  ..    INSERT INT
2df0: 4f 20 63 73 69 74 65 6d 20 28 63 69 64 2c 20 20  O csitem (cid,  
2e00: 20 70 6f 73 2c 20 20 69 69 64 29 0a 09 09 20 20   pos,  iid)...  
2e10: 20 20 56 41 4c 55 45 53 20 20 20 20 20 20 20 20    VALUES        
2e20: 20 20 20 20 20 28 24 6d 79 69 64 2c 20 24 70 6f       ($myid, $po
2e30: 73 2c 20 24 69 69 64 29 3b 0a 09 09 7d 0a 09 09  s, $iid);...}...
2e40: 69 6e 63 72 20 70 6f 73 0a 09 20 20 20 20 7d 0a  incr pos..    }.
2e50: 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d  .}..return.    }
2e60: 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 74 69 6d  ..    method tim
2e70: 65 72 61 6e 67 65 20 7b 7d 20 7b 20 72 65 74 75  erange {} { retu
2e80: 72 6e 20 5b 24 6d 79 74 79 70 65 6f 62 6a 20 74  rn [$mytypeobj t
2e90: 69 6d 65 72 61 6e 67 65 20 24 6d 79 69 74 65 6d  imerange $myitem
2ea0: 73 5d 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64  s] }..    method
2eb0: 20 6c 69 6d 69 74 73 20 7b 7d 20 7b 0a 09 73 74   limits {} {..st
2ec0: 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67  ruct::list assig
2ed0: 6e 20 5b 24 6d 79 74 79 70 65 6f 62 6a 20 6c 69  n [$mytypeobj li
2ee0: 6d 69 74 73 20 24 6d 79 69 74 65 6d 73 5d 20 6d  mits $myitems] m
2ef0: 61 78 70 20 6d 69 6e 73 0a 09 72 65 74 75 72 6e  axp mins..return
2f00: 20 5b 6c 69 73 74 20 5b 54 61 67 49 74 65 6d 44   [list [TagItemD
2f10: 69 63 74 20 24 6d 61 78 70 20 24 6d 79 74 79 70  ict $maxp $mytyp
2f20: 65 5d 20 5b 54 61 67 49 74 65 6d 44 69 63 74 20  e] [TagItemDict 
2f30: 24 6d 69 6e 73 20 24 6d 79 74 79 70 65 5d 5d 0a  $mins $mytype]].
2f40: 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f      }..    metho
2f50: 64 20 64 72 6f 70 20 7b 7d 20 7b 0a 09 6c 6f 67  d drop {} {..log
2f60: 20 77 72 69 74 65 20 38 20 63 73 65 74 73 20 7b   write 8 csets {
2f70: 44 72 6f 70 70 69 6e 67 20 24 73 65 6c 66 20 3d  Dropping $self =
2f80: 20 5b 24 73 65 6c 66 20 73 74 72 5d 7d 0a 0a 09   [$self str]}...
2f90: 73 74 61 74 65 20 74 72 61 6e 73 61 63 74 69 6f  state transactio
2fa0: 6e 20 7b 0a 09 20 20 20 20 73 74 61 74 65 20 72  n {..    state r
2fb0: 75 6e 20 7b 0a 09 09 44 45 4c 45 54 45 20 46 52  un {...DELETE FR
2fc0: 4f 4d 20 63 68 61 6e 67 65 73 65 74 20 20 20 57  OM changeset   W
2fd0: 48 45 52 45 20 63 69 64 20 3d 20 24 6d 79 69 64  HERE cid = $myid
2fe0: 3b 0a 09 09 44 45 4c 45 54 45 20 46 52 4f 4d 20  ;...DELETE FROM 
2ff0: 63 73 69 74 65 6d 20 20 20 20 20 20 57 48 45 52  csitem      WHER
3000: 45 20 63 69 64 20 3d 20 24 6d 79 69 64 3b 0a 09  E cid = $myid;..
3010: 09 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 73 73  .DELETE FROM css
3020: 75 63 63 65 73 73 6f 72 20 57 48 45 52 45 20 63  uccessor WHERE c
3030: 69 64 20 3d 20 24 6d 79 69 64 3b 0a 09 20 20 20  id = $myid;..   
3040: 20 7d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 69   }..}..foreach i
3050: 69 64 20 24 6d 79 69 74 65 6d 73 20 7b 0a 09 20  id $myitems {.. 
3060: 20 20 20 73 65 74 20 6b 65 79 20 5b 6c 69 73 74     set key [list
3070: 20 24 6d 79 74 79 70 65 20 24 69 69 64 5d 0a 09   $mytype $iid]..
3080: 20 20 20 20 75 6e 73 65 74 20 6d 79 69 74 65 6d      unset myitem
3090: 6d 61 70 28 24 6b 65 79 29 0a 09 20 20 20 20 6c  map($key)..    l
30a0: 6f 67 20 77 72 69 74 65 20 38 20 63 73 65 74 73  og write 8 csets
30b0: 20 7b 4d 41 50 2d 20 69 74 65 6d 20 3c 24 6b 65   {MAP- item <$ke
30c0: 79 3e 20 24 73 65 6c 66 20 3d 20 5b 24 73 65 6c  y> $self = [$sel
30d0: 66 20 73 74 72 5d 7d 0a 09 7d 0a 09 73 65 74 20  f str]}..}..set 
30e0: 70 6f 73 20 20 20 20 20 20 20 20 20 20 5b 6c 73  pos          [ls
30f0: 65 61 72 63 68 20 2d 65 78 61 63 74 20 24 6d 79  earch -exact $my
3100: 63 68 61 6e 67 65 73 65 74 73 20 24 73 65 6c 66  changesets $self
3110: 5d 0a 09 73 65 74 20 6d 79 63 68 61 6e 67 65 73  ]..set mychanges
3120: 65 74 73 20 5b 6c 72 65 70 6c 61 63 65 20 24 6d  ets [lreplace $m
3130: 79 63 68 61 6e 67 65 73 65 74 73 20 24 70 6f 73  ychangesets $pos
3140: 20 24 70 6f 73 5d 0a 09 73 65 74 20 70 6f 73 20   $pos]..set pos 
3150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3160: 20 20 20 5b 6c 73 65 61 72 63 68 20 2d 65 78 61     [lsearch -exa
3170: 63 74 20 24 6d 79 74 63 68 61 6e 67 65 73 65 74  ct $mytchangeset
3180: 73 28 24 6d 79 74 79 70 65 29 20 24 73 65 6c 66  s($mytype) $self
3190: 5d 0a 09 73 65 74 20 6d 79 74 63 68 61 6e 67 65  ]..set mytchange
31a0: 73 65 74 73 28 24 6d 79 74 79 70 65 29 20 5b 6c  sets($mytype) [l
31b0: 72 65 70 6c 61 63 65 20 24 6d 79 74 63 68 61 6e  replace $mytchan
31c0: 67 65 73 65 74 73 28 24 6d 79 74 79 70 65 29 20  gesets($mytype) 
31d0: 24 70 6f 73 20 24 70 6f 73 5d 0a 0a 09 23 20 52  $pos $pos]...# R
31e0: 65 74 75 72 6e 20 74 68 65 20 6c 69 73 74 20 6f  eturn the list o
31f0: 66 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 73  f predecessors s
3200: 6f 20 74 68 61 74 20 74 68 65 79 20 63 61 6e 20  o that they can 
3210: 62 65 20 61 64 6a 75 73 74 65 64 2e 0a 09 72 65  be adjusted...re
3220: 74 75 72 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69  turn [struct::li
3230: 73 74 20 6d 61 70 20 5b 73 74 61 74 65 20 72 75  st map [state ru
3240: 6e 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20  n {..    SELECT 
3250: 63 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  cid..    FROM   
3260: 63 73 73 75 63 63 65 73 73 6f 72 0a 09 20 20 20  cssuccessor..   
3270: 20 57 48 45 52 45 20 20 6e 69 64 20 3d 20 24 6d   WHERE  nid = $m
3280: 79 69 64 0a 09 7d 5d 20 5b 6d 79 74 79 70 65 6d  yid..}] [mytypem
3290: 65 74 68 6f 64 20 6f 66 5d 5d 0a 20 20 20 20 7d  ethod of]].    }
32a0: 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 72 65 70  ..    method rep
32b0: 6f 72 74 6c 6f 6f 70 20 7b 7b 6b 69 6c 6c 20 31  ortloop {{kill 1
32c0: 7d 7d 20 7b 0a 09 23 20 57 65 20 70 72 69 6e 74  }} {..# We print
32d0: 20 74 68 65 20 69 74 65 6d 73 20 77 68 69 63 68   the items which
32e0: 20 61 72 65 20 70 72 6f 64 75 63 69 6e 67 20 74   are producing t
32f0: 68 65 20 6c 6f 6f 70 2c 20 61 6e 64 20 68 6f 77  he loop, and how
3300: 2e 0a 0a 09 73 65 74 20 68 64 72 20 22 53 65 6c  ....set hdr "Sel
3310: 66 2d 72 65 66 65 72 65 6e 74 69 61 6c 20 63 68  f-referential ch
3320: 61 6e 67 65 73 65 74 20 5b 24 73 65 6c 66 20 73  angeset [$self s
3330: 74 72 5d 20 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f  tr] ____________
3340: 5f 5f 5f 5f 5f 5f 22 0a 09 73 65 74 20 66 74 72  ______"..set ftr
3350: 20 5b 72 65 67 73 75 62 20 2d 61 6c 6c 20 7b 5b   [regsub -all {[
3360: 5e 20 09 5d 7d 20 24 68 64 72 20 7b 5f 7d 5d 0a  ^ .]} $hdr {_}].
3370: 0a 09 6c 6f 67 20 77 72 69 74 65 20 30 20 63 73  ..log write 0 cs
3380: 65 74 73 20 24 68 64 72 0a 09 66 6f 72 65 61 63  ets $hdr..foreac
3390: 68 20 7b 69 74 65 6d 20 6e 65 78 74 69 74 65 6d  h {item nextitem
33a0: 7d 20 5b 24 6d 79 74 79 70 65 6f 62 6a 20 6c 6f  } [$mytypeobj lo
33b0: 6f 70 73 20 24 6d 79 69 74 65 6d 73 5d 20 7b 0a  ops $myitems] {.
33c0: 09 20 20 20 20 23 20 43 72 65 61 74 65 20 74 61  .    # Create ta
33d0: 67 67 65 64 20 69 74 65 6d 73 20 66 72 6f 6d 20  gged items from 
33e0: 74 68 65 20 69 64 20 61 6e 64 20 6f 75 72 20 74  the id and our t
33f0: 79 70 65 2e 0a 09 20 20 20 20 73 65 74 20 69 74  ype...    set it
3400: 65 6d 20 20 20 20 20 5b 6c 69 73 74 20 24 6d 79  em     [list $my
3410: 74 79 70 65 20 20 24 69 74 65 6d 5d 0a 09 20 20  type  $item]..  
3420: 20 20 73 65 74 20 6e 65 78 74 69 74 65 6d 20 5b    set nextitem [
3430: 6c 69 73 74 20 24 6d 79 74 79 70 65 20 24 6e 65  list $mytype $ne
3440: 78 74 69 74 65 6d 5d 0a 09 20 20 20 20 23 20 50  xtitem]..    # P
3450: 72 69 6e 74 61 62 6c 65 20 6c 61 62 65 6c 73 2e  rintable labels.
3460: 0a 09 20 20 20 20 73 65 74 20 69 20 20 22 3c 5b  ..    set i  "<[
3470: 24 74 79 70 65 20 69 74 65 6d 73 74 72 20 24 69  $type itemstr $i
3480: 74 65 6d 5d 3e 22 0a 09 20 20 20 20 73 65 74 20  tem]>"..    set 
3490: 6e 20 20 22 3c 5b 24 74 79 70 65 20 69 74 65 6d  n  "<[$type item
34a0: 73 74 72 20 24 6e 65 78 74 69 74 65 6d 5d 3e 22  str $nextitem]>"
34b0: 0a 09 20 20 20 20 73 65 74 20 6e 63 73 20 24 6d  ..    set ncs $m
34c0: 79 69 74 65 6d 6d 61 70 28 24 6e 65 78 74 69 74  yitemmap($nextit
34d0: 65 6d 29 0a 09 20 20 20 20 23 20 50 72 69 6e 74  em)..    # Print
34e0: 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20  ..    log write 
34f0: 30 20 63 73 65 74 73 20 7b 2a 20 24 69 20 2d 2d  0 csets {* $i --
3500: 3e 20 24 6e 20 2d 2d 3e 20 63 73 20 5b 24 6e 63  > $n --> cs [$nc
3510: 73 20 73 74 72 5d 7d 0a 09 7d 0a 09 6c 6f 67 20  s str]}..}..log 
3520: 77 72 69 74 65 20 30 20 63 73 65 74 73 20 24 66  write 0 csets $f
3530: 74 72 0a 0a 09 69 66 20 7b 21 24 6b 69 6c 6c 7d  tr...if {!$kill}
3540: 20 72 65 74 75 72 6e 0a 09 74 72 6f 75 62 6c 65   return..trouble
3550: 20 69 6e 74 65 72 6e 61 6c 20 22 5b 24 73 65 6c   internal "[$sel
3560: 66 20 73 74 72 5d 20 64 65 70 65 6e 64 73 20 6f  f str] depends o
3570: 6e 20 69 74 73 65 6c 66 22 0a 09 72 65 74 75 72  n itself"..retur
3580: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74  n.    }..    met
3590: 68 6f 64 20 70 75 73 68 74 6f 20 7b 72 65 70 6f  hod pushto {repo
35a0: 73 69 74 6f 72 79 20 64 61 74 65 20 72 73 74 61  sitory date rsta
35b0: 74 65 7d 20 7b 0a 09 23 20 47 65 6e 65 72 61 74  te} {..# Generat
35c0: 65 20 61 6e 64 20 69 6d 70 6f 72 74 20 74 68 65  e and import the
35d0: 20 6d 61 6e 69 66 65 73 74 20 66 6f 72 20 74 68   manifest for th
35e0: 69 73 20 63 68 61 6e 67 65 73 65 74 2e 0a 09 23  is changeset...#
35f0: 0a 09 23 20 44 61 74 61 20 6e 65 65 64 65 64 3a  ..# Data needed:
3600: 0a 09 23 20 2d 20 43 6f 6d 6d 69 74 20 6d 65 73  ..# - Commit mes
3610: 73 61 67 65 20 20 20 20 20 20 20 20 20 20 20 20  sage            
3620: 20 20 20 28 2d 2d 20 6d 79 73 72 63 69 64 20 2d     (-- mysrcid -
3630: 3e 20 72 65 70 6f 73 69 74 6f 72 79 20 6d 65 74  > repository met
3640: 61 29 0a 09 23 20 2d 20 55 73 65 72 20 64 6f 69  a)..# - User doi
3650: 6e 67 20 74 68 65 20 63 6f 6d 6d 69 74 20 20 20  ng the commit   
3660: 20 20 20 20 20 28 73 2e 61 2e 29 0a 09 23 0a 09       (s.a.)..#..
3670: 23 20 2d 20 54 69 6d 65 73 74 61 6d 70 20 6f 66  # - Timestamp of
3680: 20 77 68 65 6e 20 63 6f 6d 6d 69 74 74 65 64 20   when committed 
3690: 20 28 63 6f 6d 6d 61 6e 64 20 61 72 67 75 6d 65   (command argume
36a0: 6e 74 29 0a 09 23 0a 09 23 20 2d 20 54 68 65 20  nt)..#..# - The 
36b0: 70 61 72 65 6e 74 20 63 68 61 6e 67 65 73 65 74  parent changeset
36c0: 2c 20 69 66 20 61 6e 79 2e 20 49 66 20 74 68 65  , if any. If the
36d0: 72 65 20 69 73 20 6e 6f 20 70 61 72 65 6e 74 20  re is no parent 
36e0: 66 6f 73 73 69 6c 0a 09 23 20 20 20 77 69 6c 6c  fossil..#   will
36f0: 20 75 73 65 20 74 68 65 20 65 6d 70 74 79 20 62   use the empty b
3700: 61 73 65 20 72 65 76 69 73 69 6f 6e 20 61 73 20  ase revision as 
3710: 70 61 72 65 6e 74 2e 0a 09 23 0a 09 23 20 2d 20  parent...#..# - 
3720: 4c 69 73 74 20 6f 66 20 74 68 65 20 66 69 6c 65  List of the file
3730: 20 72 65 76 69 73 69 6f 6e 73 20 69 6e 20 74 68   revisions in th
3740: 65 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 73  e changeset....s
3750: 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69  truct::list assi
3760: 67 6e 20 5b 24 6d 79 70 72 6f 6a 65 63 74 20 67  gn [$myproject g
3770: 65 74 6d 65 74 61 20 24 6d 79 73 72 63 69 64 5d  etmeta $mysrcid]
3780: 20 5f 5f 20 5f 5f 20 75 73 65 72 20 6d 65 73 73   __ __ user mess
3790: 61 67 65 0a 0a 09 23 20 57 65 20 64 65 72 69 76  age...# We deriv
37a0: 65 20 74 68 65 20 6c 6f 64 20 69 6e 66 6f 72 6d  e the lod inform
37b0: 61 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20 66  ation directly f
37c0: 72 6f 6d 20 74 68 65 20 72 65 76 69 73 69 6f 6e  rom the revision
37d0: 73 20 6f 66 0a 09 23 20 74 68 65 20 63 68 61 6e  s of..# the chan
37e0: 67 65 73 65 74 2c 20 61 73 20 74 68 65 20 62 72  geset, as the br
37f0: 61 6e 63 68 20 70 61 72 74 20 6f 66 20 74 68 65  anch part of the
3800: 20 6d 65 74 61 20 64 61 74 61 20 28 73 2e 61 2e   meta data (s.a.
3810: 29 20 69 73 0a 09 23 20 6f 75 74 64 61 74 65 64  ) is..# outdated
3820: 20 73 69 6e 63 65 20 70 61 73 73 20 46 69 6c 74   since pass Filt
3830: 65 72 53 79 6d 62 6f 6c 73 2e 0a 0a 09 73 65 74  erSymbols....set
3840: 20 6c 6f 64 6e 61 6d 65 20 5b 24 73 65 6c 66 20   lodname [$self 
3850: 6c 6f 64 5d 0a 0a 09 6c 6f 67 20 77 72 69 74 65  lod]...log write
3860: 20 32 20 63 73 65 74 73 20 7b 49 6d 70 6f 72 74   2 csets {Import
3870: 69 6e 67 20 72 65 76 69 73 69 6f 6e 20 5b 24 73  ing revision [$s
3880: 65 6c 66 20 73 74 72 5d 20 6f 6e 20 24 6c 6f 64  elf str] on $lod
3890: 6e 61 6d 65 7d 0a 0a 09 23 20 50 65 72 66 6f 72  name}...# Perfor
38a0: 6d 20 74 68 65 20 69 6d 70 6f 72 74 2e 20 41 73  m the import. As
38b0: 20 70 61 72 74 20 6f 66 20 74 68 61 74 20 77 65   part of that we
38c0: 20 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 70   determine the p
38d0: 61 72 65 6e 74 0a 09 23 20 77 65 20 6e 65 65 64  arent..# we need
38e0: 2c 20 61 6e 64 20 63 6f 6e 76 65 72 74 20 74 68  , and convert th
38f0: 65 20 6c 69 73 74 20 6f 66 20 69 74 65 6d 73 20  e list of items 
3900: 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  in the changeset
3910: 20 69 6e 74 6f 0a 09 23 20 75 75 69 64 73 20 61   into..# uuids a
3920: 6e 64 20 70 72 69 6e 74 61 62 6c 65 20 64 61 74  nd printable dat
3930: 61 2e 0a 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73  a....struct::lis
3940: 74 20 61 73 73 69 67 6e 20 5b 47 65 74 69 73 64  t assign [Getisd
3950: 65 66 61 75 6c 74 20 24 6d 79 69 74 65 6d 73 5d  efault $myitems]
3960: 20 69 73 64 65 66 61 75 6c 74 20 6c 61 73 74 64   isdefault lastd
3970: 65 66 61 75 6c 74 6f 6e 74 72 75 6e 6b 0a 0a 09  efaultontrunk...
3980: 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73 65 74  log write 8 cset
3990: 73 20 7b 4c 4f 44 20 20 20 20 27 24 6c 6f 64 6e  s {LOD    '$lodn
39a0: 61 6d 65 27 7d 0a 09 6c 6f 67 20 77 72 69 74 65  ame'}..log write
39b0: 20 38 20 63 73 65 74 73 20 7b 20 64 65 66 3f 20   8 csets { def? 
39c0: 20 24 69 73 64 65 66 61 75 6c 74 7d 0a 09 6c 6f   $isdefault}..lo
39d0: 67 20 77 72 69 74 65 20 38 20 63 73 65 74 73 20  g write 8 csets 
39e0: 7b 20 6c 61 73 74 3f 20 24 6c 61 73 74 64 65 66  { last? $lastdef
39f0: 61 75 6c 74 6f 6e 74 72 75 6e 6b 7d 0a 0a 09 73  aultontrunk}...s
3a00: 65 74 20 6c 77 73 20 20 5b 47 65 74 77 6f 72 6b  et lws  [Getwork
3a10: 73 70 61 63 65 20 20 20 20 24 72 73 74 61 74 65  space    $rstate
3a20: 20 24 6c 6f 64 6e 61 6d 65 20 24 6d 79 70 72 6f   $lodname $mypro
3a30: 6a 65 63 74 20 24 69 73 64 65 66 61 75 6c 74 5d  ject $isdefault]
3a40: 0a 09 24 6c 77 73 20 61 64 64 20 5b 47 65 74 72  ..$lws add [Getr
3a50: 65 76 69 73 69 6f 6e 69 6e 66 6f 20 24 6d 79 69  evisioninfo $myi
3a60: 74 65 6d 73 5d 0a 0a 09 73 65 74 20 75 75 69 64  tems]...set uuid
3a70: 20 5b 24 72 65 70 6f 73 69 74 6f 72 79 20 69 6d   [$repository im
3a80: 70 6f 72 74 72 65 76 69 73 69 6f 6e 20 5b 24 73  portrevision [$s
3a90: 65 6c 66 20 73 74 72 5d 20 5c 0a 09 09 20 20 20  elf str] \...   
3aa0: 20 20 20 24 75 73 65 72 20 24 6d 65 73 73 61 67     $user $messag
3ab0: 65 20 24 64 61 74 65 20 5c 0a 09 09 20 20 20 20  e $date \...    
3ac0: 20 20 5b 24 6c 77 73 20 67 65 74 69 64 5d 20 5b    [$lws getid] [
3ad0: 24 6c 77 73 20 67 65 74 5d 5d 0a 0a 09 23 20 52  $lws get]]...# R
3ae0: 65 6d 65 6d 62 65 72 20 74 68 65 20 69 6d 70 6f  emember the impo
3af0: 72 74 65 64 20 63 68 61 6e 67 65 73 65 74 20 69  rted changeset i
3b00: 6e 20 74 68 65 20 73 74 61 74 65 2c 20 75 6e 64  n the state, und
3b10: 65 72 20 6f 75 72 0a 09 23 20 4c 4f 44 2e 20 41  er our..# LOD. A
3b20: 6e 64 20 69 66 20 69 74 20 69 73 20 74 68 65 20  nd if it is the 
3b30: 6c 61 73 74 20 74 72 75 6e 6b 20 63 68 61 6e 67  last trunk chang
3b40: 65 73 65 74 20 6f 6e 20 74 68 65 20 76 65 6e 64  eset on the vend
3b50: 6f 72 0a 09 23 20 62 72 61 6e 63 68 20 74 68 65  or..# branch the
3b60: 6e 20 74 68 65 20 72 65 76 69 73 69 6f 6e 20 69  n the revision i
3b70: 73 20 61 6c 73 6f 20 74 68 65 20 61 63 74 75 61  s also the actua
3b80: 6c 20 72 6f 6f 74 20 6f 66 20 74 68 65 0a 09 23  l root of the..#
3b90: 20 3a 74 72 75 6e 6b 3a 2c 20 73 6f 20 77 65 20   :trunk:, so we 
3ba0: 72 65 6d 65 6d 62 65 72 20 69 74 20 61 73 20 73  remember it as s
3bb0: 75 63 68 20 69 6e 20 74 68 65 20 73 74 61 74 65  uch in the state
3bc0: 2e 20 48 6f 77 65 76 65 72 20 69 66 0a 09 23 20  . However if..# 
3bd0: 74 68 65 20 74 72 75 6e 6b 20 61 6c 72 65 61 64  the trunk alread
3be0: 79 20 65 78 69 73 74 73 20 74 68 65 6e 20 74 68  y exists then th
3bf0: 65 20 63 68 61 6e 67 65 73 65 74 20 63 61 6e 6e  e changeset cann
3c00: 6f 74 20 62 65 20 6f 6e 20 69 74 0a 09 23 20 61  ot be on it..# a
3c10: 6e 79 20 6d 6f 72 65 2e 20 54 68 69 73 20 69 6e  ny more. This in
3c20: 64 69 63 61 74 65 73 20 77 65 69 72 64 6e 65 73  dicates weirdnes
3c30: 73 20 69 6e 20 74 68 65 20 73 65 74 75 70 20 6f  s in the setup o
3c40: 66 20 74 68 65 0a 09 23 20 76 65 6e 64 6f 72 20  f the..# vendor 
3c50: 62 72 61 6e 63 68 2c 20 62 75 74 20 6f 6e 65 20  branch, but one 
3c60: 77 65 20 63 61 6e 20 77 6f 72 6b 20 61 72 6f 75  we can work arou
3c70: 6e 64 2e 0a 0a 09 24 6c 77 73 20 64 65 66 69 64  nd....$lws defid
3c80: 20 24 75 75 69 64 0a 09 69 66 20 7b 24 6c 61 73   $uuid..if {$las
3c90: 74 64 65 66 61 75 6c 74 6f 6e 74 72 75 6e 6b 7d  tdefaultontrunk}
3ca0: 20 7b 0a 09 20 20 20 20 69 66 20 7b 5b 24 72 73   {..    if {[$rs
3cb0: 74 61 74 65 20 68 61 73 20 3a 74 72 75 6e 6b 3a  tate has :trunk:
3cc0: 5d 7d 20 7b 0a 09 09 6c 6f 67 20 77 72 69 74 65  ]} {...log write
3cd0: 20 32 20 63 73 65 74 73 20 7b 4d 75 6c 74 69 70   2 csets {Multip
3ce0: 6c 65 20 63 68 61 6e 67 65 73 65 74 73 20 64 65  le changesets de
3cf0: 63 6c 61 72 65 64 20 74 6f 20 62 65 20 74 68 65  clared to be the
3d00: 20 6c 61 73 74 20 74 72 75 6e 6b 20 63 68 61 6e   last trunk chan
3d10: 67 65 73 65 74 20 6f 6e 20 74 68 65 20 76 65 6e  geset on the ven
3d20: 64 6f 72 2d 62 72 61 6e 63 68 7d 0a 09 20 20 20  dor-branch}..   
3d30: 20 7d 20 65 6c 73 65 20 7b 0a 09 09 24 72 73 74   } else {...$rst
3d40: 61 74 65 20 6e 65 77 20 3a 74 72 75 6e 6b 3a 20  ate new :trunk: 
3d50: 5b 24 6c 77 73 20 6e 61 6d 65 5d 0a 09 20 20 20  [$lws name]..   
3d60: 20 7d 0a 09 7d 0a 0a 09 23 20 52 65 6d 65 6d 62   }..}...# Rememb
3d70: 65 72 20 74 68 65 20 77 68 6f 6c 65 20 63 68 61  er the whole cha
3d80: 6e 67 65 73 65 74 20 2f 20 75 75 69 64 20 6d 61  ngeset / uuid ma
3d90: 70 70 69 6e 67 2c 20 66 6f 72 20 74 68 65 20 74  pping, for the t
3da0: 61 67 73 2e 0a 0a 09 73 74 61 74 65 20 72 75 6e  ags....state run
3db0: 20 7b 0a 09 20 20 20 20 49 4e 53 45 52 54 20 49   {..    INSERT I
3dc0: 4e 54 4f 20 63 73 75 75 69 64 20 28 63 69 64 2c  NTO csuuid (cid,
3dd0: 20 20 20 75 75 69 64 29 0a 09 20 20 20 20 56 41     uuid)..    VA
3de0: 4c 55 45 53 20 20 20 20 20 20 20 20 20 20 20 20  LUES            
3df0: 20 28 24 6d 79 69 64 2c 20 24 75 75 69 64 29 0a   ($myid, $uuid).
3e00: 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d  .}..return.    }
3e10: 0a 0a 20 20 20 20 70 72 6f 63 20 47 65 74 72 65  ..    proc Getre
3e20: 76 69 73 69 6f 6e 69 6e 66 6f 20 7b 72 65 76 69  visioninfo {revi
3e30: 73 69 6f 6e 73 7d 20 7b 0a 09 73 65 74 20 74 68  sions} {..set th
3e40: 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65  eset ('[join $re
3e50: 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29  visions {','}]')
3e60: 0a 09 73 65 74 20 72 65 76 69 73 69 6f 6e 73 20  ..set revisions 
3e70: 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 66 72 69  {}..foreach {fri
3e80: 64 20 70 61 74 68 20 66 6e 61 6d 65 20 72 65 76  d path fname rev
3e90: 6e 72 20 72 6f 70 7d 20 5b 73 74 61 74 65 20 72  nr rop} [state r
3ea0: 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d  un [subst -nocom
3eb0: 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61  mands -nobacksla
3ec0: 73 68 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45  shes {..    SELE
3ed0: 43 54 20 55 2e 75 75 69 64 2c 20 46 2e 76 69 73  CT U.uuid, F.vis
3ee0: 69 62 6c 65 2c 20 46 2e 6e 61 6d 65 2c 20 52 2e  ible, F.name, R.
3ef0: 72 65 76 2c 20 52 2e 6f 70 0a 09 20 20 20 20 46  rev, R.op..    F
3f00: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52  ROM   revision R
3f10: 2c 20 72 65 76 75 75 69 64 20 55 2c 20 66 69 6c  , revuuid U, fil
3f20: 65 20 46 0a 09 20 20 20 20 57 48 45 52 45 20 20  e F..    WHERE  
3f30: 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 74  R.rid IN $theset
3f40: 20 20 2d 2d 20 41 6c 6c 20 73 70 65 63 69 66 69    -- All specifi
3f50: 65 64 20 72 65 76 69 73 69 6f 6e 73 0a 09 20 20  ed revisions..  
3f60: 20 20 41 4e 44 20 20 20 20 55 2e 72 69 64 20 3d    AND    U.rid =
3f70: 20 52 2e 72 69 64 20 20 20 20 20 2d 2d 20 67 65   R.rid     -- ge
3f80: 74 20 66 6f 73 73 69 6c 20 75 75 69 64 20 6f 66  t fossil uuid of
3f90: 20 72 65 76 69 73 69 6f 6e 0a 09 20 20 20 20 41   revision..    A
3fa0: 4e 44 20 20 20 20 46 2e 66 69 64 20 3d 20 52 2e  ND    F.fid = R.
3fb0: 66 69 64 20 20 20 20 20 2d 2d 20 67 65 74 20 66  fid     -- get f
3fc0: 69 6c 65 20 6f 66 20 72 65 76 69 73 69 6f 6e 0a  ile of revision.
3fd0: 09 7d 5d 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70  .}]] {..    lapp
3fe0: 65 6e 64 20 72 65 76 69 73 69 6f 6e 73 20 24 66  end revisions $f
3ff0: 72 69 64 20 24 70 61 74 68 20 24 66 6e 61 6d 65  rid $path $fname
4000: 2f 24 72 65 76 6e 72 20 24 72 6f 70 0a 09 7d 0a  /$revnr $rop..}.
4010: 09 72 65 74 75 72 6e 20 24 72 65 76 69 73 69 6f  .return $revisio
4020: 6e 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72  ns.    }..    pr
4030: 6f 63 20 47 65 74 77 6f 72 6b 73 70 61 63 65 20  oc Getworkspace 
4040: 7b 72 73 74 61 74 65 20 6c 6f 64 6e 61 6d 65 20  {rstate lodname 
4050: 70 72 6f 6a 65 63 74 20 69 73 64 65 66 61 75 6c  project isdefaul
4060: 74 7d 20 7b 0a 0a 09 23 20 54 68 65 20 73 74 61  t} {...# The sta
4070: 74 65 20 6f 62 6a 65 63 74 20 68 6f 6c 64 73 20  te object holds 
4080: 74 68 65 20 77 6f 72 6b 73 70 61 63 65 20 73 74  the workspace st
4090: 61 74 65 20 6f 66 20 65 61 63 68 20 6b 6e 6f 77  ate of each know
40a0: 6e 0a 09 23 20 6c 69 6e 65 2d 6f 66 2d 64 65 76  n..# line-of-dev
40b0: 65 6c 6f 70 6d 65 6e 74 20 28 4c 4f 44 29 2c 20  elopment (LOD), 
40c0: 75 70 20 74 6f 20 74 68 65 20 6c 61 73 74 20 63  up to the last c
40d0: 6f 6d 6d 69 74 74 65 64 0a 09 23 20 63 68 61 6e  ommitted..# chan
40e0: 67 65 73 65 74 20 62 65 6c 6f 6e 67 69 6e 67 20  geset belonging 
40f0: 74 6f 20 74 68 61 74 20 4c 4f 44 2e 0a 0a 09 23  to that LOD....#
4100: 20 28 2a 29 20 53 74 61 6e 64 61 72 64 20 68 61   (*) Standard ha
4110: 6e 64 6c 69 6e 67 20 69 66 20 69 6e 2d 4c 4f 44  ndling if in-LOD
4120: 20 63 68 61 6e 67 65 73 65 74 73 2e 20 49 66 20   changesets. If 
4130: 74 68 65 20 4c 4f 44 20 6f 66 0a 09 23 20 20 20  the LOD of..#   
4140: 20 20 74 68 65 20 63 75 72 72 65 6e 74 20 63 68    the current ch
4150: 61 6e 67 65 73 65 74 20 65 78 69 73 74 73 20 69  angeset exists i
4160: 6e 20 74 68 65 20 73 74 61 74 65 20 28 3d 20 68  n the state (= h
4170: 61 73 20 62 65 65 6e 0a 09 23 20 20 20 20 20 63  as been..#     c
4180: 6f 6d 6d 69 74 74 65 64 20 74 6f 29 20 74 68 65  ommitted to) the
4190: 6e 20 74 68 69 73 20 69 74 20 68 61 73 20 74 68  n this it has th
41a0: 65 20 77 6f 72 6b 73 70 61 63 65 20 77 65 20 61  e workspace we a
41b0: 72 65 0a 09 23 20 20 20 20 20 6c 6f 6f 6b 69 6e  re..#     lookin
41c0: 67 20 66 6f 72 2e 0a 0a 09 69 66 20 7b 5b 24 72  g for....if {[$r
41d0: 73 74 61 74 65 20 68 61 73 20 24 6c 6f 64 6e 61  state has $lodna
41e0: 6d 65 5d 7d 20 7b 0a 09 20 20 20 20 72 65 74 75  me]} {..    retu
41f0: 72 6e 20 5b 24 72 73 74 61 74 65 20 67 65 74 20  rn [$rstate get 
4200: 24 6c 6f 64 6e 61 6d 65 5d 0a 09 7d 0a 0a 09 23  $lodname]..}...#
4210: 20 49 66 20 74 68 65 20 4c 4f 44 20 69 73 20 68   If the LOD is h
4220: 6f 77 65 76 65 72 20 6e 6f 74 20 79 65 74 20 6b  owever not yet k
4230: 6e 6f 77 6e 2c 20 74 68 65 6e 20 74 68 65 20 63  nown, then the c
4240: 75 72 72 65 6e 74 0a 09 23 20 63 68 61 6e 67 65  urrent..# change
4250: 73 65 74 20 63 61 6e 20 62 65 20 65 69 74 68 65  set can be eithe
4260: 72 20 6f 66 0a 09 23 20 28 61 29 20 72 6f 6f 74  r of..# (a) root
4270: 20 6f 66 20 61 20 76 65 6e 64 6f 72 20 62 72 61   of a vendor bra
4280: 6e 63 68 2c 0a 09 23 20 28 62 29 20 72 6f 6f 74  nch,..# (b) root
4290: 20 6f 66 20 74 68 65 20 74 72 75 6e 6b 20 4c 4f   of the trunk LO
42a0: 44 2c 20 6f 72 0a 09 23 20 28 63 29 20 74 68 65  D, or..# (c) the
42b0: 20 66 69 72 73 74 20 63 68 61 6e 67 65 73 65 74   first changeset
42c0: 20 69 6e 20 61 20 6e 65 77 20 4c 4f 44 20 77 68   in a new LOD wh
42d0: 69 63 68 20 77 61 73 20 73 70 61 77 6e 65 64 20  ich was spawned 
42e0: 66 72 6f 6d 0a 09 23 20 20 20 20 20 61 6e 20 65  from..#     an e
42f0: 78 69 73 74 69 6e 67 20 4c 4f 44 2e 0a 0a 09 23  xisting LOD....#
4300: 20 46 6f 72 20 62 6f 74 68 20 28 61 29 20 61 6e   For both (a) an
4310: 64 20 28 62 29 20 77 65 20 68 61 76 65 20 74 6f  d (b) we have to
4320: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 77 6f   create a new wo
4330: 72 6b 73 70 61 63 65 20 66 6f 72 0a 09 23 20 74  rkspace for..# t
4340: 68 65 20 6c 6f 64 2c 20 61 6e 64 20 69 74 20 64  he lod, and it d
4350: 6f 65 73 6e 27 74 20 69 6e 68 65 72 69 74 20 66  oesn't inherit f
4360: 72 6f 6d 20 61 6e 79 74 68 69 6e 67 2e 0a 0a 09  rom anything....
4370: 23 20 4f 6e 65 20 65 78 63 65 70 74 69 6f 6e 20  # One exception 
4380: 66 6f 72 20 28 61 29 2e 20 49 66 20 77 65 20 61  for (a). If we a
4390: 6c 72 65 61 64 79 20 68 61 76 65 20 61 20 3a 76  lready have a :v
43a0: 65 6e 64 6f 72 3a 20 62 72 61 6e 63 68 0a 09 23  endor: branch..#
43b0: 20 74 68 65 6e 20 6d 75 6c 74 69 70 6c 65 20 73   then multiple s
43c0: 79 6d 62 6f 6c 73 20 77 65 72 65 20 75 73 65 64  ymbols were used
43d0: 20 66 6f 72 20 74 68 65 20 76 65 6e 64 6f 72 20   for the vendor 
43e0: 62 72 61 6e 63 68 20 62 79 0a 09 23 20 64 69 66  branch by..# dif
43f0: 66 65 72 65 6e 74 20 66 69 6c 65 73 2e 20 49 6e  ferent files. In
4400: 20 74 68 61 74 20 63 61 73 65 20 74 68 65 20 27   that case the '
4410: 6e 65 77 27 20 62 72 61 6e 63 68 20 69 73 20 6d  new' branch is m
4420: 61 64 65 20 61 6e 0a 09 23 20 61 6c 69 61 73 20  ade an..# alias 
4430: 6f 66 20 74 68 65 20 3a 76 65 6e 64 6f 72 3a 2c  of the :vendor:,
4440: 20 65 66 66 65 63 74 69 76 65 6c 79 20 6d 65 72   effectively mer
4450: 67 69 6e 67 20 74 68 65 20 73 79 6d 62 6f 6c 73  ging the symbols
4460: 0a 09 23 20 74 6f 67 65 74 68 65 72 2e 0a 0a 09  ..# together....
4470: 23 20 4e 6f 74 65 20 74 68 61 74 20 63 61 73 65  # Note that case
4480: 20 28 62 29 20 6d 61 79 20 6e 65 76 65 72 20 6f   (b) may never o
4490: 63 63 75 72 2e 20 53 65 65 20 74 68 65 20 76 61  ccur. See the va
44a0: 72 69 61 62 6c 65 0a 09 23 20 27 6c 61 73 74 64  riable..# 'lastd
44b0: 65 66 61 75 6c 74 6f 6e 74 72 75 6e 6b 27 20 69  efaultontrunk' i
44c0: 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 28 6d 65  n the caller (me
44d0: 74 68 6f 64 20 70 75 73 68 74 6f 29 2e 20 54 68  thod pushto). Th
44e0: 69 73 0a 09 23 20 66 6c 61 67 20 63 61 6e 20 74  is..# flag can t
44f0: 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 6f 66  he generation of
4500: 20 74 68 65 20 77 6f 72 6b 73 70 61 63 65 20 66   the workspace f
4510: 6f 72 20 74 68 65 20 3a 74 72 75 6e 6b 3a 20 4c  or the :trunk: L
4520: 4f 44 0a 09 23 20 61 73 20 77 65 6c 6c 2c 20 6d  OD..# as well, m
4530: 61 6b 69 6e 67 20 69 74 20 69 6e 68 65 72 69 74  aking it inherit
4540: 20 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68   the state of th
4550: 65 20 6c 61 73 74 0a 09 23 20 74 72 75 6e 6b 2d  e last..# trunk-
4560: 63 68 61 6e 67 65 73 65 74 20 6f 6e 20 74 68 65  changeset on the
4570: 20 76 65 6e 64 6f 72 2d 62 72 61 6e 63 68 2e 0a   vendor-branch..
4580: 0a 09 69 66 20 7b 24 69 73 64 65 66 61 75 6c 74  ..if {$isdefault
4590: 7d 20 7b 0a 09 20 20 20 20 69 66 20 7b 21 5b 24  } {..    if {![$
45a0: 72 73 74 61 74 65 20 68 61 73 20 22 3a 76 65 6e  rstate has ":ven
45b0: 64 6f 72 3a 22 5d 7d 20 7b 0a 09 09 23 20 43 72  dor:"]} {...# Cr
45c0: 65 61 74 65 20 74 68 65 20 76 65 6e 64 6f 72 20  eate the vendor 
45d0: 62 72 61 6e 63 68 20 69 66 20 6e 6f 74 20 70 72  branch if not pr
45e0: 65 73 65 6e 74 20 61 6c 72 65 61 64 79 2e 0a 09  esent already...
45f0: 09 24 72 73 74 61 74 65 20 6e 65 77 20 3a 76 65  .$rstate new :ve
4600: 6e 64 6f 72 3a 0a 09 20 20 20 20 7d 0a 09 20 20  ndor:..    }..  
4610: 20 20 23 20 4d 65 72 67 65 20 74 68 65 20 6e 65    # Merge the ne
4620: 77 20 73 79 6d 62 6f 6c 20 74 6f 20 74 68 65 20  w symbol to the 
4630: 76 65 6e 64 6f 72 20 62 72 61 6e 63 68 0a 09 20  vendor branch.. 
4640: 20 20 20 24 72 73 74 61 74 65 20 64 75 70 20 24     $rstate dup $
4650: 6c 6f 64 6e 61 6d 65 20 3c 2d 2d 20 3a 76 65 6e  lodname <-- :ven
4660: 64 6f 72 3a 0a 09 20 20 20 20 72 65 74 75 72 6e  dor:..    return
4670: 20 5b 24 72 73 74 61 74 65 20 67 65 74 20 24 6c   [$rstate get $l
4680: 6f 64 6e 61 6d 65 5d 0a 09 7d 0a 0a 09 69 66 20  odname]..}...if 
4690: 7b 24 6c 6f 64 6e 61 6d 65 20 65 71 20 22 3a 74  {$lodname eq ":t
46a0: 72 75 6e 6b 3a 22 7d 20 7b 0a 09 20 20 20 20 72  runk:"} {..    r
46b0: 65 74 75 72 6e 20 5b 24 72 73 74 61 74 65 20 6e  eturn [$rstate n
46c0: 65 77 20 24 6c 6f 64 6e 61 6d 65 5d 0a 09 7d 0a  ew $lodname]..}.
46d0: 0a 09 23 20 43 61 73 65 20 28 63 29 2e 20 57 65  ..# Case (c). We
46e0: 20 66 69 6e 64 20 74 68 65 20 70 61 72 65 6e 74   find the parent
46f0: 20 4c 4f 44 20 6f 66 20 6f 75 72 20 4c 4f 44 20   LOD of our LOD 
4700: 61 6e 64 20 6c 65 74 20 74 68 65 20 6e 65 77 0a  and let the new.
4710: 09 23 20 77 6f 72 6b 73 70 61 63 65 20 69 6e 68  .# workspace inh
4720: 65 72 69 74 20 66 72 6f 6d 20 74 68 65 20 70 61  erit from the pa
4730: 72 65 6e 74 27 73 20 77 6f 72 6b 73 70 61 63 65  rent's workspace
4740: 2e 0a 0a 09 73 65 74 20 70 6c 6f 64 6e 61 6d 65  ....set plodname
4750: 20 5b 5b 5b 24 70 72 6f 6a 65 63 74 20 67 65 74   [[[$project get
4760: 73 79 6d 62 6f 6c 20 24 6c 6f 64 6e 61 6d 65 5d  symbol $lodname]
4770: 20 70 61 72 65 6e 74 5d 20 6e 61 6d 65 5d 0a 0a   parent] name]..
4780: 09 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73 65  .log write 8 cse
4790: 74 73 20 7b 70 4c 4f 44 20 20 20 27 24 70 6c 6f  ts {pLOD   '$plo
47a0: 64 6e 61 6d 65 27 7d 0a 0a 09 69 66 20 7b 5b 24  dname'}...if {[$
47b0: 72 73 74 61 74 65 20 68 61 73 20 24 70 6c 6f 64  rstate has $plod
47c0: 6e 61 6d 65 5d 7d 20 7b 0a 09 20 20 20 20 72 65  name]} {..    re
47d0: 74 75 72 6e 20 5b 24 72 73 74 61 74 65 20 6e 65  turn [$rstate ne
47e0: 77 20 24 6c 6f 64 6e 61 6d 65 20 24 70 6c 6f 64  w $lodname $plod
47f0: 6e 61 6d 65 5d 0a 09 7d 0a 0a 09 66 6f 72 65 61  name]..}...forea
4800: 63 68 20 6b 20 5b 6c 73 6f 72 74 20 5b 24 72 73  ch k [lsort [$rs
4810: 74 61 74 65 20 6e 61 6d 65 73 5d 5d 20 7b 0a 09  tate names]] {..
4820: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 38 20      log write 8 
4830: 63 73 65 74 73 20 7b 20 20 20 20 24 6b 20 3d 20  csets {    $k = 
4840: 5b 5b 24 72 73 74 61 74 65 20 67 65 74 20 24 6b  [[$rstate get $k
4850: 5d 20 67 65 74 69 64 5d 7d 0a 09 7d 0a 0a 09 74  ] getid]}..}...t
4860: 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20  rouble internal 
4870: 7b 55 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72  {Unable to deter
4880: 6d 69 6e 65 20 63 68 61 6e 67 65 73 65 74 20 70  mine changeset p
4890: 61 72 65 6e 74 7d 0a 09 72 65 74 75 72 6e 0a 20  arent}..return. 
48a0: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 47     }..    proc G
48b0: 65 74 69 73 64 65 66 61 75 6c 74 20 7b 72 65 76  etisdefault {rev
48c0: 69 73 69 6f 6e 73 7d 20 7b 0a 09 73 65 74 20 74  isions} {..set t
48d0: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72  heset ('[join $r
48e0: 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27  evisions {','}]'
48f0: 29 0a 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74  )...struct::list
4900: 20 61 73 73 69 67 6e 20 5b 73 74 61 74 65 20 72   assign [state r
4910: 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d  un [subst -nocom
4920: 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61  mands -nobacksla
4930: 73 68 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45  shes {..    SELE
4940: 43 54 20 52 2e 69 73 64 65 66 61 75 6c 74 2c 20  CT R.isdefault, 
4950: 52 2e 64 62 63 68 69 6c 64 0a 09 20 20 20 20 46  R.dbchild..    F
4960: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52  ROM   revision R
4970: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72  ..    WHERE  R.r
4980: 69 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 2d  id IN $theset  -
4990: 2d 20 41 6c 6c 20 73 70 65 63 69 66 69 65 64 20  - All specified 
49a0: 72 65 76 69 73 69 6f 6e 73 0a 09 20 20 20 20 4c  revisions..    L
49b0: 49 4d 49 54 20 31 0a 09 7d 5d 5d 20 64 65 66 20  IMIT 1..}]] def 
49c0: 6c 61 73 74 0a 0a 09 23 20 54 4f 44 4f 2f 43 48  last...# TODO/CH
49d0: 45 43 4b 3a 20 6c 6f 6f 6b 20 66 6f 72 20 63 68  ECK: look for ch
49e0: 61 6e 67 65 73 65 74 73 20 77 68 65 72 65 20 69  angesets where i
49f0: 73 64 65 66 61 75 6c 74 2f 64 62 63 68 69 6c 64  sdefault/dbchild
4a00: 20 69 73 0a 09 23 20 61 6d 62 69 67 6f 75 73 2e   is..# ambigous.
4a10: 0a 0a 09 72 65 74 75 72 6e 20 5b 6c 69 73 74 20  ...return [list 
4a20: 24 64 65 66 20 5b 65 78 70 72 20 7b 24 6c 61 73  $def [expr {$las
4a30: 74 20 6e 65 20 22 22 7d 5d 5d 0a 20 20 20 20 7d  t ne ""}]].    }
4a40: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ..    typemethod
4a50: 20 73 70 6c 69 74 20 7b 63 73 65 74 20 61 72 67   split {cset arg
4a60: 73 7d 20 7b 0a 09 23 20 41 73 20 70 61 72 74 20  s} {..# As part 
4a70: 6f 66 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20  of the creation 
4a80: 6f 66 20 74 68 65 20 6e 65 77 20 63 68 61 6e 67  of the new chang
4a90: 65 73 65 74 73 20 73 70 65 63 69 66 69 65 64 20  esets specified 
4aa0: 69 6e 0a 09 23 20 41 52 47 53 20 61 73 20 73 65  in..# ARGS as se
4ab0: 74 73 20 6f 66 20 69 74 65 6d 73 2c 20 61 6c 6c  ts of items, all
4ac0: 20 73 75 62 73 65 74 73 20 6f 66 20 43 53 45 54   subsets of CSET
4ad0: 27 73 20 69 74 65 6d 20 73 65 74 2c 20 43 53 45  's item set, CSE
4ae0: 54 0a 09 23 20 77 69 6c 6c 20 62 65 20 64 72 6f  T..# will be dro
4af0: 70 70 65 64 20 66 72 6f 6d 20 61 6c 6c 20 64 61  pped from all da
4b00: 74 61 62 61 73 65 73 2c 20 69 6e 20 61 6e 64 20  tabases, in and 
4b10: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2c 0a 09  out of memory,..
4b20: 23 20 61 6e 64 20 74 68 65 6e 20 64 65 73 74 72  # and then destr
4b30: 6f 79 65 64 2e 0a 09 23 0a 09 23 20 4e 6f 74 65  oyed...#..# Note
4b40: 3a 20 54 68 65 20 69 74 65 6d 20 6c 69 73 74 73  : The item lists
4b50: 20 66 6f 75 6e 64 20 69 6e 20 61 72 67 73 20 61   found in args a
4b60: 72 65 20 74 61 67 67 65 64 20 69 74 65 6d 73 2e  re tagged items.
4b70: 20 54 68 65 79 0a 09 23 20 68 61 76 65 20 74 6f   They..# have to
4b80: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 74   have the same t
4b90: 79 70 65 20 61 73 20 74 68 65 20 63 68 61 6e 67  ype as the chang
4ba0: 65 73 65 74 2c 20 62 65 69 6e 67 20 73 75 62 73  eset, being subs
4bb0: 65 74 73 0a 09 23 20 6f 66 20 69 74 73 20 69 74  ets..# of its it
4bc0: 65 6d 73 2e 20 54 68 69 73 20 69 73 20 63 68 65  ems. This is che
4bd0: 63 6b 65 64 20 69 6e 20 55 6e 74 61 67 31 2e 0a  cked in Untag1..
4be0: 0a 09 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73  ..log write 8 cs
4bf0: 65 74 73 20 7b 4f 4c 44 3a 20 5b 6c 73 6f 72 74  ets {OLD: [lsort
4c00: 20 5b 24 63 73 65 74 20 69 74 65 6d 73 5d 5d 7d   [$cset items]]}
4c10: 0a 09 56 61 6c 69 64 61 74 65 46 72 61 67 6d 65  ..ValidateFragme
4c20: 6e 74 73 20 24 63 73 65 74 20 24 61 72 67 73 0a  nts $cset $args.
4c30: 0a 09 23 20 41 6c 6c 20 63 68 65 63 6b 73 20 70  ..# All checks p
4c40: 61 73 73 2c 20 61 63 74 75 61 6c 6c 79 20 70 65  ass, actually pe
4c50: 72 66 6f 72 6d 20 74 68 65 20 73 70 6c 69 74 2e  rform the split.
4c60: 0a 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20  ...struct::list 
4c70: 61 73 73 69 67 6e 20 5b 24 63 73 65 74 20 64 61  assign [$cset da
4c80: 74 61 5d 20 70 72 6f 6a 65 63 74 20 63 73 74 79  ta] project csty
4c90: 70 65 20 63 73 73 72 63 0a 0a 09 73 65 74 20 70  pe cssrc...set p
4ca0: 72 65 64 65 63 65 73 73 6f 72 73 20 5b 24 63 73  redecessors [$cs
4cb0: 65 74 20 64 72 6f 70 5d 0a 09 24 63 73 65 74 20  et drop]..$cset 
4cc0: 64 65 73 74 72 6f 79 0a 0a 09 73 65 74 20 6e 65  destroy...set ne
4cd0: 77 63 73 65 74 73 20 7b 7d 0a 09 66 6f 72 65 61  wcsets {}..forea
4ce0: 63 68 20 66 72 61 67 6d 65 6e 74 69 74 65 6d 73  ch fragmentitems
4cf0: 20 24 61 72 67 73 20 7b 0a 09 20 20 20 20 6c 6f   $args {..    lo
4d00: 67 20 77 72 69 74 65 20 38 20 63 73 65 74 73 20  g write 8 csets 
4d10: 7b 4d 41 4b 45 3a 20 5b 6c 73 6f 72 74 20 24 66  {MAKE: [lsort $f
4d20: 72 61 67 6d 65 6e 74 69 74 65 6d 73 5d 7d 0a 0a  ragmentitems]}..
4d30: 09 20 20 20 20 73 65 74 20 66 72 61 67 6d 65 6e  .    set fragmen
4d40: 74 20 5b 24 74 79 70 65 20 25 41 55 54 4f 25 20  t [$type %AUTO% 
4d50: 24 70 72 6f 6a 65 63 74 20 24 63 73 74 79 70 65  $project $cstype
4d60: 20 24 63 73 73 72 63 20 5c 0a 09 09 09 20 20 20   $cssrc \....   
4d70: 20 20 20 5b 55 6e 74 61 67 20 24 66 72 61 67 6d     [Untag $fragm
4d80: 65 6e 74 69 74 65 6d 73 20 24 63 73 74 79 70 65  entitems $cstype
4d90: 5d 5d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20  ]]..    lappend 
4da0: 6e 65 77 63 73 65 74 73 20 24 66 72 61 67 6d 65  newcsets $fragme
4db0: 6e 74 0a 0a 09 20 20 20 20 24 66 72 61 67 6d 65  nt...    $fragme
4dc0: 6e 74 20 70 65 72 73 69 73 74 0a 09 20 20 20 20  nt persist..    
4dd0: 24 66 72 61 67 6d 65 6e 74 20 64 65 74 65 72 6d  $fragment determ
4de0: 69 6e 65 73 75 63 63 65 73 73 6f 72 73 0a 09 7d  inesuccessors..}
4df0: 0a 0a 09 23 20 54 68 65 20 70 72 65 64 65 63 65  ...# The predece
4e00: 73 73 6f 72 73 20 68 61 76 65 20 74 6f 20 72 65  ssors have to re
4e10: 63 6f 6d 70 75 74 65 20 74 68 65 69 72 20 73 75  compute their su
4e20: 63 63 65 73 73 6f 72 73 2c 20 69 2e 65 2e 0a 09  ccessors, i.e...
4e30: 23 20 72 65 6d 6f 76 65 20 74 68 65 20 64 72 6f  # remove the dro
4e40: 70 70 65 64 20 63 68 61 6e 67 65 73 65 74 20 61  pped changeset a
4e50: 6e 64 20 70 75 74 20 6f 6e 65 20 6f 66 20 74 68  nd put one of th
4e60: 65 20 66 72 61 67 6d 65 6e 74 73 0a 09 23 20 69  e fragments..# i
4e70: 6e 74 6f 20 69 74 73 20 70 6c 61 63 65 2e 0a 09  nto its place...
4e80: 66 6f 72 65 61 63 68 20 70 20 24 70 72 65 64 65  foreach p $prede
4e90: 63 65 73 73 6f 72 73 20 7b 0a 09 20 20 20 20 24  cessors {..    $
4ea0: 70 20 64 65 74 65 72 6d 69 6e 65 73 75 63 63 65  p determinesucce
4eb0: 73 73 6f 72 73 0a 09 7d 0a 0a 09 72 65 74 75 72  ssors..}...retur
4ec0: 6e 20 24 6e 65 77 63 73 65 74 73 0a 20 20 20 20  n $newcsets.    
4ed0: 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  }..    typemetho
4ee0: 64 20 69 74 65 6d 73 74 72 20 7b 69 74 65 6d 7d  d itemstr {item}
4ef0: 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74   {..struct::list
4f00: 20 61 73 73 69 67 6e 20 24 69 74 65 6d 20 69 74   assign $item it
4f10: 79 70 65 20 69 69 64 0a 09 72 65 74 75 72 6e 20  ype iid..return 
4f20: 5b 24 69 74 79 70 65 20 73 74 72 20 24 69 69 64  [$itype str $iid
4f30: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70  ].    }..    typ
4f40: 65 6d 65 74 68 6f 64 20 73 74 72 6c 69 73 74 20  emethod strlist 
4f50: 7b 63 68 61 6e 67 65 73 65 74 73 7d 20 7b 0a 09  {changesets} {..
4f60: 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 20 5b 73 74  return [join [st
4f70: 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20 24  ruct::list map $
4f80: 63 68 61 6e 67 65 73 65 74 73 20 5b 6d 79 70 72  changesets [mypr
4f90: 6f 63 20 49 44 5d 5d 5d 0a 20 20 20 20 7d 0a 0a  oc ID]]].    }..
4fa0: 20 20 20 20 70 72 6f 63 20 49 44 20 7b 63 73 65      proc ID {cse
4fb0: 74 7d 20 7b 20 24 63 73 65 74 20 73 74 72 20 7d  t} { $cset str }
4fc0: 0a 0a 20 20 20 20 70 72 6f 63 20 55 6e 74 61 67  ..    proc Untag
4fd0: 20 7b 74 61 67 67 65 64 69 74 65 6d 73 20 63 73   {taggeditems cs
4fe0: 74 79 70 65 7d 20 7b 0a 09 72 65 74 75 72 6e 20  type} {..return 
4ff0: 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61  [struct::list ma
5000: 70 20 24 74 61 67 67 65 64 69 74 65 6d 73 20 5b  p $taggeditems [
5010: 6d 79 70 72 6f 63 20 55 6e 74 61 67 31 20 24 63  myproc Untag1 $c
5020: 73 74 79 70 65 5d 5d 0a 20 20 20 20 7d 0a 0a 20  stype]].    }.. 
5030: 20 20 20 70 72 6f 63 20 55 6e 74 61 67 31 20 7b     proc Untag1 {
5040: 63 73 74 79 70 65 20 74 68 65 69 74 65 6d 7d 20  cstype theitem} 
5050: 7b 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20  {..struct::list 
5060: 61 73 73 69 67 6e 20 24 74 68 65 69 74 65 6d 20  assign $theitem 
5070: 74 20 69 0a 09 69 6e 74 65 67 72 69 74 79 20 61  t i..integrity a
5080: 73 73 65 72 74 20 7b 24 63 73 74 79 70 65 20 65  ssert {$cstype e
5090: 71 20 24 74 7d 20 7b 49 74 65 6d 20 24 69 27 73  q $t} {Item $i's
50a0: 20 74 79 70 65 20 69 73 20 27 24 74 27 2c 20 65   type is '$t', e
50b0: 78 70 65 63 74 65 64 20 27 24 63 73 74 79 70 65  xpected '$cstype
50c0: 27 7d 0a 09 72 65 74 75 72 6e 20 24 69 0a 20 20  '}..return $i.  
50d0: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 54 61    }..    proc Ta
50e0: 67 49 74 65 6d 44 69 63 74 20 7b 69 74 65 6d 64  gItemDict {itemd
50f0: 69 63 74 20 63 73 74 79 70 65 7d 20 7b 0a 09 73  ict cstype} {..s
5100: 65 74 20 72 65 73 20 7b 7d 0a 09 66 6f 72 65 61  et res {}..forea
5110: 63 68 20 7b 69 20 76 7d 20 24 69 74 65 6d 64 69  ch {i v} $itemdi
5120: 63 74 20 7b 20 6c 61 70 70 65 6e 64 20 72 65 73  ct { lappend res
5130: 20 5b 6c 69 73 74 20 24 63 73 74 79 70 65 20 24   [list $cstype $
5140: 69 5d 20 24 76 20 7d 0a 09 72 65 74 75 72 6e 20  i] $v }..return 
5150: 24 72 65 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20  $res.    }..    
5160: 70 72 6f 63 20 56 61 6c 69 64 61 74 65 46 72 61  proc ValidateFra
5170: 67 6d 65 6e 74 73 20 7b 63 73 65 74 20 66 72 61  gments {cset fra
5180: 67 6d 65 6e 74 73 7d 20 7b 0a 09 23 20 43 68 65  gments} {..# Che
5190: 63 6b 20 74 68 65 20 76 61 72 69 6f 75 73 20 69  ck the various i
51a0: 6e 74 65 67 72 69 74 79 20 63 6f 6e 73 74 72 61  ntegrity constra
51b0: 69 6e 74 73 20 66 6f 72 20 74 68 65 20 66 72 61  ints for the fra
51c0: 67 6d 65 6e 74 73 0a 09 23 20 73 70 65 63 69 66  gments..# specif
51d0: 79 69 6e 67 20 68 6f 77 20 74 6f 20 73 70 6c 69  ying how to spli
51e0: 74 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 3a  t the changeset:
51f0: 0a 09 23 0a 09 23 20 2a 20 57 65 20 6d 75 73 74  ..#..# * We must
5200: 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72   have two or mor
5210: 65 20 66 72 61 67 6d 65 6e 74 73 2c 20 61 73 20  e fragments, as 
5220: 73 70 6c 69 74 74 69 6e 67 20 61 0a 09 23 20 20  splitting a..#  
5230: 20 63 68 61 6e 67 65 73 65 74 20 69 6e 74 6f 20   changeset into 
5240: 6f 6e 65 20 6d 61 6b 65 73 20 6e 6f 20 73 65 6e  one makes no sen
5250: 73 65 2e 0a 09 23 20 2a 20 4e 6f 20 66 72 61 67  se...# * No frag
5260: 6d 65 6e 74 20 6d 61 79 20 62 65 20 65 6d 70 74  ment may be empt
5270: 79 2e 0a 09 23 20 2a 20 41 6c 6c 20 66 72 61 67  y...# * All frag
5280: 6d 65 6e 74 73 20 68 61 76 65 20 74 6f 20 62 65  ments have to be
5290: 20 74 72 75 65 20 73 75 62 73 65 74 73 20 6f 66   true subsets of
52a0: 20 74 68 65 20 69 74 65 6d 73 20 69 6e 20 74 68   the items in th
52b0: 65 0a 09 23 20 20 20 63 68 61 6e 67 65 73 65 74  e..#   changeset
52c0: 20 74 6f 20 73 70 6c 69 74 2e 20 54 68 65 20 27   to split. The '
52d0: 74 72 75 65 27 20 69 73 20 69 6d 70 6c 69 65 64  true' is implied
52e0: 20 62 65 63 61 75 73 65 20 6e 6f 6e 65 20 61 72   because none ar
52f0: 65 0a 09 23 20 20 20 61 6c 6c 6f 77 65 64 20 74  e..#   allowed t
5300: 6f 20 62 65 20 65 6d 70 74 79 2c 20 73 6f 20 65  o be empty, so e
5310: 61 63 68 20 68 61 73 20 74 6f 20 62 65 20 73 6d  ach has to be sm
5320: 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 0a 09  aller than the..
5330: 23 20 20 20 74 6f 74 61 6c 2e 0a 09 23 20 2a 20  #   total...# * 
5340: 54 68 65 20 75 6e 69 6f 6e 20 6f 66 20 74 68 65  The union of the
5350: 20 66 72 61 67 6d 65 6e 74 73 20 68 61 73 20 74   fragments has t
5360: 6f 20 62 65 20 74 68 65 20 69 74 65 6d 20 73 65  o be the item se
5370: 74 20 6f 66 20 74 68 65 0a 09 23 20 20 20 63 68  t of the..#   ch
5380: 61 6e 67 65 73 65 74 2e 0a 09 23 20 2a 20 54 68  angeset...# * Th
5390: 65 20 66 72 61 67 6d 65 6e 74 20 6d 75 73 74 20  e fragment must 
53a0: 6e 6f 74 20 6f 76 65 72 6c 61 70 2c 20 69 2e 65  not overlap, i.e
53b0: 2e 20 74 68 65 69 72 20 70 61 69 72 77 69 73 65  . their pairwise
53c0: 0a 09 23 20 20 20 69 6e 74 65 72 73 65 63 74 69  ..#   intersecti
53d0: 6f 6e 73 20 68 61 76 65 20 74 6f 20 62 65 20 65  ons have to be e
53e0: 6d 70 74 79 2e 0a 0a 09 73 65 74 20 63 6f 76 65  mpty....set cove
53f0: 72 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 66 72  r {}..foreach fr
5400: 61 67 6d 65 6e 74 69 74 65 6d 73 20 24 66 72 61  agmentitems $fra
5410: 67 6d 65 6e 74 73 20 7b 0a 09 20 20 20 20 6c 6f  gments {..    lo
5420: 67 20 77 72 69 74 65 20 38 20 63 73 65 74 73 20  g write 8 csets 
5430: 7b 4e 45 57 3a 20 5b 6c 73 6f 72 74 20 24 66 72  {NEW: [lsort $fr
5440: 61 67 6d 65 6e 74 69 74 65 6d 73 5d 7d 0a 0a 09  agmentitems]}...
5450: 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73      integrity as
5460: 73 65 72 74 20 7b 0a 09 09 21 5b 73 74 72 75 63  sert {...![struc
5470: 74 3a 3a 73 65 74 20 65 6d 70 74 79 20 24 66 72  t::set empty $fr
5480: 61 67 6d 65 6e 74 69 74 65 6d 73 5d 0a 09 20 20  agmentitems]..  
5490: 20 20 7d 20 7b 63 68 61 6e 67 65 73 65 74 20 66    } {changeset f
54a0: 72 61 67 6d 65 6e 74 20 69 73 20 65 6d 70 74 79  ragment is empty
54b0: 7d 0a 0a 09 20 20 20 20 69 6e 74 65 67 72 69 74  }...    integrit
54c0: 79 20 61 73 73 65 72 74 20 7b 0a 09 09 5b 73 74  y assert {...[st
54d0: 72 75 63 74 3a 3a 73 65 74 20 73 75 62 73 65 74  ruct::set subset
54e0: 6f 66 20 24 66 72 61 67 6d 65 6e 74 69 74 65 6d  of $fragmentitem
54f0: 73 20 5b 24 63 73 65 74 20 69 74 65 6d 73 5d 5d  s [$cset items]]
5500: 0a 09 20 20 20 20 7d 20 7b 63 68 61 6e 67 65 73  ..    } {changes
5510: 65 74 20 66 72 61 67 6d 65 6e 74 20 69 73 20 6e  et fragment is n
5520: 6f 74 20 61 20 73 75 62 73 65 74 7d 0a 09 20 20  ot a subset}..  
5530: 20 20 73 74 72 75 63 74 3a 3a 73 65 74 20 61 64    struct::set ad
5540: 64 20 63 6f 76 65 72 20 24 66 72 61 67 6d 65 6e  d cover $fragmen
5550: 74 69 74 65 6d 73 0a 09 7d 0a 0a 09 69 6e 74 65  titems..}...inte
5560: 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 0a 09  grity assert {..
5570: 20 20 20 20 5b 73 74 72 75 63 74 3a 3a 73 65 74      [struct::set
5580: 20 65 71 75 61 6c 20 24 63 6f 76 65 72 20 5b 24   equal $cover [$
5590: 63 73 65 74 20 69 74 65 6d 73 5d 5d 0a 09 20 7d  cset items]].. }
55a0: 20 7b 54 68 65 20 66 72 61 67 6d 65 6e 74 73 20   {The fragments 
55b0: 64 6f 20 6e 6f 74 20 63 6f 76 65 72 20 74 68 65  do not cover the
55c0: 20 6f 72 69 67 69 6e 61 6c 20 63 68 61 6e 67 65   original change
55d0: 73 65 74 7d 0a 0a 09 73 65 74 20 69 20 31 0a 09  set}...set i 1..
55e0: 66 6f 72 65 61 63 68 20 66 69 61 20 24 66 72 61  foreach fia $fra
55f0: 67 6d 65 6e 74 73 20 7b 0a 09 20 20 20 20 66 6f  gments {..    fo
5600: 72 65 61 63 68 20 66 69 62 20 5b 6c 72 61 6e 67  reach fib [lrang
5610: 65 20 24 66 72 61 67 6d 65 6e 74 73 20 24 69 20  e $fragments $i 
5620: 65 6e 64 5d 20 7b 0a 09 09 69 6e 74 65 67 72 69  end] {...integri
5630: 74 79 20 61 73 73 65 72 74 20 7b 0a 09 09 20 20  ty assert {...  
5640: 20 20 5b 73 74 72 75 63 74 3a 3a 73 65 74 20 65    [struct::set e
5650: 6d 70 74 79 20 5b 73 74 72 75 63 74 3a 3a 73 65  mpty [struct::se
5660: 74 20 69 6e 74 65 72 73 65 63 74 20 24 66 69 61  t intersect $fia
5670: 20 24 66 69 62 5d 5d 0a 09 09 7d 20 7b 54 68 65   $fib]]...} {The
5680: 20 66 72 61 67 6d 65 6e 74 73 20 3c 24 66 69 61   fragments <$fia
5690: 3e 20 61 6e 64 20 3c 24 66 69 62 3e 20 6f 76 65  > and <$fib> ove
56a0: 72 6c 61 70 7d 0a 09 20 20 20 20 7d 0a 09 20 20  rlap}..    }..  
56b0: 20 20 69 6e 63 72 20 69 0a 09 7d 0a 0a 09 72 65    incr i..}...re
56c0: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
56d0: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
56e0: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
56f0: 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 53  #######.    ## S
5700: 74 61 74 65 0a 0a 20 20 20 20 76 61 72 69 61 62  tate..    variab
5710: 6c 65 20 6d 79 69 64 20 20 20 20 20 20 20 20 7b  le myid        {
5720: 7d 20 3b 20 23 20 49 64 20 6f 66 20 74 68 65 20  } ; # Id of the 
5730: 63 73 65 74 20 66 6f 72 20 74 68 65 20 70 65 72  cset for the per
5740: 73 69 73 74 65 6e 74 0a 09 09 09 20 20 20 20 20  sistent....     
5750: 20 23 20 73 74 61 74 65 2e 0a 20 20 20 20 76 61   # state..    va
5760: 72 69 61 62 6c 65 20 6d 79 70 72 6f 6a 65 63 74  riable myproject
5770: 20 20 20 7b 7d 20 3b 20 23 20 52 65 66 65 72 65     {} ; # Refere
5780: 6e 63 65 20 6f 66 20 74 68 65 20 70 72 6f 6a 65  nce of the proje
5790: 63 74 20 6f 62 6a 65 63 74 20 74 68 65 0a 09 09  ct object the...
57a0: 09 20 20 20 20 20 20 23 20 63 68 61 6e 67 65 73  .      # changes
57b0: 65 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 20  et belongs to.. 
57c0: 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 74 79     variable myty
57d0: 70 65 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 57  pe      {} ; # W
57e0: 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 73 65  hat the changese
57f0: 74 20 69 73 20 62 61 73 65 64 20 6f 6e 0a 09 09  t is based on...
5800: 09 20 20 20 20 20 20 23 20 28 72 65 76 69 73 69  .      # (revisi
5810: 6f 6e 73 2c 20 74 61 67 73 2c 20 6f 72 20 62 72  ons, tags, or br
5820: 61 6e 63 68 65 73 29 2e 0a 09 09 09 20 20 20 20  anches).....    
5830: 20 20 23 20 56 61 6c 75 65 73 3a 20 53 65 65 20    # Values: See 
5840: 6d 79 63 73 74 79 70 65 2e 20 4e 6f 74 65 20 74  mycstype. Note t
5850: 68 61 74 20 77 65 0a 09 09 09 20 20 20 20 20 20  hat we....      
5860: 23 20 68 61 76 65 20 74 6f 20 6b 65 65 70 20 74  # have to keep t
5870: 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
5880: 68 65 6c 70 65 72 0a 09 09 09 20 20 20 20 20 20  helper....      
5890: 23 20 73 69 6e 67 6c 65 74 6f 6e 73 20 69 6e 20  # singletons in 
58a0: 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 63 6f  sync with the co
58b0: 6e 74 65 6e 74 73 0a 09 09 09 20 20 20 20 20 20  ntents....      
58c0: 23 20 6f 66 20 73 74 61 74 65 20 74 61 62 6c 65  # of state table
58d0: 20 27 63 73 74 79 70 65 27 2c 20 61 6e 64 20 76   'cstype', and v
58e0: 61 72 69 6f 75 73 0a 09 09 09 20 20 20 20 20 20  arious....      
58f0: 23 20 6f 74 68 65 72 20 70 6c 61 63 65 73 20 75  # other places u
5900: 73 69 6e 67 20 74 68 65 6d 20 68 61 72 64 77 69  sing them hardwi
5910: 72 65 64 2e 0a 20 20 20 20 76 61 72 69 61 62 6c  red..    variabl
5920: 65 20 6d 79 74 79 70 65 6f 62 6a 20 20 20 7b 7d  e mytypeobj   {}
5930: 20 3b 20 23 20 52 65 66 65 72 65 6e 63 65 20 74   ; # Reference t
5940: 6f 20 74 68 65 20 63 6f 6e 74 61 69 6e 65 72 20  o the container 
5950: 66 6f 72 20 74 68 65 0a 09 09 09 20 20 20 20 20  for the....     
5960: 20 23 20 74 79 70 65 20 64 65 70 65 6e 64 65 6e   # type dependen
5970: 74 20 63 6f 64 65 2e 20 44 65 72 69 76 65 64 20  t code. Derived 
5980: 66 72 6f 6d 0a 09 09 09 20 20 20 20 20 20 23 20  from....      # 
5990: 6d 79 74 79 70 65 2e 0a 20 20 20 20 76 61 72 69  mytype..    vari
59a0: 61 62 6c 65 20 6d 79 73 72 63 69 64 20 20 20 20  able mysrcid    
59b0: 20 7b 7d 20 3b 20 23 20 49 64 20 6f 66 20 74 68   {} ; # Id of th
59c0: 65 20 6d 65 74 61 64 61 74 61 20 6f 72 20 73 79  e metadata or sy
59d0: 6d 62 6f 6c 20 74 68 65 20 63 73 65 74 0a 09 09  mbol the cset...
59e0: 09 20 20 20 20 20 20 23 20 69 73 20 62 61 73 65  .      # is base
59f0: 64 20 6f 6e 2e 0a 20 20 20 20 76 61 72 69 61 62  d on..    variab
5a00: 6c 65 20 6d 79 69 74 65 6d 73 20 20 20 20 20 7b  le myitems     {
5a10: 7d 20 3b 20 23 20 4c 69 73 74 20 6f 66 20 74 68  } ; # List of th
5a20: 65 20 66 69 6c 65 20 6c 65 76 65 6c 20 72 65 76  e file level rev
5a30: 69 73 69 6f 6e 73 2c 0a 09 09 09 20 20 20 20 20  isions,....     
5a40: 20 23 20 74 61 67 73 2c 20 6f 72 20 62 72 61 6e   # tags, or bran
5a50: 63 68 65 73 20 69 6e 20 74 68 65 20 63 73 65 74  ches in the cset
5a60: 2c 20 61 73 0a 09 09 09 20 20 20 20 20 20 23 20  , as....      # 
5a70: 69 64 73 2e 20 4e 6f 74 20 74 61 67 67 65 64 2e  ids. Not tagged.
5a80: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79  .    variable my
5a90: 74 69 74 65 6d 73 20 20 20 20 7b 7d 20 3b 20 23  titems    {} ; #
5aa0: 20 41 73 20 6d 79 69 74 65 6d 73 2c 20 74 68 65   As myitems, the
5ab0: 20 74 61 67 67 65 64 20 66 6f 72 6d 2e 0a 20 20   tagged form..  
5ac0: 20 20 76 61 72 69 61 62 6c 65 20 6d 79 70 6f 73    variable mypos
5ad0: 20 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 43 6f         {} ; # Co
5ae0: 6d 6d 69 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  mmit position of
5af0: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20   the changeset, 
5b00: 69 66 0a 09 09 09 20 20 20 20 20 20 23 20 6b 6e  if....      # kn
5b10: 6f 77 6e 2e 0a 0a 20 20 20 20 23 20 23 20 23 23  own...    # # ##
5b20: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23   ### ##### #####
5b30: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
5b40: 23 0a 20 20 20 20 23 23 20 49 6e 74 65 72 6e 61  #.    ## Interna
5b50: 6c 20 6d 65 74 68 6f 64 73 0a 0a 20 20 20 20 74  l methods..    t
5b60: 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 6f  ypevariable myco
5b70: 75 6e 74 65 72 20 20 20 20 20 20 20 20 30 20 3b  unter        0 ;
5b80: 20 23 20 49 64 20 63 6f 75 6e 74 65 72 20 66 6f   # Id counter fo
5b90: 72 20 63 73 65 74 73 2e 20 4c 61 73 74 20 69 64  r csets. Last id
5ba0: 0a 09 09 09 09 20 20 20 20 20 20 23 20 75 73 65  .....      # use
5bb0: 64 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69 61  d..    typevaria
5bc0: 62 6c 65 20 6d 79 63 73 74 79 70 65 20 2d 61 72  ble mycstype -ar
5bd0: 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 63  ray {} ; # Map c
5be0: 73 74 79 70 65 73 20 28 6e 61 6d 65 73 29 20 74  stypes (names) t
5bf0: 6f 20 70 65 72 73 69 73 74 65 6e 74 0a 09 09 09  o persistent....
5c00: 09 20 20 20 20 20 20 23 20 69 64 73 2e 20 4e 6f  .      # ids. No
5c10: 74 65 20 74 68 61 74 20 77 65 20 68 61 76 65 20  te that we have 
5c20: 74 6f 20 6b 65 65 70 0a 09 09 09 09 20 20 20 20  to keep.....    
5c30: 20 20 23 20 74 68 65 20 6e 61 6d 65 73 20 69 6e    # the names in
5c40: 20 74 68 65 20 74 61 62 6c 65 20 27 63 73 74 79   the table 'csty
5c50: 70 65 27 0a 09 09 09 09 20 20 20 20 20 20 23 20  pe'.....      # 
5c60: 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65  in sync with the
5c70: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 0a 09 09   names of the...
5c80: 09 09 20 20 20 20 20 20 23 20 68 65 6c 70 65 72  ..      # helper
5c90: 20 73 69 6e 67 6c 65 74 6f 6e 73 2e 0a 0a 20 20   singletons...  
5ca0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 6e 6f    typemethod ino
5cb0: 72 64 65 72 20 7b 70 72 6f 6a 65 63 74 69 64 7d  rder {projectid}
5cc0: 20 7b 0a 09 23 20 52 65 74 75 72 6e 20 61 6c 6c   {..# Return all
5cd0: 20 72 65 76 69 73 69 6f 6e 20 63 68 61 6e 67 65   revision change
5ce0: 73 65 74 73 20 66 6f 72 20 74 68 65 20 73 70 65  sets for the spe
5cf0: 63 69 66 69 65 64 20 70 72 6f 6a 65 63 74 2c 20  cified project, 
5d00: 69 6e 0a 09 23 20 74 68 65 20 6f 72 64 65 72 20  in..# the order 
5d10: 67 69 76 65 6e 20 74 6f 20 74 68 65 6d 20 62 79  given to them by
5d20: 20 74 68 65 20 73 6f 72 74 20 70 61 73 73 65 73   the sort passes
5d30: 2e 20 42 6f 74 68 20 74 68 65 0a 09 23 20 66 69  . Both the..# fi
5d40: 6c 74 65 72 69 6e 67 20 62 79 20 70 72 6f 6a 65  ltering by proje
5d50: 63 74 20 61 6e 64 20 73 6f 72 74 69 6e 67 20 6d  ct and sorting m
5d60: 61 6b 65 20 75 73 65 20 6f 66 20 27 70 72 6f 6a  ake use of 'proj
5d70: 65 63 74 3a 3a 72 65 76 0a 09 23 20 72 65 76 27  ect::rev..# rev'
5d80: 20 69 6d 70 6f 73 73 69 62 6c 65 2e 0a 0a 09 73   impossible....s
5d90: 65 74 20 72 65 73 20 7b 7d 0a 09 66 6f 72 65 61  et res {}..forea
5da0: 63 68 20 7b 63 69 64 20 63 64 61 74 65 7d 20 5b  ch {cid cdate} [
5db0: 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20  state run {..   
5dc0: 20 53 45 4c 45 43 54 20 43 2e 63 69 64 2c 20 54   SELECT C.cid, T
5dd0: 2e 64 61 74 65 0a 09 20 20 20 20 46 52 4f 4d 20  .date..    FROM 
5de0: 20 20 63 68 61 6e 67 65 73 65 74 20 43 2c 20 63    changeset C, c
5df0: 73 74 69 6d 65 73 74 61 6d 70 20 54 0a 09 20 20  stimestamp T..  
5e00: 20 20 57 48 45 52 45 20 20 43 2e 74 79 70 65 20    WHERE  C.type 
5e10: 3d 20 30 20 20 20 20 20 20 20 20 20 20 2d 2d 20  = 0          -- 
5e20: 6c 69 6d 69 74 20 74 6f 20 72 65 76 69 73 69 6f  limit to revisio
5e30: 6e 20 63 68 61 6e 67 65 73 65 74 73 0a 09 20 20  n changesets..  
5e40: 20 20 41 4e 44 20 20 20 20 43 2e 70 69 64 20 20    AND    C.pid  
5e50: 3d 20 24 70 72 6f 6a 65 63 74 69 64 20 2d 2d 20  = $projectid -- 
5e60: 6c 69 6d 69 74 20 74 6f 20 63 68 61 6e 67 65 73  limit to changes
5e70: 65 74 73 20 69 6e 20 70 72 6f 6a 65 63 74 0a 09  ets in project..
5e80: 20 20 20 20 41 4e 44 20 20 20 20 54 2e 63 69 64      AND    T.cid
5e90: 20 20 3d 20 43 2e 63 69 64 20 20 20 20 20 20 2d    = C.cid      -
5ea0: 2d 20 67 65 74 20 6f 72 64 65 72 69 6e 67 20 69  - get ordering i
5eb0: 6e 66 6f 72 6d 61 74 69 6f 6e 0a 09 20 20 20 20  nformation..    
5ec0: 4f 52 44 45 52 20 42 59 20 54 2e 64 61 74 65 20  ORDER BY T.date 
5ed0: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 6f             -- so
5ee0: 72 74 20 69 6e 74 6f 20 63 6f 6d 6d 69 74 20 6f  rt into commit o
5ef0: 72 64 65 72 0a 09 7d 5d 20 7b 0a 09 20 20 20 20  rder..}] {..    
5f00: 6c 61 70 70 65 6e 64 20 72 65 73 20 24 6d 79 69  lappend res $myi
5f10: 64 6d 61 70 28 24 63 69 64 29 20 24 63 64 61 74  dmap($cid) $cdat
5f20: 65 0a 09 7d 0a 09 72 65 74 75 72 6e 20 24 72 65  e..}..return $re
5f30: 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70  s.    }..    typ
5f40: 65 6d 65 74 68 6f 64 20 67 65 74 63 73 74 79 70  emethod getcstyp
5f50: 65 73 20 7b 7d 20 7b 0a 09 66 6f 72 65 61 63 68  es {} {..foreach
5f60: 20 7b 74 69 64 20 6e 61 6d 65 7d 20 5b 73 74 61   {tid name} [sta
5f70: 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 53 45  te run {..    SE
5f80: 4c 45 43 54 20 74 69 64 2c 20 6e 61 6d 65 20 46  LECT tid, name F
5f90: 52 4f 4d 20 63 73 74 79 70 65 3b 0a 09 7d 5d 20  ROM cstype;..}] 
5fa0: 7b 20 73 65 74 20 6d 79 63 73 74 79 70 65 28 24  { set mycstype($
5fb0: 6e 61 6d 65 29 20 24 74 69 64 20 7d 0a 09 72 65  name) $tid }..re
5fc0: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
5fd0: 74 79 70 65 6d 65 74 68 6f 64 20 6c 6f 61 64 20  typemethod load 
5fe0: 7b 72 65 70 6f 73 69 74 6f 72 79 7d 20 7b 0a 09  {repository} {..
5ff0: 73 65 74 20 6e 20 30 0a 09 6c 6f 67 20 77 72 69  set n 0..log wri
6000: 74 65 20 32 20 63 73 65 74 73 20 7b 4c 6f 61 64  te 2 csets {Load
6010: 69 6e 67 20 74 68 65 20 63 68 61 6e 67 65 73 65  ing the changese
6020: 74 73 7d 0a 09 66 6f 72 65 61 63 68 20 7b 69 64  ts}..foreach {id
6030: 20 70 69 64 20 63 73 74 79 70 65 20 73 72 63 69   pid cstype srci
6040: 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a  d} [state run {.
6050: 09 20 20 20 20 53 45 4c 45 43 54 20 43 2e 63 69  .    SELECT C.ci
6060: 64 2c 20 43 2e 70 69 64 2c 20 43 53 2e 6e 61 6d  d, C.pid, CS.nam
6070: 65 2c 20 43 2e 73 72 63 0a 09 20 20 20 20 46 52  e, C.src..    FR
6080: 4f 4d 20 20 20 63 68 61 6e 67 65 73 65 74 20 43  OM   changeset C
6090: 2c 20 63 73 74 79 70 65 20 43 53 0a 09 20 20 20  , cstype CS..   
60a0: 20 57 48 45 52 45 20 20 43 2e 74 79 70 65 20 3d   WHERE  C.type =
60b0: 20 43 53 2e 74 69 64 0a 09 20 20 20 20 4f 52 44   CS.tid..    ORD
60c0: 45 52 20 42 59 20 43 2e 63 69 64 0a 09 7d 5d 20  ER BY C.cid..}] 
60d0: 7b 0a 09 20 20 20 20 6c 6f 67 20 70 72 6f 67 72  {..    log progr
60e0: 65 73 73 20 32 20 63 73 65 74 73 20 24 6e 20 7b  ess 2 csets $n {
60f0: 7d 0a 09 20 20 20 20 73 65 74 20 72 20 5b 24 74  }..    set r [$t
6100: 79 70 65 20 25 41 55 54 4f 25 20 5b 24 72 65 70  ype %AUTO% [$rep
6110: 6f 73 69 74 6f 72 79 20 70 72 6f 6a 65 63 74 6f  ository projecto
6120: 66 20 24 70 69 64 5d 20 24 63 73 74 79 70 65 20  f $pid] $cstype 
6130: 24 73 72 63 69 64 20 5b 73 74 61 74 65 20 72 75  $srcid [state ru
6140: 6e 20 7b 0a 09 09 53 45 4c 45 43 54 20 43 2e 69  n {...SELECT C.i
6150: 69 64 0a 09 09 46 52 4f 4d 20 20 20 63 73 69 74  id...FROM   csit
6160: 65 6d 20 43 0a 09 09 57 48 45 52 45 20 20 43 2e  em C...WHERE  C.
6170: 63 69 64 20 3d 20 24 69 64 0a 09 09 4f 52 44 45  cid = $id...ORDE
6180: 52 20 42 59 20 43 2e 70 6f 73 0a 09 20 20 20 20  R BY C.pos..    
6190: 7d 5d 20 24 69 64 5d 0a 09 20 20 20 20 69 6e 63  }] $id]..    inc
61a0: 72 20 6e 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20  r n..}..return. 
61b0: 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65     }..    typeme
61c0: 74 68 6f 64 20 6c 6f 61 64 63 6f 75 6e 74 65 72  thod loadcounter
61d0: 20 7b 7d 20 7b 0a 09 23 20 49 6e 69 74 69 61 6c   {} {..# Initial
61e0: 69 7a 65 20 74 68 65 20 63 6f 75 6e 74 65 72 20  ize the counter 
61f0: 66 72 6f 6d 20 74 68 65 20 73 74 61 74 65 0a 09  from the state..
6200: 6c 6f 67 20 77 72 69 74 65 20 32 20 63 73 65 74  log write 2 cset
6210: 73 20 7b 4c 6f 61 64 69 6e 67 20 63 68 61 6e 67  s {Loading chang
6220: 65 73 65 74 20 63 6f 75 6e 74 65 72 7d 0a 09 73  eset counter}..s
6230: 65 74 20 6d 79 63 6f 75 6e 74 65 72 20 5b 73 74  et mycounter [st
6240: 61 74 65 20 6f 6e 65 20 7b 20 53 45 4c 45 43 54  ate one { SELECT
6250: 20 4d 41 58 28 63 69 64 29 20 46 52 4f 4d 20 63   MAX(cid) FROM c
6260: 68 61 6e 67 65 73 65 74 20 7d 5d 0a 09 72 65 74  hangeset }]..ret
6270: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  urn.    }..    t
6280: 79 70 65 6d 65 74 68 6f 64 20 6e 75 6d 20 7b 7d  ypemethod num {}
6290: 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 63 6f 75   { return $mycou
62a0: 6e 74 65 72 20 7d 0a 0a 20 20 20 20 70 72 6f 63  nter }..    proc
62b0: 20 49 6e 69 74 69 61 6c 69 7a 65 42 72 65 61 6b   InitializeBreak
62c0: 53 74 61 74 65 20 7b 72 65 76 69 73 69 6f 6e 73  State {revisions
62d0: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 70 6f 73  } {..upvar 1 pos
62e0: 20 70 6f 73 20 63 72 6f 73 73 20 63 72 6f 73 73   pos cross cross
62f0: 20 72 61 6e 67 65 20 72 61 6e 67 65 20 64 65 70   range range dep
6300: 63 20 64 65 70 63 20 64 65 6c 74 61 20 64 65 6c  c depc delta del
6310: 74 61 20 5c 0a 09 20 20 20 20 64 65 70 65 6e 64  ta \..    depend
6320: 65 6e 63 69 65 73 20 64 65 70 65 6e 64 65 6e 63  encies dependenc
6330: 69 65 73 0a 0a 09 23 20 46 69 72 73 74 20 77 65  ies...# First we
6340: 20 63 72 65 61 74 65 20 61 20 6d 61 70 20 6f 66   create a map of
6350: 20 70 6f 73 69 74 69 6f 6e 73 20 74 6f 20 6d 61   positions to ma
6360: 6b 65 20 69 74 20 65 61 73 69 65 72 20 74 6f 0a  ke it easier to.
6370: 09 23 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65  .# determine whe
6380: 74 68 65 72 20 61 20 64 65 70 65 6e 64 65 6e 63  ther a dependenc
6390: 79 20 63 72 6f 73 73 65 73 20 61 20 70 61 72 74  y crosses a part
63a0: 69 63 75 6c 61 72 20 69 6e 64 65 78 2e 0a 0a 09  icular index....
63b0: 6c 6f 67 20 77 72 69 74 65 20 31 34 20 63 73 65  log write 14 cse
63c0: 74 73 20 7b 49 42 53 3a 20 23 72 65 76 20 5b 6c  ts {IBS: #rev [l
63d0: 6c 65 6e 67 74 68 20 24 72 65 76 69 73 69 6f 6e  length $revision
63e0: 73 5d 7d 0a 09 6c 6f 67 20 77 72 69 74 65 20 31  s]}..log write 1
63f0: 34 20 63 73 65 74 73 20 7b 49 42 53 3a 20 70 6f  4 csets {IBS: po
6400: 73 20 6d 61 70 2c 20 63 72 6f 73 73 20 63 6f 75  s map, cross cou
6410: 6e 74 65 72 7d 0a 0a 09 61 72 72 61 79 20 73 65  nter}...array se
6420: 74 20 70 6f 73 20 20 20 7b 7d 0a 09 61 72 72 61  t pos   {}..arra
6430: 79 20 73 65 74 20 63 72 6f 73 73 20 7b 7d 0a 09  y set cross {}..
6440: 61 72 72 61 79 20 73 65 74 20 64 65 70 63 20 20  array set depc  
6450: 7b 7d 0a 09 73 65 74 20 72 61 6e 67 65 20 20 20  {}..set range   
6460: 20 20 20 20 7b 7d 0a 09 73 65 74 20 6e 20 30 0a      {}..set n 0.
6470: 09 66 6f 72 65 61 63 68 20 72 65 76 20 24 72 65  .foreach rev $re
6480: 76 69 73 69 6f 6e 73 20 7b 0a 09 20 20 20 20 6c  visions {..    l
6490: 61 70 70 65 6e 64 20 72 61 6e 67 65 20 24 6e 0a  append range $n.
64a0: 09 20 20 20 20 73 65 74 20 70 6f 73 28 24 72 65  .    set pos($re
64b0: 76 29 20 24 6e 0a 09 20 20 20 20 73 65 74 20 63  v) $n..    set c
64c0: 72 6f 73 73 28 24 6e 29 20 30 0a 09 20 20 20 20  ross($n) 0..    
64d0: 69 6e 63 72 20 6e 0a 09 7d 0a 0a 09 6c 6f 67 20  incr n..}...log 
64e0: 77 72 69 74 65 20 31 34 20 63 73 65 74 73 20 7b  write 14 csets {
64f0: 49 42 53 3a 20 70 6f 73 2f 5b 61 72 72 61 79 20  IBS: pos/[array 
6500: 73 69 7a 65 20 70 6f 73 5d 2c 20 63 72 6f 73 73  size pos], cross
6510: 2f 5b 61 72 72 61 79 20 73 69 7a 65 20 63 72 6f  /[array size cro
6520: 73 73 5d 7d 0a 0a 09 23 20 53 65 63 6f 6e 64 6c  ss]}...# Secondl
6530: 79 20 77 65 20 63 6f 75 6e 74 20 74 68 65 20 63  y we count the c
6540: 72 6f 73 73 69 6e 67 73 20 70 65 72 20 70 6f 73  rossings per pos
6550: 69 74 69 6f 6e 2c 20 62 79 20 69 74 65 72 61 74  ition, by iterat
6560: 69 6e 67 0a 09 23 20 6f 76 65 72 20 74 68 65 20  ing..# over the 
6570: 72 65 63 6f 72 64 65 64 20 69 6e 74 65 72 6e 61  recorded interna
6580: 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 0a  l dependencies..
6590: 0a 09 23 20 4e 6f 74 65 3a 20 49 66 20 74 68 65  ..# Note: If the
65a0: 20 74 69 6d 65 73 74 61 6d 70 73 20 61 72 65 20   timestamps are 
65b0: 62 61 64 6c 79 20 6f 75 74 20 6f 66 20 6f 72 64  badly out of ord
65c0: 65 72 20 69 74 20 69 73 0a 09 23 20 20 20 20 20  er it is..#     
65d0: 20 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61    possible to ha
65e0: 76 65 20 61 20 62 61 63 6b 77 61 72 64 20 73 75  ve a backward su
65f0: 63 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e  ccessor dependen
6600: 63 79 2c 0a 09 23 20 20 20 20 20 20 20 69 2e 65  cy,..#       i.e
6610: 2e 20 77 69 74 68 20 73 74 61 72 74 20 3e 20 65  . with start > e
6620: 6e 64 2e 20 57 65 20 6d 61 79 20 68 61 76 65 20  nd. We may have 
6630: 74 6f 20 73 77 61 70 20 74 68 65 20 69 6e 64 69  to swap the indi
6640: 63 65 73 0a 09 23 20 20 20 20 20 20 20 74 6f 20  ces..#       to 
6650: 65 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20  ensure that the 
6660: 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72  following loop r
6670: 75 6e 73 20 63 6f 72 72 65 63 74 6c 79 2e 0a 09  uns correctly...
6680: 23 0a 09 23 20 4e 6f 74 65 20 32 3a 20 73 74 61  #..# Note 2: sta
6690: 72 74 20 3d 3d 20 65 6e 64 20 69 73 20 6e 6f 74  rt == end is not
66a0: 20 70 6f 73 73 69 62 6c 65 2e 20 49 74 20 69 6e   possible. It in
66b0: 64 69 63 61 74 65 73 20 61 0a 09 23 20 20 20 20  dicates a..#    
66c0: 20 20 20 20 20 73 65 6c 66 2d 64 65 70 65 6e 64       self-depend
66d0: 65 6e 63 79 20 64 75 65 20 74 6f 20 74 68 65 20  ency due to the 
66e0: 75 6e 69 71 75 65 6e 65 73 73 20 6f 66 20 70 6f  uniqueness of po
66f0: 73 69 74 69 6f 6e 73 2c 0a 09 23 20 20 20 20 20  sitions,..#     
6700: 20 20 20 20 61 6e 64 20 74 68 61 74 20 69 73 20      and that is 
6710: 73 6f 6d 65 74 68 69 6e 67 20 77 65 20 68 61 76  something we hav
6720: 65 20 72 75 6c 65 64 20 6f 75 74 20 61 6c 72 65  e ruled out alre
6730: 61 64 79 2c 20 73 65 65 0a 09 23 20 20 20 20 20  ady, see..#     
6740: 20 20 20 20 27 72 65 76 20 69 6e 74 65 72 6e 61      'rev interna
6750: 6c 73 75 63 63 65 73 73 6f 72 73 27 2e 0a 0a 09  lsuccessors'....
6760: 6c 6f 67 20 77 72 69 74 65 20 31 34 20 63 73 65  log write 14 cse
6770: 74 73 20 7b 49 42 53 3a 20 63 72 6f 73 73 20 63  ts {IBS: cross c
6780: 6f 75 6e 74 65 72 20 66 69 6c 6c 69 6e 67 2c 20  ounter filling, 
6790: 70 6f 73 2f 63 72 6f 73 73 20 6d 61 70 7d 0a 0a  pos/cross map}..
67a0: 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68  .foreach {rid ch
67b0: 69 6c 64 72 65 6e 7d 20 5b 61 72 72 61 79 20 67  ildren} [array g
67c0: 65 74 20 64 65 70 65 6e 64 65 6e 63 69 65 73 5d  et dependencies]
67d0: 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20   {..    foreach 
67e0: 63 68 69 6c 64 20 24 63 68 69 6c 64 72 65 6e 20  child $children 
67f0: 7b 0a 09 09 73 65 74 20 64 6b 65 79 20 20 20 20  {...set dkey    
6800: 5b 6c 69 73 74 20 24 72 69 64 20 24 63 68 69 6c  [list $rid $chil
6810: 64 5d 0a 09 09 73 65 74 20 73 74 61 72 74 20 20  d]...set start  
6820: 20 24 70 6f 73 28 24 72 69 64 29 0a 09 09 73 65   $pos($rid)...se
6830: 74 20 65 6e 64 20 20 20 20 20 24 70 6f 73 28 24  t end     $pos($
6840: 63 68 69 6c 64 29 0a 09 09 73 65 74 20 63 72 6f  child)...set cro
6850: 73 73 65 73 20 7b 7d 0a 0a 09 09 69 66 20 7b 24  sses {}....if {$
6860: 73 74 61 72 74 20 3e 20 24 65 6e 64 7d 20 7b 0a  start > $end} {.
6870: 09 09 20 20 20 20 77 68 69 6c 65 20 7b 24 65 6e  ..    while {$en
6880: 64 20 3c 20 24 73 74 61 72 74 7d 20 7b 0a 09 09  d < $start} {...
6890: 09 6c 61 70 70 65 6e 64 20 63 72 6f 73 73 65 73  .lappend crosses
68a0: 20 24 65 6e 64 0a 09 09 09 69 6e 63 72 20 63 72   $end....incr cr
68b0: 6f 73 73 28 24 65 6e 64 29 0a 09 09 09 69 6e 63  oss($end)....inc
68c0: 72 20 65 6e 64 0a 09 09 20 20 20 20 7d 0a 09 09  r end...    }...
68d0: 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 77  } else {...    w
68e0: 68 69 6c 65 20 7b 24 73 74 61 72 74 20 3c 20 24  hile {$start < $
68f0: 65 6e 64 7d 20 7b 0a 09 09 09 6c 61 70 70 65 6e  end} {....lappen
6900: 64 20 63 72 6f 73 73 65 73 20 24 73 74 61 72 74  d crosses $start
6910: 0a 09 09 09 69 6e 63 72 20 63 72 6f 73 73 28 24  ....incr cross($
6920: 73 74 61 72 74 29 0a 09 09 09 69 6e 63 72 20 73  start)....incr s
6930: 74 61 72 74 0a 09 09 20 20 20 20 7d 0a 09 09 7d  tart...    }...}
6940: 0a 09 09 73 65 74 20 64 65 70 63 28 24 64 6b 65  ...set depc($dke
6950: 79 29 20 24 63 72 6f 73 73 65 73 0a 09 20 20 20  y) $crosses..   
6960: 20 7d 0a 09 7d 0a 0a 09 6c 6f 67 20 77 72 69 74   }..}...log writ
6970: 65 20 31 34 20 63 73 65 74 73 20 7b 49 42 53 3a  e 14 csets {IBS:
6980: 20 70 6f 73 2f 5b 61 72 72 61 79 20 73 69 7a 65   pos/[array size
6990: 20 70 6f 73 5d 2c 20 63 72 6f 73 73 2f 5b 61 72   pos], cross/[ar
69a0: 72 61 79 20 73 69 7a 65 20 63 72 6f 73 73 5d 2c  ray size cross],
69b0: 20 64 65 70 63 2f 5b 61 72 72 61 79 20 73 69 7a   depc/[array siz
69c0: 65 20 64 65 70 63 5d 20 28 66 6f 72 20 5b 6c 6c  e depc] (for [ll
69d0: 65 6e 67 74 68 20 24 72 65 76 69 73 69 6f 6e 73  ength $revisions
69e0: 5d 29 7d 0a 09 6c 6f 67 20 77 72 69 74 65 20 31  ])}..log write 1
69f0: 34 20 63 73 65 74 73 20 7b 49 42 53 3a 20 74 69  4 csets {IBS: ti
6a00: 6d 65 73 74 61 6d 70 73 2c 20 64 65 6c 74 61 73  mestamps, deltas
6a10: 7d 0a 0a 09 49 6e 69 74 69 61 6c 69 7a 65 44 65  }...InitializeDe
6a20: 6c 74 61 73 20 24 72 65 76 69 73 69 6f 6e 73 0a  ltas $revisions.
6a30: 0a 09 6c 6f 67 20 77 72 69 74 65 20 31 34 20 63  ..log write 14 c
6a40: 73 65 74 73 20 7b 49 42 53 3a 20 64 65 6c 74 61  sets {IBS: delta
6a50: 20 5b 61 72 72 61 79 20 73 69 7a 65 20 64 65 6c   [array size del
6a60: 74 61 5d 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20  ta]}..return.   
6a70: 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 49 6e 69   }..    proc Ini
6a80: 74 69 61 6c 69 7a 65 44 65 6c 74 61 73 20 7b 72  tializeDeltas {r
6a90: 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76  evisions} {..upv
6aa0: 61 72 20 31 20 64 65 6c 74 61 20 64 65 6c 74 61  ar 1 delta delta
6ab0: 0a 0a 09 23 20 50 75 6c 6c 20 74 68 65 20 74 69  ...# Pull the ti
6ac0: 6d 65 73 74 61 6d 70 73 20 66 6f 72 20 61 6c 6c  mestamps for all
6ad0: 20 72 65 76 69 73 69 6f 6e 73 20 69 6e 20 74 68   revisions in th
6ae0: 65 20 63 68 61 6e 67 65 73 65 74 73 20 61 6e 64  e changesets and
6af0: 0a 09 23 20 63 6f 6d 70 75 74 65 20 74 68 65 69  ..# compute thei
6b00: 72 20 64 65 6c 74 61 73 20 66 6f 72 20 75 73 65  r deltas for use
6b10: 20 62 79 20 74 68 65 20 62 72 65 61 6b 20 66 69   by the break fi
6b20: 6e 64 65 72 2e 0a 0a 09 61 72 72 61 79 20 73 65  nder....array se
6b30: 74 20 64 65 6c 74 61 20 7b 7d 0a 09 61 72 72 61  t delta {}..arra
6b40: 79 20 73 65 74 20 73 74 61 6d 70 20 7b 7d 0a 0a  y set stamp {}..
6b50: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a  .set theset ('[j
6b60: 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b  oin $revisions {
6b70: 27 2c 27 7d 5d 27 29 0a 09 66 6f 72 65 61 63 68  ','}]')..foreach
6b80: 20 7b 72 69 64 20 74 69 6d 65 7d 20 5b 73 74 61   {rid time} [sta
6b90: 74 65 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e  te run [subst -n
6ba0: 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63  ocommands -nobac
6bb0: 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20 20 20  kslashes {..    
6bc0: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e  SELECT R.rid, R.
6bd0: 64 61 74 65 0a 09 20 20 20 20 46 52 4f 4d 20 72  date..    FROM r
6be0: 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57  evision R..    W
6bf0: 48 45 52 45 20 52 2e 72 69 64 20 49 4e 20 24 74  HERE R.rid IN $t
6c00: 68 65 73 65 74 0a 09 7d 5d 5d 20 7b 0a 09 20 20  heset..}]] {..  
6c10: 20 20 73 65 74 20 73 74 61 6d 70 28 24 72 69 64    set stamp($rid
6c20: 29 20 24 74 69 6d 65 0a 09 7d 0a 0a 09 6c 6f 67  ) $time..}...log
6c30: 20 77 72 69 74 65 20 31 34 20 63 73 65 74 73 20   write 14 csets 
6c40: 7b 49 42 53 3a 20 73 74 61 6d 70 20 5b 61 72 72  {IBS: stamp [arr
6c50: 61 79 20 73 69 7a 65 20 73 74 61 6d 70 5d 7d 0a  ay size stamp]}.
6c60: 0a 09 73 65 74 20 6e 20 30 0a 09 66 6f 72 65 61  ..set n 0..forea
6c70: 63 68 20 72 69 64 20 5b 6c 72 61 6e 67 65 20 24  ch rid [lrange $
6c80: 72 65 76 69 73 69 6f 6e 73 20 30 20 65 6e 64 2d  revisions 0 end-
6c90: 31 5d 20 72 6e 65 78 74 20 5b 6c 72 61 6e 67 65  1] rnext [lrange
6ca0: 20 24 72 65 76 69 73 69 6f 6e 73 20 31 20 65 6e   $revisions 1 en
6cb0: 64 5d 20 7b 0a 09 20 20 20 20 73 65 74 20 64 65  d] {..    set de
6cc0: 6c 74 61 28 24 6e 29 20 5b 65 78 70 72 20 7b 24  lta($n) [expr {$
6cd0: 73 74 61 6d 70 28 24 72 6e 65 78 74 29 20 2d 20  stamp($rnext) - 
6ce0: 24 73 74 61 6d 70 28 24 72 69 64 29 7d 5d 0a 09  $stamp($rid)}]..
6cf0: 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 09 72      incr n..}..r
6d00: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
6d10: 20 70 72 6f 63 20 46 69 6e 64 42 65 73 74 42 72   proc FindBestBr
6d20: 65 61 6b 20 7b 72 61 6e 67 65 7d 20 7b 0a 09 75  eak {range} {..u
6d30: 70 76 61 72 20 31 20 63 72 6f 73 73 20 63 72 6f  pvar 1 cross cro
6d40: 73 73 20 64 65 6c 74 61 20 64 65 6c 74 61 0a 0a  ss delta delta..
6d50: 09 23 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  .# Determine the
6d60: 20 62 65 73 74 20 62 72 65 61 6b 20 6c 6f 63 61   best break loca
6d70: 74 69 6f 6e 20 69 6e 20 74 68 65 20 67 69 76 65  tion in the give
6d80: 6e 20 72 61 6e 67 65 20 6f 66 0a 09 23 20 70 6f  n range of..# po
6d90: 73 69 74 69 6f 6e 73 2e 20 46 69 72 73 74 20 77  sitions. First w
6da0: 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 68 65 20 6c  e look for the l
6db0: 6f 63 61 74 69 6f 6e 73 20 77 69 74 68 20 74 68  ocations with th
6dc0: 65 20 6d 61 78 69 6d 61 6c 0a 09 23 20 6e 75 6d  e maximal..# num
6dd0: 62 65 72 20 6f 66 20 63 72 6f 73 73 69 6e 67 73  ber of crossings
6de0: 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  . If there are s
6df0: 65 76 65 72 61 6c 20 77 65 20 6c 6f 6f 6b 20 66  everal we look f
6e00: 6f 72 20 74 68 65 0a 09 23 20 73 68 6f 72 74 65  or the..# shorte
6e10: 73 74 20 74 69 6d 65 20 69 6e 74 65 72 76 61 6c  st time interval
6e20: 20 61 6d 6f 6e 67 20 74 68 65 6d 2e 20 49 66 20   among them. If 
6e30: 77 65 20 73 74 69 6c 6c 20 68 61 76 65 20 6d 75  we still have mu
6e40: 6c 74 69 70 6c 65 0a 09 23 20 70 6f 73 73 69 62  ltiple..# possib
6e50: 69 6c 69 74 69 65 73 20 61 66 74 65 72 20 74 68  ilities after th
6e60: 61 74 20 77 65 20 73 65 6c 65 63 74 20 74 68 65  at we select the
6e70: 20 65 61 72 6c 69 65 73 74 20 6c 6f 63 61 74 69   earliest locati
6e80: 6f 6e 0a 09 23 20 61 6d 6f 6e 67 20 74 68 65 73  on..# among thes
6e90: 65 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 49 66 20  e....# Note: If 
6ea0: 74 68 65 20 6d 61 78 69 6d 61 6c 20 6e 75 6d 62  the maximal numb
6eb0: 65 72 20 6f 66 20 63 72 6f 73 73 69 6e 67 73 20  er of crossings 
6ec0: 69 73 20 30 20 74 68 65 6e 20 74 68 65 20 72 61  is 0 then the ra
6ed0: 6e 67 65 0a 09 23 20 20 20 20 20 20 20 68 61 73  nge..#       has
6ee0: 20 6e 6f 20 69 6e 74 65 72 6e 61 6c 20 64 65 70   no internal dep
6ef0: 65 6e 64 65 6e 63 69 65 73 2c 20 61 6e 64 20 6e  endencies, and n
6f00: 6f 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e  o break location
6f10: 20 61 74 0a 09 23 20 20 20 20 20 20 20 61 6c 6c   at..#       all
6f20: 2e 20 54 68 69 73 20 70 6f 73 73 69 62 69 6c 69  . This possibili
6f30: 74 79 20 69 73 20 73 69 67 6e 61 6c 65 64 20 76  ty is signaled v
6f40: 69 61 20 72 65 73 75 6c 74 20 2d 31 2e 0a 0a 09  ia result -1....
6f50: 23 20 4e 6f 74 65 3a 20 41 20 72 61 6e 67 65 20  # Note: A range 
6f60: 6f 66 20 6c 65 6e 67 74 68 20 31 20 6f 72 20 6c  of length 1 or l
6f70: 65 73 73 20 63 61 6e 6e 6f 74 20 68 61 76 65 20  ess cannot have 
6f80: 69 6e 74 65 72 6e 61 6c 0a 09 23 20 20 20 20 20  internal..#     
6f90: 20 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20    dependencies, 
6fa0: 61 73 20 74 68 61 74 20 6e 65 65 64 73 20 61 74  as that needs at
6fb0: 20 6c 65 61 73 74 20 74 77 6f 20 72 65 76 69 73   least two revis
6fc0: 69 6f 6e 73 20 69 6e 0a 09 23 20 20 20 20 20 20  ions in..#      
6fd0: 20 74 68 65 20 72 61 6e 67 65 2e 0a 0a 09 69 66   the range....if
6fe0: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 72 61 6e 67   {[llength $rang
6ff0: 65 5d 20 3c 20 32 7d 20 7b 20 72 65 74 75 72 6e  e] < 2} { return
7000: 20 2d 31 20 7d 0a 0a 09 73 65 74 20 6d 61 78 20   -1 }...set max 
7010: 2d 31 0a 09 73 65 74 20 62 65 73 74 20 7b 7d 0a  -1..set best {}.
7020: 0a 09 66 6f 72 65 61 63 68 20 6c 6f 63 61 74 69  ..foreach locati
7030: 6f 6e 20 24 72 61 6e 67 65 20 7b 0a 09 20 20 20  on $range {..   
7040: 20 73 65 74 20 63 72 6f 73 73 69 6e 67 73 20 24   set crossings $
7050: 63 72 6f 73 73 28 24 6c 6f 63 61 74 69 6f 6e 29  cross($location)
7060: 0a 09 20 20 20 20 69 66 20 7b 24 63 72 6f 73 73  ..    if {$cross
7070: 69 6e 67 73 20 3e 20 24 6d 61 78 7d 20 7b 0a 09  ings > $max} {..
7080: 09 73 65 74 20 6d 61 78 20 20 24 63 72 6f 73 73  .set max  $cross
7090: 69 6e 67 73 0a 09 09 73 65 74 20 62 65 73 74 20  ings...set best 
70a0: 5b 6c 69 73 74 20 24 6c 6f 63 61 74 69 6f 6e 5d  [list $location]
70b0: 0a 09 09 63 6f 6e 74 69 6e 75 65 0a 09 20 20 20  ...continue..   
70c0: 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 72 6f 73   } elseif {$cros
70d0: 73 69 6e 67 73 20 3d 3d 20 24 6d 61 78 7d 20 7b  sings == $max} {
70e0: 0a 09 09 6c 61 70 70 65 6e 64 20 62 65 73 74 20  ...lappend best 
70f0: 24 6c 6f 63 61 74 69 6f 6e 0a 09 20 20 20 20 7d  $location..    }
7100: 0a 09 7d 0a 0a 09 69 66 20 7b 24 6d 61 78 20 3d  ..}...if {$max =
7110: 3d 20 30 7d 20 20 20 20 20 20 20 20 20 20 20 20  = 0}            
7120: 7b 20 72 65 74 75 72 6e 20 2d 31 20 7d 0a 09 69  { return -1 }..i
7130: 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 62 65 73  f {[llength $bes
7140: 74 5d 20 3d 3d 20 31 7d 20 7b 20 72 65 74 75 72  t] == 1} { retur
7150: 6e 20 5b 6c 69 6e 64 65 78 20 24 62 65 73 74 20  n [lindex $best 
7160: 30 5d 20 7d 0a 0a 09 73 65 74 20 6c 6f 63 61 74  0] }...set locat
7170: 69 6f 6e 73 20 24 62 65 73 74 0a 09 73 65 74 20  ions $best..set 
7180: 62 65 73 74 20 7b 7d 0a 09 73 65 74 20 6d 69 6e  best {}..set min
7190: 20 2d 31 0a 0a 09 66 6f 72 65 61 63 68 20 6c 6f   -1...foreach lo
71a0: 63 61 74 69 6f 6e 20 24 6c 6f 63 61 74 69 6f 6e  cation $location
71b0: 73 20 7b 0a 09 20 20 20 20 73 65 74 20 69 6e 74  s {..    set int
71c0: 65 72 76 61 6c 20 24 64 65 6c 74 61 28 24 6c 6f  erval $delta($lo
71d0: 63 61 74 69 6f 6e 29 0a 09 20 20 20 20 69 66 20  cation)..    if 
71e0: 7b 28 24 6d 69 6e 20 3c 20 30 29 20 7c 7c 20 28  {($min < 0) || (
71f0: 24 69 6e 74 65 72 76 61 6c 20 3c 20 24 6d 69 6e  $interval < $min
7200: 29 7d 20 7b 0a 09 09 73 65 74 20 6d 69 6e 20 20  )} {...set min  
7210: 24 69 6e 74 65 72 76 61 6c 0a 09 09 73 65 74 20  $interval...set 
7220: 62 65 73 74 20 5b 6c 69 73 74 20 24 6c 6f 63 61  best [list $loca
7230: 74 69 6f 6e 5d 0a 09 20 20 20 20 7d 20 65 6c 73  tion]..    } els
7240: 65 69 66 20 7b 24 69 6e 74 65 72 76 61 6c 20 3d  eif {$interval =
7250: 3d 20 24 6d 69 6e 7d 20 7b 0a 09 09 6c 61 70 70  = $min} {...lapp
7260: 65 6e 64 20 62 65 73 74 20 24 6c 6f 63 61 74 69  end best $locati
7270: 6f 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69  on..    }..}...i
7280: 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 62 65 73  f {[llength $bes
7290: 74 5d 20 3d 3d 20 31 7d 20 7b 20 72 65 74 75 72  t] == 1} { retur
72a0: 6e 20 5b 6c 69 6e 64 65 78 20 24 62 65 73 74 20  n [lindex $best 
72b0: 30 5d 20 7d 0a 0a 09 72 65 74 75 72 6e 20 5b 6c  0] }...return [l
72c0: 69 6e 64 65 78 20 5b 6c 73 6f 72 74 20 2d 69 6e  index [lsort -in
72d0: 74 65 67 65 72 20 2d 69 6e 63 72 65 61 73 69 6e  teger -increasin
72e0: 67 20 24 62 65 73 74 5d 20 30 5d 0a 20 20 20 20  g $best] 0].    
72f0: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 43 75 74 41  }..    proc CutA
7300: 74 20 7b 6c 6f 63 61 74 69 6f 6e 7d 20 7b 0a 09  t {location} {..
7310: 75 70 76 61 72 20 31 20 63 72 6f 73 73 20 63 72  upvar 1 cross cr
7320: 6f 73 73 20 64 65 70 63 20 64 65 70 63 0a 0a 09  oss depc depc...
7330: 23 20 49 74 20 77 61 73 20 64 65 63 69 64 65 64  # It was decided
7340: 20 74 6f 20 73 70 6c 69 74 20 74 68 65 20 63 68   to split the ch
7350: 61 6e 67 65 73 65 74 20 61 74 20 74 68 65 20 67  angeset at the g
7360: 69 76 65 6e 0a 09 23 20 6c 6f 63 61 74 69 6f 6e  iven..# location
7370: 2e 20 54 68 69 73 20 63 75 74 73 20 61 20 6e 75  . This cuts a nu
7380: 6d 62 65 72 20 6f 66 20 64 65 70 65 6e 64 65 6e  mber of dependen
7390: 63 69 65 73 2e 20 48 65 72 65 20 77 65 20 75 70  cies. Here we up
73a0: 64 61 74 65 0a 09 23 20 74 68 65 20 63 72 6f 73  date..# the cros
73b0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  s information so
73c0: 20 74 68 61 74 20 74 68 65 20 62 72 65 61 6b 20   that the break 
73d0: 66 69 6e 64 65 72 20 68 61 73 20 61 63 63 75 72  finder has accur
73e0: 61 74 65 0a 09 23 20 64 61 74 61 20 77 68 65 6e  ate..# data when
73f0: 20 77 65 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20   we look at the 
7400: 67 65 6e 65 72 61 74 65 64 20 66 72 61 67 6d 65  generated fragme
7410: 6e 74 73 2e 0a 0a 09 73 65 74 20 73 69 78 20 5b  nts....set six [
7420: 6c 6f 67 20 76 69 73 69 62 6c 65 3f 20 36 5d 0a  log visible? 6].
7430: 0a 09 66 6f 72 65 61 63 68 20 7b 64 65 70 20 72  ..foreach {dep r
7440: 61 6e 67 65 7d 20 5b 61 72 72 61 79 20 67 65 74  ange} [array get
7450: 20 64 65 70 63 5d 20 7b 0a 09 20 20 20 20 23 20   depc] {..    # 
7460: 43 68 65 63 6b 20 61 6c 6c 20 64 65 70 65 6e 64  Check all depend
7470: 65 6e 63 69 65 73 20 73 74 69 6c 6c 20 6b 6e 6f  encies still kno
7480: 77 6e 2c 20 74 61 6b 65 20 74 68 65 69 72 20 72  wn, take their r
7490: 61 6e 67 65 20 61 6e 64 0a 09 20 20 20 20 23 20  ange and..    # 
74a0: 73 65 65 20 69 66 20 74 68 65 20 62 72 65 61 6b  see if the break
74b0: 20 6c 6f 63 61 74 69 6f 6e 20 66 61 6c 6c 73 20   location falls 
74c0: 77 69 74 68 69 6e 2e 0a 0a 09 20 20 20 20 42 6f  within....    Bo
74d0: 72 64 65 72 20 24 72 61 6e 67 65 20 73 20 65 0a  rder $range s e.
74e0: 09 20 20 20 20 69 66 20 7b 24 6c 6f 63 61 74 69  .    if {$locati
74f0: 6f 6e 20 3c 20 24 73 7d 20 63 6f 6e 74 69 6e 75  on < $s} continu
7500: 65 20 3b 20 23 20 62 72 65 61 6b 20 62 65 66 6f  e ; # break befo
7510: 72 65 20 72 61 6e 67 65 2c 20 69 67 6e 6f 72 65  re range, ignore
7520: 0a 09 20 20 20 20 69 66 20 7b 24 6c 6f 63 61 74  ..    if {$locat
7530: 69 6f 6e 20 3e 20 24 65 7d 20 63 6f 6e 74 69 6e  ion > $e} contin
7540: 75 65 20 3b 20 23 20 62 72 65 61 6b 20 61 66 74  ue ; # break aft
7550: 65 72 20 72 61 6e 67 65 2c 20 69 67 6e 6f 72 65  er range, ignore
7560: 2e 0a 0a 09 20 20 20 20 23 20 54 68 69 73 20 64  ....    # This d
7570: 65 70 65 6e 64 65 6e 63 79 20 63 72 6f 73 73 65  ependency crosse
7580: 73 20 74 68 65 20 62 72 65 61 6b 20 6c 6f 63 61  s the break loca
7590: 74 69 6f 6e 2e 20 57 65 20 72 65 6d 6f 76 65 20  tion. We remove 
75a0: 69 74 0a 09 20 20 20 20 23 20 66 72 6f 6d 20 74  it..    # from t
75b0: 68 65 20 63 72 6f 73 73 69 6e 67 73 20 63 6f 75  he crossings cou
75c0: 6e 74 65 72 73 2c 20 61 6e 64 20 74 68 65 6e 20  nters, and then 
75d0: 61 6c 73 6f 20 66 72 6f 6d 20 74 68 65 20 73 65  also from the se
75e0: 74 0a 09 20 20 20 20 23 20 6f 66 20 6b 6e 6f 77  t..    # of know
75f0: 6e 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20  n dependencies, 
7600: 61 73 20 77 65 20 61 72 65 20 64 6f 6e 65 20 77  as we are done w
7610: 69 74 68 20 69 74 2e 0a 0a 09 20 20 20 20 66 6f  ith it....    fo
7620: 72 65 61 63 68 20 6c 6f 63 20 24 64 65 70 63 28  reach loc $depc(
7630: 24 64 65 70 29 20 7b 20 69 6e 63 72 20 63 72 6f  $dep) { incr cro
7640: 73 73 28 24 6c 6f 63 29 20 2d 31 20 7d 0a 09 20  ss($loc) -1 }.. 
7650: 20 20 20 75 6e 73 65 74 20 64 65 70 63 28 24 64     unset depc($d
7660: 65 70 29 0a 0a 09 20 20 20 20 69 66 20 7b 21 24  ep)...    if {!$
7670: 73 69 78 7d 20 63 6f 6e 74 69 6e 75 65 0a 0a 09  six} continue...
7680: 20 20 20 20 73 74 72 75 63 74 3a 3a 6c 69 73 74      struct::list
7690: 20 61 73 73 69 67 6e 20 24 64 65 70 20 70 61 72   assign $dep par
76a0: 65 6e 74 20 63 68 69 6c 64 0a 09 20 20 20 20 6c  ent child..    l
76b0: 6f 67 20 77 72 69 74 65 20 35 20 63 73 65 74 73  og write 5 csets
76c0: 20 22 42 72 6f 6b 65 20 64 65 70 65 6e 64 65 6e   "Broke dependen
76d0: 63 79 20 5b 50 44 20 24 70 61 72 65 6e 74 5d 20  cy [PD $parent] 
76e0: 2d 2d 3e 20 5b 50 44 20 24 63 68 69 6c 64 5d 22  --> [PD $child]"
76f0: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 0a 20 20 20  ..}...return.   
7700: 20 7d 0a 0a 20 20 20 20 23 20 50 72 69 6e 74 20   }..    # Print 
7710: 69 64 65 6e 74 69 66 79 69 6e 67 20 64 61 74 61  identifying data
7720: 20 66 6f 72 20 61 20 72 65 76 69 73 69 6f 6e 20   for a revision 
7730: 28 70 72 6f 6a 65 63 74 2c 20 66 69 6c 65 2c 20  (project, file, 
7740: 64 6f 74 74 65 64 20 72 65 76 0a 20 20 20 20 23  dotted rev.    #
7750: 20 6e 75 6d 62 65 72 29 2c 20 66 6f 72 20 68 69   number), for hi
7760: 67 68 20 76 65 72 62 6f 73 69 74 79 20 6c 6f 67  gh verbosity log
7770: 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 23 20 54   output..    # T
7780: 4f 44 4f 3a 20 52 65 70 6c 61 63 65 20 77 69 74  ODO: Replace wit
7790: 68 20 63 61 6c 6c 20 74 6f 20 69 74 65 6d 73 74  h call to itemst
77a0: 72 20 28 6c 69 73 74 20 72 65 76 20 24 69 64 29  r (list rev $id)
77b0: 0a 0a 20 20 20 20 70 72 6f 63 20 50 44 20 7b 69  ..    proc PD {i
77c0: 64 7d 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b 70  d} {..foreach {p
77d0: 20 66 20 72 7d 20 5b 73 74 61 74 65 20 72 75 6e   f r} [state run
77e0: 20 7b 0a 09 09 53 45 4c 45 43 54 20 50 2e 6e 61   {...SELECT P.na
77f0: 6d 65 20 2c 20 46 2e 6e 61 6d 65 2c 20 52 2e 72  me , F.name, R.r
7800: 65 76 0a 09 09 46 52 4f 4d 20 72 65 76 69 73 69  ev...FROM revisi
7810: 6f 6e 20 52 2c 20 66 69 6c 65 20 46 2c 20 70 72  on R, file F, pr
7820: 6f 6a 65 63 74 20 50 0a 09 09 57 48 45 52 45 20  oject P...WHERE 
7830: 52 2e 72 69 64 20 3d 20 24 69 64 20 20 20 20 2d  R.rid = $id    -
7840: 2d 20 46 69 6e 64 20 73 70 65 63 69 66 69 65 64  - Find specified
7850: 20 66 69 6c 65 20 72 65 76 69 73 69 6f 6e 0a 09   file revision..
7860: 09 41 4e 44 20 20 20 46 2e 66 69 64 20 3d 20 52  .AND   F.fid = R
7870: 2e 66 69 64 20 20 2d 2d 20 47 65 74 20 66 69 6c  .fid  -- Get fil
7880: 65 20 6f 66 20 74 68 65 20 72 65 76 69 73 69 6f  e of the revisio
7890: 6e 0a 09 09 41 4e 44 20 20 20 50 2e 70 69 64 20  n...AND   P.pid 
78a0: 3d 20 46 2e 70 69 64 20 20 2d 2d 20 47 65 74 20  = F.pid  -- Get 
78b0: 70 72 6f 6a 65 63 74 20 6f 66 20 74 68 65 20 66  project of the f
78c0: 69 6c 65 2e 0a 09 7d 5d 20 62 72 65 61 6b 0a 09  ile...}] break..
78d0: 72 65 74 75 72 6e 20 22 27 24 70 20 3a 20 24 66  return "'$p : $f
78e0: 2f 24 72 27 22 0a 20 20 20 20 7d 0a 0a 20 20 20  /$r'".    }..   
78f0: 20 23 20 50 72 69 6e 74 69 6e 67 20 6f 6e 65 20   # Printing one 
7900: 6f 72 20 6d 6f 72 65 20 72 61 6e 67 65 73 2c 20  or more ranges, 
7910: 66 6f 72 6d 61 74 74 65 64 2c 20 61 6e 64 20 6f  formatted, and o
7920: 6e 6c 79 20 74 68 65 69 72 20 62 6f 72 64 65 72  nly their border
7930: 20 74 6f 0a 20 20 20 20 23 20 6b 65 65 70 20 74   to.    # keep t
7940: 68 65 20 73 74 72 69 6e 67 73 20 73 68 6f 72 74  he strings short
7950: 2e 0a 0a 20 20 20 20 70 72 6f 63 20 50 52 73 20  ...    proc PRs 
7960: 7b 72 61 6e 67 65 73 7d 20 7b 0a 09 72 65 74 75  {ranges} {..retu
7970: 72 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74  rn [struct::list
7980: 20 6d 61 70 20 24 72 61 6e 67 65 73 20 5b 6d 79   map $ranges [my
7990: 70 72 6f 63 20 50 52 5d 5d 0a 20 20 20 20 7d 0a  proc PR]].    }.
79a0: 0a 20 20 20 20 70 72 6f 63 20 50 52 20 7b 72 61  .    proc PR {ra
79b0: 6e 67 65 7d 20 7b 0a 09 42 6f 72 64 65 72 20 24  nge} {..Border $
79c0: 72 61 6e 67 65 20 73 20 65 0a 09 72 65 74 75 72  range s e..retur
79d0: 6e 20 3c 24 7b 73 7d 2e 2e 2e 24 7b 65 7d 3e 0a  n <${s}...${e}>.
79e0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20      }..    proc 
79f0: 42 6f 72 64 65 72 20 7b 72 61 6e 67 65 20 73 76  Border {range sv
7a00: 20 65 76 7d 20 7b 0a 09 75 70 76 61 72 20 31 20   ev} {..upvar 1 
7a10: 24 73 76 20 73 20 24 65 76 20 65 0a 09 73 65 74  $sv s $ev e..set
7a20: 20 73 20 5b 6c 69 6e 64 65 78 20 24 72 61 6e 67   s [lindex $rang
7a30: 65 20 30 5d 0a 09 73 65 74 20 65 20 5b 6c 69 6e  e 0]..set e [lin
7a40: 64 65 78 20 24 72 61 6e 67 65 20 65 6e 64 5d 0a  dex $range end].
7a50: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
7a60: 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23     # # ## ### ##
7a70: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23  ### ######## ###
7a80: 23 23 23 23 23 23 23 23 23 23 0a 0a 20 20 20 20  ##########..    
7a90: 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63  typevariable myc
7aa0: 68 61 6e 67 65 73 65 74 73 20 20 20 20 20 20 20  hangesets       
7ab0: 20 20 7b 7d 20 3b 20 23 20 4c 69 73 74 20 6f 66    {} ; # List of
7ac0: 20 61 6c 6c 20 6b 6e 6f 77 6e 0a 09 09 09 09 09   all known......
7ad0: 20 20 20 23 20 63 68 61 6e 67 65 73 65 74 73 2e     # changesets.
7ae0: 0a 0a 20 20 20 20 23 20 4c 69 73 74 20 6f 66 20  ..    # List of 
7af0: 61 6c 6c 20 6b 6e 6f 77 6e 20 63 68 61 6e 67 65  all known change
7b00: 73 65 74 73 20 6f 66 20 61 20 74 79 70 65 2e 0a  sets of a type..
7b10: 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65      typevariable
7b20: 20 6d 79 74 63 68 61 6e 67 65 73 65 74 73 20 2d   mytchangesets -
7b30: 61 72 72 61 79 20 7b 0a 09 73 79 6d 3a 3a 62 72  array {..sym::br
7b40: 61 6e 63 68 20 7b 7d 0a 09 73 79 6d 3a 3a 74 61  anch {}..sym::ta
7b50: 67 20 20 20 20 7b 7d 0a 09 72 65 76 20 20 20 20  g    {}..rev    
7b60: 20 20 20 20 20 7b 7d 0a 20 20 20 20 7d 0a 09 09       {}.    }...
7b70: 09 09 09 0a 20 20 20 20 74 79 70 65 76 61 72 69  ....    typevari
7b80: 61 62 6c 65 20 6d 79 69 74 65 6d 6d 61 70 20 20  able myitemmap  
7b90: 20 20 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23     -array {} ; #
7ba0: 20 4d 61 70 20 66 72 6f 6d 20 69 74 65 6d 73 20   Map from items 
7bb0: 28 74 61 67 67 65 64 29 0a 09 09 09 09 09 20 20  (tagged)......  
7bc0: 20 23 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f   # to the list o
7bd0: 66 20 63 68 61 6e 67 65 73 65 74 73 0a 09 09 09  f changesets....
7be0: 09 09 20 20 20 23 20 63 6f 6e 74 61 69 6e 69 6e  ..   # containin
7bf0: 67 20 69 74 2e 20 45 61 63 68 20 69 74 65 6d 0a  g it. Each item.
7c00: 09 09 09 09 09 20 20 20 23 20 63 61 6e 20 62 65  .....   # can be
7c10: 20 75 73 65 64 20 62 79 20 6f 6e 6c 79 20 6f 6e   used by only on
7c20: 65 0a 09 09 09 09 09 20 20 20 23 20 63 68 61 6e  e......   # chan
7c30: 67 65 73 65 74 2e 0a 20 20 20 20 74 79 70 65 76  geset..    typev
7c40: 61 72 69 61 62 6c 65 20 6d 79 69 64 6d 61 70 20  ariable myidmap 
7c50: 20 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20    -array {} ; # 
7c60: 4d 61 70 20 66 72 6f 6d 20 63 68 61 6e 67 65 73  Map from changes
7c70: 65 74 20 69 64 20 74 6f 0a 09 09 09 09 20 20 20  et id to.....   
7c80: 20 20 20 20 23 20 63 68 61 6e 67 65 73 65 74 2e      # changeset.
7c90: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ..    typemethod
7ca0: 20 61 6c 6c 20 20 20 20 7b 7d 20 20 20 20 7b 20   all    {}    { 
7cb0: 72 65 74 75 72 6e 20 24 6d 79 63 68 61 6e 67 65  return $mychange
7cc0: 73 65 74 73 20 7d 0a 20 20 20 20 74 79 70 65 6d  sets }.    typem
7cd0: 65 74 68 6f 64 20 6f 66 20 20 20 20 20 7b 63 69  ethod of     {ci
7ce0: 64 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69  d} { return $myi
7cf0: 64 6d 61 70 28 24 63 69 64 29 20 7d 0a 20 20 20  dmap($cid) }.   
7d00: 20 74 79 70 65 6d 65 74 68 6f 64 20 6f 66 69 74   typemethod ofit
7d10: 65 6d 20 7b 69 69 64 7d 20 7b 20 72 65 74 75 72  em {iid} { retur
7d20: 6e 20 24 6d 79 69 74 65 6d 6d 61 70 28 24 69 69  n $myitemmap($ii
7d30: 64 29 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65  d) }..    typeme
7d40: 74 68 6f 64 20 72 65 76 20 20 20 20 7b 7d 20 20  thod rev    {}  
7d50: 20 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 74 63    { return $mytc
7d60: 68 61 6e 67 65 73 65 74 73 28 72 65 76 29 20 7d  hangesets(rev) }
7d70: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
7d80: 73 79 6d 20 20 20 20 7b 7d 20 20 20 20 7b 20 72  sym    {}    { r
7d90: 65 74 75 72 6e 20 5b 63 6f 6e 63 61 74 20 5c 0a  eturn [concat \.
7da0: 09 09 09 09 09 20 20 24 7b 6d 79 74 63 68 61 6e  .....  ${mytchan
7db0: 67 65 73 65 74 73 28 73 79 6d 3a 3a 62 72 61 6e  gesets(sym::bran
7dc0: 63 68 29 7d 20 5c 0a 09 09 09 09 09 20 20 24 7b  ch)} \......  ${
7dd0: 6d 79 74 63 68 61 6e 67 65 73 65 74 73 28 73 79  mytchangesets(sy
7de0: 6d 3a 3a 74 61 67 29 7d 5d 20 7d 0a 0a 20 20 20  m::tag)}] }..   
7df0: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23   # # ## ### ####
7e00: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
7e10: 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20  ########.    ## 
7e20: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a 20  Configuration.. 
7e30: 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79     pragma -hasty
7e40: 70 65 69 6e 66 6f 20 20 20 20 6e 6f 20 20 3b 20  peinfo    no  ; 
7e50: 23 20 6e 6f 20 74 79 70 65 20 69 6e 74 72 6f 73  # no type intros
7e60: 70 65 63 74 69 6f 6e 0a 20 20 20 20 70 72 61 67  pection.    prag
7e70: 6d 61 20 2d 68 61 73 69 6e 66 6f 20 20 20 20 20  ma -hasinfo     
7e80: 20 20 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 6f 62     no  ; # no ob
7e90: 6a 65 63 74 20 69 6e 74 72 6f 73 70 65 63 74 69  ject introspecti
7ea0: 6f 6e 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23  on..    # # ## #
7eb0: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
7ec0: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  # #############.
7ed0: 7d 0a 0a 23 23 0a 23 23 20 4e 4f 54 45 3a 20 54  }..##.## NOTE: T
7ee0: 68 65 20 73 75 63 63 65 73 73 6f 72 20 61 6e 64  he successor and
7ef0: 20 70 72 65 64 65 63 65 73 73 6f 72 20 6d 65 74   predecessor met
7f00: 68 6f 64 73 20 64 65 66 69 6e 65 64 20 62 79 20  hods defined by 
7f10: 74 68 65 20 63 6c 61 73 73 65 73 0a 23 23 20 20  the classes.##  
7f20: 20 20 20 20 20 62 65 6c 6f 77 20 61 72 65 20 2d       below are -
7f30: 2d 20 62 6f 74 74 6c 65 20 6e 65 63 6b 73 20 2d  - bottle necks -
7f40: 2d 2e 20 4c 6f 6f 6b 20 66 6f 72 20 77 61 79 73  -. Look for ways
7f50: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 53 51 4c   to make the SQL
7f60: 0a 23 23 20 20 20 20 20 20 20 66 61 73 74 65 72  .##       faster
7f70: 2e 0a 23 23 0a 0a 23 20 23 20 23 23 20 23 23 23  ..##..# # ## ###
7f80: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20   ##### ######## 
7f90: 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23  ############# ##
7fa0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7fb0: 23 23 23 0a 23 23 20 48 65 6c 70 65 72 20 73 69  ###.## Helper si
7fc0: 6e 67 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64  ngleton. Command
7fd0: 73 20 66 6f 72 20 72 65 76 69 73 69 6f 6e 20 63  s for revision c
7fe0: 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e 69 74  hangesets...snit
7ff0: 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f 73  ::type ::vc::fos
8000: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73  sil::import::cvs
8010: 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a  ::project::rev::
8020: 72 65 76 20 7b 0a 20 20 20 20 74 79 70 65 6d 65  rev {.    typeme
8030: 74 68 6f 64 20 62 79 72 65 76 69 73 69 6f 6e 20  thod byrevision 
8040: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a  {} { return 1 }.
8050: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62      typemethod b
8060: 79 73 79 6d 62 6f 6c 20 20 20 7b 7d 20 7b 20 72  ysymbol   {} { r
8070: 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79  eturn 0 }.    ty
8080: 70 65 6d 65 74 68 6f 64 20 69 73 74 61 67 20 20  pemethod istag  
8090: 20 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20      {} { return 
80a0: 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68  0 }.    typemeth
80b0: 6f 64 20 69 73 62 72 61 6e 63 68 20 20 20 7b 7d  od isbranch   {}
80c0: 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 0a 20   { return 0 }.. 
80d0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 73 74     typemethod st
80e0: 72 20 7b 72 65 76 69 73 69 6f 6e 7d 20 7b 0a 09  r {revision} {..
80f0: 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73  struct::list ass
8100: 69 67 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 7b  ign [state run {
8110: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
8120: 65 76 2c 20 46 2e 6e 61 6d 65 2c 20 50 2e 6e 61  ev, F.name, P.na
8130: 6d 65 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72  me..    FROM   r
8140: 65 76 69 73 69 6f 6e 20 52 2c 20 66 69 6c 65 20  evision R, file 
8150: 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09 20 20  F, project P..  
8160: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 3d    WHERE  R.rid =
8170: 20 24 72 65 76 69 73 69 6f 6e 20 2d 2d 20 46 69   $revision -- Fi
8180: 6e 64 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  nd specified fil
8190: 65 20 72 65 76 69 73 69 6f 6e 0a 09 20 20 20 20  e revision..    
81a0: 41 4e 44 20 20 20 20 46 2e 66 69 64 20 3d 20 52  AND    F.fid = R
81b0: 2e 66 69 64 20 20 20 20 20 2d 2d 20 47 65 74 20  .fid     -- Get 
81c0: 66 69 6c 65 20 6f 66 20 74 68 65 20 72 65 76 69  file of the revi
81d0: 73 69 6f 6e 0a 09 20 20 20 20 41 4e 44 20 20 20  sion..    AND   
81e0: 20 50 2e 70 69 64 20 3d 20 46 2e 70 69 64 20 20   P.pid = F.pid  
81f0: 20 20 20 2d 2d 20 47 65 74 20 70 72 6f 6a 65 63     -- Get projec
8200: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 09  t of the file...
8210: 7d 5d 20 72 65 76 6e 72 20 66 6e 61 6d 65 20 70  }] revnr fname p
8220: 6e 61 6d 65 0a 09 72 65 74 75 72 6e 20 22 24 70  name..return "$p
8230: 6e 61 6d 65 2f 24 7b 72 65 76 6e 72 7d 3a 3a 24  name/${revnr}::$
8240: 66 6e 61 6d 65 22 0a 20 20 20 20 7d 0a 0a 20 20  fname".    }..  
8250: 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73    # result = lis
8260: 74 20 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74  t (mintime, maxt
8270: 69 6d 65 29 0a 20 20 20 20 74 79 70 65 6d 65 74  ime).    typemet
8280: 68 6f 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 69  hod timerange {i
8290: 74 65 6d 73 7d 20 7b 0a 09 73 65 74 20 74 68 65  tems} {..set the
82a0: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 69 74 65  set ('[join $ite
82b0: 6d 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74  ms {','}]')..ret
82c0: 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 5b  urn [state run [
82d0: 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64  subst -nocommand
82e0: 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73  s -nobackslashes
82f0: 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 4d   {..    SELECT M
8300: 49 4e 28 52 2e 64 61 74 65 29 2c 20 4d 41 58 28  IN(R.date), MAX(
8310: 52 2e 64 61 74 65 29 0a 09 20 20 20 20 46 52 4f  R.date)..    FRO
8320: 4d 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20  M revision R..  
8330: 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 49 4e    WHERE R.rid IN
8340: 20 24 74 68 65 73 65 74 20 2d 2d 20 52 65 73 74   $theset -- Rest
8350: 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e  rict to revision
8360: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 7d  s of interest..}
8370: 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  ]].    }..    # 
8380: 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20 28  var(dv) = dict (
8390: 72 65 76 69 73 69 6f 6e 20 2d 3e 20 6c 69 73 74  revision -> list
83a0: 20 28 72 65 76 69 73 69 6f 6e 29 29 0a 20 20 20   (revision)).   
83b0: 20 74 79 70 65 6d 65 74 68 6f 64 20 69 6e 74 65   typemethod inte
83c0: 72 6e 61 6c 73 75 63 63 65 73 73 6f 72 73 20 7b  rnalsuccessors {
83d0: 64 76 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a  dv revisions} {.
83e0: 09 75 70 76 61 72 20 31 20 24 64 76 20 64 65 70  .upvar 1 $dv dep
83f0: 65 6e 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74  endencies..set t
8400: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72  heset ('[join $r
8410: 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27  evisions {','}]'
8420: 29 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 31 34  )...log write 14
8430: 20 63 73 65 74 73 20 69 6e 74 65 72 6e 61 6c 73   csets internals
8440: 75 63 63 65 73 73 6f 72 73 0a 0a 09 23 20 53 65  uccessors...# Se
8450: 65 20 27 73 75 63 63 65 73 73 6f 72 73 27 20 62  e 'successors' b
8460: 65 6c 6f 77 20 66 6f 72 20 74 68 65 20 6d 61 69  elow for the mai
8470: 6e 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66  n explanation of
8480: 0a 09 23 20 74 68 65 20 76 61 72 69 6f 75 73 20  ..# the various 
8490: 63 61 73 65 73 2e 20 54 68 69 73 20 70 69 65 63  cases. This piec
84a0: 65 20 69 73 20 73 70 65 63 69 61 6c 20 69 6e 20  e is special in 
84b0: 74 68 61 74 20 69 74 0a 09 23 20 72 65 73 74 72  that it..# restr
84c0: 69 63 74 73 20 74 68 65 20 73 75 63 63 65 73 73  icts the success
84d0: 6f 72 73 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20  ors we look for 
84e0: 74 6f 20 74 68 65 20 73 61 6d 65 20 73 65 74 20  to the same set 
84f0: 6f 66 0a 09 23 20 72 65 76 69 73 69 6f 6e 73 20  of..# revisions 
8500: 77 65 20 73 74 61 72 74 20 66 72 6f 6d 2e 20 53  we start from. S
8510: 65 6e 73 69 62 6c 65 20 61 73 20 77 65 20 61 72  ensible as we ar
8520: 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 0a 09 23  e looking for..#
8530: 20 63 68 61 6e 67 65 73 65 74 20 69 6e 74 65 72   changeset inter
8540: 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73  nal dependencies
8550: 2e 0a 0a 09 61 72 72 61 79 20 73 65 74 20 64 65  ....array set de
8560: 70 20 7b 7d 0a 0a 09 66 6f 72 65 61 63 68 20 7b  p {}...foreach {
8570: 72 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74  rid child} [stat
8580: 65 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f  e run [subst -no
8590: 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b  commands -noback
85a0: 73 6c 61 73 68 65 73 20 7b 0a 20 20 20 20 2d 2d  slashes {.    --
85b0: 20 28 31 29 20 50 72 69 6d 61 72 79 20 63 68 69   (1) Primary chi
85c0: 6c 64 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52  ld..    SELECT R
85d0: 2e 72 69 64 2c 20 52 2e 63 68 69 6c 64 0a 09 20  .rid, R.child.. 
85e0: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69     FROM   revisi
85f0: 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20  on R..    WHERE 
8600: 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65   R.rid   IN $the
8610: 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72  set     -- Restr
8620: 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73  ict to revisions
8630: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20   of interest..  
8640: 20 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64    AND    R.child
8650: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
8660: 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 63  -- Has primary c
8670: 68 69 6c 64 0a 09 20 20 20 20 41 4e 44 20 20 20  hild..    AND   
8680: 20 52 2e 63 68 69 6c 64 20 49 4e 20 24 74 68 65   R.child IN $the
8690: 73 65 74 20 20 20 20 20 2d 2d 20 57 68 69 63 68  set     -- Which
86a0: 20 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e 74 65   is also of inte
86b0: 72 65 73 74 0a 20 20 20 20 55 4e 49 4f 4e 0a 20  rest.    UNION. 
86c0: 20 20 20 2d 2d 20 28 32 29 20 53 65 63 6f 6e 64     -- (2) Second
86d0: 61 72 79 20 28 62 72 61 6e 63 68 29 20 63 68 69  ary (branch) chi
86e0: 6c 64 72 65 6e 0a 09 20 20 20 20 53 45 4c 45 43  ldren..    SELEC
86f0: 54 20 52 2e 72 69 64 2c 20 42 2e 62 72 69 64 0a  T R.rid, B.brid.
8700: 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69  .    FROM   revi
8710: 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e  sion R, revision
8720: 62 72 61 6e 63 68 63 68 69 6c 64 72 65 6e 20 42  branchchildren B
8730: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72  ..    WHERE  R.r
8740: 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20  id   IN $theset 
8750: 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20      -- Restrict 
8760: 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20  to revisions of 
8770: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e  interest..    AN
8780: 44 20 20 20 20 52 2e 72 69 64 20 3d 20 42 2e 72  D    R.rid = B.r
8790: 69 64 20 20 20 20 20 20 20 20 20 20 2d 2d 20 53  id          -- S
87a0: 65 6c 65 63 74 20 73 75 62 73 65 74 20 6f 66 20  elect subset of 
87b0: 62 72 61 6e 63 68 20 63 68 69 6c 64 72 65 6e 0a  branch children.
87c0: 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 62 72  .    AND    B.br
87d0: 69 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20  id IN $theset   
87e0: 20 20 20 2d 2d 20 57 68 69 63 68 20 69 73 20 61     -- Which is a
87f0: 6c 73 6f 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  lso of interest.
8800: 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d      UNION.    --
8810: 20 28 34 29 20 43 68 69 6c 64 20 6f 66 20 74 72   (4) Child of tr
8820: 75 6e 6b 20 72 6f 6f 74 20 73 75 63 63 65 73 73  unk root success
8830: 6f 72 20 6f 66 20 6c 61 73 74 20 4e 54 44 42 20  or of last NTDB 
8840: 6f 6e 20 74 72 75 6e 6b 2e 0a 09 20 20 20 20 53  on trunk...    S
8850: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 41 2e  ELECT R.rid, RA.
8860: 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20  child..    FROM 
8870: 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69  revision R, revi
8880: 73 69 6f 6e 20 52 41 0a 09 20 20 20 20 57 48 45  sion RA..    WHE
8890: 52 45 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74  RE R.rid   IN $t
88a0: 68 65 73 65 74 20 20 20 20 20 20 2d 2d 20 52 65  heset      -- Re
88b0: 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69  strict to revisi
88c0: 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  ons of interest.
88d0: 09 20 20 20 20 41 4e 44 20 20 20 52 2e 69 73 64  .    AND   R.isd
88e0: 65 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20  efault          
88f0: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74     -- Restrict t
8900: 6f 20 4e 54 44 42 0a 09 20 20 20 20 41 4e 44 20  o NTDB..    AND 
8910: 20 20 52 2e 64 62 63 68 69 6c 64 20 49 53 20 4e    R.dbchild IS N
8920: 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d 20 61 6e 64  OT NULL   -- and
8930: 20 6c 61 73 74 20 4e 54 44 42 20 62 65 6c 6f 6e   last NTDB belon
8940: 67 69 6e 67 20 74 6f 20 74 72 75 6e 6b 0a 09 20  ging to trunk.. 
8950: 20 20 20 41 4e 44 20 20 20 52 41 2e 72 69 64 20     AND   RA.rid 
8960: 3d 20 52 2e 64 62 63 68 69 6c 64 20 20 20 20 20  = R.dbchild     
8970: 20 2d 2d 20 47 6f 20 64 69 72 65 63 74 6c 79 20   -- Go directly 
8980: 74 6f 20 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20  to trunk root.. 
8990: 20 20 20 41 4e 44 20 20 20 52 41 2e 63 68 69 6c     AND   RA.chil
89a0: 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  d IS NOT NULL   
89b0: 20 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20   -- Has primary 
89c0: 63 68 69 6c 64 2e 0a 20 20 20 20 20 20 20 20 20  child..         
89d0: 20 20 20 41 4e 44 20 20 20 52 41 2e 63 68 69 6c     AND   RA.chil
89e0: 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20  d IN $theset    
89f0: 20 2d 2d 20 57 68 69 63 68 20 69 73 20 61 6c 73   -- Which is als
8a00: 6f 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 7d  o of interest..}
8a10: 5d 5d 20 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73  ]] {..    # Cons
8a20: 69 64 65 72 20 6d 6f 76 69 6e 67 20 74 68 69 73  ider moving this
8a30: 20 74 6f 20 74 68 65 20 69 6e 74 65 67 72 69 74   to the integrit
8a40: 79 20 6d 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69  y module...    i
8a50: 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20  ntegrity assert 
8a60: 7b 24 72 69 64 20 21 3d 20 24 63 68 69 6c 64 7d  {$rid != $child}
8a70: 20 7b 52 65 76 69 73 69 6f 6e 20 24 72 69 64 20   {Revision $rid 
8a80: 64 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c  depends on itsel
8a90: 66 2e 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64  f.}..    lappend
8aa0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 24 72   dependencies($r
8ab0: 69 64 29 20 24 63 68 69 6c 64 0a 09 20 20 20 20  id) $child..    
8ac0: 73 65 74 20 64 65 70 28 24 72 69 64 2c 24 63 68  set dep($rid,$ch
8ad0: 69 6c 64 29 20 2e 0a 09 7d 0a 0a 09 23 20 54 68  ild) ...}...# Th
8ae0: 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 73  e sql statements
8af0: 20 61 62 6f 76 65 20 6c 6f 6f 6b 73 20 6f 6e 6c   above looks onl
8b00: 79 20 66 6f 72 20 64 69 72 65 63 74 20 64 65 70  y for direct dep
8b10: 65 6e 64 65 6e 63 69 65 73 0a 09 23 20 62 65 74  endencies..# bet
8b20: 77 65 65 6e 20 72 65 76 69 73 69 6f 6e 20 69 6e  ween revision in
8b30: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20   the changeset. 
8b40: 48 6f 77 65 76 65 72 20 64 75 65 20 74 6f 20 74  However due to t
8b50: 68 65 0a 09 23 20 76 61 67 61 72 69 65 73 20 6f  he..# vagaries o
8b60: 66 20 6d 65 74 61 20 64 61 74 61 20 69 74 20 69  f meta data it i
8b70: 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74  s possible for t
8b80: 77 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 0a  wo revisions of.
8b90: 09 23 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65  .# the same file
8ba0: 20 74 6f 20 65 6e 64 20 75 70 20 69 6e 20 74 68   to end up in th
8bb0: 65 20 73 61 6d 65 20 63 68 61 6e 67 65 73 65 74  e same changeset
8bc0: 2c 20 77 69 74 68 6f 75 74 20 61 0a 09 23 20 64  , without a..# d
8bd0: 69 72 65 63 74 20 64 65 70 65 6e 64 65 6e 63 79  irect dependency
8be0: 20 62 65 74 77 65 65 6e 20 74 68 65 6d 2e 20 48   between them. H
8bf0: 6f 77 65 76 65 72 20 77 65 20 6b 6e 6f 77 20 74  owever we know t
8c00: 68 61 74 20 74 68 65 72 65 0a 09 23 20 68 61 73  hat there..# has
8c10: 20 74 6f 20 62 65 20 61 20 61 6e 20 69 6e 64 69   to be a an indi
8c20: 72 65 63 74 20 64 65 70 65 6e 64 65 6e 63 79 2c  rect dependency,
8c30: 20 62 65 20 69 74 20 74 68 72 6f 75 67 68 20 70   be it through p
8c40: 72 69 6d 61 72 79 0a 09 23 20 63 68 69 6c 64 72  rimary..# childr
8c50: 65 6e 2c 20 62 72 61 6e 63 68 20 63 68 69 6c 64  en, branch child
8c60: 72 65 6e 2c 20 6f 72 20 61 20 63 6f 6d 62 69 6e  ren, or a combin
8c70: 61 74 69 6f 6e 20 74 68 65 72 65 6f 66 2e 0a 0a  ation thereof...
8c80: 09 23 20 57 65 20 6e 6f 77 20 66 69 6c 6c 20 69  .# We now fill i
8c90: 6e 20 74 68 65 73 65 20 70 73 65 75 64 6f 2d 64  n these pseudo-d
8ca0: 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 69 66 20  ependencies, if 
8cb0: 6e 6f 20 73 75 63 68 0a 09 23 20 64 65 70 65 6e  no such..# depen
8cc0: 64 65 6e 63 79 20 65 78 69 73 74 73 20 61 6c 72  dency exists alr
8cd0: 65 61 64 79 2e 20 54 68 65 20 64 69 72 65 63 74  eady. The direct
8ce0: 69 6f 6e 20 6f 66 20 74 68 65 20 64 65 70 65 6e  ion of the depen
8cf0: 64 65 6e 63 79 0a 09 23 20 69 73 20 61 63 74 75  dency..# is actu
8d00: 61 6c 6c 79 20 69 72 72 65 6c 65 76 61 6e 74 20  ally irrelevant 
8d10: 66 6f 72 20 74 68 69 73 2e 0a 0a 09 23 20 4e 4f  for this....# NO
8d20: 54 45 3a 20 54 68 69 73 20 69 73 20 64 69 66 66  TE: This is diff
8d30: 65 72 65 6e 74 20 66 72 6f 6d 20 63 76 73 32 73  erent from cvs2s
8d40: 76 6e 2e 20 4f 75 72 20 73 70 69 72 69 74 75 61  vn. Our spiritua
8d50: 6c 20 61 6e 63 65 73 74 6f 72 0a 09 23 20 64 6f  l ancestor..# do
8d60: 65 73 20 6e 6f 74 20 75 73 65 20 73 75 63 68 20  es not use such 
8d70: 70 73 65 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63  pseudo-dependenc
8d80: 69 65 73 2c 20 68 6f 77 65 76 65 72 20 69 74 20  ies, however it 
8d90: 75 73 65 73 20 61 0a 09 23 20 43 4f 4d 4d 49 54  uses a..# COMMIT
8da0: 5f 54 48 52 45 53 48 4f 4c 44 2c 20 61 20 74 69  _THRESHOLD, a ti
8db0: 6d 65 20 69 6e 74 65 72 76 61 6c 20 63 6f 6d 6d  me interval comm
8dc0: 69 74 73 20 73 68 6f 75 6c 64 20 66 61 6c 6c 2e  its should fall.
8dd0: 20 54 68 69 73 0a 09 23 20 77 69 6c 6c 20 67 72   This..# will gr
8de0: 65 61 74 6c 79 20 72 65 64 75 63 65 73 20 74 68  eatly reduces th
8df0: 65 20 72 69 73 6b 20 6f 66 20 67 65 74 74 69 6e  e risk of gettin
8e00: 67 20 66 61 72 20 73 65 70 61 72 61 74 65 64 0a  g far separated.
8e10: 09 23 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20  .# revisions of 
8e20: 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 6e  the same file in
8e30: 74 6f 20 6f 6e 65 20 63 68 61 6e 67 65 73 65 74  to one changeset
8e40: 2e 0a 0a 09 23 20 57 65 20 61 6c 6c 6f 77 20 72  ....# We allow r
8e50: 65 76 69 73 69 6f 6e 73 20 74 6f 20 62 65 20 66  evisions to be f
8e60: 61 72 20 61 70 61 72 74 20 69 6e 20 74 69 6d 65  ar apart in time
8e70: 20 69 6e 20 74 68 65 20 73 61 6d 65 0a 09 23 20   in the same..# 
8e80: 63 68 61 6e 67 65 73 65 74 2c 20 62 75 74 20 69  changeset, but i
8e90: 6e 20 74 75 72 6e 20 6e 65 65 64 20 74 68 65 20  n turn need the 
8ea0: 70 73 65 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63  pseudo-dependenc
8eb0: 69 65 73 20 74 6f 0a 09 23 20 68 61 6e 64 6c 65  ies to..# handle
8ec0: 20 74 68 69 73 2e 0a 0a 09 6c 6f 67 20 77 72 69   this....log wri
8ed0: 74 65 20 31 34 20 63 73 65 74 73 20 7b 69 6e 74  te 14 csets {int
8ee0: 65 72 6e 61 6c 20 20 5b 61 72 72 61 79 20 73 69  ernal  [array si
8ef0: 7a 65 20 64 65 70 5d 7d 0a 09 6c 6f 67 20 77 72  ze dep]}..log wr
8f00: 69 74 65 20 31 34 20 63 73 65 74 73 20 7b 63 6f  ite 14 csets {co
8f10: 6c 6c 65 63 74 65 64 20 5b 61 72 72 61 79 20 73  llected [array s
8f20: 69 7a 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73  ize dependencies
8f30: 5d 7d 0a 09 6c 6f 67 20 77 72 69 74 65 20 31 34  ]}..log write 14
8f40: 20 63 73 65 74 73 20 70 73 65 75 64 6f 2d 69 6e   csets pseudo-in
8f50: 74 65 72 6e 61 6c 73 75 63 63 65 73 73 6f 72 73  ternalsuccessors
8f60: 0a 0a 09 61 72 72 61 79 20 73 65 74 20 66 69 64  ...array set fid
8f70: 73 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72  s {}..foreach {r
8f80: 69 64 20 66 69 64 7d 20 5b 73 74 61 74 65 20 72  id fid} [state r
8f90: 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d  un [subst -nocom
8fa0: 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61  mands -nobacksla
8fb0: 73 68 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45  shes {..    SELE
8fc0: 43 54 20 52 2e 72 69 64 2c 20 52 2e 66 69 64 0a  CT R.rid, R.fid.
8fd0: 20 20 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d              FROM
8fe0: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 20 20     revision R.  
8ff0: 20 20 20 20 20 20 20 20 20 20 57 48 45 52 45 20            WHERE 
9000: 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65   R.rid IN $these
9010: 74 0a 09 7d 5d 5d 20 7b 20 6c 61 70 70 65 6e 64  t..}]] { lappend
9020: 20 66 69 64 73 28 24 66 69 64 29 20 24 72 69 64   fids($fid) $rid
9030: 20 7d 0a 0a 09 73 65 74 20 67 72 6f 75 70 73 20   }...set groups 
9040: 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 66 69 64  {}..foreach {fid
9050: 20 72 69 64 73 7d 20 5b 61 72 72 61 79 20 67 65   rids} [array ge
9060: 74 20 66 69 64 73 5d 20 7b 0a 09 20 20 20 20 69  t fids] {..    i
9070: 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 72 69 64  f {[llength $rid
9080: 73 5d 20 3c 20 32 7d 20 63 6f 6e 74 69 6e 75 65  s] < 2} continue
9090: 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 61 20  ..    foreach a 
90a0: 24 72 69 64 73 20 7b 0a 09 09 66 6f 72 65 61 63  $rids {...foreac
90b0: 68 20 62 20 24 72 69 64 73 20 7b 0a 09 09 20 20  h b $rids {...  
90c0: 20 20 69 66 20 7b 24 61 20 3d 3d 20 24 62 7d 20    if {$a == $b} 
90d0: 63 6f 6e 74 69 6e 75 65 0a 09 09 20 20 20 20 69  continue...    i
90e0: 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20  f {[info exists 
90f0: 64 65 70 28 24 61 2c 24 62 29 5d 7d 20 63 6f 6e  dep($a,$b)]} con
9100: 74 69 6e 75 65 0a 09 09 20 20 20 20 69 66 20 7b  tinue...    if {
9110: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64 65 70  [info exists dep
9120: 28 24 62 2c 24 61 29 5d 7d 20 63 6f 6e 74 69 6e  ($b,$a)]} contin
9130: 75 65 0a 09 09 20 20 20 20 6c 61 70 70 65 6e 64  ue...    lappend
9140: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 24 61   dependencies($a
9150: 29 20 24 62 0a 09 09 20 20 20 20 73 65 74 20 64  ) $b...    set d
9160: 65 70 28 24 61 2c 24 62 29 20 2e 0a 09 09 20 20  ep($a,$b) ....  
9170: 20 20 73 65 74 20 64 65 70 28 24 62 2c 24 61 29    set dep($b,$a)
9180: 20 2e 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20   ....}..    }.. 
9190: 20 20 20 73 65 74 20 6e 20 5b 6c 6c 65 6e 67 74     set n [llengt
91a0: 68 20 24 72 69 64 73 5d 0a 09 20 20 20 20 6c 61  h $rids]..    la
91b0: 70 70 65 6e 64 20 67 72 6f 75 70 73 20 5b 6c 69  ppend groups [li
91c0: 73 74 20 24 6e 20 5b 65 78 70 72 20 7b 28 24 6e  st $n [expr {($n
91d0: 2a 24 6e 2d 24 6e 29 2f 32 7d 5d 5d 0a 09 7d 0a  *$n-$n)/2}]]..}.
91e0: 0a 09 6c 6f 67 20 77 72 69 74 65 20 31 34 20 63  ..log write 14 c
91f0: 73 65 74 73 20 7b 70 73 65 75 64 6f 20 20 20 20  sets {pseudo    
9200: 5b 61 72 72 61 79 20 73 69 7a 65 20 66 69 64 73  [array size fids
9210: 5d 20 28 5b 6c 73 6f 72 74 20 2d 69 6e 64 65 78  ] ([lsort -index
9220: 20 30 20 2d 64 65 63 72 65 61 73 69 6e 67 20 2d   0 -decreasing -
9230: 69 6e 74 65 67 65 72 20 24 67 72 6f 75 70 73 5d  integer $groups]
9240: 29 7d 0a 09 6c 6f 67 20 77 72 69 74 65 20 31 34  )}..log write 14
9250: 20 63 73 65 74 73 20 7b 69 6e 74 65 72 6e 61 6c   csets {internal
9260: 20 20 5b 61 72 72 61 79 20 73 69 7a 65 20 64 65    [array size de
9270: 70 5d 7d 0a 09 6c 6f 67 20 77 72 69 74 65 20 31  p]}..log write 1
9280: 34 20 63 73 65 74 73 20 7b 63 6f 6c 6c 65 63 74  4 csets {collect
9290: 65 64 20 5b 61 72 72 61 79 20 73 69 7a 65 20 64  ed [array size d
92a0: 65 70 65 6e 64 65 6e 63 69 65 73 5d 7d 0a 09 6c  ependencies]}..l
92b0: 6f 67 20 77 72 69 74 65 20 31 34 20 63 73 65 74  og write 14 cset
92c0: 73 20 63 6f 6d 70 6c 65 74 65 0a 09 72 65 74 75  s complete..retu
92d0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  rn.    }..    # 
92e0: 72 65 73 75 6c 74 20 3d 20 34 2d 6c 69 73 74 20  result = 4-list 
92f0: 28 69 74 65 6d 74 79 70 65 20 69 74 65 6d 69 64  (itemtype itemid
9300: 20 6e 65 78 74 69 74 65 6d 74 79 70 65 20 6e 65   nextitemtype ne
9310: 78 74 69 74 65 6d 69 64 20 2e 2e 2e 29 0a 20 20  xtitemid ...).  
9320: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c 6f 6f    typemethod loo
9330: 70 73 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b  ps {revisions} {
9340: 0a 09 23 20 4e 6f 74 65 3a 20 54 61 67 73 20 61  ..# Note: Tags a
9350: 6e 64 20 62 72 61 6e 63 68 65 73 20 63 61 6e 6e  nd branches cann
9360: 6f 74 20 63 61 75 73 65 20 74 68 65 20 6c 6f 6f  ot cause the loo
9370: 70 2e 20 54 68 65 69 72 20 69 64 27 73 2c 0a 09  p. Their id's,..
9380: 23 20 62 65 69 6e 67 20 6f 66 20 61 20 66 75 6e  # being of a fun
9390: 64 61 6d 65 6e 74 61 6c 6c 79 20 64 69 66 66 65  damentally diffe
93a0: 72 65 6e 74 20 74 79 70 65 20 74 68 61 6e 20 74  rent type than t
93b0: 68 65 20 72 65 76 69 73 69 6f 6e 73 0a 09 23 20  he revisions..# 
93c0: 63 6f 6d 69 6e 67 20 69 6e 20 63 61 6e 6e 6f 74  coming in cannot
93d0: 20 62 65 20 69 6e 20 74 68 65 20 73 65 74 2e 0a   be in the set..
93e0: 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b  ..set theset ('[
93f0: 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20  join $revisions 
9400: 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e  {','}]')..return
9410: 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62   [state run [sub
9420: 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d  st -nocommands -
9430: 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a  nobackslashes {.
9440: 09 20 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d  .    -- (1) Prim
9450: 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20 53  ary child..    S
9460: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63  ELECT R.rid, R.c
9470: 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  hild..    FROM  
9480: 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20   revision R..   
9490: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20   WHERE  R.rid   
94a0: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d  IN $theset     -
94b0: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65  - Restrict to re
94c0: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72  visions of inter
94d0: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  est..    AND    
94e0: 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e  R.child IS NOT N
94f0: 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72  ULL    -- Has pr
9500: 69 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20  imary child..   
9510: 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20   AND    R.child 
9520: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d  IN $theset     -
9530: 2d 20 4c 6f 6f 70 0a 09 20 20 20 20 2d 2d 0a 09  - Loop..    --..
9540: 20 20 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 2d      UNION..    -
9550: 2d 20 28 32 29 20 53 65 63 6f 6e 64 61 72 79 20  - (2) Secondary 
9560: 28 62 72 61 6e 63 68 29 20 63 68 69 6c 64 72 65  (branch) childre
9570: 6e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e  n..    SELECT R.
9580: 72 69 64 2c 20 42 2e 62 72 69 64 0a 09 20 20 20  rid, B.brid..   
9590: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
95a0: 20 52 2c 20 72 65 76 69 73 69 6f 6e 62 72 61 6e   R, revisionbran
95b0: 63 68 63 68 69 6c 64 72 65 6e 20 42 0a 09 20 20  chchildren B..  
95c0: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20    WHERE  R.rid  
95d0: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20   IN $theset     
95e0: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72  -- Restrict to r
95f0: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65  evisions of inte
9600: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
9610: 20 52 2e 72 69 64 20 3d 20 42 2e 72 69 64 20 20   R.rid = B.rid  
9620: 20 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63          -- Selec
9630: 74 20 73 75 62 73 65 74 20 6f 66 20 62 72 61 6e  t subset of bran
9640: 63 68 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20  ch children..   
9650: 20 41 4e 44 20 20 20 20 42 2e 72 69 64 20 20 20   AND    B.rid   
9660: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d  IN $theset     -
9670: 2d 20 4c 6f 6f 70 0a 09 20 20 20 20 2d 2d 0a 09  - Loop..    --..
9680: 20 20 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 2d      UNION..    -
9690: 2d 20 28 34 29 20 43 68 69 6c 64 20 6f 66 20 74  - (4) Child of t
96a0: 72 75 6e 6b 20 72 6f 6f 74 20 73 75 63 63 65 73  runk root succes
96b0: 73 6f 72 20 6f 66 20 6c 61 73 74 20 4e 54 44 42  sor of last NTDB
96c0: 20 6f 6e 20 74 72 75 6e 6b 2e 0a 09 20 20 20 20   on trunk...    
96d0: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 41  SELECT R.rid, RA
96e0: 2e 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d  .child..    FROM
96f0: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72     revision R, r
9700: 65 76 69 73 69 6f 6e 20 52 41 0a 09 20 20 20 20  evision RA..    
9710: 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 20  WHERE  R.rid    
9720: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d  IN $theset     -
9730: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65  - Restrict to re
9740: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72  visions of inter
9750: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  est..    AND    
9760: 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20 20  R.isdefault     
9770: 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72          -- Restr
9780: 69 63 74 20 74 6f 20 4e 54 44 42 0a 09 20 20 20  ict to NTDB..   
9790: 20 41 4e 44 20 20 20 20 52 2e 64 62 63 68 69 6c   AND    R.dbchil
97a0: 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  d IS NOT NULL   
97b0: 2d 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 42  -- and last NTDB
97c0: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72   belonging to tr
97d0: 75 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 20  unk..    AND    
97e0: 52 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69  RA.rid = R.dbchi
97f0: 6c 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69  ld      -- Go di
9800: 72 65 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20  rectly to trunk 
9810: 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20  root..    AND   
9820: 20 52 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54   RA.child IS NOT
9830: 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20   NULL    -- Has 
9840: 70 72 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 09  primary child...
9850: 20 20 20 20 41 4e 44 20 20 20 20 52 41 2e 63 68      AND    RA.ch
9860: 69 6c 64 20 49 4e 20 24 74 68 65 73 65 74 20 20  ild IN $theset  
9870: 20 20 20 2d 2d 20 4c 6f 6f 70 0a 09 7d 5d 5d 0a     -- Loop..}]].
9880: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72      }..    # var
9890: 28 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 65  (dv) = dict (ite
98a0: 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29  m -> list (item)
98b0: 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20  ), item  = list 
98c0: 28 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 79  (type id).    ty
98d0: 70 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73  pemethod success
98e0: 6f 72 73 20 7b 64 76 20 72 65 76 69 73 69 6f 6e  ors {dv revision
98f0: 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64  s} {..upvar 1 $d
9900: 76 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09  v dependencies..
9910: 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f  set theset ('[jo
9920: 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27  in $revisions {'
9930: 2c 27 7d 5d 27 29 0a 0a 09 23 20 54 68 65 20 66  ,'}]')...# The f
9940: 6f 6c 6c 6f 77 69 6e 67 20 63 61 73 65 73 20 73  ollowing cases s
9950: 70 65 63 69 66 79 20 77 68 65 6e 20 61 20 72 65  pecify when a re
9960: 76 69 73 69 6f 6e 20 53 20 69 73 20 61 20 73 75  vision S is a su
9970: 63 63 65 73 73 6f 72 0a 09 23 20 6f 66 20 61 20  ccessor..# of a 
9980: 72 65 76 69 73 69 6f 6e 20 52 2e 20 45 61 63 68  revision R. Each
9990: 20 6f 66 20 74 68 65 20 63 61 73 65 73 20 74 72   of the cases tr
99a0: 61 6e 73 6c 61 74 65 73 20 69 6e 74 6f 20 6f 6e  anslates into on
99b0: 65 20 6f 66 0a 09 23 20 74 68 65 20 62 72 61 6e  e of..# the bran
99c0: 63 68 65 73 20 6f 66 20 74 68 65 20 53 51 4c 20  ches of the SQL 
99d0: 55 4e 49 4f 4e 20 63 6f 6d 69 6e 67 20 62 65 6c  UNION coming bel
99e0: 6f 77 2e 0a 09 23 0a 09 23 20 28 31 29 20 53 20  ow...#..# (1) S 
99f0: 63 61 6e 20 62 65 20 61 20 70 72 69 6d 61 72 79  can be a primary
9a00: 20 63 68 69 6c 64 20 6f 66 20 52 2c 20 69 2e 65   child of R, i.e
9a10: 2e 20 69 6e 20 74 68 65 20 73 61 6d 65 20 4c 4f  . in the same LO
9a20: 44 2e 20 52 0a 09 23 20 20 20 20 20 72 65 66 65  D. R..#     refe
9a30: 72 65 6e 63 65 73 20 53 20 64 69 72 65 63 74 6c  rences S directl
9a40: 79 2e 20 52 2e 63 68 69 6c 64 20 3d 20 53 28 2e  y. R.child = S(.
9a50: 72 69 64 29 2c 20 69 66 20 69 74 20 65 78 69 73  rid), if it exis
9a60: 74 73 2e 0a 09 23 0a 09 23 20 28 32 29 20 53 20  ts...#..# (2) S 
9a70: 63 61 6e 20 62 65 20 61 20 73 65 63 6f 6e 64 61  can be a seconda
9a80: 72 79 2c 20 69 2e 65 2e 20 62 72 61 6e 63 68 2c  ry, i.e. branch,
9a90: 20 63 68 69 6c 64 20 6f 66 20 52 2e 20 48 65 72   child of R. Her
9aa0: 65 20 74 68 65 0a 09 23 20 20 20 20 20 6c 69 6e  e the..#     lin
9ab0: 6b 20 69 73 20 6d 61 64 65 20 74 68 72 6f 75 67  k is made throug
9ac0: 68 20 74 68 65 20 68 65 6c 70 65 72 20 74 61 62  h the helper tab
9ad0: 6c 65 0a 09 23 20 20 20 20 20 52 45 56 49 53 49  le..#     REVISI
9ae0: 4f 4e 42 52 41 4e 43 48 43 48 49 4c 44 52 45 4e  ONBRANCHCHILDREN
9af0: 2e 20 52 2e 72 69 64 20 2d 3e 20 52 42 43 2e 72  . R.rid -> RBC.r
9b00: 69 64 2c 20 52 42 43 2e 62 72 69 64 20 3d 0a 09  id, RBC.brid =..
9b10: 23 20 20 20 20 20 53 28 2e 72 69 64 29 0a 09 23  #     S(.rid)..#
9b20: 0a 09 23 20 28 33 29 20 4f 72 69 67 69 6e 61 6c  ..# (3) Original
9b30: 6c 79 20 74 68 69 73 20 75 73 65 20 63 61 73 65  ly this use case
9b40: 20 64 65 66 69 6e 65 64 20 74 68 65 20 72 6f 6f   defined the roo
9b50: 74 20 6f 66 20 61 20 64 65 74 61 63 68 65 64 0a  t of a detached.
9b60: 09 23 20 20 20 20 20 4e 54 44 42 20 61 73 20 74  .#     NTDB as t
9b70: 68 65 20 73 75 63 63 65 73 73 6f 72 20 6f 66 20  he successor of 
9b80: 74 68 65 20 74 72 75 6e 6b 20 72 6f 6f 74 2e 20  the trunk root. 
9b90: 54 68 69 73 20 6c 65 61 64 73 20 74 6f 20 61 0a  This leads to a.
9ba0: 09 23 20 20 20 20 20 62 61 64 20 74 61 6e 67 6c  .#     bad tangl
9bb0: 65 20 6c 61 74 65 72 20 6f 6e 2e 20 57 69 74 68  e later on. With
9bc0: 20 61 20 64 65 74 61 63 68 65 64 20 4e 54 44 42   a detached NTDB
9bd0: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 0a 09 23   the original..#
9be0: 20 20 20 20 20 74 72 75 6e 6b 20 72 6f 6f 74 20       trunk root 
9bf0: 72 65 76 69 73 69 6f 6e 20 77 61 73 20 72 65 6d  revision was rem
9c00: 6f 76 65 64 20 61 73 20 69 72 72 65 6c 65 76 61  oved as irreleva
9c10: 6e 74 2c 20 61 6c 6c 6f 77 69 6e 67 0a 09 23 20  nt, allowing..# 
9c20: 20 20 20 20 74 68 65 20 6e 6f 6d 69 6e 61 6c 20      the nominal 
9c30: 72 6f 6f 74 20 74 6f 20 62 65 20 6c 61 74 65 72  root to be later
9c40: 20 69 6e 20 74 69 6d 65 20 74 68 61 6e 20 74 68   in time than th
9c50: 65 20 4e 54 44 42 0a 09 23 20 20 20 20 20 72 6f  e NTDB..#     ro
9c60: 6f 74 2e 20 4e 6f 77 20 73 65 74 74 69 6e 67 20  ot. Now setting 
9c70: 74 68 69 73 20 64 65 70 65 6e 64 65 6e 63 79 20  this dependency 
9c80: 77 69 6c 6c 20 62 65 20 62 61 63 6b 77 61 72 64  will be backward
9c90: 20 69 6e 0a 09 23 20 20 20 20 20 74 69 6d 65 2e   in..#     time.
9ca0: 20 52 45 4d 4f 56 45 44 2e 0a 09 23 0a 09 23 20   REMOVED...#..# 
9cb0: 28 34 29 20 49 66 20 52 20 69 73 20 74 68 65 20  (4) If R is the 
9cc0: 6c 61 73 74 20 6f 66 20 74 68 65 20 4e 54 44 42  last of the NTDB
9cd0: 20 72 65 76 69 73 69 6f 6e 73 20 77 68 69 63 68   revisions which
9ce0: 20 62 65 6c 6f 6e 67 20 74 6f 0a 09 23 20 20 20   belong to..#   
9cf0: 20 20 74 68 65 20 74 72 75 6e 6b 2c 20 74 68 65    the trunk, the
9d00: 6e 20 74 68 65 20 70 72 69 6d 61 72 79 20 63 68  n the primary ch
9d10: 69 6c 64 20 6f 66 20 74 68 65 20 74 72 75 6e 6b  ild of the trunk
9d20: 20 72 6f 6f 74 20 28 74 68 65 0a 09 23 20 20 20   root (the..#   
9d30: 20 20 27 31 2e 32 27 20 72 65 76 69 73 69 6f 6e    '1.2' revision
9d40: 29 20 69 73 20 61 20 73 75 63 63 65 73 73 6f 72  ) is a successor
9d50: 2c 20 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a  , if it exists..
9d60: 0a 09 23 20 4e 6f 74 65 20 74 68 61 74 20 74 68  ..# Note that th
9d70: 65 20 62 72 61 6e 63 68 65 73 20 73 70 61 77 6e  e branches spawn
9d80: 65 64 20 66 72 6f 6d 20 74 68 65 20 72 65 76 69  ed from the revi
9d90: 73 69 6f 6e 73 2c 20 61 6e 64 20 74 68 65 0a 09  sions, and the..
9da0: 23 20 74 61 67 73 20 61 73 73 6f 63 69 61 74 65  # tags associate
9db0: 64 20 77 69 74 68 20 74 68 65 6d 20 61 72 65 20  d with them are 
9dc0: 73 75 63 63 65 73 73 6f 72 73 20 61 73 20 77 65  successors as we
9dd0: 6c 6c 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72  ll....foreach {r
9de0: 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65  id child} [state
9df0: 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63   run [subst -noc
9e00: 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73  ommands -nobacks
9e10: 6c 61 73 68 65 73 20 7b 0a 20 20 20 20 2d 2d 20  lashes {.    -- 
9e20: 28 31 29 20 50 72 69 6d 61 72 79 20 63 68 69 6c  (1) Primary chil
9e30: 64 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e  d..    SELECT R.
9e40: 72 69 64 2c 20 52 2e 63 68 69 6c 64 0a 09 20 20  rid, R.child..  
9e50: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f    FROM   revisio
9e60: 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 20  n R..    WHERE  
9e70: 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73  R.rid   IN $thes
9e80: 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69  et     -- Restri
9e90: 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20  ct to revisions 
9ea0: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20  of interest..   
9eb0: 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20   AND    R.child 
9ec0: 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d  IS NOT NULL    -
9ed0: 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 68  - Has primary ch
9ee0: 69 6c 64 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20  ild.    UNION.  
9ef0: 20 20 2d 2d 20 28 32 29 20 53 65 63 6f 6e 64 61    -- (2) Seconda
9f00: 72 79 20 28 62 72 61 6e 63 68 29 20 63 68 69 6c  ry (branch) chil
9f10: 64 72 65 6e 0a 09 20 20 20 20 53 45 4c 45 43 54  dren..    SELECT
9f20: 20 52 2e 72 69 64 2c 20 42 2e 62 72 69 64 0a 09   R.rid, B.brid..
9f30: 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73      FROM   revis
9f40: 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 62  ion R, revisionb
9f50: 72 61 6e 63 68 63 68 69 6c 64 72 65 6e 20 42 0a  ranchchildren B.
9f60: 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69  .    WHERE  R.ri
9f70: 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20  d   IN $theset  
9f80: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74     -- Restrict t
9f90: 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69  o revisions of i
9fa0: 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44  nterest..    AND
9fb0: 20 20 20 20 52 2e 72 69 64 20 3d 20 42 2e 72 69      R.rid = B.ri
9fc0: 64 20 20 20 20 20 20 20 20 20 20 2d 2d 20 53 65  d          -- Se
9fd0: 6c 65 63 74 20 73 75 62 73 65 74 20 6f 66 20 62  lect subset of b
9fe0: 72 61 6e 63 68 20 63 68 69 6c 64 72 65 6e 0a 20  ranch children. 
9ff0: 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20     UNION.    -- 
a000: 28 34 29 20 43 68 69 6c 64 20 6f 66 20 74 72 75  (4) Child of tru
a010: 6e 6b 20 72 6f 6f 74 20 73 75 63 63 65 73 73 6f  nk root successo
a020: 72 20 6f 66 20 6c 61 73 74 20 4e 54 44 42 20 6f  r of last NTDB o
a030: 6e 20 74 72 75 6e 6b 2e 0a 09 20 20 20 20 53 45  n trunk...    SE
a040: 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 41 2e 63  LECT R.rid, RA.c
a050: 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 72  hild..    FROM r
a060: 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73  evision R, revis
a070: 69 6f 6e 20 52 41 0a 09 20 20 20 20 57 48 45 52  ion RA..    WHER
a080: 45 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68  E R.rid   IN $th
a090: 65 73 65 74 20 20 20 20 20 20 2d 2d 20 52 65 73  eset      -- Res
a0a0: 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f  trict to revisio
a0b0: 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09  ns of interest..
a0c0: 20 20 20 20 41 4e 44 20 20 20 52 2e 69 73 64 65      AND   R.isde
a0d0: 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  fault           
a0e0: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f    -- Restrict to
a0f0: 20 4e 54 44 42 0a 09 20 20 20 20 41 4e 44 20 20   NTDB..    AND  
a100: 20 52 2e 64 62 63 68 69 6c 64 20 49 53 20 4e 4f   R.dbchild IS NO
a110: 54 20 4e 55 4c 4c 20 20 20 2d 2d 20 61 6e 64 20  T NULL   -- and 
a120: 6c 61 73 74 20 4e 54 44 42 20 62 65 6c 6f 6e 67  last NTDB belong
a130: 69 6e 67 20 74 6f 20 74 72 75 6e 6b 0a 09 20 20  ing to trunk..  
a140: 20 20 41 4e 44 20 20 20 52 41 2e 72 69 64 20 3d    AND   RA.rid =
a150: 20 52 2e 64 62 63 68 69 6c 64 20 20 20 20 20 20   R.dbchild      
a160: 2d 2d 20 47 6f 20 64 69 72 65 63 74 6c 79 20 74  -- Go directly t
a170: 6f 20 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20  o trunk root..  
a180: 20 20 41 4e 44 20 20 20 52 41 2e 63 68 69 6c 64    AND   RA.child
a190: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
a1a0: 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 63  -- Has primary c
a1b0: 68 69 6c 64 2e 0a 09 7d 5d 5d 20 7b 0a 09 20 20  hild...}]] {..  
a1c0: 20 20 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76    # Consider mov
a1d0: 69 6e 67 20 74 68 69 73 20 74 6f 20 74 68 65 20  ing this to the 
a1e0: 69 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 6c 65  integrity module
a1f0: 2e 0a 09 20 20 20 20 69 6e 74 65 67 72 69 74 79  ...    integrity
a200: 20 61 73 73 65 72 74 20 7b 24 72 69 64 20 21 3d   assert {$rid !=
a210: 20 24 63 68 69 6c 64 7d 20 7b 52 65 76 69 73 69   $child} {Revisi
a220: 6f 6e 20 24 72 69 64 20 64 65 70 65 6e 64 73 20  on $rid depends 
a230: 6f 6e 20 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20  on itself.}..   
a240: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65   lappend depende
a250: 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 65 76 20  ncies([list rev 
a260: 24 72 69 64 5d 29 20 5b 6c 69 73 74 20 72 65 76  $rid]) [list rev
a270: 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72   $child]..}..for
a280: 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 7d  each {rid child}
a290: 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62   [state run [sub
a2a0: 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d  st -nocommands -
a2b0: 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a  nobackslashes {.
a2c0: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69  .    SELECT R.ri
a2d0: 64 2c 20 54 2e 74 69 64 0a 09 20 20 20 20 46 52  d, T.tid..    FR
a2e0: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c  OM   revision R,
a2f0: 20 74 61 67 20 54 0a 09 20 20 20 20 57 48 45 52   tag T..    WHER
a300: 45 20 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65  E  R.rid IN $the
a310: 73 65 74 20 20 20 20 20 20 20 2d 2d 20 52 65 73  set       -- Res
a320: 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f  trict to revisio
a330: 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09  ns of interest..
a340: 20 20 20 20 41 4e 44 20 20 20 20 54 2e 72 65 76      AND    T.rev
a350: 20 3d 20 52 2e 72 69 64 20 20 20 20 20 20 20 20   = R.rid        
a360: 20 20 2d 2d 20 53 65 6c 65 63 74 20 74 61 67 73    -- Select tags
a370: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
a380: 6d 0a 09 7d 5d 5d 20 7b 0a 09 20 20 20 20 6c 61  m..}]] {..    la
a390: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69  ppend dependenci
a3a0: 65 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69  es([list rev $ri
a3b0: 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74  d]) [list sym::t
a3c0: 61 67 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66  ag $child]..}..f
a3d0: 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c  oreach {rid chil
a3e0: 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73  d} [state run [s
a3f0: 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73  ubst -nocommands
a400: 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20   -nobackslashes 
a410: 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e  {..    SELECT R.
a420: 72 69 64 2c 20 42 2e 62 69 64 0a 09 20 20 20 20  rid, B.bid..    
a430: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20  FROM   revision 
a440: 52 2c 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20  R, branch B..   
a450: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 49 4e   WHERE  R.rid IN
a460: 20 24 74 68 65 73 65 74 20 20 20 20 20 20 20 2d   $theset       -
a470: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65  - Restrict to re
a480: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72  visions of inter
a490: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  est..    AND    
a4a0: 42 2e 72 6f 6f 74 20 3d 20 52 2e 72 69 64 20 20  B.root = R.rid  
a4b0: 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74         -- Select
a4c0: 20 62 72 61 6e 63 68 65 73 20 61 74 74 61 63 68   branches attach
a4d0: 65 64 20 74 6f 20 74 68 65 6d 0a 09 7d 5d 5d 20  ed to them..}]] 
a4e0: 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64  {..    lappend d
a4f0: 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73  ependencies([lis
a500: 74 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c 69  t rev $rid]) [li
a510: 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24  st sym::branch $
a520: 63 68 69 6c 64 5d 0a 09 7d 0a 09 72 65 74 75 72  child]..}..retur
a530: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72  n.    }..    # r
a540: 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 63 68  esult = list (ch
a550: 61 6e 67 65 73 65 74 2d 69 64 29 0a 20 20 20 20  angeset-id).    
a560: 74 79 70 65 6d 65 74 68 6f 64 20 63 73 5f 73 75  typemethod cs_su
a570: 63 63 65 73 73 6f 72 73 20 7b 72 65 76 69 73 69  ccessors {revisi
a580: 6f 6e 73 7d 20 7b 0a 20 20 20 20 20 20 20 20 23  ons} {.        #
a590: 20 54 68 69 73 20 69 73 20 61 20 76 61 72 69 61   This is a varia
a5a0: 6e 74 20 6f 66 20 27 73 75 63 63 65 73 73 6f 72  nt of 'successor
a5b0: 73 27 20 77 68 69 63 68 20 6d 61 70 73 20 74 68  s' which maps th
a5c0: 65 20 6c 6f 77 2d 6c 65 76 65 6c 0a 20 20 20 20  e low-level.    
a5d0: 20 20 20 20 23 20 64 61 74 61 20 64 69 72 65 63      # data direc
a5e0: 74 6c 79 20 74 6f 20 74 68 65 20 61 73 73 6f 63  tly to the assoc
a5f0: 69 61 74 65 64 20 63 68 61 6e 67 65 73 65 74 73  iated changesets
a600: 2e 20 49 2e 65 2e 20 69 6e 73 74 65 61 64 0a 20  . I.e. instead. 
a610: 20 20 20 20 20 20 20 23 20 6d 69 6c 6c 69 6f 6e         # million
a620: 73 20 6f 66 20 64 65 70 65 6e 64 65 6e 63 79 20  s of dependency 
a630: 70 61 69 72 73 20 28 69 6e 20 65 78 74 72 65 6d  pairs (in extrem
a640: 65 20 63 61 73 65 73 20 28 45 78 61 6d 70 6c 65  e cases (Example
a650: 3a 20 54 63 6c 0a 20 20 20 20 20 20 20 20 23 20  : Tcl.        # 
a660: 43 56 53 29 29 20 77 65 20 72 65 74 75 72 6e 20  CVS)) we return 
a670: 61 20 76 65 72 79 20 73 68 6f 72 74 20 61 6e 64  a very short and
a680: 20 6d 75 63 68 20 6d 6f 72 65 20 6d 61 6e 61 67   much more manag
a690: 65 61 62 6c 65 20 6c 69 73 74 0a 20 20 20 20 20  eable list.     
a6a0: 20 20 20 23 20 6f 66 20 63 68 61 6e 67 65 73 65     # of changese
a6b0: 74 73 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74  ts....set theset
a6c0: 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69   ('[join $revisi
a6d0: 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65  ons {','}]')..re
a6e0: 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20  turn [state run 
a6f0: 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e  [subst -nocomman
a700: 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65  ds -nobackslashe
a710: 73 20 7b 0a 20 20 20 20 2d 2d 20 28 31 29 20 50  s {.    -- (1) P
a720: 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20  rimary child..  
a730: 20 20 53 45 4c 45 43 54 20 43 2e 63 69 64 0a 09    SELECT C.cid..
a740: 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73      FROM   revis
a750: 69 6f 6e 20 52 2c 20 63 73 69 74 65 6d 20 43 49  ion R, csitem CI
a760: 2c 20 63 68 61 6e 67 65 73 65 74 20 43 0a 09 20  , changeset C.. 
a770: 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20     WHERE  R.rid 
a780: 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20    IN $theset    
a790: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
a7a0: 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74  revisions of int
a7b0: 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20  erest..    AND  
a7c0: 20 20 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54    R.child IS NOT
a7d0: 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20   NULL    -- Has 
a7e0: 70 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 20 20  primary child.  
a7f0: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20            AND   
a800: 20 43 49 2e 69 69 64 20 3d 20 52 2e 63 68 69 6c   CI.iid = R.chil
a810: 64 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63  d       -- Selec
a820: 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 65 74 73  t all changesets
a830: 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44  .            AND
a840: 20 20 20 20 43 2e 63 69 64 20 3d 20 43 49 2e 63      C.cid = CI.c
a850: 69 64 20 20 20 20 20 20 20 20 20 2d 2d 20 63 6f  id         -- co
a860: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70 72 69  ntaining the pri
a870: 6d 61 72 79 20 63 68 69 6c 64 0a 20 20 20 20 20  mary child.     
a880: 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e         AND    C.
a890: 74 79 70 65 20 3d 20 30 20 20 20 20 20 20 20 20  type = 0        
a8a0: 20 20 20 20 20 2d 2d 20 77 68 69 63 68 20 61 72       -- which ar
a8b0: 65 20 72 65 76 69 73 69 6f 6e 20 63 68 61 6e 67  e revision chang
a8c0: 65 73 65 74 73 0a 20 20 20 20 55 4e 49 4f 4e 0a  esets.    UNION.
a8d0: 20 20 20 20 2d 2d 20 28 32 29 20 53 65 63 6f 6e      -- (2) Secon
a8e0: 64 61 72 79 20 28 62 72 61 6e 63 68 29 20 63 68  dary (branch) ch
a8f0: 69 6c 64 72 65 6e 0a 09 20 20 20 20 53 45 4c 45  ildren..    SELE
a900: 43 54 20 43 2e 63 69 64 0a 09 20 20 20 20 46 52  CT C.cid..    FR
a910: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c  OM   revision R,
a920: 20 72 65 76 69 73 69 6f 6e 62 72 61 6e 63 68 63   revisionbranchc
a930: 68 69 6c 64 72 65 6e 20 42 2c 20 63 73 69 74 65  hildren B, csite
a940: 6d 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20  m CI, changeset 
a950: 43 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e  C..    WHERE  R.
a960: 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74  rid   IN $theset
a970: 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74       -- Restrict
a980: 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66   to revisions of
a990: 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41   interest..    A
a9a0: 4e 44 20 20 20 20 52 2e 72 69 64 20 3d 20 42 2e  ND    R.rid = B.
a9b0: 72 69 64 20 20 20 20 20 20 20 20 20 20 2d 2d 20  rid          -- 
a9c0: 53 65 6c 65 63 74 20 73 75 62 73 65 74 20 6f 66  Select subset of
a9d0: 20 62 72 61 6e 63 68 20 63 68 69 6c 64 72 65 6e   branch children
a9e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44  .            AND
a9f0: 20 20 20 20 43 49 2e 69 69 64 20 3d 20 42 2e 62      CI.iid = B.b
aa00: 72 69 64 20 20 20 20 20 20 20 20 2d 2d 20 53 65  rid        -- Se
aa10: 6c 65 63 74 20 61 6c 6c 20 63 68 61 6e 67 65 73  lect all changes
aa20: 65 74 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  ets.            
aa30: 41 4e 44 20 20 20 20 43 2e 63 69 64 20 3d 20 43  AND    C.cid = C
aa40: 49 2e 63 69 64 09 20 20 2d 2d 20 63 6f 6e 74 61  I.cid.  -- conta
aa50: 69 6e 69 6e 67 20 74 68 65 20 62 72 61 6e 63 68  ining the branch
aa60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44  .            AND
aa70: 20 20 20 20 43 2e 74 79 70 65 20 3d 20 30 09 09      C.type = 0..
aa80: 20 20 2d 2d 20 77 68 69 63 68 20 61 72 65 20 72    -- which are r
aa90: 65 76 69 73 69 6f 6e 20 63 68 61 6e 67 65 73 65  evision changese
aaa0: 74 73 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20  ts.    UNION.   
aab0: 20 2d 2d 20 28 34 29 20 43 68 69 6c 64 20 6f 66   -- (4) Child of
aac0: 20 74 72 75 6e 6b 20 72 6f 6f 74 20 73 75 63 63   trunk root succ
aad0: 65 73 73 6f 72 20 6f 66 20 6c 61 73 74 20 4e 54  essor of last NT
aae0: 44 42 20 6f 6e 20 74 72 75 6e 6b 2e 0a 09 20 20  DB on trunk...  
aaf0: 20 20 53 45 4c 45 43 54 20 43 2e 63 69 64 0a 09    SELECT C.cid..
ab00: 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73      FROM   revis
ab10: 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 20  ion R, revision 
ab20: 52 41 2c 20 63 73 69 74 65 6d 20 43 49 2c 20 63  RA, csitem CI, c
ab30: 68 61 6e 67 65 73 65 74 20 43 0a 09 20 20 20 20  hangeset C..    
ab40: 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49  WHERE  R.rid   I
ab50: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 20 2d  N $theset      -
ab60: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65  - Restrict to re
ab70: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72  visions of inter
ab80: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  est..    AND    
ab90: 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20 20  R.isdefault     
aba0: 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72          -- Restr
abb0: 69 63 74 20 74 6f 20 4e 54 44 42 0a 09 20 20 20  ict to NTDB..   
abc0: 20 41 4e 44 20 20 20 20 52 2e 64 62 63 68 69 6c   AND    R.dbchil
abd0: 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  d IS NOT NULL   
abe0: 2d 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 42  -- and last NTDB
abf0: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72   belonging to tr
ac00: 75 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 20  unk..    AND    
ac10: 52 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69  RA.rid = R.dbchi
ac20: 6c 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69  ld      -- Go di
ac30: 72 65 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20  rectly to trunk 
ac40: 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20  root..    AND   
ac50: 20 52 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54   RA.child IS NOT
ac60: 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20   NULL    -- Has 
ac70: 70 72 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 20  primary child.. 
ac80: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20             AND  
ac90: 20 20 43 49 2e 69 69 64 20 3d 20 52 41 2e 63 68    CI.iid = RA.ch
aca0: 69 6c 64 20 20 20 20 20 20 20 2d 2d 20 53 65 6c  ild       -- Sel
acb0: 65 63 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 65  ect all changese
acc0: 74 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 41  ts.            A
acd0: 4e 44 20 20 20 20 43 2e 63 69 64 20 3d 20 43 49  ND    C.cid = CI
ace0: 2e 63 69 64 09 20 20 20 2d 2d 20 63 6f 6e 74 61  .cid.   -- conta
acf0: 69 6e 69 6e 67 20 74 68 65 20 70 72 69 6d 61 72  ining the primar
ad00: 79 20 63 68 69 6c 64 0a 20 20 20 20 20 20 20 20  y child.        
ad10: 20 20 20 20 41 4e 44 20 20 20 20 43 2e 74 79 70      AND    C.typ
ad20: 65 20 3d 20 30 09 09 20 20 20 2d 2d 20 77 68 69  e = 0..   -- whi
ad30: 63 68 20 61 72 65 20 72 65 76 69 73 69 6f 6e 20  ch are revision 
ad40: 63 68 61 6e 67 65 73 65 74 73 0a 20 20 20 20 55  changesets.    U
ad50: 4e 49 4f 4e 0a 09 20 20 20 20 53 45 4c 45 43 54  NION..    SELECT
ad60: 20 43 2e 63 69 64 0a 09 20 20 20 20 46 52 4f 4d   C.cid..    FROM
ad70: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 74     revision R, t
ad80: 61 67 20 54 2c 20 63 73 69 74 65 6d 20 43 49 2c  ag T, csitem CI,
ad90: 20 63 68 61 6e 67 65 73 65 74 20 43 0a 09 20 20   changeset C..  
ada0: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 69    WHERE  R.rid i
adb0: 6e 20 24 74 68 65 73 65 74 20 20 20 20 20 20 20  n $theset       
adc0: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
add0: 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74  revisions of int
ade0: 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20  erest..    AND  
adf0: 20 20 54 2e 72 65 76 20 3d 20 52 2e 72 69 64 09    T.rev = R.rid.
ae00: 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 74 61 67     -- Select tag
ae10: 73 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68  s attached to th
ae20: 65 6d 0a 20 20 20 20 20 20 20 20 20 20 20 20 41  em.            A
ae30: 4e 44 20 20 20 20 43 49 2e 69 69 64 20 3d 20 54  ND    CI.iid = T
ae40: 2e 74 69 64 20 20 20 20 20 20 20 20 20 20 2d 2d  .tid          --
ae50: 20 53 65 6c 65 63 74 20 61 6c 6c 20 63 68 61 6e   Select all chan
ae60: 67 65 73 65 74 73 0a 20 20 20 20 20 20 20 20 20  gesets.         
ae70: 20 20 20 41 4e 44 20 20 20 20 43 2e 63 69 64 20     AND    C.cid 
ae80: 3d 20 43 49 2e 63 69 64 09 20 20 20 2d 2d 20 63  = CI.cid.   -- c
ae90: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61  ontaining the ta
aea0: 67 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 41  gs.            A
aeb0: 4e 44 20 20 20 20 43 2e 74 79 70 65 20 3d 20 31  ND    C.type = 1
aec0: 09 09 20 20 20 2d 2d 20 77 68 69 63 68 20 61 72  ..   -- which ar
aed0: 65 20 74 61 67 20 63 68 61 6e 67 65 73 65 74 73  e tag changesets
aee0: 0a 20 20 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20  .    UNION..    
aef0: 53 45 4c 45 43 54 20 43 2e 63 69 64 0a 09 20 20  SELECT C.cid..  
af00: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f    FROM   revisio
af10: 6e 20 52 2c 20 62 72 61 6e 63 68 20 42 2c 20 63  n R, branch B, c
af20: 73 69 74 65 6d 20 43 49 2c 20 63 68 61 6e 67 65  sitem CI, change
af30: 73 65 74 20 43 0a 09 20 20 20 20 57 48 45 52 45  set C..    WHERE
af40: 20 20 52 2e 72 69 64 20 69 6e 20 24 74 68 65 73    R.rid in $thes
af50: 65 74 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73  et        -- Res
af60: 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f  trict to revisio
af70: 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09  ns of interest..
af80: 20 20 20 20 41 4e 44 20 20 20 20 42 2e 72 6f 6f      AND    B.roo
af90: 74 20 3d 20 52 2e 72 69 64 09 20 20 20 2d 2d 20  t = R.rid.   -- 
afa0: 53 65 6c 65 63 74 20 62 72 61 6e 63 68 65 73 20  Select branches 
afb0: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 6d  attached to them
afc0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44  .            AND
afd0: 20 20 20 20 43 49 2e 69 69 64 20 3d 20 42 2e 62      CI.iid = B.b
afe0: 69 64 20 20 20 20 20 20 20 20 20 20 2d 2d 20 53  id          -- S
aff0: 65 6c 65 63 74 20 61 6c 6c 20 63 68 61 6e 67 65  elect all change
b000: 73 65 74 73 0a 20 20 20 20 20 20 20 20 20 20 20  sets.           
b010: 20 41 4e 44 20 20 20 20 43 2e 63 69 64 20 3d 20   AND    C.cid = 
b020: 43 49 2e 63 69 64 09 20 20 20 2d 2d 20 63 6f 6e  CI.cid.   -- con
b030: 74 61 69 6e 69 6e 67 20 74 68 65 20 62 72 61 6e  taining the bran
b040: 63 68 65 73 0a 20 20 20 20 20 20 20 20 20 20 20  ches.           
b050: 20 41 4e 44 20 20 20 20 43 2e 74 79 70 65 20 3d   AND    C.type =
b060: 20 32 09 09 20 20 20 2d 2d 20 77 68 69 63 68 20   2..   -- which 
b070: 61 72 65 20 62 72 61 6e 63 68 20 63 68 61 6e 67  are branch chang
b080: 65 73 65 74 73 0a 09 7d 5d 5d 0a 20 20 20 20 7d  esets..}]].    }
b090: 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d  ..    # result =
b0a0: 20 73 79 6d 62 6f 6c 20 6e 61 6d 65 0a 20 20 20   symbol name.   
b0b0: 20 74 79 70 65 6d 65 74 68 6f 64 20 63 73 5f 6c   typemethod cs_l
b0c0: 6f 64 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b  od {revisions} {
b0d0: 0a 09 23 20 44 65 74 65 72 6d 69 6e 65 73 20 74  ..# Determines t
b0e0: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73  he name of the s
b0f0: 79 6d 62 6f 6c 20 77 68 69 63 68 20 69 73 20 74  ymbol which is t
b100: 68 65 20 6c 69 6e 65 20 6f 66 0a 09 23 20 64 65  he line of..# de
b110: 76 65 6c 6f 70 6d 65 6e 74 20 66 6f 72 20 74 68  velopment for th
b120: 65 20 72 65 76 69 73 69 6f 6e 73 20 69 6e 20 61  e revisions in a
b130: 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 73 65   changeset....se
b140: 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e  t theset ('[join
b150: 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27   $revisions {','
b160: 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74  }]')..return [st
b170: 61 74 65 20 72 75 6e 20 5b 73 75 62 73 74 20 2d  ate run [subst -
b180: 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61  nocommands -noba
b190: 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20 20  ckslashes {..   
b1a0: 20 53 45 4c 45 43 54 0a 09 20 20 20 20 44 49 53   SELECT..    DIS
b1b0: 54 49 4e 43 54 20 4c 2e 6e 61 6d 65 0a 09 20 20  TINCT L.name..  
b1c0: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f    FROM   revisio
b1d0: 6e 20 52 2c 20 73 79 6d 62 6f 6c 20 4c 0a 09 20  n R, symbol L.. 
b1e0: 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20     WHERE  R.rid 
b1f0: 69 6e 20 24 74 68 65 73 65 74 20 20 20 20 20 20  in $theset      
b200: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f    -- Restrict to
b210: 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e   revisions of in
b220: 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20  terest..    AND 
b230: 20 20 20 4c 2e 73 69 64 20 3d 20 52 2e 6c 6f 64     L.sid = R.lod
b240: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 47 65             -- Ge
b250: 74 20 6c 6f 64 20 73 79 6d 62 6f 6c 20 6f 66 20  t lod symbol of 
b260: 72 65 76 69 73 69 6f 6e 0a 09 7d 5d 5d 0a 20 20  revision..}]].  
b270: 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23    }.}..# # ## ##
b280: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
b290: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23   ############# #
b2a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b2b0: 23 23 23 23 0a 23 23 20 48 65 6c 70 65 72 20 73  ####.## Helper s
b2c0: 69 6e 67 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e  ingleton. Comman
b2d0: 64 73 20 66 6f 72 20 74 61 67 20 73 79 6d 62 6f  ds for tag symbo
b2e0: 6c 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73  l changesets...s
b2f0: 6e 69 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a  nit::type ::vc::
b300: 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a  fossil::import::
b310: 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65  cvs::project::re
b320: 76 3a 3a 73 79 6d 3a 3a 74 61 67 20 7b 0a 20 20  v::sym::tag {.  
b330: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 72    typemethod byr
b340: 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74  evision {} { ret
b350: 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65  urn 0 }.    type
b360: 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20  method bysymbol 
b370: 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20    {} { return 1 
b380: 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  }.    typemethod
b390: 20 69 73 74 61 67 20 20 20 20 20 20 7b 7d 20 7b   istag      {} {
b3a0: 20 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20   return 1 }.    
b3b0: 74 79 70 65 6d 65 74 68 6f 64 20 69 73 62 72 61  typemethod isbra
b3c0: 6e 63 68 20 20 20 7b 7d 20 7b 20 72 65 74 75 72  nch   {} { retur
b3d0: 6e 20 30 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d  n 0 }..    typem
b3e0: 65 74 68 6f 64 20 73 74 72 20 7b 74 61 67 7d 20  ethod str {tag} 
b3f0: 7b 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20  {..struct::list 
b400: 61 73 73 69 67 6e 20 5b 73 74 61 74 65 20 72 75  assign [state ru
b410: 6e 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20  n {..    SELECT 
b420: 53 2e 6e 61 6d 65 2c 20 46 2e 6e 61 6d 65 2c 20  S.name, F.name, 
b430: 50 2e 6e 61 6d 65 0a 09 20 20 20 20 46 52 4f 4d  P.name..    FROM
b440: 20 20 20 74 61 67 20 54 2c 20 73 79 6d 62 6f 6c     tag T, symbol
b450: 20 53 2c 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a   S, file F, proj
b460: 65 63 74 20 50 0a 09 20 20 20 20 57 48 45 52 45  ect P..    WHERE
b470: 20 20 54 2e 74 69 64 20 3d 20 24 74 61 67 20 20    T.tid = $tag  
b480: 20 2d 2d 20 46 69 6e 64 20 73 70 65 63 69 66 69   -- Find specifi
b490: 65 64 20 74 61 67 0a 09 20 20 20 20 41 4e 44 20  ed tag..    AND 
b4a0: 20 20 20 46 2e 66 69 64 20 3d 20 54 2e 66 69 64     F.fid = T.fid
b4b0: 20 20 2d 2d 20 47 65 74 20 66 69 6c 65 20 6f 66    -- Get file of
b4c0: 20 74 61 67 0a 09 20 20 20 20 41 4e 44 20 20 20   tag..    AND   
b4d0: 20 50 2e 70 69 64 20 3d 20 46 2e 70 69 64 20 20   P.pid = F.pid  
b4e0: 2d 2d 20 47 65 74 20 70 72 6f 6a 65 63 74 20 6f  -- Get project o
b4f0: 66 20 66 69 6c 65 0a 09 20 20 20 20 41 4e 44 20  f file..    AND 
b500: 20 20 20 53 2e 73 69 64 20 3d 20 54 2e 73 69 64     S.sid = T.sid
b510: 20 20 2d 2d 20 47 65 74 20 73 79 6d 62 6f 6c 20    -- Get symbol 
b520: 6f 66 20 74 61 67 0a 09 7d 5d 20 73 6e 61 6d 65  of tag..}] sname
b530: 20 66 6e 61 6d 65 20 70 6e 61 6d 65 0a 09 72 65   fname pname..re
b540: 74 75 72 6e 20 22 24 70 6e 61 6d 65 2f 54 27 24  turn "$pname/T'$
b550: 7b 73 6e 61 6d 65 7d 27 3a 3a 24 66 6e 61 6d 65  {sname}'::$fname
b560: 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72  ".    }..    # r
b570: 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69  esult = list (mi
b580: 6e 74 69 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a  ntime, maxtime).
b590: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 74      typemethod t
b5a0: 69 6d 65 72 61 6e 67 65 20 7b 74 61 67 73 7d 20  imerange {tags} 
b5b0: 7b 0a 09 23 20 54 68 65 20 72 61 6e 67 65 20 69  {..# The range i
b5c0: 73 20 64 65 66 69 6e 65 64 20 61 73 20 74 68 65  s defined as the
b5d0: 20 72 61 6e 67 65 20 6f 66 20 74 68 65 20 72 65   range of the re
b5e0: 76 69 73 69 6f 6e 73 20 74 68 65 20 74 61 67 73  visions the tags
b5f0: 0a 09 23 20 61 72 65 20 61 74 74 61 63 68 65 64  ..# are attached
b600: 20 74 6f 2e 0a 0a 09 73 65 74 20 74 68 65 73 65   to....set these
b610: 74 20 28 27 5b 6a 6f 69 6e 20 24 74 61 67 73 20  t ('[join $tags 
b620: 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e  {','}]')..return
b630: 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62   [state run [sub
b640: 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d  st -nocommands -
b650: 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a  nobackslashes {.
b660: 09 20 20 20 20 53 45 4c 45 43 54 20 4d 49 4e 28  .    SELECT MIN(
b670: 52 2e 64 61 74 65 29 2c 20 4d 41 58 28 52 2e 64  R.date), MAX(R.d
b680: 61 74 65 29 0a 09 20 20 20 20 46 52 4f 4d 20 20  ate)..    FROM  
b690: 20 74 61 67 20 54 2c 20 72 65 76 69 73 69 6f 6e   tag T, revision
b6a0: 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 54   R..    WHERE  T
b6b0: 2e 74 69 64 20 49 4e 20 24 74 68 65 73 65 74 20  .tid IN $theset 
b6c0: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
b6d0: 74 61 67 73 20 6f 66 20 69 6e 74 65 72 65 73 74  tags of interest
b6e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44  .            AND
b6f0: 20 20 20 20 52 2e 72 69 64 20 3d 20 54 2e 72 65      R.rid = T.re
b700: 76 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20  v     -- Select 
b710: 74 61 67 20 70 61 72 65 6e 74 20 72 65 76 69 73  tag parent revis
b720: 69 6f 6e 73 0a 09 7d 5d 5d 0a 20 20 20 20 7d 0a  ions..}]].    }.
b730: 0a 20 20 20 20 23 20 76 61 72 28 64 76 29 20 3d  .    # var(dv) =
b740: 20 64 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c   dict (item -> l
b750: 69 73 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65  ist (item)), ite
b760: 6d 20 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20  m  = list (type 
b770: 69 64 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68  id).    typemeth
b780: 6f 64 20 73 75 63 63 65 73 73 6f 72 73 20 7b 64  od successors {d
b790: 76 20 74 61 67 73 7d 20 7b 0a 09 23 20 54 61 67  v tags} {..# Tag
b7a0: 73 20 68 61 76 65 20 6e 6f 20 73 75 63 63 65 73  s have no succes
b7b0: 73 6f 72 73 2e 0a 09 72 65 74 75 72 6e 0a 20 20  sors...return.  
b7c0: 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c    }..    # resul
b7d0: 74 20 3d 20 34 2d 6c 69 73 74 20 28 69 74 65 6d  t = 4-list (item
b7e0: 74 79 70 65 20 69 74 65 6d 69 64 20 6e 65 78 74  type itemid next
b7f0: 69 74 65 6d 74 79 70 65 20 6e 65 78 74 69 74 65  itemtype nextite
b800: 6d 69 64 20 2e 2e 2e 29 0a 20 20 20 20 74 79 70  mid ...).    typ
b810: 65 6d 65 74 68 6f 64 20 6c 6f 6f 70 73 20 7b 74  emethod loops {t
b820: 61 67 73 7d 20 7b 0a 09 23 20 54 61 67 73 20 68  ags} {..# Tags h
b830: 61 76 65 20 6e 6f 20 73 75 63 63 65 73 73 6f 72  ave no successor
b840: 73 2c 20 74 68 65 72 65 66 6f 72 65 20 63 61 6e  s, therefore can
b850: 6e 6f 74 20 63 61 75 73 65 20 6c 6f 6f 70 73 0a  not cause loops.
b860: 09 72 65 74 75 72 6e 20 7b 7d 0a 20 20 20 20 7d  .return {}.    }
b870: 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d  ..    # result =
b880: 20 6c 69 73 74 20 28 63 68 61 6e 67 65 73 65 74   list (changeset
b890: 2d 69 64 29 0a 20 20 20 20 74 79 70 65 6d 65 74  -id).    typemet
b8a0: 68 6f 64 20 63 73 5f 73 75 63 63 65 73 73 6f 72  hod cs_successor
b8b0: 73 20 7b 74 61 67 73 7d 20 7b 0a 09 23 20 54 61  s {tags} {..# Ta
b8c0: 67 73 20 68 61 76 65 20 6e 6f 20 73 75 63 63 65  gs have no succe
b8d0: 73 73 6f 72 73 2e 0a 09 72 65 74 75 72 6e 0a 20  ssors...return. 
b8e0: 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75     }..    # resu
b8f0: 6c 74 20 3d 20 73 79 6d 62 6f 6c 20 6e 61 6d 65  lt = symbol name
b900: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
b910: 63 73 5f 6c 6f 64 20 7b 74 61 67 73 7d 20 7b 0a  cs_lod {tags} {.
b920: 09 23 20 44 65 74 65 72 6d 69 6e 65 73 20 74 68  .# Determines th
b930: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79  e name of the sy
b940: 6d 62 6f 6c 20 77 68 69 63 68 20 69 73 20 74 68  mbol which is th
b950: 65 20 6c 69 6e 65 20 6f 66 0a 09 23 20 64 65 76  e line of..# dev
b960: 65 6c 6f 70 6d 65 6e 74 20 66 6f 72 20 74 68 65  elopment for the
b970: 20 74 61 67 73 20 69 6e 20 61 20 63 68 61 6e 67   tags in a chang
b980: 65 73 65 74 2e 0a 0a 09 73 65 74 20 74 68 65 73  eset....set thes
b990: 65 74 20 28 27 5b 6a 6f 69 6e 20 24 74 61 67 73  et ('[join $tags
b9a0: 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72   {','}]')..retur
b9b0: 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75  n [state run [su
b9c0: 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20  bst -nocommands 
b9d0: 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b  -nobackslashes {
b9e0: 0a 09 20 20 20 20 53 45 4c 45 43 54 0a 09 20 20  ..    SELECT..  
b9f0: 20 20 44 49 53 54 49 4e 43 54 20 4c 2e 6e 61 6d    DISTINCT L.nam
ba00: 65 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 74 61  e..    FROM   ta
ba10: 67 20 54 2c 20 73 79 6d 62 6f 6c 20 4c 0a 09 20  g T, symbol L.. 
ba20: 20 20 20 57 48 45 52 45 20 20 54 2e 74 69 64 20     WHERE  T.tid 
ba30: 69 6e 20 24 74 68 65 73 65 74 20 20 20 20 20 20  in $theset      
ba40: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f    -- Restrict to
ba50: 20 74 61 67 73 20 6f 66 20 69 6e 74 65 72 65 73   tags of interes
ba60: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 4c 2e  t..    AND    L.
ba70: 73 69 64 20 3d 20 54 2e 6c 6f 64 20 20 20 20 20  sid = T.lod     
ba80: 20 20 20 20 20 20 2d 2d 20 47 65 74 20 6c 6f 64        -- Get lod
ba90: 20 73 79 6d 62 6f 6c 20 6f 66 20 74 61 67 0a 09   symbol of tag..
baa0: 7d 5d 5d 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23  }]].    }.}..# #
bab0: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23   ## ### ##### ##
bac0: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
bad0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
bae0: 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 48 65  ##########.## He
baf0: 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 2e 20  lper singleton. 
bb00: 43 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 62 72 61  Commands for bra
bb10: 6e 63 68 20 73 79 6d 62 6f 6c 20 63 68 61 6e 67  nch symbol chang
bb20: 65 73 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79  esets...snit::ty
bb30: 70 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a  pe ::vc::fossil:
bb40: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72  :import::cvs::pr
bb50: 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 73 79 6d 3a  oject::rev::sym:
bb60: 3a 62 72 61 6e 63 68 20 7b 0a 20 20 20 20 74 79  :branch {.    ty
bb70: 70 65 6d 65 74 68 6f 64 20 62 79 72 65 76 69 73  pemethod byrevis
bb80: 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20  ion {} { return 
bb90: 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68  0 }.    typemeth
bba0: 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 20 7b 7d  od bysymbol   {}
bbb0: 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a 20 20   { return 1 }.  
bbc0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73 74    typemethod ist
bbd0: 61 67 20 20 20 20 20 20 7b 7d 20 7b 20 72 65 74  ag      {} { ret
bbe0: 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65  urn 0 }.    type
bbf0: 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63 68 20  method isbranch 
bc00: 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20    {} { return 1 
bc10: 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  }..    typemetho
bc20: 64 20 73 74 72 20 7b 62 72 61 6e 63 68 7d 20 7b  d str {branch} {
bc30: 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61  ..struct::list a
bc40: 73 73 69 67 6e 20 5b 73 74 61 74 65 20 72 75 6e  ssign [state run
bc50: 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 53   {..    SELECT S
bc60: 2e 6e 61 6d 65 2c 20 46 2e 6e 61 6d 65 2c 20 50  .name, F.name, P
bc70: 2e 6e 61 6d 65 0a 09 20 20 20 20 46 52 4f 4d 20  .name..    FROM 
bc80: 20 20 62 72 61 6e 63 68 20 42 2c 20 73 79 6d 62    branch B, symb
bc90: 6f 6c 20 53 2c 20 66 69 6c 65 20 46 2c 20 70 72  ol S, file F, pr
bca0: 6f 6a 65 63 74 20 50 0a 09 20 20 20 20 57 48 45  oject P..    WHE
bcb0: 52 45 20 20 42 2e 62 69 64 20 3d 20 24 62 72 61  RE  B.bid = $bra
bcc0: 6e 63 68 20 20 2d 2d 20 46 69 6e 64 20 73 70 65  nch  -- Find spe
bcd0: 63 69 66 69 65 64 20 62 72 61 6e 63 68 0a 09 20  cified branch.. 
bce0: 20 20 20 41 4e 44 20 20 20 20 46 2e 66 69 64 20     AND    F.fid 
bcf0: 3d 20 42 2e 66 69 64 20 20 20 20 2d 2d 20 47 65  = B.fid    -- Ge
bd00: 74 20 66 69 6c 65 20 6f 66 20 62 72 61 6e 63 68  t file of branch
bd10: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70  ..    AND    P.p
bd20: 69 64 20 3d 20 46 2e 70 69 64 20 20 20 20 2d 2d  id = F.pid    --
bd30: 20 47 65 74 20 70 72 6f 6a 65 63 74 20 6f 66 20   Get project of 
bd40: 66 69 6c 65 0a 09 20 20 20 20 41 4e 44 20 20 20  file..    AND   
bd50: 20 53 2e 73 69 64 20 3d 20 42 2e 73 69 64 20 20   S.sid = B.sid  
bd60: 20 20 2d 2d 20 47 65 74 20 73 79 6d 62 6f 6c 20    -- Get symbol 
bd70: 6f 66 20 62 72 61 6e 63 68 0a 09 7d 5d 20 73 6e  of branch..}] sn
bd80: 61 6d 65 20 66 6e 61 6d 65 20 70 6e 61 6d 65 0a  ame fname pname.
bd90: 09 72 65 74 75 72 6e 20 22 24 70 6e 61 6d 65 2f  .return "$pname/
bda0: 42 27 24 7b 73 6e 61 6d 65 7d 27 3a 3a 24 66 6e  B'${sname}'::$fn
bdb0: 61 6d 65 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ame".    }..    
bdc0: 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73 74 20  # result = list 
bdd0: 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74 69 6d  (mintime, maxtim
bde0: 65 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  e).    typemetho
bdf0: 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 62 72 61  d timerange {bra
be00: 6e 63 68 65 73 7d 20 7b 0a 09 23 20 54 68 65 20  nches} {..# The 
be10: 72 61 6e 67 65 20 6f 66 20 61 20 62 72 61 6e 63  range of a branc
be20: 68 20 69 73 20 64 65 66 69 6e 65 64 20 61 73 20  h is defined as 
be30: 74 68 65 20 72 61 6e 67 65 20 6f 66 20 74 68 65  the range of the
be40: 0a 09 23 20 72 65 76 69 73 69 6f 6e 73 20 74 68  ..# revisions th
be50: 65 20 62 72 61 6e 63 68 65 73 20 61 72 65 20 73  e branches are s
be60: 70 61 77 6e 65 64 20 62 79 2e 20 4e 4f 54 45 20  pawned by. NOTE 
be70: 68 6f 77 65 76 65 72 20 74 68 61 74 20 74 68 65  however that the
be80: 0a 09 23 20 62 72 61 6e 63 68 65 73 20 61 73 73  ..# branches ass
be90: 6f 63 69 61 74 65 64 20 77 69 74 68 20 61 20 64  ociated with a d
bea0: 65 74 61 63 68 65 64 20 4e 54 44 42 20 77 69 6c  etached NTDB wil
beb0: 6c 20 68 61 76 65 20 6e 6f 20 72 6f 6f 74 0a 09  l have no root..
bec0: 23 20 73 70 61 77 6e 69 6e 67 20 74 68 65 6d 2c  # spawning them,
bed0: 20 68 65 6e 63 65 20 74 68 65 79 20 68 61 76 65   hence they have
bee0: 20 6e 6f 20 72 65 61 6c 20 74 69 6d 65 72 61 6e   no real timeran
bef0: 67 65 20 61 6e 79 0a 09 23 20 6c 6f 6e 67 65 72  ge any..# longer
bf00: 2e 20 42 79 20 75 73 69 6e 67 20 30 20 77 65 20  . By using 0 we 
bf10: 70 75 74 20 74 68 65 6d 20 69 6e 20 66 72 6f 6e  put them in fron
bf20: 74 20 6f 66 20 65 76 65 72 79 74 68 69 6e 67 20  t of everything 
bf30: 65 6c 73 65 2c 0a 09 23 20 61 73 20 74 68 65 79  else,..# as they
bf40: 20 6c 6f 67 69 63 61 6c 6c 79 20 61 72 65 2e 0a   logically are..
bf50: 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b  ..set theset ('[
bf60: 6a 6f 69 6e 20 24 62 72 61 6e 63 68 65 73 20 7b  join $branches {
bf70: 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20  ','}]')..return 
bf80: 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73  [state run [subs
bf90: 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e  t -nocommands -n
bfa0: 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09  obackslashes {..
bfb0: 20 20 20 20 53 45 4c 45 43 54 20 49 46 4e 55 4c      SELECT IFNUL
bfc0: 4c 28 4d 49 4e 28 52 2e 64 61 74 65 29 2c 30 29  L(MIN(R.date),0)
bfd0: 2c 20 49 46 4e 55 4c 4c 28 4d 41 58 28 52 2e 64  , IFNULL(MAX(R.d
bfe0: 61 74 65 29 2c 30 29 0a 09 20 20 20 20 46 52 4f  ate),0)..    FRO
bff0: 4d 20 20 62 72 61 6e 63 68 20 42 2c 20 72 65 76  M  branch B, rev
c000: 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45  ision R..    WHE
c010: 52 45 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65  RE B.bid IN $the
c020: 73 65 74 20 20 20 2d 2d 20 52 65 73 74 72 69 63  set   -- Restric
c030: 74 20 74 6f 20 62 72 61 6e 63 68 65 73 20 6f 66  t to branches of
c040: 20 69 6e 74 65 72 65 73 74 0a 20 20 20 20 20 20   interest.      
c050: 20 20 20 20 20 20 41 4e 44 20 20 20 52 2e 72 69        AND   R.ri
c060: 64 20 3d 20 42 2e 72 6f 6f 74 20 20 20 20 20 2d  d = B.root     -
c070: 2d 20 53 65 6c 65 63 74 20 62 72 61 6e 63 68 20  - Select branch 
c080: 70 61 72 65 6e 74 20 72 65 76 69 73 69 6f 6e 73  parent revisions
c090: 0a 09 7d 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20  ..}]].    }..   
c0a0: 20 23 20 72 65 73 75 6c 74 20 3d 20 34 2d 6c 69   # result = 4-li
c0b0: 73 74 20 28 69 74 65 6d 74 79 70 65 20 69 74 65  st (itemtype ite
c0c0: 6d 69 64 20 6e 65 78 74 69 74 65 6d 74 79 70 65  mid nextitemtype
c0d0: 20 6e 65 78 74 69 74 65 6d 69 64 20 2e 2e 2e 29   nextitemid ...)
c0e0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
c0f0: 6c 6f 6f 70 73 20 7b 62 72 61 6e 63 68 65 73 7d  loops {branches}
c100: 20 7b 0a 09 23 20 4e 6f 74 65 3a 20 52 65 76 69   {..# Note: Revi
c110: 73 69 6f 6e 73 20 61 6e 64 20 74 61 67 73 20 63  sions and tags c
c120: 61 6e 6e 6f 74 20 63 61 75 73 65 20 74 68 65 20  annot cause the 
c130: 6c 6f 6f 70 2e 20 42 65 69 6e 67 20 6f 66 20 61  loop. Being of a
c140: 0a 09 23 20 66 75 6e 64 61 6d 65 6e 74 61 6c 6c  ..# fundamentall
c150: 79 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65  y different type
c160: 20 74 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20   they cannot be 
c170: 69 6e 20 74 68 65 20 69 6e 63 6f 6d 69 6e 67 0a  in the incoming.
c180: 09 23 20 73 65 74 20 6f 66 20 69 64 73 2e 0a 0a  .# set of ids...
c190: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a  .set theset ('[j
c1a0: 6f 69 6e 20 24 62 72 61 6e 63 68 65 73 20 7b 27  oin $branches {'
c1b0: 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b  ,'}]')..return [
c1c0: 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73 74  state run [subst
c1d0: 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f   -nocommands -no
c1e0: 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20  backslashes {.. 
c1f0: 20 20 20 53 45 4c 45 43 54 20 42 2e 62 69 64 2c     SELECT B.bid,
c200: 20 42 58 2e 62 69 64 0a 09 20 20 20 20 46 52 4f   BX.bid..    FRO
c210: 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20 70 72  M   branch B, pr
c220: 65 66 65 72 65 64 70 61 72 65 6e 74 20 50 2c 20  eferedparent P, 
c230: 62 72 61 6e 63 68 20 42 58 0a 09 20 20 20 20 57  branch BX..    W
c240: 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24  HERE  B.bid IN $
c250: 74 68 65 73 65 74 20 20 20 2d 2d 20 52 65 73 74  theset   -- Rest
c260: 72 69 63 74 20 74 6f 20 62 72 61 6e 63 68 65 73  rict to branches
c270: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20   of interest..  
c280: 20 20 41 4e 44 20 20 20 20 42 2e 73 69 64 20 3d    AND    B.sid =
c290: 20 50 2e 70 69 64 20 20 20 20 20 20 2d 2d 20 47   P.pid      -- G
c2a0: 65 74 20 74 68 65 20 70 72 65 66 65 72 65 64 20  et the prefered 
c2b0: 62 72 61 6e 63 68 65 73 20 76 69 61 0a 09 20 20  branches via..  
c2c0: 20 20 41 4e 44 20 20 20 20 42 58 2e 73 69 64 20    AND    BX.sid 
c2d0: 3d 20 50 2e 73 69 64 20 20 20 20 20 2d 2d 20 74  = P.sid     -- t
c2e0: 68 65 20 62 72 61 6e 63 68 20 73 79 6d 62 6f 6c  he branch symbol
c2f0: 73 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 58  s..    AND    BX
c300: 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65 74 20  .bid IN $theset 
c310: 20 2d 2d 20 4c 6f 6f 70 0a 09 7d 5d 5d 0a 20 20   -- Loop..}]].  
c320: 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64    }..    # var(d
c330: 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20  v) = dict (item 
c340: 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c  -> list (item)),
c350: 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74   item  = list (t
c360: 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 70 65  ype id).    type
c370: 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f 72  method successor
c380: 73 20 7b 64 76 20 62 72 61 6e 63 68 65 73 7d 20  s {dv branches} 
c390: 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76 20 64  {..upvar 1 $dv d
c3a0: 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 23 20 54  ependencies..# T
c3b0: 68 65 20 66 69 72 73 74 20 72 65 76 69 73 69 6f  he first revisio
c3c0: 6e 20 63 6f 6d 6d 69 74 74 65 64 20 6f 6e 20 61  n committed on a
c3d0: 20 62 72 61 6e 63 68 2c 20 61 6e 64 20 61 6c 6c   branch, and all
c3e0: 20 62 72 61 6e 63 68 65 73 0a 09 23 20 61 6e 64   branches..# and
c3f0: 20 74 61 67 73 20 77 68 69 63 68 20 68 61 76 65   tags which have
c400: 20 69 74 20 61 73 20 74 68 65 69 72 20 70 72 65   it as their pre
c410: 66 65 72 65 64 20 70 61 72 65 6e 74 20 61 72 65  fered parent are
c420: 20 74 68 65 0a 09 23 20 73 75 63 63 65 73 73 6f   the..# successo
c430: 72 73 20 6f 66 20 61 20 62 72 61 6e 63 68 2e 0a  rs of a branch..
c440: 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b  ..set theset ('[
c450: 6a 6f 69 6e 20 24 62 72 61 6e 63 68 65 73 20 7b  join $branches {
c460: 27 2c 27 7d 5d 27 29 0a 09 66 6f 72 65 61 63 68  ','}]')..foreach
c470: 20 7b 62 69 64 20 63 68 69 6c 64 7d 20 5b 73 74   {bid child} [st
c480: 61 74 65 20 72 75 6e 20 5b 73 75 62 73 74 20 2d  ate run [subst -
c490: 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61  nocommands -noba
c4a0: 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20 20  ckslashes {..   
c4b0: 20 53 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 52   SELECT B.bid, R
c4c0: 2e 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  .rid..    FROM  
c4d0: 20 62 72 61 6e 63 68 20 42 2c 20 72 65 76 69 73   branch B, revis
c4e0: 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45  ion R..    WHERE
c4f0: 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73    B.bid IN $thes
c500: 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69  et     -- Restri
c510: 63 74 20 74 6f 20 62 72 61 6e 63 68 65 73 20 6f  ct to branches o
c520: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20  f interest..    
c530: 41 4e 44 20 20 20 20 42 2e 66 69 72 73 74 20 3d  AND    B.first =
c540: 20 52 2e 72 69 64 20 20 20 20 20 20 2d 2d 20 47   R.rid      -- G
c550: 65 74 20 66 69 72 73 74 20 72 65 76 69 73 69 6f  et first revisio
c560: 6e 20 6f 6e 20 74 68 65 20 62 72 61 6e 63 68 0a  n on the branch.
c570: 09 7d 5d 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70  .}]] {..    lapp
c580: 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73  end dependencies
c590: 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e  ([list sym::bran
c5a0: 63 68 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 20  ch $bid]) [list 
c5b0: 72 65 76 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09  rev $child]..}..
c5c0: 66 6f 72 65 61 63 68 20 7b 62 69 64 20 63 68 69  foreach {bid chi
c5d0: 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 5b  ld} [state run [
c5e0: 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64  subst -nocommand
c5f0: 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73  s -nobackslashes
c600: 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42   {..    SELECT B
c610: 2e 62 69 64 2c 20 42 58 2e 62 69 64 0a 09 20 20  .bid, BX.bid..  
c620: 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20    FROM   branch 
c630: 42 2c 20 70 72 65 66 65 72 65 64 70 61 72 65 6e  B, preferedparen
c640: 74 20 50 2c 20 62 72 61 6e 63 68 20 42 58 0a 09  t P, branch BX..
c650: 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 64      WHERE  B.bid
c660: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20   IN $theset     
c670: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 62  -- Restrict to b
c680: 72 61 6e 63 68 65 73 20 6f 66 20 69 6e 74 65 72  ranches of inter
c690: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  est..    AND    
c6a0: 42 2e 73 69 64 20 3d 20 50 2e 70 69 64 20 20 20  B.sid = P.pid   
c6b0: 20 20 20 20 20 2d 2d 20 47 65 74 20 73 75 62 6f       -- Get subo
c6c0: 72 64 69 6e 61 74 65 20 62 72 61 6e 63 68 65 73  rdinate branches
c6d0: 20 76 69 61 20 74 68 65 0a 09 20 20 20 20 41 4e   via the..    AN
c6e0: 44 20 20 20 20 42 58 2e 73 69 64 20 3d 20 50 2e  D    BX.sid = P.
c6f0: 73 69 64 20 20 20 20 20 20 20 2d 2d 20 70 72 65  sid       -- pre
c700: 66 65 72 65 64 20 70 61 72 65 6e 74 73 20 6f 66  fered parents of
c710: 20 74 68 65 69 72 20 73 79 6d 62 6f 6c 73 0a 09   their symbols..
c720: 7d 5d 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65  }]] {..    lappe
c730: 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28  nd dependencies(
c740: 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63  [list sym::branc
c750: 68 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 20 73  h $bid]) [list s
c760: 79 6d 3a 3a 62 72 61 6e 63 68 20 24 63 68 69 6c  ym::branch $chil
c770: 64 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b  d]..}..foreach {
c780: 62 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74  bid child} [stat
c790: 65 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f  e run [subst -no
c7a0: 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b  commands -noback
c7b0: 73 6c 61 73 68 65 73 20 7b 0a 09 20 20 20 20 53  slashes {..    S
c7c0: 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 54 2e 74  ELECT B.bid, T.t
c7d0: 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62  id..    FROM   b
c7e0: 72 61 6e 63 68 20 42 2c 20 70 72 65 66 65 72 65  ranch B, prefere
c7f0: 64 70 61 72 65 6e 74 20 50 2c 20 74 61 67 20 54  dparent P, tag T
c800: 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62  ..    WHERE  B.b
c810: 69 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20  id IN $theset   
c820: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f    -- Restrict to
c830: 20 62 72 61 6e 63 68 65 73 20 6f 66 20 69 6e 74   branches of int
c840: 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20  erest..    AND  
c850: 20 20 42 2e 73 69 64 20 3d 20 50 2e 70 69 64 20    B.sid = P.pid 
c860: 20 20 20 20 20 20 20 2d 2d 20 47 65 74 20 73 75         -- Get su
c870: 62 6f 72 64 69 6e 61 74 65 20 74 61 67 73 20 76  bordinate tags v
c880: 69 61 20 74 68 65 0a 09 20 20 20 20 41 4e 44 20  ia the..    AND 
c890: 20 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 69 64     T.sid = P.sid
c8a0: 20 20 20 20 20 20 20 20 2d 2d 20 70 72 65 66 65          -- prefe
c8b0: 72 65 64 20 70 61 72 65 6e 74 73 20 6f 66 20 74  red parents of t
c8c0: 68 65 69 72 20 73 79 6d 62 6f 6c 73 0a 09 7d 5d  heir symbols..}]
c8d0: 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64  ] {..    lappend
c8e0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c   dependencies([l
c8f0: 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20  ist sym::branch 
c900: 24 62 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d  $bid]) [list sym
c910: 3a 3a 74 61 67 20 24 63 68 69 6c 64 5d 0a 09 7d  ::tag $child]..}
c920: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
c930: 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c      # result = l
c940: 69 73 74 20 28 63 68 61 6e 67 65 73 65 74 2d 69  ist (changeset-i
c950: 64 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  d).    typemetho
c960: 64 20 63 73 5f 73 75 63 63 65 73 73 6f 72 73 20  d cs_successors 
c970: 7b 62 72 61 6e 63 68 65 73 7d 20 7b 0a 20 20 20  {branches} {.   
c980: 20 20 20 20 20 23 20 54 68 69 73 20 69 73 20 61       # This is a
c990: 20 76 61 72 69 61 6e 74 20 6f 66 20 27 73 75 63   variant of 'suc
c9a0: 63 65 73 73 6f 72 73 27 20 77 68 69 63 68 20 6d  cessors' which m
c9b0: 61 70 73 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65  aps the low-leve
c9c0: 6c 0a 20 20 20 20 20 20 20 20 23 20 64 61 74 61  l.        # data
c9d0: 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65   directly to the
c9e0: 20 61 73 73 6f 63 69 61 74 65 64 20 63 68 61 6e   associated chan
c9f0: 67 65 73 65 74 73 2e 20 49 2e 65 2e 20 69 6e 73  gesets. I.e. ins
ca00: 74 65 61 64 0a 20 20 20 20 20 20 20 20 23 20 6d  tead.        # m
ca10: 69 6c 6c 69 6f 6e 73 20 6f 66 20 64 65 70 65 6e  illions of depen
ca20: 64 65 6e 63 79 20 70 61 69 72 73 20 28 69 6e 20  dency pairs (in 
ca30: 65 78 74 72 65 6d 65 20 63 61 73 65 73 20 28 45  extreme cases (E
ca40: 78 61 6d 70 6c 65 3a 20 54 63 6c 0a 20 20 20 20  xample: Tcl.    
ca50: 20 20 20 20 23 20 43 56 53 29 29 20 77 65 20 72      # CVS)) we r
ca60: 65 74 75 72 6e 20 61 20 76 65 72 79 20 73 68 6f  eturn a very sho
ca70: 72 74 20 61 6e 64 20 6d 75 63 68 20 6d 6f 72 65  rt and much more
ca80: 20 6d 61 6e 61 67 65 61 62 6c 65 20 6c 69 73 74   manageable list
ca90: 0a 20 20 20 20 20 20 20 20 23 20 6f 66 20 63 68  .        # of ch
caa0: 61 6e 67 65 73 65 74 73 2e 0a 0a 09 73 65 74 20  angesets....set 
cab0: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24  theset ('[join $
cac0: 62 72 61 6e 63 68 65 73 20 7b 27 2c 27 7d 5d 27  branches {','}]'
cad0: 29 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ).        return
cae0: 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62   [state run [sub
caf0: 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d  st -nocommands -
cb00: 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a  nobackslashes {.
cb10: 09 20 20 20 20 53 45 4c 45 43 54 20 43 2e 63 69  .    SELECT C.ci
cb20: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72  d..    FROM   br
cb30: 61 6e 63 68 20 42 2c 20 72 65 76 69 73 69 6f 6e  anch B, revision
cb40: 20 52 2c 20 63 73 69 74 65 6d 20 43 49 2c 20 63   R, csitem CI, c
cb50: 68 61 6e 67 65 73 65 74 20 43 0a 09 20 20 20 20  hangeset C..    
cb60: 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20  WHERE  B.bid IN 
cb70: 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52  $theset     -- R
cb80: 65 73 74 72 69 63 74 20 74 6f 20 62 72 61 6e 63  estrict to branc
cb90: 68 65 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  hes of interest.
cba0: 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 66 69  .    AND    B.fi
cbb0: 72 73 74 20 3d 20 52 2e 72 69 64 09 2d 2d 20 47  rst = R.rid.-- G
cbc0: 65 74 20 66 69 72 73 74 20 72 65 76 69 73 69 6f  et first revisio
cbd0: 6e 20 6f 6e 20 74 68 65 20 62 72 61 6e 63 68 0a  n on the branch.
cbe0: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
cbf0: 20 20 20 43 49 2e 69 69 64 20 3d 20 52 2e 72 69     CI.iid = R.ri
cc00: 64 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63  d       -- Selec
cc10: 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 65 74 73  t all changesets
cc20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44  .            AND
cc30: 20 20 20 20 43 2e 63 69 64 20 3d 20 43 49 2e 63      C.cid = CI.c
cc40: 69 64 09 2d 2d 20 63 6f 6e 74 61 69 6e 69 6e 67  id.-- containing
cc50: 20 74 68 69 73 20 72 65 76 69 73 69 6f 6e 0a 20   this revision. 
cc60: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20             AND  
cc70: 20 20 43 2e 74 79 70 65 20 3d 20 30 09 09 2d 2d    C.type = 0..--
cc80: 20 77 68 69 63 68 20 61 72 65 20 72 65 76 69 73   which are revis
cc90: 69 6f 6e 20 63 68 61 6e 67 65 73 65 74 73 0a 20  ion changesets. 
cca0: 20 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 53 45     UNION..    SE
ccb0: 4c 45 43 54 20 43 2e 63 69 64 0a 09 20 20 20 20  LECT C.cid..    
ccc0: 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c  FROM   branch B,
ccd0: 20 70 72 65 66 65 72 65 64 70 61 72 65 6e 74 20   preferedparent 
cce0: 50 2c 20 62 72 61 6e 63 68 20 42 58 2c 20 63 73  P, branch BX, cs
ccf0: 69 74 65 6d 20 43 49 2c 20 63 68 61 6e 67 65 73  item CI, changes
cd00: 65 74 20 43 0a 09 20 20 20 20 57 48 45 52 45 20  et C..    WHERE 
cd10: 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65   B.bid IN $these
cd20: 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63  t     -- Restric
cd30: 74 20 74 6f 20 62 72 61 6e 63 68 65 73 20 6f 66  t to branches of
cd40: 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41   interest..    A
cd50: 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50 2e  ND    B.sid = P.
cd60: 70 69 64 09 2d 2d 20 47 65 74 20 73 75 62 6f 72  pid.-- Get subor
cd70: 64 69 6e 61 74 65 20 62 72 61 6e 63 68 65 73 20  dinate branches 
cd80: 76 69 61 20 74 68 65 0a 09 20 20 20 20 41 4e 44  via the..    AND
cd90: 20 20 20 20 42 58 2e 73 69 64 20 3d 20 50 2e 73      BX.sid = P.s
cda0: 69 64 09 2d 2d 20 70 72 65 66 65 72 65 64 20 70  id.-- prefered p
cdb0: 61 72 65 6e 74 73 20 6f 66 20 74 68 65 69 72 20  arents of their 
cdc0: 73 79 6d 62 6f 6c 73 0a 20 20 20 20 20 20 20 20  symbols.        
cdd0: 20 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69      AND    CI.ii
cde0: 64 20 3d 20 42 58 2e 62 69 64 20 20 20 20 20 20  d = BX.bid      
cdf0: 2d 2d 20 53 65 6c 65 63 74 20 61 6c 6c 20 63 68  -- Select all ch
ce00: 61 6e 67 65 73 65 74 73 0a 20 20 20 20 20 20 20  angesets.       
ce10: 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e 63 69       AND    C.ci
ce20: 64 20 3d 20 43 49 2e 63 69 64 09 2d 2d 20 63 6f  d = CI.cid.-- co
ce30: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 73 75 62  ntaining the sub
ce40: 6f 72 64 69 6e 61 74 65 20 62 72 61 6e 63 68 65  ordinate branche
ce50: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e  s.            AN
ce60: 44 20 20 20 20 43 2e 74 79 70 65 20 3d 20 32 09  D    C.type = 2.
ce70: 09 2d 2d 20 77 68 69 63 68 20 61 72 65 20 62 72  .-- which are br
ce80: 61 6e 63 68 20 63 68 61 6e 67 65 73 65 74 73 0a  anch changesets.
ce90: 20 20 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 53      UNION..    S
cea0: 45 4c 45 43 54 20 43 2e 63 69 64 0a 09 20 20 20  ELECT C.cid..   
ceb0: 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42   FROM   branch B
cec0: 2c 20 70 72 65 66 65 72 65 64 70 61 72 65 6e 74  , preferedparent
ced0: 20 50 2c 20 74 61 67 20 54 2c 20 63 73 69 74 65   P, tag T, csite
cee0: 6d 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20  m CI, changeset 
cef0: 43 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e  C..    WHERE  B.
cf00: 62 69 64 20 49 4e 20 24 74 68 65 73 65 74 20 20  bid IN $theset  
cf10: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74     -- Restrict t
cf20: 6f 20 62 72 61 6e 63 68 65 73 20 6f 66 20 69 6e  o branches of in
cf30: 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20  terest..    AND 
cf40: 20 20 20 42 2e 73 69 64 20 3d 20 50 2e 70 69 64     B.sid = P.pid
cf50: 09 2d 2d 20 47 65 74 20 73 75 62 6f 72 64 69 6e  .-- Get subordin
cf60: 61 74 65 20 74 61 67 73 20 76 69 61 20 74 68 65  ate tags via the
cf70: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 54 2e 73  ..    AND    T.s
cf80: 69 64 20 3d 20 50 2e 73 69 64 09 2d 2d 20 70 72  id = P.sid.-- pr
cf90: 65 66 65 72 65 64 20 70 61 72 65 6e 74 73 20 6f  efered parents o
cfa0: 66 20 74 68 65 69 72 20 73 79 6d 62 6f 6c 73 0a  f their symbols.
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
cfc0: 20 20 20 43 49 2e 69 69 64 20 3d 20 54 2e 74 69     CI.iid = T.ti
cfd0: 64 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63  d       -- Selec
cfe0: 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 65 74 73  t all changesets
cff0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44  .            AND
d000: 20 20 20 20 43 2e 63 69 64 20 3d 20 43 49 2e 63      C.cid = CI.c
d010: 69 64 09 2d 2d 20 63 6f 6e 74 61 69 6e 69 6e 67  id.-- containing
d020: 20 74 68 65 20 73 75 62 6f 72 64 69 6e 61 74 65   the subordinate
d030: 20 74 61 67 73 0a 20 20 20 20 20 20 20 20 20 20   tags.          
d040: 20 20 41 4e 44 20 20 20 20 43 2e 74 79 70 65 20    AND    C.type 
d050: 3d 20 31 09 09 2d 2d 20 77 68 69 63 68 20 61 72  = 1..-- which ar
d060: 65 20 74 61 67 20 63 68 61 6e 67 65 73 65 74 73  e tag changesets
d070: 0a 09 7d 5d 5d 0a 09 72 65 74 75 72 6e 0a 20 20  ..}]]..return.  
d080: 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c    }..    # resul
d090: 74 20 3d 20 73 79 6d 62 6f 6c 20 6e 61 6d 65 0a  t = symbol name.
d0a0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 63      typemethod c
d0b0: 73 5f 6c 6f 64 20 7b 62 72 61 6e 63 68 65 73 7d  s_lod {branches}
d0c0: 20 7b 0a 09 23 20 44 65 74 65 72 6d 69 6e 65 73   {..# Determines
d0d0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
d0e0: 20 73 79 6d 62 6f 6c 20 77 68 69 63 68 20 69 73   symbol which is
d0f0: 20 74 68 65 20 6c 69 6e 65 20 6f 66 0a 09 23 20   the line of..# 
d100: 64 65 76 65 6c 6f 70 6d 65 6e 74 20 66 6f 72 20  development for 
d110: 74 68 65 20 62 72 61 6e 63 68 65 73 20 69 6e 20  the branches in 
d120: 61 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 73  a changeset....s
d130: 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69  et theset ('[joi
d140: 6e 20 24 62 72 61 6e 63 68 65 73 20 7b 27 2c 27  n $branches {','
d150: 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74  }]')..return [st
d160: 61 74 65 20 72 75 6e 20 5b 73 75 62 73 74 20 2d  ate run [subst -
d170: 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61  nocommands -noba
d180: 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20 20  ckslashes {..   
d190: 20 53 45 4c 45 43 54 0a 09 20 20 20 20 44 49 53   SELECT..    DIS
d1a0: 54 49 4e 43 54 20 4c 2e 6e 61 6d 65 0a 09 20 20  TINCT L.name..  
d1b0: 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20    FROM   branch 
d1c0: 42 2c 20 73 79 6d 62 6f 6c 20 4c 0a 09 20 20 20  B, symbol L..   
d1d0: 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 69 6e   WHERE  B.bid in
d1e0: 20 24 74 68 65 73 65 74 20 20 20 20 20 20 20 20   $theset        
d1f0: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 62  -- Restrict to b
d200: 72 61 6e 63 68 65 73 20 6f 66 20 69 6e 74 65 72  ranches of inter
d210: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  est..    AND    
d220: 4c 2e 73 69 64 20 3d 20 42 2e 6c 6f 64 20 20 20  L.sid = B.lod   
d230: 20 20 20 20 20 20 20 20 2d 2d 20 47 65 74 20 6c          -- Get l
d240: 6f 64 20 73 79 6d 62 6f 6c 20 6f 66 20 62 72 61  od symbol of bra
d250: 6e 63 68 0a 09 7d 5d 5d 0a 20 20 20 20 7d 0a 0a  nch..}]].    }..
d260: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c      typemethod l
d270: 69 6d 69 74 73 20 7b 62 72 61 6e 63 68 65 73 7d  imits {branches}
d280: 20 7b 0a 09 23 20 4e 6f 74 65 73 2e 20 54 68 69   {..# Notes. Thi
d290: 73 20 6d 65 74 68 6f 64 20 65 78 69 73 74 73 20  s method exists 
d2a0: 6f 6e 6c 79 20 66 6f 72 20 62 72 61 6e 63 68 65  only for branche
d2b0: 73 2e 20 49 74 20 69 73 20 6e 65 65 64 65 64 20  s. It is needed 
d2c0: 74 6f 0a 09 23 20 67 65 74 20 64 65 74 61 69 6c  to..# get detail
d2d0: 65 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  ed information a
d2e0: 62 6f 75 74 20 61 20 62 61 63 6b 77 61 72 64 20  bout a backward 
d2f0: 62 72 61 6e 63 68 2e 20 49 74 20 64 6f 65 73 0a  branch. It does.
d300: 09 23 20 6e 6f 74 20 61 70 70 6c 79 20 74 6f 20  .# not apply to 
d310: 74 61 67 73 2c 20 6e 6f 72 20 72 65 76 69 73 69  tags, nor revisi
d320: 6f 6e 73 2e 20 54 68 65 20 71 75 65 72 69 65 73  ons. The queries
d330: 20 63 61 6e 20 61 6c 73 6f 0a 09 23 20 72 65 73   can also..# res
d340: 74 72 69 63 74 20 74 68 65 6d 73 65 6c 76 65 73  trict themselves
d350: 20 74 6f 20 74 68 65 20 72 65 76 69 73 69 6f 6e   to the revision
d360: 20 73 75 63 65 73 73 6f 72 73 2f 70 72 65 64 65   sucessors/prede
d370: 63 65 73 73 6f 72 73 0a 09 23 20 6f 66 20 62 72  cessors..# of br
d380: 61 6e 63 68 65 73 2c 20 61 73 20 6f 6e 6c 79 20  anches, as only 
d390: 74 68 65 79 20 68 61 76 65 20 6f 72 64 65 72 69  they have orderi
d3a0: 6e 67 20 64 61 74 61 20 61 6e 64 20 74 68 75 73  ng data and thus
d3b0: 20 63 61 6e 0a 09 23 20 63 61 75 73 65 20 74 68   can..# cause th
d3c0: 65 20 62 61 63 6b 77 61 72 64 6e 65 73 73 2e 0a  e backwardness..
d3d0: 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b  ..set theset ('[
d3e0: 6a 6f 69 6e 20 24 62 72 61 6e 63 68 65 73 20 7b  join $branches {
d3f0: 27 2c 27 7d 5d 27 29 0a 0a 09 73 65 74 20 6d 61  ','}]')...set ma
d400: 78 70 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73  xp [state run [s
d410: 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73  ubst -nocommands
d420: 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20   -nobackslashes 
d430: 7b 0a 09 20 20 20 20 2d 2d 20 6d 61 78 69 6d 61  {..    -- maxima
d440: 6c 20 70 72 65 64 65 63 65 73 73 6f 72 20 70 6f  l predecessor po
d450: 73 69 74 69 6f 6e 20 70 65 72 20 62 72 61 6e 63  sition per branc
d460: 68 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e  h..    SELECT B.
d470: 62 69 64 2c 20 4d 41 58 20 28 43 4f 2e 70 6f 73  bid, MAX (CO.pos
d480: 29 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72  )..    FROM   br
d490: 61 6e 63 68 20 42 2c 20 72 65 76 69 73 69 6f 6e  anch B, revision
d4a0: 20 52 2c 20 63 73 69 74 65 6d 20 43 49 2c 20 63   R, csitem CI, c
d4b0: 68 61 6e 67 65 73 65 74 20 43 2c 20 63 73 6f 72  hangeset C, csor
d4c0: 64 65 72 20 43 4f 0a 09 20 20 20 20 57 48 45 52  der CO..    WHER
d4d0: 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65  E  B.bid IN $the
d4e0: 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72  set     -- Restr
d4f0: 69 63 74 20 74 6f 20 62 72 61 6e 63 68 65 73 20  ict to branches 
d500: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20  of interest..   
d510: 20 41 4e 44 20 20 20 20 42 2e 72 6f 6f 74 20 3d   AND    B.root =
d520: 20 52 2e 72 69 64 20 20 20 20 20 20 20 2d 2d 20   R.rid       -- 
d530: 47 65 74 20 62 72 61 6e 63 68 20 72 6f 6f 74 20  Get branch root 
d540: 72 65 76 69 73 69 6f 6e 73 0a 09 20 20 20 20 41  revisions..    A
d550: 4e 44 20 20 20 20 43 49 2e 69 69 64 20 3d 20 52  ND    CI.iid = R
d560: 2e 72 69 64 20 20 20 20 20 20 20 2d 2d 20 47 65  .rid       -- Ge
d570: 74 20 63 68 61 6e 67 65 73 65 74 73 20 63 6f 6e  t changesets con
d580: 74 61 69 6e 69 6e 67 20 74 68 65 0a 09 20 20 20  taining the..   
d590: 20 41 4e 44 20 20 20 20 43 2e 63 69 64 20 3d 20   AND    C.cid = 
d5a0: 43 49 2e 63 69 64 20 20 20 20 20 20 20 2d 2d 20  CI.cid       -- 
d5b0: 72 6f 6f 74 20 72 65 76 69 73 69 6f 6e 73 2c 20  root revisions, 
d5c0: 77 68 69 63 68 20 61 72 65 0a 09 20 20 20 20 41  which are..    A
d5d0: 4e 44 20 20 20 20 43 2e 74 79 70 65 20 3d 20 30  ND    C.type = 0
d5e0: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 72 65             -- re
d5f0: 76 69 73 69 6f 6e 20 63 68 61 6e 67 65 73 65 74  vision changeset
d600: 73 0a 09 20 20 20 20 41 4e 44 20 20 20 20 43 4f  s..    AND    CO
d610: 2e 63 69 64 20 3d 20 43 2e 63 69 64 20 20 20 20  .cid = C.cid    
d620: 20 20 20 2d 2d 20 47 65 74 20 74 68 65 69 72 20     -- Get their 
d630: 74 6f 70 6f 6c 6f 67 69 63 61 6c 20 6f 72 64 65  topological orde
d640: 72 69 6e 67 0a 09 20 20 20 20 47 52 4f 55 50 20  ring..    GROUP 
d650: 42 59 20 42 2e 62 69 64 0a 09 7d 5d 5d 0a 0a 09  BY B.bid..}]]...
d660: 73 65 74 20 6d 69 6e 73 20 5b 73 74 61 74 65 20  set mins [state 
d670: 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f  run [subst -noco
d680: 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c  mmands -nobacksl
d690: 61 73 68 65 73 20 7b 0a 09 20 20 20 20 2d 2d 20  ashes {..    -- 
d6a0: 6d 69 6e 69 6d 61 6c 20 73 75 63 63 65 73 73 6f  minimal successo
d6b0: 72 20 70 6f 73 69 74 69 6f 6e 20 70 65 72 20 62  r position per b
d6c0: 72 61 6e 63 68 0a 09 20 20 20 20 53 45 4c 45 43  ranch..    SELEC
d6d0: 54 20 42 2e 62 69 64 2c 20 4d 49 4e 20 28 43 4f  T B.bid, MIN (CO
d6e0: 2e 70 6f 73 29 0a 09 20 20 20 20 46 52 4f 4d 20  .pos)..    FROM 
d6f0: 20 20 62 72 61 6e 63 68 20 42 2c 20 72 65 76 69    branch B, revi
d700: 73 69 6f 6e 20 52 2c 20 63 73 69 74 65 6d 20 43  sion R, csitem C
d710: 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43 2c 20  I, changeset C, 
d720: 63 73 6f 72 64 65 72 20 43 4f 0a 09 20 20 20 20  csorder CO..    
d730: 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20  WHERE  B.bid IN 
d740: 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52  $theset     -- R
d750: 65 73 74 72 69 63 74 20 74 6f 20 62 72 61 6e 63  estrict to branc
d760: 68 65 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  hes of interest.
d770: 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 66 69  .    AND    B.fi
d780: 72 73 74 20 3d 20 52 2e 72 69 64 20 20 20 20 20  rst = R.rid     
d790: 20 2d 2d 20 47 65 74 20 74 68 65 20 66 69 72 73   -- Get the firs
d7a0: 74 20 72 65 76 69 73 69 6f 6e 73 20 6f 6e 20 74  t revisions on t
d7b0: 68 65 20 62 72 61 6e 63 68 65 73 0a 09 20 20 20  he branches..   
d7c0: 20 41 4e 44 20 20 20 20 43 49 2e 69 69 64 20 3d   AND    CI.iid =
d7d0: 20 52 2e 72 69 64 20 20 20 20 20 20 20 2d 2d 20   R.rid       -- 
d7e0: 47 65 74 20 63 68 61 6e 67 65 73 65 74 73 20 63  Get changesets c
d7f0: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 0a 09 20  ontaining the.. 
d800: 20 20 20 41 4e 44 20 20 20 20 43 2e 63 69 64 20     AND    C.cid 
d810: 3d 20 43 49 2e 63 69 64 09 2d 2d 20 66 69 72 73  = CI.cid.-- firs
d820: 74 20 72 65 76 69 73 69 6f 6e 73 2c 20 77 68 69  t revisions, whi
d830: 63 68 20 61 72 65 0a 09 20 20 20 20 41 4e 44 20  ch are..    AND 
d840: 20 20 20 43 2e 74 79 70 65 20 3d 20 30 09 09 2d     C.type = 0..-
d850: 2d 20 72 65 76 69 73 69 6f 6e 20 63 68 61 6e 67  - revision chang
d860: 65 73 65 74 73 0a 09 20 20 20 20 41 4e 44 20 20  esets..    AND  
d870: 20 20 43 4f 2e 63 69 64 20 3d 20 43 2e 63 69 64    CO.cid = C.cid
d880: 09 2d 2d 20 47 65 74 20 74 68 65 69 72 20 74 6f  .-- Get their to
d890: 70 6f 6c 6f 67 69 63 61 6c 20 6f 72 64 65 72 69  pological orderi
d8a0: 6e 67 0a 09 20 20 20 20 47 52 4f 55 50 20 42 59  ng..    GROUP BY
d8b0: 20 42 2e 62 69 64 0a 09 7d 5d 5d 0a 0a 20 20 20   B.bid..}]]..   
d8c0: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73       return [lis
d8d0: 74 20 24 6d 61 78 70 20 24 6d 69 6e 73 5d 0a 20  t $maxp $mins]. 
d8e0: 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23     }..    # # ##
d8f0: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23   ### ##### #####
d900: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
d910: 23 0a 20 20 20 20 23 23 20 43 6f 6e 66 69 67 75  #.    ## Configu
d920: 72 61 74 69 6f 6e 0a 0a 20 20 20 20 70 72 61 67  ration..    prag
d930: 6d 61 20 2d 68 61 73 69 6e 73 74 61 6e 63 65 73  ma -hasinstances
d940: 20 20 20 6e 6f 20 3b 20 23 20 73 69 6e 67 6c 65     no ; # single
d950: 74 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61 20 2d  ton.    pragma -
d960: 68 61 73 74 79 70 65 69 6e 66 6f 20 20 20 20 6e  hastypeinfo    n
d970: 6f 20 3b 20 23 20 6e 6f 20 69 6e 74 72 6f 73 70  o ; # no introsp
d980: 65 63 74 69 6f 6e 0a 20 20 20 20 70 72 61 67 6d  ection.    pragm
d990: 61 20 2d 68 61 73 74 79 70 65 64 65 73 74 72 6f  a -hastypedestro
d9a0: 79 20 6e 6f 20 3b 20 23 20 69 6d 6d 6f 72 74 61  y no ; # immorta
d9b0: 6c 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20  l.}..# # ## ### 
d9c0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23  ##### ######## #
d9d0: 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23 23  ############ ###
d9e0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
d9f0: 23 23 0a 23 23 0a 0a 6e 61 6d 65 73 70 61 63 65  ##.##..namespace
da00: 20 65 76 61 6c 20 3a 3a 76 63 3a 3a 66 6f 73 73   eval ::vc::foss
da10: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a  il::import::cvs:
da20: 3a 70 72 6f 6a 65 63 74 20 7b 0a 20 20 20 20 6e  :project {.    n
da30: 61 6d 65 73 70 61 63 65 20 65 78 70 6f 72 74 20  amespace export 
da40: 72 65 76 0a 20 20 20 20 6e 61 6d 65 73 70 61 63  rev.    namespac
da50: 65 20 65 76 61 6c 20 72 65 76 20 7b 0a 09 6e 61  e eval rev {..na
da60: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
da70: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70  :vc::fossil::imp
da80: 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a  ort::cvs::state.
da90: 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72  .namespace impor
daa0: 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a  t ::vc::fossil::
dab0: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e 74  import::cvs::int
dac0: 65 67 72 69 74 79 0a 09 6e 61 6d 65 73 70 61 63  egrity..namespac
dad0: 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74  e import ::vc::t
dae0: 6f 6f 6c 73 3a 3a 6d 69 73 63 3a 3a 2a 0a 09 6e  ools::misc::*..n
daf0: 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20  amespace import 
db00: 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 74 72 6f  ::vc::tools::tro
db10: 75 62 6c 65 0a 09 6e 61 6d 65 73 70 61 63 65 20  uble..namespace 
db20: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f  import ::vc::too
db30: 6c 73 3a 3a 6c 6f 67 0a 09 6c 6f 67 20 72 65 67  ls::log..log reg
db40: 69 73 74 65 72 20 63 73 65 74 73 0a 0a 09 23 20  ister csets...# 
db50: 53 65 74 20 75 70 20 74 68 65 20 68 65 6c 70 65  Set up the helpe
db60: 72 20 73 69 6e 67 6c 65 74 6f 6e 73 0a 09 6e 61  r singletons..na
db70: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 72 65 76  mespace eval rev
db80: 20 7b 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63   {..    namespac
db90: 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66  e import ::vc::f
dba0: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63  ossil::import::c
dbb0: 76 73 3a 3a 73 74 61 74 65 0a 09 20 20 20 20 6e  vs::state..    n
dbc0: 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20  amespace import 
dbd0: 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d  ::vc::fossil::im
dbe0: 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e 74 65 67  port::cvs::integ
dbf0: 72 69 74 79 0a 09 20 20 20 20 6e 61 6d 65 73 70  rity..    namesp
dc00: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a  ace import ::vc:
dc10: 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 7d 0a 09  :tools::log..}..
dc20: 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 73  namespace eval s
dc30: 79 6d 3a 3a 74 61 67 20 7b 0a 09 20 20 20 20 6e  ym::tag {..    n
dc40: 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20  amespace import 
dc50: 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d  ::vc::fossil::im
dc60: 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65  port::cvs::state
dc70: 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20  ..    namespace 
dc80: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73  import ::vc::fos
dc90: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73  sil::import::cvs
dca0: 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 20 20 20  ::integrity..   
dcb0: 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72   namespace impor
dcc0: 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c  t ::vc::tools::l
dcd0: 6f 67 0a 09 7d 0a 09 6e 61 6d 65 73 70 61 63 65  og..}..namespace
dce0: 20 65 76 61 6c 20 73 79 6d 3a 3a 62 72 61 6e 63   eval sym::branc
dcf0: 68 20 7b 0a 09 20 20 20 20 6e 61 6d 65 73 70 61  h {..    namespa
dd00: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a  ce import ::vc::
dd10: 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a  fossil::import::
dd20: 63 76 73 3a 3a 73 74 61 74 65 0a 09 20 20 20 20  cvs::state..    
dd30: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74  namespace import
dd40: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
dd50: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e 74 65  mport::cvs::inte
dd60: 67 72 69 74 79 0a 09 20 20 20 20 6e 61 6d 65 73  grity..    names
dd70: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63  pace import ::vc
dd80: 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 7d 0a  ::tools::log..}.
dd90: 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20      }.}..# # ## 
dda0: 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23  ### ##### ######
ddb0: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
ddc0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
ddd0: 23 23 23 23 23 23 0a 23 23 20 52 65 61 64 79 0a  ######.## Ready.
dde0: 0a 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65  .package provide
ddf0: 20 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70   vc::fossil::imp
de00: 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63  ort::cvs::projec
de10: 74 3a 3a 72 65 76 20 31 2e 30 0a 72 65 74 75 72  t::rev 1.0.retur
de20: 6e 0a                                            n.