summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2007-06-27 01:20:56 +0000
committerZac Medico <zmedico@gentoo.org>2007-06-27 01:20:56 +0000
commit2f8b782094a915cad6fc7f872ddb281f6fee66b6 (patch)
treed32b54656844c214e4747d844621ef9e1536ed0f
parent535a5bf9831934136d604e8a22941cf5b05a1891 (diff)
downloadportage-2f8b782094a915cad6fc7f872ddb281f6fee66b6.tar.gz
portage-2f8b782094a915cad6fc7f872ddb281f6fee66b6.tar.bz2
portage-2f8b782094a915cad6fc7f872ddb281f6fee66b6.zip
Send the ebuild die message through eerror and make sure that elog_process() gets called when an ebuild dies. This makes the elog echo module display the die message last in case other elog messages push the original die message off of the top of the screen.
svn path=/main/trunk/; revision=7047
-rwxr-xr-xbin/isolated-functions.sh35
-rw-r--r--pym/emerge/__init__.py3
-rw-r--r--pym/portage/__init__.py14
-rw-r--r--pym/portage/dbapi/vartree.py48
4 files changed, 51 insertions, 49 deletions
diff --git a/bin/isolated-functions.sh b/bin/isolated-functions.sh
index e6517af74..161937734 100755
--- a/bin/isolated-functions.sh
+++ b/bin/isolated-functions.sh
@@ -23,7 +23,7 @@ dump_trace() {
strip=$(( $1 ))
fi
- echo "Call stack:"
+ eerror "Call stack:"
for (( n = ${#FUNCNAME[@]} - 1, p = ${#BASH_ARGV[@]} ; n > $strip ; n-- )) ; do
funcname=${FUNCNAME[${n} - 1]}
sourcefile=$(basename ${BASH_SOURCE[${n}]})
@@ -37,31 +37,32 @@ dump_trace() {
done
(( p -= ${BASH_ARGC[${n} - 1]} ))
fi
- echo " ${sourcefile}, line ${lineno}: Called ${funcname}${args:+ ${args}}"
+ eerror "${sourcefile}, line ${lineno}: Called ${funcname}${args:+ ${args}}"
done
}
diefunc() {
local funcname="$1" lineno="$2" exitcode="$3"
shift 3
- echo >&2
- echo "!!! ERROR: $CATEGORY/$PF failed." >&2
- dump_trace 2 1>&2
- echo " $(basename "${BASH_SOURCE[1]}"), line ${BASH_LINENO[0]}: Called die" 1>&2
- echo >&2
- echo "!!! ${*:-(no error message)}" >&2
- echo "!!! If you need support, post the topmost build error, and the call stack if relevant." >&2
+ eerror
+ eerror "ERROR: $CATEGORY/$PF failed."
+ dump_trace 2
+ eerror "$(basename "${BASH_SOURCE[1]}"), line ${BASH_LINENO[0]}: Called die"
+ eerror
+ eerror "${*:-(no error message)}"
+ eerror "If you need support, post the topmost build error, and the call stack if relevant."
[ -n "${PORTAGE_LOG_FILE}" ] && \
- echo "!!! A complete build log is located at '${PORTAGE_LOG_FILE}'." >&2
- echo >&2
+ eerror "A complete build log is located at '${PORTAGE_LOG_FILE}'."
if [ -n "${EBUILD_OVERLAY_ECLASSES}" ] ; then
- echo "This ebuild used the following eclasses from overlays:" >&2
- echo >&2
- for x in ${EBUILD_OVERLAY_ECLASSES} ; do
- echo " ${x}" >&2
- done
- echo >&2
+ eerror "This ebuild used eclasses from overlays: ${EBUILD_OVERLAY_ECLASSES}"
+ fi
+ if [ ${EBUILD#${PORTDIR}/} == ${EBUILD} ] ; then
+ local overlay=${EBUILD%/*}
+ overlay=${overlay%/*}
+ overlay=${overlay%/*}
+ eerror "This ebuild is from an overlay: '${overlay}/'"
fi
+ eerror
if [ "${EBUILD_PHASE/depend}" == "${EBUILD_PHASE}" ]; then
local x
diff --git a/pym/emerge/__init__.py b/pym/emerge/__init__.py
index 57447e8f1..1a084b602 100644
--- a/pym/emerge/__init__.py
+++ b/pym/emerge/__init__.py
@@ -3229,7 +3229,8 @@ class MergeTask(object):
pkgsettings, self.edebug, mydbapi=portdb,
tree="porttree")
del pkgsettings["PORTAGE_BINPKG_TMPFILE"]
- if "--buildpkgonly" in self.myopts:
+ if retval != os.EX_OK or \
+ "--buildpkgonly" in self.myopts:
elog_process(pkg_key, pkgsettings)
if retval != os.EX_OK:
return retval
diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py
index cbe55475c..2f9c8ee3c 100644
--- a/pym/portage/__init__.py
+++ b/pym/portage/__init__.py
@@ -3254,6 +3254,7 @@ def doebuild_environment(myebuild, mydo, myroot, mysettings, debug, use_cache, m
mysettings["FILESDIR"] = pkg_dir+"/files"
mysettings["PF"] = mypv
+ mysettings["PORTDIR"] = os.path.realpath(mysettings["PORTDIR"])
mysettings["ECLASSDIR"] = mysettings["PORTDIR"]+"/eclass"
mysettings["SANDBOX_LOG"] = mycpv.replace("/", "_-_")
@@ -4000,19 +4001,6 @@ def doebuild(myebuild, mydo, myroot, mysettings, debug=0, listonly=0,
print "!!! Unknown mydo:",mydo
return 1
- if retval != os.EX_OK and tree == "porttree":
- for i in xrange(len(mydbapi.porttrees)-1):
- t = mydbapi.porttrees[i+1]
- if myebuild.startswith(t):
- # Display the non-cannonical path, in case it's different, to
- # prevent confusion.
- overlays = mysettings["PORTDIR_OVERLAY"].split()
- try:
- writemsg("!!! This ebuild is from an overlay: '%s'\n" % \
- overlays[i], noiselevel=-1)
- except IndexError:
- pass
- break
return retval
finally:
diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py
index eac509b96..61a80a1d0 100644
--- a/pym/portage/dbapi/vartree.py
+++ b/pym/portage/dbapi/vartree.py
@@ -20,7 +20,7 @@ from portage.util import apply_secpass_permissions, ConfigProtect, ensure_dirs,
grabfile, grabdict, normalize_path, new_protect_filename
from portage.versions import pkgsplit, catpkgsplit, catsplit, best, pkgcmp
-from portage import listdir, dep_expand, config, flatten, key_expand, \
+from portage import listdir, dep_expand, flatten, key_expand, \
doebuild_environment, doebuild, env_update, \
abssymlink, movefile, _movefile, bsd_chflags
@@ -650,6 +650,7 @@ class vartree(object):
self.root = clone.root[:]
self.dbapi = copy.deepcopy(clone.dbapi)
self.populated = 1
+ from portage import config
self.settings = config(clone=clone.settings)
else:
self.root = root[:]
@@ -1058,6 +1059,7 @@ class dblink(object):
uid=portage_uid, gid=portage_gid, mode=070, mask=0)
builddir_lock = None
catdir_lock = None
+ retval = -1
try:
if myebuildpath:
catdir_lock = lockdir(catdir)
@@ -1090,23 +1092,27 @@ class dblink(object):
self.settings, use_cache=0, tree="vartree",
mydbapi=self.vartree.dbapi, vartree=self.vartree)
- # process logs created during pre/postrm
- elog_process(self.mycpv, self.settings)
-
# XXX: Decide how to handle failures here.
if retval != os.EX_OK:
writemsg("!!! FAILED postrm: %s\n" % retval, noiselevel=-1)
return retval
- doebuild(myebuildpath, "cleanrm", self.myroot, self.settings,
- tree="vartree", mydbapi=self.vartree.dbapi,
- vartree=self.vartree)
-
+
# regenerate reverse NEEDED map
self.vartree.dbapi.libmap.update()
finally:
if builddir_lock:
- unlockdir(builddir_lock)
+ try:
+ if myebuildpath:
+ # process logs created during pre/postrm
+ elog_process(self.mycpv, self.settings)
+ if retval == os.EX_OK:
+ doebuild(myebuildpath, "cleanrm", self.myroot,
+ self.settings, tree="vartree",
+ mydbapi=self.vartree.dbapi,
+ vartree=self.vartree)
+ finally:
+ unlockdir(builddir_lock)
try:
if myebuildpath and not catdir_lock:
# Lock catdir for removal if empty.
@@ -1609,9 +1615,12 @@ class dblink(object):
slot_matches.append(self.mycpv)
others_in_slot = []
+ from portage import config
for cur_cpv in slot_matches:
+ # Clone the config in case one of these has to be unmerged since
+ # we need it to have private ${T} etc... for things like elog.
others_in_slot.append(dblink(self.cat, catsplit(cur_cpv)[1],
- self.vartree.root, self.settings,
+ self.vartree.root, config(clone=self.settings),
vartree=self.vartree))
retval = self._security_check(others_in_slot)
if retval:
@@ -1806,12 +1815,6 @@ class dblink(object):
contents=contents, env=self.settings.environ())
writemsg_stdout(">>> %s %s\n" % (self.mycpv,"merged."))
-
- # Process ebuild logfiles
- elog_process(self.mycpv, self.settings)
- if "noclean" not in self.settings.features:
- doebuild(myebuild, "clean", destroot, self.settings,
- tree=self.treetype, mydbapi=mydbapi, vartree=self.vartree)
return os.EX_OK
def mergeme(self, srcroot, destroot, outfile, secondhand, stufftomerge, cfgfiledict, thismtime):
@@ -2083,12 +2086,21 @@ class dblink(object):
def merge(self, mergeroot, inforoot, myroot, myebuild=None, cleanup=0,
mydbapi=None, prev_mtimes=None):
+ retval = -1
+ self.lockdb()
try:
- self.lockdb()
- return self.treewalk(mergeroot, myroot, inforoot, myebuild,
+ retval = self.treewalk(mergeroot, myroot, inforoot, myebuild,
cleanup=cleanup, mydbapi=mydbapi, prev_mtimes=prev_mtimes)
+ # Process ebuild logfiles
+ elog_process(self.mycpv, self.settings)
+ if retval == os.EX_OK and "noclean" not in self.settings.features:
+ if myebuild is None:
+ myebuild = os.path.join(inforoot, self.pkg + ".ebuild")
+ doebuild(myebuild, "clean", myroot, self.settings,
+ tree=self.treetype, mydbapi=mydbapi, vartree=self.vartree)
finally:
self.unlockdb()
+ return retval
def getstring(self,name):
"returns contents of a file with whitespace converted to spaces"