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

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

  ViewVC Help
Powered by ViewVC 1.1.20