From d0733a19ea2b08984589c5881b0a99c2ca26e4d6 Mon Sep 17 00:00:00 2001 From: Zac Medico Date: Sun, 6 Dec 2009 10:22:54 +0000 Subject: Bug #295715 - Implement a register_success_hook function to complement register_die_hook, and also add code to ensure the die hooks are called even when the failure is on the python side (like for file collisions). svn path=/main/trunk/; revision=14936 --- pym/_emerge/EbuildBuild.py | 28 ++++++++++++++++++++-------- pym/_emerge/EbuildPhase.py | 33 ++++++++++++++++++++++----------- pym/_emerge/Scheduler.py | 12 +++++++++--- pym/portage/__init__.py | 7 +++++++ pym/portage/dbapi/vartree.py | 12 ++++++++++++ 5 files changed, 70 insertions(+), 22 deletions(-) (limited to 'pym') diff --git a/pym/_emerge/EbuildBuild.py b/pym/_emerge/EbuildBuild.py index 930b5c6df..543fb1b03 100644 --- a/pym/_emerge/EbuildBuild.py +++ b/pym/_emerge/EbuildBuild.py @@ -10,6 +10,7 @@ from _emerge.CompositeTask import CompositeTask from _emerge.EbuildMerge import EbuildMerge from _emerge.EbuildFetchonly import EbuildFetchonly from _emerge.EbuildBuildDir import EbuildBuildDir +from _emerge.MiscFunctionsProcess import MiscFunctionsProcess from portage.util import writemsg import portage from portage import os @@ -215,14 +216,13 @@ class EbuildBuild(CompositeTask): return if self.opts.buildpkgonly: - # Need to call "clean" phase for buildpkgonly mode - portage.elog.elog_process(self.pkg.cpv, self.settings) - phase = "clean" - clean_phase = EbuildPhase(background=self.background, - pkg=self.pkg, phase=phase, - scheduler=self.scheduler, settings=self.settings, - tree=self._tree) - self._start_task(clean_phase, self._clean_exit) + phase = 'success_hooks' + success_hooks = MiscFunctionsProcess( + background=self.background, + commands=[phase], phase=phase, pkg=self.pkg, + scheduler=self.scheduler, settings=self.settings) + self._start_task(success_hooks, + self._buildpkgonly_success_hook_exit) return # Continue holding the builddir lock until @@ -231,6 +231,18 @@ class EbuildBuild(CompositeTask): self.returncode = packager.returncode self.wait() + def _buildpkgonly_success_hook_exit(self, success_hooks): + self._default_exit(success_hooks) + self.returncode = None + # Need to call "clean" phase for buildpkgonly mode + portage.elog.elog_process(self.pkg.cpv, self.settings) + phase = 'clean' + clean_phase = EbuildPhase(background=self.background, + pkg=self.pkg, phase=phase, + scheduler=self.scheduler, settings=self.settings, + tree=self._tree) + self._start_task(clean_phase, self._clean_exit) + def _clean_exit(self, clean_phase): if self._final_exit(clean_phase) != os.EX_OK or \ self.opts.buildpkgonly: diff --git a/pym/_emerge/EbuildPhase.py b/pym/_emerge/EbuildPhase.py index 01661b2cc..89bdb078f 100644 --- a/pym/_emerge/EbuildPhase.py +++ b/pym/_emerge/EbuildPhase.py @@ -52,12 +52,7 @@ class EbuildPhase(CompositeTask): log_file.close() if self._default_exit(ebuild_process) != os.EX_OK: - if self.phase != 'clean' and \ - 'noclean' not in self.settings.features and \ - 'fail-clean' in self.settings.features: - self._fail_clean() - return - self.wait() + self._die_hooks() return settings = self.settings @@ -92,15 +87,31 @@ class EbuildPhase(CompositeTask): if self._final_exit(post_phase) != os.EX_OK: writemsg("!!! post %s failed; exiting.\n" % self.phase, noiselevel=-1) - if self.phase != 'clean' and \ - 'noclean' not in self.settings.features and \ - 'fail-clean' in self.settings.features: - self._fail_clean() - return + self._die_hooks() + return self._current_task = None self.wait() return + def _die_hooks(self): + self.returncode = None + phase = 'die_hooks' + die_hooks = MiscFunctionsProcess(background=self.background, + commands=[phase], phase=phase, pkg=self.pkg, + scheduler=self.scheduler, settings=self.settings) + self._start_task(die_hooks, self._die_hooks_exit) + + def _die_hooks_exit(self, die_hooks): + if self.phase != 'clean' and \ + 'noclean' not in self.settings.features and \ + 'fail-clean' in self.settings.features: + self._default_exit(die_hooks) + self._fail_clean() + return + self._final_exit(die_hooks) + self.returncode = 1 + self.wait() + def _fail_clean(self): self.returncode = None portage.elog.elog_process(self.pkg.cpv, self.settings) diff --git a/pym/_emerge/Scheduler.py b/pym/_emerge/Scheduler.py index 9a5e931ee..c760c395e 100644 --- a/pym/_emerge/Scheduler.py +++ b/pym/_emerge/Scheduler.py @@ -40,6 +40,7 @@ from _emerge._find_deep_system_runtime_deps import _find_deep_system_runtime_dep from _emerge._flush_elog_mod_echo import _flush_elog_mod_echo from _emerge.JobStatusDisplay import JobStatusDisplay from _emerge.MergeListItem import MergeListItem +from _emerge.MiscFunctionsProcess import MiscFunctionsProcess from _emerge.Package import Package from _emerge.PackageMerge import PackageMerge from _emerge.PollScheduler import PollScheduler @@ -543,9 +544,14 @@ class Scheduler(PollScheduler): background = self._background log_path = settings.get("PORTAGE_LOG_FILE") - ebuild_phase = EbuildPhase(background=background, - pkg=pkg, phase=phase, scheduler=scheduler, - settings=settings, tree=pkg_dblink.treetype) + if phase in ('die_hooks', 'success_hooks'): + ebuild_phase = MiscFunctionsProcess(background=background, + commands=[phase], phase=phase, pkg=pkg, + scheduler=scheduler, settings=settings) + else: + ebuild_phase = EbuildPhase(background=background, + pkg=pkg, phase=phase, scheduler=scheduler, + settings=settings, tree=pkg_dblink.treetype) ebuild_phase.start() ebuild_phase.wait() diff --git a/pym/portage/__init__.py b/pym/portage/__init__.py index 4f32158b0..18cb707e0 100644 --- a/pym/portage/__init__.py +++ b/pym/portage/__init__.py @@ -6351,6 +6351,13 @@ def prepare_build_dirs(myroot, mysettings, cleanup): writemsg(_("File Not Found: '%s'\n") % str(e), noiselevel=-1) return 1 + # Reset state for things like noauto and keepwork in FEATURES. + for x in ('.die_hooks',): + try: + os.unlink(os.path.join(mysettings['PORTAGE_BUILDDIR'], x)) + except OSError: + pass + _prepare_workdir(mysettings) if mysettings.get('EBUILD_PHASE') != 'fetch': # Avoid spurious permissions adjustments when fetching with diff --git a/pym/portage/dbapi/vartree.py b/pym/portage/dbapi/vartree.py index 27f2241c7..3244fa4ee 100644 --- a/pym/portage/dbapi/vartree.py +++ b/pym/portage/dbapi/vartree.py @@ -4403,6 +4403,18 @@ 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 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 \ -- cgit v1.2.3-1-g7c22