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

Diff of /eclass/cvs.eclass

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

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

Legend:
Removed from v.1.50  
changed lines
  Added in v.1.79

  ViewVC Help
Powered by ViewVC 1.1.20