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
54
54
Base class for errors raised by bzrlib.
56
56
: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
59
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.)
61
61
:cvar _fmt: Format string to display the error; this is expanded
62
by the instance's dict.
62
by the instance's dict.
65
65
internal_error = False
713
713
self.bzrdir = bzrdir
714
714
PathError.__init__(self, path=path)
717
return '<%s %r>' % (self.__class__.__name__, self.__dict__)
719
716
def _format(self):
720
717
# XXX: Ideally self.detail would be a property, but Exceptions in
721
718
# Python 2.4 have to be old-style classes so properties don't work.
726
723
self.bzrdir.open_repository()
727
724
except NoRepositoryPresent:
730
# Just ignore unexpected errors. Raising arbitrary errors
731
# during str(err) can provoke strange bugs. Concretely
732
# Launchpad's codehosting managed to raise NotBranchError
733
# here, and then get stuck in an infinite loop/recursion
734
# trying to str() that error. All this error really cares
735
# about that there's no working repository there, and if
736
# open_repository() fails, there probably isn't.
739
727
self.detail = ': location is a repository'
795
783
_fmt = 'File "%(path)s" is not in branch %(branch_base)s.'
797
# use PathNotChild instead
798
@symbol_versioning.deprecated_method(symbol_versioning.deprecated_in((2, 3, 0)))
799
785
def __init__(self, branch, path):
800
786
BzrError.__init__(self)
801
787
self.branch = branch
864
850
"""Construct a new AlreadyVersionedError.
866
852
:param path: This is the path which is versioned,
867
which should be in a user friendly form.
853
which should be in a user friendly form.
868
854
:param context_info: If given, this is information about the context,
869
which could explain why this is expected to not be versioned.
855
which could explain why this is expected to not be versioned.
871
857
BzrError.__init__(self)
885
871
"""Construct a new NotVersionedError.
887
873
:param path: This is the path which is not versioned,
888
which should be in a user friendly form.
874
which should be in a user friendly form.
889
875
:param context_info: If given, this is information about the context,
890
which could explain why this is expected to be versioned.
876
which could explain why this is expected to be versioned.
892
878
BzrError.__init__(self)
961
947
# original exception is available as e.original_error
963
949
# New code should prefer to raise specific subclasses
964
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.
968
957
class LockActive(LockError):
1084
1075
self.target = target
1087
class LockCorrupt(LockError):
1089
_fmt = ("Lock is apparently held, but corrupted: %(corruption_info)s\n"
1090
"Use 'bzr break-lock' to clear it")
1092
internal_error = False
1094
def __init__(self, corruption_info, file_data=None):
1095
self.corruption_info = corruption_info
1096
self.file_data = file_data
1099
1078
class LockNotHeld(LockError):
1101
1080
_fmt = "Lock not held: %(lock)s"
1140
1119
BzrError.__init__(self, files=files, files_str=files_str)
1143
class ExcludesUnsupported(BzrError):
1145
_fmt = ('Excluding paths during commit is not supported by '
1146
'repository at %(repository)r.')
1148
def __init__(self, repository):
1149
BzrError.__init__(self, repository=repository)
1152
1122
class BadCommitMessageEncoding(BzrError):
1154
1124
_fmt = 'The specified commit message contains characters unsupported by '\
1210
1180
class InvalidRevisionSpec(BzrError):
1212
1182
_fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
1213
" %(branch_url)s%(extra)s")
1183
" %(branch)s%(extra)s")
1215
1185
def __init__(self, spec, branch, extra=None):
1216
1186
BzrError.__init__(self, branch=branch, spec=spec)
1217
self.branch_url = getattr(branch, 'user_url', str(branch))
1219
1188
self.extra = '\n' + str(extra)
1412
1381
class WeaveParentMismatch(WeaveError):
1414
_fmt = "Parents are mismatched between two revisions. %(msg)s"
1383
_fmt = "Parents are mismatched between two revisions. %(message)s"
1417
1386
class WeaveInvalidChecksum(WeaveError):
1419
_fmt = "Text did not match its checksum: %(msg)s"
1388
_fmt = "Text did not match it's checksum: %(message)s"
1422
1391
class WeaveTextDiffers(WeaveError):
1717
1685
class InvalidHttpResponse(TransportError):
1719
_fmt = "Invalid http response for %(path)s: %(msg)s%(orig_error)s"
1687
_fmt = "Invalid http response for %(path)s: %(msg)s"
1721
1689
def __init__(self, path, msg, orig_error=None):
1722
1690
self.path = path
1723
if orig_error is None:
1726
# This is reached for obscure and unusual errors so we want to
1727
# preserve as much info as possible to ease debug.
1728
orig_error = ': %r' % (orig_error,)
1729
1691
TransportError.__init__(self, msg, orig_error=orig_error)
1738
1700
InvalidHttpResponse.__init__(self, path, msg)
1741
class HttpBoundaryMissing(InvalidHttpResponse):
1742
"""A multipart response ends with no boundary marker.
1744
This is a special case caused by buggy proxies, described in
1745
<https://bugs.launchpad.net/bzr/+bug/198646>.
1748
_fmt = "HTTP MIME Boundary missing for %(path)s: %(msg)s"
1750
def __init__(self, path, msg):
1751
InvalidHttpResponse.__init__(self, path, msg)
1754
1703
class InvalidHttpContentType(InvalidHttpResponse):
1756
1705
_fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1784
1733
_fmt = "Working tree has conflicts."
1787
class ConfigContentError(BzrError):
1789
_fmt = "Config file %(filename)s is not UTF-8 encoded\n"
1791
def __init__(self, filename):
1792
BzrError.__init__(self)
1793
self.filename = filename
1796
1736
class ParseConfigError(BzrError):
1798
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1800
1738
def __init__(self, errors, filename):
1801
BzrError.__init__(self)
1802
self.filename = filename
1803
self.errors = '\n'.join(e.msg for e in errors)
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)
1806
1746
class NoEmailInUsername(BzrError):
1815
1755
class SigningFailed(BzrError):
1817
_fmt = 'Failed to GPG sign data with command "%(command_line)s"'
1757
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1819
1759
def __init__(self, command_line):
1820
1760
BzrError.__init__(self, command_line=command_line)
1823
class SignatureVerificationFailed(BzrError):
1825
_fmt = 'Failed to verify GPG signature data with error "%(error)s"'
1827
def __init__(self, error):
1828
BzrError.__init__(self, error=error)
1831
class DependencyNotPresent(BzrError):
1833
_fmt = 'Unable to import library "%(library)s": %(error)s'
1835
def __init__(self, library, error):
1836
BzrError.__init__(self, library=library, error=error)
1839
class GpgmeNotInstalled(DependencyNotPresent):
1841
_fmt = 'python-gpgme is not installed, it is needed to verify signatures'
1843
def __init__(self, error):
1844
DependencyNotPresent.__init__(self, 'gpgme', error)
1847
1763
class WorkingTreeNotRevision(BzrError):
1849
1765
_fmt = ("The working tree for %(basedir)s has changed since"
2009
1925
_fmt = "Moving the root directory is not supported at this time"
2012
class TransformRenameFailed(BzrError):
2014
_fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
2016
def __init__(self, from_path, to_path, why, errno):
2017
self.from_path = from_path
2018
self.to_path = to_path
2023
1928
class BzrMoveFailedError(BzrError):
2025
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
2026
"%(_has_extra)s%(extra)s")
1930
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
2028
1932
def __init__(self, from_path='', to_path='', extra=None):
2029
1933
from bzrlib.osutils import splitpath
2030
1934
BzrError.__init__(self)
2032
self.extra, self._has_extra = extra, ': '
1936
self.extra = ': ' + str(extra)
2034
self.extra = self._has_extra = ''
2036
1940
has_from = len(from_path) > 0
2037
1941
has_to = len(to_path) > 0
2059
1963
class BzrRenameFailedError(BzrMoveFailedError):
2061
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
2062
"%(_has_extra)s%(extra)s")
1965
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
2064
1967
def __init__(self, from_path, to_path, extra=None):
2065
1968
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
2068
1970
class BzrRemoveChangedFilesError(BzrError):
2069
1971
"""Used when user is trying to remove changed files."""
2073
1975
"Use --keep to not delete them, or --force to delete them regardless.")
2075
1977
def __init__(self, tree_delta):
2076
symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
2077
"BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
2078
1978
BzrError.__init__(self)
2079
1979
self.changes_as_text = tree_delta.get_changes_as_text()
2080
1980
#self.paths_as_string = '\n'.join(changed_files)
2089
1989
class BzrBadParameterMissing(BzrBadParameter):
2091
_fmt = "Parameter %(param)s is required but not present."
1991
_fmt = "Parameter $(param)s is required but not present."
2094
1994
class BzrBadParameterUnicode(BzrBadParameter):
2102
2002
_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)
2105
2013
class ParamikoNotPresent(DependencyNotPresent):
2107
2015
_fmt = "Unable to import paramiko (required for sftp support): %(error)s"
2269
2177
def __init__(self, repo):
2270
2178
BzrError.__init__(self)
2271
self.repo_path = repo.user_url
2179
self.repo_path = repo.bzrdir.root_transport.base
2274
2182
class InconsistentDelta(BzrError):
2711
2619
This is distinct from ErrorFromSmartServer so that it is possible to
2712
2620
distinguish between the following two cases:
2714
- ErrorFromSmartServer was uncaught. This is logic error in the client
2715
and so should provoke a traceback to the user.
2716
- ErrorFromSmartServer was caught but its error_tuple could not be
2717
translated. This is probably because the server sent us garbage, and
2718
should not provoke a traceback.
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.
2721
2628
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2848
2755
def __init__(self, bzrdir):
2849
2756
import bzrlib.urlutils as urlutils
2850
display_url = urlutils.unescape_for_display(bzrdir.user_url,
2757
display_url = urlutils.unescape_for_display(bzrdir.root_transport.base,
2852
2759
BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
2928
2835
more = ' ' + more
2929
2836
import bzrlib.urlutils as urlutils
2930
user_url = getattr(tree, "user_url", None)
2931
if user_url is None:
2932
display_url = str(tree)
2934
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2837
display_url = urlutils.unescape_for_display(
2838
tree.bzrdir.root_transport.base, 'ascii')
2935
2839
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2938
class ShelvedChanges(UncommittedChanges):
2940
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2941
' (See bzr shelve --list).%(more)s')
2944
2842
class MissingTemplateVariable(BzrError):
2946
2844
_fmt = 'Variable {%(name)s} is not available.'
3015
2913
self.user_encoding = osutils.get_user_encoding()
3018
class NoSuchConfig(BzrError):
3020
_fmt = ('The "%(config_id)s" configuration does not exist.')
3022
def __init__(self, config_id):
3023
BzrError.__init__(self, config_id=config_id)
3026
class NoSuchConfigOption(BzrError):
3028
_fmt = ('The "%(option_name)s" configuration option does not exist.')
3030
def __init__(self, option_name):
3031
BzrError.__init__(self, option_name=option_name)
3034
2916
class NoSuchAlias(BzrError):
3036
2918
_fmt = ('The alias "%(alias_name)s" does not exist.')
3120
3002
_fmt = "Shelf corrupt."
3123
class DecompressCorruption(BzrError):
3125
_fmt = "Corruption while decompressing repository file%(orig_error)s"
3127
def __init__(self, orig_error=None):
3128
if orig_error is not None:
3129
self.orig_error = ", %s" % (orig_error,)
3131
self.orig_error = ""
3132
BzrError.__init__(self)
3135
3005
class NoSuchShelfId(BzrError):
3137
3007
_fmt = 'No changes are shelved with id "%(shelf_id)d".'
3264
3134
def __init__(self, bzrdir):
3265
3135
self.bzrdir = bzrdir
3268
class NoWhoami(BzrError):
3270
_fmt = ('Unable to determine your name.\n'
3271
"Please, set your name with the 'whoami' command.\n"
3272
'E.g. bzr whoami "Your Name <name@example.com>"')
3275
class InvalidPattern(BzrError):
3277
_fmt = ('Invalid pattern(s) found. %(msg)s')
3279
def __init__(self, msg):
3283
class RecursiveBind(BzrError):
3285
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3286
'Please use `bzr unbind` to fix.')
3288
def __init__(self, branch_url):
3289
self.branch_url = branch_url
3292
# FIXME: I would prefer to define the config related exception classes in
3293
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3294
class OptionExpansionLoop(BzrError):
3296
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3298
def __init__(self, string, refs):
3299
self.string = string
3300
self.refs = '->'.join(refs)
3303
class ExpandingUnknownOption(BzrError):
3305
_fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
3307
def __init__(self, name, string):
3309
self.string = string
3312
class NoCompatibleInter(BzrError):
3314
_fmt = ('No compatible object available for operations from %(source)r '
3317
def __init__(self, source, target):
3318
self.source = source
3319
self.target = target
3322
class MissingFeature(BzrError):
3324
_fmt = ("Missing feature %(feature)s not provided by this "
3325
"version of Bazaar or any plugin.")
3327
def __init__(self, feature):
3328
self.feature = feature
3331
class ParseFormatError(BzrError):
3333
_fmt = "Parse error on line %(lineno)d of format name: %(line)s"
3335
def __init__(self, lineno, line, text):
3336
BzrError.__init__(self)
3337
self.lineno = lineno