Merged from trunk -r14950:14963
authorFabian Groffen <grobian@gentoo.org>
Mon, 7 Dec 2009 16:35:33 +0000 (16:35 -0000)
committerFabian Groffen <grobian@gentoo.org>
Mon, 7 Dec 2009 16:35:33 +0000 (16:35 -0000)
   | 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
pym/portage/elog/filtering.py
pym/portage/tests/__init__.py
pym/portage/update.py

index c0c07c1c6b119e5f1ffdf5a1a826f5a60f1787ba..15ce50490e4d6acdd053418f8fb5296246964f72 100644 (file)
@@ -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()
index d4d405347d9eaa2c5db72729a69ffdab6aaff44f..d834edd3aaa740001e5ea61b39ce3ed74d1404bc 100644 (file)
@@ -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"])
index 9a81d22ff3006fb71b342ddaff7ae8f39a724109..0382a2fc1e772155b1901549b3a76b7ec01020cf 100644 (file)
@@ -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"
index af0fd2f42cee4bb5b59a50b7b4d2098a7b2c8fd0..3df7b08f3ac3af8eb0869376f676e2afe13dce29 100644 (file)
@@ -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')