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