From 344e0e18e4406f20ad71c6842730a12b9b301ed6 Mon Sep 17 00:00:00 2001 From: Fabian Groffen Date: Mon, 7 Dec 2009 16:35:33 +0000 Subject: [PATCH] Merged from trunk -r14950:14963 | 14951 | Fix possibly unsafe modification of list during iteration | | zmedico | inside update_config_files(). | | 14953 | Inside dblink._merge(), make sure PORTAGE_BUILDDIR still | | zmedico | exists before trying to call ebuild success/die hooks, since | | | it might have already been removed by fail-clean (and the | | | hooks would have already been called). | | 14955 | Make more code conditional on existence of PORTAGE_BUILDDIR | | zmedico | inside dblink._merge(). | | 14957 | Remove unnecessary elog_process() phasefilter arguements. | | zmedico | | | 14958 | Remove unused filter_phases, filter_mergephases, and | | zmedico | filter_unmergephases functions. | | 14963 | Copy the unittest._TextTestResult class from python-2.6 | | zmedico | since it's been removed in python-2.7. | svn path=/main/branches/prefix/; revision=14964 --- pym/portage/dbapi/vartree.py | 58 ++++++++++++++++-------------- pym/portage/elog/filtering.py | 20 ----------- pym/portage/tests/__init__.py | 66 +++++++++++++++++++++++++++++++---- pym/portage/update.py | 2 +- 4 files changed, 92 insertions(+), 54 deletions(-) diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index c0c07c1c6..15ce50490 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -15,7 +15,6 @@ portage.proxy.lazyimport.lazyimport(globals(), 'portage.dep:dep_getkey,isjustname,match_from_list,' + \ 'use_reduce,paren_reduce,_slot_re', 'portage.elog:elog_process', - 'portage.elog.filtering:filter_mergephases,filter_unmergephases', 'portage.locks:lockdir,unlockdir', 'portage.output:bold,colorize', 'portage.update:fixdbentries', @@ -3296,7 +3295,7 @@ class dblink(object): self._eerror(ebuild_phase, msg_lines) # process logs created during pre/postrm - elog_process(self.mycpv, self.settings, phasefilter=filter_unmergephases) + elog_process(self.mycpv, self.settings) if retval == os.EX_OK: if scheduler is None: doebuild(myebuildpath, "cleanrm", self.myroot, @@ -5387,8 +5386,7 @@ class dblink(object): os.chmod(var_new, dir_perms) os.chmod(base_path_tmp, dir_perms) # This serves so pre-load the modules. - elog_process(self.mycpv, self.settings, - phasefilter=filter_mergephases) + elog_process(self.mycpv, self.settings) return self._merge(mergeroot, inforoot, myroot, myebuild=myebuild, cleanup=cleanup, @@ -5405,34 +5403,40 @@ class dblink(object): retval = self.treewalk(mergeroot, myroot, inforoot, myebuild, cleanup=cleanup, mydbapi=mydbapi, prev_mtimes=prev_mtimes) - if retval == os.EX_OK: - phase = 'success_hooks' - else: - phase = 'die_hooks' + # If PORTAGE_BUILDDIR doesn't exist, then it probably means + # fail-clean is enabled, and the success/die hooks have + # already been called by _emerge.EbuildPhase (via + # self._scheduler.dblinkEbuildPhase) prior to cleaning. + if os.path.isdir(self.settings['PORTAGE_BUILDDIR']): - if self._scheduler is None: - portage._spawn_misc_sh(self.settings, [phase], - phase=phase) - else: - self._scheduler.dblinkEbuildPhase( - self, mydbapi, myebuild, phase) - - # Process ebuild logfiles - elog_process(self.mycpv, self.settings, phasefilter=filter_mergephases) - if 'noclean' not in self.settings.features and \ - (retval == os.EX_OK or \ - ('fail-clean' in self.settings.features and \ - os.path.isdir(self.settings['PORTAGE_BUILDDIR']))): - if myebuild is None: - myebuild = os.path.join(inforoot, self.pkg + ".ebuild") + if retval == os.EX_OK: + phase = 'success_hooks' + else: + phase = 'die_hooks' if self._scheduler is None: - doebuild(myebuild, "clean", myroot, - self.settings, tree=self.treetype, - mydbapi=mydbapi, vartree=self.vartree) + portage._spawn_misc_sh(self.settings, [phase], + phase=phase) else: self._scheduler.dblinkEbuildPhase( - self, mydbapi, myebuild, "clean") + self, mydbapi, myebuild, phase) + + elog_process(self.mycpv, self.settings) + + if 'noclean' not in self.settings.features and \ + (retval == os.EX_OK or \ + 'fail-clean' in self.settings.features): + if myebuild is None: + myebuild = os.path.join(inforoot, self.pkg + ".ebuild") + + if self._scheduler is None: + doebuild(myebuild, "clean", myroot, + self.settings, tree=self.treetype, + mydbapi=mydbapi, vartree=self.vartree) + else: + self._scheduler.dblinkEbuildPhase( + self, mydbapi, myebuild, "clean") + finally: self.vartree.dbapi.linkmap._clear_cache() self.unlockdb() diff --git a/pym/portage/elog/filtering.py b/pym/portage/elog/filtering.py index d4d405347..d834edd3a 100644 --- a/pym/portage/elog/filtering.py +++ b/pym/portage/elog/filtering.py @@ -16,23 +16,3 @@ def filter_loglevels(logentries, loglevels): rValue[phase] = [] rValue[phase].append((msgtype, msgcontent)) return rValue - -def filter_phases(logentries, phases): - rValue1 = {} - rValue2 = {} - phases = [x.lower() for x in phases] - for phase in logentries: - if phase in phases: - rValue1[phase] = logentries[phase] - else: - rValue2[phase] = logentries[phase] - return (rValue1, rValue2) - -def filter_mergephases(logentries): - myphases = EBUILD_PHASES[:] - myphases.remove("prerm") - myphases.remove("postrm") - return filter_phases(logentries, myphases) - -def filter_unmergephases(logentries): - return filter_phases(logentries, ["prerm", "postrm", "other"]) diff --git a/pym/portage/tests/__init__.py b/pym/portage/tests/__init__.py index 9a81d22ff..0382a2fc1 100644 --- a/pym/portage/tests/__init__.py +++ b/pym/portage/tests/__init__.py @@ -6,6 +6,7 @@ import sys import time import unittest +from unittest import TestResult from portage import os from portage import _encodings @@ -69,17 +70,26 @@ def getTests(path, base_path): result.append(unittest.TestLoader().loadTestsFromModule(mod)) return result -class TextTestResult(unittest._TextTestResult): +class TextTestResult(TestResult): """ - We need a subclass of unittest._TextTestResult to handle tests with TODO + We need a subclass of unittest.TestResult to handle tests with TODO + Most of this class is copied from the unittest._TextTestResult that's + included with python-2.6 (but not included with python-2.7). This just adds an addTodo method that can be used to add tests that are marked TODO; these can be displayed later by the test runner. """ - + + separator1 = '=' * 70 + separator2 = '-' * 70 + def __init__(self, stream, descriptions, verbosity): - unittest._TextTestResult.__init__( self, stream, descriptions, verbosity ) + unittest.TestResult.__init__(self) + self.stream = stream + self.showAll = verbosity > 1 + self.dots = verbosity == 1 + self.descriptions = descriptions self.todoed = [] def addTodo(self, test, info): @@ -88,14 +98,58 @@ class TextTestResult(unittest._TextTestResult): self.stream.writeln("TODO") elif self.dots: self.stream.write(".") - + def printErrors(self): if self.dots or self.showAll: self.stream.writeln() self.printErrorList('ERROR', self.errors) self.printErrorList('FAIL', self.failures) self.printErrorList('TODO', self.todoed) - + + def getDescription(self, test): + if self.descriptions: + return test.shortDescription() or str(test) + else: + return str(test) + + def startTest(self, test): + TestResult.startTest(self, test) + if self.showAll: + self.stream.write(self.getDescription(test)) + self.stream.write(" ... ") + self.stream.flush() + + def addSuccess(self, test): + TestResult.addSuccess(self, test) + if self.showAll: + self.stream.writeln("ok") + elif self.dots: + self.stream.write('.') + self.stream.flush() + + def addError(self, test, err): + TestResult.addError(self, test, err) + if self.showAll: + self.stream.writeln("ERROR") + elif self.dots: + self.stream.write('E') + self.stream.flush() + + def addFailure(self, test, err): + TestResult.addFailure(self, test, err) + if self.showAll: + self.stream.writeln("FAIL") + elif self.dots: + self.stream.write('F') + self.stream.flush() + + def printErrorList(self, flavour, errors): + for test, err in errors: + self.stream.writeln(self.separator1) + self.stream.writeln("%s: %s" % (flavour,self.getDescription(test))) + self.stream.writeln(self.separator2) + self.stream.writeln("%s" % err) + class TestCase(unittest.TestCase): """ We need a way to mark a unit test as "ok to fail" diff --git a/pym/portage/update.py b/pym/portage/update.py index af0fd2f42..3df7b08f3 100644 --- a/pym/portage/update.py +++ b/pym/portage/update.py @@ -206,7 +206,7 @@ def update_config_files(config_root, protect, protect_mask, update_iter): encoding=_encodings['fs'], errors='strict') except UnicodeDecodeError: continue - for y_enc in dirs: + for y_enc in list(dirs): try: y = _unicode_decode(y_enc, encoding=_encodings['fs'], errors='strict') -- 2.26.2