summaryrefslogtreecommitdiffstats
path: root/pym/portage/dbapi/_MergeProcess.py
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2011-05-23 22:31:20 -0700
committerZac Medico <zmedico@gentoo.org>2011-05-23 22:31:20 -0700
commitf0f1bbe8fa9d3f698cbe529d2a11eec1ce437119 (patch)
tree0a8298a7bc680c26557fb64a92564a3fc40d992f /pym/portage/dbapi/_MergeProcess.py
parent2610641d07aa6af21c132d438995838c516a67f2 (diff)
downloadportage-f0f1bbe8fa9d3f698cbe529d2a11eec1ce437119.tar.gz
portage-f0f1bbe8fa9d3f698cbe529d2a11eec1ce437119.tar.bz2
portage-f0f1bbe8fa9d3f698cbe529d2a11eec1ce437119.zip
PackageUninstall: make async with MergeProcess
This fixes another ebuild-locks issue like the one fixed in commit a81460175a441897282b0540cefff8060f2b92dc, but this time we use a subprocess to ensure that the ebuild-locks for pkg_prerm and pkg_postrm do not interfere with pkg_setup ebuild-locks held by the main process.
Diffstat (limited to 'pym/portage/dbapi/_MergeProcess.py')
-rw-r--r--pym/portage/dbapi/_MergeProcess.py30
1 files changed, 23 insertions, 7 deletions
diff --git a/pym/portage/dbapi/_MergeProcess.py b/pym/portage/dbapi/_MergeProcess.py
index c2286067c..43bec7294 100644
--- a/pym/portage/dbapi/_MergeProcess.py
+++ b/pym/portage/dbapi/_MergeProcess.py
@@ -3,6 +3,7 @@
import shutil
import signal
+import sys
import tempfile
import traceback
@@ -26,7 +27,7 @@ class MergeProcess(SpawnProcess):
__slots__ = ('mycat', 'mypkg', 'settings', 'treetype',
'vartree', 'scheduler', 'blockers', 'pkgloc', 'infloc', 'myebuild',
- 'mydbapi', 'prev_mtimes', '_elog_reader_fd', '_elog_reg_id',
+ 'mydbapi', 'prev_mtimes', 'unmerge', '_elog_reader_fd', '_elog_reg_id',
'_buf', '_elog_keys', '_locked_vdb')
def _start(self):
@@ -45,7 +46,8 @@ class MergeProcess(SpawnProcess):
settings.reset()
settings.setcpv(cpv, mydb=self.mydbapi)
- self._handle_self_reinstall()
+ if not self.unmerge:
+ self._handle_self_reinstall()
super(MergeProcess, self)._start()
def _lock_vdb(self):
@@ -170,7 +172,9 @@ class MergeProcess(SpawnProcess):
# FEATURES=parallel-install skips this lock in order to
# improve performance, and the risk is practically negligible.
self._lock_vdb()
- counter = self.vartree.dbapi.counter_tick()
+ counter = None
+ if not self.unmerge:
+ counter = self.vartree.dbapi.counter_tick()
pid = os.fork()
if pid != 0:
@@ -213,7 +217,7 @@ class MergeProcess(SpawnProcess):
# already be opened by the parent process, so we set the
# "subprocess" value for use in conditional logging code
# involving PORTAGE_LOG_FILE.
- if self.settings.get("PORTAGE_BACKGROUND") == "1":
+ if not self.unmerge and self.settings.get("PORTAGE_BACKGROUND") == "1":
# unmerge phases have separate logs
self.settings["PORTAGE_BACKGROUND_UNMERGE"] = "1"
self.settings.backup_changes("PORTAGE_BACKGROUND_UNMERGE")
@@ -222,9 +226,21 @@ class MergeProcess(SpawnProcess):
rval = 1
try:
- rval = mylink.merge(self.pkgloc, self.infloc,
- myebuild=self.myebuild, mydbapi=self.mydbapi,
- prev_mtimes=self.prev_mtimes, counter=counter)
+ if self.unmerge:
+ if not mylink.exists():
+ rval = os.EX_OK
+ elif mylink.unmerge(
+ ldpath_mtimes=self.prev_mtimes) == os.EX_OK:
+ mylink.lockdb()
+ try:
+ mylink.delete()
+ finally:
+ mylink.unlockdb()
+ rval = os.EX_OK
+ else:
+ rval = mylink.merge(self.pkgloc, self.infloc,
+ myebuild=self.myebuild, mydbapi=self.mydbapi,
+ prev_mtimes=self.prev_mtimes, counter=counter)
except SystemExit:
raise
except: