123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341 |
- # Copyright 1999-2014 Gentoo Foundation
- # Distributed under the terms of the GNU General Public License v2
- #
- # @ECLASS: bzr.eclass
- # @MAINTAINER:
- # Bazaar team <bazaar@gentoo.org>
- # @AUTHOR:
- # Jorge Manuel B. S. Vicetto <jmbsvicetto@gentoo.org>
- # Mark Lee <bzr-gentoo-overlay@lazymalevolence.com>
- # Ulrich Müller <ulm@gentoo.org>
- # Christian Faulhammer <fauli@gentoo.org>
- # @BLURB: generic fetching functions for the Bazaar VCS
- # @DESCRIPTION:
- # The bzr.eclass provides functions to fetch, unpack, patch, and
- # bootstrap sources from repositories of the Bazaar distributed version
- # control system. The eclass was originally derived from git.eclass.
- #
- # Note: Just set EBZR_REPO_URI to the URI of the branch and src_unpack()
- # of this eclass will export the branch to ${WORKDIR}/${P}.
- inherit eutils
- EBZR="bzr.eclass"
- case "${EAPI:-0}" in
- 0|1) EXPORT_FUNCTIONS src_unpack ;;
- *) EXPORT_FUNCTIONS src_unpack src_prepare ;;
- esac
- DEPEND=">=dev-vcs/bzr-2.0.1"
- case "${EAPI:-0}" in
- 0|1) ;;
- *) [[ ${EBZR_REPO_URI%%:*} = sftp ]] \
- && DEPEND=">=dev-vcs/bzr-2.0.1[sftp]" ;;
- esac
- # @ECLASS-VARIABLE: EBZR_STORE_DIR
- # @DESCRIPTION:
- # The directory to store all fetched Bazaar live sources.
- : ${EBZR_STORE_DIR:=${PORTAGE_ACTUAL_DISTDIR:-${DISTDIR}}/bzr-src}
- # @ECLASS-VARIABLE: EBZR_UNPACK_DIR
- # @DESCRIPTION:
- # The working directory where the sources are copied to.
- : ${EBZR_UNPACK_DIR:=${WORKDIR}/${P}}
- # @ECLASS-VARIABLE: EBZR_INIT_REPO_CMD
- # @DESCRIPTION:
- # The Bazaar command to initialise a shared repository.
- : ${EBZR_INIT_REPO_CMD:="bzr init-repository --no-trees"}
- # @ECLASS-VARIABLE: EBZR_FETCH_CMD
- # @DESCRIPTION:
- # The Bazaar command to fetch the sources.
- : ${EBZR_FETCH_CMD:="bzr branch --no-tree"}
- # @ECLASS-VARIABLE: EBZR_UPDATE_CMD
- # @DESCRIPTION:
- # The Bazaar command to update the sources.
- : ${EBZR_UPDATE_CMD:="bzr pull"}
- # @ECLASS-VARIABLE: EBZR_EXPORT_CMD
- # @DESCRIPTION:
- # The Bazaar command to export a branch.
- : ${EBZR_EXPORT_CMD:="bzr export"}
- # @ECLASS-VARIABLE: EBZR_CHECKOUT_CMD
- # @DESCRIPTION:
- # The Bazaar command to checkout a branch.
- : ${EBZR_CHECKOUT_CMD:="bzr checkout --lightweight -q"}
- # @ECLASS-VARIABLE: EBZR_REVNO_CMD
- # @DESCRIPTION:
- # The Bazaar command to list a revision number of the branch.
- : ${EBZR_REVNO_CMD:="bzr revno"}
- # @ECLASS-VARIABLE: EBZR_OPTIONS
- # @DEFAULT_UNSET
- # @DESCRIPTION:
- # The options passed to the fetch and update commands.
- # @ECLASS-VARIABLE: EBZR_REPO_URI
- # @DEFAULT_UNSET
- # @REQUIRED
- # @DESCRIPTION:
- # The repository URI for the source package.
- #
- # Note: If the ebuild uses an sftp:// URI, then in EAPI 0 or 1 it must
- # make sure that dev-vcs/bzr was built with USE="sftp". In EAPI 2 or
- # later, the eclass will depend on dev-vcs/bzr[sftp].
- # @ECLASS-VARIABLE: EBZR_INITIAL_URI
- # @DEFAULT_UNSET
- # @DESCRIPTION:
- # The URI used for initial branching of the source repository. If this
- # variable is set, the initial branch will be cloned from the location
- # specified, followed by a pull from ${EBZR_REPO_URI}. This is intended
- # for special cases, e.g. when download from the original repository is
- # slow, but a fast mirror exists but may be out of date.
- #
- # Normally, this variable needs not be set.
- # @ECLASS-VARIABLE: EBZR_BOOTSTRAP
- # @DEFAULT_UNSET
- # @DESCRIPTION:
- # Bootstrap script or command like autogen.sh or etc.
- # @ECLASS-VARIABLE: EBZR_PATCHES
- # @DEFAULT_UNSET
- # @DESCRIPTION:
- # bzr.eclass can apply patches in bzr_bootstrap(). You can use regular
- # expressions in this variable like *.diff or *.patch and the like.
- # Note: These patches will be applied before EBZR_BOOTSTRAP is processed.
- #
- # Patches are searched both in ${PWD} and ${FILESDIR}. If not found in
- # either location, the installation dies.
- # @ECLASS-VARIABLE: EBZR_PROJECT
- # @DESCRIPTION:
- # The project name of your ebuild. Normally, the branch will be stored
- # in the ${EBZR_STORE_DIR}/${EBZR_PROJECT} directory.
- #
- # If EBZR_BRANCH is set (see below), then a shared repository will be
- # created in that directory, and the branch will be located in
- # ${EBZR_STORE_DIR}/${EBZR_PROJECT}/${EBZR_BRANCH}.
- : ${EBZR_PROJECT:=${PN}}
- # @ECLASS-VARIABLE: EBZR_BRANCH
- # @DEFAULT_UNSET
- # @DESCRIPTION:
- # The directory where to store the branch within a shared repository,
- # relative to ${EBZR_STORE_DIR}/${EBZR_PROJECT}.
- #
- # This variable should be set if there are several live ebuilds for
- # different branches of the same upstream project. The branches can
- # then share the same repository in EBZR_PROJECT, which will save both
- # data traffic volume and disk space.
- #
- # If there is only a live ebuild for one single branch, EBZR_BRANCH
- # needs not be set. In this case, the branch will be stored in a
- # stand-alone repository directly in EBZR_PROJECT.
- # @ECLASS-VARIABLE: EBZR_REVISION
- # @DEFAULT_UNSET
- # @DESCRIPTION:
- # Revision to fetch, defaults to the latest
- # (see http://bazaar-vcs.org/BzrRevisionSpec or bzr help revisionspec).
- # @ECLASS-VARIABLE: EBZR_OFFLINE
- # @DESCRIPTION:
- # Set this variable to a non-empty value to disable automatic updating
- # of a bzr source tree. This is intended to be set outside the ebuild
- # by users.
- : ${EBZR_OFFLINE=${EVCS_OFFLINE}}
- # @ECLASS-VARIABLE: EBZR_WORKDIR_CHECKOUT
- # @DEFAULT_UNSET
- # @DESCRIPTION:
- # If this variable is set to a non-empty value, EBZR_CHECKOUT_CMD will
- # be used instead of EBZR_EXPORT_CMD to copy the sources to WORKDIR.
- # @FUNCTION: bzr_initial_fetch
- # @USAGE: <repository URI> <branch directory>
- # @DESCRIPTION:
- # Internal function, retrieves the source code from a repository for the
- # first time, using ${EBZR_FETCH_CMD}.
- bzr_initial_fetch() {
- local repo_uri=$1 branch_dir=$2
- if [[ -n "${EBZR_OFFLINE}" ]]; then
- ewarn "EBZR_OFFLINE cannot be used when there is no local branch yet."
- fi
- # fetch branch
- einfo "bzr branch start -->"
- einfo " repository: ${repo_uri} => ${branch_dir}"
- ${EBZR_FETCH_CMD} ${EBZR_OPTIONS} "${repo_uri}" "${branch_dir}" \
- || die "${EBZR}: can't branch from ${repo_uri}"
- }
- # @FUNCTION: bzr_update
- # @USAGE: <repository URI> <branch directory>
- # @DESCRIPTION:
- # Internal function, updates the source code from a repository, using
- # ${EBZR_UPDATE_CMD}.
- bzr_update() {
- local repo_uri=$1 branch_dir=$2
- if [[ -n "${EBZR_OFFLINE}" ]]; then
- einfo "skipping bzr pull -->"
- einfo " repository: ${repo_uri}"
- else
- # update branch
- einfo "bzr pull start -->"
- einfo " repository: ${repo_uri}"
- pushd "${branch_dir}" > /dev/null \
- || die "${EBZR}: can't chdir to ${branch_dir}"
- ${EBZR_UPDATE_CMD} ${EBZR_OPTIONS} "${repo_uri}" \
- || die "${EBZR}: can't pull from ${repo_uri}"
- popd > /dev/null
- fi
- }
- # @FUNCTION: bzr_fetch
- # @DESCRIPTION:
- # Wrapper function to fetch sources from a Bazaar repository with
- # bzr branch or bzr pull, depending on whether there is an existing
- # working copy.
- bzr_fetch() {
- local repo_dir branch_dir
- local save_sandbox_write=${SANDBOX_WRITE}
- [[ -n ${EBZR_REPO_URI} ]] || die "${EBZR}: EBZR_REPO_URI is empty"
- if [[ ! -d ${EBZR_STORE_DIR} ]] ; then
- addwrite /
- mkdir -p "${EBZR_STORE_DIR}" \
- || die "${EBZR}: can't mkdir ${EBZR_STORE_DIR}"
- SANDBOX_WRITE=${save_sandbox_write}
- fi
- pushd "${EBZR_STORE_DIR}" > /dev/null \
- || die "${EBZR}: can't chdir to ${EBZR_STORE_DIR}"
- repo_dir=${EBZR_STORE_DIR}/${EBZR_PROJECT}
- branch_dir=${repo_dir}${EBZR_BRANCH:+/${EBZR_BRANCH}}
- addwrite "${EBZR_STORE_DIR}"
- if [[ ! -d ${branch_dir}/.bzr ]]; then
- if [[ ${repo_dir} != "${branch_dir}" && ! -d ${repo_dir}/.bzr ]]; then
- einfo "creating shared bzr repository: ${repo_dir}"
- ${EBZR_INIT_REPO_CMD} "${repo_dir}" \
- || die "${EBZR}: can't create shared repository"
- fi
- if [[ -z ${EBZR_INITIAL_URI} ]]; then
- bzr_initial_fetch "${EBZR_REPO_URI}" "${branch_dir}"
- else
- # Workaround for faster initial download. This clones the
- # branch from a fast server (which may be out of date), and
- # subsequently pulls from the slow original repository.
- bzr_initial_fetch "${EBZR_INITIAL_URI}" "${branch_dir}"
- if [[ ${EBZR_REPO_URI} != "${EBZR_INITIAL_URI}" ]]; then
- EBZR_UPDATE_CMD="${EBZR_UPDATE_CMD} --remember --overwrite" \
- EBZR_OFFLINE="" \
- bzr_update "${EBZR_REPO_URI}" "${branch_dir}"
- fi
- fi
- else
- bzr_update "${EBZR_REPO_URI}" "${branch_dir}"
- fi
- # Restore sandbox environment
- SANDBOX_WRITE=${save_sandbox_write}
- cd "${branch_dir}" || die "${EBZR}: can't chdir to ${branch_dir}"
- # Save revision number in environment. #311101
- export EBZR_REVNO=$(${EBZR_REVNO_CMD})
- if [[ -n ${EBZR_WORKDIR_CHECKOUT} ]]; then
- einfo "checking out ..."
- ${EBZR_CHECKOUT_CMD} ${EBZR_REVISION:+-r ${EBZR_REVISION}} \
- . "${EBZR_UNPACK_DIR}" || die "${EBZR}: checkout failed"
- else
- einfo "exporting ..."
- ${EBZR_EXPORT_CMD} ${EBZR_REVISION:+-r ${EBZR_REVISION}} \
- "${EBZR_UNPACK_DIR}" . || die "${EBZR}: export failed"
- fi
- einfo \
- "revision ${EBZR_REVISION:-${EBZR_REVNO}} is now in ${EBZR_UNPACK_DIR}"
- popd > /dev/null
- }
- # @FUNCTION: bzr_bootstrap
- # @DESCRIPTION:
- # Apply patches in ${EBZR_PATCHES} and run ${EBZR_BOOTSTRAP} if specified.
- bzr_bootstrap() {
- local patch lpatch
- pushd "${S}" > /dev/null || die "${EBZR}: can't chdir to ${S}"
- if [[ -n ${EBZR_PATCHES} ]] ; then
- einfo "apply patches -->"
- for patch in ${EBZR_PATCHES} ; do
- if [[ -f ${patch} ]] ; then
- epatch "${patch}"
- else
- # This loop takes care of wildcarded patches given via
- # EBZR_PATCHES in an ebuild
- for lpatch in "${FILESDIR}"/${patch} ; do
- if [[ -f ${lpatch} ]] ; then
- epatch "${lpatch}"
- else
- die "${EBZR}: ${patch} is not found"
- fi
- done
- fi
- done
- fi
- if [[ -n ${EBZR_BOOTSTRAP} ]] ; then
- einfo "begin bootstrap -->"
- if [[ -f ${EBZR_BOOTSTRAP} ]] && [[ -x ${EBZR_BOOTSTRAP} ]] ; then
- einfo " bootstrap with a file: ${EBZR_BOOTSTRAP}"
- "./${EBZR_BOOTSTRAP}" \
- || die "${EBZR}: can't execute EBZR_BOOTSTRAP"
- else
- einfo " bootstrap with commands: ${EBZR_BOOTSTRAP}"
- "${EBZR_BOOTSTRAP}" \
- || die "${EBZR}: can't eval EBZR_BOOTSTRAP"
- fi
- fi
- popd > /dev/null
- }
- # @FUNCTION: bzr_src_unpack
- # @DESCRIPTION:
- # Default src_unpack(), calls bzr_fetch. For EAPIs 0 and 1, also calls
- # bzr_src_prepare.
- bzr_src_unpack() {
- bzr_fetch
- case "${EAPI:-0}" in
- 0|1) bzr_src_prepare ;;
- esac
- }
- # @FUNCTION: bzr_src_prepare
- # @DESCRIPTION:
- # Default src_prepare(), calls bzr_bootstrap.
- bzr_src_prepare() {
- bzr_bootstrap
- }
|