The class SyncRepos will keep a list of (repo, returncode) tuples. If sync is unsuccessful emerge will use this list to return the first failed repository return code. --- pym/_emerge/actions.py | 9 ++++++--- pym/portage/emaint/modules/sync/sync.py | 11 ++++++----- 2 files changed, 12 insertions(+), 8 deletions(-)
diff --git a/pym/_emerge/actions.py b/pym/_emerge/actions.py index 6704afc..89cf501 100644 --- a/pym/_emerge/actions.py +++ b/pym/_emerge/actions.py @@ -2000,10 +2000,13 @@ def action_sync(emerge_config, trees=DeprecationWarning, syncer = SyncRepos(emerge_config) - retvals = syncer.auto_sync(options={'return-messages': False}) + success, msgs = syncer.auto_sync(options={'return-messages': False}) - if retvals: - return retvals[0][1] + if not success: + retvals = syncer.retvals + for repo, retval in retvals: + if retval != os.EX_OK: + return retval return os.EX_OK diff --git a/pym/portage/emaint/modules/sync/sync.py b/pym/portage/emaint/modules/sync/sync.py index d867699..de150a1 100644 --- a/pym/portage/emaint/modules/sync/sync.py +++ b/pym/portage/emaint/modules/sync/sync.py @@ -84,6 +84,7 @@ class SyncRepos(object): self.xterm_titles = "notitles" not in \ self.emerge_config.target_config.settings.features emergelog(self.xterm_titles, " === sync") + self.retvals = [] def auto_sync(self, **kwargs): @@ -230,14 +231,14 @@ class SyncRepos(object): sync_scheduler.start() sync_scheduler.wait() - retvals = sync_scheduler.retvals + self.retvals = sync_scheduler.retvals msgs.extend(sync_scheduler.msgs) returncode = True - if retvals: - msgs.extend(self.rmessage(retvals, 'sync')) - for repo, returncode in retvals: - if returncode != os.EX_OK: + if self.retvals: + msgs.extend(self.rmessage(self.retvals, 'sync')) + for repo, retval in self.retvals: + if retval != os.EX_OK: returncode = False break else: -- 2.10.2