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