equal
deleted
inserted
replaced
5 # This software may be used and distributed according to the terms of the |
5 # This software may be used and distributed according to the terms of the |
6 # GNU General Public License version 2 or any later version. |
6 # GNU General Public License version 2 or any later version. |
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 |
13 from .i18n import _ |
14 from .i18n import _ |
14 from . import encoding |
15 from . import encoding |
57 weeks += 1 |
58 weeks += 1 |
58 years = weeks // 52 |
59 years = weeks // 52 |
59 weeks -= years * 52 |
60 weeks -= years * 52 |
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) |
|
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 |
62 |
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 |
66 self._refreshlock = threading.Lock() |
85 self._refreshlock = threading.Lock() |
177 else: |
196 else: |
178 self._writeerr('\n') |
197 self._writeerr('\n') |
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(msg) |
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() |
189 return min(int(self.ui.config('progress', 'width', default=tw)), tw) |
208 return min(int(self.ui.config('progress', 'width', default=tw)), tw) |
190 |
209 |