/[gentoo-x86]/eclass/cvs.eclass
Gentoo

Contents of /eclass/cvs.eclass

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.33 - (hide annotations) (download)
Wed Mar 19 11:54:21 2003 UTC (11 years, 1 month ago) by danarmak
Branch: MAIN
Changes since 1.32: +28 -14 lines
fixes: fix cases where an empty password is required, as distinct from having no password at all. remove some redundant code. add extra debug output to keep track of the flow. misc fixes.

1 vapier 1.31 # Copyright 1999-2003 Gentoo Technologies, Inc.
2 vapier 1.22 # Distributed under the terms of the GNU General Public License v2
3 danarmak 1.33 # $Header: /home/cvsroot/gentoo-x86/eclass/cvs.eclass,v 1.32 2003/02/21 14:07:46 phoenix Exp $
4 vapier 1.31 #
5 danarmak 1.1 # Author Dan Armak <danarmak@gentoo.org>
6 vapier 1.31 #
7 danarmak 1.1 # This eclass provides the generic cvs fetching functions.
8    
9     ECLASS=cvs
10     INHERITED="$INHERITED $ECLASS"
11    
12     # You shouldn't change these settings yourself! The ebuild/eclass inheriting this eclass
13     # will take care of that. If you want to set the global KDE cvs ebuilds' settings,
14     # see the comments in kde-source.eclass.
15    
16     # --- begin ebuild-configurable settings
17    
18     # cvs command to run. you can set fex. "cvs -t" for extensive debug information
19     # on the cvs onnection. the default of "cvs -q -f -z4" means to be quiet, to disregard
20     # the ~/.cvsrc config file and to use maximum compression.
21 danarmak 1.8 [ -z "$ECVS_CVS_COMMAND" ] && ECVS_CVS_COMMAND="cvs -q -f -z4"
22 danarmak 1.1
23 danarmak 1.7 # cvs options given after the command (i.e. cvs update foo)
24     # don't remove -dP or things won't work
25     [ -z "$ECVS_CVS_OPTIONS" ] && ECVS_CVS_OPTIONS="-dP"
26    
27     # set this for the module/subdir to be fetched non-recursively
28     #[ -n "$ECVS_LOCAL" ] && ECVS_CVS_OPTIONS="$ECVS_CVS_OPTIONS -l"
29    
30 danarmak 1.1 # Where the cvs modules are stored/accessed
31 danarmak 1.14 [ -z "$ECVS_TOP_DIR" ] && ECVS_TOP_DIR="${DISTDIR}/cvs-src"
32 danarmak 1.1
33 danarmak 1.9 # Name of cvs server, set to "offline" to disable fetching
34 danarmak 1.1 # (i.e. to assume module is checked out already and don't update it).
35     # Format is server:/dir e.g. "anoncvs.kde.org:/home/kde". remove the other
36     # parts of the full CVSROOT (which looks like
37     # ":pserver:anonymous@anoncvs.kde.org:/home/kde"); these are added from
38     # other settings
39 danarmak 1.9 [ -z "$ECVS_SERVER" ] && ECVS_SERVER="offline"
40 danarmak 1.1
41 danarmak 1.23 # Anonymous cvs login?
42     # if 'yes' uses :pserver: with empty password, if 'no' uses :ext: with $ECVS_PASS, other values not allowed
43     [ -z "$ECVS_ANON" ] && ECVS_ANON="yes"
44    
45 phoenix 1.24 # Authentication method to use on ECVS_ANON="no" - possible values are "pserver" and "ext"
46     [ -z "$ECVS_AUTH" ] && ECVS_AUTH="ext"
47    
48     # Use su to run cvs as user
49     [ -z "$ECVS_RUNAS" ] && ECVS_RUNAS="`whoami`"
50    
51 danarmak 1.1 # Username to use
52     [ -z "$ECVS_USER" ] && ECVS_USER="anonymous"
53    
54 phoenix 1.32 # Password to use if anonymous login is off, or if 'anonymous' pserver access
55     # uses a password and ECVS_ANON = yes
56 danarmak 1.1 [ -z "$ECVS_PASS" ] && ECVS_PASS=""
57    
58     # Module to be fetched, must be set explicitly -
59 danarmak 1.12 # I don't like the former ="$PN" default setting
60     [ -z "$ECVS_MODULE" ] && debug-print "$ECLASS: error: ECVS_MODULE not set, cannot continue"
61 danarmak 1.1
62 danarmak 1.14 # Branch/tag to use, default is HEAD
63     # uncomment the following line to enable the reset-branch-to-HEAD behaviour
64     [ -z "$ECVS_BRANCH" ] && ECVS_BRANCH="HEAD"
65    
66 danarmak 1.6 # Subdirectory in module to be fetched, default is not defined = whole module
67     # DO NOT set default to "", if it's defined at all code will break!
68     # don't uncomment following line!
69 danarmak 1.18 #[ -z "$ECVS_SUBDIR" ] && ECVS_SUBDIR=""
70 danarmak 1.1
71     # --- end ebuild-configurable settings ---
72    
73 danarmak 1.6 # add cvs to deps
74 danarmak 1.23 DEPEND="$DEPEND dev-util/cvs dev-python/pexpect"
75 danarmak 1.1
76     # since we now longer have src_fetch as a redefinable ebuild function,
77     # we are forced to call this function from cvs_src_unpack
78     cvs_fetch() {
79    
80     debug-print-function $FUNCNAME $*
81    
82 danarmak 1.6 debug-print "$FUNCNAME: init:
83 danarmak 1.33 9ECVS_CVS_COMMAND=$ECVS_CVS_COMMAND
84 danarmak 1.7 ECVS_CVS_OPTIONS=$ECVS_CVS_OPTIONS
85 danarmak 1.6 ECVS_TOP_DIR=$ECVS_TOP_DIR
86     ECVS_SERVER=$ECVS_SERVER
87 danarmak 1.23 ECVS_ANON=$ECVS_ANON
88 danarmak 1.6 ECVS_USER=$ECVS_USER
89     ECVS_PASS=$ECVS_PASS
90     ECS_MODULE=$ECVS_MODULE
91 danarmak 1.18 ECVS_SUBDIR=$ECVS_SUBDIR
92 danarmak 1.7 ECVS_LOCAL=$ECVS_LOCAL
93 danarmak 1.6 DIR=$DIR"
94 danarmak 1.14
95 danarmak 1.6 # a shorthand
96 danarmak 1.17 DIR="${ECVS_TOP_DIR}/${ECVS_MODULE}/${ECVS_SUBDIR}"
97 danarmak 1.18 debug-print "$FUNCNAME: now DIR=$DIR"
98 danarmak 1.7
99 danarmak 1.9 if [ "$ECVS_SERVER" == "offline" ]; then
100 danarmak 1.1 # we're not required to fetch anything, the module already exists and shouldn't be updated
101 danarmak 1.21 if [ -d "$DIR" ]; then
102 danarmak 1.1 debug-print "$FUNCNAME: offline mode, exiting"
103     return 0
104 danarmak 1.21 else
105 danarmak 1.6 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 danarmak 1.1 return 1
108 danarmak 1.21 fi
109 danarmak 1.1 fi
110 danarmak 1.18
111 danarmak 1.17 # create target directory as needed
112     if [ ! -d "$DIR" ]; then
113     debug-print "$FUNCNAME: creating cvs directory $DIR"
114     #export SANDBOX_WRITE="$SANDBOX_WRITE:/foobar:/"
115     addwrite /foobar
116     addwrite /
117 danarmak 1.26 mkdir -p "/$DIR"
118     export SANDBOX_WRITE="${SANDBOX_WRITE//:\/foobar:\/}"
119 danarmak 1.17 fi
120 danarmak 1.1
121 danarmak 1.17 # in case ECVS_TOP_DIR is a symlink to a dir, get the real dir's path,
122     # otherwise addwrite() doesn't work.
123 danarmak 1.26 cd -P "$ECVS_TOP_DIR" > /dev/null
124 danarmak 1.17 ECVS_TOP_DIR="`/bin/pwd`"
125 danarmak 1.18 DIR="${ECVS_TOP_DIR}/${ECVS_MODULE}/${ECVS_SUBDIR}"
126 danarmak 1.26 cd "$OLDPWD"
127 danarmak 1.17
128 danarmak 1.18 debug-print "$FUNCNAME: now DIR=$DIR"
129    
130 danarmak 1.6 # disable the sandbox for this dir
131     # not just $DIR because we want to create moduletopdir/CVS too
132 danarmak 1.26 addwrite "$ECVS_TOP_DIR/$ECVS_MODULE"
133 danarmak 1.17
134     # add option for local (non-recursive) fetching
135     [ -n "$ECVS_LOCAL" ] && ECVS_CVS_OPTIONS="$ECVS_CVS_OPTIONS -l"
136 danarmak 1.6
137 danarmak 1.33 # prepare a cvspass file just for this session, we don't want to mess with ~/.cvspass
138     touch "${T}/cvspass"
139 danarmak 1.6 export CVS_PASSFILE="${T}/cvspass"
140 phoenix 1.24 chown $ECVS_RUNAS "${T}/cvspass"
141 danarmak 1.33
142 danarmak 1.6 # Note: cvs update and checkout commands are unified.
143     # we make sure a CVS/ dir exists in our module subdir with the right
144     # Root and Repository entries in it and cvs update.
145    
146 danarmak 1.23 [ "${ECVS_ANON}" == "yes" ] && \
147     newserver=":pserver:${ECVS_USER}@${ECVS_SERVER}" || \
148 phoenix 1.24 newserver=":${ECVS_AUTH}:${ECVS_USER}@${ECVS_SERVER}"
149 danarmak 1.23
150 danarmak 1.6
151     # CVS/Repository files can't (I think) contain two concatenated slashes
152     if [ -n "$ECVS_SUBDIR" ]; then
153     repository="${ECVS_MODULE}/${ECVS_SUBDIR}"
154     else
155     repository="${ECVS_MODULE}"
156     fi
157    
158     debug-print "$FUNCNAME: Root<-$newserver, Repository<-$repository"
159 danarmak 1.18 debug-print "$FUNCNAME: entering directory $DIR"
160 danarmak 1.26 cd "/$DIR"
161 danarmak 1.17
162 danarmak 1.18 if [ ! -d "CVS" ]; then
163 danarmak 1.6 # create a new CVS/ directory (checkout)
164     debug-print "$FUNCNAME: creating new cvs directory"
165    
166     mkdir CVS
167     echo $newserver > CVS/Root
168     echo $repository > CVS/Repository
169     touch CVS/Entries
170    
171     # if we're checking out a subdirectory only, create a CVS/ dir
172     # in the module's top dir so that the user (and we) can cvs update
173     # from there to get the full module.
174     if [ ! -d "$ECVS_TOP_DIR/$ECVS_MODULE/CVS" ]; then
175     debug-print "$FUNCNAME: Copying CVS/ directory to module top-level dir"
176 danarmak 1.26 cp -r CVS "$ECVS_TOP_DIR/$ECVS_MODULE/"
177     echo $ECVS_MODULE > "$ECVS_TOP_DIR/$ECVS_MODULE/CVS/Repository"
178 danarmak 1.6 fi
179    
180     else
181     #update existing module
182     debug-print "$FUNCNAME: updating existing module/subdir"
183    
184 danarmak 1.1 # Switch servers if needed
185 danarmak 1.6 # cvs keeps the server info in the CVS/Root file in every checked-out dir;
186 danarmak 1.1 # we can fix those files to point to the new server
187     oldserver="`cat CVS/Root`"
188     if [ "$newserver" != "$oldserver" ]; then
189    
190     einfo "Changing CVS server from $oldserver to $newserver:"
191     debug-print "$FUNCNAME: Changing CVS server from $oldserver to $newserver:"
192    
193     einfo "Searching for CVS dirs..."
194     cvsdirs="`find . -iname CVS -print`"
195     debug-print "$FUNCNAME: CVS dirs found:"
196     debug-print "$cvsdirs"
197    
198     einfo "Modifying CVS dirs..."
199     for x in $cvsdirs; do
200     debug-print "In $x"
201 danarmak 1.26 echo $newserver > "$x/Root"
202 danarmak 1.1 done
203    
204     fi
205    
206 danarmak 1.6 fi
207 danarmak 1.14
208     # cvs auto-switches branches, how nice
209     # warning: if we do it this way we get multiple -rX options - harmless i think
210     [ -n "$ECVS_BRANCH" ] && ECVS_CVS_OPTIONS="$ECVS_CVS_OPTIONS -r$ECVS_BRANCH"
211 danarmak 1.1
212 phoenix 1.24 # Chowning the directory
213 danarmak 1.29 if [ "${ECVS_RUNAS}" != "`whoami`" ]; then
214 danarmak 1.26 chown -R "$ECVS_RUNAS" "/$DIR"
215 phoenix 1.24 fi
216    
217 danarmak 1.6 # finally run the cvs update command
218 danarmak 1.18 debug-print "$FUNCNAME: is in dir `/bin/pwd`"
219 danarmak 1.7 debug-print "$FUNCNAME: running $ECVS_CVS_COMMAND update $ECVS_CVS_OPTIONS with $ECVS_SERVER for module $ECVS_MODULE subdir $ECVS_SUBDIR"
220     einfo "Running $ECVS_CVS_COMMAND update $ECVS_CVS_OPTIONS with $ECVS_SERVER for $ECVS_MODULE/$ECVS_SUBDIR..."
221 danarmak 1.23
222     if [ "${ECVS_ANON}" == "no" ]; then
223    
224     debug-print "$FUNCNAME: starting non-anonymous cvs login..."
225     # CVS Login - written in python :: the right way ;)
226     # Tilman Klar, <phoenix@gentoo.org>
227    
228     export CVS_RSH="/usr/bin/ssh"
229    
230     ############################## inline-python #####################################
231     /usr/bin/env python << EndOfFile
232    
233     import pexpect,os
234    
235     mypasswd = "${ECVS_PASS}"
236 phoenix 1.24 myauth = "${ECVS_AUTH}"
237 danarmak 1.23 mytimeout = 10
238    
239 danarmak 1.29 if "${ECVS_RUNAS}" == "`whoami`":
240     mycommand = "${ECVS_CVS_COMMAND} update ${ECVS_CVS_OPTIONS}"
241     else:
242     mycommand = "su ${ECVS_RUNAS} -c \"${ECVS_CVS_COMMAND} update ${ECVS_CVS_OPTIONS}\""
243    
244 phoenix 1.24 if myauth == "ext":
245     child = pexpect.spawn(mycommand)
246    
247     index = child.expect(['continue connecting','word:'], mytimeout)
248     if index == 0:
249     child.sendline('yes')
250     ## Added server to ~/.ssh/known_hosts
251     child.expect('word:', mytimeout)
252     else:
253     ## Server already is in ~/.ssh/known_hosts
254     pass
255    
256     child.sendline(mypasswd)
257     child.expect(pexpect.EOF)
258    
259     elif myauth == "pserver":
260 cretin 1.30 if "${ECVS_RUNAS}" == "`whoami`":
261     mycommand2 = "cvs login"
262     else:
263     mycommand2 = "su ${ECVS_RUNAS} -c \"cvs login\""
264     child = pexpect.spawn(mycommand2)
265 phoenix 1.24 child.expect("CVS password:",mytimeout)
266     child.sendline(mypasswd)
267     child.expect(pexpect.EOF)
268 danarmak 1.23
269 phoenix 1.24 # Logged in - checking out
270 danarmak 1.29 os.system(mycommand)
271    
272 danarmak 1.23 EndOfFile
273     ########################### End of inline-python ##################################
274     else
275 phoenix 1.32 # is anonymous cvs.
276     # is there a password to use for login with this "anonymous" login
277 danarmak 1.33 if [ -n "$ECVS_PASS" ]; then
278 phoenix 1.32 debug-print "$FUNCNAME: using anonymous cvs login with password"
279    
280     # inline-python #
281     /usr/bin/env python << EndOfFile
282    
283     import pexpect,os
284    
285     myuser = "${ECVS_USER}"
286     mypasswd = "${ECVS_PASS}"
287    
288     mytimeout = 10
289    
290     # implicitly myauth == "pserver" here.
291     mycommand = "cvs login"
292     child = pexpect.spawn(mycommand)
293     child.expect("CVS password:",mytimeout)
294     child.sendline(mypasswd)
295     child.expect(pexpect.EOF)
296     EndOfFile
297     # End of inline-python #
298    
299 danarmak 1.33 else
300     debug-print "$FUNCNAME: using anonymous cvs login (without password)"
301     # passwordless, truly anonymous login; or login with empty (but existing)
302     # password.
303     # make cvs think we're logged in at the cvs server,
304     # because i don't trust myself to write the right code for the case
305     # where the password is empty but still required (what's the bash test
306     # to see if a variable is defined? -n returns false if it is defined
307     # but empty...)
308     echo ":pserver:${ECVS_SERVER} A" > "${T}/cvspass"
309     # remember we did this so we don't try to run cvs logout later
310     DONT_LOGOUT=yes
311 phoenix 1.32 fi
312 danarmak 1.33
313     debug-print "$FUNCNAME: running $ECVS_CVS_COMMAND update $ECVS_CVS_OPTIONS"
314 danarmak 1.23 $ECVS_CVS_COMMAND update $ECVS_CVS_OPTIONS || die "died running cvs update"
315 phoenix 1.32
316 danarmak 1.23 fi
317    
318 danarmak 1.33 # log out and restore ownership as needed
319     if [ -z "$DONT_LOGOUT" ]; then
320     debug-print "$FUNCNAME: cvs logout stuff"
321     if [ "$ECVS_RUNAS" == "`whoami`" ]; then
322     cvs logout &> /dev/null
323     else
324     su $ECVS_RUNAS -c "cvs logout" &> /dev/null
325     fi
326 danarmak 1.29 fi
327 danarmak 1.26 chown `whoami` "${T}/cvspass"
328 danarmak 1.1 }
329    
330     cvs_src_unpack() {
331    
332 danarmak 1.21 debug-print-function $FUNCNAME $*
333 danarmak 1.1 cvs_fetch || die "died running cvs_fetch"
334    
335 danarmak 1.21 einfo "Copying $ECVS_MODULE/$ECVS_SUBDIR from $ECVS_TOP_DIR..."
336 danarmak 1.19 debug-print "Copying module $ECVS_MODULE subdir $ECVS_SUBDIR local_mode=$ECVS_LOCAL from $ECVS_TOP_DIR..."
337    
338     # probably redundant, but best to make sure
339 danarmak 1.26 mkdir -p "$WORKDIR/$ECVS_MODULE/$ECVS_SUBDIR"
340 danarmak 1.7
341     if [ -n "$ECVS_SUBDIR" ]; then
342 danarmak 1.21 if [ -n "$ECVS_LOCAL" ]; then
343 danarmak 1.27 cp -f "$ECVS_TOP_DIR/$ECVS_MODULE/$ECVS_SUBDIR"/* "$WORKDIR/$ECVS_MODULE/$ECVS_SUBDIR"
344 danarmak 1.21 else
345 danarmak 1.26 cp -Rf "$ECVS_TOP_DIR/$ECVS_MODULE/$ECVS_SUBDIR" "$WORKDIR/$ECVS_MODULE/$ECVS_SUBDIR/.."
346 danarmak 1.21 fi
347 danarmak 1.7 else
348 danarmak 1.21 if [ -n "$ECVS_LOCAL" ]; then
349 danarmak 1.27 cp -f "$ECVS_TOP_DIR/$ECVS_MODULE"/* $WORKDIR/$ECVS_MODULE
350 danarmak 1.21 else
351 danarmak 1.26 cp -Rf "$ECVS_TOP_DIR/$ECVS_MODULE" "$WORKDIR"
352 danarmak 1.21 fi
353 danarmak 1.7 fi
354 danarmak 1.10
355     # if the directory is empty, remove it; empty directories cannot exist in cvs.
356     # this happens when fex. kde-source requests module/doc/subdir which doesn't exist.
357     # still create the empty directory in workdir though.
358 danarmak 1.28 if [ "`ls -A \"$DIR\"`" == "CVS" ]; then
359 danarmak 1.10 debug-print "$FUNCNAME: removing cvs-empty directory $ECVS_MODULE/$ECVS_SUBDIR"
360 danarmak 1.26 rm -rf "$DIR"
361 danarmak 1.10 fi
362    
363 danarmak 1.21 # implement some of base_src_unpack's functionality;
364     # note however that base.eclass may not have been inherited!
365     if [ -n "$PATCHES" ]; then
366     debug-print "$FUNCNAME: PATCHES=$PATCHES, S=$S, autopatching"
367 danarmak 1.26 cd "$S"
368 danarmak 1.21 for x in $PATCHES; do
369     debug-print "patching from $x"
370 danarmak 1.26 patch -p0 < "$x"
371 danarmak 1.21 done
372     # make sure we don't try to apply patches more than once, since
373     # cvs_src_unpack is usually called several times from e.g. kde-source_src_unpack
374     export PATCHES=""
375     fi
376 danarmak 1.1
377     }
378    
379     EXPORT_FUNCTIONS src_unpack

  ViewVC Help
Powered by ViewVC 1.1.20