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

Diff of /eclass/cvs.eclass

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

Revision 1.55 Revision 1.81
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.55 2005/01/13 04:57:35 vapier Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/cvs.eclass,v 1.81 2013/01/22 07:29:02 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_SERVER -- 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
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.
98 125
126# @ECLASS-VARIABLE: ECVS_BRANCH
127# @DEFAULT_UNSET
128# @DESCRIPTION:
99# ECVS_BRANCH -- the name of the branch/tag to use 129# The name of the branch/tag to use
100 130#
101# The default is "HEAD". The following default _will_ reset your 131# The default is "HEAD". The following default _will_ reset your
102# branch checkout to head if used. 132# branch checkout to head if used.
133#: ${ECVS_BRANCH:="HEAD"}
103 134
104#[ -z "$ECVS_BRANCH" ] && ECVS_BRANCH="HEAD" 135# @ECLASS-VARIABLE: ECVS_AUTH
105 136# @DESCRIPTION:
106
107# ECVS_AUTH -- authentication method to use 137# Authentication method to use
108# 138#
109# Possible values are "pserver" and "ext". If `ext' authentication is 139# 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 140# 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 141# used by default). Currently, the only supported remote shell for
112# `ext' authentication is SSH. 142# `ext' authentication is SSH.
115# - 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
116# does it login 146# does it login
117# e.g. 147# e.g.
118# "cvs -danoncvs@savannah.gnu.org:/cvsroot/backbone co System" 148# "cvs -danoncvs@savannah.gnu.org:/cvsroot/backbone co System"
119# ( from gnustep-apps/textedit ) 149# ( from gnustep-apps/textedit )
120[ -z "$ECVS_AUTH" ] && ECVS_AUTH="pserver" 150: ${ECVS_AUTH:="pserver"}
121 151
152# @ECLASS-VARIABLE: ECVS_USER
153# @DESCRIPTION:
122# ECVS_USER -- Username to use for authentication on the remote server 154# Username to use for authentication on the remote server.
123[ -z "$ECVS_USER" ] && ECVS_USER="anonymous" 155: ${ECVS_USER:="anonymous"}
124 156
125 157# @ECLASS-VARIABLE: ECVS_PASS
158# @DEFAULT_UNSET
159# @DESCRIPTION:
126# ECVS_PASS -- Password to use for authentication on the remote server 160# Password to use for authentication on the remote server
127[ -z "$ECVS_PASS" ] && ECVS_PASS=""
128 161
129 162# @ECLASS-VARIABLE: ECVS_SSH_HOST_KEY
130# ECVS_SSH_HOST_KEY 163# @DEFAULT_UNSET
131# 164# @DESCRIPTION:
132# If SSH is used for `ext' authentication, use this variable to 165# If SSH is used for `ext' authentication, use this variable to
133# 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
134# 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.
135# 168#
136# 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
137# remote host key will not be verified. 170# remote host key will not be verified.
138 171
139 172# @ECLASS-VARIABLE: ECVS_CLEAN
173# @DEFAULT_UNSET
174# @DESCRIPTION:
140# ECVS_CLEAN -- Set this to get a clean copy when updating (passes the 175# Set this to get a clean copy when updating (passes the
141# -C option to cvs update) 176# -C option to cvs update)
142 177
143 178# @ECLASS-VARIABLE: ECVS_RUNAS
144# ECVS_RUNAS 179# @DEFAULT_UNSET
145# 180# @DESCRIPTION:
146# 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
147# b0rked and wouldn't work with portage userpriv anyway without 182# b0rked and wouldn't work with portage userpriv anyway without
148# special magic. 183# special magic.
149 184
150# [ -z "$ECVS_RUNAS" ] && ECVS_RUNAS="`whoami`" 185# : ${ECVS_RUNAS:=$(whoami)}
151
152
153# ECVS_SUBDIR -- deprecated, do not use
154[ -n "$ECVS_SUBDIR" ] && die "ERROR: deprecated ECVS_SUBDIR defined. Please fix this ebuild."
155
156
157# --- end ebuild-configurable settings ---
158 186
159# add cvs to deps 187# add cvs to deps
160# ssh is used for ext auth 188# ssh is used for ext auth
161# sudo is used to run as a specified user 189# sudo is used to run as a specified user
162DEPEND="$DEPEND dev-util/cvs app-admin/sudo" 190DEPEND="dev-vcs/cvs"
163 191
192[[ -n ${ECVS_RUNAS} ]] && DEPEND+=" app-admin/sudo"
193
164if [ "$ECVS_AUTH" == "ext" ]; then 194if [[ ${ECVS_AUTH} == "ext" ]] ; then
165 #default to ssh 195 #default to ssh
166 [ -z "$CVS_RSH" ] && export SSH_RSH="ssh" 196 [[ -z ${CVS_RSH} ]] && export CVS_RSH="ssh"
167 if [ "$CVS_RSH" != "ssh" ]; then 197 if [[ ${CVS_RSH} != "ssh" ]] ; then
168 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"
169 fi 199 fi
170 DEPEND="$DEPEND net-misc/openssh" 200 DEPEND+=" net-misc/openssh"
171fi 201fi
172 202
173# called from cvs_src_unpack 203# called from cvs_src_unpack
174cvs_fetch() { 204cvs_fetch() {
175 205
176 # Make these options local variables so that the global values are 206 # Make these options local variables so that the global values are
177 # not affected by modifications in this function. 207 # not affected by modifications in this function.
178 208
179 local ECVS_COMMAND="${ECVS_COMMAND}" 209 local ECVS_COMMAND=${ECVS_COMMAND}
180 local ECVS_UP_OPTS="${ECVS_UP_OPTS}" 210 local ECVS_UP_OPTS=${ECVS_UP_OPTS}
181 local ECVS_CO_OPTS="${ECVS_CO_OPTS}" 211 local ECVS_CO_OPTS=${ECVS_CO_OPTS}
182 212
183 # Fix for sourceforge which doesnt want -z>3 anymore.
184
185 (echo $ECVS_SERVER | grep -q sourceforge) \
186 && [ "$ECVS_CVS_COMMAND" == "cvs -q -f -z4" ] \
187 && ECVS_CVS_COMMAND="cvs -q -f -z3"
188
189 debug-print-function $FUNCNAME $* 213 debug-print-function ${FUNCNAME} "$@"
190 214
191 # Update variables that are modified by ebuild parameters, which 215 # Update variables that are modified by ebuild parameters, which
192 # 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
193 # every time cvs.eclass is inherited 217 # every time cvs.eclass is inherited
194 218
195
196 # Handle parameter for local (non-recursive) fetching 219 # Handle parameter for local (non-recursive) fetching
197 220
198 if [ -n "$ECVS_LOCAL" ]; then 221 if [[ -n ${ECVS_LOCAL} ]] ; then
199 ECVS_UP_OPTS="$ECVS_UP_OPTS -l" 222 ECVS_UP_OPTS+=" -l"
200 ECVS_CO_OPTS="$ECVS_CO_OPTS -l" 223 ECVS_CO_OPTS+=" -l"
201 fi 224 fi
202 225
203 # Handle ECVS_BRANCH option 226 # Handle ECVS_BRANCH option
204 # 227 #
205 # Because CVS auto-switches branches, we just have to pass the 228 # Because CVS auto-switches branches, we just have to pass the
206 # correct -rBRANCH option when updating. 229 # correct -rBRANCH option when updating.
207 230
208 if [ -n "$ECVS_BRANCH" ]; then 231 if [[ -n ${ECVS_BRANCH} ]] ; then
209 ECVS_UP_OPTS="$ECVS_UP_OPTS -r$ECVS_BRANCH" 232 ECVS_UP_OPTS+=" -r${ECVS_BRANCH}"
210 ECVS_CO_OPTS="$ECVS_CO_OPTS -r$ECVS_BRANCH" 233 ECVS_CO_OPTS+=" -r${ECVS_BRANCH}"
211 fi 234 fi
212 235
213 # Handle ECVS_LOCALNAME, which specifies the local directory name 236 # Handle ECVS_LOCALNAME, which specifies the local directory name
214 # 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
215 # the global -d option. 238 # the global -d option.
216 239
217 if [ "$ECVS_LOCALNAME" != "$ECVS_MODULE" ]; then 240 if [[ ${ECVS_LOCALNAME} != "${ECVS_MODULE}" ]] ; then
218 ECVS_CO_OPTS="$ECVS_CO_OPTS -d $ECVS_LOCALNAME" 241 ECVS_CO_OPTS+=" -d ${ECVS_LOCALNAME}"
219 fi 242 fi
220 243
221
222 if [ -n "$ECVS_CLEAN" ]; then 244 if [[ -n ${ECVS_CLEAN} ]] ; then
223 ECVS_UP_OPTS="$ECVS_UP_OPTS -C" 245 ECVS_UP_OPTS+=" -C"
224 fi 246 fi
225 247
248 if [[ -n ${ECVS_DATE} ]] ; then
249 ECVS_CO_OPTS+=" -D ${ECVS_DATE}"
250 ECVS_UP_OPTS+=" -D ${ECVS_DATE}"
251 fi
226 252
227 # 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,
228 # 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`.
229 255
230 if [ -z "$ECVS_RUNAS" ]; then 256 if [[ -z ${ECVS_RUNAS} ]] ; then
231 run="" 257 run=""
232 else 258 else
233 run="sudo -u $ECVS_RUNAS" 259 run="sudo -u ${ECVS_RUNAS}"
234 fi 260 fi
235 261
236 # Create the top dir if needed 262 # Create the top dir if needed
237 263
238 if [ ! -d "$ECVS_TOP_DIR" ]; then 264 if [[ ! -d ${ECVS_TOP_DIR} ]] ; then
239
240 # Note that the addwrite statements in this block are only 265 # Note that the addwrite statements in this block are only
241 # there to allow creating ECVS_TOP_DIR; we allow writing 266 # there to allow creating ECVS_TOP_DIR; we allow writing
242 # inside it separately. 267 # inside it separately.
243 268
244 # 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
245 # parent path of the directory, which would need to be the 270 # parent path of the directory, which would need to be the
246 # 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
247 # just remove the last path element in the string) 272 # just remove the last path element in the string)
248 273
249 debug-print "$FUNCNAME: checkout mode. creating cvs directory" 274 debug-print "${FUNCNAME}: checkout mode. creating cvs directory"
250 addwrite /foobar 275 addwrite /foobar
251 addwrite / 276 addwrite /
252 $run mkdir -p "/$ECVS_TOP_DIR" 277 ${run} mkdir -p "/${ECVS_TOP_DIR}"
253 export SANDBOX_WRITE="${SANDBOX_WRITE//:\/foobar:\/}" 278 export SANDBOX_WRITE="${SANDBOX_WRITE//:\/foobar:\/}"
254 fi 279 fi
255 280
256 # 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,
257 # otherwise addwrite() doesn't work. 282 # otherwise addwrite() doesn't work.
258 283
259 cd -P "$ECVS_TOP_DIR" > /dev/null 284 cd -P "${ECVS_TOP_DIR}" >/dev/null
260 ECVS_TOP_DIR="`/bin/pwd`" 285 ECVS_TOP_DIR=$(pwd)
261 286
262 # Disable the sandbox for this dir 287 # Disable the sandbox for this dir
263 addwrite "$ECVS_TOP_DIR" 288 addwrite "${ECVS_TOP_DIR}"
264 289
265 # Chown the directory and all of its contents 290 # Chown the directory and all of its contents
266 if [ -n "$ECVS_RUNAS" ]; then 291 if [[ -n ${ECVS_RUNAS} ]] ; then
267 $run chown -R "$ECVS_RUNAS" "/$ECVS_TOP_DIR" 292 ${run} chown -R "${ECVS_RUNAS}" "/${ECVS_TOP_DIR}"
268 fi 293 fi
269 294
270 # Determine the CVS command mode (checkout or update) 295 # Determine the CVS command mode (checkout or update)
271 if [ ! -d "$ECVS_TOP_DIR/$ECVS_LOCALNAME/CVS" ]; then 296 if [[ ! -d ${ECVS_TOP_DIR}/${ECVS_LOCALNAME}/CVS ]] ; then
272 mode=checkout 297 mode=checkout
273 else 298 else
274 mode=update 299 mode=update
275 fi 300 fi
276 301
277
278 # 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
279 # be put in Root 303 # be put in Root
280 if [ "$ECVS_AUTH" == "no" ] 304 if [[ ${ECVS_AUTH} == "no" ]] ; then
281 then
282 local server="${ECVS_USER}@${ECVS_SERVER}" 305 local server="${ECVS_USER}@${ECVS_SERVER}"
283 else 306 else
307 local connection="${ECVS_AUTH}"
308 [[ -n ${ECVS_PROXY} ]] && connection+=";proxy=${ECVS_PROXY}"
309 [[ -n ${ECVS_PROXY_PORT} ]] && connection+=";proxyport=${ECVS_PROXY_PORT}"
284 local server=":${ECVS_AUTH}:${ECVS_USER}@${ECVS_SERVER}" 310 local server=":${connection}:${ECVS_USER}@${ECVS_SERVER}"
285 fi 311 fi
286 312
287 # Switch servers automagically if needed 313 # Switch servers automagically if needed
288 if [ "$mode" == "update" ]; then 314 if [[ ${mode} == "update" ]] ; then
289 cd /$ECVS_TOP_DIR/$ECVS_LOCALNAME 315 cd "/${ECVS_TOP_DIR}/${ECVS_LOCALNAME}"
290 local oldserver="`$run cat CVS/Root`" 316 local oldserver=$(${run} cat CVS/Root)
291 if [ "$server" != "$oldserver" ]; then 317 if [[ ${server} != "${oldserver}" ]] ; then
292
293 einfo "Changing the CVS server from $oldserver to $server:" 318 einfo "Changing the CVS server from ${oldserver} to ${server}:"
294 debug-print "$FUNCNAME: Changing the CVS server from $oldserver to $server:" 319 debug-print "${FUNCNAME}: Changing the CVS server from ${oldserver} to ${server}:"
295 320
296 einfo "Searching for CVS directories ..." 321 einfo "Searching for CVS directories ..."
297 local cvsdirs="`$run find . -iname CVS -print`" 322 local cvsdirs=$(${run} find . -iname CVS -print)
298 debug-print "$FUNCNAME: CVS directories found:" 323 debug-print "${FUNCNAME}: CVS directories found:"
299 debug-print "$cvsdirs" 324 debug-print "${cvsdirs}"
300 325
301 einfo "Modifying CVS directories ..." 326 einfo "Modifying CVS directories ..."
327 local x
302 for x in $cvsdirs; do 328 for x in ${cvsdirs} ; do
303 debug-print "In $x" 329 debug-print "In ${x}"
304 $run echo "$server" > "$x/Root" 330 ${run} echo "${server}" > "${x}/Root"
305 done 331 done
306
307 fi 332 fi
308 fi 333 fi
309 334
310 # 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
311 # mess with ~/.cvspass 336 # mess with ~/.cvspass
312 touch "${T}/cvspass" 337 touch "${T}/cvspass"
313 export CVS_PASSFILE="${T}/cvspass" 338 export CVS_PASSFILE="${T}/cvspass"
314 if [ -n "$ECVS_RUNAS" ]; then 339 if [[ -n ${ECVS_RUNAS} ]] ; then
315 chown "$ECVS_RUNAS" "${T}/cvspass" 340 chown "${ECVS_RUNAS}" "${T}/cvspass"
316 fi 341 fi
317 342
318 # The server string with the password in it, for login 343 # The server string with the password in it, for login
319 cvsroot_pass=":${ECVS_AUTH}:${ECVS_USER}:${ECVS_PASS}@${ECVS_SERVER}" 344 cvsroot_pass=":${ECVS_AUTH}:${ECVS_USER}:${ECVS_PASS}@${ECVS_SERVER}"
320 345
321 # Ditto without the password, for checkout/update after login, so 346 # Ditto without the password, for checkout/update after login, so
322 # 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
323 if [ "$ECVS_AUTH" == "no" ] 348 if [[ ${ECVS_AUTH} == "no" ]] ; then
324 then
325 cvsroot_nopass="${ECVS_USER}@${ECVS_SERVER}" 349 cvsroot_nopass="${ECVS_USER}@${ECVS_SERVER}"
326 else 350 else
327 cvsroot_nopass=":${ECVS_AUTH}:${ECVS_USER}@${ECVS_SERVER}" 351 cvsroot_nopass=":${ECVS_AUTH}:${ECVS_USER}@${ECVS_SERVER}"
328 fi 352 fi
329 353
333 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}"
334 358
335 # Execute commands 359 # Execute commands
336 360
337 cd "${ECVS_TOP_DIR}" 361 cd "${ECVS_TOP_DIR}"
338 if [ "${ECVS_AUTH}" == "pserver" ]; then 362 if [[ ${ECVS_AUTH} == "pserver" ]] ; then
339 einfo "Running $cmdlogin" 363 einfo "Running ${cmdlogin}"
340 eval $cmdlogin || die "cvs login command failed" 364 eval ${cmdlogin} || die "cvs login command failed"
341 if [ "${mode}" == "update" ]; then 365 if [[ ${mode} == "update" ]] ; then
342 einfo "Running $cmdupdate" 366 einfo "Running ${cmdupdate}"
343 eval $cmdupdate || die "cvs update command failed" 367 eval ${cmdupdate} || die "cvs update command failed"
344 elif [ "${mode}" == "checkout" ]; then 368 elif [[ ${mode} == "checkout" ]] ; then
345 einfo "Running $cmdcheckout" 369 einfo "Running ${cmdcheckout}"
346 eval $cmdcheckout|| die "cvs checkout command failed" 370 eval ${cmdcheckout} || die "cvs checkout command failed"
347 fi 371 fi
348 elif [ "${ECVS_AUTH}" == "ext" ] || [ "${ECVS_AUTH}" == "no" ]; then 372 elif [[ ${ECVS_AUTH} == "ext" || ${ECVS_AUTH} == "no" ]] ; then
349
350 # Hack to support SSH password authentication 373 # Hack to support SSH password authentication
351 374
352 # Backup environment variable values 375 # Backup environment variable values
353 local CVS_ECLASS_ORIG_CVS_RSH="${CVS_RSH}" 376 local CVS_ECLASS_ORIG_CVS_RSH="${CVS_RSH}"
354 377
355 if [ "${SSH_ASKPASS+set}" == "set" ]; then 378 if [[ ${SSH_ASKPASS+set} == "set" ]] ; then
356 local CVS_ECLASS_ORIG_SSH_ASKPASS="${SSH_ASKPASS}" 379 local CVS_ECLASS_ORIG_SSH_ASKPASS="${SSH_ASKPASS}"
357 else 380 else
358 unset CVS_ECLASS_ORIG_SSH_ASKPASS 381 unset CVS_ECLASS_ORIG_SSH_ASKPASS
359 fi 382 fi
360 383
361 if [ "${DISPLAY+set}" == "set" ]; then 384 if [[ ${DISPLAY+set} == "set" ]] ; then
362 local CVS_ECLASS_ORIG_DISPLAY="${DISPLAY}" 385 local CVS_ECLASS_ORIG_DISPLAY="${DISPLAY}"
363 else 386 else
364 unset CVS_ECLASS_ORIG_DISPLAY 387 unset CVS_ECLASS_ORIG_DISPLAY
365 fi 388 fi
366 389
367 if [ "${CVS_RSH}" == "ssh" ]; then 390 if [[ ${CVS_RSH} == "ssh" ]] ; then
368
369 # Force SSH to use SSH_ASKPASS by creating python wrapper 391 # Force SSH to use SSH_ASKPASS by creating python wrapper
370 392
371 export CVS_RSH="${T}/cvs_sshwrapper" 393 export CVS_RSH="${T}/cvs_sshwrapper"
372 cat > "${CVS_RSH}"<<EOF 394 cat > "${CVS_RSH}"<<EOF
373#!/usr/bin/python 395#!/usr/bin/python
398 420
399 local CVS_ECLASS_KNOWN_HOSTS="${T}/cvs_ssh_known_hosts" 421 local CVS_ECLASS_KNOWN_HOSTS="${T}/cvs_ssh_known_hosts"
400 echo "newarglist.insert(1, '-oUserKnownHostsFile=${CVS_ECLASS_KNOWN_HOSTS}')" \ 422 echo "newarglist.insert(1, '-oUserKnownHostsFile=${CVS_ECLASS_KNOWN_HOSTS}')" \
401 >> "${CVS_RSH}" 423 >> "${CVS_RSH}"
402 424
403 if [ -z "${ECVS_SSH_HOST_KEY}" ]; then 425 if [[ -z ${ECVS_SSH_HOST_KEY} ]] ; then
404 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."
405 einfo "A temporary known hosts list will be used." 427 einfo "A temporary known hosts list will be used."
406 local CVS_ECLASS_STRICT_HOST_CHECKING="no" 428 local CVS_ECLASS_STRICT_HOST_CHECKING="no"
407 touch "${CVS_ECLASS_KNOWN_HOSTS}" 429 touch "${CVS_ECLASS_KNOWN_HOSTS}"
408 else 430 else
415 echo "${CVS_ECLASS_STRICT_HOST_CHECKING}')" \ 437 echo "${CVS_ECLASS_STRICT_HOST_CHECKING}')" \
416 >> "${CVS_RSH}" 438 >> "${CVS_RSH}"
417 echo "os.execv('/usr/bin/ssh', newarglist)" \ 439 echo "os.execv('/usr/bin/ssh', newarglist)" \
418 >> "${CVS_RSH}" 440 >> "${CVS_RSH}"
419 441
420 chmod a+x "${CVS_RSH}" 442 chmod a+x "${CVS_RSH}"
421 443
422 # Make sure DISPLAY is set (SSH will not use SSH_ASKPASS 444 # Make sure DISPLAY is set (SSH will not use SSH_ASKPASS
423 # if DISPLAY is not set) 445 # if DISPLAY is not set)
424 446
425 [ -z "${DISPLAY}" ] && DISPLAY="DISPLAY" 447 : ${DISPLAY:="DISPLAY"}
426 export DISPLAY 448 export DISPLAY
427 449
428 # Create a dummy executable to echo $ECVS_PASS 450 # Create a dummy executable to echo ${ECVS_PASS}
429 451
430 export SSH_ASKPASS="${T}/cvs_sshechopass" 452 export SSH_ASKPASS="${T}/cvs_sshechopass"
431 if [ "${ECVS_AUTH}" != "no" ]; then 453 if [[ ${ECVS_AUTH} != "no" ]] ; then
432 echo -en "#!/bin/bash\necho \"$ECVS_PASS\"\n" \ 454 echo -en "#!/bin/bash\necho \"${ECVS_PASS}\"\n" \
433 > "${SSH_ASKPASS}" 455 > "${SSH_ASKPASS}"
434 else 456 else
435 echo -en "#!/bin/bash\nreturn\n" \ 457 echo -en "#!/bin/bash\nreturn\n" \
436 > "${SSH_ASKPASS}" 458 > "${SSH_ASKPASS}"
437
438 fi 459 fi
439 chmod a+x "${SSH_ASKPASS}" 460 chmod a+x "${SSH_ASKPASS}"
440 fi 461 fi
441 462
442 if [ "${mode}" == "update" ]; then 463 if [[ ${mode} == "update" ]] ; then
443 einfo "Running $cmdupdate" 464 einfo "Running ${cmdupdate}"
444 eval $cmdupdate || die "cvs update command failed" 465 eval ${cmdupdate} || die "cvs update command failed"
445 elif [ "${mode}" == "checkout" ]; then 466 elif [[ ${mode} == "checkout" ]] ; then
446 einfo "Running $cmdcheckout" 467 einfo "Running ${cmdcheckout}"
447 eval $cmdcheckout|| die "cvs checkout command failed" 468 eval ${cmdcheckout} || die "cvs checkout command failed"
448 fi 469 fi
449 470
450 # Restore environment variable values 471 # Restore environment variable values
451 export CVS_RSH="${CVS_ECLASS_ORIG_CVS_RSH}" 472 export CVS_RSH="${CVS_ECLASS_ORIG_CVS_RSH}"
452 if [ "${CVS_ECLASS_ORIG_SSH_ASKPASS+set}" == "set" ]; then 473 if [[ ${CVS_ECLASS_ORIG_SSH_ASKPASS+set} == "set" ]] ; then
453 export SSH_ASKPASS="${CVS_ECLASS_ORIG_SSH_ASKPASS}" 474 export SSH_ASKPASS="${CVS_ECLASS_ORIG_SSH_ASKPASS}"
454 else 475 else
455 unset SSH_ASKPASS 476 unset SSH_ASKPASS
456 fi 477 fi
457 478
458 if [ "${CVS_ECLASS_ORIG_DISPLAY+set}" == "set" ]; then 479 if [[ ${CVS_ECLASS_ORIG_DISPLAY+set} == "set" ]] ; then
459 export DISPLAY="${CVS_ECLASS_ORIG_DISPLAY}" 480 export DISPLAY="${CVS_ECLASS_ORIG_DISPLAY}"
460 else 481 else
461 unset DISPLAY 482 unset DISPLAY
462 fi 483 fi
463 fi 484 fi
464 485
465 # Restore ownership. Not sure why this is needed, but someone 486 # Restore ownership. Not sure why this is needed, but someone
466 # added it in the orig ECVS_RUNAS stuff. 487 # added it in the orig ECVS_RUNAS stuff.
467 if [ -n "$ECVS_RUNAS" ]; then 488 if [[ -n ${ECVS_RUNAS} ]] ; then
468 chown `whoami` "${T}/cvspass" 489 chown $(whoami) "${T}/cvspass"
469 fi 490 fi
470 491
471} 492}
472 493
473 494# @FUNCTION: cvs_src_unpack
495# @DESCRIPTION:
496# The cvs src_unpack function, which will be exported
474cvs_src_unpack() { 497cvs_src_unpack() {
475 498
476 debug-print-function $FUNCNAME $* 499 debug-print-function ${FUNCNAME} "$@"
477 500
478 debug-print "$FUNCNAME: init: 501 debug-print "${FUNCNAME}: init:
479 ECVS_CVS_COMMAND=$ECVS_CVS_COMMAND 502 ECVS_CVS_COMMAND=${ECVS_CVS_COMMAND}
480 ECVS_UP_OPTS=$ECVS_UP_OPTS 503 ECVS_UP_OPTS=${ECVS_UP_OPTS}
481 ECVS_CO_OPTS=$ECVS_CO_OPTS 504 ECVS_CO_OPTS=${ECVS_CO_OPTS}
482 ECVS_TOP_DIR=$ECVS_TOP_DIR 505 ECVS_TOP_DIR=${ECVS_TOP_DIR}
483 ECVS_SERVER=$ECVS_SERVER 506 ECVS_SERVER=${ECVS_SERVER}
484 ECVS_USER=$ECVS_USER 507 ECVS_USER=${ECVS_USER}
485 ECVS_PASS=$ECVS_PASS 508 ECVS_PASS=${ECVS_PASS}
486 ECVS_MODULE=$ECVS_MODULE 509 ECVS_MODULE=${ECVS_MODULE}
487 ECVS_LOCAL=$ECVS_LOCAL 510 ECVS_LOCAL=${ECVS_LOCAL}
488 ECVS_RUNAS=$ECVS_RUNAS 511 ECVS_RUNAS=${ECVS_RUNAS}
489 ECVS_LOCALNAME=$ECVS_LOCALNAME" 512 ECVS_LOCALNAME=${ECVS_LOCALNAME}"
490 513
491 [ -z "$ECVS_MODULE" ] && die "ERROR: CVS module not set, cannot continue." 514 [[ -z ${ECVS_MODULE} ]] && die "ERROR: CVS module not set, cannot continue."
492 515
493 local ECVS_LOCALNAME="${ECVS_LOCALNAME}" 516 local ECVS_LOCALNAME=${ECVS_LOCALNAME:-${ECVS_MODULE}}
494 517
495 if [ -z "$ECVS_LOCALNAME" ]; then 518 local sanitized_pn=$(echo "${PN}" | LC_ALL=C sed -e 's:[^A-Za-z0-9_]:_:g')
496 ECVS_LOCALNAME="$ECVS_MODULE" 519 local offline_pkg_var="ECVS_OFFLINE_${sanitized_pn}"
497 fi 520 if [[ -n ${!offline_pkg_var}${ECVS_OFFLINE} ]] || [[ ${ECVS_SERVER} == "offline" ]] ; then
498
499 if [ "$ECVS_SERVER" == "offline" ]; then
500 # We're not required to fetch anything; the module already 521 # We're not required to fetch anything; the module already
501 # exists and shouldn't be updated. 522 # exists and shouldn't be updated.
502 if [ -d "${ECVS_TOP_DIR}/${ECVS_LOCALNAME}" ]; then 523 if [[ -d ${ECVS_TOP_DIR}/${ECVS_LOCALNAME} ]] ; then
503 debug-print "$FUNCNAME: offline mode" 524 debug-print "${FUNCNAME}: offline mode"
504 else 525 else
505 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"
506 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."
507 fi 528 fi
508 elif [ -n "$ECVS_SERVER" ]; then # ECVS_SERVER!=offline --> real fetching mode 529 elif [[ -n ${ECVS_SERVER} ]] ; then # ECVS_SERVER!=offline --> real fetching mode
509 einfo "Fetching CVS module $ECVS_MODULE into $ECVS_TOP_DIR ..." 530 einfo "Fetching CVS module ${ECVS_MODULE} into ${ECVS_TOP_DIR} ..."
510 cvs_fetch 531 cvs_fetch
511 else # ECVS_SERVER not set 532 else # ECVS_SERVER not set
512 die "ERROR: CVS server not specified, cannot continue." 533 die "ERROR: CVS server not specified, cannot continue."
513 fi 534 fi
514 535
515 einfo "Copying $ECVS_MODULE from $ECVS_TOP_DIR ..." 536 einfo "Copying ${ECVS_MODULE} from ${ECVS_TOP_DIR} ..."
516 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} ..."
517 538
518 # This is probably redundant, but best to make sure. 539 # This is probably redundant, but best to make sure.
519 mkdir -p "$WORKDIR/$ECVS_LOCALNAME" 540 mkdir -p "${WORKDIR}/${ECVS_LOCALNAME}"
520 541
521 if [ -n "$ECVS_LOCAL" ]; then 542 if [[ -n ${ECVS_LOCAL} ]] ; then
522 cp -f "$ECVS_TOP_DIR/$ECVS_LOCALNAME"/* "$WORKDIR/$ECVS_LOCALNAME" 543 cp -f "${ECVS_TOP_DIR}/${ECVS_LOCALNAME}"/* "${WORKDIR}/${ECVS_LOCALNAME}"
523 else 544 else
524 cp -Rf "$ECVS_TOP_DIR/$ECVS_LOCALNAME" "$WORKDIR/$ECVS_LOCALNAME/.." 545 cp -Rf "${ECVS_TOP_DIR}/${ECVS_LOCALNAME}" "${WORKDIR}/${ECVS_LOCALNAME}/.."
525 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 )
526 555
527 # If the directory is empty, remove it; empty directories cannot 556 # If the directory is empty, remove it; empty directories cannot
528 # exist in cvs. This happens when, for example, kde-source 557 # exist in cvs. This happens when, for example, kde-source
529 # requests module/doc/subdir which doesn't exist. Still create 558 # requests module/doc/subdir which doesn't exist. Still create
530 # the empty directory in workdir though. 559 # the empty directory in workdir though.
531 if [ "`ls -A \"${ECVS_TOP_DIR}/${ECVS_LOCALNAME}\"`" == "CVS" ]; then 560 if [[ $(ls -A "${ECVS_TOP_DIR}/${ECVS_LOCALNAME}") == "CVS" ]] ; then
532 debug-print "$FUNCNAME: removing empty CVS directory $ECVS_LOCALNAME" 561 debug-print "${FUNCNAME}: removing empty CVS directory ${ECVS_LOCALNAME}"
533 rm -rf "${ECVS_TOP_DIR}/${ECVS_LOCALNAME}" 562 rm -rf "${ECVS_TOP_DIR}/${ECVS_LOCALNAME}"
534 fi 563 fi
535 564
536 # Implement some of base_src_unpack's functionality; note however 565 # Implement some of base_src_unpack's functionality; note however
537 # that base.eclass may not have been inherited! 566 # that base.eclass may not have been inherited!
538 if [ -n "$PATCHES" ]; then 567 if [[ -n ${PATCHES} ]] ; then
539 debug-print "$FUNCNAME: PATCHES=$PATCHES, S=$S, autopatching" 568 debug-print "${FUNCNAME}: PATCHES=${PATCHES,} S=${S}, autopatching"
540 cd "$S" 569 cd "${S}"
541 for x in $PATCHES; do 570 epatch ${PATCHES}
542 debug-print "patching from $x"
543 patch -p0 < "$x"
544 done
545 # 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,
546 # since cvs_src_unpack is usually called several times from 572 # since cvs_src_unpack is usually called several times from
547 # e.g. kde-source_src_unpack 573 # e.g. kde-source_src_unpack
548 export PATCHES="" 574 export PATCHES=""
549 fi 575 fi
550 576
551 einfo "CVS module ${ECVS_MODULE} is now in ${WORKDIR}" 577 einfo "CVS module ${ECVS_MODULE} is now in ${WORKDIR}"
552} 578}
553 579
554EXPORT_FUNCTIONS src_unpack 580EXPORT_FUNCTIONS src_unpack
581
582fi

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

  ViewVC Help
Powered by ViewVC 1.1.20