57
54
Base class for errors raised by bzrlib.
59
56
:cvar internal_error: if True this was probably caused by a bzr bug and
60
should be displayed with a traceback; if False (or absent) this was
61
probably a user or environment error and they don't need the gory
62
details. (That can be overridden by -Derror on the command line.)
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.)
64
61
:cvar _fmt: Format string to display the error; this is expanded
65
by the instance's dict.
62
by the instance's dict.
68
65
internal_error = False
143
140
"""Return format string for this exception or None"""
144
141
fmt = getattr(self, '_fmt', None)
145
142
if fmt is not None:
147
unicode_fmt = unicode(fmt) #_fmt strings should be ascii
148
if type(fmt) == unicode:
149
trace.mutter("Unicode strings in error.fmt are deprecated")
150
return gettext(unicode_fmt)
151
144
fmt = getattr(self, '__doc__', None)
152
145
if fmt is not None:
153
146
symbol_versioning.warn("%s uses its docstring as a format, "
629
622
_fmt = 'Unsupported protocol for url "%(path)s"%(extra)s'
631
def __init__(self, url, extra=""):
624
def __init__(self, url, extra):
632
625
PathError.__init__(self, url, extra=extra)
720
713
self.bzrdir = bzrdir
721
714
PathError.__init__(self, path=path)
724
return '<%s %r>' % (self.__class__.__name__, self.__dict__)
726
716
def _format(self):
727
717
# XXX: Ideally self.detail would be a property, but Exceptions in
728
718
# Python 2.4 have to be old-style classes so properties don't work.
733
723
self.bzrdir.open_repository()
734
724
except NoRepositoryPresent:
737
# Just ignore unexpected errors. Raising arbitrary errors
738
# during str(err) can provoke strange bugs. Concretely
739
# Launchpad's codehosting managed to raise NotBranchError
740
# here, and then get stuck in an infinite loop/recursion
741
# trying to str() that error. All this error really cares
742
# about that there's no working repository there, and if
743
# open_repository() fails, there probably isn't.
746
727
self.detail = ': location is a repository'
802
783
_fmt = 'File "%(path)s" is not in branch %(branch_base)s.'
804
# use PathNotChild instead
805
@symbol_versioning.deprecated_method(symbol_versioning.deprecated_in((2, 3, 0)))
806
785
def __init__(self, branch, path):
807
786
BzrError.__init__(self)
808
787
self.branch = branch
871
850
"""Construct a new AlreadyVersionedError.
873
852
:param path: This is the path which is versioned,
874
which should be in a user friendly form.
853
which should be in a user friendly form.
875
854
:param context_info: If given, this is information about the context,
876
which could explain why this is expected to not be versioned.
855
which could explain why this is expected to not be versioned.
878
857
BzrError.__init__(self)
892
871
"""Construct a new NotVersionedError.
894
873
:param path: This is the path which is not versioned,
895
which should be in a user friendly form.
874
which should be in a user friendly form.
896
875
:param context_info: If given, this is information about the context,
897
which could explain why this is expected to be versioned.
876
which could explain why this is expected to be versioned.
899
878
BzrError.__init__(self)
968
947
# original exception is available as e.original_error
970
949
# New code should prefer to raise specific subclasses
971
def __init__(self, msg):
950
def __init__(self, message):
951
# Python 2.5 uses a slot for StandardError.message,
952
# so use a different variable name. We now work around this in
953
# BzrError.__str__, but this member name is kept for compatability.
975
957
class LockActive(LockError):
1091
1075
self.target = target
1094
class LockCorrupt(LockError):
1096
_fmt = ("Lock is apparently held, but corrupted: %(corruption_info)s\n"
1097
"Use 'bzr break-lock' to clear it")
1099
internal_error = False
1101
def __init__(self, corruption_info, file_data=None):
1102
self.corruption_info = corruption_info
1103
self.file_data = file_data
1106
1078
class LockNotHeld(LockError):
1108
1080
_fmt = "Lock not held: %(lock)s"
1147
1119
BzrError.__init__(self, files=files, files_str=files_str)
1150
class ExcludesUnsupported(BzrError):
1152
_fmt = ('Excluding paths during commit is not supported by '
1153
'repository at %(repository)r.')
1155
def __init__(self, repository):
1156
BzrError.__init__(self, repository=repository)
1159
1122
class BadCommitMessageEncoding(BzrError):
1161
1124
_fmt = 'The specified commit message contains characters unsupported by '\
1217
1180
class InvalidRevisionSpec(BzrError):
1219
1182
_fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
1220
" %(branch_url)s%(extra)s")
1183
" %(branch)s%(extra)s")
1222
1185
def __init__(self, spec, branch, extra=None):
1223
1186
BzrError.__init__(self, branch=branch, spec=spec)
1224
self.branch_url = getattr(branch, 'user_url', str(branch))
1226
1188
self.extra = '\n' + str(extra)
1419
1381
class WeaveParentMismatch(WeaveError):
1421
_fmt = "Parents are mismatched between two revisions. %(msg)s"
1383
_fmt = "Parents are mismatched between two revisions. %(message)s"
1424
1386
class WeaveInvalidChecksum(WeaveError):
1426
_fmt = "Text did not match its checksum: %(msg)s"
1388
_fmt = "Text did not match it's checksum: %(message)s"
1429
1391
class WeaveTextDiffers(WeaveError):
1668
1629
def __init__(self, exc_info):
1669
1630
import traceback
1670
# GZ 2010-08-10: Cycle with exc_tb/exc_info affects at least one test
1671
1631
self.exc_type, self.exc_value, self.exc_tb = exc_info
1672
1632
self.exc_info = exc_info
1673
1633
traceback_strings = traceback.format_exception(
1712
1672
_fmt = "Connection closed: %(msg)s %(orig_error)s"
1715
class ConnectionTimeout(ConnectionError):
1717
_fmt = "Connection Timeout: %(msg)s%(orig_error)s"
1720
1675
class InvalidRange(TransportError):
1722
1677
_fmt = "Invalid range access in %(path)s at %(offset)s: %(msg)s"
1730
1685
class InvalidHttpResponse(TransportError):
1732
_fmt = "Invalid http response for %(path)s: %(msg)s%(orig_error)s"
1687
_fmt = "Invalid http response for %(path)s: %(msg)s"
1734
1689
def __init__(self, path, msg, orig_error=None):
1735
1690
self.path = path
1736
if orig_error is None:
1739
# This is reached for obscure and unusual errors so we want to
1740
# preserve as much info as possible to ease debug.
1741
orig_error = ': %r' % (orig_error,)
1742
1691
TransportError.__init__(self, msg, orig_error=orig_error)
1751
1700
InvalidHttpResponse.__init__(self, path, msg)
1754
class HttpBoundaryMissing(InvalidHttpResponse):
1755
"""A multipart response ends with no boundary marker.
1757
This is a special case caused by buggy proxies, described in
1758
<https://bugs.launchpad.net/bzr/+bug/198646>.
1761
_fmt = "HTTP MIME Boundary missing for %(path)s: %(msg)s"
1763
def __init__(self, path, msg):
1764
InvalidHttpResponse.__init__(self, path, msg)
1767
1703
class InvalidHttpContentType(InvalidHttpResponse):
1769
1705
_fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1797
1733
_fmt = "Working tree has conflicts."
1800
class ConfigContentError(BzrError):
1802
_fmt = "Config file %(filename)s is not UTF-8 encoded\n"
1804
def __init__(self, filename):
1805
BzrError.__init__(self)
1806
self.filename = filename
1809
1736
class ParseConfigError(BzrError):
1811
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1813
1738
def __init__(self, errors, filename):
1814
BzrError.__init__(self)
1815
self.filename = filename
1816
self.errors = '\n'.join(e.msg for e in errors)
1819
class ConfigOptionValueError(BzrError):
1821
_fmt = """Bad value "%(value)s" for option "%(name)s"."""
1823
def __init__(self, name, value):
1824
BzrError.__init__(self, name=name, value=value)
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)
1827
1746
class NoEmailInUsername(BzrError):
1836
1755
class SigningFailed(BzrError):
1838
_fmt = 'Failed to GPG sign data with command "%(command_line)s"'
1757
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1840
1759
def __init__(self, command_line):
1841
1760
BzrError.__init__(self, command_line=command_line)
1844
class SignatureVerificationFailed(BzrError):
1846
_fmt = 'Failed to verify GPG signature data with error "%(error)s"'
1848
def __init__(self, error):
1849
BzrError.__init__(self, error=error)
1852
class DependencyNotPresent(BzrError):
1854
_fmt = 'Unable to import library "%(library)s": %(error)s'
1856
def __init__(self, library, error):
1857
BzrError.__init__(self, library=library, error=error)
1860
class GpgmeNotInstalled(DependencyNotPresent):
1862
_fmt = 'python-gpgme is not installed, it is needed to verify signatures'
1864
def __init__(self, error):
1865
DependencyNotPresent.__init__(self, 'gpgme', error)
1868
1763
class WorkingTreeNotRevision(BzrError):
1870
1765
_fmt = ("The working tree for %(basedir)s has changed since"
2030
1925
_fmt = "Moving the root directory is not supported at this time"
2033
class TransformRenameFailed(BzrError):
2035
_fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
2037
def __init__(self, from_path, to_path, why, errno):
2038
self.from_path = from_path
2039
self.to_path = to_path
2044
1928
class BzrMoveFailedError(BzrError):
2046
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
2047
"%(_has_extra)s%(extra)s")
1930
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
2049
1932
def __init__(self, from_path='', to_path='', extra=None):
2050
1933
from bzrlib.osutils import splitpath
2051
1934
BzrError.__init__(self)
2053
self.extra, self._has_extra = extra, ': '
1936
self.extra = ': ' + str(extra)
2055
self.extra = self._has_extra = ''
2057
1940
has_from = len(from_path) > 0
2058
1941
has_to = len(to_path) > 0
2080
1963
class BzrRenameFailedError(BzrMoveFailedError):
2082
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
2083
"%(_has_extra)s%(extra)s")
1965
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
2085
1967
def __init__(self, from_path, to_path, extra=None):
2086
1968
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
2089
1970
class BzrRemoveChangedFilesError(BzrError):
2090
1971
"""Used when user is trying to remove changed files."""
2094
1975
"Use --keep to not delete them, or --force to delete them regardless.")
2096
1977
def __init__(self, tree_delta):
2097
symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
2098
"BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
2099
1978
BzrError.__init__(self)
2100
1979
self.changes_as_text = tree_delta.get_changes_as_text()
2101
1980
#self.paths_as_string = '\n'.join(changed_files)
2123
2002
_fmt = "Parameter %(param)s contains a newline."
2005
class DependencyNotPresent(BzrError):
2007
_fmt = 'Unable to import library "%(library)s": %(error)s'
2009
def __init__(self, library, error):
2010
BzrError.__init__(self, library=library, error=error)
2126
2013
class ParamikoNotPresent(DependencyNotPresent):
2128
2015
_fmt = "Unable to import paramiko (required for sftp support): %(error)s"
2366
class GhostTagsNotSupported(BzrError):
2368
_fmt = "Ghost tags not supported by format %(format)r."
2370
def __init__(self, format):
2371
self.format = format
2374
2253
class BinaryFile(BzrError):
2376
2255
_fmt = "File is binary but should be text."
2740
2619
This is distinct from ErrorFromSmartServer so that it is possible to
2741
2620
distinguish between the following two cases:
2743
- ErrorFromSmartServer was uncaught. This is logic error in the client
2744
and so should provoke a traceback to the user.
2745
- ErrorFromSmartServer was caught but its error_tuple could not be
2746
translated. This is probably because the server sent us garbage, and
2747
should not provoke a traceback.
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.
2750
2628
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2957
2835
more = ' ' + more
2958
2836
import bzrlib.urlutils as urlutils
2959
user_url = getattr(tree, "user_url", None)
2960
if user_url is None:
2961
display_url = str(tree)
2963
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2837
display_url = urlutils.unescape_for_display(
2838
tree.user_url, 'ascii')
2964
2839
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2967
class ShelvedChanges(UncommittedChanges):
2969
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2970
' (See bzr shelve --list).%(more)s')
2973
2842
class MissingTemplateVariable(BzrError):
2975
2844
_fmt = 'Variable {%(name)s} is not available.'
3044
2913
self.user_encoding = osutils.get_user_encoding()
3047
class NoSuchConfig(BzrError):
3049
_fmt = ('The "%(config_id)s" configuration does not exist.')
3051
def __init__(self, config_id):
3052
BzrError.__init__(self, config_id=config_id)
3055
class NoSuchConfigOption(BzrError):
3057
_fmt = ('The "%(option_name)s" configuration option does not exist.')
3059
def __init__(self, option_name):
3060
BzrError.__init__(self, option_name=option_name)
3063
2916
class NoSuchAlias(BzrError):
3065
2918
_fmt = ('The alias "%(alias_name)s" does not exist.')
3149
3002
_fmt = "Shelf corrupt."
3152
class DecompressCorruption(BzrError):
3154
_fmt = "Corruption while decompressing repository file%(orig_error)s"
3156
def __init__(self, orig_error=None):
3157
if orig_error is not None:
3158
self.orig_error = ", %s" % (orig_error,)
3160
self.orig_error = ""
3161
BzrError.__init__(self)
3164
3005
class NoSuchShelfId(BzrError):
3166
3007
_fmt = 'No changes are shelved with id "%(shelf_id)d".'
3293
3134
def __init__(self, bzrdir):
3294
3135
self.bzrdir = bzrdir
3297
class NoWhoami(BzrError):
3299
_fmt = ('Unable to determine your name.\n'
3300
"Please, set your name with the 'whoami' command.\n"
3301
'E.g. bzr whoami "Your Name <name@example.com>"')
3304
class InvalidPattern(BzrError):
3306
_fmt = ('Invalid pattern(s) found. %(msg)s')
3308
def __init__(self, msg):
3312
class RecursiveBind(BzrError):
3314
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3315
'Please use `bzr unbind` to fix.')
3317
def __init__(self, branch_url):
3318
self.branch_url = branch_url
3321
# FIXME: I would prefer to define the config related exception classes in
3322
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3323
class OptionExpansionLoop(BzrError):
3325
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3327
def __init__(self, string, refs):
3328
self.string = string
3329
self.refs = '->'.join(refs)
3332
class ExpandingUnknownOption(BzrError):
3334
_fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
3336
def __init__(self, name, string):
3338
self.string = string
3341
class NoCompatibleInter(BzrError):
3343
_fmt = ('No compatible object available for operations from %(source)r '
3346
def __init__(self, source, target):
3347
self.source = source
3348
self.target = target
3351
class HpssVfsRequestNotAllowed(BzrError):
3353
_fmt = ("VFS requests over the smart server are not allowed. Encountered: "
3354
"%(method)s, %(arguments)s.")
3356
def __init__(self, method, arguments):
3357
self.method = method
3358
self.arguments = arguments
3361
class UnsupportedKindChange(BzrError):
3363
_fmt = ("Kind change from %(from_kind)s to %(to_kind)s for "
3364
"%(path)s not supported by format %(format)r")
3366
def __init__(self, path, from_kind, to_kind, format):
3368
self.from_kind = from_kind
3369
self.to_kind = to_kind
3370
self.format = format