diff options
author | James Cloos <cloos@jhcloos.com> | 2014-01-08 19:42:16 -0500 |
---|---|---|
committer | James Cloos <cloos@jhcloos.com> | 2014-01-08 19:42:16 -0500 |
commit | 75e61a7565990cbf54dde144e1bb82f63f52ae85 (patch) | |
tree | 9302ffbb5378de0a0eeb30f06401955f6e631c08 | |
parent | eab1d1be1b5bc6c658bb5d3696edd9f47b8612ea (diff) |
Add old git eclass until ebuilds are updated.
Signed-off-by: James Cloos <cloos@jhcloos.com>
-rw-r--r-- | eclass/git.eclass | 287 |
1 files changed, 287 insertions, 0 deletions
diff --git a/eclass/git.eclass b/eclass/git.eclass new file mode 100644 index 0000000..6d706e2 --- /dev/null +++ b/eclass/git.eclass @@ -0,0 +1,287 @@ +# Copyright 1999-2006 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: /var/cvsroot/gentoo-x86/eclass/git.eclass,v 1.3 2006/12/30 18:21:02 ferdy Exp $ + +## --------------------------------------------------------------------------- # +# subversion.eclass author: Akinori Hattori <hattya@gentoo.org> +# modified for git by Donnie Berkholz <spyderous@gentoo.org> +# improved by Fernando J. Pereda <ferdy@gentoo.org> +# +# The git eclass is written to fetch the software sources from +# git repositories like the subversion eclass. +# +# +# Description: +# If you use this eclass, the ${S} is ${WORKDIR}/${P}. +# It is necessary to define the EGIT_REPO_URI variable at least. +# +## --------------------------------------------------------------------------- # + +inherit eutils + +EGIT="git.eclass" + +EXPORT_FUNCTIONS src_unpack + +HOMEPAGE="http://git.or.cz/" +DESCRIPTION="Based on the ${ECLASS} eclass" + + +## -- add git in DEPEND +# +DEPEND=">=dev-util/git-1.4.0" + + +## -- EGIT_STORE_DIR: git sources store directory +# +EGIT_STORE_DIR="${PORTAGE_ACTUAL_DISTDIR-${DISTDIR}}/git-src" + + +## -- EGIT_FETCH_CMD: git clone command +# +EGIT_FETCH_CMD="git clone --bare" + +## -- EGIT_UPDATE_CMD: git fetch command +# +EGIT_UPDATE_CMD="git fetch -f -u" + +## -- EGIT_DIFFSTAT_CMD: Command to get diffstat output +# +EGIT_DIFFSTAT_CMD="git diff --stat" + + +## -- EGIT_OPTIONS: +# +# the options passed to clone and fetch +# +: ${EGIT_OPTIONS:=} + + +## -- EGIT_REPO_URI: repository uri +# +# e.g. http://foo, git://bar +# +# supported protocols: +# http:// +# https:// +# git:// +# git+ssh:// +# rsync:// +# ssh:// +# +: ${EGIT_REPO_URI:=} + + +## -- EGIT_PROJECT: project name of your ebuild +# +# git eclass will check out the git repository like: +# +# ${EGIT_STORE_DIR}/${EGIT_PROJECT}/${EGIT_REPO_URI##*/} +# +# 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 +# +# default: ${PN/-git}. +# +: ${EGIT_PROJECT:=${PN/-git}} + + +## -- EGIT_BOOTSTRAP: +# +# bootstrap script or command like autogen.sh or etc.. +# +: ${EGIT_BOOTSTRAP:=} + + +## -- EGIT_PATCHES: +# +# git eclass can apply pathces in git_bootstrap(). +# you can use regexp in this valiable like *.diff or *.patch or etc. +# NOTE: this patches will apply before eval EGIT_BOOTSTRAP. +# +# the process of applying the patch is: +# 1. just epatch it, if the patch exists in the path. +# 2. scan it under FILESDIR and epatch it, if the patch exists in FILESDIR. +# 3. die. +# +: ${EGIT_PATCHES:=} + + +## -- EGIT_BRANCH: +# +# git eclass can fetch any branch in git_fetch(). +# Defaults to 'master' +# +: ${EGIT_BRANCH:=master} + + +## -- EGIT_TREE: +# +# git eclass can checkout any tree. +# Defaults to EGIT_BRANCH. +# +: ${EGIT_TREE:=${EGIT_BRANCH}} + + +## - EGIT_REPACK: +# +# git eclass will repack objects to save disk space. However this can take a +# long time with VERY big repositories. If this is your case set: +# EGIT_REPACK=false +# +: ${EGIT_REPACK:=false} + +## - EGIT_PRUNE: +# +# git eclass can prune the local clone. This is useful if upstream rewinds and +# rebases branches too often. If you don't want this to happen, set: +# EGIT_PRUNE=false +# +: ${EGIT_PRUNE:=false} + + +## -- git_fetch() ------------------------------------------------- # + +git_fetch() { + + local EGIT_CLONE_DIR + + # EGIT_REPO_URI is empty. + [[ -z ${EGIT_REPO_URI} ]] && die "${EGIT}: EGIT_REPO_URI is empty." + + # check for the protocol. + case ${EGIT_REPO_URI%%:*} in + git*|http|https|rsync|ssh) + ;; + *) + die "${EGIT}: fetch from "${EGIT_REPO_URI%:*}" is not yet implemented." + ;; + esac + + if [[ ! -d ${EGIT_STORE_DIR} ]] ; then + debug-print "${FUNCNAME}: initial clone. creating git directory" + addwrite / + mkdir -p "${EGIT_STORE_DIR}" \ + || die "${EGIT}: can't mkdir ${EGIT_STORE_DIR}." + chmod -f o+rw "${EGIT_STORE_DIR}" \ + || die "${EGIT}: can't chmod ${EGIT_STORE_DIR}." + export SANDBOX_WRITE="${SANDBOX_WRITE%%:/}" + fi + + cd -P "${EGIT_STORE_DIR}" || die "${EGIT}: can't chdir to ${EGIT_STORE_DIR}" + EGIT_STORE_DIR=${PWD} + + # every time + addwrite "${EGIT_STORE_DIR}" + + [[ -z ${EGIT_REPO_URI##*/} ]] && EGIT_REPO_URI="${EGIT_REPO_URI%/}" + EGIT_CLONE_DIR="${EGIT_PROJECT}" + + debug-print "${FUNCNAME}: EGIT_OPTIONS = \"${EGIT_OPTIONS}\"" + + export GIT_DIR="${EGIT_CLONE_DIR}" + + if [[ ! -d ${EGIT_CLONE_DIR} ]] ; then + # first clone + einfo "git clone start -->" + einfo " repository: ${EGIT_REPO_URI}" + + ${EGIT_FETCH_CMD} ${EGIT_OPTIONS} "${EGIT_REPO_URI}" ${EGIT_PROJECT} \ + || die "${EGIT}: can't fetch from ${EGIT_REPO_URI}." + + # We use --bare cloning, so git doesn't do this for us. + git repo-config remote.origin.url "${EGIT_REPO_URI}" + else + # fetch updates + einfo "git update start -->" + einfo " repository: ${EGIT_REPO_URI}" + + local oldsha1=$(git rev-parse ${EGIT_BRANCH}) + + ${EGIT_UPDATE_CMD} ${EGIT_OPTIONS} origin ${EGIT_BRANCH}:${EGIT_BRANCH} \ + || die "${EGIT}: can't update from ${EGIT_REPO_URI}." + + # piping through cat is needed to avoid a stupid Git feature + ${EGIT_DIFFSTAT_CMD} ${oldsha1}..${EGIT_BRANCH} | cat + fi + + einfo " local clone: ${EGIT_STORE_DIR}/${EGIT_CLONE_DIR}" + + if ${EGIT_REPACK} ; then + ebegin "Repacking objects" + # Strangely enough mv asks confirmation + yes y | git repack -a -d -f -q > /dev/null + eend $? + fi + + if ${EGIT_PRUNE} ; then + ebegin "Removing unreachable objects" + git prune + eend $? + fi + + einfo " committish: ${EGIT_TREE}" + + # export to the ${WORKDIR} + mkdir -p "${S}" + git tar-tree ${EGIT_TREE} | ( cd "${S}" ; tar xf - ) + echo + +} + + +## -- git_bootstrap() ------------------------------------------------ # + +git_bootstrap() { + + local patch lpatch + + cd "${S}" + + if [[ -n ${EGIT_PATCHES} ]] ; then + einfo "apply patches -->" + + for patch in ${EGIT_PATCHES} ; do + if [[ -f ${patch} ]] ; then + epatch ${patch} + else + for lpatch in "${FILESDIR}"/${patch} ; do + if [[ -f ${lpatch} ]] ; then + epatch ${lpatch} + else + die "${EGIT}: ${patch} is not found" + fi + done + fi + done + echo + fi + + if [[ -n ${EGIT_BOOTSTRAP} ]] ; then + einfo "begin bootstrap -->" + + if [[ -f ${EGIT_BOOTSTRAP} ]] && [[ -x ${EGIT_BOOTSTRAP} ]] ; then + einfo " bootstrap with a file: ${EGIT_BOOTSTRAP}" + eval "./${EGIT_BOOTSTRAP}" \ + || die "${EGIT}: can't execute EGIT_BOOTSTRAP." + else + einfo " bootstrap with commands: ${EGIT_BOOTSTRAP}" + eval "${EGIT_BOOTSTRAP}" \ + || die "${EGIT}: can't eval EGIT_BOOTSTRAP." + fi + fi + +} + + +## -- git_src_unpack() ------------------------------------------------ # + +git_src_unpack() { + + git_fetch || die "${EGIT}: unknown problem in git_fetch()." + git_bootstrap || die "${EGIT}: unknown problem in git_bootstrap()." + +} |