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
57
Base class for errors raised by bzrlib.
56
59
: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.)
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.)
61
64
:cvar _fmt: Format string to display the error; this is expanded
62
by the instance's dict.
65
by the instance's dict.
65
68
internal_error = False
140
143
"""Return format string for this exception or None"""
141
144
fmt = getattr(self, '_fmt', None)
142
145
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)
144
151
fmt = getattr(self, '__doc__', None)
145
152
if fmt is not None:
146
153
symbol_versioning.warn("%s uses its docstring as a format, "
622
629
_fmt = 'Unsupported protocol for url "%(path)s"%(extra)s'
624
def __init__(self, url, extra):
631
def __init__(self, url, extra=""):
625
632
PathError.__init__(self, url, extra=extra)
713
720
self.bzrdir = bzrdir
714
721
PathError.__init__(self, path=path)
724
return '<%s %r>' % (self.__class__.__name__, self.__dict__)
716
726
def _format(self):
717
727
# XXX: Ideally self.detail would be a property, but Exceptions in
718
728
# Python 2.4 have to be old-style classes so properties don't work.
723
733
self.bzrdir.open_repository()
724
734
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.
727
746
self.detail = ': location is a repository'
783
802
_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)))
785
806
def __init__(self, branch, path):
786
807
BzrError.__init__(self)
787
808
self.branch = branch
850
871
"""Construct a new AlreadyVersionedError.
852
873
:param path: This is the path which is versioned,
853
which should be in a user friendly form.
874
which should be in a user friendly form.
854
875
:param context_info: If given, this is information about the context,
855
which could explain why this is expected to not be versioned.
876
which could explain why this is expected to not be versioned.
857
878
BzrError.__init__(self)
871
892
"""Construct a new NotVersionedError.
873
894
:param path: This is the path which is not versioned,
874
which should be in a user friendly form.
895
which should be in a user friendly form.
875
896
:param context_info: If given, this is information about the context,
876
which could explain why this is expected to be versioned.
897
which could explain why this is expected to be versioned.
878
899
BzrError.__init__(self)
947
968
# original exception is available as e.original_error
949
970
# 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.
971
def __init__(self, msg):
957
975
class LockActive(LockError):
1075
1091
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
1078
1106
class LockNotHeld(LockError):
1080
1108
_fmt = "Lock not held: %(lock)s"
1119
1147
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)
1122
1159
class BadCommitMessageEncoding(BzrError):
1124
1161
_fmt = 'The specified commit message contains characters unsupported by '\
1180
1217
class InvalidRevisionSpec(BzrError):
1182
1219
_fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
1183
" %(branch)s%(extra)s")
1220
" %(branch_url)s%(extra)s")
1185
1222
def __init__(self, spec, branch, extra=None):
1186
1223
BzrError.__init__(self, branch=branch, spec=spec)
1224
self.branch_url = getattr(branch, 'user_url', str(branch))
1188
1226
self.extra = '\n' + str(extra)
1381
1419
class WeaveParentMismatch(WeaveError):
1383
_fmt = "Parents are mismatched between two revisions. %(message)s"
1421
_fmt = "Parents are mismatched between two revisions. %(msg)s"
1386
1424
class WeaveInvalidChecksum(WeaveError):
1388
_fmt = "Text did not match it's checksum: %(message)s"
1426
_fmt = "Text did not match its checksum: %(msg)s"
1391
1429
class WeaveTextDiffers(WeaveError):
1629
1667
def __init__(self, exc_info):
1630
1668
import traceback
1669
# GZ 2010-08-10: Cycle with exc_tb/exc_info affects at least one test
1631
1670
self.exc_type, self.exc_value, self.exc_tb = exc_info
1632
1671
self.exc_info = exc_info
1633
1672
traceback_strings = traceback.format_exception(
1685
1724
class InvalidHttpResponse(TransportError):
1687
_fmt = "Invalid http response for %(path)s: %(msg)s"
1726
_fmt = "Invalid http response for %(path)s: %(msg)s%(orig_error)s"
1689
1728
def __init__(self, path, msg, orig_error=None):
1690
1729
self.path = path
1730
if orig_error is None:
1733
# This is reached for obscure and unusual errors so we want to
1734
# preserve as much info as possible to ease debug.
1735
orig_error = ': %r' % (orig_error,)
1691
1736
TransportError.__init__(self, msg, orig_error=orig_error)
1700
1745
InvalidHttpResponse.__init__(self, path, msg)
1748
class HttpBoundaryMissing(InvalidHttpResponse):
1749
"""A multipart response ends with no boundary marker.
1751
This is a special case caused by buggy proxies, described in
1752
<https://bugs.launchpad.net/bzr/+bug/198646>.
1755
_fmt = "HTTP MIME Boundary missing for %(path)s: %(msg)s"
1757
def __init__(self, path, msg):
1758
InvalidHttpResponse.__init__(self, path, msg)
1703
1761
class InvalidHttpContentType(InvalidHttpResponse):
1705
1763
_fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1733
1791
_fmt = "Working tree has conflicts."
1794
class ConfigContentError(BzrError):
1796
_fmt = "Config file %(filename)s is not UTF-8 encoded\n"
1798
def __init__(self, filename):
1799
BzrError.__init__(self)
1800
self.filename = filename
1736
1803
class ParseConfigError(BzrError):
1805
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1738
1807
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)
1808
BzrError.__init__(self)
1809
self.filename = filename
1810
self.errors = '\n'.join(e.msg for e in errors)
1813
class ConfigOptionValueError(BzrError):
1815
_fmt = """Bad value "%(value)s" for option "%(name)s"."""
1817
def __init__(self, name, value):
1818
BzrError.__init__(self, name=name, value=value)
1746
1821
class NoEmailInUsername(BzrError):
1755
1830
class SigningFailed(BzrError):
1757
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1832
_fmt = 'Failed to GPG sign data with command "%(command_line)s"'
1759
1834
def __init__(self, command_line):
1760
1835
BzrError.__init__(self, command_line=command_line)
1838
class SignatureVerificationFailed(BzrError):
1840
_fmt = 'Failed to verify GPG signature data with error "%(error)s"'
1842
def __init__(self, error):
1843
BzrError.__init__(self, error=error)
1846
class DependencyNotPresent(BzrError):
1848
_fmt = 'Unable to import library "%(library)s": %(error)s'
1850
def __init__(self, library, error):
1851
BzrError.__init__(self, library=library, error=error)
1854
class GpgmeNotInstalled(DependencyNotPresent):
1856
_fmt = 'python-gpgme is not installed, it is needed to verify signatures'
1858
def __init__(self, error):
1859
DependencyNotPresent.__init__(self, 'gpgme', error)
1763
1862
class WorkingTreeNotRevision(BzrError):
1765
1864
_fmt = ("The working tree for %(basedir)s has changed since"
1925
2024
_fmt = "Moving the root directory is not supported at this time"
2027
class TransformRenameFailed(BzrError):
2029
_fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
2031
def __init__(self, from_path, to_path, why, errno):
2032
self.from_path = from_path
2033
self.to_path = to_path
1928
2038
class BzrMoveFailedError(BzrError):
1930
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
2040
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
2041
"%(_has_extra)s%(extra)s")
1932
2043
def __init__(self, from_path='', to_path='', extra=None):
1933
2044
from bzrlib.osutils import splitpath
1934
2045
BzrError.__init__(self)
1936
self.extra = ': ' + str(extra)
2047
self.extra, self._has_extra = extra, ': '
2049
self.extra = self._has_extra = ''
1940
2051
has_from = len(from_path) > 0
1941
2052
has_to = len(to_path) > 0
1963
2074
class BzrRenameFailedError(BzrMoveFailedError):
1965
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
2076
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
2077
"%(_has_extra)s%(extra)s")
1967
2079
def __init__(self, from_path, to_path, extra=None):
1968
2080
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
1970
2083
class BzrRemoveChangedFilesError(BzrError):
1971
2084
"""Used when user is trying to remove changed files."""
1975
2088
"Use --keep to not delete them, or --force to delete them regardless.")
1977
2090
def __init__(self, tree_delta):
2091
symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
2092
"BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
1978
2093
BzrError.__init__(self)
1979
2094
self.changes_as_text = tree_delta.get_changes_as_text()
1980
2095
#self.paths_as_string = '\n'.join(changed_files)
1989
2104
class BzrBadParameterMissing(BzrBadParameter):
1991
_fmt = "Parameter $(param)s is required but not present."
2106
_fmt = "Parameter %(param)s is required but not present."
1994
2109
class BzrBadParameterUnicode(BzrBadParameter):
2002
2117
_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
2120
class ParamikoNotPresent(DependencyNotPresent):
2015
2122
_fmt = "Unable to import paramiko (required for sftp support): %(error)s"
2360
class GhostTagsNotSupported(BzrError):
2362
_fmt = "Ghost tags not supported by format %(format)r."
2364
def __init__(self, format):
2365
self.format = format
2253
2368
class BinaryFile(BzrError):
2255
2370
_fmt = "File is binary but should be text."
2619
2734
This is distinct from ErrorFromSmartServer so that it is possible to
2620
2735
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.
2737
- ErrorFromSmartServer was uncaught. This is logic error in the client
2738
and so should provoke a traceback to the user.
2739
- ErrorFromSmartServer was caught but its error_tuple could not be
2740
translated. This is probably because the server sent us garbage, and
2741
should not provoke a traceback.
2628
2744
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2684
2800
_fmt = "Container has multiple records with the same name: %(name)s"
2686
2802
def __init__(self, name):
2803
self.name = name.decode("utf-8")
2690
2806
class NoDestinationAddress(InternalBzrError):
2835
2951
more = ' ' + more
2836
2952
import bzrlib.urlutils as urlutils
2837
display_url = urlutils.unescape_for_display(
2838
tree.user_url, 'ascii')
2953
user_url = getattr(tree, "user_url", None)
2954
if user_url is None:
2955
display_url = str(tree)
2957
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2839
2958
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2961
class ShelvedChanges(UncommittedChanges):
2963
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2964
' (See bzr shelve --list).%(more)s')
2842
2967
class MissingTemplateVariable(BzrError):
2844
2969
_fmt = 'Variable {%(name)s} is not available.'
2913
3038
self.user_encoding = osutils.get_user_encoding()
3041
class NoSuchConfig(BzrError):
3043
_fmt = ('The "%(config_id)s" configuration does not exist.')
3045
def __init__(self, config_id):
3046
BzrError.__init__(self, config_id=config_id)
3049
class NoSuchConfigOption(BzrError):
3051
_fmt = ('The "%(option_name)s" configuration option does not exist.')
3053
def __init__(self, option_name):
3054
BzrError.__init__(self, option_name=option_name)
2916
3057
class NoSuchAlias(BzrError):
2918
3059
_fmt = ('The alias "%(alias_name)s" does not exist.')
3002
3143
_fmt = "Shelf corrupt."
3146
class DecompressCorruption(BzrError):
3148
_fmt = "Corruption while decompressing repository file%(orig_error)s"
3150
def __init__(self, orig_error=None):
3151
if orig_error is not None:
3152
self.orig_error = ", %s" % (orig_error,)
3154
self.orig_error = ""
3155
BzrError.__init__(self)
3005
3158
class NoSuchShelfId(BzrError):
3007
3160
_fmt = 'No changes are shelved with id "%(shelf_id)d".'
3134
3287
def __init__(self, bzrdir):
3135
3288
self.bzrdir = bzrdir
3291
class NoWhoami(BzrError):
3293
_fmt = ('Unable to determine your name.\n'
3294
"Please, set your name with the 'whoami' command.\n"
3295
'E.g. bzr whoami "Your Name <name@example.com>"')
3298
class InvalidPattern(BzrError):
3300
_fmt = ('Invalid pattern(s) found. %(msg)s')
3302
def __init__(self, msg):
3306
class RecursiveBind(BzrError):
3308
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3309
'Please use `bzr unbind` to fix.')
3311
def __init__(self, branch_url):
3312
self.branch_url = branch_url
3315
# FIXME: I would prefer to define the config related exception classes in
3316
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3317
class OptionExpansionLoop(BzrError):
3319
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3321
def __init__(self, string, refs):
3322
self.string = string
3323
self.refs = '->'.join(refs)
3326
class ExpandingUnknownOption(BzrError):
3328
_fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
3330
def __init__(self, name, string):
3332
self.string = string
3335
class NoCompatibleInter(BzrError):
3337
_fmt = ('No compatible object available for operations from %(source)r '
3340
def __init__(self, source, target):
3341
self.source = source
3342
self.target = target
3345
class HpssVfsRequestNotAllowed(BzrError):
3347
_fmt = ("VFS requests over the smart server are not allowed. Encountered: "
3348
"%(method)s, %(arguments)s.")
3350
def __init__(self, method, arguments):
3351
self.method = method
3352
self.arguments = arguments