1
# Copyright (C) 2005-2011 Canonical Ltd
1
# Copyright (C) 2005, 2006, 2007, 2008 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
_fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
1220
" %(branch_url)s%(extra)s")
1182
_fmt = ("Requested revision: %(spec)r does not exist in branch:"
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)
1335
1297
class BoundBranchOutOfDate(BzrError):
1337
1299
_fmt = ("Bound branch %(branch)s is out of date with master branch"
1338
" %(master)s.%(extra_help)s")
1340
1302
def __init__(self, branch, master):
1341
1303
BzrError.__init__(self)
1342
1304
self.branch = branch
1343
1305
self.master = master
1344
self.extra_help = ''
1347
1308
class CommitToDoubleBoundBranch(BzrError):
1419
1380
class WeaveParentMismatch(WeaveError):
1421
_fmt = "Parents are mismatched between two revisions. %(msg)s"
1382
_fmt = "Parents are mismatched between two revisions. %(message)s"
1424
1385
class WeaveInvalidChecksum(WeaveError):
1426
_fmt = "Text did not match its checksum: %(msg)s"
1387
_fmt = "Text did not match it's checksum: %(message)s"
1429
1390
class WeaveTextDiffers(WeaveError):
1723
1684
class InvalidHttpResponse(TransportError):
1725
_fmt = "Invalid http response for %(path)s: %(msg)s%(orig_error)s"
1686
_fmt = "Invalid http response for %(path)s: %(msg)s"
1727
1688
def __init__(self, path, msg, orig_error=None):
1728
1689
self.path = path
1729
if orig_error is None:
1732
# This is reached for obscure and unusual errors so we want to
1733
# preserve as much info as possible to ease debug.
1734
orig_error = ': %r' % (orig_error,)
1735
1690
TransportError.__init__(self, msg, orig_error=orig_error)
1744
1699
InvalidHttpResponse.__init__(self, path, msg)
1747
class HttpBoundaryMissing(InvalidHttpResponse):
1748
"""A multipart response ends with no boundary marker.
1750
This is a special case caused by buggy proxies, described in
1751
<https://bugs.launchpad.net/bzr/+bug/198646>.
1754
_fmt = "HTTP MIME Boundary missing for %(path)s: %(msg)s"
1756
def __init__(self, path, msg):
1757
InvalidHttpResponse.__init__(self, path, msg)
1760
1702
class InvalidHttpContentType(InvalidHttpResponse):
1762
1704
_fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1790
1732
_fmt = "Working tree has conflicts."
1793
class ConfigContentError(BzrError):
1795
_fmt = "Config file %(filename)s is not UTF-8 encoded\n"
1797
def __init__(self, filename):
1798
BzrError.__init__(self)
1799
self.filename = filename
1802
1735
class ParseConfigError(BzrError):
1804
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1806
1737
def __init__(self, errors, filename):
1807
BzrError.__init__(self)
1808
self.filename = filename
1809
self.errors = '\n'.join(e.msg for e in errors)
1812
class ConfigOptionValueError(BzrError):
1814
_fmt = """Bad value "%(value)s" for option "%(name)s"."""
1816
def __init__(self, name, value):
1817
BzrError.__init__(self, name=name, value=value)
1738
if filename is None:
1740
message = "Error(s) parsing config file %s:\n%s" % \
1741
(filename, ('\n'.join(e.msg for e in errors)))
1742
BzrError.__init__(self, message)
1820
1745
class NoEmailInUsername(BzrError):
1829
1754
class SigningFailed(BzrError):
1831
_fmt = 'Failed to GPG sign data with command "%(command_line)s"'
1756
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1833
1758
def __init__(self, command_line):
1834
1759
BzrError.__init__(self, command_line=command_line)
1837
class SignatureVerificationFailed(BzrError):
1839
_fmt = 'Failed to verify GPG signature data with error "%(error)s"'
1841
def __init__(self, error):
1842
BzrError.__init__(self, error=error)
1845
class DependencyNotPresent(BzrError):
1847
_fmt = 'Unable to import library "%(library)s": %(error)s'
1849
def __init__(self, library, error):
1850
BzrError.__init__(self, library=library, error=error)
1853
class GpgmeNotInstalled(DependencyNotPresent):
1855
_fmt = 'python-gpgme is not installed, it is needed to verify signatures'
1857
def __init__(self, error):
1858
DependencyNotPresent.__init__(self, 'gpgme', error)
1861
1762
class WorkingTreeNotRevision(BzrError):
1863
1764
_fmt = ("The working tree for %(basedir)s has changed since"
2023
1924
_fmt = "Moving the root directory is not supported at this time"
2026
class TransformRenameFailed(BzrError):
2028
_fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
2030
def __init__(self, from_path, to_path, why, errno):
2031
self.from_path = from_path
2032
self.to_path = to_path
2037
1927
class BzrMoveFailedError(BzrError):
2039
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
2040
"%(_has_extra)s%(extra)s")
1929
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
2042
1931
def __init__(self, from_path='', to_path='', extra=None):
2043
1932
from bzrlib.osutils import splitpath
2044
1933
BzrError.__init__(self)
2046
self.extra, self._has_extra = extra, ': '
1935
self.extra = ': ' + str(extra)
2048
self.extra = self._has_extra = ''
2050
1939
has_from = len(from_path) > 0
2051
1940
has_to = len(to_path) > 0
2073
1962
class BzrRenameFailedError(BzrMoveFailedError):
2075
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
2076
"%(_has_extra)s%(extra)s")
1964
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
2078
1966
def __init__(self, from_path, to_path, extra=None):
2079
1967
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
2082
1969
class BzrRemoveChangedFilesError(BzrError):
2083
1970
"""Used when user is trying to remove changed files."""
2087
1974
"Use --keep to not delete them, or --force to delete them regardless.")
2089
1976
def __init__(self, tree_delta):
2090
symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
2091
"BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
2092
1977
BzrError.__init__(self)
2093
1978
self.changes_as_text = tree_delta.get_changes_as_text()
2094
1979
#self.paths_as_string = '\n'.join(changed_files)
2116
2001
_fmt = "Parameter %(param)s contains a newline."
2004
class DependencyNotPresent(BzrError):
2006
_fmt = 'Unable to import library "%(library)s": %(error)s'
2008
def __init__(self, library, error):
2009
BzrError.__init__(self, library=library, error=error)
2119
2012
class ParamikoNotPresent(DependencyNotPresent):
2121
2014
_fmt = "Unable to import paramiko (required for sftp support): %(error)s"
2283
2176
def __init__(self, repo):
2284
2177
BzrError.__init__(self)
2285
self.repo_path = repo.user_url
2178
self.repo_path = repo.bzrdir.root_transport.base
2288
2181
class InconsistentDelta(BzrError):
2359
class GhostTagsNotSupported(BzrError):
2361
_fmt = "Ghost tags not supported by format %(format)r."
2363
def __init__(self, format):
2364
self.format = format
2367
2252
class BinaryFile(BzrError):
2369
2254
_fmt = "File is binary but should be text."
2733
2618
This is distinct from ErrorFromSmartServer so that it is possible to
2734
2619
distinguish between the following two cases:
2736
- ErrorFromSmartServer was uncaught. This is logic error in the client
2737
and so should provoke a traceback to the user.
2738
- ErrorFromSmartServer was caught but its error_tuple could not be
2739
translated. This is probably because the server sent us garbage, and
2740
should not provoke a traceback.
2620
- ErrorFromSmartServer was uncaught. This is logic error in the client
2621
and so should provoke a traceback to the user.
2622
- ErrorFromSmartServer was caught but its error_tuple could not be
2623
translated. This is probably because the server sent us garbage, and
2624
should not provoke a traceback.
2743
2627
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2799
2683
_fmt = "Container has multiple records with the same name: %(name)s"
2801
2685
def __init__(self, name):
2802
self.name = name.decode("utf-8")
2805
2689
class NoDestinationAddress(InternalBzrError):
2870
2754
def __init__(self, bzrdir):
2871
2755
import bzrlib.urlutils as urlutils
2872
display_url = urlutils.unescape_for_display(bzrdir.user_url,
2756
display_url = urlutils.unescape_for_display(bzrdir.root_transport.base,
2874
2758
BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
2950
2834
more = ' ' + more
2951
2835
import bzrlib.urlutils as urlutils
2952
user_url = getattr(tree, "user_url", None)
2953
if user_url is None:
2954
display_url = str(tree)
2956
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2836
display_url = urlutils.unescape_for_display(
2837
tree.bzrdir.root_transport.base, 'ascii')
2957
2838
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2960
class ShelvedChanges(UncommittedChanges):
2962
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2963
' (See bzr shelve --list).%(more)s')
2966
2841
class MissingTemplateVariable(BzrError):
2968
2843
_fmt = 'Variable {%(name)s} is not available.'
3037
2912
self.user_encoding = osutils.get_user_encoding()
3040
class NoSuchConfig(BzrError):
3042
_fmt = ('The "%(config_id)s" configuration does not exist.')
3044
def __init__(self, config_id):
3045
BzrError.__init__(self, config_id=config_id)
3048
class NoSuchConfigOption(BzrError):
3050
_fmt = ('The "%(option_name)s" configuration option does not exist.')
3052
def __init__(self, option_name):
3053
BzrError.__init__(self, option_name=option_name)
3056
2915
class NoSuchAlias(BzrError):
3058
2917
_fmt = ('The alias "%(alias_name)s" does not exist.')
3142
3001
_fmt = "Shelf corrupt."
3145
class DecompressCorruption(BzrError):
3147
_fmt = "Corruption while decompressing repository file%(orig_error)s"
3149
def __init__(self, orig_error=None):
3150
if orig_error is not None:
3151
self.orig_error = ", %s" % (orig_error,)
3153
self.orig_error = ""
3154
BzrError.__init__(self)
3157
3004
class NoSuchShelfId(BzrError):
3159
3006
_fmt = 'No changes are shelved with id "%(shelf_id)d".'
3278
3125
def __init__(self, path):
3279
3126
self.path = path
3282
class NoColocatedBranchSupport(BzrError):
3284
_fmt = ("%(bzrdir)r does not support co-located branches.")
3286
def __init__(self, bzrdir):
3287
self.bzrdir = bzrdir
3290
class NoWhoami(BzrError):
3292
_fmt = ('Unable to determine your name.\n'
3293
"Please, set your name with the 'whoami' command.\n"
3294
'E.g. bzr whoami "Your Name <name@example.com>"')
3297
class InvalidPattern(BzrError):
3299
_fmt = ('Invalid pattern(s) found. %(msg)s')
3301
def __init__(self, msg):
3305
class RecursiveBind(BzrError):
3307
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3308
'Please use `bzr unbind` to fix.')
3310
def __init__(self, branch_url):
3311
self.branch_url = branch_url
3314
# FIXME: I would prefer to define the config related exception classes in
3315
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3316
class OptionExpansionLoop(BzrError):
3318
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3320
def __init__(self, string, refs):
3321
self.string = string
3322
self.refs = '->'.join(refs)
3325
class ExpandingUnknownOption(BzrError):
3327
_fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
3329
def __init__(self, name, string):
3331
self.string = string
3334
class NoCompatibleInter(BzrError):
3336
_fmt = ('No compatible object available for operations from %(source)r '
3339
def __init__(self, source, target):
3340
self.source = source
3341
self.target = target
3344
class HpssVfsRequestNotAllowed(BzrError):
3346
_fmt = ("VFS requests over the smart server are not allowed. Encountered: "
3347
"%(method)s, %(arguments)s.")
3349
def __init__(self, method, arguments):
3350
self.method = method
3351
self.arguments = arguments