'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',
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,
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,
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()
import sys
import time
import unittest
+from unittest import TestResult
from portage import os
from portage import _encodings
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):
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"