Merge lp:~jelmer/brz/move-errors-views into lp:brz
- move-errors-views
- Merge into trunk
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 |
Related bugs: |
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.
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 |
Changes look okay.