1 |
commit: c6c71eefb9532af0d4505de70e58f45ad8e8fe0a |
2 |
Author: Zac Medico <zmedico <AT> gentoo <DOT> org> |
3 |
AuthorDate: Fri Dec 2 06:14:13 2011 +0000 |
4 |
Commit: Zac Medico <zmedico <AT> gentoo <DOT> org> |
5 |
CommitDate: Fri Dec 2 06:14:13 2011 +0000 |
6 |
URL: http://git.overlays.gentoo.org/gitweb/?p=proj/portage.git;a=commit;h=c6c71eef |
7 |
|
8 |
Handle OSError from os.read and loop if needed. |
9 |
|
10 |
Looping fixes EbuildMetadataPhase failures for ebuilds that produce |
11 |
more than 4096 bytes of metadata, broken since commit |
12 |
b432a1b3051d91546649e8f3190675767461d8e8. |
13 |
|
14 |
--- |
15 |
pym/_emerge/AsynchronousLock.py | 4 ++-- |
16 |
pym/_emerge/EbuildMetadataPhase.py | 23 +++++++++++++---------- |
17 |
pym/_emerge/PipeReader.py | 25 ++++++++++++++----------- |
18 |
3 files changed, 29 insertions(+), 23 deletions(-) |
19 |
|
20 |
diff --git a/pym/_emerge/AsynchronousLock.py b/pym/_emerge/AsynchronousLock.py |
21 |
index 39e36c8..9d0545b 100644 |
22 |
--- a/pym/_emerge/AsynchronousLock.py |
23 |
+++ b/pym/_emerge/AsynchronousLock.py |
24 |
@@ -138,7 +138,7 @@ class _LockThread(AbstractPollTask): |
25 |
if event & PollConstants.POLLIN: |
26 |
try: |
27 |
buf = os.read(self._files['pipe_read'], self._bufsize) |
28 |
- except IOError as e: |
29 |
+ except OSError as e: |
30 |
if e.errno not in (errno.EAGAIN,): |
31 |
raise |
32 |
if buf: |
33 |
@@ -274,7 +274,7 @@ class _LockProcess(AbstractPollTask): |
34 |
if event & PollConstants.POLLIN: |
35 |
try: |
36 |
buf = os.read(self._files['pipe_in'], self._bufsize) |
37 |
- except IOError as e: |
38 |
+ except OSError as e: |
39 |
if e.errno not in (errno.EAGAIN,): |
40 |
raise |
41 |
if buf: |
42 |
|
43 |
diff --git a/pym/_emerge/EbuildMetadataPhase.py b/pym/_emerge/EbuildMetadataPhase.py |
44 |
index e068e8f..d4f5bc0 100644 |
45 |
--- a/pym/_emerge/EbuildMetadataPhase.py |
46 |
+++ b/pym/_emerge/EbuildMetadataPhase.py |
47 |
@@ -112,16 +112,19 @@ class EbuildMetadataPhase(SubProcess): |
48 |
def _output_handler(self, fd, event): |
49 |
|
50 |
if event & PollConstants.POLLIN: |
51 |
- try: |
52 |
- self._raw_metadata.append( |
53 |
- os.read(self._files.ebuild, self._bufsize)) |
54 |
- except IOError as e: |
55 |
- if e.errno not in (errno.EAGAIN,): |
56 |
- raise |
57 |
- else: |
58 |
- if not self._raw_metadata[-1]: |
59 |
- self._unregister() |
60 |
- self.wait() |
61 |
+ while True: |
62 |
+ try: |
63 |
+ self._raw_metadata.append( |
64 |
+ os.read(self._files.ebuild, self._bufsize)) |
65 |
+ except OSError as e: |
66 |
+ if e.errno not in (errno.EAGAIN,): |
67 |
+ raise |
68 |
+ break |
69 |
+ else: |
70 |
+ if not self._raw_metadata[-1]: |
71 |
+ self._unregister() |
72 |
+ self.wait() |
73 |
+ break |
74 |
|
75 |
self._unregister_if_appropriate(event) |
76 |
|
77 |
|
78 |
diff --git a/pym/_emerge/PipeReader.py b/pym/_emerge/PipeReader.py |
79 |
index 67144c3..af8cfdd 100644 |
80 |
--- a/pym/_emerge/PipeReader.py |
81 |
+++ b/pym/_emerge/PipeReader.py |
82 |
@@ -59,18 +59,21 @@ class PipeReader(AbstractPollTask): |
83 |
|
84 |
if event & PollConstants.POLLIN: |
85 |
|
86 |
- data = None |
87 |
- try: |
88 |
- data = os.read(fd, self._bufsize) |
89 |
- except IOError as e: |
90 |
- if e.errno not in (errno.EAGAIN,): |
91 |
- raise |
92 |
- else: |
93 |
- if data: |
94 |
- self._read_data.append(data) |
95 |
+ while True: |
96 |
+ data = None |
97 |
+ try: |
98 |
+ data = os.read(fd, self._bufsize) |
99 |
+ except OSError as e: |
100 |
+ if e.errno not in (errno.EAGAIN,): |
101 |
+ raise |
102 |
+ break |
103 |
else: |
104 |
- self._unregister() |
105 |
- self.wait() |
106 |
+ if data: |
107 |
+ self._read_data.append(data) |
108 |
+ else: |
109 |
+ self._unregister() |
110 |
+ self.wait() |
111 |
+ break |
112 |
|
113 |
self._unregister_if_appropriate(event) |