Hex Artifact Content
Not logged in

Artifact 3ba48f18aabbfef4f6c48b6c70f01a18bd9dc950:

File tools/cvs2fossil/lib/c2f_repository.tcl part of check-in [cfe4b269ac] - Added detection of irrelevant trunk revisions for files added to a branch but not the trunk. Repository extended to keep inverted indices for the meta data and commit messages for retrieval of commit messages per meta data, required for the previous. fixed problem with file objects, we kept only the rcs path, and need the user visible path too. by aku on 2007-10-17 04:37:05.

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 52 65 70  ########..## Rep
0200: 6f 73 69 74 6f 72 79 20 6d 61 6e 61 67 65 72 2e  ository manager.
0210: 20 4b 65 65 70 73 20 70 72 6f 6a 65 63 74 73 20   Keeps projects 
0220: 61 6e 64 20 74 68 65 69 72 20 66 69 6c 65 73 20  and their files 
0230: 61 72 6f 75 6e 64 2e 0a 0a 70 61 63 6b 61 67 65  around...package
0240: 20 70 72 6f 76 69 64 65 20 76 63 3a 3a 66 6f 73   provide vc::fos
0250: 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73  sil::import::cvs
0260: 3a 3a 72 65 70 6f 73 69 74 6f 72 79 20 31 2e 30  ::repository 1.0
0270: 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23 23 23  ..# # ## ### ###
0280: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23  ## ######## ####
0290: 23 23 23 23 23 23 23 23 23 20 23 23 23 23 23 23  ######### ######
02a0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 0a  ###############.
02b0: 23 23 20 52 65 71 75 69 72 65 6d 65 6e 74 73 0a  ## Requirements.
02c0: 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72 65  .package require
02d0: 20 54 63 6c 20 38 2e 34 20 20 20 20 20 20 20 20   Tcl 8.4        
02e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
02f0: 20 20 3b 20 23 20 52 65 71 75 69 72 65 64 20 72    ; # Required r
0300: 75 6e 74 69 6d 65 2e 0a 70 61 63 6b 61 67 65 20  untime..package 
0310: 72 65 71 75 69 72 65 20 73 6e 69 74 20 20 20 20  require snit    
0320: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0330: 20 20 20 20 20 20 20 20 20 3b 20 23 20 4f 4f 20           ; # OO 
0340: 73 79 73 74 65 6d 2e 0a 70 61 63 6b 61 67 65 20  system..package 
0350: 72 65 71 75 69 72 65 20 76 63 3a 3a 74 6f 6f 6c  require vc::tool
0360: 73 3a 3a 74 72 6f 75 62 6c 65 20 20 20 20 20 20  s::trouble      
0370: 20 20 20 20 20 20 20 20 20 3b 20 23 20 45 72 72           ; # Err
0380: 6f 72 20 72 65 70 6f 72 74 69 6e 67 2e 0a 70 61  or reporting..pa
0390: 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 76 63  ckage require vc
03a0: 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67 20 20 20 20  ::tools::log    
03b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3b                 ;
03c0: 20 23 20 55 73 65 72 20 66 65 65 64 62 61 63 6b   # User feedback
03d0: 2e 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69 72  ..package requir
03e0: 65 20 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d 69 73  e vc::tools::mis
03f0: 63 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  c               
0400: 20 20 20 3b 20 23 20 54 65 78 74 20 66 6f 72 6d     ; # Text form
0410: 61 74 74 69 6e 67 2e 0a 70 61 63 6b 61 67 65 20  atting..package 
0420: 72 65 71 75 69 72 65 20 76 63 3a 3a 66 6f 73 73  require vc::foss
0430: 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63 76 73 3a  il::import::cvs:
0440: 3a 70 72 6f 6a 65 63 74 20 3b 20 23 20 43 56 53  :project ; # CVS
0450: 20 70 72 6f 6a 65 63 74 73 2e 0a 70 61 63 6b 61   projects..packa
0460: 67 65 20 72 65 71 75 69 72 65 20 76 63 3a 3a 66  ge require vc::f
0470: 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a 63  ossil::import::c
0480: 76 73 3a 3a 73 74 61 74 65 20 20 20 3b 20 23 20  vs::state   ; # 
0490: 53 74 61 74 65 20 73 74 6f 72 61 67 65 2e 0a 70  State storage..p
04a0: 61 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 73  ackage require s
04b0: 74 72 75 63 74 3a 3a 6c 69 73 74 20 20 20 20 20  truct::list     
04c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
04d0: 3b 20 23 20 4c 69 73 74 20 6f 70 65 72 61 74 69  ; # List operati
04e0: 6f 6e 73 2e 0a 70 61 63 6b 61 67 65 20 72 65 71  ons..package req
04f0: 75 69 72 65 20 66 69 6c 65 75 74 69 6c 20 20 20  uire fileutil   
0500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0510: 20 20 20 20 20 20 3b 20 23 20 46 69 6c 65 20 6f        ; # File o
0520: 70 65 72 61 74 69 6f 6e 73 2e 0a 0a 23 20 23 20  perations...# # 
0530: 23 23 20 23 23 23 20 23 23 23 23 23 20 23 23 23  ## ### ##### ###
0540: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 23 23  ##### ##########
0550: 23 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23  ### ############
0560: 23 23 23 23 23 23 23 23 23 0a 23 23 20 0a 0a 73  #########.## ..s
0570: 6e 69 74 3a 3a 74 79 70 65 20 3a 3a 76 63 3a 3a  nit::type ::vc::
0580: 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a  fossil::import::
0590: 63 76 73 3a 3a 72 65 70 6f 73 69 74 6f 72 79 20  cvs::repository 
05a0: 7b 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23  {.    # # ## ###
05b0: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20   ##### ######## 
05c0: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 20  #############.  
05d0: 20 20 23 23 20 50 75 62 6c 69 63 20 41 50 49 0a    ## Public API.
05e0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
05f0: 62 61 73 65 20 7b 70 61 74 68 7d 20 7b 0a 09 23  base {path} {..#
0600: 20 43 6f 75 6c 64 20 62 65 20 63 68 65 63 6b 65   Could be checke
0610: 64 2c 20 65 61 73 69 65 72 20 74 6f 20 64 65 66  d, easier to def
0620: 65 72 20 74 6f 20 74 68 65 20 6f 76 65 72 61 6c  er to the overal
0630: 6c 20 76 61 6c 69 64 61 74 69 6f 6e 2e 0a 09 73  l validation...s
0640: 65 74 20 6d 79 62 61 73 65 20 24 70 61 74 68 0a  et mybase $path.
0650: 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20  .return.    }.. 
0660: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 61 64     typemethod ad
0670: 64 20 7b 70 61 74 68 7d 20 7b 0a 09 23 20 4d 6f  d {path} {..# Mo
0680: 73 74 20 74 68 69 6e 67 73 20 63 61 6e 6e 6f 74  st things cannot
0690: 20 62 65 20 63 68 65 63 6b 65 64 20 69 6d 6d 65   be checked imme
06a0: 64 69 61 74 65 6c 79 2c 20 61 73 20 74 68 65 20  diately, as the 
06b0: 62 61 73 65 20 69 73 0a 09 23 20 6e 6f 74 20 6b  base is..# not k
06c0: 6e 6f 77 6e 20 77 68 69 6c 65 20 70 72 6f 6a 65  nown while proje
06d0: 63 74 73 20 61 72 65 20 61 64 64 65 64 2e 20 57  cts are added. W
06e0: 65 20 63 61 6e 20 61 6e 64 20 64 6f 20 63 68 65  e can and do che
06f0: 63 6b 20 66 6f 72 0a 09 23 20 75 6e 69 71 75 65  ck for..# unique
0700: 6e 65 73 73 2e 20 57 65 20 61 63 63 65 70 74 20  ness. We accept 
0710: 6d 75 6c 74 69 70 6c 65 20 6f 63 63 75 72 65 6e  multiple occuren
0720: 63 65 73 20 6f 66 20 61 20 6e 61 6d 65 2c 20 61  ces of a name, a
0730: 6e 64 0a 09 23 20 74 72 65 61 74 20 74 68 65 6d  nd..# treat them
0740: 20 61 73 20 61 20 73 69 6e 67 6c 65 20 70 72 6f   as a single pro
0750: 6a 65 63 74 2e 0a 0a 09 69 66 20 7b 5b 6c 73 65  ject....if {[lse
0760: 61 72 63 68 20 2d 65 78 61 63 74 20 24 6d 79 70  arch -exact $myp
0770: 72 6f 6a 70 61 74 68 73 20 24 70 61 74 68 5d 20  rojpaths $path] 
0780: 3e 3d 20 30 7d 20 72 65 74 75 72 6e 0a 09 6c 61  >= 0} return..la
0790: 70 70 65 6e 64 20 6d 79 70 72 6f 6a 70 61 74 68  ppend myprojpath
07a0: 73 20 24 70 61 74 68 0a 09 72 65 74 75 72 6e 0a  s $path..return.
07b0: 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d      }..    typem
07c0: 65 74 68 6f 64 20 74 72 75 6e 6b 6f 6e 6c 79 21  ethod trunkonly!
07d0: 20 7b 7d 20 7b 20 73 65 74 20 6d 79 74 72 75 6e   {} { set mytrun
07e0: 6b 6f 6e 6c 79 20 31 20 3b 20 72 65 74 75 72 6e  konly 1 ; return
07f0: 20 7d 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f   }.    typemetho
0800: 64 20 74 72 75 6e 6b 6f 6e 6c 79 20 20 7b 7d 20  d trunkonly  {} 
0810: 7b 20 72 65 74 75 72 6e 20 24 6d 79 74 72 75 6e  { return $mytrun
0820: 6b 6f 6e 6c 79 20 7d 0a 0a 20 20 20 20 74 79 70  konly }..    typ
0830: 65 6d 65 74 68 6f 64 20 70 72 6f 6a 65 63 74 73  emethod projects
0840: 20 7b 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b 54   {} {..return [T
0850: 68 65 50 72 6f 6a 65 63 74 73 5d 0a 20 20 20 20  heProjects].    
0860: 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  }..    typemetho
0870: 64 20 62 61 73 65 3f 20 7b 7d 20 7b 20 72 65 74  d base? {} { ret
0880: 75 72 6e 20 24 6d 79 62 61 73 65 20 7d 0a 0a 20  urn $mybase }.. 
0890: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 76 61     typemethod va
08a0: 6c 69 64 61 74 65 20 7b 7d 20 7b 0a 09 69 66 20  lidate {} {..if 
08b0: 7b 21 5b 49 73 52 65 70 6f 73 69 74 6f 72 79 42  {![IsRepositoryB
08c0: 61 73 65 20 24 6d 79 62 61 73 65 20 6d 73 67 5d  ase $mybase msg]
08d0: 7d 20 7b 0a 09 20 20 20 20 74 72 6f 75 62 6c 65  } {..    trouble
08e0: 20 66 61 74 61 6c 20 24 6d 73 67 0a 09 20 20 20   fatal $msg..   
08f0: 20 23 20 57 69 74 68 6f 75 74 20 61 20 67 6f 6f   # Without a goo
0900: 64 20 62 61 73 65 20 64 69 72 65 63 74 6f 72 79  d base directory
0910: 20 63 68 65 63 6b 69 6e 67 20 61 6e 79 20 70 72   checking any pr
0920: 6f 6a 65 63 74 73 20 69 73 0a 09 20 20 20 20 23  ojects is..    #
0930: 20 77 61 73 74 65 64 20 74 69 6d 65 2c 20 73 6f   wasted time, so
0940: 20 77 65 20 6c 65 61 76 65 20 6e 6f 77 2e 0a 09   we leave now...
0950: 20 20 20 20 72 65 74 75 72 6e 0a 09 7d 0a 09 66      return..}..f
0960: 6f 72 65 61 63 68 20 70 70 20 24 6d 79 70 72 6f  oreach pp $mypro
0970: 6a 70 61 74 68 73 20 7b 0a 09 20 20 20 20 69 66  jpaths {..    if
0980: 20 7b 21 5b 49 73 50 72 6f 6a 65 63 74 42 61 73   {![IsProjectBas
0990: 65 20 24 6d 79 62 61 73 65 2f 24 70 70 20 24 6d  e $mybase/$pp $m
09a0: 79 62 61 73 65 2f 43 56 53 52 4f 4f 54 20 6d 73  ybase/CVSROOT ms
09b0: 67 5d 7d 20 7b 0a 09 09 74 72 6f 75 62 6c 65 20  g]} {...trouble 
09c0: 66 61 74 61 6c 20 24 6d 73 67 0a 09 20 20 20 20  fatal $msg..    
09d0: 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20  }..}..return.   
09e0: 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68   }..    typemeth
09f0: 6f 64 20 64 65 66 61 75 74 68 6f 72 20 7b 61 7d  od defauthor {a}
0a00: 20 7b 0a 09 69 66 20 7b 21 5b 69 6e 66 6f 20 65   {..if {![info e
0a10: 78 69 73 74 73 20 6d 79 61 75 74 68 6f 72 28 24  xists myauthor($
0a20: 61 29 5d 7d 20 7b 0a 09 20 20 20 20 73 65 74 20  a)]} {..    set 
0a30: 6d 79 61 75 74 68 6f 72 28 24 61 29 20 5b 69 6e  myauthor($a) [in
0a40: 63 72 20 6d 79 61 75 74 68 6f 72 63 6e 74 5d 0a  cr myauthorcnt].
0a50: 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20 36  .    log write 6
0a60: 20 72 65 70 6f 73 69 74 6f 72 79 20 22 61 75 74   repository "aut
0a70: 68 6f 72 20 27 24 61 27 20 3d 20 20 24 6d 79 61  hor '$a' =  $mya
0a80: 75 74 68 6f 72 28 24 61 29 22 0a 09 7d 0a 09 72  uthor($a)"..}..r
0a90: 65 74 75 72 6e 20 24 6d 79 61 75 74 68 6f 72 28  eturn $myauthor(
0aa0: 24 61 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74  $a).    }..    t
0ab0: 79 70 65 6d 65 74 68 6f 64 20 64 65 66 63 6d 65  ypemethod defcme
0ac0: 73 73 61 67 65 20 7b 63 6d 7d 20 7b 0a 09 69 66  ssage {cm} {..if
0ad0: 20 7b 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20   {![info exists 
0ae0: 6d 79 63 6d 73 67 28 24 63 6d 29 5d 7d 20 7b 0a  mycmsg($cm)]} {.
0af0: 09 20 20 20 20 73 65 74 20 6d 79 63 6d 73 67 28  .    set mycmsg(
0b00: 24 63 6d 29 20 5b 73 65 74 20 63 69 64 20 5b 69  $cm) [set cid [i
0b10: 6e 63 72 20 6d 79 63 6d 73 67 63 6e 74 5d 5d 0a  ncr mycmsgcnt]].
0b20: 09 20 20 20 20 73 65 74 20 6d 79 63 6d 73 67 69  .    set mycmsgi
0b30: 6e 76 28 24 63 69 64 29 20 24 63 6d 0a 09 20 20  nv($cid) $cm..  
0b40: 20 20 6c 6f 67 20 77 72 69 74 65 20 36 20 72 65    log write 6 re
0b50: 70 6f 73 69 74 6f 72 79 20 22 63 6d 65 73 73 61  pository "cmessa
0b60: 67 65 20 27 24 63 6d 27 20 3d 20 20 24 63 69 64  ge '$cm' =  $cid
0b70: 22 0a 09 7d 0a 09 72 65 74 75 72 6e 20 24 6d 79  "..}..return $my
0b80: 63 6d 73 67 28 24 63 6d 29 0a 20 20 20 20 7d 0a  cmsg($cm).    }.
0b90: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
0ba0: 64 65 66 73 79 6d 62 6f 6c 20 7b 70 69 64 20 6e  defsymbol {pid n
0bb0: 61 6d 65 7d 20 7b 0a 09 73 65 74 20 6b 65 79 20  ame} {..set key 
0bc0: 5b 6c 69 73 74 20 24 70 69 64 20 24 6e 61 6d 65  [list $pid $name
0bd0: 5d 0a 09 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78  ]..if {![info ex
0be0: 69 73 74 73 20 6d 79 73 79 6d 62 6f 6c 28 24 6b  ists mysymbol($k
0bf0: 65 79 29 5d 7d 20 7b 0a 09 20 20 20 20 73 65 74  ey)]} {..    set
0c00: 20 6d 79 73 79 6d 62 6f 6c 28 24 6b 65 79 29 20   mysymbol($key) 
0c10: 5b 69 6e 63 72 20 6d 79 73 79 6d 62 6f 6c 63 6e  [incr mysymbolcn
0c20: 74 5d 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74  t]..    log writ
0c30: 65 20 36 20 72 65 70 6f 73 69 74 6f 72 79 20 22  e 6 repository "
0c40: 73 79 6d 62 6f 6c 20 28 24 6b 65 79 29 20 3d 20  symbol ($key) = 
0c50: 20 24 6d 79 73 79 6d 62 6f 6c 28 24 6b 65 79 29   $mysymbol($key)
0c60: 22 0a 09 7d 0a 09 72 65 74 75 72 6e 20 24 6d 79  "..}..return $my
0c70: 73 79 6d 62 6f 6c 28 24 6b 65 79 29 0a 20 20 20  symbol($key).   
0c80: 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68   }..    typemeth
0c90: 6f 64 20 64 65 66 6d 65 74 61 20 7b 70 69 64 20  od defmeta {pid 
0ca0: 62 69 64 20 61 69 64 20 63 69 64 7d 20 7b 0a 09  bid aid cid} {..
0cb0: 73 65 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 70  set key [list $p
0cc0: 69 64 20 24 62 69 64 20 24 61 69 64 20 24 63 69  id $bid $aid $ci
0cd0: 64 5d 0a 09 69 66 20 7b 21 5b 69 6e 66 6f 20 65  d]..if {![info e
0ce0: 78 69 73 74 73 20 6d 79 6d 65 74 61 28 24 6b 65  xists mymeta($ke
0cf0: 79 29 5d 7d 20 7b 0a 09 20 20 20 20 73 65 74 20  y)]} {..    set 
0d00: 6d 79 6d 65 74 61 28 24 6b 65 79 29 20 5b 73 65  mymeta($key) [se
0d10: 74 20 6d 69 64 20 5b 69 6e 63 72 20 6d 79 6d 65  t mid [incr myme
0d20: 74 61 63 6e 74 5d 5d 0a 09 20 20 20 20 73 65 74  tacnt]]..    set
0d30: 20 6d 79 6d 65 74 61 69 6e 76 28 24 6d 69 64 29   mymetainv($mid)
0d40: 20 24 6b 65 79 0a 09 20 20 20 20 6c 6f 67 20 77   $key..    log w
0d50: 72 69 74 65 20 36 20 72 65 70 6f 73 69 74 6f 72  rite 6 repositor
0d60: 79 20 22 6d 65 74 61 20 28 24 6b 65 79 29 20 3d  y "meta ($key) =
0d70: 20 20 24 6d 79 6d 65 74 61 28 24 6b 65 79 29 22    $mymeta($key)"
0d80: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 24 6d 79 6d  ..}..return $mym
0d90: 65 74 61 28 24 6b 65 79 29 0a 20 20 20 20 7d 0a  eta($key).    }.
0da0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
0db0: 63 6f 6d 6d 69 74 6d 65 73 73 61 67 65 6f 66 20  commitmessageof 
0dc0: 7b 6d 65 74 61 69 64 7d 20 7b 0a 09 73 74 72 75  {metaid} {..stru
0dd0: 63 74 3a 3a 6c 69 73 74 20 61 73 73 69 67 6e 20  ct::list assign 
0de0: 24 6d 79 6d 65 74 61 69 6e 76 28 24 6d 65 74 61  $mymetainv($meta
0df0: 69 64 29 20 70 69 64 20 62 69 64 20 61 69 64 20  id) pid bid aid 
0e00: 63 69 64 0a 09 72 65 74 75 72 6e 20 24 6d 79 63  cid..return $myc
0e10: 6d 73 67 69 6e 76 28 24 63 69 64 29 0a 20 20 20  msginv($cid).   
0e20: 20 7d 0a 0a 20 20 20 20 23 20 70 61 73 73 20 49   }..    # pass I
0e30: 20 72 65 73 75 6c 74 73 0a 20 20 20 20 74 79 70   results.    typ
0e40: 65 6d 65 74 68 6f 64 20 70 72 69 6e 74 73 74 61  emethod printsta
0e50: 74 69 73 74 69 63 73 20 7b 7d 20 7b 0a 09 73 65  tistics {} {..se
0e60: 74 20 70 72 6c 69 73 74 20 5b 54 68 65 50 72 6f  t prlist [ThePro
0e70: 6a 65 63 74 73 5d 0a 09 73 65 74 20 6e 70 72 20  jects]..set npr 
0e80: 5b 6c 6c 65 6e 67 74 68 20 24 70 72 6c 69 73 74  [llength $prlist
0e90: 5d 0a 0a 09 6c 6f 67 20 77 72 69 74 65 20 32 20  ]...log write 2 
0ea0: 72 65 70 6f 73 69 74 6f 72 79 20 22 53 63 61 6e  repository "Scan
0eb0: 6e 65 64 20 5b 6e 73 70 20 24 6e 70 72 20 70 72  ned [nsp $npr pr
0ec0: 6f 6a 65 63 74 5d 22 0a 0a 09 69 66 20 7b 24 6e  oject]"...if {$n
0ed0: 70 72 20 3e 20 31 7d 20 7b 0a 09 20 20 20 20 73  pr > 1} {..    s
0ee0: 65 74 20 20 62 6d 61 78 20 5b 6d 61 78 20 5b 73  et  bmax [max [s
0ef0: 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61 70 20  truct::list map 
0f00: 24 70 72 6c 69 73 74 20 5b 6d 79 70 72 6f 63 20  $prlist [myproc 
0f10: 2e 42 61 73 65 4c 65 6e 67 74 68 5d 5d 5d 0a 09  .BaseLength]]]..
0f20: 20 20 20 20 69 6e 63 72 20 62 6d 61 78 20 32 0a      incr bmax 2.
0f30: 09 20 20 20 20 73 65 74 20 20 62 66 6d 74 20 25  .    set  bfmt %
0f40: 2d 24 7b 62 6d 61 78 7d 73 0a 0a 09 20 20 20 20  -${bmax}s...    
0f50: 73 65 74 20 20 6e 6d 61 78 20 5b 6d 61 78 20 5b  set  nmax [max [
0f60: 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 6d 61 70  struct::list map
0f70: 20 24 70 72 6c 69 73 74 20 5b 6d 79 70 72 6f 63   $prlist [myproc
0f80: 20 2e 4e 46 69 6c 65 4c 65 6e 67 74 68 5d 5d 5d   .NFileLength]]]
0f90: 0a 09 20 20 20 20 73 65 74 20 20 6e 66 6d 74 20  ..    set  nfmt 
0fa0: 25 24 7b 6e 6d 61 78 7d 73 0a 09 7d 20 65 6c 73  %${nmax}s..} els
0fb0: 65 20 7b 0a 09 20 20 20 20 73 65 74 20 62 66 6d  e {..    set bfm
0fc0: 74 20 25 73 0a 09 20 20 20 20 73 65 74 20 6e 66  t %s..    set nf
0fd0: 6d 74 20 25 73 0a 09 7d 0a 0a 09 73 65 74 20 6b  mt %s..}...set k
0fe0: 65 65 70 20 7b 7d 0a 09 66 6f 72 65 61 63 68 20  eep {}..foreach 
0ff0: 70 20 24 70 72 6c 69 73 74 20 7b 0a 09 20 20 20  p $prlist {..   
1000: 20 73 65 74 20 6e 66 69 6c 65 73 20 5b 6c 6c 65   set nfiles [lle
1010: 6e 67 74 68 20 5b 24 70 20 66 69 6c 65 6e 61 6d  ngth [$p filenam
1020: 65 73 5d 5d 0a 09 20 20 20 20 73 65 74 20 6c 69  es]]..    set li
1030: 6e 65 20 22 50 72 6f 6a 65 63 74 20 5b 66 6f 72  ne "Project [for
1040: 6d 61 74 20 24 62 66 6d 74 20 5c 22 5b 24 70 20  mat $bfmt \"[$p 
1050: 70 72 69 6e 74 62 61 73 65 5d 5c 22 5d 20 3a 20  printbase]\"] : 
1060: 5b 66 6f 72 6d 61 74 20 24 6e 66 6d 74 20 24 6e  [format $nfmt $n
1070: 66 69 6c 65 73 5d 20 5b 73 70 20 24 6e 66 69 6c  files] [sp $nfil
1080: 65 73 20 66 69 6c 65 5d 22 0a 09 20 20 20 20 69  es file]"..    i
1090: 66 20 7b 24 6e 66 69 6c 65 73 20 3c 20 31 7d 20  f {$nfiles < 1} 
10a0: 7b 0a 09 09 61 70 70 65 6e 64 20 6c 69 6e 65 20  {...append line 
10b0: 22 2c 20 64 72 6f 70 70 65 64 22 0a 09 20 20 20  ", dropped"..   
10c0: 20 7d 20 65 6c 73 65 20 7b 0a 09 09 6c 61 70 70   } else {...lapp
10d0: 65 6e 64 20 6b 65 65 70 20 24 70 0a 09 20 20 20  end keep $p..   
10e0: 20 7d 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74   }..    log writ
10f0: 65 20 32 20 72 65 70 6f 73 69 74 6f 72 79 20 24  e 2 repository $
1100: 6c 69 6e 65 0a 09 7d 0a 0a 09 69 66 20 7b 21 5b  line..}...if {![
1110: 6c 6c 65 6e 67 74 68 20 24 6b 65 65 70 5d 7d 20  llength $keep]} 
1120: 7b 0a 09 20 20 20 20 74 72 6f 75 62 6c 65 20 77  {..    trouble w
1130: 61 72 6e 20 22 44 72 6f 70 70 65 64 20 61 6c 6c  arn "Dropped all
1140: 20 70 72 6f 6a 65 63 74 73 22 0a 09 7d 20 65 6c   projects"..} el
1150: 73 65 69 66 20 7b 24 6e 70 72 20 3d 3d 20 5b 6c  seif {$npr == [l
1160: 6c 65 6e 67 74 68 20 24 6b 65 65 70 5d 7d 20 7b  length $keep]} {
1170: 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65 20  ..    log write 
1180: 32 20 72 65 70 6f 73 69 74 6f 72 79 20 22 4b 65  2 repository "Ke
1190: 65 70 69 6e 67 20 61 6c 6c 20 70 72 6f 6a 65 63  eping all projec
11a0: 74 73 22 0a 09 7d 20 65 6c 73 65 20 7b 0a 09 20  ts"..} else {.. 
11b0: 20 20 20 6c 6f 67 20 77 72 69 74 65 20 32 20 72     log write 2 r
11c0: 65 70 6f 73 69 74 6f 72 79 20 22 4b 65 65 70 69  epository "Keepi
11d0: 6e 67 20 5b 6e 73 70 20 5b 6c 6c 65 6e 67 74 68  ng [nsp [llength
11e0: 20 24 6b 65 65 70 5d 20 70 72 6f 6a 65 63 74 5d   $keep] project]
11f0: 22 0a 09 20 20 20 20 74 72 6f 75 62 6c 65 20 77  "..    trouble w
1200: 61 72 6e 20 22 44 72 6f 70 70 65 64 20 5b 6e 73  arn "Dropped [ns
1210: 70 20 5b 65 78 70 72 20 7b 24 6e 70 72 20 2d 20  p [expr {$npr - 
1220: 5b 6c 6c 65 6e 67 74 68 20 24 6b 65 65 70 5d 7d  [llength $keep]}
1230: 5d 20 7b 65 6d 70 74 79 20 70 72 6f 6a 65 63 74  ] {empty project
1240: 7d 5d 22 0a 09 7d 0a 0a 09 23 20 4b 65 65 70 20  }]"..}...# Keep 
1250: 72 65 64 75 63 65 64 20 73 65 74 20 6f 66 20 70  reduced set of p
1260: 72 6f 6a 65 63 74 73 2e 0a 09 73 65 74 20 70 72  rojects...set pr
1270: 6f 6a 65 63 74 73 20 24 6b 65 65 70 0a 09 72 65  ojects $keep..re
1280: 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20  turn.    }..    
1290: 23 20 70 61 73 73 20 49 20 70 65 72 73 69 73 74  # pass I persist
12a0: 65 6e 63 65 0a 20 20 20 20 74 79 70 65 6d 65 74  ence.    typemet
12b0: 68 6f 64 20 70 65 72 73 69 73 74 20 7b 7d 20 7b  hod persist {} {
12c0: 0a 09 73 74 61 74 65 20 74 72 61 6e 73 61 63 74  ..state transact
12d0: 69 6f 6e 20 7b 0a 09 20 20 20 20 66 6f 72 65 61  ion {..    forea
12e0: 63 68 20 70 20 5b 54 68 65 50 72 6f 6a 65 63 74  ch p [TheProject
12f0: 73 5d 20 7b 20 24 70 20 70 65 72 73 69 73 74 20  s] { $p persist 
1300: 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20  }..}..return.   
1310: 20 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68   }..    typemeth
1320: 6f 64 20 6c 6f 61 64 20 7b 7d 20 7b 0a 09 61 72  od load {} {..ar
1330: 72 61 79 20 73 65 74 20 70 72 20 7b 7d 0a 09 73  ray set pr {}..s
1340: 74 61 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tate transaction
1350: 20 7b 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20   {..    foreach 
1360: 20 20 7b 70 69 64 20 20 6e 61 6d 65 7d 20 5b 73    {pid  name} [s
1370: 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 53 45 4c  tate run {...SEL
1380: 45 43 54 20 70 69 64 2c 20 6e 61 6d 65 20 46 52  ECT pid, name FR
1390: 4f 4d 20 70 72 6f 6a 65 63 74 20 3b 0a 09 20 20  OM project ;..  
13a0: 20 20 7d 5d 20 7b 0a 09 09 6c 61 70 70 65 6e 64    }] {...lappend
13b0: 20 6d 79 70 72 6f 6a 70 61 74 68 73 20 24 6e 61   myprojpaths $na
13c0: 6d 65 0a 09 09 6c 61 70 70 65 6e 64 20 6d 79 70  me...lappend myp
13d0: 72 6f 6a 65 63 74 73 20 5b 73 65 74 20 70 72 28  rojects [set pr(
13e0: 24 70 69 64 29 20 5b 70 72 6f 6a 65 63 74 20 25  $pid) [project %
13f0: 41 55 54 4f 25 20 24 6e 61 6d 65 20 24 74 79 70  AUTO% $name $typ
1400: 65 5d 5d 0a 09 09 24 70 72 28 24 70 69 64 29 20  e]]...$pr($pid) 
1410: 73 65 74 69 64 20 24 70 69 64 0a 09 20 20 20 20  setid $pid..    
1420: 7d 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 20  }..    foreach  
1430: 20 7b 66 69 64 20 20 70 69 64 20 20 6e 61 6d 65   {fid  pid  name
1440: 20 20 76 69 73 69 62 6c 65 20 20 65 78 65 63 7d    visible  exec}
1450: 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09   [state run {...
1460: 53 45 4c 45 43 54 20 66 69 64 2c 20 70 69 64 2c  SELECT fid, pid,
1470: 20 6e 61 6d 65 2c 20 76 69 73 69 62 6c 65 2c 20   name, visible, 
1480: 65 78 65 63 20 46 52 4f 4d 20 66 69 6c 65 20 3b  exec FROM file ;
1490: 0a 09 20 20 20 20 7d 5d 20 7b 0a 09 09 24 70 72  ..    }] {...$pr
14a0: 28 24 70 69 64 29 20 61 64 64 66 69 6c 65 20 24  ($pid) addfile $
14b0: 6e 61 6d 65 20 24 76 69 73 69 62 6c 65 20 24 65  name $visible $e
14c0: 78 65 63 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72  xec..    }..}..r
14d0: 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20  eturn.    }..   
14e0: 20 23 20 70 61 73 73 20 49 49 20 72 65 73 75 6c   # pass II resul
14f0: 74 73 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  ts.    typemetho
1500: 64 20 70 72 69 6e 74 72 65 76 73 74 61 74 69 73  d printrevstatis
1510: 74 69 63 73 20 7b 7d 20 7b 0a 09 6c 6f 67 20 77  tics {} {..log w
1520: 72 69 74 65 20 32 20 72 65 70 6f 73 69 74 6f 72  rite 2 repositor
1530: 79 20 22 53 63 61 6e 6e 65 64 20 2e 2e 2e 22 0a  y "Scanned ...".
1540: 09 23 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 76  .# number of rev
1550: 69 73 69 6f 6e 73 2c 20 73 79 6d 62 6f 6c 73 2c  isions, symbols,
1560: 20 72 65 70 6f 73 69 74 6f 72 79 20 77 69 64 65   repository wide
1570: 2c 20 70 65 72 20 70 72 6f 6a 65 63 74 20 2e 2e  , per project ..
1580: 2e 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  ...return.    }.
1590: 0a 20 20 20 20 23 20 70 61 73 73 20 49 49 20 70  .    # pass II p
15a0: 65 72 73 69 73 74 65 6e 63 65 0a 20 20 20 20 74  ersistence.    t
15b0: 79 70 65 6d 65 74 68 6f 64 20 70 65 72 73 69 73  ypemethod persis
15c0: 74 72 65 76 20 7b 7d 20 7b 0a 09 73 74 61 74 65  trev {} {..state
15d0: 20 74 72 61 6e 73 61 63 74 69 6f 6e 20 7b 0a 09   transaction {..
15e0: 20 20 20 20 53 61 76 65 41 75 74 68 6f 72 73 0a      SaveAuthors.
15f0: 09 20 20 20 20 53 61 76 65 43 6f 6d 6d 69 74 4d  .    SaveCommitM
1600: 65 73 73 61 67 65 73 0a 09 20 20 20 20 23 20 54  essages..    # T
1610: 4f 44 4f 3a 20 53 61 76 65 20 73 79 6d 62 6f 6c  ODO: Save symbol
1620: 73 20 6f 66 20 61 6c 6c 20 70 72 6f 6a 65 63 74  s of all project
1630: 73 20 28 62 65 66 6f 72 65 20 74 68 65 20 72 65  s (before the re
1640: 76 69 73 69 6f 6e 73 0a 09 20 20 20 20 23 20 69  visions..    # i
1650: 6e 20 74 68 65 20 70 72 6f 6a 65 63 74 73 2c 20  n the projects, 
1660: 61 73 20 74 68 65 79 20 61 72 65 20 72 65 66 65  as they are refe
1670: 72 65 6e 63 65 64 20 62 79 20 74 68 65 20 6d 65  renced by the me
1680: 74 61 0a 09 20 20 20 20 23 20 74 75 70 6c 65 73  ta..    # tuples
1690: 29 0a 09 20 20 20 20 53 61 76 65 4d 65 74 61 0a  )..    SaveMeta.
16a0: 09 20 20 20 20 66 6f 72 65 61 63 68 20 70 20 5b  .    foreach p [
16b0: 54 68 65 50 72 6f 6a 65 63 74 73 5d 20 7b 20 24  TheProjects] { $
16c0: 70 20 70 65 72 73 69 73 74 72 65 76 20 7d 0a 09  p persistrev }..
16d0: 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  }..return.    }.
16e0: 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20  .    # # ## ### 
16f0: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23  ##### ######## #
1700: 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 20 20  ############.   
1710: 20 23 23 20 53 74 61 74 65 0a 0a 20 20 20 20 74   ## State..    t
1720: 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 62 61  ypevariable myba
1730: 73 65 20 20 20 20 20 20 20 20 20 20 20 7b 7d 20  se           {} 
1740: 3b 20 23 20 42 61 73 65 20 70 61 74 68 20 74 6f  ; # Base path to
1750: 20 43 56 53 20 72 65 70 6f 73 69 74 6f 72 79 2e   CVS repository.
1760: 0a 20 20 20 20 74 79 70 65 76 61 72 69 61 62 6c  .    typevariabl
1770: 65 20 6d 79 70 72 6f 6a 70 61 74 68 73 20 20 20  e myprojpaths   
1780: 20 20 20 7b 7d 20 3b 20 23 20 4c 69 73 74 20 6f     {} ; # List o
1790: 66 20 70 61 74 68 73 20 74 6f 20 61 6c 6c 20 64  f paths to all d
17a0: 65 63 6c 61 72 65 64 0a 09 09 09 09 20 20 20 20  eclared.....    
17b0: 20 20 20 23 20 70 72 6f 6a 65 63 74 73 2c 20 72     # projects, r
17c0: 65 6c 61 74 69 76 65 20 74 6f 20 6d 79 62 61 73  elative to mybas
17d0: 65 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69 61  e..    typevaria
17e0: 62 6c 65 20 6d 79 70 72 6f 6a 65 63 74 73 20 20  ble myprojects  
17f0: 20 20 20 20 20 7b 7d 20 3b 20 23 20 4c 69 73 74       {} ; # List
1800: 20 6f 66 20 6f 62 6a 65 63 74 73 20 66 6f 72 20   of objects for 
1810: 61 6c 6c 0a 09 09 09 09 20 20 20 20 20 20 20 23  all.....       #
1820: 20 64 65 63 6c 61 72 65 64 20 70 72 6f 6a 65 63   declared projec
1830: 74 73 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69  ts..    typevari
1840: 61 62 6c 65 20 6d 79 61 75 74 68 6f 72 20 20 2d  able myauthor  -
1850: 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4e 61 6d  array {} ; # Nam
1860: 65 73 20 6f 66 20 61 6c 6c 20 61 75 74 68 6f 72  es of all author
1870: 73 20 66 6f 75 6e 64 2c 0a 09 09 09 09 20 20 20  s found,.....   
1880: 20 20 20 20 23 20 6d 61 70 73 20 74 6f 20 74 68      # maps to th
1890: 65 69 72 20 69 64 73 2e 0a 20 20 20 20 74 79 70  eir ids..    typ
18a0: 65 76 61 72 69 61 62 6c 65 20 6d 79 61 75 74 68  evariable myauth
18b0: 6f 72 63 6e 74 20 20 20 20 20 20 30 20 20 3b 20  orcnt      0  ; 
18c0: 23 20 43 6f 75 6e 74 65 72 20 66 6f 72 20 61 75  # Counter for au
18d0: 74 68 6f 72 20 69 64 73 2e 0a 20 20 20 20 74 79  thor ids..    ty
18e0: 70 65 76 61 72 69 61 62 6c 65 20 6d 79 63 6d 73  pevariable mycms
18f0: 67 20 20 20 20 2d 61 72 72 61 79 20 7b 7d 20 3b  g    -array {} ;
1900: 20 23 20 41 6c 6c 20 63 6f 6d 6d 69 74 20 6d 65   # All commit me
1910: 73 73 61 67 65 73 20 66 6f 75 6e 64 2c 0a 09 09  ssages found,...
1920: 09 09 20 20 20 20 20 20 20 23 20 6d 61 70 73 20  ..       # maps 
1930: 74 6f 20 74 68 65 69 72 20 69 64 73 2e 0a 20 20  to their ids..  
1940: 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20 6d    typevariable m
1950: 79 63 6d 73 67 69 6e 76 20 2d 61 72 72 61 79 20  ycmsginv -array 
1960: 7b 7d 20 3b 20 23 20 49 6e 76 65 72 74 65 64 20  {} ; # Inverted 
1970: 69 6e 64 65 78 2c 20 6b 65 79 65 64 20 62 79 20  index, keyed by 
1980: 69 64 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69  id..    typevari
1990: 61 62 6c 65 20 6d 79 63 6d 73 67 63 6e 74 20 20  able mycmsgcnt  
19a0: 20 20 20 20 20 20 30 20 20 3b 20 23 20 43 6f 75        0  ; # Cou
19b0: 6e 74 65 72 20 66 6f 72 20 6d 65 73 73 61 67 65  nter for message
19c0: 20 69 64 73 2e 0a 20 20 20 20 74 79 70 65 76 61   ids..    typeva
19d0: 72 69 61 62 6c 65 20 6d 79 6d 65 74 61 20 20 20  riable mymeta   
19e0: 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 4d   -array {} ; # M
19f0: 61 70 73 20 61 6c 6c 20 6d 65 74 61 20 64 61 74  aps all meta dat
1a00: 61 20 74 75 70 6c 65 73 0a 09 09 09 09 20 20 20  a tuples.....   
1a10: 20 20 20 20 23 20 28 70 72 6f 6a 65 63 74 2c 20      # (project, 
1a20: 62 72 61 6e 63 68 2c 20 61 75 74 68 6f 72 2c 0a  branch, author,.
1a30: 09 09 09 09 20 20 20 20 20 20 20 23 20 63 6d 65  ....       # cme
1a40: 73 73 61 67 65 29 20 74 6f 20 74 68 65 69 72 20  ssage) to their 
1a50: 69 64 73 2e 0a 20 20 20 20 74 79 70 65 76 61 72  ids..    typevar
1a60: 69 61 62 6c 65 20 6d 79 6d 65 74 61 69 6e 76 20  iable mymetainv 
1a70: 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 49 6e  -array {} ; # In
1a80: 76 65 72 74 65 64 20 69 6e 64 65 78 2c 20 6b 65  verted index, ke
1a90: 79 65 64 20 62 79 20 69 64 2e 0a 20 20 20 20 74  yed by id..    t
1aa0: 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 6d 65  ypevariable myme
1ab0: 74 61 63 6e 74 20 20 20 20 20 20 20 20 30 20 20  tacnt        0  
1ac0: 3b 20 23 20 43 6f 75 6e 74 65 72 20 66 6f 72 20  ; # Counter for 
1ad0: 6d 65 74 61 20 69 64 73 2e 0a 20 20 20 20 74 79  meta ids..    ty
1ae0: 70 65 76 61 72 69 61 62 6c 65 20 6d 79 73 79 6d  pevariable mysym
1af0: 62 6f 6c 20 2d 61 72 72 61 79 20 20 7b 7d 20 3b  bol -array  {} ;
1b00: 20 23 20 4d 61 70 20 73 79 6d 62 6f 6c 73 20 69   # Map symbols i
1b10: 64 65 6e 74 69 66 69 65 64 20 62 79 0a 09 09 09  dentified by....
1b20: 09 20 20 20 20 20 20 20 23 20 70 72 6f 6a 65 63  .       # projec
1b30: 74 20 61 6e 64 20 6e 61 6d 65 20 74 6f 20 74 68  t and name to th
1b40: 65 69 72 0a 09 09 09 09 20 20 20 20 20 20 20 23  eir.....       #
1b50: 20 69 64 2e 20 54 68 69 73 20 69 6e 66 6f 72 6d   id. This inform
1b60: 61 74 69 6f 6e 20 69 73 20 6e 6f 74 0a 09 09 09  ation is not....
1b70: 09 20 20 20 20 20 20 20 23 20 73 61 76 65 64 20  .       # saved 
1b80: 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 74 79  directly..    ty
1b90: 70 65 76 61 72 69 61 62 6c 65 20 6d 79 73 79 6d  pevariable mysym
1ba0: 62 6f 6c 63 6e 74 20 20 20 20 20 20 30 20 20 3b  bolcnt      0  ;
1bb0: 20 23 20 43 6f 75 6e 74 65 72 20 66 6f 72 20 73   # Counter for s
1bc0: 79 6d 62 6f 6c 20 69 64 73 2e 0a 20 20 20 20 74  ymbol ids..    t
1bd0: 79 70 65 76 61 72 69 61 62 6c 65 20 6d 79 74 72  ypevariable mytr
1be0: 75 6e 6b 6f 6e 6c 79 20 20 20 20 20 20 30 20 20  unkonly      0  
1bf0: 3b 20 23 20 42 6f 6f 6c 65 61 6e 20 66 6c 61 67  ; # Boolean flag
1c00: 2e 20 53 65 74 20 62 79 20 6f 70 74 69 6f 6e 0a  . Set by option.
1c10: 09 09 09 09 20 20 20 20 20 20 20 23 20 70 72 6f  ....       # pro
1c20: 63 65 73 73 69 6e 67 20 77 68 65 6e 20 74 68 65  cessing when the
1c30: 20 75 73 65 72 0a 09 09 09 09 20 20 20 20 20 20   user.....      
1c40: 20 23 20 72 65 71 75 65 73 74 65 64 20 61 20 74   # requested a t
1c50: 72 75 6e 6b 2d 6f 6e 6c 79 20 69 6d 70 6f 72 74  runk-only import
1c60: 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23  ..    # # ## ###
1c70: 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20   ##### ######## 
1c80: 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 20  #############.  
1c90: 20 20 23 23 20 49 6e 74 65 72 6e 61 6c 20 6d 65    ## Internal me
1ca0: 74 68 6f 64 73 0a 0a 20 20 20 20 70 72 6f 63 20  thods..    proc 
1cb0: 2e 42 61 73 65 4c 65 6e 67 74 68 20 7b 70 7d 20  .BaseLength {p} 
1cc0: 7b 0a 09 72 65 74 75 72 6e 20 5b 73 74 72 69 6e  {..return [strin
1cd0: 67 20 6c 65 6e 67 74 68 20 5b 24 70 20 70 72 69  g length [$p pri
1ce0: 6e 74 62 61 73 65 5d 5d 0a 20 20 20 20 7d 0a 0a  ntbase]].    }..
1cf0: 20 20 20 20 70 72 6f 63 20 2e 4e 46 69 6c 65 4c      proc .NFileL
1d00: 65 6e 67 74 68 20 7b 70 7d 20 7b 0a 09 72 65 74  ength {p} {..ret
1d10: 75 72 6e 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67  urn [string leng
1d20: 74 68 20 5b 6c 6c 65 6e 67 74 68 20 5b 24 70 20  th [llength [$p 
1d30: 66 69 6c 65 6e 61 6d 65 73 5d 5d 5d 0a 20 20 20  filenames]]].   
1d40: 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20 49 73 52   }..    proc IsR
1d50: 65 70 6f 73 69 74 6f 72 79 42 61 73 65 20 7b 70  epositoryBase {p
1d60: 61 74 68 20 6d 76 7d 20 7b 0a 09 3a 3a 76 61 72  ath mv} {..::var
1d70: 69 61 62 6c 65 20 6d 79 62 61 73 65 0a 09 75 70  iable mybase..up
1d80: 76 61 72 20 31 20 24 6d 76 20 6d 73 67 0a 09 69  var 1 $mv msg..i
1d90: 66 20 7b 21 5b 66 69 6c 65 75 74 69 6c 3a 3a 74  f {![fileutil::t
1da0: 65 73 74 20 24 6d 79 62 61 73 65 20 20 20 20 20  est $mybase     
1db0: 20 20 20 20 65 64 72 20 6d 73 67 20 7b 43 56 53      edr msg {CVS
1dc0: 20 52 65 70 6f 73 69 74 6f 72 79 7d 5d 7d 20 20   Repository}]}  
1dd0: 20 20 20 20 7b 72 65 74 75 72 6e 20 30 7d 0a 09      {return 0}..
1de0: 69 66 20 7b 21 5b 66 69 6c 65 75 74 69 6c 3a 3a  if {![fileutil::
1df0: 74 65 73 74 20 24 6d 79 62 61 73 65 2f 43 56 53  test $mybase/CVS
1e00: 52 4f 4f 54 20 65 64 72 20 6d 73 67 20 7b 43 56  ROOT edr msg {CV
1e10: 53 20 41 64 6d 69 6e 20 44 69 72 65 63 74 6f 72  S Admin Director
1e20: 79 7d 5d 7d 20 7b 72 65 74 75 72 6e 20 30 7d 0a  y}]} {return 0}.
1e30: 09 72 65 74 75 72 6e 20 31 0a 20 20 20 20 7d 0a  .return 1.    }.
1e40: 0a 20 20 20 20 70 72 6f 63 20 49 73 50 72 6f 6a  .    proc IsProj
1e50: 65 63 74 42 61 73 65 20 7b 70 61 74 68 20 61 64  ectBase {path ad
1e60: 6d 69 6e 20 6d 76 7d 20 7b 0a 09 75 70 76 61 72  min mv} {..upvar
1e70: 20 31 20 24 6d 76 20 6d 73 67 0a 09 69 66 20 7b   1 $mv msg..if {
1e80: 21 5b 66 69 6c 65 75 74 69 6c 3a 3a 74 65 73 74  ![fileutil::test
1e90: 20 24 70 61 74 68 20 65 64 72 20 6d 73 67 20 50   $path edr msg P
1ea0: 72 6f 6a 65 63 74 5d 7d 20 7b 72 65 74 75 72 6e  roject]} {return
1eb0: 20 30 7d 0a 09 69 66 20 7b 0a 09 20 20 20 20 28   0}..if {..    (
1ec0: 24 70 61 74 68 20 65 71 20 24 61 64 6d 69 6e 29  $path eq $admin)
1ed0: 20 7c 7c 0a 09 20 20 20 20 5b 73 74 72 69 6e 67   ||..    [string
1ee0: 20 6d 61 74 63 68 20 24 61 64 6d 69 6e 2f 2a 20   match $admin/* 
1ef0: 24 70 61 74 68 5d 0a 09 7d 20 7b 0a 09 20 20 20  $path]..} {..   
1f00: 20 73 65 74 20 6d 73 67 20 22 41 64 6d 69 6e 69   set msg "Admini
1f10: 73 74 72 61 74 69 76 65 20 73 75 62 64 69 72 65  strative subdire
1f20: 63 74 6f 72 79 20 24 70 61 74 68 20 63 61 6e 6e  ctory $path cann
1f30: 6f 74 20 62 65 20 61 20 70 72 6f 6a 65 63 74 22  ot be a project"
1f40: 0a 09 20 20 20 20 72 65 74 75 72 6e 20 30 0a 09  ..    return 0..
1f50: 7d 0a 09 72 65 74 75 72 6e 20 31 0a 20 20 20 20  }..return 1.    
1f60: 7d 0a 0a 20 20 20 20 70 72 6f 63 20 54 68 65 50  }..    proc TheP
1f70: 72 6f 6a 65 63 74 73 20 7b 7d 20 7b 0a 09 75 70  rojects {} {..up
1f80: 76 61 72 20 31 20 74 79 70 65 20 74 79 70 65 0a  var 1 type type.
1f90: 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 70 72  .::variable mypr
1fa0: 6f 6a 65 63 74 73 0a 09 3a 3a 76 61 72 69 61 62  ojects..::variab
1fb0: 6c 65 20 6d 79 70 72 6f 6a 70 61 74 68 73 0a 0a  le myprojpaths..
1fc0: 09 69 66 20 7b 21 5b 6c 6c 65 6e 67 74 68 20 24  .if {![llength $
1fd0: 6d 79 70 72 6f 6a 65 63 74 73 5d 7d 20 7b 0a 09  myprojects]} {..
1fe0: 20 20 20 20 73 65 74 20 6d 79 70 72 6f 6a 65 63      set myprojec
1ff0: 74 73 20 5b 45 6d 70 74 79 50 72 6f 6a 65 63 74  ts [EmptyProject
2000: 73 20 24 6d 79 70 72 6f 6a 70 61 74 68 73 5d 0a  s $myprojpaths].
2010: 09 7d 0a 09 72 65 74 75 72 6e 20 24 6d 79 70 72  .}..return $mypr
2020: 6f 6a 65 63 74 73 0a 20 20 20 20 7d 0a 0a 20 20  ojects.    }..  
2030: 20 20 70 72 6f 63 20 45 6d 70 74 79 50 72 6f 6a    proc EmptyProj
2040: 65 63 74 73 20 7b 70 72 6f 6a 70 61 74 68 73 7d  ects {projpaths}
2050: 20 7b 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d   {..::variable m
2060: 79 62 61 73 65 0a 09 75 70 76 61 72 20 31 20 74  ybase..upvar 1 t
2070: 79 70 65 20 74 79 70 65 0a 09 73 65 74 20 72 65  ype type..set re
2080: 73 20 7b 7d 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67  s {}..if {[lleng
2090: 74 68 20 24 70 72 6f 6a 70 61 74 68 73 5d 7d 20  th $projpaths]} 
20a0: 7b 0a 09 20 20 20 20 66 6f 72 65 61 63 68 20 70  {..    foreach p
20b0: 70 20 24 70 72 6f 6a 70 61 74 68 73 20 7b 0a 09  p $projpaths {..
20c0: 09 6c 61 70 70 65 6e 64 20 72 65 73 20 5b 70 72  .lappend res [pr
20d0: 6f 6a 65 63 74 20 25 41 55 54 4f 25 20 24 70 70  oject %AUTO% $pp
20e0: 20 24 74 79 70 65 5d 0a 09 20 20 20 20 7d 0a 09   $type]..    }..
20f0: 7d 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 23 20  } else {..    # 
2100: 42 61 73 65 20 69 73 20 74 68 65 20 73 69 6e 67  Base is the sing
2110: 6c 65 20 70 72 6f 6a 65 63 74 2e 0a 09 20 20 20  le project...   
2120: 20 6c 61 70 70 65 6e 64 20 72 65 73 20 5b 70 72   lappend res [pr
2130: 6f 6a 65 63 74 20 25 41 55 54 4f 25 20 22 22 20  oject %AUTO% "" 
2140: 24 74 79 70 65 5d 0a 09 7d 0a 09 72 65 74 75 72  $type]..}..retur
2150: 6e 20 24 72 65 73 0a 20 20 20 20 7d 0a 0a 20 20  n $res.    }..  
2160: 20 20 70 72 6f 63 20 53 61 76 65 41 75 74 68 6f    proc SaveAutho
2170: 72 73 20 7b 7d 20 7b 0a 09 3a 3a 76 61 72 69 61  rs {} {..::varia
2180: 62 6c 65 20 6d 79 61 75 74 68 6f 72 0a 09 66 6f  ble myauthor..fo
2190: 72 65 61 63 68 20 7b 6e 61 6d 65 20 61 69 64 7d  reach {name aid}
21a0: 20 5b 61 72 72 61 79 20 67 65 74 20 6d 79 61 75   [array get myau
21b0: 74 68 6f 72 5d 20 7b 0a 09 20 20 20 20 73 74 61  thor] {..    sta
21c0: 74 65 20 72 75 6e 20 7b 0a 09 09 49 4e 53 45 52  te run {...INSER
21d0: 54 20 49 4e 54 4f 20 61 75 74 68 6f 72 20 28 20  T INTO author ( 
21e0: 61 69 64 2c 20 20 6e 61 6d 65 29 0a 09 09 56 41  aid,  name)...VA
21f0: 4c 55 45 53 20 20 20 20 20 20 20 20 20 20 20 20  LUES            
2200: 20 28 24 61 69 64 2c 20 24 6e 61 6d 65 29 3b 0a   ($aid, $name);.
2210: 09 20 20 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72  .    }..}..retur
2220: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f  n.    }..    pro
2230: 63 20 53 61 76 65 43 6f 6d 6d 69 74 4d 65 73 73  c SaveCommitMess
2240: 61 67 65 73 20 7b 7d 20 7b 0a 09 3a 3a 76 61 72  ages {} {..::var
2250: 69 61 62 6c 65 20 6d 79 63 6d 73 67 0a 09 66 6f  iable mycmsg..fo
2260: 72 65 61 63 68 20 7b 74 65 78 74 20 63 69 64 7d  reach {text cid}
2270: 20 5b 61 72 72 61 79 20 67 65 74 20 6d 79 63 6d   [array get mycm
2280: 73 67 5d 20 7b 0a 09 20 20 20 20 73 74 61 74 65  sg] {..    state
2290: 20 72 75 6e 20 7b 0a 09 09 49 4e 53 45 52 54 20   run {...INSERT 
22a0: 49 4e 54 4f 20 63 6d 65 73 73 61 67 65 20 28 20  INTO cmessage ( 
22b0: 63 69 64 2c 20 20 74 65 78 74 29 0a 09 09 56 41  cid,  text)...VA
22c0: 4c 55 45 53 20 20 20 20 20 20 20 20 20 20 20 20  LUES            
22d0: 20 20 20 28 24 63 69 64 2c 20 24 74 65 78 74 29     ($cid, $text)
22e0: 3b 0a 09 20 20 20 20 7d 0a 09 7d 0a 09 72 65 74  ;..    }..}..ret
22f0: 75 72 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70  urn.    }..    p
2300: 72 6f 63 20 53 61 76 65 4d 65 74 61 20 7b 7d 20  roc SaveMeta {} 
2310: 7b 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79  {..::variable my
2320: 6d 65 74 61 0a 09 66 6f 72 65 61 63 68 20 7b 6b  meta..foreach {k
2330: 65 79 20 6d 69 64 7d 20 5b 61 72 72 61 79 20 67  ey mid} [array g
2340: 65 74 20 6d 79 6d 65 74 61 5d 20 7b 0a 09 20 20  et mymeta] {..  
2350: 20 20 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61    struct::list a
2360: 73 73 69 67 6e 20 24 6b 65 79 20 70 69 64 20 62  ssign $key pid b
2370: 69 64 20 61 69 64 20 63 69 64 0a 09 20 20 20 20  id aid cid..    
2380: 69 66 20 7b 24 62 69 64 20 65 71 20 22 22 7d 20  if {$bid eq ""} 
2390: 7b 0a 09 09 23 20 54 72 75 6e 6b 2e 20 45 6e 63  {...# Trunk. Enc
23a0: 6f 64 65 64 20 61 73 20 4e 55 4c 4c 2e 0a 09 09  oded as NULL....
23b0: 73 74 61 74 65 20 72 75 6e 20 7b 0a 09 09 20 20  state run {...  
23c0: 20 20 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 65    INSERT INTO me
23d0: 74 61 20 28 20 6d 69 64 2c 20 20 70 69 64 2c 20  ta ( mid,  pid, 
23e0: 20 62 69 64 2c 20 20 61 69 64 2c 20 20 63 69 64   bid,  aid,  cid
23f0: 29 0a 09 09 20 20 20 20 56 41 4c 55 45 53 20 20  )...    VALUES  
2400: 20 20 20 20 20 20 20 20 20 28 24 6d 69 64 2c 20           ($mid, 
2410: 24 70 69 64 2c 20 4e 55 4c 4c 2c 20 24 61 69 64  $pid, NULL, $aid
2420: 2c 20 24 63 69 64 29 3b 0a 09 09 7d 0a 09 20 20  , $cid);...}..  
2430: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09 73 74 61    } else {...sta
2440: 74 65 20 72 75 6e 20 7b 0a 09 09 20 20 20 20 49  te run {...    I
2450: 4e 53 45 52 54 20 49 4e 54 4f 20 6d 65 74 61 20  NSERT INTO meta 
2460: 28 20 6d 69 64 2c 20 20 70 69 64 2c 20 20 62 69  ( mid,  pid,  bi
2470: 64 2c 20 20 61 69 64 2c 20 20 63 69 64 29 0a 09  d,  aid,  cid)..
2480: 09 20 20 20 20 56 41 4c 55 45 53 20 20 20 20 20  .    VALUES     
2490: 20 20 20 20 20 20 28 24 6d 69 64 2c 20 24 70 69        ($mid, $pi
24a0: 64 2c 20 24 62 69 64 2c 20 24 61 69 64 2c 20 24  d, $bid, $aid, $
24b0: 63 69 64 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d  cid);...}..    }
24c0: 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20  ..}..return.    
24d0: 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20 23 23  }..    # # ## ##
24e0: 23 20 23 23 23 23 23 20 23 23 23 23 23 23 23 23  # ##### ########
24f0: 20 23 23 23 23 23 23 23 23 23 23 23 23 23 0a 20   #############. 
2500: 20 20 20 23 23 20 43 6f 6e 66 69 67 75 72 61 74     ## Configurat
2510: 69 6f 6e 0a 0a 20 20 20 20 70 72 61 67 6d 61 20  ion..    pragma 
2520: 2d 68 61 73 69 6e 73 74 61 6e 63 65 73 20 20 20  -hasinstances   
2530: 6e 6f 20 3b 20 23 20 73 69 6e 67 6c 65 74 6f 6e  no ; # singleton
2540: 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73  .    pragma -has
2550: 74 79 70 65 69 6e 66 6f 20 20 20 20 6e 6f 20 3b  typeinfo    no ;
2560: 20 23 20 6e 6f 20 69 6e 74 72 6f 73 70 65 63 74   # no introspect
2570: 69 6f 6e 0a 20 20 20 20 70 72 61 67 6d 61 20 2d  ion.    pragma -
2580: 68 61 73 74 79 70 65 64 65 73 74 72 6f 79 20 6e  hastypedestroy n
2590: 6f 20 3b 20 23 20 69 6d 6d 6f 72 74 61 6c 0a 0a  o ; # immortal..
25a0: 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23      # # ## ### #
25b0: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23  #### ######## ##
25c0: 23 23 23 23 23 23 23 23 23 23 23 0a 7d 0a 0a 6e  ###########.}..n
25d0: 61 6d 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a  amespace eval ::
25e0: 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f  vc::fossil::impo
25f0: 72 74 3a 3a 63 76 73 20 7b 0a 20 20 20 20 6e 61  rt::cvs {.    na
2600: 6d 65 73 70 61 63 65 20 65 78 70 6f 72 74 20 72  mespace export r
2610: 65 70 6f 73 69 74 6f 72 79 0a 20 20 20 20 6e 61  epository.    na
2620: 6d 65 73 70 61 63 65 20 65 76 61 6c 20 72 65 70  mespace eval rep
2630: 6f 73 69 74 6f 72 79 20 7b 0a 09 6e 61 6d 65 73  ository {..names
2640: 70 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63  pace import ::vc
2650: 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74  ::fossil::import
2660: 3a 3a 63 76 73 3a 3a 70 72 6f 6a 65 63 74 0a 09  ::cvs::project..
2670: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74  namespace import
2680: 20 3a 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69   ::vc::fossil::i
2690: 6d 70 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74  mport::cvs::stat
26a0: 65 0a 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70  e..namespace imp
26b0: 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a  ort ::vc::tools:
26c0: 3a 6d 69 73 63 3a 3a 2a 0a 09 6e 61 6d 65 73 70  :misc::*..namesp
26d0: 61 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a  ace import ::vc:
26e0: 3a 74 6f 6f 6c 73 3a 3a 74 72 6f 75 62 6c 65 0a  :tools::trouble.
26f0: 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72  .namespace impor
2700: 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c  t ::vc::tools::l
2710: 6f 67 0a 09 6c 6f 67 20 72 65 67 69 73 74 65 72  og..log register
2720: 20 72 65 70 6f 73 69 74 6f 72 79 0a 20 20 20 20   repository.    
2730: 7d 0a 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20  }.}..# # ## ### 
2740: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23  ##### ######## #
2750: 23 23 23 23 23 23 23 23 23 23 23 23 20 23 23 23  ############ ###
2760: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2770: 23 23 0a 23 23 20 52 65 61 64 79 0a 0a 72 65 74  ##.## Ready..ret
2780: 75 72 6e 0a                                      urn.