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

Diff of /eclass/cvs.eclass

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

Revision 1.50 Revision 1.60
1# Copyright 1999-2003 Gentoo Technologies, Inc. 1# Copyright 1999-2004 Gentoo Foundation
2# Distributed under the terms of the GNU General Public License v2 2# Distributed under the terms of the GNU General Public License v2
3# $Header: /var/cvsroot/gentoo-x86/eclass/cvs.eclass,v 1.50 2004/01/04 14:35:12 coredumb Exp $ 3# $Header: /var/cvsroot/gentoo-x86/eclass/cvs.eclass,v 1.60 2005/09/21 23:19:08 vapier Exp $
4 4
5# Current Maintainer: Tal Peer <coredumb@gentoo.org> 5inherit eutils
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 6
14# This eclass provides the generic cvs fetching functions. To use 7# This eclass provides the generic cvs fetching functions. To use
15# this from an ebuild, set the `ebuild-configurable settings' as 8# this from an ebuild, set the `ebuild-configurable settings' as
16# specified below in your ebuild before inheriting. Then either leave 9# specified below in your ebuild before inheriting. Then either leave
17# the default src_unpack or extend over cvs_src_unpack. If you find 10# the default src_unpack or extend over cvs_src_unpack. If you find
24 17
25# Support additional remote shells with `ext' authentication (does 18# Support additional remote shells with `ext' authentication (does
26# anyone actually need to use it with anything other than SSH?) 19# anyone actually need to use it with anything other than SSH?)
27 20
28 21
29ECLASS=cvs
30INHERITED="$INHERITED $ECLASS"
31 22
32# Users shouldn't change these settings! The ebuild/eclass inheriting 23# Users shouldn't change these settings! The ebuild/eclass inheriting
33# this eclass will take care of that. If you want to set the global 24# this eclass will take care of that. If you want to set the global
34# KDE cvs ebuilds' settings, see the comments in kde-source.eclass. 25# KDE cvs ebuilds' settings, see the comments in kde-source.eclass.
35 26
73# ECVS_TOP_DIR -- The directory under which CVS modules are checked 64# ECVS_TOP_DIR -- The directory under which CVS modules are checked
74# out. 65# out.
75 66
76[ -z "$ECVS_TOP_DIR" ] && ECVS_TOP_DIR="${DISTDIR}/cvs-src" 67[ -z "$ECVS_TOP_DIR" ] && ECVS_TOP_DIR="${DISTDIR}/cvs-src"
77 68
78# ECVS_NAME -- CVS path 69# ECVS_SERVER -- CVS path
79# 70#
80# The format is "server:/dir", e.g. "anoncvs.kde.org:/home/kde". 71# The format is "server:/dir", e.g. "anoncvs.kde.org:/home/kde".
81# Remove the other parts of the full CVSROOT, which might look like 72# Remove the other parts of the full CVSROOT, which might look like
82# ":pserver:anonymous@anoncvs.kde.org:/home/kde"; this is generated 73# ":pserver:anonymous@anoncvs.kde.org:/home/kde"; this is generated
83# using other settings also. 74# using other settings also.
108# 99#
109# Possible values are "pserver" and "ext". If `ext' authentication is 100# Possible values are "pserver" and "ext". If `ext' authentication is
110# used, the remote shell to use can be specified in CVS_RSH (SSH is 101# used, the remote shell to use can be specified in CVS_RSH (SSH is
111# used by default). Currently, the only supported remote shell for 102# used by default). Currently, the only supported remote shell for
112# `ext' authentication is SSH. 103# `ext' authentication is SSH.
104#
105# Armando Di Cianno <fafhrd@gentoo.org> 2004/09/27
106# - Added "no" as a server type, which uses no AUTH method, nor
107# does it login
108# e.g.
109# "cvs -danoncvs@savannah.gnu.org:/cvsroot/backbone co System"
110# ( from gnustep-apps/textedit )
113[ -z "$ECVS_AUTH" ] && ECVS_AUTH="pserver" 111[ -z "$ECVS_AUTH" ] && ECVS_AUTH="pserver"
114 112
115# ECVS_USER -- Username to use for authentication on the remote server 113# ECVS_USER -- Username to use for authentication on the remote server
116[ -z "$ECVS_USER" ] && ECVS_USER="anonymous" 114[ -z "$ECVS_USER" ] && ECVS_USER="anonymous"
117 115
150# --- end ebuild-configurable settings --- 148# --- end ebuild-configurable settings ---
151 149
152# add cvs to deps 150# add cvs to deps
153# ssh is used for ext auth 151# ssh is used for ext auth
154# sudo is used to run as a specified user 152# sudo is used to run as a specified user
155DEPEND="$DEPEND dev-util/cvs app-admin/sudo" 153DEPEND="dev-util/cvs app-admin/sudo"
156 154
157if [ "$ECVS_AUTH" == "ext" ]; then 155if [ "$ECVS_AUTH" == "ext" ]; then
158 #default to ssh 156 #default to ssh
159 [ -z "$CVS_RSH" ] && export SSH_RSH="ssh" 157 [ -z "$CVS_RSH" ] && export CVS_RSH="ssh"
160 if [ "$CVS_RSH" != "ssh" ]; then 158 if [ "$CVS_RSH" != "ssh" ]; then
161 die "Support for ext auth with clients other than ssh has not been implemented yet" 159 die "Support for ext auth with clients other than ssh has not been implemented yet"
162 fi 160 fi
163 DEPEND="$DEPEND net-misc/openssh" 161 DEPEND="${DEPEND} net-misc/openssh"
164fi 162fi
165 163
166# called from cvs_src_unpack 164# called from cvs_src_unpack
167cvs_fetch() { 165cvs_fetch() {
168 166
183 181
184 # Update variables that are modified by ebuild parameters, which 182 # Update variables that are modified by ebuild parameters, which
185 # should be effective every time cvs_fetch is called, and not just 183 # should be effective every time cvs_fetch is called, and not just
186 # every time cvs.eclass is inherited 184 # every time cvs.eclass is inherited
187 185
188
189 # Handle parameter for local (non-recursive) fetching 186 # Handle parameter for local (non-recursive) fetching
190 187
191 if [ -n "$ECVS_LOCAL" ]; then 188 if [ -n "$ECVS_LOCAL" ]; then
192 ECVS_UP_OPTS="$ECVS_UP_OPTS -l" 189 ECVS_UP_OPTS="$ECVS_UP_OPTS -l"
193 ECVS_CO_OPTS="$ECVS_CO_OPTS -l" 190 ECVS_CO_OPTS="$ECVS_CO_OPTS -l"
194 fi 191 fi
195 192
196 # Handle ECVS_BRANCH option 193 # Handle ECVS_BRANCH option
197 # 194 #
198 # Because CVS auto-switches branches, we just have to pass the 195 # Because CVS auto-switches branches, we just have to pass the
199 # correct -rBRANCH option when updating. 196 # correct -rBRANCH option when updating.
200 197
201 if [ -n "$ECVS_BRANCH" ]; then 198 if [ -n "$ECVS_BRANCH" ]; then
202 ECVS_UP_OPTS="$ECVS_UP_OPTS -r$ECVS_BRANCH" 199 ECVS_UP_OPTS="$ECVS_UP_OPTS -r$ECVS_BRANCH"
268 fi 265 fi
269 266
270 267
271 # Our server string (i.e. CVSROOT) without the password so it can 268 # Our server string (i.e. CVSROOT) without the password so it can
272 # be put in Root 269 # be put in Root
270 if [ "$ECVS_AUTH" == "no" ]
271 then
272 local server="${ECVS_USER}@${ECVS_SERVER}"
273 else
273 local server=":${ECVS_AUTH}:${ECVS_USER}@${ECVS_SERVER}" 274 local server=":${ECVS_AUTH}:${ECVS_USER}@${ECVS_SERVER}"
275 fi
274 276
275 # Switch servers automagically if needed 277 # Switch servers automagically if needed
276 if [ "$mode" == "update" ]; then 278 if [ "$mode" == "update" ]; then
277 cd /$ECVS_TOP_DIR/$ECVS_LOCALNAME 279 cd /$ECVS_TOP_DIR/$ECVS_LOCALNAME
278 local oldserver="`$run cat CVS/Root`" 280 local oldserver="`$run cat CVS/Root`"
279 if [ "$server" != "$oldserver" ]; then 281 if [ "$server" != "$oldserver" ]; then
280 282
281 einfo "Changing the CVS server from $oldserver to $server:" 283 einfo "Changing the CVS server from $oldserver to $server:"
282 debug-print "$FUNCNAME: Changing the CVS server from $oldserver to $server:" 284 debug-print "$FUNCNAME: Changing the CVS server from $oldserver to $server:"
283 285
284 einfo "Searching for CVS directories..." 286 einfo "Searching for CVS directories ..."
285 local cvsdirs="`$run find . -iname CVS -print`" 287 local cvsdirs="`$run find . -iname CVS -print`"
286 debug-print "$FUNCNAME: CVS directories found:" 288 debug-print "$FUNCNAME: CVS directories found:"
287 debug-print "$cvsdirs" 289 debug-print "$cvsdirs"
288 290
289 einfo "Modifying CVS directories..." 291 einfo "Modifying CVS directories ..."
290 for x in $cvsdirs; do 292 for x in $cvsdirs; do
291 debug-print "In $x" 293 debug-print "In $x"
292 $run echo "$server" > "$x/Root" 294 $run echo "$server" > "$x/Root"
293 done 295 done
294 296
306 # The server string with the password in it, for login 308 # The server string with the password in it, for login
307 cvsroot_pass=":${ECVS_AUTH}:${ECVS_USER}:${ECVS_PASS}@${ECVS_SERVER}" 309 cvsroot_pass=":${ECVS_AUTH}:${ECVS_USER}:${ECVS_PASS}@${ECVS_SERVER}"
308 310
309 # Ditto without the password, for checkout/update after login, so 311 # Ditto without the password, for checkout/update after login, so
310 # that the CVS/Root files don't contain the password in plaintext 312 # that the CVS/Root files don't contain the password in plaintext
313 if [ "$ECVS_AUTH" == "no" ]
314 then
315 cvsroot_nopass="${ECVS_USER}@${ECVS_SERVER}"
316 else
311 cvsroot_nopass=":${ECVS_AUTH}:${ECVS_USER}@${ECVS_SERVER}" 317 cvsroot_nopass=":${ECVS_AUTH}:${ECVS_USER}@${ECVS_SERVER}"
318 fi
312 319
313 # Commands to run 320 # Commands to run
314 cmdlogin="${run} ${ECVS_CVS_COMMAND} -d \"${cvsroot_pass}\" login" 321 cmdlogin="${run} ${ECVS_CVS_COMMAND} -d \"${cvsroot_pass}\" login"
315 cmdupdate="${run} ${ECVS_CVS_COMMAND} -d \"${cvsroot_nopass}\" update ${ECVS_UP_OPTS} ${ECVS_LOCALNAME}" 322 cmdupdate="${run} ${ECVS_CVS_COMMAND} -d \"${cvsroot_nopass}\" update ${ECVS_UP_OPTS} ${ECVS_LOCALNAME}"
316 cmdcheckout="${run} ${ECVS_CVS_COMMAND} -d \"${cvsroot_nopass}\" checkout ${ECVS_CO_OPTS} ${ECVS_MODULE}" 323 cmdcheckout="${run} ${ECVS_CVS_COMMAND} -d \"${cvsroot_nopass}\" checkout ${ECVS_CO_OPTS} ${ECVS_MODULE}"
323 eval $cmdlogin || die "cvs login command failed" 330 eval $cmdlogin || die "cvs login command failed"
324 if [ "${mode}" == "update" ]; then 331 if [ "${mode}" == "update" ]; then
325 einfo "Running $cmdupdate" 332 einfo "Running $cmdupdate"
326 eval $cmdupdate || die "cvs update command failed" 333 eval $cmdupdate || die "cvs update command failed"
327 elif [ "${mode}" == "checkout" ]; then 334 elif [ "${mode}" == "checkout" ]; then
328 einfo "Running $cmdcheckout" 335 einfo "Running $cmdcheckout"
329 eval $cmdcheckout|| die "cvs checkout command failed" 336 eval $cmdcheckout|| die "cvs checkout command failed"
330 fi 337 fi
331 elif [ "${ECVS_AUTH}" == "ext" ]; then 338 elif [ "${ECVS_AUTH}" == "ext" ] || [ "${ECVS_AUTH}" == "no" ]; then
332 339
333 # Hack to support SSH password authentication 340 # Hack to support SSH password authentication
334 341
335 # Backup environment variable values 342 # Backup environment variable values
336 local CVS_ECLASS_ORIG_CVS_RSH="${CVS_RSH}" 343 local CVS_ECLASS_ORIG_CVS_RSH="${CVS_RSH}"
368except: 375except:
369 pass 376 pass
370newarglist = sys.argv[:] 377newarglist = sys.argv[:]
371EOF 378EOF
372 379
380 # disable X11 forwarding which causes .xauth access violations
381 # - 20041205 Armando Di Cianno <fafhrd@gentoo.org>
382 echo "newarglist.insert(1, '-oClearAllForwardings=yes')" \
383 >> "${CVS_RSH}"
384 echo "newarglist.insert(1, '-oForwardX11=no')" \
385 >> "${CVS_RSH}"
386
373 # Handle SSH host key checking 387 # Handle SSH host key checking
374 388
375 local CVS_ECLASS_KNOWN_HOSTS="${T}/cvs_ssh_known_hosts" 389 local CVS_ECLASS_KNOWN_HOSTS="${T}/cvs_ssh_known_hosts"
376 echo "newarglist.insert(1, '-oUserKnownHostsFile=${CVS_ECLASS_KNOWN_HOSTS}')" \ 390 echo "newarglist.insert(1, '-oUserKnownHostsFile=${CVS_ECLASS_KNOWN_HOSTS}')" \
377 >> "${CVS_RSH}" 391 >> "${CVS_RSH}"
379 if [ -z "${ECVS_SSH_HOST_KEY}" ]; then 393 if [ -z "${ECVS_SSH_HOST_KEY}" ]; then
380 ewarn "Warning: The SSH host key of the remote server will not be verified." 394 ewarn "Warning: The SSH host key of the remote server will not be verified."
381 einfo "A temporary known hosts list will be used." 395 einfo "A temporary known hosts list will be used."
382 local CVS_ECLASS_STRICT_HOST_CHECKING="no" 396 local CVS_ECLASS_STRICT_HOST_CHECKING="no"
383 touch "${CVS_ECLASS_KNOWN_HOSTS}" 397 touch "${CVS_ECLASS_KNOWN_HOSTS}"
384 echo "newarglist.insert(1, '-oStrictHostKeyChecking=no')" \
385 >> "${CVS_RSH}"
386 else 398 else
387 local CVS_ECLASS_STRICT_HOST_CHECKING="yes" 399 local CVS_ECLASS_STRICT_HOST_CHECKING="yes"
388 echo "${ECVS_SSH_HOST_KEY}" > "${CVS_ECLASS_KNOWN_HOSTS}" 400 echo "${ECVS_SSH_HOST_KEY}" > "${CVS_ECLASS_KNOWN_HOSTS}"
389 fi 401 fi
390 402
393 echo "${CVS_ECLASS_STRICT_HOST_CHECKING}')" \ 405 echo "${CVS_ECLASS_STRICT_HOST_CHECKING}')" \
394 >> "${CVS_RSH}" 406 >> "${CVS_RSH}"
395 echo "os.execv('/usr/bin/ssh', newarglist)" \ 407 echo "os.execv('/usr/bin/ssh', newarglist)" \
396 >> "${CVS_RSH}" 408 >> "${CVS_RSH}"
397 409
398 chmod a+x "${CVS_RSH}" 410 chmod a+x "${CVS_RSH}"
399 411
400 # Make sure DISPLAY is set (SSH will not use SSH_ASKPASS 412 # Make sure DISPLAY is set (SSH will not use SSH_ASKPASS
401 # if DISPLAY is not set) 413 # if DISPLAY is not set)
402 414
403 [ -z "${DISPLAY}" ] && DISPLAY="DISPLAY" 415 [ -z "${DISPLAY}" ] && DISPLAY="DISPLAY"
404 export DISPLAY 416 export DISPLAY
405 417
406 # Create a dummy executable to echo $ECVS_PASS 418 # Create a dummy executable to echo $ECVS_PASS
407 419
408 export SSH_ASKPASS="${T}/cvs_sshechopass" 420 export SSH_ASKPASS="${T}/cvs_sshechopass"
409 421 if [ "${ECVS_AUTH}" != "no" ]; then
410 echo -en "#!/bin/bash\necho \"$ECVS_PASS\"\n" \ 422 echo -en "#!/bin/bash\necho \"$ECVS_PASS\"\n" \
411 > "${SSH_ASKPASS}" 423 > "${SSH_ASKPASS}"
424 else
425 echo -en "#!/bin/bash\nreturn\n" \
426 > "${SSH_ASKPASS}"
412 427
428 fi
413 chmod a+x "${SSH_ASKPASS}" 429 chmod a+x "${SSH_ASKPASS}"
414 fi 430 fi
415 431
416 if [ "${mode}" == "update" ]; then 432 if [ "${mode}" == "update" ]; then
417 einfo "Running $cmdupdate" 433 einfo "Running $cmdupdate"
418 eval $cmdupdate || die "cvs update command failed" 434 eval $cmdupdate || die "cvs update command failed"
419 elif [ "${mode}" == "checkout" ]; then 435 elif [ "${mode}" == "checkout" ]; then
420 einfo "Running $cmdcheckout" 436 einfo "Running $cmdcheckout"
421 eval $cmdcheckout|| die "cvs checkout command failed" 437 eval $cmdcheckout|| die "cvs checkout command failed"
422 fi 438 fi
423 439
424 # Restore environment variable values 440 # Restore environment variable values
425 export CVS_RSH="${CVS_ECLASS_ORIG_CVS_RSH}" 441 export CVS_RSH="${CVS_ECLASS_ORIG_CVS_RSH}"
426 if [ "${CVS_ECLASS_ORIG_SSH_ASKPASS+set}" == "set" ]; then 442 if [ "${CVS_ECLASS_ORIG_SSH_ASKPASS+set}" == "set" ]; then
427 export SSH_ASKPASS="${CVS_ECLASS_ORIG_SSH_ASKPASS}" 443 export SSH_ASKPASS="${CVS_ECLASS_ORIG_SSH_ASKPASS}"
428 else 444 else
478 else 494 else
479 debug-print "$FUNCNAME: Offline mode specified but directory ${ECVS_TOP_DIR}/${ECVS_LOCALNAME} not found, exiting with error" 495 debug-print "$FUNCNAME: Offline mode specified but directory ${ECVS_TOP_DIR}/${ECVS_LOCALNAME} not found, exiting with error"
480 die "ERROR: Offline mode specified, but directory ${ECVS_TOP_DIR}/${ECVS_LOCALNAME} not found. Aborting." 496 die "ERROR: Offline mode specified, but directory ${ECVS_TOP_DIR}/${ECVS_LOCALNAME} not found. Aborting."
481 fi 497 fi
482 elif [ -n "$ECVS_SERVER" ]; then # ECVS_SERVER!=offline --> real fetching mode 498 elif [ -n "$ECVS_SERVER" ]; then # ECVS_SERVER!=offline --> real fetching mode
483 einfo "Fetching CVS module $ECVS_MODULE into $ECVS_TOP_DIR..." 499 einfo "Fetching CVS module $ECVS_MODULE into $ECVS_TOP_DIR ..."
484 cvs_fetch 500 cvs_fetch
485 else # ECVS_SERVER not set 501 else # ECVS_SERVER not set
486 die "ERROR: CVS server not specified, cannot continue." 502 die "ERROR: CVS server not specified, cannot continue."
487 fi 503 fi
488 504
489 einfo "Copying $ECVS_MODULE from $ECVS_TOP_DIR..." 505 einfo "Copying $ECVS_MODULE from $ECVS_TOP_DIR ..."
490 debug-print "Copying module $ECVS_MODULE local_mode=$ECVS_LOCAL from $ECVS_TOP_DIR..." 506 debug-print "Copying module $ECVS_MODULE local_mode=$ECVS_LOCAL from $ECVS_TOP_DIR ..."
491 507
492 # This is probably redundant, but best to make sure. 508 # This is probably redundant, but best to make sure.
493 mkdir -p "$WORKDIR/$ECVS_LOCALNAME" 509 mkdir -p "$WORKDIR/$ECVS_LOCALNAME"
494 510
495 if [ -n "$ECVS_LOCAL" ]; then 511 if [ -n "$ECVS_LOCAL" ]; then
510 # Implement some of base_src_unpack's functionality; note however 526 # Implement some of base_src_unpack's functionality; note however
511 # that base.eclass may not have been inherited! 527 # that base.eclass may not have been inherited!
512 if [ -n "$PATCHES" ]; then 528 if [ -n "$PATCHES" ]; then
513 debug-print "$FUNCNAME: PATCHES=$PATCHES, S=$S, autopatching" 529 debug-print "$FUNCNAME: PATCHES=$PATCHES, S=$S, autopatching"
514 cd "$S" 530 cd "$S"
515 for x in $PATCHES; do 531 epatch ${PATCHES}
516 debug-print "patching from $x"
517 patch -p0 < "$x"
518 done
519 # Make sure we don't try to apply patches more than once, 532 # Make sure we don't try to apply patches more than once,
520 # since cvs_src_unpack is usually called several times from 533 # since cvs_src_unpack is usually called several times from
521 # e.g. kde-source_src_unpack 534 # e.g. kde-source_src_unpack
522 export PATCHES="" 535 export PATCHES=""
523 fi 536 fi
524 537
525 einfo "CVS module ${ECVS_MODULE} is now in ${WORKDIR}" 538 einfo "CVS module ${ECVS_MODULE} is now in ${WORKDIR}"
526} 539}
527 540
528EXPORT_FUNCTIONS src_unpack 541EXPORT_FUNCTIONS src_unpack

Legend:
Removed from v.1.50  
changed lines
  Added in v.1.60

  ViewVC Help
Powered by ViewVC 1.1.20