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.