1
# Copyright (C) 2005-2011 Canonical Ltd
1
# Copyright (C) 2005-2010 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
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
1073
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
1076
class LockNotHeld(LockError):
1108
1078
_fmt = "Lock not held: %(lock)s"
1147
1117
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
1120
class BadCommitMessageEncoding(BzrError):
1161
1122
_fmt = 'The specified commit message contains characters unsupported by '\
1217
1178
class InvalidRevisionSpec(BzrError):
1219
1180
_fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
1220
" %(branch_url)s%(extra)s")
1181
" %(branch)s%(extra)s")
1222
1183
def __init__(self, spec, branch, extra=None):
1223
1184
BzrError.__init__(self, branch=branch, spec=spec)
1224
self.branch_url = getattr(branch, 'user_url', str(branch))
1226
1186
self.extra = '\n' + str(extra)
1419
1379
class WeaveParentMismatch(WeaveError):
1421
_fmt = "Parents are mismatched between two revisions. %(msg)s"
1381
_fmt = "Parents are mismatched between two revisions. %(message)s"
1424
1384
class WeaveInvalidChecksum(WeaveError):
1426
_fmt = "Text did not match its checksum: %(msg)s"
1386
_fmt = "Text did not match it's checksum: %(message)s"
1429
1389
class WeaveTextDiffers(WeaveError):
1710
1670
_fmt = "Connection closed: %(msg)s %(orig_error)s"
1713
class ConnectionTimeout(ConnectionError):
1715
_fmt = "Connection Timeout: %(msg)s%(orig_error)s"
1718
1673
class InvalidRange(TransportError):
1720
1675
_fmt = "Invalid range access in %(path)s at %(offset)s: %(msg)s"
1728
1683
class InvalidHttpResponse(TransportError):
1730
_fmt = "Invalid http response for %(path)s: %(msg)s%(orig_error)s"
1685
_fmt = "Invalid http response for %(path)s: %(msg)s"
1732
1687
def __init__(self, path, msg, orig_error=None):
1733
1688
self.path = path
1734
if orig_error is None:
1737
# This is reached for obscure and unusual errors so we want to
1738
# preserve as much info as possible to ease debug.
1739
orig_error = ': %r' % (orig_error,)
1740
1689
TransportError.__init__(self, msg, orig_error=orig_error)
1749
1698
InvalidHttpResponse.__init__(self, path, msg)
1752
class HttpBoundaryMissing(InvalidHttpResponse):
1753
"""A multipart response ends with no boundary marker.
1755
This is a special case caused by buggy proxies, described in
1756
<https://bugs.launchpad.net/bzr/+bug/198646>.
1759
_fmt = "HTTP MIME Boundary missing for %(path)s: %(msg)s"
1761
def __init__(self, path, msg):
1762
InvalidHttpResponse.__init__(self, path, msg)
1765
1701
class InvalidHttpContentType(InvalidHttpResponse):
1767
1703
_fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1795
1731
_fmt = "Working tree has conflicts."
1798
class ConfigContentError(BzrError):
1800
_fmt = "Config file %(filename)s is not UTF-8 encoded\n"
1802
def __init__(self, filename):
1803
BzrError.__init__(self)
1804
self.filename = filename
1807
1734
class ParseConfigError(BzrError):
1809
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1811
1736
def __init__(self, errors, filename):
1812
BzrError.__init__(self)
1813
self.filename = filename
1814
self.errors = '\n'.join(e.msg for e in errors)
1817
class ConfigOptionValueError(BzrError):
1819
_fmt = """Bad value "%(value)s" for option "%(name)s"."""
1821
def __init__(self, name, value):
1822
BzrError.__init__(self, name=name, value=value)
1737
if filename is None:
1739
message = "Error(s) parsing config file %s:\n%s" % \
1740
(filename, ('\n'.join(e.msg for e in errors)))
1741
BzrError.__init__(self, message)
1825
1744
class NoEmailInUsername(BzrError):
1834
1753
class SigningFailed(BzrError):
1836
_fmt = 'Failed to GPG sign data with command "%(command_line)s"'
1755
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1838
1757
def __init__(self, command_line):
1839
1758
BzrError.__init__(self, command_line=command_line)
1842
class SignatureVerificationFailed(BzrError):
1844
_fmt = 'Failed to verify GPG signature data with error "%(error)s"'
1846
def __init__(self, error):
1847
BzrError.__init__(self, error=error)
1850
class DependencyNotPresent(BzrError):
1852
_fmt = 'Unable to import library "%(library)s": %(error)s'
1854
def __init__(self, library, error):
1855
BzrError.__init__(self, library=library, error=error)
1858
class GpgmeNotInstalled(DependencyNotPresent):
1860
_fmt = 'python-gpgme is not installed, it is needed to verify signatures'
1862
def __init__(self, error):
1863
DependencyNotPresent.__init__(self, 'gpgme', error)
1866
1761
class WorkingTreeNotRevision(BzrError):
1868
1763
_fmt = ("The working tree for %(basedir)s has changed since"
2042
1937
class BzrMoveFailedError(BzrError):
2044
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
2045
"%(_has_extra)s%(extra)s")
1939
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
2047
1941
def __init__(self, from_path='', to_path='', extra=None):
2048
1942
from bzrlib.osutils import splitpath
2049
1943
BzrError.__init__(self)
2051
self.extra, self._has_extra = extra, ': '
1945
self.extra = ': ' + str(extra)
2053
self.extra = self._has_extra = ''
2055
1949
has_from = len(from_path) > 0
2056
1950
has_to = len(to_path) > 0
2078
1972
class BzrRenameFailedError(BzrMoveFailedError):
2080
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
2081
"%(_has_extra)s%(extra)s")
1974
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
2083
1976
def __init__(self, from_path, to_path, extra=None):
2084
1977
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
2087
1979
class BzrRemoveChangedFilesError(BzrError):
2088
1980
"""Used when user is trying to remove changed files."""
2092
1984
"Use --keep to not delete them, or --force to delete them regardless.")
2094
1986
def __init__(self, tree_delta):
2095
symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
2096
"BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
2097
1987
BzrError.__init__(self)
2098
1988
self.changes_as_text = tree_delta.get_changes_as_text()
2099
1989
#self.paths_as_string = '\n'.join(changed_files)
2108
1998
class BzrBadParameterMissing(BzrBadParameter):
2110
_fmt = "Parameter %(param)s is required but not present."
2000
_fmt = "Parameter $(param)s is required but not present."
2113
2003
class BzrBadParameterUnicode(BzrBadParameter):
2121
2011
_fmt = "Parameter %(param)s contains a newline."
2014
class DependencyNotPresent(BzrError):
2016
_fmt = 'Unable to import library "%(library)s": %(error)s'
2018
def __init__(self, library, error):
2019
BzrError.__init__(self, library=library, error=error)
2124
2022
class ParamikoNotPresent(DependencyNotPresent):
2126
2024
_fmt = "Unable to import paramiko (required for sftp support): %(error)s"
2364
class GhostTagsNotSupported(BzrError):
2366
_fmt = "Ghost tags not supported by format %(format)r."
2368
def __init__(self, format):
2369
self.format = format
2372
2262
class BinaryFile(BzrError):
2374
2264
_fmt = "File is binary but should be text."
2738
2628
This is distinct from ErrorFromSmartServer so that it is possible to
2739
2629
distinguish between the following two cases:
2741
- ErrorFromSmartServer was uncaught. This is logic error in the client
2742
and so should provoke a traceback to the user.
2743
- ErrorFromSmartServer was caught but its error_tuple could not be
2744
translated. This is probably because the server sent us garbage, and
2745
should not provoke a traceback.
2630
- ErrorFromSmartServer was uncaught. This is logic error in the client
2631
and so should provoke a traceback to the user.
2632
- ErrorFromSmartServer was caught but its error_tuple could not be
2633
translated. This is probably because the server sent us garbage, and
2634
should not provoke a traceback.
2748
2637
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2804
2693
_fmt = "Container has multiple records with the same name: %(name)s"
2806
2695
def __init__(self, name):
2807
self.name = name.decode("utf-8")
2810
2699
class NoDestinationAddress(InternalBzrError):
2955
2844
more = ' ' + more
2956
2845
import bzrlib.urlutils as urlutils
2957
user_url = getattr(tree, "user_url", None)
2958
if user_url is None:
2959
display_url = str(tree)
2961
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2846
display_url = urlutils.unescape_for_display(
2847
tree.user_url, 'ascii')
2962
2848
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
3042
2928
self.user_encoding = osutils.get_user_encoding()
3045
class NoSuchConfig(BzrError):
3047
_fmt = ('The "%(config_id)s" configuration does not exist.')
3049
def __init__(self, config_id):
3050
BzrError.__init__(self, config_id=config_id)
3053
class NoSuchConfigOption(BzrError):
3055
_fmt = ('The "%(option_name)s" configuration option does not exist.')
3057
def __init__(self, option_name):
3058
BzrError.__init__(self, option_name=option_name)
3061
2931
class NoSuchAlias(BzrError):
3063
2933
_fmt = ('The alias "%(alias_name)s" does not exist.')
3147
3017
_fmt = "Shelf corrupt."
3150
class DecompressCorruption(BzrError):
3152
_fmt = "Corruption while decompressing repository file%(orig_error)s"
3154
def __init__(self, orig_error=None):
3155
if orig_error is not None:
3156
self.orig_error = ", %s" % (orig_error,)
3158
self.orig_error = ""
3159
BzrError.__init__(self)
3162
3020
class NoSuchShelfId(BzrError):
3164
3022
_fmt = 'No changes are shelved with id "%(shelf_id)d".'
3291
3149
def __init__(self, bzrdir):
3292
3150
self.bzrdir = bzrdir
3295
3152
class NoWhoami(BzrError):
3297
3154
_fmt = ('Unable to determine your name.\n'
3298
3155
"Please, set your name with the 'whoami' command.\n"
3299
3156
'E.g. bzr whoami "Your Name <name@example.com>"')
3302
3158
class InvalidPattern(BzrError):
3304
_fmt = ('Invalid pattern(s) found. %(msg)s')
3306
def __init__(self, msg):
3310
class RecursiveBind(BzrError):
3312
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3313
'Please use `bzr unbind` to fix.')
3315
def __init__(self, branch_url):
3316
self.branch_url = branch_url
3319
# FIXME: I would prefer to define the config related exception classes in
3320
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3321
class OptionExpansionLoop(BzrError):
3323
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3325
def __init__(self, string, refs):
3326
self.string = string
3327
self.refs = '->'.join(refs)
3330
class ExpandingUnknownOption(BzrError):
3332
_fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
3334
def __init__(self, name, string):
3336
self.string = string
3339
class NoCompatibleInter(BzrError):
3341
_fmt = ('No compatible object available for operations from %(source)r '
3344
def __init__(self, source, target):
3345
self.source = source
3346
self.target = target
3349
class HpssVfsRequestNotAllowed(BzrError):
3351
_fmt = ("VFS requests over the smart server are not allowed. Encountered: "
3352
"%(method)s, %(arguments)s.")
3354
def __init__(self, method, arguments):
3355
self.method = method
3356
self.arguments = arguments
3160
_fmt = ('Invalid pattern(s) found. %(message)s')
3162
def __init__(self, message):
3163
self.message = message