chore(eclass): bump to latest code from chromeos

This commit is contained in:
Brandon Philips 2013-03-05 20:28:34 -08:00
parent 7b68e4b6fe
commit d67ee93760
12 changed files with 487 additions and 484 deletions

View File

@ -11,15 +11,80 @@
# Storage directory for Chrome OS Binaries # Storage directory for Chrome OS Binaries
: ${CROS_BINARY_STORE_DIR:=${PORTAGE_ACTUAL_DISTDIR:-${DISTDIR}}/cros-binary} : ${CROS_BINARY_STORE_DIR:=${PORTAGE_ACTUAL_DISTDIR:-${DISTDIR}}/cros-binary}
# @ECLASS-VARIABLE: CROS_BINARY_FETCH_REQUIRED
# @DESCRIPTION:
# Internal variable controlling whether cros-binary_fetch is actually ran.
: ${CROS_BINARY_FETCH_REQUIRED:=true}
# @ECLASS-FUNCTION: cros-binary_add_uri
# @DESCRIPTION:
# Add a fetch uri to SRC_URI for the given uri. See
# CROS_BINARY_URI for what is accepted. Note you cannot
# intermix a non-rewritten ssh w/ (http|https|gs).
cros-binary_add_uri()
{
if [[ $# -ne 1 ]]; then
die "cros-binary_add_uri takes exactly one argument; $# given."
fi
local uri="$1"
if [[ "${uri}" =~ ^ssh://([^@]+)@git.chromium.org[^/]*/(.*)$ ]]; then
uri="gs://chromeos-binaries/HOME/${BASH_REMATCH[1]}/${BASH_REMATCH[2]}"
fi
case "${uri}" in
http://*|https://*|gs://*)
SRC_URI+=" ${uri}"
CROS_BINARY_FETCH_REQUIRED=false
CROS_BINARY_STORE_DIR="${DISTDIR}"
;;
*)
die "Unknown protocol: ${uri}"
;;
esac
RESTRICT+="mirror"
}
# @ECLASS-FUNCTION: cros-binary_add_gs_uri
# @DESCRIPTION:
# Wrapper around cros-binary_add_uri. Invoked with 3 arguments;
# the bcs user, the overlay, and the filename (or bcs://<uri> for
# backwards compatibility).
cros-binary_add_gs_uri() {
if [[ $# -ne 3 ]]; then
die "cros-binary_add_bcs_uri needs 3 arguments; $# given."
fi
# Strip leading bcs://...
[[ "${3:0:6}" == "bcs://" ]] && set -- "${1}" "${2}" "${3#bcs://}"
cros-binary_add_uri "gs://chromeos-binaries/HOME/$1/$2/$3"
}
# @ECLASS-FUNCTION: cros-binary_add_overlay_uri
# @DESCRIPTION:
# Wrapper around cros-binary_add_bcs_uri. Invoked with 2 arguments;
# the basic board target (x86-alex for example), and the filename; that filename
# is automatically prefixed with "${CATEGORY}/${PN}/" .
cros-binary_add_overlay_uri() {
if [[ $# -ne 2 ]]; then
die "cros-binary_add_bcs_uri_simple needs 2 arguments; $# given."
fi
cros-binary_add_gs_uri bcs-"$1" overlay-"$1" "${CATEGORY}/${PN}/$2"
}
# @ECLASS-VARIABLE: CROS_BINARY_URI # @ECLASS-VARIABLE: CROS_BINARY_URI
# @DESCRIPTION: # @DESCRIPTION:
# URI for the binary may be one of: # URI for the binary may be one of:
# http:// # http://
# https:// # https://
# ssh:// # ssh://
# gs://
# file:// (file is relative to the files directory) # file:// (file is relative to the files directory)
# TODO: Add "->" support if we get file collisions # Additionally, all bcs ssh:// urls are rewritten to gs:// automatically
# the appropriate GS bucket- although cros-binary_add_uri is the preferred
# way to do that.
# TODO: Deprecate this variable's support for ssh and http/https.
: ${CROS_BINARY_URI:=} : ${CROS_BINARY_URI:=}
if [[ -n "${CROS_BINARY_URI}" ]]; then
cros-binary_add_uri "${CROS_BINARY_URI}"
fi
# @ECLASS-VARIABLE: CROS_BINARY_SUM # @ECLASS-VARIABLE: CROS_BINARY_SUM
# @DESCRIPTION: # @DESCRIPTION:
@ -57,6 +122,7 @@ cros-binary_check_file() {
} }
cros-binary_fetch() { cros-binary_fetch() {
${CROS_BINARY_FETCH_REQUIRED} || return 0
local uri=${CROS_BINARY_URI} local uri=${CROS_BINARY_URI}
if [[ ! -z "${CROS_BINARY_LOCAL_URI_BASE}" ]]; then if [[ ! -z "${CROS_BINARY_LOCAL_URI_BASE}" ]]; then
uri="${CROS_BINARY_LOCAL_URI_BASE}/${CROS_BINARY_URI##*/}" uri="${CROS_BINARY_LOCAL_URI_BASE}/${CROS_BINARY_URI##*/}"
@ -85,7 +151,7 @@ cros-binary_fetch() {
if ! cros-binary_check_file; then if ! cros-binary_check_file; then
rm -f "${target}" rm -f "${target}"
case "${scheme}" in case "${scheme}" in
http|https) http|https|ftp)
wget "${uri}" -O "${target}" -nv -nc || wget "${uri}" -O "${target}" -nv -nc ||
rm -f "${target}" rm -f "${target}"
;; ;;
@ -129,7 +195,12 @@ cros-binary_src_unpack() {
} }
cros-binary_src_install() { cros-binary_src_install() {
local target="${CROS_BINARY_STORE_DIR}/${CROS_BINARY_URI##*/}" local target="${CROS_BINARY_URI##*/}"
if ${CROS_BINARY_FETCH_REQUIRED}; then
target="${CROS_BINARY_STORE_DIR}/${target}"
else
target="${DISTDIR}/${target}"
fi
local extension="${CROS_BINARY_URI##*.}" local extension="${CROS_BINARY_URI##*.}"
local flags local flags

View File

@ -42,13 +42,14 @@ ALL_BOARDS=(
daisy-drm daisy-drm
daisy_spring daisy_spring
daisy_snow daisy_snow
dalmore
emeraldlake2 emeraldlake2
eureka eureka
fb1 fb1
haswell fox
haswell_baskingridge fox_baskingridge
haswell_wtm1 fox_wtm1
haswell_wtm2 fox_wtm2
ironhide ironhide
kiev kiev
klang klang
@ -58,6 +59,7 @@ ALL_BOARDS=(
parrot parrot
puppy puppy
raspberrypi raspberrypi
ricochet
stout stout
stumpy stumpy
tegra2 tegra2

View File

@ -76,6 +76,7 @@ IUSE="bootimage cros_ec"
# don't write RDEPEND=$DEPEND. RDEPEND should have an explicit list of what it # don't write RDEPEND=$DEPEND. RDEPEND should have an explicit list of what it
# needs to extract and execute the updater. # needs to extract and execute the updater.
DEPEND=" DEPEND="
>=coreos-base/vboot_reference-1.0-r230
coreos-base/vpd coreos-base/vpd
dev-util/shflags dev-util/shflags
>=sys-apps/flashrom-0.9.3-r36 >=sys-apps/flashrom-0.9.3-r36
@ -102,6 +103,7 @@ RDEPEND="
app-arch/gzip app-arch/gzip
app-arch/sharutils app-arch/sharutils
app-arch/tar app-arch/tar
coreos-base/vboot_reference
sys-apps/util-linux" sys-apps/util-linux"
# Check for EAPI 2+ # Check for EAPI 2+
@ -130,6 +132,7 @@ _is_in_files() {
# Parameters: URI of file "bcs://filename.tbz2", checksum of file. # Parameters: URI of file "bcs://filename.tbz2", checksum of file.
# Returns: Nothing # Returns: Nothing
_bcs_fetch() { _bcs_fetch() {
${CROS_BINARY_FETCH_REQUIRED} || return 0
local filename="${1##*://}" local filename="${1##*://}"
local checksum="$2" local checksum="$2"
@ -174,7 +177,11 @@ _src_unpack() {
# Returns: Location of unpacked firmware as $RETURN_VALUE # Returns: Location of unpacked firmware as $RETURN_VALUE
_bcs_src_unpack() { _bcs_src_unpack() {
local filename="${1##*://}" local filename="${1##*://}"
_src_unpack "${CROS_BINARY_STORE_DIR}/${filename}" if ${CROS_BINARY_FETCH_REQUIRED}; then
_src_unpack "${CROS_BINARY_STORE_DIR}/${filename}"
else
_src_unpack "${DISTDIR}/${filename}"
fi
RETURN_VALUE="${RETURN_VALUE}" RETURN_VALUE="${RETURN_VALUE}"
} }

View File

@ -200,6 +200,8 @@ CONFIG_HW_RANDOM=y
CONFIG_TCG_TPM=y CONFIG_TCG_TPM=y
CONFIG_I2C=y CONFIG_I2C=y
CONFIG_I2C_CHARDEV=m CONFIG_I2C_CHARDEV=m
CONFIG_I2C_MUX=y
CONFIG_I2C_ARBITRATOR_CROS_EC=y
CONFIG_I2C_S3C2410=y CONFIG_I2C_S3C2410=y
CONFIG_I2C_STUB=m CONFIG_I2C_STUB=m
CONFIG_SPI=y CONFIG_SPI=y

View File

@ -10,7 +10,8 @@ LICENSE="GPL-2"
SLOT="0" SLOT="0"
DEPEND="sys-apps/debianutils DEPEND="sys-apps/debianutils
initramfs? ( chromeos-base/chromeos-initramfs ) initramfs? ( coreos-base/chromeos-initramfs )
netboot_ramfs? ( coreos-base/chromeos-initramfs )
" "
IUSE="-device_tree -kernel_sources" IUSE="-device_tree -kernel_sources"
@ -39,6 +40,7 @@ CONFIG_FRAGMENTS=(
i2cdev i2cdev
initramfs initramfs
kvm kvm
netboot_ramfs
nfs nfs
pcserial pcserial
qmi qmi
@ -47,6 +49,7 @@ CONFIG_FRAGMENTS=(
systemtap systemtap
tpm tpm
vfat vfat
x32
) )
blkdevram_desc="ram block device" blkdevram_desc="ram block device"
@ -105,11 +108,17 @@ CONFIG_TCG_TPM=y
CONFIG_TCG_TIS=y CONFIG_TCG_TIS=y
" "
initramfs_desc="initramfs" initramfs_desc="Initramfs for factory install shim and recovery image"
initramfs_config=" initramfs_config='
CONFIG_INITRAMFS_SOURCE=\"%ROOT%/var/lib/misc/initramfs.cpio.xz\" CONFIG_INITRAMFS_SOURCE="%ROOT%/var/lib/misc/initramfs.cpio.xz"
CONFIG_INITRAMFS_COMPRESSION_XZ=y CONFIG_INITRAMFS_COMPRESSION_XZ=y
" '
netboot_ramfs_desc="Network boot install initramfs"
netboot_ramfs_config='
CONFIG_INITRAMFS_SOURCE="%ROOT%/var/lib/misc/netboot_ramfs.cpio.xz"
CONFIG_INITRAMFS_COMPRESSION_XZ=y
'
vfat_desc="vfat" vfat_desc="vfat"
vfat_config=" vfat_config="
@ -196,8 +205,20 @@ CONFIG_KPROBES=y
CONFIG_DEBUG_INFO=y CONFIG_DEBUG_INFO=y
" "
x32_desc="x32 ABI support"
x32_config="
CONFIG_X86_X32=y
"
# Add all config fragments as off by default # Add all config fragments as off by default
IUSE="${IUSE} ${CONFIG_FRAGMENTS[@]}" IUSE="${IUSE} ${CONFIG_FRAGMENTS[@]}"
REQUIRED_USE="
initramfs? ( !netboot_ramfs )
netboot_ramfs? ( !initramfs )
initramfs? ( i2cdev tpm )
netboot_ramfs? ( i2cdev tpm )
x32? ( amd64 )
"
# If an overlay has eclass overrides, but doesn't actually override this # If an overlay has eclass overrides, but doesn't actually override this
# eclass, we'll have ECLASSDIR pointing to the active overlay's # eclass, we'll have ECLASSDIR pointing to the active overlay's
@ -638,10 +659,14 @@ cros-kernel2_src_install() {
fi fi
# Check the size of kernel image and issue warning when image size is near # Check the size of kernel image and issue warning when image size is near
# the limit. # the limit. For factory install initramfs, we don't care about kernel
# size limit as the image is downloaded over network.
local kernel_image_size=$(stat -c '%s' -L "${D}"/boot/vmlinuz) local kernel_image_size=$(stat -c '%s' -L "${D}"/boot/vmlinuz)
einfo "Kernel image size is ${kernel_image_size} bytes." einfo "Kernel image size is ${kernel_image_size} bytes."
if [[ ${kernel_image_size} -gt $((8 * 1024 * 1024)) ]]; then if use netboot_ramfs; then
# No need to check kernel image size.
true
elif [[ ${kernel_image_size} -gt $((8 * 1024 * 1024)) ]]; then
die "Kernel image is larger than 8 MB." die "Kernel image is larger than 8 MB."
elif [[ ${kernel_image_size} -gt $((7 * 1024 * 1024)) ]]; then elif [[ ${kernel_image_size} -gt $((7 * 1024 * 1024)) ]]; then
ewarn "Kernel image is larger than 7 MB. Limit is 8 MB." ewarn "Kernel image is larger than 7 MB. Limit is 8 MB."

View File

@ -119,7 +119,7 @@ ARRAY_VARIABLES=( CROS_WORKON_{SUBDIR,REPO,PROJECT,LOCALNAME,DESTDIR,COMMIT,TREE
# Join the tree commits to produce a unique identifier # Join the tree commits to produce a unique identifier
CROS_WORKON_TREE_COMPOSITE=$(IFS="_"; echo "${CROS_WORKON_TREE[*]}") CROS_WORKON_TREE_COMPOSITE=$(IFS="_"; echo "${CROS_WORKON_TREE[*]}")
IUSE="cros_workon_tree_$CROS_WORKON_TREE_COMPOSITE" IUSE="cros_workon_tree_$CROS_WORKON_TREE_COMPOSITE profiling"
inherit git-2 flag-o-matic toolchain-funcs inherit git-2 flag-o-matic toolchain-funcs
@ -248,9 +248,26 @@ get_rev() {
GIT_DIR="$1" git rev-parse HEAD GIT_DIR="$1" git rev-parse HEAD
} }
using_common_mk() {
[[ -n $(find "${S}" -name common.mk -exec grep -l common-mk.git {} +) ]]
}
cros-workon_src_unpack() { cros-workon_src_unpack() {
local fetch_method # local|git local fetch_method # local|git
# Sanity check. We cannot have S set to WORKDIR because if/when we try
# to check out repos, git will die if it tries to check out into a dir
# that already exists. Some packages might try this when out-of-tree
# builds are enabled, and they'll work fine most of the time because
# they'll be using a full manifest and will just re-use the existing
# checkout in src/platform/*. But if the code detects that it has to
# make its own checkout, things fall apart. For out-of-tree builds,
# the initial $S doesn't even matter because it resets it below to the
# repo in src/platform/.
if [[ ${S} == "${WORKDIR}" ]]; then
die "Sorry, but \$S cannot be set to \$WORKDIR"
fi
# Set the default of CROS_WORKON_DESTDIR. This is done here because S is # Set the default of CROS_WORKON_DESTDIR. This is done here because S is
# sometimes overridden in ebuilds and we cannot rely on the global state # sometimes overridden in ebuilds and we cannot rely on the global state
# (and therefore ordering of eclass inherits and local ebuild overrides). # (and therefore ordering of eclass inherits and local ebuild overrides).
@ -392,7 +409,10 @@ cros-workon_src_unpack() {
EGIT_SOURCEDIR="${destdir[i]}" EGIT_SOURCEDIR="${destdir[i]}"
EGIT_COMMIT="${CROS_WORKON_COMMIT[i]}" EGIT_COMMIT="${CROS_WORKON_COMMIT[i]}"
# Clones to /var, copies src tree to the /build/<board>/tmp. # Clones to /var, copies src tree to the /build/<board>/tmp.
git-2_src_unpack # Make sure git-2 does not run `unpack` for us automatically.
# The normal cros-workon flow above doesn't do it, so don't
# let git-2 do it either. http://crosbug.com/38342
EGIT_NOUNPACK=true git-2_src_unpack
# TODO(zbehan): Support multiple projects for vcsid? # TODO(zbehan): Support multiple projects for vcsid?
done done
set_vcsid "${CROS_WORKON_COMMIT[0]}" set_vcsid "${CROS_WORKON_COMMIT[0]}"
@ -446,21 +466,21 @@ cros-workon_src_prepare() {
local out="$(cros-workon_get_build_dir)" local out="$(cros-workon_get_build_dir)"
[[ ${CROS_WORKON_INCREMENTAL_BUILD} != "1" ]] && mkdir -p "${out}" [[ ${CROS_WORKON_INCREMENTAL_BUILD} != "1" ]] && mkdir -p "${out}"
if [[ -e ${S}/common.mk ]] ; then if using_common_mk ; then
: ${OUT=${out}} : ${OUT=${out}}
export OUT export OUT
fi fi
} }
cros-workon_src_configure() { cros-workon_src_configure() {
if [[ -e ${S}/common.mk ]] ; then if using_common_mk ; then
# We somewhat overshoot here, but it isn't harmful, # We somewhat overshoot here, but it isn't harmful,
# and catches all the packages we care about. # and catches all the packages we care about.
tc-export CC CXX AR RANLIB LD NM PKG_CONFIG tc-export CC CXX AR RANLIB LD NM PKG_CONFIG
# Portage takes care of this for us. # Portage takes care of this for us.
export SPLITDEBUG=0 export SPLITDEBUG=0
export MODE=$(usex profiling profiling opt)
if [[ $(type -t cros-debug-add-NDEBUG) == "function" ]] ; then if [[ $(type -t cros-debug-add-NDEBUG) == "function" ]] ; then
# Only run this if we've inherited cros-debug.eclass. # Only run this if we've inherited cros-debug.eclass.
cros-debug-add-NDEBUG cros-debug-add-NDEBUG
@ -504,7 +524,7 @@ cw_emake() {
} }
cros-workon_src_compile() { cros-workon_src_compile() {
if [[ -e ${S}/common.mk ]] ; then if using_common_mk ; then
cw_emake cw_emake
else else
default default
@ -512,7 +532,7 @@ cros-workon_src_compile() {
} }
cros-workon_src_test() { cros-workon_src_test() {
if [[ -e ${S}/common.mk ]] ; then if using_common_mk ; then
emake \ emake \
VALGRIND=$(use_if_iuse valgrind && echo 1) \ VALGRIND=$(use_if_iuse valgrind && echo 1) \
tests tests
@ -521,6 +541,32 @@ cros-workon_src_test() {
fi fi
} }
cros-workon_src_install() {
# common.mk supports coverage analysis, but only generates data when
# the tests have been run as part of the build process. Thus this code
# needs to test of the analysis output is present before trying to
# install it.
if using_common_mk ; then
if use profiling; then
LCOV_DIR=$(find "${WORKDIR}" -name "lcov-html")
if [[ $(echo "${LCOV_DIR}" | wc -l) -gt 1 ]] ; then
die "More then one instance of lcov-html " \
"found! The instances are ${LCOV_DIR}. " \
"It is unclear which version to use, " \
"failing install."
fi
if [[ -d "${LCOV_DIR}" ]] ; then
local dir="${PN}"
[[ ${SLOT} != "0" ]] && dir+=":${SLOT}"
insinto "/usr/share/profiling/${dir}/lcov"
doins -r "${LCOV_DIR}"/*
fi
fi
else
default
fi
}
cros-workon_pkg_info() { cros-workon_pkg_info() {
print_quoted_array() { printf '"%s"\n' "$@"; } print_quoted_array() { printf '"%s"\n' "$@"; }

View File

@ -1,10 +1,9 @@
# Copyright 1999-2013 Gentoo Foundation # Copyright 1999-2011 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2 # Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/eclass/git-2.eclass,v 1.30 2013/01/09 17:26:55 axs Exp $ # $Header: /var/cvsroot/gentoo-x86/eclass/git-2.eclass,v 1.14 2011/08/22 04:46:31 vapier Exp $
# @ECLASS: git-2.eclass # @ECLASS: git-2.eclass
# @MAINTAINER: # @MAINTAINER:
# Michał Górny <mgorny@gentoo.org>
# Donnie Berkholz <dberkholz@gentoo.org> # Donnie Berkholz <dberkholz@gentoo.org>
# @BLURB: Eclass for fetching and unpacking git repositories. # @BLURB: Eclass for fetching and unpacking git repositories.
# @DESCRIPTION: # @DESCRIPTION:
@ -69,9 +68,6 @@ DEPEND="dev-vcs/git"
# URI for the repository # URI for the repository
# e.g. http://foo, git://bar # e.g. http://foo, git://bar
# #
# It can be overriden via env using packagename_LIVE_REPO
# variable.
#
# Support multiple values: # Support multiple values:
# EGIT_REPO_URI="git://a/b.git http://c/d.git" # EGIT_REPO_URI="git://a/b.git http://c/d.git"
@ -124,7 +120,6 @@ DEPEND="dev-vcs/git"
# Default behaviour is to unpack ${A} content. # Default behaviour is to unpack ${A} content.
# @FUNCTION: git-2_init_variables # @FUNCTION: git-2_init_variables
# @INTERNAL
# @DESCRIPTION: # @DESCRIPTION:
# Internal function initializing all git variables. # Internal function initializing all git variables.
# We define it in function scope so user can define # We define it in function scope so user can define
@ -132,8 +127,7 @@ DEPEND="dev-vcs/git"
git-2_init_variables() { git-2_init_variables() {
debug-print-function ${FUNCNAME} "$@" debug-print-function ${FUNCNAME} "$@"
local esc_pn liverepo livebranch livecommit local x
esc_pn=${PN//[-+]/_}
: ${EGIT_SOURCEDIR="${S}"} : ${EGIT_SOURCEDIR="${S}"}
@ -145,19 +139,19 @@ git-2_init_variables() {
: ${EGIT_MASTER:=master} : ${EGIT_MASTER:=master}
liverepo=${esc_pn}_LIVE_REPO eval x="\$${PN//[-+]/_}_LIVE_REPO"
EGIT_REPO_URI=${!liverepo:-${EGIT_REPO_URI}} EGIT_REPO_URI=${x:-${EGIT_REPO_URI}}
[[ ${EGIT_REPO_URI} ]] || die "EGIT_REPO_URI must have some value" [[ -z ${EGIT_REPO_URI} ]] && die "EGIT_REPO_URI must have some value"
: ${EVCS_OFFLINE:=} : ${EVCS_OFFLINE:=}
livebranch=${esc_pn}_LIVE_BRANCH eval x="\$${PN//[-+]/_}_LIVE_BRANCH"
[[ ${!livebranch} ]] && ewarn "QA: using \"${esc_pn}_LIVE_BRANCH\" variable, you won't get any support" [[ -n ${x} ]] && ewarn "QA: using \"${PN//[-+]/_}_LIVE_BRANCH\" variable, you won't get any support"
EGIT_BRANCH=${!livebranch:-${EGIT_BRANCH:-${EGIT_MASTER}}} EGIT_BRANCH=${x:-${EGIT_BRANCH:-${EGIT_MASTER}}}
livecommit=${esc_pn}_LIVE_COMMIT eval x="\$${PN//[-+]/_}_LIVE_COMMIT"
[[ ${!livecommit} ]] && ewarn "QA: using \"${esc_pn}_LIVE_COMMIT\" variable, you won't get any support" [[ -n ${x} ]] && ewarn "QA: using \"${PN//[-+]/_}_LIVE_COMMIT\" variable, you won't get any support"
EGIT_COMMIT=${!livecommit:-${EGIT_COMMIT:-${EGIT_BRANCH}}} EGIT_COMMIT=${x:-${EGIT_COMMIT:-${EGIT_BRANCH}}}
: ${EGIT_REPACK:=} : ${EGIT_REPACK:=}
@ -165,13 +159,12 @@ git-2_init_variables() {
} }
# @FUNCTION: git-2_submodules # @FUNCTION: git-2_submodules
# @INTERNAL
# @DESCRIPTION: # @DESCRIPTION:
# Internal function wrapping the submodule initialisation and update. # Internal function wrapping the submodule initialisation and update.
git-2_submodules() { git-2_submodules() {
debug-print-function ${FUNCNAME} "$@" debug-print-function ${FUNCNAME} "$@"
if [[ ${EGIT_HAS_SUBMODULES} ]]; then if [[ -n ${EGIT_HAS_SUBMODULES} ]]; then
if [[ ${EVCS_OFFLINE} ]]; then if [[ -n ${EVCS_OFFLINE} ]]; then
# for submodules operations we need to be online # for submodules operations we need to be online
debug-print "${FUNCNAME}: not updating submodules in offline mode" debug-print "${FUNCNAME}: not updating submodules in offline mode"
return 1 return 1
@ -192,7 +185,6 @@ git-2_submodules() {
} }
# @FUNCTION: git-2_branch # @FUNCTION: git-2_branch
# @INTERNAL
# @DESCRIPTION: # @DESCRIPTION:
# Internal function that changes branch for the repo based on EGIT_COMMIT and # Internal function that changes branch for the repo based on EGIT_COMMIT and
# EGIT_BRANCH variables. # EGIT_BRANCH variables.
@ -217,7 +209,6 @@ git-2_branch() {
} }
# @FUNCTION: git-2_gc # @FUNCTION: git-2_gc
# @INTERNAL
# @DESCRIPTION: # @DESCRIPTION:
# Internal function running garbage collector on checked out tree. # Internal function running garbage collector on checked out tree.
git-2_gc() { git-2_gc() {
@ -225,19 +216,18 @@ git-2_gc() {
local args local args
if [[ ${EGIT_REPACK} || ${EGIT_PRUNE} ]]; then pushd "${EGIT_DIR}" > /dev/null
pushd "${EGIT_DIR}" > /dev/null if [[ -n ${EGIT_REPACK} || -n ${EGIT_PRUNE} ]]; then
ebegin "Garbage collecting the repository" ebegin "Garbage collecting the repository"
[[ ${EGIT_PRUNE} ]] && args='--prune' [[ -n ${EGIT_PRUNE} ]] && args='--prune'
debug-print "${FUNCNAME}: git gc ${args}" debug-print "${FUNCNAME}: git gc ${args}"
git gc ${args} git gc ${args}
eend $? eend $?
popd > /dev/null
fi fi
popd > /dev/null
} }
# @FUNCTION: git-2_prepare_storedir # @FUNCTION: git-2_prepare_storedir
# @INTERNAL
# @DESCRIPTION: # @DESCRIPTION:
# Internal function preparing directory where we are going to store SCM # Internal function preparing directory where we are going to store SCM
# repository. # repository.
@ -251,53 +241,29 @@ git-2_prepare_storedir() {
if [[ ! -d ${EGIT_STORE_DIR} ]]; then if [[ ! -d ${EGIT_STORE_DIR} ]]; then
debug-print "${FUNCNAME}: Creating git main storage directory" debug-print "${FUNCNAME}: Creating git main storage directory"
addwrite / addwrite /
mkdir -m 775 -p "${EGIT_STORE_DIR}" \ mkdir -p "${EGIT_STORE_DIR}" \
|| die "${FUNCNAME}: can't mkdir \"${EGIT_STORE_DIR}\"" || die "${FUNCNAME}: can't mkdir \"${EGIT_STORE_DIR}\""
fi fi
# allow writing into EGIT_STORE_DIR # allow writing into EGIT_STORE_DIR
addwrite "${EGIT_STORE_DIR}" addwrite "${EGIT_STORE_DIR}"
# calculate git.eclass store dir for data
# We will try to clone the old repository,
# and we will remove it if we don't need it anymore.
EGIT_OLD_CLONE=
if [[ ${EGIT_STORE_DIR} == */egit-src ]]; then
local old_store_dir=${EGIT_STORE_DIR/%egit-src/git-src}
local old_location=${old_store_dir}/${EGIT_PROJECT:-${PN}}
if [[ -d ${old_location} ]]; then
EGIT_OLD_CLONE=${old_location}
# required to remove the old clone
addwrite "${old_store_dir}"
fi
fi
# calculate the proper store dir for data # calculate the proper store dir for data
# If user didn't specify the EGIT_DIR, we check if he did specify # If user didn't specify the EGIT_DIR, we check if he did specify
# the EGIT_PROJECT or get the folder name from EGIT_REPO_URI. # the EGIT_PROJECT or get the folder name from EGIT_REPO_URI.
EGIT_REPO_URI=${EGIT_REPO_URI%/} [[ -z ${EGIT_REPO_URI##*/} ]] && EGIT_REPO_URI="${EGIT_REPO_URI%/}"
if [[ ! ${EGIT_DIR} ]]; then if [[ -z ${EGIT_DIR} ]]; then
if [[ ${EGIT_PROJECT} ]]; then if [[ -n ${EGIT_PROJECT} ]]; then
clone_dir=${EGIT_PROJECT} clone_dir=${EGIT_PROJECT}
else else
local strippeduri=${EGIT_REPO_URI%/.git} clone_dir=${EGIT_REPO_URI##*/}
clone_dir=${strippeduri##*/}
fi fi
EGIT_DIR=${EGIT_STORE_DIR}/${clone_dir} EGIT_DIR=${EGIT_STORE_DIR}/${clone_dir}
if [[ ${EGIT_OLD_CLONE} && ! -d ${EGIT_DIR} ]]; then
elog "${FUNCNAME}: ${CATEGORY}/${PF} will be cloned from old location."
elog "It will be necessary to rebuild the package to fetch updates."
EGIT_REPO_URI="${EGIT_OLD_CLONE} ${EGIT_REPO_URI}"
fi
fi fi
export EGIT_DIR=${EGIT_DIR} export EGIT_DIR=${EGIT_DIR}
debug-print "${FUNCNAME}: Storing the repo into \"${EGIT_DIR}\"." debug-print "${FUNCNAME}: Storing the repo into \"${EGIT_DIR}\"."
} }
# @FUNCTION: git-2_move_source # @FUNCTION: git-2_move_source
# @INTERNAL
# @DESCRIPTION: # @DESCRIPTION:
# Internal function moving sources from the EGIT_DIR to EGIT_SOURCEDIR dir. # Internal function moving sources from the EGIT_DIR to EGIT_SOURCEDIR dir.
git-2_move_source() { git-2_move_source() {
@ -313,7 +279,6 @@ git-2_move_source() {
} }
# @FUNCTION: git-2_initial_clone # @FUNCTION: git-2_initial_clone
# @INTERNAL
# @DESCRIPTION: # @DESCRIPTION:
# Internal function running initial clone on specified repo_uri. # Internal function running initial clone on specified repo_uri.
git-2_initial_clone() { git-2_initial_clone() {
@ -324,7 +289,8 @@ git-2_initial_clone() {
EGIT_REPO_URI_SELECTED="" EGIT_REPO_URI_SELECTED=""
for repo_uri in ${EGIT_REPO_URI}; do for repo_uri in ${EGIT_REPO_URI}; do
debug-print "${FUNCNAME}: git clone ${EGIT_LOCAL_OPTIONS} \"${repo_uri}\" \"${EGIT_DIR}\"" debug-print "${FUNCNAME}: git clone ${EGIT_LOCAL_OPTIONS} \"${repo_uri}\" \"${EGIT_DIR}\""
if git clone ${EGIT_LOCAL_OPTIONS} "${repo_uri}" "${EGIT_DIR}"; then git clone ${EGIT_LOCAL_OPTIONS} "${repo_uri}" "${EGIT_DIR}"
if [[ $? -eq 0 ]]; then
# global variable containing the repo_name we will be using # global variable containing the repo_name we will be using
debug-print "${FUNCNAME}: EGIT_REPO_URI_SELECTED=\"${repo_uri}\"" debug-print "${FUNCNAME}: EGIT_REPO_URI_SELECTED=\"${repo_uri}\""
EGIT_REPO_URI_SELECTED="${repo_uri}" EGIT_REPO_URI_SELECTED="${repo_uri}"
@ -332,12 +298,12 @@ git-2_initial_clone() {
fi fi
done done
[[ ${EGIT_REPO_URI_SELECTED} ]] \ if [[ -z ${EGIT_REPO_URI_SELECTED} ]]; then
|| die "${FUNCNAME}: can't fetch from ${EGIT_REPO_URI}" die "${FUNCNAME}: can't fetch from ${EGIT_REPO_URI}"
fi
} }
# @FUNCTION: git-2_update_repo # @FUNCTION: git-2_update_repo
# @INTERNAL
# @DESCRIPTION: # @DESCRIPTION:
# Internal function running update command on specified repo_uri. # Internal function running update command on specified repo_uri.
git-2_update_repo() { git-2_update_repo() {
@ -345,7 +311,7 @@ git-2_update_repo() {
local repo_uri local repo_uri
if [[ ${EGIT_LOCAL_NONBARE} ]]; then if [[ -n ${EGIT_LOCAL_NONBARE} ]]; then
# checkout master branch and drop all other local branches # checkout master branch and drop all other local branches
git checkout ${EGIT_MASTER} || die "${FUNCNAME}: can't checkout master branch ${EGIT_MASTER}" git checkout ${EGIT_MASTER} || die "${FUNCNAME}: can't checkout master branch ${EGIT_MASTER}"
for x in $(git branch | grep -v "* ${EGIT_MASTER}" | tr '\n' ' '); do for x in $(git branch | grep -v "* ${EGIT_MASTER}" | tr '\n' ' '); do
@ -360,7 +326,8 @@ git-2_update_repo() {
git config remote.origin.url "${repo_uri}" git config remote.origin.url "${repo_uri}"
debug-print "${EGIT_UPDATE_CMD}" debug-print "${EGIT_UPDATE_CMD}"
if ${EGIT_UPDATE_CMD} > /dev/null; then ${EGIT_UPDATE_CMD} > /dev/null
if [[ $? -eq 0 ]]; then
# global variable containing the repo_name we will be using # global variable containing the repo_name we will be using
debug-print "${FUNCNAME}: EGIT_REPO_URI_SELECTED=\"${repo_uri}\"" debug-print "${FUNCNAME}: EGIT_REPO_URI_SELECTED=\"${repo_uri}\""
EGIT_REPO_URI_SELECTED="${repo_uri}" EGIT_REPO_URI_SELECTED="${repo_uri}"
@ -368,12 +335,12 @@ git-2_update_repo() {
fi fi
done done
[[ ${EGIT_REPO_URI_SELECTED} ]] \ if [[ -z ${EGIT_REPO_URI_SELECTED} ]]; then
|| die "${FUNCNAME}: can't update from ${EGIT_REPO_URI}" die "${FUNCNAME}: can't update from ${EGIT_REPO_URI}"
fi
} }
# @FUNCTION: git-2_fetch # @FUNCTION: git-2_fetch
# @INTERNAL
# @DESCRIPTION: # @DESCRIPTION:
# Internal function fetching repository from EGIT_REPO_URI and storing it in # Internal function fetching repository from EGIT_REPO_URI and storing it in
# specified EGIT_STORE_DIR. # specified EGIT_STORE_DIR.
@ -382,7 +349,7 @@ git-2_fetch() {
local oldsha cursha repo_type local oldsha cursha repo_type
[[ ${EGIT_LOCAL_NONBARE} ]] && repo_type="non-bare repository" || repo_type="bare repository" [[ -n ${EGIT_LOCAL_NONBARE} ]] && repo_type="non-bare repository" || repo_type="bare repository"
if [[ ! -d ${EGIT_DIR} ]]; then if [[ ! -d ${EGIT_DIR} ]]; then
git-2_initial_clone git-2_initial_clone
@ -393,7 +360,7 @@ git-2_fetch() {
echo " at the commit: ${cursha}" echo " at the commit: ${cursha}"
popd > /dev/null popd > /dev/null
elif [[ ${EVCS_OFFLINE} ]]; then elif [[ -n ${EVCS_OFFLINE} ]]; then
pushd "${EGIT_DIR}" > /dev/null pushd "${EGIT_DIR}" > /dev/null
cursha=$(git rev-parse ${UPSTREAM_BRANCH}) cursha=$(git rev-parse ${UPSTREAM_BRANCH})
echo "GIT offline update -->" echo "GIT offline update -->"
@ -429,16 +396,9 @@ git-2_fetch() {
echo " branch: ${EGIT_BRANCH}" echo " branch: ${EGIT_BRANCH}"
echo " storage directory: \"${EGIT_DIR}\"" echo " storage directory: \"${EGIT_DIR}\""
echo " checkout type: ${repo_type}" echo " checkout type: ${repo_type}"
# Cleanup after git.eclass
if [[ ${EGIT_OLD_CLONE} ]]; then
einfo "${FUNCNAME}: removing old clone in ${EGIT_OLD_CLONE}."
rm -rf "${EGIT_OLD_CLONE}"
fi
} }
# @FUNCTION: git_bootstrap # @FUNCTION: git_bootstrap
# @INTERNAL
# @DESCRIPTION: # @DESCRIPTION:
# Internal function that runs bootstrap command on unpacked source. # Internal function that runs bootstrap command on unpacked source.
git-2_bootstrap() { git-2_bootstrap() {
@ -451,7 +411,7 @@ git-2_bootstrap() {
# enviroment the package will fail if there is no update, thus in # enviroment the package will fail if there is no update, thus in
# combination with --keep-going it would lead in not-updating # combination with --keep-going it would lead in not-updating
# pakcages that are up-to-date. # pakcages that are up-to-date.
if [[ ${EGIT_BOOTSTRAP} ]]; then if [[ -n ${EGIT_BOOTSTRAP} ]]; then
pushd "${EGIT_SOURCEDIR}" > /dev/null pushd "${EGIT_SOURCEDIR}" > /dev/null
einfo "Starting bootstrap" einfo "Starting bootstrap"
@ -481,7 +441,6 @@ git-2_bootstrap() {
} }
# @FUNCTION: git-2_migrate_repository # @FUNCTION: git-2_migrate_repository
# @INTERNAL
# @DESCRIPTION: # @DESCRIPTION:
# Internal function migrating between bare and normal checkout repository. # Internal function migrating between bare and normal checkout repository.
# This is based on usage of EGIT_SUBMODULES, at least until they # This is based on usage of EGIT_SUBMODULES, at least until they
@ -491,18 +450,24 @@ git-2_bootstrap() {
git-2_migrate_repository() { git-2_migrate_repository() {
debug-print-function ${FUNCNAME} "$@" debug-print-function ${FUNCNAME} "$@"
local bare returnstate local target returnstate
# first find out if we have submodules # first find out if we have submodules
# or user explicitly wants us to use non-bare clones if [[ -z ${EGIT_HAS_SUBMODULES} ]]; then
if ! [[ ${EGIT_HAS_SUBMODULES} || ${EGIT_NONBARE} ]]; then target="bare"
bare=1 else
target="full"
fi
# check if user didn't specify that we want non-bare repo
if [[ -n ${EGIT_NONBARE} ]]; then
target="full"
EGIT_LOCAL_NONBARE="true"
fi fi
# test if we already have some repo and if so find out if we have # test if we already have some repo and if so find out if we have
# to migrate the data # to migrate the data
if [[ -d ${EGIT_DIR} ]]; then if [[ -d ${EGIT_DIR} ]]; then
if [[ ${bare} && -d ${EGIT_DIR}/.git ]]; then if [[ ${target} == bare && -d ${EGIT_DIR}/.git ]]; then
debug-print "${FUNCNAME}: converting \"${EGIT_DIR}\" to bare copy" debug-print "${FUNCNAME}: converting \"${EGIT_DIR}\" to bare copy"
ebegin "Converting \"${EGIT_DIR}\" from non-bare to bare copy" ebegin "Converting \"${EGIT_DIR}\" from non-bare to bare copy"
@ -514,7 +479,8 @@ git-2_migrate_repository() {
rm -rf "${EGIT_DIR}" rm -rf "${EGIT_DIR}"
mv "${EGIT_DIR}.bare" "${EGIT_DIR}" mv "${EGIT_DIR}.bare" "${EGIT_DIR}"
eend ${returnstate} eend ${returnstate}
elif [[ ! ${bare} && ! -d ${EGIT_DIR}/.git ]]; then fi
if [[ ${target} == full && ! -d ${EGIT_DIR}/.git ]]; then
debug-print "${FUNCNAME}: converting \"${EGIT_DIR}\" to non-bare copy" debug-print "${FUNCNAME}: converting \"${EGIT_DIR}\" to non-bare copy"
ebegin "Converting \"${EGIT_DIR}\" from bare to non-bare copy" ebegin "Converting \"${EGIT_DIR}\" from bare to non-bare copy"
@ -534,13 +500,12 @@ git-2_migrate_repository() {
fi fi
# set various options to work with both targets # set various options to work with both targets
if [[ ${bare} ]]; then if [[ ${target} == bare ]]; then
debug-print "${FUNCNAME}: working in bare repository for \"${EGIT_DIR}\"" debug-print "${FUNCNAME}: working in bare repository for \"${EGIT_DIR}\""
EGIT_LOCAL_OPTIONS+="${EGIT_OPTIONS} --bare" EGIT_LOCAL_OPTIONS+="${EGIT_OPTIONS} --bare"
MOVE_COMMAND="git clone -l -s -n ${EGIT_DIR// /\\ }" MOVE_COMMAND="git clone -l -s -n ${EGIT_DIR// /\\ }"
EGIT_UPDATE_CMD="git fetch -t -f -u origin ${EGIT_BRANCH}:${EGIT_BRANCH}" EGIT_UPDATE_CMD="git fetch -t -f -u origin ${EGIT_BRANCH}:${EGIT_BRANCH}"
UPSTREAM_BRANCH="${EGIT_BRANCH}" UPSTREAM_BRANCH="${EGIT_BRANCH}"
EGIT_LOCAL_NONBARE=
else else
debug-print "${FUNCNAME}: working in bare repository for non-bare \"${EGIT_DIR}\"" debug-print "${FUNCNAME}: working in bare repository for non-bare \"${EGIT_DIR}\""
MOVE_COMMAND="cp -pPR ." MOVE_COMMAND="cp -pPR ."
@ -552,7 +517,6 @@ git-2_migrate_repository() {
} }
# @FUNCTION: git-2_cleanup # @FUNCTION: git-2_cleanup
# @INTERNAL
# @DESCRIPTION: # @DESCRIPTION:
# Internal function cleaning up all the global variables # Internal function cleaning up all the global variables
# that are not required after the unpack has been done. # that are not required after the unpack has been done.
@ -592,9 +556,9 @@ git-2_src_unpack() {
# Users can specify some SRC_URI and we should # Users can specify some SRC_URI and we should
# unpack the files too. # unpack the files too.
if [[ ! ${EGIT_NOUNPACK} ]]; then if [[ -z ${EGIT_NOUNPACK} ]]; then
if has ${EAPI:-0} 0 1; then if has ${EAPI:-0} 0 1; then
[[ ${A} ]] && unpack ${A} [[ -n ${A} ]] && unpack ${A}
else else
default_src_unpack default_src_unpack
fi fi

View File

@ -1,35 +1,31 @@
# Copyright 1999-2013 Gentoo Foundation # Copyright 1999-2009 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2 # Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/eclass/git.eclass,v 1.60 2013/01/15 11:23:43 jlec Exp $ # $Header: /var/cvsroot/gentoo-x86/eclass/git.eclass,v 1.43 2010/02/24 01:16:35 abcd Exp $
# @DEPRECATED
# This eclass has been superseded by git-2 eclass.
# Please modify your ebuilds to use that one instead.
# @ECLASS: git.eclass # @ECLASS: git.eclass
# @MAINTAINER: # @MAINTAINER:
# Tomas Chvatal <scarabeus@gentoo.org>
# Donnie Berkholz <dberkholz@gentoo.org> # Donnie Berkholz <dberkholz@gentoo.org>
# @BLURB: Fetching and unpacking of git repositories # @BLURB: This eclass provides functions for fetch and unpack git repositories
# @DESCRIPTION: # @DESCRIPTION:
# The git eclass provides functions to fetch, patch and bootstrap # The eclass is based on subversion eclass.
# software sources from git repositories and is based on the subversion eclass. # If you use this eclass, the ${S} is ${WORKDIR}/${P}.
# It is necessary to define at least the EGIT_REPO_URI variable. # It is necessary to define the EGIT_REPO_URI variable at least.
# # @THANKS TO:
# THANKS TO:
# Fernando J. Pereda <ferdy@gentoo.org> # Fernando J. Pereda <ferdy@gentoo.org>
inherit eutils inherit eutils
EGIT="git.eclass" EGIT="git.eclass"
# We DEPEND on a not too ancient git version # We DEPEND on at least a bit recent git version
DEPEND=">=dev-vcs/git-1.6" DEPEND=">=dev-vcs/git-1.6"
EXPORTED_FUNCTIONS="src_unpack" EXPORTED_FUNCTIONS="src_unpack"
case "${EAPI:-0}" in case "${EAPI:-0}" in
2|3|4|5) EXPORTED_FUNCTIONS="${EXPORTED_FUNCTIONS} src_prepare" ;; 3|2) EXPORTED_FUNCTIONS="${EXPORTED_FUNCTIONS} src_prepare" ;;
1|0) ;; 1|0) ;;
*) die "EAPI=${EAPI} is not supported" ;; :) DEPEND="EAPI-UNSUPPORTED" ;;
esac esac
EXPORT_FUNCTIONS ${EXPORTED_FUNCTIONS} EXPORT_FUNCTIONS ${EXPORTED_FUNCTIONS}
@ -38,23 +34,21 @@ EXPORT_FUNCTIONS ${EXPORTED_FUNCTIONS}
# @ECLASS-VARIABLE: EGIT_QUIET # @ECLASS-VARIABLE: EGIT_QUIET
# @DESCRIPTION: # @DESCRIPTION:
# Set to non-empty value to supress some eclass messages. # Enables user specified verbosity for the eclass elog informations.
: ${EGIT_QUIET:=${ESCM_QUIET}} # The user just needs to add EGIT_QUIET="ON" to the /etc/make.conf.
: ${EGIT_QUIET:="OFF"}
# @ECLASS-VARIABLE: EGIT_STORE_DIR # @ECLASS-VARIABLE: EGIT_STORE_DIR
# @DESCRIPTION: # @DESCRIPTION:
# Storage directory for git sources. # Storage directory for git sources.
# Can be redefined. # Can be redefined.
: ${EGIT_STORE_DIR:="${PORTAGE_ACTUAL_DISTDIR-${DISTDIR}}/git-src"} [[ -z ${EGIT_STORE_DIR} ]] && EGIT_STORE_DIR="${PORTAGE_ACTUAL_DISTDIR-${DISTDIR}}/git-src"
# @ECLASS-VARIABLE: EGIT_UNPACK_DIR
# @DESCRIPTION:
# Directory to unpack git sources in.
# @ECLASS-VARIABLE: EGIT_HAS_SUBMODULES # @ECLASS-VARIABLE: EGIT_HAS_SUBMODULES
# @DESCRIPTION: # @DESCRIPTION:
# Set this to non-empty value to enable submodule support (slower). # Set this to "true" to enable the (slower) submodule support.
: ${EGIT_HAS_SUBMODULES:=} # This variable should be set before inheriting git.eclass
: ${EGIT_HAS_SUBMODULES:=false}
# @ECLASS-VARIABLE: EGIT_FETCH_CMD # @ECLASS-VARIABLE: EGIT_FETCH_CMD
# @DESCRIPTION: # @DESCRIPTION:
@ -64,7 +58,7 @@ EXPORT_FUNCTIONS ${EXPORTED_FUNCTIONS}
# @ECLASS-VARIABLE: EGIT_UPDATE_CMD # @ECLASS-VARIABLE: EGIT_UPDATE_CMD
# @DESCRIPTION: # @DESCRIPTION:
# Git fetch command. # Git fetch command.
if [[ -n ${EGIT_HAS_SUBMODULES} ]]; then if ${EGIT_HAS_SUBMODULES}; then
EGIT_UPDATE_CMD="git pull -f -u" EGIT_UPDATE_CMD="git pull -f -u"
else else
EGIT_UPDATE_CMD="git fetch -f -u" EGIT_UPDATE_CMD="git fetch -f -u"
@ -99,16 +93,20 @@ EGIT_DIFFSTAT_CMD="git --no-pager diff --stat"
# ssh:// # ssh://
eval X="\$${PN//[-+]/_}_LIVE_REPO" eval X="\$${PN//[-+]/_}_LIVE_REPO"
if [[ ${X} = "" ]]; then if [[ ${X} = "" ]]; then
: ${EGIT_REPO_URI:=} EGIT_REPO_URI=${EGIT_REPO_URI:=}
else else
EGIT_REPO_URI="${X}" EGIT_REPO_URI="${X}"
fi fi
# @ECLASS-VARIABLE: EGIT_PROJECT # @ECLASS-VARIABLE: EGIT_PROJECT
# @DESCRIPTION: # @DESCRIPTION:
# Project name, it must be unique across EGIT_STORE_DIR. # Project name of your ebuild.
# Git eclass will check out the git repository into ${EGIT_STORE_DIR}/${EGIT_PROJECT}/${EGIT_REPO_URI##*/} # Git eclass will check out the git repository like:
# Default is ${PN}. # ${EGIT_STORE_DIR}/${EGIT_PROJECT}/${EGIT_REPO_URI##*/}
: ${EGIT_PROJECT:=${PN}} # so if you define EGIT_REPO_URI as http://git.collab.net/repo/git or
# http://git.collab.net/repo/git. and PN is subversion-git.
# it will check out like:
# ${EGIT_STORE_DIR}/subversion
: ${EGIT_PROJECT:=${PN/-git}}
# @ECLASS-VARIABLE: EGIT_BOOTSTRAP # @ECLASS-VARIABLE: EGIT_BOOTSTRAP
# @DESCRIPTION: # @DESCRIPTION:
@ -120,7 +118,7 @@ fi
# Set this variable to a non-empty value to disable the automatic updating of # Set this variable to a non-empty value to disable the automatic updating of
# an GIT source tree. This is intended to be set outside the git source # an GIT source tree. This is intended to be set outside the git source
# tree by users. # tree by users.
: ${EGIT_OFFLINE:=${ESCM_OFFLINE}} EGIT_OFFLINE="${EGIT_OFFLINE:-${ESCM_OFFLINE}}"
# @ECLASS-VARIABLE: EGIT_PATCHES # @ECLASS-VARIABLE: EGIT_PATCHES
# @DESCRIPTION: # @DESCRIPTION:
@ -132,8 +130,8 @@ fi
# @DESCRIPTION: # @DESCRIPTION:
# git eclass can fetch any branch in git_fetch(). # git eclass can fetch any branch in git_fetch().
eval X="\$${PN//[-+]/_}_LIVE_BRANCH" eval X="\$${PN//[-+]/_}_LIVE_BRANCH"
if [[ "${X}" = "" ]]; then if [[ ${X} = "" ]]; then
: ${EGIT_BRANCH:=master} EGIT_BRANCH=${EGIT_BRANCH:=master}
else else
EGIT_BRANCH="${X}" EGIT_BRANCH="${X}"
fi fi
@ -142,7 +140,7 @@ fi
# @DESCRIPTION: # @DESCRIPTION:
# git eclass can checkout any commit. # git eclass can checkout any commit.
eval X="\$${PN//[-+]/_}_LIVE_COMMIT" eval X="\$${PN//[-+]/_}_LIVE_COMMIT"
if [[ "${X}" = "" ]]; then if [[ ${X} = "" ]]; then
: ${EGIT_COMMIT:=${EGIT_BRANCH}} : ${EGIT_COMMIT:=${EGIT_BRANCH}}
else else
EGIT_COMMIT="${X}" EGIT_COMMIT="${X}"
@ -150,25 +148,23 @@ fi
# @ECLASS-VARIABLE: EGIT_REPACK # @ECLASS-VARIABLE: EGIT_REPACK
# @DESCRIPTION: # @DESCRIPTION:
# Set to non-empty value to repack objects to save disk space. However this can # git eclass will repack objects to save disk space. However this can take a
# take a long time with VERY big repositories. # long time with VERY big repositories.
: ${EGIT_REPACK:=} : ${EGIT_REPACK:=false}
# @ECLASS-VARIABLE: EGIT_PRUNE # @ECLASS-VARIABLE: EGIT_PRUNE
# @DESCRIPTION: # @DESCRIPTION:
# Set to non-empty value to prune loose objects on each fetch. This is useful # git eclass can prune the local clone. This is useful if upstream rewinds and
# if upstream rewinds and rebases branches often. # rebases branches too often.
: ${EGIT_PRUNE:=} : ${EGIT_PRUNE:=false}
# @FUNCTION: git_submodules # @FUNCTION: git_submodules
# @DESCRIPTION: # @DESCRIPTION:
# Internal function wrapping the submodule initialisation and update # Internal function wrapping the submodule initialisation and update
git_submodules() { git_submodules() {
if [[ -n ${EGIT_HAS_SUBMODULES} ]]; then if ${EGIT_HAS_SUBMODULES}; then
debug-print "git submodule init" debug-print "git submodule init"
git submodule init git submodule init
debug-print "git submodule sync"
git submodule sync
debug-print "git submodule update" debug-print "git submodule update"
git submodule update git submodule update
fi fi
@ -180,12 +176,13 @@ git_submodules() {
# EGIT_BRANCH variables. # EGIT_BRANCH variables.
git_branch() { git_branch() {
local branchname=branch-${EGIT_BRANCH} src=origin/${EGIT_BRANCH} local branchname=branch-${EGIT_BRANCH} src=origin/${EGIT_BRANCH}
if [[ "${EGIT_COMMIT}" != "${EGIT_BRANCH}" ]]; then if [[ ${EGIT_COMMIT} != ${EGIT_BRANCH} ]]; then
branchname=tree-${EGIT_COMMIT} branchname=tree-${EGIT_COMMIT}
src=${EGIT_COMMIT} src=${EGIT_COMMIT}
fi fi
debug-print "git checkout -b ${branchname} ${src}" debug-print "git checkout -b ${branchname} ${src}"
git checkout -b ${branchname} ${src} &> /dev/null git checkout -b ${branchname} ${src} || \
die "${EGIT}: Could not run git checkout -b ${branchname} ${src}"
unset branchname src unset branchname src
} }
@ -196,15 +193,11 @@ git_branch() {
git_fetch() { git_fetch() {
debug-print-function ${FUNCNAME} "$@" debug-print-function ${FUNCNAME} "$@"
eqawarn "git.eclass is deprecated."
eqawarn "Please update your ebuilds to use git-2 instead. For details, see"
eqawarn "http://archives.gentoo.org/gentoo-dev/msg_b7ba363cae580845819ae3501fb157e9.xml"
local GIT_DIR EGIT_CLONE_DIR oldsha1 cursha1 extra_clone_opts upstream_branch local GIT_DIR EGIT_CLONE_DIR oldsha1 cursha1 extra_clone_opts upstream_branch
[[ -z ${EGIT_HAS_SUBMODULES} ]] && export GIT_DIR ${EGIT_HAS_SUBMODULES} || export GIT_DIR
# choose if user wants elog or just einfo. # choose if user wants elog or just einfo.
if [[ -n ${EGIT_QUIET} ]]; then if [[ ${EGIT_QUIET} != OFF ]]; then
elogcmd="einfo" elogcmd="einfo"
else else
elogcmd="elog" elogcmd="elog"
@ -216,7 +209,7 @@ git_fetch() {
# folder. # folder.
#[[ ${EGIT_COMMIT} = ${EGIT_BRANCH} ]] && \ #[[ ${EGIT_COMMIT} = ${EGIT_BRANCH} ]] && \
# EGIT_FETCH_CMD="${EGIT_FETCH_CMD} --depth 1" # EGIT_FETCH_CMD="${EGIT_FETCH_CMD} --depth 1"
if [[ -n ${EGIT_TREE} ]] ; then if [[ ! -z ${EGIT_TREE} ]] ; then
EGIT_COMMIT=${EGIT_TREE} EGIT_COMMIT=${EGIT_TREE}
ewarn "QA: Usage of deprecated EGIT_TREE variable detected." ewarn "QA: Usage of deprecated EGIT_TREE variable detected."
ewarn "QA: Use EGIT_COMMIT variable instead." ewarn "QA: Use EGIT_COMMIT variable instead."
@ -238,8 +231,13 @@ git_fetch() {
if [[ ! -d ${EGIT_STORE_DIR} ]] ; then if [[ ! -d ${EGIT_STORE_DIR} ]] ; then
debug-print "${FUNCNAME}: initial clone. creating git directory" debug-print "${FUNCNAME}: initial clone. creating git directory"
addwrite / addwrite /
mkdir -m 775 -p "${EGIT_STORE_DIR}" \ # TODO(ers): Remove this workaround once we figure out how to make
# sure the directories are owned by the user instead of by root.
local old_umask="`umask`"
umask 002
mkdir -p "${EGIT_STORE_DIR}" \
|| die "${EGIT}: can't mkdir ${EGIT_STORE_DIR}." || die "${EGIT}: can't mkdir ${EGIT_STORE_DIR}."
umask ${old_umask}
export SANDBOX_WRITE="${SANDBOX_WRITE%%:/}" export SANDBOX_WRITE="${SANDBOX_WRITE%%:/}"
fi fi
@ -262,20 +260,23 @@ git_fetch() {
einfo "The ${EGIT_CLONE_DIR} was shallow copy. Refetching." einfo "The ${EGIT_CLONE_DIR} was shallow copy. Refetching."
fi fi
# repack from bare copy to normal one # repack from bare copy to normal one
if [[ -n ${EGIT_HAS_SUBMODULES} ]] && [[ -d ${GIT_DIR} && ! -d ${GIT_DIR}/.git ]]; then if ${EGIT_HAS_SUBMODULES} && [[ -d ${GIT_DIR} && ! -d "${GIT_DIR}/.git/" ]]; then
rm -rf "${GIT_DIR}" rm -rf "${GIT_DIR}"
einfo "The ${EGIT_CLONE_DIR} was bare copy. Refetching." einfo "The ${EGIT_CLONE_DIR} was bare copy. Refetching."
fi fi
if [[ -z ${EGIT_HAS_SUBMODULES} ]] && [[ -d ${GIT_DIR} && -d ${GIT_DIR}/.git ]]; then if ! ${EGIT_HAS_SUBMODULES} && [[ -d ${GIT_DIR} && -d ${GIT_DIR}/.git ]]; then
rm -rf "${GIT_DIR}" rm -rf "${GIT_DIR}"
einfo "The ${EGIT_CLONE_DIR} was not a bare copy. Refetching." einfo "The ${EGIT_CLONE_DIR} was not a bare copy. Refetching."
fi fi
if [[ -n ${EGIT_HAS_SUBMODULES} ]]; then if ${EGIT_HAS_SUBMODULES}; then
upstream_branch=origin/${EGIT_BRANCH} upstream_branch=origin/${EGIT_BRANCH}
else else
upstream_branch=${EGIT_BRANCH} upstream_branch=${EGIT_BRANCH}
extra_clone_opts=--bare # Note: Normally clones are created using --bare, which does not fetch
# remote refs and only updates master. This is not okay. --mirror
# changes that.
extra_clone_opts=--mirror
fi fi
if [[ ! -d ${GIT_DIR} ]] ; then if [[ ! -d ${GIT_DIR} ]] ; then
@ -284,9 +285,14 @@ git_fetch() {
${elogcmd} " repository: ${EGIT_REPO_URI}" ${elogcmd} " repository: ${EGIT_REPO_URI}"
debug-print "${EGIT_FETCH_CMD} ${extra_clone_opts} ${EGIT_OPTIONS} \"${EGIT_REPO_URI}\" ${GIT_DIR}" debug-print "${EGIT_FETCH_CMD} ${extra_clone_opts} ${EGIT_OPTIONS} \"${EGIT_REPO_URI}\" ${GIT_DIR}"
# TODO(ers): Remove this workaround once we figure out how to make
# sure the directories are owned by the user instead of by root.
local old_umask="`umask`"
umask 002
${EGIT_FETCH_CMD} ${extra_clone_opts} ${EGIT_OPTIONS} "${EGIT_REPO_URI}" ${GIT_DIR} \ ${EGIT_FETCH_CMD} ${extra_clone_opts} ${EGIT_OPTIONS} "${EGIT_REPO_URI}" ${GIT_DIR} \
|| die "${EGIT}: can't fetch from ${EGIT_REPO_URI}." || die "${EGIT}: can't fetch from ${EGIT_REPO_URI}."
umask ${old_umask}
pushd "${GIT_DIR}" &> /dev/null pushd "${GIT_DIR}" &> /dev/null
cursha1=$(git rev-parse ${upstream_branch}) cursha1=$(git rev-parse ${upstream_branch})
${elogcmd} " at the commit: ${cursha1}" ${elogcmd} " at the commit: ${cursha1}"
@ -311,7 +317,7 @@ git_fetch() {
oldsha1=$(git rev-parse ${upstream_branch}) oldsha1=$(git rev-parse ${upstream_branch})
if [[ -n ${EGIT_HAS_SUBMODULES} ]]; then if ${EGIT_HAS_SUBMODULES}; then
debug-print "${EGIT_UPDATE_CMD} ${EGIT_OPTIONS}" debug-print "${EGIT_UPDATE_CMD} ${EGIT_OPTIONS}"
# fix branching # fix branching
git checkout ${EGIT_MASTER} git checkout ${EGIT_MASTER}
@ -320,22 +326,26 @@ git_fetch() {
done done
${EGIT_UPDATE_CMD} ${EGIT_OPTIONS} \ ${EGIT_UPDATE_CMD} ${EGIT_OPTIONS} \
|| die "${EGIT}: can't update from ${EGIT_REPO_URI}." || die "${EGIT}: can't update from ${EGIT_REPO_URI}."
else elif [[ "${EGIT_COMMIT}" = "${EGIT_BRANCH}" ]]; then
debug-print "${EGIT_UPDATE_CMD} ${EGIT_OPTIONS} origin ${EGIT_BRANCH}:${EGIT_BRANCH}" debug-print "${EGIT_UPDATE_CMD} ${EGIT_OPTIONS} origin ${EGIT_BRANCH}:${EGIT_BRANCH}"
${EGIT_UPDATE_CMD} ${EGIT_OPTIONS} origin ${EGIT_BRANCH}:${EGIT_BRANCH} \ ${EGIT_UPDATE_CMD} ${EGIT_OPTIONS} origin ${EGIT_BRANCH}:${EGIT_BRANCH} \
|| die "${EGIT}: can't update from ${EGIT_REPO_URI}." || die "${EGIT}: can't update from ${EGIT_REPO_URI}."
else
debug-print "${EGIT_UPDATE_CMD} ${EGIT_OPTIONS} origin"
${EGIT_UPDATE_CMD} ${EGIT_OPTIONS} origin \
|| die "${EGIT}: can't update from ${EGIT_REPO_URI}."
fi fi
git_submodules git_submodules
cursha1=$(git rev-parse ${upstream_branch}) cursha1=$(git rev-parse ${upstream_branch})
# write out message based on the revisions # write out message based on the revisions
if [[ "${oldsha1}" != "${cursha1}" ]]; then if [[ ${oldsha1} != ${cursha1} ]]; then
${elogcmd} " updating from commit: ${oldsha1}" ${elogcmd} " updating from commit: ${oldsha1}"
${elogcmd} " to commit: ${cursha1}" ${elogcmd} " to commit: ${cursha1}"
else else
${elogcmd} " at the commit: ${cursha1}" ${elogcmd} " at the commit: ${cursha1}"
# @ECLASS-VARIABLE: LIVE_FAIL_FETCH_IF_REPO_NOT_UPDATED # @ECLASS_VARIABLE: LIVE_FAIL_FETCH_IF_REPO_NOT_UPDATED
# @DESCRIPTION: # @DESCRIPTION:
# If this variable is set to TRUE in make.conf or somewhere in # If this variable is set to TRUE in make.conf or somewhere in
# enviroment the package will fail if there is no update, thus in # enviroment the package will fail if there is no update, thus in
@ -351,11 +361,9 @@ git_fetch() {
fi fi
pushd "${GIT_DIR}" &> /dev/null pushd "${GIT_DIR}" &> /dev/null
if [[ -n ${EGIT_REPACK} ]] || [[ -n ${EGIT_PRUNE} ]]; then if ${EGIT_REPACK} || ${EGIT_PRUNE} ; then
ebegin "Garbage collecting the repository" ebegin "Garbage collecting the repository"
local args git gc $(${EGIT_PRUNE} && echo '--prune')
[[ -n ${EGIT_PRUNE} ]] && args='--prune'
git gc ${args}
eend $? eend $?
fi fi
popd &> /dev/null popd &> /dev/null
@ -364,28 +372,28 @@ git_fetch() {
export EGIT_VERSION="${cursha1}" export EGIT_VERSION="${cursha1}"
# log the repo state # log the repo state
[[ "${EGIT_COMMIT}" != "${EGIT_BRANCH}" ]] && ${elogcmd} " commit: ${EGIT_COMMIT}" [[ ${EGIT_COMMIT} != ${EGIT_BRANCH} ]] && elog " commit: ${EGIT_COMMIT}"
${elogcmd} " branch: ${EGIT_BRANCH}" ${elogcmd} " branch: ${EGIT_BRANCH}"
${elogcmd} " storage directory: \"${GIT_DIR}\"" ${elogcmd} " storage directory: \"${GIT_DIR}\""
if [[ -n ${EGIT_HAS_SUBMODULES} ]]; then if ${EGIT_HAS_SUBMODULES}; then
pushd "${GIT_DIR}" &> /dev/null pushd "${GIT_DIR}" &> /dev/null
debug-print "rsync -rlpgo . \"${EGIT_UNPACK_DIR:-${S}}\"" debug-print "rsync -rlpgo . \"${S}\""
time rsync -rlpgo . "${EGIT_UNPACK_DIR:-${S}}" time rsync -rlpgo . "${S}"
popd &> /dev/null popd &> /dev/null
else else
unset GIT_DIR unset GIT_DIR
debug-print "git clone -l -s -n \"${EGIT_STORE_DIR}/${EGIT_CLONE_DIR}\" \"${EGIT_UNPACK_DIR:-${S}}\"" debug-print "git clone -l -s -n \"${EGIT_STORE_DIR}/${EGIT_CLONE_DIR}\" \"${S}\""
git clone -l -s -n "${EGIT_STORE_DIR}/${EGIT_CLONE_DIR}" "${EGIT_UNPACK_DIR:-${S}}" git clone -l -s -n "${EGIT_STORE_DIR}/${EGIT_CLONE_DIR}" "${S}"
fi fi
pushd "${EGIT_UNPACK_DIR:-${S}}" &> /dev/null pushd "${S}" &> /dev/null
git_branch git_branch
# submodules always reqire net (thanks to branches changing) # submodules always reqire net (thanks to branches changing)
[[ -z ${EGIT_OFFLINE} ]] && git_submodules [[ -n ${EGIT_OFFLINE} ]] || git_submodules
popd &> /dev/null popd &> /dev/null
echo ">>> Unpacked to ${EGIT_UNPACK_DIR:-${S}}" echo ">>> Unpacked to ${S}"
} }
# @FUNCTION: git_bootstrap # @FUNCTION: git_bootstrap
@ -428,19 +436,19 @@ git_bootstrap() {
# @FUNCTION: git_apply_patches # @FUNCTION: git_apply_patches
# @DESCRIPTION: # @DESCRIPTION:
# Apply patches from EGIT_PATCHES bash array. # Apply patches from EGIT_PATCHES bash array.
# Preferred is using the variable as bash array but for now it allows to write # Preffered is using the variable as bash array but for now it allows to write
# it also as normal space separated string list. (This part of code should be # it also as normal space separated string list. (This part of code should be
# removed when all ebuilds get converted on bash array). # removed when all ebuilds get converted on bash array).
git_apply_patches() { git_apply_patches() {
debug-print-function ${FUNCNAME} "$@" debug-print-function ${FUNCNAME} "$@"
pushd "${EGIT_UNPACK_DIR:-${S}}" > /dev/null pushd "${S}" > /dev/null
if [[ ${#EGIT_PATCHES[@]} -gt 1 ]] ; then if [[ ${#EGIT_PATCHES[@]} -gt 1 ]] ; then
for i in "${EGIT_PATCHES[@]}"; do for i in "${EGIT_PATCHES[@]}"; do
debug-print "$FUNCNAME: git_autopatch: patching from ${i}" debug-print "$FUNCNAME: git_autopatch: patching from ${i}"
epatch "${i}" epatch "${i}"
done done
elif [[ -n ${EGIT_PATCHES} ]]; then elif [[ ${EGIT_PATCHES} != "" ]]; then
# no need for loop if space separated string is passed. # no need for loop if space separated string is passed.
debug-print "$FUNCNAME: git_autopatch: patching from ${EGIT_PATCHES}" debug-print "$FUNCNAME: git_autopatch: patching from ${EGIT_PATCHES}"
epatch "${EGIT_PATCHES}" epatch "${EGIT_PATCHES}"

View File

@ -1,6 +1,6 @@
# Copyright 1999-2013 Gentoo Foundation # Copyright 1999-2011 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2 # Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/eclass/linux-info.eclass,v 1.96 2013/01/24 20:47:23 vapier Exp $ # $Header: /var/cvsroot/gentoo-x86/eclass/linux-info.eclass,v 1.90 2011/08/22 04:46:32 vapier Exp $
# @ECLASS: linux-info.eclass # @ECLASS: linux-info.eclass
# @MAINTAINER: # @MAINTAINER:
@ -18,14 +18,6 @@
# "kernel config" in this file means: # "kernel config" in this file means:
# The .config of the currently installed sources is used as the first # The .config of the currently installed sources is used as the first
# preference, with a fall-back to bundled config (/proc/config.gz) if available. # preference, with a fall-back to bundled config (/proc/config.gz) if available.
#
# Before using any of the config-handling functions in this eclass, you must
# ensure that one of the following functions has been called (in order of
# preference), otherwise you will get bugs like #364041):
# linux-info_pkg_setup
# linux-info_get_any_version
# get_version
# get_running_version
# A Couple of env vars are available to effect usage of this eclass # A Couple of env vars are available to effect usage of this eclass
# These are as follows: # These are as follows:
@ -167,7 +159,7 @@ qeerror() { qout eerror "${@}" ; }
# done by including the configfile, and printing the variable with Make. # done by including the configfile, and printing the variable with Make.
# It WILL break if your makefile has missing dependencies! # It WILL break if your makefile has missing dependencies!
getfilevar() { getfilevar() {
local ERROR basefname basedname myARCH="${ARCH}" local ERROR basefname basedname myARCH="${ARCH}"
ERROR=0 ERROR=0
[ -z "${1}" ] && ERROR=1 [ -z "${1}" ] && ERROR=1
@ -198,7 +190,7 @@ getfilevar() {
# This is done with sed matching an expression only. If the variable is defined, # This is done with sed matching an expression only. If the variable is defined,
# you will run into problems. See getfilevar for those cases. # you will run into problems. See getfilevar for those cases.
getfilevar_noexec() { getfilevar_noexec() {
local ERROR basefname basedname mycat myARCH="${ARCH}" local ERROR basefname basedname mycat myARCH="${ARCH}"
ERROR=0 ERROR=0
mycat='cat' mycat='cat'
@ -291,7 +283,8 @@ require_configured_kernel() {
# MUST call linux_config_exists first. # MUST call linux_config_exists first.
linux_chkconfig_present() { linux_chkconfig_present() {
linux_config_qa_check linux_chkconfig_present linux_config_qa_check linux_chkconfig_present
local RESULT config local RESULT
local config
config="${KV_OUT_DIR}/.config" config="${KV_OUT_DIR}/.config"
[ ! -f "${config}" ] && config="/proc/config.gz" [ ! -f "${config}" ] && config="/proc/config.gz"
RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")" RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")"
@ -307,7 +300,8 @@ linux_chkconfig_present() {
# MUST call linux_config_exists first. # MUST call linux_config_exists first.
linux_chkconfig_module() { linux_chkconfig_module() {
linux_config_qa_check linux_chkconfig_module linux_config_qa_check linux_chkconfig_module
local RESULT config local RESULT
local config
config="${KV_OUT_DIR}/.config" config="${KV_OUT_DIR}/.config"
[ ! -f "${config}" ] && config="/proc/config.gz" [ ! -f "${config}" ] && config="/proc/config.gz"
RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")" RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")"
@ -323,7 +317,8 @@ linux_chkconfig_module() {
# MUST call linux_config_exists first. # MUST call linux_config_exists first.
linux_chkconfig_builtin() { linux_chkconfig_builtin() {
linux_config_qa_check linux_chkconfig_builtin linux_config_qa_check linux_chkconfig_builtin
local RESULT config local RESULT
local config
config="${KV_OUT_DIR}/.config" config="${KV_OUT_DIR}/.config"
[ ! -f "${config}" ] && config="/proc/config.gz" [ ! -f "${config}" ] && config="/proc/config.gz"
RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")" RESULT="$(getfilevar_noexec CONFIG_${1} "${config}")"
@ -364,27 +359,40 @@ linux_chkconfig_string() {
# kernel_is 2 6 9 returns true # kernel_is 2 6 9 returns true
# @CODE # @CODE
# Note: duplicated in kernel-2.eclass # got the jist yet?
kernel_is() { kernel_is() {
# if we haven't determined the version yet, we need to. # if we haven't determined the version yet, we need to.
linux-info_get_any_version linux-info_get_any_version
# Now we can continue local operator testagainst value x=0 y=0 z=0
local operator test value
case ${1#-} in case ${1} in
lt) operator="-lt"; shift;; -lt|lt) operator="-lt"; shift;;
gt) operator="-gt"; shift;; -gt|gt) operator="-gt"; shift;;
le) operator="-le"; shift;; -le|le) operator="-le"; shift;;
ge) operator="-ge"; shift;; -ge|ge) operator="-ge"; shift;;
eq) operator="-eq"; shift;; -eq|eq) operator="-eq"; shift;;
*) operator="-eq";; *) operator="-eq";;
esac esac
[[ $# -gt 3 ]] && die "Error in kernel-2_kernel_is(): too many parameters"
: $(( test = (KV_MAJOR << 16) + (KV_MINOR << 8) + KV_PATCH )) for x in ${@}; do
: $(( value = (${1:-${KV_MAJOR}} << 16) + (${2:-${KV_MINOR}} << 8) + ${3:-${KV_PATCH}} )) for((y=0; y<$((3 - ${#x})); y++)); do value="${value}0"; done
[ ${test} ${operator} ${value} ] value="${value}${x}"
z=$((${z} + 1))
case ${z} in
1) for((y=0; y<$((3 - ${#KV_MAJOR})); y++)); do testagainst="${testagainst}0"; done;
testagainst="${testagainst}${KV_MAJOR}";;
2) for((y=0; y<$((3 - ${#KV_MINOR})); y++)); do testagainst="${testagainst}0"; done;
testagainst="${testagainst}${KV_MINOR}";;
3) for((y=0; y<$((3 - ${#KV_PATCH})); y++)); do testagainst="${testagainst}0"; done;
testagainst="${testagainst}${KV_PATCH}";;
*) die "Error in kernel-2_kernel_is(): Too many parameters.";;
esac
done
[ "${testagainst}" ${operator} "${value}" ] && return 0 || return 1
} }
get_localversion() { get_localversion() {
@ -493,7 +501,9 @@ get_version() {
# And if we didn't pass it, we can take a nosey in the Makefile # And if we didn't pass it, we can take a nosey in the Makefile
kbuild_output="$(${mkfunc} KBUILD_OUTPUT ${KERNEL_MAKEFILE})" kbuild_output="$(${mkfunc} KBUILD_OUTPUT ${KERNEL_MAKEFILE})"
OUTPUT_DIR="${OUTPUT_DIR:-${kbuild_output}}" if [ -e "${kbuild_output}" ]; then
OUTPUT_DIR="${OUTPUT_DIR:-${kbuild_output}}"
fi
# And contrary to existing functions I feel we shouldn't trust the # And contrary to existing functions I feel we shouldn't trust the
# directory name to find version information as this seems insane. # directory name to find version information as this seems insane.
@ -517,7 +527,7 @@ get_version() {
# but before we do this, we need to find if we use a different object directory. # but before we do this, we need to find if we use a different object directory.
# This *WILL* break if the user is using localversions, but we assume it was # This *WILL* break if the user is using localversions, but we assume it was
# caught before this if they are. # caught before this if they are.
OUTPUT_DIR="${OUTPUT_DIR:-/lib/modules/${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}/build}" OUTPUT_DIR="${OUTPUT_DIR:-${ROOT}/lib/modules/${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}${KV_EXTRA}/build}"
[ -h "${OUTPUT_DIR}" ] && KV_OUT_DIR="$(readlink -f ${OUTPUT_DIR})" [ -h "${OUTPUT_DIR}" ] && KV_OUT_DIR="$(readlink -f ${OUTPUT_DIR})"
[ -d "${OUTPUT_DIR}" ] && KV_OUT_DIR="${OUTPUT_DIR}" [ -d "${OUTPUT_DIR}" ] && KV_OUT_DIR="${OUTPUT_DIR}"
@ -586,14 +596,11 @@ get_running_version() {
get_version get_version
return $? return $?
else else
# This handles a variety of weird kernel versions. Make sure to update KV_MAJOR=$(get_version_component_range 1 ${KV_FULL})
# tests/linux-info:get_running_version.sh if you want to change this. KV_MINOR=$(get_version_component_range 2 ${KV_FULL})
local kv_full=${KV_FULL//[-+_]*} KV_PATCH=$(get_version_component_range 3 ${KV_FULL})
KV_MAJOR=$(get_version_component_range 1 ${kv_full}) KV_PATCH=${KV_PATCH//-*}
KV_MINOR=$(get_version_component_range 2 ${kv_full}) KV_EXTRA="${KV_FULL#${KV_MAJOR}.${KV_MINOR}.${KV_PATCH}}"
KV_PATCH=$(get_version_component_range 3 ${kv_full})
KV_EXTRA="${KV_FULL#${KV_MAJOR}.${KV_MINOR}${KV_PATCH:+.${KV_PATCH}}}"
: ${KV_PATCH:=0}
fi fi
return 0 return 0
} }
@ -625,14 +632,7 @@ check_kernel_built() {
require_configured_kernel require_configured_kernel
get_version get_version
local versionh_path if [ ! -f "${KV_OUT_DIR}/include/linux/version.h" ]
if kernel_is -ge 3 7; then
versionh_path="include/generated/uapi/linux/version.h"
else
versionh_path="include/linux/version.h"
fi
if [ ! -f "${KV_OUT_DIR}/${versionh_path}" ]
then then
eerror "These sources have not yet been prepared." eerror "These sources have not yet been prepared."
eerror "We cannot build against an unprepared tree." eerror "We cannot build against an unprepared tree."
@ -655,7 +655,8 @@ check_modules_supported() {
require_configured_kernel require_configured_kernel
get_version get_version
if ! linux_chkconfig_builtin "MODULES"; then if ! linux_chkconfig_builtin "MODULES"
then
eerror "These sources do not support loading external modules." eerror "These sources do not support loading external modules."
eerror "to be able to use this module please enable \"Loadable modules support\"" eerror "to be able to use this module please enable \"Loadable modules support\""
eerror "in your kernel, recompile and then try merging this module again." eerror "in your kernel, recompile and then try merging this module again."
@ -668,19 +669,20 @@ check_modules_supported() {
# It checks the kernel config options specified by CONFIG_CHECK. It dies only when a required config option (i.e. # It checks the kernel config options specified by CONFIG_CHECK. It dies only when a required config option (i.e.
# the prefix ~ is not used) doesn't satisfy the directive. # the prefix ~ is not used) doesn't satisfy the directive.
check_extra_config() { check_extra_config() {
local config negate die error reworkmodulenames local config negate die error reworkmodulenames
local soft_errors_count=0 hard_errors_count=0 config_required=0 local soft_errors_count=0 hard_errors_count=0 config_required=0
# store the value of the QA check, because otherwise we won't catch usages # store the value of the QA check, because otherwise we won't catch usages
# after if check_extra_config is called AND other direct calls are done # after if check_extra_config is called AND other direct calls are done
# later. # later.
local old_LINUX_CONFIG_EXISTS_DONE="${_LINUX_CONFIG_EXISTS_DONE}" local old_LINUX_CONFIG_EXISTS_DONE="${_LINUX_CONFIG_EXISTS_DONE}"
# if we haven't determined the version yet, we need to # if we haven't determined the version yet, we need to
linux-info_get_any_version linux-info_get_any_version
# Determine if we really need a .config. The only time when we don't need # Determine if we really need a .config. The only time when we don't need
# one is when all of the CONFIG_CHECK options are prefixed with "~". # one is when all of the CONFIG_CHECK options are prefixed with "~".
for config in ${CONFIG_CHECK}; do for config in ${CONFIG_CHECK}
do
if [[ "${config:0:1}" != "~" ]]; then if [[ "${config:0:1}" != "~" ]]; then
config_required=1 config_required=1
break break

View File

@ -1,12 +1,15 @@
# Copyright 1999-2012 Gentoo Foundation # Copyright 1999-2009 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2 # Distributed under the terms of the GNU General Public License v2
# $Header: /var/cvsroot/gentoo-x86/eclass/subversion.eclass,v 1.83 2012/07/29 05:54:17 hattya Exp $ # $Header: /var/cvsroot/gentoo-x86/eclass/subversion.eclass,v 1.67 2009/05/10 20:33:38 arfrever Exp $
# @ECLASS: subversion.eclass # @ECLASS: subversion.eclass
# @MAINTAINER: # @MAINTAINER:
# Akinori Hattori <hattya@gentoo.org> # Akinori Hattori <hattya@gentoo.org>
# @AUTHOR: # Bo Ørsted Andresen <zlin@gentoo.org>
# Arfrever Frehtes Taifersar Arahesis <arfrever@gentoo.org>
#
# Original Author: Akinori Hattori <hattya@gentoo.org> # Original Author: Akinori Hattori <hattya@gentoo.org>
#
# @BLURB: The subversion eclass is written to fetch software sources from subversion repositories # @BLURB: The subversion eclass is written to fetch software sources from subversion repositories
# @DESCRIPTION: # @DESCRIPTION:
# The subversion eclass provides functions to fetch, patch and bootstrap # The subversion eclass provides functions to fetch, patch and bootstrap
@ -19,20 +22,37 @@ ESVN="${ECLASS}"
case "${EAPI:-0}" in case "${EAPI:-0}" in
0|1) 0|1)
EXPORT_FUNCTIONS src_unpack pkg_preinst EXPORT_FUNCTIONS src_unpack pkg_preinst
DEPEND="dev-vcs/subversion"
;; ;;
*) *)
EXPORT_FUNCTIONS src_unpack src_prepare pkg_preinst EXPORT_FUNCTIONS src_unpack src_prepare pkg_preinst
DEPEND="|| ( dev-vcs/subversion[webdav-neon] dev-vcs/subversion[webdav-serf] )"
;; ;;
esac esac
DEPEND+=" net-misc/rsync" DESCRIPTION="Based on the ${ECLASS} eclass"
SUBVERSION_DEPEND="dev-vcs/subversion[webdav-neon,webdav-serf]
net-misc/rsync"
if [[ -z "${ESVN_DISABLE_DEPENDENCIES}" ]]; then
DEPEND="${SUBVERSION_DEPEND}"
fi
# @ECLASS-VARIABLE: ESVN_STORE_DIR # @ECLASS-VARIABLE: ESVN_STORE_DIR
# @DESCRIPTION: # @DESCRIPTION:
# subversion sources store directory. Users may override this in /etc/make.conf # subversion sources store directory. Users may override this in /etc/make.conf
[[ -z ${ESVN_STORE_DIR} ]] && ESVN_STORE_DIR="${PORTAGE_ACTUAL_DISTDIR:-${DISTDIR}}/svn-src" if [[ -z ${ESVN_STORE_DIR} ]]; then
ESVN_STORE_DIR="${PORTAGE_ACTUAL_DISTDIR:-${DISTDIR}}/svn-src"
# Pick a directory with the same permissions now and in the future. Note
# that we cannot just use USERNAME because the eventual effective user when
# doing the svn commands may change - PORTAGE_USERNAME has not taken effect
# yet. Further complicating things, if features userpriv is not set,
# PORTAGE_USERNAME is going to be ignored. We assume that if we enable
# userpriv in the future, we will also set PORTAGE_USERNAME to something
# other than "portage".
# TODO: remove this once we are using consistent users and userpriv settings
# for emerge and emerge-${BOARD}.
ESVN_STORE_DIR="${ESVN_STORE_DIR}/${PORTAGE_USERNAME:-portage}"
fi
# @ECLASS-VARIABLE: ESVN_FETCH_CMD # @ECLASS-VARIABLE: ESVN_FETCH_CMD
# @DESCRIPTION: # @DESCRIPTION:
@ -61,12 +81,11 @@ ESVN_OPTIONS="${ESVN_OPTIONS:-}"
# #
# e.g. http://foo/trunk, svn://bar/trunk, svn://bar/branch/foo@1234 # e.g. http://foo/trunk, svn://bar/trunk, svn://bar/branch/foo@1234
# #
# supported URI schemes: # supported protocols:
# http:// # http://
# https:// # https://
# svn:// # svn://
# svn+ssh:// # svn+ssh://
# file://
# #
# to peg to a specific revision, append @REV to the repo's uri # to peg to a specific revision, append @REV to the repo's uri
ESVN_REPO_URI="${ESVN_REPO_URI:-}" ESVN_REPO_URI="${ESVN_REPO_URI:-}"
@ -137,22 +156,18 @@ ESVN_PATCHES="${ESVN_PATCHES:-}"
# don't export the working copy to S. # don't export the working copy to S.
ESVN_RESTRICT="${ESVN_RESTRICT:-}" ESVN_RESTRICT="${ESVN_RESTRICT:-}"
# @ECLASS-VARIABLE: ESVN_DISABLE_DEPENDENCIES
# @DESCRIPTION:
# Set this variable to a non-empty value to disable the automatic inclusion of
# Subversion in dependencies.
ESVN_DISABLE_DEPENDENCIES="${ESVN_DISABLE_DEPENDENCIES:-}"
# @ECLASS-VARIABLE: ESVN_OFFLINE # @ECLASS-VARIABLE: ESVN_OFFLINE
# @DESCRIPTION: # @DESCRIPTION:
# Set this variable to a non-empty value to disable the automatic updating of # Set this variable to a non-empty value to disable the automatic updating of
# an svn source tree. This is intended to be set outside the subversion source # an svn source tree. This is intended to be set outside the subversion source
# tree by users. # tree by users.
ESVN_OFFLINE="${ESVN_OFFLINE:-${EVCS_OFFLINE}}" ESVN_OFFLINE="${ESVN_OFFLINE:-${ESCM_OFFLINE}}"
# @ECLASS-VARIABLE: ESVN_UMASK
# @DESCRIPTION:
# Set this variable to a custom umask. This is intended to be set by users.
# By setting this to something like 002, it can make life easier for people
# who do development as non-root (but are in the portage group), and then
# switch over to building with FEATURES=userpriv. Or vice-versa. Shouldn't
# be a security issue here as anyone who has portage group write access
# already can screw the system over in more creative ways.
ESVN_UMASK="${ESVN_UMASK:-${EVCS_UMASK}}"
# @ECLASS-VARIABLE: ESVN_UP_FREQ # @ECLASS-VARIABLE: ESVN_UP_FREQ
# @DESCRIPTION: # @DESCRIPTION:
@ -189,33 +204,31 @@ subversion_fetch() {
[[ -n "${ESVN_REVISION}" ]] && revision="${ESVN_REVISION}" [[ -n "${ESVN_REVISION}" ]] && revision="${ESVN_REVISION}"
# check for the scheme # check for the protocol
local scheme="${repo_uri%%:*}" local protocol="${repo_uri%%:*}"
case "${scheme}" in
case "${protocol}" in
http|https) http|https)
;; ;;
svn|svn+ssh) svn|svn+ssh)
;; ;;
file)
;;
*) *)
die "${ESVN}: fetch from '${scheme}' is not yet implemented." die "${ESVN}: fetch from '${protocol}' is not yet implemented."
;; ;;
esac esac
addread "/etc/subversion" addread "/etc/subversion"
addwrite "${ESVN_STORE_DIR}" addwrite "${ESVN_STORE_DIR}"
# Also make the /var/lib/portage/distfiles/svn-src directory writeable in sandbox
if [[ -n "${ESVN_UMASK}" ]]; then # so we can create it if necessary.
eumask_push "${ESVN_UMASK}" addwrite "$(dirname ${ESVN_STORE_DIR})"
fi
if [[ ! -d ${ESVN_STORE_DIR} ]]; then if [[ ! -d ${ESVN_STORE_DIR} ]]; then
debug-print "${FUNCNAME}: initial checkout. creating subversion directory" debug-print "${FUNCNAME}: initial checkout. creating subversion directory"
mkdir -m 775 -p "${ESVN_STORE_DIR}" || die "${ESVN}: can't mkdir ${ESVN_STORE_DIR}." mkdir -p "${ESVN_STORE_DIR}" || die "${ESVN}: can't mkdir ${ESVN_STORE_DIR}."
fi fi
pushd "${ESVN_STORE_DIR}" >/dev/null || die "${ESVN}: can't chdir to ${ESVN_STORE_DIR}" cd "${ESVN_STORE_DIR}" || die "${ESVN}: can't chdir to ${ESVN_STORE_DIR}"
local wc_path="$(subversion__get_wc_path "${repo_uri}")" local wc_path="$(subversion__get_wc_path "${repo_uri}")"
local options="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion" local options="${ESVN_OPTIONS} --config-dir ${ESVN_STORE_DIR}/.subversion"
@ -245,7 +258,7 @@ subversion_fetch() {
debug-print "${FUNCNAME}: ${ESVN_FETCH_CMD} ${options} ${repo_uri}" debug-print "${FUNCNAME}: ${ESVN_FETCH_CMD} ${options} ${repo_uri}"
mkdir -m 775 -p "${ESVN_PROJECT}" || die "${ESVN}: can't mkdir ${ESVN_PROJECT}." mkdir -p "${ESVN_PROJECT}" || die "${ESVN}: can't mkdir ${ESVN_PROJECT}."
cd "${ESVN_PROJECT}" || die "${ESVN}: can't chdir to ${ESVN_PROJECT}" cd "${ESVN_PROJECT}" || die "${ESVN}: can't chdir to ${ESVN_PROJECT}"
if [[ -n "${ESVN_USER}" ]]; then if [[ -n "${ESVN_USER}" ]]; then
${ESVN_FETCH_CMD} ${options} --username "${ESVN_USER}" --password "${ESVN_PASSWORD}" "${repo_uri}" || die "${ESVN}: can't fetch to ${wc_path} from ${repo_uri}." ${ESVN_FETCH_CMD} ${options} --username "${ESVN_USER}" --password "${ESVN_PASSWORD}" "${repo_uri}" || die "${ESVN}: can't fetch to ${wc_path} from ${repo_uri}."
@ -257,7 +270,6 @@ subversion_fetch() {
svn upgrade "${wc_path}" &>/dev/null svn upgrade "${wc_path}" &>/dev/null
svn cleanup "${wc_path}" &>/dev/null svn cleanup "${wc_path}" &>/dev/null
subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy." subversion_wc_info "${repo_uri}" || die "${ESVN}: unknown problem occurred while accessing working copy."
if [[ -n ${ESVN_REVISION} && ${ESVN_REVISION} != ${ESVN_WC_REVISION} ]]; then if [[ -n ${ESVN_REVISION} && ${ESVN_REVISION} != ${ESVN_WC_REVISION} ]]; then
die "${ESVN}: You requested off-line updating and revision ${ESVN_REVISION} but only revision ${ESVN_WC_REVISION} is available locally." die "${ESVN}: You requested off-line updating and revision ${ESVN_REVISION} but only revision ${ESVN_WC_REVISION} is available locally."
fi fi
@ -279,25 +291,7 @@ subversion_fetch() {
fi fi
if [[ -z ${esvn_up_freq} ]]; then if [[ -z ${esvn_up_freq} ]]; then
if [[ ${ESVN_WC_UUID} != $(subversion__svn_info "${repo_uri}" "Repository UUID") ]]; then if [[ ${ESVN_WC_URL} != $(subversion__get_repository_uri "${repo_uri}") ]]; then
# UUID mismatch. Delete working copy and check out it again.
einfo "subversion recheck out start -->"
einfo " old UUID: ${ESVN_WC_UUID}"
einfo " new UUID: $(subversion__svn_info "${repo_uri}" "Repository UUID")"
einfo " repository: ${repo_uri}${revision:+@}${revision}"
rm -fr "${ESVN_PROJECT}" || die
debug-print "${FUNCNAME}: ${ESVN_FETCH_CMD} ${options} ${repo_uri}"
mkdir -m 775 -p "${ESVN_PROJECT}" || die "${ESVN}: can't mkdir ${ESVN_PROJECT}."
cd "${ESVN_PROJECT}" || die "${ESVN}: can't chdir to ${ESVN_PROJECT}"
if [[ -n "${ESVN_USER}" ]]; then
${ESVN_FETCH_CMD} ${options} --username "${ESVN_USER}" --password "${ESVN_PASSWORD}" "${repo_uri}" || die "${ESVN}: can't fetch to ${wc_path} from ${repo_uri}."
else
${ESVN_FETCH_CMD} ${options} "${repo_uri}" || die "${ESVN}: can't fetch to ${wc_path} from ${repo_uri}."
fi
elif [[ ${ESVN_WC_URL} != $(subversion__get_repository_uri "${repo_uri}") ]]; then
einfo "subversion switch start -->" einfo "subversion switch start -->"
einfo " old repository: ${ESVN_WC_URL}@${ESVN_WC_REVISION}" einfo " old repository: ${ESVN_WC_URL}@${ESVN_WC_REVISION}"
einfo " new repository: ${repo_uri}${revision:+@}${revision}" einfo " new repository: ${repo_uri}${revision:+@}${revision}"
@ -327,10 +321,6 @@ subversion_fetch() {
fi fi
fi fi
if [[ -n "${ESVN_UMASK}" ]]; then
eumask_pop
fi
einfo " working copy: ${wc_path}" einfo " working copy: ${wc_path}"
if ! has "export" ${ESVN_RESTRICT}; then if ! has "export" ${ESVN_RESTRICT}; then
@ -345,7 +335,6 @@ subversion_fetch() {
rsync -rlpgo --exclude=".svn/" . "${S}" || die "${ESVN}: can't export to ${S}." rsync -rlpgo --exclude=".svn/" . "${S}" || die "${ESVN}: can't export to ${S}."
fi fi
popd >/dev/null
echo echo
} }
@ -360,36 +349,63 @@ subversion_bootstrap() {
cd "${S}" cd "${S}"
if [[ -n ${ESVN_PATCHES} ]]; then if [[ -n ${ESVN_PATCHES} ]]; then
local patch fpatch
einfo "apply patches -->" einfo "apply patches -->"
local patch fpatch
for patch in ${ESVN_PATCHES}; do for patch in ${ESVN_PATCHES}; do
if [[ -f ${patch} ]]; then if [[ -f ${patch} ]]; then
epatch "${patch}" epatch "${patch}"
else else
for fpatch in ${FILESDIR}/${patch}; do for fpatch in ${FILESDIR}/${patch}; do
if [[ -f ${fpatch} ]]; then if [[ -f ${fpatch} ]]; then
epatch "${fpatch}" epatch "${fpatch}"
else else
die "${ESVN}: ${patch} not found" die "${ESVN}: ${patch} not found"
fi fi
done done
fi fi
done done
echo echo
fi fi
if [[ -n ${ESVN_BOOTSTRAP} ]]; then if [[ -n ${ESVN_BOOTSTRAP} ]]; then
einfo "begin bootstrap -->" einfo "begin bootstrap -->"
if [[ -f ${ESVN_BOOTSTRAP} && -x ${ESVN_BOOTSTRAP} ]]; then if [[ -f ${ESVN_BOOTSTRAP} && -x ${ESVN_BOOTSTRAP} ]]; then
einfo " bootstrap with a file: ${ESVN_BOOTSTRAP}" einfo " bootstrap with a file: ${ESVN_BOOTSTRAP}"
eval "./${ESVN_BOOTSTRAP}" || die "${ESVN}: can't execute ESVN_BOOTSTRAP." eval "./${ESVN_BOOTSTRAP}" || die "${ESVN}: can't execute ESVN_BOOTSTRAP."
else else
einfo " bootstrap with command: ${ESVN_BOOTSTRAP}" einfo " bootstrap with command: ${ESVN_BOOTSTRAP}"
eval "${ESVN_BOOTSTRAP}" || die "${ESVN}: can't eval ESVN_BOOTSTRAP." eval "${ESVN_BOOTSTRAP}" || die "${ESVN}: can't eval ESVN_BOOTSTRAP."
fi fi
fi fi
} }
# @FUNCTION: subversion_src_unpack
# @DESCRIPTION:
# Default src_unpack. Fetch and, in older EAPIs, bootstrap.
subversion_src_unpack() {
subversion_fetch || die "${ESVN}: unknown problem occurred in subversion_fetch."
if has "${EAPI:-0}" 0 1; then
subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap."
fi
}
# @FUNCTION: subversion_src_prepare
# @DESCRIPTION:
# Default src_prepare. Bootstrap.
subversion_src_prepare() {
subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap."
}
# @FUNCTION: subversion_wc_info # @FUNCTION: subversion_wc_info
# @USAGE: [repo_uri] # @USAGE: [repo_uri]
# @RETURN: ESVN_WC_URL, ESVN_WC_ROOT, ESVN_WC_UUID, ESVN_WC_REVISION and ESVN_WC_PATH # @RETURN: ESVN_WC_URL, ESVN_WC_ROOT, ESVN_WC_UUID, ESVN_WC_REVISION and ESVN_WC_PATH
@ -416,46 +432,6 @@ subversion_wc_info() {
export ESVN_WC_PATH="${wc_path}" export ESVN_WC_PATH="${wc_path}"
} }
# @FUNCTION: subversion_src_unpack
# @DESCRIPTION:
# Default src_unpack. Fetch and, in older EAPIs, bootstrap.
subversion_src_unpack() {
subversion_fetch || die "${ESVN}: unknown problem occurred in subversion_fetch."
if has "${EAPI:-0}" 0 1; then
subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap."
fi
}
# @FUNCTION: subversion_src_prepare
# @DESCRIPTION:
# Default src_prepare. Bootstrap.
subversion_src_prepare() {
subversion_bootstrap || die "${ESVN}: unknown problem occurred in subversion_bootstrap."
}
# @FUNCTION: subversion_pkg_preinst
# @USAGE: [repo_uri]
# @DESCRIPTION:
# Log the svn revision of source code. Doing this in pkg_preinst because we
# want the logs to stick around if packages are uninstalled without messing with
# config protection.
subversion_pkg_preinst() {
local pkgdate=$(date "+%Y%m%d %H:%M:%S")
subversion_wc_info "${1}"
if [[ -n ${ESCM_LOGDIR} ]]; then
local dir="${ROOT}/${ESCM_LOGDIR}/${CATEGORY}"
if [[ ! -d ${dir} ]]; then
mkdir -p "${dir}" || eerror "Failed to create '${dir}' for logging svn revision"
fi
local logmessage="svn: ${pkgdate} - ${PF}:${SLOT} was merged at revision ${ESVN_WC_REVISION}"
if [[ -d ${dir} ]]; then
echo "${logmessage}" >>"${dir}/${PN}.log"
else
eerror "Could not log the message '${logmessage}' to '${dir}/${PN}.log'"
fi
fi
}
## -- Private Functions ## -- Private Functions
## -- subversion__svn_info() ------------------------------------------------- # ## -- subversion__svn_info() ------------------------------------------------- #
@ -467,25 +443,26 @@ subversion__svn_info() {
local target="${1}" local target="${1}"
local key="${2}" local key="${2}"
env LC_ALL=C svn info ${options} --username "${ESVN_USER}" --password "${ESVN_PASSWORD}" "${target}" \ env LC_ALL=C svn info "${target}" | grep -i "^${key}" | cut -d" " -f2-
| grep -i "^${key}" \
| cut -d" " -f2-
} }
## -- subversion__get_repository_uri() --------------------------------------- # ## -- subversion__get_repository_uri() --------------------------------------- #
# #
# param $1 - a repository URI. # param $1 - a repository URI.
subversion__get_repository_uri() { subversion__get_repository_uri() {
local repo_uri="${1}" local repo_uri="${1}"
debug-print "${FUNCNAME}: repo_uri = ${repo_uri}" debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
if [[ -z ${repo_uri} ]]; then if [[ -z ${repo_uri} ]]; then
die "${ESVN}: ESVN_REPO_URI (or specified URI) is empty." die "${ESVN}: ESVN_REPO_URI (or specified URI) is empty."
fi fi
# delete trailing slash # delete trailing slash
if [[ -z ${repo_uri##*/} ]]; then if [[ -z ${repo_uri##*/} ]]; then
repo_uri="${repo_uri%/}" repo_uri="${repo_uri%/}"
fi fi
repo_uri="${repo_uri%@*}" repo_uri="${repo_uri%@*}"
echo "${repo_uri}" echo "${repo_uri}"
@ -507,16 +484,42 @@ subversion__get_wc_path() {
# param $1 - a repository URI. # param $1 - a repository URI.
subversion__get_peg_revision() { subversion__get_peg_revision() {
local repo_uri="${1}" local repo_uri="${1}"
local peg_rev=
debug-print "${FUNCNAME}: repo_uri = ${repo_uri}" debug-print "${FUNCNAME}: repo_uri = ${repo_uri}"
# repo_uri has peg revision?
if [[ ${repo_uri} = *@* ]]; then # repo_uri has peg revision ?
peg_rev="${repo_uri##*@}" if [[ ${repo_uri} != *@* ]]; then
debug-print "${FUNCNAME}: peg_rev = ${peg_rev}"
else
debug-print "${FUNCNAME}: repo_uri does not have a peg revision." debug-print "${FUNCNAME}: repo_uri does not have a peg revision."
fi fi
local peg_rev=
[[ ${repo_uri} = *@* ]] && peg_rev="${repo_uri##*@}"
debug-print "${FUNCNAME}: peg_rev = ${peg_rev}"
echo "${peg_rev}" echo "${peg_rev}"
} }
# @FUNCTION: subversion_pkg_preinst
# @USAGE: [repo_uri]
# @DESCRIPTION:
# Log the svn revision of source code. Doing this in pkg_preinst because we
# want the logs to stick around if packages are uninstalled without messing with
# config protection.
subversion_pkg_preinst() {
local pkgdate=$(date "+%Y%m%d %H:%M:%S")
subversion_wc_info "${1:-${ESVN_REPO_URI}}"
if [[ -n ${ESCM_LOGDIR} ]]; then
local dir="${ROOT}/${ESCM_LOGDIR}/${CATEGORY}"
if [[ ! -d ${dir} ]]; then
mkdir -p "${dir}" || \
eerror "Failed to create '${dir}' for logging svn revision to '${PORTDIR_SCM}'"
fi
local logmessage="svn: ${pkgdate} - ${PF}:${SLOT} was merged at revision ${ESVN_WC_REVISION}"
if [[ -d ${dir} ]]; then
echo "${logmessage}" >> "${dir}/${PN}.log"
else
eerror "Could not log the message '${logmessage}' to '${dir}/${PN}.log'"
fi
fi
}

View File

@ -1,133 +1 @@
#!/bin/bash source ../../../portage-stable/eclass/tests/tests-common.sh
if ! source /etc/init.d/functions.sh ; then
echo "Missing functions.sh. Please to install!" 1>&2
exit 1
fi
inherit() {
local e
for e in "$@" ; do
source ../${e}.eclass
done
}
EXPORT_FUNCTIONS() { :; }
debug-print() {
[[ ${#} -eq 0 ]] && return
if [[ ${ECLASS_DEBUG_OUTPUT} == on ]]; then
printf 'debug: %s\n' "${@}" >&2
elif [[ -n ${ECLASS_DEBUG_OUTPUT} ]]; then
printf 'debug: %s\n' "${@}" >> "${ECLASS_DEBUG_OUTPUT}"
fi
}
debug-print-function() {
debug-print "${1}, parameters: ${*:2}"
}
debug-print-section() {
debug-print "now in section ${*}"
}
has() {
local needle=$1
shift
local x
for x in "$@"; do
[ "${x}" = "${needle}" ] && return 0
done
return 1
}
use() { has "$1" ${IUSE} ; }
die() {
echo "die: $*" 1>&2
exit 1
}
has_version() {
portageq has_version / "$@"
}
KV_major() {
[[ -z $1 ]] && return 1
local KV=$@
echo "${KV%%.*}"
}
KV_minor() {
[[ -z $1 ]] && return 1
local KV=$@
KV=${KV#*.}
echo "${KV%%.*}"
}
KV_micro() {
[[ -z $1 ]] && return 1
local KV=$@
KV=${KV#*.*.}
echo "${KV%%[^[:digit:]]*}"
}
KV_to_int() {
[[ -z $1 ]] && return 1
local KV_MAJOR=$(KV_major "$1")
local KV_MINOR=$(KV_minor "$1")
local KV_MICRO=$(KV_micro "$1")
local KV_int=$(( KV_MAJOR * 65536 + KV_MINOR * 256 + KV_MICRO ))
# We make version 2.2.0 the minimum version we will handle as
# a sanity check ... if its less, we fail ...
if [[ ${KV_int} -ge 131584 ]] ; then
echo "${KV_int}"
return 0
fi
return 1
}
tret=0
tbegin() {
ebegin "Testing $*"
}
texit() {
rm -rf "${tmpdir}"
exit ${tret}
}
tend() {
t eend "$@"
}
t() {
"$@"
local ret=$?
: $(( tret |= ${ret} ))
return ${ret}
}
tmpdir="${PWD}/tmp"
pkg_root="${tmpdir}/$0/${RANDOM}"
T="${pkg_root}/temp"
D="${pkg_root}/image"
WORKDIR="${pkg_root}/work"
ED=${D}
mkdir -p "${D}" "${T}" "${WORKDIR}"
dodir() {
mkdir -p "${@/#/${ED}/}"
}
elog() { einfo "$@" ; }
IUSE=""
CATEGORY="dev-eclass"
PN="tests"
PV="0"
P="${PN}-${PV}"
PF=${P}

View File

@ -764,8 +764,13 @@ clang-setup-env() {
case ${ARCH} in case ${ARCH} in
amd64|x86) amd64|x86)
export CC="clang" CXX="clang++" export CC="clang" CXX="clang++"
append-flags --sysroot="${SYSROOT}"
append-flags -B$(get_binutils_path_gold) local clang_flags=(
--sysroot="${SYSROOT}"
-B$(get_binutils_path_gold)
$(usex x86 -m32 '')
)
append-flags "${clang_flags[@]}"
# Some boards use optimizations (e.g. -mfpmath=sse) that # Some boards use optimizations (e.g. -mfpmath=sse) that
# clang does not support. # clang does not support.