14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17
from __future__ import absolute_import
17
19
"""Exceptions for bzr, and reporting of them.
24
from bzrlib.patches import (
33
22
# TODO: is there any value in providing the .args field used by standard
34
23
# python exceptions? A list of values with no names seems less useful
106
95
# __str__() should always return a 'str' object
107
96
# 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),
99
pass # just bind to 'e' for formatting below
102
return 'Unprintable exception %s: dict=%r, fmt=%r, error=%r' \
103
% (self.__class__.__name__,
105
getattr(self, '_fmt', None),
116
108
def __unicode__(self):
117
109
u = self._format()
140
132
"""Return format string for this exception or None"""
141
133
fmt = getattr(self, '_fmt', None)
142
134
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),
135
from bzrlib.i18n import gettext
136
return gettext(unicode(fmt)) # _fmt strings should be ascii
156
138
def __eq__(self, other):
157
139
if self.__class__ is not other.__class__:
170
152
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
155
class AlreadyBuilding(BzrError):
208
157
_fmt = "The tree builder is already building a tree."
723
675
self.bzrdir.open_repository()
724
676
except NoRepositoryPresent:
679
# Just ignore unexpected errors. Raising arbitrary errors
680
# during str(err) can provoke strange bugs. Concretely
681
# Launchpad's codehosting managed to raise NotBranchError
682
# here, and then get stuck in an infinite loop/recursion
683
# trying to str() that error. All this error really cares
684
# about that there's no working repository there, and if
685
# open_repository() fails, there probably isn't.
727
688
self.detail = ': location is a repository'
1180
1146
class InvalidRevisionSpec(BzrError):
1182
1148
_fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
1183
" %(branch)s%(extra)s")
1149
" %(branch_url)s%(extra)s")
1185
1151
def __init__(self, spec, branch, extra=None):
1186
1152
BzrError.__init__(self, branch=branch, spec=spec)
1153
self.branch_url = getattr(branch, 'user_url', str(branch))
1188
1155
self.extra = '\n' + str(extra)
1190
1157
self.extra = ''
1193
class HistoryMissing(BzrError):
1195
_fmt = "%(branch)s is missing %(object_type)s {%(object_id)s}"
1198
1160
class AppendRevisionsOnlyViolation(BzrError):
1200
1162
_fmt = ('Operation denied because it would change the main history,'
1265
1227
not_ancestor_id=not_ancestor_id)
1268
class AmbiguousBase(BzrError):
1270
def __init__(self, bases):
1271
symbol_versioning.warn("BzrError AmbiguousBase has been deprecated "
1272
"as of bzrlib 0.8.", DeprecationWarning, stacklevel=2)
1273
msg = ("The correct base is unclear, because %s are all equally close"
1275
BzrError.__init__(self, msg)
1279
1230
class NoCommits(BranchError):
1281
1232
_fmt = "Branch %(branch)s has no commits."
1685
1643
class InvalidHttpResponse(TransportError):
1687
_fmt = "Invalid http response for %(path)s: %(msg)s"
1645
_fmt = "Invalid http response for %(path)s: %(msg)s%(orig_error)s"
1689
1647
def __init__(self, path, msg, orig_error=None):
1690
1648
self.path = path
1649
if orig_error is None:
1652
# This is reached for obscure and unusual errors so we want to
1653
# preserve as much info as possible to ease debug.
1654
orig_error = ': %r' % (orig_error,)
1691
1655
TransportError.__init__(self, msg, orig_error=orig_error)
1700
1664
InvalidHttpResponse.__init__(self, path, msg)
1667
class HttpBoundaryMissing(InvalidHttpResponse):
1668
"""A multipart response ends with no boundary marker.
1670
This is a special case caused by buggy proxies, described in
1671
<https://bugs.launchpad.net/bzr/+bug/198646>.
1674
_fmt = "HTTP MIME Boundary missing for %(path)s: %(msg)s"
1676
def __init__(self, path, msg):
1677
InvalidHttpResponse.__init__(self, path, msg)
1703
1680
class InvalidHttpContentType(InvalidHttpResponse):
1705
1682
_fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1733
1710
_fmt = "Working tree has conflicts."
1713
class ConfigContentError(BzrError):
1715
_fmt = "Config file %(filename)s is not UTF-8 encoded\n"
1717
def __init__(self, filename):
1718
BzrError.__init__(self)
1719
self.filename = filename
1736
1722
class ParseConfigError(BzrError):
1724
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1738
1726
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)
1727
BzrError.__init__(self)
1728
self.filename = filename
1729
self.errors = '\n'.join(e.msg for e in errors)
1732
class ConfigOptionValueError(BzrError):
1734
_fmt = """Bad value "%(value)s" for option "%(name)s"."""
1736
def __init__(self, name, value):
1737
BzrError.__init__(self, name=name, value=value)
1746
1740
class NoEmailInUsername(BzrError):
1755
1749
class SigningFailed(BzrError):
1757
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1751
_fmt = 'Failed to GPG sign data with command "%(command_line)s"'
1759
1753
def __init__(self, command_line):
1760
1754
BzrError.__init__(self, command_line=command_line)
1757
class SignatureVerificationFailed(BzrError):
1759
_fmt = 'Failed to verify GPG signature data with error "%(error)s"'
1761
def __init__(self, error):
1762
BzrError.__init__(self, error=error)
1765
class DependencyNotPresent(BzrError):
1767
_fmt = 'Unable to import library "%(library)s": %(error)s'
1769
def __init__(self, library, error):
1770
BzrError.__init__(self, library=library, error=error)
1773
class GpgmeNotInstalled(DependencyNotPresent):
1775
_fmt = 'python-gpgme is not installed, it is needed to verify signatures'
1777
def __init__(self, error):
1778
DependencyNotPresent.__init__(self, 'gpgme', error)
1763
1781
class WorkingTreeNotRevision(BzrError):
1765
1783
_fmt = ("The working tree for %(basedir)s has changed since"
1925
1943
_fmt = "Moving the root directory is not supported at this time"
1946
class TransformRenameFailed(BzrError):
1948
_fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
1950
def __init__(self, from_path, to_path, why, errno):
1951
self.from_path = from_path
1952
self.to_path = to_path
1928
1957
class BzrMoveFailedError(BzrError):
1930
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
1959
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
1960
"%(_has_extra)s%(extra)s")
1932
1962
def __init__(self, from_path='', to_path='', extra=None):
1933
1963
from bzrlib.osutils import splitpath
1934
1964
BzrError.__init__(self)
1936
self.extra = ': ' + str(extra)
1966
self.extra, self._has_extra = extra, ': '
1968
self.extra = self._has_extra = ''
1940
1970
has_from = len(from_path) > 0
1941
1971
has_to = len(to_path) > 0
1963
1993
class BzrRenameFailedError(BzrMoveFailedError):
1965
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
1995
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
1996
"%(_has_extra)s%(extra)s")
1967
1998
def __init__(self, from_path, to_path, extra=None):
1968
1999
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
2002
class BzrBadParameterNotString(BzrBadParameter):
2619
2637
This is distinct from ErrorFromSmartServer so that it is possible to
2620
2638
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.
2640
- ErrorFromSmartServer was uncaught. This is logic error in the client
2641
and so should provoke a traceback to the user.
2642
- ErrorFromSmartServer was caught but its error_tuple could not be
2643
translated. This is probably because the server sent us garbage, and
2644
should not provoke a traceback.
2628
2647
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2835
2854
more = ' ' + more
2836
2855
import bzrlib.urlutils as urlutils
2837
display_url = urlutils.unescape_for_display(
2838
tree.user_url, 'ascii')
2856
user_url = getattr(tree, "user_url", None)
2857
if user_url is None:
2858
display_url = str(tree)
2860
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2839
2861
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2864
class ShelvedChanges(UncommittedChanges):
2866
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2867
' (See bzr shelve --list).%(more)s')
2842
2870
class MissingTemplateVariable(BzrError):
2844
2872
_fmt = 'Variable {%(name)s} is not available.'
2910
2938
from bzrlib.osutils import get_user_encoding
2911
2939
self.path = path
2912
2940
self.kind = kind
2913
self.user_encoding = osutils.get_user_encoding()
2941
self.user_encoding = get_user_encoding()
2944
class NoSuchConfig(BzrError):
2946
_fmt = ('The "%(config_id)s" configuration does not exist.')
2948
def __init__(self, config_id):
2949
BzrError.__init__(self, config_id=config_id)
2952
class NoSuchConfigOption(BzrError):
2954
_fmt = ('The "%(option_name)s" configuration option does not exist.')
2956
def __init__(self, option_name):
2957
BzrError.__init__(self, option_name=option_name)
2916
2960
class NoSuchAlias(BzrError):
2961
3005
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
3008
class TipChangeRejected(BzrError):
2990
3009
"""A pre_change_branch_tip hook function may raise this to cleanly and
2991
3010
explicitly abort a change to a branch tip.
3134
3165
def __init__(self, bzrdir):
3135
3166
self.bzrdir = bzrdir
3169
class NoWhoami(BzrError):
3171
_fmt = ('Unable to determine your name.\n'
3172
"Please, set your name with the 'whoami' command.\n"
3173
'E.g. bzr whoami "Your Name <name@example.com>"')
3176
class InvalidPattern(BzrError):
3178
_fmt = ('Invalid pattern(s) found. %(msg)s')
3180
def __init__(self, msg):
3184
class RecursiveBind(BzrError):
3186
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3187
'Please use `bzr unbind` to fix.')
3189
def __init__(self, branch_url):
3190
self.branch_url = branch_url
3193
# FIXME: I would prefer to define the config related exception classes in
3194
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3195
class OptionExpansionLoop(BzrError):
3197
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3199
def __init__(self, string, refs):
3200
self.string = string
3201
self.refs = '->'.join(refs)
3204
class ExpandingUnknownOption(BzrError):
3206
_fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
3208
def __init__(self, name, string):
3210
self.string = string
3213
class NoCompatibleInter(BzrError):
3215
_fmt = ('No compatible object available for operations from %(source)r '
3218
def __init__(self, source, target):
3219
self.source = source
3220
self.target = target
3223
class HpssVfsRequestNotAllowed(BzrError):
3225
_fmt = ("VFS requests over the smart server are not allowed. Encountered: "
3226
"%(method)s, %(arguments)s.")
3228
def __init__(self, method, arguments):
3229
self.method = method
3230
self.arguments = arguments
3233
class UnsupportedKindChange(BzrError):
3235
_fmt = ("Kind change from %(from_kind)s to %(to_kind)s for "
3236
"%(path)s not supported by format %(format)r")
3238
def __init__(self, path, from_kind, to_kind, format):
3240
self.from_kind = from_kind
3241
self.to_kind = to_kind
3242
self.format = format
3245
class PatchSyntax(BzrError):
3246
"""Base class for patch syntax errors."""
3249
class BinaryFiles(BzrError):
3251
_fmt = 'Binary files section encountered.'
3253
def __init__(self, orig_name, mod_name):
3254
self.orig_name = orig_name
3255
self.mod_name = mod_name
3258
class MalformedPatchHeader(PatchSyntax):
3260
_fmt = "Malformed patch header. %(desc)s\n%(line)r"
3262
def __init__(self, desc, line):
3267
class MalformedHunkHeader(PatchSyntax):
3269
_fmt = "Malformed hunk header. %(desc)s\n%(line)r"
3271
def __init__(self, desc, line):
3276
class MalformedLine(PatchSyntax):
3278
_fmt = "Malformed line. %(desc)s\n%(line)r"
3280
def __init__(self, desc, line):
3285
class PatchConflict(BzrError):
3287
_fmt = ('Text contents mismatch at line %(line_no)d. Original has '
3288
'"%(orig_line)s", but patch says it should be "%(patch_line)s"')
3290
def __init__(self, line_no, orig_line, patch_line):
3291
self.line_no = line_no
3292
self.orig_line = orig_line.rstrip('\n')
3293
self.patch_line = patch_line.rstrip('\n')