1 |
danarmak |
1.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 |
danarmak |
1.12 |
# $Header: /home/cvsroot/gentoo-x86/eclass/cvs.eclass,v 1.11 2002/08/10 12:53:02 danarmak Exp $ |
5 |
danarmak |
1.1 |
# 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 |
danarmak |
1.8 |
[ -z "$ECVS_CVS_COMMAND" ] && ECVS_CVS_COMMAND="cvs -q -f -z4" |
20 |
danarmak |
1.1 |
|
21 |
danarmak |
1.7 |
# 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 |
danarmak |
1.1 |
# Where the cvs modules are stored/accessed |
29 |
|
|
[ -z "$ECVS_TOP_DIR" ] && ECVS_TOP_DIR="/usr/src" |
30 |
|
|
|
31 |
danarmak |
1.9 |
# Name of cvs server, set to "offline" to disable fetching |
32 |
danarmak |
1.1 |
# (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 |
danarmak |
1.9 |
[ -z "$ECVS_SERVER" ] && ECVS_SERVER="offline" |
38 |
danarmak |
1.1 |
|
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 |
danarmak |
1.12 |
# I don't like the former ="$PN" default setting |
47 |
|
|
[ -z "$ECVS_MODULE" ] && debug-print "$ECLASS: error: ECVS_MODULE not set, cannot continue" |
48 |
danarmak |
1.1 |
|
49 |
danarmak |
1.6 |
# Subdirectory in module to be fetched, default is not defined = whole module |
50 |
|
|
# DO NOT set default to "", if it's defined at all code will break! |
51 |
|
|
# don't uncomment following line! |
52 |
|
|
#[ -z "$ECVS_MODULE_SUBDIR" ] && ECVS_MODULE_SUBDIR="" |
53 |
danarmak |
1.1 |
|
54 |
|
|
# --- end ebuild-configurable settings --- |
55 |
|
|
|
56 |
danarmak |
1.6 |
# add cvs to deps |
57 |
|
|
DEPEND="$DEPEND dev-util/cvs" |
58 |
danarmak |
1.1 |
|
59 |
|
|
# since we now longer have src_fetch as a redefinable ebuild function, |
60 |
|
|
# we are forced to call this function from cvs_src_unpack |
61 |
|
|
cvs_fetch() { |
62 |
|
|
|
63 |
|
|
debug-print-function $FUNCNAME $* |
64 |
|
|
|
65 |
danarmak |
1.6 |
debug-print "$FUNCNAME: init: |
66 |
|
|
ECVS_CVS_COMMAND=$ECVS_CVS_COMMAND |
67 |
danarmak |
1.7 |
ECVS_CVS_OPTIONS=$ECVS_CVS_OPTIONS |
68 |
danarmak |
1.6 |
ECVS_TOP_DIR=$ECVS_TOP_DIR |
69 |
|
|
ECVS_SERVER=$ECVS_SERVER |
70 |
|
|
ECVS_USER=$ECVS_USER |
71 |
|
|
ECVS_PASS=$ECVS_PASS |
72 |
|
|
ECS_MODULE=$ECVS_MODULE |
73 |
|
|
ECVS_MODULE_SUBDIR=$ECVS_SUBDIR |
74 |
danarmak |
1.7 |
ECVS_LOCAL=$ECVS_LOCAL |
75 |
danarmak |
1.6 |
DIR=$DIR" |
76 |
|
|
|
77 |
|
|
# a shorthand |
78 |
|
|
[ -n "$ECVS_SUBDIR" ] && DIR="${ECVS_TOP_DIR}/${ECVS_MODULE}/${ECVS_SUBDIR}" || \ |
79 |
|
|
DIR="${ECVS_TOP_DIR}/${ECVS_MODULE}" |
80 |
danarmak |
1.7 |
|
81 |
|
|
[ -n "$ECVS_LOCAL" ] && ECVS_CVS_OPTIONS="$ECVS_CVS_OPTIONS -l" |
82 |
danarmak |
1.6 |
|
83 |
|
|
addread $DIR |
84 |
|
|
|
85 |
danarmak |
1.9 |
if [ "$ECVS_SERVER" == "offline" ]; then |
86 |
danarmak |
1.1 |
# we're not required to fetch anything, the module already exists and shouldn't be updated |
87 |
danarmak |
1.6 |
if [ -d "$DIR" ]; then |
88 |
danarmak |
1.1 |
debug-print "$FUNCNAME: offline mode, exiting" |
89 |
|
|
return 0 |
90 |
|
|
else |
91 |
danarmak |
1.6 |
einfo "ERROR: Offline mode specified, but module/subdir not found. Aborting." |
92 |
|
|
debug-print "$FUNCNAME: offline mode specified but module/subdir not found, exiting with error" |
93 |
danarmak |
1.1 |
return 1 |
94 |
|
|
fi |
95 |
|
|
fi |
96 |
|
|
|
97 |
danarmak |
1.6 |
# disable the sandbox for this dir |
98 |
|
|
|
99 |
|
|
# not just $DIR because we want to create moduletopdir/CVS too |
100 |
|
|
addwrite $ECVS_TOP_DIR/$ECVS_MODULE |
101 |
|
|
|
102 |
|
|
if [ ! -d "$DIR" ]; then |
103 |
|
|
debug-print "$FUNCNAME: creating cvs directory $DIR" |
104 |
|
|
einfo "Creating directory $DIR" |
105 |
danarmak |
1.9 |
export SANDBOX_WRITE="$SANDBOX_WRITE:/foo:/" |
106 |
danarmak |
1.6 |
mkdir -p /$DIR |
107 |
danarmak |
1.9 |
export SANDBOX_WRITE=${SANDBOX_WRITE//:\/foo:\/} |
108 |
danarmak |
1.6 |
fi |
109 |
danarmak |
1.1 |
|
110 |
danarmak |
1.6 |
# prepare a cvspass file just for this session so that cvs thinks we're logged |
111 |
|
|
# in at the cvs server. we don't want to mess with ~/.cvspass. |
112 |
|
|
echo ":pserver:${ECVS_SERVER} A" > ${T}/cvspass |
113 |
|
|
export CVS_PASSFILE="${T}/cvspass" |
114 |
|
|
#export CVSROOT=:pserver:${ECVS_USER}@${ECVS_SERVER} |
115 |
|
|
|
116 |
|
|
# Note: cvs update and checkout commands are unified. |
117 |
|
|
# we make sure a CVS/ dir exists in our module subdir with the right |
118 |
|
|
# Root and Repository entries in it and cvs update. |
119 |
|
|
|
120 |
|
|
newserver=":pserver:anonymous@${ECVS_SERVER}" |
121 |
|
|
|
122 |
|
|
# CVS/Repository files can't (I think) contain two concatenated slashes |
123 |
|
|
if [ -n "$ECVS_SUBDIR" ]; then |
124 |
|
|
repository="${ECVS_MODULE}/${ECVS_SUBDIR}" |
125 |
|
|
else |
126 |
|
|
repository="${ECVS_MODULE}" |
127 |
|
|
fi |
128 |
|
|
|
129 |
|
|
debug-print "$FUNCNAME: Root<-$newserver, Repository<-$repository" |
130 |
danarmak |
1.1 |
|
131 |
danarmak |
1.6 |
cd $DIR |
132 |
|
|
if [ ! -d "$DIR/CVS" ]; then |
133 |
|
|
# create a new CVS/ directory (checkout) |
134 |
|
|
debug-print "$FUNCNAME: creating new cvs directory" |
135 |
|
|
|
136 |
|
|
mkdir CVS |
137 |
|
|
echo $newserver > CVS/Root |
138 |
|
|
echo $repository > CVS/Repository |
139 |
|
|
touch CVS/Entries |
140 |
|
|
|
141 |
|
|
# if we're checking out a subdirectory only, create a CVS/ dir |
142 |
|
|
# in the module's top dir so that the user (and we) can cvs update |
143 |
|
|
# from there to get the full module. |
144 |
|
|
if [ ! -d "$ECVS_TOP_DIR/$ECVS_MODULE/CVS" ]; then |
145 |
|
|
debug-print "$FUNCNAME: Copying CVS/ directory to module top-level dir" |
146 |
|
|
cp -r CVS $ECVS_TOP_DIR/$ECVS_MODULE/ |
147 |
|
|
echo $ECVS_MODULE > $ECVS_TOP_DIR/$ECVS_MODULE/CVS/Repository |
148 |
|
|
fi |
149 |
|
|
|
150 |
|
|
else |
151 |
|
|
#update existing module |
152 |
|
|
debug-print "$FUNCNAME: updating existing module/subdir" |
153 |
|
|
|
154 |
danarmak |
1.1 |
# Switch servers if needed |
155 |
danarmak |
1.6 |
# cvs keeps the server info in the CVS/Root file in every checked-out dir; |
156 |
danarmak |
1.1 |
# we can fix those files to point to the new server |
157 |
|
|
oldserver="`cat CVS/Root`" |
158 |
|
|
if [ "$newserver" != "$oldserver" ]; then |
159 |
|
|
|
160 |
|
|
einfo "Changing CVS server from $oldserver to $newserver:" |
161 |
|
|
debug-print "$FUNCNAME: Changing CVS server from $oldserver to $newserver:" |
162 |
|
|
|
163 |
|
|
einfo "Searching for CVS dirs..." |
164 |
|
|
cvsdirs="`find . -iname CVS -print`" |
165 |
|
|
debug-print "$FUNCNAME: CVS dirs found:" |
166 |
|
|
debug-print "$cvsdirs" |
167 |
|
|
|
168 |
|
|
einfo "Modifying CVS dirs..." |
169 |
|
|
for x in $cvsdirs; do |
170 |
|
|
debug-print "In $x" |
171 |
|
|
echo $newserver > $x/Root |
172 |
|
|
done |
173 |
|
|
|
174 |
|
|
fi |
175 |
|
|
|
176 |
danarmak |
1.6 |
fi |
177 |
danarmak |
1.1 |
|
178 |
danarmak |
1.6 |
# finally run the cvs update command |
179 |
danarmak |
1.7 |
debug-print "$FUNCNAME: running $ECVS_CVS_COMMAND update $ECVS_CVS_OPTIONS with $ECVS_SERVER for module $ECVS_MODULE subdir $ECVS_SUBDIR" |
180 |
|
|
einfo "Running $ECVS_CVS_COMMAND update $ECVS_CVS_OPTIONS with $ECVS_SERVER for $ECVS_MODULE/$ECVS_SUBDIR..." |
181 |
|
|
$ECVS_CVS_COMMAND update $ECVS_CVS_OPTIONS || die "died running cvs update" |
182 |
danarmak |
1.1 |
|
183 |
|
|
} |
184 |
|
|
|
185 |
|
|
cvs_src_unpack() { |
186 |
|
|
|
187 |
|
|
debug-print-function $FUNCNAME $* |
188 |
|
|
cvs_fetch || die "died running cvs_fetch" |
189 |
|
|
|
190 |
|
|
einfo "Copying module $ECVS_MODULE from $ECVS_TOP_DIR..." |
191 |
|
|
debug-print "Copying module $ECVS_MODULE from $ECVS_TOP_DIR..." |
192 |
danarmak |
1.7 |
|
193 |
|
|
if [ -n "$ECVS_SUBDIR" ]; then |
194 |
danarmak |
1.10 |
mkdir -p $WORKDIR/$ECVS_MODULE/$ECVS_SUBDIR |
195 |
|
|
cp -Rf $ECVS_TOP_DIR/$ECVS_MODULE/$ECVS_SUBDIR/* $WORKDIR/$ECVS_MODULE/$ECVS_SUBDIR/ |
196 |
danarmak |
1.7 |
else |
197 |
|
|
if [ -n "$ECVS_LOCAL" ]; then |
198 |
|
|
cp -f $ECVS_TOP_DIR/$ECVS_MODULE/* $WORKDIR/$ECVS_MODULE |
199 |
|
|
else |
200 |
|
|
cp -Rf $ECVS_TOP_DIR/$ECVS_MODULE $WORKDIR |
201 |
|
|
fi |
202 |
|
|
fi |
203 |
danarmak |
1.10 |
|
204 |
|
|
# if the directory is empty, remove it; empty directories cannot exist in cvs. |
205 |
|
|
# this happens when fex. kde-source requests module/doc/subdir which doesn't exist. |
206 |
|
|
# still create the empty directory in workdir though. |
207 |
|
|
if [ "`ls -A $DIR`" == "CVS" ]; then |
208 |
|
|
debug-print "$FUNCNAME: removing cvs-empty directory $ECVS_MODULE/$ECVS_SUBDIR" |
209 |
|
|
rm -rf $DIR |
210 |
|
|
fi |
211 |
|
|
|
212 |
danarmak |
1.5 |
# implement some of base_src_unpack's functionality; |
213 |
|
|
# note however that base.eclass may not have been inherited! |
214 |
|
|
if [ -n "$PATCHES" ]; then |
215 |
|
|
debug-print "$FUNCNAME: PATCHES=$PATCHES, S=$S, autopatching" |
216 |
|
|
cd $S |
217 |
|
|
for x in $PATCHES; do |
218 |
|
|
debug-print "patching from $x" |
219 |
|
|
patch -p0 < $x |
220 |
|
|
done |
221 |
danarmak |
1.11 |
# make sure we don't try to apply patches more than once, since |
222 |
|
|
# cvs_src_unpack is usually called several times from e.g. kde-source_src_unpack |
223 |
|
|
export PATCHES="" |
224 |
danarmak |
1.5 |
fi |
225 |
danarmak |
1.1 |
|
226 |
|
|
} |
227 |
|
|
|
228 |
|
|
EXPORT_FUNCTIONS src_unpack |
229 |
danarmak |
1.5 |
|
230 |
danarmak |
1.1 |
|