commit: 703691cd611e29c810de08e6452f14454376125a Author: Brian Dolbec <dolsen <AT> gentoo <DOT> org> AuthorDate: Sat Sep 27 05:05:01 2014 +0000 Commit: Brian Dolbec <brian.dolbec <AT> gmail <DOT> com> CommitDate: Mon Sep 29 17:20:22 2014 +0000 URL: http://sources.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=703691cd
Sync: Implement native postsync.d hook code As per bug 522032, pass the repo.name and repo.sync_uri to the hooks. With this information, the hooks can be taylored to operate for only certain repos, or only when all repos have been synced. --- pym/portage/sync/controller.py | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/pym/portage/sync/controller.py b/pym/portage/sync/controller.py index 21b57f4..a88d4c5 100644 --- a/pym/portage/sync/controller.py +++ b/pym/portage/sync/controller.py @@ -87,6 +87,19 @@ class SyncManager(object): self.module_controller = portage.sync.module_controller self.module_names = self.module_controller.module_names + postsync_dir = os.path.join(self.settings["PORTAGE_CONFIGROOT"], + portage.USER_CONFIG_PATH, "postsync.d") + hooks = [] + for root, dirs, names in os.walk(postsync_dir, topdown=True): + #print("root:", root, "dirs:", dirs, "names:", names) + for name in names: + filepath = os.path.join(root, name) + if os.access(filepath, os.X_OK): + hooks.append((filepath, name)) + else: + writemsg_level(" %s postsync.d hook: '%s' is not executable\n" + % (warn("*"), name,), level=logging.WARN, noiselevel=2) + self.hooks = hooks def get_module_descriptions(self, mod): @@ -129,7 +142,7 @@ class SyncManager(object): taskmaster = TaskHandler(callback=self.do_callback) taskmaster.run_tasks(tasks, func, status, options=task_opts) - self.perform_post_sync_hook(repo.sync_uri) + self.perform_post_sync_hook(repo.name, repo.sync_uri) return self.exitcode, None @@ -142,17 +155,18 @@ class SyncManager(object): return - def perform_post_sync_hook(self, dosyncuri): - postsync = os.path.join(self.settings["PORTAGE_CONFIGROOT"], - portage.USER_CONFIG_PATH, "bin", "post_sync") - if os.access(postsync, os.X_OK): - retval = portage.process.spawn([postsync, dosyncuri], - env=self.settings.environ()) + def perform_post_sync_hook(self, reponame, dosyncuri='None'): + succeeded = os.EX_OK + for filepath, hook in self.hooks: + writemsg_level("Spawning post_sync hook: %s\n" % (hook,), + level=logging.ERROR, noiselevel=4) + retval = portage.process.spawn([filepath, + reponame, dosyncuri], env=self.settings.environ()) if retval != os.EX_OK: - writemsg_level(" %s spawn failed of %s\n" % (bad("*"), - postsync,), level=logging.ERROR, noiselevel=-1) - return retval - return os.EX_OK + writemsg_level(" %s Spawn failed for: %s, %s\n" % (bad("*"), + hook, filepath), level=logging.ERROR, noiselevel=-1) + succeeded = retval + return succeeded def pre_sync(self, repo):