Hex Artifact Content
Not logged in

Artifact c1187b458cb409938f7986332add1c7289e2f70a:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [21d9664fb5] - Properly initialize the array containing the changesets split by type. by aku on 2008-02-08 04:49:36. Also file tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [6b78df3861] - Merge in changes from Andreas's branch. by drh on 2008-02-08 21:52:21.

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 0a 09  ndencies {} {...
10a0: 23 23 0a 09 23 23 20 4e 4f 54 45 3a 20 54 68 69  ##..## NOTE: Thi
10b0: 73 20 6d 65 74 68 6f 64 2c 20 6d 61 79 62 65 20  s method, maybe 
10c0: 69 6e 20 63 6f 6e 6a 75 6e 63 74 69 6f 6e 20 77  in conjunction w
10d0: 69 74 68 20 69 74 73 20 63 61 6c 6c 65 72 0a 09  ith its caller..
10e0: 23 23 20 20 20 20 20 20 20 73 65 65 6d 73 20 74  ##       seems t
10f0: 6f 20 62 65 20 61 20 6d 65 6d 6f 72 79 20 68 6f  o be a memory ho
1100: 67 2c 20 65 73 70 65 63 69 61 6c 6c 79 20 66 6f  g, especially fo
1110: 72 20 6c 61 72 67 65 0a 09 23 23 20 20 20 20 20  r large..##     
1120: 20 20 63 68 61 6e 67 65 73 65 74 73 2c 20 77 69    changesets, wi
1130: 74 68 20 27 6c 61 72 67 65 27 20 6d 65 61 6e 69  th 'large' meani
1140: 6e 67 20 74 6f 20 68 61 76 65 20 61 20 27 6c 6f  ng to have a 'lo
1150: 6e 67 20 6c 69 73 74 0a 09 23 23 20 20 20 20 20  ng list..##     
1160: 20 20 6f 66 20 69 74 65 6d 73 2c 20 73 65 76 65    of items, seve
1170: 72 61 6c 20 74 68 6f 75 73 61 6e 64 27 2e 20 49  ral thousand'. I
1180: 6e 76 65 73 74 69 67 61 74 65 20 77 68 65 72 65  nvestigate where
1190: 20 74 68 65 0a 09 23 23 20 20 20 20 20 20 20 6d   the..##       m
11a0: 65 6d 6f 72 79 20 69 73 20 73 70 65 6e 74 20 61  emory is spent a
11b0: 6e 64 20 74 68 65 6e 20 6c 6f 6f 6b 20 66 6f 72  nd then look for
11c0: 20 77 61 79 73 20 6f 66 20 72 65 63 74 69 66 79   ways of rectify
11d0: 69 6e 67 0a 09 23 23 20 20 20 20 20 20 20 74 68  ing..##       th
11e0: 65 20 70 72 6f 62 6c 65 6d 2e 0a 09 23 23 0a 0a  e problem...##..
11f0: 09 23 20 54 68 69 73 20 6d 65 74 68 6f 64 20 69  .# This method i
1200: 6e 73 70 65 63 74 73 20 74 68 65 20 63 68 61 6e  nspects the chan
1210: 67 65 73 65 74 73 20 66 6f 72 20 69 6e 74 65 72  gesets for inter
1220: 6e 61 6c 0a 09 23 20 64 65 70 65 6e 64 65 6e 63  nal..# dependenc
1230: 69 65 73 2e 20 4e 6f 74 68 69 6e 67 20 69 73 20  ies. Nothing is 
1240: 64 6f 6e 65 20 69 66 20 74 68 65 72 65 20 61 72  done if there ar
1250: 65 20 6e 6f 0a 09 23 20 73 75 63 68 2e 20 4f 74  e no..# such. Ot
1260: 68 65 72 77 69 73 65 20 74 68 65 20 63 68 61 6e  herwise the chan
1270: 67 65 73 65 74 20 69 73 20 73 70 6c 69 74 20 69  geset is split i
1280: 6e 74 6f 20 61 20 73 65 74 20 6f 66 0a 09 23 20  nto a set of..# 
1290: 66 72 61 67 6d 65 6e 74 73 20 77 69 74 68 6f 75  fragments withou
12a0: 74 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e  t internal depen
12b0: 64 65 6e 63 69 65 73 2c 20 74 72 61 6e 73 66 6f  dencies, transfo
12c0: 72 6d 69 6e 67 20 74 68 65 0a 09 23 20 69 6e 74  rming the..# int
12d0: 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69  ernal dependenci
12e0: 65 73 20 69 6e 74 6f 20 65 78 74 65 72 6e 61 6c  es into external
12f0: 20 6f 6e 65 73 2e 20 54 68 65 20 6e 65 77 20 63   ones. The new c
1300: 68 61 6e 67 65 73 65 74 73 0a 09 23 20 61 72 65  hangesets..# are
1310: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 6c 69   added to the li
1320: 73 74 20 6f 66 20 61 6c 6c 20 63 68 61 6e 67 65  st of all change
1330: 73 65 74 73 2e 0a 0a 09 23 20 57 65 20 70 65 72  sets....# We per
1340: 66 6f 72 6d 20 61 6c 6c 20 6e 65 63 65 73 73 61  form all necessa
1350: 72 79 20 73 70 6c 69 74 73 20 69 6e 20 6f 6e 65  ry splits in one
1360: 20 67 6f 2c 20 69 6e 73 74 65 61 64 20 6f 66 20   go, instead of 
1370: 6f 6e 6c 79 0a 09 23 20 6f 6e 65 2e 20 54 68 65  only..# one. The
1380: 20 70 72 65 76 69 6f 75 73 20 61 6c 67 6f 72 69   previous algori
1390: 74 68 6d 2c 20 61 64 61 70 74 65 64 20 66 72 6f  thm, adapted fro
13a0: 6d 20 63 76 73 32 73 76 6e 2c 20 63 6f 6d 70 75  m cvs2svn, compu
13b0: 74 65 64 0a 09 23 20 61 20 6c 6f 74 20 6f 66 20  ted..# a lot of 
13c0: 73 74 61 74 65 20 77 68 69 63 68 20 77 61 73 20  state which was 
13d0: 74 68 72 6f 77 6e 20 61 77 61 79 20 61 6e 64 20  thrown away and 
13e0: 74 68 65 6e 20 63 6f 6d 70 75 74 65 64 20 61 67  then computed ag
13f0: 61 69 6e 0a 09 23 20 66 6f 72 20 65 61 63 68 20  ain..# for each 
1400: 6f 66 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73  of the fragments
1410: 2e 20 49 74 20 73 68 6f 75 6c 64 20 62 65 20 65  . It should be e
1420: 61 73 69 65 72 20 74 6f 20 75 70 64 61 74 65 20  asier to update 
1430: 61 6e 64 0a 09 23 20 72 65 75 73 65 20 74 68 61  and..# reuse tha
1440: 74 20 73 74 61 74 65 2e 0a 0a 09 23 20 54 68 65  t state....# The
1450: 20 63 6f 64 65 20 63 68 65 63 6b 73 20 6f 6e 6c   code checks onl
1460: 79 20 73 75 63 63 65 73 73 6f 72 20 64 65 70 65  y successor depe
1470: 6e 64 65 6e 63 69 65 73 2c 20 61 73 20 74 68 69  ndencies, as thi
1480: 73 0a 09 23 20 61 75 74 6f 6d 61 74 69 63 61 6c  s..# automatical
1490: 6c 79 20 63 6f 76 65 72 73 20 74 68 65 20 70 72  ly covers the pr
14a0: 65 64 65 63 65 73 73 6f 72 20 64 65 70 65 6e 64  edecessor depend
14b0: 65 6e 63 69 65 73 20 61 73 20 77 65 6c 6c 20 28  encies as well (
14c0: 41 0a 09 23 20 73 75 63 63 65 73 73 6f 72 20 64  A..# successor d
14d0: 65 70 65 6e 64 65 6e 63 79 20 61 20 2d 3e 20 62  ependency a -> b
14e0: 20 69 73 20 61 6c 73 6f 20 61 20 70 72 65 64 65   is also a prede
14f0: 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63  cessor dependenc
1500: 79 0a 09 23 20 62 20 2d 3e 20 61 29 2e 0a 0a 09  y..# b -> a)....
1510: 23 20 41 72 72 61 79 20 6f 66 20 64 65 70 65 6e  # Array of depen
1520: 64 65 6e 63 69 65 73 20 28 70 61 72 65 6e 74 20  dencies (parent 
1530: 2d 3e 20 63 68 69 6c 64 29 2e 20 54 68 69 73 20  -> child). This 
1540: 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 0a 09  is pulled from..
1550: 23 20 74 68 65 20 73 74 61 74 65 2c 20 61 6e 64  # the state, and
1560: 20 6c 69 6d 69 74 65 64 20 74 6f 20 73 75 63 63   limited to succ
1570: 65 73 73 6f 72 73 20 77 69 74 68 69 6e 20 74 68  essors within th
1580: 65 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 61  e changeset....a
1590: 72 72 61 79 20 73 65 74 20 64 65 70 65 6e 64 65  rray set depende
15a0: 6e 63 69 65 73 20 7b 7d 0a 09 24 6d 79 74 79 70  ncies {}..$mytyp
15b0: 65 6f 62 6a 20 69 6e 74 65 72 6e 61 6c 73 75 63  eobj internalsuc
15c0: 63 65 73 73 6f 72 73 20 64 65 70 65 6e 64 65 6e  cessors dependen
15d0: 63 69 65 73 20 24 6d 79 69 74 65 6d 73 0a 09 69  cies $myitems..i
15e0: 66 20 7b 21 5b 61 72 72 61 79 20 73 69 7a 65 20  f {![array size 
15f0: 64 65 70 65 6e 64 65 6e 63 69 65 73 5d 7d 20 7b  dependencies]} {
1600: 72 65 74 75 72 6e 20 30 7d 20 3b 20 23 20 4e 6f  return 0} ; # No
1610: 74 68 69 6e 67 20 74 6f 20 62 72 65 61 6b 2e 0a  thing to break..
1620: 0a 09 6c 6f 67 20 77 72 69 74 65 20 35 20 63 73  ..log write 5 cs
1630: 65 74 73 20 2e 2e 2e 5b 24 73 65 6c 66 20 73 74  ets ...[$self st
1640: 72 5d 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  r]..............
1650: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1660: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
1670: 2e 2e 2e 2e 2e 2e 2e 2e 2e 0a 0a 09 23 20 57 65  ............# We
1680: 20 68 61 76 65 20 69 6e 74 65 72 6e 61 6c 20 64   have internal d
1690: 65 70 65 6e 64 65 6e 63 69 65 73 20 74 6f 20 62  ependencies to b
16a0: 72 65 61 6b 2e 20 57 65 20 6e 6f 77 20 69 74 65  reak. We now ite
16b0: 72 61 74 65 20 6f 76 65 72 0a 09 23 20 61 6c 6c  rate over..# all
16c0: 20 70 6f 73 69 74 69 6f 6e 73 20 69 6e 20 74 68   positions in th
16d0: 65 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73  e list (which is
16e0: 20 63 68 72 6f 6e 6f 6c 6f 67 69 63 61 6c 2c 20   chronological, 
16f0: 61 74 20 6c 65 61 73 74 0a 09 23 20 61 73 20 66  at least..# as f
1700: 61 72 20 61 73 20 74 68 65 20 74 69 6d 65 73 74  ar as the timest
1710: 61 6d 70 73 20 61 72 65 20 63 6f 72 72 65 63 74  amps are correct
1720: 20 61 6e 64 20 75 6e 69 71 75 65 29 20 61 6e 64   and unique) and
1730: 0a 09 23 20 64 65 74 65 72 6d 69 6e 65 20 74 68  ..# determine th
1740: 65 20 62 65 73 74 20 70 6f 73 69 74 69 6f 6e 20  e best position 
1750: 66 6f 72 20 74 68 65 20 62 72 65 61 6b 2c 20 62  for the break, b
1760: 79 20 74 72 79 69 6e 67 20 74 6f 0a 09 23 20 62  y trying to..# b
1770: 72 65 61 6b 20 61 73 20 6d 61 6e 79 20 64 65 70  reak as many dep
1780: 65 6e 64 65 6e 63 69 65 73 20 61 73 20 70 6f 73  endencies as pos
1790: 73 69 62 6c 65 20 69 6e 20 6f 6e 65 20 67 6f 2e  sible in one go.
17a0: 20 57 68 65 6e 20 61 0a 09 23 20 62 72 65 61 6b   When a..# break
17b0: 20 77 61 73 20 66 6f 75 6e 64 20 74 68 69 73 20   was found this 
17c0: 69 73 20 72 65 64 6f 6e 65 20 66 6f 72 20 74 68  is redone for th
17d0: 65 20 66 72 61 67 6d 65 6e 74 73 20 63 6f 6d 69  e fragments comi
17e0: 6e 67 20 61 6e 64 0a 09 23 20 61 66 74 65 72 2c  ng and..# after,
17f0: 20 61 66 74 65 72 20 75 70 64 69 6e 67 20 74 68   after upding th
1800: 65 20 63 72 6f 73 73 69 6e 67 20 69 6e 66 6f 72  e crossing infor
1810: 6d 61 74 69 6f 6e 2e 0a 0a 09 23 20 44 61 74 61  mation....# Data
1820: 20 73 74 72 75 63 74 75 72 65 73 3a 0a 09 23 20   structures:..# 
1830: 4d 61 70 3a 20 20 50 4f 53 20 20 20 72 65 76 69  Map:  POS   revi
1840: 73 69 6f 6e 20 69 64 20 20 20 20 20 20 2d 3e 20  sion id      -> 
1850: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73 74  position in list
1860: 2e 0a 09 23 20 20 20 20 20 20 20 43 52 4f 53 53  ...#       CROSS
1870: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73   position in lis
1880: 74 20 2d 3e 20 6e 75 6d 62 65 72 20 6f 66 20 64  t -> number of d
1890: 65 70 65 6e 64 65 6e 63 69 65 73 20 63 72 6f 73  ependencies cros
18a0: 73 69 6e 67 20 69 74 0a 09 23 20 20 20 20 20 20  sing it..#      
18b0: 20 44 45 50 43 20 20 64 65 70 65 6e 64 65 6e 63   DEPC  dependenc
18c0: 79 20 20 20 20 20 20 20 2d 3e 20 70 6f 73 69 74  y       -> posit
18d0: 69 6f 6e 73 20 69 74 20 63 72 6f 73 73 65 73 0a  ions it crosses.
18e0: 09 23 20 4c 69 73 74 3a 20 52 41 4e 47 45 20 4f  .# List: RANGE O
18f0: 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  f the positions 
1900: 69 74 73 65 6c 66 2e 0a 09 23 20 41 20 64 65 70  itself...# A dep
1910: 65 6e 64 65 6e 63 79 20 69 73 20 61 20 73 69 6e  endency is a sin
1920: 67 6c 65 2d 65 6c 65 6d 65 6e 74 20 6d 61 70 20  gle-element map 
1930: 70 61 72 65 6e 74 20 2d 3e 20 63 68 69 6c 64 0a  parent -> child.
1940: 0a 09 49 6e 69 74 69 61 6c 69 7a 65 42 72 65 61  ..InitializeBrea
1950: 6b 53 74 61 74 65 20 24 6d 79 69 74 65 6d 73 0a  kState $myitems.
1960: 0a 09 73 65 74 20 66 72 61 67 6d 65 6e 74 73 20  ..set fragments 
1970: 7b 7d 0a 09 73 65 74 20 6e 65 77 20 20 20 20 20  {}..set new     
1980: 20 20 5b 6c 69 73 74 20 24 72 61 6e 67 65 5d 0a    [list $range].
1990: 09 61 72 72 61 79 20 73 65 74 20 62 72 65 61 6b  .array set break
19a0: 73 20 7b 7d 0a 0a 09 23 20 49 6e 73 74 65 61 64  s {}...# Instead
19b0: 20 6f 66 20 6f 6e 65 20 6c 69 73 74 20 68 6f 6c   of one list hol
19c0: 64 69 6e 67 20 62 6f 74 68 20 70 72 6f 63 65 73  ding both proces
19d0: 73 65 64 20 61 6e 64 20 70 65 6e 64 69 6e 67 0a  sed and pending.
19e0: 09 23 20 66 72 61 67 6d 65 6e 74 73 20 77 65 20  .# fragments we 
19f0: 75 73 65 20 74 77 6f 2c 20 6f 6e 65 20 66 6f 72  use two, one for
1a00: 20 74 68 65 20 66 72 61 6d 65 6e 74 73 20 74 6f   the framents to
1a10: 20 70 72 6f 63 65 73 73 2c 20 6f 6e 65 0a 09 23   process, one..#
1a20: 20 74 6f 20 68 6f 6c 64 20 74 68 65 20 6e 65 77   to hold the new
1a30: 20 66 72 61 67 6d 65 6e 74 73 2c 20 61 6e 64 20   fragments, and 
1a40: 74 68 65 20 6c 61 74 74 65 72 20 69 73 20 63 6f  the latter is co
1a50: 70 69 65 64 20 74 6f 20 74 68 65 0a 09 23 20 66  pied to the..# f
1a60: 6f 72 6d 65 72 20 77 68 65 6e 20 74 68 65 79 20  ormer when they 
1a70: 72 75 6e 20 6f 75 74 2e 20 54 68 69 73 20 6b 65  run out. This ke
1a80: 65 70 73 20 74 68 65 20 6c 69 73 74 20 6f 66 20  eps the list of 
1a90: 70 65 6e 64 69 6e 67 0a 09 23 20 66 72 61 67 6d  pending..# fragm
1aa0: 65 6e 74 73 20 73 68 6f 72 74 20 77 69 74 68 6f  ents short witho
1ab0: 75 74 20 73 61 63 72 69 66 69 63 69 6e 67 20 73  ut sacrificing s
1ac0: 70 65 65 64 20 62 79 20 73 68 69 66 74 69 6e 67  peed by shifting
1ad0: 20 73 74 75 66 66 0a 09 23 20 64 6f 77 6e 2e 20   stuff..# down. 
1ae0: 57 65 20 65 73 70 65 63 69 61 6c 6c 79 20 64 72  We especially dr
1af0: 6f 70 20 74 68 65 20 6d 65 6d 6f 72 79 20 6f 66  op the memory of
1b00: 20 66 72 61 67 6d 65 6e 74 73 20 62 72 6f 6b 65   fragments broke
1b10: 6e 0a 09 23 20 64 75 72 69 6e 67 20 70 72 6f 63  n..# during proc
1b20: 65 73 73 69 6e 67 20 61 66 74 65 72 20 61 20 73  essing after a s
1b30: 68 6f 72 74 20 74 69 6d 65 2c 20 69 6e 73 74 65  hort time, inste
1b40: 61 64 20 6f 66 20 6c 65 74 74 69 6e 67 20 69 74  ad of letting it
1b50: 0a 09 23 20 63 6f 6e 73 75 6d 65 20 6d 65 6d 6f  ..# consume memo
1b60: 72 79 2e 0a 0a 09 77 68 69 6c 65 20 7b 5b 6c 6c  ry....while {[ll
1b70: 65 6e 67 74 68 20 24 6e 65 77 5d 7d 20 7b 0a 0a  ength $new]} {..
1b80: 09 20 20 20 20 73 65 74 20 70 65 6e 64 69 6e 67  .    set pending
1b90: 20 24 6e 65 77 0a 09 20 20 20 20 73 65 74 20 6e   $new..    set n
1ba0: 65 77 20 20 20 20 20 7b 7d 0a 09 20 20 20 20 73  ew     {}..    s
1bb0: 65 74 20 61 74 20 20 20 20 20 20 30 0a 0a 09 20  et at      0... 
1bc0: 20 20 20 77 68 69 6c 65 20 7b 24 61 74 20 3c 20     while {$at < 
1bd0: 5b 6c 6c 65 6e 67 74 68 20 24 70 65 6e 64 69 6e  [llength $pendin
1be0: 67 5d 7d 20 7b 0a 09 09 73 65 74 20 63 75 72 72  g]} {...set curr
1bf0: 65 6e 74 20 5b 6c 69 6e 64 65 78 20 24 70 65 6e  ent [lindex $pen
1c00: 64 69 6e 67 20 24 61 74 5d 0a 0a 09 09 6c 6f 67  ding $at]....log
1c10: 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20 7b   write 6 csets {
1c20: 2e 20 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e  . . .. ... .....
1c30: 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e   ........ ......
1c40: 2e 2e 2e 2e 2e 2e 2e 7d 0a 09 09 6c 6f 67 20 77  .......}...log w
1c50: 72 69 74 65 20 36 20 63 73 65 74 73 20 7b 53 63  rite 6 csets {Sc
1c60: 68 65 64 75 6c 65 64 20 20 20 5b 6a 6f 69 6e 20  heduled   [join 
1c70: 5b 50 52 73 20 5b 6c 72 61 6e 67 65 20 24 70 65  [PRs [lrange $pe
1c80: 6e 64 69 6e 67 20 24 61 74 20 65 6e 64 5d 5d 20  nding $at end]] 
1c90: 7b 20 7d 5d 7d 0a 09 09 6c 6f 67 20 77 72 69 74  { }]}...log writ
1ca0: 65 20 36 20 63 73 65 74 73 20 7b 43 6f 6e 73 69  e 6 csets {Consi
1cb0: 64 65 72 69 6e 67 20 5b 50 52 20 24 63 75 72 72  dering [PR $curr
1cc0: 65 6e 74 5d 20 5c 5b 24 61 74 2f 5b 6c 6c 65 6e  ent] \[$at/[llen
1cd0: 67 74 68 20 24 70 65 6e 64 69 6e 67 5d 5c 5d 7d  gth $pending]\]}
1ce0: 0a 0a 09 09 73 65 74 20 62 65 73 74 20 5b 46 69  ....set best [Fi
1cf0: 6e 64 42 65 73 74 42 72 65 61 6b 20 24 63 75 72  ndBestBreak $cur
1d00: 72 65 6e 74 5d 0a 0a 09 09 69 66 20 7b 24 62 65  rent]....if {$be
1d10: 73 74 20 3c 20 30 7d 20 7b 0a 09 09 20 20 20 20  st < 0} {...    
1d20: 23 20 54 68 65 20 69 6e 73 70 65 63 74 65 64 20  # The inspected 
1d30: 72 61 6e 67 65 20 68 61 73 20 6e 6f 20 69 6e 74  range has no int
1d40: 65 72 6e 61 6c 0a 09 09 20 20 20 20 23 20 64 65  ernal...    # de
1d50: 70 65 6e 64 65 6e 63 69 65 73 2e 20 54 68 69 73  pendencies. This
1d60: 20 69 73 20 61 20 63 6f 6d 70 6c 65 74 65 20 66   is a complete f
1d70: 72 61 67 6d 65 6e 74 2e 0a 09 09 20 20 20 20 6c  ragment....    l
1d80: 61 70 70 65 6e 64 20 66 72 61 67 6d 65 6e 74 73  append fragments
1d90: 20 24 63 75 72 72 65 6e 74 0a 0a 09 09 20 20 20   $current....   
1da0: 20 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65   log write 6 cse
1db0: 74 73 20 22 4e 6f 20 62 72 65 61 6b 73 2c 20 66  ts "No breaks, f
1dc0: 69 6e 61 6c 22 0a 09 09 7d 20 65 6c 73 65 20 7b  inal"...} else {
1dd0: 0a 09 09 20 20 20 20 23 20 53 70 6c 69 74 20 74  ...    # Split t
1de0: 68 65 20 72 61 6e 67 65 20 61 6e 64 20 73 63 68  he range and sch
1df0: 65 64 75 6c 65 20 74 68 65 20 72 65 73 75 6c 74  edule the result
1e00: 69 6e 67 0a 09 09 20 20 20 20 23 20 66 72 61 67  ing...    # frag
1e10: 6d 65 6e 74 73 20 66 6f 72 20 66 75 72 74 68 65  ments for furthe
1e20: 72 20 69 6e 73 70 65 63 74 69 6f 6e 2e 20 52 65  r inspection. Re
1e30: 6d 65 6d 62 65 72 20 74 68 65 0a 09 09 20 20 20  member the...   
1e40: 20 23 20 6e 75 6d 62 65 72 20 6f 66 20 64 65 70   # number of dep
1e50: 65 6e 64 65 6e 63 69 65 73 20 63 75 74 20 62 65  endencies cut be
1e60: 66 6f 72 65 20 77 65 20 72 65 6d 6f 76 65 20 74  fore we remove t
1e70: 68 65 6d 0a 09 09 20 20 20 20 23 20 66 72 6f 6d  hem...    # from
1e80: 20 63 6f 6e 73 69 64 65 72 61 74 69 6f 6e 2c 20   consideration, 
1e90: 66 6f 72 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f  for documentatio
1ea0: 6e 20 6c 61 74 65 72 2e 0a 0a 09 09 20 20 20 20  n later.....    
1eb0: 73 65 74 20 62 72 65 61 6b 73 28 24 62 65 73 74  set breaks($best
1ec0: 29 20 24 63 72 6f 73 73 28 24 62 65 73 74 29 0a  ) $cross($best).
1ed0: 0a 09 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65  ...    log write
1ee0: 20 36 20 63 73 65 74 73 20 22 42 65 73 74 20 62   6 csets "Best b
1ef0: 72 65 61 6b 20 40 20 24 62 65 73 74 2c 20 63 75  reak @ $best, cu
1f00: 74 74 69 6e 67 20 5b 6e 73 70 20 24 63 72 6f 73  tting [nsp $cros
1f10: 73 28 24 62 65 73 74 29 20 64 65 70 65 6e 64 65  s($best) depende
1f20: 6e 63 79 20 64 65 70 65 6e 64 65 6e 63 69 65 73  ncy dependencies
1f30: 5d 22 0a 0a 09 09 20 20 20 20 23 20 4e 6f 74 65  ]"....    # Note
1f40: 3a 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 62  : The value of b
1f50: 65 73 74 20 69 73 20 61 6e 20 61 62 6f 6c 75 74  est is an abolut
1f60: 65 20 6c 6f 63 61 74 69 6f 6e 0a 09 09 20 20 20  e location...   
1f70: 20 23 20 69 6e 20 6d 79 69 74 65 6d 73 2e 20 55   # in myitems. U
1f80: 73 65 20 74 68 65 20 73 74 61 72 74 20 6f 66 20  se the start of 
1f90: 63 75 72 72 65 6e 74 20 74 6f 20 6d 61 6b 65 20  current to make 
1fa0: 69 74 0a 09 09 20 20 20 20 23 20 61 6e 20 69 6e  it...    # an in
1fb0: 64 65 78 20 61 62 73 6f 6c 75 74 65 20 74 6f 20  dex absolute to 
1fc0: 63 75 72 72 65 6e 74 2e 0a 0a 09 09 20 20 20 20  current.....    
1fd0: 73 65 74 20 62 72 65 6c 20 5b 65 78 70 72 20 7b  set brel [expr {
1fe0: 24 62 65 73 74 20 2d 20 5b 6c 69 6e 64 65 78 20  $best - [lindex 
1ff0: 24 63 75 72 72 65 6e 74 20 30 5d 7d 5d 0a 09 09  $current 0]}]...
2000: 20 20 20 20 73 65 74 20 62 6e 65 78 74 20 24 62      set bnext $b
2010: 72 65 6c 20 3b 20 69 6e 63 72 20 62 6e 65 78 74  rel ; incr bnext
2020: 0a 09 09 20 20 20 20 73 65 74 20 66 72 61 67 62  ...    set fragb
2030: 65 66 6f 72 65 20 5b 6c 72 61 6e 67 65 20 24 63  efore [lrange $c
2040: 75 72 72 65 6e 74 20 30 20 24 62 72 65 6c 5d 0a  urrent 0 $brel].
2050: 09 09 20 20 20 20 73 65 74 20 66 72 61 67 61 66  ..    set fragaf
2060: 74 65 72 20 20 5b 6c 72 61 6e 67 65 20 24 63 75  ter  [lrange $cu
2070: 72 72 65 6e 74 20 24 62 6e 65 78 74 20 65 6e 64  rrent $bnext end
2080: 5d 0a 0a 09 09 20 20 20 20 6c 6f 67 20 77 72 69  ]....    log wri
2090: 74 65 20 36 20 63 73 65 74 73 20 22 4e 65 77 20  te 6 csets "New 
20a0: 70 69 65 63 65 73 20 20 5b 50 52 20 24 66 72 61  pieces  [PR $fra
20b0: 67 62 65 66 6f 72 65 5d 20 5b 50 52 20 24 66 72  gbefore] [PR $fr
20c0: 61 67 61 66 74 65 72 5d 22 0a 0a 09 09 20 20 20  agafter]"....   
20d0: 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72   integrity asser
20e0: 74 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 66 72 61  t {[llength $fra
20f0: 67 62 65 66 6f 72 65 5d 7d 20 7b 46 6f 75 6e 64  gbefore]} {Found
2100: 20 7a 65 72 6f 2d 6c 65 6e 67 74 68 20 66 72 61   zero-length fra
2110: 67 6d 65 6e 74 20 61 74 20 74 68 65 20 62 65 67  gment at the beg
2120: 69 6e 6e 69 6e 67 7d 0a 09 09 20 20 20 20 69 6e  inning}...    in
2130: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b  tegrity assert {
2140: 5b 6c 6c 65 6e 67 74 68 20 24 66 72 61 67 61 66  [llength $fragaf
2150: 74 65 72 5d 7d 20 20 7b 46 6f 75 6e 64 20 7a 65  ter]}  {Found ze
2160: 72 6f 2d 6c 65 6e 67 74 68 20 66 72 61 67 6d 65  ro-length fragme
2170: 6e 74 20 61 74 20 74 68 65 20 65 6e 64 7d 0a 0a  nt at the end}..
2180: 09 09 20 20 20 20 6c 61 70 70 65 6e 64 20 6e 65  ..    lappend ne
2190: 77 20 24 66 72 61 67 62 65 66 6f 72 65 20 24 66  w $fragbefore $f
21a0: 72 61 67 61 66 74 65 72 0a 09 09 20 20 20 20 43  ragafter...    C
21b0: 75 74 41 74 20 24 62 65 73 74 0a 09 09 7d 0a 0a  utAt $best...}..
21c0: 09 09 69 6e 63 72 20 61 74 0a 09 20 20 20 20 7d  ..incr at..    }
21d0: 0a 09 7d 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20  ..}...log write 
21e0: 36 20 63 73 65 74 73 20 22 2e 20 2e 20 2e 2e 20  6 csets ". . .. 
21f0: 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e  ... ..... ......
2200: 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  .. .............
2210: 22 0a 0a 09 23 20 28 2a 29 20 57 65 20 63 6c 65  "...# (*) We cle
2220: 61 72 20 6f 75 74 20 74 68 65 20 61 73 73 6f 63  ar out the assoc
2230: 69 61 74 65 64 20 70 61 72 74 20 6f 66 20 74 68  iated part of th
2240: 65 20 6d 79 69 74 65 6d 6d 61 70 0a 09 23 20 69  e myitemmap..# i
2250: 6e 2d 6d 65 6d 6f 72 79 20 69 6e 64 65 78 20 69  n-memory index i
2260: 6e 20 70 72 65 70 61 72 61 74 69 6f 6e 20 66 6f  n preparation fo
2270: 72 20 6e 65 77 20 64 61 74 61 2e 20 41 20 73 69  r new data. A si
2280: 6d 70 6c 65 20 75 6e 73 65 74 0a 09 23 20 69 73  mple unset..# is
2290: 20 65 6e 6f 75 67 68 2c 20 77 65 20 68 61 76 65   enough, we have
22a0: 20 6e 6f 20 73 79 6d 62 6f 6c 20 63 68 61 6e 67   no symbol chang
22b0: 65 73 65 74 73 20 61 74 20 74 68 69 73 20 74 69  esets at this ti
22c0: 6d 65 2c 20 61 6e 64 0a 09 23 20 74 68 75 73 20  me, and..# thus 
22d0: 6e 65 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20  never more than 
22e0: 6f 6e 65 20 72 65 66 65 72 65 6e 63 65 20 69 6e  one reference in
22f0: 20 74 68 65 20 6c 69 73 74 2e 0a 0a 09 66 6f 72   the list....for
2300: 65 61 63 68 20 69 69 64 20 24 6d 79 69 74 65 6d  each iid $myitem
2310: 73 20 7b 0a 09 20 20 20 20 73 65 74 20 6b 65 79  s {..    set key
2320: 20 5b 6c 69 73 74 20 24 6d 79 74 79 70 65 20 24   [list $mytype $
2330: 69 69 64 5d 0a 09 20 20 20 20 75 6e 73 65 74 20  iid]..    unset 
2340: 6d 79 69 74 65 6d 6d 61 70 28 24 6b 65 79 29 0a  myitemmap($key).
2350: 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 38  .    log write 8
2360: 20 63 73 65 74 73 20 7b 4d 41 50 2d 20 69 74 65   csets {MAP- ite
2370: 6d 20 3c 24 6b 65 79 3e 20 24 73 65 6c 66 20 3d  m <$key> $self =
2380: 20 5b 24 73 65 6c 66 20 73 74 72 5d 7d 0a 09 7d   [$self str]}..}
2390: 0a 0a 09 23 20 43 72 65 61 74 65 20 63 68 61 6e  ...# Create chan
23a0: 67 65 73 65 74 73 20 66 6f 72 20 74 68 65 20 66  gesets for the f
23b0: 72 61 67 6d 65 6e 74 73 2c 20 72 65 75 73 69 6e  ragments, reusin
23c0: 67 20 74 68 65 20 63 75 72 72 65 6e 74 20 6f 6e  g the current on
23d0: 65 0a 09 23 20 66 6f 72 20 74 68 65 20 66 69 72  e..# for the fir
23e0: 73 74 20 66 72 61 67 6d 65 6e 74 2e 20 57 65 20  st fragment. We 
23f0: 73 6f 72 74 20 74 68 65 6d 20 69 6e 20 6f 72 64  sort them in ord
2400: 65 72 20 74 6f 20 61 6c 6c 6f 77 0a 09 23 20 63  er to allow..# c
2410: 68 65 63 6b 69 6e 67 20 66 6f 72 20 67 61 70 73  hecking for gaps
2420: 20 61 6e 64 20 6e 69 63 65 20 6d 65 73 73 61 67   and nice messag
2430: 65 73 2e 0a 0a 09 73 65 74 20 66 72 61 67 6d 65  es....set fragme
2440: 6e 74 73 20 5b 6c 73 6f 72 74 20 2d 69 6e 64 65  nts [lsort -inde
2450: 78 20 30 20 2d 69 6e 74 65 67 65 72 20 24 66 72  x 0 -integer $fr
2460: 61 67 6d 65 6e 74 73 5d 0a 0a 09 23 70 75 74 73  agments]...#puts
2470: 20 5c 74 2e 5b 6a 6f 69 6e 20 5b 50 52 73 20 24   \t.[join [PRs $
2480: 66 72 61 67 6d 65 6e 74 73 5d 20 2e 5c 6e 5c 74  fragments] .\n\t
2490: 2e 5d 2e 0a 0a 09 42 6f 72 64 65 72 20 5b 6c 69  .]....Border [li
24a0: 6e 64 65 78 20 24 66 72 61 67 6d 65 6e 74 73 20  ndex $fragments 
24b0: 30 5d 20 66 69 72 73 74 73 20 66 69 72 73 74 65  0] firsts firste
24c0: 0a 0a 09 69 6e 74 65 67 72 69 74 79 20 61 73 73  ...integrity ass
24d0: 65 72 74 20 7b 24 66 69 72 73 74 73 20 3d 3d 20  ert {$firsts == 
24e0: 30 7d 20 7b 42 61 64 20 66 72 61 67 6d 65 6e 74  0} {Bad fragment
24f0: 20 73 74 61 72 74 20 40 20 24 66 69 72 73 74 73   start @ $firsts
2500: 2c 20 67 61 70 2c 20 6f 72 20 62 65 66 6f 72 65  , gap, or before
2510: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
2520: 65 20 72 61 6e 67 65 7d 0a 0a 09 73 65 74 20 6c  e range}...set l
2530: 61 73 74 65 20 24 66 69 72 73 74 65 0a 09 66 6f  aste $firste..fo
2540: 72 65 61 63 68 20 66 72 61 67 6d 65 6e 74 20 5b  reach fragment [
2550: 6c 72 61 6e 67 65 20 24 66 72 61 67 6d 65 6e 74  lrange $fragment
2560: 73 20 31 20 65 6e 64 5d 20 7b 0a 09 20 20 20 20  s 1 end] {..    
2570: 42 6f 72 64 65 72 20 24 66 72 61 67 6d 65 6e 74  Border $fragment
2580: 20 73 20 65 0a 09 20 20 20 20 69 6e 74 65 67 72   s e..    integr
2590: 69 74 79 20 61 73 73 65 72 74 20 7b 24 6c 61 73  ity assert {$las
25a0: 74 65 20 3d 3d 20 28 24 73 20 2d 20 31 29 7d 20  te == ($s - 1)} 
25b0: 7b 42 61 64 20 66 72 61 67 6d 65 6e 74 20 62 6f  {Bad fragment bo
25c0: 72 64 65 72 20 3c 24 6c 61 73 74 65 20 7c 20 24  rder <$laste | $
25d0: 73 3e 2c 20 67 61 70 20 6f 72 20 6f 76 65 72 6c  s>, gap or overl
25e0: 61 70 7d 0a 0a 09 20 20 20 20 73 65 74 20 6e 65  ap}...    set ne
25f0: 77 20 5b 24 74 79 70 65 20 25 41 55 54 4f 25 20  w [$type %AUTO% 
2600: 24 6d 79 70 72 6f 6a 65 63 74 20 24 6d 79 74 79  $myproject $myty
2610: 70 65 20 24 6d 79 73 72 63 69 64 20 5b 6c 72 61  pe $mysrcid [lra
2620: 6e 67 65 20 24 6d 79 69 74 65 6d 73 20 24 73 20  nge $myitems $s 
2630: 24 65 5d 5d 0a 0a 20 20 20 20 20 20 20 20 20 20  $e]]..          
2640: 20 20 6c 6f 67 20 77 72 69 74 65 20 34 20 63 73    log write 4 cs
2650: 65 74 73 20 22 42 72 65 61 6b 69 6e 67 20 5b 24  ets "Breaking [$
2660: 73 65 6c 66 20 73 74 72 20 5d 20 40 20 24 6c 61  self str ] @ $la
2670: 73 74 65 2c 20 6e 65 77 20 5b 24 6e 65 77 20 73  ste, new [$new s
2680: 74 72 5d 2c 20 63 75 74 74 69 6e 67 20 24 62 72  tr], cutting $br
2690: 65 61 6b 73 28 24 6c 61 73 74 65 29 22 0a 0a 09  eaks($laste)"...
26a0: 20 20 20 20 73 65 74 20 6c 61 73 74 65 20 24 65      set laste $e
26b0: 0a 09 7d 0a 0a 09 69 6e 74 65 67 72 69 74 79 20  ..}...integrity 
26c0: 61 73 73 65 72 74 20 7b 0a 09 20 20 20 20 24 6c  assert {..    $l
26d0: 61 73 74 65 20 3d 3d 20 28 5b 6c 6c 65 6e 67 74  aste == ([llengt
26e0: 68 20 24 6d 79 69 74 65 6d 73 5d 2d 31 29 0a 09  h $myitems]-1)..
26f0: 7d 20 7b 42 61 64 20 66 72 61 67 6d 65 6e 74 20  } {Bad fragment 
2700: 65 6e 64 20 40 20 24 6c 61 73 74 65 2c 20 67 61  end @ $laste, ga
2710: 70 2c 20 6f 72 20 62 65 79 6f 6e 64 20 65 6e 64  p, or beyond end
2720: 20 6f 66 20 74 68 65 20 72 61 6e 67 65 7d 0a 0a   of the range}..
2730: 09 23 20 50 75 74 20 74 68 65 20 66 69 72 73 74  .# Put the first
2740: 20 66 72 61 67 6d 65 6e 74 20 69 6e 74 6f 20 74   fragment into t
2750: 68 65 20 63 75 72 72 65 6e 74 20 63 68 61 6e 67  he current chang
2760: 65 73 65 74 2c 20 61 6e 64 0a 09 23 20 75 70 64  eset, and..# upd
2770: 61 74 65 20 74 68 65 20 69 6e 2d 6d 65 6d 6f 72  ate the in-memor
2780: 79 20 69 6e 64 65 78 2e 20 57 65 20 63 61 6e 20  y index. We can 
2790: 73 69 6d 70 6c 79 20 28 72 65 29 61 64 64 20 74  simply (re)add t
27a0: 68 65 20 69 74 65 6d 73 0a 09 23 20 62 65 63 61  he items..# beca
27b0: 75 73 65 20 77 65 20 63 6c 65 61 72 65 64 20 74  use we cleared t
27c0: 68 65 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78  he previously ex
27d0: 69 73 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  isting informati
27e0: 6f 6e 2c 20 73 65 65 0a 09 23 20 28 2a 29 20 61  on, see..# (*) a
27f0: 62 6f 76 65 2e 20 50 65 72 73 69 73 74 65 6e 63  bove. Persistenc
2800: 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74 65  e does not matte
2810: 72 20 68 65 72 65 2c 20 6e 6f 6e 65 20 6f 66 20  r here, none of 
2820: 74 68 65 0a 09 23 20 63 68 61 6e 67 65 73 65 74  the..# changeset
2830: 73 20 68 61 73 20 62 65 65 6e 20 73 61 76 65 64  s has been saved
2840: 20 74 6f 20 74 68 65 20 70 65 72 73 69 73 74 65   to the persiste
2850: 6e 74 20 73 74 61 74 65 20 79 65 74 2e 0a 0a 09  nt state yet....
2860: 73 65 74 20 6d 79 69 74 65 6d 73 20 20 5b 6c 72  set myitems  [lr
2870: 61 6e 67 65 20 24 6d 79 69 74 65 6d 73 20 20 30  ange $myitems  0
2880: 20 24 66 69 72 73 74 65 5d 0a 09 73 65 74 20 6d   $firste]..set m
2890: 79 74 69 74 65 6d 73 20 5b 6c 72 61 6e 67 65 20  ytitems [lrange 
28a0: 24 6d 79 74 69 74 65 6d 73 20 30 20 24 66 69 72  $mytitems 0 $fir
28b0: 73 74 65 5d 0a 09 66 6f 72 65 61 63 68 20 69 69  ste]..foreach ii
28c0: 64 20 24 6d 79 69 74 65 6d 73 20 7b 0a 09 20 20  d $myitems {..  
28d0: 20 20 73 65 74 20 6b 65 79 20 5b 6c 69 73 74 20    set key [list 
28e0: 24 6d 79 74 79 70 65 20 24 69 69 64 5d 0a 09 20  $mytype $iid].. 
28f0: 20 20 20 73 65 74 20 6d 79 69 74 65 6d 6d 61 70     set myitemmap
2900: 28 24 6b 65 79 29 20 24 73 65 6c 66 0a 09 20 20  ($key) $self..  
2910: 20 20 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73    log write 8 cs
2920: 65 74 73 20 7b 4d 41 50 2b 20 69 74 65 6d 20 3c  ets {MAP+ item <
2930: 24 6b 65 79 3e 20 24 73 65 6c 66 20 3d 20 5b 24  $key> $self = [$
2940: 73 65 6c 66 20 73 74 72 5d 7d 0a 09 7d 0a 0a 09  self str]}..}...
2950: 72 65 74 75 72 6e 20 31 0a 20 20 20 20 7d 0a 0a  return 1.    }..
2960: 20 20 20 20 6d 65 74 68 6f 64 20 70 65 72 73 69      method persi
2970: 73 74 20 7b 7d 20 7b 0a 09 73 65 74 20 74 69 64  st {} {..set tid
2980: 20 24 6d 79 63 73 74 79 70 65 28 24 6d 79 74 79   $mycstype($myty
2990: 70 65 29 0a 09 73 65 74 20 70 69 64 20 5b 24 6d  pe)..set pid [$m
29a0: 79 70 72 6f 6a 65 63 74 20 69 64 5d 0a 09 73 65  yproject id]..se
29b0: 74 20 70 6f 73 20 30 0a 0a 09 73 74 61 74 65 20  t pos 0...state 
29c0: 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 09 20  transaction {.. 
29d0: 20 20 20 73 74 61 74 65 20 72 75 6e 20 7b 0a 09     state run {..
29e0: 09 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 68 61  .INSERT INTO cha
29f0: 6e 67 65 73 65 74 20 28 63 69 64 2c 20 20 20 70  ngeset (cid,   p
2a00: 69 64 2c 20 20 74 79 70 65 2c 20 73 72 63 29 0a  id,  type, src).
2a10: 09 09 56 41 4c 55 45 53 20 20 20 20 20 20 20 20  ..VALUES        
2a20: 20 20 20 20 20 20 20 20 28 24 6d 79 69 64 2c 20          ($myid, 
2a30: 24 70 69 64 2c 20 24 74 69 64 2c 20 24 6d 79 73  $pid, $tid, $mys
2a40: 72 63 69 64 29 3b 0a 09 20 20 20 20 7d 0a 0a 09  rcid);..    }...
2a50: 20 20 20 20 66 6f 72 65 61 63 68 20 69 69 64 20      foreach iid 
2a60: 24 6d 79 69 74 65 6d 73 20 7b 0a 09 09 73 74 61  $myitems {...sta
2a70: 74 65 20 72 75 6e 20 7b 0a 09 09 20 20 20 20 49  te run {...    I
2a80: 4e 53 45 52 54 20 49 4e 54 4f 20 63 73 69 74 65  NSERT INTO csite
2a90: 6d 20 28 63 69 64 2c 20 20 20 70 6f 73 2c 20 20  m (cid,   pos,  
2aa0: 69 69 64 29 0a 09 09 20 20 20 20 56 41 4c 55 45  iid)...    VALUE
2ab0: 53 20 20 20 20 20 20 20 20 20 20 20 20 20 28 24  S             ($
2ac0: 6d 79 69 64 2c 20 24 70 6f 73 2c 20 24 69 69 64  myid, $pos, $iid
2ad0: 29 3b 0a 09 09 7d 0a 09 09 69 6e 63 72 20 70 6f  );...}...incr po
2ae0: 73 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72 65 74  s..    }..}..ret
2af0: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d  urn.    }..    m
2b00: 65 74 68 6f 64 20 74 69 6d 65 72 61 6e 67 65 20  ethod timerange 
2b10: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 5b 24 6d 79  {} { return [$my
2b20: 74 79 70 65 6f 62 6a 20 74 69 6d 65 72 61 6e 67  typeobj timerang
2b30: 65 20 24 6d 79 69 74 65 6d 73 5d 20 7d 0a 0a 20  e $myitems] }.. 
2b40: 20 20 20 6d 65 74 68 6f 64 20 6c 69 6d 69 74 73     method limits
2b50: 20 7b 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c   {} {..struct::l
2b60: 69 73 74 20 61 73 73 69 67 6e 20 5b 24 6d 79 74  ist assign [$myt
2b70: 79 70 65 6f 62 6a 20 6c 69 6d 69 74 73 20 24 6d  ypeobj limits $m
2b80: 79 69 74 65 6d 73 5d 20 6d 61 78 70 20 6d 69 6e  yitems] maxp min
2b90: 73 0a 09 72 65 74 75 72 6e 20 5b 6c 69 73 74 20  s..return [list 
2ba0: 5b 54 61 67 49 74 65 6d 44 69 63 74 20 24 6d 61  [TagItemDict $ma
2bb0: 78 70 20 24 6d 79 74 79 70 65 5d 20 5b 54 61 67  xp $mytype] [Tag
2bc0: 49 74 65 6d 44 69 63 74 20 24 6d 69 6e 73 20 24  ItemDict $mins $
2bd0: 6d 79 74 79 70 65 5d 5d 0a 20 20 20 20 7d 0a 0a  mytype]].    }..
2be0: 20 20 20 20 6d 65 74 68 6f 64 20 64 72 6f 70 20      method drop 
2bf0: 7b 7d 20 7b 0a 09 6c 6f 67 20 77 72 69 74 65 20  {} {..log write 
2c00: 38 20 63 73 65 74 73 20 7b 44 72 6f 70 70 69 6e  8 csets {Droppin
2c10: 67 20 24 73 65 6c 66 20 3d 20 5b 24 73 65 6c 66  g $self = [$self
2c20: 20 73 74 72 5d 7d 0a 0a 09 73 74 61 74 65 20 74   str]}...state t
2c30: 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 09 20 20  ransaction {..  
2c40: 20 20 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09    state run {...
2c50: 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 68 61 6e  DELETE FROM chan
2c60: 67 65 73 65 74 20 20 20 57 48 45 52 45 20 63 69  geset   WHERE ci
2c70: 64 20 3d 20 24 6d 79 69 64 3b 0a 09 09 44 45 4c  d = $myid;...DEL
2c80: 45 54 45 20 46 52 4f 4d 20 63 73 69 74 65 6d 20  ETE FROM csitem 
2c90: 20 20 20 20 20 57 48 45 52 45 20 63 69 64 20 3d       WHERE cid =
2ca0: 20 24 6d 79 69 64 3b 0a 09 09 44 45 4c 45 54 45   $myid;...DELETE
2cb0: 20 46 52 4f 4d 20 63 73 73 75 63 63 65 73 73 6f   FROM cssuccesso
2cc0: 72 20 57 48 45 52 45 20 63 69 64 20 3d 20 24 6d  r WHERE cid = $m
2cd0: 79 69 64 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  yid;..    }..}..
2ce0: 66 6f 72 65 61 63 68 20 69 69 64 20 24 6d 79 69  foreach iid $myi
2cf0: 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65 74 20  tems {..    set 
2d00: 6b 65 79 20 5b 6c 69 73 74 20 24 6d 79 74 79 70  key [list $mytyp
2d10: 65 20 24 69 69 64 5d 0a 09 20 20 20 20 75 6e 73  e $iid]..    uns
2d20: 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24 6b 65  et myitemmap($ke
2d30: 79 29 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74  y)..    log writ
2d40: 65 20 38 20 63 73 65 74 73 20 7b 4d 41 50 2d 20  e 8 csets {MAP- 
2d50: 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73 65 6c  item <$key> $sel
2d60: 66 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d 7d  f = [$self str]}
2d70: 0a 09 7d 0a 09 73 65 74 20 70 6f 73 20 20 20 20  ..}..set pos    
2d80: 20 20 20 20 20 20 5b 6c 73 65 61 72 63 68 20 2d        [lsearch -
2d90: 65 78 61 63 74 20 24 6d 79 63 68 61 6e 67 65 73  exact $mychanges
2da0: 65 74 73 20 24 73 65 6c 66 5d 0a 09 73 65 74 20  ets $self]..set 
2db0: 6d 79 63 68 61 6e 67 65 73 65 74 73 20 5b 6c 72  mychangesets [lr
2dc0: 65 70 6c 61 63 65 20 24 6d 79 63 68 61 6e 67 65  eplace $mychange
2dd0: 73 65 74 73 20 24 70 6f 73 20 24 70 6f 73 5d 0a  sets $pos $pos].
2de0: 09 73 65 74 20 70 6f 73 20 20 20 20 20 20 20 20  .set pos        
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 5b 6c 73 65              [lse
2e00: 61 72 63 68 20 2d 65 78 61 63 74 20 24 6d 79 74  arch -exact $myt
2e10: 63 68 61 6e 67 65 73 65 74 73 28 24 6d 79 74 79  changesets($myty
2e20: 70 65 29 20 24 73 65 6c 66 5d 0a 09 73 65 74 20  pe) $self]..set 
2e30: 6d 79 74 63 68 61 6e 67 65 73 65 74 73 28 24 6d  mytchangesets($m
2e40: 79 74 79 70 65 29 20 5b 6c 72 65 70 6c 61 63 65  ytype) [lreplace
2e50: 20 24 6d 79 74 63 68 61 6e 67 65 73 65 74 73 28   $mytchangesets(
2e60: 24 6d 79 74 79 70 65 29 20 24 70 6f 73 20 24 70  $mytype) $pos $p
2e70: 6f 73 5d 0a 0a 09 23 20 52 65 74 75 72 6e 20 74  os]...# Return t
2e80: 68 65 20 6c 69 73 74 20 6f 66 20 70 72 65 64 65  he list of prede
2e90: 63 65 73 73 6f 72 73 20 73 6f 20 74 68 61 74 20  cessors so that 
2ea0: 74 68 65 79 20 63 61 6e 20 62 65 20 61 64 6a 75  they can be adju
2eb0: 73 74 65 64 2e 0a 09 72 65 74 75 72 6e 20 5b 73  sted...return [s
2ec0: 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20  truct::list map 
2ed0: 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20  [state run {..  
2ee0: 20 20 53 45 4c 45 43 54 20 63 69 64 0a 09 20 20    SELECT cid..  
2ef0: 20 20 46 52 4f 4d 20 20 20 63 73 73 75 63 63 65    FROM   cssucce
2f00: 73 73 6f 72 0a 09 20 20 20 20 57 48 45 52 45 20  ssor..    WHERE 
2f10: 20 6e 69 64 20 3d 20 24 6d 79 69 64 0a 09 7d 5d   nid = $myid..}]
2f20: 20 5b 6d 79 74 79 70 65 6d 65 74 68 6f 64 20 6f   [mytypemethod o
2f30: 66 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d  f]].    }..    m
2f40: 65 74 68 6f 64 20 72 65 70 6f 72 74 6c 6f 6f 70  ethod reportloop
2f50: 20 7b 7b 6b 69 6c 6c 20 31 7d 7d 20 7b 0a 09 23   {{kill 1}} {..#
2f60: 20 57 65 20 70 72 69 6e 74 20 74 68 65 20 69 74   We print the it
2f70: 65 6d 73 20 77 68 69 63 68 20 61 72 65 20 70 72  ems which are pr
2f80: 6f 64 75 63 69 6e 67 20 74 68 65 20 6c 6f 6f 70  oducing the loop
2f90: 2c 20 61 6e 64 20 68 6f 77 2e 0a 0a 09 73 65 74  , and how....set
2fa0: 20 68 64 72 20 22 53 65 6c 66 2d 72 65 66 65 72   hdr "Self-refer
2fb0: 65 6e 74 69 61 6c 20 63 68 61 6e 67 65 73 65 74  ential changeset
2fc0: 20 5b 24 73 65 6c 66 20 73 74 72 5d 20 5f 5f 5f   [$self str] ___
2fd0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 22  _______________"
2fe0: 0a 09 73 65 74 20 66 74 72 20 5b 72 65 67 73 75  ..set ftr [regsu
2ff0: 62 20 2d 61 6c 6c 20 7b 5b 5e 20 09 5d 7d 20 24  b -all {[^ .]} $
3000: 68 64 72 20 7b 5f 7d 5d 0a 0a 09 6c 6f 67 20 77  hdr {_}]...log w
3010: 72 69 74 65 20 30 20 63 73 65 74 73 20 24 68 64  rite 0 csets $hd
3020: 72 0a 09 66 6f 72 65 61 63 68 20 7b 69 74 65 6d  r..foreach {item
3030: 20 6e 65 78 74 69 74 65 6d 7d 20 5b 24 6d 79 74   nextitem} [$myt
3040: 79 70 65 6f 62 6a 20 6c 6f 6f 70 73 20 24 6d 79  ypeobj loops $my
3050: 69 74 65 6d 73 5d 20 7b 0a 09 20 20 20 20 23 20  items] {..    # 
3060: 43 72 65 61 74 65 20 74 61 67 67 65 64 20 69 74  Create tagged it
3070: 65 6d 73 20 66 72 6f 6d 20 74 68 65 20 69 64 20  ems from the id 
3080: 61 6e 64 20 6f 75 72 20 74 79 70 65 2e 0a 09 20  and our type... 
3090: 20 20 20 73 65 74 20 69 74 65 6d 20 20 20 20 20     set item     
30a0: 5b 6c 69 73 74 20 24 6d 79 74 79 70 65 20 20 24  [list $mytype  $
30b0: 69 74 65 6d 5d 0a 09 20 20 20 20 73 65 74 20 6e  item]..    set n
30c0: 65 78 74 69 74 65 6d 20 5b 6c 69 73 74 20 24 6d  extitem [list $m
30d0: 79 74 79 70 65 20 24 6e 65 78 74 69 74 65 6d 5d  ytype $nextitem]
30e0: 0a 09 20 20 20 20 23 20 50 72 69 6e 74 61 62 6c  ..    # Printabl
30f0: 65 20 6c 61 62 65 6c 73 2e 0a 09 20 20 20 20 73  e labels...    s
3100: 65 74 20 69 20 20 22 3c 5b 24 74 79 70 65 20 69  et i  "<[$type i
3110: 74 65 6d 73 74 72 20 24 69 74 65 6d 5d 3e 22 0a  temstr $item]>".
3120: 09 20 20 20 20 73 65 74 20 6e 20 20 22 3c 5b 24  .    set n  "<[$
3130: 74 79 70 65 20 69 74 65 6d 73 74 72 20 24 6e 65  type itemstr $ne
3140: 78 74 69 74 65 6d 5d 3e 22 0a 09 20 20 20 20 73  xtitem]>"..    s
3150: 65 74 20 6e 63 73 20 24 6d 79 69 74 65 6d 6d 61  et ncs $myitemma
3160: 70 28 24 6e 65 78 74 69 74 65 6d 29 0a 09 20 20  p($nextitem)..  
3170: 20 20 23 20 50 72 69 6e 74 0a 09 20 20 20 20 6c    # Print..    l
3180: 6f 67 20 77 72 69 74 65 20 30 20 63 73 65 74 73  og write 0 csets
3190: 20 7b 2a 20 24 69 20 2d 2d 3e 20 24 6e 20 2d 2d   {* $i --> $n --
31a0: 3e 20 63 73 20 5b 24 6e 63 73 20 73 74 72 5d 7d  > cs [$ncs str]}
31b0: 0a 09 7d 0a 09 6c 6f 67 20 77 72 69 74 65 20 30  ..}..log write 0
31c0: 20 63 73 65 74 73 20 24 66 74 72 0a 0a 09 69 66   csets $ftr...if
31d0: 20 7b 21 24 6b 69 6c 6c 7d 20 72 65 74 75 72 6e   {!$kill} return
31e0: 0a 09 74 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e  ..trouble intern
31f0: 61 6c 20 22 5b 24 73 65 6c 66 20 73 74 72 5d 20  al "[$self str] 
3200: 64 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c  depends on itsel
3210: 66 22 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d  f"..return.    }
3220: 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 70 75 73  ..    method pus
3230: 68 74 6f 20 7b 72 65 70 6f 73 69 74 6f 72 79 20  hto {repository 
3240: 64 61 74 65 20 72 73 74 61 74 65 7d 20 7b 0a 09  date rstate} {..
3250: 23 20 47 65 6e 65 72 61 74 65 20 61 6e 64 20 69  # Generate and i
3260: 6d 70 6f 72 74 20 74 68 65 20 6d 61 6e 69 66 65  mport the manife
3270: 73 74 20 66 6f 72 20 74 68 69 73 20 63 68 61 6e  st for this chan
3280: 67 65 73 65 74 2e 0a 09 23 0a 09 23 20 44 61 74  geset...#..# Dat
3290: 61 20 6e 65 65 64 65 64 3a 0a 09 23 20 2d 20 43  a needed:..# - C
32a0: 6f 6d 6d 69 74 20 6d 65 73 73 61 67 65 20 20 20  ommit message   
32b0: 20 20 20 20 20 20 20 20 20 20 20 20 28 2d 2d 20              (-- 
32c0: 6d 79 73 72 63 69 64 20 2d 3e 20 72 65 70 6f 73  mysrcid -> repos
32d0: 69 74 6f 72 79 20 6d 65 74 61 29 0a 09 23 20 2d  itory meta)..# -
32e0: 20 55 73 65 72 20 64 6f 69 6e 67 20 74 68 65 20   User doing the 
32f0: 63 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 28 73  commit        (s
3300: 2e 61 2e 29 0a 09 23 0a 09 23 20 2d 20 54 69 6d  .a.)..#..# - Tim
3310: 65 73 74 61 6d 70 20 6f 66 20 77 68 65 6e 20 63  estamp of when c
3320: 6f 6d 6d 69 74 74 65 64 20 20 28 63 6f 6d 6d 61  ommitted  (comma
3330: 6e 64 20 61 72 67 75 6d 65 6e 74 29 0a 09 23 0a  nd argument)..#.
3340: 09 23 20 2d 20 54 68 65 20 70 61 72 65 6e 74 20  .# - The parent 
3350: 63 68 61 6e 67 65 73 65 74 2c 20 69 66 20 61 6e  changeset, if an
3360: 79 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  y. If there is n
3370: 6f 20 70 61 72 65 6e 74 20 66 6f 73 73 69 6c 0a  o parent fossil.
3380: 09 23 20 20 20 77 69 6c 6c 20 75 73 65 20 74 68  .#   will use th
3390: 65 20 65 6d 70 74 79 20 62 61 73 65 20 72 65 76  e empty base rev
33a0: 69 73 69 6f 6e 20 61 73 20 70 61 72 65 6e 74 2e  ision as parent.
33b0: 0a 09 23 0a 09 23 20 2d 20 4c 69 73 74 20 6f 66  ..#..# - List of
33c0: 20 74 68 65 20 66 69 6c 65 20 72 65 76 69 73 69   the file revisi
33d0: 6f 6e 73 20 69 6e 20 74 68 65 20 63 68 61 6e 67  ons in the chang
33e0: 65 73 65 74 2e 0a 0a 09 73 74 72 75 63 74 3a 3a  eset....struct::
33f0: 6c 69 73 74 20 61 73 73 69 67 6e 20 5b 24 6d 79  list assign [$my
3400: 70 72 6f 6a 65 63 74 20 67 65 74 6d 65 74 61 20  project getmeta 
3410: 24 6d 79 73 72 63 69 64 5d 20 5f 5f 20 5f 5f 20  $mysrcid] __ __ 
3420: 75 73 65 72 20 6d 65 73 73 61 67 65 0a 0a 09 23  user message...#
3430: 20 57 65 20 64 65 72 69 76 65 20 74 68 65 20 6c   We derive the l
3440: 6f 64 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 64  od information d
3450: 69 72 65 63 74 6c 79 20 66 72 6f 6d 20 74 68 65  irectly from the
3460: 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 0a 09 23   revisions of..#
3470: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20   the changeset, 
3480: 61 73 20 74 68 65 20 62 72 61 6e 63 68 20 70 61  as the branch pa
3490: 72 74 20 6f 66 20 74 68 65 20 6d 65 74 61 20 64  rt of the meta d
34a0: 61 74 61 20 28 73 2e 61 2e 29 20 69 73 0a 09 23  ata (s.a.) is..#
34b0: 20 6f 75 74 64 61 74 65 64 20 73 69 6e 63 65 20   outdated since 
34c0: 70 61 73 73 20 46 69 6c 74 65 72 53 79 6d 62 6f  pass FilterSymbo
34d0: 6c 73 2e 0a 0a 09 73 65 74 20 6c 6f 64 6e 61 6d  ls....set lodnam
34e0: 65 20 5b 24 73 65 6c 66 20 6c 6f 64 5d 0a 0a 09  e [$self lod]...
34f0: 6c 6f 67 20 77 72 69 74 65 20 32 20 63 73 65 74  log write 2 cset
3500: 73 20 7b 49 6d 70 6f 72 74 69 6e 67 20 72 65 76  s {Importing rev
3510: 69 73 69 6f 6e 20 5b 24 73 65 6c 66 20 73 74 72  ision [$self str
3520: 5d 20 6f 6e 20 24 6c 6f 64 6e 61 6d 65 7d 0a 0a  ] on $lodname}..
3530: 09 23 20 50 65 72 66 6f 72 6d 20 74 68 65 20 69  .# Perform the i
3540: 6d 70 6f 72 74 2e 20 41 73 20 70 61 72 74 20 6f  mport. As part o
3550: 66 20 74 68 61 74 20 77 65 20 64 65 74 65 72 6d  f that we determ
3560: 69 6e 65 20 74 68 65 20 70 61 72 65 6e 74 0a 09  ine the parent..
3570: 23 20 77 65 20 6e 65 65 64 2c 20 61 6e 64 20 63  # we need, and c
3580: 6f 6e 76 65 72 74 20 74 68 65 20 6c 69 73 74 20  onvert the list 
3590: 6f 66 20 69 74 65 6d 73 20 69 6e 20 74 68 65 20  of items in the 
35a0: 63 68 61 6e 67 65 73 65 74 20 69 6e 74 6f 0a 09  changeset into..
35b0: 23 20 75 75 69 64 73 20 61 6e 64 20 70 72 69 6e  # uuids and prin
35c0: 74 61 62 6c 65 20 64 61 74 61 2e 0a 0a 09 73 74  table data....st
35d0: 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67  ruct::list assig
35e0: 6e 20 5b 47 65 74 69 73 64 65 66 61 75 6c 74 20  n [Getisdefault 
35f0: 24 6d 79 69 74 65 6d 73 5d 20 69 73 64 65 66 61  $myitems] isdefa
3600: 75 6c 74 20 6c 61 73 74 64 65 66 61 75 6c 74 6f  ult lastdefaulto
3610: 6e 74 72 75 6e 6b 0a 0a 09 6c 6f 67 20 77 72 69  ntrunk...log wri
3620: 74 65 20 38 20 63 73 65 74 73 20 7b 4c 4f 44 20  te 8 csets {LOD 
3630: 20 20 20 27 24 6c 6f 64 6e 61 6d 65 27 7d 0a 09     '$lodname'}..
3640: 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73 65 74  log write 8 cset
3650: 73 20 7b 20 64 65 66 3f 20 20 24 69 73 64 65 66  s { def?  $isdef
3660: 61 75 6c 74 7d 0a 09 6c 6f 67 20 77 72 69 74 65  ault}..log write
3670: 20 38 20 63 73 65 74 73 20 7b 20 6c 61 73 74 3f   8 csets { last?
3680: 20 24 6c 61 73 74 64 65 66 61 75 6c 74 6f 6e 74   $lastdefaultont
3690: 72 75 6e 6b 7d 0a 0a 09 73 65 74 20 6c 77 73 20  runk}...set lws 
36a0: 20 5b 47 65 74 77 6f 72 6b 73 70 61 63 65 20 20   [Getworkspace  
36b0: 20 20 24 72 73 74 61 74 65 20 24 6c 6f 64 6e 61    $rstate $lodna
36c0: 6d 65 20 24 6d 79 70 72 6f 6a 65 63 74 20 24 69  me $myproject $i
36d0: 73 64 65 66 61 75 6c 74 5d 0a 09 24 6c 77 73 20  sdefault]..$lws 
36e0: 61 64 64 20 5b 47 65 74 72 65 76 69 73 69 6f 6e  add [Getrevision
36f0: 69 6e 66 6f 20 24 6d 79 69 74 65 6d 73 5d 0a 0a  info $myitems]..
3700: 09 73 65 74 20 75 75 69 64 20 5b 24 72 65 70 6f  .set uuid [$repo
3710: 73 69 74 6f 72 79 20 69 6d 70 6f 72 74 72 65 76  sitory importrev
3720: 69 73 69 6f 6e 20 5b 24 73 65 6c 66 20 73 74 72  ision [$self str
3730: 5d 20 5c 0a 09 09 20 20 20 20 20 20 24 75 73 65  ] \...      $use
3740: 72 20 24 6d 65 73 73 61 67 65 20 24 64 61 74 65  r $message $date
3750: 20 5c 0a 09 09 20 20 20 20 20 20 5b 24 6c 77 73   \...      [$lws
3760: 20 67 65 74 69 64 5d 20 5b 24 6c 77 73 20 67 65   getid] [$lws ge
3770: 74 5d 5d 0a 0a 09 23 20 52 65 6d 65 6d 62 65 72  t]]...# Remember
3780: 20 74 68 65 20 69 6d 70 6f 72 74 65 64 20 63 68   the imported ch
3790: 61 6e 67 65 73 65 74 20 69 6e 20 74 68 65 20 73  angeset in the s
37a0: 74 61 74 65 2c 20 75 6e 64 65 72 20 6f 75 72 0a  tate, under our.
37b0: 09 23 20 4c 4f 44 2e 20 41 6e 64 20 69 66 20 69  .# LOD. And if i
37c0: 74 20 69 73 20 74 68 65 20 6c 61 73 74 20 74 72  t is the last tr
37d0: 75 6e 6b 20 63 68 61 6e 67 65 73 65 74 20 6f 6e  unk changeset on
37e0: 20 74 68 65 20 76 65 6e 64 6f 72 0a 09 23 20 62   the vendor..# b
37f0: 72 61 6e 63 68 20 74 68 65 6e 20 74 68 65 20 72  ranch then the r
3800: 65 76 69 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20  evision is also 
3810: 74 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20  the actual root 
3820: 6f 66 20 74 68 65 0a 09 23 20 3a 74 72 75 6e 6b  of the..# :trunk
3830: 3a 2c 20 73 6f 20 77 65 20 72 65 6d 65 6d 62 65  :, so we remembe
3840: 72 20 69 74 20 61 73 20 73 75 63 68 20 69 6e 20  r it as such in 
3850: 74 68 65 20 73 74 61 74 65 2e 20 48 6f 77 65 76  the state. Howev
3860: 65 72 20 69 66 0a 09 23 20 74 68 65 20 74 72 75  er if..# the tru
3870: 6e 6b 20 61 6c 72 65 61 64 79 20 65 78 69 73 74  nk already exist
3880: 73 20 74 68 65 6e 20 74 68 65 20 63 68 61 6e 67  s then the chang
3890: 65 73 65 74 20 63 61 6e 6e 6f 74 20 62 65 20 6f  eset cannot be o
38a0: 6e 20 69 74 0a 09 23 20 61 6e 79 20 6d 6f 72 65  n it..# any more
38b0: 2e 20 54 68 69 73 20 69 6e 64 69 63 61 74 65 73  . This indicates
38c0: 20 77 65 69 72 64 6e 65 73 73 20 69 6e 20 74 68   weirdness in th
38d0: 65 20 73 65 74 75 70 20 6f 66 20 74 68 65 0a 09  e setup of the..
38e0: 23 20 76 65 6e 64 6f 72 20 62 72 61 6e 63 68 2c  # vendor branch,
38f0: 20 62 75 74 20 6f 6e 65 20 77 65 20 63 61 6e 20   but one we can 
3900: 77 6f 72 6b 20 61 72 6f 75 6e 64 2e 0a 0a 09 24  work around....$
3910: 6c 77 73 20 64 65 66 69 64 20 24 75 75 69 64 0a  lws defid $uuid.
3920: 09 69 66 20 7b 24 6c 61 73 74 64 65 66 61 75 6c  .if {$lastdefaul
3930: 74 6f 6e 74 72 75 6e 6b 7d 20 7b 0a 09 20 20 20  tontrunk} {..   
3940: 20 69 66 20 7b 5b 24 72 73 74 61 74 65 20 68 61   if {[$rstate ha
3950: 73 20 3a 74 72 75 6e 6b 3a 5d 7d 20 7b 0a 09 09  s :trunk:]} {...
3960: 6c 6f 67 20 77 72 69 74 65 20 32 20 63 73 65 74  log write 2 cset
3970: 73 20 7b 4d 75 6c 74 69 70 6c 65 20 63 68 61 6e  s {Multiple chan
3980: 67 65 73 65 74 73 20 64 65 63 6c 61 72 65 64 20  gesets declared 
3990: 74 6f 20 62 65 20 74 68 65 20 6c 61 73 74 20 74  to be the last t
39a0: 72 75 6e 6b 20 63 68 61 6e 67 65 73 65 74 20 6f  runk changeset o
39b0: 6e 20 74 68 65 20 76 65 6e 64 6f 72 2d 62 72 61  n the vendor-bra
39c0: 6e 63 68 7d 0a 09 20 20 20 20 7d 20 65 6c 73 65  nch}..    } else
39d0: 20 7b 0a 09 09 24 72 73 74 61 74 65 20 6e 65 77   {...$rstate new
39e0: 20 3a 74 72 75 6e 6b 3a 20 5b 24 6c 77 73 20 6e   :trunk: [$lws n
39f0: 61 6d 65 5d 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a  ame]..    }..}..
3a00: 09 23 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  .# Remember the 
3a10: 77 68 6f 6c 65 20 63 68 61 6e 67 65 73 65 74 20  whole changeset 
3a20: 2f 20 75 75 69 64 20 6d 61 70 70 69 6e 67 2c 20  / uuid mapping, 
3a30: 66 6f 72 20 74 68 65 20 74 61 67 73 2e 0a 0a 09  for the tags....
3a40: 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20  state run {..   
3a50: 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63 73 75   INSERT INTO csu
3a60: 75 69 64 20 28 63 69 64 2c 20 20 20 75 75 69 64  uid (cid,   uuid
3a70: 29 0a 09 20 20 20 20 56 41 4c 55 45 53 20 20 20  )..    VALUES   
3a80: 20 20 20 20 20 20 20 20 20 20 28 24 6d 79 69 64            ($myid
3a90: 2c 20 24 75 75 69 64 29 0a 09 7d 0a 09 72 65 74  , $uuid)..}..ret
3aa0: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  urn.    }..    p
3ab0: 72 6f 63 20 47 65 74 72 65 76 69 73 69 6f 6e 69  roc Getrevisioni
3ac0: 6e 66 6f 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20  nfo {revisions} 
3ad0: 7b 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27  {..set theset ('
3ae0: 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73  [join $revisions
3af0: 20 7b 27 2c 27 7d 5d 27 29 0a 09 73 65 74 20 72   {','}]')..set r
3b00: 65 76 69 73 69 6f 6e 73 20 7b 7d 0a 09 66 6f 72  evisions {}..for
3b10: 65 61 63 68 20 7b 66 72 69 64 20 70 61 74 68 20  each {frid path 
3b20: 66 6e 61 6d 65 20 72 65 76 6e 72 20 72 6f 70 7d  fname revnr rop}
3b30: 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62   [state run [sub
3b40: 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d  st -nocommands -
3b50: 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a  nobackslashes {.
3b60: 09 20 20 20 20 53 45 4c 45 43 54 20 55 2e 75 75  .    SELECT U.uu
3b70: 69 64 2c 20 46 2e 76 69 73 69 62 6c 65 2c 20 46  id, F.visible, F
3b80: 2e 6e 61 6d 65 2c 20 52 2e 72 65 76 2c 20 52 2e  .name, R.rev, R.
3b90: 6f 70 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72  op..    FROM   r
3ba0: 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 75 75  evision R, revuu
3bb0: 69 64 20 55 2c 20 66 69 6c 65 20 46 0a 09 20 20  id U, file F..  
3bc0: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 49    WHERE  R.rid I
3bd0: 4e 20 24 74 68 65 73 65 74 20 20 2d 2d 20 41 6c  N $theset  -- Al
3be0: 6c 20 73 70 65 63 69 66 69 65 64 20 72 65 76 69  l specified revi
3bf0: 73 69 6f 6e 73 0a 09 20 20 20 20 41 4e 44 20 20  sions..    AND  
3c00: 20 20 55 2e 72 69 64 20 3d 20 52 2e 72 69 64 20    U.rid = R.rid 
3c10: 20 20 20 20 2d 2d 20 67 65 74 20 66 6f 73 73 69      -- get fossi
3c20: 6c 20 75 75 69 64 20 6f 66 20 72 65 76 69 73 69  l uuid of revisi
3c30: 6f 6e 0a 09 20 20 20 20 41 4e 44 20 20 20 20 46  on..    AND    F
3c40: 2e 66 69 64 20 3d 20 52 2e 66 69 64 20 20 20 20  .fid = R.fid    
3c50: 20 2d 2d 20 67 65 74 20 66 69 6c 65 20 6f 66 20   -- get file of 
3c60: 72 65 76 69 73 69 6f 6e 0a 09 7d 5d 5d 20 7b 0a  revision..}]] {.
3c70: 09 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 76  .    lappend rev
3c80: 69 73 69 6f 6e 73 20 24 66 72 69 64 20 24 70 61  isions $frid $pa
3c90: 74 68 20 24 66 6e 61 6d 65 2f 24 72 65 76 6e 72  th $fname/$revnr
3ca0: 20 24 72 6f 70 0a 09 7d 0a 09 72 65 74 75 72 6e   $rop..}..return
3cb0: 20 24 72 65 76 69 73 69 6f 6e 73 0a 20 20 20 20   $revisions.    
3cc0: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 47 65 74 77  }..    proc Getw
3cd0: 6f 72 6b 73 70 61 63 65 20 7b 72 73 74 61 74 65  orkspace {rstate
3ce0: 20 6c 6f 64 6e 61 6d 65 20 70 72 6f 6a 65 63 74   lodname project
3cf0: 20 69 73 64 65 66 61 75 6c 74 7d 20 7b 0a 0a 09   isdefault} {...
3d00: 23 20 54 68 65 20 73 74 61 74 65 20 6f 62 6a 65  # The state obje
3d10: 63 74 20 68 6f 6c 64 73 20 74 68 65 20 77 6f 72  ct holds the wor
3d20: 6b 73 70 61 63 65 20 73 74 61 74 65 20 6f 66 20  kspace state of 
3d30: 65 61 63 68 20 6b 6e 6f 77 6e 0a 09 23 20 6c 69  each known..# li
3d40: 6e 65 2d 6f 66 2d 64 65 76 65 6c 6f 70 6d 65 6e  ne-of-developmen
3d50: 74 20 28 4c 4f 44 29 2c 20 75 70 20 74 6f 20 74  t (LOD), up to t
3d60: 68 65 20 6c 61 73 74 20 63 6f 6d 6d 69 74 74 65  he last committe
3d70: 64 0a 09 23 20 63 68 61 6e 67 65 73 65 74 20 62  d..# changeset b
3d80: 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 61 74  elonging to that
3d90: 20 4c 4f 44 2e 0a 0a 09 23 20 28 2a 29 20 53 74   LOD....# (*) St
3da0: 61 6e 64 61 72 64 20 68 61 6e 64 6c 69 6e 67 20  andard handling 
3db0: 69 66 20 69 6e 2d 4c 4f 44 20 63 68 61 6e 67 65  if in-LOD change
3dc0: 73 65 74 73 2e 20 49 66 20 74 68 65 20 4c 4f 44  sets. If the LOD
3dd0: 20 6f 66 0a 09 23 20 20 20 20 20 74 68 65 20 63   of..#     the c
3de0: 75 72 72 65 6e 74 20 63 68 61 6e 67 65 73 65 74  urrent changeset
3df0: 20 65 78 69 73 74 73 20 69 6e 20 74 68 65 20 73   exists in the s
3e00: 74 61 74 65 20 28 3d 20 68 61 73 20 62 65 65 6e  tate (= has been
3e10: 0a 09 23 20 20 20 20 20 63 6f 6d 6d 69 74 74 65  ..#     committe
3e20: 64 20 74 6f 29 20 74 68 65 6e 20 74 68 69 73 20  d to) then this 
3e30: 69 74 20 68 61 73 20 74 68 65 20 77 6f 72 6b 73  it has the works
3e40: 70 61 63 65 20 77 65 20 61 72 65 0a 09 23 20 20  pace we are..#  
3e50: 20 20 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 2e 0a     looking for..
3e60: 0a 09 69 66 20 7b 5b 24 72 73 74 61 74 65 20 68  ..if {[$rstate h
3e70: 61 73 20 24 6c 6f 64 6e 61 6d 65 5d 7d 20 7b 0a  as $lodname]} {.
3e80: 09 20 20 20 20 72 65 74 75 72 6e 20 5b 24 72 73  .    return [$rs
3e90: 74 61 74 65 20 67 65 74 20 24 6c 6f 64 6e 61 6d  tate get $lodnam
3ea0: 65 5d 0a 09 7d 0a 0a 09 23 20 49 66 20 74 68 65  e]..}...# If the
3eb0: 20 4c 4f 44 20 69 73 20 68 6f 77 65 76 65 72 20   LOD is however 
3ec0: 6e 6f 74 20 79 65 74 20 6b 6e 6f 77 6e 2c 20 74  not yet known, t
3ed0: 68 65 6e 20 74 68 65 20 63 75 72 72 65 6e 74 0a  hen the current.
3ee0: 09 23 20 63 68 61 6e 67 65 73 65 74 20 63 61 6e  .# changeset can
3ef0: 20 62 65 20 65 69 74 68 65 72 20 6f 66 0a 09 23   be either of..#
3f00: 20 28 61 29 20 72 6f 6f 74 20 6f 66 20 61 20 76   (a) root of a v
3f10: 65 6e 64 6f 72 20 62 72 61 6e 63 68 2c 0a 09 23  endor branch,..#
3f20: 20 28 62 29 20 72 6f 6f 74 20 6f 66 20 74 68 65   (b) root of the
3f30: 20 74 72 75 6e 6b 20 4c 4f 44 2c 20 6f 72 0a 09   trunk LOD, or..
3f40: 23 20 28 63 29 20 74 68 65 20 66 69 72 73 74 20  # (c) the first 
3f50: 63 68 61 6e 67 65 73 65 74 20 69 6e 20 61 20 6e  changeset in a n
3f60: 65 77 20 4c 4f 44 20 77 68 69 63 68 20 77 61 73  ew LOD which was
3f70: 20 73 70 61 77 6e 65 64 20 66 72 6f 6d 0a 09 23   spawned from..#
3f80: 20 20 20 20 20 61 6e 20 65 78 69 73 74 69 6e 67       an existing
3f90: 20 4c 4f 44 2e 0a 0a 09 69 66 20 7b 24 69 73 64   LOD....if {$isd
3fa0: 65 66 61 75 6c 74 20 7c 7c 20 28 24 6c 6f 64 6e  efault || ($lodn
3fb0: 61 6d 65 20 65 71 20 22 3a 74 72 75 6e 6b 3a 22  ame eq ":trunk:"
3fc0: 29 7d 20 7b 0a 09 20 20 20 20 23 20 46 6f 72 20  )} {..    # For 
3fd0: 62 6f 74 68 20 28 61 29 20 61 6e 64 20 28 62 29  both (a) and (b)
3fe0: 20 77 65 20 68 61 76 65 20 74 6f 20 63 72 65 61   we have to crea
3ff0: 74 65 20 61 20 6e 65 77 20 77 6f 72 6b 73 70 61  te a new workspa
4000: 63 65 0a 09 20 20 20 20 23 20 66 6f 72 20 74 68  ce..    # for th
4010: 65 20 6c 6f 64 2c 20 61 6e 64 20 69 74 20 64 6f  e lod, and it do
4020: 65 73 6e 27 74 20 69 6e 68 65 72 69 74 20 66 72  esn't inherit fr
4030: 6f 6d 20 61 6e 79 74 68 69 6e 67 2e 0a 0a 09 20  om anything.... 
4040: 20 20 20 23 20 4e 6f 74 65 20 74 68 61 74 20 63     # Note that c
4050: 61 73 65 20 28 62 29 20 6d 61 79 20 6e 65 76 65  ase (b) may neve
4060: 72 20 6f 63 63 75 72 2e 20 53 65 65 20 74 68 65  r occur. See the
4070: 20 76 61 72 69 61 62 6c 65 0a 09 20 20 20 20 23   variable..    #
4080: 20 27 6c 61 73 74 64 65 66 61 75 6c 74 6f 6e 74   'lastdefaultont
4090: 72 75 6e 6b 27 20 69 6e 20 74 68 65 20 63 61 6c  runk' in the cal
40a0: 6c 65 72 20 28 6d 65 74 68 6f 64 20 70 75 73 68  ler (method push
40b0: 74 6f 29 2e 20 54 68 69 73 0a 09 20 20 20 20 23  to). This..    #
40c0: 20 66 6c 61 67 20 63 61 6e 20 74 68 65 20 67 65   flag can the ge
40d0: 6e 65 72 61 74 69 6f 6e 20 6f 66 20 74 68 65 20  neration of the 
40e0: 77 6f 72 6b 73 70 61 63 65 20 66 6f 72 20 74 68  workspace for th
40f0: 65 20 3a 74 72 75 6e 6b 3a 0a 09 20 20 20 20 23  e :trunk:..    #
4100: 20 4c 4f 44 20 61 73 20 77 65 6c 6c 2c 20 6d 61   LOD as well, ma
4110: 6b 69 6e 67 20 69 74 20 69 6e 68 65 72 69 74 20  king it inherit 
4120: 74 68 65 20 73 74 61 74 65 20 6f 66 20 74 68 65  the state of the
4130: 20 6c 61 73 74 0a 09 20 20 20 20 23 20 74 72 75   last..    # tru
4140: 6e 6b 2d 63 68 61 6e 67 65 73 65 74 20 6f 6e 20  nk-changeset on 
4150: 74 68 65 20 76 65 6e 64 6f 72 2d 62 72 61 6e 63  the vendor-branc
4160: 68 2e 0a 0a 09 20 20 20 20 72 65 74 75 72 6e 20  h....    return 
4170: 5b 24 72 73 74 61 74 65 20 6e 65 77 20 24 6c 6f  [$rstate new $lo
4180: 64 6e 61 6d 65 5d 0a 09 7d 0a 0a 09 23 20 43 61  dname]..}...# Ca
4190: 73 65 20 28 63 29 2e 20 57 65 20 66 69 6e 64 20  se (c). We find 
41a0: 74 68 65 20 70 61 72 65 6e 74 20 4c 4f 44 20 6f  the parent LOD o
41b0: 66 20 6f 75 72 20 4c 4f 44 20 61 6e 64 20 6c 65  f our LOD and le
41c0: 74 20 74 68 65 20 6e 65 77 0a 09 23 20 77 6f 72  t the new..# wor
41d0: 6b 73 70 61 63 65 20 69 6e 68 65 72 69 74 20 66  kspace inherit f
41e0: 72 6f 6d 20 74 68 65 20 70 61 72 65 6e 74 27 73  rom the parent's
41f0: 20 77 6f 72 6b 73 70 61 63 65 2e 0a 0a 09 73 65   workspace....se
4200: 74 20 70 6c 6f 64 6e 61 6d 65 20 5b 5b 5b 24 70  t plodname [[[$p
4210: 72 6f 6a 65 63 74 20 67 65 74 73 79 6d 62 6f 6c  roject getsymbol
4220: 20 24 6c 6f 64 6e 61 6d 65 5d 20 70 61 72 65 6e   $lodname] paren
4230: 74 5d 20 6e 61 6d 65 5d 0a 0a 09 6c 6f 67 20 77  t] name]...log w
4240: 72 69 74 65 20 38 20 63 73 65 74 73 20 7b 70 4c  rite 8 csets {pL
4250: 4f 44 20 20 20 27 24 70 6c 6f 64 6e 61 6d 65 27  OD   '$plodname'
4260: 7d 0a 0a 09 69 66 20 7b 5b 24 72 73 74 61 74 65  }...if {[$rstate
4270: 20 68 61 73 20 24 70 6c 6f 64 6e 61 6d 65 5d 7d   has $plodname]}
4280: 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 5b   {..    return [
4290: 24 72 73 74 61 74 65 20 6e 65 77 20 24 6c 6f 64  $rstate new $lod
42a0: 6e 61 6d 65 20 24 70 6c 6f 64 6e 61 6d 65 5d 0a  name $plodname].
42b0: 09 7d 0a 0a 09 66 6f 72 65 61 63 68 20 6b 20 5b  .}...foreach k [
42c0: 6c 73 6f 72 74 20 5b 24 72 73 74 61 74 65 20 6e  lsort [$rstate n
42d0: 61 6d 65 73 5d 5d 20 7b 0a 09 20 20 20 20 6c 6f  ames]] {..    lo
42e0: 67 20 77 72 69 74 65 20 38 20 63 73 65 74 73 20  g write 8 csets 
42f0: 7b 20 20 20 20 24 6b 20 3d 20 5b 5b 24 72 73 74  {    $k = [[$rst
4300: 61 74 65 20 67 65 74 20 24 6b 5d 20 67 65 74 69  ate get $k] geti
4310: 64 5d 7d 0a 09 7d 0a 0a 09 74 72 6f 75 62 6c 65  d]}..}...trouble
4320: 20 69 6e 74 65 72 6e 61 6c 20 7b 55 6e 61 62 6c   internal {Unabl
4330: 65 20 74 6f 20 64 65 74 65 72 6d 69 6e 65 20 63  e to determine c
4340: 68 61 6e 67 65 73 65 74 20 70 61 72 65 6e 74 7d  hangeset parent}
4350: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
4360: 20 20 20 20 70 72 6f 63 20 47 65 74 69 73 64 65      proc Getisde
4370: 66 61 75 6c 74 20 7b 72 65 76 69 73 69 6f 6e 73  fault {revisions
4380: 7d 20 7b 0a 09 73 65 74 20 74 68 65 73 65 74 20  } {..set theset 
4390: 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f  ('[join $revisio
43a0: 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 73 74  ns {','}]')...st
43b0: 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67  ruct::list assig
43c0: 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75  n [state run [su
43d0: 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20  bst -nocommands 
43e0: 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b  -nobackslashes {
43f0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 69  ..    SELECT R.i
4400: 73 64 65 66 61 75 6c 74 2c 20 52 2e 64 62 63 68  sdefault, R.dbch
4410: 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  ild..    FROM   
4420: 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20  revision R..    
4430: 57 48 45 52 45 20 20 52 2e 72 69 64 20 49 4e 20  WHERE  R.rid IN 
4440: 24 74 68 65 73 65 74 20 20 2d 2d 20 41 6c 6c 20  $theset  -- All 
4450: 73 70 65 63 69 66 69 65 64 20 72 65 76 69 73 69  specified revisi
4460: 6f 6e 73 0a 09 20 20 20 20 4c 49 4d 49 54 20 31  ons..    LIMIT 1
4470: 0a 09 7d 5d 5d 20 64 65 66 20 6c 61 73 74 0a 0a  ..}]] def last..
4480: 09 23 20 54 4f 44 4f 2f 43 48 45 43 4b 3a 20 6c  .# TODO/CHECK: l
4490: 6f 6f 6b 20 66 6f 72 20 63 68 61 6e 67 65 73 65  ook for changese
44a0: 74 73 20 77 68 65 72 65 20 69 73 64 65 66 61 75  ts where isdefau
44b0: 6c 74 2f 64 62 63 68 69 6c 64 20 69 73 0a 09 23  lt/dbchild is..#
44c0: 20 61 6d 62 69 67 6f 75 73 2e 0a 0a 09 72 65 74   ambigous....ret
44d0: 75 72 6e 20 5b 6c 69 73 74 20 24 64 65 66 20 5b  urn [list $def [
44e0: 65 78 70 72 20 7b 24 6c 61 73 74 20 6e 65 20 22  expr {$last ne "
44f0: 22 7d 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  "}]].    }..    
4500: 74 79 70 65 6d 65 74 68 6f 64 20 73 70 6c 69 74  typemethod split
4510: 20 7b 63 73 65 74 20 61 72 67 73 7d 20 7b 0a 09   {cset args} {..
4520: 23 20 41 73 20 70 61 72 74 20 6f 66 20 74 68 65  # As part of the
4530: 20 63 72 65 61 74 69 6f 6e 20 6f 66 20 74 68 65   creation of the
4540: 20 6e 65 77 20 63 68 61 6e 67 65 73 65 74 73 20   new changesets 
4550: 73 70 65 63 69 66 69 65 64 20 69 6e 0a 09 23 20  specified in..# 
4560: 41 52 47 53 20 61 73 20 73 65 74 73 20 6f 66 20  ARGS as sets of 
4570: 69 74 65 6d 73 2c 20 61 6c 6c 20 73 75 62 73 65  items, all subse
4580: 74 73 20 6f 66 20 43 53 45 54 27 73 20 69 74 65  ts of CSET's ite
4590: 6d 20 73 65 74 2c 20 43 53 45 54 0a 09 23 20 77  m set, CSET..# w
45a0: 69 6c 6c 20 62 65 20 64 72 6f 70 70 65 64 20 66  ill be dropped f
45b0: 72 6f 6d 20 61 6c 6c 20 64 61 74 61 62 61 73 65  rom all database
45c0: 73 2c 20 69 6e 20 61 6e 64 20 6f 75 74 20 6f 66  s, in and out of
45d0: 20 6d 65 6d 6f 72 79 2c 0a 09 23 20 61 6e 64 20   memory,..# and 
45e0: 74 68 65 6e 20 64 65 73 74 72 6f 79 65 64 2e 0a  then destroyed..
45f0: 09 23 0a 09 23 20 4e 6f 74 65 3a 20 54 68 65 20  .#..# Note: The 
4600: 69 74 65 6d 20 6c 69 73 74 73 20 66 6f 75 6e 64  item lists found
4610: 20 69 6e 20 61 72 67 73 20 61 72 65 20 74 61 67   in args are tag
4620: 67 65 64 20 69 74 65 6d 73 2e 20 54 68 65 79 0a  ged items. They.
4630: 09 23 20 68 61 76 65 20 74 6f 20 68 61 76 65 20  .# have to have 
4640: 74 68 65 20 73 61 6d 65 20 74 79 70 65 20 61 73  the same type as
4650: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20   the changeset, 
4660: 62 65 69 6e 67 20 73 75 62 73 65 74 73 0a 09 23  being subsets..#
4670: 20 6f 66 20 69 74 73 20 69 74 65 6d 73 2e 20 54   of its items. T
4680: 68 69 73 20 69 73 20 63 68 65 63 6b 65 64 20 69  his is checked i
4690: 6e 20 55 6e 74 61 67 31 2e 0a 0a 09 6c 6f 67 20  n Untag1....log 
46a0: 77 72 69 74 65 20 38 20 63 73 65 74 73 20 7b 4f  write 8 csets {O
46b0: 4c 44 3a 20 5b 6c 73 6f 72 74 20 5b 24 63 73 65  LD: [lsort [$cse
46c0: 74 20 69 74 65 6d 73 5d 5d 7d 0a 09 56 61 6c 69  t items]]}..Vali
46d0: 64 61 74 65 46 72 61 67 6d 65 6e 74 73 20 24 63  dateFragments $c
46e0: 73 65 74 20 24 61 72 67 73 0a 0a 09 23 20 41 6c  set $args...# Al
46f0: 6c 20 63 68 65 63 6b 73 20 70 61 73 73 2c 20 61  l checks pass, a
4700: 63 74 75 61 6c 6c 79 20 70 65 72 66 6f 72 6d 20  ctually perform 
4710: 74 68 65 20 73 70 6c 69 74 2e 0a 0a 09 73 74 72  the split....str
4720: 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e  uct::list assign
4730: 20 5b 24 63 73 65 74 20 64 61 74 61 5d 20 70 72   [$cset data] pr
4740: 6f 6a 65 63 74 20 63 73 74 79 70 65 20 63 73 73  oject cstype css
4750: 72 63 0a 0a 09 73 65 74 20 70 72 65 64 65 63 65  rc...set predece
4760: 73 73 6f 72 73 20 5b 24 63 73 65 74 20 64 72 6f  ssors [$cset dro
4770: 70 5d 0a 09 24 63 73 65 74 20 64 65 73 74 72 6f  p]..$cset destro
4780: 79 0a 0a 09 73 65 74 20 6e 65 77 63 73 65 74 73  y...set newcsets
4790: 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 66 72 61   {}..foreach fra
47a0: 67 6d 65 6e 74 69 74 65 6d 73 20 24 61 72 67 73  gmentitems $args
47b0: 20 7b 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74   {..    log writ
47c0: 65 20 38 20 63 73 65 74 73 20 7b 4d 41 4b 45 3a  e 8 csets {MAKE:
47d0: 20 5b 6c 73 6f 72 74 20 24 66 72 61 67 6d 65 6e   [lsort $fragmen
47e0: 74 69 74 65 6d 73 5d 7d 0a 0a 09 20 20 20 20 73  titems]}...    s
47f0: 65 74 20 66 72 61 67 6d 65 6e 74 20 5b 24 74 79  et fragment [$ty
4800: 70 65 20 25 41 55 54 4f 25 20 24 70 72 6f 6a 65  pe %AUTO% $proje
4810: 63 74 20 24 63 73 74 79 70 65 20 24 63 73 73 72  ct $cstype $cssr
4820: 63 20 5c 0a 09 09 09 20 20 20 20 20 20 5b 55 6e  c \....      [Un
4830: 74 61 67 20 24 66 72 61 67 6d 65 6e 74 69 74 65  tag $fragmentite
4840: 6d 73 20 24 63 73 74 79 70 65 5d 5d 0a 09 20 20  ms $cstype]]..  
4850: 20 20 6c 61 70 70 65 6e 64 20 6e 65 77 63 73 65    lappend newcse
4860: 74 73 20 24 66 72 61 67 6d 65 6e 74 0a 0a 09 20  ts $fragment... 
4870: 20 20 20 24 66 72 61 67 6d 65 6e 74 20 70 65 72     $fragment per
4880: 73 69 73 74 0a 09 20 20 20 20 24 66 72 61 67 6d  sist..    $fragm
4890: 65 6e 74 20 64 65 74 65 72 6d 69 6e 65 73 75 63  ent determinesuc
48a0: 63 65 73 73 6f 72 73 0a 09 7d 0a 0a 09 23 20 54  cessors..}...# T
48b0: 68 65 20 70 72 65 64 65 63 65 73 73 6f 72 73 20  he predecessors 
48c0: 68 61 76 65 20 74 6f 20 72 65 63 6f 6d 70 75 74  have to recomput
48d0: 65 20 74 68 65 69 72 20 73 75 63 63 65 73 73 6f  e their successo
48e0: 72 73 2c 20 69 2e 65 2e 0a 09 23 20 72 65 6d 6f  rs, i.e...# remo
48f0: 76 65 20 74 68 65 20 64 72 6f 70 70 65 64 20 63  ve the dropped c
4900: 68 61 6e 67 65 73 65 74 20 61 6e 64 20 70 75 74  hangeset and put
4910: 20 6f 6e 65 20 6f 66 20 74 68 65 20 66 72 61 67   one of the frag
4920: 6d 65 6e 74 73 0a 09 23 20 69 6e 74 6f 20 69 74  ments..# into it
4930: 73 20 70 6c 61 63 65 2e 0a 09 66 6f 72 65 61 63  s place...foreac
4940: 68 20 70 20 24 70 72 65 64 65 63 65 73 73 6f 72  h p $predecessor
4950: 73 20 7b 0a 09 20 20 20 20 24 70 20 64 65 74 65  s {..    $p dete
4960: 72 6d 69 6e 65 73 75 63 63 65 73 73 6f 72 73 0a  rminesuccessors.
4970: 09 7d 0a 0a 09 72 65 74 75 72 6e 20 24 6e 65 77  .}...return $new
4980: 63 73 65 74 73 0a 20 20 20 20 7d 0a 0a 20 20 20  csets.    }..   
4990: 20 74 79 70 65 6d 65 74 68 6f 64 20 69 74 65 6d   typemethod item
49a0: 73 74 72 20 7b 69 74 65 6d 7d 20 7b 0a 09 73 74  str {item} {..st
49b0: 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67  ruct::list assig
49c0: 6e 20 24 69 74 65 6d 20 69 74 79 70 65 20 69 69  n $item itype ii
49d0: 64 0a 09 72 65 74 75 72 6e 20 5b 24 69 74 79 70  d..return [$ityp
49e0: 65 20 73 74 72 20 24 69 69 64 5d 0a 20 20 20 20  e str $iid].    
49f0: 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  }..    typemetho
4a00: 64 20 73 74 72 6c 69 73 74 20 7b 63 68 61 6e 67  d strlist {chang
4a10: 65 73 65 74 73 7d 20 7b 0a 09 72 65 74 75 72 6e  esets} {..return
4a20: 20 5b 6a 6f 69 6e 20 5b 73 74 72 75 63 74 3a 3a   [join [struct::
4a30: 6c 69 73 74 20 6d 61 70 20 24 63 68 61 6e 67 65  list map $change
4a40: 73 65 74 73 20 5b 6d 79 70 72 6f 63 20 49 44 5d  sets [myproc ID]
4a50: 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72  ]].    }..    pr
4a60: 6f 63 20 49 44 20 7b 63 73 65 74 7d 20 7b 20 24  oc ID {cset} { $
4a70: 63 73 65 74 20 73 74 72 20 7d 0a 0a 20 20 20 20  cset str }..    
4a80: 70 72 6f 63 20 55 6e 74 61 67 20 7b 74 61 67 67  proc Untag {tagg
4a90: 65 64 69 74 65 6d 73 20 63 73 74 79 70 65 7d 20  editems cstype} 
4aa0: 7b 0a 09 72 65 74 75 72 6e 20 5b 73 74 72 75 63  {..return [struc
4ab0: 74 3a 3a 6c 69 73 74 20 6d 61 70 20 24 74 61 67  t::list map $tag
4ac0: 67 65 64 69 74 65 6d 73 20 5b 6d 79 70 72 6f 63  geditems [myproc
4ad0: 20 55 6e 74 61 67 31 20 24 63 73 74 79 70 65 5d   Untag1 $cstype]
4ae0: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f  ].    }..    pro
4af0: 63 20 55 6e 74 61 67 31 20 7b 63 73 74 79 70 65  c Untag1 {cstype
4b00: 20 74 68 65 69 74 65 6d 7d 20 7b 0a 09 73 74 72   theitem} {..str
4b10: 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e  uct::list assign
4b20: 20 24 74 68 65 69 74 65 6d 20 74 20 69 0a 09 69   $theitem t i..i
4b30: 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20  ntegrity assert 
4b40: 7b 24 63 73 74 79 70 65 20 65 71 20 24 74 7d 20  {$cstype eq $t} 
4b50: 7b 49 74 65 6d 20 24 69 27 73 20 74 79 70 65 20  {Item $i's type 
4b60: 69 73 20 27 24 74 27 2c 20 65 78 70 65 63 74 65  is '$t', expecte
4b70: 64 20 27 24 63 73 74 79 70 65 27 7d 0a 09 72 65  d '$cstype'}..re
4b80: 74 75 72 6e 20 24 69 0a 20 20 20 20 7d 0a 0a 20  turn $i.    }.. 
4b90: 20 20 20 70 72 6f 63 20 54 61 67 49 74 65 6d 44     proc TagItemD
4ba0: 69 63 74 20 7b 69 74 65 6d 64 69 63 74 20 63 73  ict {itemdict cs
4bb0: 74 79 70 65 7d 20 7b 0a 09 73 65 74 20 72 65 73  type} {..set res
4bc0: 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 69 20   {}..foreach {i 
4bd0: 76 7d 20 24 69 74 65 6d 64 69 63 74 20 7b 20 6c  v} $itemdict { l
4be0: 61 70 70 65 6e 64 20 72 65 73 20 5b 6c 69 73 74  append res [list
4bf0: 20 24 63 73 74 79 70 65 20 24 69 5d 20 24 76 20   $cstype $i] $v 
4c00: 7d 0a 09 72 65 74 75 72 6e 20 24 72 65 73 0a 20  }..return $res. 
4c10: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 56     }..    proc V
4c20: 61 6c 69 64 61 74 65 46 72 61 67 6d 65 6e 74 73  alidateFragments
4c30: 20 7b 63 73 65 74 20 66 72 61 67 6d 65 6e 74 73   {cset fragments
4c40: 7d 20 7b 0a 09 23 20 43 68 65 63 6b 20 74 68 65  } {..# Check the
4c50: 20 76 61 72 69 6f 75 73 20 69 6e 74 65 67 72 69   various integri
4c60: 74 79 20 63 6f 6e 73 74 72 61 69 6e 74 73 20 66  ty constraints f
4c70: 6f 72 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73  or the fragments
4c80: 0a 09 23 20 73 70 65 63 69 66 79 69 6e 67 20 68  ..# specifying h
4c90: 6f 77 20 74 6f 20 73 70 6c 69 74 20 74 68 65 20  ow to split the 
4ca0: 63 68 61 6e 67 65 73 65 74 3a 0a 09 23 0a 09 23  changeset:..#..#
4cb0: 20 2a 20 57 65 20 6d 75 73 74 20 68 61 76 65 20   * We must have 
4cc0: 74 77 6f 20 6f 72 20 6d 6f 72 65 20 66 72 61 67  two or more frag
4cd0: 6d 65 6e 74 73 2c 20 61 73 20 73 70 6c 69 74 74  ments, as splitt
4ce0: 69 6e 67 20 61 0a 09 23 20 20 20 63 68 61 6e 67  ing a..#   chang
4cf0: 65 73 65 74 20 69 6e 74 6f 20 6f 6e 65 20 6d 61  eset into one ma
4d00: 6b 65 73 20 6e 6f 20 73 65 6e 73 65 2e 0a 09 23  kes no sense...#
4d10: 20 2a 20 4e 6f 20 66 72 61 67 6d 65 6e 74 20 6d   * No fragment m
4d20: 61 79 20 62 65 20 65 6d 70 74 79 2e 0a 09 23 20  ay be empty...# 
4d30: 2a 20 41 6c 6c 20 66 72 61 67 6d 65 6e 74 73 20  * All fragments 
4d40: 68 61 76 65 20 74 6f 20 62 65 20 74 72 75 65 20  have to be true 
4d50: 73 75 62 73 65 74 73 20 6f 66 20 74 68 65 20 69  subsets of the i
4d60: 74 65 6d 73 20 69 6e 20 74 68 65 0a 09 23 20 20  tems in the..#  
4d70: 20 63 68 61 6e 67 65 73 65 74 20 74 6f 20 73 70   changeset to sp
4d80: 6c 69 74 2e 20 54 68 65 20 27 74 72 75 65 27 20  lit. The 'true' 
4d90: 69 73 20 69 6d 70 6c 69 65 64 20 62 65 63 61 75  is implied becau
4da0: 73 65 20 6e 6f 6e 65 20 61 72 65 0a 09 23 20 20  se none are..#  
4db0: 20 61 6c 6c 6f 77 65 64 20 74 6f 20 62 65 20 65   allowed to be e
4dc0: 6d 70 74 79 2c 20 73 6f 20 65 61 63 68 20 68 61  mpty, so each ha
4dd0: 73 20 74 6f 20 62 65 20 73 6d 61 6c 6c 65 72 20  s to be smaller 
4de0: 74 68 61 6e 20 74 68 65 0a 09 23 20 20 20 74 6f  than the..#   to
4df0: 74 61 6c 2e 0a 09 23 20 2a 20 54 68 65 20 75 6e  tal...# * The un
4e00: 69 6f 6e 20 6f 66 20 74 68 65 20 66 72 61 67 6d  ion of the fragm
4e10: 65 6e 74 73 20 68 61 73 20 74 6f 20 62 65 20 74  ents has to be t
4e20: 68 65 20 69 74 65 6d 20 73 65 74 20 6f 66 20 74  he item set of t
4e30: 68 65 0a 09 23 20 20 20 63 68 61 6e 67 65 73 65  he..#   changese
4e40: 74 2e 0a 09 23 20 2a 20 54 68 65 20 66 72 61 67  t...# * The frag
4e50: 6d 65 6e 74 20 6d 75 73 74 20 6e 6f 74 20 6f 76  ment must not ov
4e60: 65 72 6c 61 70 2c 20 69 2e 65 2e 20 74 68 65 69  erlap, i.e. thei
4e70: 72 20 70 61 69 72 77 69 73 65 0a 09 23 20 20 20  r pairwise..#   
4e80: 69 6e 74 65 72 73 65 63 74 69 6f 6e 73 20 68 61  intersections ha
4e90: 76 65 20 74 6f 20 62 65 20 65 6d 70 74 79 2e 0a  ve to be empty..
4ea0: 0a 09 73 65 74 20 63 6f 76 65 72 20 7b 7d 0a 09  ..set cover {}..
4eb0: 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65 6e 74  foreach fragment
4ec0: 69 74 65 6d 73 20 24 66 72 61 67 6d 65 6e 74 73  items $fragments
4ed0: 20 7b 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74   {..    log writ
4ee0: 65 20 38 20 63 73 65 74 73 20 7b 4e 45 57 3a 20  e 8 csets {NEW: 
4ef0: 5b 6c 73 6f 72 74 20 24 66 72 61 67 6d 65 6e 74  [lsort $fragment
4f00: 69 74 65 6d 73 5d 7d 0a 0a 09 20 20 20 20 69 6e  items]}...    in
4f10: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b  tegrity assert {
4f20: 0a 09 09 21 5b 73 74 72 75 63 74 3a 3a 73 65 74  ...![struct::set
4f30: 20 65 6d 70 74 79 20 24 66 72 61 67 6d 65 6e 74   empty $fragment
4f40: 69 74 65 6d 73 5d 0a 09 20 20 20 20 7d 20 7b 63  items]..    } {c
4f50: 68 61 6e 67 65 73 65 74 20 66 72 61 67 6d 65 6e  hangeset fragmen
4f60: 74 20 69 73 20 65 6d 70 74 79 7d 0a 0a 09 20 20  t is empty}...  
4f70: 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 73 65    integrity asse
4f80: 72 74 20 7b 0a 09 09 5b 73 74 72 75 63 74 3a 3a  rt {...[struct::
4f90: 73 65 74 20 73 75 62 73 65 74 6f 66 20 24 66 72  set subsetof $fr
4fa0: 61 67 6d 65 6e 74 69 74 65 6d 73 20 5b 24 63 73  agmentitems [$cs
4fb0: 65 74 20 69 74 65 6d 73 5d 5d 0a 09 20 20 20 20  et items]]..    
4fc0: 7d 20 7b 63 68 61 6e 67 65 73 65 74 20 66 72 61  } {changeset fra
4fd0: 67 6d 65 6e 74 20 69 73 20 6e 6f 74 20 61 20 73  gment is not a s
4fe0: 75 62 73 65 74 7d 0a 09 20 20 20 20 73 74 72 75  ubset}..    stru
4ff0: 63 74 3a 3a 73 65 74 20 61 64 64 20 63 6f 76 65  ct::set add cove
5000: 72 20 24 66 72 61 67 6d 65 6e 74 69 74 65 6d 73  r $fragmentitems
5010: 0a 09 7d 0a 0a 09 69 6e 74 65 67 72 69 74 79 20  ..}...integrity 
5020: 61 73 73 65 72 74 20 7b 0a 09 20 20 20 20 5b 73  assert {..    [s
5030: 74 72 75 63 74 3a 3a 73 65 74 20 65 71 75 61 6c  truct::set equal
5040: 20 24 63 6f 76 65 72 20 5b 24 63 73 65 74 20 69   $cover [$cset i
5050: 74 65 6d 73 5d 5d 0a 09 20 7d 20 7b 54 68 65 20  tems]].. } {The 
5060: 66 72 61 67 6d 65 6e 74 73 20 64 6f 20 6e 6f 74  fragments do not
5070: 20 63 6f 76 65 72 20 74 68 65 20 6f 72 69 67 69   cover the origi
5080: 6e 61 6c 20 63 68 61 6e 67 65 73 65 74 7d 0a 0a  nal changeset}..
5090: 09 73 65 74 20 69 20 31 0a 09 66 6f 72 65 61 63  .set i 1..foreac
50a0: 68 20 66 69 61 20 24 66 72 61 67 6d 65 6e 74 73  h fia $fragments
50b0: 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20   {..    foreach 
50c0: 66 69 62 20 5b 6c 72 61 6e 67 65 20 24 66 72 61  fib [lrange $fra
50d0: 67 6d 65 6e 74 73 20 24 69 20 65 6e 64 5d 20 7b  gments $i end] {
50e0: 0a 09 09 69 6e 74 65 67 72 69 74 79 20 61 73 73  ...integrity ass
50f0: 65 72 74 20 7b 0a 09 09 20 20 20 20 5b 73 74 72  ert {...    [str
5100: 75 63 74 3a 3a 73 65 74 20 65 6d 70 74 79 20 5b  uct::set empty [
5110: 73 74 72 75 63 74 3a 3a 73 65 74 20 69 6e 74 65  struct::set inte
5120: 72 73 65 63 74 20 24 66 69 61 20 24 66 69 62 5d  rsect $fia $fib]
5130: 5d 0a 09 09 7d 20 7b 54 68 65 20 66 72 61 67 6d  ]...} {The fragm
5140: 65 6e 74 73 20 3c 24 66 69 61 3e 20 61 6e 64 20  ents <$fia> and 
5150: 3c 24 66 69 62 3e 20 6f 76 65 72 6c 61 70 7d 0a  <$fib> overlap}.
5160: 09 20 20 20 20 7d 0a 09 20 20 20 20 69 6e 63 72  .    }..    incr
5170: 20 69 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 0a 20   i..}...return. 
5180: 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23     }..    # # ##
5190: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23   ### ##### #####
51a0: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
51b0: 23 0a 20 20 20 20 23 23 20 53 74 61 74 65 0a 0a  #.    ## State..
51c0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 69      variable myi
51d0: 64 20 20 20 20 20 20 20 20 7b 7d 20 3b 20 23 20  d        {} ; # 
51e0: 49 64 20 6f 66 20 74 68 65 20 63 73 65 74 20 66  Id of the cset f
51f0: 6f 72 20 74 68 65 20 70 65 72 73 69 73 74 65 6e  or the persisten
5200: 74 0a 09 09 09 20 20 20 20 20 20 23 20 73 74 61  t....      # sta
5210: 74 65 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65  te..    variable
5220: 20 6d 79 70 72 6f 6a 65 63 74 20 20 20 7b 7d 20   myproject   {} 
5230: 3b 20 23 20 52 65 66 65 72 65 6e 63 65 20 6f 66  ; # Reference of
5240: 20 74 68 65 20 70 72 6f 6a 65 63 74 20 6f 62 6a   the project obj
5250: 65 63 74 20 74 68 65 0a 09 09 09 20 20 20 20 20  ect the....     
5260: 20 23 20 63 68 61 6e 67 65 73 65 74 20 62 65 6c   # changeset bel
5270: 6f 6e 67 73 20 74 6f 2e 0a 20 20 20 20 76 61 72  ongs to..    var
5280: 69 61 62 6c 65 20 6d 79 74 79 70 65 20 20 20 20  iable mytype    
5290: 20 20 7b 7d 20 3b 20 23 20 57 68 61 74 20 74 68    {} ; # What th
52a0: 65 20 63 68 61 6e 67 65 73 65 74 20 69 73 20 62  e changeset is b
52b0: 61 73 65 64 20 6f 6e 0a 09 09 09 20 20 20 20 20  ased on....     
52c0: 20 23 20 28 72 65 76 69 73 69 6f 6e 73 2c 20 74   # (revisions, t
52d0: 61 67 73 2c 20 6f 72 20 62 72 61 6e 63 68 65 73  ags, or branches
52e0: 29 2e 0a 09 09 09 20 20 20 20 20 20 23 20 56 61  ).....      # Va
52f0: 6c 75 65 73 3a 20 53 65 65 20 6d 79 63 73 74 79  lues: See mycsty
5300: 70 65 2e 20 4e 6f 74 65 20 74 68 61 74 20 77 65  pe. Note that we
5310: 0a 09 09 09 20 20 20 20 20 20 23 20 68 61 76 65  ....      # have
5320: 20 74 6f 20 6b 65 65 70 20 74 68 65 20 6e 61 6d   to keep the nam
5330: 65 73 20 6f 66 20 74 68 65 20 68 65 6c 70 65 72  es of the helper
5340: 0a 09 09 09 20 20 20 20 20 20 23 20 73 69 6e 67  ....      # sing
5350: 6c 65 74 6f 6e 73 20 69 6e 20 73 79 6e 63 20 77  letons in sync w
5360: 69 74 68 20 74 68 65 20 63 6f 6e 74 65 6e 74 73  ith the contents
5370: 0a 09 09 09 20 20 20 20 20 20 23 20 6f 66 20 73  ....      # of s
5380: 74 61 74 65 20 74 61 62 6c 65 20 27 63 73 74 79  tate table 'csty
5390: 70 65 27 2c 20 61 6e 64 20 76 61 72 69 6f 75 73  pe', and various
53a0: 0a 09 09 09 20 20 20 20 20 20 23 20 6f 74 68 65  ....      # othe
53b0: 72 20 70 6c 61 63 65 73 20 75 73 69 6e 67 20 74  r places using t
53c0: 68 65 6d 20 68 61 72 64 77 69 72 65 64 2e 0a 20  hem hardwired.. 
53d0: 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 74 79     variable myty
53e0: 70 65 6f 62 6a 20 20 20 7b 7d 20 3b 20 23 20 52  peobj   {} ; # R
53f0: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
5400: 63 6f 6e 74 61 69 6e 65 72 20 66 6f 72 20 74 68  container for th
5410: 65 0a 09 09 09 20 20 20 20 20 20 23 20 74 79 70  e....      # typ
5420: 65 20 64 65 70 65 6e 64 65 6e 74 20 63 6f 64 65  e dependent code
5430: 2e 20 44 65 72 69 76 65 64 20 66 72 6f 6d 0a 09  . Derived from..
5440: 09 09 20 20 20 20 20 20 23 20 6d 79 74 79 70 65  ..      # mytype
5450: 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d  ..    variable m
5460: 79 73 72 63 69 64 20 20 20 20 20 7b 7d 20 3b 20  ysrcid     {} ; 
5470: 23 20 49 64 20 6f 66 20 74 68 65 20 6d 65 74 61  # Id of the meta
5480: 64 61 74 61 20 6f 72 20 73 79 6d 62 6f 6c 20 74  data or symbol t
5490: 68 65 20 63 73 65 74 0a 09 09 09 20 20 20 20 20  he cset....     
54a0: 20 23 20 69 73 20 62 61 73 65 64 20 6f 6e 2e 0a   # is based on..
54b0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 69      variable myi
54c0: 74 65 6d 73 20 20 20 20 20 7b 7d 20 3b 20 23 20  tems     {} ; # 
54d0: 4c 69 73 74 20 6f 66 20 74 68 65 20 66 69 6c 65  List of the file
54e0: 20 6c 65 76 65 6c 20 72 65 76 69 73 69 6f 6e 73   level revisions
54f0: 2c 0a 09 09 09 20 20 20 20 20 20 23 20 74 61 67  ,....      # tag
5500: 73 2c 20 6f 72 20 62 72 61 6e 63 68 65 73 20 69  s, or branches i
5510: 6e 20 74 68 65 20 63 73 65 74 2c 20 61 73 0a 09  n the cset, as..
5520: 09 09 20 20 20 20 20 20 23 20 69 64 73 2e 20 4e  ..      # ids. N
5530: 6f 74 20 74 61 67 67 65 64 2e 0a 20 20 20 20 76  ot tagged..    v
5540: 61 72 69 61 62 6c 65 20 6d 79 74 69 74 65 6d 73  ariable mytitems
5550: 20 20 20 20 7b 7d 20 3b 20 23 20 41 73 20 6d 79      {} ; # As my
5560: 69 74 65 6d 73 2c 20 74 68 65 20 74 61 67 67 65  items, the tagge
5570: 64 20 66 6f 72 6d 2e 0a 20 20 20 20 76 61 72 69  d form..    vari
5580: 61 62 6c 65 20 6d 79 70 6f 73 20 20 20 20 20 20  able mypos      
5590: 20 7b 7d 20 3b 20 23 20 43 6f 6d 6d 69 74 20 70   {} ; # Commit p
55a0: 6f 73 69 74 69 6f 6e 20 6f 66 20 74 68 65 20 63  osition of the c
55b0: 68 61 6e 67 65 73 65 74 2c 20 69 66 0a 09 09 09  hangeset, if....
55c0: 20 20 20 20 20 20 23 20 6b 6e 6f 77 6e 2e 0a 0a        # known...
55d0: 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23      # # ## ### #
55e0: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23  #### ######## ##
55f0: 23 23 23 23 23 23 23 23 23 23 23 0a 20 20 20 20  ###########.    
5600: 23 23 20 49 6e 74 65 72 6e 61 6c 20 6d 65 74 68  ## Internal meth
5610: 6f 64 73 0a 0a 20 20 20 20 74 79 70 65 76 61 72  ods..    typevar
5620: 69 61 62 6c 65 20 6d 79 63 6f 75 6e 74 65 72 20  iable mycounter 
5630: 20 20 20 20 20 20 20 30 20 3b 20 23 20 49 64 20         0 ; # Id 
5640: 63 6f 75 6e 74 65 72 20 66 6f 72 20 63 73 65 74  counter for cset
5650: 73 2e 20 4c 61 73 74 20 69 64 0a 09 09 09 09 20  s. Last id..... 
5660: 20 20 20 20 20 23 20 75 73 65 64 2e 0a 20 20 20       # used..   
5670: 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79   typevariable my
5680: 63 73 74 79 70 65 20 2d 61 72 72 61 79 20 7b 7d  cstype -array {}
5690: 20 3b 20 23 20 4d 61 70 20 63 73 74 79 70 65 73   ; # Map cstypes
56a0: 20 28 6e 61 6d 65 73 29 20 74 6f 20 70 65 72 73   (names) to pers
56b0: 69 73 74 65 6e 74 0a 09 09 09 09 20 20 20 20 20  istent.....     
56c0: 20 23 20 69 64 73 2e 20 4e 6f 74 65 20 74 68 61   # ids. Note tha
56d0: 74 20 77 65 20 68 61 76 65 20 74 6f 20 6b 65 65  t we have to kee
56e0: 70 0a 09 09 09 09 20 20 20 20 20 20 23 20 74 68  p.....      # th
56f0: 65 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 74  e names in the t
5700: 61 62 6c 65 20 27 63 73 74 79 70 65 27 0a 09 09  able 'cstype'...
5710: 09 09 20 20 20 20 20 20 23 20 69 6e 20 73 79 6e  ..      # in syn
5720: 63 20 77 69 74 68 20 74 68 65 20 6e 61 6d 65 73  c with the names
5730: 20 6f 66 20 74 68 65 0a 09 09 09 09 20 20 20 20   of the.....    
5740: 20 20 23 20 68 65 6c 70 65 72 20 73 69 6e 67 6c    # helper singl
5750: 65 74 6f 6e 73 2e 0a 0a 20 20 20 20 74 79 70 65  etons...    type
5760: 6d 65 74 68 6f 64 20 69 6e 6f 72 64 65 72 20 7b  method inorder {
5770: 70 72 6f 6a 65 63 74 69 64 7d 20 7b 0a 09 23 20  projectid} {..# 
5780: 52 65 74 75 72 6e 20 61 6c 6c 20 72 65 76 69 73  Return all revis
5790: 69 6f 6e 20 63 68 61 6e 67 65 73 65 74 73 20 66  ion changesets f
57a0: 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65 64  or the specified
57b0: 20 70 72 6f 6a 65 63 74 2c 20 69 6e 0a 09 23 20   project, in..# 
57c0: 74 68 65 20 6f 72 64 65 72 20 67 69 76 65 6e 20  the order given 
57d0: 74 6f 20 74 68 65 6d 20 62 79 20 74 68 65 20 73  to them by the s
57e0: 6f 72 74 20 70 61 73 73 65 73 2e 20 42 6f 74 68  ort passes. Both
57f0: 20 74 68 65 0a 09 23 20 66 69 6c 74 65 72 69 6e   the..# filterin
5800: 67 20 62 79 20 70 72 6f 6a 65 63 74 20 61 6e 64  g by project and
5810: 20 73 6f 72 74 69 6e 67 20 6d 61 6b 65 20 75 73   sorting make us
5820: 65 20 6f 66 20 27 70 72 6f 6a 65 63 74 3a 3a 72  e of 'project::r
5830: 65 76 0a 09 23 20 72 65 76 27 20 69 6d 70 6f 73  ev..# rev' impos
5840: 73 69 62 6c 65 2e 0a 0a 09 73 65 74 20 72 65 73  sible....set res
5850: 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 63 69   {}..foreach {ci
5860: 64 20 63 64 61 74 65 7d 20 5b 73 74 61 74 65 20  d cdate} [state 
5870: 72 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c 45 43  run {..    SELEC
5880: 54 20 43 2e 63 69 64 2c 20 54 2e 64 61 74 65 0a  T C.cid, T.date.
5890: 09 20 20 20 20 46 52 4f 4d 20 20 20 63 68 61 6e  .    FROM   chan
58a0: 67 65 73 65 74 20 43 2c 20 63 73 74 69 6d 65 73  geset C, cstimes
58b0: 74 61 6d 70 20 54 0a 09 20 20 20 20 57 48 45 52  tamp T..    WHER
58c0: 45 20 20 43 2e 74 79 70 65 20 3d 20 30 20 20 20  E  C.type = 0   
58d0: 20 20 20 20 20 20 20 2d 2d 20 6c 69 6d 69 74 20         -- limit 
58e0: 74 6f 20 72 65 76 69 73 69 6f 6e 20 63 68 61 6e  to revision chan
58f0: 67 65 73 65 74 73 0a 09 20 20 20 20 41 4e 44 20  gesets..    AND 
5900: 20 20 20 43 2e 70 69 64 20 20 3d 20 24 70 72 6f     C.pid  = $pro
5910: 6a 65 63 74 69 64 20 2d 2d 20 6c 69 6d 69 74 20  jectid -- limit 
5920: 74 6f 20 63 68 61 6e 67 65 73 65 74 73 20 69 6e  to changesets in
5930: 20 70 72 6f 6a 65 63 74 0a 09 20 20 20 20 41 4e   project..    AN
5940: 44 20 20 20 20 54 2e 63 69 64 20 20 3d 20 43 2e  D    T.cid  = C.
5950: 63 69 64 20 20 20 20 20 20 2d 2d 20 67 65 74 20  cid      -- get 
5960: 6f 72 64 65 72 69 6e 67 20 69 6e 66 6f 72 6d 61  ordering informa
5970: 74 69 6f 6e 0a 09 20 20 20 20 4f 52 44 45 52 20  tion..    ORDER 
5980: 42 59 20 54 2e 64 61 74 65 20 20 20 20 20 20 20  BY T.date       
5990: 20 20 20 20 20 2d 2d 20 73 6f 72 74 20 69 6e 74       -- sort int
59a0: 6f 20 63 6f 6d 6d 69 74 20 6f 72 64 65 72 0a 09  o commit order..
59b0: 7d 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e  }] {..    lappen
59c0: 64 20 72 65 73 20 24 6d 79 69 64 6d 61 70 28 24  d res $myidmap($
59d0: 63 69 64 29 20 24 63 64 61 74 65 0a 09 7d 0a 09  cid) $cdate..}..
59e0: 72 65 74 75 72 6e 20 24 72 65 73 0a 20 20 20 20  return $res.    
59f0: 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  }..    typemetho
5a00: 64 20 67 65 74 63 73 74 79 70 65 73 20 7b 7d 20  d getcstypes {} 
5a10: 7b 0a 09 66 6f 72 65 61 63 68 20 7b 74 69 64 20  {..foreach {tid 
5a20: 6e 61 6d 65 7d 20 5b 73 74 61 74 65 20 72 75 6e  name} [state run
5a30: 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 74   {..    SELECT t
5a40: 69 64 2c 20 6e 61 6d 65 20 46 52 4f 4d 20 63 73  id, name FROM cs
5a50: 74 79 70 65 3b 0a 09 7d 5d 20 7b 20 73 65 74 20  type;..}] { set 
5a60: 6d 79 63 73 74 79 70 65 28 24 6e 61 6d 65 29 20  mycstype($name) 
5a70: 24 74 69 64 20 7d 0a 09 72 65 74 75 72 6e 0a 20  $tid }..return. 
5a80: 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65     }..    typeme
5a90: 74 68 6f 64 20 6c 6f 61 64 20 7b 72 65 70 6f 73  thod load {repos
5aa0: 69 74 6f 72 79 7d 20 7b 0a 09 73 65 74 20 6e 20  itory} {..set n 
5ab0: 30 0a 09 6c 6f 67 20 77 72 69 74 65 20 32 20 63  0..log write 2 c
5ac0: 73 65 74 73 20 7b 4c 6f 61 64 69 6e 67 20 74 68  sets {Loading th
5ad0: 65 20 63 68 61 6e 67 65 73 65 74 73 7d 0a 09 66  e changesets}..f
5ae0: 6f 72 65 61 63 68 20 7b 69 64 20 70 69 64 20 63  oreach {id pid c
5af0: 73 74 79 70 65 20 73 72 63 69 64 7d 20 5b 73 74  stype srcid} [st
5b00: 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 53  ate run {..    S
5b10: 45 4c 45 43 54 20 43 2e 63 69 64 2c 20 43 2e 70  ELECT C.cid, C.p
5b20: 69 64 2c 20 43 53 2e 6e 61 6d 65 2c 20 43 2e 73  id, CS.name, C.s
5b30: 72 63 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 63  rc..    FROM   c
5b40: 68 61 6e 67 65 73 65 74 20 43 2c 20 63 73 74 79  hangeset C, csty
5b50: 70 65 20 43 53 0a 09 20 20 20 20 57 48 45 52 45  pe CS..    WHERE
5b60: 20 20 43 2e 74 79 70 65 20 3d 20 43 53 2e 74 69    C.type = CS.ti
5b70: 64 0a 09 20 20 20 20 4f 52 44 45 52 20 42 59 20  d..    ORDER BY 
5b80: 43 2e 63 69 64 0a 09 7d 5d 20 7b 0a 09 20 20 20  C.cid..}] {..   
5b90: 20 6c 6f 67 20 70 72 6f 67 72 65 73 73 20 32 20   log progress 2 
5ba0: 63 73 65 74 73 20 24 6e 20 7b 7d 0a 09 20 20 20  csets $n {}..   
5bb0: 20 73 65 74 20 72 20 5b 24 74 79 70 65 20 25 41   set r [$type %A
5bc0: 55 54 4f 25 20 5b 24 72 65 70 6f 73 69 74 6f 72  UTO% [$repositor
5bd0: 79 20 70 72 6f 6a 65 63 74 6f 66 20 24 70 69 64  y projectof $pid
5be0: 5d 20 24 63 73 74 79 70 65 20 24 73 72 63 69 64  ] $cstype $srcid
5bf0: 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09   [state run {...
5c00: 53 45 4c 45 43 54 20 43 2e 69 69 64 0a 09 09 46  SELECT C.iid...F
5c10: 52 4f 4d 20 20 20 63 73 69 74 65 6d 20 43 0a 09  ROM   csitem C..
5c20: 09 57 48 45 52 45 20 20 43 2e 63 69 64 20 3d 20  .WHERE  C.cid = 
5c30: 24 69 64 0a 09 09 4f 52 44 45 52 20 42 59 20 43  $id...ORDER BY C
5c40: 2e 70 6f 73 0a 09 20 20 20 20 7d 5d 20 24 69 64  .pos..    }] $id
5c50: 5d 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d  ]..    incr n..}
5c60: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
5c70: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c      typemethod l
5c80: 6f 61 64 63 6f 75 6e 74 65 72 20 7b 7d 20 7b 0a  oadcounter {} {.
5c90: 09 23 20 49 6e 69 74 69 61 6c 69 7a 65 20 74 68  .# Initialize th
5ca0: 65 20 63 6f 75 6e 74 65 72 20 66 72 6f 6d 20 74  e counter from t
5cb0: 68 65 20 73 74 61 74 65 0a 09 6c 6f 67 20 77 72  he state..log wr
5cc0: 69 74 65 20 32 20 63 73 65 74 73 20 7b 4c 6f 61  ite 2 csets {Loa
5cd0: 64 69 6e 67 20 63 68 61 6e 67 65 73 65 74 20 63  ding changeset c
5ce0: 6f 75 6e 74 65 72 7d 0a 09 73 65 74 20 6d 79 63  ounter}..set myc
5cf0: 6f 75 6e 74 65 72 20 5b 73 74 61 74 65 20 6f 6e  ounter [state on
5d00: 65 20 7b 20 53 45 4c 45 43 54 20 4d 41 58 28 63  e { SELECT MAX(c
5d10: 69 64 29 20 46 52 4f 4d 20 63 68 61 6e 67 65 73  id) FROM changes
5d20: 65 74 20 7d 5d 0a 09 72 65 74 75 72 6e 0a 20 20  et }]..return.  
5d30: 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74    }..    typemet
5d40: 68 6f 64 20 6e 75 6d 20 7b 7d 20 7b 20 72 65 74  hod num {} { ret
5d50: 75 72 6e 20 24 6d 79 63 6f 75 6e 74 65 72 20 7d  urn $mycounter }
5d60: 0a 0a 20 20 20 20 70 72 6f 63 20 49 6e 69 74 69  ..    proc Initi
5d70: 61 6c 69 7a 65 42 72 65 61 6b 53 74 61 74 65 20  alizeBreakState 
5d80: 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75  {revisions} {..u
5d90: 70 76 61 72 20 31 20 70 6f 73 20 70 6f 73 20 63  pvar 1 pos pos c
5da0: 72 6f 73 73 20 63 72 6f 73 73 20 72 61 6e 67 65  ross cross range
5db0: 20 72 61 6e 67 65 20 64 65 70 63 20 64 65 70 63   range depc depc
5dc0: 20 64 65 6c 74 61 20 64 65 6c 74 61 20 5c 0a 09   delta delta \..
5dd0: 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65 73      dependencies
5de0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 0a 09   dependencies...
5df0: 23 20 46 69 72 73 74 20 77 65 20 63 72 65 61 74  # First we creat
5e00: 65 20 61 20 6d 61 70 20 6f 66 20 70 6f 73 69 74  e a map of posit
5e10: 69 6f 6e 73 20 74 6f 20 6d 61 6b 65 20 69 74 20  ions to make it 
5e20: 65 61 73 69 65 72 20 74 6f 0a 09 23 20 64 65 74  easier to..# det
5e30: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 61  ermine whether a
5e40: 20 64 65 70 65 6e 64 65 6e 63 79 20 63 72 6f 73   dependency cros
5e50: 73 65 73 20 61 20 70 61 72 74 69 63 75 6c 61 72  ses a particular
5e60: 20 69 6e 64 65 78 2e 0a 0a 09 61 72 72 61 79 20   index....array 
5e70: 73 65 74 20 70 6f 73 20 20 20 7b 7d 0a 09 61 72  set pos   {}..ar
5e80: 72 61 79 20 73 65 74 20 63 72 6f 73 73 20 7b 7d  ray set cross {}
5e90: 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 70 63  ..array set depc
5ea0: 20 20 7b 7d 0a 09 73 65 74 20 72 61 6e 67 65 20    {}..set range 
5eb0: 20 20 20 20 20 20 7b 7d 0a 09 73 65 74 20 6e 20        {}..set n 
5ec0: 30 0a 09 66 6f 72 65 61 63 68 20 72 65 76 20 24  0..foreach rev $
5ed0: 72 65 76 69 73 69 6f 6e 73 20 7b 0a 09 20 20 20  revisions {..   
5ee0: 20 6c 61 70 70 65 6e 64 20 72 61 6e 67 65 20 24   lappend range $
5ef0: 6e 0a 09 20 20 20 20 73 65 74 20 70 6f 73 28 24  n..    set pos($
5f00: 72 65 76 29 20 24 6e 0a 09 20 20 20 20 73 65 74  rev) $n..    set
5f10: 20 63 72 6f 73 73 28 24 6e 29 20 30 0a 09 20 20   cross($n) 0..  
5f20: 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 0a 09 23 20    incr n..}...# 
5f30: 53 65 63 6f 6e 64 6c 79 20 77 65 20 63 6f 75 6e  Secondly we coun
5f40: 74 20 74 68 65 20 63 72 6f 73 73 69 6e 67 73 20  t the crossings 
5f50: 70 65 72 20 70 6f 73 69 74 69 6f 6e 2c 20 62 79  per position, by
5f60: 20 69 74 65 72 61 74 69 6e 67 0a 09 23 20 6f 76   iterating..# ov
5f70: 65 72 20 74 68 65 20 72 65 63 6f 72 64 65 64 20  er the recorded 
5f80: 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65  internal depende
5f90: 6e 63 69 65 73 2e 0a 0a 09 23 20 4e 6f 74 65 3a  ncies....# Note:
5fa0: 20 49 66 20 74 68 65 20 74 69 6d 65 73 74 61 6d   If the timestam
5fb0: 70 73 20 61 72 65 20 62 61 64 6c 79 20 6f 75 74  ps are badly out
5fc0: 20 6f 66 20 6f 72 64 65 72 20 69 74 20 69 73 0a   of order it is.
5fd0: 09 23 20 20 20 20 20 20 20 70 6f 73 73 69 62 6c  .#       possibl
5fe0: 65 20 74 6f 20 68 61 76 65 20 61 20 62 61 63 6b  e to have a back
5ff0: 77 61 72 64 20 73 75 63 63 65 73 73 6f 72 20 64  ward successor d
6000: 65 70 65 6e 64 65 6e 63 79 2c 0a 09 23 20 20 20  ependency,..#   
6010: 20 20 20 20 69 2e 65 2e 20 77 69 74 68 20 73 74      i.e. with st
6020: 61 72 74 20 3e 20 65 6e 64 2e 20 57 65 20 6d 61  art > end. We ma
6030: 79 20 68 61 76 65 20 74 6f 20 73 77 61 70 20 74  y have to swap t
6040: 68 65 20 69 6e 64 69 63 65 73 0a 09 23 20 20 20  he indices..#   
6050: 20 20 20 20 74 6f 20 65 6e 73 75 72 65 20 74 68      to ensure th
6060: 61 74 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  at the following
6070: 20 6c 6f 6f 70 20 72 75 6e 73 20 63 6f 72 72 65   loop runs corre
6080: 63 74 6c 79 2e 0a 09 23 0a 09 23 20 4e 6f 74 65  ctly...#..# Note
6090: 20 32 3a 20 73 74 61 72 74 20 3d 3d 20 65 6e 64   2: start == end
60a0: 20 69 73 20 6e 6f 74 20 70 6f 73 73 69 62 6c 65   is not possible
60b0: 2e 20 49 74 20 69 6e 64 69 63 61 74 65 73 20 61  . It indicates a
60c0: 0a 09 23 20 20 20 20 20 20 20 20 20 73 65 6c 66  ..#         self
60d0: 2d 64 65 70 65 6e 64 65 6e 63 79 20 64 75 65 20  -dependency due 
60e0: 74 6f 20 74 68 65 20 75 6e 69 71 75 65 6e 65 73  to the uniquenes
60f0: 73 20 6f 66 20 70 6f 73 69 74 69 6f 6e 73 2c 0a  s of positions,.
6100: 09 23 20 20 20 20 20 20 20 20 20 61 6e 64 20 74  .#         and t
6110: 68 61 74 20 69 73 20 73 6f 6d 65 74 68 69 6e 67  hat is something
6120: 20 77 65 20 68 61 76 65 20 72 75 6c 65 64 20 6f   we have ruled o
6130: 75 74 20 61 6c 72 65 61 64 79 2c 20 73 65 65 0a  ut already, see.
6140: 09 23 20 20 20 20 20 20 20 20 20 27 72 65 76 20  .#         'rev 
6150: 69 6e 74 65 72 6e 61 6c 73 75 63 63 65 73 73 6f  internalsuccesso
6160: 72 73 27 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b  rs'....foreach {
6170: 72 69 64 20 63 68 69 6c 64 72 65 6e 7d 20 5b 61  rid children} [a
6180: 72 72 61 79 20 67 65 74 20 64 65 70 65 6e 64 65  rray get depende
6190: 6e 63 69 65 73 5d 20 7b 0a 09 20 20 20 20 66 6f  ncies] {..    fo
61a0: 72 65 61 63 68 20 63 68 69 6c 64 20 24 63 68 69  reach child $chi
61b0: 6c 64 72 65 6e 20 7b 0a 09 09 73 65 74 20 64 6b  ldren {...set dk
61c0: 65 79 20 20 20 20 5b 6c 69 73 74 20 24 72 69 64  ey    [list $rid
61d0: 20 24 63 68 69 6c 64 5d 0a 09 09 73 65 74 20 73   $child]...set s
61e0: 74 61 72 74 20 20 20 24 70 6f 73 28 24 72 69 64  tart   $pos($rid
61f0: 29 0a 09 09 73 65 74 20 65 6e 64 20 20 20 20 20  )...set end     
6200: 24 70 6f 73 28 24 63 68 69 6c 64 29 0a 09 09 73  $pos($child)...s
6210: 65 74 20 63 72 6f 73 73 65 73 20 7b 7d 0a 0a 09  et crosses {}...
6220: 09 69 66 20 7b 24 73 74 61 72 74 20 3e 20 24 65  .if {$start > $e
6230: 6e 64 7d 20 7b 0a 09 09 20 20 20 20 77 68 69 6c  nd} {...    whil
6240: 65 20 7b 24 65 6e 64 20 3c 20 24 73 74 61 72 74  e {$end < $start
6250: 7d 20 7b 0a 09 09 09 6c 61 70 70 65 6e 64 20 63  } {....lappend c
6260: 72 6f 73 73 65 73 20 24 65 6e 64 0a 09 09 09 69  rosses $end....i
6270: 6e 63 72 20 63 72 6f 73 73 28 24 65 6e 64 29 0a  ncr cross($end).
6280: 09 09 09 69 6e 63 72 20 65 6e 64 0a 09 09 20 20  ...incr end...  
6290: 20 20 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09    }...} else {..
62a0: 09 20 20 20 20 77 68 69 6c 65 20 7b 24 73 74 61  .    while {$sta
62b0: 72 74 20 3c 20 24 65 6e 64 7d 20 7b 0a 09 09 09  rt < $end} {....
62c0: 6c 61 70 70 65 6e 64 20 63 72 6f 73 73 65 73 20  lappend crosses 
62d0: 24 73 74 61 72 74 0a 09 09 09 69 6e 63 72 20 63  $start....incr c
62e0: 72 6f 73 73 28 24 73 74 61 72 74 29 0a 09 09 09  ross($start)....
62f0: 69 6e 63 72 20 73 74 61 72 74 0a 09 09 20 20 20  incr start...   
6300: 20 7d 0a 09 09 7d 0a 09 09 73 65 74 20 64 65 70   }...}...set dep
6310: 63 28 24 64 6b 65 79 29 20 24 63 72 6f 73 73 65  c($dkey) $crosse
6320: 73 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 49 6e  s..    }..}...In
6330: 69 74 69 61 6c 69 7a 65 44 65 6c 74 61 73 20 24  itializeDeltas $
6340: 72 65 76 69 73 69 6f 6e 73 0a 09 72 65 74 75 72  revisions..retur
6350: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f  n.    }..    pro
6360: 63 20 49 6e 69 74 69 61 6c 69 7a 65 44 65 6c 74  c InitializeDelt
6370: 61 73 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b  as {revisions} {
6380: 0a 09 75 70 76 61 72 20 31 20 64 65 6c 74 61 20  ..upvar 1 delta 
6390: 64 65 6c 74 61 0a 0a 09 23 20 50 75 6c 6c 20 74  delta...# Pull t
63a0: 68 65 20 74 69 6d 65 73 74 61 6d 70 73 20 66 6f  he timestamps fo
63b0: 72 20 61 6c 6c 20 72 65 76 69 73 69 6f 6e 73 20  r all revisions 
63c0: 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  in the changeset
63d0: 73 20 61 6e 64 0a 09 23 20 63 6f 6d 70 75 74 65  s and..# compute
63e0: 20 74 68 65 69 72 20 64 65 6c 74 61 73 20 66 6f   their deltas fo
63f0: 72 20 75 73 65 20 62 79 20 74 68 65 20 62 72 65  r use by the bre
6400: 61 6b 20 66 69 6e 64 65 72 2e 0a 0a 09 61 72 72  ak finder....arr
6410: 61 79 20 73 65 74 20 64 65 6c 74 61 20 7b 7d 0a  ay set delta {}.
6420: 09 61 72 72 61 79 20 73 65 74 20 73 74 61 6d 70  .array set stamp
6430: 20 7b 7d 0a 0a 09 73 65 74 20 74 68 65 73 65 74   {}...set theset
6440: 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69   ('[join $revisi
6450: 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66 6f  ons {','}]')..fo
6460: 72 65 61 63 68 20 7b 72 69 64 20 74 69 6d 65 7d  reach {rid time}
6470: 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62   [state run [sub
6480: 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d  st -nocommands -
6490: 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a  nobackslashes {.
64a0: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69  .    SELECT R.ri
64b0: 64 2c 20 52 2e 64 61 74 65 0a 09 20 20 20 20 46  d, R.date..    F
64c0: 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 0a 09  ROM revision R..
64d0: 20 20 20 20 57 48 45 52 45 20 52 2e 72 69 64 20      WHERE R.rid 
64e0: 49 4e 20 24 74 68 65 73 65 74 0a 09 7d 5d 5d 20  IN $theset..}]] 
64f0: 7b 0a 09 20 20 20 20 73 65 74 20 73 74 61 6d 70  {..    set stamp
6500: 28 24 72 69 64 29 20 24 74 69 6d 65 0a 09 7d 0a  ($rid) $time..}.
6510: 0a 09 73 65 74 20 6e 20 30 0a 09 66 6f 72 65 61  ..set n 0..forea
6520: 63 68 20 72 69 64 20 5b 6c 72 61 6e 67 65 20 24  ch rid [lrange $
6530: 72 65 76 69 73 69 6f 6e 73 20 30 20 65 6e 64 2d  revisions 0 end-
6540: 31 5d 20 72 6e 65 78 74 20 5b 6c 72 61 6e 67 65  1] rnext [lrange
6550: 20 24 72 65 76 69 73 69 6f 6e 73 20 31 20 65 6e   $revisions 1 en
6560: 64 5d 20 7b 0a 09 20 20 20 20 73 65 74 20 64 65  d] {..    set de
6570: 6c 74 61 28 24 6e 29 20 5b 65 78 70 72 20 7b 24  lta($n) [expr {$
6580: 73 74 61 6d 70 28 24 72 6e 65 78 74 29 20 2d 20  stamp($rnext) - 
6590: 24 73 74 61 6d 70 28 24 72 69 64 29 7d 5d 0a 09  $stamp($rid)}]..
65a0: 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 09 72      incr n..}..r
65b0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
65c0: 20 70 72 6f 63 20 46 69 6e 64 42 65 73 74 42 72   proc FindBestBr
65d0: 65 61 6b 20 7b 72 61 6e 67 65 7d 20 7b 0a 09 75  eak {range} {..u
65e0: 70 76 61 72 20 31 20 63 72 6f 73 73 20 63 72 6f  pvar 1 cross cro
65f0: 73 73 20 64 65 6c 74 61 20 64 65 6c 74 61 0a 0a  ss delta delta..
6600: 09 23 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65  .# Determine the
6610: 20 62 65 73 74 20 62 72 65 61 6b 20 6c 6f 63 61   best break loca
6620: 74 69 6f 6e 20 69 6e 20 74 68 65 20 67 69 76 65  tion in the give
6630: 6e 20 72 61 6e 67 65 20 6f 66 0a 09 23 20 70 6f  n range of..# po
6640: 73 69 74 69 6f 6e 73 2e 20 46 69 72 73 74 20 77  sitions. First w
6650: 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 68 65 20 6c  e look for the l
6660: 6f 63 61 74 69 6f 6e 73 20 77 69 74 68 20 74 68  ocations with th
6670: 65 20 6d 61 78 69 6d 61 6c 0a 09 23 20 6e 75 6d  e maximal..# num
6680: 62 65 72 20 6f 66 20 63 72 6f 73 73 69 6e 67 73  ber of crossings
6690: 2e 20 49 66 20 74 68 65 72 65 20 61 72 65 20 73  . If there are s
66a0: 65 76 65 72 61 6c 20 77 65 20 6c 6f 6f 6b 20 66  everal we look f
66b0: 6f 72 20 74 68 65 0a 09 23 20 73 68 6f 72 74 65  or the..# shorte
66c0: 73 74 20 74 69 6d 65 20 69 6e 74 65 72 76 61 6c  st time interval
66d0: 20 61 6d 6f 6e 67 20 74 68 65 6d 2e 20 49 66 20   among them. If 
66e0: 77 65 20 73 74 69 6c 6c 20 68 61 76 65 20 6d 75  we still have mu
66f0: 6c 74 69 70 6c 65 0a 09 23 20 70 6f 73 73 69 62  ltiple..# possib
6700: 69 6c 69 74 69 65 73 20 61 66 74 65 72 20 74 68  ilities after th
6710: 61 74 20 77 65 20 73 65 6c 65 63 74 20 74 68 65  at we select the
6720: 20 65 61 72 6c 69 65 73 74 20 6c 6f 63 61 74 69   earliest locati
6730: 6f 6e 0a 09 23 20 61 6d 6f 6e 67 20 74 68 65 73  on..# among thes
6740: 65 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 49 66 20  e....# Note: If 
6750: 74 68 65 20 6d 61 78 69 6d 61 6c 20 6e 75 6d 62  the maximal numb
6760: 65 72 20 6f 66 20 63 72 6f 73 73 69 6e 67 73 20  er of crossings 
6770: 69 73 20 30 20 74 68 65 6e 20 74 68 65 20 72 61  is 0 then the ra
6780: 6e 67 65 0a 09 23 20 20 20 20 20 20 20 68 61 73  nge..#       has
6790: 20 6e 6f 20 69 6e 74 65 72 6e 61 6c 20 64 65 70   no internal dep
67a0: 65 6e 64 65 6e 63 69 65 73 2c 20 61 6e 64 20 6e  endencies, and n
67b0: 6f 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e  o break location
67c0: 20 61 74 0a 09 23 20 20 20 20 20 20 20 61 6c 6c   at..#       all
67d0: 2e 20 54 68 69 73 20 70 6f 73 73 69 62 69 6c 69  . This possibili
67e0: 74 79 20 69 73 20 73 69 67 6e 61 6c 65 64 20 76  ty is signaled v
67f0: 69 61 20 72 65 73 75 6c 74 20 2d 31 2e 0a 0a 09  ia result -1....
6800: 23 20 4e 6f 74 65 3a 20 41 20 72 61 6e 67 65 20  # Note: A range 
6810: 6f 66 20 6c 65 6e 67 74 68 20 31 20 6f 72 20 6c  of length 1 or l
6820: 65 73 73 20 63 61 6e 6e 6f 74 20 68 61 76 65 20  ess cannot have 
6830: 69 6e 74 65 72 6e 61 6c 0a 09 23 20 20 20 20 20  internal..#     
6840: 20 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20    dependencies, 
6850: 61 73 20 74 68 61 74 20 6e 65 65 64 73 20 61 74  as that needs at
6860: 20 6c 65 61 73 74 20 74 77 6f 20 72 65 76 69 73   least two revis
6870: 69 6f 6e 73 20 69 6e 0a 09 23 20 20 20 20 20 20  ions in..#      
6880: 20 74 68 65 20 72 61 6e 67 65 2e 0a 0a 09 69 66   the range....if
6890: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 72 61 6e 67   {[llength $rang
68a0: 65 5d 20 3c 20 32 7d 20 7b 20 72 65 74 75 72 6e  e] < 2} { return
68b0: 20 2d 31 20 7d 0a 0a 09 73 65 74 20 6d 61 78 20   -1 }...set max 
68c0: 2d 31 0a 09 73 65 74 20 62 65 73 74 20 7b 7d 0a  -1..set best {}.
68d0: 0a 09 66 6f 72 65 61 63 68 20 6c 6f 63 61 74 69  ..foreach locati
68e0: 6f 6e 20 24 72 61 6e 67 65 20 7b 0a 09 20 20 20  on $range {..   
68f0: 20 73 65 74 20 63 72 6f 73 73 69 6e 67 73 20 24   set crossings $
6900: 63 72 6f 73 73 28 24 6c 6f 63 61 74 69 6f 6e 29  cross($location)
6910: 0a 09 20 20 20 20 69 66 20 7b 24 63 72 6f 73 73  ..    if {$cross
6920: 69 6e 67 73 20 3e 20 24 6d 61 78 7d 20 7b 0a 09  ings > $max} {..
6930: 09 73 65 74 20 6d 61 78 20 20 24 63 72 6f 73 73  .set max  $cross
6940: 69 6e 67 73 0a 09 09 73 65 74 20 62 65 73 74 20  ings...set best 
6950: 5b 6c 69 73 74 20 24 6c 6f 63 61 74 69 6f 6e 5d  [list $location]
6960: 0a 09 09 63 6f 6e 74 69 6e 75 65 0a 09 20 20 20  ...continue..   
6970: 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 72 6f 73   } elseif {$cros
6980: 73 69 6e 67 73 20 3d 3d 20 24 6d 61 78 7d 20 7b  sings == $max} {
6990: 0a 09 09 6c 61 70 70 65 6e 64 20 62 65 73 74 20  ...lappend best 
69a0: 24 6c 6f 63 61 74 69 6f 6e 0a 09 20 20 20 20 7d  $location..    }
69b0: 0a 09 7d 0a 0a 09 69 66 20 7b 24 6d 61 78 20 3d  ..}...if {$max =
69c0: 3d 20 30 7d 20 20 20 20 20 20 20 20 20 20 20 20  = 0}            
69d0: 7b 20 72 65 74 75 72 6e 20 2d 31 20 7d 0a 09 69  { return -1 }..i
69e0: 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 62 65 73  f {[llength $bes
69f0: 74 5d 20 3d 3d 20 31 7d 20 7b 20 72 65 74 75 72  t] == 1} { retur
6a00: 6e 20 5b 6c 69 6e 64 65 78 20 24 62 65 73 74 20  n [lindex $best 
6a10: 30 5d 20 7d 0a 0a 09 73 65 74 20 6c 6f 63 61 74  0] }...set locat
6a20: 69 6f 6e 73 20 24 62 65 73 74 0a 09 73 65 74 20  ions $best..set 
6a30: 62 65 73 74 20 7b 7d 0a 09 73 65 74 20 6d 69 6e  best {}..set min
6a40: 20 2d 31 0a 0a 09 66 6f 72 65 61 63 68 20 6c 6f   -1...foreach lo
6a50: 63 61 74 69 6f 6e 20 24 6c 6f 63 61 74 69 6f 6e  cation $location
6a60: 73 20 7b 0a 09 20 20 20 20 73 65 74 20 69 6e 74  s {..    set int
6a70: 65 72 76 61 6c 20 24 64 65 6c 74 61 28 24 6c 6f  erval $delta($lo
6a80: 63 61 74 69 6f 6e 29 0a 09 20 20 20 20 69 66 20  cation)..    if 
6a90: 7b 28 24 6d 69 6e 20 3c 20 30 29 20 7c 7c 20 28  {($min < 0) || (
6aa0: 24 69 6e 74 65 72 76 61 6c 20 3c 20 24 6d 69 6e  $interval < $min
6ab0: 29 7d 20 7b 0a 09 09 73 65 74 20 6d 69 6e 20 20  )} {...set min  
6ac0: 24 69 6e 74 65 72 76 61 6c 0a 09 09 73 65 74 20  $interval...set 
6ad0: 62 65 73 74 20 5b 6c 69 73 74 20 24 6c 6f 63 61  best [list $loca
6ae0: 74 69 6f 6e 5d 0a 09 20 20 20 20 7d 20 65 6c 73  tion]..    } els
6af0: 65 69 66 20 7b 24 69 6e 74 65 72 76 61 6c 20 3d  eif {$interval =
6b00: 3d 20 24 6d 69 6e 7d 20 7b 0a 09 09 6c 61 70 70  = $min} {...lapp
6b10: 65 6e 64 20 62 65 73 74 20 24 6c 6f 63 61 74 69  end best $locati
6b20: 6f 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 69  on..    }..}...i
6b30: 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 62 65 73  f {[llength $bes
6b40: 74 5d 20 3d 3d 20 31 7d 20 7b 20 72 65 74 75 72  t] == 1} { retur
6b50: 6e 20 5b 6c 69 6e 64 65 78 20 24 62 65 73 74 20  n [lindex $best 
6b60: 30 5d 20 7d 0a 0a 09 72 65 74 75 72 6e 20 5b 6c  0] }...return [l
6b70: 69 6e 64 65 78 20 5b 6c 73 6f 72 74 20 2d 69 6e  index [lsort -in
6b80: 74 65 67 65 72 20 2d 69 6e 63 72 65 61 73 69 6e  teger -increasin
6b90: 67 20 24 62 65 73 74 5d 20 30 5d 0a 20 20 20 20  g $best] 0].    
6ba0: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 43 75 74 41  }..    proc CutA
6bb0: 74 20 7b 6c 6f 63 61 74 69 6f 6e 7d 20 7b 0a 09  t {location} {..
6bc0: 75 70 76 61 72 20 31 20 63 72 6f 73 73 20 63 72  upvar 1 cross cr
6bd0: 6f 73 73 20 64 65 70 63 20 64 65 70 63 0a 0a 09  oss depc depc...
6be0: 23 20 49 74 20 77 61 73 20 64 65 63 69 64 65 64  # It was decided
6bf0: 20 74 6f 20 73 70 6c 69 74 20 74 68 65 20 63 68   to split the ch
6c00: 61 6e 67 65 73 65 74 20 61 74 20 74 68 65 20 67  angeset at the g
6c10: 69 76 65 6e 0a 09 23 20 6c 6f 63 61 74 69 6f 6e  iven..# location
6c20: 2e 20 54 68 69 73 20 63 75 74 73 20 61 20 6e 75  . This cuts a nu
6c30: 6d 62 65 72 20 6f 66 20 64 65 70 65 6e 64 65 6e  mber of dependen
6c40: 63 69 65 73 2e 20 48 65 72 65 20 77 65 20 75 70  cies. Here we up
6c50: 64 61 74 65 0a 09 23 20 74 68 65 20 63 72 6f 73  date..# the cros
6c60: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 73 6f  s information so
6c70: 20 74 68 61 74 20 74 68 65 20 62 72 65 61 6b 20   that the break 
6c80: 66 69 6e 64 65 72 20 68 61 73 20 61 63 63 75 72  finder has accur
6c90: 61 74 65 0a 09 23 20 64 61 74 61 20 77 68 65 6e  ate..# data when
6ca0: 20 77 65 20 6c 6f 6f 6b 20 61 74 20 74 68 65 20   we look at the 
6cb0: 67 65 6e 65 72 61 74 65 64 20 66 72 61 67 6d 65  generated fragme
6cc0: 6e 74 73 2e 0a 0a 09 73 65 74 20 73 69 78 20 5b  nts....set six [
6cd0: 6c 6f 67 20 76 69 73 69 62 6c 65 3f 20 36 5d 0a  log visible? 6].
6ce0: 0a 09 66 6f 72 65 61 63 68 20 7b 64 65 70 20 72  ..foreach {dep r
6cf0: 61 6e 67 65 7d 20 5b 61 72 72 61 79 20 67 65 74  ange} [array get
6d00: 20 64 65 70 63 5d 20 7b 0a 09 20 20 20 20 23 20   depc] {..    # 
6d10: 43 68 65 63 6b 20 61 6c 6c 20 64 65 70 65 6e 64  Check all depend
6d20: 65 6e 63 69 65 73 20 73 74 69 6c 6c 20 6b 6e 6f  encies still kno
6d30: 77 6e 2c 20 74 61 6b 65 20 74 68 65 69 72 20 72  wn, take their r
6d40: 61 6e 67 65 20 61 6e 64 0a 09 20 20 20 20 23 20  ange and..    # 
6d50: 73 65 65 20 69 66 20 74 68 65 20 62 72 65 61 6b  see if the break
6d60: 20 6c 6f 63 61 74 69 6f 6e 20 66 61 6c 6c 73 20   location falls 
6d70: 77 69 74 68 69 6e 2e 0a 0a 09 20 20 20 20 42 6f  within....    Bo
6d80: 72 64 65 72 20 24 72 61 6e 67 65 20 73 20 65 0a  rder $range s e.
6d90: 09 20 20 20 20 69 66 20 7b 24 6c 6f 63 61 74 69  .    if {$locati
6da0: 6f 6e 20 3c 20 24 73 7d 20 63 6f 6e 74 69 6e 75  on < $s} continu
6db0: 65 20 3b 20 23 20 62 72 65 61 6b 20 62 65 66 6f  e ; # break befo
6dc0: 72 65 20 72 61 6e 67 65 2c 20 69 67 6e 6f 72 65  re range, ignore
6dd0: 0a 09 20 20 20 20 69 66 20 7b 24 6c 6f 63 61 74  ..    if {$locat
6de0: 69 6f 6e 20 3e 20 24 65 7d 20 63 6f 6e 74 69 6e  ion > $e} contin
6df0: 75 65 20 3b 20 23 20 62 72 65 61 6b 20 61 66 74  ue ; # break aft
6e00: 65 72 20 72 61 6e 67 65 2c 20 69 67 6e 6f 72 65  er range, ignore
6e10: 2e 0a 0a 09 20 20 20 20 23 20 54 68 69 73 20 64  ....    # This d
6e20: 65 70 65 6e 64 65 6e 63 79 20 63 72 6f 73 73 65  ependency crosse
6e30: 73 20 74 68 65 20 62 72 65 61 6b 20 6c 6f 63 61  s the break loca
6e40: 74 69 6f 6e 2e 20 57 65 20 72 65 6d 6f 76 65 20  tion. We remove 
6e50: 69 74 0a 09 20 20 20 20 23 20 66 72 6f 6d 20 74  it..    # from t
6e60: 68 65 20 63 72 6f 73 73 69 6e 67 73 20 63 6f 75  he crossings cou
6e70: 6e 74 65 72 73 2c 20 61 6e 64 20 74 68 65 6e 20  nters, and then 
6e80: 61 6c 73 6f 20 66 72 6f 6d 20 74 68 65 20 73 65  also from the se
6e90: 74 0a 09 20 20 20 20 23 20 6f 66 20 6b 6e 6f 77  t..    # of know
6ea0: 6e 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20  n dependencies, 
6eb0: 61 73 20 77 65 20 61 72 65 20 64 6f 6e 65 20 77  as we are done w
6ec0: 69 74 68 20 69 74 2e 0a 0a 09 20 20 20 20 66 6f  ith it....    fo
6ed0: 72 65 61 63 68 20 6c 6f 63 20 24 64 65 70 63 28  reach loc $depc(
6ee0: 24 64 65 70 29 20 7b 20 69 6e 63 72 20 63 72 6f  $dep) { incr cro
6ef0: 73 73 28 24 6c 6f 63 29 20 2d 31 20 7d 0a 09 20  ss($loc) -1 }.. 
6f00: 20 20 20 75 6e 73 65 74 20 64 65 70 63 28 24 64     unset depc($d
6f10: 65 70 29 0a 0a 09 20 20 20 20 69 66 20 7b 21 24  ep)...    if {!$
6f20: 73 69 78 7d 20 63 6f 6e 74 69 6e 75 65 0a 0a 09  six} continue...
6f30: 20 20 20 20 73 74 72 75 63 74 3a 3a 6c 69 73 74      struct::list
6f40: 20 61 73 73 69 67 6e 20 24 64 65 70 20 70 61 72   assign $dep par
6f50: 65 6e 74 20 63 68 69 6c 64 0a 09 20 20 20 20 6c  ent child..    l
6f60: 6f 67 20 77 72 69 74 65 20 35 20 63 73 65 74 73  og write 5 csets
6f70: 20 22 42 72 6f 6b 65 20 64 65 70 65 6e 64 65 6e   "Broke dependen
6f80: 63 79 20 5b 50 44 20 24 70 61 72 65 6e 74 5d 20  cy [PD $parent] 
6f90: 2d 2d 3e 20 5b 50 44 20 24 63 68 69 6c 64 5d 22  --> [PD $child]"
6fa0: 0a 09 7d 0a 0a 09 72 65 74 75 72 6e 0a 20 20 20  ..}...return.   
6fb0: 20 7d 0a 0a 20 20 20 20 23 20 50 72 69 6e 74 20   }..    # Print 
6fc0: 69 64 65 6e 74 69 66 79 69 6e 67 20 64 61 74 61  identifying data
6fd0: 20 66 6f 72 20 61 20 72 65 76 69 73 69 6f 6e 20   for a revision 
6fe0: 28 70 72 6f 6a 65 63 74 2c 20 66 69 6c 65 2c 20  (project, file, 
6ff0: 64 6f 74 74 65 64 20 72 65 76 0a 20 20 20 20 23  dotted rev.    #
7000: 20 6e 75 6d 62 65 72 29 2c 20 66 6f 72 20 68 69   number), for hi
7010: 67 68 20 76 65 72 62 6f 73 69 74 79 20 6c 6f 67  gh verbosity log
7020: 20 6f 75 74 70 75 74 2e 0a 20 20 20 20 23 20 54   output..    # T
7030: 4f 44 4f 3a 20 52 65 70 6c 61 63 65 20 77 69 74  ODO: Replace wit
7040: 68 20 63 61 6c 6c 20 74 6f 20 69 74 65 6d 73 74  h call to itemst
7050: 72 20 28 6c 69 73 74 20 72 65 76 20 24 69 64 29  r (list rev $id)
7060: 0a 0a 20 20 20 20 70 72 6f 63 20 50 44 20 7b 69  ..    proc PD {i
7070: 64 7d 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b 70  d} {..foreach {p
7080: 20 66 20 72 7d 20 5b 73 74 61 74 65 20 72 75 6e   f r} [state run
7090: 20 7b 0a 09 09 53 45 4c 45 43 54 20 50 2e 6e 61   {...SELECT P.na
70a0: 6d 65 20 2c 20 46 2e 6e 61 6d 65 2c 20 52 2e 72  me , F.name, R.r
70b0: 65 76 0a 09 09 46 52 4f 4d 20 72 65 76 69 73 69  ev...FROM revisi
70c0: 6f 6e 20 52 2c 20 66 69 6c 65 20 46 2c 20 70 72  on R, file F, pr
70d0: 6f 6a 65 63 74 20 50 0a 09 09 57 48 45 52 45 20  oject P...WHERE 
70e0: 52 2e 72 69 64 20 3d 20 24 69 64 20 20 20 20 2d  R.rid = $id    -
70f0: 2d 20 46 69 6e 64 20 73 70 65 63 69 66 69 65 64  - Find specified
7100: 20 66 69 6c 65 20 72 65 76 69 73 69 6f 6e 0a 09   file revision..
7110: 09 41 4e 44 20 20 20 46 2e 66 69 64 20 3d 20 52  .AND   F.fid = R
7120: 2e 66 69 64 20 20 2d 2d 20 47 65 74 20 66 69 6c  .fid  -- Get fil
7130: 65 20 6f 66 20 74 68 65 20 72 65 76 69 73 69 6f  e of the revisio
7140: 6e 0a 09 09 41 4e 44 20 20 20 50 2e 70 69 64 20  n...AND   P.pid 
7150: 3d 20 46 2e 70 69 64 20 20 2d 2d 20 47 65 74 20  = F.pid  -- Get 
7160: 70 72 6f 6a 65 63 74 20 6f 66 20 74 68 65 20 66  project of the f
7170: 69 6c 65 2e 0a 09 7d 5d 20 62 72 65 61 6b 0a 09  ile...}] break..
7180: 72 65 74 75 72 6e 20 22 27 24 70 20 3a 20 24 66  return "'$p : $f
7190: 2f 24 72 27 22 0a 20 20 20 20 7d 0a 0a 20 20 20  /$r'".    }..   
71a0: 20 23 20 50 72 69 6e 74 69 6e 67 20 6f 6e 65 20   # Printing one 
71b0: 6f 72 20 6d 6f 72 65 20 72 61 6e 67 65 73 2c 20  or more ranges, 
71c0: 66 6f 72 6d 61 74 74 65 64 2c 20 61 6e 64 20 6f  formatted, and o
71d0: 6e 6c 79 20 74 68 65 69 72 20 62 6f 72 64 65 72  nly their border
71e0: 20 74 6f 0a 20 20 20 20 23 20 6b 65 65 70 20 74   to.    # keep t
71f0: 68 65 20 73 74 72 69 6e 67 73 20 73 68 6f 72 74  he strings short
7200: 2e 0a 0a 20 20 20 20 70 72 6f 63 20 50 52 73 20  ...    proc PRs 
7210: 7b 72 61 6e 67 65 73 7d 20 7b 0a 09 72 65 74 75  {ranges} {..retu
7220: 72 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74  rn [struct::list
7230: 20 6d 61 70 20 24 72 61 6e 67 65 73 20 5b 6d 79   map $ranges [my
7240: 70 72 6f 63 20 50 52 5d 5d 0a 20 20 20 20 7d 0a  proc PR]].    }.
7250: 0a 20 20 20 20 70 72 6f 63 20 50 52 20 7b 72 61  .    proc PR {ra
7260: 6e 67 65 7d 20 7b 0a 09 42 6f 72 64 65 72 20 24  nge} {..Border $
7270: 72 61 6e 67 65 20 73 20 65 0a 09 72 65 74 75 72  range s e..retur
7280: 6e 20 3c 24 7b 73 7d 2e 2e 2e 24 7b 65 7d 3e 0a  n <${s}...${e}>.
7290: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20      }..    proc 
72a0: 42 6f 72 64 65 72 20 7b 72 61 6e 67 65 20 73 76  Border {range sv
72b0: 20 65 76 7d 20 7b 0a 09 75 70 76 61 72 20 31 20   ev} {..upvar 1 
72c0: 24 73 76 20 73 20 24 65 76 20 65 0a 09 73 65 74  $sv s $ev e..set
72d0: 20 73 20 5b 6c 69 6e 64 65 78 20 24 72 61 6e 67   s [lindex $rang
72e0: 65 20 30 5d 0a 09 73 65 74 20 65 20 5b 6c 69 6e  e 0]..set e [lin
72f0: 64 65 78 20 24 72 61 6e 67 65 20 65 6e 64 5d 0a  dex $range end].
7300: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
7310: 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23     # # ## ### ##
7320: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23  ### ######## ###
7330: 23 23 23 23 23 23 23 23 23 23 0a 0a 20 20 20 20  ##########..    
7340: 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63  typevariable myc
7350: 68 61 6e 67 65 73 65 74 73 20 20 20 20 20 20 20  hangesets       
7360: 20 20 7b 7d 20 3b 20 23 20 4c 69 73 74 20 6f 66    {} ; # List of
7370: 20 61 6c 6c 20 6b 6e 6f 77 6e 0a 09 09 09 09 09   all known......
7380: 20 20 20 23 20 63 68 61 6e 67 65 73 65 74 73 2e     # changesets.
7390: 0a 0a 20 20 20 20 23 20 4c 69 73 74 20 6f 66 20  ..    # List of 
73a0: 61 6c 6c 20 6b 6e 6f 77 6e 20 63 68 61 6e 67 65  all known change
73b0: 73 65 74 73 20 6f 66 20 61 20 74 79 70 65 2e 0a  sets of a type..
73c0: 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65      typevariable
73d0: 20 6d 79 74 63 68 61 6e 67 65 73 65 74 73 20 2d   mytchangesets -
73e0: 61 72 72 61 79 20 7b 0a 09 73 79 6d 3a 3a 62 72  array {..sym::br
73f0: 61 6e 63 68 20 7b 7d 0a 09 73 79 6d 3a 3a 74 61  anch {}..sym::ta
7400: 67 20 20 20 20 7b 7d 0a 09 72 65 76 20 20 20 20  g    {}..rev    
7410: 20 20 20 20 20 7b 7d 0a 20 20 20 20 7d 0a 09 09       {}.    }...
7420: 09 09 09 0a 20 20 20 20 74 79 70 65 76 61 72 69  ....    typevari
7430: 61 62 6c 65 20 6d 79 69 74 65 6d 6d 61 70 20 20  able myitemmap  
7440: 20 20 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23     -array {} ; #
7450: 20 4d 61 70 20 66 72 6f 6d 20 69 74 65 6d 73 20   Map from items 
7460: 28 74 61 67 67 65 64 29 0a 09 09 09 09 09 20 20  (tagged)......  
7470: 20 23 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f   # to the list o
7480: 66 20 63 68 61 6e 67 65 73 65 74 73 0a 09 09 09  f changesets....
7490: 09 09 20 20 20 23 20 63 6f 6e 74 61 69 6e 69 6e  ..   # containin
74a0: 67 20 69 74 2e 20 45 61 63 68 20 69 74 65 6d 0a  g it. Each item.
74b0: 09 09 09 09 09 20 20 20 23 20 63 61 6e 20 62 65  .....   # can be
74c0: 20 75 73 65 64 20 62 79 20 6f 6e 6c 79 20 6f 6e   used by only on
74d0: 65 0a 09 09 09 09 09 20 20 20 23 20 63 68 61 6e  e......   # chan
74e0: 67 65 73 65 74 2e 0a 20 20 20 20 74 79 70 65 76  geset..    typev
74f0: 61 72 69 61 62 6c 65 20 6d 79 69 64 6d 61 70 20  ariable myidmap 
7500: 20 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20    -array {} ; # 
7510: 4d 61 70 20 66 72 6f 6d 20 63 68 61 6e 67 65 73  Map from changes
7520: 65 74 20 69 64 20 74 6f 0a 09 09 09 09 20 20 20  et id to.....   
7530: 20 20 20 20 23 20 63 68 61 6e 67 65 73 65 74 2e      # changeset.
7540: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ..    typemethod
7550: 20 61 6c 6c 20 20 20 20 7b 7d 20 20 20 20 7b 20   all    {}    { 
7560: 72 65 74 75 72 6e 20 24 6d 79 63 68 61 6e 67 65  return $mychange
7570: 73 65 74 73 20 7d 0a 20 20 20 20 74 79 70 65 6d  sets }.    typem
7580: 65 74 68 6f 64 20 6f 66 20 20 20 20 20 7b 63 69  ethod of     {ci
7590: 64 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69  d} { return $myi
75a0: 64 6d 61 70 28 24 63 69 64 29 20 7d 0a 20 20 20  dmap($cid) }.   
75b0: 20 74 79 70 65 6d 65 74 68 6f 64 20 6f 66 69 74   typemethod ofit
75c0: 65 6d 20 7b 69 69 64 7d 20 7b 20 72 65 74 75 72  em {iid} { retur
75d0: 6e 20 24 6d 79 69 74 65 6d 6d 61 70 28 24 69 69  n $myitemmap($ii
75e0: 64 29 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65  d) }..    typeme
75f0: 74 68 6f 64 20 72 65 76 20 20 20 20 7b 7d 20 20  thod rev    {}  
7600: 20 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 74 63    { return $mytc
7610: 68 61 6e 67 65 73 65 74 73 28 72 65 76 29 20 7d  hangesets(rev) }
7620: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
7630: 73 79 6d 20 20 20 20 7b 7d 20 20 20 20 7b 20 72  sym    {}    { r
7640: 65 74 75 72 6e 20 5b 63 6f 6e 63 61 74 20 5c 0a  eturn [concat \.
7650: 09 09 09 09 09 20 20 24 7b 6d 79 74 63 68 61 6e  .....  ${mytchan
7660: 67 65 73 65 74 73 28 73 79 6d 3a 3a 62 72 61 6e  gesets(sym::bran
7670: 63 68 29 7d 20 5c 0a 09 09 09 09 09 20 20 24 7b  ch)} \......  ${
7680: 6d 79 74 63 68 61 6e 67 65 73 65 74 73 28 73 79  mytchangesets(sy
7690: 6d 3a 3a 74 61 67 29 7d 5d 20 7d 0a 0a 20 20 20  m::tag)}] }..   
76a0: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23   # # ## ### ####
76b0: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
76c0: 23 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20  ########.    ## 
76d0: 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a 20  Configuration.. 
76e0: 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79     pragma -hasty
76f0: 70 65 69 6e 66 6f 20 20 20 20 6e 6f 20 20 3b 20  peinfo    no  ; 
7700: 23 20 6e 6f 20 74 79 70 65 20 69 6e 74 72 6f 73  # no type intros
7710: 70 65 63 74 69 6f 6e 0a 20 20 20 20 70 72 61 67  pection.    prag
7720: 6d 61 20 2d 68 61 73 69 6e 66 6f 20 20 20 20 20  ma -hasinfo     
7730: 20 20 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 6f 62     no  ; # no ob
7740: 6a 65 63 74 20 69 6e 74 72 6f 73 70 65 63 74 69  ject introspecti
7750: 6f 6e 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23  on..    # # ## #
7760: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
7770: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  # #############.
7780: 7d 0a 0a 23 23 0a 23 23 20 4e 4f 54 45 3a 20 54  }..##.## NOTE: T
7790: 68 65 20 73 75 63 63 65 73 73 6f 72 20 61 6e 64  he successor and
77a0: 20 70 72 65 64 65 63 65 73 73 6f 72 20 6d 65 74   predecessor met
77b0: 68 6f 64 73 20 64 65 66 69 6e 65 64 20 62 79 20  hods defined by 
77c0: 74 68 65 20 63 6c 61 73 73 65 73 0a 23 23 20 20  the classes.##  
77d0: 20 20 20 20 20 62 65 6c 6f 77 20 61 72 65 20 2d       below are -
77e0: 2d 20 62 6f 74 74 6c 65 20 6e 65 63 6b 73 20 2d  - bottle necks -
77f0: 2d 2e 20 4c 6f 6f 6b 20 66 6f 72 20 77 61 79 73  -. Look for ways
7800: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 53 51 4c   to make the SQL
7810: 0a 23 23 20 20 20 20 20 20 20 66 61 73 74 65 72  .##       faster
7820: 2e 0a 23 23 0a 0a 23 20 23 20 23 23 20 23 23 23  ..##..# # ## ###
7830: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20   ##### ######## 
7840: 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23  ############# ##
7850: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
7860: 23 23 23 0a 23 23 20 48 65 6c 70 65 72 20 73 69  ###.## Helper si
7870: 6e 67 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64  ngleton. Command
7880: 73 20 66 6f 72 20 72 65 76 69 73 69 6f 6e 20 63  s for revision c
7890: 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e 69 74  hangesets...snit
78a0: 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f 73  ::type ::vc::fos
78b0: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73  sil::import::cvs
78c0: 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a  ::project::rev::
78d0: 72 65 76 20 7b 0a 20 20 20 20 74 79 70 65 6d 65  rev {.    typeme
78e0: 74 68 6f 64 20 62 79 72 65 76 69 73 69 6f 6e 20  thod byrevision 
78f0: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a  {} { return 1 }.
7900: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62      typemethod b
7910: 79 73 79 6d 62 6f 6c 20 20 20 7b 7d 20 7b 20 72  ysymbol   {} { r
7920: 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79  eturn 0 }.    ty
7930: 70 65 6d 65 74 68 6f 64 20 69 73 74 61 67 20 20  pemethod istag  
7940: 20 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20      {} { return 
7950: 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68  0 }.    typemeth
7960: 6f 64 20 69 73 62 72 61 6e 63 68 20 20 20 7b 7d  od isbranch   {}
7970: 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 0a 20   { return 0 }.. 
7980: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 73 74     typemethod st
7990: 72 20 7b 72 65 76 69 73 69 6f 6e 7d 20 7b 0a 09  r {revision} {..
79a0: 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73  struct::list ass
79b0: 69 67 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 7b  ign [state run {
79c0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
79d0: 65 76 2c 20 46 2e 6e 61 6d 65 2c 20 50 2e 6e 61  ev, F.name, P.na
79e0: 6d 65 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72  me..    FROM   r
79f0: 65 76 69 73 69 6f 6e 20 52 2c 20 66 69 6c 65 20  evision R, file 
7a00: 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09 20 20  F, project P..  
7a10: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 3d    WHERE  R.rid =
7a20: 20 24 72 65 76 69 73 69 6f 6e 20 2d 2d 20 46 69   $revision -- Fi
7a30: 6e 64 20 73 70 65 63 69 66 69 65 64 20 66 69 6c  nd specified fil
7a40: 65 20 72 65 76 69 73 69 6f 6e 0a 09 20 20 20 20  e revision..    
7a50: 41 4e 44 20 20 20 20 46 2e 66 69 64 20 3d 20 52  AND    F.fid = R
7a60: 2e 66 69 64 20 20 20 20 20 2d 2d 20 47 65 74 20  .fid     -- Get 
7a70: 66 69 6c 65 20 6f 66 20 74 68 65 20 72 65 76 69  file of the revi
7a80: 73 69 6f 6e 0a 09 20 20 20 20 41 4e 44 20 20 20  sion..    AND   
7a90: 20 50 2e 70 69 64 20 3d 20 46 2e 70 69 64 20 20   P.pid = F.pid  
7aa0: 20 20 20 2d 2d 20 47 65 74 20 70 72 6f 6a 65 63     -- Get projec
7ab0: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 09  t of the file...
7ac0: 7d 5d 20 72 65 76 6e 72 20 66 6e 61 6d 65 20 70  }] revnr fname p
7ad0: 6e 61 6d 65 0a 09 72 65 74 75 72 6e 20 22 24 70  name..return "$p
7ae0: 6e 61 6d 65 2f 24 7b 72 65 76 6e 72 7d 3a 3a 24  name/${revnr}::$
7af0: 66 6e 61 6d 65 22 0a 20 20 20 20 7d 0a 0a 20 20  fname".    }..  
7b00: 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73    # result = lis
7b10: 74 20 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74  t (mintime, maxt
7b20: 69 6d 65 29 0a 20 20 20 20 74 79 70 65 6d 65 74  ime).    typemet
7b30: 68 6f 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 69  hod timerange {i
7b40: 74 65 6d 73 7d 20 7b 0a 09 73 65 74 20 74 68 65  tems} {..set the
7b50: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 69 74 65  set ('[join $ite
7b60: 6d 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74  ms {','}]')..ret
7b70: 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 5b  urn [state run [
7b80: 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64  subst -nocommand
7b90: 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73  s -nobackslashes
7ba0: 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 4d   {..    SELECT M
7bb0: 49 4e 28 52 2e 64 61 74 65 29 2c 20 4d 41 58 28  IN(R.date), MAX(
7bc0: 52 2e 64 61 74 65 29 0a 09 20 20 20 20 46 52 4f  R.date)..    FRO
7bd0: 4d 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20  M revision R..  
7be0: 20 20 57 48 45 52 45 20 52 2e 72 69 64 20 49 4e    WHERE R.rid IN
7bf0: 20 24 74 68 65 73 65 74 20 2d 2d 20 52 65 73 74   $theset -- Rest
7c00: 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e  rict to revision
7c10: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 7d  s of interest..}
7c20: 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  ]].    }..    # 
7c30: 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20 28  var(dv) = dict (
7c40: 72 65 76 69 73 69 6f 6e 20 2d 3e 20 6c 69 73 74  revision -> list
7c50: 20 28 72 65 76 69 73 69 6f 6e 29 29 0a 20 20 20   (revision)).   
7c60: 20 74 79 70 65 6d 65 74 68 6f 64 20 69 6e 74 65   typemethod inte
7c70: 72 6e 61 6c 73 75 63 63 65 73 73 6f 72 73 20 7b  rnalsuccessors {
7c80: 64 76 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a  dv revisions} {.
7c90: 09 75 70 76 61 72 20 31 20 24 64 76 20 64 65 70  .upvar 1 $dv dep
7ca0: 65 6e 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74  endencies..set t
7cb0: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72  heset ('[join $r
7cc0: 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27  evisions {','}]'
7cd0: 29 0a 0a 09 23 20 53 65 65 20 27 73 75 63 63 65  )...# See 'succe
7ce0: 73 73 6f 72 73 27 20 62 65 6c 6f 77 20 66 6f 72  ssors' below for
7cf0: 20 74 68 65 20 6d 61 69 6e 20 65 78 70 6c 61 6e   the main explan
7d00: 61 74 69 6f 6e 20 6f 66 0a 09 23 20 74 68 65 20  ation of..# the 
7d10: 76 61 72 69 6f 75 73 20 63 61 73 65 73 2e 20 54  various cases. T
7d20: 68 69 73 20 70 69 65 63 65 20 69 73 20 73 70 65  his piece is spe
7d30: 63 69 61 6c 20 69 6e 20 74 68 61 74 20 69 74 0a  cial in that it.
7d40: 09 23 20 72 65 73 74 72 69 63 74 73 20 74 68 65  .# restricts the
7d50: 20 73 75 63 63 65 73 73 6f 72 73 20 77 65 20 6c   successors we l
7d60: 6f 6f 6b 20 66 6f 72 20 74 6f 20 74 68 65 20 73  ook for to the s
7d70: 61 6d 65 20 73 65 74 20 6f 66 0a 09 23 20 72 65  ame set of..# re
7d80: 76 69 73 69 6f 6e 73 20 77 65 20 73 74 61 72 74  visions we start
7d90: 20 66 72 6f 6d 2e 20 53 65 6e 73 69 62 6c 65 20   from. Sensible 
7da0: 61 73 20 77 65 20 61 72 65 20 6c 6f 6f 6b 69 6e  as we are lookin
7db0: 67 20 66 6f 72 0a 09 23 20 63 68 61 6e 67 65 73  g for..# changes
7dc0: 65 74 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65  et internal depe
7dd0: 6e 64 65 6e 63 69 65 73 2e 0a 0a 09 61 72 72 61  ndencies....arra
7de0: 79 20 73 65 74 20 64 65 70 20 7b 7d 0a 0a 09 66  y set dep {}...f
7df0: 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c  oreach {rid chil
7e00: 64 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73  d} [state run [s
7e10: 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73  ubst -nocommands
7e20: 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20   -nobackslashes 
7e30: 7b 0a 20 20 20 20 2d 2d 20 28 31 29 20 50 72 69  {.    -- (1) Pri
7e40: 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20  mary child..    
7e50: 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 2e  SELECT R.rid, R.
7e60: 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20  child..    FROM 
7e70: 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20    revision R..  
7e80: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20    WHERE  R.rid  
7e90: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20   IN $theset     
7ea0: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72  -- Restrict to r
7eb0: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65  evisions of inte
7ec0: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
7ed0: 20 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20   R.child IS NOT 
7ee0: 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70  NULL    -- Has p
7ef0: 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20  rimary child..  
7f00: 20 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64    AND    R.child
7f10: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20   IN $theset     
7f20: 2d 2d 20 57 68 69 63 68 20 69 73 20 61 6c 73 6f  -- Which is also
7f30: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 20 20 20   of interest.   
7f40: 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32   UNION.    -- (2
7f50: 29 20 53 65 63 6f 6e 64 61 72 79 20 28 62 72 61  ) Secondary (bra
7f60: 6e 63 68 29 20 63 68 69 6c 64 72 65 6e 0a 09 20  nch) children.. 
7f70: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c     SELECT R.rid,
7f80: 20 42 2e 62 72 69 64 0a 09 20 20 20 20 46 52 4f   B.brid..    FRO
7f90: 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20  M   revision R, 
7fa0: 72 65 76 69 73 69 6f 6e 62 72 61 6e 63 68 63 68  revisionbranchch
7fb0: 69 6c 64 72 65 6e 20 42 0a 09 20 20 20 20 57 48  ildren B..    WH
7fc0: 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20  ERE  R.rid   IN 
7fd0: 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52  $theset     -- R
7fe0: 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73  estrict to revis
7ff0: 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74  ions of interest
8000: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72  ..    AND    R.r
8010: 69 64 20 3d 20 42 2e 72 69 64 20 20 20 20 20 20  id = B.rid      
8020: 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 73 75      -- Select su
8030: 62 73 65 74 20 6f 66 20 62 72 61 6e 63 68 20 63  bset of branch c
8040: 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 41 4e 44  hildren..    AND
8050: 20 20 20 20 42 2e 62 72 69 64 20 49 4e 20 24 74      B.brid IN $t
8060: 68 65 73 65 74 20 20 20 20 20 20 2d 2d 20 57 68  heset      -- Wh
8070: 69 63 68 20 69 73 20 61 6c 73 6f 20 6f 66 20 69  ich is also of i
8080: 6e 74 65 72 65 73 74 0a 20 20 20 20 55 4e 49 4f  nterest.    UNIO
8090: 4e 0a 20 20 20 20 2d 2d 20 28 34 29 20 43 68 69  N.    -- (4) Chi
80a0: 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74  ld of trunk root
80b0: 20 73 75 63 63 65 73 73 6f 72 20 6f 66 20 6c 61   successor of la
80c0: 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b  st NTDB on trunk
80d0: 2e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e  ...    SELECT R.
80e0: 72 69 64 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20  rid, RA.child.. 
80f0: 20 20 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e     FROM revision
8100: 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 0a   R, revision RA.
8110: 09 20 20 20 20 57 48 45 52 45 20 52 2e 72 69 64  .    WHERE R.rid
8120: 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20     IN $theset   
8130: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74     -- Restrict t
8140: 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69  o revisions of i
8150: 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44  nterest..    AND
8160: 20 20 20 52 2e 69 73 64 65 66 61 75 6c 74 20 20     R.isdefault  
8170: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 52 65             -- Re
8180: 73 74 72 69 63 74 20 74 6f 20 4e 54 44 42 0a 09  strict to NTDB..
8190: 20 20 20 20 41 4e 44 20 20 20 52 2e 64 62 63 68      AND   R.dbch
81a0: 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20  ild IS NOT NULL 
81b0: 20 20 2d 2d 20 61 6e 64 20 6c 61 73 74 20 4e 54    -- and last NT
81c0: 44 42 20 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20  DB belonging to 
81d0: 74 72 75 6e 6b 0a 09 20 20 20 20 41 4e 44 20 20  trunk..    AND  
81e0: 20 52 41 2e 72 69 64 20 3d 20 52 2e 64 62 63 68   RA.rid = R.dbch
81f0: 69 6c 64 20 20 20 20 20 20 2d 2d 20 47 6f 20 64  ild      -- Go d
8200: 69 72 65 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b  irectly to trunk
8210: 20 72 6f 6f 74 0a 09 20 20 20 20 41 4e 44 20 20   root..    AND  
8220: 20 52 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54   RA.child IS NOT
8230: 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20   NULL    -- Has 
8240: 70 72 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 20  primary child.. 
8250: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20             AND  
8260: 20 52 41 2e 63 68 69 6c 64 20 49 4e 20 24 74 68   RA.child IN $th
8270: 65 73 65 74 20 20 20 20 20 2d 2d 20 57 68 69 63  eset     -- Whic
8280: 68 20 69 73 20 61 6c 73 6f 20 6f 66 20 69 6e 74  h is also of int
8290: 65 72 65 73 74 0a 09 7d 5d 5d 20 7b 0a 09 20 20  erest..}]] {..  
82a0: 20 20 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76    # Consider mov
82b0: 69 6e 67 20 74 68 69 73 20 74 6f 20 74 68 65 20  ing this to the 
82c0: 69 6e 74 65 67 72 69 74 79 20 6d 6f 64 75 6c 65  integrity module
82d0: 2e 0a 09 20 20 20 20 69 6e 74 65 67 72 69 74 79  ...    integrity
82e0: 20 61 73 73 65 72 74 20 7b 24 72 69 64 20 21 3d   assert {$rid !=
82f0: 20 24 63 68 69 6c 64 7d 20 7b 52 65 76 69 73 69   $child} {Revisi
8300: 6f 6e 20 24 72 69 64 20 64 65 70 65 6e 64 73 20  on $rid depends 
8310: 6f 6e 20 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20  on itself.}..   
8320: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65   lappend depende
8330: 6e 63 69 65 73 28 24 72 69 64 29 20 24 63 68 69  ncies($rid) $chi
8340: 6c 64 0a 09 20 20 20 20 73 65 74 20 64 65 70 28  ld..    set dep(
8350: 24 72 69 64 2c 24 63 68 69 6c 64 29 20 2e 0a 09  $rid,$child) ...
8360: 7d 0a 0a 09 23 20 54 68 65 20 73 71 6c 20 73 74  }...# The sql st
8370: 61 74 65 6d 65 6e 74 73 20 61 62 6f 76 65 20 6c  atements above l
8380: 6f 6f 6b 73 20 6f 6e 6c 79 20 66 6f 72 20 64 69  ooks only for di
8390: 72 65 63 74 20 64 65 70 65 6e 64 65 6e 63 69 65  rect dependencie
83a0: 73 0a 09 23 20 62 65 74 77 65 65 6e 20 72 65 76  s..# between rev
83b0: 69 73 69 6f 6e 20 69 6e 20 74 68 65 20 63 68 61  ision in the cha
83c0: 6e 67 65 73 65 74 2e 20 48 6f 77 65 76 65 72 20  ngeset. However 
83d0: 64 75 65 20 74 6f 20 74 68 65 0a 09 23 20 76 61  due to the..# va
83e0: 67 61 72 69 65 73 20 6f 66 20 6d 65 74 61 20 64  garies of meta d
83f0: 61 74 61 20 69 74 20 69 73 20 70 6f 73 73 69 62  ata it is possib
8400: 6c 65 20 66 6f 72 20 74 77 6f 20 72 65 76 69 73  le for two revis
8410: 69 6f 6e 73 20 6f 66 0a 09 23 20 74 68 65 20 73  ions of..# the s
8420: 61 6d 65 20 66 69 6c 65 20 74 6f 20 65 6e 64 20  ame file to end 
8430: 75 70 20 69 6e 20 74 68 65 20 73 61 6d 65 20 63  up in the same c
8440: 68 61 6e 67 65 73 65 74 2c 20 77 69 74 68 6f 75  hangeset, withou
8450: 74 20 61 0a 09 23 20 64 69 72 65 63 74 20 64 65  t a..# direct de
8460: 70 65 6e 64 65 6e 63 79 20 62 65 74 77 65 65 6e  pendency between
8470: 20 74 68 65 6d 2e 20 48 6f 77 65 76 65 72 20 77   them. However w
8480: 65 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65 72  e know that ther
8490: 65 0a 09 23 20 68 61 73 20 74 6f 20 62 65 20 61  e..# has to be a
84a0: 20 61 6e 20 69 6e 64 69 72 65 63 74 20 64 65 70   an indirect dep
84b0: 65 6e 64 65 6e 63 79 2c 20 62 65 20 69 74 20 74  endency, be it t
84c0: 68 72 6f 75 67 68 20 70 72 69 6d 61 72 79 0a 09  hrough primary..
84d0: 23 20 63 68 69 6c 64 72 65 6e 2c 20 62 72 61 6e  # children, bran
84e0: 63 68 20 63 68 69 6c 64 72 65 6e 2c 20 6f 72 20  ch children, or 
84f0: 61 20 63 6f 6d 62 69 6e 61 74 69 6f 6e 20 74 68  a combination th
8500: 65 72 65 6f 66 2e 0a 0a 09 23 20 57 65 20 6e 6f  ereof....# We no
8510: 77 20 66 69 6c 6c 20 69 6e 20 74 68 65 73 65 20  w fill in these 
8520: 70 73 65 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63  pseudo-dependenc
8530: 69 65 73 2c 20 69 66 20 6e 6f 20 73 75 63 68 0a  ies, if no such.
8540: 09 23 20 64 65 70 65 6e 64 65 6e 63 79 20 65 78  .# dependency ex
8550: 69 73 74 73 20 61 6c 72 65 61 64 79 2e 20 54 68  ists already. Th
8560: 65 20 64 69 72 65 63 74 69 6f 6e 20 6f 66 20 74  e direction of t
8570: 68 65 20 64 65 70 65 6e 64 65 6e 63 79 0a 09 23  he dependency..#
8580: 20 69 73 20 61 63 74 75 61 6c 6c 79 20 69 72 72   is actually irr
8590: 65 6c 65 76 61 6e 74 20 66 6f 72 20 74 68 69 73  elevant for this
85a0: 2e 0a 0a 09 23 20 4e 4f 54 45 3a 20 54 68 69 73  ....# NOTE: This
85b0: 20 69 73 20 64 69 66 66 65 72 65 6e 74 20 66 72   is different fr
85c0: 6f 6d 20 63 76 73 32 73 76 6e 2e 20 4f 75 72 20  om cvs2svn. Our 
85d0: 73 70 69 72 69 74 75 61 6c 20 61 6e 63 65 73 74  spiritual ancest
85e0: 6f 72 0a 09 23 20 64 6f 65 73 20 6e 6f 74 20 75  or..# does not u
85f0: 73 65 20 73 75 63 68 20 70 73 65 75 64 6f 2d 64  se such pseudo-d
8600: 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 68 6f 77  ependencies, how
8610: 65 76 65 72 20 69 74 20 75 73 65 73 20 61 0a 09  ever it uses a..
8620: 23 20 43 4f 4d 4d 49 54 5f 54 48 52 45 53 48 4f  # COMMIT_THRESHO
8630: 4c 44 2c 20 61 20 74 69 6d 65 20 69 6e 74 65 72  LD, a time inter
8640: 76 61 6c 20 63 6f 6d 6d 69 74 73 20 73 68 6f 75  val commits shou
8650: 6c 64 20 66 61 6c 6c 2e 20 54 68 69 73 0a 09 23  ld fall. This..#
8660: 20 77 69 6c 6c 20 67 72 65 61 74 6c 79 20 72 65   will greatly re
8670: 64 75 63 65 73 20 74 68 65 20 72 69 73 6b 20 6f  duces the risk o
8680: 66 20 67 65 74 74 69 6e 67 20 66 61 72 20 73 65  f getting far se
8690: 70 61 72 61 74 65 64 0a 09 23 20 72 65 76 69 73  parated..# revis
86a0: 69 6f 6e 73 20 6f 66 20 74 68 65 20 73 61 6d 65  ions of the same
86b0: 20 66 69 6c 65 20 69 6e 74 6f 20 6f 6e 65 20 63   file into one c
86c0: 68 61 6e 67 65 73 65 74 2e 0a 0a 09 23 20 57 65  hangeset....# We
86d0: 20 61 6c 6c 6f 77 20 72 65 76 69 73 69 6f 6e 73   allow revisions
86e0: 20 74 6f 20 62 65 20 66 61 72 20 61 70 61 72 74   to be far apart
86f0: 20 69 6e 20 74 69 6d 65 20 69 6e 20 74 68 65 20   in time in the 
8700: 73 61 6d 65 0a 09 23 20 63 68 61 6e 67 65 73 65  same..# changese
8710: 74 2c 20 62 75 74 20 69 6e 20 74 75 72 6e 20 6e  t, but in turn n
8720: 65 65 64 20 74 68 65 20 70 73 65 75 64 6f 2d 64  eed the pseudo-d
8730: 65 70 65 6e 64 65 6e 63 69 65 73 20 74 6f 0a 09  ependencies to..
8740: 23 20 68 61 6e 64 6c 65 20 74 68 69 73 2e 0a 0a  # handle this...
8750: 09 61 72 72 61 79 20 73 65 74 20 66 69 64 73 20  .array set fids 
8760: 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64  {}..foreach {rid
8770: 20 66 69 64 7d 20 5b 73 74 61 74 65 20 72 75 6e   fid} [state run
8780: 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61   [subst -nocomma
8790: 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68  nds -nobackslash
87a0: 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54  es {..    SELECT
87b0: 20 52 2e 72 69 64 2c 20 52 2e 66 69 64 0a 20 20   R.rid, R.fid.  
87c0: 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d 20 20            FROM  
87d0: 20 72 65 76 69 73 69 6f 6e 20 52 0a 20 20 20 20   revision R.    
87e0: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 20 52          WHERE  R
87f0: 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a  .rid IN $theset.
8800: 09 7d 5d 5d 20 7b 20 6c 61 70 70 65 6e 64 20 66  .}]] { lappend f
8810: 69 64 73 28 24 66 69 64 29 20 24 72 69 64 20 7d  ids($fid) $rid }
8820: 0a 0a 09 66 6f 72 65 61 63 68 20 7b 66 69 64 20  ...foreach {fid 
8830: 72 69 64 73 7d 20 5b 61 72 72 61 79 20 67 65 74  rids} [array get
8840: 20 66 69 64 73 5d 20 7b 0a 09 20 20 20 20 69 66   fids] {..    if
8850: 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 72 69 64 73   {[llength $rids
8860: 5d 20 3c 20 32 7d 20 63 6f 6e 74 69 6e 75 65 0a  ] < 2} continue.
8870: 09 20 20 20 20 66 6f 72 65 61 63 68 20 61 20 24  .    foreach a $
8880: 72 69 64 73 20 7b 0a 09 09 66 6f 72 65 61 63 68  rids {...foreach
8890: 20 62 20 24 72 69 64 73 20 7b 0a 09 09 20 20 20   b $rids {...   
88a0: 20 69 66 20 7b 24 61 20 3d 3d 20 24 62 7d 20 63   if {$a == $b} c
88b0: 6f 6e 74 69 6e 75 65 0a 09 09 20 20 20 20 69 66  ontinue...    if
88c0: 20 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64   {[info exists d
88d0: 65 70 28 24 61 2c 24 62 29 5d 7d 20 63 6f 6e 74  ep($a,$b)]} cont
88e0: 69 6e 75 65 0a 09 09 20 20 20 20 69 66 20 7b 5b  inue...    if {[
88f0: 69 6e 66 6f 20 65 78 69 73 74 73 20 64 65 70 28  info exists dep(
8900: 24 62 2c 24 61 29 5d 7d 20 63 6f 6e 74 69 6e 75  $b,$a)]} continu
8910: 65 0a 09 09 20 20 20 20 6c 61 70 70 65 6e 64 20  e...    lappend 
8920: 64 65 70 65 6e 64 65 6e 63 69 65 73 28 24 61 29  dependencies($a)
8930: 20 24 62 0a 09 09 20 20 20 20 73 65 74 20 64 65   $b...    set de
8940: 70 28 24 61 2c 24 62 29 20 2e 0a 09 09 20 20 20  p($a,$b) ....   
8950: 20 73 65 74 20 64 65 70 28 24 62 2c 24 61 29 20   set dep($b,$a) 
8960: 2e 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a  ....}..    }..}.
8970: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
8980: 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20 34 2d     # result = 4-
8990: 6c 69 73 74 20 28 69 74 65 6d 74 79 70 65 20 69  list (itemtype i
89a0: 74 65 6d 69 64 20 6e 65 78 74 69 74 65 6d 74 79  temid nextitemty
89b0: 70 65 20 6e 65 78 74 69 74 65 6d 69 64 20 2e 2e  pe nextitemid ..
89c0: 2e 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  .).    typemetho
89d0: 64 20 6c 6f 6f 70 73 20 7b 72 65 76 69 73 69 6f  d loops {revisio
89e0: 6e 73 7d 20 7b 0a 09 23 20 4e 6f 74 65 3a 20 54  ns} {..# Note: T
89f0: 61 67 73 20 61 6e 64 20 62 72 61 6e 63 68 65 73  ags and branches
8a00: 20 63 61 6e 6e 6f 74 20 63 61 75 73 65 20 74 68   cannot cause th
8a10: 65 20 6c 6f 6f 70 2e 20 54 68 65 69 72 20 69 64  e loop. Their id
8a20: 27 73 2c 0a 09 23 20 62 65 69 6e 67 20 6f 66 20  's,..# being of 
8a30: 61 20 66 75 6e 64 61 6d 65 6e 74 61 6c 6c 79 20  a fundamentally 
8a40: 64 69 66 66 65 72 65 6e 74 20 74 79 70 65 20 74  different type t
8a50: 68 61 6e 20 74 68 65 20 72 65 76 69 73 69 6f 6e  han the revision
8a60: 73 0a 09 23 20 63 6f 6d 69 6e 67 20 69 6e 20 63  s..# coming in c
8a70: 61 6e 6e 6f 74 20 62 65 20 69 6e 20 74 68 65 20  annot be in the 
8a80: 73 65 74 2e 0a 0a 09 73 65 74 20 74 68 65 73 65  set....set these
8a90: 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73  t ('[join $revis
8aa0: 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72  ions {','}]')..r
8ab0: 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e  eturn [state run
8ac0: 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61   [subst -nocomma
8ad0: 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68  nds -nobackslash
8ae0: 65 73 20 7b 0a 09 20 20 20 20 2d 2d 20 28 31 29  es {..    -- (1)
8af0: 20 50 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 09   Primary child..
8b00: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64      SELECT R.rid
8b10: 2c 20 52 2e 63 68 69 6c 64 0a 09 20 20 20 20 46  , R.child..    F
8b20: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52  ROM   revision R
8b30: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72  ..    WHERE  R.r
8b40: 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20  id   IN $theset 
8b50: 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20      -- Restrict 
8b60: 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20  to revisions of 
8b70: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e  interest..    AN
8b80: 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49 53 20  D    R.child IS 
8b90: 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48  NOT NULL    -- H
8ba0: 61 73 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64  as primary child
8bb0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 63  ..    AND    R.c
8bc0: 68 69 6c 64 20 49 4e 20 24 74 68 65 73 65 74 20  hild IN $theset 
8bd0: 20 20 20 20 2d 2d 20 4c 6f 6f 70 0a 09 20 20 20      -- Loop..   
8be0: 20 2d 2d 0a 09 20 20 20 20 55 4e 49 4f 4e 0a 09   --..    UNION..
8bf0: 20 20 20 20 2d 2d 20 28 32 29 20 53 65 63 6f 6e      -- (2) Secon
8c00: 64 61 72 79 20 28 62 72 61 6e 63 68 29 20 63 68  dary (branch) ch
8c10: 69 6c 64 72 65 6e 0a 09 20 20 20 20 53 45 4c 45  ildren..    SELE
8c20: 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 72 69 64  CT R.rid, B.brid
8c30: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76  ..    FROM   rev
8c40: 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f  ision R, revisio
8c50: 6e 62 72 61 6e 63 68 63 68 69 6c 64 72 65 6e 20  nbranchchildren 
8c60: 42 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e  B..    WHERE  R.
8c70: 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74  rid   IN $theset
8c80: 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74       -- Restrict
8c90: 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66   to revisions of
8ca0: 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41   interest..    A
8cb0: 4e 44 20 20 20 20 52 2e 72 69 64 20 3d 20 42 2e  ND    R.rid = B.
8cc0: 72 69 64 20 20 20 20 20 20 20 20 20 20 2d 2d 20  rid          -- 
8cd0: 53 65 6c 65 63 74 20 73 75 62 73 65 74 20 6f 66  Select subset of
8ce0: 20 62 72 61 6e 63 68 20 63 68 69 6c 64 72 65 6e   branch children
8cf0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 72  ..    AND    B.r
8d00: 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20  id   IN $theset 
8d10: 20 20 20 20 2d 2d 20 4c 6f 6f 70 0a 09 20 20 20      -- Loop..   
8d20: 20 2d 2d 0a 09 20 20 20 20 55 4e 49 4f 4e 0a 09   --..    UNION..
8d30: 20 20 20 20 2d 2d 20 28 34 29 20 43 68 69 6c 64      -- (4) Child
8d40: 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74 20 73   of trunk root s
8d50: 75 63 63 65 73 73 6f 72 20 6f 66 20 6c 61 73 74  uccessor of last
8d60: 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b 2e 0a   NTDB on trunk..
8d70: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69  .    SELECT R.ri
8d80: 64 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20 20 20  d, RA.child..   
8d90: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
8da0: 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 0a   R, revision RA.
8db0: 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69  .    WHERE  R.ri
8dc0: 64 20 20 20 20 49 4e 20 24 74 68 65 73 65 74 20  d    IN $theset 
8dd0: 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20      -- Restrict 
8de0: 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20  to revisions of 
8df0: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e  interest..    AN
8e00: 44 20 20 20 20 52 2e 69 73 64 65 66 61 75 6c 74  D    R.isdefault
8e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
8e20: 52 65 73 74 72 69 63 74 20 74 6f 20 4e 54 44 42  Restrict to NTDB
8e30: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 64  ..    AND    R.d
8e40: 62 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55  bchild IS NOT NU
8e50: 4c 4c 20 20 20 2d 2d 20 61 6e 64 20 6c 61 73 74  LL   -- and last
8e60: 20 4e 54 44 42 20 62 65 6c 6f 6e 67 69 6e 67 20   NTDB belonging 
8e70: 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20 41 4e  to trunk..    AN
8e80: 44 20 20 20 20 52 41 2e 72 69 64 20 3d 20 52 2e  D    RA.rid = R.
8e90: 64 62 63 68 69 6c 64 20 20 20 20 20 20 2d 2d 20  dbchild      -- 
8ea0: 47 6f 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  Go directly to t
8eb0: 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 20 41  runk root..    A
8ec0: 4e 44 20 20 20 20 52 41 2e 63 68 69 6c 64 20 49  ND    RA.child I
8ed0: 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d  S NOT NULL    --
8ee0: 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 68 69   Has primary chi
8ef0: 6c 64 2e 0a 09 20 20 20 20 41 4e 44 20 20 20 20  ld...    AND    
8f00: 52 41 2e 63 68 69 6c 64 20 49 4e 20 24 74 68 65  RA.child IN $the
8f10: 73 65 74 20 20 20 20 20 2d 2d 20 4c 6f 6f 70 0a  set     -- Loop.
8f20: 09 7d 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  .}]].    }..    
8f30: 23 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74  # var(dv) = dict
8f40: 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28   (item -> list (
8f50: 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20  item)), item  = 
8f60: 6c 69 73 74 20 28 74 79 70 65 20 69 64 29 0a 20  list (type id). 
8f70: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 73 75     typemethod su
8f80: 63 63 65 73 73 6f 72 73 20 7b 64 76 20 72 65 76  ccessors {dv rev
8f90: 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72  isions} {..upvar
8fa0: 20 31 20 24 64 76 20 64 65 70 65 6e 64 65 6e 63   1 $dv dependenc
8fb0: 69 65 73 0a 09 73 65 74 20 74 68 65 73 65 74 20  ies..set theset 
8fc0: 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f  ('[join $revisio
8fd0: 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 23 20  ns {','}]')...# 
8fe0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 61  The following ca
8ff0: 73 65 73 20 73 70 65 63 69 66 79 20 77 68 65 6e  ses specify when
9000: 20 61 20 72 65 76 69 73 69 6f 6e 20 53 20 69 73   a revision S is
9010: 20 61 20 73 75 63 63 65 73 73 6f 72 0a 09 23 20   a successor..# 
9020: 6f 66 20 61 20 72 65 76 69 73 69 6f 6e 20 52 2e  of a revision R.
9030: 20 45 61 63 68 20 6f 66 20 74 68 65 20 63 61 73   Each of the cas
9040: 65 73 20 74 72 61 6e 73 6c 61 74 65 73 20 69 6e  es translates in
9050: 74 6f 20 6f 6e 65 20 6f 66 0a 09 23 20 74 68 65  to one of..# the
9060: 20 62 72 61 6e 63 68 65 73 20 6f 66 20 74 68 65   branches of the
9070: 20 53 51 4c 20 55 4e 49 4f 4e 20 63 6f 6d 69 6e   SQL UNION comin
9080: 67 20 62 65 6c 6f 77 2e 0a 09 23 0a 09 23 20 28  g below...#..# (
9090: 31 29 20 53 20 63 61 6e 20 62 65 20 61 20 70 72  1) S can be a pr
90a0: 69 6d 61 72 79 20 63 68 69 6c 64 20 6f 66 20 52  imary child of R
90b0: 2c 20 69 2e 65 2e 20 69 6e 20 74 68 65 20 73 61  , i.e. in the sa
90c0: 6d 65 20 4c 4f 44 2e 20 52 0a 09 23 20 20 20 20  me LOD. R..#    
90d0: 20 72 65 66 65 72 65 6e 63 65 73 20 53 20 64 69   references S di
90e0: 72 65 63 74 6c 79 2e 20 52 2e 63 68 69 6c 64 20  rectly. R.child 
90f0: 3d 20 53 28 2e 72 69 64 29 2c 20 69 66 20 69 74  = S(.rid), if it
9100: 20 65 78 69 73 74 73 2e 0a 09 23 0a 09 23 20 28   exists...#..# (
9110: 32 29 20 53 20 63 61 6e 20 62 65 20 61 20 73 65  2) S can be a se
9120: 63 6f 6e 64 61 72 79 2c 20 69 2e 65 2e 20 62 72  condary, i.e. br
9130: 61 6e 63 68 2c 20 63 68 69 6c 64 20 6f 66 20 52  anch, child of R
9140: 2e 20 48 65 72 65 20 74 68 65 0a 09 23 20 20 20  . Here the..#   
9150: 20 20 6c 69 6e 6b 20 69 73 20 6d 61 64 65 20 74    link is made t
9160: 68 72 6f 75 67 68 20 74 68 65 20 68 65 6c 70 65  hrough the helpe
9170: 72 20 74 61 62 6c 65 0a 09 23 20 20 20 20 20 52  r table..#     R
9180: 45 56 49 53 49 4f 4e 42 52 41 4e 43 48 43 48 49  EVISIONBRANCHCHI
9190: 4c 44 52 45 4e 2e 20 52 2e 72 69 64 20 2d 3e 20  LDREN. R.rid -> 
91a0: 52 42 43 2e 72 69 64 2c 20 52 42 43 2e 62 72 69  RBC.rid, RBC.bri
91b0: 64 20 3d 0a 09 23 20 20 20 20 20 53 28 2e 72 69  d =..#     S(.ri
91c0: 64 29 0a 09 23 0a 09 23 20 28 33 29 20 4f 72 69  d)..#..# (3) Ori
91d0: 67 69 6e 61 6c 6c 79 20 74 68 69 73 20 75 73 65  ginally this use
91e0: 20 63 61 73 65 20 64 65 66 69 6e 65 64 20 74 68   case defined th
91f0: 65 20 72 6f 6f 74 20 6f 66 20 61 20 64 65 74 61  e root of a deta
9200: 63 68 65 64 0a 09 23 20 20 20 20 20 4e 54 44 42  ched..#     NTDB
9210: 20 61 73 20 74 68 65 20 73 75 63 63 65 73 73 6f   as the successo
9220: 72 20 6f 66 20 74 68 65 20 74 72 75 6e 6b 20 72  r of the trunk r
9230: 6f 6f 74 2e 20 54 68 69 73 20 6c 65 61 64 73 20  oot. This leads 
9240: 74 6f 20 61 0a 09 23 20 20 20 20 20 62 61 64 20  to a..#     bad 
9250: 74 61 6e 67 6c 65 20 6c 61 74 65 72 20 6f 6e 2e  tangle later on.
9260: 20 57 69 74 68 20 61 20 64 65 74 61 63 68 65 64   With a detached
9270: 20 4e 54 44 42 20 74 68 65 20 6f 72 69 67 69 6e   NTDB the origin
9280: 61 6c 0a 09 23 20 20 20 20 20 74 72 75 6e 6b 20  al..#     trunk 
9290: 72 6f 6f 74 20 72 65 76 69 73 69 6f 6e 20 77 61  root revision wa
92a0: 73 20 72 65 6d 6f 76 65 64 20 61 73 20 69 72 72  s removed as irr
92b0: 65 6c 65 76 61 6e 74 2c 20 61 6c 6c 6f 77 69 6e  elevant, allowin
92c0: 67 0a 09 23 20 20 20 20 20 74 68 65 20 6e 6f 6d  g..#     the nom
92d0: 69 6e 61 6c 20 72 6f 6f 74 20 74 6f 20 62 65 20  inal root to be 
92e0: 6c 61 74 65 72 20 69 6e 20 74 69 6d 65 20 74 68  later in time th
92f0: 61 6e 20 74 68 65 20 4e 54 44 42 0a 09 23 20 20  an the NTDB..#  
9300: 20 20 20 72 6f 6f 74 2e 20 4e 6f 77 20 73 65 74     root. Now set
9310: 74 69 6e 67 20 74 68 69 73 20 64 65 70 65 6e 64  ting this depend
9320: 65 6e 63 79 20 77 69 6c 6c 20 62 65 20 62 61 63  ency will be bac
9330: 6b 77 61 72 64 20 69 6e 0a 09 23 20 20 20 20 20  kward in..#     
9340: 74 69 6d 65 2e 20 52 45 4d 4f 56 45 44 2e 0a 09  time. REMOVED...
9350: 23 0a 09 23 20 28 34 29 20 49 66 20 52 20 69 73  #..# (4) If R is
9360: 20 74 68 65 20 6c 61 73 74 20 6f 66 20 74 68 65   the last of the
9370: 20 4e 54 44 42 20 72 65 76 69 73 69 6f 6e 73 20   NTDB revisions 
9380: 77 68 69 63 68 20 62 65 6c 6f 6e 67 20 74 6f 0a  which belong to.
9390: 09 23 20 20 20 20 20 74 68 65 20 74 72 75 6e 6b  .#     the trunk
93a0: 2c 20 74 68 65 6e 20 74 68 65 20 70 72 69 6d 61  , then the prima
93b0: 72 79 20 63 68 69 6c 64 20 6f 66 20 74 68 65 20  ry child of the 
93c0: 74 72 75 6e 6b 20 72 6f 6f 74 20 28 74 68 65 0a  trunk root (the.
93d0: 09 23 20 20 20 20 20 27 31 2e 32 27 20 72 65 76  .#     '1.2' rev
93e0: 69 73 69 6f 6e 29 20 69 73 20 61 20 73 75 63 63  ision) is a succ
93f0: 65 73 73 6f 72 2c 20 69 66 20 69 74 20 65 78 69  essor, if it exi
9400: 73 74 73 2e 0a 0a 09 23 20 4e 6f 74 65 20 74 68  sts....# Note th
9410: 61 74 20 74 68 65 20 62 72 61 6e 63 68 65 73 20  at the branches 
9420: 73 70 61 77 6e 65 64 20 66 72 6f 6d 20 74 68 65  spawned from the
9430: 20 72 65 76 69 73 69 6f 6e 73 2c 20 61 6e 64 20   revisions, and 
9440: 74 68 65 0a 09 23 20 74 61 67 73 20 61 73 73 6f  the..# tags asso
9450: 63 69 61 74 65 64 20 77 69 74 68 20 74 68 65 6d  ciated with them
9460: 20 61 72 65 20 73 75 63 63 65 73 73 6f 72 73 20   are successors 
9470: 61 73 20 77 65 6c 6c 2e 0a 0a 09 66 6f 72 65 61  as well....forea
9480: 63 68 20 7b 72 69 64 20 63 68 69 6c 64 7d 20 5b  ch {rid child} [
9490: 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73 74  state run [subst
94a0: 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f   -nocommands -no
94b0: 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 20 20  backslashes {.  
94c0: 20 20 2d 2d 20 28 31 29 20 50 72 69 6d 61 72 79    -- (1) Primary
94d0: 20 63 68 69 6c 64 0a 09 20 20 20 20 53 45 4c 45   child..    SELE
94e0: 43 54 20 52 2e 72 69 64 2c 20 52 2e 63 68 69 6c  CT R.rid, R.chil
94f0: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65  d..    FROM   re
9500: 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48  vision R..    WH
9510: 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20  ERE  R.rid   IN 
9520: 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52  $theset     -- R
9530: 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73  estrict to revis
9540: 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74  ions of interest
9550: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 63  ..    AND    R.c
9560: 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c 4c  hild IS NOT NULL
9570: 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d 61      -- Has prima
9580: 72 79 20 63 68 69 6c 64 0a 20 20 20 20 55 4e 49  ry child.    UNI
9590: 4f 4e 0a 20 20 20 20 2d 2d 20 28 32 29 20 53 65  ON.    -- (2) Se
95a0: 63 6f 6e 64 61 72 79 20 28 62 72 61 6e 63 68 29  condary (branch)
95b0: 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 53   children..    S
95c0: 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 42 2e 62  ELECT R.rid, B.b
95d0: 72 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  rid..    FROM   
95e0: 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69  revision R, revi
95f0: 73 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64 72  sionbranchchildr
9600: 65 6e 20 42 0a 09 20 20 20 20 57 48 45 52 45 20  en B..    WHERE 
9610: 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65   R.rid   IN $the
9620: 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72  set     -- Restr
9630: 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73  ict to revisions
9640: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20   of interest..  
9650: 20 20 41 4e 44 20 20 20 20 52 2e 72 69 64 20 3d    AND    R.rid =
9660: 20 42 2e 72 69 64 20 20 20 20 20 20 20 20 20 20   B.rid          
9670: 2d 2d 20 53 65 6c 65 63 74 20 73 75 62 73 65 74  -- Select subset
9680: 20 6f 66 20 62 72 61 6e 63 68 20 63 68 69 6c 64   of branch child
9690: 72 65 6e 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20  ren.    UNION.  
96a0: 20 20 2d 2d 20 28 34 29 20 43 68 69 6c 64 20 6f    -- (4) Child o
96b0: 66 20 74 72 75 6e 6b 20 72 6f 6f 74 20 73 75 63  f trunk root suc
96c0: 63 65 73 73 6f 72 20 6f 66 20 6c 61 73 74 20 4e  cessor of last N
96d0: 54 44 42 20 6f 6e 20 74 72 75 6e 6b 2e 0a 09 20  TDB on trunk... 
96e0: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c     SELECT R.rid,
96f0: 20 52 41 2e 63 68 69 6c 64 0a 09 20 20 20 20 46   RA.child..    F
9700: 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c 20  ROM revision R, 
9710: 72 65 76 69 73 69 6f 6e 20 52 41 0a 09 20 20 20  revision RA..   
9720: 20 57 48 45 52 45 20 52 2e 72 69 64 20 20 20 49   WHERE R.rid   I
9730: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 20 2d  N $theset      -
9740: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65  - Restrict to re
9750: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72  visions of inter
9760: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 52  est..    AND   R
9770: 2e 69 73 64 65 66 61 75 6c 74 20 20 20 20 20 20  .isdefault      
9780: 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69         -- Restri
9790: 63 74 20 74 6f 20 4e 54 44 42 0a 09 20 20 20 20  ct to NTDB..    
97a0: 41 4e 44 20 20 20 52 2e 64 62 63 68 69 6c 64 20  AND   R.dbchild 
97b0: 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d  IS NOT NULL   --
97c0: 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 42 20 62   and last NTDB b
97d0: 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72 75 6e  elonging to trun
97e0: 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 52 41 2e  k..    AND   RA.
97f0: 72 69 64 20 3d 20 52 2e 64 62 63 68 69 6c 64 20  rid = R.dbchild 
9800: 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 72 65 63       -- Go direc
9810: 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 72 6f 6f  tly to trunk roo
9820: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 52 41 2e  t..    AND   RA.
9830: 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c  child IS NOT NUL
9840: 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d  L    -- Has prim
9850: 61 72 79 20 63 68 69 6c 64 2e 0a 09 7d 5d 5d 20  ary child...}]] 
9860: 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 69 64 65  {..    # Conside
9870: 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 20 74 6f  r moving this to
9880: 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20 6d   the integrity m
9890: 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 6e 74 65  odule...    inte
98a0: 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24 72  grity assert {$r
98b0: 69 64 20 21 3d 20 24 63 68 69 6c 64 7d 20 7b 52  id != $child} {R
98c0: 65 76 69 73 69 6f 6e 20 24 72 69 64 20 64 65 70  evision $rid dep
98d0: 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 2e 7d  ends on itself.}
98e0: 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65  ..    lappend de
98f0: 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74  pendencies([list
9900: 20 72 65 76 20 24 72 69 64 5d 29 20 5b 6c 69 73   rev $rid]) [lis
9910: 74 20 72 65 76 20 24 63 68 69 6c 64 5d 0a 09 7d  t rev $child]..}
9920: 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63  ..foreach {rid c
9930: 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72 75 6e  hild} [state run
9940: 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61   [subst -nocomma
9950: 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68  nds -nobackslash
9960: 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54  es {..    SELECT
9970: 20 52 2e 72 69 64 2c 20 54 2e 74 69 64 0a 09 20   R.rid, T.tid.. 
9980: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69     FROM   revisi
9990: 6f 6e 20 52 2c 20 74 61 67 20 54 0a 09 20 20 20  on R, tag T..   
99a0: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 49 4e   WHERE  R.rid IN
99b0: 20 24 74 68 65 73 65 74 20 20 20 20 20 20 20 2d   $theset       -
99c0: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65  - Restrict to re
99d0: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72  visions of inter
99e0: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  est..    AND    
99f0: 54 2e 72 65 76 20 3d 20 52 2e 72 69 64 20 20 20  T.rev = R.rid   
9a00: 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74         -- Select
9a10: 20 74 61 67 73 20 61 74 74 61 63 68 65 64 20 74   tags attached t
9a20: 6f 20 74 68 65 6d 0a 09 7d 5d 5d 20 7b 0a 09 20  o them..}]] {.. 
9a30: 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e     lappend depen
9a40: 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 65  dencies([list re
9a50: 76 20 24 72 69 64 5d 29 20 5b 6c 69 73 74 20 73  v $rid]) [list s
9a60: 79 6d 3a 3a 74 61 67 20 24 63 68 69 6c 64 5d 0a  ym::tag $child].
9a70: 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64  .}..foreach {rid
9a80: 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72   child} [state r
9a90: 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d  un [subst -nocom
9aa0: 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61  mands -nobacksla
9ab0: 73 68 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45  shes {..    SELE
9ac0: 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 69 64 0a  CT R.rid, B.bid.
9ad0: 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69  .    FROM   revi
9ae0: 73 69 6f 6e 20 52 2c 20 62 72 61 6e 63 68 20 42  sion R, branch B
9af0: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72  ..    WHERE  R.r
9b00: 69 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20  id IN $theset   
9b10: 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20      -- Restrict 
9b20: 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20  to revisions of 
9b30: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e  interest..    AN
9b40: 44 20 20 20 20 42 2e 72 6f 6f 74 20 3d 20 52 2e  D    B.root = R.
9b50: 72 69 64 20 20 20 20 20 20 20 20 20 2d 2d 20 53  rid         -- S
9b60: 65 6c 65 63 74 20 62 72 61 6e 63 68 65 73 20 61  elect branches a
9b70: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 6d 0a  ttached to them.
9b80: 09 7d 5d 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70  .}]] {..    lapp
9b90: 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73  end dependencies
9ba0: 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64 5d  ([list rev $rid]
9bb0: 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61  ) [list sym::bra
9bc0: 6e 63 68 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09  nch $child]..}..
9bd0: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20  return.    }..  
9be0: 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73    # result = lis
9bf0: 74 20 28 63 68 61 6e 67 65 73 65 74 2d 69 64 29  t (changeset-id)
9c00: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
9c10: 63 73 5f 73 75 63 63 65 73 73 6f 72 73 20 7b 72  cs_successors {r
9c20: 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 20 20 20 20  evisions} {.    
9c30: 20 20 20 20 23 20 54 68 69 73 20 69 73 20 61 20      # This is a 
9c40: 76 61 72 69 61 6e 74 20 6f 66 20 27 73 75 63 63  variant of 'succ
9c50: 65 73 73 6f 72 73 27 20 77 68 69 63 68 20 6d 61  essors' which ma
9c60: 70 73 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c  ps the low-level
9c70: 0a 20 20 20 20 20 20 20 20 23 20 64 61 74 61 20  .        # data 
9c80: 64 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20  directly to the 
9c90: 61 73 73 6f 63 69 61 74 65 64 20 63 68 61 6e 67  associated chang
9ca0: 65 73 65 74 73 2e 20 49 2e 65 2e 20 69 6e 73 74  esets. I.e. inst
9cb0: 65 61 64 0a 20 20 20 20 20 20 20 20 23 20 6d 69  ead.        # mi
9cc0: 6c 6c 69 6f 6e 73 20 6f 66 20 64 65 70 65 6e 64  llions of depend
9cd0: 65 6e 63 79 20 70 61 69 72 73 20 28 69 6e 20 65  ency pairs (in e
9ce0: 78 74 72 65 6d 65 20 63 61 73 65 73 20 28 45 78  xtreme cases (Ex
9cf0: 61 6d 70 6c 65 3a 20 54 63 6c 0a 20 20 20 20 20  ample: Tcl.     
9d00: 20 20 20 23 20 43 56 53 29 29 20 77 65 20 72 65     # CVS)) we re
9d10: 74 75 72 6e 20 61 20 76 65 72 79 20 73 68 6f 72  turn a very shor
9d20: 74 20 61 6e 64 20 6d 75 63 68 20 6d 6f 72 65 20  t and much more 
9d30: 6d 61 6e 61 67 65 61 62 6c 65 20 6c 69 73 74 0a  manageable list.
9d40: 20 20 20 20 20 20 20 20 23 20 6f 66 20 63 68 61          # of cha
9d50: 6e 67 65 73 65 74 73 2e 0a 0a 09 73 65 74 20 74  ngesets....set t
9d60: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72  heset ('[join $r
9d70: 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27  evisions {','}]'
9d80: 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61 74 65  )..return [state
9d90: 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63   run [subst -noc
9da0: 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73  ommands -nobacks
9db0: 6c 61 73 68 65 73 20 7b 0a 20 20 20 20 2d 2d 20  lashes {.    -- 
9dc0: 28 31 29 20 50 72 69 6d 61 72 79 20 63 68 69 6c  (1) Primary chil
9dd0: 64 0a 09 20 20 20 20 53 45 4c 45 43 54 20 43 2e  d..    SELECT C.
9de0: 63 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  cid..    FROM   
9df0: 72 65 76 69 73 69 6f 6e 20 52 2c 20 63 73 69 74  revision R, csit
9e00: 65 6d 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74  em CI, changeset
9e10: 20 43 0a 09 20 20 20 20 57 48 45 52 45 20 20 52   C..    WHERE  R
9e20: 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65  .rid   IN $these
9e30: 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63  t     -- Restric
9e40: 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f  t to revisions o
9e50: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20  f interest..    
9e60: 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49  AND    R.child I
9e70: 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d  S NOT NULL    --
9e80: 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 68 69   Has primary chi
9e90: 6c 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 41  ld.            A
9ea0: 4e 44 20 20 20 20 43 49 2e 69 69 64 20 3d 20 52  ND    CI.iid = R
9eb0: 2e 63 68 69 6c 64 20 20 20 20 20 20 20 2d 2d 20  .child       -- 
9ec0: 53 65 6c 65 63 74 20 61 6c 6c 20 63 68 61 6e 67  Select all chang
9ed0: 65 73 65 74 73 0a 20 20 20 20 20 20 20 20 20 20  esets.          
9ee0: 20 20 41 4e 44 20 20 20 20 43 2e 63 69 64 20 3d    AND    C.cid =
9ef0: 20 43 49 2e 63 69 64 20 20 20 20 20 20 20 20 20   CI.cid         
9f00: 2d 2d 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  -- containing th
9f10: 65 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 0a  e primary child.
9f20: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
9f30: 20 20 20 43 2e 74 79 70 65 20 3d 20 30 20 20 20     C.type = 0   
9f40: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 77 68 69            -- whi
9f50: 63 68 20 61 72 65 20 72 65 76 69 73 69 6f 6e 20  ch are revision 
9f60: 63 68 61 6e 67 65 73 65 74 73 0a 20 20 20 20 55  changesets.    U
9f70: 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32 29 20  NION.    -- (2) 
9f80: 53 65 63 6f 6e 64 61 72 79 20 28 62 72 61 6e 63  Secondary (branc
9f90: 68 29 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20  h) children..   
9fa0: 20 53 45 4c 45 43 54 20 43 2e 63 69 64 0a 09 20   SELECT C.cid.. 
9fb0: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69     FROM   revisi
9fc0: 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 62 72  on R, revisionbr
9fd0: 61 6e 63 68 63 68 69 6c 64 72 65 6e 20 42 2c 20  anchchildren B, 
9fe0: 63 73 69 74 65 6d 20 43 49 2c 20 63 68 61 6e 67  csitem CI, chang
9ff0: 65 73 65 74 20 43 0a 09 20 20 20 20 57 48 45 52  eset C..    WHER
a000: 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74  E  R.rid   IN $t
a010: 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73  heset     -- Res
a020: 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f  trict to revisio
a030: 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09  ns of interest..
a040: 20 20 20 20 41 4e 44 20 20 20 20 52 2e 72 69 64      AND    R.rid
a050: 20 3d 20 42 2e 72 69 64 20 20 20 20 20 20 20 20   = B.rid        
a060: 20 20 2d 2d 20 53 65 6c 65 63 74 20 73 75 62 73    -- Select subs
a070: 65 74 20 6f 66 20 62 72 61 6e 63 68 20 63 68 69  et of branch chi
a080: 6c 64 72 65 6e 0a 20 20 20 20 20 20 20 20 20 20  ldren.          
a090: 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69 64 20    AND    CI.iid 
a0a0: 3d 20 42 2e 62 72 69 64 20 20 20 20 20 20 20 20  = B.brid        
a0b0: 2d 2d 20 53 65 6c 65 63 74 20 61 6c 6c 20 63 68  -- Select all ch
a0c0: 61 6e 67 65 73 65 74 73 0a 20 20 20 20 20 20 20  angesets.       
a0d0: 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e 63 69       AND    C.ci
a0e0: 64 20 3d 20 43 49 2e 63 69 64 09 20 20 2d 2d 20  d = CI.cid.  -- 
a0f0: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 62  containing the b
a100: 72 61 6e 63 68 0a 20 20 20 20 20 20 20 20 20 20  ranch.          
a110: 20 20 41 4e 44 20 20 20 20 43 2e 74 79 70 65 20    AND    C.type 
a120: 3d 20 30 09 09 20 20 2d 2d 20 77 68 69 63 68 20  = 0..  -- which 
a130: 61 72 65 20 72 65 76 69 73 69 6f 6e 20 63 68 61  are revision cha
a140: 6e 67 65 73 65 74 73 0a 20 20 20 20 55 4e 49 4f  ngesets.    UNIO
a150: 4e 0a 20 20 20 20 2d 2d 20 28 34 29 20 43 68 69  N.    -- (4) Chi
a160: 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74  ld of trunk root
a170: 20 73 75 63 63 65 73 73 6f 72 20 6f 66 20 6c 61   successor of la
a180: 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b  st NTDB on trunk
a190: 2e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 43 2e  ...    SELECT C.
a1a0: 63 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  cid..    FROM   
a1b0: 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69  revision R, revi
a1c0: 73 69 6f 6e 20 52 41 2c 20 63 73 69 74 65 6d 20  sion RA, csitem 
a1d0: 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43 0a  CI, changeset C.
a1e0: 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69  .    WHERE  R.ri
a1f0: 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20  d   IN $theset  
a200: 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20      -- Restrict 
a210: 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20  to revisions of 
a220: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e  interest..    AN
a230: 44 20 20 20 20 52 2e 69 73 64 65 66 61 75 6c 74  D    R.isdefault
a240: 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20               -- 
a250: 52 65 73 74 72 69 63 74 20 74 6f 20 4e 54 44 42  Restrict to NTDB
a260: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 64  ..    AND    R.d
a270: 62 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55  bchild IS NOT NU
a280: 4c 4c 20 20 20 2d 2d 20 61 6e 64 20 6c 61 73 74  LL   -- and last
a290: 20 4e 54 44 42 20 62 65 6c 6f 6e 67 69 6e 67 20   NTDB belonging 
a2a0: 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20 41 4e  to trunk..    AN
a2b0: 44 20 20 20 20 52 41 2e 72 69 64 20 3d 20 52 2e  D    RA.rid = R.
a2c0: 64 62 63 68 69 6c 64 20 20 20 20 20 20 2d 2d 20  dbchild      -- 
a2d0: 47 6f 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  Go directly to t
a2e0: 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 20 41  runk root..    A
a2f0: 4e 44 20 20 20 20 52 41 2e 63 68 69 6c 64 20 49  ND    RA.child I
a300: 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d  S NOT NULL    --
a310: 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 68 69   Has primary chi
a320: 6c 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ld..            
a330: 41 4e 44 20 20 20 20 43 49 2e 69 69 64 20 3d 20  AND    CI.iid = 
a340: 52 41 2e 63 68 69 6c 64 20 20 20 20 20 20 20 2d  RA.child       -
a350: 2d 20 53 65 6c 65 63 74 20 61 6c 6c 20 63 68 61  - Select all cha
a360: 6e 67 65 73 65 74 73 0a 20 20 20 20 20 20 20 20  ngesets.        
a370: 20 20 20 20 41 4e 44 20 20 20 20 43 2e 63 69 64      AND    C.cid
a380: 20 3d 20 43 49 2e 63 69 64 09 20 20 20 2d 2d 20   = CI.cid.   -- 
a390: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 70  containing the p
a3a0: 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 20 20 20  rimary child.   
a3b0: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20           AND    
a3c0: 43 2e 74 79 70 65 20 3d 20 30 09 09 20 20 20 2d  C.type = 0..   -
a3d0: 2d 20 77 68 69 63 68 20 61 72 65 20 72 65 76 69  - which are revi
a3e0: 73 69 6f 6e 20 63 68 61 6e 67 65 73 65 74 73 0a  sion changesets.
a3f0: 20 20 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 53      UNION..    S
a400: 45 4c 45 43 54 20 43 2e 63 69 64 0a 09 20 20 20  ELECT C.cid..   
a410: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
a420: 20 52 2c 20 74 61 67 20 54 2c 20 63 73 69 74 65   R, tag T, csite
a430: 6d 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20  m CI, changeset 
a440: 43 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e  C..    WHERE  R.
a450: 72 69 64 20 69 6e 20 24 74 68 65 73 65 74 20 20  rid in $theset  
a460: 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63        -- Restric
a470: 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f  t to revisions o
a480: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20  f interest..    
a490: 41 4e 44 20 20 20 20 54 2e 72 65 76 20 3d 20 52  AND    T.rev = R
a4a0: 2e 72 69 64 09 20 20 20 2d 2d 20 53 65 6c 65 63  .rid.   -- Selec
a4b0: 74 20 74 61 67 73 20 61 74 74 61 63 68 65 64 20  t tags attached 
a4c0: 74 6f 20 74 68 65 6d 0a 20 20 20 20 20 20 20 20  to them.        
a4d0: 20 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69      AND    CI.ii
a4e0: 64 20 3d 20 54 2e 74 69 64 20 20 20 20 20 20 20  d = T.tid       
a4f0: 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 61 6c 6c     -- Select all
a500: 20 63 68 61 6e 67 65 73 65 74 73 0a 20 20 20 20   changesets.    
a510: 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43          AND    C
a520: 2e 63 69 64 20 3d 20 43 49 2e 63 69 64 09 20 20  .cid = CI.cid.  
a530: 20 2d 2d 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74   -- containing t
a540: 68 65 20 74 61 67 73 0a 20 20 20 20 20 20 20 20  he tags.        
a550: 20 20 20 20 41 4e 44 20 20 20 20 43 2e 74 79 70      AND    C.typ
a560: 65 20 3d 20 31 09 09 20 20 20 2d 2d 20 77 68 69  e = 1..   -- whi
a570: 63 68 20 61 72 65 20 74 61 67 20 63 68 61 6e 67  ch are tag chang
a580: 65 73 65 74 73 0a 20 20 20 20 55 4e 49 4f 4e 0a  esets.    UNION.
a590: 09 20 20 20 20 53 45 4c 45 43 54 20 43 2e 63 69  .    SELECT C.ci
a5a0: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65  d..    FROM   re
a5b0: 76 69 73 69 6f 6e 20 52 2c 20 62 72 61 6e 63 68  vision R, branch
a5c0: 20 42 2c 20 63 73 69 74 65 6d 20 43 49 2c 20 63   B, csitem CI, c
a5d0: 68 61 6e 67 65 73 65 74 20 43 0a 09 20 20 20 20  hangeset C..    
a5e0: 57 48 45 52 45 20 20 52 2e 72 69 64 20 69 6e 20  WHERE  R.rid in 
a5f0: 24 74 68 65 73 65 74 20 20 20 20 20 20 20 20 2d  $theset        -
a600: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65  - Restrict to re
a610: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72  visions of inter
a620: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  est..    AND    
a630: 42 2e 72 6f 6f 74 20 3d 20 52 2e 72 69 64 09 20  B.root = R.rid. 
a640: 20 20 2d 2d 20 53 65 6c 65 63 74 20 62 72 61 6e    -- Select bran
a650: 63 68 65 73 20 61 74 74 61 63 68 65 64 20 74 6f  ches attached to
a660: 20 74 68 65 6d 0a 20 20 20 20 20 20 20 20 20 20   them.          
a670: 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69 64 20    AND    CI.iid 
a680: 3d 20 42 2e 62 69 64 20 20 20 20 20 20 20 20 20  = B.bid         
a690: 20 2d 2d 20 53 65 6c 65 63 74 20 61 6c 6c 20 63   -- Select all c
a6a0: 68 61 6e 67 65 73 65 74 73 0a 20 20 20 20 20 20  hangesets.      
a6b0: 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e 63        AND    C.c
a6c0: 69 64 20 3d 20 43 49 2e 63 69 64 09 20 20 20 2d  id = CI.cid.   -
a6d0: 2d 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  - containing the
a6e0: 20 62 72 61 6e 63 68 65 73 0a 20 20 20 20 20 20   branches.      
a6f0: 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e 74        AND    C.t
a700: 79 70 65 20 3d 20 32 09 09 20 20 20 2d 2d 20 77  ype = 2..   -- w
a710: 68 69 63 68 20 61 72 65 20 62 72 61 6e 63 68 20  hich are branch 
a720: 63 68 61 6e 67 65 73 65 74 73 0a 09 7d 5d 5d 0a  changesets..}]].
a730: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73      }..    # res
a740: 75 6c 74 20 3d 20 73 79 6d 62 6f 6c 20 6e 61 6d  ult = symbol nam
a750: 65 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  e.    typemethod
a760: 20 63 73 5f 6c 6f 64 20 7b 72 65 76 69 73 69 6f   cs_lod {revisio
a770: 6e 73 7d 20 7b 0a 09 23 20 44 65 74 65 72 6d 69  ns} {..# Determi
a780: 6e 65 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  nes the name of 
a790: 74 68 65 20 73 79 6d 62 6f 6c 20 77 68 69 63 68  the symbol which
a7a0: 20 69 73 20 74 68 65 20 6c 69 6e 65 20 6f 66 0a   is the line of.
a7b0: 09 23 20 64 65 76 65 6c 6f 70 6d 65 6e 74 20 66  .# development f
a7c0: 6f 72 20 74 68 65 20 72 65 76 69 73 69 6f 6e 73  or the revisions
a7d0: 20 69 6e 20 61 20 63 68 61 6e 67 65 73 65 74 2e   in a changeset.
a7e0: 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27  ...set theset ('
a7f0: 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73  [join $revisions
a800: 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72   {','}]')..retur
a810: 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75  n [state run [su
a820: 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20  bst -nocommands 
a830: 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b  -nobackslashes {
a840: 0a 09 20 20 20 20 53 45 4c 45 43 54 0a 09 20 20  ..    SELECT..  
a850: 20 20 44 49 53 54 49 4e 43 54 20 4c 2e 6e 61 6d    DISTINCT L.nam
a860: 65 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65  e..    FROM   re
a870: 76 69 73 69 6f 6e 20 52 2c 20 73 79 6d 62 6f 6c  vision R, symbol
a880: 20 4c 0a 09 20 20 20 20 57 48 45 52 45 20 20 52   L..    WHERE  R
a890: 2e 72 69 64 20 69 6e 20 24 74 68 65 73 65 74 20  .rid in $theset 
a8a0: 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69         -- Restri
a8b0: 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20  ct to revisions 
a8c0: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20  of interest..   
a8d0: 20 41 4e 44 20 20 20 20 4c 2e 73 69 64 20 3d 20   AND    L.sid = 
a8e0: 52 2e 6c 6f 64 20 20 20 20 20 20 20 20 20 20 20  R.lod           
a8f0: 2d 2d 20 47 65 74 20 6c 6f 64 20 73 79 6d 62 6f  -- Get lod symbo
a900: 6c 20 6f 66 20 72 65 76 69 73 69 6f 6e 0a 09 7d  l of revision..}
a910: 5d 5d 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 20  ]].    }.}..# # 
a920: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
a930: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
a940: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
a950: 23 23 23 23 23 23 23 23 23 0a 23 23 20 48 65 6c  #########.## Hel
a960: 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 2e 20 43  per singleton. C
a970: 6f 6d 6d 61 6e 64 73 20 66 6f 72 20 74 61 67 20  ommands for tag 
a980: 73 79 6d 62 6f 6c 20 63 68 61 6e 67 65 73 65 74  symbol changeset
a990: 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20 3a  s...snit::type :
a9a0: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70  :vc::fossil::imp
a9b0: 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63  ort::cvs::projec
a9c0: 74 3a 3a 72 65 76 3a 3a 73 79 6d 3a 3a 74 61 67  t::rev::sym::tag
a9d0: 20 7b 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f   {.    typemetho
a9e0: 64 20 62 79 72 65 76 69 73 69 6f 6e 20 7b 7d 20  d byrevision {} 
a9f0: 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20 20  { return 0 }.   
aa00: 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 73 79   typemethod bysy
aa10: 6d 62 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 74 75  mbol   {} { retu
aa20: 72 6e 20 31 20 7d 0a 20 20 20 20 74 79 70 65 6d  rn 1 }.    typem
aa30: 65 74 68 6f 64 20 69 73 74 61 67 20 20 20 20 20  ethod istag     
aa40: 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d   {} { return 1 }
aa50: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
aa60: 69 73 62 72 61 6e 63 68 20 20 20 7b 7d 20 7b 20  isbranch   {} { 
aa70: 72 65 74 75 72 6e 20 30 20 7d 0a 0a 20 20 20 20  return 0 }..    
aa80: 74 79 70 65 6d 65 74 68 6f 64 20 73 74 72 20 7b  typemethod str {
aa90: 74 61 67 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a  tag} {..struct::
aaa0: 6c 69 73 74 20 61 73 73 69 67 6e 20 5b 73 74 61  list assign [sta
aab0: 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 53 45  te run {..    SE
aac0: 4c 45 43 54 20 53 2e 6e 61 6d 65 2c 20 46 2e 6e  LECT S.name, F.n
aad0: 61 6d 65 2c 20 50 2e 6e 61 6d 65 0a 09 20 20 20  ame, P.name..   
aae0: 20 46 52 4f 4d 20 20 20 74 61 67 20 54 2c 20 73   FROM   tag T, s
aaf0: 79 6d 62 6f 6c 20 53 2c 20 66 69 6c 65 20 46 2c  ymbol S, file F,
ab00: 20 70 72 6f 6a 65 63 74 20 50 0a 09 20 20 20 20   project P..    
ab10: 57 48 45 52 45 20 20 54 2e 74 69 64 20 3d 20 24  WHERE  T.tid = $
ab20: 74 61 67 20 20 20 2d 2d 20 46 69 6e 64 20 73 70  tag   -- Find sp
ab30: 65 63 69 66 69 65 64 20 74 61 67 0a 09 20 20 20  ecified tag..   
ab40: 20 41 4e 44 20 20 20 20 46 2e 66 69 64 20 3d 20   AND    F.fid = 
ab50: 54 2e 66 69 64 20 20 2d 2d 20 47 65 74 20 66 69  T.fid  -- Get fi
ab60: 6c 65 20 6f 66 20 74 61 67 0a 09 20 20 20 20 41  le of tag..    A
ab70: 4e 44 20 20 20 20 50 2e 70 69 64 20 3d 20 46 2e  ND    P.pid = F.
ab80: 70 69 64 20 20 2d 2d 20 47 65 74 20 70 72 6f 6a  pid  -- Get proj
ab90: 65 63 74 20 6f 66 20 66 69 6c 65 0a 09 20 20 20  ect of file..   
aba0: 20 41 4e 44 20 20 20 20 53 2e 73 69 64 20 3d 20   AND    S.sid = 
abb0: 54 2e 73 69 64 20 20 2d 2d 20 47 65 74 20 73 79  T.sid  -- Get sy
abc0: 6d 62 6f 6c 20 6f 66 20 74 61 67 0a 09 7d 5d 20  mbol of tag..}] 
abd0: 73 6e 61 6d 65 20 66 6e 61 6d 65 20 70 6e 61 6d  sname fname pnam
abe0: 65 0a 09 72 65 74 75 72 6e 20 22 24 70 6e 61 6d  e..return "$pnam
abf0: 65 2f 54 27 24 7b 73 6e 61 6d 65 7d 27 3a 3a 24  e/T'${sname}'::$
ac00: 66 6e 61 6d 65 22 0a 20 20 20 20 7d 0a 0a 20 20  fname".    }..  
ac10: 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73    # result = lis
ac20: 74 20 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74  t (mintime, maxt
ac30: 69 6d 65 29 0a 20 20 20 20 74 79 70 65 6d 65 74  ime).    typemet
ac40: 68 6f 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 74  hod timerange {t
ac50: 61 67 73 7d 20 7b 0a 09 23 20 54 68 65 20 72 61  ags} {..# The ra
ac60: 6e 67 65 20 69 73 20 64 65 66 69 6e 65 64 20 61  nge is defined a
ac70: 73 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 74  s the range of t
ac80: 68 65 20 72 65 76 69 73 69 6f 6e 73 20 74 68 65  he revisions the
ac90: 20 74 61 67 73 0a 09 23 20 61 72 65 20 61 74 74   tags..# are att
aca0: 61 63 68 65 64 20 74 6f 2e 0a 0a 09 73 65 74 20  ached to....set 
acb0: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24  theset ('[join $
acc0: 74 61 67 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72  tags {','}]')..r
acd0: 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e  eturn [state run
ace0: 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61   [subst -nocomma
acf0: 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68  nds -nobackslash
ad00: 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54  es {..    SELECT
ad10: 20 4d 49 4e 28 52 2e 64 61 74 65 29 2c 20 4d 41   MIN(R.date), MA
ad20: 58 28 52 2e 64 61 74 65 29 0a 09 20 20 20 20 46  X(R.date)..    F
ad30: 52 4f 4d 20 20 20 74 61 67 20 54 2c 20 72 65 76  ROM   tag T, rev
ad40: 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45  ision R..    WHE
ad50: 52 45 20 20 54 2e 74 69 64 20 49 4e 20 24 74 68  RE  T.tid IN $th
ad60: 65 73 65 74 20 20 2d 2d 20 52 65 73 74 72 69 63  eset  -- Restric
ad70: 74 20 74 6f 20 74 61 67 73 20 6f 66 20 69 6e 74  t to tags of int
ad80: 65 72 65 73 74 0a 20 20 20 20 20 20 20 20 20 20  erest.          
ad90: 20 20 41 4e 44 20 20 20 20 52 2e 72 69 64 20 3d    AND    R.rid =
ada0: 20 54 2e 72 65 76 20 20 20 20 20 2d 2d 20 53 65   T.rev     -- Se
adb0: 6c 65 63 74 20 74 61 67 20 70 61 72 65 6e 74 20  lect tag parent 
adc0: 72 65 76 69 73 69 6f 6e 73 0a 09 7d 5d 5d 0a 20  revisions..}]]. 
add0: 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28     }..    # var(
ade0: 64 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d  dv) = dict (item
adf0: 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29   -> list (item))
ae00: 2c 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28  , item  = list (
ae10: 74 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 70  type id).    typ
ae20: 65 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f  emethod successo
ae30: 72 73 20 7b 64 76 20 74 61 67 73 7d 20 7b 0a 09  rs {dv tags} {..
ae40: 23 20 54 61 67 73 20 68 61 76 65 20 6e 6f 20 73  # Tags have no s
ae50: 75 63 63 65 73 73 6f 72 73 2e 0a 09 72 65 74 75  uccessors...retu
ae60: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  rn.    }..    # 
ae70: 72 65 73 75 6c 74 20 3d 20 34 2d 6c 69 73 74 20  result = 4-list 
ae80: 28 69 74 65 6d 74 79 70 65 20 69 74 65 6d 69 64  (itemtype itemid
ae90: 20 6e 65 78 74 69 74 65 6d 74 79 70 65 20 6e 65   nextitemtype ne
aea0: 78 74 69 74 65 6d 69 64 20 2e 2e 2e 29 0a 20 20  xtitemid ...).  
aeb0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c 6f 6f    typemethod loo
aec0: 70 73 20 7b 74 61 67 73 7d 20 7b 0a 09 23 20 54  ps {tags} {..# T
aed0: 61 67 73 20 68 61 76 65 20 6e 6f 20 73 75 63 63  ags have no succ
aee0: 65 73 73 6f 72 73 2c 20 74 68 65 72 65 66 6f 72  essors, therefor
aef0: 65 20 63 61 6e 6e 6f 74 20 63 61 75 73 65 20 6c  e cannot cause l
af00: 6f 6f 70 73 0a 09 72 65 74 75 72 6e 20 7b 7d 0a  oops..return {}.
af10: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73      }..    # res
af20: 75 6c 74 20 3d 20 6c 69 73 74 20 28 63 68 61 6e  ult = list (chan
af30: 67 65 73 65 74 2d 69 64 29 0a 20 20 20 20 74 79  geset-id).    ty
af40: 70 65 6d 65 74 68 6f 64 20 63 73 5f 73 75 63 63  pemethod cs_succ
af50: 65 73 73 6f 72 73 20 7b 74 61 67 73 7d 20 7b 0a  essors {tags} {.
af60: 09 23 20 54 61 67 73 20 68 61 76 65 20 6e 6f 20  .# Tags have no 
af70: 73 75 63 63 65 73 73 6f 72 73 2e 0a 09 72 65 74  successors...ret
af80: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  urn.    }..    #
af90: 20 72 65 73 75 6c 74 20 3d 20 73 79 6d 62 6f 6c   result = symbol
afa0: 20 6e 61 6d 65 0a 20 20 20 20 74 79 70 65 6d 65   name.    typeme
afb0: 74 68 6f 64 20 63 73 5f 6c 6f 64 20 7b 74 61 67  thod cs_lod {tag
afc0: 73 7d 20 7b 0a 09 23 20 44 65 74 65 72 6d 69 6e  s} {..# Determin
afd0: 65 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  es the name of t
afe0: 68 65 20 73 79 6d 62 6f 6c 20 77 68 69 63 68 20  he symbol which 
aff0: 69 73 20 74 68 65 20 6c 69 6e 65 20 6f 66 0a 09  is the line of..
b000: 23 20 64 65 76 65 6c 6f 70 6d 65 6e 74 20 66 6f  # development fo
b010: 72 20 74 68 65 20 74 61 67 73 20 69 6e 20 61 20  r the tags in a 
b020: 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 73 65 74  changeset....set
b030: 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20   theset ('[join 
b040: 24 74 61 67 73 20 7b 27 2c 27 7d 5d 27 29 0a 09  $tags {','}]')..
b050: 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75  return [state ru
b060: 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d  n [subst -nocomm
b070: 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73  ands -nobackslas
b080: 68 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45 43  hes {..    SELEC
b090: 54 0a 09 20 20 20 20 44 49 53 54 49 4e 43 54 20  T..    DISTINCT 
b0a0: 4c 2e 6e 61 6d 65 0a 09 20 20 20 20 46 52 4f 4d  L.name..    FROM
b0b0: 20 20 20 74 61 67 20 54 2c 20 73 79 6d 62 6f 6c     tag T, symbol
b0c0: 20 4c 0a 09 20 20 20 20 57 48 45 52 45 20 20 54   L..    WHERE  T
b0d0: 2e 74 69 64 20 69 6e 20 24 74 68 65 73 65 74 20  .tid in $theset 
b0e0: 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69         -- Restri
b0f0: 63 74 20 74 6f 20 74 61 67 73 20 6f 66 20 69 6e  ct to tags of in
b100: 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20  terest..    AND 
b110: 20 20 20 4c 2e 73 69 64 20 3d 20 54 2e 6c 6f 64     L.sid = T.lod
b120: 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20 47 65             -- Ge
b130: 74 20 6c 6f 64 20 73 79 6d 62 6f 6c 20 6f 66 20  t lod symbol of 
b140: 74 61 67 0a 09 7d 5d 5d 0a 20 20 20 20 7d 0a 7d  tag..}]].    }.}
b150: 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23  ..# # ## ### ###
b160: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23  ## ######## ####
b170: 23 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23  ######### ######
b180: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  ###############.
b190: 23 23 20 48 65 6c 70 65 72 20 73 69 6e 67 6c 65  ## Helper single
b1a0: 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20 66 6f  ton. Commands fo
b1b0: 72 20 62 72 61 6e 63 68 20 73 79 6d 62 6f 6c 20  r branch symbol 
b1c0: 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e 69  changesets...sni
b1d0: 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f  t::type ::vc::fo
b1e0: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
b1f0: 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a  s::project::rev:
b200: 3a 73 79 6d 3a 3a 62 72 61 6e 63 68 20 7b 0a 20  :sym::branch {. 
b210: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79     typemethod by
b220: 72 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65  revision {} { re
b230: 74 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70  turn 0 }.    typ
b240: 65 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c  emethod bysymbol
b250: 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31     {} { return 1
b260: 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f   }.    typemetho
b270: 64 20 69 73 74 61 67 20 20 20 20 20 20 7b 7d 20  d istag      {} 
b280: 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20 20  { return 0 }.   
b290: 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73 62 72   typemethod isbr
b2a0: 61 6e 63 68 20 20 20 7b 7d 20 7b 20 72 65 74 75  anch   {} { retu
b2b0: 72 6e 20 31 20 7d 0a 0a 20 20 20 20 74 79 70 65  rn 1 }..    type
b2c0: 6d 65 74 68 6f 64 20 73 74 72 20 7b 62 72 61 6e  method str {bran
b2d0: 63 68 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c  ch} {..struct::l
b2e0: 69 73 74 20 61 73 73 69 67 6e 20 5b 73 74 61 74  ist assign [stat
b2f0: 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c  e run {..    SEL
b300: 45 43 54 20 53 2e 6e 61 6d 65 2c 20 46 2e 6e 61  ECT S.name, F.na
b310: 6d 65 2c 20 50 2e 6e 61 6d 65 0a 09 20 20 20 20  me, P.name..    
b320: 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c  FROM   branch B,
b330: 20 73 79 6d 62 6f 6c 20 53 2c 20 66 69 6c 65 20   symbol S, file 
b340: 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09 20 20  F, project P..  
b350: 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 3d    WHERE  B.bid =
b360: 20 24 62 72 61 6e 63 68 20 20 2d 2d 20 46 69 6e   $branch  -- Fin
b370: 64 20 73 70 65 63 69 66 69 65 64 20 62 72 61 6e  d specified bran
b380: 63 68 0a 09 20 20 20 20 41 4e 44 20 20 20 20 46  ch..    AND    F
b390: 2e 66 69 64 20 3d 20 42 2e 66 69 64 20 20 20 20  .fid = B.fid    
b3a0: 2d 2d 20 47 65 74 20 66 69 6c 65 20 6f 66 20 62  -- Get file of b
b3b0: 72 61 6e 63 68 0a 09 20 20 20 20 41 4e 44 20 20  ranch..    AND  
b3c0: 20 20 50 2e 70 69 64 20 3d 20 46 2e 70 69 64 20    P.pid = F.pid 
b3d0: 20 20 20 2d 2d 20 47 65 74 20 70 72 6f 6a 65 63     -- Get projec
b3e0: 74 20 6f 66 20 66 69 6c 65 0a 09 20 20 20 20 41  t of file..    A
b3f0: 4e 44 20 20 20 20 53 2e 73 69 64 20 3d 20 42 2e  ND    S.sid = B.
b400: 73 69 64 20 20 20 20 2d 2d 20 47 65 74 20 73 79  sid    -- Get sy
b410: 6d 62 6f 6c 20 6f 66 20 62 72 61 6e 63 68 0a 09  mbol of branch..
b420: 7d 5d 20 73 6e 61 6d 65 20 66 6e 61 6d 65 20 70  }] sname fname p
b430: 6e 61 6d 65 0a 09 72 65 74 75 72 6e 20 22 24 70  name..return "$p
b440: 6e 61 6d 65 2f 42 27 24 7b 73 6e 61 6d 65 7d 27  name/B'${sname}'
b450: 3a 3a 24 66 6e 61 6d 65 22 0a 20 20 20 20 7d 0a  ::$fname".    }.
b460: 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20  .    # result = 
b470: 6c 69 73 74 20 28 6d 69 6e 74 69 6d 65 2c 20 6d  list (mintime, m
b480: 61 78 74 69 6d 65 29 0a 20 20 20 20 74 79 70 65  axtime).    type
b490: 6d 65 74 68 6f 64 20 74 69 6d 65 72 61 6e 67 65  method timerange
b4a0: 20 7b 62 72 61 6e 63 68 65 73 7d 20 7b 0a 09 23   {branches} {..#
b4b0: 20 54 68 65 20 72 61 6e 67 65 20 6f 66 20 61 20   The range of a 
b4c0: 62 72 61 6e 63 68 20 69 73 20 64 65 66 69 6e 65  branch is define
b4d0: 64 20 61 73 20 74 68 65 20 72 61 6e 67 65 20 6f  d as the range o
b4e0: 66 20 74 68 65 0a 09 23 20 72 65 76 69 73 69 6f  f the..# revisio
b4f0: 6e 73 20 74 68 65 20 62 72 61 6e 63 68 65 73 20  ns the branches 
b500: 61 72 65 20 73 70 61 77 6e 65 64 20 62 79 2e 20  are spawned by. 
b510: 4e 4f 54 45 20 68 6f 77 65 76 65 72 20 74 68 61  NOTE however tha
b520: 74 20 74 68 65 0a 09 23 20 62 72 61 6e 63 68 65  t the..# branche
b530: 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  s associated wit
b540: 68 20 61 20 64 65 74 61 63 68 65 64 20 4e 54 44  h a detached NTD
b550: 42 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20 72  B will have no r
b560: 6f 6f 74 0a 09 23 20 73 70 61 77 6e 69 6e 67 20  oot..# spawning 
b570: 74 68 65 6d 2c 20 68 65 6e 63 65 20 74 68 65 79  them, hence they
b580: 20 68 61 76 65 20 6e 6f 20 72 65 61 6c 20 74 69   have no real ti
b590: 6d 65 72 61 6e 67 65 20 61 6e 79 0a 09 23 20 6c  merange any..# l
b5a0: 6f 6e 67 65 72 2e 20 42 79 20 75 73 69 6e 67 20  onger. By using 
b5b0: 30 20 77 65 20 70 75 74 20 74 68 65 6d 20 69 6e  0 we put them in
b5c0: 20 66 72 6f 6e 74 20 6f 66 20 65 76 65 72 79 74   front of everyt
b5d0: 68 69 6e 67 20 65 6c 73 65 2c 0a 09 23 20 61 73  hing else,..# as
b5e0: 20 74 68 65 79 20 6c 6f 67 69 63 61 6c 6c 79 20   they logically 
b5f0: 61 72 65 2e 0a 0a 09 73 65 74 20 74 68 65 73 65  are....set these
b600: 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61 6e 63  t ('[join $branc
b610: 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65  hes {','}]')..re
b620: 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20  turn [state run 
b630: 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e  [subst -nocomman
b640: 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65  ds -nobackslashe
b650: 73 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20  s {..    SELECT 
b660: 49 46 4e 55 4c 4c 28 4d 49 4e 28 52 2e 64 61 74  IFNULL(MIN(R.dat
b670: 65 29 2c 30 29 2c 20 49 46 4e 55 4c 4c 28 4d 41  e),0), IFNULL(MA
b680: 58 28 52 2e 64 61 74 65 29 2c 30 29 0a 09 20 20  X(R.date),0)..  
b690: 20 20 46 52 4f 4d 20 20 62 72 61 6e 63 68 20 42    FROM  branch B
b6a0: 2c 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20  , revision R..  
b6b0: 20 20 57 48 45 52 45 20 42 2e 62 69 64 20 49 4e    WHERE B.bid IN
b6c0: 20 24 74 68 65 73 65 74 20 20 20 2d 2d 20 52 65   $theset   -- Re
b6d0: 73 74 72 69 63 74 20 74 6f 20 62 72 61 6e 63 68  strict to branch
b6e0: 65 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 20  es of interest. 
b6f0: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20             AND  
b700: 20 52 2e 72 69 64 20 3d 20 42 2e 72 6f 6f 74 20   R.rid = B.root 
b710: 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 62 72      -- Select br
b720: 61 6e 63 68 20 70 61 72 65 6e 74 20 72 65 76 69  anch parent revi
b730: 73 69 6f 6e 73 0a 09 7d 5d 5d 0a 20 20 20 20 7d  sions..}]].    }
b740: 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d  ..    # result =
b750: 20 34 2d 6c 69 73 74 20 28 69 74 65 6d 74 79 70   4-list (itemtyp
b760: 65 20 69 74 65 6d 69 64 20 6e 65 78 74 69 74 65  e itemid nextite
b770: 6d 74 79 70 65 20 6e 65 78 74 69 74 65 6d 69 64  mtype nextitemid
b780: 20 2e 2e 2e 29 0a 20 20 20 20 74 79 70 65 6d 65   ...).    typeme
b790: 74 68 6f 64 20 6c 6f 6f 70 73 20 7b 62 72 61 6e  thod loops {bran
b7a0: 63 68 65 73 7d 20 7b 0a 09 23 20 4e 6f 74 65 3a  ches} {..# Note:
b7b0: 20 52 65 76 69 73 69 6f 6e 73 20 61 6e 64 20 74   Revisions and t
b7c0: 61 67 73 20 63 61 6e 6e 6f 74 20 63 61 75 73 65  ags cannot cause
b7d0: 20 74 68 65 20 6c 6f 6f 70 2e 20 42 65 69 6e 67   the loop. Being
b7e0: 20 6f 66 20 61 0a 09 23 20 66 75 6e 64 61 6d 65   of a..# fundame
b7f0: 6e 74 61 6c 6c 79 20 64 69 66 66 65 72 65 6e 74  ntally different
b800: 20 74 79 70 65 20 74 68 65 79 20 63 61 6e 6e 6f   type they canno
b810: 74 20 62 65 20 69 6e 20 74 68 65 20 69 6e 63 6f  t be in the inco
b820: 6d 69 6e 67 0a 09 23 20 73 65 74 20 6f 66 20 69  ming..# set of i
b830: 64 73 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74  ds....set theset
b840: 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61 6e 63 68   ('[join $branch
b850: 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74  es {','}]')..ret
b860: 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 5b  urn [state run [
b870: 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64  subst -nocommand
b880: 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73  s -nobackslashes
b890: 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42   {..    SELECT B
b8a0: 2e 62 69 64 2c 20 42 58 2e 62 69 64 0a 09 20 20  .bid, BX.bid..  
b8b0: 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20    FROM   branch 
b8c0: 42 2c 20 70 72 65 66 65 72 65 64 70 61 72 65 6e  B, preferedparen
b8d0: 74 20 50 2c 20 62 72 61 6e 63 68 20 42 58 0a 09  t P, branch BX..
b8e0: 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 64      WHERE  B.bid
b8f0: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 2d 2d   IN $theset   --
b900: 20 52 65 73 74 72 69 63 74 20 74 6f 20 62 72 61   Restrict to bra
b910: 6e 63 68 65 73 20 6f 66 20 69 6e 74 65 72 65 73  nches of interes
b920: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e  t..    AND    B.
b930: 73 69 64 20 3d 20 50 2e 70 69 64 20 20 20 20 20  sid = P.pid     
b940: 20 2d 2d 20 47 65 74 20 74 68 65 20 70 72 65 66   -- Get the pref
b950: 65 72 65 64 20 62 72 61 6e 63 68 65 73 20 76 69  ered branches vi
b960: 61 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 58  a..    AND    BX
b970: 2e 73 69 64 20 3d 20 50 2e 73 69 64 20 20 20 20  .sid = P.sid    
b980: 20 2d 2d 20 74 68 65 20 62 72 61 6e 63 68 20 73   -- the branch s
b990: 79 6d 62 6f 6c 73 0a 09 20 20 20 20 41 4e 44 20  ymbols..    AND 
b9a0: 20 20 20 42 58 2e 62 69 64 20 49 4e 20 24 74 68     BX.bid IN $th
b9b0: 65 73 65 74 20 20 2d 2d 20 4c 6f 6f 70 0a 09 7d  eset  -- Loop..}
b9c0: 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  ]].    }..    # 
b9d0: 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20 28  var(dv) = dict (
b9e0: 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74  item -> list (it
b9f0: 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c 69  em)), item  = li
ba00: 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 20 20  st (type id).   
ba10: 20 74 79 70 65 6d 65 74 68 6f 64 20 73 75 63 63   typemethod succ
ba20: 65 73 73 6f 72 73 20 7b 64 76 20 62 72 61 6e 63  essors {dv branc
ba30: 68 65 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20  hes} {..upvar 1 
ba40: 24 64 76 20 64 65 70 65 6e 64 65 6e 63 69 65 73  $dv dependencies
ba50: 0a 09 23 20 54 68 65 20 66 69 72 73 74 20 72 65  ..# The first re
ba60: 76 69 73 69 6f 6e 20 63 6f 6d 6d 69 74 74 65 64  vision committed
ba70: 20 6f 6e 20 61 20 62 72 61 6e 63 68 2c 20 61 6e   on a branch, an
ba80: 64 20 61 6c 6c 20 62 72 61 6e 63 68 65 73 0a 09  d all branches..
ba90: 23 20 61 6e 64 20 74 61 67 73 20 77 68 69 63 68  # and tags which
baa0: 20 68 61 76 65 20 69 74 20 61 73 20 74 68 65 69   have it as thei
bab0: 72 20 70 72 65 66 65 72 65 64 20 70 61 72 65 6e  r prefered paren
bac0: 74 20 61 72 65 20 74 68 65 0a 09 23 20 73 75 63  t are the..# suc
bad0: 63 65 73 73 6f 72 73 20 6f 66 20 61 20 62 72 61  cessors of a bra
bae0: 6e 63 68 2e 0a 0a 09 73 65 74 20 74 68 65 73 65  nch....set these
baf0: 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61 6e 63  t ('[join $branc
bb00: 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 66 6f  hes {','}]')..fo
bb10: 72 65 61 63 68 20 7b 62 69 64 20 63 68 69 6c 64  reach {bid child
bb20: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75  } [state run [su
bb30: 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20  bst -nocommands 
bb40: 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b  -nobackslashes {
bb50: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62  ..    SELECT B.b
bb60: 69 64 2c 20 52 2e 72 69 64 0a 09 20 20 20 20 46  id, R.rid..    F
bb70: 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20  ROM   branch B, 
bb80: 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20  revision R..    
bb90: 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20  WHERE  B.bid IN 
bba0: 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52  $theset     -- R
bbb0: 65 73 74 72 69 63 74 20 74 6f 20 62 72 61 6e 63  estrict to branc
bbc0: 68 65 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  hes of interest.
bbd0: 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 66 69  .    AND    B.fi
bbe0: 72 73 74 20 3d 20 52 2e 72 69 64 20 20 20 20 20  rst = R.rid     
bbf0: 20 2d 2d 20 47 65 74 20 66 69 72 73 74 20 72 65   -- Get first re
bc00: 76 69 73 69 6f 6e 20 6f 6e 20 74 68 65 20 62 72  vision on the br
bc10: 61 6e 63 68 0a 09 7d 5d 5d 20 7b 0a 09 20 20 20  anch..}]] {..   
bc20: 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65   lappend depende
bc30: 6e 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a  ncies([list sym:
bc40: 3a 62 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b  :branch $bid]) [
bc50: 6c 69 73 74 20 72 65 76 20 24 63 68 69 6c 64 5d  list rev $child]
bc60: 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62 69  ..}..foreach {bi
bc70: 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20  d child} [state 
bc80: 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f  run [subst -noco
bc90: 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c  mmands -nobacksl
bca0: 61 73 68 65 73 20 7b 0a 09 20 20 20 20 53 45 4c  ashes {..    SEL
bcb0: 45 43 54 20 42 2e 62 69 64 2c 20 42 58 2e 62 69  ECT B.bid, BX.bi
bcc0: 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72  d..    FROM   br
bcd0: 61 6e 63 68 20 42 2c 20 70 72 65 66 65 72 65 64  anch B, prefered
bce0: 70 61 72 65 6e 74 20 50 2c 20 62 72 61 6e 63 68  parent P, branch
bcf0: 20 42 58 0a 09 20 20 20 20 57 48 45 52 45 20 20   BX..    WHERE  
bd00: 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65 74  B.bid IN $theset
bd10: 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74       -- Restrict
bd20: 20 74 6f 20 62 72 61 6e 63 68 65 73 20 6f 66 20   to branches of 
bd30: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e  interest..    AN
bd40: 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50 2e 70  D    B.sid = P.p
bd50: 69 64 20 20 20 20 20 20 20 20 2d 2d 20 47 65 74  id        -- Get
bd60: 20 73 75 62 6f 72 64 69 6e 61 74 65 20 62 72 61   subordinate bra
bd70: 6e 63 68 65 73 20 76 69 61 20 74 68 65 0a 09 20  nches via the.. 
bd80: 20 20 20 41 4e 44 20 20 20 20 42 58 2e 73 69 64     AND    BX.sid
bd90: 20 3d 20 50 2e 73 69 64 20 20 20 20 20 20 20 2d   = P.sid       -
bda0: 2d 20 70 72 65 66 65 72 65 64 20 70 61 72 65 6e  - prefered paren
bdb0: 74 73 20 6f 66 20 74 68 65 69 72 20 73 79 6d 62  ts of their symb
bdc0: 6f 6c 73 0a 09 7d 5d 5d 20 7b 0a 09 20 20 20 20  ols..}]] {..    
bdd0: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e  lappend dependen
bde0: 63 69 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a  cies([list sym::
bdf0: 62 72 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c  branch $bid]) [l
be00: 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20  ist sym::branch 
be10: 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65  $child]..}..fore
be20: 61 63 68 20 7b 62 69 64 20 63 68 69 6c 64 7d 20  ach {bid child} 
be30: 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73  [state run [subs
be40: 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e  t -nocommands -n
be50: 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09  obackslashes {..
be60: 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62 69 64      SELECT B.bid
be70: 2c 20 54 2e 74 69 64 0a 09 20 20 20 20 46 52 4f  , T.tid..    FRO
be80: 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20 70 72  M   branch B, pr
be90: 65 66 65 72 65 64 70 61 72 65 6e 74 20 50 2c 20  eferedparent P, 
bea0: 74 61 67 20 54 0a 09 20 20 20 20 57 48 45 52 45  tag T..    WHERE
beb0: 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73    B.bid IN $thes
bec0: 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69  et     -- Restri
bed0: 63 74 20 74 6f 20 62 72 61 6e 63 68 65 73 20 6f  ct to branches o
bee0: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20  f interest..    
bef0: 41 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50  AND    B.sid = P
bf00: 2e 70 69 64 20 20 20 20 20 20 20 20 2d 2d 20 47  .pid        -- G
bf10: 65 74 20 73 75 62 6f 72 64 69 6e 61 74 65 20 74  et subordinate t
bf20: 61 67 73 20 76 69 61 20 74 68 65 0a 09 20 20 20  ags via the..   
bf30: 20 41 4e 44 20 20 20 20 54 2e 73 69 64 20 3d 20   AND    T.sid = 
bf40: 50 2e 73 69 64 20 20 20 20 20 20 20 20 2d 2d 20  P.sid        -- 
bf50: 70 72 65 66 65 72 65 64 20 70 61 72 65 6e 74 73  prefered parents
bf60: 20 6f 66 20 74 68 65 69 72 20 73 79 6d 62 6f 6c   of their symbol
bf70: 73 0a 09 7d 5d 5d 20 7b 0a 09 20 20 20 20 6c 61  s..}]] {..    la
bf80: 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69  ppend dependenci
bf90: 65 73 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72  es([list sym::br
bfa0: 61 6e 63 68 20 24 62 69 64 5d 29 20 5b 6c 69 73  anch $bid]) [lis
bfb0: 74 20 73 79 6d 3a 3a 74 61 67 20 24 63 68 69 6c  t sym::tag $chil
bfc0: 64 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20  d]..}..return.  
bfd0: 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c    }..    # resul
bfe0: 74 20 3d 20 6c 69 73 74 20 28 63 68 61 6e 67 65  t = list (change
bff0: 73 65 74 2d 69 64 29 0a 20 20 20 20 74 79 70 65  set-id).    type
c000: 6d 65 74 68 6f 64 20 63 73 5f 73 75 63 63 65 73  method cs_succes
c010: 73 6f 72 73 20 7b 62 72 61 6e 63 68 65 73 7d 20  sors {branches} 
c020: 7b 0a 20 20 20 20 20 20 20 20 23 20 54 68 69 73  {.        # This
c030: 20 69 73 20 61 20 76 61 72 69 61 6e 74 20 6f 66   is a variant of
c040: 20 27 73 75 63 63 65 73 73 6f 72 73 27 20 77 68   'successors' wh
c050: 69 63 68 20 6d 61 70 73 20 74 68 65 20 6c 6f 77  ich maps the low
c060: 2d 6c 65 76 65 6c 0a 20 20 20 20 20 20 20 20 23  -level.        #
c070: 20 64 61 74 61 20 64 69 72 65 63 74 6c 79 20 74   data directly t
c080: 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  o the associated
c090: 20 63 68 61 6e 67 65 73 65 74 73 2e 20 49 2e 65   changesets. I.e
c0a0: 2e 20 69 6e 73 74 65 61 64 0a 20 20 20 20 20 20  . instead.      
c0b0: 20 20 23 20 6d 69 6c 6c 69 6f 6e 73 20 6f 66 20    # millions of 
c0c0: 64 65 70 65 6e 64 65 6e 63 79 20 70 61 69 72 73  dependency pairs
c0d0: 20 28 69 6e 20 65 78 74 72 65 6d 65 20 63 61 73   (in extreme cas
c0e0: 65 73 20 28 45 78 61 6d 70 6c 65 3a 20 54 63 6c  es (Example: Tcl
c0f0: 0a 20 20 20 20 20 20 20 20 23 20 43 56 53 29 29  .        # CVS))
c100: 20 77 65 20 72 65 74 75 72 6e 20 61 20 76 65 72   we return a ver
c110: 79 20 73 68 6f 72 74 20 61 6e 64 20 6d 75 63 68  y short and much
c120: 20 6d 6f 72 65 20 6d 61 6e 61 67 65 61 62 6c 65   more manageable
c130: 20 6c 69 73 74 0a 20 20 20 20 20 20 20 20 23 20   list.        # 
c140: 6f 66 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a  of changesets...
c150: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a  .set theset ('[j
c160: 6f 69 6e 20 24 62 72 61 6e 63 68 65 73 20 7b 27  oin $branches {'
c170: 2c 27 7d 5d 27 29 0a 20 20 20 20 20 20 20 20 72  ,'}]').        r
c180: 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e  eturn [state run
c190: 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61   [subst -nocomma
c1a0: 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68  nds -nobackslash
c1b0: 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54  es {..    SELECT
c1c0: 20 43 2e 63 69 64 0a 09 20 20 20 20 46 52 4f 4d   C.cid..    FROM
c1d0: 20 20 20 62 72 61 6e 63 68 20 42 2c 20 72 65 76     branch B, rev
c1e0: 69 73 69 6f 6e 20 52 2c 20 63 73 69 74 65 6d 20  ision R, csitem 
c1f0: 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43 0a  CI, changeset C.
c200: 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69  .    WHERE  B.bi
c210: 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20  d IN $theset    
c220: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
c230: 62 72 61 6e 63 68 65 73 20 6f 66 20 69 6e 74 65  branches of inte
c240: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
c250: 20 42 2e 66 69 72 73 74 20 3d 20 52 2e 72 69 64   B.first = R.rid
c260: 09 2d 2d 20 47 65 74 20 66 69 72 73 74 20 72 65  .-- Get first re
c270: 76 69 73 69 6f 6e 20 6f 6e 20 74 68 65 20 62 72  vision on the br
c280: 61 6e 63 68 0a 20 20 20 20 20 20 20 20 20 20 20  anch.           
c290: 20 41 4e 44 20 20 20 20 43 49 2e 69 69 64 20 3d   AND    CI.iid =
c2a0: 20 52 2e 72 69 64 20 20 20 20 20 20 20 2d 2d 20   R.rid       -- 
c2b0: 53 65 6c 65 63 74 20 61 6c 6c 20 63 68 61 6e 67  Select all chang
c2c0: 65 73 65 74 73 0a 20 20 20 20 20 20 20 20 20 20  esets.          
c2d0: 20 20 41 4e 44 20 20 20 20 43 2e 63 69 64 20 3d    AND    C.cid =
c2e0: 20 43 49 2e 63 69 64 09 2d 2d 20 63 6f 6e 74 61   CI.cid.-- conta
c2f0: 69 6e 69 6e 67 20 74 68 69 73 20 72 65 76 69 73  ining this revis
c300: 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ion.            
c310: 41 4e 44 20 20 20 20 43 2e 74 79 70 65 20 3d 20  AND    C.type = 
c320: 30 09 09 2d 2d 20 77 68 69 63 68 20 61 72 65 20  0..-- which are 
c330: 72 65 76 69 73 69 6f 6e 20 63 68 61 6e 67 65 73  revision changes
c340: 65 74 73 0a 20 20 20 20 55 4e 49 4f 4e 0a 09 20  ets.    UNION.. 
c350: 20 20 20 53 45 4c 45 43 54 20 43 2e 63 69 64 0a     SELECT C.cid.
c360: 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e  .    FROM   bran
c370: 63 68 20 42 2c 20 70 72 65 66 65 72 65 64 70 61  ch B, preferedpa
c380: 72 65 6e 74 20 50 2c 20 62 72 61 6e 63 68 20 42  rent P, branch B
c390: 58 2c 20 63 73 69 74 65 6d 20 43 49 2c 20 63 68  X, csitem CI, ch
c3a0: 61 6e 67 65 73 65 74 20 43 0a 09 20 20 20 20 57  angeset C..    W
c3b0: 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24  HERE  B.bid IN $
c3c0: 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65  theset     -- Re
c3d0: 73 74 72 69 63 74 20 74 6f 20 62 72 61 6e 63 68  strict to branch
c3e0: 65 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09  es of interest..
c3f0: 20 20 20 20 41 4e 44 20 20 20 20 42 2e 73 69 64      AND    B.sid
c400: 20 3d 20 50 2e 70 69 64 09 2d 2d 20 47 65 74 20   = P.pid.-- Get 
c410: 73 75 62 6f 72 64 69 6e 61 74 65 20 62 72 61 6e  subordinate bran
c420: 63 68 65 73 20 76 69 61 20 74 68 65 0a 09 20 20  ches via the..  
c430: 20 20 41 4e 44 20 20 20 20 42 58 2e 73 69 64 20    AND    BX.sid 
c440: 3d 20 50 2e 73 69 64 09 2d 2d 20 70 72 65 66 65  = P.sid.-- prefe
c450: 72 65 64 20 70 61 72 65 6e 74 73 20 6f 66 20 74  red parents of t
c460: 68 65 69 72 20 73 79 6d 62 6f 6c 73 0a 20 20 20  heir symbols.   
c470: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20           AND    
c480: 43 49 2e 69 69 64 20 3d 20 42 58 2e 62 69 64 20  CI.iid = BX.bid 
c490: 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 61       -- Select a
c4a0: 6c 6c 20 63 68 61 6e 67 65 73 65 74 73 0a 20 20  ll changesets.  
c4b0: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20            AND   
c4c0: 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69 64 09   C.cid = CI.cid.
c4d0: 2d 2d 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  -- containing th
c4e0: 65 20 73 75 62 6f 72 64 69 6e 61 74 65 20 62 72  e subordinate br
c4f0: 61 6e 63 68 65 73 0a 20 20 20 20 20 20 20 20 20  anches.         
c500: 20 20 20 41 4e 44 20 20 20 20 43 2e 74 79 70 65     AND    C.type
c510: 20 3d 20 32 09 09 2d 2d 20 77 68 69 63 68 20 61   = 2..-- which a
c520: 72 65 20 62 72 61 6e 63 68 20 63 68 61 6e 67 65  re branch change
c530: 73 65 74 73 0a 20 20 20 20 55 4e 49 4f 4e 0a 09  sets.    UNION..
c540: 20 20 20 20 53 45 4c 45 43 54 20 43 2e 63 69 64      SELECT C.cid
c550: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61  ..    FROM   bra
c560: 6e 63 68 20 42 2c 20 70 72 65 66 65 72 65 64 70  nch B, preferedp
c570: 61 72 65 6e 74 20 50 2c 20 74 61 67 20 54 2c 20  arent P, tag T, 
c580: 63 73 69 74 65 6d 20 43 49 2c 20 63 68 61 6e 67  csitem CI, chang
c590: 65 73 65 74 20 43 0a 09 20 20 20 20 57 48 45 52  eset C..    WHER
c5a0: 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65  E  B.bid IN $the
c5b0: 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72  set     -- Restr
c5c0: 69 63 74 20 74 6f 20 62 72 61 6e 63 68 65 73 20  ict to branches 
c5d0: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20  of interest..   
c5e0: 20 41 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20   AND    B.sid = 
c5f0: 50 2e 70 69 64 09 2d 2d 20 47 65 74 20 73 75 62  P.pid.-- Get sub
c600: 6f 72 64 69 6e 61 74 65 20 74 61 67 73 20 76 69  ordinate tags vi
c610: 61 20 74 68 65 0a 09 20 20 20 20 41 4e 44 20 20  a the..    AND  
c620: 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 69 64 09    T.sid = P.sid.
c630: 2d 2d 20 70 72 65 66 65 72 65 64 20 70 61 72 65  -- prefered pare
c640: 6e 74 73 20 6f 66 20 74 68 65 69 72 20 73 79 6d  nts of their sym
c650: 62 6f 6c 73 0a 20 20 20 20 20 20 20 20 20 20 20  bols.           
c660: 20 41 4e 44 20 20 20 20 43 49 2e 69 69 64 20 3d   AND    CI.iid =
c670: 20 54 2e 74 69 64 20 20 20 20 20 20 20 2d 2d 20   T.tid       -- 
c680: 53 65 6c 65 63 74 20 61 6c 6c 20 63 68 61 6e 67  Select all chang
c690: 65 73 65 74 73 0a 20 20 20 20 20 20 20 20 20 20  esets.          
c6a0: 20 20 41 4e 44 20 20 20 20 43 2e 63 69 64 20 3d    AND    C.cid =
c6b0: 20 43 49 2e 63 69 64 09 2d 2d 20 63 6f 6e 74 61   CI.cid.-- conta
c6c0: 69 6e 69 6e 67 20 74 68 65 20 73 75 62 6f 72 64  ining the subord
c6d0: 69 6e 61 74 65 20 74 61 67 73 0a 20 20 20 20 20  inate tags.     
c6e0: 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e         AND    C.
c6f0: 74 79 70 65 20 3d 20 31 09 09 2d 2d 20 77 68 69  type = 1..-- whi
c700: 63 68 20 61 72 65 20 74 61 67 20 63 68 61 6e 67  ch are tag chang
c710: 65 73 65 74 73 0a 09 7d 5d 5d 0a 09 72 65 74 75  esets..}]]..retu
c720: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  rn.    }..    # 
c730: 72 65 73 75 6c 74 20 3d 20 73 79 6d 62 6f 6c 20  result = symbol 
c740: 6e 61 6d 65 0a 20 20 20 20 74 79 70 65 6d 65 74  name.    typemet
c750: 68 6f 64 20 63 73 5f 6c 6f 64 20 7b 62 72 61 6e  hod cs_lod {bran
c760: 63 68 65 73 7d 20 7b 0a 09 23 20 44 65 74 65 72  ches} {..# Deter
c770: 6d 69 6e 65 73 20 74 68 65 20 6e 61 6d 65 20 6f  mines the name o
c780: 66 20 74 68 65 20 73 79 6d 62 6f 6c 20 77 68 69  f the symbol whi
c790: 63 68 20 69 73 20 74 68 65 20 6c 69 6e 65 20 6f  ch is the line o
c7a0: 66 0a 09 23 20 64 65 76 65 6c 6f 70 6d 65 6e 74  f..# development
c7b0: 20 66 6f 72 20 74 68 65 20 62 72 61 6e 63 68 65   for the branche
c7c0: 73 20 69 6e 20 61 20 63 68 61 6e 67 65 73 65 74  s in a changeset
c7d0: 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20 28  ....set theset (
c7e0: 27 5b 6a 6f 69 6e 20 24 62 72 61 6e 63 68 65 73  '[join $branches
c7f0: 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72   {','}]')..retur
c800: 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75  n [state run [su
c810: 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20  bst -nocommands 
c820: 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b  -nobackslashes {
c830: 0a 09 20 20 20 20 53 45 4c 45 43 54 0a 09 20 20  ..    SELECT..  
c840: 20 20 44 49 53 54 49 4e 43 54 20 4c 2e 6e 61 6d    DISTINCT L.nam
c850: 65 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72  e..    FROM   br
c860: 61 6e 63 68 20 42 2c 20 73 79 6d 62 6f 6c 20 4c  anch B, symbol L
c870: 0a 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62  ..    WHERE  B.b
c880: 69 64 20 69 6e 20 24 74 68 65 73 65 74 20 20 20  id in $theset   
c890: 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74       -- Restrict
c8a0: 20 74 6f 20 62 72 61 6e 63 68 65 73 20 6f 66 20   to branches of 
c8b0: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e  interest..    AN
c8c0: 44 20 20 20 20 4c 2e 73 69 64 20 3d 20 42 2e 6c  D    L.sid = B.l
c8d0: 6f 64 20 20 20 20 20 20 20 20 20 20 20 2d 2d 20  od           -- 
c8e0: 47 65 74 20 6c 6f 64 20 73 79 6d 62 6f 6c 20 6f  Get lod symbol o
c8f0: 66 20 62 72 61 6e 63 68 0a 09 7d 5d 5d 0a 20 20  f branch..}]].  
c900: 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74    }..    typemet
c910: 68 6f 64 20 6c 69 6d 69 74 73 20 7b 62 72 61 6e  hod limits {bran
c920: 63 68 65 73 7d 20 7b 0a 09 23 20 4e 6f 74 65 73  ches} {..# Notes
c930: 2e 20 54 68 69 73 20 6d 65 74 68 6f 64 20 65 78  . This method ex
c940: 69 73 74 73 20 6f 6e 6c 79 20 66 6f 72 20 62 72  ists only for br
c950: 61 6e 63 68 65 73 2e 20 49 74 20 69 73 20 6e 65  anches. It is ne
c960: 65 64 65 64 20 74 6f 0a 09 23 20 67 65 74 20 64  eded to..# get d
c970: 65 74 61 69 6c 65 64 20 69 6e 66 6f 72 6d 61 74  etailed informat
c980: 69 6f 6e 20 61 62 6f 75 74 20 61 20 62 61 63 6b  ion about a back
c990: 77 61 72 64 20 62 72 61 6e 63 68 2e 20 49 74 20  ward branch. It 
c9a0: 64 6f 65 73 0a 09 23 20 6e 6f 74 20 61 70 70 6c  does..# not appl
c9b0: 79 20 74 6f 20 74 61 67 73 2c 20 6e 6f 72 20 72  y to tags, nor r
c9c0: 65 76 69 73 69 6f 6e 73 2e 20 54 68 65 20 71 75  evisions. The qu
c9d0: 65 72 69 65 73 20 63 61 6e 20 61 6c 73 6f 0a 09  eries can also..
c9e0: 23 20 72 65 73 74 72 69 63 74 20 74 68 65 6d 73  # restrict thems
c9f0: 65 6c 76 65 73 20 74 6f 20 74 68 65 20 72 65 76  elves to the rev
ca00: 69 73 69 6f 6e 20 73 75 63 65 73 73 6f 72 73 2f  ision sucessors/
ca10: 70 72 65 64 65 63 65 73 73 6f 72 73 0a 09 23 20  predecessors..# 
ca20: 6f 66 20 62 72 61 6e 63 68 65 73 2c 20 61 73 20  of branches, as 
ca30: 6f 6e 6c 79 20 74 68 65 79 20 68 61 76 65 20 6f  only they have o
ca40: 72 64 65 72 69 6e 67 20 64 61 74 61 20 61 6e 64  rdering data and
ca50: 20 74 68 75 73 20 63 61 6e 0a 09 23 20 63 61 75   thus can..# cau
ca60: 73 65 20 74 68 65 20 62 61 63 6b 77 61 72 64 6e  se the backwardn
ca70: 65 73 73 2e 0a 0a 09 73 65 74 20 74 68 65 73 65  ess....set these
ca80: 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61 6e 63  t ('[join $branc
ca90: 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09 73  hes {','}]')...s
caa0: 65 74 20 6d 61 78 70 20 5b 73 74 61 74 65 20 72  et maxp [state r
cab0: 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d  un [subst -nocom
cac0: 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61  mands -nobacksla
cad0: 73 68 65 73 20 7b 0a 09 20 20 20 20 2d 2d 20 6d  shes {..    -- m
cae0: 61 78 69 6d 61 6c 20 70 72 65 64 65 63 65 73 73  aximal predecess
caf0: 6f 72 20 70 6f 73 69 74 69 6f 6e 20 70 65 72 20  or position per 
cb00: 62 72 61 6e 63 68 0a 09 20 20 20 20 53 45 4c 45  branch..    SELE
cb10: 43 54 20 42 2e 62 69 64 2c 20 4d 41 58 20 28 43  CT B.bid, MAX (C
cb20: 4f 2e 70 6f 73 29 0a 09 20 20 20 20 46 52 4f 4d  O.pos)..    FROM
cb30: 20 20 20 62 72 61 6e 63 68 20 42 2c 20 72 65 76     branch B, rev
cb40: 69 73 69 6f 6e 20 52 2c 20 63 73 69 74 65 6d 20  ision R, csitem 
cb50: 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43 2c  CI, changeset C,
cb60: 20 63 73 6f 72 64 65 72 20 43 4f 0a 09 20 20 20   csorder CO..   
cb70: 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e   WHERE  B.bid IN
cb80: 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20   $theset     -- 
cb90: 52 65 73 74 72 69 63 74 20 74 6f 20 62 72 61 6e  Restrict to bran
cba0: 63 68 65 73 20 6f 66 20 69 6e 74 65 72 65 73 74  ches of interest
cbb0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 72  ..    AND    B.r
cbc0: 6f 6f 74 20 3d 20 52 2e 72 69 64 20 20 20 20 20  oot = R.rid     
cbd0: 20 20 2d 2d 20 47 65 74 20 62 72 61 6e 63 68 20    -- Get branch 
cbe0: 72 6f 6f 74 20 72 65 76 69 73 69 6f 6e 73 0a 09  root revisions..
cbf0: 20 20 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69      AND    CI.ii
cc00: 64 20 3d 20 52 2e 72 69 64 20 20 20 20 20 20 20  d = R.rid       
cc10: 2d 2d 20 47 65 74 20 63 68 61 6e 67 65 73 65 74  -- Get changeset
cc20: 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65  s containing the
cc30: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 43 2e 63  ..    AND    C.c
cc40: 69 64 20 3d 20 43 49 2e 63 69 64 20 20 20 20 20  id = CI.cid     
cc50: 20 20 2d 2d 20 72 6f 6f 74 20 72 65 76 69 73 69    -- root revisi
cc60: 6f 6e 73 2c 20 77 68 69 63 68 20 61 72 65 0a 09  ons, which are..
cc70: 20 20 20 20 41 4e 44 20 20 20 20 43 2e 74 79 70      AND    C.typ
cc80: 65 20 3d 20 30 20 20 20 20 20 20 20 20 20 20 20  e = 0           
cc90: 2d 2d 20 72 65 76 69 73 69 6f 6e 20 63 68 61 6e  -- revision chan
cca0: 67 65 73 65 74 73 0a 09 20 20 20 20 41 4e 44 20  gesets..    AND 
ccb0: 20 20 20 43 4f 2e 63 69 64 20 3d 20 43 2e 63 69     CO.cid = C.ci
ccc0: 64 20 20 20 20 20 20 20 2d 2d 20 47 65 74 20 74  d       -- Get t
ccd0: 68 65 69 72 20 74 6f 70 6f 6c 6f 67 69 63 61 6c  heir topological
cce0: 20 6f 72 64 65 72 69 6e 67 0a 09 20 20 20 20 47   ordering..    G
ccf0: 52 4f 55 50 20 42 59 20 42 2e 62 69 64 0a 09 7d  ROUP BY B.bid..}
cd00: 5d 5d 0a 0a 09 73 65 74 20 6d 69 6e 73 20 5b 73  ]]...set mins [s
cd10: 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73 74 20  tate run [subst 
cd20: 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62  -nocommands -nob
cd30: 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20  ackslashes {..  
cd40: 20 20 2d 2d 20 6d 69 6e 69 6d 61 6c 20 73 75 63    -- minimal suc
cd50: 63 65 73 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cessor position 
cd60: 70 65 72 20 62 72 61 6e 63 68 0a 09 20 20 20 20  per branch..    
cd70: 53 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 4d 49  SELECT B.bid, MI
cd80: 4e 20 28 43 4f 2e 70 6f 73 29 0a 09 20 20 20 20  N (CO.pos)..    
cd90: 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c  FROM   branch B,
cda0: 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 63 73 69   revision R, csi
cdb0: 74 65 6d 20 43 49 2c 20 63 68 61 6e 67 65 73 65  tem CI, changese
cdc0: 74 20 43 2c 20 63 73 6f 72 64 65 72 20 43 4f 0a  t C, csorder CO.
cdd0: 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69  .    WHERE  B.bi
cde0: 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20  d IN $theset    
cdf0: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
ce00: 62 72 61 6e 63 68 65 73 20 6f 66 20 69 6e 74 65  branches of inte
ce10: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
ce20: 20 42 2e 66 69 72 73 74 20 3d 20 52 2e 72 69 64   B.first = R.rid
ce30: 20 20 20 20 20 20 2d 2d 20 47 65 74 20 74 68 65        -- Get the
ce40: 20 66 69 72 73 74 20 72 65 76 69 73 69 6f 6e 73   first revisions
ce50: 20 6f 6e 20 74 68 65 20 62 72 61 6e 63 68 65 73   on the branches
ce60: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 43 49 2e  ..    AND    CI.
ce70: 69 69 64 20 3d 20 52 2e 72 69 64 20 20 20 20 20  iid = R.rid     
ce80: 20 20 2d 2d 20 47 65 74 20 63 68 61 6e 67 65 73    -- Get changes
ce90: 65 74 73 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ets containing t
cea0: 68 65 0a 09 20 20 20 20 41 4e 44 20 20 20 20 43  he..    AND    C
ceb0: 2e 63 69 64 20 3d 20 43 49 2e 63 69 64 09 2d 2d  .cid = CI.cid.--
cec0: 20 66 69 72 73 74 20 72 65 76 69 73 69 6f 6e 73   first revisions
ced0: 2c 20 77 68 69 63 68 20 61 72 65 0a 09 20 20 20  , which are..   
cee0: 20 41 4e 44 20 20 20 20 43 2e 74 79 70 65 20 3d   AND    C.type =
cef0: 20 30 09 09 2d 2d 20 72 65 76 69 73 69 6f 6e 20   0..-- revision 
cf00: 63 68 61 6e 67 65 73 65 74 73 0a 09 20 20 20 20  changesets..    
cf10: 41 4e 44 20 20 20 20 43 4f 2e 63 69 64 20 3d 20  AND    CO.cid = 
cf20: 43 2e 63 69 64 09 2d 2d 20 47 65 74 20 74 68 65  C.cid.-- Get the
cf30: 69 72 20 74 6f 70 6f 6c 6f 67 69 63 61 6c 20 6f  ir topological o
cf40: 72 64 65 72 69 6e 67 0a 09 20 20 20 20 47 52 4f  rdering..    GRO
cf50: 55 50 20 42 59 20 42 2e 62 69 64 0a 09 7d 5d 5d  UP BY B.bid..}]]
cf60: 0a 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ..        return
cf70: 20 5b 6c 69 73 74 20 24 6d 61 78 70 20 24 6d 69   [list $maxp $mi
cf80: 6e 73 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  ns].    }..    #
cf90: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20   # ## ### ##### 
cfa0: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
cfb0: 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 43 6f  ######.    ## Co
cfc0: 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a 20 20 20  nfiguration..   
cfd0: 20 70 72 61 67 6d 61 20 2d 68 61 73 69 6e 73 74   pragma -hasinst
cfe0: 61 6e 63 65 73 20 20 20 6e 6f 20 3b 20 23 20 73  ances   no ; # s
cff0: 69 6e 67 6c 65 74 6f 6e 0a 20 20 20 20 70 72 61  ingleton.    pra
d000: 67 6d 61 20 2d 68 61 73 74 79 70 65 69 6e 66 6f  gma -hastypeinfo
d010: 20 20 20 20 6e 6f 20 3b 20 23 20 6e 6f 20 69 6e      no ; # no in
d020: 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20 20 20 20  trospection.    
d030: 70 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65 64  pragma -hastyped
d040: 65 73 74 72 6f 79 20 6e 6f 20 3b 20 23 20 69 6d  estroy no ; # im
d050: 6d 6f 72 74 61 6c 0a 7d 0a 0a 23 20 23 20 23 23  mortal.}..# # ##
d060: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23   ### ##### #####
d070: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
d080: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23  # ##############
d090: 23 23 23 23 23 23 23 0a 23 23 0a 0a 6e 61 6d 65  #######.##..name
d0a0: 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a  space eval ::vc:
d0b0: 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a  :fossil::import:
d0c0: 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 20 7b 0a  :cvs::project {.
d0d0: 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 65 78      namespace ex
d0e0: 70 6f 72 74 20 72 65 76 0a 20 20 20 20 6e 61 6d  port rev.    nam
d0f0: 65 73 70 61 63 65 20 65 76 61 6c 20 72 65 76 20  espace eval rev 
d100: 7b 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70  {..namespace imp
d110: 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c  ort ::vc::fossil
d120: 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73  ::import::cvs::s
d130: 74 61 74 65 0a 09 6e 61 6d 65 73 70 61 63 65 20  tate..namespace 
d140: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73  import ::vc::fos
d150: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73  sil::import::cvs
d160: 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 6e 61 6d  ::integrity..nam
d170: 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a  espace import ::
d180: 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69 73 63 3a  vc::tools::misc:
d190: 3a 2a 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d  :*..namespace im
d1a0: 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73  port ::vc::tools
d1b0: 3a 3a 74 72 6f 75 62 6c 65 0a 09 6e 61 6d 65 73  ::trouble..names
d1c0: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63  pace import ::vc
d1d0: 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 6c 6f  ::tools::log..lo
d1e0: 67 20 72 65 67 69 73 74 65 72 20 63 73 65 74 73  g register csets
d1f0: 0a 0a 09 23 20 53 65 74 20 75 70 20 74 68 65 20  ...# Set up the 
d200: 68 65 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e  helper singleton
d210: 73 0a 09 6e 61 6d 65 73 70 61 63 65 20 65 76 61  s..namespace eva
d220: 6c 20 72 65 76 20 7b 0a 09 20 20 20 20 6e 61 6d  l rev {..    nam
d230: 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a  espace import ::
d240: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f  vc::fossil::impo
d250: 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09  rt::cvs::state..
d260: 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d      namespace im
d270: 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69  port ::vc::fossi
d280: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a  l::import::cvs::
d290: 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a 09 6e 61  integrity..}..na
d2a0: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 73 79 6d  mespace eval sym
d2b0: 3a 3a 74 61 67 20 7b 0a 09 20 20 20 20 6e 61 6d  ::tag {..    nam
d2c0: 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a  espace import ::
d2d0: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f  vc::fossil::impo
d2e0: 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09  rt::cvs::state..
d2f0: 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d      namespace im
d300: 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69  port ::vc::fossi
d310: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a  l::import::cvs::
d320: 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a 09 6e 61  integrity..}..na
d330: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 73 79 6d  mespace eval sym
d340: 3a 3a 62 72 61 6e 63 68 20 7b 0a 09 20 20 20 20  ::branch {..    
d350: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74  namespace import
d360: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
d370: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74  mport::cvs::stat
d380: 65 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65  e..    namespace
d390: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f   import ::vc::fo
d3a0: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
d3b0: 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 7d 0a  s::integrity..}.
d3c0: 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20      }.}..# # ## 
d3d0: 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23  ### ##### ######
d3e0: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
d3f0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23   ###############
d400: 23 23 23 23 23 23 0a 23 23 20 52 65 61 64 79 0a  ######.## Ready.
d410: 0a 70 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65  .package provide
d420: 20 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70   vc::fossil::imp
d430: 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63  ort::cvs::projec
d440: 74 3a 3a 72 65 76 20 31 2e 30 0a 72 65 74 75 72  t::rev 1.0.retur
d450: 6e 0a                                            n.