diff options
Diffstat (limited to 'script/ecopy')
-rwxr-xr-x | script/ecopy | 144 |
1 files changed, 144 insertions, 0 deletions
diff --git a/script/ecopy b/script/ecopy new file mode 100755 index 0000000..720f94f --- /dev/null +++ b/script/ecopy @@ -0,0 +1,144 @@ +#!/usr/bin/env bash +# Copyright 2006-2010 Gentoo Foundation; Distributed under the GPL v2 +# $Id: ecopy 56412 2010-01-18 18:07:43Z grobian $ + +# This probably will blow up if not ran in a Prefix environment, sorry. + +RSURL=${RSURL:-"http://tinderbox.dev.gentoo.org/portage"} +EPREFIX=${EPREFIX:-$(portageq envvar EPREFIX)} +WGET_CMD="wget --no-verbose --no-glob --no-clobber" + +source "${EPREFIX}/sbin/functions.sh" + +if ! type -P qatom > /dev/null ; then + ewarn "This script requires the use of qatom, please emerge" + ewarn "app-portage/portage-utils to continue." + exit 1 +fi + +if ! type -P wget > /dev/null ; then + ewarn "This script requires the use of wget." + ewarn "It is not in your PATH." + exit 1 +fi + +if [[ -z ${1} ]] ; then + einfo + einfo "usage: ecopy <category>/<package>" + einfo "- make sure the scripts directory from the overlay is in your path" + einfo "- make sure you call ecopy from the root of the overlay" + einfo "- you can also specify a specific version, using the '=' prefix" + einfo "and appending a version" + einfo + einfo "ecopy is a best effort script only. It doesn't guarantee a working" + einfo "result" + exit 0 +fi + +# Uses qatom to determine if the second atom is greater than the first, and +# returns true if so. +is_greater_atom() { + if [[ $(qatom -c $1 $2 | awk '{print $2}') == "<" ]]; then + return 0 + else + return 1 + fi +} + +# Takes input of a list of ebuild strings and uses is_greater_atom() to return +# the greatest in the list. +return_greatest() { + # Append '-0_alpha' to the end of the name such that any version is greater + # than it. bug #278113 + max="${catpkg#*\/}-0_alpha" + for i in $@; do + if is_greater_atom $max $i; then + max="${i}" + fi + done + echo $max +} + +# Either use qatom or fall back to a non-qatom approach which may generate false +# positive. +return_greatest_wrapper() { + echo "$( return_greatest "$( \ + wget -q "${RSURL}/${catpkg}" -O - | \ + egrep "href=\"[^\"]+\.ebuild\"" -o | \ + sed -e 's/^href="//' -e 's/"$//' -e 's/%2b/+/g' )" )" +} + +# Mangle user input +if [[ ${1:0:1} == "=" ]] ; then # Check to see if the first char is an "=" + ebuildgrep="${1#*\/}.ebuild" + catpkg="${1#=}" # Strip the leading "=" + catpkg="${catpkg%-[0-9]*}" # Strip the trailing verion numbers + # Grab the index from the current $RSURL and parse it for the list + # of ebuilds. Grab the specified version that the user entered. + ebuild="$(wget -q "${RSURL}/${catpkg}" -O - | \ + grep -F $ebuildgrep -o | head -n1)" +else + catpkg="$1" + # Use the wrapper function to just grab the latest version. + ebuild="$( return_greatest_wrapper )" +fi + +# TODO: fix error checking. patches welcome. +# Error checking. +echo $ebuild +if [[ -z ${ebuild} ]] ; then + ewarn "please specify a correct specific version" + [[ ${1:0:1} == "=" ]] \ + && ewarn "$1 doesn't match an existing ebuild in the tree" \ + || ewarn "example: =$1-0.2.3" + exit -1 +fi + +# Copy these so the Prefix tree matches the gentoo-x86 tree. But don't if the +# $catpkg dir already exists. It is assumed that they are already there. +if [[ ! -d ${catpkg} ]]; then + mkdir -p "${catpkg}" && cd "$catpkg" + ${WGET_CMD} "${RSURL}/$catpkg/ChangeLog" + ${WGET_CMD} "${RSURL}/$catpkg/metadata.xml" + ${WGET_CMD} "${RSURL}/$catpkg/Manifest" +else + einfo + einfo "It appears that $catpkg already exists. I will continue but" + einfo "you should verify my actions" + einfo + cd "$catpkg" +fi + +# needed for sourcing ebuild and understanding ebuild specific vars. +PF="${ebuild/.ebuild}" +P="${PF%-r[1-9]*}" +PN="${P%-*}" +PV="${P/${PN}-}" + +# Get the ebuild +${WGET_CMD} "${RSURL}/${catpkg}/${ebuild}" + +source ${ebuild} 2> /dev/null #get rid of "inherit: command not found" message. + +# Get the patches. Assumed that every patch has FILESDIR in the line. Good +# assumption. +for i in $(eval echo $(grep FILESDIR $ebuild | sed -e 's:.*FILESDIR[}"]*/::' -e 's:"::g' -e "s:'::" -e "s:#.*::" -e "s: .*::")); do + mkdir -p "files" + ${WGET_CMD} -P "files" "${RSURL}/$catpkg/files/$i" +done + +# Set explicit PATHs for scripts in the prefix tree so they don't need to be +# copied to your PATH. IOW, you always want eapify & ecleankw to be ran. +"$(portageq envvar PORTDIR)"/scripts/eapify ${ebuild} +"$(portageq envvar PORTDIR)"/scripts/ecleankw ${ebuild} +source "${EPREFIX}/etc/make.profile/make.defaults" + +# Force the user's keyword on the ebuild. Less work for the user. +if ! type -P ekeyword > /dev/null ; then + einfo + einfo "ekeyword not found! Please emerge app-portage/gentoolkit-dev then run '$(eval echo ekeyword "~${ACCEPT_KEYWORDS#*\~}" $ebuild)' manually" +else + ekeyword "~${ACCEPT_KEYWORDS#*\~}" $ebuild +fi + +ebuild ${ebuild} digest #re-digest for changes made to the ebuild above |