summaryrefslogtreecommitdiffstats
path: root/bin/emaint
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2007-11-05 08:41:00 +0000
committerZac Medico <zmedico@gentoo.org>2007-11-05 08:41:00 +0000
commitf291576504956169153005d0b227b5983c0ba76a (patch)
tree670d239cfc707e52f99780d03f5092fe19c64297 /bin/emaint
parent0fd45502c0d97f21c455053be6a6309e9aa8bb10 (diff)
downloadportage-f291576504956169153005d0b227b5983c0ba76a.tar.gz
portage-f291576504956169153005d0b227b5983c0ba76a.tar.bz2
portage-f291576504956169153005d0b227b5983c0ba76a.zip
Make WorldHandler lock the world file when in --fix mode.
svn path=/main/trunk/; revision=8432
Diffstat (limited to 'bin/emaint')
-rwxr-xr-xbin/emaint34
1 files changed, 23 insertions, 11 deletions
diff --git a/bin/emaint b/bin/emaint
index 66a4dddf9..bfce4fc96 100755
--- a/bin/emaint
+++ b/bin/emaint
@@ -24,6 +24,10 @@ class WorldHandler(object):
self.not_installed = []
self.invalid_category = []
self.okay = []
+ from portage.sets import make_default_config
+ setconfig = make_default_config(portage.settings,
+ portage.db[portage.settings["ROOT"]])
+ self._sets = setconfig.getSetsWithAliases()
def _check_world(self, onProgress):
categories = set(portage.settings.categories)
@@ -32,10 +36,9 @@ class WorldHandler(object):
self.found = os.access(self.world_file, os.R_OK)
vardb = portage.db[myroot]["vartree"].dbapi
- from portage.sets import make_default_config, SETPREFIX
- setconfig = make_default_config(portage.settings, portage.db[myroot])
- sets = setconfig.getSetsWithAliases()
- world_atoms = open(self.world_file).read().split()
+ from portage.sets import SETPREFIX
+ sets = self._sets
+ world_atoms = list(sets["world"])
maxval = len(world_atoms)
if onProgress:
onProgress(maxval, 0)
@@ -77,14 +80,23 @@ class WorldHandler(object):
return errors
def fix(self, onProgress=None):
- self._check_world(onProgress)
- errors = []
+ world_set = self._sets["world"]
+ world_set.lock()
try:
- portage.write_atomic(self.world_file,
- "\n".join(sorted(self.okay)) + "\n")
- except portage.exception.PortageException:
- errors.append(self.world_file + " could not be opened for writing")
- return errors
+ world_set.load() # maybe it's changed on disk
+ before = set(world_set)
+ self._check_world(onProgress)
+ after = set(self.okay)
+ errors = []
+ if before != after:
+ try:
+ world_set.replace(self.okay)
+ except portage.exception.PortageException:
+ errors.append("%s could not be opened for writing" % \
+ self.world_file)
+ return errors
+ finally:
+ world_set.unlock()
class BinhostHandler(object):