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

Diff of /eclass/cvs.eclass

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

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

Legend:
Removed from v.1.49  
changed lines
  Added in v.1.56

  ViewVC Help
Powered by ViewVC 1.1.20