1 |
# Copyright 1999-2000 Gentoo Technologies, Inc. |
2 |
# Distributed under the terms of the GNU General Public License, v2 or later |
3 |
# Author Dan Armak <danarmak@gentoo.org> |
4 |
# $Header: /home/cvsroot/gentoo-x86/eclass/cvs.eclass,v 1.14 2002/09/08 16:17:15 danarmak Exp $ |
5 |
# This eclass provides the generic cvs fetching functions. |
6 |
|
7 |
ECLASS=cvs |
8 |
INHERITED="$INHERITED $ECLASS" |
9 |
|
10 |
# You shouldn't change these settings yourself! The ebuild/eclass inheriting this eclass |
11 |
# will take care of that. If you want to set the global KDE cvs ebuilds' settings, |
12 |
# see the comments in kde-source.eclass. |
13 |
|
14 |
# --- begin ebuild-configurable settings |
15 |
|
16 |
# cvs command to run. you can set fex. "cvs -t" for extensive debug information |
17 |
# on the cvs onnection. the default of "cvs -q -f -z4" means to be quiet, to disregard |
18 |
# the ~/.cvsrc config file and to use maximum compression. |
19 |
[ -z "$ECVS_CVS_COMMAND" ] && ECVS_CVS_COMMAND="cvs -q -f -z4" |
20 |
|
21 |
# cvs options given after the command (i.e. cvs update foo) |
22 |
# don't remove -dP or things won't work |
23 |
[ -z "$ECVS_CVS_OPTIONS" ] && ECVS_CVS_OPTIONS="-dP" |
24 |
|
25 |
# set this for the module/subdir to be fetched non-recursively |
26 |
#[ -n "$ECVS_LOCAL" ] && ECVS_CVS_OPTIONS="$ECVS_CVS_OPTIONS -l" |
27 |
|
28 |
# Where the cvs modules are stored/accessed |
29 |
[ -z "$ECVS_TOP_DIR" ] && ECVS_TOP_DIR="${DISTDIR}/cvs-src" |
30 |
|
31 |
# Name of cvs server, set to "offline" to disable fetching |
32 |
# (i.e. to assume module is checked out already and don't update it). |
33 |
# Format is server:/dir e.g. "anoncvs.kde.org:/home/kde". remove the other |
34 |
# parts of the full CVSROOT (which looks like |
35 |
# ":pserver:anonymous@anoncvs.kde.org:/home/kde"); these are added from |
36 |
# other settings |
37 |
[ -z "$ECVS_SERVER" ] && ECVS_SERVER="offline" |
38 |
|
39 |
# Username to use |
40 |
[ -z "$ECVS_USER" ] && ECVS_USER="anonymous" |
41 |
|
42 |
# Password to use (NOT (YET) SUPPORTED, because cvs doesn't store passwords in plaintext in .cvspass) |
43 |
[ -z "$ECVS_PASS" ] && ECVS_PASS="" |
44 |
|
45 |
# Module to be fetched, must be set explicitly - |
46 |
# I don't like the former ="$PN" default setting |
47 |
[ -z "$ECVS_MODULE" ] && debug-print "$ECLASS: error: ECVS_MODULE not set, cannot continue" |
48 |
|
49 |
# Branch/tag to use, default is HEAD |
50 |
# uncomment the following line to enable the reset-branch-to-HEAD behaviour |
51 |
[ -z "$ECVS_BRANCH" ] && ECVS_BRANCH="HEAD" |
52 |
|
53 |
# Subdirectory in module to be fetched, default is not defined = whole module |
54 |
# DO NOT set default to "", if it's defined at all code will break! |
55 |
# don't uncomment following line! |
56 |
#[ -z "$ECVS_MODULE_SUBDIR" ] && ECVS_MODULE_SUBDIR="" |
57 |
|
58 |
# --- end ebuild-configurable settings --- |
59 |
|
60 |
# add cvs to deps |
61 |
DEPEND="$DEPEND dev-util/cvs" |
62 |
|
63 |
# since we now longer have src_fetch as a redefinable ebuild function, |
64 |
# we are forced to call this function from cvs_src_unpack |
65 |
cvs_fetch() { |
66 |
|
67 |
debug-print-function $FUNCNAME $* |
68 |
|
69 |
debug-print "$FUNCNAME: init: |
70 |
ECVS_CVS_COMMAND=$ECVS_CVS_COMMAND |
71 |
ECVS_CVS_OPTIONS=$ECVS_CVS_OPTIONS |
72 |
ECVS_TOP_DIR=$ECVS_TOP_DIR |
73 |
ECVS_SERVER=$ECVS_SERVER |
74 |
ECVS_USER=$ECVS_USER |
75 |
ECVS_PASS=$ECVS_PASS |
76 |
ECS_MODULE=$ECVS_MODULE |
77 |
ECVS_MODULE_SUBDIR=$ECVS_SUBDIR |
78 |
ECVS_LOCAL=$ECVS_LOCAL |
79 |
DIR=$DIR" |
80 |
|
81 |
# if ECVS_TOP_DIR is a symlink to a dir, get the real dir's path, |
82 |
# otherwise addwrite() doesn't work |
83 |
if [ -n "$ECVS_TOP_DIR" ]; then |
84 |
# create $ECVS_TOP_DIR if missing |
85 |
[ ! -d $ECVS_TOP_DIR -a ! -L $ECVS_TOP_DIR ] && mkdir -p $ECVS_TOP_DIR |
86 |
cd -P $ECVS_TOP_DIR |
87 |
ECVS_TOP_DIR="`pwd`" |
88 |
cd $OLDPWD |
89 |
fi |
90 |
|
91 |
# a shorthand |
92 |
[ -n "$ECVS_SUBDIR" ] && DIR="${ECVS_TOP_DIR}/${ECVS_MODULE}/${ECVS_SUBDIR}" || \ |
93 |
DIR="${ECVS_TOP_DIR}/${ECVS_MODULE}" |
94 |
|
95 |
[ -n "$ECVS_LOCAL" ] && ECVS_CVS_OPTIONS="$ECVS_CVS_OPTIONS -l" |
96 |
|
97 |
addread $DIR |
98 |
|
99 |
if [ "$ECVS_SERVER" == "offline" ]; then |
100 |
# we're not required to fetch anything, the module already exists and shouldn't be updated |
101 |
if [ -d "$DIR" ]; then |
102 |
debug-print "$FUNCNAME: offline mode, exiting" |
103 |
return 0 |
104 |
else |
105 |
einfo "ERROR: Offline mode specified, but module/subdir not found. Aborting." |
106 |
debug-print "$FUNCNAME: offline mode specified but module/subdir not found, exiting with error" |
107 |
return 1 |
108 |
fi |
109 |
fi |
110 |
|
111 |
# disable the sandbox for this dir |
112 |
# not just $DIR because we want to create moduletopdir/CVS too |
113 |
addwrite $ECVS_TOP_DIR/$ECVS_MODULE |
114 |
|
115 |
if [ ! -d "$DIR" ]; then |
116 |
debug-print "$FUNCNAME: creating cvs directory $DIR" |
117 |
einfo "Creating directory $DIR" |
118 |
export SANDBOX_WRITE="$SANDBOX_WRITE:/foo:/" |
119 |
mkdir -p /$DIR |
120 |
export SANDBOX_WRITE=${SANDBOX_WRITE//:\/foo:\/} |
121 |
fi |
122 |
|
123 |
# prepare a cvspass file just for this session so that cvs thinks we're logged |
124 |
# in at the cvs server. we don't want to mess with ~/.cvspass. |
125 |
echo ":pserver:${ECVS_SERVER} A" > ${T}/cvspass |
126 |
export CVS_PASSFILE="${T}/cvspass" |
127 |
#export CVSROOT=:pserver:${ECVS_USER}@${ECVS_SERVER} |
128 |
|
129 |
# Note: cvs update and checkout commands are unified. |
130 |
# we make sure a CVS/ dir exists in our module subdir with the right |
131 |
# Root and Repository entries in it and cvs update. |
132 |
|
133 |
newserver=":pserver:${ECVS_USER}@${ECVS_SERVER}" |
134 |
|
135 |
# CVS/Repository files can't (I think) contain two concatenated slashes |
136 |
if [ -n "$ECVS_SUBDIR" ]; then |
137 |
repository="${ECVS_MODULE}/${ECVS_SUBDIR}" |
138 |
else |
139 |
repository="${ECVS_MODULE}" |
140 |
fi |
141 |
|
142 |
debug-print "$FUNCNAME: Root<-$newserver, Repository<-$repository" |
143 |
|
144 |
cd $DIR |
145 |
if [ ! -d "$DIR/CVS" ]; then |
146 |
# create a new CVS/ directory (checkout) |
147 |
debug-print "$FUNCNAME: creating new cvs directory" |
148 |
|
149 |
mkdir CVS |
150 |
echo $newserver > CVS/Root |
151 |
echo $repository > CVS/Repository |
152 |
touch CVS/Entries |
153 |
|
154 |
# if we're checking out a subdirectory only, create a CVS/ dir |
155 |
# in the module's top dir so that the user (and we) can cvs update |
156 |
# from there to get the full module. |
157 |
if [ ! -d "$ECVS_TOP_DIR/$ECVS_MODULE/CVS" ]; then |
158 |
debug-print "$FUNCNAME: Copying CVS/ directory to module top-level dir" |
159 |
cp -r CVS $ECVS_TOP_DIR/$ECVS_MODULE/ |
160 |
echo $ECVS_MODULE > $ECVS_TOP_DIR/$ECVS_MODULE/CVS/Repository |
161 |
fi |
162 |
|
163 |
else |
164 |
#update existing module |
165 |
debug-print "$FUNCNAME: updating existing module/subdir" |
166 |
|
167 |
# Switch servers if needed |
168 |
# cvs keeps the server info in the CVS/Root file in every checked-out dir; |
169 |
# we can fix those files to point to the new server |
170 |
oldserver="`cat CVS/Root`" |
171 |
if [ "$newserver" != "$oldserver" ]; then |
172 |
|
173 |
einfo "Changing CVS server from $oldserver to $newserver:" |
174 |
debug-print "$FUNCNAME: Changing CVS server from $oldserver to $newserver:" |
175 |
|
176 |
einfo "Searching for CVS dirs..." |
177 |
cvsdirs="`find . -iname CVS -print`" |
178 |
debug-print "$FUNCNAME: CVS dirs found:" |
179 |
debug-print "$cvsdirs" |
180 |
|
181 |
einfo "Modifying CVS dirs..." |
182 |
for x in $cvsdirs; do |
183 |
debug-print "In $x" |
184 |
echo $newserver > $x/Root |
185 |
done |
186 |
|
187 |
fi |
188 |
|
189 |
fi |
190 |
|
191 |
# cvs auto-switches branches, how nice |
192 |
# warning: if we do it this way we get multiple -rX options - harmless i think |
193 |
[ -n "$ECVS_BRANCH" ] && ECVS_CVS_OPTIONS="$ECVS_CVS_OPTIONS -r$ECVS_BRANCH" |
194 |
|
195 |
# finally run the cvs update command |
196 |
debug-print "$FUNCNAME: running $ECVS_CVS_COMMAND update $ECVS_CVS_OPTIONS with $ECVS_SERVER for module $ECVS_MODULE subdir $ECVS_SUBDIR" |
197 |
einfo "Running $ECVS_CVS_COMMAND update $ECVS_CVS_OPTIONS with $ECVS_SERVER for $ECVS_MODULE/$ECVS_SUBDIR..." |
198 |
$ECVS_CVS_COMMAND update $ECVS_CVS_OPTIONS || die "died running cvs update" |
199 |
|
200 |
} |
201 |
|
202 |
cvs_src_unpack() { |
203 |
|
204 |
debug-print-function $FUNCNAME $* |
205 |
cvs_fetch || die "died running cvs_fetch" |
206 |
|
207 |
einfo "Copying module $ECVS_MODULE from $ECVS_TOP_DIR..." |
208 |
debug-print "Copying module $ECVS_MODULE from $ECVS_TOP_DIR..." |
209 |
|
210 |
if [ -n "$ECVS_SUBDIR" ]; then |
211 |
mkdir -p $WORKDIR/$ECVS_MODULE/$ECVS_SUBDIR |
212 |
cp -Rf $ECVS_TOP_DIR/$ECVS_MODULE/$ECVS_SUBDIR/* $WORKDIR/$ECVS_MODULE/$ECVS_SUBDIR/ |
213 |
else |
214 |
if [ -n "$ECVS_LOCAL" ]; then |
215 |
cp -f $ECVS_TOP_DIR/$ECVS_MODULE/* $WORKDIR/$ECVS_MODULE |
216 |
else |
217 |
cp -Rf $ECVS_TOP_DIR/$ECVS_MODULE $WORKDIR |
218 |
fi |
219 |
fi |
220 |
|
221 |
# if the directory is empty, remove it; empty directories cannot exist in cvs. |
222 |
# this happens when fex. kde-source requests module/doc/subdir which doesn't exist. |
223 |
# still create the empty directory in workdir though. |
224 |
if [ "`ls -A $DIR`" == "CVS" ]; then |
225 |
debug-print "$FUNCNAME: removing cvs-empty directory $ECVS_MODULE/$ECVS_SUBDIR" |
226 |
rm -rf $DIR |
227 |
fi |
228 |
|
229 |
# implement some of base_src_unpack's functionality; |
230 |
# note however that base.eclass may not have been inherited! |
231 |
if [ -n "$PATCHES" ]; then |
232 |
debug-print "$FUNCNAME: PATCHES=$PATCHES, S=$S, autopatching" |
233 |
cd $S |
234 |
for x in $PATCHES; do |
235 |
debug-print "patching from $x" |
236 |
patch -p0 < $x |
237 |
done |
238 |
# make sure we don't try to apply patches more than once, since |
239 |
# cvs_src_unpack is usually called several times from e.g. kde-source_src_unpack |
240 |
export PATCHES="" |
241 |
fi |
242 |
|
243 |
} |
244 |
|
245 |
EXPORT_FUNCTIONS src_unpack |
246 |
|
247 |
|