Hex Artifact Content
Not logged in

Artifact 53853a44a27909b584478fd33af1fc4f99bbc446:

File tools/cvs2fossil/lib/c2f_prev.tcl part of check-in [4b0f43fb2f] - Plugged memory leak in changeset destructor. Updated commentary. Reformatting of a few integrity checks for readability. by aku on 2008-02-24 02:16:25.

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 66 6f 72 65 61 63 68 20 69 69 64 20 24  ...foreach iid $
07c0: 69 74 65 6d 73 20 7b 20 6c 61 70 70 65 6e 64 20  items { lappend 
07d0: 6d 79 74 69 74 65 6d 73 20 5b 6c 69 73 74 20 24  mytitems [list $
07e0: 63 73 74 79 70 65 20 24 69 69 64 5d 20 7d 0a 0a  cstype $iid] }..
07f0: 09 23 20 4b 65 65 70 20 74 72 61 63 6b 20 6f 66  .# Keep track of
0800: 20 74 68 65 20 67 65 6e 65 72 61 74 65 64 20 63   the generated c
0810: 68 61 6e 67 65 73 65 74 73 20 61 6e 64 20 6f 66  hangesets and of
0820: 20 74 68 65 20 69 6e 76 65 72 73 65 0a 09 23 20   the inverse..# 
0830: 6d 61 70 70 69 6e 67 20 66 72 6f 6d 20 69 74 65  mapping from ite
0840: 6d 73 20 74 6f 20 74 68 65 6d 2e 0a 09 6c 61 70  ms to them...lap
0850: 70 65 6e 64 20 6d 79 63 68 61 6e 67 65 73 65 74  pend mychangeset
0860: 73 20 20 20 24 73 65 6c 66 0a 09 6c 61 70 70 65  s   $self..lappe
0870: 6e 64 20 6d 79 74 63 68 61 6e 67 65 73 65 74 73  nd mytchangesets
0880: 28 24 63 73 74 79 70 65 29 20 24 73 65 6c 66 0a  ($cstype) $self.
0890: 09 73 65 74 20 20 20 20 20 6d 79 69 64 6d 61 70  .set     myidmap
08a0: 28 24 6d 79 69 64 29 20 24 73 65 6c 66 0a 0a 09  ($myid) $self...
08b0: 4d 61 70 49 74 65 6d 73 20 24 63 73 74 79 70 65  MapItems $cstype
08c0: 20 24 69 74 65 6d 73 0a 09 72 65 74 75 72 6e 0a   $items..return.
08d0: 20 20 20 20 7d 0a 0a 20 20 20 20 64 65 73 74 72      }..    destr
08e0: 75 63 74 6f 72 20 7b 0a 09 23 20 57 65 20 6d 61  uctor {..# We ma
08f0: 79 20 62 65 20 61 62 6c 65 20 74 6f 20 67 65 74  y be able to get
0900: 20 72 69 64 20 6f 66 20 74 68 69 73 20 65 6e 74   rid of this ent
0910: 69 72 65 6c 79 2c 20 61 74 20 6c 65 61 73 74 20  irely, at least 
0920: 66 6f 72 0a 09 23 20 28 64 65 29 63 6f 6e 73 74  for..# (de)const
0930: 72 75 63 74 69 6f 6e 20 61 6e 64 20 70 61 73 73  ruction and pass
0940: 20 49 6e 69 74 43 53 65 74 73 2e 0a 0a 09 55 6e   InitCSets....Un
0950: 6d 61 70 49 74 65 6d 73 20 24 6d 79 74 79 70 65  mapItems $mytype
0960: 20 24 6d 79 69 74 65 6d 73 0a 09 75 6e 73 65 74   $myitems..unset
0970: 20 6d 79 69 64 6d 61 70 28 24 6d 79 69 64 29 0a   myidmap($myid).
0980: 0a 09 73 65 74 20 70 6f 73 20 20 20 20 20 20 20  ..set pos       
0990: 20 20 20 20 20 20 20 20 20 20 20 20 20 5b 6c 73               [ls
09a0: 65 61 72 63 68 20 2d 65 78 61 63 74 20 24 6d 79  earch -exact $my
09b0: 63 68 61 6e 67 65 73 65 74 73 20 24 73 65 6c 66  changesets $self
09c0: 5d 0a 09 73 65 74 20 6d 79 63 68 61 6e 67 65 73  ]..set mychanges
09d0: 65 74 73 20 20 20 20 20 20 20 20 20 20 20 5b 6c  ets           [l
09e0: 72 65 70 6c 61 63 65 20 20 20 20 20 20 20 24 6d  replace       $m
09f0: 79 63 68 61 6e 67 65 73 65 74 73 20 24 70 6f 73  ychangesets $pos
0a00: 20 24 70 6f 73 5d 0a 09 73 65 74 20 70 6f 73 20   $pos]..set pos 
0a10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0a20: 20 20 20 5b 6c 73 65 61 72 63 68 20 2d 65 78 61     [lsearch -exa
0a30: 63 74 20 24 6d 79 74 63 68 61 6e 67 65 73 65 74  ct $mytchangeset
0a40: 73 28 24 6d 79 74 79 70 65 29 20 24 73 65 6c 66  s($mytype) $self
0a50: 5d 0a 09 73 65 74 20 6d 79 74 63 68 61 6e 67 65  ]..set mytchange
0a60: 73 65 74 73 28 24 6d 79 74 79 70 65 29 20 5b 6c  sets($mytype) [l
0a70: 72 65 70 6c 61 63 65 20 20 20 20 20 20 20 24 6d  replace       $m
0a80: 79 74 63 68 61 6e 67 65 73 65 74 73 28 24 6d 79  ytchangesets($my
0a90: 74 79 70 65 29 20 24 70 6f 73 20 24 70 6f 73 5d  type) $pos $pos]
0aa0: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
0ab0: 20 20 20 20 6d 65 74 68 6f 64 20 73 74 72 20 7b      method str {
0ac0: 7d 20 7b 0a 09 73 65 74 20 73 74 72 20 20 20 20  } {..set str    
0ad0: 22 3c 22 0a 09 73 65 74 20 64 65 74 61 69 6c 20  "<"..set detail 
0ae0: 22 22 0a 09 69 66 20 7b 5b 24 6d 79 74 79 70 65  ""..if {[$mytype
0af0: 6f 62 6a 20 62 79 73 79 6d 62 6f 6c 5d 7d 20 7b  obj bysymbol]} {
0b00: 0a 09 20 20 20 20 73 65 74 20 64 65 74 61 69 6c  ..    set detail
0b10: 20 22 20 27 5b 73 74 61 74 65 20 6f 6e 65 20 7b   " '[state one {
0b20: 0a 09 09 53 45 4c 45 43 54 20 53 2e 6e 61 6d 65  ...SELECT S.name
0b30: 0a 09 09 46 52 4f 4d 20 20 20 73 79 6d 62 6f 6c  ...FROM   symbol
0b40: 20 53 0a 09 09 57 48 45 52 45 20 20 53 2e 73 69   S...WHERE  S.si
0b50: 64 20 3d 20 24 6d 79 73 72 63 69 64 0a 09 20 20  d = $mysrcid..  
0b60: 20 20 7d 5d 27 22 0a 09 7d 0a 09 61 70 70 65 6e    }]'"..}..appen
0b70: 64 20 73 74 72 20 22 24 6d 79 74 79 70 65 20 24  d str "$mytype $
0b80: 7b 6d 79 69 64 7d 24 7b 64 65 74 61 69 6c 7d 3e  {myid}${detail}>
0b90: 22 0a 09 72 65 74 75 72 6e 20 24 73 74 72 0a 20  "..return $str. 
0ba0: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64     }..    method
0bb0: 20 6c 6f 64 20 7b 7d 20 7b 0a 09 72 65 74 75 72   lod {} {..retur
0bc0: 6e 20 5b 24 6d 79 74 79 70 65 6f 62 6a 20 63 73  n [$mytypeobj cs
0bd0: 5f 6c 6f 64 20 24 6d 79 69 74 65 6d 73 5d 0a 20  _lod $myitems]. 
0be0: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64     }..    method
0bf0: 20 69 64 20 20 20 20 7b 7d 20 7b 20 72 65 74 75   id    {} { retu
0c00: 72 6e 20 24 6d 79 69 64 20 7d 0a 20 20 20 20 6d  rn $myid }.    m
0c10: 65 74 68 6f 64 20 69 74 65 6d 73 20 7b 7d 20 7b  ethod items {} {
0c20: 20 72 65 74 75 72 6e 20 24 6d 79 74 69 74 65 6d   return $mytitem
0c30: 73 20 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20 64  s }.    method d
0c40: 61 74 61 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e  ata  {} { return
0c50: 20 5b 6c 69 73 74 20 24 6d 79 70 72 6f 6a 65 63   [list $myprojec
0c60: 74 20 24 6d 79 74 79 70 65 20 24 6d 79 73 72 63  t $mytype $mysrc
0c70: 69 64 5d 20 7d 0a 0a 20 20 20 20 64 65 6c 65 67  id] }..    deleg
0c80: 61 74 65 20 6d 65 74 68 6f 64 20 62 79 73 79 6d  ate method bysym
0c90: 62 6f 6c 20 20 20 74 6f 20 6d 79 74 79 70 65 6f  bol   to mytypeo
0ca0: 62 6a 0a 20 20 20 20 64 65 6c 65 67 61 74 65 20  bj.    delegate 
0cb0: 6d 65 74 68 6f 64 20 62 79 72 65 76 69 73 69 6f  method byrevisio
0cc0: 6e 20 74 6f 20 6d 79 74 79 70 65 6f 62 6a 0a 20  n to mytypeobj. 
0cd0: 20 20 20 64 65 6c 65 67 61 74 65 20 6d 65 74 68     delegate meth
0ce0: 6f 64 20 69 73 62 72 61 6e 63 68 20 20 20 74 6f  od isbranch   to
0cf0: 20 6d 79 74 79 70 65 6f 62 6a 0a 20 20 20 20 64   mytypeobj.    d
0d00: 65 6c 65 67 61 74 65 20 6d 65 74 68 6f 64 20 69  elegate method i
0d10: 73 74 61 67 20 20 20 20 20 20 74 6f 20 6d 79 74  stag      to myt
0d20: 79 70 65 6f 62 6a 0a 0a 20 20 20 20 6d 65 74 68  ypeobj..    meth
0d30: 6f 64 20 73 65 74 70 6f 73 20 7b 70 7d 20 7b 20  od setpos {p} { 
0d40: 73 65 74 20 6d 79 70 6f 73 20 24 70 20 3b 20 72  set mypos $p ; r
0d50: 65 74 75 72 6e 20 7d 0a 20 20 20 20 6d 65 74 68  eturn }.    meth
0d60: 6f 64 20 70 6f 73 20 20 20 20 7b 7d 20 20 7b 20  od pos    {}  { 
0d70: 72 65 74 75 72 6e 20 24 6d 79 70 6f 73 20 7d 0a  return $mypos }.
0d80: 0a 20 20 20 20 6d 65 74 68 6f 64 20 64 65 74 65  .    method dete
0d90: 72 6d 69 6e 65 73 75 63 63 65 73 73 6f 72 73 20  rminesuccessors 
0da0: 7b 7d 20 7b 0a 09 23 20 50 61 73 73 20 36 20 6f  {} {..# Pass 6 o
0db0: 70 65 72 61 74 69 6f 6e 2e 20 43 6f 6d 70 75 74  peration. Comput
0dc0: 65 20 70 72 6f 6a 65 63 74 2d 6c 65 76 65 6c 20  e project-level 
0dd0: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 66 72 6f  dependencies fro
0de0: 6d 0a 09 23 20 74 68 65 20 66 69 6c 65 2d 6c 65  m..# the file-le
0df0: 76 65 6c 20 64 61 74 61 20 61 6e 64 20 73 61 76  vel data and sav
0e00: 65 20 69 74 20 62 61 63 6b 20 74 6f 20 74 68 65  e it back to the
0e10: 20 73 74 61 74 65 2e 20 54 68 69 73 20 6d 61 79   state. This may
0e20: 0a 09 23 20 62 65 20 63 61 6c 6c 65 64 20 64 75  ..# be called du
0e30: 72 69 6e 67 20 74 68 65 20 63 79 63 6c 65 20 62  ring the cycle b
0e40: 72 65 61 6b 65 72 20 70 61 73 73 65 73 20 61 73  reaker passes as
0e50: 20 77 65 6c 6c 2c 20 74 6f 20 61 64 6a 75 73 74   well, to adjust
0e60: 0a 09 23 20 74 68 65 20 73 75 63 63 65 73 73 6f  ..# the successo
0e70: 72 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6f 66  r information of
0e80: 20 63 68 61 6e 67 65 73 65 74 73 20 77 68 69 63   changesets whic
0e90: 68 20 61 72 65 20 74 68 65 0a 09 23 20 70 72 65  h are the..# pre
0ea0: 64 65 63 65 73 73 6f 72 73 20 6f 66 20 64 72 6f  decessors of dro
0eb0: 70 70 65 64 20 63 68 61 6e 67 65 73 65 74 73 2e  pped changesets.
0ec0: 20 46 6f 72 20 74 68 65 6d 20 77 65 20 68 61 76   For them we hav
0ed0: 65 20 74 6f 0a 09 23 20 72 65 6d 6f 76 65 20 74  e to..# remove t
0ee0: 68 65 69 72 20 65 78 69 73 74 69 6e 67 20 69 6e  heir existing in
0ef0: 66 6f 72 6d 61 74 69 6f 6e 20 66 69 72 73 74 20  formation first 
0f00: 62 65 66 6f 72 65 20 69 6e 73 65 72 74 69 6e 67  before inserting
0f10: 20 74 68 65 0a 09 23 20 6e 65 77 20 64 61 74 61   the..# new data
0f20: 2e 0a 09 73 74 61 74 65 20 72 75 6e 20 7b 0a 09  ...state run {..
0f30: 20 20 20 20 44 45 4c 45 54 45 20 46 52 4f 4d 20      DELETE FROM 
0f40: 63 73 73 75 63 63 65 73 73 6f 72 20 57 48 45 52  cssuccessor WHER
0f50: 45 20 63 69 64 20 3d 20 24 6d 79 69 64 3b 0a 09  E cid = $myid;..
0f60: 7d 0a 09 73 65 74 20 6c 6f 6f 70 20 30 0a 09 66  }..set loop 0..f
0f70: 6f 72 65 61 63 68 20 6e 69 64 20 5b 24 6d 79 74  oreach nid [$myt
0f80: 79 70 65 6f 62 6a 20 63 73 5f 73 75 63 63 65 73  ypeobj cs_succes
0f90: 73 6f 72 73 20 24 6d 79 69 74 65 6d 73 5d 20 7b  sors $myitems] {
0fa0: 0a 09 20 20 20 20 73 74 61 74 65 20 72 75 6e 20  ..    state run 
0fb0: 7b 0a 09 09 49 4e 53 45 52 54 20 49 4e 54 4f 20  {...INSERT INTO 
0fc0: 63 73 73 75 63 63 65 73 73 6f 72 20 28 63 69 64  cssuccessor (cid
0fd0: 2c 20 20 6e 69 64 29 0a 09 09 56 41 4c 55 45 53  ,  nid)...VALUES
0fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ff0: 20 20 28 24 6d 79 69 64 2c 24 6e 69 64 29 0a 09    ($myid,$nid)..
1000: 20 20 20 20 7d 0a 09 20 20 20 20 69 66 20 7b 24      }..    if {$
1010: 6e 69 64 20 3d 3d 20 24 6d 79 69 64 7d 20 7b 20  nid == $myid} { 
1020: 73 65 74 20 6c 6f 6f 70 20 31 20 7d 0a 09 7d 0a  set loop 1 }..}.
1030: 09 23 20 52 65 70 6f 72 74 20 61 66 74 65 72 20  .# Report after 
1040: 74 68 65 20 63 6f 6d 70 6c 65 74 65 20 73 74 72  the complete str
1050: 75 63 74 75 72 65 20 68 61 73 20 62 65 65 6e 20  ucture has been 
1060: 73 61 76 65 64 2e 0a 09 69 66 20 7b 24 6c 6f 6f  saved...if {$loo
1070: 70 7d 20 7b 20 24 73 65 6c 66 20 72 65 70 6f 72  p} { $self repor
1080: 74 6c 6f 6f 70 20 7d 0a 09 72 65 74 75 72 6e 0a  tloop }..return.
1090: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73      }..    # res
10a0: 75 6c 74 20 3d 20 6c 69 73 74 20 28 63 68 61 6e  ult = list (chan
10b0: 67 65 73 65 74 29 0a 20 20 20 20 6d 65 74 68 6f  geset).    metho
10c0: 64 20 73 75 63 63 65 73 73 6f 72 73 20 7b 7d 20  d successors {} 
10d0: 7b 0a 09 23 20 55 73 65 20 74 68 65 20 64 61 74  {..# Use the dat
10e0: 61 20 73 61 76 65 64 20 62 79 20 70 61 73 73 20  a saved by pass 
10f0: 36 2e 0a 09 72 65 74 75 72 6e 20 5b 73 74 72 75  6...return [stru
1100: 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20 5b 73 74  ct::list map [st
1110: 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 53  ate run {..    S
1120: 45 4c 45 43 54 20 53 2e 6e 69 64 0a 09 20 20 20  ELECT S.nid..   
1130: 20 46 52 4f 4d 20 20 20 63 73 73 75 63 63 65 73   FROM   cssucces
1140: 73 6f 72 20 53 0a 09 20 20 20 20 57 48 45 52 45  sor S..    WHERE
1150: 20 20 53 2e 63 69 64 20 3d 20 24 6d 79 69 64 0a    S.cid = $myid.
1160: 09 7d 5d 20 5b 6d 79 74 79 70 65 6d 65 74 68 6f  .}] [mytypemetho
1170: 64 20 6f 66 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20  d of]].    }..  
1180: 20 20 23 20 69 74 65 6d 20 2d 3e 20 6c 69 73 74    # item -> list
1190: 20 28 69 74 65 6d 29 0a 20 20 20 20 6d 65 74 68   (item).    meth
11a0: 6f 64 20 6e 65 78 74 6d 61 70 20 7b 7d 20 7b 0a  od nextmap {} {.
11b0: 09 24 6d 79 74 79 70 65 6f 62 6a 20 73 75 63 63  .$mytypeobj succ
11c0: 65 73 73 6f 72 73 20 74 6d 70 20 24 6d 79 69 74  essors tmp $myit
11d0: 65 6d 73 0a 09 72 65 74 75 72 6e 20 5b 61 72 72  ems..return [arr
11e0: 61 79 20 67 65 74 20 74 6d 70 5d 0a 20 20 20 20  ay get tmp].    
11f0: 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 62 72  }..    method br
1200: 65 61 6b 69 6e 74 65 72 6e 61 6c 64 65 70 65 6e  eakinternaldepen
1210: 64 65 6e 63 69 65 73 20 7b 63 76 7d 20 7b 0a 09  dencies {cv} {..
1220: 75 70 76 61 72 20 31 20 24 63 76 20 63 6f 75 6e  upvar 1 $cv coun
1230: 74 65 72 0a 09 6c 6f 67 20 77 72 69 74 65 20 31  ter..log write 1
1240: 34 20 63 73 65 74 73 20 7b 5b 24 73 65 6c 66 20  4 csets {[$self 
1250: 73 74 72 5d 20 42 49 44 7d 0a 09 76 63 3a 3a 74  str] BID}..vc::t
1260: 6f 6f 6c 73 3a 3a 6d 65 6d 3a 3a 6d 61 72 6b 0a  ools::mem::mark.
1270: 0a 09 23 20 54 68 69 73 20 6d 65 74 68 6f 64 20  ..# This method 
1280: 69 6e 73 70 65 63 74 73 20 74 68 65 20 63 68 61  inspects the cha
1290: 6e 67 65 73 65 74 2c 20 6c 6f 6f 6b 69 6e 67 20  ngeset, looking 
12a0: 66 6f 72 20 69 6e 74 65 72 6e 61 6c 0a 09 23 20  for internal..# 
12b0: 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 20 4e 6f  dependencies. No
12c0: 74 68 69 6e 67 20 69 73 20 64 6f 6e 65 20 69 66  thing is done if
12d0: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 73 75   there are no su
12e0: 63 68 2e 0a 0a 09 23 20 4f 74 68 65 72 77 69 73  ch....# Otherwis
12f0: 65 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20  e the changeset 
1300: 69 73 20 73 70 6c 69 74 20 69 6e 74 6f 20 61 20  is split into a 
1310: 73 65 74 20 6f 66 20 66 72 61 67 6d 65 6e 74 73  set of fragments
1320: 0a 09 23 20 77 68 69 63 68 20 68 61 76 65 20 6e  ..# which have n
1330: 6f 20 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e  o internal depen
1340: 64 65 6e 63 69 65 73 2c 20 74 72 61 6e 73 66 6f  dencies, transfo
1350: 72 6d 69 6e 67 20 74 68 65 0a 09 23 20 69 6e 74  rming the..# int
1360: 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69  ernal dependenci
1370: 65 73 20 69 6e 74 6f 20 65 78 74 65 72 6e 61 6c  es into external
1380: 20 6f 6e 65 73 2e 20 54 68 65 20 6e 65 77 20 63   ones. The new c
1390: 68 61 6e 67 65 73 65 74 73 0a 09 23 20 67 65 6e  hangesets..# gen
13a0: 65 72 61 74 65 64 20 66 72 6f 6d 20 74 68 65 20  erated from the 
13b0: 66 72 61 67 6d 65 6e 74 20 69 6e 66 6f 72 6d 61  fragment informa
13c0: 74 69 6f 6e 20 61 72 65 20 61 64 64 65 64 20 74  tion are added t
13d0: 6f 20 74 68 65 0a 09 23 20 6c 69 73 74 20 6f 66  o the..# list of
13e0: 20 61 6c 6c 20 63 68 61 6e 67 65 73 65 74 73 20   all changesets 
13f0: 28 62 79 20 74 68 65 20 63 61 6c 6c 65 72 29 2e  (by the caller).
1400: 0a 0a 09 23 20 54 68 65 20 63 6f 64 65 20 63 68  ...# The code ch
1410: 65 63 6b 73 20 6f 6e 6c 79 20 73 75 63 63 65 73  ecks only succes
1420: 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  sor dependencies
1430: 2c 20 61 73 20 74 68 69 73 20 61 75 74 6f 2d 0a  , as this auto-.
1440: 09 23 20 6d 61 74 69 63 61 6c 6c 79 20 63 6f 76  .# matically cov
1450: 65 72 73 20 74 68 65 20 70 72 65 64 65 63 65 73  ers the predeces
1460: 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 69 65 73  sor dependencies
1470: 20 61 73 20 77 65 6c 6c 20 28 41 6e 79 0a 09 23   as well (Any..#
1480: 20 73 75 63 63 65 73 73 6f 72 20 64 65 70 65 6e   successor depen
1490: 64 65 6e 63 79 20 61 20 2d 3e 20 62 20 69 73 20  dency a -> b is 
14a0: 61 6c 73 6f 20 61 20 70 72 65 64 65 63 65 73 73  also a predecess
14b0: 6f 72 20 64 65 70 65 6e 64 65 6e 63 79 0a 09 23  or dependency..#
14c0: 20 62 20 2d 3e 20 61 29 2e 0a 0a 09 61 72 72 61   b -> a)....arra
14d0: 79 20 73 65 74 20 62 72 65 61 6b 73 20 7b 7d 0a  y set breaks {}.
14e0: 0a 09 73 65 74 20 66 72 61 67 6d 65 6e 74 73 20  ..set fragments 
14f0: 5b 42 72 65 61 6b 44 69 72 65 63 74 44 65 70 65  [BreakDirectDepe
1500: 6e 64 65 6e 63 69 65 73 20 24 6d 79 69 74 65 6d  ndencies $myitem
1510: 73 20 62 72 65 61 6b 73 5d 0a 0a 09 69 66 20 7b  s breaks]...if {
1520: 21 5b 6c 6c 65 6e 67 74 68 20 24 66 72 61 67 6d  ![llength $fragm
1530: 65 6e 74 73 5d 7d 20 7b 20 72 65 74 75 72 6e 20  ents]} { return 
1540: 7b 7d 20 7d 0a 0a 09 72 65 74 75 72 6e 20 5b 24  {} }...return [$
1550: 73 65 6c 66 20 43 72 65 61 74 65 46 72 6f 6d 46  self CreateFromF
1560: 72 61 67 6d 65 6e 74 73 20 24 66 72 61 67 6d 65  ragments $fragme
1570: 6e 74 73 20 63 6f 75 6e 74 65 72 20 62 72 65 61  nts counter brea
1580: 6b 73 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d  ks].    }..    m
1590: 65 74 68 6f 64 20 70 65 72 73 69 73 74 20 7b 7d  ethod persist {}
15a0: 20 7b 0a 09 73 65 74 20 74 69 64 20 24 6d 79 63   {..set tid $myc
15b0: 73 74 79 70 65 28 24 6d 79 74 79 70 65 29 0a 09  stype($mytype)..
15c0: 73 65 74 20 70 69 64 20 5b 24 6d 79 70 72 6f 6a  set pid [$myproj
15d0: 65 63 74 20 69 64 5d 0a 09 73 65 74 20 70 6f 73  ect id]..set pos
15e0: 20 30 0a 0a 09 73 74 61 74 65 20 74 72 61 6e 73   0...state trans
15f0: 61 63 74 69 6f 6e 20 7b 0a 09 20 20 20 20 73 74  action {..    st
1600: 61 74 65 20 72 75 6e 20 7b 0a 09 09 49 4e 53 45  ate run {...INSE
1610: 52 54 20 49 4e 54 4f 20 63 68 61 6e 67 65 73 65  RT INTO changese
1620: 74 20 28 63 69 64 2c 20 20 20 70 69 64 2c 20 20  t (cid,   pid,  
1630: 74 79 70 65 2c 20 73 72 63 29 0a 09 09 56 41 4c  type, src)...VAL
1640: 55 45 53 20 20 20 20 20 20 20 20 20 20 20 20 20  UES             
1650: 20 20 20 28 24 6d 79 69 64 2c 20 24 70 69 64 2c     ($myid, $pid,
1660: 20 24 74 69 64 2c 20 24 6d 79 73 72 63 69 64 29   $tid, $mysrcid)
1670: 3b 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 66  ;..    }...    f
1680: 6f 72 65 61 63 68 20 69 69 64 20 24 6d 79 69 74  oreach iid $myit
1690: 65 6d 73 20 7b 0a 09 09 73 74 61 74 65 20 72 75  ems {...state ru
16a0: 6e 20 7b 0a 09 09 20 20 20 20 49 4e 53 45 52 54  n {...    INSERT
16b0: 20 49 4e 54 4f 20 63 73 69 74 65 6d 20 28 63 69   INTO csitem (ci
16c0: 64 2c 20 20 20 70 6f 73 2c 20 20 69 69 64 29 0a  d,   pos,  iid).
16d0: 09 09 20 20 20 20 56 41 4c 55 45 53 20 20 20 20  ..    VALUES    
16e0: 20 20 20 20 20 20 20 20 20 28 24 6d 79 69 64 2c           ($myid,
16f0: 20 24 70 6f 73 2c 20 24 69 69 64 29 3b 0a 09 09   $pos, $iid);...
1700: 7d 0a 09 09 69 6e 63 72 20 70 6f 73 0a 09 20 20  }...incr pos..  
1710: 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20    }..}..return. 
1720: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64     }..    method
1730: 20 74 69 6d 65 72 61 6e 67 65 20 7b 7d 20 7b 20   timerange {} { 
1740: 72 65 74 75 72 6e 20 5b 24 6d 79 74 79 70 65 6f  return [$mytypeo
1750: 62 6a 20 74 69 6d 65 72 61 6e 67 65 20 24 6d 79  bj timerange $my
1760: 69 74 65 6d 73 5d 20 7d 0a 0a 20 20 20 20 6d 65  items] }..    me
1770: 74 68 6f 64 20 6c 69 6d 69 74 73 20 7b 7d 20 7b  thod limits {} {
1780: 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61  ..struct::list a
1790: 73 73 69 67 6e 20 5b 24 6d 79 74 79 70 65 6f 62  ssign [$mytypeob
17a0: 6a 20 6c 69 6d 69 74 73 20 24 6d 79 69 74 65 6d  j limits $myitem
17b0: 73 5d 20 6d 61 78 70 20 6d 69 6e 73 0a 09 72 65  s] maxp mins..re
17c0: 74 75 72 6e 20 5b 6c 69 73 74 20 5b 54 61 67 49  turn [list [TagI
17d0: 74 65 6d 44 69 63 74 20 24 6d 61 78 70 20 24 6d  temDict $maxp $m
17e0: 79 74 79 70 65 5d 20 5b 54 61 67 49 74 65 6d 44  ytype] [TagItemD
17f0: 69 63 74 20 24 6d 69 6e 73 20 24 6d 79 74 79 70  ict $mins $mytyp
1800: 65 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d  e]].    }..    m
1810: 65 74 68 6f 64 20 64 72 6f 70 20 7b 7d 20 7b 0a  ethod drop {} {.
1820: 09 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73 65  .log write 8 cse
1830: 74 73 20 7b 44 72 6f 70 70 69 6e 67 20 24 73 65  ts {Dropping $se
1840: 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d  lf = [$self str]
1850: 7d 0a 0a 09 73 74 61 74 65 20 74 72 61 6e 73 61  }...state transa
1860: 63 74 69 6f 6e 20 7b 0a 09 20 20 20 20 73 74 61  ction {..    sta
1870: 74 65 20 72 75 6e 20 7b 0a 09 09 44 45 4c 45 54  te run {...DELET
1880: 45 20 46 52 4f 4d 20 63 68 61 6e 67 65 73 65 74  E FROM changeset
1890: 20 20 20 57 48 45 52 45 20 63 69 64 20 3d 20 24     WHERE cid = $
18a0: 6d 79 69 64 3b 0a 09 09 44 45 4c 45 54 45 20 46  myid;...DELETE F
18b0: 52 4f 4d 20 63 73 69 74 65 6d 20 20 20 20 20 20  ROM csitem      
18c0: 57 48 45 52 45 20 63 69 64 20 3d 20 24 6d 79 69  WHERE cid = $myi
18d0: 64 3b 0a 09 09 44 45 4c 45 54 45 20 46 52 4f 4d  d;...DELETE FROM
18e0: 20 63 73 73 75 63 63 65 73 73 6f 72 20 57 48 45   cssuccessor WHE
18f0: 52 45 20 63 69 64 20 3d 20 24 6d 79 69 64 3b 0a  RE cid = $myid;.
1900: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 55 6e 6d 61  .    }..}...Unma
1910: 70 49 74 65 6d 73 20 24 6d 79 74 79 70 65 20 24  pItems $mytype $
1920: 6d 79 69 74 65 6d 73 0a 09 75 6e 73 65 74 20 6d  myitems..unset m
1930: 79 69 64 6d 61 70 28 24 6d 79 69 64 29 0a 0a 09  yidmap($myid)...
1940: 73 65 74 20 70 6f 73 20 20 20 20 20 20 20 20 20  set pos         
1950: 20 20 20 20 20 20 20 20 20 20 20 5b 6c 73 65 61             [lsea
1960: 72 63 68 20 2d 65 78 61 63 74 20 24 6d 79 63 68  rch -exact $mych
1970: 61 6e 67 65 73 65 74 73 20 24 73 65 6c 66 5d 0a  angesets $self].
1980: 09 73 65 74 20 6d 79 63 68 61 6e 67 65 73 65 74  .set mychangeset
1990: 73 20 20 20 20 20 20 20 20 20 20 20 5b 6c 72 65  s           [lre
19a0: 70 6c 61 63 65 20 20 20 20 20 20 20 24 6d 79 63  place       $myc
19b0: 68 61 6e 67 65 73 65 74 73 20 24 70 6f 73 20 24  hangesets $pos $
19c0: 70 6f 73 5d 0a 09 73 65 74 20 70 6f 73 20 20 20  pos]..set pos   
19d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19e0: 20 5b 6c 73 65 61 72 63 68 20 2d 65 78 61 63 74   [lsearch -exact
19f0: 20 24 6d 79 74 63 68 61 6e 67 65 73 65 74 73 28   $mytchangesets(
1a00: 24 6d 79 74 79 70 65 29 20 24 73 65 6c 66 5d 0a  $mytype) $self].
1a10: 09 73 65 74 20 6d 79 74 63 68 61 6e 67 65 73 65  .set mytchangese
1a20: 74 73 28 24 6d 79 74 79 70 65 29 20 5b 6c 72 65  ts($mytype) [lre
1a30: 70 6c 61 63 65 20 20 20 20 20 20 20 24 6d 79 74  place       $myt
1a40: 63 68 61 6e 67 65 73 65 74 73 28 24 6d 79 74 79  changesets($myty
1a50: 70 65 29 20 24 70 6f 73 20 24 70 6f 73 5d 0a 0a  pe) $pos $pos]..
1a60: 09 23 20 52 65 74 75 72 6e 20 74 68 65 20 6c 69  .# Return the li
1a70: 73 74 20 6f 66 20 70 72 65 64 65 63 65 73 73 6f  st of predecesso
1a80: 72 73 20 73 6f 20 74 68 61 74 20 74 68 65 79 20  rs so that they 
1a90: 63 61 6e 20 62 65 20 61 64 6a 75 73 74 65 64 2e  can be adjusted.
1aa0: 0a 09 72 65 74 75 72 6e 20 5b 73 74 72 75 63 74  ..return [struct
1ab0: 3a 3a 6c 69 73 74 20 6d 61 70 20 5b 73 74 61 74  ::list map [stat
1ac0: 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c  e run {..    SEL
1ad0: 45 43 54 20 63 69 64 0a 09 20 20 20 20 46 52 4f  ECT cid..    FRO
1ae0: 4d 20 20 20 63 73 73 75 63 63 65 73 73 6f 72 0a  M   cssuccessor.
1af0: 09 20 20 20 20 57 48 45 52 45 20 20 6e 69 64 20  .    WHERE  nid 
1b00: 3d 20 24 6d 79 69 64 0a 09 7d 5d 20 5b 6d 79 74  = $myid..}] [myt
1b10: 79 70 65 6d 65 74 68 6f 64 20 6f 66 5d 5d 0a 20  ypemethod of]]. 
1b20: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64     }..    method
1b30: 20 72 65 70 6f 72 74 6c 6f 6f 70 20 7b 7b 6b 69   reportloop {{ki
1b40: 6c 6c 20 31 7d 7d 20 7b 0a 09 23 20 57 65 20 70  ll 1}} {..# We p
1b50: 72 69 6e 74 20 74 68 65 20 69 74 65 6d 73 20 77  rint the items w
1b60: 68 69 63 68 20 61 72 65 20 70 72 6f 64 75 63 69  hich are produci
1b70: 6e 67 20 74 68 65 20 6c 6f 6f 70 2c 20 61 6e 64  ng the loop, and
1b80: 20 68 6f 77 2e 0a 0a 09 73 65 74 20 68 64 72 20   how....set hdr 
1b90: 22 53 65 6c 66 2d 72 65 66 65 72 65 6e 74 69 61  "Self-referentia
1ba0: 6c 20 63 68 61 6e 67 65 73 65 74 20 5b 24 73 65  l changeset [$se
1bb0: 6c 66 20 73 74 72 5d 20 5f 5f 5f 5f 5f 5f 5f 5f  lf str] ________
1bc0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 22 0a 09 73 65 74  __________"..set
1bd0: 20 66 74 72 20 5b 72 65 67 73 75 62 20 2d 61 6c   ftr [regsub -al
1be0: 6c 20 7b 5b 5e 20 09 5d 7d 20 24 68 64 72 20 7b  l {[^ .]} $hdr {
1bf0: 5f 7d 5d 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20  _}]...log write 
1c00: 30 20 63 73 65 74 73 20 24 68 64 72 0a 09 66 6f  0 csets $hdr..fo
1c10: 72 65 61 63 68 20 7b 69 74 65 6d 20 6e 65 78 74  reach {item next
1c20: 69 74 65 6d 7d 20 5b 24 6d 79 74 79 70 65 6f 62  item} [$mytypeob
1c30: 6a 20 6c 6f 6f 70 73 20 24 6d 79 69 74 65 6d 73  j loops $myitems
1c40: 5d 20 7b 0a 09 20 20 20 20 23 20 43 72 65 61 74  ] {..    # Creat
1c50: 65 20 74 61 67 67 65 64 20 69 74 65 6d 73 20 66  e tagged items f
1c60: 72 6f 6d 20 74 68 65 20 69 64 20 61 6e 64 20 6f  rom the id and o
1c70: 75 72 20 74 79 70 65 2e 0a 09 20 20 20 20 73 65  ur type...    se
1c80: 74 20 69 74 65 6d 20 20 20 20 20 5b 6c 69 73 74  t item     [list
1c90: 20 24 6d 79 74 79 70 65 20 20 24 69 74 65 6d 5d   $mytype  $item]
1ca0: 0a 09 20 20 20 20 73 65 74 20 6e 65 78 74 69 74  ..    set nextit
1cb0: 65 6d 20 5b 6c 69 73 74 20 24 6d 79 74 79 70 65  em [list $mytype
1cc0: 20 24 6e 65 78 74 69 74 65 6d 5d 0a 09 20 20 20   $nextitem]..   
1cd0: 20 23 20 50 72 69 6e 74 61 62 6c 65 20 6c 61 62   # Printable lab
1ce0: 65 6c 73 2e 0a 09 20 20 20 20 73 65 74 20 69 20  els...    set i 
1cf0: 20 22 3c 5b 24 74 79 70 65 20 69 74 65 6d 73 74   "<[$type itemst
1d00: 72 20 24 69 74 65 6d 5d 3e 22 0a 09 20 20 20 20  r $item]>"..    
1d10: 73 65 74 20 6e 20 20 22 3c 5b 24 74 79 70 65 20  set n  "<[$type 
1d20: 69 74 65 6d 73 74 72 20 24 6e 65 78 74 69 74 65  itemstr $nextite
1d30: 6d 5d 3e 22 0a 09 20 20 20 20 73 65 74 20 6e 63  m]>"..    set nc
1d40: 73 20 24 6d 79 69 74 65 6d 6d 61 70 28 24 6e 65  s $myitemmap($ne
1d50: 78 74 69 74 65 6d 29 0a 09 20 20 20 20 23 20 50  xtitem)..    # P
1d60: 72 69 6e 74 0a 09 20 20 20 20 6c 6f 67 20 77 72  rint..    log wr
1d70: 69 74 65 20 30 20 63 73 65 74 73 20 7b 2a 20 24  ite 0 csets {* $
1d80: 69 20 2d 2d 3e 20 24 6e 20 2d 2d 3e 20 63 73 20  i --> $n --> cs 
1d90: 5b 24 6e 63 73 20 73 74 72 5d 7d 0a 09 7d 0a 09  [$ncs str]}..}..
1da0: 6c 6f 67 20 77 72 69 74 65 20 30 20 63 73 65 74  log write 0 cset
1db0: 73 20 24 66 74 72 0a 0a 09 69 66 20 7b 21 24 6b  s $ftr...if {!$k
1dc0: 69 6c 6c 7d 20 72 65 74 75 72 6e 0a 09 74 72 6f  ill} return..tro
1dd0: 75 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 22 5b  uble internal "[
1de0: 24 73 65 6c 66 20 73 74 72 5d 20 64 65 70 65 6e  $self str] depen
1df0: 64 73 20 6f 6e 20 69 74 73 65 6c 66 22 0a 09 72  ds on itself"..r
1e00: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
1e10: 20 6d 65 74 68 6f 64 20 70 75 73 68 74 6f 20 7b   method pushto {
1e20: 72 65 70 6f 73 69 74 6f 72 79 20 64 61 74 65 20  repository date 
1e30: 72 73 74 61 74 65 7d 20 7b 0a 09 23 20 47 65 6e  rstate} {..# Gen
1e40: 65 72 61 74 65 20 61 6e 64 20 69 6d 70 6f 72 74  erate and import
1e50: 20 74 68 65 20 6d 61 6e 69 66 65 73 74 20 66 6f   the manifest fo
1e60: 72 20 74 68 69 73 20 63 68 61 6e 67 65 73 65 74  r this changeset
1e70: 2e 0a 09 23 0a 09 23 20 44 61 74 61 20 6e 65 65  ...#..# Data nee
1e80: 64 65 64 3a 0a 09 23 20 2d 20 43 6f 6d 6d 69 74  ded:..# - Commit
1e90: 20 6d 65 73 73 61 67 65 20 20 20 20 20 20 20 20   message        
1ea0: 20 20 20 20 20 20 20 28 2d 2d 20 6d 79 73 72 63         (-- mysrc
1eb0: 69 64 20 2d 3e 20 72 65 70 6f 73 69 74 6f 72 79  id -> repository
1ec0: 20 6d 65 74 61 29 0a 09 23 20 2d 20 55 73 65 72   meta)..# - User
1ed0: 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 6d 69   doing the commi
1ee0: 74 20 20 20 20 20 20 20 20 28 73 2e 61 2e 29 0a  t        (s.a.).
1ef0: 09 23 0a 09 23 20 2d 20 54 69 6d 65 73 74 61 6d  .#..# - Timestam
1f00: 70 20 6f 66 20 77 68 65 6e 20 63 6f 6d 6d 69 74  p of when commit
1f10: 74 65 64 20 20 28 63 6f 6d 6d 61 6e 64 20 61 72  ted  (command ar
1f20: 67 75 6d 65 6e 74 29 0a 09 23 0a 09 23 20 2d 20  gument)..#..# - 
1f30: 54 68 65 20 70 61 72 65 6e 74 20 63 68 61 6e 67  The parent chang
1f40: 65 73 65 74 2c 20 69 66 20 61 6e 79 2e 20 49 66  eset, if any. If
1f50: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 70 61 72   there is no par
1f60: 65 6e 74 20 66 6f 73 73 69 6c 0a 09 23 20 20 20  ent fossil..#   
1f70: 77 69 6c 6c 20 75 73 65 20 74 68 65 20 65 6d 70  will use the emp
1f80: 74 79 20 62 61 73 65 20 72 65 76 69 73 69 6f 6e  ty base revision
1f90: 20 61 73 20 70 61 72 65 6e 74 2e 0a 09 23 0a 09   as parent...#..
1fa0: 23 20 2d 20 4c 69 73 74 20 6f 66 20 74 68 65 20  # - List of the 
1fb0: 66 69 6c 65 20 72 65 76 69 73 69 6f 6e 73 20 69  file revisions i
1fc0: 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e  n the changeset.
1fd0: 0a 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20  ...struct::list 
1fe0: 61 73 73 69 67 6e 20 5b 24 6d 79 70 72 6f 6a 65  assign [$myproje
1ff0: 63 74 20 67 65 74 6d 65 74 61 20 24 6d 79 73 72  ct getmeta $mysr
2000: 63 69 64 5d 20 5f 5f 20 5f 5f 20 75 73 65 72 20  cid] __ __ user 
2010: 6d 65 73 73 61 67 65 0a 0a 09 23 20 57 65 20 64  message...# We d
2020: 65 72 69 76 65 20 74 68 65 20 6c 6f 64 20 69 6e  erive the lod in
2030: 66 6f 72 6d 61 74 69 6f 6e 20 64 69 72 65 63 74  formation direct
2040: 6c 79 20 66 72 6f 6d 20 74 68 65 20 72 65 76 69  ly from the revi
2050: 73 69 6f 6e 73 20 6f 66 0a 09 23 20 74 68 65 20  sions of..# the 
2060: 63 68 61 6e 67 65 73 65 74 2c 20 61 73 20 74 68  changeset, as th
2070: 65 20 62 72 61 6e 63 68 20 70 61 72 74 20 6f 66  e branch part of
2080: 20 74 68 65 20 6d 65 74 61 20 64 61 74 61 20 28   the meta data (
2090: 73 2e 61 2e 29 20 69 73 0a 09 23 20 6f 75 74 64  s.a.) is..# outd
20a0: 61 74 65 64 20 73 69 6e 63 65 20 70 61 73 73 20  ated since pass 
20b0: 46 69 6c 74 65 72 53 79 6d 62 6f 6c 73 2e 0a 0a  FilterSymbols...
20c0: 09 73 65 74 20 6c 6f 64 6e 61 6d 65 20 5b 24 73  .set lodname [$s
20d0: 65 6c 66 20 6c 6f 64 5d 0a 0a 09 6c 6f 67 20 77  elf lod]...log w
20e0: 72 69 74 65 20 32 20 63 73 65 74 73 20 7b 49 6d  rite 2 csets {Im
20f0: 70 6f 72 74 69 6e 67 20 72 65 76 69 73 69 6f 6e  porting revision
2100: 20 5b 24 73 65 6c 66 20 73 74 72 5d 20 6f 6e 20   [$self str] on 
2110: 24 6c 6f 64 6e 61 6d 65 7d 0a 0a 09 23 20 50 65  $lodname}...# Pe
2120: 72 66 6f 72 6d 20 74 68 65 20 69 6d 70 6f 72 74  rform the import
2130: 2e 20 41 73 20 70 61 72 74 20 6f 66 20 74 68 61  . As part of tha
2140: 74 20 77 65 20 64 65 74 65 72 6d 69 6e 65 20 74  t we determine t
2150: 68 65 20 70 61 72 65 6e 74 0a 09 23 20 77 65 20  he parent..# we 
2160: 6e 65 65 64 2c 20 61 6e 64 20 63 6f 6e 76 65 72  need, and conver
2170: 74 20 74 68 65 20 6c 69 73 74 20 6f 66 20 69 74  t the list of it
2180: 65 6d 73 20 69 6e 20 74 68 65 20 63 68 61 6e 67  ems in the chang
2190: 65 73 65 74 20 69 6e 74 6f 0a 09 23 20 75 75 69  eset into..# uui
21a0: 64 73 20 61 6e 64 20 70 72 69 6e 74 61 62 6c 65  ds and printable
21b0: 20 64 61 74 61 2e 0a 0a 09 73 74 72 75 63 74 3a   data....struct:
21c0: 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b 47 65  :list assign [Ge
21d0: 74 69 73 64 65 66 61 75 6c 74 20 24 6d 79 69 74  tisdefault $myit
21e0: 65 6d 73 5d 20 69 73 64 65 66 61 75 6c 74 20 6c  ems] isdefault l
21f0: 61 73 74 64 65 66 61 75 6c 74 6f 6e 74 72 75 6e  astdefaultontrun
2200: 6b 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 38 20  k...log write 8 
2210: 63 73 65 74 73 20 7b 4c 4f 44 20 20 20 20 27 24  csets {LOD    '$
2220: 6c 6f 64 6e 61 6d 65 27 7d 0a 09 6c 6f 67 20 77  lodname'}..log w
2230: 72 69 74 65 20 38 20 63 73 65 74 73 20 7b 20 64  rite 8 csets { d
2240: 65 66 3f 20 20 24 69 73 64 65 66 61 75 6c 74 7d  ef?  $isdefault}
2250: 0a 09 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73  ..log write 8 cs
2260: 65 74 73 20 7b 20 6c 61 73 74 3f 20 24 6c 61 73  ets { last? $las
2270: 74 64 65 66 61 75 6c 74 6f 6e 74 72 75 6e 6b 7d  tdefaultontrunk}
2280: 0a 0a 09 73 65 74 20 6c 77 73 20 20 5b 47 65 74  ...set lws  [Get
2290: 77 6f 72 6b 73 70 61 63 65 20 20 20 20 24 72 73  workspace    $rs
22a0: 74 61 74 65 20 24 6c 6f 64 6e 61 6d 65 20 24 6d  tate $lodname $m
22b0: 79 70 72 6f 6a 65 63 74 20 24 69 73 64 65 66 61  yproject $isdefa
22c0: 75 6c 74 5d 0a 09 24 6c 77 73 20 61 64 64 20 5b  ult]..$lws add [
22d0: 47 65 74 72 65 76 69 73 69 6f 6e 69 6e 66 6f 20  Getrevisioninfo 
22e0: 24 6d 79 69 74 65 6d 73 5d 0a 0a 09 73 65 74 20  $myitems]...set 
22f0: 75 75 69 64 20 5b 24 72 65 70 6f 73 69 74 6f 72  uuid [$repositor
2300: 79 20 69 6d 70 6f 72 74 72 65 76 69 73 69 6f 6e  y importrevision
2310: 20 5b 24 73 65 6c 66 20 73 74 72 5d 20 5c 0a 09   [$self str] \..
2320: 09 20 20 20 20 20 20 24 75 73 65 72 20 24 6d 65  .      $user $me
2330: 73 73 61 67 65 20 24 64 61 74 65 20 5c 0a 09 09  ssage $date \...
2340: 20 20 20 20 20 20 5b 24 6c 77 73 20 67 65 74 69        [$lws geti
2350: 64 5d 20 5b 24 6c 77 73 20 67 65 74 5d 5d 0a 0a  d] [$lws get]]..
2360: 09 23 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20  .# Remember the 
2370: 69 6d 70 6f 72 74 65 64 20 63 68 61 6e 67 65 73  imported changes
2380: 65 74 20 69 6e 20 74 68 65 20 73 74 61 74 65 2c  et in the state,
2390: 20 75 6e 64 65 72 20 6f 75 72 0a 09 23 20 4c 4f   under our..# LO
23a0: 44 2e 20 41 6e 64 20 69 66 20 69 74 20 69 73 20  D. And if it is 
23b0: 74 68 65 20 6c 61 73 74 20 74 72 75 6e 6b 20 63  the last trunk c
23c0: 68 61 6e 67 65 73 65 74 20 6f 6e 20 74 68 65 20  hangeset on the 
23d0: 76 65 6e 64 6f 72 0a 09 23 20 62 72 61 6e 63 68  vendor..# branch
23e0: 20 74 68 65 6e 20 74 68 65 20 72 65 76 69 73 69   then the revisi
23f0: 6f 6e 20 69 73 20 61 6c 73 6f 20 74 68 65 20 61  on is also the a
2400: 63 74 75 61 6c 20 72 6f 6f 74 20 6f 66 20 74 68  ctual root of th
2410: 65 0a 09 23 20 3a 74 72 75 6e 6b 3a 2c 20 73 6f  e..# :trunk:, so
2420: 20 77 65 20 72 65 6d 65 6d 62 65 72 20 69 74 20   we remember it 
2430: 61 73 20 73 75 63 68 20 69 6e 20 74 68 65 20 73  as such in the s
2440: 74 61 74 65 2e 20 48 6f 77 65 76 65 72 20 69 66  tate. However if
2450: 0a 09 23 20 74 68 65 20 74 72 75 6e 6b 20 61 6c  ..# the trunk al
2460: 72 65 61 64 79 20 65 78 69 73 74 73 20 74 68 65  ready exists the
2470: 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 20  n the changeset 
2480: 63 61 6e 6e 6f 74 20 62 65 20 6f 6e 20 69 74 0a  cannot be on it.
2490: 09 23 20 61 6e 79 20 6d 6f 72 65 2e 20 54 68 69  .# any more. Thi
24a0: 73 20 69 6e 64 69 63 61 74 65 73 20 77 65 69 72  s indicates weir
24b0: 64 6e 65 73 73 20 69 6e 20 74 68 65 20 73 65 74  dness in the set
24c0: 75 70 20 6f 66 20 74 68 65 0a 09 23 20 76 65 6e  up of the..# ven
24d0: 64 6f 72 20 62 72 61 6e 63 68 2c 20 62 75 74 20  dor branch, but 
24e0: 6f 6e 65 20 77 65 20 63 61 6e 20 77 6f 72 6b 20  one we can work 
24f0: 61 72 6f 75 6e 64 2e 0a 0a 09 24 6c 77 73 20 64  around....$lws d
2500: 65 66 69 64 20 24 75 75 69 64 0a 09 69 66 20 7b  efid $uuid..if {
2510: 24 6c 61 73 74 64 65 66 61 75 6c 74 6f 6e 74 72  $lastdefaultontr
2520: 75 6e 6b 7d 20 7b 0a 09 20 20 20 20 69 66 20 7b  unk} {..    if {
2530: 5b 24 72 73 74 61 74 65 20 68 61 73 20 3a 74 72  [$rstate has :tr
2540: 75 6e 6b 3a 5d 7d 20 7b 0a 09 09 6c 6f 67 20 77  unk:]} {...log w
2550: 72 69 74 65 20 32 20 63 73 65 74 73 20 7b 4d 75  rite 2 csets {Mu
2560: 6c 74 69 70 6c 65 20 63 68 61 6e 67 65 73 65 74  ltiple changeset
2570: 73 20 64 65 63 6c 61 72 65 64 20 74 6f 20 62 65  s declared to be
2580: 20 74 68 65 20 6c 61 73 74 20 74 72 75 6e 6b 20   the last trunk 
2590: 63 68 61 6e 67 65 73 65 74 20 6f 6e 20 74 68 65  changeset on the
25a0: 20 76 65 6e 64 6f 72 2d 62 72 61 6e 63 68 7d 0a   vendor-branch}.
25b0: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
25c0: 24 72 73 74 61 74 65 20 6e 65 77 20 3a 74 72 75  $rstate new :tru
25d0: 6e 6b 3a 20 5b 24 6c 77 73 20 6e 61 6d 65 5d 0a  nk: [$lws name].
25e0: 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 23 20 52 65  .    }..}...# Re
25f0: 6d 65 6d 62 65 72 20 74 68 65 20 77 68 6f 6c 65  member the whole
2600: 20 63 68 61 6e 67 65 73 65 74 20 2f 20 75 75 69   changeset / uui
2610: 64 20 6d 61 70 70 69 6e 67 2c 20 66 6f 72 20 74  d mapping, for t
2620: 68 65 20 74 61 67 73 2e 0a 0a 09 73 74 61 74 65  he tags....state
2630: 20 72 75 6e 20 7b 0a 09 20 20 20 20 49 4e 53 45   run {..    INSE
2640: 52 54 20 49 4e 54 4f 20 63 73 75 75 69 64 20 28  RT INTO csuuid (
2650: 63 69 64 2c 20 20 20 75 75 69 64 29 0a 09 20 20  cid,   uuid)..  
2660: 20 20 56 41 4c 55 45 53 20 20 20 20 20 20 20 20    VALUES        
2670: 20 20 20 20 20 28 24 6d 79 69 64 2c 20 24 75 75       ($myid, $uu
2680: 69 64 29 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20  id)..}..return. 
2690: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 47     }..    proc G
26a0: 65 74 72 65 76 69 73 69 6f 6e 69 6e 66 6f 20 7b  etrevisioninfo {
26b0: 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 73 65  revisions} {..se
26c0: 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e  t theset ('[join
26d0: 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27   $revisions {','
26e0: 7d 5d 27 29 0a 09 73 65 74 20 72 65 76 69 73 69  }]')..set revisi
26f0: 6f 6e 73 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20  ons {}..foreach 
2700: 7b 66 72 69 64 20 70 61 74 68 20 66 6e 61 6d 65  {frid path fname
2710: 20 72 65 76 6e 72 20 72 6f 70 7d 20 5b 73 74 61   revnr rop} [sta
2720: 74 65 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e  te run [subst -n
2730: 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63  ocommands -nobac
2740: 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20 20 20  kslashes {..    
2750: 53 45 4c 45 43 54 20 55 2e 75 75 69 64 2c 20 46  SELECT U.uuid, F
2760: 2e 76 69 73 69 62 6c 65 2c 20 46 2e 6e 61 6d 65  .visible, F.name
2770: 2c 20 52 2e 72 65 76 2c 20 52 2e 6f 70 0a 09 20  , R.rev, R.op.. 
2780: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69     FROM   revisi
2790: 6f 6e 20 52 2c 20 72 65 76 75 75 69 64 20 55 2c  on R, revuuid U,
27a0: 20 66 69 6c 65 20 46 0a 09 20 20 20 20 57 48 45   file F..    WHE
27b0: 52 45 20 20 52 2e 72 69 64 20 49 4e 20 24 74 68  RE  R.rid IN $th
27c0: 65 73 65 74 20 20 2d 2d 20 41 6c 6c 20 73 70 65  eset  -- All spe
27d0: 63 69 66 69 65 64 20 72 65 76 69 73 69 6f 6e 73  cified revisions
27e0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 55 2e 72  ..    AND    U.r
27f0: 69 64 20 3d 20 52 2e 72 69 64 20 20 20 20 20 2d  id = R.rid     -
2800: 2d 20 67 65 74 20 66 6f 73 73 69 6c 20 75 75 69  - get fossil uui
2810: 64 20 6f 66 20 72 65 76 69 73 69 6f 6e 0a 09 20  d of revision.. 
2820: 20 20 20 41 4e 44 20 20 20 20 46 2e 66 69 64 20     AND    F.fid 
2830: 3d 20 52 2e 66 69 64 20 20 20 20 20 2d 2d 20 67  = R.fid     -- g
2840: 65 74 20 66 69 6c 65 20 6f 66 20 72 65 76 69 73  et file of revis
2850: 69 6f 6e 0a 09 7d 5d 5d 20 7b 0a 09 20 20 20 20  ion..}]] {..    
2860: 6c 61 70 70 65 6e 64 20 72 65 76 69 73 69 6f 6e  lappend revision
2870: 73 20 24 66 72 69 64 20 24 70 61 74 68 20 24 66  s $frid $path $f
2880: 6e 61 6d 65 2f 24 72 65 76 6e 72 20 24 72 6f 70  name/$revnr $rop
2890: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 24 72 65 76  ..}..return $rev
28a0: 69 73 69 6f 6e 73 0a 20 20 20 20 7d 0a 0a 20 20  isions.    }..  
28b0: 20 20 70 72 6f 63 20 47 65 74 77 6f 72 6b 73 70    proc Getworksp
28c0: 61 63 65 20 7b 72 73 74 61 74 65 20 6c 6f 64 6e  ace {rstate lodn
28d0: 61 6d 65 20 70 72 6f 6a 65 63 74 20 69 73 64 65  ame project isde
28e0: 66 61 75 6c 74 7d 20 7b 0a 0a 09 23 20 54 68 65  fault} {...# The
28f0: 20 73 74 61 74 65 20 6f 62 6a 65 63 74 20 68 6f   state object ho
2900: 6c 64 73 20 74 68 65 20 77 6f 72 6b 73 70 61 63  lds the workspac
2910: 65 20 73 74 61 74 65 20 6f 66 20 65 61 63 68 20  e state of each 
2920: 6b 6e 6f 77 6e 0a 09 23 20 6c 69 6e 65 2d 6f 66  known..# line-of
2930: 2d 64 65 76 65 6c 6f 70 6d 65 6e 74 20 28 4c 4f  -development (LO
2940: 44 29 2c 20 75 70 20 74 6f 20 74 68 65 20 6c 61  D), up to the la
2950: 73 74 20 63 6f 6d 6d 69 74 74 65 64 0a 09 23 20  st committed..# 
2960: 63 68 61 6e 67 65 73 65 74 20 62 65 6c 6f 6e 67  changeset belong
2970: 69 6e 67 20 74 6f 20 74 68 61 74 20 4c 4f 44 2e  ing to that LOD.
2980: 0a 0a 09 23 20 28 2a 29 20 53 74 61 6e 64 61 72  ...# (*) Standar
2990: 64 20 68 61 6e 64 6c 69 6e 67 20 69 66 20 69 6e  d handling if in
29a0: 2d 4c 4f 44 20 63 68 61 6e 67 65 73 65 74 73 2e  -LOD changesets.
29b0: 20 49 66 20 74 68 65 20 4c 4f 44 20 6f 66 0a 09   If the LOD of..
29c0: 23 20 20 20 20 20 74 68 65 20 63 75 72 72 65 6e  #     the curren
29d0: 74 20 63 68 61 6e 67 65 73 65 74 20 65 78 69 73  t changeset exis
29e0: 74 73 20 69 6e 20 74 68 65 20 73 74 61 74 65 20  ts in the state 
29f0: 28 3d 20 68 61 73 20 62 65 65 6e 0a 09 23 20 20  (= has been..#  
2a00: 20 20 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 29     committed to)
2a10: 20 74 68 65 6e 20 74 68 69 73 20 69 74 20 68 61   then this it ha
2a20: 73 20 74 68 65 20 77 6f 72 6b 73 70 61 63 65 20  s the workspace 
2a30: 77 65 20 61 72 65 0a 09 23 20 20 20 20 20 6c 6f  we are..#     lo
2a40: 6f 6b 69 6e 67 20 66 6f 72 2e 0a 0a 09 69 66 20  oking for....if 
2a50: 7b 5b 24 72 73 74 61 74 65 20 68 61 73 20 24 6c  {[$rstate has $l
2a60: 6f 64 6e 61 6d 65 5d 7d 20 7b 0a 09 20 20 20 20  odname]} {..    
2a70: 72 65 74 75 72 6e 20 5b 24 72 73 74 61 74 65 20  return [$rstate 
2a80: 67 65 74 20 24 6c 6f 64 6e 61 6d 65 5d 0a 09 7d  get $lodname]..}
2a90: 0a 0a 09 23 20 49 66 20 74 68 65 20 4c 4f 44 20  ...# If the LOD 
2aa0: 69 73 20 68 6f 77 65 76 65 72 20 6e 6f 74 20 79  is however not y
2ab0: 65 74 20 6b 6e 6f 77 6e 2c 20 74 68 65 6e 20 74  et known, then t
2ac0: 68 65 20 63 75 72 72 65 6e 74 0a 09 23 20 63 68  he current..# ch
2ad0: 61 6e 67 65 73 65 74 20 63 61 6e 20 62 65 20 65  angeset can be e
2ae0: 69 74 68 65 72 20 6f 66 0a 09 23 20 28 61 29 20  ither of..# (a) 
2af0: 72 6f 6f 74 20 6f 66 20 61 20 76 65 6e 64 6f 72  root of a vendor
2b00: 20 62 72 61 6e 63 68 2c 0a 09 23 20 28 62 29 20   branch,..# (b) 
2b10: 72 6f 6f 74 20 6f 66 20 74 68 65 20 74 72 75 6e  root of the trun
2b20: 6b 20 4c 4f 44 2c 20 6f 72 0a 09 23 20 28 63 29  k LOD, or..# (c)
2b30: 20 74 68 65 20 66 69 72 73 74 20 63 68 61 6e 67   the first chang
2b40: 65 73 65 74 20 69 6e 20 61 20 6e 65 77 20 4c 4f  eset in a new LO
2b50: 44 20 77 68 69 63 68 20 77 61 73 20 73 70 61 77  D which was spaw
2b60: 6e 65 64 20 66 72 6f 6d 0a 09 23 20 20 20 20 20  ned from..#     
2b70: 61 6e 20 65 78 69 73 74 69 6e 67 20 4c 4f 44 2e  an existing LOD.
2b80: 0a 0a 09 23 20 46 6f 72 20 62 6f 74 68 20 28 61  ...# For both (a
2b90: 29 20 61 6e 64 20 28 62 29 20 77 65 20 68 61 76  ) and (b) we hav
2ba0: 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65  e to create a ne
2bb0: 77 20 77 6f 72 6b 73 70 61 63 65 20 66 6f 72 0a  w workspace for.
2bc0: 09 23 20 74 68 65 20 6c 6f 64 2c 20 61 6e 64 20  .# the lod, and 
2bd0: 69 74 20 64 6f 65 73 6e 27 74 20 69 6e 68 65 72  it doesn't inher
2be0: 69 74 20 66 72 6f 6d 20 61 6e 79 74 68 69 6e 67  it from anything
2bf0: 2e 0a 0a 09 23 20 4f 6e 65 20 65 78 63 65 70 74  ....# One except
2c00: 69 6f 6e 20 66 6f 72 20 28 61 29 2e 20 49 66 20  ion for (a). If 
2c10: 77 65 20 61 6c 72 65 61 64 79 20 68 61 76 65 20  we already have 
2c20: 61 20 3a 76 65 6e 64 6f 72 3a 20 62 72 61 6e 63  a :vendor: branc
2c30: 68 0a 09 23 20 74 68 65 6e 20 6d 75 6c 74 69 70  h..# then multip
2c40: 6c 65 20 73 79 6d 62 6f 6c 73 20 77 65 72 65 20  le symbols were 
2c50: 75 73 65 64 20 66 6f 72 20 74 68 65 20 76 65 6e  used for the ven
2c60: 64 6f 72 20 62 72 61 6e 63 68 20 62 79 0a 09 23  dor branch by..#
2c70: 20 64 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73   different files
2c80: 2e 20 49 6e 20 74 68 61 74 20 63 61 73 65 20 74  . In that case t
2c90: 68 65 20 27 6e 65 77 27 20 62 72 61 6e 63 68 20  he 'new' branch 
2ca0: 69 73 20 6d 61 64 65 20 61 6e 0a 09 23 20 61 6c  is made an..# al
2cb0: 69 61 73 20 6f 66 20 74 68 65 20 3a 76 65 6e 64  ias of the :vend
2cc0: 6f 72 3a 2c 20 65 66 66 65 63 74 69 76 65 6c 79  or:, effectively
2cd0: 20 6d 65 72 67 69 6e 67 20 74 68 65 20 73 79 6d   merging the sym
2ce0: 62 6f 6c 73 0a 09 23 20 74 6f 67 65 74 68 65 72  bols..# together
2cf0: 2e 0a 0a 09 23 20 4e 6f 74 65 20 74 68 61 74 20  ....# Note that 
2d00: 63 61 73 65 20 28 62 29 20 6d 61 79 20 6e 65 76  case (b) may nev
2d10: 65 72 20 6f 63 63 75 72 2e 20 53 65 65 20 74 68  er occur. See th
2d20: 65 20 76 61 72 69 61 62 6c 65 0a 09 23 20 27 6c  e variable..# 'l
2d30: 61 73 74 64 65 66 61 75 6c 74 6f 6e 74 72 75 6e  astdefaultontrun
2d40: 6b 27 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72  k' in the caller
2d50: 20 28 6d 65 74 68 6f 64 20 70 75 73 68 74 6f 29   (method pushto)
2d60: 2e 20 54 68 69 73 0a 09 23 20 66 6c 61 67 20 63  . This..# flag c
2d70: 61 6e 20 74 68 65 20 67 65 6e 65 72 61 74 69 6f  an the generatio
2d80: 6e 20 6f 66 20 74 68 65 20 77 6f 72 6b 73 70 61  n of the workspa
2d90: 63 65 20 66 6f 72 20 74 68 65 20 3a 74 72 75 6e  ce for the :trun
2da0: 6b 3a 20 4c 4f 44 0a 09 23 20 61 73 20 77 65 6c  k: LOD..# as wel
2db0: 6c 2c 20 6d 61 6b 69 6e 67 20 69 74 20 69 6e 68  l, making it inh
2dc0: 65 72 69 74 20 74 68 65 20 73 74 61 74 65 20 6f  erit the state o
2dd0: 66 20 74 68 65 20 6c 61 73 74 0a 09 23 20 74 72  f the last..# tr
2de0: 75 6e 6b 2d 63 68 61 6e 67 65 73 65 74 20 6f 6e  unk-changeset on
2df0: 20 74 68 65 20 76 65 6e 64 6f 72 2d 62 72 61 6e   the vendor-bran
2e00: 63 68 2e 0a 0a 09 69 66 20 7b 24 69 73 64 65 66  ch....if {$isdef
2e10: 61 75 6c 74 7d 20 7b 0a 09 20 20 20 20 69 66 20  ault} {..    if 
2e20: 7b 21 5b 24 72 73 74 61 74 65 20 68 61 73 20 22  {![$rstate has "
2e30: 3a 76 65 6e 64 6f 72 3a 22 5d 7d 20 7b 0a 09 09  :vendor:"]} {...
2e40: 23 20 43 72 65 61 74 65 20 74 68 65 20 76 65 6e  # Create the ven
2e50: 64 6f 72 20 62 72 61 6e 63 68 20 69 66 20 6e 6f  dor branch if no
2e60: 74 20 70 72 65 73 65 6e 74 20 61 6c 72 65 61 64  t present alread
2e70: 79 2e 0a 09 09 24 72 73 74 61 74 65 20 6e 65 77  y....$rstate new
2e80: 20 3a 76 65 6e 64 6f 72 3a 0a 09 20 20 20 20 7d   :vendor:..    }
2e90: 0a 09 20 20 20 20 23 20 4d 65 72 67 65 20 74 68  ..    # Merge th
2ea0: 65 20 6e 65 77 20 73 79 6d 62 6f 6c 20 74 6f 20  e new symbol to 
2eb0: 74 68 65 20 76 65 6e 64 6f 72 20 62 72 61 6e 63  the vendor branc
2ec0: 68 0a 09 20 20 20 20 24 72 73 74 61 74 65 20 64  h..    $rstate d
2ed0: 75 70 20 24 6c 6f 64 6e 61 6d 65 20 3c 2d 2d 20  up $lodname <-- 
2ee0: 3a 76 65 6e 64 6f 72 3a 0a 09 20 20 20 20 72 65  :vendor:..    re
2ef0: 74 75 72 6e 20 5b 24 72 73 74 61 74 65 20 67 65  turn [$rstate ge
2f00: 74 20 24 6c 6f 64 6e 61 6d 65 5d 0a 09 7d 0a 0a  t $lodname]..}..
2f10: 09 69 66 20 7b 24 6c 6f 64 6e 61 6d 65 20 65 71  .if {$lodname eq
2f20: 20 22 3a 74 72 75 6e 6b 3a 22 7d 20 7b 0a 09 20   ":trunk:"} {.. 
2f30: 20 20 20 72 65 74 75 72 6e 20 5b 24 72 73 74 61     return [$rsta
2f40: 74 65 20 6e 65 77 20 24 6c 6f 64 6e 61 6d 65 5d  te new $lodname]
2f50: 0a 09 7d 0a 0a 09 23 20 43 61 73 65 20 28 63 29  ..}...# Case (c)
2f60: 2e 20 57 65 20 66 69 6e 64 20 74 68 65 20 70 61  . We find the pa
2f70: 72 65 6e 74 20 4c 4f 44 20 6f 66 20 6f 75 72 20  rent LOD of our 
2f80: 4c 4f 44 20 61 6e 64 20 6c 65 74 20 74 68 65 20  LOD and let the 
2f90: 6e 65 77 0a 09 23 20 77 6f 72 6b 73 70 61 63 65  new..# workspace
2fa0: 20 69 6e 68 65 72 69 74 20 66 72 6f 6d 20 74 68   inherit from th
2fb0: 65 20 70 61 72 65 6e 74 27 73 20 77 6f 72 6b 73  e parent's works
2fc0: 70 61 63 65 2e 0a 0a 09 73 65 74 20 70 6c 6f 64  pace....set plod
2fd0: 6e 61 6d 65 20 5b 5b 5b 24 70 72 6f 6a 65 63 74  name [[[$project
2fe0: 20 67 65 74 73 79 6d 62 6f 6c 20 24 6c 6f 64 6e   getsymbol $lodn
2ff0: 61 6d 65 5d 20 70 61 72 65 6e 74 5d 20 6e 61 6d  ame] parent] nam
3000: 65 5d 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 38  e]...log write 8
3010: 20 63 73 65 74 73 20 7b 70 4c 4f 44 20 20 20 27   csets {pLOD   '
3020: 24 70 6c 6f 64 6e 61 6d 65 27 7d 0a 0a 09 69 66  $plodname'}...if
3030: 20 7b 5b 24 72 73 74 61 74 65 20 68 61 73 20 24   {[$rstate has $
3040: 70 6c 6f 64 6e 61 6d 65 5d 7d 20 7b 0a 09 20 20  plodname]} {..  
3050: 20 20 72 65 74 75 72 6e 20 5b 24 72 73 74 61 74    return [$rstat
3060: 65 20 6e 65 77 20 24 6c 6f 64 6e 61 6d 65 20 24  e new $lodname $
3070: 70 6c 6f 64 6e 61 6d 65 5d 0a 09 7d 0a 0a 09 66  plodname]..}...f
3080: 6f 72 65 61 63 68 20 6b 20 5b 6c 73 6f 72 74 20  oreach k [lsort 
3090: 5b 24 72 73 74 61 74 65 20 6e 61 6d 65 73 5d 5d  [$rstate names]]
30a0: 20 7b 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74   {..    log writ
30b0: 65 20 38 20 63 73 65 74 73 20 7b 20 20 20 20 24  e 8 csets {    $
30c0: 6b 20 3d 20 5b 5b 24 72 73 74 61 74 65 20 67 65  k = [[$rstate ge
30d0: 74 20 24 6b 5d 20 67 65 74 69 64 5d 7d 0a 09 7d  t $k] getid]}..}
30e0: 0a 0a 09 74 72 6f 75 62 6c 65 20 69 6e 74 65 72  ...trouble inter
30f0: 6e 61 6c 20 7b 55 6e 61 62 6c 65 20 74 6f 20 64  nal {Unable to d
3100: 65 74 65 72 6d 69 6e 65 20 63 68 61 6e 67 65 73  etermine changes
3110: 65 74 20 70 61 72 65 6e 74 7d 0a 09 72 65 74 75  et parent}..retu
3120: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72  rn.    }..    pr
3130: 6f 63 20 47 65 74 69 73 64 65 66 61 75 6c 74 20  oc Getisdefault 
3140: 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 73  {revisions} {..s
3150: 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69  et theset ('[joi
3160: 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c  n $revisions {',
3170: 27 7d 5d 27 29 0a 0a 09 73 74 72 75 63 74 3a 3a  '}]')...struct::
3180: 6c 69 73 74 20 61 73 73 69 67 6e 20 5b 73 74 61  list assign [sta
3190: 74 65 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e  te run [subst -n
31a0: 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63  ocommands -nobac
31b0: 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20 20 20  kslashes {..    
31c0: 53 45 4c 45 43 54 20 52 2e 69 73 64 65 66 61 75  SELECT R.isdefau
31d0: 6c 74 2c 20 52 2e 64 62 63 68 69 6c 64 0a 09 20  lt, R.dbchild.. 
31e0: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69     FROM   revisi
31f0: 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20  on R..    WHERE 
3200: 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65   R.rid IN $these
3210: 74 20 20 2d 2d 20 41 6c 6c 20 73 70 65 63 69 66  t  -- All specif
3220: 69 65 64 20 72 65 76 69 73 69 6f 6e 73 0a 09 20  ied revisions.. 
3230: 20 20 20 4c 49 4d 49 54 20 31 0a 09 7d 5d 5d 20     LIMIT 1..}]] 
3240: 64 65 66 20 6c 61 73 74 0a 0a 09 23 20 54 4f 44  def last...# TOD
3250: 4f 2f 43 48 45 43 4b 3a 20 6c 6f 6f 6b 20 66 6f  O/CHECK: look fo
3260: 72 20 63 68 61 6e 67 65 73 65 74 73 20 77 68 65  r changesets whe
3270: 72 65 20 69 73 64 65 66 61 75 6c 74 2f 64 62 63  re isdefault/dbc
3280: 68 69 6c 64 20 69 73 0a 09 23 20 61 6d 62 69 67  hild is..# ambig
3290: 6f 75 73 2e 0a 0a 09 72 65 74 75 72 6e 20 5b 6c  ous....return [l
32a0: 69 73 74 20 24 64 65 66 20 5b 65 78 70 72 20 7b  ist $def [expr {
32b0: 24 6c 61 73 74 20 6e 65 20 22 22 7d 5d 5d 0a 20  $last ne ""}]]. 
32c0: 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65     }..    typeme
32d0: 74 68 6f 64 20 73 70 6c 69 74 20 7b 63 73 65 74  thod split {cset
32e0: 20 61 72 67 73 7d 20 7b 0a 09 23 20 41 73 20 70   args} {..# As p
32f0: 61 72 74 20 6f 66 20 74 68 65 20 63 72 65 61 74  art of the creat
3300: 69 6f 6e 20 6f 66 20 74 68 65 20 6e 65 77 20 63  ion of the new c
3310: 68 61 6e 67 65 73 65 74 73 20 73 70 65 63 69 66  hangesets specif
3320: 69 65 64 20 69 6e 0a 09 23 20 41 52 47 53 20 61  ied in..# ARGS a
3330: 73 20 73 65 74 73 20 6f 66 20 69 74 65 6d 73 2c  s sets of items,
3340: 20 61 6c 6c 20 73 75 62 73 65 74 73 20 6f 66 20   all subsets of 
3350: 43 53 45 54 27 73 20 69 74 65 6d 20 73 65 74 2c  CSET's item set,
3360: 20 43 53 45 54 0a 09 23 20 77 69 6c 6c 20 62 65   CSET..# will be
3370: 20 64 72 6f 70 70 65 64 20 66 72 6f 6d 20 61 6c   dropped from al
3380: 6c 20 64 61 74 61 62 61 73 65 73 2c 20 69 6e 20  l databases, in 
3390: 61 6e 64 20 6f 75 74 20 6f 66 20 6d 65 6d 6f 72  and out of memor
33a0: 79 2c 0a 09 23 20 61 6e 64 20 74 68 65 6e 20 64  y,..# and then d
33b0: 65 73 74 72 6f 79 65 64 2e 0a 09 23 0a 09 23 20  estroyed...#..# 
33c0: 4e 6f 74 65 3a 20 54 68 65 20 69 74 65 6d 20 6c  Note: The item l
33d0: 69 73 74 73 20 66 6f 75 6e 64 20 69 6e 20 61 72  ists found in ar
33e0: 67 73 20 61 72 65 20 74 61 67 67 65 64 20 69 74  gs are tagged it
33f0: 65 6d 73 2e 20 54 68 65 79 0a 09 23 20 68 61 76  ems. They..# hav
3400: 65 20 74 6f 20 68 61 76 65 20 74 68 65 20 73 61  e to have the sa
3410: 6d 65 20 74 79 70 65 20 61 73 20 74 68 65 20 63  me type as the c
3420: 68 61 6e 67 65 73 65 74 2c 20 62 65 69 6e 67 20  hangeset, being 
3430: 73 75 62 73 65 74 73 0a 09 23 20 6f 66 20 69 74  subsets..# of it
3440: 73 20 69 74 65 6d 73 2e 20 54 68 69 73 20 69 73  s items. This is
3450: 20 63 68 65 63 6b 65 64 20 69 6e 20 55 6e 74 61   checked in Unta
3460: 67 31 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20  g1....log write 
3470: 38 20 63 73 65 74 73 20 7b 4f 4c 44 3a 20 5b 6c  8 csets {OLD: [l
3480: 73 6f 72 74 20 5b 24 63 73 65 74 20 69 74 65 6d  sort [$cset item
3490: 73 5d 5d 7d 0a 09 56 61 6c 69 64 61 74 65 46 72  s]]}..ValidateFr
34a0: 61 67 6d 65 6e 74 73 20 24 63 73 65 74 20 24 61  agments $cset $a
34b0: 72 67 73 0a 0a 09 23 20 41 6c 6c 20 63 68 65 63  rgs...# All chec
34c0: 6b 73 20 70 61 73 73 2c 20 61 63 74 75 61 6c 6c  ks pass, actuall
34d0: 79 20 70 65 72 66 6f 72 6d 20 74 68 65 20 73 70  y perform the sp
34e0: 6c 69 74 2e 0a 0a 09 73 74 72 75 63 74 3a 3a 6c  lit....struct::l
34f0: 69 73 74 20 61 73 73 69 67 6e 20 5b 24 63 73 65  ist assign [$cse
3500: 74 20 64 61 74 61 5d 20 70 72 6f 6a 65 63 74 20  t data] project 
3510: 63 73 74 79 70 65 20 63 73 73 72 63 0a 0a 09 73  cstype cssrc...s
3520: 65 74 20 70 72 65 64 65 63 65 73 73 6f 72 73 20  et predecessors 
3530: 5b 24 63 73 65 74 20 64 72 6f 70 5d 0a 09 24 63  [$cset drop]..$c
3540: 73 65 74 20 64 65 73 74 72 6f 79 0a 0a 09 73 65  set destroy...se
3550: 74 20 6e 65 77 63 73 65 74 73 20 7b 7d 0a 09 66  t newcsets {}..f
3560: 6f 72 65 61 63 68 20 66 72 61 67 6d 65 6e 74 69  oreach fragmenti
3570: 74 65 6d 73 20 24 61 72 67 73 20 7b 0a 09 20 20  tems $args {..  
3580: 20 20 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73    log write 8 cs
3590: 65 74 73 20 7b 4d 41 4b 45 3a 20 5b 6c 73 6f 72  ets {MAKE: [lsor
35a0: 74 20 24 66 72 61 67 6d 65 6e 74 69 74 65 6d 73  t $fragmentitems
35b0: 5d 7d 0a 0a 09 20 20 20 20 73 65 74 20 66 72 61  ]}...    set fra
35c0: 67 6d 65 6e 74 20 5b 24 74 79 70 65 20 25 41 55  gment [$type %AU
35d0: 54 4f 25 20 24 70 72 6f 6a 65 63 74 20 24 63 73  TO% $project $cs
35e0: 74 79 70 65 20 24 63 73 73 72 63 20 5c 0a 09 09  type $cssrc \...
35f0: 09 20 20 20 20 20 20 5b 55 6e 74 61 67 20 24 66  .      [Untag $f
3600: 72 61 67 6d 65 6e 74 69 74 65 6d 73 20 24 63 73  ragmentitems $cs
3610: 74 79 70 65 5d 5d 0a 09 20 20 20 20 6c 61 70 70  type]]..    lapp
3620: 65 6e 64 20 6e 65 77 63 73 65 74 73 20 24 66 72  end newcsets $fr
3630: 61 67 6d 65 6e 74 0a 0a 09 20 20 20 20 24 66 72  agment...    $fr
3640: 61 67 6d 65 6e 74 20 70 65 72 73 69 73 74 0a 09  agment persist..
3650: 20 20 20 20 24 66 72 61 67 6d 65 6e 74 20 64 65      $fragment de
3660: 74 65 72 6d 69 6e 65 73 75 63 63 65 73 73 6f 72  terminesuccessor
3670: 73 0a 09 7d 0a 0a 09 23 20 54 68 65 20 70 72 65  s..}...# The pre
3680: 64 65 63 65 73 73 6f 72 73 20 68 61 76 65 20 74  decessors have t
3690: 6f 20 72 65 63 6f 6d 70 75 74 65 20 74 68 65 69  o recompute thei
36a0: 72 20 73 75 63 63 65 73 73 6f 72 73 2c 20 69 2e  r successors, i.
36b0: 65 2e 0a 09 23 20 72 65 6d 6f 76 65 20 74 68 65  e...# remove the
36c0: 20 64 72 6f 70 70 65 64 20 63 68 61 6e 67 65 73   dropped changes
36d0: 65 74 20 61 6e 64 20 70 75 74 20 6f 6e 65 20 6f  et and put one o
36e0: 66 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 0a  f the fragments.
36f0: 09 23 20 69 6e 74 6f 20 69 74 73 20 70 6c 61 63  .# into its plac
3700: 65 2e 0a 09 66 6f 72 65 61 63 68 20 70 20 24 70  e...foreach p $p
3710: 72 65 64 65 63 65 73 73 6f 72 73 20 7b 0a 09 20  redecessors {.. 
3720: 20 20 20 24 70 20 64 65 74 65 72 6d 69 6e 65 73     $p determines
3730: 75 63 63 65 73 73 6f 72 73 0a 09 7d 0a 0a 09 72  uccessors..}...r
3740: 65 74 75 72 6e 20 24 6e 65 77 63 73 65 74 73 0a  eturn $newcsets.
3750: 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d      }..    typem
3760: 65 74 68 6f 64 20 69 74 65 6d 73 74 72 20 7b 69  ethod itemstr {i
3770: 74 65 6d 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a  tem} {..struct::
3780: 6c 69 73 74 20 61 73 73 69 67 6e 20 24 69 74 65  list assign $ite
3790: 6d 20 69 74 79 70 65 20 69 69 64 0a 09 72 65 74  m itype iid..ret
37a0: 75 72 6e 20 5b 24 69 74 79 70 65 20 73 74 72 20  urn [$itype str 
37b0: 24 69 69 64 5d 0a 20 20 20 20 7d 0a 0a 20 20 20  $iid].    }..   
37c0: 20 74 79 70 65 6d 65 74 68 6f 64 20 73 74 72 6c   typemethod strl
37d0: 69 73 74 20 7b 63 68 61 6e 67 65 73 65 74 73 7d  ist {changesets}
37e0: 20 7b 0a 09 72 65 74 75 72 6e 20 5b 6a 6f 69 6e   {..return [join
37f0: 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d   [struct::list m
3800: 61 70 20 24 63 68 61 6e 67 65 73 65 74 73 20 5b  ap $changesets [
3810: 6d 79 70 72 6f 63 20 49 44 5d 5d 5d 0a 20 20 20  myproc ID]]].   
3820: 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 49 44 20   }..    proc ID 
3830: 7b 63 73 65 74 7d 20 7b 20 24 63 73 65 74 20 73  {cset} { $cset s
3840: 74 72 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 55  tr }..    proc U
3850: 6e 74 61 67 20 7b 74 61 67 67 65 64 69 74 65 6d  ntag {taggeditem
3860: 73 20 63 73 74 79 70 65 7d 20 7b 0a 09 72 65 74  s cstype} {..ret
3870: 75 72 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73  urn [struct::lis
3880: 74 20 6d 61 70 20 24 74 61 67 67 65 64 69 74 65  t map $taggedite
3890: 6d 73 20 5b 6d 79 70 72 6f 63 20 55 6e 74 61 67  ms [myproc Untag
38a0: 31 20 24 63 73 74 79 70 65 5d 5d 0a 20 20 20 20  1 $cstype]].    
38b0: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 55 6e 74 61  }..    proc Unta
38c0: 67 31 20 7b 63 73 74 79 70 65 20 74 68 65 69 74  g1 {cstype theit
38d0: 65 6d 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c  em} {..struct::l
38e0: 69 73 74 20 61 73 73 69 67 6e 20 24 74 68 65 69  ist assign $thei
38f0: 74 65 6d 20 74 20 69 0a 09 69 6e 74 65 67 72 69  tem t i..integri
3900: 74 79 20 61 73 73 65 72 74 20 7b 24 63 73 74 79  ty assert {$csty
3910: 70 65 20 65 71 20 24 74 7d 20 7b 49 74 65 6d 20  pe eq $t} {Item 
3920: 24 69 27 73 20 74 79 70 65 20 69 73 20 27 24 74  $i's type is '$t
3930: 27 2c 20 65 78 70 65 63 74 65 64 20 27 24 63 73  ', expected '$cs
3940: 74 79 70 65 27 7d 0a 09 72 65 74 75 72 6e 20 24  type'}..return $
3950: 69 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f  i.    }..    pro
3960: 63 20 54 61 67 49 74 65 6d 44 69 63 74 20 7b 69  c TagItemDict {i
3970: 74 65 6d 64 69 63 74 20 63 73 74 79 70 65 7d 20  temdict cstype} 
3980: 7b 0a 09 73 65 74 20 72 65 73 20 7b 7d 0a 09 66  {..set res {}..f
3990: 6f 72 65 61 63 68 20 7b 69 20 76 7d 20 24 69 74  oreach {i v} $it
39a0: 65 6d 64 69 63 74 20 7b 20 6c 61 70 70 65 6e 64  emdict { lappend
39b0: 20 72 65 73 20 5b 6c 69 73 74 20 24 63 73 74 79   res [list $csty
39c0: 70 65 20 24 69 5d 20 24 76 20 7d 0a 09 72 65 74  pe $i] $v }..ret
39d0: 75 72 6e 20 24 72 65 73 0a 20 20 20 20 7d 0a 0a  urn $res.    }..
39e0: 20 20 20 20 70 72 6f 63 20 56 61 6c 69 64 61 74      proc Validat
39f0: 65 46 72 61 67 6d 65 6e 74 73 20 7b 63 73 65 74  eFragments {cset
3a00: 20 66 72 61 67 6d 65 6e 74 73 7d 20 7b 0a 09 23   fragments} {..#
3a10: 20 43 68 65 63 6b 20 74 68 65 20 76 61 72 69 6f   Check the vario
3a20: 75 73 20 69 6e 74 65 67 72 69 74 79 20 63 6f 6e  us integrity con
3a30: 73 74 72 61 69 6e 74 73 20 66 6f 72 20 74 68 65  straints for the
3a40: 20 66 72 61 67 6d 65 6e 74 73 0a 09 23 20 73 70   fragments..# sp
3a50: 65 63 69 66 79 69 6e 67 20 68 6f 77 20 74 6f 20  ecifying how to 
3a60: 73 70 6c 69 74 20 74 68 65 20 63 68 61 6e 67 65  split the change
3a70: 73 65 74 3a 0a 09 23 0a 09 23 20 2a 20 57 65 20  set:..#..# * We 
3a80: 6d 75 73 74 20 68 61 76 65 20 74 77 6f 20 6f 72  must have two or
3a90: 20 6d 6f 72 65 20 66 72 61 67 6d 65 6e 74 73 2c   more fragments,
3aa0: 20 61 73 20 73 70 6c 69 74 74 69 6e 67 20 61 0a   as splitting a.
3ab0: 09 23 20 20 20 63 68 61 6e 67 65 73 65 74 20 69  .#   changeset i
3ac0: 6e 74 6f 20 6f 6e 65 20 6d 61 6b 65 73 20 6e 6f  nto one makes no
3ad0: 20 73 65 6e 73 65 2e 0a 09 23 20 2a 20 4e 6f 20   sense...# * No 
3ae0: 66 72 61 67 6d 65 6e 74 20 6d 61 79 20 62 65 20  fragment may be 
3af0: 65 6d 70 74 79 2e 0a 09 23 20 2a 20 41 6c 6c 20  empty...# * All 
3b00: 66 72 61 67 6d 65 6e 74 73 20 68 61 76 65 20 74  fragments have t
3b10: 6f 20 62 65 20 74 72 75 65 20 73 75 62 73 65 74  o be true subset
3b20: 73 20 6f 66 20 74 68 65 20 69 74 65 6d 73 20 69  s of the items i
3b30: 6e 20 74 68 65 0a 09 23 20 20 20 63 68 61 6e 67  n the..#   chang
3b40: 65 73 65 74 20 74 6f 20 73 70 6c 69 74 2e 20 54  eset to split. T
3b50: 68 65 20 27 74 72 75 65 27 20 69 73 20 69 6d 70  he 'true' is imp
3b60: 6c 69 65 64 20 62 65 63 61 75 73 65 20 6e 6f 6e  lied because non
3b70: 65 20 61 72 65 0a 09 23 20 20 20 61 6c 6c 6f 77  e are..#   allow
3b80: 65 64 20 74 6f 20 62 65 20 65 6d 70 74 79 2c 20  ed to be empty, 
3b90: 73 6f 20 65 61 63 68 20 68 61 73 20 74 6f 20 62  so each has to b
3ba0: 65 20 73 6d 61 6c 6c 65 72 20 74 68 61 6e 20 74  e smaller than t
3bb0: 68 65 0a 09 23 20 20 20 74 6f 74 61 6c 2e 0a 09  he..#   total...
3bc0: 23 20 2a 20 54 68 65 20 75 6e 69 6f 6e 20 6f 66  # * The union of
3bd0: 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 20 68   the fragments h
3be0: 61 73 20 74 6f 20 62 65 20 74 68 65 20 69 74 65  as to be the ite
3bf0: 6d 20 73 65 74 20 6f 66 20 74 68 65 0a 09 23 20  m set of the..# 
3c00: 20 20 63 68 61 6e 67 65 73 65 74 2e 0a 09 23 20    changeset...# 
3c10: 2a 20 54 68 65 20 66 72 61 67 6d 65 6e 74 20 6d  * The fragment m
3c20: 75 73 74 20 6e 6f 74 20 6f 76 65 72 6c 61 70 2c  ust not overlap,
3c30: 20 69 2e 65 2e 20 74 68 65 69 72 20 70 61 69 72   i.e. their pair
3c40: 77 69 73 65 0a 09 23 20 20 20 69 6e 74 65 72 73  wise..#   inters
3c50: 65 63 74 69 6f 6e 73 20 68 61 76 65 20 74 6f 20  ections have to 
3c60: 62 65 20 65 6d 70 74 79 2e 0a 0a 09 73 65 74 20  be empty....set 
3c70: 63 6f 76 65 72 20 7b 7d 0a 09 66 6f 72 65 61 63  cover {}..foreac
3c80: 68 20 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 20  h fragmentitems 
3c90: 24 66 72 61 67 6d 65 6e 74 73 20 7b 0a 09 20 20  $fragments {..  
3ca0: 20 20 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73    log write 8 cs
3cb0: 65 74 73 20 7b 4e 45 57 3a 20 5b 6c 73 6f 72 74  ets {NEW: [lsort
3cc0: 20 24 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 5d   $fragmentitems]
3cd0: 7d 0a 0a 09 20 20 20 20 69 6e 74 65 67 72 69 74  }...    integrit
3ce0: 79 20 61 73 73 65 72 74 20 7b 0a 09 09 21 5b 73  y assert {...![s
3cf0: 74 72 75 63 74 3a 3a 73 65 74 20 65 6d 70 74 79  truct::set empty
3d00: 20 24 66 72 61 67 6d 65 6e 74 69 74 65 6d 73 5d   $fragmentitems]
3d10: 0a 09 20 20 20 20 7d 20 7b 63 68 61 6e 67 65 73  ..    } {changes
3d20: 65 74 20 66 72 61 67 6d 65 6e 74 20 69 73 20 65  et fragment is e
3d30: 6d 70 74 79 7d 0a 0a 09 20 20 20 20 69 6e 74 65  mpty}...    inte
3d40: 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 0a 09  grity assert {..
3d50: 09 5b 73 74 72 75 63 74 3a 3a 73 65 74 20 73 75  .[struct::set su
3d60: 62 73 65 74 6f 66 20 24 66 72 61 67 6d 65 6e 74  bsetof $fragment
3d70: 69 74 65 6d 73 20 5b 24 63 73 65 74 20 69 74 65  items [$cset ite
3d80: 6d 73 5d 5d 0a 09 20 20 20 20 7d 20 7b 63 68 61  ms]]..    } {cha
3d90: 6e 67 65 73 65 74 20 66 72 61 67 6d 65 6e 74 20  ngeset fragment 
3da0: 69 73 20 6e 6f 74 20 61 20 73 75 62 73 65 74 7d  is not a subset}
3db0: 0a 09 20 20 20 20 73 74 72 75 63 74 3a 3a 73 65  ..    struct::se
3dc0: 74 20 61 64 64 20 63 6f 76 65 72 20 24 66 72 61  t add cover $fra
3dd0: 67 6d 65 6e 74 69 74 65 6d 73 0a 09 7d 0a 0a 09  gmentitems..}...
3de0: 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74  integrity assert
3df0: 20 7b 0a 09 20 20 20 20 5b 73 74 72 75 63 74 3a   {..    [struct:
3e00: 3a 73 65 74 20 65 71 75 61 6c 20 24 63 6f 76 65  :set equal $cove
3e10: 72 20 5b 24 63 73 65 74 20 69 74 65 6d 73 5d 5d  r [$cset items]]
3e20: 0a 09 20 7d 20 7b 54 68 65 20 66 72 61 67 6d 65  .. } {The fragme
3e30: 6e 74 73 20 64 6f 20 6e 6f 74 20 63 6f 76 65 72  nts do not cover
3e40: 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 63 68   the original ch
3e50: 61 6e 67 65 73 65 74 7d 0a 0a 09 73 65 74 20 69  angeset}...set i
3e60: 20 31 0a 09 66 6f 72 65 61 63 68 20 66 69 61 20   1..foreach fia 
3e70: 24 66 72 61 67 6d 65 6e 74 73 20 7b 0a 09 20 20  $fragments {..  
3e80: 20 20 66 6f 72 65 61 63 68 20 66 69 62 20 5b 6c    foreach fib [l
3e90: 72 61 6e 67 65 20 24 66 72 61 67 6d 65 6e 74 73  range $fragments
3ea0: 20 24 69 20 65 6e 64 5d 20 7b 0a 09 09 69 6e 74   $i end] {...int
3eb0: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 0a  egrity assert {.
3ec0: 09 09 20 20 20 20 5b 73 74 72 75 63 74 3a 3a 73  ..    [struct::s
3ed0: 65 74 20 65 6d 70 74 79 20 5b 73 74 72 75 63 74  et empty [struct
3ee0: 3a 3a 73 65 74 20 69 6e 74 65 72 73 65 63 74 20  ::set intersect 
3ef0: 24 66 69 61 20 24 66 69 62 5d 5d 0a 09 09 7d 20  $fia $fib]]...} 
3f00: 7b 54 68 65 20 66 72 61 67 6d 65 6e 74 73 20 3c  {The fragments <
3f10: 24 66 69 61 3e 20 61 6e 64 20 3c 24 66 69 62 3e  $fia> and <$fib>
3f20: 20 6f 76 65 72 6c 61 70 7d 0a 09 20 20 20 20 7d   overlap}..    }
3f30: 0a 09 20 20 20 20 69 6e 63 72 20 69 0a 09 7d 0a  ..    incr i..}.
3f40: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
3f50: 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23      # # ## ### #
3f60: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23  #### ######## ##
3f70: 23 23 23 23 23 23 23 23 23 23 23 0a 20 20 20 20  ###########.    
3f80: 23 23 20 53 74 61 74 65 0a 0a 20 20 20 20 76 61  ## State..    va
3f90: 72 69 61 62 6c 65 20 6d 79 69 64 20 20 20 20 20  riable myid     
3fa0: 20 20 20 7b 7d 20 3b 20 23 20 49 64 20 6f 66 20     {} ; # Id of 
3fb0: 74 68 65 20 63 73 65 74 20 66 6f 72 20 74 68 65  the cset for the
3fc0: 20 70 65 72 73 69 73 74 65 6e 74 0a 09 09 09 20   persistent.... 
3fd0: 20 20 20 20 20 23 20 73 74 61 74 65 2e 0a 20 20       # state..  
3fe0: 20 20 76 61 72 69 61 62 6c 65 20 6d 79 70 72 6f    variable mypro
3ff0: 6a 65 63 74 20 20 20 7b 7d 20 3b 20 23 20 52 65  ject   {} ; # Re
4000: 66 65 72 65 6e 63 65 20 6f 66 20 74 68 65 20 70  ference of the p
4010: 72 6f 6a 65 63 74 20 6f 62 6a 65 63 74 20 74 68  roject object th
4020: 65 0a 09 09 09 20 20 20 20 20 20 23 20 63 68 61  e....      # cha
4030: 6e 67 65 73 65 74 20 62 65 6c 6f 6e 67 73 20 74  ngeset belongs t
4040: 6f 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20  o..    variable 
4050: 6d 79 74 79 70 65 20 20 20 20 20 20 7b 7d 20 3b  mytype      {} ;
4060: 20 23 20 57 68 61 74 20 74 68 65 20 63 68 61 6e   # What the chan
4070: 67 65 73 65 74 20 69 73 20 62 61 73 65 64 20 6f  geset is based o
4080: 6e 0a 09 09 09 20 20 20 20 20 20 23 20 28 72 65  n....      # (re
4090: 76 69 73 69 6f 6e 73 2c 20 74 61 67 73 2c 20 6f  visions, tags, o
40a0: 72 20 62 72 61 6e 63 68 65 73 29 2e 0a 09 09 09  r branches).....
40b0: 20 20 20 20 20 20 23 20 56 61 6c 75 65 73 3a 20        # Values: 
40c0: 53 65 65 20 6d 79 63 73 74 79 70 65 2e 20 4e 6f  See mycstype. No
40d0: 74 65 20 74 68 61 74 20 77 65 0a 09 09 09 20 20  te that we....  
40e0: 20 20 20 20 23 20 68 61 76 65 20 74 6f 20 6b 65      # have to ke
40f0: 65 70 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20  ep the names of 
4100: 74 68 65 20 68 65 6c 70 65 72 0a 09 09 09 20 20  the helper....  
4110: 20 20 20 20 23 20 73 69 6e 67 6c 65 74 6f 6e 73      # singletons
4120: 20 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68   in sync with th
4130: 65 20 63 6f 6e 74 65 6e 74 73 0a 09 09 09 20 20  e contents....  
4140: 20 20 20 20 23 20 6f 66 20 73 74 61 74 65 20 74      # of state t
4150: 61 62 6c 65 20 27 63 73 74 79 70 65 27 2c 20 61  able 'cstype', a
4160: 6e 64 20 76 61 72 69 6f 75 73 0a 09 09 09 20 20  nd various....  
4170: 20 20 20 20 23 20 6f 74 68 65 72 20 70 6c 61 63      # other plac
4180: 65 73 20 75 73 69 6e 67 20 74 68 65 6d 20 68 61  es using them ha
4190: 72 64 77 69 72 65 64 2e 0a 20 20 20 20 76 61 72  rdwired..    var
41a0: 69 61 62 6c 65 20 6d 79 74 79 70 65 6f 62 6a 20  iable mytypeobj 
41b0: 20 20 7b 7d 20 3b 20 23 20 52 65 66 65 72 65 6e    {} ; # Referen
41c0: 63 65 20 74 6f 20 74 68 65 20 63 6f 6e 74 61 69  ce to the contai
41d0: 6e 65 72 20 66 6f 72 20 74 68 65 0a 09 09 09 20  ner for the.... 
41e0: 20 20 20 20 20 23 20 74 79 70 65 20 64 65 70 65       # type depe
41f0: 6e 64 65 6e 74 20 63 6f 64 65 2e 20 44 65 72 69  ndent code. Deri
4200: 76 65 64 20 66 72 6f 6d 0a 09 09 09 20 20 20 20  ved from....    
4210: 20 20 23 20 6d 79 74 79 70 65 2e 0a 20 20 20 20    # mytype..    
4220: 76 61 72 69 61 62 6c 65 20 6d 79 73 72 63 69 64  variable mysrcid
4230: 20 20 20 20 20 7b 7d 20 3b 20 23 20 49 64 20 6f       {} ; # Id o
4240: 66 20 74 68 65 20 6d 65 74 61 64 61 74 61 20 6f  f the metadata o
4250: 72 20 73 79 6d 62 6f 6c 20 74 68 65 20 63 73 65  r symbol the cse
4260: 74 0a 09 09 09 20 20 20 20 20 20 23 20 69 73 20  t....      # is 
4270: 62 61 73 65 64 20 6f 6e 2e 0a 20 20 20 20 76 61  based on..    va
4280: 72 69 61 62 6c 65 20 6d 79 69 74 65 6d 73 20 20  riable myitems  
4290: 20 20 20 7b 7d 20 3b 20 23 20 4c 69 73 74 20 6f     {} ; # List o
42a0: 66 20 74 68 65 20 66 69 6c 65 20 6c 65 76 65 6c  f the file level
42b0: 20 72 65 76 69 73 69 6f 6e 73 2c 0a 09 09 09 20   revisions,.... 
42c0: 20 20 20 20 20 23 20 74 61 67 73 2c 20 6f 72 20       # tags, or 
42d0: 62 72 61 6e 63 68 65 73 20 69 6e 20 74 68 65 20  branches in the 
42e0: 63 73 65 74 2c 20 61 73 0a 09 09 09 20 20 20 20  cset, as....    
42f0: 20 20 23 20 69 64 73 2e 20 4e 6f 74 20 74 61 67    # ids. Not tag
4300: 67 65 64 2e 0a 20 20 20 20 76 61 72 69 61 62 6c  ged..    variabl
4310: 65 20 6d 79 74 69 74 65 6d 73 20 20 20 20 7b 7d  e mytitems    {}
4320: 20 3b 20 23 20 41 73 20 6d 79 69 74 65 6d 73 2c   ; # As myitems,
4330: 20 74 68 65 20 74 61 67 67 65 64 20 66 6f 72 6d   the tagged form
4340: 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d  ..    variable m
4350: 79 70 6f 73 20 20 20 20 20 20 20 7b 7d 20 3b 20  ypos       {} ; 
4360: 23 20 43 6f 6d 6d 69 74 20 70 6f 73 69 74 69 6f  # Commit positio
4370: 6e 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73  n of the changes
4380: 65 74 2c 20 69 66 0a 09 09 09 20 20 20 20 20 20  et, if....      
4390: 23 20 6b 6e 6f 77 6e 2e 0a 0a 20 20 20 20 23 20  # known...    # 
43a0: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23  # ## ### ##### #
43b0: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
43c0: 23 23 23 23 23 0a 20 20 20 20 23 23 20 49 6e 74  #####.    ## Int
43d0: 65 72 6e 61 6c 20 6d 65 74 68 6f 64 73 0a 0a 20  ernal methods.. 
43e0: 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20     typevariable 
43f0: 6d 79 63 6f 75 6e 74 65 72 20 20 20 20 20 20 20  mycounter       
4400: 20 30 20 3b 20 23 20 49 64 20 63 6f 75 6e 74 65   0 ; # Id counte
4410: 72 20 66 6f 72 20 63 73 65 74 73 2e 20 4c 61 73  r for csets. Las
4420: 74 20 69 64 0a 09 09 09 09 20 20 20 20 20 20 23  t id.....      #
4430: 20 75 73 65 64 2e 0a 20 20 20 20 74 79 70 65 76   used..    typev
4440: 61 72 69 61 62 6c 65 20 6d 79 63 73 74 79 70 65  ariable mycstype
4450: 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d   -array {} ; # M
4460: 61 70 20 63 73 74 79 70 65 73 20 28 6e 61 6d 65  ap cstypes (name
4470: 73 29 20 74 6f 20 70 65 72 73 69 73 74 65 6e 74  s) to persistent
4480: 0a 09 09 09 09 20 20 20 20 20 20 23 20 69 64 73  .....      # ids
4490: 2e 20 4e 6f 74 65 20 74 68 61 74 20 77 65 20 68  . Note that we h
44a0: 61 76 65 20 74 6f 20 6b 65 65 70 0a 09 09 09 09  ave to keep.....
44b0: 20 20 20 20 20 20 23 20 74 68 65 20 6e 61 6d 65        # the name
44c0: 73 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 27  s in the table '
44d0: 63 73 74 79 70 65 27 0a 09 09 09 09 20 20 20 20  cstype'.....    
44e0: 20 20 23 20 69 6e 20 73 79 6e 63 20 77 69 74 68    # in sync with
44f0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68   the names of th
4500: 65 0a 09 09 09 09 20 20 20 20 20 20 23 20 68 65  e.....      # he
4510: 6c 70 65 72 20 73 69 6e 67 6c 65 74 6f 6e 73 2e  lper singletons.
4520: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ..    typemethod
4530: 20 69 6e 6f 72 64 65 72 20 7b 70 72 6f 6a 65 63   inorder {projec
4540: 74 69 64 7d 20 7b 0a 09 23 20 52 65 74 75 72 6e  tid} {..# Return
4550: 20 61 6c 6c 20 72 65 76 69 73 69 6f 6e 20 63 68   all revision ch
4560: 61 6e 67 65 73 65 74 73 20 66 6f 72 20 74 68 65  angesets for the
4570: 20 73 70 65 63 69 66 69 65 64 20 70 72 6f 6a 65   specified proje
4580: 63 74 2c 20 69 6e 0a 09 23 20 74 68 65 20 6f 72  ct, in..# the or
4590: 64 65 72 20 67 69 76 65 6e 20 74 6f 20 74 68 65  der given to the
45a0: 6d 20 62 79 20 74 68 65 20 73 6f 72 74 20 70 61  m by the sort pa
45b0: 73 73 65 73 2e 20 42 6f 74 68 20 74 68 65 0a 09  sses. Both the..
45c0: 23 20 66 69 6c 74 65 72 69 6e 67 20 62 79 20 70  # filtering by p
45d0: 72 6f 6a 65 63 74 20 61 6e 64 20 73 6f 72 74 69  roject and sorti
45e0: 6e 67 20 6d 61 6b 65 20 75 73 65 20 6f 66 20 27  ng make use of '
45f0: 70 72 6f 6a 65 63 74 3a 3a 72 65 76 0a 09 23 20  project::rev..# 
4600: 72 65 76 27 20 69 6d 70 6f 73 73 69 62 6c 65 2e  rev' impossible.
4610: 0a 0a 09 73 65 74 20 72 65 73 20 7b 7d 0a 09 66  ...set res {}..f
4620: 6f 72 65 61 63 68 20 7b 63 69 64 20 63 64 61 74  oreach {cid cdat
4630: 65 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a  e} [state run {.
4640: 09 20 20 20 20 53 45 4c 45 43 54 20 43 2e 63 69  .    SELECT C.ci
4650: 64 2c 20 54 2e 64 61 74 65 0a 09 20 20 20 20 46  d, T.date..    F
4660: 52 4f 4d 20 20 20 63 68 61 6e 67 65 73 65 74 20  ROM   changeset 
4670: 43 2c 20 63 73 74 69 6d 65 73 74 61 6d 70 20 54  C, cstimestamp T
4680: 0a 09 20 20 20 20 57 48 45 52 45 20 20 43 2e 74  ..    WHERE  C.t
4690: 79 70 65 20 3d 20 30 20 20 20 20 20 20 20 20 20  ype = 0         
46a0: 20 2d 2d 20 6c 69 6d 69 74 20 74 6f 20 72 65 76   -- limit to rev
46b0: 69 73 69 6f 6e 20 63 68 61 6e 67 65 73 65 74 73  ision changesets
46c0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 43 2e 70  ..    AND    C.p
46d0: 69 64 20 20 3d 20 24 70 72 6f 6a 65 63 74 69 64  id  = $projectid
46e0: 20 2d 2d 20 6c 69 6d 69 74 20 74 6f 20 63 68 61   -- limit to cha
46f0: 6e 67 65 73 65 74 73 20 69 6e 20 70 72 6f 6a 65  ngesets in proje
4700: 63 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 54  ct..    AND    T
4710: 2e 63 69 64 20 20 3d 20 43 2e 63 69 64 20 20 20  .cid  = C.cid   
4720: 20 20 20 2d 2d 20 67 65 74 20 6f 72 64 65 72 69     -- get orderi
4730: 6e 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 09  ng information..
4740: 20 20 20 20 4f 52 44 45 52 20 42 59 20 54 2e 64      ORDER BY T.d
4750: 61 74 65 20 20 20 20 20 20 20 20 20 20 20 20 2d  ate            -
4760: 2d 20 73 6f 72 74 20 69 6e 74 6f 20 63 6f 6d 6d  - sort into comm
4770: 69 74 20 6f 72 64 65 72 0a 09 7d 5d 20 7b 0a 09  it order..}] {..
4780: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 73 20      lappend res 
4790: 24 6d 79 69 64 6d 61 70 28 24 63 69 64 29 20 24  $myidmap($cid) $
47a0: 63 64 61 74 65 0a 09 7d 0a 09 72 65 74 75 72 6e  cdate..}..return
47b0: 20 24 72 65 73 0a 20 20 20 20 7d 0a 0a 20 20 20   $res.    }..   
47c0: 20 74 79 70 65 6d 65 74 68 6f 64 20 67 65 74 63   typemethod getc
47d0: 73 74 79 70 65 73 20 7b 7d 20 7b 0a 09 66 6f 72  stypes {} {..for
47e0: 65 61 63 68 20 7b 74 69 64 20 6e 61 6d 65 7d 20  each {tid name} 
47f0: 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20  [state run {..  
4800: 20 20 53 45 4c 45 43 54 20 74 69 64 2c 20 6e 61    SELECT tid, na
4810: 6d 65 20 46 52 4f 4d 20 63 73 74 79 70 65 3b 0a  me FROM cstype;.
4820: 09 7d 5d 20 7b 20 73 65 74 20 6d 79 63 73 74 79  .}] { set mycsty
4830: 70 65 28 24 6e 61 6d 65 29 20 24 74 69 64 20 7d  pe($name) $tid }
4840: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
4850: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c      typemethod l
4860: 6f 61 64 20 7b 72 65 70 6f 73 69 74 6f 72 79 7d  oad {repository}
4870: 20 7b 0a 09 73 65 74 20 6e 20 30 0a 09 6c 6f 67   {..set n 0..log
4880: 20 77 72 69 74 65 20 32 20 63 73 65 74 73 20 7b   write 2 csets {
4890: 4c 6f 61 64 69 6e 67 20 74 68 65 20 63 68 61 6e  Loading the chan
48a0: 67 65 73 65 74 73 7d 0a 09 66 6f 72 65 61 63 68  gesets}..foreach
48b0: 20 7b 69 64 20 70 69 64 20 63 73 74 79 70 65 20   {id pid cstype 
48c0: 73 72 63 69 64 7d 20 5b 73 74 61 74 65 20 72 75  srcid} [state ru
48d0: 6e 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20  n {..    SELECT 
48e0: 43 2e 63 69 64 2c 20 43 2e 70 69 64 2c 20 43 53  C.cid, C.pid, CS
48f0: 2e 6e 61 6d 65 2c 20 43 2e 73 72 63 0a 09 20 20  .name, C.src..  
4900: 20 20 46 52 4f 4d 20 20 20 63 68 61 6e 67 65 73    FROM   changes
4910: 65 74 20 43 2c 20 63 73 74 79 70 65 20 43 53 0a  et C, cstype CS.
4920: 09 20 20 20 20 57 48 45 52 45 20 20 43 2e 74 79  .    WHERE  C.ty
4930: 70 65 20 3d 20 43 53 2e 74 69 64 0a 09 20 20 20  pe = CS.tid..   
4940: 20 4f 52 44 45 52 20 42 59 20 43 2e 63 69 64 0a   ORDER BY C.cid.
4950: 09 7d 5d 20 7b 0a 09 20 20 20 20 6c 6f 67 20 70  .}] {..    log p
4960: 72 6f 67 72 65 73 73 20 32 20 63 73 65 74 73 20  rogress 2 csets 
4970: 24 6e 20 7b 7d 0a 09 20 20 20 20 73 65 74 20 72  $n {}..    set r
4980: 20 5b 24 74 79 70 65 20 25 41 55 54 4f 25 20 5b   [$type %AUTO% [
4990: 24 72 65 70 6f 73 69 74 6f 72 79 20 70 72 6f 6a  $repository proj
49a0: 65 63 74 6f 66 20 24 70 69 64 5d 20 24 63 73 74  ectof $pid] $cst
49b0: 79 70 65 20 24 73 72 63 69 64 20 5b 73 74 61 74  ype $srcid [stat
49c0: 65 20 72 75 6e 20 7b 0a 09 09 53 45 4c 45 43 54  e run {...SELECT
49d0: 20 43 2e 69 69 64 0a 09 09 46 52 4f 4d 20 20 20   C.iid...FROM   
49e0: 63 73 69 74 65 6d 20 43 0a 09 09 57 48 45 52 45  csitem C...WHERE
49f0: 20 20 43 2e 63 69 64 20 3d 20 24 69 64 0a 09 09    C.cid = $id...
4a00: 4f 52 44 45 52 20 42 59 20 43 2e 70 6f 73 0a 09  ORDER BY C.pos..
4a10: 20 20 20 20 7d 5d 20 24 69 64 5d 0a 09 20 20 20      }] $id]..   
4a20: 20 69 6e 63 72 20 6e 0a 09 7d 0a 09 72 65 74 75   incr n..}..retu
4a30: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79  rn.    }..    ty
4a40: 70 65 6d 65 74 68 6f 64 20 6c 6f 61 64 63 6f 75  pemethod loadcou
4a50: 6e 74 65 72 20 7b 7d 20 7b 0a 09 23 20 49 6e 69  nter {} {..# Ini
4a60: 74 69 61 6c 69 7a 65 20 74 68 65 20 63 6f 75 6e  tialize the coun
4a70: 74 65 72 20 66 72 6f 6d 20 74 68 65 20 73 74 61  ter from the sta
4a80: 74 65 0a 09 6c 6f 67 20 77 72 69 74 65 20 32 20  te..log write 2 
4a90: 63 73 65 74 73 20 7b 4c 6f 61 64 69 6e 67 20 63  csets {Loading c
4aa0: 68 61 6e 67 65 73 65 74 20 63 6f 75 6e 74 65 72  hangeset counter
4ab0: 7d 0a 09 73 65 74 20 6d 79 63 6f 75 6e 74 65 72  }..set mycounter
4ac0: 20 5b 73 74 61 74 65 20 6f 6e 65 20 7b 20 53 45   [state one { SE
4ad0: 4c 45 43 54 20 4d 41 58 28 63 69 64 29 20 46 52  LECT MAX(cid) FR
4ae0: 4f 4d 20 63 68 61 6e 67 65 73 65 74 20 7d 5d 0a  OM changeset }].
4af0: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
4b00: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6e 75     typemethod nu
4b10: 6d 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d  m {} { return $m
4b20: 79 63 6f 75 6e 74 65 72 20 7d 0a 0a 20 20 20 20  ycounter }..    
4b30: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
4b40: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
4b50: 23 23 23 23 23 23 23 0a 0a 20 20 20 20 6d 65 74  #######..    met
4b60: 68 6f 64 20 43 72 65 61 74 65 46 72 6f 6d 46 72  hod CreateFromFr
4b70: 61 67 6d 65 6e 74 73 20 7b 66 72 61 67 6d 65 6e  agments {fragmen
4b80: 74 73 20 63 76 20 62 76 7d 20 7b 0a 09 75 70 76  ts cv bv} {..upv
4b90: 61 72 20 31 20 24 63 76 20 63 6f 75 6e 74 65 72  ar 1 $cv counter
4ba0: 20 24 62 76 20 62 72 65 61 6b 73 0a 09 55 6e 6d   $bv breaks..Unm
4bb0: 61 70 49 74 65 6d 73 20 24 6d 79 74 79 70 65 20  apItems $mytype 
4bc0: 24 6d 79 69 74 65 6d 73 0a 0a 09 23 20 43 72 65  $myitems...# Cre
4bd0: 61 74 65 20 63 68 61 6e 67 65 73 65 74 73 20 66  ate changesets f
4be0: 6f 72 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73  or the fragments
4bf0: 2c 20 72 65 75 73 69 6e 67 20 74 68 65 20 63 75  , reusing the cu
4c00: 72 72 65 6e 74 20 6f 6e 65 0a 09 23 20 66 6f 72  rrent one..# for
4c10: 20 74 68 65 20 66 69 72 73 74 20 66 72 61 67 6d   the first fragm
4c20: 65 6e 74 2e 20 57 65 20 73 6f 72 74 20 74 68 65  ent. We sort the
4c30: 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f 20 61 6c  m in order to al
4c40: 6c 6f 77 0a 09 23 20 63 68 65 63 6b 69 6e 67 20  low..# checking 
4c50: 66 6f 72 20 67 61 70 73 20 61 6e 64 20 6e 69 63  for gaps and nic
4c60: 65 20 6d 65 73 73 61 67 65 73 2e 0a 0a 09 73 65  e messages....se
4c70: 74 20 6e 65 77 63 73 65 74 73 20 20 7b 7d 0a 09  t newcsets  {}..
4c80: 73 65 74 20 66 72 61 67 6d 65 6e 74 73 20 5b 6c  set fragments [l
4c90: 73 6f 72 74 20 2d 69 6e 64 65 78 20 30 20 2d 69  sort -index 0 -i
4ca0: 6e 74 65 67 65 72 20 24 66 72 61 67 6d 65 6e 74  nteger $fragment
4cb0: 73 5d 0a 0a 09 23 70 75 74 73 20 5c 74 2e 5b 6a  s]...#puts \t.[j
4cc0: 6f 69 6e 20 5b 50 52 73 20 24 66 72 61 67 6d 65  oin [PRs $fragme
4cd0: 6e 74 73 5d 20 2e 5c 6e 5c 74 2e 5d 2e 0a 0a 09  nts] .\n\t.]....
4ce0: 42 6f 72 64 65 72 20 5b 6c 69 6e 64 65 78 20 24  Border [lindex $
4cf0: 66 72 61 67 6d 65 6e 74 73 20 30 5d 20 66 69 72  fragments 0] fir
4d00: 73 74 73 20 66 69 72 73 74 65 0a 0a 09 69 6e 74  sts firste...int
4d10: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 0a  egrity assert {.
4d20: 09 20 20 20 20 24 66 69 72 73 74 73 20 3d 3d 20  .    $firsts == 
4d30: 30 0a 09 7d 20 7b 42 61 64 20 66 72 61 67 6d 65  0..} {Bad fragme
4d40: 6e 74 20 73 74 61 72 74 20 40 20 24 66 69 72 73  nt start @ $firs
4d50: 74 73 2c 20 67 61 70 2c 20 6f 72 20 62 65 66 6f  ts, gap, or befo
4d60: 72 65 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20  re beginning of 
4d70: 74 68 65 20 72 61 6e 67 65 7d 0a 0a 09 73 65 74  the range}...set
4d80: 20 6c 61 73 74 65 20 24 66 69 72 73 74 65 0a 09   laste $firste..
4d90: 66 6f 72 65 61 63 68 20 66 72 61 67 6d 65 6e 74  foreach fragment
4da0: 20 5b 6c 72 61 6e 67 65 20 24 66 72 61 67 6d 65   [lrange $fragme
4db0: 6e 74 73 20 31 20 65 6e 64 5d 20 7b 0a 09 20 20  nts 1 end] {..  
4dc0: 20 20 42 6f 72 64 65 72 20 24 66 72 61 67 6d 65    Border $fragme
4dd0: 6e 74 20 73 20 65 0a 09 20 20 20 20 69 6e 74 65  nt s e..    inte
4de0: 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 0a 09  grity assert {..
4df0: 09 24 6c 61 73 74 65 20 3d 3d 20 28 24 73 20 2d  .$laste == ($s -
4e00: 20 31 29 0a 09 20 20 20 20 7d 20 7b 42 61 64 20   1)..    } {Bad 
4e10: 66 72 61 67 6d 65 6e 74 20 62 6f 72 64 65 72 20  fragment border 
4e20: 3c 24 6c 61 73 74 65 20 7c 20 24 73 3e 2c 20 67  <$laste | $s>, g
4e30: 61 70 20 6f 72 20 6f 76 65 72 6c 61 70 7d 0a 0a  ap or overlap}..
4e40: 09 20 20 20 20 73 65 74 20 6e 65 77 20 5b 24 74  .    set new [$t
4e50: 79 70 65 20 25 41 55 54 4f 25 20 24 6d 79 70 72  ype %AUTO% $mypr
4e60: 6f 6a 65 63 74 20 24 6d 79 74 79 70 65 20 24 6d  oject $mytype $m
4e70: 79 73 72 63 69 64 20 5b 6c 72 61 6e 67 65 20 24  ysrcid [lrange $
4e80: 6d 79 69 74 65 6d 73 20 24 73 20 24 65 5d 5d 0a  myitems $s $e]].
4e90: 09 20 20 20 20 6c 61 70 70 65 6e 64 20 6e 65 77  .    lappend new
4ea0: 63 73 65 74 73 20 24 6e 65 77 0a 09 20 20 20 20  csets $new..    
4eb0: 69 6e 63 72 20 63 6f 75 6e 74 65 72 0a 0a 20 20  incr counter..  
4ec0: 20 20 20 20 20 20 20 20 20 20 6c 6f 67 20 77 72            log wr
4ed0: 69 74 65 20 34 20 63 73 65 74 73 20 7b 42 72 65  ite 4 csets {Bre
4ee0: 61 6b 69 6e 67 20 5b 24 73 65 6c 66 20 73 74 72  aking [$self str
4ef0: 20 5d 20 40 20 24 6c 61 73 74 65 2c 20 6e 65 77   ] @ $laste, new
4f00: 20 5b 24 6e 65 77 20 73 74 72 5d 2c 20 63 75 74   [$new str], cut
4f10: 74 69 6e 67 20 24 62 72 65 61 6b 73 28 24 6c 61  ting $breaks($la
4f20: 73 74 65 29 7d 0a 0a 09 20 20 20 20 73 65 74 20  ste)}...    set 
4f30: 6c 61 73 74 65 20 24 65 0a 09 7d 0a 0a 09 69 6e  laste $e..}...in
4f40: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b  tegrity assert {
4f50: 0a 09 20 20 20 20 24 6c 61 73 74 65 20 3d 3d 20  ..    $laste == 
4f60: 28 5b 6c 6c 65 6e 67 74 68 20 24 6d 79 69 74 65  ([llength $myite
4f70: 6d 73 5d 2d 31 29 0a 09 7d 20 7b 42 61 64 20 66  ms]-1)..} {Bad f
4f80: 72 61 67 6d 65 6e 74 20 65 6e 64 20 40 20 24 6c  ragment end @ $l
4f90: 61 73 74 65 2c 20 67 61 70 2c 20 6f 72 20 62 65  aste, gap, or be
4fa0: 79 6f 6e 64 20 65 6e 64 20 6f 66 20 74 68 65 20  yond end of the 
4fb0: 72 61 6e 67 65 7d 0a 0a 09 23 20 50 75 74 20 74  range}...# Put t
4fc0: 68 65 20 66 69 72 73 74 20 66 72 61 67 6d 65 6e  he first fragmen
4fd0: 74 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65  t into the curre
4fe0: 6e 74 20 63 68 61 6e 67 65 73 65 74 2c 20 61 6e  nt changeset, an
4ff0: 64 0a 09 23 20 75 70 64 61 74 65 20 74 68 65 20  d..# update the 
5000: 69 6e 2d 6d 65 6d 6f 72 79 20 69 6e 64 65 78 2e  in-memory index.
5010: 20 57 65 20 63 61 6e 20 73 69 6d 70 6c 79 20 28   We can simply (
5020: 72 65 29 61 64 64 20 74 68 65 20 69 74 65 6d 73  re)add the items
5030: 0a 09 23 20 62 65 63 61 75 73 65 20 77 65 20 63  ..# because we c
5040: 6c 65 61 72 65 64 20 74 68 65 20 70 72 65 76 69  leared the previ
5050: 6f 75 73 6c 79 20 65 78 69 73 74 69 6e 67 20 69  ously existing i
5060: 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20 73 65 65 0a  nformation, see.
5070: 09 23 20 27 55 6e 6d 61 70 49 74 65 6d 73 27 20  .# 'UnmapItems' 
5080: 61 62 6f 76 65 2e 20 50 65 72 73 69 73 74 65 6e  above. Persisten
5090: 63 65 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 74  ce does not matt
50a0: 65 72 20 68 65 72 65 2c 20 6e 6f 6e 65 0a 09 23  er here, none..#
50b0: 20 6f 66 20 74 68 65 20 63 68 61 6e 67 65 73 65   of the changese
50c0: 74 73 20 68 61 73 20 62 65 65 6e 20 73 61 76 65  ts has been save
50d0: 64 20 74 6f 20 74 68 65 20 70 65 72 73 69 73 74  d to the persist
50e0: 65 6e 74 20 73 74 61 74 65 0a 09 23 20 79 65 74  ent state..# yet
50f0: 2e 0a 0a 09 73 65 74 20 6d 79 69 74 65 6d 73 20  ....set myitems 
5100: 20 5b 6c 72 61 6e 67 65 20 24 6d 79 69 74 65 6d   [lrange $myitem
5110: 73 20 20 30 20 24 66 69 72 73 74 65 5d 0a 09 73  s  0 $firste]..s
5120: 65 74 20 6d 79 74 69 74 65 6d 73 20 5b 6c 72 61  et mytitems [lra
5130: 6e 67 65 20 24 6d 79 74 69 74 65 6d 73 20 30 20  nge $mytitems 0 
5140: 24 66 69 72 73 74 65 5d 0a 09 4d 61 70 49 74 65  $firste]..MapIte
5150: 6d 73 20 24 6d 79 74 79 70 65 20 24 6d 79 69 74  ms $mytype $myit
5160: 65 6d 73 0a 09 72 65 74 75 72 6e 20 24 6e 65 77  ems..return $new
5170: 63 73 65 74 73 0a 20 20 20 20 7d 0a 0a 20 20 20  csets.    }..   
5180: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23   # # ## ### ####
5190: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
51a0: 23 23 23 23 23 23 23 23 0a 0a 20 20 20 20 70 72  ########..    pr
51b0: 6f 63 20 42 72 65 61 6b 44 69 72 65 63 74 44 65  oc BreakDirectDe
51c0: 70 65 6e 64 65 6e 63 69 65 73 20 7b 74 68 65 69  pendencies {thei
51d0: 74 65 6d 73 20 62 76 7d 20 7b 0a 09 75 70 76 61  tems bv} {..upva
51e0: 72 20 31 20 6d 79 74 79 70 65 6f 62 6a 20 6d 79  r 1 mytypeobj my
51f0: 74 79 70 65 6f 62 6a 20 73 65 6c 66 20 73 65 6c  typeobj self sel
5200: 66 20 24 62 76 20 62 72 65 61 6b 73 0a 0a 09 23  f $bv breaks...#
5210: 20 41 72 72 61 79 20 6f 66 20 64 65 70 65 6e 64   Array of depend
5220: 65 6e 63 69 65 73 20 28 70 61 72 65 6e 74 20 2d  encies (parent -
5230: 3e 20 63 68 69 6c 64 29 2e 20 54 68 69 73 20 69  > child). This i
5240: 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d 0a 09 23  s pulled from..#
5250: 20 74 68 65 20 73 74 61 74 65 2c 20 61 6e 64 20   the state, and 
5260: 6c 69 6d 69 74 65 64 20 74 6f 20 73 75 63 63 65  limited to succe
5270: 73 73 6f 72 73 20 77 69 74 68 69 6e 20 74 68 65  ssors within the
5280: 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 61 72   changeset....ar
5290: 72 61 79 20 73 65 74 20 64 65 70 65 6e 64 65 6e  ray set dependen
52a0: 63 69 65 73 20 7b 7d 0a 0a 09 24 6d 79 74 79 70  cies {}...$mytyp
52b0: 65 6f 62 6a 20 69 6e 74 65 72 6e 61 6c 73 75 63  eobj internalsuc
52c0: 63 65 73 73 6f 72 73 20 64 65 70 65 6e 64 65 6e  cessors dependen
52d0: 63 69 65 73 20 24 74 68 65 69 74 65 6d 73 0a 09  cies $theitems..
52e0: 69 66 20 7b 21 5b 61 72 72 61 79 20 73 69 7a 65  if {![array size
52f0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 5d 7d 20   dependencies]} 
5300: 7b 0a 09 20 20 20 20 72 65 74 75 72 6e 20 7b 7d  {..    return {}
5310: 0a 09 7d 20 3b 20 23 20 4e 6f 74 68 69 6e 67 20  ..} ; # Nothing 
5320: 74 6f 20 62 72 65 61 6b 2e 0a 0a 09 6c 6f 67 20  to break....log 
5330: 77 72 69 74 65 20 35 20 63 73 65 74 73 20 2e 2e  write 5 csets ..
5340: 2e 5b 24 73 65 6c 66 20 73 74 72 5d 2e 2e 2e 2e  .[$self str]....
5350: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
5360: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
5370: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
5380: 2e 2e 2e 0a 09 76 63 3a 3a 74 6f 6f 6c 73 3a 3a  .....vc::tools::
5390: 6d 65 6d 3a 3a 6d 61 72 6b 0a 0a 09 72 65 74 75  mem::mark...retu
53a0: 72 6e 20 5b 42 72 65 61 6b 65 72 43 6f 72 65 20  rn [BreakerCore 
53b0: 24 74 68 65 69 74 65 6d 73 20 64 65 70 65 6e 64  $theitems depend
53c0: 65 6e 63 69 65 73 20 62 72 65 61 6b 73 5d 0a 20  encies breaks]. 
53d0: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 42     }..    proc B
53e0: 72 65 61 6b 65 72 43 6f 72 65 20 7b 74 68 65 69  reakerCore {thei
53f0: 74 65 6d 73 20 64 76 20 62 76 7d 20 7b 0a 09 23  tems dv bv} {..#
5400: 20 42 72 65 61 6b 20 61 20 73 65 74 20 6f 66 20   Break a set of 
5410: 72 65 76 69 73 69 6f 6e 73 20 69 6e 74 6f 20 66  revisions into f
5420: 72 61 67 6d 65 6e 74 73 20 77 68 69 63 68 20 68  ragments which h
5430: 61 76 65 20 6e 6f 0a 09 23 20 69 6e 74 65 72 6e  ave no..# intern
5440: 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e  al dependencies.
5450: 0a 0a 09 23 20 57 65 20 70 65 72 66 6f 72 6d 20  ...# We perform 
5460: 61 6c 6c 20 6e 65 63 65 73 73 61 72 79 20 73 70  all necessary sp
5470: 6c 69 74 73 20 69 6e 20 6f 6e 65 20 67 6f 2c 20  lits in one go, 
5480: 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e 6c 79 0a  instead of only.
5490: 09 23 20 6f 6e 65 2e 20 54 68 65 20 70 72 65 76  .# one. The prev
54a0: 69 6f 75 73 20 61 6c 67 6f 72 69 74 68 6d 2c 20  ious algorithm, 
54b0: 61 64 61 70 74 65 64 20 66 72 6f 6d 20 63 76 73  adapted from cvs
54c0: 32 73 76 6e 2c 20 63 6f 6d 70 75 74 65 64 0a 09  2svn, computed..
54d0: 23 20 61 20 6c 6f 74 20 6f 66 20 73 74 61 74 65  # a lot of state
54e0: 20 77 68 69 63 68 20 77 61 73 20 74 68 72 6f 77   which was throw
54f0: 6e 20 61 77 61 79 20 61 6e 64 20 74 68 65 6e 20  n away and then 
5500: 63 6f 6d 70 75 74 65 64 20 61 67 61 69 6e 0a 09  computed again..
5510: 23 20 66 6f 72 20 65 61 63 68 20 6f 66 20 74 68  # for each of th
5520: 65 20 66 72 61 67 6d 65 6e 74 73 2e 20 49 74 20  e fragments. It 
5530: 73 68 6f 75 6c 64 20 62 65 20 65 61 73 69 65 72  should be easier
5540: 20 74 6f 20 75 70 64 61 74 65 20 61 6e 64 0a 09   to update and..
5550: 23 20 72 65 75 73 65 20 74 68 61 74 20 73 74 61  # reuse that sta
5560: 74 65 2e 0a 0a 09 75 70 76 61 72 20 31 20 24 64  te....upvar 1 $d
5570: 76 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 24  v dependencies $
5580: 62 76 20 62 72 65 61 6b 73 0a 0a 09 23 20 57 65  bv breaks...# We
5590: 20 68 61 76 65 20 69 6e 74 65 72 6e 61 6c 20 64   have internal d
55a0: 65 70 65 6e 64 65 6e 63 69 65 73 20 74 6f 20 62  ependencies to b
55b0: 72 65 61 6b 2e 20 57 65 20 6e 6f 77 20 69 74 65  reak. We now ite
55c0: 72 61 74 65 20 6f 76 65 72 0a 09 23 20 61 6c 6c  rate over..# all
55d0: 20 70 6f 73 69 74 69 6f 6e 73 20 69 6e 20 74 68   positions in th
55e0: 65 20 6c 69 73 74 20 28 77 68 69 63 68 20 69 73  e list (which is
55f0: 20 63 68 72 6f 6e 6f 6c 6f 67 69 63 61 6c 2c 20   chronological, 
5600: 61 74 20 6c 65 61 73 74 0a 09 23 20 61 73 20 66  at least..# as f
5610: 61 72 20 61 73 20 74 68 65 20 74 69 6d 65 73 74  ar as the timest
5620: 61 6d 70 73 20 61 72 65 20 63 6f 72 72 65 63 74  amps are correct
5630: 20 61 6e 64 20 75 6e 69 71 75 65 29 20 61 6e 64   and unique) and
5640: 0a 09 23 20 64 65 74 65 72 6d 69 6e 65 20 74 68  ..# determine th
5650: 65 20 62 65 73 74 20 70 6f 73 69 74 69 6f 6e 20  e best position 
5660: 66 6f 72 20 74 68 65 20 62 72 65 61 6b 2c 20 62  for the break, b
5670: 79 20 74 72 79 69 6e 67 20 74 6f 0a 09 23 20 62  y trying to..# b
5680: 72 65 61 6b 20 61 73 20 6d 61 6e 79 20 64 65 70  reak as many dep
5690: 65 6e 64 65 6e 63 69 65 73 20 61 73 20 70 6f 73  endencies as pos
56a0: 73 69 62 6c 65 20 69 6e 20 6f 6e 65 20 67 6f 2e  sible in one go.
56b0: 20 57 68 65 6e 20 61 0a 09 23 20 62 72 65 61 6b   When a..# break
56c0: 20 77 61 73 20 66 6f 75 6e 64 20 74 68 69 73 20   was found this 
56d0: 69 73 20 72 65 64 6f 6e 65 20 66 6f 72 20 74 68  is redone for th
56e0: 65 20 66 72 61 67 6d 65 6e 74 73 20 63 6f 6d 69  e fragments comi
56f0: 6e 67 20 61 6e 64 0a 09 23 20 61 66 74 65 72 2c  ng and..# after,
5700: 20 61 66 74 65 72 20 75 70 64 69 6e 67 20 74 68   after upding th
5710: 65 20 63 72 6f 73 73 69 6e 67 20 69 6e 66 6f 72  e crossing infor
5720: 6d 61 74 69 6f 6e 2e 0a 0a 09 23 20 44 61 74 61  mation....# Data
5730: 20 73 74 72 75 63 74 75 72 65 73 3a 0a 09 23 20   structures:..# 
5740: 4d 61 70 3a 20 20 50 4f 53 20 20 20 72 65 76 69  Map:  POS   revi
5750: 73 69 6f 6e 20 69 64 20 20 20 20 20 20 2d 3e 20  sion id      -> 
5760: 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73 74  position in list
5770: 2e 0a 09 23 20 20 20 20 20 20 20 43 52 4f 53 53  ...#       CROSS
5780: 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c 69 73   position in lis
5790: 74 20 2d 3e 20 6e 75 6d 62 65 72 20 6f 66 20 64  t -> number of d
57a0: 65 70 65 6e 64 65 6e 63 69 65 73 20 63 72 6f 73  ependencies cros
57b0: 73 69 6e 67 20 69 74 0a 09 23 20 20 20 20 20 20  sing it..#      
57c0: 20 44 45 50 43 20 20 64 65 70 65 6e 64 65 6e 63   DEPC  dependenc
57d0: 79 20 20 20 20 20 20 20 2d 3e 20 70 6f 73 69 74  y       -> posit
57e0: 69 6f 6e 73 20 69 74 20 63 72 6f 73 73 65 73 0a  ions it crosses.
57f0: 09 23 20 4c 69 73 74 3a 20 52 41 4e 47 45 20 4f  .# List: RANGE O
5800: 66 20 74 68 65 20 70 6f 73 69 74 69 6f 6e 73 20  f the positions 
5810: 69 74 73 65 6c 66 2e 0a 09 23 20 4d 61 70 3a 20  itself...# Map: 
5820: 20 44 45 4c 54 41 20 70 6f 73 69 74 69 6f 6e 20   DELTA position 
5830: 69 6e 20 6c 69 73 74 20 2d 3e 20 74 69 6d 65 20  in list -> time 
5840: 64 65 6c 74 61 20 62 65 74 77 65 65 6e 20 69 74  delta between it
5850: 73 20 72 65 76 69 73 69 6f 6e 0a 09 23 20 20 20  s revision..#   
5860: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6e                an
5880: 64 20 74 68 65 20 6e 65 78 74 2c 20 69 66 20 61  d the next, if a
5890: 6e 79 2e 0a 09 23 20 41 20 64 65 70 65 6e 64 65  ny...# A depende
58a0: 6e 63 79 20 69 73 20 61 20 73 69 6e 67 6c 65 2d  ncy is a single-
58b0: 65 6c 65 6d 65 6e 74 20 6d 61 70 20 70 61 72 65  element map pare
58c0: 6e 74 20 2d 3e 20 63 68 69 6c 64 0a 0a 09 23 20  nt -> child...# 
58d0: 49 6e 69 74 69 61 6c 69 7a 65 42 72 65 61 6b 53  InitializeBreakS
58e0: 74 61 74 65 20 69 6e 69 74 69 61 6c 69 7a 65 73  tate initializes
58f0: 20 74 68 65 69 72 20 63 6f 6e 74 65 6e 74 73 20   their contents 
5900: 61 66 74 65 72 0a 09 23 20 75 70 76 61 72 27 69  after..# upvar'i
5910: 6e 67 20 74 68 65 6d 20 66 72 6f 6d 20 74 68 69  ng them from thi
5920: 73 20 73 63 6f 70 65 2e 20 49 74 20 75 73 65 73  s scope. It uses
5930: 20 74 68 65 20 69 6e 66 6f 72 6d 61 74 69 6f 6e   the information
5940: 20 69 6e 0a 09 23 20 44 45 50 45 4e 44 45 4e 43   in..# DEPENDENC
5950: 49 45 53 20 74 6f 20 64 6f 20 73 6f 2e 0a 0a 09  IES to do so....
5960: 49 6e 69 74 69 61 6c 69 7a 65 42 72 65 61 6b 53  InitializeBreakS
5970: 74 61 74 65 20 24 74 68 65 69 74 65 6d 73 0a 0a  tate $theitems..
5980: 09 73 65 74 20 66 72 61 67 6d 65 6e 74 73 20 7b  .set fragments {
5990: 7d 0a 09 73 65 74 20 6e 65 77 20 20 20 20 20 20  }..set new      
59a0: 20 5b 6c 69 73 74 20 24 72 61 6e 67 65 5d 0a 0a   [list $range]..
59b0: 09 23 20 49 6e 73 74 65 61 64 20 6f 66 20 6f 6e  .# Instead of on
59c0: 65 20 6c 69 73 74 20 68 6f 6c 64 69 6e 67 20 62  e list holding b
59d0: 6f 74 68 20 70 72 6f 63 65 73 73 65 64 20 61 6e  oth processed an
59e0: 64 20 70 65 6e 64 69 6e 67 0a 09 23 20 66 72 61  d pending..# fra
59f0: 67 6d 65 6e 74 73 20 77 65 20 75 73 65 20 74 77  gments we use tw
5a00: 6f 2c 20 6f 6e 65 20 66 6f 72 20 74 68 65 20 66  o, one for the f
5a10: 72 61 6d 65 6e 74 73 20 74 6f 20 70 72 6f 63 65  raments to proce
5a20: 73 73 2c 20 6f 6e 65 0a 09 23 20 74 6f 20 68 6f  ss, one..# to ho
5a30: 6c 64 20 74 68 65 20 6e 65 77 20 66 72 61 67 6d  ld the new fragm
5a40: 65 6e 74 73 2c 20 61 6e 64 20 74 68 65 20 6c 61  ents, and the la
5a50: 74 74 65 72 20 69 73 20 63 6f 70 69 65 64 20 74  tter is copied t
5a60: 6f 20 74 68 65 0a 09 23 20 66 6f 72 6d 65 72 20  o the..# former 
5a70: 77 68 65 6e 20 74 68 65 79 20 72 75 6e 20 6f 75  when they run ou
5a80: 74 2e 20 54 68 69 73 20 6b 65 65 70 73 20 74 68  t. This keeps th
5a90: 65 20 6c 69 73 74 20 6f 66 20 70 65 6e 64 69 6e  e list of pendin
5aa0: 67 0a 09 23 20 66 72 61 67 6d 65 6e 74 73 20 73  g..# fragments s
5ab0: 68 6f 72 74 20 77 69 74 68 6f 75 74 20 73 61 63  hort without sac
5ac0: 72 69 66 69 63 69 6e 67 20 73 70 65 65 64 20 62  rificing speed b
5ad0: 79 20 73 68 69 66 74 69 6e 67 20 73 74 75 66 66  y shifting stuff
5ae0: 0a 09 23 20 64 6f 77 6e 2e 20 57 65 20 65 73 70  ..# down. We esp
5af0: 65 63 69 61 6c 6c 79 20 64 72 6f 70 20 74 68 65  ecially drop the
5b00: 20 6d 65 6d 6f 72 79 20 6f 66 20 66 72 61 67 6d   memory of fragm
5b10: 65 6e 74 73 20 62 72 6f 6b 65 6e 0a 09 23 20 64  ents broken..# d
5b20: 75 72 69 6e 67 20 70 72 6f 63 65 73 73 69 6e 67  uring processing
5b30: 20 61 66 74 65 72 20 61 20 73 68 6f 72 74 20 74   after a short t
5b40: 69 6d 65 2c 20 69 6e 73 74 65 61 64 20 6f 66 20  ime, instead of 
5b50: 6c 65 74 74 69 6e 67 20 69 74 0a 09 23 20 63 6f  letting it..# co
5b60: 6e 73 75 6d 65 20 6d 65 6d 6f 72 79 2e 0a 0a 09  nsume memory....
5b70: 77 68 69 6c 65 20 7b 5b 6c 6c 65 6e 67 74 68 20  while {[llength 
5b80: 24 6e 65 77 5d 7d 20 7b 0a 0a 09 20 20 20 20 73  $new]} {...    s
5b90: 65 74 20 70 65 6e 64 69 6e 67 20 24 6e 65 77 0a  et pending $new.
5ba0: 09 20 20 20 20 73 65 74 20 6e 65 77 20 20 20 20  .    set new    
5bb0: 20 7b 7d 0a 09 20 20 20 20 73 65 74 20 61 74 20   {}..    set at 
5bc0: 20 20 20 20 20 30 0a 0a 09 20 20 20 20 77 68 69       0...    whi
5bd0: 6c 65 20 7b 24 61 74 20 3c 20 5b 6c 6c 65 6e 67  le {$at < [lleng
5be0: 74 68 20 24 70 65 6e 64 69 6e 67 5d 7d 20 7b 0a  th $pending]} {.
5bf0: 09 09 73 65 74 20 63 75 72 72 65 6e 74 20 5b 6c  ..set current [l
5c00: 69 6e 64 65 78 20 24 70 65 6e 64 69 6e 67 20 24  index $pending $
5c10: 61 74 5d 0a 0a 09 09 6c 6f 67 20 77 72 69 74 65  at]....log write
5c20: 20 36 20 63 73 65 74 73 20 7b 2e 20 2e 20 2e 2e   6 csets {. . ..
5c30: 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e   ... ..... .....
5c40: 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ... ............
5c50: 2e 7d 0a 09 09 6c 6f 67 20 77 72 69 74 65 20 36  .}...log write 6
5c60: 20 63 73 65 74 73 20 7b 53 63 68 65 64 75 6c 65   csets {Schedule
5c70: 64 20 20 20 5b 6a 6f 69 6e 20 5b 50 52 73 20 5b  d   [join [PRs [
5c80: 6c 72 61 6e 67 65 20 24 70 65 6e 64 69 6e 67 20  lrange $pending 
5c90: 24 61 74 20 65 6e 64 5d 5d 20 7b 20 7d 5d 7d 0a  $at end]] { }]}.
5ca0: 09 09 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73  ..log write 6 cs
5cb0: 65 74 73 20 7b 43 6f 6e 73 69 64 65 72 69 6e 67  ets {Considering
5cc0: 20 5b 50 52 20 24 63 75 72 72 65 6e 74 5d 20 5c   [PR $current] \
5cd0: 5b 24 61 74 2f 5b 6c 6c 65 6e 67 74 68 20 24 70  [$at/[llength $p
5ce0: 65 6e 64 69 6e 67 5d 5c 5d 7d 0a 0a 09 09 73 65  ending]\]}....se
5cf0: 74 20 62 65 73 74 20 5b 46 69 6e 64 42 65 73 74  t best [FindBest
5d00: 42 72 65 61 6b 20 24 63 75 72 72 65 6e 74 5d 0a  Break $current].
5d10: 0a 09 09 69 66 20 7b 24 62 65 73 74 20 3c 20 30  ...if {$best < 0
5d20: 7d 20 7b 0a 09 09 20 20 20 20 23 20 54 68 65 20  } {...    # The 
5d30: 69 6e 73 70 65 63 74 65 64 20 72 61 6e 67 65 20  inspected range 
5d40: 68 61 73 20 6e 6f 20 69 6e 74 65 72 6e 61 6c 0a  has no internal.
5d50: 09 09 20 20 20 20 23 20 64 65 70 65 6e 64 65 6e  ..    # dependen
5d60: 63 69 65 73 2e 20 54 68 69 73 20 69 73 20 61 20  cies. This is a 
5d70: 63 6f 6d 70 6c 65 74 65 20 66 72 61 67 6d 65 6e  complete fragmen
5d80: 74 2e 0a 09 09 20 20 20 20 6c 61 70 70 65 6e 64  t....    lappend
5d90: 20 66 72 61 67 6d 65 6e 74 73 20 24 63 75 72 72   fragments $curr
5da0: 65 6e 74 0a 0a 09 09 20 20 20 20 6c 6f 67 20 77  ent....    log w
5db0: 72 69 74 65 20 36 20 63 73 65 74 73 20 22 4e 6f  rite 6 csets "No
5dc0: 20 62 72 65 61 6b 73 2c 20 66 69 6e 61 6c 22 0a   breaks, final".
5dd0: 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20  ..} else {...   
5de0: 20 23 20 53 70 6c 69 74 20 74 68 65 20 72 61 6e   # Split the ran
5df0: 67 65 20 61 6e 64 20 73 63 68 65 64 75 6c 65 20  ge and schedule 
5e00: 74 68 65 20 72 65 73 75 6c 74 69 6e 67 0a 09 09  the resulting...
5e10: 20 20 20 20 23 20 66 72 61 67 6d 65 6e 74 73 20      # fragments 
5e20: 66 6f 72 20 66 75 72 74 68 65 72 20 69 6e 73 70  for further insp
5e30: 65 63 74 69 6f 6e 2e 20 52 65 6d 65 6d 62 65 72  ection. Remember
5e40: 20 74 68 65 0a 09 09 20 20 20 20 23 20 6e 75 6d   the...    # num
5e50: 62 65 72 20 6f 66 20 64 65 70 65 6e 64 65 6e 63  ber of dependenc
5e60: 69 65 73 20 63 75 74 20 62 65 66 6f 72 65 20 77  ies cut before w
5e70: 65 20 72 65 6d 6f 76 65 20 74 68 65 6d 0a 09 09  e remove them...
5e80: 20 20 20 20 23 20 66 72 6f 6d 20 63 6f 6e 73 69      # from consi
5e90: 64 65 72 61 74 69 6f 6e 2c 20 66 6f 72 20 64 6f  deration, for do
5ea0: 63 75 6d 65 6e 74 61 74 69 6f 6e 20 6c 61 74 65  cumentation late
5eb0: 72 2e 0a 0a 09 09 20 20 20 20 73 65 74 20 62 72  r.....    set br
5ec0: 65 61 6b 73 28 24 62 65 73 74 29 20 24 63 72 6f  eaks($best) $cro
5ed0: 73 73 28 24 62 65 73 74 29 0a 0a 09 09 20 20 20  ss($best)....   
5ee0: 20 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65   log write 6 cse
5ef0: 74 73 20 22 42 65 73 74 20 62 72 65 61 6b 20 40  ts "Best break @
5f00: 20 24 62 65 73 74 2c 20 63 75 74 74 69 6e 67 20   $best, cutting 
5f10: 5b 6e 73 70 20 24 63 72 6f 73 73 28 24 62 65 73  [nsp $cross($bes
5f20: 74 29 20 64 65 70 65 6e 64 65 6e 63 79 20 64 65  t) dependency de
5f30: 70 65 6e 64 65 6e 63 69 65 73 5d 22 0a 0a 09 09  pendencies]"....
5f40: 20 20 20 20 23 20 4e 6f 74 65 3a 20 54 68 65 20      # Note: The 
5f50: 76 61 6c 75 65 20 6f 66 20 62 65 73 74 20 69 73  value of best is
5f60: 20 61 6e 20 61 62 6f 6c 75 74 65 20 6c 6f 63 61   an abolute loca
5f70: 74 69 6f 6e 0a 09 09 20 20 20 20 23 20 69 6e 20  tion...    # in 
5f80: 6d 79 69 74 65 6d 73 2e 20 55 73 65 20 74 68 65  myitems. Use the
5f90: 20 73 74 61 72 74 20 6f 66 20 63 75 72 72 65 6e   start of curren
5fa0: 74 20 74 6f 20 6d 61 6b 65 20 69 74 0a 09 09 20  t to make it... 
5fb0: 20 20 20 23 20 61 6e 20 69 6e 64 65 78 20 61 62     # an index ab
5fc0: 73 6f 6c 75 74 65 20 74 6f 20 63 75 72 72 65 6e  solute to curren
5fd0: 74 2e 0a 0a 09 09 20 20 20 20 73 65 74 20 62 72  t.....    set br
5fe0: 65 6c 20 5b 65 78 70 72 20 7b 24 62 65 73 74 20  el [expr {$best 
5ff0: 2d 20 5b 6c 69 6e 64 65 78 20 24 63 75 72 72 65  - [lindex $curre
6000: 6e 74 20 30 5d 7d 5d 0a 09 09 20 20 20 20 73 65  nt 0]}]...    se
6010: 74 20 62 6e 65 78 74 20 24 62 72 65 6c 20 3b 20  t bnext $brel ; 
6020: 69 6e 63 72 20 62 6e 65 78 74 0a 09 09 20 20 20  incr bnext...   
6030: 20 73 65 74 20 66 72 61 67 62 65 66 6f 72 65 20   set fragbefore 
6040: 5b 6c 72 61 6e 67 65 20 24 63 75 72 72 65 6e 74  [lrange $current
6050: 20 30 20 24 62 72 65 6c 5d 0a 09 09 20 20 20 20   0 $brel]...    
6060: 73 65 74 20 66 72 61 67 61 66 74 65 72 20 20 5b  set fragafter  [
6070: 6c 72 61 6e 67 65 20 24 63 75 72 72 65 6e 74 20  lrange $current 
6080: 24 62 6e 65 78 74 20 65 6e 64 5d 0a 0a 09 09 20  $bnext end].... 
6090: 20 20 20 6c 6f 67 20 77 72 69 74 65 20 36 20 63     log write 6 c
60a0: 73 65 74 73 20 22 4e 65 77 20 70 69 65 63 65 73  sets "New pieces
60b0: 20 20 5b 50 52 20 24 66 72 61 67 62 65 66 6f 72    [PR $fragbefor
60c0: 65 5d 20 5b 50 52 20 24 66 72 61 67 61 66 74 65  e] [PR $fragafte
60d0: 72 5d 22 0a 0a 09 09 20 20 20 20 69 6e 74 65 67  r]"....    integ
60e0: 72 69 74 79 20 61 73 73 65 72 74 20 7b 5b 6c 6c  rity assert {[ll
60f0: 65 6e 67 74 68 20 24 66 72 61 67 62 65 66 6f 72  ength $fragbefor
6100: 65 5d 7d 20 7b 46 6f 75 6e 64 20 7a 65 72 6f 2d  e]} {Found zero-
6110: 6c 65 6e 67 74 68 20 66 72 61 67 6d 65 6e 74 20  length fragment 
6120: 61 74 20 74 68 65 20 62 65 67 69 6e 6e 69 6e 67  at the beginning
6130: 7d 0a 09 09 20 20 20 20 69 6e 74 65 67 72 69 74  }...    integrit
6140: 79 20 61 73 73 65 72 74 20 7b 5b 6c 6c 65 6e 67  y assert {[lleng
6150: 74 68 20 24 66 72 61 67 61 66 74 65 72 5d 7d 20  th $fragafter]} 
6160: 20 7b 46 6f 75 6e 64 20 7a 65 72 6f 2d 6c 65 6e   {Found zero-len
6170: 67 74 68 20 66 72 61 67 6d 65 6e 74 20 61 74 20  gth fragment at 
6180: 74 68 65 20 65 6e 64 7d 0a 0a 09 09 20 20 20 20  the end}....    
6190: 6c 61 70 70 65 6e 64 20 6e 65 77 20 24 66 72 61  lappend new $fra
61a0: 67 62 65 66 6f 72 65 20 24 66 72 61 67 61 66 74  gbefore $fragaft
61b0: 65 72 0a 09 09 20 20 20 20 43 75 74 41 74 20 24  er...    CutAt $
61c0: 62 65 73 74 0a 09 09 7d 0a 0a 09 09 69 6e 63 72  best...}....incr
61d0: 20 61 74 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09   at..    }..}...
61e0: 6c 6f 67 20 77 72 69 74 65 20 36 20 63 73 65 74  log write 6 cset
61f0: 73 20 22 2e 20 2e 20 2e 2e 20 2e 2e 2e 20 2e 2e  s ". . .. ... ..
6200: 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 20 2e 2e 2e  ... ........ ...
6210: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 22 0a 0a 09 72 65  .........."...re
6220: 74 75 72 6e 20 24 66 72 61 67 6d 65 6e 74 73 0a  turn $fragments.
6230: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20      }..    proc 
6240: 49 6e 69 74 69 61 6c 69 7a 65 42 72 65 61 6b 53  InitializeBreakS
6250: 74 61 74 65 20 7b 72 65 76 69 73 69 6f 6e 73 7d  tate {revisions}
6260: 20 7b 0a 09 75 70 76 61 72 20 31 20 70 6f 73 20   {..upvar 1 pos 
6270: 70 6f 73 20 63 72 6f 73 73 20 63 72 6f 73 73 20  pos cross cross 
6280: 72 61 6e 67 65 20 72 61 6e 67 65 20 64 65 70 63  range range depc
6290: 20 64 65 70 63 20 64 65 6c 74 61 20 64 65 6c 74   depc delta delt
62a0: 61 20 5c 0a 09 20 20 20 20 64 65 70 65 6e 64 65  a \..    depende
62b0: 6e 63 69 65 73 20 64 65 70 65 6e 64 65 6e 63 69  ncies dependenci
62c0: 65 73 0a 0a 09 23 20 46 69 72 73 74 20 77 65 20  es...# First we 
62d0: 63 72 65 61 74 65 20 61 20 6d 61 70 20 6f 66 20  create a map of 
62e0: 70 6f 73 69 74 69 6f 6e 73 20 74 6f 20 6d 61 6b  positions to mak
62f0: 65 20 69 74 20 65 61 73 69 65 72 20 74 6f 0a 09  e it easier to..
6300: 23 20 64 65 74 65 72 6d 69 6e 65 20 77 68 65 74  # determine whet
6310: 68 65 72 20 61 20 64 65 70 65 6e 64 65 6e 63 79  her a dependency
6320: 20 63 72 6f 73 73 65 73 20 61 20 70 61 72 74 69   crosses a parti
6330: 63 75 6c 61 72 20 69 6e 64 65 78 2e 0a 0a 09 6c  cular index....l
6340: 6f 67 20 77 72 69 74 65 20 31 34 20 63 73 65 74  og write 14 cset
6350: 73 20 7b 49 42 53 3a 20 23 72 65 76 20 5b 6c 6c  s {IBS: #rev [ll
6360: 65 6e 67 74 68 20 24 72 65 76 69 73 69 6f 6e 73  ength $revisions
6370: 5d 7d 0a 09 6c 6f 67 20 77 72 69 74 65 20 31 34  ]}..log write 14
6380: 20 63 73 65 74 73 20 7b 49 42 53 3a 20 70 6f 73   csets {IBS: pos
6390: 20 6d 61 70 2c 20 63 72 6f 73 73 20 63 6f 75 6e   map, cross coun
63a0: 74 65 72 7d 0a 0a 09 61 72 72 61 79 20 73 65 74  ter}...array set
63b0: 20 70 6f 73 20 20 20 7b 7d 0a 09 61 72 72 61 79   pos   {}..array
63c0: 20 73 65 74 20 63 72 6f 73 73 20 7b 7d 0a 09 61   set cross {}..a
63d0: 72 72 61 79 20 73 65 74 20 64 65 70 63 20 20 7b  rray set depc  {
63e0: 7d 0a 09 73 65 74 20 72 61 6e 67 65 20 20 20 20  }..set range    
63f0: 20 20 20 7b 7d 0a 09 73 65 74 20 6e 20 30 0a 09     {}..set n 0..
6400: 66 6f 72 65 61 63 68 20 72 65 76 20 24 72 65 76  foreach rev $rev
6410: 69 73 69 6f 6e 73 20 7b 0a 09 20 20 20 20 6c 61  isions {..    la
6420: 70 70 65 6e 64 20 72 61 6e 67 65 20 24 6e 0a 09  ppend range $n..
6430: 20 20 20 20 73 65 74 20 70 6f 73 28 24 72 65 76      set pos($rev
6440: 29 20 24 6e 0a 09 20 20 20 20 73 65 74 20 63 72  ) $n..    set cr
6450: 6f 73 73 28 24 6e 29 20 30 0a 09 20 20 20 20 69  oss($n) 0..    i
6460: 6e 63 72 20 6e 0a 09 7d 0a 0a 09 6c 6f 67 20 77  ncr n..}...log w
6470: 72 69 74 65 20 31 34 20 63 73 65 74 73 20 7b 49  rite 14 csets {I
6480: 42 53 3a 20 70 6f 73 2f 5b 61 72 72 61 79 20 73  BS: pos/[array s
6490: 69 7a 65 20 70 6f 73 5d 2c 20 63 72 6f 73 73 2f  ize pos], cross/
64a0: 5b 61 72 72 61 79 20 73 69 7a 65 20 63 72 6f 73  [array size cros
64b0: 73 5d 7d 0a 0a 09 23 20 53 65 63 6f 6e 64 6c 79  s]}...# Secondly
64c0: 20 77 65 20 63 6f 75 6e 74 20 74 68 65 20 63 72   we count the cr
64d0: 6f 73 73 69 6e 67 73 20 70 65 72 20 70 6f 73 69  ossings per posi
64e0: 74 69 6f 6e 2c 20 62 79 20 69 74 65 72 61 74 69  tion, by iterati
64f0: 6e 67 0a 09 23 20 6f 76 65 72 20 74 68 65 20 72  ng..# over the r
6500: 65 63 6f 72 64 65 64 20 69 6e 74 65 72 6e 61 6c  ecorded internal
6510: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 0a 0a   dependencies...
6520: 09 23 20 4e 6f 74 65 3a 20 49 66 20 74 68 65 20  .# Note: If the 
6530: 74 69 6d 65 73 74 61 6d 70 73 20 61 72 65 20 62  timestamps are b
6540: 61 64 6c 79 20 6f 75 74 20 6f 66 20 6f 72 64 65  adly out of orde
6550: 72 20 69 74 20 69 73 0a 09 23 20 20 20 20 20 20  r it is..#      
6560: 20 70 6f 73 73 69 62 6c 65 20 74 6f 20 68 61 76   possible to hav
6570: 65 20 61 20 62 61 63 6b 77 61 72 64 20 73 75 63  e a backward suc
6580: 63 65 73 73 6f 72 20 64 65 70 65 6e 64 65 6e 63  cessor dependenc
6590: 79 2c 0a 09 23 20 20 20 20 20 20 20 69 2e 65 2e  y,..#       i.e.
65a0: 20 77 69 74 68 20 73 74 61 72 74 20 3e 20 65 6e   with start > en
65b0: 64 2e 20 57 65 20 6d 61 79 20 68 61 76 65 20 74  d. We may have t
65c0: 6f 20 73 77 61 70 20 74 68 65 20 69 6e 64 69 63  o swap the indic
65d0: 65 73 0a 09 23 20 20 20 20 20 20 20 74 6f 20 65  es..#       to e
65e0: 6e 73 75 72 65 20 74 68 61 74 20 74 68 65 20 66  nsure that the f
65f0: 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70 20 72 75  ollowing loop ru
6600: 6e 73 20 63 6f 72 72 65 63 74 6c 79 2e 0a 09 23  ns correctly...#
6610: 0a 09 23 20 4e 6f 74 65 20 32 3a 20 73 74 61 72  ..# Note 2: star
6620: 74 20 3d 3d 20 65 6e 64 20 69 73 20 6e 6f 74 20  t == end is not 
6630: 70 6f 73 73 69 62 6c 65 2e 20 49 74 20 69 6e 64  possible. It ind
6640: 69 63 61 74 65 73 20 61 0a 09 23 20 20 20 20 20  icates a..#     
6650: 20 20 20 20 73 65 6c 66 2d 64 65 70 65 6e 64 65      self-depende
6660: 6e 63 79 20 64 75 65 20 74 6f 20 74 68 65 20 75  ncy due to the u
6670: 6e 69 71 75 65 6e 65 73 73 20 6f 66 20 70 6f 73  niqueness of pos
6680: 69 74 69 6f 6e 73 2c 0a 09 23 20 20 20 20 20 20  itions,..#      
6690: 20 20 20 61 6e 64 20 74 68 61 74 20 69 73 20 73     and that is s
66a0: 6f 6d 65 74 68 69 6e 67 20 77 65 20 68 61 76 65  omething we have
66b0: 20 72 75 6c 65 64 20 6f 75 74 20 61 6c 72 65 61   ruled out alrea
66c0: 64 79 2c 20 73 65 65 0a 09 23 20 20 20 20 20 20  dy, see..#      
66d0: 20 20 20 27 72 65 76 20 69 6e 74 65 72 6e 61 6c     'rev internal
66e0: 73 75 63 63 65 73 73 6f 72 73 27 2e 0a 0a 09 6c  successors'....l
66f0: 6f 67 20 77 72 69 74 65 20 31 34 20 63 73 65 74  og write 14 cset
6700: 73 20 7b 49 42 53 3a 20 63 72 6f 73 73 20 63 6f  s {IBS: cross co
6710: 75 6e 74 65 72 20 66 69 6c 6c 69 6e 67 2c 20 70  unter filling, p
6720: 6f 73 2f 63 72 6f 73 73 20 6d 61 70 7d 0a 0a 09  os/cross map}...
6730: 66 6f 72 65 61 63 68 20 7b 72 69 64 20 63 68 69  foreach {rid chi
6740: 6c 64 72 65 6e 7d 20 5b 61 72 72 61 79 20 67 65  ldren} [array ge
6750: 74 20 64 65 70 65 6e 64 65 6e 63 69 65 73 5d 20  t dependencies] 
6760: 7b 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 63  {..    foreach c
6770: 68 69 6c 64 20 24 63 68 69 6c 64 72 65 6e 20 7b  hild $children {
6780: 0a 09 09 73 65 74 20 64 6b 65 79 20 20 20 20 5b  ...set dkey    [
6790: 6c 69 73 74 20 24 72 69 64 20 24 63 68 69 6c 64  list $rid $child
67a0: 5d 0a 09 09 73 65 74 20 73 74 61 72 74 20 20 20  ]...set start   
67b0: 24 70 6f 73 28 24 72 69 64 29 0a 09 09 73 65 74  $pos($rid)...set
67c0: 20 65 6e 64 20 20 20 20 20 24 70 6f 73 28 24 63   end     $pos($c
67d0: 68 69 6c 64 29 0a 0a 09 09 69 66 20 7b 24 73 74  hild)....if {$st
67e0: 61 72 74 20 3e 20 24 65 6e 64 7d 20 7b 0a 09 09  art > $end} {...
67f0: 20 20 20 20 73 65 74 20 63 72 6f 73 73 65 73 20      set crosses 
6800: 5b 6c 69 73 74 20 24 65 6e 64 20 5b 65 78 70 72  [list $end [expr
6810: 20 7b 24 73 74 61 72 74 2d 31 7d 5d 5d 0a 09 09   {$start-1}]]...
6820: 20 20 20 20 77 68 69 6c 65 20 7b 24 65 6e 64 20      while {$end 
6830: 3c 20 24 73 74 61 72 74 7d 20 7b 0a 09 09 09 69  < $start} {....i
6840: 6e 63 72 20 63 72 6f 73 73 28 24 65 6e 64 29 0a  ncr cross($end).
6850: 09 09 09 69 6e 63 72 20 65 6e 64 0a 09 09 20 20  ...incr end...  
6860: 20 20 7d 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09    }...} else {..
6870: 09 20 20 20 20 73 65 74 20 63 72 6f 73 73 65 73  .    set crosses
6880: 20 5b 6c 69 73 74 20 24 73 74 61 72 74 20 5b 65   [list $start [e
6890: 78 70 72 20 7b 24 65 6e 64 2d 31 7d 5d 5d 0a 09  xpr {$end-1}]]..
68a0: 09 20 20 20 20 77 68 69 6c 65 20 7b 24 73 74 61  .    while {$sta
68b0: 72 74 20 3c 20 24 65 6e 64 7d 20 7b 0a 09 09 09  rt < $end} {....
68c0: 69 6e 63 72 20 63 72 6f 73 73 28 24 73 74 61 72  incr cross($star
68d0: 74 29 0a 09 09 09 69 6e 63 72 20 73 74 61 72 74  t)....incr start
68e0: 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a 09 09 73  ...    }...}...s
68f0: 65 74 20 64 65 70 63 28 24 64 6b 65 79 29 20 24  et depc($dkey) $
6900: 63 72 6f 73 73 65 73 0a 09 20 20 20 20 7d 0a 09  crosses..    }..
6910: 7d 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 31 34  }...log write 14
6920: 20 63 73 65 74 73 20 7b 49 42 53 3a 20 70 6f 73   csets {IBS: pos
6930: 2f 5b 61 72 72 61 79 20 73 69 7a 65 20 70 6f 73  /[array size pos
6940: 5d 2c 20 63 72 6f 73 73 2f 5b 61 72 72 61 79 20  ], cross/[array 
6950: 73 69 7a 65 20 63 72 6f 73 73 5d 2c 20 64 65 70  size cross], dep
6960: 63 2f 5b 61 72 72 61 79 20 73 69 7a 65 20 64 65  c/[array size de
6970: 70 63 5d 20 28 66 6f 72 20 5b 6c 6c 65 6e 67 74  pc] (for [llengt
6980: 68 20 24 72 65 76 69 73 69 6f 6e 73 5d 29 7d 0a  h $revisions])}.
6990: 09 6c 6f 67 20 77 72 69 74 65 20 31 34 20 63 73  .log write 14 cs
69a0: 65 74 73 20 7b 49 42 53 3a 20 74 69 6d 65 73 74  ets {IBS: timest
69b0: 61 6d 70 73 2c 20 64 65 6c 74 61 73 7d 0a 0a 09  amps, deltas}...
69c0: 49 6e 69 74 69 61 6c 69 7a 65 44 65 6c 74 61 73  InitializeDeltas
69d0: 20 24 72 65 76 69 73 69 6f 6e 73 0a 0a 09 6c 6f   $revisions...lo
69e0: 67 20 77 72 69 74 65 20 31 34 20 63 73 65 74 73  g write 14 csets
69f0: 20 7b 49 42 53 3a 20 64 65 6c 74 61 20 5b 61 72   {IBS: delta [ar
6a00: 72 61 79 20 73 69 7a 65 20 64 65 6c 74 61 5d 7d  ray size delta]}
6a10: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
6a20: 20 20 20 20 70 72 6f 63 20 49 6e 69 74 69 61 6c      proc Initial
6a30: 69 7a 65 44 65 6c 74 61 73 20 7b 72 65 76 69 73  izeDeltas {revis
6a40: 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31  ions} {..upvar 1
6a50: 20 64 65 6c 74 61 20 64 65 6c 74 61 0a 0a 09 23   delta delta...#
6a60: 20 50 75 6c 6c 20 74 68 65 20 74 69 6d 65 73 74   Pull the timest
6a70: 61 6d 70 73 20 66 6f 72 20 61 6c 6c 20 72 65 76  amps for all rev
6a80: 69 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 63 68  isions in the ch
6a90: 61 6e 67 65 73 65 74 73 20 61 6e 64 0a 09 23 20  angesets and..# 
6aa0: 63 6f 6d 70 75 74 65 20 74 68 65 69 72 20 64 65  compute their de
6ab0: 6c 74 61 73 20 66 6f 72 20 75 73 65 20 62 79 20  ltas for use by 
6ac0: 74 68 65 20 62 72 65 61 6b 20 66 69 6e 64 65 72  the break finder
6ad0: 2e 0a 0a 09 61 72 72 61 79 20 73 65 74 20 64 65  ....array set de
6ae0: 6c 74 61 20 7b 7d 0a 09 61 72 72 61 79 20 73 65  lta {}..array se
6af0: 74 20 73 74 61 6d 70 20 7b 7d 0a 0a 09 73 65 74  t stamp {}...set
6b00: 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20   theset ('[join 
6b10: 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d  $revisions {','}
6b20: 5d 27 29 0a 09 66 6f 72 65 61 63 68 20 7b 72 69  ]')..foreach {ri
6b30: 64 20 74 69 6d 65 7d 20 5b 73 74 61 74 65 20 72  d time} [state r
6b40: 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d  un [subst -nocom
6b50: 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61  mands -nobacksla
6b60: 73 68 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45  shes {..    SELE
6b70: 43 54 20 52 2e 72 69 64 2c 20 52 2e 64 61 74 65  CT R.rid, R.date
6b80: 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69 73  ..    FROM revis
6b90: 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45  ion R..    WHERE
6ba0: 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65   R.rid IN $these
6bb0: 74 0a 09 7d 5d 5d 20 7b 0a 09 20 20 20 20 73 65  t..}]] {..    se
6bc0: 74 20 73 74 61 6d 70 28 24 72 69 64 29 20 24 74  t stamp($rid) $t
6bd0: 69 6d 65 0a 09 7d 0a 0a 09 6c 6f 67 20 77 72 69  ime..}...log wri
6be0: 74 65 20 31 34 20 63 73 65 74 73 20 7b 49 42 53  te 14 csets {IBS
6bf0: 3a 20 73 74 61 6d 70 20 5b 61 72 72 61 79 20 73  : stamp [array s
6c00: 69 7a 65 20 73 74 61 6d 70 5d 7d 0a 0a 09 73 65  ize stamp]}...se
6c10: 74 20 6e 20 30 0a 09 66 6f 72 65 61 63 68 20 72  t n 0..foreach r
6c20: 69 64 20 5b 6c 72 61 6e 67 65 20 24 72 65 76 69  id [lrange $revi
6c30: 73 69 6f 6e 73 20 30 20 65 6e 64 2d 31 5d 20 72  sions 0 end-1] r
6c40: 6e 65 78 74 20 5b 6c 72 61 6e 67 65 20 24 72 65  next [lrange $re
6c50: 76 69 73 69 6f 6e 73 20 31 20 65 6e 64 5d 20 7b  visions 1 end] {
6c60: 0a 09 20 20 20 20 73 65 74 20 64 65 6c 74 61 28  ..    set delta(
6c70: 24 6e 29 20 5b 65 78 70 72 20 7b 24 73 74 61 6d  $n) [expr {$stam
6c80: 70 28 24 72 6e 65 78 74 29 20 2d 20 24 73 74 61  p($rnext) - $sta
6c90: 6d 70 28 24 72 69 64 29 7d 5d 0a 09 20 20 20 20  mp($rid)}]..    
6ca0: 69 6e 63 72 20 6e 0a 09 7d 0a 09 72 65 74 75 72  incr n..}..retur
6cb0: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f  n.    }..    pro
6cc0: 63 20 46 69 6e 64 42 65 73 74 42 72 65 61 6b 20  c FindBestBreak 
6cd0: 7b 72 61 6e 67 65 7d 20 7b 0a 09 75 70 76 61 72  {range} {..upvar
6ce0: 20 31 20 63 72 6f 73 73 20 63 72 6f 73 73 20 64   1 cross cross d
6cf0: 65 6c 74 61 20 64 65 6c 74 61 0a 0a 09 23 20 44  elta delta...# D
6d00: 65 74 65 72 6d 69 6e 65 20 74 68 65 20 62 65 73  etermine the bes
6d10: 74 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e  t break location
6d20: 20 69 6e 20 74 68 65 20 67 69 76 65 6e 20 72 61   in the given ra
6d30: 6e 67 65 20 6f 66 0a 09 23 20 70 6f 73 69 74 69  nge of..# positi
6d40: 6f 6e 73 2e 20 46 69 72 73 74 20 77 65 20 6c 6f  ons. First we lo
6d50: 6f 6b 20 66 6f 72 20 74 68 65 20 6c 6f 63 61 74  ok for the locat
6d60: 69 6f 6e 73 20 77 69 74 68 20 74 68 65 20 6d 61  ions with the ma
6d70: 78 69 6d 61 6c 0a 09 23 20 6e 75 6d 62 65 72 20  ximal..# number 
6d80: 6f 66 20 63 72 6f 73 73 69 6e 67 73 2e 20 49 66  of crossings. If
6d90: 20 74 68 65 72 65 20 61 72 65 20 73 65 76 65 72   there are sever
6da0: 61 6c 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74  al we look for t
6db0: 68 65 0a 09 23 20 73 68 6f 72 74 65 73 74 20 74  he..# shortest t
6dc0: 69 6d 65 20 69 6e 74 65 72 76 61 6c 20 61 6d 6f  ime interval amo
6dd0: 6e 67 20 74 68 65 6d 2e 20 49 66 20 77 65 20 73  ng them. If we s
6de0: 74 69 6c 6c 20 68 61 76 65 20 6d 75 6c 74 69 70  till have multip
6df0: 6c 65 0a 09 23 20 70 6f 73 73 69 62 69 6c 69 74  le..# possibilit
6e00: 69 65 73 20 61 66 74 65 72 20 74 68 61 74 20 77  ies after that w
6e10: 65 20 73 65 6c 65 63 74 20 74 68 65 20 65 61 72  e select the ear
6e20: 6c 69 65 73 74 20 6c 6f 63 61 74 69 6f 6e 0a 09  liest location..
6e30: 23 20 61 6d 6f 6e 67 20 74 68 65 73 65 2e 0a 0a  # among these...
6e40: 09 23 20 4e 6f 74 65 3a 20 49 66 20 74 68 65 20  .# Note: If the 
6e50: 6d 61 78 69 6d 61 6c 20 6e 75 6d 62 65 72 20 6f  maximal number o
6e60: 66 20 63 72 6f 73 73 69 6e 67 73 20 69 73 20 30  f crossings is 0
6e70: 20 74 68 65 6e 20 74 68 65 20 72 61 6e 67 65 0a   then the range.
6e80: 09 23 20 20 20 20 20 20 20 68 61 73 20 6e 6f 20  .#       has no 
6e90: 69 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65  internal depende
6ea0: 6e 63 69 65 73 2c 20 61 6e 64 20 6e 6f 20 62 72  ncies, and no br
6eb0: 65 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 61 74 0a  eak location at.
6ec0: 09 23 20 20 20 20 20 20 20 61 6c 6c 2e 20 54 68  .#       all. Th
6ed0: 69 73 20 70 6f 73 73 69 62 69 6c 69 74 79 20 69  is possibility i
6ee0: 73 20 73 69 67 6e 61 6c 65 64 20 76 69 61 20 72  s signaled via r
6ef0: 65 73 75 6c 74 20 2d 31 2e 0a 0a 09 23 20 4e 6f  esult -1....# No
6f00: 74 65 3a 20 41 20 72 61 6e 67 65 20 6f 66 20 6c  te: A range of l
6f10: 65 6e 67 74 68 20 31 20 6f 72 20 6c 65 73 73 20  ength 1 or less 
6f20: 63 61 6e 6e 6f 74 20 68 61 76 65 20 69 6e 74 65  cannot have inte
6f30: 72 6e 61 6c 0a 09 23 20 20 20 20 20 20 20 64 65  rnal..#       de
6f40: 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 20 74  pendencies, as t
6f50: 68 61 74 20 6e 65 65 64 73 20 61 74 20 6c 65 61  hat needs at lea
6f60: 73 74 20 74 77 6f 20 72 65 76 69 73 69 6f 6e 73  st two revisions
6f70: 20 69 6e 0a 09 23 20 20 20 20 20 20 20 74 68 65   in..#       the
6f80: 20 72 61 6e 67 65 2e 0a 0a 09 69 66 20 7b 5b 6c   range....if {[l
6f90: 6c 65 6e 67 74 68 20 24 72 61 6e 67 65 5d 20 3c  length $range] <
6fa0: 20 32 7d 20 7b 20 72 65 74 75 72 6e 20 2d 31 20   2} { return -1 
6fb0: 7d 0a 0a 09 73 65 74 20 6d 61 78 20 2d 31 0a 09  }...set max -1..
6fc0: 73 65 74 20 62 65 73 74 20 7b 7d 0a 0a 09 66 6f  set best {}...fo
6fd0: 72 65 61 63 68 20 6c 6f 63 61 74 69 6f 6e 20 24  reach location $
6fe0: 72 61 6e 67 65 20 7b 0a 09 20 20 20 20 73 65 74  range {..    set
6ff0: 20 63 72 6f 73 73 69 6e 67 73 20 24 63 72 6f 73   crossings $cros
7000: 73 28 24 6c 6f 63 61 74 69 6f 6e 29 0a 09 20 20  s($location)..  
7010: 20 20 69 66 20 7b 24 63 72 6f 73 73 69 6e 67 73    if {$crossings
7020: 20 3e 20 24 6d 61 78 7d 20 7b 0a 09 09 73 65 74   > $max} {...set
7030: 20 6d 61 78 20 20 24 63 72 6f 73 73 69 6e 67 73   max  $crossings
7040: 0a 09 09 73 65 74 20 62 65 73 74 20 5b 6c 69 73  ...set best [lis
7050: 74 20 24 6c 6f 63 61 74 69 6f 6e 5d 0a 09 09 63  t $location]...c
7060: 6f 6e 74 69 6e 75 65 0a 09 20 20 20 20 7d 20 65  ontinue..    } e
7070: 6c 73 65 69 66 20 7b 24 63 72 6f 73 73 69 6e 67  lseif {$crossing
7080: 73 20 3d 3d 20 24 6d 61 78 7d 20 7b 0a 09 09 6c  s == $max} {...l
7090: 61 70 70 65 6e 64 20 62 65 73 74 20 24 6c 6f 63  append best $loc
70a0: 61 74 69 6f 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a  ation..    }..}.
70b0: 0a 09 69 66 20 7b 24 6d 61 78 20 3d 3d 20 30 7d  ..if {$max == 0}
70c0: 20 20 20 20 20 20 20 20 20 20 20 20 7b 20 72 65              { re
70d0: 74 75 72 6e 20 2d 31 20 7d 0a 09 69 66 20 7b 5b  turn -1 }..if {[
70e0: 6c 6c 65 6e 67 74 68 20 24 62 65 73 74 5d 20 3d  llength $best] =
70f0: 3d 20 31 7d 20 7b 20 72 65 74 75 72 6e 20 5b 6c  = 1} { return [l
7100: 69 6e 64 65 78 20 24 62 65 73 74 20 30 5d 20 7d  index $best 0] }
7110: 0a 0a 09 73 65 74 20 6c 6f 63 61 74 69 6f 6e 73  ...set locations
7120: 20 24 62 65 73 74 0a 09 73 65 74 20 62 65 73 74   $best..set best
7130: 20 7b 7d 0a 09 73 65 74 20 6d 69 6e 20 2d 31 0a   {}..set min -1.
7140: 0a 09 66 6f 72 65 61 63 68 20 6c 6f 63 61 74 69  ..foreach locati
7150: 6f 6e 20 24 6c 6f 63 61 74 69 6f 6e 73 20 7b 0a  on $locations {.
7160: 09 20 20 20 20 73 65 74 20 69 6e 74 65 72 76 61  .    set interva
7170: 6c 20 24 64 65 6c 74 61 28 24 6c 6f 63 61 74 69  l $delta($locati
7180: 6f 6e 29 0a 09 20 20 20 20 69 66 20 7b 28 24 6d  on)..    if {($m
7190: 69 6e 20 3c 20 30 29 20 7c 7c 20 28 24 69 6e 74  in < 0) || ($int
71a0: 65 72 76 61 6c 20 3c 20 24 6d 69 6e 29 7d 20 7b  erval < $min)} {
71b0: 0a 09 09 73 65 74 20 6d 69 6e 20 20 24 69 6e 74  ...set min  $int
71c0: 65 72 76 61 6c 0a 09 09 73 65 74 20 62 65 73 74  erval...set best
71d0: 20 5b 6c 69 73 74 20 24 6c 6f 63 61 74 69 6f 6e   [list $location
71e0: 5d 0a 09 20 20 20 20 7d 20 65 6c 73 65 69 66 20  ]..    } elseif 
71f0: 7b 24 69 6e 74 65 72 76 61 6c 20 3d 3d 20 24 6d  {$interval == $m
7200: 69 6e 7d 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20  in} {...lappend 
7210: 62 65 73 74 20 24 6c 6f 63 61 74 69 6f 6e 0a 09  best $location..
7220: 20 20 20 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b 5b      }..}...if {[
7230: 6c 6c 65 6e 67 74 68 20 24 62 65 73 74 5d 20 3d  llength $best] =
7240: 3d 20 31 7d 20 7b 20 72 65 74 75 72 6e 20 5b 6c  = 1} { return [l
7250: 69 6e 64 65 78 20 24 62 65 73 74 20 30 5d 20 7d  index $best 0] }
7260: 0a 0a 09 72 65 74 75 72 6e 20 5b 6c 69 6e 64 65  ...return [linde
7270: 78 20 5b 6c 73 6f 72 74 20 2d 69 6e 74 65 67 65  x [lsort -intege
7280: 72 20 2d 69 6e 63 72 65 61 73 69 6e 67 20 24 62  r -increasing $b
7290: 65 73 74 5d 20 30 5d 0a 20 20 20 20 7d 0a 0a 20  est] 0].    }.. 
72a0: 20 20 20 70 72 6f 63 20 43 75 74 41 74 20 7b 6c     proc CutAt {l
72b0: 6f 63 61 74 69 6f 6e 7d 20 7b 0a 09 75 70 76 61  ocation} {..upva
72c0: 72 20 31 20 63 72 6f 73 73 20 63 72 6f 73 73 20  r 1 cross cross 
72d0: 64 65 70 63 20 64 65 70 63 0a 0a 09 23 20 49 74  depc depc...# It
72e0: 20 77 61 73 20 64 65 63 69 64 65 64 20 74 6f 20   was decided to 
72f0: 73 70 6c 69 74 20 74 68 65 20 63 68 61 6e 67 65  split the change
7300: 73 65 74 20 61 74 20 74 68 65 20 67 69 76 65 6e  set at the given
7310: 0a 09 23 20 6c 6f 63 61 74 69 6f 6e 2e 20 54 68  ..# location. Th
7320: 69 73 20 63 75 74 73 20 61 20 6e 75 6d 62 65 72  is cuts a number
7330: 20 6f 66 20 64 65 70 65 6e 64 65 6e 63 69 65 73   of dependencies
7340: 2e 20 48 65 72 65 20 77 65 20 75 70 64 61 74 65  . Here we update
7350: 0a 09 23 20 74 68 65 20 63 72 6f 73 73 20 69 6e  ..# the cross in
7360: 66 6f 72 6d 61 74 69 6f 6e 20 73 6f 20 74 68 61  formation so tha
7370: 74 20 74 68 65 20 62 72 65 61 6b 20 66 69 6e 64  t the break find
7380: 65 72 20 68 61 73 20 61 63 63 75 72 61 74 65 0a  er has accurate.
7390: 09 23 20 64 61 74 61 20 77 68 65 6e 20 77 65 20  .# data when we 
73a0: 6c 6f 6f 6b 20 61 74 20 74 68 65 20 67 65 6e 65  look at the gene
73b0: 72 61 74 65 64 20 66 72 61 67 6d 65 6e 74 73 2e  rated fragments.
73c0: 0a 0a 09 73 65 74 20 73 69 78 20 5b 6c 6f 67 20  ...set six [log 
73d0: 76 69 73 69 62 6c 65 3f 20 36 5d 0a 0a 09 23 20  visible? 6]...# 
73e0: 4e 6f 74 65 3a 20 54 68 65 20 6c 6f 6f 70 20 62  Note: The loop b
73f0: 65 6c 6f 77 20 63 6f 75 6c 64 20 62 65 20 6d 61  elow could be ma
7400: 64 65 20 66 61 73 74 65 72 20 62 79 20 6b 65 65  de faster by kee
7410: 70 69 6e 67 20 61 20 6d 61 70 0a 09 23 20 66 72  ping a map..# fr
7420: 6f 6d 20 70 6f 73 69 74 69 6f 6e 73 20 74 6f 20  om positions to 
7430: 74 68 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73  the dependencies
7440: 20 63 72 6f 73 73 69 6e 67 2e 20 41 6e 20 65 78   crossing. An ex
7450: 74 65 6e 73 69 6f 6e 20 6f 66 0a 09 23 20 43 52  tension of..# CR
7460: 4f 53 53 2c 20 69 2e 65 2e 20 6c 69 73 74 20 6f  OSS, i.e. list o
7470: 66 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20  f dependencies, 
7480: 63 6f 75 6e 74 65 72 20 69 73 20 69 6d 70 6c 69  counter is impli
7490: 65 64 2e 20 54 61 6b 65 73 0a 09 23 20 61 20 6c  ed. Takes..# a l
74a0: 6f 74 20 6d 6f 72 65 20 6d 65 6d 6f 72 79 20 68  ot more memory h
74b0: 6f 77 65 76 65 72 2c 20 61 6e 64 20 74 61 6b 65  owever, and take
74c0: 73 20 74 69 6d 65 20 74 6f 20 75 70 64 61 74 65  s time to update
74d0: 20 68 65 72 65 0a 09 23 20 28 54 68 65 20 69 6e   here..# (The in
74e0: 6e 65 72 20 6c 6f 6f 70 20 69 73 20 6e 6f 74 20  ner loop is not 
74f0: 69 6e 63 72 20 2d 31 2c 20 62 75 74 20 6c 64 65  incr -1, but lde
7500: 6c 65 74 65 29 2e 0a 0a 09 66 6f 72 65 61 63 68  lete)....foreach
7510: 20 64 65 70 20 5b 61 72 72 61 79 20 6e 61 6d 65   dep [array name
7520: 73 20 64 65 70 63 5d 20 7b 0a 09 20 20 20 20 73  s depc] {..    s
7530: 65 74 20 72 61 6e 67 65 20 24 64 65 70 63 28 24  et range $depc($
7540: 64 65 70 29 0a 09 20 20 20 20 23 20 43 68 65 63  dep)..    # Chec
7550: 6b 20 61 6c 6c 20 64 65 70 65 6e 64 65 6e 63 69  k all dependenci
7560: 65 73 20 73 74 69 6c 6c 20 6b 6e 6f 77 6e 2c 20  es still known, 
7570: 74 61 6b 65 20 74 68 65 69 72 20 72 61 6e 67 65  take their range
7580: 20 61 6e 64 0a 09 20 20 20 20 23 20 73 65 65 20   and..    # see 
7590: 69 66 20 74 68 65 20 62 72 65 61 6b 20 6c 6f 63  if the break loc
75a0: 61 74 69 6f 6e 20 66 61 6c 6c 73 20 77 69 74 68  ation falls with
75b0: 69 6e 2e 0a 0a 09 20 20 20 20 42 6f 72 64 65 72  in....    Border
75c0: 20 24 72 61 6e 67 65 20 73 20 65 0a 09 20 20 20   $range s e..   
75d0: 20 69 66 20 7b 24 6c 6f 63 61 74 69 6f 6e 20 3c   if {$location <
75e0: 20 24 73 7d 20 63 6f 6e 74 69 6e 75 65 20 3b 20   $s} continue ; 
75f0: 23 20 62 72 65 61 6b 20 62 65 66 6f 72 65 20 72  # break before r
7600: 61 6e 67 65 2c 20 69 67 6e 6f 72 65 0a 09 20 20  ange, ignore..  
7610: 20 20 69 66 20 7b 24 6c 6f 63 61 74 69 6f 6e 20    if {$location 
7620: 3e 20 24 65 7d 20 63 6f 6e 74 69 6e 75 65 20 3b  > $e} continue ;
7630: 20 23 20 62 72 65 61 6b 20 61 66 74 65 72 20 72   # break after r
7640: 61 6e 67 65 2c 20 69 67 6e 6f 72 65 2e 0a 0a 09  ange, ignore....
7650: 20 20 20 20 23 20 54 68 69 73 20 64 65 70 65 6e      # This depen
7660: 64 65 6e 63 79 20 63 72 6f 73 73 65 73 20 74 68  dency crosses th
7670: 65 20 62 72 65 61 6b 20 6c 6f 63 61 74 69 6f 6e  e break location
7680: 2e 20 57 65 20 72 65 6d 6f 76 65 20 69 74 0a 09  . We remove it..
7690: 20 20 20 20 23 20 66 72 6f 6d 20 74 68 65 20 63      # from the c
76a0: 72 6f 73 73 69 6e 67 73 20 63 6f 75 6e 74 65 72  rossings counter
76b0: 73 2c 20 61 6e 64 20 74 68 65 6e 20 61 6c 73 6f  s, and then also
76c0: 20 66 72 6f 6d 20 74 68 65 20 73 65 74 0a 09 20   from the set.. 
76d0: 20 20 20 23 20 6f 66 20 6b 6e 6f 77 6e 20 64 65     # of known de
76e0: 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 20 77  pendencies, as w
76f0: 65 20 61 72 65 20 64 6f 6e 65 20 77 69 74 68 20  e are done with 
7700: 69 74 2e 0a 0a 09 20 20 20 20 42 6f 72 64 65 72  it....    Border
7710: 20 24 64 65 70 63 28 24 64 65 70 29 20 64 73 20   $depc($dep) ds 
7720: 64 65 0a 09 20 20 20 20 66 6f 72 20 7b 73 65 74  de..    for {set
7730: 20 6c 6f 63 20 24 64 73 7d 20 7b 24 6c 6f 63 20   loc $ds} {$loc 
7740: 3c 3d 20 24 64 65 7d 20 7b 69 6e 63 72 20 6c 6f  <= $de} {incr lo
7750: 63 7d 20 7b 0a 09 09 69 6e 63 72 20 63 72 6f 73  c} {...incr cros
7760: 73 28 24 6c 6f 63 29 20 2d 31 0a 09 20 20 20 20  s($loc) -1..    
7770: 7d 0a 09 20 20 20 20 75 6e 73 65 74 20 64 65 70  }..    unset dep
7780: 63 28 24 64 65 70 29 0a 0a 09 20 20 20 20 69 66  c($dep)...    if
7790: 20 7b 21 24 73 69 78 7d 20 63 6f 6e 74 69 6e 75   {!$six} continu
77a0: 65 0a 0a 09 20 20 20 20 73 74 72 75 63 74 3a 3a  e...    struct::
77b0: 6c 69 73 74 20 61 73 73 69 67 6e 20 24 64 65 70  list assign $dep
77c0: 20 70 61 72 65 6e 74 20 63 68 69 6c 64 0a 09 20   parent child.. 
77d0: 20 20 20 6c 6f 67 20 77 72 69 74 65 20 35 20 63     log write 5 c
77e0: 73 65 74 73 20 22 42 72 6f 6b 65 20 64 65 70 65  sets "Broke depe
77f0: 6e 64 65 6e 63 79 20 5b 50 44 20 24 70 61 72 65  ndency [PD $pare
7800: 6e 74 5d 20 2d 2d 3e 20 5b 50 44 20 24 63 68 69  nt] --> [PD $chi
7810: 6c 64 5d 22 0a 09 7d 0a 0a 09 72 65 74 75 72 6e  ld]"..}...return
7820: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 50 72  .    }..    # Pr
7830: 69 6e 74 20 69 64 65 6e 74 69 66 79 69 6e 67 20  int identifying 
7840: 64 61 74 61 20 66 6f 72 20 61 20 72 65 76 69 73  data for a revis
7850: 69 6f 6e 20 28 70 72 6f 6a 65 63 74 2c 20 66 69  ion (project, fi
7860: 6c 65 2c 20 64 6f 74 74 65 64 20 72 65 76 0a 20  le, dotted rev. 
7870: 20 20 20 23 20 6e 75 6d 62 65 72 29 2c 20 66 6f     # number), fo
7880: 72 20 68 69 67 68 20 76 65 72 62 6f 73 69 74 79  r high verbosity
7890: 20 6c 6f 67 20 6f 75 74 70 75 74 2e 0a 20 20 20   log output..   
78a0: 20 23 20 54 4f 44 4f 3a 20 52 65 70 6c 61 63 65   # TODO: Replace
78b0: 20 77 69 74 68 20 63 61 6c 6c 20 74 6f 20 69 74   with call to it
78c0: 65 6d 73 74 72 20 28 6c 69 73 74 20 72 65 76 20  emstr (list rev 
78d0: 24 69 64 29 0a 0a 20 20 20 20 70 72 6f 63 20 50  $id)..    proc P
78e0: 44 20 7b 69 64 7d 20 7b 0a 09 66 6f 72 65 61 63  D {id} {..foreac
78f0: 68 20 7b 70 20 66 20 72 7d 20 5b 73 74 61 74 65  h {p f r} [state
7900: 20 72 75 6e 20 7b 0a 09 09 53 45 4c 45 43 54 20   run {...SELECT 
7910: 50 2e 6e 61 6d 65 20 2c 20 46 2e 6e 61 6d 65 2c  P.name , F.name,
7920: 20 52 2e 72 65 76 0a 09 09 46 52 4f 4d 20 72 65   R.rev...FROM re
7930: 76 69 73 69 6f 6e 20 52 2c 20 66 69 6c 65 20 46  vision R, file F
7940: 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09 09 57 48  , project P...WH
7950: 45 52 45 20 52 2e 72 69 64 20 3d 20 24 69 64 20  ERE R.rid = $id 
7960: 20 20 20 2d 2d 20 46 69 6e 64 20 73 70 65 63 69     -- Find speci
7970: 66 69 65 64 20 66 69 6c 65 20 72 65 76 69 73 69  fied file revisi
7980: 6f 6e 0a 09 09 41 4e 44 20 20 20 46 2e 66 69 64  on...AND   F.fid
7990: 20 3d 20 52 2e 66 69 64 20 20 2d 2d 20 47 65 74   = R.fid  -- Get
79a0: 20 66 69 6c 65 20 6f 66 20 74 68 65 20 72 65 76   file of the rev
79b0: 69 73 69 6f 6e 0a 09 09 41 4e 44 20 20 20 50 2e  ision...AND   P.
79c0: 70 69 64 20 3d 20 46 2e 70 69 64 20 20 2d 2d 20  pid = F.pid  -- 
79d0: 47 65 74 20 70 72 6f 6a 65 63 74 20 6f 66 20 74  Get project of t
79e0: 68 65 20 66 69 6c 65 2e 0a 09 7d 5d 20 62 72 65  he file...}] bre
79f0: 61 6b 0a 09 72 65 74 75 72 6e 20 22 27 24 70 20  ak..return "'$p 
7a00: 3a 20 24 66 2f 24 72 27 22 0a 20 20 20 20 7d 0a  : $f/$r'".    }.
7a10: 0a 20 20 20 20 23 20 50 72 69 6e 74 69 6e 67 20  .    # Printing 
7a20: 6f 6e 65 20 6f 72 20 6d 6f 72 65 20 72 61 6e 67  one or more rang
7a30: 65 73 2c 20 66 6f 72 6d 61 74 74 65 64 2c 20 61  es, formatted, a
7a40: 6e 64 20 6f 6e 6c 79 20 74 68 65 69 72 20 62 6f  nd only their bo
7a50: 72 64 65 72 20 74 6f 0a 20 20 20 20 23 20 6b 65  rder to.    # ke
7a60: 65 70 20 74 68 65 20 73 74 72 69 6e 67 73 20 73  ep the strings s
7a70: 68 6f 72 74 2e 0a 0a 20 20 20 20 70 72 6f 63 20  hort...    proc 
7a80: 50 52 73 20 7b 72 61 6e 67 65 73 7d 20 7b 0a 09  PRs {ranges} {..
7a90: 72 65 74 75 72 6e 20 5b 73 74 72 75 63 74 3a 3a  return [struct::
7aa0: 6c 69 73 74 20 6d 61 70 20 24 72 61 6e 67 65 73  list map $ranges
7ab0: 20 5b 6d 79 70 72 6f 63 20 50 52 5d 5d 0a 20 20   [myproc PR]].  
7ac0: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 50 52    }..    proc PR
7ad0: 20 7b 72 61 6e 67 65 7d 20 7b 0a 09 42 6f 72 64   {range} {..Bord
7ae0: 65 72 20 24 72 61 6e 67 65 20 73 20 65 0a 09 72  er $range s e..r
7af0: 65 74 75 72 6e 20 3c 24 7b 73 7d 2e 2e 2e 24 7b  eturn <${s}...${
7b00: 65 7d 3e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  e}>.    }..    p
7b10: 72 6f 63 20 42 6f 72 64 65 72 20 7b 72 61 6e 67  roc Border {rang
7b20: 65 20 73 76 20 65 76 7d 20 7b 0a 09 75 70 76 61  e sv ev} {..upva
7b30: 72 20 31 20 24 73 76 20 73 20 24 65 76 20 65 0a  r 1 $sv s $ev e.
7b40: 09 73 65 74 20 73 20 5b 6c 69 6e 64 65 78 20 24  .set s [lindex $
7b50: 72 61 6e 67 65 20 30 5d 0a 09 73 65 74 20 65 20  range 0]..set e 
7b60: 5b 6c 69 6e 64 65 78 20 24 72 61 6e 67 65 20 65  [lindex $range e
7b70: 6e 64 5d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  nd]..return.    
7b80: 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23  }..    # # ## ##
7b90: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
7ba0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a   #############..
7bb0: 20 20 20 20 70 72 6f 63 20 55 6e 6d 61 70 49 74      proc UnmapIt
7bc0: 65 6d 73 20 7b 74 68 65 74 79 70 65 20 74 68 65  ems {thetype the
7bd0: 69 74 65 6d 73 7d 20 7b 0a 09 23 20 28 2a 29 20  items} {..# (*) 
7be0: 57 65 20 63 6c 65 61 72 20 6f 75 74 20 74 68 65  We clear out the
7bf0: 20 61 73 73 6f 63 69 61 74 65 64 20 70 61 72 74   associated part
7c00: 20 6f 66 20 74 68 65 20 6d 79 69 74 65 6d 6d 61   of the myitemma
7c10: 70 0a 09 23 20 69 6e 2d 6d 65 6d 6f 72 79 20 69  p..# in-memory i
7c20: 6e 64 65 78 20 69 6e 20 70 72 65 70 61 72 61 74  ndex in preparat
7c30: 69 6f 6e 20 66 6f 72 20 6e 65 77 20 64 61 74 61  ion for new data
7c40: 2c 20 6f 72 20 61 73 20 70 61 72 74 20 6f 66 0a  , or as part of.
7c50: 09 23 20 6f 62 6a 65 63 74 20 64 65 73 74 72 75  .# object destru
7c60: 63 74 69 6f 6e 2e 20 41 20 73 69 6d 70 6c 65 20  ction. A simple 
7c70: 75 6e 73 65 74 20 69 73 20 65 6e 6f 75 67 68 2c  unset is enough,
7c80: 20 77 65 20 68 61 76 65 20 6e 6f 0a 09 23 20 73   we have no..# s
7c90: 79 6d 62 6f 6c 20 63 68 61 6e 67 65 73 65 74 73  ymbol changesets
7ca0: 20 61 74 20 74 68 69 73 20 74 69 6d 65 2c 20 61   at this time, a
7cb0: 6e 64 20 74 68 75 73 20 6e 65 76 65 72 20 6d 6f  nd thus never mo
7cc0: 72 65 20 74 68 61 6e 20 6f 6e 65 0a 09 23 20 72  re than one..# r
7cd0: 65 66 65 72 65 6e 63 65 20 69 6e 20 74 68 65 20  eference in the 
7ce0: 6c 69 73 74 2e 0a 0a 09 75 70 76 61 72 20 31 20  list....upvar 1 
7cf0: 6d 79 69 74 65 6d 6d 61 70 20 6d 79 69 74 65 6d  myitemmap myitem
7d00: 6d 61 70 20 73 65 6c 66 20 73 65 6c 66 0a 09 66  map self self..f
7d10: 6f 72 65 61 63 68 20 69 69 64 20 24 74 68 65 69  oreach iid $thei
7d20: 74 65 6d 73 20 7b 0a 09 20 20 20 20 73 65 74 20  tems {..    set 
7d30: 6b 65 79 20 5b 6c 69 73 74 20 24 74 68 65 74 79  key [list $thety
7d40: 70 65 20 24 69 69 64 5d 0a 09 20 20 20 20 75 6e  pe $iid]..    un
7d50: 73 65 74 20 6d 79 69 74 65 6d 6d 61 70 28 24 6b  set myitemmap($k
7d60: 65 79 29 0a 09 20 20 20 20 6c 6f 67 20 77 72 69  ey)..    log wri
7d70: 74 65 20 38 20 63 73 65 74 73 20 7b 4d 41 50 2d  te 8 csets {MAP-
7d80: 20 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73 65   item <$key> $se
7d90: 6c 66 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d  lf = [$self str]
7da0: 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20  }..}..return.   
7db0: 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 4d 61 70   }..    proc Map
7dc0: 49 74 65 6d 73 20 7b 74 68 65 74 79 70 65 20 74  Items {thetype t
7dd0: 68 65 69 74 65 6d 73 7d 20 7b 0a 09 75 70 76 61  heitems} {..upva
7de0: 72 20 31 20 6d 79 69 74 65 6d 6d 61 70 20 6d 79  r 1 myitemmap my
7df0: 69 74 65 6d 6d 61 70 20 73 65 6c 66 20 73 65 6c  itemmap self sel
7e00: 66 0a 0a 09 66 6f 72 65 61 63 68 20 69 69 64 20  f...foreach iid 
7e10: 24 74 68 65 69 74 65 6d 73 20 7b 0a 09 20 20 20  $theitems {..   
7e20: 20 73 65 74 20 6b 65 79 20 5b 6c 69 73 74 20 24   set key [list $
7e30: 74 68 65 74 79 70 65 20 24 69 69 64 5d 0a 09 20  thetype $iid].. 
7e40: 20 20 20 73 65 74 20 6d 79 69 74 65 6d 6d 61 70     set myitemmap
7e50: 28 24 6b 65 79 29 20 24 73 65 6c 66 0a 09 20 20  ($key) $self..  
7e60: 20 20 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73    log write 8 cs
7e70: 65 74 73 20 7b 4d 41 50 2b 20 69 74 65 6d 20 3c  ets {MAP+ item <
7e80: 24 6b 65 79 3e 20 24 73 65 6c 66 20 3d 20 5b 24  $key> $self = [$
7e90: 73 65 6c 66 20 73 74 72 5d 7d 0a 09 7d 0a 09 72  self str]}..}..r
7ea0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
7eb0: 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23   # # ## ### ####
7ec0: 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23  # ######## #####
7ed0: 23 23 23 23 23 23 23 23 0a 0a 20 20 20 20 74 79  ########..    ty
7ee0: 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 68 61  pevariable mycha
7ef0: 6e 67 65 73 65 74 73 20 20 20 20 20 20 20 20 20  ngesets         
7f00: 7b 7d 20 3b 20 23 20 4c 69 73 74 20 6f 66 20 61  {} ; # List of a
7f10: 6c 6c 20 6b 6e 6f 77 6e 0a 09 09 09 09 09 20 20  ll known......  
7f20: 20 23 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a   # changesets...
7f30: 20 20 20 20 23 20 4c 69 73 74 20 6f 66 20 61 6c      # List of al
7f40: 6c 20 6b 6e 6f 77 6e 20 63 68 61 6e 67 65 73 65  l known changese
7f50: 74 73 20 6f 66 20 61 20 74 79 70 65 2e 0a 20 20  ts of a type..  
7f60: 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d    typevariable m
7f70: 79 74 63 68 61 6e 67 65 73 65 74 73 20 2d 61 72  ytchangesets -ar
7f80: 72 61 79 20 7b 0a 09 73 79 6d 3a 3a 62 72 61 6e  ray {..sym::bran
7f90: 63 68 20 7b 7d 0a 09 73 79 6d 3a 3a 74 61 67 20  ch {}..sym::tag 
7fa0: 20 20 20 7b 7d 0a 09 72 65 76 20 20 20 20 20 20     {}..rev      
7fb0: 20 20 20 7b 7d 0a 20 20 20 20 7d 0a 09 09 09 09     {}.    }.....
7fc0: 09 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62  ..    typevariab
7fd0: 6c 65 20 6d 79 69 74 65 6d 6d 61 70 20 20 20 20  le myitemmap    
7fe0: 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d   -array {} ; # M
7ff0: 61 70 20 66 72 6f 6d 20 69 74 65 6d 73 20 28 74  ap from items (t
8000: 61 67 67 65 64 29 0a 09 09 09 09 09 20 20 20 23  agged)......   #
8010: 20 74 6f 20 74 68 65 20 6c 69 73 74 20 6f 66 20   to the list of 
8020: 63 68 61 6e 67 65 73 65 74 73 0a 09 09 09 09 09  changesets......
8030: 20 20 20 23 20 63 6f 6e 74 61 69 6e 69 6e 67 20     # containing 
8040: 69 74 2e 20 45 61 63 68 20 69 74 65 6d 0a 09 09  it. Each item...
8050: 09 09 09 20 20 20 23 20 63 61 6e 20 62 65 20 75  ...   # can be u
8060: 73 65 64 20 62 79 20 6f 6e 6c 79 20 6f 6e 65 0a  sed by only one.
8070: 09 09 09 09 09 20 20 20 23 20 63 68 61 6e 67 65  .....   # change
8080: 73 65 74 2e 0a 20 20 20 20 74 79 70 65 76 61 72  set..    typevar
8090: 69 61 62 6c 65 20 6d 79 69 64 6d 61 70 20 20 20  iable myidmap   
80a0: 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61  -array {} ; # Ma
80b0: 70 20 66 72 6f 6d 20 63 68 61 6e 67 65 73 65 74  p from changeset
80c0: 20 69 64 20 74 6f 0a 09 09 09 09 20 20 20 20 20   id to.....     
80d0: 20 20 23 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a    # changeset...
80e0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 61      typemethod a
80f0: 6c 6c 20 20 20 20 7b 7d 20 20 20 20 7b 20 72 65  ll    {}    { re
8100: 74 75 72 6e 20 24 6d 79 63 68 61 6e 67 65 73 65  turn $mychangese
8110: 74 73 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74  ts }.    typemet
8120: 68 6f 64 20 6f 66 20 20 20 20 20 7b 63 69 64 7d  hod of     {cid}
8130: 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69 64 6d   { return $myidm
8140: 61 70 28 24 63 69 64 29 20 7d 0a 20 20 20 20 74  ap($cid) }.    t
8150: 79 70 65 6d 65 74 68 6f 64 20 6f 66 69 74 65 6d  ypemethod ofitem
8160: 20 7b 69 69 64 7d 20 7b 20 72 65 74 75 72 6e 20   {iid} { return 
8170: 24 6d 79 69 74 65 6d 6d 61 70 28 24 69 69 64 29  $myitemmap($iid)
8180: 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68   }..    typemeth
8190: 6f 64 20 72 65 76 20 20 20 20 7b 7d 20 20 20 20  od rev    {}    
81a0: 7b 20 72 65 74 75 72 6e 20 24 6d 79 74 63 68 61  { return $mytcha
81b0: 6e 67 65 73 65 74 73 28 72 65 76 29 20 7d 0a 20  ngesets(rev) }. 
81c0: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 73 79     typemethod sy
81d0: 6d 20 20 20 20 7b 7d 20 20 20 20 7b 20 72 65 74  m    {}    { ret
81e0: 75 72 6e 20 5b 63 6f 6e 63 61 74 20 5c 0a 09 09  urn [concat \...
81f0: 09 09 09 20 20 24 7b 6d 79 74 63 68 61 6e 67 65  ...  ${mytchange
8200: 73 65 74 73 28 73 79 6d 3a 3a 62 72 61 6e 63 68  sets(sym::branch
8210: 29 7d 20 5c 0a 09 09 09 09 09 20 20 24 7b 6d 79  )} \......  ${my
8220: 74 63 68 61 6e 67 65 73 65 74 73 28 73 79 6d 3a  tchangesets(sym:
8230: 3a 74 61 67 29 7d 5d 20 7d 0a 0a 20 20 20 20 23  :tag)}] }..    #
8240: 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20   # ## ### ##### 
8250: 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23  ######## #######
8260: 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 43 6f  ######.    ## Co
8270: 6e 66 69 67 75 72 61 74 69 6f 6e 0a 0a 20 20 20  nfiguration..   
8280: 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65   pragma -hastype
8290: 69 6e 66 6f 20 20 20 20 6e 6f 20 20 3b 20 23 20  info    no  ; # 
82a0: 6e 6f 20 74 79 70 65 20 69 6e 74 72 6f 73 70 65  no type introspe
82b0: 63 74 69 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61  ction.    pragma
82c0: 20 2d 68 61 73 69 6e 66 6f 20 20 20 20 20 20 20   -hasinfo       
82d0: 20 6e 6f 20 20 3b 20 23 20 6e 6f 20 6f 62 6a 65   no  ; # no obje
82e0: 63 74 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e  ct introspection
82f0: 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23  ..    # # ## ###
8300: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20   ##### ######## 
8310: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 7d 0a  #############.}.
8320: 0a 23 23 0a 23 23 20 4e 4f 54 45 3a 20 54 68 65  .##.## NOTE: The
8330: 20 73 75 63 63 65 73 73 6f 72 20 61 6e 64 20 70   successor and p
8340: 72 65 64 65 63 65 73 73 6f 72 20 6d 65 74 68 6f  redecessor metho
8350: 64 73 20 64 65 66 69 6e 65 64 20 62 79 20 74 68  ds defined by th
8360: 65 20 63 6c 61 73 73 65 73 0a 23 23 20 20 20 20  e classes.##    
8370: 20 20 20 62 65 6c 6f 77 20 61 72 65 20 2d 2d 20     below are -- 
8380: 62 6f 74 74 6c 65 20 6e 65 63 6b 73 20 2d 2d 2e  bottle necks --.
8390: 20 4c 6f 6f 6b 20 66 6f 72 20 77 61 79 73 20 74   Look for ways t
83a0: 6f 20 6d 61 6b 65 20 74 68 65 20 53 51 4c 0a 23  o make the SQL.#
83b0: 23 20 20 20 20 20 20 20 66 61 73 74 65 72 2e 0a  #       faster..
83c0: 23 23 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23  ##..# # ## ### #
83d0: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23  #### ######## ##
83e0: 23 23 23 23 23 23 23 23 23 23 23 20 23 23 23 23  ########### ####
83f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
8400: 23 0a 23 23 20 48 65 6c 70 65 72 20 73 69 6e 67  #.## Helper sing
8410: 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20  leton. Commands 
8420: 66 6f 72 20 72 65 76 69 73 69 6f 6e 20 63 68 61  for revision cha
8430: 6e 67 65 73 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a  ngesets...snit::
8440: 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69  type ::vc::fossi
8450: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a  l::import::cvs::
8460: 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a 3a 72 65  project::rev::re
8470: 76 20 7b 0a 20 20 20 20 74 79 70 65 6d 65 74 68  v {.    typemeth
8480: 6f 64 20 62 79 72 65 76 69 73 69 6f 6e 20 7b 7d  od byrevision {}
8490: 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a 20 20   { return 1 }.  
84a0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62 79 73    typemethod bys
84b0: 79 6d 62 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 74  ymbol   {} { ret
84c0: 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65  urn 0 }.    type
84d0: 6d 65 74 68 6f 64 20 69 73 74 61 67 20 20 20 20  method istag    
84e0: 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20    {} { return 0 
84f0: 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  }.    typemethod
8500: 20 69 73 62 72 61 6e 63 68 20 20 20 7b 7d 20 7b   isbranch   {} {
8510: 20 72 65 74 75 72 6e 20 30 20 7d 0a 0a 20 20 20   return 0 }..   
8520: 20 74 79 70 65 6d 65 74 68 6f 64 20 73 74 72 20   typemethod str 
8530: 7b 72 65 76 69 73 69 6f 6e 7d 20 7b 0a 09 73 74  {revision} {..st
8540: 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67  ruct::list assig
8550: 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09  n [state run {..
8560: 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 65 76      SELECT R.rev
8570: 2c 20 46 2e 6e 61 6d 65 2c 20 50 2e 6e 61 6d 65  , F.name, P.name
8580: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76  ..    FROM   rev
8590: 69 73 69 6f 6e 20 52 2c 20 66 69 6c 65 20 46 2c  ision R, file F,
85a0: 20 70 72 6f 6a 65 63 74 20 50 0a 09 20 20 20 20   project P..    
85b0: 57 48 45 52 45 20 20 52 2e 72 69 64 20 3d 20 24  WHERE  R.rid = $
85c0: 72 65 76 69 73 69 6f 6e 20 2d 2d 20 46 69 6e 64  revision -- Find
85d0: 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
85e0: 72 65 76 69 73 69 6f 6e 0a 09 20 20 20 20 41 4e  revision..    AN
85f0: 44 20 20 20 20 46 2e 66 69 64 20 3d 20 52 2e 66  D    F.fid = R.f
8600: 69 64 20 20 20 20 20 2d 2d 20 47 65 74 20 66 69  id     -- Get fi
8610: 6c 65 20 6f 66 20 74 68 65 20 72 65 76 69 73 69  le of the revisi
8620: 6f 6e 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50  on..    AND    P
8630: 2e 70 69 64 20 3d 20 46 2e 70 69 64 20 20 20 20  .pid = F.pid    
8640: 20 2d 2d 20 47 65 74 20 70 72 6f 6a 65 63 74 20   -- Get project 
8650: 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 09 7d 5d  of the file...}]
8660: 20 72 65 76 6e 72 20 66 6e 61 6d 65 20 70 6e 61   revnr fname pna
8670: 6d 65 0a 09 72 65 74 75 72 6e 20 22 24 70 6e 61  me..return "$pna
8680: 6d 65 2f 24 7b 72 65 76 6e 72 7d 3a 3a 24 66 6e  me/${revnr}::$fn
8690: 61 6d 65 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ame".    }..    
86a0: 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73 74 20  # result = list 
86b0: 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74 69 6d  (mintime, maxtim
86c0: 65 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  e).    typemetho
86d0: 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 69 74 65  d timerange {ite
86e0: 6d 73 7d 20 7b 0a 09 73 65 74 20 74 68 65 73 65  ms} {..set these
86f0: 74 20 28 27 5b 6a 6f 69 6e 20 24 69 74 65 6d 73  t ('[join $items
8700: 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72   {','}]')..retur
8710: 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75  n [state run [su
8720: 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20  bst -nocommands 
8730: 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b  -nobackslashes {
8740: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 4d 49 4e  ..    SELECT MIN
8750: 28 52 2e 64 61 74 65 29 2c 20 4d 41 58 28 52 2e  (R.date), MAX(R.
8760: 64 61 74 65 29 0a 09 20 20 20 20 46 52 4f 4d 20  date)..    FROM 
8770: 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20  revision R..    
8780: 57 48 45 52 45 20 52 2e 72 69 64 20 49 4e 20 24  WHERE R.rid IN $
8790: 74 68 65 73 65 74 20 2d 2d 20 52 65 73 74 72 69  theset -- Restri
87a0: 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20  ct to revisions 
87b0: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 7d 5d 5d  of interest..}]]
87c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 76 61  .    }..    # va
87d0: 72 28 64 76 29 20 3d 20 64 69 63 74 20 28 72 65  r(dv) = dict (re
87e0: 76 69 73 69 6f 6e 20 2d 3e 20 6c 69 73 74 20 28  vision -> list (
87f0: 72 65 76 69 73 69 6f 6e 29 29 0a 20 20 20 20 74  revision)).    t
8800: 79 70 65 6d 65 74 68 6f 64 20 69 6e 74 65 72 6e  ypemethod intern
8810: 61 6c 73 75 63 63 65 73 73 6f 72 73 20 7b 64 76  alsuccessors {dv
8820: 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75   revisions} {..u
8830: 70 76 61 72 20 31 20 24 64 76 20 64 65 70 65 6e  pvar 1 $dv depen
8840: 64 65 6e 63 69 65 73 0a 09 73 65 74 20 74 68 65  dencies..set the
8850: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76  set ('[join $rev
8860: 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a  isions {','}]').
8870: 0a 09 6c 6f 67 20 77 72 69 74 65 20 31 34 20 63  ..log write 14 c
8880: 73 65 74 73 20 69 6e 74 65 72 6e 61 6c 73 75 63  sets internalsuc
8890: 63 65 73 73 6f 72 73 0a 0a 09 23 20 53 65 65 20  cessors...# See 
88a0: 27 73 75 63 63 65 73 73 6f 72 73 27 20 62 65 6c  'successors' bel
88b0: 6f 77 20 66 6f 72 20 74 68 65 20 6d 61 69 6e 20  ow for the main 
88c0: 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 0a 09  explanation of..
88d0: 23 20 74 68 65 20 76 61 72 69 6f 75 73 20 63 61  # the various ca
88e0: 73 65 73 2e 20 54 68 69 73 20 70 69 65 63 65 20  ses. This piece 
88f0: 69 73 20 73 70 65 63 69 61 6c 20 69 6e 20 74 68  is special in th
8900: 61 74 20 69 74 0a 09 23 20 72 65 73 74 72 69 63  at it..# restric
8910: 74 73 20 74 68 65 20 73 75 63 63 65 73 73 6f 72  ts the successor
8920: 73 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 6f  s we look for to
8930: 20 74 68 65 20 73 61 6d 65 20 73 65 74 20 6f 66   the same set of
8940: 0a 09 23 20 72 65 76 69 73 69 6f 6e 73 20 77 65  ..# revisions we
8950: 20 73 74 61 72 74 20 66 72 6f 6d 2e 20 53 65 6e   start from. Sen
8960: 73 69 62 6c 65 20 61 73 20 77 65 20 61 72 65 20  sible as we are 
8970: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 0a 09 23 20 63  looking for..# c
8980: 68 61 6e 67 65 73 65 74 20 69 6e 74 65 72 6e 61  hangeset interna
8990: 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 2e 0a  l dependencies..
89a0: 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 70 20  ..array set dep 
89b0: 7b 7d 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69  {}...foreach {ri
89c0: 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20  d child} [state 
89d0: 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f  run [subst -noco
89e0: 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c  mmands -nobacksl
89f0: 61 73 68 65 73 20 7b 0a 20 20 20 20 2d 2d 20 28  ashes {.    -- (
8a00: 31 29 20 50 72 69 6d 61 72 79 20 63 68 69 6c 64  1) Primary child
8a10: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
8a20: 69 64 2c 20 52 2e 63 68 69 6c 64 0a 09 20 20 20  id, R.child..   
8a30: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
8a40: 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 52   R..    WHERE  R
8a50: 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65  .rid   IN $these
8a60: 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63  t     -- Restric
8a70: 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f  t to revisions o
8a80: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20  f interest..    
8a90: 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49  AND    R.child I
8aa0: 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d  S NOT NULL    --
8ab0: 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 68 69   Has primary chi
8ac0: 6c 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  ld..    AND    R
8ad0: 2e 63 68 69 6c 64 20 49 4e 20 24 74 68 65 73 65  .child IN $these
8ae0: 74 20 20 20 20 20 2d 2d 20 57 68 69 63 68 20 69  t     -- Which i
8af0: 73 20 61 6c 73 6f 20 6f 66 20 69 6e 74 65 72 65  s also of intere
8b00: 73 74 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20  st.    UNION.   
8b10: 20 2d 2d 20 28 32 29 20 53 65 63 6f 6e 64 61 72   -- (2) Secondar
8b20: 79 20 28 62 72 61 6e 63 68 29 20 63 68 69 6c 64  y (branch) child
8b30: 72 65 6e 0a 09 20 20 20 20 53 45 4c 45 43 54 20  ren..    SELECT 
8b40: 52 2e 72 69 64 2c 20 42 2e 62 72 69 64 0a 09 20  R.rid, B.brid.. 
8b50: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69     FROM   revisi
8b60: 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 62 72  on R, revisionbr
8b70: 61 6e 63 68 63 68 69 6c 64 72 65 6e 20 42 0a 09  anchchildren B..
8b80: 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64      WHERE  R.rid
8b90: 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20     IN $theset   
8ba0: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f    -- Restrict to
8bb0: 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e   revisions of in
8bc0: 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20  terest..    AND 
8bd0: 20 20 20 52 2e 72 69 64 20 3d 20 42 2e 72 69 64     R.rid = B.rid
8be0: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 53 65 6c            -- Sel
8bf0: 65 63 74 20 73 75 62 73 65 74 20 6f 66 20 62 72  ect subset of br
8c00: 61 6e 63 68 20 63 68 69 6c 64 72 65 6e 0a 09 20  anch children.. 
8c10: 20 20 20 41 4e 44 20 20 20 20 42 2e 62 72 69 64     AND    B.brid
8c20: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20   IN $theset     
8c30: 20 2d 2d 20 57 68 69 63 68 20 69 73 20 61 6c 73   -- Which is als
8c40: 6f 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 20 20  o of interest.  
8c50: 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28    UNION.    -- (
8c60: 34 29 20 43 68 69 6c 64 20 6f 66 20 74 72 75 6e  4) Child of trun
8c70: 6b 20 72 6f 6f 74 20 73 75 63 63 65 73 73 6f 72  k root successor
8c80: 20 6f 66 20 6c 61 73 74 20 4e 54 44 42 20 6f 6e   of last NTDB on
8c90: 20 74 72 75 6e 6b 2e 0a 09 20 20 20 20 53 45 4c   trunk...    SEL
8ca0: 45 43 54 20 52 2e 72 69 64 2c 20 52 41 2e 63 68  ECT R.rid, RA.ch
8cb0: 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 72 65  ild..    FROM re
8cc0: 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69  vision R, revisi
8cd0: 6f 6e 20 52 41 0a 09 20 20 20 20 57 48 45 52 45  on RA..    WHERE
8ce0: 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65   R.rid   IN $the
8cf0: 73 65 74 20 20 20 20 20 20 2d 2d 20 52 65 73 74  set      -- Rest
8d00: 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e  rict to revision
8d10: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20  s of interest.. 
8d20: 20 20 20 41 4e 44 20 20 20 52 2e 69 73 64 65 66     AND   R.isdef
8d30: 61 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  ault            
8d40: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
8d50: 4e 54 44 42 0a 09 20 20 20 20 41 4e 44 20 20 20  NTDB..    AND   
8d60: 52 2e 64 62 63 68 69 6c 64 20 49 53 20 4e 4f 54  R.dbchild IS NOT
8d70: 20 4e 55 4c 4c 20 20 20 2d 2d 20 61 6e 64 20 6c   NULL   -- and l
8d80: 61 73 74 20 4e 54 44 42 20 62 65 6c 6f 6e 67 69  ast NTDB belongi
8d90: 6e 67 20 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20  ng to trunk..   
8da0: 20 41 4e 44 20 20 20 52 41 2e 72 69 64 20 3d 20   AND   RA.rid = 
8db0: 52 2e 64 62 63 68 69 6c 64 20 20 20 20 20 20 2d  R.dbchild      -
8dc0: 2d 20 47 6f 20 64 69 72 65 63 74 6c 79 20 74 6f  - Go directly to
8dd0: 20 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20   trunk root..   
8de0: 20 41 4e 44 20 20 20 52 41 2e 63 68 69 6c 64 20   AND   RA.child 
8df0: 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d  IS NOT NULL    -
8e00: 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 68  - Has primary ch
8e10: 69 6c 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20  ild..           
8e20: 20 41 4e 44 20 20 20 52 41 2e 63 68 69 6c 64 20   AND   RA.child 
8e30: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d  IN $theset     -
8e40: 2d 20 57 68 69 63 68 20 69 73 20 61 6c 73 6f 20  - Which is also 
8e50: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 7d 5d 5d  of interest..}]]
8e60: 20 7b 0a 09 20 20 20 20 23 20 43 6f 6e 73 69 64   {..    # Consid
8e70: 65 72 20 6d 6f 76 69 6e 67 20 74 68 69 73 20 74  er moving this t
8e80: 6f 20 74 68 65 20 69 6e 74 65 67 72 69 74 79 20  o the integrity 
8e90: 6d 6f 64 75 6c 65 2e 0a 09 20 20 20 20 69 6e 74  module...    int
8ea0: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24  egrity assert {$
8eb0: 72 69 64 20 21 3d 20 24 63 68 69 6c 64 7d 20 7b  rid != $child} {
8ec0: 52 65 76 69 73 69 6f 6e 20 24 72 69 64 20 64 65  Revision $rid de
8ed0: 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 2e  pends on itself.
8ee0: 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64  }..    lappend d
8ef0: 65 70 65 6e 64 65 6e 63 69 65 73 28 24 72 69 64  ependencies($rid
8f00: 29 20 24 63 68 69 6c 64 0a 09 20 20 20 20 73 65  ) $child..    se
8f10: 74 20 64 65 70 28 24 72 69 64 2c 24 63 68 69 6c  t dep($rid,$chil
8f20: 64 29 20 2e 0a 09 7d 0a 0a 09 23 20 54 68 65 20  d) ...}...# The 
8f30: 73 71 6c 20 73 74 61 74 65 6d 65 6e 74 73 20 61  sql statements a
8f40: 62 6f 76 65 20 6c 6f 6f 6b 73 20 6f 6e 6c 79 20  bove looks only 
8f50: 66 6f 72 20 64 69 72 65 63 74 20 64 65 70 65 6e  for direct depen
8f60: 64 65 6e 63 69 65 73 0a 09 23 20 62 65 74 77 65  dencies..# betwe
8f70: 65 6e 20 72 65 76 69 73 69 6f 6e 20 69 6e 20 74  en revision in t
8f80: 68 65 20 63 68 61 6e 67 65 73 65 74 2e 20 48 6f  he changeset. Ho
8f90: 77 65 76 65 72 20 64 75 65 20 74 6f 20 74 68 65  wever due to the
8fa0: 0a 09 23 20 76 61 67 61 72 69 65 73 20 6f 66 20  ..# vagaries of 
8fb0: 6d 65 74 61 20 64 61 74 61 20 69 74 20 69 73 20  meta data it is 
8fc0: 70 6f 73 73 69 62 6c 65 20 66 6f 72 20 74 77 6f  possible for two
8fd0: 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 0a 09 23   revisions of..#
8fe0: 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20 74   the same file t
8ff0: 6f 20 65 6e 64 20 75 70 20 69 6e 20 74 68 65 20  o end up in the 
9000: 73 61 6d 65 20 63 68 61 6e 67 65 73 65 74 2c 20  same changeset, 
9010: 77 69 74 68 6f 75 74 20 61 0a 09 23 20 64 69 72  without a..# dir
9020: 65 63 74 20 64 65 70 65 6e 64 65 6e 63 79 20 62  ect dependency b
9030: 65 74 77 65 65 6e 20 74 68 65 6d 2e 20 48 6f 77  etween them. How
9040: 65 76 65 72 20 77 65 20 6b 6e 6f 77 20 74 68 61  ever we know tha
9050: 74 20 74 68 65 72 65 0a 09 23 20 68 61 73 20 74  t there..# has t
9060: 6f 20 62 65 20 61 20 61 6e 20 69 6e 64 69 72 65  o be a an indire
9070: 63 74 20 64 65 70 65 6e 64 65 6e 63 79 2c 20 62  ct dependency, b
9080: 65 20 69 74 20 74 68 72 6f 75 67 68 20 70 72 69  e it through pri
9090: 6d 61 72 79 0a 09 23 20 63 68 69 6c 64 72 65 6e  mary..# children
90a0: 2c 20 62 72 61 6e 63 68 20 63 68 69 6c 64 72 65  , branch childre
90b0: 6e 2c 20 6f 72 20 61 20 63 6f 6d 62 69 6e 61 74  n, or a combinat
90c0: 69 6f 6e 20 74 68 65 72 65 6f 66 2e 0a 0a 09 23  ion thereof....#
90d0: 20 57 65 20 6e 6f 77 20 66 69 6c 6c 20 69 6e 20   We now fill in 
90e0: 74 68 65 73 65 20 70 73 65 75 64 6f 2d 64 65 70  these pseudo-dep
90f0: 65 6e 64 65 6e 63 69 65 73 2c 20 69 66 20 6e 6f  endencies, if no
9100: 20 73 75 63 68 0a 09 23 20 64 65 70 65 6e 64 65   such..# depende
9110: 6e 63 79 20 65 78 69 73 74 73 20 61 6c 72 65 61  ncy exists alrea
9120: 64 79 2e 20 54 68 65 20 64 69 72 65 63 74 69 6f  dy. The directio
9130: 6e 20 6f 66 20 74 68 65 20 64 65 70 65 6e 64 65  n of the depende
9140: 6e 63 79 0a 09 23 20 69 73 20 61 63 74 75 61 6c  ncy..# is actual
9150: 6c 79 20 69 72 72 65 6c 65 76 61 6e 74 20 66 6f  ly irrelevant fo
9160: 72 20 74 68 69 73 2e 0a 0a 09 23 20 4e 4f 54 45  r this....# NOTE
9170: 3a 20 54 68 69 73 20 69 73 20 64 69 66 66 65 72  : This is differ
9180: 65 6e 74 20 66 72 6f 6d 20 63 76 73 32 73 76 6e  ent from cvs2svn
9190: 2e 20 4f 75 72 20 73 70 69 72 69 74 75 61 6c 20  . Our spiritual 
91a0: 61 6e 63 65 73 74 6f 72 0a 09 23 20 64 6f 65 73  ancestor..# does
91b0: 20 6e 6f 74 20 75 73 65 20 73 75 63 68 20 70 73   not use such ps
91c0: 65 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63 69 65  eudo-dependencie
91d0: 73 2c 20 68 6f 77 65 76 65 72 20 69 74 20 75 73  s, however it us
91e0: 65 73 20 61 0a 09 23 20 43 4f 4d 4d 49 54 5f 54  es a..# COMMIT_T
91f0: 48 52 45 53 48 4f 4c 44 2c 20 61 20 74 69 6d 65  HRESHOLD, a time
9200: 20 69 6e 74 65 72 76 61 6c 20 63 6f 6d 6d 69 74   interval commit
9210: 73 20 73 68 6f 75 6c 64 20 66 61 6c 6c 2e 20 54  s should fall. T
9220: 68 69 73 0a 09 23 20 77 69 6c 6c 20 67 72 65 61  his..# will grea
9230: 74 6c 79 20 72 65 64 75 63 65 73 20 74 68 65 20  tly reduces the 
9240: 72 69 73 6b 20 6f 66 20 67 65 74 74 69 6e 67 20  risk of getting 
9250: 66 61 72 20 73 65 70 61 72 61 74 65 64 0a 09 23  far separated..#
9260: 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 74 68   revisions of th
9270: 65 20 73 61 6d 65 20 66 69 6c 65 20 69 6e 74 6f  e same file into
9280: 20 6f 6e 65 20 63 68 61 6e 67 65 73 65 74 2e 0a   one changeset..
9290: 0a 09 23 20 57 65 20 61 6c 6c 6f 77 20 72 65 76  ..# We allow rev
92a0: 69 73 69 6f 6e 73 20 74 6f 20 62 65 20 66 61 72  isions to be far
92b0: 20 61 70 61 72 74 20 69 6e 20 74 69 6d 65 20 69   apart in time i
92c0: 6e 20 74 68 65 20 73 61 6d 65 0a 09 23 20 63 68  n the same..# ch
92d0: 61 6e 67 65 73 65 74 2c 20 62 75 74 20 69 6e 20  angeset, but in 
92e0: 74 75 72 6e 20 6e 65 65 64 20 74 68 65 20 70 73  turn need the ps
92f0: 65 75 64 6f 2d 64 65 70 65 6e 64 65 6e 63 69 65  eudo-dependencie
9300: 73 20 74 6f 0a 09 23 20 68 61 6e 64 6c 65 20 74  s to..# handle t
9310: 68 69 73 2e 0a 0a 09 6c 6f 67 20 77 72 69 74 65  his....log write
9320: 20 31 34 20 63 73 65 74 73 20 7b 69 6e 74 65 72   14 csets {inter
9330: 6e 61 6c 20 20 5b 61 72 72 61 79 20 73 69 7a 65  nal  [array size
9340: 20 64 65 70 5d 7d 0a 09 6c 6f 67 20 77 72 69 74   dep]}..log writ
9350: 65 20 31 34 20 63 73 65 74 73 20 7b 63 6f 6c 6c  e 14 csets {coll
9360: 65 63 74 65 64 20 5b 61 72 72 61 79 20 73 69 7a  ected [array siz
9370: 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73 5d 7d  e dependencies]}
9380: 0a 09 6c 6f 67 20 77 72 69 74 65 20 31 34 20 63  ..log write 14 c
9390: 73 65 74 73 20 70 73 65 75 64 6f 2d 69 6e 74 65  sets pseudo-inte
93a0: 72 6e 61 6c 73 75 63 63 65 73 73 6f 72 73 0a 0a  rnalsuccessors..
93b0: 09 61 72 72 61 79 20 73 65 74 20 66 69 64 73 20  .array set fids 
93c0: 7b 7d 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64  {}..foreach {rid
93d0: 20 66 69 64 7d 20 5b 73 74 61 74 65 20 72 75 6e   fid} [state run
93e0: 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61   [subst -nocomma
93f0: 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68  nds -nobackslash
9400: 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54  es {..    SELECT
9410: 20 52 2e 72 69 64 2c 20 52 2e 66 69 64 0a 20 20   R.rid, R.fid.  
9420: 20 20 20 20 20 20 20 20 20 20 46 52 4f 4d 20 20            FROM  
9430: 20 72 65 76 69 73 69 6f 6e 20 52 0a 20 20 20 20   revision R.    
9440: 20 20 20 20 20 20 20 20 57 48 45 52 45 20 20 52          WHERE  R
9450: 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65 74 0a  .rid IN $theset.
9460: 09 7d 5d 5d 20 7b 20 6c 61 70 70 65 6e 64 20 66  .}]] { lappend f
9470: 69 64 73 28 24 66 69 64 29 20 24 72 69 64 20 7d  ids($fid) $rid }
9480: 0a 0a 09 73 65 74 20 67 72 6f 75 70 73 20 7b 7d  ...set groups {}
9490: 0a 09 66 6f 72 65 61 63 68 20 7b 66 69 64 20 72  ..foreach {fid r
94a0: 69 64 73 7d 20 5b 61 72 72 61 79 20 67 65 74 20  ids} [array get 
94b0: 66 69 64 73 5d 20 7b 0a 09 20 20 20 20 69 66 20  fids] {..    if 
94c0: 7b 5b 6c 6c 65 6e 67 74 68 20 24 72 69 64 73 5d  {[llength $rids]
94d0: 20 3c 20 32 7d 20 63 6f 6e 74 69 6e 75 65 0a 09   < 2} continue..
94e0: 20 20 20 20 66 6f 72 65 61 63 68 20 61 20 24 72      foreach a $r
94f0: 69 64 73 20 7b 0a 09 09 66 6f 72 65 61 63 68 20  ids {...foreach 
9500: 62 20 24 72 69 64 73 20 7b 0a 09 09 20 20 20 20  b $rids {...    
9510: 69 66 20 7b 24 61 20 3d 3d 20 24 62 7d 20 63 6f  if {$a == $b} co
9520: 6e 74 69 6e 75 65 0a 09 09 20 20 20 20 69 66 20  ntinue...    if 
9530: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 64 65  {[info exists de
9540: 70 28 24 61 2c 24 62 29 5d 7d 20 63 6f 6e 74 69  p($a,$b)]} conti
9550: 6e 75 65 0a 09 09 20 20 20 20 69 66 20 7b 5b 69  nue...    if {[i
9560: 6e 66 6f 20 65 78 69 73 74 73 20 64 65 70 28 24  nfo exists dep($
9570: 62 2c 24 61 29 5d 7d 20 63 6f 6e 74 69 6e 75 65  b,$a)]} continue
9580: 0a 09 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64  ...    lappend d
9590: 65 70 65 6e 64 65 6e 63 69 65 73 28 24 61 29 20  ependencies($a) 
95a0: 24 62 0a 09 09 20 20 20 20 73 65 74 20 64 65 70  $b...    set dep
95b0: 28 24 61 2c 24 62 29 20 2e 0a 09 09 20 20 20 20  ($a,$b) ....    
95c0: 73 65 74 20 64 65 70 28 24 62 2c 24 61 29 20 2e  set dep($b,$a) .
95d0: 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 20 20 20  ...}..    }..   
95e0: 20 73 65 74 20 6e 20 5b 6c 6c 65 6e 67 74 68 20   set n [llength 
95f0: 24 72 69 64 73 5d 0a 09 20 20 20 20 6c 61 70 70  $rids]..    lapp
9600: 65 6e 64 20 67 72 6f 75 70 73 20 5b 6c 69 73 74  end groups [list
9610: 20 24 6e 20 5b 65 78 70 72 20 7b 28 24 6e 2a 24   $n [expr {($n*$
9620: 6e 2d 24 6e 29 2f 32 7d 5d 5d 0a 09 7d 0a 0a 09  n-$n)/2}]]..}...
9630: 6c 6f 67 20 77 72 69 74 65 20 31 34 20 63 73 65  log write 14 cse
9640: 74 73 20 7b 70 73 65 75 64 6f 20 20 20 20 5b 61  ts {pseudo    [a
9650: 72 72 61 79 20 73 69 7a 65 20 66 69 64 73 5d 20  rray size fids] 
9660: 28 5b 6c 73 6f 72 74 20 2d 69 6e 64 65 78 20 30  ([lsort -index 0
9670: 20 2d 64 65 63 72 65 61 73 69 6e 67 20 2d 69 6e   -decreasing -in
9680: 74 65 67 65 72 20 24 67 72 6f 75 70 73 5d 29 7d  teger $groups])}
9690: 0a 09 6c 6f 67 20 77 72 69 74 65 20 31 34 20 63  ..log write 14 c
96a0: 73 65 74 73 20 7b 69 6e 74 65 72 6e 61 6c 20 20  sets {internal  
96b0: 5b 61 72 72 61 79 20 73 69 7a 65 20 64 65 70 5d  [array size dep]
96c0: 7d 0a 09 6c 6f 67 20 77 72 69 74 65 20 31 34 20  }..log write 14 
96d0: 63 73 65 74 73 20 7b 63 6f 6c 6c 65 63 74 65 64  csets {collected
96e0: 20 5b 61 72 72 61 79 20 73 69 7a 65 20 64 65 70   [array size dep
96f0: 65 6e 64 65 6e 63 69 65 73 5d 7d 0a 09 6c 6f 67  endencies]}..log
9700: 20 77 72 69 74 65 20 31 34 20 63 73 65 74 73 20   write 14 csets 
9710: 63 6f 6d 70 6c 65 74 65 0a 09 72 65 74 75 72 6e  complete..return
9720: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65  .    }..    # re
9730: 73 75 6c 74 20 3d 20 34 2d 6c 69 73 74 20 28 69  sult = 4-list (i
9740: 74 65 6d 74 79 70 65 20 69 74 65 6d 69 64 20 6e  temtype itemid n
9750: 65 78 74 69 74 65 6d 74 79 70 65 20 6e 65 78 74  extitemtype next
9760: 69 74 65 6d 69 64 20 2e 2e 2e 29 0a 20 20 20 20  itemid ...).    
9770: 74 79 70 65 6d 65 74 68 6f 64 20 6c 6f 6f 70 73  typemethod loops
9780: 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09   {revisions} {..
9790: 23 20 4e 6f 74 65 3a 20 54 61 67 73 20 61 6e 64  # Note: Tags and
97a0: 20 62 72 61 6e 63 68 65 73 20 63 61 6e 6e 6f 74   branches cannot
97b0: 20 63 61 75 73 65 20 74 68 65 20 6c 6f 6f 70 2e   cause the loop.
97c0: 20 54 68 65 69 72 20 69 64 27 73 2c 0a 09 23 20   Their id's,..# 
97d0: 62 65 69 6e 67 20 6f 66 20 61 20 66 75 6e 64 61  being of a funda
97e0: 6d 65 6e 74 61 6c 6c 79 20 64 69 66 66 65 72 65  mentally differe
97f0: 6e 74 20 74 79 70 65 20 74 68 61 6e 20 74 68 65  nt type than the
9800: 20 72 65 76 69 73 69 6f 6e 73 0a 09 23 20 63 6f   revisions..# co
9810: 6d 69 6e 67 20 69 6e 20 63 61 6e 6e 6f 74 20 62  ming in cannot b
9820: 65 20 69 6e 20 74 68 65 20 73 65 74 2e 0a 0a 09  e in the set....
9830: 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f  set theset ('[jo
9840: 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27  in $revisions {'
9850: 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b  ,'}]')..return [
9860: 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73 74  state run [subst
9870: 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f   -nocommands -no
9880: 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20  backslashes {.. 
9890: 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d 61 72     -- (1) Primar
98a0: 79 20 63 68 69 6c 64 0a 09 20 20 20 20 53 45 4c  y child..    SEL
98b0: 45 43 54 20 52 2e 72 69 64 2c 20 52 2e 63 68 69  ECT R.rid, R.chi
98c0: 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72  ld..    FROM   r
98d0: 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20 20 57  evision R..    W
98e0: 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e  HERE  R.rid   IN
98f0: 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20   $theset     -- 
9900: 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69  Restrict to revi
9910: 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73  sions of interes
9920: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e  t..    AND    R.
9930: 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55 4c  child IS NOT NUL
9940: 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69 6d  L    -- Has prim
9950: 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20 41  ary child..    A
9960: 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49 4e  ND    R.child IN
9970: 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20   $theset     -- 
9980: 4c 6f 6f 70 0a 09 20 20 20 20 2d 2d 0a 09 20 20  Loop..    --..  
9990: 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 2d 2d 20    UNION..    -- 
99a0: 28 32 29 20 53 65 63 6f 6e 64 61 72 79 20 28 62  (2) Secondary (b
99b0: 72 61 6e 63 68 29 20 63 68 69 6c 64 72 65 6e 0a  ranch) children.
99c0: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69  .    SELECT R.ri
99d0: 64 2c 20 42 2e 62 72 69 64 0a 09 20 20 20 20 46  d, B.brid..    F
99e0: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52  ROM   revision R
99f0: 2c 20 72 65 76 69 73 69 6f 6e 62 72 61 6e 63 68  , revisionbranch
9a00: 63 68 69 6c 64 72 65 6e 20 42 0a 09 20 20 20 20  children B..    
9a10: 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49  WHERE  R.rid   I
9a20: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d  N $theset     --
9a30: 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76   Restrict to rev
9a40: 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65  isions of intere
9a50: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  st..    AND    R
9a60: 2e 72 69 64 20 3d 20 42 2e 72 69 64 20 20 20 20  .rid = B.rid    
9a70: 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20        -- Select 
9a80: 73 75 62 73 65 74 20 6f 66 20 62 72 61 6e 63 68  subset of branch
9a90: 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 41   children..    A
9aa0: 4e 44 20 20 20 20 42 2e 72 69 64 20 20 20 49 4e  ND    B.rid   IN
9ab0: 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20   $theset     -- 
9ac0: 4c 6f 6f 70 0a 09 20 20 20 20 2d 2d 0a 09 20 20  Loop..    --..  
9ad0: 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 2d 2d 20    UNION..    -- 
9ae0: 28 34 29 20 43 68 69 6c 64 20 6f 66 20 74 72 75  (4) Child of tru
9af0: 6e 6b 20 72 6f 6f 74 20 73 75 63 63 65 73 73 6f  nk root successo
9b00: 72 20 6f 66 20 6c 61 73 74 20 4e 54 44 42 20 6f  r of last NTDB o
9b10: 6e 20 74 72 75 6e 6b 2e 0a 09 20 20 20 20 53 45  n trunk...    SE
9b20: 4c 45 43 54 20 52 2e 72 69 64 2c 20 52 41 2e 63  LECT R.rid, RA.c
9b30: 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  hild..    FROM  
9b40: 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76   revision R, rev
9b50: 69 73 69 6f 6e 20 52 41 0a 09 20 20 20 20 57 48  ision RA..    WH
9b60: 45 52 45 20 20 52 2e 72 69 64 20 20 20 20 49 4e  ERE  R.rid    IN
9b70: 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20   $theset     -- 
9b80: 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69  Restrict to revi
9b90: 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73  sions of interes
9ba0: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e  t..    AND    R.
9bb0: 69 73 64 65 66 61 75 6c 74 20 20 20 20 20 20 20  isdefault       
9bc0: 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63        -- Restric
9bd0: 74 20 74 6f 20 4e 54 44 42 0a 09 20 20 20 20 41  t to NTDB..    A
9be0: 4e 44 20 20 20 20 52 2e 64 62 63 68 69 6c 64 20  ND    R.dbchild 
9bf0: 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d  IS NOT NULL   --
9c00: 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 42 20 62   and last NTDB b
9c10: 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72 75 6e  elonging to trun
9c20: 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 41  k..    AND    RA
9c30: 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69 6c 64  .rid = R.dbchild
9c40: 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 72 65        -- Go dire
9c50: 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 72 6f  ctly to trunk ro
9c60: 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  ot..    AND    R
9c70: 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e  A.child IS NOT N
9c80: 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72  ULL    -- Has pr
9c90: 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 09 20 20  imary child...  
9ca0: 20 20 41 4e 44 20 20 20 20 52 41 2e 63 68 69 6c    AND    RA.chil
9cb0: 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20  d IN $theset    
9cc0: 20 2d 2d 20 4c 6f 6f 70 0a 09 7d 5d 5d 0a 20 20   -- Loop..}]].  
9cd0: 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64    }..    # var(d
9ce0: 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20  v) = dict (item 
9cf0: 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c  -> list (item)),
9d00: 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74   item  = list (t
9d10: 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 70 65  ype id).    type
9d20: 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f 72  method successor
9d30: 73 20 7b 64 76 20 72 65 76 69 73 69 6f 6e 73 7d  s {dv revisions}
9d40: 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76 20   {..upvar 1 $dv 
9d50: 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 73 65  dependencies..se
9d60: 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e  t theset ('[join
9d70: 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27   $revisions {','
9d80: 7d 5d 27 29 0a 0a 09 23 20 54 68 65 20 66 6f 6c  }]')...# The fol
9d90: 6c 6f 77 69 6e 67 20 63 61 73 65 73 20 73 70 65  lowing cases spe
9da0: 63 69 66 79 20 77 68 65 6e 20 61 20 72 65 76 69  cify when a revi
9db0: 73 69 6f 6e 20 53 20 69 73 20 61 20 73 75 63 63  sion S is a succ
9dc0: 65 73 73 6f 72 0a 09 23 20 6f 66 20 61 20 72 65  essor..# of a re
9dd0: 76 69 73 69 6f 6e 20 52 2e 20 45 61 63 68 20 6f  vision R. Each o
9de0: 66 20 74 68 65 20 63 61 73 65 73 20 74 72 61 6e  f the cases tran
9df0: 73 6c 61 74 65 73 20 69 6e 74 6f 20 6f 6e 65 20  slates into one 
9e00: 6f 66 0a 09 23 20 74 68 65 20 62 72 61 6e 63 68  of..# the branch
9e10: 65 73 20 6f 66 20 74 68 65 20 53 51 4c 20 55 4e  es of the SQL UN
9e20: 49 4f 4e 20 63 6f 6d 69 6e 67 20 62 65 6c 6f 77  ION coming below
9e30: 2e 0a 09 23 0a 09 23 20 28 31 29 20 53 20 63 61  ...#..# (1) S ca
9e40: 6e 20 62 65 20 61 20 70 72 69 6d 61 72 79 20 63  n be a primary c
9e50: 68 69 6c 64 20 6f 66 20 52 2c 20 69 2e 65 2e 20  hild of R, i.e. 
9e60: 69 6e 20 74 68 65 20 73 61 6d 65 20 4c 4f 44 2e  in the same LOD.
9e70: 20 52 0a 09 23 20 20 20 20 20 72 65 66 65 72 65   R..#     refere
9e80: 6e 63 65 73 20 53 20 64 69 72 65 63 74 6c 79 2e  nces S directly.
9e90: 20 52 2e 63 68 69 6c 64 20 3d 20 53 28 2e 72 69   R.child = S(.ri
9ea0: 64 29 2c 20 69 66 20 69 74 20 65 78 69 73 74 73  d), if it exists
9eb0: 2e 0a 09 23 0a 09 23 20 28 32 29 20 53 20 63 61  ...#..# (2) S ca
9ec0: 6e 20 62 65 20 61 20 73 65 63 6f 6e 64 61 72 79  n be a secondary
9ed0: 2c 20 69 2e 65 2e 20 62 72 61 6e 63 68 2c 20 63  , i.e. branch, c
9ee0: 68 69 6c 64 20 6f 66 20 52 2e 20 48 65 72 65 20  hild of R. Here 
9ef0: 74 68 65 0a 09 23 20 20 20 20 20 6c 69 6e 6b 20  the..#     link 
9f00: 69 73 20 6d 61 64 65 20 74 68 72 6f 75 67 68 20  is made through 
9f10: 74 68 65 20 68 65 6c 70 65 72 20 74 61 62 6c 65  the helper table
9f20: 0a 09 23 20 20 20 20 20 52 45 56 49 53 49 4f 4e  ..#     REVISION
9f30: 42 52 41 4e 43 48 43 48 49 4c 44 52 45 4e 2e 20  BRANCHCHILDREN. 
9f40: 52 2e 72 69 64 20 2d 3e 20 52 42 43 2e 72 69 64  R.rid -> RBC.rid
9f50: 2c 20 52 42 43 2e 62 72 69 64 20 3d 0a 09 23 20  , RBC.brid =..# 
9f60: 20 20 20 20 53 28 2e 72 69 64 29 0a 09 23 0a 09      S(.rid)..#..
9f70: 23 20 28 33 29 20 4f 72 69 67 69 6e 61 6c 6c 79  # (3) Originally
9f80: 20 74 68 69 73 20 75 73 65 20 63 61 73 65 20 64   this use case d
9f90: 65 66 69 6e 65 64 20 74 68 65 20 72 6f 6f 74 20  efined the root 
9fa0: 6f 66 20 61 20 64 65 74 61 63 68 65 64 0a 09 23  of a detached..#
9fb0: 20 20 20 20 20 4e 54 44 42 20 61 73 20 74 68 65       NTDB as the
9fc0: 20 73 75 63 63 65 73 73 6f 72 20 6f 66 20 74 68   successor of th
9fd0: 65 20 74 72 75 6e 6b 20 72 6f 6f 74 2e 20 54 68  e trunk root. Th
9fe0: 69 73 20 6c 65 61 64 73 20 74 6f 20 61 0a 09 23  is leads to a..#
9ff0: 20 20 20 20 20 62 61 64 20 74 61 6e 67 6c 65 20       bad tangle 
a000: 6c 61 74 65 72 20 6f 6e 2e 20 57 69 74 68 20 61  later on. With a
a010: 20 64 65 74 61 63 68 65 64 20 4e 54 44 42 20 74   detached NTDB t
a020: 68 65 20 6f 72 69 67 69 6e 61 6c 0a 09 23 20 20  he original..#  
a030: 20 20 20 74 72 75 6e 6b 20 72 6f 6f 74 20 72 65     trunk root re
a040: 76 69 73 69 6f 6e 20 77 61 73 20 72 65 6d 6f 76  vision was remov
a050: 65 64 20 61 73 20 69 72 72 65 6c 65 76 61 6e 74  ed as irrelevant
a060: 2c 20 61 6c 6c 6f 77 69 6e 67 0a 09 23 20 20 20  , allowing..#   
a070: 20 20 74 68 65 20 6e 6f 6d 69 6e 61 6c 20 72 6f    the nominal ro
a080: 6f 74 20 74 6f 20 62 65 20 6c 61 74 65 72 20 69  ot to be later i
a090: 6e 20 74 69 6d 65 20 74 68 61 6e 20 74 68 65 20  n time than the 
a0a0: 4e 54 44 42 0a 09 23 20 20 20 20 20 72 6f 6f 74  NTDB..#     root
a0b0: 2e 20 4e 6f 77 20 73 65 74 74 69 6e 67 20 74 68  . Now setting th
a0c0: 69 73 20 64 65 70 65 6e 64 65 6e 63 79 20 77 69  is dependency wi
a0d0: 6c 6c 20 62 65 20 62 61 63 6b 77 61 72 64 20 69  ll be backward i
a0e0: 6e 0a 09 23 20 20 20 20 20 74 69 6d 65 2e 20 52  n..#     time. R
a0f0: 45 4d 4f 56 45 44 2e 0a 09 23 0a 09 23 20 28 34  EMOVED...#..# (4
a100: 29 20 49 66 20 52 20 69 73 20 74 68 65 20 6c 61  ) If R is the la
a110: 73 74 20 6f 66 20 74 68 65 20 4e 54 44 42 20 72  st of the NTDB r
a120: 65 76 69 73 69 6f 6e 73 20 77 68 69 63 68 20 62  evisions which b
a130: 65 6c 6f 6e 67 20 74 6f 0a 09 23 20 20 20 20 20  elong to..#     
a140: 74 68 65 20 74 72 75 6e 6b 2c 20 74 68 65 6e 20  the trunk, then 
a150: 74 68 65 20 70 72 69 6d 61 72 79 20 63 68 69 6c  the primary chil
a160: 64 20 6f 66 20 74 68 65 20 74 72 75 6e 6b 20 72  d of the trunk r
a170: 6f 6f 74 20 28 74 68 65 0a 09 23 20 20 20 20 20  oot (the..#     
a180: 27 31 2e 32 27 20 72 65 76 69 73 69 6f 6e 29 20  '1.2' revision) 
a190: 69 73 20 61 20 73 75 63 63 65 73 73 6f 72 2c 20  is a successor, 
a1a0: 69 66 20 69 74 20 65 78 69 73 74 73 2e 0a 0a 09  if it exists....
a1b0: 23 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  # Note that the 
a1c0: 62 72 61 6e 63 68 65 73 20 73 70 61 77 6e 65 64  branches spawned
a1d0: 20 66 72 6f 6d 20 74 68 65 20 72 65 76 69 73 69   from the revisi
a1e0: 6f 6e 73 2c 20 61 6e 64 20 74 68 65 0a 09 23 20  ons, and the..# 
a1f0: 74 61 67 73 20 61 73 73 6f 63 69 61 74 65 64 20  tags associated 
a200: 77 69 74 68 20 74 68 65 6d 20 61 72 65 20 73 75  with them are su
a210: 63 63 65 73 73 6f 72 73 20 61 73 20 77 65 6c 6c  ccessors as well
a220: 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64  ....foreach {rid
a230: 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20 72   child} [state r
a240: 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d  un [subst -nocom
a250: 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61  mands -nobacksla
a260: 73 68 65 73 20 7b 0a 20 20 20 20 2d 2d 20 28 31  shes {.    -- (1
a270: 29 20 50 72 69 6d 61 72 79 20 63 68 69 6c 64 0a  ) Primary child.
a280: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69  .    SELECT R.ri
a290: 64 2c 20 52 2e 63 68 69 6c 64 0a 09 20 20 20 20  d, R.child..    
a2a0: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20  FROM   revision 
a2b0: 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e  R..    WHERE  R.
a2c0: 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65 74  rid   IN $theset
a2d0: 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74       -- Restrict
a2e0: 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66   to revisions of
a2f0: 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41   interest..    A
a300: 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49 53  ND    R.child IS
a310: 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20   NOT NULL    -- 
a320: 48 61 73 20 70 72 69 6d 61 72 79 20 63 68 69 6c  Has primary chil
a330: 64 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20  d.    UNION.    
a340: 2d 2d 20 28 32 29 20 53 65 63 6f 6e 64 61 72 79  -- (2) Secondary
a350: 20 28 62 72 61 6e 63 68 29 20 63 68 69 6c 64 72   (branch) childr
a360: 65 6e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52  en..    SELECT R
a370: 2e 72 69 64 2c 20 42 2e 62 72 69 64 0a 09 20 20  .rid, B.brid..  
a380: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f    FROM   revisio
a390: 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 62 72 61  n R, revisionbra
a3a0: 6e 63 68 63 68 69 6c 64 72 65 6e 20 42 0a 09 20  nchchildren B.. 
a3b0: 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20     WHERE  R.rid 
a3c0: 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20    IN $theset    
a3d0: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
a3e0: 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74  revisions of int
a3f0: 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20  erest..    AND  
a400: 20 20 52 2e 72 69 64 20 3d 20 42 2e 72 69 64 20    R.rid = B.rid 
a410: 20 20 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65           -- Sele
a420: 63 74 20 73 75 62 73 65 74 20 6f 66 20 62 72 61  ct subset of bra
a430: 6e 63 68 20 63 68 69 6c 64 72 65 6e 0a 20 20 20  nch children.   
a440: 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 34   UNION.    -- (4
a450: 29 20 43 68 69 6c 64 20 6f 66 20 74 72 75 6e 6b  ) Child of trunk
a460: 20 72 6f 6f 74 20 73 75 63 63 65 73 73 6f 72 20   root successor 
a470: 6f 66 20 6c 61 73 74 20 4e 54 44 42 20 6f 6e 20  of last NTDB on 
a480: 74 72 75 6e 6b 2e 0a 09 20 20 20 20 53 45 4c 45  trunk...    SELE
a490: 43 54 20 52 2e 72 69 64 2c 20 52 41 2e 63 68 69  CT R.rid, RA.chi
a4a0: 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76  ld..    FROM rev
a4b0: 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f  ision R, revisio
a4c0: 6e 20 52 41 0a 09 20 20 20 20 57 48 45 52 45 20  n RA..    WHERE 
a4d0: 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73  R.rid   IN $thes
a4e0: 65 74 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72  et      -- Restr
a4f0: 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73  ict to revisions
a500: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20   of interest..  
a510: 20 20 41 4e 44 20 20 20 52 2e 69 73 64 65 66 61    AND   R.isdefa
a520: 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20  ult             
a530: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 4e  -- Restrict to N
a540: 54 44 42 0a 09 20 20 20 20 41 4e 44 20 20 20 52  TDB..    AND   R
a550: 2e 64 62 63 68 69 6c 64 20 49 53 20 4e 4f 54 20  .dbchild IS NOT 
a560: 4e 55 4c 4c 20 20 20 2d 2d 20 61 6e 64 20 6c 61  NULL   -- and la
a570: 73 74 20 4e 54 44 42 20 62 65 6c 6f 6e 67 69 6e  st NTDB belongin
a580: 67 20 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20  g to trunk..    
a590: 41 4e 44 20 20 20 52 41 2e 72 69 64 20 3d 20 52  AND   RA.rid = R
a5a0: 2e 64 62 63 68 69 6c 64 20 20 20 20 20 20 2d 2d  .dbchild      --
a5b0: 20 47 6f 20 64 69 72 65 63 74 6c 79 20 74 6f 20   Go directly to 
a5c0: 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 20  trunk root..    
a5d0: 41 4e 44 20 20 20 52 41 2e 63 68 69 6c 64 20 49  AND   RA.child I
a5e0: 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d  S NOT NULL    --
a5f0: 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 68 69   Has primary chi
a600: 6c 64 2e 0a 09 7d 5d 5d 20 7b 0a 09 20 20 20 20  ld...}]] {..    
a610: 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69 6e  # Consider movin
a620: 67 20 74 68 69 73 20 74 6f 20 74 68 65 20 69 6e  g this to the in
a630: 74 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e 0a  tegrity module..
a640: 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61  .    integrity a
a650: 73 73 65 72 74 20 7b 24 72 69 64 20 21 3d 20 24  ssert {$rid != $
a660: 63 68 69 6c 64 7d 20 7b 52 65 76 69 73 69 6f 6e  child} {Revision
a670: 20 24 72 69 64 20 64 65 70 65 6e 64 73 20 6f 6e   $rid depends on
a680: 20 69 74 73 65 6c 66 2e 7d 0a 09 20 20 20 20 6c   itself.}..    l
a690: 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e 63  append dependenc
a6a0: 69 65 73 28 5b 6c 69 73 74 20 72 65 76 20 24 72  ies([list rev $r
a6b0: 69 64 5d 29 20 5b 6c 69 73 74 20 72 65 76 20 24  id]) [list rev $
a6c0: 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72 65 61  child]..}..forea
a6d0: 63 68 20 7b 72 69 64 20 63 68 69 6c 64 7d 20 5b  ch {rid child} [
a6e0: 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73 74  state run [subst
a6f0: 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f   -nocommands -no
a700: 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20  backslashes {.. 
a710: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c     SELECT R.rid,
a720: 20 54 2e 74 69 64 0a 09 20 20 20 20 46 52 4f 4d   T.tid..    FROM
a730: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 74     revision R, t
a740: 61 67 20 54 0a 09 20 20 20 20 57 48 45 52 45 20  ag T..    WHERE 
a750: 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65 73 65   R.rid IN $these
a760: 74 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72  t       -- Restr
a770: 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73  ict to revisions
a780: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20   of interest..  
a790: 20 20 41 4e 44 20 20 20 20 54 2e 72 65 76 20 3d    AND    T.rev =
a7a0: 20 52 2e 72 69 64 20 20 20 20 20 20 20 20 20 20   R.rid          
a7b0: 2d 2d 20 53 65 6c 65 63 74 20 74 61 67 73 20 61  -- Select tags a
a7c0: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 6d 0a  ttached to them.
a7d0: 09 7d 5d 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70  .}]] {..    lapp
a7e0: 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73  end dependencies
a7f0: 28 5b 6c 69 73 74 20 72 65 76 20 24 72 69 64 5d  ([list rev $rid]
a800: 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a 74 61 67  ) [list sym::tag
a810: 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f 72   $child]..}..for
a820: 65 61 63 68 20 7b 72 69 64 20 63 68 69 6c 64 7d  each {rid child}
a830: 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62   [state run [sub
a840: 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d  st -nocommands -
a850: 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a  nobackslashes {.
a860: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69  .    SELECT R.ri
a870: 64 2c 20 42 2e 62 69 64 0a 09 20 20 20 20 46 52  d, B.bid..    FR
a880: 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c  OM   revision R,
a890: 20 62 72 61 6e 63 68 20 42 0a 09 20 20 20 20 57   branch B..    W
a8a0: 48 45 52 45 20 20 52 2e 72 69 64 20 49 4e 20 24  HERE  R.rid IN $
a8b0: 74 68 65 73 65 74 20 20 20 20 20 20 20 2d 2d 20  theset       -- 
a8c0: 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69  Restrict to revi
a8d0: 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73  sions of interes
a8e0: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e  t..    AND    B.
a8f0: 72 6f 6f 74 20 3d 20 52 2e 72 69 64 20 20 20 20  root = R.rid    
a900: 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 62       -- Select b
a910: 72 61 6e 63 68 65 73 20 61 74 74 61 63 68 65 64  ranches attached
a920: 20 74 6f 20 74 68 65 6d 0a 09 7d 5d 5d 20 7b 0a   to them..}]] {.
a930: 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70  .    lappend dep
a940: 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20  endencies([list 
a950: 72 65 76 20 24 72 69 64 5d 29 20 5b 6c 69 73 74  rev $rid]) [list
a960: 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 63 68   sym::branch $ch
a970: 69 6c 64 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a  ild]..}..return.
a980: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73      }..    # res
a990: 75 6c 74 20 3d 20 6c 69 73 74 20 28 63 68 61 6e  ult = list (chan
a9a0: 67 65 73 65 74 2d 69 64 29 0a 20 20 20 20 74 79  geset-id).    ty
a9b0: 70 65 6d 65 74 68 6f 64 20 63 73 5f 73 75 63 63  pemethod cs_succ
a9c0: 65 73 73 6f 72 73 20 7b 72 65 76 69 73 69 6f 6e  essors {revision
a9d0: 73 7d 20 7b 0a 20 20 20 20 20 20 20 20 23 20 54  s} {.        # T
a9e0: 68 69 73 20 69 73 20 61 20 76 61 72 69 61 6e 74  his is a variant
a9f0: 20 6f 66 20 27 73 75 63 63 65 73 73 6f 72 73 27   of 'successors'
aa00: 20 77 68 69 63 68 20 6d 61 70 73 20 74 68 65 20   which maps the 
aa10: 6c 6f 77 2d 6c 65 76 65 6c 0a 20 20 20 20 20 20  low-level.      
aa20: 20 20 23 20 64 61 74 61 20 64 69 72 65 63 74 6c    # data directl
aa30: 79 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61  y to the associa
aa40: 74 65 64 20 63 68 61 6e 67 65 73 65 74 73 2e 20  ted changesets. 
aa50: 49 2e 65 2e 20 69 6e 73 74 65 61 64 0a 20 20 20  I.e. instead.   
aa60: 20 20 20 20 20 23 20 6d 69 6c 6c 69 6f 6e 73 20       # millions 
aa70: 6f 66 20 64 65 70 65 6e 64 65 6e 63 79 20 70 61  of dependency pa
aa80: 69 72 73 20 28 69 6e 20 65 78 74 72 65 6d 65 20  irs (in extreme 
aa90: 63 61 73 65 73 20 28 45 78 61 6d 70 6c 65 3a 20  cases (Example: 
aaa0: 54 63 6c 0a 20 20 20 20 20 20 20 20 23 20 43 56  Tcl.        # CV
aab0: 53 29 29 20 77 65 20 72 65 74 75 72 6e 20 61 20  S)) we return a 
aac0: 76 65 72 79 20 73 68 6f 72 74 20 61 6e 64 20 6d  very short and m
aad0: 75 63 68 20 6d 6f 72 65 20 6d 61 6e 61 67 65 61  uch more managea
aae0: 62 6c 65 20 6c 69 73 74 0a 20 20 20 20 20 20 20  ble list.       
aaf0: 20 23 20 6f 66 20 63 68 61 6e 67 65 73 65 74 73   # of changesets
ab00: 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20 28  ....set theset (
ab10: 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e  '[join $revision
ab20: 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75  s {','}]')..retu
ab30: 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73  rn [state run [s
ab40: 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73  ubst -nocommands
ab50: 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20   -nobackslashes 
ab60: 7b 0a 20 20 20 20 2d 2d 20 28 31 29 20 50 72 69  {.    -- (1) Pri
ab70: 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20  mary child..    
ab80: 53 45 4c 45 43 54 20 43 2e 63 69 64 0a 09 20 20  SELECT C.cid..  
ab90: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f    FROM   revisio
aba0: 6e 20 52 2c 20 63 73 69 74 65 6d 20 43 49 2c 20  n R, csitem CI, 
abb0: 63 68 61 6e 67 65 73 65 74 20 43 0a 09 20 20 20  changeset C..   
abc0: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20   WHERE  R.rid   
abd0: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d  IN $theset     -
abe0: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65  - Restrict to re
abf0: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72  visions of inter
ac00: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  est..    AND    
ac10: 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e  R.child IS NOT N
ac20: 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72  ULL    -- Has pr
ac30: 69 6d 61 72 79 20 63 68 69 6c 64 0a 20 20 20 20  imary child.    
ac40: 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43          AND    C
ac50: 49 2e 69 69 64 20 3d 20 52 2e 63 68 69 6c 64 20  I.iid = R.child 
ac60: 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20        -- Select 
ac70: 61 6c 6c 20 63 68 61 6e 67 65 73 65 74 73 0a 20  all changesets. 
ac80: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20             AND  
ac90: 20 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69 64    C.cid = CI.cid
aca0: 20 20 20 20 20 20 20 20 20 2d 2d 20 63 6f 6e 74           -- cont
acb0: 61 69 6e 69 6e 67 20 74 68 65 20 70 72 69 6d 61  aining the prima
acc0: 72 79 20 63 68 69 6c 64 0a 20 20 20 20 20 20 20  ry child.       
acd0: 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e 74 79       AND    C.ty
ace0: 70 65 20 3d 20 30 20 20 20 20 20 20 20 20 20 20  pe = 0          
acf0: 20 20 20 2d 2d 20 77 68 69 63 68 20 61 72 65 20     -- which are 
ad00: 72 65 76 69 73 69 6f 6e 20 63 68 61 6e 67 65 73  revision changes
ad10: 65 74 73 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20  ets.    UNION.  
ad20: 20 20 2d 2d 20 28 32 29 20 53 65 63 6f 6e 64 61    -- (2) Seconda
ad30: 72 79 20 28 62 72 61 6e 63 68 29 20 63 68 69 6c  ry (branch) chil
ad40: 64 72 65 6e 0a 09 20 20 20 20 53 45 4c 45 43 54  dren..    SELECT
ad50: 20 43 2e 63 69 64 0a 09 20 20 20 20 46 52 4f 4d   C.cid..    FROM
ad60: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72     revision R, r
ad70: 65 76 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 69  evisionbranchchi
ad80: 6c 64 72 65 6e 20 42 2c 20 63 73 69 74 65 6d 20  ldren B, csitem 
ad90: 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43 0a  CI, changeset C.
ada0: 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69  .    WHERE  R.ri
adb0: 64 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20  d   IN $theset  
adc0: 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74     -- Restrict t
add0: 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69  o revisions of i
ade0: 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44  nterest..    AND
adf0: 20 20 20 20 52 2e 72 69 64 20 3d 20 42 2e 72 69      R.rid = B.ri
ae00: 64 20 20 20 20 20 20 20 20 20 20 2d 2d 20 53 65  d          -- Se
ae10: 6c 65 63 74 20 73 75 62 73 65 74 20 6f 66 20 62  lect subset of b
ae20: 72 61 6e 63 68 20 63 68 69 6c 64 72 65 6e 0a 20  ranch children. 
ae30: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20             AND  
ae40: 20 20 43 49 2e 69 69 64 20 3d 20 42 2e 62 72 69    CI.iid = B.bri
ae50: 64 20 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65  d        -- Sele
ae60: 63 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 65 74  ct all changeset
ae70: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e  s.            AN
ae80: 44 20 20 20 20 43 2e 63 69 64 20 3d 20 43 49 2e  D    C.cid = CI.
ae90: 63 69 64 09 20 20 2d 2d 20 63 6f 6e 74 61 69 6e  cid.  -- contain
aea0: 69 6e 67 20 74 68 65 20 62 72 61 6e 63 68 0a 20  ing the branch. 
aeb0: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20             AND  
aec0: 20 20 43 2e 74 79 70 65 20 3d 20 30 09 09 20 20    C.type = 0..  
aed0: 2d 2d 20 77 68 69 63 68 20 61 72 65 20 72 65 76  -- which are rev
aee0: 69 73 69 6f 6e 20 63 68 61 6e 67 65 73 65 74 73  ision changesets
aef0: 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d  .    UNION.    -
af00: 2d 20 28 34 29 20 43 68 69 6c 64 20 6f 66 20 74  - (4) Child of t
af10: 72 75 6e 6b 20 72 6f 6f 74 20 73 75 63 63 65 73  runk root succes
af20: 73 6f 72 20 6f 66 20 6c 61 73 74 20 4e 54 44 42  sor of last NTDB
af30: 20 6f 6e 20 74 72 75 6e 6b 2e 0a 09 20 20 20 20   on trunk...    
af40: 53 45 4c 45 43 54 20 43 2e 63 69 64 0a 09 20 20  SELECT C.cid..  
af50: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f    FROM   revisio
af60: 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 52 41  n R, revision RA
af70: 2c 20 63 73 69 74 65 6d 20 43 49 2c 20 63 68 61  , csitem CI, cha
af80: 6e 67 65 73 65 74 20 43 0a 09 20 20 20 20 57 48  ngeset C..    WH
af90: 45 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20  ERE  R.rid   IN 
afa0: 24 74 68 65 73 65 74 20 20 20 20 20 20 2d 2d 20  $theset      -- 
afb0: 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69  Restrict to revi
afc0: 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73  sions of interes
afd0: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e  t..    AND    R.
afe0: 69 73 64 65 66 61 75 6c 74 20 20 20 20 20 20 20  isdefault       
aff0: 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63        -- Restric
b000: 74 20 74 6f 20 4e 54 44 42 0a 09 20 20 20 20 41  t to NTDB..    A
b010: 4e 44 20 20 20 20 52 2e 64 62 63 68 69 6c 64 20  ND    R.dbchild 
b020: 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d  IS NOT NULL   --
b030: 20 61 6e 64 20 6c 61 73 74 20 4e 54 44 42 20 62   and last NTDB b
b040: 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72 75 6e  elonging to trun
b050: 6b 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 41  k..    AND    RA
b060: 2e 72 69 64 20 3d 20 52 2e 64 62 63 68 69 6c 64  .rid = R.dbchild
b070: 20 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 72 65        -- Go dire
b080: 63 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 72 6f  ctly to trunk ro
b090: 6f 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  ot..    AND    R
b0a0: 41 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e  A.child IS NOT N
b0b0: 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72  ULL    -- Has pr
b0c0: 69 6d 61 72 79 20 63 68 69 6c 64 2e 0a 20 20 20  imary child..   
b0d0: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20           AND    
b0e0: 43 49 2e 69 69 64 20 3d 20 52 41 2e 63 68 69 6c  CI.iid = RA.chil
b0f0: 64 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63  d       -- Selec
b100: 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 65 74 73  t all changesets
b110: 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44  .            AND
b120: 20 20 20 20 43 2e 63 69 64 20 3d 20 43 49 2e 63      C.cid = CI.c
b130: 69 64 09 20 20 20 2d 2d 20 63 6f 6e 74 61 69 6e  id.   -- contain
b140: 69 6e 67 20 74 68 65 20 70 72 69 6d 61 72 79 20  ing the primary 
b150: 63 68 69 6c 64 0a 20 20 20 20 20 20 20 20 20 20  child.          
b160: 20 20 41 4e 44 20 20 20 20 43 2e 74 79 70 65 20    AND    C.type 
b170: 3d 20 30 09 09 20 20 20 2d 2d 20 77 68 69 63 68  = 0..   -- which
b180: 20 61 72 65 20 72 65 76 69 73 69 6f 6e 20 63 68   are revision ch
b190: 61 6e 67 65 73 65 74 73 0a 20 20 20 20 55 4e 49  angesets.    UNI
b1a0: 4f 4e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 43  ON..    SELECT C
b1b0: 2e 63 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  .cid..    FROM  
b1c0: 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 74 61 67   revision R, tag
b1d0: 20 54 2c 20 63 73 69 74 65 6d 20 43 49 2c 20 63   T, csitem CI, c
b1e0: 68 61 6e 67 65 73 65 74 20 43 0a 09 20 20 20 20  hangeset C..    
b1f0: 57 48 45 52 45 20 20 52 2e 72 69 64 20 69 6e 20  WHERE  R.rid in 
b200: 24 74 68 65 73 65 74 20 20 20 20 20 20 20 20 2d  $theset        -
b210: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65  - Restrict to re
b220: 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72  visions of inter
b230: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  est..    AND    
b240: 54 2e 72 65 76 20 3d 20 52 2e 72 69 64 09 20 20  T.rev = R.rid.  
b250: 20 2d 2d 20 53 65 6c 65 63 74 20 74 61 67 73 20   -- Select tags 
b260: 61 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 6d  attached to them
b270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44  .            AND
b280: 20 20 20 20 43 49 2e 69 69 64 20 3d 20 54 2e 74      CI.iid = T.t
b290: 69 64 20 20 20 20 20 20 20 20 20 20 2d 2d 20 53  id          -- S
b2a0: 65 6c 65 63 74 20 61 6c 6c 20 63 68 61 6e 67 65  elect all change
b2b0: 73 65 74 73 0a 20 20 20 20 20 20 20 20 20 20 20  sets.           
b2c0: 20 41 4e 44 20 20 20 20 43 2e 63 69 64 20 3d 20   AND    C.cid = 
b2d0: 43 49 2e 63 69 64 09 20 20 20 2d 2d 20 63 6f 6e  CI.cid.   -- con
b2e0: 74 61 69 6e 69 6e 67 20 74 68 65 20 74 61 67 73  taining the tags
b2f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44  .            AND
b300: 20 20 20 20 43 2e 74 79 70 65 20 3d 20 31 09 09      C.type = 1..
b310: 20 20 20 2d 2d 20 77 68 69 63 68 20 61 72 65 20     -- which are 
b320: 74 61 67 20 63 68 61 6e 67 65 73 65 74 73 0a 20  tag changesets. 
b330: 20 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 53 45     UNION..    SE
b340: 4c 45 43 54 20 43 2e 63 69 64 0a 09 20 20 20 20  LECT C.cid..    
b350: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20  FROM   revision 
b360: 52 2c 20 62 72 61 6e 63 68 20 42 2c 20 63 73 69  R, branch B, csi
b370: 74 65 6d 20 43 49 2c 20 63 68 61 6e 67 65 73 65  tem CI, changese
b380: 74 20 43 0a 09 20 20 20 20 57 48 45 52 45 20 20  t C..    WHERE  
b390: 52 2e 72 69 64 20 69 6e 20 24 74 68 65 73 65 74  R.rid in $theset
b3a0: 20 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72          -- Restr
b3b0: 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73  ict to revisions
b3c0: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20   of interest..  
b3d0: 20 20 41 4e 44 20 20 20 20 42 2e 72 6f 6f 74 20    AND    B.root 
b3e0: 3d 20 52 2e 72 69 64 09 20 20 20 2d 2d 20 53 65  = R.rid.   -- Se
b3f0: 6c 65 63 74 20 62 72 61 6e 63 68 65 73 20 61 74  lect branches at
b400: 74 61 63 68 65 64 20 74 6f 20 74 68 65 6d 0a 20  tached to them. 
b410: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20             AND  
b420: 20 20 43 49 2e 69 69 64 20 3d 20 42 2e 62 69 64    CI.iid = B.bid
b430: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 53 65 6c            -- Sel
b440: 65 63 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 65  ect all changese
b450: 74 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 41  ts.            A
b460: 4e 44 20 20 20 20 43 2e 63 69 64 20 3d 20 43 49  ND    C.cid = CI
b470: 2e 63 69 64 09 20 20 20 2d 2d 20 63 6f 6e 74 61  .cid.   -- conta
b480: 69 6e 69 6e 67 20 74 68 65 20 62 72 61 6e 63 68  ining the branch
b490: 65 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 41  es.            A
b4a0: 4e 44 20 20 20 20 43 2e 74 79 70 65 20 3d 20 32  ND    C.type = 2
b4b0: 09 09 20 20 20 2d 2d 20 77 68 69 63 68 20 61 72  ..   -- which ar
b4c0: 65 20 62 72 61 6e 63 68 20 63 68 61 6e 67 65 73  e branch changes
b4d0: 65 74 73 0a 09 7d 5d 5d 0a 20 20 20 20 7d 0a 0a  ets..}]].    }..
b4e0: 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20 73      # result = s
b4f0: 79 6d 62 6f 6c 20 6e 61 6d 65 0a 20 20 20 20 74  ymbol name.    t
b500: 79 70 65 6d 65 74 68 6f 64 20 63 73 5f 6c 6f 64  ypemethod cs_lod
b510: 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09   {revisions} {..
b520: 23 20 44 65 74 65 72 6d 69 6e 65 73 20 74 68 65  # Determines the
b530: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 6d   name of the sym
b540: 62 6f 6c 20 77 68 69 63 68 20 69 73 20 74 68 65  bol which is the
b550: 20 6c 69 6e 65 20 6f 66 0a 09 23 20 64 65 76 65   line of..# deve
b560: 6c 6f 70 6d 65 6e 74 20 66 6f 72 20 74 68 65 20  lopment for the 
b570: 72 65 76 69 73 69 6f 6e 73 20 69 6e 20 61 20 63  revisions in a c
b580: 68 61 6e 67 65 73 65 74 2e 0a 0a 09 73 65 74 20  hangeset....set 
b590: 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24  theset ('[join $
b5a0: 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d  revisions {','}]
b5b0: 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61 74  ')..return [stat
b5c0: 65 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f  e run [subst -no
b5d0: 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b  commands -noback
b5e0: 73 6c 61 73 68 65 73 20 7b 0a 09 20 20 20 20 53  slashes {..    S
b5f0: 45 4c 45 43 54 0a 09 20 20 20 20 44 49 53 54 49  ELECT..    DISTI
b600: 4e 43 54 20 4c 2e 6e 61 6d 65 0a 09 20 20 20 20  NCT L.name..    
b610: 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20  FROM   revision 
b620: 52 2c 20 73 79 6d 62 6f 6c 20 4c 0a 09 20 20 20  R, symbol L..   
b630: 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 69 6e   WHERE  R.rid in
b640: 20 24 74 68 65 73 65 74 20 20 20 20 20 20 20 20   $theset        
b650: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72  -- Restrict to r
b660: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65  evisions of inte
b670: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
b680: 20 4c 2e 73 69 64 20 3d 20 52 2e 6c 6f 64 20 20   L.sid = R.lod  
b690: 20 20 20 20 20 20 20 20 20 2d 2d 20 47 65 74 20           -- Get 
b6a0: 6c 6f 64 20 73 79 6d 62 6f 6c 20 6f 66 20 72 65  lod symbol of re
b6b0: 76 69 73 69 6f 6e 0a 09 7d 5d 5d 0a 20 20 20 20  vision..}]].    
b6c0: 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20  }.}..# # ## ### 
b6d0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23  ##### ######## #
b6e0: 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23 23  ############ ###
b6f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
b700: 23 23 0a 23 23 20 48 65 6c 70 65 72 20 73 69 6e  ##.## Helper sin
b710: 67 6c 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73  gleton. Commands
b720: 20 66 6f 72 20 74 61 67 20 73 79 6d 62 6f 6c 20   for tag symbol 
b730: 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e 69  changesets...sni
b740: 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66 6f  t::type ::vc::fo
b750: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
b760: 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 3a  s::project::rev:
b770: 3a 73 79 6d 3a 3a 74 61 67 20 7b 0a 20 20 20 20  :sym::tag {.    
b780: 74 79 70 65 6d 65 74 68 6f 64 20 62 79 72 65 76  typemethod byrev
b790: 69 73 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75 72  ision {} { retur
b7a0: 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65  n 0 }.    typeme
b7b0: 74 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 20  thod bysymbol   
b7c0: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a  {} { return 1 }.
b7d0: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69      typemethod i
b7e0: 73 74 61 67 20 20 20 20 20 20 7b 7d 20 7b 20 72  stag      {} { r
b7f0: 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20 74 79  eturn 1 }.    ty
b800: 70 65 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63  pemethod isbranc
b810: 68 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20  h   {} { return 
b820: 30 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74  0 }..    typemet
b830: 68 6f 64 20 73 74 72 20 7b 74 61 67 7d 20 7b 0a  hod str {tag} {.
b840: 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73  .struct::list as
b850: 73 69 67 6e 20 5b 73 74 61 74 65 20 72 75 6e 20  sign [state run 
b860: 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 53 2e  {..    SELECT S.
b870: 6e 61 6d 65 2c 20 46 2e 6e 61 6d 65 2c 20 50 2e  name, F.name, P.
b880: 6e 61 6d 65 0a 09 20 20 20 20 46 52 4f 4d 20 20  name..    FROM  
b890: 20 74 61 67 20 54 2c 20 73 79 6d 62 6f 6c 20 53   tag T, symbol S
b8a0: 2c 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65 63  , file F, projec
b8b0: 74 20 50 0a 09 20 20 20 20 57 48 45 52 45 20 20  t P..    WHERE  
b8c0: 54 2e 74 69 64 20 3d 20 24 74 61 67 20 20 20 2d  T.tid = $tag   -
b8d0: 2d 20 46 69 6e 64 20 73 70 65 63 69 66 69 65 64  - Find specified
b8e0: 20 74 61 67 0a 09 20 20 20 20 41 4e 44 20 20 20   tag..    AND   
b8f0: 20 46 2e 66 69 64 20 3d 20 54 2e 66 69 64 20 20   F.fid = T.fid  
b900: 2d 2d 20 47 65 74 20 66 69 6c 65 20 6f 66 20 74  -- Get file of t
b910: 61 67 0a 09 20 20 20 20 41 4e 44 20 20 20 20 50  ag..    AND    P
b920: 2e 70 69 64 20 3d 20 46 2e 70 69 64 20 20 2d 2d  .pid = F.pid  --
b930: 20 47 65 74 20 70 72 6f 6a 65 63 74 20 6f 66 20   Get project of 
b940: 66 69 6c 65 0a 09 20 20 20 20 41 4e 44 20 20 20  file..    AND   
b950: 20 53 2e 73 69 64 20 3d 20 54 2e 73 69 64 20 20   S.sid = T.sid  
b960: 2d 2d 20 47 65 74 20 73 79 6d 62 6f 6c 20 6f 66  -- Get symbol of
b970: 20 74 61 67 0a 09 7d 5d 20 73 6e 61 6d 65 20 66   tag..}] sname f
b980: 6e 61 6d 65 20 70 6e 61 6d 65 0a 09 72 65 74 75  name pname..retu
b990: 72 6e 20 22 24 70 6e 61 6d 65 2f 54 27 24 7b 73  rn "$pname/T'${s
b9a0: 6e 61 6d 65 7d 27 3a 3a 24 66 6e 61 6d 65 22 0a  name}'::$fname".
b9b0: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73      }..    # res
b9c0: 75 6c 74 20 3d 20 6c 69 73 74 20 28 6d 69 6e 74  ult = list (mint
b9d0: 69 6d 65 2c 20 6d 61 78 74 69 6d 65 29 0a 20 20  ime, maxtime).  
b9e0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 74 69 6d    typemethod tim
b9f0: 65 72 61 6e 67 65 20 7b 74 61 67 73 7d 20 7b 0a  erange {tags} {.
ba00: 09 23 20 54 68 65 20 72 61 6e 67 65 20 69 73 20  .# The range is 
ba10: 64 65 66 69 6e 65 64 20 61 73 20 74 68 65 20 72  defined as the r
ba20: 61 6e 67 65 20 6f 66 20 74 68 65 20 72 65 76 69  ange of the revi
ba30: 73 69 6f 6e 73 20 74 68 65 20 74 61 67 73 0a 09  sions the tags..
ba40: 23 20 61 72 65 20 61 74 74 61 63 68 65 64 20 74  # are attached t
ba50: 6f 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20  o....set theset 
ba60: 28 27 5b 6a 6f 69 6e 20 24 74 61 67 73 20 7b 27  ('[join $tags {'
ba70: 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b  ,'}]')..return [
ba80: 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73 74  state run [subst
ba90: 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f   -nocommands -no
baa0: 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20  backslashes {.. 
bab0: 20 20 20 53 45 4c 45 43 54 20 4d 49 4e 28 52 2e     SELECT MIN(R.
bac0: 64 61 74 65 29 2c 20 4d 41 58 28 52 2e 64 61 74  date), MAX(R.dat
bad0: 65 29 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 74  e)..    FROM   t
bae0: 61 67 20 54 2c 20 72 65 76 69 73 69 6f 6e 20 52  ag T, revision R
baf0: 0a 09 20 20 20 20 57 48 45 52 45 20 20 54 2e 74  ..    WHERE  T.t
bb00: 69 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 2d  id IN $theset  -
bb10: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 74 61  - Restrict to ta
bb20: 67 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 20  gs of interest. 
bb30: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20             AND  
bb40: 20 20 52 2e 72 69 64 20 3d 20 54 2e 72 65 76 20    R.rid = T.rev 
bb50: 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 74 61      -- Select ta
bb60: 67 20 70 61 72 65 6e 74 20 72 65 76 69 73 69 6f  g parent revisio
bb70: 6e 73 0a 09 7d 5d 5d 0a 20 20 20 20 7d 0a 0a 20  ns..}]].    }.. 
bb80: 20 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 64     # var(dv) = d
bb90: 69 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73  ict (item -> lis
bba0: 74 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20  t (item)), item 
bbb0: 20 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69 64   = list (type id
bbc0: 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ).    typemethod
bbd0: 20 73 75 63 63 65 73 73 6f 72 73 20 7b 64 76 20   successors {dv 
bbe0: 74 61 67 73 7d 20 7b 0a 09 23 20 54 61 67 73 20  tags} {..# Tags 
bbf0: 68 61 76 65 20 6e 6f 20 73 75 63 63 65 73 73 6f  have no successo
bc00: 72 73 2e 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  rs...return.    
bc10: 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20  }..    # result 
bc20: 3d 20 34 2d 6c 69 73 74 20 28 69 74 65 6d 74 79  = 4-list (itemty
bc30: 70 65 20 69 74 65 6d 69 64 20 6e 65 78 74 69 74  pe itemid nextit
bc40: 65 6d 74 79 70 65 20 6e 65 78 74 69 74 65 6d 69  emtype nextitemi
bc50: 64 20 2e 2e 2e 29 0a 20 20 20 20 74 79 70 65 6d  d ...).    typem
bc60: 65 74 68 6f 64 20 6c 6f 6f 70 73 20 7b 74 61 67  ethod loops {tag
bc70: 73 7d 20 7b 0a 09 23 20 54 61 67 73 20 68 61 76  s} {..# Tags hav
bc80: 65 20 6e 6f 20 73 75 63 63 65 73 73 6f 72 73 2c  e no successors,
bc90: 20 74 68 65 72 65 66 6f 72 65 20 63 61 6e 6e 6f   therefore canno
bca0: 74 20 63 61 75 73 65 20 6c 6f 6f 70 73 0a 09 72  t cause loops..r
bcb0: 65 74 75 72 6e 20 7b 7d 0a 20 20 20 20 7d 0a 0a  eturn {}.    }..
bcc0: 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c      # result = l
bcd0: 69 73 74 20 28 63 68 61 6e 67 65 73 65 74 2d 69  ist (changeset-i
bce0: 64 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  d).    typemetho
bcf0: 64 20 63 73 5f 73 75 63 63 65 73 73 6f 72 73 20  d cs_successors 
bd00: 7b 74 61 67 73 7d 20 7b 0a 09 23 20 54 61 67 73  {tags} {..# Tags
bd10: 20 68 61 76 65 20 6e 6f 20 73 75 63 63 65 73 73   have no success
bd20: 6f 72 73 2e 0a 09 72 65 74 75 72 6e 0a 20 20 20  ors...return.   
bd30: 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74   }..    # result
bd40: 20 3d 20 73 79 6d 62 6f 6c 20 6e 61 6d 65 0a 20   = symbol name. 
bd50: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 63 73     typemethod cs
bd60: 5f 6c 6f 64 20 7b 74 61 67 73 7d 20 7b 0a 09 23  _lod {tags} {..#
bd70: 20 44 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20   Determines the 
bd80: 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 6d 62  name of the symb
bd90: 6f 6c 20 77 68 69 63 68 20 69 73 20 74 68 65 20  ol which is the 
bda0: 6c 69 6e 65 20 6f 66 0a 09 23 20 64 65 76 65 6c  line of..# devel
bdb0: 6f 70 6d 65 6e 74 20 66 6f 72 20 74 68 65 20 74  opment for the t
bdc0: 61 67 73 20 69 6e 20 61 20 63 68 61 6e 67 65 73  ags in a changes
bdd0: 65 74 2e 0a 0a 09 73 65 74 20 74 68 65 73 65 74  et....set theset
bde0: 20 28 27 5b 6a 6f 69 6e 20 24 74 61 67 73 20 7b   ('[join $tags {
bdf0: 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20  ','}]')..return 
be00: 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73  [state run [subs
be10: 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e  t -nocommands -n
be20: 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09  obackslashes {..
be30: 20 20 20 20 53 45 4c 45 43 54 0a 09 20 20 20 20      SELECT..    
be40: 44 49 53 54 49 4e 43 54 20 4c 2e 6e 61 6d 65 0a  DISTINCT L.name.
be50: 09 20 20 20 20 46 52 4f 4d 20 20 20 74 61 67 20  .    FROM   tag 
be60: 54 2c 20 73 79 6d 62 6f 6c 20 4c 0a 09 20 20 20  T, symbol L..   
be70: 20 57 48 45 52 45 20 20 54 2e 74 69 64 20 69 6e   WHERE  T.tid in
be80: 20 24 74 68 65 73 65 74 20 20 20 20 20 20 20 20   $theset        
be90: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 74  -- Restrict to t
bea0: 61 67 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  ags of interest.
beb0: 09 20 20 20 20 41 4e 44 20 20 20 20 4c 2e 73 69  .    AND    L.si
bec0: 64 20 3d 20 54 2e 6c 6f 64 20 20 20 20 20 20 20  d = T.lod       
bed0: 20 20 20 20 2d 2d 20 47 65 74 20 6c 6f 64 20 73      -- Get lod s
bee0: 79 6d 62 6f 6c 20 6f 66 20 74 61 67 0a 09 7d 5d  ymbol of tag..}]
bef0: 5d 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23  ].    }.}..# # #
bf00: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
bf10: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
bf20: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
bf30: 23 23 23 23 23 23 23 23 0a 23 23 20 48 65 6c 70  ########.## Help
bf40: 65 72 20 73 69 6e 67 6c 65 74 6f 6e 2e 20 43 6f  er singleton. Co
bf50: 6d 6d 61 6e 64 73 20 66 6f 72 20 62 72 61 6e 63  mmands for branc
bf60: 68 20 73 79 6d 62 6f 6c 20 63 68 61 6e 67 65 73  h symbol changes
bf70: 65 74 73 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 65  ets...snit::type
bf80: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
bf90: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a  mport::cvs::proj
bfa0: 65 63 74 3a 3a 72 65 76 3a 3a 73 79 6d 3a 3a 62  ect::rev::sym::b
bfb0: 72 61 6e 63 68 20 7b 0a 20 20 20 20 74 79 70 65  ranch {.    type
bfc0: 6d 65 74 68 6f 64 20 62 79 72 65 76 69 73 69 6f  method byrevisio
bfd0: 6e 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20  n {} { return 0 
bfe0: 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  }.    typemethod
bff0: 20 62 79 73 79 6d 62 6f 6c 20 20 20 7b 7d 20 7b   bysymbol   {} {
c000: 20 72 65 74 75 72 6e 20 31 20 7d 0a 20 20 20 20   return 1 }.    
c010: 74 79 70 65 6d 65 74 68 6f 64 20 69 73 74 61 67  typemethod istag
c020: 20 20 20 20 20 20 7b 7d 20 7b 20 72 65 74 75 72        {} { retur
c030: 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65 6d 65  n 0 }.    typeme
c040: 74 68 6f 64 20 69 73 62 72 61 6e 63 68 20 20 20  thod isbranch   
c050: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a  {} { return 1 }.
c060: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
c070: 73 74 72 20 7b 62 72 61 6e 63 68 7d 20 7b 0a 09  str {branch} {..
c080: 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73  struct::list ass
c090: 69 67 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 7b  ign [state run {
c0a0: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 53 2e 6e  ..    SELECT S.n
c0b0: 61 6d 65 2c 20 46 2e 6e 61 6d 65 2c 20 50 2e 6e  ame, F.name, P.n
c0c0: 61 6d 65 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  ame..    FROM   
c0d0: 62 72 61 6e 63 68 20 42 2c 20 73 79 6d 62 6f 6c  branch B, symbol
c0e0: 20 53 2c 20 66 69 6c 65 20 46 2c 20 70 72 6f 6a   S, file F, proj
c0f0: 65 63 74 20 50 0a 09 20 20 20 20 57 48 45 52 45  ect P..    WHERE
c100: 20 20 42 2e 62 69 64 20 3d 20 24 62 72 61 6e 63    B.bid = $branc
c110: 68 20 20 2d 2d 20 46 69 6e 64 20 73 70 65 63 69  h  -- Find speci
c120: 66 69 65 64 20 62 72 61 6e 63 68 0a 09 20 20 20  fied branch..   
c130: 20 41 4e 44 20 20 20 20 46 2e 66 69 64 20 3d 20   AND    F.fid = 
c140: 42 2e 66 69 64 20 20 20 20 2d 2d 20 47 65 74 20  B.fid    -- Get 
c150: 66 69 6c 65 20 6f 66 20 62 72 61 6e 63 68 0a 09  file of branch..
c160: 20 20 20 20 41 4e 44 20 20 20 20 50 2e 70 69 64      AND    P.pid
c170: 20 3d 20 46 2e 70 69 64 20 20 20 20 2d 2d 20 47   = F.pid    -- G
c180: 65 74 20 70 72 6f 6a 65 63 74 20 6f 66 20 66 69  et project of fi
c190: 6c 65 0a 09 20 20 20 20 41 4e 44 20 20 20 20 53  le..    AND    S
c1a0: 2e 73 69 64 20 3d 20 42 2e 73 69 64 20 20 20 20  .sid = B.sid    
c1b0: 2d 2d 20 47 65 74 20 73 79 6d 62 6f 6c 20 6f 66  -- Get symbol of
c1c0: 20 62 72 61 6e 63 68 0a 09 7d 5d 20 73 6e 61 6d   branch..}] snam
c1d0: 65 20 66 6e 61 6d 65 20 70 6e 61 6d 65 0a 09 72  e fname pname..r
c1e0: 65 74 75 72 6e 20 22 24 70 6e 61 6d 65 2f 42 27  eturn "$pname/B'
c1f0: 24 7b 73 6e 61 6d 65 7d 27 3a 3a 24 66 6e 61 6d  ${sname}'::$fnam
c200: 65 22 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  e".    }..    # 
c210: 72 65 73 75 6c 74 20 3d 20 6c 69 73 74 20 28 6d  result = list (m
c220: 69 6e 74 69 6d 65 2c 20 6d 61 78 74 69 6d 65 29  intime, maxtime)
c230: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
c240: 74 69 6d 65 72 61 6e 67 65 20 7b 62 72 61 6e 63  timerange {branc
c250: 68 65 73 7d 20 7b 0a 09 23 20 54 68 65 20 72 61  hes} {..# The ra
c260: 6e 67 65 20 6f 66 20 61 20 62 72 61 6e 63 68 20  nge of a branch 
c270: 69 73 20 64 65 66 69 6e 65 64 20 61 73 20 74 68  is defined as th
c280: 65 20 72 61 6e 67 65 20 6f 66 20 74 68 65 0a 09  e range of the..
c290: 23 20 72 65 76 69 73 69 6f 6e 73 20 74 68 65 20  # revisions the 
c2a0: 62 72 61 6e 63 68 65 73 20 61 72 65 20 73 70 61  branches are spa
c2b0: 77 6e 65 64 20 62 79 2e 20 4e 4f 54 45 20 68 6f  wned by. NOTE ho
c2c0: 77 65 76 65 72 20 74 68 61 74 20 74 68 65 0a 09  wever that the..
c2d0: 23 20 62 72 61 6e 63 68 65 73 20 61 73 73 6f 63  # branches assoc
c2e0: 69 61 74 65 64 20 77 69 74 68 20 61 20 64 65 74  iated with a det
c2f0: 61 63 68 65 64 20 4e 54 44 42 20 77 69 6c 6c 20  ached NTDB will 
c300: 68 61 76 65 20 6e 6f 20 72 6f 6f 74 0a 09 23 20  have no root..# 
c310: 73 70 61 77 6e 69 6e 67 20 74 68 65 6d 2c 20 68  spawning them, h
c320: 65 6e 63 65 20 74 68 65 79 20 68 61 76 65 20 6e  ence they have n
c330: 6f 20 72 65 61 6c 20 74 69 6d 65 72 61 6e 67 65  o real timerange
c340: 20 61 6e 79 0a 09 23 20 6c 6f 6e 67 65 72 2e 20   any..# longer. 
c350: 42 79 20 75 73 69 6e 67 20 30 20 77 65 20 70 75  By using 0 we pu
c360: 74 20 74 68 65 6d 20 69 6e 20 66 72 6f 6e 74 20  t them in front 
c370: 6f 66 20 65 76 65 72 79 74 68 69 6e 67 20 65 6c  of everything el
c380: 73 65 2c 0a 09 23 20 61 73 20 74 68 65 79 20 6c  se,..# as they l
c390: 6f 67 69 63 61 6c 6c 79 20 61 72 65 2e 0a 0a 09  ogically are....
c3a0: 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f  set theset ('[jo
c3b0: 69 6e 20 24 62 72 61 6e 63 68 65 73 20 7b 27 2c  in $branches {',
c3c0: 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73  '}]')..return [s
c3d0: 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73 74 20  tate run [subst 
c3e0: 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62  -nocommands -nob
c3f0: 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20  ackslashes {..  
c400: 20 20 53 45 4c 45 43 54 20 49 46 4e 55 4c 4c 28    SELECT IFNULL(
c410: 4d 49 4e 28 52 2e 64 61 74 65 29 2c 30 29 2c 20  MIN(R.date),0), 
c420: 49 46 4e 55 4c 4c 28 4d 41 58 28 52 2e 64 61 74  IFNULL(MAX(R.dat
c430: 65 29 2c 30 29 0a 09 20 20 20 20 46 52 4f 4d 20  e),0)..    FROM 
c440: 20 62 72 61 6e 63 68 20 42 2c 20 72 65 76 69 73   branch B, revis
c450: 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45  ion R..    WHERE
c460: 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65   B.bid IN $these
c470: 74 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20  t   -- Restrict 
c480: 74 6f 20 62 72 61 6e 63 68 65 73 20 6f 66 20 69  to branches of i
c490: 6e 74 65 72 65 73 74 0a 20 20 20 20 20 20 20 20  nterest.        
c4a0: 20 20 20 20 41 4e 44 20 20 20 52 2e 72 69 64 20      AND   R.rid 
c4b0: 3d 20 42 2e 72 6f 6f 74 20 20 20 20 20 2d 2d 20  = B.root     -- 
c4c0: 53 65 6c 65 63 74 20 62 72 61 6e 63 68 20 70 61  Select branch pa
c4d0: 72 65 6e 74 20 72 65 76 69 73 69 6f 6e 73 0a 09  rent revisions..
c4e0: 7d 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  }]].    }..    #
c4f0: 20 72 65 73 75 6c 74 20 3d 20 34 2d 6c 69 73 74   result = 4-list
c500: 20 28 69 74 65 6d 74 79 70 65 20 69 74 65 6d 69   (itemtype itemi
c510: 64 20 6e 65 78 74 69 74 65 6d 74 79 70 65 20 6e  d nextitemtype n
c520: 65 78 74 69 74 65 6d 69 64 20 2e 2e 2e 29 0a 20  extitemid ...). 
c530: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c 6f     typemethod lo
c540: 6f 70 73 20 7b 62 72 61 6e 63 68 65 73 7d 20 7b  ops {branches} {
c550: 0a 09 23 20 4e 6f 74 65 3a 20 52 65 76 69 73 69  ..# Note: Revisi
c560: 6f 6e 73 20 61 6e 64 20 74 61 67 73 20 63 61 6e  ons and tags can
c570: 6e 6f 74 20 63 61 75 73 65 20 74 68 65 20 6c 6f  not cause the lo
c580: 6f 70 2e 20 42 65 69 6e 67 20 6f 66 20 61 0a 09  op. Being of a..
c590: 23 20 66 75 6e 64 61 6d 65 6e 74 61 6c 6c 79 20  # fundamentally 
c5a0: 64 69 66 66 65 72 65 6e 74 20 74 79 70 65 20 74  different type t
c5b0: 68 65 79 20 63 61 6e 6e 6f 74 20 62 65 20 69 6e  hey cannot be in
c5c0: 20 74 68 65 20 69 6e 63 6f 6d 69 6e 67 0a 09 23   the incoming..#
c5d0: 20 73 65 74 20 6f 66 20 69 64 73 2e 0a 0a 09 73   set of ids....s
c5e0: 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69  et theset ('[joi
c5f0: 6e 20 24 62 72 61 6e 63 68 65 73 20 7b 27 2c 27  n $branches {','
c600: 7d 5d 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74  }]')..return [st
c610: 61 74 65 20 72 75 6e 20 5b 73 75 62 73 74 20 2d  ate run [subst -
c620: 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61  nocommands -noba
c630: 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20 20  ckslashes {..   
c640: 20 53 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 42   SELECT B.bid, B
c650: 58 2e 62 69 64 0a 09 20 20 20 20 46 52 4f 4d 20  X.bid..    FROM 
c660: 20 20 62 72 61 6e 63 68 20 42 2c 20 70 72 65 66    branch B, pref
c670: 65 72 65 64 70 61 72 65 6e 74 20 50 2c 20 62 72  eredparent P, br
c680: 61 6e 63 68 20 42 58 0a 09 20 20 20 20 57 48 45  anch BX..    WHE
c690: 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68  RE  B.bid IN $th
c6a0: 65 73 65 74 20 20 20 2d 2d 20 52 65 73 74 72 69  eset   -- Restri
c6b0: 63 74 20 74 6f 20 62 72 61 6e 63 68 65 73 20 6f  ct to branches o
c6c0: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20  f interest..    
c6d0: 41 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50  AND    B.sid = P
c6e0: 2e 70 69 64 20 20 20 20 20 20 2d 2d 20 47 65 74  .pid      -- Get
c6f0: 20 74 68 65 20 70 72 65 66 65 72 65 64 20 62 72   the prefered br
c700: 61 6e 63 68 65 73 20 76 69 61 0a 09 20 20 20 20  anches via..    
c710: 41 4e 44 20 20 20 20 42 58 2e 73 69 64 20 3d 20  AND    BX.sid = 
c720: 50 2e 73 69 64 20 20 20 20 20 2d 2d 20 74 68 65  P.sid     -- the
c730: 20 62 72 61 6e 63 68 20 73 79 6d 62 6f 6c 73 0a   branch symbols.
c740: 09 20 20 20 20 41 4e 44 20 20 20 20 42 58 2e 62  .    AND    BX.b
c750: 69 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 2d  id IN $theset  -
c760: 2d 20 4c 6f 6f 70 0a 09 7d 5d 5d 0a 20 20 20 20  - Loop..}]].    
c770: 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64 76 29  }..    # var(dv)
c780: 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20 2d 3e   = dict (item ->
c790: 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c 20 69   list (item)), i
c7a0: 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74 79 70  tem  = list (typ
c7b0: 65 20 69 64 29 0a 20 20 20 20 74 79 70 65 6d 65  e id).    typeme
c7c0: 74 68 6f 64 20 73 75 63 63 65 73 73 6f 72 73 20  thod successors 
c7d0: 7b 64 76 20 62 72 61 6e 63 68 65 73 7d 20 7b 0a  {dv branches} {.
c7e0: 09 75 70 76 61 72 20 31 20 24 64 76 20 64 65 70  .upvar 1 $dv dep
c7f0: 65 6e 64 65 6e 63 69 65 73 0a 09 23 20 54 68 65  endencies..# The
c800: 20 66 69 72 73 74 20 72 65 76 69 73 69 6f 6e 20   first revision 
c810: 63 6f 6d 6d 69 74 74 65 64 20 6f 6e 20 61 20 62  committed on a b
c820: 72 61 6e 63 68 2c 20 61 6e 64 20 61 6c 6c 20 62  ranch, and all b
c830: 72 61 6e 63 68 65 73 0a 09 23 20 61 6e 64 20 74  ranches..# and t
c840: 61 67 73 20 77 68 69 63 68 20 68 61 76 65 20 69  ags which have i
c850: 74 20 61 73 20 74 68 65 69 72 20 70 72 65 66 65  t as their prefe
c860: 72 65 64 20 70 61 72 65 6e 74 20 61 72 65 20 74  red parent are t
c870: 68 65 0a 09 23 20 73 75 63 63 65 73 73 6f 72 73  he..# successors
c880: 20 6f 66 20 61 20 62 72 61 6e 63 68 2e 0a 0a 09   of a branch....
c890: 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f  set theset ('[jo
c8a0: 69 6e 20 24 62 72 61 6e 63 68 65 73 20 7b 27 2c  in $branches {',
c8b0: 27 7d 5d 27 29 0a 09 66 6f 72 65 61 63 68 20 7b  '}]')..foreach {
c8c0: 62 69 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74  bid child} [stat
c8d0: 65 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f  e run [subst -no
c8e0: 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b  commands -noback
c8f0: 73 6c 61 73 68 65 73 20 7b 0a 09 20 20 20 20 53  slashes {..    S
c900: 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 52 2e 72  ELECT B.bid, R.r
c910: 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62  id..    FROM   b
c920: 72 61 6e 63 68 20 42 2c 20 72 65 76 69 73 69 6f  ranch B, revisio
c930: 6e 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 20  n R..    WHERE  
c940: 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65 74  B.bid IN $theset
c950: 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74       -- Restrict
c960: 20 74 6f 20 62 72 61 6e 63 68 65 73 20 6f 66 20   to branches of 
c970: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e  interest..    AN
c980: 44 20 20 20 20 42 2e 66 69 72 73 74 20 3d 20 52  D    B.first = R
c990: 2e 72 69 64 20 20 20 20 20 20 2d 2d 20 47 65 74  .rid      -- Get
c9a0: 20 66 69 72 73 74 20 72 65 76 69 73 69 6f 6e 20   first revision 
c9b0: 6f 6e 20 74 68 65 20 62 72 61 6e 63 68 0a 09 7d  on the branch..}
c9c0: 5d 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e  ]] {..    lappen
c9d0: 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b  d dependencies([
c9e0: 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68  list sym::branch
c9f0: 20 24 62 69 64 5d 29 20 5b 6c 69 73 74 20 72 65   $bid]) [list re
ca00: 76 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09 66 6f  v $child]..}..fo
ca10: 72 65 61 63 68 20 7b 62 69 64 20 63 68 69 6c 64  reach {bid child
ca20: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75  } [state run [su
ca30: 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20  bst -nocommands 
ca40: 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b  -nobackslashes {
ca50: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62  ..    SELECT B.b
ca60: 69 64 2c 20 42 58 2e 62 69 64 0a 09 20 20 20 20  id, BX.bid..    
ca70: 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c  FROM   branch B,
ca80: 20 70 72 65 66 65 72 65 64 70 61 72 65 6e 74 20   preferedparent 
ca90: 50 2c 20 62 72 61 6e 63 68 20 42 58 0a 09 20 20  P, branch BX..  
caa0: 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20 49    WHERE  B.bid I
cab0: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d  N $theset     --
cac0: 20 52 65 73 74 72 69 63 74 20 74 6f 20 62 72 61   Restrict to bra
cad0: 6e 63 68 65 73 20 6f 66 20 69 6e 74 65 72 65 73  nches of interes
cae0: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e  t..    AND    B.
caf0: 73 69 64 20 3d 20 50 2e 70 69 64 20 20 20 20 20  sid = P.pid     
cb00: 20 20 20 2d 2d 20 47 65 74 20 73 75 62 6f 72 64     -- Get subord
cb10: 69 6e 61 74 65 20 62 72 61 6e 63 68 65 73 20 76  inate branches v
cb20: 69 61 20 74 68 65 0a 09 20 20 20 20 41 4e 44 20  ia the..    AND 
cb30: 20 20 20 42 58 2e 73 69 64 20 3d 20 50 2e 73 69     BX.sid = P.si
cb40: 64 20 20 20 20 20 20 20 2d 2d 20 70 72 65 66 65  d       -- prefe
cb50: 72 65 64 20 70 61 72 65 6e 74 73 20 6f 66 20 74  red parents of t
cb60: 68 65 69 72 20 73 79 6d 62 6f 6c 73 0a 09 7d 5d  heir symbols..}]
cb70: 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64  ] {..    lappend
cb80: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c   dependencies([l
cb90: 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20  ist sym::branch 
cba0: 24 62 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d  $bid]) [list sym
cbb0: 3a 3a 62 72 61 6e 63 68 20 24 63 68 69 6c 64 5d  ::branch $child]
cbc0: 0a 09 7d 0a 09 66 6f 72 65 61 63 68 20 7b 62 69  ..}..foreach {bi
cbd0: 64 20 63 68 69 6c 64 7d 20 5b 73 74 61 74 65 20  d child} [state 
cbe0: 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f  run [subst -noco
cbf0: 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c  mmands -nobacksl
cc00: 61 73 68 65 73 20 7b 0a 09 20 20 20 20 53 45 4c  ashes {..    SEL
cc10: 45 43 54 20 42 2e 62 69 64 2c 20 54 2e 74 69 64  ECT B.bid, T.tid
cc20: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61  ..    FROM   bra
cc30: 6e 63 68 20 42 2c 20 70 72 65 66 65 72 65 64 70  nch B, preferedp
cc40: 61 72 65 6e 74 20 50 2c 20 74 61 67 20 54 0a 09  arent P, tag T..
cc50: 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 64      WHERE  B.bid
cc60: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20   IN $theset     
cc70: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 62  -- Restrict to b
cc80: 72 61 6e 63 68 65 73 20 6f 66 20 69 6e 74 65 72  ranches of inter
cc90: 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20  est..    AND    
cca0: 42 2e 73 69 64 20 3d 20 50 2e 70 69 64 20 20 20  B.sid = P.pid   
ccb0: 20 20 20 20 20 2d 2d 20 47 65 74 20 73 75 62 6f       -- Get subo
ccc0: 72 64 69 6e 61 74 65 20 74 61 67 73 20 76 69 61  rdinate tags via
ccd0: 20 74 68 65 0a 09 20 20 20 20 41 4e 44 20 20 20   the..    AND   
cce0: 20 54 2e 73 69 64 20 3d 20 50 2e 73 69 64 20 20   T.sid = P.sid  
ccf0: 20 20 20 20 20 20 2d 2d 20 70 72 65 66 65 72 65        -- prefere
cd00: 64 20 70 61 72 65 6e 74 73 20 6f 66 20 74 68 65  d parents of the
cd10: 69 72 20 73 79 6d 62 6f 6c 73 0a 09 7d 5d 5d 20  ir symbols..}]] 
cd20: 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64  {..    lappend d
cd30: 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73  ependencies([lis
cd40: 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 62  t sym::branch $b
cd50: 69 64 5d 29 20 5b 6c 69 73 74 20 73 79 6d 3a 3a  id]) [list sym::
cd60: 74 61 67 20 24 63 68 69 6c 64 5d 0a 09 7d 0a 09  tag $child]..}..
cd70: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20  return.    }..  
cd80: 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73    # result = lis
cd90: 74 20 28 63 68 61 6e 67 65 73 65 74 2d 69 64 29  t (changeset-id)
cda0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
cdb0: 63 73 5f 73 75 63 63 65 73 73 6f 72 73 20 7b 62  cs_successors {b
cdc0: 72 61 6e 63 68 65 73 7d 20 7b 0a 20 20 20 20 20  ranches} {.     
cdd0: 20 20 20 23 20 54 68 69 73 20 69 73 20 61 20 76     # This is a v
cde0: 61 72 69 61 6e 74 20 6f 66 20 27 73 75 63 63 65  ariant of 'succe
cdf0: 73 73 6f 72 73 27 20 77 68 69 63 68 20 6d 61 70  ssors' which map
ce00: 73 20 74 68 65 20 6c 6f 77 2d 6c 65 76 65 6c 0a  s the low-level.
ce10: 20 20 20 20 20 20 20 20 23 20 64 61 74 61 20 64          # data d
ce20: 69 72 65 63 74 6c 79 20 74 6f 20 74 68 65 20 61  irectly to the a
ce30: 73 73 6f 63 69 61 74 65 64 20 63 68 61 6e 67 65  ssociated change
ce40: 73 65 74 73 2e 20 49 2e 65 2e 20 69 6e 73 74 65  sets. I.e. inste
ce50: 61 64 0a 20 20 20 20 20 20 20 20 23 20 6d 69 6c  ad.        # mil
ce60: 6c 69 6f 6e 73 20 6f 66 20 64 65 70 65 6e 64 65  lions of depende
ce70: 6e 63 79 20 70 61 69 72 73 20 28 69 6e 20 65 78  ncy pairs (in ex
ce80: 74 72 65 6d 65 20 63 61 73 65 73 20 28 45 78 61  treme cases (Exa
ce90: 6d 70 6c 65 3a 20 54 63 6c 0a 20 20 20 20 20 20  mple: Tcl.      
cea0: 20 20 23 20 43 56 53 29 29 20 77 65 20 72 65 74    # CVS)) we ret
ceb0: 75 72 6e 20 61 20 76 65 72 79 20 73 68 6f 72 74  urn a very short
cec0: 20 61 6e 64 20 6d 75 63 68 20 6d 6f 72 65 20 6d   and much more m
ced0: 61 6e 61 67 65 61 62 6c 65 20 6c 69 73 74 0a 20  anageable list. 
cee0: 20 20 20 20 20 20 20 23 20 6f 66 20 63 68 61 6e         # of chan
cef0: 67 65 73 65 74 73 2e 0a 0a 09 73 65 74 20 74 68  gesets....set th
cf00: 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72  eset ('[join $br
cf10: 61 6e 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a  anches {','}]').
cf20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 5b          return [
cf30: 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62 73 74  state run [subst
cf40: 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f   -nocommands -no
cf50: 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20  backslashes {.. 
cf60: 20 20 20 53 45 4c 45 43 54 20 43 2e 63 69 64 0a     SELECT C.cid.
cf70: 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e  .    FROM   bran
cf80: 63 68 20 42 2c 20 72 65 76 69 73 69 6f 6e 20 52  ch B, revision R
cf90: 2c 20 63 73 69 74 65 6d 20 43 49 2c 20 63 68 61  , csitem CI, cha
cfa0: 6e 67 65 73 65 74 20 43 0a 09 20 20 20 20 57 48  ngeset C..    WH
cfb0: 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74  ERE  B.bid IN $t
cfc0: 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73  heset     -- Res
cfd0: 74 72 69 63 74 20 74 6f 20 62 72 61 6e 63 68 65  trict to branche
cfe0: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20  s of interest.. 
cff0: 20 20 20 41 4e 44 20 20 20 20 42 2e 66 69 72 73     AND    B.firs
d000: 74 20 3d 20 52 2e 72 69 64 09 2d 2d 20 47 65 74  t = R.rid.-- Get
d010: 20 66 69 72 73 74 20 72 65 76 69 73 69 6f 6e 20   first revision 
d020: 6f 6e 20 74 68 65 20 62 72 61 6e 63 68 0a 20 20  on the branch.  
d030: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20            AND   
d040: 20 43 49 2e 69 69 64 20 3d 20 52 2e 72 69 64 20   CI.iid = R.rid 
d050: 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20        -- Select 
d060: 61 6c 6c 20 63 68 61 6e 67 65 73 65 74 73 0a 20  all changesets. 
d070: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20             AND  
d080: 20 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69 64    C.cid = CI.cid
d090: 09 2d 2d 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  .-- containing t
d0a0: 68 69 73 20 72 65 76 69 73 69 6f 6e 0a 20 20 20  his revision.   
d0b0: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20           AND    
d0c0: 43 2e 74 79 70 65 20 3d 20 30 09 09 2d 2d 20 77  C.type = 0..-- w
d0d0: 68 69 63 68 20 61 72 65 20 72 65 76 69 73 69 6f  hich are revisio
d0e0: 6e 20 63 68 61 6e 67 65 73 65 74 73 0a 20 20 20  n changesets.   
d0f0: 20 55 4e 49 4f 4e 0a 09 20 20 20 20 53 45 4c 45   UNION..    SELE
d100: 43 54 20 43 2e 63 69 64 0a 09 20 20 20 20 46 52  CT C.cid..    FR
d110: 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20 70  OM   branch B, p
d120: 72 65 66 65 72 65 64 70 61 72 65 6e 74 20 50 2c  referedparent P,
d130: 20 62 72 61 6e 63 68 20 42 58 2c 20 63 73 69 74   branch BX, csit
d140: 65 6d 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74  em CI, changeset
d150: 20 43 0a 09 20 20 20 20 57 48 45 52 45 20 20 42   C..    WHERE  B
d160: 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65 74 20  .bid IN $theset 
d170: 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20      -- Restrict 
d180: 74 6f 20 62 72 61 6e 63 68 65 73 20 6f 66 20 69  to branches of i
d190: 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44  nterest..    AND
d1a0: 20 20 20 20 42 2e 73 69 64 20 3d 20 50 2e 70 69      B.sid = P.pi
d1b0: 64 09 2d 2d 20 47 65 74 20 73 75 62 6f 72 64 69  d.-- Get subordi
d1c0: 6e 61 74 65 20 62 72 61 6e 63 68 65 73 20 76 69  nate branches vi
d1d0: 61 20 74 68 65 0a 09 20 20 20 20 41 4e 44 20 20  a the..    AND  
d1e0: 20 20 42 58 2e 73 69 64 20 3d 20 50 2e 73 69 64    BX.sid = P.sid
d1f0: 09 2d 2d 20 70 72 65 66 65 72 65 64 20 70 61 72  .-- prefered par
d200: 65 6e 74 73 20 6f 66 20 74 68 65 69 72 20 73 79  ents of their sy
d210: 6d 62 6f 6c 73 0a 20 20 20 20 20 20 20 20 20 20  mbols.          
d220: 20 20 41 4e 44 20 20 20 20 43 49 2e 69 69 64 20    AND    CI.iid 
d230: 3d 20 42 58 2e 62 69 64 20 20 20 20 20 20 2d 2d  = BX.bid      --
d240: 20 53 65 6c 65 63 74 20 61 6c 6c 20 63 68 61 6e   Select all chan
d250: 67 65 73 65 74 73 0a 20 20 20 20 20 20 20 20 20  gesets.         
d260: 20 20 20 41 4e 44 20 20 20 20 43 2e 63 69 64 20     AND    C.cid 
d270: 3d 20 43 49 2e 63 69 64 09 2d 2d 20 63 6f 6e 74  = CI.cid.-- cont
d280: 61 69 6e 69 6e 67 20 74 68 65 20 73 75 62 6f 72  aining the subor
d290: 64 69 6e 61 74 65 20 62 72 61 6e 63 68 65 73 0a  dinate branches.
d2a0: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
d2b0: 20 20 20 43 2e 74 79 70 65 20 3d 20 32 09 09 2d     C.type = 2..-
d2c0: 2d 20 77 68 69 63 68 20 61 72 65 20 62 72 61 6e  - which are bran
d2d0: 63 68 20 63 68 61 6e 67 65 73 65 74 73 0a 20 20  ch changesets.  
d2e0: 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 53 45 4c    UNION..    SEL
d2f0: 45 43 54 20 43 2e 63 69 64 0a 09 20 20 20 20 46  ECT C.cid..    F
d300: 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c 20  ROM   branch B, 
d310: 70 72 65 66 65 72 65 64 70 61 72 65 6e 74 20 50  preferedparent P
d320: 2c 20 74 61 67 20 54 2c 20 63 73 69 74 65 6d 20  , tag T, csitem 
d330: 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43 0a  CI, changeset C.
d340: 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69  .    WHERE  B.bi
d350: 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20  d IN $theset    
d360: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
d370: 62 72 61 6e 63 68 65 73 20 6f 66 20 69 6e 74 65  branches of inte
d380: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
d390: 20 42 2e 73 69 64 20 3d 20 50 2e 70 69 64 09 2d   B.sid = P.pid.-
d3a0: 2d 20 47 65 74 20 73 75 62 6f 72 64 69 6e 61 74  - Get subordinat
d3b0: 65 20 74 61 67 73 20 76 69 61 20 74 68 65 0a 09  e tags via the..
d3c0: 20 20 20 20 41 4e 44 20 20 20 20 54 2e 73 69 64      AND    T.sid
d3d0: 20 3d 20 50 2e 73 69 64 09 2d 2d 20 70 72 65 66   = P.sid.-- pref
d3e0: 65 72 65 64 20 70 61 72 65 6e 74 73 20 6f 66 20  ered parents of 
d3f0: 74 68 65 69 72 20 73 79 6d 62 6f 6c 73 0a 20 20  their symbols.  
d400: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20            AND   
d410: 20 43 49 2e 69 69 64 20 3d 20 54 2e 74 69 64 20   CI.iid = T.tid 
d420: 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20        -- Select 
d430: 61 6c 6c 20 63 68 61 6e 67 65 73 65 74 73 0a 20  all changesets. 
d440: 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20             AND  
d450: 20 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69 64    C.cid = CI.cid
d460: 09 2d 2d 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  .-- containing t
d470: 68 65 20 73 75 62 6f 72 64 69 6e 61 74 65 20 74  he subordinate t
d480: 61 67 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  ags.            
d490: 41 4e 44 20 20 20 20 43 2e 74 79 70 65 20 3d 20  AND    C.type = 
d4a0: 31 09 09 2d 2d 20 77 68 69 63 68 20 61 72 65 20  1..-- which are 
d4b0: 74 61 67 20 63 68 61 6e 67 65 73 65 74 73 0a 09  tag changesets..
d4c0: 7d 5d 5d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  }]]..return.    
d4d0: 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20  }..    # result 
d4e0: 3d 20 73 79 6d 62 6f 6c 20 6e 61 6d 65 0a 20 20  = symbol name.  
d4f0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 63 73 5f    typemethod cs_
d500: 6c 6f 64 20 7b 62 72 61 6e 63 68 65 73 7d 20 7b  lod {branches} {
d510: 0a 09 23 20 44 65 74 65 72 6d 69 6e 65 73 20 74  ..# Determines t
d520: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73  he name of the s
d530: 79 6d 62 6f 6c 20 77 68 69 63 68 20 69 73 20 74  ymbol which is t
d540: 68 65 20 6c 69 6e 65 20 6f 66 0a 09 23 20 64 65  he line of..# de
d550: 76 65 6c 6f 70 6d 65 6e 74 20 66 6f 72 20 74 68  velopment for th
d560: 65 20 62 72 61 6e 63 68 65 73 20 69 6e 20 61 20  e branches in a 
d570: 63 68 61 6e 67 65 73 65 74 2e 0a 0a 09 73 65 74  changeset....set
d580: 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20   theset ('[join 
d590: 24 62 72 61 6e 63 68 65 73 20 7b 27 2c 27 7d 5d  $branches {','}]
d5a0: 27 29 0a 09 72 65 74 75 72 6e 20 5b 73 74 61 74  ')..return [stat
d5b0: 65 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f  e run [subst -no
d5c0: 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b  commands -noback
d5d0: 73 6c 61 73 68 65 73 20 7b 0a 09 20 20 20 20 53  slashes {..    S
d5e0: 45 4c 45 43 54 0a 09 20 20 20 20 44 49 53 54 49  ELECT..    DISTI
d5f0: 4e 43 54 20 4c 2e 6e 61 6d 65 0a 09 20 20 20 20  NCT L.name..    
d600: 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c  FROM   branch B,
d610: 20 73 79 6d 62 6f 6c 20 4c 0a 09 20 20 20 20 57   symbol L..    W
d620: 48 45 52 45 20 20 42 2e 62 69 64 20 69 6e 20 24  HERE  B.bid in $
d630: 74 68 65 73 65 74 20 20 20 20 20 20 20 20 2d 2d  theset        --
d640: 20 52 65 73 74 72 69 63 74 20 74 6f 20 62 72 61   Restrict to bra
d650: 6e 63 68 65 73 20 6f 66 20 69 6e 74 65 72 65 73  nches of interes
d660: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 4c 2e  t..    AND    L.
d670: 73 69 64 20 3d 20 42 2e 6c 6f 64 20 20 20 20 20  sid = B.lod     
d680: 20 20 20 20 20 20 2d 2d 20 47 65 74 20 6c 6f 64        -- Get lod
d690: 20 73 79 6d 62 6f 6c 20 6f 66 20 62 72 61 6e 63   symbol of branc
d6a0: 68 0a 09 7d 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20  h..}]].    }..  
d6b0: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 6c 69 6d    typemethod lim
d6c0: 69 74 73 20 7b 62 72 61 6e 63 68 65 73 7d 20 7b  its {branches} {
d6d0: 0a 09 23 20 4e 6f 74 65 73 2e 20 54 68 69 73 20  ..# Notes. This 
d6e0: 6d 65 74 68 6f 64 20 65 78 69 73 74 73 20 6f 6e  method exists on
d6f0: 6c 79 20 66 6f 72 20 62 72 61 6e 63 68 65 73 2e  ly for branches.
d700: 20 49 74 20 69 73 20 6e 65 65 64 65 64 20 74 6f   It is needed to
d710: 0a 09 23 20 67 65 74 20 64 65 74 61 69 6c 65 64  ..# get detailed
d720: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   information abo
d730: 75 74 20 61 20 62 61 63 6b 77 61 72 64 20 62 72  ut a backward br
d740: 61 6e 63 68 2e 20 49 74 20 64 6f 65 73 0a 09 23  anch. It does..#
d750: 20 6e 6f 74 20 61 70 70 6c 79 20 74 6f 20 74 61   not apply to ta
d760: 67 73 2c 20 6e 6f 72 20 72 65 76 69 73 69 6f 6e  gs, nor revision
d770: 73 2e 20 54 68 65 20 71 75 65 72 69 65 73 20 63  s. The queries c
d780: 61 6e 20 61 6c 73 6f 0a 09 23 20 72 65 73 74 72  an also..# restr
d790: 69 63 74 20 74 68 65 6d 73 65 6c 76 65 73 20 74  ict themselves t
d7a0: 6f 20 74 68 65 20 72 65 76 69 73 69 6f 6e 20 73  o the revision s
d7b0: 75 63 65 73 73 6f 72 73 2f 70 72 65 64 65 63 65  ucessors/predece
d7c0: 73 73 6f 72 73 0a 09 23 20 6f 66 20 62 72 61 6e  ssors..# of bran
d7d0: 63 68 65 73 2c 20 61 73 20 6f 6e 6c 79 20 74 68  ches, as only th
d7e0: 65 79 20 68 61 76 65 20 6f 72 64 65 72 69 6e 67  ey have ordering
d7f0: 20 64 61 74 61 20 61 6e 64 20 74 68 75 73 20 63   data and thus c
d800: 61 6e 0a 09 23 20 63 61 75 73 65 20 74 68 65 20  an..# cause the 
d810: 62 61 63 6b 77 61 72 64 6e 65 73 73 2e 0a 0a 09  backwardness....
d820: 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f  set theset ('[jo
d830: 69 6e 20 24 62 72 61 6e 63 68 65 73 20 7b 27 2c  in $branches {',
d840: 27 7d 5d 27 29 0a 0a 09 73 65 74 20 6d 61 78 70  '}]')...set maxp
d850: 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62   [state run [sub
d860: 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d  st -nocommands -
d870: 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a  nobackslashes {.
d880: 09 20 20 20 20 2d 2d 20 6d 61 78 69 6d 61 6c 20  .    -- maximal 
d890: 70 72 65 64 65 63 65 73 73 6f 72 20 70 6f 73 69  predecessor posi
d8a0: 74 69 6f 6e 20 70 65 72 20 62 72 61 6e 63 68 0a  tion per branch.
d8b0: 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62 69  .    SELECT B.bi
d8c0: 64 2c 20 4d 41 58 20 28 43 4f 2e 70 6f 73 29 0a  d, MAX (CO.pos).
d8d0: 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e  .    FROM   bran
d8e0: 63 68 20 42 2c 20 72 65 76 69 73 69 6f 6e 20 52  ch B, revision R
d8f0: 2c 20 63 73 69 74 65 6d 20 43 49 2c 20 63 68 61  , csitem CI, cha
d900: 6e 67 65 73 65 74 20 43 2c 20 63 73 6f 72 64 65  ngeset C, csorde
d910: 72 20 43 4f 0a 09 20 20 20 20 57 48 45 52 45 20  r CO..    WHERE 
d920: 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65   B.bid IN $these
d930: 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63  t     -- Restric
d940: 74 20 74 6f 20 62 72 61 6e 63 68 65 73 20 6f 66  t to branches of
d950: 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41   interest..    A
d960: 4e 44 20 20 20 20 42 2e 72 6f 6f 74 20 3d 20 52  ND    B.root = R
d970: 2e 72 69 64 20 20 20 20 20 20 20 2d 2d 20 47 65  .rid       -- Ge
d980: 74 20 62 72 61 6e 63 68 20 72 6f 6f 74 20 72 65  t branch root re
d990: 76 69 73 69 6f 6e 73 0a 09 20 20 20 20 41 4e 44  visions..    AND
d9a0: 20 20 20 20 43 49 2e 69 69 64 20 3d 20 52 2e 72      CI.iid = R.r
d9b0: 69 64 20 20 20 20 20 20 20 2d 2d 20 47 65 74 20  id       -- Get 
d9c0: 63 68 61 6e 67 65 73 65 74 73 20 63 6f 6e 74 61  changesets conta
d9d0: 69 6e 69 6e 67 20 74 68 65 0a 09 20 20 20 20 41  ining the..    A
d9e0: 4e 44 20 20 20 20 43 2e 63 69 64 20 3d 20 43 49  ND    C.cid = CI
d9f0: 2e 63 69 64 20 20 20 20 20 20 20 2d 2d 20 72 6f  .cid       -- ro
da00: 6f 74 20 72 65 76 69 73 69 6f 6e 73 2c 20 77 68  ot revisions, wh
da10: 69 63 68 20 61 72 65 0a 09 20 20 20 20 41 4e 44  ich are..    AND
da20: 20 20 20 20 43 2e 74 79 70 65 20 3d 20 30 20 20      C.type = 0  
da30: 20 20 20 20 20 20 20 20 20 2d 2d 20 72 65 76 69           -- revi
da40: 73 69 6f 6e 20 63 68 61 6e 67 65 73 65 74 73 0a  sion changesets.
da50: 09 20 20 20 20 41 4e 44 20 20 20 20 43 4f 2e 63  .    AND    CO.c
da60: 69 64 20 3d 20 43 2e 63 69 64 20 20 20 20 20 20  id = C.cid      
da70: 20 2d 2d 20 47 65 74 20 74 68 65 69 72 20 74 6f   -- Get their to
da80: 70 6f 6c 6f 67 69 63 61 6c 20 6f 72 64 65 72 69  pological orderi
da90: 6e 67 0a 09 20 20 20 20 47 52 4f 55 50 20 42 59  ng..    GROUP BY
daa0: 20 42 2e 62 69 64 0a 09 7d 5d 5d 0a 0a 09 73 65   B.bid..}]]...se
dab0: 74 20 6d 69 6e 73 20 5b 73 74 61 74 65 20 72 75  t mins [state ru
dac0: 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d  n [subst -nocomm
dad0: 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73  ands -nobackslas
dae0: 68 65 73 20 7b 0a 09 20 20 20 20 2d 2d 20 6d 69  hes {..    -- mi
daf0: 6e 69 6d 61 6c 20 73 75 63 63 65 73 73 6f 72 20  nimal successor 
db00: 70 6f 73 69 74 69 6f 6e 20 70 65 72 20 62 72 61  position per bra
db10: 6e 63 68 0a 09 20 20 20 20 53 45 4c 45 43 54 20  nch..    SELECT 
db20: 42 2e 62 69 64 2c 20 4d 49 4e 20 28 43 4f 2e 70  B.bid, MIN (CO.p
db30: 6f 73 29 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  os)..    FROM   
db40: 62 72 61 6e 63 68 20 42 2c 20 72 65 76 69 73 69  branch B, revisi
db50: 6f 6e 20 52 2c 20 63 73 69 74 65 6d 20 43 49 2c  on R, csitem CI,
db60: 20 63 68 61 6e 67 65 73 65 74 20 43 2c 20 63 73   changeset C, cs
db70: 6f 72 64 65 72 20 43 4f 0a 09 20 20 20 20 57 48  order CO..    WH
db80: 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74  ERE  B.bid IN $t
db90: 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73  heset     -- Res
dba0: 74 72 69 63 74 20 74 6f 20 62 72 61 6e 63 68 65  trict to branche
dbb0: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20  s of interest.. 
dbc0: 20 20 20 41 4e 44 20 20 20 20 42 2e 66 69 72 73     AND    B.firs
dbd0: 74 20 3d 20 52 2e 72 69 64 20 20 20 20 20 20 2d  t = R.rid      -
dbe0: 2d 20 47 65 74 20 74 68 65 20 66 69 72 73 74 20  - Get the first 
dbf0: 72 65 76 69 73 69 6f 6e 73 20 6f 6e 20 74 68 65  revisions on the
dc00: 20 62 72 61 6e 63 68 65 73 0a 09 20 20 20 20 41   branches..    A
dc10: 4e 44 20 20 20 20 43 49 2e 69 69 64 20 3d 20 52  ND    CI.iid = R
dc20: 2e 72 69 64 20 20 20 20 20 20 20 2d 2d 20 47 65  .rid       -- Ge
dc30: 74 20 63 68 61 6e 67 65 73 65 74 73 20 63 6f 6e  t changesets con
dc40: 74 61 69 6e 69 6e 67 20 74 68 65 0a 09 20 20 20  taining the..   
dc50: 20 41 4e 44 20 20 20 20 43 2e 63 69 64 20 3d 20   AND    C.cid = 
dc60: 43 49 2e 63 69 64 09 2d 2d 20 66 69 72 73 74 20  CI.cid.-- first 
dc70: 72 65 76 69 73 69 6f 6e 73 2c 20 77 68 69 63 68  revisions, which
dc80: 20 61 72 65 0a 09 20 20 20 20 41 4e 44 20 20 20   are..    AND   
dc90: 20 43 2e 74 79 70 65 20 3d 20 30 09 09 2d 2d 20   C.type = 0..-- 
dca0: 72 65 76 69 73 69 6f 6e 20 63 68 61 6e 67 65 73  revision changes
dcb0: 65 74 73 0a 09 20 20 20 20 41 4e 44 20 20 20 20  ets..    AND    
dcc0: 43 4f 2e 63 69 64 20 3d 20 43 2e 63 69 64 09 2d  CO.cid = C.cid.-
dcd0: 2d 20 47 65 74 20 74 68 65 69 72 20 74 6f 70 6f  - Get their topo
dce0: 6c 6f 67 69 63 61 6c 20 6f 72 64 65 72 69 6e 67  logical ordering
dcf0: 0a 09 20 20 20 20 47 52 4f 55 50 20 42 59 20 42  ..    GROUP BY B
dd00: 2e 62 69 64 0a 09 7d 5d 5d 0a 0a 20 20 20 20 20  .bid..}]]..     
dd10: 20 20 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20     return [list 
dd20: 24 6d 61 78 70 20 24 6d 69 6e 73 5d 0a 20 20 20  $maxp $mins].   
dd30: 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23   }..    # # ## #
dd40: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
dd50: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  # #############.
dd60: 20 20 20 20 23 23 20 43 6f 6e 66 69 67 75 72 61      ## Configura
dd70: 74 69 6f 6e 0a 0a 20 20 20 20 70 72 61 67 6d 61  tion..    pragma
dd80: 20 2d 68 61 73 69 6e 73 74 61 6e 63 65 73 20 20   -hasinstances  
dd90: 20 6e 6f 20 3b 20 23 20 73 69 6e 67 6c 65 74 6f   no ; # singleto
dda0: 6e 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61  n.    pragma -ha
ddb0: 73 74 79 70 65 69 6e 66 6f 20 20 20 20 6e 6f 20  stypeinfo    no 
ddc0: 3b 20 23 20 6e 6f 20 69 6e 74 72 6f 73 70 65 63  ; # no introspec
ddd0: 74 69 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61 20  tion.    pragma 
dde0: 2d 68 61 73 74 79 70 65 64 65 73 74 72 6f 79 20  -hastypedestroy 
ddf0: 6e 6f 20 3b 20 23 20 69 6d 6d 6f 72 74 61 6c 0a  no ; # immortal.
de00: 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23 23  }..# # ## ### ##
de10: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23  ### ######## ###
de20: 23 23 23 23 23 23 23 23 23 23 20 23 23 23 23 23  ########## #####
de30: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
de40: 0a 23 23 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65  .##..namespace e
de50: 76 61 6c 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c  val ::vc::fossil
de60: 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 70  ::import::cvs::p
de70: 72 6f 6a 65 63 74 20 7b 0a 20 20 20 20 6e 61 6d  roject {.    nam
de80: 65 73 70 61 63 65 20 65 78 70 6f 72 74 20 72 65  espace export re
de90: 76 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20  v.    namespace 
dea0: 65 76 61 6c 20 72 65 76 20 7b 0a 09 6e 61 6d 65  eval rev {..name
deb0: 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76  space import ::v
dec0: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72  c::fossil::impor
ded0: 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09 6e  t::cvs::state..n
dee0: 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20  amespace import 
def0: 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d  ::vc::fossil::im
df00: 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e 74 65 67  port::cvs::integ
df10: 72 69 74 79 0a 09 6e 61 6d 65 73 70 61 63 65 20  rity..namespace 
df20: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f  import ::vc::too
df30: 6c 73 3a 3a 6d 69 73 63 3a 3a 2a 0a 09 6e 61 6d  ls::misc::*..nam
df40: 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a  espace import ::
df50: 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 74 72 6f 75 62  vc::tools::troub
df60: 6c 65 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d  le..namespace im
df70: 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73  port ::vc::tools
df80: 3a 3a 6c 6f 67 0a 09 6c 6f 67 20 72 65 67 69 73  ::log..log regis
df90: 74 65 72 20 63 73 65 74 73 0a 0a 09 23 20 53 65  ter csets...# Se
dfa0: 74 20 75 70 20 74 68 65 20 68 65 6c 70 65 72 20  t up the helper 
dfb0: 73 69 6e 67 6c 65 74 6f 6e 73 0a 09 6e 61 6d 65  singletons..name
dfc0: 73 70 61 63 65 20 65 76 61 6c 20 72 65 76 20 7b  space eval rev {
dfd0: 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20  ..    namespace 
dfe0: 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73  import ::vc::fos
dff0: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73  sil::import::cvs
e000: 3a 3a 73 74 61 74 65 0a 09 20 20 20 20 6e 61 6d  ::state..    nam
e010: 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a  espace import ::
e020: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f  vc::fossil::impo
e030: 72 74 3a 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69  rt::cvs::integri
e040: 74 79 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63  ty..    namespac
e050: 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74  e import ::vc::t
e060: 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 7d 0a 09 6e 61  ools::log..}..na
e070: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 73 79 6d  mespace eval sym
e080: 3a 3a 74 61 67 20 7b 0a 09 20 20 20 20 6e 61 6d  ::tag {..    nam
e090: 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a  espace import ::
e0a0: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f  vc::fossil::impo
e0b0: 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a 09  rt::cvs::state..
e0c0: 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d      namespace im
e0d0: 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69  port ::vc::fossi
e0e0: 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a  l::import::cvs::
e0f0: 69 6e 74 65 67 72 69 74 79 0a 09 20 20 20 20 6e  integrity..    n
e100: 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20  amespace import 
e110: 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67  ::vc::tools::log
e120: 0a 09 7d 0a 09 6e 61 6d 65 73 70 61 63 65 20 65  ..}..namespace e
e130: 76 61 6c 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20  val sym::branch 
e140: 7b 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63 65  {..    namespace
e150: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f   import ::vc::fo
e160: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
e170: 73 3a 3a 73 74 61 74 65 0a 09 20 20 20 20 6e 61  s::state..    na
e180: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
e190: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70  :vc::fossil::imp
e1a0: 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e 74 65 67 72  ort::cvs::integr
e1b0: 69 74 79 0a 09 20 20 20 20 6e 61 6d 65 73 70 61  ity..    namespa
e1c0: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a  ce import ::vc::
e1d0: 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 7d 0a 20 20  tools::log..}.  
e1e0: 20 20 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23    }.}..# # ## ##
e1f0: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
e200: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 20 23   ############# #
e210: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
e220: 23 23 23 23 0a 23 23 20 52 65 61 64 79 0a 0a 70  ####.## Ready..p
e230: 61 63 6b 61 67 65 20 70 72 6f 76 69 64 65 20 76  ackage provide v
e240: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72  c::fossil::impor
e250: 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a  t::cvs::project:
e260: 3a 72 65 76 20 31 2e 30 0a 72 65 74 75 72 6e 0a  :rev 1.0.return.