Merge lp:~jelmer/brz/move-errors into lp:brz
- move-errors
- Merge into trunk
Proposed by
Jelmer Vernooij
Status: | Merged |
---|---|
Approved by: | Jelmer Vernooij |
Approved revision: | no longer in the source branch. |
Merge reported by: | The Breezy Bot |
Merged at revision: | not available |
Proposed branch: | lp:~jelmer/brz/move-errors |
Merge into: | lp:brz |
Diff against target: |
1674 lines (+371/-351) 26 files modified
breezy/builtins.py (+1/-1) breezy/bzr/groupcompress.py (+1/-1) breezy/bzr/knit.py (+4/-4) breezy/bzr/pack.py (+62/-13) breezy/bzr/pack_repo.py (+57/-10) breezy/bzr/remote.py (+38/-11) breezy/bzr/smart/medium.py (+11/-1) breezy/bzr/smart/protocol.py (+21/-6) breezy/bzr/tests/test_bzrdir.py (+1/-2) breezy/bzr/tests/test_knit.py (+15/-4) breezy/bzr/tests/test_pack.py (+72/-28) breezy/bzr/tests/test_remote.py (+16/-5) breezy/bzr/tests/test_smart.py (+1/-0) breezy/bzr/tests/test_smart_transport.py (+29/-3) breezy/config.py (+9/-1) breezy/controldir.py (+9/-1) breezy/errors.py (+0/-169) breezy/git/refs.py (+2/-1) breezy/plugins/weave_fmt/branch.py (+2/-1) breezy/plugins/weave_fmt/bzrdir.py (+3/-2) breezy/tests/per_controldir_colo/test_unsupported.py (+6/-5) breezy/tests/per_workingtree/test_merge_from_branch.py (+2/-1) breezy/tests/test_errors.py (+0/-77) breezy/tests/test_foreign.py (+1/-1) breezy/tests/test_merge.py (+2/-2) breezy/workingtree.py (+6/-1) |
To merge this branch: | bzr merge lp:~jelmer/brz/move-errors |
Related bugs: |
Reviewer | Review Type | Date Requested | Status |
---|---|---|---|
Jelmer Vernooij | Approve | ||
Review via email: mp+426962@code.launchpad.net |
Commit message
Move some more errors.
Description of the change
Move some more errors.
To post a comment you must log in.
Revision history for this message
Jelmer Vernooij (jelmer) : | # |
review:
Approve
Revision history for this message
The Breezy Bot (the-breezy-bot) wrote : | # |
Revision history for this message
The Breezy Bot (the-breezy-bot) wrote : | # |
Running landing tests failed
https:/
lp:~jelmer/brz/move-errors
updated
- 7610. By Jelmer Vernooij
-
Move some more errors.
Merged from https:/
/code.launchpad .net/~jelmer/ brz/move- errors/ +merge/ 426962
Preview Diff
[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1 | === modified file 'breezy/builtins.py' |
2 | --- breezy/builtins.py 2022-01-21 17:19:24 +0000 |
3 | +++ breezy/builtins.py 2022-07-16 17:54:02 +0000 |
4 | @@ -162,7 +162,7 @@ |
5 | # Perhaps it's a colocated branch? |
6 | return control_dir.open_branch( |
7 | location, possible_transports=possible_transports) |
8 | - except (errors.NotBranchError, errors.NoColocatedBranchSupport): |
9 | + except (errors.NotBranchError, controldir.NoColocatedBranchSupport): |
10 | this_url = _get_branch_location(control_dir) |
11 | return Branch.open( |
12 | urlutils.join( |
13 | |
14 | === modified file 'breezy/bzr/groupcompress.py' |
15 | --- breezy/bzr/groupcompress.py 2022-01-09 13:12:27 +0000 |
16 | +++ breezy/bzr/groupcompress.py 2022-07-16 17:54:02 +0000 |
17 | @@ -1513,7 +1513,7 @@ |
18 | remaining_keys.discard(content_factory.key) |
19 | yield content_factory |
20 | return |
21 | - except errors.RetryWithNewPacks as e: |
22 | + except pack_repo.RetryWithNewPacks as e: |
23 | self._access.reload_or_raise(e) |
24 | |
25 | def _find_from_fallback(self, missing): |
26 | |
27 | === modified file 'breezy/bzr/knit.py' |
28 | --- breezy/bzr/knit.py 2022-01-21 17:19:24 +0000 |
29 | +++ breezy/bzr/knit.py 2022-07-16 17:54:02 +0000 |
30 | @@ -1398,7 +1398,7 @@ |
31 | (record_details, index_memo, next) = position_map[key] |
32 | raw_record_map[key] = data, record_details, next |
33 | return raw_record_map |
34 | - except errors.RetryWithNewPacks as e: |
35 | + except pack_repo.RetryWithNewPacks as e: |
36 | self._access.reload_or_raise(e) |
37 | |
38 | @classmethod |
39 | @@ -1507,7 +1507,7 @@ |
40 | remaining_keys.discard(content_factory.key) |
41 | yield content_factory |
42 | return |
43 | - except errors.RetryWithNewPacks as e: |
44 | + except pack_repo.RetryWithNewPacks as e: |
45 | self._access.reload_or_raise(e) |
46 | |
47 | def _get_remaining_record_stream(self, keys, ordering, |
48 | @@ -1891,7 +1891,7 @@ |
49 | for line in line_iterator: |
50 | yield line, key |
51 | done = True |
52 | - except errors.RetryWithNewPacks as e: |
53 | + except pack_repo.RetryWithNewPacks as e: |
54 | self._access.reload_or_raise(e) |
55 | # If there are still keys we've not yet found, we look in the fallback |
56 | # vfs, and hope to find them there. Note that if the keys are found |
57 | @@ -3464,7 +3464,7 @@ |
58 | num_lines = len(text) # bad assumption |
59 | yield sub_key, text, num_lines |
60 | return |
61 | - except errors.RetryWithNewPacks as e: |
62 | + except pack_repo.RetryWithNewPacks as e: |
63 | self._vf._access.reload_or_raise(e) |
64 | # The cached build_details are no longer valid |
65 | self._all_build_details.clear() |
66 | |
67 | === modified file 'breezy/bzr/pack.py' |
68 | --- breezy/bzr/pack.py 2020-02-18 01:57:45 +0000 |
69 | +++ breezy/bzr/pack.py 2022-07-16 17:54:02 +0000 |
70 | @@ -32,6 +32,55 @@ |
71 | _whitespace_re = re.compile(b'[\t\n\x0b\x0c\r ]') |
72 | |
73 | |
74 | +class ContainerError(errors.BzrError): |
75 | + """Base class of container errors.""" |
76 | + |
77 | + |
78 | +class UnknownContainerFormatError(ContainerError): |
79 | + |
80 | + _fmt = "Unrecognised container format: %(container_format)r" |
81 | + |
82 | + def __init__(self, container_format): |
83 | + self.container_format = container_format |
84 | + |
85 | + |
86 | +class UnexpectedEndOfContainerError(ContainerError): |
87 | + |
88 | + _fmt = "Unexpected end of container stream" |
89 | + |
90 | + |
91 | +class UnknownRecordTypeError(ContainerError): |
92 | + |
93 | + _fmt = "Unknown record type: %(record_type)r" |
94 | + |
95 | + def __init__(self, record_type): |
96 | + self.record_type = record_type |
97 | + |
98 | + |
99 | +class InvalidRecordError(ContainerError): |
100 | + |
101 | + _fmt = "Invalid record: %(reason)s" |
102 | + |
103 | + def __init__(self, reason): |
104 | + self.reason = reason |
105 | + |
106 | + |
107 | +class ContainerHasExcessDataError(ContainerError): |
108 | + |
109 | + _fmt = "Container has data after end marker: %(excess)r" |
110 | + |
111 | + def __init__(self, excess): |
112 | + self.excess = excess |
113 | + |
114 | + |
115 | +class DuplicateRecordNameError(ContainerError): |
116 | + |
117 | + _fmt = "Container has multiple records with the same name: %(name)s" |
118 | + |
119 | + def __init__(self, name): |
120 | + self.name = name.decode("utf-8") |
121 | + |
122 | + |
123 | def _check_name(name): |
124 | """Do some basic checking of 'name'. |
125 | |
126 | @@ -42,7 +91,7 @@ |
127 | :seealso: _check_name_encoding |
128 | """ |
129 | if _whitespace_re.search(name) is not None: |
130 | - raise errors.InvalidRecordError("%r is not a valid name." % (name,)) |
131 | + raise InvalidRecordError("%r is not a valid name." % (name,)) |
132 | |
133 | |
134 | def _check_name_encoding(name): |
135 | @@ -56,7 +105,7 @@ |
136 | try: |
137 | name.decode('utf-8') |
138 | except UnicodeDecodeError as e: |
139 | - raise errors.InvalidRecordError(str(e)) |
140 | + raise InvalidRecordError(str(e)) |
141 | |
142 | |
143 | class ContainerSerialiser(object): |
144 | @@ -245,7 +294,7 @@ |
145 | def _read_line(self): |
146 | line = self._source.readline() |
147 | if not line.endswith(b'\n'): |
148 | - raise errors.UnexpectedEndOfContainerError() |
149 | + raise UnexpectedEndOfContainerError() |
150 | return line.rstrip(b'\n') |
151 | |
152 | |
153 | @@ -313,15 +362,15 @@ |
154 | elif record_kind == b'': |
155 | # End of stream encountered, but no End Marker record seen, so |
156 | # this container is incomplete. |
157 | - raise errors.UnexpectedEndOfContainerError() |
158 | + raise UnexpectedEndOfContainerError() |
159 | else: |
160 | # Unknown record type. |
161 | - raise errors.UnknownRecordTypeError(record_kind) |
162 | + raise UnknownRecordTypeError(record_kind) |
163 | |
164 | def _read_format(self): |
165 | format = self._read_line() |
166 | if format != FORMAT_ONE: |
167 | - raise errors.UnknownContainerFormatError(format) |
168 | + raise UnknownContainerFormatError(format) |
169 | |
170 | def validate(self): |
171 | """Validate this container and its records. |
172 | @@ -343,11 +392,11 @@ |
173 | # risk that the same unicode string has been encoded two |
174 | # different ways. |
175 | if name_tuple in all_names: |
176 | - raise errors.DuplicateRecordNameError(name_tuple[0]) |
177 | + raise DuplicateRecordNameError(name_tuple[0]) |
178 | all_names.add(name_tuple) |
179 | excess_bytes = self.reader_func(1) |
180 | if excess_bytes != b'': |
181 | - raise errors.ContainerHasExcessDataError(excess_bytes) |
182 | + raise ContainerHasExcessDataError(excess_bytes) |
183 | |
184 | |
185 | class BytesRecordReader(BaseReader): |
186 | @@ -368,7 +417,7 @@ |
187 | try: |
188 | length = int(length_line) |
189 | except ValueError: |
190 | - raise errors.InvalidRecordError( |
191 | + raise InvalidRecordError( |
192 | "%r is not a valid length." % (length_line,)) |
193 | |
194 | # Read the list of names. |
195 | @@ -393,7 +442,7 @@ |
196 | self._remaining_length -= length_to_read |
197 | bytes = self.reader_func(length_to_read) |
198 | if len(bytes) != length_to_read: |
199 | - raise errors.UnexpectedEndOfContainerError() |
200 | + raise UnexpectedEndOfContainerError() |
201 | return bytes |
202 | |
203 | def validate(self): |
204 | @@ -470,7 +519,7 @@ |
205 | line = self._consume_line() |
206 | if line is not None: |
207 | if line != FORMAT_ONE: |
208 | - raise errors.UnknownContainerFormatError(line) |
209 | + raise UnknownContainerFormatError(line) |
210 | self._state_handler = self._state_expecting_record_type |
211 | |
212 | def _state_expecting_record_type(self): |
213 | @@ -483,7 +532,7 @@ |
214 | self.finished = True |
215 | self._state_handler = self._state_expecting_nothing |
216 | else: |
217 | - raise errors.UnknownRecordTypeError(record_type) |
218 | + raise UnknownRecordTypeError(record_type) |
219 | |
220 | def _state_expecting_length(self): |
221 | line = self._consume_line() |
222 | @@ -491,7 +540,7 @@ |
223 | try: |
224 | self._current_record_length = int(line) |
225 | except ValueError: |
226 | - raise errors.InvalidRecordError( |
227 | + raise InvalidRecordError( |
228 | "%r is not a valid length." % (line,)) |
229 | self._state_handler = self._state_expecting_name |
230 | |
231 | |
232 | === modified file 'breezy/bzr/pack_repo.py' |
233 | --- breezy/bzr/pack_repo.py 2021-05-24 01:06:31 +0000 |
234 | +++ breezy/bzr/pack_repo.py 2022-07-16 17:54:02 +0000 |
235 | @@ -70,6 +70,53 @@ |
236 | ) |
237 | |
238 | |
239 | +class RetryWithNewPacks(errors.BzrError): |
240 | + """Raised when we realize that the packs on disk have changed. |
241 | + |
242 | + This is meant as more of a signaling exception, to trap between where a |
243 | + local error occurred and the code that can actually handle the error and |
244 | + code that can retry appropriately. |
245 | + """ |
246 | + |
247 | + internal_error = True |
248 | + |
249 | + _fmt = ("Pack files have changed, reload and retry. context: %(context)s" |
250 | + " %(orig_error)s") |
251 | + |
252 | + def __init__(self, context, reload_occurred, exc_info): |
253 | + """create a new RetryWithNewPacks error. |
254 | + |
255 | + :param reload_occurred: Set to True if we know that the packs have |
256 | + already been reloaded, and we are failing because of an in-memory |
257 | + cache miss. If set to True then we will ignore if a reload says |
258 | + nothing has changed, because we assume it has already reloaded. If |
259 | + False, then a reload with nothing changed will force an error. |
260 | + :param exc_info: The original exception traceback, so if there is a |
261 | + problem we can raise the original error (value from sys.exc_info()) |
262 | + """ |
263 | + errors.BzrError.__init__(self) |
264 | + self.context = context |
265 | + self.reload_occurred = reload_occurred |
266 | + self.exc_info = exc_info |
267 | + self.orig_error = exc_info[1] |
268 | + # TODO: The global error handler should probably treat this by |
269 | + # raising/printing the original exception with a bit about |
270 | + # RetryWithNewPacks also not being caught |
271 | + |
272 | + |
273 | +class RetryAutopack(RetryWithNewPacks): |
274 | + """Raised when we are autopacking and we find a missing file. |
275 | + |
276 | + Meant as a signaling exception, to tell the autopack code it should try |
277 | + again. |
278 | + """ |
279 | + |
280 | + internal_error = True |
281 | + |
282 | + _fmt = ("Pack files have changed, reload and try autopack again." |
283 | + " context: %(context)s %(orig_error)s") |
284 | + |
285 | + |
286 | class PackCommitBuilder(VersionedFileCommitBuilder): |
287 | """Subclass of VersionedFileCommitBuilder to add texts with pack semantics. |
288 | |
289 | @@ -876,7 +923,7 @@ |
290 | while True: |
291 | try: |
292 | return self._do_autopack() |
293 | - except errors.RetryAutopack: |
294 | + except RetryAutopack: |
295 | # If we get a RetryAutopack exception, we should abort the |
296 | # current action, and retry. |
297 | pass |
298 | @@ -936,7 +983,7 @@ |
299 | reload_func=reload_func) |
300 | try: |
301 | result = packer.pack() |
302 | - except errors.RetryWithNewPacks: |
303 | + except RetryWithNewPacks: |
304 | # An exception is propagating out of this context, make sure |
305 | # this packer has cleaned up. Packer() doesn't set its new_pack |
306 | # state into the RepositoryPackCollection object, so we only |
307 | @@ -1476,7 +1523,7 @@ |
308 | # Re-raise the original exception, because something went missing |
309 | # and a restart didn't find it |
310 | raise |
311 | - raise errors.RetryAutopack(self.repo, False, sys.exc_info()) |
312 | + raise RetryAutopack(self.repo, False, sys.exc_info()) |
313 | |
314 | def _restart_pack_operations(self): |
315 | """Reload the pack names list, and restart the autopack code.""" |
316 | @@ -1928,7 +1975,7 @@ |
317 | _serializer=self._serializer) |
318 | |
319 | |
320 | -class RetryPackOperations(errors.RetryWithNewPacks): |
321 | +class RetryPackOperations(RetryWithNewPacks): |
322 | """Raised when we are packing and we find a missing file. |
323 | |
324 | Meant as a signaling exception, to tell the RepositoryPackCollection.pack |
325 | @@ -2044,9 +2091,9 @@ |
326 | # If we don't have a _reload_func there is nothing that can |
327 | # be done |
328 | raise |
329 | - raise errors.RetryWithNewPacks(index, |
330 | - reload_occurred=True, |
331 | - exc_info=sys.exc_info()) |
332 | + raise RetryWithNewPacks(index, |
333 | + reload_occurred=True, |
334 | + exc_info=sys.exc_info()) |
335 | try: |
336 | reader = pack.make_readv_reader(transport, path, offsets) |
337 | for names, read_func in reader.iter_records(): |
338 | @@ -2056,9 +2103,9 @@ |
339 | # missing on disk, we need to trigger a reload, and start over. |
340 | if self._reload_func is None: |
341 | raise |
342 | - raise errors.RetryWithNewPacks(transport.abspath(path), |
343 | - reload_occurred=False, |
344 | - exc_info=sys.exc_info()) |
345 | + raise RetryWithNewPacks(transport.abspath(path), |
346 | + reload_occurred=False, |
347 | + exc_info=sys.exc_info()) |
348 | |
349 | def set_writer(self, writer, index, transport_packname): |
350 | """Set a writer to use for adding data.""" |
351 | |
352 | === modified file 'breezy/bzr/remote.py' |
353 | --- breezy/bzr/remote.py 2022-01-03 20:29:28 +0000 |
354 | +++ breezy/bzr/remote.py 2022-07-16 17:54:02 +0000 |
355 | @@ -70,6 +70,33 @@ |
356 | _DEFAULT_SEARCH_DEPTH = 100 |
357 | |
358 | |
359 | +class UnknownErrorFromSmartServer(errors.BzrError): |
360 | + """An ErrorFromSmartServer could not be translated into a typical breezy |
361 | + error. |
362 | + |
363 | + This is distinct from ErrorFromSmartServer so that it is possible to |
364 | + distinguish between the following two cases: |
365 | + |
366 | + - ErrorFromSmartServer was uncaught. This is logic error in the client |
367 | + and so should provoke a traceback to the user. |
368 | + - ErrorFromSmartServer was caught but its error_tuple could not be |
369 | + translated. This is probably because the server sent us garbage, and |
370 | + should not provoke a traceback. |
371 | + """ |
372 | + |
373 | + _fmt = "Server sent an unexpected error: %(error_tuple)r" |
374 | + |
375 | + internal_error = False |
376 | + |
377 | + def __init__(self, error_from_smart_server): |
378 | + """Constructor. |
379 | + |
380 | + :param error_from_smart_server: An ErrorFromSmartServer instance. |
381 | + """ |
382 | + self.error_from_smart_server = error_from_smart_server |
383 | + self.error_tuple = error_from_smart_server.error_tuple |
384 | + |
385 | + |
386 | class _RpcHelper(object): |
387 | """Mixin class that helps with issuing RPCs.""" |
388 | |
389 | @@ -567,7 +594,7 @@ |
390 | except errors.UnknownSmartMethod: |
391 | medium._remember_remote_is_before((1, 13)) |
392 | return self._vfs_cloning_metadir(require_stacking=require_stacking) |
393 | - except errors.UnknownErrorFromSmartServer as err: |
394 | + except UnknownErrorFromSmartServer as err: |
395 | if err.error_tuple != (b'BranchReference',): |
396 | raise |
397 | # We need to resolve the branch reference to determine the |
398 | @@ -641,7 +668,7 @@ |
399 | if name is None: |
400 | name = self._get_selected_branch() |
401 | if name != "": |
402 | - raise errors.NoColocatedBranchSupport(self) |
403 | + raise controldir.NoColocatedBranchSupport(self) |
404 | # as per meta1 formats - just delegate to the format object which may |
405 | # be parameterised. |
406 | real_branch = self._format.get_branch_format().initialize(self, |
407 | @@ -669,7 +696,7 @@ |
408 | if name is None: |
409 | name = self._get_selected_branch() |
410 | if name != "": |
411 | - raise errors.NoColocatedBranchSupport(self) |
412 | + raise controldir.NoColocatedBranchSupport(self) |
413 | path = self._path_for_remote_call(self._client) |
414 | try: |
415 | if name != "": |
416 | @@ -741,7 +768,7 @@ |
417 | if name is None: |
418 | name = self._get_selected_branch() |
419 | if name != "": |
420 | - raise errors.NoColocatedBranchSupport(self) |
421 | + raise controldir.NoColocatedBranchSupport(self) |
422 | self._ensure_real() |
423 | return self._real_bzrdir.set_branch_reference(target_branch, name=name) |
424 | |
425 | @@ -750,7 +777,7 @@ |
426 | if name is None: |
427 | name = self._get_selected_branch() |
428 | if name != "": |
429 | - raise errors.NoColocatedBranchSupport(self) |
430 | + raise controldir.NoColocatedBranchSupport(self) |
431 | response = self._get_branch_reference() |
432 | if response[0] == 'ref': |
433 | return response[1].decode('utf-8') |
434 | @@ -820,7 +847,7 @@ |
435 | if name is None: |
436 | name = self._get_selected_branch() |
437 | if name != "": |
438 | - raise errors.NoColocatedBranchSupport(self) |
439 | + raise controldir.NoColocatedBranchSupport(self) |
440 | if unsupported: |
441 | raise NotImplementedError( |
442 | 'unsupported flag support not implemented yet.') |
443 | @@ -1395,7 +1422,7 @@ |
444 | except errors.UnknownSmartMethod: |
445 | self._client._medium._remember_remote_is_before((1, 17)) |
446 | return self._get_rev_id_for_revno_vfs(revno, known_pair) |
447 | - except errors.UnknownErrorFromSmartServer as e: |
448 | + except UnknownErrorFromSmartServer as e: |
449 | # Older versions of Bazaar/Breezy (<< 3.0.0) would raise a |
450 | # ValueError instead of returning revno-outofbounds |
451 | if len(e.error_tuple) < 3: |
452 | @@ -3145,7 +3172,7 @@ |
453 | verb, args, search_bytes) |
454 | except errors.UnknownSmartMethod: |
455 | medium._remember_remote_is_before(version) |
456 | - except errors.UnknownErrorFromSmartServer as e: |
457 | + except UnknownErrorFromSmartServer as e: |
458 | if isinstance(search, vf_search.EverythingResult): |
459 | error_verb = e.error_from_smart_server.error_verb |
460 | if error_verb == b'BadSearch': |
461 | @@ -3313,7 +3340,7 @@ |
462 | path = a_controldir._path_for_remote_call(a_controldir._client) |
463 | if name != "": |
464 | # XXX JRV20100304: Support creating colocated branches |
465 | - raise errors.NoColocatedBranchSupport(self) |
466 | + raise controldir.NoColocatedBranchSupport(self) |
467 | verb = b'BzrDir.create_branch' |
468 | try: |
469 | response = a_controldir._call(verb, path, network_name) |
470 | @@ -4033,7 +4060,7 @@ |
471 | except errors.UnknownSmartMethod: |
472 | self._ensure_real() |
473 | return self._real_branch.revision_id_to_dotted_revno(revision_id) |
474 | - except errors.UnknownErrorFromSmartServer as e: |
475 | + except UnknownErrorFromSmartServer as e: |
476 | # Deal with older versions of bzr/brz that didn't explicitly |
477 | # wrap GhostRevisionsHaveNoRevno. |
478 | if e.error_tuple[1] == b'GhostRevisionsHaveNoRevno': |
479 | @@ -4426,7 +4453,7 @@ |
480 | try: |
481 | translator = no_context_error_translators.get(err.error_verb) |
482 | except KeyError: |
483 | - raise errors.UnknownErrorFromSmartServer(err) |
484 | + raise UnknownErrorFromSmartServer(err) |
485 | else: |
486 | raise translator(err) |
487 | |
488 | |
489 | === modified file 'breezy/bzr/smart/medium.py' |
490 | --- breezy/bzr/smart/medium.py 2020-02-18 01:57:45 +0000 |
491 | +++ breezy/bzr/smart/medium.py 2022-07-16 17:54:02 +0000 |
492 | @@ -1179,6 +1179,16 @@ |
493 | pass |
494 | |
495 | |
496 | +class TooManyConcurrentRequests(errors.InternalBzrError): |
497 | + |
498 | + _fmt = ("The medium '%(medium)s' has reached its concurrent request limit." |
499 | + " Be sure to finish_writing and finish_reading on the" |
500 | + " currently open request.") |
501 | + |
502 | + def __init__(self, medium): |
503 | + self.medium = medium |
504 | + |
505 | + |
506 | class SmartClientStreamMediumRequest(SmartClientMediumRequest): |
507 | """A SmartClientMediumRequest that works with an SmartClientStreamMedium.""" |
508 | |
509 | @@ -1190,7 +1200,7 @@ |
510 | # and the setting/unsetting of _current_request likewise moved into |
511 | # that class : but its unneeded overhead for now. RBC 20060922 |
512 | if self._medium._current_request is not None: |
513 | - raise errors.TooManyConcurrentRequests(self._medium) |
514 | + raise TooManyConcurrentRequests(self._medium) |
515 | self._medium._current_request = self |
516 | |
517 | def _accept_bytes(self, bytes): |
518 | |
519 | === modified file 'breezy/bzr/smart/protocol.py' |
520 | --- breezy/bzr/smart/protocol.py 2021-08-18 22:38:08 +0000 |
521 | +++ breezy/bzr/smart/protocol.py 2022-07-16 17:54:02 +0000 |
522 | @@ -52,6 +52,21 @@ |
523 | RESPONSE_VERSION_THREE = REQUEST_VERSION_THREE = MESSAGE_VERSION_THREE |
524 | |
525 | |
526 | +class SmartMessageHandlerError(errors.InternalBzrError): |
527 | + |
528 | + _fmt = ("The message handler raised an exception:\n" |
529 | + "%(traceback_text)s") |
530 | + |
531 | + def __init__(self, exc_info): |
532 | + import traceback |
533 | + # GZ 2010-08-10: Cycle with exc_tb/exc_info affects at least one test |
534 | + self.exc_type, self.exc_value, self.exc_tb = exc_info |
535 | + self.exc_info = exc_info |
536 | + traceback_strings = traceback.format_exception( |
537 | + self.exc_type, self.exc_value, self.exc_tb) |
538 | + self.traceback_text = ''.join(traceback_strings) |
539 | + |
540 | + |
541 | def _recv_tuple(from_file): |
542 | req_line = from_file.readline() |
543 | return _decode_tuple(req_line) |
544 | @@ -916,7 +931,7 @@ |
545 | _StatefulDecoder.accept_bytes(self, bytes) |
546 | except KeyboardInterrupt: |
547 | raise |
548 | - except errors.SmartMessageHandlerError as exception: |
549 | + except SmartMessageHandlerError as exception: |
550 | # We do *not* set self.decoding_failed here. The message handler |
551 | # has raised an error, but the decoder is still able to parse bytes |
552 | # and determine when this message ends. |
553 | @@ -1008,7 +1023,7 @@ |
554 | try: |
555 | self.message_handler.headers_received(decoded) |
556 | except: |
557 | - raise errors.SmartMessageHandlerError(sys.exc_info()) |
558 | + raise SmartMessageHandlerError(sys.exc_info()) |
559 | |
560 | def _state_accept_expecting_message_part(self): |
561 | message_part_kind = self._extract_single_byte() |
562 | @@ -1030,7 +1045,7 @@ |
563 | try: |
564 | self.message_handler.byte_part_received(byte) |
565 | except: |
566 | - raise errors.SmartMessageHandlerError(sys.exc_info()) |
567 | + raise SmartMessageHandlerError(sys.exc_info()) |
568 | |
569 | def _state_accept_expecting_bytes(self): |
570 | # XXX: this should not buffer whole message part, but instead deliver |
571 | @@ -1040,7 +1055,7 @@ |
572 | try: |
573 | self.message_handler.bytes_part_received(prefixed_bytes) |
574 | except: |
575 | - raise errors.SmartMessageHandlerError(sys.exc_info()) |
576 | + raise SmartMessageHandlerError(sys.exc_info()) |
577 | |
578 | def _state_accept_expecting_structure(self): |
579 | structure = self._extract_prefixed_bencoded_data() |
580 | @@ -1048,7 +1063,7 @@ |
581 | try: |
582 | self.message_handler.structure_part_received(structure) |
583 | except: |
584 | - raise errors.SmartMessageHandlerError(sys.exc_info()) |
585 | + raise SmartMessageHandlerError(sys.exc_info()) |
586 | |
587 | def done(self): |
588 | self.unused_data = self._get_in_buffer() |
589 | @@ -1057,7 +1072,7 @@ |
590 | try: |
591 | self.message_handler.end_received() |
592 | except: |
593 | - raise errors.SmartMessageHandlerError(sys.exc_info()) |
594 | + raise SmartMessageHandlerError(sys.exc_info()) |
595 | |
596 | def _state_accept_reading_unused(self): |
597 | self.unused_data += self._get_in_buffer() |
598 | |
599 | === modified file 'breezy/bzr/tests/test_bzrdir.py' |
600 | --- breezy/bzr/tests/test_bzrdir.py 2021-12-25 16:33:03 +0000 |
601 | +++ breezy/bzr/tests/test_bzrdir.py 2022-07-16 17:54:02 +0000 |
602 | @@ -50,7 +50,6 @@ |
603 | from ..fullhistory import BzrBranchFormat5 |
604 | from ...errors import ( |
605 | NotBranchError, |
606 | - NoColocatedBranchSupport, |
607 | UnknownFormatError, |
608 | UnsupportedFormatError, |
609 | ) |
610 | @@ -229,7 +228,7 @@ |
611 | def create_branch(self, name=None): |
612 | """See ControlDir.create_branch.""" |
613 | if name is not None: |
614 | - raise NoColocatedBranchSupport(self) |
615 | + raise controldir.NoColocatedBranchSupport(self) |
616 | return SampleBranch(self) |
617 | |
618 | def create_workingtree(self): |
619 | |
620 | === modified file 'breezy/bzr/tests/test_knit.py' |
621 | --- breezy/bzr/tests/test_knit.py 2020-06-10 02:56:53 +0000 |
622 | +++ breezy/bzr/tests/test_knit.py 2022-07-16 17:54:02 +0000 |
623 | @@ -492,7 +492,7 @@ |
624 | try: |
625 | raise _TestException('foobar') |
626 | except _TestException as e: |
627 | - retry_exc = errors.RetryWithNewPacks(None, reload_occurred=False, |
628 | + retry_exc = pack_repo.RetryWithNewPacks(None, reload_occurred=False, |
629 | exc_info=sys.exc_info()) |
630 | # GZ 2010-08-10: Cycle with exc_info affects 3 tests |
631 | return retry_exc |
632 | @@ -546,7 +546,7 @@ |
633 | # Note that the index key has changed from 'foo' to 'bar' |
634 | access = pack_repo._DirectPackAccess({'bar': (transport, 'packname')}, |
635 | reload_func=reload_func) |
636 | - e = self.assertListRaises(errors.RetryWithNewPacks, |
637 | + e = self.assertListRaises(pack_repo.RetryWithNewPacks, |
638 | access.get_raw_records, memos) |
639 | # Because a key was passed in which does not match our index list, we |
640 | # assume that the listing was already reloaded |
641 | @@ -570,7 +570,7 @@ |
642 | access = pack_repo._DirectPackAccess( |
643 | {'foo': (transport, 'different-packname')}, |
644 | reload_func=reload_func) |
645 | - e = self.assertListRaises(errors.RetryWithNewPacks, |
646 | + e = self.assertListRaises(pack_repo.RetryWithNewPacks, |
647 | access.get_raw_records, memos) |
648 | # The file has gone missing, so we assume we need to reload |
649 | self.assertFalse(e.reload_occurred) |
650 | @@ -603,7 +603,7 @@ |
651 | self.assertEqual([b'12345'], |
652 | list(access.get_raw_records(memos[1:2]))) |
653 | # A multiple offset readv() will fail mid-way through |
654 | - e = self.assertListRaises(errors.RetryWithNewPacks, |
655 | + e = self.assertListRaises(pack_repo.RetryWithNewPacks, |
656 | access.get_raw_records, memos) |
657 | # The file has gone missing, so we assume we need to reload |
658 | self.assertFalse(e.reload_occurred) |
659 | @@ -2671,3 +2671,14 @@ |
660 | } |
661 | for record in generator.get_record_stream(): |
662 | self.assertEqual(kinds[record.key], record.storage_kind) |
663 | + |
664 | + |
665 | +class TestErrors(TestCase): |
666 | + |
667 | + def test_retry_with_new_packs(self): |
668 | + fake_exc_info = ('{exc type}', '{exc value}', '{exc traceback}') |
669 | + error = pack_repo.RetryWithNewPacks( |
670 | + '{context}', reload_occurred=False, exc_info=fake_exc_info) |
671 | + self.assertEqual( |
672 | + 'Pack files have changed, reload and retry. context: ' |
673 | + '{context} {exc value}', str(error)) |
674 | |
675 | === modified file 'breezy/bzr/tests/test_pack.py' |
676 | --- breezy/bzr/tests/test_pack.py 2020-06-10 23:47:24 +0000 |
677 | +++ breezy/bzr/tests/test_pack.py 2022-07-16 17:54:02 +0000 |
678 | @@ -18,7 +18,7 @@ |
679 | |
680 | from io import BytesIO |
681 | |
682 | -from ... import errors, tests |
683 | +from ... import tests |
684 | from .. import ( |
685 | pack, |
686 | ) |
687 | @@ -63,7 +63,7 @@ |
688 | def test_bytes_record_whitespace_in_name_part(self): |
689 | serialiser = pack.ContainerSerialiser() |
690 | self.assertRaises( |
691 | - errors.InvalidRecordError, |
692 | + pack.InvalidRecordError, |
693 | serialiser.bytes_record, b'bytes', [(b'bad name',)]) |
694 | |
695 | def test_bytes_record_header(self): |
696 | @@ -214,7 +214,7 @@ |
697 | """ |
698 | self.writer.begin() |
699 | self.assertRaises( |
700 | - errors.InvalidRecordError, |
701 | + pack.InvalidRecordError, |
702 | self.writer.add_bytes_record, [b'abc'], len(b'abc'), names=[(b'bad name', )]) |
703 | |
704 | def test_add_bytes_records_add_to_records_written(self): |
705 | @@ -257,7 +257,7 @@ |
706 | """Unrecognised container formats raise UnknownContainerFormatError.""" |
707 | reader = self.get_reader_for(b"unknown format\n") |
708 | self.assertRaises( |
709 | - errors.UnknownContainerFormatError, reader.iter_records) |
710 | + pack.UnknownContainerFormatError, reader.iter_records) |
711 | |
712 | def test_unexpected_end_of_container(self): |
713 | """Containers that don't end with an End Marker record should cause |
714 | @@ -267,7 +267,7 @@ |
715 | b"Bazaar pack format 1 (introduced in 0.18)\n") |
716 | iterator = reader.iter_records() |
717 | self.assertRaises( |
718 | - errors.UnexpectedEndOfContainerError, next, iterator) |
719 | + pack.UnexpectedEndOfContainerError, next, iterator) |
720 | |
721 | def test_unknown_record_type(self): |
722 | """Unknown record types cause UnknownRecordTypeError to be raised.""" |
723 | @@ -275,7 +275,7 @@ |
724 | b"Bazaar pack format 1 (introduced in 0.18)\nX") |
725 | iterator = reader.iter_records() |
726 | self.assertRaises( |
727 | - errors.UnknownRecordTypeError, next, iterator) |
728 | + pack.UnknownRecordTypeError, next, iterator) |
729 | |
730 | def test_container_with_one_unnamed_record(self): |
731 | """Read a container with one Bytes record. |
732 | @@ -318,8 +318,8 @@ |
733 | for input in inputs: |
734 | reader = self.get_reader_for(input) |
735 | self.assertRaises( |
736 | - (errors.UnexpectedEndOfContainerError, |
737 | - errors.UnknownContainerFormatError), |
738 | + (pack.UnexpectedEndOfContainerError, |
739 | + pack.UnknownContainerFormatError), |
740 | reader.validate) |
741 | |
742 | def test_validate_bad_record_marker(self): |
743 | @@ -328,7 +328,7 @@ |
744 | """ |
745 | reader = self.get_reader_for( |
746 | b"Bazaar pack format 1 (introduced in 0.18)\nX") |
747 | - self.assertRaises(errors.UnknownRecordTypeError, reader.validate) |
748 | + self.assertRaises(pack.UnknownRecordTypeError, reader.validate) |
749 | |
750 | def test_validate_data_after_end_marker(self): |
751 | """validate raises ContainerHasExcessDataError if there are any bytes |
752 | @@ -337,7 +337,7 @@ |
753 | reader = self.get_reader_for( |
754 | b"Bazaar pack format 1 (introduced in 0.18)\nEcrud") |
755 | self.assertRaises( |
756 | - errors.ContainerHasExcessDataError, reader.validate) |
757 | + pack.ContainerHasExcessDataError, reader.validate) |
758 | |
759 | def test_validate_no_end_marker(self): |
760 | """validate raises UnexpectedEndOfContainerError if there's no end of |
761 | @@ -347,7 +347,7 @@ |
762 | reader = self.get_reader_for( |
763 | b"Bazaar pack format 1 (introduced in 0.18)\n") |
764 | self.assertRaises( |
765 | - errors.UnexpectedEndOfContainerError, reader.validate) |
766 | + pack.UnexpectedEndOfContainerError, reader.validate) |
767 | |
768 | def test_validate_duplicate_name(self): |
769 | """validate raises DuplicateRecordNameError if the same name occurs |
770 | @@ -358,13 +358,13 @@ |
771 | b"B0\nname\n\n" |
772 | b"B0\nname\n\n" |
773 | b"E") |
774 | - self.assertRaises(errors.DuplicateRecordNameError, reader.validate) |
775 | + self.assertRaises(pack.DuplicateRecordNameError, reader.validate) |
776 | |
777 | def test_validate_undecodeable_name(self): |
778 | """Names that aren't valid UTF-8 cause validate to fail.""" |
779 | reader = self.get_reader_for( |
780 | b"Bazaar pack format 1 (introduced in 0.18)\nB0\n\xcc\n\nE") |
781 | - self.assertRaises(errors.InvalidRecordError, reader.validate) |
782 | + self.assertRaises(pack.InvalidRecordError, reader.validate) |
783 | |
784 | |
785 | class TestBytesRecordReader(tests.TestCase): |
786 | @@ -419,7 +419,7 @@ |
787 | InvalidRecordError. |
788 | """ |
789 | reader = self.get_reader_for(b"not a number\n") |
790 | - self.assertRaises(errors.InvalidRecordError, reader.read) |
791 | + self.assertRaises(pack.InvalidRecordError, reader.read) |
792 | |
793 | def test_early_eof(self): |
794 | """Tests for premature EOF occuring during parsing Bytes records with |
795 | @@ -440,7 +440,7 @@ |
796 | try: |
797 | names, read_bytes = reader.read() |
798 | read_bytes(None) |
799 | - except errors.UnexpectedEndOfContainerError: |
800 | + except pack.UnexpectedEndOfContainerError: |
801 | pass |
802 | else: |
803 | self.fail( |
804 | @@ -450,59 +450,59 @@ |
805 | def test_initial_eof(self): |
806 | """EOF before any bytes read at all.""" |
807 | reader = self.get_reader_for(b"") |
808 | - self.assertRaises(errors.UnexpectedEndOfContainerError, reader.read) |
809 | + self.assertRaises(pack.UnexpectedEndOfContainerError, reader.read) |
810 | |
811 | def test_eof_after_length(self): |
812 | """EOF after reading the length and before reading name(s).""" |
813 | reader = self.get_reader_for(b"123\n") |
814 | - self.assertRaises(errors.UnexpectedEndOfContainerError, reader.read) |
815 | + self.assertRaises(pack.UnexpectedEndOfContainerError, reader.read) |
816 | |
817 | def test_eof_during_name(self): |
818 | """EOF during reading a name.""" |
819 | reader = self.get_reader_for(b"123\nname") |
820 | - self.assertRaises(errors.UnexpectedEndOfContainerError, reader.read) |
821 | + self.assertRaises(pack.UnexpectedEndOfContainerError, reader.read) |
822 | |
823 | def test_read_invalid_name_whitespace(self): |
824 | """Names must have no whitespace.""" |
825 | # A name with a space. |
826 | reader = self.get_reader_for(b"0\nbad name\n\n") |
827 | - self.assertRaises(errors.InvalidRecordError, reader.read) |
828 | + self.assertRaises(pack.InvalidRecordError, reader.read) |
829 | |
830 | # A name with a tab. |
831 | reader = self.get_reader_for(b"0\nbad\tname\n\n") |
832 | - self.assertRaises(errors.InvalidRecordError, reader.read) |
833 | + self.assertRaises(pack.InvalidRecordError, reader.read) |
834 | |
835 | # A name with a vertical tab. |
836 | reader = self.get_reader_for(b"0\nbad\vname\n\n") |
837 | - self.assertRaises(errors.InvalidRecordError, reader.read) |
838 | + self.assertRaises(pack.InvalidRecordError, reader.read) |
839 | |
840 | def test_validate_whitespace_in_name(self): |
841 | """Names must have no whitespace.""" |
842 | reader = self.get_reader_for(b"0\nbad name\n\n") |
843 | - self.assertRaises(errors.InvalidRecordError, reader.validate) |
844 | + self.assertRaises(pack.InvalidRecordError, reader.validate) |
845 | |
846 | def test_validate_interrupted_prelude(self): |
847 | """EOF during reading a record's prelude causes validate to fail.""" |
848 | reader = self.get_reader_for(b"") |
849 | self.assertRaises( |
850 | - errors.UnexpectedEndOfContainerError, reader.validate) |
851 | + pack.UnexpectedEndOfContainerError, reader.validate) |
852 | |
853 | def test_validate_interrupted_body(self): |
854 | """EOF during reading a record's body causes validate to fail.""" |
855 | reader = self.get_reader_for(b"1\n\n") |
856 | self.assertRaises( |
857 | - errors.UnexpectedEndOfContainerError, reader.validate) |
858 | + pack.UnexpectedEndOfContainerError, reader.validate) |
859 | |
860 | def test_validate_unparseable_length(self): |
861 | """An unparseable record length causes validate to fail.""" |
862 | reader = self.get_reader_for(b"\n\n") |
863 | self.assertRaises( |
864 | - errors.InvalidRecordError, reader.validate) |
865 | + pack.InvalidRecordError, reader.validate) |
866 | |
867 | def test_validate_undecodeable_name(self): |
868 | """Names that aren't valid UTF-8 cause validate to fail.""" |
869 | reader = self.get_reader_for(b"0\n\xcc\n\n") |
870 | - self.assertRaises(errors.InvalidRecordError, reader.validate) |
871 | + self.assertRaises(pack.InvalidRecordError, reader.validate) |
872 | |
873 | def test_read_max_length(self): |
874 | """If the max_length passed to the callable returned by read is not |
875 | @@ -704,7 +704,7 @@ |
876 | """ |
877 | parser = self.make_parser_expecting_bytes_record() |
878 | self.assertRaises( |
879 | - errors.InvalidRecordError, parser.accept_bytes, b"not a number\n") |
880 | + pack.InvalidRecordError, parser.accept_bytes, b"not a number\n") |
881 | |
882 | def test_incomplete_record(self): |
883 | """If the bytes seen so far don't form a complete record, then there |
884 | @@ -723,7 +723,7 @@ |
885 | """Assert that parsing the given bytes raises InvalidRecordError.""" |
886 | parser = self.make_parser_expecting_bytes_record() |
887 | self.assertRaises( |
888 | - errors.InvalidRecordError, parser.accept_bytes, data) |
889 | + pack.InvalidRecordError, parser.accept_bytes, data) |
890 | |
891 | def test_read_invalid_name_whitespace(self): |
892 | """Names must have no whitespace.""" |
893 | @@ -742,3 +742,47 @@ |
894 | parser.accept_bytes(b"6\n\nabcdef") |
895 | self.assertEqual([([], b'abcdef')], parser.read_pending_records()) |
896 | self.assertEqual([], parser.read_pending_records()) |
897 | + |
898 | + |
899 | +class TestErrors(tests.TestCase): |
900 | + |
901 | + def test_unknown_container_format(self): |
902 | + """Test the formatting of UnknownContainerFormatError.""" |
903 | + e = pack.UnknownContainerFormatError('bad format string') |
904 | + self.assertEqual( |
905 | + "Unrecognised container format: 'bad format string'", |
906 | + str(e)) |
907 | + |
908 | + def test_unexpected_end_of_container(self): |
909 | + """Test the formatting of UnexpectedEndOfContainerError.""" |
910 | + e = pack.UnexpectedEndOfContainerError() |
911 | + self.assertEqual( |
912 | + "Unexpected end of container stream", str(e)) |
913 | + |
914 | + def test_unknown_record_type(self): |
915 | + """Test the formatting of UnknownRecordTypeError.""" |
916 | + e = pack.UnknownRecordTypeError("X") |
917 | + self.assertEqual( |
918 | + "Unknown record type: 'X'", |
919 | + str(e)) |
920 | + |
921 | + def test_invalid_record(self): |
922 | + """Test the formatting of InvalidRecordError.""" |
923 | + e = pack.InvalidRecordError("xxx") |
924 | + self.assertEqual( |
925 | + "Invalid record: xxx", |
926 | + str(e)) |
927 | + |
928 | + def test_container_has_excess_data(self): |
929 | + """Test the formatting of ContainerHasExcessDataError.""" |
930 | + e = pack.ContainerHasExcessDataError("excess bytes") |
931 | + self.assertEqual( |
932 | + "Container has data after end marker: 'excess bytes'", |
933 | + str(e)) |
934 | + |
935 | + def test_duplicate_record_name_error(self): |
936 | + """Test the formatting of DuplicateRecordNameError.""" |
937 | + e = pack.DuplicateRecordNameError(b"n\xc3\xa5me") |
938 | + self.assertEqual( |
939 | + u"Container has multiple records with the same name: n\xe5me", |
940 | + str(e)) |
941 | |
942 | === modified file 'breezy/bzr/tests/test_remote.py' |
943 | --- breezy/bzr/tests/test_remote.py 2021-08-18 22:38:08 +0000 |
944 | +++ breezy/bzr/tests/test_remote.py 2022-07-16 17:54:02 +0000 |
945 | @@ -65,6 +65,7 @@ |
946 | RemoteBzrDirFormat, |
947 | RemoteRepository, |
948 | RemoteRepositoryFormat, |
949 | + UnknownErrorFromSmartServer, |
950 | ) |
951 | from .. import groupcompress_repo, knitpack_repo |
952 | from ...revision import ( |
953 | @@ -1918,7 +1919,7 @@ |
954 | client._calls = [] |
955 | |
956 | err = self.assertRaises( |
957 | - errors.UnknownErrorFromSmartServer, |
958 | + UnknownErrorFromSmartServer, |
959 | branch.set_last_revision_info, 123, b'revid') |
960 | self.assertEqual((b'UnexpectedError',), err.error_tuple) |
961 | branch.unlock() |
962 | @@ -2940,7 +2941,7 @@ |
963 | transport_path = 'sinhala' |
964 | repo, client = self.setup_fake_client_and_repository(transport_path) |
965 | client.add_error_response(b'AnUnexpectedError') |
966 | - e = self.assertRaises(errors.UnknownErrorFromSmartServer, |
967 | + e = self.assertRaises(UnknownErrorFromSmartServer, |
968 | repo._get_revision_graph, revid) |
969 | self.assertEqual((b'AnUnexpectedError',), e.error_tuple) |
970 | |
971 | @@ -3950,7 +3951,7 @@ |
972 | err = errors.ErrorFromSmartServer( |
973 | (b'error', b"list index out of range")) |
974 | translated_error = self.translateErrorFromSmartServer(err) |
975 | - expected_error = errors.UnknownErrorFromSmartServer(err) |
976 | + expected_error = UnknownErrorFromSmartServer(err) |
977 | self.assertEqual(expected_error, translated_error) |
978 | |
979 | # GZ 2011-03-02: TODO test generic non-ascii error string |
980 | @@ -3958,7 +3959,7 @@ |
981 | def test_generic_KeyError(self): |
982 | err = errors.ErrorFromSmartServer((b'error', b'KeyError', b"1")) |
983 | translated_error = self.translateErrorFromSmartServer(err) |
984 | - expected_error = errors.UnknownErrorFromSmartServer(err) |
985 | + expected_error = UnknownErrorFromSmartServer(err) |
986 | self.assertEqual(expected_error, translated_error) |
987 | |
988 | def test_RevnoOutOfBounds(self): |
989 | @@ -3983,7 +3984,7 @@ |
990 | error_tuple = (b'An unknown error tuple',) |
991 | server_error = errors.ErrorFromSmartServer(error_tuple) |
992 | translated_error = self.translateErrorFromSmartServer(server_error) |
993 | - expected_error = errors.UnknownErrorFromSmartServer(server_error) |
994 | + expected_error = UnknownErrorFromSmartServer(server_error) |
995 | self.assertEqual(expected_error, translated_error) |
996 | |
997 | def test_context_missing_a_key(self): |
998 | @@ -4543,3 +4544,13 @@ |
999 | result = branch._get_all_reference_info() |
1000 | self.assertFinished(client) |
1001 | self.assertEqual({b'file-id': ('https://www.example.com/', None)}, result) |
1002 | + |
1003 | + |
1004 | +class TestErrors(tests.TestCase): |
1005 | + |
1006 | + def test_untranslateable_error_from_smart_server(self): |
1007 | + error_tuple = ('error', 'tuple') |
1008 | + orig_err = errors.ErrorFromSmartServer(error_tuple) |
1009 | + err = UnknownErrorFromSmartServer(orig_err) |
1010 | + self.assertEqual( |
1011 | + "Server sent an unexpected error: ('error', 'tuple')", str(err)) |
1012 | |
1013 | === modified file 'breezy/bzr/tests/test_smart.py' |
1014 | --- breezy/bzr/tests/test_smart.py 2022-07-14 21:40:03 +0000 |
1015 | +++ breezy/bzr/tests/test_smart.py 2022-07-16 17:54:02 +0000 |
1016 | @@ -2848,3 +2848,4 @@ |
1017 | self.assertEqual( |
1018 | [[b'some/path', b'http://www.example.com/', b'']], |
1019 | bencode.bdecode(response.body)) |
1020 | + |
1021 | |
1022 | === modified file 'breezy/bzr/tests/test_smart_transport.py' |
1023 | --- breezy/bzr/tests/test_smart_transport.py 2022-05-02 11:39:09 +0000 |
1024 | +++ breezy/bzr/tests/test_smart_transport.py 2022-07-16 17:54:02 +0000 |
1025 | @@ -42,6 +42,7 @@ |
1026 | from .. import ( |
1027 | bzrdir, |
1028 | ) |
1029 | +from ..remote import UnknownErrorFromSmartServer |
1030 | from ..smart import ( |
1031 | client, |
1032 | medium, |
1033 | @@ -695,7 +696,7 @@ |
1034 | client_medium = medium.SmartSimplePipesClientMedium( |
1035 | None, output, 'base') |
1036 | client_medium._current_request = "a" |
1037 | - self.assertRaises(errors.TooManyConcurrentRequests, |
1038 | + self.assertRaises(medium.TooManyConcurrentRequests, |
1039 | medium.SmartClientStreamMediumRequest, client_medium) |
1040 | |
1041 | def test_finished_read_clears_current_request(self): |
1042 | @@ -764,7 +765,7 @@ |
1043 | client_medium._socket = client_sock |
1044 | client_medium._connected = True |
1045 | req = client_medium.get_request() |
1046 | - self.assertRaises(errors.TooManyConcurrentRequests, |
1047 | + self.assertRaises(medium.TooManyConcurrentRequests, |
1048 | client_medium.get_request) |
1049 | client_medium.reset() |
1050 | # The stream should be reset, marked as disconnected, though ready for |
1051 | @@ -1363,7 +1364,7 @@ |
1052 | self.addCleanup(smart_server.stop_server) |
1053 | t = remote.RemoteTCPTransport(smart_server.get_url()) |
1054 | self.addCleanup(t.disconnect) |
1055 | - err = self.assertRaises(errors.UnknownErrorFromSmartServer, |
1056 | + err = self.assertRaises(UnknownErrorFromSmartServer, |
1057 | t.get, 'something') |
1058 | self.assertContainsRe(str(err), 'some random exception') |
1059 | |
1060 | @@ -4341,3 +4342,28 @@ |
1061 | r = t._redirected_to('http://www.example.com/foo', |
1062 | 'bzr://www.example.com/foo') |
1063 | self.assertNotEqual(type(r), type(t)) |
1064 | + |
1065 | + |
1066 | +class TestErrors(tests.TestCase): |
1067 | + def test_too_many_concurrent_requests(self): |
1068 | + error = medium.TooManyConcurrentRequests("a medium") |
1069 | + self.assertEqualDiff("The medium 'a medium' has reached its concurrent " |
1070 | + "request limit. Be sure to finish_writing and finish_reading on " |
1071 | + "the currently open request.", |
1072 | + str(error)) |
1073 | + |
1074 | + def test_smart_message_handler_error(self): |
1075 | + # Make an exc_info tuple. |
1076 | + try: |
1077 | + raise Exception("example error") |
1078 | + except Exception: |
1079 | + err = protocol.SmartMessageHandlerError(sys.exc_info()) |
1080 | + # GZ 2010-11-08: Should not store exc_info in exception instances. |
1081 | + try: |
1082 | + self.assertStartsWith( |
1083 | + str(err), "The message handler raised an exception:\n") |
1084 | + self.assertEndsWith(str(err), "Exception: example error\n") |
1085 | + finally: |
1086 | + del err |
1087 | + |
1088 | + |
1089 | |
1090 | === modified file 'breezy/config.py' |
1091 | --- breezy/config.py 2022-07-09 20:31:42 +0000 |
1092 | +++ breezy/config.py 2022-07-16 17:54:02 +0000 |
1093 | @@ -227,6 +227,14 @@ |
1094 | errors.BzrError.__init__(self, option_name=option_name) |
1095 | |
1096 | |
1097 | +class NoSuchAlias(errors.BzrError): |
1098 | + |
1099 | + _fmt = ('The alias "%(alias_name)s" does not exist.') |
1100 | + |
1101 | + def __init__(self, alias_name): |
1102 | + errors.BzrError.__init__(self, alias_name=alias_name) |
1103 | + |
1104 | + |
1105 | def signature_policy_from_unicode(signature_string): |
1106 | """Convert a string to a signing policy.""" |
1107 | if signature_string.lower() == 'check-available': |
1108 | @@ -1048,7 +1056,7 @@ |
1109 | self.reload() |
1110 | aliases = self._get_parser().get('ALIASES') |
1111 | if not aliases or alias_name not in aliases: |
1112 | - raise errors.NoSuchAlias(alias_name) |
1113 | + raise NoSuchAlias(alias_name) |
1114 | del aliases[alias_name] |
1115 | self._write_config_file() |
1116 | |
1117 | |
1118 | === modified file 'breezy/controldir.py' |
1119 | --- breezy/controldir.py 2022-07-09 20:29:40 +0000 |
1120 | +++ breezy/controldir.py 2022-07-16 17:54:02 +0000 |
1121 | @@ -67,6 +67,14 @@ |
1122 | errors.BzrError.__init__(self, branch=branch) |
1123 | |
1124 | |
1125 | +class NoColocatedBranchSupport(errors.BzrError): |
1126 | + |
1127 | + _fmt = ("%(controldir)r does not support co-located branches.") |
1128 | + |
1129 | + def __init__(self, controldir): |
1130 | + self.controldir = controldir |
1131 | + |
1132 | + |
1133 | class ControlComponent(object): |
1134 | """Abstract base class for control directory components. |
1135 | |
1136 | @@ -275,7 +283,7 @@ |
1137 | reference branch, or None for regular branches. |
1138 | """ |
1139 | if name is not None: |
1140 | - raise errors.NoColocatedBranchSupport(self) |
1141 | + raise NoColocatedBranchSupport(self) |
1142 | return None |
1143 | |
1144 | def set_branch_reference(self, target_branch, name=None): |
1145 | |
1146 | === modified file 'breezy/errors.py' |
1147 | --- breezy/errors.py 2022-07-09 20:29:40 +0000 |
1148 | +++ breezy/errors.py 2022-07-16 17:54:02 +0000 |
1149 | @@ -1086,53 +1086,6 @@ |
1150 | _fmt = "Text did not match its checksum: %(msg)s" |
1151 | |
1152 | |
1153 | -class RetryWithNewPacks(BzrError): |
1154 | - """Raised when we realize that the packs on disk have changed. |
1155 | - |
1156 | - This is meant as more of a signaling exception, to trap between where a |
1157 | - local error occurred and the code that can actually handle the error and |
1158 | - code that can retry appropriately. |
1159 | - """ |
1160 | - |
1161 | - internal_error = True |
1162 | - |
1163 | - _fmt = ("Pack files have changed, reload and retry. context: %(context)s" |
1164 | - " %(orig_error)s") |
1165 | - |
1166 | - def __init__(self, context, reload_occurred, exc_info): |
1167 | - """create a new RetryWithNewPacks error. |
1168 | - |
1169 | - :param reload_occurred: Set to True if we know that the packs have |
1170 | - already been reloaded, and we are failing because of an in-memory |
1171 | - cache miss. If set to True then we will ignore if a reload says |
1172 | - nothing has changed, because we assume it has already reloaded. If |
1173 | - False, then a reload with nothing changed will force an error. |
1174 | - :param exc_info: The original exception traceback, so if there is a |
1175 | - problem we can raise the original error (value from sys.exc_info()) |
1176 | - """ |
1177 | - BzrError.__init__(self) |
1178 | - self.context = context |
1179 | - self.reload_occurred = reload_occurred |
1180 | - self.exc_info = exc_info |
1181 | - self.orig_error = exc_info[1] |
1182 | - # TODO: The global error handler should probably treat this by |
1183 | - # raising/printing the original exception with a bit about |
1184 | - # RetryWithNewPacks also not being caught |
1185 | - |
1186 | - |
1187 | -class RetryAutopack(RetryWithNewPacks): |
1188 | - """Raised when we are autopacking and we find a missing file. |
1189 | - |
1190 | - Meant as a signaling exception, to tell the autopack code it should try |
1191 | - again. |
1192 | - """ |
1193 | - |
1194 | - internal_error = True |
1195 | - |
1196 | - _fmt = ("Pack files have changed, reload and try autopack again." |
1197 | - " context: %(context)s %(orig_error)s") |
1198 | - |
1199 | - |
1200 | class NoSuchExportFormat(BzrError): |
1201 | |
1202 | _fmt = "Export format %(format)r not supported" |
1203 | @@ -1158,16 +1111,6 @@ |
1204 | BzrError.__init__(self) |
1205 | |
1206 | |
1207 | -class TooManyConcurrentRequests(InternalBzrError): |
1208 | - |
1209 | - _fmt = ("The medium '%(medium)s' has reached its concurrent request limit." |
1210 | - " Be sure to finish_writing and finish_reading on the" |
1211 | - " currently open request.") |
1212 | - |
1213 | - def __init__(self, medium): |
1214 | - self.medium = medium |
1215 | - |
1216 | - |
1217 | class SmartProtocolError(TransportError): |
1218 | |
1219 | _fmt = "Generic bzr smart protocol error: %(details)s" |
1220 | @@ -1192,21 +1135,6 @@ |
1221 | self.verb = verb |
1222 | |
1223 | |
1224 | -class SmartMessageHandlerError(InternalBzrError): |
1225 | - |
1226 | - _fmt = ("The message handler raised an exception:\n" |
1227 | - "%(traceback_text)s") |
1228 | - |
1229 | - def __init__(self, exc_info): |
1230 | - import traceback |
1231 | - # GZ 2010-08-10: Cycle with exc_tb/exc_info affects at least one test |
1232 | - self.exc_type, self.exc_value, self.exc_tb = exc_info |
1233 | - self.exc_info = exc_info |
1234 | - traceback_strings = traceback.format_exception( |
1235 | - self.exc_type, self.exc_value, self.exc_tb) |
1236 | - self.traceback_text = ''.join(traceback_strings) |
1237 | - |
1238 | - |
1239 | # A set of semi-meaningful errors which can be thrown |
1240 | class TransportNotPossible(TransportError): |
1241 | |
1242 | @@ -1559,11 +1487,6 @@ |
1243 | DependencyNotPresent.__init__(self, 'paramiko', error) |
1244 | |
1245 | |
1246 | -class PointlessMerge(BzrError): |
1247 | - |
1248 | - _fmt = "Nothing to merge." |
1249 | - |
1250 | - |
1251 | class UninitializableFormat(BzrError): |
1252 | |
1253 | _fmt = "Format %(format)s cannot be initialised by this version of brz." |
1254 | @@ -2023,82 +1946,6 @@ |
1255 | self.error_args = error_tuple[1:] |
1256 | |
1257 | |
1258 | -class UnknownErrorFromSmartServer(BzrError): |
1259 | - """An ErrorFromSmartServer could not be translated into a typical breezy |
1260 | - error. |
1261 | - |
1262 | - This is distinct from ErrorFromSmartServer so that it is possible to |
1263 | - distinguish between the following two cases: |
1264 | - |
1265 | - - ErrorFromSmartServer was uncaught. This is logic error in the client |
1266 | - and so should provoke a traceback to the user. |
1267 | - - ErrorFromSmartServer was caught but its error_tuple could not be |
1268 | - translated. This is probably because the server sent us garbage, and |
1269 | - should not provoke a traceback. |
1270 | - """ |
1271 | - |
1272 | - _fmt = "Server sent an unexpected error: %(error_tuple)r" |
1273 | - |
1274 | - internal_error = False |
1275 | - |
1276 | - def __init__(self, error_from_smart_server): |
1277 | - """Constructor. |
1278 | - |
1279 | - :param error_from_smart_server: An ErrorFromSmartServer instance. |
1280 | - """ |
1281 | - self.error_from_smart_server = error_from_smart_server |
1282 | - self.error_tuple = error_from_smart_server.error_tuple |
1283 | - |
1284 | - |
1285 | -class ContainerError(BzrError): |
1286 | - """Base class of container errors.""" |
1287 | - |
1288 | - |
1289 | -class UnknownContainerFormatError(ContainerError): |
1290 | - |
1291 | - _fmt = "Unrecognised container format: %(container_format)r" |
1292 | - |
1293 | - def __init__(self, container_format): |
1294 | - self.container_format = container_format |
1295 | - |
1296 | - |
1297 | -class UnexpectedEndOfContainerError(ContainerError): |
1298 | - |
1299 | - _fmt = "Unexpected end of container stream" |
1300 | - |
1301 | - |
1302 | -class UnknownRecordTypeError(ContainerError): |
1303 | - |
1304 | - _fmt = "Unknown record type: %(record_type)r" |
1305 | - |
1306 | - def __init__(self, record_type): |
1307 | - self.record_type = record_type |
1308 | - |
1309 | - |
1310 | -class InvalidRecordError(ContainerError): |
1311 | - |
1312 | - _fmt = "Invalid record: %(reason)s" |
1313 | - |
1314 | - def __init__(self, reason): |
1315 | - self.reason = reason |
1316 | - |
1317 | - |
1318 | -class ContainerHasExcessDataError(ContainerError): |
1319 | - |
1320 | - _fmt = "Container has data after end marker: %(excess)r" |
1321 | - |
1322 | - def __init__(self, excess): |
1323 | - self.excess = excess |
1324 | - |
1325 | - |
1326 | -class DuplicateRecordNameError(ContainerError): |
1327 | - |
1328 | - _fmt = "Container has multiple records with the same name: %(name)s" |
1329 | - |
1330 | - def __init__(self, name): |
1331 | - self.name = name.decode("utf-8") |
1332 | - |
1333 | - |
1334 | class RepositoryDataStreamError(BzrError): |
1335 | |
1336 | _fmt = "Corrupt or incompatible data stream: %(reason)s" |
1337 | @@ -2159,14 +2006,6 @@ |
1338 | self.user_encoding = get_user_encoding() |
1339 | |
1340 | |
1341 | -class NoSuchAlias(BzrError): |
1342 | - |
1343 | - _fmt = ('The alias "%(alias_name)s" does not exist.') |
1344 | - |
1345 | - def __init__(self, alias_name): |
1346 | - BzrError.__init__(self, alias_name=alias_name) |
1347 | - |
1348 | - |
1349 | class CannotBindAddress(BzrError): |
1350 | |
1351 | _fmt = 'Cannot bind address "%(host)s:%(port)i": %(orig_error)s.' |
1352 | @@ -2248,14 +2087,6 @@ |
1353 | self.target_branch = target_branch |
1354 | |
1355 | |
1356 | -class NoColocatedBranchSupport(BzrError): |
1357 | - |
1358 | - _fmt = ("%(controldir)r does not support co-located branches.") |
1359 | - |
1360 | - def __init__(self, controldir): |
1361 | - self.controldir = controldir |
1362 | - |
1363 | - |
1364 | class RecursiveBind(BzrError): |
1365 | |
1366 | _fmt = ('Branch "%(branch_url)s" appears to be bound to itself. ' |
1367 | |
1368 | === modified file 'breezy/git/refs.py' |
1369 | --- breezy/git/refs.py 2020-02-18 01:57:45 +0000 |
1370 | +++ breezy/git/refs.py 2022-07-16 17:54:02 +0000 |
1371 | @@ -26,6 +26,7 @@ |
1372 | ) |
1373 | |
1374 | from .. import ( |
1375 | + controldir, |
1376 | errors, |
1377 | osutils, |
1378 | revision as _mod_revision, |
1379 | @@ -132,7 +133,7 @@ |
1380 | def _get_revid_by_branch_name(self, branch_name): |
1381 | try: |
1382 | branch = self.dir.open_branch(branch_name) |
1383 | - except errors.NoColocatedBranchSupport: |
1384 | + except controldir.NoColocatedBranchSupport: |
1385 | if branch_name in ("HEAD", "master"): |
1386 | branch = self.dir.open_branch() |
1387 | else: |
1388 | |
1389 | === modified file 'breezy/plugins/weave_fmt/branch.py' |
1390 | --- breezy/plugins/weave_fmt/branch.py 2021-12-25 14:55:24 +0000 |
1391 | +++ breezy/plugins/weave_fmt/branch.py 2022-07-16 17:54:02 +0000 |
1392 | @@ -17,6 +17,7 @@ |
1393 | """Weave-era branch implementations.""" |
1394 | |
1395 | from ... import ( |
1396 | + controldir as _mod_controldir, |
1397 | errors, |
1398 | lockable_files, |
1399 | ) |
1400 | @@ -196,7 +197,7 @@ |
1401 | if name is None: |
1402 | name = a_controldir._get_selected_branch() |
1403 | if name != "": |
1404 | - raise errors.NoColocatedBranchSupport(self) |
1405 | + raise _mod_controldir.NoColocatedBranchSupport(self) |
1406 | if not _found: |
1407 | # we are being called directly and must probe. |
1408 | raise NotImplementedError |
1409 | |
1410 | === modified file 'breezy/plugins/weave_fmt/bzrdir.py' |
1411 | --- breezy/plugins/weave_fmt/bzrdir.py 2020-05-06 02:13:25 +0000 |
1412 | +++ breezy/plugins/weave_fmt/bzrdir.py 2022-07-16 17:54:02 +0000 |
1413 | @@ -27,6 +27,7 @@ |
1414 | ControlDir, |
1415 | Converter, |
1416 | MustHaveWorkingTree, |
1417 | + NoColocatedBranchSupport, |
1418 | format_registry, |
1419 | ) |
1420 | from ... import ( |
1421 | @@ -841,7 +842,7 @@ |
1422 | def get_branch_transport(self, branch_format, name=None): |
1423 | """See BzrDir.get_branch_transport().""" |
1424 | if name: |
1425 | - raise errors.NoColocatedBranchSupport(self) |
1426 | + raise NoColocatedBranchSupport(self) |
1427 | if branch_format is None: |
1428 | return self.transport |
1429 | try: |
1430 | @@ -923,7 +924,7 @@ |
1431 | def set_branch_reference(self, target_branch, name=None): |
1432 | from ...bzr.branch import BranchReferenceFormat |
1433 | if name is not None: |
1434 | - raise errors.NoColocatedBranchSupport(self) |
1435 | + raise NoColocatedBranchSupport(self) |
1436 | raise errors.IncompatibleFormat(BranchReferenceFormat, self._format) |
1437 | |
1438 | |
1439 | |
1440 | === modified file 'breezy/tests/per_controldir_colo/test_unsupported.py' |
1441 | --- breezy/tests/per_controldir_colo/test_unsupported.py 2018-11-18 19:48:57 +0000 |
1442 | +++ breezy/tests/per_controldir_colo/test_unsupported.py 2022-07-16 17:54:02 +0000 |
1443 | @@ -21,6 +21,7 @@ |
1444 | """ |
1445 | |
1446 | from breezy import ( |
1447 | + controldir, |
1448 | errors, |
1449 | tests, |
1450 | ) |
1451 | @@ -53,28 +54,28 @@ |
1452 | # Colocated branches should not be supported *or* |
1453 | # destroy_branch should not be supported at all |
1454 | self.assertRaises( |
1455 | - (errors.NoColocatedBranchSupport, errors.UnsupportedOperation), |
1456 | + (controldir.NoColocatedBranchSupport, errors.UnsupportedOperation), |
1457 | branch.controldir.destroy_branch, 'colo') |
1458 | |
1459 | def test_create_colo_branch(self): |
1460 | made_control = self.make_controldir_with_repo() |
1461 | - self.assertRaises(errors.NoColocatedBranchSupport, |
1462 | + self.assertRaises(controldir.NoColocatedBranchSupport, |
1463 | made_control.create_branch, "colo") |
1464 | |
1465 | def test_open_branch(self): |
1466 | made_control = self.make_controldir_with_repo() |
1467 | - self.assertRaises(errors.NoColocatedBranchSupport, |
1468 | + self.assertRaises(controldir.NoColocatedBranchSupport, |
1469 | made_control.open_branch, name="colo") |
1470 | |
1471 | def test_get_branch_reference(self): |
1472 | made_control = self.make_controldir_with_repo() |
1473 | - self.assertRaises(errors.NoColocatedBranchSupport, |
1474 | + self.assertRaises(controldir.NoColocatedBranchSupport, |
1475 | made_control.get_branch_reference, "colo") |
1476 | |
1477 | def test_set_branch_reference(self): |
1478 | referenced = self.make_branch('referenced') |
1479 | made_control = self.make_controldir_with_repo() |
1480 | - self.assertRaises(errors.NoColocatedBranchSupport, |
1481 | + self.assertRaises(controldir.NoColocatedBranchSupport, |
1482 | made_control.set_branch_reference, referenced, name="colo") |
1483 | |
1484 | def test_get_branches(self): |
1485 | |
1486 | === modified file 'breezy/tests/per_workingtree/test_merge_from_branch.py' |
1487 | --- breezy/tests/per_workingtree/test_merge_from_branch.py 2021-03-14 20:18:53 +0000 |
1488 | +++ breezy/tests/per_workingtree/test_merge_from_branch.py 2022-07-16 17:54:02 +0000 |
1489 | @@ -24,6 +24,7 @@ |
1490 | errors, |
1491 | merge, |
1492 | ) |
1493 | +from breezy.workingtree import PointlessMerge |
1494 | from breezy.tests import per_workingtree |
1495 | |
1496 | |
1497 | @@ -95,7 +96,7 @@ |
1498 | tree_a.commit('deleted file') |
1499 | self.build_tree_contents([('tree_b/file', b'text-b')]) |
1500 | tree_b.commit('changed file') |
1501 | - self.assertRaises(errors.PointlessMerge, tree_a.merge_from_branch, |
1502 | + self.assertRaises(PointlessMerge, tree_a.merge_from_branch, |
1503 | tree_b.branch, from_revision=tree_b.branch.last_revision()) |
1504 | tree_a.merge_from_branch(tree_b.branch, from_revision=rev1) |
1505 | tree_a.lock_read() |
1506 | |
1507 | === modified file 'breezy/tests/test_errors.py' |
1508 | --- breezy/tests/test_errors.py 2021-11-13 13:06:59 +0000 |
1509 | +++ breezy/tests/test_errors.py 2022-07-16 17:54:02 +0000 |
1510 | @@ -166,13 +166,6 @@ |
1511 | str(error)) |
1512 | self.assertFalse(error.internal_error) |
1513 | |
1514 | - def test_too_many_concurrent_requests(self): |
1515 | - error = errors.TooManyConcurrentRequests("a medium") |
1516 | - self.assertEqualDiff("The medium 'a medium' has reached its concurrent " |
1517 | - "request limit. Be sure to finish_writing and finish_reading on " |
1518 | - "the currently open request.", |
1519 | - str(error)) |
1520 | - |
1521 | def test_unstackable_location(self): |
1522 | error = errors.UnstackableLocationError('foo', 'bar') |
1523 | self.assertEqualDiff("The branch 'foo' cannot be stacked on 'bar'.", |
1524 | @@ -293,47 +286,6 @@ |
1525 | "Could not understand response from smart server: ('not yes',)", |
1526 | str(e)) |
1527 | |
1528 | - def test_unknown_container_format(self): |
1529 | - """Test the formatting of UnknownContainerFormatError.""" |
1530 | - e = errors.UnknownContainerFormatError('bad format string') |
1531 | - self.assertEqual( |
1532 | - "Unrecognised container format: 'bad format string'", |
1533 | - str(e)) |
1534 | - |
1535 | - def test_unexpected_end_of_container(self): |
1536 | - """Test the formatting of UnexpectedEndOfContainerError.""" |
1537 | - e = errors.UnexpectedEndOfContainerError() |
1538 | - self.assertEqual( |
1539 | - "Unexpected end of container stream", str(e)) |
1540 | - |
1541 | - def test_unknown_record_type(self): |
1542 | - """Test the formatting of UnknownRecordTypeError.""" |
1543 | - e = errors.UnknownRecordTypeError("X") |
1544 | - self.assertEqual( |
1545 | - "Unknown record type: 'X'", |
1546 | - str(e)) |
1547 | - |
1548 | - def test_invalid_record(self): |
1549 | - """Test the formatting of InvalidRecordError.""" |
1550 | - e = errors.InvalidRecordError("xxx") |
1551 | - self.assertEqual( |
1552 | - "Invalid record: xxx", |
1553 | - str(e)) |
1554 | - |
1555 | - def test_container_has_excess_data(self): |
1556 | - """Test the formatting of ContainerHasExcessDataError.""" |
1557 | - e = errors.ContainerHasExcessDataError("excess bytes") |
1558 | - self.assertEqual( |
1559 | - "Container has data after end marker: 'excess bytes'", |
1560 | - str(e)) |
1561 | - |
1562 | - def test_duplicate_record_name_error(self): |
1563 | - """Test the formatting of DuplicateRecordNameError.""" |
1564 | - e = errors.DuplicateRecordNameError(b"n\xc3\xa5me") |
1565 | - self.assertEqual( |
1566 | - u"Container has multiple records with the same name: n\xe5me", |
1567 | - str(e)) |
1568 | - |
1569 | def test_check_error(self): |
1570 | e = errors.BzrCheckError('example check failure') |
1571 | self.assertEqual( |
1572 | @@ -384,27 +336,6 @@ |
1573 | self.assertEqual( |
1574 | "Error received from smart server: ('error', 'tuple')", str(err)) |
1575 | |
1576 | - def test_untranslateable_error_from_smart_server(self): |
1577 | - error_tuple = ('error', 'tuple') |
1578 | - orig_err = errors.ErrorFromSmartServer(error_tuple) |
1579 | - err = errors.UnknownErrorFromSmartServer(orig_err) |
1580 | - self.assertEqual( |
1581 | - "Server sent an unexpected error: ('error', 'tuple')", str(err)) |
1582 | - |
1583 | - def test_smart_message_handler_error(self): |
1584 | - # Make an exc_info tuple. |
1585 | - try: |
1586 | - raise Exception("example error") |
1587 | - except Exception: |
1588 | - err = errors.SmartMessageHandlerError(sys.exc_info()) |
1589 | - # GZ 2010-11-08: Should not store exc_info in exception instances. |
1590 | - try: |
1591 | - self.assertStartsWith( |
1592 | - str(err), "The message handler raised an exception:\n") |
1593 | - self.assertEndsWith(str(err), "Exception: example error\n") |
1594 | - finally: |
1595 | - del err |
1596 | - |
1597 | def test_unresumable_write_group(self): |
1598 | repo = "dummy repo" |
1599 | wg_tokens = ['token'] |
1600 | @@ -439,14 +370,6 @@ |
1601 | 'Please use `brz unbind` to fix.') |
1602 | self.assertEqualDiff(msg, str(error)) |
1603 | |
1604 | - def test_retry_with_new_packs(self): |
1605 | - fake_exc_info = ('{exc type}', '{exc value}', '{exc traceback}') |
1606 | - error = errors.RetryWithNewPacks( |
1607 | - '{context}', reload_occurred=False, exc_info=fake_exc_info) |
1608 | - self.assertEqual( |
1609 | - 'Pack files have changed, reload and retry. context: ' |
1610 | - '{context} {exc value}', str(error)) |
1611 | - |
1612 | |
1613 | class PassThroughError(errors.BzrError): |
1614 | |
1615 | |
1616 | === modified file 'breezy/tests/test_foreign.py' |
1617 | --- breezy/tests/test_foreign.py 2020-02-18 03:11:01 +0000 |
1618 | +++ breezy/tests/test_foreign.py 2022-07-16 17:54:02 +0000 |
1619 | @@ -326,7 +326,7 @@ |
1620 | if name is None: |
1621 | name = self._get_selected_branch() |
1622 | if name != "": |
1623 | - raise errors.NoColocatedBranchSupport(self) |
1624 | + raise controldir.NoColocatedBranchSupport(self) |
1625 | return self._format.get_branch_format().open(self, _found=True) |
1626 | |
1627 | def cloning_metadir(self, stacked=False): |
1628 | |
1629 | === modified file 'breezy/tests/test_merge.py' |
1630 | --- breezy/tests/test_merge.py 2022-07-02 15:30:16 +0000 |
1631 | +++ breezy/tests/test_merge.py 2022-07-16 17:54:02 +0000 |
1632 | @@ -44,7 +44,7 @@ |
1633 | TestCaseWithTransport, |
1634 | test_merge_core, |
1635 | ) |
1636 | -from ..workingtree import WorkingTree |
1637 | +from ..workingtree import WorkingTree, PointlessMerge |
1638 | |
1639 | |
1640 | class TestMerge(TestCaseWithTransport): |
1641 | @@ -54,7 +54,7 @@ |
1642 | wt = self.make_branch_and_tree('.') |
1643 | rev_a = wt.commit("lala!") |
1644 | self.assertEqual([rev_a], wt.get_parent_ids()) |
1645 | - self.assertRaises(errors.PointlessMerge, wt.merge_from_branch, |
1646 | + self.assertRaises(PointlessMerge, wt.merge_from_branch, |
1647 | wt.branch) |
1648 | self.assertEqual([rev_a], wt.get_parent_ids()) |
1649 | return wt |
1650 | |
1651 | === modified file 'breezy/workingtree.py' |
1652 | --- breezy/workingtree.py 2022-07-09 20:29:40 +0000 |
1653 | +++ breezy/workingtree.py 2022-07-16 17:54:02 +0000 |
1654 | @@ -75,6 +75,11 @@ |
1655 | _fmt = "This format does not support shelving changes." |
1656 | |
1657 | |
1658 | +class PointlessMerge(errors.BzrError): |
1659 | + |
1660 | + _fmt = "Nothing to merge." |
1661 | + |
1662 | + |
1663 | class WorkingTree(mutabletree.MutableTree, ControlComponent): |
1664 | """Working copy tree. |
1665 | |
1666 | @@ -683,7 +688,7 @@ |
1667 | else: |
1668 | merger.set_base_revision(from_revision, branch) |
1669 | if merger.base_rev_id == merger.other_rev_id: |
1670 | - raise errors.PointlessMerge |
1671 | + raise PointlessMerge() |
1672 | merger.backup_files = False |
1673 | if merge_type is None: |
1674 | merger.merge_type = Merge3Merger |
Running landing tests failed /ci.breezy- vcs.org/ job/brz/ job/brz- land/1000/
https:/