1745
1483
_fmt = '%(source)s is%(permanently)s redirected to %(target)s'
1747
def __init__(self, source, target, is_permanent=False):
1485
def __init__(self, source, target, is_permament=False, qual_proto=None):
1748
1486
self.source = source
1749
1487
self.target = target
1751
1489
self.permanently = ' permanently'
1753
1491
self.permanently = ''
1492
self.is_permament = is_permament
1493
self._qualified_proto = qual_proto
1754
1494
TransportError.__init__(self)
1496
def _requalify_url(self, url):
1497
"""Restore the qualified proto in front of the url"""
1498
# When this exception is raised, source and target are in
1499
# user readable format. But some transports may use a
1500
# different proto (http+urllib:// will present http:// to
1501
# the user. If a qualified proto is specified, the code
1502
# trapping the exception can get the qualified urls to
1503
# properly handle the redirection themself (creating a
1504
# new transport object from the target url for example).
1505
# But checking that the scheme of the original and
1506
# redirected urls are the same can be tricky. (see the
1507
# FIXME in BzrDir.open_from_transport for the unique use
1509
if self._qualified_proto is None:
1512
# The TODO related to NotBranchError mention that doing
1513
# that kind of manipulation on the urls may not be the
1514
# exception object job. On the other hand, this object is
1515
# the interface between the code and the user so
1516
# presenting the urls in different ways is indeed its
1519
proto, netloc, path, query, fragment = urlparse.urlsplit(url)
1520
return urlparse.urlunsplit((self._qualified_proto, netloc, path,
1523
def get_source_url(self):
1524
return self._requalify_url(self.source)
1526
def get_target_url(self):
1527
return self._requalify_url(self.target)
1757
1530
class TooManyRedirections(TransportError):
1759
1532
_fmt = "Too many redirections"
1762
1534
class ConflictsInTree(BzrError):
1764
1536
_fmt = "Working tree has conflicts."
2873
2440
class UncommittedChanges(BzrError):
2875
_fmt = ('Working tree "%(display_url)s" has uncommitted changes'
2876
' (See bzr status).%(more)s')
2442
_fmt = 'Working tree "%(display_url)s" has uncommitted changes.'
2878
def __init__(self, tree, more=None):
2444
def __init__(self, tree):
2883
2445
import bzrlib.urlutils as urlutils
2884
user_url = getattr(tree, "user_url", None)
2885
if user_url is None:
2886
display_url = str(tree)
2888
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2889
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2892
class ShelvedChanges(UncommittedChanges):
2894
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2895
' (See bzr shelve --list).%(more)s')
2898
class MissingTemplateVariable(BzrError):
2900
_fmt = 'Variable {%(name)s} is not available.'
2902
def __init__(self, name):
2906
class NoTemplate(BzrError):
2908
_fmt = 'No template specified.'
2911
class UnableCreateSymlink(BzrError):
2913
_fmt = 'Unable to create symlink %(path_str)son this platform'
2915
def __init__(self, path=None):
2919
path_str = repr(str(path))
2920
except UnicodeEncodeError:
2921
path_str = repr(path)
2923
self.path_str = path_str
2926
class UnsupportedTimezoneFormat(BzrError):
2928
_fmt = ('Unsupported timezone format "%(timezone)s", '
2929
'options are "utc", "original", "local".')
2931
def __init__(self, timezone):
2932
self.timezone = timezone
2935
class CommandAvailableInPlugin(StandardError):
2937
internal_error = False
2939
def __init__(self, cmd_name, plugin_metadata, provider):
2941
self.plugin_metadata = plugin_metadata
2942
self.cmd_name = cmd_name
2943
self.provider = provider
2947
_fmt = ('"%s" is not a standard bzr command. \n'
2948
'However, the following official plugin provides this command: %s\n'
2949
'You can install it by going to: %s'
2950
% (self.cmd_name, self.plugin_metadata['name'],
2951
self.plugin_metadata['url']))
2956
class NoPluginAvailable(BzrError):
2960
class UnableEncodePath(BzrError):
2962
_fmt = ('Unable to encode %(kind)s path %(path)r in '
2963
'user encoding %(user_encoding)s')
2965
def __init__(self, path, kind):
2966
from bzrlib.osutils import get_user_encoding
2969
self.user_encoding = osutils.get_user_encoding()
2972
class NoSuchConfig(BzrError):
2974
_fmt = ('The "%(config_id)s" configuration does not exist.')
2976
def __init__(self, config_id):
2977
BzrError.__init__(self, config_id=config_id)
2980
class NoSuchConfigOption(BzrError):
2982
_fmt = ('The "%(option_name)s" configuration option does not exist.')
2984
def __init__(self, option_name):
2985
BzrError.__init__(self, option_name=option_name)
2988
class NoSuchAlias(BzrError):
2990
_fmt = ('The alias "%(alias_name)s" does not exist.')
2992
def __init__(self, alias_name):
2993
BzrError.__init__(self, alias_name=alias_name)
2996
class DirectoryLookupFailure(BzrError):
2997
"""Base type for lookup errors."""
3002
class InvalidLocationAlias(DirectoryLookupFailure):
3004
_fmt = '"%(alias_name)s" is not a valid location alias.'
3006
def __init__(self, alias_name):
3007
DirectoryLookupFailure.__init__(self, alias_name=alias_name)
3010
class UnsetLocationAlias(DirectoryLookupFailure):
3012
_fmt = 'No %(alias_name)s location assigned.'
3014
def __init__(self, alias_name):
3015
DirectoryLookupFailure.__init__(self, alias_name=alias_name[1:])
3018
class CannotBindAddress(BzrError):
3020
_fmt = 'Cannot bind address "%(host)s:%(port)i": %(orig_error)s.'
3022
def __init__(self, host, port, orig_error):
3023
# nb: in python2.4 socket.error doesn't have a useful repr
3024
BzrError.__init__(self, host=host, port=port,
3025
orig_error=repr(orig_error.args))
3028
class UnknownRules(BzrError):
3030
_fmt = ('Unknown rules detected: %(unknowns_str)s.')
3032
def __init__(self, unknowns):
3033
BzrError.__init__(self, unknowns_str=", ".join(unknowns))
3036
class HookFailed(BzrError):
3037
"""Raised when a pre_change_branch_tip hook function fails anything other
3038
than TipChangeRejected.
3040
Note that this exception is no longer raised, and the import is only left
3041
to be nice to code which might catch it in a plugin.
3044
_fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
3045
"%(traceback_text)s%(exc_value)s")
3047
def __init__(self, hook_stage, hook_name, exc_info, warn=True):
3049
symbol_versioning.warn("BzrError HookFailed has been deprecated "
3050
"as of bzrlib 2.1.", DeprecationWarning, stacklevel=2)
3052
self.hook_stage = hook_stage
3053
self.hook_name = hook_name
3054
self.exc_info = exc_info
3055
self.exc_type = exc_info[0]
3056
self.exc_value = exc_info[1]
3057
self.exc_tb = exc_info[2]
3058
self.traceback_text = ''.join(traceback.format_tb(self.exc_tb))
3061
class TipChangeRejected(BzrError):
3062
"""A pre_change_branch_tip hook function may raise this to cleanly and
3063
explicitly abort a change to a branch tip.
3066
_fmt = u"Tip change rejected: %(msg)s"
3068
def __init__(self, msg):
3072
class ShelfCorrupt(BzrError):
3074
_fmt = "Shelf corrupt."
3077
class NoSuchShelfId(BzrError):
3079
_fmt = 'No changes are shelved with id "%(shelf_id)d".'
3081
def __init__(self, shelf_id):
3082
BzrError.__init__(self, shelf_id=shelf_id)
3085
class InvalidShelfId(BzrError):
3087
_fmt = '"%(invalid_id)s" is not a valid shelf id, try a number instead.'
3089
def __init__(self, invalid_id):
3090
BzrError.__init__(self, invalid_id=invalid_id)
3093
class JailBreak(BzrError):
3095
_fmt = "An attempt to access a url outside the server jail was made: '%(url)s'."
3097
def __init__(self, url):
3098
BzrError.__init__(self, url=url)
3101
class UserAbort(BzrError):
3103
_fmt = 'The user aborted the operation.'
3106
class MustHaveWorkingTree(BzrError):
3108
_fmt = ("Branching '%(url)s'(%(format)s) must create a working tree.")
3110
def __init__(self, format, url):
3111
BzrError.__init__(self, format=format, url=url)
3114
class NoSuchView(BzrError):
3115
"""A view does not exist.
3118
_fmt = u"No such view: %(view_name)s."
3120
def __init__(self, view_name):
3121
self.view_name = view_name
3124
class ViewsNotSupported(BzrError):
3125
"""Views are not supported by a tree format.
3128
_fmt = ("Views are not supported by %(tree)s;"
3129
" use 'bzr upgrade' to change your tree to a later format.")
3131
def __init__(self, tree):
3135
class FileOutsideView(BzrError):
3137
_fmt = ('Specified file "%(file_name)s" is outside the current view: '
3140
def __init__(self, file_name, view_files):
3141
self.file_name = file_name
3142
self.view_str = ", ".join(view_files)
3145
class UnresumableWriteGroup(BzrError):
3147
_fmt = ("Repository %(repository)s cannot resume write group "
3148
"%(write_groups)r: %(reason)s")
3150
internal_error = True
3152
def __init__(self, repository, write_groups, reason):
3153
self.repository = repository
3154
self.write_groups = write_groups
3155
self.reason = reason
3158
class UnsuspendableWriteGroup(BzrError):
3160
_fmt = ("Repository %(repository)s cannot suspend a write group.")
3162
internal_error = True
3164
def __init__(self, repository):
3165
self.repository = repository
3168
class LossyPushToSameVCS(BzrError):
3170
_fmt = ("Lossy push not possible between %(source_branch)r and "
3171
"%(target_branch)r that are in the same VCS.")
3173
internal_error = True
3175
def __init__(self, source_branch, target_branch):
3176
self.source_branch = source_branch
3177
self.target_branch = target_branch
3180
class NoRoundtrippingSupport(BzrError):
3182
_fmt = ("Roundtripping is not supported between %(source_branch)r and "
3183
"%(target_branch)r.")
3185
internal_error = True
3187
def __init__(self, source_branch, target_branch):
3188
self.source_branch = source_branch
3189
self.target_branch = target_branch
3192
class FileTimestampUnavailable(BzrError):
3194
_fmt = "The filestamp for %(path)s is not available."
3196
internal_error = True
3198
def __init__(self, path):
3202
class NoColocatedBranchSupport(BzrError):
3204
_fmt = ("%(bzrdir)r does not support co-located branches.")
3206
def __init__(self, bzrdir):
3207
self.bzrdir = bzrdir
3210
class NoWhoami(BzrError):
3212
_fmt = ('Unable to determine your name.\n'
3213
"Please, set your name with the 'whoami' command.\n"
3214
'E.g. bzr whoami "Your Name <name@example.com>"')
3217
class InvalidPattern(BzrError):
3219
_fmt = ('Invalid pattern(s) found. %(msg)s')
3221
def __init__(self, msg):
3225
class RecursiveBind(BzrError):
3227
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3228
'Please use `bzr unbind` to fix.')
3230
def __init__(self, branch_url):
3231
self.branch_url = branch_url
3234
# FIXME: I would prefer to define the config related exception classes in
3235
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3236
class OptionExpansionLoop(BzrError):
3238
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3240
def __init__(self, string, refs):
3241
self.string = string
3242
self.refs = '->'.join(refs)
3245
class ExpandingUnknownOption(BzrError):
3247
_fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
3249
def __init__(self, name, string):
3251
self.string = string
2446
display_url = urlutils.unescape_for_display(
2447
tree.bzrdir.root_transport.base, 'ascii')
2448
BzrError.__init__(self, tree=tree, display_url=display_url)