46
# return codes from the bzr program
39
# return codes from the brz program
49
42
EXIT_INTERNAL_ERROR = 4
52
class BzrError(StandardError):
45
class BzrError(Exception):
54
Base class for errors raised by bzrlib.
47
Base class for errors raised by breezy.
56
:cvar internal_error: if True this was probably caused by a bzr bug and
57
should be displayed with a traceback; if False (or absent) this was
58
probably a user or environment error and they don't need the gory details.
59
(That can be overridden by -Derror on the command line.)
49
:cvar internal_error: if True this was probably caused by a brz bug and
50
should be displayed with a traceback; if False (or absent) this was
51
probably a user or environment error and they don't need the gory
52
details. (That can be overridden by -Derror on the command line.)
61
54
:cvar _fmt: Format string to display the error; this is expanded
62
by the instance's dict.
55
by the instance's dict.
65
58
internal_error = False
106
100
# __str__() should always return a 'str' object
107
101
# never a 'unicode' object.
109
except (AttributeError, TypeError, NameError, ValueError, KeyError), e:
110
return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
111
% (self.__class__.__name__,
113
getattr(self, '_fmt', None),
116
def __unicode__(self):
118
if isinstance(u, str):
119
# Try decoding the str using the default encoding.
121
elif not isinstance(u, unicode):
122
# Try to make a unicode object from it, because __unicode__ must
123
# return a unicode object.
129
if isinstance(s, unicode):
132
# __str__ must return a str.
103
except Exception as e:
105
return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
106
% (self.__class__.__name__,
108
getattr(self, '_fmt', None),
115
return self._format().encode('utf-8')
117
__unicode__ = _format
136
119
def __repr__(self):
137
120
return '%s(%s)' % (self.__class__.__name__, str(self))
140
123
"""Return format string for this exception or None"""
141
124
fmt = getattr(self, '_fmt', None)
142
125
if fmt is not None:
144
fmt = getattr(self, '__doc__', None)
146
symbol_versioning.warn("%s uses its docstring as a format, "
147
"it should use _fmt instead" % self.__class__.__name__,
150
return 'Unprintable exception %s: dict=%r, fmt=%r' \
151
% (self.__class__.__name__,
153
getattr(self, '_fmt', None),
126
from breezy.i18n import gettext
127
return gettext(fmt) # _fmt strings should be ascii
156
129
def __eq__(self, other):
157
130
if self.__class__ is not other.__class__:
158
131
return NotImplemented
159
132
return self.__dict__ == other.__dict__
162
138
class InternalBzrError(BzrError):
163
139
"""Base class for errors that are internal in nature.
170
146
internal_error = True
173
class BzrNewError(BzrError):
174
"""Deprecated error base class."""
175
# base classes should override the docstring with their human-
176
# readable explanation
178
def __init__(self, *args, **kwds):
179
# XXX: Use the underlying BzrError to always generate the args
180
# attribute if it doesn't exist. We can't use super here, because
181
# exceptions are old-style classes in python2.4 (but new in 2.5).
183
symbol_versioning.warn('BzrNewError was deprecated in bzr 0.13; '
184
'please convert %s to use BzrError instead'
185
% self.__class__.__name__,
188
BzrError.__init__(self, *args)
189
for key, value in kwds.items():
190
setattr(self, key, value)
194
# __str__() should always return a 'str' object
195
# never a 'unicode' object.
196
s = self.__doc__ % self.__dict__
197
if isinstance(s, unicode):
198
return s.encode('utf8')
200
except (TypeError, NameError, ValueError, KeyError), e:
201
return 'Unprintable exception %s(%r): %r' \
202
% (self.__class__.__name__,
206
149
class AlreadyBuilding(BzrError):
208
151
_fmt = "The tree builder is already building a tree."
713
656
self.bzrdir = bzrdir
714
657
PathError.__init__(self, path=path)
717
# XXX: Ideally self.detail would be a property, but Exceptions in
718
# Python 2.4 have to be old-style classes so properties don't work.
719
# Instead we override _format.
660
return '<%s %r>' % (self.__class__.__name__, self.__dict__)
662
def _get_format_string(self):
663
# GZ 2017-06-08: Not the best place to lazy fill detail in.
720
664
if self.detail is None:
721
if self.bzrdir is not None:
723
self.bzrdir.open_repository()
724
except NoRepositoryPresent:
727
self.detail = ': location is a repository'
665
self.detail = self._get_detail()
666
return super(NotBranchError, self)._get_format_string()
668
def _get_detail(self):
669
if self.bzrdir is not None:
671
self.bzrdir.open_repository()
672
except NoRepositoryPresent:
674
except Exception as e:
675
# Just ignore unexpected errors. Raising arbitrary errors
676
# during str(err) can provoke strange bugs. Concretely
677
# Launchpad's codehosting managed to raise NotBranchError
678
# here, and then get stuck in an infinite loop/recursion
679
# trying to str() that error. All this error really cares
680
# about that there's no working repository there, and if
681
# open_repository() fails, there probably isn't.
682
return ': ' + e.__class__.__name__
730
return PathError._format(self)
684
return ': location is a repository'
733
688
class NoSubmitBranch(PathError):
735
690
_fmt = 'No submit branch available for branch "%(path)s"'
737
692
def __init__(self, branch):
738
import bzrlib.urlutils as urlutils
693
import breezy.urlutils as urlutils
739
694
self.path = urlutils.unescape_for_display(branch.base, 'ascii')
697
class AlreadyControlDirError(PathError):
699
_fmt = 'A control directory already exists: "%(path)s".'
742
702
class AlreadyBranchError(PathError):
744
704
_fmt = 'Already a branch: "%(path)s".'
707
class InvalidBranchName(PathError):
709
_fmt = "Invalid branch name: %(name)s"
711
def __init__(self, name):
712
BzrError.__init__(self)
716
class ParentBranchExists(AlreadyBranchError):
718
_fmt = 'Parent branch already exists: "%(path)s".'
747
721
class BranchExistsWithoutWorkingTree(PathError):
749
723
_fmt = 'Directory contains a branch, but no working tree \
750
(use bzr checkout if you wish to build a working tree): "%(path)s"'
724
(use brz checkout if you wish to build a working tree): "%(path)s"'
753
727
class AtomicFileAlreadyClosed(PathError):
1180
1171
class InvalidRevisionSpec(BzrError):
1182
1173
_fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
1183
" %(branch)s%(extra)s")
1174
" %(branch_url)s%(extra)s")
1185
1176
def __init__(self, spec, branch, extra=None):
1186
1177
BzrError.__init__(self, branch=branch, spec=spec)
1178
self.branch_url = getattr(branch, 'user_url', str(branch))
1188
1180
self.extra = '\n' + str(extra)
1190
1182
self.extra = ''
1193
class HistoryMissing(BzrError):
1195
_fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
1198
1185
class AppendRevisionsOnlyViolation(BzrError):
1200
1187
_fmt = ('Operation denied because it would change the main history,'
1700
1689
InvalidHttpResponse.__init__(self, path, msg)
1692
class HttpBoundaryMissing(InvalidHttpResponse):
1693
"""A multipart response ends with no boundary marker.
1695
This is a special case caused by buggy proxies, described in
1696
<https://bugs.launchpad.net/bzr/+bug/198646>.
1699
_fmt = "HTTP MIME Boundary missing for %(path)s: %(msg)s"
1701
def __init__(self, path, msg):
1702
InvalidHttpResponse.__init__(self, path, msg)
1703
1705
class InvalidHttpContentType(InvalidHttpResponse):
1705
1707
_fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1733
1735
_fmt = "Working tree has conflicts."
1738
class ConfigContentError(BzrError):
1740
_fmt = "Config file %(filename)s is not UTF-8 encoded\n"
1742
def __init__(self, filename):
1743
BzrError.__init__(self)
1744
self.filename = filename
1736
1747
class ParseConfigError(BzrError):
1749
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1738
1751
def __init__(self, errors, filename):
1739
if filename is None:
1741
message = "Error(s) parsing config file %s:\n%s" % \
1742
(filename, ('\n'.join(e.msg for e in errors)))
1743
BzrError.__init__(self, message)
1752
BzrError.__init__(self)
1753
self.filename = filename
1754
self.errors = '\n'.join(e.msg for e in errors)
1757
class ConfigOptionValueError(BzrError):
1759
_fmt = ('Bad value "%(value)s" for option "%(name)s".\n'
1760
'See ``brz help %(name)s``')
1762
def __init__(self, name, value):
1763
BzrError.__init__(self, name=name, value=value)
1746
1766
class NoEmailInUsername(BzrError):
1755
1775
class SigningFailed(BzrError):
1757
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1777
_fmt = 'Failed to GPG sign data with command "%(command_line)s"'
1759
1779
def __init__(self, command_line):
1760
1780
BzrError.__init__(self, command_line=command_line)
1783
class SignatureVerificationFailed(BzrError):
1785
_fmt = 'Failed to verify GPG signature data with error "%(error)s"'
1787
def __init__(self, error):
1788
BzrError.__init__(self, error=error)
1791
class DependencyNotPresent(BzrError):
1793
_fmt = 'Unable to import library "%(library)s": %(error)s'
1795
def __init__(self, library, error):
1796
BzrError.__init__(self, library=library, error=error)
1799
class GpgmeNotInstalled(DependencyNotPresent):
1801
_fmt = 'python-gpgme is not installed, it is needed to verify signatures'
1803
def __init__(self, error):
1804
DependencyNotPresent.__init__(self, 'gpgme', error)
1763
1807
class WorkingTreeNotRevision(BzrError):
1765
1809
_fmt = ("The working tree for %(basedir)s has changed since"
1925
1969
_fmt = "Moving the root directory is not supported at this time"
1972
class TransformRenameFailed(BzrError):
1974
_fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
1976
def __init__(self, from_path, to_path, why, errno):
1977
self.from_path = from_path
1978
self.to_path = to_path
1928
1983
class BzrMoveFailedError(BzrError):
1930
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
1985
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
1986
"%(_has_extra)s%(extra)s")
1932
1988
def __init__(self, from_path='', to_path='', extra=None):
1933
from bzrlib.osutils import splitpath
1989
from breezy.osutils import splitpath
1934
1990
BzrError.__init__(self)
1936
self.extra = ': ' + str(extra)
1992
self.extra, self._has_extra = extra, ': '
1994
self.extra = self._has_extra = ''
1940
1996
has_from = len(from_path) > 0
1941
1997
has_to = len(to_path) > 0
1963
2019
class BzrRenameFailedError(BzrMoveFailedError):
1965
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
2021
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
2022
"%(_has_extra)s%(extra)s")
1967
2024
def __init__(self, from_path, to_path, extra=None):
1968
2025
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
1970
class BzrRemoveChangedFilesError(BzrError):
1971
"""Used when user is trying to remove changed files."""
1973
_fmt = ("Can't safely remove modified or unknown files:\n"
1974
"%(changes_as_text)s"
1975
"Use --keep to not delete them, or --force to delete them regardless.")
1977
def __init__(self, tree_delta):
1978
BzrError.__init__(self)
1979
self.changes_as_text = tree_delta.get_changes_as_text()
1980
#self.paths_as_string = '\n'.join(changed_files)
1981
#self.paths_as_string = '\n'.join([quotefn(p) for p in changed_files])
1984
2028
class BzrBadParameterNotString(BzrBadParameter):
2615
2659
class UnknownErrorFromSmartServer(BzrError):
2616
"""An ErrorFromSmartServer could not be translated into a typical bzrlib
2660
"""An ErrorFromSmartServer could not be translated into a typical breezy
2619
2663
This is distinct from ErrorFromSmartServer so that it is possible to
2620
2664
distinguish between the following two cases:
2621
- ErrorFromSmartServer was uncaught. This is logic error in the client
2622
and so should provoke a traceback to the user.
2623
- ErrorFromSmartServer was caught but its error_tuple could not be
2624
translated. This is probably because the server sent us garbage, and
2625
should not provoke a traceback.
2666
- ErrorFromSmartServer was uncaught. This is logic error in the client
2667
and so should provoke a traceback to the user.
2668
- ErrorFromSmartServer was caught but its error_tuple could not be
2669
translated. This is probably because the server sent us garbage, and
2670
should not provoke a traceback.
2628
2673
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2826
2863
class UncommittedChanges(BzrError):
2828
2865
_fmt = ('Working tree "%(display_url)s" has uncommitted changes'
2829
' (See bzr status).%(more)s')
2866
' (See brz status).%(more)s')
2831
2868
def __init__(self, tree, more=None):
2832
2869
if more is None:
2835
2872
more = ' ' + more
2836
import bzrlib.urlutils as urlutils
2837
display_url = urlutils.unescape_for_display(
2838
tree.user_url, 'ascii')
2873
import breezy.urlutils as urlutils
2874
user_url = getattr(tree, "user_url", None)
2875
if user_url is None:
2876
display_url = str(tree)
2878
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2839
2879
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2882
class StoringUncommittedNotSupported(BzrError):
2884
_fmt = ('Branch "%(display_url)s" does not support storing uncommitted'
2887
def __init__(self, branch):
2888
import breezy.urlutils as urlutils
2889
user_url = getattr(branch, "user_url", None)
2890
if user_url is None:
2891
display_url = str(branch)
2893
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2894
BzrError.__init__(self, branch=branch, display_url=display_url)
2897
class ShelvedChanges(UncommittedChanges):
2899
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2900
' (See brz shelve --list).%(more)s')
2842
2903
class MissingTemplateVariable(BzrError):
2844
2905
_fmt = 'Variable {%(name)s} is not available.'
2907
2968
'user encoding %(user_encoding)s')
2909
2970
def __init__(self, path, kind):
2910
from bzrlib.osutils import get_user_encoding
2971
from breezy.osutils import get_user_encoding
2911
2972
self.path = path
2912
2973
self.kind = kind
2913
self.user_encoding = osutils.get_user_encoding()
2974
self.user_encoding = get_user_encoding()
2977
class NoSuchConfig(BzrError):
2979
_fmt = ('The "%(config_id)s" configuration does not exist.')
2981
def __init__(self, config_id):
2982
BzrError.__init__(self, config_id=config_id)
2985
class NoSuchConfigOption(BzrError):
2987
_fmt = ('The "%(option_name)s" configuration option does not exist.')
2989
def __init__(self, option_name):
2990
BzrError.__init__(self, option_name=option_name)
2916
2993
class NoSuchAlias(BzrError):
2961
3038
BzrError.__init__(self, unknowns_str=", ".join(unknowns))
2964
class HookFailed(BzrError):
2965
"""Raised when a pre_change_branch_tip hook function fails anything other
2966
than TipChangeRejected.
2968
Note that this exception is no longer raised, and the import is only left
2969
to be nice to code which might catch it in a plugin.
2972
_fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
2973
"%(traceback_text)s%(exc_value)s")
2975
def __init__(self, hook_stage, hook_name, exc_info, warn=True):
2977
symbol_versioning.warn("BzrError HookFailed has been deprecated "
2978
"as of bzrlib 2.1.", DeprecationWarning, stacklevel=2)
2980
self.hook_stage = hook_stage
2981
self.hook_name = hook_name
2982
self.exc_info = exc_info
2983
self.exc_type = exc_info[0]
2984
self.exc_value = exc_info[1]
2985
self.exc_tb = exc_info[2]
2986
self.traceback_text = ''.join(traceback.format_tb(self.exc_tb))
2989
3041
class TipChangeRejected(BzrError):
2990
3042
"""A pre_change_branch_tip hook function may raise this to cleanly and
2991
3043
explicitly abort a change to a branch tip.
3134
3198
def __init__(self, bzrdir):
3135
3199
self.bzrdir = bzrdir
3202
class NoWhoami(BzrError):
3204
_fmt = ('Unable to determine your name.\n'
3205
"Please, set your name with the 'whoami' command.\n"
3206
'E.g. brz whoami "Your Name <name@example.com>"')
3209
class InvalidPattern(BzrError):
3211
_fmt = ('Invalid pattern(s) found. %(msg)s')
3213
def __init__(self, msg):
3217
class RecursiveBind(BzrError):
3219
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3220
'Please use `brz unbind` to fix.')
3222
def __init__(self, branch_url):
3223
self.branch_url = branch_url
3226
# FIXME: I would prefer to define the config related exception classes in
3227
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3228
class OptionExpansionLoop(BzrError):
3230
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3232
def __init__(self, string, refs):
3233
self.string = string
3234
self.refs = '->'.join(refs)
3237
class ExpandingUnknownOption(BzrError):
3239
_fmt = 'Option "%(name)s" is not defined while expanding "%(string)s".'
3241
def __init__(self, name, string):
3243
self.string = string
3246
class IllegalOptionName(BzrError):
3248
_fmt = 'Option "%(name)s" is not allowed.'
3250
def __init__(self, name):
3254
class NoCompatibleInter(BzrError):
3256
_fmt = ('No compatible object available for operations from %(source)r '
3259
def __init__(self, source, target):
3260
self.source = source
3261
self.target = target
3264
class HpssVfsRequestNotAllowed(BzrError):
3266
_fmt = ("VFS requests over the smart server are not allowed. Encountered: "
3267
"%(method)s, %(arguments)s.")
3269
def __init__(self, method, arguments):
3270
self.method = method
3271
self.arguments = arguments
3274
class UnsupportedKindChange(BzrError):
3276
_fmt = ("Kind change from %(from_kind)s to %(to_kind)s for "
3277
"%(path)s not supported by format %(format)r")
3279
def __init__(self, path, from_kind, to_kind, format):
3281
self.from_kind = from_kind
3282
self.to_kind = to_kind
3283
self.format = format
3286
class MissingFeature(BzrError):
3288
_fmt = ("Missing feature %(feature)s not provided by this "
3289
"version of Bazaar or any plugin.")
3291
def __init__(self, feature):
3292
self.feature = feature
3295
class PatchSyntax(BzrError):
3296
"""Base class for patch syntax errors."""
3299
class BinaryFiles(BzrError):
3301
_fmt = 'Binary files section encountered.'
3303
def __init__(self, orig_name, mod_name):
3304
self.orig_name = orig_name
3305
self.mod_name = mod_name
3308
class MalformedPatchHeader(PatchSyntax):
3310
_fmt = "Malformed patch header. %(desc)s\n%(line)r"
3312
def __init__(self, desc, line):
3317
class MalformedHunkHeader(PatchSyntax):
3319
_fmt = "Malformed hunk header. %(desc)s\n%(line)r"
3321
def __init__(self, desc, line):
3326
class MalformedLine(PatchSyntax):
3328
_fmt = "Malformed line. %(desc)s\n%(line)r"
3330
def __init__(self, desc, line):
3335
class PatchConflict(BzrError):
3337
_fmt = ('Text contents mismatch at line %(line_no)d. Original has '
3338
'"%(orig_line)s", but patch says it should be "%(patch_line)s"')
3340
def __init__(self, line_no, orig_line, patch_line):
3341
self.line_no = line_no
3342
self.orig_line = orig_line.rstrip('\n')
3343
self.patch_line = patch_line.rstrip('\n')
3346
class FeatureAlreadyRegistered(BzrError):
3348
_fmt = 'The feature %(feature)s has already been registered.'
3350
def __init__(self, feature):
3351
self.feature = feature
3354
class ChangesAlreadyStored(BzrCommandError):
3356
_fmt = ('Cannot store uncommitted changes because this branch already'
3357
' stores uncommitted changes.')