Hex Artifact Content
Not logged in

Artifact 604b326cf45892c48031bb8ed9c2329609e17e04:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [faf57d7462] - Modified the changeset class to move handling of the changeset lists to fully after their creation and storage. This is item (3) in cvsfossil.txt. The results do not satisfy however. During the creation of each changeset memory usage is (fractonally) lower, however at the end, after all changesets haven been loaded memory usage is consistently higher. The reason for that is not known. I am saving this for possible future evolution and usage, but will not pursue this further right now. The gains seem to be too small compared to the overall loss. InitializeBreakstate is likely a better target, despite its complexity. by aku on 2008-02-20 06:03:48.

0000: 23 23 20 2d 2a 2d 20 74 63 6c 20 2d 2a 2d 0a 23  ## -*- tcl -*-.#
0010: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20   # ## ### ##### 
0020: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
0030: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
0040: 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20  ############.## 
0050: 43 6f 70 79 72 69 67 68 74 20 28 63 29 20 32 30  Copyright (c) 20
0060: 30 37 2d 32 30 30 38 20 41 6e 64 72 65 61 73 20  07-2008 Andreas 
0070: 4b 75 70 72 69 65 73 2e 0a 23 0a 23 20 54 68 69  Kupries..#.# Thi
0080: 73 20 73 6f 66 74 77 61 72 65 20 69 73 20 6c 69  s software is li
0090: 63 65 6e 73 65 64 20 61 73 20 64 65 73 63 72 69  censed as descri
00a0: 62 65 64 20 69 6e 20 74 68 65 20 66 69 6c 65 20  bed in the file 
00b0: 4c 49 43 45 4e 53 45 2c 20 77 68 69 63 68 0a 23  LICENSE, which.#
00c0: 20 79 6f 75 20 73 68 6f 75 6c 64 20 68 61 76 65   you should have
00d0: 20 72 65 63 65 69 76 65 64 20 61 73 20 70 61 72   received as par
00e0: 74 20 6f 66 20 74 68 69 73 20 64 69 73 74 72 69  t of this distri
00f0: 62 75 74 69 6f 6e 2e 0a 23 0a 23 20 54 68 69 73  bution..#.# This
0100: 20 73 6f 66 74 77 61 72 65 20 63 6f 6e 73 69 73   software consis
0110: 74 73 20 6f 66 20 76 6f 6c 75 6e 74 61 72 79 20  ts of voluntary 
0120: 63 6f 6e 74 72 69 62 75 74 69 6f 6e 73 20 6d 61  contributions ma
0130: 64 65 20 62 79 20 6d 61 6e 79 0a 23 20 69 6e 64  de by many.# ind
0140: 69 76 69 64 75 61 6c 73 2e 20 20 46 6f 72 20 65  ividuals.  For e
0150: 78 61 63 74 20 63 6f 6e 74 72 69 62 75 74 69 6f  xact contributio
0160: 6e 20 68 69 73 74 6f 72 79 2c 20 73 65 65 20 74  n history, see t
0170: 68 65 20 72 65 76 69 73 69 6f 6e 0a 23 20 68 69  he revision.# hi
0180: 73 74 6f 72 79 20 61 6e 64 20 6c 6f 67 73 2c 20  story and logs, 
0190: 61 76 61 69 6c 61 62 6c 65 20 61 74 20 68 74 74  available at htt
01a0: 70 3a 2f 2f 66 6f 73 73 69 6c 2d 73 63 6d 2e 68  p://fossil-scm.h
01b0: 77 61 63 69 2e 63 6f 6d 2f 66 6f 73 73 69 6c 0a  waci.com/fossil.
01c0: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
01d0: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
01e0: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
01f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a 23  #############..#
0200: 23 20 52 65 76 69 73 69 6f 6e 73 20 70 65 72 20  # Revisions per 
0210: 70 72 6f 6a 65 63 74 2c 20 61 6b 61 20 43 68 61  project, aka Cha
0220: 6e 67 65 73 65 74 73 2e 20 54 68 65 73 65 20 6f  ngesets. These o
0230: 62 6a 65 63 74 73 20 61 72 65 20 66 69 72 73 74  bjects are first
0240: 20 75 73 65 64 0a 23 23 20 69 6e 20 70 61 73 73   used.## in pass
0250: 20 35 2c 20 77 68 69 63 68 20 63 72 65 61 74 65   5, which create
0260: 73 20 74 68 65 20 69 6e 69 74 69 61 6c 20 73 65  s the initial se
0270: 74 20 63 6f 76 65 72 69 6e 67 20 74 68 65 20 72  t covering the r
0280: 65 70 6f 73 69 74 6f 72 79 2e 0a 0a 23 20 23 20  epository...# # 
0290: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
02a0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
02b0: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
02c0: 23 23 23 23 23 23 23 23 23 0a 23 23 20 52 65 71  #########.## Req
02d0: 75 69 72 65 6d 65 6e 74 73 0a 0a 70 61 63 6b 61  uirements..packa
02e0: 67 65 20 72 65 71 75 69 72 65 20 54 63 6c 20 38  ge require Tcl 8
02f0: 2e 34 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .4              
0300: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0310: 20 3b 20 23 20 52 65 71 75 69 72 65 64 20 72 75   ; # Required ru
0320: 6e 74 69 6d 65 2e 0a 70 61 63 6b 61 67 65 20 72  ntime..package r
0330: 65 71 75 69 72 65 20 73 6e 69 74 20 20 20 20 20  equire snit     
0340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0350: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23               ; #
0360: 20 4f 4f 20 73 79 73 74 65 6d 2e 0a 70 61 63 6b   OO system..pack
0370: 61 67 65 20 72 65 71 75 69 72 65 20 73 74 72 75  age require stru
0380: 63 74 3a 3a 73 65 74 20 20 20 20 20 20 20 20 20  ct::set         
0390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
03a0: 20 20 3b 20 23 20 53 65 74 20 6f 70 65 72 61 74    ; # Set operat
03b0: 69 6f 6e 73 2e 0a 70 61 63 6b 61 67 65 20 72 65  ions..package re
03c0: 71 75 69 72 65 20 76 63 3a 3a 74 6f 6f 6c 73 3a  quire vc::tools:
03d0: 3a 6d 69 73 63 20 20 20 20 20 20 20 20 20 20 20  :misc           
03e0: 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23 20              ; # 
03f0: 54 65 78 74 20 66 6f 72 6d 61 74 74 69 6e 67 0a  Text formatting.
0400: 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20  package require 
0410: 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 74 72 6f 75 62  vc::tools::troub
0420: 6c 65 20 20 20 20 20 20 20 20 20 20 20 20 20 20  le              
0430: 20 20 20 20 20 20 3b 20 23 20 45 72 72 6f 72 20        ; # Error 
0440: 72 65 70 6f 72 74 69 6e 67 2e 0a 70 61 63 6b 61  reporting..packa
0450: 67 65 20 72 65 71 75 69 72 65 20 76 63 3a 3a 74  ge require vc::t
0460: 6f 6f 6c 73 3a 3a 6c 6f 67 20 20 20 20 20 20 20  ools::log       
0470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0480: 20 3b 20 23 20 55 73 65 72 20 66 65 65 64 62 61   ; # User feedba
0490: 63 6b 2e 0a 70 61 63 6b 61 67 65 20 72 65 71 75  ck..package requ
04a0: 69 72 65 20 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a  ire vc::fossil::
04b0: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61  import::cvs::sta
04c0: 74 65 20 20 20 20 20 20 20 20 3b 20 23 20 53 74  te        ; # St
04d0: 61 74 65 20 73 74 6f 72 61 67 65 2e 0a 70 61 63  ate storage..pac
04e0: 6b 61 67 65 20 72 65 71 75 69 72 65 20 76 63 3a  kage require vc:
04f0: 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a  :fossil::import:
0500: 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 20  :cvs::integrity 
0510: 20 20 20 3b 20 23 20 53 74 61 74 65 20 69 6e 74     ; # State int
0520: 65 67 72 69 74 79 20 63 68 65 63 6b 73 2e 0a 0a  egrity checks...
0530: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
0540: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
0550: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
0560: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23  #############.##
0570: 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20 3a 3a 76  ..snit::type ::v
0580: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72  c::fossil::impor
0590: 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a  t::cvs::project:
05a0: 3a 72 65 76 20 7b 0a 20 20 20 20 23 20 23 20 23  :rev {.    # # #
05b0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
05c0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
05d0: 23 23 0a 20 20 20 20 23 23 20 50 75 62 6c 69 63  ##.    ## Public
05e0: 20 41 50 49 0a 0a 20 20 20 20 63 6f 6e 73 74 72   API..    constr
05f0: 75 63 74 6f 72 20 7b 70 72 6f 6a 65 63 74 20 63  uctor {project c
0600: 73 74 79 70 65 20 73 72 63 69 64 20 69 74 65 6d  stype srcid item
0610: 73 20 7b 74 68 65 69 64 20 7b 7d 7d 7d 20 7b 0a  s {theid {}}} {.
0620: 09 69 66 20 7b 24 74 68 65 69 64 20 6e 65 20 22  .if {$theid ne "
0630: 22 7d 20 7b 0a 09 20 20 20 20 73 65 74 20 6d 79  "} {..    set my
0640: 69 64 20 24 74 68 65 69 64 0a 09 7d 20 65 6c 73  id $theid..} els
0650: 65 20 7b 0a 09 20 20 20 20 73 65 74 20 6d 79 69  e {..    set myi
0660: 64 20 5b 69 6e 63 72 20 6d 79 63 6f 75 6e 74 65  d [incr mycounte
0670: 72 5d 0a 09 7d 0a 0a 09 69 6e 74 65 67 72 69 74  r]..}...integrit
0680: 79 20 61 73 73 65 72 74 20 7b 0a 09 20 20 20 20  y assert {..    
0690: 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 6d 79 63  [info exists myc
06a0: 73 74 79 70 65 28 24 63 73 74 79 70 65 29 5d 0a  stype($cstype)].
06b0: 09 7d 20 7b 42 61 64 20 63 68 61 6e 67 65 73 65  .} {Bad changese
06c0: 74 20 74 79 70 65 20 27 24 63 73 74 79 70 65 27  t type '$cstype'
06d0: 2e 7d 0a 0a 09 73 65 74 20 6d 79 70 72 6f 6a 65  .}...set myproje
06e0: 63 74 20 20 20 24 70 72 6f 6a 65 63 74 0a 09 73  ct   $project..s
06f0: 65 74 20 6d 79 74 79 70 65 20 20 20 20 20 20 24  et mytype      $
0700: 63 73 74 79 70 65 0a 09 73 65 74 20 6d 79 74 79  cstype..set myty
0710: 70 65 6f 62 6a 20 20 20 3a 3a 76 63 3a 3a 66 6f  peobj   ::vc::fo
0720: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
0730: 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a  s::project::rev:
0740: 3a 24 7b 63 73 74 79 70 65 7d 0a 09 73 65 74 20  :${cstype}..set 
0750: 6d 79 73 72 63 69 64 09 24 73 72 63 69 64 0a 09  mysrcid.$srcid..
0760: 73 65 74 20 6d 79 69 74 65 6d 73 20 20 20 20 20  set myitems     
0770: 24 69 74 65 6d 73 0a 09 73 65 74 20 6d 79 70 6f  $items..set mypo
0780: 73 20 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 43  s       {} ; # C
0790: 6f 6d 6d 69 74 20 6c 6f 63 61 74 69 6f 6e 20 69  ommit location i
07a0: 73 20 6e 6f 74 20 6b 6e 6f 77 6e 20 79 65 74 2e  s not known yet.
07b0: 0a 0a 09 23 20 4b 65 65 70 20 74 72 61 63 6b 20  ...# Keep track 
07c0: 6f 66 20 74 68 65 20 67 65 6e 65 72 61 74 65 64  of the generated
07d0: 20 63 68 61 6e 67 65 73 65 74 73 20 61 6e 64 20   changesets and 
07e0: 6f 66 20 74 68 65 20 69 6e 76 65 72 73 65 0a 09  of the inverse..
07f0: 23 20 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 69  # mapping from i
0800: 74 65 6d 73 20 74 6f 20 74 68 65 6d 2e 0a 09 23  tems to them...#
0810: 6c 61 70 70 65 6e 64 20 6d 79 63 68 61 6e 67 65  lappend mychange
0820: 73 65 74 73 20 20 20 24 73 65 6c 66 0a 09 23 6c  sets   $self..#l
0830: 61 70 70 65 6e 64 20 6d 79 74 63 68 61 6e 67 65  append mytchange
0840: 73 65 74 73 28 24 63 73 74 79 70 65 29 20 24 73  sets($cstype) $s
0850: 65 6c 66 0a 09 73 65 74 20 20 20 20 20 6d 79 69  elf..set     myi
0860: 64 6d 61 70 28 24 6d 79 69 64 29 20 24 73 65 6c  dmap($myid) $sel
0870: 66 0a 09 66 6f 72 65 61 63 68 20 69 69 64 20 24  f..foreach iid $
0880: 69 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65 74  items {..    set
0890: 20 6b 65 79 20 5b 6c 69 73 74 20 24 63 73 74 79   key [list $csty
08a0: 70 65 20 24 69 69 64 5d 0a 09 20 20 20 20 23 73  pe $iid]..    #s
08b0: 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24 6b 65  et myitemmap($ke
08c0: 79 29 20 24 73 65 6c 66 0a 09 20 20 20 20 6c 61  y) $self..    la
08d0: 70 70 65 6e 64 20 6d 79 74 69 74 65 6d 73 20 24  ppend mytitems $
08e0: 6b 65 79 0a 09 20 20 20 20 6c 6f 67 20 77 72 69  key..    log wri
08f0: 74 65 20 38 20 63 73 65 74 73 20 7b 4d 41 50 2b  te 8 csets {MAP+
0900: 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73 65   item <$key> $se
0910: 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d  lf = [$self str]
0920: 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20  }..}..return.   
0930: 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 6c   }..    method l
0940: 6f 61 64 6d 61 70 73 20 7b 7d 20 7b 0a 09 23 20  oadmaps {} {..# 
0950: 4b 65 65 70 20 74 72 61 63 6b 20 6f 66 20 74 68  Keep track of th
0960: 65 20 67 65 6e 65 72 61 74 65 64 20 63 68 61 6e  e generated chan
0970: 67 65 73 65 74 73 20 61 6e 64 20 6f 66 20 74 68  gesets and of th
0980: 65 20 69 6e 76 65 72 73 65 0a 09 23 20 6d 61 70  e inverse..# map
0990: 70 69 6e 67 20 66 72 6f 6d 20 69 74 65 6d 73 20  ping from items 
09a0: 74 6f 20 74 68 65 6d 2e 0a 09 6c 61 70 70 65 6e  to them...lappen
09b0: 64 20 6d 79 63 68 61 6e 67 65 73 65 74 73 20 20  d mychangesets  
09c0: 20 24 73 65 6c 66 0a 09 6c 61 70 70 65 6e 64 20   $self..lappend 
09d0: 6d 79 74 63 68 61 6e 67 65 73 65 74 73 28 24 6d  mytchangesets($m
09e0: 79 74 79 70 65 29 20 24 73 65 6c 66 0a 09 73 65  ytype) $self..se
09f0: 74 20 20 20 20 20 6d 79 69 64 6d 61 70 28 24 6d  t     myidmap($m
0a00: 79 69 64 29 20 24 73 65 6c 66 0a 09 66 6f 72 65  yid) $self..fore
0a10: 61 63 68 20 69 69 64 20 24 6d 79 69 74 65 6d 73  ach iid $myitems
0a20: 20 7b 0a 09 20 20 20 20 73 65 74 20 6b 65 79 20   {..    set key 
0a30: 5b 6c 69 73 74 20 24 6d 79 74 79 70 65 20 24 69  [list $mytype $i
0a40: 69 64 5d 0a 09 20 20 20 20 73 65 74 20 6d 79 69  id]..    set myi
0a50: 74 65 6d 6d 61 70 28 24 6b 65 79 29 20 24 73 65  temmap($key) $se
0a60: 6c 66 0a 09 20 20 20 20 23 6c 6f 67 20 77 72 69  lf..    #log wri
0a70: 74 65 20 38 20 63 73 65 74 73 20 7b 4d 41 50 2b  te 8 csets {MAP+
0a80: 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73 65   item <$key> $se
0a90: 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d  lf = [$self str]
0aa0: 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20  }..}..return.   
0ab0: 20 7d 0a 0a 20 20 20 20 64 65 73 74 72 75 63 74   }..    destruct
0ac0: 6f 72 20 7b 0a 09 23 20 54 68 65 20 6d 61 69 6e  or {..# The main
0ad0: 20 74 68 69 6e 67 20 69 73 20 74 6f 20 6b 65 65   thing is to kee
0ae0: 70 20 74 72 61 63 6b 20 6f 66 20 74 68 65 20 69  p track of the i
0af0: 74 65 6d 6d 61 70 20 61 6e 64 20 72 65 6d 6f 76  temmap and remov
0b00: 65 0a 09 23 20 74 68 65 20 6f 62 6a 65 63 74 20  e..# the object 
0b10: 66 72 6f 6d 20 69 74 2e 20 54 68 65 20 6c 69 73  from it. The lis
0b20: 74 73 20 6f 66 20 63 68 61 6e 67 65 73 65 74 73  ts of changesets
0b30: 20 28 6d 79 63 68 61 6e 67 65 73 65 74 73 2c 0a   (mychangesets,.
0b40: 09 23 20 6d 79 74 63 68 61 6e 67 65 73 65 74 73  .# mytchangesets
0b50: 29 20 61 72 65 20 6e 6f 74 20 6d 61 69 6e 74 61  ) are not mainta
0b60: 69 6e 65 64 20 28 3d 20 72 65 64 75 63 65 64 29  ined (= reduced)
0b70: 2c 20 66 6f 72 20 74 68 65 0a 09 23 20 6d 6f 6d  , for the..# mom
0b80: 65 6e 74 2e 20 57 65 20 6d 61 79 20 62 65 20 61  ent. We may be a
0b90: 62 6c 65 20 74 6f 20 67 65 74 20 72 69 64 20 6f  ble to get rid o
0ba0: 66 20 74 68 69 73 20 65 6e 74 69 72 65 6c 79 2c  f this entirely,
0bb0: 20 61 74 20 6c 65 61 73 74 0a 09 23 20 66 6f 72   at least..# for
0bc0: 20 28 64 65 29 63 6f 6e 73 74 72 75 63 74 69 6f   (de)constructio
0bd0: 6e 20 61 6e 64 20 70 61 73 73 20 49 6e 69 74 43  n and pass InitC
0be0: 53 65 74 73 2e 0a 0a 09 66 6f 72 65 61 63 68 20  Sets....foreach 
0bf0: 69 69 64 20 24 6d 79 69 74 65 6d 73 20 7b 0a 09  iid $myitems {..
0c00: 20 20 20 20 73 65 74 20 6b 65 79 20 5b 6c 69 73      set key [lis
0c10: 74 20 24 6d 79 74 79 70 65 20 24 69 69 64 5d 0a  t $mytype $iid].
0c20: 09 20 20 20 20 23 75 6e 73 65 74 20 6d 79 69 74  .    #unset myit
0c30: 65 6d 6d 61 70 28 24 6b 65 79 29 0a 09 20 20 20  emmap($key)..   
0c40: 20 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73 65   log write 8 cse
0c50: 74 73 20 7b 4d 41 50 2d 20 69 74 65 6d 20 3c 24  ts {MAP- item <$
0c60: 6b 65 79 3e 20 24 73 65 6c 66 20 3d 20 5b 24 73  key> $self = [$s
0c70: 65 6c 66 20 73 74 72 5d 7d 0a 09 7d 0a 09 72 65  elf str]}..}..re
0c80: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
0c90: 6d 65 74 68 6f 64 20 73 74 72 20 7b 7d 20 7b 0a  method str {} {.
0ca0: 09 73 65 74 20 73 74 72 20 20 20 20 22 3c 22 0a  .set str    "<".
0cb0: 09 73 65 74 20 64 65 74 61 69 6c 20 22 22 0a 09  .set detail ""..
0cc0: 69 66 20 7b 5b 24 6d 79 74 79 70 65 6f 62 6a 20  if {[$mytypeobj 
0cd0: 62 79 73 79 6d 62 6f 6c 5d 7d 20 7b 0a 09 20 20  bysymbol]} {..  
0ce0: 20 20 73 65 74 20 64 65 74 61 69 6c 20 22 20 27    set detail " '
0cf0: 5b 73 74 61 74 65 20 6f 6e 65 20 7b 0a 09 09 53  [state one {...S
0d00: 45 4c 45 43 54 20 53 2e 6e 61 6d 65 0a 09 09 46  ELECT S.name...F
0d10: 52 4f 4d 20 20 20 73 79 6d 62 6f 6c 20 53 0a 09  ROM   symbol S..
0d20: 09 57 48 45 52 45 20 20 53 2e 73 69 64 20 3d 20  .WHERE  S.sid = 
0d30: 24 6d 79 73 72 63 69 64 0a 09 20 20 20 20 7d 5d  $mysrcid..    }]
0d40: 27 22 0a 09 7d 0a 09 61 70 70 65 6e 64 20 73 74  '"..}..append st
0d50: 72 20 22 24 6d 79 74 79 70 65 20 24 7b 6d 79 69  r "$mytype ${myi
0d60: 64 7d 24 7b 64 65 74 61 69 6c 7d 3e 22 0a 09 72  d}${detail}>"..r
0d70: 65 74 75 72 6e 20 24 73 74 72 0a 20 20 20 20 7d  eturn $str.    }
0d80: 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 6c 6f 64  ..    method lod
0d90: 20 7b 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b 24   {} {..return [$
0da0: 6d 79 74 79 70 65 6f 62 6a 20 63 73 5f 6c 6f 64  mytypeobj cs_lod
0db0: 20 24 6d 79 69 74 65 6d 73 5d 0a 20 20 20 20 7d   $myitems].    }
0dc0: 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 69 64 20  ..    method id 
0dd0: 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 24     {} { return $
0de0: 6d 79 69 64 20 7d 0a 20 20 20 20 6d 65 74 68 6f  myid }.    metho
0df0: 64 20 69 74 65 6d 73 20 7b 7d 20 7b 20 72 65 74  d items {} { ret
0e00: 75 72 6e 20 24 6d 79 74 69 74 65 6d 73 20 7d 0a  urn $mytitems }.
0e10: 20 20 20 20 6d 65 74 68 6f 64 20 64 61 74 61 20      method data 
0e20: 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 5b 6c 69   {} { return [li
0e30: 73 74 20 24 6d 79 70 72 6f 6a 65 63 74 20 24 6d  st $myproject $m
0e40: 79 74 79 70 65 20 24 6d 79 73 72 63 69 64 5d 20  ytype $mysrcid] 
0e50: 7d 0a 0a 20 20 20 20 64 65 6c 65 67 61 74 65 20  }..    delegate 
0e60: 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20  method bysymbol 
0e70: 20 20 74 6f 20 6d 79 74 79 70 65 6f 62 6a 0a 20    to mytypeobj. 
0e80: 20 20 20 64 65 6c 65 67 61 74 65 20 6d 65 74 68     delegate meth
0e90: 6f 64 20 62 79 72 65 76 69 73 69 6f 6e 20 74 6f  od byrevision to
0ea0: 20 6d 79 74 79 70 65 6f 62 6a 0a 20 20 20 20 64   mytypeobj.    d
0eb0: 65 6c 65 67 61 74 65 20 6d 65 74 68 6f 64 20 69  elegate method i
0ec0: 73 62 72 61 6e 63 68 20 20 20 74 6f 20 6d 79 74  sbranch   to myt
0ed0: 79 70 65 6f 62 6a 0a 20 20 20 20 64 65 6c 65 67  ypeobj.    deleg
0ee0: 61 74 65 20 6d 65 74 68 6f 64 20 69 73 74 61 67  ate method istag
0ef0: 20 20 20 20 20 20 74 6f 20 6d 79 74 79 70 65 6f        to mytypeo
0f00: 62 6a 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 73  bj..    method s
0f10: 65 74 70 6f 73 20 7b 70 7d 20 7b 20 73 65 74 20  etpos {p} { set 
0f20: 6d 79 70 6f 73 20 24 70 20 3b 20 72 65 74 75 72  mypos $p ; retur
0f30: 6e 20 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20 70  n }.    method p
0f40: 6f 73 20 20 20 20 7b 7d 20 20 7b 20 72 65 74 75  os    {}  { retu
0f50: 72 6e 20 24 6d 79 70 6f 73 20 7d 0a 0a 20 20 20  rn $mypos }..   
0f60: 20 6d 65 74 68 6f 64 20 64 65 74 65 72 6d 69 6e   method determin
0f70: 65 73 75 63 63 65 73 73 6f 72 73 20 7b 7d 20 7b  esuccessors {} {
0f80: 0a 09 23 20 50 61 73 73 20 36 20 6f 70 65 72 61  ..# Pass 6 opera
0f90: 74 69 6f 6e 2e 20 43 6f 6d 70 75 74 65 20 70 72  tion. Compute pr
0fa0: 6f 6a 65 63 74 2d 6c 65 76 65 6c 20 64 65 70 65  oject-level depe
0fb0: 6e 64 65 6e 63 69 65 73 20 66 72 6f 6d 0a 09 23  ndencies from..#
0fc0: 20 74 68 65 20 66 69 6c 65 2d 6c 65 76 65 6c 20   the file-level 
0fd0: 64 61 74 61 20 61 6e 64 20 73 61 76 65 20 69 74  data and save it
0fe0: 20 62 61 63 6b 20 74 6f 20 74 68 65 20 73 74 61   back to the sta
0ff0: 74 65 2e 20 54 68 69 73 20 6d 61 79 0a 09 23 20  te. This may..# 
1000: 62 65 20 63 61 6c 6c 65 64 20 64 75 72 69 6e 67  be called during
1010: 20 74 68 65 20 63 79 63 6c 65 20 62 72 65 61 6b   the cycle break
1020: 65 72 20 70 61 73 73 65 73 20 61 73 20 77 65 6c  er passes as wel
1030: 6c 2c 20 74 6f 20 61 64 6a 75 73 74 0a 09 23 20  l, to adjust..# 
1040: 74 68 65 20 73 75 63 63 65 73 73 6f 72 20 69 6e  the successor in
1050: 66 6f 72 6d 61 74 69 6f 6e 20 6f 66 20 63 68 61  formation of cha
1060: 6e 67 65 73 65 74 73 20 77 68 69 63 68 20 61 72  ngesets which ar
1070: 65 20 74 68 65 0a 09 23 20 70 72 65 64 65 63 65  e the..# predece
1080: 73 73 6f 72 73 20 6f 66 20 64 72 6f 70 70 65 64  ssors of dropped
1090: 20 63 68 61 6e 67 65 73 65 74 73 2e 20 46 6f 72   changesets. For
10a0: 20 74 68 65 6d 20 77 65 20 68 61 76 65 20 74 6f   them we have to
10b0: 0a 09 23 20 72 65 6d 6f 76 65 20 74 68 65 69 72  ..# remove their
10c0: 20 65 78 69 73 74 69 6e 67 20 69 6e 66 6f 72 6d   existing inform
10d0: 61 74 69 6f 6e 20 66 69 72 73 74 20 62 65 66 6f  ation first befo
10e0: 72 65 20 69 6e 73 65 72 74 69 6e 67 20 74 68 65  re inserting the
10f0: 0a 09 23 20 6e 65 77 20 64 61 74 61 2e 0a 09 73  ..# new data...s
1100: 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20  tate run {..    
1110: 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 73 73 75  DELETE FROM cssu
1120: 63 63 65 73 73 6f 72 20 57 48 45 52 45 20 63 69  ccessor WHERE ci
1130: 64 20 3d 20 24 6d 79 69 64 3b 0a 09 7d 0a 09 73  d = $myid;..}..s
1140: 65 74 20 6c 6f 6f 70 20 30 0a 09 66 6f 72 65 61  et loop 0..forea
1150: 63 68 20 6e 69 64 20 5b 24 6d 79 74 79 70 65 6f  ch nid [$mytypeo
1160: 62 6a 20 63 73 5f 73 75 63 63 65 73 73 6f 72 73  bj cs_successors
1170: 20 24 6d 79 69 74 65 6d 73 5d 20 7b 0a 09 20 20   $myitems] {..  
1180: 20 20 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09    state run {...
1190: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 73 73 75  INSERT INTO cssu
11a0: 63 63 65 73 73 6f 72 20 28 63 69 64 2c 20 20 6e  ccessor (cid,  n
11b0: 69 64 29 0a 09 09 56 41 4c 55 45 53 20 20 20 20  id)...VALUES    
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28 24                ($
11d0: 6d 79 69 64 2c 24 6e 69 64 29 0a 09 20 20 20 20  myid,$nid)..    
11e0: 7d 0a 09 20 20 20 20 69 66 20 7b 24 6e 69 64 20  }..    if {$nid 
11f0: 3d 3d 20 24 6d 79 69 64 7d 20 7b 20 73 65 74 20  == $myid} { set 
1200: 6c 6f 6f 70 20 31 20 7d 0a 09 7d 0a 09 23 20 52  loop 1 }..}..# R
1210: 65 70 6f 72 74 20 61 66 74 65 72 20 74 68 65 20  eport after the 
1220: 63 6f 6d 70 6c 65 74 65 20 73 74 72 75 63 74 75  complete structu
1230: 72 65 20 68 61 73 20 62 65 65 6e 20 73 61 76 65  re has been save
1240: 64 2e 0a 09 69 66 20 7b 24 6c 6f 6f 70 7d 20 7b  d...if {$loop} {
1250: 20 24 73 65 6c 66 20 72 65 70 6f 72 74 6c 6f 6f   $self reportloo
1260: 70 20 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  p }..return.    
1270: 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20  }..    # result 
1280: 3d 20 6c 69 73 74 20 28 63 68 61 6e 67 65 73 65  = list (changese
1290: 74 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 75  t).    method su
12a0: 63 63 65 73 73 6f 72 73 20 7b 7d 20 7b 0a 09 23  ccessors {} {..#
12b0: 20 55 73 65 20 74 68 65 20 64 61 74 61 20 73 61   Use the data sa
12c0: 76 65 64 20 62 79 20 70 61 73 73 20 36 2e 0a 09  ved by pass 6...
12d0: 72 65 74 75 72 6e 20 5b 73 74 72 75 63 74 3a 3a  return [struct::
12e0: 6c 69 73 74 20 6d 61 70 20 5b 73 74 61 74 65 20  list map [state 
12f0: 72 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c 45 43  run {..    SELEC
1300: 54 20 53 2e 6e 69 64 0a 09 20 20 20 20 46 52 4f  T S.nid..    FRO
1310: 4d 20 20 20 63 73 73 75 63 63 65 73 73 6f 72 20  M   cssuccessor 
1320: 53 0a 09 20 20 20 20 57 48 45 52 45 20 20 53 2e  S..    WHERE  S.
1330: 63 69 64 20 3d 20 24 6d 79 69 64 0a 09 7d 5d 20  cid = $myid..}] 
1340: 5b 6d 79 74 79 70 65 6d 65 74 68 6f 64 20 6f 66  [mytypemethod of
1350: 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  ]].    }..    # 
1360: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74  item -> list (it
1370: 65 6d 29 0a 20 20 20 20 6d 65 74 68 6f 64 20 6e  em).    method n
1380: 65 78 74 6d 61 70 20 7b 7d 20 7b 0a 09 24 6d 79  extmap {} {..$my
1390: 74 79 70 65 6f 62 6a 20 73 75 63 63 65 73 73 6f  typeobj successo
13a0: 72 73 20 74 6d 70 20 24 6d 79 69 74 65 6d 73 0a  rs tmp $myitems.
13b0: 09 72 65 74 75 72 6e 20 5b 61 72 72 61 79 20 67  .return [array g
13c0: 65 74 20 74 6d 70 5d 0a 20 20 20 20 7d 0a 0a 20  et tmp].    }.. 
13d0: 20 20 20 6d 65 74 68 6f 64 20 62 72 65 61 6b 69     method breaki
13e0: 6e 74 65 72 6e 61 6c 64 65 70 65 6e 64 65 6e 63  nternaldependenc
13f0: 69 65 73 20 7b 63 76 7d 20 7b 0a 09 75 70 76 61  ies {cv} {..upva
1400: 72 20 31 20 24 63 76 20 63 6f 75 6e 74 65 72 0a  r 1 $cv counter.
1410: 09 6c 6f 67 20 77 72 69 74 65 20 31 34 20 63 73  .log write 14 cs
1420: 65 74 73 20 7b 5b 24 73 65 6c 66 20 73 74 72 5d  ets {[$self str]
1430: 20 42 49 44 7d 0a 09 76 63 3a 3a 74 6f 6f 6c 73   BID}..vc::tools
1440: 3a 3a 6d 65 6d 3a 3a 6d 61 72 6b 0a 09 23 23 0a  ::mem::mark..##.
1450: 09 23 23 20 4e 4f 54 45 3a 20 54 68 69 73 20 6d  .## NOTE: This m
1460: 65 74 68 6f 64 2c 20 6d 61 79 62 65 20 69 6e 20  ethod, maybe in 
1470: 63 6f 6e 6a 75 6e 63 74 69 6f 6e 20 77 69 74 68  conjunction with
1480: 20 69 74 73 20 63 61 6c 6c 65 72 0a 09 23 23 20   its caller..## 
1490: 20 20 20 20 20 20 73 65 65 6d 73 20 74 6f 20 62        seems to b
14a0: 65 20 61 20 6d 65 6d 6f 72 79 20 68 6f 67 2c 20  e a memory hog, 
14b0: 65 73 70 65 63 69 61 6c 6c 79 20 66 6f 72 20 6c  especially for l
14c0: 61 72 67 65 0a 09 23 23 20 20 20 20 20 20 20 63  arge..##       c
14d0: 68 61 6e 67 65 73 65 74 73 2c 20 77 69 74 68 20  hangesets, with 
14e0: 27 6c 61 72 67 65 27 20 6d 65 61 6e 69 6e 67 20  'large' meaning 
14f0: 74 6f 20 68 61 76 65 20 61 20 27 6c 6f 6e 67 20  to have a 'long 
1500: 6c 69 73 74 0a 09 23 23 20 20 20 20 20 20 20 6f  list..##       o
1510: 66 20 69 74 65 6d 73 2c 20 73 65 76 65 72 61 6c  f items, several
1520: 20 74 68 6f 75 73 61 6e 64 27 2e 20 49 6e 76 65   thousand'. Inve
1530: 73 74 69 67 61 74 65 20 77 68 65 72 65 20 74 68  stigate where th
1540: 65 0a 09 23 23 20 20 20 20 20 20 20 6d 65 6d 6f  e..##       memo
1550: 72 79 20 69 73 20 73 70 65 6e 74 20 61 6e 64 20  ry is spent and 
1560: 74 68 65 6e 20 6c 6f 6f 6b 20 66 6f 72 20 77 61  then look for wa
1570: 79 73 20 6f 66 20 72 65 63 74 69 66 79 69 6e 67  ys of rectifying
1580: 0a 09 23 23 20 20 20 20 20 20 20 74 68 65 20 70  ..##       the p
1590: 72 6f 62 6c 65 6d 2e 0a 09 23 23 0a 0a 09 23 20  roblem...##...# 
15a0: 54 68 69 73 20 6d 65 74 68 6f 64 20 69 6e 73 70  This method insp
15b0: 65 63 74 73 20 74 68 65 20 63 68 61 6e 67 65 73  ects the changes
15c0: 65 74 73 20 66 6f 72 20 69 6e 74 65 72 6e 61 6c  ets for internal
15d0: 0a 09 23 20 64 65 70 65 6e 64 65 6e 63 69 65 73  ..# dependencies
15e0: 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20 64 6f 6e  . Nothing is don
15f0: 65 20 69 66 20 74 68 65 72 65 20 61 72 65 20 6e  e if there are n
1600: 6f 0a 09 23 20 73 75 63 68 2e 20 4f 74 68 65 72  o..# such. Other
1610: 77 69 73 65 20 74 68 65 20 63 68 61 6e 67 65 73  wise the changes
1620: 65 74 20 69 73 20 73 70 6c 69 74 20 69 6e 74 6f  et is split into
1630: 20 61 20 73 65 74 20 6f 66 0a 09 23 20 66 72 61   a set of..# fra
1640: 67 6d 65 6e 74 73 20 77 69 74 68 6f 75 74 20 69  gments without i
1650: 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e  nternal dependen
1660: 63 69 65 73 2c 20 74 72 61 6e 73 66 6f 72 6d 69  cies, transformi
1670: 6e 67 20 74 68 65 0a 09 23 20 69 6e 74 65 72 6e  ng the..# intern
1680: 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20  al dependencies 
1690: 69 6e 74 6f 20 65 78 74 65 72 6e 61 6c 20 6f 6e  into external on
16a0: 65 73 2e 20 54 68 65 20 6e 65 77 20 63 68 61 6e  es. The new chan
16b0: 67 65 73 65 74 73 0a 09 23 20 61 72 65 20 61 64  gesets..# are ad
16c0: 64 65 64 20 74 6f 20 74 68 65 20 6c 69 73 74 20  ded to the list 
16d0: 6f 66 20 61 6c 6c 20 63 68 61 6e 67 65 73 65 74  of all changeset
16e0: 73 2e 0a 0a 09 23 20 57 65 20 70 65 72 66 6f 72  s....# We perfor
16f0: 6d 20 61 6c 6c 20 6e 65 63 65 73 73 61 72 79 20  m all necessary 
1700: 73 70 6c 69 74 73 20 69 6e 20 6f 6e 65 20 67 6f  splits in one go
1710: 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 6c  , instead of onl
1720: 79 0a 09 23 20 6f 6e 65 2e 20 54 68 65 20 70 72  y..# one. The pr
1730: 65 76 69 6f 75 73 20 61 6c 67 6f 72 69 74 68 6d  evious algorithm
1740: 2c 20 61 64 61 70 74 65 64 20 66 72 6f 6d 20 63  , adapted from c
1750: 76 73 32 73 76 6e 2c 20 63 6f 6d 70 75 74 65 64  vs2svn, computed
1760: 0a 09 23 20 61 20 6c 6f 74 20 6f 66 20 73 74 61  ..# a lot of sta
1770: 74 65 20 77 68 69 63 68 20 77 61 73 20 74 68 72  te which was thr
1780: 6f 77 6e 20 61 77 61 79 20 61 6e 64 20 74 68 65  own away and the
1790: 6e 20 63 6f 6d 70 75 74 65 64 20 61 67 61 69 6e  n computed again
17a0: 0a 09 23 20 66 6f 72 20 65 61 63 68 20 6f 66 20  ..# for each of 
17b0: 74 68 65 20 66 72 61 67 6d 65 6e 74 73 2e 20 49  the fragments. I
17c0: 74 20 73 68 6f 75 6c 64 20 62 65 20 65 61 73 69  t should be easi
17d0: 65 72 20 74 6f 20 75 70 64 61 74 65 20 61 6e 64  er to update and
17e0: 0a 09 23 20 72 65 75 73 65 20 74 68 61 74 20 73  ..# reuse that s
17f0: 74 61 74 65 2e 0a 0a 09 23 20 54 68 65 20 63 6f  tate....# The co
1800: 64 65 20 63 68 65 63 6b 73 20 6f 6e 6c 79 20 73  de checks only s
1810: 75 63 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65  uccessor depende
1820: 6e 63 69 65 73 2c 20 61 73 20 74 68 69 73 0a 09  ncies, as this..
1830: 23 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  # automatically 
1840: 63 6f 76 65 72 73 20 74 68 65 20 70 72 65 64 65  covers the prede
1850: 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63  cessor dependenc
1860: 69 65 73 20 61 73 20 77 65 6c 6c 20 28 41 0a 09  ies as well (A..
1870: 23 20 73 75 63 63 65 73 73 6f 72 20 64 65 70 65  # successor depe
1880: 6e 64 65 6e 63 79 20 61 20 2d 3e 20 62 20 69 73  ndency a -> b is
1890: 20 61 6c 73 6f 20 61 20 70 72 65 64 65 63 65 73   also a predeces
18a0: 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 79 0a 09  sor dependency..
18b0: 23 20 62 20 2d 3e 20 61 29 2e 0a 0a 09 23 20 41  # b -> a)....# A
18c0: 72 72 61 79 20 6f 66 20 64 65 70 65 6e 64 65 6e  rray of dependen
18d0: 63 69 65 73 20 28 70 61 72 65 6e 74 20 2d 3e 20  cies (parent -> 
18e0: 63 68 69 6c 64 29 2e 20 54 68 69 73 20 69 73 20  child). This is 
18f0: 70 75 6c 6c 65 64 20 66 72 6f 6d 0a 09 23 20 74  pulled from..# t
1900: 68 65 20 73 74 61 74 65 2c 20 61 6e 64 20 6c 69  he state, and li
1910: 6d 69 74 65 64 20 74 6f 20 73 75 63 63 65 73 73  mited to success
1920: 6f 72 73 20 77 69 74 68 69 6e 20 74 68 65 20 63  ors within the c
1930: 68 61 6e 67 65 73 65 74 2e 0a 0a 09 61 72 72 61  hangeset....arra
1940: 79 20 73 65 74 20 64 65 70 65 6e 64 65 6e 63 69  y set dependenci
1950: 65 73 20 7b 7d 0a 09 24 6d 79 74 79 70 65 6f 62  es {}..$mytypeob
1960: 6a 20 69 6e 74 65 72 6e 61 6c 73 75 63 63 65 73  j internalsucces
1970: 73 6f 72 73 20 64 65 70 65 6e 64 65 6e 63 69 65  sors dependencie
1980: 73 20 24 6d 79 69 74 65 6d 73 0a 09 69 66 20 7b  s $myitems..if {
1990: 21 5b 61 72 72 61 79 20 73 69 7a 65 20 64 65 70  ![array size dep
19a0: 65 6e 64 65 6e 63 69 65 73 5d 7d 20 7b 0a 09 20  endencies]} {.. 
19b0: 20 20 20 72 65 74 75 72 6e 20 30 0a 09 7d 20 3b     return 0..} ;
19c0: 20 23 20 4e 6f 74 68 69 6e 67 20 74 6f 20 62 72   # Nothing to br
19d0: 65 61 6b 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65  eak....log write
19e0: 20 35 20 63 73 65 74 73 20 2e 2e 2e 5b 24 73 65   5 csets ...[$se
19f0: 6c 66 20 73 74 72 5d 2e 2e 2e 2e 2e 2e 2e 2e 2e  lf str].........
1a00: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1a10: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1a20: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 0a 09  ................
1a30: 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d 65 6d 3a 3a  vc::tools::mem::
1a40: 6d 61 72 6b 0a 0a 09 23 20 57 65 20 68 61 76 65  mark...# We have
1a50: 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64   internal depend
1a60: 65 6e 63 69 65 73 20 74 6f 20 62 72 65 61 6b 2e  encies to break.
1a70: 20 57 65 20 6e 6f 77 20 69 74 65 72 61 74 65 20   We now iterate 
1a80: 6f 76 65 72 0a 09 23 20 61 6c 6c 20 70 6f 73 69  over..# all posi
1a90: 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69 73  tions in the lis
1aa0: 74 20 28 77 68 69 63 68 20 69 73 20 63 68 72 6f  t (which is chro
1ab0: 6e 6f 6c 6f 67 69 63 61 6c 2c 20 61 74 20 6c 65  nological, at le
1ac0: 61 73 74 0a 09 23 20 61 73 20 66 61 72 20 61 73  ast..# as far as
1ad0: 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70 73 20   the timestamps 
1ae0: 61 72 65 20 63 6f 72 72 65 63 74 20 61 6e 64 20  are correct and 
1af0: 75 6e 69 71 75 65 29 20 61 6e 64 0a 09 23 20 64  unique) and..# d
1b00: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73  etermine the bes
1b10: 74 20 70 6f 73 69 74 69 6f 6e 20 66 6f 72 20 74  t position for t
1b20: 68 65 20 62 72 65 61 6b 2c 20 62 79 20 74 72 79  he break, by try
1b30: 69 6e 67 20 74 6f 0a 09 23 20 62 72 65 61 6b 20  ing to..# break 
1b40: 61 73 20 6d 61 6e 79 20 64 65 70 65 6e 64 65 6e  as many dependen
1b50: 63 69 65 73 20 61 73 20 70 6f 73 73 69 62 6c 65  cies as possible
1b60: 20 69 6e 20 6f 6e 65 20 67 6f 2e 20 57 68 65 6e   in one go. When
1b70: 20 61 0a 09 23 20 62 72 65 61 6b 20 77 61 73 20   a..# break was 
1b80: 66 6f 75 6e 64 20 74 68 69 73 20 69 73 20 72 65  found this is re
1b90: 64 6f 6e 65 20 66 6f 72 20 74 68 65 20 66 72 61  done for the fra
1ba0: 67 6d 65 6e 74 73 20 63 6f 6d 69 6e 67 20 61 6e  gments coming an
1bb0: 64 0a 09 23 20 61 66 74 65 72 2c 20 61 66 74 65  d..# after, afte
1bc0: 72 20 75 70 64 69 6e 67 20 74 68 65 20 63 72 6f  r upding the cro
1bd0: 73 73 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f  ssing informatio
1be0: 6e 2e 0a 0a 09 23 20 44 61 74 61 20 73 74 72 75  n....# Data stru
1bf0: 63 74 75 72 65 73 3a 0a 09 23 20 4d 61 70 3a 20  ctures:..# Map: 
1c00: 20 50 4f 53 20 20 20 72 65 76 69 73 69 6f 6e 20   POS   revision 
1c10: 69 64 20 20 20 20 20 20 2d 3e 20 70 6f 73 69 74  id      -> posit
1c20: 69 6f 6e 20 69 6e 20 6c 69 73 74 2e 0a 09 23 20  ion in list...# 
1c30: 20 20 20 20 20 20 43 52 4f 53 53 20 70 6f 73 69        CROSS posi
1c40: 74 69 6f 6e 20 69 6e 20 6c 69 73 74 20 2d 3e 20  tion in list -> 
1c50: 6e 75 6d 62 65 72 20 6f 66 20 64 65 70 65 6e 64  number of depend
1c60: 65 6e 63 69 65 73 20 63 72 6f 73 73 69 6e 67 20  encies crossing 
1c70: 69 74 0a 09 23 20 20 20 20 20 20 20 44 45 50 43  it..#       DEPC
1c80: 20 20 64 65 70 65 6e 64 65 6e 63 79 20 20 20 20    dependency    
1c90: 20 20 20 2d 3e 20 70 6f 73 69 74 69 6f 6e 73 20     -> positions 
1ca0: 69 74 20 63 72 6f 73 73 65 73 0a 09 23 20 4c 69  it crosses..# Li
1cb0: 73 74 3a 20 52 41 4e 47 45 20 4f 66 20 74 68 65  st: RANGE Of the
1cc0: 20 70 6f 73 69 74 69 6f 6e 73 20 69 74 73 65 6c   positions itsel
1cd0: 66 2e 0a 09 23 20 41 20 64 65 70 65 6e 64 65 6e  f...# A dependen
1ce0: 63 79 20 69 73 20 61 20 73 69 6e 67 6c 65 2d 65  cy is a single-e
1cf0: 6c 65 6d 65 6e 74 20 6d 61 70 20 70 61 72 65 6e  lement map paren
1d00: 74 20 2d 3e 20 63 68 69 6c 64 0a 0a 09 49 6e 69  t -> child...Ini
1d10: 74 69 61 6c 69 7a 65 42 72 65 61 6b 53 74 61 74  tializeBreakStat
1d20: 65 20 24 6d 79 69 74 65 6d 73 0a 0a 09 73 65 74  e $myitems...set
1d30: 20 66 72 61 67 6d 65 6e 74 73 20 7b 7d 0a 09 73   fragments {}..s
1d40: 65 74 20 6e 65 77 20 20 20 20 20 20 20 5b 6c 69  et new       [li
1d50: 73 74 20 24 72 61 6e 67 65 5d 0a 09 61 72 72 61  st $range]..arra
1d60: 79 20 73 65 74 20 62 72 65 61 6b 73 20 7b 7d 0a  y set breaks {}.
1d70: 0a 09 23 20 49 6e 73 74 65 61 64 20 6f 66 20 6f  ..# Instead of o
1d80: 6e 65 20 6c 69 73 74 20 68 6f 6c 64 69 6e 67 20  ne list holding 
1d90: 62 6f 74 68 20 70 72 6f 63 65 73 73 65 64 20 61  both processed a
1da0: 6e 64 20 70 65 6e 64 69 6e 67 0a 09 23 20 66 72  nd pending..# fr
1db0: 61 67 6d 65 6e 74 73 20 77 65 20 75 73 65 20 74  agments we use t
1dc0: 77 6f 2c 20 6f 6e 65 20 66 6f 72 20 74 68 65 20  wo, one for the 
1dd0: 66 72 61 6d 65 6e 74 73 20 74 6f 20 70 72 6f 63  framents to proc
1de0: 65 73 73 2c 20 6f 6e 65 0a 09 23 20 74 6f 20 68  ess, one..# to h
1df0: 6f 6c 64 20 74 68 65 20 6e 65 77 20 66 72 61 67  old the new frag
1e00: 6d 65 6e 74 73 2c 20 61 6e 64 20 74 68 65 20 6c  ments, and the l
1e10: 61 74 74 65 72 20 69 73 20 63 6f 70 69 65 64 20  atter is copied 
1e20: 74 6f 20 74 68 65 0a 09 23 20 66 6f 72 6d 65 72  to the..# former
1e30: 20 77 68 65 6e 20 74 68 65 79 20 72 75 6e 20 6f   when they run o
1e40: 75 74 2e 20 54 68 69 73 20 6b 65 65 70 73 20 74  ut. This keeps t
1e50: 68 65 20 6c 69 73 74 20 6f 66 20 70 65 6e 64 69  he list of pendi
1e60: 6e 67 0a 09 23 20 66 72 61 67 6d 65 6e 74 73 20  ng..# fragments 
1e70: 73 68 6f 72 74 20 77 69 74 68 6f 75 74 20 73 61  short without sa
1e80: 63 72 69 66 69 63 69 6e 67 20 73 70 65 65 64 20  crificing speed 
1e90: 62 79 20 73 68 69 66 74 69 6e 67 20 73 74 75 66  by shifting stuf
1ea0: 66 0a 09 23 20 64 6f 77 6e 2e 20 57 65 20 65 73  f..# down. We es
1eb0: 70 65 63 69 61 6c 6c 79 20 64 72 6f 70 20 74 68  pecially drop th
1ec0: 65 20 6d 65 6d 6f 72 79 20 6f 66 20 66 72 61 67  e memory of frag
1ed0: 6d 65 6e 74 73 20 62 72 6f 6b 65 6e 0a 09 23 20  ments broken..# 
1ee0: 64 75 72 69 6e 67 20 70 72 6f 63 65 73 73 69 6e  during processin
1ef0: 67 20 61 66 74 65 72 20 61 20 73 68 6f 72 74 20  g after a short 
1f00: 74 69 6d 65 2c 20 69 6e 73 74 65 61 64 20 6f 66  time, instead of
1f10: 20 6c 65 74 74 69 6e 67 20 69 74 0a 09 23 20 63   letting it..# c
1f20: 6f 6e 73 75 6d 65 20 6d 65 6d 6f 72 79 2e 0a 0a  onsume memory...
1f30: 09 77 68 69 6c 65 20 7b 5b 6c 6c 65 6e 67 74 68  .while {[llength
1f40: 20 24 6e 65 77 5d 7d 20 7b 0a 0a 09 20 20 20 20   $new]} {...    
1f50: 73 65 74 20 70 65 6e 64 69 6e 67 20 24 6e 65 77  set pending $new
1f60: 0a 09 20 20 20 20 73 65 74 20 6e 65 77 20 20 20  ..    set new   
1f70: 20 20 7b 7d 0a 09 20 20 20 20 73 65 74 20 61 74    {}..    set at
1f80: 20 20 20 20 20 20 30 0a 0a 09 20 20 20 20 77 68        0...    wh
1f90: 69 6c 65 20 7b 24 61 74 20 3c 20 5b 6c 6c 65 6e  ile {$at < [llen
1fa0: 67 74 68 20 24 70 65 6e 64 69 6e 67 5d 7d 20 7b  gth $pending]} {
1fb0: 0a 09 09 73 65 74 20 63 75 72 72 65 6e 74 20 5b  ...set current [
1fc0: 6c 69 6e 64 65 78 20 24 70 65 6e 64 69 6e 67 20  lindex $pending 
1fd0: 24 61 74 5d 0a 0a 09 09 6c 6f 67 20 77 72 69 74  $at]....log writ
1fe0: 65 20 36 20 63 73 65 74 73 20 7b 2e 20 2e 20 2e  e 6 csets {. . .
1ff0: 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e 2e 2e  . ... ..... ....
2000: 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  .... ...........
2010: 2e 2e 7d 0a 09 09 6c 6f 67 20 77 72 69 74 65 20  ..}...log write 
2020: 36 20 63 73 65 74 73 20 7b 53 63 68 65 64 75 6c  6 csets {Schedul
2030: 65 64 20 20 20 5b 6a 6f 69 6e 20 5b 50 52 73 20  ed   [join [PRs 
2040: 5b 6c 72 61 6e 67 65 20 24 70 65 6e 64 69 6e 67  [lrange $pending
2050: 20 24 61 74 20 65 6e 64 5d 5d 20 7b 20 7d 5d 7d   $at end]] { }]}
2060: 0a 09 09 6c 6f 67 20 77 72 69 74 65 20 36 20 63  ...log write 6 c
2070: 73 65 74 73 20 7b 43 6f 6e 73 69 64 65 72 69 6e  sets {Considerin
2080: 67 20 5b 50 52 20 24 63 75 72 72 65 6e 74 5d 20  g [PR $current] 
2090: 5c 5b 24 61 74 2f 5b 6c 6c 65 6e 67 74 68 20 24  \[$at/[llength $
20a0: 70 65 6e 64 69 6e 67 5d 5c 5d 7d 0a 0a 09 09 73  pending]\]}....s
20b0: 65 74 20 62 65 73 74 20 5b 46 69 6e 64 42 65 73  et best [FindBes
20c0: 74 42 72 65 61 6b 20 24 63 75 72 72 65 6e 74 5d  tBreak $current]
20d0: 0a 0a 09 09 69 66 20 7b 24 62 65 73 74 20 3c 20  ....if {$best < 
20e0: 30 7d 20 7b 0a 09 09 20 20 20 20 23 20 54 68 65  0} {...    # The
20f0: 20 69 6e 73 70 65 63 74 65 64 20 72 61 6e 67 65   inspected range
2100: 20 68 61 73 20 6e 6f 20 69 6e 74 65 72 6e 61 6c   has no internal
2110: 0a 09 09 20 20 20 20 23 20 64 65 70 65 6e 64 65  ...    # depende
2120: 6e 63 69 65 73 2e 20 54 68 69 73 20 69 73 20 61  ncies. This is a
2130: 20 63 6f 6d 70 6c 65 74 65 20 66 72 61 67 6d 65   complete fragme
2140: 6e 74 2e 0a 09 09 20 20 20 20 6c 61 70 70 65 6e  nt....    lappen
2150: 64 20 66 72 61 67 6d 65 6e 74 73 20 24 63 75 72  d fragments $cur
2160: 72 65 6e 74 0a 0a 09 09 20 20 20 20 6c 6f 67 20  rent....    log 
2170: 77 72 69 74 65 20 36 20 63 73 65 74 73 20 22 4e  write 6 csets "N
2180: 6f 20 62 72 65 61 6b 73 2c 20 66 69 6e 61 6c 22  o breaks, final"
2190: 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20  ...} else {...  
21a0: 20 20 23 20 53 70 6c 69 74 20 74 68 65 20 72 61    # Split the ra
21b0: 6e 67 65 20 61 6e 64 20 73 63 68 65 64 75 6c 65  nge and schedule
21c0: 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 09   the resulting..
21d0: 09 20 20 20 20 23 20 66 72 61 67 6d 65 6e 74 73  .    # fragments
21e0: 20 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e 73   for further ins
21f0: 70 65 63 74 69 6f 6e 2e 20 52 65 6d 65 6d 62 65  pection. Remembe
2200: 72 20 74 68 65 0a 09 09 20 20 20 20 23 20 6e 75  r the...    # nu
2210: 6d 62 65 72 20 6f 66 20 64 65 70 65 6e 64 65 6e  mber of dependen
2220: 63 69 65 73 20 63 75 74 20 62 65 66 6f 72 65 20  cies cut before 
2230: 77 65 20 72 65 6d 6f 76 65 20 74 68 65 6d 0a 09  we remove them..
2240: 09 20 20 20 20 23 20 66 72 6f 6d 20 63 6f 6e 73  .    # from cons
2250: 69 64 65 72 61 74 69 6f 6e 2c 20 66 6f 72 20 64  ideration, for d
2260: 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 6c 61 74  ocumentation lat
2270: 65 72 2e 0a 0a 09 09 20 20 20 20 73 65 74 20 62  er.....    set b
2280: 72 65 61 6b 73 28 24 62 65 73 74 29 20 24 63 72  reaks($best) $cr
2290: 6f 73 73 28 24 62 65 73 74 29 0a 0a 09 09 20 20  oss($best)....  
22a0: 20 20 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73    log write 6 cs
22b0: 65 74 73 20 22 42 65 73 74 20 62 72 65 61 6b 20  ets "Best break 
22c0: 40 20 24 62 65 73 74 2c 20 63 75 74 74 69 6e 67  @ $best, cutting
22d0: 20 5b 6e 73 70 20 24 63 72 6f 73 73 28 24 62 65   [nsp $cross($be
22e0: 73 74 29 20 64 65 70 65 6e 64 65 6e 63 79 20 64  st) dependency d
22f0: 65 70 65 6e 64 65 6e 63 69 65 73 5d 22 0a 0a 09  ependencies]"...
2300: 09 20 20 20 20 23 20 4e 6f 74 65 3a 20 54 68 65  .    # Note: The
2310: 20 76 61 6c 75 65 20 6f 66 20 62 65 73 74 20 69   value of best i
2320: 73 20 61 6e 20 61 62 6f 6c 75 74 65 20 6c 6f 63  s an abolute loc
2330: 61 74 69 6f 6e 0a 09 09 20 20 20 20 23 20 69 6e  ation...    # in
2340: 20 6d 79 69 74 65 6d 73 2e 20 55 73 65 20 74 68   myitems. Use th
2350: 65 20 73 74 61 72 74 20 6f 66 20 63 75 72 72 65  e start of curre
2360: 6e 74 20 74 6f 20 6d 61 6b 65 20 69 74 0a 09 09  nt to make it...
2370: 20 20 20 20 23 20 61 6e 20 69 6e 64 65 78 20 61      # an index a
2380: 62 73 6f 6c 75 74 65 20 74 6f 20 63 75 72 72 65  bsolute to curre
2390: 6e 74 2e 0a 0a 09 09 20 20 20 20 73 65 74 20 62  nt.....    set b
23a0: 72 65 6c 20 5b 65 78 70 72 20 7b 24 62 65 73 74  rel [expr {$best
23b0: 20 2d 20 5b 6c 69 6e 64 65 78 20 24 63 75 72 72   - [lindex $curr
23c0: 65 6e 74 20 30 5d 7d 5d 0a 09 09 20 20 20 20 73  ent 0]}]...    s
23d0: 65 74 20 62 6e 65 78 74 20 24 62 72 65 6c 20 3b  et bnext $brel ;
23e0: 20 69 6e 63 72 20 62 6e 65 78 74 0a 09 09 20 20   incr bnext...  
23f0: 20 20 73 65 74 20 66 72 61 67 62 65 66 6f 72 65    set fragbefore
2400: 20 5b 6c 72 61 6e 67 65 20 24 63 75 72 72 65 6e   [lrange $curren
2410: 74 20 30 20 24 62 72 65 6c 5d 0a 09 09 20 20 20  t 0 $brel]...   
2420: 20 73 65 74 20 66 72 61 67 61 66 74 65 72 20 20   set fragafter  
2430: 5b 6c 72 61 6e 67 65 20 24 63 75 72 72 65 6e 74  [lrange $current
2440: 20 24 62 6e 65 78 74 20 65 6e 64 5d 0a 0a 09 09   $bnext end]....
2450: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 36 20      log write 6 
2460: 63 73 65 74 73 20 22 4e 65 77 20 70 69 65 63 65  csets "New piece
2470: 73 20 20 5b 50 52 20 24 66 72 61 67 62 65 66 6f  s  [PR $fragbefo
2480: 72 65 5d 20 5b 50 52 20 24 66 72 61 67 61 66 74  re] [PR $fragaft
2490: 65 72 5d 22 0a 0a 09 09 20 20 20 20 69 6e 74 65  er]"....    inte
24a0: 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 5b 6c  grity assert {[l
24b0: 6c 65 6e 67 74 68 20 24 66 72 61 67 62 65 66 6f  length $fragbefo
24c0: 72 65 5d 7d 20 7b 46 6f 75 6e 64 20 7a 65 72 6f  re]} {Found zero
24d0: 2d 6c 65 6e 67 74 68 20 66 72 61 67 6d 65 6e 74  -length fragment
24e0: 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e   at the beginnin
24f0: 67 7d 0a 09 09 20 20 20 20 69 6e 74 65 67 72 69  g}...    integri
2500: 74 79 20 61 73 73 65 72 74 20 7b 5b 6c 6c 65 6e  ty assert {[llen
2510: 67 74 68 20 24 66 72 61 67 61 66 74 65 72 5d 7d  gth $fragafter]}
2520: 20 20 7b 46 6f 75 6e 64 20 7a 65 72 6f 2d 6c 65    {Found zero-le
2530: 6e 67 74 68 20 66 72 61 67 6d 65 6e 74 20 61 74  ngth fragment at
2540: 20 74 68 65 20 65 6e 64 7d 0a 0a 09 09 20 20 20   the end}....   
2550: 20 6c 61 70 70 65 6e 64 20 6e 65 77 20 24 66 72   lappend new $fr
2560: 61 67 62 65 66 6f 72 65 20 24 66 72 61 67 61 66  agbefore $fragaf
2570: 74 65 72 0a 09 09 20 20 20 20 43 75 74 41 74 20  ter...    CutAt 
2580: 24 62 65 73 74 0a 09 09 7d 0a 0a 09 09 69 6e 63  $best...}....inc
2590: 72 20 61 74 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a  r at..    }..}..
25a0: 09 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65  .log write 6 cse
25b0: 74 73 20 22 2e 20 2e 20 2e 2e 20 2e 2e 2e 20 2e  ts ". . .. ... .
25c0: 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e  .... ........ ..
25d0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 22 0a 0a 09 23  ..........."...#
25e0: 20 28 2a 29 20 57 65 20 63 6c 65 61 72 20 6f 75   (*) We clear ou
25f0: 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  t the associated
2600: 20 70 61 72 74 20 6f 66 20 74 68 65 20 6d 79 69   part of the myi
2610: 74 65 6d 6d 61 70 0a 09 23 20 69 6e 2d 6d 65 6d  temmap..# in-mem
2620: 6f 72 79 20 69 6e 64 65 78 20 69 6e 20 70 72 65  ory index in pre
2630: 70 61 72 61 74 69 6f 6e 20 66 6f 72 20 6e 65 77  paration for new
2640: 20 64 61 74 61 2e 20 41 20 73 69 6d 70 6c 65 20   data. A simple 
2650: 75 6e 73 65 74 0a 09 23 20 69 73 20 65 6e 6f 75  unset..# is enou
2660: 67 68 2c 20 77 65 20 68 61 76 65 20 6e 6f 20 73  gh, we have no s
2670: 79 6d 62 6f 6c 20 63 68 61 6e 67 65 73 65 74 73  ymbol changesets
2680: 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 61   at this time, a
2690: 6e 64 0a 09 23 20 74 68 75 73 20 6e 65 76 65 72  nd..# thus never
26a0: 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e 65 20 72   more than one r
26b0: 65 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20  eference in the 
26c0: 6c 69 73 74 2e 0a 0a 09 66 6f 72 65 61 63 68 20  list....foreach 
26d0: 69 69 64 20 24 6d 79 69 74 65 6d 73 20 7b 0a 09  iid $myitems {..
26e0: 20 20 20 20 73 65 74 20 6b 65 79 20 5b 6c 69 73      set key [lis
26f0: 74 20 24 6d 79 74 79 70 65 20 24 69 69 64 5d 0a  t $mytype $iid].
2700: 09 20 20 20 20 23 75 6e 73 65 74 20 6d 79 69 74  .    #unset myit
2710: 65 6d 6d 61 70 28 24 6b 65 79 29 0a 09 20 20 20  emmap($key)..   
2720: 20 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73 65   log write 8 cse
2730: 74 73 20 7b 4d 41 50 2d 20 69 74 65 6d 20 3c 24  ts {MAP- item <$
2740: 6b 65 79 3e 20 24 73 65 6c 66 20 3d 20 5b 24 73  key> $self = [$s
2750: 65 6c 66 20 73 74 72 5d 7d 0a 09 7d 0a 0a 09 23  elf str]}..}...#
2760: 20 43 72 65 61 74 65 20 63 68 61 6e 67 65 73 65   Create changese
2770: 74 73 20 66 6f 72 20 74 68 65 20 66 72 61 67 6d  ts for the fragm
2780: 65 6e 74 73 2c 20 72 65 75 73 69 6e 67 20 74 68  ents, reusing th
2790: 65 20 63 75 72 72 65 6e 74 20 6f 6e 65 0a 09 23  e current one..#
27a0: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 66   for the first f
27b0: 72 61 67 6d 65 6e 74 2e 20 57 65 20 73 6f 72 74  ragment. We sort
27c0: 20 74 68 65 6d 20 69 6e 20 6f 72 64 65 72 20 74   them in order t
27d0: 6f 20 61 6c 6c 6f 77 0a 09 23 20 63 68 65 63 6b  o allow..# check
27e0: 69 6e 67 20 66 6f 72 20 67 61 70 73 20 61 6e 64  ing for gaps and
27f0: 20 6e 69 63 65 20 6d 65 73 73 61 67 65 73 2e 0a   nice messages..
2800: 0a 09 73 65 74 20 66 72 61 67 6d 65 6e 74 73 20  ..set fragments 
2810: 5b 6c 73 6f 72 74 20 2d 69 6e 64 65 78 20 30 20  [lsort -index 0 
2820: 2d 69 6e 74 65 67 65 72 20 24 66 72 61 67 6d 65  -integer $fragme
2830: 6e 74 73 5d 0a 0a 09 23 70 75 74 73 20 5c 74 2e  nts]...#puts \t.
2840: 5b 6a 6f 69 6e 20 5b 50 52 73 20 24 66 72 61 67  [join [PRs $frag
2850: 6d 65 6e 74 73 5d 20 2e 5c 6e 5c 74 2e 5d 2e 0a  ments] .\n\t.]..
2860: 0a 09 42 6f 72 64 65 72 20 5b 6c 69 6e 64 65 78  ..Border [lindex
2870: 20 24 66 72 61 67 6d 65 6e 74 73 20 30 5d 20 66   $fragments 0] f
2880: 69 72 73 74 73 20 66 69 72 73 74 65 0a 0a 09 69  irsts firste...i
2890: 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20  ntegrity assert 
28a0: 7b 24 66 69 72 73 74 73 20 3d 3d 20 30 7d 20 7b  {$firsts == 0} {
28b0: 42 61 64 20 66 72 61 67 6d 65 6e 74 20 73 74 61  Bad fragment sta
28c0: 72 74 20 40 20 24 66 69 72 73 74 73 2c 20 67 61  rt @ $firsts, ga
28d0: 70 2c 20 6f 72 20 62 65 66 6f 72 65 20 62 65 67  p, or before beg
28e0: 69 6e 6e 69 6e 67 20 6f 66 20 74 68 65 20 72 61  inning of the ra
28f0: 6e 67 65 7d 0a 0a 09 73 65 74 20 6c 61 73 74 65  nge}...set laste
2900: 20 24 66 69 72 73 74 65 0a 09 66 6f 72 65 61 63   $firste..foreac
2910: 68 20 66 72 61 67 6d 65 6e 74 20 5b 6c 72 61 6e  h fragment [lran
2920: 67 65 20 24 66 72 61 67 6d 65 6e 74 73 20 31 20  ge $fragments 1 
2930: 65 6e 64 5d 20 7b 0a 09 20 20 20 20 42 6f 72 64  end] {..    Bord
2940: 65 72 20 24 66 72 61 67 6d 65 6e 74 20 73 20 65  er $fragment s e
2950: 0a 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 20  ..    integrity 
2960: 61 73 73 65 72 74 20 7b 24 6c 61 73 74 65 20 3d  assert {$laste =
2970: 3d 20 28 24 73 20 2d 20 31 29 7d 20 7b 42 61 64  = ($s - 1)} {Bad
2980: 20 66 72 61 67 6d 65 6e 74 20 62 6f 72 64 65 72   fragment border
2990: 20 3c 24 6c 61 73 74 65 20 7c 20 24 73 3e 2c 20   <$laste | $s>, 
29a0: 67 61 70 20 6f 72 20 6f 76 65 72 6c 61 70 7d 0a  gap or overlap}.
29b0: 0a 09 20 20 20 20 73 65 74 20 6e 65 77 20 5b 24  ..    set new [$
29c0: 74 79 70 65 20 25 41 55 54 4f 25 20 24 6d 79 70  type %AUTO% $myp
29d0: 72 6f 6a 65 63 74 20 24 6d 79 74 79 70 65 20 24  roject $mytype $
29e0: 6d 79 73 72 63 69 64 20 5b 6c 72 61 6e 67 65 20  mysrcid [lrange 
29f0: 24 6d 79 69 74 65 6d 73 20 24 73 20 24 65 5d 5d  $myitems $s $e]]
2a00: 0a 09 20 20 20 20 69 6e 63 72 20 63 6f 75 6e 74  ..    incr count
2a10: 65 72 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  er..            
2a20: 6c 6f 67 20 77 72 69 74 65 20 34 20 63 73 65 74  log write 4 cset
2a30: 73 20 22 42 72 65 61 6b 69 6e 67 20 5b 24 73 65  s "Breaking [$se
2a40: 6c 66 20 73 74 72 20 5d 20 40 20 24 6c 61 73 74  lf str ] @ $last
2a50: 65 2c 20 6e 65 77 20 5b 24 6e 65 77 20 73 74 72  e, new [$new str
2a60: 5d 2c 20 63 75 74 74 69 6e 67 20 24 62 72 65 61  ], cutting $brea
2a70: 6b 73 28 24 6c 61 73 74 65 29 22 0a 0a 09 20 20  ks($laste)"...  
2a80: 20 20 73 65 74 20 6c 61 73 74 65 20 24 65 0a 09    set laste $e..
2a90: 7d 0a 0a 09 69 6e 74 65 67 72 69 74 79 20 61 73  }...integrity as
2aa0: 73 65 72 74 20 7b 0a 09 20 20 20 20 24 6c 61 73  sert {..    $las
2ab0: 74 65 20 3d 3d 20 28 5b 6c 6c 65 6e 67 74 68 20  te == ([llength 
2ac0: 24 6d 79 69 74 65 6d 73 5d 2d 31 29 0a 09 7d 20  $myitems]-1)..} 
2ad0: 7b 42 61 64 20 66 72 61 67 6d 65 6e 74 20 65 6e  {Bad fragment en
2ae0: 64 20 40 20 24 6c 61 73 74 65 2c 20 67 61 70 2c  d @ $laste, gap,
2af0: 20 6f 72 20 62 65 79 6f 6e 64 20 65 6e 64 20 6f   or beyond end o
2b00: 66 20 74 68 65 20 72 61 6e 67 65 7d 0a 0a 09 23  f the range}...#
2b10: 20 50 75 74 20 74 68 65 20 66 69 72 73 74 20 66   Put the first f
2b20: 72 61 67 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65  ragment into the
2b30: 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67 65 73   current changes
2b40: 65 74 2c 20 61 6e 64 0a 09 23 20 75 70 64 61 74  et, and..# updat
2b50: 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20  e the in-memory 
2b60: 69 6e 64 65 78 2e 20 57 65 20 63 61 6e 20 73 69  index. We can si
2b70: 6d 70 6c 79 20 28 72 65 29 61 64 64 20 74 68 65  mply (re)add the
2b80: 20 69 74 65 6d 73 0a 09 23 20 62 65 63 61 75 73   items..# becaus
2b90: 65 20 77 65 20 63 6c 65 61 72 65 64 20 74 68 65  e we cleared the
2ba0: 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78 69 73   previously exis
2bb0: 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  ting information
2bc0: 2c 20 73 65 65 0a 09 23 20 28 2a 29 20 61 62 6f  , see..# (*) abo
2bd0: 76 65 2e 20 50 65 72 73 69 73 74 65 6e 63 65 20  ve. Persistence 
2be0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65 72 20  does not matter 
2bf0: 68 65 72 65 2c 20 6e 6f 6e 65 20 6f 66 20 74 68  here, none of th
2c00: 65 0a 09 23 20 63 68 61 6e 67 65 73 65 74 73 20  e..# changesets 
2c10: 68 61 73 20 62 65 65 6e 20 73 61 76 65 64 20 74  has been saved t
2c20: 6f 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74  o the persistent
2c30: 20 73 74 61 74 65 20 79 65 74 2e 0a 0a 09 73 65   state yet....se
2c40: 74 20 6d 79 69 74 65 6d 73 20 20 5b 6c 72 61 6e  t myitems  [lran
2c50: 67 65 20 24 6d 79 69 74 65 6d 73 20 20 30 20 24  ge $myitems  0 $
2c60: 66 69 72 73 74 65 5d 0a 09 73 65 74 20 6d 79 74  firste]..set myt
2c70: 69 74 65 6d 73 20 5b 6c 72 61 6e 67 65 20 24 6d  items [lrange $m
2c80: 79 74 69 74 65 6d 73 20 30 20 24 66 69 72 73 74  ytitems 0 $first
2c90: 65 5d 0a 09 66 6f 72 65 61 63 68 20 69 69 64 20  e]..foreach iid 
2ca0: 24 6d 79 69 74 65 6d 73 20 7b 0a 09 20 20 20 20  $myitems {..    
2cb0: 73 65 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 6d  set key [list $m
2cc0: 79 74 79 70 65 20 24 69 69 64 5d 0a 09 20 20 20  ytype $iid]..   
2cd0: 20 23 73 65 74 20 6d 79 69 74 65 6d 6d 61 70 28   #set myitemmap(
2ce0: 24 6b 65 79 29 20 24 73 65 6c 66 0a 09 20 20 20  $key) $self..   
2cf0: 20 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73 65   log write 8 cse
2d00: 74 73 20 7b 4d 41 50 2b 20 69 74 65 6d 20 3c 24  ts {MAP+ item <$
2d10: 6b 65 79 3e 20 24 73 65 6c 66 20 3d 20 5b 24 73  key> $self = [$s
2d20: 65 6c 66 20 73 74 72 5d 7d 0a 09 7d 0a 0a 09 72  elf str]}..}...r
2d30: 65 74 75 72 6e 20 31 0a 20 20 20 20 7d 0a 0a 20  eturn 1.    }.. 
2d40: 20 20 20 6d 65 74 68 6f 64 20 70 65 72 73 69 73     method persis
2d50: 74 20 7b 7d 20 7b 0a 09 73 65 74 20 74 69 64 20  t {} {..set tid 
2d60: 24 6d 79 63 73 74 79 70 65 28 24 6d 79 74 79 70  $mycstype($mytyp
2d70: 65 29 0a 09 73 65 74 20 70 69 64 20 5b 24 6d 79  e)..set pid [$my
2d80: 70 72 6f 6a 65 63 74 20 69 64 5d 0a 09 73 65 74  project id]..set
2d90: 20 70 6f 73 20 30 0a 0a 09 73 74 61 74 65 20 74   pos 0...state t
2da0: 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 09 20 20  ransaction {..  
2db0: 20 20 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09    state run {...
2dc0: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 61 6e  INSERT INTO chan
2dd0: 67 65 73 65 74 20 28 63 69 64 2c 20 20 20 70 69  geset (cid,   pi
2de0: 64 2c 20 20 74 79 70 65 2c 20 73 72 63 29 0a 09  d,  type, src)..
2df0: 09 56 41 4c 55 45 53 20 20 20 20 20 20 20 20 20  .VALUES         
2e00: 20 20 20 20 20 20 20 28 24 6d 79 69 64 2c 20 24         ($myid, $
2e10: 70 69 64 2c 20 24 74 69 64 2c 20 24 6d 79 73 72  pid, $tid, $mysr
2e20: 63 69 64 29 3b 0a 09 20 20 20 20 7d 0a 0a 09 20  cid);..    }... 
2e30: 20 20 20 66 6f 72 65 61 63 68 20 69 69 64 20 24     foreach iid $
2e40: 6d 79 69 74 65 6d 73 20 7b 0a 09 09 73 74 61 74  myitems {...stat
2e50: 65 20 72 75 6e 20 7b 0a 09 09 20 20 20 20 49 4e  e run {...    IN
2e60: 53 45 52 54 20 49 4e 54 4f 20 63 73 69 74 65 6d  SERT INTO csitem
2e70: 20 28 63 69 64 2c 20 20 20 70 6f 73 2c 20 20 69   (cid,   pos,  i
2e80: 69 64 29 0a 09 09 20 20 20 20 56 41 4c 55 45 53  id)...    VALUES
2e90: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 24 6d               ($m
2ea0: 79 69 64 2c 20 24 70 6f 73 2c 20 24 69 69 64 29  yid, $pos, $iid)
2eb0: 3b 0a 09 09 7d 0a 09 09 69 6e 63 72 20 70 6f 73  ;...}...incr pos
2ec0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72 65 74 75  ..    }..}..retu
2ed0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65  rn.    }..    me
2ee0: 74 68 6f 64 20 74 69 6d 65 72 61 6e 67 65 20 7b  thod timerange {
2ef0: 7d 20 7b 20 72 65 74 75 72 6e 20 5b 24 6d 79 74  } { return [$myt
2f00: 79 70 65 6f 62 6a 20 74 69 6d 65 72 61 6e 67 65  ypeobj timerange
2f10: 20 24 6d 79 69 74 65 6d 73 5d 20 7d 0a 0a 20 20   $myitems] }..  
2f20: 20 20 6d 65 74 68 6f 64 20 6c 69 6d 69 74 73 20    method limits 
2f30: 7b 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c 69  {} {..struct::li
2f40: 73 74 20 61 73 73 69 67 6e 20 5b 24 6d 79 74 79  st assign [$myty
2f50: 70 65 6f 62 6a 20 6c 69 6d 69 74 73 20 24 6d 79  peobj limits $my
2f60: 69 74 65 6d 73 5d 20 6d 61 78 70 20 6d 69 6e 73  items] maxp mins
2f70: 0a 09 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 5b  ..return [list [
2f80: 54 61 67 49 74 65 6d 44 69 63 74 20 24 6d 61 78  TagItemDict $max
2f90: 70 20 24 6d 79 74 79 70 65 5d 20 5b 54 61 67 49  p $mytype] [TagI
2fa0: 74 65 6d 44 69 63 74 20 24 6d 69 6e 73 20 24 6d  temDict $mins $m
2fb0: 79 74 79 70 65 5d 5d 0a 20 20 20 20 7d 0a 0a 20  ytype]].    }.. 
2fc0: 20 20 20 6d 65 74 68 6f 64 20 64 72 6f 70 20 7b     method drop {
2fd0: 7d 20 7b 0a 09 6c 6f 67 20 77 72 69 74 65 20 38  } {..log write 8
2fe0: 20 63 73 65 74 73 20 7b 44 72 6f 70 70 69 6e 67   csets {Dropping
2ff0: 20 24 73 65 6c 66 20 3d 20 5b 24 73 65 6c 66 20   $self = [$self 
3000: 73 74 72 5d 7d 0a 0a 09 73 74 61 74 65 20 74 72  str]}...state tr
3010: 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 09 20 20 20  ansaction {..   
3020: 20 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 44   state run {...D
3030: 45 4c 45 54 45 20 46 52 4f 4d 20 63 68 61 6e 67  ELETE FROM chang
3040: 65 73 65 74 20 20 20 57 48 45 52 45 20 63 69 64  eset   WHERE cid
3050: 20 3d 20 24 6d 79 69 64 3b 0a 09 09 44 45 4c 45   = $myid;...DELE
3060: 54 45 20 46 52 4f 4d 20 63 73 69 74 65 6d 20 20  TE FROM csitem  
3070: 20 20 20 20 57 48 45 52 45 20 63 69 64 20 3d 20      WHERE cid = 
3080: 24 6d 79 69 64 3b 0a 09 09 44 45 4c 45 54 45 20  $myid;...DELETE 
3090: 46 52 4f 4d 20 63 73 73 75 63 63 65 73 73 6f 72  FROM cssuccessor
30a0: 20 57 48 45 52 45 20 63 69 64 20 3d 20 24 6d 79   WHERE cid = $my
30b0: 69 64 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 66  id;..    }..}..f
30c0: 6f 72 65 61 63 68 20 69 69 64 20 24 6d 79 69 74  oreach iid $myit
30d0: 65 6d 73 20 7b 0a 09 20 20 20 20 73 65 74 20 6b  ems {..    set k
30e0: 65 79 20 5b 6c 69 73 74 20 24 6d 79 74 79 70 65  ey [list $mytype
30f0: 20 24 69 69 64 5d 0a 09 20 20 20 20 75 6e 73 65   $iid]..    unse
3100: 74 20 6d 79 69 74 65 6d 6d 61 70 28 24 6b 65 79  t myitemmap($key
3110: 29 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65  )..    log write
3120: 20 38 20 63 73 65 74 73 20 7b 4d 41 50 2d 20 69   8 csets {MAP- i
3130: 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73 65 6c 66  tem <$key> $self
3140: 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d 7d 0a   = [$self str]}.
3150: 09 7d 0a 09 73 65 74 20 70 6f 73 20 20 20 20 20  .}..set pos     
3160: 20 20 20 20 20 5b 6c 73 65 61 72 63 68 20 2d 65       [lsearch -e
3170: 78 61 63 74 20 24 6d 79 63 68 61 6e 67 65 73 65  xact $mychangese
3180: 74 73 20 24 73 65 6c 66 5d 0a 09 73 65 74 20 6d  ts $self]..set m
3190: 79 63 68 61 6e 67 65 73 65 74 73 20 5b 6c 72 65  ychangesets [lre
31a0: 70 6c 61 63 65 20 24 6d 79 63 68 61 6e 67 65 73  place $mychanges
31b0: 65 74 73 20 24 70 6f 73 20 24 70 6f 73 5d 0a 09  ets $pos $pos]..
31c0: 73 65 74 20 70 6f 73 20 20 20 20 20 20 20 20 20  set pos         
31d0: 20 20 20 20 20 20 20 20 20 20 20 5b 6c 73 65 61             [lsea
31e0: 72 63 68 20 2d 65 78 61 63 74 20 24 6d 79 74 63  rch -exact $mytc
31f0: 68 61 6e 67 65 73 65 74 73 28 24 6d 79 74 79 70  hangesets($mytyp
3200: 65 29 20 24 73 65 6c 66 5d 0a 09 73 65 74 20 6d  e) $self]..set m
3210: 79 74 63 68 61 6e 67 65 73 65 74 73 28 24 6d 79  ytchangesets($my
3220: 74 79 70 65 29 20 5b 6c 72 65 70 6c 61 63 65 20  type) [lreplace 
3230: 24 6d 79 74 63 68 61 6e 67 65 73 65 74 73 28 24  $mytchangesets($
3240: 6d 79 74 79 70 65 29 20 24 70 6f 73 20 24 70 6f  mytype) $pos $po
3250: 73 5d 0a 0a 09 23 20 52 65 74 75 72 6e 20 74 68  s]...# Return th
3260: 65 20 6c 69 73 74 20 6f 66 20 70 72 65 64 65 63  e list of predec
3270: 65 73 73 6f 72 73 20 73 6f 20 74 68 61 74 20 74  essors so that t
3280: 68 65 79 20 63 61 6e 20 62 65 20 61 64 6a 75 73  hey can be adjus
3290: 74 65 64 2e 0a 09 72 65 74 75 72 6e 20 5b 73 74  ted...return [st
32a0: 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20 5b  ruct::list map [
32b0: 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20  state run {..   
32c0: 20 53 45 4c 45 43 54 20 63 69 64 0a 09 20 20 20   SELECT cid..   
32d0: 20 46 52 4f 4d 20 20 20 63 73 73 75 63 63 65 73   FROM   cssucces
32e0: 73 6f 72 0a 09 20 20 20 20 57 48 45 52 45 20 20  sor..    WHERE  
32f0: 6e 69 64 20 3d 20 24 6d 79 69 64 0a 09 7d 5d 20  nid = $myid..}] 
3300: 5b 6d 79 74 79 70 65 6d 65 74 68 6f 64 20 6f 66  [mytypemethod of
3310: 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65  ]].    }..    me
3320: 74 68 6f 64 20 72 65 70 6f 72 74 6c 6f 6f 70 20  thod reportloop 
3330: 7b 7b 6b 69 6c 6c 20 31 7d 7d 20 7b 0a 09 23 20  {{kill 1}} {..# 
3340: 57 65 20 70 72 69 6e 74 20 74 68 65 20 69 74 65  We print the ite
3350: 6d 73 20 77 68 69 63 68 20 61 72 65 20 70 72 6f  ms which are pro
3360: 64 75 63 69 6e 67 20 74 68 65 20 6c 6f 6f 70 2c  ducing the loop,
3370: 20 61 6e 64 20 68 6f 77 2e 0a 0a 09 73 65 74 20   and how....set 
3380: 68 64 72 20 22 53 65 6c 66 2d 72 65 66 65 72 65  hdr "Self-refere
3390: 6e 74 69 61 6c 20 63 68 61 6e 67 65 73 65 74 20  ntial changeset 
33a0: 5b 24 73 65 6c 66 20 73 74 72 5d 20 5f 5f 5f 5f  [$self str] ____
33b0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 22 0a  ______________".
33c0: 09 73 65 74 20 66 74 72 20 5b 72 65 67 73 75 62  .set ftr [regsub
33d0: 20 2d 61 6c 6c 20 7b 5b 5e 20 09 5d 7d 20 24 68   -all {[^ .]} $h
33e0: 64 72 20 7b 5f 7d 5d 0a 0a 09 6c 6f 67 20 77 72  dr {_}]...log wr
33f0: 69 74 65 20 30 20 63 73 65 74 73 20 24 68 64 72  ite 0 csets $hdr
3400: 0a 09 66 6f 72 65 61 63 68 20 7b 69 74 65 6d 20  ..foreach {item 
3410: 6e 65 78 74 69 74 65 6d 7d 20 5b 24 6d 79 74 79  nextitem} [$myty
3420: 70 65 6f 62 6a 20 6c 6f 6f 70 73 20 24 6d 79 69  peobj loops $myi
3430: 74 65 6d 73 5d 20 7b 0a 09 20 20 20 20 23 20 43  tems] {..    # C
3440: 72 65 61 74 65 20 74 61 67 67 65 64 20 69 74 65  reate tagged ite
3450: 6d 73 20 66 72 6f 6d 20 74 68 65 20 69 64 20 61  ms from the id a
3460: 6e 64 20 6f 75 72 20 74 79 70 65 2e 0a 09 20 20  nd our type...  
3470: 20 20 73 65 74 20 69 74 65 6d 20 20 20 20 20 5b    set item     [
3480: 6c 69 73 74 20 24 6d 79 74 79 70 65 20 20 24 69  list $mytype  $i
3490: 74 65 6d 5d 0a 09 20 20 20 20 73 65 74 20 6e 65  tem]..    set ne
34a0: 78 74 69 74 65 6d 20 5b 6c 69 73 74 20 24 6d 79  xtitem [list $my
34b0: 74 79 70 65 20 24 6e 65 78 74 69 74 65 6d 5d 0a  type $nextitem].
34c0: 09 20 20 20 20 23 20 50 72 69 6e 74 61 62 6c 65  .    # Printable
34d0: 20 6c 61 62 65 6c 73 2e 0a 09 20 20 20 20 73 65   labels...    se
34e0: 74 20 69 20 20 22 3c 5b 24 74 79 70 65 20 69 74  t i  "<[$type it
34f0: 65 6d 73 74 72 20 24 69 74 65 6d 5d 3e 22 0a 09  emstr $item]>"..
3500: 20 20 20 20 73 65 74 20 6e 20 20 22 3c 5b 24 74      set n  "<[$t
3510: 79 70 65 20 69 74 65 6d 73 74 72 20 24 6e 65 78  ype itemstr $nex
3520: 74 69 74 65 6d 5d 3e 22 0a 09 20 20 20 20 73 65  titem]>"..    se
3530: 74 20 6e 63 73 20 24 6d 79 69 74 65 6d 6d 61 70  t ncs $myitemmap
3540: 28 24 6e 65 78 74 69 74 65 6d 29 0a 09 20 20 20  ($nextitem)..   
3550: 20 23 20 50 72 69 6e 74 0a 09 20 20 20 20 6c 6f   # Print..    lo
3560: 67 20 77 72 69 74 65 20 30 20 63 73 65 74 73 20  g write 0 csets 
3570: 7b 2a 20 24 69 20 2d 2d 3e 20 24 6e 20 2d 2d 3e  {* $i --> $n -->
3580: 20 63 73 20 5b 24 6e 63 73 20 73 74 72 5d 7d 0a   cs [$ncs str]}.
3590: 09 7d 0a 09 6c 6f 67 20 77 72 69 74 65 20 30 20  .}..log write 0 
35a0: 63 73 65 74 73 20 24 66 74 72 0a 0a 09 69 66 20  csets $ftr...if 
35b0: 7b 21 24 6b 69 6c 6c 7d 20 72 65 74 75 72 6e 0a  {!$kill} return.
35c0: 09 74 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61  .trouble interna
35d0: 6c 20 22 5b 24 73 65 6c 66 20 73 74 72 5d 20 64  l "[$self str] d
35e0: 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66  epends on itself
35f0: 22 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  "..return.    }.
3600: 0a 20 20 20 20 6d 65 74 68 6f 64 20 70 75 73 68  .    method push
3610: 74 6f 20 7b 72 65 70 6f 73 69 74 6f 72 79 20 64  to {repository d
3620: 61 74 65 20 72 73 74 61 74 65 7d 20 7b 0a 09 23  ate rstate} {..#
3630: 20 47 65 6e 65 72 61 74 65 20 61 6e 64 20 69 6d   Generate and im
3640: 70 6f 72 74 20 74 68 65 20 6d 61 6e 69 66 65 73  port the manifes
3650: 74 20 66 6f 72 20 74 68 69 73 20 63 68 61 6e 67  t for this chang
3660: 65 73 65 74 2e 0a 09 23 0a 09 23 20 44 61 74 61  eset...#..# Data
3670: 20 6e 65 65 64 65 64 3a 0a 09 23 20 2d 20 43 6f   needed:..# - Co
3680: 6d 6d 69 74 20 6d 65 73 73 61 67 65 20 20 20 20  mmit message    
3690: 20 20 20 20 20 20 20 20 20 20 20 28 2d 2d 20 6d             (-- m
36a0: 79 73 72 63 69 64 20 2d 3e 20 72 65 70 6f 73 69  ysrcid -> reposi
36b0: 74 6f 72 79 20 6d 65 74 61 29 0a 09 23 20 2d 20  tory meta)..# - 
36c0: 55 73 65 72 20 64 6f 69 6e 67 20 74 68 65 20 63  User doing the c
36d0: 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 28 73 2e  ommit        (s.
36e0: 61 2e 29 0a 09 23 0a 09 23 20 2d 20 54 69 6d 65  a.)..#..# - Time
36f0: 73 74 61 6d 70 20 6f 66 20 77 68 65 6e 20 63 6f  stamp of when co
3700: 6d 6d 69 74 74 65 64 20 20 28 63 6f 6d 6d 61 6e  mmitted  (comman
3710: 64 20 61 72 67 75 6d 65 6e 74 29 0a 09 23 0a 09  d argument)..#..
3720: 23 20 2d 20 54 68 65 20 70 61 72 65 6e 74 20 63  # - The parent c
3730: 68 61 6e 67 65 73 65 74 2c 20 69 66 20 61 6e 79  hangeset, if any
3740: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
3750: 20 70 61 72 65 6e 74 20 66 6f 73 73 69 6c 0a 09   parent fossil..
3760: 23 20 20 20 77 69 6c 6c 20 75 73 65 20 74 68 65  #   will use the
3770: 20 65 6d 70 74 79 20 62 61 73 65 20 72 65 76 69   empty base revi
3780: 73 69 6f 6e 20 61 73 20 70 61 72 65 6e 74 2e 0a  sion as parent..
3790: 09 23 0a 09 23 20 2d 20 4c 69 73 74 20 6f 66 20  .#..# - List of 
37a0: 74 68 65 20 66 69 6c 65 20 72 65 76 69 73 69 6f  the file revisio
37b0: 6e 73 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65  ns in the change
37c0: 73 65 74 2e 0a 0a 09 73 74 72 75 63 74 3a 3a 6c  set....struct::l
37d0: 69 73 74 20 61 73 73 69 67 6e 20 5b 24 6d 79 70  ist assign [$myp
37e0: 72 6f 6a 65 63 74 20 67 65 74 6d 65 74 61 20 24  roject getmeta $
37f0: 6d 79 73 72 63 69 64 5d 20 5f 5f 20 5f 5f 20 75  mysrcid] __ __ u
3800: 73 65 72 20 6d 65 73 73 61 67 65 0a 0a 09 23 20  ser message...# 
3810: 57 65 20 64 65 72 69 76 65 20 74 68 65 20 6c 6f  We derive the lo
3820: 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 64 69  d information di
3830: 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65 20  rectly from the 
3840: 72 65 76 69 73 69 6f 6e 73 20 6f 66 0a 09 23 20  revisions of..# 
3850: 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20 61  the changeset, a
3860: 73 20 74 68 65 20 62 72 61 6e 63 68 20 70 61 72  s the branch par
3870: 74 20 6f 66 20 74 68 65 20 6d 65 74 61 20 64 61  t of the meta da
3880: 74 61 20 28 73 2e 61 2e 29 20 69 73 0a 09 23 20  ta (s.a.) is..# 
3890: 6f 75 74 64 61 74 65 64 20 73 69 6e 63 65 20 70  outdated since p
38a0: 61 73 73 20 46 69 6c 74 65 72 53 79 6d 62 6f 6c  ass FilterSymbol
38b0: 73 2e 0a 0a 09 73 65 74 20 6c 6f 64 6e 61 6d 65  s....set lodname
38c0: 20 5b 24 73 65 6c 66 20 6c 6f 64 5d 0a 0a 09 6c   [$self lod]...l
38d0: 6f 67 20 77 72 69 74 65 20 32 20 63 73 65 74 73  og write 2 csets
38e0: 20 7b 49 6d 70 6f 72 74 69 6e 67 20 72 65 76 69   {Importing revi
38f0: 73 69 6f 6e 20 5b 24 73 65 6c 66 20 73 74 72 5d  sion [$self str]
3900: 20 6f 6e 20 24 6c 6f 64 6e 61 6d 65 7d 0a 0a 09   on $lodname}...
3910: 23 20 50 65 72 66 6f 72 6d 20 74 68 65 20 69 6d  # Perform the im
3920: 70 6f 72 74 2e 20 41 73 20 70 61 72 74 20 6f 66  port. As part of
3930: 20 74 68 61 74 20 77 65 20 64 65 74 65 72 6d 69   that we determi
3940: 6e 65 20 74 68 65 20 70 61 72 65 6e 74 0a 09 23  ne the parent..#
3950: 20 77 65 20 6e 65 65 64 2c 20 61 6e 64 20 63 6f   we need, and co
3960: 6e 76 65 72 74 20 74 68 65 20 6c 69 73 74 20 6f  nvert the list o
3970: 66 20 69 74 65 6d 73 20 69 6e 20 74 68 65 20 63  f items in the c
3980: 68 61 6e 67 65 73 65 74 20 69 6e 74 6f 0a 09 23  hangeset into..#
3990: 20 75 75 69 64 73 20 61 6e 64 20 70 72 69 6e 74   uuids and print
39a0: 61 62 6c 65 20 64 61 74 61 2e 0a 0a 09 73 74 72  able data....str
39b0: 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e  uct::list assign
39c0: 20 5b 47 65 74 69 73 64 65 66 61 75 6c 74 20 24   [Getisdefault $
39d0: 6d 79 69 74 65 6d 73 5d 20 69 73 64 65 66 61 75  myitems] isdefau
39e0: 6c 74 20 6c 61 73 74 64 65 66 61 75 6c 74 6f 6e  lt lastdefaulton
39f0: 74 72 75 6e 6b 0a 0a 09 6c 6f 67 20 77 72 69 74  trunk...log writ
3a00: 65 20 38 20 63 73 65 74 73 20 7b 4c 4f 44 20 20  e 8 csets {LOD  
3a10: 20 20 27 24 6c 6f 64 6e 61 6d 65 27 7d 0a 09 6c    '$lodname'}..l
3a20: 6f 67 20 77 72 69 74 65 20 38 20 63 73 65 74 73  og write 8 csets
3a30: 20 7b 20 64 65 66 3f 20 20 24 69 73 64 65 66 61   { def?  $isdefa
3a40: 75 6c 74 7d 0a 09 6c 6f 67 20 77 72 69 74 65 20  ult}..log write 
3a50: 38 20 63 73 65 74 73 20 7b 20 6c 61 73 74 3f 20  8 csets { last? 
3a60: 24 6c 61 73 74 64 65 66 61 75 6c 74 6f 6e 74 72  $lastdefaultontr
3a70: 75 6e 6b 7d 0a 0a 09 73 65 74 20 6c 77 73 20 20  unk}...set lws  
3a80: 5b 47 65 74 77 6f 72 6b 73 70 61 63 65 20 20 20  [Getworkspace   
3a90: 20 24 72 73 74 61 74 65 20 24 6c 6f 64 6e 61 6d   $rstate $lodnam
3aa0: 65 20 24 6d 79 70 72 6f 6a 65 63 74 20 24 69 73  e $myproject $is
3ab0: 64 65 66 61 75 6c 74 5d 0a 09 24 6c 77 73 20 61  default]..$lws a
3ac0: 64 64 20 5b 47 65 74 72 65 76 69 73 69 6f 6e 69  dd [Getrevisioni
3ad0: 6e 66 6f 20 24 6d 79 69 74 65 6d 73 5d 0a 0a 09  nfo $myitems]...
3ae0: 73 65 74 20 75 75 69 64 20 5b 24 72 65 70 6f 73  set uuid [$repos
3af0: 69 74 6f 72 79 20 69 6d 70 6f 72 74 72 65 76 69  itory importrevi
3b00: 73 69 6f 6e 20 5b 24 73 65 6c 66 20 73 74 72 5d  sion [$self str]
3b10: 20 5c 0a 09 09 20 20 20 20 20 20 24 75 73 65 72   \...      $user
3b20: 20 24 6d 65 73 73 61 67 65 20 24 64 61 74 65 20   $message $date 
3b30: 5c 0a 09 09 20 20 20 20 20 20 5b 24 6c 77 73 20  \...      [$lws 
3b40: 67 65 74 69 64 5d 20 5b 24 6c 77 73 20 67 65 74  getid] [$lws get
3b50: 5d 5d 0a 0a 09 23 20 52 65 6d 65 6d 62 65 72 20  ]]...# Remember 
3b60: 74 68 65 20 69 6d 70 6f 72 74 65 64 20 63 68 61  the imported cha
3b70: 6e 67 65 73 65 74 20 69 6e 20 74 68 65 20 73 74  ngeset in the st
3b80: 61 74 65 2c 20 75 6e 64 65 72 20 6f 75 72 0a 09  ate, under our..
3b90: 23 20 4c 4f 44 2e 20 41 6e 64 20 69 66 20 69 74  # LOD. And if it
3ba0: 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 72 75   is the last tru
3bb0: 6e 6b 20 63 68 61 6e 67 65 73 65 74 20 6f 6e 20  nk changeset on 
3bc0: 74 68 65 20 76 65 6e 64 6f 72 0a 09 23 20 62 72  the vendor..# br
3bd0: 61 6e 63 68 20 74 68 65 6e 20 74 68 65 20 72 65  anch then the re
3be0: 76 69 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20 74  vision is also t
3bf0: 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 6f  he actual root o
3c00: 66 20 74 68 65 0a 09 23 20 3a 74 72 75 6e 6b 3a  f the..# :trunk:
3c10: 2c 20 73 6f 20 77 65 20 72 65 6d 65 6d 62 65 72  , so we remember
3c20: 20 69 74 20 61 73 20 73 75 63 68 20 69 6e 20 74   it as such in t
3c30: 68 65 20 73 74 61 74 65 2e 20 48 6f 77 65 76 65  he state. Howeve
3c40: 72 20 69 66 0a 09 23 20 74 68 65 20 74 72 75 6e  r if..# the trun
3c50: 6b 20 61 6c 72 65 61 64 79 20 65 78 69 73 74 73  k already exists
3c60: 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67 65   then the change
3c70: 73 65 74 20 63 61 6e 6e 6f 74 20 62 65 20 6f 6e  set cannot be on
3c80: 20 69 74 0a 09 23 20 61 6e 79 20 6d 6f 72 65 2e   it..# any more.
3c90: 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73 20   This indicates 
3ca0: 77 65 69 72 64 6e 65 73 73 20 69 6e 20 74 68 65  weirdness in the
3cb0: 20 73 65 74 75 70 20 6f 66 20 74 68 65 0a 09 23   setup of the..#
3cc0: 20 76 65 6e 64 6f 72 20 62 72 61 6e 63 68 2c 20   vendor branch, 
3cd0: 62 75 74 20 6f 6e 65 20 77 65 20 63 61 6e 20 77  but one we can w
3ce0: 6f 72 6b 20 61 72 6f 75 6e 64 2e 0a 0a 09 24 6c  ork around....$l
3cf0: 77 73 20 64 65 66 69 64 20 24 75 75 69 64 0a 09  ws defid $uuid..
3d00: 69 66 20 7b 24 6c 61 73 74 64 65 66 61 75 6c 74  if {$lastdefault
3d10: 6f 6e 74 72 75 6e 6b 7d 20 7b 0a 09 20 20 20 20  ontrunk} {..    
3d20: 69 66 20 7b 5b 24 72 73 74 61 74 65 20 68 61 73  if {[$rstate has
3d30: 20 3a 74 72 75 6e 6b 3a 5d 7d 20 7b 0a 09 09 6c   :trunk:]} {...l
3d40: 6f 67 20 77 72 69 74 65 20 32 20 63 73 65 74 73  og write 2 csets
3d50: 20 7b 4d 75 6c 74 69 70 6c 65 20 63 68 61 6e 67   {Multiple chang
3d60: 65 73 65 74 73 20 64 65 63 6c 61 72 65 64 20 74  esets declared t
3d70: 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20 74 72  o be the last tr
3d80: 75 6e 6b 20 63 68 61 6e 67 65 73 65 74 20 6f 6e  unk changeset on
3d90: 20 74 68 65 20 76 65 6e 64 6f 72 2d 62 72 61 6e   the vendor-bran
3da0: 63 68 7d 0a 09 20 20 20 20 7d 20 65 6c 73 65 20  ch}..    } else 
3db0: 7b 0a 09 09 24 72 73 74 61 74 65 20 6e 65 77 20  {...$rstate new 
3dc0: 3a 74 72 75 6e 6b 3a 20 5b 24 6c 77 73 20 6e 61  :trunk: [$lws na
3dd0: 6d 65 5d 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09  me]..    }..}...
3de0: 23 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 77  # Remember the w
3df0: 68 6f 6c 65 20 63 68 61 6e 67 65 73 65 74 20 2f  hole changeset /
3e00: 20 75 75 69 64 20 6d 61 70 70 69 6e 67 2c 20 66   uuid mapping, f
3e10: 6f 72 20 74 68 65 20 74 61 67 73 2e 0a 0a 09 73  or the tags....s
3e20: 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20  tate run {..    
3e30: 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 73 75 75  INSERT INTO csuu
3e40: 69 64 20 28 63 69 64 2c 20 20 20 75 75 69 64 29  id (cid,   uuid)
3e50: 0a 09 20 20 20 20 56 41 4c 55 45 53 20 20 20 20  ..    VALUES    
3e60: 20 20 20 20 20 20 20 20 20 28 24 6d 79 69 64 2c           ($myid,
3e70: 20 24 75 75 69 64 29 0a 09 7d 0a 09 72 65 74 75   $uuid)..}..retu
3e80: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72  rn.    }..    pr
3e90: 6f 63 20 47 65 74 72 65 76 69 73 69 6f 6e 69 6e  oc Getrevisionin
3ea0: 66 6f 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b  fo {revisions} {
3eb0: 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b  ..set theset ('[
3ec0: 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20  join $revisions 
3ed0: 7b 27 2c 27 7d 5d 27 29 0a 09 73 65 74 20 72 65  {','}]')..set re
3ee0: 76 69 73 69 6f 6e 73 20 7b 7d 0a 09 66 6f 72 65  visions {}..fore
3ef0: 61 63 68 20 7b 66 72 69 64 20 70 61 74 68 20 66  ach {frid path f
3f00: 6e 61 6d 65 20 72 65 76 6e 72 20 72 6f 70 7d 20  name revnr rop} 
3f10: 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73  [state run [subs
3f20: 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e  t -nocommands -n
3f30: 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09  obackslashes {..
3f40: 20 20 20 20 53 45 4c 45 43 54 20 55 2e 75 75 69      SELECT U.uui
3f50: 64 2c 20 46 2e 76 69 73 69 62 6c 65 2c 20 46 2e  d, F.visible, F.
3f60: 6e 61 6d 65 2c 20 52 2e 72 65 76 2c 20 52 2e 6f  name, R.rev, R.o
3f70: 70 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65  p..    FROM   re
3f80: 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 75 75 69  vision R, revuui
3f90: 64 20 55 2c 20 66 69 6c 65 20 46 0a 09 20 20 20  d U, file F..   
3fa0: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 49 4e   WHERE  R.rid IN
3fb0: 20 24 74 68 65 73 65 74 20 20 2d 2d 20 41 6c 6c   $theset  -- All
3fc0: 20 73 70 65 63 69 66 69 65 64 20 72 65 76 69 73   specified revis
3fd0: 69 6f 6e 73 0a 09 20 20 20 20 41 4e 44 20 20 20  ions..    AND   
3fe0: 20 55 2e 72 69 64 20 3d 20 52 2e 72 69 64 20 20   U.rid = R.rid  
3ff0: 20 20 20 2d 2d 20 67 65 74 20 66 6f 73 73 69 6c     -- get fossil
4000: 20 75 75 69 64 20 6f 66 20 72 65 76 69 73 69 6f   uuid of revisio
4010: 6e 0a 09 20 20 20 20 41 4e 44 20 20 20 20 46 2e  n..    AND    F.
4020: 66 69 64 20 3d 20 52 2e 66 69 64 20 20 20 20 20  fid = R.fid     
4030: 2d 2d 20 67 65 74 20 66 69 6c 65 20 6f 66 20 72  -- get file of r
4040: 65 76 69 73 69 6f 6e 0a 09 7d 5d 5d 20 7b 0a 09  evision..}]] {..
4050: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 76 69      lappend revi
4060: 73 69 6f 6e 73 20 24 66 72 69 64 20 24 70 61 74  sions $frid $pat
4070: 68 20 24 66 6e 61 6d 65 2f 24 72 65 76 6e 72 20  h $fname/$revnr 
4080: 24 72 6f 70 0a 09 7d 0a 09 72 65 74 75 72 6e 20  $rop..}..return 
4090: 24 72 65 76 69 73 69 6f 6e 73 0a 20 20 20 20 7d  $revisions.    }
40a0: 0a 0a 20 20 20 20 70 72 6f 63 20 47 65 74 77 6f  ..    proc Getwo
40b0: 72 6b 73 70 61 63 65 20 7b 72 73 74 61 74 65 20  rkspace {rstate 
40c0: 6c 6f 64 6e 61 6d 65 20 70 72 6f 6a 65 63 74 20  lodname project 
40d0: 69 73 64 65 66 61 75 6c 74 7d 20 7b 0a 0a 09 23  isdefault} {...#
40e0: 20 54 68 65 20 73 74 61 74 65 20 6f 62 6a 65 63   The state objec
40f0: 74 20 68 6f 6c 64 73 20 74 68 65 20 77 6f 72 6b  t holds the work
4100: 73 70 61 63 65 20 73 74 61 74 65 20 6f 66 20 65  space state of e
4110: 61 63 68 20 6b 6e 6f 77 6e 0a 09 23 20 6c 69 6e  ach known..# lin
4120: 65 2d 6f 66 2d 64 65 76 65 6c 6f 70 6d 65 6e 74  e-of-development
4130: 20 28 4c 4f 44 29 2c 20 75 70 20 74 6f 20 74 68   (LOD), up to th
4140: 65 20 6c 61 73 74 20 63 6f 6d 6d 69 74 74 65 64  e last committed
4150: 0a 09 23 20 63 68 61 6e 67 65 73 65 74 20 62 65  ..# changeset be
4160: 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 61 74 20  longing to that 
4170: 4c 4f 44 2e 0a 0a 09 23 20 28 2a 29 20 53 74 61  LOD....# (*) Sta
4180: 6e 64 61 72 64 20 68 61 6e 64 6c 69 6e 67 20 69  ndard handling i
4190: 66 20 69 6e 2d 4c 4f 44 20 63 68 61 6e 67 65 73  f in-LOD changes
41a0: 65 74 73 2e 20 49 66 20 74 68 65 20 4c 4f 44 20  ets. If the LOD 
41b0: 6f 66 0a 09 23 20 20 20 20 20 74 68 65 20 63 75  of..#     the cu
41c0: 72 72 65 6e 74 20 63 68 61 6e 67 65 73 65 74 20  rrent changeset 
41d0: 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 73 74  exists in the st
41e0: 61 74 65 20 28 3d 20 68 61 73 20 62 65 65 6e 0a  ate (= has been.
41f0: 09 23 20 20 20 20 20 63 6f 6d 6d 69 74 74 65 64  .#     committed
4200: 20 74 6f 29 20 74 68 65 6e 20 74 68 69 73 20 69   to) then this i
4210: 74 20 68 61 73 20 74 68 65 20 77 6f 72 6b 73 70  t has the worksp
4220: 61 63 65 20 77 65 20 61 72 65 0a 09 23 20 20 20  ace we are..#   
4230: 20 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 2e 0a 0a    looking for...
4240: 09 69 66 20 7b 5b 24 72 73 74 61 74 65 20 68 61  .if {[$rstate ha
4250: 73 20 24 6c 6f 64 6e 61 6d 65 5d 7d 20 7b 0a 09  s $lodname]} {..
4260: 20 20 20 20 72 65 74 75 72 6e 20 5b 24 72 73 74      return [$rst
4270: 61 74 65 20 67 65 74 20 24 6c 6f 64 6e 61 6d 65  ate get $lodname
4280: 5d 0a 09 7d 0a 0a 09 23 20 49 66 20 74 68 65 20  ]..}...# If the 
4290: 4c 4f 44 20 69 73 20 68 6f 77 65 76 65 72 20 6e  LOD is however n
42a0: 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 2c 20 74 68  ot yet known, th
42b0: 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a 09  en the current..
42c0: 23 20 63 68 61 6e 67 65 73 65 74 20 63 61 6e 20  # changeset can 
42d0: 62 65 20 65 69 74 68 65 72 20 6f 66 0a 09 23 20  be either of..# 
42e0: 28 61 29 20 72 6f 6f 74 20 6f 66 20 61 20 76 65  (a) root of a ve
42f0: 6e 64 6f 72 20 62 72 61 6e 63 68 2c 0a 09 23 20  ndor branch,..# 
4300: 28 62 29 20 72 6f 6f 74 20 6f 66 20 74 68 65 20  (b) root of the 
4310: 74 72 75 6e 6b 20 4c 4f 44 2c 20 6f 72 0a 09 23  trunk LOD, or..#
4320: 20 28 63 29 20 74 68 65 20 66 69 72 73 74 20 63   (c) the first c
4330: 68 61 6e 67 65 73 65 74 20 69 6e 20 61 20 6e 65  hangeset in a ne
4340: 77 20 4c 4f 44 20 77 68 69 63 68 20 77 61 73 20  w LOD which was 
4350: 73 70 61 77 6e 65 64 20 66 72 6f 6d 0a 09 23 20  spawned from..# 
4360: 20 20 20 20 61 6e 20 65 78 69 73 74 69 6e 67 20      an existing 
4370: 4c 4f 44 2e 0a 0a 09 23 20 46 6f 72 20 62 6f 74  LOD....# For bot
4380: 68 20 28 61 29 20 61 6e 64 20 28 62 29 20 77 65  h (a) and (b) we
4390: 20 68 61 76 65 20 74 6f 20 63 72 65 61 74 65 20   have to create 
43a0: 61 20 6e 65 77 20 77 6f 72 6b 73 70 61 63 65 20  a new workspace 
43b0: 66 6f 72 0a 09 23 20 74 68 65 20 6c 6f 64 2c 20  for..# the lod, 
43c0: 61 6e 64 20 69 74 20 64 6f 65 73 6e 27 74 20 69  and it doesn't i
43d0: 6e 68 65 72 69 74 20 66 72 6f 6d 20 61 6e 79 74  nherit from anyt
43e0: 68 69 6e 67 2e 0a 0a 09 23 20 4f 6e 65 20 65 78  hing....# One ex
43f0: 63 65 70 74 69 6f 6e 20 66 6f 72 20 28 61 29 2e  ception for (a).
4400: 20 49 66 20 77 65 20 61 6c 72 65 61 64 79 20 68   If we already h
4410: 61 76 65 20 61 20 3a 76 65 6e 64 6f 72 3a 20 62  ave a :vendor: b
4420: 72 61 6e 63 68 0a 09 23 20 74 68 65 6e 20 6d 75  ranch..# then mu
4430: 6c 74 69 70 6c 65 20 73 79 6d 62 6f 6c 73 20 77  ltiple symbols w
4440: 65 72 65 20 75 73 65 64 20 66 6f 72 20 74 68 65  ere used for the
4450: 20 76 65 6e 64 6f 72 20 62 72 61 6e 63 68 20 62   vendor branch b
4460: 79 0a 09 23 20 64 69 66 66 65 72 65 6e 74 20 66  y..# different f
4470: 69 6c 65 73 2e 20 49 6e 20 74 68 61 74 20 63 61  iles. In that ca
4480: 73 65 20 74 68 65 20 27 6e 65 77 27 20 62 72 61  se the 'new' bra
4490: 6e 63 68 20 69 73 20 6d 61 64 65 20 61 6e 0a 09  nch is made an..
44a0: 23 20 61 6c 69 61 73 20 6f 66 20 74 68 65 20 3a  # alias of the :
44b0: 76 65 6e 64 6f 72 3a 2c 20 65 66 66 65 63 74 69  vendor:, effecti
44c0: 76 65 6c 79 20 6d 65 72 67 69 6e 67 20 74 68 65  vely merging the
44d0: 20 73 79 6d 62 6f 6c 73 0a 09 23 20 74 6f 67 65   symbols..# toge
44e0: 74 68 65 72 2e 0a 0a 09 23 20 4e 6f 74 65 20 74  ther....# Note t
44f0: 68 61 74 20 63 61 73 65 20 28 62 29 20 6d 61 79  hat case (b) may
4500: 20 6e 65 76 65 72 20 6f 63 63 75 72 2e 20 53 65   never occur. Se
4510: 65 20 74 68 65 20 76 61 72 69 61 62 6c 65 0a 09  e the variable..
4520: 23 20 27 6c 61 73 74 64 65 66 61 75 6c 74 6f 6e  # 'lastdefaulton
4530: 74 72 75 6e 6b 27 20 69 6e 20 74 68 65 20 63 61  trunk' in the ca
4540: 6c 6c 65 72 20 28 6d 65 74 68 6f 64 20 70 75 73  ller (method pus
4550: 68 74 6f 29 2e 20 54 68 69 73 0a 09 23 20 66 6c  hto). This..# fl
4560: 61 67 20 63 61 6e 20 74 68 65 20 67 65 6e 65 72  ag can the gener
4570: 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 77 6f 72  ation of the wor
4580: 6b 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 3a  kspace for the :
4590: 74 72 75 6e 6b 3a 20 4c 4f 44 0a 09 23 20 61 73  trunk: LOD..# as
45a0: 20 77 65 6c 6c 2c 20 6d 61 6b 69 6e 67 20 69 74   well, making it
45b0: 20 69 6e 68 65 72 69 74 20 74 68 65 20 73 74 61   inherit the sta
45c0: 74 65 20 6f 66 20 74 68 65 20 6c 61 73 74 0a 09  te of the last..
45d0: 23 20 74 72 75 6e 6b 2d 63 68 61 6e 67 65 73 65  # trunk-changese
45e0: 74 20 6f 6e 20 74 68 65 20 76 65 6e 64 6f 72 2d  t on the vendor-
45f0: 62 72 61 6e 63 68 2e 0a 0a 09 69 66 20 7b 24 69  branch....if {$i
4600: 73 64 65 66 61 75 6c 74 7d 20 7b 0a 09 20 20 20  sdefault} {..   
4610: 20 69 66 20 7b 21 5b 24 72 73 74 61 74 65 20 68   if {![$rstate h
4620: 61 73 20 22 3a 76 65 6e 64 6f 72 3a 22 5d 7d 20  as ":vendor:"]} 
4630: 7b 0a 09 09 23 20 43 72 65 61 74 65 20 74 68 65  {...# Create the
4640: 20 76 65 6e 64 6f 72 20 62 72 61 6e 63 68 20 69   vendor branch i
4650: 66 20 6e 6f 74 20 70 72 65 73 65 6e 74 20 61 6c  f not present al
4660: 72 65 61 64 79 2e 0a 09 09 24 72 73 74 61 74 65  ready....$rstate
4670: 20 6e 65 77 20 3a 76 65 6e 64 6f 72 3a 0a 09 20   new :vendor:.. 
4680: 20 20 20 7d 0a 09 20 20 20 20 23 20 4d 65 72 67     }..    # Merg
4690: 65 20 74 68 65 20 6e 65 77 20 73 79 6d 62 6f 6c  e the new symbol
46a0: 20 74 6f 20 74 68 65 20 76 65 6e 64 6f 72 20 62   to the vendor b
46b0: 72 61 6e 63 68 0a 09 20 20 20 20 24 72 73 74 61  ranch..    $rsta
46c0: 74 65 20 64 75 70 20 24 6c 6f 64 6e 61 6d 65 20  te dup $lodname 
46d0: 3c 2d 2d 20 3a 76 65 6e 64 6f 72 3a 0a 09 20 20  <-- :vendor:..  
46e0: 20 20 72 65 74 75 72 6e 20 5b 24 72 73 74 61 74    return [$rstat
46f0: 65 20 67 65 74 20 24 6c 6f 64 6e 61 6d 65 5d 0a  e get $lodname].
4700: 09 7d 0a 0a 09 69 66 20 7b 24 6c 6f 64 6e 61 6d  .}...if {$lodnam
4710: 65 20 65 71 20 22 3a 74 72 75 6e 6b 3a 22 7d 20  e eq ":trunk:"} 
4720: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 5b 24  {..    return [$
4730: 72 73 74 61 74 65 20 6e 65 77 20 24 6c 6f 64 6e  rstate new $lodn
4740: 61 6d 65 5d 0a 09 7d 0a 0a 09 23 20 43 61 73 65  ame]..}...# Case
4750: 20 28 63 29 2e 20 57 65 20 66 69 6e 64 20 74 68   (c). We find th
4760: 65 20 70 61 72 65 6e 74 20 4c 4f 44 20 6f 66 20  e parent LOD of 
4770: 6f 75 72 20 4c 4f 44 20 61 6e 64 20 6c 65 74 20  our LOD and let 
4780: 74 68 65 20 6e 65 77 0a 09 23 20 77 6f 72 6b 73  the new..# works
4790: 70 61 63 65 20 69 6e 68 65 72 69 74 20 66 72 6f  pace inherit fro
47a0: 6d 20 74 68 65 20 70 61 72 65 6e 74 27 73 20 77  m the parent's w
47b0: 6f 72 6b 73 70 61 63 65 2e 0a 0a 09 73 65 74 20  orkspace....set 
47c0: 70 6c 6f 64 6e 61 6d 65 20 5b 5b 5b 24 70 72 6f  plodname [[[$pro
47d0: 6a 65 63 74 20 67 65 74 73 79 6d 62 6f 6c 20 24  ject getsymbol $
47e0: 6c 6f 64 6e 61 6d 65 5d 20 70 61 72 65 6e 74 5d  lodname] parent]
47f0: 20 6e 61 6d 65 5d 0a 0a 09 6c 6f 67 20 77 72 69   name]...log wri
4800: 74 65 20 38 20 63 73 65 74 73 20 7b 70 4c 4f 44  te 8 csets {pLOD
4810: 20 20 20 27 24 70 6c 6f 64 6e 61 6d 65 27 7d 0a     '$plodname'}.
4820: 0a 09 69 66 20 7b 5b 24 72 73 74 61 74 65 20 68  ..if {[$rstate h
4830: 61 73 20 24 70 6c 6f 64 6e 61 6d 65 5d 7d 20 7b  as $plodname]} {
4840: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 5b 24 72  ..    return [$r
4850: 73 74 61 74 65 20 6e 65 77 20 24 6c 6f 64 6e 61  state new $lodna
4860: 6d 65 20 24 70 6c 6f 64 6e 61 6d 65 5d 0a 09 7d  me $plodname]..}
4870: 0a 0a 09 66 6f 72 65 61 63 68 20 6b 20 5b 6c 73  ...foreach k [ls
4880: 6f 72 74 20 5b 24 72 73 74 61 74 65 20 6e 61 6d  ort [$rstate nam
4890: 65 73 5d 5d 20 7b 0a 09 20 20 20 20 6c 6f 67 20  es]] {..    log 
48a0: 77 72 69 74 65 20 38 20 63 73 65 74 73 20 7b 20  write 8 csets { 
48b0: 20 20 20 24 6b 20 3d 20 5b 5b 24 72 73 74 61 74     $k = [[$rstat
48c0: 65 20 67 65 74 20 24 6b 5d 20 67 65 74 69 64 5d  e get $k] getid]
48d0: 7d 0a 09 7d 0a 0a 09 74 72 6f 75 62 6c 65 20 69  }..}...trouble i
48e0: 6e 74 65 72 6e 61 6c 20 7b 55 6e 61 62 6c 65 20  nternal {Unable 
48f0: 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 63 68 61  to determine cha
4900: 6e 67 65 73 65 74 20 70 61 72 65 6e 74 7d 0a 09  ngeset parent}..
4910: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20  return.    }..  
4920: 20 20 70 72 6f 63 20 47 65 74 69 73 64 65 66 61    proc Getisdefa
4930: 75 6c 74 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20  ult {revisions} 
4940: 7b 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27  {..set theset ('
4950: 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73  [join $revisions
4960: 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 73 74 72 75   {','}]')...stru
4970: 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20  ct::list assign 
4980: 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73  [state run [subs
4990: 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e  t -nocommands -n
49a0: 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09  obackslashes {..
49b0: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 69 73 64      SELECT R.isd
49c0: 65 66 61 75 6c 74 2c 20 52 2e 64 62 63 68 69 6c  efault, R.dbchil
49d0: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65  d..    FROM   re
49e0: 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48  vision R..    WH
49f0: 45 52 45 20 20 52 2e 72 69 64 20 49 4e 20 24 74  ERE  R.rid IN $t
4a00: 68 65 73 65 74 20 20 2d 2d 20 41 6c 6c 20 73 70  heset  -- All sp
4a10: 65 63 69 66 69 65 64 20 72 65 76 69 73 69 6f 6e  ecified revision
4a20: 73 0a 09 20 20 20 20 4c 49 4d 49 54 20 31 0a 09  s..    LIMIT 1..
4a30: 7d 5d 5d 20 64 65 66 20 6c 61 73 74 0a 0a 09 23  }]] def last...#
4a40: 20 54 4f 44 4f 2f 43 48 45 43 4b 3a 20 6c 6f 6f   TODO/CHECK: loo
4a50: 6b 20 66 6f 72 20 63 68 61 6e 67 65 73 65 74 73  k for changesets
4a60: 20 77 68 65 72 65 20 69 73 64 65 66 61 75 6c 74   where isdefault
4a70: 2f 64 62 63 68 69 6c 64 20 69 73 0a 09 23 20 61  /dbchild is..# a
4a80: 6d 62 69 67 6f 75 73 2e 0a 0a 09 72 65 74 75 72  mbigous....retur
4a90: 6e 20 5b 6c 69 73 74 20 24 64 65 66 20 5b 65 78  n [list $def [ex
4aa0: 70 72 20 7b 24 6c 61 73 74 20 6e 65 20 22 22 7d  pr {$last ne ""}
4ab0: 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79  ]].    }..    ty
4ac0: 70 65 6d 65 74 68 6f 64 20 73 70 6c 69 74 20 7b  pemethod split {
4ad0: 63 73 65 74 20 61 72 67 73 7d 20 7b 0a 09 23 20  cset args} {..# 
4ae0: 41 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63  As part of the c
4af0: 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 6e  reation of the n
4b00: 65 77 20 63 68 61 6e 67 65 73 65 74 73 20 73 70  ew changesets sp
4b10: 65 63 69 66 69 65 64 20 69 6e 0a 09 23 20 41 52  ecified in..# AR
4b20: 47 53 20 61 73 20 73 65 74 73 20 6f 66 20 69 74  GS as sets of it
4b30: 65 6d 73 2c 20 61 6c 6c 20 73 75 62 73 65 74 73  ems, all subsets
4b40: 20 6f 66 20 43 53 45 54 27 73 20 69 74 65 6d 20   of CSET's item 
4b50: 73 65 74 2c 20 43 53 45 54 0a 09 23 20 77 69 6c  set, CSET..# wil
4b60: 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66 72 6f  l be dropped fro
4b70: 6d 20 61 6c 6c 20 64 61 74 61 62 61 73 65 73 2c  m all databases,
4b80: 20 69 6e 20 61 6e 64 20 6f 75 74 20 6f 66 20 6d   in and out of m
4b90: 65 6d 6f 72 79 2c 0a 09 23 20 61 6e 64 20 74 68  emory,..# and th
4ba0: 65 6e 20 64 65 73 74 72 6f 79 65 64 2e 0a 09 23  en destroyed...#
4bb0: 0a 09 23 20 4e 6f 74 65 3a 20 54 68 65 20 69 74  ..# Note: The it
4bc0: 65 6d 20 6c 69 73 74 73 20 66 6f 75 6e 64 20 69  em lists found i
4bd0: 6e 20 61 72 67 73 20 61 72 65 20 74 61 67 67 65  n args are tagge
4be0: 64 20 69 74 65 6d 73 2e 20 54 68 65 79 0a 09 23  d items. They..#
4bf0: 20 68 61 76 65 20 74 6f 20 68 61 76 65 20 74 68   have to have th
4c00: 65 20 73 61 6d 65 20 74 79 70 65 20 61 73 20 74  e same type as t
4c10: 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20 62 65  he changeset, be
4c20: 69 6e 67 20 73 75 62 73 65 74 73 0a 09 23 20 6f  ing subsets..# o
4c30: 66 20 69 74 73 20 69 74 65 6d 73 2e 20 54 68 69  f its items. Thi
4c40: 73 20 69 73 20 63 68 65 63 6b 65 64 20 69 6e 20  s is checked in 
4c50: 55 6e 74 61 67 31 2e 0a 0a 09 6c 6f 67 20 77 72  Untag1....log wr
4c60: 69 74 65 20 38 20 63 73 65 74 73 20 7b 4f 4c 44  ite 8 csets {OLD
4c70: 3a 20 5b 6c 73 6f 72 74 20 5b 24 63 73 65 74 20  : [lsort [$cset 
4c80: 69 74 65 6d 73 5d 5d 7d 0a 09 56 61 6c 69 64 61  items]]}..Valida
4c90: 74 65 46 72 61 67 6d 65 6e 74 73 20 24 63 73 65  teFragments $cse
4ca0: 74 20 24 61 72 67 73 0a 0a 09 23 20 41 6c 6c 20  t $args...# All 
4cb0: 63 68 65 63 6b 73 20 70 61 73 73 2c 20 61 63 74  checks pass, act
4cc0: 75 61 6c 6c 79 20 70 65 72 66 6f 72 6d 20 74 68  ually perform th
4cd0: 65 20 73 70 6c 69 74 2e 0a 0a 09 73 74 72 75 63  e split....struc
4ce0: 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b  t::list assign [
4cf0: 24 63 73 65 74 20 64 61 74 61 5d 20 70 72 6f 6a  $cset data] proj
4d00: 65 63 74 20 63 73 74 79 70 65 20 63 73 73 72 63  ect cstype cssrc
4d10: 0a 0a 09 73 65 74 20 70 72 65 64 65 63 65 73 73  ...set predecess
4d20: 6f 72 73 20 5b 24 63 73 65 74 20 64 72 6f 70 5d  ors [$cset drop]
4d30: 0a 09 24 63 73 65 74 20 64 65 73 74 72 6f 79 0a  ..$cset destroy.
4d40: 0a 09 73 65 74 20 6e 65 77 63 73 65 74 73 20 7b  ..set newcsets {
4d50: 7d 0a 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d  }..foreach fragm
4d60: 65 6e 74 69 74 65 6d 73 20 24 61 72 67 73 20 7b  entitems $args {
4d70: 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20  ..    log write 
4d80: 38 20 63 73 65 74 73 20 7b 4d 41 4b 45 3a 20 5b  8 csets {MAKE: [
4d90: 6c 73 6f 72 74 20 24 66 72 61 67 6d 65 6e 74 69  lsort $fragmenti
4da0: 74 65 6d 73 5d 7d 0a 0a 09 20 20 20 20 73 65 74  tems]}...    set
4db0: 20 66 72 61 67 6d 65 6e 74 20 5b 24 74 79 70 65   fragment [$type
4dc0: 20 25 41 55 54 4f 25 20 24 70 72 6f 6a 65 63 74   %AUTO% $project
4dd0: 20 24 63 73 74 79 70 65 20 24 63 73 73 72 63 20   $cstype $cssrc 
4de0: 5c 0a 09 09 09 20 20 20 20 20 20 5b 55 6e 74 61  \....      [Unta
4df0: 67 20 24 66 72 61 67 6d 65 6e 74 69 74 65 6d 73  g $fragmentitems
4e00: 20 24 63 73 74 79 70 65 5d 5d 0a 09 20 20 20 20   $cstype]]..    
4e10: 6c 61 70 70 65 6e 64 20 6e 65 77 63 73 65 74 73  lappend newcsets
4e20: 20 24 66 72 61 67 6d 65 6e 74 0a 0a 09 20 20 20   $fragment...   
4e30: 20 24 66 72 61 67 6d 65 6e 74 20 70 65 72 73 69   $fragment persi
4e40: 73 74 0a 09 20 20 20 20 24 66 72 61 67 6d 65 6e  st..    $fragmen
4e50: 74 20 64 65 74 65 72 6d 69 6e 65 73 75 63 63 65  t determinesucce
4e60: 73 73 6f 72 73 0a 09 7d 0a 0a 09 23 20 54 68 65  ssors..}...# The
4e70: 20 70 72 65 64 65 63 65 73 73 6f 72 73 20 68 61   predecessors ha
4e80: 76 65 20 74 6f 20 72 65 63 6f 6d 70 75 74 65 20  ve to recompute 
4e90: 74 68 65 69 72 20 73 75 63 63 65 73 73 6f 72 73  their successors
4ea0: 2c 20 69 2e 65 2e 0a 09 23 20 72 65 6d 6f 76 65  , i.e...# remove
4eb0: 20 74 68 65 20 64 72 6f 70 70 65 64 20 63 68 61   the dropped cha
4ec0: 6e 67 65 73 65 74 20 61 6e 64 20 70 75 74 20 6f  ngeset and put o
4ed0: 6e 65 20 6f 66 20 74 68 65 20 66 72 61 67 6d 65  ne of the fragme
4ee0: 6e 74 73 0a 09 23 20 69 6e 74 6f 20 69 74 73 20  nts..# into its 
4ef0: 70 6c 61 63 65 2e 0a 09 66 6f 72 65 61 63 68 20  place...foreach 
4f00: 70 20 24 70 72 65 64 65 63 65 73 73 6f 72 73 20  p $predecessors 
4f10: 7b 0a 09 20 20 20 20 24 70 20 64 65 74 65 72 6d  {..    $p determ
4f20: 69 6e 65 73 75 63 63 65 73 73 6f 72 73 0a 09 7d  inesuccessors..}
4f30: 0a 0a 09 72 65 74 75 72 6e 20 24 6e 65 77 63 73  ...return $newcs
4f40: 65 74 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  ets.    }..    t
4f50: 79 70 65 6d 65 74 68 6f 64 20 69 74 65 6d 73 74  ypemethod itemst
4f60: 72 20 7b 69 74 65 6d 7d 20 7b 0a 09 73 74 72 75  r {item} {..stru
4f70: 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20  ct::list assign 
4f80: 24 69 74 65 6d 20 69 74 79 70 65 20 69 69 64 0a  $item itype iid.
4f90: 09 72 65 74 75 72 6e 20 5b 24 69 74 79 70 65 20  .return [$itype 
4fa0: 73 74 72 20 24 69 69 64 5d 0a 20 20 20 20 7d 0a  str $iid].    }.
4fb0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
4fc0: 73 74 72 6c 69 73 74 20 7b 63 68 61 6e 67 65 73  strlist {changes
4fd0: 65 74 73 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b  ets} {..return [
4fe0: 6a 6f 69 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69  join [struct::li
4ff0: 73 74 20 6d 61 70 20 24 63 68 61 6e 67 65 73 65  st map $changese
5000: 74 73 20 5b 6d 79 70 72 6f 63 20 49 44 5d 5d 5d  ts [myproc ID]]]
5010: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63  .    }..    proc
5020: 20 49 44 20 7b 63 73 65 74 7d 20 7b 20 24 63 73   ID {cset} { $cs
5030: 65 74 20 73 74 72 20 7d 0a 0a 20 20 20 20 70 72  et str }..    pr
5040: 6f 63 20 55 6e 74 61 67 20 7b 74 61 67 67 65 64  oc Untag {tagged
5050: 69 74 65 6d 73 20 63 73 74 79 70 65 7d 20 7b 0a  items cstype} {.
5060: 09 72 65 74 75 72 6e 20 5b 73 74 72 75 63 74 3a  .return [struct:
5070: 3a 6c 69 73 74 20 6d 61 70 20 24 74 61 67 67 65  :list map $tagge
5080: 64 69 74 65 6d 73 20 5b 6d 79 70 72 6f 63 20 55  ditems [myproc U
5090: 6e 74 61 67 31 20 24 63 73 74 79 70 65 5d 5d 0a  ntag1 $cstype]].
50a0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20      }..    proc 
50b0: 55 6e 74 61 67 31 20 7b 63 73 74 79 70 65 20 74  Untag1 {cstype t
50c0: 68 65 69 74 65 6d 7d 20 7b 0a 09 73 74 72 75 63  heitem} {..struc
50d0: 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 24  t::list assign $
50e0: 74 68 65 69 74 65 6d 20 74 20 69 0a 09 69 6e 74  theitem t i..int
50f0: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24  egrity assert {$
5100: 63 73 74 79 70 65 20 65 71 20 24 74 7d 20 7b 49  cstype eq $t} {I
5110: 74 65 6d 20 24 69 27 73 20 74 79 70 65 20 69 73  tem $i's type is
5120: 20 27 24 74 27 2c 20 65 78 70 65 63 74 65 64 20   '$t', expected 
5130: 27 24 63 73 74 79 70 65 27 7d 0a 09 72 65 74 75  '$cstype'}..retu
5140: 72 6e 20 24 69 0a 20 20 20 20 7d 0a 0a 20 20 20  rn $i.    }..   
5150: 20 70 72 6f 63 20 54 61 67 49 74 65 6d 44 69 63   proc TagItemDic
5160: 74 20 7b 69 74 65 6d 64 69 63 74 20 63 73 74 79  t {itemdict csty
5170: 70 65 7d 20 7b 0a 09 73 65 74 20 72 65 73 20 7b  pe} {..set res {
5180: 7d 0a 09 66 6f 72 65 61 63 68 20 7b 69 20 76 7d  }..foreach {i v}
5190: 20 24 69 74 65 6d 64 69 63 74 20 7b 20 6c 61 70   $itemdict { lap
51a0: 70 65 6e 64 20 72 65 73 20 5b 6c 69 73 74 20 24  pend res [list $
51b0: 63 73 74 79 70 65 20 24 69 5d 20 24 76 20 7d 0a  cstype $i] $v }.
51c0: 09 72 65 74 75 72 6e 20 24 72 65 73 0a 20 20 20  .return $res.   
51d0: 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 56 61 6c   }..    proc Val
51e0: 69 64 61 74 65 46 72 61 67 6d 65 6e 74 73 20 7b  idateFragments {
51f0: 63 73 65 74 20 66 72 61 67 6d 65 6e 74 73 7d 20  cset fragments} 
5200: 7b 0a 09 23 20 43 68 65 63 6b 20 74 68 65 20 76  {..# Check the v
5210: 61 72 69 6f 75 73 20 69 6e 74 65 67 72 69 74 79  arious integrity
5220: 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66 6f 72   constraints for
5230: 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 0a 09   the fragments..
5240: 23 20 73 70 65 63 69 66 79 69 6e 67 20 68 6f 77  # specifying how
5250: 20 74 6f 20 73 70 6c 69 74 20 74 68 65 20 63 68   to split the ch
5260: 61 6e 67 65 73 65 74 3a 0a 09 23 0a 09 23 20 2a  angeset:..#..# *
5270: 20 57 65 20 6d 75 73 74 20 68 61 76 65 20 74 77   We must have tw
5280: 6f 20 6f 72 20 6d 6f 72 65 20 66 72 61 67 6d 65  o or more fragme
5290: 6e 74 73 2c 20 61 73 20 73 70 6c 69 74 74 69 6e  nts, as splittin
52a0: 67 20 61 0a 09 23 20 20 20 63 68 61 6e 67 65 73  g a..#   changes
52b0: 65 74 20 69 6e 74 6f 20 6f 6e 65 20 6d 61 6b 65  et into one make
52c0: 73 20 6e 6f 20 73 65 6e 73 65 2e 0a 09 23 20 2a  s no sense...# *
52d0: 20 4e 6f 20 66 72 61 67 6d 65 6e 74 20 6d 61 79   No fragment may
52e0: 20 62 65 20 65 6d 70 74 79 2e 0a 09 23 20 2a 20   be empty...# * 
52f0: 41 6c 6c 20 66 72 61 67 6d 65 6e 74 73 20 68 61  All fragments ha
5300: 76 65 20 74 6f 20 62 65 20 74 72 75 65 20 73 75  ve to be true su
5310: 62 73 65 74 73 20 6f 66 20 74 68 65 20 69 74 65  bsets of the ite
5320: 6d 73 20 69 6e 20 74 68 65 0a 09 23 20 20 20 63  ms in the..#   c
5330: 68 61 6e 67 65 73 65 74 20 74 6f 20 73 70 6c 69  hangeset to spli
5340: 74 2e 20 54 68 65 20 27 74 72 75 65 27 20 69 73  t. The 'true' is
5350: 20 69 6d 70 6c 69 65 64 20 62 65 63 61 75 73 65   implied because
5360: 20 6e 6f 6e 65 20 61 72 65 0a 09 23 20 20 20 61   none are..#   a
5370: 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 65 6d 70  llowed to be emp
5380: 74 79 2c 20 73 6f 20 65 61 63 68 20 68 61 73 20  ty, so each has 
5390: 74 6f 20 62 65 20 73 6d 61 6c 6c 65 72 20 74 68  to be smaller th
53a0: 61 6e 20 74 68 65 0a 09 23 20 20 20 74 6f 74 61  an the..#   tota
53b0: 6c 2e 0a 09 23 20 2a 20 54 68 65 20 75 6e 69 6f  l...# * The unio
53c0: 6e 20 6f 66 20 74 68 65 20 66 72 61 67 6d 65 6e  n of the fragmen
53d0: 74 73 20 68 61 73 20 74 6f 20 62 65 20 74 68 65  ts has to be the
53e0: 20 69 74 65 6d 20 73 65 74 20 6f 66 20 74 68 65   item set of the
53f0: 0a 09 23 20 20 20 63 68 61 6e 67 65 73 65 74 2e  ..#   changeset.
5400: 0a 09 23 20 2a 20 54 68 65 20 66 72 61 67 6d 65  ..# * The fragme
5410: 6e 74 20 6d 75 73 74 20 6e 6f 74 20 6f 76 65 72  nt must not over
5420: 6c 61 70 2c 20 69 2e 65 2e 20 74 68 65 69 72 20  lap, i.e. their 
5430: 70 61 69 72 77 69 73 65 0a 09 23 20 20 20 69 6e  pairwise..#   in
5440: 74 65 72 73 65 63 74 69 6f 6e 73 20 68 61 76 65  tersections have
5450: 20 74 6f 20 62 65 20 65 6d 70 74 79 2e 0a 0a 09   to be empty....
5460: 73 65 74 20 63 6f 76 65 72 20 7b 7d 0a 09 66 6f  set cover {}..fo
5470: 72 65 61 63 68 20 66 72 61 67 6d 65 6e 74 69 74  reach fragmentit
5480: 65 6d 73 20 24 66 72 61 67 6d 65 6e 74 73 20 7b  ems $fragments {
5490: 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20  ..    log write 
54a0: 38 20 63 73 65 74 73 20 7b 4e 45 57 3a 20 5b 6c  8 csets {NEW: [l
54b0: 73 6f 72 74 20 24 66 72 61 67 6d 65 6e 74 69 74  sort $fragmentit
54c0: 65 6d 73 5d 7d 0a 0a 09 20 20 20 20 69 6e 74 65  ems]}...    inte
54d0: 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 0a 09  grity assert {..
54e0: 09 21 5b 73 74 72 75 63 74 3a 3a 73 65 74 20 65  .![struct::set e
54f0: 6d 70 74 79 20 24 66 72 61 67 6d 65 6e 74 69 74  mpty $fragmentit
5500: 65 6d 73 5d 0a 09 20 20 20 20 7d 20 7b 63 68 61  ems]..    } {cha
5510: 6e 67 65 73 65 74 20 66 72 61 67 6d 65 6e 74 20  ngeset fragment 
5520: 69 73 20 65 6d 70 74 79 7d 0a 0a 09 20 20 20 20  is empty}...    
5530: 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74  integrity assert
5540: 20 7b 0a 09 09 5b 73 74 72 75 63 74 3a 3a 73 65   {...[struct::se
5550: 74 20 73 75 62 73 65 74 6f 66 20 24 66 72 61 67  t subsetof $frag
5560: 6d 65 6e 74 69 74 65 6d 73 20 5b 24 63 73 65 74  mentitems [$cset
5570: 20 69 74 65 6d 73 5d 5d 0a 09 20 20 20 20 7d 20   items]]..    } 
5580: 7b 63 68 61 6e 67 65 73 65 74 20 66 72 61 67 6d  {changeset fragm
5590: 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 73 75 62  ent is not a sub
55a0: 73 65 74 7d 0a 09 20 20 20 20 73 74 72 75 63 74  set}..    struct
55b0: 3a 3a 73 65 74 20 61 64 64 20 63 6f 76 65 72 20  ::set add cover 
55c0: 24 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 0a 09  $fragmentitems..
55d0: 7d 0a 0a 09 69 6e 74 65 67 72 69 74 79 20 61 73  }...integrity as
55e0: 73 65 72 74 20 7b 0a 09 20 20 20 20 5b 73 74 72  sert {..    [str
55f0: 75 63 74 3a 3a 73 65 74 20 65 71 75 61 6c 20 24  uct::set equal $
5600: 63 6f 76 65 72 20 5b 24 63 73 65 74 20 69 74 65  cover [$cset ite
5610: 6d 73 5d 5d 0a 09 20 7d 20 7b 54 68 65 20 66 72  ms]].. } {The fr
5620: 61 67 6d 65 6e 74 73 20 64 6f 20 6e 6f 74 20 63  agments do not c
5630: 6f 76 65 72 20 74 68 65 20 6f 72 69 67 69 6e 61  over the origina
5640: 6c 20 63 68 61 6e 67 65 73 65 74 7d 0a 0a 09 73  l changeset}...s
5650: 65 74 20 69 20 31 0a 09 66 6f 72 65 61 63 68 20  et i 1..foreach 
5660: 66 69 61 20 24 66 72 61 67 6d 65 6e 74 73 20 7b  fia $fragments {
5670: 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 66 69  ..    foreach fi
5680: 62 20 5b 6c 72 61 6e 67 65 20 24 66 72 61 67 6d  b [lrange $fragm
5690: 65 6e 74 73 20 24 69 20 65 6e 64 5d 20 7b 0a 09  ents $i end] {..
56a0: 09 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72  .integrity asser
56b0: 74 20 7b 0a 09 09 20 20 20 20 5b 73 74 72 75 63  t {...    [struc
56c0: 74 3a 3a 73 65 74 20 65 6d 70 74 79 20 5b 73 74  t::set empty [st
56d0: 72 75 63 74 3a 3a 73 65 74 20 69 6e 74 65 72 73  ruct::set inters
56e0: 65 63 74 20 24 66 69 61 20 24 66 69 62 5d 5d 0a  ect $fia $fib]].
56f0: 09 09 7d 20 7b 54 68 65 20 66 72 61 67 6d 65 6e  ..} {The fragmen
5700: 74 73 20 3c 24 66 69 61 3e 20 61 6e 64 20 3c 24  ts <$fia> and <$
5710: 66 69 62 3e 20 6f 76 65 72 6c 61 70 7d 0a 09 20  fib> overlap}.. 
5720: 20 20 20 7d 0a 09 20 20 20 20 69 6e 63 72 20 69     }..    incr i
5730: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 0a 20 20 20  ..}...return.   
5740: 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23   }..    # # ## #
5750: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
5760: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  # #############.
5770: 20 20 20 20 23 23 20 53 74 61 74 65 0a 0a 20 20      ## State..  
5780: 20 20 76 61 72 69 61 62 6c 65 20 6d 79 69 64 20    variable myid 
5790: 20 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 49 64         {} ; # Id
57a0: 20 6f 66 20 74 68 65 20 63 73 65 74 20 66 6f 72   of the cset for
57b0: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 0a   the persistent.
57c0: 09 09 09 20 20 20 20 20 20 23 20 73 74 61 74 65  ...      # state
57d0: 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d  ..    variable m
57e0: 79 70 72 6f 6a 65 63 74 20 20 20 7b 7d 20 3b 20  yproject   {} ; 
57f0: 23 20 52 65 66 65 72 65 6e 63 65 20 6f 66 20 74  # Reference of t
5800: 68 65 20 70 72 6f 6a 65 63 74 20 6f 62 6a 65 63  he project objec
5810: 74 20 74 68 65 0a 09 09 09 20 20 20 20 20 20 23  t the....      #
5820: 20 63 68 61 6e 67 65 73 65 74 20 62 65 6c 6f 6e   changeset belon
5830: 67 73 20 74 6f 2e 0a 20 20 20 20 76 61 72 69 61  gs to..    varia
5840: 62 6c 65 20 6d 79 74 79 70 65 20 20 20 20 20 20  ble mytype      
5850: 7b 7d 20 3b 20 23 20 57 68 61 74 20 74 68 65 20  {} ; # What the 
5860: 63 68 61 6e 67 65 73 65 74 20 69 73 20 62 61 73  changeset is bas
5870: 65 64 20 6f 6e 0a 09 09 09 20 20 20 20 20 20 23  ed on....      #
5880: 20 28 72 65 76 69 73 69 6f 6e 73 2c 20 74 61 67   (revisions, tag
5890: 73 2c 20 6f 72 20 62 72 61 6e 63 68 65 73 29 2e  s, or branches).
58a0: 0a 09 09 09 20 20 20 20 20 20 23 20 56 61 6c 75  ....      # Valu
58b0: 65 73 3a 20 53 65 65 20 6d 79 63 73 74 79 70 65  es: See mycstype
58c0: 2e 20 4e 6f 74 65 20 74 68 61 74 20 77 65 0a 09  . Note that we..
58d0: 09 09 20 20 20 20 20 20 23 20 68 61 76 65 20 74  ..      # have t
58e0: 6f 20 6b 65 65 70 20 74 68 65 20 6e 61 6d 65 73  o keep the names
58f0: 20 6f 66 20 74 68 65 20 68 65 6c 70 65 72 0a 09   of the helper..
5900: 09 09 20 20 20 20 20 20 23 20 73 69 6e 67 6c 65  ..      # single
5910: 74 6f 6e 73 20 69 6e 20 73 79 6e 63 20 77 69 74  tons in sync wit
5920: 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73 0a 09  h the contents..
5930: 09 09 20 20 20 20 20 20 23 20 6f 66 20 73 74 61  ..      # of sta
5940: 74 65 20 74 61 62 6c 65 20 27 63 73 74 79 70 65  te table 'cstype
5950: 27 2c 20 61 6e 64 20 76 61 72 69 6f 75 73 0a 09  ', and various..
5960: 09 09 20 20 20 20 20 20 23 20 6f 74 68 65 72 20  ..      # other 
5970: 70 6c 61 63 65 73 20 75 73 69 6e 67 20 74 68 65  places using the
5980: 6d 20 68 61 72 64 77 69 72 65 64 2e 0a 20 20 20  m hardwired..   
5990: 20 76 61 72 69 61 62 6c 65 20 6d 79 74 79 70 65   variable mytype
59a0: 6f 62 6a 20 20 20 7b 7d 20 3b 20 23 20 52 65 66  obj   {} ; # Ref
59b0: 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20 63 6f  erence to the co
59c0: 6e 74 61 69 6e 65 72 20 66 6f 72 20 74 68 65 0a  ntainer for the.
59d0: 09 09 09 20 20 20 20 20 20 23 20 74 79 70 65 20  ...      # type 
59e0: 64 65 70 65 6e 64 65 6e 74 20 63 6f 64 65 2e 20  dependent code. 
59f0: 44 65 72 69 76 65 64 20 66 72 6f 6d 0a 09 09 09  Derived from....
5a00: 20 20 20 20 20 20 23 20 6d 79 74 79 70 65 2e 0a        # mytype..
5a10: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 73      variable mys
5a20: 72 63 69 64 20 20 20 20 20 7b 7d 20 3b 20 23 20  rcid     {} ; # 
5a30: 49 64 20 6f 66 20 74 68 65 20 6d 65 74 61 64 61  Id of the metada
5a40: 74 61 20 6f 72 20 73 79 6d 62 6f 6c 20 74 68 65  ta or symbol the
5a50: 20 63 73 65 74 0a 09 09 09 20 20 20 20 20 20 23   cset....      #
5a60: 20 69 73 20 62 61 73 65 64 20 6f 6e 2e 0a 20 20   is based on..  
5a70: 20 20 76 61 72 69 61 62 6c 65 20 6d 79 69 74 65    variable myite
5a80: 6d 73 20 20 20 20 20 7b 7d 20 3b 20 23 20 4c 69  ms     {} ; # Li
5a90: 73 74 20 6f 66 20 74 68 65 20 66 69 6c 65 20 6c  st of the file l
5aa0: 65 76 65 6c 20 72 65 76 69 73 69 6f 6e 73 2c 0a  evel revisions,.
5ab0: 09 09 09 20 20 20 20 20 20 23 20 74 61 67 73 2c  ...      # tags,
5ac0: 20 6f 72 20 62 72 61 6e 63 68 65 73 20 69 6e 20   or branches in 
5ad0: 74 68 65 20 63 73 65 74 2c 20 61 73 0a 09 09 09  the cset, as....
5ae0: 20 20 20 20 20 20 23 20 69 64 73 2e 20 4e 6f 74        # ids. Not
5af0: 20 74 61 67 67 65 64 2e 0a 20 20 20 20 76 61 72   tagged..    var
5b00: 69 61 62 6c 65 20 6d 79 74 69 74 65 6d 73 20 20  iable mytitems  
5b10: 20 20 7b 7d 20 3b 20 23 20 41 73 20 6d 79 69 74    {} ; # As myit
5b20: 65 6d 73 2c 20 74 68 65 20 74 61 67 67 65 64 20  ems, the tagged 
5b30: 66 6f 72 6d 2e 0a 20 20 20 20 76 61 72 69 61 62  form..    variab
5b40: 6c 65 20 6d 79 70 6f 73 20 20 20 20 20 20 20 7b  le mypos       {
5b50: 7d 20 3b 20 23 20 43 6f 6d 6d 69 74 20 70 6f 73  } ; # Commit pos
5b60: 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63 68 61  ition of the cha
5b70: 6e 67 65 73 65 74 2c 20 69 66 0a 09 09 09 20 20  ngeset, if....  
5b80: 20 20 20 20 23 20 6b 6e 6f 77 6e 2e 0a 0a 20 20      # known...  
5b90: 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23    # # ## ### ###
5ba0: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23  ## ######## ####
5bb0: 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23  #########.    ##
5bc0: 20 49 6e 74 65 72 6e 61 6c 20 6d 65 74 68 6f 64   Internal method
5bd0: 73 0a 0a 20 20 20 20 74 79 70 65 76 61 72 69 61  s..    typevaria
5be0: 62 6c 65 20 6d 79 63 6f 75 6e 74 65 72 20 20 20  ble mycounter   
5bf0: 20 20 20 20 20 30 20 3b 20 23 20 49 64 20 63 6f       0 ; # Id co
5c00: 75 6e 74 65 72 20 66 6f 72 20 63 73 65 74 73 2e  unter for csets.
5c10: 20 4c 61 73 74 20 69 64 0a 09 09 09 09 20 20 20   Last id.....   
5c20: 20 20 20 23 20 75 73 65 64 2e 0a 20 20 20 20 74     # used..    t
5c30: 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 73  ypevariable mycs
5c40: 74 79 70 65 20 2d 61 72 72 61 79 20 7b 7d 20 3b  type -array {} ;
5c50: 20 23 20 4d 61 70 20 63 73 74 79 70 65 73 20 28   # Map cstypes (
5c60: 6e 61 6d 65 73 29 20 74 6f 20 70 65 72 73 69 73  names) to persis
5c70: 74 65 6e 74 0a 09 09 09 09 20 20 20 20 20 20 23  tent.....      #
5c80: 20 69 64 73 2e 20 4e 6f 74 65 20 74 68 61 74 20   ids. Note that 
5c90: 77 65 20 68 61 76 65 20 74 6f 20 6b 65 65 70 0a  we have to keep.
5ca0: 09 09 09 09 20 20 20 20 20 20 23 20 74 68 65 20  ....      # the 
5cb0: 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 74 61 62  names in the tab
5cc0: 6c 65 20 27 63 73 74 79 70 65 27 0a 09 09 09 09  le 'cstype'.....
5cd0: 20 20 20 20 20 20 23 20 69 6e 20 73 79 6e 63 20        # in sync 
5ce0: 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73 20 6f  with the names o
5cf0: 66 20 74 68 65 0a 09 09 09 09 20 20 20 20 20 20  f the.....      
5d00: 23 20 68 65 6c 70 65 72 20 73 69 6e 67 6c 65 74  # helper singlet
5d10: 6f 6e 73 2e 0a 0a 20 20 20 20 74 79 70 65 6d 65  ons...    typeme
5d20: 74 68 6f 64 20 69 6e 6f 72 64 65 72 20 7b 70 72  thod inorder {pr
5d30: 6f 6a 65 63 74 69 64 7d 20 7b 0a 09 23 20 52 65  ojectid} {..# Re
5d40: 74 75 72 6e 20 61 6c 6c 20 72 65 76 69 73 69 6f  turn all revisio
5d50: 6e 20 63 68 61 6e 67 65 73 65 74 73 20 66 6f 72  n changesets for
5d60: 20 74 68 65 20 73 70 65 63 69 66 69 65 64 20 70   the specified p
5d70: 72 6f 6a 65 63 74 2c 20 69 6e 0a 09 23 20 74 68  roject, in..# th
5d80: 65 20 6f 72 64 65 72 20 67 69 76 65 6e 20 74 6f  e order given to
5d90: 20 74 68 65 6d 20 62 79 20 74 68 65 20 73 6f 72   them by the sor
5da0: 74 20 70 61 73 73 65 73 2e 20 42 6f 74 68 20 74  t passes. Both t
5db0: 68 65 0a 09 23 20 66 69 6c 74 65 72 69 6e 67 20  he..# filtering 
5dc0: 62 79 20 70 72 6f 6a 65 63 74 20 61 6e 64 20 73  by project and s
5dd0: 6f 72 74 69 6e 67 20 6d 61 6b 65 20 75 73 65 20  orting make use 
5de0: 6f 66 20 27 70 72 6f 6a 65 63 74 3a 3a 72 65 76  of 'project::rev
5df0: 0a 09 23 20 72 65 76 27 20 69 6d 70 6f 73 73 69  ..# rev' impossi
5e00: 62 6c 65 2e 0a 0a 09 73 65 74 20 72 65 73 20 7b  ble....set res {
5e10: 7d 0a 09 66 6f 72 65 61 63 68 20 7b 63 69 64 20  }..foreach {cid 
5e20: 63 64 61 74 65 7d 20 5b 73 74 61 74 65 20 72 75  cdate} [state ru
5e30: 6e 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20  n {..    SELECT 
5e40: 43 2e 63 69 64 2c 20 54 2e 64 61 74 65 0a 09 20  C.cid, T.date.. 
5e50: 20 20 20 46 52 4f 4d 20 20 20 63 68 61 6e 67 65     FROM   change
5e60: 73 65 74 20 43 2c 20 63 73 74 69 6d 65 73 74 61  set C, cstimesta
5e70: 6d 70 20 54 0a 09 20 20 20 20 57 48 45 52 45 20  mp T..    WHERE 
5e80: 20 43 2e 74 79 70 65 20 3d 20 30 20 20 20 20 20   C.type = 0     
5e90: 20 20 20 20 20 2d 2d 20 6c 69 6d 69 74 20 74 6f       -- limit to
5ea0: 20 72 65 76 69 73 69 6f 6e 20 63 68 61 6e 67 65   revision change
5eb0: 73 65 74 73 0a 09 20 20 20 20 41 4e 44 20 20 20  sets..    AND   
5ec0: 20 43 2e 70 69 64 20 20 3d 20 24 70 72 6f 6a 65   C.pid  = $proje
5ed0: 63 74 69 64 20 2d 2d 20 6c 69 6d 69 74 20 74 6f  ctid -- limit to
5ee0: 20 63 68 61 6e 67 65 73 65 74 73 20 69 6e 20 70   changesets in p
5ef0: 72 6f 6a 65 63 74 0a 09 20 20 20 20 41 4e 44 20  roject..    AND 
5f00: 20 20 20 54 2e 63 69 64 20 20 3d 20 43 2e 63 69     T.cid  = C.ci
5f10: 64 20 20 20 20 20 20 2d 2d 20 67 65 74 20 6f 72  d      -- get or
5f20: 64 65 72 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  dering informati
5f30: 6f 6e 0a 09 20 20 20 20 4f 52 44 45 52 20 42 59  on..    ORDER BY
5f40: 20 54 2e 64 61 74 65 20 20 20 20 20 20 20 20 20   T.date         
5f50: 20 20 20 2d 2d 20 73 6f 72 74 20 69 6e 74 6f 20     -- sort into 
5f60: 63 6f 6d 6d 69 74 20 6f 72 64 65 72 0a 09 7d 5d  commit order..}]
5f70: 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20   {..    lappend 
5f80: 72 65 73 20 24 6d 79 69 64 6d 61 70 28 24 63 69  res $myidmap($ci
5f90: 64 29 20 24 63 64 61 74 65 0a 09 7d 0a 09 72 65  d) $cdate..}..re
5fa0: 74 75 72 6e 20 24 72 65 73 0a 20 20 20 20 7d 0a  turn $res.    }.
5fb0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
5fc0: 67 65 74 63 73 74 79 70 65 73 20 7b 7d 20 7b 0a  getcstypes {} {.
5fd0: 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20 6e 61  .foreach {tid na
5fe0: 6d 65 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 7b  me} [state run {
5ff0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 74 69 64  ..    SELECT tid
6000: 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 63 73 74 79  , name FROM csty
6010: 70 65 3b 0a 09 7d 5d 20 7b 20 73 65 74 20 6d 79  pe;..}] { set my
6020: 63 73 74 79 70 65 28 24 6e 61 6d 65 29 20 24 74  cstype($name) $t
6030: 69 64 20 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20  id }..return.   
6040: 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68   }..    typemeth
6050: 6f 64 20 6c 6f 61 64 20 7b 72 65 70 6f 73 69 74  od load {reposit
6060: 6f 72 79 7d 20 7b 0a 09 73 65 74 20 6e 20 30 0a  ory} {..set n 0.
6070: 09 6c 6f 67 20 77 72 69 74 65 20 32 20 63 73 65  .log write 2 cse
6080: 74 73 20 7b 4c 6f 61 64 69 6e 67 20 74 68 65 20  ts {Loading the 
6090: 63 68 61 6e 67 65 73 65 74 73 7d 0a 09 66 6f 72  changesets}..for
60a0: 65 61 63 68 20 7b 69 64 20 70 69 64 20 63 73 74  each {id pid cst
60b0: 79 70 65 20 73 72 63 69 64 7d 20 5b 73 74 61 74  ype srcid} [stat
60c0: 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c  e run {..    SEL
60d0: 45 43 54 20 43 2e 63 69 64 2c 20 43 2e 70 69 64  ECT C.cid, C.pid
60e0: 2c 20 43 53 2e 6e 61 6d 65 2c 20 43 2e 73 72 63  , CS.name, C.src
60f0: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 63 68 61  ..    FROM   cha
6100: 6e 67 65 73 65 74 20 43 2c 20 63 73 74 79 70 65  ngeset C, cstype
6110: 20 43 53 0a 09 20 20 20 20 57 48 45 52 45 20 20   CS..    WHERE  
6120: 43 2e 74 79 70 65 20 3d 20 43 53 2e 74 69 64 0a  C.type = CS.tid.
6130: 09 20 20 20 20 4f 52 44 45 52 20 42 59 20 43 2e  .    ORDER BY C.
6140: 63 69 64 0a 09 7d 5d 20 7b 0a 09 20 20 20 20 6c  cid..}] {..    l
6150: 6f 67 20 70 72 6f 67 72 65 73 73 20 32 20 63 73  og progress 2 cs
6160: 65 74 73 20 24 6e 20 7b 7d 0a 09 20 20 20 20 73  ets $n {}..    s
6170: 65 74 20 72 20 5b 24 74 79 70 65 20 25 41 55 54  et r [$type %AUT
6180: 4f 25 20 5b 24 72 65 70 6f 73 69 74 6f 72 79 20  O% [$repository 
6190: 70 72 6f 6a 65 63 74 6f 66 20 24 70 69 64 5d 20  projectof $pid] 
61a0: 24 63 73 74 79 70 65 20 24 73 72 63 69 64 20 5b  $cstype $srcid [
61b0: 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 53 45  state run {...SE
61c0: 4c 45 43 54 20 43 2e 69 69 64 0a 09 09 46 52 4f  LECT C.iid...FRO
61d0: 4d 20 20 20 63 73 69 74 65 6d 20 43 0a 09 09 57  M   csitem C...W
61e0: 48 45 52 45 20 20 43 2e 63 69 64 20 3d 20 24 69  HERE  C.cid = $i
61f0: 64 0a 09 09 4f 52 44 45 52 20 42 59 20 43 2e 70  d...ORDER BY C.p
6200: 6f 73 0a 09 20 20 20 20 7d 5d 20 24 69 64 5d 0a  os..    }] $id].
6210: 09 20 20 20 20 24 72 20 6c 6f 61 64 6d 61 70 73  .    $r loadmaps
6220: 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d 0a  ..    incr n..}.
6230: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
6240: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c 6f     typemethod lo
6250: 61 64 63 6f 75 6e 74 65 72 20 7b 7d 20 7b 0a 09  adcounter {} {..
6260: 23 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65  # Initialize the
6270: 20 63 6f 75 6e 74 65 72 20 66 72 6f 6d 20 74 68   counter from th
6280: 65 20 73 74 61 74 65 0a 09 6c 6f 67 20 77 72 69  e state..log wri
6290: 74 65 20 32 20 63 73 65 74 73 20 7b 4c 6f 61 64  te 2 csets {Load
62a0: 69 6e 67 20 63 68 61 6e 67 65 73 65 74 20 63 6f  ing changeset co
62b0: 75 6e 74 65 72 7d 0a 09 73 65 74 20 6d 79 63 6f  unter}..set myco
62c0: 75 6e 74 65 72 20 5b 73 74 61 74 65 20 6f 6e 65  unter [state one
62d0: 20 7b 20 53 45 4c 45 43 54 20 4d 41 58 28 63 69   { SELECT MAX(ci
62e0: 64 29 20 46 52 4f 4d 20 63 68 61 6e 67 65 73 65  d) FROM changese
62f0: 74 20 7d 5d 0a 09 72 65 74 75 72 6e 0a 20 20 20  t }]..return.   
6300: 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68   }..    typemeth
6310: 6f 64 20 6e 75 6d 20 7b 7d 20 7b 20 72 65 74 75  od num {} { retu
6320: 72 6e 20 24 6d 79 63 6f 75 6e 74 65 72 20 7d 0a  rn $mycounter }.
6330: 0a 20 20 20 20 70 72 6f 63 20 49 6e 69 74 69 61  .    proc Initia
6340: 6c 69 7a 65 42 72 65 61 6b 53 74 61 74 65 20 7b  lizeBreakState {
6350: 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70  revisions} {..up
6360: 76 61 72 20 31 20 70 6f 73 20 70 6f 73 20 63 72  var 1 pos pos cr
6370: 6f 73 73 20 63 72 6f 73 73 20 72 61 6e 67 65 20  oss cross range 
6380: 72 61 6e 67 65 20 64 65 70 63 20 64 65 70 63 20  range depc depc 
6390: 64 65 6c 74 61 20 64 65 6c 74 61 20 5c 0a 09 20  delta delta \.. 
63a0: 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20     dependencies 
63b0: 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 0a 09 23  dependencies...#
63c0: 20 46 69 72 73 74 20 77 65 20 63 72 65 61 74 65   First we create
63d0: 20 61 20 6d 61 70 20 6f 66 20 70 6f 73 69 74 69   a map of positi
63e0: 6f 6e 73 20 74 6f 20 6d 61 6b 65 20 69 74 20 65  ons to make it e
63f0: 61 73 69 65 72 20 74 6f 0a 09 23 20 64 65 74 65  asier to..# dete
6400: 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 61 20  rmine whether a 
6410: 64 65 70 65 6e 64 65 6e 63 79 20 63 72 6f 73 73  dependency cross
6420: 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72 20  es a particular 
6430: 69 6e 64 65 78 2e 0a 0a 09 61 72 72 61 79 20 73  index....array s
6440: 65 74 20 70 6f 73 20 20 20 7b 7d 0a 09 61 72 72  et pos   {}..arr
6450: 61 79 20 73 65 74 20 63 72 6f 73 73 20 7b 7d 0a  ay set cross {}.
6460: 09 61 72 72 61 79 20 73 65 74 20 64 65 70 63 20  .array set depc 
6470: 20 7b 7d 0a 09 73 65 74 20 72 61 6e 67 65 20 20   {}..set range  
6480: 20 20 20 20 20 7b 7d 0a 09 73 65 74 20 6e 20 30       {}..set n 0
6490: 0a 09 66 6f 72 65 61 63 68 20 72 65 76 20 24 72  ..foreach rev $r
64a0: 65 76 69 73 69 6f 6e 73 20 7b 0a 09 20 20 20 20  evisions {..    
64b0: 6c 61 70 70 65 6e 64 20 72 61 6e 67 65 20 24 6e  lappend range $n
64c0: 0a 09 20 20 20 20 73 65 74 20 70 6f 73 28 24 72  ..    set pos($r
64d0: 65 76 29 20 24 6e 0a 09 20 20 20 20 73 65 74 20  ev) $n..    set 
64e0: 63 72 6f 73 73 28 24 6e 29 20 30 0a 09 20 20 20  cross($n) 0..   
64f0: 20 69 6e 63 72 20 6e 0a 09 7d 0a 0a 09 23 20 53   incr n..}...# S
6500: 65 63 6f 6e 64 6c 79 20 77 65 20 63 6f 75 6e 74  econdly we count
6510: 20 74 68 65 20 63 72 6f 73 73 69 6e 67 73 20 70   the crossings p
6520: 65 72 20 70 6f 73 69 74 69 6f 6e 2c 20 62 79 20  er position, by 
6530: 69 74 65 72 61 74 69 6e 67 0a 09 23 20 6f 76 65  iterating..# ove
6540: 72 20 74 68 65 20 72 65 63 6f 72 64 65 64 20 69  r the recorded i
6550: 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e  nternal dependen
6560: 63 69 65 73 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20  cies....# Note: 
6570: 49 66 20 74 68 65 20 74 69 6d 65 73 74 61 6d 70  If the timestamp
6580: 73 20 61 72 65 20 62 61 64 6c 79 20 6f 75 74 20  s are badly out 
6590: 6f 66 20 6f 72 64 65 72 20 69 74 20 69 73 0a 09  of order it is..
65a0: 23 20 20 20 20 20 20 20 70 6f 73 73 69 62 6c 65  #       possible
65b0: 20 74 6f 20 68 61 76 65 20 61 20 62 61 63 6b 77   to have a backw
65c0: 61 72 64 20 73 75 63 63 65 73 73 6f 72 20 64 65  ard successor de
65d0: 70 65 6e 64 65 6e 63 79 2c 0a 09 23 20 20 20 20  pendency,..#    
65e0: 20 20 20 69 2e 65 2e 20 77 69 74 68 20 73 74 61     i.e. with sta
65f0: 72 74 20 3e 20 65 6e 64 2e 20 57 65 20 6d 61 79  rt > end. We may
6600: 20 68 61 76 65 20 74 6f 20 73 77 61 70 20 74 68   have to swap th
6610: 65 20 69 6e 64 69 63 65 73 0a 09 23 20 20 20 20  e indices..#    
6620: 20 20 20 74 6f 20 65 6e 73 75 72 65 20 74 68 61     to ensure tha
6630: 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  t the following 
6640: 6c 6f 6f 70 20 72 75 6e 73 20 63 6f 72 72 65 63  loop runs correc
6650: 74 6c 79 2e 0a 09 23 0a 09 23 20 4e 6f 74 65 20  tly...#..# Note 
6660: 32 3a 20 73 74 61 72 74 20 3d 3d 20 65 6e 64 20  2: start == end 
6670: 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65 2e  is not possible.
6680: 20 49 74 20 69 6e 64 69 63 61 74 65 73 20 61 0a   It indicates a.
6690: 09 23 20 20 20 20 20 20 20 20 20 73 65 6c 66 2d  .#         self-
66a0: 64 65 70 65 6e 64 65 6e 63 79 20 64 75 65 20 74  dependency due t
66b0: 6f 20 74 68 65 20 75 6e 69 71 75 65 6e 65 73 73  o the uniqueness
66c0: 20 6f 66 20 70 6f 73 69 74 69 6f 6e 73 2c 0a 09   of positions,..
66d0: 23 20 20 20 20 20 20 20 20 20 61 6e 64 20 74 68  #         and th
66e0: 61 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  at is something 
66f0: 77 65 20 68 61 76 65 20 72 75 6c 65 64 20 6f 75  we have ruled ou
6700: 74 20 61 6c 72 65 61 64 79 2c 20 73 65 65 0a 09  t already, see..
6710: 23 20 20 20 20 20 20 20 20 20 27 72 65 76 20 69  #         'rev i
6720: 6e 74 65 72 6e 61 6c 73 75 63 63 65 73 73 6f 72  nternalsuccessor
6730: 73 27 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72  s'....foreach {r
6740: 69 64 20 63 68 69 6c 64 72 65 6e 7d 20 5b 61 72  id children} [ar
6750: 72 61 79 20 67 65 74 20 64 65 70 65 6e 64 65 6e  ray get dependen
6760: 63 69 65 73 5d 20 7b 0a 09 20 20 20 20 66 6f 72  cies] {..    for
6770: 65 61 63 68 20 63 68 69 6c 64 20 24 63 68 69 6c  each child $chil
6780: 64 72 65 6e 20 7b 0a 09 09 73 65 74 20 64 6b 65  dren {...set dke
6790: 79 20 20 20 20 5b 6c 69 73 74 20 24 72 69 64 20  y    [list $rid 
67a0: 24 63 68 69 6c 64 5d 0a 09 09 73 65 74 20 73 74  $child]...set st
67b0: 61 72 74 20 20 20 24 70 6f 73 28 24 72 69 64 29  art   $pos($rid)
67c0: 0a 09 09 73 65 74 20 65 6e 64 20 20 20 20 20 24  ...set end     $
67d0: 70 6f 73 28 24 63 68 69 6c 64 29 0a 09 09 73 65  pos($child)...se
67e0: 74 20 63 72 6f 73 73 65 73 20 7b 7d 0a 0a 09 09  t crosses {}....
67f0: 69 66 20 7b 24 73 74 61 72 74 20 3e 20 24 65 6e  if {$start > $en
6800: 64 7d 20 7b 0a 09 09 20 20 20 20 77 68 69 6c 65  d} {...    while
6810: 20 7b 24 65 6e 64 20 3c 20 24 73 74 61 72 74 7d   {$end < $start}
6820: 20 7b 0a 09 09 09 6c 61 70 70 65 6e 64 20 63 72   {....lappend cr
6830: 6f 73 73 65 73 20 24 65 6e 64 0a 09 09 09 69 6e  osses $end....in
6840: 63 72 20 63 72 6f 73 73 28 24 65 6e 64 29 0a 09  cr cross($end)..
6850: 09 09 69 6e 63 72 20 65 6e 64 0a 09 09 20 20 20  ..incr end...   
6860: 20 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09   }...} else {...
6870: 20 20 20 20 77 68 69 6c 65 20 7b 24 73 74 61 72      while {$star
6880: 74 20 3c 20 24 65 6e 64 7d 20 7b 0a 09 09 09 6c  t < $end} {....l
6890: 61 70 70 65 6e 64 20 63 72 6f 73 73 65 73 20 24  append crosses $
68a0: 73 74 61 72 74 0a 09 09 09 69 6e 63 72 20 63 72  start....incr cr
68b0: 6f 73 73 28 24 73 74 61 72 74 29 0a 09 09 09 69  oss($start)....i
68c0: 6e 63 72 20 73 74 61 72 74 0a 09 09 20 20 20 20  ncr start...    
68d0: 7d 0a 09 09 7d 0a 09 09 73 65 74 20 64 65 70 63  }...}...set depc
68e0: 28 24 64 6b 65 79 29 20 24 63 72 6f 73 73 65 73  ($dkey) $crosses
68f0: 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 49 6e 69  ..    }..}...Ini
6900: 74 69 61 6c 69 7a 65 44 65 6c 74 61 73 20 24 72  tializeDeltas $r
6910: 65 76 69 73 69 6f 6e 73 0a 09 72 65 74 75 72 6e  evisions..return
6920: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63  .    }..    proc
6930: 20 49 6e 69 74 69 61 6c 69 7a 65 44 65 6c 74 61   InitializeDelta
6940: 73 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a  s {revisions} {.
6950: 09 75 70 76 61 72 20 31 20 64 65 6c 74 61 20 64  .upvar 1 delta d
6960: 65 6c 74 61 0a 0a 09 23 20 50 75 6c 6c 20 74 68  elta...# Pull th
6970: 65 20 74 69 6d 65 73 74 61 6d 70 73 20 66 6f 72  e timestamps for
6980: 20 61 6c 6c 20 72 65 76 69 73 69 6f 6e 73 20 69   all revisions i
6990: 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 73  n the changesets
69a0: 20 61 6e 64 0a 09 23 20 63 6f 6d 70 75 74 65 20   and..# compute 
69b0: 74 68 65 69 72 20 64 65 6c 74 61 73 20 66 6f 72  their deltas for
69c0: 20 75 73 65 20 62 79 20 74 68 65 20 62 72 65 61   use by the brea
69d0: 6b 20 66 69 6e 64 65 72 2e 0a 0a 09 61 72 72 61  k finder....arra
69e0: 79 20 73 65 74 20 64 65 6c 74 61 20 7b 7d 0a 09  y set delta {}..
69f0: 61 72 72 61 79 20 73 65 74 20 73 74 61 6d 70 20  array set stamp 
6a00: 7b 7d 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20  {}...set theset 
6a10: 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f  ('[join $revisio
6a20: 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66 6f 72  ns {','}]')..for
6a30: 65 61 63 68 20 7b 72 69 64 20 74 69 6d 65 7d 20  each {rid time} 
6a40: 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73  [state run [subs
6a50: 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e  t -nocommands -n
6a60: 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09  obackslashes {..
6a70: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64      SELECT R.rid
6a80: 2c 20 52 2e 64 61 74 65 0a 09 20 20 20 20 46 52  , R.date..    FR
6a90: 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20  OM revision R.. 
6aa0: 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 49     WHERE R.rid I
6ab0: 4e 20 24 74 68 65 73 65 74 0a 09 7d 5d 5d 20 7b  N $theset..}]] {
6ac0: 0a 09 20 20 20 20 73 65 74 20 73 74 61 6d 70 28  ..    set stamp(
6ad0: 24 72 69 64 29 20 24 74 69 6d 65 0a 09 7d 0a 0a  $rid) $time..}..
6ae0: 09 73 65 74 20 6e 20 30 0a 09 66 6f 72 65 61 63  .set n 0..foreac
6af0: 68 20 72 69 64 20 5b 6c 72 61 6e 67 65 20 24 72  h rid [lrange $r
6b00: 65 76 69 73 69 6f 6e 73 20 30 20 65 6e 64 2d 31  evisions 0 end-1
6b10: 5d 20 72 6e 65 78 74 20 5b 6c 72 61 6e 67 65 20  ] rnext [lrange 
6b20: 24 72 65 76 69 73 69 6f 6e 73 20 31 20 65 6e 64  $revisions 1 end
6b30: 5d 20 7b 0a 09 20 20 20 20 73 65 74 20 64 65 6c  ] {..    set del
6b40: 74 61 28 24 6e 29 20 5b 65 78 70 72 20 7b 24 73  ta($n) [expr {$s
6b50: 74 61 6d 70 28 24 72 6e 65 78 74 29 20 2d 20 24  tamp($rnext) - $
6b60: 73 74 61 6d 70 28 24 72 69 64 29 7d 5d 0a 09 20  stamp($rid)}].. 
6b70: 20 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 09 72 65     incr n..}..re
6b80: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
6b90: 70 72 6f 63 20 46 69 6e 64 42 65 73 74 42 72 65  proc FindBestBre
6ba0: 61 6b 20 7b 72 61 6e 67 65 7d 20 7b 0a 09 75 70  ak {range} {..up
6bb0: 76 61 72 20 31 20 63 72 6f 73 73 20 63 72 6f 73  var 1 cross cros
6bc0: 73 20 64 65 6c 74 61 20 64 65 6c 74 61 0a 0a 09  s delta delta...
6bd0: 23 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  # Determine the 
6be0: 62 65 73 74 20 62 72 65 61 6b 20 6c 6f 63 61 74  best break locat
6bf0: 69 6f 6e 20 69 6e 20 74 68 65 20 67 69 76 65 6e  ion in the given
6c00: 20 72 61 6e 67 65 20 6f 66 0a 09 23 20 70 6f 73   range of..# pos
6c10: 69 74 69 6f 6e 73 2e 20 46 69 72 73 74 20 77 65  itions. First we
6c20: 20 6c 6f 6f 6b 20 66 6f 72 20 74 68 65 20 6c 6f   look for the lo
6c30: 63 61 74 69 6f 6e 73 20 77 69 74 68 20 74 68 65  cations with the
6c40: 20 6d 61 78 69 6d 61 6c 0a 09 23 20 6e 75 6d 62   maximal..# numb
6c50: 65 72 20 6f 66 20 63 72 6f 73 73 69 6e 67 73 2e  er of crossings.
6c60: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73 65   If there are se
6c70: 76 65 72 61 6c 20 77 65 20 6c 6f 6f 6b 20 66 6f  veral we look fo
6c80: 72 20 74 68 65 0a 09 23 20 73 68 6f 72 74 65 73  r the..# shortes
6c90: 74 20 74 69 6d 65 20 69 6e 74 65 72 76 61 6c 20  t time interval 
6ca0: 61 6d 6f 6e 67 20 74 68 65 6d 2e 20 49 66 20 77  among them. If w
6cb0: 65 20 73 74 69 6c 6c 20 68 61 76 65 20 6d 75 6c  e still have mul
6cc0: 74 69 70 6c 65 0a 09 23 20 70 6f 73 73 69 62 69  tiple..# possibi
6cd0: 6c 69 74 69 65 73 20 61 66 74 65 72 20 74 68 61  lities after tha
6ce0: 74 20 77 65 20 73 65 6c 65 63 74 20 74 68 65 20  t we select the 
6cf0: 65 61 72 6c 69 65 73 74 20 6c 6f 63 61 74 69 6f  earliest locatio
6d00: 6e 0a 09 23 20 61 6d 6f 6e 67 20 74 68 65 73 65  n..# among these
6d10: 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 49 66 20 74  ....# Note: If t
6d20: 68 65 20 6d 61 78 69 6d 61 6c 20 6e 75 6d 62 65  he maximal numbe
6d30: 72 20 6f 66 20 63 72 6f 73 73 69 6e 67 73 20 69  r of crossings i
6d40: 73 20 30 20 74 68 65 6e 20 74 68 65 20 72 61 6e  s 0 then the ran
6d50: 67 65 0a 09 23 20 20 20 20 20 20 20 68 61 73 20  ge..#       has 
6d60: 6e 6f 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65  no internal depe
6d70: 6e 64 65 6e 63 69 65 73 2c 20 61 6e 64 20 6e 6f  ndencies, and no
6d80: 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20   break location 
6d90: 61 74 0a 09 23 20 20 20 20 20 20 20 61 6c 6c 2e  at..#       all.
6da0: 20 54 68 69 73 20 70 6f 73 73 69 62 69 6c 69 74   This possibilit
6db0: 79 20 69 73 20 73 69 67 6e 61 6c 65 64 20 76 69  y is signaled vi
6dc0: 61 20 72 65 73 75 6c 74 20 2d 31 2e 0a 0a 09 23  a result -1....#
6dd0: 20 4e 6f 74 65 3a 20 41 20 72 61 6e 67 65 20 6f   Note: A range o
6de0: 66 20 6c 65 6e 67 74 68 20 31 20 6f 72 20 6c 65  f length 1 or le
6df0: 73 73 20 63 61 6e 6e 6f 74 20 68 61 76 65 20 69  ss cannot have i
6e00: 6e 74 65 72 6e 61 6c 0a 09 23 20 20 20 20 20 20  nternal..#      
6e10: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61   dependencies, a
6e20: 73 20 74 68 61 74 20 6e 65 65 64 73 20 61 74 20  s that needs at 
6e30: 6c 65 61 73 74 20 74 77 6f 20 72 65 76 69 73 69  least two revisi
6e40: 6f 6e 73 20 69 6e 0a 09 23 20 20 20 20 20 20 20  ons in..#       
6e50: 74 68 65 20 72 61 6e 67 65 2e 0a 0a 09 69 66 20  the range....if 
6e60: 7b 5b 6c 6c 65 6e 67 74 68 20 24 72 61 6e 67 65  {[llength $range
6e70: 5d 20 3c 20 32 7d 20 7b 20 72 65 74 75 72 6e 20  ] < 2} { return 
6e80: 2d 31 20 7d 0a 0a 09 73 65 74 20 6d 61 78 20 2d  -1 }...set max -
6e90: 31 0a 09 73 65 74 20 62 65 73 74 20 7b 7d 0a 0a  1..set best {}..
6ea0: 09 66 6f 72 65 61 63 68 20 6c 6f 63 61 74 69 6f  .foreach locatio
6eb0: 6e 20 24 72 61 6e 67 65 20 7b 0a 09 20 20 20 20  n $range {..    
6ec0: 73 65 74 20 63 72 6f 73 73 69 6e 67 73 20 24 63  set crossings $c
6ed0: 72 6f 73 73 28 24 6c 6f 63 61 74 69 6f 6e 29 0a  ross($location).
6ee0: 09 20 20 20 20 69 66 20 7b 24 63 72 6f 73 73 69  .    if {$crossi
6ef0: 6e 67 73 20 3e 20 24 6d 61 78 7d 20 7b 0a 09 09  ngs > $max} {...
6f00: 73 65 74 20 6d 61 78 20 20 24 63 72 6f 73 73 69  set max  $crossi
6f10: 6e 67 73 0a 09 09 73 65 74 20 62 65 73 74 20 5b  ngs...set best [
6f20: 6c 69 73 74 20 24 6c 6f 63 61 74 69 6f 6e 5d 0a  list $location].
6f30: 09 09 63 6f 6e 74 69 6e 75 65 0a 09 20 20 20 20  ..continue..    
6f40: 7d 20 65 6c 73 65 69 66 20 7b 24 63 72 6f 73 73  } elseif {$cross
6f50: 69 6e 67 73 20 3d 3d 20 24 6d 61 78 7d 20 7b 0a  ings == $max} {.
6f60: 09 09 6c 61 70 70 65 6e 64 20 62 65 73 74 20 24  ..lappend best $
6f70: 6c 6f 63 61 74 69 6f 6e 0a 09 20 20 20 20 7d 0a  location..    }.
6f80: 09 7d 0a 0a 09 69 66 20 7b 24 6d 61 78 20 3d 3d  .}...if {$max ==
6f90: 20 30 7d 20 20 20 20 20 20 20 20 20 20 20 20 7b   0}            {
6fa0: 20 72 65 74 75 72 6e 20 2d 31 20 7d 0a 09 69 66   return -1 }..if
6fb0: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 62 65 73 74   {[llength $best
6fc0: 5d 20 3d 3d 20 31 7d 20 7b 20 72 65 74 75 72 6e  ] == 1} { return
6fd0: 20 5b 6c 69 6e 64 65 78 20 24 62 65 73 74 20 30   [lindex $best 0
6fe0: 5d 20 7d 0a 0a 09 73 65 74 20 6c 6f 63 61 74 69  ] }...set locati
6ff0: 6f 6e 73 20 24 62 65 73 74 0a 09 73 65 74 20 62  ons $best..set b
7000: 65 73 74 20 7b 7d 0a 09 73 65 74 20 6d 69 6e 20  est {}..set min 
7010: 2d 31 0a 0a 09 66 6f 72 65 61 63 68 20 6c 6f 63  -1...foreach loc
7020: 61 74 69 6f 6e 20 24 6c 6f 63 61 74 69 6f 6e 73  ation $locations
7030: 20 7b 0a 09 20 20 20 20 73 65 74 20 69 6e 74 65   {..    set inte
7040: 72 76 61 6c 20 24 64 65 6c 74 61 28 24 6c 6f 63  rval $delta($loc
7050: 61 74 69 6f 6e 29 0a 09 20 20 20 20 69 66 20 7b  ation)..    if {
7060: 28 24 6d 69 6e 20 3c 20 30 29 20 7c 7c 20 28 24  ($min < 0) || ($
7070: 69 6e 74 65 72 76 61 6c 20 3c 20 24 6d 69 6e 29  interval < $min)
7080: 7d 20 7b 0a 09 09 73 65 74 20 6d 69 6e 20 20 24  } {...set min  $
7090: 69 6e 74 65 72 76 61 6c 0a 09 09 73 65 74 20 62  interval...set b
70a0: 65 73 74 20 5b 6c 69 73 74 20 24 6c 6f 63 61 74  est [list $locat
70b0: 69 6f 6e 5d 0a 09 20 20 20 20 7d 20 65 6c 73 65  ion]..    } else
70c0: 69 66 20 7b 24 69 6e 74 65 72 76 61 6c 20 3d 3d  if {$interval ==
70d0: 20 24 6d 69 6e 7d 20 7b 0a 09 09 6c 61 70 70 65   $min} {...lappe
70e0: 6e 64 20 62 65 73 74 20 24 6c 6f 63 61 74 69 6f  nd best $locatio
70f0: 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66  n..    }..}...if
7100: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 62 65 73 74   {[llength $best
7110: 5d 20 3d 3d 20 31 7d 20 7b 20 72 65 74 75 72 6e  ] == 1} { return
7120: 20 5b 6c 69 6e 64 65 78 20 24 62 65 73 74 20 30   [lindex $best 0
7130: 5d 20 7d 0a 0a 09 72 65 74 75 72 6e 20 5b 6c 69  ] }...return [li
7140: 6e 64 65 78 20 5b 6c 73 6f 72 74 20 2d 69 6e 74  ndex [lsort -int
7150: 65 67 65 72 20 2d 69 6e 63 72 65 61 73 69 6e 67  eger -increasing
7160: 20 24 62 65 73 74 5d 20 30 5d 0a 20 20 20 20 7d   $best] 0].    }
7170: 0a 0a 20 20 20 20 70 72 6f 63 20 43 75 74 41 74  ..    proc CutAt
7180: 20 7b 6c 6f 63 61 74 69 6f 6e 7d 20 7b 0a 09 75   {location} {..u
7190: 70 76 61 72 20 31 20 63 72 6f 73 73 20 63 72 6f  pvar 1 cross cro
71a0: 73 73 20 64 65 70 63 20 64 65 70 63 0a 0a 09 23  ss depc depc...#
71b0: 20 49 74 20 77 61 73 20 64 65 63 69 64 65 64 20   It was decided 
71c0: 74 6f 20 73 70 6c 69 74 20 74 68 65 20 63 68 61  to split the cha
71d0: 6e 67 65 73 65 74 20 61 74 20 74 68 65 20 67 69  ngeset at the gi
71e0: 76 65 6e 0a 09 23 20 6c 6f 63 61 74 69 6f 6e 2e  ven..# location.
71f0: 20 54 68 69 73 20 63 75 74 73 20 61 20 6e 75 6d   This cuts a num
7200: 62 65 72 20 6f 66 20 64 65 70 65 6e 64 65 6e 63  ber of dependenc
7210: 69 65 73 2e 20 48 65 72 65 20 77 65 20 75 70 64  ies. Here we upd
7220: 61 74 65 0a 09 23 20 74 68 65 20 63 72 6f 73 73  ate..# the cross
7230: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20   information so 
7240: 74 68 61 74 20 74 68 65 20 62 72 65 61 6b 20 66  that the break f
7250: 69 6e 64 65 72 20 68 61 73 20 61 63 63 75 72 61  inder has accura
7260: 74 65 0a 09 23 20 64 61 74 61 20 77 68 65 6e 20  te..# data when 
7270: 77 65 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20 67  we look at the g
7280: 65 6e 65 72 61 74 65 64 20 66 72 61 67 6d 65 6e  enerated fragmen
7290: 74 73 2e 0a 0a 09 73 65 74 20 73 69 78 20 5b 6c  ts....set six [l
72a0: 6f 67 20 76 69 73 69 62 6c 65 3f 20 36 5d 0a 0a  og visible? 6]..
72b0: 09 66 6f 72 65 61 63 68 20 7b 64 65 70 20 72 61  .foreach {dep ra
72c0: 6e 67 65 7d 20 5b 61 72 72 61 79 20 67 65 74 20  nge} [array get 
72d0: 64 65 70 63 5d 20 7b 0a 09 20 20 20 20 23 20 43  depc] {..    # C
72e0: 68 65 63 6b 20 61 6c 6c 20 64 65 70 65 6e 64 65  heck all depende
72f0: 6e 63 69 65 73 20 73 74 69 6c 6c 20 6b 6e 6f 77  ncies still know
7300: 6e 2c 20 74 61 6b 65 20 74 68 65 69 72 20 72 61  n, take their ra
7310: 6e 67 65 20 61 6e 64 0a 09 20 20 20 20 23 20 73  nge and..    # s
7320: 65 65 20 69 66 20 74 68 65 20 62 72 65 61 6b 20  ee if the break 
7330: 6c 6f 63 61 74 69 6f 6e 20 66 61 6c 6c 73 20 77  location falls w
7340: 69 74 68 69 6e 2e 0a 0a 09 20 20 20 20 42 6f 72  ithin....    Bor
7350: 64 65 72 20 24 72 61 6e 67 65 20 73 20 65 0a 09  der $range s e..
7360: 20 20 20 20 69 66 20 7b 24 6c 6f 63 61 74 69 6f      if {$locatio
7370: 6e 20 3c 20 24 73 7d 20 63 6f 6e 74 69 6e 75 65  n < $s} continue
7380: 20 3b 20 23 20 62 72 65 61 6b 20 62 65 66 6f 72   ; # break befor
7390: 65 20 72 61 6e 67 65 2c 20 69 67 6e 6f 72 65 0a  e range, ignore.
73a0: 09 20 20 20 20 69 66 20 7b 24 6c 6f 63 61 74 69  .    if {$locati
73b0: 6f 6e 20 3e 20 24 65 7d 20 63 6f 6e 74 69 6e 75  on > $e} continu
73c0: 65 20 3b 20 23 20 62 72 65 61 6b 20 61 66 74 65  e ; # break afte
73d0: 72 20 72 61 6e 67 65 2c 20 69 67 6e 6f 72 65 2e  r range, ignore.
73e0: 0a 0a 09 20 20 20 20 23 20 54 68 69 73 20 64 65  ...    # This de
73f0: 70 65 6e 64 65 6e 63 79 20 63 72 6f 73 73 65 73  pendency crosses
7400: 20 74 68 65 20 62 72 65 61 6b 20 6c 6f 63 61 74   the break locat
7410: 69 6f 6e 2e 20 57 65 20 72 65 6d 6f 76 65 20 69  ion. We remove i
7420: 74 0a 09 20 20 20 20 23 20 66 72 6f 6d 20 74 68  t..    # from th
7430: 65 20 63 72 6f 73 73 69 6e 67 73 20 63 6f 75 6e  e crossings coun
7440: 74 65 72 73 2c 20 61 6e 64 20 74 68 65 6e 20 61  ters, and then a
7450: 6c 73 6f 20 66 72 6f 6d 20 74 68 65 20 73 65 74  lso from the set
7460: 0a 09 20 20 20 20 23 20 6f 66 20 6b 6e 6f 77 6e  ..    # of known
7470: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61   dependencies, a
7480: 73 20 77 65 20 61 72 65 20 64 6f 6e 65 20 77 69  s we are done wi
7490: 74 68 20 69 74 2e 0a 0a 09 20 20 20 20 66 6f 72  th it....    for
74a0: 65 61 63 68 20 6c 6f 63 20 24 64 65 70 63 28 24  each loc $depc($
74b0: 64 65 70 29 20 7b 20 69 6e 63 72 20 63 72 6f 73  dep) { incr cros
74c0: 73 28 24 6c 6f 63 29 20 2d 31 20 7d 0a 09 20 20  s($loc) -1 }..  
74d0: 20 20 75 6e 73 65 74 20 64 65 70 63 28 24 64 65    unset depc($de
74e0: 70 29 0a 0a 09 20 20 20 20 69 66 20 7b 21 24 73  p)...    if {!$s
74f0: 69 78 7d 20 63 6f 6e 74 69 6e 75 65 0a 0a 09 20  ix} continue... 
7500: 20 20 20 73 74 72 75 63 74 3a 3a 6c 69 73 74 20     struct::list 
7510: 61 73 73 69 67 6e 20 24 64 65 70 20 70 61 72 65  assign $dep pare
7520: 6e 74 20 63 68 69 6c 64 0a 09 20 20 20 20 6c 6f  nt child..    lo
7530: 67 20 77 72 69 74 65 20 35 20 63 73 65 74 73 20  g write 5 csets 
7540: 22 42 72 6f 6b 65 20 64 65 70 65 6e 64 65 6e 63  "Broke dependenc
7550: 79 20 5b 50 44 20 24 70 61 72 65 6e 74 5d 20 2d  y [PD $parent] -
7560: 2d 3e 20 5b 50 44 20 24 63 68 69 6c 64 5d 22 0a  -> [PD $child]".
7570: 09 7d 0a 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  .}...return.    
7580: 7d 0a 0a 20 20 20 20 23 20 50 72 69 6e 74 20 69  }..    # Print i
7590: 64 65 6e 74 69 66 79 69 6e 67 20 64 61 74 61 20  dentifying data 
75a0: 66 6f 72 20 61 20 72 65 76 69 73 69 6f 6e 20 28  for a revision (
75b0: 70 72 6f 6a 65 63 74 2c 20 66 69 6c 65 2c 20 64  project, file, d
75c0: 6f 74 74 65 64 20 72 65 76 0a 20 20 20 20 23 20  otted rev.    # 
75d0: 6e 75 6d 62 65 72 29 2c 20 66 6f 72 20 68 69 67  number), for hig
75e0: 68 20 76 65 72 62 6f 73 69 74 79 20 6c 6f 67 20  h verbosity log 
75f0: 6f 75 74 70 75 74 2e 0a 20 20 20 20 23 20 54 4f  output..    # TO
7600: 44 4f 3a 20 52 65 70 6c 61 63 65 20 77 69 74 68  DO: Replace with
7610: 20 63 61 6c 6c 20 74 6f 20 69 74 65 6d 73 74 72   call to itemstr
7620: 20 28 6c 69 73 74 20 72 65 76 20 24 69 64 29 0a   (list rev $id).
7630: 0a 20 20 20 20 70 72 6f 63 20 50 44 20 7b 69 64  .    proc PD {id
7640: 7d 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b 70 20  } {..foreach {p 
7650: 66 20 72 7d 20 5b 73 74 61 74 65 20 72 75 6e 20  f r} [state run 
7660: 7b 0a 09 09 53 45 4c 45 43 54 20 50 2e 6e 61 6d  {...SELECT P.nam
7670: 65 20 2c 20 46 2e 6e 61 6d 65 2c 20 52 2e 72 65  e , F.name, R.re
7680: 76 0a 09 09 46 52 4f 4d 20 72 65 76 69 73 69 6f  v...FROM revisio
7690: 6e 20 52 2c 20 66 69 6c 65 20 46 2c 20 70 72 6f  n R, file F, pro
76a0: 6a 65 63 74 20 50 0a 09 09 57 48 45 52 45 20 52  ject P...WHERE R
76b0: 2e 72 69 64 20 3d 20 24 69 64 20 20 20 20 2d 2d  .rid = $id    --
76c0: 20 46 69 6e 64 20 73 70 65 63 69 66 69 65 64 20   Find specified 
76d0: 66 69 6c 65 20 72 65 76 69 73 69 6f 6e 0a 09 09  file revision...
76e0: 41 4e 44 20 20 20 46 2e 66 69 64 20 3d 20 52 2e  AND   F.fid = R.
76f0: 66 69 64 20 20 2d 2d 20 47 65 74 20 66 69 6c 65  fid  -- Get file
7700: 20 6f 66 20 74 68 65 20 72 65 76 69 73 69 6f 6e   of the revision
7710: 0a 09 09 41 4e 44 20 20 20 50 2e 70 69 64 20 3d  ...AND   P.pid =
7720: 20 46 2e 70 69 64 20 20 2d 2d 20 47 65 74 20 70   F.pid  -- Get p
7730: 72 6f 6a 65 63 74 20 6f 66 20 74 68 65 20 66 69  roject of the fi
7740: 6c 65 2e 0a 09 7d 5d 20 62 72 65 61 6b 0a 09 72  le...}] break..r
7750: 65 74 75 72 6e 20 22 27 24 70 20 3a 20 24 66 2f  eturn "'$p : $f/
7760: 24 72 27 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20  $r'".    }..    
7770: 23 20 50 72 69 6e 74 69 6e 67 20 6f 6e 65 20 6f  # Printing one o
7780: 72 20 6d 6f 72 65 20 72 61 6e 67 65 73 2c 20 66  r more ranges, f
7790: 6f 72 6d 61 74 74 65 64 2c 20 61 6e 64 20 6f 6e  ormatted, and on
77a0: 6c 79 20 74 68 65 69 72 20 62 6f 72 64 65 72 20  ly their border 
77b0: 74 6f 0a 20 20 20 20 23 20 6b 65 65 70 20 74 68  to.    # keep th
77c0: 65 20 73 74 72 69 6e 67 73 20 73 68 6f 72 74 2e  e strings short.
77d0: 0a 0a 20 20 20 20 70 72 6f 63 20 50 52 73 20 7b  ..    proc PRs {
77e0: 72 61 6e 67 65 73 7d 20 7b 0a 09 72 65 74 75 72  ranges} {..retur
77f0: 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20  n [struct::list 
7800: 6d 61 70 20 24 72 61 6e 67 65 73 20 5b 6d 79 70  map $ranges [myp
7810: 72 6f 63 20 50 52 5d 5d 0a 20 20 20 20 7d 0a 0a  roc PR]].    }..
7820: 20 20 20 20 70 72 6f 63 20 50 52 20 7b 72 61 6e      proc PR {ran
7830: 67 65 7d 20 7b 0a 09 42 6f 72 64 65 72 20 24 72  ge} {..Border $r
7840: 61 6e 67 65 20 73 20 65 0a 09 72 65 74 75 72 6e  ange s e..return
7850: 20 3c 24 7b 73 7d 2e 2e 2e 24 7b 65 7d 3e 0a 20   <${s}...${e}>. 
7860: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 42     }..    proc B
7870: 6f 72 64 65 72 20 7b 72 61 6e 67 65 20 73 76 20  order {range sv 
7880: 65 76 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24  ev} {..upvar 1 $
7890: 73 76 20 73 20 24 65 76 20 65 0a 09 73 65 74 20  sv s $ev e..set 
78a0: 73 20 5b 6c 69 6e 64 65 78 20 24 72 61 6e 67 65  s [lindex $range
78b0: 20 30 5d 0a 09 73 65 74 20 65 20 5b 6c 69 6e 64   0]..set e [lind
78c0: 65 78 20 24 72 61 6e 67 65 20 65 6e 64 5d 0a 09  ex $range end]..
78d0: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20  return.    }..  
78e0: 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23    # # ## ### ###
78f0: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23  ## ######## ####
7900: 23 23 23 23 23 23 23 23 23 0a 0a 20 20 20 20 74  #########..    t
7910: 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 68  ypevariable mych
7920: 61 6e 67 65 73 65 74 73 20 20 20 20 20 20 20 20  angesets        
7930: 20 7b 7d 20 3b 20 23 20 4c 69 73 74 20 6f 66 20   {} ; # List of 
7940: 61 6c 6c 20 6b 6e 6f 77 6e 0a 09 09 09 09 09 20  all known...... 
7950: 20 20 23 20 63 68 61 6e 67 65 73 65 74 73 2e 0a    # changesets..
7960: 0a 20 20 20 20 23 20 4c 69 73 74 20 6f 66 20 61  .    # List of a
7970: 6c 6c 20 6b 6e 6f 77 6e 20 63 68 61 6e 67 65 73  ll known changes
7980: 65 74 73 20 6f 66 20 61 20 74 79 70 65 2e 0a 20  ets of a type.. 
7990: 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20     typevariable 
79a0: 6d 79 74 63 68 61 6e 67 65 73 65 74 73 20 2d 61  mytchangesets -a
79b0: 72 72 61 79 20 7b 0a 09 73 79 6d 3a 3a 62 72 61  rray {..sym::bra
79c0: 6e 63 68 20 7b 7d 0a 09 73 79 6d 3a 3a 74 61 67  nch {}..sym::tag
79d0: 20 20 20 20 7b 7d 0a 09 72 65 76 20 20 20 20 20      {}..rev     
79e0: 20 20 20 20 7b 7d 0a 20 20 20 20 7d 0a 09 09 09      {}.    }....
79f0: 09 09 0a 20 20 20 20 74 79 70 65 76 61 72 69 61  ...    typevaria
7a00: 62 6c 65 20 6d 79 69 74 65 6d 6d 61 70 20 20 20  ble myitemmap   
7a10: 20 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20    -array {} ; # 
7a20: 4d 61 70 20 66 72 6f 6d 20 69 74 65 6d 73 20 28  Map from items (
7a30: 74 61 67 67 65 64 29 0a 09 09 09 09 09 20 20 20  tagged)......   
7a40: 23 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66  # to the list of
7a50: 20 63 68 61 6e 67 65 73 65 74 73 0a 09 09 09 09   changesets.....
7a60: 09 20 20 20 23 20 63 6f 6e 74 61 69 6e 69 6e 67  .   # containing
7a70: 20 69 74 2e 20 45 61 63 68 20 69 74 65 6d 0a 09   it. Each item..
7a80: 09 09 09 09 20 20 20 23 20 63 61 6e 20 62 65 20  ....   # can be 
7a90: 75 73 65 64 20 62 79 20 6f 6e 6c 79 20 6f 6e 65  used by only one
7aa0: 0a 09 09 09 09 09 20 20 20 23 20 63 68 61 6e 67  ......   # chang
7ab0: 65 73 65 74 2e 0a 20 20 20 20 74 79 70 65 76 61  eset..    typeva
7ac0: 72 69 61 62 6c 65 20 6d 79 69 64 6d 61 70 20 20  riable myidmap  
7ad0: 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d   -array {} ; # M
7ae0: 61 70 20 66 72 6f 6d 20 63 68 61 6e 67 65 73 65  ap from changese
7af0: 74 20 69 64 20 74 6f 0a 09 09 09 09 20 20 20 20  t id to.....    
7b00: 20 20 20 23 20 63 68 61 6e 67 65 73 65 74 2e 0a     # changeset..
7b10: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
7b20: 61 6c 6c 20 20 20 20 7b 7d 20 20 20 20 7b 20 72  all    {}    { r
7b30: 65 74 75 72 6e 20 24 6d 79 63 68 61 6e 67 65 73  eturn $mychanges
7b40: 65 74 73 20 7d 0a 20 20 20 20 74 79 70 65 6d 65  ets }.    typeme
7b50: 74 68 6f 64 20 6f 66 20 20 20 20 20 7b 63 69 64  thod of     {cid
7b60: 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 64  } { return $myid
7b70: 6d 61 70 28 24 63 69 64 29 20 7d 0a 20 20 20 20  map($cid) }.    
7b80: 23 74 79 70 65 6d 65 74 68 6f 64 20 6f 66 69 74  #typemethod ofit
7b90: 65 6d 20 7b 69 69 64 7d 20 7b 20 72 65 74 75 72  em {iid} { retur
7ba0: 6e 20 24 6d 79 69 74 65 6d 6d 61 70 28 24 69 69  n $myitemmap($ii
7bb0: 64 29 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65  d) }..    typeme
7bc0: 74 68 6f 64 20 72 65 76 20 20 20 20 7b 7d 20 20  thod rev    {}  
7bd0: 20 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 74 63    { return $mytc
7be0: 68 61 6e 67 65 73 65 74 73 28 72 65 76 29 20 7d  hangesets(rev) }
7bf0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
7c00: 73 79 6d 20 20 20 20 7b 7d 20 20 20 20 7b 20 72  sym    {}    { r
7c10: 65 74 75 72 6e 20 5b 63 6f 6e 63 61 74 20 5c 0a  eturn [concat \.
7c20: 09 09 09 09 09 20 20 24 7b 6d 79 74 63 68 61 6e  .....  ${mytchan
7c30: 67 65 73 65 74 73 28 73 79 6d 3a 3a 62 72 61 6e  gesets(sym::bran
7c40: 63 68 29 7d 20 5c 0a 09 09 09 09 09 20 20 24 7b  ch)} \......  ${
7c50: 6d 79 74 63 68 61 6e 67 65 73 65 74 73 28 73 79  mytchangesets(sy
7c60: 6d 3a 3a 74 61 67 29 7d 5d 20 7d 0a 0a 20 20 20  m::tag)}] }..   
7c70: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23   # # ## ### ####
7c80: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
7c90: 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20  ########.    ## 
7ca0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a 20  Configuration.. 
7cb0: 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79     pragma -hasty
7cc0: 70 65 69 6e 66 6f 20 20 20 20 6e 6f 20 20 3b 20  peinfo    no  ; 
7cd0: 23 20 6e 6f 20 74 79 70 65 20 69 6e 74 72 6f 73  # no type intros
7ce0: 70 65 63 74 69 6f 6e 0a 20 20 20 20 70 72 61 67  pection.    prag
7cf0: 6d 61 20 2d 68 61 73 69 6e 66 6f 20 20 20 20 20  ma -hasinfo     
7d00: 20 20 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 6f 62     no  ; # no ob
7d10: 6a 65 63 74 20 69 6e 74 72 6f 73 70 65 63 74 69  ject introspecti
7d20: 6f 6e 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23  on..    # # ## #
7d30: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
7d40: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  # #############.
7d50: 7d 0a 0a 23 23 0a 23 23 20 4e 4f 54 45 3a 20 54  }..##.## NOTE: T
7d60: 68 65 20 73 75 63 63 65 73 73 6f 72 20 61 6e 64  he successor and
7d70: 20 70 72 65 64 65 63 65 73 73 6f 72 20 6d 65 74   predecessor met
7d80: 68 6f 64 73 20 64 65 66 69 6e 65 64 20 62 79 20  hods defined by 
7d90: 74 68 65 20 63 6c 61 73 73 65 73 0a 23 23 20 20  the classes.##  
7da0: 20 20 20 20 20 62 65 6c 6f 77 20 61 72 65 20 2d       below are -
7db0: 2d 20 62 6f 74 74 6c 65 20 6e 65 63 6b 73 20 2d  - bottle necks -
7dc0: 2d 2e 20 4c 6f 6f 6b 20 66 6f 72 20 77 61 79 73  -. Look for ways
7dd0: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 53 51 4c   to make the SQL
7de0: 0a 23 23 20 20 20 20 20 20 20 66 61 73 74 65 72  .##       faster
7df0: 2e 0a 23 23 0a 0a 23 20 23 20 23 23 20 23 23 23  ..##..# # ## ###
7e00: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20   ##### ######## 
7e10: 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23  ############# ##
7e20: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7e30: 23 23 23 0a 23 23 20 48 65 6c 70 65 72 20 73 69  ###.## Helper si
7e40: 6e 67 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64  ngleton. Command
7e50: 73 20 66 6f 72 20 72 65 76 69 73 69 6f 6e 20 63  s for revision c
7e60: 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e 69 74  hangesets...snit
7e70: 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f 73  ::type ::vc::fos
7e80: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73  sil::import::cvs
7e90: 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a  ::project::rev::
7ea0: 72 65 76 20 7b 0a 20 20 20 20 74 79 70 65 6d 65  rev {.    typeme
7eb0: 74 68 6f 64 20 62 79 72 65 76 69 73 69 6f 6e 20  thod byrevision 
7ec0: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a  {} { return 1 }.
7ed0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62      typemethod b
7ee0: 79 73 79 6d 62 6f 6c 20 20 20 7b 7d 20 7b 20 72  ysymbol   {} { r
7ef0: 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79  eturn 0 }.    ty
7f00: 70 65 6d 65 74 68 6f 64 20 69 73 74 61 67 20 20  pemethod istag  
7f10: 20 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20      {} { return 
7f20: 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68  0 }.    typemeth
7f30: 6f 64 20 69 73 62 72 61 6e 63 68 20 20 20 7b 7d  od isbranch   {}
7f40: 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 0a 20   { return 0 }.. 
7f50: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 73 74     typemethod st
7f60: 72 20 7b 72 65 76 69 73 69 6f 6e 7d 20 7b 0a 09  r {revision} {..
7f70: 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73  struct::list ass
7f80: 69 67 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 7b  ign [state run {
7f90: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
7fa0: 65 76 2c 20 46 2e 6e 61 6d 65 2c 20 50 2e 6e 61  ev, F.name, P.na
7fb0: 6d 65 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72  me..    FROM   r
7fc0: 65 76 69 73 69 6f 6e 20 52 2c 20 66 69 6c 65 20  evision R, file 
7fd0: 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09 20 20  F, project P..  
7fe0: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 3d    WHERE  R.rid =
7ff0: 20 24 72 65 76 69 73 69 6f 6e 20 2d 2d 20 46 69   $revision -- Fi
8000: 6e 64 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  nd specified fil
8010: 65 20 72 65 76 69 73 69 6f 6e 0a 09 20 20 20 20  e revision..    
8020: 41 4e 44 20 20 20 20 46 2e 66 69 64 20 3d 20 52  AND    F.fid = R
8030: 2e 66 69 64 20 20 20 20 20 2d 2d 20 47 65 74 20  .fid     -- Get 
8040: 66 69 6c 65 20 6f 66 20 74 68 65 20 72 65 76 69  file of the revi
8050: 73 69 6f 6e 0a 09 20 20 20 20 41 4e 44 20 20 20  sion..    AND   
8060: 20 50 2e 70 69 64 20 3d 20 46 2e 70 69 64 20 20   P.pid = F.pid  
8070: 20 20 20 2d 2d 20 47 65 74 20 70 72 6f 6a 65 63     -- Get projec
8080: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 09  t of the file...
8090: 7d 5d 20 72 65 76 6e 72 20 66 6e 61 6d 65 20 70  }] revnr fname p
80a0: 6e 61 6d 65 0a 09 72 65 74 75 72 6e 20 22 24 70  name..return "$p
80b0: 6e 61 6d 65 2f 24 7b 72 65 76 6e 72 7d 3a 3a 24  name/${revnr}::$
80c0: 66 6e 61 6d 65 22 0a 20 20 20 20 7d 0a 0a 20 20  fname".    }..  
80d0: 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73    # result = lis
80e0: 74 20 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74  t (mintime, maxt
80f0: 69 6d 65 29 0a 20 20 20 20 74 79 70 65 6d 65 74  ime).    typemet
8100: 68 6f 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 69  hod timerange {i
8110: 74 65 6d 73 7d 20 7b 0a 09 73 65 74 20 74 68 65  tems} {..set the
8120: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 69 74 65  set ('[join $ite
8130: 6d 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74  ms {','}]')..ret
8140: 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 5b  urn [state run [
8150: 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64  subst -nocommand
8160: 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73  s -nobackslashes
8170: 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 4d   {..    SELECT M
8180: 49 4e 28 52 2e 64 61 74 65 29 2c 20 4d 41 58 28  IN(R.date), MAX(
8190: 52 2e 64 61 74 65 29 0a 09 20 20 20 20 46 52 4f  R.date)..    FRO
81a0: 4d 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20  M revision R..  
81b0: 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 49 4e    WHERE R.rid IN
81c0: 20 24 74 68 65 73 65 74 20 2d 2d 20 52 65 73 74   $theset -- Rest
81d0: 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e  rict to revision
81e0: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 7d  s of interest..}
81f0: 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  ]].    }..    # 
8200: 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20 28  var(dv) = dict (
8210: 72 65 76 69 73 69 6f 6e 20 2d 3e 20 6c 69 73 74  revision -> list
8220: 20 28 72 65 76 69 73 69 6f 6e 29 29 0a 20 20 20   (revision)).   
8230: 20 74 79 70 65 6d 65 74 68 6f 64 20 69 6e 74 65   typemethod inte
8240: 72 6e 61 6c 73 75 63 63 65 73 73 6f 72 73 20 7b  rnalsuccessors {
8250: 64 76 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a  dv revisions} {.
8260: 09 75 70 76 61 72 20 31 20 24 64 76 20 64 65 70  .upvar 1 $dv dep
8270: 65 6e 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74  endencies..set t
8280: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72  heset ('[join $r
8290: 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27  evisions {','}]'
82a0: 29 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 31 34  )...log write 14
82b0: 20 63 73 65 74 20 69 6e 74 65 72 6e 61 6c 73 75   cset internalsu
82c0: 63 63 65 73 73 6f 72 73 0a 0a 09 23 20 53 65 65  ccessors...# See
82d0: 20 27 73 75 63 63 65 73 73 6f 72 73 27 20 62 65   'successors' be
82e0: 6c 6f 77 20 66 6f 72 20 74 68 65 20 6d 61 69 6e  low for the main
82f0: 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 0a   explanation of.
8300: 09 23 20 74 68 65 20 76 61 72 69 6f 75 73 20 63  .# the various c
8310: 61 73 65 73 2e 20 54 68 69 73 20 70 69 65 63 65  ases. This piece
8320: 20 69 73 20 73 70 65 63 69 61 6c 20 69 6e 20 74   is special in t
8330: 68 61 74 20 69 74 0a 09 23 20 72 65 73 74 72 69  hat it..# restri
8340: 63 74 73 20 74 68 65 20 73 75 63 63 65 73 73 6f  cts the successo
8350: 72 73 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74  rs we look for t
8360: 6f 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f  o the same set o
8370: 66 0a 09 23 20 72 65 76 69 73 69 6f 6e 73 20 77  f..# revisions w
8380: 65 20 73 74 61 72 74 20 66 72 6f 6d 2e 20 53 65  e start from. Se
8390: 6e 73 69 62 6c 65 20 61 73 20 77 65 20 61 72 65  nsible as we are
83a0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 0a 09 23 20   looking for..# 
83b0: 63 68 61 6e 67 65 73 65 74 20 69 6e 74 65 72 6e  changeset intern
83c0: 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e  al dependencies.
83d0: 0a 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 70  ...array set dep
83e0: 20 7b 7d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72   {}...foreach {r
83f0: 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65  id child} [state
8400: 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63   run [subst -noc
8410: 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73  ommands -nobacks
8420: 6c 61 73 68 65 73 20 7b 0a 20 20 20 20 2d 2d 20  lashes {.    -- 
8430: 28 31 29 20 50 72 69 6d 61 72 79 20 63 68 69 6c  (1) Primary chil
8440: 64 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e  d..    SELECT R.
8450: 72 69 64 2c 20 52 2e 63 68 69 6c 64 0a 09 20 20  rid, R.child..  
8460: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f    FROM   revisio
8470: 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 20  n R..    WHERE  
8480: 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73  R.rid   IN $thes
8490: 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69  et     -- Restri
84a0: 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20  ct to revisions 
84b0: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20  of interest..   
84c0: 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20   AND    R.child 
84d0: 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d  IS NOT NULL    -
84e0: 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 68  - Has primary ch
84f0: 69 6c 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20  ild..    AND    
8500: 52 2e 63 68 69 6c 64 20 49 4e 20 24 74 68 65 73  R.child IN $thes
8510: 65 74 20 20 20 20 20 2d 2d 20 57 68 69 63 68 20  et     -- Which 
8520: 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e 74 65 72  is also of inter
8530: 65 73 74 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20  est.    UNION.  
8540: 20 20 2d 2d 20 28 32 29 20 53 65 63 6f 6e 64 61    -- (2) Seconda
8550: 72 79 20 28 62 72 61 6e 63 68 29 20 63 68 69 6c  ry (branch) chil
8560: 64 72 65 6e 0a 09 20 20 20 20 53 45 4c 45 43 54  dren..    SELECT
8570: 20 52 2e 72 69 64 2c 20 42 2e 62 72 69 64 0a 09   R.rid, B.brid..
8580: 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73      FROM   revis
8590: 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 62  ion R, revisionb
85a0: 72 61 6e 63 68 63 68 69 6c 64 72 65 6e 20 42 0a  ranchchildren B.
85b0: 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69  .    WHERE  R.ri
85c0: 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20  d   IN $theset  
85d0: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74     -- Restrict t
85e0: 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69  o revisions of i
85f0: 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44  nterest..    AND
8600: 20 20 20 20 52 2e 72 69 64 20 3d 20 42 2e 72 69      R.rid = B.ri
8610: 64 20 20 20 20 20 20 20 20 20 20 2d 2d 20 53 65  d          -- Se
8620: 6c 65 63 74 20 73 75 62 73 65 74 20 6f 66 20 62  lect subset of b
8630: 72 61 6e 63 68 20 63 68 69 6c 64 72 65 6e 0a 09  ranch children..
8640: 20 20 20 20 41 4e 44 20 20 20 20 42 2e 62 72 69      AND    B.bri
8650: 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20  d IN $theset    
8660: 20 20 2d 2d 20 57 68 69 63 68 20 69 73 20 61 6c    -- Which is al
8670: 73 6f 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 20  so of interest. 
8680: 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20     UNION.    -- 
8690: 28 34 29 20 43 68 69 6c 64 20 6f 66 20 74 72 75  (4) Child of tru
86a0: 6e 6b 20 72 6f 6f 74 20 73 75 63 63 65 73 73 6f  nk root successo
86b0: 72 20 6f 66 20 6c 61 73 74 20 4e 54 44 42 20 6f  r of last NTDB o
86c0: 6e 20 74 72 75 6e 6b 2e 0a 09 20 20 20 20 53 45  n trunk...    SE
86d0: 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 41 2e 63  LECT R.rid, RA.c
86e0: 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 72  hild..    FROM r
86f0: 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73  evision R, revis
8700: 69 6f 6e 20 52 41 0a 09 20 20 20 20 57 48 45 52  ion RA..    WHER
8710: 45 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68  E R.rid   IN $th
8720: 65 73 65 74 20 20 20 20 20 20 2d 2d 20 52 65 73  eset      -- Res
8730: 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f  trict to revisio
8740: 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09  ns of interest..
8750: 20 20 20 20 41 4e 44 20 20 20 52 2e 69 73 64 65      AND   R.isde
8760: 66 61 75 6c 74 20 20 20 20 20 20 20 20 20 20 20  fault           
8770: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f    -- Restrict to
8780: 20 4e 54 44 42 0a 09 20 20 20 20 41 4e 44 20 20   NTDB..    AND  
8790: 20 52 2e 64 62 63 68 69 6c 64 20 49 53 20 4e 4f   R.dbchild IS NO
87a0: 54 20 4e 55 4c 4c 20 20 20 2d 2d 20 61 6e 64 20  T NULL   -- and 
87b0: 6c 61 73 74 20 4e 54 44 42 20 62 65 6c 6f 6e 67  last NTDB belong
87c0: 69 6e 67 20 74 6f 20 74 72 75 6e 6b 0a 09 20 20  ing to trunk..  
87d0: 20 20 41 4e 44 20 20 20 52 41 2e 72 69 64 20 3d    AND   RA.rid =
87e0: 20 52 2e 64 62 63 68 69 6c 64 20 20 20 20 20 20   R.dbchild      
87f0: 2d 2d 20 47 6f 20 64 69 72 65 63 74 6c 79 20 74  -- Go directly t
8800: 6f 20 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20  o trunk root..  
8810: 20 20 41 4e 44 20 20 20 52 41 2e 63 68 69 6c 64    AND   RA.child
8820: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
8830: 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 63  -- Has primary c
8840: 68 69 6c 64 2e 0a 20 20 20 20 20 20 20 20 20 20  hild..          
8850: 20 20 41 4e 44 20 20 20 52 41 2e 63 68 69 6c 64    AND   RA.child
8860: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20   IN $theset     
8870: 2d 2d 20 57 68 69 63 68 20 69 73 20 61 6c 73 6f  -- Which is also
8880: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 7d 5d   of interest..}]
8890: 5d 20 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 69  ] {..    # Consi
88a0: 64 65 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 20  der moving this 
88b0: 74 6f 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  to the integrity
88c0: 20 6d 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 6e   module...    in
88d0: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b  tegrity assert {
88e0: 24 72 69 64 20 21 3d 20 24 63 68 69 6c 64 7d 20  $rid != $child} 
88f0: 7b 52 65 76 69 73 69 6f 6e 20 24 72 69 64 20 64  {Revision $rid d
8900: 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66  epends on itself
8910: 2e 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20  .}..    lappend 
8920: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 24 72 69  dependencies($ri
8930: 64 29 20 24 63 68 69 6c 64 0a 09 20 20 20 20 73  d) $child..    s
8940: 65 74 20 64 65 70 28 24 72 69 64 2c 24 63 68 69  et dep($rid,$chi
8950: 6c 64 29 20 2e 0a 09 7d 0a 0a 09 23 20 54 68 65  ld) ...}...# The
8960: 20 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 73 20   sql statements 
8970: 61 62 6f 76 65 20 6c 6f 6f 6b 73 20 6f 6e 6c 79  above looks only
8980: 20 66 6f 72 20 64 69 72 65 63 74 20 64 65 70 65   for direct depe
8990: 6e 64 65 6e 63 69 65 73 0a 09 23 20 62 65 74 77  ndencies..# betw
89a0: 65 65 6e 20 72 65 76 69 73 69 6f 6e 20 69 6e 20  een revision in 
89b0: 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20 48  the changeset. H
89c0: 6f 77 65 76 65 72 20 64 75 65 20 74 6f 20 74 68  owever due to th
89d0: 65 0a 09 23 20 76 61 67 61 72 69 65 73 20 6f 66  e..# vagaries of
89e0: 20 6d 65 74 61 20 64 61 74 61 20 69 74 20 69 73   meta data it is
89f0: 20 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 77   possible for tw
8a00: 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 0a 09  o revisions of..
8a10: 23 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  # the same file 
8a20: 74 6f 20 65 6e 64 20 75 70 20 69 6e 20 74 68 65  to end up in the
8a30: 20 73 61 6d 65 20 63 68 61 6e 67 65 73 65 74 2c   same changeset,
8a40: 20 77 69 74 68 6f 75 74 20 61 0a 09 23 20 64 69   without a..# di
8a50: 72 65 63 74 20 64 65 70 65 6e 64 65 6e 63 79 20  rect dependency 
8a60: 62 65 74 77 65 65 6e 20 74 68 65 6d 2e 20 48 6f  between them. Ho
8a70: 77 65 76 65 72 20 77 65 20 6b 6e 6f 77 20 74 68  wever we know th
8a80: 61 74 20 74 68 65 72 65 0a 09 23 20 68 61 73 20  at there..# has 
8a90: 74 6f 20 62 65 20 61 20 61 6e 20 69 6e 64 69 72  to be a an indir
8aa0: 65 63 74 20 64 65 70 65 6e 64 65 6e 63 79 2c 20  ect dependency, 
8ab0: 62 65 20 69 74 20 74 68 72 6f 75 67 68 20 70 72  be it through pr
8ac0: 69 6d 61 72 79 0a 09 23 20 63 68 69 6c 64 72 65  imary..# childre
8ad0: 6e 2c 20 62 72 61 6e 63 68 20 63 68 69 6c 64 72  n, branch childr
8ae0: 65 6e 2c 20 6f 72 20 61 20 63 6f 6d 62 69 6e 61  en, or a combina
8af0: 74 69 6f 6e 20 74 68 65 72 65 6f 66 2e 0a 0a 09  tion thereof....
8b00: 23 20 57 65 20 6e 6f 77 20 66 69 6c 6c 20 69 6e  # We now fill in
8b10: 20 74 68 65 73 65 20 70 73 65 75 64 6f 2d 64 65   these pseudo-de
8b20: 70 65 6e 64 65 6e 63 69 65 73 2c 20 69 66 20 6e  pendencies, if n
8b30: 6f 20 73 75 63 68 0a 09 23 20 64 65 70 65 6e 64  o such..# depend
8b40: 65 6e 63 79 20 65 78 69 73 74 73 20 61 6c 72 65  ency exists alre
8b50: 61 64 79 2e 20 54 68 65 20 64 69 72 65 63 74 69  ady. The directi
8b60: 6f 6e 20 6f 66 20 74 68 65 20 64 65 70 65 6e 64  on of the depend
8b70: 65 6e 63 79 0a 09 23 20 69 73 20 61 63 74 75 61  ency..# is actua
8b80: 6c 6c 79 20 69 72 72 65 6c 65 76 61 6e 74 20 66  lly irrelevant f
8b90: 6f 72 20 74 68 69 73 2e 0a 0a 09 23 20 4e 4f 54  or this....# NOT
8ba0: 45 3a 20 54 68 69 73 20 69 73 20 64 69 66 66 65  E: This is diffe
8bb0: 72 65 6e 74 20 66 72 6f 6d 20 63 76 73 32 73 76  rent from cvs2sv
8bc0: 6e 2e 20 4f 75 72 20 73 70 69 72 69 74 75 61 6c  n. Our spiritual
8bd0: 20 61 6e 63 65 73 74 6f 72 0a 09 23 20 64 6f 65   ancestor..# doe
8be0: 73 20 6e 6f 74 20 75 73 65 20 73 75 63 68 20 70  s not use such p
8bf0: 73 65 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63 69  seudo-dependenci
8c00: 65 73 2c 20 68 6f 77 65 76 65 72 20 69 74 20 75  es, however it u
8c10: 73 65 73 20 61 0a 09 23 20 43 4f 4d 4d 49 54 5f  ses a..# COMMIT_
8c20: 54 48 52 45 53 48 4f 4c 44 2c 20 61 20 74 69 6d  THRESHOLD, a tim
8c30: 65 20 69 6e 74 65 72 76 61 6c 20 63 6f 6d 6d 69  e interval commi
8c40: 74 73 20 73 68 6f 75 6c 64 20 66 61 6c 6c 2e 20  ts should fall. 
8c50: 54 68 69 73 0a 09 23 20 77 69 6c 6c 20 67 72 65  This..# will gre
8c60: 61 74 6c 79 20 72 65 64 75 63 65 73 20 74 68 65  atly reduces the
8c70: 20 72 69 73 6b 20 6f 66 20 67 65 74 74 69 6e 67   risk of getting
8c80: 20 66 61 72 20 73 65 70 61 72 61 74 65 64 0a 09   far separated..
8c90: 23 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 74  # revisions of t
8ca0: 68 65 20 73 61 6d 65 20 66 69 6c 65 20 69 6e 74  he same file int
8cb0: 6f 20 6f 6e 65 20 63 68 61 6e 67 65 73 65 74 2e  o one changeset.
8cc0: 0a 0a 09 23 20 57 65 20 61 6c 6c 6f 77 20 72 65  ...# We allow re
8cd0: 76 69 73 69 6f 6e 73 20 74 6f 20 62 65 20 66 61  visions to be fa
8ce0: 72 20 61 70 61 72 74 20 69 6e 20 74 69 6d 65 20  r apart in time 
8cf0: 69 6e 20 74 68 65 20 73 61 6d 65 0a 09 23 20 63  in the same..# c
8d00: 68 61 6e 67 65 73 65 74 2c 20 62 75 74 20 69 6e  hangeset, but in
8d10: 20 74 75 72 6e 20 6e 65 65 64 20 74 68 65 20 70   turn need the p
8d20: 73 65 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63 69  seudo-dependenci
8d30: 65 73 20 74 6f 0a 09 23 20 68 61 6e 64 6c 65 20  es to..# handle 
8d40: 74 68 69 73 2e 0a 0a 09 6c 6f 67 20 77 72 69 74  this....log writ
8d50: 65 20 31 34 20 63 73 65 74 20 70 73 65 75 64 6f  e 14 cset pseudo
8d60: 2d 69 6e 74 65 72 6e 61 6c 73 75 63 63 65 73 73  -internalsuccess
8d70: 6f 72 73 0a 0a 09 61 72 72 61 79 20 73 65 74 20  ors...array set 
8d80: 66 69 64 73 20 7b 7d 0a 09 66 6f 72 65 61 63 68  fids {}..foreach
8d90: 20 7b 72 69 64 20 66 69 64 7d 20 5b 73 74 61 74   {rid fid} [stat
8da0: 65 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f  e run [subst -no
8db0: 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b  commands -noback
8dc0: 73 6c 61 73 68 65 73 20 7b 0a 09 20 20 20 20 53  slashes {..    S
8dd0: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 66  ELECT R.rid, R.f
8de0: 69 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 46  id.            F
8df0: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52  ROM   revision R
8e00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 57 48 45  .            WHE
8e10: 52 45 20 20 52 2e 72 69 64 20 49 4e 20 24 74 68  RE  R.rid IN $th
8e20: 65 73 65 74 0a 09 7d 5d 5d 20 7b 20 6c 61 70 70  eset..}]] { lapp
8e30: 65 6e 64 20 66 69 64 73 28 24 66 69 64 29 20 24  end fids($fid) $
8e40: 72 69 64 20 7d 0a 0a 09 66 6f 72 65 61 63 68 20  rid }...foreach 
8e50: 7b 66 69 64 20 72 69 64 73 7d 20 5b 61 72 72 61  {fid rids} [arra
8e60: 79 20 67 65 74 20 66 69 64 73 5d 20 7b 0a 09 20  y get fids] {.. 
8e70: 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20     if {[llength 
8e80: 24 72 69 64 73 5d 20 3c 20 32 7d 20 63 6f 6e 74  $rids] < 2} cont
8e90: 69 6e 75 65 0a 09 20 20 20 20 66 6f 72 65 61 63  inue..    foreac
8ea0: 68 20 61 20 24 72 69 64 73 20 7b 0a 09 09 66 6f  h a $rids {...fo
8eb0: 72 65 61 63 68 20 62 20 24 72 69 64 73 20 7b 0a  reach b $rids {.
8ec0: 09 09 20 20 20 20 69 66 20 7b 24 61 20 3d 3d 20  ..    if {$a == 
8ed0: 24 62 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 09 20  $b} continue... 
8ee0: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
8ef0: 73 74 73 20 64 65 70 28 24 61 2c 24 62 29 5d 7d  sts dep($a,$b)]}
8f00: 20 63 6f 6e 74 69 6e 75 65 0a 09 09 20 20 20 20   continue...    
8f10: 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73  if {[info exists
8f20: 20 64 65 70 28 24 62 2c 24 61 29 5d 7d 20 63 6f   dep($b,$a)]} co
8f30: 6e 74 69 6e 75 65 0a 09 09 20 20 20 20 6c 61 70  ntinue...    lap
8f40: 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65  pend dependencie
8f50: 73 28 24 61 29 20 24 62 0a 09 09 20 20 20 20 73  s($a) $b...    s
8f60: 65 74 20 64 65 70 28 24 61 2c 24 62 29 20 2e 0a  et dep($a,$b) ..
8f70: 09 09 20 20 20 20 73 65 74 20 64 65 70 28 24 62  ..    set dep($b
8f80: 2c 24 61 29 20 2e 0a 09 09 7d 0a 09 20 20 20 20  ,$a) ....}..    
8f90: 7d 0a 09 7d 0a 0a 09 6c 6f 67 20 77 72 69 74 65  }..}...log write
8fa0: 20 31 34 20 63 73 65 74 20 63 6f 6d 70 6c 65 74   14 cset complet
8fb0: 65 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  e..return.    }.
8fc0: 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20  .    # result = 
8fd0: 34 2d 6c 69 73 74 20 28 69 74 65 6d 74 79 70 65  4-list (itemtype
8fe0: 20 69 74 65 6d 69 64 20 6e 65 78 74 69 74 65 6d   itemid nextitem
8ff0: 74 79 70 65 20 6e 65 78 74 69 74 65 6d 69 64 20  type nextitemid 
9000: 2e 2e 2e 29 0a 20 20 20 20 74 79 70 65 6d 65 74  ...).    typemet
9010: 68 6f 64 20 6c 6f 6f 70 73 20 7b 72 65 76 69 73  hod loops {revis
9020: 69 6f 6e 73 7d 20 7b 0a 09 23 20 4e 6f 74 65 3a  ions} {..# Note:
9030: 20 54 61 67 73 20 61 6e 64 20 62 72 61 6e 63 68   Tags and branch
9040: 65 73 20 63 61 6e 6e 6f 74 20 63 61 75 73 65 20  es cannot cause 
9050: 74 68 65 20 6c 6f 6f 70 2e 20 54 68 65 69 72 20  the loop. Their 
9060: 69 64 27 73 2c 0a 09 23 20 62 65 69 6e 67 20 6f  id's,..# being o
9070: 66 20 61 20 66 75 6e 64 61 6d 65 6e 74 61 6c 6c  f a fundamentall
9080: 79 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65  y different type
9090: 20 74 68 61 6e 20 74 68 65 20 72 65 76 69 73 69   than the revisi
90a0: 6f 6e 73 0a 09 23 20 63 6f 6d 69 6e 67 20 69 6e  ons..# coming in
90b0: 20 63 61 6e 6e 6f 74 20 62 65 20 69 6e 20 74 68   cannot be in th
90c0: 65 20 73 65 74 2e 0a 0a 09 73 65 74 20 74 68 65  e set....set the
90d0: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76  set ('[join $rev
90e0: 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a  isions {','}]').
90f0: 09 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72  .return [state r
9100: 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d  un [subst -nocom
9110: 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61  mands -nobacksla
9120: 73 68 65 73 20 7b 0a 09 20 20 20 20 2d 2d 20 28  shes {..    -- (
9130: 31 29 20 50 72 69 6d 61 72 79 20 63 68 69 6c 64  1) Primary child
9140: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
9150: 69 64 2c 20 52 2e 63 68 69 6c 64 0a 09 20 20 20  id, R.child..   
9160: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
9170: 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 52   R..    WHERE  R
9180: 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65  .rid   IN $these
9190: 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63  t     -- Restric
91a0: 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f  t to revisions o
91b0: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20  f interest..    
91c0: 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49  AND    R.child I
91d0: 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d  S NOT NULL    --
91e0: 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 68 69   Has primary chi
91f0: 6c 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  ld..    AND    R
9200: 2e 63 68 69 6c 64 20 49 4e 20 24 74 68 65 73 65  .child IN $these
9210: 74 20 20 20 20 20 2d 2d 20 4c 6f 6f 70 0a 09 20  t     -- Loop.. 
9220: 20 20 20 2d 2d 0a 09 20 20 20 20 55 4e 49 4f 4e     --..    UNION
9230: 0a 09 20 20 20 20 2d 2d 20 28 32 29 20 53 65 63  ..    -- (2) Sec
9240: 6f 6e 64 61 72 79 20 28 62 72 61 6e 63 68 29 20  ondary (branch) 
9250: 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 53 45  children..    SE
9260: 4c 45 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 72  LECT R.rid, B.br
9270: 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72  id..    FROM   r
9280: 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73  evision R, revis
9290: 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64 72 65  ionbranchchildre
92a0: 6e 20 42 0a 09 20 20 20 20 57 48 45 52 45 20 20  n B..    WHERE  
92b0: 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73  R.rid   IN $thes
92c0: 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69  et     -- Restri
92d0: 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20  ct to revisions 
92e0: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20  of interest..   
92f0: 20 41 4e 44 20 20 20 20 52 2e 72 69 64 20 3d 20   AND    R.rid = 
9300: 42 2e 72 69 64 20 20 20 20 20 20 20 20 20 20 2d  B.rid          -
9310: 2d 20 53 65 6c 65 63 74 20 73 75 62 73 65 74 20  - Select subset 
9320: 6f 66 20 62 72 61 6e 63 68 20 63 68 69 6c 64 72  of branch childr
9330: 65 6e 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42  en..    AND    B
9340: 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65  .rid   IN $these
9350: 74 20 20 20 20 20 2d 2d 20 4c 6f 6f 70 0a 09 20  t     -- Loop.. 
9360: 20 20 20 2d 2d 0a 09 20 20 20 20 55 4e 49 4f 4e     --..    UNION
9370: 0a 09 20 20 20 20 2d 2d 20 28 34 29 20 43 68 69  ..    -- (4) Chi
9380: 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74  ld of trunk root
9390: 20 73 75 63 63 65 73 73 6f 72 20 6f 66 20 6c 61   successor of la
93a0: 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b  st NTDB on trunk
93b0: 2e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e  ...    SELECT R.
93c0: 72 69 64 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20  rid, RA.child.. 
93d0: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69     FROM   revisi
93e0: 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 52  on R, revision R
93f0: 41 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e  A..    WHERE  R.
9400: 72 69 64 20 20 20 20 49 4e 20 24 74 68 65 73 65  rid    IN $these
9410: 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63  t     -- Restric
9420: 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f  t to revisions o
9430: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20  f interest..    
9440: 41 4e 44 20 20 20 20 52 2e 69 73 64 65 66 61 75  AND    R.isdefau
9450: 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  lt             -
9460: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 4e 54  - Restrict to NT
9470: 44 42 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  DB..    AND    R
9480: 2e 64 62 63 68 69 6c 64 20 49 53 20 4e 4f 54 20  .dbchild IS NOT 
9490: 4e 55 4c 4c 20 20 20 2d 2d 20 61 6e 64 20 6c 61  NULL   -- and la
94a0: 73 74 20 4e 54 44 42 20 62 65 6c 6f 6e 67 69 6e  st NTDB belongin
94b0: 67 20 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20  g to trunk..    
94c0: 41 4e 44 20 20 20 20 52 41 2e 72 69 64 20 3d 20  AND    RA.rid = 
94d0: 52 2e 64 62 63 68 69 6c 64 20 20 20 20 20 20 2d  R.dbchild      -
94e0: 2d 20 47 6f 20 64 69 72 65 63 74 6c 79 20 74 6f  - Go directly to
94f0: 20 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20   trunk root..   
9500: 20 41 4e 44 20 20 20 20 52 41 2e 63 68 69 6c 64   AND    RA.child
9510: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
9520: 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 63  -- Has primary c
9530: 68 69 6c 64 2e 0a 09 20 20 20 20 41 4e 44 20 20  hild...    AND  
9540: 20 20 52 41 2e 63 68 69 6c 64 20 49 4e 20 24 74    RA.child IN $t
9550: 68 65 73 65 74 20 20 20 20 20 2d 2d 20 4c 6f 6f  heset     -- Loo
9560: 70 0a 09 7d 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20  p..}]].    }..  
9570: 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 69    # var(dv) = di
9580: 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74  ct (item -> list
9590: 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 20   (item)), item  
95a0: 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69 64 29  = list (type id)
95b0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
95c0: 73 75 63 63 65 73 73 6f 72 73 20 7b 64 76 20 72  successors {dv r
95d0: 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76  evisions} {..upv
95e0: 61 72 20 31 20 24 64 76 20 64 65 70 65 6e 64 65  ar 1 $dv depende
95f0: 6e 63 69 65 73 0a 09 73 65 74 20 74 68 65 73 65  ncies..set these
9600: 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73  t ('[join $revis
9610: 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09  ions {','}]')...
9620: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
9630: 63 61 73 65 73 20 73 70 65 63 69 66 79 20 77 68  cases specify wh
9640: 65 6e 20 61 20 72 65 76 69 73 69 6f 6e 20 53 20  en a revision S 
9650: 69 73 20 61 20 73 75 63 63 65 73 73 6f 72 0a 09  is a successor..
9660: 23 20 6f 66 20 61 20 72 65 76 69 73 69 6f 6e 20  # of a revision 
9670: 52 2e 20 45 61 63 68 20 6f 66 20 74 68 65 20 63  R. Each of the c
9680: 61 73 65 73 20 74 72 61 6e 73 6c 61 74 65 73 20  ases translates 
9690: 69 6e 74 6f 20 6f 6e 65 20 6f 66 0a 09 23 20 74  into one of..# t
96a0: 68 65 20 62 72 61 6e 63 68 65 73 20 6f 66 20 74  he branches of t
96b0: 68 65 20 53 51 4c 20 55 4e 49 4f 4e 20 63 6f 6d  he SQL UNION com
96c0: 69 6e 67 20 62 65 6c 6f 77 2e 0a 09 23 0a 09 23  ing below...#..#
96d0: 20 28 31 29 20 53 20 63 61 6e 20 62 65 20 61 20   (1) S can be a 
96e0: 70 72 69 6d 61 72 79 20 63 68 69 6c 64 20 6f 66  primary child of
96f0: 20 52 2c 20 69 2e 65 2e 20 69 6e 20 74 68 65 20   R, i.e. in the 
9700: 73 61 6d 65 20 4c 4f 44 2e 20 52 0a 09 23 20 20  same LOD. R..#  
9710: 20 20 20 72 65 66 65 72 65 6e 63 65 73 20 53 20     references S 
9720: 64 69 72 65 63 74 6c 79 2e 20 52 2e 63 68 69 6c  directly. R.chil
9730: 64 20 3d 20 53 28 2e 72 69 64 29 2c 20 69 66 20  d = S(.rid), if 
9740: 69 74 20 65 78 69 73 74 73 2e 0a 09 23 0a 09 23  it exists...#..#
9750: 20 28 32 29 20 53 20 63 61 6e 20 62 65 20 61 20   (2) S can be a 
9760: 73 65 63 6f 6e 64 61 72 79 2c 20 69 2e 65 2e 20  secondary, i.e. 
9770: 62 72 61 6e 63 68 2c 20 63 68 69 6c 64 20 6f 66  branch, child of
9780: 20 52 2e 20 48 65 72 65 20 74 68 65 0a 09 23 20   R. Here the..# 
9790: 20 20 20 20 6c 69 6e 6b 20 69 73 20 6d 61 64 65      link is made
97a0: 20 74 68 72 6f 75 67 68 20 74 68 65 20 68 65 6c   through the hel
97b0: 70 65 72 20 74 61 62 6c 65 0a 09 23 20 20 20 20  per table..#    
97c0: 20 52 45 56 49 53 49 4f 4e 42 52 41 4e 43 48 43   REVISIONBRANCHC
97d0: 48 49 4c 44 52 45 4e 2e 20 52 2e 72 69 64 20 2d  HILDREN. R.rid -
97e0: 3e 20 52 42 43 2e 72 69 64 2c 20 52 42 43 2e 62  > RBC.rid, RBC.b
97f0: 72 69 64 20 3d 0a 09 23 20 20 20 20 20 53 28 2e  rid =..#     S(.
9800: 72 69 64 29 0a 09 23 0a 09 23 20 28 33 29 20 4f  rid)..#..# (3) O
9810: 72 69 67 69 6e 61 6c 6c 79 20 74 68 69 73 20 75  riginally this u
9820: 73 65 20 63 61 73 65 20 64 65 66 69 6e 65 64 20  se case defined 
9830: 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 20 64 65  the root of a de
9840: 74 61 63 68 65 64 0a 09 23 20 20 20 20 20 4e 54  tached..#     NT
9850: 44 42 20 61 73 20 74 68 65 20 73 75 63 63 65 73  DB as the succes
9860: 73 6f 72 20 6f 66 20 74 68 65 20 74 72 75 6e 6b  sor of the trunk
9870: 20 72 6f 6f 74 2e 20 54 68 69 73 20 6c 65 61 64   root. This lead
9880: 73 20 74 6f 20 61 0a 09 23 20 20 20 20 20 62 61  s to a..#     ba
9890: 64 20 74 61 6e 67 6c 65 20 6c 61 74 65 72 20 6f  d tangle later o
98a0: 6e 2e 20 57 69 74 68 20 61 20 64 65 74 61 63 68  n. With a detach
98b0: 65 64 20 4e 54 44 42 20 74 68 65 20 6f 72 69 67  ed NTDB the orig
98c0: 69 6e 61 6c 0a 09 23 20 20 20 20 20 74 72 75 6e  inal..#     trun
98d0: 6b 20 72 6f 6f 74 20 72 65 76 69 73 69 6f 6e 20  k root revision 
98e0: 77 61 73 20 72 65 6d 6f 76 65 64 20 61 73 20 69  was removed as i
98f0: 72 72 65 6c 65 76 61 6e 74 2c 20 61 6c 6c 6f 77  rrelevant, allow
9900: 69 6e 67 0a 09 23 20 20 20 20 20 74 68 65 20 6e  ing..#     the n
9910: 6f 6d 69 6e 61 6c 20 72 6f 6f 74 20 74 6f 20 62  ominal root to b
9920: 65 20 6c 61 74 65 72 20 69 6e 20 74 69 6d 65 20  e later in time 
9930: 74 68 61 6e 20 74 68 65 20 4e 54 44 42 0a 09 23  than the NTDB..#
9940: 20 20 20 20 20 72 6f 6f 74 2e 20 4e 6f 77 20 73       root. Now s
9950: 65 74 74 69 6e 67 20 74 68 69 73 20 64 65 70 65  etting this depe
9960: 6e 64 65 6e 63 79 20 77 69 6c 6c 20 62 65 20 62  ndency will be b
9970: 61 63 6b 77 61 72 64 20 69 6e 0a 09 23 20 20 20  ackward in..#   
9980: 20 20 74 69 6d 65 2e 20 52 45 4d 4f 56 45 44 2e    time. REMOVED.
9990: 0a 09 23 0a 09 23 20 28 34 29 20 49 66 20 52 20  ..#..# (4) If R 
99a0: 69 73 20 74 68 65 20 6c 61 73 74 20 6f 66 20 74  is the last of t
99b0: 68 65 20 4e 54 44 42 20 72 65 76 69 73 69 6f 6e  he NTDB revision
99c0: 73 20 77 68 69 63 68 20 62 65 6c 6f 6e 67 20 74  s which belong t
99d0: 6f 0a 09 23 20 20 20 20 20 74 68 65 20 74 72 75  o..#     the tru
99e0: 6e 6b 2c 20 74 68 65 6e 20 74 68 65 20 70 72 69  nk, then the pri
99f0: 6d 61 72 79 20 63 68 69 6c 64 20 6f 66 20 74 68  mary child of th
9a00: 65 20 74 72 75 6e 6b 20 72 6f 6f 74 20 28 74 68  e trunk root (th
9a10: 65 0a 09 23 20 20 20 20 20 27 31 2e 32 27 20 72  e..#     '1.2' r
9a20: 65 76 69 73 69 6f 6e 29 20 69 73 20 61 20 73 75  evision) is a su
9a30: 63 63 65 73 73 6f 72 2c 20 69 66 20 69 74 20 65  ccessor, if it e
9a40: 78 69 73 74 73 2e 0a 0a 09 23 20 4e 6f 74 65 20  xists....# Note 
9a50: 74 68 61 74 20 74 68 65 20 62 72 61 6e 63 68 65  that the branche
9a60: 73 20 73 70 61 77 6e 65 64 20 66 72 6f 6d 20 74  s spawned from t
9a70: 68 65 20 72 65 76 69 73 69 6f 6e 73 2c 20 61 6e  he revisions, an
9a80: 64 20 74 68 65 0a 09 23 20 74 61 67 73 20 61 73  d the..# tags as
9a90: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
9aa0: 65 6d 20 61 72 65 20 73 75 63 63 65 73 73 6f 72  em are successor
9ab0: 73 20 61 73 20 77 65 6c 6c 2e 0a 0a 09 66 6f 72  s as well....for
9ac0: 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 7d  each {rid child}
9ad0: 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62   [state run [sub
9ae0: 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d  st -nocommands -
9af0: 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a  nobackslashes {.
9b00: 20 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d 61      -- (1) Prima
9b10: 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20 53 45  ry child..    SE
9b20: 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63 68  LECT R.rid, R.ch
9b30: 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  ild..    FROM   
9b40: 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20  revision R..    
9b50: 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49  WHERE  R.rid   I
9b60: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d  N $theset     --
9b70: 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76   Restrict to rev
9b80: 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65  isions of intere
9b90: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  st..    AND    R
9ba0: 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55  .child IS NOT NU
9bb0: 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69  LL    -- Has pri
9bc0: 6d 61 72 79 20 63 68 69 6c 64 0a 20 20 20 20 55  mary child.    U
9bd0: 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32 29 20  NION.    -- (2) 
9be0: 53 65 63 6f 6e 64 61 72 79 20 28 62 72 61 6e 63  Secondary (branc
9bf0: 68 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20  h) children..   
9c00: 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 42   SELECT R.rid, B
9c10: 2e 62 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20  .brid..    FROM 
9c20: 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65    revision R, re
9c30: 76 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c  visionbranchchil
9c40: 64 72 65 6e 20 42 0a 09 20 20 20 20 57 48 45 52  dren B..    WHER
9c50: 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74  E  R.rid   IN $t
9c60: 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73  heset     -- Res
9c70: 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f  trict to revisio
9c80: 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09  ns of interest..
9c90: 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72 69 64      AND    R.rid
9ca0: 20 3d 20 42 2e 72 69 64 20 20 20 20 20 20 20 20   = B.rid        
9cb0: 20 20 2d 2d 20 53 65 6c 65 63 74 20 73 75 62 73    -- Select subs
9cc0: 65 74 20 6f 66 20 62 72 61 6e 63 68 20 63 68 69  et of branch chi
9cd0: 6c 64 72 65 6e 0a 20 20 20 20 55 4e 49 4f 4e 0a  ldren.    UNION.
9ce0: 20 20 20 20 2d 2d 20 28 34 29 20 43 68 69 6c 64      -- (4) Child
9cf0: 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 20 73   of trunk root s
9d00: 75 63 63 65 73 73 6f 72 20 6f 66 20 6c 61 73 74  uccessor of last
9d10: 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b 2e 0a   NTDB on trunk..
9d20: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69  .    SELECT R.ri
9d30: 64 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20 20 20  d, RA.child..   
9d40: 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52   FROM revision R
9d50: 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 0a 09 20  , revision RA.. 
9d60: 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 20     WHERE R.rid  
9d70: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20   IN $theset     
9d80: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
9d90: 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74  revisions of int
9da0: 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20  erest..    AND  
9db0: 20 52 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20   R.isdefault    
9dc0: 20 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74           -- Rest
9dd0: 72 69 63 74 20 74 6f 20 4e 54 44 42 0a 09 20 20  rict to NTDB..  
9de0: 20 20 41 4e 44 20 20 20 52 2e 64 62 63 68 69 6c    AND   R.dbchil
9df0: 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20  d IS NOT NULL   
9e00: 2d 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 42  -- and last NTDB
9e10: 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72   belonging to tr
9e20: 75 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 52  unk..    AND   R
9e30: 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69 6c  A.rid = R.dbchil
9e40: 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 72  d      -- Go dir
9e50: 65 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 72  ectly to trunk r
9e60: 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 52  oot..    AND   R
9e70: 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e  A.child IS NOT N
9e80: 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72  ULL    -- Has pr
9e90: 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 09 7d 5d  imary child...}]
9ea0: 5d 20 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 69  ] {..    # Consi
9eb0: 64 65 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 20  der moving this 
9ec0: 74 6f 20 74 68 65 20 69 6e 74 65 67 72 69 74 79  to the integrity
9ed0: 20 6d 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 6e   module...    in
9ee0: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b  tegrity assert {
9ef0: 24 72 69 64 20 21 3d 20 24 63 68 69 6c 64 7d 20  $rid != $child} 
9f00: 7b 52 65 76 69 73 69 6f 6e 20 24 72 69 64 20 64  {Revision $rid d
9f10: 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66  epends on itself
9f20: 2e 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20  .}..    lappend 
9f30: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69  dependencies([li
9f40: 73 74 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c  st rev $rid]) [l
9f50: 69 73 74 20 72 65 76 20 24 63 68 69 6c 64 5d 0a  ist rev $child].
9f60: 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64  .}..foreach {rid
9f70: 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72   child} [state r
9f80: 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d  un [subst -nocom
9f90: 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61  mands -nobacksla
9fa0: 73 68 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45  shes {..    SELE
9fb0: 43 54 20 52 2e 72 69 64 2c 20 54 2e 74 69 64 0a  CT R.rid, T.tid.
9fc0: 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69  .    FROM   revi
9fd0: 73 69 6f 6e 20 52 2c 20 74 61 67 20 54 0a 09 20  sion R, tag T.. 
9fe0: 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20     WHERE  R.rid 
9ff0: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 20  IN $theset      
a000: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
a010: 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74  revisions of int
a020: 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20  erest..    AND  
a030: 20 20 54 2e 72 65 76 20 3d 20 52 2e 72 69 64 20    T.rev = R.rid 
a040: 20 20 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65           -- Sele
a050: 63 74 20 74 61 67 73 20 61 74 74 61 63 68 65 64  ct tags attached
a060: 20 74 6f 20 74 68 65 6d 0a 09 7d 5d 5d 20 7b 0a   to them..}]] {.
a070: 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70  .    lappend dep
a080: 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20  endencies([list 
a090: 72 65 76 20 24 72 69 64 5d 29 20 5b 6c 69 73 74  rev $rid]) [list
a0a0: 20 73 79 6d 3a 3a 74 61 67 20 24 63 68 69 6c 64   sym::tag $child
a0b0: 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72  ]..}..foreach {r
a0c0: 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65  id child} [state
a0d0: 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63   run [subst -noc
a0e0: 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73  ommands -nobacks
a0f0: 6c 61 73 68 65 73 20 7b 0a 09 20 20 20 20 53 45  lashes {..    SE
a100: 4c 45 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 69  LECT R.rid, B.bi
a110: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65  d..    FROM   re
a120: 76 69 73 69 6f 6e 20 52 2c 20 62 72 61 6e 63 68  vision R, branch
a130: 20 42 0a 09 20 20 20 20 57 48 45 52 45 20 20 52   B..    WHERE  R
a140: 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 20  .rid IN $theset 
a150: 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63        -- Restric
a160: 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f  t to revisions o
a170: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20  f interest..    
a180: 41 4e 44 20 20 20 20 42 2e 72 6f 6f 74 20 3d 20  AND    B.root = 
a190: 52 2e 72 69 64 20 20 20 20 20 20 20 20 20 2d 2d  R.rid         --
a1a0: 20 53 65 6c 65 63 74 20 62 72 61 6e 63 68 65 73   Select branches
a1b0: 20 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65   attached to the
a1c0: 6d 0a 09 7d 5d 5d 20 7b 0a 09 20 20 20 20 6c 61  m..}]] {..    la
a1d0: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69  ppend dependenci
a1e0: 65 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69  es([list rev $ri
a1f0: 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62  d]) [list sym::b
a200: 72 61 6e 63 68 20 24 63 68 69 6c 64 5d 0a 09 7d  ranch $child]..}
a210: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
a220: 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c      # result = l
a230: 69 73 74 20 28 63 68 61 6e 67 65 73 65 74 2d 69  ist (changeset-i
a240: 64 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  d).    typemetho
a250: 64 20 63 73 5f 73 75 63 63 65 73 73 6f 72 73 20  d cs_successors 
a260: 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 20 20  {revisions} {.  
a270: 20 20 20 20 20 20 23 20 54 68 69 73 20 69 73 20        # This is 
a280: 61 20 76 61 72 69 61 6e 74 20 6f 66 20 27 73 75  a variant of 'su
a290: 63 63 65 73 73 6f 72 73 27 20 77 68 69 63 68 20  ccessors' which 
a2a0: 6d 61 70 73 20 74 68 65 20 6c 6f 77 2d 6c 65 76  maps the low-lev
a2b0: 65 6c 0a 20 20 20 20 20 20 20 20 23 20 64 61 74  el.        # dat
a2c0: 61 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68  a directly to th
a2d0: 65 20 61 73 73 6f 63 69 61 74 65 64 20 63 68 61  e associated cha
a2e0: 6e 67 65 73 65 74 73 2e 20 49 2e 65 2e 20 69 6e  ngesets. I.e. in
a2f0: 73 74 65 61 64 0a 20 20 20 20 20 20 20 20 23 20  stead.        # 
a300: 6d 69 6c 6c 69 6f 6e 73 20 6f 66 20 64 65 70 65  millions of depe
a310: 6e 64 65 6e 63 79 20 70 61 69 72 73 20 28 69 6e  ndency pairs (in
a320: 20 65 78 74 72 65 6d 65 20 63 61 73 65 73 20 28   extreme cases (
a330: 45 78 61 6d 70 6c 65 3a 20 54 63 6c 0a 20 20 20  Example: Tcl.   
a340: 20 20 20 20 20 23 20 43 56 53 29 29 20 77 65 20       # CVS)) we 
a350: 72 65 74 75 72 6e 20 61 20 76 65 72 79 20 73 68  return a very sh
a360: 6f 72 74 20 61 6e 64 20 6d 75 63 68 20 6d 6f 72  ort and much mor
a370: 65 20 6d 61 6e 61 67 65 61 62 6c 65 20 6c 69 73  e manageable lis
a380: 74 0a 20 20 20 20 20 20 20 20 23 20 6f 66 20 63  t.        # of c
a390: 68 61 6e 67 65 73 65 74 73 2e 0a 0a 09 73 65 74  hangesets....set
a3a0: 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20   theset ('[join 
a3b0: 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d  $revisions {','}
a3c0: 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61  ]')..return [sta
a3d0: 74 65 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e  te run [subst -n
a3e0: 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63  ocommands -nobac
a3f0: 6b 73 6c 61 73 68 65 73 20 7b 0a 20 20 20 20 2d  kslashes {.    -
a400: 2d 20 28 31 29 20 50 72 69 6d 61 72 79 20 63 68  - (1) Primary ch
a410: 69 6c 64 0a 09 20 20 20 20 53 45 4c 45 43 54 20  ild..    SELECT 
a420: 43 2e 63 69 64 0a 09 20 20 20 20 46 52 4f 4d 20  C.cid..    FROM 
a430: 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 63 73    revision R, cs
a440: 69 74 65 6d 20 43 49 2c 20 63 68 61 6e 67 65 73  item CI, changes
a450: 65 74 20 43 0a 09 20 20 20 20 57 48 45 52 45 20  et C..    WHERE 
a460: 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65   R.rid   IN $the
a470: 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72  set     -- Restr
a480: 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73  ict to revisions
a490: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20   of interest..  
a4a0: 20 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64    AND    R.child
a4b0: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
a4c0: 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 63  -- Has primary c
a4d0: 68 69 6c 64 0a 20 20 20 20 20 20 20 20 20 20 20  hild.           
a4e0: 20 41 4e 44 20 20 20 20 43 49 2e 69 69 64 20 3d   AND    CI.iid =
a4f0: 20 52 2e 63 68 69 6c 64 20 20 20 20 20 20 20 2d   R.child       -
a500: 2d 20 53 65 6c 65 63 74 20 61 6c 6c 20 63 68 61  - Select all cha
a510: 6e 67 65 73 65 74 73 0a 20 20 20 20 20 20 20 20  ngesets.        
a520: 20 20 20 20 41 4e 44 20 20 20 20 43 2e 63 69 64      AND    C.cid
a530: 20 3d 20 43 49 2e 63 69 64 20 20 20 20 20 20 20   = CI.cid       
a540: 20 20 2d 2d 20 63 6f 6e 74 61 69 6e 69 6e 67 20    -- containing 
a550: 74 68 65 20 70 72 69 6d 61 72 79 20 63 68 69 6c  the primary chil
a560: 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e  d.            AN
a570: 44 20 20 20 20 43 2e 74 79 70 65 20 3d 20 30 20  D    C.type = 0 
a580: 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 77              -- w
a590: 68 69 63 68 20 61 72 65 20 72 65 76 69 73 69 6f  hich are revisio
a5a0: 6e 20 63 68 61 6e 67 65 73 65 74 73 0a 20 20 20  n changesets.   
a5b0: 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32   UNION.    -- (2
a5c0: 29 20 53 65 63 6f 6e 64 61 72 79 20 28 62 72 61  ) Secondary (bra
a5d0: 6e 63 68 29 20 63 68 69 6c 64 72 65 6e 0a 09 20  nch) children.. 
a5e0: 20 20 20 53 45 4c 45 43 54 20 43 2e 63 69 64 0a     SELECT C.cid.
a5f0: 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69  .    FROM   revi
a600: 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e  sion R, revision
a610: 62 72 61 6e 63 68 63 68 69 6c 64 72 65 6e 20 42  branchchildren B
a620: 2c 20 63 73 69 74 65 6d 20 43 49 2c 20 63 68 61  , csitem CI, cha
a630: 6e 67 65 73 65 74 20 43 0a 09 20 20 20 20 57 48  ngeset C..    WH
a640: 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20  ERE  R.rid   IN 
a650: 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52  $theset     -- R
a660: 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73  estrict to revis
a670: 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74  ions of interest
a680: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72  ..    AND    R.r
a690: 69 64 20 3d 20 42 2e 72 69 64 20 20 20 20 20 20  id = B.rid      
a6a0: 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 73 75      -- Select su
a6b0: 62 73 65 74 20 6f 66 20 62 72 61 6e 63 68 20 63  bset of branch c
a6c0: 68 69 6c 64 72 65 6e 0a 20 20 20 20 20 20 20 20  hildren.        
a6d0: 20 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69      AND    CI.ii
a6e0: 64 20 3d 20 42 2e 62 72 69 64 20 20 20 20 20 20  d = B.brid      
a6f0: 20 20 2d 2d 20 53 65 6c 65 63 74 20 61 6c 6c 20    -- Select all 
a700: 63 68 61 6e 67 65 73 65 74 73 0a 20 20 20 20 20  changesets.     
a710: 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e         AND    C.
a720: 63 69 64 20 3d 20 43 49 2e 63 69 64 09 20 20 2d  cid = CI.cid.  -
a730: 2d 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  - containing the
a740: 20 62 72 61 6e 63 68 0a 20 20 20 20 20 20 20 20   branch.        
a750: 20 20 20 20 41 4e 44 20 20 20 20 43 2e 74 79 70      AND    C.typ
a760: 65 20 3d 20 30 09 09 20 20 2d 2d 20 77 68 69 63  e = 0..  -- whic
a770: 68 20 61 72 65 20 72 65 76 69 73 69 6f 6e 20 63  h are revision c
a780: 68 61 6e 67 65 73 65 74 73 0a 20 20 20 20 55 4e  hangesets.    UN
a790: 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 34 29 20 43  ION.    -- (4) C
a7a0: 68 69 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f  hild of trunk ro
a7b0: 6f 74 20 73 75 63 63 65 73 73 6f 72 20 6f 66 20  ot successor of 
a7c0: 6c 61 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 75  last NTDB on tru
a7d0: 6e 6b 2e 0a 09 20 20 20 20 53 45 4c 45 43 54 20  nk...    SELECT 
a7e0: 43 2e 63 69 64 0a 09 20 20 20 20 46 52 4f 4d 20  C.cid..    FROM 
a7f0: 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65    revision R, re
a800: 76 69 73 69 6f 6e 20 52 41 2c 20 63 73 69 74 65  vision RA, csite
a810: 6d 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20  m CI, changeset 
a820: 43 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e  C..    WHERE  R.
a830: 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74  rid   IN $theset
a840: 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63        -- Restric
a850: 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f  t to revisions o
a860: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20  f interest..    
a870: 41 4e 44 20 20 20 20 52 2e 69 73 64 65 66 61 75  AND    R.isdefau
a880: 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  lt             -
a890: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 4e 54  - Restrict to NT
a8a0: 44 42 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  DB..    AND    R
a8b0: 2e 64 62 63 68 69 6c 64 20 49 53 20 4e 4f 54 20  .dbchild IS NOT 
a8c0: 4e 55 4c 4c 20 20 20 2d 2d 20 61 6e 64 20 6c 61  NULL   -- and la
a8d0: 73 74 20 4e 54 44 42 20 62 65 6c 6f 6e 67 69 6e  st NTDB belongin
a8e0: 67 20 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20  g to trunk..    
a8f0: 41 4e 44 20 20 20 20 52 41 2e 72 69 64 20 3d 20  AND    RA.rid = 
a900: 52 2e 64 62 63 68 69 6c 64 20 20 20 20 20 20 2d  R.dbchild      -
a910: 2d 20 47 6f 20 64 69 72 65 63 74 6c 79 20 74 6f  - Go directly to
a920: 20 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20   trunk root..   
a930: 20 41 4e 44 20 20 20 20 52 41 2e 63 68 69 6c 64   AND    RA.child
a940: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
a950: 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 63  -- Has primary c
a960: 68 69 6c 64 2e 0a 20 20 20 20 20 20 20 20 20 20  hild..          
a970: 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69 64 20    AND    CI.iid 
a980: 3d 20 52 41 2e 63 68 69 6c 64 20 20 20 20 20 20  = RA.child      
a990: 20 2d 2d 20 53 65 6c 65 63 74 20 61 6c 6c 20 63   -- Select all c
a9a0: 68 61 6e 67 65 73 65 74 73 0a 20 20 20 20 20 20  hangesets.      
a9b0: 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e 63        AND    C.c
a9c0: 69 64 20 3d 20 43 49 2e 63 69 64 09 20 20 20 2d  id = CI.cid.   -
a9d0: 2d 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  - containing the
a9e0: 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 20   primary child. 
a9f0: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20             AND  
aa00: 20 20 43 2e 74 79 70 65 20 3d 20 30 09 09 20 20    C.type = 0..  
aa10: 20 2d 2d 20 77 68 69 63 68 20 61 72 65 20 72 65   -- which are re
aa20: 76 69 73 69 6f 6e 20 63 68 61 6e 67 65 73 65 74  vision changeset
aa30: 73 0a 20 20 20 20 55 4e 49 4f 4e 0a 09 20 20 20  s.    UNION..   
aa40: 20 53 45 4c 45 43 54 20 43 2e 63 69 64 0a 09 20   SELECT C.cid.. 
aa50: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69     FROM   revisi
aa60: 6f 6e 20 52 2c 20 74 61 67 20 54 2c 20 63 73 69  on R, tag T, csi
aa70: 74 65 6d 20 43 49 2c 20 63 68 61 6e 67 65 73 65  tem CI, changese
aa80: 74 20 43 0a 09 20 20 20 20 57 48 45 52 45 20 20  t C..    WHERE  
aa90: 52 2e 72 69 64 20 69 6e 20 24 74 68 65 73 65 74  R.rid in $theset
aaa0: 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72          -- Restr
aab0: 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73  ict to revisions
aac0: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20   of interest..  
aad0: 20 20 41 4e 44 20 20 20 20 54 2e 72 65 76 20 3d    AND    T.rev =
aae0: 20 52 2e 72 69 64 09 20 20 20 2d 2d 20 53 65 6c   R.rid.   -- Sel
aaf0: 65 63 74 20 74 61 67 73 20 61 74 74 61 63 68 65  ect tags attache
ab00: 64 20 74 6f 20 74 68 65 6d 0a 20 20 20 20 20 20  d to them.      
ab10: 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 49 2e        AND    CI.
ab20: 69 69 64 20 3d 20 54 2e 74 69 64 20 20 20 20 20  iid = T.tid     
ab30: 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 61       -- Select a
ab40: 6c 6c 20 63 68 61 6e 67 65 73 65 74 73 0a 20 20  ll changesets.  
ab50: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20            AND   
ab60: 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69 64 09   C.cid = CI.cid.
ab70: 20 20 20 2d 2d 20 63 6f 6e 74 61 69 6e 69 6e 67     -- containing
ab80: 20 74 68 65 20 74 61 67 73 0a 20 20 20 20 20 20   the tags.      
ab90: 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e 74        AND    C.t
aba0: 79 70 65 20 3d 20 31 09 09 20 20 20 2d 2d 20 77  ype = 1..   -- w
abb0: 68 69 63 68 20 61 72 65 20 74 61 67 20 63 68 61  hich are tag cha
abc0: 6e 67 65 73 65 74 73 0a 20 20 20 20 55 4e 49 4f  ngesets.    UNIO
abd0: 4e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 43 2e  N..    SELECT C.
abe0: 63 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  cid..    FROM   
abf0: 72 65 76 69 73 69 6f 6e 20 52 2c 20 62 72 61 6e  revision R, bran
ac00: 63 68 20 42 2c 20 63 73 69 74 65 6d 20 43 49 2c  ch B, csitem CI,
ac10: 20 63 68 61 6e 67 65 73 65 74 20 43 0a 09 20 20   changeset C..  
ac20: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 69    WHERE  R.rid i
ac30: 6e 20 24 74 68 65 73 65 74 20 20 20 20 20 20 20  n $theset       
ac40: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
ac50: 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74  revisions of int
ac60: 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20  erest..    AND  
ac70: 20 20 42 2e 72 6f 6f 74 20 3d 20 52 2e 72 69 64    B.root = R.rid
ac80: 09 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 62 72  .   -- Select br
ac90: 61 6e 63 68 65 73 20 61 74 74 61 63 68 65 64 20  anches attached 
aca0: 74 6f 20 74 68 65 6d 0a 20 20 20 20 20 20 20 20  to them.        
acb0: 20 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69      AND    CI.ii
acc0: 64 20 3d 20 42 2e 62 69 64 20 20 20 20 20 20 20  d = B.bid       
acd0: 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 61 6c 6c     -- Select all
ace0: 20 63 68 61 6e 67 65 73 65 74 73 0a 20 20 20 20   changesets.    
acf0: 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43          AND    C
ad00: 2e 63 69 64 20 3d 20 43 49 2e 63 69 64 09 20 20  .cid = CI.cid.  
ad10: 20 2d 2d 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   -- containing t
ad20: 68 65 20 62 72 61 6e 63 68 65 73 0a 20 20 20 20  he branches.    
ad30: 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43          AND    C
ad40: 2e 74 79 70 65 20 3d 20 32 09 09 20 20 20 2d 2d  .type = 2..   --
ad50: 20 77 68 69 63 68 20 61 72 65 20 62 72 61 6e 63   which are branc
ad60: 68 20 63 68 61 6e 67 65 73 65 74 73 0a 09 7d 5d  h changesets..}]
ad70: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72  ].    }..    # r
ad80: 65 73 75 6c 74 20 3d 20 73 79 6d 62 6f 6c 20 6e  esult = symbol n
ad90: 61 6d 65 0a 20 20 20 20 74 79 70 65 6d 65 74 68  ame.    typemeth
ada0: 6f 64 20 63 73 5f 6c 6f 64 20 7b 72 65 76 69 73  od cs_lod {revis
adb0: 69 6f 6e 73 7d 20 7b 0a 09 23 20 44 65 74 65 72  ions} {..# Deter
adc0: 6d 69 6e 65 73 20 74 68 65 20 6e 61 6d 65 20 6f  mines the name o
add0: 66 20 74 68 65 20 73 79 6d 62 6f 6c 20 77 68 69  f the symbol whi
ade0: 63 68 20 69 73 20 74 68 65 20 6c 69 6e 65 20 6f  ch is the line o
adf0: 66 0a 09 23 20 64 65 76 65 6c 6f 70 6d 65 6e 74  f..# development
ae00: 20 66 6f 72 20 74 68 65 20 72 65 76 69 73 69 6f   for the revisio
ae10: 6e 73 20 69 6e 20 61 20 63 68 61 6e 67 65 73 65  ns in a changese
ae20: 74 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20  t....set theset 
ae30: 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f  ('[join $revisio
ae40: 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74  ns {','}]')..ret
ae50: 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 5b  urn [state run [
ae60: 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64  subst -nocommand
ae70: 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73  s -nobackslashes
ae80: 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 0a 09   {..    SELECT..
ae90: 20 20 20 20 44 49 53 54 49 4e 43 54 20 4c 2e 6e      DISTINCT L.n
aea0: 61 6d 65 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  ame..    FROM   
aeb0: 72 65 76 69 73 69 6f 6e 20 52 2c 20 73 79 6d 62  revision R, symb
aec0: 6f 6c 20 4c 0a 09 20 20 20 20 57 48 45 52 45 20  ol L..    WHERE 
aed0: 20 52 2e 72 69 64 20 69 6e 20 24 74 68 65 73 65   R.rid in $these
aee0: 74 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74  t        -- Rest
aef0: 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e  rict to revision
af00: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20  s of interest.. 
af10: 20 20 20 41 4e 44 20 20 20 20 4c 2e 73 69 64 20     AND    L.sid 
af20: 3d 20 52 2e 6c 6f 64 20 20 20 20 20 20 20 20 20  = R.lod         
af30: 20 20 2d 2d 20 47 65 74 20 6c 6f 64 20 73 79 6d    -- Get lod sym
af40: 62 6f 6c 20 6f 66 20 72 65 76 69 73 69 6f 6e 0a  bol of revision.
af50: 09 7d 5d 5d 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20  .}]].    }.}..# 
af60: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23  # ## ### ##### #
af70: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
af80: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
af90: 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 48  ###########.## H
afa0: 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 2e  elper singleton.
afb0: 20 43 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 74 61   Commands for ta
afc0: 67 20 73 79 6d 62 6f 6c 20 63 68 61 6e 67 65 73  g symbol changes
afd0: 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 65  ets...snit::type
afe0: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
aff0: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a  mport::cvs::proj
b000: 65 63 74 3a 3a 72 65 76 3a 3a 73 79 6d 3a 3a 74  ect::rev::sym::t
b010: 61 67 20 7b 0a 20 20 20 20 74 79 70 65 6d 65 74  ag {.    typemet
b020: 68 6f 64 20 62 79 72 65 76 69 73 69 6f 6e 20 7b  hod byrevision {
b030: 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20  } { return 0 }. 
b040: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79     typemethod by
b050: 73 79 6d 62 6f 6c 20 20 20 7b 7d 20 7b 20 72 65  symbol   {} { re
b060: 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 79 70  turn 1 }.    typ
b070: 65 6d 65 74 68 6f 64 20 69 73 74 61 67 20 20 20  emethod istag   
b080: 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31     {} { return 1
b090: 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f   }.    typemetho
b0a0: 64 20 69 73 62 72 61 6e 63 68 20 20 20 7b 7d 20  d isbranch   {} 
b0b0: 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 0a 20 20  { return 0 }..  
b0c0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 73 74 72    typemethod str
b0d0: 20 7b 74 61 67 7d 20 7b 0a 09 73 74 72 75 63 74   {tag} {..struct
b0e0: 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b 73  ::list assign [s
b0f0: 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20  tate run {..    
b100: 53 45 4c 45 43 54 20 53 2e 6e 61 6d 65 2c 20 46  SELECT S.name, F
b110: 2e 6e 61 6d 65 2c 20 50 2e 6e 61 6d 65 0a 09 20  .name, P.name.. 
b120: 20 20 20 46 52 4f 4d 20 20 20 74 61 67 20 54 2c     FROM   tag T,
b130: 20 73 79 6d 62 6f 6c 20 53 2c 20 66 69 6c 65 20   symbol S, file 
b140: 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09 20 20  F, project P..  
b150: 20 20 57 48 45 52 45 20 20 54 2e 74 69 64 20 3d    WHERE  T.tid =
b160: 20 24 74 61 67 20 20 20 2d 2d 20 46 69 6e 64 20   $tag   -- Find 
b170: 73 70 65 63 69 66 69 65 64 20 74 61 67 0a 09 20  specified tag.. 
b180: 20 20 20 41 4e 44 20 20 20 20 46 2e 66 69 64 20     AND    F.fid 
b190: 3d 20 54 2e 66 69 64 20 20 2d 2d 20 47 65 74 20  = T.fid  -- Get 
b1a0: 66 69 6c 65 20 6f 66 20 74 61 67 0a 09 20 20 20  file of tag..   
b1b0: 20 41 4e 44 20 20 20 20 50 2e 70 69 64 20 3d 20   AND    P.pid = 
b1c0: 46 2e 70 69 64 20 20 2d 2d 20 47 65 74 20 70 72  F.pid  -- Get pr
b1d0: 6f 6a 65 63 74 20 6f 66 20 66 69 6c 65 0a 09 20  oject of file.. 
b1e0: 20 20 20 41 4e 44 20 20 20 20 53 2e 73 69 64 20     AND    S.sid 
b1f0: 3d 20 54 2e 73 69 64 20 20 2d 2d 20 47 65 74 20  = T.sid  -- Get 
b200: 73 79 6d 62 6f 6c 20 6f 66 20 74 61 67 0a 09 7d  symbol of tag..}
b210: 5d 20 73 6e 61 6d 65 20 66 6e 61 6d 65 20 70 6e  ] sname fname pn
b220: 61 6d 65 0a 09 72 65 74 75 72 6e 20 22 24 70 6e  ame..return "$pn
b230: 61 6d 65 2f 54 27 24 7b 73 6e 61 6d 65 7d 27 3a  ame/T'${sname}':
b240: 3a 24 66 6e 61 6d 65 22 0a 20 20 20 20 7d 0a 0a  :$fname".    }..
b250: 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c      # result = l
b260: 69 73 74 20 28 6d 69 6e 74 69 6d 65 2c 20 6d 61  ist (mintime, ma
b270: 78 74 69 6d 65 29 0a 20 20 20 20 74 79 70 65 6d  xtime).    typem
b280: 65 74 68 6f 64 20 74 69 6d 65 72 61 6e 67 65 20  ethod timerange 
b290: 7b 74 61 67 73 7d 20 7b 0a 09 23 20 54 68 65 20  {tags} {..# The 
b2a0: 72 61 6e 67 65 20 69 73 20 64 65 66 69 6e 65 64  range is defined
b2b0: 20 61 73 20 74 68 65 20 72 61 6e 67 65 20 6f 66   as the range of
b2c0: 20 74 68 65 20 72 65 76 69 73 69 6f 6e 73 20 74   the revisions t
b2d0: 68 65 20 74 61 67 73 0a 09 23 20 61 72 65 20 61  he tags..# are a
b2e0: 74 74 61 63 68 65 64 20 74 6f 2e 0a 0a 09 73 65  ttached to....se
b2f0: 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e  t theset ('[join
b300: 20 24 74 61 67 73 20 7b 27 2c 27 7d 5d 27 29 0a   $tags {','}]').
b310: 09 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72  .return [state r
b320: 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d  un [subst -nocom
b330: 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61  mands -nobacksla
b340: 73 68 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45  shes {..    SELE
b350: 43 54 20 4d 49 4e 28 52 2e 64 61 74 65 29 2c 20  CT MIN(R.date), 
b360: 4d 41 58 28 52 2e 64 61 74 65 29 0a 09 20 20 20  MAX(R.date)..   
b370: 20 46 52 4f 4d 20 20 20 74 61 67 20 54 2c 20 72   FROM   tag T, r
b380: 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57  evision R..    W
b390: 48 45 52 45 20 20 54 2e 74 69 64 20 49 4e 20 24  HERE  T.tid IN $
b3a0: 74 68 65 73 65 74 20 20 2d 2d 20 52 65 73 74 72  theset  -- Restr
b3b0: 69 63 74 20 74 6f 20 74 61 67 73 20 6f 66 20 69  ict to tags of i
b3c0: 6e 74 65 72 65 73 74 0a 20 20 20 20 20 20 20 20  nterest.        
b3d0: 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72 69 64      AND    R.rid
b3e0: 20 3d 20 54 2e 72 65 76 20 20 20 20 20 2d 2d 20   = T.rev     -- 
b3f0: 53 65 6c 65 63 74 20 74 61 67 20 70 61 72 65 6e  Select tag paren
b400: 74 20 72 65 76 69 73 69 6f 6e 73 0a 09 7d 5d 5d  t revisions..}]]
b410: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61  .    }..    # va
b420: 72 28 64 76 29 20 3d 20 64 69 63 74 20 28 69 74  r(dv) = dict (it
b430: 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d  em -> list (item
b440: 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74  )), item  = list
b450: 20 28 74 79 70 65 20 69 64 29 0a 20 20 20 20 74   (type id).    t
b460: 79 70 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73  ypemethod succes
b470: 73 6f 72 73 20 7b 64 76 20 74 61 67 73 7d 20 7b  sors {dv tags} {
b480: 0a 09 23 20 54 61 67 73 20 68 61 76 65 20 6e 6f  ..# Tags have no
b490: 20 73 75 63 63 65 73 73 6f 72 73 2e 0a 09 72 65   successors...re
b4a0: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
b4b0: 23 20 72 65 73 75 6c 74 20 3d 20 34 2d 6c 69 73  # result = 4-lis
b4c0: 74 20 28 69 74 65 6d 74 79 70 65 20 69 74 65 6d  t (itemtype item
b4d0: 69 64 20 6e 65 78 74 69 74 65 6d 74 79 70 65 20  id nextitemtype 
b4e0: 6e 65 78 74 69 74 65 6d 69 64 20 2e 2e 2e 29 0a  nextitemid ...).
b4f0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c      typemethod l
b500: 6f 6f 70 73 20 7b 74 61 67 73 7d 20 7b 0a 09 23  oops {tags} {..#
b510: 20 54 61 67 73 20 68 61 76 65 20 6e 6f 20 73 75   Tags have no su
b520: 63 63 65 73 73 6f 72 73 2c 20 74 68 65 72 65 66  ccessors, theref
b530: 6f 72 65 20 63 61 6e 6e 6f 74 20 63 61 75 73 65  ore cannot cause
b540: 20 6c 6f 6f 70 73 0a 09 72 65 74 75 72 6e 20 7b   loops..return {
b550: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72  }.    }..    # r
b560: 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 63 68  esult = list (ch
b570: 61 6e 67 65 73 65 74 2d 69 64 29 0a 20 20 20 20  angeset-id).    
b580: 74 79 70 65 6d 65 74 68 6f 64 20 63 73 5f 73 75  typemethod cs_su
b590: 63 63 65 73 73 6f 72 73 20 7b 74 61 67 73 7d 20  ccessors {tags} 
b5a0: 7b 0a 09 23 20 54 61 67 73 20 68 61 76 65 20 6e  {..# Tags have n
b5b0: 6f 20 73 75 63 63 65 73 73 6f 72 73 2e 0a 09 72  o successors...r
b5c0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
b5d0: 20 23 20 72 65 73 75 6c 74 20 3d 20 73 79 6d 62   # result = symb
b5e0: 6f 6c 20 6e 61 6d 65 0a 20 20 20 20 74 79 70 65  ol name.    type
b5f0: 6d 65 74 68 6f 64 20 63 73 5f 6c 6f 64 20 7b 74  method cs_lod {t
b600: 61 67 73 7d 20 7b 0a 09 23 20 44 65 74 65 72 6d  ags} {..# Determ
b610: 69 6e 65 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  ines the name of
b620: 20 74 68 65 20 73 79 6d 62 6f 6c 20 77 68 69 63   the symbol whic
b630: 68 20 69 73 20 74 68 65 20 6c 69 6e 65 20 6f 66  h is the line of
b640: 0a 09 23 20 64 65 76 65 6c 6f 70 6d 65 6e 74 20  ..# development 
b650: 66 6f 72 20 74 68 65 20 74 61 67 73 20 69 6e 20  for the tags in 
b660: 61 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 73  a changeset....s
b670: 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69  et theset ('[joi
b680: 6e 20 24 74 61 67 73 20 7b 27 2c 27 7d 5d 27 29  n $tags {','}]')
b690: 0a 09 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20  ..return [state 
b6a0: 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f  run [subst -noco
b6b0: 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c  mmands -nobacksl
b6c0: 61 73 68 65 73 20 7b 0a 09 20 20 20 20 53 45 4c  ashes {..    SEL
b6d0: 45 43 54 0a 09 20 20 20 20 44 49 53 54 49 4e 43  ECT..    DISTINC
b6e0: 54 20 4c 2e 6e 61 6d 65 0a 09 20 20 20 20 46 52  T L.name..    FR
b6f0: 4f 4d 20 20 20 74 61 67 20 54 2c 20 73 79 6d 62  OM   tag T, symb
b700: 6f 6c 20 4c 0a 09 20 20 20 20 57 48 45 52 45 20  ol L..    WHERE 
b710: 20 54 2e 74 69 64 20 69 6e 20 24 74 68 65 73 65   T.tid in $these
b720: 74 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74  t        -- Rest
b730: 72 69 63 74 20 74 6f 20 74 61 67 73 20 6f 66 20  rict to tags of 
b740: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e  interest..    AN
b750: 44 20 20 20 20 4c 2e 73 69 64 20 3d 20 54 2e 6c  D    L.sid = T.l
b760: 6f 64 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20  od           -- 
b770: 47 65 74 20 6c 6f 64 20 73 79 6d 62 6f 6c 20 6f  Get lod symbol o
b780: 66 20 74 61 67 0a 09 7d 5d 5d 0a 20 20 20 20 7d  f tag..}]].    }
b790: 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23  .}..# # ## ### #
b7a0: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23  #### ######## ##
b7b0: 23 23 23 23 23 23 23 23 23 23 23 20 23 23 23 23  ########### ####
b7c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b7d0: 23 0a 23 23 20 48 65 6c 70 65 72 20 73 69 6e 67  #.## Helper sing
b7e0: 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20  leton. Commands 
b7f0: 66 6f 72 20 62 72 61 6e 63 68 20 73 79 6d 62 6f  for branch symbo
b800: 6c 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73  l changesets...s
b810: 6e 69 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a  nit::type ::vc::
b820: 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a  fossil::import::
b830: 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65  cvs::project::re
b840: 76 3a 3a 73 79 6d 3a 3a 62 72 61 6e 63 68 20 7b  v::sym::branch {
b850: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
b860: 62 79 72 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 20  byrevision {} { 
b870: 72 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20 74  return 0 }.    t
b880: 79 70 65 6d 65 74 68 6f 64 20 62 79 73 79 6d 62  ypemethod bysymb
b890: 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e  ol   {} { return
b8a0: 20 31 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74   1 }.    typemet
b8b0: 68 6f 64 20 69 73 74 61 67 20 20 20 20 20 20 7b  hod istag      {
b8c0: 7d 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20  } { return 0 }. 
b8d0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73     typemethod is
b8e0: 62 72 61 6e 63 68 20 20 20 7b 7d 20 7b 20 72 65  branch   {} { re
b8f0: 74 75 72 6e 20 31 20 7d 0a 0a 20 20 20 20 74 79  turn 1 }..    ty
b900: 70 65 6d 65 74 68 6f 64 20 73 74 72 20 7b 62 72  pemethod str {br
b910: 61 6e 63 68 7d 20 7b 0a 09 73 74 72 75 63 74 3a  anch} {..struct:
b920: 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b 73 74  :list assign [st
b930: 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 53  ate run {..    S
b940: 45 4c 45 43 54 20 53 2e 6e 61 6d 65 2c 20 46 2e  ELECT S.name, F.
b950: 6e 61 6d 65 2c 20 50 2e 6e 61 6d 65 0a 09 20 20  name, P.name..  
b960: 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20    FROM   branch 
b970: 42 2c 20 73 79 6d 62 6f 6c 20 53 2c 20 66 69 6c  B, symbol S, fil
b980: 65 20 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09  e F, project P..
b990: 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 64      WHERE  B.bid
b9a0: 20 3d 20 24 62 72 61 6e 63 68 20 20 2d 2d 20 46   = $branch  -- F
b9b0: 69 6e 64 20 73 70 65 63 69 66 69 65 64 20 62 72  ind specified br
b9c0: 61 6e 63 68 0a 09 20 20 20 20 41 4e 44 20 20 20  anch..    AND   
b9d0: 20 46 2e 66 69 64 20 3d 20 42 2e 66 69 64 20 20   F.fid = B.fid  
b9e0: 20 20 2d 2d 20 47 65 74 20 66 69 6c 65 20 6f 66    -- Get file of
b9f0: 20 62 72 61 6e 63 68 0a 09 20 20 20 20 41 4e 44   branch..    AND
ba00: 20 20 20 20 50 2e 70 69 64 20 3d 20 46 2e 70 69      P.pid = F.pi
ba10: 64 20 20 20 20 2d 2d 20 47 65 74 20 70 72 6f 6a  d    -- Get proj
ba20: 65 63 74 20 6f 66 20 66 69 6c 65 0a 09 20 20 20  ect of file..   
ba30: 20 41 4e 44 20 20 20 20 53 2e 73 69 64 20 3d 20   AND    S.sid = 
ba40: 42 2e 73 69 64 20 20 20 20 2d 2d 20 47 65 74 20  B.sid    -- Get 
ba50: 73 79 6d 62 6f 6c 20 6f 66 20 62 72 61 6e 63 68  symbol of branch
ba60: 0a 09 7d 5d 20 73 6e 61 6d 65 20 66 6e 61 6d 65  ..}] sname fname
ba70: 20 70 6e 61 6d 65 0a 09 72 65 74 75 72 6e 20 22   pname..return "
ba80: 24 70 6e 61 6d 65 2f 42 27 24 7b 73 6e 61 6d 65  $pname/B'${sname
ba90: 7d 27 3a 3a 24 66 6e 61 6d 65 22 0a 20 20 20 20  }'::$fname".    
baa0: 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20  }..    # result 
bab0: 3d 20 6c 69 73 74 20 28 6d 69 6e 74 69 6d 65 2c  = list (mintime,
bac0: 20 6d 61 78 74 69 6d 65 29 0a 20 20 20 20 74 79   maxtime).    ty
bad0: 70 65 6d 65 74 68 6f 64 20 74 69 6d 65 72 61 6e  pemethod timeran
bae0: 67 65 20 7b 62 72 61 6e 63 68 65 73 7d 20 7b 0a  ge {branches} {.
baf0: 09 23 20 54 68 65 20 72 61 6e 67 65 20 6f 66 20  .# The range of 
bb00: 61 20 62 72 61 6e 63 68 20 69 73 20 64 65 66 69  a branch is defi
bb10: 6e 65 64 20 61 73 20 74 68 65 20 72 61 6e 67 65  ned as the range
bb20: 20 6f 66 20 74 68 65 0a 09 23 20 72 65 76 69 73   of the..# revis
bb30: 69 6f 6e 73 20 74 68 65 20 62 72 61 6e 63 68 65  ions the branche
bb40: 73 20 61 72 65 20 73 70 61 77 6e 65 64 20 62 79  s are spawned by
bb50: 2e 20 4e 4f 54 45 20 68 6f 77 65 76 65 72 20 74  . NOTE however t
bb60: 68 61 74 20 74 68 65 0a 09 23 20 62 72 61 6e 63  hat the..# branc
bb70: 68 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77  hes associated w
bb80: 69 74 68 20 61 20 64 65 74 61 63 68 65 64 20 4e  ith a detached N
bb90: 54 44 42 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f  TDB will have no
bba0: 20 72 6f 6f 74 0a 09 23 20 73 70 61 77 6e 69 6e   root..# spawnin
bbb0: 67 20 74 68 65 6d 2c 20 68 65 6e 63 65 20 74 68  g them, hence th
bbc0: 65 79 20 68 61 76 65 20 6e 6f 20 72 65 61 6c 20  ey have no real 
bbd0: 74 69 6d 65 72 61 6e 67 65 20 61 6e 79 0a 09 23  timerange any..#
bbe0: 20 6c 6f 6e 67 65 72 2e 20 42 79 20 75 73 69 6e   longer. By usin
bbf0: 67 20 30 20 77 65 20 70 75 74 20 74 68 65 6d 20  g 0 we put them 
bc00: 69 6e 20 66 72 6f 6e 74 20 6f 66 20 65 76 65 72  in front of ever
bc10: 79 74 68 69 6e 67 20 65 6c 73 65 2c 0a 09 23 20  ything else,..# 
bc20: 61 73 20 74 68 65 79 20 6c 6f 67 69 63 61 6c 6c  as they logicall
bc30: 79 20 61 72 65 2e 0a 0a 09 73 65 74 20 74 68 65  y are....set the
bc40: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61  set ('[join $bra
bc50: 6e 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 09  nches {','}]')..
bc60: 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75  return [state ru
bc70: 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d  n [subst -nocomm
bc80: 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73  ands -nobackslas
bc90: 68 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45 43  hes {..    SELEC
bca0: 54 20 49 46 4e 55 4c 4c 28 4d 49 4e 28 52 2e 64  T IFNULL(MIN(R.d
bcb0: 61 74 65 29 2c 30 29 2c 20 49 46 4e 55 4c 4c 28  ate),0), IFNULL(
bcc0: 4d 41 58 28 52 2e 64 61 74 65 29 2c 30 29 0a 09  MAX(R.date),0)..
bcd0: 20 20 20 20 46 52 4f 4d 20 20 62 72 61 6e 63 68      FROM  branch
bce0: 20 42 2c 20 72 65 76 69 73 69 6f 6e 20 52 0a 09   B, revision R..
bcf0: 20 20 20 20 57 48 45 52 45 20 42 2e 62 69 64 20      WHERE B.bid 
bd00: 49 4e 20 24 74 68 65 73 65 74 20 20 20 2d 2d 20  IN $theset   -- 
bd10: 52 65 73 74 72 69 63 74 20 74 6f 20 62 72 61 6e  Restrict to bran
bd20: 63 68 65 73 20 6f 66 20 69 6e 74 65 72 65 73 74  ches of interest
bd30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44  .            AND
bd40: 20 20 20 52 2e 72 69 64 20 3d 20 42 2e 72 6f 6f     R.rid = B.roo
bd50: 74 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20  t     -- Select 
bd60: 62 72 61 6e 63 68 20 70 61 72 65 6e 74 20 72 65  branch parent re
bd70: 76 69 73 69 6f 6e 73 0a 09 7d 5d 5d 0a 20 20 20  visions..}]].   
bd80: 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74   }..    # result
bd90: 20 3d 20 34 2d 6c 69 73 74 20 28 69 74 65 6d 74   = 4-list (itemt
bda0: 79 70 65 20 69 74 65 6d 69 64 20 6e 65 78 74 69  ype itemid nexti
bdb0: 74 65 6d 74 79 70 65 20 6e 65 78 74 69 74 65 6d  temtype nextitem
bdc0: 69 64 20 2e 2e 2e 29 0a 20 20 20 20 74 79 70 65  id ...).    type
bdd0: 6d 65 74 68 6f 64 20 6c 6f 6f 70 73 20 7b 62 72  method loops {br
bde0: 61 6e 63 68 65 73 7d 20 7b 0a 09 23 20 4e 6f 74  anches} {..# Not
bdf0: 65 3a 20 52 65 76 69 73 69 6f 6e 73 20 61 6e 64  e: Revisions and
be00: 20 74 61 67 73 20 63 61 6e 6e 6f 74 20 63 61 75   tags cannot cau
be10: 73 65 20 74 68 65 20 6c 6f 6f 70 2e 20 42 65 69  se the loop. Bei
be20: 6e 67 20 6f 66 20 61 0a 09 23 20 66 75 6e 64 61  ng of a..# funda
be30: 6d 65 6e 74 61 6c 6c 79 20 64 69 66 66 65 72 65  mentally differe
be40: 6e 74 20 74 79 70 65 20 74 68 65 79 20 63 61 6e  nt type they can
be50: 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20 69 6e  not be in the in
be60: 63 6f 6d 69 6e 67 0a 09 23 20 73 65 74 20 6f 66  coming..# set of
be70: 20 69 64 73 2e 0a 0a 09 73 65 74 20 74 68 65 73   ids....set thes
be80: 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61 6e  et ('[join $bran
be90: 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72  ches {','}]')..r
bea0: 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e  eturn [state run
beb0: 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61   [subst -nocomma
bec0: 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68  nds -nobackslash
bed0: 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54  es {..    SELECT
bee0: 20 42 2e 62 69 64 2c 20 42 58 2e 62 69 64 0a 09   B.bid, BX.bid..
bef0: 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63      FROM   branc
bf00: 68 20 42 2c 20 70 72 65 66 65 72 65 64 70 61 72  h B, preferedpar
bf10: 65 6e 74 20 50 2c 20 62 72 61 6e 63 68 20 42 58  ent P, branch BX
bf20: 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62  ..    WHERE  B.b
bf30: 69 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20  id IN $theset   
bf40: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 62  -- Restrict to b
bf50: 72 61 6e 63 68 65 73 20 6f 66 20 69 6e 74 65 72  ranches of inter
bf60: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  est..    AND    
bf70: 42 2e 73 69 64 20 3d 20 50 2e 70 69 64 20 20 20  B.sid = P.pid   
bf80: 20 20 20 2d 2d 20 47 65 74 20 74 68 65 20 70 72     -- Get the pr
bf90: 65 66 65 72 65 64 20 62 72 61 6e 63 68 65 73 20  efered branches 
bfa0: 76 69 61 0a 09 20 20 20 20 41 4e 44 20 20 20 20  via..    AND    
bfb0: 42 58 2e 73 69 64 20 3d 20 50 2e 73 69 64 20 20  BX.sid = P.sid  
bfc0: 20 20 20 2d 2d 20 74 68 65 20 62 72 61 6e 63 68     -- the branch
bfd0: 20 73 79 6d 62 6f 6c 73 0a 09 20 20 20 20 41 4e   symbols..    AN
bfe0: 44 20 20 20 20 42 58 2e 62 69 64 20 49 4e 20 24  D    BX.bid IN $
bff0: 74 68 65 73 65 74 20 20 2d 2d 20 4c 6f 6f 70 0a  theset  -- Loop.
c000: 09 7d 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  .}]].    }..    
c010: 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74  # var(dv) = dict
c020: 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28   (item -> list (
c030: 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20  item)), item  = 
c040: 6c 69 73 74 20 28 74 79 70 65 20 69 64 29 0a 20  list (type id). 
c050: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 73 75     typemethod su
c060: 63 63 65 73 73 6f 72 73 20 7b 64 76 20 62 72 61  ccessors {dv bra
c070: 6e 63 68 65 73 7d 20 7b 0a 09 75 70 76 61 72 20  nches} {..upvar 
c080: 31 20 24 64 76 20 64 65 70 65 6e 64 65 6e 63 69  1 $dv dependenci
c090: 65 73 0a 09 23 20 54 68 65 20 66 69 72 73 74 20  es..# The first 
c0a0: 72 65 76 69 73 69 6f 6e 20 63 6f 6d 6d 69 74 74  revision committ
c0b0: 65 64 20 6f 6e 20 61 20 62 72 61 6e 63 68 2c 20  ed on a branch, 
c0c0: 61 6e 64 20 61 6c 6c 20 62 72 61 6e 63 68 65 73  and all branches
c0d0: 0a 09 23 20 61 6e 64 20 74 61 67 73 20 77 68 69  ..# and tags whi
c0e0: 63 68 20 68 61 76 65 20 69 74 20 61 73 20 74 68  ch have it as th
c0f0: 65 69 72 20 70 72 65 66 65 72 65 64 20 70 61 72  eir prefered par
c100: 65 6e 74 20 61 72 65 20 74 68 65 0a 09 23 20 73  ent are the..# s
c110: 75 63 63 65 73 73 6f 72 73 20 6f 66 20 61 20 62  uccessors of a b
c120: 72 61 6e 63 68 2e 0a 0a 09 73 65 74 20 74 68 65  ranch....set the
c130: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61  set ('[join $bra
c140: 6e 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 09  nches {','}]')..
c150: 66 6f 72 65 61 63 68 20 7b 62 69 64 20 63 68 69  foreach {bid chi
c160: 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 5b  ld} [state run [
c170: 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64  subst -nocommand
c180: 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73  s -nobackslashes
c190: 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42   {..    SELECT B
c1a0: 2e 62 69 64 2c 20 52 2e 72 69 64 0a 09 20 20 20  .bid, R.rid..   
c1b0: 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42   FROM   branch B
c1c0: 2c 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20  , revision R..  
c1d0: 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49    WHERE  B.bid I
c1e0: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d  N $theset     --
c1f0: 20 52 65 73 74 72 69 63 74 20 74 6f 20 62 72 61   Restrict to bra
c200: 6e 63 68 65 73 20 6f 66 20 69 6e 74 65 72 65 73  nches of interes
c210: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e  t..    AND    B.
c220: 66 69 72 73 74 20 3d 20 52 2e 72 69 64 20 20 20  first = R.rid   
c230: 20 20 20 2d 2d 20 47 65 74 20 66 69 72 73 74 20     -- Get first 
c240: 72 65 76 69 73 69 6f 6e 20 6f 6e 20 74 68 65 20  revision on the 
c250: 62 72 61 6e 63 68 0a 09 7d 5d 5d 20 7b 0a 09 20  branch..}]] {.. 
c260: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e     lappend depen
c270: 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79  dencies([list sy
c280: 6d 3a 3a 62 72 61 6e 63 68 20 24 62 69 64 5d 29  m::branch $bid])
c290: 20 5b 6c 69 73 74 20 72 65 76 20 24 63 68 69 6c   [list rev $chil
c2a0: 64 5d 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b  d]..}..foreach {
c2b0: 62 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74  bid child} [stat
c2c0: 65 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f  e run [subst -no
c2d0: 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b  commands -noback
c2e0: 73 6c 61 73 68 65 73 20 7b 0a 09 20 20 20 20 53  slashes {..    S
c2f0: 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 42 58 2e  ELECT B.bid, BX.
c300: 62 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  bid..    FROM   
c310: 62 72 61 6e 63 68 20 42 2c 20 70 72 65 66 65 72  branch B, prefer
c320: 65 64 70 61 72 65 6e 74 20 50 2c 20 62 72 61 6e  edparent P, bran
c330: 63 68 20 42 58 0a 09 20 20 20 20 57 48 45 52 45  ch BX..    WHERE
c340: 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73    B.bid IN $thes
c350: 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69  et     -- Restri
c360: 63 74 20 74 6f 20 62 72 61 6e 63 68 65 73 20 6f  ct to branches o
c370: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20  f interest..    
c380: 41 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50  AND    B.sid = P
c390: 2e 70 69 64 20 20 20 20 20 20 20 20 2d 2d 20 47  .pid        -- G
c3a0: 65 74 20 73 75 62 6f 72 64 69 6e 61 74 65 20 62  et subordinate b
c3b0: 72 61 6e 63 68 65 73 20 76 69 61 20 74 68 65 0a  ranches via the.
c3c0: 09 20 20 20 20 41 4e 44 20 20 20 20 42 58 2e 73  .    AND    BX.s
c3d0: 69 64 20 3d 20 50 2e 73 69 64 20 20 20 20 20 20  id = P.sid      
c3e0: 20 2d 2d 20 70 72 65 66 65 72 65 64 20 70 61 72   -- prefered par
c3f0: 65 6e 74 73 20 6f 66 20 74 68 65 69 72 20 73 79  ents of their sy
c400: 6d 62 6f 6c 73 0a 09 7d 5d 5d 20 7b 0a 09 20 20  mbols..}]] {..  
c410: 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64    lappend depend
c420: 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d  encies([list sym
c430: 3a 3a 62 72 61 6e 63 68 20 24 62 69 64 5d 29 20  ::branch $bid]) 
c440: 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63  [list sym::branc
c450: 68 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f  h $child]..}..fo
c460: 72 65 61 63 68 20 7b 62 69 64 20 63 68 69 6c 64  reach {bid child
c470: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75  } [state run [su
c480: 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20  bst -nocommands 
c490: 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b  -nobackslashes {
c4a0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62  ..    SELECT B.b
c4b0: 69 64 2c 20 54 2e 74 69 64 0a 09 20 20 20 20 46  id, T.tid..    F
c4c0: 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20  ROM   branch B, 
c4d0: 70 72 65 66 65 72 65 64 70 61 72 65 6e 74 20 50  preferedparent P
c4e0: 2c 20 74 61 67 20 54 0a 09 20 20 20 20 57 48 45  , tag T..    WHE
c4f0: 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68  RE  B.bid IN $th
c500: 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74  eset     -- Rest
c510: 72 69 63 74 20 74 6f 20 62 72 61 6e 63 68 65 73  rict to branches
c520: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20   of interest..  
c530: 20 20 41 4e 44 20 20 20 20 42 2e 73 69 64 20 3d    AND    B.sid =
c540: 20 50 2e 70 69 64 20 20 20 20 20 20 20 20 2d 2d   P.pid        --
c550: 20 47 65 74 20 73 75 62 6f 72 64 69 6e 61 74 65   Get subordinate
c560: 20 74 61 67 73 20 76 69 61 20 74 68 65 0a 09 20   tags via the.. 
c570: 20 20 20 41 4e 44 20 20 20 20 54 2e 73 69 64 20     AND    T.sid 
c580: 3d 20 50 2e 73 69 64 20 20 20 20 20 20 20 20 2d  = P.sid        -
c590: 2d 20 70 72 65 66 65 72 65 64 20 70 61 72 65 6e  - prefered paren
c5a0: 74 73 20 6f 66 20 74 68 65 69 72 20 73 79 6d 62  ts of their symb
c5b0: 6f 6c 73 0a 09 7d 5d 5d 20 7b 0a 09 20 20 20 20  ols..}]] {..    
c5c0: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e  lappend dependen
c5d0: 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a  cies([list sym::
c5e0: 62 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c  branch $bid]) [l
c5f0: 69 73 74 20 73 79 6d 3a 3a 74 61 67 20 24 63 68  ist sym::tag $ch
c600: 69 6c 64 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a  ild]..}..return.
c610: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73      }..    # res
c620: 75 6c 74 20 3d 20 6c 69 73 74 20 28 63 68 61 6e  ult = list (chan
c630: 67 65 73 65 74 2d 69 64 29 0a 20 20 20 20 74 79  geset-id).    ty
c640: 70 65 6d 65 74 68 6f 64 20 63 73 5f 73 75 63 63  pemethod cs_succ
c650: 65 73 73 6f 72 73 20 7b 62 72 61 6e 63 68 65 73  essors {branches
c660: 7d 20 7b 0a 20 20 20 20 20 20 20 20 23 20 54 68  } {.        # Th
c670: 69 73 20 69 73 20 61 20 76 61 72 69 61 6e 74 20  is is a variant 
c680: 6f 66 20 27 73 75 63 63 65 73 73 6f 72 73 27 20  of 'successors' 
c690: 77 68 69 63 68 20 6d 61 70 73 20 74 68 65 20 6c  which maps the l
c6a0: 6f 77 2d 6c 65 76 65 6c 0a 20 20 20 20 20 20 20  ow-level.       
c6b0: 20 23 20 64 61 74 61 20 64 69 72 65 63 74 6c 79   # data directly
c6c0: 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74   to the associat
c6d0: 65 64 20 63 68 61 6e 67 65 73 65 74 73 2e 20 49  ed changesets. I
c6e0: 2e 65 2e 20 69 6e 73 74 65 61 64 0a 20 20 20 20  .e. instead.    
c6f0: 20 20 20 20 23 20 6d 69 6c 6c 69 6f 6e 73 20 6f      # millions o
c700: 66 20 64 65 70 65 6e 64 65 6e 63 79 20 70 61 69  f dependency pai
c710: 72 73 20 28 69 6e 20 65 78 74 72 65 6d 65 20 63  rs (in extreme c
c720: 61 73 65 73 20 28 45 78 61 6d 70 6c 65 3a 20 54  ases (Example: T
c730: 63 6c 0a 20 20 20 20 20 20 20 20 23 20 43 56 53  cl.        # CVS
c740: 29 29 20 77 65 20 72 65 74 75 72 6e 20 61 20 76  )) we return a v
c750: 65 72 79 20 73 68 6f 72 74 20 61 6e 64 20 6d 75  ery short and mu
c760: 63 68 20 6d 6f 72 65 20 6d 61 6e 61 67 65 61 62  ch more manageab
c770: 6c 65 20 6c 69 73 74 0a 20 20 20 20 20 20 20 20  le list.        
c780: 23 20 6f 66 20 63 68 61 6e 67 65 73 65 74 73 2e  # of changesets.
c790: 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27  ...set theset ('
c7a0: 5b 6a 6f 69 6e 20 24 62 72 61 6e 63 68 65 73 20  [join $branches 
c7b0: 7b 27 2c 27 7d 5d 27 29 0a 20 20 20 20 20 20 20  {','}]').       
c7c0: 20 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72   return [state r
c7d0: 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d  un [subst -nocom
c7e0: 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61  mands -nobacksla
c7f0: 73 68 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45  shes {..    SELE
c800: 43 54 20 43 2e 63 69 64 0a 09 20 20 20 20 46 52  CT C.cid..    FR
c810: 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20 72  OM   branch B, r
c820: 65 76 69 73 69 6f 6e 20 52 2c 20 63 73 69 74 65  evision R, csite
c830: 6d 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20  m CI, changeset 
c840: 43 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e  C..    WHERE  B.
c850: 62 69 64 20 49 4e 20 24 74 68 65 73 65 74 20 20  bid IN $theset  
c860: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74     -- Restrict t
c870: 6f 20 62 72 61 6e 63 68 65 73 20 6f 66 20 69 6e  o branches of in
c880: 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20  terest..    AND 
c890: 20 20 20 42 2e 66 69 72 73 74 20 3d 20 52 2e 72     B.first = R.r
c8a0: 69 64 09 2d 2d 20 47 65 74 20 66 69 72 73 74 20  id.-- Get first 
c8b0: 72 65 76 69 73 69 6f 6e 20 6f 6e 20 74 68 65 20  revision on the 
c8c0: 62 72 61 6e 63 68 0a 20 20 20 20 20 20 20 20 20  branch.         
c8d0: 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69 64     AND    CI.iid
c8e0: 20 3d 20 52 2e 72 69 64 20 20 20 20 20 20 20 2d   = R.rid       -
c8f0: 2d 20 53 65 6c 65 63 74 20 61 6c 6c 20 63 68 61  - Select all cha
c900: 6e 67 65 73 65 74 73 0a 20 20 20 20 20 20 20 20  ngesets.        
c910: 20 20 20 20 41 4e 44 20 20 20 20 43 2e 63 69 64      AND    C.cid
c920: 20 3d 20 43 49 2e 63 69 64 09 2d 2d 20 63 6f 6e   = CI.cid.-- con
c930: 74 61 69 6e 69 6e 67 20 74 68 69 73 20 72 65 76  taining this rev
c940: 69 73 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20  ision.          
c950: 20 20 41 4e 44 20 20 20 20 43 2e 74 79 70 65 20    AND    C.type 
c960: 3d 20 30 09 09 2d 2d 20 77 68 69 63 68 20 61 72  = 0..-- which ar
c970: 65 20 72 65 76 69 73 69 6f 6e 20 63 68 61 6e 67  e revision chang
c980: 65 73 65 74 73 0a 20 20 20 20 55 4e 49 4f 4e 0a  esets.    UNION.
c990: 09 20 20 20 20 53 45 4c 45 43 54 20 43 2e 63 69  .    SELECT C.ci
c9a0: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72  d..    FROM   br
c9b0: 61 6e 63 68 20 42 2c 20 70 72 65 66 65 72 65 64  anch B, prefered
c9c0: 70 61 72 65 6e 74 20 50 2c 20 62 72 61 6e 63 68  parent P, branch
c9d0: 20 42 58 2c 20 63 73 69 74 65 6d 20 43 49 2c 20   BX, csitem CI, 
c9e0: 63 68 61 6e 67 65 73 65 74 20 43 0a 09 20 20 20  changeset C..   
c9f0: 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e   WHERE  B.bid IN
ca00: 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20   $theset     -- 
ca10: 52 65 73 74 72 69 63 74 20 74 6f 20 62 72 61 6e  Restrict to bran
ca20: 63 68 65 73 20 6f 66 20 69 6e 74 65 72 65 73 74  ches of interest
ca30: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 73  ..    AND    B.s
ca40: 69 64 20 3d 20 50 2e 70 69 64 09 2d 2d 20 47 65  id = P.pid.-- Ge
ca50: 74 20 73 75 62 6f 72 64 69 6e 61 74 65 20 62 72  t subordinate br
ca60: 61 6e 63 68 65 73 20 76 69 61 20 74 68 65 0a 09  anches via the..
ca70: 20 20 20 20 41 4e 44 20 20 20 20 42 58 2e 73 69      AND    BX.si
ca80: 64 20 3d 20 50 2e 73 69 64 09 2d 2d 20 70 72 65  d = P.sid.-- pre
ca90: 66 65 72 65 64 20 70 61 72 65 6e 74 73 20 6f 66  fered parents of
caa0: 20 74 68 65 69 72 20 73 79 6d 62 6f 6c 73 0a 20   their symbols. 
cab0: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20             AND  
cac0: 20 20 43 49 2e 69 69 64 20 3d 20 42 58 2e 62 69    CI.iid = BX.bi
cad0: 64 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74  d      -- Select
cae0: 20 61 6c 6c 20 63 68 61 6e 67 65 73 65 74 73 0a   all changesets.
caf0: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
cb00: 20 20 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69     C.cid = CI.ci
cb10: 64 09 2d 2d 20 63 6f 6e 74 61 69 6e 69 6e 67 20  d.-- containing 
cb20: 74 68 65 20 73 75 62 6f 72 64 69 6e 61 74 65 20  the subordinate 
cb30: 62 72 61 6e 63 68 65 73 0a 20 20 20 20 20 20 20  branches.       
cb40: 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e 74 79       AND    C.ty
cb50: 70 65 20 3d 20 32 09 09 2d 2d 20 77 68 69 63 68  pe = 2..-- which
cb60: 20 61 72 65 20 62 72 61 6e 63 68 20 63 68 61 6e   are branch chan
cb70: 67 65 73 65 74 73 0a 20 20 20 20 55 4e 49 4f 4e  gesets.    UNION
cb80: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 43 2e 63  ..    SELECT C.c
cb90: 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62  id..    FROM   b
cba0: 72 61 6e 63 68 20 42 2c 20 70 72 65 66 65 72 65  ranch B, prefere
cbb0: 64 70 61 72 65 6e 74 20 50 2c 20 74 61 67 20 54  dparent P, tag T
cbc0: 2c 20 63 73 69 74 65 6d 20 43 49 2c 20 63 68 61  , csitem CI, cha
cbd0: 6e 67 65 73 65 74 20 43 0a 09 20 20 20 20 57 48  ngeset C..    WH
cbe0: 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74  ERE  B.bid IN $t
cbf0: 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73  heset     -- Res
cc00: 74 72 69 63 74 20 74 6f 20 62 72 61 6e 63 68 65  trict to branche
cc10: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20  s of interest.. 
cc20: 20 20 20 41 4e 44 20 20 20 20 42 2e 73 69 64 20     AND    B.sid 
cc30: 3d 20 50 2e 70 69 64 09 2d 2d 20 47 65 74 20 73  = P.pid.-- Get s
cc40: 75 62 6f 72 64 69 6e 61 74 65 20 74 61 67 73 20  ubordinate tags 
cc50: 76 69 61 20 74 68 65 0a 09 20 20 20 20 41 4e 44  via the..    AND
cc60: 20 20 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 69      T.sid = P.si
cc70: 64 09 2d 2d 20 70 72 65 66 65 72 65 64 20 70 61  d.-- prefered pa
cc80: 72 65 6e 74 73 20 6f 66 20 74 68 65 69 72 20 73  rents of their s
cc90: 79 6d 62 6f 6c 73 0a 20 20 20 20 20 20 20 20 20  ymbols.         
cca0: 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69 64     AND    CI.iid
ccb0: 20 3d 20 54 2e 74 69 64 20 20 20 20 20 20 20 2d   = T.tid       -
ccc0: 2d 20 53 65 6c 65 63 74 20 61 6c 6c 20 63 68 61  - Select all cha
ccd0: 6e 67 65 73 65 74 73 0a 20 20 20 20 20 20 20 20  ngesets.        
cce0: 20 20 20 20 41 4e 44 20 20 20 20 43 2e 63 69 64      AND    C.cid
ccf0: 20 3d 20 43 49 2e 63 69 64 09 2d 2d 20 63 6f 6e   = CI.cid.-- con
cd00: 74 61 69 6e 69 6e 67 20 74 68 65 20 73 75 62 6f  taining the subo
cd10: 72 64 69 6e 61 74 65 20 74 61 67 73 0a 20 20 20  rdinate tags.   
cd20: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20           AND    
cd30: 43 2e 74 79 70 65 20 3d 20 31 09 09 2d 2d 20 77  C.type = 1..-- w
cd40: 68 69 63 68 20 61 72 65 20 74 61 67 20 63 68 61  hich are tag cha
cd50: 6e 67 65 73 65 74 73 0a 09 7d 5d 5d 0a 09 72 65  ngesets..}]]..re
cd60: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
cd70: 23 20 72 65 73 75 6c 74 20 3d 20 73 79 6d 62 6f  # result = symbo
cd80: 6c 20 6e 61 6d 65 0a 20 20 20 20 74 79 70 65 6d  l name.    typem
cd90: 65 74 68 6f 64 20 63 73 5f 6c 6f 64 20 7b 62 72  ethod cs_lod {br
cda0: 61 6e 63 68 65 73 7d 20 7b 0a 09 23 20 44 65 74  anches} {..# Det
cdb0: 65 72 6d 69 6e 65 73 20 74 68 65 20 6e 61 6d 65  ermines the name
cdc0: 20 6f 66 20 74 68 65 20 73 79 6d 62 6f 6c 20 77   of the symbol w
cdd0: 68 69 63 68 20 69 73 20 74 68 65 20 6c 69 6e 65  hich is the line
cde0: 20 6f 66 0a 09 23 20 64 65 76 65 6c 6f 70 6d 65   of..# developme
cdf0: 6e 74 20 66 6f 72 20 74 68 65 20 62 72 61 6e 63  nt for the branc
ce00: 68 65 73 20 69 6e 20 61 20 63 68 61 6e 67 65 73  hes in a changes
ce10: 65 74 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74  et....set theset
ce20: 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61 6e 63 68   ('[join $branch
ce30: 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74  es {','}]')..ret
ce40: 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 5b  urn [state run [
ce50: 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64  subst -nocommand
ce60: 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73  s -nobackslashes
ce70: 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 0a 09   {..    SELECT..
ce80: 20 20 20 20 44 49 53 54 49 4e 43 54 20 4c 2e 6e      DISTINCT L.n
ce90: 61 6d 65 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  ame..    FROM   
cea0: 62 72 61 6e 63 68 20 42 2c 20 73 79 6d 62 6f 6c  branch B, symbol
ceb0: 20 4c 0a 09 20 20 20 20 57 48 45 52 45 20 20 42   L..    WHERE  B
cec0: 2e 62 69 64 20 69 6e 20 24 74 68 65 73 65 74 20  .bid in $theset 
ced0: 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69         -- Restri
cee0: 63 74 20 74 6f 20 62 72 61 6e 63 68 65 73 20 6f  ct to branches o
cef0: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20  f interest..    
cf00: 41 4e 44 20 20 20 20 4c 2e 73 69 64 20 3d 20 42  AND    L.sid = B
cf10: 2e 6c 6f 64 20 20 20 20 20 20 20 20 20 20 20 2d  .lod           -
cf20: 2d 20 47 65 74 20 6c 6f 64 20 73 79 6d 62 6f 6c  - Get lod symbol
cf30: 20 6f 66 20 62 72 61 6e 63 68 0a 09 7d 5d 5d 0a   of branch..}]].
cf40: 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d      }..    typem
cf50: 65 74 68 6f 64 20 6c 69 6d 69 74 73 20 7b 62 72  ethod limits {br
cf60: 61 6e 63 68 65 73 7d 20 7b 0a 09 23 20 4e 6f 74  anches} {..# Not
cf70: 65 73 2e 20 54 68 69 73 20 6d 65 74 68 6f 64 20  es. This method 
cf80: 65 78 69 73 74 73 20 6f 6e 6c 79 20 66 6f 72 20  exists only for 
cf90: 62 72 61 6e 63 68 65 73 2e 20 49 74 20 69 73 20  branches. It is 
cfa0: 6e 65 65 64 65 64 20 74 6f 0a 09 23 20 67 65 74  needed to..# get
cfb0: 20 64 65 74 61 69 6c 65 64 20 69 6e 66 6f 72 6d   detailed inform
cfc0: 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20 62 61  ation about a ba
cfd0: 63 6b 77 61 72 64 20 62 72 61 6e 63 68 2e 20 49  ckward branch. I
cfe0: 74 20 64 6f 65 73 0a 09 23 20 6e 6f 74 20 61 70  t does..# not ap
cff0: 70 6c 79 20 74 6f 20 74 61 67 73 2c 20 6e 6f 72  ply to tags, nor
d000: 20 72 65 76 69 73 69 6f 6e 73 2e 20 54 68 65 20   revisions. The 
d010: 71 75 65 72 69 65 73 20 63 61 6e 20 61 6c 73 6f  queries can also
d020: 0a 09 23 20 72 65 73 74 72 69 63 74 20 74 68 65  ..# restrict the
d030: 6d 73 65 6c 76 65 73 20 74 6f 20 74 68 65 20 72  mselves to the r
d040: 65 76 69 73 69 6f 6e 20 73 75 63 65 73 73 6f 72  evision sucessor
d050: 73 2f 70 72 65 64 65 63 65 73 73 6f 72 73 0a 09  s/predecessors..
d060: 23 20 6f 66 20 62 72 61 6e 63 68 65 73 2c 20 61  # of branches, a
d070: 73 20 6f 6e 6c 79 20 74 68 65 79 20 68 61 76 65  s only they have
d080: 20 6f 72 64 65 72 69 6e 67 20 64 61 74 61 20 61   ordering data a
d090: 6e 64 20 74 68 75 73 20 63 61 6e 0a 09 23 20 63  nd thus can..# c
d0a0: 61 75 73 65 20 74 68 65 20 62 61 63 6b 77 61 72  ause the backwar
d0b0: 64 6e 65 73 73 2e 0a 0a 09 73 65 74 20 74 68 65  dness....set the
d0c0: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61  set ('[join $bra
d0d0: 6e 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a  nches {','}]')..
d0e0: 09 73 65 74 20 6d 61 78 70 20 5b 73 74 61 74 65  .set maxp [state
d0f0: 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63   run [subst -noc
d100: 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73  ommands -nobacks
d110: 6c 61 73 68 65 73 20 7b 0a 09 20 20 20 20 2d 2d  lashes {..    --
d120: 20 6d 61 78 69 6d 61 6c 20 70 72 65 64 65 63 65   maximal predece
d130: 73 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20 70 65  ssor position pe
d140: 72 20 62 72 61 6e 63 68 0a 09 20 20 20 20 53 45  r branch..    SE
d150: 4c 45 43 54 20 42 2e 62 69 64 2c 20 4d 41 58 20  LECT B.bid, MAX 
d160: 28 43 4f 2e 70 6f 73 29 0a 09 20 20 20 20 46 52  (CO.pos)..    FR
d170: 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20 72  OM   branch B, r
d180: 65 76 69 73 69 6f 6e 20 52 2c 20 63 73 69 74 65  evision R, csite
d190: 6d 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20  m CI, changeset 
d1a0: 43 2c 20 63 73 6f 72 64 65 72 20 43 4f 0a 09 20  C, csorder CO.. 
d1b0: 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20     WHERE  B.bid 
d1c0: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d  IN $theset     -
d1d0: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 62 72  - Restrict to br
d1e0: 61 6e 63 68 65 73 20 6f 66 20 69 6e 74 65 72 65  anches of intere
d1f0: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42  st..    AND    B
d200: 2e 72 6f 6f 74 20 3d 20 52 2e 72 69 64 20 20 20  .root = R.rid   
d210: 20 20 20 20 2d 2d 20 47 65 74 20 62 72 61 6e 63      -- Get branc
d220: 68 20 72 6f 6f 74 20 72 65 76 69 73 69 6f 6e 73  h root revisions
d230: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 43 49 2e  ..    AND    CI.
d240: 69 69 64 20 3d 20 52 2e 72 69 64 20 20 20 20 20  iid = R.rid     
d250: 20 20 2d 2d 20 47 65 74 20 63 68 61 6e 67 65 73    -- Get changes
d260: 65 74 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ets containing t
d270: 68 65 0a 09 20 20 20 20 41 4e 44 20 20 20 20 43  he..    AND    C
d280: 2e 63 69 64 20 3d 20 43 49 2e 63 69 64 20 20 20  .cid = CI.cid   
d290: 20 20 20 20 2d 2d 20 72 6f 6f 74 20 72 65 76 69      -- root revi
d2a0: 73 69 6f 6e 73 2c 20 77 68 69 63 68 20 61 72 65  sions, which are
d2b0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 43 2e 74  ..    AND    C.t
d2c0: 79 70 65 20 3d 20 30 20 20 20 20 20 20 20 20 20  ype = 0         
d2d0: 20 20 2d 2d 20 72 65 76 69 73 69 6f 6e 20 63 68    -- revision ch
d2e0: 61 6e 67 65 73 65 74 73 0a 09 20 20 20 20 41 4e  angesets..    AN
d2f0: 44 20 20 20 20 43 4f 2e 63 69 64 20 3d 20 43 2e  D    CO.cid = C.
d300: 63 69 64 20 20 20 20 20 20 20 2d 2d 20 47 65 74  cid       -- Get
d310: 20 74 68 65 69 72 20 74 6f 70 6f 6c 6f 67 69 63   their topologic
d320: 61 6c 20 6f 72 64 65 72 69 6e 67 0a 09 20 20 20  al ordering..   
d330: 20 47 52 4f 55 50 20 42 59 20 42 2e 62 69 64 0a   GROUP BY B.bid.
d340: 09 7d 5d 5d 0a 0a 09 73 65 74 20 6d 69 6e 73 20  .}]]...set mins 
d350: 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73  [state run [subs
d360: 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e  t -nocommands -n
d370: 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09  obackslashes {..
d380: 20 20 20 20 2d 2d 20 6d 69 6e 69 6d 61 6c 20 73      -- minimal s
d390: 75 63 63 65 73 73 6f 72 20 70 6f 73 69 74 69 6f  uccessor positio
d3a0: 6e 20 70 65 72 20 62 72 61 6e 63 68 0a 09 20 20  n per branch..  
d3b0: 20 20 53 45 4c 45 43 54 20 42 2e 62 69 64 2c 20    SELECT B.bid, 
d3c0: 4d 49 4e 20 28 43 4f 2e 70 6f 73 29 0a 09 20 20  MIN (CO.pos)..  
d3d0: 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20    FROM   branch 
d3e0: 42 2c 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 63  B, revision R, c
d3f0: 73 69 74 65 6d 20 43 49 2c 20 63 68 61 6e 67 65  sitem CI, change
d400: 73 65 74 20 43 2c 20 63 73 6f 72 64 65 72 20 43  set C, csorder C
d410: 4f 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e  O..    WHERE  B.
d420: 62 69 64 20 49 4e 20 24 74 68 65 73 65 74 20 20  bid IN $theset  
d430: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74     -- Restrict t
d440: 6f 20 62 72 61 6e 63 68 65 73 20 6f 66 20 69 6e  o branches of in
d450: 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20  terest..    AND 
d460: 20 20 20 42 2e 66 69 72 73 74 20 3d 20 52 2e 72     B.first = R.r
d470: 69 64 20 20 20 20 20 20 2d 2d 20 47 65 74 20 74  id      -- Get t
d480: 68 65 20 66 69 72 73 74 20 72 65 76 69 73 69 6f  he first revisio
d490: 6e 73 20 6f 6e 20 74 68 65 20 62 72 61 6e 63 68  ns on the branch
d4a0: 65 73 0a 09 20 20 20 20 41 4e 44 20 20 20 20 43  es..    AND    C
d4b0: 49 2e 69 69 64 20 3d 20 52 2e 72 69 64 20 20 20  I.iid = R.rid   
d4c0: 20 20 20 20 2d 2d 20 47 65 74 20 63 68 61 6e 67      -- Get chang
d4d0: 65 73 65 74 73 20 63 6f 6e 74 61 69 6e 69 6e 67  esets containing
d4e0: 20 74 68 65 0a 09 20 20 20 20 41 4e 44 20 20 20   the..    AND   
d4f0: 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69 64 09   C.cid = CI.cid.
d500: 2d 2d 20 66 69 72 73 74 20 72 65 76 69 73 69 6f  -- first revisio
d510: 6e 73 2c 20 77 68 69 63 68 20 61 72 65 0a 09 20  ns, which are.. 
d520: 20 20 20 41 4e 44 20 20 20 20 43 2e 74 79 70 65     AND    C.type
d530: 20 3d 20 30 09 09 2d 2d 20 72 65 76 69 73 69 6f   = 0..-- revisio
d540: 6e 20 63 68 61 6e 67 65 73 65 74 73 0a 09 20 20  n changesets..  
d550: 20 20 41 4e 44 20 20 20 20 43 4f 2e 63 69 64 20    AND    CO.cid 
d560: 3d 20 43 2e 63 69 64 09 2d 2d 20 47 65 74 20 74  = C.cid.-- Get t
d570: 68 65 69 72 20 74 6f 70 6f 6c 6f 67 69 63 61 6c  heir topological
d580: 20 6f 72 64 65 72 69 6e 67 0a 09 20 20 20 20 47   ordering..    G
d590: 52 4f 55 50 20 42 59 20 42 2e 62 69 64 0a 09 7d  ROUP BY B.bid..}
d5a0: 5d 5d 0a 0a 20 20 20 20 20 20 20 20 72 65 74 75  ]]..        retu
d5b0: 72 6e 20 5b 6c 69 73 74 20 24 6d 61 78 70 20 24  rn [list $maxp $
d5c0: 6d 69 6e 73 5d 0a 20 20 20 20 7d 0a 0a 20 20 20  mins].    }..   
d5d0: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23   # # ## ### ####
d5e0: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
d5f0: 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20  ########.    ## 
d600: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a 20  Configuration.. 
d610: 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 69 6e     pragma -hasin
d620: 73 74 61 6e 63 65 73 20 20 20 6e 6f 20 3b 20 23  stances   no ; #
d630: 20 73 69 6e 67 6c 65 74 6f 6e 0a 20 20 20 20 70   singleton.    p
d640: 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65 69 6e  ragma -hastypein
d650: 66 6f 20 20 20 20 6e 6f 20 3b 20 23 20 6e 6f 20  fo    no ; # no 
d660: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20 20  introspection.  
d670: 20 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79 70    pragma -hastyp
d680: 65 64 65 73 74 72 6f 79 20 6e 6f 20 3b 20 23 20  edestroy no ; # 
d690: 69 6d 6d 6f 72 74 61 6c 0a 7d 0a 0a 23 20 23 20  immortal.}..# # 
d6a0: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
d6b0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
d6c0: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
d6d0: 23 23 23 23 23 23 23 23 23 0a 23 23 0a 0a 6e 61  #########.##..na
d6e0: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 76  mespace eval ::v
d6f0: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72  c::fossil::impor
d700: 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 20  t::cvs::project 
d710: 7b 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20  {.    namespace 
d720: 65 78 70 6f 72 74 20 72 65 76 0a 20 20 20 20 6e  export rev.    n
d730: 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 72 65  amespace eval re
d740: 76 20 7b 0a 09 6e 61 6d 65 73 70 61 63 65 20 69  v {..namespace i
d750: 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73  mport ::vc::foss
d760: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a  il::import::cvs:
d770: 3a 73 74 61 74 65 0a 09 6e 61 6d 65 73 70 61 63  :state..namespac
d780: 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66  e import ::vc::f
d790: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63  ossil::import::c
d7a0: 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 6e  vs::integrity..n
d7b0: 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20  amespace import 
d7c0: 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69 73  ::vc::tools::mis
d7d0: 63 3a 3a 2a 0a 09 6e 61 6d 65 73 70 61 63 65 20  c::*..namespace 
d7e0: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f  import ::vc::too
d7f0: 6c 73 3a 3a 74 72 6f 75 62 6c 65 0a 09 6e 61 6d  ls::trouble..nam
d800: 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a  espace import ::
d810: 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09  vc::tools::log..
d820: 6c 6f 67 20 72 65 67 69 73 74 65 72 20 63 73 65  log register cse
d830: 74 73 0a 0a 09 23 20 53 65 74 20 75 70 20 74 68  ts...# Set up th
d840: 65 20 68 65 6c 70 65 72 20 73 69 6e 67 6c 65 74  e helper singlet
d850: 6f 6e 73 0a 09 6e 61 6d 65 73 70 61 63 65 20 65  ons..namespace e
d860: 76 61 6c 20 72 65 76 20 7b 0a 09 20 20 20 20 6e  val rev {..    n
d870: 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20  amespace import 
d880: 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d  ::vc::fossil::im
d890: 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65  port::cvs::state
d8a0: 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20  ..    namespace 
d8b0: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73  import ::vc::fos
d8c0: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73  sil::import::cvs
d8d0: 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 20 20 20  ::integrity..   
d8e0: 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72   namespace impor
d8f0: 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c  t ::vc::tools::l
d900: 6f 67 0a 09 7d 0a 09 6e 61 6d 65 73 70 61 63 65  og..}..namespace
d910: 20 65 76 61 6c 20 73 79 6d 3a 3a 74 61 67 20 7b   eval sym::tag {
d920: 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20  ..    namespace 
d930: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73  import ::vc::fos
d940: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73  sil::import::cvs
d950: 3a 3a 73 74 61 74 65 0a 09 20 20 20 20 6e 61 6d  ::state..    nam
d960: 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a  espace import ::
d970: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f  vc::fossil::impo
d980: 72 74 3a 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69  rt::cvs::integri
d990: 74 79 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63  ty..    namespac
d9a0: 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74  e import ::vc::t
d9b0: 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 7d 0a 09 6e 61  ools::log..}..na
d9c0: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 73 79 6d  mespace eval sym
d9d0: 3a 3a 62 72 61 6e 63 68 20 7b 0a 09 20 20 20 20  ::branch {..    
d9e0: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74  namespace import
d9f0: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
da00: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74  mport::cvs::stat
da10: 65 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65  e..    namespace
da20: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f   import ::vc::fo
da30: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
da40: 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 20 20  s::integrity..  
da50: 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f    namespace impo
da60: 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a  rt ::vc::tools::
da70: 6c 6f 67 0a 09 7d 0a 20 20 20 20 7d 0a 7d 0a 0a  log..}.    }.}..
da80: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
da90: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
daa0: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
dab0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 23 23  #############.##
dac0: 20 52 65 61 64 79 0a 0a 70 61 63 6b 61 67 65 20   Ready..package 
dad0: 70 72 6f 76 69 64 65 20 76 63 3a 3a 66 6f 73 73  provide vc::foss
dae0: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a  il::import::cvs:
daf0: 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 20 31 2e  :project::rev 1.
db00: 30 0a 72 65 74 75 72 6e 0a                       0.return.