Hex Artifact Content
Not logged in

Artifact 433b16c0c020bae7020ca984e9954d9cb269c9a0:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [27ed4f7dc3] - Extended pass InitCsets and underlying code with more log output geared towards memory introspection, and added markers for special locations. Extended my notes with general observations from the first test runs over my example CVS repositories. by aku on 2008-02-16 06:46:41.

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