173 |
173 |
174 def __getattr__(self, attr): |
174 def __getattr__(self, attr): |
175 return getattr(self._opener, attr) |
175 return getattr(self._opener, attr) |
176 |
176 |
177 |
177 |
178 def _delayopener(opener, target, buf): |
178 class _delayopener: |
179 """build an opener that stores chunks in 'buf' instead of 'target'""" |
179 """build an opener that stores chunks in 'buf' instead of 'target'""" |
180 |
180 |
181 def _delay(name, mode=b'r', checkambig=False, **kwargs): |
181 def __init__(self, opener, target, buf): |
182 if name != target: |
182 self._opener = opener |
183 return opener(name, mode, **kwargs) |
183 self._target = target |
|
184 self._buf = buf |
|
185 |
|
186 def __call__(self, name, mode=b'r', checkambig=False, **kwargs): |
|
187 if name != self._target: |
|
188 return self._opener(name, mode, **kwargs) |
184 assert not kwargs |
189 assert not kwargs |
185 return appender(opener, name, mode, buf) |
190 return appender(self._opener, name, mode, self._buf) |
186 |
191 |
187 return _delay |
192 def __getattr__(self, attr): |
|
193 return getattr(self._opener, attr) |
188 |
194 |
189 |
195 |
190 @attr.s |
196 @attr.s |
191 class _changelogrevision: |
197 class _changelogrevision: |
192 # Extensions might modify _defaultextra, so let the constructor below pass |
198 # Extensions might modify _defaultextra, so let the constructor below pass |