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

Diff of /eclass/cvs.eclass

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.71 Revision 1.81
1# Copyright 1999-2008 Gentoo Foundation 1# Copyright 1999-2013 Gentoo Foundation
2# Distributed under the terms of the GNU General Public License v2 2# Distributed under the terms of the GNU General Public License v2
3# $Header: /var/cvsroot/gentoo-x86/eclass/cvs.eclass,v 1.71 2010/06/19 00:35:11 abcd Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/cvs.eclass,v 1.81 2013/01/22 07:29:02 vapier Exp $
4 4
5# @ECLASS: cvs.eclass 5# @ECLASS: cvs.eclass
6# @MAINTAINER: 6# @MAINTAINER:
7# vapier@gentoo.org (and anyone who wants to help) 7# vapier@gentoo.org (and anyone who wants to help)
8# @BLURB: This eclass provides generic cvs fetching functions 8# @BLURB: This eclass provides generic cvs fetching functions
11# ebuild, set the ECLASS VARIABLES as specified below in your ebuild before 11# ebuild, set the ECLASS VARIABLES as specified below in your ebuild before
12# inheriting. Then either leave the default src_unpack or extend over 12# inheriting. Then either leave the default src_unpack or extend over
13# cvs_src_unpack. If you find that you need to call the cvs_* functions 13# cvs_src_unpack. If you find that you need to call the cvs_* functions
14# directly, I'd be interested to hear about it. 14# directly, I'd be interested to hear about it.
15 15
16if [[ ${___ECLASS_ONCE_CVS} != "recur -_+^+_- spank" ]] ; then
17___ECLASS_ONCE_CVS="recur -_+^+_- spank"
18
16inherit eutils 19inherit eutils
17 20
18# TODO: 21# TODO:
19 22
20# Implement more auth types (gserver?, kserver?) 23# Implement more auth types (gserver?, kserver?)
24 27
25 28
26# Users shouldn't change these settings! The ebuild/eclass inheriting 29# Users shouldn't change these settings! The ebuild/eclass inheriting
27# this eclass will take care of that. If you want to set the global 30# this eclass will take care of that. If you want to set the global
28# KDE cvs ebuilds' settings, see the comments in kde-source.eclass. 31# KDE cvs ebuilds' settings, see the comments in kde-source.eclass.
32
33# @ECLASS-VARIABLE: ECVS_CVS_COMPRESS
34# @DESCRIPTION:
35# Set the default compression level. Has no effect when ECVS_CVS_COMMAND
36# is defined by ebuild/user.
37: ${ECVS_CVS_COMPRESS:=-z1}
38
39# @ECLASS-VARIABLE: ECVS_CVS_OPTIONS
40# @DESCRIPTION:
41# Additional options to the cvs commands. Has no effect when ECVS_CVS_COMMAND
42# is defined by ebuild/user.
43: ${ECVS_CVS_OPTIONS:=-q -f}
29 44
30# @ECLASS-VARIABLE: ECVS_CVS_COMMAND 45# @ECLASS-VARIABLE: ECVS_CVS_COMMAND
31# @DESCRIPTION: 46# @DESCRIPTION:
32# CVS command to run 47# CVS command to run
33# 48#
34# You can set, for example, "cvs -t" for extensive debug information 49# You can set, for example, "cvs -t" for extensive debug information
35# on the cvs connection. The default of "cvs -q -f -z4" means to be 50# on the cvs connection. The default of "cvs -q -f -z4" means to be
36# quiet, to disregard the ~/.cvsrc config file and to use maximum 51# quiet, to disregard the ~/.cvsrc config file and to use maximum
37# compression. 52# compression.
38
39# @ECLASS-VARIABLE: ECVS_CVS_COMPRESS
40# @DESCRIPTION:
41# Set the compression level.
42[[ -z ${ECVS_CVS_COMPRESS} ]] && ECVS_CVS_COMPRESS="-z1"
43
44# @ECLASS-VARIABLE: ECVS_CVS_OPTIONS
45# @DESCRIPTION:
46# Additional options to the cvs commands.
47[[ -z ${ECVS_CVS_OPTIONS} ]] && ECVS_CVS_OPTIONS="-q -f"
48
49# @ECLASS-VARIABLE: ECVS_CVS_COMMAND
50# @DESCRIPTION:
51# The cvs command.
52[[ -z ${ECVS_CVS_COMMAND} ]] && ECVS_CVS_COMMAND="cvs ${ECVS_CVS_OPTIONS} ${ECVS_CVS_COMPRESS}" 53: ${ECVS_CVS_COMMAND:=cvs ${ECVS_CVS_OPTIONS} ${ECVS_CVS_COMPRESS}}
53 54
54# @ECLASS-VARIABLE: ECVS_UP_OPTS 55# @ECLASS-VARIABLE: ECVS_UP_OPTS
55# @DESCRIPTION: 56# @DESCRIPTION:
56# CVS options given after the cvs update command. Don't remove "-dP" or things 57# CVS options given after the cvs update command. Don't remove "-dP" or things
57# won't work. 58# won't work.
58[ -z "$ECVS_UP_OPTS" ] && ECVS_UP_OPTS="-dP" 59: ${ECVS_UP_OPTS:=-dP}
59 60
60# @ECLASS-VARIABLE: ECVS_CO_OPTS 61# @ECLASS-VARIABLE: ECVS_CO_OPTS
62# @DEFAULT_UNSET
61# @DESCRIPTION: 63# @DESCRIPTION:
62# CVS options given after the cvs checkout command. 64# CVS options given after the cvs checkout command.
63[ -z "$ECVS_CO_OPTS" ] && ECVS_CO_OPTS=""
64 65
66# @ECLASS-VARIABLE: ECVS_OFFLINE
67# @DESCRIPTION:
68# Set this variable to a non-empty value to disable the automatic updating of
69# a CVS source tree. This is intended to be set outside the cvs source
70# tree by users.
71: ${ECVS_OFFLINE:=${EVCS_OFFLINE}}
65 72
66# @ECLASS-VARIABLE: ECVS_LOCAL 73# @ECLASS-VARIABLE: ECVS_LOCAL
74# @DEFAULT_UNSET
67# @DESCRIPTION: 75# @DESCRIPTION:
68# If this is set, the CVS module will be fetched non-recursively. 76# If this is set, the CVS module will be fetched non-recursively.
69# Refer to the information in the CVS man page regarding the -l 77# Refer to the information in the CVS man page regarding the -l
70# command option (not the -l global option). 78# command option (not the -l global option).
71 79
72# @ECLASS-VARIABLE: ECVS_LOCALNAME 80# @ECLASS-VARIABLE: ECVS_LOCALNAME
81# @DEFAULT_UNSET
73# @DESCRIPTION: 82# @DESCRIPTION:
74# Local name of checkout directory 83# Local name of checkout directory
75# 84#
76# This is useful if the module on the server is called something 85# This is useful if the module on the server is called something
77# common like 'driver' or is nested deep in a tree, and you don't like 86# common like 'driver' or is nested deep in a tree, and you don't like
82# have e.g. a wrong $S setting. 91# have e.g. a wrong $S setting.
83 92
84# @ECLASS-VARIABLE: ECVS_TOP_DIR 93# @ECLASS-VARIABLE: ECVS_TOP_DIR
85# @DESCRIPTION: 94# @DESCRIPTION:
86# The directory under which CVS modules are checked out. 95# The directory under which CVS modules are checked out.
87[ -z "$ECVS_TOP_DIR" ] && ECVS_TOP_DIR="${PORTAGE_ACTUAL_DISTDIR-${DISTDIR}}/cvs-src" 96: ${ECVS_TOP_DIR:="${PORTAGE_ACTUAL_DISTDIR-${DISTDIR}}/cvs-src"}
88 97
89# @ECLASS-VARIABLE: ECVS_SERVER 98# @ECLASS-VARIABLE: ECVS_SERVER
90# @DESCRIPTION: 99# @DESCRIPTION:
91# CVS path 100# CVS path
92# 101#
95# ":pserver:anonymous@anoncvs.kde.org:/home/kde"; this is generated 104# ":pserver:anonymous@anoncvs.kde.org:/home/kde"; this is generated
96# using other settings also. 105# using other settings also.
97# 106#
98# Set this to "offline" to disable fetching (i.e. to assume the module 107# Set this to "offline" to disable fetching (i.e. to assume the module
99# is already checked out in ECVS_TOP_DIR). 108# is already checked out in ECVS_TOP_DIR).
100[ -z "$ECVS_SERVER" ] && ECVS_SERVER="offline" 109: ${ECVS_SERVER:="offline"}
101 110
102# @ECLASS-VARIABLE: ECVS_MODULE 111# @ECLASS-VARIABLE: ECVS_MODULE
112# @REQUIRED
103# @DESCRIPTION: 113# @DESCRIPTION:
104# The name of the CVS module to be fetched 114# The name of the CVS module to be fetched
105# 115#
106# This must be set when cvs_src_unpack is called. This can include 116# This must be set when cvs_src_unpack is called. This can include
107# several directory levels, i.e. "foo/bar/baz" 117# several directory levels, i.e. "foo/bar/baz"
108
109#[ -z "$ECVS_MODULE" ] && die "$ECLASS: error: ECVS_MODULE not set, cannot continue" 118#[[ -z ${ECVS_MODULE} ]] && die "$ECLASS: error: ECVS_MODULE not set, cannot continue"
119
120# @ECLASS-VARIABLE: ECVS_DATE
121# @DEFAULT_UNSET
122# @DESCRIPTION:
123# The date of the checkout. See the -D date_spec option in the cvs
124# man page for more details.
110 125
111# @ECLASS-VARIABLE: ECVS_BRANCH 126# @ECLASS-VARIABLE: ECVS_BRANCH
127# @DEFAULT_UNSET
112# @DESCRIPTION: 128# @DESCRIPTION:
113# The name of the branch/tag to use 129# The name of the branch/tag to use
114# 130#
115# The default is "HEAD". The following default _will_ reset your 131# The default is "HEAD". The following default _will_ reset your
116# branch checkout to head if used. 132# branch checkout to head if used.
117 133#: ${ECVS_BRANCH:="HEAD"}
118#[ -z "$ECVS_BRANCH" ] && ECVS_BRANCH="HEAD"
119 134
120# @ECLASS-VARIABLE: ECVS_AUTH 135# @ECLASS-VARIABLE: ECVS_AUTH
121# @DESCRIPTION: 136# @DESCRIPTION:
122# Authentication method to use 137# Authentication method to use
123# 138#
130# - Added "no" as a server type, which uses no AUTH method, nor 145# - Added "no" as a server type, which uses no AUTH method, nor
131# does it login 146# does it login
132# e.g. 147# e.g.
133# "cvs -danoncvs@savannah.gnu.org:/cvsroot/backbone co System" 148# "cvs -danoncvs@savannah.gnu.org:/cvsroot/backbone co System"
134# ( from gnustep-apps/textedit ) 149# ( from gnustep-apps/textedit )
135[ -z "$ECVS_AUTH" ] && ECVS_AUTH="pserver" 150: ${ECVS_AUTH:="pserver"}
136 151
137# @ECLASS-VARIABLE: ECVS_USER 152# @ECLASS-VARIABLE: ECVS_USER
138# @DESCRIPTION: 153# @DESCRIPTION:
139# Username to use for authentication on the remote server. 154# Username to use for authentication on the remote server.
140[ -z "$ECVS_USER" ] && ECVS_USER="anonymous" 155: ${ECVS_USER:="anonymous"}
141 156
142# @ECLASS-VARIABLE: ECVS_PASS 157# @ECLASS-VARIABLE: ECVS_PASS
158# @DEFAULT_UNSET
143# @DESCRIPTION: 159# @DESCRIPTION:
144# Password to use for authentication on the remote server 160# Password to use for authentication on the remote server
145[ -z "$ECVS_PASS" ] && ECVS_PASS=""
146 161
147# @ECLASS-VARIABLE: ECVS_SSH_HOST_KEY 162# @ECLASS-VARIABLE: ECVS_SSH_HOST_KEY
163# @DEFAULT_UNSET
148# @DESCRIPTION: 164# @DESCRIPTION:
149# If SSH is used for `ext' authentication, use this variable to 165# If SSH is used for `ext' authentication, use this variable to
150# specify the host key of the remote server. The format of the value 166# specify the host key of the remote server. The format of the value
151# should be the same format that is used for the SSH known hosts file. 167# should be the same format that is used for the SSH known hosts file.
152# 168#
153# WARNING: If a SSH host key is not specified using this variable, the 169# WARNING: If a SSH host key is not specified using this variable, the
154# remote host key will not be verified. 170# remote host key will not be verified.
155 171
156# @ECLASS-VARIABLE: ECVS_CLEAN 172# @ECLASS-VARIABLE: ECVS_CLEAN
173# @DEFAULT_UNSET
157# @DESCRIPTION: 174# @DESCRIPTION:
158# Set this to get a clean copy when updating (passes the 175# Set this to get a clean copy when updating (passes the
159# -C option to cvs update) 176# -C option to cvs update)
160 177
161# @ECLASS-VARIABLE: ECVS_RUNAS 178# @ECLASS-VARIABLE: ECVS_RUNAS
179# @DEFAULT_UNSET
162# @DESCRIPTION: 180# @DESCRIPTION:
163# Specifies an alternate (non-root) user to use to run cvs. Currently 181# Specifies an alternate (non-root) user to use to run cvs. Currently
164# b0rked and wouldn't work with portage userpriv anyway without 182# b0rked and wouldn't work with portage userpriv anyway without
165# special magic. 183# special magic.
166 184
167# [ -z "$ECVS_RUNAS" ] && ECVS_RUNAS="`whoami`" 185# : ${ECVS_RUNAS:=$(whoami)}
168
169# ECVS_SUBDIR -- deprecated, do not use
170[ -n "$ECVS_SUBDIR" ] && die "ERROR: deprecated ECVS_SUBDIR defined. Please fix this ebuild."
171 186
172# add cvs to deps 187# add cvs to deps
173# ssh is used for ext auth 188# ssh is used for ext auth
174# sudo is used to run as a specified user 189# sudo is used to run as a specified user
175DEPEND="dev-vcs/cvs" 190DEPEND="dev-vcs/cvs"
176 191
177[ -n "$ECVS_RUNAS" ] && DEPEND="$DEPEND app-admin/sudo" 192[[ -n ${ECVS_RUNAS} ]] && DEPEND+=" app-admin/sudo"
178 193
179if [ "$ECVS_AUTH" == "ext" ]; then 194if [[ ${ECVS_AUTH} == "ext" ]] ; then
180 #default to ssh 195 #default to ssh
181 [ -z "$CVS_RSH" ] && export CVS_RSH="ssh" 196 [[ -z ${CVS_RSH} ]] && export CVS_RSH="ssh"
182 if [ "$CVS_RSH" != "ssh" ]; then 197 if [[ ${CVS_RSH} != "ssh" ]] ; then
183 die "Support for ext auth with clients other than ssh has not been implemented yet" 198 die "Support for ext auth with clients other than ssh has not been implemented yet"
184 fi 199 fi
185 DEPEND="${DEPEND} net-misc/openssh" 200 DEPEND+=" net-misc/openssh"
186fi 201fi
187 202
188# called from cvs_src_unpack 203# called from cvs_src_unpack
189cvs_fetch() { 204cvs_fetch() {
190 205
191 # Make these options local variables so that the global values are 206 # Make these options local variables so that the global values are
192 # not affected by modifications in this function. 207 # not affected by modifications in this function.
193 208
194 local ECVS_COMMAND="${ECVS_COMMAND}" 209 local ECVS_COMMAND=${ECVS_COMMAND}
195 local ECVS_UP_OPTS="${ECVS_UP_OPTS}" 210 local ECVS_UP_OPTS=${ECVS_UP_OPTS}
196 local ECVS_CO_OPTS="${ECVS_CO_OPTS}" 211 local ECVS_CO_OPTS=${ECVS_CO_OPTS}
197 212
198 debug-print-function $FUNCNAME $* 213 debug-print-function ${FUNCNAME} "$@"
199 214
200 # Update variables that are modified by ebuild parameters, which 215 # Update variables that are modified by ebuild parameters, which
201 # should be effective every time cvs_fetch is called, and not just 216 # should be effective every time cvs_fetch is called, and not just
202 # every time cvs.eclass is inherited 217 # every time cvs.eclass is inherited
203 218
204 # Handle parameter for local (non-recursive) fetching 219 # Handle parameter for local (non-recursive) fetching
205 220
206 if [ -n "$ECVS_LOCAL" ]; then 221 if [[ -n ${ECVS_LOCAL} ]] ; then
207 ECVS_UP_OPTS="$ECVS_UP_OPTS -l" 222 ECVS_UP_OPTS+=" -l"
208 ECVS_CO_OPTS="$ECVS_CO_OPTS -l" 223 ECVS_CO_OPTS+=" -l"
209 fi 224 fi
210 225
211 # Handle ECVS_BRANCH option 226 # Handle ECVS_BRANCH option
212 # 227 #
213 # Because CVS auto-switches branches, we just have to pass the 228 # Because CVS auto-switches branches, we just have to pass the
214 # correct -rBRANCH option when updating. 229 # correct -rBRANCH option when updating.
215 230
216 if [ -n "$ECVS_BRANCH" ]; then 231 if [[ -n ${ECVS_BRANCH} ]] ; then
217 ECVS_UP_OPTS="$ECVS_UP_OPTS -r$ECVS_BRANCH" 232 ECVS_UP_OPTS+=" -r${ECVS_BRANCH}"
218 ECVS_CO_OPTS="$ECVS_CO_OPTS -r$ECVS_BRANCH" 233 ECVS_CO_OPTS+=" -r${ECVS_BRANCH}"
219 fi 234 fi
220 235
221 # Handle ECVS_LOCALNAME, which specifies the local directory name 236 # Handle ECVS_LOCALNAME, which specifies the local directory name
222 # to use. Note that the -d command option is not equivalent to 237 # to use. Note that the -d command option is not equivalent to
223 # the global -d option. 238 # the global -d option.
224 239
225 if [ "$ECVS_LOCALNAME" != "$ECVS_MODULE" ]; then 240 if [[ ${ECVS_LOCALNAME} != "${ECVS_MODULE}" ]] ; then
226 ECVS_CO_OPTS="$ECVS_CO_OPTS -d $ECVS_LOCALNAME" 241 ECVS_CO_OPTS+=" -d ${ECVS_LOCALNAME}"
227 fi 242 fi
228 243
229
230 if [ -n "$ECVS_CLEAN" ]; then 244 if [[ -n ${ECVS_CLEAN} ]] ; then
231 ECVS_UP_OPTS="$ECVS_UP_OPTS -C" 245 ECVS_UP_OPTS+=" -C"
232 fi 246 fi
233 247
248 if [[ -n ${ECVS_DATE} ]] ; then
249 ECVS_CO_OPTS+=" -D ${ECVS_DATE}"
250 ECVS_UP_OPTS+=" -D ${ECVS_DATE}"
251 fi
234 252
235 # It would be easiest to always be in "run-as mode", logic-wise, 253 # It would be easiest to always be in "run-as mode", logic-wise,
236 # if sudo didn't ask for a password even when sudo'ing to `whoami`. 254 # if sudo didn't ask for a password even when sudo'ing to `whoami`.
237 255
238 if [ -z "$ECVS_RUNAS" ]; then 256 if [[ -z ${ECVS_RUNAS} ]] ; then
239 run="" 257 run=""
240 else 258 else
241 run="sudo -u $ECVS_RUNAS" 259 run="sudo -u ${ECVS_RUNAS}"
242 fi 260 fi
243 261
244 # Create the top dir if needed 262 # Create the top dir if needed
245 263
246 if [ ! -d "$ECVS_TOP_DIR" ]; then 264 if [[ ! -d ${ECVS_TOP_DIR} ]] ; then
247
248 # Note that the addwrite statements in this block are only 265 # Note that the addwrite statements in this block are only
249 # there to allow creating ECVS_TOP_DIR; we allow writing 266 # there to allow creating ECVS_TOP_DIR; we allow writing
250 # inside it separately. 267 # inside it separately.
251 268
252 # This is because it's simpler than trying to find out the 269 # This is because it's simpler than trying to find out the
253 # parent path of the directory, which would need to be the 270 # parent path of the directory, which would need to be the
254 # real path and not a symlink for things to work (so we can't 271 # real path and not a symlink for things to work (so we can't
255 # just remove the last path element in the string) 272 # just remove the last path element in the string)
256 273
257 debug-print "$FUNCNAME: checkout mode. creating cvs directory" 274 debug-print "${FUNCNAME}: checkout mode. creating cvs directory"
258 addwrite /foobar 275 addwrite /foobar
259 addwrite / 276 addwrite /
260 $run mkdir -p "/$ECVS_TOP_DIR" 277 ${run} mkdir -p "/${ECVS_TOP_DIR}"
261 export SANDBOX_WRITE="${SANDBOX_WRITE//:\/foobar:\/}" 278 export SANDBOX_WRITE="${SANDBOX_WRITE//:\/foobar:\/}"
262 fi 279 fi
263 280
264 # In case ECVS_TOP_DIR is a symlink to a dir, get the real path, 281 # In case ECVS_TOP_DIR is a symlink to a dir, get the real path,
265 # otherwise addwrite() doesn't work. 282 # otherwise addwrite() doesn't work.
266 283
267 cd -P "$ECVS_TOP_DIR" > /dev/null 284 cd -P "${ECVS_TOP_DIR}" >/dev/null
268 ECVS_TOP_DIR="`/bin/pwd`" 285 ECVS_TOP_DIR=$(pwd)
269 286
270 # Disable the sandbox for this dir 287 # Disable the sandbox for this dir
271 addwrite "$ECVS_TOP_DIR" 288 addwrite "${ECVS_TOP_DIR}"
272 289
273 # Chown the directory and all of its contents 290 # Chown the directory and all of its contents
274 if [ -n "$ECVS_RUNAS" ]; then 291 if [[ -n ${ECVS_RUNAS} ]] ; then
275 $run chown -R "$ECVS_RUNAS" "/$ECVS_TOP_DIR" 292 ${run} chown -R "${ECVS_RUNAS}" "/${ECVS_TOP_DIR}"
276 fi 293 fi
277 294
278 # Determine the CVS command mode (checkout or update) 295 # Determine the CVS command mode (checkout or update)
279 if [ ! -d "$ECVS_TOP_DIR/$ECVS_LOCALNAME/CVS" ]; then 296 if [[ ! -d ${ECVS_TOP_DIR}/${ECVS_LOCALNAME}/CVS ]] ; then
280 mode=checkout 297 mode=checkout
281 else 298 else
282 mode=update 299 mode=update
283 fi 300 fi
284 301
285
286 # Our server string (i.e. CVSROOT) without the password so it can 302 # Our server string (i.e. CVSROOT) without the password so it can
287 # be put in Root 303 # be put in Root
288 if [ "$ECVS_AUTH" == "no" ] 304 if [[ ${ECVS_AUTH} == "no" ]] ; then
289 then
290 local server="${ECVS_USER}@${ECVS_SERVER}" 305 local server="${ECVS_USER}@${ECVS_SERVER}"
291 else 306 else
292 local connection="${ECVS_AUTH}" 307 local connection="${ECVS_AUTH}"
293 [[ -n ${ECVS_PROXY} ]] && connection="${connection};proxy=${ECVS_PROXY}" 308 [[ -n ${ECVS_PROXY} ]] && connection+=";proxy=${ECVS_PROXY}"
294 [[ -n ${ECVS_PROXY_PORT} ]] && connection="${connection};proxyport=${ECVS_PROXY_PORT}" 309 [[ -n ${ECVS_PROXY_PORT} ]] && connection+=";proxyport=${ECVS_PROXY_PORT}"
295 local server=":${connection}:${ECVS_USER}@${ECVS_SERVER}" 310 local server=":${connection}:${ECVS_USER}@${ECVS_SERVER}"
296 fi 311 fi
297 312
298 # Switch servers automagically if needed 313 # Switch servers automagically if needed
299 if [ "$mode" == "update" ]; then 314 if [[ ${mode} == "update" ]] ; then
300 cd /$ECVS_TOP_DIR/$ECVS_LOCALNAME 315 cd "/${ECVS_TOP_DIR}/${ECVS_LOCALNAME}"
301 local oldserver="`$run cat CVS/Root`" 316 local oldserver=$(${run} cat CVS/Root)
302 if [ "$server" != "$oldserver" ]; then 317 if [[ ${server} != "${oldserver}" ]] ; then
303
304 einfo "Changing the CVS server from $oldserver to $server:" 318 einfo "Changing the CVS server from ${oldserver} to ${server}:"
305 debug-print "$FUNCNAME: Changing the CVS server from $oldserver to $server:" 319 debug-print "${FUNCNAME}: Changing the CVS server from ${oldserver} to ${server}:"
306 320
307 einfo "Searching for CVS directories ..." 321 einfo "Searching for CVS directories ..."
308 local cvsdirs="`$run find . -iname CVS -print`" 322 local cvsdirs=$(${run} find . -iname CVS -print)
309 debug-print "$FUNCNAME: CVS directories found:" 323 debug-print "${FUNCNAME}: CVS directories found:"
310 debug-print "$cvsdirs" 324 debug-print "${cvsdirs}"
311 325
312 einfo "Modifying CVS directories ..." 326 einfo "Modifying CVS directories ..."
327 local x
313 for x in $cvsdirs; do 328 for x in ${cvsdirs} ; do
314 debug-print "In $x" 329 debug-print "In ${x}"
315 $run echo "$server" > "$x/Root" 330 ${run} echo "${server}" > "${x}/Root"
316 done 331 done
317
318 fi 332 fi
319 fi 333 fi
320 334
321 # Prepare a cvspass file just for this session, we don't want to 335 # Prepare a cvspass file just for this session, we don't want to
322 # mess with ~/.cvspass 336 # mess with ~/.cvspass
323 touch "${T}/cvspass" 337 touch "${T}/cvspass"
324 export CVS_PASSFILE="${T}/cvspass" 338 export CVS_PASSFILE="${T}/cvspass"
325 if [ -n "$ECVS_RUNAS" ]; then 339 if [[ -n ${ECVS_RUNAS} ]] ; then
326 chown "$ECVS_RUNAS" "${T}/cvspass" 340 chown "${ECVS_RUNAS}" "${T}/cvspass"
327 fi 341 fi
328 342
329 # The server string with the password in it, for login 343 # The server string with the password in it, for login
330 cvsroot_pass=":${ECVS_AUTH}:${ECVS_USER}:${ECVS_PASS}@${ECVS_SERVER}" 344 cvsroot_pass=":${ECVS_AUTH}:${ECVS_USER}:${ECVS_PASS}@${ECVS_SERVER}"
331 345
332 # Ditto without the password, for checkout/update after login, so 346 # Ditto without the password, for checkout/update after login, so
333 # that the CVS/Root files don't contain the password in plaintext 347 # that the CVS/Root files don't contain the password in plaintext
334 if [ "$ECVS_AUTH" == "no" ] 348 if [[ ${ECVS_AUTH} == "no" ]] ; then
335 then
336 cvsroot_nopass="${ECVS_USER}@${ECVS_SERVER}" 349 cvsroot_nopass="${ECVS_USER}@${ECVS_SERVER}"
337 else 350 else
338 cvsroot_nopass=":${ECVS_AUTH}:${ECVS_USER}@${ECVS_SERVER}" 351 cvsroot_nopass=":${ECVS_AUTH}:${ECVS_USER}@${ECVS_SERVER}"
339 fi 352 fi
340 353
344 cmdcheckout="${run} ${ECVS_CVS_COMMAND} -d \"${cvsroot_nopass}\" checkout ${ECVS_CO_OPTS} ${ECVS_MODULE}" 357 cmdcheckout="${run} ${ECVS_CVS_COMMAND} -d \"${cvsroot_nopass}\" checkout ${ECVS_CO_OPTS} ${ECVS_MODULE}"
345 358
346 # Execute commands 359 # Execute commands
347 360
348 cd "${ECVS_TOP_DIR}" 361 cd "${ECVS_TOP_DIR}"
349 if [ "${ECVS_AUTH}" == "pserver" ]; then 362 if [[ ${ECVS_AUTH} == "pserver" ]] ; then
350 einfo "Running $cmdlogin" 363 einfo "Running ${cmdlogin}"
351 eval $cmdlogin || die "cvs login command failed" 364 eval ${cmdlogin} || die "cvs login command failed"
352 if [ "${mode}" == "update" ]; then 365 if [[ ${mode} == "update" ]] ; then
353 einfo "Running $cmdupdate" 366 einfo "Running ${cmdupdate}"
354 eval $cmdupdate || die "cvs update command failed" 367 eval ${cmdupdate} || die "cvs update command failed"
355 elif [ "${mode}" == "checkout" ]; then 368 elif [[ ${mode} == "checkout" ]] ; then
356 einfo "Running $cmdcheckout" 369 einfo "Running ${cmdcheckout}"
357 eval $cmdcheckout|| die "cvs checkout command failed" 370 eval ${cmdcheckout} || die "cvs checkout command failed"
358 fi 371 fi
359 elif [ "${ECVS_AUTH}" == "ext" ] || [ "${ECVS_AUTH}" == "no" ]; then 372 elif [[ ${ECVS_AUTH} == "ext" || ${ECVS_AUTH} == "no" ]] ; then
360
361 # Hack to support SSH password authentication 373 # Hack to support SSH password authentication
362 374
363 # Backup environment variable values 375 # Backup environment variable values
364 local CVS_ECLASS_ORIG_CVS_RSH="${CVS_RSH}" 376 local CVS_ECLASS_ORIG_CVS_RSH="${CVS_RSH}"
365 377
366 if [ "${SSH_ASKPASS+set}" == "set" ]; then 378 if [[ ${SSH_ASKPASS+set} == "set" ]] ; then
367 local CVS_ECLASS_ORIG_SSH_ASKPASS="${SSH_ASKPASS}" 379 local CVS_ECLASS_ORIG_SSH_ASKPASS="${SSH_ASKPASS}"
368 else 380 else
369 unset CVS_ECLASS_ORIG_SSH_ASKPASS 381 unset CVS_ECLASS_ORIG_SSH_ASKPASS
370 fi 382 fi
371 383
372 if [ "${DISPLAY+set}" == "set" ]; then 384 if [[ ${DISPLAY+set} == "set" ]] ; then
373 local CVS_ECLASS_ORIG_DISPLAY="${DISPLAY}" 385 local CVS_ECLASS_ORIG_DISPLAY="${DISPLAY}"
374 else 386 else
375 unset CVS_ECLASS_ORIG_DISPLAY 387 unset CVS_ECLASS_ORIG_DISPLAY
376 fi 388 fi
377 389
378 if [ "${CVS_RSH}" == "ssh" ]; then 390 if [[ ${CVS_RSH} == "ssh" ]] ; then
379
380 # Force SSH to use SSH_ASKPASS by creating python wrapper 391 # Force SSH to use SSH_ASKPASS by creating python wrapper
381 392
382 export CVS_RSH="${T}/cvs_sshwrapper" 393 export CVS_RSH="${T}/cvs_sshwrapper"
383 cat > "${CVS_RSH}"<<EOF 394 cat > "${CVS_RSH}"<<EOF
384#!/usr/bin/python 395#!/usr/bin/python
409 420
410 local CVS_ECLASS_KNOWN_HOSTS="${T}/cvs_ssh_known_hosts" 421 local CVS_ECLASS_KNOWN_HOSTS="${T}/cvs_ssh_known_hosts"
411 echo "newarglist.insert(1, '-oUserKnownHostsFile=${CVS_ECLASS_KNOWN_HOSTS}')" \ 422 echo "newarglist.insert(1, '-oUserKnownHostsFile=${CVS_ECLASS_KNOWN_HOSTS}')" \
412 >> "${CVS_RSH}" 423 >> "${CVS_RSH}"
413 424
414 if [ -z "${ECVS_SSH_HOST_KEY}" ]; then 425 if [[ -z ${ECVS_SSH_HOST_KEY} ]] ; then
415 ewarn "Warning: The SSH host key of the remote server will not be verified." 426 ewarn "Warning: The SSH host key of the remote server will not be verified."
416 einfo "A temporary known hosts list will be used." 427 einfo "A temporary known hosts list will be used."
417 local CVS_ECLASS_STRICT_HOST_CHECKING="no" 428 local CVS_ECLASS_STRICT_HOST_CHECKING="no"
418 touch "${CVS_ECLASS_KNOWN_HOSTS}" 429 touch "${CVS_ECLASS_KNOWN_HOSTS}"
419 else 430 else
431 chmod a+x "${CVS_RSH}" 442 chmod a+x "${CVS_RSH}"
432 443
433 # Make sure DISPLAY is set (SSH will not use SSH_ASKPASS 444 # Make sure DISPLAY is set (SSH will not use SSH_ASKPASS
434 # if DISPLAY is not set) 445 # if DISPLAY is not set)
435 446
436 [ -z "${DISPLAY}" ] && DISPLAY="DISPLAY" 447 : ${DISPLAY:="DISPLAY"}
437 export DISPLAY 448 export DISPLAY
438 449
439 # Create a dummy executable to echo $ECVS_PASS 450 # Create a dummy executable to echo ${ECVS_PASS}
440 451
441 export SSH_ASKPASS="${T}/cvs_sshechopass" 452 export SSH_ASKPASS="${T}/cvs_sshechopass"
442 if [ "${ECVS_AUTH}" != "no" ]; then 453 if [[ ${ECVS_AUTH} != "no" ]] ; then
443 echo -en "#!/bin/bash\necho \"$ECVS_PASS\"\n" \ 454 echo -en "#!/bin/bash\necho \"${ECVS_PASS}\"\n" \
444 > "${SSH_ASKPASS}" 455 > "${SSH_ASKPASS}"
445 else 456 else
446 echo -en "#!/bin/bash\nreturn\n" \ 457 echo -en "#!/bin/bash\nreturn\n" \
447 > "${SSH_ASKPASS}" 458 > "${SSH_ASKPASS}"
448
449 fi 459 fi
450 chmod a+x "${SSH_ASKPASS}" 460 chmod a+x "${SSH_ASKPASS}"
451 fi 461 fi
452 462
453 if [ "${mode}" == "update" ]; then 463 if [[ ${mode} == "update" ]] ; then
454 einfo "Running $cmdupdate" 464 einfo "Running ${cmdupdate}"
455 eval $cmdupdate || die "cvs update command failed" 465 eval ${cmdupdate} || die "cvs update command failed"
456 elif [ "${mode}" == "checkout" ]; then 466 elif [[ ${mode} == "checkout" ]] ; then
457 einfo "Running $cmdcheckout" 467 einfo "Running ${cmdcheckout}"
458 eval $cmdcheckout|| die "cvs checkout command failed" 468 eval ${cmdcheckout} || die "cvs checkout command failed"
459 fi 469 fi
460 470
461 # Restore environment variable values 471 # Restore environment variable values
462 export CVS_RSH="${CVS_ECLASS_ORIG_CVS_RSH}" 472 export CVS_RSH="${CVS_ECLASS_ORIG_CVS_RSH}"
463 if [ "${CVS_ECLASS_ORIG_SSH_ASKPASS+set}" == "set" ]; then 473 if [[ ${CVS_ECLASS_ORIG_SSH_ASKPASS+set} == "set" ]] ; then
464 export SSH_ASKPASS="${CVS_ECLASS_ORIG_SSH_ASKPASS}" 474 export SSH_ASKPASS="${CVS_ECLASS_ORIG_SSH_ASKPASS}"
465 else 475 else
466 unset SSH_ASKPASS 476 unset SSH_ASKPASS
467 fi 477 fi
468 478
469 if [ "${CVS_ECLASS_ORIG_DISPLAY+set}" == "set" ]; then 479 if [[ ${CVS_ECLASS_ORIG_DISPLAY+set} == "set" ]] ; then
470 export DISPLAY="${CVS_ECLASS_ORIG_DISPLAY}" 480 export DISPLAY="${CVS_ECLASS_ORIG_DISPLAY}"
471 else 481 else
472 unset DISPLAY 482 unset DISPLAY
473 fi 483 fi
474 fi 484 fi
475 485
476 # Restore ownership. Not sure why this is needed, but someone 486 # Restore ownership. Not sure why this is needed, but someone
477 # added it in the orig ECVS_RUNAS stuff. 487 # added it in the orig ECVS_RUNAS stuff.
478 if [ -n "$ECVS_RUNAS" ]; then 488 if [[ -n ${ECVS_RUNAS} ]] ; then
479 chown `whoami` "${T}/cvspass" 489 chown $(whoami) "${T}/cvspass"
480 fi 490 fi
481 491
482} 492}
483 493
484# @FUNCTION: cvs_src_unpack 494# @FUNCTION: cvs_src_unpack
485# @DESCRIPTION: 495# @DESCRIPTION:
486# The cvs src_unpack function, which will be exported 496# The cvs src_unpack function, which will be exported
487cvs_src_unpack() { 497cvs_src_unpack() {
488 498
489 debug-print-function $FUNCNAME $* 499 debug-print-function ${FUNCNAME} "$@"
490 500
491 debug-print "$FUNCNAME: init: 501 debug-print "${FUNCNAME}: init:
492 ECVS_CVS_COMMAND=$ECVS_CVS_COMMAND 502 ECVS_CVS_COMMAND=${ECVS_CVS_COMMAND}
493 ECVS_UP_OPTS=$ECVS_UP_OPTS 503 ECVS_UP_OPTS=${ECVS_UP_OPTS}
494 ECVS_CO_OPTS=$ECVS_CO_OPTS 504 ECVS_CO_OPTS=${ECVS_CO_OPTS}
495 ECVS_TOP_DIR=$ECVS_TOP_DIR 505 ECVS_TOP_DIR=${ECVS_TOP_DIR}
496 ECVS_SERVER=$ECVS_SERVER 506 ECVS_SERVER=${ECVS_SERVER}
497 ECVS_USER=$ECVS_USER 507 ECVS_USER=${ECVS_USER}
498 ECVS_PASS=$ECVS_PASS 508 ECVS_PASS=${ECVS_PASS}
499 ECVS_MODULE=$ECVS_MODULE 509 ECVS_MODULE=${ECVS_MODULE}
500 ECVS_LOCAL=$ECVS_LOCAL 510 ECVS_LOCAL=${ECVS_LOCAL}
501 ECVS_RUNAS=$ECVS_RUNAS 511 ECVS_RUNAS=${ECVS_RUNAS}
502 ECVS_LOCALNAME=$ECVS_LOCALNAME" 512 ECVS_LOCALNAME=${ECVS_LOCALNAME}"
503 513
504 [ -z "$ECVS_MODULE" ] && die "ERROR: CVS module not set, cannot continue." 514 [[ -z ${ECVS_MODULE} ]] && die "ERROR: CVS module not set, cannot continue."
505 515
506 local ECVS_LOCALNAME="${ECVS_LOCALNAME}" 516 local ECVS_LOCALNAME=${ECVS_LOCALNAME:-${ECVS_MODULE}}
507
508 if [ -z "$ECVS_LOCALNAME" ]; then
509 ECVS_LOCALNAME="$ECVS_MODULE"
510 fi
511 517
512 local sanitized_pn=$(echo "${PN}" | LC_ALL=C sed -e 's:[^A-Za-z0-9_]:_:g') 518 local sanitized_pn=$(echo "${PN}" | LC_ALL=C sed -e 's:[^A-Za-z0-9_]:_:g')
513 local offline_pkg_var="ECVS_OFFLINE_${sanitized_pn}" 519 local offline_pkg_var="ECVS_OFFLINE_${sanitized_pn}"
514 if [ "${!offline_pkg_var}" == "1" -o "$ECVS_OFFLINE" == "1" -o "$ECVS_SERVER" == "offline" ]; then 520 if [[ -n ${!offline_pkg_var}${ECVS_OFFLINE} ]] || [[ ${ECVS_SERVER} == "offline" ]] ; then
515 # We're not required to fetch anything; the module already 521 # We're not required to fetch anything; the module already
516 # exists and shouldn't be updated. 522 # exists and shouldn't be updated.
517 if [ -d "${ECVS_TOP_DIR}/${ECVS_LOCALNAME}" ]; then 523 if [[ -d ${ECVS_TOP_DIR}/${ECVS_LOCALNAME} ]] ; then
518 debug-print "$FUNCNAME: offline mode" 524 debug-print "${FUNCNAME}: offline mode"
519 else 525 else
520 debug-print "$FUNCNAME: Offline mode specified but directory ${ECVS_TOP_DIR}/${ECVS_LOCALNAME} not found, exiting with error" 526 debug-print "${FUNCNAME}: Offline mode specified but directory ${ECVS_TOP_DIR}/${ECVS_LOCALNAME} not found, exiting with error"
521 die "ERROR: Offline mode specified, but directory ${ECVS_TOP_DIR}/${ECVS_LOCALNAME} not found. Aborting." 527 die "ERROR: Offline mode specified, but directory ${ECVS_TOP_DIR}/${ECVS_LOCALNAME} not found. Aborting."
522 fi 528 fi
523 elif [ -n "$ECVS_SERVER" ]; then # ECVS_SERVER!=offline --> real fetching mode 529 elif [[ -n ${ECVS_SERVER} ]] ; then # ECVS_SERVER!=offline --> real fetching mode
524 einfo "Fetching CVS module $ECVS_MODULE into $ECVS_TOP_DIR ..." 530 einfo "Fetching CVS module ${ECVS_MODULE} into ${ECVS_TOP_DIR} ..."
525 cvs_fetch 531 cvs_fetch
526 else # ECVS_SERVER not set 532 else # ECVS_SERVER not set
527 die "ERROR: CVS server not specified, cannot continue." 533 die "ERROR: CVS server not specified, cannot continue."
528 fi 534 fi
529 535
530 einfo "Copying $ECVS_MODULE from $ECVS_TOP_DIR ..." 536 einfo "Copying ${ECVS_MODULE} from ${ECVS_TOP_DIR} ..."
531 debug-print "Copying module $ECVS_MODULE local_mode=$ECVS_LOCAL from $ECVS_TOP_DIR ..." 537 debug-print "Copying module ${ECVS_MODULE} local_mode=${ECVS_LOCAL} from ${ECVS_TOP_DIR} ..."
532 538
533 # This is probably redundant, but best to make sure. 539 # This is probably redundant, but best to make sure.
534 mkdir -p "$WORKDIR/$ECVS_LOCALNAME" 540 mkdir -p "${WORKDIR}/${ECVS_LOCALNAME}"
535 541
536 if [ -n "$ECVS_LOCAL" ]; then 542 if [[ -n ${ECVS_LOCAL} ]] ; then
537 cp -f "$ECVS_TOP_DIR/$ECVS_LOCALNAME"/* "$WORKDIR/$ECVS_LOCALNAME" 543 cp -f "${ECVS_TOP_DIR}/${ECVS_LOCALNAME}"/* "${WORKDIR}/${ECVS_LOCALNAME}"
538 else 544 else
539 cp -Rf "$ECVS_TOP_DIR/$ECVS_LOCALNAME" "$WORKDIR/$ECVS_LOCALNAME/.." 545 cp -Rf "${ECVS_TOP_DIR}/${ECVS_LOCALNAME}" "${WORKDIR}/${ECVS_LOCALNAME}/.."
540 fi 546 fi
547
548 # Not exactly perfect, but should be pretty close #333773
549 export ECVS_VERSION=$(
550 find "${ECVS_TOP_DIR}/${ECVS_LOCALNAME}/" -ipath '*/CVS/Entries' -exec cat {} + | \
551 LC_ALL=C sort | \
552 sha1sum | \
553 awk '{print $1}'
554 )
541 555
542 # If the directory is empty, remove it; empty directories cannot 556 # If the directory is empty, remove it; empty directories cannot
543 # exist in cvs. This happens when, for example, kde-source 557 # exist in cvs. This happens when, for example, kde-source
544 # requests module/doc/subdir which doesn't exist. Still create 558 # requests module/doc/subdir which doesn't exist. Still create
545 # the empty directory in workdir though. 559 # the empty directory in workdir though.
546 if [ "`ls -A \"${ECVS_TOP_DIR}/${ECVS_LOCALNAME}\"`" == "CVS" ]; then 560 if [[ $(ls -A "${ECVS_TOP_DIR}/${ECVS_LOCALNAME}") == "CVS" ]] ; then
547 debug-print "$FUNCNAME: removing empty CVS directory $ECVS_LOCALNAME" 561 debug-print "${FUNCNAME}: removing empty CVS directory ${ECVS_LOCALNAME}"
548 rm -rf "${ECVS_TOP_DIR}/${ECVS_LOCALNAME}" 562 rm -rf "${ECVS_TOP_DIR}/${ECVS_LOCALNAME}"
549 fi 563 fi
550 564
551 # Implement some of base_src_unpack's functionality; note however 565 # Implement some of base_src_unpack's functionality; note however
552 # that base.eclass may not have been inherited! 566 # that base.eclass may not have been inherited!
553 if [ -n "$PATCHES" ]; then 567 if [[ -n ${PATCHES} ]] ; then
554 debug-print "$FUNCNAME: PATCHES=$PATCHES, S=$S, autopatching" 568 debug-print "${FUNCNAME}: PATCHES=${PATCHES,} S=${S}, autopatching"
555 cd "$S" 569 cd "${S}"
556 epatch ${PATCHES} 570 epatch ${PATCHES}
557 # Make sure we don't try to apply patches more than once, 571 # Make sure we don't try to apply patches more than once,
558 # since cvs_src_unpack is usually called several times from 572 # since cvs_src_unpack is usually called several times from
559 # e.g. kde-source_src_unpack 573 # e.g. kde-source_src_unpack
560 export PATCHES="" 574 export PATCHES=""
562 576
563 einfo "CVS module ${ECVS_MODULE} is now in ${WORKDIR}" 577 einfo "CVS module ${ECVS_MODULE} is now in ${WORKDIR}"
564} 578}
565 579
566EXPORT_FUNCTIONS src_unpack 580EXPORT_FUNCTIONS src_unpack
581
582fi

Legend:
Removed from v.1.71  
changed lines
  Added in v.1.81

  ViewVC Help
Powered by ViewVC 1.1.20