Hex Artifact Content
Not logged in

Artifact b1c125a0626a3d8e7194c2c59d8d3710e963a355:

File tools/cvs2fossil/lib/c2f_file.tcl part of check-in [e100314ec2] - Extended file handling with main logic to import an archive into fossil. Main parts are determining the various orders for expansion and import, and expanding all revisions in an archive into full texts, iteratively applying the stored deltas. by aku on 2007-12-05 07:55:59.

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 20 41 6e 64 72 65 61 73 20 4b 75 70 72 69  07 Andreas Kupri
0070: 65 73 2e 0a 23 0a 23 20 54 68 69 73 20 73 6f 66  es..#.# This sof
0080: 74 77 61 72 65 20 69 73 20 6c 69 63 65 6e 73 65  tware is license
0090: 64 20 61 73 20 64 65 73 63 72 69 62 65 64 20 69  d as described i
00a0: 6e 20 74 68 65 20 66 69 6c 65 20 4c 49 43 45 4e  n the file LICEN
00b0: 53 45 2c 20 77 68 69 63 68 0a 23 20 79 6f 75 20  SE, which.# you 
00c0: 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65 63 65  should have rece
00d0: 69 76 65 64 20 61 73 20 70 61 72 74 20 6f 66 20  ived as part of 
00e0: 74 68 69 73 20 64 69 73 74 72 69 62 75 74 69 6f  this distributio
00f0: 6e 2e 0a 23 0a 23 20 54 68 69 73 20 73 6f 66 74  n..#.# This soft
0100: 77 61 72 65 20 63 6f 6e 73 69 73 74 73 20 6f 66  ware consists of
0110: 20 76 6f 6c 75 6e 74 61 72 79 20 63 6f 6e 74 72   voluntary contr
0120: 69 62 75 74 69 6f 6e 73 20 6d 61 64 65 20 62 79  ibutions made by
0130: 20 6d 61 6e 79 0a 23 20 69 6e 64 69 76 69 64 75   many.# individu
0140: 61 6c 73 2e 20 20 46 6f 72 20 65 78 61 63 74 20  als.  For exact 
0150: 63 6f 6e 74 72 69 62 75 74 69 6f 6e 20 68 69 73  contribution his
0160: 74 6f 72 79 2c 20 73 65 65 20 74 68 65 20 72 65  tory, see the re
0170: 76 69 73 69 6f 6e 0a 23 20 68 69 73 74 6f 72 79  vision.# history
0180: 20 61 6e 64 20 6c 6f 67 73 2c 20 61 76 61 69 6c   and logs, avail
0190: 61 62 6c 65 20 61 74 20 68 74 74 70 3a 2f 2f 66  able at http://f
01a0: 6f 73 73 69 6c 2d 73 63 6d 2e 68 77 61 63 69 2e  ossil-scm.hwaci.
01b0: 63 6f 6d 2f 66 6f 73 73 69 6c 0a 23 20 23 20 23  com/fossil.# # #
01c0: 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23  # ### ##### ####
01d0: 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23  #### ###########
01e0: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
01f0: 23 23 23 23 23 23 23 23 0a 0a 23 23 20 46 69 6c  ########..## Fil
0200: 65 2c 20 70 61 72 74 20 6f 66 20 61 20 70 72 6f  e, part of a pro
0210: 6a 65 63 74 2c 20 70 61 72 74 20 6f 66 20 61 20  ject, part of a 
0220: 43 56 53 20 72 65 70 6f 73 69 74 6f 72 79 2e 20  CVS repository. 
0230: 4d 75 6c 74 69 70 6c 65 0a 23 23 20 69 6e 73 74  Multiple.## inst
0240: 61 6e 63 65 73 20 61 72 65 20 70 6f 73 73 69 62  ances are possib
0250: 6c 65 2e 0a 0a 23 20 23 20 23 23 20 23 23 23 20  le...# # ## ### 
0260: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23  ##### ######## #
0270: 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23 23  ############ ###
0280: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0290: 23 23 0a 23 23 20 52 65 71 75 69 72 65 6d 65 6e  ##.## Requiremen
02a0: 74 73 0a 0a 70 61 63 6b 61 67 65 20 72 65 71 75  ts..package requ
02b0: 69 72 65 20 54 63 6c 20 38 2e 34 20 20 20 20 20  ire Tcl 8.4     
02c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02d0: 20 20 20 20 20 20 20 20 3b 20 23 20 52 65 71 75          ; # Requ
02e0: 69 72 65 64 20 72 75 6e 74 69 6d 65 2e 0a 70 61  ired runtime..pa
02f0: 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 73 6e  ckage require sn
0300: 69 74 20 20 20 20 20 20 20 20 20 20 20 20 20 20  it              
0310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0320: 20 20 3b 20 23 20 4f 4f 20 73 79 73 74 65 6d 2e    ; # OO system.
0330: 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65  .package require
0340: 20 73 74 72 75 63 74 3a 3a 73 65 74 20 20 20 20   struct::set    
0350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0360: 20 20 20 20 20 3b 20 23 20 53 65 74 20 6f 70 65       ; # Set ope
0370: 72 61 74 69 6f 6e 73 2e 0a 70 61 63 6b 61 67 65  rations..package
0380: 20 72 65 71 75 69 72 65 20 73 74 72 75 63 74 3a   require struct:
0390: 3a 6c 69 73 74 20 20 20 20 20 20 20 20 20 20 20  :list           
03a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3b 20 23               ; #
03b0: 20 48 69 67 68 65 72 20 6f 72 64 65 72 20 6f 70   Higher order op
03c0: 65 72 61 74 69 6f 6e 73 2e 0a 70 61 63 6b 61 67  erations..packag
03d0: 65 20 72 65 71 75 69 72 65 20 76 63 3a 3a 66 6f  e require vc::fo
03e0: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
03f0: 73 3a 3a 66 69 6c 65 3a 3a 72 65 76 20 20 3b 20  s::file::rev  ; 
0400: 23 20 43 56 53 20 70 65 72 20 66 69 6c 65 20 72  # CVS per file r
0410: 65 76 69 73 69 6f 6e 73 2e 0a 70 61 63 6b 61 67  evisions..packag
0420: 65 20 72 65 71 75 69 72 65 20 76 63 3a 3a 66 6f  e require vc::fo
0430: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
0440: 73 3a 3a 66 69 6c 65 3a 3a 73 79 6d 20 20 3b 20  s::file::sym  ; 
0450: 23 20 43 56 53 20 70 65 72 20 66 69 6c 65 20 73  # CVS per file s
0460: 79 6d 62 6f 6c 73 2e 0a 70 61 63 6b 61 67 65 20  ymbols..package 
0470: 72 65 71 75 69 72 65 20 76 63 3a 3a 66 6f 73 73  require vc::foss
0480: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a  il::import::cvs:
0490: 3a 73 74 61 74 65 20 20 20 20 20 20 3b 20 23 20  :state      ; # 
04a0: 53 74 61 74 65 20 73 74 6f 72 61 67 65 2e 0a 70  State storage..p
04b0: 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 76  ackage require v
04c0: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72  c::fossil::impor
04d0: 74 3a 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69 74  t::cvs::integrit
04e0: 79 20 20 3b 20 23 20 53 74 61 74 65 20 69 6e 74  y  ; # State int
04f0: 65 67 72 69 74 79 20 63 68 65 63 6b 73 2e 0a 70  egrity checks..p
0500: 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 76  ackage require v
0510: 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72  c::fossil::impor
0520: 74 3a 3a 63 76 73 3a 3a 67 74 63 6f 72 65 20 20  t::cvs::gtcore  
0530: 20 20 20 3b 20 23 20 47 72 61 70 68 20 74 72 61     ; # Graph tra
0540: 76 65 72 73 61 6c 20 63 6f 72 65 2e 0a 70 61 63  versal core..pac
0550: 6b 61 67 65 20 72 65 71 75 69 72 65 20 76 63 3a  kage require vc:
0560: 3a 74 6f 6f 6c 73 3a 3a 74 72 6f 75 62 6c 65 20  :tools::trouble 
0570: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0580: 20 3b 20 23 20 45 72 72 6f 72 20 72 65 70 6f 72   ; # Error repor
0590: 74 69 6e 67 2e 0a 70 61 63 6b 61 67 65 20 72 65  ting..package re
05a0: 71 75 69 72 65 20 76 63 3a 3a 74 6f 6f 6c 73 3a  quire vc::tools:
05b0: 3a 6c 6f 67 20 20 20 20 20 20 20 20 20 20 20 20  :log            
05c0: 20 20 20 20 20 20 20 20 20 20 3b 20 23 20 55 73            ; # Us
05d0: 65 72 20 66 65 65 64 62 61 63 6b 0a 70 61 63 6b  er feedback.pack
05e0: 61 67 65 20 72 65 71 75 69 72 65 20 76 63 3a 3a  age require vc::
05f0: 74 6f 6f 6c 73 3a 3a 6d 69 73 63 20 20 20 20 20  tools::misc     
0600: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0610: 3b 20 23 20 54 65 78 74 20 66 6f 72 6d 61 74 74  ; # Text formatt
0620: 69 6e 67 0a 0a 23 20 23 20 23 23 20 23 23 23 20  ing..# # ## ### 
0630: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23  ##### ######## #
0640: 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23 23  ############ ###
0650: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
0660: 23 23 0a 23 23 0a 0a 73 6e 69 74 3a 3a 74 79 70  ##.##..snit::typ
0670: 65 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a  e ::vc::fossil::
0680: 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 66 69 6c  import::cvs::fil
0690: 65 20 7b 0a 20 20 20 20 23 20 23 20 23 23 20 23  e {.    # # ## #
06a0: 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23  ## ##### #######
06b0: 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  # #############.
06c0: 20 20 20 20 23 23 20 50 75 62 6c 69 63 20 41 50      ## Public AP
06d0: 49 0a 0a 20 20 20 20 63 6f 6e 73 74 72 75 63 74  I..    construct
06e0: 6f 72 20 7b 69 64 20 70 61 74 68 20 75 73 72 70  or {id path usrp
06f0: 61 74 68 20 65 78 65 63 75 74 61 62 6c 65 20 70  ath executable p
0700: 72 6f 6a 65 63 74 7d 20 7b 0a 09 73 65 74 20 6d  roject} {..set m
0710: 79 69 64 20 20 20 20 20 20 20 20 20 24 69 64 0a  yid         $id.
0720: 09 73 65 74 20 6d 79 70 61 74 68 20 20 20 20 20  .set mypath     
0730: 20 20 24 70 61 74 68 0a 09 73 65 74 20 6d 79 75    $path..set myu
0740: 73 72 70 61 74 68 20 20 20 20 24 75 73 72 70 61  srpath    $usrpa
0750: 74 68 0a 09 73 65 74 20 6d 79 65 78 65 63 75 74  th..set myexecut
0760: 61 62 6c 65 20 24 65 78 65 63 75 74 61 62 6c 65  able $executable
0770: 0a 09 73 65 74 20 6d 79 70 72 6f 6a 65 63 74 20  ..set myproject 
0780: 20 20 20 24 70 72 6f 6a 65 63 74 0a 09 73 65 74     $project..set
0790: 20 6d 79 74 72 75 6e 6b 20 20 20 20 20 20 5b 24   mytrunk      [$
07a0: 6d 79 70 72 6f 6a 65 63 74 20 74 72 75 6e 6b 5d  myproject trunk]
07b0: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
07c0: 20 20 20 20 6d 65 74 68 6f 64 20 73 65 74 69 64      method setid
07d0: 20 7b 69 64 7d 20 7b 0a 09 69 6e 74 65 67 72 69   {id} {..integri
07e0: 74 79 20 61 73 73 65 72 74 20 7b 24 6d 79 69 64  ty assert {$myid
07f0: 20 65 71 20 22 22 7d 20 7b 46 69 6c 65 20 27 24   eq ""} {File '$
0800: 6d 79 70 61 74 68 27 20 61 6c 72 65 61 64 79 20  mypath' already 
0810: 68 61 73 20 61 6e 20 69 64 2c 20 27 24 6d 79 69  has an id, '$myi
0820: 64 27 7d 0a 09 73 65 74 20 6d 79 69 64 20 24 69  d'}..set myid $i
0830: 64 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  d..return.    }.
0840: 0a 20 20 20 20 6d 65 74 68 6f 64 20 69 64 20 20  .    method id  
0850: 20 20 20 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20      {} { return 
0860: 24 6d 79 69 64 20 7d 0a 20 20 20 20 6d 65 74 68  $myid }.    meth
0870: 6f 64 20 70 61 74 68 20 20 20 20 7b 7d 20 7b 20  od path    {} { 
0880: 72 65 74 75 72 6e 20 24 6d 79 70 61 74 68 20 7d  return $mypath }
0890: 0a 20 20 20 20 6d 65 74 68 6f 64 20 75 73 72 70  .    method usrp
08a0: 61 74 68 20 7b 7d 20 7b 20 72 65 74 75 72 6e 20  ath {} { return 
08b0: 24 6d 79 75 73 72 70 61 74 68 20 7d 0a 20 20 20  $myusrpath }.   
08c0: 20 6d 65 74 68 6f 64 20 70 72 6f 6a 65 63 74 20   method project 
08d0: 7b 7d 20 7b 20 72 65 74 75 72 6e 20 24 6d 79 70  {} { return $myp
08e0: 72 6f 6a 65 63 74 20 7d 0a 0a 20 20 20 20 64 65  roject }..    de
08f0: 6c 65 67 61 74 65 20 6d 65 74 68 6f 64 20 63 6f  legate method co
0900: 6d 6d 69 74 6d 65 73 73 61 67 65 6f 66 20 74 6f  mmitmessageof to
0910: 20 6d 79 70 72 6f 6a 65 63 74 0a 0a 20 20 20 20   myproject..    
0920: 23 20 23 20 23 23 20 23 23 23 20 23 23 23 23 23  # # ## ### #####
0930: 20 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23   ######## ######
0940: 23 23 23 23 23 23 23 0a 20 20 20 20 23 23 20 4d  #######.    ## M
0950: 65 74 68 6f 64 73 20 72 65 71 75 69 72 65 64 20  ethods required 
0960: 66 6f 72 20 74 68 65 20 63 6c 61 73 73 20 74 6f  for the class to
0970: 20 62 65 20 61 20 73 69 6e 6b 20 6f 66 20 74 68   be a sink of th
0980: 65 20 72 63 73 20 70 61 72 73 65 72 0a 0a 20 20  e rcs parser..  
0990: 20 20 23 6d 65 74 68 6f 64 20 62 65 67 69 6e 20    #method begin 
09a0: 7b 7d 20 7b 70 75 74 73 20 62 65 67 69 6e 7d 0a  {} {puts begin}.
09b0: 20 20 20 20 23 6d 65 74 68 6f 64 20 73 65 74 68      #method seth
09c0: 65 61 64 20 7b 68 7d 20 7b 70 75 74 73 20 68 65  ead {h} {puts he
09d0: 61 64 3d 24 68 7d 0a 20 20 20 20 23 6d 65 74 68  ad=$h}.    #meth
09e0: 6f 64 20 73 65 74 70 72 69 6e 63 69 70 61 6c 62  od setprincipalb
09f0: 72 61 6e 63 68 20 7b 62 7d 20 7b 70 75 74 73 20  ranch {b} {puts 
0a00: 70 62 3d 24 62 7d 0a 20 20 20 20 23 6d 65 74 68  pb=$b}.    #meth
0a10: 6f 64 20 64 65 66 74 61 67 20 7b 73 20 72 7d 20  od deftag {s r} 
0a20: 7b 70 75 74 73 20 24 73 3d 24 72 7d 0a 20 20 20  {puts $s=$r}.   
0a30: 20 23 6d 65 74 68 6f 64 20 73 65 74 63 6f 6d 6d   #method setcomm
0a40: 65 6e 74 20 7b 63 7d 20 7b 70 75 74 73 20 63 6f  ent {c} {puts co
0a50: 6d 6d 65 6e 74 3d 24 63 7d 0a 20 20 20 20 23 6d  mment=$c}.    #m
0a60: 65 74 68 6f 64 20 61 64 6d 69 6e 64 6f 6e 65 20  ethod admindone 
0a70: 7b 7d 20 7b 70 75 74 73 20 61 64 6d 69 6e 64 6f  {} {puts admindo
0a80: 6e 65 7d 0a 20 20 20 20 23 6d 65 74 68 6f 64 20  ne}.    #method 
0a90: 64 65 66 20 7b 72 65 76 20 64 61 74 65 20 61 75  def {rev date au
0aa0: 74 68 6f 72 20 73 74 61 74 65 20 6e 65 78 74 20  thor state next 
0ab0: 62 72 61 6e 63 68 65 73 7d 20 7b 70 75 74 73 20  branches} {puts 
0ac0: 22 64 65 66 20 24 72 65 76 20 24 64 61 74 65 20  "def $rev $date 
0ad0: 24 61 75 74 68 6f 72 20 24 73 74 61 74 65 20 24  $author $state $
0ae0: 6e 65 78 74 20 24 62 72 61 6e 63 68 65 73 22 7d  next $branches"}
0af0: 0a 20 20 20 20 23 6d 65 74 68 6f 64 20 64 65 66  .    #method def
0b00: 64 6f 6e 65 20 7b 7d 20 7b 70 75 74 73 20 64 65  done {} {puts de
0b10: 66 2d 64 6f 6e 65 7d 0a 20 20 20 20 23 6d 65 74  f-done}.    #met
0b20: 68 6f 64 20 73 65 74 64 65 73 63 20 7b 64 7d 20  hod setdesc {d} 
0b30: 7b 70 75 74 73 20 64 65 73 63 3d 24 64 7d 0a 20  {puts desc=$d}. 
0b40: 20 20 20 23 6d 65 74 68 6f 64 20 65 78 74 65 6e     #method exten
0b50: 64 20 7b 72 65 76 20 63 6f 6d 6d 69 74 6d 73 67  d {rev commitmsg
0b60: 20 64 65 6c 74 61 72 61 6e 67 65 7d 20 7b 70 75   deltarange} {pu
0b70: 74 73 20 22 65 78 74 65 6e 64 20 24 63 6f 6d 6d  ts "extend $comm
0b80: 69 74 6d 73 67 20 24 64 65 6c 74 61 72 61 6e 67  itmsg $deltarang
0b90: 65 22 7d 0a 20 20 20 20 23 6d 65 74 68 6f 64 20  e"}.    #method 
0ba0: 64 6f 6e 65 20 7b 7d 20 7b 70 75 74 73 20 64 6f  done {} {puts do
0bb0: 6e 65 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20  ne}..    # # ## 
0bc0: 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23  ### ##### ######
0bd0: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
0be0: 0a 20 20 20 20 23 23 20 50 65 72 73 69 73 74 65  .    ## Persiste
0bf0: 6e 63 65 20 28 70 61 73 73 20 49 49 29 0a 0a 20  nce (pass II).. 
0c00: 20 20 20 6d 65 74 68 6f 64 20 70 65 72 73 69 73     method persis
0c10: 74 20 7b 7d 20 7b 0a 09 23 20 46 69 72 73 74 20  t {} {..# First 
0c20: 63 6f 6c 6c 65 63 74 20 74 68 65 20 72 65 61 63  collect the reac
0c30: 68 61 62 6c 65 20 72 65 76 69 73 69 6f 6e 73 20  hable revisions 
0c40: 61 6e 64 20 73 79 6d 62 6f 6c 73 2c 20 74 68 65  and symbols, the
0c50: 6e 0a 09 23 20 61 73 73 69 67 6e 20 69 64 27 73  n..# assign id's
0c60: 20 74 6f 20 61 6c 6c 2e 20 54 68 65 79 20 61 72   to all. They ar
0c70: 65 20 73 6f 72 74 65 64 20 73 6f 20 74 68 61 74  e sorted so that
0c80: 20 77 65 20 77 69 6c 6c 20 68 61 76 65 20 69 64   we will have id
0c90: 73 0a 09 23 20 77 68 69 63 68 20 73 6f 72 74 20  s..# which sort 
0ca0: 69 6e 20 6f 72 64 65 72 20 6f 66 20 63 72 65 61  in order of crea
0cb0: 74 69 6f 6e 2e 20 54 68 65 6e 20 77 65 20 63 61  tion. Then we ca
0cc0: 6e 20 73 61 76 65 20 74 68 65 6d 2e 20 54 68 69  n save them. Thi
0cd0: 73 0a 09 23 20 69 73 20 64 6f 6e 65 20 62 6f 74  s..# is done bot
0ce0: 74 6f 6d 20 75 70 2e 20 52 65 76 69 73 69 6f 6e  tom up. Revision
0cf0: 73 2c 20 74 68 65 6e 20 73 79 6d 62 6f 6c 73 2e  s, then symbols.
0d00: 20 5f 5f 4e 4f 54 45 5f 5f 20 54 68 69 73 0a 09   __NOTE__ This..
0d10: 23 20 77 6f 72 6b 73 20 6f 6e 6c 79 20 62 65 63  # works only bec
0d20: 61 75 73 65 20 73 71 6c 69 74 65 20 69 73 20 6e  ause sqlite is n
0d30: 6f 74 20 63 68 65 63 6b 69 6e 67 20 66 6f 72 65  ot checking fore
0d40: 69 67 6e 20 6b 65 79 0a 09 23 20 72 65 66 65 72  ign key..# refer
0d50: 65 6e 63 65 73 20 64 75 72 69 6e 67 20 69 6e 73  ences during ins
0d60: 65 72 74 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73  ert. This allows
0d70: 20 74 6f 20 68 61 76 65 20 64 61 6e 67 6c 69 6e   to have danglin
0d80: 67 0a 09 23 20 72 65 66 65 72 65 6e 63 65 73 20  g..# references 
0d90: 77 68 69 63 68 20 61 72 65 20 66 69 78 65 64 20  which are fixed 
0da0: 6c 61 74 65 72 2e 20 54 68 65 20 6c 6f 6e 67 65  later. The longe
0db0: 73 74 20 64 61 6e 67 6c 69 6e 67 0a 09 23 20 72  st dangling..# r
0dc0: 65 66 65 72 65 6e 63 65 73 20 61 72 65 20 66 6f  eferences are fo
0dd0: 72 20 74 68 65 20 70 72 6f 6a 65 63 74 20 6c 65  r the project le
0de0: 76 65 6c 20 73 79 6d 62 6f 6c 73 2c 20 74 68 65  vel symbols, the
0df0: 73 65 20 77 65 20 64 6f 0a 09 23 20 6e 6f 74 20  se we do..# not 
0e00: 73 61 76 65 20 68 65 72 65 2c 20 62 75 74 20 61  save here, but a
0e10: 74 20 74 68 65 20 65 6e 64 20 6f 66 20 74 68 65  t the end of the
0e20: 20 70 61 73 73 2e 20 57 68 61 74 20 77 65 20 6e   pass. What we n
0e30: 65 65 64 20 61 72 65 0a 09 23 20 74 68 65 20 69  eed are..# the i
0e40: 64 73 2c 20 68 65 6e 63 65 20 74 68 65 20 74 77  ds, hence the tw
0e50: 6f 20 70 68 61 73 65 73 2e 0a 0a 09 73 74 72 75  o phases....stru
0e60: 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20  ct::list assign 
0e70: 5b 24 73 65 6c 66 20 41 63 74 69 76 65 5d 20 72  [$self Active] r
0e80: 65 76 69 73 69 6f 6e 73 20 73 79 6d 62 6f 6c 73  evisions symbols
0e90: 0a 09 66 6f 72 65 61 63 68 20 72 65 76 20 24 72  ..foreach rev $r
0ea0: 65 76 69 73 69 6f 6e 73 20 7b 20 24 72 65 76 20  evisions { $rev 
0eb0: 64 65 66 69 64 20 7d 0a 09 66 6f 72 65 61 63 68  defid }..foreach
0ec0: 20 73 79 6d 20 24 73 79 6d 62 6f 6c 73 20 20 20   sym $symbols   
0ed0: 7b 20 24 73 79 6d 20 64 65 66 69 64 20 7d 0a 0a  { $sym defid }..
0ee0: 09 73 74 61 74 65 20 74 72 61 6e 73 61 63 74 69  .state transacti
0ef0: 6f 6e 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 63  on {..    foreac
0f00: 68 20 72 65 76 20 24 72 65 76 69 73 69 6f 6e 73  h rev $revisions
0f10: 20 7b 20 24 72 65 76 20 70 65 72 73 69 73 74 20   { $rev persist 
0f20: 7d 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 73  }..    foreach s
0f30: 79 6d 20 24 73 79 6d 62 6f 6c 73 20 20 20 7b 20  ym $symbols   { 
0f40: 24 73 79 6d 20 70 65 72 73 69 73 74 20 7d 0a 09  $sym persist }..
0f50: 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  }..return.    }.
0f60: 0a 20 20 20 20 6d 65 74 68 6f 64 20 64 72 6f 70  .    method drop
0f70: 20 7b 7d 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b   {} {..foreach {
0f80: 5f 20 72 65 76 7d 20 20 20 20 5b 61 72 72 61 79  _ rev}    [array
0f90: 20 67 65 74 20 6d 79 72 65 76 5d 20 20 20 20 20   get myrev]     
0fa0: 20 7b 20 24 72 65 76 20 64 65 73 74 72 6f 79 20   { $rev destroy 
0fb0: 7d 0a 09 66 6f 72 65 61 63 68 20 7b 5f 20 62 72  }..foreach {_ br
0fc0: 61 6e 63 68 7d 20 5b 61 72 72 61 79 20 67 65 74  anch} [array get
0fd0: 20 6d 79 62 72 61 6e 63 68 65 73 5d 20 7b 20 24   mybranches] { $
0fe0: 62 72 61 6e 63 68 20 64 65 73 74 72 6f 79 20 7d  branch destroy }
0ff0: 0a 09 66 6f 72 65 61 63 68 20 7b 5f 20 74 61 67  ..foreach {_ tag
1000: 6c 69 73 74 7d 20 5b 61 72 72 61 79 20 67 65 74  list} [array get
1010: 20 6d 79 74 61 67 73 5d 20 7b 0a 09 20 20 20 20   mytags] {..    
1020: 66 6f 72 65 61 63 68 20 74 61 67 20 24 74 61 67  foreach tag $tag
1030: 6c 69 73 74 20 7b 20 24 74 61 67 20 64 65 73 74  list { $tag dest
1040: 72 6f 79 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e  roy }..}..return
1050: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 23 20  .    }..    # # 
1060: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
1070: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
1080: 23 23 23 0a 20 20 20 20 23 23 20 49 6d 70 6c 65  ###.    ## Imple
1090: 6d 65 6e 74 20 74 68 65 20 73 69 6e 6b 0a 0a 20  ment the sink.. 
10a0: 20 20 20 6d 65 74 68 6f 64 20 62 65 67 69 6e 20     method begin 
10b0: 7b 7d 20 7b 23 69 67 6e 6f 72 65 7d 0a 0a 20 20  {} {#ignore}..  
10c0: 20 20 6d 65 74 68 6f 64 20 73 65 74 68 65 61 64    method sethead
10d0: 20 7b 72 65 76 6e 72 7d 20 7b 0a 09 73 65 74 20   {revnr} {..set 
10e0: 6d 79 68 65 61 64 72 65 76 6e 72 20 24 72 65 76  myheadrevnr $rev
10f0: 6e 72 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d  nr..return.    }
1100: 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 73 65 74  ..    method set
1110: 70 72 69 6e 63 69 70 61 6c 62 72 61 6e 63 68 20  principalbranch 
1120: 7b 62 72 61 6e 63 68 6e 72 7d 20 7b 0a 09 73 65  {branchnr} {..se
1130: 74 20 6d 79 70 72 69 6e 63 69 70 61 6c 20 24 62  t myprincipal $b
1140: 72 61 6e 63 68 6e 72 0a 09 72 65 74 75 72 6e 0a  ranchnr..return.
1150: 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f      }..    metho
1160: 64 20 64 65 66 74 61 67 20 7b 6e 61 6d 65 20 72  d deftag {name r
1170: 65 76 6e 72 7d 20 7b 0a 09 23 20 46 55 54 55 52  evnr} {..# FUTUR
1180: 45 3a 20 50 65 72 66 6f 72 6d 20 73 79 6d 62 6f  E: Perform symbo
1190: 6c 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e  l transformation
11a0: 20 68 65 72 65 2e 0a 0a 09 69 66 20 7b 5b 73 74   here....if {[st
11b0: 72 75 63 74 3a 3a 73 65 74 20 63 6f 6e 74 61 69  ruct::set contai
11c0: 6e 73 20 24 6d 79 73 79 6d 62 6f 6c 73 20 24 6e  ns $mysymbols $n
11d0: 61 6d 65 5d 7d 20 7b 0a 09 20 20 20 20 74 72 6f  ame]} {..    tro
11e0: 75 62 6c 65 20 66 61 74 61 6c 20 22 4d 75 6c 74  uble fatal "Mult
11f0: 69 70 6c 65 20 64 65 66 69 6e 69 74 69 6f 6e 73  iple definitions
1200: 20 6f 66 20 74 68 65 20 73 79 6d 62 6f 6c 20 27   of the symbol '
1210: 24 6e 61 6d 65 27 20 69 6e 20 27 24 6d 79 70 61  $name' in '$mypa
1220: 74 68 27 22 0a 09 20 20 20 20 72 65 74 75 72 6e  th'"..    return
1230: 0a 09 7d 0a 0a 09 73 74 72 75 63 74 3a 3a 73 65  ..}...struct::se
1240: 74 20 61 64 64 20 6d 79 73 79 6d 62 6f 6c 73 20  t add mysymbols 
1250: 24 6e 61 6d 65 0a 0a 09 69 66 20 7b 5b 72 65 76  $name...if {[rev
1260: 20 69 73 62 72 61 6e 63 68 72 65 76 6e 72 20 24   isbranchrevnr $
1270: 72 65 76 6e 72 20 2d 3e 20 62 72 61 6e 63 68 6e  revnr -> branchn
1280: 72 5d 7d 20 7b 0a 09 20 20 20 20 24 73 65 6c 66  r]} {..    $self
1290: 20 41 64 64 42 72 61 6e 63 68 20 24 6e 61 6d 65   AddBranch $name
12a0: 20 24 62 72 61 6e 63 68 6e 72 0a 09 7d 20 65 6c   $branchnr..} el
12b0: 73 65 20 7b 0a 09 20 20 20 20 24 73 65 6c 66 20  se {..    $self 
12c0: 41 64 64 54 61 67 20 24 6e 61 6d 65 20 24 72 65  AddTag $name $re
12d0: 76 6e 72 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20  vnr..}..return. 
12e0: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64     }..    method
12f0: 20 73 65 74 63 6f 6d 6d 65 6e 74 20 7b 63 7d 20   setcomment {c} 
1300: 7b 23 20 69 67 6e 6f 72 65 7d 0a 0a 20 20 20 20  {# ignore}..    
1310: 6d 65 74 68 6f 64 20 61 64 6d 69 6e 64 6f 6e 65  method admindone
1320: 20 7b 7d 20 7b 0a 09 23 20 57 65 20 64 6f 20 6e   {} {..# We do n
1330: 6f 74 68 69 6e 67 20 61 74 20 74 68 65 20 62 6f  othing at the bo
1340: 75 6e 64 61 72 79 20 6f 66 20 61 64 6d 69 6e 20  undary of admin 
1350: 61 6e 64 20 72 65 76 69 73 69 6f 6e 20 64 61 74  and revision dat
1360: 61 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74  a.    }..    met
1370: 68 6f 64 20 64 65 66 20 7b 72 65 76 6e 72 20 64  hod def {revnr d
1380: 61 74 65 20 61 75 74 68 6f 72 20 73 74 61 74 65  ate author state
1390: 20 6e 65 78 74 20 62 72 61 6e 63 68 65 73 7d 20   next branches} 
13a0: 7b 0a 09 24 73 65 6c 66 20 52 65 63 6f 72 64 42  {..$self RecordB
13b0: 72 61 6e 63 68 43 6f 6d 6d 69 74 73 20 24 62 72  ranchCommits $br
13c0: 61 6e 63 68 65 73 0a 0a 09 69 66 20 7b 5b 69 6e  anches...if {[in
13d0: 66 6f 20 65 78 69 73 74 73 20 6d 79 72 65 76 28  fo exists myrev(
13e0: 24 72 65 76 6e 72 29 5d 7d 20 7b 0a 09 20 20 20  $revnr)]} {..   
13f0: 20 74 72 6f 75 62 6c 65 20 66 61 74 61 6c 20 22   trouble fatal "
1400: 46 69 6c 65 20 24 6d 79 70 61 74 68 20 63 6f 6e  File $mypath con
1410: 74 61 69 6e 73 20 64 75 70 6c 69 63 61 74 65 20  tains duplicate 
1420: 64 65 66 69 6e 69 74 69 6f 6e 73 20 66 6f 72 20  definitions for 
1430: 72 65 76 69 73 69 6f 6e 20 24 72 65 76 6e 72 2e  revision $revnr.
1440: 22 0a 09 20 20 20 20 72 65 74 75 72 6e 0a 09 7d  "..    return..}
1450: 0a 0a 09 73 65 74 20 6d 79 61 69 64 28 24 72 65  ...set myaid($re
1460: 76 6e 72 29 20 5b 24 6d 79 70 72 6f 6a 65 63 74  vnr) [$myproject
1470: 20 64 65 66 61 75 74 68 6f 72 20 24 61 75 74 68   defauthor $auth
1480: 6f 72 5d 0a 09 73 65 74 20 6d 79 72 65 76 28 24  or]..set myrev($
1490: 72 65 76 6e 72 29 20 5b 72 65 76 20 25 41 55 54  revnr) [rev %AUT
14a0: 4f 25 20 24 72 65 76 6e 72 20 24 64 61 74 65 20  O% $revnr $date 
14b0: 24 73 74 61 74 65 20 24 73 65 6c 66 5d 0a 0a 09  $state $self]...
14c0: 24 73 65 6c 66 20 52 65 63 6f 72 64 42 61 73 69  $self RecordBasi
14d0: 63 44 65 70 65 6e 64 65 6e 63 69 65 73 20 24 72  cDependencies $r
14e0: 65 76 6e 72 20 24 6e 65 78 74 0a 09 72 65 74 75  evnr $next..retu
14f0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65  rn.    }..    me
1500: 74 68 6f 64 20 64 65 66 64 6f 6e 65 20 7b 7d 20  thod defdone {} 
1510: 7b 0a 09 23 20 54 68 69 73 20 69 73 20 61 6c 6c  {..# This is all
1520: 20 64 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20   done after the 
1530: 72 65 76 69 73 69 6f 6e 20 74 72 65 65 20 68 61  revision tree ha
1540: 73 20 62 65 65 6e 20 65 78 74 72 61 63 74 65 64  s been extracted
1550: 0a 09 23 20 66 72 6f 6d 20 74 68 65 20 66 69 6c  ..# from the fil
1560: 65 2c 20 62 65 66 6f 72 65 20 74 68 65 20 63 6f  e, before the co
1570: 6d 6d 69 74 20 6d 65 73 61 67 65 73 20 61 6e 64  mmit mesages and
1580: 20 64 65 6c 74 61 20 74 65 78 74 73 20 61 72 65   delta texts are
1590: 0a 09 23 20 70 72 6f 63 65 73 73 65 64 2e 0a 0a  ..# processed...
15a0: 09 24 73 65 6c 66 20 50 72 6f 63 65 73 73 50 72  .$self ProcessPr
15b0: 69 6d 61 72 79 44 65 70 65 6e 64 65 6e 63 69 65  imaryDependencie
15c0: 73 0a 09 24 73 65 6c 66 20 50 72 6f 63 65 73 73  s..$self Process
15d0: 42 72 61 6e 63 68 44 65 70 65 6e 64 65 6e 63 69  BranchDependenci
15e0: 65 73 0a 09 24 73 65 6c 66 20 53 6f 72 74 42 72  es..$self SortBr
15f0: 61 6e 63 68 65 73 0a 09 24 73 65 6c 66 20 50 72  anches..$self Pr
1600: 6f 63 65 73 73 54 61 67 44 65 70 65 6e 64 65 6e  ocessTagDependen
1610: 63 69 65 73 0a 09 24 73 65 6c 66 20 44 65 74 65  cies..$self Dete
1620: 72 6d 69 6e 65 54 68 65 52 6f 6f 74 52 65 76 69  rmineTheRootRevi
1630: 73 69 6f 6e 0a 09 72 65 74 75 72 6e 0a 20 20 20  sion..return.   
1640: 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 73   }..    method s
1650: 65 74 64 65 73 63 20 7b 64 7d 20 7b 23 20 69 67  etdesc {d} {# ig
1660: 6e 6f 72 65 7d 0a 0a 20 20 20 20 6d 65 74 68 6f  nore}..    metho
1670: 64 20 65 78 74 65 6e 64 20 7b 72 65 76 6e 72 20  d extend {revnr 
1680: 63 6f 6d 6d 69 74 6d 73 67 20 74 65 78 74 72 61  commitmsg textra
1690: 6e 67 65 7d 20 7b 0a 09 73 65 74 20 63 6d 69 64  nge} {..set cmid
16a0: 20 5b 24 6d 79 70 72 6f 6a 65 63 74 20 64 65 66   [$myproject def
16b0: 63 6d 65 73 73 61 67 65 20 5b 73 74 72 69 6e 67  cmessage [string
16c0: 20 74 72 69 6d 20 24 63 6f 6d 6d 69 74 6d 73 67   trim $commitmsg
16d0: 5d 5d 0a 0a 09 73 65 74 20 72 65 76 20 24 6d 79  ]]...set rev $my
16e0: 72 65 76 28 24 72 65 76 6e 72 29 0a 0a 09 69 66  rev($revnr)...if
16f0: 20 7b 5b 24 72 65 76 20 68 61 73 6d 65 74 61 5d   {[$rev hasmeta]
1700: 7d 20 7b 0a 09 20 20 20 20 23 20 41 70 70 61 72  } {..    # Appar
1710: 65 6e 74 6c 79 20 72 65 70 6f 73 69 74 6f 72 69  ently repositori
1720: 65 73 20 65 78 69 73 74 20 69 6e 20 77 68 69 63  es exist in whic
1730: 68 20 74 68 65 20 64 65 6c 74 61 20 64 61 74 61  h the delta data
1740: 0a 09 20 20 20 20 23 20 66 6f 72 20 72 65 76 69  ..    # for revi
1750: 73 69 6f 6e 20 31 2e 31 20 69 73 20 70 72 6f 76  sion 1.1 is prov
1760: 69 64 65 64 20 73 65 76 65 72 61 6c 20 74 69 6d  ided several tim
1770: 65 73 2c 20 61 74 20 6c 65 61 73 74 0a 09 20 20  es, at least..  
1780: 20 20 23 20 74 77 69 63 65 2e 20 54 68 65 20 61    # twice. The a
1790: 63 74 75 61 6c 20 63 61 75 73 65 20 6f 66 20 74  ctual cause of t
17a0: 68 69 73 20 64 75 70 6c 69 63 61 74 69 6f 6e 20  his duplication 
17b0: 69 73 20 6e 6f 74 0a 09 20 20 20 20 23 20 6b 6e  is not..    # kn
17c0: 6f 77 6e 2e 20 53 70 65 63 75 6c 61 74 69 6f 6e  own. Speculation
17d0: 20 63 65 6e 74 65 72 73 20 6f 6e 20 52 43 53 2f   centers on RCS/
17e0: 43 56 53 20 62 75 67 73 2c 20 6f 72 20 66 72 6f  CVS bugs, or fro
17f0: 6d 0a 09 20 20 20 20 23 20 6d 61 6e 75 61 6c 20  m..    # manual 
1800: 65 64 69 74 73 20 6f 66 20 74 68 65 20 72 65 70  edits of the rep
1810: 6f 73 69 74 6f 72 79 20 77 68 69 63 68 20 62 6f  ository which bo
1820: 72 6b 65 64 20 74 68 65 0a 09 20 20 20 20 23 20  rked the..    # 
1830: 69 6e 74 65 72 6e 61 6c 73 2e 20 57 68 61 74 65  internals. Whate
1840: 76 65 72 20 74 68 65 20 63 61 75 73 65 2c 20 74  ver the cause, t
1850: 65 73 74 69 6e 67 20 73 68 6f 77 65 64 20 74 68  esting showed th
1860: 61 74 20 62 6f 74 68 0a 09 20 20 20 20 23 20 63  at both..    # c
1870: 76 73 20 61 6e 64 20 72 63 73 20 75 73 65 20 74  vs and rcs use t
1880: 68 65 20 66 69 72 73 74 20 64 65 66 69 6e 69 74  he first definit
1890: 69 6f 6e 20 77 68 65 6e 20 70 65 72 66 6f 72 6d  ion when perform
18a0: 69 6e 67 20 61 0a 09 20 20 20 20 23 20 63 68 65  ing a..    # che
18b0: 63 6b 6f 75 74 2c 20 61 6e 64 20 77 65 20 66 6f  ckout, and we fo
18c0: 6c 6c 6f 77 20 74 68 65 69 72 20 6c 65 61 64 2e  llow their lead.
18d0: 20 53 69 64 65 20 6e 6f 74 65 73 3a 20 27 63 76   Side notes: 'cv
18e0: 73 0a 09 20 20 20 20 23 20 6c 6f 67 27 20 66 61  s..    # log' fa
18f0: 69 6c 73 20 6f 6e 20 73 75 63 68 20 61 20 66 69  ils on such a fi
1900: 6c 65 2c 20 61 6e 64 20 27 63 76 73 20 72 6c 6f  le, and 'cvs rlo
1910: 67 27 20 70 72 69 6e 74 73 20 74 68 65 20 6c 6f  g' prints the lo
1920: 67 0a 09 20 20 20 20 23 20 6d 65 73 73 61 67 65  g..    # message
1930: 20 66 72 6f 6d 20 74 68 65 20 66 69 72 73 74 20   from the first 
1940: 64 65 6c 74 61 2c 20 69 67 6e 6f 72 69 6e 67 20  delta, ignoring 
1950: 74 68 65 20 73 65 63 6f 6e 64 2e 0a 0a 09 20 20  the second....  
1960: 20 20 6c 6f 67 20 77 72 69 74 65 20 31 20 66 69    log write 1 fi
1970: 6c 65 20 22 49 6e 20 66 69 6c 65 20 24 6d 79 70  le "In file $myp
1980: 61 74 68 20 3a 20 44 75 70 6c 69 63 61 74 65 20  ath : Duplicate 
1990: 64 65 6c 74 61 20 64 61 74 61 20 66 6f 72 20 72  delta data for r
19a0: 65 76 69 73 69 6f 6e 20 24 72 65 76 6e 72 22 0a  evision $revnr".
19b0: 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 31  .    log write 1
19c0: 20 66 69 6c 65 20 22 49 67 6e 6f 72 69 6e 67 20   file "Ignoring 
19d0: 74 68 65 20 64 75 70 6c 69 63 61 74 65 22 0a 09  the duplicate"..
19e0: 20 20 20 20 72 65 74 75 72 6e 0a 09 7d 0a 0a 09      return..}...
19f0: 23 20 44 65 74 65 72 6d 69 6e 65 20 74 68 65 20  # Determine the 
1a00: 6c 69 6e 65 20 6f 66 20 64 65 76 65 6c 6f 70 6d  line of developm
1a10: 65 6e 74 20 66 6f 72 20 74 68 65 20 72 65 76 69  ent for the revi
1a20: 73 69 6f 6e 20 28 70 72 6f 6a 65 63 74 0a 09 23  sion (project..#
1a30: 20 6c 65 76 65 6c 29 2e 20 54 68 69 73 20 67 69   level). This gi
1a40: 76 65 73 20 75 73 20 74 68 65 20 62 72 61 6e 63  ves us the branc
1a50: 68 69 64 20 74 6f 6f 2c 20 72 65 71 75 69 72 65  hid too, require
1a60: 64 20 66 6f 72 20 74 68 65 0a 09 23 20 6d 65 74  d for the..# met
1a70: 61 20 64 61 74 61 20 67 72 6f 75 70 20 74 68 65  a data group the
1a80: 20 72 65 76 69 73 69 6f 6e 20 69 73 20 69 6e 2e   revision is in.
1a90: 20 28 4e 6f 74 65 3a 20 42 79 20 70 75 74 74 69   (Note: By putti
1aa0: 6e 67 20 62 6f 74 68 0a 09 23 20 62 72 61 6e 63  ng both..# branc
1ab0: 68 2f 6c 6f 64 20 61 6e 64 20 70 72 6f 6a 65 63  h/lod and projec
1ac0: 74 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 6e  t information in
1ad0: 74 6f 20 74 68 65 20 67 72 6f 75 70 20 77 65 20  to the group we 
1ae0: 65 6e 73 75 72 65 0a 09 23 20 74 68 61 74 20 61  ensure..# that a
1af0: 6e 79 20 63 72 6f 73 73 2d 70 72 6f 6a 65 63 74  ny cross-project
1b00: 20 61 6e 64 20 63 72 6f 73 73 2d 62 72 61 6e 63   and cross-branc
1b10: 68 20 63 6f 6d 6d 69 74 73 20 61 72 65 0a 09 23  h commits are..#
1b20: 20 73 65 70 61 72 61 74 65 64 20 69 6e 74 6f 20   separated into 
1b30: 6d 75 6c 74 69 70 6c 65 20 63 6f 6d 6d 69 74 73  multiple commits
1b40: 2c 20 6f 6e 65 20 69 6e 20 65 61 63 68 20 6f 66  , one in each of
1b50: 20 74 68 65 20 70 72 6f 6a 65 63 74 73 0a 09 23   the projects..#
1b60: 20 61 6e 64 2f 6f 72 20 62 72 61 6e 63 68 65 73   and/or branches
1b70: 29 2e 0a 0a 09 73 65 74 20 6c 6f 64 20 5b 24 73  )....set lod [$s
1b80: 65 6c 66 20 47 65 74 4c 4f 44 20 24 72 65 76 6e  elf GetLOD $revn
1b90: 72 5d 0a 0a 09 24 72 65 76 20 73 65 74 6d 65 74  r]...$rev setmet
1ba0: 61 20 5b 24 6d 79 70 72 6f 6a 65 63 74 20 64 65  a [$myproject de
1bb0: 66 6d 65 74 61 20 5b 24 6c 6f 64 20 69 64 5d 20  fmeta [$lod id] 
1bc0: 24 6d 79 61 69 64 28 24 72 65 76 6e 72 29 20 24  $myaid($revnr) $
1bd0: 63 6d 69 64 5d 0a 09 24 72 65 76 20 73 65 74 74  cmid]..$rev sett
1be0: 65 78 74 20 24 74 65 78 74 72 61 6e 67 65 0a 09  ext $textrange..
1bf0: 24 72 65 76 20 73 65 74 6c 6f 64 20 20 24 6c 6f  $rev setlod  $lo
1c00: 64 0a 0a 09 23 20 49 66 20 74 68 69 73 20 69 73  d...# If this is
1c10: 20 72 65 76 69 73 69 6f 6e 20 31 2e 31 2c 20 77   revision 1.1, w
1c20: 65 20 68 61 76 65 20 74 6f 20 64 65 74 65 72 6d  e have to determ
1c30: 69 6e 65 20 77 68 65 74 68 65 72 20 74 68 65 0a  ine whether the.
1c40: 09 23 20 66 69 6c 65 20 73 65 65 6d 73 20 74 6f  .# file seems to
1c50: 20 68 61 76 65 20 62 65 65 6e 20 63 72 65 61 74   have been creat
1c60: 65 64 20 74 68 72 6f 75 67 68 20 27 63 76 73 20  ed through 'cvs 
1c70: 61 64 64 27 20 69 6e 73 74 65 61 64 20 6f 66 0a  add' instead of.
1c80: 09 23 20 27 63 76 73 20 69 6d 70 6f 72 74 27 2e  .# 'cvs import'.
1c90: 20 54 68 69 73 20 63 61 6e 20 62 65 20 64 6f 6e   This can be don
1ca0: 65 20 62 79 20 6c 6f 6f 6b 69 6e 67 20 61 74 20  e by looking at 
1cb0: 74 68 65 20 75 6e 2d 0a 09 23 20 61 64 75 6c 74  the un-..# adult
1cc0: 65 72 61 74 65 64 20 63 6f 6d 6d 69 74 20 6d 65  erated commit me
1cd0: 73 73 61 67 65 2c 20 61 73 20 43 56 53 20 75 73  ssage, as CVS us
1ce0: 65 73 20 61 20 68 61 72 64 77 69 72 65 64 20 6d  es a hardwired m
1cf0: 61 67 69 63 0a 09 23 20 6d 65 73 73 61 67 65 20  agic..# message 
1d00: 66 6f 72 20 74 68 65 20 6c 61 74 74 65 72 2c 20  for the latter, 
1d10: 69 2e 65 2e 20 22 49 6e 69 74 69 61 6c 20 72 65  i.e. "Initial re
1d20: 76 69 73 69 6f 6e 5c 6e 22 2c 20 6e 6f 0a 09 23  vision\n", no..#
1d30: 20 70 65 72 69 6f 64 2e 20 20 28 54 68 69 73 20   period.  (This 
1d40: 66 61 63 74 20 61 6c 73 6f 20 68 65 6c 70 73 20  fact also helps 
1d50: 75 73 20 77 68 65 6e 20 74 68 65 20 74 69 6d 65  us when the time
1d60: 20 63 6f 6d 65 73 20 74 6f 0a 09 23 20 64 65 74   comes to..# det
1d70: 65 72 6d 69 6e 65 20 77 68 65 74 68 65 72 20 74  ermine whether t
1d80: 68 69 73 20 66 69 6c 65 20 6d 69 67 68 74 20 68  his file might h
1d90: 61 76 65 20 68 61 64 20 61 20 64 65 66 61 75 6c  ave had a defaul
1da0: 74 20 62 72 61 6e 63 68 0a 09 23 20 69 6e 20 74  t branch..# in t
1db0: 68 65 20 70 61 73 74 2e 29 0a 0a 09 69 66 20 7b  he past.)...if {
1dc0: 24 72 65 76 6e 72 20 65 71 20 22 31 2e 31 22 7d  $revnr eq "1.1"}
1dd0: 20 7b 0a 09 20 20 20 20 73 65 74 20 6d 79 69 6d   {..    set myim
1de0: 70 6f 72 74 65 64 20 5b 65 78 70 72 20 7b 24 63  ported [expr {$c
1df0: 6f 6d 6d 69 74 6d 73 67 20 65 71 20 22 49 6e 69  ommitmsg eq "Ini
1e00: 74 69 61 6c 20 72 65 76 69 73 69 6f 6e 5c 6e 22  tial revision\n"
1e10: 7d 5d 0a 09 7d 0a 0a 09 23 20 48 65 72 65 20 77  }]..}...# Here w
1e20: 65 20 61 6c 73 6f 20 6b 65 65 70 20 74 72 61 63  e also keep trac
1e30: 6b 20 6f 66 20 74 68 65 20 6f 72 64 65 72 20 69  k of the order i
1e40: 6e 20 77 68 69 63 68 20 74 68 65 20 72 65 76 69  n which the revi
1e50: 73 69 6f 6e 73 0a 09 23 20 77 65 72 65 20 61 64  sions..# were ad
1e60: 64 65 64 20 74 6f 20 74 68 65 20 66 69 6c 65 2e  ded to the file.
1e70: 0a 0a 09 6c 61 70 70 65 6e 64 20 6d 79 72 65 76  ...lappend myrev
1e80: 69 73 69 6f 6e 73 20 24 72 65 76 0a 09 72 65 74  isions $rev..ret
1e90: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d  urn.    }..    m
1ea0: 65 74 68 6f 64 20 64 6f 6e 65 20 7b 7d 20 7b 0a  ethod done {} {.
1eb0: 09 23 20 43 6f 6d 70 6c 65 74 65 20 74 68 65 20  .# Complete the 
1ec0: 72 65 76 69 73 69 6f 6e 73 2c 20 62 72 61 6e 63  revisions, branc
1ed0: 68 65 73 2c 20 61 6e 64 20 74 61 67 73 2e 20 54  hes, and tags. T
1ee0: 68 69 73 20 69 6e 63 6c 75 64 65 73 0a 09 23 20  his includes..# 
1ef0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 20 6e 6f  looking for a no
1f00: 6e 2d 74 72 75 6e 6b 20 64 65 66 61 75 6c 74 20  n-trunk default 
1f10: 62 72 61 6e 63 68 2c 20 6d 61 72 6b 69 6e 67 20  branch, marking 
1f20: 69 74 73 20 6d 65 6d 62 65 72 73 0a 09 23 20 61  its members..# a
1f30: 6e 64 20 6c 69 6e 6b 69 6e 67 20 74 68 65 6d 20  nd linking them 
1f40: 69 6e 74 6f 20 74 68 65 20 74 72 75 6e 6b 2c 20  into the trunk, 
1f50: 70 6f 73 73 69 62 6c 79 20 65 78 63 6c 75 64 69  possibly excludi
1f60: 6e 67 0a 09 23 20 6e 6f 6e 2d 74 72 75 6e 6b 20  ng..# non-trunk 
1f70: 64 61 74 61 2c 20 61 6e 64 20 63 6f 6c 6c 65 63  data, and collec
1f80: 74 69 6e 67 20 61 67 67 72 65 67 61 74 65 20 73  ting aggregate s
1f90: 79 6d 62 6f 6c 20 73 74 61 74 69 73 74 69 63 73  ymbol statistics
1fa0: 2e 0a 0a 09 24 73 65 6c 66 20 44 65 74 65 72 6d  ....$self Determ
1fb0: 69 6e 65 52 65 76 69 73 69 6f 6e 4f 70 65 72 61  ineRevisionOpera
1fc0: 74 69 6f 6e 73 0a 09 24 73 65 6c 66 20 44 65 74  tions..$self Det
1fd0: 65 72 6d 69 6e 65 4c 69 6e 65 73 4f 66 44 65 76  ermineLinesOfDev
1fe0: 65 6c 6f 70 6d 65 6e 74 0a 09 24 73 65 6c 66 20  elopment..$self 
1ff0: 48 61 6e 64 6c 65 4e 6f 6e 54 72 75 6e 6b 44 65  HandleNonTrunkDe
2000: 66 61 75 6c 74 42 72 61 6e 63 68 0a 09 24 73 65  faultBranch..$se
2010: 6c 66 20 52 65 6d 6f 76 65 49 72 72 65 6c 65 76  lf RemoveIrrelev
2020: 61 6e 74 44 65 6c 65 74 69 6f 6e 73 0a 09 24 73  antDeletions..$s
2030: 65 6c 66 20 52 65 6d 6f 76 65 49 6e 69 74 69 61  elf RemoveInitia
2040: 6c 42 72 61 6e 63 68 44 65 6c 65 74 69 6f 6e 73  lBranchDeletions
2050: 0a 0a 09 69 66 20 7b 5b 24 6d 79 70 72 6f 6a 65  ...if {[$myproje
2060: 63 74 20 74 72 75 6e 6b 6f 6e 6c 79 5d 7d 20 7b  ct trunkonly]} {
2070: 0a 09 20 20 20 20 24 73 65 6c 66 20 45 78 63 6c  ..    $self Excl
2080: 75 64 65 4e 6f 6e 54 72 75 6e 6b 49 6e 66 6f 72  udeNonTrunkInfor
2090: 6d 61 74 69 6f 6e 0a 09 7d 0a 0a 09 24 73 65 6c  mation..}...$sel
20a0: 66 20 41 67 67 72 65 67 61 74 65 53 79 6d 62 6f  f AggregateSymbo
20b0: 6c 44 61 74 61 0a 09 72 65 74 75 72 6e 0a 20 20  lData..return.  
20c0: 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20    }..    # # ## 
20d0: 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23  ### ##### ######
20e0: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
20f0: 0a 20 20 20 20 23 23 20 50 61 73 73 20 58 49 49  .    ## Pass XII
2100: 20 28 49 6d 70 6f 72 74 29 2e 0a 0a 20 20 20 20   (Import)...    
2110: 6d 65 74 68 6f 64 20 70 75 73 68 74 6f 20 7b 72  method pushto {r
2120: 65 70 6f 73 69 74 6f 72 79 7d 20 7b 0a 09 73 65  epository} {..se
2130: 74 20 77 73 20 5b 24 72 65 70 6f 73 69 74 6f 72  t ws [$repositor
2140: 79 20 77 6f 72 6b 73 70 61 63 65 5d 0a 09 73 74  y workspace]..st
2150: 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67  ruct::list assig
2160: 6e 20 5b 24 73 65 6c 66 20 45 78 70 61 6e 64 20  n [$self Expand 
2170: 24 77 73 5d 20 66 69 6c 65 6d 61 70 20 72 65 76  $ws] filemap rev
2180: 6d 61 70 0a 09 23 20 66 69 6c 65 6d 61 70 20 3d  map..# filemap =
2190: 20 64 69 63 74 20 28 70 61 74 68 20 2d 3e 20 75   dict (path -> u
21a0: 75 69 64 29 0a 09 23 20 72 65 76 6d 61 70 20 20  uid)..# revmap  
21b0: 3d 20 64 69 63 74 20 28 70 61 74 68 20 2d 3e 20  = dict (path -> 
21c0: 72 69 64 29 0a 0a 09 61 72 72 61 79 20 73 65 74  rid)...array set
21d0: 20 69 64 6d 61 70 20 5b 24 72 65 70 6f 73 69 74   idmap [$reposit
21e0: 6f 72 79 20 69 6d 70 6f 72 74 66 69 6c 65 73 20  ory importfiles 
21f0: 24 66 69 6c 65 6d 61 70 5d 0a 0a 09 23 20 57 69  $filemap]...# Wi
2200: 70 65 20 77 6f 72 6b 73 70 61 63 65 20 63 6c 65  pe workspace cle
2210: 61 6e 20 6f 66 20 74 68 65 20 69 6d 70 6f 72 74  an of the import
2220: 65 64 20 66 69 6c 65 73 2e 0a 09 66 6f 72 65 61  ed files...forea
2230: 63 68 20 78 20 5b 67 6c 6f 62 20 2d 64 69 72 65  ch x [glob -dire
2240: 63 74 6f 72 79 20 24 77 73 20 72 2a 5d 20 7b 20  ctory $ws r*] { 
2250: 66 69 6c 65 20 64 65 6c 65 74 65 20 24 78 20 7d  file delete $x }
2260: 0a 0a 09 66 6f 72 65 61 63 68 20 7b 70 61 74 68  ...foreach {path
2270: 20 72 69 64 7d 20 24 72 65 76 6d 61 70 20 7b 0a   rid} $revmap {.
2280: 09 20 20 20 20 73 65 74 20 75 75 69 64 20 24 69  .    set uuid $i
2290: 64 6d 61 70 28 24 70 61 74 68 29 0a 09 20 20 20  dmap($path)..   
22a0: 20 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 49   state run {...I
22b0: 4e 53 45 52 54 20 49 4e 54 4f 20 72 65 76 75 75  NSERT INTO revuu
22c0: 69 64 20 28 72 69 64 2c 20 20 75 75 69 64 29 0a  id (rid,  uuid).
22d0: 09 09 56 41 4c 55 45 53 20 20 20 20 20 20 20 20  ..VALUES        
22e0: 20 20 20 20 20 20 28 24 72 69 64 2c 20 24 75 75        ($rid, $uu
22f0: 69 64 29 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72  id)..    }..}..r
2300: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
2310: 20 6d 65 74 68 6f 64 20 45 78 70 61 6e 64 20 7b   method Expand {
2320: 64 69 72 7d 20 7b 0a 09 73 65 74 20 65 78 20 5b  dir} {..set ex [
2330: 73 74 72 75 63 74 3a 3a 67 72 61 70 68 20 65 78  struct::graph ex
2340: 5d 20 3b 20 23 20 45 78 70 61 6e 73 69 6f 6e 20  ] ; # Expansion 
2350: 67 72 61 70 68 2e 0a 09 73 65 74 20 7a 70 20 5b  graph...set zp [
2360: 73 74 72 75 63 74 3a 3a 67 72 61 70 68 20 7a 70  struct::graph zp
2370: 5d 20 3b 20 23 20 5a 69 70 2f 49 6d 70 6f 72 74  ] ; # Zip/Import
2380: 20 67 72 61 70 68 2e 0a 0a 09 63 6c 6f 73 65 20   graph....close 
2390: 5b 6f 70 65 6e 20 24 64 69 72 2f 72 5f 5f 65 6d  [open $dir/r__em
23a0: 70 74 79 5f 5f 20 77 5d 3b 23 20 42 61 73 65 20  pty__ w];# Base 
23b0: 66 6f 72 20 64 65 74 61 63 68 65 64 20 72 6f 6f  for detached roo
23c0: 74 73 20 6f 6e 20 62 72 61 6e 63 68 65 73 2e 0a  ts on branches..
23d0: 0a 09 23 20 50 68 61 73 65 20 49 3a 20 50 75 6c  ..# Phase I: Pul
23e0: 6c 20 74 68 65 20 72 65 76 69 73 69 6f 6e 73 20  l the revisions 
23f0: 66 72 6f 6d 20 6d 65 6d 6f 72 79 20 61 6e 64 20  from memory and 
2400: 66 69 6c 6c 20 74 68 65 20 67 72 61 70 68 73 0a  fill the graphs.
2410: 09 23 20 20 20 20 20 20 20 20 20 20 77 69 74 68  .#          with
2420: 20 74 68 65 6d 2e 2e 2e 0a 0a 09 73 65 74 20 65   them......set e
2430: 61 72 63 73 20 20 20 7b 7d 20 3b 20 23 20 41 72  arcs   {} ; # Ar
2440: 63 73 20 66 6f 72 20 65 78 70 61 6e 73 69 6f 6e  cs for expansion
2450: 20 67 72 61 70 68 0a 09 73 65 74 20 7a 61 72 63   graph..set zarc
2460: 73 20 20 20 7b 7d 20 3b 20 23 20 41 72 63 73 20  s   {} ; # Arcs 
2470: 66 6f 72 20 7a 69 70 20 67 72 61 70 68 0a 09 73  for zip graph..s
2480: 65 74 20 72 65 76 6d 61 70 20 20 7b 7d 20 3b 20  et revmap  {} ; 
2490: 23 20 70 61 74 68 20 2d 3e 20 72 69 64 20 6d 61  # path -> rid ma
24a0: 70 20 74 6f 20 6c 61 74 65 72 20 6d 65 72 67 65  p to later merge
24b0: 20 75 75 69 64 20 69 6e 66 6f 72 6d 61 74 69 6f   uuid informatio
24c0: 6e 0a 0a 09 66 6f 72 65 61 63 68 20 7b 72 69 64  n...foreach {rid
24d0: 20 72 65 76 6e 72 20 70 61 72 65 6e 74 20 63 68   revnr parent ch
24e0: 69 6c 64 20 63 6f 66 66 20 63 6c 65 6e 7d 20 5b  ild coff clen} [
24f0: 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 20 20 20  state run {..   
2500: 20 53 45 4c 45 43 54 20 52 2e 72 69 64 2c 20 52   SELECT R.rid, R
2510: 2e 72 65 76 2c 20 52 2e 70 61 72 65 6e 74 2c 20  .rev, R.parent, 
2520: 52 2e 63 68 69 6c 64 2c 20 52 2e 63 6f 66 66 2c  R.child, R.coff,
2530: 20 52 2e 63 6c 65 6e 0a 09 20 20 20 20 46 52 4f   R.clen..    FRO
2540: 4d 20 20 20 72 65 76 69 73 69 6f 6e 20 52 0a 09  M   revision R..
2550: 20 20 20 20 57 48 45 52 45 20 20 52 2e 66 69 64      WHERE  R.fid
2560: 20 3d 20 24 6d 79 69 64 0a 09 7d 5d 20 7b 0a 09   = $myid..}] {..
2570: 20 20 20 20 6c 61 70 70 65 6e 64 20 72 65 76 6d      lappend revm
2580: 61 70 20 72 24 72 65 76 6e 72 20 24 72 69 64 0a  ap r$revnr $rid.
2590: 0a 09 20 20 20 20 24 7a 70 20 6e 6f 64 65 20 69  ..    $zp node i
25a0: 6e 73 65 72 74 20 24 72 69 64 0a 09 20 20 20 20  nsert $rid..    
25b0: 24 7a 70 20 6e 6f 64 65 20 73 65 74 20 20 20 20  $zp node set    
25c0: 24 72 69 64 20 72 65 76 6e 72 20 24 72 65 76 6e  $rid revnr $revn
25d0: 72 0a 09 20 20 20 20 24 7a 70 20 6e 6f 64 65 20  r..    $zp node 
25e0: 73 65 74 20 20 20 20 24 72 69 64 20 6c 61 62 65  set    $rid labe
25f0: 6c 20 3c 24 72 65 76 6e 72 3e 0a 0a 09 20 20 20  l <$revnr>...   
2600: 20 69 66 20 7b 24 63 68 69 6c 64 20 6e 65 20 22   if {$child ne "
2610: 22 7d 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 7a  "} {...lappend z
2620: 61 72 63 73 20 24 63 68 69 6c 64 20 24 72 69 64  arcs $child $rid
2630: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 24 65  ..    }...    $e
2640: 78 20 6e 6f 64 65 20 69 6e 73 65 72 74 20 24 72  x node insert $r
2650: 69 64 0a 09 20 20 20 20 24 65 78 20 6e 6f 64 65  id..    $ex node
2660: 20 73 65 74 20 20 20 20 24 72 69 64 20 74 65 78   set    $rid tex
2670: 74 20 20 5b 6c 69 73 74 20 24 63 6f 66 66 20 24  t  [list $coff $
2680: 63 6c 65 6e 5d 0a 09 20 20 20 20 24 65 78 20 6e  clen]..    $ex n
2690: 6f 64 65 20 73 65 74 20 20 20 20 24 72 69 64 20  ode set    $rid 
26a0: 72 65 76 6e 72 20 24 72 65 76 6e 72 0a 09 20 20  revnr $revnr..  
26b0: 20 20 24 65 78 20 6e 6f 64 65 20 73 65 74 20 20    $ex node set  
26c0: 20 20 24 72 69 64 20 6c 61 62 65 6c 20 3c 24 72    $rid label <$r
26d0: 65 76 6e 72 3e 0a 0a 09 20 20 20 20 69 66 20 7b  evnr>...    if {
26e0: 5b 72 65 76 20 69 73 74 72 75 6e 6b 72 65 76 6e  [rev istrunkrevn
26f0: 72 20 24 72 65 76 6e 72 5d 7d 20 7b 0a 09 09 23  r $revnr]} {...#
2700: 20 4f 6e 20 74 68 65 20 74 72 75 6e 6b 2c 20 74   On the trunk, t
2710: 68 69 73 20 72 65 76 69 73 69 6f 6e 20 69 73 20  his revision is 
2720: 61 20 64 65 6c 74 61 20 62 61 73 65 64 20 6f 6e  a delta based on
2730: 20 74 68 65 0a 09 09 23 20 63 68 69 6c 64 2e 20   the...# child. 
2740: 54 68 61 74 20 6d 61 6b 65 73 20 74 68 65 20 63  That makes the c
2750: 68 69 6c 64 20 6f 75 72 20 70 72 65 64 65 63 65  hild our predece
2760: 73 73 6f 72 2e 0a 0a 09 09 69 66 20 7b 24 63 68  ssor.....if {$ch
2770: 69 6c 64 20 65 71 20 22 22 7d 20 63 6f 6e 74 69  ild eq ""} conti
2780: 6e 75 65 0a 09 09 6c 61 70 70 65 6e 64 20 65 61  nue...lappend ea
2790: 72 63 73 20 24 63 68 69 6c 64 20 24 72 69 64 0a  rcs $child $rid.
27a0: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
27b0: 23 20 4f 6e 20 61 20 62 72 61 6e 63 68 20 74 68  # On a branch th
27c0: 69 73 20 72 65 76 69 73 69 6f 6e 20 69 73 20 61  is revision is a
27d0: 20 64 65 6c 74 61 20 62 61 73 65 64 20 6f 6e 20   delta based on 
27e0: 74 68 65 0a 09 09 23 20 70 61 72 65 6e 74 2e 20  the...# parent. 
27f0: 54 68 61 74 20 6d 61 6b 65 73 20 74 68 65 20 70  That makes the p
2800: 61 72 65 6e 74 20 6f 75 72 20 70 72 65 64 65 63  arent our predec
2810: 65 73 73 6f 72 2e 0a 0a 09 09 69 66 20 7b 24 70  essor.....if {$p
2820: 61 72 65 6e 74 20 65 71 20 22 22 7d 20 7b 0a 09  arent eq ""} {..
2830: 09 20 20 20 20 23 20 44 65 74 61 63 68 65 64 20  .    # Detached 
2840: 62 72 61 6e 63 68 20 72 6f 6f 74 2c 20 74 68 69  branch root, thi
2850: 73 20 69 73 20 61 20 70 61 74 63 68 20 62 61 73  s is a patch bas
2860: 65 64 20 6f 6e 0a 09 09 20 20 20 20 23 20 74 68  ed on...    # th
2870: 65 20 65 6d 70 74 79 20 73 74 72 69 6e 67 2e 0a  e empty string..
2880: 09 09 20 20 20 20 24 65 78 20 6e 6f 64 65 20 73  ..    $ex node s
2890: 65 74 20 24 72 69 64 20 5f 5f 62 61 73 65 5f 5f  et $rid __base__
28a0: 20 72 5f 5f 65 6d 70 74 79 5f 5f 20 0a 09 09 20   r__empty__ ... 
28b0: 20 20 20 63 6f 6e 74 69 6e 75 65 0a 09 09 7d 0a     continue...}.
28c0: 09 09 6c 61 70 70 65 6e 64 20 65 61 72 63 73 20  ..lappend earcs 
28d0: 24 70 61 72 65 6e 74 20 24 72 69 64 0a 09 20 20  $parent $rid..  
28e0: 20 20 7d 0a 09 7d 0a 0a 09 23 20 50 68 61 73 65    }..}...# Phase
28f0: 20 49 49 3a 20 49 6e 73 65 72 74 20 74 68 65 20   II: Insert the 
2900: 61 63 63 75 6d 75 6c 61 74 65 64 20 64 65 70 65  accumulated depe
2910: 6e 64 65 6e 63 69 65 73 0a 0a 09 66 6f 72 65 61  ndencies...forea
2920: 63 68 20 7b 66 72 6f 6d 20 74 6f 7d 20 24 65 61  ch {from to} $ea
2930: 72 63 73 20 7b 20 24 65 78 20 61 72 63 20 69 6e  rcs { $ex arc in
2940: 73 65 72 74 20 24 66 72 6f 6d 20 24 74 6f 20 7d  sert $from $to }
2950: 0a 09 66 6f 72 65 61 63 68 20 7b 66 72 6f 6d 20  ..foreach {from 
2960: 74 6f 7d 20 24 7a 61 72 63 73 20 7b 20 24 7a 70  to} $zarcs { $zp
2970: 20 61 72 63 20 69 6e 73 65 72 74 20 24 66 72 6f   arc insert $fro
2980: 6d 20 24 74 6f 20 7d 0a 0a 09 23 20 50 68 61 73  m $to }...# Phas
2990: 65 20 49 49 49 3a 20 54 72 61 76 65 72 73 65 20  e III: Traverse 
29a0: 74 68 65 20 67 72 61 70 68 73 2c 20 65 78 70 61  the graphs, expa
29b0: 6e 64 20 74 68 65 20 66 69 6c 65 2c 20 61 6e 64  nd the file, and
29c0: 0a 09 23 20 20 20 20 20 20 20 20 20 20 20 20 67  ..#            g
29d0: 65 6e 65 72 61 74 65 20 69 6d 70 6f 72 74 20 69  enerate import i
29e0: 6e 73 74 72 75 63 74 69 6f 6e 73 2e 0a 0a 09 73  nstructions....s
29f0: 65 74 20 61 72 63 68 69 76 65 20 5b 66 69 6c 65  et archive [file
2a00: 20 6a 6f 69 6e 20 5b 24 6d 79 70 72 6f 6a 65 63   join [$myprojec
2a10: 74 20 66 75 6c 6c 70 61 74 68 5d 20 24 6d 79 70  t fullpath] $myp
2a20: 61 74 68 5d 0a 09 73 65 74 20 61 63 20 20 20 20  ath]..set ac    
2a30: 20 20 5b 6f 70 65 6e 20 24 61 72 63 68 69 76 65    [open $archive
2a40: 20 72 5d 0a 09 66 63 6f 6e 66 69 67 75 72 65 20   r]..fconfigure 
2a50: 24 61 63 20 2d 74 72 61 6e 73 6c 61 74 69 6f 6e  $ac -translation
2a60: 20 62 69 6e 61 72 79 0a 0a 09 23 20 46 69 72 73   binary...# Firs
2a70: 74 20 74 72 61 76 65 72 73 65 20 74 68 65 20 65  t traverse the e
2a80: 78 70 61 6e 73 69 6f 6e 20 67 72 61 70 68 2c 20  xpansion graph, 
2a90: 74 68 69 73 20 67 69 76 65 73 20 75 73 20 74 68  this gives us th
2aa0: 65 0a 09 23 20 72 65 76 69 73 69 6f 6e 73 20 69  e..# revisions i
2ab0: 6e 20 74 68 65 20 6f 72 64 65 72 20 77 65 20 68  n the order we h
2ac0: 61 76 65 20 74 6f 20 65 78 70 61 6e 64 20 74 68  ave to expand th
2ad0: 65 6d 2c 20 77 68 69 63 68 20 77 65 20 64 6f 2e  em, which we do.
2ae0: 0a 0a 09 67 74 63 6f 72 65 20 64 61 74 61 63 6d  ...gtcore datacm
2af0: 64 20 20 20 5b 6d 79 6d 65 74 68 6f 64 20 45 78  d   [mymethod Ex
2b00: 70 61 6e 64 44 61 74 61 5d 0a 09 67 74 63 6f 72  pandData]..gtcor
2b10: 65 20 66 6f 72 6d 61 74 63 6d 64 20 5b 6d 79 6d  e formatcmd [mym
2b20: 65 74 68 6f 64 20 45 78 70 61 6e 64 46 6f 72 6d  ethod ExpandForm
2b30: 61 74 5d 0a 09 67 74 63 6f 72 65 20 73 6f 72 74  at]..gtcore sort
2b40: 63 6d 64 20 20 20 5b 6d 79 6d 65 74 68 6f 64 20  cmd   [mymethod 
2b50: 45 78 70 61 6e 64 53 6f 72 74 5d 0a 09 67 74 63  ExpandSort]..gtc
2b60: 6f 72 65 20 73 61 76 65 63 6d 64 20 20 20 5b 6d  ore savecmd   [m
2b70: 79 6d 65 74 68 6f 64 20 45 78 70 61 6e 64 31 20  ymethod Expand1 
2b80: 24 61 63 20 24 64 69 72 5d 0a 0a 09 67 74 63 6f  $ac $dir]...gtco
2b90: 72 65 20 74 72 61 76 65 72 73 65 20 24 65 78 20  re traverse $ex 
2ba0: 3b 20 23 20 54 68 65 20 67 72 61 70 68 20 69 73  ; # The graph is
2bb0: 20 67 6f 6e 65 20 61 66 74 65 72 20 74 68 65 20   gone after the 
2bc0: 63 61 6c 6c 0a 09 63 6c 6f 73 65 20 24 61 63 0a  call..close $ac.
2bd0: 0a 09 23 20 4e 6f 77 20 74 72 61 76 65 72 73 65  ..# Now traverse
2be0: 20 74 68 65 20 69 6d 70 6f 72 74 20 67 72 61 70   the import grap
2bf0: 68 2c 20 74 68 69 73 20 62 75 69 6c 64 73 20 74  h, this builds t
2c00: 68 65 20 69 6e 73 74 72 75 63 74 69 6f 6e 0a 09  he instruction..
2c10: 23 20 6d 61 70 20 66 6f 72 20 74 68 65 20 66 6f  # map for the fo
2c20: 73 73 69 6c 20 64 65 6c 74 61 73 2e 0a 0a 09 67  ssil deltas....g
2c30: 74 63 6f 72 65 20 64 61 74 61 63 6d 64 20 20 20  tcore datacmd   
2c40: 5b 6d 79 6d 65 74 68 6f 64 20 45 78 70 61 6e 64  [mymethod Expand
2c50: 44 61 74 61 5d 0a 09 67 74 63 6f 72 65 20 66 6f  Data]..gtcore fo
2c60: 72 6d 61 74 63 6d 64 20 5b 6d 79 6d 65 74 68 6f  rmatcmd [mymetho
2c70: 64 20 45 78 70 61 6e 64 46 6f 72 6d 61 74 5d 0a  d ExpandFormat].
2c80: 09 67 74 63 6f 72 65 20 73 6f 72 74 63 6d 64 20  .gtcore sortcmd 
2c90: 20 20 5b 6d 79 6d 65 74 68 6f 64 20 45 78 70 61    [mymethod Expa
2ca0: 6e 64 53 6f 72 74 5d 0a 09 67 74 63 6f 72 65 20  ndSort]..gtcore 
2cb0: 73 61 76 65 63 6d 64 20 20 20 5b 6d 79 6d 65 74  savecmd   [mymet
2cc0: 68 6f 64 20 45 78 70 61 6e 64 32 5d 0a 0a 09 73  hod Expand2]...s
2cd0: 65 74 20 6d 79 69 6d 70 6f 72 74 20 7b 7d 0a 09  et myimport {}..
2ce0: 67 74 63 6f 72 65 20 74 72 61 76 65 72 73 65 20  gtcore traverse 
2cf0: 24 7a 70 20 3b 20 23 20 54 68 65 20 67 72 61 70  $zp ; # The grap
2d00: 68 20 69 73 20 67 6f 6e 65 20 61 66 74 65 72 20  h is gone after 
2d10: 74 68 65 20 63 61 6c 6c 0a 09 73 65 74 20 66 69  the call..set fi
2d20: 6c 65 6d 61 70 20 24 6d 79 69 6d 70 6f 72 74 0a  lemap $myimport.
2d30: 09 75 6e 73 65 74 20 6d 79 69 6d 70 6f 72 74 0a  .unset myimport.
2d40: 0a 09 23 20 41 6e 64 20 62 61 63 6b 20 74 6f 20  ..# And back to 
2d50: 69 6d 70 6f 72 74 20 63 6f 6e 74 72 6f 6c 0a 0a  import control..
2d60: 09 72 65 74 75 72 6e 20 5b 6c 69 73 74 20 24 66  .return [list $f
2d70: 69 6c 65 6d 61 70 20 24 72 65 76 6d 61 70 5d 0a  ilemap $revmap].
2d80: 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f      }..    metho
2d90: 64 20 45 78 70 61 6e 64 44 61 74 61 20 20 20 7b  d ExpandData   {
2da0: 67 72 61 70 68 20 6e 6f 64 65 7d 20 7b 20 72 65  graph node} { re
2db0: 74 75 72 6e 20 5b 24 67 72 61 70 68 20 6e 6f 64  turn [$graph nod
2dc0: 65 20 67 65 74 20 24 6e 6f 64 65 20 72 65 76 6e  e get $node revn
2dd0: 72 5d 20 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20  r] }.    method 
2de0: 45 78 70 61 6e 64 46 6f 72 6d 61 74 20 7b 67 72  ExpandFormat {gr
2df0: 61 70 68 20 69 74 65 6d 7d 20 7b 20 72 65 74 75  aph item} { retu
2e00: 72 6e 20 3c 5b 6c 69 6e 64 65 78 20 24 69 74 65  rn <[lindex $ite
2e10: 6d 20 31 5d 3e 20 7d 20 3b 20 23 20 72 65 76 6e  m 1]> } ; # revn
2e20: 72 0a 20 20 20 20 6d 65 74 68 6f 64 20 45 78 70  r.    method Exp
2e30: 61 6e 64 53 6f 72 74 20 20 20 7b 67 72 61 70 68  andSort   {graph
2e40: 20 63 61 6e 64 69 64 61 74 65 73 7d 20 7b 0a 09   candidates} {..
2e50: 23 20 63 61 6e 64 69 64 61 74 65 73 20 3d 20 6c  # candidates = l
2e60: 69 73 74 28 69 74 65 6d 29 2c 20 69 74 65 6d 20  ist(item), item 
2e70: 3d 20 6c 69 73 74 28 6e 6f 64 65 20 72 65 76 6e  = list(node revn
2e80: 72 29 0a 09 23 20 53 6f 72 74 20 62 79 20 6e 6f  r)..# Sort by no
2e90: 64 65 20 61 6e 64 20 72 65 76 6e 72 20 2d 3e 20  de and revnr -> 
2ea0: 54 72 75 6e 6b 20 72 65 76 69 73 69 6f 6e 73 20  Trunk revisions 
2eb0: 63 6f 6d 65 20 66 69 72 73 74 2e 0a 09 72 65 74  come first...ret
2ec0: 75 72 6e 20 5b 6c 73 6f 72 74 20 2d 69 6e 64 65  urn [lsort -inde
2ed0: 78 20 31 20 2d 64 69 63 74 20 5b 6c 73 6f 72 74  x 1 -dict [lsort
2ee0: 20 2d 69 6e 64 65 78 20 30 20 2d 64 69 63 74 20   -index 0 -dict 
2ef0: 24 63 61 6e 64 69 64 61 74 65 73 5d 5d 0a 20 20  $candidates]].  
2f00: 20 20 7d 0a 20 20 20 20 6d 65 74 68 6f 64 20 45    }.    method E
2f10: 78 70 61 6e 64 31 20 7b 63 68 61 6e 20 64 69 72  xpand1 {chan dir
2f20: 20 67 72 61 70 68 20 6e 6f 64 65 7d 20 7b 0a 09   graph node} {..
2f30: 73 65 74 20 72 65 76 6e 72 20 20 20 20 20 20 20  set revnr       
2f40: 20 20 20 20 5b 24 67 72 61 70 68 20 6e 6f 64 65      [$graph node
2f50: 20 67 65 74 20 24 6e 6f 64 65 20 72 65 76 6e 72   get $node revnr
2f60: 5d 0a 09 73 65 74 20 66 6e 61 6d 65 20 20 20 20  ]..set fname    
2f70: 20 20 20 20 20 20 72 24 72 65 76 6e 72 0a 09 73        r$revnr..s
2f80: 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73 69  truct::list assi
2f90: 67 6e 20 5b 24 67 72 61 70 68 20 6e 6f 64 65 20  gn [$graph node 
2fa0: 67 65 74 20 24 6e 6f 64 65 20 74 65 78 74 5d 20  get $node text] 
2fb0: 6f 66 66 73 65 74 20 6c 65 6e 67 74 68 0a 0a 09  offset length...
2fc0: 73 65 65 6b 20 24 63 68 61 6e 20 24 6f 66 66 73  seek $chan $offs
2fd0: 65 74 20 73 74 61 72 74 0a 09 73 65 74 20 64 61  et start..set da
2fe0: 74 61 20 5b 73 74 72 69 6e 67 20 6d 61 70 20 7b  ta [string map {
2ff0: 40 40 20 40 7d 20 5b 72 65 61 64 20 24 63 68 61  @@ @} [read $cha
3000: 6e 20 24 6c 65 6e 67 74 68 5d 5d 0a 0a 09 69 66  n $length]]...if
3010: 20 7b 21 5b 24 67 72 61 70 68 20 6e 6f 64 65 20   {![$graph node 
3020: 6b 65 79 65 78 69 73 74 73 20 24 6e 6f 64 65 20  keyexists $node 
3030: 5f 5f 62 61 73 65 5f 5f 5d 7d 20 7b 0a 09 20 20  __base__]} {..  
3040: 20 20 23 20 46 75 6c 6c 20 74 65 78 74 20 6e 6f    # Full text no
3050: 64 65 2e 20 47 65 74 20 74 68 65 20 64 61 74 61  de. Get the data
3060: 2c 20 64 65 63 6f 64 65 20 69 74 2c 20 61 6e 64  , decode it, and
3070: 20 73 61 76 65 2e 0a 0a 09 20 20 20 20 6c 6f 67   save....    log
3080: 20 77 72 69 74 65 20 32 20 66 69 6c 65 20 7b 45   write 2 file {E
3090: 78 70 61 6e 64 69 6e 67 20 3c 24 72 65 76 6e 72  xpanding <$revnr
30a0: 3e 2c 20 66 75 6c 6c 20 74 65 78 74 7d 0a 0a 09  >, full text}...
30b0: 20 20 20 20 66 69 6c 65 75 74 69 6c 3a 3a 77 72      fileutil::wr
30c0: 69 74 65 46 69 6c 65 20 2d 74 72 61 6e 73 6c 61  iteFile -transla
30d0: 74 69 6f 6e 20 62 69 6e 61 72 79 20 24 64 69 72  tion binary $dir
30e0: 2f 24 66 6e 61 6d 65 20 24 64 61 74 61 0a 09 7d  /$fname $data..}
30f0: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 23 20 44   else {..    # D
3100: 65 6c 74 61 20 6e 6f 64 65 2e 20 5f 5f 62 61 73  elta node. __bas
3110: 65 5f 5f 20 69 73 20 74 68 65 20 6e 61 6d 65 20  e__ is the name 
3120: 6f 66 20 74 68 65 20 66 69 6c 65 20 63 6f 6e 74  of the file cont
3130: 61 69 6e 69 6e 67 0a 09 20 20 20 20 23 20 74 68  aining..    # th
3140: 65 20 62 61 73 65 6c 69 6e 65 2e 20 54 68 65 20  e baseline. The 
3150: 70 61 74 63 68 20 69 73 20 61 74 20 74 68 65 20  patch is at the 
3160: 73 70 65 63 69 66 69 65 64 20 6c 6f 63 61 74 69  specified locati
3170: 6f 6e 20 6f 66 0a 09 20 20 20 20 23 20 74 68 65  on of..    # the
3180: 20 61 72 63 68 69 76 65 20 66 69 6c 65 2e 0a 0a   archive file...
3190: 09 20 20 20 20 73 65 74 20 66 62 61 73 65 20 5b  .    set fbase [
31a0: 24 67 72 61 70 68 20 6e 6f 64 65 20 67 65 74 20  $graph node get 
31b0: 24 6e 6f 64 65 20 5f 5f 62 61 73 65 5f 5f 5d 0a  $node __base__].
31c0: 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 32  .    log write 2
31d0: 20 66 69 6c 65 20 7b 45 78 70 61 6e 64 69 6e 67   file {Expanding
31e0: 20 3c 24 72 65 76 6e 72 3e 2c 20 69 73 20 64 65   <$revnr>, is de
31f0: 6c 74 61 20 6f 66 20 3c 24 66 62 61 73 65 3e 7d  lta of <$fbase>}
3200: 0a 0a 09 20 20 20 20 73 65 74 20 62 61 73 65 20  ...    set base 
3210: 5b 66 69 6c 65 75 74 69 6c 3a 3a 63 61 74 20 2d  [fileutil::cat -
3220: 74 72 61 6e 73 6c 61 74 69 6f 6e 20 62 69 6e 61  translation bina
3230: 72 79 20 24 64 69 72 2f 24 66 62 61 73 65 5d 0a  ry $dir/$fbase].
3240: 0a 09 20 20 20 20 23 20 57 72 69 74 69 6e 67 20  ..    # Writing 
3250: 74 68 65 20 70 61 74 63 68 20 74 6f 20 64 69 73  the patch to dis
3260: 6b 20 69 73 20 6a 75 73 74 20 66 6f 72 20 62 65  k is just for be
3270: 74 74 65 72 0a 09 20 20 20 20 23 20 64 65 62 75  tter..    # debu
3280: 67 67 69 6e 67 2e 20 49 74 20 69 73 20 6e 6f 74  gging. It is not
3290: 20 75 73 65 64 20 6f 74 68 65 72 77 69 73 65 2e   used otherwise.
32a0: 0a 09 20 20 20 20 66 69 6c 65 75 74 69 6c 3a 3a  ..    fileutil::
32b0: 77 72 69 74 65 46 69 6c 65 20 24 64 69 72 2f 72  writeFile $dir/r
32c0: 70 61 74 63 68 20 24 64 61 74 61 0a 09 20 20 20  patch $data..   
32d0: 20 66 69 6c 65 75 74 69 6c 3a 3a 77 72 69 74 65   fileutil::write
32e0: 46 69 6c 65 20 2d 74 72 61 6e 73 6c 61 74 69 6f  File -translatio
32f0: 6e 20 62 69 6e 61 72 79 20 24 64 69 72 2f 24 66  n binary $dir/$f
3300: 6e 61 6d 65 20 5c 0a 09 09 5b 41 70 70 6c 79 20  name \...[Apply 
3310: 24 62 61 73 65 20 24 64 61 74 61 5d 0a 09 7d 0a  $base $data]..}.
3320: 0a 09 23 20 50 6f 73 74 20 74 6f 20 61 6c 6c 20  ..# Post to all 
3330: 73 75 63 63 65 73 73 6f 72 73 20 74 68 61 74 20  successors that 
3340: 74 68 65 20 6a 75 73 74 20 67 65 6e 65 72 61 74  the just generat
3350: 65 64 20 66 69 6c 65 20 69 73 20 74 68 65 69 72  ed file is their
3360: 0a 09 23 20 62 61 73 65 6c 69 6e 65 2e 0a 0a 09  ..# baseline....
3370: 66 6f 72 65 61 63 68 20 6f 75 74 20 5b 24 67 72  foreach out [$gr
3380: 61 70 68 20 6e 6f 64 65 73 20 2d 6f 75 74 20 24  aph nodes -out $
3390: 6e 6f 64 65 5d 20 7b 0a 09 20 20 20 20 24 67 72  node] {..    $gr
33a0: 61 70 68 20 6e 6f 64 65 20 73 65 74 20 24 6f 75  aph node set $ou
33b0: 74 20 5f 5f 62 61 73 65 5f 5f 20 24 66 6e 61 6d  t __base__ $fnam
33c0: 65 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20  e..}..return.   
33d0: 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 41 70 70   }..    proc App
33e0: 6c 79 20 7b 62 61 73 65 20 64 65 6c 74 61 7d 20  ly {base delta} 
33f0: 7b 0a 09 23 20 62 61 73 65 20 20 3d 20 62 61 73  {..# base  = bas
3400: 65 20 74 65 78 74 2e 0a 09 23 20 64 65 6c 74 61  e text...# delta
3410: 20 3d 20 64 65 6c 74 61 20 69 6e 20 72 63 73 20   = delta in rcs 
3420: 66 6f 72 6d 61 74 2e 0a 09 23 0a 09 23 20 42 6f  format...#..# Bo
3430: 74 68 20 73 74 72 69 6e 67 73 20 61 72 65 20 75  th strings are u
3440: 6e 65 6e 63 6f 64 65 64 2c 20 69 2e 65 2e 20 74  nencoded, i.e. t
3450: 68 69 6e 67 73 20 6c 69 6b 65 20 40 40 2c 20 65  hings like @@, e
3460: 74 63 2e 20 68 61 76 65 0a 09 23 20 61 6c 72 65  tc. have..# alre
3470: 61 64 79 20 62 65 65 6e 20 72 65 70 6c 61 63 65  ady been replace
3480: 64 20 77 69 74 68 20 74 68 65 69 72 20 70 72 6f  d with their pro
3490: 70 65 72 20 63 68 61 72 61 63 74 65 72 73 2e 0a  per characters..
34a0: 09 23 0a 09 23 20 52 65 74 75 72 6e 20 76 61 6c  .#..# Return val
34b0: 75 65 20 69 73 20 74 68 65 20 70 61 74 63 68 65  ue is the patche
34c0: 64 20 74 65 78 74 2e 0a 0a 09 73 65 74 20 62 61  d text....set ba
34d0: 73 65 20 5b 73 70 6c 69 74 20 24 62 61 73 65 20  se [split $base 
34e0: 5c 6e 5d 0a 09 73 65 74 20 62 6c 65 6e 20 5b 6c  \n]..set blen [l
34f0: 6c 65 6e 67 74 68 20 24 62 61 73 65 5d 0a 09 73  length $base]..s
3500: 65 74 20 6f 6f 66 66 20 30 0a 09 73 65 74 20 72  et ooff 0..set r
3510: 65 73 20 22 22 0a 0a 09 73 65 74 20 6c 69 6e 65  es ""...set line
3520: 73 20 20 5b 73 70 6c 69 74 20 24 64 65 6c 74 61  s  [split $delta
3530: 20 5c 6e 5d 0a 09 73 65 74 20 6e 6c 69 6e 65 73   \n]..set nlines
3540: 20 5b 6c 6c 65 6e 67 74 68 20 24 6c 69 6e 65 73   [llength $lines
3550: 5d 0a 0a 09 66 6f 72 20 7b 73 65 74 20 69 20 30  ]...for {set i 0
3560: 7d 20 7b 24 69 20 3c 20 24 6e 6c 69 6e 65 73 7d  } {$i < $nlines}
3570: 20 7b 7d 20 7b 0a 09 20 20 20 20 69 66 20 7b 21   {} {..    if {!
3580: 5b 72 65 67 65 78 70 20 7b 5e 28 5b 61 64 5d 29  [regexp {^([ad])
3590: 28 5c 64 2b 29 5c 73 28 5c 64 2b 29 24 7d 20 5b  (\d+)\s(\d+)$} [
35a0: 6c 69 6e 64 65 78 20 24 6c 69 6e 65 73 20 24 69  lindex $lines $i
35b0: 5d 20 2d 3e 20 63 6d 64 20 73 6c 20 63 6e 5d 7d  ] -> cmd sl cn]}
35c0: 20 7b 0a 09 09 74 72 6f 75 62 6c 65 20 69 6e 74   {...trouble int
35d0: 65 72 6e 61 6c 20 22 42 61 64 20 65 64 20 63 6f  ernal "Bad ed co
35e0: 6d 6d 61 6e 64 20 27 5b 6c 69 6e 64 65 78 20 24  mmand '[lindex $
35f0: 6c 69 6e 65 73 20 24 69 5d 27 22 0a 09 20 20 20  lines $i]'"..   
3600: 20 7d 0a 0a 09 20 20 20 20 69 6e 63 72 20 69 0a   }...    incr i.
3610: 09 20 20 20 20 73 65 74 20 65 6c 20 5b 65 78 70  .    set el [exp
3620: 72 20 7b 24 73 6c 20 2b 20 24 63 6e 7d 5d 0a 0a  r {$sl + $cn}]..
3630: 09 20 20 20 20 73 77 69 74 63 68 20 2d 65 78 61  .    switch -exa
3640: 63 74 20 2d 2d 20 24 63 6d 64 20 7b 0a 09 09 64  ct -- $cmd {...d
3650: 20 7b 0a 09 09 20 20 20 20 69 6e 63 72 20 73 6c   {...    incr sl
3660: 20 2d 31 0a 09 09 20 20 20 20 69 6e 63 72 20 65   -1...    incr e
3670: 6c 20 2d 31 0a 09 09 20 20 20 20 69 66 20 7b 24  l -1...    if {$
3680: 73 6c 20 3c 20 24 6f 6f 66 66 7d 20 7b 20 74 72  sl < $ooff} { tr
3690: 6f 75 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 7b  ouble internal {
36a0: 44 65 6c 65 74 69 6f 6e 20 62 65 66 6f 72 65 20  Deletion before 
36b0: 6c 61 73 74 20 65 64 69 74 7d 20 7d 0a 09 09 20  last edit} }... 
36c0: 20 20 20 69 66 20 7b 24 73 6c 20 3e 20 24 62 6c     if {$sl > $bl
36d0: 65 6e 7d 20 7b 20 74 72 6f 75 62 6c 65 20 69 6e  en} { trouble in
36e0: 74 65 72 6e 61 6c 20 7b 44 65 6c 65 74 69 6f 6e  ternal {Deletion
36f0: 20 70 61 73 74 20 66 69 6c 65 20 65 6e 64 7d 20   past file end} 
3700: 7d 0a 09 09 20 20 20 20 69 66 20 7b 24 65 6c 20  }...    if {$el 
3710: 3e 20 24 62 6c 65 6e 7d 20 7b 20 74 72 6f 75 62  > $blen} { troub
3720: 6c 65 20 69 6e 74 65 72 6e 61 6c 20 7b 44 65 6c  le internal {Del
3730: 65 74 69 6f 6e 20 62 65 79 6f 6e 64 20 66 69 6c  etion beyond fil
3740: 65 20 65 6e 64 7d 20 7d 0a 09 09 20 20 20 20 66  e end} }...    f
3750: 6f 72 65 61 63 68 20 78 20 5b 6c 72 61 6e 67 65  oreach x [lrange
3760: 20 24 62 61 73 65 20 24 6f 6f 66 66 20 24 73 6c   $base $ooff $sl
3770: 5d 20 7b 20 6c 61 70 70 65 6e 64 20 72 65 73 20  ] { lappend res 
3780: 24 78 20 7d 0a 09 09 20 20 20 20 73 65 74 20 20  $x }...    set  
3790: 6f 6f 66 66 20 24 65 6c 0a 09 09 7d 0a 09 09 61  ooff $el...}...a
37a0: 20 7b 0a 09 09 20 20 20 20 69 66 20 7b 24 73 6c   {...    if {$sl
37b0: 20 3c 20 24 6f 6f 66 66 7d 20 7b 20 74 72 6f 75   < $ooff} { trou
37c0: 62 6c 65 20 69 6e 74 65 72 6e 61 6c 20 7b 49 6e  ble internal {In
37d0: 73 65 72 74 20 62 65 66 6f 72 65 20 6c 61 73 74  sert before last
37e0: 20 65 64 69 74 7d 20 7d 0a 09 09 20 20 20 20 69   edit} }...    i
37f0: 66 20 7b 24 73 6c 20 3e 20 24 62 6c 65 6e 7d 20  f {$sl > $blen} 
3800: 7b 20 74 72 6f 75 62 6c 65 20 69 6e 74 65 72 6e  { trouble intern
3810: 61 6c 20 7b 49 6e 73 65 72 74 20 70 61 73 74 20  al {Insert past 
3820: 66 69 6c 65 20 65 6e 64 7d 20 7d 0a 0a 09 09 20  file end} }.... 
3830: 20 20 20 66 6f 72 65 61 63 68 20 78 20 5b 6c 72     foreach x [lr
3840: 61 6e 67 65 20 24 62 61 73 65 20 24 6f 6f 66 66  ange $base $ooff
3850: 20 24 73 6c 5d 20 20 20 20 20 20 20 20 20 20 20   $sl]           
3860: 20 20 7b 20 6c 61 70 70 65 6e 64 20 72 65 73 20    { lappend res 
3870: 24 78 20 7d 0a 09 09 20 20 20 20 66 6f 72 65 61  $x }...    forea
3880: 63 68 20 78 20 5b 6c 72 61 6e 67 65 20 24 6c 69  ch x [lrange $li
3890: 6e 65 73 20 24 69 20 5b 65 78 70 72 20 7b 24 69  nes $i [expr {$i
38a0: 20 2b 20 24 63 6e 7d 5d 5d 20 7b 20 6c 61 70 70   + $cn}]] { lapp
38b0: 65 6e 64 20 72 65 73 20 24 78 20 7d 0a 09 09 20  end res $x }... 
38c0: 20 20 20 73 65 74 20 6f 6f 66 66 20 24 73 6c 0a     set ooff $sl.
38d0: 09 09 20 20 20 20 69 6e 63 72 20 69 20 24 63 6e  ..    incr i $cn
38e0: 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09 7d 0a 09  ...}..    }..}..
38f0: 66 6f 72 65 61 63 68 20 78 20 5b 6c 72 61 6e 67  foreach x [lrang
3900: 65 20 24 62 61 73 65 20 24 6f 6f 66 66 20 65 6e  e $base $ooff en
3910: 64 5d 20 7b 20 6c 61 70 70 65 6e 64 20 72 65 73  d] { lappend res
3920: 20 24 78 20 7d 0a 09 72 65 74 75 72 6e 20 5b 6a   $x }..return [j
3930: 6f 69 6e 20 24 72 65 73 20 5c 6e 5d 0a 20 20 20  oin $res \n].   
3940: 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 45   }..    method E
3950: 78 70 61 6e 64 32 20 7b 67 72 61 70 68 20 6e 6f  xpand2 {graph no
3960: 64 65 7d 20 7b 0a 09 73 65 74 20 72 65 76 6e 72  de} {..set revnr
3970: 20 5b 24 67 72 61 70 68 20 6e 6f 64 65 20 67 65   [$graph node ge
3980: 74 20 24 6e 6f 64 65 20 72 65 76 6e 72 5d 0a 0a  t $node revnr]..
3990: 09 23 20 46 69 72 73 74 20 69 6d 70 6f 72 74 20  .# First import 
39a0: 74 68 65 20 66 69 6c 65 2e 0a 09 6c 61 70 70 65  the file...lappe
39b0: 6e 64 20 6d 79 69 6d 70 6f 72 74 20 5b 6c 69 73  nd myimport [lis
39c0: 74 20 41 20 72 24 72 65 76 6e 72 20 7b 7d 5d 0a  t A r$revnr {}].
39d0: 0a 09 69 66 20 7b 5b 24 67 72 61 70 68 20 6e 6f  ..if {[$graph no
39e0: 64 65 20 6b 65 79 65 78 69 73 74 73 20 24 6e 6f  de keyexists $no
39f0: 64 65 20 5f 5f 62 61 73 65 5f 5f 5d 7d 20 7b 0a  de __base__]} {.
3a00: 09 20 20 20 20 23 20 44 65 6c 74 61 20 6e 6f 64  .    # Delta nod
3a10: 65 2e 20 5f 5f 62 61 73 65 5f 5f 20 69 73 20 74  e. __base__ is t
3a20: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66  he name of the f
3a30: 69 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 0a 09  ile containing..
3a40: 20 20 20 20 23 20 74 68 65 20 62 61 73 65 6c 69      # the baseli
3a50: 6e 65 2e 20 47 65 6e 65 72 61 74 65 20 69 6e 73  ne. Generate ins
3a60: 74 72 75 63 74 69 6f 6e 20 74 6f 20 6d 61 6b 65  truction to make
3a70: 20 74 68 65 20 64 65 6c 74 61 20 61 73 0a 09 20   the delta as.. 
3a80: 20 20 20 23 20 77 65 6c 6c 2e 0a 0a 09 20 20 20     # well....   
3a90: 20 73 65 74 20 66 62 61 73 65 20 5b 24 67 72 61   set fbase [$gra
3aa0: 70 68 20 6e 6f 64 65 20 67 65 74 20 24 6e 6f 64  ph node get $nod
3ab0: 65 20 5f 5f 62 61 73 65 5f 5f 5d 0a 09 20 20 20  e __base__]..   
3ac0: 20 6c 61 70 70 65 6e 64 20 6d 79 69 6d 70 6f 72   lappend myimpor
3ad0: 74 20 5b 6c 69 73 74 20 44 20 72 24 72 65 76 6e  t [list D r$revn
3ae0: 72 20 72 24 66 62 61 73 65 5d 0a 09 7d 0a 0a 09  r r$fbase]..}...
3af0: 23 20 50 6f 73 74 20 74 6f 20 61 6c 6c 20 73 75  # Post to all su
3b00: 63 63 65 73 73 6f 72 73 20 74 68 61 74 20 74 68  ccessors that th
3b10: 65 20 6a 75 73 74 20 67 65 6e 65 72 61 74 65 64  e just generated
3b20: 20 66 69 6c 65 20 69 73 20 74 68 65 69 72 0a 09   file is their..
3b30: 23 20 62 61 73 65 6c 69 6e 65 2e 20 45 78 63 65  # baseline. Exce
3b40: 70 74 69 6f 6e 3a 20 54 68 6f 73 65 20 77 68 69  ption: Those whi
3b50: 63 68 20 61 76 65 20 61 6c 72 65 61 64 79 20 61  ch ave already a
3b60: 20 62 61 73 65 6c 69 6e 65 20 73 65 74 2e 0a 09   baseline set...
3b70: 23 20 54 6f 67 65 74 68 65 72 20 77 69 74 68 20  # Together with 
3b80: 74 68 65 20 73 6f 72 74 69 6e 67 20 6f 66 20 74  the sorting of t
3b90: 72 75 6e 6b 20 72 65 76 69 73 69 6f 6e 73 20 66  runk revisions f
3ba0: 69 72 73 74 20 74 68 65 20 74 72 75 6e 6b 0a 09  irst the trunk..
3bb0: 23 20 73 68 6f 75 6c 64 20 6f 6e 65 20 75 6e 69  # should one uni
3bc0: 6e 74 65 72 75 70 74 65 64 20 6c 69 6e 65 2c 20  nterupted line, 
3bd0: 77 69 74 68 20 62 72 61 6e 63 68 20 72 6f 6f 74  with branch root
3be0: 73 20 5f 6e 6f 74 5f 20 64 65 6c 74 61 0a 09 23  s _not_ delta..#
3bf0: 20 63 6f 6d 70 72 65 73 73 65 64 20 70 65 72 20   compressed per 
3c00: 74 68 65 69 72 20 62 72 61 6e 63 68 65 73 2e 0a  their branches..
3c10: 0a 09 66 6f 72 65 61 63 68 20 6f 75 74 20 5b 24  ..foreach out [$
3c20: 67 72 61 70 68 20 6e 6f 64 65 73 20 2d 6f 75 74  graph nodes -out
3c30: 20 24 6e 6f 64 65 5d 20 7b 0a 09 20 20 20 20 69   $node] {..    i
3c40: 66 20 7b 5b 24 67 72 61 70 68 20 6e 6f 64 65 20  f {[$graph node 
3c50: 6b 65 79 65 78 69 73 74 73 20 24 6f 75 74 20 5f  keyexists $out _
3c60: 5f 62 61 73 65 5f 5f 5d 7d 20 63 6f 6e 74 69 6e  _base__]} contin
3c70: 75 65 0a 09 20 20 20 20 24 67 72 61 70 68 20 6e  ue..    $graph n
3c80: 6f 64 65 20 73 65 74 20 24 6f 75 74 20 5f 5f 62  ode set $out __b
3c90: 61 73 65 5f 5f 20 24 72 65 76 6e 72 0a 09 7d 0a  ase__ $revnr..}.
3ca0: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
3cb0: 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 69 6d     variable myim
3cc0: 70 6f 72 74 0a 0a 20 20 20 20 23 20 23 20 23 23  port..    # # ##
3cd0: 20 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23   ### ##### #####
3ce0: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
3cf0: 23 0a 20 20 20 20 23 23 20 53 74 61 74 65 0a 0a  #.    ## State..
3d00: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 69      variable myi
3d10: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7b  d              {
3d20: 7d 20 3b 20 23 20 46 69 6c 65 20 69 64 20 69 6e  } ; # File id in
3d30: 20 74 68 65 20 70 65 72 73 69 73 74 65 6e 74 20   the persistent 
3d40: 73 74 61 74 65 2e 0a 20 20 20 20 76 61 72 69 61  state..    varia
3d50: 62 6c 65 20 6d 79 70 61 74 68 20 20 20 20 20 20  ble mypath      
3d60: 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 50 61 74        {} ; # Pat
3d70: 68 20 6f 66 20 74 68 65 20 66 69 6c 65 27 73 20  h of the file's 
3d80: 72 63 73 20 61 72 63 68 69 76 65 2e 0a 20 20 20  rcs archive..   
3d90: 20 76 61 72 69 61 62 6c 65 20 6d 79 75 73 72 70   variable myusrp
3da0: 61 74 68 20 20 20 20 20 20 20 20 20 7b 7d 20 3b  ath         {} ;
3db0: 20 23 20 50 61 74 68 20 6f 66 20 74 68 65 20 66   # Path of the f
3dc0: 69 6c 65 20 61 73 20 73 65 65 6e 20 62 79 20 75  ile as seen by u
3dd0: 73 65 72 73 2e 0a 20 20 20 20 76 61 72 69 61 62  sers..    variab
3de0: 6c 65 20 6d 79 65 78 65 63 75 74 61 62 6c 65 20  le myexecutable 
3df0: 20 20 20 20 20 30 20 20 3b 20 23 20 42 6f 6f 6c       0  ; # Bool
3e00: 65 61 6e 20 66 6c 61 67 20 27 66 69 6c 65 20 65  ean flag 'file e
3e10: 78 65 63 75 74 61 62 6c 65 27 2e 0a 20 20 20 20  xecutable'..    
3e20: 76 61 72 69 61 62 6c 65 20 6d 79 70 72 6f 6a 65  variable myproje
3e30: 63 74 20 20 20 20 20 20 20 20 20 7b 7d 20 3b 20  ct         {} ; 
3e40: 23 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20 74  # Reference to t
3e50: 68 65 20 70 72 6f 6a 65 63 74 20 6f 62 6a 65 63  he project objec
3e60: 74 0a 09 09 09 09 20 20 20 20 23 20 74 68 65 20  t.....    # the 
3e70: 66 69 6c 65 20 62 65 6c 6f 6e 67 73 20 74 6f 2e  file belongs to.
3e80: 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79  .    variable my
3e90: 72 65 76 20 2d 61 72 72 61 79 20 20 20 20 20 20  rev -array      
3ea0: 7b 7d 20 3b 20 23 20 4d 61 70 73 20 72 65 76 69  {} ; # Maps revi
3eb0: 73 69 6f 6e 20 6e 75 6d 62 65 72 20 74 6f 20 74  sion number to t
3ec0: 68 65 0a 09 09 09 09 20 20 20 20 23 20 61 73 73  he.....    # ass
3ed0: 6f 63 69 61 74 65 64 20 72 65 76 69 73 69 6f 6e  ociated revision
3ee0: 20 6f 62 6a 65 63 74 2e 0a 20 20 20 20 76 61 72   object..    var
3ef0: 69 61 62 6c 65 20 6d 79 72 65 76 69 73 69 6f 6e  iable myrevision
3f00: 73 20 20 20 20 20 20 20 7b 7d 20 3b 20 23 20 53  s       {} ; # S
3f10: 61 6d 65 20 61 73 20 6d 79 72 65 76 2c 20 62 75  ame as myrev, bu
3f20: 74 20 61 20 6c 69 73 74 2c 0a 09 09 09 09 20 20  t a list,.....  
3f30: 20 20 23 20 67 69 76 69 6e 67 20 75 73 20 74 68    # giving us th
3f40: 65 20 6f 72 64 65 72 20 6f 66 0a 09 09 09 09 20  e order of..... 
3f50: 20 20 20 23 20 72 65 76 69 73 69 6f 6e 73 2e 0a     # revisions..
3f60: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 61      variable mya
3f70: 69 64 20 20 20 20 20 20 2d 61 72 72 61 79 20 7b  id      -array {
3f80: 7d 20 3b 20 23 20 4d 61 70 20 72 65 76 69 73 69  } ; # Map revisi
3f90: 6f 6e 20 6e 75 6d 62 65 72 73 20 74 6f 20 74 68  on numbers to th
3fa0: 65 20 69 64 0a 09 09 09 09 20 20 20 20 23 20 6f  e id.....    # o
3fb0: 66 20 74 68 65 20 61 75 74 68 6f 72 20 77 68 6f  f the author who
3fc0: 20 63 6f 6d 6d 69 74 74 65 64 0a 09 09 09 09 20   committed..... 
3fd0: 20 20 20 23 20 69 74 2e 20 54 68 69 73 20 69 73     # it. This is
3fe0: 20 6c 61 74 65 72 20 61 67 67 72 65 67 61 74 65   later aggregate
3ff0: 64 0a 09 09 09 09 20 20 20 20 23 20 77 69 74 68  d.....    # with
4000: 20 63 6f 6d 6d 69 74 20 6d 65 73 73 61 67 65 2c   commit message,
4010: 20 62 72 61 6e 63 68 20 6e 61 6d 65 0a 09 09 09   branch name....
4020: 09 20 20 20 20 23 20 61 6e 64 20 70 72 6f 6a 65  .    # and proje
4030: 63 74 20 69 64 20 66 6f 72 20 61 20 6d 65 74 61  ct id for a meta
4040: 20 69 64 2e 0a 20 20 20 20 76 61 72 69 61 62 6c   id..    variabl
4050: 65 20 6d 79 68 65 61 64 72 65 76 6e 72 20 20 20  e myheadrevnr   
4060: 20 20 20 20 7b 7d 20 3b 20 23 20 48 65 61 64 20      {} ; # Head 
4070: 72 65 76 69 73 69 6f 6e 20 28 72 65 76 69 73 69  revision (revisi
4080: 6f 6e 20 6e 75 6d 62 65 72 29 0a 20 20 20 20 76  on number).    v
4090: 61 72 69 61 62 6c 65 20 6d 79 70 72 69 6e 63 69  ariable myprinci
40a0: 70 61 6c 20 20 20 20 20 20 20 7b 7d 20 3b 20 23  pal       {} ; #
40b0: 20 50 72 69 6e 63 69 70 61 6c 20 62 72 61 6e 63   Principal branc
40c0: 68 20 28 62 72 61 6e 63 68 20 6e 75 6d 62 65 72  h (branch number
40d0: 29 2e 0a 09 09 09 09 20 20 20 20 23 20 43 6f 6e  )......    # Con
40e0: 74 72 61 72 79 20 74 6f 20 74 68 65 20 6e 61 6d  trary to the nam
40f0: 65 20 74 68 69 73 20 69 73 20 74 68 65 0a 09 09  e this is the...
4100: 09 09 20 20 20 20 23 20 64 65 66 61 75 6c 74 20  ..    # default 
4110: 62 72 61 6e 63 68 2e 0a 20 20 20 20 76 61 72 69  branch..    vari
4120: 61 62 6c 65 20 6d 79 64 65 70 65 6e 64 65 6e 63  able mydependenc
4130: 69 65 73 20 20 20 20 7b 7d 20 3b 20 23 20 44 69  ies    {} ; # Di
4140: 63 74 69 6f 6e 61 72 79 20 70 61 72 65 6e 74 20  ctionary parent 
4150: 2d 3e 20 63 68 69 6c 64 2c 0a 09 09 09 09 20 20  -> child,.....  
4160: 20 20 23 20 72 65 63 6f 72 64 73 20 70 72 69 6d    # records prim
4170: 61 72 79 20 64 65 70 65 6e 64 65 6e 63 69 65 73  ary dependencies
4180: 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d  ..    variable m
4190: 79 69 6d 70 6f 72 74 65 64 20 20 20 20 20 20 20  yimported       
41a0: 20 30 20 20 3b 20 23 20 42 6f 6f 6c 65 61 6e 20   0  ; # Boolean 
41b0: 66 6c 61 67 2e 20 53 65 74 20 69 66 20 61 6e 64  flag. Set if and
41c0: 20 6f 6e 6c 79 20 69 66 0a 09 09 09 09 20 20 20   only if.....   
41d0: 20 23 20 72 65 76 20 31 2e 31 20 6f 66 20 74 68   # rev 1.1 of th
41e0: 65 20 66 69 6c 65 20 73 65 65 6d 69 6e 67 6c 79  e file seemingly
41f0: 0a 09 09 09 09 20 20 20 20 23 20 77 61 73 20 69  .....    # was i
4200: 6d 70 6f 72 74 65 64 20 69 6e 73 74 65 61 64 20  mported instead 
4210: 6f 66 20 61 64 64 65 64 0a 09 09 09 09 20 20 20  of added.....   
4220: 20 23 20 6e 6f 72 6d 61 6c 6c 79 2e 0a 20 20 20   # normally..   
4230: 20 76 61 72 69 61 62 6c 65 20 6d 79 72 6f 6f 74   variable myroot
4240: 20 20 20 20 20 20 20 20 20 20 20 20 7b 7d 20 3b              {} ;
4250: 20 23 20 52 65 66 65 72 65 6e 63 65 20 74 6f 20   # Reference to 
4260: 74 68 65 20 72 65 76 69 73 69 6f 6e 20 6f 62 6a  the revision obj
4270: 65 63 74 0a 09 09 09 09 20 20 20 20 23 20 68 6f  ect.....    # ho
4280: 6c 64 69 6e 67 20 74 68 65 20 72 6f 6f 74 20 72  lding the root r
4290: 65 76 69 73 69 6f 6e 2e 20 20 49 74 73 0a 09 09  evision.  Its...
42a0: 09 09 20 20 20 20 23 20 6e 75 6d 62 65 72 20 75  ..    # number u
42b0: 73 75 61 6c 6c 79 20 69 73 20 27 31 2e 31 27 2e  sually is '1.1'.
42c0: 20 43 61 6e 20 62 65 0a 09 09 09 09 20 20 20 20   Can be.....    
42d0: 23 20 61 20 64 69 66 66 65 72 65 6e 74 20 6e 75  # a different nu
42e0: 6d 62 65 72 2c 20 62 65 63 61 75 73 65 20 6f 66  mber, because of
42f0: 0a 09 09 09 09 20 20 20 20 23 20 67 61 70 73 20  .....    # gaps 
4300: 63 72 65 61 74 65 64 20 76 69 61 20 27 63 76 73  created via 'cvs
4310: 61 64 6d 69 6e 20 2d 6f 27 2e 0a 20 20 20 20 76  admin -o'..    v
4320: 61 72 69 61 62 6c 65 20 6d 79 62 72 61 6e 63 68  ariable mybranch
4330: 65 73 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23  es -array {} ; #
4340: 20 4d 61 70 73 20 62 72 61 6e 63 68 20 6e 75 6d   Maps branch num
4350: 62 65 72 20 74 6f 20 74 68 65 20 73 79 6d 62 6f  ber to the symbo
4360: 6c 0a 09 09 09 09 20 20 20 20 23 20 6f 62 6a 65  l.....    # obje
4370: 63 74 20 68 61 6e 64 6c 69 6e 67 20 74 68 65 20  ct handling the 
4380: 62 72 61 6e 63 68 2e 0a 20 20 20 20 76 61 72 69  branch..    vari
4390: 61 62 6c 65 20 6d 79 74 61 67 73 20 20 20 20 20  able mytags     
43a0: 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61  -array {} ; # Ma
43b0: 70 73 20 72 65 76 69 73 69 6f 6e 20 6e 75 6d 62  ps revision numb
43c0: 65 72 20 74 6f 20 74 68 65 20 6c 69 73 74 0a 09  er to the list..
43d0: 09 09 09 20 20 20 20 23 20 6f 66 20 73 79 6d 62  ...    # of symb
43e0: 6f 6c 20 6f 62 6a 65 63 74 73 20 66 6f 72 20 74  ol objects for t
43f0: 68 65 20 74 61 67 73 0a 09 09 09 09 20 20 20 20  he tags.....    
4400: 23 20 61 73 73 6f 63 69 61 74 65 64 20 77 69 74  # associated wit
4410: 68 20 74 68 65 20 72 65 76 69 73 69 6f 6e 2e 0a  h the revision..
4420: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 73      variable mys
4430: 79 6d 62 6f 6c 73 20 20 20 20 20 20 20 20 20 7b  ymbols         {
4440: 7d 20 3b 20 23 20 53 65 74 20 6f 66 20 74 68 65  } ; # Set of the
4450: 20 73 79 6d 62 6f 6c 20 6e 61 6d 65 73 20 66 6f   symbol names fo
4460: 75 6e 64 20 69 6e 0a 09 09 09 09 20 20 20 20 23  und in.....    #
4470: 20 74 68 69 73 20 66 69 6c 65 2e 0a 0a 20 20 20   this file...   
4480: 20 76 61 72 69 61 62 6c 65 20 6d 79 62 72 61 6e   variable mybran
4490: 63 68 63 6e 74 20 30 20 3b 20 23 20 43 6f 75 6e  chcnt 0 ; # Coun
44a0: 74 65 72 20 66 6f 72 20 62 72 61 6e 63 68 65 73  ter for branches
44b0: 2c 20 74 6f 20 72 65 63 6f 72 64 20 74 68 65 69  , to record thei
44c0: 72 0a 09 09 09 20 20 20 20 20 23 20 6f 72 64 65  r....     # orde
44d0: 72 20 6f 66 20 64 65 66 69 6e 69 74 69 6f 6e 2e  r of definition.
44e0: 20 54 68 69 73 20 61 6c 73 6f 20 64 65 66 69 6e   This also defin
44f0: 65 73 0a 09 09 09 20 20 20 20 20 23 20 74 68 65  es....     # the
4500: 69 72 20 6f 72 64 65 72 20 6f 66 20 63 72 65 61  ir order of crea
4510: 74 69 6f 6e 2c 20 77 68 69 63 68 20 69 73 20 74  tion, which is t
4520: 68 65 0a 09 09 09 20 20 20 20 20 23 20 72 65 76  he....     # rev
4530: 65 72 73 65 20 6f 66 20 64 65 66 69 6e 69 74 69  erse of definiti
4540: 6f 6e 2e 20 20 49 2e 65 2e 20 61 20 73 6d 61 6c  on.  I.e. a smal
4550: 6c 65 72 0a 09 09 09 20 20 20 20 20 23 20 6e 75  ler....     # nu
4560: 6d 62 65 72 20 6d 65 61 6e 73 20 27 44 65 66 69  mber means 'Defi
4570: 6e 65 64 20 65 61 72 6c 69 65 72 27 2c 20 6d 65  ned earlier', me
4580: 61 6e 73 0a 09 09 09 20 20 20 20 20 23 20 27 43  ans....     # 'C
4590: 72 65 61 74 65 64 20 6c 61 74 65 72 27 2e 0a 0a  reated later'...
45a0: 20 20 20 20 76 61 72 69 61 62 6c 65 20 6d 79 74      variable myt
45b0: 72 75 6e 6b 20 7b 7d 20 3b 20 23 20 44 69 72 65  runk {} ; # Dire
45c0: 63 74 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ct reference to 
45d0: 6d 79 70 72 6f 6a 65 63 74 20 2d 3e 20 74 72 75  myproject -> tru
45e0: 6e 6b 2e 0a 20 20 20 20 76 61 72 69 61 62 6c 65  nk..    variable
45f0: 20 6d 79 72 6f 6f 74 73 20 7b 7d 20 3b 20 23 20   myroots {} ; # 
4600: 4c 69 73 74 20 6f 66 20 72 6f 6f 74 73 20 69 6e  List of roots in
4610: 20 74 68 65 20 66 6f 72 65 73 74 20 6f 66 0a 09   the forest of..
4620: 09 09 20 20 23 20 6c 6f 64 27 73 2e 20 4f 62 6a  ..  # lod's. Obj
4630: 65 63 74 20 72 65 66 65 72 65 6e 63 65 73 20 74  ect references t
4640: 6f 20 72 65 76 69 73 69 6f 6e 73 20 61 6e 64 0a  o revisions and.
4650: 09 09 09 20 20 23 20 62 72 61 6e 63 68 65 73 2e  ...  # branches.
4660: 20 54 68 65 20 6c 61 74 74 65 72 20 63 61 6e 20   The latter can 
4670: 61 70 70 65 61 72 20 77 68 65 6e 20 74 68 65 79  appear when they
4680: 0a 09 09 09 20 20 23 20 61 72 65 20 73 65 76 65  ....  # are seve
4690: 72 65 64 20 66 72 6f 6d 20 74 68 65 69 72 20 70  red from their p
46a0: 61 72 65 6e 74 2e 0a 0a 20 20 20 20 23 20 23 20  arent...    # # 
46b0: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
46c0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
46d0: 23 23 23 0a 20 20 20 20 23 23 20 49 6e 74 65 72  ###.    ## Inter
46e0: 6e 61 6c 20 6d 65 74 68 6f 64 73 0a 0a 20 20 20  nal methods..   
46f0: 20 6d 65 74 68 6f 64 20 52 65 63 6f 72 64 42 72   method RecordBr
4700: 61 6e 63 68 43 6f 6d 6d 69 74 73 20 7b 62 72 61  anchCommits {bra
4710: 6e 63 68 65 73 7d 20 7b 0a 09 66 6f 72 65 61 63  nches} {..foreac
4720: 68 20 62 72 61 6e 63 68 72 65 76 6e 72 20 24 62  h branchrevnr $b
4730: 72 61 6e 63 68 65 73 20 7b 0a 09 20 20 20 20 69  ranches {..    i
4740: 66 20 7b 5b 63 61 74 63 68 20 7b 0a 09 09 73 65  f {[catch {...se
4750: 74 20 62 72 61 6e 63 68 20 5b 24 73 65 6c 66 20  t branch [$self 
4760: 52 65 76 32 42 72 61 6e 63 68 20 24 62 72 61 6e  Rev2Branch $bran
4770: 63 68 72 65 76 6e 72 5d 0a 09 20 20 20 20 7d 5d  chrevnr]..    }]
4780: 7d 20 7b 0a 09 09 73 65 74 20 62 72 61 6e 63 68  } {...set branch
4790: 20 5b 24 73 65 6c 66 20 41 64 64 55 6e 6c 61 62   [$self AddUnlab
47a0: 65 6c 65 64 42 72 61 6e 63 68 20 5b 72 65 76 20  eledBranch [rev 
47b0: 32 62 72 61 6e 63 68 6e 72 20 24 62 72 61 6e 63  2branchnr $branc
47c0: 68 72 65 76 6e 72 5d 5d 0a 09 20 20 20 20 7d 0a  hrevnr]]..    }.
47d0: 0a 09 20 20 20 20 23 20 52 65 63 6f 72 64 20 74  ..    # Record t
47e0: 68 65 20 63 6f 6d 6d 69 74 2c 20 6a 75 73 74 20  he commit, just 
47f0: 61 73 20 72 65 76 69 73 69 6f 6e 20 6e 75 6d 62  as revision numb
4800: 65 72 20 66 6f 72 0a 09 20 20 20 20 23 20 6e 6f  er for..    # no
4810: 77 2e 20 50 72 6f 63 65 73 42 72 61 6e 63 68 44  w. ProcesBranchD
4820: 65 70 65 6e 64 65 6e 63 69 65 73 20 77 69 6c 6c  ependencies will
4830: 20 65 78 74 65 6e 64 20 74 68 61 74 20 69 74 6f   extend that ito
4840: 20 61 0a 09 20 20 20 20 23 20 70 72 6f 70 65 72   a..    # proper
4850: 20 6f 62 6a 65 63 74 20 72 65 66 65 72 65 6e 63   object referenc
4860: 65 2e 0a 0a 09 20 20 20 20 24 62 72 61 6e 63 68  e....    $branch
4870: 20 73 65 74 63 68 69 6c 64 72 65 76 6e 72 20 24   setchildrevnr $
4880: 62 72 61 6e 63 68 72 65 76 6e 72 0a 09 7d 0a 09  branchrevnr..}..
4890: 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20  return.    }..  
48a0: 20 20 6d 65 74 68 6f 64 20 52 65 76 32 42 72 61    method Rev2Bra
48b0: 6e 63 68 20 7b 72 65 76 6e 72 7d 20 7b 0a 20 20  nch {revnr} {.  
48c0: 20 20 20 20 20 20 69 6e 74 65 67 72 69 74 79 20        integrity 
48d0: 61 73 73 65 72 74 20 7b 21 5b 72 65 76 20 69 73  assert {![rev is
48e0: 74 72 75 6e 6b 72 65 76 6e 72 20 24 72 65 76 6e  trunkrevnr $revn
48f0: 72 5d 7d 20 7b 45 78 70 65 63 74 65 64 20 61 20  r]} {Expected a 
4900: 62 72 61 6e 63 68 20 72 65 76 69 73 69 6f 6e 20  branch revision 
4910: 6e 75 6d 62 65 72 7d 0a 09 72 65 74 75 72 6e 20  number}..return 
4920: 24 6d 79 62 72 61 6e 63 68 65 73 28 5b 72 65 76  $mybranches([rev
4930: 20 32 62 72 61 6e 63 68 6e 72 20 24 72 65 76 6e   2branchnr $revn
4940: 72 5d 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d  r]).    }..    m
4950: 65 74 68 6f 64 20 41 64 64 55 6e 6c 61 62 65 6c  ethod AddUnlabel
4960: 65 64 42 72 61 6e 63 68 20 7b 62 72 61 6e 63 68  edBranch {branch
4970: 6e 72 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b 24  nr} {..return [$
4980: 73 65 6c 66 20 41 64 64 42 72 61 6e 63 68 20 75  self AddBranch u
4990: 6e 6c 61 62 65 6c 65 64 2d 24 62 72 61 6e 63 68  nlabeled-$branch
49a0: 6e 72 20 24 62 72 61 6e 63 68 6e 72 5d 0a 20 20  nr $branchnr].  
49b0: 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20    }..    method 
49c0: 41 64 64 42 72 61 6e 63 68 20 7b 6e 61 6d 65 20  AddBranch {name 
49d0: 62 72 61 6e 63 68 6e 72 7d 20 7b 0a 09 69 66 20  branchnr} {..if 
49e0: 7b 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 6d 79  {[info exists my
49f0: 62 72 61 6e 63 68 65 73 28 24 62 72 61 6e 63 68  branches($branch
4a00: 6e 72 29 5d 7d 20 7b 0a 09 20 20 20 20 6c 6f 67  nr)]} {..    log
4a10: 20 77 72 69 74 65 20 31 20 66 69 6c 65 20 22 49   write 1 file "I
4a20: 6e 20 27 24 6d 79 70 61 74 68 27 3a 20 42 72 61  n '$mypath': Bra
4a30: 6e 63 68 20 27 24 62 72 61 6e 63 68 6e 72 27 20  nch '$branchnr' 
4a40: 6e 61 6d 65 64 20 27 5b 24 6d 79 62 72 61 6e 63  named '[$mybranc
4a50: 68 65 73 28 24 62 72 61 6e 63 68 6e 72 29 20 6e  hes($branchnr) n
4a60: 61 6d 65 5d 27 22 0a 09 20 20 20 20 6c 6f 67 20  ame]'"..    log 
4a70: 77 72 69 74 65 20 31 20 66 69 6c 65 20 22 43 61  write 1 file "Ca
4a80: 6e 6e 6f 74 20 68 61 76 65 20 73 65 63 6f 6e 64  nnot have second
4a90: 20 6e 61 6d 65 20 27 24 6e 61 6d 65 27 2c 20 69   name '$name', i
4aa0: 67 6e 6f 72 69 6e 67 20 69 74 22 0a 09 20 20 20  gnoring it"..   
4ab0: 20 72 65 74 75 72 6e 0a 09 7d 0a 09 73 65 74 20   return..}..set 
4ac0: 62 72 61 6e 63 68 20 5b 73 79 6d 20 25 41 55 54  branch [sym %AUT
4ad0: 4f 25 20 62 72 61 6e 63 68 20 24 62 72 61 6e 63  O% branch $branc
4ae0: 68 6e 72 20 5b 24 6d 79 70 72 6f 6a 65 63 74 20  hnr [$myproject 
4af0: 67 65 74 73 79 6d 62 6f 6c 20 24 6e 61 6d 65 5d  getsymbol $name]
4b00: 20 24 73 65 6c 66 5d 0a 09 24 62 72 61 6e 63 68   $self]..$branch
4b10: 20 73 65 74 70 6f 73 69 74 69 6f 6e 20 5b 69 6e   setposition [in
4b20: 63 72 20 6d 79 62 72 61 6e 63 68 63 6e 74 5d 0a  cr mybranchcnt].
4b30: 09 73 65 74 20 6d 79 62 72 61 6e 63 68 65 73 28  .set mybranches(
4b40: 24 62 72 61 6e 63 68 6e 72 29 20 24 62 72 61 6e  $branchnr) $bran
4b50: 63 68 0a 09 72 65 74 75 72 6e 20 24 62 72 61 6e  ch..return $bran
4b60: 63 68 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65  ch.    }..    me
4b70: 74 68 6f 64 20 41 64 64 54 61 67 20 7b 6e 61 6d  thod AddTag {nam
4b80: 65 20 72 65 76 6e 72 7d 20 7b 0a 09 73 65 74 20  e revnr} {..set 
4b90: 74 61 67 20 5b 73 79 6d 20 25 41 55 54 4f 25 20  tag [sym %AUTO% 
4ba0: 74 61 67 20 24 72 65 76 6e 72 20 5b 24 6d 79 70  tag $revnr [$myp
4bb0: 72 6f 6a 65 63 74 20 67 65 74 73 79 6d 62 6f 6c  roject getsymbol
4bc0: 20 24 6e 61 6d 65 5d 20 24 73 65 6c 66 5d 0a 09   $name] $self]..
4bd0: 6c 61 70 70 65 6e 64 20 6d 79 74 61 67 73 28 24  lappend mytags($
4be0: 72 65 76 6e 72 29 20 24 74 61 67 0a 09 72 65 74  revnr) $tag..ret
4bf0: 75 72 6e 20 24 74 61 67 0a 20 20 20 20 7d 0a 0a  urn $tag.    }..
4c00: 20 20 20 20 6d 65 74 68 6f 64 20 52 65 63 6f 72      method Recor
4c10: 64 42 61 73 69 63 44 65 70 65 6e 64 65 6e 63 69  dBasicDependenci
4c20: 65 73 20 7b 72 65 76 6e 72 20 6e 65 78 74 7d 20  es {revnr next} 
4c30: 7b 0a 09 23 20 48 61 6e 64 6c 65 20 74 68 65 20  {..# Handle the 
4c40: 72 65 76 69 73 69 6f 6e 20 64 65 70 65 6e 64 65  revision depende
4c50: 6e 63 69 65 73 2e 20 52 65 63 6f 72 64 20 74 68  ncies. Record th
4c60: 65 6d 20 66 6f 72 20 6e 6f 77 2c 20 64 6f 0a 09  em for now, do..
4c70: 23 20 6e 6f 74 68 69 6e 67 20 77 69 74 68 20 74  # nothing with t
4c80: 68 65 6d 20 79 65 74 2e 0a 0a 09 23 20 4f 6e 20  hem yet....# On 
4c90: 74 68 65 20 74 72 75 6e 6b 20 74 68 65 20 27 6e  the trunk the 'n
4ca0: 65 78 74 27 20 66 69 65 6c 64 20 70 6f 69 6e 74  ext' field point
4cb0: 73 20 74 6f 20 74 68 65 20 70 72 65 76 69 6f 75  s to the previou
4cc0: 73 0a 09 23 20 72 65 76 69 73 69 6f 6e 2c 20 69  s..# revision, i
4cd0: 2e 65 2e 20 74 68 65 20 5f 70 61 72 65 6e 74 5f  .e. the _parent_
4ce0: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
4cf0: 6f 6e 65 2e 20 45 78 61 6d 70 6c 65 3a 0a 09 23  one. Example:..#
4d00: 20 31 2e 36 27 73 20 6e 65 78 74 20 69 73 20 31   1.6's next is 1
4d10: 2e 35 20 28 6d 6f 64 75 6c 6f 20 63 76 73 20 61  .5 (modulo cvs a
4d20: 64 6d 69 6e 20 2d 6f 29 2e 0a 0a 09 23 20 43 6f  dmin -o)....# Co
4d30: 6e 74 72 61 72 69 6c 79 20 6f 6e 20 61 20 62 72  ntrarily on a br
4d40: 61 6e 63 68 20 74 68 65 20 27 6e 65 78 74 27 20  anch the 'next' 
4d50: 66 69 65 6c 64 20 70 6f 69 6e 74 73 20 74 6f 20  field points to 
4d60: 74 68 65 0a 09 23 20 70 72 69 6d 61 72 79 20 5f  the..# primary _
4d70: 63 68 69 6c 64 5f 20 6f 66 20 74 68 65 20 63 75  child_ of the cu
4d80: 72 72 65 6e 74 20 72 65 76 69 73 69 6f 6e 2e 20  rrent revision. 
4d90: 41 73 20 65 78 61 6d 70 6c 65 2c 0a 09 23 20 31  As example,..# 1
4da0: 2e 31 2e 33 2e 32 27 73 20 27 6e 65 78 74 27 20  .1.3.2's 'next' 
4db0: 77 69 6c 6c 20 62 65 20 31 2e 31 2e 33 2e 33 2e  will be 1.1.3.3.
4dc0: 0a 0a 09 23 20 54 68 65 20 27 6e 65 78 74 27 20  ...# The 'next' 
4dd0: 66 69 65 6c 64 20 61 63 74 75 61 6c 6c 79 20 61  field actually a
4de0: 6c 77 61 79 73 20 72 65 66 65 72 73 20 74 6f 20  lways refers to 
4df0: 74 68 65 20 72 65 76 69 73 69 6f 6e 0a 09 23 20  the revision..# 
4e00: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 64  containing the d
4e10: 65 6c 74 61 20 6e 65 65 64 65 64 20 74 6f 20 72  elta needed to r
4e20: 65 74 72 69 65 76 65 20 74 68 61 74 20 72 65 76  etrieve that rev
4e30: 69 73 69 6f 6e 2e 0a 0a 09 23 20 54 68 65 20 64  ision....# The d
4e40: 65 70 65 6e 64 65 6e 63 69 65 73 20 6e 65 65 64  ependencies need
4e50: 65 64 20 68 65 72 65 20 61 72 65 20 74 68 65 20  ed here are the 
4e60: 6c 6f 67 69 63 61 6c 20 73 74 72 75 63 74 75 72  logical structur
4e70: 65 2c 0a 09 23 20 70 61 72 65 6e 74 2f 63 68 69  e,..# parent/chi
4e80: 6c 64 2c 20 61 6e 64 20 6e 6f 74 20 74 68 65 20  ld, and not the 
4e90: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 64  implementation d
4ea0: 65 70 65 6e 64 65 6e 74 20 64 65 6c 74 61 0a 09  ependent delta..
4eb0: 23 20 70 6f 69 6e 74 65 72 73 2e 0a 0a 09 69 66  # pointers....if
4ec0: 20 7b 24 6e 65 78 74 20 65 71 20 22 22 7d 20 72   {$next eq ""} r
4ed0: 65 74 75 72 6e 0a 09 23 20 20 20 20 20 20 20 20  eturn..#        
4ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4ef0: 20 20 70 61 72 65 6e 74 20 2d 3e 20 63 68 69 6c    parent -> chil
4f00: 64 0a 09 69 66 20 7b 5b 72 65 76 20 69 73 74 72  d..if {[rev istr
4f10: 75 6e 6b 72 65 76 6e 72 20 24 72 65 76 6e 72 5d  unkrevnr $revnr]
4f20: 7d 20 7b 0a 09 20 20 20 20 6c 61 70 70 65 6e 64  } {..    lappend
4f30: 20 6d 79 64 65 70 65 6e 64 65 6e 63 69 65 73 20   mydependencies 
4f40: 24 6e 65 78 74 20 24 72 65 76 6e 72 0a 09 7d 20  $next $revnr..} 
4f50: 65 6c 73 65 20 7b 0a 09 20 20 20 20 6c 61 70 70  else {..    lapp
4f60: 65 6e 64 20 6d 79 64 65 70 65 6e 64 65 6e 63 69  end mydependenci
4f70: 65 73 20 24 72 65 76 6e 72 20 24 6e 65 78 74 0a  es $revnr $next.
4f80: 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d  .}..return.    }
4f90: 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 50 72 6f  ..    method Pro
4fa0: 63 65 73 73 50 72 69 6d 61 72 79 44 65 70 65 6e  cessPrimaryDepen
4fb0: 64 65 6e 63 69 65 73 20 7b 7d 20 7b 0a 09 66 6f  dencies {} {..fo
4fc0: 72 65 61 63 68 20 7b 70 61 72 65 6e 74 72 65 76  reach {parentrev
4fd0: 6e 72 20 63 68 69 6c 64 72 65 76 6e 72 7d 20 24  nr childrevnr} $
4fe0: 6d 79 64 65 70 65 6e 64 65 6e 63 69 65 73 20 7b  mydependencies {
4ff0: 0a 09 20 20 20 20 73 65 74 20 70 61 72 65 6e 74  ..    set parent
5000: 20 24 6d 79 72 65 76 28 24 70 61 72 65 6e 74 72   $myrev($parentr
5010: 65 76 6e 72 29 0a 09 20 20 20 20 73 65 74 20 63  evnr)..    set c
5020: 68 69 6c 64 20 20 24 6d 79 72 65 76 28 24 63 68  hild  $myrev($ch
5030: 69 6c 64 72 65 76 6e 72 29 0a 09 20 20 20 20 24  ildrevnr)..    $
5040: 70 61 72 65 6e 74 20 73 65 74 63 68 69 6c 64 20  parent setchild 
5050: 24 63 68 69 6c 64 0a 09 20 20 20 20 24 63 68 69  $child..    $chi
5060: 6c 64 20 73 65 74 70 61 72 65 6e 74 20 24 70 61  ld setparent $pa
5070: 72 65 6e 74 0a 09 7d 0a 09 72 65 74 75 72 6e 0a  rent..}..return.
5080: 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f      }..    metho
5090: 64 20 50 72 6f 63 65 73 73 42 72 61 6e 63 68 44  d ProcessBranchD
50a0: 65 70 65 6e 64 65 6e 63 69 65 73 20 7b 7d 20 7b  ependencies {} {
50b0: 0a 09 66 6f 72 65 61 63 68 20 7b 62 72 61 6e 63  ..foreach {branc
50c0: 68 6e 72 20 62 72 61 6e 63 68 7d 20 5b 61 72 72  hnr branch} [arr
50d0: 61 79 20 67 65 74 20 6d 79 62 72 61 6e 63 68 65  ay get mybranche
50e0: 73 5d 20 7b 0a 09 20 20 20 20 73 65 74 20 72 65  s] {..    set re
50f0: 76 6e 72 20 5b 24 62 72 61 6e 63 68 20 70 61 72  vnr [$branch par
5100: 65 6e 74 72 65 76 6e 72 5d 0a 0a 09 20 20 20 20  entrevnr]...    
5110: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
5120: 73 20 6d 79 72 65 76 28 24 72 65 76 6e 72 29 5d  s myrev($revnr)]
5130: 7d 20 7b 0a 09 09 6c 6f 67 20 77 72 69 74 65 20  } {...log write 
5140: 31 20 66 69 6c 65 20 22 49 6e 20 27 24 6d 79 70  1 file "In '$myp
5150: 61 74 68 27 3a 20 54 68 65 20 62 72 61 6e 63 68  ath': The branch
5160: 20 27 5b 24 62 72 61 6e 63 68 20 6e 61 6d 65 5d   '[$branch name]
5170: 27 20 72 65 66 65 72 65 6e 63 65 73 22 0a 09 09  ' references"...
5180: 6c 6f 67 20 77 72 69 74 65 20 31 20 66 69 6c 65  log write 1 file
5190: 20 22 74 68 65 20 62 6f 67 75 73 20 72 65 76 69   "the bogus revi
51a0: 73 69 6f 6e 20 27 24 72 65 76 6e 72 27 20 61 6e  sion '$revnr' an
51b0: 64 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f 72 65  d will be ignore
51c0: 64 2e 22 0a 09 09 24 62 72 61 6e 63 68 20 64 65  d."...$branch de
51d0: 73 74 72 6f 79 0a 09 09 75 6e 73 65 74 20 6d 79  stroy...unset my
51e0: 62 72 61 6e 63 68 65 73 28 24 62 72 61 6e 63 68  branches($branch
51f0: 6e 72 29 0a 09 20 20 20 20 7d 20 65 6c 73 65 20  nr)..    } else 
5200: 7b 0a 09 09 73 65 74 20 72 65 76 20 24 6d 79 72  {...set rev $myr
5210: 65 76 28 24 72 65 76 6e 72 29 0a 09 09 24 72 65  ev($revnr)...$re
5220: 76 20 61 64 64 62 72 61 6e 63 68 20 24 62 72 61  v addbranch $bra
5230: 6e 63 68 0a 09 09 24 62 72 61 6e 63 68 20 73 65  nch...$branch se
5240: 74 70 61 72 65 6e 74 20 24 72 65 76 0a 0a 09 09  tparent $rev....
5250: 23 20 49 66 20 72 65 76 69 73 69 6f 6e 73 20 77  # If revisions w
5260: 65 72 65 20 63 6f 6d 6d 69 74 74 65 64 20 6f 6e  ere committed on
5270: 20 74 68 65 20 62 72 61 6e 63 68 20 77 65 20 73   the branch we s
5280: 74 6f 72 65 20 61 0a 09 09 23 20 72 65 66 65 72  tore a...# refer
5290: 65 6e 63 65 20 74 6f 20 74 68 65 20 62 72 61 6e  ence to the bran
52a0: 63 68 20 74 68 65 72 65 2c 20 61 6e 64 20 66 75  ch there, and fu
52b0: 72 74 68 65 72 20 64 65 63 6c 61 72 65 0a 09 09  rther declare...
52c0: 23 20 74 68 65 20 66 69 72 73 74 20 63 68 69 6c  # the first chil
52d0: 64 27 73 20 70 61 72 65 6e 74 20 74 6f 20 62 65  d's parent to be
52e0: 20 62 72 61 6e 63 68 27 73 20 70 61 72 65 6e 74   branch's parent
52f0: 2c 20 61 6e 64 0a 09 09 23 20 6c 69 73 74 20 74  , and...# list t
5300: 68 69 73 20 63 68 69 6c 64 20 69 6e 20 74 68 65  his child in the
5310: 20 70 61 72 65 6e 74 20 72 65 76 69 73 69 6f 6e   parent revision
5320: 2e 0a 0a 09 09 69 66 20 7b 5b 24 62 72 61 6e 63  .....if {[$branc
5330: 68 20 68 61 73 63 68 69 6c 64 72 65 76 5d 7d 20  h haschildrev]} 
5340: 7b 0a 09 09 20 20 20 20 73 65 74 20 63 68 69 6c  {...    set chil
5350: 64 72 65 76 6e 72 20 5b 24 62 72 61 6e 63 68 20  drevnr [$branch 
5360: 63 68 69 6c 64 72 65 76 6e 72 5d 0a 09 09 20 20  childrevnr]...  
5370: 20 20 73 65 74 20 63 68 69 6c 64 20 24 6d 79 72    set child $myr
5380: 65 76 28 24 63 68 69 6c 64 72 65 76 6e 72 29 0a  ev($childrevnr).
5390: 09 09 20 20 20 20 24 62 72 61 6e 63 68 20 73 65  ..    $branch se
53a0: 74 63 68 69 6c 64 20 24 63 68 69 6c 64 0a 0a 09  tchild $child...
53b0: 09 20 20 20 20 24 63 68 69 6c 64 20 73 65 74 70  .    $child setp
53c0: 61 72 65 6e 74 62 72 61 6e 63 68 20 24 62 72 61  arentbranch $bra
53d0: 6e 63 68 0a 09 09 20 20 20 20 24 63 68 69 6c 64  nch...    $child
53e0: 20 73 65 74 70 61 72 65 6e 74 20 20 20 20 20 20   setparent      
53f0: 20 24 72 65 76 0a 09 09 20 20 20 20 24 72 65 76   $rev...    $rev
5400: 20 61 64 64 63 68 69 6c 64 6f 6e 62 72 61 6e 63   addchildonbranc
5410: 68 20 24 63 68 69 6c 64 0a 09 09 7d 0a 09 20 20  h $child...}..  
5420: 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20    }..}..return. 
5430: 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64     }..    method
5440: 20 53 6f 72 74 42 72 61 6e 63 68 65 73 20 7b 7d   SortBranches {}
5450: 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b 72 65 76   {..foreach {rev
5460: 6e 72 20 72 65 76 7d 20 5b 61 72 72 61 79 20 67  nr rev} [array g
5470: 65 74 20 6d 79 72 65 76 5d 20 7b 20 24 72 65 76  et myrev] { $rev
5480: 20 73 6f 72 74 62 72 61 6e 63 68 65 73 20 7d 0a   sortbranches }.
5490: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
54a0: 20 20 20 6d 65 74 68 6f 64 20 50 72 6f 63 65 73     method Proces
54b0: 73 54 61 67 44 65 70 65 6e 64 65 6e 63 69 65 73  sTagDependencies
54c0: 20 7b 7d 20 7b 0a 09 66 6f 72 65 61 63 68 20 7b   {} {..foreach {
54d0: 72 65 76 6e 72 20 74 61 67 6c 69 73 74 7d 20 5b  revnr taglist} [
54e0: 61 72 72 61 79 20 67 65 74 20 6d 79 74 61 67 73  array get mytags
54f0: 5d 20 7b 0a 09 20 20 20 20 69 66 20 7b 21 5b 69  ] {..    if {![i
5500: 6e 66 6f 20 65 78 69 73 74 73 20 6d 79 72 65 76  nfo exists myrev
5510: 28 24 72 65 76 6e 72 29 5d 7d 20 7b 0a 09 09 73  ($revnr)]} {...s
5520: 65 74 20 6e 20 5b 6c 6c 65 6e 67 74 68 20 24 74  et n [llength $t
5530: 61 67 6c 69 73 74 5d 0a 09 09 6c 6f 67 20 77 72  aglist]...log wr
5540: 69 74 65 20 31 20 66 69 6c 65 20 22 49 6e 20 27  ite 1 file "In '
5550: 24 6d 79 70 61 74 68 27 3a 20 54 68 65 20 66 6f  $mypath': The fo
5560: 6c 6c 6f 77 69 6e 67 20 5b 6e 73 70 20 24 6e 20  llowing [nsp $n 
5570: 74 61 67 5d 20 72 65 66 65 72 65 6e 63 65 22 0a  tag] reference".
5580: 09 09 6c 6f 67 20 77 72 69 74 65 20 31 20 66 69  ..log write 1 fi
5590: 6c 65 20 22 74 68 65 20 62 6f 67 75 73 20 72 65  le "the bogus re
55a0: 76 69 73 69 6f 6e 20 27 24 72 65 76 6e 72 27 20  vision '$revnr' 
55b0: 61 6e 64 20 77 69 6c 6c 20 62 65 20 69 67 6e 6f  and will be igno
55c0: 72 65 64 2e 22 0a 09 09 66 6f 72 65 61 63 68 20  red."...foreach 
55d0: 74 61 67 20 24 74 61 67 6c 69 73 74 20 7b 0a 09  tag $taglist {..
55e0: 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 31  .    log write 1
55f0: 20 66 69 6c 65 20 22 20 20 20 20 5b 24 74 61 67   file "    [$tag
5600: 20 6e 61 6d 65 5d 22 0a 09 09 20 20 20 20 24 74   name]"...    $t
5610: 61 67 20 64 65 73 74 72 6f 79 0a 09 09 7d 0a 09  ag destroy...}..
5620: 09 75 6e 73 65 74 20 6d 79 74 61 67 73 28 24 72  .unset mytags($r
5630: 65 76 6e 72 29 0a 09 20 20 20 20 7d 20 65 6c 73  evnr)..    } els
5640: 65 20 7b 0a 09 09 73 65 74 20 72 65 76 20 24 6d  e {...set rev $m
5650: 79 72 65 76 28 24 72 65 76 6e 72 29 0a 09 09 66  yrev($revnr)...f
5660: 6f 72 65 61 63 68 20 74 61 67 20 24 74 61 67 6c  oreach tag $tagl
5670: 69 73 74 20 7b 0a 09 09 20 20 20 20 24 72 65 76  ist {...    $rev
5680: 20 61 64 64 74 61 67 20 20 20 20 24 74 61 67 0a   addtag    $tag.
5690: 09 09 20 20 20 20 24 74 61 67 20 73 65 74 74 61  ..    $tag setta
56a0: 67 72 65 76 20 24 72 65 76 0a 09 09 7d 0a 09 20  grev $rev...}.. 
56b0: 20 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a     }..}..return.
56c0: 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f      }..    metho
56d0: 64 20 44 65 74 65 72 6d 69 6e 65 54 68 65 52 6f  d DetermineTheRo
56e0: 6f 74 52 65 76 69 73 69 6f 6e 20 7b 7d 20 7b 0a  otRevision {} {.
56f0: 09 23 20 54 68 65 20 72 6f 6f 74 20 69 73 20 74  .# The root is t
5700: 68 65 20 6f 6e 65 20 72 65 76 69 73 69 6f 6e 20  he one revision 
5710: 77 68 69 63 68 20 68 61 73 20 6e 6f 20 70 61 72  which has no par
5720: 65 6e 74 2e 20 42 79 0a 09 23 20 63 68 65 63 6b  ent. By..# check
5730: 69 6e 67 20 61 6c 6c 20 72 65 76 69 73 69 6f 6e  ing all revision
5740: 73 20 77 65 20 65 6e 73 75 72 65 20 74 68 61 74  s we ensure that
5750: 20 77 65 20 63 61 6e 20 64 65 74 65 63 74 20 61   we can detect a
5760: 6e 64 0a 09 23 20 72 65 70 6f 72 74 20 74 68 65  nd..# report the
5770: 20 63 61 73 65 20 6f 66 20 6d 75 6c 74 69 70 6c   case of multipl
5780: 65 20 72 6f 6f 74 73 2e 20 57 69 74 68 6f 75 74  e roots. Without
5790: 20 74 68 61 74 20 77 65 20 63 6f 75 6c 64 0a 09   that we could..
57a0: 23 20 73 69 6d 70 6c 79 20 74 61 6b 65 20 6f 6e  # simply take on
57b0: 65 20 72 65 76 69 73 69 6f 6e 20 61 6e 64 20 66  e revision and f
57c0: 6f 6c 6c 6f 77 20 74 68 65 20 70 61 72 65 6e 74  ollow the parent
57d0: 20 6c 69 6e 6b 73 20 74 6f 0a 09 23 20 74 68 65   links to..# the
57e0: 69 72 20 72 6f 6f 74 20 28 73 69 63 21 29 2e 0a  ir root (sic!)..
57f0: 0a 09 66 6f 72 65 61 63 68 20 7b 72 65 76 6e 72  ..foreach {revnr
5800: 20 72 65 76 7d 20 5b 61 72 72 61 79 20 67 65 74   rev} [array get
5810: 20 6d 79 72 65 76 5d 20 7b 0a 09 20 20 20 20 69   myrev] {..    i
5820: 66 20 7b 5b 24 72 65 76 20 68 61 73 70 61 72 65  f {[$rev haspare
5830: 6e 74 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 20  nt]} continue.. 
5840: 20 20 20 69 6e 74 65 67 72 69 74 79 20 61 73 73     integrity ass
5850: 65 72 74 20 7b 24 6d 79 72 6f 6f 74 20 65 71 20  ert {$myroot eq 
5860: 22 22 7d 20 7b 4d 75 6c 74 69 70 6c 65 20 72 6f  ""} {Multiple ro
5870: 6f 74 20 72 65 76 69 73 69 6f 6e 73 20 66 6f 75  ot revisions fou
5880: 6e 64 7d 0a 09 20 20 20 20 73 65 74 20 6d 79 72  nd}..    set myr
5890: 6f 6f 74 20 24 72 65 76 0a 09 7d 0a 0a 09 23 20  oot $rev..}...# 
58a0: 49 6e 20 74 68 65 20 66 75 74 75 72 65 20 77 65  In the future we
58b0: 20 61 6c 73 6f 20 6e 65 65 64 20 61 20 6c 69 73   also need a lis
58c0: 74 2c 20 61 73 20 62 72 61 6e 63 68 65 73 20 63  t, as branches c
58d0: 61 6e 20 62 65 63 6f 6d 65 0a 09 23 20 73 65 76  an become..# sev
58e0: 65 72 65 64 20 66 72 6f 6d 20 74 68 65 69 72 20  ered from their 
58f0: 70 61 72 65 6e 74 2c 20 6d 61 6b 69 6e 67 20 74  parent, making t
5900: 68 65 6d 20 74 68 65 69 72 20 6f 77 6e 20 72 6f  hem their own ro
5910: 6f 74 2e 0a 09 73 65 74 20 6d 79 72 6f 6f 74 73  ot...set myroots
5920: 20 5b 6c 69 73 74 20 24 6d 79 72 6f 6f 74 5d 0a   [list $myroot].
5930: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
5940: 20 20 20 6d 65 74 68 6f 64 20 44 65 74 65 72 6d     method Determ
5950: 69 6e 65 52 65 76 69 73 69 6f 6e 4f 70 65 72 61  ineRevisionOpera
5960: 74 69 6f 6e 73 20 7b 7d 20 7b 0a 09 66 6f 72 65  tions {} {..fore
5970: 61 63 68 20 72 65 76 20 24 6d 79 72 65 76 69 73  ach rev $myrevis
5980: 69 6f 6e 73 20 7b 20 24 72 65 76 20 64 65 74 65  ions { $rev dete
5990: 72 6d 69 6e 65 6f 70 65 72 61 74 69 6f 6e 20 7d  rmineoperation }
59a0: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
59b0: 20 20 20 20 6d 65 74 68 6f 64 20 44 65 74 65 72      method Deter
59c0: 6d 69 6e 65 4c 69 6e 65 73 4f 66 44 65 76 65 6c  mineLinesOfDevel
59d0: 6f 70 6d 65 6e 74 20 7b 7d 20 7b 0a 09 23 20 46  opment {} {..# F
59e0: 6f 72 20 72 65 76 69 73 69 6f 6e 73 20 74 68 69  or revisions thi
59f0: 73 20 68 61 73 20 62 65 65 6e 20 64 6f 6e 65 20  s has been done 
5a00: 61 6c 72 65 61 64 79 2c 20 69 6e 20 27 65 78 74  already, in 'ext
5a10: 65 6e 64 27 2e 20 4e 6f 77 0a 09 23 20 77 65 20  end'. Now..# we 
5a20: 64 6f 20 74 68 69 73 20 66 6f 72 20 74 68 65 20  do this for the 
5a30: 62 72 61 6e 63 68 65 73 20 61 6e 64 20 74 61 67  branches and tag
5a40: 73 2e 0a 0a 09 66 6f 72 65 61 63 68 20 7b 5f 20  s....foreach {_ 
5a50: 62 72 61 6e 63 68 7d 20 5b 61 72 72 61 79 20 67  branch} [array g
5a60: 65 74 20 6d 79 62 72 61 6e 63 68 65 73 5d 20 7b  et mybranches] {
5a70: 0a 09 20 20 20 20 24 62 72 61 6e 63 68 20 73 65  ..    $branch se
5a80: 74 6c 6f 64 20 5b 24 73 65 6c 66 20 47 65 74 4c  tlod [$self GetL
5a90: 4f 44 20 5b 24 62 72 61 6e 63 68 20 70 61 72 65  OD [$branch pare
5aa0: 6e 74 72 65 76 6e 72 5d 5d 0a 09 7d 0a 0a 09 66  ntrevnr]]..}...f
5ab0: 6f 72 65 61 63 68 20 7b 5f 20 74 61 67 6c 69 73  oreach {_ taglis
5ac0: 74 7d 20 5b 61 72 72 61 79 20 67 65 74 20 6d 79  t} [array get my
5ad0: 74 61 67 73 5d 20 7b 0a 09 20 20 20 20 66 6f 72  tags] {..    for
5ae0: 65 61 63 68 20 74 61 67 20 24 74 61 67 6c 69 73  each tag $taglis
5af0: 74 20 7b 0a 09 09 24 74 61 67 20 73 65 74 6c 6f  t {...$tag setlo
5b00: 64 20 5b 24 73 65 6c 66 20 47 65 74 4c 4f 44 20  d [$self GetLOD 
5b10: 5b 24 74 61 67 20 74 61 67 72 65 76 6e 72 5d 5d  [$tag tagrevnr]]
5b20: 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72 65 74 75  ..    }..}..retu
5b30: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65  rn.    }..    me
5b40: 74 68 6f 64 20 47 65 74 4c 4f 44 20 7b 72 65 76  thod GetLOD {rev
5b50: 6e 72 7d 20 7b 0a 09 69 66 20 7b 5b 72 65 76 20  nr} {..if {[rev 
5b60: 69 73 74 72 75 6e 6b 72 65 76 6e 72 20 24 72 65  istrunkrevnr $re
5b70: 76 6e 72 5d 7d 20 7b 0a 09 20 20 20 20 72 65 74  vnr]} {..    ret
5b80: 75 72 6e 20 24 6d 79 74 72 75 6e 6b 0a 09 7d 20  urn $mytrunk..} 
5b90: 65 6c 73 65 20 7b 0a 09 20 20 20 20 72 65 74 75  else {..    retu
5ba0: 72 6e 20 5b 24 73 65 6c 66 20 52 65 76 32 42 72  rn [$self Rev2Br
5bb0: 61 6e 63 68 20 24 72 65 76 6e 72 5d 0a 09 7d 0a  anch $revnr]..}.
5bc0: 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f      }..    metho
5bd0: 64 20 48 61 6e 64 6c 65 4e 6f 6e 54 72 75 6e 6b  d HandleNonTrunk
5be0: 44 65 66 61 75 6c 74 42 72 61 6e 63 68 20 7b 7d  DefaultBranch {}
5bf0: 20 7b 0a 09 73 65 74 20 72 65 76 6c 69 73 74 20   {..set revlist 
5c00: 5b 24 73 65 6c 66 20 4e 6f 6e 54 72 75 6e 6b 44  [$self NonTrunkD
5c10: 65 66 61 75 6c 74 52 65 76 69 73 69 6f 6e 73 5d  efaultRevisions]
5c20: 0a 09 69 66 20 7b 21 5b 6c 6c 65 6e 67 74 68 20  ..if {![llength 
5c30: 24 72 65 76 6c 69 73 74 5d 7d 20 72 65 74 75 72  $revlist]} retur
5c40: 6e 0a 0a 09 24 73 65 6c 66 20 41 64 6a 75 73 74  n...$self Adjust
5c50: 4e 6f 6e 54 72 75 6e 6b 44 65 66 61 75 6c 74 42  NonTrunkDefaultB
5c60: 72 61 6e 63 68 20 24 72 65 76 6c 69 73 74 0a 09  ranch $revlist..
5c70: 24 73 65 6c 66 20 43 68 65 63 6b 4c 4f 44 73 0a  $self CheckLODs.
5c80: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
5c90: 20 20 20 6d 65 74 68 6f 64 20 4e 6f 6e 54 72 75     method NonTru
5ca0: 6e 6b 44 65 66 61 75 6c 74 52 65 76 69 73 69 6f  nkDefaultRevisio
5cb0: 6e 73 20 7b 7d 20 7b 0a 09 23 20 46 72 6f 6d 20  ns {} {..# From 
5cc0: 63 76 73 32 73 76 6e 20 74 68 65 20 66 6f 6c 6c  cvs2svn the foll
5cd0: 6f 77 69 6e 67 20 65 78 70 6c 61 6e 61 74 69 6f  owing explanatio
5ce0: 6e 20 28 77 69 74 68 20 6d 6f 64 69 66 69 63 61  n (with modifica
5cf0: 74 69 6f 6e 73 0a 09 23 20 66 6f 72 20 6f 75 72  tions..# for our
5d00: 20 61 6c 67 6f 72 69 74 68 6d 29 3a 0a 0a 09 23   algorithm):...#
5d10: 20 44 65 74 65 72 6d 69 6e 65 20 77 68 65 74 68   Determine wheth
5d20: 65 72 20 74 68 65 72 65 20 61 72 65 20 61 6e 79  er there are any
5d30: 20 6e 6f 6e 2d 74 72 75 6e 6b 20 64 65 66 61 75   non-trunk defau
5d40: 6c 74 20 62 72 61 6e 63 68 0a 09 23 20 72 65 76  lt branch..# rev
5d50: 69 73 69 6f 6e 73 2e 0a 0a 09 23 20 49 66 20 61  isions....# If a
5d60: 20 6e 6f 6e 2d 74 72 75 6e 6b 20 64 65 66 61 75   non-trunk defau
5d70: 6c 74 20 62 72 61 6e 63 68 20 69 73 20 64 65 74  lt branch is det
5d80: 65 72 6d 69 6e 65 64 20 74 6f 20 68 61 76 65 20  ermined to have 
5d90: 65 78 69 73 74 65 64 2c 0a 09 23 20 72 65 74 75  existed,..# retu
5da0: 72 6e 20 61 20 6c 69 73 74 20 6f 66 20 6f 62 6a  rn a list of obj
5db0: 65 63 74 73 20 66 6f 72 20 61 6c 6c 20 72 65 76  ects for all rev
5dc0: 69 73 69 6f 6e 73 20 74 68 61 74 20 77 65 72 65  isions that were
5dd0: 20 6f 6e 63 65 0a 09 23 20 6e 6f 6e 2d 74 72 75   once..# non-tru
5de0: 6e 6b 20 64 65 66 61 75 6c 74 20 72 65 76 69 73  nk default revis
5df0: 69 6f 6e 73 2c 20 69 6e 20 64 65 70 65 6e 64 65  ions, in depende
5e00: 6e 63 79 20 6f 72 64 65 72 20 28 69 2e 65 2e 20  ncy order (i.e. 
5e10: 72 6f 6f 74 0a 09 23 20 66 69 72 73 74 29 2e 0a  root..# first)..
5e20: 0a 09 23 20 54 68 65 72 65 20 61 72 65 20 74 77  ..# There are tw
5e30: 6f 20 63 61 73 65 73 20 74 6f 20 68 61 6e 64 6c  o cases to handl
5e40: 65 3a 0a 0a 09 23 20 4f 6e 65 20 63 61 73 65 20  e:...# One case 
5e50: 69 73 20 73 69 6d 70 6c 65 2e 20 20 54 68 65 20  is simple.  The 
5e60: 52 43 53 20 66 69 6c 65 20 6c 69 73 74 73 20 61  RCS file lists a
5e70: 20 64 65 66 61 75 6c 74 20 62 72 61 6e 63 68 0a   default branch.
5e80: 09 23 20 65 78 70 6c 69 63 69 74 6c 79 20 69 6e  .# explicitly in
5e90: 20 69 74 73 20 68 65 61 64 65 72 2c 20 73 75 63   its header, suc
5ea0: 68 20 61 73 20 27 31 2e 31 2e 31 27 2e 20 20 49  h as '1.1.1'.  I
5eb0: 6e 20 74 68 69 73 20 63 61 73 65 2c 20 77 65 0a  n this case, we.
5ec0: 09 23 20 6b 6e 6f 77 20 74 68 61 74 20 65 76 65  .# know that eve
5ed0: 72 79 20 72 65 76 69 73 69 6f 6e 20 6f 6e 20 74  ry revision on t
5ee0: 68 65 20 76 65 6e 64 6f 72 20 62 72 61 6e 63 68  he vendor branch
5ef0: 20 69 73 20 74 6f 20 62 65 0a 09 23 20 74 72 65   is to be..# tre
5f00: 61 74 65 64 20 61 73 20 68 65 61 64 20 6f 66 20  ated as head of 
5f10: 74 72 75 6e 6b 20 61 74 20 74 68 61 74 20 70 6f  trunk at that po
5f20: 69 6e 74 20 69 6e 20 74 69 6d 65 2e 0a 0a 09 23  int in time....#
5f30: 20 42 75 74 20 74 68 65 72 65 27 73 20 61 6c 73   But there's als
5f40: 6f 20 61 20 64 65 67 65 6e 65 72 61 74 65 20 63  o a degenerate c
5f50: 61 73 65 2e 20 20 54 68 65 20 52 43 53 20 66 69  ase.  The RCS fi
5f60: 6c 65 20 64 6f 65 73 20 6e 6f 74 0a 09 23 20 63  le does not..# c
5f70: 75 72 72 65 6e 74 6c 79 20 68 61 76 65 20 61 20  urrently have a 
5f80: 64 65 66 61 75 6c 74 20 62 72 61 6e 63 68 2c 20  default branch, 
5f90: 79 65 74 20 77 65 20 63 61 6e 20 64 65 64 75 63  yet we can deduc
5fa0: 65 20 74 68 61 74 20 66 6f 72 0a 09 23 20 73 6f  e that for..# so
5fb0: 6d 65 20 70 65 72 69 6f 64 20 69 6e 20 74 68 65  me period in the
5fc0: 20 70 61 73 74 20 69 74 20 70 72 6f 62 61 62 6c   past it probabl
5fd0: 79 20 2a 64 69 64 2a 20 68 61 76 65 20 6f 6e 65  y *did* have one
5fe0: 2e 20 20 46 6f 72 0a 09 23 20 65 78 61 6d 70 6c  .  For..# exampl
5ff0: 65 2c 20 74 68 65 20 66 69 6c 65 20 68 61 73 20  e, the file has 
6000: 76 65 6e 64 6f 72 20 72 65 76 69 73 69 6f 6e 73  vendor revisions
6010: 20 31 2e 31 2e 31 2e 31 20 2d 3e 20 31 2e 31 2e   1.1.1.1 -> 1.1.
6020: 31 2e 39 36 2c 0a 09 23 20 61 6c 6c 20 6f 66 20  1.96,..# all of 
6030: 77 68 69 63 68 20 61 72 65 20 64 61 74 65 64 20  which are dated 
6040: 62 65 66 6f 72 65 20 31 2e 32 2c 20 61 6e 64 20  before 1.2, and 
6050: 74 68 65 6e 20 69 74 20 68 61 73 20 31 2e 31 2e  then it has 1.1.
6060: 31 2e 39 37 0a 09 23 20 2d 3e 20 31 2e 31 2e 31  1.97..# -> 1.1.1
6070: 2e 31 30 30 20 64 61 74 65 64 20 61 66 74 65 72  .100 dated after
6080: 20 31 2e 32 2e 20 20 49 6e 20 74 68 69 73 20 63   1.2.  In this c
6090: 61 73 65 2c 20 77 65 20 73 68 6f 75 6c 64 0a 09  ase, we should..
60a0: 23 20 72 65 63 6f 72 64 20 31 2e 31 2e 31 2e 39  # record 1.1.1.9
60b0: 36 20 61 73 20 74 68 65 20 6c 61 73 74 20 76 65  6 as the last ve
60c0: 6e 64 6f 72 20 72 65 76 69 73 69 6f 6e 20 74 6f  ndor revision to
60d0: 20 68 61 76 65 20 62 65 65 6e 20 74 68 65 0a 09   have been the..
60e0: 23 20 68 65 61 64 20 6f 66 20 74 68 65 20 64 65  # head of the de
60f0: 66 61 75 6c 74 20 62 72 61 6e 63 68 2e 0a 0a 09  fault branch....
6100: 69 66 20 7b 24 6d 79 70 72 69 6e 63 69 70 61 6c  if {$myprincipal
6110: 20 6e 65 20 22 22 7d 20 7b 0a 09 20 20 20 20 23   ne ""} {..    #
6120: 20 54 68 65 72 65 20 69 73 20 73 74 69 6c 6c 20   There is still 
6130: 61 20 64 65 66 61 75 6c 74 20 62 72 61 6e 63 68  a default branch
6140: 3b 20 74 68 61 74 20 6d 65 61 6e 73 20 74 68 61  ; that means tha
6150: 74 20 61 6c 6c 0a 09 20 20 20 20 23 20 72 65 76  t all..    # rev
6160: 69 73 69 6f 6e 73 20 6f 6e 20 74 68 61 74 20 62  isions on that b
6170: 72 61 6e 63 68 20 67 65 74 20 6d 61 72 6b 65 64  ranch get marked
6180: 2e 0a 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74  ....    log writ
6190: 65 20 35 20 66 69 6c 65 20 22 46 6f 75 6e 64 20  e 5 file "Found 
61a0: 65 78 70 6c 69 63 69 74 6c 79 20 6d 61 72 6b 65  explicitly marke
61b0: 64 20 4e 54 44 42 22 0a 0a 09 20 20 20 20 73 65  d NTDB"...    se
61c0: 74 20 72 6e 65 78 74 20 5b 24 6d 79 72 6f 6f 74  t rnext [$myroot
61d0: 20 63 68 69 6c 64 5d 0a 09 20 20 20 20 69 66 20   child]..    if 
61e0: 7b 24 72 6e 65 78 74 20 6e 65 20 22 22 7d 20 7b  {$rnext ne ""} {
61f0: 0a 09 09 74 72 6f 75 62 6c 65 20 66 61 74 61 6c  ...trouble fatal
6200: 20 22 46 69 6c 65 20 77 69 74 68 20 64 65 66 61   "File with defa
6210: 75 6c 74 20 62 72 61 6e 63 68 20 24 6d 79 70 72  ult branch $mypr
6220: 69 6e 63 69 70 61 6c 20 61 6c 73 6f 20 68 61 73  incipal also has
6230: 20 72 65 76 69 73 69 6f 6e 20 5b 24 72 6e 65 78   revision [$rnex
6240: 74 20 72 65 76 6e 72 5d 22 0a 09 09 72 65 74 75  t revnr]"...retu
6250: 72 6e 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20  rn..    }...    
6260: 73 65 74 20 72 65 76 20 5b 24 6d 79 62 72 61 6e  set rev [$mybran
6270: 63 68 65 73 28 24 6d 79 70 72 69 6e 63 69 70 61  ches($myprincipa
6280: 6c 29 20 63 68 69 6c 64 5d 0a 09 20 20 20 20 73  l) child]..    s
6290: 65 74 20 72 65 73 20 7b 7d 0a 0a 09 20 20 20 20  et res {}...    
62a0: 77 68 69 6c 65 20 7b 24 72 65 76 20 6e 65 20 22  while {$rev ne "
62b0: 22 7d 20 7b 0a 09 09 6c 61 70 70 65 6e 64 20 72  "} {...lappend r
62c0: 65 73 20 24 72 65 76 0a 09 09 73 65 74 20 72 65  es $rev...set re
62d0: 76 20 5b 24 72 65 76 20 63 68 69 6c 64 5d 0a 09  v [$rev child]..
62e0: 20 20 20 20 7d 0a 0a 09 20 20 20 20 72 65 74 75      }...    retu
62f0: 72 6e 20 24 72 65 73 0a 0a 09 7d 20 65 6c 73 65  rn $res...} else
6300: 69 66 20 7b 24 6d 79 69 6d 70 6f 72 74 65 64 7d  if {$myimported}
6310: 20 7b 0a 09 20 20 20 20 23 20 4e 6f 20 64 65 66   {..    # No def
6320: 61 75 6c 74 20 62 72 61 6e 63 68 2c 20 62 75 74  ault branch, but
6330: 20 74 68 65 20 66 69 6c 65 20 61 70 70 65 61 72   the file appear
6340: 73 20 74 6f 20 68 61 76 65 20 62 65 65 6e 0a 09  s to have been..
6350: 20 20 20 20 23 20 69 6d 70 6f 72 74 65 64 2e 20      # imported. 
6360: 20 53 6f 20 6f 75 72 20 65 64 75 63 61 74 65 64   So our educated
6370: 20 67 75 65 73 73 20 69 73 20 74 68 61 74 20 61   guess is that a
6380: 6c 6c 20 72 65 76 69 73 69 6f 6e 73 0a 09 20 20  ll revisions..  
6390: 20 20 23 20 6f 6e 20 74 68 65 20 27 31 2e 31 2e    # on the '1.1.
63a0: 31 27 20 62 72 61 6e 63 68 20 77 69 74 68 20 74  1' branch with t
63b0: 69 6d 65 73 74 61 6d 70 73 20 70 72 69 6f 72 20  imestamps prior 
63c0: 74 6f 20 74 68 65 0a 09 20 20 20 20 23 20 74 69  to the..    # ti
63d0: 6d 65 73 74 61 6d 70 20 6f 66 20 27 31 2e 32 27  mestamp of '1.2'
63e0: 20 77 65 72 65 20 6e 6f 6e 2d 74 72 75 6e 6b 20   were non-trunk 
63f0: 64 65 66 61 75 6c 74 20 62 72 61 6e 63 68 0a 09  default branch..
6400: 20 20 20 20 23 20 72 65 76 69 73 69 6f 6e 73 2e      # revisions.
6410: 0a 0a 09 20 20 20 20 23 20 54 68 69 73 20 72 65  ...    # This re
6420: 61 6c 6c 79 20 6f 6e 6c 79 20 70 72 6f 63 65 73  ally only proces
6430: 73 65 73 20 73 74 61 6e 64 61 72 64 20 27 31 2e  ses standard '1.
6440: 31 2e 31 2e 2a 27 2d 73 74 79 6c 65 0a 09 20 20  1.1.*'-style..  
6450: 20 20 23 20 76 65 6e 64 6f 72 20 72 65 76 69 73    # vendor revis
6460: 69 6f 6e 73 2e 20 20 4f 6e 65 20 63 6f 75 6c 64  ions.  One could
6470: 20 63 6f 6e 63 65 69 76 61 62 6c 79 20 68 61 76   conceivably hav
6480: 65 20 61 20 66 69 6c 65 0a 09 20 20 20 20 23 20  e a file..    # 
6490: 77 68 6f 73 65 20 64 65 66 61 75 6c 74 20 62 72  whose default br
64a0: 61 6e 63 68 20 69 73 20 31 2e 31 2e 33 20 6f 72  anch is 1.1.3 or
64b0: 20 77 68 61 74 65 76 65 72 2c 20 6f 72 20 77 61   whatever, or wa
64c0: 73 20 74 68 61 74 0a 09 20 20 20 20 23 20 61 74  s that..    # at
64d0: 20 73 6f 6d 65 20 70 6f 69 6e 74 20 69 6e 20 74   some point in t
64e0: 69 6d 65 2c 20 77 69 74 68 20 76 65 6e 64 6f 72  ime, with vendor
64f0: 20 72 65 76 69 73 69 6f 6e 73 20 31 2e 31 2e 33   revisions 1.1.3
6500: 2e 31 2c 0a 09 20 20 20 20 23 20 31 2e 31 2e 33  .1,..    # 1.1.3
6510: 2e 32 2c 20 65 74 63 2e 20 20 42 75 74 20 77 69  .2, etc.  But wi
6520: 74 68 20 74 68 65 20 64 65 66 61 75 6c 74 20 62  th the default b
6530: 72 61 6e 63 68 20 67 6f 6e 65 20 6e 6f 77 2c 0a  ranch gone now,.
6540: 09 20 20 20 20 23 20 77 65 27 64 20 68 61 76 65  .    # we'd have
6550: 20 6e 6f 20 62 61 73 69 73 20 66 6f 72 20 61 73   no basis for as
6560: 73 75 6d 69 6e 67 20 74 68 61 74 20 74 68 65 20  suming that the 
6570: 6e 6f 6e 2d 73 74 61 6e 64 61 72 64 0a 09 20 20  non-standard..  
6580: 20 20 23 20 76 65 6e 64 6f 72 20 62 72 61 6e 63    # vendor branc
6590: 68 20 68 61 64 20 65 76 65 72 20 62 65 65 6e 20  h had ever been 
65a0: 74 68 65 20 64 65 66 61 75 6c 74 20 62 72 61 6e  the default bran
65b0: 63 68 20 61 6e 79 77 61 79 2e 0a 0a 09 20 20 20  ch anyway....   
65c0: 20 23 20 4e 6f 74 65 20 74 68 61 74 20 77 65 20   # Note that we 
65d0: 72 65 6c 79 20 6f 6e 20 63 6f 6d 70 61 72 69 73  rely on comparis
65e0: 6f 6e 73 20 62 65 74 77 65 65 6e 20 74 68 65 20  ons between the 
65f0: 74 69 6d 65 73 74 61 6d 70 73 0a 09 20 20 20 20  timestamps..    
6600: 23 20 6f 66 20 74 68 65 20 72 65 76 69 73 69 6f  # of the revisio
6610: 6e 73 20 6f 6e 20 74 68 65 20 76 65 6e 64 6f 72  ns on the vendor
6620: 20 62 72 61 6e 63 68 20 61 6e 64 20 74 68 61 74   branch and that
6630: 20 6f 66 0a 09 20 20 20 20 23 20 72 65 76 69 73   of..    # revis
6640: 69 6f 6e 20 31 2e 32 2c 20 65 76 65 6e 20 74 68  ion 1.2, even th
6650: 6f 75 67 68 20 74 68 65 20 74 69 6d 65 73 74 61  ough the timesta
6660: 6d 70 73 20 6d 69 67 68 74 20 62 65 0a 09 20 20  mps might be..  
6670: 20 20 23 20 69 6e 63 6f 72 72 65 63 74 20 64 75    # incorrect du
6680: 65 20 74 6f 20 63 6c 6f 63 6b 20 73 6b 65 77 2e  e to clock skew.
6690: 20 20 57 65 20 63 6f 75 6c 64 20 64 6f 20 61 20    We could do a 
66a0: 73 6c 69 67 68 74 6c 79 0a 09 20 20 20 20 23 20  slightly..    # 
66b0: 62 65 74 74 65 72 20 6a 6f 62 20 69 66 20 77 65  better job if we
66c0: 20 75 73 65 64 20 74 68 65 20 63 68 61 6e 67 65   used the change
66d0: 73 65 74 20 74 69 6d 65 73 74 61 6d 70 73 2c 20  set timestamps, 
66e0: 61 73 20 69 74 20 69 73 0a 09 20 20 20 20 23 20  as it is..    # 
66f0: 70 6f 73 73 69 62 6c 65 20 74 68 61 74 20 74 68  possible that th
6700: 65 20 64 65 70 65 6e 64 65 6e 63 69 65 73 20 74  e dependencies t
6710: 68 61 74 20 77 65 6e 74 20 69 6e 74 6f 0a 09 20  hat went into.. 
6720: 20 20 20 23 20 64 65 74 65 72 6d 69 6e 69 6e 67     # determining
6730: 20 74 68 6f 73 65 20 74 69 6d 65 73 74 61 6d 70   those timestamp
6740: 73 20 61 72 65 20 6d 6f 72 65 20 61 63 63 75 72  s are more accur
6750: 61 74 65 2e 20 20 42 75 74 0a 09 20 20 20 20 23  ate.  But..    #
6760: 20 74 68 61 74 20 77 6f 75 6c 64 20 72 65 71 75   that would requ
6770: 69 72 65 20 61 6e 20 65 78 74 72 61 20 70 61 73  ire an extra pas
6780: 73 20 6f 72 20 74 77 6f 2e 0a 0a 09 20 20 20 20  s or two....    
6790: 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74  if {![info exist
67a0: 73 20 6d 79 62 72 61 6e 63 68 65 73 28 31 2e 31  s mybranches(1.1
67b0: 2e 31 29 5d 7d 20 7b 20 72 65 74 75 72 6e 20 7b  .1)]} { return {
67c0: 7d 20 7d 0a 0a 09 20 20 20 20 6c 6f 67 20 77 72  } }...    log wr
67d0: 69 74 65 20 35 20 66 69 6c 65 20 22 44 65 64 75  ite 5 file "Dedu
67e0: 63 65 64 20 65 78 69 73 74 65 6e 63 65 20 6f 66  ced existence of
67f0: 20 4e 54 44 42 22 0a 0a 09 20 20 20 20 73 65 74   NTDB"...    set
6800: 20 72 65 76 20 20 5b 24 6d 79 62 72 61 6e 63 68   rev  [$mybranch
6810: 65 73 28 31 2e 31 2e 31 29 20 63 68 69 6c 64 5d  es(1.1.1) child]
6820: 0a 09 20 20 20 20 73 65 74 20 72 65 73 20 20 7b  ..    set res  {
6830: 7d 0a 09 20 20 20 20 73 65 74 20 73 74 6f 70 20  }..    set stop 
6840: 5b 24 6d 79 72 6f 6f 74 20 63 68 69 6c 64 5d 0a  [$myroot child].
6850: 0a 09 20 20 20 20 69 66 20 7b 24 73 74 6f 70 20  ..    if {$stop 
6860: 65 71 20 22 22 7d 20 7b 0a 09 09 23 20 47 65 74  eq ""} {...# Get
6870: 20 65 76 65 72 79 74 68 69 6e 67 20 6f 6e 20 74   everything on t
6880: 68 65 20 62 72 61 6e 63 68 0a 09 09 77 68 69 6c  he branch...whil
6890: 65 20 7b 24 72 65 76 20 6e 65 20 22 22 7d 20 7b  e {$rev ne ""} {
68a0: 0a 09 09 20 20 20 20 6c 61 70 70 65 6e 64 20 72  ...    lappend r
68b0: 65 73 20 24 72 65 76 0a 09 09 20 20 20 20 73 65  es $rev...    se
68c0: 74 20 72 65 76 20 5b 24 72 65 76 20 63 68 69 6c  t rev [$rev chil
68d0: 64 5d 0a 09 09 7d 0a 09 20 20 20 20 7d 20 65 6c  d]...}..    } el
68e0: 73 65 20 7b 0a 09 09 23 20 43 6f 6c 6c 65 63 74  se {...# Collect
68f0: 20 65 76 65 72 79 74 68 69 6e 67 20 6f 6e 20 74   everything on t
6900: 68 65 20 62 72 61 6e 63 68 20 77 68 69 63 68 20  he branch which 
6910: 73 65 65 6d 73 20 74 6f 20 68 61 76 65 0a 09 09  seems to have...
6920: 23 20 62 65 65 6e 20 63 6f 6d 6d 69 74 74 65 64  # been committed
6930: 20 62 65 66 6f 72 65 20 74 68 65 20 66 69 72 73   before the firs
6940: 74 20 70 72 69 6d 61 72 79 20 63 68 69 6c 64 20  t primary child 
6950: 6f 66 20 74 68 65 0a 09 09 23 20 72 6f 6f 74 20  of the...# root 
6960: 72 65 76 69 73 69 6f 6e 2e 0a 09 09 73 65 74 20  revision....set 
6970: 73 74 6f 70 64 61 74 65 20 5b 24 73 74 6f 70 20  stopdate [$stop 
6980: 64 61 74 65 5d 0a 09 09 77 68 69 6c 65 20 7b 24  date]...while {$
6990: 72 65 76 20 6e 65 20 22 22 7d 20 7b 0a 09 09 20  rev ne ""} {... 
69a0: 20 20 20 69 66 20 7b 5b 24 72 65 76 20 64 61 74     if {[$rev dat
69b0: 65 5d 20 3e 3d 20 24 73 74 6f 70 64 61 74 65 7d  e] >= $stopdate}
69c0: 20 62 72 65 61 6b 0a 09 09 20 20 20 20 6c 61 70   break...    lap
69d0: 70 65 6e 64 20 72 65 73 20 24 72 65 76 0a 09 09  pend res $rev...
69e0: 20 20 20 20 73 65 74 20 72 65 76 20 5b 24 72 65      set rev [$re
69f0: 76 20 63 68 69 6c 64 5d 0a 09 09 7d 0a 09 20 20  v child]...}..  
6a00: 20 20 7d 0a 0a 09 20 20 20 20 72 65 74 75 72 6e    }...    return
6a10: 20 24 72 65 73 0a 0a 09 7d 20 65 6c 73 65 20 7b   $res...} else {
6a20: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 7b 7d 0a  ..    return {}.
6a30: 09 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20  .}.    }..    # 
6a40: 47 65 6e 65 72 61 6c 20 6e 6f 74 65 3a 20 49 6e  General note: In
6a50: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 6d   the following m
6a60: 65 74 68 6f 64 73 20 77 65 20 6f 6e 6c 79 20 6d  ethods we only m
6a70: 6f 64 69 66 79 20 74 68 65 20 6c 69 6e 6b 73 0a  odify the links.
6a80: 20 20 20 20 23 20 62 65 74 77 65 65 6e 20 72 65      # between re
6a90: 76 69 73 69 6f 6e 73 20 61 6e 64 20 73 79 6d 62  visions and symb
6aa0: 6f 6c 73 20 74 6f 20 72 65 73 74 72 75 63 74 75  ols to restructu
6ab0: 72 65 20 74 68 65 20 72 65 76 69 73 69 6f 6e 0a  re the revision.
6ac0: 20 20 20 20 23 20 74 72 65 65 2e 20 57 65 20 64      # tree. We d
6ad0: 6f 20 5f 5f 6e 6f 74 5f 5f 20 64 65 73 74 72 6f  o __not__ destro
6ae0: 79 20 74 68 65 20 6f 62 6a 65 63 74 73 2e 20 47  y the objects. G
6af0: 69 76 65 6e 20 74 68 65 20 63 6f 6d 70 6c 65 78  iven the complex
6b00: 20 6c 69 6e 6b 73 0a 20 20 20 20 23 20 47 43 20   links.    # GC 
6b10: 69 73 20 64 69 66 66 69 63 75 6c 74 20 61 74 20  is difficult at 
6b20: 74 68 69 73 20 6c 65 76 65 6c 2e 20 49 74 20 69  this level. It i
6b30: 73 20 6d 75 63 68 20 65 61 73 69 65 72 20 74 6f  s much easier to
6b40: 20 64 72 6f 70 0a 20 20 20 20 23 20 65 76 65 72   drop.    # ever
6b50: 79 74 68 69 6e 67 20 77 68 65 6e 20 77 65 20 77  ything when we w
6b60: 65 20 61 72 65 20 64 6f 6e 65 2e 20 54 68 69 73  e are done. This
6b70: 20 68 61 70 70 65 6e 73 20 69 6e 20 27 64 72 6f   happens in 'dro
6b80: 70 27 2c 20 75 73 69 6e 67 0a 20 20 20 20 23 20  p', using.    # 
6b90: 74 68 65 20 73 74 61 74 65 20 76 61 72 69 61 62  the state variab
6ba0: 6c 65 20 27 6d 79 72 65 76 27 2c 20 27 6d 79 62  le 'myrev', 'myb
6bb0: 72 61 6e 63 68 65 73 27 2c 20 61 6e 64 20 27 6d  ranches', and 'm
6bc0: 79 74 61 67 73 27 2e 20 57 68 61 74 20 77 65 0a  ytags'. What we.
6bd0: 20 20 20 20 23 20 68 61 76 65 20 74 6f 20 70 65      # have to pe
6be0: 72 73 69 73 74 2c 20 70 65 72 66 6f 72 6d 65 64  rsist, performed
6bf0: 20 62 79 20 27 70 65 72 73 69 73 74 27 2c 20 77   by 'persist', w
6c00: 65 20 6b 6e 6f 77 20 77 69 6c 6c 20 62 65 0a 20  e know will be. 
6c10: 20 20 20 23 20 72 65 61 63 68 61 62 6c 65 20 74     # reachable t
6c20: 68 72 6f 75 67 68 20 74 68 65 20 72 65 76 69 73  hrough the revis
6c30: 69 6f 6e 73 20 6c 69 73 74 65 64 20 69 6e 20 27  ions listed in '
6c40: 6d 79 72 6f 6f 74 73 27 20 61 6e 64 20 74 68 65  myroots' and the
6c50: 69 72 0a 20 20 20 20 23 20 63 68 69 6c 64 72 65  ir.    # childre
6c60: 6e 20 61 6e 64 20 73 79 6d 62 6f 6c 73 2e 0a 0a  n and symbols...
6c70: 20 20 20 20 6d 65 74 68 6f 64 20 41 64 6a 75 73      method Adjus
6c80: 74 4e 6f 6e 54 72 75 6e 6b 44 65 66 61 75 6c 74  tNonTrunkDefault
6c90: 42 72 61 6e 63 68 20 7b 72 65 76 6c 69 73 74 7d  Branch {revlist}
6ca0: 20 7b 0a 09 73 65 74 20 73 74 6f 70 20 5b 24 6d   {..set stop [$m
6cb0: 79 72 6f 6f 74 20 63 68 69 6c 64 5d 20 3b 23 20  yroot child] ;# 
6cc0: 72 65 76 20 27 31 2e 32 27 0a 0a 09 6c 6f 67 20  rev '1.2'...log 
6cd0: 77 72 69 74 65 20 35 20 66 69 6c 65 20 22 41 64  write 5 file "Ad
6ce0: 6a 75 73 74 69 6e 67 20 4e 54 44 42 20 63 6f 6e  justing NTDB con
6cf0: 74 61 69 6e 69 6e 67 20 5b 6e 73 70 20 5b 6c 6c  taining [nsp [ll
6d00: 65 6e 67 74 68 20 24 72 65 76 6c 69 73 74 5d 20  ength $revlist] 
6d10: 72 65 76 69 73 69 6f 6e 5d 22 0a 0a 09 23 20 46  revision]"...# F
6d20: 72 6f 6d 20 63 76 73 32 73 76 6e 20 74 68 65 20  rom cvs2svn the 
6d30: 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 6c 61 6e  following explan
6d40: 61 74 69 6f 6e 20 28 77 69 74 68 20 6d 6f 64 69  ation (with modi
6d50: 66 69 63 61 74 69 6f 6e 73 0a 09 23 20 66 6f 72  fications..# for
6d60: 20 6f 75 72 20 61 6c 67 6f 72 69 74 68 6d 29 3a   our algorithm):
6d70: 0a 0a 09 23 20 41 64 6a 75 73 74 20 74 68 65 20  ...# Adjust the 
6d80: 6e 6f 6e 2d 74 72 75 6e 6b 20 64 65 66 61 75 6c  non-trunk defaul
6d90: 74 20 62 72 61 6e 63 68 20 72 65 76 69 73 69 6f  t branch revisio
6da0: 6e 73 20 66 6f 75 6e 64 20 69 6e 20 74 68 65 0a  ns found in the.
6db0: 09 23 20 27 72 65 76 6c 69 73 74 27 2e 0a 0a 09  .# 'revlist'....
6dc0: 23 20 27 6d 79 69 6d 70 6f 72 74 65 64 27 20 69  # 'myimported' i
6dd0: 73 20 61 20 62 6f 6f 6c 65 61 6e 20 66 6c 61 67  s a boolean flag
6de0: 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 65 74   indicating whet
6df0: 68 65 72 20 74 68 69 73 20 66 69 6c 65 0a 09 23  her this file..#
6e00: 20 61 70 70 65 61 72 73 20 74 6f 20 68 61 76 65   appears to have
6e10: 20 62 65 65 6e 20 69 6d 70 6f 72 74 65 64 2c 20   been imported, 
6e20: 77 68 69 63 68 20 61 6c 73 6f 20 6d 65 61 6e 73  which also means
6e30: 20 74 68 61 74 0a 09 23 20 72 65 76 69 73 69 6f   that..# revisio
6e40: 6e 20 31 2e 31 20 68 61 73 20 61 20 67 65 6e 65  n 1.1 has a gene
6e50: 72 61 74 65 64 20 6c 6f 67 20 6d 65 73 73 61 67  rated log messag
6e60: 65 20 74 68 61 74 20 6e 65 65 64 20 6e 6f 74 20  e that need not 
6e70: 62 65 0a 09 23 20 70 72 65 73 65 72 76 65 64 2e  be..# preserved.
6e80: 20 20 27 72 65 76 6c 69 73 74 27 20 69 73 20 61    'revlist' is a
6e90: 20 6c 69 73 74 20 6f 66 20 6f 62 6a 65 63 74 20   list of object 
6ea0: 72 65 66 65 72 65 6e 63 65 73 20 66 6f 72 20 74  references for t
6eb0: 68 65 0a 09 23 20 72 65 76 69 73 69 6f 6e 73 20  he..# revisions 
6ec0: 74 68 61 74 20 68 61 76 65 20 62 65 65 6e 20 64  that have been d
6ed0: 65 74 65 72 6d 69 6e 65 64 20 74 6f 20 62 65 20  etermined to be 
6ee0: 6e 6f 6e 2d 74 72 75 6e 6b 20 64 65 66 61 75 6c  non-trunk defaul
6ef0: 74 0a 09 23 20 62 72 61 6e 63 68 20 72 65 76 69  t..# branch revi
6f00: 73 69 6f 6e 73 2e 0a 0a 09 23 20 4e 6f 74 65 20  sions....# Note 
6f10: 74 68 61 74 20 74 68 65 20 66 69 72 73 74 20 72  that the first r
6f20: 65 76 69 73 69 6f 6e 20 6f 6e 20 74 68 65 20 64  evision on the d
6f30: 65 66 61 75 6c 74 20 62 72 61 6e 63 68 20 69 73  efault branch is
6f40: 0a 09 23 20 68 61 6e 64 6c 65 64 20 73 74 72 61  ..# handled stra
6f50: 6e 67 65 6c 79 20 62 79 20 43 56 53 2e 20 20 49  ngely by CVS.  I
6f60: 66 20 61 20 66 69 6c 65 20 69 73 20 69 6d 70 6f  f a file is impo
6f70: 72 74 65 64 20 28 61 73 20 6f 70 70 6f 73 65 64  rted (as opposed
6f80: 0a 09 23 20 74 6f 20 62 65 69 6e 67 20 61 64 64  ..# to being add
6f90: 65 64 29 2c 20 43 56 53 20 63 72 65 61 74 65 73  ed), CVS creates
6fa0: 20 61 20 31 2e 31 20 72 65 76 69 73 69 6f 6e 2c   a 1.1 revision,
6fb0: 20 74 68 65 6e 20 63 72 65 61 74 65 73 20 61 0a   then creates a.
6fc0: 09 23 20 76 65 6e 64 6f 72 20 62 72 61 6e 63 68  .# vendor branch
6fd0: 20 31 2e 31 2e 31 20 62 61 73 65 64 20 6f 6e 20   1.1.1 based on 
6fe0: 31 2e 31 2c 20 74 68 65 6e 20 63 72 65 61 74 65  1.1, then create
6ff0: 73 20 61 20 31 2e 31 2e 31 2e 31 0a 09 23 20 72  s a 1.1.1.1..# r
7000: 65 76 69 73 69 6f 6e 20 74 68 61 74 20 69 73 20  evision that is 
7010: 69 64 65 6e 74 69 63 61 6c 20 74 6f 20 74 68 65  identical to the
7020: 20 31 2e 31 20 72 65 76 69 73 69 6f 6e 20 28 69   1.1 revision (i
7030: 2e 65 2e 2c 20 69 74 73 0a 09 23 20 64 65 6c 74  .e., its..# delt
7040: 61 74 65 78 74 20 69 73 20 65 6d 70 74 79 29 2e  atext is empty).
7050: 20 20 54 68 65 20 6c 6f 67 20 6d 65 73 73 61 67    The log messag
7060: 65 20 74 68 61 74 20 74 68 65 20 75 73 65 72 20  e that the user 
7070: 74 79 70 65 64 0a 09 23 20 77 68 65 6e 20 69 6d  typed..# when im
7080: 70 6f 72 74 69 6e 67 20 69 73 20 73 74 6f 72 65  porting is store
7090: 64 20 77 69 74 68 20 74 68 65 20 31 2e 31 2e 31  d with the 1.1.1
70a0: 2e 31 20 72 65 76 69 73 69 6f 6e 2e 20 20 54 68  .1 revision.  Th
70b0: 65 20 31 2e 31 0a 09 23 20 72 65 76 69 73 69 6f  e 1.1..# revisio
70c0: 6e 20 61 6c 77 61 79 73 20 63 6f 6e 74 61 69 6e  n always contain
70d0: 73 20 61 20 73 74 61 6e 64 61 72 64 2c 20 67 65  s a standard, ge
70e0: 6e 65 72 61 74 65 64 20 6c 6f 67 20 6d 65 73 73  nerated log mess
70f0: 61 67 65 2c 0a 09 23 20 27 49 6e 69 74 69 61 6c  age,..# 'Initial
7100: 20 72 65 76 69 73 69 6f 6e 5c 6e 27 2e 0a 0a 09   revision\n'....
7110: 23 20 57 68 65 6e 20 77 65 20 64 65 74 65 63 74  # When we detect
7120: 20 61 20 73 74 72 61 69 67 68 74 66 6f 72 77 61   a straightforwa
7130: 72 64 20 69 6d 70 6f 72 74 20 6c 69 6b 65 20 74  rd import like t
7140: 68 69 73 2c 20 77 65 20 77 61 6e 74 0a 09 23 20  his, we want..# 
7150: 74 6f 20 68 61 6e 64 6c 65 20 69 74 20 62 79 20  to handle it by 
7160: 64 65 6c 65 74 69 6e 67 20 74 68 65 20 31 2e 31  deleting the 1.1
7170: 20 72 65 76 69 73 69 6f 6e 20 28 77 68 69 63 68   revision (which
7180: 20 64 6f 65 73 6e 27 74 0a 09 23 20 63 6f 6e 74   doesn't..# cont
7190: 61 69 6e 20 61 6e 79 20 75 73 65 66 75 6c 20 69  ain any useful i
71a0: 6e 66 6f 72 6d 61 74 69 6f 6e 29 20 61 6e 64 20  nformation) and 
71b0: 6d 61 6b 69 6e 67 20 31 2e 31 2e 31 2e 31 20 69  making 1.1.1.1 i
71c0: 6e 74 6f 20 61 6e 0a 09 23 20 69 6e 64 65 70 65  nto an..# indepe
71d0: 6e 64 65 6e 74 20 72 6f 6f 74 20 69 6e 20 74 68  ndent root in th
71e0: 65 20 66 69 6c 65 27 73 20 64 65 70 65 6e 64 65  e file's depende
71f0: 6e 63 79 20 74 72 65 65 2e 20 20 49 6e 20 53 56  ncy tree.  In SV
7200: 4e 2c 0a 09 23 20 31 2e 31 2e 31 2e 31 20 77 69  N,..# 1.1.1.1 wi
7210: 6c 6c 20 62 65 20 61 64 64 65 64 20 64 69 72 65  ll be added dire
7220: 63 74 6c 79 20 74 6f 20 74 68 65 20 76 65 6e 64  ctly to the vend
7230: 6f 72 20 62 72 61 6e 63 68 20 77 69 74 68 20 69  or branch with i
7240: 74 73 0a 09 23 20 69 6e 69 74 69 61 6c 20 63 6f  ts..# initial co
7250: 6e 74 65 6e 74 2e 20 20 54 68 65 6e 20 69 6e 20  ntent.  Then in 
7260: 61 20 73 70 65 63 69 61 6c 20 27 70 6f 73 74 2d  a special 'post-
7270: 63 6f 6d 6d 69 74 27 2c 20 74 68 65 0a 09 23 20  commit', the..# 
7280: 31 2e 31 2e 31 2e 31 20 72 65 76 69 73 69 6f 6e  1.1.1.1 revision
7290: 20 69 73 20 63 6f 70 69 65 64 20 62 61 63 6b 20   is copied back 
72a0: 74 6f 20 74 72 75 6e 6b 2e 0a 0a 09 23 20 49 66  to trunk....# If
72b0: 20 74 68 65 20 75 73 65 72 20 69 6d 70 6f 72 74   the user import
72c0: 73 20 61 67 61 69 6e 20 74 6f 20 74 68 65 20 73  s again to the s
72d0: 61 6d 65 20 76 65 6e 64 6f 72 20 62 72 61 6e 63  ame vendor branc
72e0: 68 2c 20 74 68 65 6e 20 43 56 53 0a 09 23 20 63  h, then CVS..# c
72f0: 72 65 61 74 65 73 20 72 65 76 69 73 69 6f 6e 73  reates revisions
7300: 20 31 2e 31 2e 31 2e 32 2c 20 31 2e 31 2e 31 2e   1.1.1.2, 1.1.1.
7310: 33 2c 20 65 74 63 2e 20 6f 6e 20 74 68 65 20 76  3, etc. on the v
7320: 65 6e 64 6f 72 20 62 72 61 6e 63 68 2c 0a 09 23  endor branch,..#
7330: 20 2a 77 69 74 68 6f 75 74 2a 20 63 6f 75 6e 74   *without* count
7340: 65 72 70 61 72 74 73 20 69 6e 20 74 72 75 6e 6b  erparts in trunk
7350: 20 28 65 76 65 6e 20 74 68 6f 75 67 68 20 74 68   (even though th
7360: 65 73 65 20 72 65 76 69 73 69 6f 6e 73 0a 09 23  ese revisions..#
7370: 20 65 66 66 65 63 74 69 76 65 6c 79 20 70 6c 61   effectively pla
7380: 79 20 74 68 65 20 72 6f 6c 65 20 6f 66 20 74 72  y the role of tr
7390: 75 6e 6b 20 72 65 76 69 73 69 6f 6e 73 29 2e 20  unk revisions). 
73a0: 20 53 6f 20 61 66 74 65 72 20 77 65 20 61 64 64   So after we add
73b0: 0a 09 23 20 73 75 63 68 20 72 65 76 69 73 69 6f  ..# such revisio
73c0: 6e 73 20 74 6f 20 74 68 65 20 76 65 6e 64 6f 72  ns to the vendor
73d0: 20 62 72 61 6e 63 68 2c 20 77 65 20 61 6c 73 6f   branch, we also
73e0: 20 63 6f 70 79 20 74 68 65 6d 20 62 61 63 6b 20   copy them back 
73f0: 74 6f 0a 09 23 20 74 72 75 6e 6b 20 69 6e 20 70  to..# trunk in p
7400: 6f 73 74 2d 63 6f 6d 6d 69 74 73 2e 0a 0a 09 23  ost-commits....#
7410: 20 57 65 20 6d 61 72 6b 20 74 68 65 20 72 65 76   We mark the rev
7420: 69 73 69 6f 6e 73 20 66 6f 75 6e 64 20 69 6e 20  isions found in 
7430: 27 72 65 76 6c 69 73 74 27 20 61 73 20 64 65 66  'revlist' as def
7440: 61 75 6c 74 20 62 72 61 6e 63 68 0a 09 23 20 72  ault branch..# r
7450: 65 76 69 73 69 6f 6e 73 2e 20 20 41 6c 73 6f 2c  evisions.  Also,
7460: 20 69 66 20 74 68 65 20 72 6f 6f 74 20 72 65 76   if the root rev
7470: 69 73 69 6f 6e 20 68 61 73 20 61 20 70 72 69 6d  ision has a prim
7480: 61 72 79 20 63 68 69 6c 64 0a 09 23 20 77 65 20  ary child..# we 
7490: 73 65 74 20 74 68 61 74 20 72 65 76 69 73 69 6f  set that revisio
74a0: 6e 20 74 6f 20 64 65 70 65 6e 64 20 6f 6e 20 74  n to depend on t
74b0: 68 65 20 6c 61 73 74 20 6e 6f 6e 2d 74 72 75 6e  he last non-trun
74c0: 6b 20 64 65 66 61 75 6c 74 0a 09 23 20 62 72 61  k default..# bra
74d0: 6e 63 68 20 72 65 76 69 73 69 6f 6e 20 61 6e 64  nch revision and
74e0: 20 70 6f 73 73 69 62 6c 79 20 61 64 6a 75 73 74   possibly adjust
74f0: 20 69 74 73 20 74 79 70 65 20 61 63 63 6f 72 64   its type accord
7500: 69 6e 67 6c 79 2e 0a 0a 09 73 65 74 20 66 69 72  ingly....set fir
7510: 73 74 20 5b 6c 69 6e 64 65 78 20 24 72 65 76 6c  st [lindex $revl
7520: 69 73 74 20 30 5d 0a 0a 09 6c 6f 67 20 77 72 69  ist 0]...log wri
7530: 74 65 20 36 20 66 69 6c 65 20 22 3c 5b 24 66 69  te 6 file "<[$fi
7540: 72 73 74 20 72 65 76 6e 72 5d 3e 20 5b 65 78 70  rst revnr]> [exp
7550: 72 20 7b 24 6d 79 69 6d 70 6f 72 74 65 64 20 3f  r {$myimported ?
7560: 20 22 69 6d 70 6f 72 74 65 64 22 20 3a 20 22 6e   "imported" : "n
7570: 6f 74 20 69 6d 70 6f 72 74 65 64 22 7d 5d 2c 20  ot imported"}], 
7580: 5b 24 66 69 72 73 74 20 6f 70 65 72 61 74 69 6f  [$first operatio
7590: 6e 5d 2c 20 5b 65 78 70 72 20 7b 5b 24 66 69 72  n], [expr {[$fir
75a0: 73 74 20 68 61 73 74 65 78 74 5d 20 3f 20 22 68  st hastext] ? "h
75b0: 61 73 20 74 65 78 74 22 20 3a 20 22 6e 6f 20 74  as text" : "no t
75c0: 65 78 74 22 7d 5d 22 0a 0a 09 69 66 20 7b 24 6d  ext"}]"...if {$m
75d0: 79 69 6d 70 6f 72 74 65 64 20 26 26 0a 09 20 20  yimported &&..  
75e0: 20 20 5b 24 66 69 72 73 74 20 72 65 76 6e 72 5d    [$first revnr]
75f0: 20 65 71 20 22 31 2e 31 2e 31 2e 31 22 20 26 26   eq "1.1.1.1" &&
7600: 0a 09 20 20 20 20 5b 24 66 69 72 73 74 20 6f 70  ..    [$first op
7610: 65 72 61 74 69 6f 6e 5d 20 65 71 20 22 63 68 61  eration] eq "cha
7620: 6e 67 65 22 20 26 26 0a 09 20 20 20 20 21 5b 24  nge" &&..    ![$
7630: 66 69 72 73 74 20 68 61 73 74 65 78 74 5d 7d 20  first hastext]} 
7640: 7b 0a 0a 09 20 20 20 20 73 65 74 20 72 65 76 31  {...    set rev1
7650: 31 20 5b 24 66 69 72 73 74 20 70 61 72 65 6e 74  1 [$first parent
7660: 5d 20 3b 20 23 20 41 73 73 65 72 74 3a 20 53 68  ] ; # Assert: Sh
7670: 6f 75 6c 64 20 62 65 20 6d 79 72 6f 6f 74 2e 0a  ould be myroot..
7680: 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 33  .    log write 3
7690: 20 66 69 6c 65 20 22 52 65 6d 6f 76 69 6e 67 20   file "Removing 
76a0: 69 72 72 65 6c 65 76 61 6e 74 20 72 65 76 69 73  irrelevant revis
76b0: 69 6f 6e 20 5b 24 72 65 76 31 31 20 72 65 76 6e  ion [$rev11 revn
76c0: 72 5d 22 0a 0a 09 20 20 20 20 23 20 43 75 74 20  r]"...    # Cut 
76d0: 6f 75 74 20 74 68 65 20 6f 6c 64 20 6d 79 72 6f  out the old myro
76e0: 6f 74 20 72 65 76 69 73 69 6f 6e 2e 0a 0a 09 20  ot revision.... 
76f0: 20 20 20 6c 64 65 6c 65 74 65 20 6d 79 72 6f 6f     ldelete myroo
7700: 74 73 20 24 72 65 76 31 31 20 3b 20 23 20 4e 6f  ts $rev11 ; # No
7710: 74 20 61 20 72 6f 6f 74 20 61 6e 79 20 6c 6f 6e  t a root any lon
7720: 67 65 72 2e 0a 0a 09 20 20 20 20 24 66 69 72 73  ger....    $firs
7730: 74 20 63 75 74 66 72 6f 6d 70 61 72 65 6e 74 20  t cutfromparent 
7740: 3b 20 23 20 53 65 76 65 72 20 72 65 76 69 73 69  ; # Sever revisi
7750: 6f 6e 20 66 72 6f 6d 20 70 61 72 65 6e 74 20 72  on from parent r
7760: 65 76 69 73 69 6f 6e 2e 0a 09 20 20 20 20 69 66  evision...    if
7770: 20 7b 24 73 74 6f 70 20 6e 65 20 22 22 7d 20 7b   {$stop ne ""} {
7780: 0a 09 09 24 73 74 6f 70 20 63 75 74 66 72 6f 6d  ...$stop cutfrom
7790: 70 61 72 65 6e 74 0a 09 09 6c 61 70 70 65 6e 64  parent...lappend
77a0: 20 6d 79 72 6f 6f 74 73 20 24 73 74 6f 70 20 3b   myroots $stop ;
77b0: 20 23 20 4e 65 77 20 72 6f 6f 74 2c 20 61 66 74   # New root, aft
77c0: 65 72 20 76 65 6e 64 6f 72 20 62 72 61 6e 63 68  er vendor branch
77d0: 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 23 20  ..    }...    # 
77e0: 43 75 74 20 6f 75 74 20 74 68 65 20 76 65 6e 64  Cut out the vend
77f0: 6f 72 20 62 72 61 6e 63 68 20 73 79 6d 62 6f 6c  or branch symbol
7800: 0a 0a 09 20 20 20 20 73 65 74 20 76 65 6e 64 6f  ...    set vendo
7810: 72 20 5b 24 66 69 72 73 74 20 70 61 72 65 6e 74  r [$first parent
7820: 62 72 61 6e 63 68 5d 0a 09 20 20 20 20 69 6e 74  branch]..    int
7830: 65 67 72 69 74 79 20 61 73 73 65 72 74 20 7b 24  egrity assert {$
7840: 76 65 6e 64 6f 72 20 6e 65 20 22 22 7d 20 7b 46  vendor ne ""} {F
7850: 69 72 73 74 20 4e 54 44 42 20 72 65 76 69 73 69  irst NTDB revisi
7860: 6f 6e 20 68 61 73 20 6e 6f 20 62 72 61 6e 63 68  on has no branch
7870: 7d 0a 09 20 20 20 20 69 66 20 7b 5b 24 76 65 6e  }..    if {[$ven
7880: 64 6f 72 20 70 61 72 65 6e 74 5d 20 65 71 20 24  dor parent] eq $
7890: 72 65 76 31 31 7d 20 7b 0a 09 09 24 72 65 76 31  rev11} {...$rev1
78a0: 31 20 72 65 6d 6f 76 65 62 72 61 6e 63 68 20 20  1 removebranch  
78b0: 20 20 20 20 20 20 24 76 65 6e 64 6f 72 0a 09 09        $vendor...
78c0: 24 72 65 76 31 31 20 72 65 6d 6f 76 65 63 68 69  $rev11 removechi
78d0: 6c 64 6f 6e 62 72 61 6e 63 68 20 24 66 69 72 73  ldonbranch $firs
78e0: 74 0a 09 09 24 76 65 6e 64 6f 72 20 63 75 74 63  t...$vendor cutc
78f0: 68 69 6c 64 0a 09 09 24 66 69 72 73 74 20 63 75  hild...$first cu
7900: 74 66 72 6f 6d 70 61 72 65 6e 74 62 72 61 6e 63  tfromparentbranc
7910: 68 0a 09 09 6c 61 70 70 65 6e 64 20 6d 79 72 6f  h...lappend myro
7920: 6f 74 73 20 24 66 69 72 73 74 0a 09 20 20 20 20  ots $first..    
7930: 7d 0a 0a 09 20 20 20 20 23 20 43 68 61 6e 67 65  }...    # Change
7940: 20 74 68 65 20 74 79 70 65 20 6f 66 20 66 69 72   the type of fir
7950: 73 74 20 28 74 79 70 69 63 61 6c 6c 79 20 66 72  st (typically fr
7960: 6f 6d 20 43 68 61 6e 67 65 20 74 6f 20 41 64 64  om Change to Add
7970: 29 3a 0a 09 20 20 20 20 24 66 69 72 73 74 20 72  ):..    $first r
7980: 65 74 79 70 65 20 61 64 64 0a 0a 09 20 20 20 20  etype add...    
7990: 23 20 4d 6f 76 65 20 61 6e 79 20 74 61 67 73 20  # Move any tags 
79a0: 61 6e 64 20 62 72 61 6e 63 68 65 73 20 66 72 6f  and branches fro
79b0: 6d 20 74 68 65 20 6f 6c 64 20 74 6f 20 74 68 65  m the old to the
79c0: 20 6e 65 77 20 72 6f 6f 74 2e 0a 09 20 20 20 20   new root...    
79d0: 24 72 65 76 31 31 20 6d 6f 76 65 73 79 6d 62 6f  $rev11 movesymbo
79e0: 6c 73 74 6f 20 24 66 69 72 73 74 0a 09 7d 0a 0a  lsto $first..}..
79f0: 09 23 20 4d 61 72 6b 20 61 6c 6c 20 74 68 65 20  .# Mark all the 
7a00: 73 70 65 63 69 61 6c 20 72 65 76 69 73 69 6f 6e  special revision
7a10: 73 20 61 73 20 73 75 63 68 0a 09 66 6f 72 65 61  s as such..forea
7a20: 63 68 20 72 65 76 20 24 72 65 76 6c 69 73 74 20  ch rev $revlist 
7a30: 7b 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65  {..    log write
7a40: 20 33 20 66 69 6c 65 20 22 52 65 76 69 73 69 6f   3 file "Revisio
7a50: 6e 20 6f 6e 20 64 65 66 61 75 6c 74 20 62 72 61  n on default bra
7a60: 6e 63 68 3a 20 5b 24 72 65 76 20 72 65 76 6e 72  nch: [$rev revnr
7a70: 5d 22 0a 09 20 20 20 20 24 72 65 76 20 73 65 74  ]"..    $rev set
7a80: 6f 6e 64 65 66 61 75 6c 74 62 72 61 6e 63 68 20  ondefaultbranch 
7a90: 31 0a 09 7d 0a 0a 09 69 66 20 7b 24 73 74 6f 70  1..}...if {$stop
7aa0: 20 6e 65 20 22 22 7d 20 7b 0a 09 20 20 20 20 23   ne ""} {..    #
7ab0: 20 52 65 76 69 73 69 6f 6e 20 31 2e 32 20 6c 6f   Revision 1.2 lo
7ac0: 67 69 63 61 6c 6c 79 20 66 6f 6c 6c 6f 77 73 20  gically follows 
7ad0: 74 68 65 20 69 6d 70 6f 72 74 65 64 20 72 65 76  the imported rev
7ae0: 69 73 69 6f 6e 73 2c 0a 09 20 20 20 20 23 20 6e  isions,..    # n
7af0: 6f 74 20 31 2e 31 2e 20 20 41 63 63 6f 72 64 69  ot 1.1.  Accordi
7b00: 6e 67 6c 79 2c 20 63 6f 6e 6e 65 63 74 20 69 74  ngly, connect it
7b10: 20 74 6f 20 74 68 65 20 6c 61 73 74 20 4e 54 44   to the last NTD
7b20: 42 52 20 61 6e 64 0a 09 20 20 20 20 23 20 70 6f  BR and..    # po
7b30: 73 73 69 62 6c 79 20 63 68 61 6e 67 65 20 69 74  ssibly change it
7b40: 73 20 74 79 70 65 2e 0a 0a 09 20 20 20 20 73 65  s type....    se
7b50: 74 20 6c 61 73 74 20 5b 6c 69 6e 64 65 78 20 24  t last [lindex $
7b60: 72 65 76 6c 69 73 74 20 65 6e 64 5d 0a 09 20 20  revlist end]..  
7b70: 20 20 24 73 74 6f 70 20 73 65 74 64 65 66 61 75    $stop setdefau
7b80: 6c 74 62 72 61 6e 63 68 70 61 72 65 6e 74 20 24  ltbranchparent $
7b90: 6c 61 73 74 20 3b 20 23 20 52 65 74 79 70 65 73  last ; # Retypes
7ba0: 20 74 68 65 20 72 65 76 69 73 69 6f 6e 20 74 6f   the revision to
7bb0: 6f 2e 0a 09 20 20 20 20 24 6c 61 73 74 20 73 65  o...    $last se
7bc0: 74 64 65 66 61 75 6c 74 62 72 61 6e 63 68 63 68  tdefaultbranchch
7bd0: 69 6c 64 20 20 24 73 74 6f 70 0a 09 7d 0a 09 72  ild  $stop..}..r
7be0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
7bf0: 20 6d 65 74 68 6f 64 20 43 68 65 63 6b 4c 4f 44   method CheckLOD
7c00: 73 20 7b 7d 20 7b 0a 09 66 6f 72 65 61 63 68 20  s {} {..foreach 
7c10: 7b 5f 20 62 72 61 6e 63 68 7d 20 20 5b 61 72 72  {_ branch}  [arr
7c20: 61 79 20 67 65 74 20 6d 79 62 72 61 6e 63 68 65  ay get mybranche
7c30: 73 5d 20 7b 20 24 62 72 61 6e 63 68 20 63 68 65  s] { $branch che
7c40: 63 6b 6c 6f 64 20 7d 0a 09 66 6f 72 65 61 63 68  cklod }..foreach
7c50: 20 7b 5f 20 74 61 67 6c 69 73 74 7d 20 5b 61 72   {_ taglist} [ar
7c60: 72 61 79 20 67 65 74 20 6d 79 74 61 67 73 5d 20  ray get mytags] 
7c70: 7b 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 74  {..    foreach t
7c80: 61 67 20 24 74 61 67 6c 69 73 74 20 7b 20 24 74  ag $taglist { $t
7c90: 61 67 20 63 68 65 63 6b 6c 6f 64 20 7d 0a 09 7d  ag checklod }..}
7ca0: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
7cb0: 20 20 20 20 6d 65 74 68 6f 64 20 52 65 6d 6f 76      method Remov
7cc0: 65 49 72 72 65 6c 65 76 61 6e 74 44 65 6c 65 74  eIrrelevantDelet
7cd0: 69 6f 6e 73 20 7b 7d 20 7b 0a 09 23 20 46 72 6f  ions {} {..# Fro
7ce0: 6d 20 63 76 73 32 73 76 6e 3a 20 49 66 20 61 20  m cvs2svn: If a 
7cf0: 66 69 6c 65 20 69 73 20 61 64 64 65 64 20 6f 6e  file is added on
7d00: 20 61 20 62 72 61 6e 63 68 2c 20 74 68 65 6e 20   a branch, then 
7d10: 61 20 74 72 75 6e 6b 0a 09 23 20 72 65 76 69 73  a trunk..# revis
7d20: 69 6f 6e 20 69 73 20 61 64 64 65 64 20 61 74 20  ion is added at 
7d30: 74 68 65 20 73 61 6d 65 20 74 69 6d 65 20 69 6e  the same time in
7d40: 20 74 68 65 20 27 44 65 61 64 27 20 73 74 61 74   the 'Dead' stat
7d50: 65 2e 0a 09 23 20 54 68 69 73 20 72 65 76 69 73  e...# This revis
7d60: 69 6f 6e 20 64 6f 65 73 6e 27 74 20 64 6f 20 61  ion doesn't do a
7d70: 6e 79 74 68 69 6e 67 20 75 73 65 66 75 6c 2c 20  nything useful, 
7d80: 73 6f 20 64 65 6c 65 74 65 20 69 74 2e 0a 0a 09  so delete it....
7d90: 66 6f 72 65 61 63 68 20 72 6f 6f 74 20 24 6d 79  foreach root $my
7da0: 72 6f 6f 74 73 20 7b 0a 09 20 20 20 20 69 66 20  roots {..    if 
7db0: 7b 5b 24 72 6f 6f 74 20 69 73 6e 65 65 64 65 64  {[$root isneeded
7dc0: 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 20 20 20  ]} continue..   
7dd0: 20 6c 6f 67 20 77 72 69 74 65 20 32 20 66 69 6c   log write 2 fil
7de0: 65 20 22 52 65 6d 6f 76 69 6e 67 20 75 6e 6e 65  e "Removing unne
7df0: 63 65 73 73 61 72 79 20 64 65 61 64 20 72 65 76  cessary dead rev
7e00: 69 73 69 6f 6e 20 5b 24 72 6f 6f 74 20 72 65 76  ision [$root rev
7e10: 6e 72 5d 22 0a 0a 09 20 20 20 20 23 20 52 65 6d  nr]"...    # Rem
7e20: 6f 76 65 20 61 73 20 72 6f 6f 74 2c 20 6d 61 6b  ove as root, mak
7e30: 65 20 69 74 73 20 63 68 69 6c 64 20 6e 65 77 20  e its child new 
7e40: 72 6f 6f 74 20 61 66 74 65 72 0a 09 20 20 20 20  root after..    
7e50: 23 20 64 69 73 63 6f 6e 6e 65 63 74 69 6e 67 20  # disconnecting 
7e60: 69 74 20 66 72 6f 6d 20 74 68 65 20 72 65 76 69  it from the revi
7e70: 73 69 6f 6e 20 6a 75 73 74 20 67 6f 69 6e 67 20  sion just going 
7e80: 61 77 61 79 2e 0a 0a 09 20 20 20 20 6c 64 65 6c  away....    ldel
7e90: 65 74 65 20 6d 79 72 6f 6f 74 73 20 24 72 6f 6f  ete myroots $roo
7ea0: 74 0a 09 20 20 20 20 69 66 20 7b 5b 24 72 6f 6f  t..    if {[$roo
7eb0: 74 20 68 61 73 63 68 69 6c 64 5d 7d 20 7b 0a 09  t haschild]} {..
7ec0: 09 73 65 74 20 63 68 69 6c 64 20 5b 24 72 6f 6f  .set child [$roo
7ed0: 74 20 63 68 69 6c 64 5d 0a 09 09 24 63 68 69 6c  t child]...$chil
7ee0: 64 20 63 75 74 66 72 6f 6d 70 61 72 65 6e 74 0a  d cutfromparent.
7ef0: 09 09 6c 61 70 70 65 6e 64 20 6d 79 72 6f 6f 74  ..lappend myroot
7f00: 73 20 24 63 68 69 6c 64 0a 09 20 20 20 20 7d 0a  s $child..    }.
7f10: 0a 09 20 20 20 20 23 20 43 75 74 20 6f 75 74 20  ..    # Cut out 
7f20: 74 68 65 20 62 72 61 6e 63 68 65 73 20 73 70 61  the branches spa
7f30: 77 6e 65 64 20 62 79 20 74 68 65 20 72 65 76 69  wned by the revi
7f40: 73 69 6f 6e 20 74 6f 20 62 65 0a 09 20 20 20 20  sion to be..    
7f50: 23 20 64 65 6c 65 74 65 64 2e 20 49 66 20 74 68  # deleted. If th
7f60: 65 20 62 72 61 6e 63 68 20 68 61 73 20 72 65 76  e branch has rev
7f70: 69 73 69 6f 6e 73 20 74 68 65 79 20 73 68 6f 75  isions they shou
7f80: 6c 64 20 61 6c 72 65 61 64 79 0a 09 20 20 20 20  ld already..    
7f90: 23 20 75 73 65 20 6f 70 65 72 61 74 69 6f 6e 20  # use operation 
7fa0: 27 61 64 64 27 2c 20 6e 6f 20 6e 65 65 64 20 74  'add', no need t
7fb0: 6f 20 63 68 61 6e 67 65 20 74 68 61 74 2e 20 54  o change that. T
7fc0: 68 65 20 66 69 72 73 74 0a 09 20 20 20 20 23 20  he first..    # 
7fd0: 72 65 76 69 73 69 6f 6e 20 6f 6e 20 65 61 63 68  revision on each
7fe0: 20 62 72 61 6e 63 68 20 62 65 63 6f 6d 65 73 20   branch becomes 
7ff0: 61 20 6e 65 77 20 61 6e 64 20 64 69 73 63 6f 6e  a new and discon
8000: 6e 65 63 74 65 64 0a 09 20 20 20 20 23 20 72 6f  nected..    # ro
8010: 6f 74 2e 0a 0a 09 20 20 20 20 66 6f 72 65 61 63  ot....    foreac
8020: 68 20 62 72 61 6e 63 68 20 5b 24 72 6f 6f 74 20  h branch [$root 
8030: 62 72 61 6e 63 68 65 73 5d 20 7b 0a 09 09 24 62  branches] {...$b
8040: 72 61 6e 63 68 20 63 75 74 62 72 61 6e 63 68 70  ranch cutbranchp
8050: 61 72 65 6e 74 0a 09 09 69 66 20 7b 21 5b 24 62  arent...if {![$b
8060: 72 61 6e 63 68 20 68 61 73 63 68 69 6c 64 5d 7d  ranch haschild]}
8070: 20 63 6f 6e 74 69 6e 75 65 0a 09 09 73 65 74 20   continue...set 
8080: 66 69 72 73 74 20 5b 24 62 72 61 6e 63 68 20 63  first [$branch c
8090: 68 69 6c 64 5d 0a 09 09 24 66 69 72 73 74 20 63  hild]...$first c
80a0: 75 74 66 72 6f 6d 70 61 72 65 6e 74 0a 09 09 6c  utfromparent...l
80b0: 61 70 70 65 6e 64 20 6d 79 72 6f 6f 74 73 20 24  append myroots $
80c0: 66 69 72 73 74 0a 09 20 20 20 20 7d 0a 09 20 20  first..    }..  
80d0: 20 20 24 72 6f 6f 74 20 72 65 6d 6f 76 65 61 6c    $root removeal
80e0: 6c 62 72 61 6e 63 68 65 73 0a 0a 09 20 20 20 20  lbranches...    
80f0: 23 20 54 61 67 67 69 6e 67 20 61 20 64 65 61 64  # Tagging a dead
8100: 20 72 65 76 69 73 69 6f 6e 20 64 6f 65 73 6e 27   revision doesn'
8110: 74 20 64 6f 20 61 6e 79 74 68 69 6e 67 2c 20 73  t do anything, s
8120: 6f 20 72 65 6d 6f 76 65 0a 09 20 20 20 20 23 20  o remove..    # 
8130: 61 6e 79 20 74 61 67 73 20 74 68 61 74 20 77 65  any tags that we
8140: 72 65 20 73 65 74 20 6f 6e 20 69 74 2e 0a 0a 09  re set on it....
8150: 20 20 20 20 24 72 6f 6f 74 20 72 65 6d 6f 76 65      $root remove
8160: 61 6c 6c 74 61 67 73 0a 0a 09 20 20 20 20 23 20  alltags...    # 
8170: 54 68 69 73 20 63 61 6e 20 6f 6e 6c 79 20 68 61  This can only ha
8180: 70 70 65 6e 20 6f 6e 63 65 20 70 65 72 20 66 69  ppen once per fi
8190: 6c 65 2c 20 61 6e 64 20 77 65 20 6d 69 67 68 74  le, and we might
81a0: 20 68 61 76 65 0a 09 20 20 20 20 23 20 6a 75 73   have..    # jus
81b0: 74 20 63 68 61 6e 67 65 64 20 6d 79 72 6f 6f 74  t changed myroot
81c0: 73 2c 20 73 6f 20 65 6e 64 20 74 68 65 20 6c 6f  s, so end the lo
81d0: 6f 70 0a 09 20 20 20 20 62 72 65 61 6b 0a 09 7d  op..    break..}
81e0: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
81f0: 20 20 20 20 6d 65 74 68 6f 64 20 52 65 6d 6f 76      method Remov
8200: 65 49 6e 69 74 69 61 6c 42 72 61 6e 63 68 44 65  eInitialBranchDe
8210: 6c 65 74 69 6f 6e 73 20 7b 7d 20 7b 0a 09 23 20  letions {} {..# 
8220: 46 72 6f 6d 20 63 76 73 32 73 76 6e 3a 20 49 66  From cvs2svn: If
8230: 20 74 68 65 20 66 69 72 73 74 20 72 65 76 69 73   the first revis
8240: 69 6f 6e 20 6f 6e 20 61 20 62 72 61 6e 63 68 20  ion on a branch 
8250: 69 73 20 61 6e 0a 09 23 20 75 6e 6e 65 63 65 73  is an..# unneces
8260: 73 61 72 79 20 64 65 6c 65 74 65 2c 20 72 65 6d  sary delete, rem
8270: 6f 76 65 20 69 74 2e 0a 09 23 0a 09 23 20 49 66  ove it...#..# If
8280: 20 61 20 66 69 6c 65 20 69 73 20 61 64 64 65 64   a file is added
8290: 20 6f 6e 20 61 20 62 72 61 6e 63 68 20 28 77 68   on a branch (wh
82a0: 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 69 74 20  ether or not it 
82b0: 61 6c 72 65 61 64 79 0a 09 23 20 65 78 69 73 74  already..# exist
82c0: 65 64 20 6f 6e 20 74 72 75 6e 6b 29 2c 20 74 68  ed on trunk), th
82d0: 65 6e 20 6e 65 77 20 76 65 72 73 69 6f 6e 73 20  en new versions 
82e0: 6f 66 20 43 56 53 20 61 64 64 20 61 20 66 69 72  of CVS add a fir
82f0: 73 74 0a 09 23 20 62 72 61 6e 63 68 20 72 65 76  st..# branch rev
8300: 69 73 69 6f 6e 20 69 6e 20 74 68 65 20 27 64 65  ision in the 'de
8310: 61 64 27 20 73 74 61 74 65 20 28 74 6f 20 69 6e  ad' state (to in
8320: 64 69 63 61 74 65 20 74 68 61 74 20 74 68 65 0a  dicate that the.
8330: 09 23 20 66 69 6c 65 20 64 69 64 20 6e 6f 74 20  .# file did not 
8340: 65 78 69 73 74 20 6f 6e 20 74 68 65 20 62 72 61  exist on the bra
8350: 6e 63 68 20 77 68 65 6e 20 74 68 65 20 62 72 61  nch when the bra
8360: 6e 63 68 20 77 61 73 0a 09 23 20 63 72 65 61 74  nch was..# creat
8370: 65 64 29 20 66 6f 6c 6c 6f 77 65 64 20 62 79 20  ed) followed by 
8380: 74 68 65 20 73 65 63 6f 6e 64 20 62 72 61 6e 63  the second branc
8390: 68 20 72 65 76 69 73 69 6f 6e 2c 20 77 68 69 63  h revision, whic
83a0: 68 20 69 73 20 61 6e 0a 09 23 20 61 64 64 2e 20  h is an..# add. 
83b0: 20 57 68 65 6e 20 77 65 20 65 6e 63 6f 75 6e 74   When we encount
83c0: 65 72 20 74 68 69 73 20 73 69 74 75 61 74 69 6f  er this situatio
83d0: 6e 2c 20 77 65 20 73 65 76 65 72 20 74 68 65 20  n, we sever the 
83e0: 62 72 61 6e 63 68 0a 09 23 20 66 72 6f 6d 20 74  branch..# from t
83f0: 72 75 6e 6b 20 61 6e 64 20 64 65 6c 65 74 65 20  runk and delete 
8400: 74 68 65 20 66 69 72 73 74 20 62 72 61 6e 63 68  the first branch
8410: 20 72 65 76 69 73 69 6f 6e 2e 0a 0a 09 23 20 41   revision....# A
8420: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 77 65 20  t this point we 
8430: 6d 61 79 20 68 61 76 65 20 61 6c 72 65 61 64 79  may have already
8440: 20 6d 75 6c 74 69 70 6c 65 20 72 6f 6f 74 73 20   multiple roots 
8450: 69 6e 20 6d 79 72 6f 6f 74 73 2c 0a 09 23 20 77  in myroots,..# w
8460: 65 20 68 61 76 65 20 74 6f 20 70 72 6f 63 65 73  e have to proces
8470: 73 20 74 68 65 6d 20 61 6c 6c 2e 0a 0a 09 66 6f  s them all....fo
8480: 72 65 61 63 68 20 72 6f 6f 74 20 5b 24 73 65 6c  reach root [$sel
8490: 66 20 4c 69 6e 65 73 4f 66 44 65 76 65 6c 6f 70  f LinesOfDevelop
84a0: 6d 65 6e 74 5d 20 7b 0a 09 20 20 20 20 69 66 20  ment] {..    if 
84b0: 7b 5b 24 72 6f 6f 74 20 69 73 6e 65 65 64 65 64  {[$root isneeded
84c0: 62 72 61 6e 63 68 64 65 6c 5d 7d 20 63 6f 6e 74  branchdel]} cont
84d0: 69 6e 75 65 0a 09 20 20 20 20 6c 6f 67 20 77 72  inue..    log wr
84e0: 69 74 65 20 32 20 66 69 6c 65 20 22 52 65 6d 6f  ite 2 file "Remo
84f0: 76 69 6e 67 20 75 6e 6e 65 63 65 73 73 61 72 79  ving unnecessary
8500: 20 69 6e 69 74 69 61 6c 20 62 72 61 6e 63 68 20   initial branch 
8510: 64 65 6c 65 74 65 20 5b 24 72 6f 6f 74 20 72 65  delete [$root re
8520: 76 6e 72 5d 22 0a 0a 09 20 20 20 20 73 65 74 20  vnr]"...    set 
8530: 62 72 61 6e 63 68 20 5b 24 72 6f 6f 74 20 70 61  branch [$root pa
8540: 72 65 6e 74 62 72 61 6e 63 68 5d 0a 09 20 20 20  rentbranch]..   
8550: 20 73 65 74 20 70 61 72 65 6e 74 20 5b 24 72 6f   set parent [$ro
8560: 6f 74 20 70 61 72 65 6e 74 5d 0a 09 20 20 20 20  ot parent]..    
8570: 73 65 74 20 63 68 69 6c 64 20 20 5b 24 72 6f 6f  set child  [$roo
8580: 74 20 63 68 69 6c 64 5d 0a 0a 09 20 20 20 20 6c  t child]...    l
8590: 64 65 6c 65 74 65 20 6d 79 72 6f 6f 74 73 20 24  delete myroots $
85a0: 72 6f 6f 74 0a 09 20 20 20 20 6c 61 70 70 65 6e  root..    lappen
85b0: 64 20 6d 79 72 6f 6f 74 73 20 24 63 68 69 6c 64  d myroots $child
85c0: 0a 0a 09 20 20 20 20 24 62 72 61 6e 63 68 20 63  ...    $branch c
85d0: 75 74 62 72 61 6e 63 68 70 61 72 65 6e 74 0a 09  utbranchparent..
85e0: 20 20 20 20 24 62 72 61 6e 63 68 20 63 75 74 63      $branch cutc
85f0: 68 69 6c 64 0a 09 20 20 20 20 24 63 68 69 6c 64  hild..    $child
8600: 20 20 63 75 74 66 72 6f 6d 70 61 72 65 6e 74 0a    cutfromparent.
8610: 0a 09 20 20 20 20 24 62 72 61 6e 63 68 20 73 65  ..    $branch se
8620: 74 63 68 69 6c 64 20 20 20 20 20 20 20 20 24 63  tchild        $c
8630: 68 69 6c 64 0a 09 20 20 20 20 24 63 68 69 6c 64  hild..    $child
8640: 20 20 73 65 74 70 61 72 65 6e 74 62 72 61 6e 63    setparentbranc
8650: 68 20 24 62 72 61 6e 63 68 0a 0a 09 20 20 20 20  h $branch...    
8660: 24 70 61 72 65 6e 74 20 72 65 6d 6f 76 65 62 72  $parent removebr
8670: 61 6e 63 68 20 20 20 20 20 20 20 20 24 62 72 61  anch        $bra
8680: 6e 63 68 0a 09 20 20 20 20 24 70 61 72 65 6e 74  nch..    $parent
8690: 20 72 65 6d 6f 76 65 63 68 69 6c 64 6f 6e 62 72   removechildonbr
86a0: 61 6e 63 68 20 24 72 6f 6f 74 0a 09 7d 0a 09 72  anch $root..}..r
86b0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
86c0: 20 6d 65 74 68 6f 64 20 4c 69 6e 65 73 4f 66 44   method LinesOfD
86d0: 65 76 65 6c 6f 70 6d 65 6e 74 20 7b 7d 20 7b 0a  evelopment {} {.
86e0: 09 23 20 44 65 74 65 72 6d 69 6e 65 20 61 6c 6c  .# Determine all
86f0: 20 6c 69 6e 65 73 20 6f 66 20 64 65 76 65 6c 6f   lines of develo
8700: 70 6d 65 6e 74 20 66 6f 72 20 74 68 65 20 66 69  pment for the fi
8710: 6c 65 2e 20 54 68 69 73 20 61 72 65 0a 09 23 20  le. This are..# 
8720: 74 68 65 20 6b 6e 6f 77 6e 20 72 6f 6f 74 73 2c  the known roots,
8730: 20 61 6e 64 20 74 68 65 20 72 6f 6f 74 20 6f 66   and the root of
8740: 20 61 6c 6c 20 62 72 61 6e 63 68 65 73 20 66 6f   all branches fo
8750: 75 6e 64 20 6f 6e 20 74 68 65 0a 09 23 20 6c 69  und on the..# li
8760: 6e 65 20 6f 66 20 70 72 69 6d 61 72 79 20 63 68  ne of primary ch
8770: 69 6c 64 72 65 6e 2e 0a 0a 09 73 65 74 20 6c 6f  ildren....set lo
8780: 64 72 6f 6f 74 73 20 7b 7d 0a 09 66 6f 72 65 61  droots {}..forea
8790: 63 68 20 72 6f 6f 74 20 24 6d 79 72 6f 6f 74 73  ch root $myroots
87a0: 20 7b 0a 09 20 20 20 20 24 73 65 6c 66 20 41 64   {..    $self Ad
87b0: 64 42 72 61 6e 63 68 65 64 4c 69 6e 65 73 4f 66  dBranchedLinesOf
87c0: 44 65 76 65 6c 6f 70 6d 65 6e 74 20 6c 6f 64 72  Development lodr
87d0: 6f 6f 74 73 20 24 72 6f 6f 74 0a 09 20 20 20 20  oots $root..    
87e0: 6c 61 70 70 65 6e 64 20 6c 6f 64 72 6f 6f 74 73  lappend lodroots
87f0: 20 24 72 6f 6f 74 0a 09 7d 0a 09 72 65 74 75 72   $root..}..retur
8800: 6e 20 24 6c 6f 64 72 6f 6f 74 73 0a 20 20 20 20  n $lodroots.    
8810: 7d 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 41 64  }..    method Ad
8820: 64 42 72 61 6e 63 68 65 64 4c 69 6e 65 73 4f 66  dBranchedLinesOf
8830: 44 65 76 65 6c 6f 70 6d 65 6e 74 20 7b 6c 76 20  Development {lv 
8840: 72 6f 6f 74 7d 20 7b 0a 09 75 70 76 61 72 20 31  root} {..upvar 1
8850: 20 24 6c 76 20 6c 6f 64 72 6f 6f 74 73 0a 09 77   $lv lodroots..w
8860: 68 69 6c 65 20 7b 24 72 6f 6f 74 20 6e 65 20 22  hile {$root ne "
8870: 22 7d 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 63  "} {..    foreac
8880: 68 20 62 72 61 6e 63 68 20 5b 24 72 6f 6f 74 20  h branch [$root 
8890: 62 72 61 6e 63 68 65 73 5d 20 7b 0a 09 09 69 66  branches] {...if
88a0: 20 7b 21 5b 24 62 72 61 6e 63 68 20 68 61 73 63   {![$branch hasc
88b0: 68 69 6c 64 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a  hild]} continue.
88c0: 09 09 73 65 74 20 63 68 69 6c 64 20 5b 24 62 72  ..set child [$br
88d0: 61 6e 63 68 20 63 68 69 6c 64 5d 0a 09 09 23 20  anch child]...# 
88e0: 52 65 63 75 72 73 65 20 69 6e 74 6f 20 74 68 65  Recurse into the
88f0: 20 62 72 61 6e 63 68 20 66 6f 72 20 64 65 65 70   branch for deep
8900: 65 72 20 62 72 61 6e 63 68 65 73 2e 0a 09 09 24  er branches....$
8910: 73 65 6c 66 20 41 64 64 42 72 61 6e 63 68 65 64  self AddBranched
8920: 4c 69 6e 65 73 4f 66 44 65 76 65 6c 6f 70 6d 65  LinesOfDevelopme
8930: 6e 74 20 6c 6f 64 72 6f 6f 74 73 20 24 63 68 69  nt lodroots $chi
8940: 6c 64 0a 09 09 6c 61 70 70 65 6e 64 20 6c 6f 64  ld...lappend lod
8950: 72 6f 6f 74 73 20 24 63 68 69 6c 64 0a 09 20 20  roots $child..  
8960: 20 20 7d 0a 09 20 20 20 20 73 65 74 20 72 6f 6f    }..    set roo
8970: 74 20 5b 24 72 6f 6f 74 20 63 68 69 6c 64 5d 0a  t [$root child].
8980: 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d  .}..return.    }
8990: 0a 0a 20 20 20 20 6d 65 74 68 6f 64 20 45 78 63  ..    method Exc
89a0: 6c 75 64 65 4e 6f 6e 54 72 75 6e 6b 49 6e 66 6f  ludeNonTrunkInfo
89b0: 72 6d 61 74 69 6f 6e 20 7b 7d 20 7b 0a 09 23 20  rmation {} {..# 
89c0: 52 65 6d 6f 76 65 20 61 6c 6c 20 6e 6f 6e 2d 74  Remove all non-t
89d0: 72 75 6e 6b 20 62 72 61 6e 63 68 65 73 2c 20 72  runk branches, r
89e0: 65 76 69 73 69 6f 6e 73 2c 20 61 6e 64 20 74 61  evisions, and ta
89f0: 67 73 2e 20 57 65 20 64 6f 0a 09 23 20 6b 65 65  gs. We do..# kee
8a00: 70 20 74 68 65 20 74 61 67 73 20 77 68 69 63 68  p the tags which
8a10: 20 61 72 65 20 6f 6e 20 74 68 65 20 74 72 75 6e   are on the trun
8a20: 6b 2e 0a 0a 09 73 65 74 20 6e 74 64 62 72 6f 6f  k....set ntdbroo
8a30: 74 20 22 22 0a 09 66 6f 72 65 61 63 68 20 72 6f  t ""..foreach ro
8a40: 6f 74 20 5b 24 73 65 6c 66 20 4c 69 6e 65 73 4f  ot [$self LinesO
8a50: 66 44 65 76 65 6c 6f 70 6d 65 6e 74 5d 20 7b 0a  fDevelopment] {.
8a60: 09 20 20 20 20 23 20 4e 6f 74 65 3a 20 48 65 72  .    # Note: Her
8a70: 65 20 74 68 65 20 6f 72 64 65 72 20 6f 66 20 74  e the order of t
8a80: 68 65 20 72 6f 6f 74 73 20 69 73 20 69 6d 70 6f  he roots is impo
8a90: 72 74 61 6e 74 2c 0a 09 20 20 20 20 23 20 69 2e  rtant,..    # i.
8aa0: 65 2e 20 74 68 61 74 20 77 65 20 67 65 74 20 74  e. that we get t
8ab0: 68 65 6d 20 69 6e 20 64 65 70 74 68 20 66 69 72  hem in depth fir
8ac0: 73 74 20 6f 72 64 65 72 2e 20 54 68 69 73 20 65  st order. This e
8ad0: 6e 73 75 72 65 73 0a 09 20 20 20 20 23 20 74 68  nsures..    # th
8ae0: 61 74 20 74 68 65 20 72 65 6d 6f 76 61 6c 20 6f  at the removal o
8af0: 66 20 61 20 62 72 61 6e 63 68 20 68 61 70 70 65  f a branch happe
8b00: 6e 73 20 6f 6e 6c 79 20 61 66 74 65 72 20 74 68  ns only after th
8b10: 65 0a 09 20 20 20 20 23 20 62 72 61 6e 63 68 65  e..    # branche
8b20: 73 20 73 70 61 77 6e 65 64 20 66 72 6f 6d 20 69  s spawned from i
8b30: 74 20 77 65 72 65 20 72 65 6d 6f 76 65 64 2e 20  t were removed. 
8b40: 4f 74 68 65 72 77 69 73 65 20 74 68 65 0a 09 20  Otherwise the.. 
8b50: 20 20 20 23 20 73 79 73 74 65 6d 20 6d 69 67 68     # system migh
8b60: 74 20 74 72 79 20 74 6f 20 61 63 63 65 73 73 20  t try to access 
8b70: 64 65 6c 65 74 65 64 20 6f 62 6a 65 63 74 73 2e  deleted objects.
8b80: 0a 0a 09 20 20 20 20 23 20 44 6f 20 6e 6f 74 20  ...    # Do not 
8b90: 65 78 63 6c 75 64 65 20 74 68 65 20 74 72 75 6e  exclude the trun
8ba0: 6b 2e 0a 09 20 20 20 20 69 66 20 7b 5b 5b 24 72  k...    if {[[$r
8bb0: 6f 6f 74 20 6c 6f 64 5d 20 69 73 74 72 75 6e 6b  oot lod] istrunk
8bc0: 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a 09 20 20 20  ]} continue..   
8bd0: 20 24 73 65 6c 66 20 45 78 63 6c 75 64 65 42 72   $self ExcludeBr
8be0: 61 6e 63 68 20 24 72 6f 6f 74 20 6e 74 64 62 72  anch $root ntdbr
8bf0: 6f 6f 74 0a 09 7d 0a 0a 09 69 66 20 7b 24 6e 74  oot..}...if {$nt
8c00: 64 62 72 6f 6f 74 20 6e 65 20 22 22 7d 20 7b 0a  dbroot ne ""} {.
8c10: 09 20 20 20 20 24 73 65 6c 66 20 47 72 61 66 74  .    $self Graft
8c20: 4e 54 44 42 32 54 72 75 6e 6b 20 24 6e 74 64 62  NTDB2Trunk $ntdb
8c30: 72 6f 6f 74 0a 09 7d 0a 09 72 65 74 75 72 6e 0a  root..}..return.
8c40: 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74 68 6f      }..    metho
8c50: 64 20 45 78 63 6c 75 64 65 42 72 61 6e 63 68 20  d ExcludeBranch 
8c60: 7b 72 6f 6f 74 20 6e 76 7d 20 7b 0a 09 23 20 45  {root nv} {..# E
8c70: 78 63 6c 75 64 65 20 74 68 65 20 62 72 61 6e 63  xclude the branc
8c80: 68 2f 6c 6f 64 20 73 74 61 72 74 69 6e 67 20 61  h/lod starting a
8c90: 74 20 72 6f 6f 74 2c 20 61 20 72 65 76 69 73 69  t root, a revisi
8ca0: 6f 6e 2e 0a 09 23 0a 09 23 20 49 66 20 74 68 65  on...#..# If the
8cb0: 20 4c 4f 44 20 73 74 61 72 74 73 20 77 69 74 68   LOD starts with
8cc0: 20 6e 6f 6e 2d 74 72 75 6e 6b 20 64 65 66 61 75   non-trunk defau
8cd0: 6c 74 20 62 72 61 6e 63 68 20 72 65 76 69 73 69  lt branch revisi
8ce0: 6f 6e 73 2c 0a 09 23 20 77 65 20 6c 65 61 76 65  ons,..# we leave
8cf0: 20 74 68 65 6d 20 69 6e 20 70 6c 61 63 65 20 61   them in place a
8d00: 6e 64 20 64 6f 20 6e 6f 74 20 64 65 6c 65 74 65  nd do not delete
8d10: 20 74 68 65 20 62 72 61 6e 63 68 2e 20 49 6e 20   the branch. In 
8d20: 74 68 61 74 0a 09 23 20 63 61 73 65 20 74 68 65  that..# case the
8d30: 20 63 6f 6d 6d 61 6e 64 20 73 65 74 73 20 74 68   command sets th
8d40: 65 20 76 61 72 69 61 62 6c 65 20 69 6e 20 4e 56  e variable in NV
8d50: 20 73 6f 20 74 68 61 74 20 77 65 20 63 61 6e 0a   so that we can.
8d60: 09 23 20 6c 61 74 65 72 20 72 65 77 6f 72 6b 20  .# later rework 
8d70: 74 68 65 73 65 20 72 65 76 69 73 6f 6e 73 20 74  these revisons t
8d80: 6f 20 62 65 20 70 75 72 65 6c 79 20 74 72 75 6e  o be purely trun
8d90: 6b 2e 0a 0a 09 69 66 20 7b 5b 24 72 6f 6f 74 20  k....if {[$root 
8da0: 69 73 6f 6e 64 65 66 61 75 6c 74 62 72 61 6e 63  isondefaultbranc
8db0: 68 5d 7d 20 7b 0a 09 20 20 20 20 23 20 48 61 6e  h]} {..    # Han
8dc0: 64 6c 69 6e 67 20 61 20 4e 54 44 42 2e 20 54 68  dling a NTDB. Th
8dd0: 69 73 20 62 72 61 6e 63 68 20 6d 61 79 20 63 6f  is branch may co
8de0: 6e 73 69 73 74 73 20 6e 6f 74 20 6f 6e 6c 79 20  nsists not only 
8df0: 6f 66 0a 09 20 20 20 20 23 20 4e 54 44 42 20 72  of..    # NTDB r
8e00: 65 76 69 73 69 6f 6e 73 2c 20 62 75 74 20 61 6c  evisions, but al
8e10: 73 6f 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 54 44 42  so some non-NTDB
8e20: 2e 20 54 68 65 20 6c 61 74 74 65 72 20 61 72 65  . The latter are
8e30: 0a 09 20 20 20 20 23 20 74 72 75 6c 79 20 6f 6e  ..    # truly on
8e40: 20 61 20 62 72 61 6e 63 68 20 61 6e 64 20 68 61   a branch and ha
8e50: 76 65 20 74 6f 20 62 65 20 65 78 63 6c 75 64 65  ve to be exclude
8e60: 64 2e 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  d. The following
8e70: 0a 09 20 20 20 20 23 20 6c 6f 6f 70 20 64 65 74  ..    # loop det
8e80: 65 72 6d 69 6e 65 73 20 69 66 20 74 68 65 72 65  ermines if there
8e90: 20 61 72 65 20 73 75 63 68 20 72 65 76 69 73 69   are such revisi
8ea0: 6f 6e 73 2e 0a 0a 09 20 20 20 20 75 70 76 61 72  ons....    upvar
8eb0: 20 31 20 24 6e 76 20 6e 74 64 62 72 6f 6f 74 0a   1 $nv ntdbroot.
8ec0: 09 20 20 20 20 73 65 74 20 6e 74 64 62 72 6f 6f  .    set ntdbroo
8ed0: 74 20 24 72 6f 6f 74 0a 09 20 20 20 20 24 72 6f  t $root..    $ro
8ee0: 6f 74 20 63 75 74 66 72 6f 6d 70 61 72 65 6e 74  ot cutfromparent
8ef0: 62 72 61 6e 63 68 0a 0a 09 20 20 20 20 73 65 74  branch...    set
8f00: 20 72 65 76 20 24 72 6f 6f 74 0a 09 20 20 20 20   rev $root..    
8f10: 77 68 69 6c 65 20 7b 24 72 65 76 20 6e 65 20 22  while {$rev ne "
8f20: 22 7d 20 7b 0a 09 09 24 72 65 76 20 72 65 6d 6f  "} {...$rev remo
8f30: 76 65 61 6c 6c 62 72 61 6e 63 68 65 73 0a 09 09  veallbranches...
8f40: 23 20 53 65 65 20 6e 6f 74 65 20 5b 78 5d 2e 0a  # See note [x]..
8f50: 0a 09 09 69 66 20 7b 5b 24 72 65 76 20 69 73 6f  ...if {[$rev iso
8f60: 6e 64 65 66 61 75 6c 74 62 72 61 6e 63 68 5d 7d  ndefaultbranch]}
8f70: 20 7b 0a 09 09 20 20 20 20 73 65 74 20 72 65 76   {...    set rev
8f80: 20 5b 24 72 65 76 20 63 68 69 6c 64 5d 0a 09 09   [$rev child]...
8f90: 7d 20 65 6c 73 65 20 7b 0a 09 09 20 20 20 20 62  } else {...    b
8fa0: 72 65 61 6b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a  reak...}..    }.
8fb0: 0a 09 20 20 20 20 23 20 72 65 76 20 6e 6f 77 20  ..    # rev now 
8fc0: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 66 69 72  contains the fir
8fd0: 73 74 20 6e 6f 6e 2d 4e 54 44 42 20 72 65 76 69  st non-NTDB revi
8fe0: 73 69 6f 6e 20 61 66 74 65 72 20 74 68 65 0a 09  sion after the..
8ff0: 20 20 20 20 23 20 4e 54 44 42 2c 20 6f 72 20 69      # NTDB, or i
9000: 73 20 65 6d 70 74 79 20 69 66 20 74 68 65 72 65  s empty if there
9010: 20 69 73 20 6e 6f 20 73 75 63 68 2e 20 49 66 20   is no such. If 
9020: 77 65 20 68 61 76 65 20 73 6f 6d 65 0a 09 20 20  we have some..  
9030: 20 20 23 20 74 68 65 79 20 68 61 76 65 20 74 6f    # they have to
9040: 20 72 65 6d 6f 76 65 64 2e 0a 0a 09 20 20 20 20   removed....    
9050: 69 66 20 7b 24 72 65 76 20 6e 65 20 22 22 7d 20  if {$rev ne ""} 
9060: 20 7b 0a 09 09 73 65 74 20 6c 61 73 74 6e 74 64   {...set lastntd
9070: 62 20 5b 24 72 65 76 20 70 61 72 65 6e 74 5d 0a  b [$rev parent].
9080: 09 09 24 6c 61 73 74 6e 74 64 62 20 63 75 74 66  ..$lastntdb cutf
9090: 72 6f 6d 63 68 69 6c 64 0a 09 09 77 68 69 6c 65  romchild...while
90a0: 20 7b 24 72 65 76 20 6e 65 20 22 22 7d 20 7b 0a   {$rev ne ""} {.
90b0: 09 09 20 20 20 20 24 72 65 76 20 72 65 6d 6f 76  ..    $rev remov
90c0: 65 61 6c 6c 74 61 67 73 0a 09 09 20 20 20 20 24  ealltags...    $
90d0: 72 65 76 20 72 65 6d 6f 76 65 61 6c 6c 62 72 61  rev removeallbra
90e0: 6e 63 68 65 73 0a 09 09 20 20 20 20 23 20 4e 6f  nches...    # No
90f0: 74 65 20 5b 78 5d 3a 20 57 65 20 6d 61 79 20 73  te [x]: We may s
9100: 74 69 6c 6c 20 68 61 76 65 20 68 61 64 20 62 72  till have had br
9110: 61 6e 63 68 65 73 20 6f 6e 20 74 68 65 0a 09 09  anches on the...
9120: 20 20 20 20 23 20 72 65 76 69 73 69 6f 6e 2e 20      # revision. 
9130: 42 72 61 6e 63 68 65 73 20 77 69 74 68 6f 75 74  Branches without
9140: 20 72 65 76 69 73 69 6f 6e 73 20 63 6f 6d 6d 69   revisions commi
9150: 74 74 65 64 0a 09 09 20 20 20 20 23 20 6f 6e 20  tted...    # on 
9160: 74 68 65 6d 20 64 6f 20 6e 6f 74 20 73 68 6f 77  them do not show
9170: 20 75 70 20 69 6e 20 74 68 65 20 6c 69 73 74 20   up in the list 
9180: 6f 66 20 72 6f 6f 74 73 20 61 6b 61 0a 09 09 20  of roots aka... 
9190: 20 20 20 23 20 6c 69 6e 65 73 20 6f 66 20 64 65     # lines of de
91a0: 76 65 6c 6f 70 6d 65 6e 74 2e 0a 09 09 20 20 20  velopment....   
91b0: 20 73 65 74 20 72 65 76 20 5b 24 72 65 76 20 63   set rev [$rev c
91c0: 68 69 6c 64 5d 0a 09 09 7d 0a 09 20 20 20 20 7d  hild]...}..    }
91d0: 0a 09 20 20 20 20 72 65 74 75 72 6e 0a 09 7d 0a  ..    return..}.
91e0: 0a 09 23 20 4e 6f 20 4e 54 44 42 20 73 74 75 66  ..# No NTDB stuf
91f0: 66 20 74 6f 20 64 65 61 6c 20 77 69 74 68 2e 20  f to deal with. 
9200: 46 69 72 73 74 20 64 65 6c 65 74 65 20 74 68 65  First delete the
9210: 20 62 72 61 6e 63 68 20 6f 62 6a 65 63 74 0a 09   branch object..
9220: 23 20 69 74 73 65 6c 66 2c 20 61 66 74 65 72 20  # itself, after 
9230: 63 75 74 74 69 6e 67 20 61 6c 6c 20 74 68 65 20  cutting all the 
9240: 76 61 72 69 6f 75 73 20 63 6f 6e 6e 65 63 74 69  various connecti
9250: 6f 6e 73 2e 0a 0a 09 73 65 74 20 62 72 61 6e 63  ons....set branc
9260: 68 20 5b 24 72 6f 6f 74 20 70 61 72 65 6e 74 62  h [$root parentb
9270: 72 61 6e 63 68 5d 0a 09 69 66 20 7b 24 62 72 61  ranch]..if {$bra
9280: 6e 63 68 20 6e 65 20 22 22 7d 20 7b 0a 09 20 20  nch ne ""} {..  
9290: 20 20 73 65 74 20 62 72 61 6e 63 68 70 61 72 65    set branchpare
92a0: 6e 74 20 5b 24 62 72 61 6e 63 68 20 70 61 72 65  nt [$branch pare
92b0: 6e 74 5d 0a 09 20 20 20 20 24 62 72 61 6e 63 68  nt]..    $branch
92c0: 70 61 72 65 6e 74 20 72 65 6d 6f 76 65 62 72 61  parent removebra
92d0: 6e 63 68 20 20 20 20 20 20 20 20 24 62 72 61 6e  nch        $bran
92e0: 63 68 0a 09 20 20 20 20 24 62 72 61 6e 63 68 70  ch..    $branchp
92f0: 61 72 65 6e 74 20 72 65 6d 6f 76 65 63 68 69 6c  arent removechil
9300: 64 6f 6e 62 72 61 6e 63 68 20 24 72 6f 6f 74 0a  donbranch $root.
9310: 09 7d 0a 0a 09 23 20 54 68 65 20 72 6f 6f 74 20  .}...# The root 
9320: 69 73 20 6e 6f 20 73 75 63 68 20 61 6e 79 20 6c  is no such any l
9330: 6f 6e 67 65 72 20 65 69 74 68 65 72 2e 0a 09 6c  onger either...l
9340: 64 65 6c 65 74 65 20 6d 79 72 6f 6f 74 73 20 24  delete myroots $
9350: 72 6f 6f 74 0a 0a 09 23 20 4e 6f 77 20 67 6f 20  root...# Now go 
9360: 74 68 72 6f 75 67 68 20 74 68 65 20 6c 69 6e 65  through the line
9370: 20 61 6e 64 20 72 65 6d 6f 76 65 20 61 6c 6c 20   and remove all 
9380: 69 74 73 20 72 65 76 69 73 69 6f 6e 73 2e 0a 0a  its revisions...
9390: 09 77 68 69 6c 65 20 7b 24 72 6f 6f 74 20 6e 65  .while {$root ne
93a0: 20 22 22 7d 20 7b 0a 09 20 20 20 20 24 72 6f 6f   ""} {..    $roo
93b0: 74 20 72 65 6d 6f 76 65 61 6c 6c 74 61 67 73 0a  t removealltags.
93c0: 09 20 20 20 20 24 72 6f 6f 74 20 72 65 6d 6f 76  .    $root remov
93d0: 65 61 6c 6c 62 72 61 6e 63 68 65 73 0a 09 20 20  eallbranches..  
93e0: 20 20 23 20 4e 6f 74 65 3a 20 53 65 65 20 74 68    # Note: See th
93f0: 65 20 6e 6f 74 65 20 5b 78 5d 2e 0a 0a 09 20 20  e note [x]....  
9400: 20 20 23 20 46 72 6f 6d 20 63 76 73 32 73 76 6e    # From cvs2svn
9410: 3a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  : If this is the
9420: 20 6c 61 73 74 20 64 65 66 61 75 6c 74 20 72 65   last default re
9430: 76 69 73 69 6f 6e 20 6f 6e 20 61 0a 09 20 20 20  vision on a..   
9440: 20 23 20 6e 6f 6e 2d 74 72 75 6e 6b 20 64 65 66   # non-trunk def
9450: 61 75 6c 74 20 62 72 61 6e 63 68 20 66 6f 6c 6c  ault branch foll
9460: 6f 77 65 64 20 62 79 20 61 20 31 2e 32 20 72 65  owed by a 1.2 re
9470: 76 69 73 69 6f 6e 2c 0a 09 20 20 20 20 23 20 74  vision,..    # t
9480: 68 65 6e 20 74 68 65 20 31 2e 32 20 72 65 76 69  hen the 1.2 revi
9490: 73 69 6f 6e 20 64 65 70 65 6e 64 73 20 6f 6e 20  sion depends on 
94a0: 74 68 69 73 20 6f 6e 65 2e 20 20 46 49 58 4d 45  this one.  FIXME
94b0: 3a 20 49 74 20 69 73 0a 09 20 20 20 20 23 20 71  : It is..    # q
94c0: 75 65 73 74 69 6f 6e 61 62 6c 65 20 77 68 65 74  uestionable whet
94d0: 68 65 72 20 74 68 69 73 20 68 61 6e 64 6c 69 6e  her this handlin
94e0: 67 20 69 73 20 63 6f 72 72 65 63 74 2c 20 73 69  g is correct, si
94f0: 6e 63 65 20 74 68 65 0a 09 20 20 20 20 23 20 6e  nce the..    # n
9500: 6f 6e 2d 74 72 75 6e 6b 20 64 65 66 61 75 6c 74  on-trunk default
9510: 20 62 72 61 6e 63 68 20 72 65 76 69 73 69 6f 6e   branch revision
9520: 73 20 61 66 66 65 63 74 20 74 72 75 6e 6b 20 61  s affect trunk a
9530: 6e 64 0a 09 20 20 20 20 23 20 73 68 6f 75 6c 64  nd..    # should
9540: 20 74 68 65 72 65 66 6f 72 65 20 6e 6f 74 20 6a   therefore not j
9550: 75 73 74 20 62 65 20 64 69 73 63 61 72 64 65 64  ust be discarded
9560: 20 65 76 65 6e 20 69 66 0a 09 20 20 20 20 23 20   even if..    # 
9570: 2d 2d 74 72 75 6e 6b 2d 6f 6e 6c 79 2e 0a 0a 09  --trunk-only....
9580: 20 20 20 20 69 66 20 7b 5b 24 72 6f 6f 74 20 68      if {[$root h
9590: 61 73 64 65 66 61 75 6c 74 62 72 61 6e 63 68 63  asdefaultbranchc
95a0: 68 69 6c 64 5d 7d 20 7b 0a 09 09 73 65 74 20 6e  hild]} {...set n
95b0: 74 64 62 63 68 69 6c 64 20 5b 24 72 6f 6f 74 20  tdbchild [$root 
95c0: 64 65 66 61 75 6c 74 62 72 61 6e 63 68 63 68 69  defaultbranchchi
95d0: 6c 64 5d 0a 09 09 69 6e 74 65 67 72 69 74 79 20  ld]...integrity 
95e0: 61 73 73 65 72 74 20 7b 0a 09 09 20 20 20 20 5b  assert {...    [
95f0: 24 6e 74 64 62 63 68 69 6c 64 20 64 65 66 61 75  $ntdbchild defau
9600: 6c 74 62 72 61 6e 63 68 70 61 72 65 6e 74 5d 20  ltbranchparent] 
9610: 65 71 20 24 6e 74 64 62 63 68 69 6c 64 0a 09 09  eq $ntdbchild...
9620: 7d 20 7b 6e 74 64 62 20 2d 20 74 72 75 6e 6b 20  } {ntdb - trunk 
9630: 6c 69 6e 6b 61 67 65 20 62 72 6f 6b 65 6e 7d 0a  linkage broken}.
9640: 09 09 24 6e 74 64 62 63 68 69 6c 64 20 63 75 74  ..$ntdbchild cut
9650: 64 65 66 61 75 6c 74 62 72 61 6e 63 68 70 61 72  defaultbranchpar
9660: 65 6e 74 0a 09 09 69 66 20 7b 5b 24 6e 74 64 62  ent...if {[$ntdb
9670: 63 68 69 6c 64 20 68 61 73 70 61 72 65 6e 74 5d  child hasparent]
9680: 7d 20 7b 0a 09 09 20 20 20 20 6c 61 70 70 65 6e  } {...    lappen
9690: 64 20 6d 79 72 6f 6f 74 73 20 5b 24 6e 74 64 62  d myroots [$ntdb
96a0: 63 68 69 6c 64 20 70 61 72 65 6e 74 5d 0a 09 09  child parent]...
96b0: 7d 0a 09 20 20 20 20 7d 0a 0a 09 20 20 20 20 73  }..    }...    s
96c0: 65 74 20 72 6f 6f 74 20 5b 24 72 6f 6f 74 20 63  et root [$root c
96d0: 68 69 6c 64 5d 0a 09 7d 0a 0a 09 72 65 74 75 72  hild]..}...retur
96e0: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65 74  n.    }..    met
96f0: 68 6f 64 20 47 72 61 66 74 4e 54 44 42 32 54 72  hod GraftNTDB2Tr
9700: 75 6e 6b 20 7b 72 6f 6f 74 7d 20 7b 0a 09 23 20  unk {root} {..# 
9710: 57 65 20 63 61 6e 20 6e 6f 77 20 67 72 61 66 74  We can now graft
9720: 20 74 68 65 20 6e 6f 6e 2d 74 72 75 6e 6b 20 64   the non-trunk d
9730: 65 66 61 75 6c 74 20 62 72 61 6e 63 68 20 72 65  efault branch re
9740: 76 69 73 69 6f 6e 73 20 74 6f 0a 09 23 20 74 72  visions to..# tr
9750: 75 6e 6b 2e 20 54 68 65 79 20 73 68 6f 75 6c 64  unk. They should
9760: 20 61 6c 72 65 61 64 79 20 62 65 20 61 6c 6f 6e   already be alon
9770: 65 20 6f 6e 20 61 20 43 56 53 42 72 61 6e 63 68  e on a CVSBranch
9780: 2d 6c 65 73 73 0a 09 23 20 62 72 61 6e 63 68 2e  -less..# branch.
9790: 0a 0a 09 69 6e 74 65 67 72 69 74 79 20 61 73 73  ...integrity ass
97a0: 65 72 74 20 7b 21 5b 24 72 6f 6f 74 20 68 61 73  ert {![$root has
97b0: 70 61 72 65 6e 74 62 72 61 6e 63 68 5d 7d 20 7b  parentbranch]} {
97c0: 4e 54 44 42 20 72 6f 6f 74 20 73 74 69 6c 6c 20  NTDB root still 
97d0: 68 61 73 20 69 74 73 20 62 72 61 6e 63 68 20 73  has its branch s
97e0: 79 6d 62 6f 6c 7d 0a 09 69 6e 74 65 67 72 69 74  ymbol}..integrit
97f0: 79 20 61 73 73 65 72 74 20 7b 21 5b 24 72 6f 6f  y assert {![$roo
9800: 74 20 68 61 73 62 72 61 6e 63 68 65 73 5d 7d 20  t hasbranches]} 
9810: 20 20 20 20 7b 4e 54 44 42 20 72 6f 6f 74 20 73      {NTDB root s
9820: 74 69 6c 6c 20 68 61 73 20 73 70 61 77 6e 65 64  till has spawned
9830: 20 62 72 61 6e 63 68 65 73 7d 0a 0a 09 73 65 74   branches}...set
9840: 20 6c 61 73 74 20 24 72 6f 6f 74 0a 09 77 68 69   last $root..whi
9850: 6c 65 20 7b 5b 24 6c 61 73 74 20 68 61 73 63 68  le {[$last hasch
9860: 69 6c 64 5d 7d 20 7b 73 65 74 20 6c 61 73 74 20  ild]} {set last 
9870: 5b 24 6c 61 73 74 20 63 68 69 6c 64 5d 7d 0a 0a  [$last child]}..
9880: 09 69 66 20 7b 5b 24 6c 61 73 74 20 68 61 73 64  .if {[$last hasd
9890: 65 66 61 75 6c 74 62 72 61 6e 63 68 63 68 69 6c  efaultbranchchil
98a0: 64 5d 7d 20 7b 0a 0a 09 20 20 20 20 73 65 74 20  d]} {...    set 
98b0: 72 65 76 31 32 20 5b 24 6c 61 73 74 20 64 65 66  rev12 [$last def
98c0: 61 75 6c 74 62 72 61 6e 63 68 63 68 69 6c 64 5d  aultbranchchild]
98d0: 0a 09 20 20 20 20 24 72 65 76 31 32 20 63 75 74  ..    $rev12 cut
98e0: 64 65 66 61 75 6c 74 62 72 61 6e 63 68 70 61 72  defaultbranchpar
98f0: 65 6e 74 0a 09 20 20 20 20 24 6c 61 73 74 20 20  ent..    $last  
9900: 63 75 74 64 65 66 61 75 6c 74 62 72 61 6e 63 68  cutdefaultbranch
9910: 63 68 69 6c 64 0a 0a 09 20 20 20 20 24 72 65 76  child...    $rev
9920: 31 32 20 63 68 61 6e 67 65 70 61 72 65 6e 74 20  12 changeparent 
9930: 24 6c 61 73 74 0a 09 20 20 20 20 24 6c 61 73 74  $last..    $last
9940: 20 20 63 68 61 6e 67 65 63 68 69 6c 64 20 24 72    changechild $r
9950: 65 76 31 32 0a 0a 09 20 20 20 20 6c 64 65 6c 65  ev12...    ldele
9960: 74 65 20 6d 79 72 6f 6f 74 73 20 24 72 65 76 31  te myroots $rev1
9970: 32 0a 0a 09 20 20 20 20 23 20 4e 6f 74 65 20 61  2...    # Note a
9980: 6e 64 20 72 65 6d 65 6d 62 65 72 20 74 68 61 74  nd remember that
9990: 20 74 68 65 20 74 79 70 65 20 6f 66 20 72 65 76   the type of rev
99a0: 31 32 20 77 61 73 20 61 6c 72 65 61 64 79 0a 09  12 was already..
99b0: 20 20 20 20 23 20 61 64 6a 75 73 74 65 64 20 62      # adjusted b
99c0: 79 20 41 64 6a 75 73 74 4e 6f 6e 54 72 75 6e 6b  y AdjustNonTrunk
99d0: 44 65 66 61 75 6c 74 42 72 61 6e 63 68 2c 20 73  DefaultBranch, s
99e0: 6f 20 77 65 20 64 6f 6e 27 74 0a 09 20 20 20 20  o we don't..    
99f0: 23 20 68 61 76 65 20 74 6f 20 63 68 61 6e 67 65  # have to change
9a00: 20 69 74 73 20 74 79 70 65 20 68 65 72 65 2e 0a   its type here..
9a10: 09 7d 0a 0a 09 77 68 69 6c 65 20 7b 24 72 6f 6f  .}...while {$roo
9a20: 74 20 6e 65 20 22 22 7d 20 7b 0a 09 20 20 20 20  t ne ""} {..    
9a30: 24 72 6f 6f 74 20 73 65 74 6f 6e 64 65 66 61 75  $root setondefau
9a40: 6c 74 62 72 61 6e 63 68 20 30 0a 09 20 20 20 20  ltbranch 0..    
9a50: 24 72 6f 6f 74 20 73 65 74 6c 6f 64 20 24 6d 79  $root setlod $my
9a60: 74 72 75 6e 6b 0a 09 20 20 20 20 66 6f 72 65 61  trunk..    forea
9a70: 63 68 20 74 61 67 20 5b 24 72 6f 6f 74 20 74 61  ch tag [$root ta
9a80: 67 73 5d 20 7b 0a 09 09 24 74 61 67 20 73 65 74  gs] {...$tag set
9a90: 6c 6f 64 20 24 6d 79 74 72 75 6e 6b 0a 09 20 20  lod $mytrunk..  
9aa0: 20 20 7d 0a 09 20 20 20 20 73 65 74 20 72 6f 6f    }..    set roo
9ab0: 74 20 5b 24 72 6f 6f 74 20 63 68 69 6c 64 5d 0a  t [$root child].
9ac0: 09 7d 0a 0a 20 20 20 20 20 20 20 20 72 65 74 75  .}..        retu
9ad0: 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 6d 65  rn.    }..    me
9ae0: 74 68 6f 64 20 41 63 74 69 76 65 20 7b 7d 20 7b  thod Active {} {
9af0: 0a 09 73 65 74 20 72 65 76 69 73 69 6f 6e 73 20  ..set revisions 
9b00: 7b 7d 0a 09 73 65 74 20 73 79 6d 62 6f 6c 73 20  {}..set symbols 
9b10: 20 20 7b 7d 0a 0a 09 66 6f 72 65 61 63 68 20 72    {}...foreach r
9b20: 6f 6f 74 20 5b 24 73 65 6c 66 20 4c 69 6e 65 73  oot [$self Lines
9b30: 4f 66 44 65 76 65 6c 6f 70 6d 65 6e 74 5d 20 7b  OfDevelopment] {
9b40: 0a 09 20 20 20 20 69 66 20 7b 5b 24 72 6f 6f 74  ..    if {[$root
9b50: 20 68 61 73 70 61 72 65 6e 74 62 72 61 6e 63 68   hasparentbranch
9b60: 5d 7d 20 7b 20 6c 61 70 70 65 6e 64 20 73 79 6d  ]} { lappend sym
9b70: 62 6f 6c 73 20 5b 24 72 6f 6f 74 20 70 61 72 65  bols [$root pare
9b80: 6e 74 62 72 61 6e 63 68 5d 20 7d 0a 09 20 20 20  ntbranch] }..   
9b90: 20 77 68 69 6c 65 20 7b 24 72 6f 6f 74 20 6e 65   while {$root ne
9ba0: 20 22 22 7d 20 7b 0a 09 09 6c 61 70 70 65 6e 64   ""} {...lappend
9bb0: 20 72 65 76 69 73 69 6f 6e 73 20 24 72 6f 6f 74   revisions $root
9bc0: 0a 09 09 66 6f 72 65 61 63 68 20 74 61 67 20 20  ...foreach tag  
9bd0: 20 20 5b 24 72 6f 6f 74 20 74 61 67 73 5d 20 20    [$root tags]  
9be0: 20 20 20 7b 20 6c 61 70 70 65 6e 64 20 73 79 6d     { lappend sym
9bf0: 62 6f 6c 73 20 24 74 61 67 20 20 20 20 7d 0a 09  bols $tag    }..
9c00: 09 66 6f 72 65 61 63 68 20 62 72 61 6e 63 68 20  .foreach branch 
9c10: 5b 24 72 6f 6f 74 20 62 72 61 6e 63 68 65 73 5d  [$root branches]
9c20: 20 7b 0a 09 09 20 20 20 20 69 6e 74 65 67 72 69   {...    integri
9c30: 74 79 20 61 73 73 65 72 74 20 7b 0a 09 09 09 5b  ty assert {....[
9c40: 24 62 72 61 6e 63 68 20 70 61 72 65 6e 74 5d 20  $branch parent] 
9c50: 65 71 20 24 72 6f 6f 74 0a 09 09 20 20 20 20 7d  eq $root...    }
9c60: 20 7b 42 61 63 6b 72 65 66 65 72 65 6e 63 65 20   {Backreference 
9c70: 62 72 61 6e 63 68 20 74 6f 20 69 74 73 20 72 6f  branch to its ro
9c80: 6f 74 20 69 73 20 6d 69 73 73 69 6e 67 20 6f 72  ot is missing or
9c90: 20 77 72 6f 6e 67 7d 0a 09 09 20 20 20 20 6c 61   wrong}...    la
9ca0: 70 70 65 6e 64 20 73 79 6d 62 6f 6c 73 20 24 62  ppend symbols $b
9cb0: 72 61 6e 63 68 0a 09 09 7d 0a 09 09 73 65 74 20  ranch...}...set 
9cc0: 6c 6f 64 20 5b 24 72 6f 6f 74 20 6c 6f 64 5d 0a  lod [$root lod].
9cd0: 09 09 69 66 20 7b 21 5b 24 6c 6f 64 20 69 73 74  ..if {![$lod ist
9ce0: 72 75 6e 6b 5d 7d 20 7b 0a 09 09 20 20 20 20 69  runk]} {...    i
9cf0: 6e 74 65 67 72 69 74 79 20 61 73 73 65 72 74 20  ntegrity assert 
9d00: 7b 0a 09 09 09 5b 24 6c 6f 64 20 68 61 73 63 68  {....[$lod hasch
9d10: 69 6c 64 5d 0a 09 09 20 20 20 20 7d 20 7b 42 72  ild]...    } {Br
9d20: 61 6e 63 68 20 69 73 20 4c 4f 44 20 73 79 6d 62  anch is LOD symb
9d30: 6f 6c 20 77 69 74 68 6f 75 74 20 72 65 76 69 73  ol without revis
9d40: 69 6f 6e 73 7d 0a 09 09 20 20 20 20 6c 61 70 70  ions}...    lapp
9d50: 65 6e 64 20 73 79 6d 62 6f 6c 73 20 24 6c 6f 64  end symbols $lod
9d60: 0a 09 09 7d 0a 09 09 73 65 74 20 72 6f 6f 74 20  ...}...set root 
9d70: 5b 24 72 6f 6f 74 20 63 68 69 6c 64 5d 0a 09 20  [$root child].. 
9d80: 20 20 20 7d 0a 09 7d 0a 0a 09 72 65 74 75 72 6e     }..}...return
9d90: 20 5b 6c 69 73 74 20 5b 6c 73 6f 72 74 20 2d 75   [list [lsort -u
9da0: 6e 69 71 75 65 20 2d 64 69 63 74 20 24 72 65 76  nique -dict $rev
9db0: 69 73 69 6f 6e 73 5d 20 5b 6c 73 6f 72 74 20 2d  isions] [lsort -
9dc0: 75 6e 69 71 75 65 20 2d 64 69 63 74 20 24 73 79  unique -dict $sy
9dd0: 6d 62 6f 6c 73 5d 5d 0a 20 20 20 20 7d 0a 0a 0a  mbols]].    }...
9de0: 20 20 20 20 6d 65 74 68 6f 64 20 41 67 67 72 65      method Aggre
9df0: 67 61 74 65 53 79 6d 62 6f 6c 44 61 74 61 20 7b  gateSymbolData {
9e00: 7d 20 7b 0a 09 23 20 4e 6f 77 20 74 68 61 74 20  } {..# Now that 
9e10: 74 68 65 20 65 78 61 63 74 20 73 65 74 20 6f 66  the exact set of
9e20: 20 72 65 76 69 73 69 6f 6e 73 20 28 61 6e 64 20   revisions (and 
9e30: 74 68 72 6f 75 67 68 20 74 68 61 74 0a 09 23 20  through that..# 
9e40: 62 72 61 6e 63 68 65 73 20 61 6e 64 20 74 61 67  branches and tag
9e50: 73 29 20 69 73 20 6b 6e 6f 77 6e 20 77 65 20 63  s) is known we c
9e60: 61 6e 20 75 70 64 61 74 65 20 74 68 65 20 61 67  an update the ag
9e70: 67 72 65 67 61 74 65 0a 09 23 20 73 79 6d 62 6f  gregate..# symbo
9e80: 6c 20 73 74 61 74 69 73 74 69 63 73 2e 0a 0a 09  l statistics....
9e90: 66 6f 72 65 61 63 68 20 72 6f 6f 74 20 5b 24 73  foreach root [$s
9ea0: 65 6c 66 20 4c 69 6e 65 73 4f 66 44 65 76 65 6c  elf LinesOfDevel
9eb0: 6f 70 6d 65 6e 74 5d 20 7b 0a 09 20 20 20 20 73  opment] {..    s
9ec0: 65 74 20 6c 6f 64 20 5b 24 72 6f 6f 74 20 6c 6f  et lod [$root lo
9ed0: 64 5d 0a 0a 09 20 20 20 20 23 20 4e 6f 74 65 3a  d]...    # Note:
9ee0: 20 49 66 20 74 68 65 20 4c 4f 44 20 69 73 20 74   If the LOD is t
9ef0: 68 65 20 74 72 75 6e 6b 20 74 68 65 20 63 6f 75  he trunk the cou
9f00: 6e 74 2a 2c 20 65 74 63 2e 20 6d 65 74 68 6f 64  nt*, etc. method
9f10: 73 0a 09 20 20 20 20 23 20 77 69 6c 6c 20 64 6f  s..    # will do
9f20: 20 6e 6f 74 68 69 6e 67 2c 20 61 73 20 69 74 20   nothing, as it 
9f30: 69 73 20 61 6c 77 61 79 73 20 70 72 65 73 65 6e  is always presen
9f40: 74 20 28 63 61 6e 6e 6f 74 20 62 65 0a 09 20 20  t (cannot be..  
9f50: 20 20 23 20 65 78 63 6c 75 64 65 64 29 2c 20 61    # excluded), a
9f60: 6e 64 20 69 73 20 61 6c 77 61 79 73 20 61 20 62  nd is always a b
9f70: 72 61 6e 63 68 20 74 6f 6f 2e 0a 0a 09 20 20 20  ranch too....   
9f80: 20 23 20 4c 69 6e 65 73 20 6f 66 20 64 65 76 65   # Lines of deve
9f90: 6c 6f 70 6d 65 6e 74 20 63 6f 75 6e 74 20 61 73  lopment count as
9fa0: 20 62 72 61 6e 63 68 65 73 20 61 6e 64 20 68 61   branches and ha
9fb0: 76 65 20 61 20 63 6f 6d 6d 69 74 0a 09 20 20 20  ve a commit..   
9fc0: 20 23 20 6f 6e 20 74 68 65 6d 20 28 72 6f 6f 74   # on them (root
9fd0: 29 2e 20 49 66 20 74 68 65 79 20 61 72 65 20 73  ). If they are s
9fe0: 74 69 6c 6c 20 61 74 74 61 63 68 65 64 20 74 6f  till attached to
9ff0: 20 61 20 74 72 65 65 20 77 65 0a 09 20 20 20 20   a tree we..    
a000: 23 20 68 61 76 65 20 74 6f 20 63 6f 6d 70 75 74  # have to comput
a010: 65 20 61 6e 64 20 72 65 67 69 73 74 65 72 20 70  e and register p
a020: 6f 73 73 69 62 6c 65 20 70 61 72 65 6e 74 73 2e  ossible parents.
a030: 0a 0a 09 20 20 20 20 24 6c 6f 64 20 63 6f 75 6e  ...    $lod coun
a040: 74 61 73 62 72 61 6e 63 68 0a 09 20 20 20 20 24  tasbranch..    $
a050: 6c 6f 64 20 63 6f 75 6e 74 61 63 6f 6d 6d 69 74  lod countacommit
a060: 0a 0a 09 20 20 20 20 69 66 20 7b 5b 24 72 6f 6f  ...    if {[$roo
a070: 74 20 68 61 73 70 61 72 65 6e 74 62 72 61 6e 63  t hasparentbranc
a080: 68 5d 7d 20 7b 0a 09 09 23 20 4e 6f 74 65 20 6c  h]} {...# Note l
a090: 6f 64 20 3d 3d 20 5b 24 72 6f 6f 74 20 70 61 72  od == [$root par
a0a0: 65 6e 74 62 72 61 6e 63 68 5d 0a 09 09 24 6c 6f  entbranch]...$lo
a0b0: 64 20 70 6f 73 73 69 62 6c 65 70 61 72 65 6e 74  d possibleparent
a0c0: 73 0a 09 20 20 20 20 7d 20 65 6c 73 65 69 66 20  s..    } elseif 
a0d0: 7b 21 5b 24 6c 6f 64 20 69 73 74 72 75 6e 6b 5d  {![$lod istrunk]
a0e0: 20 26 26 20 5b 24 72 6f 6f 74 20 69 73 6f 6e 64   && [$root isond
a0f0: 65 66 61 75 6c 74 62 72 61 6e 63 68 5d 7d 20 7b  efaultbranch]} {
a100: 0a 09 09 23 20 54 68 69 73 20 69 73 20 74 68 65  ...# This is the
a110: 20 72 6f 6f 74 20 72 65 76 69 73 69 6f 6e 20 6f   root revision o
a120: 66 20 61 20 64 65 74 61 63 68 65 64 20 4e 54 44  f a detached NTD
a130: 42 2e 20 57 65 0a 09 09 23 20 68 61 76 65 20 74  B. We...# have t
a140: 6f 20 6d 61 6e 75 61 6c 6c 79 20 73 65 74 20 74  o manually set t
a150: 68 65 20 6f 6e 6c 79 20 70 6f 73 73 69 62 6c 65  he only possible
a160: 20 70 61 72 65 6e 74 20 66 6f 72 0a 09 09 23 20   parent for...# 
a170: 74 68 69 73 20 4c 4f 44 2c 20 74 68 65 20 74 72  this LOD, the tr
a180: 75 6e 6b 20 69 74 73 65 6c 66 2e 0a 0a 09 09 5b  unk itself.....[
a190: 24 6c 6f 64 20 73 79 6d 62 6f 6c 5d 20 70 6f 73  $lod symbol] pos
a1a0: 73 69 62 6c 65 70 61 72 65 6e 74 20 24 6d 79 74  sibleparent $myt
a1b0: 72 75 6e 6b 0a 09 20 20 20 20 7d 0a 0a 09 20 20  runk..    }...  
a1c0: 20 20 23 20 46 6f 72 20 74 68 65 20 72 65 76 69    # For the revi
a1d0: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 6c 69 6e  sions in the lin
a1e0: 65 20 77 65 20 72 65 67 69 73 74 65 72 20 74 68  e we register th
a1f0: 65 69 72 20 62 72 61 6e 63 68 65 73 0a 09 20 20  eir branches..  
a200: 20 20 23 20 61 6e 64 20 74 61 67 73 20 61 73 20    # and tags as 
a210: 62 6c 6f 63 6b 65 72 73 20 66 6f 72 20 74 68 65  blockers for the
a220: 20 6c 6f 64 2c 20 61 6e 64 20 75 70 64 61 74 65   lod, and update
a230: 20 74 68 65 20 74 79 70 65 0a 09 20 20 20 20 23   the type..    #
a240: 20 63 6f 75 6e 74 65 72 73 20 61 73 20 77 65 6c   counters as wel
a250: 6c 2e 20 41 73 20 62 72 61 6e 63 68 20 73 79 6d  l. As branch sym
a260: 62 6f 6c 73 20 77 69 74 68 6f 75 74 20 63 6f 6d  bols without com
a270: 6d 69 74 73 20 6f 6e 0a 09 20 20 20 20 23 20 74  mits on..    # t
a280: 68 65 6d 20 61 72 65 20 6e 6f 74 20 6c 69 73 74  hem are not list
a290: 65 64 20 61 73 20 6c 69 6e 65 73 20 6f 66 20 64  ed as lines of d
a2a0: 65 76 65 6c 6f 70 6d 65 6e 74 2c 20 77 65 20 68  evelopment, we h
a2b0: 61 76 65 20 74 6f 0a 09 20 20 20 20 23 20 63 6f  ave to..    # co
a2c0: 75 6e 74 20 74 68 65 6d 20 68 65 72 65 20 61 73  unt them here as
a2d0: 20 77 65 6c 6c 2c 20 61 73 20 70 6c 61 69 6e 20   well, as plain 
a2e0: 62 72 61 6e 63 68 65 73 2e 20 41 74 20 6c 61 73  branches. At las
a2f0: 74 20 77 65 0a 09 20 20 20 20 23 20 68 61 76 65  t we..    # have
a300: 20 74 6f 20 63 6f 6d 70 75 74 65 20 61 6e 64 20   to compute and 
a310: 72 65 67 69 73 74 65 72 20 74 68 65 20 70 6f 73  register the pos
a320: 73 69 62 6c 65 20 70 61 72 65 6e 74 73 20 6f 66  sible parents of
a330: 20 74 68 65 0a 09 20 20 20 20 23 20 74 61 67 73   the..    # tags
a340: 2c 20 69 6e 20 63 61 73 65 20 74 68 65 79 20 61  , in case they a
a350: 72 65 20 6c 61 74 65 72 20 63 6f 6e 76 65 72 74  re later convert
a360: 65 64 20 61 73 20 62 72 61 6e 63 68 65 73 2e 0a  ed as branches..
a370: 0a 09 20 20 20 20 77 68 69 6c 65 20 7b 24 72 6f  ..    while {$ro
a380: 6f 74 20 6e 65 20 22 22 7d 20 7b 0a 09 09 66 6f  ot ne ""} {...fo
a390: 72 65 61 63 68 20 62 72 61 6e 63 68 20 5b 24 72  reach branch [$r
a3a0: 6f 6f 74 20 62 72 61 6e 63 68 65 73 5d 20 7b 0a  oot branches] {.
a3b0: 09 09 20 20 20 20 24 6c 6f 64 20 62 6c 6f 63 6b  ..    $lod block
a3c0: 65 64 62 79 20 24 62 72 61 6e 63 68 0a 09 09 20  edby $branch... 
a3d0: 20 20 20 24 62 72 61 6e 63 68 20 70 6f 73 73 69     $branch possi
a3e0: 62 6c 65 70 61 72 65 6e 74 73 0a 09 09 20 20 20  bleparents...   
a3f0: 20 69 66 20 7b 5b 24 62 72 61 6e 63 68 20 68 61   if {[$branch ha
a400: 73 63 68 69 6c 64 5d 7d 20 63 6f 6e 74 69 6e 75  schild]} continu
a410: 65 0a 09 09 20 20 20 20 24 62 72 61 6e 63 68 20  e...    $branch 
a420: 63 6f 75 6e 74 61 73 62 72 61 6e 63 68 0a 09 09  countasbranch...
a430: 7d 0a 0a 09 09 66 6f 72 65 61 63 68 20 74 61 67  }....foreach tag
a440: 20 5b 24 72 6f 6f 74 20 74 61 67 73 5d 20 7b 0a   [$root tags] {.
a450: 09 09 20 20 20 20 24 6c 6f 64 20 62 6c 6f 63 6b  ..    $lod block
a460: 65 64 62 79 20 24 74 61 67 0a 09 09 20 20 20 20  edby $tag...    
a470: 24 74 61 67 20 70 6f 73 73 69 62 6c 65 70 61 72  $tag possiblepar
a480: 65 6e 74 73 0a 09 09 20 20 20 20 24 74 61 67 20  ents...    $tag 
a490: 63 6f 75 6e 74 61 73 74 61 67 0a 09 09 7d 0a 0a  countastag...}..
a4a0: 09 09 73 65 74 20 72 6f 6f 74 20 5b 24 72 6f 6f  ..set root [$roo
a4b0: 74 20 63 68 69 6c 64 5d 0a 09 20 20 20 20 7d 0a  t child]..    }.
a4c0: 09 7d 0a 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  .}...return.    
a4d0: 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23  }..    # # ## ##
a4e0: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
a4f0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20   #############. 
a500: 20 20 20 23 23 20 43 6f 6e 66 69 67 75 72 61 74     ## Configurat
a510: 69 6f 6e 0a 0a 20 20 20 20 70 72 61 67 6d 61 20  ion..    pragma 
a520: 2d 68 61 73 74 79 70 65 69 6e 66 6f 20 20 20 20  -hastypeinfo    
a530: 6e 6f 20 20 3b 20 23 20 6e 6f 20 74 79 70 65 20  no  ; # no type 
a540: 69 6e 74 72 6f 73 70 65 63 74 69 6f 6e 0a 20 20  introspection.  
a550: 20 20 70 72 61 67 6d 61 20 2d 68 61 73 69 6e 66    pragma -hasinf
a560: 6f 20 20 20 20 20 20 20 20 6e 6f 20 20 3b 20 23  o        no  ; #
a570: 20 6e 6f 20 6f 62 6a 65 63 74 20 69 6e 74 72 6f   no object intro
a580: 73 70 65 63 74 69 6f 6e 0a 20 20 20 20 70 72 61  spection.    pra
a590: 67 6d 61 20 2d 68 61 73 74 79 70 65 6d 65 74 68  gma -hastypemeth
a5a0: 6f 64 73 20 6e 6f 20 20 3b 20 23 20 74 79 70 65  ods no  ; # type
a5b0: 20 69 73 20 6e 6f 74 20 72 65 6c 65 76 61 6e 74   is not relevant
a5c0: 2e 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23  ...    # # ## ##
a5d0: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
a5e0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 7d   #############.}
a5f0: 0a 0a 6e 61 6d 65 73 70 61 63 65 20 65 76 61 6c  ..namespace eval
a600: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
a610: 6d 70 6f 72 74 3a 3a 63 76 73 20 7b 0a 20 20 20  mport::cvs {.   
a620: 20 6e 61 6d 65 73 70 61 63 65 20 65 78 70 6f 72   namespace expor
a630: 74 20 66 69 6c 65 0a 20 20 20 20 6e 61 6d 65 73  t file.    names
a640: 70 61 63 65 20 65 76 61 6c 20 66 69 6c 65 20 7b  pace eval file {
a650: 0a 09 23 20 49 6d 70 6f 72 74 20 6e 6f 74 20 72  ..# Import not r
a660: 65 71 75 69 72 65 64 2c 20 61 6c 72 65 61 64 79  equired, already
a670: 20 61 20 63 68 69 6c 64 20 6e 61 6d 65 73 70 61   a child namespa
a680: 63 65 2e 0a 09 23 20 6e 61 6d 65 73 70 61 63 65  ce...# namespace
a690: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66 6f   import ::vc::fo
a6a0: 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76  ssil::import::cv
a6b0: 73 3a 3a 66 69 6c 65 3a 3a 72 65 76 0a 09 23 20  s::file::rev..# 
a6c0: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74  namespace import
a6d0: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
a6e0: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 66 69 6c 65  mport::cvs::file
a6f0: 3a 3a 73 79 6d 0a 09 6e 61 6d 65 73 70 61 63 65  ::sym..namespace
a700: 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f   import ::vc::to
a710: 6f 6c 73 3a 3a 6d 69 73 63 3a 3a 2a 0a 09 6e 61  ols::misc::*..na
a720: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
a730: 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 74 72 6f 75  :vc::tools::trou
a740: 62 6c 65 0a 09 6e 61 6d 65 73 70 61 63 65 20 69  ble..namespace i
a750: 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c  mport ::vc::tool
a760: 73 3a 3a 6c 6f 67 0a 09 6e 61 6d 65 73 70 61 63  s::log..namespac
a770: 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 66  e import ::vc::f
a780: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63  ossil::import::c
a790: 76 73 3a 3a 73 74 61 74 65 0a 09 6e 61 6d 65 73  vs::state..names
a7a0: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63  pace import ::vc
a7b0: 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74  ::fossil::import
a7c0: 3a 3a 63 76 73 3a 3a 69 6e 74 65 67 72 69 74 79  ::cvs::integrity
a7d0: 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f  ..namespace impo
a7e0: 72 74 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a  rt ::vc::fossil:
a7f0: 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 67 74  :import::cvs::gt
a800: 63 6f 72 65 0a 20 20 20 20 7d 0a 7d 0a 0a 23 20  core.    }.}..# 
a810: 23 20 23 23 20 23 23 23 20 23 23 23 23 23 20 23  # ## ### ##### #
a820: 23 23 23 23 23 23 23 20 23 23 23 23 23 23 23 23  ####### ########
a830: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
a840: 23 23 23 23 23 23 23 23 23 23 23 0a 23 23 20 52  ###########.## R
a850: 65 61 64 79 0a 0a 70 61 63 6b 61 67 65 20 70 72  eady..package pr
a860: 6f 76 69 64 65 20 76 63 3a 3a 66 6f 73 73 69 6c  ovide vc::fossil
a870: 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 66  ::import::cvs::f
a880: 69 6c 65 20 31 2e 30 0a 72 65 74 75 72 6e 0a     ile 1.0.return.