summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorZac Medico <zmedico@gentoo.org>2011-12-01 22:14:13 -0800
committerZac Medico <zmedico@gentoo.org>2011-12-01 22:14:13 -0800
commitc6c71eefb9532af0d4505de70e58f45ad8e8fe0a (patch)
treef157124695ebd1a818c5ce3ed07fc343ff827a35
parentcaea9ee807eba03118564030a166f9856d4439de (diff)
downloadportage-c6c71eefb9532af0d4505de70e58f45ad8e8fe0a.tar.gz
portage-c6c71eefb9532af0d4505de70e58f45ad8e8fe0a.tar.bz2
portage-c6c71eefb9532af0d4505de70e58f45ad8e8fe0a.zip
Handle OSError from os.read and loop if needed.
Looping fixes EbuildMetadataPhase failures for ebuilds that produce more than 4096 bytes of metadata, broken since commit b432a1b3051d91546649e8f3190675767461d8e8.
-rw-r--r--pym/_emerge/AsynchronousLock.py4
-rw-r--r--pym/_emerge/EbuildMetadataPhase.py23
-rw-r--r--pym/_emerge/PipeReader.py25
3 files changed, 29 insertions, 23 deletions
diff --git a/pym/_emerge/AsynchronousLock.py b/pym/_emerge/AsynchronousLock.py
index 39e36c880..9d0545beb 100644
--- a/pym/_emerge/AsynchronousLock.py
+++ b/pym/_emerge/AsynchronousLock.py
@@ -138,7 +138,7 @@ class _LockThread(AbstractPollTask):
if event & PollConstants.POLLIN:
try:
buf = os.read(self._files['pipe_read'], self._bufsize)
- except IOError as e:
+ except OSError as e:
if e.errno not in (errno.EAGAIN,):
raise
if buf:
@@ -274,7 +274,7 @@ class _LockProcess(AbstractPollTask):
if event & PollConstants.POLLIN:
try:
buf = os.read(self._files['pipe_in'], self._bufsize)
- except IOError as e:
+ except OSError as e:
if e.errno not in (errno.EAGAIN,):
raise
if buf:
diff --git a/pym/_emerge/EbuildMetadataPhase.py b/pym/_emerge/EbuildMetadataPhase.py
index e068e8f24..d4f5bc009 100644
--- a/pym/_emerge/EbuildMetadataPhase.py
+++ b/pym/_emerge/EbuildMetadataPhase.py
@@ -112,16 +112,19 @@ class EbuildMetadataPhase(SubProcess):
def _output_handler(self, fd, event):
if event & PollConstants.POLLIN:
- try:
- self._raw_metadata.append(
- os.read(self._files.ebuild, self._bufsize))
- except IOError as e:
- if e.errno not in (errno.EAGAIN,):
- raise
- else:
- if not self._raw_metadata[-1]:
- self._unregister()
- self.wait()
+ while True:
+ try:
+ self._raw_metadata.append(
+ os.read(self._files.ebuild, self._bufsize))
+ except OSError as e:
+ if e.errno not in (errno.EAGAIN,):
+ raise
+ break
+ else:
+ if not self._raw_metadata[-1]:
+ self._unregister()
+ self.wait()
+ break
self._unregister_if_appropriate(event)
diff --git a/pym/_emerge/PipeReader.py b/pym/_emerge/PipeReader.py
index 67144c393..af8cfdd4e 100644
--- a/pym/_emerge/PipeReader.py
+++ b/pym/_emerge/PipeReader.py
@@ -59,18 +59,21 @@ class PipeReader(AbstractPollTask):
if event & PollConstants.POLLIN:
- data = None
- try:
- data = os.read(fd, self._bufsize)
- except IOError as e:
- if e.errno not in (errno.EAGAIN,):
- raise
- else:
- if data:
- self._read_data.append(data)
+ while True:
+ data = None
+ try:
+ data = os.read(fd, self._bufsize)
+ except OSError as e:
+ if e.errno not in (errno.EAGAIN,):
+ raise
+ break
else:
- self._unregister()
- self.wait()
+ if data:
+ self._read_data.append(data)
+ else:
+ self._unregister()
+ self.wait()
+ break
self._unregister_if_appropriate(event)