diff options
-rwxr-xr-x | bin/isolated-functions.sh | 35 | ||||
-rw-r--r-- | pym/emerge/__init__.py | 3 | ||||
-rw-r--r-- | pym/portage/__init__.py | 14 | ||||
-rw-r--r-- | pym/portage/dbapi/vartree.py | 48 |
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" |