Hex Artifact Content
Not logged in

Artifact ef903ed6126bc9fd54bcaeb6b585bdf0c6683675:

File tools/cvs2fossil/lib/c2f_repository.tcl part of check-in [67c24820c7] - Reworked the whole handling of meta data (author, commit message, plus project/branch information), so that revisions now store only the meta id, everything else is stored centrally. All the relevant pieces (author, cmessage, symbols, projects) now also get numeric ids assigned early instead of when being saved to the state. Project ids are loaded from the state now too. by aku on 2007-10-14 01:58:07.

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 70 72 6f 6a 65 63 74 73 20 7b  ethod projects {
07d0: 7d 20 7b 0a 09 72 65 74 75 72 6e 20 5b 54 68 65  } {..return [The
07e0: 50 72 6f 6a 65 63 74 73 5d 0a 20 20 20 20 7d 0a  Projects].    }.
07f0: 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20  .    typemethod 
0800: 62 61 73 65 3f 20 7b 7d 20 7b 20 72 65 74 75 72  base? {} { retur
0810: 6e 20 24 6d 79 62 61 73 65 20 7d 0a 0a 20 20 20  n $mybase }..   
0820: 20 74 79 70 65 6d 65 74 68 6f 64 20 76 61 6c 69   typemethod vali
0830: 64 61 74 65 20 7b 7d 20 7b 0a 09 69 66 20 7b 21  date {} {..if {!
0840: 5b 49 73 52 65 70 6f 73 69 74 6f 72 79 42 61 73  [IsRepositoryBas
0850: 65 20 24 6d 79 62 61 73 65 20 6d 73 67 5d 7d 20  e $mybase msg]} 
0860: 7b 0a 09 20 20 20 20 74 72 6f 75 62 6c 65 20 66  {..    trouble f
0870: 61 74 61 6c 20 24 6d 73 67 0a 09 20 20 20 20 23  atal $msg..    #
0880: 20 57 69 74 68 6f 75 74 20 61 20 67 6f 6f 64 20   Without a good 
0890: 62 61 73 65 20 64 69 72 65 63 74 6f 72 79 20 63  base directory c
08a0: 68 65 63 6b 69 6e 67 20 61 6e 79 20 70 72 6f 6a  hecking any proj
08b0: 65 63 74 73 20 69 73 0a 09 20 20 20 20 23 20 77  ects is..    # w
08c0: 61 73 74 65 64 20 74 69 6d 65 2c 20 73 6f 20 77  asted time, so w
08d0: 65 20 6c 65 61 76 65 20 6e 6f 77 2e 0a 09 20 20  e leave now...  
08e0: 20 20 72 65 74 75 72 6e 0a 09 7d 0a 09 66 6f 72    return..}..for
08f0: 65 61 63 68 20 70 70 20 24 6d 79 70 72 6f 6a 70  each pp $myprojp
0900: 61 74 68 73 20 7b 0a 09 20 20 20 20 69 66 20 7b  aths {..    if {
0910: 21 5b 49 73 50 72 6f 6a 65 63 74 42 61 73 65 20  ![IsProjectBase 
0920: 24 6d 79 62 61 73 65 2f 24 70 70 20 24 6d 79 62  $mybase/$pp $myb
0930: 61 73 65 2f 43 56 53 52 4f 4f 54 20 6d 73 67 5d  ase/CVSROOT msg]
0940: 7d 20 7b 0a 09 09 74 72 6f 75 62 6c 65 20 66 61  } {...trouble fa
0950: 74 61 6c 20 24 6d 73 67 0a 09 20 20 20 20 7d 0a  tal $msg..    }.
0960: 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d  .}..return.    }
0970: 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64  ..    typemethod
0980: 20 64 65 66 61 75 74 68 6f 72 20 7b 61 7d 20 7b   defauthor {a} {
0990: 0a 09 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69  ..if {![info exi
09a0: 73 74 73 20 6d 79 61 75 74 68 6f 72 28 24 61 29  sts myauthor($a)
09b0: 5d 7d 20 7b 0a 09 20 20 20 20 73 65 74 20 6d 79  ]} {..    set my
09c0: 61 75 74 68 6f 72 28 24 61 29 20 5b 69 6e 63 72  author($a) [incr
09d0: 20 6d 79 61 75 74 68 6f 72 63 6e 74 5d 0a 09 20   myauthorcnt].. 
09e0: 20 20 20 6c 6f 67 20 77 72 69 74 65 20 36 20 72     log write 6 r
09f0: 65 70 6f 73 69 74 6f 72 79 20 22 61 75 74 68 6f  epository "autho
0a00: 72 20 27 24 61 27 20 3d 20 20 24 6d 79 61 75 74  r '$a' =  $myaut
0a10: 68 6f 72 28 24 61 29 22 0a 09 7d 0a 09 72 65 74  hor($a)"..}..ret
0a20: 75 72 6e 20 24 6d 79 61 75 74 68 6f 72 28 24 61  urn $myauthor($a
0a30: 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70  ).    }..    typ
0a40: 65 6d 65 74 68 6f 64 20 64 65 66 63 6d 65 73 73  emethod defcmess
0a50: 61 67 65 20 7b 63 6d 7d 20 7b 0a 09 69 66 20 7b  age {cm} {..if {
0a60: 21 5b 69 6e 66 6f 20 65 78 69 73 74 73 20 6d 79  ![info exists my
0a70: 63 6d 73 67 28 24 63 6d 29 5d 7d 20 7b 0a 09 20  cmsg($cm)]} {.. 
0a80: 20 20 20 73 65 74 20 6d 79 63 6d 73 67 28 24 63     set mycmsg($c
0a90: 6d 29 20 5b 69 6e 63 72 20 6d 79 63 6d 73 67 63  m) [incr mycmsgc
0aa0: 6e 74 5d 0a 09 20 20 20 20 6c 6f 67 20 77 72 69  nt]..    log wri
0ab0: 74 65 20 36 20 72 65 70 6f 73 69 74 6f 72 79 20  te 6 repository 
0ac0: 22 63 6d 65 73 73 61 67 65 20 27 24 63 6d 27 20  "cmessage '$cm' 
0ad0: 3d 20 20 24 6d 79 63 6d 73 67 28 24 63 6d 29 22  =  $mycmsg($cm)"
0ae0: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 24 6d 79 63  ..}..return $myc
0af0: 6d 73 67 28 24 63 6d 29 0a 20 20 20 20 7d 0a 0a  msg($cm).    }..
0b00: 20 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 64      typemethod d
0b10: 65 66 73 79 6d 62 6f 6c 20 7b 70 69 64 20 6e 61  efsymbol {pid na
0b20: 6d 65 7d 20 7b 0a 09 73 65 74 20 6b 65 79 20 5b  me} {..set key [
0b30: 6c 69 73 74 20 24 70 69 64 20 24 6e 61 6d 65 5d  list $pid $name]
0b40: 0a 09 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78 69  ..if {![info exi
0b50: 73 74 73 20 6d 79 73 79 6d 62 6f 6c 28 24 6b 65  sts mysymbol($ke
0b60: 79 29 5d 7d 20 7b 0a 09 20 20 20 20 73 65 74 20  y)]} {..    set 
0b70: 6d 79 73 79 6d 62 6f 6c 28 24 6b 65 79 29 20 5b  mysymbol($key) [
0b80: 69 6e 63 72 20 6d 79 73 79 6d 62 6f 6c 63 6e 74  incr mysymbolcnt
0b90: 5d 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65  ]..    log write
0ba0: 20 36 20 72 65 70 6f 73 69 74 6f 72 79 20 22 73   6 repository "s
0bb0: 79 6d 62 6f 6c 20 28 24 6b 65 79 29 20 3d 20 20  ymbol ($key) =  
0bc0: 24 6d 79 73 79 6d 62 6f 6c 28 24 6b 65 79 29 22  $mysymbol($key)"
0bd0: 0a 09 7d 0a 09 72 65 74 75 72 6e 20 24 6d 79 73  ..}..return $mys
0be0: 79 6d 62 6f 6c 28 24 6b 65 79 29 0a 20 20 20 20  ymbol($key).    
0bf0: 7d 0a 0a 20 20 20 20 74 79 70 65 6d 65 74 68 6f  }..    typemetho
0c00: 64 20 64 65 66 6d 65 74 61 20 7b 70 69 64 20 62  d defmeta {pid b
0c10: 69 64 20 61 69 64 20 63 69 64 7d 20 7b 0a 09 73  id aid cid} {..s
0c20: 65 74 20 6b 65 79 20 5b 6c 69 73 74 20 24 70 69  et key [list $pi
0c30: 64 20 24 62 69 64 20 24 61 69 64 20 24 63 69 64  d $bid $aid $cid
0c40: 5d 0a 09 69 66 20 7b 21 5b 69 6e 66 6f 20 65 78  ]..if {![info ex
0c50: 69 73 74 73 20 6d 79 6d 65 74 61 28 24 6b 65 79  ists mymeta($key
0c60: 29 5d 7d 20 7b 0a 09 20 20 20 20 73 65 74 20 6d  )]} {..    set m
0c70: 79 6d 65 74 61 28 24 6b 65 79 29 20 5b 69 6e 63  ymeta($key) [inc
0c80: 72 20 6d 79 6d 65 74 61 63 6e 74 5d 0a 09 20 20  r mymetacnt]..  
0c90: 20 20 6c 6f 67 20 77 72 69 74 65 20 36 20 72 65    log write 6 re
0ca0: 70 6f 73 69 74 6f 72 79 20 22 6d 65 74 61 20 28  pository "meta (
0cb0: 24 6b 65 79 29 20 3d 20 20 24 6d 79 6d 65 74 61  $key) =  $mymeta
0cc0: 28 24 6b 65 79 29 22 0a 09 7d 0a 09 72 65 74 75  ($key)"..}..retu
0cd0: 72 6e 20 24 6d 79 6d 65 74 61 28 24 6b 65 79 29  rn $mymeta($key)
0ce0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 23 20 70 61  .    }..    # pa
0cf0: 73 73 20 49 20 72 65 73 75 6c 74 73 0a 20 20 20  ss I results.   
0d00: 20 74 79 70 65 6d 65 74 68 6f 64 20 70 72 69 6e   typemethod prin
0d10: 74 73 74 61 74 69 73 74 69 63 73 20 7b 7d 20 7b  tstatistics {} {
0d20: 0a 09 73 65 74 20 70 72 6c 69 73 74 20 5b 54 68  ..set prlist [Th
0d30: 65 50 72 6f 6a 65 63 74 73 5d 0a 09 73 65 74 20  eProjects]..set 
0d40: 6e 70 72 20 5b 6c 6c 65 6e 67 74 68 20 24 70 72  npr [llength $pr
0d50: 6c 69 73 74 5d 0a 0a 09 6c 6f 67 20 77 72 69 74  list]...log writ
0d60: 65 20 32 20 72 65 70 6f 73 69 74 6f 72 79 20 22  e 2 repository "
0d70: 53 63 61 6e 6e 65 64 20 5b 6e 73 70 20 24 6e 70  Scanned [nsp $np
0d80: 72 20 70 72 6f 6a 65 63 74 5d 22 0a 0a 09 69 66  r project]"...if
0d90: 20 7b 24 6e 70 72 20 3e 20 31 7d 20 7b 0a 09 20   {$npr > 1} {.. 
0da0: 20 20 20 73 65 74 20 20 62 6d 61 78 20 5b 6d 61     set  bmax [ma
0db0: 78 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74 20  x [struct::list 
0dc0: 6d 61 70 20 24 70 72 6c 69 73 74 20 5b 6d 79 70  map $prlist [myp
0dd0: 72 6f 63 20 2e 42 61 73 65 4c 65 6e 67 74 68 5d  roc .BaseLength]
0de0: 5d 5d 0a 09 20 20 20 20 69 6e 63 72 20 62 6d 61  ]]..    incr bma
0df0: 78 20 32 0a 09 20 20 20 20 73 65 74 20 20 62 66  x 2..    set  bf
0e00: 6d 74 20 25 2d 24 7b 62 6d 61 78 7d 73 0a 0a 09  mt %-${bmax}s...
0e10: 20 20 20 20 73 65 74 20 20 6e 6d 61 78 20 5b 6d      set  nmax [m
0e20: 61 78 20 5b 73 74 72 75 63 74 3a 3a 6c 69 73 74  ax [struct::list
0e30: 20 6d 61 70 20 24 70 72 6c 69 73 74 20 5b 6d 79   map $prlist [my
0e40: 70 72 6f 63 20 2e 4e 46 69 6c 65 4c 65 6e 67 74  proc .NFileLengt
0e50: 68 5d 5d 5d 0a 09 20 20 20 20 73 65 74 20 20 6e  h]]]..    set  n
0e60: 66 6d 74 20 25 24 7b 6e 6d 61 78 7d 73 0a 09 7d  fmt %${nmax}s..}
0e70: 20 65 6c 73 65 20 7b 0a 09 20 20 20 20 73 65 74   else {..    set
0e80: 20 62 66 6d 74 20 25 73 0a 09 20 20 20 20 73 65   bfmt %s..    se
0e90: 74 20 6e 66 6d 74 20 25 73 0a 09 7d 0a 0a 09 73  t nfmt %s..}...s
0ea0: 65 74 20 6b 65 65 70 20 7b 7d 0a 09 66 6f 72 65  et keep {}..fore
0eb0: 61 63 68 20 70 20 24 70 72 6c 69 73 74 20 7b 0a  ach p $prlist {.
0ec0: 09 20 20 20 20 73 65 74 20 6e 66 69 6c 65 73 20  .    set nfiles 
0ed0: 5b 6c 6c 65 6e 67 74 68 20 5b 24 70 20 66 69 6c  [llength [$p fil
0ee0: 65 6e 61 6d 65 73 5d 5d 0a 09 20 20 20 20 73 65  enames]]..    se
0ef0: 74 20 6c 69 6e 65 20 22 50 72 6f 6a 65 63 74 20  t line "Project 
0f00: 5b 66 6f 72 6d 61 74 20 24 62 66 6d 74 20 5c 22  [format $bfmt \"
0f10: 5b 24 70 20 70 72 69 6e 74 62 61 73 65 5d 5c 22  [$p printbase]\"
0f20: 5d 20 3a 20 5b 66 6f 72 6d 61 74 20 24 6e 66 6d  ] : [format $nfm
0f30: 74 20 24 6e 66 69 6c 65 73 5d 20 5b 73 70 20 24  t $nfiles] [sp $
0f40: 6e 66 69 6c 65 73 20 66 69 6c 65 5d 22 0a 09 20  nfiles file]".. 
0f50: 20 20 20 69 66 20 7b 24 6e 66 69 6c 65 73 20 3c     if {$nfiles <
0f60: 20 31 7d 20 7b 0a 09 09 61 70 70 65 6e 64 20 6c   1} {...append l
0f70: 69 6e 65 20 22 2c 20 64 72 6f 70 70 65 64 22 0a  ine ", dropped".
0f80: 09 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09 09  .    } else {...
0f90: 6c 61 70 70 65 6e 64 20 6b 65 65 70 20 24 70 0a  lappend keep $p.
0fa0: 09 20 20 20 20 7d 0a 09 20 20 20 20 6c 6f 67 20  .    }..    log 
0fb0: 77 72 69 74 65 20 32 20 72 65 70 6f 73 69 74 6f  write 2 reposito
0fc0: 72 79 20 24 6c 69 6e 65 0a 09 7d 0a 0a 09 69 66  ry $line..}...if
0fd0: 20 7b 21 5b 6c 6c 65 6e 67 74 68 20 24 6b 65 65   {![llength $kee
0fe0: 70 5d 7d 20 7b 0a 09 20 20 20 20 74 72 6f 75 62  p]} {..    troub
0ff0: 6c 65 20 77 61 72 6e 20 22 44 72 6f 70 70 65 64  le warn "Dropped
1000: 20 61 6c 6c 20 70 72 6f 6a 65 63 74 73 22 0a 09   all projects"..
1010: 7d 20 65 6c 73 65 69 66 20 7b 24 6e 70 72 20 3d  } elseif {$npr =
1020: 3d 20 5b 6c 6c 65 6e 67 74 68 20 24 6b 65 65 70  = [llength $keep
1030: 5d 7d 20 7b 0a 09 20 20 20 20 6c 6f 67 20 77 72  ]} {..    log wr
1040: 69 74 65 20 32 20 72 65 70 6f 73 69 74 6f 72 79  ite 2 repository
1050: 20 22 4b 65 65 70 69 6e 67 20 61 6c 6c 20 70 72   "Keeping all pr
1060: 6f 6a 65 63 74 73 22 0a 09 7d 20 65 6c 73 65 20  ojects"..} else 
1070: 7b 0a 09 20 20 20 20 6c 6f 67 20 77 72 69 74 65  {..    log write
1080: 20 32 20 72 65 70 6f 73 69 74 6f 72 79 20 22 4b   2 repository "K
1090: 65 65 70 69 6e 67 20 5b 6e 73 70 20 5b 6c 6c 65  eeping [nsp [lle
10a0: 6e 67 74 68 20 24 6b 65 65 70 5d 20 70 72 6f 6a  ngth $keep] proj
10b0: 65 63 74 5d 22 0a 09 20 20 20 20 74 72 6f 75 62  ect]"..    troub
10c0: 6c 65 20 77 61 72 6e 20 22 44 72 6f 70 70 65 64  le warn "Dropped
10d0: 20 5b 6e 73 70 20 5b 65 78 70 72 20 7b 24 6e 70   [nsp [expr {$np
10e0: 72 20 2d 20 5b 6c 6c 65 6e 67 74 68 20 24 6b 65  r - [llength $ke
10f0: 65 70 5d 7d 5d 20 7b 65 6d 70 74 79 20 70 72 6f  ep]}] {empty pro
1100: 6a 65 63 74 7d 5d 22 0a 09 7d 0a 0a 09 23 20 4b  ject}]"..}...# K
1110: 65 65 70 20 72 65 64 75 63 65 64 20 73 65 74 20  eep reduced set 
1120: 6f 66 20 70 72 6f 6a 65 63 74 73 2e 0a 09 73 65  of projects...se
1130: 74 20 70 72 6f 6a 65 63 74 73 20 24 6b 65 65 70  t projects $keep
1140: 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a 0a  ..return.    }..
1150: 20 20 20 20 23 20 70 61 73 73 20 49 20 70 65 72      # pass I per
1160: 73 69 73 74 65 6e 63 65 0a 20 20 20 20 74 79 70  sistence.    typ
1170: 65 6d 65 74 68 6f 64 20 70 65 72 73 69 73 74 20  emethod persist 
1180: 7b 7d 20 7b 0a 09 73 74 61 74 65 20 74 72 61 6e  {} {..state tran
1190: 73 61 63 74 69 6f 6e 20 7b 0a 09 20 20 20 20 66  saction {..    f
11a0: 6f 72 65 61 63 68 20 70 20 5b 54 68 65 50 72 6f  oreach p [ThePro
11b0: 6a 65 63 74 73 5d 20 7b 20 24 70 20 70 65 72 73  jects] { $p pers
11c0: 69 73 74 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e  ist }..}..return
11d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 74 79 70 65  .    }..    type
11e0: 6d 65 74 68 6f 64 20 6c 6f 61 64 20 7b 7d 20 7b  method load {} {
11f0: 0a 09 61 72 72 61 79 20 73 65 74 20 70 72 20 7b  ..array set pr {
1200: 7d 0a 09 73 74 61 74 65 20 74 72 61 6e 73 61 63  }..state transac
1210: 74 69 6f 6e 20 7b 0a 09 20 20 20 20 66 6f 72 65  tion {..    fore
1220: 61 63 68 20 20 20 7b 70 69 64 20 20 6e 61 6d 65  ach   {pid  name
1230: 7d 20 5b 73 74 61 74 65 20 72 75 6e 20 7b 0a 09  } [state run {..
1240: 09 53 45 4c 45 43 54 20 70 69 64 2c 20 6e 61 6d  .SELECT pid, nam
1250: 65 20 46 52 4f 4d 20 70 72 6f 6a 65 63 74 20 3b  e FROM project ;
1260: 0a 09 20 20 20 20 7d 5d 20 7b 0a 09 09 6c 61 70  ..    }] {...lap
1270: 70 65 6e 64 20 6d 79 70 72 6f 6a 70 61 74 68 73  pend myprojpaths
1280: 20 24 6e 61 6d 65 0a 09 09 6c 61 70 70 65 6e 64   $name...lappend
1290: 20 6d 79 70 72 6f 6a 65 63 74 73 20 5b 73 65 74   myprojects [set
12a0: 20 70 72 28 24 70 69 64 29 20 5b 70 72 6f 6a 65   pr($pid) [proje
12b0: 63 74 20 25 41 55 54 4f 25 20 24 6e 61 6d 65 20  ct %AUTO% $name 
12c0: 24 74 79 70 65 5d 5d 0a 09 09 24 70 72 28 24 70  $type]]...$pr($p
12d0: 69 64 29 20 73 65 74 69 64 20 24 70 69 64 0a 09  id) setid $pid..
12e0: 20 20 20 20 7d 0a 09 20 20 20 20 66 6f 72 65 61      }..    forea
12f0: 63 68 20 20 20 7b 66 69 64 20 20 70 69 64 20 20  ch   {fid  pid  
1300: 6e 61 6d 65 20 20 76 69 73 69 62 6c 65 20 20 65  name  visible  e
1310: 78 65 63 7d 20 5b 73 74 61 74 65 20 72 75 6e 20  xec} [state run 
1320: 7b 0a 09 09 53 45 4c 45 43 54 20 66 69 64 2c 20  {...SELECT fid, 
1330: 70 69 64 2c 20 6e 61 6d 65 2c 20 76 69 73 69 62  pid, name, visib
1340: 6c 65 2c 20 65 78 65 63 20 46 52 4f 4d 20 66 69  le, exec FROM fi
1350: 6c 65 20 3b 0a 09 20 20 20 20 7d 5d 20 7b 0a 09  le ;..    }] {..
1360: 09 24 70 72 28 24 70 69 64 29 20 61 64 64 66 69  .$pr($pid) addfi
1370: 6c 65 20 24 6e 61 6d 65 20 24 76 69 73 69 62 6c  le $name $visibl
1380: 65 20 24 65 78 65 63 0a 09 20 20 20 20 7d 0a 09  e $exec..    }..
1390: 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  }..return.    }.
13a0: 0a 20 20 20 20 23 20 70 61 73 73 20 49 49 20 72  .    # pass II r
13b0: 65 73 75 6c 74 73 0a 20 20 20 20 74 79 70 65 6d  esults.    typem
13c0: 65 74 68 6f 64 20 70 72 69 6e 74 72 65 76 73 74  ethod printrevst
13d0: 61 74 69 73 74 69 63 73 20 7b 7d 20 7b 0a 09 6c  atistics {} {..l
13e0: 6f 67 20 77 72 69 74 65 20 32 20 72 65 70 6f 73  og write 2 repos
13f0: 69 74 6f 72 79 20 22 53 63 61 6e 6e 65 64 20 2e  itory "Scanned .
1400: 2e 2e 22 0a 09 23 20 6e 75 6d 62 65 72 20 6f 66  .."..# number of
1410: 20 72 65 76 69 73 69 6f 6e 73 2c 20 73 79 6d 62   revisions, symb
1420: 6f 6c 73 2c 20 72 65 70 6f 73 69 74 6f 72 79 20  ols, repository 
1430: 77 69 64 65 2c 20 70 65 72 20 70 72 6f 6a 65 63  wide, per projec
1440: 74 20 2e 2e 2e 0a 09 72 65 74 75 72 6e 0a 20 20  t .....return.  
1450: 20 20 7d 0a 0a 20 20 20 20 23 20 70 61 73 73 20    }..    # pass 
1460: 49 49 20 70 65 72 73 69 73 74 65 6e 63 65 0a 20  II persistence. 
1470: 20 20 20 74 79 70 65 6d 65 74 68 6f 64 20 70 65     typemethod pe
1480: 72 73 69 73 74 72 65 76 20 7b 7d 20 7b 0a 09 73  rsistrev {} {..s
1490: 74 61 74 65 20 74 72 61 6e 73 61 63 74 69 6f 6e  tate transaction
14a0: 20 7b 0a 09 20 20 20 20 53 61 76 65 41 75 74 68   {..    SaveAuth
14b0: 6f 72 73 0a 09 20 20 20 20 53 61 76 65 43 6f 6d  ors..    SaveCom
14c0: 6d 69 74 4d 65 73 73 61 67 65 73 0a 09 20 20 20  mitMessages..   
14d0: 20 23 20 54 4f 44 4f 3a 20 53 61 76 65 20 73 79   # TODO: Save sy
14e0: 6d 62 6f 6c 73 20 6f 66 20 61 6c 6c 20 70 72 6f  mbols of all pro
14f0: 6a 65 63 74 73 20 28 62 65 66 6f 72 65 20 74 68  jects (before th
1500: 65 20 72 65 76 69 73 69 6f 6e 73 0a 09 20 20 20  e revisions..   
1510: 20 23 20 69 6e 20 74 68 65 20 70 72 6f 6a 65 63   # in the projec
1520: 74 73 2c 20 61 73 20 74 68 65 79 20 61 72 65 20  ts, as they are 
1530: 72 65 66 65 72 65 6e 63 65 64 20 62 79 20 74 68  referenced by th
1540: 65 20 6d 65 74 61 0a 09 20 20 20 20 23 20 74 75  e meta..    # tu
1550: 70 6c 65 73 29 0a 09 20 20 20 20 53 61 76 65 4d  ples)..    SaveM
1560: 65 74 61 0a 09 20 20 20 20 66 6f 72 65 61 63 68  eta..    foreach
1570: 20 70 20 5b 54 68 65 50 72 6f 6a 65 63 74 73 5d   p [TheProjects]
1580: 20 7b 20 24 70 20 70 65 72 73 69 73 74 72 65 76   { $p persistrev
1590: 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a 20 20   }..}..return.  
15a0: 20 20 7d 0a 0a 20 20 20 20 23 20 23 20 23 23 20    }..    # # ## 
15b0: 23 23 23 20 23 23 23 23 23 20 23 23 23 23 23 23  ### ##### ######
15c0: 23 23 20 23 23 23 23 23 23 23 23 23 23 23 23 23  ## #############
15d0: 0a 20 20 20 20 23 23 20 53 74 61 74 65 0a 0a 20  .    ## State.. 
15e0: 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20     typevariable 
15f0: 6d 79 62 61 73 65 20 20 20 20 20 20 20 20 20 20  mybase          
1600: 7b 7d 20 3b 20 23 20 42 61 73 65 20 70 61 74 68  {} ; # Base path
1610: 20 74 6f 20 43 56 53 20 72 65 70 6f 73 69 74 6f   to CVS reposito
1620: 72 79 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69  ry..    typevari
1630: 61 62 6c 65 20 6d 79 70 72 6f 6a 70 61 74 68 73  able myprojpaths
1640: 20 20 20 20 20 7b 7d 20 3b 20 23 20 4c 69 73 74       {} ; # List
1650: 20 6f 66 20 70 61 74 68 73 20 74 6f 20 61 6c 6c   of paths to all
1660: 20 64 65 63 6c 61 72 65 64 0a 09 09 09 09 20 20   declared.....  
1670: 20 20 20 20 23 20 70 72 6f 6a 65 63 74 73 2c 20      # projects, 
1680: 72 65 6c 61 74 69 76 65 20 74 6f 20 6d 79 62 61  relative to myba
1690: 73 65 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69  se..    typevari
16a0: 61 62 6c 65 20 6d 79 70 72 6f 6a 65 63 74 73 20  able myprojects 
16b0: 20 20 20 20 20 7b 7d 20 3b 20 23 20 4c 69 73 74       {} ; # List
16c0: 20 6f 66 20 6f 62 6a 65 63 74 73 20 66 6f 72 20   of objects for 
16d0: 61 6c 6c 0a 09 09 09 09 20 20 20 20 20 20 23 20  all.....      # 
16e0: 64 65 63 6c 61 72 65 64 20 70 72 6f 6a 65 63 74  declared project
16f0: 73 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69 61  s..    typevaria
1700: 62 6c 65 20 6d 79 61 75 74 68 6f 72 20 2d 61 72  ble myauthor -ar
1710: 72 61 79 20 7b 7d 20 3b 20 23 20 4e 61 6d 65 73  ray {} ; # Names
1720: 20 6f 66 20 61 6c 6c 20 61 75 74 68 6f 72 73 20   of all authors 
1730: 66 6f 75 6e 64 2c 0a 09 09 09 09 20 20 20 20 20  found,.....     
1740: 20 23 20 6d 61 70 73 20 74 6f 20 74 68 65 69 72   # maps to their
1750: 20 69 64 73 2e 0a 20 20 20 20 74 79 70 65 76 61   ids..    typeva
1760: 72 69 61 62 6c 65 20 6d 79 61 75 74 68 6f 72 63  riable myauthorc
1770: 6e 74 20 20 20 20 20 30 20 20 3b 20 23 20 43 6f  nt     0  ; # Co
1780: 75 6e 74 65 72 20 66 6f 72 20 61 75 74 68 6f 72  unter for author
1790: 20 69 64 73 2e 0a 20 20 20 20 74 79 70 65 76 61   ids..    typeva
17a0: 72 69 61 62 6c 65 20 6d 79 63 6d 73 67 20 20 20  riable mycmsg   
17b0: 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23 20 41 6c  -array {} ; # Al
17c0: 6c 20 63 6f 6d 6d 69 74 20 6d 65 73 73 61 67 65  l commit message
17d0: 73 20 66 6f 75 6e 64 2c 0a 09 09 09 09 20 20 20  s found,.....   
17e0: 20 20 20 23 20 6d 61 70 73 20 74 6f 20 74 68 65     # maps to the
17f0: 69 72 20 69 64 73 2e 0a 20 20 20 20 74 79 70 65  ir ids..    type
1800: 76 61 72 69 61 62 6c 65 20 6d 79 63 6d 73 67 63  variable mycmsgc
1810: 6e 74 20 20 20 20 20 20 20 30 20 20 3b 20 23 20  nt       0  ; # 
1820: 43 6f 75 6e 74 65 72 20 66 6f 72 20 6d 65 73 73  Counter for mess
1830: 61 67 65 20 69 64 73 2e 0a 20 20 20 20 74 79 70  age ids..    typ
1840: 65 76 61 72 69 61 62 6c 65 20 6d 79 6d 65 74 61  evariable mymeta
1850: 20 20 20 2d 61 72 72 61 79 20 7b 7d 20 3b 20 23     -array {} ; #
1860: 20 4d 61 70 73 20 61 6c 6c 20 6d 65 74 61 20 64   Maps all meta d
1870: 61 74 61 20 74 75 70 6c 65 73 0a 09 09 09 09 20  ata tuples..... 
1880: 20 20 20 20 20 23 20 28 70 72 6f 6a 65 63 74 2c       # (project,
1890: 20 62 72 61 6e 63 68 2c 20 61 75 74 68 6f 72 2c   branch, author,
18a0: 0a 09 09 09 09 20 20 20 20 20 20 23 20 63 6d 65  .....      # cme
18b0: 73 73 61 67 65 29 20 74 6f 20 74 68 65 69 72 20  ssage) to their 
18c0: 69 64 73 2e 0a 20 20 20 20 74 79 70 65 76 61 72  ids..    typevar
18d0: 69 61 62 6c 65 20 6d 79 6d 65 74 61 63 6e 74 20  iable mymetacnt 
18e0: 20 20 20 20 20 20 30 20 20 3b 20 23 20 43 6f 75        0  ; # Cou
18f0: 6e 74 65 72 20 66 6f 72 20 6d 65 74 61 20 69 64  nter for meta id
1900: 73 2e 0a 20 20 20 20 74 79 70 65 76 61 72 69 61  s..    typevaria
1910: 62 6c 65 20 6d 79 73 79 6d 62 6f 6c 20 2d 61 72  ble mysymbol -ar
1920: 72 61 79 20 7b 7d 20 3b 20 23 20 4d 61 70 20 73  ray {} ; # Map s
1930: 79 6d 62 6f 6c 73 20 69 64 65 6e 74 69 66 69 65  ymbols identifie
1940: 64 20 62 79 0a 09 09 09 09 20 20 20 20 20 20 23  d by.....      #
1950: 20 70 72 6f 6a 65 63 74 20 61 6e 64 20 6e 61 6d   project and nam
1960: 65 20 74 6f 20 74 68 65 69 72 0a 09 09 09 09 20  e to their..... 
1970: 20 20 20 20 20 23 20 69 64 2e 20 54 68 69 73 20       # id. This 
1980: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 69 73 20 6e  information is n
1990: 6f 74 0a 09 09 09 09 20 20 20 20 20 20 23 20 73  ot.....      # s
19a0: 61 76 65 64 20 64 69 72 65 63 74 6c 79 2e 0a 20  aved directly.. 
19b0: 20 20 20 74 79 70 65 76 61 72 69 61 62 6c 65 20     typevariable 
19c0: 6d 79 73 79 6d 62 6f 6c 63 6e 74 20 20 20 20 20  mysymbolcnt     
19d0: 30 20 20 3b 20 23 20 43 6f 75 6e 74 65 72 20 66  0  ; # Counter f
19e0: 6f 72 20 73 79 6d 62 6f 6c 20 69 64 73 2e 0a 0a  or symbol ids...
19f0: 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20 23      # # ## ### #
1a00: 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23  #### ######## ##
1a10: 23 23 23 23 23 23 23 23 23 23 23 0a 20 20 20 20  ###########.    
1a20: 23 23 20 49 6e 74 65 72 6e 61 6c 20 6d 65 74 68  ## Internal meth
1a30: 6f 64 73 0a 0a 20 20 20 20 70 72 6f 63 20 2e 42  ods..    proc .B
1a40: 61 73 65 4c 65 6e 67 74 68 20 7b 70 7d 20 7b 0a  aseLength {p} {.
1a50: 09 72 65 74 75 72 6e 20 5b 73 74 72 69 6e 67 20  .return [string 
1a60: 6c 65 6e 67 74 68 20 5b 24 70 20 70 72 69 6e 74  length [$p print
1a70: 62 61 73 65 5d 5d 0a 20 20 20 20 7d 0a 0a 20 20  base]].    }..  
1a80: 20 20 70 72 6f 63 20 2e 4e 46 69 6c 65 4c 65 6e    proc .NFileLen
1a90: 67 74 68 20 7b 70 7d 20 7b 0a 09 72 65 74 75 72  gth {p} {..retur
1aa0: 6e 20 5b 73 74 72 69 6e 67 20 6c 65 6e 67 74 68  n [string length
1ab0: 20 5b 6c 6c 65 6e 67 74 68 20 5b 24 70 20 66 69   [llength [$p fi
1ac0: 6c 65 6e 61 6d 65 73 5d 5d 5d 0a 20 20 20 20 7d  lenames]]].    }
1ad0: 0a 0a 20 20 20 20 70 72 6f 63 20 49 73 52 65 70  ..    proc IsRep
1ae0: 6f 73 69 74 6f 72 79 42 61 73 65 20 7b 70 61 74  ositoryBase {pat
1af0: 68 20 6d 76 7d 20 7b 0a 09 3a 3a 76 61 72 69 61  h mv} {..::varia
1b00: 62 6c 65 20 6d 79 62 61 73 65 0a 09 75 70 76 61  ble mybase..upva
1b10: 72 20 31 20 24 6d 76 20 6d 73 67 0a 09 69 66 20  r 1 $mv msg..if 
1b20: 7b 21 5b 66 69 6c 65 75 74 69 6c 3a 3a 74 65 73  {![fileutil::tes
1b30: 74 20 24 6d 79 62 61 73 65 20 20 20 20 20 20 20  t $mybase       
1b40: 20 20 65 64 72 20 6d 73 67 20 7b 43 56 53 20 52    edr msg {CVS R
1b50: 65 70 6f 73 69 74 6f 72 79 7d 5d 7d 20 20 20 20  epository}]}    
1b60: 20 20 7b 72 65 74 75 72 6e 20 30 7d 0a 09 69 66    {return 0}..if
1b70: 20 7b 21 5b 66 69 6c 65 75 74 69 6c 3a 3a 74 65   {![fileutil::te
1b80: 73 74 20 24 6d 79 62 61 73 65 2f 43 56 53 52 4f  st $mybase/CVSRO
1b90: 4f 54 20 65 64 72 20 6d 73 67 20 7b 43 56 53 20  OT edr msg {CVS 
1ba0: 41 64 6d 69 6e 20 44 69 72 65 63 74 6f 72 79 7d  Admin Directory}
1bb0: 5d 7d 20 7b 72 65 74 75 72 6e 20 30 7d 0a 09 72  ]} {return 0}..r
1bc0: 65 74 75 72 6e 20 31 0a 20 20 20 20 7d 0a 0a 20  eturn 1.    }.. 
1bd0: 20 20 20 70 72 6f 63 20 49 73 50 72 6f 6a 65 63     proc IsProjec
1be0: 74 42 61 73 65 20 7b 70 61 74 68 20 61 64 6d 69  tBase {path admi
1bf0: 6e 20 6d 76 7d 20 7b 0a 09 75 70 76 61 72 20 31  n mv} {..upvar 1
1c00: 20 24 6d 76 20 6d 73 67 0a 09 69 66 20 7b 21 5b   $mv msg..if {![
1c10: 66 69 6c 65 75 74 69 6c 3a 3a 74 65 73 74 20 24  fileutil::test $
1c20: 70 61 74 68 20 65 64 72 20 6d 73 67 20 50 72 6f  path edr msg Pro
1c30: 6a 65 63 74 5d 7d 20 7b 72 65 74 75 72 6e 20 30  ject]} {return 0
1c40: 7d 0a 09 69 66 20 7b 0a 09 20 20 20 20 28 24 70  }..if {..    ($p
1c50: 61 74 68 20 65 71 20 24 61 64 6d 69 6e 29 20 7c  ath eq $admin) |
1c60: 7c 0a 09 20 20 20 20 5b 73 74 72 69 6e 67 20 6d  |..    [string m
1c70: 61 74 63 68 20 24 61 64 6d 69 6e 2f 2a 20 24 70  atch $admin/* $p
1c80: 61 74 68 5d 0a 09 7d 20 7b 0a 09 20 20 20 20 73  ath]..} {..    s
1c90: 65 74 20 6d 73 67 20 22 41 64 6d 69 6e 69 73 74  et msg "Administ
1ca0: 72 61 74 69 76 65 20 73 75 62 64 69 72 65 63 74  rative subdirect
1cb0: 6f 72 79 20 24 70 61 74 68 20 63 61 6e 6e 6f 74  ory $path cannot
1cc0: 20 62 65 20 61 20 70 72 6f 6a 65 63 74 22 0a 09   be a project"..
1cd0: 20 20 20 20 72 65 74 75 72 6e 20 30 0a 09 7d 0a      return 0..}.
1ce0: 09 72 65 74 75 72 6e 20 31 0a 20 20 20 20 7d 0a  .return 1.    }.
1cf0: 0a 20 20 20 20 70 72 6f 63 20 54 68 65 50 72 6f  .    proc ThePro
1d00: 6a 65 63 74 73 20 7b 7d 20 7b 0a 09 75 70 76 61  jects {} {..upva
1d10: 72 20 31 20 74 79 70 65 20 74 79 70 65 0a 09 3a  r 1 type type..:
1d20: 3a 76 61 72 69 61 62 6c 65 20 6d 79 70 72 6f 6a  :variable myproj
1d30: 65 63 74 73 0a 09 3a 3a 76 61 72 69 61 62 6c 65  ects..::variable
1d40: 20 6d 79 70 72 6f 6a 70 61 74 68 73 0a 0a 09 69   myprojpaths...i
1d50: 66 20 7b 21 5b 6c 6c 65 6e 67 74 68 20 24 6d 79  f {![llength $my
1d60: 70 72 6f 6a 65 63 74 73 5d 7d 20 7b 0a 09 20 20  projects]} {..  
1d70: 20 20 73 65 74 20 6d 79 70 72 6f 6a 65 63 74 73    set myprojects
1d80: 20 5b 45 6d 70 74 79 50 72 6f 6a 65 63 74 73 20   [EmptyProjects 
1d90: 24 6d 79 70 72 6f 6a 70 61 74 68 73 5d 0a 09 7d  $myprojpaths]..}
1da0: 0a 09 72 65 74 75 72 6e 20 24 6d 79 70 72 6f 6a  ..return $myproj
1db0: 65 63 74 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20  ects.    }..    
1dc0: 70 72 6f 63 20 45 6d 70 74 79 50 72 6f 6a 65 63  proc EmptyProjec
1dd0: 74 73 20 7b 70 72 6f 6a 70 61 74 68 73 7d 20 7b  ts {projpaths} {
1de0: 0a 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 62  ..::variable myb
1df0: 61 73 65 0a 09 75 70 76 61 72 20 31 20 74 79 70  ase..upvar 1 typ
1e00: 65 20 74 79 70 65 0a 09 73 65 74 20 72 65 73 20  e type..set res 
1e10: 7b 7d 0a 09 69 66 20 7b 5b 6c 6c 65 6e 67 74 68  {}..if {[llength
1e20: 20 24 70 72 6f 6a 70 61 74 68 73 5d 7d 20 7b 0a   $projpaths]} {.
1e30: 09 20 20 20 20 66 6f 72 65 61 63 68 20 70 70 20  .    foreach pp 
1e40: 24 70 72 6f 6a 70 61 74 68 73 20 7b 0a 09 09 6c  $projpaths {...l
1e50: 61 70 70 65 6e 64 20 72 65 73 20 5b 70 72 6f 6a  append res [proj
1e60: 65 63 74 20 25 41 55 54 4f 25 20 24 70 70 20 24  ect %AUTO% $pp $
1e70: 74 79 70 65 5d 0a 09 20 20 20 20 7d 0a 09 7d 20  type]..    }..} 
1e80: 65 6c 73 65 20 7b 0a 09 20 20 20 20 23 20 42 61  else {..    # Ba
1e90: 73 65 20 69 73 20 74 68 65 20 73 69 6e 67 6c 65  se is the single
1ea0: 20 70 72 6f 6a 65 63 74 2e 0a 09 20 20 20 20 6c   project...    l
1eb0: 61 70 70 65 6e 64 20 72 65 73 20 5b 70 72 6f 6a  append res [proj
1ec0: 65 63 74 20 25 41 55 54 4f 25 20 22 22 20 24 74  ect %AUTO% "" $t
1ed0: 79 70 65 5d 0a 09 7d 0a 09 72 65 74 75 72 6e 20  ype]..}..return 
1ee0: 24 72 65 73 0a 20 20 20 20 7d 0a 0a 20 20 20 20  $res.    }..    
1ef0: 70 72 6f 63 20 53 61 76 65 41 75 74 68 6f 72 73  proc SaveAuthors
1f00: 20 7b 7d 20 7b 0a 09 3a 3a 76 61 72 69 61 62 6c   {} {..::variabl
1f10: 65 20 6d 79 61 75 74 68 6f 72 0a 09 66 6f 72 65  e myauthor..fore
1f20: 61 63 68 20 7b 6e 61 6d 65 20 61 69 64 7d 20 5b  ach {name aid} [
1f30: 61 72 72 61 79 20 67 65 74 20 6d 79 61 75 74 68  array get myauth
1f40: 6f 72 5d 20 7b 0a 09 20 20 20 20 73 74 61 74 65  or] {..    state
1f50: 20 72 75 6e 20 7b 0a 09 09 49 4e 53 45 52 54 20   run {...INSERT 
1f60: 49 4e 54 4f 20 61 75 74 68 6f 72 20 28 20 61 69  INTO author ( ai
1f70: 64 2c 20 20 6e 61 6d 65 29 0a 09 09 56 41 4c 55  d,  name)...VALU
1f80: 45 53 20 20 20 20 20 20 20 20 20 20 20 20 20 28  ES             (
1f90: 24 61 69 64 2c 20 24 6e 61 6d 65 29 3b 0a 09 20  $aid, $name);.. 
1fa0: 20 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72 6e 0a     }..}..return.
1fb0: 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f 63 20      }..    proc 
1fc0: 53 61 76 65 43 6f 6d 6d 69 74 4d 65 73 73 61 67  SaveCommitMessag
1fd0: 65 73 20 7b 7d 20 7b 0a 09 3a 3a 76 61 72 69 61  es {} {..::varia
1fe0: 62 6c 65 20 6d 79 63 6d 73 67 0a 09 66 6f 72 65  ble mycmsg..fore
1ff0: 61 63 68 20 7b 74 65 78 74 20 63 69 64 7d 20 5b  ach {text cid} [
2000: 61 72 72 61 79 20 67 65 74 20 6d 79 63 6d 73 67  array get mycmsg
2010: 5d 20 7b 0a 09 20 20 20 20 73 74 61 74 65 20 72  ] {..    state r
2020: 75 6e 20 7b 0a 09 09 49 4e 53 45 52 54 20 49 4e  un {...INSERT IN
2030: 54 4f 20 63 6d 65 73 73 61 67 65 20 28 20 63 69  TO cmessage ( ci
2040: 64 2c 20 20 74 65 78 74 29 0a 09 09 56 41 4c 55  d,  text)...VALU
2050: 45 53 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ES              
2060: 20 28 24 63 69 64 2c 20 24 74 65 78 74 29 3b 0a   ($cid, $text);.
2070: 09 20 20 20 20 7d 0a 09 7d 0a 09 72 65 74 75 72  .    }..}..retur
2080: 6e 0a 20 20 20 20 7d 0a 0a 20 20 20 20 70 72 6f  n.    }..    pro
2090: 63 20 53 61 76 65 4d 65 74 61 20 7b 7d 20 7b 0a  c SaveMeta {} {.
20a0: 09 3a 3a 76 61 72 69 61 62 6c 65 20 6d 79 6d 65  .::variable myme
20b0: 74 61 0a 09 66 6f 72 65 61 63 68 20 7b 6b 65 79  ta..foreach {key
20c0: 20 6d 69 64 7d 20 5b 61 72 72 61 79 20 67 65 74   mid} [array get
20d0: 20 6d 79 6d 65 74 61 5d 20 7b 0a 09 20 20 20 20   mymeta] {..    
20e0: 73 74 72 75 63 74 3a 3a 6c 69 73 74 20 61 73 73  struct::list ass
20f0: 69 67 6e 20 24 6b 65 79 20 70 69 64 20 62 69 64  ign $key pid bid
2100: 20 61 69 64 20 63 69 64 0a 09 20 20 20 20 69 66   aid cid..    if
2110: 20 7b 24 62 69 64 20 65 71 20 22 22 7d 20 7b 0a   {$bid eq ""} {.
2120: 09 09 23 20 54 72 75 6e 6b 2e 20 45 6e 63 6f 64  ..# Trunk. Encod
2130: 65 64 20 61 73 20 4e 55 4c 4c 2e 0a 09 09 73 74  ed as NULL....st
2140: 61 74 65 20 72 75 6e 20 7b 0a 09 09 20 20 20 20  ate run {...    
2150: 49 4e 53 45 52 54 20 49 4e 54 4f 20 6d 65 74 61  INSERT INTO meta
2160: 20 28 20 6d 69 64 2c 20 20 70 69 64 2c 20 20 62   ( mid,  pid,  b
2170: 69 64 2c 20 20 61 69 64 2c 20 20 63 69 64 29 0a  id,  aid,  cid).
2180: 09 09 20 20 20 20 56 41 4c 55 45 53 20 20 20 20  ..    VALUES    
2190: 20 20 20 20 20 20 20 28 24 6d 69 64 2c 20 24 70         ($mid, $p
21a0: 69 64 2c 20 4e 55 4c 4c 2c 20 24 61 69 64 2c 20  id, NULL, $aid, 
21b0: 24 63 69 64 29 3b 0a 09 09 7d 0a 09 20 20 20 20  $cid);...}..    
21c0: 7d 20 65 6c 73 65 20 7b 0a 09 09 73 74 61 74 65  } else {...state
21d0: 20 72 75 6e 20 7b 0a 09 09 20 20 20 20 49 4e 53   run {...    INS
21e0: 45 52 54 20 49 4e 54 4f 20 6d 65 74 61 20 28 20  ERT INTO meta ( 
21f0: 6d 69 64 2c 20 20 70 69 64 2c 20 20 62 69 64 2c  mid,  pid,  bid,
2200: 20 20 61 69 64 2c 20 20 63 69 64 29 0a 09 09 20    aid,  cid)... 
2210: 20 20 20 56 41 4c 55 45 53 20 20 20 20 20 20 20     VALUES       
2220: 20 20 20 20 28 24 6d 69 64 2c 20 24 70 69 64 2c      ($mid, $pid,
2230: 20 24 62 69 64 2c 20 24 61 69 64 2c 20 24 63 69   $bid, $aid, $ci
2240: 64 29 3b 0a 09 09 7d 0a 09 20 20 20 20 7d 0a 09  d);...}..    }..
2250: 7d 0a 09 72 65 74 75 72 6e 0a 20 20 20 20 7d 0a  }..return.    }.
2260: 0a 20 20 20 20 23 20 23 20 23 23 20 23 23 23 20  .    # # ## ### 
2270: 23 23 23 23 23 20 23 23 23 23 23 23 23 23 20 23  ##### ######## #
2280: 23 23 23 23 23 23 23 23 23 23 23 23 0a 20 20 20  ############.   
2290: 20 23 23 20 43 6f 6e 66 69 67 75 72 61 74 69 6f   ## Configuratio
22a0: 6e 0a 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68  n..    pragma -h
22b0: 61 73 69 6e 73 74 61 6e 63 65 73 20 20 20 6e 6f  asinstances   no
22c0: 20 3b 20 23 20 73 69 6e 67 6c 65 74 6f 6e 0a 20   ; # singleton. 
22d0: 20 20 20 70 72 61 67 6d 61 20 2d 68 61 73 74 79     pragma -hasty
22e0: 70 65 69 6e 66 6f 20 20 20 20 6e 6f 20 3b 20 23  peinfo    no ; #
22f0: 20 6e 6f 20 69 6e 74 72 6f 73 70 65 63 74 69 6f   no introspectio
2300: 6e 0a 20 20 20 20 70 72 61 67 6d 61 20 2d 68 61  n.    pragma -ha
2310: 73 74 79 70 65 64 65 73 74 72 6f 79 20 6e 6f 20  stypedestroy no 
2320: 3b 20 23 20 69 6d 6d 6f 72 74 61 6c 0a 0a 20 20  ; # immortal..  
2330: 20 20 23 20 23 20 23 23 20 23 23 23 20 23 23 23    # # ## ### ###
2340: 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23 23  ## ######## ####
2350: 23 23 23 23 23 23 23 23 23 0a 7d 0a 0a 6e 61 6d  #########.}..nam
2360: 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 76 63  espace eval ::vc
2370: 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74  ::fossil::import
2380: 3a 3a 63 76 73 20 7b 0a 20 20 20 20 6e 61 6d 65  ::cvs {.    name
2390: 73 70 61 63 65 20 65 78 70 6f 72 74 20 72 65 70  space export rep
23a0: 6f 73 69 74 6f 72 79 0a 20 20 20 20 6e 61 6d 65  ository.    name
23b0: 73 70 61 63 65 20 65 76 61 6c 20 72 65 70 6f 73  space eval repos
23c0: 69 74 6f 72 79 20 7b 0a 09 6e 61 6d 65 73 70 61  itory {..namespa
23d0: 63 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a  ce import ::vc::
23e0: 66 6f 73 73 69 6c 3a 3a 69 6d 70 6f 72 74 3a 3a  fossil::import::
23f0: 63 76 73 3a 3a 70 72 6f 6a 65 63 74 0a 09 6e 61  cvs::project..na
2400: 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20 3a  mespace import :
2410: 3a 76 63 3a 3a 66 6f 73 73 69 6c 3a 3a 69 6d 70  :vc::fossil::imp
2420: 6f 72 74 3a 3a 63 76 73 3a 3a 73 74 61 74 65 0a  ort::cvs::state.
2430: 09 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72  .namespace impor
2440: 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6d  t ::vc::tools::m
2450: 69 73 63 3a 3a 2a 0a 09 6e 61 6d 65 73 70 61 63  isc::*..namespac
2460: 65 20 69 6d 70 6f 72 74 20 3a 3a 76 63 3a 3a 74  e import ::vc::t
2470: 6f 6f 6c 73 3a 3a 74 72 6f 75 62 6c 65 0a 09 6e  ools::trouble..n
2480: 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74 20  amespace import 
2490: 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f 67  ::vc::tools::log
24a0: 0a 09 6c 6f 67 20 72 65 67 69 73 74 65 72 20 72  ..log register r
24b0: 65 70 6f 73 69 74 6f 72 79 0a 20 20 20 20 7d 0a  epository.    }.
24c0: 7d 0a 0a 23 20 23 20 23 23 20 23 23 23 20 23 23  }..# # ## ### ##
24d0: 23 23 23 20 23 23 23 23 23 23 23 23 20 23 23 23  ### ######## ###
24e0: 23 23 23 23 23 23 23 23 23 23 20 23 23 23 23 23  ########## #####
24f0: 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23 23  ################
2500: 0a 23 23 20 52 65 61 64 79 0a 0a 72 65 74 75 72  .## Ready..retur
2510: 6e 0a                                            n.