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

Diff of /eclass/cvs.eclass

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

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

Legend:
Removed from v.1.61  
changed lines
  Added in v.1.80

  ViewVC Help
Powered by ViewVC 1.1.20