Here is a series of patches for portage and what they do.

rpm - Improves the ability of portage to generate rpms and dependencies of rpms
double_prefix - some sanity checks for double prefixing
various_fixes - some minor fixes for issues we have run accross
(mostly adding EPREFIX where needed)
hooks - allows one to run arbitrary code after emerge stages finish
tests - allows enabling tests on a per package basis, by looking at a
package.test file
cygwin - allows for building under cygwin (need a cygwin ebuild tree for this).

Note that these were created in the order of the numbers on them.  One
should be able to able all of them and they should not break any
current functionality.

Comments/questions/feedback welcome.

-matt
Index: prefix-portage-2.1.13.4497/bin/emerge
===================================================================
--- prefix-portage-2.1.13.4497.orig/bin/emerge
+++ prefix-portage-2.1.13.4497/bin/emerge
@@ -195,7 +195,8 @@ options=[
 "--tree",
 "--update",       
 "--usepkg",       "--usepkgonly",
-"--verbose",      "--version"
+"--verbose",      "--version",
+"--buildrpm",     "--buildrpmonly"
 ]
 
 shortmapping={
@@ -217,7 +218,8 @@ shortmapping={
 "s":"--search",    "S":"--searchdesc",
 't':"--tree",
 "u":"--update",
-"v":"--verbose",   "V":"--version"
+"v":"--verbose",   "V":"--version",
+"r":"--buildrpm",  "R":"--buildrpmonly"
 }
 
 myaction=None
@@ -326,6 +328,21 @@ if ("--quiet" in myopts):
        portage.settings.backup_changes("PORTAGE_QUIET")
        portage.settings.lock()
 
+# Do NOT imply --buildrpm if --buildrpmonly
+## buildrpm will imply buildpkg
+if ("buildrpm" in portage.features) or ("--buildrpm" in myopts):
+       if "--buildrpm" not in myopts:
+               myopts.append("--buildrpm")
+       if "--buildpkg" not in myopts:
+               myopts.append("--buildpkg")
+## buildrpmonly implies buildpkgonly - no-merge operation
+if ("--buildrpmonly" in myopts):
+       if ("--getbinpkgonly" not in myopts and "--getbinpkg" not in myopts) 
and "--buildpkgonly" not in myopts:
+               myopts.append("--buildpkgonly")
+       if "--usepkgonly" in myopts or "--usepkg" in myopts:
+               print ">>> --buildrpmonly cancels --usepkg and --usepkgonly 
options."
+
+
 # Always create packages if FEATURES=buildpkg
 # Imply --buildpkg if --buildpkgonly
 if ("buildpkg" in portage.features) or ("--buildpkgonly" in myopts):
@@ -1984,18 +2001,22 @@ class depgraph:
                                                sys.exit(127)
                                        if retval:
                                                sys.exit(retval)
-                                       short_msg = "emerge: 
("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" Compile"
-                                       emergelog(" === ("+str(mergecount)+" of 
"+str(len(mymergelist))+") Compiling/Packaging ("+x[pkgindex]+"::"+y+")", 
short_msg=short_msg)
-                                       
retval=portage.doebuild(y,"package",myroot,self.pkgsettings,edebug,tree="porttree")
-                                       if (retval == None):
-                                               portage_util.writemsg("Unable 
to run required binary.\n")
-                                               sys.exit(127)
-                                       if retval:
-                                               sys.exit(retval)
+                                       
portage.db[portage.root]["bintree"].inject(x[2])
+                                       
mytbz2=portage.db[portage.root]["bintree"].getname(x[2])
+                                       if "--buildrpmonly" in myopts and 
os.path.exists(mytbz2):
+                                               portage_util.writemsg("Binary 
package already exists at: " + mytbz2 + ". Skipping rebuild ...\n")
+                                       else:
+                                               short_msg = "emerge: 
("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" Compile"
+                                               emergelog(" === 
("+str(mergecount)+" of "+str(len(mymergelist))+") Compiling/Packaging 
("+x[pkgindex]+"::"+y+")", short_msg=short_msg)
+                                               
retval=portage.doebuild(y,"package",myroot,self.pkgsettings,edebug,tree="porttree")
+                                               if (retval == None):
+                                                       
portage_util.writemsg("Unable to run required binary.\n")
+                                                       sys.exit(127)
+                                               if retval:
+                                                       sys.exit(retval)
+
                                        #dynamically update our database
                                        if "--buildpkgonly" not in myopts:
-                                               
portage.db[portage.root]["bintree"].inject(x[2])
-                                               
mytbz2=portage.db[portage.root]["bintree"].getname(x[2])
                                                short_msg = "emerge: 
("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" Merge"
                                                emergelog(" === 
("+str(mergecount)+" of "+str(len(mymergelist))+") Merging 
("+x[pkgindex]+"::"+y+")", short_msg=short_msg)
 
@@ -2004,7 +2025,27 @@ class depgraph:
 
                                                
retval=portage.pkgmerge(mytbz2,myroot,self.pkgsettings)
                                                if retval==None:
-                                                       sys.exit(1)
+                                                       sys.exit(1)             
                        if "--buildrpm" in myopts or "--buildrpmonly" in myopts:
+                                               ## Clean environment
+                                               print ">>> Building RPM for 
binary package " + mytbz2
+                                               short_msg = "emerge: 
("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" Clean"
+                                               emergelog(" === 
("+str(mergecount)+" of "+str(len(mymergelist))+") Cleaning 
("+x[pkgindex]+"::"+y+")", short_msg=short_msg)
+                                               
retval=portage.doebuild(y,"clean",myroot,self.pkgsettings,edebug,cleanup=1,tree="porttree")
+                                               if (retval == None):
+                                                       
portage_util.writemsg("Unable to run required binary.\n")
+                                                       sys.exit(127)
+                                               if retval:
+                                                       sys.exit(retval)
+                                               #create rpm
+                                               short_msg = "emerge: 
("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" RPM"
+                                               emergelog(" === 
("+str(mergecount)+" of "+str(len(mymergelist))+") Packaging 
("+x[pkgindex]+"::"+y+")", short_msg=short_msg)
+                                               
retval=portage.doebuild(y,"rpm",myroot,self.pkgsettings,edebug,cleanup=1,tree="porttree")
+                                               if (retval == None):
+                                                       
portage_util.writemsg("Unable to run required binary.\n")
+                                                       sys.exit(127)
+                                               if retval:
+                                                       sys.exit(retval)
+
                                else:
                                        short_msg = "emerge: 
("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" Clean"
                                        emergelog(" === ("+str(mergecount)+" of 
"+str(len(mymergelist))+") Cleaning ("+x[pkgindex]+"::"+y+")", 
short_msg=short_msg)
@@ -2032,6 +2073,29 @@ class depgraph:
                                        if not 
portage.db[portage.root]["bintree"].gettbz2(x[2]):
                                                sys.exit(1)
 
+                               if "--buildrpmonly" in myopts:
+                                       ## Clean environment
+                                       print ">>> Building RPM for binary 
package " + mytbz2
+                                       short_msg = "emerge: 
("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" Clean"
+                                       emergelog(" === ("+str(mergecount)+" of 
"+str(len(mymergelist))+") Cleaning ("+x[pkgindex]+"::"+y+")", 
short_msg=short_msg)
+                                       
retval=portage.doebuild(y,"clean",myroot,self.pkgsettings,edebug,cleanup=1,tree="porttree")
+                                       if (retval == None):
+                                               portage_util.writemsg("Unable 
to run required binary.\n")
+                                               sys.exit(127)
+                                       if retval:
+                                               sys.exit(retval)
+                                       #create rpm
+                                       short_msg = "emerge: 
("+str(mergecount)+" of "+str(len(mymergelist))+") "+x[pkgindex]+" RPM"
+                                       emergelog(" === ("+str(mergecount)+" of 
"+str(len(mymergelist))+") Packaging ("+x[pkgindex]+"::"+y+")", 
short_msg=short_msg)
+                                       
retval=portage.doebuild(y,"rpm",myroot,self.pkgsettings,edebug,cleanup=1,tree="porttree")
+                                       if (retval == None):
+                                               portage_util.writemsg("Unable 
to run required binary.\n")
+                                               sys.exit(127)
+                                       if retval:
+                                               sys.exit(retval)
+                                       continue
+
+
                                if ("--fetchonly" in myopts) or 
("--fetch-all-uri" in myopts):
                                        continue
 
Index: prefix-portage-2.1.13.4497/bin/rpmbuild.sh
===================================================================
--- /dev/null
+++ prefix-portage-2.1.13.4497/bin/rpmbuild.sh
@@ -0,0 +1,195 @@
+#!/bin/bash
+
+get_first() {
+    local l_list=${1}
+    for item in ${l_list}; do
+      break
+    done
+    echo ${item}
+}
+
+##
+## Get the RPM name
+##
+get_rpm_name() {
+    local l_rpmname="${PN}"
+    if [ -f ${EPREFIX}/var/db/pkg/${CATEGORY}/${PF}/SLOT ]; then
+        local l_slot="`cat ${EPREFIX}/var/db/pkg/${CATEGORY}/${PF}/SLOT | 
xargs`"
+        l_slot="`echo ${l_slot} | sed -e 's|\.|_|g'`"
+    fi
+    if [ -n "${l_slot}" ] && [ "${l_slot}" != "0" ] ; then
+        l_rpmname="${l_rpmname}${l_slot}"
+    fi
+    echo ${l_rpmname}
+}
+
+##
+## Get the list of provides for RPM
+##
+get_rpm_provides() {
+    local provides=""
+    #if [ "${PN}" != "`get_rpm_name`" ]; then
+    #    provides="${PN} = ${PV}"
+    #fi
+    if [ -f ${EPREFIX}/var/db/pkg/${CATEGORY}/${PF}/PROVIDE ]; then
+        local l_provide=`cat ${EPREFIX}/var/db/pkg/${CATEGORY}/${PF}/PROVIDE | 
xargs`
+        for pkg in ${l_provide}; do
+            if [ -n "${provides}" ]; then
+                provides="${provides},"
+            fi
+            provides="${provides} `echo ${pkg} | sed -e 's|^virtual\/||'`"
+        done
+    fi
+    echo "${provides}"
+}
+
+##
+## Generate dynamic spec 
+##
+dyn_spec() {
+    echo "tar czf ${EPREFIX}/usr/src/redhat/SOURCES/${PF}.tar.gz 
${O}/${PF}.ebuild ${O}/files"
+       tar czf "${EPREFIX}/usr/src/redhat/SOURCES/${PF}.tar.gz" 
"${O}/${PF}.ebuild" "${O}/files" || die "Failed to create base rpm tarball."
+    [ $? -eq 0 ] && echo "Success!!!"
+    SPEC_DIR=${EPREFIX}/usr/src/redhat/SPECS
+    cd ${SPEC_DIR}
+
+
+    rpm_arch="`getRpmArch`"
+    if [ "${rpm_arch}" = "unknown" ] || [ -z "${rpm_arch}" ] ; then
+        echo "Invalid architecture: ${rpm_arch}"
+        exit 1
+    fi
+    rpmname="`get_rpm_name`"
+    ( 
+        unset ROOT
+               echo "erpmquery -bR -p =${PF} -U '${USE}'"
+        erpmquery -dbRc -p =${PF} -U "${USE}"
+        erpmquery -b -p =${PF} -U "${USE}" | grep '^B:' | cut -f2 -d':' 1> 
bdeps.$$
+        erpmquery -r -p =${PF} -U "${USE}" | grep '^R:' | cut -f2 -d':' 1> 
rdeps.$$
+        erpmquery -c -p =${PF} -U "${USE}" | grep '^C:' | cut -f2 -d':' 1> 
cdeps.$$
+        echo "equery which =${CATEGORY}/${PF}"
+        equery which =${CATEGORY}/${PF} 1> pkgpath.$$
+    )
+    bdeps="`cat bdeps.$$`"
+       rdeps="`cat rdeps.$$`"
+    cdeps="`cat cdeps.$$`"
+    pkgpath="`cat pkgpath.$$`"
+    echo "breqs=${breqs}"
+       echo "rreqs=${rreqs}"
+    echo "conflicts=${conflicts}"
+    echo "pkgpath=${pkgpath}"
+    ## Check for provides
+    provides="`get_rpm_provides`"
+    if [ -f ${EPREFIX}/var/db/pkg/${CATEGORY}/${PF}/PROVIDE ]; then
+        local l_provide=`cat ${EPREFIX}/var/db/pkg/${CATEGORY}/${PF}/PROVIDE | 
xargs`
+        for pkg in ${l_provide}; do
+            if [ -n "${provides}" ]; then
+                provides="${provides},"
+            fi
+            provides="${provides} `echo ${pkg} | sed -e 's|^virtual\/||'`"
+        done
+    fi
+    echo "Provides: ${provides}"
+    rm bdeps.$$ rdeps.$$ cdeps.$$ pkgpath.$$
+
+    (
+    echo "## RPM Spec file automatically generated by ebuild"
+    echo "## Do not edit "
+    echo ""
+    echo -n "Summary:                    "
+    echo -n ${DESCRIPTION} | xargs -0 | head --lines=1
+    echo "Name:                       ${rpmname}"
+    echo "Version:                    ${PV}"
+    echo "Release:                    ${PR}"
+    echo "Group:                      portage/${CATEGORY}"
+    echo "Source:                     ${PF}.tar.gz"
+    echo "URL:                        `get_first \"${HOMEPAGE}\"`"
+    echo "License:                    ${LICENSE}"
+    echo "AutoReq:                    no"
+    echo "AutoReqProv:                no"
+    if [ -n "${bdeps}" ]; then
+        echo "BuildPreReq:                ${bdeps}"
+    fi
+    if [ -n "${rdeps}" ]; then
+        echo "PreReq:                     ${rdeps}"
+    fi
+    if [ -n "${cdeps}" ]; then
+        echo "Conflicts:                  ${cdeps}"
+    fi
+    if [ -n "${provides}" ]; then
+        echo "Provides:                   ${provides}"
+    fi
+    echo ""
+    echo "%description"
+    echo "${DESCRIPTION}" | sed -e "s|^|    |"
+    echo ""
+    echo "%define   EBUILD_PATH     ${pkgpath}"
+    echo "%define   EPREFIX         ${EPREFIX}"
+    echo ""
+    echo "%prep"
+    echo "%setup -c"
+    echo ""
+    echo "%build"
+    echo ""
+    echo "%install"
+    echo "    if [ ! -f %{EPREFIX}/usr/portage/packages/All/${PF}.tbz2 ]; then"
+    echo "        echo 'Binary package not found at: 
%{EPREFIX}/usr/portage/packages/All/${PF}.tbz2'"
+    echo "        exit 1"
+    echo "    fi"
+    echo "    rm -rf ${RPM_BUILD_ROOT}"
+    echo "    mkdir -p ${RPM_BUILD_ROOT}%{EPREFIX}/usr/portage/packages/All"
+    echo "    cp -p %{EPREFIX}/usr/portage/packages/All/${PF}.tbz2 
${RPM_BUILD_ROOT}%{EPREFIX}/usr/portage/packages/All"
+    echo '    %get_files'
+    echo ""
+    echo "%clean"
+    echo ""
+    echo "%files -f files"
+    echo ""
+    echo "%post"
+    echo "    %{EPREFIX}/usr/bin/emerge --verbose --usepkgonly 
=${CATEGORY}/${PF}"
+    echo ""
+    echo "%preun"
+    echo "    %{EPREFIX}/usr/bin/emerge --verbose --unmerge =${CATEGORY}/${PF}"
+    echo ""
+    
+    ) > ${rpmname}.spec
+    
+}
+
+##
+## Generate dynamic RPM
+##
+dyn_rpm() {
+       addwrite /usr/src/redhat/
+    echo "RPMDIR:${RPMDIR}"
+       addwrite ${RPMDIR}
+    echo "RPM_BUILD_ROOT=${EDEST}"
+    export RPM_BUILD_ROOT=${EDEST}
+       dyn_spec
+    echo "rpmbuild --nodeps --buildroot ${RPM_BUILD_ROOT} -bb ${rpmname}.spec"
+       rpmbuild --nodeps --buildroot ${RPM_BUILD_ROOT} -bb "${rpmname}.spec" 
|| die "Failed to integrate rpm spec file"
+       #install -D 
"${EPREFIX}/usr/src/redhat/RPMS/i386/${PN}-${PV}-${PR}.i386.rpm" 
"${RPMDIR}/${CATEGORY}/${PN}-${PV}-${PR}.rpm" || die "Failed to move rpm"
+}
+
+##
+## Get rpm architecture
+##
+getRpmArch() {
+    local l_arch="unknown"
+    which uname > /dev/null 2>&1
+    if [ $? -eq 0 ]; then
+        local l_arch=`uname -i` && l_arch=${l_arch/#unknown/`uname -m`}
+    fi
+    case ${l_arch} in
+        *i?86*)
+            l_arch="i386"
+            ;;
+        x86_64)
+            ;;
+        *)
+            l_arch="unknown"
+            ;;
+    esac
+    echo "${l_arch}"
+}
+
Index: prefix-portage-2.1.13.4497/pym/emergehelp.py
===================================================================
--- prefix-portage-2.1.13.4497.orig/pym/emergehelp.py
+++ prefix-portage-2.1.13.4497/pym/emergehelp.py
@@ -146,6 +146,16 @@ def help(myaction,myopts,havecolor=1):
                print "              must not exist for the desired package as 
they cannot be used if"
                print "              they do not exist on the system."
                print
+               print "       "+green("--buildrpm")+" ("+green("-r")+" short 
option)"
+               print "              Tell emerge to build binary RPM packages 
for all ebuilds processed"
+               print "              (in addition to actually merging the 
packages.)"
+               print "              This implies --buildpkg also, since RPM 
just bundles the binary"
+               print "              package for given ebuild."
+               print
+               print "       "+green("--buildrpmonly")+" ("+green("-R")+" 
short option)"
+               print "              Creates a binary RPM package, but does not 
merge it to the"
+               print "              system. This implies --buildpkgonly."
+               print
                print "       "+green("--changelog")+" ("+green("-l")+" short 
option)"
                print "              When pretending, also display the 
ChangeLog entries for packages"
                print "              that will be upgraded."
Index: prefix-portage-2.1.13.4497/pym/portage.py
===================================================================
--- prefix-portage-2.1.13.4497.orig/pym/portage.py
+++ prefix-portage-2.1.13.4497/pym/portage.py
@@ -2333,7 +2333,7 @@ actionmap_deps={
        "compile":["unpack"],
        "test":   ["compile"],
        "install":["test"],
-       "rpm":    ["install"],
+       "rpm":    [],
        "package":["install"],
 }
 
Index: prefix-portage-2.1.13.4497/bin/misc-functions.sh
===================================================================
--- prefix-portage-2.1.13.4497.orig/bin/misc-functions.sh
+++ prefix-portage-2.1.13.4497/bin/misc-functions.sh
@@ -404,6 +404,9 @@ dyn_rpm() {
        install -D "/usr/src/redhat/RPMS/i386/${PN}-${PV}-${PR}.i386.rpm" 
"${RPMDIR}/${CATEGORY}/${PN}-${PV}-${PR}.rpm" || die "Failed to move rpm"
 }
 
+## Source the rpmbuild script
+source @PORTAGE_BASE@/bin/rpmbuild.sh
+
 if [ -n "${MISC_FUNCTIONS_ARGS}" ]; then
        [ "$PORTAGE_DEBUG" == "1" ] && set -x
        for x in ${MISC_FUNCTIONS_ARGS}; do
Index: prefix-portage-2.1.13.4497/bin/misc-functions.sh
===================================================================
--- prefix-portage-2.1.13.4497.orig/bin/misc-functions.sh
+++ prefix-portage-2.1.13.4497/bin/misc-functions.sh
@@ -182,6 +182,16 @@ install_qa_check() {
                unset INSTALLTOD
        fi
 
+       if [[ -d ${D}/${PREFIX} ]] ; then
+               declare -i INSTALLTOD=0
+               for i in $(find "${D}/${PREFIX}/"); do
+                       echo "QA Notice: /${i##${D}/${PREFIX}} double prefix"
+                       ((INSTALLTOD++))
+               done
+               ewarn "QA concerns: ${INSTALLTOD} double prefix files installed 
"
+               unset INSTALLTOD
+       fi
+
        local find_log="${T}/find-portage-log"
        find "${D}"/ -user ${PORTAGE_USER:-portage} -print0 > "${find_log}"
        if [[ -s ${find_log} ]] ; then
@@ -239,7 +249,13 @@ preinst_mask() {
                 eerror "${FUNCNAME}: IMAGE is unset"
                 return 1
        else
-               IMAGE="${IMAGE}/${EPREFIX}"
+               plen=${#EPREFIX}
+               ilen=${#IMAGE}
+               # check if prefixed at end
+               pend=${IMAGE:$[ilen-plen]:${plen}}
+               if [ "${pend}" != "${EPREFIX}" ]; then
+                       IMAGE="${IMAGE}${EPREFIX}"
+               fi
        fi
        # remove man pages, info pages, docs if requested
        for f in man info doc; do
Index: prefix-portage-2.1.13.4497/bin/dispatch-conf
===================================================================
--- prefix-portage-2.1.13.4497.orig/bin/dispatch-conf
+++ prefix-portage-2.1.13.4497/bin/dispatch-conf
@@ -78,6 +78,9 @@ class dispatch:
         #
 
         for path in config_paths.split ():
+           if (path[0:len(EPREFIX)] != EPREFIX):
+                path=EPREFIX+path
+
             if not os.path.exists (path):
                 continue
 
Index: prefix-portage-2.1.13.4497/bin/emaint
===================================================================
--- prefix-portage-2.1.13.4497.orig/bin/emaint
+++ prefix-portage-2.1.13.4497/bin/emaint
@@ -16,7 +16,7 @@ class WorldHandler(object):
                self.invalid = []
                self.not_installed = []
                self.okay = []
-               self.world_file = os.path.join("/", portage_const.WORLD_FILE)
+               self.world_file = os.path.join(portage_const.EPREFIX+"/", 
portage_const.WORLD_FILE)
                self.found = os.access(self.world_file, os.R_OK)
 
                for atom in open(self.world_file).read().split():
Index: prefix-portage-2.1.13.4497/bin/emerge
===================================================================
--- prefix-portage-2.1.13.4497.orig/bin/emerge
+++ prefix-portage-2.1.13.4497/bin/emerge
@@ -1368,6 +1368,7 @@ class depgraph:
                        portage.db[splitski[1]]["merge"].append(splitski)
                        mygraph.delnode(mycurkey)
                for x in dolist:
+                       if x == "/" and x != portage.root: continue
                        for y in portage.db[x]["merge"]:
                                retlist.append(y)
                return retlist
Index: prefix-portage-2.1.13.4497/bin/etc-update
===================================================================
--- prefix-portage-2.1.13.4497.orig/bin/etc-update
+++ prefix-portage-2.1.13.4497/bin/etc-update
@@ -42,7 +42,11 @@ function scan() {
                exit 1
        fi
 
+       prefix_len=${#EPREFIX}
        for path in ${CONFIG_PROTECT} ; do
+               if [ "${path::${prefix_len}}" != "${EPREFIX}" ]; then
+                       path=${EPREFIX}${path}
+               fi
                [ ! -d ${path} ] && continue
 
                ofile=""
Index: prefix-portage-2.1.13.4497/bin/misc-functions.sh
===================================================================
--- prefix-portage-2.1.13.4497.orig/bin/misc-functions.sh
+++ prefix-portage-2.1.13.4497/bin/misc-functions.sh
@@ -363,12 +363,14 @@ dyn_package() {
        install_mask "${PORTAGE_BUILDDIR}/image" ${PKG_INSTALL_MASK}
        local pkg_dest="${PKGDIR}/All/${PF}.tbz2"
        local pkg_tmp="${PKGDIR}/All/${PF}.tbz2.$$"
+       addwrite "${PKGDIR}"
+
        # Sandbox is disabled in case the user wants to use a symlink
        # for $PKGDIR and/or $PKGDIR/All.
        export SANDBOX_ON="0"
        tar cpvf - ./ | bzip2 -f > "${pkg_tmp}" || die "Failed to create 
tarball"
        cd ..
-       python -c "import xpak; t=xpak.tbz2('${pkg_tmp}'); 
t.recompose('${PORTAGE_BUILDDIR}/build-info')"
+       PYTHONPATH=${EPREFIX}/usr/lib/portage/pym python -c "import xpak; 
t=xpak.tbz2('${pkg_tmp}'); t.recompose('${PORTAGE_BUILDDIR}/build-info')"
        if [ $? -ne 0 ]; then
                rm -f "${pkg_tmp}"
                die "Failed to append metadata to the tbz2 file"
Index: prefix-portage-2.1.13.4497/pym/dispatch_conf.py
===================================================================
--- prefix-portage-2.1.13.4497.orig/pym/dispatch_conf.py
+++ prefix-portage-2.1.13.4497/pym/dispatch_conf.py
@@ -12,6 +12,7 @@ import os, sys, commands, shutil
 
 sys.path = ["/usr/lib/portage/pym"]+sys.path
 import portage
+from portage_const import EPREFIX
 
 RCS_BRANCH = '1.1.1'
 RCS_LOCK = 'rcs -ko -M -l'
@@ -23,12 +24,12 @@ DIFF3_MERGE = 'diff3 -mE %s %s %s >%s'
 
 def read_config(mandatory_opts):
     try:
-        opts = portage.getconfig('/etc/dispatch-conf.conf')
+        opts = portage.getconfig(EPREFIX+'/etc/dispatch-conf.conf')
     except:
         opts = None
 
     if not opts:
-        print >> sys.stderr, 'dispatch-conf: Error reading 
/etc/dispatch-conf.conf; fatal'
+        print >> sys.stderr, 'dispatch-conf: Error reading 
'+EPREFIX+'/etc/dispatch-conf.conf; fatal'
         sys.exit(1)
 
     for key in mandatory_opts:
Index: prefix-portage-2.1.13.4497/pym/portage.py
===================================================================
--- prefix-portage-2.1.13.4497.orig/pym/portage.py
+++ prefix-portage-2.1.13.4497/pym/portage.py
@@ -1071,7 +1071,9 @@ class config:
 
                        try:
                                # XXX: Should depend on root?
-                               
self.mygcfg=getconfig("/"+MAKE_CONF_FILE,allow_sourcing=True)
+                               ## Yes, Should depend on root!! (npac)
+                               global root
+                               
self.mygcfg=getconfig(root+MAKE_CONF_FILE,allow_sourcing=True)
                                if self.mygcfg == None:
                                        self.mygcfg = {}
                        except SystemExit, e:
@@ -2610,7 +2612,7 @@ def prepare_build_dirs(myroot, mysetting
                        mysettings["LOG_PF"] != mysettings["PF"]:
                                mysettings["LOG_PF"] = mysettings["PF"]
                                mysettings["LOG_COUNTER"] = \
-                                       
str(db[myroot]["vartree"].dbapi.get_counter_tick_core("/"))
+                                       
str(db[myroot]["vartree"].dbapi.get_counter_tick_core(root))
 
                if not logging_enabled:
                        writemsg("!!! Permission issues with 
PORT_LOGDIR='%s'\n" % mysettings["PORT_LOGDIR"])
@@ -4830,7 +4832,8 @@ class portdbapi(dbapi):
                                        writemsg("Uncaught handled exception: 
%(exception)s\n" % {"exception":str(e)})
                                        raise
 
-                       
myret=doebuild(myebuild,"depend","/",self.mysettings,dbkey=mydbkey,tree="porttree")
+                       # Use root, instead of "/" (npac)
+                       
myret=doebuild(myebuild,"depend",root,self.mysettings,dbkey=mydbkey,tree="porttree")
                        if myret:
                                portage_locks.unlockfile(mylock)
                                self.lock_held = 0
@@ -6475,6 +6478,9 @@ def pkgmerge(mytbz2,myroot,mysettings):
 # XXX Fix this
 if os.environ.has_key("ROOT"):
        root=os.environ["ROOT"]
+       ## cchan - HACK for when portage is being called within an ebuild/eclass
+       if root == portage_const.EPREFIX: root="/"
+       
        if not len(root):
                root="/"
        elif root[-1]!="/":
Index: prefix-portage-2.1.13.4497/bin/ebuild.sh
===================================================================
--- prefix-portage-2.1.13.4497.orig/bin/ebuild.sh
+++ prefix-portage-2.1.13.4497/bin/ebuild.sh
@@ -3,6 +3,12 @@
 # Distributed under the terms of the GNU General Public License v2
 # $Id: /var/cvsroot/gentoo-src/portage/bin/ebuild.sh,v 1.201.2.42 2005/08/20 
17:24:30 jstubbs Exp $
 
+PORTAGE_BIN_PATH="${PORTAGE_BIN_PATH:-${EPREFIX}/usr/lib/portage/bin}"
+PORTAGE_PYM_PATH="${PORTAGE_PYM_PATH:-${EPREFIX}/usr/lib/portage/pym}"
+PORTAGE_HOOK_PATH="${PORTAGE_HOOK_PATH:-${EPREFIX}/etc/portage/hooks.d}"
+declare -rx PORTAGE_BIN_PATH PORTAGE_PYM_PATH PORTAGE_HOOK_PATH
+
+
 export 
SANDBOX_PREDICT="${SANDBOX_PREDICT}:/proc/self/maps:/dev/console:@PORTAGE_BASE@/pym:/dev/random"
 export 
SANDBOX_WRITE="${SANDBOX_WRITE}:/dev/shm:/dev/stdout:/dev/stderr:${PORTAGE_TMPDIR}"
 export SANDBOX_READ="${SANDBOX_READ}:/dev/shm:/dev/stdin:${PORTAGE_TMPDIR}"
@@ -411,6 +417,9 @@ diefunc() {
                        ${x} "$@" >&2 1>&2
                done
        fi
+       ## hook handler for die()
+       hook_handler die func
+
        exit 1
 }
 
@@ -975,6 +984,18 @@ libopts() {
        [[ " ${LIBOPTIONS} " == *" -s "* ]] && die "Never call libopts() with 
-s"
 }
 
+hook_handler() {
+       local hooktype="$1"
+       local myarg="$2"
+
+       if [ -e ${PORTAGE_HOOK_PATH}/${hooktype}_${myarg}/* ]; then
+               for i in ${PORTAGE_HOOK_PATH}/${hooktype}_${myarg}/* ; do
+                       echo ">>> Running ${hooktype}_${myarg} hook: ${i}"
+                       . ${i}
+               done
+       fi
+}
+
 abort_handler() {
        local msg
        if [ "$2" != "fail" ]; then
@@ -988,6 +1009,8 @@ abort_handler() {
        eval ${3}
        #unset signal handler
        trap SIGINT SIGQUIT
+       
+       hook_handler abort handler
 }
 
 abort_compile() {
@@ -1649,6 +1672,7 @@ fi
 set +f
 
 for myarg in $*; do
+       hook_handler pre ${myarg}    
        case $myarg in
        nofetch)
                pkg_nofetch
@@ -1750,6 +1774,8 @@ for myarg in $*; do
                ;;
        esac
 
+       hook_handler post ${myarg}
+
        #if [ $? -ne 0 ]; then
        #       exit 1
        #fi
Index: prefix-portage-2.1.13.4497/bin/ebuild.sh
===================================================================
--- prefix-portage-2.1.13.4497.orig/bin/ebuild.sh
+++ prefix-portage-2.1.13.4497/bin/ebuild.sh
@@ -1145,7 +1145,16 @@ dyn_test() {
                ewarn "Skipping make test/check due to ebuild restriction."
                echo ">>> Test phase [explicitly disabled]: ${CATEGORY}/${PF}"
        elif ! hasq test $FEATURES; then
-               echo ">>> Test phase [not enabled]: ${CATEGORY}/${PF}"
+               ## check package.test
+               if [ -f ${EPREFIX}/etc/portage/package.test ]; then
+                       local found=$(grep "^${CATEGORY}/${PN}" 
${EPREFIX}/etc/portage/package.test)
+                       if [ -n "${found}" ]; then
+                               echo "Running test for ${CATEGORY}/${PF}"
+                               src_test
+                       fi
+               else
+                       echo ">>> Test phase [not enabled]: ${CATEGORY}/${PF}"
+               fi
        else
                src_test
        fi
Index: prefix-portage-2.1.13.4497/bin/emerge
===================================================================
--- prefix-portage-2.1.13.4497.orig/bin/emerge
+++ prefix-portage-2.1.13.4497/bin/emerge
@@ -1041,6 +1041,8 @@ class depgraph:
                else:
                        mydep["/"]=edepend["DEPEND"]
                        mydep[myroot]=edepend["RDEPEND"]
+                       if portage_const.PORTAGE_CYGWIN:
+                               mydep[myroot]=mydep[myroot] + " " + 
edepend["DEPEND"]
                        if not 
self.select_dep("/",mydep["/"],myparent=mp,myuse=myuse):
                                return 0
                        if not 
self.select_dep(myroot,mydep[myroot],myparent=mp,myuse=myuse):
Index: prefix-portage-2.1.13.4497/pym/portage.py
===================================================================
--- prefix-portage-2.1.13.4497.orig/pym/portage.py
+++ prefix-portage-2.1.13.4497/pym/portage.py
@@ -2318,7 +2318,7 @@ def spawnebuild(mydo,actionmap,mysetting
        kwargs = actionmap[mydo]["args"]
        phase_retval = spawn(actionmap[mydo]["cmd"] % mydo, mysettings, 
debug=debug, logfile=logfile, **kwargs)
        if phase_retval == os.EX_OK:
-               if mydo == "install":
+               if mydo == "install" and not portage_const.PORTAGE_CYGWIN:
                        mycommand = " ".join([MISC_SH_BINARY, 
"install_qa_check"])
                        qa_retval = spawn(mycommand, mysettings, debug=debug, 
logfile=logfile, **kwargs)
                        if qa_retval:
@@ -6476,6 +6476,9 @@ def pkgmerge(mytbz2,myroot,mysettings):
        return returnme
 
 # XXX Fix this
+# Cygwin hack (npac)
+if portage_const.PORTAGE_ROOT and portage_const.PORTAGE_CYGWIN:
+       os.environ['ROOT'] = portage_const.PORTAGE_ROOT
 if os.environ.has_key("ROOT"):
        root=os.environ["ROOT"]
        ## cchan - HACK for when portage is being called within an ebuild/eclass
Index: prefix-portage-2.1.13.4497/pym/portage_const.py
===================================================================
--- prefix-portage-2.1.13.4497.orig/pym/portage_const.py
+++ prefix-portage-2.1.13.4497/pym/portage_const.py
@@ -57,6 +57,10 @@ MANIFEST1_HASH_FUNCTIONS = ["MD5","SHA25
 MANIFEST2_HASH_FUNCTIONS = ["SHA1","SHA256","RMD160"]
 
 MANIFEST2_IDENTIFIERS = ["AUX","MISC","DIST","EBUILD"]
+## Cygwin hack (npac)
+PORTAGE_ROOT           = ""
+PORTAGE_CYGWIN         = False
+
 # ===========================================================================
 # END OF CONSTANTS -- END OF CONSTANTS -- END OF CONSTANTS -- END OF CONSTANT
 # ===========================================================================
Index: prefix-portage-2.1.13.4497/pym/portage_data.py
===================================================================
--- prefix-portage-2.1.13.4497.orig/pym/portage_data.py
+++ prefix-portage-2.1.13.4497/pym/portage_data.py
@@ -12,7 +12,7 @@ from output import green,red
 ostype=os.uname()[0]
 
 lchown = None
-if ostype=="Linux" or ostype.lower().endswith("gnu"):
+if ostype=="Linux" or ostype.lower().endswith("gnu") or 
ostype.lower().startswith("cygwin"):
        userland="GNU"
        os.environ["XARGS"]="xargs -r"
 elif ostype == "Darwin":
Index: prefix-portage-2.1.13.4497/pym/portage_locks.py
===================================================================
--- prefix-portage-2.1.13.4497.orig/pym/portage_locks.py
+++ prefix-portage-2.1.13.4497/pym/portage_locks.py
@@ -160,7 +160,14 @@ def unlockfile(mytuple):
                if myfd == None:
                        myfd = os.open(lockfilename, os.O_WRONLY,0660)
                        unlinkfile = 1
-               locking_method(myfd,fcntl.LOCK_UN)
+               if portage_const.PORTAGE_CYGWIN:
+                       ## Unlocking does not work on Cygwin
+                       try:
+                               locking_method(myfd,fcntl.LOCK_UN)
+                       except:
+                               pass
+               else:
+                       locking_method(myfd,fcntl.LOCK_UN)
        except SystemExit, e:
                raise
        except Exception, e:
Index: prefix-portage-2.1.13.4497/pym/portage_util.py
===================================================================
--- prefix-portage-2.1.13.4497.orig/pym/portage_util.py
+++ prefix-portage-2.1.13.4497/pym/portage_util.py
@@ -3,6 +3,7 @@
 # $Id: /var/cvsroot/gentoo-src/portage/pym/portage_util.py,v 1.11.2.6 
2005/04/23 07:26:04 jstubbs Exp $
 
 from portage_exception import PortageException, FileNotFound, 
OperationNotPermitted
+import portage_const
 
 import sys,string,shlex,os,errno
 try:
@@ -651,7 +652,19 @@ class atomic_ofstream(file):
                                                        pass
                                                else:
                                                        raise
-                                       os.rename(self.name, self._real_name)
+                                       ## Cygwin fix - cannot rename file if 
it exists on Windows
+                                       ## Gives permission denied error
+                                       if portage_const.PORTAGE_CYGWIN:
+                                               try:
+                                                       if 
os.path.exists(self._real_name):
+                                                               pass
+                                                       os.rename(self.name, 
self._real_name)
+                                               except:
+                                                       #print "Failed to move 
file " + self.name + " to " + self._real_name
+                                                       pass
+                                       else:
+                                               os.rename(self.name, 
self._real_name)
+
                        finally:
                                # Make sure we cleanup the temp file
                                # even if an exception is raised.

Reply via email to