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

Reply via email to