blob: f50378743712af681b3bfe44fe661c33e2377157 [file] [log] [blame] [edit]
# Copyright 1999-2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/eclass/tla.eclass,v 1.10 2007/04/23 19:35:05 swegener Exp $
#
# Original Author: Jeffrey Yasskin <jyasskin@mail.utexas.edu>
#
# Originally derived from the cvs eclass.
#
# This eclass provides the generic tla fetching functions.
# to use from an ebuild, set the 'ebuild-configurable settings' below in your
# ebuild before inheriting. then either leave the default src_unpack or extend
# over tla_src_unpack.
# Most of the time, you will define only $ETLA_VERSION and $ETLA_ARCHIVES in
# your ebuild.
# TODO:
# Make it support particular revisions.
# Don't download anything other than the tla archive
SRC_URI=""
# You shouldn't change these settings yourself! The ebuild/eclass inheriting
# this eclass will take care of that.
# --- begin ebuild-configurable settings
# tla command to run. Theoretically, substituting any arch derivative should be
# relatively easy.
[ -z "$ETLA_TLA_CMD" ] && ETLA_TLA_CMD="tla"
# tla commands with options
[ -z "$ETLA_GET_CMD" ] && ETLA_GET_CMD="get"
[ -z "$ETLA_UPDATE_CMD" ] && ETLA_UPDATE_CMD="replay"
# Where the tla modules are stored/accessed
[ -z "$ETLA_TOP_DIR" ] && ETLA_TOP_DIR="${DISTDIR}/tla-src"
# Name of tla version in the format
# user@example.com--archive-name/category--branch--version
# (in other words, an argument to tla get, update, or replay)
[ -z "$ETLA_VERSION" ] && ETLA_VERSION=""
# A space-separated list of significant archive URLs. You should definitely
# include the URL for the archive your version is stored in, and if it refers
# to any other archives, also list them.
[ -z "$ETLA_ARCHIVES" ] && ETLA_ARCHIVES=""
# The location in which to cache the version, relative to $ETLA_TOP_DIR.
[ -z "$ETLA_CACHE_DIR" ] && ETLA_CACHE_DIR="${ETLA_VERSION}"
# ETLA_CLEAN: set this to something to get a clean copy when updating (removes
# the working directory, then uses $ETLA_GET_CMD to re-download it.)
# --- end ebuild-configurable settings ---
# add tla to deps
DEPEND="dev-util/tla"
# registers archives mentioned in $ETLA_ARCHIVES
tla_register_archives() {
debug-print-function $FUNCNAME $* $ETLA_ARCHIVES
for archive in $ETLA_ARCHIVES; do
$ETLA_TLA_CMD register-archive -f $archive || die "Could not register archive $archive"
done
}
# checks that configuration variables have rational values.
tla_check_vars() {
[ -z "$ETLA_VERSION" ] && die "ETLA_VERSION must be set by the ebuild. Please fix this ebuild."
$ETLA_TLA_CMD valid-package-name --archive --vsn $ETLA_VERSION || \
die "ETLA_VERSION has an invalid format. Please fix this ebuild."
}
# is called from tla_src_unpack
tla_fetch() {
debug-print-function $FUNCNAME $*
if [ -n "$ETLA_CLEAN" ]; then
rm -rf $ETLA_TOP_DIR/$ETLA_CACHE_DIR
fi
# create the top dir if needed
if [ ! -d "$ETLA_TOP_DIR" ]; then
# note that the addwrite statements in this block are only there to allow creating ETLA_TOP_DIR;
# we've already allowed writing inside it
# this is because it's simpler than trying to find out the parent path of the directory, which
# would need to be the real path and not a symlink for things to work (so we can't just remove
# the last path element in the string)
debug-print "$FUNCNAME: checkout mode. creating tla directory"
addwrite /foobar
addwrite /
mkdir -p "$ETLA_TOP_DIR"
export SANDBOX_WRITE="${SANDBOX_WRITE//:\/foobar:\/}"
fi
# in case ETLA_TOP_DIR is a symlink to a dir, get the real dir's path,
# otherwise addwrite() doesn't work.
cd -P "$ETLA_TOP_DIR" > /dev/null
ETLA_TOP_DIR="`/bin/pwd`"
# disable the sandbox for this dir
addwrite "$ETLA_TOP_DIR"
# break $ETLA_VERSION into pieces
local tla_archive=`$ETLA_TLA_CMD parse-package-name --arch $ETLA_VERSION`
local tla_version=`$ETLA_TLA_CMD parse-package-name --package-version $ETLA_VERSION`
#local tla_revision=`$ETLA_TLA_CMD parse-package-name --lvl $ETLA_VERSION`
# determine checkout or update mode and change to the right directory.
if [ ! -d "$ETLA_TOP_DIR/$ETLA_CACHE_DIR/{arch}" ]; then
mode=get
mkdir -p "$ETLA_TOP_DIR/$ETLA_CACHE_DIR"
cd "$ETLA_TOP_DIR/$ETLA_CACHE_DIR/.."
rmdir "`basename "$ETLA_CACHE_DIR"`"
else
mode=update
cd "$ETLA_TOP_DIR/$ETLA_CACHE_DIR"
fi
# switch versions automagically if needed
if [ "$mode" == "update" ]; then
local oldversion="`$ETLA_TLA_CMD tree-version`"
if [ "$tla_archive/$tla_version" != "$oldversion" ]; then
einfo "Changing TLA version from $oldversion to $tla_archive/$tla_version:"
debug-print "$FUNCNAME: Changing TLA version from $oldversion to $tla_archive/$tla_version:"
$ETLA_TLA_CMD set-tree-version $tla_archive/$tla_version
fi
fi
# commands to run
local cmdget="${ETLA_TLA_CMD} ${ETLA_GET_CMD} ${ETLA_VERSION} `basename $ETLA_CACHE_DIR`"
local cmdupdate="${ETLA_TLA_CMD} ${ETLA_UPDATE_CMD} ${ETLA_VERSION}"
if [ "${mode}" == "get" ]; then
einfo "Running $cmdget"
eval $cmdget || die "tla get command failed"
elif [ "${mode}" == "update" ]; then
einfo "Running $cmdupdate"
eval $cmdupdate || die "tla update command failed"
fi
}
tla_src_unpack() {
debug-print-function $FUNCNAME $*
debug-print "$FUNCNAME: init:
ETLA_TLA_CMD=$ETLA_TLA_CMD
ETLA_GET_CMD=$ETLA_GET_CMD
ETLA_UPDATE_CMD=$ETLA_UPDATE_CMD
ETLA_TOP_DIR=$ETLA_TOP_DIR
ETLA_VERSION=$ETLA_VERSION
ETLA_ARCHIVES=$ETLA_ARCHIVES
ETLA_CACHE_DIR=$ETLA_CACHE_DIR
ETLA_CLEAN=$ETLA_CLEAN"
einfo "Registering Archives ..."
tla_register_archives
einfo "Checking that passed-in variables are rational ..."
tla_check_vars
einfo "Fetching tla version $ETLA_VERSION into $ETLA_TOP_DIR ..."
tla_fetch
einfo "Copying $ETLA_CACHE_DIR from $ETLA_TOP_DIR ..."
debug-print "Copying $ETLA_CACHE_DIR from $ETLA_TOP_DIR ..."
# probably redundant, but best to make sure
# Use ${WORKDIR}/${P} rather than ${S} so user can point ${S} to something inside.
mkdir -p "${WORKDIR}/${P}"
local OLD_SHOPTS=$(shopt -p)
shopt -s dotglob # get any dotfiles too.
cp -Rf "$ETLA_TOP_DIR/$ETLA_CACHE_DIR"/* "${WORKDIR}/${P}"
eval "$OLD_SHOPTS"
# implement some of base_src_unpack's functionality;
# note however that base.eclass may not have been inherited!
#if [ -n "$PATCHES" ]; then
# debug-print "$FUNCNAME: PATCHES=$PATCHES, S=$S, autopatching"
# cd "$S"
# for x in $PATCHES; do
# debug-print "patching from $x"
# patch -p0 < "$x"
# done
# # make sure we don't try to apply patches more than once, since
# # tla_src_unpack may be called several times
# export PATCHES=""
#fi
einfo "Version ${ETLA_VERSION} is now in ${WORKDIR}/${P}"
}
EXPORT_FUNCTIONS src_unpack