Hex Artifact Content
Not logged in

Artifact 24c1271ded974ae38a3a44d55b84c1b9db27ffa5:

File tools/lib/cvs_files.tcl part of check-in [1593006ef3] - More structuring of the CVS backend, encapsulated the management of the global timeline of events in the project in a separate package. by aku on 2007-09-17 03:03:25.

0000: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  # --------------
0010: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0020: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0030: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0040: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0050: 23 20 52 65 70 6f 73 69 74 6f 72 79 20 6d 61 6e  # Repository man
0060: 61 67 65 6d 65 6e 74 20 28 43 56 53 29 2c 20 61  agement (CVS), a
0070: 72 63 68 69 76 65 20 66 69 6c 65 73 0a 0a 23 20  rchive files..# 
0080: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0090: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
00c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20  -------------.# 
00d0: 52 65 71 75 69 72 65 6d 65 6e 74 73 0a 0a 70 61  Requirements..pa
00e0: 63 6b 61 67 65 20 72 65 71 75 69 72 65 20 54 63  ckage require Tc
00f0: 6c 20 38 2e 34 0a 70 61 63 6b 61 67 65 20 72 65  l 8.4.package re
0100: 71 75 69 72 65 20 66 69 6c 65 75 74 69 6c 3a 3a  quire fileutil::
0110: 74 72 61 76 65 72 73 65 20 3b 20 23 20 54 63 6c  traverse ; # Tcl
0120: 6c 69 62 20 28 74 72 61 76 65 72 73 65 20 64 69  lib (traverse di
0130: 72 65 63 74 6f 72 79 20 68 69 65 72 61 72 63 68  rectory hierarch
0140: 79 29 0a 70 61 63 6b 61 67 65 20 72 65 71 75 69  y).package requi
0150: 72 65 20 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f  re vc::tools::lo
0160: 67 20 20 20 20 20 3b 20 23 20 55 73 65 72 20 66  g     ; # User f
0170: 65 65 64 62 61 63 6b 0a 0a 6e 61 6d 65 73 70 61  eedback..namespa
0180: 63 65 20 65 76 61 6c 20 3a 3a 76 63 3a 3a 63 76  ce eval ::vc::cv
0190: 73 3a 3a 77 73 3a 3a 66 69 6c 65 73 20 7b 0a 20  s::ws::files {. 
01a0: 20 20 20 6e 61 6d 65 73 70 61 63 65 20 69 6d 70     namespace imp
01b0: 6f 72 74 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a  ort ::vc::tools:
01c0: 3a 6c 6f 67 3a 3a 77 72 69 74 65 0a 20 20 20 20  :log::write.    
01d0: 6e 61 6d 65 73 70 61 63 65 20 69 6d 70 6f 72 74  namespace import
01e0: 20 3a 3a 76 63 3a 3a 74 6f 6f 6c 73 3a 3a 6c 6f   ::vc::tools::lo
01f0: 67 3a 3a 70 72 6f 67 72 65 73 73 0a 7d 0a 0a 23  g::progress.}..#
0200: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
0210: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0220: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0230: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0240: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
0250: 20 41 50 49 0a 0a 23 20 76 63 3a 3a 63 76 73 3a   API..# vc::cvs:
0260: 3a 77 73 3a 3a 66 69 6c 65 73 3a 3a 66 69 6e 64  :ws::files::find
0270: 20 70 61 74 68 20 2d 20 46 69 6e 64 20 61 6c 6c   path - Find all
0280: 20 52 43 53 20 61 72 63 68 69 76 65 73 20 75 6e   RCS archives un
0290: 64 65 72 20 74 68 65 20 70 61 74 68 2e 0a 0a 23  der the path...#
02a0: 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d   ---------------
02b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
02e0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23  --------------.#
02f0: 20 41 50 49 20 49 6d 70 6c 65 6d 65 6e 74 61 74   API Implementat
0300: 69 6f 6e 0a 0a 70 72 6f 63 20 3a 3a 76 63 3a 3a  ion..proc ::vc::
0310: 63 76 73 3a 3a 77 73 3a 3a 66 69 6c 65 73 3a 3a  cvs::ws::files::
0320: 66 69 6e 64 20 7b 70 61 74 68 7d 20 7b 0a 0a 20  find {path} {.. 
0330: 20 20 20 77 72 69 74 65 20 30 20 63 76 73 20 22     write 0 cvs "
0340: 53 63 61 6e 6e 69 6e 67 20 64 69 72 65 63 74 6f  Scanning directo
0350: 72 79 20 68 69 65 72 61 72 63 68 79 20 24 70 61  ry hierarchy $pa
0360: 74 68 20 2e 2e 2e 22 0a 0a 20 20 20 20 73 65 74  th ..."..    set
0370: 20 74 20 5b 66 69 6c 65 75 74 69 6c 3a 3a 74 72   t [fileutil::tr
0380: 61 76 65 72 73 65 20 25 41 55 54 4f 25 20 24 70  averse %AUTO% $p
0390: 61 74 68 5d 0a 20 20 20 20 73 65 74 20 6e 20 30  ath].    set n 0
03a0: 0a 20 20 20 20 73 65 74 20 72 20 7b 7d 0a 0a 20  .    set r {}.. 
03b0: 20 20 20 24 74 20 66 6f 72 65 61 63 68 20 72 63     $t foreach rc
03c0: 73 20 7b 0a 09 69 66 20 7b 21 5b 73 74 72 69 6e  s {..if {![strin
03d0: 67 20 6d 61 74 63 68 20 2a 2c 76 20 24 72 63 73  g match *,v $rcs
03e0: 5d 7d 20 63 6f 6e 74 69 6e 75 65 0a 0a 09 23 20  ]} continue...# 
03f0: 4e 6f 77 20 6d 61 6b 65 20 72 63 73 20 69 73 20  Now make rcs is 
0400: 72 65 6c 61 74 69 76 65 20 74 6f 20 74 68 65 20  relative to the 
0410: 62 61 73 65 2f 70 72 6f 6a 65 63 74 0a 09 73 65  base/project..se
0420: 74 20 72 63 73 20 5b 66 69 6c 65 75 74 69 6c 3a  t rcs [fileutil:
0430: 3a 73 74 72 69 70 50 61 74 68 20 24 70 61 74 68  :stripPath $path
0440: 20 24 72 63 73 5d 0a 0a 09 69 66 20 7b 5b 73 74   $rcs]...if {[st
0450: 72 69 6e 67 20 6d 61 74 63 68 20 43 56 53 52 4f  ring match CVSRO
0460: 4f 54 2f 2a 20 24 72 63 73 5d 7d 20 7b 0a 09 20  OT/* $rcs]} {.. 
0470: 20 20 20 77 72 69 74 65 20 32 20 63 76 73 20 22     write 2 cvs "
0480: 49 67 6e 6f 72 69 6e 67 20 61 64 6d 69 6e 69 73  Ignoring adminis
0490: 74 72 61 74 69 76 65 20 66 69 6c 65 3a 20 24 72  trative file: $r
04a0: 63 73 22 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75  cs"..    continu
04b0: 65 0a 09 7d 0a 0a 09 73 65 74 20 66 20 5b 55 73  e..}...set f [Us
04c0: 65 72 46 69 6c 65 20 24 72 63 73 20 69 73 61 74  erFile $rcs isat
04d0: 74 69 63 5d 0a 0a 09 69 66 20 7b 24 69 73 61 74  tic]...if {$isat
04e0: 74 69 63 20 26 26 20 5b 66 69 6c 65 20 65 78 69  tic && [file exi
04f0: 73 74 73 20 24 70 61 74 68 2f 24 66 2c 76 5d 7d  sts $path/$f,v]}
0500: 20 7b 0a 09 20 20 20 20 23 20 57 65 20 68 61 76   {..    # We hav
0510: 65 20 61 20 72 65 67 75 6c 61 72 20 61 72 63 68  e a regular arch
0520: 69 76 65 20 61 6e 64 20 61 6e 20 41 74 74 69 63  ive and an Attic
0530: 20 61 72 63 68 69 76 65 20 72 65 66 65 72 69 6e   archive referin
0540: 67 0a 09 20 20 20 20 23 20 74 6f 20 74 68 65 20  g..    # to the 
0550: 73 61 6d 65 20 75 73 65 72 20 76 69 73 69 62 6c  same user visibl
0560: 65 20 66 69 6c 65 2e 20 49 67 6e 6f 72 65 20 74  e file. Ignore t
0570: 68 65 20 66 69 6c 65 20 69 6e 20 74 68 65 0a 09  he file in the..
0580: 20 20 20 20 23 20 41 74 74 69 63 2e 0a 0a 09 20      # Attic.... 
0590: 20 20 20 77 72 69 74 65 20 32 20 63 76 73 20 22     write 2 cvs "
05a0: 49 67 6e 6f 72 69 6e 67 20 73 75 70 65 72 63 65  Ignoring superce
05b0: 64 65 64 20 61 74 74 69 63 3a 20 20 20 20 24 72  ded attic:    $r
05c0: 63 73 22 0a 0a 09 20 20 20 20 23 20 54 4f 44 4f  cs"...    # TODO
05d0: 2f 43 48 45 43 4b 2e 20 4d 79 20 6d 65 74 68 6f  /CHECK. My metho
05e0: 64 20 6f 66 20 63 6f 27 69 6e 67 20 65 78 61 63  d of co'ing exac
05f0: 74 20 66 69 6c 65 20 72 65 76 69 73 69 6f 6e 73  t file revisions
0600: 20 70 65 72 0a 09 20 20 20 20 23 20 74 68 65 20   per..    # the 
0610: 69 6e 66 6f 20 69 6e 20 74 68 65 20 63 6f 6c 6c  info in the coll
0620: 65 63 74 65 64 20 63 73 65 74 73 20 68 61 73 20  ected csets has 
0630: 74 68 65 20 66 6c 61 77 20 74 68 61 74 20 49 20  the flaw that I 
0640: 6d 61 79 0a 09 20 20 20 20 23 20 68 61 76 65 20  may..    # have 
0650: 74 6f 20 6b 6e 6f 77 20 65 78 61 63 74 6c 79 20  to know exactly 
0660: 77 68 65 6e 20 77 68 61 74 20 61 72 63 68 69 76  when what archiv
0670: 65 20 66 69 6c 65 20 74 6f 20 75 73 65 2c 20 73  e file to use, s
0680: 65 65 0a 09 20 20 20 20 23 20 61 62 6f 76 65 2e  ee..    # above.
0690: 20 49 74 20 6d 69 67 68 74 20 62 65 20 62 65 74   It might be bet
06a0: 74 65 72 20 74 6f 20 75 73 65 20 74 68 65 20 69  ter to use the i
06b0: 6e 66 6f 20 6f 6e 6c 79 20 74 6f 20 67 61 74 68  nfo only to gath
06c0: 65 72 0a 09 20 20 20 20 23 20 77 68 65 6e 20 63  er..    # when c
06d0: 73 65 74 73 20 62 65 67 69 6e 20 61 6e 64 20 65  sets begin and e
06e0: 6e 64 2c 20 61 6e 64 20 74 68 65 6e 20 74 6f 20  nd, and then to 
06f0: 63 6f 20 63 6f 6d 70 6c 65 74 65 20 73 6c 69 63  co complete slic
0700: 65 73 0a 09 20 20 20 20 23 20 70 65 72 20 65 78  es..    # per ex
0710: 61 63 74 20 74 69 6d 65 73 74 61 6d 70 20 28 2d  act timestamp (-
0720: 44 29 20 69 6e 73 74 65 61 64 20 6f 66 20 66 69  D) instead of fi
0730: 6c 65 20 72 65 76 69 73 69 6f 6e 73 0a 09 20 20  le revisions..  
0740: 20 20 23 20 28 2d 72 29 2e 20 54 68 65 20 66 6c    # (-r). The fl
0750: 61 77 20 69 6e 20 74 68 61 74 20 69 73 20 74 68  aw in that is th
0760: 61 74 20 63 73 65 74 73 20 63 61 6e 20 6f 63 63  at csets can occ
0770: 75 72 20 69 6e 20 74 68 65 0a 09 20 20 20 20 23  ur in the..    #
0780: 20 73 61 6d 65 20 73 65 63 6f 6e 64 20 28 74 72   same second (tr
0790: 66 2c 20 6d 65 6d 63 68 61 6e 20 2d 20 63 68 65  f, memchan - che
07a0: 63 6b 20 66 6f 72 20 65 78 61 6d 70 6c 65 73 29  ck for examples)
07b0: 2e 20 46 6f 72 0a 09 20 20 20 20 23 20 74 68 61  . For..    # tha
07c0: 74 20 65 78 61 63 74 20 63 68 65 63 6b 6f 75 74  t exact checkout
07d0: 20 6d 61 79 20 62 65 20 6e 65 65 64 65 64 20 74   may be needed t
07e0: 6f 20 72 65 63 72 65 61 74 65 20 65 78 61 63 74  o recreate exact
07f0: 0a 09 20 20 20 20 23 20 73 65 71 75 65 6e 63 65  ..    # sequence
0800: 20 6f 66 20 63 68 61 6e 67 65 73 2e 20 47 72 72   of changes. Grr
0810: 2e 20 53 69 78 20 6f 66 20 6f 6e 65 20 2e 2e 2e  . Six of one ...
0820: 0a 0a 09 20 20 20 20 63 6f 6e 74 69 6e 75 65 0a  ...    continue.
0830: 09 7d 0a 0a 09 6c 61 70 70 65 6e 64 20 72 20 24  .}...lappend r $
0840: 72 63 73 20 24 66 0a 09 69 6e 63 72 20 6e 0a 09  rcs $f..incr n..
0850: 70 72 6f 67 72 65 73 73 20 30 20 63 76 73 20 24  progress 0 cvs $
0860: 6e 20 7b 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20  n {}.    }..    
0870: 24 74 20 64 65 73 74 72 6f 79 0a 20 20 20 20 72  $t destroy.    r
0880: 65 74 75 72 6e 20 24 72 0a 7d 0a 0a 23 20 2d 2d  eturn $r.}..# --
0890: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08a0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08b0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08c0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
08d0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 23 20 49 6e  -----------.# In
08e0: 74 65 72 6e 61 6c 73 0a 0a 70 72 6f 63 20 3a 3a  ternals..proc ::
08f0: 76 63 3a 3a 63 76 73 3a 3a 77 73 3a 3a 66 69 6c  vc::cvs::ws::fil
0900: 65 73 3a 3a 55 73 65 72 46 69 6c 65 20 7b 72 63  es::UserFile {rc
0910: 73 20 69 61 76 7d 20 7b 0a 20 20 20 20 75 70 76  s iav} {.    upv
0920: 61 72 20 31 20 24 69 61 76 20 69 73 61 74 74 69  ar 1 $iav isatti
0930: 63 0a 0a 20 20 20 20 23 20 44 65 72 69 76 65 20  c..    # Derive 
0940: 74 68 65 20 72 65 67 75 6c 61 72 20 70 61 74 68  the regular path
0950: 20 66 72 6f 6d 20 74 68 65 20 72 63 73 20 70 61   from the rcs pa
0960: 74 68 2e 20 4d 65 61 6e 69 6e 67 3a 20 43 68 6f  th. Meaning: Cho
0970: 70 20 6f 66 20 74 68 65 0a 20 20 20 20 23 20 22  p of the.    # "
0980: 2c 76 22 20 73 75 66 66 69 78 2c 20 61 6e 64 20  ,v" suffix, and 
0990: 72 65 6d 6f 76 65 20 61 20 70 6f 73 73 69 62 6c  remove a possibl
09a0: 65 20 22 41 74 74 69 63 22 2e 0a 0a 20 20 20 20  e "Attic"...    
09b0: 73 65 74 20 66 20 5b 73 74 72 69 6e 67 20 72 61  set f [string ra
09c0: 6e 67 65 20 24 72 63 73 20 30 20 65 6e 64 2d 32  nge $rcs 0 end-2
09d0: 5d 0a 0a 20 20 20 20 69 66 20 7b 22 41 74 74 69  ]..    if {"Atti
09e0: 63 22 20 65 71 20 5b 6c 69 6e 64 65 78 20 5b 66  c" eq [lindex [f
09f0: 69 6c 65 20 73 70 6c 69 74 20 24 72 63 73 5d 20  ile split $rcs] 
0a00: 65 6e 64 2d 31 5d 7d 20 7b 0a 0a 09 23 20 54 68  end-1]} {...# Th
0a10: 65 20 63 6f 6e 73 74 72 75 63 74 69 6f 6e 20 62  e construction b
0a20: 65 6c 6f 77 20 65 6e 73 75 72 65 73 20 74 68 61  elow ensures tha
0a30: 74 20 41 74 74 69 63 2f 58 20 6d 61 70 73 20 74  t Attic/X maps t
0a40: 6f 20 58 0a 09 23 20 69 6e 73 74 65 61 64 20 6f  o X..# instead o
0a50: 66 20 2e 2f 58 2e 20 4f 74 68 65 72 77 69 73 65  f ./X. Otherwise
0a60: 2c 20 59 2f 41 74 74 69 63 2f 58 20 6d 61 70 73  , Y/Attic/X maps
0a70: 20 74 6f 20 59 2f 58 2e 0a 0a 09 73 65 74 20 66   to Y/X....set f
0a80: 78 20 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20  x [file dirname 
0a90: 5b 66 69 6c 65 20 64 69 72 6e 61 6d 65 20 24 66  [file dirname $f
0aa0: 5d 5d 0a 09 73 65 74 20 66 20 20 5b 66 69 6c 65  ]]..set f  [file
0ab0: 20 74 61 69 6c 20 24 66 5d 0a 09 69 66 20 7b 24   tail $f]..if {$
0ac0: 66 78 20 6e 65 20 22 2e 22 7d 20 7b 20 73 65 74  fx ne "."} { set
0ad0: 20 66 20 5b 66 69 6c 65 20 6a 6f 69 6e 20 24 66   f [file join $f
0ae0: 78 20 24 66 5d 20 7d 0a 0a 09 73 65 74 20 69 73  x $f] }...set is
0af0: 61 74 74 69 63 20 31 0a 20 20 20 20 7d 20 65 6c  attic 1.    } el
0b00: 73 65 20 7b 0a 09 73 65 74 20 69 73 61 74 74 69  se {..set isatti
0b10: 63 20 30 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72  c 0.    }..    r
0b20: 65 74 75 72 6e 20 24 66 0a 7d 0a 0a 23 20 2d 2d  eturn $f.}..# --
0b30: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b40: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b50: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b60: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0b70: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 0a 6e 61 6d  -----------..nam
0b80: 65 73 70 61 63 65 20 65 76 61 6c 20 3a 3a 76 63  espace eval ::vc
0b90: 3a 3a 63 76 73 3a 3a 77 73 3a 3a 66 69 6c 65 73  ::cvs::ws::files
0ba0: 20 7b 0a 20 20 20 20 6e 61 6d 65 73 70 61 63 65   {.    namespace
0bb0: 20 65 78 70 6f 72 74 20 66 69 6e 64 0a 7d 0a 0a   export find.}..
0bc0: 23 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  # --------------
0bd0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0be0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0bf0: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d  ----------------
0c00: 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a  ---------------.
0c10: 23 20 52 65 61 64 79 0a 0a 70 61 63 6b 61 67 65  # Ready..package
0c20: 20 70 72 6f 76 69 64 65 20 76 63 3a 3a 63 76 73   provide vc::cvs
0c30: 3a 3a 77 73 3a 3a 66 69 6c 65 73 20 31 2e 30 0a  ::ws::files 1.0.
0c40: 72 65 74 75 72 6e 0a                             return.