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

Diff of /eclass/cvs.eclass

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

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

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

  ViewVC Help
Powered by ViewVC 1.1.20