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
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):
1667
1629
def __init__(self, exc_info):
1668
1630
import traceback
1669
# GZ 2010-08-10: Cycle with exc_tb/exc_info affects at least one test
1670
1631
self.exc_type, self.exc_value, self.exc_tb = exc_info
1671
1632
self.exc_info = exc_info
1672
1633
traceback_strings = traceback.format_exception(
1711
1672
_fmt = "Connection closed: %(msg)s %(orig_error)s"
1714
class ConnectionTimeout(ConnectionError):
1716
_fmt = "Connection Timeout: %(msg)s%(orig_error)s"
1719
1675
class InvalidRange(TransportError):
1721
1677
_fmt = "Invalid range access in %(path)s at %(offset)s: %(msg)s"
1729
1685
class InvalidHttpResponse(TransportError):
1731
_fmt = "Invalid http response for %(path)s: %(msg)s%(orig_error)s"
1687
_fmt = "Invalid http response for %(path)s: %(msg)s"
1733
1689
def __init__(self, path, msg, orig_error=None):
1734
1690
self.path = path
1735
if orig_error is None:
1738
# This is reached for obscure and unusual errors so we want to
1739
# preserve as much info as possible to ease debug.
1740
orig_error = ': %r' % (orig_error,)
1741
1691
TransportError.__init__(self, msg, orig_error=orig_error)
1750
1700
InvalidHttpResponse.__init__(self, path, msg)
1753
class HttpBoundaryMissing(InvalidHttpResponse):
1754
"""A multipart response ends with no boundary marker.
1756
This is a special case caused by buggy proxies, described in
1757
<https://bugs.launchpad.net/bzr/+bug/198646>.
1760
_fmt = "HTTP MIME Boundary missing for %(path)s: %(msg)s"
1762
def __init__(self, path, msg):
1763
InvalidHttpResponse.__init__(self, path, msg)
1766
1703
class InvalidHttpContentType(InvalidHttpResponse):
1768
1705
_fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1796
1733
_fmt = "Working tree has conflicts."
1799
class ConfigContentError(BzrError):
1801
_fmt = "Config file %(filename)s is not UTF-8 encoded\n"
1803
def __init__(self, filename):
1804
BzrError.__init__(self)
1805
self.filename = filename
1808
1736
class ParseConfigError(BzrError):
1810
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1812
1738
def __init__(self, errors, filename):
1813
BzrError.__init__(self)
1814
self.filename = filename
1815
self.errors = '\n'.join(e.msg for e in errors)
1818
class ConfigOptionValueError(BzrError):
1820
_fmt = """Bad value "%(value)s" for option "%(name)s"."""
1822
def __init__(self, name, value):
1823
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)
1826
1746
class NoEmailInUsername(BzrError):
1835
1755
class SigningFailed(BzrError):
1837
_fmt = 'Failed to GPG sign data with command "%(command_line)s"'
1757
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1839
1759
def __init__(self, command_line):
1840
1760
BzrError.__init__(self, command_line=command_line)
1843
class SignatureVerificationFailed(BzrError):
1845
_fmt = 'Failed to verify GPG signature data with error "%(error)s"'
1847
def __init__(self, error):
1848
BzrError.__init__(self, error=error)
1851
class DependencyNotPresent(BzrError):
1853
_fmt = 'Unable to import library "%(library)s": %(error)s'
1855
def __init__(self, library, error):
1856
BzrError.__init__(self, library=library, error=error)
1859
class GpgmeNotInstalled(DependencyNotPresent):
1861
_fmt = 'python-gpgme is not installed, it is needed to verify signatures'
1863
def __init__(self, error):
1864
DependencyNotPresent.__init__(self, 'gpgme', error)
1867
1763
class WorkingTreeNotRevision(BzrError):
1869
1765
_fmt = ("The working tree for %(basedir)s has changed since"
2027
1923
class CantMoveRoot(BzrError):
2029
1925
_fmt = "Moving the root directory is not supported at this time"
2032
1928
class TransformRenameFailed(BzrError):
2034
1930
_fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
2036
1932
def __init__(self, from_path, to_path, why, errno):
2037
1933
self.from_path = from_path
2038
1934
self.to_path = to_path
2043
1939
class BzrMoveFailedError(BzrError):
2045
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
2046
"%(_has_extra)s%(extra)s")
1941
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
2048
1943
def __init__(self, from_path='', to_path='', extra=None):
2049
1944
from bzrlib.osutils import splitpath
2050
1945
BzrError.__init__(self)
2052
self.extra, self._has_extra = extra, ': '
1947
self.extra = ': ' + str(extra)
2054
self.extra = self._has_extra = ''
2056
1951
has_from = len(from_path) > 0
2057
1952
has_to = len(to_path) > 0
2079
1974
class BzrRenameFailedError(BzrMoveFailedError):
2081
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
2082
"%(_has_extra)s%(extra)s")
1976
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
2084
1978
def __init__(self, from_path, to_path, extra=None):
2085
1979
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
2088
1981
class BzrRemoveChangedFilesError(BzrError):
2089
1982
"""Used when user is trying to remove changed files."""
2093
1986
"Use --keep to not delete them, or --force to delete them regardless.")
2095
1988
def __init__(self, tree_delta):
2096
symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
2097
"BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
2098
1989
BzrError.__init__(self)
2099
1990
self.changes_as_text = tree_delta.get_changes_as_text()
2100
1991
#self.paths_as_string = '\n'.join(changed_files)
2109
2000
class BzrBadParameterMissing(BzrBadParameter):
2111
_fmt = "Parameter %(param)s is required but not present."
2002
_fmt = "Parameter $(param)s is required but not present."
2114
2005
class BzrBadParameterUnicode(BzrBadParameter):
2122
2013
_fmt = "Parameter %(param)s contains a newline."
2016
class DependencyNotPresent(BzrError):
2018
_fmt = 'Unable to import library "%(library)s": %(error)s'
2020
def __init__(self, library, error):
2021
BzrError.__init__(self, library=library, error=error)
2125
2024
class ParamikoNotPresent(DependencyNotPresent):
2127
2026
_fmt = "Unable to import paramiko (required for sftp support): %(error)s"
2365
class GhostTagsNotSupported(BzrError):
2367
_fmt = "Ghost tags not supported by format %(format)r."
2369
def __init__(self, format):
2370
self.format = format
2373
2264
class BinaryFile(BzrError):
2375
2266
_fmt = "File is binary but should be text."
2739
2630
This is distinct from ErrorFromSmartServer so that it is possible to
2740
2631
distinguish between the following two cases:
2742
- ErrorFromSmartServer was uncaught. This is logic error in the client
2743
and so should provoke a traceback to the user.
2744
- ErrorFromSmartServer was caught but its error_tuple could not be
2745
translated. This is probably because the server sent us garbage, and
2746
should not provoke a traceback.
2632
- ErrorFromSmartServer was uncaught. This is logic error in the client
2633
and so should provoke a traceback to the user.
2634
- ErrorFromSmartServer was caught but its error_tuple could not be
2635
translated. This is probably because the server sent us garbage, and
2636
should not provoke a traceback.
2749
2639
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2805
2695
_fmt = "Container has multiple records with the same name: %(name)s"
2807
2697
def __init__(self, name):
2808
self.name = name.decode("utf-8")
2811
2701
class NoDestinationAddress(InternalBzrError):
2956
2846
more = ' ' + more
2957
2847
import bzrlib.urlutils as urlutils
2958
user_url = getattr(tree, "user_url", None)
2959
if user_url is None:
2960
display_url = str(tree)
2962
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2848
display_url = urlutils.unescape_for_display(
2849
tree.user_url, 'ascii')
2963
2850
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
3043
2930
self.user_encoding = osutils.get_user_encoding()
3046
class NoSuchConfig(BzrError):
3048
_fmt = ('The "%(config_id)s" configuration does not exist.')
3050
def __init__(self, config_id):
3051
BzrError.__init__(self, config_id=config_id)
3054
class NoSuchConfigOption(BzrError):
3056
_fmt = ('The "%(option_name)s" configuration option does not exist.')
3058
def __init__(self, option_name):
3059
BzrError.__init__(self, option_name=option_name)
3062
2933
class NoSuchAlias(BzrError):
3064
2935
_fmt = ('The alias "%(alias_name)s" does not exist.')
3148
3019
_fmt = "Shelf corrupt."
3151
class DecompressCorruption(BzrError):
3153
_fmt = "Corruption while decompressing repository file%(orig_error)s"
3155
def __init__(self, orig_error=None):
3156
if orig_error is not None:
3157
self.orig_error = ", %s" % (orig_error,)
3159
self.orig_error = ""
3160
BzrError.__init__(self)
3163
3022
class NoSuchShelfId(BzrError):
3165
3024
_fmt = 'No changes are shelved with id "%(shelf_id)d".'
3300
3158
'E.g. bzr whoami "Your Name <name@example.com>"')
3303
class InvalidPattern(BzrError):
3305
_fmt = ('Invalid pattern(s) found. %(msg)s')
3307
def __init__(self, msg):
3311
class RecursiveBind(BzrError):
3313
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3314
'Please use `bzr unbind` to fix.')
3316
def __init__(self, branch_url):
3317
self.branch_url = branch_url
3320
# FIXME: I would prefer to define the config related exception classes in
3321
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3322
class OptionExpansionLoop(BzrError):
3324
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3326
def __init__(self, string, refs):
3327
self.string = string
3328
self.refs = '->'.join(refs)
3331
class ExpandingUnknownOption(BzrError):
3333
_fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
3335
def __init__(self, name, string):
3337
self.string = string
3340
class NoCompatibleInter(BzrError):
3342
_fmt = ('No compatible object available for operations from %(source)r '
3345
def __init__(self, source, target):
3346
self.source = source
3347
self.target = target
3350
class HpssVfsRequestNotAllowed(BzrError):
3352
_fmt = ("VFS requests over the smart server are not allowed. Encountered: "
3353
"%(method)s, %(arguments)s.")
3355
def __init__(self, method, arguments):
3356
self.method = method
3357
self.arguments = arguments