summaryrefslogtreecommitdiffstats
path: root/pym/_emerge/Scheduler.py
diff options
context:
space:
mode:
authorSebastian Luther <SebastianLuther@gmx.de>2010-03-29 22:52:17 +0200
committerSebastian Luther <SebastianLuther@gmx.de>2010-04-02 21:46:17 +0200
commitc929cd1053f795f55e31626423909979da1190a5 (patch)
treeab5f8f79825c10729bcb2e9869e5b30bdd5e2457 /pym/_emerge/Scheduler.py
parent910e5b29ab0a8a449ae23844240d168f20f5e67e (diff)
downloadportage-c929cd1053f795f55e31626423909979da1190a5.tar.gz
portage-c929cd1053f795f55e31626423909979da1190a5.tar.bz2
portage-c929cd1053f795f55e31626423909979da1190a5.zip
Implement emerge part of pkg_pretend
Diffstat (limited to 'pym/_emerge/Scheduler.py')
-rw-r--r--pym/_emerge/Scheduler.py84
1 files changed, 83 insertions, 1 deletions
diff --git a/pym/_emerge/Scheduler.py b/pym/_emerge/Scheduler.py
index 4d9b3a563..bf39e6580 100644
--- a/pym/_emerge/Scheduler.py
+++ b/pym/_emerge/Scheduler.py
@@ -5,7 +5,9 @@ from __future__ import print_function
import codecs
import logging
+import shutil
import sys
+import tempfile
import textwrap
import time
import weakref
@@ -27,6 +29,7 @@ from portage.util import writemsg, writemsg_level
from portage.package.ebuild.digestcheck import digestcheck
from portage.package.ebuild.digestgen import digestgen
+from _emerge.BinpkgFetcher import BinpkgFetcher
from _emerge.BinpkgPrefetcher import BinpkgPrefetcher
from _emerge.Blocker import Blocker
from _emerge.BlockerDB import BlockerDB
@@ -852,8 +855,83 @@ class Scheduler(PollScheduler):
os.environ["PORTAGE_NICENESS"] = "0"
os.execv(mynewargv[0], mynewargv)
- def merge(self):
+ def _run_pkg_pretend(self):
+ shown_verifying_msg = False
+ quiet_settings = {}
+ for myroot, pkgsettings in self.pkgsettings.items():
+ quiet_config = portage.config(clone=pkgsettings)
+ quiet_config["PORTAGE_QUIET"] = "1"
+ quiet_config.backup_changes("PORTAGE_QUIET")
+ quiet_settings[myroot] = quiet_config
+ del quiet_config
+
+ failures = 0
+
+ for x in self._mergelist:
+ if not isinstance(x, Package):
+ continue
+
+ if x.operation == "uninstall":
+ continue
+ if x.metadata["EAPI"] in ("0", "1", "2", "3"):
+ continue
+
+ if "pretend" not in x.metadata.defined_phases:
+ continue
+
+ if not shown_verifying_msg:
+ shown_verifying_msg = True
+ self._status_msg("Running pkg_pretend")
+
+ root_config = x.root_config
+ quiet_config = quiet_settings[root_config.root]
+ settings = self.pkgsettings[root_config.root]
+
+ if x.built:
+ bintree = root_config.trees["bintree"].dbapi.bintree
+ if bintree.isremote(x.cpv):
+ fetcher = BinpkgFetcher(background=False,
+ logfile=self.settings.get("PORTAGE_LOG_FILE"), pkg=x, scheduler=self._sched_iface)
+ fetcher.start()
+ fetcher.wait()
+ bintree.inject(x.cpv)
+
+ tbz2_file = bintree.getname(x.cpv)
+ ebuild_file_name = x.cpv.split("/")[1] + ".ebuild"
+ ebuild_file_contents = portage.xpak.tbz2(tbz2_file).getfile(ebuild_file_name)
+ tmpdir = tempfile.mkdtemp()
+ os.makedirs(os.path.join(tmpdir, x.category, x.pf))
+ ebuild_path = os.path.join(tmpdir, x.category, x.pf, ebuild_file_name)
+ file = open(ebuild_path, 'w')
+ file.write(ebuild_file_contents)
+ file.close()
+ quiet_config["O"] = os.path.dirname(ebuild_path)
+
+ ret = portage.package.ebuild.doebuild.doebuild(ebuild_path, "pretend", \
+ root_config.root, settings, debug=(settings.get("PORTAGE_DEBUG", "") == 1),
+ mydbapi=self.trees[settings["ROOT"]]["bintree"].dbapi, tree="bintree")
+ ret = os.EX_OK
+
+ shutil.rmtree(tmpdir)
+ else:
+ portdb = root_config.trees["porttree"].dbapi
+ ebuild_path = portdb.findname(x.cpv)
+ if ebuild_path is None:
+ raise AssertionError("ebuild not found for '%s'" % x.cpv)
+ quiet_config["O"] = os.path.dirname(ebuild_path)
+
+ ret = portage.package.ebuild.doebuild.doebuild(ebuild_path, "pretend", \
+ root_config.root, settings, debug=(settings.get("PORTAGE_DEBUG", "") == 1),
+ mydbapi=self.trees[settings["ROOT"]]["porttree"].dbapi, tree="porttree")
+
+ if ret != os.EX_OK:
+ failures += 1
+ if failures:
+ return 1
+ return os.EX_OK
+
+ def merge(self):
if "--resume" in self.myopts:
# We're resuming.
portage.writemsg_stdout(
@@ -909,6 +987,10 @@ class Scheduler(PollScheduler):
if rval != os.EX_OK and not keep_going:
return rval
+ rval = self._run_pkg_pretend()
+ if rval != os.EX_OK:
+ return rval
+
while True:
rval = self._merge()
if rval == os.EX_OK or fetchonly or not keep_going: