/[gentoo-x86]/eclass/subversion.eclass
Gentoo

Contents of /eclass/subversion.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.54 - (hide annotations) (download)
Thu Feb 21 16:01:53 2008 UTC (6 years, 6 months ago) by zlin
Branch: MAIN
Changes since 1.53: +4 -4 lines
Move use of ESVN_REPO_URI to public functions only. Patch kindly provided by Doug Klima (Cardoe).

1 hattya 1.45 # Copyright 1999-2008 Gentoo Foundation
2 hattya 1.1 # Distributed under the terms of the GNU General Public License v2
3 zlin 1.54 # $Header: /var/cvsroot/gentoo-x86/eclass/subversion.eclass,v 1.53 2008/02/21 13:38:36 zlin Exp $
4 hattya 1.1
5 zlin 1.46 # @ECLASS: subversion.eclass
6     # @MAINTAINER:
7     # Akinori Hattori <hattya@gentoo.org>
8     # Bo ├śrsted Andresen <zlin@gentoo.org>
9 swegener 1.23 #
10 zlin 1.46 # Original Author: Akinori Hattori <hattya@gentoo.org>
11 hattya 1.1 #
12 zlin 1.46 # @BLURB: The subversion eclass is written to fetch software sources from subversion repositories
13     # @DESCRIPTION:
14     # The subversion eclass provides functions to fetch, patch and bootstrap
15     # software sources from subversion repositories.
16 hattya 1.1
17 hattya 1.8 inherit eutils
18 hattya 1.1
19 zlin 1.46 ESVN="${ECLASS}"
20 hattya 1.1
21 zlin 1.50 EXPORT_FUNCTIONS src_unpack pkg_preinst
22 hattya 1.1
23 hattya 1.5 DESCRIPTION="Based on the ${ECLASS} eclass"
24 hattya 1.1
25 zlin 1.46 DEPEND="dev-util/subversion
26     net-misc/rsync"
27 hattya 1.1
28 zlin 1.46 # @ECLASS-VARIABLE: ESVN_STORE_DIR
29     # @DESCRIPTION:
30     # subversion sources store directory. Users may override this in /etc/make.conf
31     [[ -z ${ESVN_STORE_DIR} ]] && ESVN_STORE_DIR="${PORTAGE_ACTUAL_DISTDIR:-${DISTDIR}}/svn-src"
32    
33     # @ECLASS-VARIABLE: ESVN_FETCH_CMD
34     # @DESCRIPTION:
35     # subversion checkout command
36 hattya 1.25 ESVN_FETCH_CMD="svn checkout"
37    
38 zlin 1.46 # @ECLASS-VARIABLE: ESVN_UPDATE_CMD
39     # @DESCRIPTION:
40     # subversion update command
41 hattya 1.25 ESVN_UPDATE_CMD="svn update"
42 hattya 1.1
43 cardoe 1.48 # @ECLASS-VARIABLE: ESVN_SWITCH_CMD
44     # @DESCRIPTION:
45     # subversion switch command
46     ESVN_SWITCH_CMD="svn switch"
47    
48 zlin 1.46 # @ECLASS-VARIABLE: ESVN_OPTIONS
49     # @DESCRIPTION:
50     # the options passed to checkout or update. If you want a specific revision see
51     # ESVN_REPO_URI instead of using -rREV.
52     ESVN_OPTIONS="${ESVN_OPTIONS:-}"
53    
54     # @ECLASS-VARIABLE: ESVN_REPO_URI
55     # @DESCRIPTION:
56     # repository uri
57 hattya 1.1 #
58 zlin 1.46 # e.g. http://foo/trunk, svn://bar/trunk, svn://bar/branch/foo@1234
59 hattya 1.12 #
60     # supported protocols:
61     # http://
62     # https://
63     # svn://
64 hattya 1.33 # svn+ssh://
65 hattya 1.1 #
66 zlin 1.46 # to peg to a specific revision, append @REV to the repo's uri
67     ESVN_REPO_URI="${ESVN_REPO_URI:-}"
68 hattya 1.1
69 cardoe 1.47 # @ECLASS-VARIABLE: ESVN_REVISION
70     # @DESCRIPTION:
71     # User configurable revision checkout or update to from the repository
72     #
73     # Useful for live svn or trunk svn ebuilds allowing the user to peg
74     # to a specific revision
75     #
76     # Note: This should never be set in an ebuild!
77     ESVN_REVISION="${ESVN_REVISION:-}"
78    
79 zlin 1.46 # @ECLASS-VARIABLE: ESVN_PROJECT
80     # @DESCRIPTION:
81     # project name of your ebuild (= name space)
82 hattya 1.1 #
83     # subversion eclass will check out the subversion repository like:
84     #
85     # ${ESVN_STORE_DIR}/${ESVN_PROJECT}/${ESVN_REPO_URI##*/}
86     #
87     # so if you define ESVN_REPO_URI as http://svn.collab.net/repo/svn/trunk or
88     # http://svn.collab.net/repo/svn/trunk/. and PN is subversion-svn.
89     # it will check out like:
90     #
91     # ${ESVN_STORE_DIR}/subversion/trunk
92     #
93 hattya 1.33 # this is not used in order to declare the name of the upstream project.
94     # so that you can declare this like:
95     #
96     # # jakarta commons-loggin
97     # ESVN_PROJECT=commons/logging
98     #
99 hattya 1.1 # default: ${PN/-svn}.
100 zlin 1.46 ESVN_PROJECT="${ESVN_PROJECT:-${PN/-svn}}"
101 hattya 1.1
102 zlin 1.46 # @ECLASS-VARIABLE: ESVN_BOOTSTRAP
103     # @DESCRIPTION:
104 hattya 1.8 # bootstrap script or command like autogen.sh or etc..
105 zlin 1.46 ESVN_BOOTSTRAP="${ESVN_BOOTSTRAP:-}"
106 hattya 1.1
107 zlin 1.46 # @ECLASS-VARIABLE: ESVN_PATCHES
108     # @DESCRIPTION:
109     # subversion eclass can apply patches in subversion_bootstrap().
110 peper 1.43 # you can use regexp in this variable like *.diff or *.patch or etc.
111     # NOTE: patches will be applied before ESVN_BOOTSTRAP is processed.
112 hattya 1.8 #
113 zlin 1.46 # Patches are searched both in ${PWD} and ${FILESDIR}, if not found in either
114     # location, the installation dies.
115     ESVN_PATCHES="${ESVN_PATCHES:-}"
116 hattya 1.33
117 zlin 1.46 # @ECLASS-VARIABLE: ESVN_RESTRICT
118     # @DESCRIPTION:
119 hattya 1.39 # this should be a space delimited list of subversion eclass features to
120     # restrict.
121 hattya 1.33 # export)
122     # don't export the working copy to S.
123 zlin 1.46 ESVN_RESTRICT="${ESVN_RESTRICT:-}"
124 hattya 1.45
125 zlin 1.49 # @ECLASS-VARIABLE: ESVN_OFFLINE
126     # @DESCRIPTION:
127     # Set this variable to a non-empty value to disable the automatic updating of
128     # an svn source tree. This is intended to be set outside the subversion source
129     # tree by users.
130     ESVN_OFFLINE="${ESVN_OFFLINE:-${ESCM_OFFLINE}}"
131    
132 zlin 1.52 # @ECLASS-VARIABLE: ESVN_UP_FREQ
133     # @DESCRIPTION:
134     # Set the minimum number of hours between svn up'ing in any given svn module. This is particularly
135     # useful for split KDE ebuilds where we want to ensure that all submodules are compiled for the same
136     # revision. It should also be kept user overrideable.
137     ESVN_UP_FREQ="${ESVN_UP_FREQ:=}"
138    
139 zlin 1.50 # @ECLASS-VARIABLE: ESCM_LOGDIR
140     # @DESCRIPTION:
141     # User configuration variable. If set to a path such as e.g. /var/log/scm any
142     # package inheriting from subversion.eclass will record svn revision to
143     # ${CATEGORY}/${PN}.log in that path in pkg_preinst. This is not supposed to be
144     # set by ebuilds/eclasses. It defaults to empty so users need to opt in.
145     ESCM_LOGDIR="${ESCM_LOGDIR:=}"
146    
147 zlin 1.46 # @FUNCTION: subversion_fetch
148     # @USAGE: [repo_uri] [destination]
149     # @DESCRIPTION:
150     # Wrapper function to fetch sources from subversion via svn checkout or svn update,
151     # depending on whether there is an existing working copy in ${ESVN_STORE_DIR}.
152     #
153     # Can take two optional parameters:
154     # repo_uri - a repository URI. default is ESVN_REPO_URI.
155     # destination - a check out path in S.
156     subversion_fetch() {
157 zlin 1.54 local repo_uri="$(subversion__get_repository_uri "${1:-${ESVN_REPO_URI}}")"
158 cardoe 1.47 local revision="$(subversion__get_peg_revision "${1:-${ESVN_REPO_URI}}")"
159 hattya 1.39 local S_dest="${2}"
160 hattya 1.25
161 zlin 1.51 if [[ -z ${repo_uri} ]]; then
162     die "${ESVN}: ESVN_REPO_URI (or specified URI) is empty."
163     fi
164    
165 cardoe 1.47 [[ -n "${ESVN_REVISION}" ]] && revision="${ESVN_REVISION}"
166    
167 hattya 1.33 # check for the protocol
168 hattya 1.39 local protocol="${repo_uri%%:*}"
169 hattya 1.1
170 hattya 1.33 case "${protocol}" in
171 vapier 1.24 http|https)
172 hattya 1.25 if built_with_use dev-util/subversion nowebdav; then
173 hattya 1.34 echo
174 vapier 1.24 eerror "In order to emerge this package, you need to"
175     eerror "re-emerge subversion with USE=-nowebdav"
176 hattya 1.34 echo
177     die "${ESVN}: please run 'USE=-nowebdav emerge subversion'"
178 vapier 1.24 fi
179     ;;
180 hattya 1.33 svn|svn+ssh)
181     ;;
182 hattya 1.5 *)
183 zlin 1.46 die "${ESVN}: fetch from '${protocol}' is not yet implemented."
184 hattya 1.5 ;;
185     esac
186 hattya 1.1
187 hattya 1.38 addread "/etc/subversion"
188     addwrite "${ESVN_STORE_DIR}"
189    
190 zlin 1.46 if [[ ! -d ${ESVN_STORE_DIR} ]]; then
191 hattya 1.17 debug-print "${FUNCNAME}: initial checkout. creating subversion directory"
192 hattya 1.33 mkdir -p "${ESVN_STORE_DIR}" || die "${ESVN}: can't mkdir ${ESVN_STORE_DIR}."
193 hattya 1.1 fi
194    
195 hattya 1.33 cd "${ESVN_STORE_DIR}" || die "${ESVN}: can't chdir to ${ESVN_STORE_DIR}"
196 hattya 1.1
197 hattya 1.39 local wc_path="$(subversion__get_wc_path "${repo_uri}")"
198 hattya 1.38 local options="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion"
199 hattya 1.1
200 cardoe 1.47 [[ -n "${revision}" ]] && options="${options} -r ${revision}"
201    
202     if [[ "${ESVN_OPTIONS}" = *-r* ]]; then
203     ewarn "\${ESVN_OPTIONS} contains -r, this usage is unsupported. Please"
204     ewarn "see \${ESVN_REPO_URI}"
205     fi
206    
207 hattya 1.39 debug-print "${FUNCNAME}: wc_path = \"${wc_path}\""
208 hattya 1.25 debug-print "${FUNCNAME}: ESVN_OPTIONS = \"${ESVN_OPTIONS}\""
209 hattya 1.38 debug-print "${FUNCNAME}: options = \"${options}\""
210 joker 1.37
211 zlin 1.46 if [[ ! -d ${wc_path}/.svn ]]; then
212 zlin 1.53 if [[ -n ${ESVN_OFFLINE} ]]; then
213     ewarn "ESVN_OFFLINE cannot be used when the there is no existing checkout."
214     fi
215 hattya 1.1 # first check out
216     einfo "subversion check out start -->"
217 cardoe 1.47 einfo " repository: ${repo_uri}${revision:+@}${revision}"
218 hattya 1.1
219 hattya 1.39 debug-print "${FUNCNAME}: ${ESVN_FETCH_CMD} ${options} ${repo_uri}"
220    
221     mkdir -p "${ESVN_PROJECT}" || die "${ESVN}: can't mkdir ${ESVN_PROJECT}."
222     cd "${ESVN_PROJECT}" || die "${ESVN}: can't chdir to ${ESVN_PROJECT}"
223 hattya 1.38 ${ESVN_FETCH_CMD} ${options} "${repo_uri}" || die "${ESVN}: can't fetch from ${repo_uri}."
224 hattya 1.12
225 zlin 1.49 elif [[ -n ${ESVN_OFFLINE} ]]; then
226     subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy."
227     if [[ -n ${ESVN_REVISION} && ${ESVN_REVISION} != ${ESVN_WC_REVISION} ]]; then
228     die "${ESVN}: You requested off-line updating and revision ${ESVN_REVISION} but only revision ${ESVN_WC_REVISION} is available locally."
229     fi
230     einfo "Fetching disabled: Using existing repository copy"
231 hattya 1.1 else
232 peper 1.44 subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy."
233 hattya 1.45
234 zlin 1.52 local esvn_up_freq=
235     if [[ -n ${ESVN_UP_FREQ} ]]; then
236     if [[ -n ${ESVN_UP_FREQ//[[:digit:]]} ]]; then
237     die "${ESVN}: ESVN_UP_FREQ must be an integer value corresponding to the minimum number of hours between svn up."
238     elif [[ -z $(find "${wc_path}/.svn/entries" -mmin "+$((ESVN_UP_FREQ*60))") ]]; then
239     einfo "Fetching disabled since ${ESVN_UP_FREQ} hours hasn't passed since last update."
240     esvn_up_freq=no_update
241     fi
242     fi
243    
244     if [[ -z ${esvn_up_freq} ]]; then
245     if [[ ${ESVN_WC_URL} != $(subversion__get_repository_uri "${repo_uri}") ]]; then
246     einfo "suversion switch start -->"
247     einfo " old repository: ${ESVN_WC_URL}@${ESVN_WC_REVISION}"
248     einfo " new repository: ${repo_uri}${revision:+@}${revision}"
249 cardoe 1.48
250 zlin 1.52 debug-print "${FUNCNAME}: ${ESVN_SWITCH_CMD} ${options} ${repo_uri}"
251 hattya 1.34
252 zlin 1.52 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
253     ${ESVN_SWITCH_CMD} ${options} ${repo_uri} || die "${ESVN}: can't update from ${repo_uri}"
254     else
255     # update working copy
256     einfo "subversion update start -->"
257     einfo " repository: ${repo_uri}${revision:+@}${revision}"
258 hattya 1.25
259 zlin 1.52 debug-print "${FUNCNAME}: ${ESVN_UPDATE_CMD} ${options}"
260 hattya 1.39
261 zlin 1.52 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
262     ${ESVN_UPDATE_CMD} ${options} || die "${ESVN}: can't update from ${repo_uri}."
263     fi
264 cardoe 1.48 fi
265 peper 1.43 fi
266 hattya 1.1
267 hattya 1.39 einfo " working copy: ${wc_path}"
268 hattya 1.33
269     if ! has "export" ${ESVN_RESTRICT}; then
270 hattya 1.39 cd "${wc_path}" || die "${ESVN}: can't chdir to ${wc_path}"
271    
272     local S="${S}/${S_dest}"
273 hattya 1.33
274     # export to the ${WORKDIR}
275     #* "svn export" has a bug. see http://bugs.gentoo.org/119236
276     #* svn export . "${S}" || die "${ESVN}: can't export to ${S}."
277     rsync -rlpgo --exclude=".svn/" . "${S}" || die "${ESVN}: can't export to ${S}."
278     fi
279 hattya 1.1
280 hattya 1.8 echo
281 hattya 1.1 }
282    
283 zlin 1.46 # @FUNCTION: subversion_bootstrap
284     # @DESCRIPTION:
285     # Apply patches in ${ESVN_PATCHES} and run ${ESVN_BOOTSTRAP} if specified.
286     subversion_bootstrap() {
287 hattya 1.33 if has "export" ${ESVN_RESTRICT}; then
288     return
289     fi
290 hattya 1.1
291 hattya 1.8 cd "${S}"
292    
293 zlin 1.46 if [[ -n ${ESVN_PATCHES} ]]; then
294 hattya 1.15 einfo "apply patches -->"
295 hattya 1.12
296 peper 1.43 local patch fpatch
297 hattya 1.45
298 peper 1.43 for patch in ${ESVN_PATCHES}; do
299 zlin 1.46 if [[ -f ${patch} ]]; then
300 peper 1.43 epatch "${patch}"
301 hattya 1.45
302 hattya 1.8 else
303 peper 1.43 for fpatch in ${FILESDIR}/${patch}; do
304 zlin 1.46 if [[ -f ${fpatch} ]]; then
305 peper 1.43 epatch "${fpatch}"
306 hattya 1.45
307 hattya 1.8 else
308 peper 1.43 die "${ESVN}: ${patch} not found"
309 hattya 1.45
310 hattya 1.8 fi
311     done
312 hattya 1.45
313 hattya 1.8 fi
314     done
315 hattya 1.45
316 hattya 1.8 echo
317     fi
318    
319 zlin 1.46 if [[ -n ${ESVN_BOOTSTRAP} ]]; then
320 hattya 1.8 einfo "begin bootstrap -->"
321 hattya 1.12
322 zlin 1.46 if [[ -f ${ESVN_BOOTSTRAP} && -x ${ESVN_BOOTSTRAP} ]]; then
323 hattya 1.8 einfo " bootstrap with a file: ${ESVN_BOOTSTRAP}"
324     eval "./${ESVN_BOOTSTRAP}" || die "${ESVN}: can't execute ESVN_BOOTSTRAP."
325 hattya 1.45
326 hattya 1.8 else
327 peper 1.43 einfo " bootstrap with command: ${ESVN_BOOTSTRAP}"
328 hattya 1.8 eval "${ESVN_BOOTSTRAP}" || die "${ESVN}: can't eval ESVN_BOOTSTRAP."
329 hattya 1.45
330 hattya 1.1 fi
331     fi
332     }
333    
334 zlin 1.46 # @FUNCTION: subversion_src_unpack
335     # @DESCRIPTION:
336     # default src_unpack. fetch and bootstrap.
337     subversion_src_unpack() {
338 hattya 1.34 subversion_fetch || die "${ESVN}: unknown problem occurred in subversion_fetch."
339     subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap."
340 hattya 1.1 }
341 hattya 1.33
342 zlin 1.46 # @FUNCTION: subversion_wc_info
343     # @USAGE: [repo_uri]
344 cardoe 1.47 # @RETURN: ESVN_WC_URL, ESVN_WC_ROOT, ESVN_WC_UUID, ESVN_WC_REVISION and ESVN_WC_PATH
345 zlin 1.46 # @DESCRIPTION:
346     # Get svn info for the specified repo_uri. The default repo_uri is ESVN_REPO_URI.
347 hattya 1.39 #
348 zlin 1.46 # The working copy information on the specified repository URI are set to
349 hattya 1.45 # ESVN_WC_* variables.
350 zlin 1.46 subversion_wc_info() {
351 zlin 1.54 local repo_uri="$(subversion__get_repository_uri "${1:-${ESVN_REPO_URI}}")"
352 hattya 1.39 local wc_path="$(subversion__get_wc_path "${repo_uri}")"
353    
354     debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
355     debug-print "${FUNCNAME}: wc_path = ${wc_path}"
356    
357 zlin 1.46 if [[ ! -d ${wc_path} ]]; then
358 hattya 1.39 return 1
359     fi
360    
361 cardoe 1.47 export ESVN_WC_URL="$(subversion__svn_info "${wc_path}" "URL")"
362     export ESVN_WC_ROOT="$(subversion__svn_info "${wc_path}" "Repository Root")"
363     export ESVN_WC_UUID="$(subversion__svn_info "${wc_path}" "Repository UUID")"
364     export ESVN_WC_REVISION="$(subversion__svn_info "${wc_path}" "Revision")"
365 hattya 1.45 export ESVN_WC_PATH="${wc_path}"
366 hattya 1.39 }
367    
368     ## -- Private Functions
369    
370     ## -- subversion__svn_info() ------------------------------------------------- #
371     #
372 zlin 1.46 # param $1 - a target.
373     # param $2 - a key name.
374 hattya 1.39 #
375 zlin 1.46 subversion__svn_info() {
376 hattya 1.39 local target="${1}"
377     local key="${2}"
378    
379     env LC_ALL=C svn info "${target}" | grep -i "^${key}" | cut -d" " -f2-
380     }
381    
382     ## -- subversion__get_repository_uri() --------------------------------------- #
383     #
384 zlin 1.46 # param $1 - a repository URI.
385     subversion__get_repository_uri() {
386 zlin 1.54 local repo_uri="${1}"
387 hattya 1.39
388     debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
389 hattya 1.33
390 zlin 1.46 if [[ -z ${repo_uri} ]]; then
391 hattya 1.39 die "${ESVN}: ESVN_REPO_URI (or specified URI) is empty."
392     fi
393 hattya 1.33
394     # delete trailing slash
395 zlin 1.46 if [[ -z ${repo_uri##*/} ]]; then
396 hattya 1.33 repo_uri="${repo_uri%/}"
397     fi
398    
399 cardoe 1.47 repo_uri="${repo_uri%@*}"
400 hattya 1.39
401     echo "${repo_uri}"
402     }
403    
404     ## -- subversion__get_wc_path() ---------------------------------------------- #
405     #
406 zlin 1.46 # param $1 - a repository URI.
407     subversion__get_wc_path() {
408 cardoe 1.47 local repo_uri="$(subversion__get_repository_uri "${1}")"
409 hattya 1.39
410     debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
411    
412     echo "${ESVN_STORE_DIR}/${ESVN_PROJECT}/${repo_uri##*/}"
413     }
414    
415 cardoe 1.47 ## -- subversion__get_peg_revision() ----------------------------------------- #
416 hattya 1.39 #
417 zlin 1.46 # param $1 - a repository URI.
418 cardoe 1.47 subversion__get_peg_revision() {
419 hattya 1.39 local repo_uri="${1}"
420    
421     debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
422    
423     # repo_uri has peg revision ?
424 zlin 1.46 if [[ ${repo_uri} != *@* ]]; then
425 hattya 1.39 debug-print "${FUNCNAME}: repo_uri does not have a peg revision."
426 hattya 1.33 fi
427 zlin 1.49
428 cardoe 1.47 local peg_rev=
429     [[ ${repo_uri} = *@* ]] && peg_rev="${repo_uri##*@}"
430 hattya 1.33
431 hattya 1.39 debug-print "${FUNCNAME}: peg_rev = ${peg_rev}"
432    
433 cardoe 1.47 echo "${peg_rev}"
434 hattya 1.33 }
435 zlin 1.50
436     # @FUNCTION: subversion_pkg_preinst
437     # @DESCRIPTION:
438     # Log the svn revision of source code. Doing this in pkg_preinst because we
439     # want the logs to stick around if packages are uninstalled without messing with
440     # config protection.
441     subversion_pkg_preinst() {
442     local pkgdate=$(date "+%Y%m%d %H:%M:%S")
443     subversion_wc_info
444     if [[ -n ${ESCM_LOGDIR} ]]; then
445     local dir="${ROOT}/${ESCM_LOGDIR}/${CATEGORY}"
446     if [[ ! -d ${dir} ]]; then
447     mkdir -p "${dir}" || \
448     eerror "Failed to create '${dir}' for logging svn revision to '${PORTDIR_SCM}'"
449     fi
450     local logmessage="svn: ${pkgdate} - ${PF}:${SLOT} was merged at revision ${ESVN_WC_REVISION}"
451     if [[ -d ${dir} ]]; then
452     echo "${logmessage}" >> "${dir}/${PN}.log"
453     else
454     eerror "Could not log the message '${logmessage}' to '${dir}/${PN}.log'"
455     fi
456     fi
457 zlin 1.51 }

  ViewVC Help
Powered by ViewVC 1.1.20