Show More
@@ -7,6 +7,7 b'' | |||||
7 |
|
7 | |||
8 | from __future__ import absolute_import |
|
8 | from __future__ import absolute_import | |
9 |
|
9 | |||
|
10 | import errno | |||
10 | import threading |
|
11 | import threading | |
11 | import time |
|
12 | import time | |
12 |
|
13 | |||
@@ -60,6 +61,24 b' def fmtremaining(seconds):' | |||||
60 | # i18n: format X years and YY weeks as "XyYYw" |
|
61 | # i18n: format X years and YY weeks as "XyYYw" | |
61 | return _("%dy%02dw") % (years, weeks) |
|
62 | return _("%dy%02dw") % (years, weeks) | |
62 |
|
63 | |||
|
64 | # file_write() and file_flush() of Python 2 do not restart on EINTR if | |||
|
65 | # the file is attached to a "slow" device (e.g. a terminal) and raise | |||
|
66 | # IOError. We cannot know how many bytes would be written by file_write(), | |||
|
67 | # but a progress text is known to be short enough to be written by a | |||
|
68 | # single write() syscall, so we can just retry file_write() with the whole | |||
|
69 | # text. (issue5532) | |||
|
70 | # | |||
|
71 | # This should be a short-term workaround. We'll need to fix every occurrence | |||
|
72 | # of write() to a terminal or pipe. | |||
|
73 | def _eintrretry(func, *args): | |||
|
74 | while True: | |||
|
75 | try: | |||
|
76 | return func(*args) | |||
|
77 | except IOError as err: | |||
|
78 | if err.errno == errno.EINTR: | |||
|
79 | continue | |||
|
80 | raise | |||
|
81 | ||||
63 | class progbar(object): |
|
82 | class progbar(object): | |
64 | def __init__(self, ui): |
|
83 | def __init__(self, ui): | |
65 | self.ui = ui |
|
84 | self.ui = ui | |
@@ -179,10 +198,10 b' class progbar(object):' | |||||
179 | self._flusherr() |
|
198 | self._flusherr() | |
180 |
|
199 | |||
181 | def _flusherr(self): |
|
200 | def _flusherr(self): | |
182 |
self.ui.ferr.flush |
|
201 | _eintrretry(self.ui.ferr.flush) | |
183 |
|
202 | |||
184 | def _writeerr(self, msg): |
|
203 | def _writeerr(self, msg): | |
185 |
self.ui.ferr.write |
|
204 | _eintrretry(self.ui.ferr.write, msg) | |
186 |
|
205 | |||
187 | def width(self): |
|
206 | def width(self): | |
188 | tw = self.ui.termwidth() |
|
207 | tw = self.ui.termwidth() |
General Comments 0
You need to be logged in to leave comments.
Login now