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
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
_fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
1213
" %(branch_url)s%(extra)s")
1182
_fmt = ("Requested revision: %(spec)r does not exist in branch:"
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)
1328
1297
class BoundBranchOutOfDate(BzrError):
1330
1299
_fmt = ("Bound branch %(branch)s is out of date with master branch"
1331
" %(master)s.%(extra_help)s")
1333
1302
def __init__(self, branch, master):
1334
1303
BzrError.__init__(self)
1335
1304
self.branch = branch
1336
1305
self.master = master
1337
self.extra_help = ''
1340
1308
class CommitToDoubleBoundBranch(BzrError):
1412
1380
class WeaveParentMismatch(WeaveError):
1414
_fmt = "Parents are mismatched between two revisions. %(msg)s"
1382
_fmt = "Parents are mismatched between two revisions. %(message)s"
1417
1385
class WeaveInvalidChecksum(WeaveError):
1419
_fmt = "Text did not match its checksum: %(msg)s"
1387
_fmt = "Text did not match it's checksum: %(message)s"
1422
1390
class WeaveTextDiffers(WeaveError):
1716
1684
class InvalidHttpResponse(TransportError):
1718
_fmt = "Invalid http response for %(path)s: %(msg)s%(orig_error)s"
1686
_fmt = "Invalid http response for %(path)s: %(msg)s"
1720
1688
def __init__(self, path, msg, orig_error=None):
1721
1689
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,)
1728
1690
TransportError.__init__(self, msg, orig_error=orig_error)
1770
1732
_fmt = "Working tree has conflicts."
1773
class ConfigContentError(BzrError):
1775
_fmt = "Config file %(filename)s is not UTF-8 encoded\n"
1777
def __init__(self, filename):
1778
BzrError.__init__(self)
1779
self.filename = filename
1782
1735
class ParseConfigError(BzrError):
1784
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1786
1737
def __init__(self, errors, filename):
1787
BzrError.__init__(self)
1788
self.filename = filename
1789
self.errors = '\n'.join(e.msg for e in errors)
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)
1792
1745
class NoEmailInUsername(BzrError):
1801
1754
class SigningFailed(BzrError):
1803
_fmt = 'Failed to GPG sign data with command "%(command_line)s"'
1756
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1805
1758
def __init__(self, command_line):
1806
1759
BzrError.__init__(self, command_line=command_line)
1809
class SignatureVerificationFailed(BzrError):
1811
_fmt = 'Failed to verify GPG signature data with error "%(error)s"'
1813
def __init__(self, error):
1814
BzrError.__init__(self, error=error)
1817
class DependencyNotPresent(BzrError):
1819
_fmt = 'Unable to import library "%(library)s": %(error)s'
1821
def __init__(self, library, error):
1822
BzrError.__init__(self, library=library, error=error)
1825
class GpgmeNotInstalled(DependencyNotPresent):
1827
_fmt = 'python-gpgme is not installed, it is needed to verify signatures'
1829
def __init__(self, error):
1830
DependencyNotPresent.__init__(self, 'gpgme', error)
1833
1762
class WorkingTreeNotRevision(BzrError):
1835
1764
_fmt = ("The working tree for %(basedir)s has changed since"
1995
1924
_fmt = "Moving the root directory is not supported at this time"
1998
class TransformRenameFailed(BzrError):
2000
_fmt = "Failed to rename %(from_path)s to %(to_path)s: %(why)s"
2002
def __init__(self, from_path, to_path, why, errno):
2003
self.from_path = from_path
2004
self.to_path = to_path
2009
1927
class BzrMoveFailedError(BzrError):
2011
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
2012
"%(_has_extra)s%(extra)s")
1929
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
2014
1931
def __init__(self, from_path='', to_path='', extra=None):
2015
1932
from bzrlib.osutils import splitpath
2016
1933
BzrError.__init__(self)
2018
self.extra, self._has_extra = extra, ': '
1935
self.extra = ': ' + str(extra)
2020
self.extra = self._has_extra = ''
2022
1939
has_from = len(from_path) > 0
2023
1940
has_to = len(to_path) > 0
2045
1962
class BzrRenameFailedError(BzrMoveFailedError):
2047
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
2048
"%(_has_extra)s%(extra)s")
1964
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
2050
1966
def __init__(self, from_path, to_path, extra=None):
2051
1967
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
2054
1969
class BzrRemoveChangedFilesError(BzrError):
2055
1970
"""Used when user is trying to remove changed files."""
2059
1974
"Use --keep to not delete them, or --force to delete them regardless.")
2061
1976
def __init__(self, tree_delta):
2062
symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
2063
"BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
2064
1977
BzrError.__init__(self)
2065
1978
self.changes_as_text = tree_delta.get_changes_as_text()
2066
1979
#self.paths_as_string = '\n'.join(changed_files)
2075
1988
class BzrBadParameterMissing(BzrBadParameter):
2077
_fmt = "Parameter %(param)s is required but not present."
1990
_fmt = "Parameter $(param)s is required but not present."
2080
1993
class BzrBadParameterUnicode(BzrBadParameter):
2088
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)
2091
2012
class ParamikoNotPresent(DependencyNotPresent):
2093
2014
_fmt = "Unable to import paramiko (required for sftp support): %(error)s"
2255
2176
def __init__(self, repo):
2256
2177
BzrError.__init__(self)
2257
self.repo_path = repo.user_url
2178
self.repo_path = repo.bzrdir.root_transport.base
2260
2181
class InconsistentDelta(BzrError):
2697
2618
This is distinct from ErrorFromSmartServer so that it is possible to
2698
2619
distinguish between the following two cases:
2700
- ErrorFromSmartServer was uncaught. This is logic error in the client
2701
and so should provoke a traceback to the user.
2702
- ErrorFromSmartServer was caught but its error_tuple could not be
2703
translated. This is probably because the server sent us garbage, and
2704
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.
2707
2627
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2834
2754
def __init__(self, bzrdir):
2835
2755
import bzrlib.urlutils as urlutils
2836
display_url = urlutils.unescape_for_display(bzrdir.user_url,
2756
display_url = urlutils.unescape_for_display(bzrdir.root_transport.base,
2838
2758
BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
2914
2834
more = ' ' + more
2915
2835
import bzrlib.urlutils as urlutils
2916
user_url = getattr(tree, "user_url", None)
2917
if user_url is None:
2918
display_url = str(tree)
2920
display_url = urlutils.unescape_for_display(user_url, 'ascii')
2836
display_url = urlutils.unescape_for_display(
2837
tree.bzrdir.root_transport.base, 'ascii')
2921
2838
BzrError.__init__(self, tree=tree, display_url=display_url, more=more)
2924
class ShelvedChanges(UncommittedChanges):
2926
_fmt = ('Working tree "%(display_url)s" has shelved changes'
2927
' (See bzr shelve --list).%(more)s')
2930
2841
class MissingTemplateVariable(BzrError):
2932
2843
_fmt = 'Variable {%(name)s} is not available.'
3001
2912
self.user_encoding = osutils.get_user_encoding()
3004
class NoSuchConfig(BzrError):
3006
_fmt = ('The "%(config_id)s" configuration does not exist.')
3008
def __init__(self, config_id):
3009
BzrError.__init__(self, config_id=config_id)
3012
class NoSuchConfigOption(BzrError):
3014
_fmt = ('The "%(option_name)s" configuration option does not exist.')
3016
def __init__(self, option_name):
3017
BzrError.__init__(self, option_name=option_name)
3020
2915
class NoSuchAlias(BzrError):
3022
2917
_fmt = ('The alias "%(alias_name)s" does not exist.')
3106
3001
_fmt = "Shelf corrupt."
3109
class DecompressCorruption(BzrError):
3111
_fmt = "Corruption while decompressing repository file%(orig_error)s"
3113
def __init__(self, orig_error=None):
3114
if orig_error is not None:
3115
self.orig_error = ", %s" % (orig_error,)
3117
self.orig_error = ""
3118
BzrError.__init__(self)
3121
3004
class NoSuchShelfId(BzrError):
3123
3006
_fmt = 'No changes are shelved with id "%(shelf_id)d".'
3242
3125
def __init__(self, path):
3243
3126
self.path = path
3246
class NoColocatedBranchSupport(BzrError):
3248
_fmt = ("%(bzrdir)r does not support co-located branches.")
3250
def __init__(self, bzrdir):
3251
self.bzrdir = bzrdir
3254
class NoWhoami(BzrError):
3256
_fmt = ('Unable to determine your name.\n'
3257
"Please, set your name with the 'whoami' command.\n"
3258
'E.g. bzr whoami "Your Name <name@example.com>"')
3261
class InvalidPattern(BzrError):
3263
_fmt = ('Invalid pattern(s) found. %(msg)s')
3265
def __init__(self, msg):
3269
class RecursiveBind(BzrError):
3271
_fmt = ('Branch "%(branch_url)s" appears to be bound to itself. '
3272
'Please use `bzr unbind` to fix.')
3274
def __init__(self, branch_url):
3275
self.branch_url = branch_url
3278
# FIXME: I would prefer to define the config related exception classes in
3279
# config.py but the lazy import mechanism proscribes this -- vila 20101222
3280
class OptionExpansionLoop(BzrError):
3282
_fmt = 'Loop involving %(refs)r while expanding "%(string)s".'
3284
def __init__(self, string, refs):
3285
self.string = string
3286
self.refs = '->'.join(refs)
3289
class ExpandingUnknownOption(BzrError):
3291
_fmt = 'Option %(name)s is not defined while expanding "%(string)s".'
3293
def __init__(self, name, string):
3295
self.string = string
3298
class NoCompatibleInter(BzrError):
3300
_fmt = ('No compatible object available for operations from %(source)r '
3303
def __init__(self, source, target):
3304
self.source = source
3305
self.target = target