@@ -13,30 +13,168 @@
13 13 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
## Repository manager. Keeps projects and their files around.
14 14 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
15 15 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# # ## ### ##### ######## ############# #####################
16 16 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
## Requirements
17 17 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- package require Tcl 8.4 ; # Required runtime.
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- package require snit ; # OO system.
18 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ package require Tcl 8.4 ; # Required runtime.
19 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ package require snit ; # OO system.
20 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ package require vc::tools::trouble ; # Error reporting.
21 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ package require vc::tools::log ; # User feedback.
22 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ package require vc::tools::misc ; # Text formatting
23 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ package require vc::fossil::import::cvs::project ; # CVS projects
24 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ package require struct::list ; # List operations.
20 25 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
21 26 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# # ## ### ##### ######## ############# #####################
22 27 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
##
23 28 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
24 29 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
snit::type ::vc::fossil::import::cvs::repository {
25 30 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# # ## ### ##### ######## #############
26 31 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
## Public API
27 32 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
28 33 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typemethod base {path} {
34 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Could be checked, easier to defer to the overall validation.
35 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set mybase $path
36 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
29 37 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
30 38 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
31 39 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typemethod add {path} {
40 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Cannot be checked immediately, the base is not known while
41 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # projects are added.
42 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lappend myprojpaths $path
43 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
32 44 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
33 45 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
34 46 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typemethod projects {} {
47 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # TODO: Loading from the state database if CollAr is skipped
48 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # in a run.
49 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
50 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return [TheProjects]
35 51 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
52 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typemethod base? {} { return $mybase }
36 54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
37 55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
typemethod validate {} {
56 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {![IsRepositoryBase $mybase msg]} {
57 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ trouble fatal $msg
58 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Without a good base directory checking any projects is
59 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # wasted time, so we leave now.
60 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
61 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
62 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach pp $myprojpaths {
63 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {![IsProjectBase $mybase/$pp $mybase/CVSROOT msg]} {
64 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ trouble fatal $msg
65 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
66 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
67 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
68 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
69 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
70 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typemethod printstatistics {} {
71 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set prlist [TheProjects]
72 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set npr [llength $prlist]
73 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
74 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 2 repository "Scanned [nsp $npr project]"
75 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
76 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {$npr > 1} {
77 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set bmax [max [struct::list map $prlist [myproc .BaseLength]]]
78 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ incr bmax 2
79 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set bfmt %-${bmax}s
80 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
81 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set nmax [max [struct::list map $prlist [myproc .NFileLength]]]
82 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set nfmt %${nmax}s
83 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } else {
84 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set bfmt %s
85 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set nfmt %s
86 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
87 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
88 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set keep {}
89 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach p $prlist {
90 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set nfiles [llength [$p files]]
91 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set line "Project [format $bfmt \"[$p printbase]\"] : [format $nfmt $nfiles] [sp $nfiles file]"
92 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {$nfiles < 1} {
93 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ append line ", dropped"
94 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } else {
95 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lappend keep $p
96 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
97 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 2 repository $line
98 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
99 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
100 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {![llength $keep]} {
101 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ trouble warn "Dropped all projects"
102 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } elseif {$npr == [llength $keep]} {
103 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 2 repository "Keeping all projects"
104 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } else {
105 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log write 2 repository "Keeping [nsp [llength $keep] project]"
106 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ trouble warn "Dropped [nsp [expr {$npr - [llength $keep]}] {empty project}]"
107 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
108 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
109 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Keep reduced set of projects.
110 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set projects $keep
111 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return
112 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
113 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
114 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typemethod persist {} {
115 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
116 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
117 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # # ## ### ##### ######## #############
118 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## State
119 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
120 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typevariable mybase {}
121 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typevariable myprojpaths {}
122 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ typevariable myprojects {}
123 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
124 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # # ## ### ##### ######## #############
125 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ## Internal methods
126 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
127 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc .BaseLength {p} {
128 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return [string length [$p printbase]]
129 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
130 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
131 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc .NFileLength {p} {
132 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return [string length [llength [$p files]]]
133 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
134 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
135 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc IsRepositoryBase {path mv} {
136 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ upvar 1 $mv msg mybase mybase
137 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {![fileutil::test $mybase edr msg {CVS Repository}]} {return 0}
138 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {![fileutil::test $mybase/CVSROOT edr msg {CVS Admin Directory}]} {return 0}
139 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1
140 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
141 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
142 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc IsProjectBase {path admin mv} {
143 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ upvar 1 $mv msg
144 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {![fileutil::test $path edr msg Project]} {return 0}
145 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {
146 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ ($path eq $admin) ||
147 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ [string match $admin/* $path]
148 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } {
149 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set msg "Administrative subdirectory $path cannot be a project"
150 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 0
151 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
152 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return 1
153 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
154 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
155 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc TheProjects {} {
156 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ upvar 1 myprojects myprojects myprojpaths myprojpaths mybase mybase
157 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
158 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {![llength $myprojects]} {
159 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set myprojects [EmptyProjects $myprojpaths]
160 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
161 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return $myprojects
162 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
163 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+
164 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ proc EmptyProjects {projpaths} {
165 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ upvar 1 mybase mybase
166 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ set res {}
167 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ if {[llength $projpaths]} {
168 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ foreach pp $projpaths {
169 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lappend res [project %AUTO% $pp]
170 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
171 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ } else {
172 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ # Base is the single project.
173 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ lappend res [project %AUTO% ""]
174 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ }
175 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ return $res
38 176 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
39 177 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
40 178 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# # ## ### ##### ######## #############
41 179 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
## Configuration
42 180 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
@@ -48,16 +186,18 @@
48 186 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
49 187 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
50 188 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
namespace eval ::vc::fossil::import::cvs {
51 189 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
namespace export repository
52 190 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
namespace eval repository {
53 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #namespace import ::vc::tools::trouble
54 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #namespace import ::vc::tools::log
55 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
- #log register collar
191 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ namespace import ::vc::fossil::import::cvs::project
192 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ namespace import ::vc::tools::trouble
193 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ namespace import ::vc::tools::log
194 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ namespace import ::vc::tools::misc::*
195 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
+ log register repository
56 196 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
57 197 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
}
58 198 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
59 199 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
# # ## ### ##### ######## ############# #####################
60 200 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
## Ready
61 201 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
62 202 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
package provide vc::fossil::import::cvs::repository 1.0
63 203 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!
return
64 204 { copied = false; pop = false }, 1000)" :class="copied && 'copied'">Copy link Copied!