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
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 details.
59
(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
59
details. (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
622
622
_fmt = 'Unsupported protocol for url "%(path)s"%(extra)s'
624
def __init__(self, url, extra):
624
def __init__(self, url, extra=""):
625
625
PathError.__init__(self, url, extra=extra)
713
713
self.bzrdir = bzrdir
714
714
PathError.__init__(self, path=path)
717
return '<%s %r>' % (self.__class__.__name__, self.__dict__)
716
719
def _format(self):
717
720
# XXX: Ideally self.detail would be a property, but Exceptions in
718
721
# Python 2.4 have to be old-style classes so properties don't work.
723
726
self.bzrdir.open_repository()
724
727
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.
727
739
self.detail = ': location is a repository'
783
795
_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)))
785
799
def __init__(self, branch, path):
786
800
BzrError.__init__(self)
787
801
self.branch = branch
850
864
"""Construct a new AlreadyVersionedError.
852
866
:param path: This is the path which is versioned,
853
which should be in a user friendly form.
867
which should be in a user friendly form.
854
868
:param context_info: If given, this is information about the context,
855
which could explain why this is expected to not be versioned.
869
which could explain why this is expected to not be versioned.
857
871
BzrError.__init__(self)
871
885
"""Construct a new NotVersionedError.
873
887
:param path: This is the path which is not versioned,
874
which should be in a user friendly form.
888
which should be in a user friendly form.
875
889
:param context_info: If given, this is information about the context,
876
which could explain why this is expected to be versioned.
890
which could explain why this is expected to be versioned.
878
892
BzrError.__init__(self)
947
961
# original exception is available as e.original_error
949
963
# 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.
964
def __init__(self, msg):
957
968
class LockActive(LockError):
1075
1084
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
1078
1099
class LockNotHeld(LockError):
1080
1101
_fmt = "Lock not held: %(lock)s"
1119
1140
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)
1122
1152
class BadCommitMessageEncoding(BzrError):
1124
1154
_fmt = 'The specified commit message contains characters unsupported by '\
1180
1210
class InvalidRevisionSpec(BzrError):
1182
1212
_fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
1183
" %(branch)s%(extra)s")
1213
" %(branch_url)s%(extra)s")
1185
1215
def __init__(self, spec, branch, extra=None):
1186
1216
BzrError.__init__(self, branch=branch, spec=spec)
1217
self.branch_url = getattr(branch, 'user_url', str(branch))
1188
1219
self.extra = '\n' + str(extra)
1381
1412
class WeaveParentMismatch(WeaveError):
1383
_fmt = "Parents are mismatched between two revisions. %(message)s"
1414
_fmt = "Parents are mismatched between two revisions. %(msg)s"
1386
1417
class WeaveInvalidChecksum(WeaveError):
1388
_fmt = "Text did not match it's checksum: %(message)s"
1419
_fmt = "Text did not match its checksum: %(msg)s"
1391
1422
class WeaveTextDiffers(WeaveError):
1685
1716
class InvalidHttpResponse(TransportError):
1687
_fmt = "Invalid http response for %(path)s: %(msg)s"
1718
_fmt = "Invalid http response for %(path)s: %(msg)s%(orig_error)s"
1689
1720
def __init__(self, path, msg, orig_error=None):
1690
1721
self.path = path
1722
if orig_error is None:
1725
# This is reached for obscure and unusual errors so we want to
1726
# preserve as much info as possible to ease debug.
1727
orig_error = ': %r' % (orig_error,)
1691
1728
TransportError.__init__(self, msg, orig_error=orig_error)
1700
1737
InvalidHttpResponse.__init__(self, path, msg)
1740
class HttpBoundaryMissing(InvalidHttpResponse):
1741
"""A multipart response ends with no boundary marker.
1743
This is a special case caused by buggy proxies, described in
1744
<https://bugs.launchpad.net/bzr/+bug/198646>.
1747
_fmt = "HTTP MIME Boundary missing for %(path)s: %(msg)s"
1749
def __init__(self, path, msg):
1750
InvalidHttpResponse.__init__(self, path, msg)
1703
1753
class InvalidHttpContentType(InvalidHttpResponse):
1705
1755
_fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1733
1783
_fmt = "Working tree has conflicts."
1786
class ConfigContentError(BzrError):
1788
_fmt = "Config file %(filename)s is not UTF-8 encoded\n"
1790
def __init__(self, filename):
1791
BzrError.__init__(self)
1792
self.filename = filename
1736
1795
class ParseConfigError(BzrError):
1797
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1738
1799
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)
1800
BzrError.__init__(self)
1801
self.filename = filename
1802
self.errors = '\n'.join(e.msg for e in errors)
1746
1805
class NoEmailInUsername(BzrError):
1755
1814
class SigningFailed(BzrError):
1757
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1816
_fmt = 'Failed to GPG sign data with command "%(command_line)s"'
1759
1818
def __init__(self, command_line):
1760
1819
BzrError.__init__(self, command_line=command_line)
1822
class SignatureVerificationFailed(BzrError):
1824
_fmt = 'Failed to verify GPG signature data with error "%(error)s"'
1826
def __init__(self, error):
1827
BzrError.__init__(self, error=error)
1830
class DependencyNotPresent(BzrError):
1832
_fmt = 'Unable to import library "%(library)s": %(error)s'
1834
def __init__(self, library, error):
1835
BzrError.__init__(self, library=library, error=error)
1838
class GpgmeNotInstalled(DependencyNotPresent):
1840
_fmt = 'python-gpgme is not installed, it is needed to verify signatures'
1842
def __init__(self, error):
1843
DependencyNotPresent.__init__(self, 'gpgme', error)
1763
1846
class WorkingTreeNotRevision(BzrError):
1765
1848
_fmt = ("The working tree for %(basedir)s has changed since"
1925
2008
_fmt = "Moving the root directory is not supported at this time"
2011
class TransformRenameFailed(BzrError):
2013
_fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
2015
def __init__(self, from_path, to_path, why, errno):
2016
self.from_path = from_path
2017
self.to_path = to_path
1928
2022
class BzrMoveFailedError(BzrError):
1930
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
2024
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
2025
"%(_has_extra)s%(extra)s")
1932
2027
def __init__(self, from_path='', to_path='', extra=None):
1933
2028
from bzrlib.osutils import splitpath
1934
2029
BzrError.__init__(self)
1936
self.extra = ': ' + str(extra)
2031
self.extra, self._has_extra = extra, ': '
2033
self.extra = self._has_extra = ''
1940
2035
has_from = len(from_path) > 0
1941
2036
has_to = len(to_path) > 0
1963
2058
class BzrRenameFailedError(BzrMoveFailedError):
1965
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
2060
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
2061
"%(_has_extra)s%(extra)s")
1967
2063
def __init__(self, from_path, to_path, extra=None):
1968
2064
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
1970
2067
class BzrRemoveChangedFilesError(BzrError):
1971
2068
"""Used when user is trying to remove changed files."""
1975
2072
"Use --keep to not delete them, or --force to delete them regardless.")
1977
2074
def __init__(self, tree_delta):
2075
symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
2076
"BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
1978
2077
BzrError.__init__(self)
1979
2078
self.changes_as_text = tree_delta.get_changes_as_text()
1980
2079
#self.paths_as_string = '\n'.join(changed_files)
1989
2088
class BzrBadParameterMissing(BzrBadParameter):
1991
_fmt = "Parameter $(param)s is required but not present."
2090
_fmt = "Parameter %(param)s is required but not present."
1994
2093
class BzrBadParameterUnicode(BzrBadParameter):
2002
2101
_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
2104
class ParamikoNotPresent(DependencyNotPresent):
2015
2106
_fmt = "Unable to import paramiko (required for sftp support): %(error)s"
2619
2710
This is distinct from ErrorFromSmartServer so that it is possible to
2620
2711
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.
2713
- ErrorFromSmartServer was uncaught. This is logic error in the client
2714
and so should provoke a traceback to the user.
2715
- ErrorFromSmartServer was caught but its error_tuple could not be
2716
translated. This is probably because the server sent us garbage, and
2717
should not provoke a traceback.
2628
2720
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2835
2927
more = ' ' + more
2836
2928
import bzrlib.urlutils as urlutils
2837
display_url = urlutils.unescape_for_display(
2838
tree.user_url, 'ascii')
2929
user_url = getattr(tree, "user_url", None)
2930
if user_url is None:
2931
display_url = str(tree)
2933
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2839
2934
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2937
class ShelvedChanges(UncommittedChanges):
2939
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2940
' (See bzr shelve --list).%(more)s')
2842
2943
class MissingTemplateVariable(BzrError):
2844
2945
_fmt = 'Variable {%(name)s} is not available.'
2913
3014
self.user_encoding = osutils.get_user_encoding()
3017
class NoSuchConfig(BzrError):
3019
_fmt = ('The "%(config_id)s" configuration does not exist.')
3021
def __init__(self, config_id):
3022
BzrError.__init__(self, config_id=config_id)
3025
class NoSuchConfigOption(BzrError):
3027
_fmt = ('The "%(option_name)s" configuration option does not exist.')
3029
def __init__(self, option_name):
3030
BzrError.__init__(self, option_name=option_name)
2916
3033
class NoSuchAlias(BzrError):
2918
3035
_fmt = ('The alias "%(alias_name)s" does not exist.')
3002
3119
_fmt = "Shelf corrupt."
3122
class DecompressCorruption(BzrError):
3124
_fmt = "Corruption while decompressing repository file%(orig_error)s"
3126
def __init__(self, orig_error=None):
3127
if orig_error is not None:
3128
self.orig_error = ", %s" % (orig_error,)
3130
self.orig_error = ""
3131
BzrError.__init__(self)
3005
3134
class NoSuchShelfId(BzrError):
3007
3136
_fmt = 'No changes are shelved with id "%(shelf_id)d".'
3134
3263
def __init__(self, bzrdir):
3135
3264
self.bzrdir = bzrdir
3267
class NoWhoami(BzrError):
3269
_fmt = ('Unable to determine your name.\n'
3270
"Please, set your name with the 'whoami' command.\n"
3271
'E.g. bzr whoami "Your Name <name@example.com>"')
3274
class InvalidPattern(BzrError):
3276
_fmt = ('Invalid pattern(s) found. %(msg)s')
3278
def __init__(self, msg):
3282
class RecursiveBind(BzrError):
3284
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3285
'Please use `bzr unbind` to fix.')
3287
def __init__(self, branch_url):
3288
self.branch_url = branch_url
3291
# FIXME: I would prefer to define the config related exception classes in
3292
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3293
class OptionExpansionLoop(BzrError):
3295
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3297
def __init__(self, string, refs):
3298
self.string = string
3299
self.refs = '->'.join(refs)
3302
class ExpandingUnknownOption(BzrError):
3304
_fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
3306
def __init__(self, name, string):
3308
self.string = string
3311
class NoCompatibleInter(BzrError):
3313
_fmt = ('No compatible object available for operations from %(source)r '
3316
def __init__(self, source, target):
3317
self.source = source
3318
self.target = target