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
702
702
# TODO: Probably this behavior of should be a common superclass
703
703
class NotBranchError(PathError):
705
_fmt = 'Not a branch: "%(path)s"%(detail)s.'
705
_fmt = 'Not a branch: "%(path)s".'
707
def __init__(self, path, detail=None, bzrdir=None):
707
def __init__(self, path):
708
708
import bzrlib.urlutils as urlutils
709
path = urlutils.unescape_for_display(path, 'ascii')
710
if detail is not None:
711
detail = ': ' + detail
714
PathError.__init__(self, path=path)
717
return '<%s %r>' % (self.__class__.__name__, self.__dict__)
720
# XXX: Ideally self.detail would be a property, but Exceptions in
721
# Python 2.4 have to be old-style classes so properties don't work.
722
# Instead we override _format.
723
if self.detail is None:
724
if self.bzrdir is not None:
726
self.bzrdir.open_repository()
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.
739
self.detail = ': location is a repository'
742
return PathError._format(self)
709
self.path = urlutils.unescape_for_display(path, 'ascii')
745
712
class NoSubmitBranch(PathError):
795
762
_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
764
def __init__(self, branch, path):
800
765
BzrError.__init__(self)
801
766
self.branch = branch
864
829
"""Construct a new AlreadyVersionedError.
866
831
:param path: This is the path which is versioned,
867
which should be in a user friendly form.
832
which should be in a user friendly form.
868
833
:param context_info: If given, this is information about the context,
869
which could explain why this is expected to not be versioned.
834
which could explain why this is expected to not be versioned.
871
836
BzrError.__init__(self)
885
850
"""Construct a new NotVersionedError.
887
852
:param path: This is the path which is not versioned,
888
which should be in a user friendly form.
853
which should be in a user friendly form.
889
854
:param context_info: If given, this is information about the context,
890
which could explain why this is expected to be versioned.
855
which could explain why this is expected to be versioned.
892
857
BzrError.__init__(self)
961
926
# original exception is available as e.original_error
963
928
# New code should prefer to raise specific subclasses
964
def __init__(self, msg):
929
def __init__(self, message):
930
# Python 2.5 uses a slot for StandardError.message,
931
# so use a different variable name. We now work around this in
932
# BzrError.__str__, but this member name is kept for compatability.
968
936
class LockActive(LockError):
1084
1054
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
1057
class LockNotHeld(LockError):
1101
1059
_fmt = "Lock not held: %(lock)s"
1140
1098
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
1101
class BadCommitMessageEncoding(BzrError):
1154
1103
_fmt = 'The specified commit message contains characters unsupported by '\
1210
1159
class InvalidRevisionSpec(BzrError):
1212
_fmt = ("Requested revision: '%(spec)s' does not exist in branch:"
1213
" %(branch_url)s%(extra)s")
1161
_fmt = ("Requested revision: %(spec)r does not exist in branch:"
1162
" %(branch)s%(extra)s")
1215
1164
def __init__(self, spec, branch, extra=None):
1216
1165
BzrError.__init__(self, branch=branch, spec=spec)
1217
self.branch_url = getattr(branch, 'user_url', str(branch))
1219
1167
self.extra = '\n' + str(extra)
1299
1247
class AmbiguousBase(BzrError):
1301
1249
def __init__(self, bases):
1302
symbol_versioning.warn("BzrError AmbiguousBase has been deprecated "
1303
"as of bzrlib 0.8.", DeprecationWarning, stacklevel=2)
1250
warn("BzrError AmbiguousBase has been deprecated as of bzrlib 0.8.",
1304
1252
msg = ("The correct base is unclear, because %s are all equally close"
1305
1253
% ", ".join(bases))
1306
1254
BzrError.__init__(self, msg)
1328
1276
class BoundBranchOutOfDate(BzrError):
1330
1278
_fmt = ("Bound branch %(branch)s is out of date with master branch"
1331
" %(master)s.%(extra_help)s")
1333
1281
def __init__(self, branch, master):
1334
1282
BzrError.__init__(self)
1335
1283
self.branch = branch
1336
1284
self.master = master
1337
self.extra_help = ''
1340
1287
class CommitToDoubleBoundBranch(BzrError):
1412
1359
class WeaveParentMismatch(WeaveError):
1414
_fmt = "Parents are mismatched between two revisions. %(msg)s"
1361
_fmt = "Parents are mismatched between two revisions. %(message)s"
1417
1364
class WeaveInvalidChecksum(WeaveError):
1419
_fmt = "Text did not match its checksum: %(msg)s"
1366
_fmt = "Text did not match it's checksum: %(message)s"
1422
1369
class WeaveTextDiffers(WeaveError):
1716
1663
class InvalidHttpResponse(TransportError):
1718
_fmt = "Invalid http response for %(path)s: %(msg)s%(orig_error)s"
1665
_fmt = "Invalid http response for %(path)s: %(msg)s"
1720
1667
def __init__(self, path, msg, orig_error=None):
1721
1668
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
1669
TransportError.__init__(self, msg, orig_error=orig_error)
1737
1678
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)
1753
1681
class InvalidHttpContentType(InvalidHttpResponse):
1755
1683
_fmt = 'Invalid http Content-type "%(ctype)s" for %(path)s: %(msg)s'
1783
1711
_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
1795
1714
class ParseConfigError(BzrError):
1797
_fmt = "Error(s) parsing config file %(filename)s:\n%(errors)s"
1799
1716
def __init__(self, errors, filename):
1800
BzrError.__init__(self)
1801
self.filename = filename
1802
self.errors = '\n'.join(e.msg for e in errors)
1717
if filename is None:
1719
message = "Error(s) parsing config file %s:\n%s" % \
1720
(filename, ('\n'.join(e.msg for e in errors)))
1721
BzrError.__init__(self, message)
1805
1724
class NoEmailInUsername(BzrError):
1814
1733
class SigningFailed(BzrError):
1816
_fmt = 'Failed to GPG sign data with command "%(command_line)s"'
1735
_fmt = 'Failed to gpg sign data with command "%(command_line)s"'
1818
1737
def __init__(self, command_line):
1819
1738
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)
1846
1741
class WorkingTreeNotRevision(BzrError):
1848
1743
_fmt = ("The working tree for %(basedir)s has changed since"
2008
1903
_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
2022
1906
class BzrMoveFailedError(BzrError):
2024
_fmt = ("Could not move %(from_path)s%(operator)s %(to_path)s"
2025
"%(_has_extra)s%(extra)s")
1908
_fmt = "Could not move %(from_path)s%(operator)s %(to_path)s%(extra)s"
2027
1910
def __init__(self, from_path='', to_path='', extra=None):
2028
1911
from bzrlib.osutils import splitpath
2029
1912
BzrError.__init__(self)
2031
self.extra, self._has_extra = extra, ': '
1914
self.extra = ': ' + str(extra)
2033
self.extra = self._has_extra = ''
2035
1918
has_from = len(from_path) > 0
2036
1919
has_to = len(to_path) > 0
2058
1941
class BzrRenameFailedError(BzrMoveFailedError):
2060
_fmt = ("Could not rename %(from_path)s%(operator)s %(to_path)s"
2061
"%(_has_extra)s%(extra)s")
1943
_fmt = "Could not rename %(from_path)s%(operator)s %(to_path)s%(extra)s"
2063
1945
def __init__(self, from_path, to_path, extra=None):
2064
1946
BzrMoveFailedError.__init__(self, from_path, to_path, extra)
2067
1948
class BzrRemoveChangedFilesError(BzrError):
2068
1949
"""Used when user is trying to remove changed files."""
2072
1953
"Use --keep to not delete them, or --force to delete them regardless.")
2074
1955
def __init__(self, tree_delta):
2075
symbol_versioning.warn(symbol_versioning.deprecated_in((2, 3, 0)) %
2076
"BzrRemoveChangedFilesError", DeprecationWarning, stacklevel=2)
2077
1956
BzrError.__init__(self)
2078
1957
self.changes_as_text = tree_delta.get_changes_as_text()
2079
1958
#self.paths_as_string = '\n'.join(changed_files)
2101
1980
_fmt = "Parameter %(param)s contains a newline."
1983
class DependencyNotPresent(BzrError):
1985
_fmt = 'Unable to import library "%(library)s": %(error)s'
1987
def __init__(self, library, error):
1988
BzrError.__init__(self, library=library, error=error)
2104
1991
class ParamikoNotPresent(DependencyNotPresent):
2106
1993
_fmt = "Unable to import paramiko (required for sftp support): %(error)s"
2710
2597
This is distinct from ErrorFromSmartServer so that it is possible to
2711
2598
distinguish between the following two cases:
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.
2599
- ErrorFromSmartServer was uncaught. This is logic error in the client
2600
and so should provoke a traceback to the user.
2601
- ErrorFromSmartServer was caught but its error_tuple could not be
2602
translated. This is probably because the server sent us garbage, and
2603
should not provoke a traceback.
2720
2606
_fmt = "Server sent an unexpected error: %(error_tuple)r"
2847
2733
def __init__(self, bzrdir):
2848
2734
import bzrlib.urlutils as urlutils
2849
display_url = urlutils.unescape_for_display(bzrdir.user_url,
2735
display_url = urlutils.unescape_for_display(bzrdir.root_transport.base,
2851
2737
BzrError.__init__(self, bzrdir=bzrdir, display_url=display_url)
2927
2813
more = ' ' + more
2928
2814
import bzrlib.urlutils as urlutils
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')
2815
display_url = urlutils.unescape_for_display(
2816
tree.bzrdir.root_transport.base, 'ascii')
2934
2817
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')
2943
2820
class MissingTemplateVariable(BzrError):
2945
2822
_fmt = 'Variable {%(name)s} is not available.'
3014
2891
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)
3033
2894
class NoSuchAlias(BzrError):
3035
2896
_fmt = ('The alias "%(alias_name)s" does not exist.')
3081
2942
class HookFailed(BzrError):
3082
2943
"""Raised when a pre_change_branch_tip hook function fails anything other
3083
2944
than TipChangeRejected.
3085
Note that this exception is no longer raised, and the import is only left
3086
to be nice to code which might catch it in a plugin.
3089
2947
_fmt = ("Hook '%(hook_name)s' during %(hook_stage)s failed:\n"
3090
2948
"%(traceback_text)s%(exc_value)s")
3092
def __init__(self, hook_stage, hook_name, exc_info, warn=True):
3094
symbol_versioning.warn("BzrError HookFailed has been deprecated "
3095
"as of bzrlib 2.1.", DeprecationWarning, stacklevel=2)
2950
def __init__(self, hook_stage, hook_name, exc_info):
3096
2951
import traceback
3097
2952
self.hook_stage = hook_stage
3098
2953
self.hook_name = hook_name
3119
2974
_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)
3134
2977
class NoSuchShelfId(BzrError):
3136
2979
_fmt = 'No changes are shelved with id "%(shelf_id)d".'
3232
3075
def __init__(self, source_branch, target_branch):
3233
3076
self.source_branch = source_branch
3234
3077
self.target_branch = target_branch
3237
class NoRoundtrippingSupport(BzrError):
3239
_fmt = ("Roundtripping is not supported between %(source_branch)r and "
3240
"%(target_branch)r.")
3242
internal_error = True
3244
def __init__(self, source_branch, target_branch):
3245
self.source_branch = source_branch
3246
self.target_branch = target_branch
3249
class FileTimestampUnavailable(BzrError):
3251
_fmt = "The filestamp for %(path)s is not available."
3253
internal_error = True
3255
def __init__(self, path):
3259
class NoColocatedBranchSupport(BzrError):
3261
_fmt = ("%(bzrdir)r does not support co-located branches.")
3263
def __init__(self, bzrdir):
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