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

Diff of /eclass/cvs.eclass

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

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

Legend:
Removed from v.1.59  
changed lines
  Added in v.1.83

  ViewVC Help
Powered by ViewVC 1.1.20