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

Diff of /eclass/cvs.eclass

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

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

Legend:
Removed from v.1.48  
changed lines
  Added in v.1.70

  ViewVC Help
Powered by ViewVC 1.1.20