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

Proposed by Jelmer Vernooij
Status: Merged
Merged at revision: 6740
Proposed branch: lp:~jelmer/brz/move-errors-views
Merge into: lp:brz
Diff against target: 1186 lines (+297/-254)
24 files modified
breezy/builtins.py (+3/-3)
breezy/bzr/smart/medium.py (+16/-3)
breezy/bzr/smart/request.py (+9/-0)
breezy/bzr/smart/vfs.py (+1/-1)
breezy/commands.py (+29/-5)
breezy/errors.py (+0/-153)
breezy/mail_client.py (+30/-8)
breezy/shelf.py (+24/-4)
breezy/shelf_ui.py (+1/-1)
breezy/smtp_connection.py (+31/-4)
breezy/tests/__init__.py (+1/-0)
breezy/tests/per_workingtree/test_views.py (+19/-19)
breezy/tests/test_errors.py (+0/-27)
breezy/tests/test_mail_client.py (+2/-2)
breezy/tests/test_shelf.py (+11/-2)
breezy/tests/test_shelf_ui.py (+2/-1)
breezy/tests/test_smart_request.py (+8/-0)
breezy/tests/test_smart_transport.py (+1/-1)
breezy/tests/test_smtp_connection.py (+8/-8)
breezy/tests/test_treebuilder.py (+8/-4)
breezy/tests/test_views.py (+44/-0)
breezy/treebuilder.py (+12/-2)
breezy/views.py (+36/-5)
breezy/workingtree.py (+1/-1)
To merge this branch: bzr merge lp:~jelmer/brz/move-errors-views
Reviewer Review Type Date Requested Status
Martin Packman Approve
Review via email: mp+327933@code.launchpad.net

Commit message

Move a few more errors out of breezy.errors.

Description of the change

Move a few more errors to their respective modules, out of breezy.errors:

 * views
 * shelf
 * smtp

To post a comment you must log in.
Revision history for this message
Martin Packman (gz) wrote :

Changes look okay.

review: Approve

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 2017-07-21 14:18:24 +0000
3+++ breezy/builtins.py 2017-07-23 16:06:20 +0000
4@@ -245,7 +245,7 @@
5 if view_files:
6 for filename in file_list:
7 if not osutils.is_inside_any(view_files, filename):
8- raise errors.FileOutsideView(filename, view_files)
9+ raise views.FileOutsideView(filename, view_files)
10 file_list = file_list[:]
11 file_list[0] = tree.abspath(relpath)
12 else:
13@@ -299,7 +299,7 @@
14 current_view = tree.views.get_view_info()[0]
15 if current_view is not None:
16 view_info = (current_view, tree.views.lookup_view())
17- except errors.ViewsNotSupported:
18+ except views.ViewsNotSupported:
19 pass
20 return view_info
21
22@@ -3040,7 +3040,7 @@
23 else:
24 fullpath = fp
25 views.check_path_in_view(tree, fullpath)
26- except errors.FileOutsideView:
27+ except views.FileOutsideView:
28 continue
29
30 # Output the entry
31
32=== modified file 'breezy/bzr/smart/medium.py'
33--- breezy/bzr/smart/medium.py 2017-06-11 20:15:04 +0000
34+++ breezy/bzr/smart/medium.py 2017-07-23 16:06:20 +0000
35@@ -41,7 +41,6 @@
36
37 from breezy import (
38 debug,
39- errors,
40 trace,
41 transport,
42 ui,
43@@ -51,7 +50,10 @@
44 from breezy.bzr.smart import client, protocol, request, signals, vfs
45 from breezy.transport import ssh
46 """)
47-from ... import osutils
48+from ... import (
49+ errors,
50+ osutils,
51+ )
52
53 # Throughout this module buffer size parameters are either limited to be at
54 # most _MAX_READ_SIZE, or are ignored and _MAX_READ_SIZE is used instead.
55@@ -59,6 +61,17 @@
56 # from non-sockets as well.
57 _MAX_READ_SIZE = osutils.MAX_SOCKET_CHUNK
58
59+
60+class HpssVfsRequestNotAllowed(errors.BzrError):
61+
62+ _fmt = ("VFS requests over the smart server are not allowed. Encountered: "
63+ "%(method)s, %(arguments)s.")
64+
65+ def __init__(self, method, arguments):
66+ self.method = method
67+ self.arguments = arguments
68+
69+
70 def _get_protocol_factory_for_bytes(bytes):
71 """Determine the right protocol factory for 'bytes'.
72
73@@ -656,7 +669,7 @@
74 # A method we don't know about doesn't count as a VFS method.
75 return
76 if issubclass(request_method, vfs.VfsRequest):
77- raise errors.HpssVfsRequestNotAllowed(params.method, params.args)
78+ raise HpssVfsRequestNotAllowed(params.method, params.args)
79
80
81 class _DebugCounter(object):
82
83=== modified file 'breezy/bzr/smart/request.py'
84--- breezy/bzr/smart/request.py 2017-06-11 20:15:04 +0000
85+++ breezy/bzr/smart/request.py 2017-07-23 16:06:20 +0000
86@@ -58,6 +58,15 @@
87 jail_info.transports = None
88
89
90+class DisabledMethod(errors.InternalBzrError):
91+
92+ _fmt = "The smart server method '%(class_name)s' is disabled."
93+
94+ def __init__(self, class_name):
95+ errors.BzrError.__init__(self)
96+ self.class_name = class_name
97+
98+
99 def _install_hook():
100 bzrdir.BzrDir.hooks.install_named_hook(
101 'pre_open', _pre_open_hook, 'checking server jail')
102
103=== modified file 'breezy/bzr/smart/vfs.py'
104--- breezy/bzr/smart/vfs.py 2017-06-11 20:15:04 +0000
105+++ breezy/bzr/smart/vfs.py 2017-07-23 16:06:20 +0000
106@@ -60,7 +60,7 @@
107
108 def _check_enabled(self):
109 if not vfs_enabled():
110- raise errors.DisabledMethod(self.__class__.__name__)
111+ raise request.DisabledMethod(self.__class__.__name__)
112
113 def translate_client_path(self, relpath):
114 # VFS requests are made with escaped paths so the escaping done in
115
116=== modified file 'breezy/commands.py'
117--- breezy/commands.py 2017-07-20 00:00:04 +0000
118+++ breezy/commands.py 2017-07-23 16:06:20 +0000
119@@ -61,6 +61,27 @@
120 _fmt = "Error in command line options"
121
122
123+class CommandAvailableInPlugin(Exception):
124+
125+ internal_error = False
126+
127+ def __init__(self, cmd_name, plugin_metadata, provider):
128+
129+ self.plugin_metadata = plugin_metadata
130+ self.cmd_name = cmd_name
131+ self.provider = provider
132+
133+ def __str__(self):
134+
135+ _fmt = ('"%s" is not a standard brz command. \n'
136+ 'However, the following official plugin provides this command: %s\n'
137+ 'You can install it by going to: %s'
138+ % (self.cmd_name, self.plugin_metadata['name'],
139+ self.plugin_metadata['url']))
140+
141+ return _fmt
142+
143+
144 class CommandInfo(object):
145 """Information about a command."""
146
147@@ -325,13 +346,16 @@
148 return cmd
149
150
151+class NoPluginAvailable(errors.BzrError):
152+ pass
153+
154+
155 def _try_plugin_provider(cmd_name):
156 """Probe for a plugin provider having cmd_name."""
157 try:
158 plugin_metadata, provider = probe_for_provider(cmd_name)
159- raise errors.CommandAvailableInPlugin(cmd_name,
160- plugin_metadata, provider)
161- except errors.NoPluginAvailable:
162+ raise CommandAvailableInPlugin(cmd_name, plugin_metadata, provider)
163+ except NoPluginAvailable:
164 pass
165
166
167@@ -346,9 +370,9 @@
168 for provider in command_providers_registry:
169 try:
170 return provider.plugin_for_command(cmd_name), provider
171- except errors.NoPluginAvailable:
172+ except NoPluginAvailable:
173 pass
174- raise errors.NoPluginAvailable(cmd_name)
175+ raise NoPluginAvailable(cmd_name)
176
177
178 def _get_bzr_command(cmd_or_None, cmd_name):
179
180=== modified file 'breezy/errors.py'
181--- breezy/errors.py 2017-07-21 14:18:24 +0000
182+++ breezy/errors.py 2017-07-23 16:06:20 +0000
183@@ -146,11 +146,6 @@
184 internal_error = True
185
186
187-class AlreadyBuilding(BzrError):
188-
189- _fmt = "The tree builder is already building a tree."
190-
191-
192 class BranchError(BzrError):
193 """Base class for concrete 'errors about a branch'."""
194
195@@ -177,15 +172,6 @@
196 self.msg = msg
197
198
199-class DisabledMethod(InternalBzrError):
200-
201- _fmt = "The smart server method '%(class_name)s' is disabled."
202-
203- def __init__(self, class_name):
204- BzrError.__init__(self)
205- self.class_name = class_name
206-
207-
208 class IncompatibleVersion(BzrError):
209
210 _fmt = 'API %(api)s is not compatible; one of versions %(wanted)r '\
211@@ -301,11 +287,6 @@
212 self.base = base
213
214
215-class NotBuilding(BzrError):
216-
217- _fmt = "Not currently building a tree."
218-
219-
220 class NotLocalUrl(BzrError):
221
222 _fmt = "%(url)s is not a local path."
223@@ -2503,11 +2484,6 @@
224 self.name = name.decode("utf-8")
225
226
227-class NoDestinationAddress(InternalBzrError):
228-
229- _fmt = "Message does not have a destination address."
230-
231-
232 class RepositoryDataStreamError(BzrError):
233
234 _fmt = "Corrupt or incompatible data stream: %(reason)s"
235@@ -2516,48 +2492,6 @@
236 self.reason = reason
237
238
239-class SMTPError(BzrError):
240-
241- _fmt = "SMTP error: %(error)s"
242-
243- def __init__(self, error):
244- self.error = error
245-
246-
247-class NoMessageSupplied(BzrError):
248-
249- _fmt = "No message supplied."
250-
251-
252-class NoMailAddressSpecified(BzrError):
253-
254- _fmt = "No mail-to address (--mail-to) or output (-o) specified."
255-
256-
257-class MailClientNotFound(BzrError):
258-
259- _fmt = "Unable to find mail client with the following names:"\
260- " %(mail_command_list_string)s"
261-
262- def __init__(self, mail_command_list):
263- mail_command_list_string = ', '.join(mail_command_list)
264- BzrError.__init__(self, mail_command_list=mail_command_list,
265- mail_command_list_string=mail_command_list_string)
266-
267-class SMTPConnectionRefused(SMTPError):
268-
269- _fmt = "SMTP connection to %(host)s refused"
270-
271- def __init__(self, error, host):
272- self.error = error
273- self.host = host
274-
275-
276-class DefaultSMTPConnectionRefused(SMTPConnectionRefused):
277-
278- _fmt = "Please specify smtp_server. No server at default %(host)s."
279-
280-
281 class BzrDirError(BzrError):
282
283 def __init__(self, controldir):
284@@ -2708,31 +2642,6 @@
285 self.timezone = timezone
286
287
288-class CommandAvailableInPlugin(Exception):
289-
290- internal_error = False
291-
292- def __init__(self, cmd_name, plugin_metadata, provider):
293-
294- self.plugin_metadata = plugin_metadata
295- self.cmd_name = cmd_name
296- self.provider = provider
297-
298- def __str__(self):
299-
300- _fmt = ('"%s" is not a standard brz command. \n'
301- 'However, the following official plugin provides this command: %s\n'
302- 'You can install it by going to: %s'
303- % (self.cmd_name, self.plugin_metadata['name'],
304- self.plugin_metadata['url']))
305-
306- return _fmt
307-
308-
309-class NoPluginAvailable(BzrError):
310- pass
311-
312-
313 class UnableEncodePath(BzrError):
314
315 _fmt = ('Unable to encode %(kind)s path %(path)r in '
316@@ -2804,11 +2713,6 @@
317 self.msg = msg
318
319
320-class ShelfCorrupt(BzrError):
321-
322- _fmt = "Shelf corrupt."
323-
324-
325 class DecompressCorruption(BzrError):
326
327 _fmt = "Corruption while decompressing repository file%(orig_error)s"
328@@ -2821,22 +2725,6 @@
329 BzrError.__init__(self)
330
331
332-class NoSuchShelfId(BzrError):
333-
334- _fmt = 'No changes are shelved with id "%(shelf_id)d".'
335-
336- def __init__(self, shelf_id):
337- BzrError.__init__(self, shelf_id=shelf_id)
338-
339-
340-class InvalidShelfId(BzrError):
341-
342- _fmt = '"%(invalid_id)s" is not a valid shelf id, try a number instead.'
343-
344- def __init__(self, invalid_id):
345- BzrError.__init__(self, invalid_id=invalid_id)
346-
347-
348 class JailBreak(BzrError):
349
350 _fmt = "An attempt to access a url outside the server jail was made: '%(url)s'."
351@@ -2858,37 +2746,6 @@
352 BzrError.__init__(self, format=format, url=url)
353
354
355-class NoSuchView(BzrError):
356- """A view does not exist.
357- """
358-
359- _fmt = u"No such view: %(view_name)s."
360-
361- def __init__(self, view_name):
362- self.view_name = view_name
363-
364-
365-class ViewsNotSupported(BzrError):
366- """Views are not supported by a tree format.
367- """
368-
369- _fmt = ("Views are not supported by %(tree)s;"
370- " use 'brz upgrade' to change your tree to a later format.")
371-
372- def __init__(self, tree):
373- self.tree = tree
374-
375-
376-class FileOutsideView(BzrError):
377-
378- _fmt = ('Specified file "%(file_name)s" is outside the current view: '
379- '%(view_str)s')
380-
381- def __init__(self, file_name, view_files):
382- self.file_name = file_name
383- self.view_str = ", ".join(view_files)
384-
385-
386 class UnresumableWriteGroup(BzrError):
387
388 _fmt = ("Repository %(repository)s cannot resume write group "
389@@ -2953,16 +2810,6 @@
390 self.branch_url = branch_url
391
392
393-class HpssVfsRequestNotAllowed(BzrError):
394-
395- _fmt = ("VFS requests over the smart server are not allowed. Encountered: "
396- "%(method)s, %(arguments)s.")
397-
398- def __init__(self, method, arguments):
399- self.method = method
400- self.arguments = arguments
401-
402-
403 class UnsupportedKindChange(BzrError):
404
405 _fmt = ("Kind change from %(from_kind)s to %(to_kind)s for "
406
407=== modified file 'breezy/mail_client.py'
408--- breezy/mail_client.py 2017-06-05 20:48:31 +0000
409+++ breezy/mail_client.py 2017-07-23 16:06:20 +0000
410@@ -36,6 +36,28 @@
411 mail_client_registry = registry.Registry()
412
413
414+class MailClientNotFound(errors.BzrError):
415+
416+ _fmt = "Unable to find mail client with the following names:"\
417+ " %(mail_command_list_string)s"
418+
419+ def __init__(self, mail_command_list):
420+ mail_command_list_string = ', '.join(mail_command_list)
421+ errors.BzrError.__init__(
422+ self, mail_command_list=mail_command_list,
423+ mail_command_list_string=mail_command_list_string)
424+
425+
426+class NoMessageSupplied(errors.BzrError):
427+
428+ _fmt = "No message supplied."
429+
430+
431+class NoMailAddressSpecified(errors.BzrError):
432+
433+ _fmt = "No mail-to address (--mail-to) or output (-o) specified."
434+
435+
436 class MailClient(object):
437 """A mail client that can send messages with attachements."""
438
439@@ -107,10 +129,10 @@
440 extension, basename=None, body=None):
441 """See MailClient.compose"""
442 if not to:
443- raise errors.NoMailAddressSpecified()
444+ raise NoMailAddressSpecified()
445 body = msgeditor.edit_commit_message(prompt, start_message=body)
446 if body == '':
447- raise errors.NoMessageSupplied()
448+ raise NoMessageSupplied()
449 email_message.EmailMessage.send(self.config,
450 self.config.get('email'),
451 to,
452@@ -190,7 +212,7 @@
453 else:
454 break
455 else:
456- raise errors.MailClientNotFound(self._client_commands)
457+ raise MailClientNotFound(self._client_commands)
458
459 def _get_compose_commandline(self, to, subject, attach_path, body):
460 """Determine the commandline to use for composing a message
461@@ -365,7 +387,7 @@
462 'body=' + urlutils.quote(self._encode_safe(body)))
463 # to must be supplied for the claws-mail --compose syntax to work.
464 if to is None:
465- raise errors.NoMailAddressSpecified()
466+ raise NoMailAddressSpecified()
467 compose_url = 'mailto:%s?%s' % (
468 self._encode_safe(to), '&'.join(compose_url))
469 # Collect command-line options.
470@@ -396,7 +418,7 @@
471 def _get_compose_commandline(self, to, subject, attach_path, body=None):
472 """See ExternalMailClient._get_compose_commandline"""
473 if not to:
474- raise errors.NoMailAddressSpecified()
475+ raise NoMailAddressSpecified()
476 commandline = [self._encode_safe(to)]
477 if subject is not None:
478 commandline.extend(['--subject', self._encode_safe(subject)])
479@@ -535,7 +557,7 @@
480 attach_path)
481 except simplemapi.MAPIError as e:
482 if e.code != simplemapi.MAPI_USER_ABORT:
483- raise errors.MailClientNotFound(['MAPI supported mail client'
484+ raise MailClientNotFound(['MAPI supported mail client'
485 ' (error %d)' % (e.code,)])
486 mail_client_registry.register('mapi', MAPIClient,
487 help=MAPIClient.__doc__)
488@@ -620,7 +642,7 @@
489 return self._mail_client().compose(prompt, to, subject,
490 attachment, mime_subtype,
491 extension, basename, body)
492- except errors.MailClientNotFound:
493+ except MailClientNotFound:
494 return Editor(self.config).compose(prompt, to, subject,
495 attachment, mime_subtype, extension, body)
496
497@@ -630,7 +652,7 @@
498 try:
499 return self._mail_client().compose_merge_request(to, subject,
500 directive, basename=basename, body=body)
501- except errors.MailClientNotFound:
502+ except MailClientNotFound:
503 return Editor(self.config).compose_merge_request(to, subject,
504 directive, basename=basename, body=body)
505 mail_client_registry.register('default', DefaultMail,
506
507=== modified file 'breezy/shelf.py'
508--- breezy/shelf.py 2017-06-24 13:32:35 +0000
509+++ breezy/shelf.py 2017-07-23 16:06:20 +0000
510@@ -19,11 +19,11 @@
511 import errno
512 import re
513
514+from . import errors
515 from .lazy_import import lazy_import
516 lazy_import(globals(), """
517 from breezy import (
518 bencode,
519- errors,
520 merge,
521 merge3,
522 transform,
523@@ -34,6 +34,27 @@
524 """)
525
526
527+class ShelfCorrupt(errors.BzrError):
528+
529+ _fmt = "Shelf corrupt."
530+
531+
532+class NoSuchShelfId(errors.BzrError):
533+
534+ _fmt = 'No changes are shelved with id "%(shelf_id)d".'
535+
536+ def __init__(self, shelf_id):
537+ errors.BzrError.__init__(self, shelf_id=shelf_id)
538+
539+
540+class InvalidShelfId(errors.BzrError):
541+
542+ _fmt = '"%(invalid_id)s" is not a valid shelf id, try a number instead.'
543+
544+ def __init__(self, invalid_id):
545+ errors.BzrError.__init__(self, invalid_id=invalid_id)
546+
547+
548 class ShelfCreator(object):
549 """Create a transform to shelve objects and its inverse."""
550
551@@ -318,7 +339,7 @@
552 def parse_metadata(records):
553 names, metadata_bytes = next(records)
554 if names[0] != ('metadata',):
555- raise errors.ShelfCorrupt
556+ raise ShelfCorrupt
557 metadata = bencode.bdecode(metadata_bytes)
558 message = metadata.get('message')
559 if message is not None:
560@@ -409,8 +430,7 @@
561 except IOError as e:
562 if e.errno != errno.ENOENT:
563 raise
564- from . import errors
565- raise errors.NoSuchShelfId(shelf_id)
566+ raise NoSuchShelfId(shelf_id)
567
568 def get_unshelver(self, shelf_id):
569 """Return an unshelver for a given shelf_id.
570
571=== modified file 'breezy/shelf_ui.py'
572--- breezy/shelf_ui.py 2017-06-24 13:32:35 +0000
573+++ breezy/shelf_ui.py 2017-07-23 16:06:20 +0000
574@@ -398,7 +398,7 @@
575 try:
576 shelf_id = int(shelf_id)
577 except ValueError:
578- raise errors.InvalidShelfId(shelf_id)
579+ raise shelf.InvalidShelfId(shelf_id)
580 else:
581 shelf_id = manager.last_shelf()
582 if shelf_id is None:
583
584=== modified file 'breezy/smtp_connection.py'
585--- breezy/smtp_connection.py 2017-06-05 20:48:31 +0000
586+++ breezy/smtp_connection.py 2017-07-23 16:06:20 +0000
587@@ -28,10 +28,8 @@
588 osutils,
589 )
590 from .errors import (
591- NoDestinationAddress,
592- SMTPError,
593- DefaultSMTPConnectionRefused,
594- SMTPConnectionRefused,
595+ BzrError,
596+ InternalBzrError,
597 )
598
599
600@@ -49,6 +47,35 @@
601 ''')
602
603
604+class SMTPError(BzrError):
605+
606+ _fmt = "SMTP error: %(error)s"
607+
608+ def __init__(self, error):
609+ self.error = error
610+
611+
612+class SMTPConnectionRefused(SMTPError):
613+
614+ _fmt = "SMTP connection to %(host)s refused"
615+
616+ def __init__(self, error, host):
617+ self.error = error
618+ self.host = host
619+
620+
621+class DefaultSMTPConnectionRefused(SMTPConnectionRefused):
622+
623+ _fmt = "Please specify smtp_server. No server at default %(host)s."
624+
625+
626+
627+class NoDestinationAddress(InternalBzrError):
628+
629+ _fmt = "Message does not have a destination address."
630+
631+
632+
633 class SMTPConnection(object):
634 """Connect to an SMTP server and send an email.
635
636
637=== modified file 'breezy/tests/__init__.py'
638--- breezy/tests/__init__.py 2017-07-02 13:44:33 +0000
639+++ breezy/tests/__init__.py 2017-07-23 16:06:20 +0000
640@@ -4053,6 +4053,7 @@
641 'breezy.tests.test_version_info',
642 'breezy.tests.test_versionedfile',
643 'breezy.tests.test_vf_search',
644+ 'breezy.tests.test_views',
645 'breezy.tests.test_weave',
646 'breezy.tests.test_whitebox',
647 'breezy.tests.test_win32utils',
648
649=== modified file 'breezy/tests/per_workingtree/test_views.py'
650--- breezy/tests/per_workingtree/test_views.py 2017-05-22 00:56:52 +0000
651+++ breezy/tests/per_workingtree/test_views.py 2017-07-23 16:06:20 +0000
652@@ -21,7 +21,7 @@
653 """
654
655
656-from breezy import views, errors
657+from breezy import views as _mod_views
658 from breezy.tests import TestNotApplicable, TestSkipped
659 from breezy.workingtree import WorkingTree
660
661@@ -64,7 +64,7 @@
662 self.assertEqual(view_current, current)
663 self.assertEqual(view_dict, views)
664 # test setting a current view which does not exist
665- self.assertRaises(errors.NoSuchView,
666+ self.assertRaises(_mod_views.NoSuchView,
667 wt.views.set_view_info, 'yet-another', view_dict)
668 current, views = wt.views.get_view_info()
669 self.assertEqual(view_current, current)
670@@ -116,7 +116,7 @@
671 wt = self.make_branch_and_tree('wt')
672 try:
673 wt.views.lookup_view('opaque')
674- except errors.NoSuchView as e:
675+ except _mod_views.NoSuchView as e:
676 self.assertEqual(e.view_name, 'opaque')
677 self.assertEqual(str(e), 'No such view: opaque.')
678 else:
679@@ -130,15 +130,15 @@
680 # now try to delete it
681 wt.views.delete_view(view_name)
682 # now you can't look it up
683- self.assertRaises(errors.NoSuchView,
684+ self.assertRaises(_mod_views.NoSuchView,
685 wt.views.lookup_view, view_name)
686 # and it's not in the dictionary
687 self.assertEqual(wt.views.get_view_info()[1], {})
688 # and you can't remove it a second time
689- self.assertRaises(errors.NoSuchView,
690+ self.assertRaises(_mod_views.NoSuchView,
691 wt.views.delete_view, view_name)
692 # or remove a view that never existed
693- self.assertRaises(errors.NoSuchView,
694+ self.assertRaises(_mod_views.NoSuchView,
695 wt.views.delete_view, view_name + '2')
696
697 def test_check_path_in_view(self):
698@@ -148,14 +148,14 @@
699 view_current: ['dir-1'],
700 'other-name': ['dir-2']}
701 wt.views.set_view_info(view_current, view_dict)
702- self.assertEqual(views.check_path_in_view(wt, 'dir-1'), None)
703- self.assertEqual(views.check_path_in_view(wt, 'dir-1/sub'), None)
704- self.assertRaises(errors.FileOutsideView,
705- views.check_path_in_view, wt, 'dir-2')
706- self.assertRaises(errors.FileOutsideView,
707- views.check_path_in_view, wt, 'dir-2/sub')
708- self.assertRaises(errors.FileOutsideView,
709- views.check_path_in_view, wt, 'other')
710+ self.assertEqual(_mod_views.check_path_in_view(wt, 'dir-1'), None)
711+ self.assertEqual(_mod_views.check_path_in_view(wt, 'dir-1/sub'), None)
712+ self.assertRaises(_mod_views.FileOutsideView,
713+ _mod_views.check_path_in_view, wt, 'dir-2')
714+ self.assertRaises(_mod_views.FileOutsideView,
715+ _mod_views.check_path_in_view, wt, 'dir-2/sub')
716+ self.assertRaises(_mod_views.FileOutsideView,
717+ _mod_views.check_path_in_view, wt, 'other')
718
719
720 class TestUnsupportedViews(TestCaseWithWorkingTree):
721@@ -176,13 +176,13 @@
722
723 def test_view_methods_raise(self):
724 wt = self.make_branch_and_tree('wt')
725- self.assertRaises(errors.ViewsNotSupported,
726+ self.assertRaises(_mod_views.ViewsNotSupported,
727 wt.views.set_view_info, 'bar', {'bar': ['bars/']})
728- self.assertRaises(errors.ViewsNotSupported,
729+ self.assertRaises(_mod_views.ViewsNotSupported,
730 wt.views.get_view_info)
731- self.assertRaises(errors.ViewsNotSupported,
732+ self.assertRaises(_mod_views.ViewsNotSupported,
733 wt.views.lookup_view, 'foo')
734- self.assertRaises(errors.ViewsNotSupported,
735+ self.assertRaises(_mod_views.ViewsNotSupported,
736 wt.views.set_view, 'foo', 'bar')
737- self.assertRaises(errors.ViewsNotSupported,
738+ self.assertRaises(_mod_views.ViewsNotSupported,
739 wt.views.delete_view, 'foo')
740
741=== modified file 'breezy/tests/test_errors.py'
742--- breezy/tests/test_errors.py 2017-07-21 14:18:24 +0000
743+++ breezy/tests/test_errors.py 2017-07-23 16:06:20 +0000
744@@ -77,11 +77,6 @@
745 " appears to be corrupt: trailing garbage: \"x\"",
746 str(error))
747
748- def test_disabled_method(self):
749- error = errors.DisabledMethod("class name")
750- self.assertEqualDiff(
751- "The smart server method 'class name' is disabled.", str(error))
752-
753 def test_duplicate_file_id(self):
754 error = errors.DuplicateFileId('a_file_id', 'foo')
755 self.assertEqualDiff('File id {a_file_id} already exists in inventory'
756@@ -548,28 +543,6 @@
757 self.assertEqual(str(err), "Branching 'bar'(foo) must create a"
758 " working tree.")
759
760- def test_no_such_view(self):
761- err = errors.NoSuchView('foo')
762- self.assertEqual("No such view: foo.", str(err))
763-
764- def test_views_not_supported(self):
765- err = errors.ViewsNotSupported('atree')
766- err_str = str(err)
767- self.assertStartsWith(err_str, "Views are not supported by ")
768- self.assertEndsWith(err_str, "; use 'brz upgrade' to change your "
769- "tree to a later format.")
770-
771- def test_file_outside_view(self):
772- err = errors.FileOutsideView('baz', ['foo', 'bar'])
773- self.assertEqual('Specified file "baz" is outside the current view: '
774- 'foo, bar', str(err))
775-
776- def test_invalid_shelf_id(self):
777- invalid_id = "foo"
778- err = errors.InvalidShelfId(invalid_id)
779- self.assertEqual('"foo" is not a valid shelf id, '
780- 'try a number instead.', str(err))
781-
782 def test_unresumable_write_group(self):
783 repo = "dummy repo"
784 wg_tokens = ['token']
785
786=== modified file 'breezy/tests/test_mail_client.py'
787--- breezy/tests/test_mail_client.py 2017-05-22 00:56:52 +0000
788+++ breezy/tests/test_mail_client.py 2017-07-23 16:06:20 +0000
789@@ -118,7 +118,7 @@
790
791 def test_commandline(self):
792 xdg_email = mail_client.XDGEmail(None)
793- self.assertRaises(errors.NoMailAddressSpecified,
794+ self.assertRaises(mail_client.NoMailAddressSpecified,
795 xdg_email._get_compose_commandline,
796 None, None, 'file%')
797 commandline = xdg_email._get_compose_commandline(
798@@ -233,7 +233,7 @@
799
800 def test_to_required(self):
801 claws = mail_client.Claws(None)
802- self.assertRaises(errors.NoMailAddressSpecified,
803+ self.assertRaises(mail_client.NoMailAddressSpecified,
804 claws._get_compose_commandline,
805 None, None, 'file%')
806
807
808=== modified file 'breezy/tests/test_shelf.py'
809--- breezy/tests/test_shelf.py 2017-06-08 23:30:31 +0000
810+++ breezy/tests/test_shelf.py 2017-07-23 16:06:20 +0000
811@@ -43,6 +43,15 @@
812 "17:_removed_contentsle11:_removed_idle14:_tree_path_idsdeeE")
813
814
815+class TestErrors(tests.TestCase):
816+
817+ def test_invalid_shelf_id(self):
818+ invalid_id = "foo"
819+ err = shelf.InvalidShelfId(invalid_id)
820+ self.assertEqual('"foo" is not a valid shelf id, '
821+ 'try a number instead.', str(err))
822+
823+
824 class TestPrepareShelf(tests.TestCaseWithTransport):
825
826 def prepare_shelve_rename(self):
827@@ -622,7 +631,7 @@
828 'foo'))])
829 shelf_file = open('shelf', 'rb')
830 self.addCleanup(shelf_file.close)
831- e = self.assertRaises(errors.ShelfCorrupt,
832+ e = self.assertRaises(shelf.ShelfCorrupt,
833 shelf.Unshelver.from_tree_and_shelf, tree,
834 shelf_file)
835 self.assertEqual('Shelf corrupt.', str(e))
836@@ -733,7 +742,7 @@
837
838 def test_read_non_existant(self):
839 manager = self.get_manager()
840- e = self.assertRaises(errors.NoSuchShelfId, manager.read_shelf, 1)
841+ e = self.assertRaises(shelf.NoSuchShelfId, manager.read_shelf, 1)
842 self.assertEqual('No changes are shelved with id "1".', str(e))
843
844 def test_shelve_changes(self):
845
846=== modified file 'breezy/tests/test_shelf_ui.py'
847--- breezy/tests/test_shelf_ui.py 2017-05-22 00:56:52 +0000
848+++ breezy/tests/test_shelf_ui.py 2017-07-23 16:06:20 +0000
849@@ -23,6 +23,7 @@
850 errors,
851 shelf_ui,
852 revision,
853+ shelf,
854 tests,
855 )
856 from ..sixish import (
857@@ -568,7 +569,7 @@
858 shelf_file.write('garbage')
859 finally:
860 shelf_file.close()
861- self.assertRaises(errors.InvalidShelfId,
862+ self.assertRaises(shelf.InvalidShelfId,
863 shelf_ui.Unshelver.from_args, directory='tree',
864 action='delete-only', shelf_id='foo')
865
866
867=== modified file 'breezy/tests/test_smart_request.py'
868--- breezy/tests/test_smart_request.py 2017-06-11 20:15:04 +0000
869+++ breezy/tests/test_smart_request.py 2017-07-23 16:06:20 +0000
870@@ -90,6 +90,14 @@
871 self.jail_transports_log.append(request.jail_info.transports)
872
873
874+class ErrorTests(TestCase):
875+
876+ def test_disabled_method(self):
877+ error = request.DisabledMethod("class name")
878+ self.assertEqualDiff(
879+ "The smart server method 'class name' is disabled.", str(error))
880+
881+
882 class TestSmartRequest(TestCase):
883
884 def test_request_class_without_do_body(self):
885
886=== modified file 'breezy/tests/test_smart_transport.py'
887--- breezy/tests/test_smart_transport.py 2017-06-11 20:15:04 +0000
888+++ breezy/tests/test_smart_transport.py 2017-07-23 16:06:20 +0000
889@@ -1796,7 +1796,7 @@
890 # set environment variable after construction to make sure it's
891 # examined.
892 self.overrideEnv('BRZ_NO_SMART_VFS', '')
893- self.assertRaises(errors.DisabledMethod, handler.execute)
894+ self.assertRaises(_mod_request.DisabledMethod, handler.execute)
895
896 def test_readonly_exception_becomes_transport_not_possible(self):
897 """The response for a read-only error is ('ReadOnlyError')."""
898
899=== modified file 'breezy/tests/test_smtp_connection.py'
900--- breezy/tests/test_smtp_connection.py 2017-05-21 18:10:28 +0000
901+++ breezy/tests/test_smtp_connection.py 2017-07-23 16:06:20 +0000
902@@ -22,7 +22,6 @@
903 from breezy import (
904 config,
905 email_message,
906- errors,
907 smtp_connection,
908 tests,
909 ui,
910@@ -106,10 +105,11 @@
911
912 def test_missing_server(self):
913 conn = self.get_connection('', smtp_factory=connection_refuser)
914- self.assertRaises(errors.DefaultSMTPConnectionRefused, conn._connect)
915+ self.assertRaises(smtp_connection.DefaultSMTPConnectionRefused,
916+ conn._connect)
917 conn = self.get_connection('smtp_server=smtp.example.com',
918 smtp_factory=connection_refuser)
919- self.assertRaises(errors.SMTPConnectionRefused, conn._connect)
920+ self.assertRaises(smtp_connection.SMTPConnectionRefused, conn._connect)
921
922 def test_smtp_username(self):
923 conn = self.get_connection('')
924@@ -195,7 +195,7 @@
925 # Check that we raise an exception if both EHLO and HELO fail.
926 factory = StubSMTPFactory(fail_on=['ehlo', 'helo'])
927 conn = self.get_connection('', smtp_factory=factory)
928- self.assertRaises(errors.SMTPError, conn._create_connection)
929+ self.assertRaises(smtp_connection.SMTPError, conn._create_connection)
930 self.assertEqual([('connect', 'localhost'),
931 ('ehlo',),
932 ('helo',)], factory._calls)
933@@ -218,7 +218,7 @@
934 factory = StubSMTPFactory(fail_on=['starttls'],
935 smtp_features=['starttls'])
936 conn = self.get_connection('', smtp_factory=factory)
937- self.assertRaises(errors.SMTPError, conn._create_connection)
938+ self.assertRaises(smtp_connection.SMTPError, conn._create_connection)
939 self.assertEqual([('connect', 'localhost'),
940 ('ehlo',),
941 ('has_extn', 'starttls'),
942@@ -257,18 +257,18 @@
943 msg = Message()
944 msg['From'] = '"J. Random Developer" <jrandom@example.com>'
945 self.assertRaises(
946- errors.NoDestinationAddress,
947+ smtp_connection.NoDestinationAddress,
948 smtp_connection.SMTPConnection(config.MemoryStack("")
949 ).send_email, msg)
950
951 msg = email_message.EmailMessage('from@from.com', '', 'subject')
952 self.assertRaises(
953- errors.NoDestinationAddress,
954+ smtp_connection.NoDestinationAddress,
955 smtp_connection.SMTPConnection(config.MemoryStack("")
956 ).send_email, msg)
957
958 msg = email_message.EmailMessage('from@from.com', [], 'subject')
959 self.assertRaises(
960- errors.NoDestinationAddress,
961+ smtp_connection.NoDestinationAddress,
962 smtp_connection.SMTPConnection(config.MemoryStack("")
963 ).send_email, msg)
964
965=== modified file 'breezy/tests/test_treebuilder.py'
966--- breezy/tests/test_treebuilder.py 2017-05-21 18:10:28 +0000
967+++ breezy/tests/test_treebuilder.py 2017-07-23 16:06:20 +0000
968@@ -20,7 +20,11 @@
969 from breezy import errors, tests
970 from breezy.memorytree import MemoryTree
971 from breezy.tests import TestCaseWithTransport
972-from breezy.treebuilder import TreeBuilder
973+from breezy.treebuilder import (
974+ AlreadyBuilding,
975+ NotBuilding,
976+ TreeBuilder,
977+ )
978
979
980 class FakeTree(object):
981@@ -63,11 +67,11 @@
982 builder = TreeBuilder()
983 tree = FakeTree()
984 builder.start_tree(tree)
985- self.assertRaises(errors.AlreadyBuilding, builder.start_tree, tree)
986+ self.assertRaises(AlreadyBuilding, builder.start_tree, tree)
987
988 def test_finish_tree_not_started_errors(self):
989 builder = TreeBuilder()
990- self.assertRaises(errors.NotBuilding, builder.finish_tree)
991+ self.assertRaises(NotBuilding, builder.finish_tree)
992
993 def test_finish_tree_unlocks(self):
994 builder = TreeBuilder()
995@@ -78,7 +82,7 @@
996
997 def test_build_tree_not_started_errors(self):
998 builder = TreeBuilder()
999- self.assertRaises(errors.NotBuilding, builder.build, "foo")
1000+ self.assertRaises(NotBuilding, builder.build, "foo")
1001
1002 def test_build_tree(self):
1003 """Test building works using a MemoryTree."""
1004
1005=== added file 'breezy/tests/test_views.py'
1006--- breezy/tests/test_views.py 1970-01-01 00:00:00 +0000
1007+++ breezy/tests/test_views.py 2017-07-23 16:06:20 +0000
1008@@ -0,0 +1,44 @@
1009+# Copyright (C) 2005-2011 Canonical Ltd
1010+#
1011+# This program is free software; you can redistribute it and/or modify
1012+# it under the terms of the GNU General Public License as published by
1013+# the Free Software Foundation; either version 2 of the License, or
1014+# (at your option) any later version.
1015+#
1016+# This program is distributed in the hope that it will be useful,
1017+# but WITHOUT ANY WARRANTY; without even the implied warranty of
1018+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1019+# GNU General Public License for more details.
1020+#
1021+# You should have received a copy of the GNU General Public License
1022+# along with this program; if not, write to the Free Software
1023+# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1024+
1025+from __future__ import absolute_import
1026+
1027+from . import TestCase
1028+
1029+from ..views import (
1030+ FileOutsideView,
1031+ NoSuchView,
1032+ ViewsNotSupported,
1033+ )
1034+
1035+
1036+class TestErrors(TestCase):
1037+
1038+ def test_no_such_view(self):
1039+ err = NoSuchView('foo')
1040+ self.assertEqual("No such view: foo.", str(err))
1041+
1042+ def test_views_not_supported(self):
1043+ err = ViewsNotSupported('atree')
1044+ err_str = str(err)
1045+ self.assertStartsWith(err_str, "Views are not supported by ")
1046+ self.assertEndsWith(err_str, "; use 'brz upgrade' to change your "
1047+ "tree to a later format.")
1048+
1049+ def test_file_outside_view(self):
1050+ err = FileOutsideView('baz', ['foo', 'bar'])
1051+ self.assertEqual('Specified file "baz" is outside the current view: '
1052+ 'foo, bar', str(err))
1053
1054=== modified file 'breezy/treebuilder.py'
1055--- breezy/treebuilder.py 2017-05-22 00:56:52 +0000
1056+++ breezy/treebuilder.py 2017-07-23 16:06:20 +0000
1057@@ -25,6 +25,16 @@
1058 from . import errors
1059
1060
1061+class AlreadyBuilding(errors.BzrError):
1062+
1063+ _fmt = "The tree builder is already building a tree."
1064+
1065+
1066+class NotBuilding(errors.BzrError):
1067+
1068+ _fmt = "Not currently building a tree."
1069+
1070+
1071 class TreeBuilder(object):
1072 """A TreeBuilder allows the creation of specific content in one tree at a
1073 time.
1074@@ -59,7 +69,7 @@
1075 def _ensure_building(self):
1076 """Raise NotBuilding if there is no current tree being built."""
1077 if self._tree is None:
1078- raise errors.NotBuilding
1079+ raise NotBuilding
1080
1081 def finish_tree(self):
1082 """Finish building the current tree."""
1083@@ -75,6 +85,6 @@
1084 MutableTree interface.
1085 """
1086 if self._tree is not None:
1087- raise errors.AlreadyBuilding
1088+ raise AlreadyBuilding
1089 self._tree = tree
1090 self._tree.lock_tree_write()
1091
1092=== modified file 'breezy/views.py'
1093--- breezy/views.py 2017-05-22 00:56:52 +0000
1094+++ breezy/views.py 2017-07-23 16:06:20 +0000
1095@@ -36,6 +36,37 @@
1096 _VIEWS_FORMAT1_MARKER = "Bazaar views format 1\n"
1097
1098
1099+class NoSuchView(errors.BzrError):
1100+ """A view does not exist.
1101+ """
1102+
1103+ _fmt = u"No such view: %(view_name)s."
1104+
1105+ def __init__(self, view_name):
1106+ self.view_name = view_name
1107+
1108+
1109+class ViewsNotSupported(errors.BzrError):
1110+ """Views are not supported by a tree format.
1111+ """
1112+
1113+ _fmt = ("Views are not supported by %(tree)s;"
1114+ " use 'brz upgrade' to change your tree to a later format.")
1115+
1116+ def __init__(self, tree):
1117+ self.tree = tree
1118+
1119+
1120+class FileOutsideView(errors.BzrError):
1121+
1122+ _fmt = ('Specified file "%(file_name)s" is outside the current view: '
1123+ '%(view_str)s')
1124+
1125+ def __init__(self, file_name, view_files):
1126+ self.file_name = file_name
1127+ self.view_str = ", ".join(view_files)
1128+
1129+
1130 class _Views(object):
1131 """Base class for View managers."""
1132
1133@@ -95,7 +126,7 @@
1134 :param views: a map from view name to list of files/directories
1135 """
1136 if current is not None and current not in views:
1137- raise errors.NoSuchView(current)
1138+ raise NoSuchView(current)
1139 self.tree.lock_write()
1140 try:
1141 self._current = current
1142@@ -119,7 +150,7 @@
1143 return []
1144 return self._views[view_name]
1145 except KeyError:
1146- raise errors.NoSuchView(view_name)
1147+ raise NoSuchView(view_name)
1148
1149 def set_view(self, view_name, view_files, make_current=True):
1150 """Add or update a view definition.
1151@@ -149,7 +180,7 @@
1152 try:
1153 del self._views[view_name]
1154 except KeyError:
1155- raise errors.NoSuchView(view_name)
1156+ raise NoSuchView(view_name)
1157 if view_name == self._current:
1158 self._current = None
1159 self._save_view_info()
1160@@ -256,7 +287,7 @@
1161 return False
1162
1163 def _not_supported(self, *a, **k):
1164- raise errors.ViewsNotSupported(self.tree)
1165+ raise ViewsNotSupported(self.tree)
1166
1167 get_view_info = _not_supported
1168 set_view_info = _not_supported
1169@@ -282,4 +313,4 @@
1170 if tree.supports_views():
1171 view_files = tree.views.lookup_view()
1172 if view_files and not osutils.is_inside_any(view_files, relpath):
1173- raise errors.FileOutsideView(relpath, view_files)
1174+ raise FileOutsideView(relpath, view_files)
1175
1176=== modified file 'breezy/workingtree.py'
1177--- breezy/workingtree.py 2017-07-02 21:26:29 +0000
1178+++ breezy/workingtree.py 2017-07-23 16:06:20 +0000
1179@@ -327,7 +327,7 @@
1180 for filename in file_list:
1181 relpath = fixer(osutils.dereference_path(filename))
1182 if view_files and not osutils.is_inside_any(view_files, relpath):
1183- raise errors.FileOutsideView(filename, view_files)
1184+ raise views.FileOutsideView(filename, view_files)
1185 new_list.append(relpath)
1186 return new_list
1187

Subscribers

People subscribed via source and target branches