Merge lp:~jelmer/brz/move-errors into lp:brz

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
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 :
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

Subscribers

People subscribed via source and target branches