Fossil

Hex Artifact Content
Login

Artifact b2c7314519b34cfc9be5d8a8a85dbf56f48caf84:


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 73 72 63 69 64 20 24 6d  _lod $mysrcid $m
0be0: 79 69 74 65 6d 73 5d 0a 20 20 20 20 7d 0a 0a 20  yitems].    }.. 
0bf0: 20 20 20 6d 65 74 68 6f 64 20 69 64 20 20 20 20     method id    
0c00: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 69  {} { return $myi
0c10: 64 20 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20 69  d }.    method i
0c20: 74 65 6d 73 20 7b 7d 20 7b 20 72 65 74 75 72 6e  tems {} { return
0c30: 20 24 6d 79 74 69 74 65 6d 73 20 7d 0a 20 20 20   $mytitems }.   
0c40: 20 6d 65 74 68 6f 64 20 64 61 74 61 20 20 7b 7d   method data  {}
0c50: 20 7b 20 72 65 74 75 72 6e 20 5b 6c 69 73 74 20   { return [list 
0c60: 24 6d 79 70 72 6f 6a 65 63 74 20 24 6d 79 74 79  $myproject $myty
0c70: 70 65 20 24 6d 79 73 72 63 69 64 5d 20 7d 0a 0a  pe $mysrcid] }..
0c80: 20 20 20 20 64 65 6c 65 67 61 74 65 20 6d 65 74      delegate met
0c90: 68 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 20 74  hod bysymbol   t
0ca0: 6f 20 6d 79 74 79 70 65 6f 62 6a 0a 20 20 20 20  o mytypeobj.    
0cb0: 64 65 6c 65 67 61 74 65 20 6d 65 74 68 6f 64 20  delegate method 
0cc0: 62 79 72 65 76 69 73 69 6f 6e 20 74 6f 20 6d 79  byrevision to my
0cd0: 74 79 70 65 6f 62 6a 0a 20 20 20 20 64 65 6c 65  typeobj.    dele
0ce0: 67 61 74 65 20 6d 65 74 68 6f 64 20 69 73 62 72  gate method isbr
0cf0: 61 6e 63 68 20 20 20 74 6f 20 6d 79 74 79 70 65  anch   to mytype
0d00: 6f 62 6a 0a 20 20 20 20 64 65 6c 65 67 61 74 65  obj.    delegate
0d10: 20 6d 65 74 68 6f 64 20 69 73 74 61 67 20 20 20   method istag   
0d20: 20 20 20 74 6f 20 6d 79 74 79 70 65 6f 62 6a 0a     to mytypeobj.
0d30: 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 65 74 70  .    method setp
0d40: 6f 73 20 7b 70 7d 20 7b 20 73 65 74 20 6d 79 70  os {p} { set myp
0d50: 6f 73 20 24 70 20 3b 20 72 65 74 75 72 6e 20 7d  os $p ; return }
0d60: 0a 20 20 20 20 6d 65 74 68 6f 64 20 70 6f 73 20  .    method pos 
0d70: 20 20 20 7b 7d 20 20 7b 20 72 65 74 75 72 6e 20     {}  { return 
0d80: 24 6d 79 70 6f 73 20 7d 0a 0a 20 20 20 20 6d 65  $mypos }..    me
0d90: 74 68 6f 64 20 64 65 74 65 72 6d 69 6e 65 73 75  thod determinesu
0da0: 63 63 65 73 73 6f 72 73 20 7b 7d 20 7b 0a 09 23  ccessors {} {..#
0db0: 20 50 61 73 73 20 36 20 6f 70 65 72 61 74 69 6f   Pass 6 operatio
0dc0: 6e 2e 20 43 6f 6d 70 75 74 65 20 70 72 6f 6a 65  n. Compute proje
0dd0: 63 74 2d 6c 65 76 65 6c 20 64 65 70 65 6e 64 65  ct-level depende
0de0: 6e 63 69 65 73 20 66 72 6f 6d 0a 09 23 20 74 68  ncies from..# th
0df0: 65 20 66 69 6c 65 2d 6c 65 76 65 6c 20 64 61 74  e file-level dat
0e00: 61 20 61 6e 64 20 73 61 76 65 20 69 74 20 62 61  a and save it ba
0e10: 63 6b 20 74 6f 20 74 68 65 20 73 74 61 74 65 2e  ck to the state.
0e20: 20 54 68 69 73 20 6d 61 79 0a 09 23 20 62 65 20   This may..# be 
0e30: 63 61 6c 6c 65 64 20 64 75 72 69 6e 67 20 74 68  called during th
0e40: 65 20 63 79 63 6c 65 20 62 72 65 61 6b 65 72 20  e cycle breaker 
0e50: 70 61 73 73 65 73 20 61 73 20 77 65 6c 6c 2c 20  passes as well, 
0e60: 74 6f 20 61 64 6a 75 73 74 0a 09 23 20 74 68 65  to adjust..# the
0e70: 20 73 75 63 63 65 73 73 6f 72 20 69 6e 66 6f 72   successor infor
0e80: 6d 61 74 69 6f 6e 20 6f 66 20 63 68 61 6e 67 65  mation of change
0e90: 73 65 74 73 20 77 68 69 63 68 20 61 72 65 20 74  sets which are t
0ea0: 68 65 0a 09 23 20 70 72 65 64 65 63 65 73 73 6f  he..# predecesso
0eb0: 72 73 20 6f 66 20 64 72 6f 70 70 65 64 20 63 68  rs of dropped ch
0ec0: 61 6e 67 65 73 65 74 73 2e 20 46 6f 72 20 74 68  angesets. For th
0ed0: 65 6d 20 77 65 20 68 61 76 65 20 74 6f 0a 09 23  em we have to..#
0ee0: 20 72 65 6d 6f 76 65 20 74 68 65 69 72 20 65 78   remove their ex
0ef0: 69 73 74 69 6e 67 20 69 6e 66 6f 72 6d 61 74 69  isting informati
0f00: 6f 6e 20 66 69 72 73 74 20 62 65 66 6f 72 65 20  on first before 
0f10: 69 6e 73 65 72 74 69 6e 67 20 74 68 65 0a 09 23  inserting the..#
0f20: 20 6e 65 77 20 64 61 74 61 2e 0a 09 73 74 61 74   new data...stat
0f30: 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 44 45 4c  e run {..    DEL
0f40: 45 54 45 20 46 52 4f 4d 20 63 73 73 75 63 63 65  ETE FROM cssucce
0f50: 73 73 6f 72 20 57 48 45 52 45 20 63 69 64 20 3d  ssor WHERE cid =
0f60: 20 24 6d 79 69 64 3b 0a 09 7d 0a 09 73 65 74 20   $myid;..}..set 
0f70: 6c 6f 6f 70 20 30 0a 09 23 20 54 4f 44 4f 3a 20  loop 0..# TODO: 
0f80: 43 68 65 63 6b 20 6f 74 68 65 72 20 75 73 65 73  Check other uses
0f90: 20 6f 66 20 63 73 5f 73 75 63 65 73 73 6f 72 73   of cs_sucessors
0fa0: 2e 0a 09 23 20 54 4f 44 4f 3a 20 43 6f 6e 73 69  ...# TODO: Consi
0fb0: 64 65 72 20 6d 65 72 67 69 6e 67 20 63 73 5f 73  der merging cs_s
0fc0: 75 63 65 73 73 6f 72 27 73 20 53 45 4c 45 43 54  ucessor's SELECT
0fd0: 20 77 69 74 68 20 74 68 65 20 49 4e 53 45 52 54   with the INSERT
0fe0: 20 68 65 72 65 2e 0a 09 66 6f 72 65 61 63 68 20   here...foreach 
0ff0: 6e 69 64 20 5b 24 6d 79 74 79 70 65 6f 62 6a 20  nid [$mytypeobj 
1000: 63 73 5f 73 75 63 63 65 73 73 6f 72 73 20 24 6d  cs_successors $m
1010: 79 69 74 65 6d 73 5d 20 7b 0a 09 20 20 20 20 73  yitems] {..    s
1020: 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 49 4e 53  tate run {...INS
1030: 45 52 54 20 49 4e 54 4f 20 63 73 73 75 63 63 65  ERT INTO cssucce
1040: 73 73 6f 72 20 28 63 69 64 2c 20 20 6e 69 64 29  ssor (cid,  nid)
1050: 0a 09 09 56 41 4c 55 45 53 20 20 20 20 20 20 20  ...VALUES       
1060: 20 20 20 20 20 20 20 20 20 20 20 28 24 6d 79 69             ($myi
1070: 64 2c 24 6e 69 64 29 0a 09 20 20 20 20 7d 0a 09  d,$nid)..    }..
1080: 20 20 20 20 69 66 20 7b 24 6e 69 64 20 3d 3d 20      if {$nid == 
1090: 24 6d 79 69 64 7d 20 7b 20 73 65 74 20 6c 6f 6f  $myid} { set loo
10a0: 70 20 31 20 7d 0a 09 7d 0a 09 23 20 52 65 70 6f  p 1 }..}..# Repo
10b0: 72 74 20 61 66 74 65 72 20 74 68 65 20 63 6f 6d  rt after the com
10c0: 70 6c 65 74 65 20 73 74 72 75 63 74 75 72 65 20  plete structure 
10d0: 68 61 73 20 62 65 65 6e 20 73 61 76 65 64 2e 0a  has been saved..
10e0: 09 69 66 20 7b 24 6c 6f 6f 70 7d 20 7b 20 24 73  .if {$loop} { $s
10f0: 65 6c 66 20 72 65 70 6f 72 74 6c 6f 6f 70 20 7d  elf reportloop }
1100: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
1110: 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20 6c      # result = l
1120: 69 73 74 20 28 63 68 61 6e 67 65 73 65 74 29 0a  ist (changeset).
1130: 20 20 20 20 6d 65 74 68 6f 64 20 73 75 63 63 65      method succe
1140: 73 73 6f 72 73 20 7b 7d 20 7b 0a 09 23 20 55 73  ssors {} {..# Us
1150: 65 20 74 68 65 20 64 61 74 61 20 73 61 76 65 64  e the data saved
1160: 20 62 79 20 70 61 73 73 20 36 2e 0a 09 72 65 74   by pass 6...ret
1170: 75 72 6e 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73  urn [struct::lis
1180: 74 20 6d 61 70 20 5b 73 74 61 74 65 20 72 75 6e  t map [state run
1190: 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 53   {..    SELECT S
11a0: 2e 6e 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20  .nid..    FROM  
11b0: 20 63 73 73 75 63 63 65 73 73 6f 72 20 53 0a 09   cssuccessor S..
11c0: 20 20 20 20 57 48 45 52 45 20 20 53 2e 63 69 64      WHERE  S.cid
11d0: 20 3d 20 24 6d 79 69 64 0a 09 7d 5d 20 5b 6d 79   = $myid..}] [my
11e0: 74 79 70 65 6d 65 74 68 6f 64 20 6f 66 5d 5d 0a  typemethod of]].
11f0: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 69 74 65      }..    # ite
1200: 6d 20 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29  m -> list (item)
1210: 0a 20 20 20 20 6d 65 74 68 6f 64 20 6e 65 78 74  .    method next
1220: 6d 61 70 20 7b 7d 20 7b 0a 09 24 6d 79 74 79 70  map {} {..$mytyp
1230: 65 6f 62 6a 20 73 75 63 63 65 73 73 6f 72 73 20  eobj successors 
1240: 74 6d 70 20 24 6d 79 69 74 65 6d 73 0a 09 72 65  tmp $myitems..re
1250: 74 75 72 6e 20 5b 61 72 72 61 79 20 67 65 74 20  turn [array get 
1260: 74 6d 70 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  tmp].    }..    
1270: 6d 65 74 68 6f 64 20 62 72 65 61 6b 69 6e 74 65  method breakinte
1280: 72 6e 61 6c 64 65 70 65 6e 64 65 6e 63 69 65 73  rnaldependencies
1290: 20 7b 63 76 7d 20 7b 0a 09 75 70 76 61 72 20 31   {cv} {..upvar 1
12a0: 20 24 63 76 20 63 6f 75 6e 74 65 72 0a 09 6c 6f   $cv counter..lo
12b0: 67 20 77 72 69 74 65 20 31 34 20 63 73 65 74 73  g write 14 csets
12c0: 20 7b 5b 24 73 65 6c 66 20 73 74 72 5d 20 42 49   {[$self str] BI
12d0: 44 7d 0a 09 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d  D}..vc::tools::m
12e0: 65 6d 3a 3a 6d 61 72 6b 0a 0a 09 23 20 54 68 69  em::mark...# Thi
12f0: 73 20 6d 65 74 68 6f 64 20 69 6e 73 70 65 63 74  s method inspect
1300: 73 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c  s the changeset,
1310: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 69 6e 74   looking for int
1320: 65 72 6e 61 6c 0a 09 23 20 64 65 70 65 6e 64 65  ernal..# depende
1330: 6e 63 69 65 73 2e 20 4e 6f 74 68 69 6e 67 20 69  ncies. Nothing i
1340: 73 20 64 6f 6e 65 20 69 66 20 74 68 65 72 65 20  s done if there 
1350: 61 72 65 20 6e 6f 20 73 75 63 68 2e 0a 0a 09 23  are no such....#
1360: 20 4f 74 68 65 72 77 69 73 65 20 74 68 65 20 63   Otherwise the c
1370: 68 61 6e 67 65 73 65 74 20 69 73 20 73 70 6c 69  hangeset is spli
1380: 74 20 69 6e 74 6f 20 61 20 73 65 74 20 6f 66 20  t into a set of 
1390: 66 72 61 67 6d 65 6e 74 73 0a 09 23 20 77 68 69  fragments..# whi
13a0: 63 68 20 68 61 76 65 20 6e 6f 20 69 6e 74 65 72  ch have no inter
13b0: 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73  nal dependencies
13c0: 2c 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20 74  , transforming t
13d0: 68 65 0a 09 23 20 69 6e 74 65 72 6e 61 6c 20 64  he..# internal d
13e0: 65 70 65 6e 64 65 6e 63 69 65 73 20 69 6e 74 6f  ependencies into
13f0: 20 65 78 74 65 72 6e 61 6c 20 6f 6e 65 73 2e 20   external ones. 
1400: 54 68 65 20 6e 65 77 20 63 68 61 6e 67 65 73 65  The new changese
1410: 74 73 0a 09 23 20 67 65 6e 65 72 61 74 65 64 20  ts..# generated 
1420: 66 72 6f 6d 20 74 68 65 20 66 72 61 67 6d 65 6e  from the fragmen
1430: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 72  t information ar
1440: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 0a 09  e added to the..
1450: 23 20 6c 69 73 74 20 6f 66 20 61 6c 6c 20 63 68  # list of all ch
1460: 61 6e 67 65 73 65 74 73 20 28 62 79 20 74 68 65  angesets (by the
1470: 20 63 61 6c 6c 65 72 29 2e 0a 0a 09 23 20 54 68   caller)....# Th
1480: 65 20 63 6f 64 65 20 63 68 65 63 6b 73 20 6f 6e  e code checks on
1490: 6c 79 20 73 75 63 63 65 73 73 6f 72 20 64 65 70  ly successor dep
14a0: 65 6e 64 65 6e 63 69 65 73 2c 20 61 73 20 74 68  endencies, as th
14b0: 69 73 20 61 75 74 6f 2d 0a 09 23 20 6d 61 74 69  is auto-..# mati
14c0: 63 61 6c 6c 79 20 63 6f 76 65 72 73 20 74 68 65  cally covers the
14d0: 20 70 72 65 64 65 63 65 73 73 6f 72 20 64 65 70   predecessor dep
14e0: 65 6e 64 65 6e 63 69 65 73 20 61 73 20 77 65 6c  endencies as wel
14f0: 6c 20 28 41 6e 79 0a 09 23 20 73 75 63 63 65 73  l (Any..# succes
1500: 73 6f 72 20 64 65 70 65 6e 64 65 6e 63 79 20 61  sor dependency a
1510: 20 2d 3e 20 62 20 69 73 20 61 6c 73 6f 20 61 20   -> b is also a 
1520: 70 72 65 64 65 63 65 73 73 6f 72 20 64 65 70 65  predecessor depe
1530: 6e 64 65 6e 63 79 0a 09 23 20 62 20 2d 3e 20 61  ndency..# b -> a
1540: 29 2e 0a 0a 09 61 72 72 61 79 20 73 65 74 20 62  )....array set b
1550: 72 65 61 6b 73 20 7b 7d 0a 0a 09 73 65 74 20 66  reaks {}...set f
1560: 72 61 67 6d 65 6e 74 73 20 5b 42 72 65 61 6b 44  ragments [BreakD
1570: 69 72 65 63 74 44 65 70 65 6e 64 65 6e 63 69 65  irectDependencie
1580: 73 20 24 6d 79 69 74 65 6d 73 20 62 72 65 61 6b  s $myitems break
1590: 73 5d 0a 0a 09 69 66 20 7b 21 5b 6c 6c 65 6e 67  s]...if {![lleng
15a0: 74 68 20 24 66 72 61 67 6d 65 6e 74 73 5d 7d 20  th $fragments]} 
15b0: 7b 20 72 65 74 75 72 6e 20 7b 7d 20 7d 0a 0a 09  { return {} }...
15c0: 72 65 74 75 72 6e 20 5b 24 73 65 6c 66 20 43 72  return [$self Cr
15d0: 65 61 74 65 46 72 6f 6d 46 72 61 67 6d 65 6e 74  eateFromFragment
15e0: 73 20 24 66 72 61 67 6d 65 6e 74 73 20 63 6f 75  s $fragments cou
15f0: 6e 74 65 72 20 62 72 65 61 6b 73 5d 0a 20 20 20  nter breaks].   
1600: 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 70   }..    method p
1610: 65 72 73 69 73 74 20 7b 7d 20 7b 0a 09 73 65 74  ersist {} {..set
1620: 20 74 69 64 20 24 6d 79 63 73 74 79 70 65 28 24   tid $mycstype($
1630: 6d 79 74 79 70 65 29 0a 09 73 65 74 20 70 69 64  mytype)..set pid
1640: 20 5b 24 6d 79 70 72 6f 6a 65 63 74 20 69 64 5d   [$myproject id]
1650: 0a 09 73 65 74 20 70 6f 73 20 30 0a 0a 09 73 74  ..set pos 0...st
1660: 61 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20  ate transaction 
1670: 7b 0a 09 20 20 20 20 73 74 61 74 65 20 72 75 6e  {..    state run
1680: 20 7b 0a 09 09 49 4e 53 45 52 54 20 49 4e 54 4f   {...INSERT INTO
1690: 20 63 68 61 6e 67 65 73 65 74 20 28 63 69 64 2c   changeset (cid,
16a0: 20 20 20 70 69 64 2c 20 20 74 79 70 65 2c 20 73     pid,  type, s
16b0: 72 63 29 0a 09 09 56 41 4c 55 45 53 20 20 20 20  rc)...VALUES    
16c0: 20 20 20 20 20 20 20 20 20 20 20 20 28 24 6d 79              ($my
16d0: 69 64 2c 20 24 70 69 64 2c 20 24 74 69 64 2c 20  id, $pid, $tid, 
16e0: 24 6d 79 73 72 63 69 64 29 3b 0a 09 20 20 20 20  $mysrcid);..    
16f0: 7d 0a 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20  }...    foreach 
1700: 69 69 64 20 24 6d 79 69 74 65 6d 73 20 7b 0a 09  iid $myitems {..
1710: 09 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 20  .state run {... 
1720: 20 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 63     INSERT INTO c
1730: 73 69 74 65 6d 20 28 63 69 64 2c 20 20 20 70 6f  sitem (cid,   po
1740: 73 2c 20 20 69 69 64 29 0a 09 09 20 20 20 20 56  s,  iid)...    V
1750: 41 4c 55 45 53 20 20 20 20 20 20 20 20 20 20 20  ALUES           
1760: 20 20 28 24 6d 79 69 64 2c 20 24 70 6f 73 2c 20    ($myid, $pos, 
1770: 24 69 69 64 29 3b 0a 09 09 7d 0a 09 09 69 6e 63  $iid);...}...inc
1780: 72 20 70 6f 73 0a 09 20 20 20 20 7d 0a 09 7d 0a  r pos..    }..}.
1790: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
17a0: 20 20 20 6d 65 74 68 6f 64 20 74 69 6d 65 72 61     method timera
17b0: 6e 67 65 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20  nge {} { return 
17c0: 5b 24 6d 79 74 79 70 65 6f 62 6a 20 74 69 6d 65  [$mytypeobj time
17d0: 72 61 6e 67 65 20 24 6d 79 69 74 65 6d 73 5d 20  range $myitems] 
17e0: 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 6c 69  }..    method li
17f0: 6d 69 74 73 20 7b 7d 20 7b 0a 09 73 74 72 75 63  mits {} {..struc
1800: 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b  t::list assign [
1810: 24 6d 79 74 79 70 65 6f 62 6a 20 6c 69 6d 69 74  $mytypeobj limit
1820: 73 20 24 6d 79 69 74 65 6d 73 5d 20 6d 61 78 70  s $myitems] maxp
1830: 20 6d 69 6e 73 0a 09 72 65 74 75 72 6e 20 5b 6c   mins..return [l
1840: 69 73 74 20 5b 54 61 67 49 74 65 6d 44 69 63 74  ist [TagItemDict
1850: 20 24 6d 61 78 70 20 24 6d 79 74 79 70 65 5d 20   $maxp $mytype] 
1860: 5b 54 61 67 49 74 65 6d 44 69 63 74 20 24 6d 69  [TagItemDict $mi
1870: 6e 73 20 24 6d 79 74 79 70 65 5d 5d 0a 20 20 20  ns $mytype]].   
1880: 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 64   }..    method d
1890: 72 6f 70 20 7b 7d 20 7b 0a 09 6c 6f 67 20 77 72  rop {} {..log wr
18a0: 69 74 65 20 38 20 63 73 65 74 73 20 7b 44 72 6f  ite 8 csets {Dro
18b0: 70 70 69 6e 67 20 24 73 65 6c 66 20 3d 20 5b 24  pping $self = [$
18c0: 73 65 6c 66 20 73 74 72 5d 7d 0a 0a 09 73 74 61  self str]}...sta
18d0: 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b  te transaction {
18e0: 0a 09 20 20 20 20 73 74 61 74 65 20 72 75 6e 20  ..    state run 
18f0: 7b 0a 09 09 44 45 4c 45 54 45 20 46 52 4f 4d 20  {...DELETE FROM 
1900: 63 68 61 6e 67 65 73 65 74 20 20 20 57 48 45 52  changeset   WHER
1910: 45 20 63 69 64 20 3d 20 24 6d 79 69 64 3b 0a 09  E cid = $myid;..
1920: 09 44 45 4c 45 54 45 20 46 52 4f 4d 20 63 73 69  .DELETE FROM csi
1930: 74 65 6d 20 20 20 20 20 20 57 48 45 52 45 20 63  tem      WHERE c
1940: 69 64 20 3d 20 24 6d 79 69 64 3b 0a 09 09 44 45  id = $myid;...DE
1950: 4c 45 54 45 20 46 52 4f 4d 20 63 73 73 75 63 63  LETE FROM cssucc
1960: 65 73 73 6f 72 20 57 48 45 52 45 20 63 69 64 20  essor WHERE cid 
1970: 3d 20 24 6d 79 69 64 3b 0a 09 20 20 20 20 7d 0a  = $myid;..    }.
1980: 09 7d 0a 0a 09 23 20 52 65 74 75 72 6e 20 74 68  .}...# Return th
1990: 65 20 6c 69 73 74 20 6f 66 20 70 72 65 64 65 63  e list of predec
19a0: 65 73 73 6f 72 73 20 73 6f 20 74 68 61 74 20 74  essors so that t
19b0: 68 65 79 20 63 61 6e 20 62 65 20 61 64 6a 75 73  hey can be adjus
19c0: 74 65 64 2e 0a 09 72 65 74 75 72 6e 20 5b 73 74  ted...return [st
19d0: 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20 5b  ruct::list map [
19e0: 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20  state run {..   
19f0: 20 53 45 4c 45 43 54 20 63 69 64 0a 09 20 20 20   SELECT cid..   
1a00: 20 46 52 4f 4d 20 20 20 63 73 73 75 63 63 65 73   FROM   cssucces
1a10: 73 6f 72 0a 09 20 20 20 20 57 48 45 52 45 20 20  sor..    WHERE  
1a20: 6e 69 64 20 3d 20 24 6d 79 69 64 0a 09 7d 5d 20  nid = $myid..}] 
1a30: 5b 6d 79 74 79 70 65 6d 65 74 68 6f 64 20 6f 66  [mytypemethod of
1a40: 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65  ]].    }..    me
1a50: 74 68 6f 64 20 72 65 70 6f 72 74 6c 6f 6f 70 20  thod reportloop 
1a60: 7b 7b 6b 69 6c 6c 20 31 7d 7d 20 7b 0a 09 23 20  {{kill 1}} {..# 
1a70: 57 65 20 70 72 69 6e 74 20 74 68 65 20 69 74 65  We print the ite
1a80: 6d 73 20 77 68 69 63 68 20 61 72 65 20 70 72 6f  ms which are pro
1a90: 64 75 63 69 6e 67 20 74 68 65 20 6c 6f 6f 70 2c  ducing the loop,
1aa0: 20 61 6e 64 20 68 6f 77 2e 0a 0a 09 73 65 74 20   and how....set 
1ab0: 68 64 72 20 22 53 65 6c 66 2d 72 65 66 65 72 65  hdr "Self-refere
1ac0: 6e 74 69 61 6c 20 63 68 61 6e 67 65 73 65 74 20  ntial changeset 
1ad0: 5b 24 73 65 6c 66 20 73 74 72 5d 20 5f 5f 5f 5f  [$self str] ____
1ae0: 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 5f 22 0a  ______________".
1af0: 09 73 65 74 20 66 74 72 20 5b 72 65 67 73 75 62  .set ftr [regsub
1b00: 20 2d 61 6c 6c 20 7b 5b 5e 20 09 5d 7d 20 24 68   -all {[^ .]} $h
1b10: 64 72 20 7b 5f 7d 5d 0a 0a 09 6c 6f 67 20 77 72  dr {_}]...log wr
1b20: 69 74 65 20 30 20 63 73 65 74 73 20 24 68 64 72  ite 0 csets $hdr
1b30: 0a 09 66 6f 72 65 61 63 68 20 7b 69 74 65 6d 20  ..foreach {item 
1b40: 6e 65 78 74 69 74 65 6d 7d 20 5b 24 6d 79 74 79  nextitem} [$myty
1b50: 70 65 6f 62 6a 20 6c 6f 6f 70 73 20 24 6d 79 69  peobj loops $myi
1b60: 74 65 6d 73 5d 20 7b 0a 09 20 20 20 20 23 20 43  tems] {..    # C
1b70: 72 65 61 74 65 20 74 61 67 67 65 64 20 69 74 65  reate tagged ite
1b80: 6d 73 20 66 72 6f 6d 20 74 68 65 20 69 64 20 61  ms from the id a
1b90: 6e 64 20 6f 75 72 20 74 79 70 65 2e 0a 09 20 20  nd our type...  
1ba0: 20 20 73 65 74 20 69 74 65 6d 20 20 20 20 20 5b    set item     [
1bb0: 6c 69 73 74 20 24 6d 79 74 79 70 65 20 20 24 69  list $mytype  $i
1bc0: 74 65 6d 5d 0a 09 20 20 20 20 73 65 74 20 6e 65  tem]..    set ne
1bd0: 78 74 69 74 65 6d 20 5b 6c 69 73 74 20 24 6d 79  xtitem [list $my
1be0: 74 79 70 65 20 24 6e 65 78 74 69 74 65 6d 5d 0a  type $nextitem].
1bf0: 09 20 20 20 20 23 20 50 72 69 6e 74 61 62 6c 65  .    # Printable
1c00: 20 6c 61 62 65 6c 73 2e 0a 09 20 20 20 20 73 65   labels...    se
1c10: 74 20 69 20 20 22 3c 5b 24 74 79 70 65 20 69 74  t i  "<[$type it
1c20: 65 6d 73 74 72 20 24 69 74 65 6d 5d 3e 22 0a 09  emstr $item]>"..
1c30: 20 20 20 20 73 65 74 20 6e 20 20 22 3c 5b 24 74      set n  "<[$t
1c40: 79 70 65 20 69 74 65 6d 73 74 72 20 24 6e 65 78  ype itemstr $nex
1c50: 74 69 74 65 6d 5d 3e 22 0a 09 20 20 20 20 73 65  titem]>"..    se
1c60: 74 20 6e 63 73 20 24 6d 79 69 74 65 6d 6d 61 70  t ncs $myitemmap
1c70: 28 24 6e 65 78 74 69 74 65 6d 29 0a 09 20 20 20  ($nextitem)..   
1c80: 20 23 20 50 72 69 6e 74 0a 09 20 20 20 20 6c 6f   # Print..    lo
1c90: 67 20 77 72 69 74 65 20 30 20 63 73 65 74 73 20  g write 0 csets 
1ca0: 7b 2a 20 24 69 20 2d 2d 3e 20 24 6e 20 2d 2d 3e  {* $i --> $n -->
1cb0: 20 63 73 20 5b 24 6e 63 73 20 73 74 72 5d 7d 0a   cs [$ncs str]}.
1cc0: 09 7d 0a 09 6c 6f 67 20 77 72 69 74 65 20 30 20  .}..log write 0 
1cd0: 63 73 65 74 73 20 24 66 74 72 0a 0a 09 69 66 20  csets $ftr...if 
1ce0: 7b 21 24 6b 69 6c 6c 7d 20 72 65 74 75 72 6e 0a  {!$kill} return.
1cf0: 09 74 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61  .trouble interna
1d00: 6c 20 22 5b 24 73 65 6c 66 20 73 74 72 5d 20 64  l "[$self str] d
1d10: 65 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66  epends on itself
1d20: 22 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  "..return.    }.
1d30: 0a 20 20 20 20 6d 65 74 68 6f 64 20 70 75 73 68  .    method push
1d40: 74 6f 20 7b 72 65 70 6f 73 69 74 6f 72 79 20 64  to {repository d
1d50: 61 74 65 20 72 73 74 61 74 65 7d 20 7b 0a 09 23  ate rstate} {..#
1d60: 20 47 65 6e 65 72 61 74 65 20 61 6e 64 20 69 6d   Generate and im
1d70: 70 6f 72 74 20 74 68 65 20 6d 61 6e 69 66 65 73  port the manifes
1d80: 74 20 66 6f 72 20 74 68 69 73 20 63 68 61 6e 67  t for this chang
1d90: 65 73 65 74 2e 0a 09 23 0a 09 23 20 44 61 74 61  eset...#..# Data
1da0: 20 6e 65 65 64 65 64 3a 0a 09 23 20 2d 20 43 6f   needed:..# - Co
1db0: 6d 6d 69 74 20 6d 65 73 73 61 67 65 20 20 20 20  mmit message    
1dc0: 20 20 20 20 20 20 20 20 20 20 20 28 2d 2d 20 6d             (-- m
1dd0: 79 73 72 63 69 64 20 2d 3e 20 72 65 70 6f 73 69  ysrcid -> reposi
1de0: 74 6f 72 79 20 6d 65 74 61 29 0a 09 23 20 2d 20  tory meta)..# - 
1df0: 55 73 65 72 20 64 6f 69 6e 67 20 74 68 65 20 63  User doing the c
1e00: 6f 6d 6d 69 74 20 20 20 20 20 20 20 20 28 73 2e  ommit        (s.
1e10: 61 2e 29 0a 09 23 0a 09 23 20 2d 20 54 69 6d 65  a.)..#..# - Time
1e20: 73 74 61 6d 70 20 6f 66 20 77 68 65 6e 20 63 6f  stamp of when co
1e30: 6d 6d 69 74 74 65 64 20 20 28 63 6f 6d 6d 61 6e  mmitted  (comman
1e40: 64 20 61 72 67 75 6d 65 6e 74 29 0a 09 23 0a 09  d argument)..#..
1e50: 23 20 2d 20 54 68 65 20 70 61 72 65 6e 74 20 63  # - The parent c
1e60: 68 61 6e 67 65 73 65 74 2c 20 69 66 20 61 6e 79  hangeset, if any
1e70: 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e 6f  . If there is no
1e80: 20 70 61 72 65 6e 74 20 66 6f 73 73 69 6c 0a 09   parent fossil..
1e90: 23 20 20 20 77 69 6c 6c 20 75 73 65 20 74 68 65  #   will use the
1ea0: 20 65 6d 70 74 79 20 62 61 73 65 20 72 65 76 69   empty base revi
1eb0: 73 69 6f 6e 20 61 73 20 70 61 72 65 6e 74 2e 0a  sion as parent..
1ec0: 09 23 0a 09 23 20 2d 20 4c 69 73 74 20 6f 66 20  .#..# - List of 
1ed0: 74 68 65 20 66 69 6c 65 20 72 65 76 69 73 69 6f  the file revisio
1ee0: 6e 73 20 69 6e 20 74 68 65 20 63 68 61 6e 67 65  ns in the change
1ef0: 73 65 74 2e 0a 0a 09 23 20 57 65 20 64 65 72 69  set....# We deri
1f00: 76 65 20 74 68 65 20 6c 6f 64 20 69 6e 66 6f 72  ve the lod infor
1f10: 6d 61 74 69 6f 6e 20 64 69 72 65 63 74 6c 79 20  mation directly 
1f20: 66 72 6f 6d 20 74 68 65 20 72 65 76 69 73 69 6f  from the revisio
1f30: 6e 73 20 6f 66 0a 09 23 20 74 68 65 20 63 68 61  ns of..# the cha
1f40: 6e 67 65 73 65 74 2c 20 61 73 20 74 68 65 20 62  ngeset, as the b
1f50: 72 61 6e 63 68 20 70 61 72 74 20 6f 66 20 74 68  ranch part of th
1f60: 65 20 6d 65 74 61 20 64 61 74 61 20 28 73 2e 61  e meta data (s.a
1f70: 2e 29 20 69 73 0a 09 23 20 6f 75 74 64 61 74 65  .) is..# outdate
1f80: 64 20 73 69 6e 63 65 20 70 61 73 73 20 46 69 6c  d since pass Fil
1f90: 74 65 72 53 79 6d 62 6f 6c 73 2e 20 53 65 65 20  terSymbols. See 
1fa0: 74 68 65 20 6d 65 74 68 6f 64 20 27 72 75 6e 27  the method 'run'
1fb0: 20 69 6e 0a 09 23 20 66 69 6c 65 20 22 63 32 66   in..# file "c2f
1fc0: 5f 70 66 69 6c 74 65 72 73 79 6d 2e 74 63 6c 22  _pfiltersym.tcl"
1fd0: 20 66 6f 72 20 6d 6f 72 65 20 63 6f 6d 6d 65 6e   for more commen
1fe0: 74 61 72 79 20 6f 6e 20 74 68 69 73 2e 0a 0a 09  tary on this....
1ff0: 73 65 74 20 6c 6f 64 6e 61 6d 65 20 5b 24 73 65  set lodname [$se
2000: 6c 66 20 6c 6f 64 5d 0a 0a 09 6c 6f 67 20 77 72  lf lod]...log wr
2010: 69 74 65 20 32 20 63 73 65 74 73 20 7b 49 6d 70  ite 2 csets {Imp
2020: 6f 72 74 69 6e 67 20 63 68 61 6e 67 65 73 65 74  orting changeset
2030: 20 5b 24 73 65 6c 66 20 73 74 72 5d 20 6f 6e 20   [$self str] on 
2040: 24 6c 6f 64 6e 61 6d 65 7d 0a 0a 09 69 66 20 7b  $lodname}...if {
2050: 5b 24 6d 79 74 79 70 65 6f 62 6a 20 69 73 74 61  [$mytypeobj ista
2060: 67 5d 7d 20 7b 0a 09 20 20 20 20 23 20 48 61 6e  g]} {..    # Han
2070: 64 6c 65 20 74 61 67 73 2e 20 54 68 65 79 20 61  dle tags. They a
2080: 70 70 65 61 72 20 69 6d 6d 65 64 69 61 74 65 6c  ppear immediatel
2090: 79 20 61 66 74 65 72 20 74 68 65 20 72 65 76 69  y after the revi
20a0: 73 69 6f 6e 0a 09 20 20 20 20 23 20 74 68 65 79  sion..    # they
20b0: 20 61 72 65 20 61 74 74 61 63 68 65 64 20 74 6f   are attached to
20c0: 20 28 2a 29 2e 20 57 65 20 63 61 6e 20 61 73 73   (*). We can ass
20d0: 75 6d 65 20 74 68 61 74 20 74 68 65 0a 09 20 20  ume that the..  
20e0: 20 20 23 20 77 6f 72 6b 73 70 61 63 65 20 66 6f    # workspace fo
20f0: 72 20 74 68 65 20 72 65 6c 65 76 61 6e 74 20 6c  r the relevant l
2100: 69 6e 65 20 6f 66 20 64 65 76 65 6c 6f 70 6d 65  ine of developme
2110: 6e 74 0a 09 20 20 20 20 23 20 65 78 69 73 74 73  nt..    # exists
2120: 2e 20 57 65 20 72 65 74 72 69 65 76 65 20 69 74  . We retrieve it
2130: 2c 20 74 68 65 6e 20 74 68 65 20 75 75 69 64 20  , then the uuid 
2140: 6f 66 20 74 68 65 20 6c 61 73 74 0a 09 20 20 20  of the last..   
2150: 20 23 20 72 65 76 69 73 69 6f 6e 20 65 6e 74 65   # revision ente
2160: 72 65 64 20 69 6e 74 6f 20 69 74 2c 20 74 68 65  red into it, the
2170: 6e 20 74 61 67 20 74 68 69 73 20 72 65 76 69 73  n tag this revis
2180: 69 6f 6e 2e 0a 0a 09 20 20 20 20 23 20 28 2a 29  ion....    # (*)
2190: 20 49 6d 6d 65 64 69 61 74 65 6c 79 20 69 6e 20   Immediately in 
21a0: 74 65 72 6d 73 20 6f 66 20 74 68 65 20 72 65 6c  terms of the rel
21b0: 65 76 61 6e 74 20 6c 69 6e 65 20 6f 66 0a 09 20  evant line of.. 
21c0: 20 20 20 23 20 20 20 20 20 64 65 76 65 6c 6f 70     #     develop
21d0: 6d 65 6e 74 2e 20 52 65 76 69 73 69 6f 6e 73 20  ment. Revisions 
21e0: 6f 6e 20 6f 74 68 65 72 20 6c 69 6e 65 73 20 6d  on other lines m
21f0: 61 79 20 63 6f 6d 65 20 69 6e 0a 09 20 20 20 20  ay come in..    
2200: 23 20 20 20 20 20 62 65 74 77 65 65 6e 2c 20 62  #     between, b
2210: 75 74 20 74 68 65 79 20 64 6f 20 6e 6f 74 20 6d  ut they do not m
2220: 61 74 74 65 72 20 74 6f 20 74 68 61 74 2e 0a 0a  atter to that...
2230: 09 20 20 20 20 73 65 74 20 6c 77 73 20 20 5b 47  .    set lws  [G
2240: 65 74 77 6f 72 6b 73 70 61 63 65 20 24 72 73 74  etworkspace $rst
2250: 61 74 65 20 24 6c 6f 64 6e 61 6d 65 20 24 6d 79  ate $lodname $my
2260: 70 72 6f 6a 65 63 74 20 30 5d 0a 09 20 20 20 20  project 0]..    
2270: 73 65 74 20 75 75 69 64 20 5b 6c 69 6e 64 65 78  set uuid [lindex
2280: 20 5b 24 6c 77 73 20 67 65 74 69 64 5d 20 31 5d   [$lws getid] 1]
2290: 0a 0a 09 20 20 20 20 24 72 65 70 6f 73 69 74 6f  ...    $reposito
22a0: 72 79 20 74 61 67 20 24 75 75 69 64 20 5b 73 74  ry tag $uuid [st
22b0: 61 74 65 20 6f 6e 65 20 7b 0a 09 09 53 45 4c 45  ate one {...SELE
22c0: 43 54 20 53 2e 6e 61 6d 65 0a 09 09 46 52 4f 4d  CT S.name...FROM
22d0: 20 20 20 73 79 6d 62 6f 6c 20 53 0a 09 09 57 48     symbol S...WH
22e0: 45 52 45 20 20 53 2e 73 69 64 20 3d 20 24 6d 79  ERE  S.sid = $my
22f0: 73 72 63 69 64 0a 09 20 20 20 20 7d 5d 0a 0a 09  srcid..    }]...
2300: 7d 20 65 6c 73 65 69 66 20 7b 5b 24 6d 79 74 79  } elseif {[$myty
2310: 70 65 6f 62 6a 20 69 73 62 72 61 6e 63 68 5d 7d  peobj isbranch]}
2320: 20 7b 0a 0a 09 20 20 20 20 23 20 48 61 6e 64 6c   {...    # Handl
2330: 65 20 62 72 61 6e 63 68 65 73 2e 20 54 68 65 79  e branches. They
2340: 20 61 70 70 65 61 72 20 69 6d 6d 65 64 69 61 74   appear immediat
2350: 65 6c 79 20 61 66 74 65 72 20 74 68 65 0a 09 20  ely after the.. 
2360: 20 20 20 23 20 72 65 76 69 73 69 6f 6e 20 74 68     # revision th
2370: 65 79 20 61 72 65 20 73 70 61 77 6e 65 64 20 66  ey are spawned f
2380: 72 6f 6d 20 28 2a 29 2e 20 57 65 20 63 61 6e 20  rom (*). We can 
2390: 61 73 73 75 6d 65 20 74 68 61 74 0a 09 20 20 20  assume that..   
23a0: 20 23 20 74 68 65 20 77 6f 72 6b 73 70 61 63 65   # the workspace
23b0: 20 66 6f 72 20 74 68 65 20 72 65 6c 65 76 61 6e   for the relevan
23c0: 74 20 6c 69 6e 65 20 6f 66 20 64 65 76 65 6c 6f  t line of develo
23d0: 70 6d 65 6e 74 0a 09 20 20 20 20 23 20 65 78 69  pment..    # exi
23e0: 73 74 73 2e 0a 0a 09 20 20 20 20 23 20 57 65 20  sts....    # We 
23f0: 72 65 74 72 69 65 76 65 20 69 74 2c 20 74 68 65  retrieve it, the
2400: 6e 20 74 68 65 20 75 75 69 64 20 6f 66 20 74 68  n the uuid of th
2410: 65 20 6c 61 73 74 20 72 65 76 69 73 69 6f 6e 0a  e last revision.
2420: 09 20 20 20 20 23 20 65 6e 74 65 72 65 64 20 69  .    # entered i
2430: 6e 74 6f 20 69 74 2e 20 54 68 61 74 20 72 65 76  nto it. That rev
2440: 69 73 69 6f 6e 20 69 73 20 74 61 67 67 65 64 20  ision is tagged 
2450: 61 73 20 74 68 65 20 72 6f 6f 74 20 6f 66 0a 09  as the root of..
2460: 20 20 20 20 23 20 74 68 65 20 62 72 61 6e 63 68      # the branch
2470: 20 28 2a 2a 29 2e 20 41 20 6e 65 77 20 77 6f 72   (**). A new wor
2480: 6b 73 70 61 63 65 20 66 6f 72 20 74 68 65 20 62  kspace for the b
2490: 72 61 6e 63 68 20 69 73 0a 09 20 20 20 20 23 20  ranch is..    # 
24a0: 63 72 65 61 74 65 64 20 61 73 20 77 65 6c 6c 2c  created as well,
24b0: 20 66 6f 72 20 74 68 65 20 66 75 74 75 72 65 20   for the future 
24c0: 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 74 68 65  revisions of the
24d0: 20 6e 65 77 0a 09 20 20 20 20 23 20 6c 69 6e 65   new..    # line
24e0: 20 6f 66 20 64 65 76 65 6c 6f 70 6d 65 6e 74 2e   of development.
24f0: 0a 0a 09 20 20 20 20 23 20 41 6e 20 65 78 63 65  ...    # An exce
2500: 70 74 69 6f 6e 20 69 73 20 6d 61 64 65 20 6f 66  ption is made of
2510: 20 74 68 65 20 6e 6f 6e 2d 74 72 75 6e 6b 20 64   the non-trunk d
2520: 65 66 61 75 6c 74 20 62 72 61 6e 63 68 2c 0a 09  efault branch,..
2530: 20 20 20 20 23 20 61 6b 61 20 76 65 6e 64 6f 72      # aka vendor
2540: 20 62 72 61 6e 63 68 2e 20 54 68 69 73 20 6c 6f   branch. This lo
2550: 64 20 68 61 73 20 74 6f 20 68 61 76 65 20 61 20  d has to have a 
2560: 77 6f 72 6b 73 70 61 63 65 20 6e 6f 74 0a 09 20  workspace not.. 
2570: 20 20 20 23 20 69 6e 68 65 72 69 74 65 64 20 66     # inherited f
2580: 72 6f 6d 20 61 6e 79 74 68 69 6e 67 20 65 6c 73  rom anything els
2590: 65 2e 20 49 74 20 68 61 73 20 6e 6f 20 72 6f 6f  e. It has no roo
25a0: 74 20 65 69 74 68 65 72 2c 20 73 6f 0a 09 20 20  t either, so..  
25b0: 20 20 23 20 74 61 67 67 69 6e 67 20 69 73 20 6f    # tagging is o
25c0: 75 74 20 61 73 20 77 65 6c 6c 2e 0a 0a 09 20 20  ut as well....  
25d0: 20 20 23 20 28 2a 29 20 49 6d 6d 65 64 69 61 74    # (*) Immediat
25e0: 65 6c 79 20 69 6e 20 74 65 72 6d 73 20 6f 66 20  ely in terms of 
25f0: 74 68 65 20 72 65 6c 65 76 61 6e 74 20 6c 69 6e  the relevant lin
2600: 65 20 6f 66 0a 09 20 20 20 20 23 20 20 20 20 20  e of..    #     
2610: 64 65 76 65 6c 6f 70 6d 65 6e 74 2e 20 52 65 76  development. Rev
2620: 69 73 69 6f 6e 73 20 6f 6e 20 6f 74 68 65 72 20  isions on other 
2630: 6c 69 6e 65 73 20 6d 61 79 20 63 6f 6d 65 20 69  lines may come i
2640: 6e 0a 09 20 20 20 20 23 20 20 20 20 20 62 65 74  n..    #     bet
2650: 77 65 65 6e 2c 20 62 75 74 20 74 68 65 79 20 64  ween, but they d
2660: 6f 20 6e 6f 74 20 6d 61 74 74 65 72 20 74 6f 20  o not matter to 
2670: 74 68 61 74 2e 0a 0a 09 20 20 20 20 23 20 28 2a  that....    # (*
2680: 2a 29 20 54 61 67 67 69 6e 67 20 74 68 65 20 70  *) Tagging the p
2690: 61 72 65 6e 74 20 72 65 76 69 73 69 6f 6e 20 6f  arent revision o
26a0: 66 20 74 68 65 20 62 72 61 6e 63 68 20 61 73 20  f the branch as 
26b0: 69 74 73 0a 09 20 20 20 20 23 20 20 20 20 20 20  its..    #      
26c0: 72 6f 6f 74 20 69 73 20 64 6f 6e 65 20 74 6f 20  root is done to 
26d0: 6c 65 74 20 75 73 20 6b 6e 6f 77 20 61 62 6f 75  let us know abou
26e0: 74 20 74 68 65 20 65 78 69 73 74 65 6e 63 65 20  t the existence 
26f0: 6f 66 0a 09 20 20 20 20 23 20 20 20 20 20 20 74  of..    #      t
2700: 68 65 20 62 72 61 6e 63 68 20 65 76 65 6e 20 69  he branch even i
2710: 66 20 69 74 20 68 61 73 20 6e 6f 20 72 65 76 69  f it has no revi
2720: 73 69 6f 6e 73 20 63 6f 6d 6d 69 74 74 65 64 20  sions committed 
2730: 74 6f 0a 09 20 20 20 20 23 20 20 20 20 20 20 69  to..    #      i
2740: 74 2c 20 61 6e 64 20 74 68 75 73 20 6e 6f 20 72  t, and thus no r
2750: 65 67 75 6c 61 72 20 62 72 61 6e 63 68 20 74 61  egular branch ta
2760: 67 20 61 6e 79 77 68 65 72 65 20 65 6c 73 65 2e  g anywhere else.
2770: 0a 09 20 20 20 20 23 20 20 20 20 20 20 54 68 65  ..    #      The
2780: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 67   name of the tag
2790: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 66 6f 72   is the name for
27a0: 20 74 68 65 20 6c 6f 64 2c 20 77 69 74 68 0a 09   the lod, with..
27b0: 20 20 20 20 23 20 20 20 20 20 20 74 68 65 20 73      #      the s
27c0: 75 66 66 69 78 20 27 2d 72 6f 6f 74 27 20 61 70  uffix '-root' ap
27d0: 70 65 6e 64 65 64 20 74 6f 20 69 74 2e 0a 0a 09  pended to it....
27e0: 20 20 20 20 23 20 4c 4f 44 20 69 73 20 73 65 6c      # LOD is sel
27f0: 66 20 73 79 6d 62 6f 6c 20 6f 66 20 62 72 61 6e  f symbol of bran
2800: 63 68 2c 20 6e 6f 74 20 70 61 72 65 6e 74 0a 09  ch, not parent..
2810: 20 20 20 20 73 65 74 20 6c 6f 64 6e 61 6d 65 20      set lodname 
2820: 5b 73 74 61 74 65 20 6f 6e 65 20 7b 0a 09 09 53  [state one {...S
2830: 45 4c 45 43 54 20 53 2e 6e 61 6d 65 0a 09 09 46  ELECT S.name...F
2840: 52 4f 4d 20 20 20 73 79 6d 62 6f 6c 20 53 0a 09  ROM   symbol S..
2850: 09 57 48 45 52 45 20 20 53 2e 73 69 64 20 3d 20  .WHERE  S.sid = 
2860: 24 6d 79 73 72 63 69 64 0a 09 20 20 20 20 7d 5d  $mysrcid..    }]
2870: 0a 0a 09 20 20 20 20 69 66 20 7b 21 5b 24 72 73  ...    if {![$rs
2880: 74 61 74 65 20 68 61 73 20 3a 74 72 75 6e 6b 3a  tate has :trunk:
2890: 5d 7d 20 7b 0a 09 09 23 20 4e 6f 20 74 72 75 6e  ]} {...# No trun
28a0: 6b 20 69 6d 70 6c 69 65 73 20 64 65 66 61 75 6c  k implies defaul
28b0: 74 20 62 72 61 6e 63 68 2e 20 4a 75 73 74 20 63  t branch. Just c
28c0: 72 65 61 74 65 20 74 68 65 0a 09 09 23 20 70 72  reate the...# pr
28d0: 6f 70 65 72 20 77 6f 72 6b 73 70 61 63 65 2e 0a  oper workspace..
28e0: 09 09 47 65 74 77 6f 72 6b 73 70 61 63 65 20 24  ..Getworkspace $
28f0: 72 73 74 61 74 65 20 24 6c 6f 64 6e 61 6d 65 20  rstate $lodname 
2900: 24 6d 79 70 72 6f 6a 65 63 74 20 31 0a 09 20 20  $myproject 1..  
2910: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 23 20 4e    } else {...# N
2920: 6f 6e 2d 64 65 66 61 75 6c 74 20 62 72 61 6e 63  on-default branc
2930: 68 2e 20 4e 65 65 64 20 77 6f 72 6b 73 70 61 63  h. Need workspac
2940: 65 2c 20 61 6e 64 20 74 61 67 20 70 61 72 65 6e  e, and tag paren
2950: 74 0a 09 09 23 20 72 65 76 69 73 69 6f 6e 2e 0a  t...# revision..
2960: 0a 09 09 73 65 74 20 6c 77 73 20 5b 47 65 74 77  ...set lws [Getw
2970: 6f 72 6b 73 70 61 63 65 20 24 72 73 74 61 74 65  orkspace $rstate
2980: 20 24 6c 6f 64 6e 61 6d 65 20 24 6d 79 70 72 6f   $lodname $mypro
2990: 6a 65 63 74 20 30 5d 0a 09 09 73 65 74 20 75 75  ject 0]...set uu
29a0: 69 64 20 5b 6c 69 6e 64 65 78 20 5b 24 6c 77 73  id [lindex [$lws
29b0: 20 67 65 74 69 64 5d 20 31 5d 0a 0a 09 09 24 72   getid] 1]....$r
29c0: 65 70 6f 73 69 74 6f 72 79 20 74 61 67 20 24 75  epository tag $u
29d0: 75 69 64 20 24 7b 6c 6f 64 6e 61 6d 65 7d 2d 72  uid ${lodname}-r
29e0: 6f 6f 74 0a 09 20 20 20 20 7d 0a 09 7d 20 65 6c  oot..    }..} el
29f0: 73 65 20 7b 0a 09 20 20 20 20 23 20 52 65 76 69  se {..    # Revi
2a00: 73 69 6f 6e 20 63 68 61 6e 67 65 73 65 74 2e 0a  sion changeset..
2a10: 0a 09 20 20 20 20 73 74 72 75 63 74 3a 3a 6c 69  ..    struct::li
2a20: 73 74 20 61 73 73 69 67 6e 20 5b 24 6d 79 70 72  st assign [$mypr
2a30: 6f 6a 65 63 74 20 67 65 74 6d 65 74 61 20 24 6d  oject getmeta $m
2a40: 79 73 72 63 69 64 5d 20 5f 5f 20 5f 5f 20 75 73  ysrcid] __ __ us
2a50: 65 72 20 6d 65 73 73 61 67 65 0a 0a 09 20 20 20  er message...   
2a60: 20 23 20 50 65 72 66 6f 72 6d 20 74 68 65 20 69   # Perform the i
2a70: 6d 70 6f 72 74 2e 20 41 73 20 70 61 72 74 20 6f  mport. As part o
2a80: 66 20 74 68 61 74 20 77 65 20 64 65 74 65 72 6d  f that we determ
2a90: 69 6e 65 20 74 68 65 0a 09 20 20 20 20 23 20 70  ine the..    # p
2aa0: 61 72 65 6e 74 20 77 65 20 6e 65 65 64 2c 20 61  arent we need, a
2ab0: 6e 64 20 63 6f 6e 76 65 72 74 20 74 68 65 20 6c  nd convert the l
2ac0: 69 73 74 20 6f 66 20 69 74 65 6d 73 20 69 6e 20  ist of items in 
2ad0: 74 68 65 0a 09 20 20 20 20 23 20 63 68 61 6e 67  the..    # chang
2ae0: 65 73 65 74 20 69 6e 74 6f 20 75 75 69 64 73 20  eset into uuids 
2af0: 61 6e 64 20 70 72 69 6e 74 61 62 6c 65 20 64 61  and printable da
2b00: 74 61 2e 0a 0a 09 20 20 20 20 73 74 72 75 63 74  ta....    struct
2b10: 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5b 47  ::list assign [G
2b20: 65 74 69 73 64 65 66 61 75 6c 74 20 24 6d 79 69  etisdefault $myi
2b30: 74 65 6d 73 5d 20 5c 0a 09 09 69 73 64 65 66 61  tems] \...isdefa
2b40: 75 6c 74 20 6c 61 73 74 64 65 66 61 75 6c 74 6f  ult lastdefaulto
2b50: 6e 74 72 75 6e 6b 0a 0a 09 20 20 20 20 6c 6f 67  ntrunk...    log
2b60: 20 77 72 69 74 65 20 38 20 63 73 65 74 73 20 7b   write 8 csets {
2b70: 4c 4f 44 20 20 20 20 27 24 6c 6f 64 6e 61 6d 65  LOD    '$lodname
2b80: 27 7d 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74  '}..    log writ
2b90: 65 20 38 20 63 73 65 74 73 20 7b 20 64 65 66 3f  e 8 csets { def?
2ba0: 20 20 24 69 73 64 65 66 61 75 6c 74 7d 0a 09 20    $isdefault}.. 
2bb0: 20 20 20 6c 6f 67 20 77 72 69 74 65 20 38 20 63     log write 8 c
2bc0: 73 65 74 73 20 7b 20 6c 61 73 74 3f 20 24 6c 61  sets { last? $la
2bd0: 73 74 64 65 66 61 75 6c 74 6f 6e 74 72 75 6e 6b  stdefaultontrunk
2be0: 7d 0a 0a 09 20 20 20 20 73 65 74 20 6c 77 73 20  }...    set lws 
2bf0: 20 5b 47 65 74 77 6f 72 6b 73 70 61 63 65 20 20   [Getworkspace  
2c00: 20 20 24 72 73 74 61 74 65 20 24 6c 6f 64 6e 61    $rstate $lodna
2c10: 6d 65 20 24 6d 79 70 72 6f 6a 65 63 74 20 24 69  me $myproject $i
2c20: 73 64 65 66 61 75 6c 74 5d 0a 09 20 20 20 20 24  sdefault]..    $
2c30: 6c 77 73 20 61 64 64 20 5b 47 65 74 72 65 76 69  lws add [Getrevi
2c40: 73 69 6f 6e 69 6e 66 6f 20 24 6d 79 69 74 65 6d  sioninfo $myitem
2c50: 73 5d 0a 0a 09 20 20 20 20 73 74 72 75 63 74 3a  s]...    struct:
2c60: 3a 6c 69 73 74 20 61 73 73 69 67 6e 20 5c 0a 09  :list assign \..
2c70: 09 5b 24 72 65 70 6f 73 69 74 6f 72 79 20 69 6d  .[$repository im
2c80: 70 6f 72 74 72 65 76 69 73 69 6f 6e 20 5b 24 73  portrevision [$s
2c90: 65 6c 66 20 73 74 72 5d 20 5c 0a 09 09 20 20 20  elf str] \...   
2ca0: 20 20 24 75 73 65 72 20 24 6d 65 73 73 61 67 65    $user $message
2cb0: 20 24 64 61 74 65 20 5c 0a 09 09 20 20 20 20 20   $date \...     
2cc0: 5b 6c 69 6e 64 65 78 20 5b 24 6c 77 73 20 67 65  [lindex [$lws ge
2cd0: 74 69 64 5d 20 30 5d 20 5b 24 6c 77 73 20 67 65  tid] 0] [$lws ge
2ce0: 74 5d 5d 20 5c 0a 09 09 72 69 64 20 75 75 69 64  t]] \...rid uuid
2cf0: 0a 0a 09 20 20 20 20 69 66 20 7b 5b 24 6c 77 73  ...    if {[$lws
2d00: 20 74 69 63 6b 73 5d 20 3d 3d 20 31 7d 20 7b 0a   ticks] == 1} {.
2d10: 09 09 23 20 46 69 72 73 74 20 63 6f 6d 6d 69 74  ..# First commit
2d20: 20 6f 6e 20 74 68 69 73 20 6c 69 6e 65 20 6f 66   on this line of
2d30: 20 64 65 76 65 6c 6f 70 6d 65 6e 74 2e 20 53 65   development. Se
2d40: 74 20 6f 75 72 0a 09 09 23 20 6f 77 6e 20 6e 61  t our...# own na
2d50: 6d 65 20 61 73 20 61 20 70 72 6f 70 61 67 61 74  me as a propagat
2d60: 69 6e 67 20 74 61 67 2e 20 41 6e 64 20 69 66 20  ing tag. And if 
2d70: 74 68 65 20 4c 4f 44 20 68 61 73 20 61 0a 09 09  the LOD has a...
2d80: 23 20 70 61 72 65 6e 74 20 77 65 20 68 61 76 65  # parent we have
2d90: 20 74 6f 20 70 72 65 76 65 6e 74 20 74 68 65 20   to prevent the 
2da0: 70 72 6f 70 61 67 61 74 69 6f 6e 20 6f 66 20 74  propagation of t
2db0: 68 61 74 0a 09 09 23 20 74 61 67 20 69 6e 74 6f  hat...# tag into
2dc0: 20 74 68 69 73 20 6e 65 77 20 6c 69 6e 65 2e 0a   this new line..
2dd0: 0a 09 09 73 65 74 20 70 6c 77 73 20 5b 24 6c 77  ...set plws [$lw
2de0: 73 20 70 61 72 65 6e 74 5d 0a 09 09 69 66 20 7b  s parent]...if {
2df0: 24 70 6c 77 73 20 6e 65 20 22 22 7d 20 7b 0a 09  $plws ne ""} {..
2e00: 09 20 20 20 20 24 72 65 70 6f 73 69 74 6f 72 79  .    $repository
2e10: 20 62 72 61 6e 63 68 63 61 6e 63 65 6c 20 24 75   branchcancel $u
2e20: 75 69 64 20 5b 24 70 6c 77 73 20 6e 61 6d 65 5d  uid [$plws name]
2e30: 0a 09 09 7d 0a 09 09 24 72 65 70 6f 73 69 74 6f  ...}...$reposito
2e40: 72 79 20 62 72 61 6e 63 68 6d 61 72 6b 20 24 75  ry branchmark $u
2e50: 75 69 64 20 5b 24 6c 77 73 20 6e 61 6d 65 5d 0a  uid [$lws name].
2e60: 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 23 20 52  .    }...    # R
2e70: 65 6d 65 6d 62 65 72 20 74 68 65 20 69 6d 70 6f  emember the impo
2e80: 72 74 65 64 20 63 68 61 6e 67 65 73 65 74 20 69  rted changeset i
2e90: 6e 20 74 68 65 20 73 74 61 74 65 2c 20 75 6e 64  n the state, und
2ea0: 65 72 20 6f 75 72 0a 09 20 20 20 20 23 20 4c 4f  er our..    # LO
2eb0: 44 2e 20 41 6e 64 20 69 66 20 69 74 20 69 73 20  D. And if it is 
2ec0: 74 68 65 20 6c 61 73 74 20 74 72 75 6e 6b 20 63  the last trunk c
2ed0: 68 61 6e 67 65 73 65 74 20 6f 6e 20 74 68 65 20  hangeset on the 
2ee0: 76 65 6e 64 6f 72 0a 09 20 20 20 20 23 20 62 72  vendor..    # br
2ef0: 61 6e 63 68 20 74 68 65 6e 20 74 68 65 20 72 65  anch then the re
2f00: 76 69 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20 74  vision is also t
2f10: 68 65 20 61 63 74 75 61 6c 20 72 6f 6f 74 20 6f  he actual root o
2f20: 66 20 74 68 65 0a 09 20 20 20 20 23 20 3a 74 72  f the..    # :tr
2f30: 75 6e 6b 3a 2c 20 73 6f 20 77 65 20 72 65 6d 65  unk:, so we reme
2f40: 6d 62 65 72 20 69 74 20 61 73 20 73 75 63 68 20  mber it as such 
2f50: 69 6e 20 74 68 65 20 73 74 61 74 65 2e 20 48 6f  in the state. Ho
2f60: 77 65 76 65 72 0a 09 20 20 20 20 23 20 69 66 20  wever..    # if 
2f70: 74 68 65 20 74 72 75 6e 6b 20 61 6c 72 65 61 64  the trunk alread
2f80: 79 20 65 78 69 73 74 73 20 74 68 65 6e 20 74 68  y exists then th
2f90: 65 20 63 68 61 6e 67 65 73 65 74 20 63 61 6e 6e  e changeset cann
2fa0: 6f 74 20 62 65 0a 09 20 20 20 20 23 20 6f 6e 20  ot be..    # on 
2fb0: 69 74 20 61 6e 79 20 6d 6f 72 65 2e 20 54 68 69  it any more. Thi
2fc0: 73 20 69 6e 64 69 63 61 74 65 73 20 77 65 69 72  s indicates weir
2fd0: 64 6e 65 73 73 20 69 6e 20 74 68 65 20 73 65 74  dness in the set
2fe0: 75 70 20 6f 66 0a 09 20 20 20 20 23 20 74 68 65  up of..    # the
2ff0: 20 76 65 6e 64 6f 72 20 62 72 61 6e 63 68 2c 20   vendor branch, 
3000: 62 75 74 20 6f 6e 65 20 77 65 20 63 61 6e 20 77  but one we can w
3010: 6f 72 6b 20 61 72 6f 75 6e 64 2e 0a 0a 09 20 20  ork around....  
3020: 20 20 24 6c 77 73 20 64 65 66 69 64 20 5b 6c 69    $lws defid [li
3030: 73 74 20 24 72 69 64 20 24 75 75 69 64 5d 0a 09  st $rid $uuid]..
3040: 20 20 20 20 69 66 20 7b 24 6c 61 73 74 64 65 66      if {$lastdef
3050: 61 75 6c 74 6f 6e 74 72 75 6e 6b 7d 20 7b 0a 09  aultontrunk} {..
3060: 09 6c 6f 67 20 77 72 69 74 65 20 32 20 63 73 65  .log write 2 cse
3070: 74 73 20 7b 54 68 69 73 20 63 73 65 74 20 69 73  ts {This cset is
3080: 20 74 68 65 20 6c 61 73 74 20 6f 6e 20 74 68 65   the last on the
3090: 20 4e 54 44 42 2c 20 73 65 74 20 74 68 65 20 74   NTDB, set the t
30a0: 72 75 6e 6b 20 77 6f 72 6b 73 70 61 63 65 20 75  runk workspace u
30b0: 70 7d 0a 0a 09 09 69 66 20 7b 5b 24 72 73 74 61  p}....if {[$rsta
30c0: 74 65 20 68 61 73 20 3a 74 72 75 6e 6b 3a 5d 7d  te has :trunk:]}
30d0: 20 7b 0a 09 09 20 20 20 20 6c 6f 67 20 77 72 69   {...    log wri
30e0: 74 65 20 32 20 63 73 65 74 73 20 7b 4d 75 6c 74  te 2 csets {Mult
30f0: 69 70 6c 65 20 63 68 61 6e 67 65 73 65 74 73 20  iple changesets 
3100: 64 65 63 6c 61 72 65 64 20 74 6f 20 62 65 20 74  declared to be t
3110: 68 65 20 6c 61 73 74 20 74 72 75 6e 6b 20 63 68  he last trunk ch
3120: 61 6e 67 65 73 65 74 20 6f 6e 20 74 68 65 20 76  angeset on the v
3130: 65 6e 64 6f 72 2d 62 72 61 6e 63 68 7d 0a 09 09  endor-branch}...
3140: 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 24  } else {...    $
3150: 72 73 74 61 74 65 20 6e 65 77 20 3a 74 72 75 6e  rstate new :trun
3160: 6b 3a 20 5b 24 6c 77 73 20 6e 61 6d 65 5d 0a 09  k: [$lws name]..
3170: 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a 09 6c  .}..    }..}...l
3180: 6f 67 20 77 72 69 74 65 20 32 20 63 73 65 74 73  og write 2 csets
3190: 20 7b 20 7d 0a 09 6c 6f 67 20 77 72 69 74 65 20   { }..log write 
31a0: 32 20 63 73 65 74 73 20 7b 20 7d 0a 09 72 65 74  2 csets { }..ret
31b0: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  urn.    }..    p
31c0: 72 6f 63 20 47 65 74 72 65 76 69 73 69 6f 6e 69  roc Getrevisioni
31d0: 6e 66 6f 20 7b 72 65 76 69 73 69 6f 6e 73 7d 20  nfo {revisions} 
31e0: 7b 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27  {..set theset ('
31f0: 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73  [join $revisions
3200: 20 7b 27 2c 27 7d 5d 27 29 0a 09 73 65 74 20 72   {','}]')..set r
3210: 65 76 69 73 69 6f 6e 73 20 7b 7d 0a 09 73 74 61  evisions {}..sta
3220: 74 65 20 66 6f 72 65 61 63 68 72 6f 77 20 5b 73  te foreachrow [s
3230: 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73  ubst -nocommands
3240: 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20   -nobackslashes 
3250: 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20 55 2e  {..    SELECT U.
3260: 75 75 69 64 20 20 20 20 41 53 20 66 72 69 64 2c  uuid    AS frid,
3270: 0a 09 20 20 20 20 20 20 20 20 20 20 20 46 2e 76  ..           F.v
3280: 69 73 69 62 6c 65 20 41 53 20 70 61 74 68 2c 0a  isible AS path,.
3290: 09 20 20 20 20 20 20 20 20 20 20 20 46 2e 6e 61  .           F.na
32a0: 6d 65 20 20 20 20 41 53 20 66 6e 61 6d 65 2c 0a  me    AS fname,.
32b0: 09 20 20 20 20 20 20 20 20 20 20 20 52 2e 72 65  .           R.re
32c0: 76 20 20 20 20 20 41 53 20 72 65 76 6e 72 2c 0a  v     AS revnr,.
32d0: 09 20 20 20 20 20 20 20 20 20 20 20 52 2e 6f 70  .           R.op
32e0: 20 20 20 20 20 20 41 53 20 72 6f 70 0a 09 20 20        AS rop..  
32f0: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f    FROM   revisio
3300: 6e 20 52 2c 20 72 65 76 75 75 69 64 20 55 2c 20  n R, revuuid U, 
3310: 66 69 6c 65 20 46 0a 09 20 20 20 20 57 48 45 52  file F..    WHER
3320: 45 20 20 52 2e 72 69 64 20 49 4e 20 24 74 68 65  E  R.rid IN $the
3330: 73 65 74 20 20 2d 2d 20 41 6c 6c 20 73 70 65 63  set  -- All spec
3340: 69 66 69 65 64 20 72 65 76 69 73 69 6f 6e 73 0a  ified revisions.
3350: 09 20 20 20 20 41 4e 44 20 20 20 20 55 2e 72 69  .    AND    U.ri
3360: 64 20 3d 20 52 2e 72 69 64 20 20 20 20 20 2d 2d  d = R.rid     --
3370: 20 67 65 74 20 66 6f 73 73 69 6c 20 75 75 69 64   get fossil uuid
3380: 20 6f 66 20 72 65 76 69 73 69 6f 6e 0a 09 20 20   of revision..  
3390: 20 20 41 4e 44 20 20 20 20 46 2e 66 69 64 20 3d    AND    F.fid =
33a0: 20 52 2e 66 69 64 20 20 20 20 20 2d 2d 20 67 65   R.fid     -- ge
33b0: 74 20 66 69 6c 65 20 6f 66 20 72 65 76 69 73 69  t file of revisi
33c0: 6f 6e 0a 09 7d 5d 20 7b 0a 09 20 20 20 20 6c 61  on..}] {..    la
33d0: 70 70 65 6e 64 20 72 65 76 69 73 69 6f 6e 73 20  ppend revisions 
33e0: 24 66 72 69 64 20 24 70 61 74 68 20 24 66 6e 61  $frid $path $fna
33f0: 6d 65 2f 24 72 65 76 6e 72 20 24 72 6f 70 0a 09  me/$revnr $rop..
3400: 7d 0a 09 72 65 74 75 72 6e 20 24 72 65 76 69 73  }..return $revis
3410: 69 6f 6e 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ions.    }..    
3420: 70 72 6f 63 20 47 65 74 77 6f 72 6b 73 70 61 63  proc Getworkspac
3430: 65 20 7b 72 73 74 61 74 65 20 6c 6f 64 6e 61 6d  e {rstate lodnam
3440: 65 20 70 72 6f 6a 65 63 74 20 69 73 64 65 66 61  e project isdefa
3450: 75 6c 74 7d 20 7b 0a 0a 09 23 20 54 68 65 20 73  ult} {...# The s
3460: 74 61 74 65 20 6f 62 6a 65 63 74 20 68 6f 6c 64  tate object hold
3470: 73 20 74 68 65 20 77 6f 72 6b 73 70 61 63 65 20  s the workspace 
3480: 73 74 61 74 65 20 6f 66 20 65 61 63 68 20 6b 6e  state of each kn
3490: 6f 77 6e 0a 09 23 20 6c 69 6e 65 2d 6f 66 2d 64  own..# line-of-d
34a0: 65 76 65 6c 6f 70 6d 65 6e 74 20 28 4c 4f 44 29  evelopment (LOD)
34b0: 2c 20 75 70 20 74 6f 20 74 68 65 20 6c 61 73 74  , up to the last
34c0: 20 63 6f 6d 6d 69 74 74 65 64 0a 09 23 20 63 68   committed..# ch
34d0: 61 6e 67 65 73 65 74 20 62 65 6c 6f 6e 67 69 6e  angeset belongin
34e0: 67 20 74 6f 20 74 68 61 74 20 4c 4f 44 2e 0a 0a  g to that LOD...
34f0: 09 23 20 28 2a 29 20 53 74 61 6e 64 61 72 64 20  .# (*) Standard 
3500: 68 61 6e 64 6c 69 6e 67 20 69 66 20 69 6e 2d 4c  handling if in-L
3510: 4f 44 20 63 68 61 6e 67 65 73 65 74 73 2e 20 49  OD changesets. I
3520: 66 20 74 68 65 20 4c 4f 44 20 6f 66 0a 09 23 20  f the LOD of..# 
3530: 20 20 20 20 74 68 65 20 63 75 72 72 65 6e 74 20      the current 
3540: 63 68 61 6e 67 65 73 65 74 20 65 78 69 73 74 73  changeset exists
3550: 20 69 6e 20 74 68 65 20 73 74 61 74 65 20 28 3d   in the state (=
3560: 20 68 61 73 20 62 65 65 6e 0a 09 23 20 20 20 20   has been..#    
3570: 20 63 6f 6d 6d 69 74 74 65 64 20 74 6f 29 20 74   committed to) t
3580: 68 65 6e 20 74 68 69 73 20 69 74 20 68 61 73 20  hen this it has 
3590: 74 68 65 20 77 6f 72 6b 73 70 61 63 65 20 77 65  the workspace we
35a0: 20 61 72 65 0a 09 23 20 20 20 20 20 6c 6f 6f 6b   are..#     look
35b0: 69 6e 67 20 66 6f 72 2e 0a 0a 09 69 66 20 7b 5b  ing for....if {[
35c0: 24 72 73 74 61 74 65 20 68 61 73 20 24 6c 6f 64  $rstate has $lod
35d0: 6e 61 6d 65 5d 7d 20 7b 0a 09 20 20 20 20 72 65  name]} {..    re
35e0: 74 75 72 6e 20 5b 24 72 73 74 61 74 65 20 67 65  turn [$rstate ge
35f0: 74 20 24 6c 6f 64 6e 61 6d 65 5d 0a 09 7d 0a 0a  t $lodname]..}..
3600: 09 23 20 49 66 20 74 68 65 20 4c 4f 44 20 69 73  .# If the LOD is
3610: 20 68 6f 77 65 76 65 72 20 6e 6f 74 20 79 65 74   however not yet
3620: 20 6b 6e 6f 77 6e 2c 20 74 68 65 6e 20 74 68 65   known, then the
3630: 20 63 75 72 72 65 6e 74 0a 09 23 20 63 68 61 6e   current..# chan
3640: 67 65 73 65 74 20 63 61 6e 20 62 65 20 65 69 74  geset can be eit
3650: 68 65 72 20 6f 66 0a 09 23 20 28 61 29 20 72 6f  her of..# (a) ro
3660: 6f 74 20 6f 66 20 61 20 76 65 6e 64 6f 72 20 62  ot of a vendor b
3670: 72 61 6e 63 68 2c 0a 09 23 20 28 62 29 20 72 6f  ranch,..# (b) ro
3680: 6f 74 20 6f 66 20 74 68 65 20 74 72 75 6e 6b 20  ot of the trunk 
3690: 4c 4f 44 2c 20 6f 72 0a 09 23 20 28 63 29 20 74  LOD, or..# (c) t
36a0: 68 65 20 66 69 72 73 74 20 63 68 61 6e 67 65 73  he first changes
36b0: 65 74 20 69 6e 20 61 20 6e 65 77 20 4c 4f 44 20  et in a new LOD 
36c0: 77 68 69 63 68 20 77 61 73 20 73 70 61 77 6e 65  which was spawne
36d0: 64 20 66 72 6f 6d 0a 09 23 20 20 20 20 20 61 6e  d from..#     an
36e0: 20 65 78 69 73 74 69 6e 67 20 4c 4f 44 2e 0a 0a   existing LOD...
36f0: 09 23 20 46 6f 72 20 62 6f 74 68 20 28 61 29 20  .# For both (a) 
3700: 61 6e 64 20 28 62 29 20 77 65 20 68 61 76 65 20  and (b) we have 
3710: 74 6f 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  to create a new 
3720: 77 6f 72 6b 73 70 61 63 65 20 66 6f 72 0a 09 23  workspace for..#
3730: 20 74 68 65 20 6c 6f 64 2c 20 61 6e 64 20 69 74   the lod, and it
3740: 20 64 6f 65 73 6e 27 74 20 69 6e 68 65 72 69 74   doesn't inherit
3750: 20 66 72 6f 6d 20 61 6e 79 74 68 69 6e 67 2e 0a   from anything..
3760: 0a 09 23 20 4f 6e 65 20 65 78 63 65 70 74 69 6f  ..# One exceptio
3770: 6e 20 66 6f 72 20 28 61 29 2e 20 49 66 20 77 65  n for (a). If we
3780: 20 61 6c 72 65 61 64 79 20 68 61 76 65 20 61 20   already have a 
3790: 3a 76 65 6e 64 6f 72 3a 20 62 72 61 6e 63 68 0a  :vendor: branch.
37a0: 09 23 20 74 68 65 6e 20 6d 75 6c 74 69 70 6c 65  .# then multiple
37b0: 20 73 79 6d 62 6f 6c 73 20 77 65 72 65 20 75 73   symbols were us
37c0: 65 64 20 66 6f 72 20 74 68 65 20 76 65 6e 64 6f  ed for the vendo
37d0: 72 20 62 72 61 6e 63 68 20 62 79 0a 09 23 20 64  r branch by..# d
37e0: 69 66 66 65 72 65 6e 74 20 66 69 6c 65 73 2e 20  ifferent files. 
37f0: 49 6e 20 74 68 61 74 20 63 61 73 65 20 74 68 65  In that case the
3800: 20 27 6e 65 77 27 20 62 72 61 6e 63 68 20 69 73   'new' branch is
3810: 20 6d 61 64 65 20 61 6e 0a 09 23 20 61 6c 69 61   made an..# alia
3820: 73 20 6f 66 20 74 68 65 20 3a 76 65 6e 64 6f 72  s of the :vendor
3830: 3a 2c 20 65 66 66 65 63 74 69 76 65 6c 79 20 6d  :, effectively m
3840: 65 72 67 69 6e 67 20 74 68 65 20 73 79 6d 62 6f  erging the symbo
3850: 6c 73 0a 09 23 20 74 6f 67 65 74 68 65 72 2e 0a  ls..# together..
3860: 0a 09 23 20 4e 6f 74 65 20 74 68 61 74 20 63 61  ..# Note that ca
3870: 73 65 20 28 62 29 20 6d 61 79 20 6e 65 76 65 72  se (b) may never
3880: 20 6f 63 63 75 72 2e 20 53 65 65 20 74 68 65 20   occur. See the 
3890: 76 61 72 69 61 62 6c 65 0a 09 23 20 27 6c 61 73  variable..# 'las
38a0: 74 64 65 66 61 75 6c 74 6f 6e 74 72 75 6e 6b 27  tdefaultontrunk'
38b0: 20 69 6e 20 74 68 65 20 63 61 6c 6c 65 72 20 28   in the caller (
38c0: 6d 65 74 68 6f 64 20 70 75 73 68 74 6f 29 2e 20  method pushto). 
38d0: 54 68 69 73 0a 09 23 20 66 6c 61 67 20 63 61 6e  This..# flag can
38e0: 20 74 68 65 20 67 65 6e 65 72 61 74 69 6f 6e 20   the generation 
38f0: 6f 66 20 74 68 65 20 77 6f 72 6b 73 70 61 63 65  of the workspace
3900: 20 66 6f 72 20 74 68 65 20 3a 74 72 75 6e 6b 3a   for the :trunk:
3910: 20 4c 4f 44 0a 09 23 20 61 73 20 77 65 6c 6c 2c   LOD..# as well,
3920: 20 6d 61 6b 69 6e 67 20 69 74 20 69 6e 68 65 72   making it inher
3930: 69 74 20 74 68 65 20 73 74 61 74 65 20 6f 66 20  it the state of 
3940: 74 68 65 20 6c 61 73 74 0a 09 23 20 74 72 75 6e  the last..# trun
3950: 6b 2d 63 68 61 6e 67 65 73 65 74 20 6f 6e 20 74  k-changeset on t
3960: 68 65 20 76 65 6e 64 6f 72 2d 62 72 61 6e 63 68  he vendor-branch
3970: 2e 0a 0a 09 69 66 20 7b 24 69 73 64 65 66 61 75  ....if {$isdefau
3980: 6c 74 7d 20 7b 0a 09 20 20 20 20 69 66 20 7b 21  lt} {..    if {!
3990: 5b 24 72 73 74 61 74 65 20 68 61 73 20 22 3a 76  [$rstate has ":v
39a0: 65 6e 64 6f 72 3a 22 5d 7d 20 7b 0a 09 09 23 20  endor:"]} {...# 
39b0: 43 72 65 61 74 65 20 74 68 65 20 76 65 6e 64 6f  Create the vendo
39c0: 72 20 62 72 61 6e 63 68 20 69 66 20 6e 6f 74 20  r branch if not 
39d0: 70 72 65 73 65 6e 74 20 61 6c 72 65 61 64 79 2e  present already.
39e0: 20 57 65 0a 09 09 23 20 75 73 65 20 74 68 65 20   We...# use the 
39f0: 61 63 74 75 61 6c 20 6e 61 6d 65 20 66 6f 72 20  actual name for 
3a00: 74 68 65 20 6c 6f 64 2c 20 61 6e 64 20 61 64 64  the lod, and add
3a10: 69 74 69 6f 6e 61 6c 20 6d 61 6b 65 0a 09 09 23  itional make...#
3a20: 20 69 74 20 61 63 63 65 73 73 69 62 6c 65 20 75   it accessible u
3a30: 6e 64 65 72 20 61 6e 20 69 6e 74 65 72 6e 61 6c  nder an internal
3a40: 20 6e 61 6d 65 20 28 3a 76 65 6e 64 6f 72 3a 29   name (:vendor:)
3a50: 20 73 6f 0a 09 09 23 20 74 68 61 74 20 77 65 20   so...# that we 
3a60: 63 61 6e 20 6d 65 72 67 65 20 74 6f 20 69 74 20  can merge to it 
3a70: 6c 61 74 65 72 2c 20 73 68 6f 75 6c 64 20 69 74  later, should it
3a80: 20 62 65 63 6f 6d 65 0a 09 09 23 20 6e 65 63 65   become...# nece
3a90: 73 73 61 72 79 2e 20 53 65 65 20 74 68 65 20 6f  ssary. See the o
3aa0: 74 68 65 72 20 62 72 61 6e 63 68 20 62 65 6c 6f  ther branch belo
3ab0: 77 2e 0a 09 09 24 72 73 74 61 74 65 20 6e 65 77  w....$rstate new
3ac0: 20 24 6c 6f 64 6e 61 6d 65 0a 09 09 24 72 73 74   $lodname...$rst
3ad0: 61 74 65 20 64 75 70 20 3a 76 65 6e 64 6f 72 3a  ate dup :vendor:
3ae0: 20 3c 2d 2d 20 24 6c 6f 64 6e 61 6d 65 0a 09 20   <-- $lodname.. 
3af0: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 23 20     } else {...# 
3b00: 4d 65 72 67 65 20 74 68 65 20 6e 65 77 20 73 79  Merge the new sy
3b10: 6d 62 6f 6c 20 74 6f 20 74 68 65 20 76 65 6e 64  mbol to the vend
3b20: 6f 72 20 62 72 61 6e 63 68 0a 09 09 24 72 73 74  or branch...$rst
3b30: 61 74 65 20 64 75 70 20 24 6c 6f 64 6e 61 6d 65  ate dup $lodname
3b40: 20 3c 2d 2d 20 3a 76 65 6e 64 6f 72 3a 0a 09 20   <-- :vendor:.. 
3b50: 20 20 20 7d 0a 09 20 20 20 20 72 65 74 75 72 6e     }..    return
3b60: 20 5b 24 72 73 74 61 74 65 20 67 65 74 20 24 6c   [$rstate get $l
3b70: 6f 64 6e 61 6d 65 5d 0a 09 7d 0a 0a 09 69 66 20  odname]..}...if 
3b80: 7b 24 6c 6f 64 6e 61 6d 65 20 65 71 20 22 3a 74  {$lodname eq ":t
3b90: 72 75 6e 6b 3a 22 7d 20 7b 0a 09 20 20 20 20 72  runk:"} {..    r
3ba0: 65 74 75 72 6e 20 5b 24 72 73 74 61 74 65 20 6e  eturn [$rstate n
3bb0: 65 77 20 24 6c 6f 64 6e 61 6d 65 5d 0a 09 7d 0a  ew $lodname]..}.
3bc0: 0a 09 23 20 43 61 73 65 20 28 63 29 2e 20 57 65  ..# Case (c). We
3bd0: 20 66 69 6e 64 20 74 68 65 20 70 61 72 65 6e 74   find the parent
3be0: 20 4c 4f 44 20 6f 66 20 6f 75 72 20 4c 4f 44 20   LOD of our LOD 
3bf0: 61 6e 64 20 6c 65 74 20 74 68 65 20 6e 65 77 0a  and let the new.
3c00: 09 23 20 77 6f 72 6b 73 70 61 63 65 20 69 6e 68  .# workspace inh
3c10: 65 72 69 74 20 66 72 6f 6d 20 74 68 65 20 70 61  erit from the pa
3c20: 72 65 6e 74 27 73 20 77 6f 72 6b 73 70 61 63 65  rent's workspace
3c30: 2e 0a 0a 09 73 65 74 20 70 6c 6f 64 6e 61 6d 65  ....set plodname
3c40: 20 5b 5b 5b 24 70 72 6f 6a 65 63 74 20 67 65 74   [[[$project get
3c50: 73 79 6d 62 6f 6c 20 24 6c 6f 64 6e 61 6d 65 5d  symbol $lodname]
3c60: 20 70 61 72 65 6e 74 5d 20 6e 61 6d 65 5d 0a 0a   parent] name]..
3c70: 09 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73 65  .log write 8 cse
3c80: 74 73 20 7b 70 4c 4f 44 20 20 20 27 24 70 6c 6f  ts {pLOD   '$plo
3c90: 64 6e 61 6d 65 27 7d 0a 0a 09 69 66 20 7b 5b 24  dname'}...if {[$
3ca0: 72 73 74 61 74 65 20 68 61 73 20 24 70 6c 6f 64  rstate has $plod
3cb0: 6e 61 6d 65 5d 7d 20 7b 0a 09 20 20 20 20 72 65  name]} {..    re
3cc0: 74 75 72 6e 20 5b 24 72 73 74 61 74 65 20 6e 65  turn [$rstate ne
3cd0: 77 20 24 6c 6f 64 6e 61 6d 65 20 24 70 6c 6f 64  w $lodname $plod
3ce0: 6e 61 6d 65 5d 0a 09 7d 0a 0a 09 66 6f 72 65 61  name]..}...forea
3cf0: 63 68 20 6b 20 5b 6c 73 6f 72 74 20 5b 24 72 73  ch k [lsort [$rs
3d00: 74 61 74 65 20 6e 61 6d 65 73 5d 5d 20 7b 0a 09  tate names]] {..
3d10: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 38 20      log write 8 
3d20: 63 73 65 74 73 20 7b 20 20 20 20 24 6b 20 3d 20  csets {    $k = 
3d30: 5b 5b 24 72 73 74 61 74 65 20 67 65 74 20 24 6b  [[$rstate get $k
3d40: 5d 20 67 65 74 69 64 5d 7d 0a 09 7d 0a 0a 09 74  ] getid]}..}...t
3d50: 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20  rouble internal 
3d60: 7b 55 6e 61 62 6c 65 20 74 6f 20 64 65 74 65 72  {Unable to deter
3d70: 6d 69 6e 65 20 63 68 61 6e 67 65 73 65 74 20 70  mine changeset p
3d80: 61 72 65 6e 74 7d 0a 09 72 65 74 75 72 6e 0a 20  arent}..return. 
3d90: 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 47     }..    proc G
3da0: 65 74 69 73 64 65 66 61 75 6c 74 20 7b 72 65 76  etisdefault {rev
3db0: 69 73 69 6f 6e 73 7d 20 7b 0a 09 73 65 74 20 74  isions} {..set t
3dc0: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72  heset ('[join $r
3dd0: 65 76 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27  evisions {','}]'
3de0: 29 0a 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74  )...struct::list
3df0: 20 61 73 73 69 67 6e 20 5b 73 74 61 74 65 20 72   assign [state r
3e00: 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d  un [subst -nocom
3e10: 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61  mands -nobacksla
3e20: 73 68 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45  shes {..    SELE
3e30: 43 54 20 52 2e 69 73 64 65 66 61 75 6c 74 2c 20  CT R.isdefault, 
3e40: 52 2e 64 62 63 68 69 6c 64 0a 09 20 20 20 20 46  R.dbchild..    F
3e50: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52  ROM   revision R
3e60: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72  ..    WHERE  R.r
3e70: 69 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 2d  id IN $theset  -
3e80: 2d 20 41 6c 6c 20 73 70 65 63 69 66 69 65 64 20  - All specified 
3e90: 72 65 76 69 73 69 6f 6e 73 0a 09 20 20 20 20 4c  revisions..    L
3ea0: 49 4d 49 54 20 31 0a 09 7d 5d 5d 20 64 65 66 20  IMIT 1..}]] def 
3eb0: 6c 61 73 74 0a 0a 09 23 20 54 4f 44 4f 2f 43 48  last...# TODO/CH
3ec0: 45 43 4b 3a 20 6c 6f 6f 6b 20 66 6f 72 20 63 68  ECK: look for ch
3ed0: 61 6e 67 65 73 65 74 73 20 77 68 65 72 65 20 69  angesets where i
3ee0: 73 64 65 66 61 75 6c 74 2f 64 62 63 68 69 6c 64  sdefault/dbchild
3ef0: 20 69 73 0a 09 23 20 61 6d 62 69 67 6f 75 73 2e   is..# ambigous.
3f00: 0a 0a 09 72 65 74 75 72 6e 20 5b 6c 69 73 74 20  ...return [list 
3f10: 24 64 65 66 20 5b 65 78 70 72 20 7b 24 6c 61 73  $def [expr {$las
3f20: 74 20 6e 65 20 22 22 7d 5d 5d 0a 20 20 20 20 7d  t ne ""}]].    }
3f30: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ..    typemethod
3f40: 20 73 70 6c 69 74 20 7b 63 73 65 74 20 61 72 67   split {cset arg
3f50: 73 7d 20 7b 0a 09 23 20 41 73 20 70 61 72 74 20  s} {..# As part 
3f60: 6f 66 20 74 68 65 20 63 72 65 61 74 69 6f 6e 20  of the creation 
3f70: 6f 66 20 74 68 65 20 6e 65 77 20 63 68 61 6e 67  of the new chang
3f80: 65 73 65 74 73 20 73 70 65 63 69 66 69 65 64 20  esets specified 
3f90: 69 6e 0a 09 23 20 41 52 47 53 20 61 73 20 73 65  in..# ARGS as se
3fa0: 74 73 20 6f 66 20 69 74 65 6d 73 2c 20 61 6c 6c  ts of items, all
3fb0: 20 73 75 62 73 65 74 73 20 6f 66 20 43 53 45 54   subsets of CSET
3fc0: 27 73 20 69 74 65 6d 20 73 65 74 2c 20 43 53 45  's item set, CSE
3fd0: 54 0a 09 23 20 77 69 6c 6c 20 62 65 20 64 72 6f  T..# will be dro
3fe0: 70 70 65 64 20 66 72 6f 6d 20 61 6c 6c 20 64 61  pped from all da
3ff0: 74 61 62 61 73 65 73 2c 20 69 6e 20 61 6e 64 20  tabases, in and 
4000: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 2c 0a 09  out of memory,..
4010: 23 20 61 6e 64 20 74 68 65 6e 20 64 65 73 74 72  # and then destr
4020: 6f 79 65 64 2e 0a 09 23 0a 09 23 20 4e 6f 74 65  oyed...#..# Note
4030: 3a 20 54 68 65 20 69 74 65 6d 20 6c 69 73 74 73  : The item lists
4040: 20 66 6f 75 6e 64 20 69 6e 20 61 72 67 73 20 61   found in args a
4050: 72 65 20 74 61 67 67 65 64 20 69 74 65 6d 73 2e  re tagged items.
4060: 20 54 68 65 79 0a 09 23 20 68 61 76 65 20 74 6f   They..# have to
4070: 20 68 61 76 65 20 74 68 65 20 73 61 6d 65 20 74   have the same t
4080: 79 70 65 20 61 73 20 74 68 65 20 63 68 61 6e 67  ype as the chang
4090: 65 73 65 74 2c 20 62 65 69 6e 67 20 73 75 62 73  eset, being subs
40a0: 65 74 73 0a 09 23 20 6f 66 20 69 74 73 20 69 74  ets..# of its it
40b0: 65 6d 73 2e 20 54 68 69 73 20 69 73 20 63 68 65  ems. This is che
40c0: 63 6b 65 64 20 69 6e 20 55 6e 74 61 67 31 2e 0a  cked in Untag1..
40d0: 0a 09 6c 6f 67 20 77 72 69 74 65 20 38 20 63 73  ..log write 8 cs
40e0: 65 74 73 20 7b 4f 4c 44 3a 20 5b 6c 73 6f 72 74  ets {OLD: [lsort
40f0: 20 5b 24 63 73 65 74 20 69 74 65 6d 73 5d 5d 7d   [$cset items]]}
4100: 0a 09 56 61 6c 69 64 61 74 65 46 72 61 67 6d 65  ..ValidateFragme
4110: 6e 74 73 20 24 63 73 65 74 20 24 61 72 67 73 0a  nts $cset $args.
4120: 0a 09 23 20 41 6c 6c 20 63 68 65 63 6b 73 20 70  ..# All checks p
4130: 61 73 73 2c 20 61 63 74 75 61 6c 6c 79 20 70 65  ass, actually pe
4140: 72 66 6f 72 6d 20 74 68 65 20 73 70 6c 69 74 2e  rform the split.
4150: 0a 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20  ...struct::list 
4160: 61 73 73 69 67 6e 20 5b 24 63 73 65 74 20 64 61  assign [$cset da
4170: 74 61 5d 20 70 72 6f 6a 65 63 74 20 63 73 74 79  ta] project csty
4180: 70 65 20 63 73 73 72 63 0a 0a 09 73 65 74 20 70  pe cssrc...set p
4190: 72 65 64 65 63 65 73 73 6f 72 73 20 5b 24 63 73  redecessors [$cs
41a0: 65 74 20 64 72 6f 70 5d 0a 09 24 63 73 65 74 20  et drop]..$cset 
41b0: 64 65 73 74 72 6f 79 0a 0a 09 73 65 74 20 6e 65  destroy...set ne
41c0: 77 63 73 65 74 73 20 7b 7d 0a 09 66 6f 72 65 61  wcsets {}..forea
41d0: 63 68 20 66 72 61 67 6d 65 6e 74 69 74 65 6d 73  ch fragmentitems
41e0: 20 24 61 72 67 73 20 7b 0a 09 20 20 20 20 6c 6f   $args {..    lo
41f0: 67 20 77 72 69 74 65 20 38 20 63 73 65 74 73 20  g write 8 csets 
4200: 7b 4d 41 4b 45 3a 20 5b 6c 73 6f 72 74 20 24 66  {MAKE: [lsort $f
4210: 72 61 67 6d 65 6e 74 69 74 65 6d 73 5d 7d 0a 0a  ragmentitems]}..
4220: 09 20 20 20 20 73 65 74 20 66 72 61 67 6d 65 6e  .    set fragmen
4230: 74 20 5b 24 74 79 70 65 20 25 41 55 54 4f 25 20  t [$type %AUTO% 
4240: 24 70 72 6f 6a 65 63 74 20 24 63 73 74 79 70 65  $project $cstype
4250: 20 24 63 73 73 72 63 20 5c 0a 09 09 09 20 20 20   $cssrc \....   
4260: 20 20 20 5b 55 6e 74 61 67 20 24 66 72 61 67 6d     [Untag $fragm
4270: 65 6e 74 69 74 65 6d 73 20 24 63 73 74 79 70 65  entitems $cstype
4280: 5d 5d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20  ]]..    lappend 
4290: 6e 65 77 63 73 65 74 73 20 24 66 72 61 67 6d 65  newcsets $fragme
42a0: 6e 74 0a 0a 09 20 20 20 20 24 66 72 61 67 6d 65  nt...    $fragme
42b0: 6e 74 20 70 65 72 73 69 73 74 0a 09 20 20 20 20  nt persist..    
42c0: 24 66 72 61 67 6d 65 6e 74 20 64 65 74 65 72 6d  $fragment determ
42d0: 69 6e 65 73 75 63 63 65 73 73 6f 72 73 0a 09 7d  inesuccessors..}
42e0: 0a 0a 09 23 20 54 68 65 20 70 72 65 64 65 63 65  ...# The predece
42f0: 73 73 6f 72 73 20 68 61 76 65 20 74 6f 20 72 65  ssors have to re
4300: 63 6f 6d 70 75 74 65 20 74 68 65 69 72 20 73 75  compute their su
4310: 63 63 65 73 73 6f 72 73 2c 20 69 2e 65 2e 0a 09  ccessors, i.e...
4320: 23 20 72 65 6d 6f 76 65 20 74 68 65 20 64 72 6f  # remove the dro
4330: 70 70 65 64 20 63 68 61 6e 67 65 73 65 74 20 61  pped changeset a
4340: 6e 64 20 70 75 74 20 6f 6e 65 20 6f 66 20 74 68  nd put one of th
4350: 65 20 66 72 61 67 6d 65 6e 74 73 0a 09 23 20 69  e fragments..# i
4360: 6e 74 6f 20 69 74 73 20 70 6c 61 63 65 2e 0a 09  nto its place...
4370: 66 6f 72 65 61 63 68 20 70 20 24 70 72 65 64 65  foreach p $prede
4380: 63 65 73 73 6f 72 73 20 7b 0a 09 20 20 20 20 24  cessors {..    $
4390: 70 20 64 65 74 65 72 6d 69 6e 65 73 75 63 63 65  p determinesucce
43a0: 73 73 6f 72 73 0a 09 7d 0a 0a 09 72 65 74 75 72  ssors..}...retur
43b0: 6e 20 24 6e 65 77 63 73 65 74 73 0a 20 20 20 20  n $newcsets.    
43c0: 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  }..    typemetho
43d0: 64 20 69 74 65 6d 73 74 72 20 7b 69 74 65 6d 7d  d itemstr {item}
43e0: 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74   {..struct::list
43f0: 20 61 73 73 69 67 6e 20 24 69 74 65 6d 20 69 74   assign $item it
4400: 79 70 65 20 69 69 64 0a 09 72 65 74 75 72 6e 20  ype iid..return 
4410: 5b 24 69 74 79 70 65 20 73 74 72 20 24 69 69 64  [$itype str $iid
4420: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70  ].    }..    typ
4430: 65 6d 65 74 68 6f 64 20 73 74 72 6c 69 73 74 20  emethod strlist 
4440: 7b 63 68 61 6e 67 65 73 65 74 73 7d 20 7b 0a 09  {changesets} {..
4450: 72 65 74 75 72 6e 20 5b 6a 6f 69 6e 20 5b 73 74  return [join [st
4460: 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20 24  ruct::list map $
4470: 63 68 61 6e 67 65 73 65 74 73 20 5b 6d 79 70 72  changesets [mypr
4480: 6f 63 20 49 44 5d 5d 5d 0a 20 20 20 20 7d 0a 0a  oc ID]]].    }..
4490: 20 20 20 20 70 72 6f 63 20 49 44 20 7b 63 73 65      proc ID {cse
44a0: 74 7d 20 7b 20 24 63 73 65 74 20 73 74 72 20 7d  t} { $cset str }
44b0: 0a 0a 20 20 20 20 70 72 6f 63 20 55 6e 74 61 67  ..    proc Untag
44c0: 20 7b 74 61 67 67 65 64 69 74 65 6d 73 20 63 73   {taggeditems cs
44d0: 74 79 70 65 7d 20 7b 0a 09 72 65 74 75 72 6e 20  type} {..return 
44e0: 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61  [struct::list ma
44f0: 70 20 24 74 61 67 67 65 64 69 74 65 6d 73 20 5b  p $taggeditems [
4500: 6d 79 70 72 6f 63 20 55 6e 74 61 67 31 20 24 63  myproc Untag1 $c
4510: 73 74 79 70 65 5d 5d 0a 20 20 20 20 7d 0a 0a 20  stype]].    }.. 
4520: 20 20 20 70 72 6f 63 20 55 6e 74 61 67 31 20 7b     proc Untag1 {
4530: 63 73 74 79 70 65 20 74 68 65 69 74 65 6d 7d 20  cstype theitem} 
4540: 7b 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74 20  {..struct::list 
4550: 61 73 73 69 67 6e 20 24 74 68 65 69 74 65 6d 20  assign $theitem 
4560: 74 20 69 0a 09 69 6e 74 65 67 72 69 74 79 20 61  t i..integrity a
4570: 73 73 65 72 74 20 7b 24 63 73 74 79 70 65 20 65  ssert {$cstype e
4580: 71 20 24 74 7d 20 7b 49 74 65 6d 20 24 69 27 73  q $t} {Item $i's
4590: 20 74 79 70 65 20 69 73 20 27 24 74 27 2c 20 65   type is '$t', e
45a0: 78 70 65 63 74 65 64 20 27 24 63 73 74 79 70 65  xpected '$cstype
45b0: 27 7d 0a 09 72 65 74 75 72 6e 20 24 69 0a 20 20  '}..return $i.  
45c0: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 54 61    }..    proc Ta
45d0: 67 49 74 65 6d 44 69 63 74 20 7b 69 74 65 6d 64  gItemDict {itemd
45e0: 69 63 74 20 63 73 74 79 70 65 7d 20 7b 0a 09 73  ict cstype} {..s
45f0: 65 74 20 72 65 73 20 7b 7d 0a 09 66 6f 72 65 61  et res {}..forea
4600: 63 68 20 7b 69 20 76 7d 20 24 69 74 65 6d 64 69  ch {i v} $itemdi
4610: 63 74 20 7b 20 6c 61 70 70 65 6e 64 20 72 65 73  ct { lappend res
4620: 20 5b 6c 69 73 74 20 24 63 73 74 79 70 65 20 24   [list $cstype $
4630: 69 5d 20 24 76 20 7d 0a 09 72 65 74 75 72 6e 20  i] $v }..return 
4640: 24 72 65 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20  $res.    }..    
4650: 70 72 6f 63 20 56 61 6c 69 64 61 74 65 46 72 61  proc ValidateFra
4660: 67 6d 65 6e 74 73 20 7b 63 73 65 74 20 66 72 61  gments {cset fra
4670: 67 6d 65 6e 74 73 7d 20 7b 0a 09 23 20 43 68 65  gments} {..# Che
4680: 63 6b 20 74 68 65 20 76 61 72 69 6f 75 73 20 69  ck the various i
4690: 6e 74 65 67 72 69 74 79 20 63 6f 6e 73 74 72 61  ntegrity constra
46a0: 69 6e 74 73 20 66 6f 72 20 74 68 65 20 66 72 61  ints for the fra
46b0: 67 6d 65 6e 74 73 0a 09 23 20 73 70 65 63 69 66  gments..# specif
46c0: 79 69 6e 67 20 68 6f 77 20 74 6f 20 73 70 6c 69  ying how to spli
46d0: 74 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 3a  t the changeset:
46e0: 0a 09 23 0a 09 23 20 2a 20 57 65 20 6d 75 73 74  ..#..# * We must
46f0: 20 68 61 76 65 20 74 77 6f 20 6f 72 20 6d 6f 72   have two or mor
4700: 65 20 66 72 61 67 6d 65 6e 74 73 2c 20 61 73 20  e fragments, as 
4710: 73 70 6c 69 74 74 69 6e 67 20 61 0a 09 23 20 20  splitting a..#  
4720: 20 63 68 61 6e 67 65 73 65 74 20 69 6e 74 6f 20   changeset into 
4730: 6f 6e 65 20 6d 61 6b 65 73 20 6e 6f 20 73 65 6e  one makes no sen
4740: 73 65 2e 0a 09 23 20 2a 20 4e 6f 20 66 72 61 67  se...# * No frag
4750: 6d 65 6e 74 20 6d 61 79 20 62 65 20 65 6d 70 74  ment may be empt
4760: 79 2e 0a 09 23 20 2a 20 41 6c 6c 20 66 72 61 67  y...# * All frag
4770: 6d 65 6e 74 73 20 68 61 76 65 20 74 6f 20 62 65  ments have to be
4780: 20 74 72 75 65 20 73 75 62 73 65 74 73 20 6f 66   true subsets of
4790: 20 74 68 65 20 69 74 65 6d 73 20 69 6e 20 74 68   the items in th
47a0: 65 0a 09 23 20 20 20 63 68 61 6e 67 65 73 65 74  e..#   changeset
47b0: 20 74 6f 20 73 70 6c 69 74 2e 20 54 68 65 20 27   to split. The '
47c0: 74 72 75 65 27 20 69 73 20 69 6d 70 6c 69 65 64  true' is implied
47d0: 20 62 65 63 61 75 73 65 20 6e 6f 6e 65 20 61 72   because none ar
47e0: 65 0a 09 23 20 20 20 61 6c 6c 6f 77 65 64 20 74  e..#   allowed t
47f0: 6f 20 62 65 20 65 6d 70 74 79 2c 20 73 6f 20 65  o be empty, so e
4800: 61 63 68 20 68 61 73 20 74 6f 20 62 65 20 73 6d  ach has to be sm
4810: 61 6c 6c 65 72 20 74 68 61 6e 20 74 68 65 0a 09  aller than the..
4820: 23 20 20 20 74 6f 74 61 6c 2e 0a 09 23 20 2a 20  #   total...# * 
4830: 54 68 65 20 75 6e 69 6f 6e 20 6f 66 20 74 68 65  The union of the
4840: 20 66 72 61 67 6d 65 6e 74 73 20 68 61 73 20 74   fragments has t
4850: 6f 20 62 65 20 74 68 65 20 69 74 65 6d 20 73 65  o be the item se
4860: 74 20 6f 66 20 74 68 65 0a 09 23 20 20 20 63 68  t of the..#   ch
4870: 61 6e 67 65 73 65 74 2e 0a 09 23 20 2a 20 54 68  angeset...# * Th
4880: 65 20 66 72 61 67 6d 65 6e 74 20 6d 75 73 74 20  e fragment must 
4890: 6e 6f 74 20 6f 76 65 72 6c 61 70 2c 20 69 2e 65  not overlap, i.e
48a0: 2e 20 74 68 65 69 72 20 70 61 69 72 77 69 73 65  . their pairwise
48b0: 0a 09 23 20 20 20 69 6e 74 65 72 73 65 63 74 69  ..#   intersecti
48c0: 6f 6e 73 20 68 61 76 65 20 74 6f 20 62 65 20 65  ons have to be e
48d0: 6d 70 74 79 2e 0a 0a 09 73 65 74 20 63 6f 76 65  mpty....set cove
48e0: 72 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20 66 72  r {}..foreach fr
48f0: 61 67 6d 65 6e 74 69 74 65 6d 73 20 24 66 72 61  agmentitems $fra
4900: 67 6d 65 6e 74 73 20 7b 0a 09 20 20 20 20 6c 6f  gments {..    lo
4910: 67 20 77 72 69 74 65 20 38 20 63 73 65 74 73 20  g write 8 csets 
4920: 7b 4e 45 57 3a 20 5b 6c 73 6f 72 74 20 24 66 72  {NEW: [lsort $fr
4930: 61 67 6d 65 6e 74 69 74 65 6d 73 5d 7d 0a 0a 09  agmentitems]}...
4940: 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73      integrity as
4950: 73 65 72 74 20 7b 0a 09 09 21 5b 73 74 72 75 63  sert {...![struc
4960: 74 3a 3a 73 65 74 20 65 6d 70 74 79 20 24 66 72  t::set empty $fr
4970: 61 67 6d 65 6e 74 69 74 65 6d 73 5d 0a 09 20 20  agmentitems]..  
4980: 20 20 7d 20 7b 63 68 61 6e 67 65 73 65 74 20 66    } {changeset f
4990: 72 61 67 6d 65 6e 74 20 69 73 20 65 6d 70 74 79  ragment is empty
49a0: 7d 0a 0a 09 20 20 20 20 69 6e 74 65 67 72 69 74  }...    integrit
49b0: 79 20 61 73 73 65 72 74 20 7b 0a 09 09 5b 73 74  y assert {...[st
49c0: 72 75 63 74 3a 3a 73 65 74 20 73 75 62 73 65 74  ruct::set subset
49d0: 6f 66 20 24 66 72 61 67 6d 65 6e 74 69 74 65 6d  of $fragmentitem
49e0: 73 20 5b 24 63 73 65 74 20 69 74 65 6d 73 5d 5d  s [$cset items]]
49f0: 0a 09 20 20 20 20 7d 20 7b 63 68 61 6e 67 65 73  ..    } {changes
4a00: 65 74 20 66 72 61 67 6d 65 6e 74 20 69 73 20 6e  et fragment is n
4a10: 6f 74 20 61 20 73 75 62 73 65 74 7d 0a 09 20 20  ot a subset}..  
4a20: 20 20 73 74 72 75 63 74 3a 3a 73 65 74 20 61 64    struct::set ad
4a30: 64 20 63 6f 76 65 72 20 24 66 72 61 67 6d 65 6e  d cover $fragmen
4a40: 74 69 74 65 6d 73 0a 09 7d 0a 0a 09 69 6e 74 65  titems..}...inte
4a50: 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 0a 09  grity assert {..
4a60: 20 20 20 20 5b 73 74 72 75 63 74 3a 3a 73 65 74      [struct::set
4a70: 20 65 71 75 61 6c 20 24 63 6f 76 65 72 20 5b 24   equal $cover [$
4a80: 63 73 65 74 20 69 74 65 6d 73 5d 5d 0a 09 20 7d  cset items]].. }
4a90: 20 7b 54 68 65 20 66 72 61 67 6d 65 6e 74 73 20   {The fragments 
4aa0: 64 6f 20 6e 6f 74 20 63 6f 76 65 72 20 74 68 65  do not cover the
4ab0: 20 6f 72 69 67 69 6e 61 6c 20 63 68 61 6e 67 65   original change
4ac0: 73 65 74 7d 0a 0a 09 73 65 74 20 69 20 31 0a 09  set}...set i 1..
4ad0: 66 6f 72 65 61 63 68 20 66 69 61 20 24 66 72 61  foreach fia $fra
4ae0: 67 6d 65 6e 74 73 20 7b 0a 09 20 20 20 20 66 6f  gments {..    fo
4af0: 72 65 61 63 68 20 66 69 62 20 5b 6c 72 61 6e 67  reach fib [lrang
4b00: 65 20 24 66 72 61 67 6d 65 6e 74 73 20 24 69 20  e $fragments $i 
4b10: 65 6e 64 5d 20 7b 0a 09 09 69 6e 74 65 67 72 69  end] {...integri
4b20: 74 79 20 61 73 73 65 72 74 20 7b 0a 09 09 20 20  ty assert {...  
4b30: 20 20 5b 73 74 72 75 63 74 3a 3a 73 65 74 20 65    [struct::set e
4b40: 6d 70 74 79 20 5b 73 74 72 75 63 74 3a 3a 73 65  mpty [struct::se
4b50: 74 20 69 6e 74 65 72 73 65 63 74 20 24 66 69 61  t intersect $fia
4b60: 20 24 66 69 62 5d 5d 0a 09 09 7d 20 7b 54 68 65   $fib]]...} {The
4b70: 20 66 72 61 67 6d 65 6e 74 73 20 3c 24 66 69 61   fragments <$fia
4b80: 3e 20 61 6e 64 20 3c 24 66 69 62 3e 20 6f 76 65  > and <$fib> ove
4b90: 72 6c 61 70 7d 0a 09 20 20 20 20 7d 0a 09 20 20  rlap}..    }..  
4ba0: 20 20 69 6e 63 72 20 69 0a 09 7d 0a 0a 09 72 65    incr i..}...re
4bb0: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
4bc0: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
4bd0: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
4be0: 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 53  #######.    ## S
4bf0: 74 61 74 65 0a 0a 20 20 20 20 76 61 72 69 61 62  tate..    variab
4c00: 6c 65 20 6d 79 69 64 20 20 20 20 20 20 20 20 7b  le myid        {
4c10: 7d 20 3b 20 23 20 49 64 20 6f 66 20 74 68 65 20  } ; # Id of the 
4c20: 63 73 65 74 20 66 6f 72 20 74 68 65 20 70 65 72  cset for the per
4c30: 73 69 73 74 65 6e 74 0a 09 09 09 20 20 20 20 20  sistent....     
4c40: 20 23 20 73 74 61 74 65 2e 0a 20 20 20 20 76 61   # state..    va
4c50: 72 69 61 62 6c 65 20 6d 79 70 72 6f 6a 65 63 74  riable myproject
4c60: 20 20 20 7b 7d 20 3b 20 23 20 52 65 66 65 72 65     {} ; # Refere
4c70: 6e 63 65 20 6f 66 20 74 68 65 20 70 72 6f 6a 65  nce of the proje
4c80: 63 74 20 6f 62 6a 65 63 74 20 74 68 65 0a 09 09  ct object the...
4c90: 09 20 20 20 20 20 20 23 20 63 68 61 6e 67 65 73  .      # changes
4ca0: 65 74 20 62 65 6c 6f 6e 67 73 20 74 6f 2e 0a 20  et belongs to.. 
4cb0: 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 74 79     variable myty
4cc0: 70 65 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 57  pe      {} ; # W
4cd0: 68 61 74 20 74 68 65 20 63 68 61 6e 67 65 73 65  hat the changese
4ce0: 74 20 69 73 20 62 61 73 65 64 20 6f 6e 0a 09 09  t is based on...
4cf0: 09 20 20 20 20 20 20 23 20 28 72 65 76 69 73 69  .      # (revisi
4d00: 6f 6e 73 2c 20 74 61 67 73 2c 20 6f 72 20 62 72  ons, tags, or br
4d10: 61 6e 63 68 65 73 29 2e 0a 09 09 09 20 20 20 20  anches).....    
4d20: 20 20 23 20 56 61 6c 75 65 73 3a 20 53 65 65 20    # Values: See 
4d30: 6d 79 63 73 74 79 70 65 2e 20 4e 6f 74 65 20 74  mycstype. Note t
4d40: 68 61 74 20 77 65 0a 09 09 09 20 20 20 20 20 20  hat we....      
4d50: 23 20 68 61 76 65 20 74 6f 20 6b 65 65 70 20 74  # have to keep t
4d60: 68 65 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 20  he names of the 
4d70: 68 65 6c 70 65 72 0a 09 09 09 20 20 20 20 20 20  helper....      
4d80: 23 20 73 69 6e 67 6c 65 74 6f 6e 73 20 69 6e 20  # singletons in 
4d90: 73 79 6e 63 20 77 69 74 68 20 74 68 65 20 63 6f  sync with the co
4da0: 6e 74 65 6e 74 73 0a 09 09 09 20 20 20 20 20 20  ntents....      
4db0: 23 20 6f 66 20 73 74 61 74 65 20 74 61 62 6c 65  # of state table
4dc0: 20 27 63 73 74 79 70 65 27 2c 20 61 6e 64 20 76   'cstype', and v
4dd0: 61 72 69 6f 75 73 0a 09 09 09 20 20 20 20 20 20  arious....      
4de0: 23 20 6f 74 68 65 72 20 70 6c 61 63 65 73 20 75  # other places u
4df0: 73 69 6e 67 20 74 68 65 6d 20 68 61 72 64 77 69  sing them hardwi
4e00: 72 65 64 2e 0a 20 20 20 20 76 61 72 69 61 62 6c  red..    variabl
4e10: 65 20 6d 79 74 79 70 65 6f 62 6a 20 20 20 7b 7d  e mytypeobj   {}
4e20: 20 3b 20 23 20 52 65 66 65 72 65 6e 63 65 20 74   ; # Reference t
4e30: 6f 20 74 68 65 20 63 6f 6e 74 61 69 6e 65 72 20  o the container 
4e40: 66 6f 72 20 74 68 65 0a 09 09 09 20 20 20 20 20  for the....     
4e50: 20 23 20 74 79 70 65 20 64 65 70 65 6e 64 65 6e   # type dependen
4e60: 74 20 63 6f 64 65 2e 20 44 65 72 69 76 65 64 20  t code. Derived 
4e70: 66 72 6f 6d 0a 09 09 09 20 20 20 20 20 20 23 20  from....      # 
4e80: 6d 79 74 79 70 65 2e 0a 20 20 20 20 76 61 72 69  mytype..    vari
4e90: 61 62 6c 65 20 6d 79 73 72 63 69 64 20 20 20 20  able mysrcid    
4ea0: 20 7b 7d 20 3b 20 23 20 49 64 20 6f 66 20 74 68   {} ; # Id of th
4eb0: 65 20 6d 65 74 61 64 61 74 61 20 6f 72 20 73 79  e metadata or sy
4ec0: 6d 62 6f 6c 20 74 68 65 20 63 73 65 74 0a 09 09  mbol the cset...
4ed0: 09 20 20 20 20 20 20 23 20 69 73 20 62 61 73 65  .      # is base
4ee0: 64 20 6f 6e 2e 0a 20 20 20 20 76 61 72 69 61 62  d on..    variab
4ef0: 6c 65 20 6d 79 69 74 65 6d 73 20 20 20 20 20 7b  le myitems     {
4f00: 7d 20 3b 20 23 20 4c 69 73 74 20 6f 66 20 74 68  } ; # List of th
4f10: 65 20 66 69 6c 65 20 6c 65 76 65 6c 20 72 65 76  e file level rev
4f20: 69 73 69 6f 6e 73 2c 0a 09 09 09 20 20 20 20 20  isions,....     
4f30: 20 23 20 74 61 67 73 2c 20 6f 72 20 62 72 61 6e   # tags, or bran
4f40: 63 68 65 73 20 69 6e 20 74 68 65 20 63 73 65 74  ches in the cset
4f50: 2c 20 61 73 0a 09 09 09 20 20 20 20 20 20 23 20  , as....      # 
4f60: 69 64 73 2e 20 4e 6f 74 20 74 61 67 67 65 64 2e  ids. Not tagged.
4f70: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79  .    variable my
4f80: 74 69 74 65 6d 73 20 20 20 20 7b 7d 20 3b 20 23  titems    {} ; #
4f90: 20 41 73 20 6d 79 69 74 65 6d 73 2c 20 74 68 65   As myitems, the
4fa0: 20 74 61 67 67 65 64 20 66 6f 72 6d 2e 0a 20 20   tagged form..  
4fb0: 20 20 76 61 72 69 61 62 6c 65 20 6d 79 70 6f 73    variable mypos
4fc0: 20 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 43 6f         {} ; # Co
4fd0: 6d 6d 69 74 20 70 6f 73 69 74 69 6f 6e 20 6f 66  mmit position of
4fe0: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 2c 20   the changeset, 
4ff0: 69 66 0a 09 09 09 20 20 20 20 20 20 23 20 6b 6e  if....      # kn
5000: 6f 77 6e 2e 0a 0a 20 20 20 20 23 20 23 20 23 23  own...    # # ##
5010: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23   ### ##### #####
5020: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
5030: 23 0a 20 20 20 20 23 23 20 49 6e 74 65 72 6e 61  #.    ## Interna
5040: 6c 20 6d 65 74 68 6f 64 73 0a 0a 20 20 20 20 74  l methods..    t
5050: 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 6f  ypevariable myco
5060: 75 6e 74 65 72 20 20 20 20 20 20 20 20 30 20 3b  unter        0 ;
5070: 20 23 20 49 64 20 63 6f 75 6e 74 65 72 20 66 6f   # Id counter fo
5080: 72 20 63 73 65 74 73 2e 20 4c 61 73 74 20 69 64  r csets. Last id
5090: 0a 09 09 09 09 20 20 20 20 20 20 23 20 75 73 65  .....      # use
50a0: 64 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69 61  d..    typevaria
50b0: 62 6c 65 20 6d 79 63 73 74 79 70 65 20 2d 61 72  ble mycstype -ar
50c0: 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 63  ray {} ; # Map c
50d0: 73 74 79 70 65 73 20 28 6e 61 6d 65 73 29 20 74  stypes (names) t
50e0: 6f 20 70 65 72 73 69 73 74 65 6e 74 0a 09 09 09  o persistent....
50f0: 09 20 20 20 20 20 20 23 20 69 64 73 2e 20 4e 6f  .      # ids. No
5100: 74 65 20 74 68 61 74 20 77 65 20 68 61 76 65 20  te that we have 
5110: 74 6f 20 6b 65 65 70 0a 09 09 09 09 20 20 20 20  to keep.....    
5120: 20 20 23 20 74 68 65 20 6e 61 6d 65 73 20 69 6e    # the names in
5130: 20 74 68 65 20 74 61 62 6c 65 20 27 63 73 74 79   the table 'csty
5140: 70 65 27 0a 09 09 09 09 20 20 20 20 20 20 23 20  pe'.....      # 
5150: 69 6e 20 73 79 6e 63 20 77 69 74 68 20 74 68 65  in sync with the
5160: 20 6e 61 6d 65 73 20 6f 66 20 74 68 65 0a 09 09   names of the...
5170: 09 09 20 20 20 20 20 20 23 20 68 65 6c 70 65 72  ..      # helper
5180: 20 73 69 6e 67 6c 65 74 6f 6e 73 2e 0a 0a 20 20   singletons...  
5190: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 6e 6f    typemethod ino
51a0: 72 64 65 72 20 7b 70 72 6f 6a 65 63 74 69 64 7d  rder {projectid}
51b0: 20 7b 0a 09 23 20 52 65 74 75 72 6e 20 61 6c 6c   {..# Return all
51c0: 20 63 68 61 6e 67 65 73 65 74 73 20 28 6f 62 6a   changesets (obj
51d0: 65 63 74 20 72 65 66 65 72 65 6e 63 65 73 29 20  ect references) 
51e0: 66 6f 72 20 74 68 65 20 73 70 65 63 69 66 69 65  for the specifie
51f0: 64 0a 09 23 20 70 72 6f 6a 65 63 74 2c 20 69 6e  d..# project, in
5200: 20 74 68 65 20 6f 72 64 65 72 20 67 69 76 65 6e   the order given
5210: 20 74 6f 20 74 68 65 6d 20 62 79 20 74 68 65 20   to them by the 
5220: 73 6f 72 74 20 70 61 73 73 65 73 2e 20 42 6f 74  sort passes. Bot
5230: 68 0a 09 23 20 74 68 65 20 66 69 6c 74 65 72 69  h..# the filteri
5240: 6e 67 20 62 79 20 70 72 6f 6a 65 63 74 20 61 6e  ng by project an
5250: 64 20 74 68 65 20 73 6f 72 74 69 6e 67 20 62 79  d the sorting by
5260: 20 74 69 6d 65 20 6d 61 6b 65 20 74 68 65 0a 09   time make the..
5270: 23 20 75 73 65 20 6f 66 20 27 70 72 6f 6a 65 63  # use of 'projec
5280: 74 3a 3a 72 65 76 20 72 65 76 27 20 69 6d 70 6f  t::rev rev' impo
5290: 73 73 69 62 6c 65 2e 0a 0a 09 73 65 74 20 72 65  ssible....set re
52a0: 73 20 7b 7d 0a 09 73 74 61 74 65 20 66 6f 72 65  s {}..state fore
52b0: 61 63 68 72 6f 77 20 7b 0a 09 20 20 20 20 53 45  achrow {..    SE
52c0: 4c 45 43 54 20 43 2e 63 69 64 20 20 41 53 20 78  LECT C.cid  AS x
52d0: 63 69 64 2c 0a 09 20 20 20 20 20 20 20 20 20 20  cid,..          
52e0: 20 54 2e 64 61 74 65 20 41 53 20 63 64 61 74 65   T.date AS cdate
52f0: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 63 68 61  ..    FROM   cha
5300: 6e 67 65 73 65 74 20 43 2c 20 63 73 74 69 6d 65  ngeset C, cstime
5310: 73 74 61 6d 70 20 54 0a 09 20 20 20 20 57 48 45  stamp T..    WHE
5320: 52 45 20 20 43 2e 70 69 64 20 20 3d 20 24 70 72  RE  C.pid  = $pr
5330: 6f 6a 65 63 74 69 64 20 2d 2d 20 6c 69 6d 69 74  ojectid -- limit
5340: 20 74 6f 20 63 68 61 6e 67 65 73 65 74 73 20 69   to changesets i
5350: 6e 20 70 72 6f 6a 65 63 74 0a 09 20 20 20 20 41  n project..    A
5360: 4e 44 20 20 20 20 54 2e 63 69 64 20 20 3d 20 43  ND    T.cid  = C
5370: 2e 63 69 64 20 20 20 20 20 20 2d 2d 20 67 65 74  .cid      -- get
5380: 20 6f 72 64 65 72 69 6e 67 20 69 6e 66 6f 72 6d   ordering inform
5390: 61 74 69 6f 6e 0a 09 20 20 20 20 4f 52 44 45 52  ation..    ORDER
53a0: 20 42 59 20 54 2e 64 61 74 65 20 20 20 20 20 20   BY T.date      
53b0: 20 20 20 20 20 20 2d 2d 20 73 6f 72 74 20 69 6e        -- sort in
53c0: 74 6f 20 63 6f 6d 6d 69 74 20 6f 72 64 65 72 0a  to commit order.
53d0: 09 7d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e  .} {..    lappen
53e0: 64 20 72 65 73 20 24 6d 79 69 64 6d 61 70 28 24  d res $myidmap($
53f0: 78 63 69 64 29 20 24 63 64 61 74 65 0a 09 7d 0a  xcid) $cdate..}.
5400: 09 72 65 74 75 72 6e 20 24 72 65 73 0a 20 20 20  .return $res.   
5410: 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68   }..    typemeth
5420: 6f 64 20 67 65 74 63 73 74 79 70 65 73 20 7b 7d  od getcstypes {}
5430: 20 7b 0a 09 73 74 61 74 65 20 66 6f 72 65 61 63   {..state foreac
5440: 68 72 6f 77 20 7b 0a 09 20 20 20 20 53 45 4c 45  hrow {..    SELE
5450: 43 54 20 74 69 64 2c 20 6e 61 6d 65 20 46 52 4f  CT tid, name FRO
5460: 4d 20 63 73 74 79 70 65 3b 0a 09 7d 20 7b 20 73  M cstype;..} { s
5470: 65 74 20 6d 79 63 73 74 79 70 65 28 24 6e 61 6d  et mycstype($nam
5480: 65 29 20 24 74 69 64 20 7d 0a 09 72 65 74 75 72  e) $tid }..retur
5490: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70  n.    }..    typ
54a0: 65 6d 65 74 68 6f 64 20 6c 6f 61 64 20 7b 72 65  emethod load {re
54b0: 70 6f 73 69 74 6f 72 79 7d 20 7b 0a 09 73 65 74  pository} {..set
54c0: 20 6e 20 30 0a 09 6c 6f 67 20 77 72 69 74 65 20   n 0..log write 
54d0: 32 20 63 73 65 74 73 20 7b 4c 6f 61 64 69 6e 67  2 csets {Loading
54e0: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 73 7d   the changesets}
54f0: 0a 09 73 74 61 74 65 20 66 6f 72 65 61 63 68 72  ..state foreachr
5500: 6f 77 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54  ow {..    SELECT
5510: 20 43 2e 63 69 64 20 20 20 41 53 20 69 64 2c 0a   C.cid   AS id,.
5520: 09 20 20 20 20 20 20 20 20 20 20 20 43 2e 70 69  .           C.pi
5530: 64 20 20 20 41 53 20 78 70 69 64 2c 0a 20 20 20  d   AS xpid,.   
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5550: 43 53 2e 6e 61 6d 65 20 41 53 20 63 73 74 79 70  CS.name AS cstyp
5560: 65 2c 0a 09 20 20 20 20 20 20 20 20 20 20 20 43  e,..           C
5570: 2e 73 72 63 20 20 20 41 53 20 73 72 63 69 64 0a  .src   AS srcid.
5580: 09 20 20 20 20 46 52 4f 4d 20 20 20 63 68 61 6e  .    FROM   chan
5590: 67 65 73 65 74 20 43 2c 20 63 73 74 79 70 65 20  geset C, cstype 
55a0: 43 53 0a 09 20 20 20 20 57 48 45 52 45 20 20 43  CS..    WHERE  C
55b0: 2e 74 79 70 65 20 3d 20 43 53 2e 74 69 64 0a 09  .type = CS.tid..
55c0: 20 20 20 20 4f 52 44 45 52 20 42 59 20 43 2e 63      ORDER BY C.c
55d0: 69 64 0a 09 7d 20 7b 0a 09 20 20 20 20 6c 6f 67  id..} {..    log
55e0: 20 70 72 6f 67 72 65 73 73 20 32 20 63 73 65 74   progress 2 cset
55f0: 73 20 24 6e 20 7b 7d 0a 09 20 20 20 20 73 65 74  s $n {}..    set
5600: 20 72 20 5b 24 74 79 70 65 20 25 41 55 54 4f 25   r [$type %AUTO%
5610: 20 5b 24 72 65 70 6f 73 69 74 6f 72 79 20 70 72   [$repository pr
5620: 6f 6a 65 63 74 6f 66 20 24 78 70 69 64 5d 20 24  ojectof $xpid] $
5630: 63 73 74 79 70 65 20 24 73 72 63 69 64 20 5b 73  cstype $srcid [s
5640: 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 53 45 4c  tate run {...SEL
5650: 45 43 54 20 43 2e 69 69 64 0a 09 09 46 52 4f 4d  ECT C.iid...FROM
5660: 20 20 20 63 73 69 74 65 6d 20 43 0a 09 09 57 48     csitem C...WH
5670: 45 52 45 20 20 43 2e 63 69 64 20 3d 20 24 69 64  ERE  C.cid = $id
5680: 0a 09 09 4f 52 44 45 52 20 42 59 20 43 2e 70 6f  ...ORDER BY C.po
5690: 73 0a 09 20 20 20 20 7d 5d 20 24 69 64 5d 0a 09  s..    }] $id]..
56a0: 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 09 72      incr n..}..r
56b0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
56c0: 20 74 79 70 65 6d 65 74 68 6f 64 20 6c 6f 61 64   typemethod load
56d0: 63 6f 75 6e 74 65 72 20 7b 7d 20 7b 0a 09 23 20  counter {} {..# 
56e0: 49 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 63  Initialize the c
56f0: 6f 75 6e 74 65 72 20 66 72 6f 6d 20 74 68 65 20  ounter from the 
5700: 73 74 61 74 65 0a 09 6c 6f 67 20 77 72 69 74 65  state..log write
5710: 20 32 20 63 73 65 74 73 20 7b 4c 6f 61 64 69 6e   2 csets {Loadin
5720: 67 20 63 68 61 6e 67 65 73 65 74 20 63 6f 75 6e  g changeset coun
5730: 74 65 72 7d 0a 09 73 65 74 20 6d 79 63 6f 75 6e  ter}..set mycoun
5740: 74 65 72 20 5b 73 74 61 74 65 20 6f 6e 65 20 7b  ter [state one {
5750: 20 53 45 4c 45 43 54 20 4d 41 58 28 63 69 64 29   SELECT MAX(cid)
5760: 20 46 52 4f 4d 20 63 68 61 6e 67 65 73 65 74 20   FROM changeset 
5770: 7d 5d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d  }]..return.    }
5780: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ..    typemethod
5790: 20 6e 75 6d 20 7b 7d 20 7b 20 72 65 74 75 72 6e   num {} { return
57a0: 20 24 6d 79 63 6f 75 6e 74 65 72 20 7d 0a 0a 20   $mycounter }.. 
57b0: 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23     # # ## ### ##
57c0: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23  ### ######## ###
57d0: 23 23 23 23 23 23 23 23 23 23 0a 0a 20 20 20 20  ##########..    
57e0: 6d 65 74 68 6f 64 20 43 72 65 61 74 65 46 72 6f  method CreateFro
57f0: 6d 46 72 61 67 6d 65 6e 74 73 20 7b 66 72 61 67  mFragments {frag
5800: 6d 65 6e 74 73 20 63 76 20 62 76 7d 20 7b 0a 09  ments cv bv} {..
5810: 75 70 76 61 72 20 31 20 24 63 76 20 63 6f 75 6e  upvar 1 $cv coun
5820: 74 65 72 20 24 62 76 20 62 72 65 61 6b 73 0a 09  ter $bv breaks..
5830: 55 6e 6d 61 70 49 74 65 6d 73 20 24 6d 79 74 79  UnmapItems $myty
5840: 70 65 20 24 6d 79 69 74 65 6d 73 0a 0a 09 23 20  pe $myitems...# 
5850: 43 72 65 61 74 65 20 63 68 61 6e 67 65 73 65 74  Create changeset
5860: 73 20 66 6f 72 20 74 68 65 20 66 72 61 67 6d 65  s for the fragme
5870: 6e 74 73 2c 20 72 65 75 73 69 6e 67 20 74 68 65  nts, reusing the
5880: 20 63 75 72 72 65 6e 74 20 6f 6e 65 0a 09 23 20   current one..# 
5890: 66 6f 72 20 74 68 65 20 66 69 72 73 74 20 66 72  for the first fr
58a0: 61 67 6d 65 6e 74 2e 20 57 65 20 73 6f 72 74 20  agment. We sort 
58b0: 74 68 65 6d 20 69 6e 20 6f 72 64 65 72 20 74 6f  them in order to
58c0: 20 61 6c 6c 6f 77 0a 09 23 20 63 68 65 63 6b 69   allow..# checki
58d0: 6e 67 20 66 6f 72 20 67 61 70 73 20 61 6e 64 20  ng for gaps and 
58e0: 6e 69 63 65 20 6d 65 73 73 61 67 65 73 2e 0a 0a  nice messages...
58f0: 09 73 65 74 20 6e 65 77 63 73 65 74 73 20 20 7b  .set newcsets  {
5900: 7d 0a 09 73 65 74 20 66 72 61 67 6d 65 6e 74 73  }..set fragments
5910: 20 5b 6c 73 6f 72 74 20 2d 69 6e 64 65 78 20 30   [lsort -index 0
5920: 20 2d 69 6e 74 65 67 65 72 20 24 66 72 61 67 6d   -integer $fragm
5930: 65 6e 74 73 5d 0a 0a 09 23 70 75 74 73 20 5c 74  ents]...#puts \t
5940: 2e 5b 6a 6f 69 6e 20 5b 50 52 73 20 24 66 72 61  .[join [PRs $fra
5950: 67 6d 65 6e 74 73 5d 20 2e 5c 6e 5c 74 2e 5d 2e  gments] .\n\t.].
5960: 0a 0a 09 42 6f 72 64 65 72 20 5b 6c 69 6e 64 65  ...Border [linde
5970: 78 20 24 66 72 61 67 6d 65 6e 74 73 20 30 5d 20  x $fragments 0] 
5980: 66 69 72 73 74 73 20 66 69 72 73 74 65 0a 0a 09  firsts firste...
5990: 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74  integrity assert
59a0: 20 7b 0a 09 20 20 20 20 24 66 69 72 73 74 73 20   {..    $firsts 
59b0: 3d 3d 20 30 0a 09 7d 20 7b 42 61 64 20 66 72 61  == 0..} {Bad fra
59c0: 67 6d 65 6e 74 20 73 74 61 72 74 20 40 20 24 66  gment start @ $f
59d0: 69 72 73 74 73 2c 20 67 61 70 2c 20 6f 72 20 62  irsts, gap, or b
59e0: 65 66 6f 72 65 20 62 65 67 69 6e 6e 69 6e 67 20  efore beginning 
59f0: 6f 66 20 74 68 65 20 72 61 6e 67 65 7d 0a 0a 09  of the range}...
5a00: 73 65 74 20 6c 61 73 74 65 20 24 66 69 72 73 74  set laste $first
5a10: 65 0a 09 66 6f 72 65 61 63 68 20 66 72 61 67 6d  e..foreach fragm
5a20: 65 6e 74 20 5b 6c 72 61 6e 67 65 20 24 66 72 61  ent [lrange $fra
5a30: 67 6d 65 6e 74 73 20 31 20 65 6e 64 5d 20 7b 0a  gments 1 end] {.
5a40: 09 20 20 20 20 42 6f 72 64 65 72 20 24 66 72 61  .    Border $fra
5a50: 67 6d 65 6e 74 20 73 20 65 0a 09 20 20 20 20 69  gment s e..    i
5a60: 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20  ntegrity assert 
5a70: 7b 0a 09 09 24 6c 61 73 74 65 20 3d 3d 20 28 24  {...$laste == ($
5a80: 73 20 2d 20 31 29 0a 09 20 20 20 20 7d 20 7b 42  s - 1)..    } {B
5a90: 61 64 20 66 72 61 67 6d 65 6e 74 20 62 6f 72 64  ad fragment bord
5aa0: 65 72 20 3c 24 6c 61 73 74 65 20 7c 20 24 73 3e  er <$laste | $s>
5ab0: 2c 20 67 61 70 20 6f 72 20 6f 76 65 72 6c 61 70  , gap or overlap
5ac0: 7d 0a 0a 09 20 20 20 20 73 65 74 20 6e 65 77 20  }...    set new 
5ad0: 5b 24 74 79 70 65 20 25 41 55 54 4f 25 20 24 6d  [$type %AUTO% $m
5ae0: 79 70 72 6f 6a 65 63 74 20 24 6d 79 74 79 70 65  yproject $mytype
5af0: 20 24 6d 79 73 72 63 69 64 20 5b 6c 72 61 6e 67   $mysrcid [lrang
5b00: 65 20 24 6d 79 69 74 65 6d 73 20 24 73 20 24 65  e $myitems $s $e
5b10: 5d 5d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20  ]]..    lappend 
5b20: 6e 65 77 63 73 65 74 73 20 24 6e 65 77 0a 09 20  newcsets $new.. 
5b30: 20 20 20 69 6e 63 72 20 63 6f 75 6e 74 65 72 0a     incr counter.
5b40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 67  .            log
5b50: 20 77 72 69 74 65 20 34 20 63 73 65 74 73 20 7b   write 4 csets {
5b60: 42 72 65 61 6b 69 6e 67 20 5b 24 73 65 6c 66 20  Breaking [$self 
5b70: 73 74 72 20 5d 20 40 20 24 6c 61 73 74 65 2c 20  str ] @ $laste, 
5b80: 6e 65 77 20 5b 24 6e 65 77 20 73 74 72 5d 2c 20  new [$new str], 
5b90: 63 75 74 74 69 6e 67 20 24 62 72 65 61 6b 73 28  cutting $breaks(
5ba0: 24 6c 61 73 74 65 29 7d 0a 0a 09 20 20 20 20 73  $laste)}...    s
5bb0: 65 74 20 6c 61 73 74 65 20 24 65 0a 09 7d 0a 0a  et laste $e..}..
5bc0: 09 69 6e 74 65 67 72 69 74 79 20 61 73 73 65 72  .integrity asser
5bd0: 74 20 7b 0a 09 20 20 20 20 24 6c 61 73 74 65 20  t {..    $laste 
5be0: 3d 3d 20 28 5b 6c 6c 65 6e 67 74 68 20 24 6d 79  == ([llength $my
5bf0: 69 74 65 6d 73 5d 2d 31 29 0a 09 7d 20 7b 42 61  items]-1)..} {Ba
5c00: 64 20 66 72 61 67 6d 65 6e 74 20 65 6e 64 20 40  d fragment end @
5c10: 20 24 6c 61 73 74 65 2c 20 67 61 70 2c 20 6f 72   $laste, gap, or
5c20: 20 62 65 79 6f 6e 64 20 65 6e 64 20 6f 66 20 74   beyond end of t
5c30: 68 65 20 72 61 6e 67 65 7d 0a 0a 09 23 20 50 75  he range}...# Pu
5c40: 74 20 74 68 65 20 66 69 72 73 74 20 66 72 61 67  t the first frag
5c50: 6d 65 6e 74 20 69 6e 74 6f 20 74 68 65 20 63 75  ment into the cu
5c60: 72 72 65 6e 74 20 63 68 61 6e 67 65 73 65 74 2c  rrent changeset,
5c70: 20 61 6e 64 0a 09 23 20 75 70 64 61 74 65 20 74   and..# update t
5c80: 68 65 20 69 6e 2d 6d 65 6d 6f 72 79 20 69 6e 64  he in-memory ind
5c90: 65 78 2e 20 57 65 20 63 61 6e 20 73 69 6d 70 6c  ex. We can simpl
5ca0: 79 20 28 72 65 29 61 64 64 20 74 68 65 20 69 74  y (re)add the it
5cb0: 65 6d 73 0a 09 23 20 62 65 63 61 75 73 65 20 77  ems..# because w
5cc0: 65 20 63 6c 65 61 72 65 64 20 74 68 65 20 70 72  e cleared the pr
5cd0: 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74 69 6e  eviously existin
5ce0: 67 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2c 20 73  g information, s
5cf0: 65 65 0a 09 23 20 27 55 6e 6d 61 70 49 74 65 6d  ee..# 'UnmapItem
5d00: 73 27 20 61 62 6f 76 65 2e 20 50 65 72 73 69 73  s' above. Persis
5d10: 74 65 6e 63 65 20 64 6f 65 73 20 6e 6f 74 20 6d  tence does not m
5d20: 61 74 74 65 72 20 68 65 72 65 2c 20 6e 6f 6e 65  atter here, none
5d30: 0a 09 23 20 6f 66 20 74 68 65 20 63 68 61 6e 67  ..# of the chang
5d40: 65 73 65 74 73 20 68 61 73 20 62 65 65 6e 20 73  esets has been s
5d50: 61 76 65 64 20 74 6f 20 74 68 65 20 70 65 72 73  aved to the pers
5d60: 69 73 74 65 6e 74 20 73 74 61 74 65 0a 09 23 20  istent state..# 
5d70: 79 65 74 2e 0a 0a 09 73 65 74 20 6d 79 69 74 65  yet....set myite
5d80: 6d 73 20 20 5b 6c 72 61 6e 67 65 20 24 6d 79 69  ms  [lrange $myi
5d90: 74 65 6d 73 20 20 30 20 24 66 69 72 73 74 65 5d  tems  0 $firste]
5da0: 0a 09 73 65 74 20 6d 79 74 69 74 65 6d 73 20 5b  ..set mytitems [
5db0: 6c 72 61 6e 67 65 20 24 6d 79 74 69 74 65 6d 73  lrange $mytitems
5dc0: 20 30 20 24 66 69 72 73 74 65 5d 0a 09 4d 61 70   0 $firste]..Map
5dd0: 49 74 65 6d 73 20 24 6d 79 74 79 70 65 20 24 6d  Items $mytype $m
5de0: 79 69 74 65 6d 73 0a 09 72 65 74 75 72 6e 20 24  yitems..return $
5df0: 6e 65 77 63 73 65 74 73 0a 20 20 20 20 7d 0a 0a  newcsets.    }..
5e00: 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23      # # ## ### #
5e10: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23  #### ######## ##
5e20: 23 23 23 23 23 23 23 23 23 23 23 0a 0a 20 20 20  ###########..   
5e30: 20 70 72 6f 63 20 42 72 65 61 6b 44 69 72 65 63   proc BreakDirec
5e40: 74 44 65 70 65 6e 64 65 6e 63 69 65 73 20 7b 74  tDependencies {t
5e50: 68 65 69 74 65 6d 73 20 62 76 7d 20 7b 0a 09 75  heitems bv} {..u
5e60: 70 76 61 72 20 31 20 6d 79 74 79 70 65 6f 62 6a  pvar 1 mytypeobj
5e70: 20 6d 79 74 79 70 65 6f 62 6a 20 73 65 6c 66 20   mytypeobj self 
5e80: 73 65 6c 66 20 24 62 76 20 62 72 65 61 6b 73 0a  self $bv breaks.
5e90: 0a 09 23 20 41 72 72 61 79 20 6f 66 20 64 65 70  ..# Array of dep
5ea0: 65 6e 64 65 6e 63 69 65 73 20 28 70 61 72 65 6e  endencies (paren
5eb0: 74 20 2d 3e 20 63 68 69 6c 64 29 2e 20 54 68 69  t -> child). Thi
5ec0: 73 20 69 73 20 70 75 6c 6c 65 64 20 66 72 6f 6d  s is pulled from
5ed0: 0a 09 23 20 74 68 65 20 73 74 61 74 65 2c 20 61  ..# the state, a
5ee0: 6e 64 20 6c 69 6d 69 74 65 64 20 74 6f 20 73 75  nd limited to su
5ef0: 63 63 65 73 73 6f 72 73 20 77 69 74 68 69 6e 20  ccessors within 
5f00: 74 68 65 20 63 68 61 6e 67 65 73 65 74 2e 0a 0a  the changeset...
5f10: 09 61 72 72 61 79 20 73 65 74 20 64 65 70 65 6e  .array set depen
5f20: 64 65 6e 63 69 65 73 20 7b 7d 0a 0a 09 24 6d 79  dencies {}...$my
5f30: 74 79 70 65 6f 62 6a 20 69 6e 74 65 72 6e 61 6c  typeobj internal
5f40: 73 75 63 63 65 73 73 6f 72 73 20 64 65 70 65 6e  successors depen
5f50: 64 65 6e 63 69 65 73 20 24 74 68 65 69 74 65 6d  dencies $theitem
5f60: 73 0a 09 69 66 20 7b 21 5b 61 72 72 61 79 20 73  s..if {![array s
5f70: 69 7a 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73  ize dependencies
5f80: 5d 7d 20 7b 0a 09 20 20 20 20 72 65 74 75 72 6e  ]} {..    return
5f90: 20 7b 7d 0a 09 7d 20 3b 20 23 20 4e 6f 74 68 69   {}..} ; # Nothi
5fa0: 6e 67 20 74 6f 20 62 72 65 61 6b 2e 0a 0a 09 6c  ng to break....l
5fb0: 6f 67 20 77 72 69 74 65 20 35 20 63 73 65 74 73  og write 5 csets
5fc0: 20 2e 2e 2e 5b 24 73 65 6c 66 20 73 74 72 5d 2e   ...[$self str].
5fd0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
5fe0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
5ff0: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e  ................
6000: 2e 2e 2e 2e 2e 2e 0a 09 76 63 3a 3a 74 6f 6f 6c  ........vc::tool
6010: 73 3a 3a 6d 65 6d 3a 3a 6d 61 72 6b 0a 0a 09 72  s::mem::mark...r
6020: 65 74 75 72 6e 20 5b 42 72 65 61 6b 65 72 43 6f  eturn [BreakerCo
6030: 72 65 20 24 74 68 65 69 74 65 6d 73 20 64 65 70  re $theitems dep
6040: 65 6e 64 65 6e 63 69 65 73 20 62 72 65 61 6b 73  endencies breaks
6050: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f  ].    }..    pro
6060: 63 20 42 72 65 61 6b 65 72 43 6f 72 65 20 7b 74  c BreakerCore {t
6070: 68 65 69 74 65 6d 73 20 64 76 20 62 76 7d 20 7b  heitems dv bv} {
6080: 0a 09 23 20 42 72 65 61 6b 20 61 20 73 65 74 20  ..# Break a set 
6090: 6f 66 20 72 65 76 69 73 69 6f 6e 73 20 69 6e 74  of revisions int
60a0: 6f 20 66 72 61 67 6d 65 6e 74 73 20 77 68 69 63  o fragments whic
60b0: 68 20 68 61 76 65 20 6e 6f 0a 09 23 20 69 6e 74  h have no..# int
60c0: 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69  ernal dependenci
60d0: 65 73 2e 0a 0a 09 23 20 57 65 20 70 65 72 66 6f  es....# We perfo
60e0: 72 6d 20 61 6c 6c 20 6e 65 63 65 73 73 61 72 79  rm all necessary
60f0: 20 73 70 6c 69 74 73 20 69 6e 20 6f 6e 65 20 67   splits in one g
6100: 6f 2c 20 69 6e 73 74 65 61 64 20 6f 66 20 6f 6e  o, instead of on
6110: 6c 79 0a 09 23 20 6f 6e 65 2e 20 54 68 65 20 70  ly..# one. The p
6120: 72 65 76 69 6f 75 73 20 61 6c 67 6f 72 69 74 68  revious algorith
6130: 6d 2c 20 61 64 61 70 74 65 64 20 66 72 6f 6d 20  m, adapted from 
6140: 63 76 73 32 73 76 6e 2c 20 63 6f 6d 70 75 74 65  cvs2svn, compute
6150: 64 0a 09 23 20 61 20 6c 6f 74 20 6f 66 20 73 74  d..# a lot of st
6160: 61 74 65 20 77 68 69 63 68 20 77 61 73 20 74 68  ate which was th
6170: 72 6f 77 6e 20 61 77 61 79 20 61 6e 64 20 74 68  rown away and th
6180: 65 6e 20 63 6f 6d 70 75 74 65 64 20 61 67 61 69  en computed agai
6190: 6e 0a 09 23 20 66 6f 72 20 65 61 63 68 20 6f 66  n..# for each of
61a0: 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 2e 20   the fragments. 
61b0: 49 74 20 73 68 6f 75 6c 64 20 62 65 20 65 61 73  It should be eas
61c0: 69 65 72 20 74 6f 20 75 70 64 61 74 65 20 61 6e  ier to update an
61d0: 64 0a 09 23 20 72 65 75 73 65 20 74 68 61 74 20  d..# reuse that 
61e0: 73 74 61 74 65 2e 0a 0a 09 75 70 76 61 72 20 31  state....upvar 1
61f0: 20 24 64 76 20 64 65 70 65 6e 64 65 6e 63 69 65   $dv dependencie
6200: 73 20 24 62 76 20 62 72 65 61 6b 73 0a 0a 09 23  s $bv breaks...#
6210: 20 57 65 20 68 61 76 65 20 69 6e 74 65 72 6e 61   We have interna
6220: 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74  l dependencies t
6230: 6f 20 62 72 65 61 6b 2e 20 57 65 20 6e 6f 77 20  o break. We now 
6240: 69 74 65 72 61 74 65 20 6f 76 65 72 0a 09 23 20  iterate over..# 
6250: 61 6c 6c 20 70 6f 73 69 74 69 6f 6e 73 20 69 6e  all positions in
6260: 20 74 68 65 20 6c 69 73 74 20 28 77 68 69 63 68   the list (which
6270: 20 69 73 20 63 68 72 6f 6e 6f 6c 6f 67 69 63 61   is chronologica
6280: 6c 2c 20 61 74 20 6c 65 61 73 74 0a 09 23 20 61  l, at least..# a
6290: 73 20 66 61 72 20 61 73 20 74 68 65 20 74 69 6d  s far as the tim
62a0: 65 73 74 61 6d 70 73 20 61 72 65 20 63 6f 72 72  estamps are corr
62b0: 65 63 74 20 61 6e 64 20 75 6e 69 71 75 65 29 20  ect and unique) 
62c0: 61 6e 64 0a 09 23 20 64 65 74 65 72 6d 69 6e 65  and..# determine
62d0: 20 74 68 65 20 62 65 73 74 20 70 6f 73 69 74 69   the best positi
62e0: 6f 6e 20 66 6f 72 20 74 68 65 20 62 72 65 61 6b  on for the break
62f0: 2c 20 62 79 20 74 72 79 69 6e 67 20 74 6f 0a 09  , by trying to..
6300: 23 20 62 72 65 61 6b 20 61 73 20 6d 61 6e 79 20  # break as many 
6310: 64 65 70 65 6e 64 65 6e 63 69 65 73 20 61 73 20  dependencies as 
6320: 70 6f 73 73 69 62 6c 65 20 69 6e 20 6f 6e 65 20  possible in one 
6330: 67 6f 2e 20 57 68 65 6e 20 61 0a 09 23 20 62 72  go. When a..# br
6340: 65 61 6b 20 77 61 73 20 66 6f 75 6e 64 20 74 68  eak was found th
6350: 69 73 20 69 73 20 72 65 64 6f 6e 65 20 66 6f 72  is is redone for
6360: 20 74 68 65 20 66 72 61 67 6d 65 6e 74 73 20 63   the fragments c
6370: 6f 6d 69 6e 67 20 61 6e 64 0a 09 23 20 61 66 74  oming and..# aft
6380: 65 72 2c 20 61 66 74 65 72 20 75 70 64 69 6e 67  er, after upding
6390: 20 74 68 65 20 63 72 6f 73 73 69 6e 67 20 69 6e   the crossing in
63a0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 0a 09 23 20 44  formation....# D
63b0: 61 74 61 20 73 74 72 75 63 74 75 72 65 73 3a 0a  ata structures:.
63c0: 09 23 20 4d 61 70 3a 20 20 50 4f 53 20 20 20 72  .# Map:  POS   r
63d0: 65 76 69 73 69 6f 6e 20 69 64 20 20 20 20 20 20  evision id      
63e0: 2d 3e 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20 6c  -> position in l
63f0: 69 73 74 2e 0a 09 23 20 20 20 20 20 20 20 43 52  ist...#       CR
6400: 4f 53 53 20 70 6f 73 69 74 69 6f 6e 20 69 6e 20  OSS position in 
6410: 6c 69 73 74 20 2d 3e 20 6e 75 6d 62 65 72 20 6f  list -> number o
6420: 66 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 63  f dependencies c
6430: 72 6f 73 73 69 6e 67 20 69 74 0a 09 23 20 20 20  rossing it..#   
6440: 20 20 20 20 44 45 50 43 20 20 64 65 70 65 6e 64      DEPC  depend
6450: 65 6e 63 79 20 20 20 20 20 20 20 2d 3e 20 70 6f  ency       -> po
6460: 73 69 74 69 6f 6e 73 20 69 74 20 63 72 6f 73 73  sitions it cross
6470: 65 73 0a 09 23 20 4c 69 73 74 3a 20 52 41 4e 47  es..# List: RANG
6480: 45 20 4f 66 20 74 68 65 20 70 6f 73 69 74 69 6f  E Of the positio
6490: 6e 73 20 69 74 73 65 6c 66 2e 0a 09 23 20 4d 61  ns itself...# Ma
64a0: 70 3a 20 20 44 45 4c 54 41 20 70 6f 73 69 74 69  p:  DELTA positi
64b0: 6f 6e 20 69 6e 20 6c 69 73 74 20 2d 3e 20 74 69  on in list -> ti
64c0: 6d 65 20 64 65 6c 74 61 20 62 65 74 77 65 65 6e  me delta between
64d0: 20 69 74 73 20 72 65 76 69 73 69 6f 6e 0a 09 23   its revision..#
64e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
64f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6500: 20 61 6e 64 20 74 68 65 20 6e 65 78 74 2c 20 69   and the next, i
6510: 66 20 61 6e 79 2e 0a 09 23 20 41 20 64 65 70 65  f any...# A depe
6520: 6e 64 65 6e 63 79 20 69 73 20 61 20 73 69 6e 67  ndency is a sing
6530: 6c 65 2d 65 6c 65 6d 65 6e 74 20 6d 61 70 20 70  le-element map p
6540: 61 72 65 6e 74 20 2d 3e 20 63 68 69 6c 64 0a 0a  arent -> child..
6550: 09 23 20 49 6e 69 74 69 61 6c 69 7a 65 42 72 65  .# InitializeBre
6560: 61 6b 53 74 61 74 65 20 69 6e 69 74 69 61 6c 69  akState initiali
6570: 7a 65 73 20 74 68 65 69 72 20 63 6f 6e 74 65 6e  zes their conten
6580: 74 73 20 61 66 74 65 72 0a 09 23 20 75 70 76 61  ts after..# upva
6590: 72 27 69 6e 67 20 74 68 65 6d 20 66 72 6f 6d 20  r'ing them from 
65a0: 74 68 69 73 20 73 63 6f 70 65 2e 20 49 74 20 75  this scope. It u
65b0: 73 65 73 20 74 68 65 20 69 6e 66 6f 72 6d 61 74  ses the informat
65c0: 69 6f 6e 20 69 6e 0a 09 23 20 44 45 50 45 4e 44  ion in..# DEPEND
65d0: 45 4e 43 49 45 53 20 74 6f 20 64 6f 20 73 6f 2e  ENCIES to do so.
65e0: 0a 0a 09 49 6e 69 74 69 61 6c 69 7a 65 42 72 65  ...InitializeBre
65f0: 61 6b 53 74 61 74 65 20 24 74 68 65 69 74 65 6d  akState $theitem
6600: 73 0a 0a 09 73 65 74 20 66 72 61 67 6d 65 6e 74  s...set fragment
6610: 73 20 7b 7d 0a 09 73 65 74 20 6e 65 77 20 20 20  s {}..set new   
6620: 20 20 20 20 5b 6c 69 73 74 20 24 72 61 6e 67 65      [list $range
6630: 5d 0a 0a 09 23 20 49 6e 73 74 65 61 64 20 6f 66  ]...# Instead of
6640: 20 6f 6e 65 20 6c 69 73 74 20 68 6f 6c 64 69 6e   one list holdin
6650: 67 20 62 6f 74 68 20 70 72 6f 63 65 73 73 65 64  g both processed
6660: 20 61 6e 64 20 70 65 6e 64 69 6e 67 0a 09 23 20   and pending..# 
6670: 66 72 61 67 6d 65 6e 74 73 20 77 65 20 75 73 65  fragments we use
6680: 20 74 77 6f 2c 20 6f 6e 65 20 66 6f 72 20 74 68   two, one for th
6690: 65 20 66 72 61 6d 65 6e 74 73 20 74 6f 20 70 72  e framents to pr
66a0: 6f 63 65 73 73 2c 20 6f 6e 65 0a 09 23 20 74 6f  ocess, one..# to
66b0: 20 68 6f 6c 64 20 74 68 65 20 6e 65 77 20 66 72   hold the new fr
66c0: 61 67 6d 65 6e 74 73 2c 20 61 6e 64 20 74 68 65  agments, and the
66d0: 20 6c 61 74 74 65 72 20 69 73 20 63 6f 70 69 65   latter is copie
66e0: 64 20 74 6f 20 74 68 65 0a 09 23 20 66 6f 72 6d  d to the..# form
66f0: 65 72 20 77 68 65 6e 20 74 68 65 79 20 72 75 6e  er when they run
6700: 20 6f 75 74 2e 20 54 68 69 73 20 6b 65 65 70 73   out. This keeps
6710: 20 74 68 65 20 6c 69 73 74 20 6f 66 20 70 65 6e   the list of pen
6720: 64 69 6e 67 0a 09 23 20 66 72 61 67 6d 65 6e 74  ding..# fragment
6730: 73 20 73 68 6f 72 74 20 77 69 74 68 6f 75 74 20  s short without 
6740: 73 61 63 72 69 66 69 63 69 6e 67 20 73 70 65 65  sacrificing spee
6750: 64 20 62 79 20 73 68 69 66 74 69 6e 67 20 73 74  d by shifting st
6760: 75 66 66 0a 09 23 20 64 6f 77 6e 2e 20 57 65 20  uff..# down. We 
6770: 65 73 70 65 63 69 61 6c 6c 79 20 64 72 6f 70 20  especially drop 
6780: 74 68 65 20 6d 65 6d 6f 72 79 20 6f 66 20 66 72  the memory of fr
6790: 61 67 6d 65 6e 74 73 20 62 72 6f 6b 65 6e 0a 09  agments broken..
67a0: 23 20 64 75 72 69 6e 67 20 70 72 6f 63 65 73 73  # during process
67b0: 69 6e 67 20 61 66 74 65 72 20 61 20 73 68 6f 72  ing after a shor
67c0: 74 20 74 69 6d 65 2c 20 69 6e 73 74 65 61 64 20  t time, instead 
67d0: 6f 66 20 6c 65 74 74 69 6e 67 20 69 74 0a 09 23  of letting it..#
67e0: 20 63 6f 6e 73 75 6d 65 20 6d 65 6d 6f 72 79 2e   consume memory.
67f0: 0a 0a 09 77 68 69 6c 65 20 7b 5b 6c 6c 65 6e 67  ...while {[lleng
6800: 74 68 20 24 6e 65 77 5d 7d 20 7b 0a 0a 09 20 20  th $new]} {...  
6810: 20 20 73 65 74 20 70 65 6e 64 69 6e 67 20 24 6e    set pending $n
6820: 65 77 0a 09 20 20 20 20 73 65 74 20 6e 65 77 20  ew..    set new 
6830: 20 20 20 20 7b 7d 0a 09 20 20 20 20 73 65 74 20      {}..    set 
6840: 61 74 20 20 20 20 20 20 30 0a 0a 09 20 20 20 20  at      0...    
6850: 77 68 69 6c 65 20 7b 24 61 74 20 3c 20 5b 6c 6c  while {$at < [ll
6860: 65 6e 67 74 68 20 24 70 65 6e 64 69 6e 67 5d 7d  ength $pending]}
6870: 20 7b 0a 09 09 73 65 74 20 63 75 72 72 65 6e 74   {...set current
6880: 20 5b 6c 69 6e 64 65 78 20 24 70 65 6e 64 69 6e   [lindex $pendin
6890: 67 20 24 61 74 5d 0a 0a 09 09 6c 6f 67 20 77 72  g $at]....log wr
68a0: 69 74 65 20 36 20 63 73 65 74 73 20 7b 2e 20 2e  ite 6 csets {. .
68b0: 20 2e 2e 20 2e 2e 2e 20 2e 2e 2e 2e 2e 20 2e 2e   .. ... ..... ..
68c0: 2e 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 2e  ...... .........
68d0: 2e 2e 2e 2e 7d 0a 09 09 6c 6f 67 20 77 72 69 74  ....}...log writ
68e0: 65 20 36 20 63 73 65 74 73 20 7b 53 63 68 65 64  e 6 csets {Sched
68f0: 75 6c 65 64 20 20 20 5b 6a 6f 69 6e 20 5b 50 52  uled   [join [PR
6900: 73 20 5b 6c 72 61 6e 67 65 20 24 70 65 6e 64 69  s [lrange $pendi
6910: 6e 67 20 24 61 74 20 65 6e 64 5d 5d 20 7b 20 7d  ng $at end]] { }
6920: 5d 7d 0a 09 09 6c 6f 67 20 77 72 69 74 65 20 36  ]}...log write 6
6930: 20 63 73 65 74 73 20 7b 43 6f 6e 73 69 64 65 72   csets {Consider
6940: 69 6e 67 20 5b 50 52 20 24 63 75 72 72 65 6e 74  ing [PR $current
6950: 5d 20 5c 5b 24 61 74 2f 5b 6c 6c 65 6e 67 74 68  ] \[$at/[llength
6960: 20 24 70 65 6e 64 69 6e 67 5d 5c 5d 7d 0a 0a 09   $pending]\]}...
6970: 09 73 65 74 20 62 65 73 74 20 5b 46 69 6e 64 42  .set best [FindB
6980: 65 73 74 42 72 65 61 6b 20 24 63 75 72 72 65 6e  estBreak $curren
6990: 74 5d 0a 0a 09 09 69 66 20 7b 24 62 65 73 74 20  t]....if {$best 
69a0: 3c 20 30 7d 20 7b 0a 09 09 20 20 20 20 23 20 54  < 0} {...    # T
69b0: 68 65 20 69 6e 73 70 65 63 74 65 64 20 72 61 6e  he inspected ran
69c0: 67 65 20 68 61 73 20 6e 6f 20 69 6e 74 65 72 6e  ge has no intern
69d0: 61 6c 0a 09 09 20 20 20 20 23 20 64 65 70 65 6e  al...    # depen
69e0: 64 65 6e 63 69 65 73 2e 20 54 68 69 73 20 69 73  dencies. This is
69f0: 20 61 20 63 6f 6d 70 6c 65 74 65 20 66 72 61 67   a complete frag
6a00: 6d 65 6e 74 2e 0a 09 09 20 20 20 20 6c 61 70 70  ment....    lapp
6a10: 65 6e 64 20 66 72 61 67 6d 65 6e 74 73 20 24 63  end fragments $c
6a20: 75 72 72 65 6e 74 0a 0a 09 09 20 20 20 20 6c 6f  urrent....    lo
6a30: 67 20 77 72 69 74 65 20 36 20 63 73 65 74 73 20  g write 6 csets 
6a40: 22 4e 6f 20 62 72 65 61 6b 73 2c 20 66 69 6e 61  "No breaks, fina
6a50: 6c 22 0a 09 09 7d 20 65 6c 73 65 20 7b 0a 09 09  l"...} else {...
6a60: 20 20 20 20 23 20 53 70 6c 69 74 20 74 68 65 20      # Split the 
6a70: 72 61 6e 67 65 20 61 6e 64 20 73 63 68 65 64 75  range and schedu
6a80: 6c 65 20 74 68 65 20 72 65 73 75 6c 74 69 6e 67  le the resulting
6a90: 0a 09 09 20 20 20 20 23 20 66 72 61 67 6d 65 6e  ...    # fragmen
6aa0: 74 73 20 66 6f 72 20 66 75 72 74 68 65 72 20 69  ts for further i
6ab0: 6e 73 70 65 63 74 69 6f 6e 2e 20 52 65 6d 65 6d  nspection. Remem
6ac0: 62 65 72 20 74 68 65 0a 09 09 20 20 20 20 23 20  ber the...    # 
6ad0: 6e 75 6d 62 65 72 20 6f 66 20 64 65 70 65 6e 64  number of depend
6ae0: 65 6e 63 69 65 73 20 63 75 74 20 62 65 66 6f 72  encies cut befor
6af0: 65 20 77 65 20 72 65 6d 6f 76 65 20 74 68 65 6d  e we remove them
6b00: 0a 09 09 20 20 20 20 23 20 66 72 6f 6d 20 63 6f  ...    # from co
6b10: 6e 73 69 64 65 72 61 74 69 6f 6e 2c 20 66 6f 72  nsideration, for
6b20: 20 64 6f 63 75 6d 65 6e 74 61 74 69 6f 6e 20 6c   documentation l
6b30: 61 74 65 72 2e 0a 0a 09 09 20 20 20 20 73 65 74  ater.....    set
6b40: 20 62 72 65 61 6b 73 28 24 62 65 73 74 29 20 24   breaks($best) $
6b50: 63 72 6f 73 73 28 24 62 65 73 74 29 0a 0a 09 09  cross($best)....
6b60: 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 36 20      log write 6 
6b70: 63 73 65 74 73 20 22 42 65 73 74 20 62 72 65 61  csets "Best brea
6b80: 6b 20 40 20 24 62 65 73 74 2c 20 63 75 74 74 69  k @ $best, cutti
6b90: 6e 67 20 5b 6e 73 70 20 24 63 72 6f 73 73 28 24  ng [nsp $cross($
6ba0: 62 65 73 74 29 20 64 65 70 65 6e 64 65 6e 63 79  best) dependency
6bb0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 5d 22 0a   dependencies]".
6bc0: 0a 09 09 20 20 20 20 23 20 4e 6f 74 65 3a 20 54  ...    # Note: T
6bd0: 68 65 20 76 61 6c 75 65 20 6f 66 20 62 65 73 74  he value of best
6be0: 20 69 73 20 61 6e 20 61 62 6f 6c 75 74 65 20 6c   is an abolute l
6bf0: 6f 63 61 74 69 6f 6e 0a 09 09 20 20 20 20 23 20  ocation...    # 
6c00: 69 6e 20 6d 79 69 74 65 6d 73 2e 20 55 73 65 20  in myitems. Use 
6c10: 74 68 65 20 73 74 61 72 74 20 6f 66 20 63 75 72  the start of cur
6c20: 72 65 6e 74 20 74 6f 20 6d 61 6b 65 20 69 74 0a  rent to make it.
6c30: 09 09 20 20 20 20 23 20 61 6e 20 69 6e 64 65 78  ..    # an index
6c40: 20 61 62 73 6f 6c 75 74 65 20 74 6f 20 63 75 72   absolute to cur
6c50: 72 65 6e 74 2e 0a 0a 09 09 20 20 20 20 73 65 74  rent.....    set
6c60: 20 62 72 65 6c 20 5b 65 78 70 72 20 7b 24 62 65   brel [expr {$be
6c70: 73 74 20 2d 20 5b 6c 69 6e 64 65 78 20 24 63 75  st - [lindex $cu
6c80: 72 72 65 6e 74 20 30 5d 7d 5d 0a 09 09 20 20 20  rrent 0]}]...   
6c90: 20 73 65 74 20 62 6e 65 78 74 20 24 62 72 65 6c   set bnext $brel
6ca0: 20 3b 20 69 6e 63 72 20 62 6e 65 78 74 0a 09 09   ; incr bnext...
6cb0: 20 20 20 20 73 65 74 20 66 72 61 67 62 65 66 6f      set fragbefo
6cc0: 72 65 20 5b 6c 72 61 6e 67 65 20 24 63 75 72 72  re [lrange $curr
6cd0: 65 6e 74 20 30 20 24 62 72 65 6c 5d 0a 09 09 20  ent 0 $brel]... 
6ce0: 20 20 20 73 65 74 20 66 72 61 67 61 66 74 65 72     set fragafter
6cf0: 20 20 5b 6c 72 61 6e 67 65 20 24 63 75 72 72 65    [lrange $curre
6d00: 6e 74 20 24 62 6e 65 78 74 20 65 6e 64 5d 0a 0a  nt $bnext end]..
6d10: 09 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20  ..    log write 
6d20: 36 20 63 73 65 74 73 20 22 4e 65 77 20 70 69 65  6 csets "New pie
6d30: 63 65 73 20 20 5b 50 52 20 24 66 72 61 67 62 65  ces  [PR $fragbe
6d40: 66 6f 72 65 5d 20 5b 50 52 20 24 66 72 61 67 61  fore] [PR $fraga
6d50: 66 74 65 72 5d 22 0a 0a 09 09 20 20 20 20 69 6e  fter]"....    in
6d60: 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b  tegrity assert {
6d70: 5b 6c 6c 65 6e 67 74 68 20 24 66 72 61 67 62 65  [llength $fragbe
6d80: 66 6f 72 65 5d 7d 20 7b 46 6f 75 6e 64 20 7a 65  fore]} {Found ze
6d90: 72 6f 2d 6c 65 6e 67 74 68 20 66 72 61 67 6d 65  ro-length fragme
6da0: 6e 74 20 61 74 20 74 68 65 20 62 65 67 69 6e 6e  nt at the beginn
6db0: 69 6e 67 7d 0a 09 09 20 20 20 20 69 6e 74 65 67  ing}...    integ
6dc0: 72 69 74 79 20 61 73 73 65 72 74 20 7b 5b 6c 6c  rity assert {[ll
6dd0: 65 6e 67 74 68 20 24 66 72 61 67 61 66 74 65 72  ength $fragafter
6de0: 5d 7d 20 20 7b 46 6f 75 6e 64 20 7a 65 72 6f 2d  ]}  {Found zero-
6df0: 6c 65 6e 67 74 68 20 66 72 61 67 6d 65 6e 74 20  length fragment 
6e00: 61 74 20 74 68 65 20 65 6e 64 7d 0a 0a 09 09 20  at the end}.... 
6e10: 20 20 20 6c 61 70 70 65 6e 64 20 6e 65 77 20 24     lappend new $
6e20: 66 72 61 67 62 65 66 6f 72 65 20 24 66 72 61 67  fragbefore $frag
6e30: 61 66 74 65 72 0a 09 09 20 20 20 20 43 75 74 41  after...    CutA
6e40: 74 20 24 62 65 73 74 0a 09 09 7d 0a 0a 09 09 69  t $best...}....i
6e50: 6e 63 72 20 61 74 0a 09 20 20 20 20 7d 0a 09 7d  ncr at..    }..}
6e60: 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 36 20 63  ...log write 6 c
6e70: 73 65 74 73 20 22 2e 20 2e 20 2e 2e 20 2e 2e 2e  sets ". . .. ...
6e80: 20 2e 2e 2e 2e 2e 20 2e 2e 2e 2e 2e 2e 2e 2e 20   ..... ........ 
6e90: 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 2e 22 0a 0a  ............."..
6ea0: 09 72 65 74 75 72 6e 20 24 66 72 61 67 6d 65 6e  .return $fragmen
6eb0: 74 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72  ts.    }..    pr
6ec0: 6f 63 20 49 6e 69 74 69 61 6c 69 7a 65 42 72 65  oc InitializeBre
6ed0: 61 6b 53 74 61 74 65 20 7b 72 65 76 69 73 69 6f  akState {revisio
6ee0: 6e 73 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 70  ns} {..upvar 1 p
6ef0: 6f 73 20 70 6f 73 20 63 72 6f 73 73 20 63 72 6f  os pos cross cro
6f00: 73 73 20 72 61 6e 67 65 20 72 61 6e 67 65 20 64  ss range range d
6f10: 65 70 63 20 64 65 70 63 20 64 65 6c 74 61 20 64  epc depc delta d
6f20: 65 6c 74 61 20 5c 0a 09 20 20 20 20 64 65 70 65  elta \..    depe
6f30: 6e 64 65 6e 63 69 65 73 20 64 65 70 65 6e 64 65  ndencies depende
6f40: 6e 63 69 65 73 0a 0a 09 23 20 46 69 72 73 74 20  ncies...# First 
6f50: 77 65 20 63 72 65 61 74 65 20 61 20 6d 61 70 20  we create a map 
6f60: 6f 66 20 70 6f 73 69 74 69 6f 6e 73 20 74 6f 20  of positions to 
6f70: 6d 61 6b 65 20 69 74 20 65 61 73 69 65 72 20 74  make it easier t
6f80: 6f 0a 09 23 20 64 65 74 65 72 6d 69 6e 65 20 77  o..# determine w
6f90: 68 65 74 68 65 72 20 61 20 64 65 70 65 6e 64 65  hether a depende
6fa0: 6e 63 79 20 63 72 6f 73 73 65 73 20 61 20 70 61  ncy crosses a pa
6fb0: 72 74 69 63 75 6c 61 72 20 69 6e 64 65 78 2e 0a  rticular index..
6fc0: 0a 09 6c 6f 67 20 77 72 69 74 65 20 31 34 20 63  ..log write 14 c
6fd0: 73 65 74 73 20 7b 49 42 53 3a 20 23 72 65 76 20  sets {IBS: #rev 
6fe0: 5b 6c 6c 65 6e 67 74 68 20 24 72 65 76 69 73 69  [llength $revisi
6ff0: 6f 6e 73 5d 7d 0a 09 6c 6f 67 20 77 72 69 74 65  ons]}..log write
7000: 20 31 34 20 63 73 65 74 73 20 7b 49 42 53 3a 20   14 csets {IBS: 
7010: 70 6f 73 20 6d 61 70 2c 20 63 72 6f 73 73 20 63  pos map, cross c
7020: 6f 75 6e 74 65 72 7d 0a 0a 09 61 72 72 61 79 20  ounter}...array 
7030: 73 65 74 20 70 6f 73 20 20 20 7b 7d 0a 09 61 72  set pos   {}..ar
7040: 72 61 79 20 73 65 74 20 63 72 6f 73 73 20 7b 7d  ray set cross {}
7050: 0a 09 61 72 72 61 79 20 73 65 74 20 64 65 70 63  ..array set depc
7060: 20 20 7b 7d 0a 09 73 65 74 20 72 61 6e 67 65 20    {}..set range 
7070: 20 20 20 20 20 20 7b 7d 0a 09 73 65 74 20 6e 20        {}..set n 
7080: 30 0a 09 66 6f 72 65 61 63 68 20 72 65 76 20 24  0..foreach rev $
7090: 72 65 76 69 73 69 6f 6e 73 20 7b 0a 09 20 20 20  revisions {..   
70a0: 20 6c 61 70 70 65 6e 64 20 72 61 6e 67 65 20 24   lappend range $
70b0: 6e 0a 09 20 20 20 20 73 65 74 20 70 6f 73 28 24  n..    set pos($
70c0: 72 65 76 29 20 24 6e 0a 09 20 20 20 20 73 65 74  rev) $n..    set
70d0: 20 63 72 6f 73 73 28 24 6e 29 20 30 0a 09 20 20   cross($n) 0..  
70e0: 20 20 69 6e 63 72 20 6e 0a 09 7d 0a 0a 09 6c 6f    incr n..}...lo
70f0: 67 20 77 72 69 74 65 20 31 34 20 63 73 65 74 73  g write 14 csets
7100: 20 7b 49 42 53 3a 20 70 6f 73 2f 5b 61 72 72 61   {IBS: pos/[arra
7110: 79 20 73 69 7a 65 20 70 6f 73 5d 2c 20 63 72 6f  y size pos], cro
7120: 73 73 2f 5b 61 72 72 61 79 20 73 69 7a 65 20 63  ss/[array size c
7130: 72 6f 73 73 5d 7d 0a 0a 09 23 20 53 65 63 6f 6e  ross]}...# Secon
7140: 64 6c 79 20 77 65 20 63 6f 75 6e 74 20 74 68 65  dly we count the
7150: 20 63 72 6f 73 73 69 6e 67 73 20 70 65 72 20 70   crossings per p
7160: 6f 73 69 74 69 6f 6e 2c 20 62 79 20 69 74 65 72  osition, by iter
7170: 61 74 69 6e 67 0a 09 23 20 6f 76 65 72 20 74 68  ating..# over th
7180: 65 20 72 65 63 6f 72 64 65 64 20 69 6e 74 65 72  e recorded inter
7190: 6e 61 6c 20 64 65 70 65 6e 64 65 6e 63 69 65 73  nal dependencies
71a0: 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 49 66 20 74  ....# Note: If t
71b0: 68 65 20 74 69 6d 65 73 74 61 6d 70 73 20 61 72  he timestamps ar
71c0: 65 20 62 61 64 6c 79 20 6f 75 74 20 6f 66 20 6f  e badly out of o
71d0: 72 64 65 72 20 69 74 20 69 73 0a 09 23 20 20 20  rder it is..#   
71e0: 20 20 20 20 70 6f 73 73 69 62 6c 65 20 74 6f 20      possible to 
71f0: 68 61 76 65 20 61 20 62 61 63 6b 77 61 72 64 20  have a backward 
7200: 73 75 63 63 65 73 73 6f 72 20 64 65 70 65 6e 64  successor depend
7210: 65 6e 63 79 2c 0a 09 23 20 20 20 20 20 20 20 69  ency,..#       i
7220: 2e 65 2e 20 77 69 74 68 20 73 74 61 72 74 20 3e  .e. with start >
7230: 20 65 6e 64 2e 20 57 65 20 6d 61 79 20 68 61 76   end. We may hav
7240: 65 20 74 6f 20 73 77 61 70 20 74 68 65 20 69 6e  e to swap the in
7250: 64 69 63 65 73 0a 09 23 20 20 20 20 20 20 20 74  dices..#       t
7260: 6f 20 65 6e 73 75 72 65 20 74 68 61 74 20 74 68  o ensure that th
7270: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6c 6f 6f 70  e following loop
7280: 20 72 75 6e 73 20 63 6f 72 72 65 63 74 6c 79 2e   runs correctly.
7290: 0a 09 23 0a 09 23 20 4e 6f 74 65 20 32 3a 20 73  ..#..# Note 2: s
72a0: 74 61 72 74 20 3d 3d 20 65 6e 64 20 69 73 20 6e  tart == end is n
72b0: 6f 74 20 70 6f 73 73 69 62 6c 65 2e 20 49 74 20  ot possible. It 
72c0: 69 6e 64 69 63 61 74 65 73 20 61 0a 09 23 20 20  indicates a..#  
72d0: 20 20 20 20 20 20 20 73 65 6c 66 2d 64 65 70 65         self-depe
72e0: 6e 64 65 6e 63 79 20 64 75 65 20 74 6f 20 74 68  ndency due to th
72f0: 65 20 75 6e 69 71 75 65 6e 65 73 73 20 6f 66 20  e uniqueness of 
7300: 70 6f 73 69 74 69 6f 6e 73 2c 0a 09 23 20 20 20  positions,..#   
7310: 20 20 20 20 20 20 61 6e 64 20 74 68 61 74 20 69        and that i
7320: 73 20 73 6f 6d 65 74 68 69 6e 67 20 77 65 20 68  s something we h
7330: 61 76 65 20 72 75 6c 65 64 20 6f 75 74 20 61 6c  ave ruled out al
7340: 72 65 61 64 79 2c 20 73 65 65 0a 09 23 20 20 20  ready, see..#   
7350: 20 20 20 20 20 20 27 72 65 76 20 69 6e 74 65 72        'rev inter
7360: 6e 61 6c 73 75 63 63 65 73 73 6f 72 73 27 2e 0a  nalsuccessors'..
7370: 0a 09 6c 6f 67 20 77 72 69 74 65 20 31 34 20 63  ..log write 14 c
7380: 73 65 74 73 20 7b 49 42 53 3a 20 63 72 6f 73 73  sets {IBS: cross
7390: 20 63 6f 75 6e 74 65 72 20 66 69 6c 6c 69 6e 67   counter filling
73a0: 2c 20 70 6f 73 2f 63 72 6f 73 73 20 6d 61 70 7d  , pos/cross map}
73b0: 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64 20  ...foreach {rid 
73c0: 63 68 69 6c 64 72 65 6e 7d 20 5b 61 72 72 61 79  children} [array
73d0: 20 67 65 74 20 64 65 70 65 6e 64 65 6e 63 69 65   get dependencie
73e0: 73 5d 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 63  s] {..    foreac
73f0: 68 20 63 68 69 6c 64 20 24 63 68 69 6c 64 72 65  h child $childre
7400: 6e 20 7b 0a 09 09 73 65 74 20 64 6b 65 79 20 20  n {...set dkey  
7410: 20 20 5b 6c 69 73 74 20 24 72 69 64 20 24 63 68    [list $rid $ch
7420: 69 6c 64 5d 0a 09 09 73 65 74 20 73 74 61 72 74  ild]...set start
7430: 20 20 20 24 70 6f 73 28 24 72 69 64 29 0a 09 09     $pos($rid)...
7440: 73 65 74 20 65 6e 64 20 20 20 20 20 24 70 6f 73  set end     $pos
7450: 28 24 63 68 69 6c 64 29 0a 0a 09 09 69 66 20 7b  ($child)....if {
7460: 24 73 74 61 72 74 20 3e 20 24 65 6e 64 7d 20 7b  $start > $end} {
7470: 0a 09 09 20 20 20 20 73 65 74 20 63 72 6f 73 73  ...    set cross
7480: 65 73 20 5b 6c 69 73 74 20 24 65 6e 64 20 5b 65  es [list $end [e
7490: 78 70 72 20 7b 24 73 74 61 72 74 2d 31 7d 5d 5d  xpr {$start-1}]]
74a0: 0a 09 09 20 20 20 20 77 68 69 6c 65 20 7b 24 65  ...    while {$e
74b0: 6e 64 20 3c 20 24 73 74 61 72 74 7d 20 7b 0a 09  nd < $start} {..
74c0: 09 09 69 6e 63 72 20 63 72 6f 73 73 28 24 65 6e  ..incr cross($en
74d0: 64 29 0a 09 09 09 69 6e 63 72 20 65 6e 64 0a 09  d)....incr end..
74e0: 09 20 20 20 20 7d 0a 09 09 7d 20 65 6c 73 65 20  .    }...} else 
74f0: 7b 0a 09 09 20 20 20 20 73 65 74 20 63 72 6f 73  {...    set cros
7500: 73 65 73 20 5b 6c 69 73 74 20 24 73 74 61 72 74  ses [list $start
7510: 20 5b 65 78 70 72 20 7b 24 65 6e 64 2d 31 7d 5d   [expr {$end-1}]
7520: 5d 0a 09 09 20 20 20 20 77 68 69 6c 65 20 7b 24  ]...    while {$
7530: 73 74 61 72 74 20 3c 20 24 65 6e 64 7d 20 7b 0a  start < $end} {.
7540: 09 09 09 69 6e 63 72 20 63 72 6f 73 73 28 24 73  ...incr cross($s
7550: 74 61 72 74 29 0a 09 09 09 69 6e 63 72 20 73 74  tart)....incr st
7560: 61 72 74 0a 09 09 20 20 20 20 7d 0a 09 09 7d 0a  art...    }...}.
7570: 09 09 73 65 74 20 64 65 70 63 28 24 64 6b 65 79  ..set depc($dkey
7580: 29 20 24 63 72 6f 73 73 65 73 0a 09 20 20 20 20  ) $crosses..    
7590: 7d 0a 09 7d 0a 0a 09 6c 6f 67 20 77 72 69 74 65  }..}...log write
75a0: 20 31 34 20 63 73 65 74 73 20 7b 49 42 53 3a 20   14 csets {IBS: 
75b0: 70 6f 73 2f 5b 61 72 72 61 79 20 73 69 7a 65 20  pos/[array size 
75c0: 70 6f 73 5d 2c 20 63 72 6f 73 73 2f 5b 61 72 72  pos], cross/[arr
75d0: 61 79 20 73 69 7a 65 20 63 72 6f 73 73 5d 2c 20  ay size cross], 
75e0: 64 65 70 63 2f 5b 61 72 72 61 79 20 73 69 7a 65  depc/[array size
75f0: 20 64 65 70 63 5d 20 28 66 6f 72 20 5b 6c 6c 65   depc] (for [lle
7600: 6e 67 74 68 20 24 72 65 76 69 73 69 6f 6e 73 5d  ngth $revisions]
7610: 29 7d 0a 09 6c 6f 67 20 77 72 69 74 65 20 31 34  )}..log write 14
7620: 20 63 73 65 74 73 20 7b 49 42 53 3a 20 74 69 6d   csets {IBS: tim
7630: 65 73 74 61 6d 70 73 2c 20 64 65 6c 74 61 73 7d  estamps, deltas}
7640: 0a 0a 09 49 6e 69 74 69 61 6c 69 7a 65 44 65 6c  ...InitializeDel
7650: 74 61 73 20 24 72 65 76 69 73 69 6f 6e 73 0a 0a  tas $revisions..
7660: 09 6c 6f 67 20 77 72 69 74 65 20 31 34 20 63 73  .log write 14 cs
7670: 65 74 73 20 7b 49 42 53 3a 20 64 65 6c 74 61 20  ets {IBS: delta 
7680: 5b 61 72 72 61 79 20 73 69 7a 65 20 64 65 6c 74  [array size delt
7690: 61 5d 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  a]}..return.    
76a0: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 49 6e 69 74  }..    proc Init
76b0: 69 61 6c 69 7a 65 44 65 6c 74 61 73 20 7b 72 65  ializeDeltas {re
76c0: 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76 61  visions} {..upva
76d0: 72 20 31 20 64 65 6c 74 61 20 64 65 6c 74 61 0a  r 1 delta delta.
76e0: 0a 09 23 20 50 75 6c 6c 20 74 68 65 20 74 69 6d  ..# Pull the tim
76f0: 65 73 74 61 6d 70 73 20 66 6f 72 20 61 6c 6c 20  estamps for all 
7700: 72 65 76 69 73 69 6f 6e 73 20 69 6e 20 74 68 65  revisions in the
7710: 20 63 68 61 6e 67 65 73 65 74 73 20 61 6e 64 0a   changesets and.
7720: 09 23 20 63 6f 6d 70 75 74 65 20 74 68 65 69 72  .# compute their
7730: 20 64 65 6c 74 61 73 20 66 6f 72 20 75 73 65 20   deltas for use 
7740: 62 79 20 74 68 65 20 62 72 65 61 6b 20 66 69 6e  by the break fin
7750: 64 65 72 2e 0a 0a 09 61 72 72 61 79 20 73 65 74  der....array set
7760: 20 64 65 6c 74 61 20 7b 7d 0a 09 61 72 72 61 79   delta {}..array
7770: 20 73 65 74 20 73 74 61 6d 70 20 7b 7d 0a 0a 09   set stamp {}...
7780: 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f  set theset ('[jo
7790: 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27  in $revisions {'
77a0: 2c 27 7d 5d 27 29 0a 09 73 74 61 74 65 20 66 6f  ,'}]')..state fo
77b0: 72 65 61 63 68 72 6f 77 20 5b 73 75 62 73 74 20  reachrow [subst 
77c0: 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62  -nocommands -nob
77d0: 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20  ackslashes {..  
77e0: 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 20 41    SELECT R.rid A
77f0: 53 20 78 72 69 64 2c 20 52 2e 64 61 74 65 20 41  S xrid, R.date A
7800: 53 20 74 69 6d 65 0a 09 20 20 20 20 46 52 4f 4d  S time..    FROM
7810: 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20 20   revision R..   
7820: 20 57 48 45 52 45 20 52 2e 72 69 64 20 49 4e 20   WHERE R.rid IN 
7830: 24 74 68 65 73 65 74 0a 09 7d 5d 20 7b 0a 09 20  $theset..}] {.. 
7840: 20 20 20 73 65 74 20 73 74 61 6d 70 28 24 78 72     set stamp($xr
7850: 69 64 29 20 24 74 69 6d 65 0a 09 7d 0a 0a 09 6c  id) $time..}...l
7860: 6f 67 20 77 72 69 74 65 20 31 34 20 63 73 65 74  og write 14 cset
7870: 73 20 7b 49 42 53 3a 20 73 74 61 6d 70 20 5b 61  s {IBS: stamp [a
7880: 72 72 61 79 20 73 69 7a 65 20 73 74 61 6d 70 5d  rray size stamp]
7890: 7d 0a 0a 09 73 65 74 20 6e 20 30 0a 09 66 6f 72  }...set n 0..for
78a0: 65 61 63 68 20 72 69 64 20 5b 6c 72 61 6e 67 65  each rid [lrange
78b0: 20 24 72 65 76 69 73 69 6f 6e 73 20 30 20 65 6e   $revisions 0 en
78c0: 64 2d 31 5d 20 72 6e 65 78 74 20 5b 6c 72 61 6e  d-1] rnext [lran
78d0: 67 65 20 24 72 65 76 69 73 69 6f 6e 73 20 31 20  ge $revisions 1 
78e0: 65 6e 64 5d 20 7b 0a 09 20 20 20 20 73 65 74 20  end] {..    set 
78f0: 64 65 6c 74 61 28 24 6e 29 20 5b 65 78 70 72 20  delta($n) [expr 
7900: 7b 24 73 74 61 6d 70 28 24 72 6e 65 78 74 29 20  {$stamp($rnext) 
7910: 2d 20 24 73 74 61 6d 70 28 24 72 69 64 29 7d 5d  - $stamp($rid)}]
7920: 0a 09 20 20 20 20 69 6e 63 72 20 6e 0a 09 7d 0a  ..    incr n..}.
7930: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
7940: 20 20 20 70 72 6f 63 20 46 69 6e 64 42 65 73 74     proc FindBest
7950: 42 72 65 61 6b 20 7b 72 61 6e 67 65 7d 20 7b 0a  Break {range} {.
7960: 09 75 70 76 61 72 20 31 20 63 72 6f 73 73 20 63  .upvar 1 cross c
7970: 72 6f 73 73 20 64 65 6c 74 61 20 64 65 6c 74 61  ross delta delta
7980: 0a 0a 09 23 20 44 65 74 65 72 6d 69 6e 65 20 74  ...# Determine t
7990: 68 65 20 62 65 73 74 20 62 72 65 61 6b 20 6c 6f  he best break lo
79a0: 63 61 74 69 6f 6e 20 69 6e 20 74 68 65 20 67 69  cation in the gi
79b0: 76 65 6e 20 72 61 6e 67 65 20 6f 66 0a 09 23 20  ven range of..# 
79c0: 70 6f 73 69 74 69 6f 6e 73 2e 20 46 69 72 73 74  positions. First
79d0: 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 74 68 65   we look for the
79e0: 20 6c 6f 63 61 74 69 6f 6e 73 20 77 69 74 68 20   locations with 
79f0: 74 68 65 20 6d 61 78 69 6d 61 6c 0a 09 23 20 6e  the maximal..# n
7a00: 75 6d 62 65 72 20 6f 66 20 63 72 6f 73 73 69 6e  umber of crossin
7a10: 67 73 2e 20 49 66 20 74 68 65 72 65 20 61 72 65  gs. If there are
7a20: 20 73 65 76 65 72 61 6c 20 77 65 20 6c 6f 6f 6b   several we look
7a30: 20 66 6f 72 20 74 68 65 0a 09 23 20 73 68 6f 72   for the..# shor
7a40: 74 65 73 74 20 74 69 6d 65 20 69 6e 74 65 72 76  test time interv
7a50: 61 6c 20 61 6d 6f 6e 67 20 74 68 65 6d 2e 20 49  al among them. I
7a60: 66 20 77 65 20 73 74 69 6c 6c 20 68 61 76 65 20  f we still have 
7a70: 6d 75 6c 74 69 70 6c 65 0a 09 23 20 70 6f 73 73  multiple..# poss
7a80: 69 62 69 6c 69 74 69 65 73 20 61 66 74 65 72 20  ibilities after 
7a90: 74 68 61 74 20 77 65 20 73 65 6c 65 63 74 20 74  that we select t
7aa0: 68 65 20 65 61 72 6c 69 65 73 74 20 6c 6f 63 61  he earliest loca
7ab0: 74 69 6f 6e 0a 09 23 20 61 6d 6f 6e 67 20 74 68  tion..# among th
7ac0: 65 73 65 2e 0a 0a 09 23 20 4e 6f 74 65 3a 20 49  ese....# Note: I
7ad0: 66 20 74 68 65 20 6d 61 78 69 6d 61 6c 20 6e 75  f the maximal nu
7ae0: 6d 62 65 72 20 6f 66 20 63 72 6f 73 73 69 6e 67  mber of crossing
7af0: 73 20 69 73 20 30 20 74 68 65 6e 20 74 68 65 20  s is 0 then the 
7b00: 72 61 6e 67 65 0a 09 23 20 20 20 20 20 20 20 68  range..#       h
7b10: 61 73 20 6e 6f 20 69 6e 74 65 72 6e 61 6c 20 64  as no internal d
7b20: 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 61 6e 64  ependencies, and
7b30: 20 6e 6f 20 62 72 65 61 6b 20 6c 6f 63 61 74 69   no break locati
7b40: 6f 6e 20 61 74 0a 09 23 20 20 20 20 20 20 20 61  on at..#       a
7b50: 6c 6c 2e 20 54 68 69 73 20 70 6f 73 73 69 62 69  ll. This possibi
7b60: 6c 69 74 79 20 69 73 20 73 69 67 6e 61 6c 65 64  lity is signaled
7b70: 20 76 69 61 20 72 65 73 75 6c 74 20 2d 31 2e 0a   via result -1..
7b80: 0a 09 23 20 4e 6f 74 65 3a 20 41 20 72 61 6e 67  ..# Note: A rang
7b90: 65 20 6f 66 20 6c 65 6e 67 74 68 20 31 20 6f 72  e of length 1 or
7ba0: 20 6c 65 73 73 20 63 61 6e 6e 6f 74 20 68 61 76   less cannot hav
7bb0: 65 20 69 6e 74 65 72 6e 61 6c 0a 09 23 20 20 20  e internal..#   
7bc0: 20 20 20 20 64 65 70 65 6e 64 65 6e 63 69 65 73      dependencies
7bd0: 2c 20 61 73 20 74 68 61 74 20 6e 65 65 64 73 20  , as that needs 
7be0: 61 74 20 6c 65 61 73 74 20 74 77 6f 20 72 65 76  at least two rev
7bf0: 69 73 69 6f 6e 73 20 69 6e 0a 09 23 20 20 20 20  isions in..#    
7c00: 20 20 20 74 68 65 20 72 61 6e 67 65 2e 0a 0a 09     the range....
7c10: 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 72 61  if {[llength $ra
7c20: 6e 67 65 5d 20 3c 20 32 7d 20 7b 20 72 65 74 75  nge] < 2} { retu
7c30: 72 6e 20 2d 31 20 7d 0a 0a 09 73 65 74 20 6d 61  rn -1 }...set ma
7c40: 78 20 2d 31 0a 09 73 65 74 20 62 65 73 74 20 7b  x -1..set best {
7c50: 7d 0a 0a 09 66 6f 72 65 61 63 68 20 6c 6f 63 61  }...foreach loca
7c60: 74 69 6f 6e 20 24 72 61 6e 67 65 20 7b 0a 09 20  tion $range {.. 
7c70: 20 20 20 73 65 74 20 63 72 6f 73 73 69 6e 67 73     set crossings
7c80: 20 24 63 72 6f 73 73 28 24 6c 6f 63 61 74 69 6f   $cross($locatio
7c90: 6e 29 0a 09 20 20 20 20 69 66 20 7b 24 63 72 6f  n)..    if {$cro
7ca0: 73 73 69 6e 67 73 20 3e 20 24 6d 61 78 7d 20 7b  ssings > $max} {
7cb0: 0a 09 09 73 65 74 20 6d 61 78 20 20 24 63 72 6f  ...set max  $cro
7cc0: 73 73 69 6e 67 73 0a 09 09 73 65 74 20 62 65 73  ssings...set bes
7cd0: 74 20 5b 6c 69 73 74 20 24 6c 6f 63 61 74 69 6f  t [list $locatio
7ce0: 6e 5d 0a 09 09 63 6f 6e 74 69 6e 75 65 0a 09 20  n]...continue.. 
7cf0: 20 20 20 7d 20 65 6c 73 65 69 66 20 7b 24 63 72     } elseif {$cr
7d00: 6f 73 73 69 6e 67 73 20 3d 3d 20 24 6d 61 78 7d  ossings == $max}
7d10: 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 62 65 73   {...lappend bes
7d20: 74 20 24 6c 6f 63 61 74 69 6f 6e 0a 09 20 20 20  t $location..   
7d30: 20 7d 0a 09 7d 0a 0a 09 69 66 20 7b 24 6d 61 78   }..}...if {$max
7d40: 20 3d 3d 20 30 7d 20 20 20 20 20 20 20 20 20 20   == 0}          
7d50: 20 20 7b 20 72 65 74 75 72 6e 20 2d 31 20 7d 0a    { return -1 }.
7d60: 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 62  .if {[llength $b
7d70: 65 73 74 5d 20 3d 3d 20 31 7d 20 7b 20 72 65 74  est] == 1} { ret
7d80: 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 62 65 73  urn [lindex $bes
7d90: 74 20 30 5d 20 7d 0a 0a 09 73 65 74 20 6c 6f 63  t 0] }...set loc
7da0: 61 74 69 6f 6e 73 20 24 62 65 73 74 0a 09 73 65  ations $best..se
7db0: 74 20 62 65 73 74 20 7b 7d 0a 09 73 65 74 20 6d  t best {}..set m
7dc0: 69 6e 20 2d 31 0a 0a 09 66 6f 72 65 61 63 68 20  in -1...foreach 
7dd0: 6c 6f 63 61 74 69 6f 6e 20 24 6c 6f 63 61 74 69  location $locati
7de0: 6f 6e 73 20 7b 0a 09 20 20 20 20 73 65 74 20 69  ons {..    set i
7df0: 6e 74 65 72 76 61 6c 20 24 64 65 6c 74 61 28 24  nterval $delta($
7e00: 6c 6f 63 61 74 69 6f 6e 29 0a 09 20 20 20 20 69  location)..    i
7e10: 66 20 7b 28 24 6d 69 6e 20 3c 20 30 29 20 7c 7c  f {($min < 0) ||
7e20: 20 28 24 69 6e 74 65 72 76 61 6c 20 3c 20 24 6d   ($interval < $m
7e30: 69 6e 29 7d 20 7b 0a 09 09 73 65 74 20 6d 69 6e  in)} {...set min
7e40: 20 20 24 69 6e 74 65 72 76 61 6c 0a 09 09 73 65    $interval...se
7e50: 74 20 62 65 73 74 20 5b 6c 69 73 74 20 24 6c 6f  t best [list $lo
7e60: 63 61 74 69 6f 6e 5d 0a 09 20 20 20 20 7d 20 65  cation]..    } e
7e70: 6c 73 65 69 66 20 7b 24 69 6e 74 65 72 76 61 6c  lseif {$interval
7e80: 20 3d 3d 20 24 6d 69 6e 7d 20 7b 0a 09 09 6c 61   == $min} {...la
7e90: 70 70 65 6e 64 20 62 65 73 74 20 24 6c 6f 63 61  ppend best $loca
7ea0: 74 69 6f 6e 0a 09 20 20 20 20 7d 0a 09 7d 0a 0a  tion..    }..}..
7eb0: 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68 20 24 62  .if {[llength $b
7ec0: 65 73 74 5d 20 3d 3d 20 31 7d 20 7b 20 72 65 74  est] == 1} { ret
7ed0: 75 72 6e 20 5b 6c 69 6e 64 65 78 20 24 62 65 73  urn [lindex $bes
7ee0: 74 20 30 5d 20 7d 0a 0a 09 72 65 74 75 72 6e 20  t 0] }...return 
7ef0: 5b 6c 69 6e 64 65 78 20 5b 6c 73 6f 72 74 20 2d  [lindex [lsort -
7f00: 69 6e 74 65 67 65 72 20 2d 69 6e 63 72 65 61 73  integer -increas
7f10: 69 6e 67 20 24 62 65 73 74 5d 20 30 5d 0a 20 20  ing $best] 0].  
7f20: 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 43 75    }..    proc Cu
7f30: 74 41 74 20 7b 6c 6f 63 61 74 69 6f 6e 7d 20 7b  tAt {location} {
7f40: 0a 09 75 70 76 61 72 20 31 20 63 72 6f 73 73 20  ..upvar 1 cross 
7f50: 63 72 6f 73 73 20 64 65 70 63 20 64 65 70 63 0a  cross depc depc.
7f60: 0a 09 23 20 49 74 20 77 61 73 20 64 65 63 69 64  ..# It was decid
7f70: 65 64 20 74 6f 20 73 70 6c 69 74 20 74 68 65 20  ed to split the 
7f80: 63 68 61 6e 67 65 73 65 74 20 61 74 20 74 68 65  changeset at the
7f90: 20 67 69 76 65 6e 0a 09 23 20 6c 6f 63 61 74 69   given..# locati
7fa0: 6f 6e 2e 20 54 68 69 73 20 63 75 74 73 20 61 20  on. This cuts a 
7fb0: 6e 75 6d 62 65 72 20 6f 66 20 64 65 70 65 6e 64  number of depend
7fc0: 65 6e 63 69 65 73 2e 20 48 65 72 65 20 77 65 20  encies. Here we 
7fd0: 75 70 64 61 74 65 0a 09 23 20 74 68 65 20 63 72  update..# the cr
7fe0: 6f 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20  oss information 
7ff0: 73 6f 20 74 68 61 74 20 74 68 65 20 62 72 65 61  so that the brea
8000: 6b 20 66 69 6e 64 65 72 20 68 61 73 20 61 63 63  k finder has acc
8010: 75 72 61 74 65 0a 09 23 20 64 61 74 61 20 77 68  urate..# data wh
8020: 65 6e 20 77 65 20 6c 6f 6f 6b 20 61 74 20 74 68  en we look at th
8030: 65 20 67 65 6e 65 72 61 74 65 64 20 66 72 61 67  e generated frag
8040: 6d 65 6e 74 73 2e 0a 0a 09 73 65 74 20 73 69 78  ments....set six
8050: 20 5b 6c 6f 67 20 76 69 73 69 62 6c 65 3f 20 36   [log visible? 6
8060: 5d 0a 0a 09 23 20 4e 6f 74 65 3a 20 54 68 65 20  ]...# Note: The 
8070: 6c 6f 6f 70 20 62 65 6c 6f 77 20 63 6f 75 6c 64  loop below could
8080: 20 62 65 20 6d 61 64 65 20 66 61 73 74 65 72 20   be made faster 
8090: 62 79 20 6b 65 65 70 69 6e 67 20 61 20 6d 61 70  by keeping a map
80a0: 0a 09 23 20 66 72 6f 6d 20 70 6f 73 69 74 69 6f  ..# from positio
80b0: 6e 73 20 74 6f 20 74 68 65 20 64 65 70 65 6e 64  ns to the depend
80c0: 65 6e 63 69 65 73 20 63 72 6f 73 73 69 6e 67 2e  encies crossing.
80d0: 20 41 6e 20 65 78 74 65 6e 73 69 6f 6e 20 6f 66   An extension of
80e0: 0a 09 23 20 43 52 4f 53 53 2c 20 69 2e 65 2e 20  ..# CROSS, i.e. 
80f0: 6c 69 73 74 20 6f 66 20 64 65 70 65 6e 64 65 6e  list of dependen
8100: 63 69 65 73 2c 20 63 6f 75 6e 74 65 72 20 69 73  cies, counter is
8110: 20 69 6d 70 6c 69 65 64 2e 20 54 61 6b 65 73 0a   implied. Takes.
8120: 09 23 20 61 20 6c 6f 74 20 6d 6f 72 65 20 6d 65  .# a lot more me
8130: 6d 6f 72 79 20 68 6f 77 65 76 65 72 2c 20 61 6e  mory however, an
8140: 64 20 74 61 6b 65 73 20 74 69 6d 65 20 74 6f 20  d takes time to 
8150: 75 70 64 61 74 65 20 68 65 72 65 0a 09 23 20 28  update here..# (
8160: 54 68 65 20 69 6e 6e 65 72 20 6c 6f 6f 70 20 69  The inner loop i
8170: 73 20 6e 6f 74 20 69 6e 63 72 20 2d 31 2c 20 62  s not incr -1, b
8180: 75 74 20 6c 64 65 6c 65 74 65 29 2e 0a 0a 09 66  ut ldelete)....f
8190: 6f 72 65 61 63 68 20 64 65 70 20 5b 61 72 72 61  oreach dep [arra
81a0: 79 20 6e 61 6d 65 73 20 64 65 70 63 5d 20 7b 0a  y names depc] {.
81b0: 09 20 20 20 20 73 65 74 20 72 61 6e 67 65 20 24  .    set range $
81c0: 64 65 70 63 28 24 64 65 70 29 0a 09 20 20 20 20  depc($dep)..    
81d0: 23 20 43 68 65 63 6b 20 61 6c 6c 20 64 65 70 65  # Check all depe
81e0: 6e 64 65 6e 63 69 65 73 20 73 74 69 6c 6c 20 6b  ndencies still k
81f0: 6e 6f 77 6e 2c 20 74 61 6b 65 20 74 68 65 69 72  nown, take their
8200: 20 72 61 6e 67 65 20 61 6e 64 0a 09 20 20 20 20   range and..    
8210: 23 20 73 65 65 20 69 66 20 74 68 65 20 62 72 65  # see if the bre
8220: 61 6b 20 6c 6f 63 61 74 69 6f 6e 20 66 61 6c 6c  ak location fall
8230: 73 20 77 69 74 68 69 6e 2e 0a 0a 09 20 20 20 20  s within....    
8240: 42 6f 72 64 65 72 20 24 72 61 6e 67 65 20 73 20  Border $range s 
8250: 65 0a 09 20 20 20 20 69 66 20 7b 24 6c 6f 63 61  e..    if {$loca
8260: 74 69 6f 6e 20 3c 20 24 73 7d 20 63 6f 6e 74 69  tion < $s} conti
8270: 6e 75 65 20 3b 20 23 20 62 72 65 61 6b 20 62 65  nue ; # break be
8280: 66 6f 72 65 20 72 61 6e 67 65 2c 20 69 67 6e 6f  fore range, igno
8290: 72 65 0a 09 20 20 20 20 69 66 20 7b 24 6c 6f 63  re..    if {$loc
82a0: 61 74 69 6f 6e 20 3e 20 24 65 7d 20 63 6f 6e 74  ation > $e} cont
82b0: 69 6e 75 65 20 3b 20 23 20 62 72 65 61 6b 20 61  inue ; # break a
82c0: 66 74 65 72 20 72 61 6e 67 65 2c 20 69 67 6e 6f  fter range, igno
82d0: 72 65 2e 0a 0a 09 20 20 20 20 23 20 54 68 69 73  re....    # This
82e0: 20 64 65 70 65 6e 64 65 6e 63 79 20 63 72 6f 73   dependency cros
82f0: 73 65 73 20 74 68 65 20 62 72 65 61 6b 20 6c 6f  ses the break lo
8300: 63 61 74 69 6f 6e 2e 20 57 65 20 72 65 6d 6f 76  cation. We remov
8310: 65 20 69 74 0a 09 20 20 20 20 23 20 66 72 6f 6d  e it..    # from
8320: 20 74 68 65 20 63 72 6f 73 73 69 6e 67 73 20 63   the crossings c
8330: 6f 75 6e 74 65 72 73 2c 20 61 6e 64 20 74 68 65  ounters, and the
8340: 6e 20 61 6c 73 6f 20 66 72 6f 6d 20 74 68 65 20  n also from the 
8350: 73 65 74 0a 09 20 20 20 20 23 20 6f 66 20 6b 6e  set..    # of kn
8360: 6f 77 6e 20 64 65 70 65 6e 64 65 6e 63 69 65 73  own dependencies
8370: 2c 20 61 73 20 77 65 20 61 72 65 20 64 6f 6e 65  , as we are done
8380: 20 77 69 74 68 20 69 74 2e 0a 0a 09 20 20 20 20   with it....    
8390: 42 6f 72 64 65 72 20 24 64 65 70 63 28 24 64 65  Border $depc($de
83a0: 70 29 20 64 73 20 64 65 0a 09 20 20 20 20 66 6f  p) ds de..    fo
83b0: 72 20 7b 73 65 74 20 6c 6f 63 20 24 64 73 7d 20  r {set loc $ds} 
83c0: 7b 24 6c 6f 63 20 3c 3d 20 24 64 65 7d 20 7b 69  {$loc <= $de} {i
83d0: 6e 63 72 20 6c 6f 63 7d 20 7b 0a 09 09 69 6e 63  ncr loc} {...inc
83e0: 72 20 63 72 6f 73 73 28 24 6c 6f 63 29 20 2d 31  r cross($loc) -1
83f0: 0a 09 20 20 20 20 7d 0a 09 20 20 20 20 75 6e 73  ..    }..    uns
8400: 65 74 20 64 65 70 63 28 24 64 65 70 29 0a 0a 09  et depc($dep)...
8410: 20 20 20 20 69 66 20 7b 21 24 73 69 78 7d 20 63      if {!$six} c
8420: 6f 6e 74 69 6e 75 65 0a 0a 09 20 20 20 20 73 74  ontinue...    st
8430: 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67  ruct::list assig
8440: 6e 20 24 64 65 70 20 70 61 72 65 6e 74 20 63 68  n $dep parent ch
8450: 69 6c 64 0a 09 20 20 20 20 6c 6f 67 20 77 72 69  ild..    log wri
8460: 74 65 20 35 20 63 73 65 74 73 20 22 42 72 6f 6b  te 5 csets "Brok
8470: 65 20 64 65 70 65 6e 64 65 6e 63 79 20 5b 50 44  e dependency [PD
8480: 20 24 70 61 72 65 6e 74 5d 20 2d 2d 3e 20 5b 50   $parent] --> [P
8490: 44 20 24 63 68 69 6c 64 5d 22 0a 09 7d 0a 0a 09  D $child]"..}...
84a0: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20  return.    }..  
84b0: 20 20 23 20 50 72 69 6e 74 20 69 64 65 6e 74 69    # Print identi
84c0: 66 79 69 6e 67 20 64 61 74 61 20 66 6f 72 20 61  fying data for a
84d0: 20 72 65 76 69 73 69 6f 6e 20 28 70 72 6f 6a 65   revision (proje
84e0: 63 74 2c 20 66 69 6c 65 2c 20 64 6f 74 74 65 64  ct, file, dotted
84f0: 20 72 65 76 0a 20 20 20 20 23 20 6e 75 6d 62 65   rev.    # numbe
8500: 72 29 2c 20 66 6f 72 20 68 69 67 68 20 76 65 72  r), for high ver
8510: 62 6f 73 69 74 79 20 6c 6f 67 20 6f 75 74 70 75  bosity log outpu
8520: 74 2e 0a 20 20 20 20 23 20 54 4f 44 4f 3a 20 52  t..    # TODO: R
8530: 65 70 6c 61 63 65 20 77 69 74 68 20 63 61 6c 6c  eplace with call
8540: 20 74 6f 20 69 74 65 6d 73 74 72 20 28 6c 69 73   to itemstr (lis
8550: 74 20 72 65 76 20 24 69 64 29 0a 0a 20 20 20 20  t rev $id)..    
8560: 70 72 6f 63 20 50 44 20 7b 69 64 7d 20 7b 0a 09  proc PD {id} {..
8570: 66 6f 72 65 61 63 68 20 7b 70 20 66 20 72 7d 20  foreach {p f r} 
8580: 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 53  [state run {...S
8590: 45 4c 45 43 54 20 50 2e 6e 61 6d 65 20 2c 20 46  ELECT P.name , F
85a0: 2e 6e 61 6d 65 2c 20 52 2e 72 65 76 0a 09 09 46  .name, R.rev...F
85b0: 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52 2c 20  ROM revision R, 
85c0: 66 69 6c 65 20 46 2c 20 70 72 6f 6a 65 63 74 20  file F, project 
85d0: 50 0a 09 09 57 48 45 52 45 20 52 2e 72 69 64 20  P...WHERE R.rid 
85e0: 3d 20 24 69 64 20 20 20 20 2d 2d 20 46 69 6e 64  = $id    -- Find
85f0: 20 73 70 65 63 69 66 69 65 64 20 66 69 6c 65 20   specified file 
8600: 72 65 76 69 73 69 6f 6e 0a 09 09 41 4e 44 20 20  revision...AND  
8610: 20 46 2e 66 69 64 20 3d 20 52 2e 66 69 64 20 20   F.fid = R.fid  
8620: 2d 2d 20 47 65 74 20 66 69 6c 65 20 6f 66 20 74  -- Get file of t
8630: 68 65 20 72 65 76 69 73 69 6f 6e 0a 09 09 41 4e  he revision...AN
8640: 44 20 20 20 50 2e 70 69 64 20 3d 20 46 2e 70 69  D   P.pid = F.pi
8650: 64 20 20 2d 2d 20 47 65 74 20 70 72 6f 6a 65 63  d  -- Get projec
8660: 74 20 6f 66 20 74 68 65 20 66 69 6c 65 2e 0a 09  t of the file...
8670: 7d 5d 20 62 72 65 61 6b 0a 09 72 65 74 75 72 6e  }] break..return
8680: 20 22 27 24 70 20 3a 20 24 66 2f 24 72 27 22 0a   "'$p : $f/$r'".
8690: 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 50 72 69      }..    # Pri
86a0: 6e 74 69 6e 67 20 6f 6e 65 20 6f 72 20 6d 6f 72  nting one or mor
86b0: 65 20 72 61 6e 67 65 73 2c 20 66 6f 72 6d 61 74  e ranges, format
86c0: 74 65 64 2c 20 61 6e 64 20 6f 6e 6c 79 20 74 68  ted, and only th
86d0: 65 69 72 20 62 6f 72 64 65 72 20 74 6f 0a 20 20  eir border to.  
86e0: 20 20 23 20 6b 65 65 70 20 74 68 65 20 73 74 72    # keep the str
86f0: 69 6e 67 73 20 73 68 6f 72 74 2e 0a 0a 20 20 20  ings short...   
8700: 20 70 72 6f 63 20 50 52 73 20 7b 72 61 6e 67 65   proc PRs {range
8710: 73 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b 73 74  s} {..return [st
8720: 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20 24  ruct::list map $
8730: 72 61 6e 67 65 73 20 5b 6d 79 70 72 6f 63 20 50  ranges [myproc P
8740: 52 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  R]].    }..    p
8750: 72 6f 63 20 50 52 20 7b 72 61 6e 67 65 7d 20 7b  roc PR {range} {
8760: 0a 09 42 6f 72 64 65 72 20 24 72 61 6e 67 65 20  ..Border $range 
8770: 73 20 65 0a 09 72 65 74 75 72 6e 20 3c 24 7b 73  s e..return <${s
8780: 7d 2e 2e 2e 24 7b 65 7d 3e 0a 20 20 20 20 7d 0a  }...${e}>.    }.
8790: 0a 20 20 20 20 70 72 6f 63 20 42 6f 72 64 65 72  .    proc Border
87a0: 20 7b 72 61 6e 67 65 20 73 76 20 65 76 7d 20 7b   {range sv ev} {
87b0: 0a 09 75 70 76 61 72 20 31 20 24 73 76 20 73 20  ..upvar 1 $sv s 
87c0: 24 65 76 20 65 0a 09 73 65 74 20 73 20 5b 6c 69  $ev e..set s [li
87d0: 6e 64 65 78 20 24 72 61 6e 67 65 20 30 5d 0a 09  ndex $range 0]..
87e0: 73 65 74 20 65 20 5b 6c 69 6e 64 65 78 20 24 72  set e [lindex $r
87f0: 61 6e 67 65 20 65 6e 64 5d 0a 09 72 65 74 75 72  ange end]..retur
8800: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23  n.    }..    # #
8810: 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23   ## ### ##### ##
8820: 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23  ###### #########
8830: 23 23 23 23 0a 0a 20 20 20 20 70 72 6f 63 20 55  ####..    proc U
8840: 6e 6d 61 70 49 74 65 6d 73 20 7b 74 68 65 74 79  nmapItems {thety
8850: 70 65 20 74 68 65 69 74 65 6d 73 7d 20 7b 0a 09  pe theitems} {..
8860: 23 20 28 2a 29 20 57 65 20 63 6c 65 61 72 20 6f  # (*) We clear o
8870: 75 74 20 74 68 65 20 61 73 73 6f 63 69 61 74 65  ut the associate
8880: 64 20 70 61 72 74 20 6f 66 20 74 68 65 20 6d 79  d part of the my
8890: 69 74 65 6d 6d 61 70 0a 09 23 20 69 6e 2d 6d 65  itemmap..# in-me
88a0: 6d 6f 72 79 20 69 6e 64 65 78 20 69 6e 20 70 72  mory index in pr
88b0: 65 70 61 72 61 74 69 6f 6e 20 66 6f 72 20 6e 65  eparation for ne
88c0: 77 20 64 61 74 61 2c 20 6f 72 20 61 73 20 70 61  w data, or as pa
88d0: 72 74 20 6f 66 0a 09 23 20 6f 62 6a 65 63 74 20  rt of..# object 
88e0: 64 65 73 74 72 75 63 74 69 6f 6e 2e 20 41 20 73  destruction. A s
88f0: 69 6d 70 6c 65 20 75 6e 73 65 74 20 69 73 20 65  imple unset is e
8900: 6e 6f 75 67 68 2c 20 77 65 20 68 61 76 65 20 6e  nough, we have n
8910: 6f 0a 09 23 20 73 79 6d 62 6f 6c 20 63 68 61 6e  o..# symbol chan
8920: 67 65 73 65 74 73 20 61 74 20 74 68 69 73 20 74  gesets at this t
8930: 69 6d 65 2c 20 61 6e 64 20 74 68 75 73 20 6e 65  ime, and thus ne
8940: 76 65 72 20 6d 6f 72 65 20 74 68 61 6e 20 6f 6e  ver more than on
8950: 65 0a 09 23 20 72 65 66 65 72 65 6e 63 65 20 69  e..# reference i
8960: 6e 20 74 68 65 20 6c 69 73 74 2e 0a 0a 09 75 70  n the list....up
8970: 76 61 72 20 31 20 6d 79 69 74 65 6d 6d 61 70 20  var 1 myitemmap 
8980: 6d 79 69 74 65 6d 6d 61 70 20 73 65 6c 66 20 73  myitemmap self s
8990: 65 6c 66 0a 09 66 6f 72 65 61 63 68 20 69 69 64  elf..foreach iid
89a0: 20 24 74 68 65 69 74 65 6d 73 20 7b 0a 09 20 20   $theitems {..  
89b0: 20 20 73 65 74 20 6b 65 79 20 5b 6c 69 73 74 20    set key [list 
89c0: 24 74 68 65 74 79 70 65 20 24 69 69 64 5d 0a 09  $thetype $iid]..
89d0: 20 20 20 20 75 6e 73 65 74 20 6d 79 69 74 65 6d      unset myitem
89e0: 6d 61 70 28 24 6b 65 79 29 0a 09 20 20 20 20 6c  map($key)..    l
89f0: 6f 67 20 77 72 69 74 65 20 38 20 63 73 65 74 73  og write 8 csets
8a00: 20 7b 4d 41 50 2d 20 69 74 65 6d 20 3c 24 6b 65   {MAP- item <$ke
8a10: 79 3e 20 24 73 65 6c 66 20 3d 20 5b 24 73 65 6c  y> $self = [$sel
8a20: 66 20 73 74 72 5d 7d 0a 09 7d 0a 09 72 65 74 75  f str]}..}..retu
8a30: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72  rn.    }..    pr
8a40: 6f 63 20 4d 61 70 49 74 65 6d 73 20 7b 74 68 65  oc MapItems {the
8a50: 74 79 70 65 20 74 68 65 69 74 65 6d 73 7d 20 7b  type theitems} {
8a60: 0a 09 75 70 76 61 72 20 31 20 6d 79 69 74 65 6d  ..upvar 1 myitem
8a70: 6d 61 70 20 6d 79 69 74 65 6d 6d 61 70 20 73 65  map myitemmap se
8a80: 6c 66 20 73 65 6c 66 0a 0a 09 66 6f 72 65 61 63  lf self...foreac
8a90: 68 20 69 69 64 20 24 74 68 65 69 74 65 6d 73 20  h iid $theitems 
8aa0: 7b 0a 09 20 20 20 20 73 65 74 20 6b 65 79 20 5b  {..    set key [
8ab0: 6c 69 73 74 20 24 74 68 65 74 79 70 65 20 24 69  list $thetype $i
8ac0: 69 64 5d 0a 09 20 20 20 20 73 65 74 20 6d 79 69  id]..    set myi
8ad0: 74 65 6d 6d 61 70 28 24 6b 65 79 29 20 24 73 65  temmap($key) $se
8ae0: 6c 66 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74  lf..    log writ
8af0: 65 20 38 20 63 73 65 74 73 20 7b 4d 41 50 2b 20  e 8 csets {MAP+ 
8b00: 69 74 65 6d 20 3c 24 6b 65 79 3e 20 24 73 65 6c  item <$key> $sel
8b10: 66 20 3d 20 5b 24 73 65 6c 66 20 73 74 72 5d 7d  f = [$self str]}
8b20: 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  ..}..return.    
8b30: 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23  }..    # # ## ##
8b40: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
8b50: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 0a   #############..
8b60: 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65      typevariable
8b70: 20 6d 79 63 68 61 6e 67 65 73 65 74 73 20 20 20   mychangesets   
8b80: 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 4c 69 73        {} ; # Lis
8b90: 74 20 6f 66 20 61 6c 6c 20 6b 6e 6f 77 6e 0a 09  t of all known..
8ba0: 09 09 09 09 20 20 20 23 20 63 68 61 6e 67 65 73  ....   # changes
8bb0: 65 74 73 2e 0a 0a 20 20 20 20 23 20 4c 69 73 74  ets...    # List
8bc0: 20 6f 66 20 61 6c 6c 20 6b 6e 6f 77 6e 20 63 68   of all known ch
8bd0: 61 6e 67 65 73 65 74 73 20 6f 66 20 61 20 74 79  angesets of a ty
8be0: 70 65 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69  pe..    typevari
8bf0: 61 62 6c 65 20 6d 79 74 63 68 61 6e 67 65 73 65  able mytchangese
8c00: 74 73 20 2d 61 72 72 61 79 20 7b 0a 09 73 79 6d  ts -array {..sym
8c10: 3a 3a 62 72 61 6e 63 68 20 7b 7d 0a 09 73 79 6d  ::branch {}..sym
8c20: 3a 3a 74 61 67 20 20 20 20 7b 7d 0a 09 72 65 76  ::tag    {}..rev
8c30: 20 20 20 20 20 20 20 20 20 7b 7d 0a 20 20 20 20           {}.    
8c40: 7d 0a 09 09 09 09 09 0a 20 20 20 20 74 79 70 65  }.......    type
8c50: 76 61 72 69 61 62 6c 65 20 6d 79 69 74 65 6d 6d  variable myitemm
8c60: 61 70 20 20 20 20 20 2d 61 72 72 61 79 20 7b 7d  ap     -array {}
8c70: 20 3b 20 23 20 4d 61 70 20 66 72 6f 6d 20 69 74   ; # Map from it
8c80: 65 6d 73 20 28 74 61 67 67 65 64 29 0a 09 09 09  ems (tagged)....
8c90: 09 09 20 20 20 23 20 74 6f 20 74 68 65 20 6c 69  ..   # to the li
8ca0: 73 74 20 6f 66 20 63 68 61 6e 67 65 73 65 74 73  st of changesets
8cb0: 0a 09 09 09 09 09 20 20 20 23 20 63 6f 6e 74 61  ......   # conta
8cc0: 69 6e 69 6e 67 20 69 74 2e 20 45 61 63 68 20 69  ining it. Each i
8cd0: 74 65 6d 0a 09 09 09 09 09 20 20 20 23 20 63 61  tem......   # ca
8ce0: 6e 20 62 65 20 75 73 65 64 20 62 79 20 6f 6e 6c  n be used by onl
8cf0: 79 20 6f 6e 65 0a 09 09 09 09 09 20 20 20 23 20  y one......   # 
8d00: 63 68 61 6e 67 65 73 65 74 2e 0a 20 20 20 20 74  changeset..    t
8d10: 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 69 64  ypevariable myid
8d20: 6d 61 70 20 20 20 2d 61 72 72 61 79 20 7b 7d 20  map   -array {} 
8d30: 3b 20 23 20 4d 61 70 20 66 72 6f 6d 20 63 68 61  ; # Map from cha
8d40: 6e 67 65 73 65 74 20 69 64 20 74 6f 0a 09 09 09  ngeset id to....
8d50: 09 20 20 20 20 20 20 20 23 20 63 68 61 6e 67 65  .       # change
8d60: 73 65 74 2e 0a 0a 20 20 20 20 74 79 70 65 6d 65  set...    typeme
8d70: 74 68 6f 64 20 61 6c 6c 20 20 20 20 7b 7d 20 20  thod all    {}  
8d80: 20 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 63 68    { return $mych
8d90: 61 6e 67 65 73 65 74 73 20 7d 0a 20 20 20 20 74  angesets }.    t
8da0: 79 70 65 6d 65 74 68 6f 64 20 6f 66 20 20 20 20  ypemethod of    
8db0: 20 7b 63 69 64 7d 20 7b 20 72 65 74 75 72 6e 20   {cid} { return 
8dc0: 24 6d 79 69 64 6d 61 70 28 24 63 69 64 29 20 7d  $myidmap($cid) }
8dd0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
8de0: 6f 66 69 74 65 6d 20 7b 69 69 64 7d 20 7b 20 72  ofitem {iid} { r
8df0: 65 74 75 72 6e 20 24 6d 79 69 74 65 6d 6d 61 70  eturn $myitemmap
8e00: 28 24 69 69 64 29 20 7d 0a 0a 20 20 20 20 74 79  ($iid) }..    ty
8e10: 70 65 6d 65 74 68 6f 64 20 72 65 76 20 20 20 20  pemethod rev    
8e20: 7b 7d 20 20 20 20 7b 20 72 65 74 75 72 6e 20 24  {}    { return $
8e30: 6d 79 74 63 68 61 6e 67 65 73 65 74 73 28 72 65  mytchangesets(re
8e40: 76 29 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74  v) }.    typemet
8e50: 68 6f 64 20 73 79 6d 20 20 20 20 7b 7d 20 20 20  hod sym    {}   
8e60: 20 7b 20 72 65 74 75 72 6e 20 5b 63 6f 6e 63 61   { return [conca
8e70: 74 20 5c 0a 09 09 09 09 09 20 20 24 7b 6d 79 74  t \......  ${myt
8e80: 63 68 61 6e 67 65 73 65 74 73 28 73 79 6d 3a 3a  changesets(sym::
8e90: 62 72 61 6e 63 68 29 7d 20 5c 0a 09 09 09 09 09  branch)} \......
8ea0: 20 20 24 7b 6d 79 74 63 68 61 6e 67 65 73 65 74    ${mytchangeset
8eb0: 73 28 73 79 6d 3a 3a 74 61 67 29 7d 5d 20 7d 0a  s(sym::tag)}] }.
8ec0: 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20  .    # # ## ### 
8ed0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23  ##### ######## #
8ee0: 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 20 20  ############.   
8ef0: 20 23 23 20 43 6f 6e 66 69 67 75 72 61 74 69 6f   ## Configuratio
8f00: 6e 0a 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68  n..    pragma -h
8f10: 61 73 74 79 70 65 69 6e 66 6f 20 20 20 20 6e 6f  astypeinfo    no
8f20: 20 20 3b 20 23 20 6e 6f 20 74 79 70 65 20 69 6e    ; # no type in
8f30: 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20 20 20 20  trospection.    
8f40: 70 72 61 67 6d 61 20 2d 68 61 73 69 6e 66 6f 20  pragma -hasinfo 
8f50: 20 20 20 20 20 20 20 6e 6f 20 20 3b 20 23 20 6e         no  ; # n
8f60: 6f 20 6f 62 6a 65 63 74 20 69 6e 74 72 6f 73 70  o object introsp
8f70: 65 63 74 69 6f 6e 0a 0a 20 20 20 20 23 20 23 20  ection..    # # 
8f80: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
8f90: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
8fa0: 23 23 23 0a 7d 0a 0a 23 23 0a 23 23 20 4e 4f 54  ###.}..##.## NOT
8fb0: 45 3a 20 54 68 65 20 73 75 63 63 65 73 73 6f 72  E: The successor
8fc0: 20 61 6e 64 20 70 72 65 64 65 63 65 73 73 6f 72   and predecessor
8fd0: 20 6d 65 74 68 6f 64 73 20 64 65 66 69 6e 65 64   methods defined
8fe0: 20 62 79 20 74 68 65 20 63 6c 61 73 73 65 73 0a   by the classes.
8ff0: 23 23 20 20 20 20 20 20 20 62 65 6c 6f 77 20 61  ##       below a
9000: 72 65 20 2d 2d 20 62 6f 74 74 6c 65 20 6e 65 63  re -- bottle nec
9010: 6b 73 20 2d 2d 2e 20 4c 6f 6f 6b 20 66 6f 72 20  ks --. Look for 
9020: 77 61 79 73 20 74 6f 20 6d 61 6b 65 20 74 68 65  ways to make the
9030: 20 53 51 4c 0a 23 23 20 20 20 20 20 20 20 66 61   SQL.##       fa
9040: 73 74 65 72 2e 0a 23 23 0a 0a 23 20 23 20 23 23  ster..##..# # ##
9050: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23   ### ##### #####
9060: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
9070: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 23  # ##############
9080: 23 23 23 23 23 23 23 0a 23 23 20 48 65 6c 70 65  #######.## Helpe
9090: 72 20 73 69 6e 67 6c 65 74 6f 6e 2e 20 43 6f 6d  r singleton. Com
90a0: 6d 61 6e 64 73 20 66 6f 72 20 72 65 76 69 73 69  mands for revisi
90b0: 6f 6e 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a  on changesets...
90c0: 73 6e 69 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a  snit::type ::vc:
90d0: 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a  :fossil::import:
90e0: 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72  :cvs::project::r
90f0: 65 76 3a 3a 72 65 76 20 7b 0a 20 20 20 20 74 79  ev::rev {.    ty
9100: 70 65 6d 65 74 68 6f 64 20 62 79 72 65 76 69 73  pemethod byrevis
9110: 69 6f 6e 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20  ion {} { return 
9120: 31 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68  1 }.    typemeth
9130: 6f 64 20 62 79 73 79 6d 62 6f 6c 20 20 20 7b 7d  od bysymbol   {}
9140: 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20   { return 0 }.  
9150: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73 74    typemethod ist
9160: 61 67 20 20 20 20 20 20 7b 7d 20 7b 20 72 65 74  ag      {} { ret
9170: 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79 70 65  urn 0 }.    type
9180: 6d 65 74 68 6f 64 20 69 73 62 72 61 6e 63 68 20  method isbranch 
9190: 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20 30 20    {} { return 0 
91a0: 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  }..    typemetho
91b0: 64 20 73 74 72 20 7b 72 65 76 69 73 69 6f 6e 7d  d str {revision}
91c0: 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c 69 73 74   {..struct::list
91d0: 20 61 73 73 69 67 6e 20 5b 73 74 61 74 65 20 72   assign [state r
91e0: 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54  un {..    SELECT
91f0: 20 52 2e 72 65 76 2c 20 46 2e 6e 61 6d 65 2c 20   R.rev, F.name, 
9200: 50 2e 6e 61 6d 65 0a 09 20 20 20 20 46 52 4f 4d  P.name..    FROM
9210: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 66     revision R, f
9220: 69 6c 65 20 46 2c 20 70 72 6f 6a 65 63 74 20 50  ile F, project P
9230: 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e 72  ..    WHERE  R.r
9240: 69 64 20 3d 20 24 72 65 76 69 73 69 6f 6e 20 2d  id = $revision -
9250: 2d 20 46 69 6e 64 20 73 70 65 63 69 66 69 65 64  - Find specified
9260: 20 66 69 6c 65 20 72 65 76 69 73 69 6f 6e 0a 09   file revision..
9270: 20 20 20 20 41 4e 44 20 20 20 20 46 2e 66 69 64      AND    F.fid
9280: 20 3d 20 52 2e 66 69 64 20 20 20 20 20 2d 2d 20   = R.fid     -- 
9290: 47 65 74 20 66 69 6c 65 20 6f 66 20 74 68 65 20  Get file of the 
92a0: 72 65 76 69 73 69 6f 6e 0a 09 20 20 20 20 41 4e  revision..    AN
92b0: 44 20 20 20 20 50 2e 70 69 64 20 3d 20 46 2e 70  D    P.pid = F.p
92c0: 69 64 20 20 20 20 20 2d 2d 20 47 65 74 20 70 72  id     -- Get pr
92d0: 6f 6a 65 63 74 20 6f 66 20 74 68 65 20 66 69 6c  oject of the fil
92e0: 65 2e 0a 09 7d 5d 20 72 65 76 6e 72 20 66 6e 61  e...}] revnr fna
92f0: 6d 65 20 70 6e 61 6d 65 0a 09 72 65 74 75 72 6e  me pname..return
9300: 20 22 24 70 6e 61 6d 65 2f 24 7b 72 65 76 6e 72   "$pname/${revnr
9310: 7d 3a 3a 24 66 6e 61 6d 65 22 0a 20 20 20 20 7d  }::$fname".    }
9320: 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d  ..    # result =
9330: 20 6c 69 73 74 20 28 6d 69 6e 74 69 6d 65 2c 20   list (mintime, 
9340: 6d 61 78 74 69 6d 65 29 0a 20 20 20 20 74 79 70  maxtime).    typ
9350: 65 6d 65 74 68 6f 64 20 74 69 6d 65 72 61 6e 67  emethod timerang
9360: 65 20 7b 69 74 65 6d 73 7d 20 7b 0a 09 73 65 74  e {items} {..set
9370: 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20   theset ('[join 
9380: 24 69 74 65 6d 73 20 7b 27 2c 27 7d 5d 27 29 0a  $items {','}]').
9390: 09 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72  .return [state r
93a0: 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d  un [subst -nocom
93b0: 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61  mands -nobacksla
93c0: 73 68 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45  shes {..    SELE
93d0: 43 54 20 4d 49 4e 28 52 2e 64 61 74 65 29 2c 20  CT MIN(R.date), 
93e0: 4d 41 58 28 52 2e 64 61 74 65 29 0a 09 20 20 20  MAX(R.date)..   
93f0: 20 46 52 4f 4d 20 72 65 76 69 73 69 6f 6e 20 52   FROM revision R
9400: 0a 09 20 20 20 20 57 48 45 52 45 20 52 2e 72 69  ..    WHERE R.ri
9410: 64 20 49 4e 20 24 74 68 65 73 65 74 20 2d 2d 20  d IN $theset -- 
9420: 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69  Restrict to revi
9430: 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73  sions of interes
9440: 74 0a 09 7d 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20  t..}]].    }..  
9450: 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 69    # var(dv) = di
9460: 63 74 20 28 72 65 76 69 73 69 6f 6e 20 2d 3e 20  ct (revision -> 
9470: 6c 69 73 74 20 28 72 65 76 69 73 69 6f 6e 29 29  list (revision))
9480: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
9490: 69 6e 74 65 72 6e 61 6c 73 75 63 63 65 73 73 6f  internalsuccesso
94a0: 72 73 20 7b 64 76 20 72 65 76 69 73 69 6f 6e 73  rs {dv revisions
94b0: 7d 20 7b 0a 09 75 70 76 61 72 20 31 20 24 64 76  } {..upvar 1 $dv
94c0: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 73   dependencies..s
94d0: 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a 6f 69  et theset ('[joi
94e0: 6e 20 24 72 65 76 69 73 69 6f 6e 73 20 7b 27 2c  n $revisions {',
94f0: 27 7d 5d 27 29 0a 0a 09 6c 6f 67 20 77 72 69 74  '}]')...log writ
9500: 65 20 31 34 20 63 73 65 74 73 20 69 6e 74 65 72  e 14 csets inter
9510: 6e 61 6c 73 75 63 63 65 73 73 6f 72 73 0a 0a 09  nalsuccessors...
9520: 23 20 53 65 65 20 27 73 75 63 63 65 73 73 6f 72  # See 'successor
9530: 73 27 20 62 65 6c 6f 77 20 66 6f 72 20 74 68 65  s' below for the
9540: 20 6d 61 69 6e 20 65 78 70 6c 61 6e 61 74 69 6f   main explanatio
9550: 6e 20 6f 66 0a 09 23 20 74 68 65 20 76 61 72 69  n of..# the vari
9560: 6f 75 73 20 63 61 73 65 73 2e 20 54 68 69 73 20  ous cases. This 
9570: 70 69 65 63 65 20 69 73 20 73 70 65 63 69 61 6c  piece is special
9580: 20 69 6e 20 74 68 61 74 20 69 74 0a 09 23 20 72   in that it..# r
9590: 65 73 74 72 69 63 74 73 20 74 68 65 20 73 75 63  estricts the suc
95a0: 63 65 73 73 6f 72 73 20 77 65 20 6c 6f 6f 6b 20  cessors we look 
95b0: 66 6f 72 20 74 6f 20 74 68 65 20 73 61 6d 65 20  for to the same 
95c0: 73 65 74 20 6f 66 0a 09 23 20 72 65 76 69 73 69  set of..# revisi
95d0: 6f 6e 73 20 77 65 20 73 74 61 72 74 20 66 72 6f  ons we start fro
95e0: 6d 2e 20 53 65 6e 73 69 62 6c 65 20 61 73 20 77  m. Sensible as w
95f0: 65 20 61 72 65 20 6c 6f 6f 6b 69 6e 67 20 66 6f  e are looking fo
9600: 72 0a 09 23 20 63 68 61 6e 67 65 73 65 74 20 69  r..# changeset i
9610: 6e 74 65 72 6e 61 6c 20 64 65 70 65 6e 64 65 6e  nternal dependen
9620: 63 69 65 73 2e 0a 0a 09 61 72 72 61 79 20 73 65  cies....array se
9630: 74 20 64 65 70 20 7b 7d 0a 0a 09 73 74 61 74 65  t dep {}...state
9640: 20 66 6f 72 65 61 63 68 72 6f 77 20 5b 73 75 62   foreachrow [sub
9650: 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d  st -nocommands -
9660: 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a  nobackslashes {.
9670: 20 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d 61      -- (1) Prima
9680: 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20 53 45  ry child..    SE
9690: 4c 45 43 54 20 52 2e 72 69 64 20 41 53 20 78 72  LECT R.rid AS xr
96a0: 69 64 2c 20 52 2e 63 68 69 6c 64 20 41 53 20 78  id, R.child AS x
96b0: 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20  child..    FROM 
96c0: 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20 20    revision R..  
96d0: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20    WHERE  R.rid  
96e0: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20   IN $theset     
96f0: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72  -- Restrict to r
9700: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65  evisions of inte
9710: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
9720: 20 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20   R.child IS NOT 
9730: 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70  NULL    -- Has p
9740: 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20  rimary child..  
9750: 20 20 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64    AND    R.child
9760: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20   IN $theset     
9770: 2d 2d 20 57 68 69 63 68 20 69 73 20 61 6c 73 6f  -- Which is also
9780: 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 20 20 20   of interest.   
9790: 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 32   UNION.    -- (2
97a0: 29 20 53 65 63 6f 6e 64 61 72 79 20 28 62 72 61  ) Secondary (bra
97b0: 6e 63 68 29 20 63 68 69 6c 64 72 65 6e 0a 09 20  nch) children.. 
97c0: 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 20     SELECT R.rid 
97d0: 41 53 20 78 72 69 64 2c 20 42 2e 62 72 69 64 20  AS xrid, B.brid 
97e0: 41 53 20 78 63 68 69 6c 64 0a 09 20 20 20 20 46  AS xchild..    F
97f0: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52  ROM   revision R
9800: 2c 20 72 65 76 69 73 69 6f 6e 62 72 61 6e 63 68  , revisionbranch
9810: 63 68 69 6c 64 72 65 6e 20 42 0a 09 20 20 20 20  children B..    
9820: 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49  WHERE  R.rid   I
9830: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d  N $theset     --
9840: 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76   Restrict to rev
9850: 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65  isions of intere
9860: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  st..    AND    R
9870: 2e 72 69 64 20 3d 20 42 2e 72 69 64 20 20 20 20  .rid = B.rid    
9880: 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20        -- Select 
9890: 73 75 62 73 65 74 20 6f 66 20 62 72 61 6e 63 68  subset of branch
98a0: 20 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 41   children..    A
98b0: 4e 44 20 20 20 20 42 2e 62 72 69 64 20 49 4e 20  ND    B.brid IN 
98c0: 24 74 68 65 73 65 74 20 20 20 20 20 20 2d 2d 20  $theset      -- 
98d0: 57 68 69 63 68 20 69 73 20 61 6c 73 6f 20 6f 66  Which is also of
98e0: 20 69 6e 74 65 72 65 73 74 0a 20 20 20 20 55 4e   interest.    UN
98f0: 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 34 29 20 43  ION.    -- (4) C
9900: 68 69 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f  hild of trunk ro
9910: 6f 74 20 73 75 63 63 65 73 73 6f 72 20 6f 66 20  ot successor of 
9920: 6c 61 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 75  last NTDB on tru
9930: 6e 6b 2e 0a 09 20 20 20 20 53 45 4c 45 43 54 20  nk...    SELECT 
9940: 52 2e 72 69 64 20 41 53 20 78 72 69 64 2c 20 52  R.rid AS xrid, R
9950: 41 2e 63 68 69 6c 64 20 41 53 20 78 63 68 69 6c  A.child AS xchil
9960: 64 0a 09 20 20 20 20 46 52 4f 4d 20 72 65 76 69  d..    FROM revi
9970: 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e  sion R, revision
9980: 20 52 41 0a 09 20 20 20 20 57 48 45 52 45 20 52   RA..    WHERE R
9990: 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65  .rid   IN $these
99a0: 74 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69  t      -- Restri
99b0: 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20  ct to revisions 
99c0: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20  of interest..   
99d0: 20 41 4e 44 20 20 20 52 2e 69 73 64 65 66 61 75   AND   R.isdefau
99e0: 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  lt             -
99f0: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 4e 54  - Restrict to NT
9a00: 44 42 0a 09 20 20 20 20 41 4e 44 20 20 20 52 2e  DB..    AND   R.
9a10: 64 62 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e  dbchild IS NOT N
9a20: 55 4c 4c 20 20 20 2d 2d 20 61 6e 64 20 6c 61 73  ULL   -- and las
9a30: 74 20 4e 54 44 42 20 62 65 6c 6f 6e 67 69 6e 67  t NTDB belonging
9a40: 20 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20 41   to trunk..    A
9a50: 4e 44 20 20 20 52 41 2e 72 69 64 20 3d 20 52 2e  ND   RA.rid = R.
9a60: 64 62 63 68 69 6c 64 20 20 20 20 20 20 2d 2d 20  dbchild      -- 
9a70: 47 6f 20 64 69 72 65 63 74 6c 79 20 74 6f 20 74  Go directly to t
9a80: 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20 20 41  runk root..    A
9a90: 4e 44 20 20 20 52 41 2e 63 68 69 6c 64 20 49 53  ND   RA.child IS
9aa0: 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20   NOT NULL    -- 
9ab0: 48 61 73 20 70 72 69 6d 61 72 79 20 63 68 69 6c  Has primary chil
9ac0: 64 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 41  d..            A
9ad0: 4e 44 20 20 20 52 41 2e 63 68 69 6c 64 20 49 4e  ND   RA.child IN
9ae0: 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20   $theset     -- 
9af0: 57 68 69 63 68 20 69 73 20 61 6c 73 6f 20 6f 66  Which is also of
9b00: 20 69 6e 74 65 72 65 73 74 0a 09 7d 5d 20 7b 0a   interest..}] {.
9b10: 09 20 20 20 20 23 20 43 6f 6e 73 69 64 65 72 20  .    # Consider 
9b20: 6d 6f 76 69 6e 67 20 74 68 69 73 20 74 6f 20 74  moving this to t
9b30: 68 65 20 69 6e 74 65 67 72 69 74 79 20 6d 6f 64  he integrity mod
9b40: 75 6c 65 2e 0a 09 20 20 20 20 69 6e 74 65 67 72  ule...    integr
9b50: 69 74 79 20 61 73 73 65 72 74 20 7b 24 78 72 69  ity assert {$xri
9b60: 64 20 21 3d 20 24 78 63 68 69 6c 64 7d 20 7b 52  d != $xchild} {R
9b70: 65 76 69 73 69 6f 6e 20 24 78 72 69 64 20 64 65  evision $xrid de
9b80: 70 65 6e 64 73 20 6f 6e 20 69 74 73 65 6c 66 2e  pends on itself.
9b90: 7d 0a 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64  }..    lappend d
9ba0: 65 70 65 6e 64 65 6e 63 69 65 73 28 24 78 72 69  ependencies($xri
9bb0: 64 29 20 24 78 63 68 69 6c 64 0a 09 20 20 20 20  d) $xchild..    
9bc0: 73 65 74 20 64 65 70 28 24 78 72 69 64 2c 24 78  set dep($xrid,$x
9bd0: 63 68 69 6c 64 29 20 2e 0a 09 7d 0a 0a 09 23 20  child) ...}...# 
9be0: 54 68 65 20 73 71 6c 20 73 74 61 74 65 6d 65 6e  The sql statemen
9bf0: 74 73 20 61 62 6f 76 65 20 6c 6f 6f 6b 73 20 6f  ts above looks o
9c00: 6e 6c 79 20 66 6f 72 20 64 69 72 65 63 74 20 64  nly for direct d
9c10: 65 70 65 6e 64 65 6e 63 69 65 73 0a 09 23 20 62  ependencies..# b
9c20: 65 74 77 65 65 6e 20 72 65 76 69 73 69 6f 6e 20  etween revision 
9c30: 69 6e 20 74 68 65 20 63 68 61 6e 67 65 73 65 74  in the changeset
9c40: 2e 20 48 6f 77 65 76 65 72 20 64 75 65 20 74 6f  . However due to
9c50: 20 74 68 65 0a 09 23 20 76 61 67 61 72 69 65 73   the..# vagaries
9c60: 20 6f 66 20 6d 65 74 61 20 64 61 74 61 20 69 74   of meta data it
9c70: 20 69 73 20 70 6f 73 73 69 62 6c 65 20 66 6f 72   is possible for
9c80: 20 74 77 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f   two revisions o
9c90: 66 0a 09 23 20 74 68 65 20 73 61 6d 65 20 66 69  f..# the same fi
9ca0: 6c 65 20 74 6f 20 65 6e 64 20 75 70 20 69 6e 20  le to end up in 
9cb0: 74 68 65 20 73 61 6d 65 20 63 68 61 6e 67 65 73  the same changes
9cc0: 65 74 2c 20 77 69 74 68 6f 75 74 20 61 0a 09 23  et, without a..#
9cd0: 20 64 69 72 65 63 74 20 64 65 70 65 6e 64 65 6e   direct dependen
9ce0: 63 79 20 62 65 74 77 65 65 6e 20 74 68 65 6d 2e  cy between them.
9cf0: 20 48 6f 77 65 76 65 72 20 77 65 20 6b 6e 6f 77   However we know
9d00: 20 74 68 61 74 20 74 68 65 72 65 0a 09 23 20 68   that there..# h
9d10: 61 73 20 74 6f 20 62 65 20 61 20 61 6e 20 69 6e  as to be a an in
9d20: 64 69 72 65 63 74 20 64 65 70 65 6e 64 65 6e 63  direct dependenc
9d30: 79 2c 20 62 65 20 69 74 20 74 68 72 6f 75 67 68  y, be it through
9d40: 20 70 72 69 6d 61 72 79 0a 09 23 20 63 68 69 6c   primary..# chil
9d50: 64 72 65 6e 2c 20 62 72 61 6e 63 68 20 63 68 69  dren, branch chi
9d60: 6c 64 72 65 6e 2c 20 6f 72 20 61 20 63 6f 6d 62  ldren, or a comb
9d70: 69 6e 61 74 69 6f 6e 20 74 68 65 72 65 6f 66 2e  ination thereof.
9d80: 0a 0a 09 23 20 57 65 20 6e 6f 77 20 66 69 6c 6c  ...# We now fill
9d90: 20 69 6e 20 74 68 65 73 65 20 70 73 65 75 64 6f   in these pseudo
9da0: 2d 64 65 70 65 6e 64 65 6e 63 69 65 73 2c 20 69  -dependencies, i
9db0: 66 20 6e 6f 20 73 75 63 68 0a 09 23 20 64 65 70  f no such..# dep
9dc0: 65 6e 64 65 6e 63 79 20 65 78 69 73 74 73 20 61  endency exists a
9dd0: 6c 72 65 61 64 79 2e 20 54 68 65 20 64 69 72 65  lready. The dire
9de0: 63 74 69 6f 6e 20 6f 66 20 74 68 65 20 64 65 70  ction of the dep
9df0: 65 6e 64 65 6e 63 79 0a 09 23 20 69 73 20 61 63  endency..# is ac
9e00: 74 75 61 6c 6c 79 20 69 72 72 65 6c 65 76 61 6e  tually irrelevan
9e10: 74 20 66 6f 72 20 74 68 69 73 2e 0a 0a 09 23 20  t for this....# 
9e20: 4e 4f 54 45 3a 20 54 68 69 73 20 69 73 20 64 69  NOTE: This is di
9e30: 66 66 65 72 65 6e 74 20 66 72 6f 6d 20 63 76 73  fferent from cvs
9e40: 32 73 76 6e 2e 20 4f 75 72 20 73 70 69 72 69 74  2svn. Our spirit
9e50: 75 61 6c 20 61 6e 63 65 73 74 6f 72 0a 09 23 20  ual ancestor..# 
9e60: 64 6f 65 73 20 6e 6f 74 20 75 73 65 20 73 75 63  does not use suc
9e70: 68 20 70 73 65 75 64 6f 2d 64 65 70 65 6e 64 65  h pseudo-depende
9e80: 6e 63 69 65 73 2c 20 68 6f 77 65 76 65 72 20 69  ncies, however i
9e90: 74 20 75 73 65 73 20 61 0a 09 23 20 43 4f 4d 4d  t uses a..# COMM
9ea0: 49 54 5f 54 48 52 45 53 48 4f 4c 44 2c 20 61 20  IT_THRESHOLD, a 
9eb0: 74 69 6d 65 20 69 6e 74 65 72 76 61 6c 20 63 6f  time interval co
9ec0: 6d 6d 69 74 73 20 73 68 6f 75 6c 64 20 66 61 6c  mmits should fal
9ed0: 6c 2e 20 54 68 69 73 0a 09 23 20 77 69 6c 6c 20  l. This..# will 
9ee0: 67 72 65 61 74 6c 79 20 72 65 64 75 63 65 73 20  greatly reduces 
9ef0: 74 68 65 20 72 69 73 6b 20 6f 66 20 67 65 74 74  the risk of gett
9f00: 69 6e 67 20 66 61 72 20 73 65 70 61 72 61 74 65  ing far separate
9f10: 64 0a 09 23 20 72 65 76 69 73 69 6f 6e 73 20 6f  d..# revisions o
9f20: 66 20 74 68 65 20 73 61 6d 65 20 66 69 6c 65 20  f the same file 
9f30: 69 6e 74 6f 20 6f 6e 65 20 63 68 61 6e 67 65 73  into one changes
9f40: 65 74 2e 0a 0a 09 23 20 57 65 20 61 6c 6c 6f 77  et....# We allow
9f50: 20 72 65 76 69 73 69 6f 6e 73 20 74 6f 20 62 65   revisions to be
9f60: 20 66 61 72 20 61 70 61 72 74 20 69 6e 20 74 69   far apart in ti
9f70: 6d 65 20 69 6e 20 74 68 65 20 73 61 6d 65 0a 09  me in the same..
9f80: 23 20 63 68 61 6e 67 65 73 65 74 2c 20 62 75 74  # changeset, but
9f90: 20 69 6e 20 74 75 72 6e 20 6e 65 65 64 20 74 68   in turn need th
9fa0: 65 20 70 73 65 75 64 6f 2d 64 65 70 65 6e 64 65  e pseudo-depende
9fb0: 6e 63 69 65 73 20 74 6f 0a 09 23 20 68 61 6e 64  ncies to..# hand
9fc0: 6c 65 20 74 68 69 73 2e 0a 0a 09 6c 6f 67 20 77  le this....log w
9fd0: 72 69 74 65 20 31 34 20 63 73 65 74 73 20 7b 69  rite 14 csets {i
9fe0: 6e 74 65 72 6e 61 6c 20 20 5b 61 72 72 61 79 20  nternal  [array 
9ff0: 73 69 7a 65 20 64 65 70 5d 7d 0a 09 6c 6f 67 20  size dep]}..log 
a000: 77 72 69 74 65 20 31 34 20 63 73 65 74 73 20 7b  write 14 csets {
a010: 63 6f 6c 6c 65 63 74 65 64 20 5b 61 72 72 61 79  collected [array
a020: 20 73 69 7a 65 20 64 65 70 65 6e 64 65 6e 63 69   size dependenci
a030: 65 73 5d 7d 0a 09 6c 6f 67 20 77 72 69 74 65 20  es]}..log write 
a040: 31 34 20 63 73 65 74 73 20 70 73 65 75 64 6f 2d  14 csets pseudo-
a050: 69 6e 74 65 72 6e 61 6c 73 75 63 63 65 73 73 6f  internalsuccesso
a060: 72 73 0a 0a 09 61 72 72 61 79 20 73 65 74 20 66  rs...array set f
a070: 69 64 73 20 7b 7d 0a 09 73 74 61 74 65 20 66 6f  ids {}..state fo
a080: 72 65 61 63 68 72 6f 77 20 5b 73 75 62 73 74 20  reachrow [subst 
a090: 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62  -nocommands -nob
a0a0: 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20  ackslashes {..  
a0b0: 20 20 53 45 4c 45 43 54 20 52 2e 72 69 64 20 41    SELECT R.rid A
a0c0: 53 20 78 72 69 64 2c 20 52 2e 66 69 64 20 41 53  S xrid, R.fid AS
a0d0: 20 78 66 69 64 0a 20 20 20 20 20 20 20 20 20 20   xfid.          
a0e0: 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f    FROM   revisio
a0f0: 6e 20 52 0a 20 20 20 20 20 20 20 20 20 20 20 20  n R.            
a100: 57 48 45 52 45 20 20 52 2e 72 69 64 20 49 4e 20  WHERE  R.rid IN 
a110: 24 74 68 65 73 65 74 0a 09 7d 5d 20 7b 20 6c 61  $theset..}] { la
a120: 70 70 65 6e 64 20 66 69 64 73 28 24 78 66 69 64  ppend fids($xfid
a130: 29 20 24 78 72 69 64 20 7d 0a 0a 09 73 65 74 20  ) $xrid }...set 
a140: 67 72 6f 75 70 73 20 7b 7d 0a 09 66 6f 72 65 61  groups {}..forea
a150: 63 68 20 7b 66 69 64 20 72 69 64 73 7d 20 5b 61  ch {fid rids} [a
a160: 72 72 61 79 20 67 65 74 20 66 69 64 73 5d 20 7b  rray get fids] {
a170: 0a 09 20 20 20 20 69 66 20 7b 5b 6c 6c 65 6e 67  ..    if {[lleng
a180: 74 68 20 24 72 69 64 73 5d 20 3c 20 32 7d 20 63  th $rids] < 2} c
a190: 6f 6e 74 69 6e 75 65 0a 09 20 20 20 20 66 6f 72  ontinue..    for
a1a0: 65 61 63 68 20 61 20 24 72 69 64 73 20 7b 0a 09  each a $rids {..
a1b0: 09 66 6f 72 65 61 63 68 20 62 20 24 72 69 64 73  .foreach b $rids
a1c0: 20 7b 0a 09 09 20 20 20 20 69 66 20 7b 24 61 20   {...    if {$a 
a1d0: 3d 3d 20 24 62 7d 20 63 6f 6e 74 69 6e 75 65 0a  == $b} continue.
a1e0: 09 09 20 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20  ..    if {[info 
a1f0: 65 78 69 73 74 73 20 64 65 70 28 24 61 2c 24 62  exists dep($a,$b
a200: 29 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 09 20  )]} continue... 
a210: 20 20 20 69 66 20 7b 5b 69 6e 66 6f 20 65 78 69     if {[info exi
a220: 73 74 73 20 64 65 70 28 24 62 2c 24 61 29 5d 7d  sts dep($b,$a)]}
a230: 20 63 6f 6e 74 69 6e 75 65 0a 09 09 20 20 20 20   continue...    
a240: 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64 65 6e  lappend dependen
a250: 63 69 65 73 28 24 61 29 20 24 62 0a 09 09 20 20  cies($a) $b...  
a260: 20 20 73 65 74 20 64 65 70 28 24 61 2c 24 62 29    set dep($a,$b)
a270: 20 2e 0a 09 09 20 20 20 20 73 65 74 20 64 65 70   ....    set dep
a280: 28 24 62 2c 24 61 29 20 2e 0a 09 09 7d 0a 09 20  ($b,$a) ....}.. 
a290: 20 20 20 7d 0a 09 20 20 20 20 73 65 74 20 6e 20     }..    set n 
a2a0: 5b 6c 6c 65 6e 67 74 68 20 24 72 69 64 73 5d 0a  [llength $rids].
a2b0: 09 20 20 20 20 6c 61 70 70 65 6e 64 20 67 72 6f  .    lappend gro
a2c0: 75 70 73 20 5b 6c 69 73 74 20 24 6e 20 5b 65 78  ups [list $n [ex
a2d0: 70 72 20 7b 28 24 6e 2a 24 6e 2d 24 6e 29 2f 32  pr {($n*$n-$n)/2
a2e0: 7d 5d 5d 0a 09 7d 0a 0a 09 6c 6f 67 20 77 72 69  }]]..}...log wri
a2f0: 74 65 20 31 34 20 63 73 65 74 73 20 7b 70 73 65  te 14 csets {pse
a300: 75 64 6f 20 20 20 20 5b 61 72 72 61 79 20 73 69  udo    [array si
a310: 7a 65 20 66 69 64 73 5d 20 28 5b 6c 73 6f 72 74  ze fids] ([lsort
a320: 20 2d 69 6e 64 65 78 20 30 20 2d 64 65 63 72 65   -index 0 -decre
a330: 61 73 69 6e 67 20 2d 69 6e 74 65 67 65 72 20 24  asing -integer $
a340: 67 72 6f 75 70 73 5d 29 7d 0a 09 6c 6f 67 20 77  groups])}..log w
a350: 72 69 74 65 20 31 34 20 63 73 65 74 73 20 7b 69  rite 14 csets {i
a360: 6e 74 65 72 6e 61 6c 20 20 5b 61 72 72 61 79 20  nternal  [array 
a370: 73 69 7a 65 20 64 65 70 5d 7d 0a 09 6c 6f 67 20  size dep]}..log 
a380: 77 72 69 74 65 20 31 34 20 63 73 65 74 73 20 7b  write 14 csets {
a390: 63 6f 6c 6c 65 63 74 65 64 20 5b 61 72 72 61 79  collected [array
a3a0: 20 73 69 7a 65 20 64 65 70 65 6e 64 65 6e 63 69   size dependenci
a3b0: 65 73 5d 7d 0a 09 6c 6f 67 20 77 72 69 74 65 20  es]}..log write 
a3c0: 31 34 20 63 73 65 74 73 20 63 6f 6d 70 6c 65 74  14 csets complet
a3d0: 65 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  e..return.    }.
a3e0: 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d 20  .    # result = 
a3f0: 34 2d 6c 69 73 74 20 28 69 74 65 6d 74 79 70 65  4-list (itemtype
a400: 20 69 74 65 6d 69 64 20 6e 65 78 74 69 74 65 6d   itemid nextitem
a410: 74 79 70 65 20 6e 65 78 74 69 74 65 6d 69 64 20  type nextitemid 
a420: 2e 2e 2e 29 0a 20 20 20 20 74 79 70 65 6d 65 74  ...).    typemet
a430: 68 6f 64 20 6c 6f 6f 70 73 20 7b 72 65 76 69 73  hod loops {revis
a440: 69 6f 6e 73 7d 20 7b 0a 09 23 20 4e 6f 74 65 3a  ions} {..# Note:
a450: 20 54 61 67 73 20 61 6e 64 20 62 72 61 6e 63 68   Tags and branch
a460: 65 73 20 63 61 6e 6e 6f 74 20 63 61 75 73 65 20  es cannot cause 
a470: 74 68 65 20 6c 6f 6f 70 2e 20 54 68 65 69 72 20  the loop. Their 
a480: 69 64 27 73 2c 0a 09 23 20 62 65 69 6e 67 20 6f  id's,..# being o
a490: 66 20 61 20 66 75 6e 64 61 6d 65 6e 74 61 6c 6c  f a fundamentall
a4a0: 79 20 64 69 66 66 65 72 65 6e 74 20 74 79 70 65  y different type
a4b0: 20 74 68 61 6e 20 74 68 65 20 72 65 76 69 73 69   than the revisi
a4c0: 6f 6e 73 0a 09 23 20 63 6f 6d 69 6e 67 20 69 6e  ons..# coming in
a4d0: 20 63 61 6e 6e 6f 74 20 62 65 20 69 6e 20 74 68   cannot be in th
a4e0: 65 20 73 65 74 2e 0a 0a 09 73 65 74 20 74 68 65  e set....set the
a4f0: 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76  set ('[join $rev
a500: 69 73 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a  isions {','}]').
a510: 09 72 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72  .return [state r
a520: 75 6e 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d  un [subst -nocom
a530: 6d 61 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61  mands -nobacksla
a540: 73 68 65 73 20 7b 0a 09 20 20 20 20 2d 2d 20 28  shes {..    -- (
a550: 31 29 20 50 72 69 6d 61 72 79 20 63 68 69 6c 64  1) Primary child
a560: 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72  ..    SELECT R.r
a570: 69 64 2c 20 52 2e 63 68 69 6c 64 0a 09 20 20 20  id, R.child..   
a580: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
a590: 20 52 0a 09 20 20 20 20 57 48 45 52 45 20 20 52   R..    WHERE  R
a5a0: 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65  .rid   IN $these
a5b0: 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63  t     -- Restric
a5c0: 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f  t to revisions o
a5d0: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20  f interest..    
a5e0: 41 4e 44 20 20 20 20 52 2e 63 68 69 6c 64 20 49  AND    R.child I
a5f0: 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d 2d  S NOT NULL    --
a600: 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 68 69   Has primary chi
a610: 6c 64 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  ld..    AND    R
a620: 2e 63 68 69 6c 64 20 49 4e 20 24 74 68 65 73 65  .child IN $these
a630: 74 20 20 20 20 20 2d 2d 20 4c 6f 6f 70 0a 09 20  t     -- Loop.. 
a640: 20 20 20 2d 2d 0a 09 20 20 20 20 55 4e 49 4f 4e     --..    UNION
a650: 0a 09 20 20 20 20 2d 2d 20 28 32 29 20 53 65 63  ..    -- (2) Sec
a660: 6f 6e 64 61 72 79 20 28 62 72 61 6e 63 68 29 20  ondary (branch) 
a670: 63 68 69 6c 64 72 65 6e 0a 09 20 20 20 20 53 45  children..    SE
a680: 4c 45 43 54 20 52 2e 72 69 64 2c 20 42 2e 62 72  LECT R.rid, B.br
a690: 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72  id..    FROM   r
a6a0: 65 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73  evision R, revis
a6b0: 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c 64 72 65  ionbranchchildre
a6c0: 6e 20 42 0a 09 20 20 20 20 57 48 45 52 45 20 20  n B..    WHERE  
a6d0: 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73  R.rid   IN $thes
a6e0: 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69  et     -- Restri
a6f0: 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20  ct to revisions 
a700: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20  of interest..   
a710: 20 41 4e 44 20 20 20 20 52 2e 72 69 64 20 3d 20   AND    R.rid = 
a720: 42 2e 72 69 64 20 20 20 20 20 20 20 20 20 20 2d  B.rid          -
a730: 2d 20 53 65 6c 65 63 74 20 73 75 62 73 65 74 20  - Select subset 
a740: 6f 66 20 62 72 61 6e 63 68 20 63 68 69 6c 64 72  of branch childr
a750: 65 6e 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42  en..    AND    B
a760: 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65 73 65  .rid   IN $these
a770: 74 20 20 20 20 20 2d 2d 20 4c 6f 6f 70 0a 09 20  t     -- Loop.. 
a780: 20 20 20 2d 2d 0a 09 20 20 20 20 55 4e 49 4f 4e     --..    UNION
a790: 0a 09 20 20 20 20 2d 2d 20 28 34 29 20 43 68 69  ..    -- (4) Chi
a7a0: 6c 64 20 6f 66 20 74 72 75 6e 6b 20 72 6f 6f 74  ld of trunk root
a7b0: 20 73 75 63 63 65 73 73 6f 72 20 6f 66 20 6c 61   successor of la
a7c0: 73 74 20 4e 54 44 42 20 6f 6e 20 74 72 75 6e 6b  st NTDB on trunk
a7d0: 2e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e  ...    SELECT R.
a7e0: 72 69 64 2c 20 52 41 2e 63 68 69 6c 64 0a 09 20  rid, RA.child.. 
a7f0: 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69     FROM   revisi
a800: 6f 6e 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 52  on R, revision R
a810: 41 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e  A..    WHERE  R.
a820: 72 69 64 20 20 20 20 49 4e 20 24 74 68 65 73 65  rid    IN $these
a830: 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63  t     -- Restric
a840: 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f  t to revisions o
a850: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20  f interest..    
a860: 41 4e 44 20 20 20 20 52 2e 69 73 64 65 66 61 75  AND    R.isdefau
a870: 6c 74 20 20 20 20 20 20 20 20 20 20 20 20 20 2d  lt             -
a880: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 4e 54  - Restrict to NT
a890: 44 42 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  DB..    AND    R
a8a0: 2e 64 62 63 68 69 6c 64 20 49 53 20 4e 4f 54 20  .dbchild IS NOT 
a8b0: 4e 55 4c 4c 20 20 20 2d 2d 20 61 6e 64 20 6c 61  NULL   -- and la
a8c0: 73 74 20 4e 54 44 42 20 62 65 6c 6f 6e 67 69 6e  st NTDB belongin
a8d0: 67 20 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20 20  g to trunk..    
a8e0: 41 4e 44 20 20 20 20 52 41 2e 72 69 64 20 3d 20  AND    RA.rid = 
a8f0: 52 2e 64 62 63 68 69 6c 64 20 20 20 20 20 20 2d  R.dbchild      -
a900: 2d 20 47 6f 20 64 69 72 65 63 74 6c 79 20 74 6f  - Go directly to
a910: 20 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20   trunk root..   
a920: 20 41 4e 44 20 20 20 20 52 41 2e 63 68 69 6c 64   AND    RA.child
a930: 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20   IS NOT NULL    
a940: 2d 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 63  -- Has primary c
a950: 68 69 6c 64 2e 0a 09 20 20 20 20 41 4e 44 20 20  hild...    AND  
a960: 20 20 52 41 2e 63 68 69 6c 64 20 49 4e 20 24 74    RA.child IN $t
a970: 68 65 73 65 74 20 20 20 20 20 2d 2d 20 4c 6f 6f  heset     -- Loo
a980: 70 0a 09 7d 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20  p..}]].    }..  
a990: 20 20 23 20 76 61 72 28 64 76 29 20 3d 20 64 69    # var(dv) = di
a9a0: 63 74 20 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74  ct (item -> list
a9b0: 20 28 69 74 65 6d 29 29 2c 20 69 74 65 6d 20 20   (item)), item  
a9c0: 3d 20 6c 69 73 74 20 28 74 79 70 65 20 69 64 29  = list (type id)
a9d0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
a9e0: 73 75 63 63 65 73 73 6f 72 73 20 7b 64 76 20 72  successors {dv r
a9f0: 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09 75 70 76  evisions} {..upv
aa00: 61 72 20 31 20 24 64 76 20 64 65 70 65 6e 64 65  ar 1 $dv depende
aa10: 6e 63 69 65 73 0a 09 73 65 74 20 74 68 65 73 65  ncies..set these
aa20: 74 20 28 27 5b 6a 6f 69 6e 20 24 72 65 76 69 73  t ('[join $revis
aa30: 69 6f 6e 73 20 7b 27 2c 27 7d 5d 27 29 0a 0a 09  ions {','}]')...
aa40: 23 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  # The following 
aa50: 63 61 73 65 73 20 73 70 65 63 69 66 79 20 77 68  cases specify wh
aa60: 65 6e 20 61 20 72 65 76 69 73 69 6f 6e 20 53 20  en a revision S 
aa70: 69 73 20 61 20 73 75 63 63 65 73 73 6f 72 0a 09  is a successor..
aa80: 23 20 6f 66 20 61 20 72 65 76 69 73 69 6f 6e 20  # of a revision 
aa90: 52 2e 20 45 61 63 68 20 6f 66 20 74 68 65 20 63  R. Each of the c
aaa0: 61 73 65 73 20 74 72 61 6e 73 6c 61 74 65 73 20  ases translates 
aab0: 69 6e 74 6f 20 6f 6e 65 20 6f 66 0a 09 23 20 74  into one of..# t
aac0: 68 65 20 62 72 61 6e 63 68 65 73 20 6f 66 20 74  he branches of t
aad0: 68 65 20 53 51 4c 20 55 4e 49 4f 4e 20 63 6f 6d  he SQL UNION com
aae0: 69 6e 67 20 62 65 6c 6f 77 2e 0a 09 23 0a 09 23  ing below...#..#
aaf0: 20 28 31 29 20 53 20 63 61 6e 20 62 65 20 61 20   (1) S can be a 
ab00: 70 72 69 6d 61 72 79 20 63 68 69 6c 64 20 6f 66  primary child of
ab10: 20 52 2c 20 69 2e 65 2e 20 69 6e 20 74 68 65 20   R, i.e. in the 
ab20: 73 61 6d 65 20 4c 4f 44 2e 20 52 0a 09 23 20 20  same LOD. R..#  
ab30: 20 20 20 72 65 66 65 72 65 6e 63 65 73 20 53 20     references S 
ab40: 64 69 72 65 63 74 6c 79 2e 20 52 2e 63 68 69 6c  directly. R.chil
ab50: 64 20 3d 20 53 28 2e 72 69 64 29 2c 20 69 66 20  d = S(.rid), if 
ab60: 69 74 20 65 78 69 73 74 73 2e 0a 09 23 0a 09 23  it exists...#..#
ab70: 20 28 32 29 20 53 20 63 61 6e 20 62 65 20 61 20   (2) S can be a 
ab80: 73 65 63 6f 6e 64 61 72 79 2c 20 69 2e 65 2e 20  secondary, i.e. 
ab90: 62 72 61 6e 63 68 2c 20 63 68 69 6c 64 20 6f 66  branch, child of
aba0: 20 52 2e 20 48 65 72 65 20 74 68 65 0a 09 23 20   R. Here the..# 
abb0: 20 20 20 20 6c 69 6e 6b 20 69 73 20 6d 61 64 65      link is made
abc0: 20 74 68 72 6f 75 67 68 20 74 68 65 20 68 65 6c   through the hel
abd0: 70 65 72 20 74 61 62 6c 65 0a 09 23 20 20 20 20  per table..#    
abe0: 20 52 45 56 49 53 49 4f 4e 42 52 41 4e 43 48 43   REVISIONBRANCHC
abf0: 48 49 4c 44 52 45 4e 2e 20 52 2e 72 69 64 20 2d  HILDREN. R.rid -
ac00: 3e 20 52 42 43 2e 72 69 64 2c 20 52 42 43 2e 62  > RBC.rid, RBC.b
ac10: 72 69 64 20 3d 0a 09 23 20 20 20 20 20 53 28 2e  rid =..#     S(.
ac20: 72 69 64 29 0a 09 23 0a 09 23 20 28 33 29 20 4f  rid)..#..# (3) O
ac30: 72 69 67 69 6e 61 6c 6c 79 20 74 68 69 73 20 75  riginally this u
ac40: 73 65 20 63 61 73 65 20 64 65 66 69 6e 65 64 20  se case defined 
ac50: 74 68 65 20 72 6f 6f 74 20 6f 66 20 61 20 64 65  the root of a de
ac60: 74 61 63 68 65 64 0a 09 23 20 20 20 20 20 4e 54  tached..#     NT
ac70: 44 42 20 61 73 20 74 68 65 20 73 75 63 63 65 73  DB as the succes
ac80: 73 6f 72 20 6f 66 20 74 68 65 20 74 72 75 6e 6b  sor of the trunk
ac90: 20 72 6f 6f 74 2e 20 54 68 69 73 20 6c 65 61 64   root. This lead
aca0: 73 20 74 6f 20 61 0a 09 23 20 20 20 20 20 62 61  s to a..#     ba
acb0: 64 20 74 61 6e 67 6c 65 20 6c 61 74 65 72 20 6f  d tangle later o
acc0: 6e 2e 20 57 69 74 68 20 61 20 64 65 74 61 63 68  n. With a detach
acd0: 65 64 20 4e 54 44 42 20 74 68 65 20 6f 72 69 67  ed NTDB the orig
ace0: 69 6e 61 6c 0a 09 23 20 20 20 20 20 74 72 75 6e  inal..#     trun
acf0: 6b 20 72 6f 6f 74 20 72 65 76 69 73 69 6f 6e 20  k root revision 
ad00: 77 61 73 20 72 65 6d 6f 76 65 64 20 61 73 20 69  was removed as i
ad10: 72 72 65 6c 65 76 61 6e 74 2c 20 61 6c 6c 6f 77  rrelevant, allow
ad20: 69 6e 67 0a 09 23 20 20 20 20 20 74 68 65 20 6e  ing..#     the n
ad30: 6f 6d 69 6e 61 6c 20 72 6f 6f 74 20 74 6f 20 62  ominal root to b
ad40: 65 20 6c 61 74 65 72 20 69 6e 20 74 69 6d 65 20  e later in time 
ad50: 74 68 61 6e 20 74 68 65 20 4e 54 44 42 0a 09 23  than the NTDB..#
ad60: 20 20 20 20 20 72 6f 6f 74 2e 20 4e 6f 77 20 73       root. Now s
ad70: 65 74 74 69 6e 67 20 74 68 69 73 20 64 65 70 65  etting this depe
ad80: 6e 64 65 6e 63 79 20 77 69 6c 6c 20 62 65 20 62  ndency will be b
ad90: 61 63 6b 77 61 72 64 20 69 6e 0a 09 23 20 20 20  ackward in..#   
ada0: 20 20 74 69 6d 65 2e 20 52 45 4d 4f 56 45 44 2e    time. REMOVED.
adb0: 0a 09 23 0a 09 23 20 28 34 29 20 49 66 20 52 20  ..#..# (4) If R 
adc0: 69 73 20 74 68 65 20 6c 61 73 74 20 6f 66 20 74  is the last of t
add0: 68 65 20 4e 54 44 42 20 72 65 76 69 73 69 6f 6e  he NTDB revision
ade0: 73 20 77 68 69 63 68 20 62 65 6c 6f 6e 67 20 74  s which belong t
adf0: 6f 0a 09 23 20 20 20 20 20 74 68 65 20 74 72 75  o..#     the tru
ae00: 6e 6b 2c 20 74 68 65 6e 20 74 68 65 20 70 72 69  nk, then the pri
ae10: 6d 61 72 79 20 63 68 69 6c 64 20 6f 66 20 74 68  mary child of th
ae20: 65 20 74 72 75 6e 6b 20 72 6f 6f 74 20 28 74 68  e trunk root (th
ae30: 65 0a 09 23 20 20 20 20 20 27 31 2e 32 27 20 72  e..#     '1.2' r
ae40: 65 76 69 73 69 6f 6e 29 20 69 73 20 61 20 73 75  evision) is a su
ae50: 63 63 65 73 73 6f 72 2c 20 69 66 20 69 74 20 65  ccessor, if it e
ae60: 78 69 73 74 73 2e 0a 0a 09 23 20 4e 6f 74 65 20  xists....# Note 
ae70: 74 68 61 74 20 74 68 65 20 62 72 61 6e 63 68 65  that the branche
ae80: 73 20 73 70 61 77 6e 65 64 20 66 72 6f 6d 20 74  s spawned from t
ae90: 68 65 20 72 65 76 69 73 69 6f 6e 73 2c 20 61 6e  he revisions, an
aea0: 64 20 74 68 65 0a 09 23 20 74 61 67 73 20 61 73  d the..# tags as
aeb0: 73 6f 63 69 61 74 65 64 20 77 69 74 68 20 74 68  sociated with th
aec0: 65 6d 20 61 72 65 20 73 75 63 63 65 73 73 6f 72  em are successor
aed0: 73 20 61 73 20 77 65 6c 6c 2e 0a 0a 09 73 74 61  s as well....sta
aee0: 74 65 20 66 6f 72 65 61 63 68 72 6f 77 20 5b 73  te foreachrow [s
aef0: 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73  ubst -nocommands
af00: 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20   -nobackslashes 
af10: 7b 0a 20 20 20 20 2d 2d 20 28 31 29 20 50 72 69  {.    -- (1) Pri
af20: 6d 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20  mary child..    
af30: 53 45 4c 45 43 54 20 52 2e 72 69 64 20 41 53 20  SELECT R.rid AS 
af40: 78 72 69 64 2c 20 52 2e 63 68 69 6c 64 20 41 53  xrid, R.child AS
af50: 20 78 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f   xchild..    FRO
af60: 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 09  M   revision R..
af70: 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64      WHERE  R.rid
af80: 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20     IN $theset   
af90: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f    -- Restrict to
afa0: 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e   revisions of in
afb0: 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20  terest..    AND 
afc0: 20 20 20 52 2e 63 68 69 6c 64 20 49 53 20 4e 4f     R.child IS NO
afd0: 54 20 4e 55 4c 4c 20 20 20 20 2d 2d 20 48 61 73  T NULL    -- Has
afe0: 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 0a 20   primary child. 
aff0: 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20     UNION.    -- 
b000: 28 32 29 20 53 65 63 6f 6e 64 61 72 79 20 28 62  (2) Secondary (b
b010: 72 61 6e 63 68 29 20 63 68 69 6c 64 72 65 6e 0a  ranch) children.
b020: 09 20 20 20 20 53 45 4c 45 43 54 20 52 2e 72 69  .    SELECT R.ri
b030: 64 20 41 53 20 78 72 69 64 2c 20 42 2e 62 72 69  d AS xrid, B.bri
b040: 64 20 41 53 20 78 63 68 69 6c 64 0a 09 20 20 20  d AS xchild..   
b050: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
b060: 20 52 2c 20 72 65 76 69 73 69 6f 6e 62 72 61 6e   R, revisionbran
b070: 63 68 63 68 69 6c 64 72 65 6e 20 42 0a 09 20 20  chchildren B..  
b080: 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20 20    WHERE  R.rid  
b090: 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20   IN $theset     
b0a0: 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 72  -- Restrict to r
b0b0: 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65  evisions of inte
b0c0: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
b0d0: 20 52 2e 72 69 64 20 3d 20 42 2e 72 69 64 20 20   R.rid = B.rid  
b0e0: 20 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63          -- Selec
b0f0: 74 20 73 75 62 73 65 74 20 6f 66 20 62 72 61 6e  t subset of bran
b100: 63 68 20 63 68 69 6c 64 72 65 6e 0a 20 20 20 20  ch children.    
b110: 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d 20 28 34 29  UNION.    -- (4)
b120: 20 43 68 69 6c 64 20 6f 66 20 74 72 75 6e 6b 20   Child of trunk 
b130: 72 6f 6f 74 20 73 75 63 63 65 73 73 6f 72 20 6f  root successor o
b140: 66 20 6c 61 73 74 20 4e 54 44 42 20 6f 6e 20 74  f last NTDB on t
b150: 72 75 6e 6b 2e 0a 09 20 20 20 20 53 45 4c 45 43  runk...    SELEC
b160: 54 20 52 2e 72 69 64 20 41 53 20 78 72 69 64 2c  T R.rid AS xrid,
b170: 20 52 41 2e 63 68 69 6c 64 20 41 53 20 78 63 68   RA.child AS xch
b180: 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d 20 72 65  ild..    FROM re
b190: 76 69 73 69 6f 6e 20 52 2c 20 72 65 76 69 73 69  vision R, revisi
b1a0: 6f 6e 20 52 41 0a 09 20 20 20 20 57 48 45 52 45  on RA..    WHERE
b1b0: 20 52 2e 72 69 64 20 20 20 49 4e 20 24 74 68 65   R.rid   IN $the
b1c0: 73 65 74 20 20 20 20 20 20 2d 2d 20 52 65 73 74  set      -- Rest
b1d0: 72 69 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e  rict to revision
b1e0: 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20  s of interest.. 
b1f0: 20 20 20 41 4e 44 20 20 20 52 2e 69 73 64 65 66     AND   R.isdef
b200: 61 75 6c 74 20 20 20 20 20 20 20 20 20 20 20 20  ault            
b210: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
b220: 4e 54 44 42 0a 09 20 20 20 20 41 4e 44 20 20 20  NTDB..    AND   
b230: 52 2e 64 62 63 68 69 6c 64 20 49 53 20 4e 4f 54  R.dbchild IS NOT
b240: 20 4e 55 4c 4c 20 20 20 2d 2d 20 61 6e 64 20 6c   NULL   -- and l
b250: 61 73 74 20 4e 54 44 42 20 62 65 6c 6f 6e 67 69  ast NTDB belongi
b260: 6e 67 20 74 6f 20 74 72 75 6e 6b 0a 09 20 20 20  ng to trunk..   
b270: 20 41 4e 44 20 20 20 52 41 2e 72 69 64 20 3d 20   AND   RA.rid = 
b280: 52 2e 64 62 63 68 69 6c 64 20 20 20 20 20 20 2d  R.dbchild      -
b290: 2d 20 47 6f 20 64 69 72 65 63 74 6c 79 20 74 6f  - Go directly to
b2a0: 20 74 72 75 6e 6b 20 72 6f 6f 74 0a 09 20 20 20   trunk root..   
b2b0: 20 41 4e 44 20 20 20 52 41 2e 63 68 69 6c 64 20   AND   RA.child 
b2c0: 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 2d  IS NOT NULL    -
b2d0: 2d 20 48 61 73 20 70 72 69 6d 61 72 79 20 63 68  - Has primary ch
b2e0: 69 6c 64 2e 0a 09 7d 5d 20 7b 0a 09 20 20 20 20  ild...}] {..    
b2f0: 23 20 43 6f 6e 73 69 64 65 72 20 6d 6f 76 69 6e  # Consider movin
b300: 67 20 74 68 69 73 20 74 6f 20 74 68 65 20 69 6e  g this to the in
b310: 74 65 67 72 69 74 79 20 6d 6f 64 75 6c 65 2e 0a  tegrity module..
b320: 09 20 20 20 20 69 6e 74 65 67 72 69 74 79 20 61  .    integrity a
b330: 73 73 65 72 74 20 7b 24 78 72 69 64 20 21 3d 20  ssert {$xrid != 
b340: 24 78 63 68 69 6c 64 7d 20 7b 52 65 76 69 73 69  $xchild} {Revisi
b350: 6f 6e 20 24 78 72 69 64 20 64 65 70 65 6e 64 73  on $xrid depends
b360: 20 6f 6e 20 69 74 73 65 6c 66 2e 7d 0a 09 20 20   on itself.}..  
b370: 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64    lappend depend
b380: 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 65 76  encies([list rev
b390: 20 24 78 72 69 64 5d 29 20 5b 6c 69 73 74 20 72   $xrid]) [list r
b3a0: 65 76 20 24 78 63 68 69 6c 64 5d 0a 09 7d 0a 09  ev $xchild]..}..
b3b0: 73 74 61 74 65 20 66 6f 72 65 61 63 68 72 6f 77  state foreachrow
b3c0: 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61   [subst -nocomma
b3d0: 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68  nds -nobackslash
b3e0: 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54  es {..    SELECT
b3f0: 20 52 2e 72 69 64 20 41 53 20 78 72 69 64 2c 20   R.rid AS xrid, 
b400: 54 2e 74 69 64 20 41 53 20 78 63 68 69 6c 64 0a  T.tid AS xchild.
b410: 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76 69  .    FROM   revi
b420: 73 69 6f 6e 20 52 2c 20 74 61 67 20 54 0a 09 20  sion R, tag T.. 
b430: 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64 20     WHERE  R.rid 
b440: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 20  IN $theset      
b450: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
b460: 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74  revisions of int
b470: 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20  erest..    AND  
b480: 20 20 54 2e 72 65 76 20 3d 20 52 2e 72 69 64 20    T.rev = R.rid 
b490: 20 20 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65           -- Sele
b4a0: 63 74 20 74 61 67 73 20 61 74 74 61 63 68 65 64  ct tags attached
b4b0: 20 74 6f 20 74 68 65 6d 0a 09 7d 5d 20 7b 0a 09   to them..}] {..
b4c0: 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65      lappend depe
b4d0: 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 72  ndencies([list r
b4e0: 65 76 20 24 78 72 69 64 5d 29 20 5b 6c 69 73 74  ev $xrid]) [list
b4f0: 20 73 79 6d 3a 3a 74 61 67 20 24 78 63 68 69 6c   sym::tag $xchil
b500: 64 5d 0a 09 7d 0a 09 73 74 61 74 65 20 66 6f 72  d]..}..state for
b510: 65 61 63 68 72 6f 77 20 5b 73 75 62 73 74 20 2d  eachrow [subst -
b520: 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61  nocommands -noba
b530: 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20 20  ckslashes {..   
b540: 20 53 45 4c 45 43 54 20 52 2e 72 69 64 20 41 53   SELECT R.rid AS
b550: 20 78 72 69 64 2c 20 42 2e 62 69 64 20 41 53 20   xrid, B.bid AS 
b560: 78 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d  xchild..    FROM
b570: 20 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 62     revision R, b
b580: 72 61 6e 63 68 20 42 0a 09 20 20 20 20 57 48 45  ranch B..    WHE
b590: 52 45 20 20 52 2e 72 69 64 20 49 4e 20 24 74 68  RE  R.rid IN $th
b5a0: 65 73 65 74 20 20 20 20 20 20 20 2d 2d 20 52 65  eset       -- Re
b5b0: 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73 69  strict to revisi
b5c0: 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  ons of interest.
b5d0: 09 20 20 20 20 41 4e 44 20 20 20 20 42 2e 72 6f  .    AND    B.ro
b5e0: 6f 74 20 3d 20 52 2e 72 69 64 20 20 20 20 20 20  ot = R.rid      
b5f0: 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 62 72 61     -- Select bra
b600: 6e 63 68 65 73 20 61 74 74 61 63 68 65 64 20 74  nches attached t
b610: 6f 20 74 68 65 6d 0a 09 7d 5d 20 7b 0a 09 20 20  o them..}] {..  
b620: 20 20 6c 61 70 70 65 6e 64 20 64 65 70 65 6e 64    lappend depend
b630: 65 6e 63 69 65 73 28 5b 6c 69 73 74 20 72 65 76  encies([list rev
b640: 20 24 78 72 69 64 5d 29 20 5b 6c 69 73 74 20 73   $xrid]) [list s
b650: 79 6d 3a 3a 62 72 61 6e 63 68 20 24 78 63 68 69  ym::branch $xchi
b660: 6c 64 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20  ld]..}..return. 
b670: 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75     }..    # resu
b680: 6c 74 20 3d 20 6c 69 73 74 20 28 63 68 61 6e 67  lt = list (chang
b690: 65 73 65 74 2d 69 64 29 0a 20 20 20 20 74 79 70  eset-id).    typ
b6a0: 65 6d 65 74 68 6f 64 20 63 73 5f 73 75 63 63 65  emethod cs_succe
b6b0: 73 73 6f 72 73 20 7b 72 65 76 69 73 69 6f 6e 73  ssors {revisions
b6c0: 7d 20 7b 0a 20 20 20 20 20 20 20 20 23 20 54 68  } {.        # Th
b6d0: 69 73 20 69 73 20 61 20 76 61 72 69 61 6e 74 20  is is a variant 
b6e0: 6f 66 20 27 73 75 63 63 65 73 73 6f 72 73 27 20  of 'successors' 
b6f0: 77 68 69 63 68 20 6d 61 70 73 20 74 68 65 20 6c  which maps the l
b700: 6f 77 2d 6c 65 76 65 6c 0a 20 20 20 20 20 20 20  ow-level.       
b710: 20 23 20 64 61 74 61 20 64 69 72 65 63 74 6c 79   # data directly
b720: 20 74 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74   to the associat
b730: 65 64 20 63 68 61 6e 67 65 73 65 74 73 2e 20 49  ed changesets. I
b740: 2e 65 2e 20 69 6e 73 74 65 61 64 0a 20 20 20 20  .e. instead.    
b750: 20 20 20 20 23 20 6d 69 6c 6c 69 6f 6e 73 20 6f      # millions o
b760: 66 20 64 65 70 65 6e 64 65 6e 63 79 20 70 61 69  f dependency pai
b770: 72 73 20 28 69 6e 20 65 78 74 72 65 6d 65 20 63  rs (in extreme c
b780: 61 73 65 73 20 28 45 78 61 6d 70 6c 65 3a 20 54  ases (Example: T
b790: 63 6c 0a 20 20 20 20 20 20 20 20 23 20 43 56 53  cl.        # CVS
b7a0: 29 29 20 77 65 20 72 65 74 75 72 6e 20 61 20 76  )) we return a v
b7b0: 65 72 79 20 73 68 6f 72 74 20 61 6e 64 20 6d 75  ery short and mu
b7c0: 63 68 20 6d 6f 72 65 20 6d 61 6e 61 67 65 61 62  ch more manageab
b7d0: 6c 65 20 6c 69 73 74 0a 20 20 20 20 20 20 20 20  le list.        
b7e0: 23 20 6f 66 20 63 68 61 6e 67 65 73 65 74 73 2e  # of changesets.
b7f0: 0a 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27  ...set theset ('
b800: 5b 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73  [join $revisions
b810: 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72   {','}]')..retur
b820: 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75  n [state run [su
b830: 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20  bst -nocommands 
b840: 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b  -nobackslashes {
b850: 0a 20 20 20 20 2d 2d 20 28 31 29 20 50 72 69 6d  .    -- (1) Prim
b860: 61 72 79 20 63 68 69 6c 64 0a 09 20 20 20 20 53  ary child..    S
b870: 45 4c 45 43 54 20 43 2e 63 69 64 0a 09 20 20 20  ELECT C.cid..   
b880: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
b890: 20 52 2c 20 63 73 69 74 65 6d 20 43 49 2c 20 63   R, csitem CI, c
b8a0: 68 61 6e 67 65 73 65 74 20 43 0a 09 20 20 20 20  hangeset C..    
b8b0: 57 48 45 52 45 20 20 52 2e 72 69 64 20 20 20 49  WHERE  R.rid   I
b8c0: 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d 2d  N $theset     --
b8d0: 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76   Restrict to rev
b8e0: 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65  isions of intere
b8f0: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52  st..    AND    R
b900: 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55  .child IS NOT NU
b910: 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69  LL    -- Has pri
b920: 6d 61 72 79 20 63 68 69 6c 64 0a 20 20 20 20 20  mary child.     
b930: 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 49         AND    CI
b940: 2e 69 69 64 20 3d 20 52 2e 63 68 69 6c 64 20 20  .iid = R.child  
b950: 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 61       -- Select a
b960: 6c 6c 20 63 68 61 6e 67 65 73 65 74 73 0a 20 20  ll changesets.  
b970: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20            AND   
b980: 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69 64 20   C.cid = CI.cid 
b990: 20 20 20 20 20 20 20 20 2d 2d 20 63 6f 6e 74 61          -- conta
b9a0: 69 6e 69 6e 67 20 74 68 65 20 70 72 69 6d 61 72  ining the primar
b9b0: 79 20 63 68 69 6c 64 0a 20 20 20 20 20 20 20 20  y child.        
b9c0: 20 20 20 20 41 4e 44 20 20 20 20 43 2e 74 79 70      AND    C.typ
b9d0: 65 20 3d 20 30 20 20 20 20 20 20 20 20 20 20 20  e = 0           
b9e0: 20 20 2d 2d 20 77 68 69 63 68 20 61 72 65 20 72    -- which are r
b9f0: 65 76 69 73 69 6f 6e 20 63 68 61 6e 67 65 73 65  evision changese
ba00: 74 73 0a 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20  ts.    UNION.   
ba10: 20 2d 2d 20 28 32 29 20 53 65 63 6f 6e 64 61 72   -- (2) Secondar
ba20: 79 20 28 62 72 61 6e 63 68 29 20 63 68 69 6c 64  y (branch) child
ba30: 72 65 6e 0a 09 20 20 20 20 53 45 4c 45 43 54 20  ren..    SELECT 
ba40: 43 2e 63 69 64 0a 09 20 20 20 20 46 52 4f 4d 20  C.cid..    FROM 
ba50: 20 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 72 65    revision R, re
ba60: 76 69 73 69 6f 6e 62 72 61 6e 63 68 63 68 69 6c  visionbranchchil
ba70: 64 72 65 6e 20 42 2c 20 63 73 69 74 65 6d 20 43  dren B, csitem C
ba80: 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43 0a 09  I, changeset C..
ba90: 20 20 20 20 57 48 45 52 45 20 20 52 2e 72 69 64      WHERE  R.rid
baa0: 20 20 20 49 4e 20 24 74 68 65 73 65 74 20 20 20     IN $theset   
bab0: 20 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f    -- Restrict to
bac0: 20 72 65 76 69 73 69 6f 6e 73 20 6f 66 20 69 6e   revisions of in
bad0: 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20  terest..    AND 
bae0: 20 20 20 52 2e 72 69 64 20 3d 20 42 2e 72 69 64     R.rid = B.rid
baf0: 20 20 20 20 20 20 20 20 20 20 2d 2d 20 53 65 6c            -- Sel
bb00: 65 63 74 20 73 75 62 73 65 74 20 6f 66 20 62 72  ect subset of br
bb10: 61 6e 63 68 20 63 68 69 6c 64 72 65 6e 0a 20 20  anch children.  
bb20: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20            AND   
bb30: 20 43 49 2e 69 69 64 20 3d 20 42 2e 62 72 69 64   CI.iid = B.brid
bb40: 20 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63          -- Selec
bb50: 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 65 74 73  t all changesets
bb60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44  .            AND
bb70: 20 20 20 20 43 2e 63 69 64 20 3d 20 43 49 2e 63      C.cid = CI.c
bb80: 69 64 09 20 20 2d 2d 20 63 6f 6e 74 61 69 6e 69  id.  -- containi
bb90: 6e 67 20 74 68 65 20 62 72 61 6e 63 68 0a 20 20  ng the branch.  
bba0: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20            AND   
bbb0: 20 43 2e 74 79 70 65 20 3d 20 30 09 09 20 20 2d   C.type = 0..  -
bbc0: 2d 20 77 68 69 63 68 20 61 72 65 20 72 65 76 69  - which are revi
bbd0: 73 69 6f 6e 20 63 68 61 6e 67 65 73 65 74 73 0a  sion changesets.
bbe0: 20 20 20 20 55 4e 49 4f 4e 0a 20 20 20 20 2d 2d      UNION.    --
bbf0: 20 28 34 29 20 43 68 69 6c 64 20 6f 66 20 74 72   (4) Child of tr
bc00: 75 6e 6b 20 72 6f 6f 74 20 73 75 63 63 65 73 73  unk root success
bc10: 6f 72 20 6f 66 20 6c 61 73 74 20 4e 54 44 42 20  or of last NTDB 
bc20: 6f 6e 20 74 72 75 6e 6b 2e 0a 09 20 20 20 20 53  on trunk...    S
bc30: 45 4c 45 43 54 20 43 2e 63 69 64 0a 09 20 20 20  ELECT C.cid..   
bc40: 20 46 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e   FROM   revision
bc50: 20 52 2c 20 72 65 76 69 73 69 6f 6e 20 52 41 2c   R, revision RA,
bc60: 20 63 73 69 74 65 6d 20 43 49 2c 20 63 68 61 6e   csitem CI, chan
bc70: 67 65 73 65 74 20 43 0a 09 20 20 20 20 57 48 45  geset C..    WHE
bc80: 52 45 20 20 52 2e 72 69 64 20 20 20 49 4e 20 24  RE  R.rid   IN $
bc90: 74 68 65 73 65 74 20 20 20 20 20 20 2d 2d 20 52  theset      -- R
bca0: 65 73 74 72 69 63 74 20 74 6f 20 72 65 76 69 73  estrict to revis
bcb0: 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65 73 74  ions of interest
bcc0: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 2e 69  ..    AND    R.i
bcd0: 73 64 65 66 61 75 6c 74 20 20 20 20 20 20 20 20  sdefault        
bce0: 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74       -- Restrict
bcf0: 20 74 6f 20 4e 54 44 42 0a 09 20 20 20 20 41 4e   to NTDB..    AN
bd00: 44 20 20 20 20 52 2e 64 62 63 68 69 6c 64 20 49  D    R.dbchild I
bd10: 53 20 4e 4f 54 20 4e 55 4c 4c 20 20 20 2d 2d 20  S NOT NULL   -- 
bd20: 61 6e 64 20 6c 61 73 74 20 4e 54 44 42 20 62 65  and last NTDB be
bd30: 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 72 75 6e 6b  longing to trunk
bd40: 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 41 2e  ..    AND    RA.
bd50: 72 69 64 20 3d 20 52 2e 64 62 63 68 69 6c 64 20  rid = R.dbchild 
bd60: 20 20 20 20 20 2d 2d 20 47 6f 20 64 69 72 65 63       -- Go direc
bd70: 74 6c 79 20 74 6f 20 74 72 75 6e 6b 20 72 6f 6f  tly to trunk roo
bd80: 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 52 41  t..    AND    RA
bd90: 2e 63 68 69 6c 64 20 49 53 20 4e 4f 54 20 4e 55  .child IS NOT NU
bda0: 4c 4c 20 20 20 20 2d 2d 20 48 61 73 20 70 72 69  LL    -- Has pri
bdb0: 6d 61 72 79 20 63 68 69 6c 64 2e 0a 20 20 20 20  mary child..    
bdc0: 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43          AND    C
bdd0: 49 2e 69 69 64 20 3d 20 52 41 2e 63 68 69 6c 64  I.iid = RA.child
bde0: 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74         -- Select
bdf0: 20 61 6c 6c 20 63 68 61 6e 67 65 73 65 74 73 0a   all changesets.
be00: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
be10: 20 20 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69     C.cid = CI.ci
be20: 64 09 20 20 20 2d 2d 20 63 6f 6e 74 61 69 6e 69  d.   -- containi
be30: 6e 67 20 74 68 65 20 70 72 69 6d 61 72 79 20 63  ng the primary c
be40: 68 69 6c 64 0a 20 20 20 20 20 20 20 20 20 20 20  hild.           
be50: 20 41 4e 44 20 20 20 20 43 2e 74 79 70 65 20 3d   AND    C.type =
be60: 20 30 09 09 20 20 20 2d 2d 20 77 68 69 63 68 20   0..   -- which 
be70: 61 72 65 20 72 65 76 69 73 69 6f 6e 20 63 68 61  are revision cha
be80: 6e 67 65 73 65 74 73 0a 20 20 20 20 55 4e 49 4f  ngesets.    UNIO
be90: 4e 0a 09 20 20 20 20 53 45 4c 45 43 54 20 43 2e  N..    SELECT C.
bea0: 63 69 64 0a 09 20 20 20 20 46 52 4f 4d 20 20 20  cid..    FROM   
beb0: 72 65 76 69 73 69 6f 6e 20 52 2c 20 74 61 67 20  revision R, tag 
bec0: 54 2c 20 63 73 69 74 65 6d 20 43 49 2c 20 63 68  T, csitem CI, ch
bed0: 61 6e 67 65 73 65 74 20 43 0a 09 20 20 20 20 57  angeset C..    W
bee0: 48 45 52 45 20 20 52 2e 72 69 64 20 69 6e 20 24  HERE  R.rid in $
bef0: 74 68 65 73 65 74 20 20 20 20 20 20 20 20 2d 2d  theset        --
bf00: 20 52 65 73 74 72 69 63 74 20 74 6f 20 72 65 76   Restrict to rev
bf10: 69 73 69 6f 6e 73 20 6f 66 20 69 6e 74 65 72 65  isions of intere
bf20: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 54  st..    AND    T
bf30: 2e 72 65 76 20 3d 20 52 2e 72 69 64 09 20 20 20  .rev = R.rid.   
bf40: 2d 2d 20 53 65 6c 65 63 74 20 74 61 67 73 20 61  -- Select tags a
bf50: 74 74 61 63 68 65 64 20 74 6f 20 74 68 65 6d 0a  ttached to them.
bf60: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
bf70: 20 20 20 43 49 2e 69 69 64 20 3d 20 54 2e 74 69     CI.iid = T.ti
bf80: 64 20 20 20 20 20 20 20 20 20 20 2d 2d 20 53 65  d          -- Se
bf90: 6c 65 63 74 20 61 6c 6c 20 63 68 61 6e 67 65 73  lect all changes
bfa0: 65 74 73 0a 20 20 20 20 20 20 20 20 20 20 20 20  ets.            
bfb0: 41 4e 44 20 20 20 20 43 2e 63 69 64 20 3d 20 43  AND    C.cid = C
bfc0: 49 2e 63 69 64 09 20 20 20 2d 2d 20 63 6f 6e 74  I.cid.   -- cont
bfd0: 61 69 6e 69 6e 67 20 74 68 65 20 74 61 67 73 0a  aining the tags.
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
bff0: 20 20 20 43 2e 74 79 70 65 20 3d 20 31 09 09 20     C.type = 1.. 
c000: 20 20 2d 2d 20 77 68 69 63 68 20 61 72 65 20 74    -- which are t
c010: 61 67 20 63 68 61 6e 67 65 73 65 74 73 0a 20 20  ag changesets.  
c020: 20 20 55 4e 49 4f 4e 0a 09 20 20 20 20 53 45 4c    UNION..    SEL
c030: 45 43 54 20 43 2e 63 69 64 0a 09 20 20 20 20 46  ECT C.cid..    F
c040: 52 4f 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52  ROM   revision R
c050: 2c 20 62 72 61 6e 63 68 20 42 2c 20 63 73 69 74  , branch B, csit
c060: 65 6d 20 43 49 2c 20 63 68 61 6e 67 65 73 65 74  em CI, changeset
c070: 20 43 0a 09 20 20 20 20 57 48 45 52 45 20 20 52   C..    WHERE  R
c080: 2e 72 69 64 20 69 6e 20 24 74 68 65 73 65 74 20  .rid in $theset 
c090: 20 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69         -- Restri
c0a0: 63 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20  ct to revisions 
c0b0: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20  of interest..   
c0c0: 20 41 4e 44 20 20 20 20 42 2e 72 6f 6f 74 20 3d   AND    B.root =
c0d0: 20 52 2e 72 69 64 09 20 20 20 2d 2d 20 53 65 6c   R.rid.   -- Sel
c0e0: 65 63 74 20 62 72 61 6e 63 68 65 73 20 61 74 74  ect branches att
c0f0: 61 63 68 65 64 20 74 6f 20 74 68 65 6d 0a 20 20  ached to them.  
c100: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20            AND   
c110: 20 43 49 2e 69 69 64 20 3d 20 42 2e 62 69 64 20   CI.iid = B.bid 
c120: 20 20 20 20 20 20 20 20 20 2d 2d 20 53 65 6c 65           -- Sele
c130: 63 74 20 61 6c 6c 20 63 68 61 6e 67 65 73 65 74  ct all changeset
c140: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e  s.            AN
c150: 44 20 20 20 20 43 2e 63 69 64 20 3d 20 43 49 2e  D    C.cid = CI.
c160: 63 69 64 09 20 20 20 2d 2d 20 63 6f 6e 74 61 69  cid.   -- contai
c170: 6e 69 6e 67 20 74 68 65 20 62 72 61 6e 63 68 65  ning the branche
c180: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 41 4e  s.            AN
c190: 44 20 20 20 20 43 2e 74 79 70 65 20 3d 20 32 09  D    C.type = 2.
c1a0: 09 20 20 20 2d 2d 20 77 68 69 63 68 20 61 72 65  .   -- which are
c1b0: 20 62 72 61 6e 63 68 20 63 68 61 6e 67 65 73 65   branch changese
c1c0: 74 73 0a 09 7d 5d 5d 0a 0a 09 23 20 52 65 67 61  ts..}]]...# Rega
c1d0: 72 64 69 6e 67 20 72 65 76 20 2d 3e 20 62 72 61  rding rev -> bra
c1e0: 6e 63 68 7c 74 61 67 2c 20 77 65 20 63 6f 75 6c  nch|tag, we coul
c1f0: 64 20 63 6f 6e 73 69 64 65 72 20 6c 6f 6f 6b 69  d consider looki
c200: 6e 67 20 61 74 0a 09 23 20 74 68 65 20 73 79 6d  ng at..# the sym
c210: 62 6f 6c 20 6f 66 20 74 68 65 20 62 72 61 6e 63  bol of the branc
c220: 68 7c 74 61 67 2c 20 69 74 73 20 6c 6f 64 2d 73  h|tag, its lod-s
c230: 79 6d 62 6f 6c 2c 20 61 6e 64 20 74 68 65 0a 09  ymbol, and the..
c240: 23 20 72 65 76 69 73 69 6f 6e 73 20 6f 6e 20 74  # revisions on t
c250: 68 61 74 20 6c 6f 64 2c 20 62 75 74 20 64 6f 6e  hat lod, but don
c260: 27 74 2e 20 42 65 63 61 75 73 65 20 69 74 20 69  't. Because it i
c270: 73 20 6e 6f 74 20 65 78 61 63 74 0a 09 23 20 65  s not exact..# e
c280: 6e 6f 75 67 68 2c 20 74 68 65 20 62 72 61 6e 63  nough, the branc
c290: 68 7c 74 61 67 20 77 6f 75 6c 64 20 64 65 70 65  h|tag would depe
c2a0: 6e 64 20 6f 6e 20 72 65 76 69 73 69 6f 6e 73 20  nd on revisions 
c2b0: 63 6f 6d 69 6e 67 0a 09 23 20 61 66 74 65 72 20  coming..# after 
c2c0: 69 74 73 20 63 72 65 61 74 69 6f 6e 20 6f 6e 20  its creation on 
c2d0: 74 68 65 20 70 61 72 65 6e 74 61 6c 20 6c 6f 64  the parental lod
c2e0: 2e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72  ..    }..    # r
c2f0: 65 73 75 6c 74 20 3d 20 73 79 6d 62 6f 6c 20 6e  esult = symbol n
c300: 61 6d 65 0a 20 20 20 20 74 79 70 65 6d 65 74 68  ame.    typemeth
c310: 6f 64 20 63 73 5f 6c 6f 64 20 7b 6d 65 74 61 69  od cs_lod {metai
c320: 64 20 72 65 76 69 73 69 6f 6e 73 7d 20 7b 0a 09  d revisions} {..
c330: 23 20 44 65 74 65 72 6d 69 6e 65 73 20 74 68 65  # Determines the
c340: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 73 79 6d   name of the sym
c350: 62 6f 6c 20 77 68 69 63 68 20 69 73 20 74 68 65  bol which is the
c360: 20 6c 69 6e 65 20 6f 66 0a 09 23 20 64 65 76 65   line of..# deve
c370: 6c 6f 70 6d 65 6e 74 20 66 6f 72 20 74 68 65 20  lopment for the 
c380: 72 65 76 69 73 69 6f 6e 73 20 69 6e 20 61 20 63  revisions in a c
c390: 68 61 6e 67 65 73 65 74 2e 20 54 68 65 0a 09 23  hangeset. The..#
c3a0: 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e 20   information in 
c3b0: 74 68 65 20 6d 65 74 61 20 64 61 74 61 20 72 65  the meta data re
c3c0: 66 65 72 65 6e 63 65 64 20 62 79 20 74 68 65 20  ferenced by the 
c3d0: 73 6f 75 72 63 65 20 6d 65 74 61 69 64 0a 09 23  source metaid..#
c3e0: 20 69 73 20 6f 75 74 20 6f 66 20 64 61 74 65 20   is out of date 
c3f0: 62 79 20 74 68 65 20 74 69 6d 65 20 77 65 20 63  by the time we c
c400: 6f 6d 65 20 68 65 72 65 20 28 73 69 6e 63 65 20  ome here (since 
c410: 70 61 73 73 0a 09 23 20 46 69 6c 74 65 72 53 79  pass..# FilterSy
c420: 6d 62 6f 6c 73 29 2c 20 73 6f 20 69 74 20 63 61  mbols), so it ca
c430: 6e 6e 6f 74 20 62 65 20 75 73 65 64 2e 20 53 65  nnot be used. Se
c440: 65 20 74 68 65 20 6d 65 74 68 6f 64 20 27 72 75  e the method 'ru
c450: 6e 27 0a 09 23 20 69 6e 20 66 69 6c 65 20 22 63  n'..# in file "c
c460: 32 66 5f 70 66 69 6c 74 65 72 73 79 6d 2e 74 63  2f_pfiltersym.tc
c470: 6c 22 20 66 6f 72 20 6d 6f 72 65 20 63 6f 6d 6d  l" for more comm
c480: 65 6e 74 61 72 79 20 6f 6e 20 74 68 69 73 2e 0a  entary on this..
c490: 0a 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b  ..set theset ('[
c4a0: 6a 6f 69 6e 20 24 72 65 76 69 73 69 6f 6e 73 20  join $revisions 
c4b0: 7b 27 2c 27 7d 5d 27 29 0a 09 72 65 74 75 72 6e  {','}]')..return
c4c0: 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75 62   [state run [sub
c4d0: 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d  st -nocommands -
c4e0: 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a  nobackslashes {.
c4f0: 09 20 20 20 20 53 45 4c 45 43 54 0a 09 20 20 20  .    SELECT..   
c500: 20 44 49 53 54 49 4e 43 54 20 4c 2e 6e 61 6d 65   DISTINCT L.name
c510: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 72 65 76  ..    FROM   rev
c520: 69 73 69 6f 6e 20 52 2c 20 73 79 6d 62 6f 6c 20  ision R, symbol 
c530: 4c 0a 09 20 20 20 20 57 48 45 52 45 20 20 52 2e  L..    WHERE  R.
c540: 72 69 64 20 69 6e 20 24 74 68 65 73 65 74 20 20  rid in $theset  
c550: 20 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63        -- Restric
c560: 74 20 74 6f 20 72 65 76 69 73 69 6f 6e 73 20 6f  t to revisions o
c570: 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20  f interest..    
c580: 41 4e 44 20 20 20 20 4c 2e 73 69 64 20 3d 20 52  AND    L.sid = R
c590: 2e 6c 6f 64 20 20 20 20 20 20 20 20 20 20 20 2d  .lod           -
c5a0: 2d 20 47 65 74 20 6c 6f 64 20 73 79 6d 62 6f 6c  - Get lod symbol
c5b0: 20 6f 66 20 72 65 76 69 73 69 6f 6e 0a 09 7d 5d   of revision..}]
c5c0: 5d 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20 23 20 23  ].    }.}..# # #
c5d0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
c5e0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
c5f0: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
c600: 23 23 23 23 23 23 23 23 0a 23 23 20 48 65 6c 70  ########.## Help
c610: 65 72 20 73 69 6e 67 6c 65 74 6f 6e 2e 20 43 6f  er singleton. Co
c620: 6d 6d 61 6e 64 73 20 66 6f 72 20 74 61 67 20 73  mmands for tag s
c630: 79 6d 62 6f 6c 20 63 68 61 6e 67 65 73 65 74 73  ymbol changesets
c640: 2e 0a 0a 73 6e 69 74 3a 3a 74 79 70 65 20 3a 3a  ...snit::type ::
c650: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f  vc::fossil::impo
c660: 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74  rt::cvs::project
c670: 3a 3a 72 65 76 3a 3a 73 79 6d 3a 3a 74 61 67 20  ::rev::sym::tag 
c680: 7b 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  {.    typemethod
c690: 20 62 79 72 65 76 69 73 69 6f 6e 20 7b 7d 20 7b   byrevision {} {
c6a0: 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20   return 0 }.    
c6b0: 74 79 70 65 6d 65 74 68 6f 64 20 62 79 73 79 6d  typemethod bysym
c6c0: 62 6f 6c 20 20 20 7b 7d 20 7b 20 72 65 74 75 72  bol   {} { retur
c6d0: 6e 20 31 20 7d 0a 20 20 20 20 74 79 70 65 6d 65  n 1 }.    typeme
c6e0: 74 68 6f 64 20 69 73 74 61 67 20 20 20 20 20 20  thod istag      
c6f0: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 31 20 7d 0a  {} { return 1 }.
c700: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69      typemethod i
c710: 73 62 72 61 6e 63 68 20 20 20 7b 7d 20 7b 20 72  sbranch   {} { r
c720: 65 74 75 72 6e 20 30 20 7d 0a 0a 20 20 20 20 74  eturn 0 }..    t
c730: 79 70 65 6d 65 74 68 6f 64 20 73 74 72 20 7b 74  ypemethod str {t
c740: 61 67 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a 6c  ag} {..struct::l
c750: 69 73 74 20 61 73 73 69 67 6e 20 5b 73 74 61 74  ist assign [stat
c760: 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 53 45 4c  e run {..    SEL
c770: 45 43 54 20 53 2e 6e 61 6d 65 2c 20 46 2e 6e 61  ECT S.name, F.na
c780: 6d 65 2c 20 50 2e 6e 61 6d 65 0a 09 20 20 20 20  me, P.name..    
c790: 46 52 4f 4d 20 20 20 74 61 67 20 54 2c 20 73 79  FROM   tag T, sy
c7a0: 6d 62 6f 6c 20 53 2c 20 66 69 6c 65 20 46 2c 20  mbol S, file F, 
c7b0: 70 72 6f 6a 65 63 74 20 50 0a 09 20 20 20 20 57  project P..    W
c7c0: 48 45 52 45 20 20 54 2e 74 69 64 20 3d 20 24 74  HERE  T.tid = $t
c7d0: 61 67 20 20 20 2d 2d 20 46 69 6e 64 20 73 70 65  ag   -- Find spe
c7e0: 63 69 66 69 65 64 20 74 61 67 0a 09 20 20 20 20  cified tag..    
c7f0: 41 4e 44 20 20 20 20 46 2e 66 69 64 20 3d 20 54  AND    F.fid = T
c800: 2e 66 69 64 20 20 2d 2d 20 47 65 74 20 66 69 6c  .fid  -- Get fil
c810: 65 20 6f 66 20 74 61 67 0a 09 20 20 20 20 41 4e  e of tag..    AN
c820: 44 20 20 20 20 50 2e 70 69 64 20 3d 20 46 2e 70  D    P.pid = F.p
c830: 69 64 20 20 2d 2d 20 47 65 74 20 70 72 6f 6a 65  id  -- Get proje
c840: 63 74 20 6f 66 20 66 69 6c 65 0a 09 20 20 20 20  ct of file..    
c850: 41 4e 44 20 20 20 20 53 2e 73 69 64 20 3d 20 54  AND    S.sid = T
c860: 2e 73 69 64 20 20 2d 2d 20 47 65 74 20 73 79 6d  .sid  -- Get sym
c870: 62 6f 6c 20 6f 66 20 74 61 67 0a 09 7d 5d 20 73  bol of tag..}] s
c880: 6e 61 6d 65 20 66 6e 61 6d 65 20 70 6e 61 6d 65  name fname pname
c890: 0a 09 72 65 74 75 72 6e 20 22 24 70 6e 61 6d 65  ..return "$pname
c8a0: 2f 54 27 24 7b 73 6e 61 6d 65 7d 27 3a 3a 24 66  /T'${sname}'::$f
c8b0: 6e 61 6d 65 22 0a 20 20 20 20 7d 0a 0a 20 20 20  name".    }..   
c8c0: 20 23 20 72 65 73 75 6c 74 20 3d 20 6c 69 73 74   # result = list
c8d0: 20 28 6d 69 6e 74 69 6d 65 2c 20 6d 61 78 74 69   (mintime, maxti
c8e0: 6d 65 29 0a 20 20 20 20 74 79 70 65 6d 65 74 68  me).    typemeth
c8f0: 6f 64 20 74 69 6d 65 72 61 6e 67 65 20 7b 74 61  od timerange {ta
c900: 67 73 7d 20 7b 0a 09 23 20 54 68 65 20 72 61 6e  gs} {..# The ran
c910: 67 65 20 69 73 20 64 65 66 69 6e 65 64 20 61 73  ge is defined as
c920: 20 74 68 65 20 72 61 6e 67 65 20 6f 66 20 74 68   the range of th
c930: 65 20 72 65 76 69 73 69 6f 6e 73 20 74 68 65 20  e revisions the 
c940: 74 61 67 73 0a 09 23 20 61 72 65 20 61 74 74 61  tags..# are atta
c950: 63 68 65 64 20 74 6f 2e 0a 0a 09 73 65 74 20 74  ched to....set t
c960: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 74  heset ('[join $t
c970: 61 67 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65  ags {','}]')..re
c980: 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20  turn [state run 
c990: 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e  [subst -nocomman
c9a0: 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65  ds -nobackslashe
c9b0: 73 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20  s {..    SELECT 
c9c0: 4d 49 4e 28 52 2e 64 61 74 65 29 2c 20 4d 41 58  MIN(R.date), MAX
c9d0: 28 52 2e 64 61 74 65 29 0a 09 20 20 20 20 46 52  (R.date)..    FR
c9e0: 4f 4d 20 20 20 74 61 67 20 54 2c 20 72 65 76 69  OM   tag T, revi
c9f0: 73 69 6f 6e 20 52 0a 09 20 20 20 20 57 48 45 52  sion R..    WHER
ca00: 45 20 20 54 2e 74 69 64 20 49 4e 20 24 74 68 65  E  T.tid IN $the
ca10: 73 65 74 20 20 2d 2d 20 52 65 73 74 72 69 63 74  set  -- Restrict
ca20: 20 74 6f 20 74 61 67 73 20 6f 66 20 69 6e 74 65   to tags of inte
ca30: 72 65 73 74 0a 20 20 20 20 20 20 20 20 20 20 20  rest.           
ca40: 20 41 4e 44 20 20 20 20 52 2e 72 69 64 20 3d 20   AND    R.rid = 
ca50: 54 2e 72 65 76 20 20 20 20 20 2d 2d 20 53 65 6c  T.rev     -- Sel
ca60: 65 63 74 20 74 61 67 20 70 61 72 65 6e 74 20 72  ect tag parent r
ca70: 65 76 69 73 69 6f 6e 73 0a 09 7d 5d 5d 0a 20 20  evisions..}]].  
ca80: 20 20 7d 0a 0a 20 20 20 20 23 20 76 61 72 28 64    }..    # var(d
ca90: 76 29 20 3d 20 64 69 63 74 20 28 69 74 65 6d 20  v) = dict (item 
caa0: 2d 3e 20 6c 69 73 74 20 28 69 74 65 6d 29 29 2c  -> list (item)),
cab0: 20 69 74 65 6d 20 20 3d 20 6c 69 73 74 20 28 74   item  = list (t
cac0: 79 70 65 20 69 64 29 0a 20 20 20 20 74 79 70 65  ype id).    type
cad0: 6d 65 74 68 6f 64 20 73 75 63 63 65 73 73 6f 72  method successor
cae0: 73 20 7b 64 76 20 74 61 67 73 7d 20 7b 0a 09 23  s {dv tags} {..#
caf0: 20 54 61 67 73 20 68 61 76 65 20 6e 6f 20 73 75   Tags have no su
cb00: 63 63 65 73 73 6f 72 73 2e 0a 09 72 65 74 75 72  ccessors...retur
cb10: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 72  n.    }..    # r
cb20: 65 73 75 6c 74 20 3d 20 34 2d 6c 69 73 74 20 28  esult = 4-list (
cb30: 69 74 65 6d 74 79 70 65 20 69 74 65 6d 69 64 20  itemtype itemid 
cb40: 6e 65 78 74 69 74 65 6d 74 79 70 65 20 6e 65 78  nextitemtype nex
cb50: 74 69 74 65 6d 69 64 20 2e 2e 2e 29 0a 20 20 20  titemid ...).   
cb60: 20 74 79 70 65 6d 65 74 68 6f 64 20 6c 6f 6f 70   typemethod loop
cb70: 73 20 7b 74 61 67 73 7d 20 7b 0a 09 23 20 54 61  s {tags} {..# Ta
cb80: 67 73 20 68 61 76 65 20 6e 6f 20 73 75 63 63 65  gs have no succe
cb90: 73 73 6f 72 73 2c 20 74 68 65 72 65 66 6f 72 65  ssors, therefore
cba0: 20 63 61 6e 6e 6f 74 20 63 61 75 73 65 20 6c 6f   cannot cause lo
cbb0: 6f 70 73 0a 09 72 65 74 75 72 6e 20 7b 7d 0a 20  ops..return {}. 
cbc0: 20 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75     }..    # resu
cbd0: 6c 74 20 3d 20 6c 69 73 74 20 28 63 68 61 6e 67  lt = list (chang
cbe0: 65 73 65 74 2d 69 64 29 0a 20 20 20 20 74 79 70  eset-id).    typ
cbf0: 65 6d 65 74 68 6f 64 20 63 73 5f 73 75 63 63 65  emethod cs_succe
cc00: 73 73 6f 72 73 20 7b 74 61 67 73 7d 20 7b 0a 09  ssors {tags} {..
cc10: 23 20 54 61 67 73 20 68 61 76 65 20 6e 6f 20 73  # Tags have no s
cc20: 75 63 63 65 73 73 6f 72 73 2e 0a 09 72 65 74 75  uccessors...retu
cc30: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  rn.    }..    # 
cc40: 72 65 73 75 6c 74 20 3d 20 73 79 6d 62 6f 6c 20  result = symbol 
cc50: 6e 61 6d 65 0a 20 20 20 20 74 79 70 65 6d 65 74  name.    typemet
cc60: 68 6f 64 20 63 73 5f 6c 6f 64 20 7b 73 69 64 20  hod cs_lod {sid 
cc70: 74 61 67 73 7d 20 7b 0a 09 23 20 44 65 74 65 72  tags} {..# Deter
cc80: 6d 69 6e 65 73 20 74 68 65 20 6e 61 6d 65 20 6f  mines the name o
cc90: 66 20 74 68 65 20 73 79 6d 62 6f 6c 20 77 68 69  f the symbol whi
cca0: 63 68 20 69 73 20 74 68 65 20 6c 69 6e 65 20 6f  ch is the line o
ccb0: 66 0a 09 23 20 64 65 76 65 6c 6f 70 6d 65 6e 74  f..# development
ccc0: 20 66 6f 72 20 74 68 65 20 74 61 67 73 20 69 6e   for the tags in
ccd0: 20 61 20 63 68 61 6e 67 65 73 65 74 2e 20 43 6f   a changeset. Co
cce0: 6d 65 73 20 64 69 72 65 63 74 6c 79 20 66 72 6f  mes directly fro
ccf0: 6d 0a 09 23 20 74 68 65 20 73 79 6d 62 6f 6c 20  m..# the symbol 
cd00: 77 68 69 63 68 20 69 73 20 74 68 65 20 63 68 61  which is the cha
cd10: 6e 67 65 73 65 74 27 73 20 73 6f 75 72 63 65 20  ngeset's source 
cd20: 61 6e 64 20 69 74 73 20 70 72 65 66 65 72 65 64  and its prefered
cd30: 0a 09 23 20 70 61 72 65 6e 74 2e 0a 0a 20 20 20  ..# parent...   
cd40: 20 20 20 20 20 72 65 74 75 72 6e 20 5b 73 74 61       return [sta
cd50: 74 65 20 72 75 6e 20 7b 0a 20 09 20 20 20 20 53  te run {. .    S
cd60: 45 4c 45 43 54 20 50 2e 6e 61 6d 65 0a 09 20 20  ELECT P.name..  
cd70: 20 20 46 52 4f 4d 20 70 72 65 66 65 72 65 64 70    FROM preferedp
cd80: 61 72 65 6e 74 20 53 50 2c 20 73 79 6d 62 6f 6c  arent SP, symbol
cd90: 20 50 0a 09 20 20 20 20 57 48 45 52 45 20 53 50   P..    WHERE SP
cda0: 2e 73 69 64 20 3d 20 24 73 69 64 0a 09 20 20 20  .sid = $sid..   
cdb0: 20 41 4e 44 20 20 20 50 2e 73 69 64 20 3d 20 53   AND   P.sid = S
cdc0: 50 2e 70 69 64 0a 09 7d 5d 0a 20 20 20 20 7d 0a  P.pid..}].    }.
cdd0: 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23 23  }..# # ## ### ##
cde0: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23  ### ######## ###
cdf0: 23 23 23 23 23 23 23 23 23 23 20 23 23 23 23 23  ########## #####
ce00: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
ce10: 0a 23 23 20 48 65 6c 70 65 72 20 73 69 6e 67 6c  .## Helper singl
ce20: 65 74 6f 6e 2e 20 43 6f 6d 6d 61 6e 64 73 20 66  eton. Commands f
ce30: 6f 72 20 62 72 61 6e 63 68 20 73 79 6d 62 6f 6c  or branch symbol
ce40: 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a 73 6e   changesets...sn
ce50: 69 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a 66  it::type ::vc::f
ce60: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63  ossil::import::c
ce70: 76 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76  vs::project::rev
ce80: 3a 3a 73 79 6d 3a 3a 62 72 61 6e 63 68 20 7b 0a  ::sym::branch {.
ce90: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 62      typemethod b
cea0: 79 72 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 20 72  yrevision {} { r
ceb0: 65 74 75 72 6e 20 30 20 7d 0a 20 20 20 20 74 79  eturn 0 }.    ty
cec0: 70 65 6d 65 74 68 6f 64 20 62 79 73 79 6d 62 6f  pemethod bysymbo
ced0: 6c 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20  l   {} { return 
cee0: 31 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68  1 }.    typemeth
cef0: 6f 64 20 69 73 74 61 67 20 20 20 20 20 20 7b 7d  od istag      {}
cf00: 20 7b 20 72 65 74 75 72 6e 20 30 20 7d 0a 20 20   { return 0 }.  
cf10: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 69 73 62    typemethod isb
cf20: 72 61 6e 63 68 20 20 20 7b 7d 20 7b 20 72 65 74  ranch   {} { ret
cf30: 75 72 6e 20 31 20 7d 0a 0a 20 20 20 20 74 79 70  urn 1 }..    typ
cf40: 65 6d 65 74 68 6f 64 20 73 74 72 20 7b 62 72 61  emethod str {bra
cf50: 6e 63 68 7d 20 7b 0a 09 73 74 72 75 63 74 3a 3a  nch} {..struct::
cf60: 6c 69 73 74 20 61 73 73 69 67 6e 20 5b 73 74 61  list assign [sta
cf70: 74 65 20 72 75 6e 20 7b 0a 09 20 20 20 20 53 45  te run {..    SE
cf80: 4c 45 43 54 20 53 2e 6e 61 6d 65 2c 20 46 2e 6e  LECT S.name, F.n
cf90: 61 6d 65 2c 20 50 2e 6e 61 6d 65 0a 09 20 20 20  ame, P.name..   
cfa0: 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42   FROM   branch B
cfb0: 2c 20 73 79 6d 62 6f 6c 20 53 2c 20 66 69 6c 65  , symbol S, file
cfc0: 20 46 2c 20 70 72 6f 6a 65 63 74 20 50 0a 09 20   F, project P.. 
cfd0: 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20     WHERE  B.bid 
cfe0: 3d 20 24 62 72 61 6e 63 68 20 20 2d 2d 20 46 69  = $branch  -- Fi
cff0: 6e 64 20 73 70 65 63 69 66 69 65 64 20 62 72 61  nd specified bra
d000: 6e 63 68 0a 09 20 20 20 20 41 4e 44 20 20 20 20  nch..    AND    
d010: 46 2e 66 69 64 20 3d 20 42 2e 66 69 64 20 20 20  F.fid = B.fid   
d020: 20 2d 2d 20 47 65 74 20 66 69 6c 65 20 6f 66 20   -- Get file of 
d030: 62 72 61 6e 63 68 0a 09 20 20 20 20 41 4e 44 20  branch..    AND 
d040: 20 20 20 50 2e 70 69 64 20 3d 20 46 2e 70 69 64     P.pid = F.pid
d050: 20 20 20 20 2d 2d 20 47 65 74 20 70 72 6f 6a 65      -- Get proje
d060: 63 74 20 6f 66 20 66 69 6c 65 0a 09 20 20 20 20  ct of file..    
d070: 41 4e 44 20 20 20 20 53 2e 73 69 64 20 3d 20 42  AND    S.sid = B
d080: 2e 73 69 64 20 20 20 20 2d 2d 20 47 65 74 20 73  .sid    -- Get s
d090: 79 6d 62 6f 6c 20 6f 66 20 62 72 61 6e 63 68 0a  ymbol of branch.
d0a0: 09 7d 5d 20 73 6e 61 6d 65 20 66 6e 61 6d 65 20  .}] sname fname 
d0b0: 70 6e 61 6d 65 0a 09 72 65 74 75 72 6e 20 22 24  pname..return "$
d0c0: 70 6e 61 6d 65 2f 42 27 24 7b 73 6e 61 6d 65 7d  pname/B'${sname}
d0d0: 27 3a 3a 24 66 6e 61 6d 65 22 0a 20 20 20 20 7d  '::$fname".    }
d0e0: 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20 3d  ..    # result =
d0f0: 20 6c 69 73 74 20 28 6d 69 6e 74 69 6d 65 2c 20   list (mintime, 
d100: 6d 61 78 74 69 6d 65 29 0a 20 20 20 20 74 79 70  maxtime).    typ
d110: 65 6d 65 74 68 6f 64 20 74 69 6d 65 72 61 6e 67  emethod timerang
d120: 65 20 7b 62 72 61 6e 63 68 65 73 7d 20 7b 0a 09  e {branches} {..
d130: 23 20 54 68 65 20 72 61 6e 67 65 20 6f 66 20 61  # The range of a
d140: 20 62 72 61 6e 63 68 20 69 73 20 64 65 66 69 6e   branch is defin
d150: 65 64 20 61 73 20 74 68 65 20 72 61 6e 67 65 20  ed as the range 
d160: 6f 66 20 74 68 65 0a 09 23 20 72 65 76 69 73 69  of the..# revisi
d170: 6f 6e 73 20 74 68 65 20 62 72 61 6e 63 68 65 73  ons the branches
d180: 20 61 72 65 20 73 70 61 77 6e 65 64 20 62 79 2e   are spawned by.
d190: 20 4e 4f 54 45 20 68 6f 77 65 76 65 72 20 74 68   NOTE however th
d1a0: 61 74 20 74 68 65 0a 09 23 20 62 72 61 6e 63 68  at the..# branch
d1b0: 65 73 20 61 73 73 6f 63 69 61 74 65 64 20 77 69  es associated wi
d1c0: 74 68 20 61 20 64 65 74 61 63 68 65 64 20 4e 54  th a detached NT
d1d0: 44 42 20 77 69 6c 6c 20 68 61 76 65 20 6e 6f 20  DB will have no 
d1e0: 72 6f 6f 74 0a 09 23 20 73 70 61 77 6e 69 6e 67  root..# spawning
d1f0: 20 74 68 65 6d 2c 20 68 65 6e 63 65 20 74 68 65   them, hence the
d200: 79 20 68 61 76 65 20 6e 6f 20 72 65 61 6c 20 74  y have no real t
d210: 69 6d 65 72 61 6e 67 65 20 61 6e 79 0a 09 23 20  imerange any..# 
d220: 6c 6f 6e 67 65 72 2e 20 42 79 20 75 73 69 6e 67  longer. By using
d230: 20 30 20 77 65 20 70 75 74 20 74 68 65 6d 20 69   0 we put them i
d240: 6e 20 66 72 6f 6e 74 20 6f 66 20 65 76 65 72 79  n front of every
d250: 74 68 69 6e 67 20 65 6c 73 65 2c 0a 09 23 20 61  thing else,..# a
d260: 73 20 74 68 65 79 20 6c 6f 67 69 63 61 6c 6c 79  s they logically
d270: 20 61 72 65 2e 0a 0a 09 73 65 74 20 74 68 65 73   are....set thes
d280: 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61 6e  et ('[join $bran
d290: 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72  ches {','}]')..r
d2a0: 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e  eturn [state run
d2b0: 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61   [subst -nocomma
d2c0: 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68  nds -nobackslash
d2d0: 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54  es {..    SELECT
d2e0: 20 49 46 4e 55 4c 4c 28 4d 49 4e 28 52 2e 64 61   IFNULL(MIN(R.da
d2f0: 74 65 29 2c 30 29 2c 20 49 46 4e 55 4c 4c 28 4d  te),0), IFNULL(M
d300: 41 58 28 52 2e 64 61 74 65 29 2c 30 29 0a 09 20  AX(R.date),0).. 
d310: 20 20 20 46 52 4f 4d 20 20 62 72 61 6e 63 68 20     FROM  branch 
d320: 42 2c 20 72 65 76 69 73 69 6f 6e 20 52 0a 09 20  B, revision R.. 
d330: 20 20 20 57 48 45 52 45 20 42 2e 62 69 64 20 49     WHERE B.bid I
d340: 4e 20 24 74 68 65 73 65 74 20 20 20 2d 2d 20 52  N $theset   -- R
d350: 65 73 74 72 69 63 74 20 74 6f 20 62 72 61 6e 63  estrict to branc
d360: 68 65 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a  hes of interest.
d370: 20 20 20 20 20 20 20 20 20 20 20 20 41 4e 44 20              AND 
d380: 20 20 52 2e 72 69 64 20 3d 20 42 2e 72 6f 6f 74    R.rid = B.root
d390: 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 62       -- Select b
d3a0: 72 61 6e 63 68 20 70 61 72 65 6e 74 20 72 65 76  ranch parent rev
d3b0: 69 73 69 6f 6e 73 0a 09 7d 5d 5d 0a 20 20 20 20  isions..}]].    
d3c0: 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c 74 20  }..    # result 
d3d0: 3d 20 34 2d 6c 69 73 74 20 28 69 74 65 6d 74 79  = 4-list (itemty
d3e0: 70 65 20 69 74 65 6d 69 64 20 6e 65 78 74 69 74  pe itemid nextit
d3f0: 65 6d 74 79 70 65 20 6e 65 78 74 69 74 65 6d 69  emtype nextitemi
d400: 64 20 2e 2e 2e 29 0a 20 20 20 20 74 79 70 65 6d  d ...).    typem
d410: 65 74 68 6f 64 20 6c 6f 6f 70 73 20 7b 62 72 61  ethod loops {bra
d420: 6e 63 68 65 73 7d 20 7b 0a 09 23 20 4e 6f 74 65  nches} {..# Note
d430: 3a 20 52 65 76 69 73 69 6f 6e 73 20 61 6e 64 20  : Revisions and 
d440: 74 61 67 73 20 63 61 6e 6e 6f 74 20 63 61 75 73  tags cannot caus
d450: 65 20 74 68 65 20 6c 6f 6f 70 2e 20 42 65 69 6e  e the loop. Bein
d460: 67 20 6f 66 20 61 0a 09 23 20 66 75 6e 64 61 6d  g of a..# fundam
d470: 65 6e 74 61 6c 6c 79 20 64 69 66 66 65 72 65 6e  entally differen
d480: 74 20 74 79 70 65 20 74 68 65 79 20 63 61 6e 6e  t type they cann
d490: 6f 74 20 62 65 20 69 6e 20 74 68 65 20 69 6e 63  ot be in the inc
d4a0: 6f 6d 69 6e 67 0a 09 23 20 73 65 74 20 6f 66 20  oming..# set of 
d4b0: 69 64 73 2e 0a 0a 09 73 65 74 20 74 68 65 73 65  ids....set these
d4c0: 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61 6e 63  t ('[join $branc
d4d0: 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 72 65  hes {','}]')..re
d4e0: 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20  turn [state run 
d4f0: 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e  [subst -nocomman
d500: 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65  ds -nobackslashe
d510: 73 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20  s {..    SELECT 
d520: 42 2e 62 69 64 2c 20 42 58 2e 62 69 64 0a 09 20  B.bid, BX.bid.. 
d530: 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68     FROM   branch
d540: 20 42 2c 20 70 72 65 66 65 72 65 64 70 61 72 65   B, preferedpare
d550: 6e 74 20 50 2c 20 62 72 61 6e 63 68 20 42 58 0a  nt P, branch BX.
d560: 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69  .    WHERE  B.bi
d570: 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 2d  d IN $theset   -
d580: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 62 72  - Restrict to br
d590: 61 6e 63 68 65 73 20 6f 66 20 69 6e 74 65 72 65  anches of intere
d5a0: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42  st..    AND    B
d5b0: 2e 73 69 64 20 3d 20 50 2e 70 69 64 20 20 20 20  .sid = P.pid    
d5c0: 20 20 2d 2d 20 47 65 74 20 74 68 65 20 70 72 65    -- Get the pre
d5d0: 66 65 72 65 64 20 62 72 61 6e 63 68 65 73 20 76  fered branches v
d5e0: 69 61 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42  ia..    AND    B
d5f0: 58 2e 73 69 64 20 3d 20 50 2e 73 69 64 20 20 20  X.sid = P.sid   
d600: 20 20 2d 2d 20 74 68 65 20 62 72 61 6e 63 68 20    -- the branch 
d610: 73 79 6d 62 6f 6c 73 0a 09 20 20 20 20 41 4e 44  symbols..    AND
d620: 20 20 20 20 42 58 2e 62 69 64 20 49 4e 20 24 74      BX.bid IN $t
d630: 68 65 73 65 74 20 20 2d 2d 20 4c 6f 6f 70 0a 09  heset  -- Loop..
d640: 7d 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23  }]].    }..    #
d650: 20 76 61 72 28 64 76 29 20 3d 20 64 69 63 74 20   var(dv) = dict 
d660: 28 69 74 65 6d 20 2d 3e 20 6c 69 73 74 20 28 69  (item -> list (i
d670: 74 65 6d 29 29 2c 20 69 74 65 6d 20 20 3d 20 6c  tem)), item  = l
d680: 69 73 74 20 28 74 79 70 65 20 69 64 29 0a 20 20  ist (type id).  
d690: 20 20 74 79 70 65 6d 65 74 68 6f 64 20 73 75 63    typemethod suc
d6a0: 63 65 73 73 6f 72 73 20 7b 64 76 20 62 72 61 6e  cessors {dv bran
d6b0: 63 68 65 73 7d 20 7b 0a 09 75 70 76 61 72 20 31  ches} {..upvar 1
d6c0: 20 24 64 76 20 64 65 70 65 6e 64 65 6e 63 69 65   $dv dependencie
d6d0: 73 0a 09 23 20 54 68 65 20 66 69 72 73 74 20 72  s..# The first r
d6e0: 65 76 69 73 69 6f 6e 20 63 6f 6d 6d 69 74 74 65  evision committe
d6f0: 64 20 6f 6e 20 61 20 62 72 61 6e 63 68 2c 20 61  d on a branch, a
d700: 6e 64 20 61 6c 6c 20 62 72 61 6e 63 68 65 73 0a  nd all branches.
d710: 09 23 20 61 6e 64 20 74 61 67 73 20 77 68 69 63  .# and tags whic
d720: 68 20 68 61 76 65 20 69 74 20 61 73 20 74 68 65  h have it as the
d730: 69 72 20 70 72 65 66 65 72 65 64 20 70 61 72 65  ir prefered pare
d740: 6e 74 20 61 72 65 20 74 68 65 0a 09 23 20 73 75  nt are the..# su
d750: 63 63 65 73 73 6f 72 73 20 6f 66 20 61 20 62 72  ccessors of a br
d760: 61 6e 63 68 2e 0a 0a 09 73 65 74 20 74 68 65 73  anch....set thes
d770: 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62 72 61 6e  et ('[join $bran
d780: 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29 0a 09 73  ches {','}]')..s
d790: 74 61 74 65 20 66 6f 72 65 61 63 68 72 6f 77 20  tate foreachrow 
d7a0: 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e  [subst -nocomman
d7b0: 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65  ds -nobackslashe
d7c0: 73 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54 20  s {..    SELECT 
d7d0: 42 2e 62 69 64 20 41 53 20 78 62 69 64 2c 20 52  B.bid AS xbid, R
d7e0: 2e 72 69 64 20 41 53 20 78 63 68 69 6c 64 0a 09  .rid AS xchild..
d7f0: 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63      FROM   branc
d800: 68 20 42 2c 20 72 65 76 69 73 69 6f 6e 20 52 0a  h B, revision R.
d810: 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69  .    WHERE  B.bi
d820: 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20  d IN $theset    
d830: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
d840: 62 72 61 6e 63 68 65 73 20 6f 66 20 69 6e 74 65  branches of inte
d850: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
d860: 20 42 2e 66 69 72 73 74 20 3d 20 52 2e 72 69 64   B.first = R.rid
d870: 20 20 20 20 20 20 2d 2d 20 47 65 74 20 66 69 72        -- Get fir
d880: 73 74 20 72 65 76 69 73 69 6f 6e 20 6f 6e 20 74  st revision on t
d890: 68 65 20 62 72 61 6e 63 68 0a 09 7d 5d 20 7b 0a  he branch..}] {.
d8a0: 09 20 20 20 20 6c 61 70 70 65 6e 64 20 64 65 70  .    lappend dep
d8b0: 65 6e 64 65 6e 63 69 65 73 28 5b 6c 69 73 74 20  endencies([list 
d8c0: 73 79 6d 3a 3a 62 72 61 6e 63 68 20 24 78 62 69  sym::branch $xbi
d8d0: 64 5d 29 20 5b 6c 69 73 74 20 72 65 76 20 24 78  d]) [list rev $x
d8e0: 63 68 69 6c 64 5d 0a 09 7d 0a 09 73 74 61 74 65  child]..}..state
d8f0: 20 66 6f 72 65 61 63 68 72 6f 77 20 5b 73 75 62   foreachrow [sub
d900: 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d  st -nocommands -
d910: 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b 0a  nobackslashes {.
d920: 09 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62 69  .    SELECT B.bi
d930: 64 20 41 53 20 78 62 69 64 2c 20 42 58 2e 62 69  d AS xbid, BX.bi
d940: 64 20 41 53 20 78 63 68 69 6c 64 0a 09 20 20 20  d AS xchild..   
d950: 20 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42   FROM   branch B
d960: 2c 20 70 72 65 66 65 72 65 64 70 61 72 65 6e 74  , preferedparent
d970: 20 50 2c 20 62 72 61 6e 63 68 20 42 58 0a 09 20   P, branch BX.. 
d980: 20 20 20 57 48 45 52 45 20 20 42 2e 62 69 64 20     WHERE  B.bid 
d990: 49 4e 20 24 74 68 65 73 65 74 20 20 20 20 20 2d  IN $theset     -
d9a0: 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20 62 72  - Restrict to br
d9b0: 61 6e 63 68 65 73 20 6f 66 20 69 6e 74 65 72 65  anches of intere
d9c0: 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20 20 42  st..    AND    B
d9d0: 2e 73 69 64 20 3d 20 50 2e 70 69 64 20 20 20 20  .sid = P.pid    
d9e0: 20 20 20 20 2d 2d 20 47 65 74 20 73 75 62 6f 72      -- Get subor
d9f0: 64 69 6e 61 74 65 20 62 72 61 6e 63 68 65 73 20  dinate branches 
da00: 76 69 61 20 74 68 65 0a 09 20 20 20 20 41 4e 44  via the..    AND
da10: 20 20 20 20 42 58 2e 73 69 64 20 3d 20 50 2e 73      BX.sid = P.s
da20: 69 64 20 20 20 20 20 20 20 2d 2d 20 70 72 65 66  id       -- pref
da30: 65 72 65 64 20 70 61 72 65 6e 74 73 20 6f 66 20  ered parents of 
da40: 74 68 65 69 72 20 73 79 6d 62 6f 6c 73 0a 09 7d  their symbols..}
da50: 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64  ] {..    lappend
da60: 20 64 65 70 65 6e 64 65 6e 63 69 65 73 28 5b 6c   dependencies([l
da70: 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e 63 68 20  ist sym::branch 
da80: 24 78 62 69 64 5d 29 20 5b 6c 69 73 74 20 73 79  $xbid]) [list sy
da90: 6d 3a 3a 62 72 61 6e 63 68 20 24 78 63 68 69 6c  m::branch $xchil
daa0: 64 5d 0a 09 7d 0a 09 73 74 61 74 65 20 66 6f 72  d]..}..state for
dab0: 65 61 63 68 72 6f 77 20 5b 73 75 62 73 74 20 2d  eachrow [subst -
dac0: 6e 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61  nocommands -noba
dad0: 63 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20 20  ckslashes {..   
dae0: 20 53 45 4c 45 43 54 20 42 2e 62 69 64 20 41 53   SELECT B.bid AS
daf0: 20 78 62 69 64 2c 20 54 2e 74 69 64 20 41 53 20   xbid, T.tid AS 
db00: 78 63 68 69 6c 64 0a 09 20 20 20 20 46 52 4f 4d  xchild..    FROM
db10: 20 20 20 62 72 61 6e 63 68 20 42 2c 20 70 72 65     branch B, pre
db20: 66 65 72 65 64 70 61 72 65 6e 74 20 50 2c 20 74  feredparent P, t
db30: 61 67 20 54 0a 09 20 20 20 20 57 48 45 52 45 20  ag T..    WHERE 
db40: 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65   B.bid IN $these
db50: 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63  t     -- Restric
db60: 74 20 74 6f 20 62 72 61 6e 63 68 65 73 20 6f 66  t to branches of
db70: 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41   interest..    A
db80: 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20 50 2e  ND    B.sid = P.
db90: 70 69 64 20 20 20 20 20 20 20 20 2d 2d 20 47 65  pid        -- Ge
dba0: 74 20 73 75 62 6f 72 64 69 6e 61 74 65 20 74 61  t subordinate ta
dbb0: 67 73 20 76 69 61 20 74 68 65 0a 09 20 20 20 20  gs via the..    
dbc0: 41 4e 44 20 20 20 20 54 2e 73 69 64 20 3d 20 50  AND    T.sid = P
dbd0: 2e 73 69 64 20 20 20 20 20 20 20 20 2d 2d 20 70  .sid        -- p
dbe0: 72 65 66 65 72 65 64 20 70 61 72 65 6e 74 73 20  refered parents 
dbf0: 6f 66 20 74 68 65 69 72 20 73 79 6d 62 6f 6c 73  of their symbols
dc00: 0a 09 7d 5d 20 7b 0a 09 20 20 20 20 6c 61 70 70  ..}] {..    lapp
dc10: 65 6e 64 20 64 65 70 65 6e 64 65 6e 63 69 65 73  end dependencies
dc20: 28 5b 6c 69 73 74 20 73 79 6d 3a 3a 62 72 61 6e  ([list sym::bran
dc30: 63 68 20 24 78 62 69 64 5d 29 20 5b 6c 69 73 74  ch $xbid]) [list
dc40: 20 73 79 6d 3a 3a 74 61 67 20 24 78 63 68 69 6c   sym::tag $xchil
dc50: 64 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20  d]..}..return.  
dc60: 20 20 7d 0a 0a 20 20 20 20 23 20 72 65 73 75 6c    }..    # resul
dc70: 74 20 3d 20 6c 69 73 74 20 28 63 68 61 6e 67 65  t = list (change
dc80: 73 65 74 2d 69 64 29 0a 20 20 20 20 74 79 70 65  set-id).    type
dc90: 6d 65 74 68 6f 64 20 63 73 5f 73 75 63 63 65 73  method cs_succes
dca0: 73 6f 72 73 20 7b 62 72 61 6e 63 68 65 73 7d 20  sors {branches} 
dcb0: 7b 0a 20 20 20 20 20 20 20 20 23 20 54 68 69 73  {.        # This
dcc0: 20 69 73 20 61 20 76 61 72 69 61 6e 74 20 6f 66   is a variant of
dcd0: 20 27 73 75 63 63 65 73 73 6f 72 73 27 20 77 68   'successors' wh
dce0: 69 63 68 20 6d 61 70 73 20 74 68 65 20 6c 6f 77  ich maps the low
dcf0: 2d 6c 65 76 65 6c 0a 20 20 20 20 20 20 20 20 23  -level.        #
dd00: 20 64 61 74 61 20 64 69 72 65 63 74 6c 79 20 74   data directly t
dd10: 6f 20 74 68 65 20 61 73 73 6f 63 69 61 74 65 64  o the associated
dd20: 20 63 68 61 6e 67 65 73 65 74 73 2e 20 49 2e 65   changesets. I.e
dd30: 2e 20 69 6e 73 74 65 61 64 0a 20 20 20 20 20 20  . instead.      
dd40: 20 20 23 20 6d 69 6c 6c 69 6f 6e 73 20 6f 66 20    # millions of 
dd50: 64 65 70 65 6e 64 65 6e 63 79 20 70 61 69 72 73  dependency pairs
dd60: 20 28 69 6e 20 65 78 74 72 65 6d 65 20 63 61 73   (in extreme cas
dd70: 65 73 20 28 45 78 61 6d 70 6c 65 3a 20 54 63 6c  es (Example: Tcl
dd80: 0a 20 20 20 20 20 20 20 20 23 20 43 56 53 29 29  .        # CVS))
dd90: 20 77 65 20 72 65 74 75 72 6e 20 61 20 76 65 72   we return a ver
dda0: 79 20 73 68 6f 72 74 20 61 6e 64 20 6d 75 63 68  y short and much
ddb0: 20 6d 6f 72 65 20 6d 61 6e 61 67 65 61 62 6c 65   more manageable
ddc0: 20 6c 69 73 74 0a 20 20 20 20 20 20 20 20 23 20   list.        # 
ddd0: 6f 66 20 63 68 61 6e 67 65 73 65 74 73 2e 0a 0a  of changesets...
dde0: 09 73 65 74 20 74 68 65 73 65 74 20 28 27 5b 6a  .set theset ('[j
ddf0: 6f 69 6e 20 24 62 72 61 6e 63 68 65 73 20 7b 27  oin $branches {'
de00: 2c 27 7d 5d 27 29 0a 20 20 20 20 20 20 20 20 72  ,'}]').        r
de10: 65 74 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e  eturn [state run
de20: 20 5b 73 75 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61   [subst -nocomma
de30: 6e 64 73 20 2d 6e 6f 62 61 63 6b 73 6c 61 73 68  nds -nobackslash
de40: 65 73 20 7b 0a 09 20 20 20 20 53 45 4c 45 43 54  es {..    SELECT
de50: 20 43 2e 63 69 64 0a 09 20 20 20 20 46 52 4f 4d   C.cid..    FROM
de60: 20 20 20 62 72 61 6e 63 68 20 42 2c 20 72 65 76     branch B, rev
de70: 69 73 69 6f 6e 20 52 2c 20 63 73 69 74 65 6d 20  ision R, csitem 
de80: 43 49 2c 20 63 68 61 6e 67 65 73 65 74 20 43 0a  CI, changeset C.
de90: 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69  .    WHERE  B.bi
dea0: 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20  d IN $theset    
deb0: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
dec0: 62 72 61 6e 63 68 65 73 20 6f 66 20 69 6e 74 65  branches of inte
ded0: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
dee0: 20 42 2e 66 69 72 73 74 20 3d 20 52 2e 72 69 64   B.first = R.rid
def0: 09 2d 2d 20 47 65 74 20 66 69 72 73 74 20 72 65  .-- Get first re
df00: 76 69 73 69 6f 6e 20 6f 6e 20 74 68 65 20 62 72  vision on the br
df10: 61 6e 63 68 0a 20 20 20 20 20 20 20 20 20 20 20  anch.           
df20: 20 41 4e 44 20 20 20 20 43 49 2e 69 69 64 20 3d   AND    CI.iid =
df30: 20 52 2e 72 69 64 20 20 20 20 20 20 20 2d 2d 20   R.rid       -- 
df40: 53 65 6c 65 63 74 20 61 6c 6c 20 63 68 61 6e 67  Select all chang
df50: 65 73 65 74 73 0a 20 20 20 20 20 20 20 20 20 20  esets.          
df60: 20 20 41 4e 44 20 20 20 20 43 2e 63 69 64 20 3d    AND    C.cid =
df70: 20 43 49 2e 63 69 64 09 2d 2d 20 63 6f 6e 74 61   CI.cid.-- conta
df80: 69 6e 69 6e 67 20 74 68 69 73 20 72 65 76 69 73  ining this revis
df90: 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ion.            
dfa0: 41 4e 44 20 20 20 20 43 2e 74 79 70 65 20 3d 20  AND    C.type = 
dfb0: 30 09 09 2d 2d 20 77 68 69 63 68 20 61 72 65 20  0..-- which are 
dfc0: 72 65 76 69 73 69 6f 6e 20 63 68 61 6e 67 65 73  revision changes
dfd0: 65 74 73 0a 20 20 20 20 55 4e 49 4f 4e 0a 09 20  ets.    UNION.. 
dfe0: 20 20 20 53 45 4c 45 43 54 20 43 2e 63 69 64 0a     SELECT C.cid.
dff0: 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e  .    FROM   bran
e000: 63 68 20 42 2c 20 70 72 65 66 65 72 65 64 70 61  ch B, preferedpa
e010: 72 65 6e 74 20 50 2c 20 62 72 61 6e 63 68 20 42  rent P, branch B
e020: 58 2c 20 63 73 69 74 65 6d 20 43 49 2c 20 63 68  X, csitem CI, ch
e030: 61 6e 67 65 73 65 74 20 43 0a 09 20 20 20 20 57  angeset C..    W
e040: 48 45 52 45 20 20 42 2e 62 69 64 20 49 4e 20 24  HERE  B.bid IN $
e050: 74 68 65 73 65 74 20 20 20 20 20 2d 2d 20 52 65  theset     -- Re
e060: 73 74 72 69 63 74 20 74 6f 20 62 72 61 6e 63 68  strict to branch
e070: 65 73 20 6f 66 20 69 6e 74 65 72 65 73 74 0a 09  es of interest..
e080: 20 20 20 20 41 4e 44 20 20 20 20 42 2e 73 69 64      AND    B.sid
e090: 20 3d 20 50 2e 70 69 64 09 2d 2d 20 47 65 74 20   = P.pid.-- Get 
e0a0: 73 75 62 6f 72 64 69 6e 61 74 65 20 62 72 61 6e  subordinate bran
e0b0: 63 68 65 73 20 76 69 61 20 74 68 65 0a 09 20 20  ches via the..  
e0c0: 20 20 41 4e 44 20 20 20 20 42 58 2e 73 69 64 20    AND    BX.sid 
e0d0: 3d 20 50 2e 73 69 64 09 2d 2d 20 70 72 65 66 65  = P.sid.-- prefe
e0e0: 72 65 64 20 70 61 72 65 6e 74 73 20 6f 66 20 74  red parents of t
e0f0: 68 65 69 72 20 73 79 6d 62 6f 6c 73 0a 20 20 20  heir symbols.   
e100: 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20 20           AND    
e110: 43 49 2e 69 69 64 20 3d 20 42 58 2e 62 69 64 20  CI.iid = BX.bid 
e120: 20 20 20 20 20 2d 2d 20 53 65 6c 65 63 74 20 61       -- Select a
e130: 6c 6c 20 63 68 61 6e 67 65 73 65 74 73 0a 20 20  ll changesets.  
e140: 20 20 20 20 20 20 20 20 20 20 41 4e 44 20 20 20            AND   
e150: 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69 64 09   C.cid = CI.cid.
e160: 2d 2d 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  -- containing th
e170: 65 20 73 75 62 6f 72 64 69 6e 61 74 65 20 62 72  e subordinate br
e180: 61 6e 63 68 65 73 0a 20 20 20 20 20 20 20 20 20  anches.         
e190: 20 20 20 41 4e 44 20 20 20 20 43 2e 74 79 70 65     AND    C.type
e1a0: 20 3d 20 32 09 09 2d 2d 20 77 68 69 63 68 20 61   = 2..-- which a
e1b0: 72 65 20 62 72 61 6e 63 68 20 63 68 61 6e 67 65  re branch change
e1c0: 73 65 74 73 0a 20 20 20 20 55 4e 49 4f 4e 0a 09  sets.    UNION..
e1d0: 20 20 20 20 53 45 4c 45 43 54 20 43 2e 63 69 64      SELECT C.cid
e1e0: 0a 09 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61  ..    FROM   bra
e1f0: 6e 63 68 20 42 2c 20 70 72 65 66 65 72 65 64 70  nch B, preferedp
e200: 61 72 65 6e 74 20 50 2c 20 74 61 67 20 54 2c 20  arent P, tag T, 
e210: 63 73 69 74 65 6d 20 43 49 2c 20 63 68 61 6e 67  csitem CI, chang
e220: 65 73 65 74 20 43 0a 09 20 20 20 20 57 48 45 52  eset C..    WHER
e230: 45 20 20 42 2e 62 69 64 20 49 4e 20 24 74 68 65  E  B.bid IN $the
e240: 73 65 74 20 20 20 20 20 2d 2d 20 52 65 73 74 72  set     -- Restr
e250: 69 63 74 20 74 6f 20 62 72 61 6e 63 68 65 73 20  ict to branches 
e260: 6f 66 20 69 6e 74 65 72 65 73 74 0a 09 20 20 20  of interest..   
e270: 20 41 4e 44 20 20 20 20 42 2e 73 69 64 20 3d 20   AND    B.sid = 
e280: 50 2e 70 69 64 09 2d 2d 20 47 65 74 20 73 75 62  P.pid.-- Get sub
e290: 6f 72 64 69 6e 61 74 65 20 74 61 67 73 20 76 69  ordinate tags vi
e2a0: 61 20 74 68 65 0a 09 20 20 20 20 41 4e 44 20 20  a the..    AND  
e2b0: 20 20 54 2e 73 69 64 20 3d 20 50 2e 73 69 64 09    T.sid = P.sid.
e2c0: 2d 2d 20 70 72 65 66 65 72 65 64 20 70 61 72 65  -- prefered pare
e2d0: 6e 74 73 20 6f 66 20 74 68 65 69 72 20 73 79 6d  nts of their sym
e2e0: 62 6f 6c 73 0a 20 20 20 20 20 20 20 20 20 20 20  bols.           
e2f0: 20 41 4e 44 20 20 20 20 43 49 2e 69 69 64 20 3d   AND    CI.iid =
e300: 20 54 2e 74 69 64 20 20 20 20 20 20 20 2d 2d 20   T.tid       -- 
e310: 53 65 6c 65 63 74 20 61 6c 6c 20 63 68 61 6e 67  Select all chang
e320: 65 73 65 74 73 0a 20 20 20 20 20 20 20 20 20 20  esets.          
e330: 20 20 41 4e 44 20 20 20 20 43 2e 63 69 64 20 3d    AND    C.cid =
e340: 20 43 49 2e 63 69 64 09 2d 2d 20 63 6f 6e 74 61   CI.cid.-- conta
e350: 69 6e 69 6e 67 20 74 68 65 20 73 75 62 6f 72 64  ining the subord
e360: 69 6e 61 74 65 20 74 61 67 73 0a 20 20 20 20 20  inate tags.     
e370: 20 20 20 20 20 20 20 41 4e 44 20 20 20 20 43 2e         AND    C.
e380: 74 79 70 65 20 3d 20 31 09 09 2d 2d 20 77 68 69  type = 1..-- whi
e390: 63 68 20 61 72 65 20 74 61 67 20 63 68 61 6e 67  ch are tag chang
e3a0: 65 73 65 74 73 0a 09 7d 5d 5d 0a 09 72 65 74 75  esets..}]]..retu
e3b0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  rn.    }..    # 
e3c0: 72 65 73 75 6c 74 20 3d 20 73 79 6d 62 6f 6c 20  result = symbol 
e3d0: 6e 61 6d 65 0a 20 20 20 20 74 79 70 65 6d 65 74  name.    typemet
e3e0: 68 6f 64 20 63 73 5f 6c 6f 64 20 7b 73 69 64 20  hod cs_lod {sid 
e3f0: 62 72 61 6e 63 68 65 73 7d 20 7b 0a 09 23 20 44  branches} {..# D
e400: 65 74 65 72 6d 69 6e 65 73 20 74 68 65 20 6e 61  etermines the na
e410: 6d 65 20 6f 66 20 74 68 65 20 73 79 6d 62 6f 6c  me of the symbol
e420: 20 77 68 69 63 68 20 69 73 20 74 68 65 20 6c 69   which is the li
e430: 6e 65 20 6f 66 0a 09 23 20 64 65 76 65 6c 6f 70  ne of..# develop
e440: 6d 65 6e 74 20 66 6f 72 20 74 68 65 20 62 72 61  ment for the bra
e450: 6e 63 68 65 73 20 69 6e 20 61 20 63 68 61 6e 67  nches in a chang
e460: 65 73 65 74 2e 20 43 6f 6d 65 73 20 64 69 72 65  eset. Comes dire
e470: 63 74 6c 79 0a 09 23 20 66 72 6f 6d 20 74 68 65  ctly..# from the
e480: 20 73 79 6d 62 6f 6c 20 77 68 69 63 68 20 69 73   symbol which is
e490: 20 74 68 65 20 63 68 61 6e 67 65 73 65 74 27 73   the changeset's
e4a0: 20 73 6f 75 72 63 65 20 61 6e 64 20 69 74 73 0a   source and its.
e4b0: 09 23 20 70 72 65 66 65 72 65 64 20 70 61 72 65  .# prefered pare
e4c0: 6e 74 2e 0a 0a 20 20 20 20 20 20 20 20 72 65 74  nt...        ret
e4d0: 75 72 6e 20 5b 73 74 61 74 65 20 72 75 6e 20 7b  urn [state run {
e4e0: 0a 20 09 20 20 20 20 53 45 4c 45 43 54 20 50 2e  . .    SELECT P.
e4f0: 6e 61 6d 65 0a 09 20 20 20 20 46 52 4f 4d 20 70  name..    FROM p
e500: 72 65 66 65 72 65 64 70 61 72 65 6e 74 20 53 50  referedparent SP
e510: 2c 20 73 79 6d 62 6f 6c 20 50 0a 09 20 20 20 20  , symbol P..    
e520: 57 48 45 52 45 20 53 50 2e 73 69 64 20 3d 20 24  WHERE SP.sid = $
e530: 73 69 64 0a 09 20 20 20 20 41 4e 44 20 20 20 50  sid..    AND   P
e540: 2e 73 69 64 20 3d 20 53 50 2e 70 69 64 0a 09 7d  .sid = SP.pid..}
e550: 5d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70  ].    }..    typ
e560: 65 6d 65 74 68 6f 64 20 6c 69 6d 69 74 73 20 7b  emethod limits {
e570: 62 72 61 6e 63 68 65 73 7d 20 7b 0a 09 23 20 4e  branches} {..# N
e580: 6f 74 65 73 2e 20 54 68 69 73 20 6d 65 74 68 6f  otes. This metho
e590: 64 20 65 78 69 73 74 73 20 6f 6e 6c 79 20 66 6f  d exists only fo
e5a0: 72 20 62 72 61 6e 63 68 65 73 2e 20 49 74 20 69  r branches. It i
e5b0: 73 20 6e 65 65 64 65 64 20 74 6f 0a 09 23 20 67  s needed to..# g
e5c0: 65 74 20 64 65 74 61 69 6c 65 64 20 69 6e 66 6f  et detailed info
e5d0: 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 61 20  rmation about a 
e5e0: 62 61 63 6b 77 61 72 64 20 62 72 61 6e 63 68 2e  backward branch.
e5f0: 20 49 74 20 64 6f 65 73 0a 09 23 20 6e 6f 74 20   It does..# not 
e600: 61 70 70 6c 79 20 74 6f 20 74 61 67 73 2c 20 6e  apply to tags, n
e610: 6f 72 20 72 65 76 69 73 69 6f 6e 73 2e 20 54 68  or revisions. Th
e620: 65 20 71 75 65 72 69 65 73 20 63 61 6e 20 61 6c  e queries can al
e630: 73 6f 0a 09 23 20 72 65 73 74 72 69 63 74 20 74  so..# restrict t
e640: 68 65 6d 73 65 6c 76 65 73 20 74 6f 20 74 68 65  hemselves to the
e650: 20 72 65 76 69 73 69 6f 6e 20 73 75 63 65 73 73   revision sucess
e660: 6f 72 73 2f 70 72 65 64 65 63 65 73 73 6f 72 73  ors/predecessors
e670: 0a 09 23 20 6f 66 20 62 72 61 6e 63 68 65 73 2c  ..# of branches,
e680: 20 61 73 20 6f 6e 6c 79 20 74 68 65 79 20 68 61   as only they ha
e690: 76 65 20 6f 72 64 65 72 69 6e 67 20 64 61 74 61  ve ordering data
e6a0: 20 61 6e 64 20 74 68 75 73 20 63 61 6e 0a 09 23   and thus can..#
e6b0: 20 63 61 75 73 65 20 74 68 65 20 62 61 63 6b 77   cause the backw
e6c0: 61 72 64 6e 65 73 73 2e 0a 0a 09 73 65 74 20 74  ardness....set t
e6d0: 68 65 73 65 74 20 28 27 5b 6a 6f 69 6e 20 24 62  heset ('[join $b
e6e0: 72 61 6e 63 68 65 73 20 7b 27 2c 27 7d 5d 27 29  ranches {','}]')
e6f0: 0a 0a 09 73 65 74 20 6d 61 78 70 20 5b 73 74 61  ...set maxp [sta
e700: 74 65 20 72 75 6e 20 5b 73 75 62 73 74 20 2d 6e  te run [subst -n
e710: 6f 63 6f 6d 6d 61 6e 64 73 20 2d 6e 6f 62 61 63  ocommands -nobac
e720: 6b 73 6c 61 73 68 65 73 20 7b 0a 09 20 20 20 20  kslashes {..    
e730: 2d 2d 20 6d 61 78 69 6d 61 6c 20 70 72 65 64 65  -- maximal prede
e740: 63 65 73 73 6f 72 20 70 6f 73 69 74 69 6f 6e 20  cessor position 
e750: 70 65 72 20 62 72 61 6e 63 68 0a 09 20 20 20 20  per branch..    
e760: 53 45 4c 45 43 54 20 42 2e 62 69 64 2c 20 4d 41  SELECT B.bid, MA
e770: 58 20 28 43 4f 2e 70 6f 73 29 0a 09 20 20 20 20  X (CO.pos)..    
e780: 46 52 4f 4d 20 20 20 62 72 61 6e 63 68 20 42 2c  FROM   branch B,
e790: 20 72 65 76 69 73 69 6f 6e 20 52 2c 20 63 73 69   revision R, csi
e7a0: 74 65 6d 20 43 49 2c 20 63 68 61 6e 67 65 73 65  tem CI, changese
e7b0: 74 20 43 2c 20 63 73 6f 72 64 65 72 20 43 4f 0a  t C, csorder CO.
e7c0: 09 20 20 20 20 57 48 45 52 45 20 20 42 2e 62 69  .    WHERE  B.bi
e7d0: 64 20 49 4e 20 24 74 68 65 73 65 74 20 20 20 20  d IN $theset    
e7e0: 20 2d 2d 20 52 65 73 74 72 69 63 74 20 74 6f 20   -- Restrict to 
e7f0: 62 72 61 6e 63 68 65 73 20 6f 66 20 69 6e 74 65  branches of inte
e800: 72 65 73 74 0a 09 20 20 20 20 41 4e 44 20 20 20  rest..    AND   
e810: 20 42 2e 72 6f 6f 74 20 3d 20 52 2e 72 69 64 20   B.root = R.rid 
e820: 20 20 20 20 20 20 2d 2d 20 47 65 74 20 62 72 61        -- Get bra
e830: 6e 63 68 20 72 6f 6f 74 20 72 65 76 69 73 69 6f  nch root revisio
e840: 6e 73 0a 09 20 20 20 20 41 4e 44 20 20 20 20 43  ns..    AND    C
e850: 49 2e 69 69 64 20 3d 20 52 2e 72 69 64 20 20 20  I.iid = R.rid   
e860: 20 20 20 20 2d 2d 20 47 65 74 20 63 68 61 6e 67      -- Get chang
e870: 65 73 65 74 73 20 63 6f 6e 74 61 69 6e 69 6e 67  esets containing
e880: 20 74 68 65 0a 09 20 20 20 20 41 4e 44 20 20 20   the..    AND   
e890: 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69 64 20   C.cid = CI.cid 
e8a0: 20 20 20 20 20 20 2d 2d 20 72 6f 6f 74 20 72 65        -- root re
e8b0: 76 69 73 69 6f 6e 73 2c 20 77 68 69 63 68 20 61  visions, which a
e8c0: 72 65 0a 09 20 20 20 20 41 4e 44 20 20 20 20 43  re..    AND    C
e8d0: 2e 74 79 70 65 20 3d 20 30 20 20 20 20 20 20 20  .type = 0       
e8e0: 20 20 20 20 2d 2d 20 72 65 76 69 73 69 6f 6e 20      -- revision 
e8f0: 63 68 61 6e 67 65 73 65 74 73 0a 09 20 20 20 20  changesets..    
e900: 41 4e 44 20 20 20 20 43 4f 2e 63 69 64 20 3d 20  AND    CO.cid = 
e910: 43 2e 63 69 64 20 20 20 20 20 20 20 2d 2d 20 47  C.cid       -- G
e920: 65 74 20 74 68 65 69 72 20 74 6f 70 6f 6c 6f 67  et their topolog
e930: 69 63 61 6c 20 6f 72 64 65 72 69 6e 67 0a 09 20  ical ordering.. 
e940: 20 20 20 47 52 4f 55 50 20 42 59 20 42 2e 62 69     GROUP BY B.bi
e950: 64 0a 09 7d 5d 5d 0a 0a 09 73 65 74 20 6d 69 6e  d..}]]...set min
e960: 73 20 5b 73 74 61 74 65 20 72 75 6e 20 5b 73 75  s [state run [su
e970: 62 73 74 20 2d 6e 6f 63 6f 6d 6d 61 6e 64 73 20  bst -nocommands 
e980: 2d 6e 6f 62 61 63 6b 73 6c 61 73 68 65 73 20 7b  -nobackslashes {
e990: 0a 09 20 20 20 20 2d 2d 20 6d 69 6e 69 6d 61 6c  ..    -- minimal
e9a0: 20 73 75 63 63 65 73 73 6f 72 20 70 6f 73 69 74   successor posit
e9b0: 69 6f 6e 20 70 65 72 20 62 72 61 6e 63 68 0a 09  ion per branch..
e9c0: 20 20 20 20 53 45 4c 45 43 54 20 42 2e 62 69 64      SELECT B.bid
e9d0: 2c 20 4d 49 4e 20 28 43 4f 2e 70 6f 73 29 0a 09  , MIN (CO.pos)..
e9e0: 20 20 20 20 46 52 4f 4d 20 20 20 62 72 61 6e 63      FROM   branc
e9f0: 68 20 42 2c 20 72 65 76 69 73 69 6f 6e 20 52 2c  h B, revision R,
ea00: 20 63 73 69 74 65 6d 20 43 49 2c 20 63 68 61 6e   csitem CI, chan
ea10: 67 65 73 65 74 20 43 2c 20 63 73 6f 72 64 65 72  geset C, csorder
ea20: 20 43 4f 0a 09 20 20 20 20 57 48 45 52 45 20 20   CO..    WHERE  
ea30: 42 2e 62 69 64 20 49 4e 20 24 74 68 65 73 65 74  B.bid IN $theset
ea40: 20 20 20 20 20 2d 2d 20 52 65 73 74 72 69 63 74       -- Restrict
ea50: 20 74 6f 20 62 72 61 6e 63 68 65 73 20 6f 66 20   to branches of 
ea60: 69 6e 74 65 72 65 73 74 0a 09 20 20 20 20 41 4e  interest..    AN
ea70: 44 20 20 20 20 42 2e 66 69 72 73 74 20 3d 20 52  D    B.first = R
ea80: 2e 72 69 64 20 20 20 20 20 20 2d 2d 20 47 65 74  .rid      -- Get
ea90: 20 74 68 65 20 66 69 72 73 74 20 72 65 76 69 73   the first revis
eaa0: 69 6f 6e 73 20 6f 6e 20 74 68 65 20 62 72 61 6e  ions on the bran
eab0: 63 68 65 73 0a 09 20 20 20 20 41 4e 44 20 20 20  ches..    AND   
eac0: 20 43 49 2e 69 69 64 20 3d 20 52 2e 72 69 64 20   CI.iid = R.rid 
ead0: 20 20 20 20 20 20 2d 2d 20 47 65 74 20 63 68 61        -- Get cha
eae0: 6e 67 65 73 65 74 73 20 63 6f 6e 74 61 69 6e 69  ngesets containi
eaf0: 6e 67 20 74 68 65 0a 09 20 20 20 20 41 4e 44 20  ng the..    AND 
eb00: 20 20 20 43 2e 63 69 64 20 3d 20 43 49 2e 63 69     C.cid = CI.ci
eb10: 64 09 2d 2d 20 66 69 72 73 74 20 72 65 76 69 73  d.-- first revis
eb20: 69 6f 6e 73 2c 20 77 68 69 63 68 20 61 72 65 0a  ions, which are.
eb30: 09 20 20 20 20 41 4e 44 20 20 20 20 43 2e 74 79  .    AND    C.ty
eb40: 70 65 20 3d 20 30 09 09 2d 2d 20 72 65 76 69 73  pe = 0..-- revis
eb50: 69 6f 6e 20 63 68 61 6e 67 65 73 65 74 73 0a 09  ion changesets..
eb60: 20 20 20 20 41 4e 44 20 20 20 20 43 4f 2e 63 69      AND    CO.ci
eb70: 64 20 3d 20 43 2e 63 69 64 09 2d 2d 20 47 65 74  d = C.cid.-- Get
eb80: 20 74 68 65 69 72 20 74 6f 70 6f 6c 6f 67 69 63   their topologic
eb90: 61 6c 20 6f 72 64 65 72 69 6e 67 0a 09 20 20 20  al ordering..   
eba0: 20 47 52 4f 55 50 20 42 59 20 42 2e 62 69 64 0a   GROUP BY B.bid.
ebb0: 09 7d 5d 5d 0a 0a 20 20 20 20 20 20 20 20 72 65  .}]]..        re
ebc0: 74 75 72 6e 20 5b 6c 69 73 74 20 24 6d 61 78 70  turn [list $maxp
ebd0: 20 24 6d 69 6e 73 5d 0a 20 20 20 20 7d 0a 0a 20   $mins].    }.. 
ebe0: 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23     # # ## ### ##
ebf0: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23  ### ######## ###
ec00: 23 23 23 23 23 23 23 23 23 23 0a 20 20 20 20 23  ##########.    #
ec10: 23 20 43 6f 6e 66 69 67 75 72 61 74 69 6f 6e 0a  # Configuration.
ec20: 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73  .    pragma -has
ec30: 69 6e 73 74 61 6e 63 65 73 20 20 20 6e 6f 20 3b  instances   no ;
ec40: 20 23 20 73 69 6e 67 6c 65 74 6f 6e 0a 20 20 20   # singleton.   
ec50: 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79 70 65   pragma -hastype
ec60: 69 6e 66 6f 20 20 20 20 6e 6f 20 3b 20 23 20 6e  info    no ; # n
ec70: 6f 20 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a  o introspection.
ec80: 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 74      pragma -hast
ec90: 79 70 65 64 65 73 74 72 6f 79 20 6e 6f 20 3b 20  ypedestroy no ; 
eca0: 23 20 69 6d 6d 6f 72 74 61 6c 0a 7d 0a 0a 23 20  # immortal.}..# 
ecb0: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23  # ## ### ##### #
ecc0: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
ecd0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
ece0: 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 0a 0a  ###########.##..
ecf0: 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a  namespace eval :
ed00: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70  :vc::fossil::imp
ed10: 6f 72 74 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63  ort::cvs::projec
ed20: 74 20 7b 0a 20 20 20 20 6e 61 6d 65 73 70 61 63  t {.    namespac
ed30: 65 20 65 78 70 6f 72 74 20 72 65 76 0a 20 20 20  e export rev.   
ed40: 20 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20   namespace eval 
ed50: 72 65 76 20 7b 0a 09 6e 61 6d 65 73 70 61 63 65  rev {..namespace
ed60: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f   import ::vc::fo
ed70: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
ed80: 73 3a 3a 73 74 61 74 65 0a 09 6e 61 6d 65 73 70  s::state..namesp
ed90: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a  ace import ::vc:
eda0: 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a  :fossil::import:
edb0: 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a  :cvs::integrity.
edc0: 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72  .namespace impor
edd0: 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d  t ::vc::tools::m
ede0: 69 73 63 3a 3a 2a 0a 09 6e 61 6d 65 73 70 61 63  isc::*..namespac
edf0: 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74  e import ::vc::t
ee00: 6f 6f 6c 73 3a 3a 74 72 6f 75 62 6c 65 0a 09 6e  ools::trouble..n
ee10: 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20  amespace import 
ee20: 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67  ::vc::tools::log
ee30: 0a 09 6c 6f 67 20 72 65 67 69 73 74 65 72 20 63  ..log register c
ee40: 73 65 74 73 0a 0a 09 23 20 53 65 74 20 75 70 20  sets...# Set up 
ee50: 74 68 65 20 68 65 6c 70 65 72 20 73 69 6e 67 6c  the helper singl
ee60: 65 74 6f 6e 73 0a 09 6e 61 6d 65 73 70 61 63 65  etons..namespace
ee70: 20 65 76 61 6c 20 72 65 76 20 7b 0a 09 20 20 20   eval rev {..   
ee80: 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72   namespace impor
ee90: 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a  t ::vc::fossil::
eea0: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61  import::cvs::sta
eeb0: 74 65 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63  te..    namespac
eec0: 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66  e import ::vc::f
eed0: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63  ossil::import::c
eee0: 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09 20  vs::integrity.. 
eef0: 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70     namespace imp
ef00: 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a  ort ::vc::tools:
ef10: 3a 6c 6f 67 0a 09 7d 0a 09 6e 61 6d 65 73 70 61  :log..}..namespa
ef20: 63 65 20 65 76 61 6c 20 73 79 6d 3a 3a 74 61 67  ce eval sym::tag
ef30: 20 7b 0a 09 20 20 20 20 6e 61 6d 65 73 70 61 63   {..    namespac
ef40: 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66  e import ::vc::f
ef50: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63  ossil::import::c
ef60: 76 73 3a 3a 73 74 61 74 65 0a 09 20 20 20 20 6e  vs::state..    n
ef70: 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20  amespace import 
ef80: 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d  ::vc::fossil::im
ef90: 70 6f 72 74 3a 3a 63 76 73 3a 3a 69 6e 74 65 67  port::cvs::integ
efa0: 72 69 74 79 0a 09 20 20 20 20 6e 61 6d 65 73 70  rity..    namesp
efb0: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a  ace import ::vc:
efc0: 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 0a 09 7d 0a 09  :tools::log..}..
efd0: 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 73  namespace eval s
efe0: 79 6d 3a 3a 62 72 61 6e 63 68 20 7b 0a 09 20 20  ym::branch {..  
eff0: 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f    namespace impo
f000: 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a  rt ::vc::fossil:
f010: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74  :import::cvs::st
f020: 61 74 65 0a 09 20 20 20 20 6e 61 6d 65 73 70 61  ate..    namespa
f030: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a  ce import ::vc::
f040: 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a  fossil::import::
f050: 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79 0a 09  cvs::integrity..
f060: 20 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d      namespace im
f070: 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73  port ::vc::tools
f080: 3a 3a 6c 6f 67 0a 09 7d 0a 20 20 20 20 7d 0a 7d  ::log..}.    }.}
f090: 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23  ..# # ## ### ###
f0a0: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23  ## ######## ####
f0b0: 23 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23  ######### ######
f0c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  ###############.
f0d0: 23 23 20 52 65 61 64 79 0a 0a 70 61 63 6b 61 67  ## Ready..packag
f0e0: 65 20 70 72 6f 76 69 64 65 20 76 63 3a 3a 66 6f  e provide vc::fo
f0f0: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
f100: 73 3a 3a 70 72 6f 6a 65 63 74 3a 3a 72 65 76 20  s::project::rev 
f110: 31 2e 30 0a 72 65 74 75 72 6e 0a                 1.0.return.