Fix pkg_pretend output and error handling.
diff --git a/pym/_emerge/Scheduler.py b/pym/_emerge/Scheduler.py
index 2e383cc..0a9e523 100644
--- a/pym/_emerge/Scheduler.py
+++ b/pym/_emerge/Scheduler.py
@@ -33,7 +33,9 @@
 from portage.package.ebuild.digestgen import digestgen
 from portage.package.ebuild.prepare_build_dirs import prepare_build_dirs
 
+from _emerge.BinpkgFetcher import BinpkgFetcher
 from _emerge.BinpkgPrefetcher import BinpkgPrefetcher
+from _emerge.BinpkgVerifier import BinpkgVerifier
 from _emerge.Blocker import Blocker
 from _emerge.BlockerDB import BlockerDB
 from _emerge.clear_caches import clear_caches
@@ -979,9 +981,19 @@
 		os.execv(mynewargv[0], mynewargv)
 
 	def _run_pkg_pretend(self):
+		"""
+		Since pkg_pretend output may be important, this method sends all
+		output directly to stdout (regardless of options like --quiet or
+		--jobs).
+		"""
 
 		failures = 0
 
+		# Use a local PollScheduler instance here, since we don't
+		# want tasks here to trigger the usual Scheduler callbacks
+		# that handle job scheduling and status display.
+		sched_iface = PollScheduler().sched_iface
+
 		for x in self._mergelist:
 			if not isinstance(x, Package):
 				continue
@@ -1005,60 +1017,71 @@
 			tmpdir_orig = settings["PORTAGE_TMPDIR"]
 			settings["PORTAGE_TMPDIR"] = tmpdir
 
-			if x.built:
-				tree = "bintree"
-				bintree = root_config.trees["bintree"].dbapi.bintree
-				if bintree.isremote(x.cpv):
-					fetcher = BinpkgPrefetcher(background=self._background,
-						logfile=self.settings.get("PORTAGE_LOG_FILE"), pkg=x, scheduler=self._sched_iface)
-					fetcher.start()
-					fetcher.wait()
+			try:
+				if x.built:
+					tree = "bintree"
+					bintree = root_config.trees["bintree"].dbapi.bintree
 
-				tbz2_file = bintree.getname(x.cpv)
-				infloc = os.path.join(tmpdir, x.category, x.pf, "build-info")
-				os.makedirs(infloc)
-				portage.xpak.tbz2(tbz2_file).unpackinfo(infloc)
-				ebuild_path = os.path.join(infloc, x.pf + ".ebuild")
-				settings.configdict["pkg"]["EMERGE_FROM"] = "binary"
-				settings.configdict["pkg"]["MERGE_TYPE"] = "binary"
+					# Display fetch on stdout, so that it's always clear what
+					# is consuming time here.
+					if bintree.isremote(x.cpv):
+						fetcher = BinpkgFetcher(pkg=x,
+							scheduler=sched_iface)
+						fetcher.start()
+						if fetcher.wait() != os.EX_OK:
+							failures += 1
+							continue
 
-			else:
-				tree = "porttree"
-				portdb = root_config.trees["porttree"].dbapi
-				ebuild_path = portdb.findname(x.cpv, myrepo=x.repo)
-				if ebuild_path is None:
-					raise AssertionError("ebuild not found for '%s'" % x.cpv)
-				settings.configdict["pkg"]["EMERGE_FROM"] = "ebuild"
-				if self._build_opts.buildpkgonly:
-					settings.configdict["pkg"]["MERGE_TYPE"] = "buildonly"
+					verifier = BinpkgVerifier(pkg=x,
+						scheduler=sched_iface)
+					verifier.start()
+					if verifier.wait() != os.EX_OK:
+						failures += 1
+						continue
+
+					tbz2_file = bintree.getname(x.cpv)
+					infloc = os.path.join(tmpdir, x.category, x.pf, "build-info")
+					os.makedirs(infloc)
+					portage.xpak.tbz2(tbz2_file).unpackinfo(infloc)
+					ebuild_path = os.path.join(infloc, x.pf + ".ebuild")
+					settings.configdict["pkg"]["EMERGE_FROM"] = "binary"
+					settings.configdict["pkg"]["MERGE_TYPE"] = "binary"
+
 				else:
-					settings.configdict["pkg"]["MERGE_TYPE"] = "source"
+					tree = "porttree"
+					portdb = root_config.trees["porttree"].dbapi
+					ebuild_path = portdb.findname(x.cpv, myrepo=x.repo)
+					if ebuild_path is None:
+						raise AssertionError("ebuild not found for '%s'" % x.cpv)
+					settings.configdict["pkg"]["EMERGE_FROM"] = "ebuild"
+					if self._build_opts.buildpkgonly:
+						settings.configdict["pkg"]["MERGE_TYPE"] = "buildonly"
+					else:
+						settings.configdict["pkg"]["MERGE_TYPE"] = "source"
 
-			portage.package.ebuild.doebuild.doebuild_environment(ebuild_path,
-				"pretend", settings=settings,
-				db=self.trees[settings["ROOT"]][tree].dbapi)
-			prepare_build_dirs(root_config.root, settings, cleanup=0)
+				portage.package.ebuild.doebuild.doebuild_environment(ebuild_path,
+					"pretend", settings=settings,
+					db=self.trees[settings["ROOT"]][tree].dbapi)
+				prepare_build_dirs(root_config.root, settings, cleanup=0)
 
-			vardb = root_config.trees['vartree'].dbapi
-			settings["REPLACING_VERSIONS"] = " ".join(
-				set(portage.versions.cpv_getversion(match) \
-					for match in vardb.match(x.slot_atom) + \
-					vardb.match('='+x.cpv)))
-			pretend_phase = EbuildPhase(background=self._background,
-				phase="pretend", scheduler=self._sched_iface,
-				settings=settings)
+				vardb = root_config.trees['vartree'].dbapi
+				settings["REPLACING_VERSIONS"] = " ".join(
+					set(portage.versions.cpv_getversion(match) \
+						for match in vardb.match(x.slot_atom) + \
+						vardb.match('='+x.cpv)))
+				pretend_phase = EbuildPhase(
+					phase="pretend", scheduler=sched_iface,
+					settings=settings)
 
-			pretend_phase.start()
-			ret = pretend_phase.wait()
-
-			portage.elog.elog_process(x.cpv, settings)
-
-			if ret == os.EX_OK:
+				pretend_phase.start()
+				ret = pretend_phase.wait()
+				if ret != os.EX_OK:
+					failures += 1
+				portage.elog.elog_process(x.cpv, settings)
+			finally:
 				shutil.rmtree(tmpdir)
-			settings["PORTAGE_TMPDIR"] = tmpdir_orig
+				settings["PORTAGE_TMPDIR"] = tmpdir_orig
 
-			if ret != os.EX_OK:
-				failures += 1
 		if failures:
 			return 1
 		return os.EX_OK