1
# Copyright (C) 2005-2010 Canonical Ltd
1
# Copyright (C) 2005-2011 Canonical Ltd
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
54
56
Base class for errors raised by bzrlib.
56
58
: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.)
59
should be displayed with a traceback; if False (or absent) this was
60
probably a user or environment error and they don't need the gory
61
details. (That can be overridden by -Derror on the command line.)
61
63
:cvar _fmt: Format string to display the error; this is expanded
62
by the instance's dict.
64
by the instance's dict.
65
67
internal_error = False
140
142
"""Return format string for this exception or None"""
141
143
fmt = getattr(self, '_fmt', None)
142
144
if fmt is not None:
144
147
fmt = getattr(self, '__doc__', None)
145
148
if fmt is not None:
146
149
symbol_versioning.warn("%s uses its docstring as a format, "
622
625
_fmt = 'Unsupported protocol for url "%(path)s"%(extra)s'
624
def __init__(self, url, extra):
627
def __init__(self, url, extra=""):
625
628
PathError.__init__(self, url, extra=extra)
713
716
self.bzrdir = bzrdir
714
717
PathError.__init__(self, path=path)
720
return '<%s %r>' % (self.__class__.__name__, self.__dict__)
716
722
def _format(self):
717
723
# XXX: Ideally self.detail would be a property, but Exceptions in
718
724
# Python 2.4 have to be old-style classes so properties don't work.
723
729
self.bzrdir.open_repository()
724
730
except NoRepositoryPresent:
733
# Just ignore unexpected errors. Raising arbitrary errors
734
# during str(err) can provoke strange bugs. Concretely
735
# Launchpad's codehosting managed to raise NotBranchError
736
# here, and then get stuck in an infinite loop/recursion
737
# trying to str() that error. All this error really cares
738
# about that there's no working repository there, and if
739
# open_repository() fails, there probably isn't.
727
742
self.detail = ': location is a repository'
783
798
_fmt = 'File "%(path)s" is not in branch %(branch_base)s.'
800
# use PathNotChild instead
801
@symbol_versioning.deprecated_method(symbol_versioning.deprecated_in((2, 3, 0)))
785
802
def __init__(self, branch, path):
786
803
BzrError.__init__(self)
787
804
self.branch = branch
850
867
"""Construct a new AlreadyVersionedError.
852
869
:param path: This is the path which is versioned,
853
which should be in a user friendly form.
870
which should be in a user friendly form.
854
871
:param context_info: If given, this is information about the context,
855
which could explain why this is expected to not be versioned.
872
which could explain why this is expected to not be versioned.
857
874
BzrError.__init__(self)
871
888
"""Construct a new NotVersionedError.
873
890
:param path: This is the path which is not versioned,
874
which should be in a user friendly form.
891
which should be in a user friendly form.
875
892
:param context_info: If given, this is information about the context,
876
which could explain why this is expected to be versioned.
893
which could explain why this is expected to be versioned.
878
895
BzrError.__init__(self)
947
964
# original exception is available as e.original_error
949
966
# New code should prefer to raise specific subclasses
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.
967
def __init__(self, msg):
957
971
class LockActive(LockError):
1075
1087
self.target = target
1090
class LockCorrupt(LockError):
1092
_fmt = ("Lock is apparently held, but corrupted: %(corruption_info)s\n"
1093
"Use 'bzr break-lock' to clear it")
1095
internal_error = False
1097
def __init__(self, corruption_info, file_data=None):
1098
self.corruption_info = corruption_info
1099
self.file_data = file_data
1078
1102
class LockNotHeld(LockError):
1080
1104
_fmt = "Lock not held: %(lock)s"
1119
1143
BzrError.__init__(self, files=files, files_str=files_str)
1146
class ExcludesUnsupported(BzrError):
1148
_fmt = ('Excluding paths during commit is not supported by '
1149
'repository at %(repository)r.')
1151
def __init__(self, repository):
1152
BzrError.__init__(self, repository=repository)
1122
1155
class BadCommitMessageEncoding(BzrError):
1124
1157
_fmt = 'The specified commit message contains characters unsupported by '\
1180
1213
class InvalidRevisionSpec(BzrError):
1182
1215
_fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
1183
" %(branch)s%(extra)s")
1216
" %(branch_url)s%(extra)s")
1185
1218
def __init__(self, spec, branch, extra=None):
1186
1219
BzrError.__init__(self, branch=branch, spec=spec)
1220
self.branch_url = getattr(branch, 'user_url', str(branch))
1188
1222
self.extra = '\n' + str(extra)
1381
1415
class WeaveParentMismatch(WeaveError):
1383
_fmt = "Parents are mismatched between two revisions. %(message)s"
1417
_fmt = "Parents are mismatched between two revisions. %(msg)s"
1386
1420
class WeaveInvalidChecksum(WeaveError):
1388
_fmt = "Text did not match it's checksum: %(message)s"
1422
_fmt = "Text did not match its checksum: %(msg)s"
1391
1425
class WeaveTextDiffers(WeaveError):
1685
1719
class InvalidHttpResponse(TransportError):
1687
_fmt = "Invalid http response for %(path)s: %(msg)s"
1721
_fmt = "Invalid http response for %(path)s: %(msg)s%(orig_error)s"
1689
1723
def __init__(self, path, msg, orig_error=None):
1690
1724
self.path = path
1725
if orig_error is None:
1728
# This is reached for obscure and unusual errors so we want to
1729
# preserve as much info as possible to ease debug.
1730
orig_error = ': %r' % (orig_error,)
1691
1731
TransportError.__init__(self, msg, orig_error=orig_error)
1700
1740
InvalidHttpResponse.__init__(self, path, msg)
1743
class HttpBoundaryMissing(InvalidHttpResponse):
1744
"""A multipart response ends with no boundary marker.
1746
This is a special case caused by buggy proxies, described in
1747
<https://bugs.launchpad.net/bzr/+bug/198646>.
1750
_fmt = "HTTP MIME Boundary missing for %(path)s: %(msg)s"
1752
def __init__(self, path, msg):
1753
InvalidHttpResponse.__init__(self, path, msg)
1703
1756
class InvalidHttpContentType(InvalidHttpResponse):
1705
1758
_fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1733
1786
_fmt = "Working tree has conflicts."
1789
class ConfigContentError(BzrError):
1791
_fmt = "Config file %(filename)s is not UTF-8 encoded\n"
1793
def __init__(self, filename):
1794
BzrError.__init__(self)
1795
self.filename = filename
1736
1798
class ParseConfigError(BzrError):
1800
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1738
1802
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)
1803
BzrError.__init__(self)
1804
self.filename = filename
1805
self.errors = '\n'.join(e.msg for e in errors)
1808
class ConfigOptionValueError(BzrError):
1810
_fmt = """Bad value "%(value)s" for option "%(name)s"."""
1812
def __init__(self, name, value):
1813
BzrError.__init__(self, name=name, value=value)
1746
1816
class NoEmailInUsername(BzrError):
1755
1825
class SigningFailed(BzrError):
1757
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1827
_fmt = 'Failed to GPG sign data with command "%(command_line)s"'
1759
1829
def __init__(self, command_line):
1760
1830
BzrError.__init__(self, command_line=command_line)
1833
class SignatureVerificationFailed(BzrError):
1835
_fmt = 'Failed to verify GPG signature data with error "%(error)s"'
1837
def __init__(self, error):
1838
BzrError.__init__(self, error=error)
1841
class DependencyNotPresent(BzrError):
1843
_fmt = 'Unable to import library "%(library)s": %(error)s'
1845
def __init__(self, library, error):
1846
BzrError.__init__(self, library=library, error=error)
1849
class GpgmeNotInstalled(DependencyNotPresent):
1851
_fmt = 'python-gpgme is not installed, it is needed to verify signatures'
1853
def __init__(self, error):
1854
DependencyNotPresent.__init__(self, 'gpgme', error)
1763
1857
class WorkingTreeNotRevision(BzrError):
1765
1859
_fmt = ("The working tree for %(basedir)s has changed since"
1925
2019
_fmt = "Moving the root directory is not supported at this time"
2022
class TransformRenameFailed(BzrError):
2024
_fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
2026
def __init__(self, from_path, to_path, why, errno):
2027
self.from_path = from_path
2028
self.to_path = to_path
1928
2033
class BzrMoveFailedError(BzrError):
1930
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
2035
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
2036
"%(_has_extra)s%(extra)s")
1932
2038
def __init__(self, from_path='', to_path='', extra=None):
1933
2039
from bzrlib.osutils import splitpath
1934
2040
BzrError.__init__(self)
1936
self.extra = ': ' + str(extra)
2042
self.extra, self._has_extra = extra, ': '
2044
self.extra = self._has_extra = ''
1940
2046
has_from = len(from_path) > 0
1941
2047
has_to = len(to_path) > 0
1963
2069
class BzrRenameFailedError(BzrMoveFailedError):
1965
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
2071
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
2072
"%(_has_extra)s%(extra)s")
1967
2074
def __init__(self, from_path, to_path, extra=None):
1968
2075
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
1970
2078
class BzrRemoveChangedFilesError(BzrError):
1971
2079
"""Used when user is trying to remove changed files."""
1975
2083
"Use --keep to not delete them, or --force to delete them regardless.")
1977
2085
def __init__(self, tree_delta):
2086
symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
2087
"BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
1978
2088
BzrError.__init__(self)
1979
2089
self.changes_as_text = tree_delta.get_changes_as_text()
1980
2090
#self.paths_as_string = '\n'.join(changed_files)
1989
2099
class BzrBadParameterMissing(BzrBadParameter):
1991
_fmt = "Parameter $(param)s is required but not present."
2101
_fmt = "Parameter %(param)s is required but not present."
1994
2104
class BzrBadParameterUnicode(BzrBadParameter):
2002
2112
_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)
2013
2115
class ParamikoNotPresent(DependencyNotPresent):
2015
2117
_fmt = "Unable to import paramiko (required for sftp support): %(error)s"
2619
2721
This is distinct from ErrorFromSmartServer so that it is possible to
2620
2722
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.
2724
- ErrorFromSmartServer was uncaught. This is logic error in the client
2725
and so should provoke a traceback to the user.
2726
- ErrorFromSmartServer was caught but its error_tuple could not be
2727
translated. This is probably because the server sent us garbage, and
2728
should not provoke a traceback.
2628
2731
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2835
2938
more = ' ' + more
2836
2939
import bzrlib.urlutils as urlutils
2837
display_url = urlutils.unescape_for_display(
2838
tree.user_url, 'ascii')
2940
user_url = getattr(tree, "user_url", None)
2941
if user_url is None:
2942
display_url = str(tree)
2944
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2839
2945
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2948
class ShelvedChanges(UncommittedChanges):
2950
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2951
' (See bzr shelve --list).%(more)s')
2842
2954
class MissingTemplateVariable(BzrError):
2844
2956
_fmt = 'Variable {%(name)s} is not available.'
2913
3025
self.user_encoding = osutils.get_user_encoding()
3028
class NoSuchConfig(BzrError):
3030
_fmt = ('The "%(config_id)s" configuration does not exist.')
3032
def __init__(self, config_id):
3033
BzrError.__init__(self, config_id=config_id)
3036
class NoSuchConfigOption(BzrError):
3038
_fmt = ('The "%(option_name)s" configuration option does not exist.')
3040
def __init__(self, option_name):
3041
BzrError.__init__(self, option_name=option_name)
2916
3044
class NoSuchAlias(BzrError):
2918
3046
_fmt = ('The alias "%(alias_name)s" does not exist.')
3002
3130
_fmt = "Shelf corrupt."
3133
class DecompressCorruption(BzrError):
3135
_fmt = "Corruption while decompressing repository file%(orig_error)s"
3137
def __init__(self, orig_error=None):
3138
if orig_error is not None:
3139
self.orig_error = ", %s" % (orig_error,)
3141
self.orig_error = ""
3142
BzrError.__init__(self)
3005
3145
class NoSuchShelfId(BzrError):
3007
3147
_fmt = 'No changes are shelved with id "%(shelf_id)d".'
3134
3274
def __init__(self, bzrdir):
3135
3275
self.bzrdir = bzrdir
3278
class NoWhoami(BzrError):
3280
_fmt = ('Unable to determine your name.\n'
3281
"Please, set your name with the 'whoami' command.\n"
3282
'E.g. bzr whoami "Your Name <name@example.com>"')
3285
class InvalidPattern(BzrError):
3287
_fmt = ('Invalid pattern(s) found. %(msg)s')
3289
def __init__(self, msg):
3293
class RecursiveBind(BzrError):
3295
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3296
'Please use `bzr unbind` to fix.')
3298
def __init__(self, branch_url):
3299
self.branch_url = branch_url
3302
# FIXME: I would prefer to define the config related exception classes in
3303
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3304
class OptionExpansionLoop(BzrError):
3306
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3308
def __init__(self, string, refs):
3309
self.string = string
3310
self.refs = '->'.join(refs)
3313
class ExpandingUnknownOption(BzrError):
3315
_fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
3317
def __init__(self, name, string):
3319
self.string = string
3322
class NoCompatibleInter(BzrError):
3324
_fmt = ('No compatible object available for operations from %(source)r '
3327
def __init__(self, source, target):
3328
self.source = source
3329
self.target = target
3332
class HpssVfsRequestNotAllowed(BzrError):
3334
_fmt = ("VFS requests over the smart server are not allowed. Encountered: "
3335
"%(method)s, %(arguments)s.")
3337
def __init__(self, method, arguments):
3338
self.method = method
3339
self.arguments = arguments